Skip to content

Commit

Permalink
hw/acpi: Make ACPI IO address space configurable
Browse files Browse the repository at this point in the history
This is in preparation for adding support for ARM64 platforms
where it doesn't use port mapped IO for ACPI IO space. We are
making changes so that MMIO region can be accommodated
and board can pass the base address into the aml build function.

Also move few MEMORY_* definitions to header so that other memory
hotplug event signalling mechanisms (eg. Generic Event Device on
HW-reduced acpi platforms) can use the same from their respective
event handler code.

Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Message-Id: <20190918130633.4872-2-shameerali.kolothum.thodi@huawei.com>
Acked-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
shamiali2008 authored and mstsirkin committed Oct 5, 2019
1 parent c6beefd commit 091c466
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 22 deletions.
33 changes: 14 additions & 19 deletions hw/acpi/memory_hotplug.c
Expand Up @@ -30,12 +30,7 @@
#define MEMORY_SLOT_PROXIMITY_METHOD "MPXM"
#define MEMORY_SLOT_EJECT_METHOD "MEJ0"
#define MEMORY_SLOT_NOTIFY_METHOD "MTFY"
#define MEMORY_SLOT_SCAN_METHOD "MSCN"
#define MEMORY_HOTPLUG_DEVICE "MHPD"
#define MEMORY_HOTPLUG_IO_LEN 24
#define MEMORY_DEVICES_CONTAINER "\\_SB.MHPC"

static uint16_t memhp_io_base;

static ACPIOSTInfo *acpi_memory_device_status(int slot, MemStatus *mdev)
{
Expand Down Expand Up @@ -210,7 +205,7 @@ static const MemoryRegionOps acpi_memory_hotplug_ops = {
};

void acpi_memory_hotplug_init(MemoryRegion *as, Object *owner,
MemHotplugState *state, uint16_t io_base)
MemHotplugState *state, hwaddr io_base)
{
MachineState *machine = MACHINE(qdev_get_machine());

Expand All @@ -219,12 +214,10 @@ void acpi_memory_hotplug_init(MemoryRegion *as, Object *owner,
return;
}

assert(!memhp_io_base);
memhp_io_base = io_base;
state->devs = g_malloc0(sizeof(*state->devs) * state->dev_count);
memory_region_init_io(&state->io, owner, &acpi_memory_hotplug_ops, state,
"acpi-mem-hotplug", MEMORY_HOTPLUG_IO_LEN);
memory_region_add_subregion(as, memhp_io_base, &state->io);
memory_region_add_subregion(as, io_base, &state->io);
}

/**
Expand Down Expand Up @@ -343,7 +336,8 @@ const VMStateDescription vmstate_memory_hotplug = {

void build_memory_hotplug_aml(Aml *table, uint32_t nr_mem,
const char *res_root,
const char *event_handler_method)
const char *event_handler_method,
AmlRegionSpace rs, hwaddr memhp_io_base)
{
int i;
Aml *ifctx;
Expand All @@ -352,10 +346,6 @@ void build_memory_hotplug_aml(Aml *table, uint32_t nr_mem,
Aml *mem_ctrl_dev;
char *mhp_res_path;

if (!memhp_io_base) {
return;
}

mhp_res_path = g_strdup_printf("%s." MEMORY_HOTPLUG_DEVICE, res_root);
mem_ctrl_dev = aml_device("%s", mhp_res_path);
{
Expand All @@ -366,14 +356,19 @@ void build_memory_hotplug_aml(Aml *table, uint32_t nr_mem,
aml_name_decl("_UID", aml_string("Memory hotplug resources")));

crs = aml_resource_template();
aml_append(crs,
aml_io(AML_DECODE16, memhp_io_base, memhp_io_base, 0,
MEMORY_HOTPLUG_IO_LEN)
);
if (rs == AML_SYSTEM_IO) {
aml_append(crs,
aml_io(AML_DECODE16, memhp_io_base, memhp_io_base, 0,
MEMORY_HOTPLUG_IO_LEN)
);
} else {
aml_append(crs, aml_memory32_fixed(memhp_io_base,
MEMORY_HOTPLUG_IO_LEN, AML_READ_WRITE));
}
aml_append(mem_ctrl_dev, aml_name_decl("_CRS", crs));

aml_append(mem_ctrl_dev, aml_operation_region(
MEMORY_HOTPLUG_IO_REGION, AML_SYSTEM_IO,
MEMORY_HOTPLUG_IO_REGION, rs,
aml_int(memhp_io_base), MEMORY_HOTPLUG_IO_LEN)
);

Expand Down
7 changes: 6 additions & 1 deletion hw/i386/acpi-build.c
Expand Up @@ -1888,7 +1888,12 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
build_cpus_aml(dsdt, machine, opts, pm->cpu_hp_io_base,
"\\_SB.PCI0", "\\_GPE._E02");
}
build_memory_hotplug_aml(dsdt, nr_mem, "\\_SB.PCI0", "\\_GPE._E03");

if (pcms->memhp_io_base && nr_mem) {
build_memory_hotplug_aml(dsdt, nr_mem, "\\_SB.PCI0",
"\\_GPE._E03", AML_SYSTEM_IO,
pcms->memhp_io_base);
}

scope = aml_scope("_GPE");
{
Expand Down
3 changes: 3 additions & 0 deletions hw/i386/pc.c
Expand Up @@ -1766,6 +1766,9 @@ void pc_memory_init(PCMachineState *pcms,

/* Init default IOAPIC address space */
pcms->ioapic_as = &address_space_memory;

/* Init ACPI memory hotplug IO base address */
pcms->memhp_io_base = ACPI_MEMORY_HOTPLUG_BASE;
}

/*
Expand Down
9 changes: 7 additions & 2 deletions include/hw/acpi/memory_hotplug.h
Expand Up @@ -5,6 +5,10 @@
#include "hw/acpi/acpi.h"
#include "hw/acpi/aml-build.h"

#define MEMORY_SLOT_SCAN_METHOD "MSCN"
#define MEMORY_DEVICES_CONTAINER "\\_SB.MHPC"
#define MEMORY_HOTPLUG_IO_LEN 24

/**
* MemStatus:
* @is_removing: the memory device in slot has been requested to be ejected.
Expand All @@ -29,7 +33,7 @@ typedef struct MemHotplugState {
} MemHotplugState;

void acpi_memory_hotplug_init(MemoryRegion *as, Object *owner,
MemHotplugState *state, uint16_t io_base);
MemHotplugState *state, hwaddr io_base);

void acpi_memory_plug_cb(HotplugHandler *hotplug_dev, MemHotplugState *mem_st,
DeviceState *dev, Error **errp);
Expand All @@ -48,5 +52,6 @@ void acpi_memory_ospm_status(MemHotplugState *mem_st, ACPIOSTInfoList ***list);

void build_memory_hotplug_aml(Aml *table, uint32_t nr_mem,
const char *res_root,
const char *event_handler_method);
const char *event_handler_method,
AmlRegionSpace rs, hwaddr memhp_io_base);
#endif
3 changes: 3 additions & 0 deletions include/hw/i386/pc.h
Expand Up @@ -70,6 +70,9 @@ struct PCMachineState {
/* Address space used by IOAPIC device. All IOAPIC interrupts
* will be translated to MSI messages in the address space. */
AddressSpace *ioapic_as;

/* ACPI Memory hotplug IO base address */
hwaddr memhp_io_base;
};

#define PC_MACHINE_ACPI_DEVICE_PROP "acpi-device"
Expand Down

0 comments on commit 091c466

Please sign in to comment.