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
13*14f11a20SMarkus Armbruster #include "cpu.h"
14*14f11a20SMarkus 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 */
22f8a233deSCédric Le Goater #define TM2_QW0W2_VU PPC_BIT32(0)
23f8a233deSCédric Le Goater #define TM2_QW0W2_LOGIC_SERV PPC_BITMASK32(4, 31)
24f8a233deSCédric Le Goater #define TM2_QW1W2_VO PPC_BIT32(0)
25835806f1SCédric Le Goater #define TM2_QW1W2_HO PPC_BIT32(1)
26f8a233deSCédric Le Goater #define TM2_QW1W2_OS_CAM PPC_BITMASK32(4, 31)
27f8a233deSCédric Le Goater #define TM2_QW2W2_VP PPC_BIT32(0)
28835806f1SCédric Le Goater #define TM2_QW2W2_HP PPC_BIT32(1)
29f8a233deSCédric Le Goater #define TM2_QW2W2_POOL_CAM PPC_BITMASK32(4, 31)
30f8a233deSCédric Le Goater #define TM2_QW3W2_VT PPC_BIT32(0)
31835806f1SCédric Le Goater #define TM2_QW3W2_HT PPC_BIT32(1)
32f8a233deSCédric Le Goater #define TM2_QW3W2_LP PPC_BIT32(6)
33f8a233deSCédric Le Goater #define TM2_QW3W2_LE PPC_BIT32(7)
34f8a233deSCédric Le Goater
35f8a233deSCédric Le Goater /*
36f8a233deSCédric Le Goater * Event Assignment Structure (EAS)
37f8a233deSCédric Le Goater */
38f8a233deSCédric Le Goater
39f8a233deSCédric Le Goater typedef struct Xive2Eas {
40f8a233deSCédric Le Goater uint64_t w;
41f8a233deSCédric Le Goater #define EAS2_VALID PPC_BIT(0)
42f8a233deSCédric Le Goater #define EAS2_END_BLOCK PPC_BITMASK(4, 7) /* Destination EQ block# */
43f8a233deSCédric Le Goater #define EAS2_END_INDEX PPC_BITMASK(8, 31) /* Destination EQ index */
44f8a233deSCédric Le Goater #define EAS2_MASKED PPC_BIT(32) /* Masked */
45f8a233deSCédric Le Goater #define EAS2_END_DATA PPC_BITMASK(33, 63) /* written to the EQ */
46f8a233deSCédric Le Goater } Xive2Eas;
47f8a233deSCédric Le Goater
48f8a233deSCédric Le Goater #define xive2_eas_is_valid(eas) (be64_to_cpu((eas)->w) & EAS2_VALID)
49f8a233deSCédric Le Goater #define xive2_eas_is_masked(eas) (be64_to_cpu((eas)->w) & EAS2_MASKED)
50f8a233deSCédric Le Goater
51f8a233deSCédric Le Goater void xive2_eas_pic_print_info(Xive2Eas *eas, uint32_t lisn, Monitor *mon);
52f8a233deSCédric Le Goater
53f8a233deSCédric Le Goater /*
54f8a233deSCédric Le Goater * Event Notifification Descriptor (END)
55f8a233deSCédric Le Goater */
56f8a233deSCédric Le Goater
57f8a233deSCédric Le Goater typedef struct Xive2End {
58f8a233deSCédric Le Goater uint32_t w0;
59f8a233deSCédric Le Goater #define END2_W0_VALID PPC_BIT32(0) /* "v" bit */
60f8a233deSCédric Le Goater #define END2_W0_ENQUEUE PPC_BIT32(5) /* "q" bit */
61f8a233deSCédric Le Goater #define END2_W0_UCOND_NOTIFY PPC_BIT32(6) /* "n" bit */
62f8a233deSCédric Le Goater #define END2_W0_SILENT_ESCALATE PPC_BIT32(7) /* "s" bit */
63f8a233deSCédric Le Goater #define END2_W0_BACKLOG PPC_BIT32(8) /* "b" bit */
64f8a233deSCédric Le Goater #define END2_W0_PRECL_ESC_CTL PPC_BIT32(9) /* "p" bit */
65f8a233deSCédric Le Goater #define END2_W0_UNCOND_ESCALATE PPC_BIT32(10) /* "u" bit */
66f8a233deSCédric Le Goater #define END2_W0_ESCALATE_CTL PPC_BIT32(11) /* "e" bit */
67f8a233deSCédric Le Goater #define END2_W0_ADAPTIVE_ESC PPC_BIT32(12) /* "a" bit */
68f8a233deSCédric Le Goater #define END2_W0_ESCALATE_END PPC_BIT32(13) /* "N" bit */
69f8a233deSCédric Le Goater #define END2_W0_FIRMWARE1 PPC_BIT32(16) /* Owned by FW */
70f8a233deSCédric Le Goater #define END2_W0_FIRMWARE2 PPC_BIT32(17) /* Owned by FW */
71f8a233deSCédric Le Goater #define END2_W0_AEC_SIZE PPC_BITMASK32(18, 19)
72f8a233deSCédric Le Goater #define END2_W0_AEG_SIZE PPC_BITMASK32(20, 23)
73f8a233deSCédric Le Goater #define END2_W0_EQ_VG_PREDICT PPC_BITMASK32(24, 31) /* Owned by HW */
74f8a233deSCédric Le Goater uint32_t w1;
75f8a233deSCédric Le Goater #define END2_W1_ESn PPC_BITMASK32(0, 1)
76f8a233deSCédric Le Goater #define END2_W1_ESn_P PPC_BIT32(0)
77f8a233deSCédric Le Goater #define END2_W1_ESn_Q PPC_BIT32(1)
78f8a233deSCédric Le Goater #define END2_W1_ESe PPC_BITMASK32(2, 3)
79f8a233deSCédric Le Goater #define END2_W1_ESe_P PPC_BIT32(2)
80f8a233deSCédric Le Goater #define END2_W1_ESe_Q PPC_BIT32(3)
81f8a233deSCédric Le Goater #define END2_W1_GEN_FLIPPED PPC_BIT32(8)
82f8a233deSCédric Le Goater #define END2_W1_GENERATION PPC_BIT32(9)
83f8a233deSCédric Le Goater #define END2_W1_PAGE_OFF PPC_BITMASK32(10, 31)
84f8a233deSCédric Le Goater uint32_t w2;
85f8a233deSCédric Le Goater #define END2_W2_RESERVED PPC_BITMASK32(4, 7)
86f8a233deSCédric Le Goater #define END2_W2_EQ_ADDR_HI PPC_BITMASK32(8, 31)
87f8a233deSCédric Le Goater uint32_t w3;
88f8a233deSCédric Le Goater #define END2_W3_EQ_ADDR_LO PPC_BITMASK32(0, 24)
89f8a233deSCédric Le Goater #define END2_W3_QSIZE PPC_BITMASK32(28, 31)
90f8a233deSCédric Le Goater uint32_t w4;
91f8a233deSCédric Le Goater #define END2_W4_END_BLOCK PPC_BITMASK32(4, 7)
92f8a233deSCédric Le Goater #define END2_W4_ESC_END_INDEX PPC_BITMASK32(8, 31)
93f8a233deSCédric Le Goater #define END2_W4_ESB_BLOCK PPC_BITMASK32(0, 3)
94f8a233deSCédric Le Goater #define END2_W4_ESC_ESB_INDEX PPC_BITMASK32(4, 31)
95f8a233deSCédric Le Goater uint32_t w5;
96f8a233deSCédric Le Goater #define END2_W5_ESC_END_DATA PPC_BITMASK32(1, 31)
97f8a233deSCédric Le Goater uint32_t w6;
98f8a233deSCédric Le Goater #define END2_W6_FORMAT_BIT PPC_BIT32(0)
99f8a233deSCédric Le Goater #define END2_W6_IGNORE PPC_BIT32(1)
100f8a233deSCédric Le Goater #define END2_W6_VP_BLOCK PPC_BITMASK32(4, 7)
101f8a233deSCédric Le Goater #define END2_W6_VP_OFFSET PPC_BITMASK32(8, 31)
102f8a233deSCédric Le Goater #define END2_W6_VP_OFFSET_GEN1 PPC_BITMASK32(13, 31)
103f8a233deSCédric Le Goater uint32_t w7;
104f8a233deSCédric Le Goater #define END2_W7_TOPO PPC_BITMASK32(0, 3) /* Owned by HW */
105f8a233deSCédric Le Goater #define END2_W7_F0_PRIORITY PPC_BITMASK32(8, 15)
106f8a233deSCédric Le Goater #define END2_W7_F1_LOG_SERVER_ID PPC_BITMASK32(4, 31)
107f8a233deSCédric Le Goater } Xive2End;
108f8a233deSCédric Le Goater
109f8a233deSCédric Le Goater #define xive2_end_is_valid(end) (be32_to_cpu((end)->w0) & END2_W0_VALID)
110f8a233deSCédric Le Goater #define xive2_end_is_enqueue(end) (be32_to_cpu((end)->w0) & END2_W0_ENQUEUE)
111f8a233deSCédric Le Goater #define xive2_end_is_notify(end) \
112f8a233deSCédric Le Goater (be32_to_cpu((end)->w0) & END2_W0_UCOND_NOTIFY)
113f8a233deSCédric Le Goater #define xive2_end_is_backlog(end) (be32_to_cpu((end)->w0) & END2_W0_BACKLOG)
114f8a233deSCédric Le Goater #define xive2_end_is_escalate(end) \
115f8a233deSCédric Le Goater (be32_to_cpu((end)->w0) & END2_W0_ESCALATE_CTL)
116f8a233deSCédric Le Goater #define xive2_end_is_uncond_escalation(end) \
117f8a233deSCédric Le Goater (be32_to_cpu((end)->w0) & END2_W0_UNCOND_ESCALATE)
118f8a233deSCédric Le Goater #define xive2_end_is_silent_escalation(end) \
119f8a233deSCédric Le Goater (be32_to_cpu((end)->w0) & END2_W0_SILENT_ESCALATE)
120f8a233deSCédric Le Goater #define xive2_end_is_escalate_end(end) \
121f8a233deSCédric Le Goater (be32_to_cpu((end)->w0) & END2_W0_ESCALATE_END)
122f8a233deSCédric Le Goater #define xive2_end_is_firmware1(end) \
123f8a233deSCédric Le Goater (be32_to_cpu((end)->w0) & END2_W0_FIRMWARE1)
124f8a233deSCédric Le Goater #define xive2_end_is_firmware2(end) \
125f8a233deSCédric Le Goater (be32_to_cpu((end)->w0) & END2_W0_FIRMWARE2)
126f8a233deSCédric Le Goater
xive2_end_qaddr(Xive2End * end)127f8a233deSCédric Le Goater static inline uint64_t xive2_end_qaddr(Xive2End *end)
128f8a233deSCédric Le Goater {
129f8a233deSCédric Le Goater return ((uint64_t) be32_to_cpu(end->w2) & END2_W2_EQ_ADDR_HI) << 32 |
130f8a233deSCédric Le Goater (be32_to_cpu(end->w3) & END2_W3_EQ_ADDR_LO);
131f8a233deSCédric Le Goater }
132f8a233deSCédric Le Goater
133f8a233deSCédric Le Goater void xive2_end_pic_print_info(Xive2End *end, uint32_t end_idx, Monitor *mon);
134f8a233deSCédric Le Goater void xive2_end_queue_pic_print_info(Xive2End *end, uint32_t width,
135f8a233deSCédric Le Goater Monitor *mon);
136f8a233deSCédric Le Goater void xive2_end_eas_pic_print_info(Xive2End *end, uint32_t end_idx,
137f8a233deSCédric Le Goater Monitor *mon);
138f8a233deSCédric Le Goater
139f8a233deSCédric Le Goater /*
140f8a233deSCédric Le Goater * Notification Virtual Processor (NVP)
141f8a233deSCédric Le Goater */
142f8a233deSCédric Le Goater typedef struct Xive2Nvp {
143f8a233deSCédric Le Goater uint32_t w0;
144f8a233deSCédric Le Goater #define NVP2_W0_VALID PPC_BIT32(0)
145835806f1SCédric Le Goater #define NVP2_W0_HW PPC_BIT32(7)
146f8a233deSCédric Le Goater #define NVP2_W0_ESC_END PPC_BIT32(25) /* 'N' bit 0:ESB 1:END */
147f8a233deSCédric Le Goater uint32_t w1;
148835806f1SCédric Le Goater #define NVP2_W1_CO PPC_BIT32(13)
149835806f1SCédric Le Goater #define NVP2_W1_CO_PRIV PPC_BITMASK32(14, 15)
150835806f1SCédric Le Goater #define NVP2_W1_CO_THRID_VALID PPC_BIT32(16)
151835806f1SCédric Le Goater #define NVP2_W1_CO_THRID PPC_BITMASK32(17, 31)
152f8a233deSCédric Le Goater uint32_t w2;
153835806f1SCédric Le Goater #define NVP2_W2_CPPR PPC_BITMASK32(0, 7)
154f8a233deSCédric Le Goater #define NVP2_W2_IPB PPC_BITMASK32(8, 15)
155835806f1SCédric Le Goater #define NVP2_W2_LSMFB PPC_BITMASK32(16, 23)
156f8a233deSCédric Le Goater uint32_t w3;
157f8a233deSCédric Le Goater uint32_t w4;
158f8a233deSCédric Le Goater #define NVP2_W4_ESC_ESB_BLOCK PPC_BITMASK32(0, 3) /* N:0 */
159f8a233deSCédric Le Goater #define NVP2_W4_ESC_ESB_INDEX PPC_BITMASK32(4, 31) /* N:0 */
160f8a233deSCédric Le Goater #define NVP2_W4_ESC_END_BLOCK PPC_BITMASK32(4, 7) /* N:1 */
161f8a233deSCédric Le Goater #define NVP2_W4_ESC_END_INDEX PPC_BITMASK32(8, 31) /* N:1 */
162f8a233deSCédric Le Goater uint32_t w5;
163f8a233deSCédric Le Goater #define NVP2_W5_PSIZE PPC_BITMASK32(0, 1)
164f8a233deSCédric Le Goater #define NVP2_W5_VP_END_BLOCK PPC_BITMASK32(4, 7)
165f8a233deSCédric Le Goater #define NVP2_W5_VP_END_INDEX PPC_BITMASK32(8, 31)
166f8a233deSCédric Le Goater uint32_t w6;
167f8a233deSCédric Le Goater uint32_t w7;
168f8a233deSCédric Le Goater } Xive2Nvp;
169f8a233deSCédric Le Goater
170f8a233deSCédric Le Goater #define xive2_nvp_is_valid(nvp) (be32_to_cpu((nvp)->w0) & NVP2_W0_VALID)
171835806f1SCédric Le Goater #define xive2_nvp_is_hw(nvp) (be32_to_cpu((nvp)->w0) & NVP2_W0_HW)
172835806f1SCédric Le Goater #define xive2_nvp_is_co(nvp) (be32_to_cpu((nvp)->w1) & NVP2_W1_CO)
173f8a233deSCédric Le Goater
174f8a233deSCédric Le Goater /*
175f8a233deSCédric Le Goater * The VP number space in a block is defined by the END2_W6_VP_OFFSET
176f8a233deSCédric Le Goater * field of the XIVE END. When running in Gen1 mode (P9 compat mode),
177f8a233deSCédric Le Goater * the VP space is reduced to (1 << 19) VPs per block
178f8a233deSCédric Le Goater */
179f8a233deSCédric Le Goater #define XIVE2_NVP_SHIFT 24
180f8a233deSCédric Le Goater #define XIVE2_NVP_COUNT (1 << XIVE2_NVP_SHIFT)
181f8a233deSCédric Le Goater
xive2_nvp_cam_line(uint8_t nvp_blk,uint32_t nvp_idx)182f8a233deSCédric Le Goater static inline uint32_t xive2_nvp_cam_line(uint8_t nvp_blk, uint32_t nvp_idx)
183f8a233deSCédric Le Goater {
184f8a233deSCédric Le Goater return (nvp_blk << XIVE2_NVP_SHIFT) | nvp_idx;
185f8a233deSCédric Le Goater }
186f8a233deSCédric Le Goater
xive2_nvp_idx(uint32_t cam_line)187f8a233deSCédric Le Goater static inline uint32_t xive2_nvp_idx(uint32_t cam_line)
188f8a233deSCédric Le Goater {
189f8a233deSCédric Le Goater return cam_line & ((1 << XIVE2_NVP_SHIFT) - 1);
190f8a233deSCédric Le Goater }
191f8a233deSCédric Le Goater
xive2_nvp_blk(uint32_t cam_line)192f8a233deSCédric Le Goater static inline uint32_t xive2_nvp_blk(uint32_t cam_line)
193f8a233deSCédric Le Goater {
194f8a233deSCédric Le Goater return (cam_line >> XIVE2_NVP_SHIFT) & 0xf;
195f8a233deSCédric Le Goater }
196f8a233deSCédric Le Goater
197f8a233deSCédric Le Goater /*
198f8a233deSCédric Le Goater * Notification Virtual Group or Crowd (NVG/NVC)
199f8a233deSCédric Le Goater */
200f8a233deSCédric Le Goater typedef struct Xive2Nvgc {
201f8a233deSCédric Le Goater uint32_t w0;
202f8a233deSCédric Le Goater #define NVGC2_W0_VALID PPC_BIT32(0)
203f8a233deSCédric Le Goater uint32_t w1;
204f8a233deSCédric Le Goater uint32_t w2;
205f8a233deSCédric Le Goater uint32_t w3;
206f8a233deSCédric Le Goater uint32_t w4;
207f8a233deSCédric Le Goater uint32_t w5;
208f8a233deSCédric Le Goater uint32_t w6;
209f8a233deSCédric Le Goater uint32_t w7;
210f8a233deSCédric Le Goater } Xive2Nvgc;
211f8a233deSCédric Le Goater
212f8a233deSCédric Le Goater #endif /* PPC_XIVE2_REGS_H */
213