1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#include "qemu/osdep.h"
28#include "hw/sysbus.h"
29#include "hw/register.h"
30#include "qemu/bitops.h"
31#include "qemu/log.h"
32
33#ifndef XILINX_SYSMON_ERR_DEBUG
34#define XILINX_SYSMON_ERR_DEBUG 0
35#endif
36
37#define TYPE_XILINX_SYSMON "xlnx,zynqmp_sysmon"
38
39#define XILINX_SYSMON(obj) \
40 OBJECT_CHECK(SYSMON, (obj), TYPE_XILINX_SYSMON)
41
42REG32(TEMPERATURE, 0x0)
43 FIELD(TEMPERATURE, TEMPERATURE, 16, 0)
44REG32(SUPPLY1, 0x4)
45 FIELD(SUPPLY1, SUPPLY_VAL, 16, 0)
46REG32(SUPPLY2, 0x8)
47 FIELD(SUPPLY2, SUPPLY_VAL, 16, 0)
48REG32(SUPPLY3, 0x18)
49 FIELD(SUPPLY3, SUPPLY_VAL, 16, 0)
50REG32(SUPPLY4, 0x34)
51 FIELD(SUPPLY4, SUPPLY_VAL, 16, 0)
52REG32(SUPPLY5, 0x38)
53 FIELD(SUPPLY5, SUPPLY_VAL, 16, 0)
54REG32(SUPPLY6, 0x3c)
55 FIELD(SUPPLY6, SUPPLY_VAL, 16, 0)
56REG32(MAX_TEMPERATURE, 0x80)
57 FIELD(MAX_TEMPERATURE, TEMPERATURE, 16, 0)
58REG32(MAX_SUPPLY1, 0x84)
59 FIELD(MAX_SUPPLY1, SUPPLY_VAL, 16, 0)
60REG32(MAX_SUPPLY2, 0x88)
61 FIELD(MAX_SUPPLY2, SUPPLY_VAL, 16, 0)
62REG32(MAX_SUPPLY3, 0x8c)
63 FIELD(MAX_SUPPLY3, SUPPLY_VAL, 16, 0)
64REG32(MIN_TEMPERATURE, 0x90)
65 FIELD(MIN_TEMPERATURE, TEMPERATURE, 16, 0)
66REG32(MIN_SUPPLY1, 0x94)
67 FIELD(MIN_SUPPLY1, SUPPLY_VAL, 16, 0)
68REG32(MIN_SUPPLY2, 0x98)
69 FIELD(MIN_SUPPLY2, SUPPLY_VAL, 16, 0)
70REG32(MIN_SUPPLY3, 0x9c)
71 FIELD(MIN_SUPPLY3, SUPPLY_VAL, 16, 0)
72REG32(MAX_SUPPLY4, 0xa0)
73 FIELD(MAX_SUPPLY4, SUPPLY_VAL, 16, 0)
74REG32(MAX_SUPPLY5, 0xa4)
75 FIELD(MAX_SUPPLY5, SUPPLY_VAL, 16, 0)
76REG32(MAX_SUPPLY6, 0xa8)
77 FIELD(MAX_SUPPLY6, SUPPLY_VAL, 16, 0)
78REG32(MIN_SUPPLY4, 0xb0)
79 FIELD(MIN_SUPPLY4, SUPPLY_VAL, 16, 0)
80REG32(MIN_SUPPLY5, 0xb4)
81 FIELD(MIN_SUPPLY5, SUPPLY_VAL, 16, 0)
82REG32(MIN_SUPPLY6, 0xb8)
83 FIELD(MIN_SUPPLY6, SUPPLY_VAL, 16, 0)
84REG32(STATUS_FLAG, 0xfc)
85 FIELD(STATUS_FLAG, CLK_OSC_USED, 1, 15)
86 FIELD(STATUS_FLAG, BLOCK_IN_RESET, 1, 14)
87 FIELD(STATUS_FLAG, JTAG_DISABLED, 1, 11)
88 FIELD(STATUS_FLAG, JTAG_READ_ONLY, 1, 10)
89 FIELD(STATUS_FLAG, INTERNAL_REF, 1, 9)
90 FIELD(STATUS_FLAG, DISABLED, 1, 8)
91 FIELD(STATUS_FLAG, ALM_6_3, 4, 4)
92 FIELD(STATUS_FLAG, OT, 1, 3)
93 FIELD(STATUS_FLAG, ALM_2_0, 3, 0)
94REG32(CONFIG_REG0, 0x100)
95 FIELD(CONFIG_REG0, AVERAGING, 2, 12)
96 FIELD(CONFIG_REG0, EXTERNAL_MUX, 1, 11)
97 FIELD(CONFIG_REG0, BU, 1, 10)
98 FIELD(CONFIG_REG0, EC, 1, 9)
99 FIELD(CONFIG_REG0, ACQ, 1, 8)
100 FIELD(CONFIG_REG0, MUX_CHANNEL, 6, 0)
101REG32(CONFIG_REG1, 0x104)
102 FIELD(CONFIG_REG1, SEQUENCE_MODE, 4, 12)
103 FIELD(CONFIG_REG1, ALARM_DISABLE6TO3, 4, 8)
104 FIELD(CONFIG_REG1, ALARM_DISABLE2TO0, 3, 1)
105 FIELD(CONFIG_REG1, OVER_TEMP_DISABLE, 1, 0)
106REG32(CONFIG_REG2, 0x108)
107 FIELD(CONFIG_REG2, CLOCK_DIVIDER, 8, 8)
108 FIELD(CONFIG_REG2, POWER_DOWN, 4, 4)
109 FIELD(CONFIG_REG2, TEST_CHANNEL_EN, 1, 2)
110 FIELD(CONFIG_REG2, TEST_MODE, 2, 0)
111REG32(CONFIG_REG3, 0x10c)
112 FIELD(CONFIG_REG3, I2C_OVERRIDE_EN, 1, 15)
113 FIELD(CONFIG_REG3, I2C_OVERRIDE_ADDR, 7, 8)
114 FIELD(CONFIG_REG3, I2C_EN, 1, 7)
115 FIELD(CONFIG_REG3, ALARM_DISABLE13TO8, 6, 0)
116REG32(CONFIG_REG4, 0x110)
117 FIELD(CONFIG_REG4, LOW_RATE_EOS, 2, 10)
118 FIELD(CONFIG_REG4, SEQUENCE_RATE, 2, 8)
119 FIELD(CONFIG_REG4, VUSER_ENABLE_HRANGE, 4, 0)
120REG32(SEQ_CHANNEL2, 0x118)
121 FIELD(SEQ_CHANNEL2, TEMPERATURE_REMOTE, 1, 5)
122 FIELD(SEQ_CHANNEL2, VCCAMS, 1, 4)
123 FIELD(SEQ_CHANNEL2, SUPPLY10, 1, 3)
124 FIELD(SEQ_CHANNEL2, SUPPLY9, 1, 2)
125 FIELD(SEQ_CHANNEL2, SUPPLY8, 1, 1)
126 FIELD(SEQ_CHANNEL2, SUPPLY7, 1, 0)
127REG32(SEQ_AVERAGE2, 0x11c)
128 FIELD(SEQ_AVERAGE2, AVERAGE2, 16, 0)
129REG32(SEQ_CHANNEL0, 0x120)
130 FIELD(SEQ_CHANNEL0, CURRENT_MON, 1, 15)
131 FIELD(SEQ_CHANNEL0, SUPPLY3, 1, 14)
132 FIELD(SEQ_CHANNEL0, VREFN, 1, 13)
133 FIELD(SEQ_CHANNEL0, VREFP, 1, 12)
134 FIELD(SEQ_CHANNEL0, VP_VN, 1, 11)
135 FIELD(SEQ_CHANNEL0, SUPPLY2, 1, 10)
136 FIELD(SEQ_CHANNEL0, SUPPLY1, 1, 9)
137 FIELD(SEQ_CHANNEL0, TEMPERATURE, 1, 8)
138 FIELD(SEQ_CHANNEL0, SUPPLY6, 1, 7)
139 FIELD(SEQ_CHANNEL0, SUPPLY5, 1, 6)
140 FIELD(SEQ_CHANNEL0, SUPPLY4, 1, 5)
141 FIELD(SEQ_CHANNEL0, TEST_CHANNEL, 1, 3)
142 FIELD(SEQ_CHANNEL0, CALIBRATION, 1, 0)
143REG32(SEQ_CHANNEL1, 0x124)
144 FIELD(SEQ_CHANNEL1, VAUX0F, 1, 15)
145 FIELD(SEQ_CHANNEL1, VAUX0E, 1, 14)
146 FIELD(SEQ_CHANNEL1, VAUX0D, 1, 13)
147 FIELD(SEQ_CHANNEL1, VAUX0C, 1, 12)
148 FIELD(SEQ_CHANNEL1, VAUX0B, 1, 11)
149 FIELD(SEQ_CHANNEL1, VAUX0A, 1, 10)
150 FIELD(SEQ_CHANNEL1, VAUX09, 1, 9)
151 FIELD(SEQ_CHANNEL1, VAUX08, 1, 8)
152 FIELD(SEQ_CHANNEL1, VAUX07, 1, 7)
153 FIELD(SEQ_CHANNEL1, VAUX06, 1, 6)
154 FIELD(SEQ_CHANNEL1, VAUX05, 1, 5)
155 FIELD(SEQ_CHANNEL1, VAUX04, 1, 4)
156 FIELD(SEQ_CHANNEL1, VAUX03, 1, 3)
157 FIELD(SEQ_CHANNEL1, VAUX02, 1, 2)
158 FIELD(SEQ_CHANNEL1, VAUX01, 1, 1)
159 FIELD(SEQ_CHANNEL1, VAUX00, 1, 0)
160REG32(SEQ_AVERAGE0, 0x128)
161 FIELD(SEQ_AVERAGE0, AVERAGE0, 16, 0)
162REG32(SEQ_AVERAGE1, 0x12c)
163 FIELD(SEQ_AVERAGE1, AVERAGE1, 16, 0)
164REG32(SEQ_INPUT_MODE0, 0x130)
165 FIELD(SEQ_INPUT_MODE0, INPUT_MODE0, 16, 0)
166REG32(SEQ_INPUT_MODE1, 0x134)
167 FIELD(SEQ_INPUT_MODE1, INPUT_MODE1, 16, 0)
168REG32(SEQ_ACQ0, 0x138)
169 FIELD(SEQ_ACQ0, ACQ0, 16, 0)
170REG32(SEQ_ACQ1, 0x13c)
171 FIELD(SEQ_ACQ1, ACQ1, 16, 0)
172REG32(ALARM_TEMPERATURE_UPPER, 0x140)
173 FIELD(ALARM_TEMPERATURE_UPPER, TEMPERATURE_ALARM, 16, 0)
174REG32(ALARM_SUPPLY1_UPPER, 0x144)
175 FIELD(ALARM_SUPPLY1_UPPER, SUPPLY_ALARM, 16, 0)
176REG32(ALARM_SUPPLY2_UPPER, 0x148)
177 FIELD(ALARM_SUPPLY2_UPPER, SUPPLY_ALARM, 16, 0)
178REG32(ALARM_OT_UPPER, 0x14c)
179 FIELD(ALARM_OT_UPPER, TEMPERATURE_ALARM, 16, 0)
180REG32(ALARM_TEMPERATURE_LOWER, 0x150)
181 FIELD(ALARM_TEMPERATURE_LOWER, TEMPERATURE_ALARM, 15, 1)
182 FIELD(ALARM_TEMPERATURE_LOWER, THRESHOLD_MODE, 1, 0)
183REG32(ALARM_SUPPLY1_LOWER, 0x154)
184 FIELD(ALARM_SUPPLY1_LOWER, SUPPLY_ALARM, 16, 0)
185REG32(ALARM_SUPPLY2_LOWER, 0x158)
186 FIELD(ALARM_SUPPLY2_LOWER, SUPPLY_ALARM, 16, 0)
187REG32(ALARM_OT_LOWER, 0x15c)
188 FIELD(ALARM_OT_LOWER, TEMPERATURE_ALARM, 15, 1)
189 FIELD(ALARM_OT_LOWER, THRESHOLD_MODE, 1, 0)
190REG32(ALARM_SUPPLY3_UPPER, 0x160)
191 FIELD(ALARM_SUPPLY3_UPPER, SUPPLY_ALARM, 16, 0)
192REG32(ALARM_SUPPLY4_UPPER, 0x164)
193 FIELD(ALARM_SUPPLY4_UPPER, SUPPLY_ALARM, 16, 0)
194REG32(ALARM_SUPPLY5_UPPER, 0x168)
195 FIELD(ALARM_SUPPLY5_UPPER, SUPPLY_ALARM, 16, 0)
196REG32(ALARM_SUPPLY6_UPPER, 0x16c)
197 FIELD(ALARM_SUPPLY6_UPPER, SUPPLY_ALARM, 16, 0)
198REG32(ALARM_SUPPLY3_LOWER, 0x170)
199 FIELD(ALARM_SUPPLY3_LOWER, SUPPLY_ALARM, 16, 0)
200REG32(ALARM_SUPPLY4_LOWER, 0x174)
201 FIELD(ALARM_SUPPLY4_LOWER, SUPPLY_ALARM, 16, 0)
202REG32(ALARM_SUPPLY5_LOWER, 0x178)
203 FIELD(ALARM_SUPPLY5_LOWER, SUPPLY_ALARM, 16, 0)
204REG32(ALARM_SUPPLY6_LOWER, 0x17c)
205 FIELD(ALARM_SUPPLY6_LOWER, SUPPLY_ALARM, 16, 0)
206REG32(ALARM_SUPPLY7_UPPER, 0x180)
207 FIELD(ALARM_SUPPLY7_UPPER, SUPPLY_ALARM, 16, 0)
208REG32(ALARM_SUPPLY8_UPPER, 0x184)
209 FIELD(ALARM_SUPPLY8_UPPER, SUPPLY_ALARM, 16, 0)
210REG32(ALARM_SUPPLY9_UPPER, 0x188)
211 FIELD(ALARM_SUPPLY9_UPPER, SUPPLY_ALARM, 16, 0)
212REG32(ALARM_SUPPLY10_UPPER, 0x18c)
213 FIELD(ALARM_SUPPLY10_UPPER, SUPPLY_ALARM, 16, 0)
214REG32(ALARM_VCCAMS_UPPER, 0x190)
215 FIELD(ALARM_VCCAMS_UPPER, SUPPLY_ALARM, 16, 0)
216REG32(ALARM_TREMOTE_UPPER, 0x194)
217 FIELD(ALARM_TREMOTE_UPPER, TEMPERATURE_ALARM, 16, 0)
218REG32(ALARM_SUPPLY7_LOWER, 0x1a0)
219 FIELD(ALARM_SUPPLY7_LOWER, SUPPLY_ALARM, 16, 0)
220REG32(ALARM_SUPPLY8_LOWER, 0x1a4)
221 FIELD(ALARM_SUPPLY8_LOWER, SUPPLY_ALARM, 16, 0)
222REG32(ALARM_SUPPLY9_LOWER, 0x1a8)
223 FIELD(ALARM_SUPPLY9_LOWER, SUPPLY_ALARM, 16, 0)
224REG32(ALARM_SUPPLY10_LOWER, 0x1ac)
225 FIELD(ALARM_SUPPLY10_LOWER, SUPPLY_ALARM, 16, 0)
226REG32(ALARM_VCCAMS_LOWER, 0x1b0)
227 FIELD(ALARM_VCCAMS_LOWER, SUPPLY_ALARM, 16, 0)
228REG32(ALARM_TREMOTE_LOWER, 0x1b4)
229 FIELD(ALARM_TREMOTE_LOWER, TEMPERATURE_ALARM, 15, 1)
230 FIELD(ALARM_TREMOTE_LOWER, THRESHOLD_MODE, 1, 0)
231REG32(SEQ_INPUT_MODE2, 0x1e0)
232 FIELD(SEQ_INPUT_MODE2, INPUT_MODE2, 16, 0)
233REG32(SEQ_ACQ2, 0x1e4)
234 FIELD(SEQ_ACQ2, ACQ2, 16, 0)
235REG32(SUPPLY7, 0x200)
236 FIELD(SUPPLY7, SUPPLY_VAL, 16, 0)
237REG32(SUPPLY8, 0x204)
238 FIELD(SUPPLY8, SUPPLY_VAL, 16, 0)
239REG32(SUPPLY9, 0x208)
240 FIELD(SUPPLY9, SUPPLY_VAL, 16, 0)
241REG32(SUPPLY10, 0x20c)
242 FIELD(SUPPLY10, SUPPLY_VAL, 16, 0)
243REG32(VCCAMS, 0x210)
244 FIELD(VCCAMS, SUPPLY_VAL, 16, 0)
245REG32(TEMPERATURE_REMOTE, 0x214)
246 FIELD(TEMPERATURE_REMOTE, TEMPERATURE, 16, 0)
247REG32(MAX_SUPPLY7, 0x280)
248 FIELD(MAX_SUPPLY7, SUPPLY_VAL, 16, 0)
249REG32(MAX_SUPPLY8, 0x284)
250 FIELD(MAX_SUPPLY8, SUPPLY_VAL, 16, 0)
251REG32(MAX_SUPPLY9, 0x288)
252 FIELD(MAX_SUPPLY9, SUPPLY_VAL, 16, 0)
253REG32(MAX_SUPPLY10, 0x28c)
254 FIELD(MAX_SUPPLY10, SUPPLY_VAL, 16, 0)
255REG32(MAX_VCCAMS, 0x290)
256 FIELD(MAX_VCCAMS, SUPPLY_VAL, 16, 0)
257REG32(MAX_TEMPERATURE_REMOTE, 0x294)
258 FIELD(MAX_TEMPERATURE_REMOTE, TEMPERATURE, 16, 0)
259REG32(MIN_SUPPLY7, 0x2a0)
260 FIELD(MIN_SUPPLY7, SUPPLY_VAL, 16, 0)
261REG32(MIN_SUPPLY8, 0x2a4)
262 FIELD(MIN_SUPPLY8, SUPPLY_VAL, 16, 0)
263REG32(MIN_SUPPLY9, 0x2a8)
264 FIELD(MIN_SUPPLY9, SUPPLY_VAL, 16, 0)
265REG32(MIN_SUPPLY10, 0x2ac)
266 FIELD(MIN_SUPPLY10, SUPPLY_VAL, 16, 0)
267REG32(MIN_VCCAMS, 0x2b0)
268 FIELD(MIN_VCCAMS, SUPPLY_VAL, 16, 0)
269REG32(MIN_TEMPERATURE_REMOTE, 0x2b4)
270 FIELD(MIN_TEMPERATURE_REMOTE, TEMPERATURE, 16, 0)
271
272#define R_MAX (R_MIN_TEMPERATURE_REMOTE + 1)
273
274typedef struct SYSMON {
275 SysBusDevice parent_obj;
276 MemoryRegion iomem;
277
278 uint32_t regs[R_MAX];
279 RegisterInfo regs_info[R_MAX];
280} SYSMON;
281
282static RegisterAccessInfo sysmon_regs_info[] = {
283 { .name = "TEMPERATURE", .decode.addr = A_TEMPERATURE,
284 .ro = 0xffff,
285 },{ .name = "SUPPLY1", .decode.addr = A_SUPPLY1,
286 .ro = 0xffff,
287 },{ .name = "SUPPLY2", .decode.addr = A_SUPPLY2,
288 .ro = 0xffff,
289 },{ .name = "SUPPLY3", .decode.addr = A_SUPPLY3,
290 .ro = 0xffff,
291 },{ .name = "SUPPLY4", .decode.addr = A_SUPPLY4,
292 .ro = 0xffff,
293 },{ .name = "SUPPLY5", .decode.addr = A_SUPPLY5,
294 .ro = 0xffff,
295 },{ .name = "SUPPLY6", .decode.addr = A_SUPPLY6,
296 .ro = 0xffff,
297 },{ .name = "MAX_TEMPERATURE", .decode.addr = A_MAX_TEMPERATURE,
298 .ro = 0xffff,
299 },{ .name = "MAX_SUPPLY1", .decode.addr = A_MAX_SUPPLY1,
300 .ro = 0xffff,
301 },{ .name = "MAX_SUPPLY2", .decode.addr = A_MAX_SUPPLY2,
302 .ro = 0xffff,
303 },{ .name = "MAX_SUPPLY3", .decode.addr = A_MAX_SUPPLY3,
304 .ro = 0xffff,
305 },{ .name = "MIN_TEMPERATURE", .decode.addr = A_MIN_TEMPERATURE,
306 .reset = 0xffff,
307 .ro = 0xffff,
308 },{ .name = "MIN_SUPPLY1", .decode.addr = A_MIN_SUPPLY1,
309 .reset = 0xffff,
310 .ro = 0xffff,
311 },{ .name = "MIN_SUPPLY2", .decode.addr = A_MIN_SUPPLY2,
312 .reset = 0xffff,
313 .ro = 0xffff,
314 },{ .name = "MIN_SUPPLY3", .decode.addr = A_MIN_SUPPLY3,
315 .reset = 0xffff,
316 .ro = 0xffff,
317 },{ .name = "MAX_SUPPLY4", .decode.addr = A_MAX_SUPPLY4,
318 .ro = 0xffff,
319 },{ .name = "MAX_SUPPLY5", .decode.addr = A_MAX_SUPPLY5,
320 .ro = 0xffff,
321 },{ .name = "MAX_SUPPLY6", .decode.addr = A_MAX_SUPPLY6,
322 .ro = 0xffff,
323 },{ .name = "MIN_SUPPLY4", .decode.addr = A_MIN_SUPPLY4,
324 .reset = 0xffff,
325 .ro = 0xffff,
326 },{ .name = "MIN_SUPPLY5", .decode.addr = A_MIN_SUPPLY5,
327 .reset = 0xffff,
328 .ro = 0xffff,
329 },{ .name = "MIN_SUPPLY6", .decode.addr = A_MIN_SUPPLY6,
330 .reset = 0xffff,
331 .ro = 0xffff,
332 },{ .name = "STATUS_FLAG", .decode.addr = A_STATUS_FLAG,
333 .reset = 0xa00,
334 .rsvd = 0x3000,
335 .ro = 0xffff,
336 },{ .name = "CONFIG_REG0", .decode.addr = A_CONFIG_REG0,
337 .rsvd = 0xc0c0,
338 },{ .name = "CONFIG_REG1", .decode.addr = A_CONFIG_REG1,
339 .rsvd = 0xf0,
340 },{ .name = "CONFIG_REG2", .decode.addr = A_CONFIG_REG2,
341 .rsvd = 0x8,
342 },{ .name = "CONFIG_REG3", .decode.addr = A_CONFIG_REG3,
343 .rsvd = 0x40,
344 },{ .name = "CONFIG_REG4", .decode.addr = A_CONFIG_REG4,
345 .rsvd = 0xf0f0,
346 },{ .name = "SEQ_CHANNEL2", .decode.addr = A_SEQ_CHANNEL2,
347 .rsvd = 0xffc0,
348 },{ .name = "SEQ_AVERAGE2", .decode.addr = A_SEQ_AVERAGE2,
349 },{ .name = "SEQ_CHANNEL0", .decode.addr = A_SEQ_CHANNEL0,
350 .rsvd = 0x16,
351 },{ .name = "SEQ_CHANNEL1", .decode.addr = A_SEQ_CHANNEL1,
352 },{ .name = "SEQ_AVERAGE0", .decode.addr = A_SEQ_AVERAGE0,
353 },{ .name = "SEQ_AVERAGE1", .decode.addr = A_SEQ_AVERAGE1,
354 },{ .name = "SEQ_INPUT_MODE0", .decode.addr = A_SEQ_INPUT_MODE0,
355 },{ .name = "SEQ_INPUT_MODE1", .decode.addr = A_SEQ_INPUT_MODE1,
356 },{ .name = "SEQ_ACQ0", .decode.addr = A_SEQ_ACQ0,
357 },{ .name = "SEQ_ACQ1", .decode.addr = A_SEQ_ACQ1,
358 },{ .name = "ALARM_TEMPERATURE_UPPER",
359 .decode.addr = A_ALARM_TEMPERATURE_UPPER,
360 },{ .name = "ALARM_SUPPLY1_UPPER", .decode.addr = A_ALARM_SUPPLY1_UPPER,
361 },{ .name = "ALARM_SUPPLY2_UPPER", .decode.addr = A_ALARM_SUPPLY2_UPPER,
362 },{ .name = "ALARM_OT_UPPER", .decode.addr = A_ALARM_OT_UPPER,
363 },{ .name = "ALARM_TEMPERATURE_LOWER",
364 .decode.addr = A_ALARM_TEMPERATURE_LOWER,
365 },{ .name = "ALARM_SUPPLY1_LOWER", .decode.addr = A_ALARM_SUPPLY1_LOWER,
366 },{ .name = "ALARM_SUPPLY2_LOWER", .decode.addr = A_ALARM_SUPPLY2_LOWER,
367 },{ .name = "ALARM_OT_LOWER", .decode.addr = A_ALARM_OT_LOWER,
368 },{ .name = "ALARM_SUPPLY3_UPPER", .decode.addr = A_ALARM_SUPPLY3_UPPER,
369 },{ .name = "ALARM_SUPPLY4_UPPER", .decode.addr = A_ALARM_SUPPLY4_UPPER,
370 },{ .name = "ALARM_SUPPLY5_UPPER", .decode.addr = A_ALARM_SUPPLY5_UPPER,
371 },{ .name = "ALARM_SUPPLY6_UPPER", .decode.addr = A_ALARM_SUPPLY6_UPPER,
372 },{ .name = "ALARM_SUPPLY3_LOWER", .decode.addr = A_ALARM_SUPPLY3_LOWER,
373 },{ .name = "ALARM_SUPPLY4_LOWER", .decode.addr = A_ALARM_SUPPLY4_LOWER,
374 },{ .name = "ALARM_SUPPLY5_LOWER", .decode.addr = A_ALARM_SUPPLY5_LOWER,
375 },{ .name = "ALARM_SUPPLY6_LOWER", .decode.addr = A_ALARM_SUPPLY6_LOWER,
376 },{ .name = "ALARM_SUPPLY7_UPPER", .decode.addr = A_ALARM_SUPPLY7_UPPER,
377 },{ .name = "ALARM_SUPPLY8_UPPER", .decode.addr = A_ALARM_SUPPLY8_UPPER,
378 },{ .name = "ALARM_SUPPLY9_UPPER", .decode.addr = A_ALARM_SUPPLY9_UPPER,
379 },{ .name = "ALARM_SUPPLY10_UPPER", .decode.addr = A_ALARM_SUPPLY10_UPPER,
380 },{ .name = "ALARM_VCCAMS_UPPER", .decode.addr = A_ALARM_VCCAMS_UPPER,
381 },{ .name = "ALARM_TREMOTE_UPPER", .decode.addr = A_ALARM_TREMOTE_UPPER,
382 },{ .name = "ALARM_SUPPLY7_LOWER", .decode.addr = A_ALARM_SUPPLY7_LOWER,
383 },{ .name = "ALARM_SUPPLY8_LOWER", .decode.addr = A_ALARM_SUPPLY8_LOWER,
384 },{ .name = "ALARM_SUPPLY9_LOWER", .decode.addr = A_ALARM_SUPPLY9_LOWER,
385 },{ .name = "ALARM_SUPPLY10_LOWER", .decode.addr = A_ALARM_SUPPLY10_LOWER,
386 },{ .name = "ALARM_VCCAMS_LOWER", .decode.addr = A_ALARM_VCCAMS_LOWER,
387 },{ .name = "ALARM_TREMOTE_LOWER", .decode.addr = A_ALARM_TREMOTE_LOWER,
388 },{ .name = "SEQ_INPUT_MODE2", .decode.addr = A_SEQ_INPUT_MODE2,
389 },{ .name = "SEQ_ACQ2", .decode.addr = A_SEQ_ACQ2,
390 },{ .name = "SUPPLY7", .decode.addr = A_SUPPLY7,
391 .ro = 0xffff,
392 },{ .name = "SUPPLY8", .decode.addr = A_SUPPLY8,
393 .ro = 0xffff,
394 },{ .name = "SUPPLY9", .decode.addr = A_SUPPLY9,
395 .ro = 0xffff,
396 },{ .name = "SUPPLY10", .decode.addr = A_SUPPLY10,
397 .ro = 0xffff,
398 },{ .name = "VCCAMS", .decode.addr = A_VCCAMS,
399 .ro = 0xffff,
400 },{ .name = "TEMPERATURE_REMOTE", .decode.addr = A_TEMPERATURE_REMOTE,
401 .ro = 0xffff,
402 },{ .name = "MAX_SUPPLY7", .decode.addr = A_MAX_SUPPLY7,
403 .ro = 0xffff,
404 },{ .name = "MAX_SUPPLY8", .decode.addr = A_MAX_SUPPLY8,
405 .ro = 0xffff,
406 },{ .name = "MAX_SUPPLY9", .decode.addr = A_MAX_SUPPLY9,
407 .ro = 0xffff,
408 },{ .name = "MAX_SUPPLY10", .decode.addr = A_MAX_SUPPLY10,
409 .ro = 0xffff,
410 },{ .name = "MAX_VCCAMS", .decode.addr = A_MAX_VCCAMS,
411 .ro = 0xffff,
412 },{ .name = "MAX_TEMPERATURE_REMOTE",
413 .decode.addr = A_MAX_TEMPERATURE_REMOTE,
414 .ro = 0xffff,
415 },{ .name = "MIN_SUPPLY7", .decode.addr = A_MIN_SUPPLY7,
416 .reset = 0xffff,
417 .ro = 0xffff,
418 },{ .name = "MIN_SUPPLY8", .decode.addr = A_MIN_SUPPLY8,
419 .reset = 0xffff,
420 .ro = 0xffff,
421 },{ .name = "MIN_SUPPLY9", .decode.addr = A_MIN_SUPPLY9,
422 .reset = 0xffff,
423 .ro = 0xffff,
424 },{ .name = "MIN_SUPPLY10", .decode.addr = A_MIN_SUPPLY10,
425 .reset = 0xffff,
426 .ro = 0xffff,
427 },{ .name = "MIN_VCCAMS", .decode.addr = A_MIN_VCCAMS,
428 .reset = 0xffff,
429 .ro = 0xffff,
430 },{ .name = "MIN_TEMPERATURE_REMOTE",
431 .decode.addr = A_MIN_TEMPERATURE_REMOTE,
432 .reset = 0xffff,
433 .ro = 0xffff,
434 }
435};
436
437static void sysmon_reset(DeviceState *dev)
438{
439 SYSMON *s = XILINX_SYSMON(dev);
440 unsigned int i;
441
442 for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
443 register_reset(&s->regs_info[i]);
444 }
445
446}
447
448static uint64_t sysmon_read(void *opaque, hwaddr addr, unsigned size)
449{
450 SYSMON *s = XILINX_SYSMON(opaque);
451 RegisterInfo *r = &s->regs_info[addr / 4];
452
453 if (!r->data) {
454 qemu_log("%s: Decode error: read from %" HWADDR_PRIx "\n",
455 object_get_canonical_path(OBJECT(s)),
456 addr);
457 return 0;
458 }
459 return register_read(r);
460}
461
462static void sysmon_write(void *opaque, hwaddr addr, uint64_t value,
463 unsigned size)
464{
465 SYSMON *s = XILINX_SYSMON(opaque);
466 RegisterInfo *r = &s->regs_info[addr / 4];
467
468 if (!r->data) {
469 qemu_log("%s: Decode error: write to %" HWADDR_PRIx "=%" PRIx64 "\n",
470 object_get_canonical_path(OBJECT(s)),
471 addr, value);
472 return;
473 }
474 register_write(r, value, ~0);
475}
476
477static const MemoryRegionOps sysmon_ops = {
478 .read = sysmon_read,
479 .write = sysmon_write,
480 .endianness = DEVICE_LITTLE_ENDIAN,
481 .valid = {
482 .min_access_size = 4,
483 .max_access_size = 4,
484 },
485};
486
487static void sysmon_realize(DeviceState *dev, Error **errp)
488{
489 SYSMON *s = XILINX_SYSMON(dev);
490 const char *prefix = object_get_canonical_path(OBJECT(dev));
491 unsigned int i;
492
493 for (i = 0; i < ARRAY_SIZE(sysmon_regs_info); ++i) {
494 RegisterInfo *r;
495
496 r = &s->regs_info[sysmon_regs_info[i].decode.addr / 4];
497 *r = (RegisterInfo) {
498 .data = (uint8_t *)&s->regs[
499 sysmon_regs_info[i].decode.addr / 4],
500 .data_size = sizeof(uint32_t),
501 .access = &sysmon_regs_info[i],
502 .debug = XILINX_SYSMON_ERR_DEBUG,
503 .prefix = prefix,
504 .opaque = s,
505 };
506 }
507}
508
509static void sysmon_init(Object *obj)
510{
511 SYSMON *s = XILINX_SYSMON(obj);
512 SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
513
514 memory_region_init_io(&s->iomem, obj, &sysmon_ops, s,
515 TYPE_XILINX_SYSMON, R_MAX * 4);
516 sysbus_init_mmio(sbd, &s->iomem);
517}
518
519static const VMStateDescription vmstate_sysmon = {
520 .name = TYPE_XILINX_SYSMON,
521 .version_id = 1,
522 .minimum_version_id = 1,
523 .minimum_version_id_old = 1,
524 .fields = (VMStateField[]) {
525 VMSTATE_UINT32_ARRAY(regs, SYSMON, R_MAX),
526 VMSTATE_END_OF_LIST(),
527 }
528};
529
530static void sysmon_class_init(ObjectClass *klass, void *data)
531{
532 DeviceClass *dc = DEVICE_CLASS(klass);
533
534 dc->reset = sysmon_reset;
535 dc->realize = sysmon_realize;
536 dc->vmsd = &vmstate_sysmon;
537}
538
539static const TypeInfo sysmon_info = {
540 .name = TYPE_XILINX_SYSMON,
541 .parent = TYPE_SYS_BUS_DEVICE,
542 .instance_size = sizeof(SYSMON),
543 .class_init = sysmon_class_init,
544 .instance_init = sysmon_init,
545};
546
547static void sysmon_register_types(void)
548{
549 type_register_static(&sysmon_info);
550}
551
552type_init(sysmon_register_types)
553