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 #include "qemu/typedefs.h" 179f117d41SIgor Mammedov 189f117d41SIgor Mammedov #define TYPE_HOTPLUG_HANDLER "hotplug-handler" 199f117d41SIgor Mammedov 209f117d41SIgor Mammedov #define HOTPLUG_HANDLER_CLASS(klass) \ 219f117d41SIgor Mammedov OBJECT_CLASS_CHECK(HotplugHandlerClass, (klass), TYPE_HOTPLUG_HANDLER) 229f117d41SIgor Mammedov #define HOTPLUG_HANDLER_GET_CLASS(obj) \ 239f117d41SIgor Mammedov OBJECT_GET_CLASS(HotplugHandlerClass, (obj), TYPE_HOTPLUG_HANDLER) 249f117d41SIgor Mammedov #define HOTPLUG_HANDLER(obj) \ 259f117d41SIgor Mammedov INTERFACE_CHECK(HotplugHandler, (obj), TYPE_HOTPLUG_HANDLER) 269f117d41SIgor Mammedov 279f117d41SIgor Mammedov 289f117d41SIgor Mammedov typedef struct HotplugHandler { 299f117d41SIgor Mammedov /* <private> */ 309f117d41SIgor Mammedov Object Parent; 319f117d41SIgor Mammedov } HotplugHandler; 329f117d41SIgor Mammedov 339f117d41SIgor Mammedov /** 349f117d41SIgor Mammedov * hotplug_fn: 359f117d41SIgor Mammedov * @plug_handler: a device performing plug/uplug action 369f117d41SIgor Mammedov * @plugged_dev: a device that has been (un)plugged 379f117d41SIgor Mammedov * @errp: returns an error if this function fails 389f117d41SIgor Mammedov */ 399f117d41SIgor Mammedov typedef void (*hotplug_fn)(HotplugHandler *plug_handler, 409f117d41SIgor Mammedov DeviceState *plugged_dev, Error **errp); 419f117d41SIgor Mammedov 429f117d41SIgor Mammedov /** 439f117d41SIgor Mammedov * HotplugDeviceClass: 449f117d41SIgor Mammedov * 459f117d41SIgor Mammedov * Interface to be implemented by a device performing 469f117d41SIgor Mammedov * hardware (un)plug functions. 479f117d41SIgor Mammedov * 489f117d41SIgor Mammedov * @parent: Opaque parent interface. 499f117d41SIgor Mammedov * @plug: plug callback. 50*14d5a28fSIgor Mammedov * @unplug_request: unplug request callback. 51*14d5a28fSIgor Mammedov * Used as a means to initiate device unplug for devices that 52*14d5a28fSIgor Mammedov * require asynchronous unplug handling. 539f117d41SIgor Mammedov */ 549f117d41SIgor Mammedov typedef struct HotplugHandlerClass { 559f117d41SIgor Mammedov /* <private> */ 569f117d41SIgor Mammedov InterfaceClass parent; 579f117d41SIgor Mammedov 589f117d41SIgor Mammedov /* <public> */ 599f117d41SIgor Mammedov hotplug_fn plug; 60*14d5a28fSIgor Mammedov hotplug_fn unplug_request; 619f117d41SIgor Mammedov } HotplugHandlerClass; 629f117d41SIgor Mammedov 639f117d41SIgor Mammedov /** 649f117d41SIgor Mammedov * hotplug_handler_plug: 659f117d41SIgor Mammedov * 669f117d41SIgor Mammedov * Call #HotplugHandlerClass.plug callback of @plug_handler. 679f117d41SIgor Mammedov */ 689f117d41SIgor Mammedov void hotplug_handler_plug(HotplugHandler *plug_handler, 699f117d41SIgor Mammedov DeviceState *plugged_dev, 709f117d41SIgor Mammedov Error **errp); 719f117d41SIgor Mammedov 729f117d41SIgor Mammedov /** 73*14d5a28fSIgor Mammedov * hotplug_handler_unplug_request: 749f117d41SIgor Mammedov * 75*14d5a28fSIgor Mammedov * Calls #HotplugHandlerClass.unplug_request callback of @plug_handler. 769f117d41SIgor Mammedov */ 77*14d5a28fSIgor Mammedov void hotplug_handler_unplug_request(HotplugHandler *plug_handler, 789f117d41SIgor Mammedov DeviceState *plugged_dev, 799f117d41SIgor Mammedov Error **errp); 809f117d41SIgor Mammedov #endif 81