mirror of https://github.com/xemu-project/xemu.git
cxl: Machine level control on whether CXL support is enabled
There are going to be some potential overheads to CXL enablement, for example the host bridge region reserved in memory maps. Add a machine level control so that CXL is disabled by default. Signed-off-by: Jonathan Cameron <jonathan.cameron@huawei.com> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20220429144110.25167-14-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
9dccb1216b
commit
abb3009baf
|
@ -33,6 +33,7 @@
|
||||||
#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"
|
||||||
|
@ -625,6 +626,20 @@ static void machine_set_nvdimm_persistence(Object *obj, const char *value,
|
||||||
nvdimms_state->persistence_string = g_strdup(value);
|
nvdimms_state->persistence_string = g_strdup(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool machine_get_cxl(Object *obj, Error **errp)
|
||||||
|
{
|
||||||
|
MachineState *ms = MACHINE(obj);
|
||||||
|
|
||||||
|
return ms->cxl_devices_state->is_enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void machine_set_cxl(Object *obj, bool value, Error **errp)
|
||||||
|
{
|
||||||
|
MachineState *ms = MACHINE(obj);
|
||||||
|
|
||||||
|
ms->cxl_devices_state->is_enabled = value;
|
||||||
|
}
|
||||||
|
|
||||||
void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type)
|
void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type)
|
||||||
{
|
{
|
||||||
QAPI_LIST_PREPEND(mc->allowed_dynamic_sysbus_devices, g_strdup(type));
|
QAPI_LIST_PREPEND(mc->allowed_dynamic_sysbus_devices, g_strdup(type));
|
||||||
|
@ -911,6 +926,8 @@ static void machine_class_init(ObjectClass *oc, void *data)
|
||||||
mc->default_ram_size = 128 * MiB;
|
mc->default_ram_size = 128 * MiB;
|
||||||
mc->rom_file_has_mr = true;
|
mc->rom_file_has_mr = true;
|
||||||
|
|
||||||
|
/* Few machines support CXL, so default to off */
|
||||||
|
mc->cxl_supported = false;
|
||||||
/* numa node memory size aligned on 8MB by default.
|
/* numa node memory size aligned on 8MB by default.
|
||||||
* On Linux, each node's border has to be 8MB aligned
|
* On Linux, each node's border has to be 8MB aligned
|
||||||
*/
|
*/
|
||||||
|
@ -1071,6 +1088,16 @@ static void machine_initfn(Object *obj)
|
||||||
"Valid values are cpu, mem-ctrl");
|
"Valid values are cpu, mem-ctrl");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mc->cxl_supported) {
|
||||||
|
Object *obj = OBJECT(ms);
|
||||||
|
|
||||||
|
ms->cxl_devices_state = g_new0(CXLState, 1);
|
||||||
|
object_property_add_bool(obj, "cxl", machine_get_cxl, machine_set_cxl);
|
||||||
|
object_property_set_description(obj, "cxl",
|
||||||
|
"Set on/off to enable/disable "
|
||||||
|
"CXL instantiation");
|
||||||
|
}
|
||||||
|
|
||||||
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",
|
||||||
|
@ -1108,6 +1135,7 @@ 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)
|
||||||
|
|
|
@ -1761,6 +1761,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||||
mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE;
|
mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE;
|
||||||
mc->nvdimm_supported = true;
|
mc->nvdimm_supported = true;
|
||||||
mc->smp_props.dies_supported = true;
|
mc->smp_props.dies_supported = true;
|
||||||
|
mc->cxl_supported = true;
|
||||||
mc->default_ram_id = "pc.ram";
|
mc->default_ram_id = "pc.ram";
|
||||||
|
|
||||||
object_class_property_add(oc, PC_MACHINE_MAX_RAM_BELOW_4G, "size",
|
object_class_property_add(oc, PC_MACHINE_MAX_RAM_BELOW_4G, "size",
|
||||||
|
|
|
@ -269,6 +269,7 @@ struct MachineClass {
|
||||||
bool ignore_boot_device_suffixes;
|
bool ignore_boot_device_suffixes;
|
||||||
bool smbus_no_migration_support;
|
bool smbus_no_migration_support;
|
||||||
bool nvdimm_supported;
|
bool nvdimm_supported;
|
||||||
|
bool cxl_supported;
|
||||||
bool numa_mem_supported;
|
bool numa_mem_supported;
|
||||||
bool auto_enable_numa;
|
bool auto_enable_numa;
|
||||||
SMPCompatProps smp_props;
|
SMPCompatProps smp_props;
|
||||||
|
@ -359,6 +360,7 @@ 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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -17,4 +17,8 @@
|
||||||
#define CXL_COMPONENT_REG_BAR_IDX 0
|
#define CXL_COMPONENT_REG_BAR_IDX 0
|
||||||
#define CXL_DEVICE_REG_BAR_IDX 2
|
#define CXL_DEVICE_REG_BAR_IDX 2
|
||||||
|
|
||||||
|
typedef struct CXLState {
|
||||||
|
bool is_enabled;
|
||||||
|
} CXLState;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue