> -----Original Message-----
> From: Eric Auger <[email protected]>
> Sent: Monday, November 18, 2024 6:10 PM
> To: Shameerali Kolothum Thodi
> <[email protected]>; [email protected];
> [email protected]
> Cc: [email protected]; [email protected]; [email protected];
> [email protected]; Linuxarm <[email protected]>; Wangzhou (B)
> <[email protected]>; jiangkunkun <[email protected]>;
> Jonathan Cameron <[email protected]>;
> [email protected]
> Subject: Re: [RFC PATCH 4/5] hw/arm/virt-acpi-build: Build IORT with
> multiple SMMU nodes
[...]
> > I think the above won't affect the basic case where I have only one
> > pcie-pxb/SMMUv3. But even in that case hot add seems not working.
> >
> > I tried hacking the min/max ranges as suspected by Nicolin. But still not
> enough to
> > get it working. Do you have any hint on why the hot add(described
> below) is not
> > working?
> Hum thought the duplicate idmap could be the cause. Otherwise I have no
> clue. I would advice to fix it first.
I think I have an idea why the hot add was not working.
When we have the PCIe topology as something like below,
-device pxb-pcie,id=pcie.1,bus_nr=8,bus=pcie.0 \
-device pcie-root-port,id=pcie.port1,bus=pcie.1,chassis=1 \
-device pcie-root-port,id=pcie.port2,bus=pcie.1,chassis=2 \
-device arm-smmuv3-nested,id=smmuv1,pci-bus=pcie.1 \
...
The current IORT generation includes the pcie-root-port dev ids also
in the SMMUv3 node idmaps.
Hence, when Guest kernel loads, pcieport is also behind the SMMUv3.
[ 1.466670] pcieport 0000:64:00.0: Adding to iommu group 1
...
[ 1.448205] pcieport 0000:64:01.0: Adding to iommu group 2
So when we do a hot add,
device_add vfio-pci,host=0000:75:00.1,bus=pcie.port1,iommufd=iommufd0
The Qemu hotplug event handler tries to inject an IRQ to the Guest pcieport
by retrieving the MSI address it is configured with.
hotplug_event_notify()
msix_prepare_message(): [address: 0xfffff040]
msix_notify()
The ITS address retrieved here is actually the SMMUv3 translated iova addr,
not the Guest PA. So Guest never sees/receives the interrupt.
I did hack the IORT code to exclude the pcie-root-port dev ids from the SMMUv3
node idmaps and the hot add seems to work fine.
Looks like we need to find all the pcie-root-port dev ids associated with a
SMMUv3/pxb-pcie and exclude them from SMMUv3 node idmaps to get
the hot add working.
I am not sure though this will create any other issues in IOMMU isolation
criteria
(ACS etc,), especially if we want to access the device in Guest user space( I
hope
not).
Thanks,
Shameer