xref: /openbmc/qemu/include/hw/hotplug.h (revision 674acdd17808052519aafcbee1583ad89b66181a)
19f117d41SIgor Mammedov /*
29f117d41SIgor Mammedov  * Hotplug handler interface.
39f117d41SIgor Mammedov  *
49f117d41SIgor Mammedov  * Copyright (c) 2014 Red Hat Inc.
59f117d41SIgor Mammedov  *
69f117d41SIgor Mammedov  * Authors:
79f117d41SIgor Mammedov  *  Igor Mammedov <imammedo@redhat.com>,
89f117d41SIgor Mammedov  *
99f117d41SIgor Mammedov  * This work is licensed under the terms of the GNU GPL, version 2 or later.
109f117d41SIgor Mammedov  * See the COPYING file in the top-level directory.
119f117d41SIgor Mammedov  */
129f117d41SIgor Mammedov #ifndef HOTPLUG_H
139f117d41SIgor Mammedov #define HOTPLUG_H
149f117d41SIgor Mammedov 
159f117d41SIgor Mammedov #include "qom/object.h"
169f117d41SIgor Mammedov 
179f117d41SIgor Mammedov #define TYPE_HOTPLUG_HANDLER "hotplug-handler"
189f117d41SIgor Mammedov 
19db1015e9SEduardo Habkost typedef struct HotplugHandlerClass HotplugHandlerClass;
208110fa1dSEduardo Habkost DECLARE_CLASS_CHECKERS(HotplugHandlerClass, HOTPLUG_HANDLER,
218110fa1dSEduardo Habkost                        TYPE_HOTPLUG_HANDLER)
229f117d41SIgor Mammedov #define HOTPLUG_HANDLER(obj) \
239f117d41SIgor Mammedov      INTERFACE_CHECK(HotplugHandler, (obj), TYPE_HOTPLUG_HANDLER)
249f117d41SIgor Mammedov 
25aa1b35b9SMarc-André Lureau typedef struct HotplugHandler HotplugHandler;
269f117d41SIgor Mammedov 
279f117d41SIgor Mammedov /**
289f117d41SIgor Mammedov  * hotplug_fn:
299f117d41SIgor Mammedov  * @plug_handler: a device performing plug/uplug action
309f117d41SIgor Mammedov  * @plugged_dev: a device that has been (un)plugged
319f117d41SIgor Mammedov  * @errp: returns an error if this function fails
329f117d41SIgor Mammedov  */
339f117d41SIgor Mammedov typedef void (*hotplug_fn)(HotplugHandler *plug_handler,
349f117d41SIgor Mammedov                            DeviceState *plugged_dev, Error **errp);
359f117d41SIgor Mammedov 
369f117d41SIgor Mammedov /**
379f117d41SIgor Mammedov  * HotplugDeviceClass:
389f117d41SIgor Mammedov  *
399f117d41SIgor Mammedov  * Interface to be implemented by a device performing
409f117d41SIgor Mammedov  * hardware (un)plug functions.
419f117d41SIgor Mammedov  *
429f117d41SIgor Mammedov  * @parent: Opaque parent interface.
4341346263SIgor Mammedov  * @pre_plug: pre plug callback called at start of device.realize(true)
4441346263SIgor Mammedov  * @plug: plug callback called at end of device.realize(true).
4514d5a28fSIgor Mammedov  * @unplug_request: unplug request callback.
4614d5a28fSIgor Mammedov  *                  Used as a means to initiate device unplug for devices that
4714d5a28fSIgor Mammedov  *                  require asynchronous unplug handling.
48181a2c63SIgor Mammedov  * @unplug: unplug callback.
49181a2c63SIgor Mammedov  *          Used for device removal with devices that implement
50b4952c36SStefan Weil  *          asynchronous and synchronous (surprise) removal.
51*ceefa0b7SIgor Mammedov  * @is_hotpluggable_bus: called to check if bus/its parent allow hotplug on bus
529f117d41SIgor Mammedov  */
53db1015e9SEduardo Habkost struct HotplugHandlerClass {
549f117d41SIgor Mammedov     /* <private> */
559f117d41SIgor Mammedov     InterfaceClass parent;
569f117d41SIgor Mammedov 
579f117d41SIgor Mammedov     /* <public> */
5841346263SIgor Mammedov     hotplug_fn pre_plug;
599f117d41SIgor Mammedov     hotplug_fn plug;
6014d5a28fSIgor Mammedov     hotplug_fn unplug_request;
61181a2c63SIgor Mammedov     hotplug_fn unplug;
62*ceefa0b7SIgor Mammedov     bool (*is_hotpluggable_bus)(HotplugHandler *plug_handler, BusState *bus);
63db1015e9SEduardo Habkost };
649f117d41SIgor Mammedov 
659f117d41SIgor Mammedov /**
669f117d41SIgor Mammedov  * hotplug_handler_plug:
679f117d41SIgor Mammedov  *
689f117d41SIgor Mammedov  * Call #HotplugHandlerClass.plug callback of @plug_handler.
699f117d41SIgor Mammedov  */
709f117d41SIgor Mammedov void hotplug_handler_plug(HotplugHandler *plug_handler,
719f117d41SIgor Mammedov                           DeviceState *plugged_dev,
729f117d41SIgor Mammedov                           Error **errp);
739f117d41SIgor Mammedov 
749f117d41SIgor Mammedov /**
7541346263SIgor Mammedov  * hotplug_handler_pre_plug:
7641346263SIgor Mammedov  *
7741346263SIgor Mammedov  * Call #HotplugHandlerClass.pre_plug callback of @plug_handler.
7841346263SIgor Mammedov  */
7941346263SIgor Mammedov void hotplug_handler_pre_plug(HotplugHandler *plug_handler,
8041346263SIgor Mammedov                               DeviceState *plugged_dev,
8141346263SIgor Mammedov                               Error **errp);
8241346263SIgor Mammedov 
8375b0713eSXiao Guangrong /**
8414d5a28fSIgor Mammedov  * hotplug_handler_unplug_request:
859f117d41SIgor Mammedov  *
8614d5a28fSIgor Mammedov  * Calls #HotplugHandlerClass.unplug_request callback of @plug_handler.
879f117d41SIgor Mammedov  */
8814d5a28fSIgor Mammedov void hotplug_handler_unplug_request(HotplugHandler *plug_handler,
899f117d41SIgor Mammedov                                     DeviceState *plugged_dev,
909f117d41SIgor Mammedov                                     Error **errp);
91181a2c63SIgor Mammedov /**
92181a2c63SIgor Mammedov  * hotplug_handler_unplug:
93181a2c63SIgor Mammedov  *
94181a2c63SIgor Mammedov  * Calls #HotplugHandlerClass.unplug callback of @plug_handler.
95181a2c63SIgor Mammedov  */
96181a2c63SIgor Mammedov void hotplug_handler_unplug(HotplugHandler *plug_handler,
97181a2c63SIgor Mammedov                             DeviceState *plugged_dev,
98181a2c63SIgor Mammedov                             Error **errp);
999f117d41SIgor Mammedov #endif
100