In the output of lspci -vv, what do the Region lines mean?

7,156

Solution 1

In the PCI/PCI-X/PCI-E devices, there are BARs registers in the PCI configuration space. And during Linux Kernel booting up, it will scan the PCI bus, find all PCI devices including PCI-to-PCI bridge and PCI devices. And kernel will check how many BARs are there in the PCI devices' configuration space. And check how much memory space each BAR needs and the memory space type by writing 0xFFFFFFFF to BAR register. Then kernel will allocate the memory space resources to the PCI devices.

In your case, Region lion is show the BAR registers.

In each device driver corresponding, one can get the base physical address that Linux Kernel allocate for each BAR by calling pci_resource_start(), and call pci_iomap() to map the base physical address to kernel virtual address, or using remap_pfn_range() to implement one mmap method for user space process to map the physical address to user space process virtual address.

Solution 2

Registers on the devices are either IOmapped or memorymapped.(true for x86) Region shows in which kernel virtual address these registers are mapped. In this case they are memory mapped at iven kernel virtual address space.

Share:
7,156
penguin4hire
Author by

penguin4hire

Programmer.

Updated on September 18, 2022

Comments

  • penguin4hire
    penguin4hire over 1 year

    I have the following output from running lspci -vv -s 00:00 on my single board computer running Linux.

    07:05.0 RAID bus controller: Adaptec AAC-RAID (Rocket) (rev 03)
            Subsystem: Adaptec ASR-2230S + ASR-2230SLP PCI-X (Lancer)
            Control: I/O- Mem+ BusMaster+ SpecCycle+ MemWINV+ VGASnoop-
            ParErr- Stepping- SERR+ FastB2B-
            Status: Cap+ 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR-
            Latency: 64 (250ns min, 250ns max), Cache Line Size: 64 bytes
            Interrupt: pin A routed to IRQ 74
            Region 0: Memory at f7a00000 (64-bit, non-prefetchable) [size=2M]
            Region 2: Memory at f79ff000 (64-bit, non-prefetchable)
    [Remaining output truncated]
    

    The above is only example output and not exactly what I am getting but it contains the items of interest.

    I understand most of the output from the lspci command, but I would like someone to explain to me the lines that begin with Region ... What type of memory am I looking at here specified by the Region line? How might I access it? With that asked, I am trying to accomplish communication between two single board computers connected over the PCI bus. I should be able to talk directly. All there is a PCI arbiter running the bus. This is what I've accomplished so far...

    I created a Linux kernel module for outbound PCI traffic. Basically it maps all the way down from userspace (with a user space application) using the driver mmap implementation. I write to the location returned by mmap and I actually see the traffic with a bus analyzer! Now on the other single board computer I try read its sysfs resource for the PCI device but only see all FFs and no changes.

    Any advice or explanation on how all of this memory mapping occurs, involving PCI, would be greatly appreciated. Thanks!

    • Peter L.
      Peter L. about 11 years
      See linux/Documentation/io-mapping.txt for calls to allocate I/O memory to communicate with PCI devices. This is a good explanation of how to access I/O memory: xml.com/ldd/chapter/book/ch15.html