xref: /openbmc/qemu/hw/intc/pnv_xive2.c (revision 9b4b4e510bcb8b1c3c4789615dce3b520aa1f1d3)
1  /*
2   * QEMU PowerPC XIVE2 interrupt controller model  (POWER10)
3   *
4   * Copyright (c) 2019-2022, IBM Corporation.
5   *
6   * This code is licensed under the GPL version 2 or later. See the
7   * COPYING file in the top-level directory.
8   */
9  
10  #include "qemu/osdep.h"
11  #include "qemu/log.h"
12  #include "qapi/error.h"
13  #include "target/ppc/cpu.h"
14  #include "sysemu/cpus.h"
15  #include "sysemu/dma.h"
16  #include "monitor/monitor.h"
17  #include "hw/ppc/fdt.h"
18  #include "hw/ppc/pnv.h"
19  #include "hw/ppc/pnv_chip.h"
20  #include "hw/ppc/pnv_core.h"
21  #include "hw/ppc/pnv_xscom.h"
22  #include "hw/ppc/xive2.h"
23  #include "hw/ppc/pnv_xive.h"
24  #include "hw/ppc/xive_regs.h"
25  #include "hw/ppc/xive2_regs.h"
26  #include "hw/ppc/ppc.h"
27  #include "hw/qdev-properties.h"
28  #include "sysemu/reset.h"
29  
30  #include <libfdt.h>
31  
32  #include "pnv_xive2_regs.h"
33  
34  #undef XIVE2_DEBUG
35  
36  /*
37   * Virtual structures table (VST)
38   */
39  #define SBE_PER_BYTE   4
40  
41  typedef struct XiveVstInfo {
42      const char *name;
43      uint32_t    size;
44      uint32_t    max_blocks;
45  } XiveVstInfo;
46  
47  static const XiveVstInfo vst_infos[] = {
48  
49      [VST_EAS]  = { "EAT",  sizeof(Xive2Eas),  16 },
50      [VST_ESB]  = { "ESB",  1,                  16 },
51      [VST_END]  = { "ENDT", sizeof(Xive2End),  16 },
52  
53      [VST_NVP]  = { "NVPT", sizeof(Xive2Nvp),  16 },
54      [VST_NVG]  = { "NVGT", sizeof(Xive2Nvgc), 16 },
55      [VST_NVC]  = { "NVCT", sizeof(Xive2Nvgc), 16 },
56  
57      [VST_IC]  =  { "IC",   1 /* ? */         , 16 }, /* Topology # */
58      [VST_SYNC] = { "SYNC", 1 /* ? */         , 16 }, /* Topology # */
59  
60      /*
61       * This table contains the backing store pages for the interrupt
62       * fifos of the VC sub-engine in case of overflow.
63       *
64       * 0 - IPI,
65       * 1 - HWD,
66       * 2 - NxC,
67       * 3 - INT,
68       * 4 - OS-Queue,
69       * 5 - Pool-Queue,
70       * 6 - Hard-Queue
71       */
72      [VST_ERQ]  = { "ERQ",  1,                   VC_QUEUE_COUNT },
73  };
74  
75  #define xive2_error(xive, fmt, ...)                                      \
76      qemu_log_mask(LOG_GUEST_ERROR, "XIVE[%x] - " fmt "\n",              \
77                    (xive)->chip->chip_id, ## __VA_ARGS__);
78  
79  /*
80   * TODO: Document block id override
81   */
82  static uint32_t pnv_xive2_block_id(PnvXive2 *xive)
83  {
84      uint8_t blk = xive->chip->chip_id;
85      uint64_t cfg_val = xive->cq_regs[CQ_XIVE_CFG >> 3];
86  
87      if (cfg_val & CQ_XIVE_CFG_HYP_HARD_BLKID_OVERRIDE) {
88          blk = GETFIELD(CQ_XIVE_CFG_HYP_HARD_BLOCK_ID, cfg_val);
89      }
90  
91      return blk;
92  }
93  
94  /*
95   * Remote access to controllers. HW uses MMIOs. For now, a simple scan
96   * of the chips is good enough.
97   *
98   * TODO: Block scope support
99   */
100  static PnvXive2 *pnv_xive2_get_remote(uint8_t blk)
101  {
102      PnvMachineState *pnv = PNV_MACHINE(qdev_get_machine());
103      int i;
104  
105      for (i = 0; i < pnv->num_chips; i++) {
106          Pnv10Chip *chip10 = PNV10_CHIP(pnv->chips[i]);
107          PnvXive2 *xive = &chip10->xive;
108  
109          if (pnv_xive2_block_id(xive) == blk) {
110              return xive;
111          }
112      }
113      return NULL;
114  }
115  
116  /*
117   * VST accessors for ESB, EAT, ENDT, NVP
118   *
119   * Indirect VST tables are arrays of VSDs pointing to a page (of same
120   * size). Each page is a direct VST table.
121   */
122  
123  #define XIVE_VSD_SIZE 8
124  
125  /* Indirect page size can be 4K, 64K, 2M, 16M. */
126  static uint64_t pnv_xive2_vst_page_size_allowed(uint32_t page_shift)
127  {
128       return page_shift == 12 || page_shift == 16 ||
129           page_shift == 21 || page_shift == 24;
130  }
131  
132  static uint64_t pnv_xive2_vst_addr_direct(PnvXive2 *xive, uint32_t type,
133                                            uint64_t vsd, uint32_t idx)
134  {
135      const XiveVstInfo *info = &vst_infos[type];
136      uint64_t vst_addr = vsd & VSD_ADDRESS_MASK;
137      uint64_t vst_tsize = 1ull << (GETFIELD(VSD_TSIZE, vsd) + 12);
138      uint32_t idx_max;
139  
140      idx_max = vst_tsize / info->size - 1;
141      if (idx > idx_max) {
142  #ifdef XIVE2_DEBUG
143          xive2_error(xive, "VST: %s entry %x out of range [ 0 .. %x ] !?",
144                     info->name, idx, idx_max);
145  #endif
146          return 0;
147      }
148  
149      return vst_addr + idx * info->size;
150  }
151  
152  static uint64_t pnv_xive2_vst_addr_indirect(PnvXive2 *xive, uint32_t type,
153                                              uint64_t vsd, uint32_t idx)
154  {
155      const XiveVstInfo *info = &vst_infos[type];
156      uint64_t vsd_addr;
157      uint32_t vsd_idx;
158      uint32_t page_shift;
159      uint32_t vst_per_page;
160  
161      /* Get the page size of the indirect table. */
162      vsd_addr = vsd & VSD_ADDRESS_MASK;
163      ldq_be_dma(&address_space_memory, vsd_addr, &vsd, MEMTXATTRS_UNSPECIFIED);
164  
165      if (!(vsd & VSD_ADDRESS_MASK)) {
166  #ifdef XIVE2_DEBUG
167          xive2_error(xive, "VST: invalid %s entry %x !?", info->name, idx);
168  #endif
169          return 0;
170      }
171  
172      page_shift = GETFIELD(VSD_TSIZE, vsd) + 12;
173  
174      if (!pnv_xive2_vst_page_size_allowed(page_shift)) {
175          xive2_error(xive, "VST: invalid %s page shift %d", info->name,
176                     page_shift);
177          return 0;
178      }
179  
180      vst_per_page = (1ull << page_shift) / info->size;
181      vsd_idx = idx / vst_per_page;
182  
183      /* Load the VSD we are looking for, if not already done */
184      if (vsd_idx) {
185          vsd_addr = vsd_addr + vsd_idx * XIVE_VSD_SIZE;
186          ldq_be_dma(&address_space_memory, vsd_addr, &vsd,
187                     MEMTXATTRS_UNSPECIFIED);
188  
189          if (!(vsd & VSD_ADDRESS_MASK)) {
190  #ifdef XIVE2_DEBUG
191              xive2_error(xive, "VST: invalid %s entry %x !?", info->name, idx);
192  #endif
193              return 0;
194          }
195  
196          /*
197           * Check that the pages have a consistent size across the
198           * indirect table
199           */
200          if (page_shift != GETFIELD(VSD_TSIZE, vsd) + 12) {
201              xive2_error(xive, "VST: %s entry %x indirect page size differ !?",
202                         info->name, idx);
203              return 0;
204          }
205      }
206  
207      return pnv_xive2_vst_addr_direct(xive, type, vsd, (idx % vst_per_page));
208  }
209  
210  static uint64_t pnv_xive2_vst_addr(PnvXive2 *xive, uint32_t type, uint8_t blk,
211                                     uint32_t idx)
212  {
213      const XiveVstInfo *info = &vst_infos[type];
214      uint64_t vsd;
215  
216      if (blk >= info->max_blocks) {
217          xive2_error(xive, "VST: invalid block id %d for VST %s %d !?",
218                     blk, info->name, idx);
219          return 0;
220      }
221  
222      vsd = xive->vsds[type][blk];
223  
224      /* Remote VST access */
225      if (GETFIELD(VSD_MODE, vsd) == VSD_MODE_FORWARD) {
226          xive = pnv_xive2_get_remote(blk);
227  
228          return xive ? pnv_xive2_vst_addr(xive, type, blk, idx) : 0;
229      }
230  
231      if (VSD_INDIRECT & vsd) {
232          return pnv_xive2_vst_addr_indirect(xive, type, vsd, idx);
233      }
234  
235      return pnv_xive2_vst_addr_direct(xive, type, vsd, idx);
236  }
237  
238  static int pnv_xive2_vst_read(PnvXive2 *xive, uint32_t type, uint8_t blk,
239                               uint32_t idx, void *data)
240  {
241      const XiveVstInfo *info = &vst_infos[type];
242      uint64_t addr = pnv_xive2_vst_addr(xive, type, blk, idx);
243      MemTxResult result;
244  
245      if (!addr) {
246          return -1;
247      }
248  
249      result = address_space_read(&address_space_memory, addr,
250                                  MEMTXATTRS_UNSPECIFIED, data,
251                                  info->size);
252      if (result != MEMTX_OK) {
253          xive2_error(xive, "VST: read failed at @0x%" HWADDR_PRIx
254                     " for VST %s %x/%x\n", addr, info->name, blk, idx);
255          return -1;
256      }
257      return 0;
258  }
259  
260  #define XIVE_VST_WORD_ALL -1
261  
262  static int pnv_xive2_vst_write(PnvXive2 *xive, uint32_t type, uint8_t blk,
263                                 uint32_t idx, void *data, uint32_t word_number)
264  {
265      const XiveVstInfo *info = &vst_infos[type];
266      uint64_t addr = pnv_xive2_vst_addr(xive, type, blk, idx);
267      MemTxResult result;
268  
269      if (!addr) {
270          return -1;
271      }
272  
273      if (word_number == XIVE_VST_WORD_ALL) {
274          result = address_space_write(&address_space_memory, addr,
275                                       MEMTXATTRS_UNSPECIFIED, data,
276                                       info->size);
277      } else {
278          result = address_space_write(&address_space_memory,
279                                       addr + word_number * 4,
280                                       MEMTXATTRS_UNSPECIFIED,
281                                       data + word_number * 4, 4);
282      }
283  
284      if (result != MEMTX_OK) {
285          xive2_error(xive, "VST: write failed at @0x%" HWADDR_PRIx
286                     "for VST %s %x/%x\n", addr, info->name, blk, idx);
287          return -1;
288      }
289      return 0;
290  }
291  
292  static int pnv_xive2_get_pq(Xive2Router *xrtr, uint8_t blk, uint32_t idx,
293                               uint8_t *pq)
294  {
295      PnvXive2 *xive = PNV_XIVE2(xrtr);
296  
297      if (pnv_xive2_block_id(xive) != blk) {
298          xive2_error(xive, "VST: EAS %x is remote !?", XIVE_EAS(blk, idx));
299          return -1;
300      }
301  
302      *pq = xive_source_esb_get(&xive->ipi_source, idx);
303      return 0;
304  }
305  
306  static int pnv_xive2_set_pq(Xive2Router *xrtr, uint8_t blk, uint32_t idx,
307                               uint8_t *pq)
308  {
309      PnvXive2 *xive = PNV_XIVE2(xrtr);
310  
311      if (pnv_xive2_block_id(xive) != blk) {
312          xive2_error(xive, "VST: EAS %x is remote !?", XIVE_EAS(blk, idx));
313          return -1;
314      }
315  
316      *pq = xive_source_esb_set(&xive->ipi_source, idx, *pq);
317      return 0;
318  }
319  
320  static int pnv_xive2_get_end(Xive2Router *xrtr, uint8_t blk, uint32_t idx,
321                               Xive2End *end)
322  {
323      return pnv_xive2_vst_read(PNV_XIVE2(xrtr), VST_END, blk, idx, end);
324  }
325  
326  static int pnv_xive2_write_end(Xive2Router *xrtr, uint8_t blk, uint32_t idx,
327                                 Xive2End *end, uint8_t word_number)
328  {
329      return pnv_xive2_vst_write(PNV_XIVE2(xrtr), VST_END, blk, idx, end,
330                                word_number);
331  }
332  
333  static int pnv_xive2_end_update(PnvXive2 *xive)
334  {
335      uint8_t  blk = GETFIELD(VC_ENDC_WATCH_BLOCK_ID,
336                             xive->vc_regs[(VC_ENDC_WATCH0_SPEC >> 3)]);
337      uint32_t idx = GETFIELD(VC_ENDC_WATCH_INDEX,
338                             xive->vc_regs[(VC_ENDC_WATCH0_SPEC >> 3)]);
339      int i;
340      uint64_t endc_watch[4];
341  
342      for (i = 0; i < ARRAY_SIZE(endc_watch); i++) {
343          endc_watch[i] =
344              cpu_to_be64(xive->vc_regs[(VC_ENDC_WATCH0_DATA0 >> 3) + i]);
345      }
346  
347      return pnv_xive2_vst_write(xive, VST_END, blk, idx, endc_watch,
348                                XIVE_VST_WORD_ALL);
349  }
350  
351  static void pnv_xive2_end_cache_load(PnvXive2 *xive)
352  {
353      uint8_t  blk = GETFIELD(VC_ENDC_WATCH_BLOCK_ID,
354                             xive->vc_regs[(VC_ENDC_WATCH0_SPEC >> 3)]);
355      uint32_t idx = GETFIELD(VC_ENDC_WATCH_INDEX,
356                             xive->vc_regs[(VC_ENDC_WATCH0_SPEC >> 3)]);
357      uint64_t endc_watch[4] = { 0 };
358      int i;
359  
360      if (pnv_xive2_vst_read(xive, VST_END, blk, idx, endc_watch)) {
361          xive2_error(xive, "VST: no END entry %x/%x !?", blk, idx);
362      }
363  
364      for (i = 0; i < ARRAY_SIZE(endc_watch); i++) {
365          xive->vc_regs[(VC_ENDC_WATCH0_DATA0 >> 3) + i] =
366              be64_to_cpu(endc_watch[i]);
367      }
368  }
369  
370  static int pnv_xive2_get_nvp(Xive2Router *xrtr, uint8_t blk, uint32_t idx,
371                               Xive2Nvp *nvp)
372  {
373      return pnv_xive2_vst_read(PNV_XIVE2(xrtr), VST_NVP, blk, idx, nvp);
374  }
375  
376  static int pnv_xive2_write_nvp(Xive2Router *xrtr, uint8_t blk, uint32_t idx,
377                                 Xive2Nvp *nvp, uint8_t word_number)
378  {
379      return pnv_xive2_vst_write(PNV_XIVE2(xrtr), VST_NVP, blk, idx, nvp,
380                                word_number);
381  }
382  
383  static int pnv_xive2_nvp_update(PnvXive2 *xive)
384  {
385      uint8_t  blk = GETFIELD(PC_NXC_WATCH_BLOCK_ID,
386                              xive->pc_regs[(PC_NXC_WATCH0_SPEC >> 3)]);
387      uint32_t idx = GETFIELD(PC_NXC_WATCH_INDEX,
388                              xive->pc_regs[(PC_NXC_WATCH0_SPEC >> 3)]);
389      int i;
390      uint64_t nxc_watch[4];
391  
392      for (i = 0; i < ARRAY_SIZE(nxc_watch); i++) {
393          nxc_watch[i] =
394              cpu_to_be64(xive->pc_regs[(PC_NXC_WATCH0_DATA0 >> 3) + i]);
395      }
396  
397      return pnv_xive2_vst_write(xive, VST_NVP, blk, idx, nxc_watch,
398                                XIVE_VST_WORD_ALL);
399  }
400  
401  static void pnv_xive2_nvp_cache_load(PnvXive2 *xive)
402  {
403      uint8_t  blk = GETFIELD(PC_NXC_WATCH_BLOCK_ID,
404                             xive->pc_regs[(PC_NXC_WATCH0_SPEC >> 3)]);
405      uint32_t idx = GETFIELD(PC_NXC_WATCH_INDEX,
406                             xive->pc_regs[(PC_NXC_WATCH0_SPEC >> 3)]);
407      uint64_t nxc_watch[4] = { 0 };
408      int i;
409  
410      if (pnv_xive2_vst_read(xive, VST_NVP, blk, idx, nxc_watch)) {
411          xive2_error(xive, "VST: no NVP entry %x/%x !?", blk, idx);
412      }
413  
414      for (i = 0; i < ARRAY_SIZE(nxc_watch); i++) {
415          xive->pc_regs[(PC_NXC_WATCH0_DATA0 >> 3) + i] =
416              be64_to_cpu(nxc_watch[i]);
417      }
418  }
419  
420  static int pnv_xive2_get_eas(Xive2Router *xrtr, uint8_t blk, uint32_t idx,
421                              Xive2Eas *eas)
422  {
423      PnvXive2 *xive = PNV_XIVE2(xrtr);
424  
425      if (pnv_xive2_block_id(xive) != blk) {
426          xive2_error(xive, "VST: EAS %x is remote !?", XIVE_EAS(blk, idx));
427          return -1;
428      }
429  
430      return pnv_xive2_vst_read(xive, VST_EAS, blk, idx, eas);
431  }
432  
433  static uint32_t pnv_xive2_get_config(Xive2Router *xrtr)
434  {
435      PnvXive2 *xive = PNV_XIVE2(xrtr);
436      uint32_t cfg = 0;
437  
438      if (xive->cq_regs[CQ_XIVE_CFG >> 3] & CQ_XIVE_CFG_GEN1_TIMA_OS) {
439          cfg |= XIVE2_GEN1_TIMA_OS;
440      }
441  
442      if (xive->cq_regs[CQ_XIVE_CFG >> 3] & CQ_XIVE_CFG_EN_VP_SAVE_RESTORE) {
443          cfg |= XIVE2_VP_SAVE_RESTORE;
444      }
445  
446      if (GETFIELD(CQ_XIVE_CFG_HYP_HARD_RANGE,
447                xive->cq_regs[CQ_XIVE_CFG >> 3]) == CQ_XIVE_CFG_THREADID_8BITS) {
448          cfg |= XIVE2_THREADID_8BITS;
449      }
450  
451      return cfg;
452  }
453  
454  static bool pnv_xive2_is_cpu_enabled(PnvXive2 *xive, PowerPCCPU *cpu)
455  {
456      int pir = ppc_cpu_pir(cpu);
457      uint32_t fc = PNV10_PIR2FUSEDCORE(pir);
458      uint64_t reg = fc < 8 ? TCTXT_EN0 : TCTXT_EN1;
459      uint32_t bit = pir & 0x3f;
460  
461      return xive->tctxt_regs[reg >> 3] & PPC_BIT(bit);
462  }
463  
464  static int pnv_xive2_match_nvt(XivePresenter *xptr, uint8_t format,
465                                 uint8_t nvt_blk, uint32_t nvt_idx,
466                                 bool cam_ignore, uint8_t priority,
467                                 uint32_t logic_serv, XiveTCTXMatch *match)
468  {
469      PnvXive2 *xive = PNV_XIVE2(xptr);
470      PnvChip *chip = xive->chip;
471      int count = 0;
472      int i, j;
473      bool gen1_tima_os =
474          xive->cq_regs[CQ_XIVE_CFG >> 3] & CQ_XIVE_CFG_GEN1_TIMA_OS;
475  
476      for (i = 0; i < chip->nr_cores; i++) {
477          PnvCore *pc = chip->cores[i];
478          CPUCore *cc = CPU_CORE(pc);
479  
480          for (j = 0; j < cc->nr_threads; j++) {
481              PowerPCCPU *cpu = pc->threads[j];
482              XiveTCTX *tctx;
483              int ring;
484  
485              if (!pnv_xive2_is_cpu_enabled(xive, cpu)) {
486                  continue;
487              }
488  
489              tctx = XIVE_TCTX(pnv_cpu_state(cpu)->intc);
490  
491              if (gen1_tima_os) {
492                  ring = xive_presenter_tctx_match(xptr, tctx, format, nvt_blk,
493                                                   nvt_idx, cam_ignore,
494                                                   logic_serv);
495              } else {
496                  ring = xive2_presenter_tctx_match(xptr, tctx, format, nvt_blk,
497                                                     nvt_idx, cam_ignore,
498                                                     logic_serv);
499              }
500  
501              /*
502               * Save the context and follow on to catch duplicates,
503               * that we don't support yet.
504               */
505              if (ring != -1) {
506                  if (match->tctx) {
507                      qemu_log_mask(LOG_GUEST_ERROR, "XIVE: already found a "
508                                    "thread context NVT %x/%x\n",
509                                    nvt_blk, nvt_idx);
510                      return false;
511                  }
512  
513                  match->ring = ring;
514                  match->tctx = tctx;
515                  count++;
516              }
517          }
518      }
519  
520      return count;
521  }
522  
523  static uint32_t pnv_xive2_presenter_get_config(XivePresenter *xptr)
524  {
525      PnvXive2 *xive = PNV_XIVE2(xptr);
526      uint32_t cfg = 0;
527  
528      if (xive->cq_regs[CQ_XIVE_CFG >> 3] & CQ_XIVE_CFG_GEN1_TIMA_OS) {
529          cfg |= XIVE_PRESENTER_GEN1_TIMA_OS;
530      }
531      return cfg;
532  }
533  
534  static uint8_t pnv_xive2_get_block_id(Xive2Router *xrtr)
535  {
536      return pnv_xive2_block_id(PNV_XIVE2(xrtr));
537  }
538  
539  /*
540   * The TIMA MMIO space is shared among the chips and to identify the
541   * chip from which the access is being done, we extract the chip id
542   * from the PIR.
543   */
544  static PnvXive2 *pnv_xive2_tm_get_xive(PowerPCCPU *cpu)
545  {
546      int pir = ppc_cpu_pir(cpu);
547      XivePresenter *xptr = XIVE_TCTX(pnv_cpu_state(cpu)->intc)->xptr;
548      PnvXive2 *xive = PNV_XIVE2(xptr);
549  
550      if (!pnv_xive2_is_cpu_enabled(xive, cpu)) {
551          xive2_error(xive, "IC: CPU %x is not enabled", pir);
552      }
553      return xive;
554  }
555  
556  /*
557   * The internal sources of the interrupt controller have no knowledge
558   * of the XIVE2 chip on which they reside. Encode the block id in the
559   * source interrupt number before forwarding the source event
560   * notification to the Router. This is required on a multichip system.
561   */
562  static void pnv_xive2_notify(XiveNotifier *xn, uint32_t srcno, bool pq_checked)
563  {
564      PnvXive2 *xive = PNV_XIVE2(xn);
565      uint8_t blk = pnv_xive2_block_id(xive);
566  
567      xive2_router_notify(xn, XIVE_EAS(blk, srcno), pq_checked);
568  }
569  
570  /*
571   * Set Translation Tables
572   *
573   * TODO add support for multiple sets
574   */
575  static int pnv_xive2_stt_set_data(PnvXive2 *xive, uint64_t val)
576  {
577      uint8_t tsel = GETFIELD(CQ_TAR_SELECT, xive->cq_regs[CQ_TAR >> 3]);
578      uint8_t entry = GETFIELD(CQ_TAR_ENTRY_SELECT,
579                                    xive->cq_regs[CQ_TAR >> 3]);
580  
581      switch (tsel) {
582      case CQ_TAR_NVPG:
583      case CQ_TAR_ESB:
584      case CQ_TAR_END:
585          xive->tables[tsel][entry] = val;
586          break;
587      default:
588          xive2_error(xive, "IC: unsupported table %d", tsel);
589          return -1;
590      }
591  
592      if (xive->cq_regs[CQ_TAR >> 3] & CQ_TAR_AUTOINC) {
593          xive->cq_regs[CQ_TAR >> 3] = SETFIELD(CQ_TAR_ENTRY_SELECT,
594                       xive->cq_regs[CQ_TAR >> 3], ++entry);
595      }
596  
597      return 0;
598  }
599  /*
600   * Virtual Structure Tables (VST) configuration
601   */
602  static void pnv_xive2_vst_set_exclusive(PnvXive2 *xive, uint8_t type,
603                                          uint8_t blk, uint64_t vsd)
604  {
605      Xive2EndSource *end_xsrc = &xive->end_source;
606      XiveSource *xsrc = &xive->ipi_source;
607      const XiveVstInfo *info = &vst_infos[type];
608      uint32_t page_shift = GETFIELD(VSD_TSIZE, vsd) + 12;
609      uint64_t vst_tsize = 1ull << page_shift;
610      uint64_t vst_addr = vsd & VSD_ADDRESS_MASK;
611  
612      /* Basic checks */
613  
614      if (VSD_INDIRECT & vsd) {
615          if (!pnv_xive2_vst_page_size_allowed(page_shift)) {
616              xive2_error(xive, "VST: invalid %s page shift %d", info->name,
617                         page_shift);
618              return;
619          }
620      }
621  
622      if (!QEMU_IS_ALIGNED(vst_addr, 1ull << page_shift)) {
623          xive2_error(xive, "VST: %s table address 0x%"PRIx64
624                      " is not aligned with page shift %d",
625                      info->name, vst_addr, page_shift);
626          return;
627      }
628  
629      /* Record the table configuration (in SRAM on HW) */
630      xive->vsds[type][blk] = vsd;
631  
632      /* Now tune the models with the configuration provided by the FW */
633  
634      switch (type) {
635      case VST_ESB:
636          /*
637           * Backing store pages for the source PQ bits. The model does
638           * not use these PQ bits backed in RAM because the XiveSource
639           * model has its own.
640           *
641           * If the table is direct, we can compute the number of PQ
642           * entries provisioned by FW (such as skiboot) and resize the
643           * ESB window accordingly.
644           */
645          if (!(VSD_INDIRECT & vsd)) {
646              memory_region_set_size(&xsrc->esb_mmio, vst_tsize * SBE_PER_BYTE
647                                     * (1ull << xsrc->esb_shift));
648          }
649  
650          memory_region_add_subregion(&xive->esb_mmio, 0, &xsrc->esb_mmio);
651          break;
652  
653      case VST_EAS:  /* Nothing to be done */
654          break;
655  
656      case VST_END:
657          /*
658           * Backing store pages for the END.
659           */
660          if (!(VSD_INDIRECT & vsd)) {
661              memory_region_set_size(&end_xsrc->esb_mmio, (vst_tsize / info->size)
662                                     * (1ull << end_xsrc->esb_shift));
663          }
664          memory_region_add_subregion(&xive->end_mmio, 0, &end_xsrc->esb_mmio);
665          break;
666  
667      case VST_NVP:  /* Not modeled */
668      case VST_NVG:  /* Not modeled */
669      case VST_NVC:  /* Not modeled */
670      case VST_IC:   /* Not modeled */
671      case VST_SYNC: /* Not modeled */
672      case VST_ERQ:  /* Not modeled */
673          break;
674  
675      default:
676          g_assert_not_reached();
677      }
678  }
679  
680  /*
681   * Both PC and VC sub-engines are configured as each use the Virtual
682   * Structure Tables
683   */
684  static void pnv_xive2_vst_set_data(PnvXive2 *xive, uint64_t vsd)
685  {
686      uint8_t mode = GETFIELD(VSD_MODE, vsd);
687      uint8_t type = GETFIELD(VC_VSD_TABLE_SELECT,
688                              xive->vc_regs[VC_VSD_TABLE_ADDR >> 3]);
689      uint8_t blk = GETFIELD(VC_VSD_TABLE_ADDRESS,
690                             xive->vc_regs[VC_VSD_TABLE_ADDR >> 3]);
691      uint64_t vst_addr = vsd & VSD_ADDRESS_MASK;
692  
693      if (type > VST_ERQ) {
694          xive2_error(xive, "VST: invalid table type %d", type);
695          return;
696      }
697  
698      if (blk >= vst_infos[type].max_blocks) {
699          xive2_error(xive, "VST: invalid block id %d for"
700                        " %s table", blk, vst_infos[type].name);
701          return;
702      }
703  
704      if (!vst_addr) {
705          xive2_error(xive, "VST: invalid %s table address",
706                     vst_infos[type].name);
707          return;
708      }
709  
710      switch (mode) {
711      case VSD_MODE_FORWARD:
712          xive->vsds[type][blk] = vsd;
713          break;
714  
715      case VSD_MODE_EXCLUSIVE:
716          pnv_xive2_vst_set_exclusive(xive, type, blk, vsd);
717          break;
718  
719      default:
720          xive2_error(xive, "VST: unsupported table mode %d", mode);
721          return;
722      }
723  }
724  
725  /*
726   * MMIO handlers
727   */
728  
729  
730  /*
731   * IC BAR layout
732   *
733   * Page 0: Internal CQ register accesses (reads & writes)
734   * Page 1: Internal PC register accesses (reads & writes)
735   * Page 2: Internal VC register accesses (reads & writes)
736   * Page 3: Internal TCTXT (TIMA) reg accesses (read & writes)
737   * Page 4: Notify Port page (writes only, w/data),
738   * Page 5: Reserved
739   * Page 6: Sync Poll page (writes only, dataless)
740   * Page 7: Sync Inject page (writes only, dataless)
741   * Page 8: LSI Trigger page (writes only, dataless)
742   * Page 9: LSI SB Management page (reads & writes dataless)
743   * Pages 10-255: Reserved
744   * Pages 256-383: Direct mapped Thread Context Area (reads & writes)
745   *                covering the 128 threads in P10.
746   * Pages 384-511: Reserved
747   */
748  typedef struct PnvXive2Region {
749      const char *name;
750      uint32_t pgoff;
751      uint32_t pgsize;
752      const MemoryRegionOps *ops;
753  } PnvXive2Region;
754  
755  static const MemoryRegionOps pnv_xive2_ic_cq_ops;
756  static const MemoryRegionOps pnv_xive2_ic_pc_ops;
757  static const MemoryRegionOps pnv_xive2_ic_vc_ops;
758  static const MemoryRegionOps pnv_xive2_ic_tctxt_ops;
759  static const MemoryRegionOps pnv_xive2_ic_notify_ops;
760  static const MemoryRegionOps pnv_xive2_ic_sync_ops;
761  static const MemoryRegionOps pnv_xive2_ic_lsi_ops;
762  static const MemoryRegionOps pnv_xive2_ic_tm_indirect_ops;
763  
764  /* 512 pages. 4K: 2M range, 64K: 32M range */
765  static const PnvXive2Region pnv_xive2_ic_regions[] = {
766      { "xive-ic-cq",        0,   1,   &pnv_xive2_ic_cq_ops     },
767      { "xive-ic-vc",        1,   1,   &pnv_xive2_ic_vc_ops     },
768      { "xive-ic-pc",        2,   1,   &pnv_xive2_ic_pc_ops     },
769      { "xive-ic-tctxt",     3,   1,   &pnv_xive2_ic_tctxt_ops  },
770      { "xive-ic-notify",    4,   1,   &pnv_xive2_ic_notify_ops },
771      /* page 5 reserved */
772      { "xive-ic-sync",      6,   2,   &pnv_xive2_ic_sync_ops   },
773      { "xive-ic-lsi",       8,   2,   &pnv_xive2_ic_lsi_ops    },
774      /* pages 10-255 reserved */
775      { "xive-ic-tm-indirect", 256, 128, &pnv_xive2_ic_tm_indirect_ops  },
776      /* pages 384-511 reserved */
777  };
778  
779  /*
780   * CQ operations
781   */
782  
783  static uint64_t pnv_xive2_ic_cq_read(void *opaque, hwaddr offset,
784                                          unsigned size)
785  {
786      PnvXive2 *xive = PNV_XIVE2(opaque);
787      uint32_t reg = offset >> 3;
788      uint64_t val = 0;
789  
790      switch (offset) {
791      case CQ_XIVE_CAP: /* Set at reset */
792      case CQ_XIVE_CFG:
793          val = xive->cq_regs[reg];
794          break;
795      case CQ_MSGSND: /* TODO check the #cores of the machine */
796          val = 0xffffffff00000000;
797          break;
798      case CQ_CFG_PB_GEN:
799          val = CQ_CFG_PB_GEN_PB_INIT; /* TODO: fix CQ_CFG_PB_GEN default value */
800          break;
801      default:
802          xive2_error(xive, "CQ: invalid read @%"HWADDR_PRIx, offset);
803      }
804  
805      return val;
806  }
807  
808  static uint64_t pnv_xive2_bar_size(uint64_t val)
809  {
810      return 1ull << (GETFIELD(CQ_BAR_RANGE, val) + 24);
811  }
812  
813  static void pnv_xive2_ic_cq_write(void *opaque, hwaddr offset,
814                                    uint64_t val, unsigned size)
815  {
816      PnvXive2 *xive = PNV_XIVE2(opaque);
817      MemoryRegion *sysmem = get_system_memory();
818      uint32_t reg = offset >> 3;
819      int i;
820  
821      switch (offset) {
822      case CQ_XIVE_CFG:
823      case CQ_RST_CTL: /* TODO: reset all BARs */
824          break;
825  
826      case CQ_IC_BAR:
827          xive->ic_shift = val & CQ_IC_BAR_64K ? 16 : 12;
828          if (!(val & CQ_IC_BAR_VALID)) {
829              xive->ic_base = 0;
830              if (xive->cq_regs[reg] & CQ_IC_BAR_VALID) {
831                  for (i = 0; i < ARRAY_SIZE(xive->ic_mmios); i++) {
832                      memory_region_del_subregion(&xive->ic_mmio,
833                                                  &xive->ic_mmios[i]);
834                  }
835                  memory_region_del_subregion(sysmem, &xive->ic_mmio);
836              }
837          } else {
838              xive->ic_base = val & ~(CQ_IC_BAR_VALID | CQ_IC_BAR_64K);
839              if (!(xive->cq_regs[reg] & CQ_IC_BAR_VALID)) {
840                  for (i = 0; i < ARRAY_SIZE(xive->ic_mmios); i++) {
841                      memory_region_add_subregion(&xive->ic_mmio,
842                                 pnv_xive2_ic_regions[i].pgoff << xive->ic_shift,
843                                 &xive->ic_mmios[i]);
844                  }
845                  memory_region_add_subregion(sysmem, xive->ic_base,
846                                              &xive->ic_mmio);
847              }
848          }
849          break;
850  
851      case CQ_TM_BAR:
852          xive->tm_shift = val & CQ_TM_BAR_64K ? 16 : 12;
853          if (!(val & CQ_TM_BAR_VALID)) {
854              xive->tm_base = 0;
855              if (xive->cq_regs[reg] & CQ_TM_BAR_VALID) {
856                  memory_region_del_subregion(sysmem, &xive->tm_mmio);
857              }
858          } else {
859              xive->tm_base = val & ~(CQ_TM_BAR_VALID | CQ_TM_BAR_64K);
860              if (!(xive->cq_regs[reg] & CQ_TM_BAR_VALID)) {
861                  memory_region_add_subregion(sysmem, xive->tm_base,
862                                              &xive->tm_mmio);
863              }
864          }
865          break;
866  
867      case CQ_ESB_BAR:
868          xive->esb_shift = val & CQ_BAR_64K ? 16 : 12;
869          if (!(val & CQ_BAR_VALID)) {
870              xive->esb_base = 0;
871              if (xive->cq_regs[reg] & CQ_BAR_VALID) {
872                  memory_region_del_subregion(sysmem, &xive->esb_mmio);
873              }
874          } else {
875              xive->esb_base = val & CQ_BAR_ADDR;
876              if (!(xive->cq_regs[reg] & CQ_BAR_VALID)) {
877                  memory_region_set_size(&xive->esb_mmio,
878                                         pnv_xive2_bar_size(val));
879                  memory_region_add_subregion(sysmem, xive->esb_base,
880                                              &xive->esb_mmio);
881              }
882          }
883          break;
884  
885      case CQ_END_BAR:
886          xive->end_shift = val & CQ_BAR_64K ? 16 : 12;
887          if (!(val & CQ_BAR_VALID)) {
888              xive->end_base = 0;
889              if (xive->cq_regs[reg] & CQ_BAR_VALID) {
890                  memory_region_del_subregion(sysmem, &xive->end_mmio);
891              }
892          } else {
893              xive->end_base = val & CQ_BAR_ADDR;
894              if (!(xive->cq_regs[reg] & CQ_BAR_VALID)) {
895                  memory_region_set_size(&xive->end_mmio,
896                                         pnv_xive2_bar_size(val));
897                  memory_region_add_subregion(sysmem, xive->end_base,
898                                              &xive->end_mmio);
899              }
900          }
901          break;
902  
903      case CQ_NVC_BAR:
904          xive->nvc_shift = val & CQ_BAR_64K ? 16 : 12;
905          if (!(val & CQ_BAR_VALID)) {
906              xive->nvc_base = 0;
907              if (xive->cq_regs[reg] & CQ_BAR_VALID) {
908                  memory_region_del_subregion(sysmem, &xive->nvc_mmio);
909              }
910          } else {
911              xive->nvc_base = val & CQ_BAR_ADDR;
912              if (!(xive->cq_regs[reg] & CQ_BAR_VALID)) {
913                  memory_region_set_size(&xive->nvc_mmio,
914                                         pnv_xive2_bar_size(val));
915                  memory_region_add_subregion(sysmem, xive->nvc_base,
916                                              &xive->nvc_mmio);
917              }
918          }
919          break;
920  
921      case CQ_NVPG_BAR:
922          xive->nvpg_shift = val & CQ_BAR_64K ? 16 : 12;
923          if (!(val & CQ_BAR_VALID)) {
924              xive->nvpg_base = 0;
925              if (xive->cq_regs[reg] & CQ_BAR_VALID) {
926                  memory_region_del_subregion(sysmem, &xive->nvpg_mmio);
927              }
928          } else {
929              xive->nvpg_base = val & CQ_BAR_ADDR;
930              if (!(xive->cq_regs[reg] & CQ_BAR_VALID)) {
931                  memory_region_set_size(&xive->nvpg_mmio,
932                                         pnv_xive2_bar_size(val));
933                  memory_region_add_subregion(sysmem, xive->nvpg_base,
934                                              &xive->nvpg_mmio);
935              }
936          }
937          break;
938  
939      case CQ_TAR: /* Set Translation Table Address */
940          break;
941      case CQ_TDR: /* Set Translation Table Data */
942          pnv_xive2_stt_set_data(xive, val);
943          break;
944      case CQ_FIRMASK_OR: /* FIR error reporting */
945          break;
946      default:
947          xive2_error(xive, "CQ: invalid write 0x%"HWADDR_PRIx, offset);
948          return;
949      }
950  
951      xive->cq_regs[reg] = val;
952  }
953  
954  static const MemoryRegionOps pnv_xive2_ic_cq_ops = {
955      .read = pnv_xive2_ic_cq_read,
956      .write = pnv_xive2_ic_cq_write,
957      .endianness = DEVICE_BIG_ENDIAN,
958      .valid = {
959          .min_access_size = 8,
960          .max_access_size = 8,
961      },
962      .impl = {
963          .min_access_size = 8,
964          .max_access_size = 8,
965      },
966  };
967  
968  static uint64_t pnv_xive2_ic_vc_read(void *opaque, hwaddr offset,
969                                       unsigned size)
970  {
971      PnvXive2 *xive = PNV_XIVE2(opaque);
972      uint64_t val = 0;
973      uint32_t reg = offset >> 3;
974  
975      switch (offset) {
976      /*
977       * VSD table settings.
978       */
979      case VC_VSD_TABLE_ADDR:
980      case VC_VSD_TABLE_DATA:
981          val = xive->vc_regs[reg];
982          break;
983  
984      /*
985       * ESB cache updates (not modeled)
986       */
987      case VC_ESBC_FLUSH_CTRL:
988          xive->vc_regs[reg] &= ~VC_ESBC_FLUSH_CTRL_POLL_VALID;
989          val = xive->vc_regs[reg];
990          break;
991  
992      case VC_ESBC_CFG:
993          val = xive->vc_regs[reg];
994          break;
995  
996      /*
997       * EAS cache updates (not modeled)
998       */
999      case VC_EASC_FLUSH_CTRL:
1000          xive->vc_regs[reg] &= ~VC_EASC_FLUSH_CTRL_POLL_VALID;
1001          val = xive->vc_regs[reg];
1002          break;
1003  
1004      /*
1005       * END cache updates
1006       */
1007      case VC_ENDC_WATCH0_SPEC:
1008          xive->vc_regs[reg] &= ~(VC_ENDC_WATCH_FULL | VC_ENDC_WATCH_CONFLICT);
1009          val = xive->vc_regs[reg];
1010          break;
1011  
1012      case VC_ENDC_WATCH0_DATA0:
1013          /*
1014           * Load DATA registers from cache with data requested by the
1015           * SPEC register
1016           */
1017          pnv_xive2_end_cache_load(xive);
1018          val = xive->vc_regs[reg];
1019          break;
1020  
1021      case VC_ENDC_WATCH0_DATA1 ... VC_ENDC_WATCH0_DATA3:
1022          val = xive->vc_regs[reg];
1023          break;
1024  
1025      case VC_ENDC_FLUSH_CTRL:
1026          xive->vc_regs[reg] &= ~VC_ENDC_FLUSH_CTRL_POLL_VALID;
1027          val = xive->vc_regs[reg];
1028          break;
1029  
1030      /*
1031       * Indirect invalidation
1032       */
1033      case VC_AT_MACRO_KILL_MASK:
1034          val = xive->vc_regs[reg];
1035          break;
1036  
1037      case VC_AT_MACRO_KILL:
1038          xive->vc_regs[reg] &= ~VC_AT_MACRO_KILL_VALID;
1039          val = xive->vc_regs[reg];
1040          break;
1041  
1042      /*
1043       * Interrupt fifo overflow in memory backing store (Not modeled)
1044       */
1045      case VC_QUEUES_CFG_REM0 ... VC_QUEUES_CFG_REM6:
1046          val = xive->vc_regs[reg];
1047          break;
1048  
1049      /*
1050       * Synchronisation
1051       */
1052      case VC_ENDC_SYNC_DONE:
1053          val = VC_ENDC_SYNC_POLL_DONE;
1054          break;
1055      default:
1056          xive2_error(xive, "VC: invalid read @%"HWADDR_PRIx, offset);
1057      }
1058  
1059      return val;
1060  }
1061  
1062  static void pnv_xive2_ic_vc_write(void *opaque, hwaddr offset,
1063                                    uint64_t val, unsigned size)
1064  {
1065      PnvXive2 *xive = PNV_XIVE2(opaque);
1066      uint32_t reg = offset >> 3;
1067  
1068      switch (offset) {
1069      /*
1070       * VSD table settings.
1071       */
1072      case VC_VSD_TABLE_ADDR:
1073         break;
1074      case VC_VSD_TABLE_DATA:
1075          pnv_xive2_vst_set_data(xive, val);
1076          break;
1077  
1078      /*
1079       * ESB cache updates (not modeled)
1080       */
1081      /* case VC_ESBC_FLUSH_CTRL: */
1082      case VC_ESBC_FLUSH_POLL:
1083          xive->vc_regs[VC_ESBC_FLUSH_CTRL >> 3] |= VC_ESBC_FLUSH_CTRL_POLL_VALID;
1084          /* ESB update */
1085          break;
1086  
1087      case VC_ESBC_CFG:
1088          break;
1089  
1090      /*
1091       * EAS cache updates (not modeled)
1092       */
1093      /* case VC_EASC_FLUSH_CTRL: */
1094      case VC_EASC_FLUSH_POLL:
1095          xive->vc_regs[VC_EASC_FLUSH_CTRL >> 3] |= VC_EASC_FLUSH_CTRL_POLL_VALID;
1096          /* EAS update */
1097          break;
1098  
1099      /*
1100       * END cache updates
1101       */
1102      case VC_ENDC_WATCH0_SPEC:
1103           val &= ~VC_ENDC_WATCH_CONFLICT; /* HW will set this bit */
1104          break;
1105  
1106      case VC_ENDC_WATCH0_DATA1 ... VC_ENDC_WATCH0_DATA3:
1107          break;
1108      case VC_ENDC_WATCH0_DATA0:
1109          /* writing to DATA0 triggers the cache write */
1110          xive->vc_regs[reg] = val;
1111          pnv_xive2_end_update(xive);
1112          break;
1113  
1114  
1115      /* case VC_ENDC_FLUSH_CTRL: */
1116      case VC_ENDC_FLUSH_POLL:
1117          xive->vc_regs[VC_ENDC_FLUSH_CTRL >> 3] |= VC_ENDC_FLUSH_CTRL_POLL_VALID;
1118          break;
1119  
1120      /*
1121       * Indirect invalidation
1122       */
1123      case VC_AT_MACRO_KILL:
1124      case VC_AT_MACRO_KILL_MASK:
1125          break;
1126  
1127      /*
1128       * Interrupt fifo overflow in memory backing store (Not modeled)
1129       */
1130      case VC_QUEUES_CFG_REM0 ... VC_QUEUES_CFG_REM6:
1131          break;
1132  
1133      /*
1134       * Synchronisation
1135       */
1136      case VC_ENDC_SYNC_DONE:
1137          break;
1138  
1139      default:
1140          xive2_error(xive, "VC: invalid write @%"HWADDR_PRIx, offset);
1141          return;
1142      }
1143  
1144      xive->vc_regs[reg] = val;
1145  }
1146  
1147  static const MemoryRegionOps pnv_xive2_ic_vc_ops = {
1148      .read = pnv_xive2_ic_vc_read,
1149      .write = pnv_xive2_ic_vc_write,
1150      .endianness = DEVICE_BIG_ENDIAN,
1151      .valid = {
1152          .min_access_size = 8,
1153          .max_access_size = 8,
1154      },
1155      .impl = {
1156          .min_access_size = 8,
1157          .max_access_size = 8,
1158      },
1159  };
1160  
1161  static uint64_t pnv_xive2_ic_pc_read(void *opaque, hwaddr offset,
1162                                       unsigned size)
1163  {
1164      PnvXive2 *xive = PNV_XIVE2(opaque);
1165      uint64_t val = -1;
1166      uint32_t reg = offset >> 3;
1167  
1168      switch (offset) {
1169      /*
1170       * VSD table settings.
1171       */
1172      case PC_VSD_TABLE_ADDR:
1173      case PC_VSD_TABLE_DATA:
1174          val = xive->pc_regs[reg];
1175          break;
1176  
1177      /*
1178       * cache updates
1179       */
1180      case PC_NXC_WATCH0_SPEC:
1181          xive->pc_regs[reg] &= ~(PC_NXC_WATCH_FULL | PC_NXC_WATCH_CONFLICT);
1182          val = xive->pc_regs[reg];
1183          break;
1184  
1185      case PC_NXC_WATCH0_DATA0:
1186         /*
1187          * Load DATA registers from cache with data requested by the
1188          * SPEC register
1189          */
1190          pnv_xive2_nvp_cache_load(xive);
1191          val = xive->pc_regs[reg];
1192          break;
1193  
1194      case PC_NXC_WATCH0_DATA1 ... PC_NXC_WATCH0_DATA3:
1195          val = xive->pc_regs[reg];
1196          break;
1197  
1198      case PC_NXC_FLUSH_CTRL:
1199          xive->pc_regs[reg] &= ~PC_NXC_FLUSH_CTRL_POLL_VALID;
1200          val = xive->pc_regs[reg];
1201          break;
1202  
1203      /*
1204       * Indirect invalidation
1205       */
1206      case PC_AT_KILL:
1207          xive->pc_regs[reg] &= ~PC_AT_KILL_VALID;
1208          val = xive->pc_regs[reg];
1209          break;
1210  
1211      default:
1212          xive2_error(xive, "PC: invalid read @%"HWADDR_PRIx, offset);
1213      }
1214  
1215      return val;
1216  }
1217  
1218  static void pnv_xive2_ic_pc_write(void *opaque, hwaddr offset,
1219                                    uint64_t val, unsigned size)
1220  {
1221      PnvXive2 *xive = PNV_XIVE2(opaque);
1222      uint32_t reg = offset >> 3;
1223  
1224      switch (offset) {
1225  
1226      /*
1227       * VSD table settings. Only taken into account in the VC
1228       * sub-engine because the Xive2Router model combines both VC and PC
1229       * sub-engines
1230       */
1231      case PC_VSD_TABLE_ADDR:
1232      case PC_VSD_TABLE_DATA:
1233          break;
1234  
1235      /*
1236       * cache updates
1237       */
1238      case PC_NXC_WATCH0_SPEC:
1239          val &= ~PC_NXC_WATCH_CONFLICT; /* HW will set this bit */
1240          break;
1241  
1242      case PC_NXC_WATCH0_DATA1 ... PC_NXC_WATCH0_DATA3:
1243          break;
1244      case PC_NXC_WATCH0_DATA0:
1245          /* writing to DATA0 triggers the cache write */
1246          xive->pc_regs[reg] = val;
1247          pnv_xive2_nvp_update(xive);
1248          break;
1249  
1250     /* case PC_NXC_FLUSH_CTRL: */
1251      case PC_NXC_FLUSH_POLL:
1252          xive->pc_regs[PC_NXC_FLUSH_CTRL >> 3] |= PC_NXC_FLUSH_CTRL_POLL_VALID;
1253          break;
1254  
1255      /*
1256       * Indirect invalidation
1257       */
1258      case PC_AT_KILL:
1259      case PC_AT_KILL_MASK:
1260          break;
1261  
1262      default:
1263          xive2_error(xive, "PC: invalid write @%"HWADDR_PRIx, offset);
1264          return;
1265      }
1266  
1267      xive->pc_regs[reg] = val;
1268  }
1269  
1270  static const MemoryRegionOps pnv_xive2_ic_pc_ops = {
1271      .read = pnv_xive2_ic_pc_read,
1272      .write = pnv_xive2_ic_pc_write,
1273      .endianness = DEVICE_BIG_ENDIAN,
1274      .valid = {
1275          .min_access_size = 8,
1276          .max_access_size = 8,
1277      },
1278      .impl = {
1279          .min_access_size = 8,
1280          .max_access_size = 8,
1281      },
1282  };
1283  
1284  
1285  static uint64_t pnv_xive2_ic_tctxt_read(void *opaque, hwaddr offset,
1286                                          unsigned size)
1287  {
1288      PnvXive2 *xive = PNV_XIVE2(opaque);
1289      uint64_t val = -1;
1290      uint32_t reg = offset >> 3;
1291  
1292      switch (offset) {
1293      /*
1294       * XIVE2 hardware thread enablement
1295       */
1296      case TCTXT_EN0:
1297      case TCTXT_EN1:
1298          val = xive->tctxt_regs[reg];
1299          break;
1300  
1301      case TCTXT_EN0_SET:
1302      case TCTXT_EN0_RESET:
1303          val = xive->tctxt_regs[TCTXT_EN0 >> 3];
1304          break;
1305      case TCTXT_EN1_SET:
1306      case TCTXT_EN1_RESET:
1307          val = xive->tctxt_regs[TCTXT_EN1 >> 3];
1308          break;
1309      case TCTXT_CFG:
1310          val = xive->tctxt_regs[reg];
1311          break;
1312      default:
1313          xive2_error(xive, "TCTXT: invalid read @%"HWADDR_PRIx, offset);
1314      }
1315  
1316      return val;
1317  }
1318  
1319  static void pnv_xive2_ic_tctxt_write(void *opaque, hwaddr offset,
1320                                       uint64_t val, unsigned size)
1321  {
1322      PnvXive2 *xive = PNV_XIVE2(opaque);
1323      uint32_t reg = offset >> 3;
1324  
1325      switch (offset) {
1326      /*
1327       * XIVE2 hardware thread enablement
1328       */
1329      case TCTXT_EN0: /* Physical Thread Enable */
1330      case TCTXT_EN1: /* Physical Thread Enable (fused core) */
1331          xive->tctxt_regs[reg] = val;
1332          break;
1333  
1334      case TCTXT_EN0_SET:
1335          xive->tctxt_regs[TCTXT_EN0 >> 3] |= val;
1336          break;
1337      case TCTXT_EN1_SET:
1338          xive->tctxt_regs[TCTXT_EN1 >> 3] |= val;
1339          break;
1340      case TCTXT_EN0_RESET:
1341          xive->tctxt_regs[TCTXT_EN0 >> 3] &= ~val;
1342          break;
1343      case TCTXT_EN1_RESET:
1344          xive->tctxt_regs[TCTXT_EN1 >> 3] &= ~val;
1345          break;
1346      case TCTXT_CFG:
1347          xive->tctxt_regs[reg] = val;
1348          break;
1349      default:
1350          xive2_error(xive, "TCTXT: invalid write @%"HWADDR_PRIx, offset);
1351          return;
1352      }
1353  }
1354  
1355  static const MemoryRegionOps pnv_xive2_ic_tctxt_ops = {
1356      .read = pnv_xive2_ic_tctxt_read,
1357      .write = pnv_xive2_ic_tctxt_write,
1358      .endianness = DEVICE_BIG_ENDIAN,
1359      .valid = {
1360          .min_access_size = 8,
1361          .max_access_size = 8,
1362      },
1363      .impl = {
1364          .min_access_size = 8,
1365          .max_access_size = 8,
1366      },
1367  };
1368  
1369  /*
1370   * Redirect XSCOM to MMIO handlers
1371   */
1372  static uint64_t pnv_xive2_xscom_read(void *opaque, hwaddr offset,
1373                                       unsigned size)
1374  {
1375      PnvXive2 *xive = PNV_XIVE2(opaque);
1376      uint64_t val = -1;
1377      uint32_t xscom_reg = offset >> 3;
1378      uint32_t mmio_offset = (xscom_reg & 0xFF) << 3;
1379  
1380      switch (xscom_reg) {
1381      case 0x000 ... 0x0FF:
1382          val = pnv_xive2_ic_cq_read(opaque, mmio_offset, size);
1383          break;
1384      case 0x100 ... 0x1FF:
1385          val = pnv_xive2_ic_vc_read(opaque, mmio_offset, size);
1386          break;
1387      case 0x200 ... 0x2FF:
1388          val = pnv_xive2_ic_pc_read(opaque, mmio_offset, size);
1389          break;
1390      case 0x300 ... 0x3FF:
1391          val = pnv_xive2_ic_tctxt_read(opaque, mmio_offset, size);
1392          break;
1393      default:
1394          xive2_error(xive, "XSCOM: invalid read @%"HWADDR_PRIx, offset);
1395      }
1396  
1397      return val;
1398  }
1399  
1400  static void pnv_xive2_xscom_write(void *opaque, hwaddr offset,
1401                                    uint64_t val, unsigned size)
1402  {
1403      PnvXive2 *xive = PNV_XIVE2(opaque);
1404      uint32_t xscom_reg = offset >> 3;
1405      uint32_t mmio_offset = (xscom_reg & 0xFF) << 3;
1406  
1407      switch (xscom_reg) {
1408      case 0x000 ... 0x0FF:
1409          pnv_xive2_ic_cq_write(opaque, mmio_offset, val, size);
1410          break;
1411      case 0x100 ... 0x1FF:
1412          pnv_xive2_ic_vc_write(opaque, mmio_offset, val, size);
1413          break;
1414      case 0x200 ... 0x2FF:
1415          pnv_xive2_ic_pc_write(opaque, mmio_offset, val, size);
1416          break;
1417      case 0x300 ... 0x3FF:
1418          pnv_xive2_ic_tctxt_write(opaque, mmio_offset, val, size);
1419          break;
1420      default:
1421          xive2_error(xive, "XSCOM: invalid write @%"HWADDR_PRIx, offset);
1422      }
1423  }
1424  
1425  static const MemoryRegionOps pnv_xive2_xscom_ops = {
1426      .read = pnv_xive2_xscom_read,
1427      .write = pnv_xive2_xscom_write,
1428      .endianness = DEVICE_BIG_ENDIAN,
1429      .valid = {
1430          .min_access_size = 8,
1431          .max_access_size = 8,
1432      },
1433      .impl = {
1434          .min_access_size = 8,
1435          .max_access_size = 8,
1436      },
1437  };
1438  
1439  /*
1440   * Notify port page. The layout is compatible between 4K and 64K pages :
1441   *
1442   * Page 1           Notify page (writes only)
1443   *  0x000 - 0x7FF   IPI interrupt (NPU)
1444   *  0x800 - 0xFFF   HW interrupt triggers (PSI, PHB)
1445   */
1446  
1447  static void pnv_xive2_ic_hw_trigger(PnvXive2 *xive, hwaddr addr,
1448                                      uint64_t val)
1449  {
1450      uint8_t blk;
1451      uint32_t idx;
1452  
1453      if (val & XIVE_TRIGGER_END) {
1454          xive2_error(xive, "IC: END trigger at @0x%"HWADDR_PRIx" data 0x%"PRIx64,
1455                     addr, val);
1456          return;
1457      }
1458  
1459      /*
1460       * Forward the source event notification directly to the Router.
1461       * The source interrupt number should already be correctly encoded
1462       * with the chip block id by the sending device (PHB, PSI).
1463       */
1464      blk = XIVE_EAS_BLOCK(val);
1465      idx = XIVE_EAS_INDEX(val);
1466  
1467      xive2_router_notify(XIVE_NOTIFIER(xive), XIVE_EAS(blk, idx),
1468                           !!(val & XIVE_TRIGGER_PQ));
1469  }
1470  
1471  static void pnv_xive2_ic_notify_write(void *opaque, hwaddr offset,
1472                                        uint64_t val, unsigned size)
1473  {
1474      PnvXive2 *xive = PNV_XIVE2(opaque);
1475  
1476      /* VC: IPI triggers */
1477      switch (offset) {
1478      case 0x000 ... 0x7FF:
1479          /* TODO: check IPI notify sub-page routing */
1480          pnv_xive2_ic_hw_trigger(opaque, offset, val);
1481          break;
1482  
1483      /* VC: HW triggers */
1484      case 0x800 ... 0xFFF:
1485          pnv_xive2_ic_hw_trigger(opaque, offset, val);
1486          break;
1487  
1488      default:
1489          xive2_error(xive, "NOTIFY: invalid write @%"HWADDR_PRIx, offset);
1490      }
1491  }
1492  
1493  static uint64_t pnv_xive2_ic_notify_read(void *opaque, hwaddr offset,
1494                                           unsigned size)
1495  {
1496      PnvXive2 *xive = PNV_XIVE2(opaque);
1497  
1498     /* loads are invalid */
1499      xive2_error(xive, "NOTIFY: invalid read @%"HWADDR_PRIx, offset);
1500      return -1;
1501  }
1502  
1503  static const MemoryRegionOps pnv_xive2_ic_notify_ops = {
1504      .read = pnv_xive2_ic_notify_read,
1505      .write = pnv_xive2_ic_notify_write,
1506      .endianness = DEVICE_BIG_ENDIAN,
1507      .valid = {
1508          .min_access_size = 8,
1509          .max_access_size = 8,
1510      },
1511      .impl = {
1512          .min_access_size = 8,
1513          .max_access_size = 8,
1514      },
1515  };
1516  
1517  static uint64_t pnv_xive2_ic_lsi_read(void *opaque, hwaddr offset,
1518                                        unsigned size)
1519  {
1520      PnvXive2 *xive = PNV_XIVE2(opaque);
1521  
1522      xive2_error(xive, "LSI: invalid read @%"HWADDR_PRIx, offset);
1523      return -1;
1524  }
1525  
1526  static void pnv_xive2_ic_lsi_write(void *opaque, hwaddr offset,
1527                                     uint64_t val, unsigned size)
1528  {
1529      PnvXive2 *xive = PNV_XIVE2(opaque);
1530  
1531      xive2_error(xive, "LSI: invalid write @%"HWADDR_PRIx, offset);
1532  }
1533  
1534  static const MemoryRegionOps pnv_xive2_ic_lsi_ops = {
1535      .read = pnv_xive2_ic_lsi_read,
1536      .write = pnv_xive2_ic_lsi_write,
1537      .endianness = DEVICE_BIG_ENDIAN,
1538      .valid = {
1539          .min_access_size = 8,
1540          .max_access_size = 8,
1541      },
1542      .impl = {
1543          .min_access_size = 8,
1544          .max_access_size = 8,
1545      },
1546  };
1547  
1548  /*
1549   * Sync MMIO page (write only)
1550   */
1551  #define PNV_XIVE2_SYNC_IPI      0x000
1552  #define PNV_XIVE2_SYNC_HW       0x080
1553  #define PNV_XIVE2_SYNC_NxC      0x100
1554  #define PNV_XIVE2_SYNC_INT      0x180
1555  #define PNV_XIVE2_SYNC_OS_ESC   0x200
1556  #define PNV_XIVE2_SYNC_POOL_ESC 0x280
1557  #define PNV_XIVE2_SYNC_HARD_ESC 0x300
1558  
1559  static uint64_t pnv_xive2_ic_sync_read(void *opaque, hwaddr offset,
1560                                         unsigned size)
1561  {
1562      PnvXive2 *xive = PNV_XIVE2(opaque);
1563  
1564      /* loads are invalid */
1565      xive2_error(xive, "SYNC: invalid read @%"HWADDR_PRIx, offset);
1566      return -1;
1567  }
1568  
1569  static void pnv_xive2_ic_sync_write(void *opaque, hwaddr offset,
1570                                      uint64_t val, unsigned size)
1571  {
1572      PnvXive2 *xive = PNV_XIVE2(opaque);
1573  
1574      switch (offset) {
1575      case PNV_XIVE2_SYNC_IPI:
1576      case PNV_XIVE2_SYNC_HW:
1577      case PNV_XIVE2_SYNC_NxC:
1578      case PNV_XIVE2_SYNC_INT:
1579      case PNV_XIVE2_SYNC_OS_ESC:
1580      case PNV_XIVE2_SYNC_POOL_ESC:
1581      case PNV_XIVE2_SYNC_HARD_ESC:
1582          break;
1583      default:
1584          xive2_error(xive, "SYNC: invalid write @%"HWADDR_PRIx, offset);
1585      }
1586  }
1587  
1588  static const MemoryRegionOps pnv_xive2_ic_sync_ops = {
1589      .read = pnv_xive2_ic_sync_read,
1590      .write = pnv_xive2_ic_sync_write,
1591      .endianness = DEVICE_BIG_ENDIAN,
1592      .valid = {
1593          .min_access_size = 8,
1594          .max_access_size = 8,
1595      },
1596      .impl = {
1597          .min_access_size = 8,
1598          .max_access_size = 8,
1599      },
1600  };
1601  
1602  /*
1603   * When the TM direct pages of the IC controller are accessed, the
1604   * target HW thread is deduced from the page offset.
1605   */
1606  static uint32_t pnv_xive2_ic_tm_get_pir(PnvXive2 *xive, hwaddr offset)
1607  {
1608      /* On P10, the node ID shift in the PIR register is 8 bits */
1609      return xive->chip->chip_id << 8 | offset >> xive->ic_shift;
1610  }
1611  
1612  static uint32_t pnv_xive2_ic_tm_get_hw_page_offset(PnvXive2 *xive,
1613                                                     hwaddr offset)
1614  {
1615      /*
1616       * Indirect TIMA accesses are similar to direct accesses for
1617       * privilege ring 0. So remove any traces of the hw thread ID from
1618       * the offset in the IC BAR as it could be interpreted as the ring
1619       * privilege when calling the underlying direct access functions.
1620       */
1621      return offset & ((1ull << xive->ic_shift) - 1);
1622  }
1623  
1624  static XiveTCTX *pnv_xive2_get_indirect_tctx(PnvXive2 *xive, uint32_t pir)
1625  {
1626      PnvChip *chip = xive->chip;
1627      PowerPCCPU *cpu = NULL;
1628  
1629      cpu = pnv_chip_find_cpu(chip, pir);
1630      if (!cpu) {
1631          xive2_error(xive, "IC: invalid PIR %x for indirect access", pir);
1632          return NULL;
1633      }
1634  
1635      if (!pnv_xive2_is_cpu_enabled(xive, cpu)) {
1636          xive2_error(xive, "IC: CPU %x is not enabled", pir);
1637      }
1638  
1639      return XIVE_TCTX(pnv_cpu_state(cpu)->intc);
1640  }
1641  
1642  static uint64_t pnv_xive2_ic_tm_indirect_read(void *opaque, hwaddr offset,
1643                                                unsigned size)
1644  {
1645      PnvXive2 *xive = PNV_XIVE2(opaque);
1646      XivePresenter *xptr = XIVE_PRESENTER(xive);
1647      hwaddr hw_page_offset;
1648      uint32_t pir;
1649      XiveTCTX *tctx;
1650      uint64_t val = -1;
1651  
1652      pir = pnv_xive2_ic_tm_get_pir(xive, offset);
1653      hw_page_offset = pnv_xive2_ic_tm_get_hw_page_offset(xive, offset);
1654      tctx = pnv_xive2_get_indirect_tctx(xive, pir);
1655      if (tctx) {
1656          val = xive_tctx_tm_read(xptr, tctx, hw_page_offset, size);
1657      }
1658  
1659      return val;
1660  }
1661  
1662  static void pnv_xive2_ic_tm_indirect_write(void *opaque, hwaddr offset,
1663                                             uint64_t val, unsigned size)
1664  {
1665      PnvXive2 *xive = PNV_XIVE2(opaque);
1666      XivePresenter *xptr = XIVE_PRESENTER(xive);
1667      hwaddr hw_page_offset;
1668      uint32_t pir;
1669      XiveTCTX *tctx;
1670  
1671      pir = pnv_xive2_ic_tm_get_pir(xive, offset);
1672      hw_page_offset = pnv_xive2_ic_tm_get_hw_page_offset(xive, offset);
1673      tctx = pnv_xive2_get_indirect_tctx(xive, pir);
1674      if (tctx) {
1675          xive_tctx_tm_write(xptr, tctx, hw_page_offset, val, size);
1676      }
1677  }
1678  
1679  static const MemoryRegionOps pnv_xive2_ic_tm_indirect_ops = {
1680      .read = pnv_xive2_ic_tm_indirect_read,
1681      .write = pnv_xive2_ic_tm_indirect_write,
1682      .endianness = DEVICE_BIG_ENDIAN,
1683      .valid = {
1684          .min_access_size = 1,
1685          .max_access_size = 8,
1686      },
1687      .impl = {
1688          .min_access_size = 1,
1689          .max_access_size = 8,
1690      },
1691  };
1692  
1693  /*
1694   * TIMA ops
1695   */
1696  static void pnv_xive2_tm_write(void *opaque, hwaddr offset,
1697                                 uint64_t value, unsigned size)
1698  {
1699      PowerPCCPU *cpu = POWERPC_CPU(current_cpu);
1700      PnvXive2 *xive = pnv_xive2_tm_get_xive(cpu);
1701      XiveTCTX *tctx = XIVE_TCTX(pnv_cpu_state(cpu)->intc);
1702      XivePresenter *xptr = XIVE_PRESENTER(xive);
1703  
1704      xive_tctx_tm_write(xptr, tctx, offset, value, size);
1705  }
1706  
1707  static uint64_t pnv_xive2_tm_read(void *opaque, hwaddr offset, unsigned size)
1708  {
1709      PowerPCCPU *cpu = POWERPC_CPU(current_cpu);
1710      PnvXive2 *xive = pnv_xive2_tm_get_xive(cpu);
1711      XiveTCTX *tctx = XIVE_TCTX(pnv_cpu_state(cpu)->intc);
1712      XivePresenter *xptr = XIVE_PRESENTER(xive);
1713  
1714      return xive_tctx_tm_read(xptr, tctx, offset, size);
1715  }
1716  
1717  static const MemoryRegionOps pnv_xive2_tm_ops = {
1718      .read = pnv_xive2_tm_read,
1719      .write = pnv_xive2_tm_write,
1720      .endianness = DEVICE_BIG_ENDIAN,
1721      .valid = {
1722          .min_access_size = 1,
1723          .max_access_size = 8,
1724      },
1725      .impl = {
1726          .min_access_size = 1,
1727          .max_access_size = 8,
1728      },
1729  };
1730  
1731  static uint64_t pnv_xive2_nvc_read(void *opaque, hwaddr offset,
1732                                     unsigned size)
1733  {
1734      PnvXive2 *xive = PNV_XIVE2(opaque);
1735  
1736      xive2_error(xive, "NVC: invalid read @%"HWADDR_PRIx, offset);
1737      return -1;
1738  }
1739  
1740  static void pnv_xive2_nvc_write(void *opaque, hwaddr offset,
1741                                  uint64_t val, unsigned size)
1742  {
1743      PnvXive2 *xive = PNV_XIVE2(opaque);
1744  
1745      xive2_error(xive, "NVC: invalid write @%"HWADDR_PRIx, offset);
1746  }
1747  
1748  static const MemoryRegionOps pnv_xive2_nvc_ops = {
1749      .read = pnv_xive2_nvc_read,
1750      .write = pnv_xive2_nvc_write,
1751      .endianness = DEVICE_BIG_ENDIAN,
1752      .valid = {
1753          .min_access_size = 8,
1754          .max_access_size = 8,
1755      },
1756      .impl = {
1757          .min_access_size = 8,
1758          .max_access_size = 8,
1759      },
1760  };
1761  
1762  static uint64_t pnv_xive2_nvpg_read(void *opaque, hwaddr offset,
1763                                      unsigned size)
1764  {
1765      PnvXive2 *xive = PNV_XIVE2(opaque);
1766  
1767      xive2_error(xive, "NVPG: invalid read @%"HWADDR_PRIx, offset);
1768      return -1;
1769  }
1770  
1771  static void pnv_xive2_nvpg_write(void *opaque, hwaddr offset,
1772                                   uint64_t val, unsigned size)
1773  {
1774      PnvXive2 *xive = PNV_XIVE2(opaque);
1775  
1776      xive2_error(xive, "NVPG: invalid write @%"HWADDR_PRIx, offset);
1777  }
1778  
1779  static const MemoryRegionOps pnv_xive2_nvpg_ops = {
1780      .read = pnv_xive2_nvpg_read,
1781      .write = pnv_xive2_nvpg_write,
1782      .endianness = DEVICE_BIG_ENDIAN,
1783      .valid = {
1784          .min_access_size = 8,
1785          .max_access_size = 8,
1786      },
1787      .impl = {
1788          .min_access_size = 8,
1789          .max_access_size = 8,
1790      },
1791  };
1792  
1793  /*
1794   * POWER10 default capabilities: 0x2000120076f000FC
1795   */
1796  #define PNV_XIVE2_CAPABILITIES  0x2000120076f000FC
1797  
1798  /*
1799   * POWER10 default configuration: 0x0030000033000000
1800   *
1801   * 8bits thread id was dropped for P10
1802   */
1803  #define PNV_XIVE2_CONFIGURATION 0x0030000033000000
1804  
1805  static void pnv_xive2_reset(void *dev)
1806  {
1807      PnvXive2 *xive = PNV_XIVE2(dev);
1808      XiveSource *xsrc = &xive->ipi_source;
1809      Xive2EndSource *end_xsrc = &xive->end_source;
1810  
1811      xive->cq_regs[CQ_XIVE_CAP >> 3] = xive->capabilities;
1812      xive->cq_regs[CQ_XIVE_CFG >> 3] = xive->config;
1813  
1814      /* HW hardwires the #Topology of the chip in the block field */
1815      xive->cq_regs[CQ_XIVE_CFG >> 3] |=
1816          SETFIELD(CQ_XIVE_CFG_HYP_HARD_BLOCK_ID, 0ull, xive->chip->chip_id);
1817  
1818      /* Set default page size to 64k */
1819      xive->ic_shift = xive->esb_shift = xive->end_shift = 16;
1820      xive->nvc_shift = xive->nvpg_shift = xive->tm_shift = 16;
1821  
1822      /* Clear source MMIOs */
1823      if (memory_region_is_mapped(&xsrc->esb_mmio)) {
1824          memory_region_del_subregion(&xive->esb_mmio, &xsrc->esb_mmio);
1825      }
1826  
1827      if (memory_region_is_mapped(&end_xsrc->esb_mmio)) {
1828          memory_region_del_subregion(&xive->end_mmio, &end_xsrc->esb_mmio);
1829      }
1830  }
1831  
1832  /*
1833   *  Maximum number of IRQs and ENDs supported by HW. Will be tuned by
1834   *  software.
1835   */
1836  #define PNV_XIVE2_NR_IRQS (PNV10_XIVE2_ESB_SIZE / (1ull << XIVE_ESB_64K_2PAGE))
1837  #define PNV_XIVE2_NR_ENDS (PNV10_XIVE2_END_SIZE / (1ull << XIVE_ESB_64K_2PAGE))
1838  
1839  static void pnv_xive2_realize(DeviceState *dev, Error **errp)
1840  {
1841      PnvXive2 *xive = PNV_XIVE2(dev);
1842      PnvXive2Class *pxc = PNV_XIVE2_GET_CLASS(dev);
1843      XiveSource *xsrc = &xive->ipi_source;
1844      Xive2EndSource *end_xsrc = &xive->end_source;
1845      Error *local_err = NULL;
1846      int i;
1847  
1848      pxc->parent_realize(dev, &local_err);
1849      if (local_err) {
1850          error_propagate(errp, local_err);
1851          return;
1852      }
1853  
1854      assert(xive->chip);
1855  
1856      /*
1857       * The XiveSource and Xive2EndSource objects are realized with the
1858       * maximum allowed HW configuration. The ESB MMIO regions will be
1859       * resized dynamically when the controller is configured by the FW
1860       * to limit accesses to resources not provisioned.
1861       */
1862      object_property_set_int(OBJECT(xsrc), "flags", XIVE_SRC_STORE_EOI,
1863                              &error_fatal);
1864      object_property_set_int(OBJECT(xsrc), "nr-irqs", PNV_XIVE2_NR_IRQS,
1865                              &error_fatal);
1866      object_property_set_link(OBJECT(xsrc), "xive", OBJECT(xive),
1867                               &error_fatal);
1868      qdev_realize(DEVICE(xsrc), NULL, &local_err);
1869      if (local_err) {
1870          error_propagate(errp, local_err);
1871          return;
1872      }
1873  
1874      object_property_set_int(OBJECT(end_xsrc), "nr-ends", PNV_XIVE2_NR_ENDS,
1875                              &error_fatal);
1876      object_property_set_link(OBJECT(end_xsrc), "xive", OBJECT(xive),
1877                               &error_abort);
1878      qdev_realize(DEVICE(end_xsrc), NULL, &local_err);
1879      if (local_err) {
1880          error_propagate(errp, local_err);
1881          return;
1882      }
1883  
1884      /* XSCOM region, used for initial configuration of the BARs */
1885      memory_region_init_io(&xive->xscom_regs, OBJECT(dev),
1886                            &pnv_xive2_xscom_ops, xive, "xscom-xive",
1887                            PNV10_XSCOM_XIVE2_SIZE << 3);
1888  
1889      /* Interrupt controller MMIO regions */
1890      xive->ic_shift = 16;
1891      memory_region_init(&xive->ic_mmio, OBJECT(dev), "xive-ic",
1892                         PNV10_XIVE2_IC_SIZE);
1893  
1894      for (i = 0; i < ARRAY_SIZE(xive->ic_mmios); i++) {
1895          memory_region_init_io(&xive->ic_mmios[i], OBJECT(dev),
1896                           pnv_xive2_ic_regions[i].ops, xive,
1897                           pnv_xive2_ic_regions[i].name,
1898                           pnv_xive2_ic_regions[i].pgsize << xive->ic_shift);
1899      }
1900  
1901      /*
1902       * VC MMIO regions.
1903       */
1904      xive->esb_shift = 16;
1905      xive->end_shift = 16;
1906      memory_region_init(&xive->esb_mmio, OBJECT(xive), "xive-esb",
1907                         PNV10_XIVE2_ESB_SIZE);
1908      memory_region_init(&xive->end_mmio, OBJECT(xive), "xive-end",
1909                         PNV10_XIVE2_END_SIZE);
1910  
1911      /* Presenter Controller MMIO region (not modeled) */
1912      xive->nvc_shift = 16;
1913      xive->nvpg_shift = 16;
1914      memory_region_init_io(&xive->nvc_mmio, OBJECT(dev),
1915                            &pnv_xive2_nvc_ops, xive,
1916                            "xive-nvc", PNV10_XIVE2_NVC_SIZE);
1917  
1918      memory_region_init_io(&xive->nvpg_mmio, OBJECT(dev),
1919                            &pnv_xive2_nvpg_ops, xive,
1920                            "xive-nvpg", PNV10_XIVE2_NVPG_SIZE);
1921  
1922      /* Thread Interrupt Management Area (Direct) */
1923      xive->tm_shift = 16;
1924      memory_region_init_io(&xive->tm_mmio, OBJECT(dev), &pnv_xive2_tm_ops,
1925                            xive, "xive-tima", PNV10_XIVE2_TM_SIZE);
1926  
1927      qemu_register_reset(pnv_xive2_reset, dev);
1928  }
1929  
1930  static Property pnv_xive2_properties[] = {
1931      DEFINE_PROP_UINT64("ic-bar", PnvXive2, ic_base, 0),
1932      DEFINE_PROP_UINT64("esb-bar", PnvXive2, esb_base, 0),
1933      DEFINE_PROP_UINT64("end-bar", PnvXive2, end_base, 0),
1934      DEFINE_PROP_UINT64("nvc-bar", PnvXive2, nvc_base, 0),
1935      DEFINE_PROP_UINT64("nvpg-bar", PnvXive2, nvpg_base, 0),
1936      DEFINE_PROP_UINT64("tm-bar", PnvXive2, tm_base, 0),
1937      DEFINE_PROP_UINT64("capabilities", PnvXive2, capabilities,
1938                         PNV_XIVE2_CAPABILITIES),
1939      DEFINE_PROP_UINT64("config", PnvXive2, config,
1940                         PNV_XIVE2_CONFIGURATION),
1941      DEFINE_PROP_LINK("chip", PnvXive2, chip, TYPE_PNV_CHIP, PnvChip *),
1942      DEFINE_PROP_END_OF_LIST(),
1943  };
1944  
1945  static void pnv_xive2_instance_init(Object *obj)
1946  {
1947      PnvXive2 *xive = PNV_XIVE2(obj);
1948  
1949      object_initialize_child(obj, "ipi_source", &xive->ipi_source,
1950                              TYPE_XIVE_SOURCE);
1951      object_initialize_child(obj, "end_source", &xive->end_source,
1952                              TYPE_XIVE2_END_SOURCE);
1953  }
1954  
1955  static int pnv_xive2_dt_xscom(PnvXScomInterface *dev, void *fdt,
1956                                int xscom_offset)
1957  {
1958      const char compat_p10[] = "ibm,power10-xive-x";
1959      char *name;
1960      int offset;
1961      uint32_t reg[] = {
1962          cpu_to_be32(PNV10_XSCOM_XIVE2_BASE),
1963          cpu_to_be32(PNV10_XSCOM_XIVE2_SIZE)
1964      };
1965  
1966      name = g_strdup_printf("xive@%x", PNV10_XSCOM_XIVE2_BASE);
1967      offset = fdt_add_subnode(fdt, xscom_offset, name);
1968      _FDT(offset);
1969      g_free(name);
1970  
1971      _FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg))));
1972      _FDT(fdt_setprop(fdt, offset, "compatible", compat_p10,
1973                       sizeof(compat_p10)));
1974      return 0;
1975  }
1976  
1977  static void pnv_xive2_class_init(ObjectClass *klass, void *data)
1978  {
1979      DeviceClass *dc = DEVICE_CLASS(klass);
1980      PnvXScomInterfaceClass *xdc = PNV_XSCOM_INTERFACE_CLASS(klass);
1981      Xive2RouterClass *xrc = XIVE2_ROUTER_CLASS(klass);
1982      XiveNotifierClass *xnc = XIVE_NOTIFIER_CLASS(klass);
1983      XivePresenterClass *xpc = XIVE_PRESENTER_CLASS(klass);
1984      PnvXive2Class *pxc = PNV_XIVE2_CLASS(klass);
1985  
1986      xdc->dt_xscom  = pnv_xive2_dt_xscom;
1987  
1988      dc->desc       = "PowerNV XIVE2 Interrupt Controller (POWER10)";
1989      device_class_set_parent_realize(dc, pnv_xive2_realize,
1990                                      &pxc->parent_realize);
1991      device_class_set_props(dc, pnv_xive2_properties);
1992  
1993      xrc->get_eas   = pnv_xive2_get_eas;
1994      xrc->get_pq    = pnv_xive2_get_pq;
1995      xrc->set_pq    = pnv_xive2_set_pq;
1996      xrc->get_end   = pnv_xive2_get_end;
1997      xrc->write_end = pnv_xive2_write_end;
1998      xrc->get_nvp   = pnv_xive2_get_nvp;
1999      xrc->write_nvp = pnv_xive2_write_nvp;
2000      xrc->get_config  = pnv_xive2_get_config;
2001      xrc->get_block_id = pnv_xive2_get_block_id;
2002  
2003      xnc->notify    = pnv_xive2_notify;
2004  
2005      xpc->match_nvt  = pnv_xive2_match_nvt;
2006      xpc->get_config = pnv_xive2_presenter_get_config;
2007  };
2008  
2009  static const TypeInfo pnv_xive2_info = {
2010      .name          = TYPE_PNV_XIVE2,
2011      .parent        = TYPE_XIVE2_ROUTER,
2012      .instance_init = pnv_xive2_instance_init,
2013      .instance_size = sizeof(PnvXive2),
2014      .class_init    = pnv_xive2_class_init,
2015      .class_size    = sizeof(PnvXive2Class),
2016      .interfaces    = (InterfaceInfo[]) {
2017          { TYPE_PNV_XSCOM_INTERFACE },
2018          { }
2019      }
2020  };
2021  
2022  static void pnv_xive2_register_types(void)
2023  {
2024      type_register_static(&pnv_xive2_info);
2025  }
2026  
2027  type_init(pnv_xive2_register_types)
2028  
2029  static void xive2_nvp_pic_print_info(Xive2Nvp *nvp, uint32_t nvp_idx,
2030                                       Monitor *mon)
2031  {
2032      uint8_t  eq_blk = xive_get_field32(NVP2_W5_VP_END_BLOCK, nvp->w5);
2033      uint32_t eq_idx = xive_get_field32(NVP2_W5_VP_END_INDEX, nvp->w5);
2034  
2035      if (!xive2_nvp_is_valid(nvp)) {
2036          return;
2037      }
2038  
2039      monitor_printf(mon, "  %08x end:%02x/%04x IPB:%02x",
2040                     nvp_idx, eq_blk, eq_idx,
2041                     xive_get_field32(NVP2_W2_IPB, nvp->w2));
2042      /*
2043       * When the NVP is HW controlled, more fields are updated
2044       */
2045      if (xive2_nvp_is_hw(nvp)) {
2046          monitor_printf(mon, " CPPR:%02x",
2047                         xive_get_field32(NVP2_W2_CPPR, nvp->w2));
2048          if (xive2_nvp_is_co(nvp)) {
2049              monitor_printf(mon, " CO:%04x",
2050                             xive_get_field32(NVP2_W1_CO_THRID, nvp->w1));
2051          }
2052      }
2053      monitor_printf(mon, "\n");
2054  }
2055  
2056  /*
2057   * If the table is direct, we can compute the number of PQ entries
2058   * provisioned by FW.
2059   */
2060  static uint32_t pnv_xive2_nr_esbs(PnvXive2 *xive)
2061  {
2062      uint8_t blk = pnv_xive2_block_id(xive);
2063      uint64_t vsd = xive->vsds[VST_ESB][blk];
2064      uint64_t vst_tsize = 1ull << (GETFIELD(VSD_TSIZE, vsd) + 12);
2065  
2066      return VSD_INDIRECT & vsd ? 0 : vst_tsize * SBE_PER_BYTE;
2067  }
2068  
2069  /*
2070   * Compute the number of entries per indirect subpage.
2071   */
2072  static uint64_t pnv_xive2_vst_per_subpage(PnvXive2 *xive, uint32_t type)
2073  {
2074      uint8_t blk = pnv_xive2_block_id(xive);
2075      uint64_t vsd = xive->vsds[type][blk];
2076      const XiveVstInfo *info = &vst_infos[type];
2077      uint64_t vsd_addr;
2078      uint32_t page_shift;
2079  
2080      /* For direct tables, fake a valid value */
2081      if (!(VSD_INDIRECT & vsd)) {
2082          return 1;
2083      }
2084  
2085      /* Get the page size of the indirect table. */
2086      vsd_addr = vsd & VSD_ADDRESS_MASK;
2087      ldq_be_dma(&address_space_memory, vsd_addr, &vsd, MEMTXATTRS_UNSPECIFIED);
2088  
2089      if (!(vsd & VSD_ADDRESS_MASK)) {
2090  #ifdef XIVE2_DEBUG
2091          xive2_error(xive, "VST: invalid %s entry!?", info->name);
2092  #endif
2093          return 0;
2094      }
2095  
2096      page_shift = GETFIELD(VSD_TSIZE, vsd) + 12;
2097  
2098      if (!pnv_xive2_vst_page_size_allowed(page_shift)) {
2099          xive2_error(xive, "VST: invalid %s page shift %d", info->name,
2100                     page_shift);
2101          return 0;
2102      }
2103  
2104      return (1ull << page_shift) / info->size;
2105  }
2106  
2107  void pnv_xive2_pic_print_info(PnvXive2 *xive, Monitor *mon)
2108  {
2109      Xive2Router *xrtr = XIVE2_ROUTER(xive);
2110      uint8_t blk = pnv_xive2_block_id(xive);
2111      uint8_t chip_id = xive->chip->chip_id;
2112      uint32_t srcno0 = XIVE_EAS(blk, 0);
2113      uint32_t nr_esbs = pnv_xive2_nr_esbs(xive);
2114      Xive2Eas eas;
2115      Xive2End end;
2116      Xive2Nvp nvp;
2117      int i;
2118      uint64_t xive_nvp_per_subpage;
2119  
2120      monitor_printf(mon, "XIVE[%x] Source %08x .. %08x\n", blk, srcno0,
2121                     srcno0 + nr_esbs - 1);
2122      xive_source_pic_print_info(&xive->ipi_source, srcno0, mon);
2123  
2124      monitor_printf(mon, "XIVE[%x] EAT %08x .. %08x\n", blk, srcno0,
2125                     srcno0 + nr_esbs - 1);
2126      for (i = 0; i < nr_esbs; i++) {
2127          if (xive2_router_get_eas(xrtr, blk, i, &eas)) {
2128              break;
2129          }
2130          if (!xive2_eas_is_masked(&eas)) {
2131              xive2_eas_pic_print_info(&eas, i, mon);
2132          }
2133      }
2134  
2135      monitor_printf(mon, "XIVE[%x] #%d END Escalation EAT\n", chip_id, blk);
2136      i = 0;
2137      while (!xive2_router_get_end(xrtr, blk, i, &end)) {
2138          xive2_end_eas_pic_print_info(&end, i++, mon);
2139      }
2140  
2141      monitor_printf(mon, "XIVE[%x] #%d ENDT\n", chip_id, blk);
2142      i = 0;
2143      while (!xive2_router_get_end(xrtr, blk, i, &end)) {
2144          xive2_end_pic_print_info(&end, i++, mon);
2145      }
2146  
2147      monitor_printf(mon, "XIVE[%x] #%d NVPT %08x .. %08x\n", chip_id, blk,
2148                     0, XIVE2_NVP_COUNT - 1);
2149      xive_nvp_per_subpage = pnv_xive2_vst_per_subpage(xive, VST_NVP);
2150      for (i = 0; i < XIVE2_NVP_COUNT; i += xive_nvp_per_subpage) {
2151          while (!xive2_router_get_nvp(xrtr, blk, i, &nvp)) {
2152              xive2_nvp_pic_print_info(&nvp, i++, mon);
2153          }
2154      }
2155  }
2156