mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-24 10:32:02 -06:00
acpi: add acpi=OnOffAuto machine property to x86 and arm virt
Remove the global acpi_enabled bool and replace it with an acpi OnOffAuto machine property. qemu throws an error now if you use -no-acpi while the machine type you are using doesn't support acpi in the first place. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-Id: <20200320100136.11717-1-kraxel@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@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
9d283f85d7
commit
17e89077b7
10 changed files with 78 additions and 10 deletions
|
@ -910,7 +910,7 @@ void virt_acpi_setup(VirtMachineState *vms)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!acpi_enabled) {
|
if (!virt_is_acpi_enabled(vms)) {
|
||||||
trace_virt_acpi_setup();
|
trace_virt_acpi_setup();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,7 @@
|
||||||
#include "kvm_arm.h"
|
#include "kvm_arm.h"
|
||||||
#include "hw/firmware/smbios.h"
|
#include "hw/firmware/smbios.h"
|
||||||
#include "qapi/visitor.h"
|
#include "qapi/visitor.h"
|
||||||
|
#include "qapi/qapi-visit-common.h"
|
||||||
#include "standard-headers/linux/input.h"
|
#include "standard-headers/linux/input.h"
|
||||||
#include "hw/arm/smmuv3.h"
|
#include "hw/arm/smmuv3.h"
|
||||||
#include "hw/acpi/acpi.h"
|
#include "hw/acpi/acpi.h"
|
||||||
|
@ -1844,7 +1845,7 @@ static void machvirt_init(MachineState *machine)
|
||||||
|
|
||||||
create_pcie(vms);
|
create_pcie(vms);
|
||||||
|
|
||||||
if (has_ged && aarch64 && firmware_loaded && acpi_enabled) {
|
if (has_ged && aarch64 && firmware_loaded && virt_is_acpi_enabled(vms)) {
|
||||||
vms->acpi_dev = create_acpi_ged(vms);
|
vms->acpi_dev = create_acpi_ged(vms);
|
||||||
} else {
|
} else {
|
||||||
create_gpio(vms);
|
create_gpio(vms);
|
||||||
|
@ -1934,6 +1935,31 @@ static void virt_set_its(Object *obj, bool value, Error **errp)
|
||||||
vms->its = value;
|
vms->its = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool virt_is_acpi_enabled(VirtMachineState *vms)
|
||||||
|
{
|
||||||
|
if (vms->acpi == ON_OFF_AUTO_OFF) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void virt_get_acpi(Object *obj, Visitor *v, const char *name,
|
||||||
|
void *opaque, Error **errp)
|
||||||
|
{
|
||||||
|
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||||||
|
OnOffAuto acpi = vms->acpi;
|
||||||
|
|
||||||
|
visit_type_OnOffAuto(v, name, &acpi, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void virt_set_acpi(Object *obj, Visitor *v, const char *name,
|
||||||
|
void *opaque, Error **errp)
|
||||||
|
{
|
||||||
|
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||||||
|
|
||||||
|
visit_type_OnOffAuto(v, name, &vms->acpi, errp);
|
||||||
|
}
|
||||||
|
|
||||||
static char *virt_get_gic_version(Object *obj, Error **errp)
|
static char *virt_get_gic_version(Object *obj, Error **errp)
|
||||||
{
|
{
|
||||||
VirtMachineState *vms = VIRT_MACHINE(obj);
|
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||||||
|
@ -2113,7 +2139,7 @@ static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
|
||||||
if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
|
if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
|
||||||
VirtMachineState *vms = VIRT_MACHINE(machine);
|
VirtMachineState *vms = VIRT_MACHINE(machine);
|
||||||
|
|
||||||
if (!vms->bootinfo.firmware_loaded || !acpi_enabled) {
|
if (!vms->bootinfo.firmware_loaded || !virt_is_acpi_enabled(vms)) {
|
||||||
return HOTPLUG_HANDLER(machine);
|
return HOTPLUG_HANDLER(machine);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2184,6 +2210,12 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||||||
mc->numa_mem_supported = true;
|
mc->numa_mem_supported = true;
|
||||||
mc->auto_enable_numa_with_memhp = true;
|
mc->auto_enable_numa_with_memhp = true;
|
||||||
mc->default_ram_id = "mach-virt.ram";
|
mc->default_ram_id = "mach-virt.ram";
|
||||||
|
|
||||||
|
object_class_property_add(oc, "acpi", "OnOffAuto",
|
||||||
|
virt_get_acpi, virt_set_acpi,
|
||||||
|
NULL, NULL, &error_abort);
|
||||||
|
object_class_property_set_description(oc, "acpi",
|
||||||
|
"Enable ACPI", &error_abort);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virt_instance_init(Object *obj)
|
static void virt_instance_init(Object *obj)
|
||||||
|
|
|
@ -3024,7 +3024,7 @@ void acpi_setup(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!acpi_enabled) {
|
if (!x86_machine_is_acpi_enabled(X86_MACHINE(pcms))) {
|
||||||
ACPI_BUILD_DPRINTF("ACPI disabled. Bailing out.\n");
|
ACPI_BUILD_DPRINTF("ACPI disabled. Bailing out.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1297,7 +1297,7 @@ static void pc_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||||
* but pcms->acpi_dev is still created. Check !acpi_enabled in
|
* but pcms->acpi_dev is still created. Check !acpi_enabled in
|
||||||
* addition to cover this case.
|
* addition to cover this case.
|
||||||
*/
|
*/
|
||||||
if (!pcms->acpi_dev || !acpi_enabled) {
|
if (!pcms->acpi_dev || !x86_machine_is_acpi_enabled(X86_MACHINE(pcms))) {
|
||||||
error_setg(errp,
|
error_setg(errp,
|
||||||
"memory hotplug is not enabled: missing acpi device or acpi disabled");
|
"memory hotplug is not enabled: missing acpi device or acpi disabled");
|
||||||
return;
|
return;
|
||||||
|
@ -1351,7 +1351,7 @@ static void pc_memory_unplug_request(HotplugHandler *hotplug_dev,
|
||||||
* but pcms->acpi_dev is still created. Check !acpi_enabled in
|
* but pcms->acpi_dev is still created. Check !acpi_enabled in
|
||||||
* addition to cover this case.
|
* addition to cover this case.
|
||||||
*/
|
*/
|
||||||
if (!pcms->acpi_dev || !acpi_enabled) {
|
if (!pcms->acpi_dev || !x86_machine_is_acpi_enabled(X86_MACHINE(pcms))) {
|
||||||
error_setg(&local_err,
|
error_setg(&local_err,
|
||||||
"memory hotplug is not enabled: missing acpi device or acpi disabled");
|
"memory hotplug is not enabled: missing acpi device or acpi disabled");
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -275,7 +275,7 @@ static void pc_init1(MachineState *machine,
|
||||||
pci_create_simple(pci_bus, piix3_devfn + 2, "piix3-usb-uhci");
|
pci_create_simple(pci_bus, piix3_devfn + 2, "piix3-usb-uhci");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pcmc->pci_enabled && acpi_enabled) {
|
if (pcmc->pci_enabled && x86_machine_is_acpi_enabled(X86_MACHINE(pcms))) {
|
||||||
DeviceState *piix4_pm;
|
DeviceState *piix4_pm;
|
||||||
|
|
||||||
smi_irq = qemu_allocate_irq(pc_acpi_smi_interrupt, first_cpu, 0);
|
smi_irq = qemu_allocate_irq(pc_acpi_smi_interrupt, first_cpu, 0);
|
||||||
|
|
|
@ -904,11 +904,37 @@ static void x86_machine_set_smm(Object *obj, Visitor *v, const char *name,
|
||||||
visit_type_OnOffAuto(v, name, &x86ms->smm, errp);
|
visit_type_OnOffAuto(v, name, &x86ms->smm, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool x86_machine_is_acpi_enabled(X86MachineState *x86ms)
|
||||||
|
{
|
||||||
|
if (x86ms->acpi == ON_OFF_AUTO_OFF) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void x86_machine_get_acpi(Object *obj, Visitor *v, const char *name,
|
||||||
|
void *opaque, Error **errp)
|
||||||
|
{
|
||||||
|
X86MachineState *x86ms = X86_MACHINE(obj);
|
||||||
|
OnOffAuto acpi = x86ms->acpi;
|
||||||
|
|
||||||
|
visit_type_OnOffAuto(v, name, &acpi, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void x86_machine_set_acpi(Object *obj, Visitor *v, const char *name,
|
||||||
|
void *opaque, Error **errp)
|
||||||
|
{
|
||||||
|
X86MachineState *x86ms = X86_MACHINE(obj);
|
||||||
|
|
||||||
|
visit_type_OnOffAuto(v, name, &x86ms->acpi, errp);
|
||||||
|
}
|
||||||
|
|
||||||
static void x86_machine_initfn(Object *obj)
|
static void x86_machine_initfn(Object *obj)
|
||||||
{
|
{
|
||||||
X86MachineState *x86ms = X86_MACHINE(obj);
|
X86MachineState *x86ms = X86_MACHINE(obj);
|
||||||
|
|
||||||
x86ms->smm = ON_OFF_AUTO_AUTO;
|
x86ms->smm = ON_OFF_AUTO_AUTO;
|
||||||
|
x86ms->acpi = ON_OFF_AUTO_AUTO;
|
||||||
x86ms->max_ram_below_4g = 0; /* use default */
|
x86ms->max_ram_below_4g = 0; /* use default */
|
||||||
x86ms->smp_dies = 1;
|
x86ms->smp_dies = 1;
|
||||||
}
|
}
|
||||||
|
@ -937,6 +963,12 @@ static void x86_machine_class_init(ObjectClass *oc, void *data)
|
||||||
NULL, NULL, &error_abort);
|
NULL, NULL, &error_abort);
|
||||||
object_class_property_set_description(oc, X86_MACHINE_SMM,
|
object_class_property_set_description(oc, X86_MACHINE_SMM,
|
||||||
"Enable SMM", &error_abort);
|
"Enable SMM", &error_abort);
|
||||||
|
|
||||||
|
object_class_property_add(oc, X86_MACHINE_ACPI, "OnOffAuto",
|
||||||
|
x86_machine_get_acpi, x86_machine_set_acpi,
|
||||||
|
NULL, NULL, &error_abort);
|
||||||
|
object_class_property_set_description(oc, X86_MACHINE_ACPI,
|
||||||
|
"Enable ACPI", &error_abort);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo x86_machine_info = {
|
static const TypeInfo x86_machine_info = {
|
||||||
|
|
|
@ -181,7 +181,6 @@ void acpi_send_gpe_event(ACPIREGS *ar, qemu_irq irq,
|
||||||
void acpi_update_sci(ACPIREGS *acpi_regs, qemu_irq irq);
|
void acpi_update_sci(ACPIREGS *acpi_regs, qemu_irq irq);
|
||||||
|
|
||||||
/* acpi.c */
|
/* acpi.c */
|
||||||
extern int acpi_enabled;
|
|
||||||
extern char unsigned *acpi_tables;
|
extern char unsigned *acpi_tables;
|
||||||
extern size_t acpi_tables_len;
|
extern size_t acpi_tables_len;
|
||||||
|
|
||||||
|
|
|
@ -131,6 +131,7 @@ typedef struct {
|
||||||
bool highmem_ecam;
|
bool highmem_ecam;
|
||||||
bool its;
|
bool its;
|
||||||
bool virt;
|
bool virt;
|
||||||
|
OnOffAuto acpi;
|
||||||
VirtGICType gic_version;
|
VirtGICType gic_version;
|
||||||
VirtIOMMUType iommu;
|
VirtIOMMUType iommu;
|
||||||
uint16_t virtio_iommu_bdf;
|
uint16_t virtio_iommu_bdf;
|
||||||
|
@ -163,6 +164,7 @@ typedef struct {
|
||||||
OBJECT_CLASS_CHECK(VirtMachineClass, klass, TYPE_VIRT_MACHINE)
|
OBJECT_CLASS_CHECK(VirtMachineClass, klass, TYPE_VIRT_MACHINE)
|
||||||
|
|
||||||
void virt_acpi_setup(VirtMachineState *vms);
|
void virt_acpi_setup(VirtMachineState *vms);
|
||||||
|
bool virt_is_acpi_enabled(VirtMachineState *vms);
|
||||||
|
|
||||||
/* Return the number of used redistributor regions */
|
/* Return the number of used redistributor regions */
|
||||||
static inline int virt_gicv3_redist_region_count(VirtMachineState *vms)
|
static inline int virt_gicv3_redist_region_count(VirtMachineState *vms)
|
||||||
|
|
|
@ -64,6 +64,7 @@ typedef struct {
|
||||||
unsigned smp_dies;
|
unsigned smp_dies;
|
||||||
|
|
||||||
OnOffAuto smm;
|
OnOffAuto smm;
|
||||||
|
OnOffAuto acpi;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Address space used by IOAPIC device. All IOAPIC interrupts
|
* Address space used by IOAPIC device. All IOAPIC interrupts
|
||||||
|
@ -74,6 +75,7 @@ typedef struct {
|
||||||
|
|
||||||
#define X86_MACHINE_MAX_RAM_BELOW_4G "max-ram-below-4g"
|
#define X86_MACHINE_MAX_RAM_BELOW_4G "max-ram-below-4g"
|
||||||
#define X86_MACHINE_SMM "smm"
|
#define X86_MACHINE_SMM "smm"
|
||||||
|
#define X86_MACHINE_ACPI "acpi"
|
||||||
|
|
||||||
#define TYPE_X86_MACHINE MACHINE_TYPE_NAME("x86")
|
#define TYPE_X86_MACHINE MACHINE_TYPE_NAME("x86")
|
||||||
#define X86_MACHINE(obj) \
|
#define X86_MACHINE(obj) \
|
||||||
|
@ -104,6 +106,7 @@ void x86_load_linux(X86MachineState *x86ms,
|
||||||
bool linuxboot_dma_enabled);
|
bool linuxboot_dma_enabled);
|
||||||
|
|
||||||
bool x86_machine_is_smm_enabled(X86MachineState *x86ms);
|
bool x86_machine_is_smm_enabled(X86MachineState *x86ms);
|
||||||
|
bool x86_machine_is_acpi_enabled(X86MachineState *x86ms);
|
||||||
|
|
||||||
/* Global System Interrupts */
|
/* Global System Interrupts */
|
||||||
|
|
||||||
|
|
|
@ -144,7 +144,6 @@ static Chardev **serial_hds;
|
||||||
Chardev *parallel_hds[MAX_PARALLEL_PORTS];
|
Chardev *parallel_hds[MAX_PARALLEL_PORTS];
|
||||||
int win2k_install_hack = 0;
|
int win2k_install_hack = 0;
|
||||||
int singlestep = 0;
|
int singlestep = 0;
|
||||||
int acpi_enabled = 1;
|
|
||||||
int no_hpet = 0;
|
int no_hpet = 0;
|
||||||
int fd_bootchk = 1;
|
int fd_bootchk = 1;
|
||||||
static int no_reboot;
|
static int no_reboot;
|
||||||
|
@ -3516,7 +3515,8 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||||
vnc_parse(optarg, &error_fatal);
|
vnc_parse(optarg, &error_fatal);
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_no_acpi:
|
case QEMU_OPTION_no_acpi:
|
||||||
acpi_enabled = 0;
|
olist = qemu_find_opts("machine");
|
||||||
|
qemu_opts_parse_noisily(olist, "acpi=off", false);
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_no_hpet:
|
case QEMU_OPTION_no_hpet:
|
||||||
no_hpet = 1;
|
no_hpet = 1;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue