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:
Jonathan Cameron 2022-06-08 15:54:39 +01:00 committed by Michael S. Tsirkin
parent 3546b0529a
commit 1ebf9001fb
5 changed files with 21 additions and 27 deletions

View File

@ -33,7 +33,6 @@
#include "sysemu/qtest.h" #include "sysemu/qtest.h"
#include "hw/pci/pci.h" #include "hw/pci/pci.h"
#include "hw/mem/nvdimm.h" #include "hw/mem/nvdimm.h"
#include "hw/cxl/cxl.h"
#include "migration/global_state.h" #include "migration/global_state.h"
#include "migration/vmstate.h" #include "migration/vmstate.h"
#include "exec/confidential-guest-support.h" #include "exec/confidential-guest-support.h"
@ -1075,10 +1074,6 @@ static void machine_initfn(Object *obj)
"Valid values are cpu, mem-ctrl"); "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) { if (mc->cpu_index_to_instance_props && mc->get_default_cpu_node_id) {
ms->numa_state = g_new0(NumaState, 1); ms->numa_state = g_new0(NumaState, 1);
object_property_add_bool(obj, "hmat", object_property_add_bool(obj, "hmat",
@ -1116,7 +1111,6 @@ static void machine_finalize(Object *obj)
g_free(ms->device_memory); g_free(ms->device_memory);
g_free(ms->nvdimms_state); g_free(ms->nvdimms_state);
g_free(ms->numa_state); g_free(ms->numa_state);
g_free(ms->cxl_devices_state);
} }
bool machine_usb(MachineState *machine) bool machine_usb(MachineState *machine)

View File

@ -1631,7 +1631,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
/* Handle the ranges for the PXB expanders */ /* Handle the ranges for the PXB expanders */
if (pci_bus_is_cxl(bus)) { 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; uint64_t base = mr->addr;
cxl_present = true; cxl_present = true;
@ -2614,9 +2614,9 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
machine->nvdimms_state, machine->ram_slots, machine->nvdimms_state, machine->ram_slots,
x86ms->oem_id, x86ms->oem_table_id); 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, 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); acpi_add_table(table_offsets, tables_blob);

View File

@ -733,12 +733,12 @@ void pc_machine_done(Notifier *notifier, void *data)
PCMachineState *pcms = container_of(notifier, PCMachineState *pcms = container_of(notifier,
PCMachineState, machine_done); PCMachineState, machine_done);
X86MachineState *x86ms = X86_MACHINE(pcms); X86MachineState *x86ms = X86_MACHINE(pcms);
MachineState *ms = MACHINE(pcms);
if (ms->cxl_devices_state) { cxl_hook_up_pxb_registers(pcms->bus, &pcms->cxl_devices_state,
cxl_hook_up_pxb_registers(pcms->bus, ms->cxl_devices_state, &error_fatal);
&error_fatal);
cxl_fmws_link_targets(ms->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 */ /* set the number of CPUs */
@ -908,8 +908,8 @@ void pc_memory_init(PCMachineState *pcms,
&machine->device_memory->mr); &machine->device_memory->mr);
} }
if (machine->cxl_devices_state->is_enabled) { if (pcms->cxl_devices_state.is_enabled) {
MemoryRegion *mr = &machine->cxl_devices_state->host_mr; MemoryRegion *mr = &pcms->cxl_devices_state.host_mr;
hwaddr cxl_size = MiB; hwaddr cxl_size = MiB;
if (pcmc->has_reserved_memory && machine->device_memory->base) { 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_init(mr, OBJECT(machine), "cxl_host_reg", cxl_size);
memory_region_add_subregion(system_memory, cxl_base, mr); memory_region_add_subregion(system_memory, cxl_base, mr);
cxl_resv_end = cxl_base + cxl_size; 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; hwaddr cxl_fmw_base;
GList *it; GList *it;
cxl_fmw_base = ROUND_UP(cxl_base + cxl_size, 256 * MiB); 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; CXLFixedWindow *fw = it->data;
fw->base = cxl_fmw_base; 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); 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; res_mem_end = cxl_resv_end;
} }
*val = cpu_to_le64(ROUND_UP(res_mem_end, 1 * GiB)); *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); X86MachineState *x86ms = X86_MACHINE(pcms);
uint64_t hole64_start = 0; uint64_t hole64_start = 0;
if (ms->cxl_devices_state->host_mr.addr) { if (pcms->cxl_devices_state.host_mr.addr) {
hole64_start = ms->cxl_devices_state->host_mr.addr + hole64_start = pcms->cxl_devices_state.host_mr.addr +
memory_region_size(&ms->cxl_devices_state->host_mr); memory_region_size(&pcms->cxl_devices_state.host_mr);
if (ms->cxl_devices_state->fixed_windows) { if (pcms->cxl_devices_state.fixed_windows) {
GList *it; 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; CXLFixedWindow *fw = it->data;
hole64_start = fw->mr.addr + memory_region_size(&fw->mr); 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) static void pc_machine_initfn(Object *obj)
{ {
PCMachineState *pcms = PC_MACHINE(obj); PCMachineState *pcms = PC_MACHINE(obj);
MachineState *ms = MACHINE(obj);
#ifdef CONFIG_VMPORT #ifdef CONFIG_VMPORT
pcms->vmport = ON_OFF_AUTO_AUTO; pcms->vmport = ON_OFF_AUTO_AUTO;
@ -1716,7 +1715,7 @@ static void pc_machine_initfn(Object *obj)
pcms->pcspk = isa_new(TYPE_PC_SPEAKER); pcms->pcspk = isa_new(TYPE_PC_SPEAKER);
object_property_add_alias(OBJECT(pcms), "pcspk-audiodev", object_property_add_alias(OBJECT(pcms), "pcspk-audiodev",
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) static void pc_machine_reset(MachineState *machine)

View File

@ -360,7 +360,6 @@ struct MachineState {
CPUArchIdList *possible_cpus; CPUArchIdList *possible_cpus;
CpuTopology smp; CpuTopology smp;
struct NVDIMMState *nvdimms_state; struct NVDIMMState *nvdimms_state;
struct CXLState *cxl_devices_state;
struct NumaState *numa_state; struct NumaState *numa_state;
CXLFixedMemoryWindowOptionsList *cfmws_list; CXLFixedMemoryWindowOptionsList *cfmws_list;
}; };

View File

@ -14,6 +14,7 @@
#include "qom/object.h" #include "qom/object.h"
#include "hw/i386/sgx-epc.h" #include "hw/i386/sgx-epc.h"
#include "hw/firmware/smbios.h" #include "hw/firmware/smbios.h"
#include "hw/cxl/cxl.h"
#define HPET_INTCAP "hpet-intcap" #define HPET_INTCAP "hpet-intcap"
@ -55,6 +56,7 @@ typedef struct PCMachineState {
hwaddr memhp_io_base; hwaddr memhp_io_base;
SGXEPCState sgx_epc; SGXEPCState sgx_epc;
CXLState cxl_devices_state;
} PCMachineState; } PCMachineState;
#define PC_MACHINE_ACPI_DEVICE_PROP "acpi-device" #define PC_MACHINE_ACPI_DEVICE_PROP "acpi-device"