| /* |
| * QEMU IndustryPack emulation |
| * |
| * Copyright (C) 2012 Igalia, S.L. |
| * Author: Alberto Garcia <agarcia@igalia.com> |
| * |
| * This code is licensed under the GNU GPL v2 or (at your option) any |
| * later version. |
| */ |
| |
| #ifndef QEMU_IPACK_H |
| #define QEMU_IPACK_H |
| |
| #include "qdev.h" |
| |
| typedef struct IPackBus IPackBus; |
| |
| #define TYPE_IPACK_BUS "IndustryPack" |
| #define IPACK_BUS(obj) OBJECT_CHECK(IPackBus, (obj), TYPE_IPACK_BUS) |
| |
| struct IPackBus { |
| BusState qbus; |
| /* All fields are private */ |
| uint8_t n_slots; |
| uint8_t free_slot; |
| qemu_irq_handler set_irq; |
| }; |
| |
| typedef struct IPackDevice IPackDevice; |
| typedef struct IPackDeviceClass IPackDeviceClass; |
| |
| #define TYPE_IPACK_DEVICE "ipack-device" |
| #define IPACK_DEVICE(obj) \ |
| OBJECT_CHECK(IPackDevice, (obj), TYPE_IPACK_DEVICE) |
| #define IPACK_DEVICE_CLASS(klass) \ |
| OBJECT_CLASS_CHECK(IPackDeviceClass, (klass), TYPE_IPACK_DEVICE) |
| #define IPACK_DEVICE_GET_CLASS(obj) \ |
| OBJECT_GET_CLASS(IPackDeviceClass, (obj), TYPE_IPACK_DEVICE) |
| |
| struct IPackDeviceClass { |
| DeviceClass parent_class; |
| |
| int (*init)(IPackDevice *dev); |
| int (*exit)(IPackDevice *dev); |
| |
| uint16_t (*io_read)(IPackDevice *dev, uint8_t addr); |
| void (*io_write)(IPackDevice *dev, uint8_t addr, uint16_t val); |
| |
| uint16_t (*id_read)(IPackDevice *dev, uint8_t addr); |
| void (*id_write)(IPackDevice *dev, uint8_t addr, uint16_t val); |
| |
| uint16_t (*int_read)(IPackDevice *dev, uint8_t addr); |
| void (*int_write)(IPackDevice *dev, uint8_t addr, uint16_t val); |
| |
| uint16_t (*mem_read16)(IPackDevice *dev, uint32_t addr); |
| void (*mem_write16)(IPackDevice *dev, uint32_t addr, uint16_t val); |
| |
| uint8_t (*mem_read8)(IPackDevice *dev, uint32_t addr); |
| void (*mem_write8)(IPackDevice *dev, uint32_t addr, uint8_t val); |
| }; |
| |
| struct IPackDevice { |
| DeviceState qdev; |
| int32_t slot; |
| /* IRQ objects for the IndustryPack INT0# and INT1# */ |
| qemu_irq *irq; |
| }; |
| |
| extern const VMStateDescription vmstate_ipack_device; |
| |
| #define VMSTATE_IPACK_DEVICE(_field, _state) \ |
| VMSTATE_STRUCT(_field, _state, 1, vmstate_ipack_device, IPackDevice) |
| |
| IPackDevice *ipack_device_find(IPackBus *bus, int32_t slot); |
| void ipack_bus_new_inplace(IPackBus *bus, DeviceState *parent, |
| const char *name, uint8_t n_slots, |
| qemu_irq_handler handler); |
| |
| #endif |