hw/loongarch/virt: Add basic cpu plug interface framework
Add basic cpu hotplug interface framework, cpu hotplug interface is stub function and only framework is added here. Co-developed-by: Xianglai Li <lixianglai@loongson.cn> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
This commit is contained in:
parent
d32fde20bd
commit
7bf633c53f
@ -816,6 +816,26 @@ static int virt_get_arch_id_from_topo(MachineState *ms, LoongArchCPUTopo *topo)
|
|||||||
return arch_id;
|
return arch_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void virt_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
||||||
|
DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void virt_cpu_unplug_request(HotplugHandler *hotplug_dev,
|
||||||
|
DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void virt_cpu_unplug(HotplugHandler *hotplug_dev,
|
||||||
|
DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void virt_cpu_plug(HotplugHandler *hotplug_dev,
|
||||||
|
DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
static bool memhp_type_supported(DeviceState *dev)
|
static bool memhp_type_supported(DeviceState *dev)
|
||||||
{
|
{
|
||||||
/* we only support pc dimm now */
|
/* we only support pc dimm now */
|
||||||
@ -834,6 +854,8 @@ static void virt_device_pre_plug(HotplugHandler *hotplug_dev,
|
|||||||
{
|
{
|
||||||
if (memhp_type_supported(dev)) {
|
if (memhp_type_supported(dev)) {
|
||||||
virt_mem_pre_plug(hotplug_dev, dev, errp);
|
virt_mem_pre_plug(hotplug_dev, dev, errp);
|
||||||
|
} else if (object_dynamic_cast(OBJECT(dev), TYPE_LOONGARCH_CPU)) {
|
||||||
|
virt_cpu_pre_plug(hotplug_dev, dev, errp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -852,6 +874,8 @@ static void virt_device_unplug_request(HotplugHandler *hotplug_dev,
|
|||||||
{
|
{
|
||||||
if (memhp_type_supported(dev)) {
|
if (memhp_type_supported(dev)) {
|
||||||
virt_mem_unplug_request(hotplug_dev, dev, errp);
|
virt_mem_unplug_request(hotplug_dev, dev, errp);
|
||||||
|
} else if (object_dynamic_cast(OBJECT(dev), TYPE_LOONGARCH_CPU)) {
|
||||||
|
virt_cpu_unplug_request(hotplug_dev, dev, errp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -870,6 +894,8 @@ static void virt_device_unplug(HotplugHandler *hotplug_dev,
|
|||||||
{
|
{
|
||||||
if (memhp_type_supported(dev)) {
|
if (memhp_type_supported(dev)) {
|
||||||
virt_mem_unplug(hotplug_dev, dev, errp);
|
virt_mem_unplug(hotplug_dev, dev, errp);
|
||||||
|
} else if (object_dynamic_cast(OBJECT(dev), TYPE_LOONGARCH_CPU)) {
|
||||||
|
virt_cpu_unplug(hotplug_dev, dev, errp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -897,6 +923,8 @@ static void virt_device_plug_cb(HotplugHandler *hotplug_dev,
|
|||||||
}
|
}
|
||||||
} else if (memhp_type_supported(dev)) {
|
} else if (memhp_type_supported(dev)) {
|
||||||
virt_mem_plug(hotplug_dev, dev, errp);
|
virt_mem_plug(hotplug_dev, dev, errp);
|
||||||
|
} else if (object_dynamic_cast(OBJECT(dev), TYPE_LOONGARCH_CPU)) {
|
||||||
|
virt_cpu_plug(hotplug_dev, dev, errp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -906,6 +934,7 @@ static HotplugHandler *virt_get_hotplug_handler(MachineState *machine,
|
|||||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||||
|
|
||||||
if (device_is_dynamic_sysbus(mc, dev) ||
|
if (device_is_dynamic_sysbus(mc, dev) ||
|
||||||
|
object_dynamic_cast(OBJECT(dev), TYPE_LOONGARCH_CPU) ||
|
||||||
object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI) ||
|
object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI) ||
|
||||||
memhp_type_supported(dev)) {
|
memhp_type_supported(dev)) {
|
||||||
return HOTPLUG_HANDLER(machine);
|
return HOTPLUG_HANDLER(machine);
|
||||||
|
@ -647,6 +647,17 @@ static void loongarch_cpu_realizefn(DeviceState *dev, Error **errp)
|
|||||||
lacc->parent_realize(dev, errp);
|
lacc->parent_realize(dev, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void loongarch_cpu_unrealizefn(DeviceState *dev)
|
||||||
|
{
|
||||||
|
LoongArchCPUClass *lacc = LOONGARCH_CPU_GET_CLASS(dev);
|
||||||
|
|
||||||
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
cpu_remove_sync(CPU(dev));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
lacc->parent_unrealize(dev);
|
||||||
|
}
|
||||||
|
|
||||||
static bool loongarch_get_lsx(Object *obj, Error **errp)
|
static bool loongarch_get_lsx(Object *obj, Error **errp)
|
||||||
{
|
{
|
||||||
return LOONGARCH_CPU(obj)->lsx != ON_OFF_AUTO_OFF;
|
return LOONGARCH_CPU(obj)->lsx != ON_OFF_AUTO_OFF;
|
||||||
@ -897,6 +908,8 @@ static void loongarch_cpu_class_init(ObjectClass *c, void *data)
|
|||||||
device_class_set_props(dc, loongarch_cpu_properties);
|
device_class_set_props(dc, loongarch_cpu_properties);
|
||||||
device_class_set_parent_realize(dc, loongarch_cpu_realizefn,
|
device_class_set_parent_realize(dc, loongarch_cpu_realizefn,
|
||||||
&lacc->parent_realize);
|
&lacc->parent_realize);
|
||||||
|
device_class_set_parent_unrealize(dc, loongarch_cpu_unrealizefn,
|
||||||
|
&lacc->parent_unrealize);
|
||||||
resettable_class_set_parent_phases(rc, NULL, loongarch_cpu_reset_hold, NULL,
|
resettable_class_set_parent_phases(rc, NULL, loongarch_cpu_reset_hold, NULL,
|
||||||
&lacc->parent_phases);
|
&lacc->parent_phases);
|
||||||
|
|
||||||
|
@ -439,6 +439,7 @@ struct LoongArchCPUClass {
|
|||||||
CPUClass parent_class;
|
CPUClass parent_class;
|
||||||
|
|
||||||
DeviceRealize parent_realize;
|
DeviceRealize parent_realize;
|
||||||
|
DeviceUnrealize parent_unrealize;
|
||||||
ResettablePhases parent_phases;
|
ResettablePhases parent_phases;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user