mirror of https://github.com/xemu-project/xemu.git
ppc/xive: introduce the XiveNotifier interface
The XiveNotifier offers a simple interface, between the XiveSource object and the main interrupt controller of the machine. It will forward event notifications to the XIVE Interrupt Virtualization Routing Engine (IVRE). Signed-off-by: Cédric Le Goater <clg@kaod.org> [dwg: Adjust type name string for XiveNotifier] Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
5fd9ef18a9
commit
5e79b155a8
|
@ -156,7 +156,11 @@ static bool xive_source_esb_eoi(XiveSource *xsrc, uint32_t srcno)
|
||||||
*/
|
*/
|
||||||
static void xive_source_notify(XiveSource *xsrc, int srcno)
|
static void xive_source_notify(XiveSource *xsrc, int srcno)
|
||||||
{
|
{
|
||||||
|
XiveNotifierClass *xnc = XIVE_NOTIFIER_GET_CLASS(xsrc->xive);
|
||||||
|
|
||||||
|
if (xnc->notify) {
|
||||||
|
xnc->notify(xsrc->xive, srcno);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -363,6 +367,17 @@ static void xive_source_reset(void *dev)
|
||||||
static void xive_source_realize(DeviceState *dev, Error **errp)
|
static void xive_source_realize(DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
XiveSource *xsrc = XIVE_SOURCE(dev);
|
XiveSource *xsrc = XIVE_SOURCE(dev);
|
||||||
|
Object *obj;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
|
obj = object_property_get_link(OBJECT(dev), "xive", &local_err);
|
||||||
|
if (!obj) {
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
error_prepend(errp, "required link 'xive' not found: ");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xsrc->xive = XIVE_NOTIFIER(obj);
|
||||||
|
|
||||||
if (!xsrc->nr_irqs) {
|
if (!xsrc->nr_irqs) {
|
||||||
error_setg(errp, "Number of interrupt needs to be greater than 0");
|
error_setg(errp, "Number of interrupt needs to be greater than 0");
|
||||||
|
@ -429,9 +444,19 @@ static const TypeInfo xive_source_info = {
|
||||||
.class_init = xive_source_class_init,
|
.class_init = xive_source_class_init,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XIVE Fabric
|
||||||
|
*/
|
||||||
|
static const TypeInfo xive_fabric_info = {
|
||||||
|
.name = TYPE_XIVE_NOTIFIER,
|
||||||
|
.parent = TYPE_INTERFACE,
|
||||||
|
.class_size = sizeof(XiveNotifierClass),
|
||||||
|
};
|
||||||
|
|
||||||
static void xive_register_types(void)
|
static void xive_register_types(void)
|
||||||
{
|
{
|
||||||
type_register_static(&xive_source_info);
|
type_register_static(&xive_source_info);
|
||||||
|
type_register_static(&xive_fabric_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
type_init(xive_register_types)
|
type_init(xive_register_types)
|
||||||
|
|
|
@ -142,6 +142,27 @@
|
||||||
|
|
||||||
#include "hw/qdev-core.h"
|
#include "hw/qdev-core.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XIVE Fabric (Interface between Source and Router)
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct XiveNotifier {
|
||||||
|
Object parent;
|
||||||
|
} XiveNotifier;
|
||||||
|
|
||||||
|
#define TYPE_XIVE_NOTIFIER "xive-notifier"
|
||||||
|
#define XIVE_NOTIFIER(obj) \
|
||||||
|
OBJECT_CHECK(XiveNotifier, (obj), TYPE_XIVE_NOTIFIER)
|
||||||
|
#define XIVE_NOTIFIER_CLASS(klass) \
|
||||||
|
OBJECT_CLASS_CHECK(XiveNotifierClass, (klass), TYPE_XIVE_NOTIFIER)
|
||||||
|
#define XIVE_NOTIFIER_GET_CLASS(obj) \
|
||||||
|
OBJECT_GET_CLASS(XiveNotifierClass, (obj), TYPE_XIVE_NOTIFIER)
|
||||||
|
|
||||||
|
typedef struct XiveNotifierClass {
|
||||||
|
InterfaceClass parent;
|
||||||
|
void (*notify)(XiveNotifier *xn, uint32_t lisn);
|
||||||
|
} XiveNotifierClass;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XIVE Interrupt Source
|
* XIVE Interrupt Source
|
||||||
*/
|
*/
|
||||||
|
@ -171,6 +192,8 @@ typedef struct XiveSource {
|
||||||
uint64_t esb_flags;
|
uint64_t esb_flags;
|
||||||
uint32_t esb_shift;
|
uint32_t esb_shift;
|
||||||
MemoryRegion esb_mmio;
|
MemoryRegion esb_mmio;
|
||||||
|
|
||||||
|
XiveNotifier *xive;
|
||||||
} XiveSource;
|
} XiveSource;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue