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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140#ifndef PPC_XIVE_H
141#define PPC_XIVE_H
142
143#include "hw/qdev-core.h"
144#include "hw/sysbus.h"
145#include "hw/ppc/xive_regs.h"
146
147
148
149
150
151typedef struct XiveNotifier {
152 Object parent;
153} XiveNotifier;
154
155#define TYPE_XIVE_NOTIFIER "xive-notifier"
156#define XIVE_NOTIFIER(obj) \
157 OBJECT_CHECK(XiveNotifier, (obj), TYPE_XIVE_NOTIFIER)
158#define XIVE_NOTIFIER_CLASS(klass) \
159 OBJECT_CLASS_CHECK(XiveNotifierClass, (klass), TYPE_XIVE_NOTIFIER)
160#define XIVE_NOTIFIER_GET_CLASS(obj) \
161 OBJECT_GET_CLASS(XiveNotifierClass, (obj), TYPE_XIVE_NOTIFIER)
162
163typedef struct XiveNotifierClass {
164 InterfaceClass parent;
165 void (*notify)(XiveNotifier *xn, uint32_t lisn);
166} XiveNotifierClass;
167
168
169
170
171
172#define TYPE_XIVE_SOURCE "xive-source"
173#define XIVE_SOURCE(obj) OBJECT_CHECK(XiveSource, (obj), TYPE_XIVE_SOURCE)
174
175
176
177
178
179#define XIVE_SRC_H_INT_ESB 0x1
180#define XIVE_SRC_STORE_EOI 0x2
181
182typedef struct XiveSource {
183 DeviceState parent;
184
185
186 uint32_t nr_irqs;
187 unsigned long *lsi_map;
188
189
190 uint8_t *status;
191
192
193 uint64_t esb_flags;
194 uint32_t esb_shift;
195 MemoryRegion esb_mmio;
196
197 XiveNotifier *xive;
198} XiveSource;
199
200
201
202
203
204
205#define XIVE_ESB_4K 12
206#define XIVE_ESB_4K_2PAGE 13
207#define XIVE_ESB_64K 16
208#define XIVE_ESB_64K_2PAGE 17
209
210static inline bool xive_source_esb_has_2page(XiveSource *xsrc)
211{
212 return xsrc->esb_shift == XIVE_ESB_64K_2PAGE ||
213 xsrc->esb_shift == XIVE_ESB_4K_2PAGE;
214}
215
216
217static inline hwaddr xive_source_esb_page(XiveSource *xsrc, uint32_t srcno)
218{
219 assert(srcno < xsrc->nr_irqs);
220 return (1ull << xsrc->esb_shift) * srcno;
221}
222
223
224static inline hwaddr xive_source_esb_mgmt(XiveSource *xsrc, int srcno)
225{
226 hwaddr addr = xive_source_esb_page(xsrc, srcno);
227
228 if (xive_source_esb_has_2page(xsrc)) {
229 addr += (1 << (xsrc->esb_shift - 1));
230 }
231
232 return addr;
233}
234
235
236
237
238
239
240
241
242
243
244
245
246
247#define XIVE_STATUS_ASSERTED 0x4
248#define XIVE_ESB_VAL_P 0x2
249#define XIVE_ESB_VAL_Q 0x1
250
251#define XIVE_ESB_RESET 0x0
252#define XIVE_ESB_PENDING XIVE_ESB_VAL_P
253#define XIVE_ESB_QUEUED (XIVE_ESB_VAL_P | XIVE_ESB_VAL_Q)
254#define XIVE_ESB_OFF XIVE_ESB_VAL_Q
255
256
257
258
259
260
261
262
263
264
265
266#define XIVE_ESB_STORE_EOI 0x400
267#define XIVE_ESB_LOAD_EOI 0x000
268#define XIVE_ESB_GET 0x800
269#define XIVE_ESB_SET_PQ_00 0xc00
270#define XIVE_ESB_SET_PQ_01 0xd00
271#define XIVE_ESB_SET_PQ_10 0xe00
272#define XIVE_ESB_SET_PQ_11 0xf00
273
274uint8_t xive_source_esb_get(XiveSource *xsrc, uint32_t srcno);
275uint8_t xive_source_esb_set(XiveSource *xsrc, uint32_t srcno, uint8_t pq);
276
277void xive_source_pic_print_info(XiveSource *xsrc, uint32_t offset,
278 Monitor *mon);
279
280static inline bool xive_source_irq_is_lsi(XiveSource *xsrc, uint32_t srcno)
281{
282 assert(srcno < xsrc->nr_irqs);
283 return test_bit(srcno, xsrc->lsi_map);
284}
285
286static inline void xive_source_irq_set_lsi(XiveSource *xsrc, uint32_t srcno)
287{
288 assert(srcno < xsrc->nr_irqs);
289 bitmap_set(xsrc->lsi_map, srcno, 1);
290}
291
292void xive_source_set_irq(void *opaque, int srcno, int val);
293
294
295
296
297
298#define TYPE_XIVE_TCTX "xive-tctx"
299#define XIVE_TCTX(obj) OBJECT_CHECK(XiveTCTX, (obj), TYPE_XIVE_TCTX)
300
301
302
303
304
305
306
307
308
309#define XIVE_TM_RING_COUNT 4
310#define XIVE_TM_RING_SIZE 0x10
311
312typedef struct XiveTCTX {
313 DeviceState parent_obj;
314
315 CPUState *cs;
316 qemu_irq output;
317
318 uint8_t regs[XIVE_TM_RING_COUNT * XIVE_TM_RING_SIZE];
319} XiveTCTX;
320
321
322
323
324
325typedef struct XiveRouter {
326 SysBusDevice parent;
327} XiveRouter;
328
329#define TYPE_XIVE_ROUTER "xive-router"
330#define XIVE_ROUTER(obj) \
331 OBJECT_CHECK(XiveRouter, (obj), TYPE_XIVE_ROUTER)
332#define XIVE_ROUTER_CLASS(klass) \
333 OBJECT_CLASS_CHECK(XiveRouterClass, (klass), TYPE_XIVE_ROUTER)
334#define XIVE_ROUTER_GET_CLASS(obj) \
335 OBJECT_GET_CLASS(XiveRouterClass, (obj), TYPE_XIVE_ROUTER)
336
337typedef struct XiveRouterClass {
338 SysBusDeviceClass parent;
339
340
341 int (*get_eas)(XiveRouter *xrtr, uint8_t eas_blk, uint32_t eas_idx,
342 XiveEAS *eas);
343 int (*get_end)(XiveRouter *xrtr, uint8_t end_blk, uint32_t end_idx,
344 XiveEND *end);
345 int (*write_end)(XiveRouter *xrtr, uint8_t end_blk, uint32_t end_idx,
346 XiveEND *end, uint8_t word_number);
347 int (*get_nvt)(XiveRouter *xrtr, uint8_t nvt_blk, uint32_t nvt_idx,
348 XiveNVT *nvt);
349 int (*write_nvt)(XiveRouter *xrtr, uint8_t nvt_blk, uint32_t nvt_idx,
350 XiveNVT *nvt, uint8_t word_number);
351 XiveTCTX *(*get_tctx)(XiveRouter *xrtr, CPUState *cs);
352} XiveRouterClass;
353
354void xive_eas_pic_print_info(XiveEAS *eas, uint32_t lisn, Monitor *mon);
355
356int xive_router_get_eas(XiveRouter *xrtr, uint8_t eas_blk, uint32_t eas_idx,
357 XiveEAS *eas);
358int xive_router_get_end(XiveRouter *xrtr, uint8_t end_blk, uint32_t end_idx,
359 XiveEND *end);
360int xive_router_write_end(XiveRouter *xrtr, uint8_t end_blk, uint32_t end_idx,
361 XiveEND *end, uint8_t word_number);
362int xive_router_get_nvt(XiveRouter *xrtr, uint8_t nvt_blk, uint32_t nvt_idx,
363 XiveNVT *nvt);
364int xive_router_write_nvt(XiveRouter *xrtr, uint8_t nvt_blk, uint32_t nvt_idx,
365 XiveNVT *nvt, uint8_t word_number);
366XiveTCTX *xive_router_get_tctx(XiveRouter *xrtr, CPUState *cs);
367void xive_router_notify(XiveNotifier *xn, uint32_t lisn);
368
369
370
371
372
373#define TYPE_XIVE_END_SOURCE "xive-end-source"
374#define XIVE_END_SOURCE(obj) \
375 OBJECT_CHECK(XiveENDSource, (obj), TYPE_XIVE_END_SOURCE)
376
377typedef struct XiveENDSource {
378 DeviceState parent;
379
380 uint32_t nr_ends;
381 uint8_t block_id;
382
383
384 uint32_t esb_shift;
385 MemoryRegion esb_mmio;
386
387 XiveRouter *xrtr;
388} XiveENDSource;
389
390
391
392
393
394
395#define XIVE_PRIORITY_MAX 7
396
397void xive_end_pic_print_info(XiveEND *end, uint32_t end_idx, Monitor *mon);
398void xive_end_queue_pic_print_info(XiveEND *end, uint32_t width, Monitor *mon);
399
400
401
402
403
404
405
406
407
408#define XIVE_TM_HW_PAGE 0x0
409#define XIVE_TM_HV_PAGE 0x1
410#define XIVE_TM_OS_PAGE 0x2
411#define XIVE_TM_USER_PAGE 0x3
412
413extern const MemoryRegionOps xive_tm_ops;
414void xive_tctx_tm_write(XiveTCTX *tctx, hwaddr offset, uint64_t value,
415 unsigned size);
416uint64_t xive_tctx_tm_read(XiveTCTX *tctx, hwaddr offset, unsigned size);
417
418void xive_tctx_pic_print_info(XiveTCTX *tctx, Monitor *mon);
419Object *xive_tctx_create(Object *cpu, XiveRouter *xrtr, Error **errp);
420
421static inline uint32_t xive_nvt_cam_line(uint8_t nvt_blk, uint32_t nvt_idx)
422{
423 return (nvt_blk << 19) | nvt_idx;
424}
425
426#endif
427