mirror of https://github.com/xemu-project/xemu.git
x86-iommu: switch intr_supported to OnOffAuto type
Switch the intr_supported variable from a boolean to OnOffAuto type so that we can know whether the user specified it or not. With that we'll have a chance to help the user to choose more wisely where possible. Introduce x86_iommu_ir_supported() to mask these changes. No functional change at all. Signed-off-by: Peter Xu <peterx@redhat.com> Acked-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
b2fc91db84
commit
a924b3d8df
|
@ -2426,7 +2426,7 @@ build_dmar_q35(GArray *table_data, BIOSLinker *linker)
|
||||||
IntelIOMMUState *intel_iommu = INTEL_IOMMU_DEVICE(iommu);
|
IntelIOMMUState *intel_iommu = INTEL_IOMMU_DEVICE(iommu);
|
||||||
|
|
||||||
assert(iommu);
|
assert(iommu);
|
||||||
if (iommu->intr_supported) {
|
if (x86_iommu_ir_supported(iommu)) {
|
||||||
dmar_flags |= 0x1; /* Flags: 0x1: INT_REMAP */
|
dmar_flags |= 0x1; /* Flags: 0x1: INT_REMAP */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2499,7 +2499,7 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker)
|
||||||
* When interrupt remapping is supported, we add a special IVHD device
|
* When interrupt remapping is supported, we add a special IVHD device
|
||||||
* for type IO-APIC.
|
* for type IO-APIC.
|
||||||
*/
|
*/
|
||||||
if (x86_iommu_get_default()->intr_supported) {
|
if (x86_iommu_ir_supported(x86_iommu_get_default())) {
|
||||||
ivhd_table_len += 8;
|
ivhd_table_len += 8;
|
||||||
}
|
}
|
||||||
/* IVHD length */
|
/* IVHD length */
|
||||||
|
@ -2535,7 +2535,7 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker)
|
||||||
* Linux IOMMU driver checks for the special IVHD device (type IO-APIC).
|
* Linux IOMMU driver checks for the special IVHD device (type IO-APIC).
|
||||||
* See Linux kernel commit 'c2ff5cf5294bcbd7fa50f7d860e90a66db7e5059'
|
* See Linux kernel commit 'c2ff5cf5294bcbd7fa50f7d860e90a66db7e5059'
|
||||||
*/
|
*/
|
||||||
if (x86_iommu_get_default()->intr_supported) {
|
if (x86_iommu_ir_supported(x86_iommu_get_default())) {
|
||||||
build_append_int_noprefix(table_data,
|
build_append_int_noprefix(table_data,
|
||||||
(0x1ull << 56) | /* type IOAPIC */
|
(0x1ull << 56) | /* type IOAPIC */
|
||||||
(IOAPIC_SB_DEVID << 40) | /* IOAPIC devid */
|
(IOAPIC_SB_DEVID << 40) | /* IOAPIC devid */
|
||||||
|
|
|
@ -1233,7 +1233,7 @@ static int amdvi_int_remap_msi(AMDVIState *iommu,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* validate that we are configure with intremap=on */
|
/* validate that we are configure with intremap=on */
|
||||||
if (!X86_IOMMU_DEVICE(iommu)->intr_supported) {
|
if (!x86_iommu_ir_supported(X86_IOMMU_DEVICE(iommu))) {
|
||||||
trace_amdvi_err("Interrupt remapping is enabled in the guest but "
|
trace_amdvi_err("Interrupt remapping is enabled in the guest but "
|
||||||
"not in the host. Use intremap=on to enable interrupt "
|
"not in the host. Use intremap=on to enable interrupt "
|
||||||
"remapping in amd-iommu.");
|
"remapping in amd-iommu.");
|
||||||
|
|
|
@ -3169,7 +3169,7 @@ static void vtd_init(IntelIOMMUState *s)
|
||||||
vtd_paging_entry_rsvd_field[7] = VTD_SPTE_LPAGE_L3_RSVD_MASK(s->aw_bits);
|
vtd_paging_entry_rsvd_field[7] = VTD_SPTE_LPAGE_L3_RSVD_MASK(s->aw_bits);
|
||||||
vtd_paging_entry_rsvd_field[8] = VTD_SPTE_LPAGE_L4_RSVD_MASK(s->aw_bits);
|
vtd_paging_entry_rsvd_field[8] = VTD_SPTE_LPAGE_L4_RSVD_MASK(s->aw_bits);
|
||||||
|
|
||||||
if (x86_iommu->intr_supported) {
|
if (x86_iommu_ir_supported(x86_iommu)) {
|
||||||
s->ecap |= VTD_ECAP_IR | VTD_ECAP_MHMV;
|
s->ecap |= VTD_ECAP_IR | VTD_ECAP_MHMV;
|
||||||
if (s->intr_eim == ON_OFF_AUTO_ON) {
|
if (s->intr_eim == ON_OFF_AUTO_ON) {
|
||||||
s->ecap |= VTD_ECAP_EIM;
|
s->ecap |= VTD_ECAP_EIM;
|
||||||
|
@ -3270,14 +3270,14 @@ static bool vtd_decide_config(IntelIOMMUState *s, Error **errp)
|
||||||
{
|
{
|
||||||
X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(s);
|
X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(s);
|
||||||
|
|
||||||
if (s->intr_eim == ON_OFF_AUTO_ON && !x86_iommu->intr_supported) {
|
if (s->intr_eim == ON_OFF_AUTO_ON && !x86_iommu_ir_supported(x86_iommu)) {
|
||||||
error_setg(errp, "eim=on cannot be selected without intremap=on");
|
error_setg(errp, "eim=on cannot be selected without intremap=on");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->intr_eim == ON_OFF_AUTO_AUTO) {
|
if (s->intr_eim == ON_OFF_AUTO_AUTO) {
|
||||||
s->intr_eim = (kvm_irqchip_in_kernel() || s->buggy_eim)
|
s->intr_eim = (kvm_irqchip_in_kernel() || s->buggy_eim)
|
||||||
&& x86_iommu->intr_supported ?
|
&& x86_iommu_ir_supported(x86_iommu) ?
|
||||||
ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF;
|
ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF;
|
||||||
}
|
}
|
||||||
if (s->intr_eim == ON_OFF_AUTO_ON && !s->buggy_eim) {
|
if (s->intr_eim == ON_OFF_AUTO_ON && !s->buggy_eim) {
|
||||||
|
|
|
@ -1244,7 +1244,7 @@ void pc_machine_done(Notifier *notifier, void *data)
|
||||||
if (pcms->apic_id_limit > 255 && !xen_enabled()) {
|
if (pcms->apic_id_limit > 255 && !xen_enabled()) {
|
||||||
IntelIOMMUState *iommu = INTEL_IOMMU_DEVICE(x86_iommu_get_default());
|
IntelIOMMUState *iommu = INTEL_IOMMU_DEVICE(x86_iommu_get_default());
|
||||||
|
|
||||||
if (!iommu || !iommu->x86_iommu.intr_supported ||
|
if (!iommu || !x86_iommu_ir_supported(X86_IOMMU_DEVICE(iommu)) ||
|
||||||
iommu->intr_eim != ON_OFF_AUTO_ON) {
|
iommu->intr_eim != ON_OFF_AUTO_ON) {
|
||||||
error_report("current -smp configuration requires "
|
error_report("current -smp configuration requires "
|
||||||
"Extended Interrupt Mode enabled. "
|
"Extended Interrupt Mode enabled. "
|
||||||
|
|
|
@ -119,8 +119,13 @@ static void x86_iommu_realize(DeviceState *dev, Error **errp)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If the user didn't specify IR, choose a default value for it */
|
||||||
|
if (x86_iommu->intr_supported == ON_OFF_AUTO_AUTO) {
|
||||||
|
x86_iommu->intr_supported = ON_OFF_AUTO_OFF;
|
||||||
|
}
|
||||||
|
|
||||||
/* Both Intel and AMD IOMMU IR only support "kernel-irqchip={off|split}" */
|
/* Both Intel and AMD IOMMU IR only support "kernel-irqchip={off|split}" */
|
||||||
if (x86_iommu->intr_supported && kvm_irqchip_in_kernel() &&
|
if (x86_iommu_ir_supported(x86_iommu) && kvm_irqchip_in_kernel() &&
|
||||||
!kvm_irqchip_is_split()) {
|
!kvm_irqchip_is_split()) {
|
||||||
error_setg(errp, "Interrupt Remapping cannot work with "
|
error_setg(errp, "Interrupt Remapping cannot work with "
|
||||||
"kernel-irqchip=on, please use 'split|off'.");
|
"kernel-irqchip=on, please use 'split|off'.");
|
||||||
|
@ -135,7 +140,8 @@ static void x86_iommu_realize(DeviceState *dev, Error **errp)
|
||||||
}
|
}
|
||||||
|
|
||||||
static Property x86_iommu_properties[] = {
|
static Property x86_iommu_properties[] = {
|
||||||
DEFINE_PROP_BOOL("intremap", X86IOMMUState, intr_supported, false),
|
DEFINE_PROP_ON_OFF_AUTO("intremap", X86IOMMUState,
|
||||||
|
intr_supported, ON_OFF_AUTO_AUTO),
|
||||||
DEFINE_PROP_BOOL("device-iotlb", X86IOMMUState, dt_supported, false),
|
DEFINE_PROP_BOOL("device-iotlb", X86IOMMUState, dt_supported, false),
|
||||||
DEFINE_PROP_BOOL("pt", X86IOMMUState, pt_supported, true),
|
DEFINE_PROP_BOOL("pt", X86IOMMUState, pt_supported, true),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
@ -148,6 +154,11 @@ static void x86_iommu_class_init(ObjectClass *klass, void *data)
|
||||||
dc->props = x86_iommu_properties;
|
dc->props = x86_iommu_properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool x86_iommu_ir_supported(X86IOMMUState *s)
|
||||||
|
{
|
||||||
|
return s->intr_supported == ON_OFF_AUTO_ON;
|
||||||
|
}
|
||||||
|
|
||||||
static const TypeInfo x86_iommu_info = {
|
static const TypeInfo x86_iommu_info = {
|
||||||
.name = TYPE_X86_IOMMU_DEVICE,
|
.name = TYPE_X86_IOMMU_DEVICE,
|
||||||
.parent = TYPE_SYS_BUS_DEVICE,
|
.parent = TYPE_SYS_BUS_DEVICE,
|
||||||
|
|
|
@ -74,13 +74,15 @@ typedef struct IEC_Notifier IEC_Notifier;
|
||||||
|
|
||||||
struct X86IOMMUState {
|
struct X86IOMMUState {
|
||||||
SysBusDevice busdev;
|
SysBusDevice busdev;
|
||||||
bool intr_supported; /* Whether vIOMMU supports IR */
|
OnOffAuto intr_supported; /* Whether vIOMMU supports IR */
|
||||||
bool dt_supported; /* Whether vIOMMU supports DT */
|
bool dt_supported; /* Whether vIOMMU supports DT */
|
||||||
bool pt_supported; /* Whether vIOMMU supports pass-through */
|
bool pt_supported; /* Whether vIOMMU supports pass-through */
|
||||||
IommuType type; /* IOMMU type - AMD/Intel */
|
IommuType type; /* IOMMU type - AMD/Intel */
|
||||||
QLIST_HEAD(, IEC_Notifier) iec_notifiers; /* IEC notify list */
|
QLIST_HEAD(, IEC_Notifier) iec_notifiers; /* IEC notify list */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool x86_iommu_ir_supported(X86IOMMUState *s);
|
||||||
|
|
||||||
/* Generic IRQ entry information when interrupt remapping is enabled */
|
/* Generic IRQ entry information when interrupt remapping is enabled */
|
||||||
struct X86IOMMUIrq {
|
struct X86IOMMUIrq {
|
||||||
/* Used by both IOAPIC/MSI interrupt remapping */
|
/* Used by both IOAPIC/MSI interrupt remapping */
|
||||||
|
|
Loading…
Reference in New Issue