免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8309 | 回复: 10
打印 上一主题 下一主题

求助:关于PCI bar和pci_dev结构体中resource的一点疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-14 09:33 |只看该作者 |倒序浏览
PCI 配置空间bar中保存的不是物理地址的首地址么,而pci_dev结构体中的resource也是保存bar相关资源的描述,包括开始,结束,大小等,那么我的疑问来了

1、我直接读桥设备的bar 0值为0x8010 0000, 而读取resource[0]的start值为0xc010 0000,为什么这连个值会不一样?

2、pci配置空间的bar到底是用来映射什么用的?

3、pci_dev中的resource结构体中保存的值到底是什么值?

哪位大侠了解给讲讲啊,迷惑中。。。

论坛徽章:
0
2 [报告]
发表于 2010-04-15 15:32 |只看该作者
没有大哥搞过pci么?快来给我解答下啊,迷惑中。。。

论坛徽章:
0
3 [报告]
发表于 2010-04-15 23:08 |只看该作者
1。 你确定你读的没错么?另外,为啥去读桥呢?一般的都是读设备

2。PCI BAR就是用来分配物理地址的。里面保存的是物理地址。OS要用的时候,要调用IOREMAP来建立个相应的页表和虚拟地址。

3。RESOURCE里放的应该是物理地址。

论坛徽章:
0
4 [报告]
发表于 2010-04-19 09:02 |只看该作者
1、确认没有读错,我直接映射bar0里面的地址是失败的,导致内存错误;而resource里面的地址映射是没有问题的,都能用;
   我需要通过桥的配置信息来配置NT端口,做NT实验。NT的virtual side地址只有通过上行端口的bar 0才能够访问,所以我得映射那个bar0的地址


我也很迷惑,按说bar0里面保存的物理地址和resource里面的地址应该是一致的,可是偏偏却不一致,目前是resource里面的地址应该是cpu认可的地址,而bar里面的不是。


另外,linux内核里面pci枚举的时候哪个函数是为pci 设备(比如NT端口被识别为“其他桥接设备”)分配memory资源的啊,能否告知小弟下,急用啊。

论坛徽章:
0
5 [报告]
发表于 2010-04-19 22:57 |只看该作者
PCI设备可以有好几个BAR,也许是用的其他的BAR? 而且还要看是IO PORT 还是 MEMORY MAP。

你说的NT是啥? WINDOWS NT 4.0?

其他不知道了。。。

论坛徽章:
0
6 [报告]
发表于 2010-04-20 09:43 |只看该作者
PCI桥就两个可用的bar,另外一个bar没有被分配任何资源,这个我可以确定。也许是pci的修订过程给修改了资源吧。

NT是非透明桥的意思

论坛徽章:
1
NBA常规赛纪念章
日期:2015-05-04 22:32:03
7 [报告]
发表于 2010-04-22 09:17 |只看该作者
PCI设备可以有好几个BAR,也许是用的其他的BAR? 而且还要看是IO PORT 还是 MEMORY MAP。

你说的NT是啥? ...
accessory 发表于 2010-04-19 22:57

PCI设备可以有好几个BAR,也许是用的其他的BAR? 而且还要看是IO PORT 还是 MEMORY MAP。
哪个bar对应的是IO资源,哪个对应的是内存资源?

论坛徽章:
0
8 [报告]
发表于 2010-04-22 23:22 |只看该作者
看PCI SPEC。 我记得是在PCI CONFIGURATION SPACE里,某个地址的一个BIT 为0 还是1。分别表示IO 还是memory 映射

论坛徽章:
0
9 [报告]
发表于 2010-05-27 11:34 |只看该作者
经过一段时间的学习、探讨,对这个贴做个总结吧:

1、0x8010 0000代表的是总线地址, 0xc010 0000代表的cpu认识的物理地址,这两个地址在X86架构下应该是一致的,可惜的是我的是ARM 架构,bus 地址和 物理地址之间存在一个偏移,这也是为什么这两个值代表的是统一资源,而不相同的原因

2、pci配置空间中的bar是用来映射pci设备的配置寄存器用的(或者映射别的,反正是映射用),里面的值是bus地址的首地址,至于空间的大小,可以先想bar中写0xFFFFFFFFF,然后读取,选最低的一位非0的,比如为0x10000,那个空间的大小就为0x1000(十进制的自己转换下吧)

3、pci resouce一系列的函数和结构体中保存的才是cpu识别的物理地址,才是可以用ioremap映射之后进行读写的地址,在做驱动程序对bar相应位置读写的时候一定要用这个

以上如果有不对的地方,请各位大侠、前辈指正

论坛徽章:
0
10 [报告]
发表于 2010-05-28 00:27 |只看该作者
good to know
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP