mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 19:49:43 +00:00
sysbus: Use TYPE_DEVICE GPIO functionality
Re-implement the Sysbus GPIOs to use the existing TYPE_DEVICE GPIO named framework. A constant string name is chosen to avoid conflicts with existing unnamed GPIOs. This unifies GPIOs are IRQs for sysbus devices and allows removal of all Sysbus state for GPIOs. Any existing and future-added functionality for GPIOs is now also available for sysbus IRQs. Reviewed-by: Alexander Graf <agraf@suse.de> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
17a96a146c
commit
b591721909
@ -41,11 +41,7 @@ static const TypeInfo system_bus_info = {
|
|||||||
|
|
||||||
void sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq)
|
void sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq)
|
||||||
{
|
{
|
||||||
assert(n >= 0 && n < dev->num_irq);
|
qdev_connect_gpio_out_named(DEVICE(dev), SYSBUS_DEVICE_GPIO_IRQ, n, irq);
|
||||||
dev->irqs[n] = NULL;
|
|
||||||
if (dev->irqp[n]) {
|
|
||||||
*dev->irqp[n] = irq;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sysbus_mmio_map_common(SysBusDevice *dev, int n, hwaddr addr,
|
static void sysbus_mmio_map_common(SysBusDevice *dev, int n, hwaddr addr,
|
||||||
@ -89,22 +85,13 @@ void sysbus_mmio_map_overlap(SysBusDevice *dev, int n, hwaddr addr,
|
|||||||
/* Request an IRQ source. The actual IRQ object may be populated later. */
|
/* Request an IRQ source. The actual IRQ object may be populated later. */
|
||||||
void sysbus_init_irq(SysBusDevice *dev, qemu_irq *p)
|
void sysbus_init_irq(SysBusDevice *dev, qemu_irq *p)
|
||||||
{
|
{
|
||||||
int n;
|
qdev_init_gpio_out_named(DEVICE(dev), p, SYSBUS_DEVICE_GPIO_IRQ, 1);
|
||||||
|
|
||||||
assert(dev->num_irq < QDEV_MAX_IRQ);
|
|
||||||
n = dev->num_irq++;
|
|
||||||
dev->irqp[n] = p;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pass IRQs from a target device. */
|
/* Pass IRQs from a target device. */
|
||||||
void sysbus_pass_irq(SysBusDevice *dev, SysBusDevice *target)
|
void sysbus_pass_irq(SysBusDevice *dev, SysBusDevice *target)
|
||||||
{
|
{
|
||||||
int i;
|
qdev_pass_gpios(DEVICE(target), DEVICE(dev), SYSBUS_DEVICE_GPIO_IRQ);
|
||||||
assert(dev->num_irq == 0);
|
|
||||||
dev->num_irq = target->num_irq;
|
|
||||||
for (i = 0; i < dev->num_irq; i++) {
|
|
||||||
dev->irqp[i] = target->irqp[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sysbus_init_mmio(SysBusDevice *dev, MemoryRegion *memory)
|
void sysbus_init_mmio(SysBusDevice *dev, MemoryRegion *memory)
|
||||||
@ -210,7 +197,6 @@ static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent)
|
|||||||
hwaddr size;
|
hwaddr size;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
monitor_printf(mon, "%*sirq %d\n", indent, "", s->num_irq);
|
|
||||||
for (i = 0; i < s->num_mmio; i++) {
|
for (i = 0; i < s->num_mmio; i++) {
|
||||||
size = memory_region_size(s->mmio[i].memory);
|
size = memory_region_size(s->mmio[i].memory);
|
||||||
monitor_printf(mon, "%*smmio " TARGET_FMT_plx "/" TARGET_FMT_plx "\n",
|
monitor_printf(mon, "%*smmio " TARGET_FMT_plx "/" TARGET_FMT_plx "\n",
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
#define QDEV_MAX_MMIO 32
|
#define QDEV_MAX_MMIO 32
|
||||||
#define QDEV_MAX_PIO 32
|
#define QDEV_MAX_PIO 32
|
||||||
#define QDEV_MAX_IRQ 512
|
|
||||||
|
|
||||||
#define TYPE_SYSTEM_BUS "System"
|
#define TYPE_SYSTEM_BUS "System"
|
||||||
#define SYSTEM_BUS(obj) OBJECT_CHECK(IDEBus, (obj), TYPE_IDE_BUS)
|
#define SYSTEM_BUS(obj) OBJECT_CHECK(IDEBus, (obj), TYPE_IDE_BUS)
|
||||||
@ -33,6 +32,9 @@ typedef struct SysBusDevice SysBusDevice;
|
|||||||
* SysBusDeviceClass is not overriding #DeviceClass.realize, so derived
|
* SysBusDeviceClass is not overriding #DeviceClass.realize, so derived
|
||||||
* classes overriding it are not required to invoke its implementation.
|
* classes overriding it are not required to invoke its implementation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define SYSBUS_DEVICE_GPIO_IRQ "sysbus-irq"
|
||||||
|
|
||||||
typedef struct SysBusDeviceClass {
|
typedef struct SysBusDeviceClass {
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
DeviceClass parent_class;
|
DeviceClass parent_class;
|
||||||
@ -46,9 +48,6 @@ struct SysBusDevice {
|
|||||||
DeviceState parent_obj;
|
DeviceState parent_obj;
|
||||||
/*< public >*/
|
/*< public >*/
|
||||||
|
|
||||||
int num_irq;
|
|
||||||
qemu_irq irqs[QDEV_MAX_IRQ];
|
|
||||||
qemu_irq *irqp[QDEV_MAX_IRQ];
|
|
||||||
int num_mmio;
|
int num_mmio;
|
||||||
struct {
|
struct {
|
||||||
hwaddr addr;
|
hwaddr addr;
|
||||||
|
Loading…
Reference in New Issue
Block a user