现在的位置: 首页 > 综合 > 正文

PCI和ioremap问题

2013年08月22日 ⁄ 综合 ⁄ 共 846字 ⁄ 字号 评论关闭
关于PCI驱动和IOREMAP,多谢

初次写pci驱动,有些不明白的地方。
我对pci config和IO空间进行了ioremap,对memory空间也需要ioremap么?

看相关资料说这个ioremap是映射物理地址到虚拟地址,这个和TLB是什么关系,我是MIPS架构,比如0xD0000000
ioremap后是0xC0000000,
而我在bootloader中设置了TLB,物理地址0xD0000000对应的虚拟地址应该是0xF0000000啊。linux使用的应该是
bootloader传进来的TLB啊。

还有一个疑问:
pci_request_regions和pci_resource_start:我用pci_resource_start获得的应该就是pci设备可以使用的memory空间吧,我看有些驱动例子里用到了pci_request_regions,这个是用来干吗的呢?
多谢!

 

ahhhhwang
回复 #1 palals 的帖子

pci设备上的io区间似乎不可以ioremap,因为ioremap是针对物理地址(这里也就是pci设备上的存储器区间),映射到主内核页表中的不连续映射区间。而pci设备上的io区间占用的是cpu的io端口,处于cpu的io地址空间中。
pci_request_regions(struct
pci_dev *pdev, int bar, char
*res_name)函数的作用我也有疑惑的地方,似乎只能用在下面情况:pdev指示的pci设备上的bar寄存器指示的区间(存储器区间或者io区
间)的resource目前还没有被挂在系统的资源树上。
如果是这样的话,那么:如果这个区间自身或者包含它的某个区间没有被设置为IORESOURCE_BUSY,那么返回0,且把这个区间对应的resource结构挂在资源树上。否则返回错误码。
pci_resource_start宏用于获得pdev的bar寄存器指向的区间的首地址(存储器区间的第一个存储单元的总线地址或者io区间的第一个端口号)

抱歉!评论已关闭.