QEMU PCI/PCIe Emulation (DesignWare PCIe Host Controller)

SW 透過 host controller 設定 BAR 的位址,實際上在 QEMU 中就是新增/改變對應到該 BAR memory region 的 memory subregion base address BAR 空間記錄的是 PCI/PCIe 自己的 address space,而不是 memory address space,兩者實際上是不相通的。但由於大部分系統都會將 PCI/PCIe address space 映射到相同位址的 memory address space,因此”看起來”就像是 CPU 直接對 memory address space 做存取,可其實兩個 address spaces 是需要透過 host controller 做轉換的 CPU 存取 PCI/PCIe device 的時候,實際硬體是必須透過 host controller 來將 MMIO transaction (e.g., AXI transaction) / address 轉換成 PCI/PCIe transaction / address 才能存取到該 PCI/PCIe device 的。但 QEMU 的模擬並不會真的透過 host controller,而是直接存取前述之 BAR memory subregion 反之,當 PCI/PCIe master device 做 DMA 的時候,也是需要透過 host controller 才能將其所發出的 PCI/PCIe transaction / address 轉換成 MMIO transaction (e.g., AXI transaction) / address 在配置 BAR 位址後,CPU 就可以透過存取 BAR 空間 (通常會被映射到 PCI/PCIe device 的 controller registers) 來控制該 PCI/PCIe device e.g., PCIe BAR0 所記錄之 base address = 0x40000000, size = 0x1000000 (16 MB),CPU 就可以透過存取 0x40000000 ~ 0x40FFFFFF 來控制該 PCI/PCIe device PCI/PCIe Device: ...

2023/07/07 · 22 分鐘 · 4470 字 · Frank Chang