xref: /openbmc/qemu/hw/core/qdev-hotplug.c (revision 8cb41fda78c7ebde0dd248c6afe1d336efb0de50)
1*81c7b381SPhilippe Mathieu-Daudé /*
2*81c7b381SPhilippe Mathieu-Daudé  * QDev Hotplug handlers
3*81c7b381SPhilippe Mathieu-Daudé  *
4*81c7b381SPhilippe Mathieu-Daudé  * Copyright (c) Red Hat
5*81c7b381SPhilippe Mathieu-Daudé  *
6*81c7b381SPhilippe Mathieu-Daudé  * SPDX-License-Identifier: GPL-2.0-or-later
7*81c7b381SPhilippe Mathieu-Daudé  *
8*81c7b381SPhilippe Mathieu-Daudé  * This work is licensed under the terms of the GNU GPL, version 2 or later.
9*81c7b381SPhilippe Mathieu-Daudé  * See the COPYING file in the top-level directory.
10*81c7b381SPhilippe Mathieu-Daudé  */
11*81c7b381SPhilippe Mathieu-Daudé 
12*81c7b381SPhilippe Mathieu-Daudé #include "qemu/osdep.h"
13*81c7b381SPhilippe Mathieu-Daudé #include "hw/qdev-core.h"
14*81c7b381SPhilippe Mathieu-Daudé #include "hw/boards.h"
15*81c7b381SPhilippe Mathieu-Daudé 
qdev_get_machine_hotplug_handler(DeviceState * dev)16*81c7b381SPhilippe Mathieu-Daudé HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev)
17*81c7b381SPhilippe Mathieu-Daudé {
18*81c7b381SPhilippe Mathieu-Daudé     MachineState *machine;
19*81c7b381SPhilippe Mathieu-Daudé     MachineClass *mc;
20*81c7b381SPhilippe Mathieu-Daudé     Object *m_obj = qdev_get_machine();
21*81c7b381SPhilippe Mathieu-Daudé 
22*81c7b381SPhilippe Mathieu-Daudé     if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
23*81c7b381SPhilippe Mathieu-Daudé         machine = MACHINE(m_obj);
24*81c7b381SPhilippe Mathieu-Daudé         mc = MACHINE_GET_CLASS(machine);
25*81c7b381SPhilippe Mathieu-Daudé         if (mc->get_hotplug_handler) {
26*81c7b381SPhilippe Mathieu-Daudé             return mc->get_hotplug_handler(machine, dev);
27*81c7b381SPhilippe Mathieu-Daudé         }
28*81c7b381SPhilippe Mathieu-Daudé     }
29*81c7b381SPhilippe Mathieu-Daudé 
30*81c7b381SPhilippe Mathieu-Daudé     return NULL;
31*81c7b381SPhilippe Mathieu-Daudé }
32*81c7b381SPhilippe Mathieu-Daudé 
qdev_hotplug_allowed(DeviceState * dev,Error ** errp)33*81c7b381SPhilippe Mathieu-Daudé bool qdev_hotplug_allowed(DeviceState *dev, Error **errp)
34*81c7b381SPhilippe Mathieu-Daudé {
35*81c7b381SPhilippe Mathieu-Daudé     MachineState *machine;
36*81c7b381SPhilippe Mathieu-Daudé     MachineClass *mc;
37*81c7b381SPhilippe Mathieu-Daudé     Object *m_obj = qdev_get_machine();
38*81c7b381SPhilippe Mathieu-Daudé 
39*81c7b381SPhilippe Mathieu-Daudé     if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
40*81c7b381SPhilippe Mathieu-Daudé         machine = MACHINE(m_obj);
41*81c7b381SPhilippe Mathieu-Daudé         mc = MACHINE_GET_CLASS(machine);
42*81c7b381SPhilippe Mathieu-Daudé         if (mc->hotplug_allowed) {
43*81c7b381SPhilippe Mathieu-Daudé             return mc->hotplug_allowed(machine, dev, errp);
44*81c7b381SPhilippe Mathieu-Daudé         }
45*81c7b381SPhilippe Mathieu-Daudé     }
46*81c7b381SPhilippe Mathieu-Daudé 
47*81c7b381SPhilippe Mathieu-Daudé     return true;
48*81c7b381SPhilippe Mathieu-Daudé }
49*81c7b381SPhilippe Mathieu-Daudé 
qdev_get_bus_hotplug_handler(DeviceState * dev)50*81c7b381SPhilippe Mathieu-Daudé HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev)
51*81c7b381SPhilippe Mathieu-Daudé {
52*81c7b381SPhilippe Mathieu-Daudé     if (dev->parent_bus) {
53*81c7b381SPhilippe Mathieu-Daudé         return dev->parent_bus->hotplug_handler;
54*81c7b381SPhilippe Mathieu-Daudé     }
55*81c7b381SPhilippe Mathieu-Daudé     return NULL;
56*81c7b381SPhilippe Mathieu-Daudé }
57*81c7b381SPhilippe Mathieu-Daudé 
qdev_get_hotplug_handler(DeviceState * dev)58*81c7b381SPhilippe Mathieu-Daudé HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
59*81c7b381SPhilippe Mathieu-Daudé {
60*81c7b381SPhilippe Mathieu-Daudé     HotplugHandler *hotplug_ctrl = qdev_get_machine_hotplug_handler(dev);
61*81c7b381SPhilippe Mathieu-Daudé 
62*81c7b381SPhilippe Mathieu-Daudé     if (hotplug_ctrl == NULL && dev->parent_bus) {
63*81c7b381SPhilippe Mathieu-Daudé         hotplug_ctrl = qdev_get_bus_hotplug_handler(dev);
64*81c7b381SPhilippe Mathieu-Daudé     }
65*81c7b381SPhilippe Mathieu-Daudé     return hotplug_ctrl;
66*81c7b381SPhilippe Mathieu-Daudé }
67*81c7b381SPhilippe Mathieu-Daudé 
68*81c7b381SPhilippe Mathieu-Daudé /* can be used as ->unplug() callback for the simple cases */
qdev_simple_device_unplug_cb(HotplugHandler * hotplug_dev,DeviceState * dev,Error ** errp)69*81c7b381SPhilippe Mathieu-Daudé void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
70*81c7b381SPhilippe Mathieu-Daudé                                   DeviceState *dev, Error **errp)
71*81c7b381SPhilippe Mathieu-Daudé {
72*81c7b381SPhilippe Mathieu-Daudé     qdev_unrealize(dev);
73*81c7b381SPhilippe Mathieu-Daudé }
74