mapping a PCI bus

Nicolas Lavocat nicolas.lavocat at fr.thalesgroup.com
Thu Mar 12 21:35:47 EST 2009


  Hello!
Thanks a lot for all these explanations! they are very helpful! I have 
understood the meaning of each fields of "ranges", but I don't know 
where find informations to fill it... I don't find any reference about 
memory space and iopace ranges in my datasheets. I have read in the PCI 
specification that the base address register (BAR) permit to get the 
memory range needed by each device on the PCI bus. Have I to get the 
memory range of every device in order to fill the range property ? I 
feel that I missed something...

To finish, I have a question about the "reg" field. I have read in 
documentations that it must contain the address of the PCI bridge's 
configuration space: am I wrong?
Thanks for Your attention !

Nicolas Lavocat

Mitch Bradley a écrit :
> The reason why the ranges property for PCI is so complicated is 
> because PCI addressing is complicated, so it's tricky to fit the PCI 
> address information into a generic framework. I'll explain how it 
> works in-line, below.
>
>> Hy everybody!
>>
>> I’m working on a project:
>>
>> On a proprietary board, (with a PowerPC 7448), a minimal Linux has 
>> been embedded. My first aim consist in using a graphic chipset on the 
>> board, that is to say make work the PCI bus. For the address mapping, 
>> I try to write a dts, using the dts of the mpc7448hpc2 board as a 
>> model. My problem is that I don’t understand how to fill the field 
>> “range” of the PCI. The “width” used and the number of range is 
>> different from on board to an other where PCI is used. I read the PCI 
>> specification, and don’t find anything about it.
>>
>> Here is an extract of my dts, where the field in question is 
>> indicated thanks to commentaries:
>>
>> pci at 70000000 { compatible = "abac-pci";
>> device_type = "pci";
>> #size-cells = <2>;
>> #address-cells = <3>;
>> #interrupt-cells = <1>;
>> reg = <0x70000000 0x1000>;
>> bus-range = <0 0>;
>> /* how can I know how to chose the number of range and their width?*/
> The "ranges" property describes how the bus bridge translates between 
> the "parent" address space (typically the main system bus) and the 
> "child" address space (the PCI bus address space). For the full 
> details of the generic "ranges" property, consult page 172 of 
> ftp://playground.sun.com/pub/1275/coredoc/1275-1994/1275.ps.gz
>
> The number of ranges entries is equal to the number of disjoint 
> translation regions. Typically you need at least two for PCI bus, one 
> for the PCI memory space and another for the PCI I/O space.
>
>>
>> Then, I have a second question: why PCI’s addresses seem to be 
>> implemented on 96 bits, whereas the addressing is done on 32 bits?
>
> I have moved this question up, as the answer is helpful for later.
>
> PCI bus addressing can be either 32 bits or 64 bits, depending on the 
> hardware implementation. The Open Firmware binding to PCI uses 64 bits 
> so it can accommodate the full PCI spec. In addition to the 64 address 
> bits, you need bits to indicate other information, such as which 
> address space (I/O or memory) you are talking about, which Base 
> Address Register is involved, and other information as described on 
> page 4 (pdf page 9) of 
> ftp://playground.sun.com/pub/1275/bindings/pci/pci2_1.pdf . Much of 
> that other information is irrelevant in the context of the "ranges" 
> property - but the address space identifier is relevant. Numeric 
> values in the device tree are represented in units of 32 bits, so you 
> need a total of 96 bits for the basic 64-bit address plus the extra info.
>
>>
>> ranges = <0x2000000 0x0 0xe0000000 0xe0000000 0x0 0x1a000000
>
> Okay, now we can start to parse this ranges property. I added spaces 
> above to show grouping.
>
> 0x2000000 0x0 0xe0000000
>
> is the base PCI address of one of the ranges entries. 0x2000000 is the 
> "phys.hi" cell that contains the "extra" information - in particular 
> the "2" is in the "ss" field that indicates the address space - 2 
> means "PCI memory space". The rest of the bits in that word are 
> irrelevant to the ranges property. 0x0 0xe0000000 is a 64-bit offset, 
> indicating that the mapped-through range begins at e0000000 in PCI 
> memory address space.
>
> 0xe0000000
>
> is the entry's base address in the parent (system bus) address space. 
> Apparently this bus bridge is a very simple one - probably just wires 
> and a decoder - because the parent address and child address are 
> identical. That's not always the case.
>
> 0x0 0x1a000000
>
> is the size of this range. It's a 64-bit number because PCI has 
> #size-cells = 2. So the range goes from 0xe0000000 to 0xf9ffffff.
>
>
>>
>> 0x1000000 0x0 0x0 0xfa000000 0x0 0x10000>;
>
> Similarly - 0x1000000 means I/O space, 0x0 0x0 means PCI I/O space 
> beginning at 0, 0xfa000000 means that the PCI I/O space appears at 
> 0xfa000000 in the system bus address space, and 0x0 0x10000 means the 
> mapping is 64Kbytes long.
>
>
>>
>>>>
>> };
>>
>> Thanks for Your attention !
>>
>> Nicolas Lavocat
>



More information about the devicetree-discuss mailing list