| /* |
| * Hotplug handler interface. |
| * |
| * Copyright (c) 2014 Red Hat Inc. |
| * |
| * Authors: |
| * Igor Mammedov <imammedo@redhat.com>, |
| * |
| * This work is licensed under the terms of the GNU GPL, version 2 or later. |
| * See the COPYING file in the top-level directory. |
| */ |
| #ifndef HOTPLUG_H |
| #define HOTPLUG_H |
| |
| #include "qom/object.h" |
| |
| #define TYPE_HOTPLUG_HANDLER "hotplug-handler" |
| |
| typedef struct HotplugHandlerClass HotplugHandlerClass; |
| DECLARE_CLASS_CHECKERS(HotplugHandlerClass, HOTPLUG_HANDLER, |
| TYPE_HOTPLUG_HANDLER) |
| #define HOTPLUG_HANDLER(obj) \ |
| INTERFACE_CHECK(HotplugHandler, (obj), TYPE_HOTPLUG_HANDLER) |
| |
| typedef struct HotplugHandler HotplugHandler; |
| |
| /** |
| * hotplug_fn: |
| * @plug_handler: a device performing plug/uplug action |
| * @plugged_dev: a device that has been (un)plugged |
| * @errp: returns an error if this function fails |
| */ |
| typedef void (*hotplug_fn)(HotplugHandler *plug_handler, |
| DeviceState *plugged_dev, Error **errp); |
| |
| /** |
| * HotplugDeviceClass: |
| * |
| * Interface to be implemented by a device performing |
| * hardware (un)plug functions. |
| * |
| * @parent: Opaque parent interface. |
| * @pre_plug: pre plug callback called at start of device.realize(true) |
| * @plug: plug callback called at end of device.realize(true). |
| * @unplug_request: unplug request callback. |
| * Used as a means to initiate device unplug for devices that |
| * require asynchronous unplug handling. |
| * @unplug: unplug callback. |
| * Used for device removal with devices that implement |
| * asynchronous and synchronous (surprise) removal. |
| * @is_hotpluggable_bus: called to check if bus/its parent allow hotplug on bus |
| */ |
| struct HotplugHandlerClass { |
| /* <private> */ |
| InterfaceClass parent; |
| |
| /* <public> */ |
| hotplug_fn pre_plug; |
| hotplug_fn plug; |
| hotplug_fn unplug_request; |
| hotplug_fn unplug; |
| bool (*is_hotpluggable_bus)(HotplugHandler *plug_handler, BusState *bus); |
| }; |
| |
| /** |
| * hotplug_handler_plug: |
| * |
| * Call #HotplugHandlerClass.plug callback of @plug_handler. |
| */ |
| void hotplug_handler_plug(HotplugHandler *plug_handler, |
| DeviceState *plugged_dev, |
| Error **errp); |
| |
| /** |
| * hotplug_handler_pre_plug: |
| * |
| * Call #HotplugHandlerClass.pre_plug callback of @plug_handler. |
| */ |
| void hotplug_handler_pre_plug(HotplugHandler *plug_handler, |
| DeviceState *plugged_dev, |
| Error **errp); |
| |
| /** |
| * hotplug_handler_unplug_request: |
| * |
| * Calls #HotplugHandlerClass.unplug_request callback of @plug_handler. |
| */ |
| void hotplug_handler_unplug_request(HotplugHandler *plug_handler, |
| DeviceState *plugged_dev, |
| Error **errp); |
| /** |
| * hotplug_handler_unplug: |
| * |
| * Calls #HotplugHandlerClass.unplug callback of @plug_handler. |
| */ |
| void hotplug_handler_unplug(HotplugHandler *plug_handler, |
| DeviceState *plugged_dev, |
| Error **errp); |
| #endif |