xref: /qemu/include/hw/hotplug.h (revision 75b0713e189a981e5bfd087d5f35705446bbb12a)
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 
269f117d41SIgor Mammedov 
279f117d41SIgor Mammedov typedef struct HotplugHandler {
289f117d41SIgor Mammedov     /* <private> */
299f117d41SIgor Mammedov     Object Parent;
309f117d41SIgor Mammedov } HotplugHandler;
319f117d41SIgor Mammedov 
329f117d41SIgor Mammedov /**
339f117d41SIgor Mammedov  * hotplug_fn:
349f117d41SIgor Mammedov  * @plug_handler: a device performing plug/uplug action
359f117d41SIgor Mammedov  * @plugged_dev: a device that has been (un)plugged
369f117d41SIgor Mammedov  * @errp: returns an error if this function fails
379f117d41SIgor Mammedov  */
389f117d41SIgor Mammedov typedef void (*hotplug_fn)(HotplugHandler *plug_handler,
399f117d41SIgor Mammedov                            DeviceState *plugged_dev, Error **errp);
409f117d41SIgor Mammedov 
419f117d41SIgor Mammedov /**
429f117d41SIgor Mammedov  * HotplugDeviceClass:
439f117d41SIgor Mammedov  *
449f117d41SIgor Mammedov  * Interface to be implemented by a device performing
459f117d41SIgor Mammedov  * hardware (un)plug functions.
469f117d41SIgor Mammedov  *
479f117d41SIgor Mammedov  * @parent: Opaque parent interface.
4841346263SIgor Mammedov  * @pre_plug: pre plug callback called at start of device.realize(true)
4941346263SIgor Mammedov  * @plug: plug callback called at end of device.realize(true).
50*75b0713eSXiao Guangrong  * @post_pug: post plug callback called after device is successfully plugged.
5114d5a28fSIgor Mammedov  * @unplug_request: unplug request callback.
5214d5a28fSIgor Mammedov  *                  Used as a means to initiate device unplug for devices that
5314d5a28fSIgor Mammedov  *                  require asynchronous unplug handling.
54181a2c63SIgor Mammedov  * @unplug: unplug callback.
55181a2c63SIgor Mammedov  *          Used for device removal with devices that implement
56b4952c36SStefan Weil  *          asynchronous and synchronous (surprise) removal.
579f117d41SIgor Mammedov  */
589f117d41SIgor Mammedov typedef struct HotplugHandlerClass {
599f117d41SIgor Mammedov     /* <private> */
609f117d41SIgor Mammedov     InterfaceClass parent;
619f117d41SIgor Mammedov 
629f117d41SIgor Mammedov     /* <public> */
6341346263SIgor Mammedov     hotplug_fn pre_plug;
649f117d41SIgor Mammedov     hotplug_fn plug;
65*75b0713eSXiao Guangrong     hotplug_fn post_plug;
6614d5a28fSIgor Mammedov     hotplug_fn unplug_request;
67181a2c63SIgor Mammedov     hotplug_fn unplug;
689f117d41SIgor Mammedov } HotplugHandlerClass;
699f117d41SIgor Mammedov 
709f117d41SIgor Mammedov /**
719f117d41SIgor Mammedov  * hotplug_handler_plug:
729f117d41SIgor Mammedov  *
739f117d41SIgor Mammedov  * Call #HotplugHandlerClass.plug callback of @plug_handler.
749f117d41SIgor Mammedov  */
759f117d41SIgor Mammedov void hotplug_handler_plug(HotplugHandler *plug_handler,
769f117d41SIgor Mammedov                           DeviceState *plugged_dev,
779f117d41SIgor Mammedov                           Error **errp);
789f117d41SIgor Mammedov 
799f117d41SIgor Mammedov /**
8041346263SIgor Mammedov  * hotplug_handler_pre_plug:
8141346263SIgor Mammedov  *
8241346263SIgor Mammedov  * Call #HotplugHandlerClass.pre_plug callback of @plug_handler.
8341346263SIgor Mammedov  */
8441346263SIgor Mammedov void hotplug_handler_pre_plug(HotplugHandler *plug_handler,
8541346263SIgor Mammedov                               DeviceState *plugged_dev,
8641346263SIgor Mammedov                               Error **errp);
8741346263SIgor Mammedov 
88*75b0713eSXiao Guangrong /**
89*75b0713eSXiao Guangrong  * hotplug_handler_post_plug:
90*75b0713eSXiao Guangrong  *
91*75b0713eSXiao Guangrong  * Call #HotplugHandlerClass.post_plug callback of @plug_handler.
92*75b0713eSXiao Guangrong  */
93*75b0713eSXiao Guangrong void hotplug_handler_post_plug(HotplugHandler *plug_handler,
94*75b0713eSXiao Guangrong                                DeviceState *plugged_dev,
95*75b0713eSXiao Guangrong                                Error **errp);
9641346263SIgor Mammedov 
9741346263SIgor Mammedov /**
9814d5a28fSIgor Mammedov  * hotplug_handler_unplug_request:
999f117d41SIgor Mammedov  *
10014d5a28fSIgor Mammedov  * Calls #HotplugHandlerClass.unplug_request callback of @plug_handler.
1019f117d41SIgor Mammedov  */
10214d5a28fSIgor Mammedov void hotplug_handler_unplug_request(HotplugHandler *plug_handler,
1039f117d41SIgor Mammedov                                     DeviceState *plugged_dev,
1049f117d41SIgor Mammedov                                     Error **errp);
105181a2c63SIgor Mammedov /**
106181a2c63SIgor Mammedov  * hotplug_handler_unplug:
107181a2c63SIgor Mammedov  *
108181a2c63SIgor Mammedov  * Calls #HotplugHandlerClass.unplug callback of @plug_handler.
109181a2c63SIgor Mammedov  */
110181a2c63SIgor Mammedov void hotplug_handler_unplug(HotplugHandler *plug_handler,
111181a2c63SIgor Mammedov                             DeviceState *plugged_dev,
112181a2c63SIgor Mammedov                             Error **errp);
1139f117d41SIgor Mammedov #endif
114