为了账号安全,请及时绑定邮箱和手机立即绑定

Linux 64位BAR编程

Linux 64位BAR编程

海绵宝宝撒 2021-04-05 16:13:22
PCI桥支持32/64首选项/无首选项:pci_bus 0000:00: root bus resource [bus 00-ff]pci_bus 0000:00: root bus resource [io  0x0000-0xffff] pci_bus 0000:00: root bus resource [mem 0x1000000000-0x10ffffffff] (bus address [0x00000000-0xffffffff])pci_bus 0000:00: root bus resource [mem 0x1100000000-0x11ffffffff pref] (bus address [0x00000000-0xffffffff])pci_bus 0000:00: root bus resource [mem 0x2000000000-0x2fffffffff] (bus address [0x00000000-0xfffffffff])pci_bus 0000:00: root bus resource [mem 0x3000000000-0x3fffffffff pref] (bus  address [0x00000000-0xfffffffff])扫描具有2条BAR的端点:pci 0000:01:00.0: BAR 2: assigned [mem 0x2100000000-0x211fffffff 64bit pref]pci 0000:01:00.0: BAR 0: assigned [mem 0x1000000000-0x100007ffff]桥显示了窗口:pci 0000:00:00.0: PCI bridge to [bus 01]pci 0000:00:00.0:   bridge window [mem 0x1000000000-0x10000fffff]pci 0000:00:00.0:   bridge window [mem 0x2100000000-0x211fffffff 64bit pref]端点总结了BAR:endpoint: BAR 0 addr = 0x1000000000, size = 524287endpoint: BAR 1 addr = 0x2100000000, size = 536870911BAR1的高32位将被编程为什么?我预期为0x21,但找到0x1。这是因为pcibios_bus_to_resource / pcibios_resource_to_bus。它标识了3个窗口偏移:window->res->start = 1000000000 window->offset = 1000000000 window->res->end = 10FFFFFFFFwindow->res->start = 1100000000 window->offset = 1100000000 window->res->end = 11FFFFFFFFwindow->res->start = 2000000000 window->offset = 2000000000 window->res->end = 2FFFFFFFFF当显示上面的地址时,它会增加偏移量,而在端点中对BAR寄存器进行编程时,则将其减去。因此0x2100000000变为0x100000000。使用64位地址和32位BAR可能会有意义,但是为什么使用64位BAR会正确呢?
查看完整描述

1 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

据此(取自问题):


    pci_bus 0000:00: root bus resource [mem 0x1000000000-0x10ffffffff] (bus address [0x00000000-0xffffffff])

    pci_bus 0000:00: root bus resource [mem 0x1100000000-0x11ffffffff pref] (bus address [0x00000000-0xffffffff])

    pci_bus 0000:00: root bus resource [mem 0x2000000000-0x2fffffffff] (bus address [0x00000000-0xfffffffff])

    pci_bus 0000:00: root bus resource [mem 0x3000000000-0x3fffffffff pref] (bus  address [0x00000000-0xfffffffff])

存储器地址0x20'0000'0000对应于总线地址0。


因此,如果要使用存储器地址0x21'0000'0000访问该设备中的BAR,则需要将其编程为0x1'0000'0000。


同样,存储器地址0x10'0000'0000对应于总线地址0。因此,设备中的BAR被编程为0,可以使用存储器地址0x10'0000'0000进行访问。


查看完整回答
反对 回复 2021-04-16
  • 1 回答
  • 0 关注
  • 391 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信