1
2
3
4
5
6
7
8
9
10#include "qemu/osdep.h"
11#include "qemu/log.h"
12#include "qemu/module.h"
13#include "qapi/error.h"
14#include "target/ppc/cpu.h"
15#include "sysemu/cpus.h"
16#include "sysemu/dma.h"
17#include "sysemu/reset.h"
18#include "monitor/monitor.h"
19#include "hw/ppc/fdt.h"
20#include "hw/ppc/pnv.h"
21#include "hw/ppc/pnv_core.h"
22#include "hw/ppc/pnv_xscom.h"
23#include "hw/ppc/pnv_xive.h"
24#include "hw/ppc/xive_regs.h"
25#include "hw/qdev-properties.h"
26#include "hw/ppc/ppc.h"
27#include "trace.h"
28
29#include <libfdt.h>
30
31#include "pnv_xive_regs.h"
32
33#undef XIVE_DEBUG
34
35
36
37
38#define SBE_PER_BYTE 4
39
40typedef struct XiveVstInfo {
41 const char *name;
42 uint32_t size;
43 uint32_t max_blocks;
44} XiveVstInfo;
45
46static const XiveVstInfo vst_infos[] = {
47 [VST_TSEL_IVT] = { "EAT", sizeof(XiveEAS), 16 },
48 [VST_TSEL_SBE] = { "SBE", 1, 16 },
49 [VST_TSEL_EQDT] = { "ENDT", sizeof(XiveEND), 16 },
50 [VST_TSEL_VPDT] = { "VPDT", sizeof(XiveNVT), 32 },
51
52
53
54
55
56
57
58
59
60
61
62 [VST_TSEL_IRQ] = { "IRQ", 1, 6 },
63};
64
65#define xive_error(xive, fmt, ...) \
66 qemu_log_mask(LOG_GUEST_ERROR, "XIVE[%x] - " fmt "\n", \
67 (xive)->chip->chip_id, ## __VA_ARGS__);
68
69
70
71
72
73
74
75
76
77
78static inline uint64_t GETFIELD(uint64_t mask, uint64_t word)
79{
80 return (word & mask) >> ctz64(mask);
81}
82
83static inline uint64_t SETFIELD(uint64_t mask, uint64_t word,
84 uint64_t value)
85{
86 return (word & ~mask) | ((value << ctz64(mask)) & mask);
87}
88
89
90
91
92
93
94static uint8_t pnv_xive_block_id(PnvXive *xive)
95{
96 uint8_t blk = xive->chip->chip_id;
97 uint64_t cfg_val = xive->regs[PC_TCTXT_CFG >> 3];
98
99 if (cfg_val & PC_TCTXT_CHIPID_OVERRIDE) {
100 blk = GETFIELD(PC_TCTXT_CHIPID, cfg_val);
101 }
102
103 return blk;
104}
105
106
107
108
109
110
111
112static PnvXive *pnv_xive_get_remote(uint8_t blk)
113{
114 PnvMachineState *pnv = PNV_MACHINE(qdev_get_machine());
115 int i;
116
117 for (i = 0; i < pnv->num_chips; i++) {
118 Pnv9Chip *chip9 = PNV9_CHIP(pnv->chips[i]);
119 PnvXive *xive = &chip9->xive;
120
121 if (pnv_xive_block_id(xive) == blk) {
122 return xive;
123 }
124 }
125 return NULL;
126}
127
128
129
130
131
132
133
134
135#define XIVE_VSD_SIZE 8
136
137
138static uint64_t pnv_xive_vst_page_size_allowed(uint32_t page_shift)
139{
140 return page_shift == 12 || page_shift == 16 ||
141 page_shift == 21 || page_shift == 24;
142}
143
144static uint64_t pnv_xive_vst_addr_direct(PnvXive *xive, uint32_t type,
145 uint64_t vsd, uint32_t idx)
146{
147 const XiveVstInfo *info = &vst_infos[type];
148 uint64_t vst_addr = vsd & VSD_ADDRESS_MASK;
149 uint64_t vst_tsize = 1ull << (GETFIELD(VSD_TSIZE, vsd) + 12);
150 uint32_t idx_max;
151
152 idx_max = vst_tsize / info->size - 1;
153 if (idx > idx_max) {
154#ifdef XIVE_DEBUG
155 xive_error(xive, "VST: %s entry %x out of range [ 0 .. %x ] !?",
156 info->name, idx, idx_max);
157#endif
158 return 0;
159 }
160
161 return vst_addr + idx * info->size;
162}
163
164static uint64_t pnv_xive_vst_addr_indirect(PnvXive *xive, uint32_t type,
165 uint64_t vsd, uint32_t idx)
166{
167 const XiveVstInfo *info = &vst_infos[type];
168 uint64_t vsd_addr;
169 uint32_t vsd_idx;
170 uint32_t page_shift;
171 uint32_t vst_per_page;
172
173
174 vsd_addr = vsd & VSD_ADDRESS_MASK;
175 vsd = ldq_be_dma(&address_space_memory, vsd_addr);
176
177 if (!(vsd & VSD_ADDRESS_MASK)) {
178#ifdef XIVE_DEBUG
179 xive_error(xive, "VST: invalid %s entry %x !?", info->name, idx);
180#endif
181 return 0;
182 }
183
184 page_shift = GETFIELD(VSD_TSIZE, vsd) + 12;
185
186 if (!pnv_xive_vst_page_size_allowed(page_shift)) {
187 xive_error(xive, "VST: invalid %s page shift %d", info->name,
188 page_shift);
189 return 0;
190 }
191
192 vst_per_page = (1ull << page_shift) / info->size;
193 vsd_idx = idx / vst_per_page;
194
195
196 if (vsd_idx) {
197 vsd_addr = vsd_addr + vsd_idx * XIVE_VSD_SIZE;
198 vsd = ldq_be_dma(&address_space_memory, vsd_addr);
199
200 if (!(vsd & VSD_ADDRESS_MASK)) {
201#ifdef XIVE_DEBUG
202 xive_error(xive, "VST: invalid %s entry %x !?", info->name, idx);
203#endif
204 return 0;
205 }
206
207
208
209
210
211 if (page_shift != GETFIELD(VSD_TSIZE, vsd) + 12) {
212 xive_error(xive, "VST: %s entry %x indirect page size differ !?",
213 info->name, idx);
214 return 0;
215 }
216 }
217
218 return pnv_xive_vst_addr_direct(xive, type, vsd, (idx % vst_per_page));
219}
220
221static uint64_t pnv_xive_vst_addr(PnvXive *xive, uint32_t type, uint8_t blk,
222 uint32_t idx)
223{
224 const XiveVstInfo *info = &vst_infos[type];
225 uint64_t vsd;
226
227 if (blk >= info->max_blocks) {
228 xive_error(xive, "VST: invalid block id %d for VST %s %d !?",
229 blk, info->name, idx);
230 return 0;
231 }
232
233 vsd = xive->vsds[type][blk];
234
235
236 if (GETFIELD(VSD_MODE, vsd) == VSD_MODE_FORWARD) {
237 xive = pnv_xive_get_remote(blk);
238
239 return xive ? pnv_xive_vst_addr(xive, type, blk, idx) : 0;
240 }
241
242 if (VSD_INDIRECT & vsd) {
243 return pnv_xive_vst_addr_indirect(xive, type, vsd, idx);
244 }
245
246 return pnv_xive_vst_addr_direct(xive, type, vsd, idx);
247}
248
249static int pnv_xive_vst_read(PnvXive *xive, uint32_t type, uint8_t blk,
250 uint32_t idx, void *data)
251{
252 const XiveVstInfo *info = &vst_infos[type];
253 uint64_t addr = pnv_xive_vst_addr(xive, type, blk, idx);
254
255 if (!addr) {
256 return -1;
257 }
258
259 cpu_physical_memory_read(addr, data, info->size);
260 return 0;
261}
262
263#define XIVE_VST_WORD_ALL -1
264
265static int pnv_xive_vst_write(PnvXive *xive, uint32_t type, uint8_t blk,
266 uint32_t idx, void *data, uint32_t word_number)
267{
268 const XiveVstInfo *info = &vst_infos[type];
269 uint64_t addr = pnv_xive_vst_addr(xive, type, blk, idx);
270
271 if (!addr) {
272 return -1;
273 }
274
275 if (word_number == XIVE_VST_WORD_ALL) {
276 cpu_physical_memory_write(addr, data, info->size);
277 } else {
278 cpu_physical_memory_write(addr + word_number * 4,
279 data + word_number * 4, 4);
280 }
281 return 0;
282}
283
284static int pnv_xive_get_end(XiveRouter *xrtr, uint8_t blk, uint32_t idx,
285 XiveEND *end)
286{
287 return pnv_xive_vst_read(PNV_XIVE(xrtr), VST_TSEL_EQDT, blk, idx, end);
288}
289
290static int pnv_xive_write_end(XiveRouter *xrtr, uint8_t blk, uint32_t idx,
291 XiveEND *end, uint8_t word_number)
292{
293 return pnv_xive_vst_write(PNV_XIVE(xrtr), VST_TSEL_EQDT, blk, idx, end,
294 word_number);
295}
296
297static int pnv_xive_end_update(PnvXive *xive)
298{
299 uint8_t blk = GETFIELD(VC_EQC_CWATCH_BLOCKID,
300 xive->regs[(VC_EQC_CWATCH_SPEC >> 3)]);
301 uint32_t idx = GETFIELD(VC_EQC_CWATCH_OFFSET,
302 xive->regs[(VC_EQC_CWATCH_SPEC >> 3)]);
303 int i;
304 uint64_t eqc_watch[4];
305
306 for (i = 0; i < ARRAY_SIZE(eqc_watch); i++) {
307 eqc_watch[i] = cpu_to_be64(xive->regs[(VC_EQC_CWATCH_DAT0 >> 3) + i]);
308 }
309
310 return pnv_xive_vst_write(xive, VST_TSEL_EQDT, blk, idx, eqc_watch,
311 XIVE_VST_WORD_ALL);
312}
313
314static void pnv_xive_end_cache_load(PnvXive *xive)
315{
316 uint8_t blk = GETFIELD(VC_EQC_CWATCH_BLOCKID,
317 xive->regs[(VC_EQC_CWATCH_SPEC >> 3)]);
318 uint32_t idx = GETFIELD(VC_EQC_CWATCH_OFFSET,
319 xive->regs[(VC_EQC_CWATCH_SPEC >> 3)]);
320 uint64_t eqc_watch[4] = { 0 };
321 int i;
322
323 if (pnv_xive_vst_read(xive, VST_TSEL_EQDT, blk, idx, eqc_watch)) {
324 xive_error(xive, "VST: no END entry %x/%x !?", blk, idx);
325 }
326
327 for (i = 0; i < ARRAY_SIZE(eqc_watch); i++) {
328 xive->regs[(VC_EQC_CWATCH_DAT0 >> 3) + i] = be64_to_cpu(eqc_watch[i]);
329 }
330}
331
332static int pnv_xive_get_nvt(XiveRouter *xrtr, uint8_t blk, uint32_t idx,
333 XiveNVT *nvt)
334{
335 return pnv_xive_vst_read(PNV_XIVE(xrtr), VST_TSEL_VPDT, blk, idx, nvt);
336}
337
338static int pnv_xive_write_nvt(XiveRouter *xrtr, uint8_t blk, uint32_t idx,
339 XiveNVT *nvt, uint8_t word_number)
340{
341 return pnv_xive_vst_write(PNV_XIVE(xrtr), VST_TSEL_VPDT, blk, idx, nvt,
342 word_number);
343}
344
345static int pnv_xive_nvt_update(PnvXive *xive)
346{
347 uint8_t blk = GETFIELD(PC_VPC_CWATCH_BLOCKID,
348 xive->regs[(PC_VPC_CWATCH_SPEC >> 3)]);
349 uint32_t idx = GETFIELD(PC_VPC_CWATCH_OFFSET,
350 xive->regs[(PC_VPC_CWATCH_SPEC >> 3)]);
351 int i;
352 uint64_t vpc_watch[8];
353
354 for (i = 0; i < ARRAY_SIZE(vpc_watch); i++) {
355 vpc_watch[i] = cpu_to_be64(xive->regs[(PC_VPC_CWATCH_DAT0 >> 3) + i]);
356 }
357
358 return pnv_xive_vst_write(xive, VST_TSEL_VPDT, blk, idx, vpc_watch,
359 XIVE_VST_WORD_ALL);
360}
361
362static void pnv_xive_nvt_cache_load(PnvXive *xive)
363{
364 uint8_t blk = GETFIELD(PC_VPC_CWATCH_BLOCKID,
365 xive->regs[(PC_VPC_CWATCH_SPEC >> 3)]);
366 uint32_t idx = GETFIELD(PC_VPC_CWATCH_OFFSET,
367 xive->regs[(PC_VPC_CWATCH_SPEC >> 3)]);
368 uint64_t vpc_watch[8] = { 0 };
369 int i;
370
371 if (pnv_xive_vst_read(xive, VST_TSEL_VPDT, blk, idx, vpc_watch)) {
372 xive_error(xive, "VST: no NVT entry %x/%x !?", blk, idx);
373 }
374
375 for (i = 0; i < ARRAY_SIZE(vpc_watch); i++) {
376 xive->regs[(PC_VPC_CWATCH_DAT0 >> 3) + i] = be64_to_cpu(vpc_watch[i]);
377 }
378}
379
380static int pnv_xive_get_eas(XiveRouter *xrtr, uint8_t blk, uint32_t idx,
381 XiveEAS *eas)
382{
383 PnvXive *xive = PNV_XIVE(xrtr);
384
385
386
387
388 if (pnv_xive_block_id(xive) != blk) {
389 xive_error(xive, "VST: EAS %x is remote !?", XIVE_EAS(blk, idx));
390 return -1;
391 }
392
393 return pnv_xive_vst_read(xive, VST_TSEL_IVT, blk, idx, eas);
394}
395
396
397
398
399
400
401static bool pnv_xive_is_cpu_enabled(PnvXive *xive, PowerPCCPU *cpu)
402{
403 int pir = ppc_cpu_pir(cpu);
404 uint32_t fc = PNV9_PIR2FUSEDCORE(pir);
405 uint64_t reg = fc < 8 ? PC_THREAD_EN_REG0 : PC_THREAD_EN_REG1;
406 uint32_t bit = pir & 0x3f;
407
408 return xive->regs[reg >> 3] & PPC_BIT(bit);
409}
410
411static int pnv_xive_match_nvt(XivePresenter *xptr, uint8_t format,
412 uint8_t nvt_blk, uint32_t nvt_idx,
413 bool cam_ignore, uint8_t priority,
414 uint32_t logic_serv, XiveTCTXMatch *match)
415{
416 PnvXive *xive = PNV_XIVE(xptr);
417 PnvChip *chip = xive->chip;
418 int count = 0;
419 int i, j;
420
421 for (i = 0; i < chip->nr_cores; i++) {
422 PnvCore *pc = chip->cores[i];
423 CPUCore *cc = CPU_CORE(pc);
424
425 for (j = 0; j < cc->nr_threads; j++) {
426 PowerPCCPU *cpu = pc->threads[j];
427 XiveTCTX *tctx;
428 int ring;
429
430 if (!pnv_xive_is_cpu_enabled(xive, cpu)) {
431 continue;
432 }
433
434 tctx = XIVE_TCTX(pnv_cpu_state(cpu)->intc);
435
436
437
438
439 ring = xive_presenter_tctx_match(xptr, tctx, format, nvt_blk,
440 nvt_idx, cam_ignore, logic_serv);
441
442
443
444
445 if (ring != -1) {
446 if (match->tctx) {
447 qemu_log_mask(LOG_GUEST_ERROR, "XIVE: already found a "
448 "thread context NVT %x/%x\n",
449 nvt_blk, nvt_idx);
450 return -1;
451 }
452
453 match->ring = ring;
454 match->tctx = tctx;
455 count++;
456 }
457 }
458 }
459
460 return count;
461}
462
463static uint8_t pnv_xive_get_block_id(XiveRouter *xrtr)
464{
465 return pnv_xive_block_id(PNV_XIVE(xrtr));
466}
467
468
469
470
471
472
473static PnvXive *pnv_xive_tm_get_xive(PowerPCCPU *cpu)
474{
475 int pir = ppc_cpu_pir(cpu);
476 XivePresenter *xptr = XIVE_TCTX(pnv_cpu_state(cpu)->intc)->xptr;
477 PnvXive *xive = PNV_XIVE(xptr);
478
479 if (!pnv_xive_is_cpu_enabled(xive, cpu)) {
480 xive_error(xive, "IC: CPU %x is not enabled", pir);
481 }
482 return xive;
483}
484
485
486
487
488
489
490
491
492static void pnv_xive_notify(XiveNotifier *xn, uint32_t srcno)
493{
494 PnvXive *xive = PNV_XIVE(xn);
495 uint8_t blk = pnv_xive_block_id(xive);
496
497 xive_router_notify(xn, XIVE_EAS(blk, srcno));
498}
499
500
501
502
503
504static uint64_t pnv_xive_vc_size(PnvXive *xive)
505{
506 return (~xive->regs[CQ_VC_BARM >> 3] + 1) & CQ_VC_BARM_MASK;
507}
508
509static uint64_t pnv_xive_edt_shift(PnvXive *xive)
510{
511 return ctz64(pnv_xive_vc_size(xive) / XIVE_TABLE_EDT_MAX);
512}
513
514static uint64_t pnv_xive_pc_size(PnvXive *xive)
515{
516 return (~xive->regs[CQ_PC_BARM >> 3] + 1) & CQ_PC_BARM_MASK;
517}
518
519static uint32_t pnv_xive_nr_ipis(PnvXive *xive, uint8_t blk)
520{
521 uint64_t vsd = xive->vsds[VST_TSEL_SBE][blk];
522 uint64_t vst_tsize = 1ull << (GETFIELD(VSD_TSIZE, vsd) + 12);
523
524 return VSD_INDIRECT & vsd ? 0 : vst_tsize * SBE_PER_BYTE;
525}
526
527
528
529
530static uint64_t pnv_xive_vst_per_subpage(PnvXive *xive, uint32_t type)
531{
532 uint8_t blk = pnv_xive_block_id(xive);
533 uint64_t vsd = xive->vsds[type][blk];
534 const XiveVstInfo *info = &vst_infos[type];
535 uint64_t vsd_addr;
536 uint32_t page_shift;
537
538
539 if (!(VSD_INDIRECT & vsd)) {
540 return 1;
541 }
542
543
544 vsd_addr = vsd & VSD_ADDRESS_MASK;
545 vsd = ldq_be_dma(&address_space_memory, vsd_addr);
546
547 if (!(vsd & VSD_ADDRESS_MASK)) {
548#ifdef XIVE_DEBUG
549 xive_error(xive, "VST: invalid %s entry %x !?", info->name, idx);
550#endif
551 return 0;
552 }
553
554 page_shift = GETFIELD(VSD_TSIZE, vsd) + 12;
555
556 if (!pnv_xive_vst_page_size_allowed(page_shift)) {
557 xive_error(xive, "VST: invalid %s page shift %d", info->name,
558 page_shift);
559 return 0;
560 }
561
562 return (1ull << page_shift) / info->size;
563}
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579static uint64_t pnv_xive_edt_size(PnvXive *xive, uint64_t type)
580{
581 uint64_t edt_size = 1ull << pnv_xive_edt_shift(xive);
582 uint64_t size = 0;
583 int i;
584
585 for (i = 0; i < XIVE_TABLE_EDT_MAX; i++) {
586 uint64_t edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[i]);
587
588 if (edt_type == type) {
589 size += edt_size;
590 }
591 }
592
593 return size;
594}
595
596
597
598
599
600static uint64_t pnv_xive_edt_offset(PnvXive *xive, uint64_t vc_offset,
601 uint64_t type)
602{
603 int i;
604 uint64_t edt_size = 1ull << pnv_xive_edt_shift(xive);
605 uint64_t edt_offset = vc_offset;
606
607 for (i = 0; i < XIVE_TABLE_EDT_MAX && (i * edt_size) < vc_offset; i++) {
608 uint64_t edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[i]);
609
610 if (edt_type != type) {
611 edt_offset -= edt_size;
612 }
613 }
614
615 return edt_offset;
616}
617
618static void pnv_xive_edt_resize(PnvXive *xive)
619{
620 uint64_t ipi_edt_size = pnv_xive_edt_size(xive, CQ_TDR_EDT_IPI);
621 uint64_t end_edt_size = pnv_xive_edt_size(xive, CQ_TDR_EDT_EQ);
622
623 memory_region_set_size(&xive->ipi_edt_mmio, ipi_edt_size);
624 memory_region_add_subregion(&xive->ipi_mmio, 0, &xive->ipi_edt_mmio);
625
626 memory_region_set_size(&xive->end_edt_mmio, end_edt_size);
627 memory_region_add_subregion(&xive->end_mmio, 0, &xive->end_edt_mmio);
628}
629
630
631
632
633static int pnv_xive_table_set_data(PnvXive *xive, uint64_t val)
634{
635 uint64_t tsel = xive->regs[CQ_TAR >> 3] & CQ_TAR_TSEL;
636 uint8_t tsel_index = GETFIELD(CQ_TAR_TSEL_INDEX, xive->regs[CQ_TAR >> 3]);
637 uint64_t *xive_table;
638 uint8_t max_index;
639
640 switch (tsel) {
641 case CQ_TAR_TSEL_BLK:
642 max_index = ARRAY_SIZE(xive->blk);
643 xive_table = xive->blk;
644 break;
645 case CQ_TAR_TSEL_MIG:
646 max_index = ARRAY_SIZE(xive->mig);
647 xive_table = xive->mig;
648 break;
649 case CQ_TAR_TSEL_EDT:
650 max_index = ARRAY_SIZE(xive->edt);
651 xive_table = xive->edt;
652 break;
653 case CQ_TAR_TSEL_VDT:
654 max_index = ARRAY_SIZE(xive->vdt);
655 xive_table = xive->vdt;
656 break;
657 default:
658 xive_error(xive, "IC: invalid table %d", (int) tsel);
659 return -1;
660 }
661
662 if (tsel_index >= max_index) {
663 xive_error(xive, "IC: invalid index %d", (int) tsel_index);
664 return -1;
665 }
666
667 xive_table[tsel_index] = val;
668
669 if (xive->regs[CQ_TAR >> 3] & CQ_TAR_TBL_AUTOINC) {
670 xive->regs[CQ_TAR >> 3] =
671 SETFIELD(CQ_TAR_TSEL_INDEX, xive->regs[CQ_TAR >> 3], ++tsel_index);
672 }
673
674
675
676
677
678 if (tsel == CQ_TAR_TSEL_EDT && tsel_index == ARRAY_SIZE(xive->edt)) {
679 pnv_xive_edt_resize(xive);
680 }
681
682 return 0;
683}
684
685
686
687
688static void pnv_xive_vst_set_exclusive(PnvXive *xive, uint8_t type,
689 uint8_t blk, uint64_t vsd)
690{
691 XiveENDSource *end_xsrc = &xive->end_source;
692 XiveSource *xsrc = &xive->ipi_source;
693 const XiveVstInfo *info = &vst_infos[type];
694 uint32_t page_shift = GETFIELD(VSD_TSIZE, vsd) + 12;
695 uint64_t vst_tsize = 1ull << page_shift;
696 uint64_t vst_addr = vsd & VSD_ADDRESS_MASK;
697
698
699
700 if (VSD_INDIRECT & vsd) {
701 if (!(xive->regs[VC_GLOBAL_CONFIG >> 3] & VC_GCONF_INDIRECT)) {
702 xive_error(xive, "VST: %s indirect tables are not enabled",
703 info->name);
704 return;
705 }
706
707 if (!pnv_xive_vst_page_size_allowed(page_shift)) {
708 xive_error(xive, "VST: invalid %s page shift %d", info->name,
709 page_shift);
710 return;
711 }
712 }
713
714 if (!QEMU_IS_ALIGNED(vst_addr, 1ull << page_shift)) {
715 xive_error(xive, "VST: %s table address 0x%"PRIx64" is not aligned with"
716 " page shift %d", info->name, vst_addr, page_shift);
717 return;
718 }
719
720
721 xive->vsds[type][blk] = vsd;
722
723
724
725 switch (type) {
726 case VST_TSEL_IVT:
727 break;
728
729 case VST_TSEL_EQDT:
730
731
732
733
734
735
736
737 if (!(VSD_INDIRECT & vsd)) {
738 memory_region_set_size(&end_xsrc->esb_mmio, (vst_tsize / info->size)
739 * (1ull << xsrc->esb_shift));
740 }
741 memory_region_add_subregion(&xive->end_edt_mmio, 0,
742 &end_xsrc->esb_mmio);
743 break;
744
745 case VST_TSEL_SBE:
746
747
748
749
750
751
752
753
754
755 if (!(VSD_INDIRECT & vsd)) {
756 memory_region_set_size(&xsrc->esb_mmio, vst_tsize * SBE_PER_BYTE
757 * (1ull << xsrc->esb_shift));
758 }
759 memory_region_add_subregion(&xive->ipi_edt_mmio, 0, &xsrc->esb_mmio);
760 break;
761
762 case VST_TSEL_VPDT:
763 case VST_TSEL_IRQ:
764
765
766
767
768 break;
769
770 default:
771 g_assert_not_reached();
772 }
773}
774
775
776
777
778
779static void pnv_xive_vst_set_data(PnvXive *xive, uint64_t vsd, bool pc_engine)
780{
781 uint8_t mode = GETFIELD(VSD_MODE, vsd);
782 uint8_t type = GETFIELD(VST_TABLE_SELECT,
783 xive->regs[VC_VSD_TABLE_ADDR >> 3]);
784 uint8_t blk = GETFIELD(VST_TABLE_BLOCK,
785 xive->regs[VC_VSD_TABLE_ADDR >> 3]);
786 uint64_t vst_addr = vsd & VSD_ADDRESS_MASK;
787
788 if (type > VST_TSEL_IRQ) {
789 xive_error(xive, "VST: invalid table type %d", type);
790 return;
791 }
792
793 if (blk >= vst_infos[type].max_blocks) {
794 xive_error(xive, "VST: invalid block id %d for"
795 " %s table", blk, vst_infos[type].name);
796 return;
797 }
798
799
800
801
802
803 if (pc_engine) {
804 return;
805 }
806
807 if (!vst_addr) {
808 xive_error(xive, "VST: invalid %s table address", vst_infos[type].name);
809 return;
810 }
811
812 switch (mode) {
813 case VSD_MODE_FORWARD:
814 xive->vsds[type][blk] = vsd;
815 break;
816
817 case VSD_MODE_EXCLUSIVE:
818 pnv_xive_vst_set_exclusive(xive, type, blk, vsd);
819 break;
820
821 default:
822 xive_error(xive, "VST: unsupported table mode %d", mode);
823 return;
824 }
825}
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849static void pnv_xive_ic_reg_write(void *opaque, hwaddr offset,
850 uint64_t val, unsigned size)
851{
852 PnvXive *xive = PNV_XIVE(opaque);
853 MemoryRegion *sysmem = get_system_memory();
854 uint32_t reg = offset >> 3;
855 bool is_chip0 = xive->chip->chip_id == 0;
856
857 switch (offset) {
858
859
860
861
862 case CQ_MSGSND:
863 case CQ_FIRMASK_OR:
864 break;
865 case CQ_PBI_CTL:
866 if (val & CQ_PBI_PC_64K) {
867 xive->pc_shift = 16;
868 }
869 if (val & CQ_PBI_VC_64K) {
870 xive->vc_shift = 16;
871 }
872 break;
873 case CQ_CFG_PB_GEN:
874
875
876
877 break;
878
879
880
881
882 case VC_GLOBAL_CONFIG:
883 break;
884
885
886
887
888 case PC_GLOBAL_CONFIG:
889
890
891
892
893 break;
894 case PC_TCTXT_CFG:
895
896
897
898 break;
899 case PC_TCTXT_TRACK:
900
901
902
903
904
905 break;
906
907
908
909
910 case VC_SBC_CONFIG:
911
912
913
914
915 if (val & (VC_SBC_CONF_CPLX_CIST | VC_SBC_CONF_CIST_BOTH)) {
916 xive->ipi_source.esb_flags |= XIVE_SRC_STORE_EOI;
917 }
918 break;
919
920 case VC_EQC_CONFIG:
921 case VC_AIB_TX_ORDER_TAG2:
922 break;
923
924
925
926
927 case CQ_RST_CTL:
928
929 break;
930
931 case CQ_IC_BAR:
932 xive->ic_shift = val & CQ_IC_BAR_64K ? 16 : 12;
933 if (!(val & CQ_IC_BAR_VALID)) {
934 xive->ic_base = 0;
935 if (xive->regs[reg] & CQ_IC_BAR_VALID) {
936 memory_region_del_subregion(&xive->ic_mmio,
937 &xive->ic_reg_mmio);
938 memory_region_del_subregion(&xive->ic_mmio,
939 &xive->ic_notify_mmio);
940 memory_region_del_subregion(&xive->ic_mmio,
941 &xive->ic_lsi_mmio);
942 memory_region_del_subregion(&xive->ic_mmio,
943 &xive->tm_indirect_mmio);
944
945 memory_region_del_subregion(sysmem, &xive->ic_mmio);
946 }
947 } else {
948 xive->ic_base = val & ~(CQ_IC_BAR_VALID | CQ_IC_BAR_64K);
949 if (!(xive->regs[reg] & CQ_IC_BAR_VALID)) {
950 memory_region_add_subregion(sysmem, xive->ic_base,
951 &xive->ic_mmio);
952
953 memory_region_add_subregion(&xive->ic_mmio, 0,
954 &xive->ic_reg_mmio);
955 memory_region_add_subregion(&xive->ic_mmio,
956 1ul << xive->ic_shift,
957 &xive->ic_notify_mmio);
958 memory_region_add_subregion(&xive->ic_mmio,
959 2ul << xive->ic_shift,
960 &xive->ic_lsi_mmio);
961 memory_region_add_subregion(&xive->ic_mmio,
962 4ull << xive->ic_shift,
963 &xive->tm_indirect_mmio);
964 }
965 }
966 break;
967
968 case CQ_TM1_BAR:
969 case CQ_TM2_BAR:
970 xive->tm_shift = val & CQ_TM_BAR_64K ? 16 : 12;
971 if (!(val & CQ_TM_BAR_VALID)) {
972 xive->tm_base = 0;
973 if (xive->regs[reg] & CQ_TM_BAR_VALID && is_chip0) {
974 memory_region_del_subregion(sysmem, &xive->tm_mmio);
975 }
976 } else {
977 xive->tm_base = val & ~(CQ_TM_BAR_VALID | CQ_TM_BAR_64K);
978 if (!(xive->regs[reg] & CQ_TM_BAR_VALID) && is_chip0) {
979 memory_region_add_subregion(sysmem, xive->tm_base,
980 &xive->tm_mmio);
981 }
982 }
983 break;
984
985 case CQ_PC_BARM:
986 xive->regs[reg] = val;
987 memory_region_set_size(&xive->pc_mmio, pnv_xive_pc_size(xive));
988 break;
989 case CQ_PC_BAR:
990 if (!(val & CQ_PC_BAR_VALID)) {
991 xive->pc_base = 0;
992 if (xive->regs[reg] & CQ_PC_BAR_VALID) {
993 memory_region_del_subregion(sysmem, &xive->pc_mmio);
994 }
995 } else {
996 xive->pc_base = val & ~(CQ_PC_BAR_VALID);
997 if (!(xive->regs[reg] & CQ_PC_BAR_VALID)) {
998 memory_region_add_subregion(sysmem, xive->pc_base,
999 &xive->pc_mmio);
1000 }
1001 }
1002 break;
1003
1004 case CQ_VC_BARM:
1005 xive->regs[reg] = val;
1006 memory_region_set_size(&xive->vc_mmio, pnv_xive_vc_size(xive));
1007 break;
1008 case CQ_VC_BAR:
1009 if (!(val & CQ_VC_BAR_VALID)) {
1010 xive->vc_base = 0;
1011 if (xive->regs[reg] & CQ_VC_BAR_VALID) {
1012 memory_region_del_subregion(sysmem, &xive->vc_mmio);
1013 }
1014 } else {
1015 xive->vc_base = val & ~(CQ_VC_BAR_VALID);
1016 if (!(xive->regs[reg] & CQ_VC_BAR_VALID)) {
1017 memory_region_add_subregion(sysmem, xive->vc_base,
1018 &xive->vc_mmio);
1019 }
1020 }
1021 break;
1022
1023
1024
1025
1026 case CQ_TAR:
1027 break;
1028 case CQ_TDR:
1029 pnv_xive_table_set_data(xive, val);
1030 break;
1031
1032
1033
1034
1035 case VC_VSD_TABLE_ADDR:
1036 case PC_VSD_TABLE_ADDR:
1037 break;
1038 case VC_VSD_TABLE_DATA:
1039 case PC_VSD_TABLE_DATA:
1040 pnv_xive_vst_set_data(xive, val, offset == PC_VSD_TABLE_DATA);
1041 break;
1042
1043
1044
1045
1046 case VC_IRQ_CONFIG_IPI:
1047 case VC_IRQ_CONFIG_HW:
1048 case VC_IRQ_CONFIG_CASCADE1:
1049 case VC_IRQ_CONFIG_CASCADE2:
1050 case VC_IRQ_CONFIG_REDIST:
1051 case VC_IRQ_CONFIG_IPI_CASC:
1052 break;
1053
1054
1055
1056
1057 case PC_THREAD_EN_REG0:
1058 case PC_THREAD_EN_REG1:
1059 break;
1060
1061 case PC_THREAD_EN_REG0_SET:
1062 xive->regs[PC_THREAD_EN_REG0 >> 3] |= val;
1063 break;
1064 case PC_THREAD_EN_REG1_SET:
1065 xive->regs[PC_THREAD_EN_REG1 >> 3] |= val;
1066 break;
1067 case PC_THREAD_EN_REG0_CLR:
1068 xive->regs[PC_THREAD_EN_REG0 >> 3] &= ~val;
1069 break;
1070 case PC_THREAD_EN_REG1_CLR:
1071 xive->regs[PC_THREAD_EN_REG1 >> 3] &= ~val;
1072 break;
1073
1074
1075
1076
1077
1078 case PC_TCTXT_INDIR0 ... PC_TCTXT_INDIR3:
1079 break;
1080
1081
1082
1083
1084 case VC_IVC_SCRUB_MASK:
1085 case VC_IVC_SCRUB_TRIG:
1086 break;
1087
1088 case VC_EQC_CWATCH_SPEC:
1089 val &= ~VC_EQC_CWATCH_CONFLICT;
1090 break;
1091 case VC_EQC_CWATCH_DAT1 ... VC_EQC_CWATCH_DAT3:
1092 break;
1093 case VC_EQC_CWATCH_DAT0:
1094
1095 xive->regs[reg] = val;
1096 pnv_xive_end_update(xive);
1097 break;
1098 case VC_EQC_SCRUB_MASK:
1099 case VC_EQC_SCRUB_TRIG:
1100
1101
1102
1103
1104 break;
1105
1106 case PC_VPC_CWATCH_SPEC:
1107 val &= ~PC_VPC_CWATCH_CONFLICT;
1108 break;
1109 case PC_VPC_CWATCH_DAT1 ... PC_VPC_CWATCH_DAT7:
1110 break;
1111 case PC_VPC_CWATCH_DAT0:
1112
1113 xive->regs[reg] = val;
1114 pnv_xive_nvt_update(xive);
1115 break;
1116 case PC_VPC_SCRUB_MASK:
1117 case PC_VPC_SCRUB_TRIG:
1118
1119
1120
1121
1122 break;
1123
1124
1125
1126
1127
1128 case PC_AT_KILL:
1129 break;
1130 case VC_AT_MACRO_KILL:
1131 break;
1132 case PC_AT_KILL_MASK:
1133 case VC_AT_MACRO_KILL_MASK:
1134 break;
1135
1136 default:
1137 xive_error(xive, "IC: invalid write to reg=0x%"HWADDR_PRIx, offset);
1138 return;
1139 }
1140
1141 xive->regs[reg] = val;
1142}
1143
1144static uint64_t pnv_xive_ic_reg_read(void *opaque, hwaddr offset, unsigned size)
1145{
1146 PnvXive *xive = PNV_XIVE(opaque);
1147 uint64_t val = 0;
1148 uint32_t reg = offset >> 3;
1149
1150 switch (offset) {
1151 case CQ_CFG_PB_GEN:
1152 case CQ_IC_BAR:
1153 case CQ_TM1_BAR:
1154 case CQ_TM2_BAR:
1155 case CQ_PC_BAR:
1156 case CQ_PC_BARM:
1157 case CQ_VC_BAR:
1158 case CQ_VC_BARM:
1159 case CQ_TAR:
1160 case CQ_TDR:
1161 case CQ_PBI_CTL:
1162
1163 case PC_TCTXT_CFG:
1164 case PC_TCTXT_TRACK:
1165 case PC_TCTXT_INDIR0:
1166 case PC_TCTXT_INDIR1:
1167 case PC_TCTXT_INDIR2:
1168 case PC_TCTXT_INDIR3:
1169 case PC_GLOBAL_CONFIG:
1170
1171 case PC_VPC_SCRUB_MASK:
1172
1173 case VC_GLOBAL_CONFIG:
1174 case VC_AIB_TX_ORDER_TAG2:
1175
1176 case VC_IRQ_CONFIG_IPI:
1177 case VC_IRQ_CONFIG_HW:
1178 case VC_IRQ_CONFIG_CASCADE1:
1179 case VC_IRQ_CONFIG_CASCADE2:
1180 case VC_IRQ_CONFIG_REDIST:
1181 case VC_IRQ_CONFIG_IPI_CASC:
1182
1183 case VC_EQC_SCRUB_MASK:
1184 case VC_IVC_SCRUB_MASK:
1185 case VC_SBC_CONFIG:
1186 case VC_AT_MACRO_KILL_MASK:
1187 case VC_VSD_TABLE_ADDR:
1188 case PC_VSD_TABLE_ADDR:
1189 case VC_VSD_TABLE_DATA:
1190 case PC_VSD_TABLE_DATA:
1191 case PC_THREAD_EN_REG0:
1192 case PC_THREAD_EN_REG1:
1193 val = xive->regs[reg];
1194 break;
1195
1196
1197
1198
1199 case PC_THREAD_EN_REG0_SET:
1200 case PC_THREAD_EN_REG0_CLR:
1201 val = xive->regs[PC_THREAD_EN_REG0 >> 3];
1202 break;
1203 case PC_THREAD_EN_REG1_SET:
1204 case PC_THREAD_EN_REG1_CLR:
1205 val = xive->regs[PC_THREAD_EN_REG1 >> 3];
1206 break;
1207
1208 case CQ_MSGSND:
1209 val = 0xffffff0000000000;
1210 break;
1211
1212
1213
1214
1215 case VC_EQC_CWATCH_SPEC:
1216 xive->regs[reg] = ~(VC_EQC_CWATCH_FULL | VC_EQC_CWATCH_CONFLICT);
1217 val = xive->regs[reg];
1218 break;
1219 case VC_EQC_CWATCH_DAT0:
1220
1221
1222
1223
1224 pnv_xive_end_cache_load(xive);
1225 val = xive->regs[reg];
1226 break;
1227 case VC_EQC_CWATCH_DAT1 ... VC_EQC_CWATCH_DAT3:
1228 val = xive->regs[reg];
1229 break;
1230
1231 case PC_VPC_CWATCH_SPEC:
1232 xive->regs[reg] = ~(PC_VPC_CWATCH_FULL | PC_VPC_CWATCH_CONFLICT);
1233 val = xive->regs[reg];
1234 break;
1235 case PC_VPC_CWATCH_DAT0:
1236
1237
1238
1239
1240 pnv_xive_nvt_cache_load(xive);
1241 val = xive->regs[reg];
1242 break;
1243 case PC_VPC_CWATCH_DAT1 ... PC_VPC_CWATCH_DAT7:
1244 val = xive->regs[reg];
1245 break;
1246
1247 case PC_VPC_SCRUB_TRIG:
1248 case VC_IVC_SCRUB_TRIG:
1249 case VC_EQC_SCRUB_TRIG:
1250 xive->regs[reg] &= ~VC_SCRUB_VALID;
1251 val = xive->regs[reg];
1252 break;
1253
1254
1255
1256
1257 case PC_AT_KILL:
1258 xive->regs[reg] &= ~PC_AT_KILL_VALID;
1259 val = xive->regs[reg];
1260 break;
1261 case VC_AT_MACRO_KILL:
1262 xive->regs[reg] &= ~VC_KILL_VALID;
1263 val = xive->regs[reg];
1264 break;
1265
1266
1267
1268
1269 case VC_EQC_CONFIG:
1270 val = VC_EQC_SYNC_MASK;
1271 break;
1272
1273 default:
1274 xive_error(xive, "IC: invalid read reg=0x%"HWADDR_PRIx, offset);
1275 }
1276
1277 return val;
1278}
1279
1280static const MemoryRegionOps pnv_xive_ic_reg_ops = {
1281 .read = pnv_xive_ic_reg_read,
1282 .write = pnv_xive_ic_reg_write,
1283 .endianness = DEVICE_BIG_ENDIAN,
1284 .valid = {
1285 .min_access_size = 8,
1286 .max_access_size = 8,
1287 },
1288 .impl = {
1289 .min_access_size = 8,
1290 .max_access_size = 8,
1291 },
1292};
1293
1294
1295
1296
1297#define PNV_XIVE_FORWARD_IPI 0x800
1298#define PNV_XIVE_FORWARD_HW 0x880
1299#define PNV_XIVE_FORWARD_OS_ESC 0x900
1300#define PNV_XIVE_FORWARD_HW_ESC 0x980
1301#define PNV_XIVE_FORWARD_REDIS 0xa00
1302#define PNV_XIVE_RESERVED5 0xa80
1303#define PNV_XIVE_RESERVED6 0xb00
1304#define PNV_XIVE_RESERVED7 0xb80
1305
1306
1307#define PNV_XIVE_SYNC_IPI 0xc00
1308#define PNV_XIVE_SYNC_HW 0xc80
1309#define PNV_XIVE_SYNC_OS_ESC 0xd00
1310#define PNV_XIVE_SYNC_HW_ESC 0xd80
1311#define PNV_XIVE_SYNC_REDIS 0xe00
1312
1313
1314#define PNV_XIVE_SYNC_PULL 0xe80
1315#define PNV_XIVE_SYNC_PUSH 0xf00
1316#define PNV_XIVE_SYNC_VPC 0xf80
1317
1318static void pnv_xive_ic_hw_trigger(PnvXive *xive, hwaddr addr, uint64_t val)
1319{
1320 uint8_t blk;
1321 uint32_t idx;
1322
1323 trace_pnv_xive_ic_hw_trigger(addr, val);
1324
1325 if (val & XIVE_TRIGGER_END) {
1326 xive_error(xive, "IC: END trigger at @0x%"HWADDR_PRIx" data 0x%"PRIx64,
1327 addr, val);
1328 return;
1329 }
1330
1331
1332
1333
1334
1335
1336 blk = XIVE_EAS_BLOCK(val);
1337 idx = XIVE_EAS_INDEX(val);
1338
1339 xive_router_notify(XIVE_NOTIFIER(xive), XIVE_EAS(blk, idx));
1340}
1341
1342static void pnv_xive_ic_notify_write(void *opaque, hwaddr addr, uint64_t val,
1343 unsigned size)
1344{
1345 PnvXive *xive = PNV_XIVE(opaque);
1346
1347
1348 switch (addr) {
1349 case 0x000 ... 0x7FF:
1350 pnv_xive_ic_hw_trigger(opaque, addr, val);
1351 break;
1352
1353
1354 case PNV_XIVE_FORWARD_IPI:
1355 case PNV_XIVE_FORWARD_HW:
1356 case PNV_XIVE_FORWARD_OS_ESC:
1357 case PNV_XIVE_FORWARD_HW_ESC:
1358 case PNV_XIVE_FORWARD_REDIS:
1359
1360 xive_error(xive, "IC: forwarded at @0x%"HWADDR_PRIx" IRQ 0x%"PRIx64,
1361 addr, val);
1362 break;
1363
1364
1365 case PNV_XIVE_SYNC_IPI:
1366 case PNV_XIVE_SYNC_HW:
1367 case PNV_XIVE_SYNC_OS_ESC:
1368 case PNV_XIVE_SYNC_HW_ESC:
1369 case PNV_XIVE_SYNC_REDIS:
1370 break;
1371
1372
1373 case PNV_XIVE_SYNC_PULL:
1374 case PNV_XIVE_SYNC_PUSH:
1375 case PNV_XIVE_SYNC_VPC:
1376 break;
1377
1378 default:
1379 xive_error(xive, "IC: invalid notify write @%"HWADDR_PRIx, addr);
1380 }
1381}
1382
1383static uint64_t pnv_xive_ic_notify_read(void *opaque, hwaddr addr,
1384 unsigned size)
1385{
1386 PnvXive *xive = PNV_XIVE(opaque);
1387
1388
1389 xive_error(xive, "IC: invalid notify read @%"HWADDR_PRIx, addr);
1390 return -1;
1391}
1392
1393static const MemoryRegionOps pnv_xive_ic_notify_ops = {
1394 .read = pnv_xive_ic_notify_read,
1395 .write = pnv_xive_ic_notify_write,
1396 .endianness = DEVICE_BIG_ENDIAN,
1397 .valid = {
1398 .min_access_size = 8,
1399 .max_access_size = 8,
1400 },
1401 .impl = {
1402 .min_access_size = 8,
1403 .max_access_size = 8,
1404 },
1405};
1406
1407
1408
1409
1410
1411static void pnv_xive_ic_lsi_write(void *opaque, hwaddr addr,
1412 uint64_t val, unsigned size)
1413{
1414 PnvXive *xive = PNV_XIVE(opaque);
1415
1416 xive_error(xive, "IC: LSI invalid write @%"HWADDR_PRIx, addr);
1417}
1418
1419static uint64_t pnv_xive_ic_lsi_read(void *opaque, hwaddr addr, unsigned size)
1420{
1421 PnvXive *xive = PNV_XIVE(opaque);
1422
1423 xive_error(xive, "IC: LSI invalid read @%"HWADDR_PRIx, addr);
1424 return -1;
1425}
1426
1427static const MemoryRegionOps pnv_xive_ic_lsi_ops = {
1428 .read = pnv_xive_ic_lsi_read,
1429 .write = pnv_xive_ic_lsi_write,
1430 .endianness = DEVICE_BIG_ENDIAN,
1431 .valid = {
1432 .min_access_size = 8,
1433 .max_access_size = 8,
1434 },
1435 .impl = {
1436 .min_access_size = 8,
1437 .max_access_size = 8,
1438 },
1439};
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450static XiveTCTX *pnv_xive_get_indirect_tctx(PnvXive *xive)
1451{
1452 PnvChip *chip = xive->chip;
1453 uint64_t tctxt_indir = xive->regs[PC_TCTXT_INDIR0 >> 3];
1454 PowerPCCPU *cpu = NULL;
1455 int pir;
1456
1457 if (!(tctxt_indir & PC_TCTXT_INDIR_VALID)) {
1458 xive_error(xive, "IC: no indirect TIMA access in progress");
1459 return NULL;
1460 }
1461
1462 pir = (chip->chip_id << 8) | GETFIELD(PC_TCTXT_INDIR_THRDID, tctxt_indir);
1463 cpu = pnv_chip_find_cpu(chip, pir);
1464 if (!cpu) {
1465 xive_error(xive, "IC: invalid PIR %x for indirect access", pir);
1466 return NULL;
1467 }
1468
1469
1470 if (!pnv_xive_is_cpu_enabled(xive, cpu)) {
1471 xive_error(xive, "IC: CPU %x is not enabled", pir);
1472 }
1473
1474 return XIVE_TCTX(pnv_cpu_state(cpu)->intc);
1475}
1476
1477static void xive_tm_indirect_write(void *opaque, hwaddr offset,
1478 uint64_t value, unsigned size)
1479{
1480 XiveTCTX *tctx = pnv_xive_get_indirect_tctx(PNV_XIVE(opaque));
1481
1482 xive_tctx_tm_write(XIVE_PRESENTER(opaque), tctx, offset, value, size);
1483}
1484
1485static uint64_t xive_tm_indirect_read(void *opaque, hwaddr offset,
1486 unsigned size)
1487{
1488 XiveTCTX *tctx = pnv_xive_get_indirect_tctx(PNV_XIVE(opaque));
1489
1490 return xive_tctx_tm_read(XIVE_PRESENTER(opaque), tctx, offset, size);
1491}
1492
1493static const MemoryRegionOps xive_tm_indirect_ops = {
1494 .read = xive_tm_indirect_read,
1495 .write = xive_tm_indirect_write,
1496 .endianness = DEVICE_BIG_ENDIAN,
1497 .valid = {
1498 .min_access_size = 1,
1499 .max_access_size = 8,
1500 },
1501 .impl = {
1502 .min_access_size = 1,
1503 .max_access_size = 8,
1504 },
1505};
1506
1507static void pnv_xive_tm_write(void *opaque, hwaddr offset,
1508 uint64_t value, unsigned size)
1509{
1510 PowerPCCPU *cpu = POWERPC_CPU(current_cpu);
1511 PnvXive *xive = pnv_xive_tm_get_xive(cpu);
1512 XiveTCTX *tctx = XIVE_TCTX(pnv_cpu_state(cpu)->intc);
1513
1514 xive_tctx_tm_write(XIVE_PRESENTER(xive), tctx, offset, value, size);
1515}
1516
1517static uint64_t pnv_xive_tm_read(void *opaque, hwaddr offset, unsigned size)
1518{
1519 PowerPCCPU *cpu = POWERPC_CPU(current_cpu);
1520 PnvXive *xive = pnv_xive_tm_get_xive(cpu);
1521 XiveTCTX *tctx = XIVE_TCTX(pnv_cpu_state(cpu)->intc);
1522
1523 return xive_tctx_tm_read(XIVE_PRESENTER(xive), tctx, offset, size);
1524}
1525
1526const MemoryRegionOps pnv_xive_tm_ops = {
1527 .read = pnv_xive_tm_read,
1528 .write = pnv_xive_tm_write,
1529 .endianness = DEVICE_BIG_ENDIAN,
1530 .valid = {
1531 .min_access_size = 1,
1532 .max_access_size = 8,
1533 },
1534 .impl = {
1535 .min_access_size = 1,
1536 .max_access_size = 8,
1537 },
1538};
1539
1540
1541
1542
1543static uint64_t pnv_xive_xscom_read(void *opaque, hwaddr addr, unsigned size)
1544{
1545 switch (addr >> 3) {
1546 case X_VC_EQC_CONFIG:
1547
1548 return VC_EQC_SYNC_MASK;
1549 default:
1550 return pnv_xive_ic_reg_read(opaque, addr, size);
1551 }
1552}
1553
1554static void pnv_xive_xscom_write(void *opaque, hwaddr addr,
1555 uint64_t val, unsigned size)
1556{
1557 pnv_xive_ic_reg_write(opaque, addr, val, size);
1558}
1559
1560static const MemoryRegionOps pnv_xive_xscom_ops = {
1561 .read = pnv_xive_xscom_read,
1562 .write = pnv_xive_xscom_write,
1563 .endianness = DEVICE_BIG_ENDIAN,
1564 .valid = {
1565 .min_access_size = 8,
1566 .max_access_size = 8,
1567 },
1568 .impl = {
1569 .min_access_size = 8,
1570 .max_access_size = 8,
1571 }
1572};
1573
1574
1575
1576
1577static uint64_t pnv_xive_vc_read(void *opaque, hwaddr offset,
1578 unsigned size)
1579{
1580 PnvXive *xive = PNV_XIVE(opaque);
1581 uint64_t edt_index = offset >> pnv_xive_edt_shift(xive);
1582 uint64_t edt_type = 0;
1583 uint64_t edt_offset;
1584 MemTxResult result;
1585 AddressSpace *edt_as = NULL;
1586 uint64_t ret = -1;
1587
1588 if (edt_index < XIVE_TABLE_EDT_MAX) {
1589 edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[edt_index]);
1590 }
1591
1592 switch (edt_type) {
1593 case CQ_TDR_EDT_IPI:
1594 edt_as = &xive->ipi_as;
1595 break;
1596 case CQ_TDR_EDT_EQ:
1597 edt_as = &xive->end_as;
1598 break;
1599 default:
1600 xive_error(xive, "VC: invalid EDT type for read @%"HWADDR_PRIx, offset);
1601 return -1;
1602 }
1603
1604
1605 edt_offset = pnv_xive_edt_offset(xive, offset, edt_type);
1606
1607 ret = address_space_ldq(edt_as, edt_offset, MEMTXATTRS_UNSPECIFIED,
1608 &result);
1609
1610 if (result != MEMTX_OK) {
1611 xive_error(xive, "VC: %s read failed at @0x%"HWADDR_PRIx " -> @0x%"
1612 HWADDR_PRIx, edt_type == CQ_TDR_EDT_IPI ? "IPI" : "END",
1613 offset, edt_offset);
1614 return -1;
1615 }
1616
1617 return ret;
1618}
1619
1620static void pnv_xive_vc_write(void *opaque, hwaddr offset,
1621 uint64_t val, unsigned size)
1622{
1623 PnvXive *xive = PNV_XIVE(opaque);
1624 uint64_t edt_index = offset >> pnv_xive_edt_shift(xive);
1625 uint64_t edt_type = 0;
1626 uint64_t edt_offset;
1627 MemTxResult result;
1628 AddressSpace *edt_as = NULL;
1629
1630 if (edt_index < XIVE_TABLE_EDT_MAX) {
1631 edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[edt_index]);
1632 }
1633
1634 switch (edt_type) {
1635 case CQ_TDR_EDT_IPI:
1636 edt_as = &xive->ipi_as;
1637 break;
1638 case CQ_TDR_EDT_EQ:
1639 edt_as = &xive->end_as;
1640 break;
1641 default:
1642 xive_error(xive, "VC: invalid EDT type for write @%"HWADDR_PRIx,
1643 offset);
1644 return;
1645 }
1646
1647
1648 edt_offset = pnv_xive_edt_offset(xive, offset, edt_type);
1649
1650 address_space_stq(edt_as, edt_offset, val, MEMTXATTRS_UNSPECIFIED, &result);
1651 if (result != MEMTX_OK) {
1652 xive_error(xive, "VC: write failed at @0x%"HWADDR_PRIx, edt_offset);
1653 }
1654}
1655
1656static const MemoryRegionOps pnv_xive_vc_ops = {
1657 .read = pnv_xive_vc_read,
1658 .write = pnv_xive_vc_write,
1659 .endianness = DEVICE_BIG_ENDIAN,
1660 .valid = {
1661 .min_access_size = 8,
1662 .max_access_size = 8,
1663 },
1664 .impl = {
1665 .min_access_size = 8,
1666 .max_access_size = 8,
1667 },
1668};
1669
1670
1671
1672
1673
1674static uint64_t pnv_xive_pc_read(void *opaque, hwaddr addr,
1675 unsigned size)
1676{
1677 PnvXive *xive = PNV_XIVE(opaque);
1678
1679 xive_error(xive, "PC: invalid read @%"HWADDR_PRIx, addr);
1680 return -1;
1681}
1682
1683static void pnv_xive_pc_write(void *opaque, hwaddr addr,
1684 uint64_t value, unsigned size)
1685{
1686 PnvXive *xive = PNV_XIVE(opaque);
1687
1688 xive_error(xive, "PC: invalid write to VC @%"HWADDR_PRIx, addr);
1689}
1690
1691static const MemoryRegionOps pnv_xive_pc_ops = {
1692 .read = pnv_xive_pc_read,
1693 .write = pnv_xive_pc_write,
1694 .endianness = DEVICE_BIG_ENDIAN,
1695 .valid = {
1696 .min_access_size = 8,
1697 .max_access_size = 8,
1698 },
1699 .impl = {
1700 .min_access_size = 8,
1701 .max_access_size = 8,
1702 },
1703};
1704
1705static void xive_nvt_pic_print_info(XiveNVT *nvt, uint32_t nvt_idx,
1706 Monitor *mon)
1707{
1708 uint8_t eq_blk = xive_get_field32(NVT_W1_EQ_BLOCK, nvt->w1);
1709 uint32_t eq_idx = xive_get_field32(NVT_W1_EQ_INDEX, nvt->w1);
1710
1711 if (!xive_nvt_is_valid(nvt)) {
1712 return;
1713 }
1714
1715 monitor_printf(mon, " %08x end:%02x/%04x IPB:%02x\n", nvt_idx,
1716 eq_blk, eq_idx,
1717 xive_get_field32(NVT_W4_IPB, nvt->w4));
1718}
1719
1720void pnv_xive_pic_print_info(PnvXive *xive, Monitor *mon)
1721{
1722 XiveRouter *xrtr = XIVE_ROUTER(xive);
1723 uint8_t blk = pnv_xive_block_id(xive);
1724 uint8_t chip_id = xive->chip->chip_id;
1725 uint32_t srcno0 = XIVE_EAS(blk, 0);
1726 uint32_t nr_ipis = pnv_xive_nr_ipis(xive, blk);
1727 XiveEAS eas;
1728 XiveEND end;
1729 XiveNVT nvt;
1730 int i;
1731 uint64_t xive_nvt_per_subpage;
1732
1733 monitor_printf(mon, "XIVE[%x] #%d Source %08x .. %08x\n", chip_id, blk,
1734 srcno0, srcno0 + nr_ipis - 1);
1735 xive_source_pic_print_info(&xive->ipi_source, srcno0, mon);
1736
1737 monitor_printf(mon, "XIVE[%x] #%d EAT %08x .. %08x\n", chip_id, blk,
1738 srcno0, srcno0 + nr_ipis - 1);
1739 for (i = 0; i < nr_ipis; i++) {
1740 if (xive_router_get_eas(xrtr, blk, i, &eas)) {
1741 break;
1742 }
1743 if (!xive_eas_is_masked(&eas)) {
1744 xive_eas_pic_print_info(&eas, i, mon);
1745 }
1746 }
1747
1748 monitor_printf(mon, "XIVE[%x] #%d ENDT\n", chip_id, blk);
1749 i = 0;
1750 while (!xive_router_get_end(xrtr, blk, i, &end)) {
1751 xive_end_pic_print_info(&end, i++, mon);
1752 }
1753
1754 monitor_printf(mon, "XIVE[%x] #%d END Escalation EAT\n", chip_id, blk);
1755 i = 0;
1756 while (!xive_router_get_end(xrtr, blk, i, &end)) {
1757 xive_end_eas_pic_print_info(&end, i++, mon);
1758 }
1759
1760 monitor_printf(mon, "XIVE[%x] #%d NVTT %08x .. %08x\n", chip_id, blk,
1761 0, XIVE_NVT_COUNT - 1);
1762 xive_nvt_per_subpage = pnv_xive_vst_per_subpage(xive, VST_TSEL_VPDT);
1763 for (i = 0; i < XIVE_NVT_COUNT; i += xive_nvt_per_subpage) {
1764 while (!xive_router_get_nvt(xrtr, blk, i, &nvt)) {
1765 xive_nvt_pic_print_info(&nvt, i++, mon);
1766 }
1767 }
1768}
1769
1770static void pnv_xive_reset(void *dev)
1771{
1772 PnvXive *xive = PNV_XIVE(dev);
1773 XiveSource *xsrc = &xive->ipi_source;
1774 XiveENDSource *end_xsrc = &xive->end_source;
1775
1776
1777 xive->ic_shift = xive->vc_shift = xive->pc_shift = 12;
1778
1779
1780 if (memory_region_is_mapped(&xsrc->esb_mmio)) {
1781 memory_region_del_subregion(&xive->ipi_edt_mmio, &xsrc->esb_mmio);
1782 }
1783
1784 if (memory_region_is_mapped(&xive->ipi_edt_mmio)) {
1785 memory_region_del_subregion(&xive->ipi_mmio, &xive->ipi_edt_mmio);
1786 }
1787
1788 if (memory_region_is_mapped(&end_xsrc->esb_mmio)) {
1789 memory_region_del_subregion(&xive->end_edt_mmio, &end_xsrc->esb_mmio);
1790 }
1791
1792 if (memory_region_is_mapped(&xive->end_edt_mmio)) {
1793 memory_region_del_subregion(&xive->end_mmio, &xive->end_edt_mmio);
1794 }
1795}
1796
1797static void pnv_xive_init(Object *obj)
1798{
1799 PnvXive *xive = PNV_XIVE(obj);
1800
1801 object_initialize_child(obj, "ipi_source", &xive->ipi_source,
1802 TYPE_XIVE_SOURCE);
1803 object_initialize_child(obj, "end_source", &xive->end_source,
1804 TYPE_XIVE_END_SOURCE);
1805}
1806
1807
1808
1809
1810#define PNV_XIVE_NR_IRQS (PNV9_XIVE_VC_SIZE / (1ull << XIVE_ESB_64K_2PAGE))
1811#define PNV_XIVE_NR_ENDS (PNV9_XIVE_VC_SIZE / (1ull << XIVE_ESB_64K_2PAGE))
1812
1813static void pnv_xive_realize(DeviceState *dev, Error **errp)
1814{
1815 PnvXive *xive = PNV_XIVE(dev);
1816 PnvXiveClass *pxc = PNV_XIVE_GET_CLASS(dev);
1817 XiveSource *xsrc = &xive->ipi_source;
1818 XiveENDSource *end_xsrc = &xive->end_source;
1819 Error *local_err = NULL;
1820
1821 pxc->parent_realize(dev, &local_err);
1822 if (local_err) {
1823 error_propagate(errp, local_err);
1824 return;
1825 }
1826
1827 assert(xive->chip);
1828
1829
1830
1831
1832
1833
1834
1835 object_property_set_int(OBJECT(xsrc), "nr-irqs", PNV_XIVE_NR_IRQS,
1836 &error_fatal);
1837 object_property_set_link(OBJECT(xsrc), "xive", OBJECT(xive), &error_abort);
1838 if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
1839 return;
1840 }
1841
1842 object_property_set_int(OBJECT(end_xsrc), "nr-ends", PNV_XIVE_NR_ENDS,
1843 &error_fatal);
1844 object_property_set_link(OBJECT(end_xsrc), "xive", OBJECT(xive),
1845 &error_abort);
1846 if (!qdev_realize(DEVICE(end_xsrc), NULL, errp)) {
1847 return;
1848 }
1849
1850
1851 xive->ic_shift = xive->vc_shift = xive->pc_shift = 12;
1852
1853
1854 memory_region_init_io(&xive->xscom_regs, OBJECT(dev), &pnv_xive_xscom_ops,
1855 xive, "xscom-xive", PNV9_XSCOM_XIVE_SIZE << 3);
1856
1857
1858 memory_region_init(&xive->ic_mmio, OBJECT(dev), "xive-ic",
1859 PNV9_XIVE_IC_SIZE);
1860
1861 memory_region_init_io(&xive->ic_reg_mmio, OBJECT(dev), &pnv_xive_ic_reg_ops,
1862 xive, "xive-ic-reg", 1 << xive->ic_shift);
1863 memory_region_init_io(&xive->ic_notify_mmio, OBJECT(dev),
1864 &pnv_xive_ic_notify_ops,
1865 xive, "xive-ic-notify", 1 << xive->ic_shift);
1866
1867
1868 memory_region_init_io(&xive->ic_lsi_mmio, OBJECT(dev), &pnv_xive_ic_lsi_ops,
1869 xive, "xive-ic-lsi", 2 << xive->ic_shift);
1870
1871
1872 memory_region_init_io(&xive->tm_indirect_mmio, OBJECT(dev),
1873 &xive_tm_indirect_ops,
1874 xive, "xive-tima-indirect", PNV9_XIVE_TM_SIZE);
1875
1876
1877
1878
1879
1880
1881 memory_region_init_io(&xive->vc_mmio, OBJECT(xive), &pnv_xive_vc_ops, xive,
1882 "xive-vc", PNV9_XIVE_VC_SIZE);
1883
1884 memory_region_init(&xive->ipi_mmio, OBJECT(xive), "xive-vc-ipi",
1885 PNV9_XIVE_VC_SIZE);
1886 address_space_init(&xive->ipi_as, &xive->ipi_mmio, "xive-vc-ipi");
1887 memory_region_init(&xive->end_mmio, OBJECT(xive), "xive-vc-end",
1888 PNV9_XIVE_VC_SIZE);
1889 address_space_init(&xive->end_as, &xive->end_mmio, "xive-vc-end");
1890
1891
1892
1893
1894
1895 memory_region_init(&xive->ipi_edt_mmio, OBJECT(xive), "xive-vc-ipi-edt", 0);
1896 memory_region_init(&xive->end_edt_mmio, OBJECT(xive), "xive-vc-end-edt", 0);
1897
1898
1899 memory_region_init_io(&xive->pc_mmio, OBJECT(xive), &pnv_xive_pc_ops, xive,
1900 "xive-pc", PNV9_XIVE_PC_SIZE);
1901
1902
1903 memory_region_init_io(&xive->tm_mmio, OBJECT(xive), &pnv_xive_tm_ops,
1904 xive, "xive-tima", PNV9_XIVE_TM_SIZE);
1905
1906 qemu_register_reset(pnv_xive_reset, dev);
1907}
1908
1909static int pnv_xive_dt_xscom(PnvXScomInterface *dev, void *fdt,
1910 int xscom_offset)
1911{
1912 const char compat[] = "ibm,power9-xive-x";
1913 char *name;
1914 int offset;
1915 uint32_t lpc_pcba = PNV9_XSCOM_XIVE_BASE;
1916 uint32_t reg[] = {
1917 cpu_to_be32(lpc_pcba),
1918 cpu_to_be32(PNV9_XSCOM_XIVE_SIZE)
1919 };
1920
1921 name = g_strdup_printf("xive@%x", lpc_pcba);
1922 offset = fdt_add_subnode(fdt, xscom_offset, name);
1923 _FDT(offset);
1924 g_free(name);
1925
1926 _FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg))));
1927 _FDT((fdt_setprop(fdt, offset, "compatible", compat,
1928 sizeof(compat))));
1929 return 0;
1930}
1931
1932static Property pnv_xive_properties[] = {
1933 DEFINE_PROP_UINT64("ic-bar", PnvXive, ic_base, 0),
1934 DEFINE_PROP_UINT64("vc-bar", PnvXive, vc_base, 0),
1935 DEFINE_PROP_UINT64("pc-bar", PnvXive, pc_base, 0),
1936 DEFINE_PROP_UINT64("tm-bar", PnvXive, tm_base, 0),
1937
1938 DEFINE_PROP_LINK("chip", PnvXive, chip, TYPE_PNV_CHIP, PnvChip *),
1939 DEFINE_PROP_END_OF_LIST(),
1940};
1941
1942static void pnv_xive_class_init(ObjectClass *klass, void *data)
1943{
1944 DeviceClass *dc = DEVICE_CLASS(klass);
1945 PnvXScomInterfaceClass *xdc = PNV_XSCOM_INTERFACE_CLASS(klass);
1946 XiveRouterClass *xrc = XIVE_ROUTER_CLASS(klass);
1947 XiveNotifierClass *xnc = XIVE_NOTIFIER_CLASS(klass);
1948 XivePresenterClass *xpc = XIVE_PRESENTER_CLASS(klass);
1949 PnvXiveClass *pxc = PNV_XIVE_CLASS(klass);
1950
1951 xdc->dt_xscom = pnv_xive_dt_xscom;
1952
1953 dc->desc = "PowerNV XIVE Interrupt Controller";
1954 device_class_set_parent_realize(dc, pnv_xive_realize, &pxc->parent_realize);
1955 dc->realize = pnv_xive_realize;
1956 device_class_set_props(dc, pnv_xive_properties);
1957
1958 xrc->get_eas = pnv_xive_get_eas;
1959 xrc->get_end = pnv_xive_get_end;
1960 xrc->write_end = pnv_xive_write_end;
1961 xrc->get_nvt = pnv_xive_get_nvt;
1962 xrc->write_nvt = pnv_xive_write_nvt;
1963 xrc->get_block_id = pnv_xive_get_block_id;
1964
1965 xnc->notify = pnv_xive_notify;
1966 xpc->match_nvt = pnv_xive_match_nvt;
1967};
1968
1969static const TypeInfo pnv_xive_info = {
1970 .name = TYPE_PNV_XIVE,
1971 .parent = TYPE_XIVE_ROUTER,
1972 .instance_init = pnv_xive_init,
1973 .instance_size = sizeof(PnvXive),
1974 .class_init = pnv_xive_class_init,
1975 .class_size = sizeof(PnvXiveClass),
1976 .interfaces = (InterfaceInfo[]) {
1977 { TYPE_PNV_XSCOM_INTERFACE },
1978 { }
1979 }
1980};
1981
1982static void pnv_xive_register_types(void)
1983{
1984 type_register_static(&pnv_xive_info);
1985}
1986
1987type_init(pnv_xive_register_types)
1988