1 | /* |
2 | * QEMU IndustryPack emulation |
3 | * |
4 | * Copyright (C) 2012 Igalia, S.L. |
5 | * Author: Alberto Garcia <berto@igalia.com> |
6 | * |
7 | * This code is licensed under the GNU GPL v2 or (at your option) any |
8 | * later version. |
9 | */ |
10 | |
11 | #ifndef QEMU_IPACK_H |
12 | #define QEMU_IPACK_H |
13 | |
14 | #include "hw/qdev-core.h" |
15 | |
16 | typedef struct IPackBus IPackBus; |
17 | |
18 | #define TYPE_IPACK_BUS "IndustryPack" |
19 | #define IPACK_BUS(obj) OBJECT_CHECK(IPackBus, (obj), TYPE_IPACK_BUS) |
20 | |
21 | struct IPackBus { |
22 | /*< private >*/ |
23 | BusState parent_obj; |
24 | |
25 | /* All fields are private */ |
26 | uint8_t n_slots; |
27 | uint8_t free_slot; |
28 | qemu_irq_handler set_irq; |
29 | }; |
30 | |
31 | typedef struct IPackDevice IPackDevice; |
32 | typedef struct IPackDeviceClass IPackDeviceClass; |
33 | |
34 | #define TYPE_IPACK_DEVICE "ipack-device" |
35 | #define IPACK_DEVICE(obj) \ |
36 | OBJECT_CHECK(IPackDevice, (obj), TYPE_IPACK_DEVICE) |
37 | #define IPACK_DEVICE_CLASS(klass) \ |
38 | OBJECT_CLASS_CHECK(IPackDeviceClass, (klass), TYPE_IPACK_DEVICE) |
39 | #define IPACK_DEVICE_GET_CLASS(obj) \ |
40 | OBJECT_GET_CLASS(IPackDeviceClass, (obj), TYPE_IPACK_DEVICE) |
41 | |
42 | struct IPackDeviceClass { |
43 | /*< private >*/ |
44 | DeviceClass parent_class; |
45 | /*< public >*/ |
46 | |
47 | DeviceRealize realize; |
48 | DeviceUnrealize unrealize; |
49 | |
50 | uint16_t (*io_read)(IPackDevice *dev, uint8_t addr); |
51 | void (*io_write)(IPackDevice *dev, uint8_t addr, uint16_t val); |
52 | |
53 | uint16_t (*id_read)(IPackDevice *dev, uint8_t addr); |
54 | void (*id_write)(IPackDevice *dev, uint8_t addr, uint16_t val); |
55 | |
56 | uint16_t (*int_read)(IPackDevice *dev, uint8_t addr); |
57 | void (*int_write)(IPackDevice *dev, uint8_t addr, uint16_t val); |
58 | |
59 | uint16_t (*mem_read16)(IPackDevice *dev, uint32_t addr); |
60 | void (*mem_write16)(IPackDevice *dev, uint32_t addr, uint16_t val); |
61 | |
62 | uint8_t (*mem_read8)(IPackDevice *dev, uint32_t addr); |
63 | void (*mem_write8)(IPackDevice *dev, uint32_t addr, uint8_t val); |
64 | }; |
65 | |
66 | struct IPackDevice { |
67 | /*< private >*/ |
68 | DeviceState parent_obj; |
69 | /*< public >*/ |
70 | |
71 | int32_t slot; |
72 | /* IRQ objects for the IndustryPack INT0# and INT1# */ |
73 | qemu_irq *irq; |
74 | }; |
75 | |
76 | extern const VMStateDescription vmstate_ipack_device; |
77 | |
78 | #define VMSTATE_IPACK_DEVICE(_field, _state) \ |
79 | VMSTATE_STRUCT(_field, _state, 1, vmstate_ipack_device, IPackDevice) |
80 | |
81 | IPackDevice *ipack_device_find(IPackBus *bus, int32_t slot); |
82 | void ipack_bus_new_inplace(IPackBus *bus, size_t bus_size, |
83 | DeviceState *parent, |
84 | const char *name, uint8_t n_slots, |
85 | qemu_irq_handler handler); |
86 | |
87 | #endif |
88 | |