xref: /qemu/include/hw/hotplug.h (revision aa1b35b975d83a1ee3b5d1a1ae200a59ca44f8d2)
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 
199f117d41SIgor Mammedov #define HOTPLUG_HANDLER_CLASS(klass) \
209f117d41SIgor Mammedov      OBJECT_CLASS_CHECK(HotplugHandlerClass, (klass), TYPE_HOTPLUG_HANDLER)
219f117d41SIgor Mammedov #define HOTPLUG_HANDLER_GET_CLASS(obj) \
229f117d41SIgor Mammedov      OBJECT_GET_CLASS(HotplugHandlerClass, (obj), TYPE_HOTPLUG_HANDLER)
239f117d41SIgor Mammedov #define HOTPLUG_HANDLER(obj) \
249f117d41SIgor Mammedov      INTERFACE_CHECK(HotplugHandler, (obj), TYPE_HOTPLUG_HANDLER)
259f117d41SIgor Mammedov 
26*aa1b35b9SMarc-André Lureau typedef struct HotplugHandler HotplugHandler;
279f117d41SIgor Mammedov 
289f117d41SIgor Mammedov /**
299f117d41SIgor Mammedov  * hotplug_fn:
309f117d41SIgor Mammedov  * @plug_handler: a device performing plug/uplug action
319f117d41SIgor Mammedov  * @plugged_dev: a device that has been (un)plugged
329f117d41SIgor Mammedov  * @errp: returns an error if this function fails
339f117d41SIgor Mammedov  */
349f117d41SIgor Mammedov typedef void (*hotplug_fn)(HotplugHandler *plug_handler,
359f117d41SIgor Mammedov                            DeviceState *plugged_dev, Error **errp);
369f117d41SIgor Mammedov 
379f117d41SIgor Mammedov /**
389f117d41SIgor Mammedov  * HotplugDeviceClass:
399f117d41SIgor Mammedov  *
409f117d41SIgor Mammedov  * Interface to be implemented by a device performing
419f117d41SIgor Mammedov  * hardware (un)plug functions.
429f117d41SIgor Mammedov  *
439f117d41SIgor Mammedov  * @parent: Opaque parent interface.
4441346263SIgor Mammedov  * @pre_plug: pre plug callback called at start of device.realize(true)
4541346263SIgor Mammedov  * @plug: plug callback called at end of device.realize(true).
4614d5a28fSIgor Mammedov  * @unplug_request: unplug request callback.
4714d5a28fSIgor Mammedov  *                  Used as a means to initiate device unplug for devices that
4814d5a28fSIgor Mammedov  *                  require asynchronous unplug handling.
49181a2c63SIgor Mammedov  * @unplug: unplug callback.
50181a2c63SIgor Mammedov  *          Used for device removal with devices that implement
51b4952c36SStefan Weil  *          asynchronous and synchronous (surprise) removal.
529f117d41SIgor Mammedov  */
539f117d41SIgor Mammedov typedef 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;
629f117d41SIgor Mammedov } HotplugHandlerClass;
639f117d41SIgor Mammedov 
649f117d41SIgor Mammedov /**
659f117d41SIgor Mammedov  * hotplug_handler_plug:
669f117d41SIgor Mammedov  *
679f117d41SIgor Mammedov  * Call #HotplugHandlerClass.plug callback of @plug_handler.
689f117d41SIgor Mammedov  */
699f117d41SIgor Mammedov void hotplug_handler_plug(HotplugHandler *plug_handler,
709f117d41SIgor Mammedov                           DeviceState *plugged_dev,
719f117d41SIgor Mammedov                           Error **errp);
729f117d41SIgor Mammedov 
739f117d41SIgor Mammedov /**
7441346263SIgor Mammedov  * hotplug_handler_pre_plug:
7541346263SIgor Mammedov  *
7641346263SIgor Mammedov  * Call #HotplugHandlerClass.pre_plug callback of @plug_handler.
7741346263SIgor Mammedov  */
7841346263SIgor Mammedov void hotplug_handler_pre_plug(HotplugHandler *plug_handler,
7941346263SIgor Mammedov                               DeviceState *plugged_dev,
8041346263SIgor Mammedov                               Error **errp);
8141346263SIgor Mammedov 
8275b0713eSXiao Guangrong /**
8314d5a28fSIgor Mammedov  * hotplug_handler_unplug_request:
849f117d41SIgor Mammedov  *
8514d5a28fSIgor Mammedov  * Calls #HotplugHandlerClass.unplug_request callback of @plug_handler.
869f117d41SIgor Mammedov  */
8714d5a28fSIgor Mammedov void hotplug_handler_unplug_request(HotplugHandler *plug_handler,
889f117d41SIgor Mammedov                                     DeviceState *plugged_dev,
899f117d41SIgor Mammedov                                     Error **errp);
90181a2c63SIgor Mammedov /**
91181a2c63SIgor Mammedov  * hotplug_handler_unplug:
92181a2c63SIgor Mammedov  *
93181a2c63SIgor Mammedov  * Calls #HotplugHandlerClass.unplug callback of @plug_handler.
94181a2c63SIgor Mammedov  */
95181a2c63SIgor Mammedov void hotplug_handler_unplug(HotplugHandler *plug_handler,
96181a2c63SIgor Mammedov                             DeviceState *plugged_dev,
97181a2c63SIgor Mammedov                             Error **errp);
989f117d41SIgor Mammedov #endif
99