From: Feng Wu Date: Tue, 24 Nov 2015 11:10:10 +0000 (+0100) Subject: VT-d Posted-Interrupts feature detection X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~2233 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=1d028f7f2bce751b457d5551eb5fa17d4ad79600;p=xen.git VT-d Posted-Interrupts feature detection VT-d Posted-Interrupts is an enhancement to CPU side Posted-Interrupt. With VT-d Posted-Interrupts enabled, external interrupts from direct-assigned devices can be delivered to guests without VMM intervention when guest is running in non-root mode. Signed-off-by: Feng Wu Reviewed-by: Konrad Rzeszutek Wilk Reviewed-by: Jan Beulich Acked-by: Kevin Tian --- diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index d95f4d4720..1d17769a42 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -2156,8 +2156,8 @@ int __init intel_vtd_setup(void) } /* We enable the following features only if they are supported by all VT-d - * engines: Snoop Control, DMA passthrough, Queued Invalidation and - * Interrupt Remapping. + * engines: Snoop Control, DMA passthrough, Queued Invalidation, Interrupt + * Remapping, and Posted Interrupt */ for_each_drhd_unit ( drhd ) { @@ -2185,6 +2185,14 @@ int __init intel_vtd_setup(void) if ( iommu_intremap && !ecap_intr_remap(iommu->ecap) ) iommu_intremap = 0; + /* + * We cannot use posted interrupt if X86_FEATURE_CX16 is + * not supported, since we count on this feature to + * atomically update 16-byte IRTE in posted format. + */ + if ( !cap_intr_post(iommu->cap) || !cpu_has_cx16 ) + iommu_intpost = 0; + if ( !vtd_ept_page_compatible(iommu) ) iommu_hap_pt_share = 0; @@ -2210,6 +2218,7 @@ int __init intel_vtd_setup(void) P(iommu_passthrough, "Dom0 DMA Passthrough"); P(iommu_qinval, "Queued Invalidation"); P(iommu_intremap, "Interrupt Remapping"); + P(iommu_intpost, "Posted Interrupt"); P(iommu_hap_pt_share, "Shared EPT tables"); #undef P @@ -2229,6 +2238,7 @@ int __init intel_vtd_setup(void) iommu_passthrough = 0; iommu_qinval = 0; iommu_intremap = 0; + iommu_intpost = 0; return ret; } diff --git a/xen/drivers/passthrough/vtd/iommu.h b/xen/drivers/passthrough/vtd/iommu.h index ac71ed139d..22abefe8c1 100644 --- a/xen/drivers/passthrough/vtd/iommu.h +++ b/xen/drivers/passthrough/vtd/iommu.h @@ -61,6 +61,7 @@ /* * Decoding Capability Register */ +#define cap_intr_post(c) (((c) >> 59) & 1) #define cap_read_drain(c) (((c) >> 55) & 1) #define cap_write_drain(c) (((c) >> 54) & 1) #define cap_max_amask_val(c) (((c) >> 48) & 0x3f)