sysbus: Expose IRQ enumeration helpers
Sysbus devices can get their IRQ lines connected to other devices. It is possible to figure out which IRQ line a connection is on and whether a sysbus device even provides an IRQ connector at a specific offset. This patch exposes helpers to make this information publicly accessible. We will need it for the platform bus dynamic sysbus enumeration. Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
33cd52b5d7
commit
b797318666
@ -453,6 +453,17 @@ void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
|
|||||||
g_free(propname);
|
g_free(propname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
|
||||||
|
{
|
||||||
|
char *propname = g_strdup_printf("%s[%d]",
|
||||||
|
name ? name : "unnamed-gpio-out", n);
|
||||||
|
|
||||||
|
qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* disconnect a GPIO ouput, returning the disconnected input (if any) */
|
/* disconnect a GPIO ouput, returning the disconnected input (if any) */
|
||||||
|
|
||||||
static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
|
static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
|
||||||
|
@ -84,6 +84,27 @@ static const TypeInfo system_bus_info = {
|
|||||||
.class_init = system_bus_class_init,
|
.class_init = system_bus_class_init,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Check whether an IRQ source exists */
|
||||||
|
bool sysbus_has_irq(SysBusDevice *dev, int n)
|
||||||
|
{
|
||||||
|
char *prop = g_strdup_printf("%s[%d]", SYSBUS_DEVICE_GPIO_IRQ, n);
|
||||||
|
ObjectProperty *r;
|
||||||
|
|
||||||
|
r = object_property_find(OBJECT(dev), prop, NULL);
|
||||||
|
return (r != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sysbus_is_irq_connected(SysBusDevice *dev, int n)
|
||||||
|
{
|
||||||
|
return !!sysbus_get_connected_irq(dev, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
qemu_irq sysbus_get_connected_irq(SysBusDevice *dev, int n)
|
||||||
|
{
|
||||||
|
DeviceState *d = DEVICE(dev);
|
||||||
|
return qdev_get_gpio_out_connector(d, SYSBUS_DEVICE_GPIO_IRQ, n);
|
||||||
|
}
|
||||||
|
|
||||||
void sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq)
|
void sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq)
|
||||||
{
|
{
|
||||||
qdev_connect_gpio_out_named(DEVICE(dev), SYSBUS_DEVICE_GPIO_IRQ, n, irq);
|
qdev_connect_gpio_out_named(DEVICE(dev), SYSBUS_DEVICE_GPIO_IRQ, n, irq);
|
||||||
|
@ -272,6 +272,7 @@ qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n);
|
|||||||
void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin);
|
void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin);
|
||||||
void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
|
void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
|
||||||
qemu_irq pin);
|
qemu_irq pin);
|
||||||
|
qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n);
|
||||||
qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
|
qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
|
||||||
const char *name, int n);
|
const char *name, int n);
|
||||||
|
|
||||||
|
@ -66,7 +66,10 @@ void sysbus_pass_irq(SysBusDevice *dev, SysBusDevice *target);
|
|||||||
void sysbus_init_ioports(SysBusDevice *dev, pio_addr_t ioport, pio_addr_t size);
|
void sysbus_init_ioports(SysBusDevice *dev, pio_addr_t ioport, pio_addr_t size);
|
||||||
|
|
||||||
|
|
||||||
|
bool sysbus_has_irq(SysBusDevice *dev, int n);
|
||||||
void sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq);
|
void sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq);
|
||||||
|
bool sysbus_is_irq_connected(SysBusDevice *dev, int n);
|
||||||
|
qemu_irq sysbus_get_connected_irq(SysBusDevice *dev, int n);
|
||||||
void sysbus_mmio_map(SysBusDevice *dev, int n, hwaddr addr);
|
void sysbus_mmio_map(SysBusDevice *dev, int n, hwaddr addr);
|
||||||
void sysbus_mmio_map_overlap(SysBusDevice *dev, int n, hwaddr addr,
|
void sysbus_mmio_map_overlap(SysBusDevice *dev, int n, hwaddr addr,
|
||||||
int priority);
|
int priority);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user