The NXP DPAA2 is a hardware architecture designed for high-speeed network packet processing. The DPAA2 hardware components are managed by a hardware component called the Management Complex (or MC) which provides an object-base abstraction for software drivers to use the DPAA2 hardware. For more details you can see: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/staging/fsl-mc/README.txt?h=v4.10
The interrupts generated by the DPAA2 hardware components are MSIs. We will add support for direct assigning these DPAA2 components/objects to a virtual machine. However, this will add the need to expand the MSI usage in QEMU. Currently the MSIs in QEMU are pretty much tied to PCI. For ARM the GIC ITS is using a device ID for interrupt translation. Currently, for PCI, the requester ID is used as device ID. This will not work when we add another entity that needs also a device ID which is supposed to be unique across the system. My proposal is to add a static allocation in the virt machine. I considered that this allocation is specific to each machine/platform. Currently only virt machine has it, but other implementations may use the same mechanism as well. So, I used a static allocation with this formula: DeviceID = zero_extend( RequesterID[15:0] ) + 0x10000 * Constant This formula was taken from SBSA spec (Appendix I: DeviceID generation and ITS groups). In case of QEMU the constant will be different for each entity. In this way a unique DeviceID will be generated and the device ID will be derived from a requesterID (in case of PCI) or other means in case of other entities. The implementation is generic as there might be in the future other non-pci devices that are using MSIs or IOMMU. Any architecture can use it, though currently only the ARM architecture is using the function that retrieves the stream ID. I did not change all the replacements of the pci_requester_id (with pci_stream_id) in the code (although if the constant is 0, the stream_id is equal with requester_id). The other architectures (e.g. intel iommu code) assume that the ID is the requester ID. Tested on NXP LS2080 platform. History: v1->v2 ------ - the stream ID was added as a field in the pci device structure in order not to traverse the PCI hierarchy each time a MSI is sent. Diana Craciun (2): Increased the size of requester_id field from MemTxAttrs Add a unique ID in the virt machine to be used as device ID hw/arm/virt.c | 26 ++++++++++++++++++++++++++ hw/i386/amd_iommu.c | 2 +- hw/i386/intel_iommu.c | 2 +- hw/intc/arm_gicv3_its_common.c | 2 +- hw/intc/arm_gicv3_its_kvm.c | 2 +- hw/pci-host/gpex.c | 6 ++++++ hw/pci/msi.c | 2 +- hw/pci/pci.c | 25 +++++++++++++++++++++++++ include/exec/memattrs.h | 4 ++-- include/hw/arm/virt.h | 1 + include/hw/intc/arm_gicv3_its_common.h | 2 +- include/hw/pci-host/gpex.h | 2 ++ include/hw/pci/pci.h | 8 ++++++++ kvm-all.c | 4 ++-- 14 files changed, 78 insertions(+), 10 deletions(-) -- 2.5.5