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