(self, b:HCQBuffer)
| 280 | return [(p + self.pci_dev.bar_info(self.vram_bar)[0], sz) for p, sz in paddrs], AddrSpace.SYS |
| 281 | |
| 282 | def map(self, b:HCQBuffer): |
| 283 | if b.owner is not None and b.owner._is_cpu(): |
| 284 | if not self.is_local(): raise RuntimeError(f"P2P mapping not supported for remote devices: {b.owner} -> {self.dev}") |
| 285 | |
| 286 | System.lock_memory(int(b.va_addr), b.size) |
| 287 | paddrs, aspace = [(x, 0x1000) for x in System.system_paddrs(int(b.va_addr), round_up(b.size, 0x1000))], AddrSpace.SYS |
| 288 | snooped, uncached = True, True |
| 289 | elif (ifa:=getattr(b.owner, "iface", None)) is not None and isinstance(ifa, PCIIfaceBase): |
| 290 | if ifa.is_bar_small(): raise RuntimeError(f"P2P mapping not supported for small bar devices: {b.owner} -> {self.dev}") |
| 291 | |
| 292 | snooped, uncached = True, b.meta.mapping.uncached |
| 293 | if b.meta.mapping.aspace is AddrSpace.SYS: paddrs, aspace = b.meta.mapping.paddrs, AddrSpace.SYS |
| 294 | else: paddrs, aspace = ifa.p2p_paddrs(b.meta.mapping.paddrs) |
| 295 | else: raise RuntimeError(f"map failed: {b.owner} -> {self.dev}") |
| 296 | |
| 297 | self.dev_impl.mm.map_range(int(b.va_addr), round_up(b.size, 0x1000), paddrs, aspace=aspace, snooped=snooped, uncached=uncached) |
| 298 | return HCQBuffer(b.va_addr, b.size, meta=b.meta, owner=b.owner) |
| 299 | |
| 300 | # *** Remote PCI Devices |
| 301 |
no test coverage detected