- 论坛徽章:
- 0
|
最近需要x86平台上支持大量pcie设备,每个设备需要映射近百兆内存到x86的pci空间。
基于此需要采用pci64bit地址配置。
现有一个实验设备
x86上pci 主桥下分出一个pcie桥,接上面种类的一个pcie设备。只有一个该设备,所以bios的32bit空间足够分配,使用起来没有问题。
下面进行了pci64bit地址分配试验
修改pcie设备配置,使其成为64bit设备
主桥总线号0
分出的pcie桥分得总线号2
在bios启动后
我在fixup.c中配置pcie桥
base memory limit memory是对应32bit地址总线的,由bios配置,没改
prefetch base memory 和 prefetch limit memory,我配置到0x2,0000,0000 - 0x2,ffff,ffff
配置pcie设备
bar0 4k不支持prefetch,没有修改,让其映射到4G空间内
bar1 8M支持prefetch,修改,让其映射到0x2,0000,0000 - 0x2,007f,ffff
bar2 64M支持prefetch,修改,让其映射到0x2,0400,0000 - 0x2,07ff,ffff
64bit只有3个bar
完成后,用查看/proc/iomem信息,按照我分配的没有问题
bus2分配空间是0x2,0000,0000 - 0x2,ffff,ffff
pcie设备
bar1 8M分配到0x2,0000,0000 - 0x2,007f,ffff
bar2 64M分配到0x2,0400,0000 - 0x2,07ff,ffff
出现的问题:
用nocache_ioremap()将bar1 0x2,0000,0000 - 0x2,007f,ffff和bar2 0x2,0400,0000 - 0x2,07ff,ffff映射到x86内核虚拟空间后访问不正确,不能正常读写。
写入0xaaaaaaaa,读出来是0xffffffff
在pci32bit地址情况下是正确的。
请教各位高手,是不是还少了哪些地方没有配置,或者我的配置有误?
缺少pci64bit地址的知识,网上也比较少,看手册也实在看不出什么。
谢谢 |
|