mirror of
https://github.com/qemu/qemu.git
synced 2025-08-15 13:47:03 +00:00
Merge remote-tracking branch 'kraxel/acpi.2' into staging
* kraxel/acpi.2: apci: assign memory regions to ich9 lpc device apci: assign memory regions to piix4 acpi device acpi: autoload dsdt configure: also symlink *.aml files Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
commit
72e5b276b2
1
configure
vendored
1
configure
vendored
@ -4240,6 +4240,7 @@ FILES="$FILES pc-bios/spapr-rtas/Makefile"
|
|||||||
FILES="$FILES roms/seabios/Makefile roms/vgabios/Makefile"
|
FILES="$FILES roms/seabios/Makefile roms/vgabios/Makefile"
|
||||||
for bios_file in \
|
for bios_file in \
|
||||||
$source_path/pc-bios/*.bin \
|
$source_path/pc-bios/*.bin \
|
||||||
|
$source_path/pc-bios/*.aml \
|
||||||
$source_path/pc-bios/*.rom \
|
$source_path/pc-bios/*.rom \
|
||||||
$source_path/pc-bios/*.dtb \
|
$source_path/pc-bios/*.dtb \
|
||||||
$source_path/pc-bios/openbios-* \
|
$source_path/pc-bios/openbios-* \
|
||||||
|
@ -202,11 +202,13 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ich9_pm_init(ICH9LPCPMRegs *pm, qemu_irq sci_irq, qemu_irq cmos_s3)
|
void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm,
|
||||||
|
qemu_irq sci_irq, qemu_irq cmos_s3)
|
||||||
{
|
{
|
||||||
memory_region_init(&pm->io, "ich9-pm", ICH9_PMIO_SIZE);
|
memory_region_init(&pm->io, "ich9-pm", ICH9_PMIO_SIZE);
|
||||||
memory_region_set_enabled(&pm->io, false);
|
memory_region_set_enabled(&pm->io, false);
|
||||||
memory_region_add_subregion(get_system_io(), 0, &pm->io);
|
memory_region_add_subregion(pci_address_space_io(lpc_pci),
|
||||||
|
0, &pm->io);
|
||||||
|
|
||||||
acpi_pm_tmr_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io);
|
acpi_pm_tmr_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io);
|
||||||
acpi_pm1_evt_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io);
|
acpi_pm1_evt_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io);
|
||||||
|
@ -30,9 +30,11 @@ typedef struct ICH9LPCPMRegs {
|
|||||||
* PM1a_CNT_BLK = 2 in FADT so it is defined as uint16_t.
|
* PM1a_CNT_BLK = 2 in FADT so it is defined as uint16_t.
|
||||||
*/
|
*/
|
||||||
ACPIREGS acpi_regs;
|
ACPIREGS acpi_regs;
|
||||||
|
|
||||||
MemoryRegion io;
|
MemoryRegion io;
|
||||||
MemoryRegion io_gpe;
|
MemoryRegion io_gpe;
|
||||||
MemoryRegion io_smi;
|
MemoryRegion io_smi;
|
||||||
|
|
||||||
uint32_t smi_en;
|
uint32_t smi_en;
|
||||||
uint32_t smi_sts;
|
uint32_t smi_sts;
|
||||||
|
|
||||||
@ -42,7 +44,7 @@ typedef struct ICH9LPCPMRegs {
|
|||||||
Notifier powerdown_notifier;
|
Notifier powerdown_notifier;
|
||||||
} ICH9LPCPMRegs;
|
} ICH9LPCPMRegs;
|
||||||
|
|
||||||
void ich9_pm_init(ICH9LPCPMRegs *pm,
|
void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm,
|
||||||
qemu_irq sci_irq, qemu_irq cmos_s3_resume);
|
qemu_irq sci_irq, qemu_irq cmos_s3_resume);
|
||||||
void ich9_pm_iospace_update(ICH9LPCPMRegs *pm, uint32_t pm_io_base);
|
void ich9_pm_iospace_update(ICH9LPCPMRegs *pm, uint32_t pm_io_base);
|
||||||
extern const VMStateDescription vmstate_ich9_pm;
|
extern const VMStateDescription vmstate_ich9_pm;
|
||||||
|
@ -57,6 +57,7 @@ struct pci_status {
|
|||||||
|
|
||||||
typedef struct PIIX4PMState {
|
typedef struct PIIX4PMState {
|
||||||
PCIDevice dev;
|
PCIDevice dev;
|
||||||
|
|
||||||
MemoryRegion io;
|
MemoryRegion io;
|
||||||
MemoryRegion io_gpe;
|
MemoryRegion io_gpe;
|
||||||
MemoryRegion io_pci;
|
MemoryRegion io_pci;
|
||||||
@ -83,7 +84,8 @@ typedef struct PIIX4PMState {
|
|||||||
uint8_t s4_val;
|
uint8_t s4_val;
|
||||||
} PIIX4PMState;
|
} PIIX4PMState;
|
||||||
|
|
||||||
static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s);
|
static void piix4_acpi_system_hot_add_init(MemoryRegion *parent,
|
||||||
|
PCIBus *bus, PIIX4PMState *s);
|
||||||
|
|
||||||
#define ACPI_ENABLE 0xf1
|
#define ACPI_ENABLE 0xf1
|
||||||
#define ACPI_DISABLE 0xf0
|
#define ACPI_DISABLE 0xf0
|
||||||
@ -406,11 +408,13 @@ static int piix4_pm_initfn(PCIDevice *dev)
|
|||||||
pci_conf[0xd2] = 0x09;
|
pci_conf[0xd2] = 0x09;
|
||||||
pm_smbus_init(&s->dev.qdev, &s->smb);
|
pm_smbus_init(&s->dev.qdev, &s->smb);
|
||||||
memory_region_set_enabled(&s->smb.io, pci_conf[0xd2] & 1);
|
memory_region_set_enabled(&s->smb.io, pci_conf[0xd2] & 1);
|
||||||
memory_region_add_subregion(get_system_io(), s->smb_io_base, &s->smb.io);
|
memory_region_add_subregion(pci_address_space_io(dev),
|
||||||
|
s->smb_io_base, &s->smb.io);
|
||||||
|
|
||||||
memory_region_init(&s->io, "piix4-pm", 64);
|
memory_region_init(&s->io, "piix4-pm", 64);
|
||||||
memory_region_set_enabled(&s->io, false);
|
memory_region_set_enabled(&s->io, false);
|
||||||
memory_region_add_subregion(get_system_io(), 0, &s->io);
|
memory_region_add_subregion(pci_address_space_io(dev),
|
||||||
|
0, &s->io);
|
||||||
|
|
||||||
acpi_pm_tmr_init(&s->ar, pm_tmr_timer, &s->io);
|
acpi_pm_tmr_init(&s->ar, pm_tmr_timer, &s->io);
|
||||||
acpi_pm1_evt_init(&s->ar, pm_tmr_timer, &s->io);
|
acpi_pm1_evt_init(&s->ar, pm_tmr_timer, &s->io);
|
||||||
@ -423,7 +427,8 @@ static int piix4_pm_initfn(PCIDevice *dev)
|
|||||||
s->machine_ready.notify = piix4_pm_machine_ready;
|
s->machine_ready.notify = piix4_pm_machine_ready;
|
||||||
qemu_add_machine_init_done_notifier(&s->machine_ready);
|
qemu_add_machine_init_done_notifier(&s->machine_ready);
|
||||||
qemu_register_reset(piix4_reset, s);
|
qemu_register_reset(piix4_reset, s);
|
||||||
piix4_acpi_system_hot_add_init(dev->bus, s);
|
|
||||||
|
piix4_acpi_system_hot_add_init(pci_address_space_io(dev), dev->bus, s);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -593,15 +598,16 @@ static const MemoryRegionOps piix4_pci_ops = {
|
|||||||
static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev,
|
static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev,
|
||||||
PCIHotplugState state);
|
PCIHotplugState state);
|
||||||
|
|
||||||
static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s)
|
static void piix4_acpi_system_hot_add_init(MemoryRegion *parent,
|
||||||
|
PCIBus *bus, PIIX4PMState *s)
|
||||||
{
|
{
|
||||||
memory_region_init_io(&s->io_gpe, &piix4_gpe_ops, s, "apci-gpe0",
|
memory_region_init_io(&s->io_gpe, &piix4_gpe_ops, s, "apci-gpe0",
|
||||||
GPE_LEN);
|
GPE_LEN);
|
||||||
memory_region_add_subregion(get_system_io(), GPE_BASE, &s->io_gpe);
|
memory_region_add_subregion(parent, GPE_BASE, &s->io_gpe);
|
||||||
|
|
||||||
memory_region_init_io(&s->io_pci, &piix4_pci_ops, s, "apci-pci-hotplug",
|
memory_region_init_io(&s->io_pci, &piix4_pci_ops, s, "apci-pci-hotplug",
|
||||||
PCI_HOTPLUG_SIZE);
|
PCI_HOTPLUG_SIZE);
|
||||||
memory_region_add_subregion(get_system_io(), PCI_HOTPLUG_ADDR,
|
memory_region_add_subregion(parent, PCI_HOTPLUG_ADDR,
|
||||||
&s->io_pci);
|
&s->io_pci);
|
||||||
pci_bus_hotplug(bus, piix4_device_hotplug, &s->dev.qdev);
|
pci_bus_hotplug(bus, piix4_device_hotplug, &s->dev.qdev);
|
||||||
}
|
}
|
||||||
|
@ -336,7 +336,7 @@ void ich9_lpc_pm_init(PCIDevice *lpc_pci, qemu_irq cmos_s3)
|
|||||||
qemu_irq *sci_irq;
|
qemu_irq *sci_irq;
|
||||||
|
|
||||||
sci_irq = qemu_allocate_irqs(ich9_set_sci, lpc, 1);
|
sci_irq = qemu_allocate_irqs(ich9_set_sci, lpc, 1);
|
||||||
ich9_pm_init(&lpc->pm, sci_irq[0], cmos_s3);
|
ich9_pm_init(lpc_pci, &lpc->pm, sci_irq[0], cmos_s3);
|
||||||
|
|
||||||
ich9_lpc_reset(&lpc->d.qdev);
|
ich9_lpc_reset(&lpc->d.qdev);
|
||||||
}
|
}
|
||||||
|
23
hw/pc.c
23
hw/pc.c
@ -886,6 +886,29 @@ void pc_cpus_init(const char *cpu_model)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pc_acpi_init(const char *default_dsdt)
|
||||||
|
{
|
||||||
|
char *filename = NULL, *arg = NULL;
|
||||||
|
|
||||||
|
if (acpi_tables != NULL) {
|
||||||
|
/* manually set via -acpitable, leave it alone */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, default_dsdt);
|
||||||
|
if (filename == NULL) {
|
||||||
|
fprintf(stderr, "WARNING: failed to find %s\n", default_dsdt);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
arg = g_strdup_printf("file=%s", filename);
|
||||||
|
if (acpi_table_add(arg) != 0) {
|
||||||
|
fprintf(stderr, "WARNING: failed to load %s\n", filename);
|
||||||
|
}
|
||||||
|
g_free(arg);
|
||||||
|
g_free(filename);
|
||||||
|
}
|
||||||
|
|
||||||
void *pc_memory_init(MemoryRegion *system_memory,
|
void *pc_memory_init(MemoryRegion *system_memory,
|
||||||
const char *kernel_filename,
|
const char *kernel_filename,
|
||||||
const char *kernel_cmdline,
|
const char *kernel_cmdline,
|
||||||
|
1
hw/pc.h
1
hw/pc.h
@ -79,6 +79,7 @@ void pc_register_ferr_irq(qemu_irq irq);
|
|||||||
void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
|
void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
|
||||||
|
|
||||||
void pc_cpus_init(const char *cpu_model);
|
void pc_cpus_init(const char *cpu_model);
|
||||||
|
void pc_acpi_init(const char *default_dsdt);
|
||||||
void *pc_memory_init(MemoryRegion *system_memory,
|
void *pc_memory_init(MemoryRegion *system_memory,
|
||||||
const char *kernel_filename,
|
const char *kernel_filename,
|
||||||
const char *kernel_cmdline,
|
const char *kernel_cmdline,
|
||||||
|
@ -87,6 +87,7 @@ static void pc_init1(MemoryRegion *system_memory,
|
|||||||
void *fw_cfg = NULL;
|
void *fw_cfg = NULL;
|
||||||
|
|
||||||
pc_cpus_init(cpu_model);
|
pc_cpus_init(cpu_model);
|
||||||
|
pc_acpi_init("acpi-dsdt.aml");
|
||||||
|
|
||||||
if (kvmclock_enabled) {
|
if (kvmclock_enabled) {
|
||||||
kvmclock_create();
|
kvmclock_create();
|
||||||
|
@ -87,6 +87,7 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
|
|||||||
qemu_irq *cmos_s3;
|
qemu_irq *cmos_s3;
|
||||||
|
|
||||||
pc_cpus_init(cpu_model);
|
pc_cpus_init(cpu_model);
|
||||||
|
pc_acpi_init("q35-acpi-dsdt.aml");
|
||||||
|
|
||||||
kvmclock_create();
|
kvmclock_create();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user