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 19db1015e9SEduardo Habkost typedef struct HotplugHandlerClass HotplugHandlerClass; 208110fa1dSEduardo Habkost DECLARE_CLASS_CHECKERS(HotplugHandlerClass, HOTPLUG_HANDLER, 218110fa1dSEduardo Habkost TYPE_HOTPLUG_HANDLER) 229f117d41SIgor Mammedov #define HOTPLUG_HANDLER(obj) \ 239f117d41SIgor Mammedov INTERFACE_CHECK(HotplugHandler, (obj), TYPE_HOTPLUG_HANDLER) 249f117d41SIgor Mammedov 25aa1b35b9SMarc-André Lureau typedef struct HotplugHandler HotplugHandler; 269f117d41SIgor Mammedov 279f117d41SIgor Mammedov /** 289f117d41SIgor Mammedov * hotplug_fn: 299f117d41SIgor Mammedov * @plug_handler: a device performing plug/uplug action 309f117d41SIgor Mammedov * @plugged_dev: a device that has been (un)plugged 319f117d41SIgor Mammedov * @errp: returns an error if this function fails 329f117d41SIgor Mammedov */ 339f117d41SIgor Mammedov typedef void (*hotplug_fn)(HotplugHandler *plug_handler, 349f117d41SIgor Mammedov DeviceState *plugged_dev, Error **errp); 359f117d41SIgor Mammedov 369f117d41SIgor Mammedov /** 379f117d41SIgor Mammedov * HotplugDeviceClass: 389f117d41SIgor Mammedov * 399f117d41SIgor Mammedov * Interface to be implemented by a device performing 409f117d41SIgor Mammedov * hardware (un)plug functions. 419f117d41SIgor Mammedov * 429f117d41SIgor Mammedov * @parent: Opaque parent interface. 4341346263SIgor Mammedov * @pre_plug: pre plug callback called at start of device.realize(true) 4441346263SIgor Mammedov * @plug: plug callback called at end of device.realize(true). 4514d5a28fSIgor Mammedov * @unplug_request: unplug request callback. 4614d5a28fSIgor Mammedov * Used as a means to initiate device unplug for devices that 4714d5a28fSIgor Mammedov * require asynchronous unplug handling. 48181a2c63SIgor Mammedov * @unplug: unplug callback. 49181a2c63SIgor Mammedov * Used for device removal with devices that implement 50b4952c36SStefan Weil * asynchronous and synchronous (surprise) removal. 51*ceefa0b7SIgor Mammedov * @is_hotpluggable_bus: called to check if bus/its parent allow hotplug on bus 529f117d41SIgor Mammedov */ 53db1015e9SEduardo Habkost 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; 62*ceefa0b7SIgor Mammedov bool (*is_hotpluggable_bus)(HotplugHandler *plug_handler, BusState *bus); 63db1015e9SEduardo 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