xref: /openbmc/qemu/include/hw/ppc/xive2_regs.h (revision 6b829602e2f10f301ff8508f3a6850a0e913142c)
1f8a233deSCédric Le Goater /*
2f8a233deSCédric Le Goater  * QEMU PowerPC XIVE2 internal structure definitions (POWER10)
3f8a233deSCédric Le Goater  *
4f8a233deSCédric Le Goater  * Copyright (c) 2019-2022, IBM Corporation.
5f8a233deSCédric Le Goater  *
6f8a233deSCédric Le Goater  * This code is licensed under the GPL version 2 or later. See the
7f8a233deSCédric Le Goater  * COPYING file in the top-level directory.
8f8a233deSCédric Le Goater  */
9f8a233deSCédric Le Goater 
10f8a233deSCédric Le Goater #ifndef PPC_XIVE2_REGS_H
11f8a233deSCédric Le Goater #define PPC_XIVE2_REGS_H
12f8a233deSCédric Le Goater 
13989f3165SPhilippe Mathieu-Daudé #include "qemu/bswap.h"
1414f11a20SMarkus Armbruster 
15f8a233deSCédric Le Goater /*
16f8a233deSCédric Le Goater  * Thread Interrupt Management Area (TIMA)
17f8a233deSCédric Le Goater  *
18f8a233deSCédric Le Goater  * In Gen1 mode (P9 compat mode) word 2 is the same. However in Gen2
19f8a233deSCédric Le Goater  * mode (P10), the CAM line is slightly different as the VP space was
20f8a233deSCédric Le Goater  * increased.
21f8a233deSCédric Le Goater  */
22*81939a92SGlenn Miles #define   TM2_W2_VALID           PPC_BIT32(0)
23*81939a92SGlenn Miles #define   TM2_W2_HW              PPC_BIT32(1)
24*81939a92SGlenn Miles #define   TM2_QW0W2_VU           TM2_W2_VALID
25f8a233deSCédric Le Goater #define   TM2_QW0W2_LOGIC_SERV   PPC_BITMASK32(4, 31)
26*81939a92SGlenn Miles #define   TM2_QW1W2_VO           TM2_W2_VALID
27*81939a92SGlenn Miles #define   TM2_QW1W2_HO           TM2_W2_HW
28f8a233deSCédric Le Goater #define   TM2_QW1W2_OS_CAM       PPC_BITMASK32(4, 31)
29*81939a92SGlenn Miles #define   TM2_QW2W2_VP           TM2_W2_VALID
30*81939a92SGlenn Miles #define   TM2_QW2W2_HP           TM2_W2_HW
31f8a233deSCédric Le Goater #define   TM2_QW2W2_POOL_CAM     PPC_BITMASK32(4, 31)
32*81939a92SGlenn Miles #define   TM2_QW3W2_VT           TM2_W2_VALID
33*81939a92SGlenn Miles #define   TM2_QW3W2_HT           TM2_W2_HW
34f8a233deSCédric Le Goater #define   TM2_QW3W2_LP           PPC_BIT32(6)
35f8a233deSCédric Le Goater #define   TM2_QW3W2_LE           PPC_BIT32(7)
36f8a233deSCédric Le Goater 
37f8a233deSCédric Le Goater /*
38f8a233deSCédric Le Goater  * Event Assignment Structure (EAS)
39f8a233deSCédric Le Goater  */
40f8a233deSCédric Le Goater 
41f8a233deSCédric Le Goater typedef struct Xive2Eas {
42f8a233deSCédric Le Goater         uint64_t       w;
43f8a233deSCédric Le Goater #define EAS2_VALID                 PPC_BIT(0)
44f8a233deSCédric Le Goater #define EAS2_END_BLOCK             PPC_BITMASK(4, 7) /* Destination EQ block# */
45f8a233deSCédric Le Goater #define EAS2_END_INDEX             PPC_BITMASK(8, 31) /* Destination EQ index */
46f8a233deSCédric Le Goater #define EAS2_MASKED                PPC_BIT(32) /* Masked                 */
47f8a233deSCédric Le Goater #define EAS2_END_DATA              PPC_BITMASK(33, 63) /* written to the EQ */
48f8a233deSCédric Le Goater } Xive2Eas;
49f8a233deSCédric Le Goater 
50f8a233deSCédric Le Goater #define xive2_eas_is_valid(eas)   (be64_to_cpu((eas)->w) & EAS2_VALID)
51f8a233deSCédric Le Goater #define xive2_eas_is_masked(eas)  (be64_to_cpu((eas)->w) & EAS2_MASKED)
52f8a233deSCédric Le Goater 
5300186664SPhilippe Mathieu-Daudé void xive2_eas_pic_print_info(Xive2Eas *eas, uint32_t lisn, GString *buf);
54f8a233deSCédric Le Goater 
55f8a233deSCédric Le Goater /*
56f8a233deSCédric Le Goater  * Event Notifification Descriptor (END)
57f8a233deSCédric Le Goater  */
58f8a233deSCédric Le Goater 
59f8a233deSCédric Le Goater typedef struct Xive2End {
60f8a233deSCédric Le Goater         uint32_t       w0;
61f8a233deSCédric Le Goater #define END2_W0_VALID              PPC_BIT32(0) /* "v" bit */
62f8a233deSCédric Le Goater #define END2_W0_ENQUEUE            PPC_BIT32(5) /* "q" bit */
63f8a233deSCédric Le Goater #define END2_W0_UCOND_NOTIFY       PPC_BIT32(6) /* "n" bit */
64f8a233deSCédric Le Goater #define END2_W0_SILENT_ESCALATE    PPC_BIT32(7) /* "s" bit */
65f8a233deSCédric Le Goater #define END2_W0_BACKLOG            PPC_BIT32(8) /* "b" bit */
66f8a233deSCédric Le Goater #define END2_W0_PRECL_ESC_CTL      PPC_BIT32(9) /* "p" bit */
67f8a233deSCédric Le Goater #define END2_W0_UNCOND_ESCALATE    PPC_BIT32(10) /* "u" bit */
68f8a233deSCédric Le Goater #define END2_W0_ESCALATE_CTL       PPC_BIT32(11) /* "e" bit */
69f8a233deSCédric Le Goater #define END2_W0_ADAPTIVE_ESC       PPC_BIT32(12) /* "a" bit */
70f8a233deSCédric Le Goater #define END2_W0_ESCALATE_END       PPC_BIT32(13) /* "N" bit */
71f8a233deSCédric Le Goater #define END2_W0_FIRMWARE1          PPC_BIT32(16) /* Owned by FW */
72f8a233deSCédric Le Goater #define END2_W0_FIRMWARE2          PPC_BIT32(17) /* Owned by FW */
73f8a233deSCédric Le Goater #define END2_W0_AEC_SIZE           PPC_BITMASK32(18, 19)
74f8a233deSCédric Le Goater #define END2_W0_AEG_SIZE           PPC_BITMASK32(20, 23)
75f8a233deSCédric Le Goater #define END2_W0_EQ_VG_PREDICT      PPC_BITMASK32(24, 31) /* Owned by HW */
76f8a233deSCédric Le Goater         uint32_t       w1;
77f8a233deSCédric Le Goater #define END2_W1_ESn                PPC_BITMASK32(0, 1)
78f8a233deSCédric Le Goater #define END2_W1_ESn_P              PPC_BIT32(0)
79f8a233deSCédric Le Goater #define END2_W1_ESn_Q              PPC_BIT32(1)
80f8a233deSCédric Le Goater #define END2_W1_ESe                PPC_BITMASK32(2, 3)
81f8a233deSCédric Le Goater #define END2_W1_ESe_P              PPC_BIT32(2)
82f8a233deSCédric Le Goater #define END2_W1_ESe_Q              PPC_BIT32(3)
83f8a233deSCédric Le Goater #define END2_W1_GEN_FLIPPED        PPC_BIT32(8)
84f8a233deSCédric Le Goater #define END2_W1_GENERATION         PPC_BIT32(9)
85f8a233deSCédric Le Goater #define END2_W1_PAGE_OFF           PPC_BITMASK32(10, 31)
86f8a233deSCédric Le Goater         uint32_t       w2;
87f8a233deSCédric Le Goater #define END2_W2_RESERVED           PPC_BITMASK32(4, 7)
88f8a233deSCédric Le Goater #define END2_W2_EQ_ADDR_HI         PPC_BITMASK32(8, 31)
89f8a233deSCédric Le Goater         uint32_t       w3;
90f8a233deSCédric Le Goater #define END2_W3_EQ_ADDR_LO         PPC_BITMASK32(0, 24)
91f8a233deSCédric Le Goater #define END2_W3_QSIZE              PPC_BITMASK32(28, 31)
92f8a233deSCédric Le Goater         uint32_t       w4;
93f8a233deSCédric Le Goater #define END2_W4_END_BLOCK          PPC_BITMASK32(4, 7)
94f8a233deSCédric Le Goater #define END2_W4_ESC_END_INDEX      PPC_BITMASK32(8, 31)
95f8a233deSCédric Le Goater #define END2_W4_ESB_BLOCK          PPC_BITMASK32(0, 3)
96f8a233deSCédric Le Goater #define END2_W4_ESC_ESB_INDEX      PPC_BITMASK32(4, 31)
97f8a233deSCédric Le Goater         uint32_t       w5;
98f8a233deSCédric Le Goater #define END2_W5_ESC_END_DATA       PPC_BITMASK32(1, 31)
99f8a233deSCédric Le Goater         uint32_t       w6;
100f8a233deSCédric Le Goater #define END2_W6_FORMAT_BIT         PPC_BIT32(0)
101f8a233deSCédric Le Goater #define END2_W6_IGNORE             PPC_BIT32(1)
1025fc9c717SFrederic Barrat #define END2_W6_CROWD              PPC_BIT32(2)
103f8a233deSCédric Le Goater #define END2_W6_VP_BLOCK           PPC_BITMASK32(4, 7)
104f8a233deSCédric Le Goater #define END2_W6_VP_OFFSET          PPC_BITMASK32(8, 31)
105f8a233deSCédric Le Goater #define END2_W6_VP_OFFSET_GEN1     PPC_BITMASK32(13, 31)
106f8a233deSCédric Le Goater         uint32_t       w7;
107f8a233deSCédric Le Goater #define END2_W7_TOPO               PPC_BITMASK32(0, 3) /* Owned by HW */
108f8a233deSCédric Le Goater #define END2_W7_F0_PRIORITY        PPC_BITMASK32(8, 15)
109f8a233deSCédric Le Goater #define END2_W7_F1_LOG_SERVER_ID   PPC_BITMASK32(4, 31)
110f8a233deSCédric Le Goater } Xive2End;
111f8a233deSCédric Le Goater 
112f8a233deSCédric Le Goater #define xive2_end_is_valid(end)    (be32_to_cpu((end)->w0) & END2_W0_VALID)
113f8a233deSCédric Le Goater #define xive2_end_is_enqueue(end)  (be32_to_cpu((end)->w0) & END2_W0_ENQUEUE)
114f8a233deSCédric Le Goater #define xive2_end_is_notify(end)                \
115f8a233deSCédric Le Goater     (be32_to_cpu((end)->w0) & END2_W0_UCOND_NOTIFY)
116f8a233deSCédric Le Goater #define xive2_end_is_backlog(end)  (be32_to_cpu((end)->w0) & END2_W0_BACKLOG)
1175fc9c717SFrederic Barrat #define xive2_end_is_precluded_escalation(end)          \
1185fc9c717SFrederic Barrat     (be32_to_cpu((end)->w0) & END2_W0_PRECL_ESC_CTL)
119f8a233deSCédric Le Goater #define xive2_end_is_escalate(end)                      \
120f8a233deSCédric Le Goater     (be32_to_cpu((end)->w0) & END2_W0_ESCALATE_CTL)
121f8a233deSCédric Le Goater #define xive2_end_is_uncond_escalation(end)              \
122f8a233deSCédric Le Goater     (be32_to_cpu((end)->w0) & END2_W0_UNCOND_ESCALATE)
123f8a233deSCédric Le Goater #define xive2_end_is_silent_escalation(end)              \
124f8a233deSCédric Le Goater     (be32_to_cpu((end)->w0) & END2_W0_SILENT_ESCALATE)
125f8a233deSCédric Le Goater #define xive2_end_is_escalate_end(end)              \
126f8a233deSCédric Le Goater     (be32_to_cpu((end)->w0) & END2_W0_ESCALATE_END)
127f8a233deSCédric Le Goater #define xive2_end_is_firmware1(end)              \
128f8a233deSCédric Le Goater     (be32_to_cpu((end)->w0) & END2_W0_FIRMWARE1)
129f8a233deSCédric Le Goater #define xive2_end_is_firmware2(end)              \
130f8a233deSCédric Le Goater     (be32_to_cpu((end)->w0) & END2_W0_FIRMWARE2)
1315fc9c717SFrederic Barrat #define xive2_end_is_ignore(end)                \
1325fc9c717SFrederic Barrat     (be32_to_cpu((end)->w6) & END2_W6_IGNORE)
1335fc9c717SFrederic Barrat #define xive2_end_is_crowd(end)                 \
1345fc9c717SFrederic Barrat     (be32_to_cpu((end)->w6) & END2_W6_CROWD)
135f8a233deSCédric Le Goater 
xive2_end_qaddr(Xive2End * end)136f8a233deSCédric Le Goater static inline uint64_t xive2_end_qaddr(Xive2End *end)
137f8a233deSCédric Le Goater {
138f8a233deSCédric Le Goater     return ((uint64_t) be32_to_cpu(end->w2) & END2_W2_EQ_ADDR_HI) << 32 |
139f8a233deSCédric Le Goater         (be32_to_cpu(end->w3) & END2_W3_EQ_ADDR_LO);
140f8a233deSCédric Le Goater }
141f8a233deSCédric Le Goater 
14233e36426SPhilippe Mathieu-Daudé void xive2_end_pic_print_info(Xive2End *end, uint32_t end_idx, GString *buf);
143f8a233deSCédric Le Goater void xive2_end_queue_pic_print_info(Xive2End *end, uint32_t width,
144fd32d823SPhilippe Mathieu-Daudé                                     GString *buf);
145f8a233deSCédric Le Goater void xive2_end_eas_pic_print_info(Xive2End *end, uint32_t end_idx,
1469d5c1da9SPhilippe Mathieu-Daudé                                   GString *buf);
147f8a233deSCédric Le Goater 
148f8a233deSCédric Le Goater /*
149f8a233deSCédric Le Goater  * Notification Virtual Processor (NVP)
150f8a233deSCédric Le Goater  */
151f8a233deSCédric Le Goater typedef struct Xive2Nvp {
152f8a233deSCédric Le Goater         uint32_t       w0;
153f8a233deSCédric Le Goater #define NVP2_W0_VALID              PPC_BIT32(0)
154835806f1SCédric Le Goater #define NVP2_W0_HW                 PPC_BIT32(7)
155f8a233deSCédric Le Goater #define NVP2_W0_ESC_END            PPC_BIT32(25) /* 'N' bit 0:ESB  1:END */
156cfeafb0dSFrederic Barrat #define NVP2_W0_PGOFIRST           PPC_BITMASK32(26, 31)
157f8a233deSCédric Le Goater         uint32_t       w1;
158835806f1SCédric Le Goater #define NVP2_W1_CO                 PPC_BIT32(13)
159835806f1SCédric Le Goater #define NVP2_W1_CO_PRIV            PPC_BITMASK32(14, 15)
160835806f1SCédric Le Goater #define NVP2_W1_CO_THRID_VALID     PPC_BIT32(16)
161835806f1SCédric Le Goater #define NVP2_W1_CO_THRID           PPC_BITMASK32(17, 31)
162f8a233deSCédric Le Goater         uint32_t       w2;
163835806f1SCédric Le Goater #define NVP2_W2_CPPR               PPC_BITMASK32(0, 7)
164f8a233deSCédric Le Goater #define NVP2_W2_IPB                PPC_BITMASK32(8, 15)
165835806f1SCédric Le Goater #define NVP2_W2_LSMFB              PPC_BITMASK32(16, 23)
166f8a233deSCédric Le Goater         uint32_t       w3;
167f8a233deSCédric Le Goater         uint32_t       w4;
168f8a233deSCédric Le Goater #define NVP2_W4_ESC_ESB_BLOCK      PPC_BITMASK32(0, 3)  /* N:0 */
169f8a233deSCédric Le Goater #define NVP2_W4_ESC_ESB_INDEX      PPC_BITMASK32(4, 31) /* N:0 */
170f8a233deSCédric Le Goater #define NVP2_W4_ESC_END_BLOCK      PPC_BITMASK32(4, 7)  /* N:1 */
171f8a233deSCédric Le Goater #define NVP2_W4_ESC_END_INDEX      PPC_BITMASK32(8, 31) /* N:1 */
172f8a233deSCédric Le Goater         uint32_t       w5;
173f8a233deSCédric Le Goater #define NVP2_W5_PSIZE              PPC_BITMASK32(0, 1)
174f8a233deSCédric Le Goater #define NVP2_W5_VP_END_BLOCK       PPC_BITMASK32(4, 7)
175f8a233deSCédric Le Goater #define NVP2_W5_VP_END_INDEX       PPC_BITMASK32(8, 31)
176f8a233deSCédric Le Goater         uint32_t       w6;
177cebfeb9eSFrederic Barrat #define NVP2_W6_REPORTING_LINE     PPC_BITMASK32(4, 31)
178f8a233deSCédric Le Goater         uint32_t       w7;
179cebfeb9eSFrederic Barrat #define NVP2_W7_REPORTING_LINE     PPC_BITMASK32(0, 23)
180f8a233deSCédric Le Goater } Xive2Nvp;
181f8a233deSCédric Le Goater 
182f8a233deSCédric Le Goater #define xive2_nvp_is_valid(nvp)    (be32_to_cpu((nvp)->w0) & NVP2_W0_VALID)
183835806f1SCédric Le Goater #define xive2_nvp_is_hw(nvp)       (be32_to_cpu((nvp)->w0) & NVP2_W0_HW)
184835806f1SCédric Le Goater #define xive2_nvp_is_co(nvp)       (be32_to_cpu((nvp)->w1) & NVP2_W1_CO)
185f8a233deSCédric Le Goater 
186f8a233deSCédric Le Goater /*
187f8a233deSCédric Le Goater  * The VP number space in a block is defined by the END2_W6_VP_OFFSET
188f8a233deSCédric Le Goater  * field of the XIVE END. When running in Gen1 mode (P9 compat mode),
189f8a233deSCédric Le Goater  * the VP space is reduced to (1 << 19) VPs per block
190f8a233deSCédric Le Goater  */
191f8a233deSCédric Le Goater #define XIVE2_NVP_SHIFT              24
192f8a233deSCédric Le Goater #define XIVE2_NVP_COUNT              (1 << XIVE2_NVP_SHIFT)
193f8a233deSCédric Le Goater 
xive2_nvp_cam_line(uint8_t nvp_blk,uint32_t nvp_idx)194f8a233deSCédric Le Goater static inline uint32_t xive2_nvp_cam_line(uint8_t nvp_blk, uint32_t nvp_idx)
195f8a233deSCédric Le Goater {
196f8a233deSCédric Le Goater     return (nvp_blk << XIVE2_NVP_SHIFT) | nvp_idx;
197f8a233deSCédric Le Goater }
198f8a233deSCédric Le Goater 
xive2_nvp_idx(uint32_t cam_line)199f8a233deSCédric Le Goater static inline uint32_t xive2_nvp_idx(uint32_t cam_line)
200f8a233deSCédric Le Goater {
201f8a233deSCédric Le Goater     return cam_line & ((1 << XIVE2_NVP_SHIFT) - 1);
202f8a233deSCédric Le Goater }
203f8a233deSCédric Le Goater 
xive2_nvp_blk(uint32_t cam_line)204f8a233deSCédric Le Goater static inline uint32_t xive2_nvp_blk(uint32_t cam_line)
205f8a233deSCédric Le Goater {
206f8a233deSCédric Le Goater     return (cam_line >> XIVE2_NVP_SHIFT) & 0xf;
207f8a233deSCédric Le Goater }
208f8a233deSCédric Le Goater 
20996c674bfSFrederic Barrat void xive2_nvp_pic_print_info(Xive2Nvp *nvp, uint32_t nvp_idx, GString *buf);
21096c674bfSFrederic Barrat 
211f8a233deSCédric Le Goater /*
212f8a233deSCédric Le Goater  * Notification Virtual Group or Crowd (NVG/NVC)
213f8a233deSCédric Le Goater  */
214f8a233deSCédric Le Goater typedef struct Xive2Nvgc {
215f8a233deSCédric Le Goater         uint32_t        w0;
216f8a233deSCédric Le Goater #define NVGC2_W0_VALID             PPC_BIT32(0)
21776798e12SFrederic Barrat #define NVGC2_W0_PGONEXT           PPC_BITMASK32(26, 31)
218f8a233deSCédric Le Goater         uint32_t        w1;
219f8a233deSCédric Le Goater         uint32_t        w2;
220f8a233deSCédric Le Goater         uint32_t        w3;
221f8a233deSCédric Le Goater         uint32_t        w4;
222f8a233deSCédric Le Goater         uint32_t        w5;
223f8a233deSCédric Le Goater         uint32_t        w6;
224f8a233deSCédric Le Goater         uint32_t        w7;
225f8a233deSCédric Le Goater } Xive2Nvgc;
226f8a233deSCédric Le Goater 
22776798e12SFrederic Barrat #define xive2_nvgc_is_valid(nvgc)    (be32_to_cpu((nvgc)->w0) & NVGC2_W0_VALID)
22876798e12SFrederic Barrat 
22976798e12SFrederic Barrat void xive2_nvgc_pic_print_info(Xive2Nvgc *nvgc, uint32_t nvgc_idx,
23076798e12SFrederic Barrat                                GString *buf);
23176798e12SFrederic Barrat 
232f8a233deSCédric Le Goater #endif /* PPC_XIVE2_REGS_H */
233