xref: /qemu/include/hw/ipack/ipack.h (revision db1015e92e04835c9eb50c29625fe566d1202dbd)
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 #include "qom/object.h"
16 
17 typedef struct IPackBus IPackBus;
18 
19 #define TYPE_IPACK_BUS "IndustryPack"
20 #define IPACK_BUS(obj) OBJECT_CHECK(IPackBus, (obj), TYPE_IPACK_BUS)
21 
22 struct IPackBus {
23     /*< private >*/
24     BusState parent_obj;
25 
26     /* All fields are private */
27     uint8_t n_slots;
28     uint8_t free_slot;
29     qemu_irq_handler set_irq;
30 };
31 
32 typedef struct IPackDevice IPackDevice;
33 typedef struct IPackDeviceClass IPackDeviceClass;
34 
35 #define TYPE_IPACK_DEVICE "ipack-device"
36 #define IPACK_DEVICE(obj) \
37      OBJECT_CHECK(IPackDevice, (obj), TYPE_IPACK_DEVICE)
38 #define IPACK_DEVICE_CLASS(klass)                                        \
39      OBJECT_CLASS_CHECK(IPackDeviceClass, (klass), TYPE_IPACK_DEVICE)
40 #define IPACK_DEVICE_GET_CLASS(obj) \
41      OBJECT_GET_CLASS(IPackDeviceClass, (obj), TYPE_IPACK_DEVICE)
42 
43 struct IPackDeviceClass {
44     /*< private >*/
45     DeviceClass parent_class;
46     /*< public >*/
47 
48     DeviceRealize realize;
49     DeviceUnrealize unrealize;
50 
51     uint16_t (*io_read)(IPackDevice *dev, uint8_t addr);
52     void (*io_write)(IPackDevice *dev, uint8_t addr, uint16_t val);
53 
54     uint16_t (*id_read)(IPackDevice *dev, uint8_t addr);
55     void (*id_write)(IPackDevice *dev, uint8_t addr, uint16_t val);
56 
57     uint16_t (*int_read)(IPackDevice *dev, uint8_t addr);
58     void (*int_write)(IPackDevice *dev, uint8_t addr, uint16_t val);
59 
60     uint16_t (*mem_read16)(IPackDevice *dev, uint32_t addr);
61     void (*mem_write16)(IPackDevice *dev, uint32_t addr, uint16_t val);
62 
63     uint8_t (*mem_read8)(IPackDevice *dev, uint32_t addr);
64     void (*mem_write8)(IPackDevice *dev, uint32_t addr, uint8_t val);
65 };
66 
67 struct IPackDevice {
68     /*< private >*/
69     DeviceState parent_obj;
70     /*< public >*/
71 
72     int32_t slot;
73     /* IRQ objects for the IndustryPack INT0# and INT1# */
74     qemu_irq *irq;
75 };
76 
77 extern const VMStateDescription vmstate_ipack_device;
78 
79 #define VMSTATE_IPACK_DEVICE(_field, _state)                            \
80     VMSTATE_STRUCT(_field, _state, 1, vmstate_ipack_device, IPackDevice)
81 
82 IPackDevice *ipack_device_find(IPackBus *bus, int32_t slot);
83 void ipack_bus_new_inplace(IPackBus *bus, size_t bus_size,
84                            DeviceState *parent,
85                            const char *name, uint8_t n_slots,
86                            qemu_irq_handler handler);
87 
88 #endif
89