xref: /qemu/include/hw/hotplug.h (revision db1015e92e04835c9eb50c29625fe566d1202dbd)
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 
19*db1015e9SEduardo Habkost typedef struct HotplugHandlerClass HotplugHandlerClass;
209f117d41SIgor Mammedov #define HOTPLUG_HANDLER_CLASS(klass) \
219f117d41SIgor Mammedov      OBJECT_CLASS_CHECK(HotplugHandlerClass, (klass), TYPE_HOTPLUG_HANDLER)
229f117d41SIgor Mammedov #define HOTPLUG_HANDLER_GET_CLASS(obj) \
239f117d41SIgor Mammedov      OBJECT_GET_CLASS(HotplugHandlerClass, (obj), TYPE_HOTPLUG_HANDLER)
249f117d41SIgor Mammedov #define HOTPLUG_HANDLER(obj) \
259f117d41SIgor Mammedov      INTERFACE_CHECK(HotplugHandler, (obj), TYPE_HOTPLUG_HANDLER)
269f117d41SIgor Mammedov 
27aa1b35b9SMarc-André Lureau typedef struct HotplugHandler HotplugHandler;
289f117d41SIgor Mammedov 
299f117d41SIgor Mammedov /**
309f117d41SIgor Mammedov  * hotplug_fn:
319f117d41SIgor Mammedov  * @plug_handler: a device performing plug/uplug action
329f117d41SIgor Mammedov  * @plugged_dev: a device that has been (un)plugged
339f117d41SIgor Mammedov  * @errp: returns an error if this function fails
349f117d41SIgor Mammedov  */
359f117d41SIgor Mammedov typedef void (*hotplug_fn)(HotplugHandler *plug_handler,
369f117d41SIgor Mammedov                            DeviceState *plugged_dev, Error **errp);
379f117d41SIgor Mammedov 
389f117d41SIgor Mammedov /**
399f117d41SIgor Mammedov  * HotplugDeviceClass:
409f117d41SIgor Mammedov  *
419f117d41SIgor Mammedov  * Interface to be implemented by a device performing
429f117d41SIgor Mammedov  * hardware (un)plug functions.
439f117d41SIgor Mammedov  *
449f117d41SIgor Mammedov  * @parent: Opaque parent interface.
4541346263SIgor Mammedov  * @pre_plug: pre plug callback called at start of device.realize(true)
4641346263SIgor Mammedov  * @plug: plug callback called at end of device.realize(true).
4714d5a28fSIgor Mammedov  * @unplug_request: unplug request callback.
4814d5a28fSIgor Mammedov  *                  Used as a means to initiate device unplug for devices that
4914d5a28fSIgor Mammedov  *                  require asynchronous unplug handling.
50181a2c63SIgor Mammedov  * @unplug: unplug callback.
51181a2c63SIgor Mammedov  *          Used for device removal with devices that implement
52b4952c36SStefan Weil  *          asynchronous and synchronous (surprise) removal.
539f117d41SIgor Mammedov  */
54*db1015e9SEduardo Habkost struct HotplugHandlerClass {
559f117d41SIgor Mammedov     /* <private> */
569f117d41SIgor Mammedov     InterfaceClass parent;
579f117d41SIgor Mammedov 
589f117d41SIgor Mammedov     /* <public> */
5941346263SIgor Mammedov     hotplug_fn pre_plug;
609f117d41SIgor Mammedov     hotplug_fn plug;
6114d5a28fSIgor Mammedov     hotplug_fn unplug_request;
62181a2c63SIgor Mammedov     hotplug_fn unplug;
63*db1015e9SEduardo 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