我正在开发基于Synopsys DW IP的PCIe主机控制器驱动程序。这基于x86,此处没有BIOS编程。 所以,我需要以ARM方式进行init编码,这可以在arch / arm / kernel / bios32.c中找到。 我正在重用主线3.14内核中可用的drivers / pci / host / pcie-designware.c驱动程序。 我的终点(EP)设备需要使用4K的两个存储空间编程为BAR0 / 1和BAR2 / 3寄存器,作为非预取。
现在,我能够在BUS 1上枚举EP设备,我可以读取设备/供应商ID,类和功能。但无法在EP上看到BAR正确编程。
在DT文件中,对于范围,我提供了一个内存作为IO mem,一个作为mem空间,如下所示:
<?php
header('Location: https://itunes.apple.com/app/id', 301);
exit;
?>
现在我看到这些没有被填充为总线1资源(而不是总线0资源)。 我知道总线0用于桥接器,总线1用于连接EP设备的桥接器。 如何确保为总线1分配这些资源?
我的lspci结果如下:
#address-cells = <3>;
#size-cells = <2>;
ranges = <0x00000800 0 0xe4480000 0xe4480000 0 0x00002000 /* configuration space */
0x81000000 0 0 0xe4482000 0 0x00001000 /* downstream I/O */
0x82000000 0 0xe2083000 0xe4483000 0 0x00001000>; /* non-prefetchable memory */
我觉得,我可以在我的驱动程序中对这些BAR编程进行硬编码,但仍然可以使其工作。 但我想正确分配这些资源,以便pci驱动程序(与EP通信的测试驱动程序)可以使用pci_dev及其资源来提取所有这些信息而无需硬编码。
扫描总线1时的我的dmesg如下所示:
/sys/bus/pci # lspci
00:00.0 Class 0604: f00d:8087
01:00.0 Class 0d40: d00f:8086
我对PCIE非常陌生并在实施同样的过程中学习。 任何建议或指示都受到高度赞赏。