iommu: make interrupt remapping more generic
PATCH 1/1 iommu: make interrupt remapping more generic
Keir,
Attached patch adds 2 more iommu_ops to make interrupt remapping more generic.
-Wei
Signed-off-by Wei Wang <[email protected]>
Signature · 12 lines
AMD Saxony, Dresden, Germany Operating System Research Center Legal Information: AMD Saxony Limited Liability Company & Co. KG Sitz (Geschäftsanschrift): Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland Registergericht Dresden: HRA 4896 vertretungsberechtigter Komplementär: AMD Saxony LLC (Sitz Wilmington, Delaware, USA) Geschäftsführer der AMD Saxony LLC: Dr. Hans-R. Deppe, Thomas McCoy
xen/arch/x86/msi.c +2 -2
@@ -173,8 +173,8 @@ static int unset_vector_msi(int vector)static void write_msi_msg (struct msi_desc *entry,struct msi_msg *msg) { -if ( vtd_enabled ) -msi_msg_write_remap_rte (entry, msg); +if ( iommu_enabled ) +iommu_update_ire_from_msi (entry, msg);switch ( entry->msi_attrib.type ) {
xen/drivers/passthrough/amd/pci_amd_iommu.c +2 -0
@@ -638,4 +638,6 @@ struct iommu_ops amd_iommu_ops = { .unmap_page = amd_iommu_unmap_page, .reassign_device = amd_iommu_return_device, .get_device_group_id = amd_iommu_group_id, + .update_ire_from_apic = amd_iommu_ioapic_update_ire, + .update_ire_from_msi = amd_iommu_msi_msg_update_ire, };
xen/drivers/passthrough/iommu.c +37 -0
@@ -290,6 +290,43 @@ int iommu_get_device_group(struct domainreturn i; } + +void iommu_update_ire_from_apic ( +unsigned int apic,unsigned int reg,unsigned int value) +{ +struct iommu_ops *ops =NULL ; + +switch ( boot_cpu_data.x86_vendor ) + { +case X86_VENDOR_INTEL : + ops = &intel_iommu_ops; +break ; +case X86_VENDOR_AMD : + ops = &amd_iommu_ops; +break ; +default : +BUG (); + } + ops->update_ire_from_apic (apic, reg, value); +} +void iommu_update_ire_from_msi ( +struct msi_desc *msi_desc,struct msi_msg *msg) +{ +struct iommu_ops *ops =NULL ; + +switch ( boot_cpu_data.x86_vendor ) + { +case X86_VENDOR_INTEL : + ops = &intel_iommu_ops; +break ; +case X86_VENDOR_AMD : + ops = &amd_iommu_ops; +break ; +default : +BUG (); + } + ops->update_ire_from_msi (msi_desc, msg); +}/* * Local variables: * mode: C
xen/drivers/passthrough/vtd/iommu.c +2 -0
@@ -1866,6 +1866,8 @@ struct iommu_ops intel_iommu_ops = { .unmap_page = intel_iommu_unmap_page, .reassign_device = reassign_device_ownership, .get_device_group_id = intel_iommu_group_id, + .update_ire_from_apic = io_apic_write_remap_rte, + .update_ire_from_msi = msi_msg_write_remap_rte, };/*
xen/include/asm-x86/io_apic.h +2 -2
@@ -133,8 +133,8 @@ static inline unsigned int io_apic_read(static inline void io_apic_write (unsigned int apic,unsigned int reg,unsigned int value) { -if (vtd_enabled) -return io_apic_write_remap_rte (apic, reg, value); +if (iommu_enabled) +return iommu_update_ire_from_apic (apic, reg, value); *IO_APIC_BASE (apic) = reg; *(IO_APIC_BASE (apic)+4 ) = value; }
xen/include/xen/iommu.h +4 -0
@@ -103,6 +103,10 @@ struct iommu_ops {int (*reassign_device)(struct domain *s,struct domain *t,u8 bus,u8 devfn);int (*get_device_group_id)(u8 bus,u8 devfn); +void (*update_ire_from_apic)(unsigned int apic,unsigned int reg,unsigned int value); + void (*update_ire_from_msi)(struct msi_desc *msi_desc, struct msi_msg *msg); }; +void iommu_update_ire_from_apic (unsigned int apic,unsigned int reg,unsigned int value); +void iommu_update_ire_from_msi (struct msi_desc *msi_desc,struct msi_msg *msg);#endif /* _IOMMU_H_ */
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel