PowerPC的PCI總線的dts配置

    這段時間要弄下PCI Express的相關調試和驅動開發工作,老規矩,先在網上找找資料,這類的東西還蠻少的,已經買了本書,打算邊學邊自己總結吧,這篇文章是PowerPc下對PCI總線的配置方法。

    powerpc使用稱爲FDT 扁平設備描述樹的機制傳遞給內核硬件配置參數,從而引導內核。 這樣的優勢是PowerPC在Linux上的移植基本上都是對dts文件的修改,而升級內核的工作量遠遠小於其他cpu體系結構。

    只是目前介紹FDT或者OPEN Firmware的中文資料欠缺,這裏記錄我領悟的關於PCI總線樹部分的ranges參數。

pci0: pci@e0008500 {
interrupt-map-mask = <0xf800 0 0 7>;
interrupt-map = <
/* IRQ5 = 21 = 0×15, IRQ6 = 0×16, IRQ7 = 23 = 0×17 */
/* IDSEL AD14 IRQ6 inta */
0×7000 0×0 0×0 0×1 &ipic 0×12 0×8
/* IDSEL AD15 IRQ5 inta, IRQ6 intb, IRQ7 intd */
0×7800 0×0 0×0 0×1 &ipic 0×13 0×8
>;
interrupt-parent = <&ipic>;
interrupts = <66 0×8>;
bus-range = <0×0 0×0>;
ranges = <0×02000000 0×0 0×90000000 0×90000000 0×0 0×10000000
0×42000000 0×0 0×80000000 0×80000000 0×0 0×10000000
0×01000000 0×0 0×00000000 0xe0300000 0×0 0×00100000>;
sleep = <&pmc 0×00010000>;
clock-frequency = <66666666>;
#interrupt-cells = <1>;
#size-cells = <2>;
#address-cells = <3>;
reg = <0xe0008500 0x100        /* internal registers */
0xe0008300 0×8>;        /* config space access registers */
compatible = “fsl,mpc8349-pci”;
device_type = “pci”;
};

    這是一個mpc8379的dts配置文件,一些屬性還是很好理解:
pci@e0008500說明這個pci控制器的寄存器映射基地址爲e0008500
reg = <0xe0008500 0x100        /* internal registers */
0xe0008300 0×8>;        /* config space access registers */
    再次證明,pci控制器的寄存器映射基地址爲e0008500,讀取配置空間使用的寄存器映射基址爲0xe0008300,後面是長度,8個字節。即CFG_ADDR和CFG_DATA這兩個寄存器。

    最最費解的是ranges,用來描述cpu地址空間和pci地址空間的映射關係。
    對於e300內核來說,一組配置由6個32位16進制組成。

ranges =
<0×02000000 0×0 0×90000000 0×90000000 0×0 0×10000000
0×42000000 0×0 0×80000000 0×80000000 0×0 0×10000000
0×01000000 0×0 0×00000000 0xe0300000 0×0 0×00100000>;

    這裏有3組,開頭的第一個32位數表明映射的地址的屬性。0x01000000是IO映射,0x02000000是內存映射,0x42000000也是內存映射,支持預取。
    第2-3個雙字表示pci總線的地址空間,用2個雙字因爲PCI總線可能是支持64位尋址的。
    第4個雙字表示放cpu_address ,即cpu存儲器域地址空間,是cpu尋址的空間。e300是32位cpu,如果是e500內核,則需要2個雙字了。
    第5-6個雙字表示映射長度

    內核啓動消息裏顯示

mpc837x_rdb_setup_arch()
Found FSL PCI host bridge at 0x00000000e0008500. Firmware bus number: 0->0
PCI host bridge /pci@e0008500 (primary) ranges:
MEM 0×0000000090000000..0x000000009fffffff -> 0×0000000090000000
MEM 0×0000000080000000..0x000000008fffffff -> 0×0000000080000000 Prefetch
IO 0x00000000e0300000..0x00000000e03fffff -> 0×0000000000000000

正好與之匹配。

分配配置空間要注意cpu存儲器域地址空間,不要跟其他設備的cpu存儲器域地址空間重複。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章