]> git.proxmox.com Git - mirror_qemu.git/blob - include/hw/ppc/pnv_xive.h
b5d91505e53cc7c05954033fdf0ebf300fa4125b
[mirror_qemu.git] / include / hw / ppc / pnv_xive.h
1 /*
2 * QEMU PowerPC XIVE interrupt controller model
3 *
4 * Copyright (c) 2017-2019, 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 #ifndef PPC_PNV_XIVE_H
11 #define PPC_PNV_XIVE_H
12
13 #include "hw/ppc/xive.h"
14 #include "qom/object.h"
15 #include "hw/ppc/xive2.h"
16
17 struct PnvChip;
18
19 #define TYPE_PNV_XIVE "pnv-xive"
20 OBJECT_DECLARE_TYPE(PnvXive, PnvXiveClass,
21 PNV_XIVE)
22
23 #define XIVE_BLOCK_MAX 16
24
25 #define XIVE_TABLE_BLK_MAX 16 /* Block Scope Table (0-15) */
26 #define XIVE_TABLE_MIG_MAX 16 /* Migration Register Table (1-15) */
27 #define XIVE_TABLE_VDT_MAX 16 /* VDT Domain Table (0-15) */
28 #define XIVE_TABLE_EDT_MAX 64 /* EDT Domain Table (0-63) */
29
30 struct PnvXive {
31 XiveRouter parent_obj;
32
33 /* Owning chip */
34 struct PnvChip *chip;
35
36 /* XSCOM addresses giving access to the controller registers */
37 MemoryRegion xscom_regs;
38
39 /* Main MMIO regions that can be configured by FW */
40 MemoryRegion ic_mmio;
41 MemoryRegion ic_reg_mmio;
42 MemoryRegion ic_notify_mmio;
43 MemoryRegion ic_lsi_mmio;
44 MemoryRegion tm_indirect_mmio;
45 MemoryRegion vc_mmio;
46 MemoryRegion pc_mmio;
47 MemoryRegion tm_mmio;
48
49 /*
50 * IPI and END address spaces modeling the EDT segmentation in the
51 * VC region
52 */
53 AddressSpace ipi_as;
54 MemoryRegion ipi_mmio;
55 MemoryRegion ipi_edt_mmio;
56
57 AddressSpace end_as;
58 MemoryRegion end_mmio;
59 MemoryRegion end_edt_mmio;
60
61 /* Shortcut values for the Main MMIO regions */
62 hwaddr ic_base;
63 uint32_t ic_shift;
64 hwaddr vc_base;
65 uint32_t vc_shift;
66 hwaddr pc_base;
67 uint32_t pc_shift;
68 hwaddr tm_base;
69 uint32_t tm_shift;
70
71 /* Our XIVE source objects for IPIs and ENDs */
72 XiveSource ipi_source;
73 XiveENDSource end_source;
74
75 /* Interrupt controller registers */
76 uint64_t regs[0x300];
77
78 /*
79 * Virtual Structure Descriptor tables : EAT, SBE, ENDT, NVTT, IRQ
80 * These are in a SRAM protected by ECC.
81 */
82 uint64_t vsds[5][XIVE_BLOCK_MAX];
83
84 /* Translation tables */
85 uint64_t blk[XIVE_TABLE_BLK_MAX];
86 uint64_t mig[XIVE_TABLE_MIG_MAX];
87 uint64_t vdt[XIVE_TABLE_VDT_MAX];
88 uint64_t edt[XIVE_TABLE_EDT_MAX];
89 };
90
91 struct PnvXiveClass {
92 XiveRouterClass parent_class;
93
94 DeviceRealize parent_realize;
95 };
96
97 void pnv_xive_pic_print_info(PnvXive *xive, Monitor *mon);
98
99 /*
100 * XIVE2 interrupt controller (POWER10)
101 */
102 #define TYPE_PNV_XIVE2 "pnv-xive2"
103 OBJECT_DECLARE_TYPE(PnvXive2, PnvXive2Class, PNV_XIVE2);
104
105 typedef struct PnvXive2 {
106 Xive2Router parent_obj;
107
108 /* Owning chip */
109 struct PnvChip *chip;
110
111 /* XSCOM addresses giving access to the controller registers */
112 MemoryRegion xscom_regs;
113
114 MemoryRegion ic_mmio;
115 MemoryRegion ic_mmios[8];
116 MemoryRegion esb_mmio;
117 MemoryRegion end_mmio;
118 MemoryRegion nvc_mmio;
119 MemoryRegion nvpg_mmio;
120 MemoryRegion tm_mmio;
121
122 /* Shortcut values for the Main MMIO regions */
123 hwaddr ic_base;
124 uint32_t ic_shift;
125 hwaddr esb_base;
126 uint32_t esb_shift;
127 hwaddr end_base;
128 uint32_t end_shift;
129 hwaddr nvc_base;
130 uint32_t nvc_shift;
131 hwaddr nvpg_base;
132 uint32_t nvpg_shift;
133 hwaddr tm_base;
134 uint32_t tm_shift;
135
136 /* Interrupt controller registers */
137 uint64_t cq_regs[0x40];
138 uint64_t vc_regs[0x100];
139 uint64_t pc_regs[0x100];
140 uint64_t tctxt_regs[0x30];
141
142 /* To change default behavior */
143 uint64_t capabilities;
144 uint64_t config;
145
146 /* Our XIVE source objects for IPIs and ENDs */
147 XiveSource ipi_source;
148 Xive2EndSource end_source;
149
150 /*
151 * Virtual Structure Descriptor tables
152 * These are in a SRAM protected by ECC.
153 */
154 uint64_t vsds[9][XIVE_BLOCK_MAX];
155
156 /* Translation tables */
157 uint64_t tables[8][XIVE_BLOCK_MAX];
158
159 } PnvXive2;
160
161 typedef struct PnvXive2Class {
162 Xive2RouterClass parent_class;
163
164 DeviceRealize parent_realize;
165 } PnvXive2Class;
166
167 void pnv_xive2_pic_print_info(PnvXive2 *xive, Monitor *mon);
168
169 #endif /* PPC_PNV_XIVE_H */