mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-27 13:30:52 +00:00
hw/cxl: Move the CXLState from MachineState to machine type specific state.
This removes the last of the CXL code from the MachineState where it is visible to all Machines to only those that support CXL (currently i386/pc) As i386/pc always support CXL now, stop allocating the state independently. Note the pxb register hookup code runs even if cxl=off in order to detect pxb_cxl host bridges and fail to start if any are present as they won't have the control registers available. Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Reviewed-by: Ben Widawsky <ben@bwidawsk.net> Message-Id: <20220608145440.26106-8-Jonathan.Cameron@huawei.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
3546b0529a
commit
1ebf9001fb
@ -33,7 +33,6 @@
|
||||
#include "sysemu/qtest.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/mem/nvdimm.h"
|
||||
#include "hw/cxl/cxl.h"
|
||||
#include "migration/global_state.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "exec/confidential-guest-support.h"
|
||||
@ -1075,10 +1074,6 @@ static void machine_initfn(Object *obj)
|
||||
"Valid values are cpu, mem-ctrl");
|
||||
}
|
||||
|
||||
if (mc->cxl_supported) {
|
||||
ms->cxl_devices_state = g_new0(CXLState, 1);
|
||||
}
|
||||
|
||||
if (mc->cpu_index_to_instance_props && mc->get_default_cpu_node_id) {
|
||||
ms->numa_state = g_new0(NumaState, 1);
|
||||
object_property_add_bool(obj, "hmat",
|
||||
@ -1116,7 +1111,6 @@ static void machine_finalize(Object *obj)
|
||||
g_free(ms->device_memory);
|
||||
g_free(ms->nvdimms_state);
|
||||
g_free(ms->numa_state);
|
||||
g_free(ms->cxl_devices_state);
|
||||
}
|
||||
|
||||
bool machine_usb(MachineState *machine)
|
||||
|
@ -1631,7 +1631,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
|
||||
|
||||
/* Handle the ranges for the PXB expanders */
|
||||
if (pci_bus_is_cxl(bus)) {
|
||||
MemoryRegion *mr = &machine->cxl_devices_state->host_mr;
|
||||
MemoryRegion *mr = &pcms->cxl_devices_state.host_mr;
|
||||
uint64_t base = mr->addr;
|
||||
|
||||
cxl_present = true;
|
||||
@ -2614,9 +2614,9 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
|
||||
machine->nvdimms_state, machine->ram_slots,
|
||||
x86ms->oem_id, x86ms->oem_table_id);
|
||||
}
|
||||
if (machine->cxl_devices_state->is_enabled) {
|
||||
if (pcms->cxl_devices_state.is_enabled) {
|
||||
cxl_build_cedt(table_offsets, tables_blob, tables->linker,
|
||||
x86ms->oem_id, x86ms->oem_table_id, machine->cxl_devices_state);
|
||||
x86ms->oem_id, x86ms->oem_table_id, &pcms->cxl_devices_state);
|
||||
}
|
||||
|
||||
acpi_add_table(table_offsets, tables_blob);
|
||||
|
33
hw/i386/pc.c
33
hw/i386/pc.c
@ -733,12 +733,12 @@ void pc_machine_done(Notifier *notifier, void *data)
|
||||
PCMachineState *pcms = container_of(notifier,
|
||||
PCMachineState, machine_done);
|
||||
X86MachineState *x86ms = X86_MACHINE(pcms);
|
||||
MachineState *ms = MACHINE(pcms);
|
||||
|
||||
if (ms->cxl_devices_state) {
|
||||
cxl_hook_up_pxb_registers(pcms->bus, ms->cxl_devices_state,
|
||||
&error_fatal);
|
||||
cxl_fmws_link_targets(ms->cxl_devices_state, &error_fatal);
|
||||
cxl_hook_up_pxb_registers(pcms->bus, &pcms->cxl_devices_state,
|
||||
&error_fatal);
|
||||
|
||||
if (pcms->cxl_devices_state.is_enabled) {
|
||||
cxl_fmws_link_targets(&pcms->cxl_devices_state, &error_fatal);
|
||||
}
|
||||
|
||||
/* set the number of CPUs */
|
||||
@ -908,8 +908,8 @@ void pc_memory_init(PCMachineState *pcms,
|
||||
&machine->device_memory->mr);
|
||||
}
|
||||
|
||||
if (machine->cxl_devices_state->is_enabled) {
|
||||
MemoryRegion *mr = &machine->cxl_devices_state->host_mr;
|
||||
if (pcms->cxl_devices_state.is_enabled) {
|
||||
MemoryRegion *mr = &pcms->cxl_devices_state.host_mr;
|
||||
hwaddr cxl_size = MiB;
|
||||
|
||||
if (pcmc->has_reserved_memory && machine->device_memory->base) {
|
||||
@ -927,12 +927,12 @@ void pc_memory_init(PCMachineState *pcms,
|
||||
memory_region_init(mr, OBJECT(machine), "cxl_host_reg", cxl_size);
|
||||
memory_region_add_subregion(system_memory, cxl_base, mr);
|
||||
cxl_resv_end = cxl_base + cxl_size;
|
||||
if (machine->cxl_devices_state->fixed_windows) {
|
||||
if (pcms->cxl_devices_state.fixed_windows) {
|
||||
hwaddr cxl_fmw_base;
|
||||
GList *it;
|
||||
|
||||
cxl_fmw_base = ROUND_UP(cxl_base + cxl_size, 256 * MiB);
|
||||
for (it = machine->cxl_devices_state->fixed_windows; it; it = it->next) {
|
||||
for (it = pcms->cxl_devices_state.fixed_windows; it; it = it->next) {
|
||||
CXLFixedWindow *fw = it->data;
|
||||
|
||||
fw->base = cxl_fmw_base;
|
||||
@ -974,7 +974,7 @@ void pc_memory_init(PCMachineState *pcms,
|
||||
res_mem_end += memory_region_size(&machine->device_memory->mr);
|
||||
}
|
||||
|
||||
if (machine->cxl_devices_state->is_enabled) {
|
||||
if (pcms->cxl_devices_state.is_enabled) {
|
||||
res_mem_end = cxl_resv_end;
|
||||
}
|
||||
*val = cpu_to_le64(ROUND_UP(res_mem_end, 1 * GiB));
|
||||
@ -1010,12 +1010,12 @@ uint64_t pc_pci_hole64_start(void)
|
||||
X86MachineState *x86ms = X86_MACHINE(pcms);
|
||||
uint64_t hole64_start = 0;
|
||||
|
||||
if (ms->cxl_devices_state->host_mr.addr) {
|
||||
hole64_start = ms->cxl_devices_state->host_mr.addr +
|
||||
memory_region_size(&ms->cxl_devices_state->host_mr);
|
||||
if (ms->cxl_devices_state->fixed_windows) {
|
||||
if (pcms->cxl_devices_state.host_mr.addr) {
|
||||
hole64_start = pcms->cxl_devices_state.host_mr.addr +
|
||||
memory_region_size(&pcms->cxl_devices_state.host_mr);
|
||||
if (pcms->cxl_devices_state.fixed_windows) {
|
||||
GList *it;
|
||||
for (it = ms->cxl_devices_state->fixed_windows; it; it = it->next) {
|
||||
for (it = pcms->cxl_devices_state.fixed_windows; it; it = it->next) {
|
||||
CXLFixedWindow *fw = it->data;
|
||||
hole64_start = fw->mr.addr + memory_region_size(&fw->mr);
|
||||
}
|
||||
@ -1691,7 +1691,6 @@ static void pc_machine_set_max_fw_size(Object *obj, Visitor *v,
|
||||
static void pc_machine_initfn(Object *obj)
|
||||
{
|
||||
PCMachineState *pcms = PC_MACHINE(obj);
|
||||
MachineState *ms = MACHINE(obj);
|
||||
|
||||
#ifdef CONFIG_VMPORT
|
||||
pcms->vmport = ON_OFF_AUTO_AUTO;
|
||||
@ -1716,7 +1715,7 @@ static void pc_machine_initfn(Object *obj)
|
||||
pcms->pcspk = isa_new(TYPE_PC_SPEAKER);
|
||||
object_property_add_alias(OBJECT(pcms), "pcspk-audiodev",
|
||||
OBJECT(pcms->pcspk), "audiodev");
|
||||
cxl_machine_init(obj, ms->cxl_devices_state);
|
||||
cxl_machine_init(obj, &pcms->cxl_devices_state);
|
||||
}
|
||||
|
||||
static void pc_machine_reset(MachineState *machine)
|
||||
|
@ -360,7 +360,6 @@ struct MachineState {
|
||||
CPUArchIdList *possible_cpus;
|
||||
CpuTopology smp;
|
||||
struct NVDIMMState *nvdimms_state;
|
||||
struct CXLState *cxl_devices_state;
|
||||
struct NumaState *numa_state;
|
||||
CXLFixedMemoryWindowOptionsList *cfmws_list;
|
||||
};
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "qom/object.h"
|
||||
#include "hw/i386/sgx-epc.h"
|
||||
#include "hw/firmware/smbios.h"
|
||||
#include "hw/cxl/cxl.h"
|
||||
|
||||
#define HPET_INTCAP "hpet-intcap"
|
||||
|
||||
@ -55,6 +56,7 @@ typedef struct PCMachineState {
|
||||
hwaddr memhp_io_base;
|
||||
|
||||
SGXEPCState sgx_epc;
|
||||
CXLState cxl_devices_state;
|
||||
} PCMachineState;
|
||||
|
||||
#define PC_MACHINE_ACPI_DEVICE_PROP "acpi-device"
|
||||
|
Loading…
Reference in New Issue
Block a user