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