Commit e07e98da authored by Roger Pau Monne's avatar Roger Pau Monne Committed by Juergen Gross
Browse files

xen/x86: detect support for extended destination ID



Xen allows the usage of some previously reserved bits in the IO-APIC
RTE and the MSI address fields in order to store high bits for the
target APIC ID. Such feature is already implemented by QEMU/KVM and
HyperV, so in order to enable it just add the handler that checks for
it's presence.

Signed-off-by: default avatarRoger Pau Monné <roger.pau@citrix.com>
Reviewed-by: default avatarJuergen Gross <jgross@suse.com>
Link: https://lore.kernel.org/r/20220120152527.7524-3-roger.pau@citrix.com


Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
parent f34c4f2d
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -100,6 +100,13 @@
/* Memory mapped from other domains has valid IOMMU entries */
#define XEN_HVM_CPUID_IOMMU_MAPPINGS   (1u << 2)
#define XEN_HVM_CPUID_VCPU_ID_PRESENT  (1u << 3) /* vcpu id is present in EBX */
#define XEN_HVM_CPUID_DOMID_PRESENT    (1u << 4) /* domid is present in ECX */
/*
 * Bits 55:49 from the IO-APIC RTE and bits 11:5 from the MSI address can be
 * used to store high bits for the Destination ID. This expands the Destination
 * ID field from 8 to 15 bits, allowing to target APIC IDs up 32768.
 */
#define XEN_HVM_CPUID_EXT_DEST_ID      (1u << 5)

/*
 * Leaf 6 (0x40000x05)
+6 −0
Original line number Diff line number Diff line
@@ -248,6 +248,11 @@ static __init bool xen_x2apic_available(void)
	return x2apic_supported();
}

static bool __init msi_ext_dest_id(void)
{
       return cpuid_eax(xen_cpuid_base() + 4) & XEN_HVM_CPUID_EXT_DEST_ID;
}

static __init void xen_hvm_guest_late_init(void)
{
#ifdef CONFIG_XEN_PVH
@@ -310,6 +315,7 @@ struct hypervisor_x86 x86_hyper_xen_hvm __initdata = {
	.init.x2apic_available  = xen_x2apic_available,
	.init.init_mem_mapping	= xen_hvm_init_mem_mapping,
	.init.guest_late_init	= xen_hvm_guest_late_init,
	.init.msi_ext_dest_id   = msi_ext_dest_id,
	.runtime.pin_vcpu       = xen_pin_vcpu,
	.ignore_nopv            = true,
};