mirror of https://github.com/xemu-project/xemu.git
acpi: ich9: add CPU hotplug handling to Q35 machine
.. use IO port 0cd8-0xcf7 range for CPU present bitmap Signed-off-by: Igor Mammedov <imammedo@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
81cea5e7f2
commit
d6610bc2ad
|
@ -10,7 +10,9 @@ ACPI GPE block (IO ports 0xafe0-0xafe3, byte access):
|
||||||
Generic ACPI GPE block. Bit 2 (GPE.2) used to notify CPU
|
Generic ACPI GPE block. Bit 2 (GPE.2) used to notify CPU
|
||||||
hot-add/remove event to ACPI BIOS, via SCI interrupt.
|
hot-add/remove event to ACPI BIOS, via SCI interrupt.
|
||||||
|
|
||||||
CPU present bitmap (IO port 0xaf00-0xaf1f, 1-byte access):
|
CPU present bitmap for:
|
||||||
|
ICH9-LPC (IO port 0x0cd8-0xcf7, 1-byte access)
|
||||||
|
PIIX-PM (IO port 0xaf00-0xaf1f, 1-byte access)
|
||||||
---------------------------------------------------------------
|
---------------------------------------------------------------
|
||||||
One bit per CPU. Bit position reflects corresponding CPU APIC ID.
|
One bit per CPU. Bit position reflects corresponding CPU APIC ID.
|
||||||
Read-only.
|
Read-only.
|
||||||
|
|
|
@ -185,6 +185,15 @@ static void pm_powerdown_req(Notifier *n, void *opaque)
|
||||||
acpi_pm1_evt_power_down(&pm->acpi_regs);
|
acpi_pm1_evt_power_down(&pm->acpi_regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ich9_cpu_added_req(Notifier *n, void *opaque)
|
||||||
|
{
|
||||||
|
ICH9LPCPMRegs *pm = container_of(n, ICH9LPCPMRegs, cpu_added_notifier);
|
||||||
|
|
||||||
|
assert(pm != NULL);
|
||||||
|
AcpiCpuHotplug_add(&pm->acpi_regs.gpe, &pm->gpe_cpu, CPU(opaque));
|
||||||
|
acpi_update_sci(&pm->acpi_regs, pm->irq);
|
||||||
|
}
|
||||||
|
|
||||||
void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm,
|
void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm,
|
||||||
qemu_irq sci_irq)
|
qemu_irq sci_irq)
|
||||||
{
|
{
|
||||||
|
@ -210,6 +219,11 @@ void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm,
|
||||||
qemu_register_reset(pm_reset, pm);
|
qemu_register_reset(pm_reset, pm);
|
||||||
pm->powerdown_notifier.notify = pm_powerdown_req;
|
pm->powerdown_notifier.notify = pm_powerdown_req;
|
||||||
qemu_register_powerdown_notifier(&pm->powerdown_notifier);
|
qemu_register_powerdown_notifier(&pm->powerdown_notifier);
|
||||||
|
|
||||||
|
AcpiCpuHotplug_init(pci_address_space_io(lpc_pci), OBJECT(lpc_pci),
|
||||||
|
&pm->gpe_cpu, ICH9_CPU_HOTPLUG_IO_BASE);
|
||||||
|
pm->cpu_added_notifier.notify = ich9_cpu_added_req;
|
||||||
|
qemu_register_cpu_added_notifier(&pm->cpu_added_notifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ich9_pm_get_gpe0_blk(Object *obj, Visitor *v,
|
static void ich9_pm_get_gpe0_blk(Object *obj, Visitor *v,
|
||||||
|
|
|
@ -18,5 +18,6 @@
|
||||||
*/
|
*/
|
||||||
#define ACPI_CPU_HOTPLUG_STATUS 4
|
#define ACPI_CPU_HOTPLUG_STATUS 4
|
||||||
#define ACPI_GPE_PROC_LEN 32
|
#define ACPI_GPE_PROC_LEN 32
|
||||||
|
#define ICH9_CPU_HOTPLUG_IO_BASE 0x0CD8
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#define HW_ACPI_ICH9_H
|
#define HW_ACPI_ICH9_H
|
||||||
|
|
||||||
#include "hw/acpi/acpi.h"
|
#include "hw/acpi/acpi.h"
|
||||||
|
#include "hw/acpi/cpu_hotplug.h"
|
||||||
|
|
||||||
typedef struct ICH9LPCPMRegs {
|
typedef struct ICH9LPCPMRegs {
|
||||||
/*
|
/*
|
||||||
|
@ -42,6 +43,9 @@ typedef struct ICH9LPCPMRegs {
|
||||||
|
|
||||||
uint32_t pm_io_base;
|
uint32_t pm_io_base;
|
||||||
Notifier powerdown_notifier;
|
Notifier powerdown_notifier;
|
||||||
|
|
||||||
|
AcpiCpuHotplug gpe_cpu;
|
||||||
|
Notifier cpu_added_notifier;
|
||||||
} ICH9LPCPMRegs;
|
} ICH9LPCPMRegs;
|
||||||
|
|
||||||
void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm,
|
void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm,
|
||||||
|
|
Loading…
Reference in New Issue