1
2
3
4
5
6
7
8
9
10
11#ifndef DEP_REGISTER_H
12#define DEP_REGISTER_H
13
14#include "hw/qdev-core.h"
15#include "exec/memory.h"
16#include "hw/irq.h"
17
18#define ONES(num) ((num) == 64 ? ~0ull : (1ull << (num)) - 1)
19
20typedef struct DepRegisterInfo DepRegisterInfo;
21typedef struct DepRegisterAccessInfo DepRegisterAccessInfo;
22typedef struct DepRegisterDecodeInfo DepRegisterDecodeInfo;
23
24
25
26
27
28
29
30typedef struct DepRegisterAccessError {
31 uint64_t mask;
32 const char *reason;
33} DepRegisterAccessError;
34
35#define REG_GPIO_POL_HIGH 0
36#define REG_GPIO_POL_LOW 1
37typedef struct DepRegisterGPIOMapping {
38 const char *name;
39 uint8_t bit_pos;
40 bool input;
41 bool polarity;
42 uint8_t num;
43 uint8_t width;
44} DepRegisterGPIOMapping;
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73#define DEP_REG_DECODE_READ (1 << 0)
74#define DEP_REG_DECODE_WRITE (1 << 1)
75#define DEP_REG_DECODE_EXECUTE (1 << 2)
76#define REG_DECODE_RW (DEP_REG_DECODE_READ | DEP_REG_DECODE_WRITE)
77
78struct DepRegisterAccessInfo {
79 const char *name;
80 uint64_t ro;
81 uint64_t w1c;
82 uint64_t reset;
83 uint64_t cor;
84 uint64_t rsvd;
85
86 uint64_t inhibit_reset;
87
88 const DepRegisterAccessError *ge0;
89 const DepRegisterAccessError *ge1;
90 const DepRegisterAccessError *ui0;
91 const DepRegisterAccessError *ui1;
92
93 uint64_t (*pre_write)(DepRegisterInfo *reg, uint64_t val);
94 void (*post_write)(DepRegisterInfo *reg, uint64_t val);
95
96 uint64_t (*post_read)(DepRegisterInfo *reg, uint64_t val);
97
98 const DepRegisterGPIOMapping *gpios;
99
100 size_t storage;
101 int data_size;
102
103 struct {
104 hwaddr addr;
105 uint8_t flags;
106 } decode;
107
108 void *opaque;
109};
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129struct DepRegisterInfo {
130 DeviceState parent_obj;
131
132 void *data;
133 int data_size;
134
135 const DepRegisterAccessInfo *access;
136
137 bool debug;
138 const char *prefix;
139
140 void *opaque;
141
142 bool read_lite;
143 bool write_lite;
144
145 MemoryRegion mem;
146};
147
148#define TYPE_DEP_REGISTER "qemu,dep-register"
149#define DEP_REGISTER(obj) OBJECT_CHECK(DepRegisterInfo, (obj), TYPE_DEP_REGISTER)
150
151struct DepRegisterDecodeInfo {
152 DepRegisterInfo *reg;
153 hwaddr addr;
154 unsigned len;
155};
156
157
158
159
160
161
162
163
164void dep_register_write(DepRegisterInfo *reg, uint64_t val, uint64_t we);
165
166
167
168
169
170
171
172uint64_t dep_register_read(DepRegisterInfo *reg);
173
174
175
176
177
178
179void dep_register_reset(DepRegisterInfo *reg);
180
181
182
183
184
185
186void dep_register_init(DepRegisterInfo *reg);
187
188
189
190
191
192
193
194
195
196
197void dep_register_refresh_gpios(DepRegisterInfo *reg, uint64_t old_value);
198
199void dep_register_write_memory_be(void *opaque, hwaddr addr, uint64_t value,
200 unsigned size);
201void dep_register_write_memory_le(void *opaque, hwaddr addr, uint64_t value,
202 unsigned size);
203
204uint64_t dep_register_read_memory_be(void *opaque, hwaddr addr, unsigned size);
205uint64_t dep_register_read_memory_le(void *opaque, hwaddr addr, unsigned size);
206
207
208
209#define DEP_REG32(reg, addr) \
210enum { A_ ## reg = (addr) }; \
211enum { R_ ## reg = (addr) / 4 };
212
213
214
215#define DEP_FIELD(reg, field, length, shift) \
216enum { R_ ## reg ## _ ## field ## _SHIFT = (shift)}; \
217enum { R_ ## reg ## _ ## field ## _LENGTH = (length)}; \
218enum { R_ ## reg ## _ ## field ## _MASK = (((1ULL << (length)) - 1) \
219 << (shift)) };
220
221
222
223#define DEP_F_EX32(storage, reg, field) \
224 extract32((storage), R_ ## reg ## _ ## field ## _SHIFT, \
225 R_ ## reg ## _ ## field ## _LENGTH)
226
227
228
229#define DEP_AF_EX32(regs, reg, field) \
230 DEP_F_EX32((regs)[R_ ## reg], reg, field)
231
232
233
234#define DEP_F_DP32(storage, reg, field, val) ({ \
235 struct { \
236 unsigned int v:R_ ## reg ## _ ## field ## _LENGTH; \
237 } v = { .v = val }; \
238 uint32_t d; \
239 d = deposit32((storage), R_ ## reg ## _ ## field ## _SHIFT, \
240 R_ ## reg ## _ ## field ## _LENGTH, v.v); \
241 d; })
242
243
244
245#define DEP_AF_DP32(regs, reg, field, val) \
246 (regs)[R_ ## reg] = DEP_F_DP32((regs)[R_ ## reg], reg, field, val);
247#endif
248