On Mon, Jun 16, 2025 at 03:24:06AM +0000, Duan, Zhenzhong wrote: > Hi @Liu, Yi L @Nicolin Chen, for emulated/passthru devices > behind the same pcie-pci bridge, I think of an idea, adding > a new PCI callback: > > AddressSpace * (*get_address_space_extend)(PCIBus *bus, > void *opaque, int devfn, bool accel_dev); > > which pass in real bus/devfn and a new param accel_dev which > is true for vfio device.
Just =y for all vfio (passthrough) devices? ARM tentatively does this for get_address_space using Shameer's trick to detect if the device is a passthrough VFIO one: PCIDevice *pdev = pci_find_device(bus, pci_bus_num(bus), devfn); bool has_iommufd = !!object_property_find(OBJECT(pdev), "iommufd"); if (smmu->nested && ... && has_iommufd) { return &sdev->as_sysmem; } So, I guess "accel_dev" could be just: !!object_property_find(OBJECT(pdev), "iommufd") ? > Vtd implements this callback and return separate AS for vfio > device if it's under an pcie-pci bridge and flts=on; > otherwise it fallback to call .get_address_space(). This way > emulated devices and passthru devices behind the same pcie-pci > bridge can have different AS. Again, if "vfio-device" tag with "iommufd" property is enough to identify devices to separate their address spaces, perhaps the existing get_address_space is enough. > If above idea is acceptable, then only obstacle is ERRATA_772415, > maybe we can let VFIO check this errata and bypass RO mapping from > beginning? Yes. There can be some communication between vIOMMU and the VFIO core. > Or we just block this VFIO device running with flts=on if > ERRATA_772415 and suggesting running with flts=off? That sounds like a simpler solution, so long as nobody complains about this limitation :) Thanks Nicolin