1 // SPDX-License-Identifier: GPL-2.0
2
3 /*
4 * Copyright 2020-2022 HabanaLabs, Ltd.
5 * All Rights Reserved.
6 */
7
8 #include "gaudi2P.h"
9 #include "gaudi2_masks.h"
10 #include "../include/gaudi2/gaudi2_special_blocks.h"
11 #include "../include/hw_ip/mmu/mmu_general.h"
12 #include "../include/hw_ip/mmu/mmu_v2_0.h"
13 #include "../include/gaudi2/gaudi2_packets.h"
14 #include "../include/gaudi2/gaudi2_reg_map.h"
15 #include "../include/gaudi2/gaudi2_async_ids_map_extended.h"
16 #include "../include/gaudi2/arc/gaudi2_arc_common_packets.h"
17
18 #include <linux/module.h>
19 #include <linux/pci.h>
20 #include <linux/hwmon.h>
21 #include <linux/iommu.h>
22
23 #define GAUDI2_DMA_POOL_BLK_SIZE SZ_256 /* 256 bytes */
24
25 #define GAUDI2_RESET_TIMEOUT_MSEC 2000 /* 2000ms */
26
27 #define GAUDI2_RESET_POLL_TIMEOUT_USEC 500000 /* 500ms */
28 #define GAUDI2_PLDM_HRESET_TIMEOUT_MSEC 25000 /* 25s */
29 #define GAUDI2_PLDM_SRESET_TIMEOUT_MSEC 25000 /* 25s */
30 #define GAUDI2_PLDM_RESET_POLL_TIMEOUT_USEC 3000000 /* 3s */
31 #define GAUDI2_RESET_POLL_CNT 3
32 #define GAUDI2_RESET_WAIT_MSEC 1 /* 1ms */
33 #define GAUDI2_CPU_RESET_WAIT_MSEC 100 /* 100ms */
34 #define GAUDI2_PLDM_RESET_WAIT_MSEC 1000 /* 1s */
35 #define GAUDI2_CB_POOL_CB_CNT 512
36 #define GAUDI2_CB_POOL_CB_SIZE SZ_128K /* 128KB */
37 #define GAUDI2_MSG_TO_CPU_TIMEOUT_USEC 4000000 /* 4s */
38 #define GAUDI2_WAIT_FOR_BL_TIMEOUT_USEC 25000000 /* 25s */
39 #define GAUDI2_TEST_QUEUE_WAIT_USEC 100000 /* 100ms */
40 #define GAUDI2_PLDM_TEST_QUEUE_WAIT_USEC 1000000 /* 1s */
41
42 #define GAUDI2_ALLOC_CPU_MEM_RETRY_CNT 3
43
44 /*
45 * since the code already has built-in support for binning of up to MAX_FAULTY_TPCS TPCs
46 * and the code relies on that value (for array size etc..) we define another value
47 * for MAX faulty TPCs which reflects the cluster binning requirements
48 */
49 #define MAX_CLUSTER_BINNING_FAULTY_TPCS 1
50 #define MAX_FAULTY_XBARS 1
51 #define MAX_FAULTY_EDMAS 1
52 #define MAX_FAULTY_DECODERS 1
53
54 #define GAUDI2_TPC_FULL_MASK 0x1FFFFFF
55 #define GAUDI2_HIF_HMMU_FULL_MASK 0xFFFF
56 #define GAUDI2_DECODER_FULL_MASK 0x3FF
57
58 #define GAUDI2_NA_EVENT_CAUSE 0xFF
59 #define GAUDI2_NUM_OF_QM_ERR_CAUSE 18
60 #define GAUDI2_NUM_OF_LOWER_QM_ERR_CAUSE 25
61 #define GAUDI2_NUM_OF_QM_ARB_ERR_CAUSE 3
62 #define GAUDI2_NUM_OF_ARC_SEI_ERR_CAUSE 14
63 #define GAUDI2_NUM_OF_CPU_SEI_ERR_CAUSE 3
64 #define GAUDI2_NUM_OF_QM_SEI_ERR_CAUSE 2
65 #define GAUDI2_NUM_OF_ROT_ERR_CAUSE 22
66 #define GAUDI2_NUM_OF_TPC_INTR_CAUSE 31
67 #define GAUDI2_NUM_OF_DEC_ERR_CAUSE 25
68 #define GAUDI2_NUM_OF_MME_ERR_CAUSE 16
69 #define GAUDI2_NUM_OF_MME_WAP_ERR_CAUSE 7
70 #define GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE 8
71 #define GAUDI2_NUM_OF_MMU_SPI_SEI_CAUSE 19
72 #define GAUDI2_NUM_OF_HBM_SEI_CAUSE 9
73 #define GAUDI2_NUM_OF_SM_SEI_ERR_CAUSE 3
74 #define GAUDI2_NUM_OF_PCIE_ADDR_DEC_ERR_CAUSE 3
75 #define GAUDI2_NUM_OF_PMMU_FATAL_ERR_CAUSE 2
76 #define GAUDI2_NUM_OF_HIF_FATAL_ERR_CAUSE 2
77 #define GAUDI2_NUM_OF_AXI_DRAIN_ERR_CAUSE 2
78 #define GAUDI2_NUM_OF_HBM_MC_SPI_CAUSE 5
79
80 #define GAUDI2_MMU_CACHE_INV_TIMEOUT_USEC (MMU_CONFIG_TIMEOUT_USEC * 10)
81 #define GAUDI2_PLDM_MMU_TIMEOUT_USEC (MMU_CONFIG_TIMEOUT_USEC * 200)
82 #define GAUDI2_ARB_WDT_TIMEOUT (0x1000000)
83
84 #define GAUDI2_VDEC_TIMEOUT_USEC 10000 /* 10ms */
85 #define GAUDI2_PLDM_VDEC_TIMEOUT_USEC (GAUDI2_VDEC_TIMEOUT_USEC * 100)
86
87 #define KDMA_TIMEOUT_USEC USEC_PER_SEC
88
89 #define IS_DMA_IDLE(dma_core_sts0) \
90 (!((dma_core_sts0) & (DCORE0_EDMA0_CORE_STS0_BUSY_MASK)))
91
92 #define IS_DMA_HALTED(dma_core_sts1) \
93 ((dma_core_sts1) & (DCORE0_EDMA0_CORE_STS1_IS_HALT_MASK))
94
95 #define IS_MME_IDLE(mme_arch_sts) (((mme_arch_sts) & MME_ARCH_IDLE_MASK) == MME_ARCH_IDLE_MASK)
96
97 #define IS_TPC_IDLE(tpc_cfg_sts) (((tpc_cfg_sts) & (TPC_IDLE_MASK)) == (TPC_IDLE_MASK))
98
99 #define IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts) \
100 ((((qm_glbl_sts0) & (QM_IDLE_MASK)) == (QM_IDLE_MASK)) && \
101 (((qm_glbl_sts1) & (QM_ARC_IDLE_MASK)) == (QM_ARC_IDLE_MASK)) && \
102 (((qm_cgm_sts) & (CGM_IDLE_MASK)) == (CGM_IDLE_MASK)))
103
104 #define PCIE_DEC_EN_MASK 0x300
105 #define DEC_WORK_STATE_IDLE 0
106 #define DEC_WORK_STATE_PEND 3
107 #define IS_DEC_IDLE(dec_swreg15) \
108 (((dec_swreg15) & DCORE0_DEC0_CMD_SWREG15_SW_WORK_STATE_MASK) == DEC_WORK_STATE_IDLE || \
109 ((dec_swreg15) & DCORE0_DEC0_CMD_SWREG15_SW_WORK_STATE_MASK) == DEC_WORK_STATE_PEND)
110
111 /* HBM MMU address scrambling parameters */
112 #define GAUDI2_HBM_MMU_SCRM_MEM_SIZE SZ_8M
113 #define GAUDI2_HBM_MMU_SCRM_DIV_SHIFT 26
114 #define GAUDI2_HBM_MMU_SCRM_MOD_SHIFT 0
115 #define GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK DRAM_VA_HINT_MASK
116 #define GAUDI2_COMPENSATE_TLB_PAGE_SIZE_FACTOR 16
117 #define MMU_RANGE_INV_VA_LSB_SHIFT 12
118 #define MMU_RANGE_INV_VA_MSB_SHIFT 44
119 #define MMU_RANGE_INV_EN_SHIFT 0
120 #define MMU_RANGE_INV_ASID_EN_SHIFT 1
121 #define MMU_RANGE_INV_ASID_SHIFT 2
122
123 /* The last SPI_SEI cause bit, "burst_fifo_full", is expected to be triggered in PMMU because it has
124 * a 2 entries FIFO, and hence it is not enabled for it.
125 */
126 #define GAUDI2_PMMU_SPI_SEI_ENABLE_MASK GENMASK(GAUDI2_NUM_OF_MMU_SPI_SEI_CAUSE - 2, 0)
127 #define GAUDI2_HMMU_SPI_SEI_ENABLE_MASK GENMASK(GAUDI2_NUM_OF_MMU_SPI_SEI_CAUSE - 1, 0)
128
129 #define GAUDI2_MAX_STRING_LEN 64
130
131 #define GAUDI2_VDEC_MSIX_ENTRIES (GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM - \
132 GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM + 1)
133
134 #define ENGINE_ID_DCORE_OFFSET (GAUDI2_DCORE1_ENGINE_ID_EDMA_0 - GAUDI2_DCORE0_ENGINE_ID_EDMA_0)
135
136 /* RAZWI initiator coordinates */
137 #define RAZWI_GET_AXUSER_XY(x) \
138 ((x & 0xF8001FF0) >> 4)
139
140 #define RAZWI_GET_AXUSER_LOW_XY(x) \
141 ((x & 0x00001FF0) >> 4)
142
143 #define RAZWI_INITIATOR_AXUER_L_X_SHIFT 0
144 #define RAZWI_INITIATOR_AXUER_L_X_MASK 0x1F
145 #define RAZWI_INITIATOR_AXUER_L_Y_SHIFT 5
146 #define RAZWI_INITIATOR_AXUER_L_Y_MASK 0xF
147
148 #define RAZWI_INITIATOR_AXUER_H_X_SHIFT 23
149 #define RAZWI_INITIATOR_AXUER_H_X_MASK 0x1F
150
151 #define RAZWI_INITIATOR_ID_X_Y_LOW(x, y) \
152 ((((y) & RAZWI_INITIATOR_AXUER_L_Y_MASK) << RAZWI_INITIATOR_AXUER_L_Y_SHIFT) | \
153 (((x) & RAZWI_INITIATOR_AXUER_L_X_MASK) << RAZWI_INITIATOR_AXUER_L_X_SHIFT))
154
155 #define RAZWI_INITIATOR_ID_X_HIGH(x) \
156 (((x) & RAZWI_INITIATOR_AXUER_H_X_MASK) << RAZWI_INITIATOR_AXUER_H_X_SHIFT)
157
158 #define RAZWI_INITIATOR_ID_X_Y(xl, yl, xh) \
159 (RAZWI_INITIATOR_ID_X_Y_LOW(xl, yl) | RAZWI_INITIATOR_ID_X_HIGH(xh))
160
161 #define PSOC_RAZWI_ENG_STR_SIZE 128
162 #define PSOC_RAZWI_MAX_ENG_PER_RTR 5
163
164 /* HW scrambles only bits 0-25 */
165 #define HW_UNSCRAMBLED_BITS_MASK GENMASK_ULL(63, 26)
166
167 #define GAUDI2_GLBL_ERR_MAX_CAUSE_NUM 17
168
169 struct gaudi2_razwi_info {
170 u32 axuser_xy;
171 u32 rtr_ctrl;
172 u16 eng_id;
173 char *eng_name;
174 };
175
176 static struct gaudi2_razwi_info common_razwi_info[] = {
177 {RAZWI_INITIATOR_ID_X_Y(2, 4, 0), mmDCORE0_RTR0_CTRL_BASE,
178 GAUDI2_DCORE0_ENGINE_ID_DEC_0, "DEC0"},
179 {RAZWI_INITIATOR_ID_X_Y(2, 4, 4), mmDCORE0_RTR0_CTRL_BASE,
180 GAUDI2_DCORE0_ENGINE_ID_DEC_1, "DEC1"},
181 {RAZWI_INITIATOR_ID_X_Y(17, 4, 18), mmDCORE1_RTR7_CTRL_BASE,
182 GAUDI2_DCORE1_ENGINE_ID_DEC_0, "DEC2"},
183 {RAZWI_INITIATOR_ID_X_Y(17, 4, 14), mmDCORE1_RTR7_CTRL_BASE,
184 GAUDI2_DCORE1_ENGINE_ID_DEC_1, "DEC3"},
185 {RAZWI_INITIATOR_ID_X_Y(2, 11, 0), mmDCORE2_RTR0_CTRL_BASE,
186 GAUDI2_DCORE2_ENGINE_ID_DEC_0, "DEC4"},
187 {RAZWI_INITIATOR_ID_X_Y(2, 11, 4), mmDCORE2_RTR0_CTRL_BASE,
188 GAUDI2_DCORE2_ENGINE_ID_DEC_1, "DEC5"},
189 {RAZWI_INITIATOR_ID_X_Y(17, 11, 18), mmDCORE3_RTR7_CTRL_BASE,
190 GAUDI2_DCORE3_ENGINE_ID_DEC_0, "DEC6"},
191 {RAZWI_INITIATOR_ID_X_Y(17, 11, 14), mmDCORE3_RTR7_CTRL_BASE,
192 GAUDI2_DCORE3_ENGINE_ID_DEC_1, "DEC7"},
193 {RAZWI_INITIATOR_ID_X_Y(2, 4, 6), mmDCORE0_RTR0_CTRL_BASE,
194 GAUDI2_PCIE_ENGINE_ID_DEC_0, "DEC8"},
195 {RAZWI_INITIATOR_ID_X_Y(2, 4, 7), mmDCORE0_RTR0_CTRL_BASE,
196 GAUDI2_PCIE_ENGINE_ID_DEC_0, "DEC9"},
197 {RAZWI_INITIATOR_ID_X_Y(3, 4, 2), mmDCORE0_RTR1_CTRL_BASE,
198 GAUDI2_DCORE0_ENGINE_ID_TPC_0, "TPC0"},
199 {RAZWI_INITIATOR_ID_X_Y(3, 4, 4), mmDCORE0_RTR1_CTRL_BASE,
200 GAUDI2_DCORE0_ENGINE_ID_TPC_1, "TPC1"},
201 {RAZWI_INITIATOR_ID_X_Y(4, 4, 2), mmDCORE0_RTR2_CTRL_BASE,
202 GAUDI2_DCORE0_ENGINE_ID_TPC_2, "TPC2"},
203 {RAZWI_INITIATOR_ID_X_Y(4, 4, 4), mmDCORE0_RTR2_CTRL_BASE,
204 GAUDI2_DCORE0_ENGINE_ID_TPC_3, "TPC3"},
205 {RAZWI_INITIATOR_ID_X_Y(5, 4, 2), mmDCORE0_RTR3_CTRL_BASE,
206 GAUDI2_DCORE0_ENGINE_ID_TPC_4, "TPC4"},
207 {RAZWI_INITIATOR_ID_X_Y(5, 4, 4), mmDCORE0_RTR3_CTRL_BASE,
208 GAUDI2_DCORE0_ENGINE_ID_TPC_5, "TPC5"},
209 {RAZWI_INITIATOR_ID_X_Y(16, 4, 14), mmDCORE1_RTR6_CTRL_BASE,
210 GAUDI2_DCORE1_ENGINE_ID_TPC_0, "TPC6"},
211 {RAZWI_INITIATOR_ID_X_Y(16, 4, 16), mmDCORE1_RTR6_CTRL_BASE,
212 GAUDI2_DCORE1_ENGINE_ID_TPC_1, "TPC7"},
213 {RAZWI_INITIATOR_ID_X_Y(15, 4, 14), mmDCORE1_RTR5_CTRL_BASE,
214 GAUDI2_DCORE1_ENGINE_ID_TPC_2, "TPC8"},
215 {RAZWI_INITIATOR_ID_X_Y(15, 4, 16), mmDCORE1_RTR5_CTRL_BASE,
216 GAUDI2_DCORE1_ENGINE_ID_TPC_3, "TPC9"},
217 {RAZWI_INITIATOR_ID_X_Y(14, 4, 14), mmDCORE1_RTR4_CTRL_BASE,
218 GAUDI2_DCORE1_ENGINE_ID_TPC_4, "TPC10"},
219 {RAZWI_INITIATOR_ID_X_Y(14, 4, 16), mmDCORE1_RTR4_CTRL_BASE,
220 GAUDI2_DCORE1_ENGINE_ID_TPC_5, "TPC11"},
221 {RAZWI_INITIATOR_ID_X_Y(5, 11, 2), mmDCORE2_RTR3_CTRL_BASE,
222 GAUDI2_DCORE2_ENGINE_ID_TPC_0, "TPC12"},
223 {RAZWI_INITIATOR_ID_X_Y(5, 11, 4), mmDCORE2_RTR3_CTRL_BASE,
224 GAUDI2_DCORE2_ENGINE_ID_TPC_1, "TPC13"},
225 {RAZWI_INITIATOR_ID_X_Y(4, 11, 2), mmDCORE2_RTR2_CTRL_BASE,
226 GAUDI2_DCORE2_ENGINE_ID_TPC_2, "TPC14"},
227 {RAZWI_INITIATOR_ID_X_Y(4, 11, 4), mmDCORE2_RTR2_CTRL_BASE,
228 GAUDI2_DCORE2_ENGINE_ID_TPC_3, "TPC15"},
229 {RAZWI_INITIATOR_ID_X_Y(3, 11, 2), mmDCORE2_RTR1_CTRL_BASE,
230 GAUDI2_DCORE2_ENGINE_ID_TPC_4, "TPC16"},
231 {RAZWI_INITIATOR_ID_X_Y(3, 11, 4), mmDCORE2_RTR1_CTRL_BASE,
232 GAUDI2_DCORE2_ENGINE_ID_TPC_5, "TPC17"},
233 {RAZWI_INITIATOR_ID_X_Y(14, 11, 14), mmDCORE3_RTR4_CTRL_BASE,
234 GAUDI2_DCORE3_ENGINE_ID_TPC_0, "TPC18"},
235 {RAZWI_INITIATOR_ID_X_Y(14, 11, 16), mmDCORE3_RTR4_CTRL_BASE,
236 GAUDI2_DCORE3_ENGINE_ID_TPC_1, "TPC19"},
237 {RAZWI_INITIATOR_ID_X_Y(15, 11, 14), mmDCORE3_RTR5_CTRL_BASE,
238 GAUDI2_DCORE3_ENGINE_ID_TPC_2, "TPC20"},
239 {RAZWI_INITIATOR_ID_X_Y(15, 11, 16), mmDCORE3_RTR5_CTRL_BASE,
240 GAUDI2_DCORE3_ENGINE_ID_TPC_3, "TPC21"},
241 {RAZWI_INITIATOR_ID_X_Y(16, 11, 14), mmDCORE3_RTR6_CTRL_BASE,
242 GAUDI2_DCORE3_ENGINE_ID_TPC_4, "TPC22"},
243 {RAZWI_INITIATOR_ID_X_Y(16, 11, 16), mmDCORE3_RTR6_CTRL_BASE,
244 GAUDI2_DCORE3_ENGINE_ID_TPC_5, "TPC23"},
245 {RAZWI_INITIATOR_ID_X_Y(2, 4, 2), mmDCORE0_RTR0_CTRL_BASE,
246 GAUDI2_DCORE3_ENGINE_ID_TPC_5, "TPC24"},
247 {RAZWI_INITIATOR_ID_X_Y(17, 4, 8), mmDCORE1_RTR7_CTRL_BASE,
248 GAUDI2_ENGINE_ID_NIC0_0, "NIC0"},
249 {RAZWI_INITIATOR_ID_X_Y(17, 4, 10), mmDCORE1_RTR7_CTRL_BASE,
250 GAUDI2_ENGINE_ID_NIC0_1, "NIC1"},
251 {RAZWI_INITIATOR_ID_X_Y(17, 4, 12), mmDCORE1_RTR7_CTRL_BASE,
252 GAUDI2_ENGINE_ID_NIC1_0, "NIC2"},
253 {RAZWI_INITIATOR_ID_X_Y(17, 4, 14), mmDCORE1_RTR7_CTRL_BASE,
254 GAUDI2_ENGINE_ID_NIC1_1, "NIC3"},
255 {RAZWI_INITIATOR_ID_X_Y(17, 4, 15), mmDCORE1_RTR7_CTRL_BASE,
256 GAUDI2_ENGINE_ID_NIC2_0, "NIC4"},
257 {RAZWI_INITIATOR_ID_X_Y(2, 11, 2), mmDCORE2_RTR0_CTRL_BASE,
258 GAUDI2_ENGINE_ID_NIC2_1, "NIC5"},
259 {RAZWI_INITIATOR_ID_X_Y(2, 11, 4), mmDCORE2_RTR0_CTRL_BASE,
260 GAUDI2_ENGINE_ID_NIC3_0, "NIC6"},
261 {RAZWI_INITIATOR_ID_X_Y(2, 11, 6), mmDCORE2_RTR0_CTRL_BASE,
262 GAUDI2_ENGINE_ID_NIC3_1, "NIC7"},
263 {RAZWI_INITIATOR_ID_X_Y(2, 11, 8), mmDCORE2_RTR0_CTRL_BASE,
264 GAUDI2_ENGINE_ID_NIC4_0, "NIC8"},
265 {RAZWI_INITIATOR_ID_X_Y(17, 11, 12), mmDCORE3_RTR7_CTRL_BASE,
266 GAUDI2_ENGINE_ID_NIC4_1, "NIC9"},
267 {RAZWI_INITIATOR_ID_X_Y(17, 11, 14), mmDCORE3_RTR7_CTRL_BASE,
268 GAUDI2_ENGINE_ID_NIC5_0, "NIC10"},
269 {RAZWI_INITIATOR_ID_X_Y(17, 11, 16), mmDCORE3_RTR7_CTRL_BASE,
270 GAUDI2_ENGINE_ID_NIC5_1, "NIC11"},
271 {RAZWI_INITIATOR_ID_X_Y(2, 4, 2), mmDCORE0_RTR0_CTRL_BASE,
272 GAUDI2_ENGINE_ID_PDMA_0, "PDMA0"},
273 {RAZWI_INITIATOR_ID_X_Y(2, 4, 3), mmDCORE0_RTR0_CTRL_BASE,
274 GAUDI2_ENGINE_ID_PDMA_1, "PDMA1"},
275 {RAZWI_INITIATOR_ID_X_Y(2, 4, 4), mmDCORE0_RTR0_CTRL_BASE,
276 GAUDI2_ENGINE_ID_SIZE, "PMMU"},
277 {RAZWI_INITIATOR_ID_X_Y(2, 4, 5), mmDCORE0_RTR0_CTRL_BASE,
278 GAUDI2_ENGINE_ID_SIZE, "PCIE"},
279 {RAZWI_INITIATOR_ID_X_Y(17, 4, 16), mmDCORE1_RTR7_CTRL_BASE,
280 GAUDI2_ENGINE_ID_ARC_FARM, "ARC_FARM"},
281 {RAZWI_INITIATOR_ID_X_Y(17, 4, 17), mmDCORE1_RTR7_CTRL_BASE,
282 GAUDI2_ENGINE_ID_KDMA, "KDMA"},
283 {RAZWI_INITIATOR_ID_X_Y(1, 5, 1), mmSFT0_HBW_RTR_IF1_RTR_CTRL_BASE,
284 GAUDI2_DCORE0_ENGINE_ID_EDMA_0, "EDMA0"},
285 {RAZWI_INITIATOR_ID_X_Y(1, 5, 1), mmSFT0_HBW_RTR_IF0_RTR_CTRL_BASE,
286 GAUDI2_DCORE0_ENGINE_ID_EDMA_1, "EDMA1"},
287 {RAZWI_INITIATOR_ID_X_Y(18, 5, 18), mmSFT1_HBW_RTR_IF1_RTR_CTRL_BASE,
288 GAUDI2_DCORE1_ENGINE_ID_EDMA_0, "EDMA2"},
289 {RAZWI_INITIATOR_ID_X_Y(18, 5, 18), mmSFT1_HBW_RTR_IF0_RTR_CTRL_BASE,
290 GAUDI2_DCORE1_ENGINE_ID_EDMA_1, "EDMA3"},
291 {RAZWI_INITIATOR_ID_X_Y(1, 10, 1), mmSFT2_HBW_RTR_IF0_RTR_CTRL_BASE,
292 GAUDI2_DCORE2_ENGINE_ID_EDMA_0, "EDMA4"},
293 {RAZWI_INITIATOR_ID_X_Y(1, 10, 1), mmSFT2_HBW_RTR_IF1_RTR_CTRL_BASE,
294 GAUDI2_DCORE2_ENGINE_ID_EDMA_1, "EDMA5"},
295 {RAZWI_INITIATOR_ID_X_Y(18, 10, 18), mmSFT2_HBW_RTR_IF0_RTR_CTRL_BASE,
296 GAUDI2_DCORE3_ENGINE_ID_EDMA_0, "EDMA6"},
297 {RAZWI_INITIATOR_ID_X_Y(18, 10, 18), mmSFT2_HBW_RTR_IF1_RTR_CTRL_BASE,
298 GAUDI2_DCORE3_ENGINE_ID_EDMA_1, "EDMA7"},
299 {RAZWI_INITIATOR_ID_X_Y(1, 5, 0), mmDCORE0_RTR0_CTRL_BASE,
300 GAUDI2_ENGINE_ID_SIZE, "HMMU0"},
301 {RAZWI_INITIATOR_ID_X_Y(18, 5, 19), mmDCORE1_RTR7_CTRL_BASE,
302 GAUDI2_ENGINE_ID_SIZE, "HMMU1"},
303 {RAZWI_INITIATOR_ID_X_Y(1, 5, 0), mmDCORE0_RTR0_CTRL_BASE,
304 GAUDI2_ENGINE_ID_SIZE, "HMMU2"},
305 {RAZWI_INITIATOR_ID_X_Y(18, 5, 19), mmDCORE1_RTR7_CTRL_BASE,
306 GAUDI2_ENGINE_ID_SIZE, "HMMU3"},
307 {RAZWI_INITIATOR_ID_X_Y(1, 5, 0), mmDCORE0_RTR0_CTRL_BASE,
308 GAUDI2_ENGINE_ID_SIZE, "HMMU4"},
309 {RAZWI_INITIATOR_ID_X_Y(18, 5, 19), mmDCORE1_RTR7_CTRL_BASE,
310 GAUDI2_ENGINE_ID_SIZE, "HMMU5"},
311 {RAZWI_INITIATOR_ID_X_Y(1, 5, 0), mmDCORE0_RTR0_CTRL_BASE,
312 GAUDI2_ENGINE_ID_SIZE, "HMMU6"},
313 {RAZWI_INITIATOR_ID_X_Y(18, 5, 19), mmDCORE1_RTR7_CTRL_BASE,
314 GAUDI2_ENGINE_ID_SIZE, "HMMU7"},
315 {RAZWI_INITIATOR_ID_X_Y(1, 10, 0), mmDCORE2_RTR0_CTRL_BASE,
316 GAUDI2_ENGINE_ID_SIZE, "HMMU8"},
317 {RAZWI_INITIATOR_ID_X_Y(18, 10, 19), mmDCORE3_RTR7_CTRL_BASE,
318 GAUDI2_ENGINE_ID_SIZE, "HMMU9"},
319 {RAZWI_INITIATOR_ID_X_Y(1, 10, 0), mmDCORE2_RTR0_CTRL_BASE,
320 GAUDI2_ENGINE_ID_SIZE, "HMMU10"},
321 {RAZWI_INITIATOR_ID_X_Y(18, 10, 19), mmDCORE3_RTR7_CTRL_BASE,
322 GAUDI2_ENGINE_ID_SIZE, "HMMU11"},
323 {RAZWI_INITIATOR_ID_X_Y(1, 10, 0), mmDCORE2_RTR0_CTRL_BASE,
324 GAUDI2_ENGINE_ID_SIZE, "HMMU12"},
325 {RAZWI_INITIATOR_ID_X_Y(18, 10, 19), mmDCORE3_RTR7_CTRL_BASE,
326 GAUDI2_ENGINE_ID_SIZE, "HMMU13"},
327 {RAZWI_INITIATOR_ID_X_Y(1, 10, 0), mmDCORE2_RTR0_CTRL_BASE,
328 GAUDI2_ENGINE_ID_SIZE, "HMMU14"},
329 {RAZWI_INITIATOR_ID_X_Y(18, 10, 19), mmDCORE3_RTR7_CTRL_BASE,
330 GAUDI2_ENGINE_ID_SIZE, "HMMU15"},
331 {RAZWI_INITIATOR_ID_X_Y(2, 11, 2), mmDCORE2_RTR0_CTRL_BASE,
332 GAUDI2_ENGINE_ID_ROT_0, "ROT0"},
333 {RAZWI_INITIATOR_ID_X_Y(17, 11, 16), mmDCORE3_RTR7_CTRL_BASE,
334 GAUDI2_ENGINE_ID_ROT_1, "ROT1"},
335 {RAZWI_INITIATOR_ID_X_Y(2, 11, 2), mmDCORE2_RTR0_CTRL_BASE,
336 GAUDI2_ENGINE_ID_PSOC, "CPU"},
337 {RAZWI_INITIATOR_ID_X_Y(17, 11, 11), mmDCORE3_RTR7_CTRL_BASE,
338 GAUDI2_ENGINE_ID_PSOC, "PSOC"}
339 };
340
341 static struct gaudi2_razwi_info mme_razwi_info[] = {
342 /* MME X high coordinate is N/A, hence using only low coordinates */
343 {RAZWI_INITIATOR_ID_X_Y_LOW(7, 4), mmDCORE0_RTR5_CTRL_BASE,
344 GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_WAP0"},
345 {RAZWI_INITIATOR_ID_X_Y_LOW(9, 4), mmDCORE0_RTR7_CTRL_BASE,
346 GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_WAP1"},
347 {RAZWI_INITIATOR_ID_X_Y_LOW(8, 4), mmDCORE0_RTR6_CTRL_BASE,
348 GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_CTRL_WR"},
349 {RAZWI_INITIATOR_ID_X_Y_LOW(9, 4), mmDCORE0_RTR7_CTRL_BASE,
350 GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_CTRL_RD"},
351 {RAZWI_INITIATOR_ID_X_Y_LOW(6, 4), mmDCORE0_RTR4_CTRL_BASE,
352 GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_SBTE0"},
353 {RAZWI_INITIATOR_ID_X_Y_LOW(6, 4), mmDCORE0_RTR4_CTRL_BASE,
354 GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_SBTE1"},
355 {RAZWI_INITIATOR_ID_X_Y_LOW(7, 4), mmDCORE0_RTR5_CTRL_BASE,
356 GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_SBTE2"},
357 {RAZWI_INITIATOR_ID_X_Y_LOW(8, 4), mmDCORE0_RTR6_CTRL_BASE,
358 GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_SBTE3"},
359 {RAZWI_INITIATOR_ID_X_Y_LOW(9, 4), mmDCORE0_RTR7_CTRL_BASE,
360 GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_SBTE4"},
361 {RAZWI_INITIATOR_ID_X_Y_LOW(12, 4), mmDCORE1_RTR2_CTRL_BASE,
362 GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_WAP0"},
363 {RAZWI_INITIATOR_ID_X_Y_LOW(10, 4), mmDCORE1_RTR0_CTRL_BASE,
364 GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_WAP1"},
365 {RAZWI_INITIATOR_ID_X_Y_LOW(11, 4), mmDCORE1_RTR1_CTRL_BASE,
366 GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_CTRL_WR"},
367 {RAZWI_INITIATOR_ID_X_Y_LOW(10, 4), mmDCORE1_RTR0_CTRL_BASE,
368 GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_CTRL_RD"},
369 {RAZWI_INITIATOR_ID_X_Y_LOW(13, 4), mmDCORE1_RTR3_CTRL_BASE,
370 GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_SBTE0"},
371 {RAZWI_INITIATOR_ID_X_Y_LOW(13, 4), mmDCORE1_RTR3_CTRL_BASE,
372 GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_SBTE1"},
373 {RAZWI_INITIATOR_ID_X_Y_LOW(12, 4), mmDCORE1_RTR2_CTRL_BASE,
374 GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_SBTE2"},
375 {RAZWI_INITIATOR_ID_X_Y_LOW(11, 4), mmDCORE1_RTR1_CTRL_BASE,
376 GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_SBTE3"},
377 {RAZWI_INITIATOR_ID_X_Y_LOW(10, 4), mmDCORE1_RTR0_CTRL_BASE,
378 GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_SBTE4"},
379 {RAZWI_INITIATOR_ID_X_Y_LOW(7, 11), mmDCORE2_RTR5_CTRL_BASE,
380 GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_WAP0"},
381 {RAZWI_INITIATOR_ID_X_Y_LOW(9, 11), mmDCORE2_RTR7_CTRL_BASE,
382 GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_WAP1"},
383 {RAZWI_INITIATOR_ID_X_Y_LOW(8, 11), mmDCORE2_RTR6_CTRL_BASE,
384 GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_CTRL_WR"},
385 {RAZWI_INITIATOR_ID_X_Y_LOW(9, 11), mmDCORE2_RTR7_CTRL_BASE,
386 GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_CTRL_RD"},
387 {RAZWI_INITIATOR_ID_X_Y_LOW(6, 11), mmDCORE2_RTR4_CTRL_BASE,
388 GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_SBTE0"},
389 {RAZWI_INITIATOR_ID_X_Y_LOW(6, 11), mmDCORE2_RTR4_CTRL_BASE,
390 GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_SBTE1"},
391 {RAZWI_INITIATOR_ID_X_Y_LOW(7, 11), mmDCORE2_RTR5_CTRL_BASE,
392 GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_SBTE2"},
393 {RAZWI_INITIATOR_ID_X_Y_LOW(8, 11), mmDCORE2_RTR6_CTRL_BASE,
394 GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_SBTE3"},
395 {RAZWI_INITIATOR_ID_X_Y_LOW(9, 11), mmDCORE2_RTR7_CTRL_BASE,
396 GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_SBTE4"},
397 {RAZWI_INITIATOR_ID_X_Y_LOW(12, 11), mmDCORE3_RTR2_CTRL_BASE,
398 GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_WAP0"},
399 {RAZWI_INITIATOR_ID_X_Y_LOW(10, 11), mmDCORE3_RTR0_CTRL_BASE,
400 GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_WAP1"},
401 {RAZWI_INITIATOR_ID_X_Y_LOW(11, 11), mmDCORE3_RTR1_CTRL_BASE,
402 GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_CTRL_WR"},
403 {RAZWI_INITIATOR_ID_X_Y_LOW(10, 11), mmDCORE3_RTR0_CTRL_BASE,
404 GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_CTRL_RD"},
405 {RAZWI_INITIATOR_ID_X_Y_LOW(13, 11), mmDCORE3_RTR3_CTRL_BASE,
406 GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_SBTE0"},
407 {RAZWI_INITIATOR_ID_X_Y_LOW(13, 11), mmDCORE3_RTR3_CTRL_BASE,
408 GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_SBTE1"},
409 {RAZWI_INITIATOR_ID_X_Y_LOW(12, 11), mmDCORE3_RTR2_CTRL_BASE,
410 GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_SBTE2"},
411 {RAZWI_INITIATOR_ID_X_Y_LOW(11, 11), mmDCORE3_RTR1_CTRL_BASE,
412 GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_SBTE3"},
413 {RAZWI_INITIATOR_ID_X_Y_LOW(10, 11), mmDCORE3_RTR0_CTRL_BASE,
414 GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_SBTE4"}
415 };
416
417 enum hl_pmmu_fatal_cause {
418 LATENCY_RD_OUT_FIFO_OVERRUN,
419 LATENCY_WR_OUT_FIFO_OVERRUN,
420 };
421
422 enum hl_pcie_drain_ind_cause {
423 LBW_AXI_DRAIN_IND,
424 HBW_AXI_DRAIN_IND
425 };
426
427 static const u32 cluster_hmmu_hif_enabled_mask[GAUDI2_HBM_NUM] = {
428 [HBM_ID0] = 0xFFFC,
429 [HBM_ID1] = 0xFFCF,
430 [HBM_ID2] = 0xF7F7,
431 [HBM_ID3] = 0x7F7F,
432 [HBM_ID4] = 0xFCFF,
433 [HBM_ID5] = 0xCFFF,
434 };
435
436 static const u8 xbar_edge_to_hbm_cluster[EDMA_ID_SIZE] = {
437 [0] = HBM_ID0,
438 [1] = HBM_ID1,
439 [2] = HBM_ID4,
440 [3] = HBM_ID5,
441 };
442
443 static const u8 edma_to_hbm_cluster[EDMA_ID_SIZE] = {
444 [EDMA_ID_DCORE0_INSTANCE0] = HBM_ID0,
445 [EDMA_ID_DCORE0_INSTANCE1] = HBM_ID2,
446 [EDMA_ID_DCORE1_INSTANCE0] = HBM_ID1,
447 [EDMA_ID_DCORE1_INSTANCE1] = HBM_ID3,
448 [EDMA_ID_DCORE2_INSTANCE0] = HBM_ID2,
449 [EDMA_ID_DCORE2_INSTANCE1] = HBM_ID4,
450 [EDMA_ID_DCORE3_INSTANCE0] = HBM_ID3,
451 [EDMA_ID_DCORE3_INSTANCE1] = HBM_ID5,
452 };
453
454 static const int gaudi2_qman_async_event_id[] = {
455 [GAUDI2_QUEUE_ID_PDMA_0_0] = GAUDI2_EVENT_PDMA0_QM,
456 [GAUDI2_QUEUE_ID_PDMA_0_1] = GAUDI2_EVENT_PDMA0_QM,
457 [GAUDI2_QUEUE_ID_PDMA_0_2] = GAUDI2_EVENT_PDMA0_QM,
458 [GAUDI2_QUEUE_ID_PDMA_0_3] = GAUDI2_EVENT_PDMA0_QM,
459 [GAUDI2_QUEUE_ID_PDMA_1_0] = GAUDI2_EVENT_PDMA1_QM,
460 [GAUDI2_QUEUE_ID_PDMA_1_1] = GAUDI2_EVENT_PDMA1_QM,
461 [GAUDI2_QUEUE_ID_PDMA_1_2] = GAUDI2_EVENT_PDMA1_QM,
462 [GAUDI2_QUEUE_ID_PDMA_1_3] = GAUDI2_EVENT_PDMA1_QM,
463 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0] = GAUDI2_EVENT_HDMA0_QM,
464 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_1] = GAUDI2_EVENT_HDMA0_QM,
465 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_2] = GAUDI2_EVENT_HDMA0_QM,
466 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3] = GAUDI2_EVENT_HDMA0_QM,
467 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0] = GAUDI2_EVENT_HDMA1_QM,
468 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_1] = GAUDI2_EVENT_HDMA1_QM,
469 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_2] = GAUDI2_EVENT_HDMA1_QM,
470 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3] = GAUDI2_EVENT_HDMA1_QM,
471 [GAUDI2_QUEUE_ID_DCORE0_MME_0_0] = GAUDI2_EVENT_MME0_QM,
472 [GAUDI2_QUEUE_ID_DCORE0_MME_0_1] = GAUDI2_EVENT_MME0_QM,
473 [GAUDI2_QUEUE_ID_DCORE0_MME_0_2] = GAUDI2_EVENT_MME0_QM,
474 [GAUDI2_QUEUE_ID_DCORE0_MME_0_3] = GAUDI2_EVENT_MME0_QM,
475 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_0] = GAUDI2_EVENT_TPC0_QM,
476 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_1] = GAUDI2_EVENT_TPC0_QM,
477 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_2] = GAUDI2_EVENT_TPC0_QM,
478 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_3] = GAUDI2_EVENT_TPC0_QM,
479 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_0] = GAUDI2_EVENT_TPC1_QM,
480 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_1] = GAUDI2_EVENT_TPC1_QM,
481 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_2] = GAUDI2_EVENT_TPC1_QM,
482 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_3] = GAUDI2_EVENT_TPC1_QM,
483 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_0] = GAUDI2_EVENT_TPC2_QM,
484 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_1] = GAUDI2_EVENT_TPC2_QM,
485 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_2] = GAUDI2_EVENT_TPC2_QM,
486 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_3] = GAUDI2_EVENT_TPC2_QM,
487 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_0] = GAUDI2_EVENT_TPC3_QM,
488 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_1] = GAUDI2_EVENT_TPC3_QM,
489 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_2] = GAUDI2_EVENT_TPC3_QM,
490 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_3] = GAUDI2_EVENT_TPC3_QM,
491 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_0] = GAUDI2_EVENT_TPC4_QM,
492 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_1] = GAUDI2_EVENT_TPC4_QM,
493 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_2] = GAUDI2_EVENT_TPC4_QM,
494 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_3] = GAUDI2_EVENT_TPC4_QM,
495 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_0] = GAUDI2_EVENT_TPC5_QM,
496 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_1] = GAUDI2_EVENT_TPC5_QM,
497 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_2] = GAUDI2_EVENT_TPC5_QM,
498 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_3] = GAUDI2_EVENT_TPC5_QM,
499 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_0] = GAUDI2_EVENT_TPC24_QM,
500 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_1] = GAUDI2_EVENT_TPC24_QM,
501 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_2] = GAUDI2_EVENT_TPC24_QM,
502 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_3] = GAUDI2_EVENT_TPC24_QM,
503 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0] = GAUDI2_EVENT_HDMA2_QM,
504 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_1] = GAUDI2_EVENT_HDMA2_QM,
505 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_2] = GAUDI2_EVENT_HDMA2_QM,
506 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3] = GAUDI2_EVENT_HDMA2_QM,
507 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0] = GAUDI2_EVENT_HDMA3_QM,
508 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_1] = GAUDI2_EVENT_HDMA3_QM,
509 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_2] = GAUDI2_EVENT_HDMA3_QM,
510 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3] = GAUDI2_EVENT_HDMA3_QM,
511 [GAUDI2_QUEUE_ID_DCORE1_MME_0_0] = GAUDI2_EVENT_MME1_QM,
512 [GAUDI2_QUEUE_ID_DCORE1_MME_0_1] = GAUDI2_EVENT_MME1_QM,
513 [GAUDI2_QUEUE_ID_DCORE1_MME_0_2] = GAUDI2_EVENT_MME1_QM,
514 [GAUDI2_QUEUE_ID_DCORE1_MME_0_3] = GAUDI2_EVENT_MME1_QM,
515 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_0] = GAUDI2_EVENT_TPC6_QM,
516 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_1] = GAUDI2_EVENT_TPC6_QM,
517 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_2] = GAUDI2_EVENT_TPC6_QM,
518 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_3] = GAUDI2_EVENT_TPC6_QM,
519 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_0] = GAUDI2_EVENT_TPC7_QM,
520 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_1] = GAUDI2_EVENT_TPC7_QM,
521 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_2] = GAUDI2_EVENT_TPC7_QM,
522 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_3] = GAUDI2_EVENT_TPC7_QM,
523 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_0] = GAUDI2_EVENT_TPC8_QM,
524 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_1] = GAUDI2_EVENT_TPC8_QM,
525 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_2] = GAUDI2_EVENT_TPC8_QM,
526 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_3] = GAUDI2_EVENT_TPC8_QM,
527 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_0] = GAUDI2_EVENT_TPC9_QM,
528 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_1] = GAUDI2_EVENT_TPC9_QM,
529 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_2] = GAUDI2_EVENT_TPC9_QM,
530 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_3] = GAUDI2_EVENT_TPC9_QM,
531 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_0] = GAUDI2_EVENT_TPC10_QM,
532 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_1] = GAUDI2_EVENT_TPC10_QM,
533 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_2] = GAUDI2_EVENT_TPC10_QM,
534 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_3] = GAUDI2_EVENT_TPC10_QM,
535 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_0] = GAUDI2_EVENT_TPC11_QM,
536 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_1] = GAUDI2_EVENT_TPC11_QM,
537 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_2] = GAUDI2_EVENT_TPC11_QM,
538 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_3] = GAUDI2_EVENT_TPC11_QM,
539 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0] = GAUDI2_EVENT_HDMA4_QM,
540 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_1] = GAUDI2_EVENT_HDMA4_QM,
541 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_2] = GAUDI2_EVENT_HDMA4_QM,
542 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3] = GAUDI2_EVENT_HDMA4_QM,
543 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0] = GAUDI2_EVENT_HDMA5_QM,
544 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_1] = GAUDI2_EVENT_HDMA5_QM,
545 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_2] = GAUDI2_EVENT_HDMA5_QM,
546 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3] = GAUDI2_EVENT_HDMA5_QM,
547 [GAUDI2_QUEUE_ID_DCORE2_MME_0_0] = GAUDI2_EVENT_MME2_QM,
548 [GAUDI2_QUEUE_ID_DCORE2_MME_0_1] = GAUDI2_EVENT_MME2_QM,
549 [GAUDI2_QUEUE_ID_DCORE2_MME_0_2] = GAUDI2_EVENT_MME2_QM,
550 [GAUDI2_QUEUE_ID_DCORE2_MME_0_3] = GAUDI2_EVENT_MME2_QM,
551 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_0] = GAUDI2_EVENT_TPC12_QM,
552 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_1] = GAUDI2_EVENT_TPC12_QM,
553 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_2] = GAUDI2_EVENT_TPC12_QM,
554 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_3] = GAUDI2_EVENT_TPC12_QM,
555 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_0] = GAUDI2_EVENT_TPC13_QM,
556 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_1] = GAUDI2_EVENT_TPC13_QM,
557 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_2] = GAUDI2_EVENT_TPC13_QM,
558 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_3] = GAUDI2_EVENT_TPC13_QM,
559 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_0] = GAUDI2_EVENT_TPC14_QM,
560 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_1] = GAUDI2_EVENT_TPC14_QM,
561 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_2] = GAUDI2_EVENT_TPC14_QM,
562 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_3] = GAUDI2_EVENT_TPC14_QM,
563 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_0] = GAUDI2_EVENT_TPC15_QM,
564 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_1] = GAUDI2_EVENT_TPC15_QM,
565 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_2] = GAUDI2_EVENT_TPC15_QM,
566 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_3] = GAUDI2_EVENT_TPC15_QM,
567 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_0] = GAUDI2_EVENT_TPC16_QM,
568 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_1] = GAUDI2_EVENT_TPC16_QM,
569 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_2] = GAUDI2_EVENT_TPC16_QM,
570 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_3] = GAUDI2_EVENT_TPC16_QM,
571 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_0] = GAUDI2_EVENT_TPC17_QM,
572 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_1] = GAUDI2_EVENT_TPC17_QM,
573 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_2] = GAUDI2_EVENT_TPC17_QM,
574 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_3] = GAUDI2_EVENT_TPC17_QM,
575 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0] = GAUDI2_EVENT_HDMA6_QM,
576 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_1] = GAUDI2_EVENT_HDMA6_QM,
577 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_2] = GAUDI2_EVENT_HDMA6_QM,
578 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3] = GAUDI2_EVENT_HDMA6_QM,
579 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0] = GAUDI2_EVENT_HDMA7_QM,
580 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1] = GAUDI2_EVENT_HDMA7_QM,
581 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2] = GAUDI2_EVENT_HDMA7_QM,
582 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3] = GAUDI2_EVENT_HDMA7_QM,
583 [GAUDI2_QUEUE_ID_DCORE3_MME_0_0] = GAUDI2_EVENT_MME3_QM,
584 [GAUDI2_QUEUE_ID_DCORE3_MME_0_1] = GAUDI2_EVENT_MME3_QM,
585 [GAUDI2_QUEUE_ID_DCORE3_MME_0_2] = GAUDI2_EVENT_MME3_QM,
586 [GAUDI2_QUEUE_ID_DCORE3_MME_0_3] = GAUDI2_EVENT_MME3_QM,
587 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_0] = GAUDI2_EVENT_TPC18_QM,
588 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_1] = GAUDI2_EVENT_TPC18_QM,
589 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_2] = GAUDI2_EVENT_TPC18_QM,
590 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_3] = GAUDI2_EVENT_TPC18_QM,
591 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_0] = GAUDI2_EVENT_TPC19_QM,
592 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_1] = GAUDI2_EVENT_TPC19_QM,
593 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_2] = GAUDI2_EVENT_TPC19_QM,
594 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_3] = GAUDI2_EVENT_TPC19_QM,
595 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_0] = GAUDI2_EVENT_TPC20_QM,
596 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_1] = GAUDI2_EVENT_TPC20_QM,
597 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_2] = GAUDI2_EVENT_TPC20_QM,
598 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_3] = GAUDI2_EVENT_TPC20_QM,
599 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_0] = GAUDI2_EVENT_TPC21_QM,
600 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_1] = GAUDI2_EVENT_TPC21_QM,
601 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_2] = GAUDI2_EVENT_TPC21_QM,
602 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_3] = GAUDI2_EVENT_TPC21_QM,
603 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_0] = GAUDI2_EVENT_TPC22_QM,
604 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_1] = GAUDI2_EVENT_TPC22_QM,
605 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_2] = GAUDI2_EVENT_TPC22_QM,
606 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_3] = GAUDI2_EVENT_TPC22_QM,
607 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_0] = GAUDI2_EVENT_TPC23_QM,
608 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_1] = GAUDI2_EVENT_TPC23_QM,
609 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_2] = GAUDI2_EVENT_TPC23_QM,
610 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_3] = GAUDI2_EVENT_TPC23_QM,
611 [GAUDI2_QUEUE_ID_NIC_0_0] = GAUDI2_EVENT_NIC0_QM0,
612 [GAUDI2_QUEUE_ID_NIC_0_1] = GAUDI2_EVENT_NIC0_QM0,
613 [GAUDI2_QUEUE_ID_NIC_0_2] = GAUDI2_EVENT_NIC0_QM0,
614 [GAUDI2_QUEUE_ID_NIC_0_3] = GAUDI2_EVENT_NIC0_QM0,
615 [GAUDI2_QUEUE_ID_NIC_1_0] = GAUDI2_EVENT_NIC0_QM1,
616 [GAUDI2_QUEUE_ID_NIC_1_1] = GAUDI2_EVENT_NIC0_QM1,
617 [GAUDI2_QUEUE_ID_NIC_1_2] = GAUDI2_EVENT_NIC0_QM1,
618 [GAUDI2_QUEUE_ID_NIC_1_3] = GAUDI2_EVENT_NIC0_QM1,
619 [GAUDI2_QUEUE_ID_NIC_2_0] = GAUDI2_EVENT_NIC1_QM0,
620 [GAUDI2_QUEUE_ID_NIC_2_1] = GAUDI2_EVENT_NIC1_QM0,
621 [GAUDI2_QUEUE_ID_NIC_2_2] = GAUDI2_EVENT_NIC1_QM0,
622 [GAUDI2_QUEUE_ID_NIC_2_3] = GAUDI2_EVENT_NIC1_QM0,
623 [GAUDI2_QUEUE_ID_NIC_3_0] = GAUDI2_EVENT_NIC1_QM1,
624 [GAUDI2_QUEUE_ID_NIC_3_1] = GAUDI2_EVENT_NIC1_QM1,
625 [GAUDI2_QUEUE_ID_NIC_3_2] = GAUDI2_EVENT_NIC1_QM1,
626 [GAUDI2_QUEUE_ID_NIC_3_3] = GAUDI2_EVENT_NIC1_QM1,
627 [GAUDI2_QUEUE_ID_NIC_4_0] = GAUDI2_EVENT_NIC2_QM0,
628 [GAUDI2_QUEUE_ID_NIC_4_1] = GAUDI2_EVENT_NIC2_QM0,
629 [GAUDI2_QUEUE_ID_NIC_4_2] = GAUDI2_EVENT_NIC2_QM0,
630 [GAUDI2_QUEUE_ID_NIC_4_3] = GAUDI2_EVENT_NIC2_QM0,
631 [GAUDI2_QUEUE_ID_NIC_5_0] = GAUDI2_EVENT_NIC2_QM1,
632 [GAUDI2_QUEUE_ID_NIC_5_1] = GAUDI2_EVENT_NIC2_QM1,
633 [GAUDI2_QUEUE_ID_NIC_5_2] = GAUDI2_EVENT_NIC2_QM1,
634 [GAUDI2_QUEUE_ID_NIC_5_3] = GAUDI2_EVENT_NIC2_QM1,
635 [GAUDI2_QUEUE_ID_NIC_6_0] = GAUDI2_EVENT_NIC3_QM0,
636 [GAUDI2_QUEUE_ID_NIC_6_1] = GAUDI2_EVENT_NIC3_QM0,
637 [GAUDI2_QUEUE_ID_NIC_6_2] = GAUDI2_EVENT_NIC3_QM0,
638 [GAUDI2_QUEUE_ID_NIC_6_3] = GAUDI2_EVENT_NIC3_QM0,
639 [GAUDI2_QUEUE_ID_NIC_7_0] = GAUDI2_EVENT_NIC3_QM1,
640 [GAUDI2_QUEUE_ID_NIC_7_1] = GAUDI2_EVENT_NIC3_QM1,
641 [GAUDI2_QUEUE_ID_NIC_7_2] = GAUDI2_EVENT_NIC3_QM1,
642 [GAUDI2_QUEUE_ID_NIC_7_3] = GAUDI2_EVENT_NIC3_QM1,
643 [GAUDI2_QUEUE_ID_NIC_8_0] = GAUDI2_EVENT_NIC4_QM0,
644 [GAUDI2_QUEUE_ID_NIC_8_1] = GAUDI2_EVENT_NIC4_QM0,
645 [GAUDI2_QUEUE_ID_NIC_8_2] = GAUDI2_EVENT_NIC4_QM0,
646 [GAUDI2_QUEUE_ID_NIC_8_3] = GAUDI2_EVENT_NIC4_QM0,
647 [GAUDI2_QUEUE_ID_NIC_9_0] = GAUDI2_EVENT_NIC4_QM1,
648 [GAUDI2_QUEUE_ID_NIC_9_1] = GAUDI2_EVENT_NIC4_QM1,
649 [GAUDI2_QUEUE_ID_NIC_9_2] = GAUDI2_EVENT_NIC4_QM1,
650 [GAUDI2_QUEUE_ID_NIC_9_3] = GAUDI2_EVENT_NIC4_QM1,
651 [GAUDI2_QUEUE_ID_NIC_10_0] = GAUDI2_EVENT_NIC5_QM0,
652 [GAUDI2_QUEUE_ID_NIC_10_1] = GAUDI2_EVENT_NIC5_QM0,
653 [GAUDI2_QUEUE_ID_NIC_10_2] = GAUDI2_EVENT_NIC5_QM0,
654 [GAUDI2_QUEUE_ID_NIC_10_3] = GAUDI2_EVENT_NIC5_QM0,
655 [GAUDI2_QUEUE_ID_NIC_11_0] = GAUDI2_EVENT_NIC5_QM1,
656 [GAUDI2_QUEUE_ID_NIC_11_1] = GAUDI2_EVENT_NIC5_QM1,
657 [GAUDI2_QUEUE_ID_NIC_11_2] = GAUDI2_EVENT_NIC5_QM1,
658 [GAUDI2_QUEUE_ID_NIC_11_3] = GAUDI2_EVENT_NIC5_QM1,
659 [GAUDI2_QUEUE_ID_NIC_12_0] = GAUDI2_EVENT_NIC6_QM0,
660 [GAUDI2_QUEUE_ID_NIC_12_1] = GAUDI2_EVENT_NIC6_QM0,
661 [GAUDI2_QUEUE_ID_NIC_12_2] = GAUDI2_EVENT_NIC6_QM0,
662 [GAUDI2_QUEUE_ID_NIC_12_3] = GAUDI2_EVENT_NIC6_QM0,
663 [GAUDI2_QUEUE_ID_NIC_13_0] = GAUDI2_EVENT_NIC6_QM1,
664 [GAUDI2_QUEUE_ID_NIC_13_1] = GAUDI2_EVENT_NIC6_QM1,
665 [GAUDI2_QUEUE_ID_NIC_13_2] = GAUDI2_EVENT_NIC6_QM1,
666 [GAUDI2_QUEUE_ID_NIC_13_3] = GAUDI2_EVENT_NIC6_QM1,
667 [GAUDI2_QUEUE_ID_NIC_14_0] = GAUDI2_EVENT_NIC7_QM0,
668 [GAUDI2_QUEUE_ID_NIC_14_1] = GAUDI2_EVENT_NIC7_QM0,
669 [GAUDI2_QUEUE_ID_NIC_14_2] = GAUDI2_EVENT_NIC7_QM0,
670 [GAUDI2_QUEUE_ID_NIC_14_3] = GAUDI2_EVENT_NIC7_QM0,
671 [GAUDI2_QUEUE_ID_NIC_15_0] = GAUDI2_EVENT_NIC7_QM1,
672 [GAUDI2_QUEUE_ID_NIC_15_1] = GAUDI2_EVENT_NIC7_QM1,
673 [GAUDI2_QUEUE_ID_NIC_15_2] = GAUDI2_EVENT_NIC7_QM1,
674 [GAUDI2_QUEUE_ID_NIC_15_3] = GAUDI2_EVENT_NIC7_QM1,
675 [GAUDI2_QUEUE_ID_NIC_16_0] = GAUDI2_EVENT_NIC8_QM0,
676 [GAUDI2_QUEUE_ID_NIC_16_1] = GAUDI2_EVENT_NIC8_QM0,
677 [GAUDI2_QUEUE_ID_NIC_16_2] = GAUDI2_EVENT_NIC8_QM0,
678 [GAUDI2_QUEUE_ID_NIC_16_3] = GAUDI2_EVENT_NIC8_QM0,
679 [GAUDI2_QUEUE_ID_NIC_17_0] = GAUDI2_EVENT_NIC8_QM1,
680 [GAUDI2_QUEUE_ID_NIC_17_1] = GAUDI2_EVENT_NIC8_QM1,
681 [GAUDI2_QUEUE_ID_NIC_17_2] = GAUDI2_EVENT_NIC8_QM1,
682 [GAUDI2_QUEUE_ID_NIC_17_3] = GAUDI2_EVENT_NIC8_QM1,
683 [GAUDI2_QUEUE_ID_NIC_18_0] = GAUDI2_EVENT_NIC9_QM0,
684 [GAUDI2_QUEUE_ID_NIC_18_1] = GAUDI2_EVENT_NIC9_QM0,
685 [GAUDI2_QUEUE_ID_NIC_18_2] = GAUDI2_EVENT_NIC9_QM0,
686 [GAUDI2_QUEUE_ID_NIC_18_3] = GAUDI2_EVENT_NIC9_QM0,
687 [GAUDI2_QUEUE_ID_NIC_19_0] = GAUDI2_EVENT_NIC9_QM1,
688 [GAUDI2_QUEUE_ID_NIC_19_1] = GAUDI2_EVENT_NIC9_QM1,
689 [GAUDI2_QUEUE_ID_NIC_19_2] = GAUDI2_EVENT_NIC9_QM1,
690 [GAUDI2_QUEUE_ID_NIC_19_3] = GAUDI2_EVENT_NIC9_QM1,
691 [GAUDI2_QUEUE_ID_NIC_20_0] = GAUDI2_EVENT_NIC10_QM0,
692 [GAUDI2_QUEUE_ID_NIC_20_1] = GAUDI2_EVENT_NIC10_QM0,
693 [GAUDI2_QUEUE_ID_NIC_20_2] = GAUDI2_EVENT_NIC10_QM0,
694 [GAUDI2_QUEUE_ID_NIC_20_3] = GAUDI2_EVENT_NIC10_QM0,
695 [GAUDI2_QUEUE_ID_NIC_21_0] = GAUDI2_EVENT_NIC10_QM1,
696 [GAUDI2_QUEUE_ID_NIC_21_1] = GAUDI2_EVENT_NIC10_QM1,
697 [GAUDI2_QUEUE_ID_NIC_21_2] = GAUDI2_EVENT_NIC10_QM1,
698 [GAUDI2_QUEUE_ID_NIC_21_3] = GAUDI2_EVENT_NIC10_QM1,
699 [GAUDI2_QUEUE_ID_NIC_22_0] = GAUDI2_EVENT_NIC11_QM0,
700 [GAUDI2_QUEUE_ID_NIC_22_1] = GAUDI2_EVENT_NIC11_QM0,
701 [GAUDI2_QUEUE_ID_NIC_22_2] = GAUDI2_EVENT_NIC11_QM0,
702 [GAUDI2_QUEUE_ID_NIC_22_3] = GAUDI2_EVENT_NIC11_QM0,
703 [GAUDI2_QUEUE_ID_NIC_23_0] = GAUDI2_EVENT_NIC11_QM1,
704 [GAUDI2_QUEUE_ID_NIC_23_1] = GAUDI2_EVENT_NIC11_QM1,
705 [GAUDI2_QUEUE_ID_NIC_23_2] = GAUDI2_EVENT_NIC11_QM1,
706 [GAUDI2_QUEUE_ID_NIC_23_3] = GAUDI2_EVENT_NIC11_QM1,
707 [GAUDI2_QUEUE_ID_ROT_0_0] = GAUDI2_EVENT_ROTATOR0_ROT0_QM,
708 [GAUDI2_QUEUE_ID_ROT_0_1] = GAUDI2_EVENT_ROTATOR0_ROT0_QM,
709 [GAUDI2_QUEUE_ID_ROT_0_2] = GAUDI2_EVENT_ROTATOR0_ROT0_QM,
710 [GAUDI2_QUEUE_ID_ROT_0_3] = GAUDI2_EVENT_ROTATOR0_ROT0_QM,
711 [GAUDI2_QUEUE_ID_ROT_1_0] = GAUDI2_EVENT_ROTATOR1_ROT1_QM,
712 [GAUDI2_QUEUE_ID_ROT_1_1] = GAUDI2_EVENT_ROTATOR1_ROT1_QM,
713 [GAUDI2_QUEUE_ID_ROT_1_2] = GAUDI2_EVENT_ROTATOR1_ROT1_QM,
714 [GAUDI2_QUEUE_ID_ROT_1_3] = GAUDI2_EVENT_ROTATOR1_ROT1_QM
715 };
716
717 static const int gaudi2_dma_core_async_event_id[] = {
718 [DMA_CORE_ID_EDMA0] = GAUDI2_EVENT_HDMA0_CORE,
719 [DMA_CORE_ID_EDMA1] = GAUDI2_EVENT_HDMA1_CORE,
720 [DMA_CORE_ID_EDMA2] = GAUDI2_EVENT_HDMA2_CORE,
721 [DMA_CORE_ID_EDMA3] = GAUDI2_EVENT_HDMA3_CORE,
722 [DMA_CORE_ID_EDMA4] = GAUDI2_EVENT_HDMA4_CORE,
723 [DMA_CORE_ID_EDMA5] = GAUDI2_EVENT_HDMA5_CORE,
724 [DMA_CORE_ID_EDMA6] = GAUDI2_EVENT_HDMA6_CORE,
725 [DMA_CORE_ID_EDMA7] = GAUDI2_EVENT_HDMA7_CORE,
726 [DMA_CORE_ID_PDMA0] = GAUDI2_EVENT_PDMA0_CORE,
727 [DMA_CORE_ID_PDMA1] = GAUDI2_EVENT_PDMA1_CORE,
728 [DMA_CORE_ID_KDMA] = GAUDI2_EVENT_KDMA0_CORE,
729 };
730
731 const char *gaudi2_engine_id_str[] = {
732 __stringify(GAUDI2_DCORE0_ENGINE_ID_EDMA_0),
733 __stringify(GAUDI2_DCORE0_ENGINE_ID_EDMA_1),
734 __stringify(GAUDI2_DCORE0_ENGINE_ID_MME),
735 __stringify(GAUDI2_DCORE0_ENGINE_ID_TPC_0),
736 __stringify(GAUDI2_DCORE0_ENGINE_ID_TPC_1),
737 __stringify(GAUDI2_DCORE0_ENGINE_ID_TPC_2),
738 __stringify(GAUDI2_DCORE0_ENGINE_ID_TPC_3),
739 __stringify(GAUDI2_DCORE0_ENGINE_ID_TPC_4),
740 __stringify(GAUDI2_DCORE0_ENGINE_ID_TPC_5),
741 __stringify(GAUDI2_DCORE0_ENGINE_ID_DEC_0),
742 __stringify(GAUDI2_DCORE0_ENGINE_ID_DEC_1),
743 __stringify(GAUDI2_DCORE1_ENGINE_ID_EDMA_0),
744 __stringify(GAUDI2_DCORE1_ENGINE_ID_EDMA_1),
745 __stringify(GAUDI2_DCORE1_ENGINE_ID_MME),
746 __stringify(GAUDI2_DCORE1_ENGINE_ID_TPC_0),
747 __stringify(GAUDI2_DCORE1_ENGINE_ID_TPC_1),
748 __stringify(GAUDI2_DCORE1_ENGINE_ID_TPC_2),
749 __stringify(GAUDI2_DCORE1_ENGINE_ID_TPC_3),
750 __stringify(GAUDI2_DCORE1_ENGINE_ID_TPC_4),
751 __stringify(GAUDI2_DCORE1_ENGINE_ID_TPC_5),
752 __stringify(GAUDI2_DCORE1_ENGINE_ID_DEC_0),
753 __stringify(GAUDI2_DCORE1_ENGINE_ID_DEC_1),
754 __stringify(GAUDI2_DCORE2_ENGINE_ID_EDMA_0),
755 __stringify(GAUDI2_DCORE2_ENGINE_ID_EDMA_1),
756 __stringify(GAUDI2_DCORE2_ENGINE_ID_MME),
757 __stringify(GAUDI2_DCORE2_ENGINE_ID_TPC_0),
758 __stringify(GAUDI2_DCORE2_ENGINE_ID_TPC_1),
759 __stringify(GAUDI2_DCORE2_ENGINE_ID_TPC_2),
760 __stringify(GAUDI2_DCORE2_ENGINE_ID_TPC_3),
761 __stringify(GAUDI2_DCORE2_ENGINE_ID_TPC_4),
762 __stringify(GAUDI2_DCORE2_ENGINE_ID_TPC_5),
763 __stringify(GAUDI2_DCORE2_ENGINE_ID_DEC_0),
764 __stringify(GAUDI2_DCORE2_ENGINE_ID_DEC_1),
765 __stringify(GAUDI2_DCORE3_ENGINE_ID_EDMA_0),
766 __stringify(GAUDI2_DCORE3_ENGINE_ID_EDMA_1),
767 __stringify(GAUDI2_DCORE3_ENGINE_ID_MME),
768 __stringify(GAUDI2_DCORE3_ENGINE_ID_TPC_0),
769 __stringify(GAUDI2_DCORE3_ENGINE_ID_TPC_1),
770 __stringify(GAUDI2_DCORE3_ENGINE_ID_TPC_2),
771 __stringify(GAUDI2_DCORE3_ENGINE_ID_TPC_3),
772 __stringify(GAUDI2_DCORE3_ENGINE_ID_TPC_4),
773 __stringify(GAUDI2_DCORE3_ENGINE_ID_TPC_5),
774 __stringify(GAUDI2_DCORE3_ENGINE_ID_DEC_0),
775 __stringify(GAUDI2_DCORE3_ENGINE_ID_DEC_1),
776 __stringify(GAUDI2_DCORE0_ENGINE_ID_TPC_6),
777 __stringify(GAUDI2_ENGINE_ID_PDMA_0),
778 __stringify(GAUDI2_ENGINE_ID_PDMA_1),
779 __stringify(GAUDI2_ENGINE_ID_ROT_0),
780 __stringify(GAUDI2_ENGINE_ID_ROT_1),
781 __stringify(GAUDI2_PCIE_ENGINE_ID_DEC_0),
782 __stringify(GAUDI2_PCIE_ENGINE_ID_DEC_1),
783 __stringify(GAUDI2_ENGINE_ID_NIC0_0),
784 __stringify(GAUDI2_ENGINE_ID_NIC0_1),
785 __stringify(GAUDI2_ENGINE_ID_NIC1_0),
786 __stringify(GAUDI2_ENGINE_ID_NIC1_1),
787 __stringify(GAUDI2_ENGINE_ID_NIC2_0),
788 __stringify(GAUDI2_ENGINE_ID_NIC2_1),
789 __stringify(GAUDI2_ENGINE_ID_NIC3_0),
790 __stringify(GAUDI2_ENGINE_ID_NIC3_1),
791 __stringify(GAUDI2_ENGINE_ID_NIC4_0),
792 __stringify(GAUDI2_ENGINE_ID_NIC4_1),
793 __stringify(GAUDI2_ENGINE_ID_NIC5_0),
794 __stringify(GAUDI2_ENGINE_ID_NIC5_1),
795 __stringify(GAUDI2_ENGINE_ID_NIC6_0),
796 __stringify(GAUDI2_ENGINE_ID_NIC6_1),
797 __stringify(GAUDI2_ENGINE_ID_NIC7_0),
798 __stringify(GAUDI2_ENGINE_ID_NIC7_1),
799 __stringify(GAUDI2_ENGINE_ID_NIC8_0),
800 __stringify(GAUDI2_ENGINE_ID_NIC8_1),
801 __stringify(GAUDI2_ENGINE_ID_NIC9_0),
802 __stringify(GAUDI2_ENGINE_ID_NIC9_1),
803 __stringify(GAUDI2_ENGINE_ID_NIC10_0),
804 __stringify(GAUDI2_ENGINE_ID_NIC10_1),
805 __stringify(GAUDI2_ENGINE_ID_NIC11_0),
806 __stringify(GAUDI2_ENGINE_ID_NIC11_1),
807 __stringify(GAUDI2_ENGINE_ID_PCIE),
808 __stringify(GAUDI2_ENGINE_ID_PSOC),
809 __stringify(GAUDI2_ENGINE_ID_ARC_FARM),
810 __stringify(GAUDI2_ENGINE_ID_KDMA),
811 __stringify(GAUDI2_ENGINE_ID_SIZE),
812 };
813
814 const char *gaudi2_queue_id_str[] = {
815 __stringify(GAUDI2_QUEUE_ID_PDMA_0_0),
816 __stringify(GAUDI2_QUEUE_ID_PDMA_0_1),
817 __stringify(GAUDI2_QUEUE_ID_PDMA_0_2),
818 __stringify(GAUDI2_QUEUE_ID_PDMA_0_3),
819 __stringify(GAUDI2_QUEUE_ID_PDMA_1_0),
820 __stringify(GAUDI2_QUEUE_ID_PDMA_1_1),
821 __stringify(GAUDI2_QUEUE_ID_PDMA_1_2),
822 __stringify(GAUDI2_QUEUE_ID_PDMA_1_3),
823 __stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0),
824 __stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_0_1),
825 __stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_0_2),
826 __stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3),
827 __stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0),
828 __stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_1_1),
829 __stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_1_2),
830 __stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3),
831 __stringify(GAUDI2_QUEUE_ID_DCORE0_MME_0_0),
832 __stringify(GAUDI2_QUEUE_ID_DCORE0_MME_0_1),
833 __stringify(GAUDI2_QUEUE_ID_DCORE0_MME_0_2),
834 __stringify(GAUDI2_QUEUE_ID_DCORE0_MME_0_3),
835 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_0_0),
836 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_0_1),
837 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_0_2),
838 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_0_3),
839 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_1_0),
840 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_1_1),
841 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_1_2),
842 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_1_3),
843 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_2_0),
844 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_2_1),
845 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_2_2),
846 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_2_3),
847 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_3_0),
848 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_3_1),
849 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_3_2),
850 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_3_3),
851 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_4_0),
852 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_4_1),
853 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_4_2),
854 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_4_3),
855 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_5_0),
856 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_5_1),
857 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_5_2),
858 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_5_3),
859 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_6_0),
860 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_6_1),
861 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_6_2),
862 __stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_6_3),
863 __stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0),
864 __stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_0_1),
865 __stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_0_2),
866 __stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3),
867 __stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0),
868 __stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_1_1),
869 __stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_1_2),
870 __stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3),
871 __stringify(GAUDI2_QUEUE_ID_DCORE1_MME_0_0),
872 __stringify(GAUDI2_QUEUE_ID_DCORE1_MME_0_1),
873 __stringify(GAUDI2_QUEUE_ID_DCORE1_MME_0_2),
874 __stringify(GAUDI2_QUEUE_ID_DCORE1_MME_0_3),
875 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_0_0),
876 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_0_1),
877 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_0_2),
878 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_0_3),
879 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_1_0),
880 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_1_1),
881 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_1_2),
882 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_1_3),
883 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_2_0),
884 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_2_1),
885 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_2_2),
886 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_2_3),
887 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_3_0),
888 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_3_1),
889 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_3_2),
890 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_3_3),
891 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_4_0),
892 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_4_1),
893 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_4_2),
894 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_4_3),
895 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_5_0),
896 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_5_1),
897 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_5_2),
898 __stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_5_3),
899 __stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0),
900 __stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_0_1),
901 __stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_0_2),
902 __stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3),
903 __stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0),
904 __stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_1_1),
905 __stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_1_2),
906 __stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3),
907 __stringify(GAUDI2_QUEUE_ID_DCORE2_MME_0_0),
908 __stringify(GAUDI2_QUEUE_ID_DCORE2_MME_0_1),
909 __stringify(GAUDI2_QUEUE_ID_DCORE2_MME_0_2),
910 __stringify(GAUDI2_QUEUE_ID_DCORE2_MME_0_3),
911 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_0_0),
912 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_0_1),
913 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_0_2),
914 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_0_3),
915 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_1_0),
916 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_1_1),
917 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_1_2),
918 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_1_3),
919 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_2_0),
920 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_2_1),
921 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_2_2),
922 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_2_3),
923 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_3_0),
924 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_3_1),
925 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_3_2),
926 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_3_3),
927 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_4_0),
928 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_4_1),
929 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_4_2),
930 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_4_3),
931 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_5_0),
932 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_5_1),
933 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_5_2),
934 __stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_5_3),
935 __stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0),
936 __stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_0_1),
937 __stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_0_2),
938 __stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3),
939 __stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0),
940 __stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1),
941 __stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2),
942 __stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3),
943 __stringify(GAUDI2_QUEUE_ID_DCORE3_MME_0_0),
944 __stringify(GAUDI2_QUEUE_ID_DCORE3_MME_0_1),
945 __stringify(GAUDI2_QUEUE_ID_DCORE3_MME_0_2),
946 __stringify(GAUDI2_QUEUE_ID_DCORE3_MME_0_3),
947 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_0_0),
948 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_0_1),
949 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_0_2),
950 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_0_3),
951 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_1_0),
952 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_1_1),
953 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_1_2),
954 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_1_3),
955 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_2_0),
956 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_2_1),
957 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_2_2),
958 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_2_3),
959 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_3_0),
960 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_3_1),
961 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_3_2),
962 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_3_3),
963 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_4_0),
964 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_4_1),
965 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_4_2),
966 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_4_3),
967 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_5_0),
968 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_5_1),
969 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_5_2),
970 __stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_5_3),
971 __stringify(GAUDI2_QUEUE_ID_NIC_0_0),
972 __stringify(GAUDI2_QUEUE_ID_NIC_0_1),
973 __stringify(GAUDI2_QUEUE_ID_NIC_0_2),
974 __stringify(GAUDI2_QUEUE_ID_NIC_0_3),
975 __stringify(GAUDI2_QUEUE_ID_NIC_1_0),
976 __stringify(GAUDI2_QUEUE_ID_NIC_1_1),
977 __stringify(GAUDI2_QUEUE_ID_NIC_1_2),
978 __stringify(GAUDI2_QUEUE_ID_NIC_1_3),
979 __stringify(GAUDI2_QUEUE_ID_NIC_2_0),
980 __stringify(GAUDI2_QUEUE_ID_NIC_2_1),
981 __stringify(GAUDI2_QUEUE_ID_NIC_2_2),
982 __stringify(GAUDI2_QUEUE_ID_NIC_2_3),
983 __stringify(GAUDI2_QUEUE_ID_NIC_3_0),
984 __stringify(GAUDI2_QUEUE_ID_NIC_3_1),
985 __stringify(GAUDI2_QUEUE_ID_NIC_3_2),
986 __stringify(GAUDI2_QUEUE_ID_NIC_3_3),
987 __stringify(GAUDI2_QUEUE_ID_NIC_4_0),
988 __stringify(GAUDI2_QUEUE_ID_NIC_4_1),
989 __stringify(GAUDI2_QUEUE_ID_NIC_4_2),
990 __stringify(GAUDI2_QUEUE_ID_NIC_4_3),
991 __stringify(GAUDI2_QUEUE_ID_NIC_5_0),
992 __stringify(GAUDI2_QUEUE_ID_NIC_5_1),
993 __stringify(GAUDI2_QUEUE_ID_NIC_5_2),
994 __stringify(GAUDI2_QUEUE_ID_NIC_5_3),
995 __stringify(GAUDI2_QUEUE_ID_NIC_6_0),
996 __stringify(GAUDI2_QUEUE_ID_NIC_6_1),
997 __stringify(GAUDI2_QUEUE_ID_NIC_6_2),
998 __stringify(GAUDI2_QUEUE_ID_NIC_6_3),
999 __stringify(GAUDI2_QUEUE_ID_NIC_7_0),
1000 __stringify(GAUDI2_QUEUE_ID_NIC_7_1),
1001 __stringify(GAUDI2_QUEUE_ID_NIC_7_2),
1002 __stringify(GAUDI2_QUEUE_ID_NIC_7_3),
1003 __stringify(GAUDI2_QUEUE_ID_NIC_8_0),
1004 __stringify(GAUDI2_QUEUE_ID_NIC_8_1),
1005 __stringify(GAUDI2_QUEUE_ID_NIC_8_2),
1006 __stringify(GAUDI2_QUEUE_ID_NIC_8_3),
1007 __stringify(GAUDI2_QUEUE_ID_NIC_9_0),
1008 __stringify(GAUDI2_QUEUE_ID_NIC_9_1),
1009 __stringify(GAUDI2_QUEUE_ID_NIC_9_2),
1010 __stringify(GAUDI2_QUEUE_ID_NIC_9_3),
1011 __stringify(GAUDI2_QUEUE_ID_NIC_10_0),
1012 __stringify(GAUDI2_QUEUE_ID_NIC_10_1),
1013 __stringify(GAUDI2_QUEUE_ID_NIC_10_2),
1014 __stringify(GAUDI2_QUEUE_ID_NIC_10_3),
1015 __stringify(GAUDI2_QUEUE_ID_NIC_11_0),
1016 __stringify(GAUDI2_QUEUE_ID_NIC_11_1),
1017 __stringify(GAUDI2_QUEUE_ID_NIC_11_2),
1018 __stringify(GAUDI2_QUEUE_ID_NIC_11_3),
1019 __stringify(GAUDI2_QUEUE_ID_NIC_12_0),
1020 __stringify(GAUDI2_QUEUE_ID_NIC_12_1),
1021 __stringify(GAUDI2_QUEUE_ID_NIC_12_2),
1022 __stringify(GAUDI2_QUEUE_ID_NIC_12_3),
1023 __stringify(GAUDI2_QUEUE_ID_NIC_13_0),
1024 __stringify(GAUDI2_QUEUE_ID_NIC_13_1),
1025 __stringify(GAUDI2_QUEUE_ID_NIC_13_2),
1026 __stringify(GAUDI2_QUEUE_ID_NIC_13_3),
1027 __stringify(GAUDI2_QUEUE_ID_NIC_14_0),
1028 __stringify(GAUDI2_QUEUE_ID_NIC_14_1),
1029 __stringify(GAUDI2_QUEUE_ID_NIC_14_2),
1030 __stringify(GAUDI2_QUEUE_ID_NIC_14_3),
1031 __stringify(GAUDI2_QUEUE_ID_NIC_15_0),
1032 __stringify(GAUDI2_QUEUE_ID_NIC_15_1),
1033 __stringify(GAUDI2_QUEUE_ID_NIC_15_2),
1034 __stringify(GAUDI2_QUEUE_ID_NIC_15_3),
1035 __stringify(GAUDI2_QUEUE_ID_NIC_16_0),
1036 __stringify(GAUDI2_QUEUE_ID_NIC_16_1),
1037 __stringify(GAUDI2_QUEUE_ID_NIC_16_2),
1038 __stringify(GAUDI2_QUEUE_ID_NIC_16_3),
1039 __stringify(GAUDI2_QUEUE_ID_NIC_17_0),
1040 __stringify(GAUDI2_QUEUE_ID_NIC_17_1),
1041 __stringify(GAUDI2_QUEUE_ID_NIC_17_2),
1042 __stringify(GAUDI2_QUEUE_ID_NIC_17_3),
1043 __stringify(GAUDI2_QUEUE_ID_NIC_18_0),
1044 __stringify(GAUDI2_QUEUE_ID_NIC_18_1),
1045 __stringify(GAUDI2_QUEUE_ID_NIC_18_2),
1046 __stringify(GAUDI2_QUEUE_ID_NIC_18_3),
1047 __stringify(GAUDI2_QUEUE_ID_NIC_19_0),
1048 __stringify(GAUDI2_QUEUE_ID_NIC_19_1),
1049 __stringify(GAUDI2_QUEUE_ID_NIC_19_2),
1050 __stringify(GAUDI2_QUEUE_ID_NIC_19_3),
1051 __stringify(GAUDI2_QUEUE_ID_NIC_20_0),
1052 __stringify(GAUDI2_QUEUE_ID_NIC_20_1),
1053 __stringify(GAUDI2_QUEUE_ID_NIC_20_2),
1054 __stringify(GAUDI2_QUEUE_ID_NIC_20_3),
1055 __stringify(GAUDI2_QUEUE_ID_NIC_21_0),
1056 __stringify(GAUDI2_QUEUE_ID_NIC_21_1),
1057 __stringify(GAUDI2_QUEUE_ID_NIC_21_2),
1058 __stringify(GAUDI2_QUEUE_ID_NIC_21_3),
1059 __stringify(GAUDI2_QUEUE_ID_NIC_22_0),
1060 __stringify(GAUDI2_QUEUE_ID_NIC_22_1),
1061 __stringify(GAUDI2_QUEUE_ID_NIC_22_2),
1062 __stringify(GAUDI2_QUEUE_ID_NIC_22_3),
1063 __stringify(GAUDI2_QUEUE_ID_NIC_23_0),
1064 __stringify(GAUDI2_QUEUE_ID_NIC_23_1),
1065 __stringify(GAUDI2_QUEUE_ID_NIC_23_2),
1066 __stringify(GAUDI2_QUEUE_ID_NIC_23_3),
1067 __stringify(GAUDI2_QUEUE_ID_ROT_0_0),
1068 __stringify(GAUDI2_QUEUE_ID_ROT_0_1),
1069 __stringify(GAUDI2_QUEUE_ID_ROT_0_2),
1070 __stringify(GAUDI2_QUEUE_ID_ROT_0_3),
1071 __stringify(GAUDI2_QUEUE_ID_ROT_1_0),
1072 __stringify(GAUDI2_QUEUE_ID_ROT_1_1),
1073 __stringify(GAUDI2_QUEUE_ID_ROT_1_2),
1074 __stringify(GAUDI2_QUEUE_ID_ROT_1_3),
1075 __stringify(GAUDI2_QUEUE_ID_CPU_PQ),
1076 __stringify(GAUDI2_QUEUE_ID_SIZE),
1077 };
1078
1079 static const char * const gaudi2_qm_sei_error_cause[GAUDI2_NUM_OF_QM_SEI_ERR_CAUSE] = {
1080 "qman sei intr",
1081 "arc sei intr"
1082 };
1083
1084 static const char * const gaudi2_cpu_sei_error_cause[GAUDI2_NUM_OF_CPU_SEI_ERR_CAUSE] = {
1085 "AXI_TERMINATOR WR",
1086 "AXI_TERMINATOR RD",
1087 "AXI SPLIT SEI Status"
1088 };
1089
1090 static const char * const gaudi2_arc_sei_error_cause[GAUDI2_NUM_OF_ARC_SEI_ERR_CAUSE] = {
1091 "cbu_bresp_sei_intr_cause",
1092 "cbu_rresp_sei_intr_cause",
1093 "lbu_bresp_sei_intr_cause",
1094 "lbu_rresp_sei_intr_cause",
1095 "cbu_axi_split_intr_cause",
1096 "lbu_axi_split_intr_cause",
1097 "arc_ip_excptn_sei_intr_cause",
1098 "dmi_bresp_sei_intr_cause",
1099 "aux2apb_err_sei_intr_cause",
1100 "cfg_lbw_wr_terminated_intr_cause",
1101 "cfg_lbw_rd_terminated_intr_cause",
1102 "cfg_dccm_wr_terminated_intr_cause",
1103 "cfg_dccm_rd_terminated_intr_cause",
1104 "cfg_hbw_rd_terminated_intr_cause"
1105 };
1106
1107 static const char * const gaudi2_dec_error_cause[GAUDI2_NUM_OF_DEC_ERR_CAUSE] = {
1108 "msix_vcd_hbw_sei",
1109 "msix_l2c_hbw_sei",
1110 "msix_nrm_hbw_sei",
1111 "msix_abnrm_hbw_sei",
1112 "msix_vcd_lbw_sei",
1113 "msix_l2c_lbw_sei",
1114 "msix_nrm_lbw_sei",
1115 "msix_abnrm_lbw_sei",
1116 "apb_vcd_lbw_sei",
1117 "apb_l2c_lbw_sei",
1118 "apb_nrm_lbw_sei",
1119 "apb_abnrm_lbw_sei",
1120 "dec_sei",
1121 "dec_apb_sei",
1122 "trc_apb_sei",
1123 "lbw_mstr_if_sei",
1124 "axi_split_bresp_err_sei",
1125 "hbw_axi_wr_viol_sei",
1126 "hbw_axi_rd_viol_sei",
1127 "lbw_axi_wr_viol_sei",
1128 "lbw_axi_rd_viol_sei",
1129 "vcd_spi",
1130 "l2c_spi",
1131 "nrm_spi",
1132 "abnrm_spi",
1133 };
1134
1135 static const char * const gaudi2_qman_error_cause[GAUDI2_NUM_OF_QM_ERR_CAUSE] = {
1136 "PQ AXI HBW error",
1137 "CQ AXI HBW error",
1138 "CP AXI HBW error",
1139 "CP error due to undefined OPCODE",
1140 "CP encountered STOP OPCODE",
1141 "CP AXI LBW error",
1142 "CP WRREG32 or WRBULK returned error",
1143 "N/A",
1144 "FENCE 0 inc over max value and clipped",
1145 "FENCE 1 inc over max value and clipped",
1146 "FENCE 2 inc over max value and clipped",
1147 "FENCE 3 inc over max value and clipped",
1148 "FENCE 0 dec under min value and clipped",
1149 "FENCE 1 dec under min value and clipped",
1150 "FENCE 2 dec under min value and clipped",
1151 "FENCE 3 dec under min value and clipped",
1152 "CPDMA Up overflow",
1153 "PQC L2H error"
1154 };
1155
1156 static const char * const gaudi2_lower_qman_error_cause[GAUDI2_NUM_OF_LOWER_QM_ERR_CAUSE] = {
1157 "RSVD0",
1158 "CQ AXI HBW error",
1159 "CP AXI HBW error",
1160 "CP error due to undefined OPCODE",
1161 "CP encountered STOP OPCODE",
1162 "CP AXI LBW error",
1163 "CP WRREG32 or WRBULK returned error",
1164 "N/A",
1165 "FENCE 0 inc over max value and clipped",
1166 "FENCE 1 inc over max value and clipped",
1167 "FENCE 2 inc over max value and clipped",
1168 "FENCE 3 inc over max value and clipped",
1169 "FENCE 0 dec under min value and clipped",
1170 "FENCE 1 dec under min value and clipped",
1171 "FENCE 2 dec under min value and clipped",
1172 "FENCE 3 dec under min value and clipped",
1173 "CPDMA Up overflow",
1174 "RSVD17",
1175 "CQ_WR_IFIFO_CI_ERR",
1176 "CQ_WR_CTL_CI_ERR",
1177 "ARC_CQF_RD_ERR",
1178 "ARC_CQ_WR_IFIFO_CI_ERR",
1179 "ARC_CQ_WR_CTL_CI_ERR",
1180 "ARC_AXI_ERR",
1181 "CP_SWITCH_WDT_ERR"
1182 };
1183
1184 static const char * const gaudi2_qman_arb_error_cause[GAUDI2_NUM_OF_QM_ARB_ERR_CAUSE] = {
1185 "Choice push while full error",
1186 "Choice Q watchdog error",
1187 "MSG AXI LBW returned with error"
1188 };
1189
1190 static const char * const guadi2_rot_error_cause[GAUDI2_NUM_OF_ROT_ERR_CAUSE] = {
1191 "qm_axi_err",
1192 "qm_trace_fence_events",
1193 "qm_sw_err",
1194 "qm_cp_sw_stop",
1195 "lbw_mstr_rresp_err",
1196 "lbw_mstr_bresp_err",
1197 "lbw_msg_slverr",
1198 "hbw_msg_slverr",
1199 "wbc_slverr",
1200 "hbw_mstr_rresp_err",
1201 "hbw_mstr_bresp_err",
1202 "sb_resp_intr",
1203 "mrsb_resp_intr",
1204 "core_dw_status_0",
1205 "core_dw_status_1",
1206 "core_dw_status_2",
1207 "core_dw_status_3",
1208 "core_dw_status_4",
1209 "core_dw_status_5",
1210 "core_dw_status_6",
1211 "core_dw_status_7",
1212 "async_arc2cpu_sei_intr",
1213 };
1214
1215 static const char * const gaudi2_tpc_interrupts_cause[GAUDI2_NUM_OF_TPC_INTR_CAUSE] = {
1216 "tpc_address_exceed_slm",
1217 "tpc_div_by_0",
1218 "tpc_spu_mac_overflow",
1219 "tpc_spu_addsub_overflow",
1220 "tpc_spu_abs_overflow",
1221 "tpc_spu_fma_fp_dst_nan",
1222 "tpc_spu_fma_fp_dst_inf",
1223 "tpc_spu_convert_fp_dst_nan",
1224 "tpc_spu_convert_fp_dst_inf",
1225 "tpc_spu_fp_dst_denorm",
1226 "tpc_vpu_mac_overflow",
1227 "tpc_vpu_addsub_overflow",
1228 "tpc_vpu_abs_overflow",
1229 "tpc_vpu_convert_fp_dst_nan",
1230 "tpc_vpu_convert_fp_dst_inf",
1231 "tpc_vpu_fma_fp_dst_nan",
1232 "tpc_vpu_fma_fp_dst_inf",
1233 "tpc_vpu_fp_dst_denorm",
1234 "tpc_assertions",
1235 "tpc_illegal_instruction",
1236 "tpc_pc_wrap_around",
1237 "tpc_qm_sw_err",
1238 "tpc_hbw_rresp_err",
1239 "tpc_hbw_bresp_err",
1240 "tpc_lbw_rresp_err",
1241 "tpc_lbw_bresp_err",
1242 "st_unlock_already_locked",
1243 "invalid_lock_access",
1244 "LD_L protection violation",
1245 "ST_L protection violation",
1246 "D$ L0CS mismatch",
1247 };
1248
1249 static const char * const guadi2_mme_error_cause[GAUDI2_NUM_OF_MME_ERR_CAUSE] = {
1250 "agu_resp_intr",
1251 "qman_axi_err",
1252 "wap sei (wbc axi err)",
1253 "arc sei",
1254 "cfg access error",
1255 "qm_sw_err",
1256 "sbte_dbg_intr_0",
1257 "sbte_dbg_intr_1",
1258 "sbte_dbg_intr_2",
1259 "sbte_dbg_intr_3",
1260 "sbte_dbg_intr_4",
1261 "sbte_prtn_intr_0",
1262 "sbte_prtn_intr_1",
1263 "sbte_prtn_intr_2",
1264 "sbte_prtn_intr_3",
1265 "sbte_prtn_intr_4",
1266 };
1267
1268 static const char * const guadi2_mme_wap_error_cause[GAUDI2_NUM_OF_MME_WAP_ERR_CAUSE] = {
1269 "WBC ERR RESP_0",
1270 "WBC ERR RESP_1",
1271 "AP SOURCE POS INF",
1272 "AP SOURCE NEG INF",
1273 "AP SOURCE NAN",
1274 "AP RESULT POS INF",
1275 "AP RESULT NEG INF",
1276 };
1277
1278 static const char * const gaudi2_dma_core_interrupts_cause[GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE] = {
1279 "HBW Read returned with error RRESP",
1280 "HBW write returned with error BRESP",
1281 "LBW write returned with error BRESP",
1282 "descriptor_fifo_overflow",
1283 "KDMA SB LBW Read returned with error",
1284 "KDMA WBC LBW Write returned with error",
1285 "TRANSPOSE ENGINE DESC FIFO OVERFLOW",
1286 "WRONG CFG FOR COMMIT IN LIN DMA"
1287 };
1288
1289 static const char * const gaudi2_kdma_core_interrupts_cause[GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE] = {
1290 "HBW/LBW Read returned with error RRESP",
1291 "HBW/LBW write returned with error BRESP",
1292 "LBW write returned with error BRESP",
1293 "descriptor_fifo_overflow",
1294 "KDMA SB LBW Read returned with error",
1295 "KDMA WBC LBW Write returned with error",
1296 "TRANSPOSE ENGINE DESC FIFO OVERFLOW",
1297 "WRONG CFG FOR COMMIT IN LIN DMA"
1298 };
1299
1300 struct gaudi2_sm_sei_cause_data {
1301 const char *cause_name;
1302 const char *log_name;
1303 };
1304
1305 static const struct gaudi2_sm_sei_cause_data
1306 gaudi2_sm_sei_cause[GAUDI2_NUM_OF_SM_SEI_ERR_CAUSE] = {
1307 {"calculated SO value overflow/underflow", "SOB ID"},
1308 {"payload address of monitor is not aligned to 4B", "monitor addr"},
1309 {"armed monitor write got BRESP (SLVERR or DECERR)", "AXI id"},
1310 };
1311
1312 static const char * const
1313 gaudi2_pmmu_fatal_interrupts_cause[GAUDI2_NUM_OF_PMMU_FATAL_ERR_CAUSE] = {
1314 "LATENCY_RD_OUT_FIFO_OVERRUN",
1315 "LATENCY_WR_OUT_FIFO_OVERRUN",
1316 };
1317
1318 static const char * const
1319 gaudi2_hif_fatal_interrupts_cause[GAUDI2_NUM_OF_HIF_FATAL_ERR_CAUSE] = {
1320 "LATENCY_RD_OUT_FIFO_OVERRUN",
1321 "LATENCY_WR_OUT_FIFO_OVERRUN",
1322 };
1323
1324 static const char * const
1325 gaudi2_psoc_axi_drain_interrupts_cause[GAUDI2_NUM_OF_AXI_DRAIN_ERR_CAUSE] = {
1326 "AXI drain HBW",
1327 "AXI drain LBW",
1328 };
1329
1330 static const char * const
1331 gaudi2_pcie_addr_dec_error_cause[GAUDI2_NUM_OF_PCIE_ADDR_DEC_ERR_CAUSE] = {
1332 "HBW error response",
1333 "LBW error response",
1334 "TLP is blocked by RR"
1335 };
1336
1337 static const int gaudi2_queue_id_to_engine_id[] = {
1338 [GAUDI2_QUEUE_ID_PDMA_0_0...GAUDI2_QUEUE_ID_PDMA_0_3] = GAUDI2_ENGINE_ID_PDMA_0,
1339 [GAUDI2_QUEUE_ID_PDMA_1_0...GAUDI2_QUEUE_ID_PDMA_1_3] = GAUDI2_ENGINE_ID_PDMA_1,
1340 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3] =
1341 GAUDI2_DCORE0_ENGINE_ID_EDMA_0,
1342 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3] =
1343 GAUDI2_DCORE0_ENGINE_ID_EDMA_1,
1344 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3] =
1345 GAUDI2_DCORE1_ENGINE_ID_EDMA_0,
1346 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3] =
1347 GAUDI2_DCORE1_ENGINE_ID_EDMA_1,
1348 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3] =
1349 GAUDI2_DCORE2_ENGINE_ID_EDMA_0,
1350 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3] =
1351 GAUDI2_DCORE2_ENGINE_ID_EDMA_1,
1352 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3] =
1353 GAUDI2_DCORE3_ENGINE_ID_EDMA_0,
1354 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3] =
1355 GAUDI2_DCORE3_ENGINE_ID_EDMA_1,
1356 [GAUDI2_QUEUE_ID_DCORE0_MME_0_0...GAUDI2_QUEUE_ID_DCORE0_MME_0_3] =
1357 GAUDI2_DCORE0_ENGINE_ID_MME,
1358 [GAUDI2_QUEUE_ID_DCORE1_MME_0_0...GAUDI2_QUEUE_ID_DCORE1_MME_0_3] =
1359 GAUDI2_DCORE1_ENGINE_ID_MME,
1360 [GAUDI2_QUEUE_ID_DCORE2_MME_0_0...GAUDI2_QUEUE_ID_DCORE2_MME_0_3] =
1361 GAUDI2_DCORE2_ENGINE_ID_MME,
1362 [GAUDI2_QUEUE_ID_DCORE3_MME_0_0...GAUDI2_QUEUE_ID_DCORE3_MME_0_3] =
1363 GAUDI2_DCORE3_ENGINE_ID_MME,
1364 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_0...GAUDI2_QUEUE_ID_DCORE0_TPC_0_3] =
1365 GAUDI2_DCORE0_ENGINE_ID_TPC_0,
1366 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_0...GAUDI2_QUEUE_ID_DCORE0_TPC_1_3] =
1367 GAUDI2_DCORE0_ENGINE_ID_TPC_1,
1368 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_0...GAUDI2_QUEUE_ID_DCORE0_TPC_2_3] =
1369 GAUDI2_DCORE0_ENGINE_ID_TPC_2,
1370 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_0...GAUDI2_QUEUE_ID_DCORE0_TPC_3_3] =
1371 GAUDI2_DCORE0_ENGINE_ID_TPC_3,
1372 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_0...GAUDI2_QUEUE_ID_DCORE0_TPC_4_3] =
1373 GAUDI2_DCORE0_ENGINE_ID_TPC_4,
1374 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_0...GAUDI2_QUEUE_ID_DCORE0_TPC_5_3] =
1375 GAUDI2_DCORE0_ENGINE_ID_TPC_5,
1376 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_0...GAUDI2_QUEUE_ID_DCORE0_TPC_6_3] =
1377 GAUDI2_DCORE0_ENGINE_ID_TPC_6,
1378 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_0...GAUDI2_QUEUE_ID_DCORE1_TPC_0_3] =
1379 GAUDI2_DCORE1_ENGINE_ID_TPC_0,
1380 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_0...GAUDI2_QUEUE_ID_DCORE1_TPC_1_3] =
1381 GAUDI2_DCORE1_ENGINE_ID_TPC_1,
1382 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_0...GAUDI2_QUEUE_ID_DCORE1_TPC_2_3] =
1383 GAUDI2_DCORE1_ENGINE_ID_TPC_2,
1384 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_0...GAUDI2_QUEUE_ID_DCORE1_TPC_3_3] =
1385 GAUDI2_DCORE1_ENGINE_ID_TPC_3,
1386 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_0...GAUDI2_QUEUE_ID_DCORE1_TPC_4_3] =
1387 GAUDI2_DCORE1_ENGINE_ID_TPC_4,
1388 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_0...GAUDI2_QUEUE_ID_DCORE1_TPC_5_3] =
1389 GAUDI2_DCORE1_ENGINE_ID_TPC_5,
1390 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_0...GAUDI2_QUEUE_ID_DCORE2_TPC_0_3] =
1391 GAUDI2_DCORE2_ENGINE_ID_TPC_0,
1392 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_0...GAUDI2_QUEUE_ID_DCORE2_TPC_1_3] =
1393 GAUDI2_DCORE2_ENGINE_ID_TPC_1,
1394 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_0...GAUDI2_QUEUE_ID_DCORE2_TPC_2_3] =
1395 GAUDI2_DCORE2_ENGINE_ID_TPC_2,
1396 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_0...GAUDI2_QUEUE_ID_DCORE2_TPC_3_3] =
1397 GAUDI2_DCORE2_ENGINE_ID_TPC_3,
1398 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_0...GAUDI2_QUEUE_ID_DCORE2_TPC_4_3] =
1399 GAUDI2_DCORE2_ENGINE_ID_TPC_4,
1400 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_0...GAUDI2_QUEUE_ID_DCORE2_TPC_5_3] =
1401 GAUDI2_DCORE2_ENGINE_ID_TPC_5,
1402 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_0...GAUDI2_QUEUE_ID_DCORE3_TPC_0_3] =
1403 GAUDI2_DCORE3_ENGINE_ID_TPC_0,
1404 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_0...GAUDI2_QUEUE_ID_DCORE3_TPC_1_3] =
1405 GAUDI2_DCORE3_ENGINE_ID_TPC_1,
1406 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_0...GAUDI2_QUEUE_ID_DCORE3_TPC_2_3] =
1407 GAUDI2_DCORE3_ENGINE_ID_TPC_2,
1408 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_0...GAUDI2_QUEUE_ID_DCORE3_TPC_3_3] =
1409 GAUDI2_DCORE3_ENGINE_ID_TPC_3,
1410 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_0...GAUDI2_QUEUE_ID_DCORE3_TPC_4_3] =
1411 GAUDI2_DCORE3_ENGINE_ID_TPC_4,
1412 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_0...GAUDI2_QUEUE_ID_DCORE3_TPC_5_3] =
1413 GAUDI2_DCORE3_ENGINE_ID_TPC_5,
1414 [GAUDI2_QUEUE_ID_NIC_0_0...GAUDI2_QUEUE_ID_NIC_0_3] = GAUDI2_ENGINE_ID_NIC0_0,
1415 [GAUDI2_QUEUE_ID_NIC_1_0...GAUDI2_QUEUE_ID_NIC_1_3] = GAUDI2_ENGINE_ID_NIC0_1,
1416 [GAUDI2_QUEUE_ID_NIC_2_0...GAUDI2_QUEUE_ID_NIC_2_3] = GAUDI2_ENGINE_ID_NIC1_0,
1417 [GAUDI2_QUEUE_ID_NIC_3_0...GAUDI2_QUEUE_ID_NIC_3_3] = GAUDI2_ENGINE_ID_NIC1_1,
1418 [GAUDI2_QUEUE_ID_NIC_4_0...GAUDI2_QUEUE_ID_NIC_4_3] = GAUDI2_ENGINE_ID_NIC2_0,
1419 [GAUDI2_QUEUE_ID_NIC_5_0...GAUDI2_QUEUE_ID_NIC_5_3] = GAUDI2_ENGINE_ID_NIC2_1,
1420 [GAUDI2_QUEUE_ID_NIC_6_0...GAUDI2_QUEUE_ID_NIC_6_3] = GAUDI2_ENGINE_ID_NIC3_0,
1421 [GAUDI2_QUEUE_ID_NIC_7_0...GAUDI2_QUEUE_ID_NIC_7_3] = GAUDI2_ENGINE_ID_NIC3_1,
1422 [GAUDI2_QUEUE_ID_NIC_8_0...GAUDI2_QUEUE_ID_NIC_8_3] = GAUDI2_ENGINE_ID_NIC4_0,
1423 [GAUDI2_QUEUE_ID_NIC_9_0...GAUDI2_QUEUE_ID_NIC_9_3] = GAUDI2_ENGINE_ID_NIC4_1,
1424 [GAUDI2_QUEUE_ID_NIC_10_0...GAUDI2_QUEUE_ID_NIC_10_3] = GAUDI2_ENGINE_ID_NIC5_0,
1425 [GAUDI2_QUEUE_ID_NIC_11_0...GAUDI2_QUEUE_ID_NIC_11_3] = GAUDI2_ENGINE_ID_NIC5_1,
1426 [GAUDI2_QUEUE_ID_NIC_12_0...GAUDI2_QUEUE_ID_NIC_12_3] = GAUDI2_ENGINE_ID_NIC6_0,
1427 [GAUDI2_QUEUE_ID_NIC_13_0...GAUDI2_QUEUE_ID_NIC_13_3] = GAUDI2_ENGINE_ID_NIC6_1,
1428 [GAUDI2_QUEUE_ID_NIC_14_0...GAUDI2_QUEUE_ID_NIC_14_3] = GAUDI2_ENGINE_ID_NIC7_0,
1429 [GAUDI2_QUEUE_ID_NIC_15_0...GAUDI2_QUEUE_ID_NIC_15_3] = GAUDI2_ENGINE_ID_NIC7_1,
1430 [GAUDI2_QUEUE_ID_NIC_16_0...GAUDI2_QUEUE_ID_NIC_16_3] = GAUDI2_ENGINE_ID_NIC8_0,
1431 [GAUDI2_QUEUE_ID_NIC_17_0...GAUDI2_QUEUE_ID_NIC_17_3] = GAUDI2_ENGINE_ID_NIC8_1,
1432 [GAUDI2_QUEUE_ID_NIC_18_0...GAUDI2_QUEUE_ID_NIC_18_3] = GAUDI2_ENGINE_ID_NIC9_0,
1433 [GAUDI2_QUEUE_ID_NIC_19_0...GAUDI2_QUEUE_ID_NIC_19_3] = GAUDI2_ENGINE_ID_NIC9_1,
1434 [GAUDI2_QUEUE_ID_NIC_20_0...GAUDI2_QUEUE_ID_NIC_20_3] = GAUDI2_ENGINE_ID_NIC10_0,
1435 [GAUDI2_QUEUE_ID_NIC_21_0...GAUDI2_QUEUE_ID_NIC_21_3] = GAUDI2_ENGINE_ID_NIC10_1,
1436 [GAUDI2_QUEUE_ID_NIC_22_0...GAUDI2_QUEUE_ID_NIC_22_3] = GAUDI2_ENGINE_ID_NIC11_0,
1437 [GAUDI2_QUEUE_ID_NIC_23_0...GAUDI2_QUEUE_ID_NIC_23_3] = GAUDI2_ENGINE_ID_NIC11_1,
1438 [GAUDI2_QUEUE_ID_ROT_0_0...GAUDI2_QUEUE_ID_ROT_0_3] = GAUDI2_ENGINE_ID_ROT_0,
1439 [GAUDI2_QUEUE_ID_ROT_1_0...GAUDI2_QUEUE_ID_ROT_1_3] = GAUDI2_ENGINE_ID_ROT_1,
1440 };
1441
1442 const u32 gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_SIZE] = {
1443 [GAUDI2_QUEUE_ID_PDMA_0_0] = mmPDMA0_QM_BASE,
1444 [GAUDI2_QUEUE_ID_PDMA_0_1] = mmPDMA0_QM_BASE,
1445 [GAUDI2_QUEUE_ID_PDMA_0_2] = mmPDMA0_QM_BASE,
1446 [GAUDI2_QUEUE_ID_PDMA_0_3] = mmPDMA0_QM_BASE,
1447 [GAUDI2_QUEUE_ID_PDMA_1_0] = mmPDMA1_QM_BASE,
1448 [GAUDI2_QUEUE_ID_PDMA_1_1] = mmPDMA1_QM_BASE,
1449 [GAUDI2_QUEUE_ID_PDMA_1_2] = mmPDMA1_QM_BASE,
1450 [GAUDI2_QUEUE_ID_PDMA_1_3] = mmPDMA1_QM_BASE,
1451 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0] = mmDCORE0_EDMA0_QM_BASE,
1452 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_1] = mmDCORE0_EDMA0_QM_BASE,
1453 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_2] = mmDCORE0_EDMA0_QM_BASE,
1454 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3] = mmDCORE0_EDMA0_QM_BASE,
1455 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0] = mmDCORE0_EDMA1_QM_BASE,
1456 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_1] = mmDCORE0_EDMA1_QM_BASE,
1457 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_2] = mmDCORE0_EDMA1_QM_BASE,
1458 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3] = mmDCORE0_EDMA1_QM_BASE,
1459 [GAUDI2_QUEUE_ID_DCORE0_MME_0_0] = mmDCORE0_MME_QM_BASE,
1460 [GAUDI2_QUEUE_ID_DCORE0_MME_0_1] = mmDCORE0_MME_QM_BASE,
1461 [GAUDI2_QUEUE_ID_DCORE0_MME_0_2] = mmDCORE0_MME_QM_BASE,
1462 [GAUDI2_QUEUE_ID_DCORE0_MME_0_3] = mmDCORE0_MME_QM_BASE,
1463 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_0] = mmDCORE0_TPC0_QM_BASE,
1464 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_1] = mmDCORE0_TPC0_QM_BASE,
1465 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_2] = mmDCORE0_TPC0_QM_BASE,
1466 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_3] = mmDCORE0_TPC0_QM_BASE,
1467 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_0] = mmDCORE0_TPC1_QM_BASE,
1468 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_1] = mmDCORE0_TPC1_QM_BASE,
1469 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_2] = mmDCORE0_TPC1_QM_BASE,
1470 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_3] = mmDCORE0_TPC1_QM_BASE,
1471 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_0] = mmDCORE0_TPC2_QM_BASE,
1472 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_1] = mmDCORE0_TPC2_QM_BASE,
1473 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_2] = mmDCORE0_TPC2_QM_BASE,
1474 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_3] = mmDCORE0_TPC2_QM_BASE,
1475 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_0] = mmDCORE0_TPC3_QM_BASE,
1476 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_1] = mmDCORE0_TPC3_QM_BASE,
1477 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_2] = mmDCORE0_TPC3_QM_BASE,
1478 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_3] = mmDCORE0_TPC3_QM_BASE,
1479 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_0] = mmDCORE0_TPC4_QM_BASE,
1480 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_1] = mmDCORE0_TPC4_QM_BASE,
1481 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_2] = mmDCORE0_TPC4_QM_BASE,
1482 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_3] = mmDCORE0_TPC4_QM_BASE,
1483 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_0] = mmDCORE0_TPC5_QM_BASE,
1484 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_1] = mmDCORE0_TPC5_QM_BASE,
1485 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_2] = mmDCORE0_TPC5_QM_BASE,
1486 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_3] = mmDCORE0_TPC5_QM_BASE,
1487 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_0] = mmDCORE0_TPC6_QM_BASE,
1488 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_1] = mmDCORE0_TPC6_QM_BASE,
1489 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_2] = mmDCORE0_TPC6_QM_BASE,
1490 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_3] = mmDCORE0_TPC6_QM_BASE,
1491 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0] = mmDCORE1_EDMA0_QM_BASE,
1492 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_1] = mmDCORE1_EDMA0_QM_BASE,
1493 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_2] = mmDCORE1_EDMA0_QM_BASE,
1494 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3] = mmDCORE1_EDMA0_QM_BASE,
1495 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0] = mmDCORE1_EDMA1_QM_BASE,
1496 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_1] = mmDCORE1_EDMA1_QM_BASE,
1497 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_2] = mmDCORE1_EDMA1_QM_BASE,
1498 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3] = mmDCORE1_EDMA1_QM_BASE,
1499 [GAUDI2_QUEUE_ID_DCORE1_MME_0_0] = mmDCORE1_MME_QM_BASE,
1500 [GAUDI2_QUEUE_ID_DCORE1_MME_0_1] = mmDCORE1_MME_QM_BASE,
1501 [GAUDI2_QUEUE_ID_DCORE1_MME_0_2] = mmDCORE1_MME_QM_BASE,
1502 [GAUDI2_QUEUE_ID_DCORE1_MME_0_3] = mmDCORE1_MME_QM_BASE,
1503 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_0] = mmDCORE1_TPC0_QM_BASE,
1504 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_1] = mmDCORE1_TPC0_QM_BASE,
1505 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_2] = mmDCORE1_TPC0_QM_BASE,
1506 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_3] = mmDCORE1_TPC0_QM_BASE,
1507 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_0] = mmDCORE1_TPC1_QM_BASE,
1508 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_1] = mmDCORE1_TPC1_QM_BASE,
1509 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_2] = mmDCORE1_TPC1_QM_BASE,
1510 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_3] = mmDCORE1_TPC1_QM_BASE,
1511 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_0] = mmDCORE1_TPC2_QM_BASE,
1512 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_1] = mmDCORE1_TPC2_QM_BASE,
1513 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_2] = mmDCORE1_TPC2_QM_BASE,
1514 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_3] = mmDCORE1_TPC2_QM_BASE,
1515 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_0] = mmDCORE1_TPC3_QM_BASE,
1516 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_1] = mmDCORE1_TPC3_QM_BASE,
1517 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_2] = mmDCORE1_TPC3_QM_BASE,
1518 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_3] = mmDCORE1_TPC3_QM_BASE,
1519 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_0] = mmDCORE1_TPC4_QM_BASE,
1520 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_1] = mmDCORE1_TPC4_QM_BASE,
1521 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_2] = mmDCORE1_TPC4_QM_BASE,
1522 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_3] = mmDCORE1_TPC4_QM_BASE,
1523 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_0] = mmDCORE1_TPC5_QM_BASE,
1524 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_1] = mmDCORE1_TPC5_QM_BASE,
1525 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_2] = mmDCORE1_TPC5_QM_BASE,
1526 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_3] = mmDCORE1_TPC5_QM_BASE,
1527 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0] = mmDCORE2_EDMA0_QM_BASE,
1528 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_1] = mmDCORE2_EDMA0_QM_BASE,
1529 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_2] = mmDCORE2_EDMA0_QM_BASE,
1530 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3] = mmDCORE2_EDMA0_QM_BASE,
1531 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0] = mmDCORE2_EDMA1_QM_BASE,
1532 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_1] = mmDCORE2_EDMA1_QM_BASE,
1533 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_2] = mmDCORE2_EDMA1_QM_BASE,
1534 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3] = mmDCORE2_EDMA1_QM_BASE,
1535 [GAUDI2_QUEUE_ID_DCORE2_MME_0_0] = mmDCORE2_MME_QM_BASE,
1536 [GAUDI2_QUEUE_ID_DCORE2_MME_0_1] = mmDCORE2_MME_QM_BASE,
1537 [GAUDI2_QUEUE_ID_DCORE2_MME_0_2] = mmDCORE2_MME_QM_BASE,
1538 [GAUDI2_QUEUE_ID_DCORE2_MME_0_3] = mmDCORE2_MME_QM_BASE,
1539 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_0] = mmDCORE2_TPC0_QM_BASE,
1540 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_1] = mmDCORE2_TPC0_QM_BASE,
1541 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_2] = mmDCORE2_TPC0_QM_BASE,
1542 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_3] = mmDCORE2_TPC0_QM_BASE,
1543 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_0] = mmDCORE2_TPC1_QM_BASE,
1544 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_1] = mmDCORE2_TPC1_QM_BASE,
1545 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_2] = mmDCORE2_TPC1_QM_BASE,
1546 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_3] = mmDCORE2_TPC1_QM_BASE,
1547 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_0] = mmDCORE2_TPC2_QM_BASE,
1548 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_1] = mmDCORE2_TPC2_QM_BASE,
1549 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_2] = mmDCORE2_TPC2_QM_BASE,
1550 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_3] = mmDCORE2_TPC2_QM_BASE,
1551 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_0] = mmDCORE2_TPC3_QM_BASE,
1552 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_1] = mmDCORE2_TPC3_QM_BASE,
1553 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_2] = mmDCORE2_TPC3_QM_BASE,
1554 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_3] = mmDCORE2_TPC3_QM_BASE,
1555 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_0] = mmDCORE2_TPC4_QM_BASE,
1556 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_1] = mmDCORE2_TPC4_QM_BASE,
1557 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_2] = mmDCORE2_TPC4_QM_BASE,
1558 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_3] = mmDCORE2_TPC4_QM_BASE,
1559 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_0] = mmDCORE2_TPC5_QM_BASE,
1560 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_1] = mmDCORE2_TPC5_QM_BASE,
1561 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_2] = mmDCORE2_TPC5_QM_BASE,
1562 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_3] = mmDCORE2_TPC5_QM_BASE,
1563 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0] = mmDCORE3_EDMA0_QM_BASE,
1564 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_1] = mmDCORE3_EDMA0_QM_BASE,
1565 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_2] = mmDCORE3_EDMA0_QM_BASE,
1566 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3] = mmDCORE3_EDMA0_QM_BASE,
1567 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0] = mmDCORE3_EDMA1_QM_BASE,
1568 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1] = mmDCORE3_EDMA1_QM_BASE,
1569 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2] = mmDCORE3_EDMA1_QM_BASE,
1570 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3] = mmDCORE3_EDMA1_QM_BASE,
1571 [GAUDI2_QUEUE_ID_DCORE3_MME_0_0] = mmDCORE3_MME_QM_BASE,
1572 [GAUDI2_QUEUE_ID_DCORE3_MME_0_1] = mmDCORE3_MME_QM_BASE,
1573 [GAUDI2_QUEUE_ID_DCORE3_MME_0_2] = mmDCORE3_MME_QM_BASE,
1574 [GAUDI2_QUEUE_ID_DCORE3_MME_0_3] = mmDCORE3_MME_QM_BASE,
1575 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_0] = mmDCORE3_TPC0_QM_BASE,
1576 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_1] = mmDCORE3_TPC0_QM_BASE,
1577 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_2] = mmDCORE3_TPC0_QM_BASE,
1578 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_3] = mmDCORE3_TPC0_QM_BASE,
1579 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_0] = mmDCORE3_TPC1_QM_BASE,
1580 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_1] = mmDCORE3_TPC1_QM_BASE,
1581 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_2] = mmDCORE3_TPC1_QM_BASE,
1582 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_3] = mmDCORE3_TPC1_QM_BASE,
1583 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_0] = mmDCORE3_TPC2_QM_BASE,
1584 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_1] = mmDCORE3_TPC2_QM_BASE,
1585 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_2] = mmDCORE3_TPC2_QM_BASE,
1586 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_3] = mmDCORE3_TPC2_QM_BASE,
1587 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_0] = mmDCORE3_TPC3_QM_BASE,
1588 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_1] = mmDCORE3_TPC3_QM_BASE,
1589 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_2] = mmDCORE3_TPC3_QM_BASE,
1590 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_3] = mmDCORE3_TPC3_QM_BASE,
1591 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_0] = mmDCORE3_TPC4_QM_BASE,
1592 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_1] = mmDCORE3_TPC4_QM_BASE,
1593 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_2] = mmDCORE3_TPC4_QM_BASE,
1594 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_3] = mmDCORE3_TPC4_QM_BASE,
1595 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_0] = mmDCORE3_TPC5_QM_BASE,
1596 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_1] = mmDCORE3_TPC5_QM_BASE,
1597 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_2] = mmDCORE3_TPC5_QM_BASE,
1598 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_3] = mmDCORE3_TPC5_QM_BASE,
1599 [GAUDI2_QUEUE_ID_NIC_0_0] = mmNIC0_QM0_BASE,
1600 [GAUDI2_QUEUE_ID_NIC_0_1] = mmNIC0_QM0_BASE,
1601 [GAUDI2_QUEUE_ID_NIC_0_2] = mmNIC0_QM0_BASE,
1602 [GAUDI2_QUEUE_ID_NIC_0_3] = mmNIC0_QM0_BASE,
1603 [GAUDI2_QUEUE_ID_NIC_1_0] = mmNIC0_QM1_BASE,
1604 [GAUDI2_QUEUE_ID_NIC_1_1] = mmNIC0_QM1_BASE,
1605 [GAUDI2_QUEUE_ID_NIC_1_2] = mmNIC0_QM1_BASE,
1606 [GAUDI2_QUEUE_ID_NIC_1_3] = mmNIC0_QM1_BASE,
1607 [GAUDI2_QUEUE_ID_NIC_2_0] = mmNIC1_QM0_BASE,
1608 [GAUDI2_QUEUE_ID_NIC_2_1] = mmNIC1_QM0_BASE,
1609 [GAUDI2_QUEUE_ID_NIC_2_2] = mmNIC1_QM0_BASE,
1610 [GAUDI2_QUEUE_ID_NIC_2_3] = mmNIC1_QM0_BASE,
1611 [GAUDI2_QUEUE_ID_NIC_3_0] = mmNIC1_QM1_BASE,
1612 [GAUDI2_QUEUE_ID_NIC_3_1] = mmNIC1_QM1_BASE,
1613 [GAUDI2_QUEUE_ID_NIC_3_2] = mmNIC1_QM1_BASE,
1614 [GAUDI2_QUEUE_ID_NIC_3_3] = mmNIC1_QM1_BASE,
1615 [GAUDI2_QUEUE_ID_NIC_4_0] = mmNIC2_QM0_BASE,
1616 [GAUDI2_QUEUE_ID_NIC_4_1] = mmNIC2_QM0_BASE,
1617 [GAUDI2_QUEUE_ID_NIC_4_2] = mmNIC2_QM0_BASE,
1618 [GAUDI2_QUEUE_ID_NIC_4_3] = mmNIC2_QM0_BASE,
1619 [GAUDI2_QUEUE_ID_NIC_5_0] = mmNIC2_QM1_BASE,
1620 [GAUDI2_QUEUE_ID_NIC_5_1] = mmNIC2_QM1_BASE,
1621 [GAUDI2_QUEUE_ID_NIC_5_2] = mmNIC2_QM1_BASE,
1622 [GAUDI2_QUEUE_ID_NIC_5_3] = mmNIC2_QM1_BASE,
1623 [GAUDI2_QUEUE_ID_NIC_6_0] = mmNIC3_QM0_BASE,
1624 [GAUDI2_QUEUE_ID_NIC_6_1] = mmNIC3_QM0_BASE,
1625 [GAUDI2_QUEUE_ID_NIC_6_2] = mmNIC3_QM0_BASE,
1626 [GAUDI2_QUEUE_ID_NIC_6_3] = mmNIC3_QM0_BASE,
1627 [GAUDI2_QUEUE_ID_NIC_7_0] = mmNIC3_QM1_BASE,
1628 [GAUDI2_QUEUE_ID_NIC_7_1] = mmNIC3_QM1_BASE,
1629 [GAUDI2_QUEUE_ID_NIC_7_2] = mmNIC3_QM1_BASE,
1630 [GAUDI2_QUEUE_ID_NIC_7_3] = mmNIC3_QM1_BASE,
1631 [GAUDI2_QUEUE_ID_NIC_8_0] = mmNIC4_QM0_BASE,
1632 [GAUDI2_QUEUE_ID_NIC_8_1] = mmNIC4_QM0_BASE,
1633 [GAUDI2_QUEUE_ID_NIC_8_2] = mmNIC4_QM0_BASE,
1634 [GAUDI2_QUEUE_ID_NIC_8_3] = mmNIC4_QM0_BASE,
1635 [GAUDI2_QUEUE_ID_NIC_9_0] = mmNIC4_QM1_BASE,
1636 [GAUDI2_QUEUE_ID_NIC_9_1] = mmNIC4_QM1_BASE,
1637 [GAUDI2_QUEUE_ID_NIC_9_2] = mmNIC4_QM1_BASE,
1638 [GAUDI2_QUEUE_ID_NIC_9_3] = mmNIC4_QM1_BASE,
1639 [GAUDI2_QUEUE_ID_NIC_10_0] = mmNIC5_QM0_BASE,
1640 [GAUDI2_QUEUE_ID_NIC_10_1] = mmNIC5_QM0_BASE,
1641 [GAUDI2_QUEUE_ID_NIC_10_2] = mmNIC5_QM0_BASE,
1642 [GAUDI2_QUEUE_ID_NIC_10_3] = mmNIC5_QM0_BASE,
1643 [GAUDI2_QUEUE_ID_NIC_11_0] = mmNIC5_QM1_BASE,
1644 [GAUDI2_QUEUE_ID_NIC_11_1] = mmNIC5_QM1_BASE,
1645 [GAUDI2_QUEUE_ID_NIC_11_2] = mmNIC5_QM1_BASE,
1646 [GAUDI2_QUEUE_ID_NIC_11_3] = mmNIC5_QM1_BASE,
1647 [GAUDI2_QUEUE_ID_NIC_12_0] = mmNIC6_QM0_BASE,
1648 [GAUDI2_QUEUE_ID_NIC_12_1] = mmNIC6_QM0_BASE,
1649 [GAUDI2_QUEUE_ID_NIC_12_2] = mmNIC6_QM0_BASE,
1650 [GAUDI2_QUEUE_ID_NIC_12_3] = mmNIC6_QM0_BASE,
1651 [GAUDI2_QUEUE_ID_NIC_13_0] = mmNIC6_QM1_BASE,
1652 [GAUDI2_QUEUE_ID_NIC_13_1] = mmNIC6_QM1_BASE,
1653 [GAUDI2_QUEUE_ID_NIC_13_2] = mmNIC6_QM1_BASE,
1654 [GAUDI2_QUEUE_ID_NIC_13_3] = mmNIC6_QM1_BASE,
1655 [GAUDI2_QUEUE_ID_NIC_14_0] = mmNIC7_QM0_BASE,
1656 [GAUDI2_QUEUE_ID_NIC_14_1] = mmNIC7_QM0_BASE,
1657 [GAUDI2_QUEUE_ID_NIC_14_2] = mmNIC7_QM0_BASE,
1658 [GAUDI2_QUEUE_ID_NIC_14_3] = mmNIC7_QM0_BASE,
1659 [GAUDI2_QUEUE_ID_NIC_15_0] = mmNIC7_QM1_BASE,
1660 [GAUDI2_QUEUE_ID_NIC_15_1] = mmNIC7_QM1_BASE,
1661 [GAUDI2_QUEUE_ID_NIC_15_2] = mmNIC7_QM1_BASE,
1662 [GAUDI2_QUEUE_ID_NIC_15_3] = mmNIC7_QM1_BASE,
1663 [GAUDI2_QUEUE_ID_NIC_16_0] = mmNIC8_QM0_BASE,
1664 [GAUDI2_QUEUE_ID_NIC_16_1] = mmNIC8_QM0_BASE,
1665 [GAUDI2_QUEUE_ID_NIC_16_2] = mmNIC8_QM0_BASE,
1666 [GAUDI2_QUEUE_ID_NIC_16_3] = mmNIC8_QM0_BASE,
1667 [GAUDI2_QUEUE_ID_NIC_17_0] = mmNIC8_QM1_BASE,
1668 [GAUDI2_QUEUE_ID_NIC_17_1] = mmNIC8_QM1_BASE,
1669 [GAUDI2_QUEUE_ID_NIC_17_2] = mmNIC8_QM1_BASE,
1670 [GAUDI2_QUEUE_ID_NIC_17_3] = mmNIC8_QM1_BASE,
1671 [GAUDI2_QUEUE_ID_NIC_18_0] = mmNIC9_QM0_BASE,
1672 [GAUDI2_QUEUE_ID_NIC_18_1] = mmNIC9_QM0_BASE,
1673 [GAUDI2_QUEUE_ID_NIC_18_2] = mmNIC9_QM0_BASE,
1674 [GAUDI2_QUEUE_ID_NIC_18_3] = mmNIC9_QM0_BASE,
1675 [GAUDI2_QUEUE_ID_NIC_19_0] = mmNIC9_QM1_BASE,
1676 [GAUDI2_QUEUE_ID_NIC_19_1] = mmNIC9_QM1_BASE,
1677 [GAUDI2_QUEUE_ID_NIC_19_2] = mmNIC9_QM1_BASE,
1678 [GAUDI2_QUEUE_ID_NIC_19_3] = mmNIC9_QM1_BASE,
1679 [GAUDI2_QUEUE_ID_NIC_20_0] = mmNIC10_QM0_BASE,
1680 [GAUDI2_QUEUE_ID_NIC_20_1] = mmNIC10_QM0_BASE,
1681 [GAUDI2_QUEUE_ID_NIC_20_2] = mmNIC10_QM0_BASE,
1682 [GAUDI2_QUEUE_ID_NIC_20_3] = mmNIC10_QM0_BASE,
1683 [GAUDI2_QUEUE_ID_NIC_21_0] = mmNIC10_QM1_BASE,
1684 [GAUDI2_QUEUE_ID_NIC_21_1] = mmNIC10_QM1_BASE,
1685 [GAUDI2_QUEUE_ID_NIC_21_2] = mmNIC10_QM1_BASE,
1686 [GAUDI2_QUEUE_ID_NIC_21_3] = mmNIC10_QM1_BASE,
1687 [GAUDI2_QUEUE_ID_NIC_22_0] = mmNIC11_QM0_BASE,
1688 [GAUDI2_QUEUE_ID_NIC_22_1] = mmNIC11_QM0_BASE,
1689 [GAUDI2_QUEUE_ID_NIC_22_2] = mmNIC11_QM0_BASE,
1690 [GAUDI2_QUEUE_ID_NIC_22_3] = mmNIC11_QM0_BASE,
1691 [GAUDI2_QUEUE_ID_NIC_23_0] = mmNIC11_QM1_BASE,
1692 [GAUDI2_QUEUE_ID_NIC_23_1] = mmNIC11_QM1_BASE,
1693 [GAUDI2_QUEUE_ID_NIC_23_2] = mmNIC11_QM1_BASE,
1694 [GAUDI2_QUEUE_ID_NIC_23_3] = mmNIC11_QM1_BASE,
1695 [GAUDI2_QUEUE_ID_ROT_0_0] = mmROT0_QM_BASE,
1696 [GAUDI2_QUEUE_ID_ROT_0_1] = mmROT0_QM_BASE,
1697 [GAUDI2_QUEUE_ID_ROT_0_2] = mmROT0_QM_BASE,
1698 [GAUDI2_QUEUE_ID_ROT_0_3] = mmROT0_QM_BASE,
1699 [GAUDI2_QUEUE_ID_ROT_1_0] = mmROT1_QM_BASE,
1700 [GAUDI2_QUEUE_ID_ROT_1_1] = mmROT1_QM_BASE,
1701 [GAUDI2_QUEUE_ID_ROT_1_2] = mmROT1_QM_BASE,
1702 [GAUDI2_QUEUE_ID_ROT_1_3] = mmROT1_QM_BASE
1703 };
1704
1705 static const u32 gaudi2_arc_blocks_bases[NUM_ARC_CPUS] = {
1706 [CPU_ID_SCHED_ARC0] = mmARC_FARM_ARC0_AUX_BASE,
1707 [CPU_ID_SCHED_ARC1] = mmARC_FARM_ARC1_AUX_BASE,
1708 [CPU_ID_SCHED_ARC2] = mmARC_FARM_ARC2_AUX_BASE,
1709 [CPU_ID_SCHED_ARC3] = mmARC_FARM_ARC3_AUX_BASE,
1710 [CPU_ID_SCHED_ARC4] = mmDCORE1_MME_QM_ARC_AUX_BASE,
1711 [CPU_ID_SCHED_ARC5] = mmDCORE3_MME_QM_ARC_AUX_BASE,
1712 [CPU_ID_TPC_QMAN_ARC0] = mmDCORE0_TPC0_QM_ARC_AUX_BASE,
1713 [CPU_ID_TPC_QMAN_ARC1] = mmDCORE0_TPC1_QM_ARC_AUX_BASE,
1714 [CPU_ID_TPC_QMAN_ARC2] = mmDCORE0_TPC2_QM_ARC_AUX_BASE,
1715 [CPU_ID_TPC_QMAN_ARC3] = mmDCORE0_TPC3_QM_ARC_AUX_BASE,
1716 [CPU_ID_TPC_QMAN_ARC4] = mmDCORE0_TPC4_QM_ARC_AUX_BASE,
1717 [CPU_ID_TPC_QMAN_ARC5] = mmDCORE0_TPC5_QM_ARC_AUX_BASE,
1718 [CPU_ID_TPC_QMAN_ARC6] = mmDCORE1_TPC0_QM_ARC_AUX_BASE,
1719 [CPU_ID_TPC_QMAN_ARC7] = mmDCORE1_TPC1_QM_ARC_AUX_BASE,
1720 [CPU_ID_TPC_QMAN_ARC8] = mmDCORE1_TPC2_QM_ARC_AUX_BASE,
1721 [CPU_ID_TPC_QMAN_ARC9] = mmDCORE1_TPC3_QM_ARC_AUX_BASE,
1722 [CPU_ID_TPC_QMAN_ARC10] = mmDCORE1_TPC4_QM_ARC_AUX_BASE,
1723 [CPU_ID_TPC_QMAN_ARC11] = mmDCORE1_TPC5_QM_ARC_AUX_BASE,
1724 [CPU_ID_TPC_QMAN_ARC12] = mmDCORE2_TPC0_QM_ARC_AUX_BASE,
1725 [CPU_ID_TPC_QMAN_ARC13] = mmDCORE2_TPC1_QM_ARC_AUX_BASE,
1726 [CPU_ID_TPC_QMAN_ARC14] = mmDCORE2_TPC2_QM_ARC_AUX_BASE,
1727 [CPU_ID_TPC_QMAN_ARC15] = mmDCORE2_TPC3_QM_ARC_AUX_BASE,
1728 [CPU_ID_TPC_QMAN_ARC16] = mmDCORE2_TPC4_QM_ARC_AUX_BASE,
1729 [CPU_ID_TPC_QMAN_ARC17] = mmDCORE2_TPC5_QM_ARC_AUX_BASE,
1730 [CPU_ID_TPC_QMAN_ARC18] = mmDCORE3_TPC0_QM_ARC_AUX_BASE,
1731 [CPU_ID_TPC_QMAN_ARC19] = mmDCORE3_TPC1_QM_ARC_AUX_BASE,
1732 [CPU_ID_TPC_QMAN_ARC20] = mmDCORE3_TPC2_QM_ARC_AUX_BASE,
1733 [CPU_ID_TPC_QMAN_ARC21] = mmDCORE3_TPC3_QM_ARC_AUX_BASE,
1734 [CPU_ID_TPC_QMAN_ARC22] = mmDCORE3_TPC4_QM_ARC_AUX_BASE,
1735 [CPU_ID_TPC_QMAN_ARC23] = mmDCORE3_TPC5_QM_ARC_AUX_BASE,
1736 [CPU_ID_TPC_QMAN_ARC24] = mmDCORE0_TPC6_QM_ARC_AUX_BASE,
1737 [CPU_ID_MME_QMAN_ARC0] = mmDCORE0_MME_QM_ARC_AUX_BASE,
1738 [CPU_ID_MME_QMAN_ARC1] = mmDCORE2_MME_QM_ARC_AUX_BASE,
1739 [CPU_ID_EDMA_QMAN_ARC0] = mmDCORE0_EDMA0_QM_ARC_AUX_BASE,
1740 [CPU_ID_EDMA_QMAN_ARC1] = mmDCORE0_EDMA1_QM_ARC_AUX_BASE,
1741 [CPU_ID_EDMA_QMAN_ARC2] = mmDCORE1_EDMA0_QM_ARC_AUX_BASE,
1742 [CPU_ID_EDMA_QMAN_ARC3] = mmDCORE1_EDMA1_QM_ARC_AUX_BASE,
1743 [CPU_ID_EDMA_QMAN_ARC4] = mmDCORE2_EDMA0_QM_ARC_AUX_BASE,
1744 [CPU_ID_EDMA_QMAN_ARC5] = mmDCORE2_EDMA1_QM_ARC_AUX_BASE,
1745 [CPU_ID_EDMA_QMAN_ARC6] = mmDCORE3_EDMA0_QM_ARC_AUX_BASE,
1746 [CPU_ID_EDMA_QMAN_ARC7] = mmDCORE3_EDMA1_QM_ARC_AUX_BASE,
1747 [CPU_ID_PDMA_QMAN_ARC0] = mmPDMA0_QM_ARC_AUX_BASE,
1748 [CPU_ID_PDMA_QMAN_ARC1] = mmPDMA1_QM_ARC_AUX_BASE,
1749 [CPU_ID_ROT_QMAN_ARC0] = mmROT0_QM_ARC_AUX_BASE,
1750 [CPU_ID_ROT_QMAN_ARC1] = mmROT1_QM_ARC_AUX_BASE,
1751 [CPU_ID_NIC_QMAN_ARC0] = mmNIC0_QM_ARC_AUX0_BASE,
1752 [CPU_ID_NIC_QMAN_ARC1] = mmNIC0_QM_ARC_AUX1_BASE,
1753 [CPU_ID_NIC_QMAN_ARC2] = mmNIC1_QM_ARC_AUX0_BASE,
1754 [CPU_ID_NIC_QMAN_ARC3] = mmNIC1_QM_ARC_AUX1_BASE,
1755 [CPU_ID_NIC_QMAN_ARC4] = mmNIC2_QM_ARC_AUX0_BASE,
1756 [CPU_ID_NIC_QMAN_ARC5] = mmNIC2_QM_ARC_AUX1_BASE,
1757 [CPU_ID_NIC_QMAN_ARC6] = mmNIC3_QM_ARC_AUX0_BASE,
1758 [CPU_ID_NIC_QMAN_ARC7] = mmNIC3_QM_ARC_AUX1_BASE,
1759 [CPU_ID_NIC_QMAN_ARC8] = mmNIC4_QM_ARC_AUX0_BASE,
1760 [CPU_ID_NIC_QMAN_ARC9] = mmNIC4_QM_ARC_AUX1_BASE,
1761 [CPU_ID_NIC_QMAN_ARC10] = mmNIC5_QM_ARC_AUX0_BASE,
1762 [CPU_ID_NIC_QMAN_ARC11] = mmNIC5_QM_ARC_AUX1_BASE,
1763 [CPU_ID_NIC_QMAN_ARC12] = mmNIC6_QM_ARC_AUX0_BASE,
1764 [CPU_ID_NIC_QMAN_ARC13] = mmNIC6_QM_ARC_AUX1_BASE,
1765 [CPU_ID_NIC_QMAN_ARC14] = mmNIC7_QM_ARC_AUX0_BASE,
1766 [CPU_ID_NIC_QMAN_ARC15] = mmNIC7_QM_ARC_AUX1_BASE,
1767 [CPU_ID_NIC_QMAN_ARC16] = mmNIC8_QM_ARC_AUX0_BASE,
1768 [CPU_ID_NIC_QMAN_ARC17] = mmNIC8_QM_ARC_AUX1_BASE,
1769 [CPU_ID_NIC_QMAN_ARC18] = mmNIC9_QM_ARC_AUX0_BASE,
1770 [CPU_ID_NIC_QMAN_ARC19] = mmNIC9_QM_ARC_AUX1_BASE,
1771 [CPU_ID_NIC_QMAN_ARC20] = mmNIC10_QM_ARC_AUX0_BASE,
1772 [CPU_ID_NIC_QMAN_ARC21] = mmNIC10_QM_ARC_AUX1_BASE,
1773 [CPU_ID_NIC_QMAN_ARC22] = mmNIC11_QM_ARC_AUX0_BASE,
1774 [CPU_ID_NIC_QMAN_ARC23] = mmNIC11_QM_ARC_AUX1_BASE,
1775 };
1776
1777 static const u32 gaudi2_arc_dccm_bases[NUM_ARC_CPUS] = {
1778 [CPU_ID_SCHED_ARC0] = mmARC_FARM_ARC0_DCCM0_BASE,
1779 [CPU_ID_SCHED_ARC1] = mmARC_FARM_ARC1_DCCM0_BASE,
1780 [CPU_ID_SCHED_ARC2] = mmARC_FARM_ARC2_DCCM0_BASE,
1781 [CPU_ID_SCHED_ARC3] = mmARC_FARM_ARC3_DCCM0_BASE,
1782 [CPU_ID_SCHED_ARC4] = mmDCORE1_MME_QM_ARC_DCCM_BASE,
1783 [CPU_ID_SCHED_ARC5] = mmDCORE3_MME_QM_ARC_DCCM_BASE,
1784 [CPU_ID_TPC_QMAN_ARC0] = mmDCORE0_TPC0_QM_DCCM_BASE,
1785 [CPU_ID_TPC_QMAN_ARC1] = mmDCORE0_TPC1_QM_DCCM_BASE,
1786 [CPU_ID_TPC_QMAN_ARC2] = mmDCORE0_TPC2_QM_DCCM_BASE,
1787 [CPU_ID_TPC_QMAN_ARC3] = mmDCORE0_TPC3_QM_DCCM_BASE,
1788 [CPU_ID_TPC_QMAN_ARC4] = mmDCORE0_TPC4_QM_DCCM_BASE,
1789 [CPU_ID_TPC_QMAN_ARC5] = mmDCORE0_TPC5_QM_DCCM_BASE,
1790 [CPU_ID_TPC_QMAN_ARC6] = mmDCORE1_TPC0_QM_DCCM_BASE,
1791 [CPU_ID_TPC_QMAN_ARC7] = mmDCORE1_TPC1_QM_DCCM_BASE,
1792 [CPU_ID_TPC_QMAN_ARC8] = mmDCORE1_TPC2_QM_DCCM_BASE,
1793 [CPU_ID_TPC_QMAN_ARC9] = mmDCORE1_TPC3_QM_DCCM_BASE,
1794 [CPU_ID_TPC_QMAN_ARC10] = mmDCORE1_TPC4_QM_DCCM_BASE,
1795 [CPU_ID_TPC_QMAN_ARC11] = mmDCORE1_TPC5_QM_DCCM_BASE,
1796 [CPU_ID_TPC_QMAN_ARC12] = mmDCORE2_TPC0_QM_DCCM_BASE,
1797 [CPU_ID_TPC_QMAN_ARC13] = mmDCORE2_TPC1_QM_DCCM_BASE,
1798 [CPU_ID_TPC_QMAN_ARC14] = mmDCORE2_TPC2_QM_DCCM_BASE,
1799 [CPU_ID_TPC_QMAN_ARC15] = mmDCORE2_TPC3_QM_DCCM_BASE,
1800 [CPU_ID_TPC_QMAN_ARC16] = mmDCORE2_TPC4_QM_DCCM_BASE,
1801 [CPU_ID_TPC_QMAN_ARC17] = mmDCORE2_TPC5_QM_DCCM_BASE,
1802 [CPU_ID_TPC_QMAN_ARC18] = mmDCORE3_TPC0_QM_DCCM_BASE,
1803 [CPU_ID_TPC_QMAN_ARC19] = mmDCORE3_TPC1_QM_DCCM_BASE,
1804 [CPU_ID_TPC_QMAN_ARC20] = mmDCORE3_TPC2_QM_DCCM_BASE,
1805 [CPU_ID_TPC_QMAN_ARC21] = mmDCORE3_TPC3_QM_DCCM_BASE,
1806 [CPU_ID_TPC_QMAN_ARC22] = mmDCORE3_TPC4_QM_DCCM_BASE,
1807 [CPU_ID_TPC_QMAN_ARC23] = mmDCORE3_TPC5_QM_DCCM_BASE,
1808 [CPU_ID_TPC_QMAN_ARC24] = mmDCORE0_TPC6_QM_DCCM_BASE,
1809 [CPU_ID_MME_QMAN_ARC0] = mmDCORE0_MME_QM_ARC_DCCM_BASE,
1810 [CPU_ID_MME_QMAN_ARC1] = mmDCORE2_MME_QM_ARC_DCCM_BASE,
1811 [CPU_ID_EDMA_QMAN_ARC0] = mmDCORE0_EDMA0_QM_DCCM_BASE,
1812 [CPU_ID_EDMA_QMAN_ARC1] = mmDCORE0_EDMA1_QM_DCCM_BASE,
1813 [CPU_ID_EDMA_QMAN_ARC2] = mmDCORE1_EDMA0_QM_DCCM_BASE,
1814 [CPU_ID_EDMA_QMAN_ARC3] = mmDCORE1_EDMA1_QM_DCCM_BASE,
1815 [CPU_ID_EDMA_QMAN_ARC4] = mmDCORE2_EDMA0_QM_DCCM_BASE,
1816 [CPU_ID_EDMA_QMAN_ARC5] = mmDCORE2_EDMA1_QM_DCCM_BASE,
1817 [CPU_ID_EDMA_QMAN_ARC6] = mmDCORE3_EDMA0_QM_DCCM_BASE,
1818 [CPU_ID_EDMA_QMAN_ARC7] = mmDCORE3_EDMA1_QM_DCCM_BASE,
1819 [CPU_ID_PDMA_QMAN_ARC0] = mmPDMA0_QM_ARC_DCCM_BASE,
1820 [CPU_ID_PDMA_QMAN_ARC1] = mmPDMA1_QM_ARC_DCCM_BASE,
1821 [CPU_ID_ROT_QMAN_ARC0] = mmROT0_QM_ARC_DCCM_BASE,
1822 [CPU_ID_ROT_QMAN_ARC1] = mmROT1_QM_ARC_DCCM_BASE,
1823 [CPU_ID_NIC_QMAN_ARC0] = mmNIC0_QM_DCCM0_BASE,
1824 [CPU_ID_NIC_QMAN_ARC1] = mmNIC0_QM_DCCM1_BASE,
1825 [CPU_ID_NIC_QMAN_ARC2] = mmNIC1_QM_DCCM0_BASE,
1826 [CPU_ID_NIC_QMAN_ARC3] = mmNIC1_QM_DCCM1_BASE,
1827 [CPU_ID_NIC_QMAN_ARC4] = mmNIC2_QM_DCCM0_BASE,
1828 [CPU_ID_NIC_QMAN_ARC5] = mmNIC2_QM_DCCM1_BASE,
1829 [CPU_ID_NIC_QMAN_ARC6] = mmNIC3_QM_DCCM0_BASE,
1830 [CPU_ID_NIC_QMAN_ARC7] = mmNIC3_QM_DCCM1_BASE,
1831 [CPU_ID_NIC_QMAN_ARC8] = mmNIC4_QM_DCCM0_BASE,
1832 [CPU_ID_NIC_QMAN_ARC9] = mmNIC4_QM_DCCM1_BASE,
1833 [CPU_ID_NIC_QMAN_ARC10] = mmNIC5_QM_DCCM0_BASE,
1834 [CPU_ID_NIC_QMAN_ARC11] = mmNIC5_QM_DCCM1_BASE,
1835 [CPU_ID_NIC_QMAN_ARC12] = mmNIC6_QM_DCCM0_BASE,
1836 [CPU_ID_NIC_QMAN_ARC13] = mmNIC6_QM_DCCM1_BASE,
1837 [CPU_ID_NIC_QMAN_ARC14] = mmNIC7_QM_DCCM0_BASE,
1838 [CPU_ID_NIC_QMAN_ARC15] = mmNIC7_QM_DCCM1_BASE,
1839 [CPU_ID_NIC_QMAN_ARC16] = mmNIC8_QM_DCCM0_BASE,
1840 [CPU_ID_NIC_QMAN_ARC17] = mmNIC8_QM_DCCM1_BASE,
1841 [CPU_ID_NIC_QMAN_ARC18] = mmNIC9_QM_DCCM0_BASE,
1842 [CPU_ID_NIC_QMAN_ARC19] = mmNIC9_QM_DCCM1_BASE,
1843 [CPU_ID_NIC_QMAN_ARC20] = mmNIC10_QM_DCCM0_BASE,
1844 [CPU_ID_NIC_QMAN_ARC21] = mmNIC10_QM_DCCM1_BASE,
1845 [CPU_ID_NIC_QMAN_ARC22] = mmNIC11_QM_DCCM0_BASE,
1846 [CPU_ID_NIC_QMAN_ARC23] = mmNIC11_QM_DCCM1_BASE,
1847 };
1848
1849 const u32 gaudi2_mme_ctrl_lo_blocks_bases[MME_ID_SIZE] = {
1850 [MME_ID_DCORE0] = mmDCORE0_MME_CTRL_LO_BASE,
1851 [MME_ID_DCORE1] = mmDCORE1_MME_CTRL_LO_BASE,
1852 [MME_ID_DCORE2] = mmDCORE2_MME_CTRL_LO_BASE,
1853 [MME_ID_DCORE3] = mmDCORE3_MME_CTRL_LO_BASE,
1854 };
1855
1856 static const u32 gaudi2_queue_id_to_arc_id[GAUDI2_QUEUE_ID_SIZE] = {
1857 [GAUDI2_QUEUE_ID_PDMA_0_0] = CPU_ID_PDMA_QMAN_ARC0,
1858 [GAUDI2_QUEUE_ID_PDMA_0_1] = CPU_ID_PDMA_QMAN_ARC0,
1859 [GAUDI2_QUEUE_ID_PDMA_0_2] = CPU_ID_PDMA_QMAN_ARC0,
1860 [GAUDI2_QUEUE_ID_PDMA_0_3] = CPU_ID_PDMA_QMAN_ARC0,
1861 [GAUDI2_QUEUE_ID_PDMA_1_0] = CPU_ID_PDMA_QMAN_ARC1,
1862 [GAUDI2_QUEUE_ID_PDMA_1_1] = CPU_ID_PDMA_QMAN_ARC1,
1863 [GAUDI2_QUEUE_ID_PDMA_1_2] = CPU_ID_PDMA_QMAN_ARC1,
1864 [GAUDI2_QUEUE_ID_PDMA_1_3] = CPU_ID_PDMA_QMAN_ARC1,
1865 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC0,
1866 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC0,
1867 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC0,
1868 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC0,
1869 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC1,
1870 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC1,
1871 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC1,
1872 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC1,
1873 [GAUDI2_QUEUE_ID_DCORE0_MME_0_0] = CPU_ID_MME_QMAN_ARC0,
1874 [GAUDI2_QUEUE_ID_DCORE0_MME_0_1] = CPU_ID_MME_QMAN_ARC0,
1875 [GAUDI2_QUEUE_ID_DCORE0_MME_0_2] = CPU_ID_MME_QMAN_ARC0,
1876 [GAUDI2_QUEUE_ID_DCORE0_MME_0_3] = CPU_ID_MME_QMAN_ARC0,
1877 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_0] = CPU_ID_TPC_QMAN_ARC0,
1878 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_1] = CPU_ID_TPC_QMAN_ARC0,
1879 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_2] = CPU_ID_TPC_QMAN_ARC0,
1880 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_3] = CPU_ID_TPC_QMAN_ARC0,
1881 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_0] = CPU_ID_TPC_QMAN_ARC1,
1882 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_1] = CPU_ID_TPC_QMAN_ARC1,
1883 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_2] = CPU_ID_TPC_QMAN_ARC1,
1884 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_3] = CPU_ID_TPC_QMAN_ARC1,
1885 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_0] = CPU_ID_TPC_QMAN_ARC2,
1886 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_1] = CPU_ID_TPC_QMAN_ARC2,
1887 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_2] = CPU_ID_TPC_QMAN_ARC2,
1888 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_3] = CPU_ID_TPC_QMAN_ARC2,
1889 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_0] = CPU_ID_TPC_QMAN_ARC3,
1890 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_1] = CPU_ID_TPC_QMAN_ARC3,
1891 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_2] = CPU_ID_TPC_QMAN_ARC3,
1892 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_3] = CPU_ID_TPC_QMAN_ARC3,
1893 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_0] = CPU_ID_TPC_QMAN_ARC4,
1894 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_1] = CPU_ID_TPC_QMAN_ARC4,
1895 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_2] = CPU_ID_TPC_QMAN_ARC4,
1896 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_3] = CPU_ID_TPC_QMAN_ARC4,
1897 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_0] = CPU_ID_TPC_QMAN_ARC5,
1898 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_1] = CPU_ID_TPC_QMAN_ARC5,
1899 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_2] = CPU_ID_TPC_QMAN_ARC5,
1900 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_3] = CPU_ID_TPC_QMAN_ARC5,
1901 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_0] = CPU_ID_TPC_QMAN_ARC24,
1902 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_1] = CPU_ID_TPC_QMAN_ARC24,
1903 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_2] = CPU_ID_TPC_QMAN_ARC24,
1904 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_3] = CPU_ID_TPC_QMAN_ARC24,
1905 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC2,
1906 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC2,
1907 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC2,
1908 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC2,
1909 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC3,
1910 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC3,
1911 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC3,
1912 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC3,
1913 [GAUDI2_QUEUE_ID_DCORE1_MME_0_0] = CPU_ID_SCHED_ARC4,
1914 [GAUDI2_QUEUE_ID_DCORE1_MME_0_1] = CPU_ID_SCHED_ARC4,
1915 [GAUDI2_QUEUE_ID_DCORE1_MME_0_2] = CPU_ID_SCHED_ARC4,
1916 [GAUDI2_QUEUE_ID_DCORE1_MME_0_3] = CPU_ID_SCHED_ARC4,
1917 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_0] = CPU_ID_TPC_QMAN_ARC6,
1918 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_1] = CPU_ID_TPC_QMAN_ARC6,
1919 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_2] = CPU_ID_TPC_QMAN_ARC6,
1920 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_3] = CPU_ID_TPC_QMAN_ARC6,
1921 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_0] = CPU_ID_TPC_QMAN_ARC7,
1922 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_1] = CPU_ID_TPC_QMAN_ARC7,
1923 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_2] = CPU_ID_TPC_QMAN_ARC7,
1924 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_3] = CPU_ID_TPC_QMAN_ARC7,
1925 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_0] = CPU_ID_TPC_QMAN_ARC8,
1926 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_1] = CPU_ID_TPC_QMAN_ARC8,
1927 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_2] = CPU_ID_TPC_QMAN_ARC8,
1928 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_3] = CPU_ID_TPC_QMAN_ARC8,
1929 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_0] = CPU_ID_TPC_QMAN_ARC9,
1930 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_1] = CPU_ID_TPC_QMAN_ARC9,
1931 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_2] = CPU_ID_TPC_QMAN_ARC9,
1932 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_3] = CPU_ID_TPC_QMAN_ARC9,
1933 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_0] = CPU_ID_TPC_QMAN_ARC10,
1934 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_1] = CPU_ID_TPC_QMAN_ARC10,
1935 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_2] = CPU_ID_TPC_QMAN_ARC10,
1936 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_3] = CPU_ID_TPC_QMAN_ARC10,
1937 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_0] = CPU_ID_TPC_QMAN_ARC11,
1938 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_1] = CPU_ID_TPC_QMAN_ARC11,
1939 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_2] = CPU_ID_TPC_QMAN_ARC11,
1940 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_3] = CPU_ID_TPC_QMAN_ARC11,
1941 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC4,
1942 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC4,
1943 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC4,
1944 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC4,
1945 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC5,
1946 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC5,
1947 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC5,
1948 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC5,
1949 [GAUDI2_QUEUE_ID_DCORE2_MME_0_0] = CPU_ID_MME_QMAN_ARC1,
1950 [GAUDI2_QUEUE_ID_DCORE2_MME_0_1] = CPU_ID_MME_QMAN_ARC1,
1951 [GAUDI2_QUEUE_ID_DCORE2_MME_0_2] = CPU_ID_MME_QMAN_ARC1,
1952 [GAUDI2_QUEUE_ID_DCORE2_MME_0_3] = CPU_ID_MME_QMAN_ARC1,
1953 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_0] = CPU_ID_TPC_QMAN_ARC12,
1954 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_1] = CPU_ID_TPC_QMAN_ARC12,
1955 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_2] = CPU_ID_TPC_QMAN_ARC12,
1956 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_3] = CPU_ID_TPC_QMAN_ARC12,
1957 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_0] = CPU_ID_TPC_QMAN_ARC13,
1958 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_1] = CPU_ID_TPC_QMAN_ARC13,
1959 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_2] = CPU_ID_TPC_QMAN_ARC13,
1960 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_3] = CPU_ID_TPC_QMAN_ARC13,
1961 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_0] = CPU_ID_TPC_QMAN_ARC14,
1962 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_1] = CPU_ID_TPC_QMAN_ARC14,
1963 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_2] = CPU_ID_TPC_QMAN_ARC14,
1964 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_3] = CPU_ID_TPC_QMAN_ARC14,
1965 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_0] = CPU_ID_TPC_QMAN_ARC15,
1966 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_1] = CPU_ID_TPC_QMAN_ARC15,
1967 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_2] = CPU_ID_TPC_QMAN_ARC15,
1968 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_3] = CPU_ID_TPC_QMAN_ARC15,
1969 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_0] = CPU_ID_TPC_QMAN_ARC16,
1970 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_1] = CPU_ID_TPC_QMAN_ARC16,
1971 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_2] = CPU_ID_TPC_QMAN_ARC16,
1972 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_3] = CPU_ID_TPC_QMAN_ARC16,
1973 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_0] = CPU_ID_TPC_QMAN_ARC17,
1974 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_1] = CPU_ID_TPC_QMAN_ARC17,
1975 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_2] = CPU_ID_TPC_QMAN_ARC17,
1976 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_3] = CPU_ID_TPC_QMAN_ARC17,
1977 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC6,
1978 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC6,
1979 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC6,
1980 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC6,
1981 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC7,
1982 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC7,
1983 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC7,
1984 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC7,
1985 [GAUDI2_QUEUE_ID_DCORE3_MME_0_0] = CPU_ID_SCHED_ARC5,
1986 [GAUDI2_QUEUE_ID_DCORE3_MME_0_1] = CPU_ID_SCHED_ARC5,
1987 [GAUDI2_QUEUE_ID_DCORE3_MME_0_2] = CPU_ID_SCHED_ARC5,
1988 [GAUDI2_QUEUE_ID_DCORE3_MME_0_3] = CPU_ID_SCHED_ARC5,
1989 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_0] = CPU_ID_TPC_QMAN_ARC18,
1990 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_1] = CPU_ID_TPC_QMAN_ARC18,
1991 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_2] = CPU_ID_TPC_QMAN_ARC18,
1992 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_3] = CPU_ID_TPC_QMAN_ARC18,
1993 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_0] = CPU_ID_TPC_QMAN_ARC19,
1994 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_1] = CPU_ID_TPC_QMAN_ARC19,
1995 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_2] = CPU_ID_TPC_QMAN_ARC19,
1996 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_3] = CPU_ID_TPC_QMAN_ARC19,
1997 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_0] = CPU_ID_TPC_QMAN_ARC20,
1998 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_1] = CPU_ID_TPC_QMAN_ARC20,
1999 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_2] = CPU_ID_TPC_QMAN_ARC20,
2000 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_3] = CPU_ID_TPC_QMAN_ARC20,
2001 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_0] = CPU_ID_TPC_QMAN_ARC21,
2002 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_1] = CPU_ID_TPC_QMAN_ARC21,
2003 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_2] = CPU_ID_TPC_QMAN_ARC21,
2004 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_3] = CPU_ID_TPC_QMAN_ARC21,
2005 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_0] = CPU_ID_TPC_QMAN_ARC22,
2006 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_1] = CPU_ID_TPC_QMAN_ARC22,
2007 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_2] = CPU_ID_TPC_QMAN_ARC22,
2008 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_3] = CPU_ID_TPC_QMAN_ARC22,
2009 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_0] = CPU_ID_TPC_QMAN_ARC23,
2010 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_1] = CPU_ID_TPC_QMAN_ARC23,
2011 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_2] = CPU_ID_TPC_QMAN_ARC23,
2012 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_3] = CPU_ID_TPC_QMAN_ARC23,
2013 [GAUDI2_QUEUE_ID_NIC_0_0] = CPU_ID_NIC_QMAN_ARC0,
2014 [GAUDI2_QUEUE_ID_NIC_0_1] = CPU_ID_NIC_QMAN_ARC0,
2015 [GAUDI2_QUEUE_ID_NIC_0_2] = CPU_ID_NIC_QMAN_ARC0,
2016 [GAUDI2_QUEUE_ID_NIC_0_3] = CPU_ID_NIC_QMAN_ARC0,
2017 [GAUDI2_QUEUE_ID_NIC_1_0] = CPU_ID_NIC_QMAN_ARC1,
2018 [GAUDI2_QUEUE_ID_NIC_1_1] = CPU_ID_NIC_QMAN_ARC1,
2019 [GAUDI2_QUEUE_ID_NIC_1_2] = CPU_ID_NIC_QMAN_ARC1,
2020 [GAUDI2_QUEUE_ID_NIC_1_3] = CPU_ID_NIC_QMAN_ARC1,
2021 [GAUDI2_QUEUE_ID_NIC_2_0] = CPU_ID_NIC_QMAN_ARC2,
2022 [GAUDI2_QUEUE_ID_NIC_2_1] = CPU_ID_NIC_QMAN_ARC2,
2023 [GAUDI2_QUEUE_ID_NIC_2_2] = CPU_ID_NIC_QMAN_ARC2,
2024 [GAUDI2_QUEUE_ID_NIC_2_3] = CPU_ID_NIC_QMAN_ARC2,
2025 [GAUDI2_QUEUE_ID_NIC_3_0] = CPU_ID_NIC_QMAN_ARC3,
2026 [GAUDI2_QUEUE_ID_NIC_3_1] = CPU_ID_NIC_QMAN_ARC3,
2027 [GAUDI2_QUEUE_ID_NIC_3_2] = CPU_ID_NIC_QMAN_ARC3,
2028 [GAUDI2_QUEUE_ID_NIC_3_3] = CPU_ID_NIC_QMAN_ARC3,
2029 [GAUDI2_QUEUE_ID_NIC_4_0] = CPU_ID_NIC_QMAN_ARC4,
2030 [GAUDI2_QUEUE_ID_NIC_4_1] = CPU_ID_NIC_QMAN_ARC4,
2031 [GAUDI2_QUEUE_ID_NIC_4_2] = CPU_ID_NIC_QMAN_ARC4,
2032 [GAUDI2_QUEUE_ID_NIC_4_3] = CPU_ID_NIC_QMAN_ARC4,
2033 [GAUDI2_QUEUE_ID_NIC_5_0] = CPU_ID_NIC_QMAN_ARC5,
2034 [GAUDI2_QUEUE_ID_NIC_5_1] = CPU_ID_NIC_QMAN_ARC5,
2035 [GAUDI2_QUEUE_ID_NIC_5_2] = CPU_ID_NIC_QMAN_ARC5,
2036 [GAUDI2_QUEUE_ID_NIC_5_3] = CPU_ID_NIC_QMAN_ARC5,
2037 [GAUDI2_QUEUE_ID_NIC_6_0] = CPU_ID_NIC_QMAN_ARC6,
2038 [GAUDI2_QUEUE_ID_NIC_6_1] = CPU_ID_NIC_QMAN_ARC6,
2039 [GAUDI2_QUEUE_ID_NIC_6_2] = CPU_ID_NIC_QMAN_ARC6,
2040 [GAUDI2_QUEUE_ID_NIC_6_3] = CPU_ID_NIC_QMAN_ARC6,
2041 [GAUDI2_QUEUE_ID_NIC_7_0] = CPU_ID_NIC_QMAN_ARC7,
2042 [GAUDI2_QUEUE_ID_NIC_7_1] = CPU_ID_NIC_QMAN_ARC7,
2043 [GAUDI2_QUEUE_ID_NIC_7_2] = CPU_ID_NIC_QMAN_ARC7,
2044 [GAUDI2_QUEUE_ID_NIC_7_3] = CPU_ID_NIC_QMAN_ARC7,
2045 [GAUDI2_QUEUE_ID_NIC_8_0] = CPU_ID_NIC_QMAN_ARC8,
2046 [GAUDI2_QUEUE_ID_NIC_8_1] = CPU_ID_NIC_QMAN_ARC8,
2047 [GAUDI2_QUEUE_ID_NIC_8_2] = CPU_ID_NIC_QMAN_ARC8,
2048 [GAUDI2_QUEUE_ID_NIC_8_3] = CPU_ID_NIC_QMAN_ARC8,
2049 [GAUDI2_QUEUE_ID_NIC_9_0] = CPU_ID_NIC_QMAN_ARC9,
2050 [GAUDI2_QUEUE_ID_NIC_9_1] = CPU_ID_NIC_QMAN_ARC9,
2051 [GAUDI2_QUEUE_ID_NIC_9_2] = CPU_ID_NIC_QMAN_ARC9,
2052 [GAUDI2_QUEUE_ID_NIC_9_3] = CPU_ID_NIC_QMAN_ARC9,
2053 [GAUDI2_QUEUE_ID_NIC_10_0] = CPU_ID_NIC_QMAN_ARC10,
2054 [GAUDI2_QUEUE_ID_NIC_10_1] = CPU_ID_NIC_QMAN_ARC10,
2055 [GAUDI2_QUEUE_ID_NIC_10_2] = CPU_ID_NIC_QMAN_ARC10,
2056 [GAUDI2_QUEUE_ID_NIC_10_3] = CPU_ID_NIC_QMAN_ARC10,
2057 [GAUDI2_QUEUE_ID_NIC_11_0] = CPU_ID_NIC_QMAN_ARC11,
2058 [GAUDI2_QUEUE_ID_NIC_11_1] = CPU_ID_NIC_QMAN_ARC11,
2059 [GAUDI2_QUEUE_ID_NIC_11_2] = CPU_ID_NIC_QMAN_ARC11,
2060 [GAUDI2_QUEUE_ID_NIC_11_3] = CPU_ID_NIC_QMAN_ARC11,
2061 [GAUDI2_QUEUE_ID_NIC_12_0] = CPU_ID_NIC_QMAN_ARC12,
2062 [GAUDI2_QUEUE_ID_NIC_12_1] = CPU_ID_NIC_QMAN_ARC12,
2063 [GAUDI2_QUEUE_ID_NIC_12_2] = CPU_ID_NIC_QMAN_ARC12,
2064 [GAUDI2_QUEUE_ID_NIC_12_3] = CPU_ID_NIC_QMAN_ARC12,
2065 [GAUDI2_QUEUE_ID_NIC_13_0] = CPU_ID_NIC_QMAN_ARC13,
2066 [GAUDI2_QUEUE_ID_NIC_13_1] = CPU_ID_NIC_QMAN_ARC13,
2067 [GAUDI2_QUEUE_ID_NIC_13_2] = CPU_ID_NIC_QMAN_ARC13,
2068 [GAUDI2_QUEUE_ID_NIC_13_3] = CPU_ID_NIC_QMAN_ARC13,
2069 [GAUDI2_QUEUE_ID_NIC_14_0] = CPU_ID_NIC_QMAN_ARC14,
2070 [GAUDI2_QUEUE_ID_NIC_14_1] = CPU_ID_NIC_QMAN_ARC14,
2071 [GAUDI2_QUEUE_ID_NIC_14_2] = CPU_ID_NIC_QMAN_ARC14,
2072 [GAUDI2_QUEUE_ID_NIC_14_3] = CPU_ID_NIC_QMAN_ARC14,
2073 [GAUDI2_QUEUE_ID_NIC_15_0] = CPU_ID_NIC_QMAN_ARC15,
2074 [GAUDI2_QUEUE_ID_NIC_15_1] = CPU_ID_NIC_QMAN_ARC15,
2075 [GAUDI2_QUEUE_ID_NIC_15_2] = CPU_ID_NIC_QMAN_ARC15,
2076 [GAUDI2_QUEUE_ID_NIC_15_3] = CPU_ID_NIC_QMAN_ARC15,
2077 [GAUDI2_QUEUE_ID_NIC_16_0] = CPU_ID_NIC_QMAN_ARC16,
2078 [GAUDI2_QUEUE_ID_NIC_16_1] = CPU_ID_NIC_QMAN_ARC16,
2079 [GAUDI2_QUEUE_ID_NIC_16_2] = CPU_ID_NIC_QMAN_ARC16,
2080 [GAUDI2_QUEUE_ID_NIC_16_3] = CPU_ID_NIC_QMAN_ARC16,
2081 [GAUDI2_QUEUE_ID_NIC_17_0] = CPU_ID_NIC_QMAN_ARC17,
2082 [GAUDI2_QUEUE_ID_NIC_17_1] = CPU_ID_NIC_QMAN_ARC17,
2083 [GAUDI2_QUEUE_ID_NIC_17_2] = CPU_ID_NIC_QMAN_ARC17,
2084 [GAUDI2_QUEUE_ID_NIC_17_3] = CPU_ID_NIC_QMAN_ARC17,
2085 [GAUDI2_QUEUE_ID_NIC_18_0] = CPU_ID_NIC_QMAN_ARC18,
2086 [GAUDI2_QUEUE_ID_NIC_18_1] = CPU_ID_NIC_QMAN_ARC18,
2087 [GAUDI2_QUEUE_ID_NIC_18_2] = CPU_ID_NIC_QMAN_ARC18,
2088 [GAUDI2_QUEUE_ID_NIC_18_3] = CPU_ID_NIC_QMAN_ARC18,
2089 [GAUDI2_QUEUE_ID_NIC_19_0] = CPU_ID_NIC_QMAN_ARC19,
2090 [GAUDI2_QUEUE_ID_NIC_19_1] = CPU_ID_NIC_QMAN_ARC19,
2091 [GAUDI2_QUEUE_ID_NIC_19_2] = CPU_ID_NIC_QMAN_ARC19,
2092 [GAUDI2_QUEUE_ID_NIC_19_3] = CPU_ID_NIC_QMAN_ARC19,
2093 [GAUDI2_QUEUE_ID_NIC_20_0] = CPU_ID_NIC_QMAN_ARC20,
2094 [GAUDI2_QUEUE_ID_NIC_20_1] = CPU_ID_NIC_QMAN_ARC20,
2095 [GAUDI2_QUEUE_ID_NIC_20_2] = CPU_ID_NIC_QMAN_ARC20,
2096 [GAUDI2_QUEUE_ID_NIC_20_3] = CPU_ID_NIC_QMAN_ARC20,
2097 [GAUDI2_QUEUE_ID_NIC_21_0] = CPU_ID_NIC_QMAN_ARC21,
2098 [GAUDI2_QUEUE_ID_NIC_21_1] = CPU_ID_NIC_QMAN_ARC21,
2099 [GAUDI2_QUEUE_ID_NIC_21_2] = CPU_ID_NIC_QMAN_ARC21,
2100 [GAUDI2_QUEUE_ID_NIC_21_3] = CPU_ID_NIC_QMAN_ARC21,
2101 [GAUDI2_QUEUE_ID_NIC_22_0] = CPU_ID_NIC_QMAN_ARC22,
2102 [GAUDI2_QUEUE_ID_NIC_22_1] = CPU_ID_NIC_QMAN_ARC22,
2103 [GAUDI2_QUEUE_ID_NIC_22_2] = CPU_ID_NIC_QMAN_ARC22,
2104 [GAUDI2_QUEUE_ID_NIC_22_3] = CPU_ID_NIC_QMAN_ARC22,
2105 [GAUDI2_QUEUE_ID_NIC_23_0] = CPU_ID_NIC_QMAN_ARC23,
2106 [GAUDI2_QUEUE_ID_NIC_23_1] = CPU_ID_NIC_QMAN_ARC23,
2107 [GAUDI2_QUEUE_ID_NIC_23_2] = CPU_ID_NIC_QMAN_ARC23,
2108 [GAUDI2_QUEUE_ID_NIC_23_3] = CPU_ID_NIC_QMAN_ARC23,
2109 [GAUDI2_QUEUE_ID_ROT_0_0] = CPU_ID_ROT_QMAN_ARC0,
2110 [GAUDI2_QUEUE_ID_ROT_0_1] = CPU_ID_ROT_QMAN_ARC0,
2111 [GAUDI2_QUEUE_ID_ROT_0_2] = CPU_ID_ROT_QMAN_ARC0,
2112 [GAUDI2_QUEUE_ID_ROT_0_3] = CPU_ID_ROT_QMAN_ARC0,
2113 [GAUDI2_QUEUE_ID_ROT_1_0] = CPU_ID_ROT_QMAN_ARC1,
2114 [GAUDI2_QUEUE_ID_ROT_1_1] = CPU_ID_ROT_QMAN_ARC1,
2115 [GAUDI2_QUEUE_ID_ROT_1_2] = CPU_ID_ROT_QMAN_ARC1,
2116 [GAUDI2_QUEUE_ID_ROT_1_3] = CPU_ID_ROT_QMAN_ARC1
2117 };
2118
2119 const u32 gaudi2_dma_core_blocks_bases[DMA_CORE_ID_SIZE] = {
2120 [DMA_CORE_ID_PDMA0] = mmPDMA0_CORE_BASE,
2121 [DMA_CORE_ID_PDMA1] = mmPDMA1_CORE_BASE,
2122 [DMA_CORE_ID_EDMA0] = mmDCORE0_EDMA0_CORE_BASE,
2123 [DMA_CORE_ID_EDMA1] = mmDCORE0_EDMA1_CORE_BASE,
2124 [DMA_CORE_ID_EDMA2] = mmDCORE1_EDMA0_CORE_BASE,
2125 [DMA_CORE_ID_EDMA3] = mmDCORE1_EDMA1_CORE_BASE,
2126 [DMA_CORE_ID_EDMA4] = mmDCORE2_EDMA0_CORE_BASE,
2127 [DMA_CORE_ID_EDMA5] = mmDCORE2_EDMA1_CORE_BASE,
2128 [DMA_CORE_ID_EDMA6] = mmDCORE3_EDMA0_CORE_BASE,
2129 [DMA_CORE_ID_EDMA7] = mmDCORE3_EDMA1_CORE_BASE,
2130 [DMA_CORE_ID_KDMA] = mmARC_FARM_KDMA_BASE
2131 };
2132
2133 const u32 gaudi2_mme_acc_blocks_bases[MME_ID_SIZE] = {
2134 [MME_ID_DCORE0] = mmDCORE0_MME_ACC_BASE,
2135 [MME_ID_DCORE1] = mmDCORE1_MME_ACC_BASE,
2136 [MME_ID_DCORE2] = mmDCORE2_MME_ACC_BASE,
2137 [MME_ID_DCORE3] = mmDCORE3_MME_ACC_BASE
2138 };
2139
2140 static const u32 gaudi2_tpc_cfg_blocks_bases[TPC_ID_SIZE] = {
2141 [TPC_ID_DCORE0_TPC0] = mmDCORE0_TPC0_CFG_BASE,
2142 [TPC_ID_DCORE0_TPC1] = mmDCORE0_TPC1_CFG_BASE,
2143 [TPC_ID_DCORE0_TPC2] = mmDCORE0_TPC2_CFG_BASE,
2144 [TPC_ID_DCORE0_TPC3] = mmDCORE0_TPC3_CFG_BASE,
2145 [TPC_ID_DCORE0_TPC4] = mmDCORE0_TPC4_CFG_BASE,
2146 [TPC_ID_DCORE0_TPC5] = mmDCORE0_TPC5_CFG_BASE,
2147 [TPC_ID_DCORE1_TPC0] = mmDCORE1_TPC0_CFG_BASE,
2148 [TPC_ID_DCORE1_TPC1] = mmDCORE1_TPC1_CFG_BASE,
2149 [TPC_ID_DCORE1_TPC2] = mmDCORE1_TPC2_CFG_BASE,
2150 [TPC_ID_DCORE1_TPC3] = mmDCORE1_TPC3_CFG_BASE,
2151 [TPC_ID_DCORE1_TPC4] = mmDCORE1_TPC4_CFG_BASE,
2152 [TPC_ID_DCORE1_TPC5] = mmDCORE1_TPC5_CFG_BASE,
2153 [TPC_ID_DCORE2_TPC0] = mmDCORE2_TPC0_CFG_BASE,
2154 [TPC_ID_DCORE2_TPC1] = mmDCORE2_TPC1_CFG_BASE,
2155 [TPC_ID_DCORE2_TPC2] = mmDCORE2_TPC2_CFG_BASE,
2156 [TPC_ID_DCORE2_TPC3] = mmDCORE2_TPC3_CFG_BASE,
2157 [TPC_ID_DCORE2_TPC4] = mmDCORE2_TPC4_CFG_BASE,
2158 [TPC_ID_DCORE2_TPC5] = mmDCORE2_TPC5_CFG_BASE,
2159 [TPC_ID_DCORE3_TPC0] = mmDCORE3_TPC0_CFG_BASE,
2160 [TPC_ID_DCORE3_TPC1] = mmDCORE3_TPC1_CFG_BASE,
2161 [TPC_ID_DCORE3_TPC2] = mmDCORE3_TPC2_CFG_BASE,
2162 [TPC_ID_DCORE3_TPC3] = mmDCORE3_TPC3_CFG_BASE,
2163 [TPC_ID_DCORE3_TPC4] = mmDCORE3_TPC4_CFG_BASE,
2164 [TPC_ID_DCORE3_TPC5] = mmDCORE3_TPC5_CFG_BASE,
2165 [TPC_ID_DCORE0_TPC6] = mmDCORE0_TPC6_CFG_BASE,
2166 };
2167
2168 static const u32 gaudi2_tpc_eml_cfg_blocks_bases[TPC_ID_SIZE] = {
2169 [TPC_ID_DCORE0_TPC0] = mmDCORE0_TPC0_EML_CFG_BASE,
2170 [TPC_ID_DCORE0_TPC1] = mmDCORE0_TPC1_EML_CFG_BASE,
2171 [TPC_ID_DCORE0_TPC2] = mmDCORE0_TPC2_EML_CFG_BASE,
2172 [TPC_ID_DCORE0_TPC3] = mmDCORE0_TPC3_EML_CFG_BASE,
2173 [TPC_ID_DCORE0_TPC4] = mmDCORE0_TPC4_EML_CFG_BASE,
2174 [TPC_ID_DCORE0_TPC5] = mmDCORE0_TPC5_EML_CFG_BASE,
2175 [TPC_ID_DCORE1_TPC0] = mmDCORE1_TPC0_EML_CFG_BASE,
2176 [TPC_ID_DCORE1_TPC1] = mmDCORE1_TPC1_EML_CFG_BASE,
2177 [TPC_ID_DCORE1_TPC2] = mmDCORE1_TPC2_EML_CFG_BASE,
2178 [TPC_ID_DCORE1_TPC3] = mmDCORE1_TPC3_EML_CFG_BASE,
2179 [TPC_ID_DCORE1_TPC4] = mmDCORE1_TPC4_EML_CFG_BASE,
2180 [TPC_ID_DCORE1_TPC5] = mmDCORE1_TPC5_EML_CFG_BASE,
2181 [TPC_ID_DCORE2_TPC0] = mmDCORE2_TPC0_EML_CFG_BASE,
2182 [TPC_ID_DCORE2_TPC1] = mmDCORE2_TPC1_EML_CFG_BASE,
2183 [TPC_ID_DCORE2_TPC2] = mmDCORE2_TPC2_EML_CFG_BASE,
2184 [TPC_ID_DCORE2_TPC3] = mmDCORE2_TPC3_EML_CFG_BASE,
2185 [TPC_ID_DCORE2_TPC4] = mmDCORE2_TPC4_EML_CFG_BASE,
2186 [TPC_ID_DCORE2_TPC5] = mmDCORE2_TPC5_EML_CFG_BASE,
2187 [TPC_ID_DCORE3_TPC0] = mmDCORE3_TPC0_EML_CFG_BASE,
2188 [TPC_ID_DCORE3_TPC1] = mmDCORE3_TPC1_EML_CFG_BASE,
2189 [TPC_ID_DCORE3_TPC2] = mmDCORE3_TPC2_EML_CFG_BASE,
2190 [TPC_ID_DCORE3_TPC3] = mmDCORE3_TPC3_EML_CFG_BASE,
2191 [TPC_ID_DCORE3_TPC4] = mmDCORE3_TPC4_EML_CFG_BASE,
2192 [TPC_ID_DCORE3_TPC5] = mmDCORE3_TPC5_EML_CFG_BASE,
2193 [TPC_ID_DCORE0_TPC6] = mmDCORE0_TPC6_EML_CFG_BASE,
2194 };
2195
2196 const u32 gaudi2_rot_blocks_bases[ROTATOR_ID_SIZE] = {
2197 [ROTATOR_ID_0] = mmROT0_BASE,
2198 [ROTATOR_ID_1] = mmROT1_BASE
2199 };
2200
2201 static const u32 gaudi2_tpc_id_to_queue_id[TPC_ID_SIZE] = {
2202 [TPC_ID_DCORE0_TPC0] = GAUDI2_QUEUE_ID_DCORE0_TPC_0_0,
2203 [TPC_ID_DCORE0_TPC1] = GAUDI2_QUEUE_ID_DCORE0_TPC_1_0,
2204 [TPC_ID_DCORE0_TPC2] = GAUDI2_QUEUE_ID_DCORE0_TPC_2_0,
2205 [TPC_ID_DCORE0_TPC3] = GAUDI2_QUEUE_ID_DCORE0_TPC_3_0,
2206 [TPC_ID_DCORE0_TPC4] = GAUDI2_QUEUE_ID_DCORE0_TPC_4_0,
2207 [TPC_ID_DCORE0_TPC5] = GAUDI2_QUEUE_ID_DCORE0_TPC_5_0,
2208 [TPC_ID_DCORE1_TPC0] = GAUDI2_QUEUE_ID_DCORE1_TPC_0_0,
2209 [TPC_ID_DCORE1_TPC1] = GAUDI2_QUEUE_ID_DCORE1_TPC_1_0,
2210 [TPC_ID_DCORE1_TPC2] = GAUDI2_QUEUE_ID_DCORE1_TPC_2_0,
2211 [TPC_ID_DCORE1_TPC3] = GAUDI2_QUEUE_ID_DCORE1_TPC_3_0,
2212 [TPC_ID_DCORE1_TPC4] = GAUDI2_QUEUE_ID_DCORE1_TPC_4_0,
2213 [TPC_ID_DCORE1_TPC5] = GAUDI2_QUEUE_ID_DCORE1_TPC_5_0,
2214 [TPC_ID_DCORE2_TPC0] = GAUDI2_QUEUE_ID_DCORE2_TPC_0_0,
2215 [TPC_ID_DCORE2_TPC1] = GAUDI2_QUEUE_ID_DCORE2_TPC_1_0,
2216 [TPC_ID_DCORE2_TPC2] = GAUDI2_QUEUE_ID_DCORE2_TPC_2_0,
2217 [TPC_ID_DCORE2_TPC3] = GAUDI2_QUEUE_ID_DCORE2_TPC_3_0,
2218 [TPC_ID_DCORE2_TPC4] = GAUDI2_QUEUE_ID_DCORE2_TPC_4_0,
2219 [TPC_ID_DCORE2_TPC5] = GAUDI2_QUEUE_ID_DCORE2_TPC_5_0,
2220 [TPC_ID_DCORE3_TPC0] = GAUDI2_QUEUE_ID_DCORE3_TPC_0_0,
2221 [TPC_ID_DCORE3_TPC1] = GAUDI2_QUEUE_ID_DCORE3_TPC_1_0,
2222 [TPC_ID_DCORE3_TPC2] = GAUDI2_QUEUE_ID_DCORE3_TPC_2_0,
2223 [TPC_ID_DCORE3_TPC3] = GAUDI2_QUEUE_ID_DCORE3_TPC_3_0,
2224 [TPC_ID_DCORE3_TPC4] = GAUDI2_QUEUE_ID_DCORE3_TPC_4_0,
2225 [TPC_ID_DCORE3_TPC5] = GAUDI2_QUEUE_ID_DCORE3_TPC_5_0,
2226 [TPC_ID_DCORE0_TPC6] = GAUDI2_QUEUE_ID_DCORE0_TPC_6_0,
2227 };
2228
2229 static const u32 gaudi2_rot_id_to_queue_id[ROTATOR_ID_SIZE] = {
2230 [ROTATOR_ID_0] = GAUDI2_QUEUE_ID_ROT_0_0,
2231 [ROTATOR_ID_1] = GAUDI2_QUEUE_ID_ROT_1_0,
2232 };
2233
2234 static const u32 gaudi2_tpc_engine_id_to_tpc_id[] = {
2235 [GAUDI2_DCORE0_ENGINE_ID_TPC_0] = TPC_ID_DCORE0_TPC0,
2236 [GAUDI2_DCORE0_ENGINE_ID_TPC_1] = TPC_ID_DCORE0_TPC1,
2237 [GAUDI2_DCORE0_ENGINE_ID_TPC_2] = TPC_ID_DCORE0_TPC2,
2238 [GAUDI2_DCORE0_ENGINE_ID_TPC_3] = TPC_ID_DCORE0_TPC3,
2239 [GAUDI2_DCORE0_ENGINE_ID_TPC_4] = TPC_ID_DCORE0_TPC4,
2240 [GAUDI2_DCORE0_ENGINE_ID_TPC_5] = TPC_ID_DCORE0_TPC5,
2241 [GAUDI2_DCORE1_ENGINE_ID_TPC_0] = TPC_ID_DCORE1_TPC0,
2242 [GAUDI2_DCORE1_ENGINE_ID_TPC_1] = TPC_ID_DCORE1_TPC1,
2243 [GAUDI2_DCORE1_ENGINE_ID_TPC_2] = TPC_ID_DCORE1_TPC2,
2244 [GAUDI2_DCORE1_ENGINE_ID_TPC_3] = TPC_ID_DCORE1_TPC3,
2245 [GAUDI2_DCORE1_ENGINE_ID_TPC_4] = TPC_ID_DCORE1_TPC4,
2246 [GAUDI2_DCORE1_ENGINE_ID_TPC_5] = TPC_ID_DCORE1_TPC5,
2247 [GAUDI2_DCORE2_ENGINE_ID_TPC_0] = TPC_ID_DCORE2_TPC0,
2248 [GAUDI2_DCORE2_ENGINE_ID_TPC_1] = TPC_ID_DCORE2_TPC1,
2249 [GAUDI2_DCORE2_ENGINE_ID_TPC_2] = TPC_ID_DCORE2_TPC2,
2250 [GAUDI2_DCORE2_ENGINE_ID_TPC_3] = TPC_ID_DCORE2_TPC3,
2251 [GAUDI2_DCORE2_ENGINE_ID_TPC_4] = TPC_ID_DCORE2_TPC4,
2252 [GAUDI2_DCORE2_ENGINE_ID_TPC_5] = TPC_ID_DCORE2_TPC5,
2253 [GAUDI2_DCORE3_ENGINE_ID_TPC_0] = TPC_ID_DCORE3_TPC0,
2254 [GAUDI2_DCORE3_ENGINE_ID_TPC_1] = TPC_ID_DCORE3_TPC1,
2255 [GAUDI2_DCORE3_ENGINE_ID_TPC_2] = TPC_ID_DCORE3_TPC2,
2256 [GAUDI2_DCORE3_ENGINE_ID_TPC_3] = TPC_ID_DCORE3_TPC3,
2257 [GAUDI2_DCORE3_ENGINE_ID_TPC_4] = TPC_ID_DCORE3_TPC4,
2258 [GAUDI2_DCORE3_ENGINE_ID_TPC_5] = TPC_ID_DCORE3_TPC5,
2259 /* the PCI TPC is placed last (mapped liked HW) */
2260 [GAUDI2_DCORE0_ENGINE_ID_TPC_6] = TPC_ID_DCORE0_TPC6,
2261 };
2262
2263 static const u32 gaudi2_mme_engine_id_to_mme_id[] = {
2264 [GAUDI2_DCORE0_ENGINE_ID_MME] = MME_ID_DCORE0,
2265 [GAUDI2_DCORE1_ENGINE_ID_MME] = MME_ID_DCORE1,
2266 [GAUDI2_DCORE2_ENGINE_ID_MME] = MME_ID_DCORE2,
2267 [GAUDI2_DCORE3_ENGINE_ID_MME] = MME_ID_DCORE3,
2268 };
2269
2270 static const u32 gaudi2_edma_engine_id_to_edma_id[] = {
2271 [GAUDI2_ENGINE_ID_PDMA_0] = DMA_CORE_ID_PDMA0,
2272 [GAUDI2_ENGINE_ID_PDMA_1] = DMA_CORE_ID_PDMA1,
2273 [GAUDI2_DCORE0_ENGINE_ID_EDMA_0] = DMA_CORE_ID_EDMA0,
2274 [GAUDI2_DCORE0_ENGINE_ID_EDMA_1] = DMA_CORE_ID_EDMA1,
2275 [GAUDI2_DCORE1_ENGINE_ID_EDMA_0] = DMA_CORE_ID_EDMA2,
2276 [GAUDI2_DCORE1_ENGINE_ID_EDMA_1] = DMA_CORE_ID_EDMA3,
2277 [GAUDI2_DCORE2_ENGINE_ID_EDMA_0] = DMA_CORE_ID_EDMA4,
2278 [GAUDI2_DCORE2_ENGINE_ID_EDMA_1] = DMA_CORE_ID_EDMA5,
2279 [GAUDI2_DCORE3_ENGINE_ID_EDMA_0] = DMA_CORE_ID_EDMA6,
2280 [GAUDI2_DCORE3_ENGINE_ID_EDMA_1] = DMA_CORE_ID_EDMA7,
2281 [GAUDI2_ENGINE_ID_KDMA] = DMA_CORE_ID_KDMA,
2282 };
2283
2284 const u32 edma_stream_base[NUM_OF_EDMA_PER_DCORE * NUM_OF_DCORES] = {
2285 GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0,
2286 GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0,
2287 GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0,
2288 GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0,
2289 GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0,
2290 GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0,
2291 GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0,
2292 GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0,
2293 };
2294
2295 static const char gaudi2_vdec_irq_name[GAUDI2_VDEC_MSIX_ENTRIES][GAUDI2_MAX_STRING_LEN] = {
2296 "gaudi2 vdec 0_0", "gaudi2 vdec 0_0 abnormal",
2297 "gaudi2 vdec 0_1", "gaudi2 vdec 0_1 abnormal",
2298 "gaudi2 vdec 1_0", "gaudi2 vdec 1_0 abnormal",
2299 "gaudi2 vdec 1_1", "gaudi2 vdec 1_1 abnormal",
2300 "gaudi2 vdec 2_0", "gaudi2 vdec 2_0 abnormal",
2301 "gaudi2 vdec 2_1", "gaudi2 vdec 2_1 abnormal",
2302 "gaudi2 vdec 3_0", "gaudi2 vdec 3_0 abnormal",
2303 "gaudi2 vdec 3_1", "gaudi2 vdec 3_1 abnormal",
2304 "gaudi2 vdec s_0", "gaudi2 vdec s_0 abnormal",
2305 "gaudi2 vdec s_1", "gaudi2 vdec s_1 abnormal"
2306 };
2307
2308 enum rtr_id {
2309 DCORE0_RTR0,
2310 DCORE0_RTR1,
2311 DCORE0_RTR2,
2312 DCORE0_RTR3,
2313 DCORE0_RTR4,
2314 DCORE0_RTR5,
2315 DCORE0_RTR6,
2316 DCORE0_RTR7,
2317 DCORE1_RTR0,
2318 DCORE1_RTR1,
2319 DCORE1_RTR2,
2320 DCORE1_RTR3,
2321 DCORE1_RTR4,
2322 DCORE1_RTR5,
2323 DCORE1_RTR6,
2324 DCORE1_RTR7,
2325 DCORE2_RTR0,
2326 DCORE2_RTR1,
2327 DCORE2_RTR2,
2328 DCORE2_RTR3,
2329 DCORE2_RTR4,
2330 DCORE2_RTR5,
2331 DCORE2_RTR6,
2332 DCORE2_RTR7,
2333 DCORE3_RTR0,
2334 DCORE3_RTR1,
2335 DCORE3_RTR2,
2336 DCORE3_RTR3,
2337 DCORE3_RTR4,
2338 DCORE3_RTR5,
2339 DCORE3_RTR6,
2340 DCORE3_RTR7,
2341 };
2342
2343 static const u32 gaudi2_tpc_initiator_hbw_rtr_id[NUM_OF_TPC_PER_DCORE * NUM_OF_DCORES + 1] = {
2344 DCORE0_RTR1, DCORE0_RTR1, DCORE0_RTR2, DCORE0_RTR2, DCORE0_RTR3, DCORE0_RTR3,
2345 DCORE1_RTR6, DCORE1_RTR6, DCORE1_RTR5, DCORE1_RTR5, DCORE1_RTR4, DCORE1_RTR4,
2346 DCORE2_RTR3, DCORE2_RTR3, DCORE2_RTR2, DCORE2_RTR2, DCORE2_RTR1, DCORE2_RTR1,
2347 DCORE3_RTR4, DCORE3_RTR4, DCORE3_RTR5, DCORE3_RTR5, DCORE3_RTR6, DCORE3_RTR6,
2348 DCORE0_RTR0
2349 };
2350
2351 static const u32 gaudi2_tpc_initiator_lbw_rtr_id[NUM_OF_TPC_PER_DCORE * NUM_OF_DCORES + 1] = {
2352 DCORE0_RTR1, DCORE0_RTR1, DCORE0_RTR1, DCORE0_RTR1, DCORE0_RTR2, DCORE0_RTR2,
2353 DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR6, DCORE1_RTR6, DCORE1_RTR5, DCORE1_RTR5,
2354 DCORE2_RTR2, DCORE2_RTR2, DCORE2_RTR1, DCORE2_RTR1, DCORE2_RTR0, DCORE2_RTR0,
2355 DCORE3_RTR5, DCORE3_RTR5, DCORE3_RTR6, DCORE3_RTR6, DCORE3_RTR7, DCORE3_RTR7,
2356 DCORE0_RTR0
2357 };
2358
2359 static const u32 gaudi2_dec_initiator_hbw_rtr_id[NUMBER_OF_DEC] = {
2360 DCORE0_RTR0, DCORE0_RTR0, DCORE1_RTR7, DCORE1_RTR7, DCORE2_RTR0, DCORE2_RTR0,
2361 DCORE3_RTR7, DCORE3_RTR7, DCORE0_RTR0, DCORE0_RTR0
2362 };
2363
2364 static const u32 gaudi2_dec_initiator_lbw_rtr_id[NUMBER_OF_DEC] = {
2365 DCORE0_RTR1, DCORE0_RTR1, DCORE1_RTR6, DCORE1_RTR6, DCORE2_RTR1, DCORE2_RTR1,
2366 DCORE3_RTR6, DCORE3_RTR6, DCORE0_RTR0, DCORE0_RTR0
2367 };
2368
2369 static const u32 gaudi2_nic_initiator_hbw_rtr_id[NIC_NUMBER_OF_MACROS] = {
2370 DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE2_RTR0,
2371 DCORE2_RTR0, DCORE2_RTR0, DCORE2_RTR0, DCORE3_RTR7, DCORE3_RTR7, DCORE3_RTR7
2372 };
2373
2374 static const u32 gaudi2_nic_initiator_lbw_rtr_id[NIC_NUMBER_OF_MACROS] = {
2375 DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE2_RTR0,
2376 DCORE2_RTR0, DCORE2_RTR0, DCORE2_RTR0, DCORE3_RTR7, DCORE3_RTR7, DCORE3_RTR7
2377 };
2378
2379 static const u32 gaudi2_edma_initiator_hbw_sft[NUM_OF_EDMA_PER_DCORE * NUM_OF_DCORES] = {
2380 mmSFT0_HBW_RTR_IF1_MSTR_IF_RR_SHRD_HBW_BASE,
2381 mmSFT0_HBW_RTR_IF0_MSTR_IF_RR_SHRD_HBW_BASE,
2382 mmSFT1_HBW_RTR_IF1_MSTR_IF_RR_SHRD_HBW_BASE,
2383 mmSFT1_HBW_RTR_IF0_MSTR_IF_RR_SHRD_HBW_BASE,
2384 mmSFT2_HBW_RTR_IF0_MSTR_IF_RR_SHRD_HBW_BASE,
2385 mmSFT2_HBW_RTR_IF1_MSTR_IF_RR_SHRD_HBW_BASE,
2386 mmSFT3_HBW_RTR_IF0_MSTR_IF_RR_SHRD_HBW_BASE,
2387 mmSFT3_HBW_RTR_IF1_MSTR_IF_RR_SHRD_HBW_BASE
2388 };
2389
2390 static const u32 gaudi2_pdma_initiator_hbw_rtr_id[NUM_OF_PDMA] = {
2391 DCORE0_RTR0, DCORE0_RTR0
2392 };
2393
2394 static const u32 gaudi2_pdma_initiator_lbw_rtr_id[NUM_OF_PDMA] = {
2395 DCORE0_RTR2, DCORE0_RTR2
2396 };
2397
2398 static const u32 gaudi2_rot_initiator_hbw_rtr_id[NUM_OF_ROT] = {
2399 DCORE2_RTR0, DCORE3_RTR7
2400 };
2401
2402 static const u32 gaudi2_rot_initiator_lbw_rtr_id[NUM_OF_ROT] = {
2403 DCORE2_RTR2, DCORE3_RTR5
2404 };
2405
2406 struct mme_initiators_rtr_id {
2407 u32 wap0;
2408 u32 wap1;
2409 u32 write;
2410 u32 read;
2411 u32 sbte0;
2412 u32 sbte1;
2413 u32 sbte2;
2414 u32 sbte3;
2415 u32 sbte4;
2416 };
2417
2418 enum mme_initiators {
2419 MME_WAP0 = 0,
2420 MME_WAP1,
2421 MME_WRITE,
2422 MME_READ,
2423 MME_SBTE0,
2424 MME_SBTE1,
2425 MME_SBTE2,
2426 MME_SBTE3,
2427 MME_SBTE4,
2428 MME_INITIATORS_MAX
2429 };
2430
2431 static const struct mme_initiators_rtr_id
2432 gaudi2_mme_initiator_rtr_id[NUM_OF_MME_PER_DCORE * NUM_OF_DCORES] = {
2433 { .wap0 = 5, .wap1 = 7, .write = 6, .read = 7,
2434 .sbte0 = 7, .sbte1 = 4, .sbte2 = 4, .sbte3 = 5, .sbte4 = 6},
2435 { .wap0 = 10, .wap1 = 8, .write = 9, .read = 8,
2436 .sbte0 = 11, .sbte1 = 11, .sbte2 = 10, .sbte3 = 9, .sbte4 = 8},
2437 { .wap0 = 21, .wap1 = 23, .write = 22, .read = 23,
2438 .sbte0 = 20, .sbte1 = 20, .sbte2 = 21, .sbte3 = 22, .sbte4 = 23},
2439 { .wap0 = 30, .wap1 = 28, .write = 29, .read = 30,
2440 .sbte0 = 31, .sbte1 = 31, .sbte2 = 30, .sbte3 = 29, .sbte4 = 28},
2441 };
2442
2443 enum razwi_event_sources {
2444 RAZWI_TPC,
2445 RAZWI_MME,
2446 RAZWI_EDMA,
2447 RAZWI_PDMA,
2448 RAZWI_NIC,
2449 RAZWI_DEC,
2450 RAZWI_ROT,
2451 RAZWI_ARC_FARM
2452 };
2453
2454 struct hbm_mc_error_causes {
2455 u32 mask;
2456 char cause[50];
2457 };
2458
2459 static struct hl_special_block_info gaudi2_special_blocks[] = GAUDI2_SPECIAL_BLOCKS;
2460
2461 /* Special blocks iterator is currently used to configure security protection bits,
2462 * and read global errors. Most HW blocks are addressable and those who aren't (N/A)-
2463 * must be skipped. Following configurations are commonly used for both PB config
2464 * and global error reading, since currently they both share the same settings.
2465 * Once it changes, we must remember to use separate configurations for either one.
2466 */
2467 static int gaudi2_iterator_skip_block_types[] = {
2468 GAUDI2_BLOCK_TYPE_PLL,
2469 GAUDI2_BLOCK_TYPE_EU_BIST,
2470 GAUDI2_BLOCK_TYPE_HBM,
2471 GAUDI2_BLOCK_TYPE_XFT
2472 };
2473
2474 static struct range gaudi2_iterator_skip_block_ranges[] = {
2475 /* Skip all PSOC blocks except for PSOC_GLOBAL_CONF */
2476 {mmPSOC_I2C_M0_BASE, mmPSOC_EFUSE_BASE},
2477 {mmPSOC_BTL_BASE, mmPSOC_MSTR_IF_RR_SHRD_HBW_BASE},
2478 /* Skip all CPU blocks except for CPU_IF */
2479 {mmCPU_CA53_CFG_BASE, mmCPU_CA53_CFG_BASE},
2480 {mmCPU_TIMESTAMP_BASE, mmCPU_MSTR_IF_RR_SHRD_HBW_BASE}
2481 };
2482
2483 static struct hbm_mc_error_causes hbm_mc_spi[GAUDI2_NUM_OF_HBM_MC_SPI_CAUSE] = {
2484 {HBM_MC_SPI_TEMP_PIN_CHG_MASK, "temperature pins changed"},
2485 {HBM_MC_SPI_THR_ENG_MASK, "temperature-based throttling engaged"},
2486 {HBM_MC_SPI_THR_DIS_ENG_MASK, "temperature-based throttling disengaged"},
2487 {HBM_MC_SPI_IEEE1500_COMP_MASK, "IEEE1500 op comp"},
2488 {HBM_MC_SPI_IEEE1500_PAUSED_MASK, "IEEE1500 op paused"},
2489 };
2490
2491 static const char * const hbm_mc_sei_cause[GAUDI2_NUM_OF_HBM_SEI_CAUSE] = {
2492 [HBM_SEI_CMD_PARITY_EVEN] = "SEI C/A parity even",
2493 [HBM_SEI_CMD_PARITY_ODD] = "SEI C/A parity odd",
2494 [HBM_SEI_READ_ERR] = "SEI read data error",
2495 [HBM_SEI_WRITE_DATA_PARITY_ERR] = "SEI write data parity error",
2496 [HBM_SEI_CATTRIP] = "SEI CATTRIP asserted",
2497 [HBM_SEI_MEM_BIST_FAIL] = "SEI memory BIST fail",
2498 [HBM_SEI_DFI] = "SEI DFI error",
2499 [HBM_SEI_INV_TEMP_READ_OUT] = "SEI invalid temp read",
2500 [HBM_SEI_BIST_FAIL] = "SEI BIST fail"
2501 };
2502
2503 struct mmu_spi_sei_cause {
2504 char cause[50];
2505 int clear_bit;
2506 };
2507
2508 static const struct mmu_spi_sei_cause gaudi2_mmu_spi_sei[GAUDI2_NUM_OF_MMU_SPI_SEI_CAUSE] = {
2509 {"page fault", 1}, /* INTERRUPT_CLR[1] */
2510 {"page access", 1}, /* INTERRUPT_CLR[1] */
2511 {"bypass ddr", 2}, /* INTERRUPT_CLR[2] */
2512 {"multi hit", 2}, /* INTERRUPT_CLR[2] */
2513 {"mmu rei0", -1}, /* no clear register bit */
2514 {"mmu rei1", -1}, /* no clear register bit */
2515 {"stlb rei0", -1}, /* no clear register bit */
2516 {"stlb rei1", -1}, /* no clear register bit */
2517 {"rr privileged write hit", 2}, /* INTERRUPT_CLR[2] */
2518 {"rr privileged read hit", 2}, /* INTERRUPT_CLR[2] */
2519 {"rr secure write hit", 2}, /* INTERRUPT_CLR[2] */
2520 {"rr secure read hit", 2}, /* INTERRUPT_CLR[2] */
2521 {"bist_fail no use", 2}, /* INTERRUPT_CLR[2] */
2522 {"bist_fail no use", 2}, /* INTERRUPT_CLR[2] */
2523 {"bist_fail no use", 2}, /* INTERRUPT_CLR[2] */
2524 {"bist_fail no use", 2}, /* INTERRUPT_CLR[2] */
2525 {"slave error", 16}, /* INTERRUPT_CLR[16] */
2526 {"dec error", 17}, /* INTERRUPT_CLR[17] */
2527 {"burst fifo full", 2} /* INTERRUPT_CLR[2] */
2528 };
2529
2530 struct gaudi2_cache_invld_params {
2531 u64 start_va;
2532 u64 end_va;
2533 u32 inv_start_val;
2534 u32 flags;
2535 bool range_invalidation;
2536 };
2537
2538 struct gaudi2_tpc_idle_data {
2539 struct engines_data *e;
2540 unsigned long *mask;
2541 bool *is_idle;
2542 const char *tpc_fmt;
2543 };
2544
2545 struct gaudi2_tpc_mmu_data {
2546 u32 rw_asid;
2547 };
2548
2549 static s64 gaudi2_state_dump_specs_props[SP_MAX] = {0};
2550
2551 static int gaudi2_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size, u64 val);
2552 static bool gaudi2_is_queue_enabled(struct hl_device *hdev, u32 hw_queue_id);
2553 static bool gaudi2_is_arc_enabled(struct hl_device *hdev, u64 arc_id);
2554 static void gaudi2_clr_arc_id_cap(struct hl_device *hdev, u64 arc_id);
2555 static void gaudi2_set_arc_id_cap(struct hl_device *hdev, u64 arc_id);
2556 static void gaudi2_memset_device_lbw(struct hl_device *hdev, u32 addr, u32 size, u32 val);
2557 static int gaudi2_send_job_to_kdma(struct hl_device *hdev, u64 src_addr, u64 dst_addr, u32 size,
2558 bool is_memset);
2559 static bool gaudi2_get_tpc_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,
2560 struct engines_data *e);
2561 static bool gaudi2_get_mme_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,
2562 struct engines_data *e);
2563 static bool gaudi2_get_edma_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,
2564 struct engines_data *e);
2565 static u64 gaudi2_mmu_scramble_addr(struct hl_device *hdev, u64 raw_addr);
2566 static u64 gaudi2_mmu_descramble_addr(struct hl_device *hdev, u64 scrambled_addr);
2567
gaudi2_init_scrambler_hbm(struct hl_device * hdev)2568 static void gaudi2_init_scrambler_hbm(struct hl_device *hdev)
2569 {
2570
2571 }
2572
gaudi2_get_signal_cb_size(struct hl_device * hdev)2573 static u32 gaudi2_get_signal_cb_size(struct hl_device *hdev)
2574 {
2575 return sizeof(struct packet_msg_short);
2576 }
2577
gaudi2_get_wait_cb_size(struct hl_device * hdev)2578 static u32 gaudi2_get_wait_cb_size(struct hl_device *hdev)
2579 {
2580 return sizeof(struct packet_msg_short) * 4 + sizeof(struct packet_fence);
2581 }
2582
gaudi2_iterate_tpcs(struct hl_device * hdev,struct iterate_module_ctx * ctx)2583 void gaudi2_iterate_tpcs(struct hl_device *hdev, struct iterate_module_ctx *ctx)
2584 {
2585 struct asic_fixed_properties *prop = &hdev->asic_prop;
2586 int dcore, inst, tpc_seq;
2587 u32 offset;
2588
2589 /* init the return code */
2590 ctx->rc = 0;
2591
2592 for (dcore = 0; dcore < NUM_OF_DCORES; dcore++) {
2593 for (inst = 0; inst < NUM_OF_TPC_PER_DCORE; inst++) {
2594 tpc_seq = dcore * NUM_OF_TPC_PER_DCORE + inst;
2595
2596 if (!(prop->tpc_enabled_mask & BIT(tpc_seq)))
2597 continue;
2598
2599 offset = (DCORE_OFFSET * dcore) + (DCORE_TPC_OFFSET * inst);
2600
2601 ctx->fn(hdev, dcore, inst, offset, ctx);
2602 if (ctx->rc) {
2603 dev_err(hdev->dev, "TPC iterator failed for DCORE%d TPC%d\n",
2604 dcore, inst);
2605 return;
2606 }
2607 }
2608 }
2609
2610 if (!(prop->tpc_enabled_mask & BIT(TPC_ID_DCORE0_TPC6)))
2611 return;
2612
2613 /* special check for PCI TPC (DCORE0_TPC6) */
2614 offset = DCORE_TPC_OFFSET * (NUM_DCORE0_TPC - 1);
2615 ctx->fn(hdev, 0, NUM_DCORE0_TPC - 1, offset, ctx);
2616 if (ctx->rc)
2617 dev_err(hdev->dev, "TPC iterator failed for DCORE0 TPC6\n");
2618 }
2619
gaudi2_host_phys_addr_valid(u64 addr)2620 static bool gaudi2_host_phys_addr_valid(u64 addr)
2621 {
2622 if ((addr < HOST_PHYS_BASE_0 + HOST_PHYS_SIZE_0) || (addr >= HOST_PHYS_BASE_1))
2623 return true;
2624
2625 return false;
2626 }
2627
set_number_of_functional_hbms(struct hl_device * hdev)2628 static int set_number_of_functional_hbms(struct hl_device *hdev)
2629 {
2630 struct asic_fixed_properties *prop = &hdev->asic_prop;
2631 u8 faulty_hbms = hweight64(hdev->dram_binning);
2632
2633 /* check if all HBMs should be used */
2634 if (!faulty_hbms) {
2635 dev_dbg(hdev->dev, "All HBM are in use (no binning)\n");
2636 prop->num_functional_hbms = GAUDI2_HBM_NUM;
2637 return 0;
2638 }
2639
2640 /*
2641 * check for error condition in which number of binning
2642 * candidates is higher than the maximum supported by the
2643 * driver (in which case binning mask shall be ignored and driver will
2644 * set the default)
2645 */
2646 if (faulty_hbms > MAX_FAULTY_HBMS) {
2647 dev_err(hdev->dev,
2648 "HBM binning supports max of %d faulty HBMs, supplied mask 0x%llx.\n",
2649 MAX_FAULTY_HBMS, hdev->dram_binning);
2650 return -EINVAL;
2651 }
2652
2653 /*
2654 * by default, number of functional HBMs in Gaudi2 is always
2655 * GAUDI2_HBM_NUM - 1.
2656 */
2657 prop->num_functional_hbms = GAUDI2_HBM_NUM - faulty_hbms;
2658 return 0;
2659 }
2660
gaudi2_is_edma_queue_id(u32 queue_id)2661 static bool gaudi2_is_edma_queue_id(u32 queue_id)
2662 {
2663
2664 switch (queue_id) {
2665 case GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3:
2666 case GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3:
2667 case GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3:
2668 case GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3:
2669 return true;
2670 default:
2671 return false;
2672 }
2673 }
2674
gaudi2_set_dram_properties(struct hl_device * hdev)2675 static int gaudi2_set_dram_properties(struct hl_device *hdev)
2676 {
2677 struct asic_fixed_properties *prop = &hdev->asic_prop;
2678 u64 hbm_drv_base_offset = 0, edma_pq_base_addr;
2679 u32 basic_hbm_page_size, edma_idx = 0;
2680 int rc, i;
2681
2682 rc = set_number_of_functional_hbms(hdev);
2683 if (rc)
2684 return -EINVAL;
2685
2686 /*
2687 * Due to HW bug in which TLB size is x16 smaller than expected we use a workaround
2688 * in which we are using x16 bigger page size to be able to populate the entire
2689 * HBM mappings in the TLB
2690 */
2691 basic_hbm_page_size = prop->num_functional_hbms * SZ_8M;
2692 prop->dram_page_size = GAUDI2_COMPENSATE_TLB_PAGE_SIZE_FACTOR * basic_hbm_page_size;
2693 prop->device_mem_alloc_default_page_size = prop->dram_page_size;
2694 prop->dram_size = prop->num_functional_hbms * SZ_16G;
2695 prop->dram_base_address = DRAM_PHYS_BASE;
2696 prop->dram_end_address = prop->dram_base_address + prop->dram_size;
2697 prop->dram_supports_virtual_memory = true;
2698
2699 prop->dram_user_base_address = DRAM_PHYS_BASE + prop->dram_page_size;
2700 prop->dram_hints_align_mask = ~GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK;
2701 prop->hints_dram_reserved_va_range.start_addr = RESERVED_VA_RANGE_FOR_ARC_ON_HBM_START;
2702 prop->hints_dram_reserved_va_range.end_addr = RESERVED_VA_RANGE_FOR_ARC_ON_HBM_END;
2703
2704 /* since DRAM page size differs from DMMU page size we need to allocate
2705 * DRAM memory in units of dram_page size and mapping this memory in
2706 * units of DMMU page size. we overcome this size mismatch using a
2707 * scrambling routine which takes a DRAM page and converts it to a DMMU
2708 * page.
2709 * We therefore:
2710 * 1. partition the virtual address space to DRAM-page (whole) pages.
2711 * (suppose we get n such pages)
2712 * 2. limit the amount of virtual address space we got from 1 above to
2713 * a multiple of 64M as we don't want the scrambled address to cross
2714 * the DRAM virtual address space.
2715 * ( m = (n * DRAM_page_size) / DMMU_page_size).
2716 * 3. determine the and address accordingly
2717 * end_addr = start_addr + m * 48M
2718 *
2719 * the DRAM address MSBs (63:48) are not part of the roundup calculation
2720 */
2721 prop->dmmu.start_addr = prop->dram_base_address +
2722 (prop->dram_page_size *
2723 DIV_ROUND_UP_SECTOR_T(prop->dram_size, prop->dram_page_size));
2724 prop->dmmu.end_addr = prop->dmmu.start_addr + prop->dram_page_size *
2725 div_u64((VA_HBM_SPACE_END - prop->dmmu.start_addr), prop->dmmu.page_size);
2726 /*
2727 * Driver can't share an (48MB) HBM page with the F/W in order to prevent FW to block
2728 * the driver part by range register, so it must start at the next (48MB) page
2729 */
2730 hbm_drv_base_offset = roundup(CPU_FW_IMAGE_SIZE, prop->num_functional_hbms * SZ_8M);
2731
2732 /*
2733 * The NIC driver section size and the HMMU page tables section in the HBM needs
2734 * to be the remaining size in the first dram page after taking into
2735 * account the F/W image size
2736 */
2737
2738 /* Reserve region in HBM for HMMU page tables */
2739 prop->mmu_pgt_addr = DRAM_PHYS_BASE + hbm_drv_base_offset +
2740 ((prop->dram_page_size - hbm_drv_base_offset) -
2741 (HMMU_PAGE_TABLES_SIZE + EDMA_PQS_SIZE + EDMA_SCRATCHPAD_SIZE));
2742
2743 /* Set EDMA PQs HBM addresses */
2744 edma_pq_base_addr = prop->mmu_pgt_addr + HMMU_PAGE_TABLES_SIZE;
2745
2746 for (i = 0 ; i < GAUDI2_QUEUE_ID_CPU_PQ ; i++) {
2747 if (gaudi2_is_edma_queue_id(i)) {
2748 prop->hw_queues_props[i].q_dram_bd_address = edma_pq_base_addr +
2749 (edma_idx * HL_QUEUE_SIZE_IN_BYTES);
2750 edma_idx++;
2751 }
2752 }
2753
2754 return 0;
2755 }
2756
gaudi2_set_fixed_properties(struct hl_device * hdev)2757 static int gaudi2_set_fixed_properties(struct hl_device *hdev)
2758 {
2759 struct asic_fixed_properties *prop = &hdev->asic_prop;
2760 struct hw_queue_properties *q_props;
2761 u32 num_sync_stream_queues = 0;
2762 int i, rc;
2763
2764 prop->max_queues = GAUDI2_QUEUE_ID_SIZE;
2765 prop->hw_queues_props = kzalloc_objs(struct hw_queue_properties,
2766 prop->max_queues);
2767
2768 if (!prop->hw_queues_props)
2769 return -ENOMEM;
2770
2771 q_props = prop->hw_queues_props;
2772
2773 for (i = 0 ; i < GAUDI2_QUEUE_ID_CPU_PQ ; i++) {
2774 q_props[i].type = QUEUE_TYPE_HW;
2775 q_props[i].driver_only = 0;
2776
2777 if (i >= GAUDI2_QUEUE_ID_NIC_0_0 && i <= GAUDI2_QUEUE_ID_NIC_23_3) {
2778 q_props[i].supports_sync_stream = 0;
2779 } else {
2780 q_props[i].supports_sync_stream = 1;
2781 num_sync_stream_queues++;
2782 }
2783
2784 q_props[i].cb_alloc_flags = CB_ALLOC_USER;
2785
2786 if (gaudi2_is_edma_queue_id(i))
2787 q_props[i].dram_bd = 1;
2788 }
2789
2790 q_props[GAUDI2_QUEUE_ID_CPU_PQ].type = QUEUE_TYPE_CPU;
2791 q_props[GAUDI2_QUEUE_ID_CPU_PQ].driver_only = 1;
2792 q_props[GAUDI2_QUEUE_ID_CPU_PQ].cb_alloc_flags = CB_ALLOC_KERNEL;
2793
2794 prop->cache_line_size = DEVICE_CACHE_LINE_SIZE;
2795 prop->cfg_base_address = CFG_BASE;
2796 prop->device_dma_offset_for_host_access = HOST_PHYS_BASE_0;
2797 prop->host_base_address = HOST_PHYS_BASE_0;
2798 prop->host_end_address = prop->host_base_address + HOST_PHYS_SIZE_0;
2799 prop->max_pending_cs = GAUDI2_MAX_PENDING_CS;
2800 prop->completion_queues_count = GAUDI2_RESERVED_CQ_NUMBER;
2801 prop->user_dec_intr_count = NUMBER_OF_DEC;
2802 prop->user_interrupt_count = GAUDI2_IRQ_NUM_USER_LAST - GAUDI2_IRQ_NUM_USER_FIRST + 1;
2803 prop->completion_mode = HL_COMPLETION_MODE_CS;
2804 prop->sync_stream_first_sob = GAUDI2_RESERVED_SOB_NUMBER;
2805 prop->sync_stream_first_mon = GAUDI2_RESERVED_MON_NUMBER;
2806
2807 prop->sram_base_address = SRAM_BASE_ADDR;
2808 prop->sram_size = SRAM_SIZE;
2809 prop->sram_end_address = prop->sram_base_address + prop->sram_size;
2810 prop->sram_user_base_address = prop->sram_base_address + SRAM_USER_BASE_OFFSET;
2811
2812 prop->hints_range_reservation = true;
2813
2814 prop->rotator_enabled_mask = BIT(NUM_OF_ROT) - 1;
2815
2816 prop->max_asid = 2;
2817
2818 prop->dmmu.pgt_size = HMMU_PAGE_TABLES_SIZE;
2819 prop->mmu_pte_size = HL_PTE_SIZE;
2820
2821 prop->dmmu.hop_shifts[MMU_HOP0] = DHOP0_SHIFT;
2822 prop->dmmu.hop_shifts[MMU_HOP1] = DHOP1_SHIFT;
2823 prop->dmmu.hop_shifts[MMU_HOP2] = DHOP2_SHIFT;
2824 prop->dmmu.hop_shifts[MMU_HOP3] = DHOP3_SHIFT;
2825 prop->dmmu.hop_masks[MMU_HOP0] = DHOP0_MASK;
2826 prop->dmmu.hop_masks[MMU_HOP1] = DHOP1_MASK;
2827 prop->dmmu.hop_masks[MMU_HOP2] = DHOP2_MASK;
2828 prop->dmmu.hop_masks[MMU_HOP3] = DHOP3_MASK;
2829 prop->dmmu.page_size = PAGE_SIZE_1GB;
2830 prop->dmmu.num_hops = MMU_ARCH_4_HOPS;
2831 prop->dmmu.last_mask = LAST_MASK;
2832 prop->dmmu.host_resident = 0;
2833 prop->dmmu.hop_table_size = HOP_TABLE_SIZE_512_PTE;
2834 prop->dmmu.hop0_tables_total_size = HOP_TABLE_SIZE_512_PTE * prop->max_asid;
2835
2836 /* As we need to set the pgt address in dram for HMMU init so we cannot
2837 * wait to the fw cpucp info to set the dram props as mmu init comes before
2838 * hw init
2839 */
2840 rc = hdev->asic_funcs->set_dram_properties(hdev);
2841 if (rc)
2842 goto free_qprops;
2843
2844 prop->mmu_pgt_size = PMMU_PAGE_TABLES_SIZE;
2845
2846 prop->pmmu.pgt_size = prop->mmu_pgt_size;
2847 hdev->pmmu_huge_range = true;
2848 prop->pmmu.host_resident = 1;
2849 prop->pmmu.num_hops = MMU_ARCH_6_HOPS;
2850 prop->pmmu.last_mask = LAST_MASK;
2851 prop->pmmu.hop_table_size = HOP_TABLE_SIZE_512_PTE;
2852 prop->pmmu.hop0_tables_total_size = HOP_TABLE_SIZE_512_PTE * prop->max_asid;
2853
2854 prop->hints_host_reserved_va_range.start_addr = RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START;
2855 prop->hints_host_reserved_va_range.end_addr = RESERVED_VA_RANGE_FOR_ARC_ON_HOST_END;
2856 prop->hints_host_hpage_reserved_va_range.start_addr =
2857 RESERVED_VA_RANGE_FOR_ARC_ON_HOST_HPAGE_START;
2858 prop->hints_host_hpage_reserved_va_range.end_addr =
2859 RESERVED_VA_RANGE_FOR_ARC_ON_HOST_HPAGE_END;
2860
2861 if (PAGE_SIZE == SZ_64K) {
2862 prop->pmmu.hop_shifts[MMU_HOP0] = HOP0_SHIFT_64K;
2863 prop->pmmu.hop_shifts[MMU_HOP1] = HOP1_SHIFT_64K;
2864 prop->pmmu.hop_shifts[MMU_HOP2] = HOP2_SHIFT_64K;
2865 prop->pmmu.hop_shifts[MMU_HOP3] = HOP3_SHIFT_64K;
2866 prop->pmmu.hop_shifts[MMU_HOP4] = HOP4_SHIFT_64K;
2867 prop->pmmu.hop_shifts[MMU_HOP5] = HOP5_SHIFT_64K;
2868 prop->pmmu.hop_masks[MMU_HOP0] = HOP0_MASK_64K;
2869 prop->pmmu.hop_masks[MMU_HOP1] = HOP1_MASK_64K;
2870 prop->pmmu.hop_masks[MMU_HOP2] = HOP2_MASK_64K;
2871 prop->pmmu.hop_masks[MMU_HOP3] = HOP3_MASK_64K;
2872 prop->pmmu.hop_masks[MMU_HOP4] = HOP4_MASK_64K;
2873 prop->pmmu.hop_masks[MMU_HOP5] = HOP5_MASK_64K;
2874 prop->pmmu.start_addr = VA_HOST_SPACE_PAGE_START;
2875 prop->pmmu.end_addr = VA_HOST_SPACE_PAGE_END;
2876 prop->pmmu.page_size = PAGE_SIZE_64KB;
2877
2878 /* shifts and masks are the same in PMMU and HPMMU */
2879 memcpy(&prop->pmmu_huge, &prop->pmmu, sizeof(prop->pmmu));
2880 prop->pmmu_huge.page_size = PAGE_SIZE_16MB;
2881 prop->pmmu_huge.start_addr = VA_HOST_SPACE_HPAGE_START;
2882 prop->pmmu_huge.end_addr = VA_HOST_SPACE_HPAGE_END;
2883 } else {
2884 prop->pmmu.hop_shifts[MMU_HOP0] = HOP0_SHIFT_4K;
2885 prop->pmmu.hop_shifts[MMU_HOP1] = HOP1_SHIFT_4K;
2886 prop->pmmu.hop_shifts[MMU_HOP2] = HOP2_SHIFT_4K;
2887 prop->pmmu.hop_shifts[MMU_HOP3] = HOP3_SHIFT_4K;
2888 prop->pmmu.hop_shifts[MMU_HOP4] = HOP4_SHIFT_4K;
2889 prop->pmmu.hop_shifts[MMU_HOP5] = HOP5_SHIFT_4K;
2890 prop->pmmu.hop_masks[MMU_HOP0] = HOP0_MASK_4K;
2891 prop->pmmu.hop_masks[MMU_HOP1] = HOP1_MASK_4K;
2892 prop->pmmu.hop_masks[MMU_HOP2] = HOP2_MASK_4K;
2893 prop->pmmu.hop_masks[MMU_HOP3] = HOP3_MASK_4K;
2894 prop->pmmu.hop_masks[MMU_HOP4] = HOP4_MASK_4K;
2895 prop->pmmu.hop_masks[MMU_HOP5] = HOP5_MASK_4K;
2896 prop->pmmu.start_addr = VA_HOST_SPACE_PAGE_START;
2897 prop->pmmu.end_addr = VA_HOST_SPACE_PAGE_END;
2898 prop->pmmu.page_size = PAGE_SIZE_4KB;
2899
2900 /* shifts and masks are the same in PMMU and HPMMU */
2901 memcpy(&prop->pmmu_huge, &prop->pmmu, sizeof(prop->pmmu));
2902 prop->pmmu_huge.page_size = PAGE_SIZE_2MB;
2903 prop->pmmu_huge.start_addr = VA_HOST_SPACE_HPAGE_START;
2904 prop->pmmu_huge.end_addr = VA_HOST_SPACE_HPAGE_END;
2905 }
2906
2907 prop->max_num_of_engines = GAUDI2_ENGINE_ID_SIZE;
2908 prop->num_engine_cores = CPU_ID_MAX;
2909 prop->cfg_size = CFG_SIZE;
2910 prop->num_of_events = GAUDI2_EVENT_SIZE;
2911
2912 prop->supports_engine_modes = true;
2913
2914 prop->dc_power_default = DC_POWER_DEFAULT;
2915
2916 prop->cb_pool_cb_cnt = GAUDI2_CB_POOL_CB_CNT;
2917 prop->cb_pool_cb_size = GAUDI2_CB_POOL_CB_SIZE;
2918 prop->pcie_dbi_base_address = CFG_BASE + mmPCIE_DBI_BASE;
2919 prop->pcie_aux_dbi_reg_addr = CFG_BASE + mmPCIE_AUX_DBI;
2920
2921 strscpy_pad(prop->cpucp_info.card_name, GAUDI2_DEFAULT_CARD_NAME, CARD_NAME_MAX_LEN);
2922
2923 prop->mme_master_slave_mode = 1;
2924
2925 prop->first_available_user_sob[0] = GAUDI2_RESERVED_SOB_NUMBER +
2926 (num_sync_stream_queues * HL_RSVD_SOBS);
2927
2928 prop->first_available_user_mon[0] = GAUDI2_RESERVED_MON_NUMBER +
2929 (num_sync_stream_queues * HL_RSVD_MONS);
2930
2931 prop->first_available_user_interrupt = GAUDI2_IRQ_NUM_USER_FIRST;
2932 prop->tpc_interrupt_id = GAUDI2_IRQ_NUM_TPC_ASSERT;
2933 prop->eq_interrupt_id = GAUDI2_IRQ_NUM_EVENT_QUEUE;
2934
2935 prop->first_available_cq[0] = GAUDI2_RESERVED_CQ_NUMBER;
2936
2937 prop->fw_cpu_boot_dev_sts0_valid = false;
2938 prop->fw_cpu_boot_dev_sts1_valid = false;
2939 prop->hard_reset_done_by_fw = false;
2940 prop->gic_interrupts_enable = true;
2941
2942 prop->server_type = HL_SERVER_TYPE_UNKNOWN;
2943
2944 prop->max_dec = NUMBER_OF_DEC;
2945
2946 prop->clk_pll_index = HL_GAUDI2_MME_PLL;
2947
2948 prop->dma_mask = 64;
2949
2950 prop->hbw_flush_reg = mmPCIE_WRAP_SPECIAL_GLBL_SPARE_0;
2951
2952 prop->supports_advanced_cpucp_rc = true;
2953
2954 return 0;
2955
2956 free_qprops:
2957 kfree(prop->hw_queues_props);
2958 return rc;
2959 }
2960
gaudi2_pci_bars_map(struct hl_device * hdev)2961 static int gaudi2_pci_bars_map(struct hl_device *hdev)
2962 {
2963 static const char * const name[] = {"CFG_SRAM", "MSIX", "DRAM"};
2964 bool is_wc[3] = {false, false, true};
2965 int rc;
2966
2967 rc = hl_pci_bars_map(hdev, name, is_wc);
2968 if (rc)
2969 return rc;
2970
2971 hdev->rmmio = hdev->pcie_bar[SRAM_CFG_BAR_ID] + (CFG_BASE - STM_FLASH_BASE_ADDR);
2972
2973 return 0;
2974 }
2975
gaudi2_set_hbm_bar_base(struct hl_device * hdev,u64 addr)2976 static u64 gaudi2_set_hbm_bar_base(struct hl_device *hdev, u64 addr)
2977 {
2978 struct gaudi2_device *gaudi2 = hdev->asic_specific;
2979 struct hl_inbound_pci_region pci_region;
2980 u64 old_addr = addr;
2981 int rc;
2982
2983 if ((gaudi2) && (gaudi2->dram_bar_cur_addr == addr))
2984 return old_addr;
2985
2986 if (hdev->asic_prop.iatu_done_by_fw)
2987 return U64_MAX;
2988
2989 /* Inbound Region 2 - Bar 4 - Point to DRAM */
2990 pci_region.mode = PCI_BAR_MATCH_MODE;
2991 pci_region.bar = DRAM_BAR_ID;
2992 pci_region.addr = addr;
2993 rc = hl_pci_set_inbound_region(hdev, 2, &pci_region);
2994 if (rc)
2995 return U64_MAX;
2996
2997 if (gaudi2) {
2998 old_addr = gaudi2->dram_bar_cur_addr;
2999 gaudi2->dram_bar_cur_addr = addr;
3000 }
3001
3002 return old_addr;
3003 }
3004
gaudi2_init_iatu(struct hl_device * hdev)3005 static int gaudi2_init_iatu(struct hl_device *hdev)
3006 {
3007 struct hl_inbound_pci_region inbound_region;
3008 struct hl_outbound_pci_region outbound_region;
3009 u32 bar_addr_low, bar_addr_high;
3010 int rc;
3011
3012 if (hdev->asic_prop.iatu_done_by_fw)
3013 return 0;
3014
3015 /* Temporary inbound Region 0 - Bar 0 - Point to CFG
3016 * We must map this region in BAR match mode in order to
3017 * fetch BAR physical base address
3018 */
3019 inbound_region.mode = PCI_BAR_MATCH_MODE;
3020 inbound_region.bar = SRAM_CFG_BAR_ID;
3021 /* Base address must be aligned to Bar size which is 256 MB */
3022 inbound_region.addr = STM_FLASH_BASE_ADDR - STM_FLASH_ALIGNED_OFF;
3023 rc = hl_pci_set_inbound_region(hdev, 0, &inbound_region);
3024 if (rc)
3025 return rc;
3026
3027 /* Fetch physical BAR address */
3028 bar_addr_high = RREG32(mmPCIE_DBI_BAR1_REG + STM_FLASH_ALIGNED_OFF);
3029 bar_addr_low = RREG32(mmPCIE_DBI_BAR0_REG + STM_FLASH_ALIGNED_OFF) & ~0xF;
3030
3031 hdev->pcie_bar_phys[SRAM_CFG_BAR_ID] = (u64)bar_addr_high << 32 | bar_addr_low;
3032
3033 /* Inbound Region 0 - Bar 0 - Point to CFG */
3034 inbound_region.mode = PCI_ADDRESS_MATCH_MODE;
3035 inbound_region.bar = SRAM_CFG_BAR_ID;
3036 inbound_region.offset_in_bar = 0;
3037 inbound_region.addr = STM_FLASH_BASE_ADDR;
3038 inbound_region.size = CFG_REGION_SIZE;
3039 rc = hl_pci_set_inbound_region(hdev, 0, &inbound_region);
3040 if (rc)
3041 return rc;
3042
3043 /* Inbound Region 1 - Bar 0 - Point to BAR0_RESERVED + SRAM */
3044 inbound_region.mode = PCI_ADDRESS_MATCH_MODE;
3045 inbound_region.bar = SRAM_CFG_BAR_ID;
3046 inbound_region.offset_in_bar = CFG_REGION_SIZE;
3047 inbound_region.addr = BAR0_RSRVD_BASE_ADDR;
3048 inbound_region.size = BAR0_RSRVD_SIZE + SRAM_SIZE;
3049 rc = hl_pci_set_inbound_region(hdev, 1, &inbound_region);
3050 if (rc)
3051 return rc;
3052
3053 /* Inbound Region 2 - Bar 4 - Point to DRAM */
3054 inbound_region.mode = PCI_BAR_MATCH_MODE;
3055 inbound_region.bar = DRAM_BAR_ID;
3056 inbound_region.addr = DRAM_PHYS_BASE;
3057 rc = hl_pci_set_inbound_region(hdev, 2, &inbound_region);
3058 if (rc)
3059 return rc;
3060
3061 /* Outbound Region 0 - Point to Host */
3062 outbound_region.addr = HOST_PHYS_BASE_0;
3063 outbound_region.size = HOST_PHYS_SIZE_0;
3064 rc = hl_pci_set_outbound_region(hdev, &outbound_region);
3065
3066 return rc;
3067 }
3068
gaudi2_get_hw_state(struct hl_device * hdev)3069 static enum hl_device_hw_state gaudi2_get_hw_state(struct hl_device *hdev)
3070 {
3071 return RREG32(mmHW_STATE);
3072 }
3073
gaudi2_tpc_binning_init_prop(struct hl_device * hdev)3074 static int gaudi2_tpc_binning_init_prop(struct hl_device *hdev)
3075 {
3076 struct asic_fixed_properties *prop = &hdev->asic_prop;
3077
3078 /*
3079 * check for error condition in which number of binning candidates
3080 * is higher than the maximum supported by the driver
3081 */
3082 if (hweight64(hdev->tpc_binning) > MAX_CLUSTER_BINNING_FAULTY_TPCS) {
3083 dev_err(hdev->dev, "TPC binning is supported for max of %d faulty TPCs, provided mask 0x%llx\n",
3084 MAX_CLUSTER_BINNING_FAULTY_TPCS,
3085 hdev->tpc_binning);
3086 return -EINVAL;
3087 }
3088
3089 prop->tpc_binning_mask = hdev->tpc_binning;
3090 prop->tpc_enabled_mask = GAUDI2_TPC_FULL_MASK;
3091
3092 return 0;
3093 }
3094
gaudi2_set_tpc_binning_masks(struct hl_device * hdev)3095 static int gaudi2_set_tpc_binning_masks(struct hl_device *hdev)
3096 {
3097 struct asic_fixed_properties *prop = &hdev->asic_prop;
3098 struct hw_queue_properties *q_props = prop->hw_queues_props;
3099 u64 tpc_binning_mask;
3100 u8 subst_idx = 0;
3101 int i, rc;
3102
3103 rc = gaudi2_tpc_binning_init_prop(hdev);
3104 if (rc)
3105 return rc;
3106
3107 tpc_binning_mask = prop->tpc_binning_mask;
3108
3109 for (i = 0 ; i < MAX_FAULTY_TPCS ; i++) {
3110 u8 subst_seq, binned, qid_base;
3111
3112 if (tpc_binning_mask == 0)
3113 break;
3114
3115 if (subst_idx == 0) {
3116 subst_seq = TPC_ID_DCORE0_TPC6;
3117 qid_base = GAUDI2_QUEUE_ID_DCORE0_TPC_6_0;
3118 } else {
3119 subst_seq = TPC_ID_DCORE3_TPC5;
3120 qid_base = GAUDI2_QUEUE_ID_DCORE3_TPC_5_0;
3121 }
3122
3123
3124 /* clear bit from mask */
3125 binned = __ffs(tpc_binning_mask);
3126 /*
3127 * Coverity complains about possible out-of-bound access in
3128 * clear_bit
3129 */
3130 if (binned >= TPC_ID_SIZE) {
3131 dev_err(hdev->dev,
3132 "Invalid binned TPC (binning mask: %llx)\n",
3133 tpc_binning_mask);
3134 return -EINVAL;
3135 }
3136 clear_bit(binned, (unsigned long *)&tpc_binning_mask);
3137
3138 /* also clear replacing TPC bit from enabled mask */
3139 clear_bit(subst_seq, (unsigned long *)&prop->tpc_enabled_mask);
3140
3141 /* bin substite TPC's Qs */
3142 q_props[qid_base].binned = 1;
3143 q_props[qid_base + 1].binned = 1;
3144 q_props[qid_base + 2].binned = 1;
3145 q_props[qid_base + 3].binned = 1;
3146
3147 subst_idx++;
3148 }
3149
3150 return 0;
3151 }
3152
gaudi2_set_dec_binning_masks(struct hl_device * hdev)3153 static int gaudi2_set_dec_binning_masks(struct hl_device *hdev)
3154 {
3155 struct asic_fixed_properties *prop = &hdev->asic_prop;
3156 u8 num_faulty;
3157
3158 num_faulty = hweight32(hdev->decoder_binning);
3159
3160 /*
3161 * check for error condition in which number of binning candidates
3162 * is higher than the maximum supported by the driver
3163 */
3164 if (num_faulty > MAX_FAULTY_DECODERS) {
3165 dev_err(hdev->dev, "decoder binning is supported for max of single faulty decoder, provided mask 0x%x\n",
3166 hdev->decoder_binning);
3167 return -EINVAL;
3168 }
3169
3170 prop->decoder_binning_mask = (hdev->decoder_binning & GAUDI2_DECODER_FULL_MASK);
3171
3172 if (prop->decoder_binning_mask)
3173 prop->decoder_enabled_mask = (GAUDI2_DECODER_FULL_MASK & ~BIT(DEC_ID_PCIE_VDEC1));
3174 else
3175 prop->decoder_enabled_mask = GAUDI2_DECODER_FULL_MASK;
3176
3177 return 0;
3178 }
3179
gaudi2_set_dram_binning_masks(struct hl_device * hdev)3180 static void gaudi2_set_dram_binning_masks(struct hl_device *hdev)
3181 {
3182 struct asic_fixed_properties *prop = &hdev->asic_prop;
3183
3184 /* check if we should override default binning */
3185 if (!hdev->dram_binning) {
3186 prop->dram_binning_mask = 0;
3187 prop->dram_enabled_mask = GAUDI2_DRAM_FULL_MASK;
3188 return;
3189 }
3190
3191 /* set DRAM binning constraints */
3192 prop->faulty_dram_cluster_map |= hdev->dram_binning;
3193 prop->dram_binning_mask = hdev->dram_binning;
3194 prop->dram_enabled_mask = GAUDI2_DRAM_FULL_MASK & ~BIT(HBM_ID5);
3195 }
3196
gaudi2_set_edma_binning_masks(struct hl_device * hdev)3197 static int gaudi2_set_edma_binning_masks(struct hl_device *hdev)
3198 {
3199 struct asic_fixed_properties *prop = &hdev->asic_prop;
3200 struct hw_queue_properties *q_props;
3201 u8 seq, num_faulty;
3202
3203 num_faulty = hweight32(hdev->edma_binning);
3204
3205 /*
3206 * check for error condition in which number of binning candidates
3207 * is higher than the maximum supported by the driver
3208 */
3209 if (num_faulty > MAX_FAULTY_EDMAS) {
3210 dev_err(hdev->dev,
3211 "EDMA binning is supported for max of single faulty EDMA, provided mask 0x%x\n",
3212 hdev->edma_binning);
3213 return -EINVAL;
3214 }
3215
3216 if (!hdev->edma_binning) {
3217 prop->edma_binning_mask = 0;
3218 prop->edma_enabled_mask = GAUDI2_EDMA_FULL_MASK;
3219 return 0;
3220 }
3221
3222 seq = __ffs((unsigned long)hdev->edma_binning);
3223
3224 /* set binning constraints */
3225 prop->faulty_dram_cluster_map |= BIT(edma_to_hbm_cluster[seq]);
3226 prop->edma_binning_mask = hdev->edma_binning;
3227 prop->edma_enabled_mask = GAUDI2_EDMA_FULL_MASK & ~BIT(EDMA_ID_DCORE3_INSTANCE1);
3228
3229 /* bin substitute EDMA's queue */
3230 q_props = prop->hw_queues_props;
3231 q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0].binned = 1;
3232 q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1].binned = 1;
3233 q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2].binned = 1;
3234 q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3].binned = 1;
3235
3236 return 0;
3237 }
3238
gaudi2_set_xbar_edge_enable_mask(struct hl_device * hdev,u32 xbar_edge_iso_mask)3239 static int gaudi2_set_xbar_edge_enable_mask(struct hl_device *hdev, u32 xbar_edge_iso_mask)
3240 {
3241 struct asic_fixed_properties *prop = &hdev->asic_prop;
3242 u8 num_faulty, seq;
3243
3244 /* check if we should override default binning */
3245 if (!xbar_edge_iso_mask) {
3246 prop->xbar_edge_enabled_mask = GAUDI2_XBAR_EDGE_FULL_MASK;
3247 return 0;
3248 }
3249
3250 /*
3251 * note that it can be set to value other than 0 only after cpucp packet (i.e.
3252 * only the FW can set a redundancy value). for user it'll always be 0.
3253 */
3254 num_faulty = hweight32(xbar_edge_iso_mask);
3255
3256 /*
3257 * check for error condition in which number of binning candidates
3258 * is higher than the maximum supported by the driver
3259 */
3260 if (num_faulty > MAX_FAULTY_XBARS) {
3261 dev_err(hdev->dev, "we cannot have more than %d faulty XBAR EDGE\n",
3262 MAX_FAULTY_XBARS);
3263 return -EINVAL;
3264 }
3265
3266 seq = __ffs((unsigned long)xbar_edge_iso_mask);
3267
3268 /* set binning constraints */
3269 prop->faulty_dram_cluster_map |= BIT(xbar_edge_to_hbm_cluster[seq]);
3270 prop->xbar_edge_enabled_mask = (~xbar_edge_iso_mask) & GAUDI2_XBAR_EDGE_FULL_MASK;
3271
3272 return 0;
3273 }
3274
gaudi2_set_cluster_binning_masks_common(struct hl_device * hdev,u8 xbar_edge_iso_mask)3275 static int gaudi2_set_cluster_binning_masks_common(struct hl_device *hdev, u8 xbar_edge_iso_mask)
3276 {
3277 int rc;
3278
3279 /*
3280 * mark all clusters as good, each component will "fail" cluster
3281 * based on eFuse/user values.
3282 * If more than single cluster is faulty- the chip is unusable
3283 */
3284 hdev->asic_prop.faulty_dram_cluster_map = 0;
3285
3286 gaudi2_set_dram_binning_masks(hdev);
3287
3288 rc = gaudi2_set_edma_binning_masks(hdev);
3289 if (rc)
3290 return rc;
3291
3292 rc = gaudi2_set_xbar_edge_enable_mask(hdev, xbar_edge_iso_mask);
3293 if (rc)
3294 return rc;
3295
3296
3297 /* always initially set to full mask */
3298 hdev->asic_prop.hmmu_hif_enabled_mask = GAUDI2_HIF_HMMU_FULL_MASK;
3299
3300 return 0;
3301 }
3302
gaudi2_set_cluster_binning_masks(struct hl_device * hdev)3303 static int gaudi2_set_cluster_binning_masks(struct hl_device *hdev)
3304 {
3305 struct asic_fixed_properties *prop = &hdev->asic_prop;
3306 int rc;
3307
3308 rc = gaudi2_set_cluster_binning_masks_common(hdev, prop->cpucp_info.xbar_binning_mask);
3309 if (rc)
3310 return rc;
3311
3312 /* if we have DRAM binning reported by FW we should perform cluster config */
3313 if (prop->faulty_dram_cluster_map) {
3314 u8 cluster_seq = __ffs((unsigned long)prop->faulty_dram_cluster_map);
3315
3316 prop->hmmu_hif_enabled_mask = cluster_hmmu_hif_enabled_mask[cluster_seq];
3317 }
3318
3319 return 0;
3320 }
3321
gaudi2_set_binning_masks(struct hl_device * hdev)3322 static int gaudi2_set_binning_masks(struct hl_device *hdev)
3323 {
3324 int rc;
3325
3326 rc = gaudi2_set_cluster_binning_masks(hdev);
3327 if (rc)
3328 return rc;
3329
3330 rc = gaudi2_set_tpc_binning_masks(hdev);
3331 if (rc)
3332 return rc;
3333
3334 rc = gaudi2_set_dec_binning_masks(hdev);
3335 if (rc)
3336 return rc;
3337
3338 return 0;
3339 }
3340
gaudi2_cpucp_info_get(struct hl_device * hdev)3341 static int gaudi2_cpucp_info_get(struct hl_device *hdev)
3342 {
3343 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3344 struct asic_fixed_properties *prop = &hdev->asic_prop;
3345 long max_power;
3346 u64 dram_size;
3347 int rc;
3348
3349 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))
3350 return 0;
3351
3352 /* No point of asking this information again when not doing hard reset, as the device
3353 * CPU hasn't been reset
3354 */
3355 if (hdev->reset_info.in_compute_reset)
3356 return 0;
3357
3358 rc = hl_fw_cpucp_handshake(hdev, mmCPU_BOOT_DEV_STS0, mmCPU_BOOT_DEV_STS1, mmCPU_BOOT_ERR0,
3359 mmCPU_BOOT_ERR1);
3360 if (rc)
3361 return rc;
3362
3363 dram_size = le64_to_cpu(prop->cpucp_info.dram_size);
3364 if (dram_size) {
3365 /* we can have wither 5 or 6 HBMs. other values are invalid */
3366
3367 if ((dram_size != ((GAUDI2_HBM_NUM - 1) * SZ_16G)) &&
3368 (dram_size != (GAUDI2_HBM_NUM * SZ_16G))) {
3369 dev_err(hdev->dev,
3370 "F/W reported invalid DRAM size %llu. Trying to use default size %llu\n",
3371 dram_size, prop->dram_size);
3372 dram_size = prop->dram_size;
3373 }
3374
3375 prop->dram_size = dram_size;
3376 prop->dram_end_address = prop->dram_base_address + dram_size;
3377 }
3378
3379 if (!strlen(prop->cpucp_info.card_name))
3380 strscpy_pad(prop->cpucp_info.card_name, GAUDI2_DEFAULT_CARD_NAME,
3381 CARD_NAME_MAX_LEN);
3382
3383 /* Overwrite binning masks with the actual binning values from F/W */
3384 hdev->dram_binning = prop->cpucp_info.dram_binning_mask;
3385 hdev->edma_binning = prop->cpucp_info.edma_binning_mask;
3386 hdev->tpc_binning = le64_to_cpu(prop->cpucp_info.tpc_binning_mask);
3387 hdev->decoder_binning = lower_32_bits(le64_to_cpu(prop->cpucp_info.decoder_binning_mask));
3388
3389 dev_dbg(hdev->dev, "Read binning masks: tpc: 0x%llx, dram: 0x%llx, edma: 0x%x, dec: 0x%x\n",
3390 hdev->tpc_binning, hdev->dram_binning, hdev->edma_binning,
3391 hdev->decoder_binning);
3392
3393 /*
3394 * at this point the DRAM parameters need to be updated according to data obtained
3395 * from the FW
3396 */
3397 rc = hdev->asic_funcs->set_dram_properties(hdev);
3398 if (rc)
3399 return rc;
3400
3401 rc = hdev->asic_funcs->set_binning_masks(hdev);
3402 if (rc)
3403 return rc;
3404
3405 max_power = hl_fw_get_max_power(hdev);
3406 if (max_power < 0)
3407 return max_power;
3408
3409 prop->max_power_default = (u64) max_power;
3410
3411 return 0;
3412 }
3413
gaudi2_fetch_psoc_frequency(struct hl_device * hdev)3414 static int gaudi2_fetch_psoc_frequency(struct hl_device *hdev)
3415 {
3416 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3417 u16 pll_freq_arr[HL_PLL_NUM_OUTPUTS];
3418 int rc;
3419
3420 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))
3421 return 0;
3422
3423 rc = hl_fw_cpucp_pll_info_get(hdev, HL_GAUDI2_CPU_PLL, pll_freq_arr);
3424 if (rc)
3425 return rc;
3426
3427 hdev->asic_prop.psoc_timestamp_frequency = pll_freq_arr[3];
3428
3429 return 0;
3430 }
3431
gaudi2_mmu_clear_pgt_range(struct hl_device * hdev)3432 static int gaudi2_mmu_clear_pgt_range(struct hl_device *hdev)
3433 {
3434 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3435 struct asic_fixed_properties *prop = &hdev->asic_prop;
3436 int rc;
3437
3438 if (!(gaudi2->hw_cap_initialized & HW_CAP_MMU_MASK))
3439 return 0;
3440
3441 if (prop->dmmu.host_resident)
3442 return 0;
3443
3444 rc = gaudi2_memset_device_memory(hdev, prop->mmu_pgt_addr, prop->dmmu.pgt_size, 0);
3445 if (rc)
3446 dev_err(hdev->dev, "Failed to clear mmu pgt");
3447
3448 return rc;
3449 }
3450
gaudi2_early_init(struct hl_device * hdev)3451 static int gaudi2_early_init(struct hl_device *hdev)
3452 {
3453 struct asic_fixed_properties *prop = &hdev->asic_prop;
3454 struct pci_dev *pdev = hdev->pdev;
3455 resource_size_t pci_bar_size;
3456 int rc;
3457
3458 rc = gaudi2_set_fixed_properties(hdev);
3459 if (rc)
3460 return rc;
3461
3462 /* Check BAR sizes */
3463 pci_bar_size = pci_resource_len(pdev, SRAM_CFG_BAR_ID);
3464
3465 if (pci_bar_size != CFG_BAR_SIZE) {
3466 dev_err(hdev->dev, "Not " HL_NAME "? BAR %d size %pa, expecting %llu\n",
3467 SRAM_CFG_BAR_ID, &pci_bar_size, CFG_BAR_SIZE);
3468 rc = -ENODEV;
3469 goto free_queue_props;
3470 }
3471
3472 pci_bar_size = pci_resource_len(pdev, MSIX_BAR_ID);
3473 if (pci_bar_size != MSIX_BAR_SIZE) {
3474 dev_err(hdev->dev, "Not " HL_NAME "? BAR %d size %pa, expecting %llu\n",
3475 MSIX_BAR_ID, &pci_bar_size, MSIX_BAR_SIZE);
3476 rc = -ENODEV;
3477 goto free_queue_props;
3478 }
3479
3480 prop->dram_pci_bar_size = pci_resource_len(pdev, DRAM_BAR_ID);
3481 hdev->dram_pci_bar_start = pci_resource_start(pdev, DRAM_BAR_ID);
3482
3483 /*
3484 * Only in pldm driver config iATU
3485 */
3486 if (hdev->pldm)
3487 hdev->asic_prop.iatu_done_by_fw = false;
3488 else
3489 hdev->asic_prop.iatu_done_by_fw = true;
3490
3491 rc = hl_pci_init(hdev);
3492 if (rc)
3493 goto free_queue_props;
3494
3495 /* Before continuing in the initialization, we need to read the preboot
3496 * version to determine whether we run with a security-enabled firmware
3497 */
3498 rc = hl_fw_read_preboot_status(hdev);
3499 if (rc) {
3500 if (hdev->reset_on_preboot_fail)
3501 hdev->asic_funcs->hw_fini(hdev, true, false);
3502 goto pci_fini;
3503 }
3504
3505 if (gaudi2_get_hw_state(hdev) == HL_DEVICE_HW_STATE_DIRTY) {
3506 dev_dbg(hdev->dev, "H/W state is dirty, must reset before initializing\n");
3507 rc = hdev->asic_funcs->hw_fini(hdev, true, false);
3508 if (rc) {
3509 dev_err(hdev->dev, "failed to reset HW in dirty state (%d)\n", rc);
3510 goto pci_fini;
3511 }
3512
3513 rc = hl_fw_read_preboot_status(hdev);
3514 if (rc) {
3515 if (hdev->reset_on_preboot_fail)
3516 hdev->asic_funcs->hw_fini(hdev, true, false);
3517 goto pci_fini;
3518 }
3519 }
3520
3521 return 0;
3522
3523 pci_fini:
3524 hl_pci_fini(hdev);
3525 free_queue_props:
3526 kfree(hdev->asic_prop.hw_queues_props);
3527 return rc;
3528 }
3529
gaudi2_early_fini(struct hl_device * hdev)3530 static int gaudi2_early_fini(struct hl_device *hdev)
3531 {
3532 kfree(hdev->asic_prop.hw_queues_props);
3533 hl_pci_fini(hdev);
3534
3535 return 0;
3536 }
3537
gaudi2_is_arc_nic_owned(u64 arc_id)3538 static bool gaudi2_is_arc_nic_owned(u64 arc_id)
3539 {
3540 switch (arc_id) {
3541 case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:
3542 return true;
3543 default:
3544 return false;
3545 }
3546 }
3547
gaudi2_is_arc_tpc_owned(u64 arc_id)3548 static bool gaudi2_is_arc_tpc_owned(u64 arc_id)
3549 {
3550 switch (arc_id) {
3551 case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:
3552 return true;
3553 default:
3554 return false;
3555 }
3556 }
3557
gaudi2_init_arcs(struct hl_device * hdev)3558 static void gaudi2_init_arcs(struct hl_device *hdev)
3559 {
3560 struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
3561 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3562 u64 arc_id;
3563 u32 i;
3564
3565 for (i = CPU_ID_SCHED_ARC0 ; i <= CPU_ID_SCHED_ARC3 ; i++) {
3566 if (gaudi2_is_arc_enabled(hdev, i))
3567 continue;
3568
3569 gaudi2_set_arc_id_cap(hdev, i);
3570 }
3571
3572 for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ ; i += 4) {
3573 if (!gaudi2_is_queue_enabled(hdev, i))
3574 continue;
3575
3576 arc_id = gaudi2_queue_id_to_arc_id[i];
3577 if (gaudi2_is_arc_enabled(hdev, arc_id))
3578 continue;
3579
3580 if (gaudi2_is_arc_nic_owned(arc_id) &&
3581 !(hdev->nic_ports_mask & BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0)))
3582 continue;
3583
3584 if (gaudi2_is_arc_tpc_owned(arc_id) && !(gaudi2->tpc_hw_cap_initialized &
3585 BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0)))
3586 continue;
3587
3588 gaudi2_set_arc_id_cap(hdev, arc_id);
3589 }
3590
3591 /* Fetch ARC scratchpad address */
3592 hdev->asic_prop.engine_core_interrupt_reg_addr =
3593 CFG_BASE + le32_to_cpu(dyn_regs->eng_arc_irq_ctrl);
3594 }
3595
gaudi2_scrub_arc_dccm(struct hl_device * hdev,u32 cpu_id)3596 static int gaudi2_scrub_arc_dccm(struct hl_device *hdev, u32 cpu_id)
3597 {
3598 u32 reg_base, reg_val;
3599 int rc;
3600
3601 switch (cpu_id) {
3602 case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC3:
3603 /* Each ARC scheduler has 2 consecutive DCCM blocks */
3604 rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],
3605 ARC_DCCM_BLOCK_SIZE * 2, true);
3606 if (rc)
3607 return rc;
3608 break;
3609 case CPU_ID_SCHED_ARC4:
3610 case CPU_ID_SCHED_ARC5:
3611 case CPU_ID_MME_QMAN_ARC0:
3612 case CPU_ID_MME_QMAN_ARC1:
3613 reg_base = gaudi2_arc_blocks_bases[cpu_id];
3614
3615 /* Scrub lower DCCM block */
3616 rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],
3617 ARC_DCCM_BLOCK_SIZE, true);
3618 if (rc)
3619 return rc;
3620
3621 /* Switch to upper DCCM block */
3622 reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_MME_ARC_UPPER_DCCM_EN_VAL_MASK, 1);
3623 WREG32(reg_base + ARC_DCCM_UPPER_EN_OFFSET, reg_val);
3624
3625 /* Scrub upper DCCM block */
3626 rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],
3627 ARC_DCCM_BLOCK_SIZE, true);
3628 if (rc)
3629 return rc;
3630
3631 /* Switch to lower DCCM block */
3632 reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_MME_ARC_UPPER_DCCM_EN_VAL_MASK, 0);
3633 WREG32(reg_base + ARC_DCCM_UPPER_EN_OFFSET, reg_val);
3634 break;
3635 default:
3636 rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],
3637 ARC_DCCM_BLOCK_SIZE, true);
3638 if (rc)
3639 return rc;
3640 }
3641
3642 return 0;
3643 }
3644
gaudi2_scrub_arcs_dccm(struct hl_device * hdev)3645 static int gaudi2_scrub_arcs_dccm(struct hl_device *hdev)
3646 {
3647 u16 arc_id;
3648 int rc;
3649
3650 for (arc_id = CPU_ID_SCHED_ARC0 ; arc_id < CPU_ID_MAX ; arc_id++) {
3651 if (!gaudi2_is_arc_enabled(hdev, arc_id))
3652 continue;
3653
3654 rc = gaudi2_scrub_arc_dccm(hdev, arc_id);
3655 if (rc)
3656 return rc;
3657 }
3658
3659 return 0;
3660 }
3661
gaudi2_late_init(struct hl_device * hdev)3662 static int gaudi2_late_init(struct hl_device *hdev)
3663 {
3664 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3665 int rc;
3666
3667 rc = hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_ENABLE_PCI_ACCESS,
3668 gaudi2->virt_msix_db_dma_addr);
3669 if (rc)
3670 return rc;
3671
3672 rc = gaudi2_fetch_psoc_frequency(hdev);
3673 if (rc) {
3674 dev_err(hdev->dev, "Failed to fetch psoc frequency\n");
3675 goto disable_pci_access;
3676 }
3677
3678 rc = gaudi2_mmu_clear_pgt_range(hdev);
3679 if (rc) {
3680 dev_err(hdev->dev, "Failed to clear MMU page tables range\n");
3681 goto disable_pci_access;
3682 }
3683
3684 gaudi2_init_arcs(hdev);
3685
3686 rc = gaudi2_scrub_arcs_dccm(hdev);
3687 if (rc) {
3688 dev_err(hdev->dev, "Failed to scrub arcs DCCM\n");
3689 goto disable_pci_access;
3690 }
3691
3692 gaudi2_init_security(hdev);
3693
3694 return 0;
3695
3696 disable_pci_access:
3697 hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_DISABLE_PCI_ACCESS, 0x0);
3698
3699 return rc;
3700 }
3701
gaudi2_late_fini(struct hl_device * hdev)3702 static void gaudi2_late_fini(struct hl_device *hdev)
3703 {
3704 hl_hwmon_release_resources(hdev);
3705 }
3706
gaudi2_user_mapped_dec_init(struct gaudi2_device * gaudi2,u32 start_idx)3707 static void gaudi2_user_mapped_dec_init(struct gaudi2_device *gaudi2, u32 start_idx)
3708 {
3709 struct user_mapped_block *blocks = gaudi2->mapped_blocks;
3710
3711 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE0_DEC0_CMD_BASE, HL_BLOCK_SIZE);
3712 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE0_DEC1_CMD_BASE, HL_BLOCK_SIZE);
3713 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE1_DEC0_CMD_BASE, HL_BLOCK_SIZE);
3714 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE1_DEC1_CMD_BASE, HL_BLOCK_SIZE);
3715 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE2_DEC0_CMD_BASE, HL_BLOCK_SIZE);
3716 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE2_DEC1_CMD_BASE, HL_BLOCK_SIZE);
3717 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE3_DEC0_CMD_BASE, HL_BLOCK_SIZE);
3718 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE3_DEC1_CMD_BASE, HL_BLOCK_SIZE);
3719 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmPCIE_DEC0_CMD_BASE, HL_BLOCK_SIZE);
3720 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx], mmPCIE_DEC1_CMD_BASE, HL_BLOCK_SIZE);
3721 }
3722
gaudi2_user_mapped_blocks_init(struct hl_device * hdev)3723 static void gaudi2_user_mapped_blocks_init(struct hl_device *hdev)
3724 {
3725 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3726 struct user_mapped_block *blocks = gaudi2->mapped_blocks;
3727 u32 block_size, umr_start_idx, num_umr_blocks;
3728 int i;
3729
3730 for (i = 0 ; i < NUM_ARC_CPUS ; i++) {
3731 if (i >= CPU_ID_SCHED_ARC0 && i <= CPU_ID_SCHED_ARC3)
3732 block_size = ARC_DCCM_BLOCK_SIZE * 2;
3733 else
3734 block_size = ARC_DCCM_BLOCK_SIZE;
3735
3736 blocks[i].address = gaudi2_arc_dccm_bases[i];
3737 blocks[i].size = block_size;
3738 }
3739
3740 blocks[NUM_ARC_CPUS].address = mmARC_FARM_ARC0_ACP_ENG_BASE;
3741 blocks[NUM_ARC_CPUS].size = HL_BLOCK_SIZE;
3742
3743 blocks[NUM_ARC_CPUS + 1].address = mmARC_FARM_ARC1_ACP_ENG_BASE;
3744 blocks[NUM_ARC_CPUS + 1].size = HL_BLOCK_SIZE;
3745
3746 blocks[NUM_ARC_CPUS + 2].address = mmARC_FARM_ARC2_ACP_ENG_BASE;
3747 blocks[NUM_ARC_CPUS + 2].size = HL_BLOCK_SIZE;
3748
3749 blocks[NUM_ARC_CPUS + 3].address = mmARC_FARM_ARC3_ACP_ENG_BASE;
3750 blocks[NUM_ARC_CPUS + 3].size = HL_BLOCK_SIZE;
3751
3752 blocks[NUM_ARC_CPUS + 4].address = mmDCORE0_MME_QM_ARC_ACP_ENG_BASE;
3753 blocks[NUM_ARC_CPUS + 4].size = HL_BLOCK_SIZE;
3754
3755 blocks[NUM_ARC_CPUS + 5].address = mmDCORE1_MME_QM_ARC_ACP_ENG_BASE;
3756 blocks[NUM_ARC_CPUS + 5].size = HL_BLOCK_SIZE;
3757
3758 blocks[NUM_ARC_CPUS + 6].address = mmDCORE2_MME_QM_ARC_ACP_ENG_BASE;
3759 blocks[NUM_ARC_CPUS + 6].size = HL_BLOCK_SIZE;
3760
3761 blocks[NUM_ARC_CPUS + 7].address = mmDCORE3_MME_QM_ARC_ACP_ENG_BASE;
3762 blocks[NUM_ARC_CPUS + 7].size = HL_BLOCK_SIZE;
3763
3764 umr_start_idx = NUM_ARC_CPUS + NUM_OF_USER_ACP_BLOCKS;
3765 num_umr_blocks = NIC_NUMBER_OF_ENGINES * NUM_OF_USER_NIC_UMR_BLOCKS;
3766 for (i = 0 ; i < num_umr_blocks ; i++) {
3767 u8 nic_id, umr_block_id;
3768
3769 nic_id = i / NUM_OF_USER_NIC_UMR_BLOCKS;
3770 umr_block_id = i % NUM_OF_USER_NIC_UMR_BLOCKS;
3771
3772 blocks[umr_start_idx + i].address =
3773 mmNIC0_UMR0_0_UNSECURE_DOORBELL0_BASE +
3774 (nic_id / NIC_NUMBER_OF_QM_PER_MACRO) * NIC_OFFSET +
3775 (nic_id % NIC_NUMBER_OF_QM_PER_MACRO) * NIC_QM_OFFSET +
3776 umr_block_id * NIC_UMR_OFFSET;
3777 blocks[umr_start_idx + i].size = HL_BLOCK_SIZE;
3778 }
3779
3780 /* Expose decoder HW configuration block to user */
3781 gaudi2_user_mapped_dec_init(gaudi2, USR_MAPPED_BLK_DEC_START_IDX);
3782
3783 for (i = 1; i < NUM_OF_DCORES; ++i) {
3784 blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1)].size = SM_OBJS_BLOCK_SIZE;
3785 blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1) + 1].size = HL_BLOCK_SIZE;
3786
3787 blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1)].address =
3788 mmDCORE0_SYNC_MNGR_OBJS_BASE + i * DCORE_OFFSET;
3789
3790 blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1) + 1].address =
3791 mmDCORE0_SYNC_MNGR_GLBL_BASE + i * DCORE_OFFSET;
3792 }
3793 }
3794
gaudi2_alloc_cpu_accessible_dma_mem(struct hl_device * hdev)3795 static int gaudi2_alloc_cpu_accessible_dma_mem(struct hl_device *hdev)
3796 {
3797 dma_addr_t dma_addr_arr[GAUDI2_ALLOC_CPU_MEM_RETRY_CNT] = {}, end_addr;
3798 void *virt_addr_arr[GAUDI2_ALLOC_CPU_MEM_RETRY_CNT] = {};
3799 int i, j, rc = 0;
3800
3801 /* The device ARC works with 32-bits addresses, and because there is a single HW register
3802 * that holds the extension bits (49..28), these bits must be identical in all the allocated
3803 * range.
3804 */
3805
3806 for (i = 0 ; i < GAUDI2_ALLOC_CPU_MEM_RETRY_CNT ; i++) {
3807 virt_addr_arr[i] = hl_asic_dma_alloc_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE,
3808 &dma_addr_arr[i], GFP_KERNEL | __GFP_ZERO);
3809 if (!virt_addr_arr[i]) {
3810 rc = -ENOMEM;
3811 goto free_dma_mem_arr;
3812 }
3813
3814 end_addr = dma_addr_arr[i] + HL_CPU_ACCESSIBLE_MEM_SIZE - 1;
3815 if (GAUDI2_ARC_PCI_MSB_ADDR(dma_addr_arr[i]) == GAUDI2_ARC_PCI_MSB_ADDR(end_addr))
3816 break;
3817 }
3818
3819 if (i == GAUDI2_ALLOC_CPU_MEM_RETRY_CNT) {
3820 dev_err(hdev->dev,
3821 "MSB of ARC accessible DMA memory are not identical in all range\n");
3822 rc = -EFAULT;
3823 goto free_dma_mem_arr;
3824 }
3825
3826 hdev->cpu_accessible_dma_mem = virt_addr_arr[i];
3827 hdev->cpu_accessible_dma_address = dma_addr_arr[i];
3828
3829 free_dma_mem_arr:
3830 for (j = 0 ; j < i ; j++)
3831 hl_asic_dma_free_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE, virt_addr_arr[j],
3832 dma_addr_arr[j]);
3833
3834 return rc;
3835 }
3836
gaudi2_set_pci_memory_regions(struct hl_device * hdev)3837 static void gaudi2_set_pci_memory_regions(struct hl_device *hdev)
3838 {
3839 struct asic_fixed_properties *prop = &hdev->asic_prop;
3840 struct pci_mem_region *region;
3841
3842 /* CFG */
3843 region = &hdev->pci_mem_region[PCI_REGION_CFG];
3844 region->region_base = CFG_BASE;
3845 region->region_size = CFG_SIZE;
3846 region->offset_in_bar = CFG_BASE - STM_FLASH_BASE_ADDR;
3847 region->bar_size = CFG_BAR_SIZE;
3848 region->bar_id = SRAM_CFG_BAR_ID;
3849 region->used = 1;
3850
3851 /* SRAM */
3852 region = &hdev->pci_mem_region[PCI_REGION_SRAM];
3853 region->region_base = SRAM_BASE_ADDR;
3854 region->region_size = SRAM_SIZE;
3855 region->offset_in_bar = CFG_REGION_SIZE + BAR0_RSRVD_SIZE;
3856 region->bar_size = CFG_BAR_SIZE;
3857 region->bar_id = SRAM_CFG_BAR_ID;
3858 region->used = 1;
3859
3860 /* DRAM */
3861 region = &hdev->pci_mem_region[PCI_REGION_DRAM];
3862 region->region_base = DRAM_PHYS_BASE;
3863 region->region_size = hdev->asic_prop.dram_size;
3864 region->offset_in_bar = 0;
3865 region->bar_size = prop->dram_pci_bar_size;
3866 region->bar_id = DRAM_BAR_ID;
3867 region->used = 1;
3868 }
3869
gaudi2_user_interrupt_setup(struct hl_device * hdev)3870 static void gaudi2_user_interrupt_setup(struct hl_device *hdev)
3871 {
3872 struct asic_fixed_properties *prop = &hdev->asic_prop;
3873 int i, j, k;
3874
3875 /* Initialize TPC interrupt */
3876 HL_USR_INTR_STRUCT_INIT(hdev->tpc_interrupt, hdev, 0, HL_USR_INTERRUPT_TPC);
3877
3878 /* Initialize unexpected error interrupt */
3879 HL_USR_INTR_STRUCT_INIT(hdev->unexpected_error_interrupt, hdev, 0,
3880 HL_USR_INTERRUPT_UNEXPECTED);
3881
3882 /* Initialize common user CQ interrupt */
3883 HL_USR_INTR_STRUCT_INIT(hdev->common_user_cq_interrupt, hdev,
3884 HL_COMMON_USER_CQ_INTERRUPT_ID, HL_USR_INTERRUPT_CQ);
3885
3886 /* Initialize common decoder interrupt */
3887 HL_USR_INTR_STRUCT_INIT(hdev->common_decoder_interrupt, hdev,
3888 HL_COMMON_DEC_INTERRUPT_ID, HL_USR_INTERRUPT_DECODER);
3889
3890 /* User interrupts structure holds both decoder and user interrupts from various engines.
3891 * We first initialize the decoder interrupts and then we add the user interrupts.
3892 * The only limitation is that the last decoder interrupt id must be smaller
3893 * then GAUDI2_IRQ_NUM_USER_FIRST. This is checked at compilation time.
3894 */
3895
3896 /* Initialize decoder interrupts, expose only normal interrupts,
3897 * error interrupts to be handled by driver
3898 */
3899 for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM, j = 0 ; i <= GAUDI2_IRQ_NUM_SHARED_DEC1_NRM;
3900 i += 2, j++)
3901 HL_USR_INTR_STRUCT_INIT(hdev->user_interrupt[j], hdev, i,
3902 HL_USR_INTERRUPT_DECODER);
3903
3904 for (i = GAUDI2_IRQ_NUM_USER_FIRST, k = 0 ; k < prop->user_interrupt_count; i++, j++, k++)
3905 HL_USR_INTR_STRUCT_INIT(hdev->user_interrupt[j], hdev, i, HL_USR_INTERRUPT_CQ);
3906 }
3907
gaudi2_get_non_zero_random_int(void)3908 static inline int gaudi2_get_non_zero_random_int(void)
3909 {
3910 int rand = get_random_u32();
3911
3912 return rand ? rand : 1;
3913 }
3914
gaudi2_special_blocks_free(struct hl_device * hdev)3915 static void gaudi2_special_blocks_free(struct hl_device *hdev)
3916 {
3917 struct asic_fixed_properties *prop = &hdev->asic_prop;
3918 struct hl_skip_blocks_cfg *skip_special_blocks_cfg =
3919 &prop->skip_special_blocks_cfg;
3920
3921 kfree(prop->special_blocks);
3922 kfree(skip_special_blocks_cfg->block_types);
3923 kfree(skip_special_blocks_cfg->block_ranges);
3924 }
3925
gaudi2_special_blocks_iterator_free(struct hl_device * hdev)3926 static void gaudi2_special_blocks_iterator_free(struct hl_device *hdev)
3927 {
3928 gaudi2_special_blocks_free(hdev);
3929 }
3930
gaudi2_special_block_skip(struct hl_device * hdev,struct hl_special_blocks_cfg * special_blocks_cfg,u32 blk_idx,u32 major,u32 minor,u32 sub_minor)3931 static bool gaudi2_special_block_skip(struct hl_device *hdev,
3932 struct hl_special_blocks_cfg *special_blocks_cfg,
3933 u32 blk_idx, u32 major, u32 minor, u32 sub_minor)
3934 {
3935 return false;
3936 }
3937
gaudi2_special_blocks_config(struct hl_device * hdev)3938 static int gaudi2_special_blocks_config(struct hl_device *hdev)
3939 {
3940 struct asic_fixed_properties *prop = &hdev->asic_prop;
3941 int i, rc;
3942
3943 /* Configure Special blocks */
3944 prop->glbl_err_max_cause_num = GAUDI2_GLBL_ERR_MAX_CAUSE_NUM;
3945 prop->num_of_special_blocks = ARRAY_SIZE(gaudi2_special_blocks);
3946 prop->special_blocks = kmalloc_objs(*prop->special_blocks,
3947 prop->num_of_special_blocks);
3948 if (!prop->special_blocks)
3949 return -ENOMEM;
3950
3951 for (i = 0 ; i < prop->num_of_special_blocks ; i++)
3952 memcpy(&prop->special_blocks[i], &gaudi2_special_blocks[i],
3953 sizeof(*prop->special_blocks));
3954
3955 /* Configure when to skip Special blocks */
3956 memset(&prop->skip_special_blocks_cfg, 0, sizeof(prop->skip_special_blocks_cfg));
3957 prop->skip_special_blocks_cfg.skip_block_hook = gaudi2_special_block_skip;
3958
3959 if (ARRAY_SIZE(gaudi2_iterator_skip_block_types)) {
3960 prop->skip_special_blocks_cfg.block_types =
3961 kmalloc_objs(gaudi2_iterator_skip_block_types[0],
3962 ARRAY_SIZE(gaudi2_iterator_skip_block_types));
3963 if (!prop->skip_special_blocks_cfg.block_types) {
3964 rc = -ENOMEM;
3965 goto free_special_blocks;
3966 }
3967
3968 memcpy(prop->skip_special_blocks_cfg.block_types, gaudi2_iterator_skip_block_types,
3969 sizeof(gaudi2_iterator_skip_block_types));
3970
3971 prop->skip_special_blocks_cfg.block_types_len =
3972 ARRAY_SIZE(gaudi2_iterator_skip_block_types);
3973 }
3974
3975 if (ARRAY_SIZE(gaudi2_iterator_skip_block_ranges)) {
3976 prop->skip_special_blocks_cfg.block_ranges =
3977 kmalloc_objs(gaudi2_iterator_skip_block_ranges[0],
3978 ARRAY_SIZE(gaudi2_iterator_skip_block_ranges));
3979 if (!prop->skip_special_blocks_cfg.block_ranges) {
3980 rc = -ENOMEM;
3981 goto free_skip_special_blocks_types;
3982 }
3983
3984 for (i = 0 ; i < ARRAY_SIZE(gaudi2_iterator_skip_block_ranges) ; i++)
3985 memcpy(&prop->skip_special_blocks_cfg.block_ranges[i],
3986 &gaudi2_iterator_skip_block_ranges[i],
3987 sizeof(struct range));
3988
3989 prop->skip_special_blocks_cfg.block_ranges_len =
3990 ARRAY_SIZE(gaudi2_iterator_skip_block_ranges);
3991 }
3992
3993 return 0;
3994
3995 free_skip_special_blocks_types:
3996 kfree(prop->skip_special_blocks_cfg.block_types);
3997 free_special_blocks:
3998 kfree(prop->special_blocks);
3999
4000 return rc;
4001 }
4002
gaudi2_special_blocks_iterator_config(struct hl_device * hdev)4003 static int gaudi2_special_blocks_iterator_config(struct hl_device *hdev)
4004 {
4005 return gaudi2_special_blocks_config(hdev);
4006 }
4007
gaudi2_test_queues_msgs_free(struct hl_device * hdev)4008 static void gaudi2_test_queues_msgs_free(struct hl_device *hdev)
4009 {
4010 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4011 struct gaudi2_queues_test_info *msg_info = gaudi2->queues_test_info;
4012 int i;
4013
4014 for (i = 0 ; i < GAUDI2_NUM_TESTED_QS ; i++) {
4015 /* bail-out if this is an allocation failure point */
4016 if (!msg_info[i].kern_addr)
4017 break;
4018
4019 hl_asic_dma_pool_free(hdev, msg_info[i].kern_addr, msg_info[i].dma_addr);
4020 msg_info[i].kern_addr = NULL;
4021 }
4022 }
4023
gaudi2_test_queues_msgs_alloc(struct hl_device * hdev)4024 static int gaudi2_test_queues_msgs_alloc(struct hl_device *hdev)
4025 {
4026 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4027 struct gaudi2_queues_test_info *msg_info = gaudi2->queues_test_info;
4028 int i, rc;
4029
4030 /* allocate a message-short buf for each Q we intend to test */
4031 for (i = 0 ; i < GAUDI2_NUM_TESTED_QS ; i++) {
4032 msg_info[i].kern_addr =
4033 (void *)hl_asic_dma_pool_zalloc(hdev, sizeof(struct packet_msg_short),
4034 GFP_KERNEL, &msg_info[i].dma_addr);
4035 if (!msg_info[i].kern_addr) {
4036 dev_err(hdev->dev,
4037 "Failed to allocate dma memory for H/W queue %d testing\n", i);
4038 rc = -ENOMEM;
4039 goto err_exit;
4040 }
4041 }
4042
4043 return 0;
4044
4045 err_exit:
4046 gaudi2_test_queues_msgs_free(hdev);
4047 return rc;
4048 }
4049
gaudi2_sw_init(struct hl_device * hdev)4050 static int gaudi2_sw_init(struct hl_device *hdev)
4051 {
4052 struct asic_fixed_properties *prop = &hdev->asic_prop;
4053 struct gaudi2_device *gaudi2;
4054 int i, rc;
4055
4056 /* Allocate device structure */
4057 gaudi2 = kzalloc_obj(*gaudi2);
4058 if (!gaudi2)
4059 return -ENOMEM;
4060
4061 for (i = 0 ; i < ARRAY_SIZE(gaudi2_irq_map_table) ; i++) {
4062 if (gaudi2_irq_map_table[i].msg || !gaudi2_irq_map_table[i].valid)
4063 continue;
4064
4065 if (gaudi2->num_of_valid_hw_events == GAUDI2_EVENT_SIZE) {
4066 dev_err(hdev->dev, "H/W events array exceeds the limit of %u events\n",
4067 GAUDI2_EVENT_SIZE);
4068 rc = -EINVAL;
4069 goto free_gaudi2_device;
4070 }
4071
4072 gaudi2->hw_events[gaudi2->num_of_valid_hw_events++] = gaudi2_irq_map_table[i].fc_id;
4073 }
4074
4075 for (i = 0 ; i < MME_NUM_OF_LFSR_SEEDS ; i++)
4076 gaudi2->lfsr_rand_seeds[i] = gaudi2_get_non_zero_random_int();
4077
4078 gaudi2->cpucp_info_get = gaudi2_cpucp_info_get;
4079
4080 hdev->asic_specific = gaudi2;
4081
4082 /* Create DMA pool for small allocations.
4083 * Use DEVICE_CACHE_LINE_SIZE for alignment since the NIC memory-mapped
4084 * PI/CI registers allocated from this pool have this restriction
4085 */
4086 hdev->dma_pool = dma_pool_create(dev_name(hdev->dev), &hdev->pdev->dev,
4087 GAUDI2_DMA_POOL_BLK_SIZE, DEVICE_CACHE_LINE_SIZE, 0);
4088 if (!hdev->dma_pool) {
4089 dev_err(hdev->dev, "failed to create DMA pool\n");
4090 rc = -ENOMEM;
4091 goto free_gaudi2_device;
4092 }
4093
4094 rc = gaudi2_alloc_cpu_accessible_dma_mem(hdev);
4095 if (rc)
4096 goto free_dma_pool;
4097
4098 hdev->cpu_accessible_dma_pool = gen_pool_create(ilog2(32), -1);
4099 if (!hdev->cpu_accessible_dma_pool) {
4100 dev_err(hdev->dev, "Failed to create CPU accessible DMA pool\n");
4101 rc = -ENOMEM;
4102 goto free_cpu_dma_mem;
4103 }
4104
4105 rc = gen_pool_add(hdev->cpu_accessible_dma_pool, (uintptr_t) hdev->cpu_accessible_dma_mem,
4106 HL_CPU_ACCESSIBLE_MEM_SIZE, -1);
4107 if (rc) {
4108 dev_err(hdev->dev, "Failed to add memory to CPU accessible DMA pool\n");
4109 rc = -EFAULT;
4110 goto free_cpu_accessible_dma_pool;
4111 }
4112
4113 gaudi2->virt_msix_db_cpu_addr = hl_cpu_accessible_dma_pool_alloc(hdev, prop->pmmu.page_size,
4114 &gaudi2->virt_msix_db_dma_addr);
4115 if (!gaudi2->virt_msix_db_cpu_addr) {
4116 dev_err(hdev->dev, "Failed to allocate DMA memory for virtual MSI-X doorbell\n");
4117 rc = -ENOMEM;
4118 goto free_cpu_accessible_dma_pool;
4119 }
4120
4121 spin_lock_init(&gaudi2->hw_queues_lock);
4122
4123 gaudi2->scratchpad_bus_address = prop->mmu_pgt_addr + HMMU_PAGE_TABLES_SIZE + EDMA_PQS_SIZE;
4124
4125 gaudi2_user_mapped_blocks_init(hdev);
4126
4127 /* Initialize user interrupts */
4128 gaudi2_user_interrupt_setup(hdev);
4129
4130 hdev->supports_coresight = true;
4131 hdev->supports_sync_stream = true;
4132 hdev->supports_cb_mapping = true;
4133 hdev->supports_wait_for_multi_cs = false;
4134
4135 prop->supports_compute_reset = true;
4136
4137 /* Event queue sanity check added in FW version 1.11 */
4138 if (hl_fw_version_cmp(hdev, 1, 11, 0) < 0)
4139 hdev->event_queue.check_eqe_index = false;
4140 else
4141 hdev->event_queue.check_eqe_index = true;
4142
4143 hdev->asic_funcs->set_pci_memory_regions(hdev);
4144
4145 rc = gaudi2_special_blocks_iterator_config(hdev);
4146 if (rc)
4147 goto free_virt_msix_db_mem;
4148
4149 rc = gaudi2_test_queues_msgs_alloc(hdev);
4150 if (rc)
4151 goto special_blocks_free;
4152
4153 hdev->heartbeat_debug_info.cpu_queue_id = GAUDI2_QUEUE_ID_CPU_PQ;
4154
4155 return 0;
4156
4157 special_blocks_free:
4158 gaudi2_special_blocks_iterator_free(hdev);
4159 free_virt_msix_db_mem:
4160 hl_cpu_accessible_dma_pool_free(hdev, prop->pmmu.page_size, gaudi2->virt_msix_db_cpu_addr);
4161 free_cpu_accessible_dma_pool:
4162 gen_pool_destroy(hdev->cpu_accessible_dma_pool);
4163 free_cpu_dma_mem:
4164 hl_asic_dma_free_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE, hdev->cpu_accessible_dma_mem,
4165 hdev->cpu_accessible_dma_address);
4166 free_dma_pool:
4167 dma_pool_destroy(hdev->dma_pool);
4168 free_gaudi2_device:
4169 kfree(gaudi2);
4170 return rc;
4171 }
4172
gaudi2_sw_fini(struct hl_device * hdev)4173 static int gaudi2_sw_fini(struct hl_device *hdev)
4174 {
4175 struct asic_fixed_properties *prop = &hdev->asic_prop;
4176 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4177
4178 gaudi2_test_queues_msgs_free(hdev);
4179
4180 gaudi2_special_blocks_iterator_free(hdev);
4181
4182 hl_cpu_accessible_dma_pool_free(hdev, prop->pmmu.page_size, gaudi2->virt_msix_db_cpu_addr);
4183
4184 gen_pool_destroy(hdev->cpu_accessible_dma_pool);
4185
4186 hl_asic_dma_free_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE, hdev->cpu_accessible_dma_mem,
4187 hdev->cpu_accessible_dma_address);
4188
4189 dma_pool_destroy(hdev->dma_pool);
4190
4191 kfree(gaudi2);
4192
4193 return 0;
4194 }
4195
gaudi2_stop_qman_common(struct hl_device * hdev,u32 reg_base)4196 static void gaudi2_stop_qman_common(struct hl_device *hdev, u32 reg_base)
4197 {
4198 WREG32(reg_base + QM_GLBL_CFG1_OFFSET, QM_GLBL_CFG1_PQF_STOP |
4199 QM_GLBL_CFG1_CQF_STOP |
4200 QM_GLBL_CFG1_CP_STOP);
4201
4202 /* stop also the ARC */
4203 WREG32(reg_base + QM_GLBL_CFG2_OFFSET, QM_GLBL_CFG2_ARC_CQF_STOP);
4204 }
4205
gaudi2_flush_qman_common(struct hl_device * hdev,u32 reg_base)4206 static void gaudi2_flush_qman_common(struct hl_device *hdev, u32 reg_base)
4207 {
4208 WREG32(reg_base + QM_GLBL_CFG1_OFFSET, QM_GLBL_CFG1_PQF_FLUSH |
4209 QM_GLBL_CFG1_CQF_FLUSH |
4210 QM_GLBL_CFG1_CP_FLUSH);
4211 }
4212
gaudi2_flush_qman_arc_common(struct hl_device * hdev,u32 reg_base)4213 static void gaudi2_flush_qman_arc_common(struct hl_device *hdev, u32 reg_base)
4214 {
4215 WREG32(reg_base + QM_GLBL_CFG2_OFFSET, QM_GLBL_CFG2_ARC_CQF_FLUSH);
4216 }
4217
4218 /**
4219 * gaudi2_clear_qm_fence_counters_common - clear QM's fence counters
4220 *
4221 * @hdev: pointer to the habanalabs device structure
4222 * @queue_id: queue to clear fence counters to
4223 * @skip_fence: if true set maximum fence value to all fence counters to avoid
4224 * getting stuck on any fence value. otherwise set all fence
4225 * counters to 0 (standard clear of fence counters)
4226 */
gaudi2_clear_qm_fence_counters_common(struct hl_device * hdev,u32 queue_id,bool skip_fence)4227 static void gaudi2_clear_qm_fence_counters_common(struct hl_device *hdev, u32 queue_id,
4228 bool skip_fence)
4229 {
4230 u32 size, reg_base;
4231 u32 addr, val;
4232
4233 reg_base = gaudi2_qm_blocks_bases[queue_id];
4234
4235 addr = reg_base + QM_CP_FENCE0_CNT_0_OFFSET;
4236 size = mmPDMA0_QM_CP_BARRIER_CFG - mmPDMA0_QM_CP_FENCE0_CNT_0;
4237
4238 /*
4239 * in case we want to make sure that QM that is stuck on a fence will
4240 * be released we should set the fence counter to a higher value that
4241 * the value the QM waiting for. to comply with any fence counter of
4242 * any value we set maximum fence value to all counters
4243 */
4244 val = skip_fence ? U32_MAX : 0;
4245 gaudi2_memset_device_lbw(hdev, addr, size, val);
4246 }
4247
gaudi2_qman_manual_flush_common(struct hl_device * hdev,u32 queue_id)4248 static void gaudi2_qman_manual_flush_common(struct hl_device *hdev, u32 queue_id)
4249 {
4250 u32 reg_base = gaudi2_qm_blocks_bases[queue_id];
4251
4252 gaudi2_clear_qm_fence_counters_common(hdev, queue_id, true);
4253 gaudi2_flush_qman_common(hdev, reg_base);
4254 gaudi2_flush_qman_arc_common(hdev, reg_base);
4255 }
4256
gaudi2_stop_dma_qmans(struct hl_device * hdev)4257 static void gaudi2_stop_dma_qmans(struct hl_device *hdev)
4258 {
4259 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4260 int dcore, inst;
4261
4262 if (!(gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK))
4263 goto stop_edma_qmans;
4264
4265 /* Stop CPs of PDMA QMANs */
4266 gaudi2_stop_qman_common(hdev, mmPDMA0_QM_BASE);
4267 gaudi2_stop_qman_common(hdev, mmPDMA1_QM_BASE);
4268
4269 stop_edma_qmans:
4270 if (!(gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK))
4271 return;
4272
4273 for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {
4274 for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {
4275 u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;
4276 u32 qm_base;
4277
4278 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_EDMA_SHIFT + seq)))
4279 continue;
4280
4281 qm_base = mmDCORE0_EDMA0_QM_BASE + dcore * DCORE_OFFSET +
4282 inst * DCORE_EDMA_OFFSET;
4283
4284 /* Stop CPs of EDMA QMANs */
4285 gaudi2_stop_qman_common(hdev, qm_base);
4286 }
4287 }
4288 }
4289
gaudi2_stop_mme_qmans(struct hl_device * hdev)4290 static void gaudi2_stop_mme_qmans(struct hl_device *hdev)
4291 {
4292 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4293 u32 offset, i;
4294
4295 offset = mmDCORE1_MME_QM_BASE - mmDCORE0_MME_QM_BASE;
4296
4297 for (i = 0 ; i < NUM_OF_DCORES ; i++) {
4298 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_MME_SHIFT + i)))
4299 continue;
4300
4301 gaudi2_stop_qman_common(hdev, mmDCORE0_MME_QM_BASE + (i * offset));
4302 }
4303 }
4304
gaudi2_stop_tpc_qmans(struct hl_device * hdev)4305 static void gaudi2_stop_tpc_qmans(struct hl_device *hdev)
4306 {
4307 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4308 u32 reg_base;
4309 int i;
4310
4311 if (!(gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK))
4312 return;
4313
4314 for (i = 0 ; i < TPC_ID_SIZE ; i++) {
4315 if (!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(HW_CAP_TPC_SHIFT + i)))
4316 continue;
4317
4318 reg_base = gaudi2_qm_blocks_bases[gaudi2_tpc_id_to_queue_id[i]];
4319 gaudi2_stop_qman_common(hdev, reg_base);
4320 }
4321 }
4322
gaudi2_stop_rot_qmans(struct hl_device * hdev)4323 static void gaudi2_stop_rot_qmans(struct hl_device *hdev)
4324 {
4325 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4326 u32 reg_base;
4327 int i;
4328
4329 if (!(gaudi2->hw_cap_initialized & HW_CAP_ROT_MASK))
4330 return;
4331
4332 for (i = 0 ; i < ROTATOR_ID_SIZE ; i++) {
4333 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_ROT_SHIFT + i)))
4334 continue;
4335
4336 reg_base = gaudi2_qm_blocks_bases[gaudi2_rot_id_to_queue_id[i]];
4337 gaudi2_stop_qman_common(hdev, reg_base);
4338 }
4339 }
4340
gaudi2_stop_nic_qmans(struct hl_device * hdev)4341 static void gaudi2_stop_nic_qmans(struct hl_device *hdev)
4342 {
4343 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4344 u32 reg_base, queue_id;
4345 int i;
4346
4347 if (!(gaudi2->nic_hw_cap_initialized & HW_CAP_NIC_MASK))
4348 return;
4349
4350 queue_id = GAUDI2_QUEUE_ID_NIC_0_0;
4351
4352 for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++, queue_id += NUM_OF_PQ_PER_QMAN) {
4353 if (!(hdev->nic_ports_mask & BIT(i)))
4354 continue;
4355
4356 reg_base = gaudi2_qm_blocks_bases[queue_id];
4357 gaudi2_stop_qman_common(hdev, reg_base);
4358 }
4359 }
4360
gaudi2_stall_dma_common(struct hl_device * hdev,u32 reg_base)4361 static void gaudi2_stall_dma_common(struct hl_device *hdev, u32 reg_base)
4362 {
4363 u32 reg_val;
4364
4365 reg_val = FIELD_PREP(PDMA0_CORE_CFG_1_HALT_MASK, 0x1);
4366 WREG32(reg_base + DMA_CORE_CFG_1_OFFSET, reg_val);
4367 }
4368
gaudi2_dma_stall(struct hl_device * hdev)4369 static void gaudi2_dma_stall(struct hl_device *hdev)
4370 {
4371 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4372 int dcore, inst;
4373
4374 if (!(gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK))
4375 goto stall_edma;
4376
4377 gaudi2_stall_dma_common(hdev, mmPDMA0_CORE_BASE);
4378 gaudi2_stall_dma_common(hdev, mmPDMA1_CORE_BASE);
4379
4380 stall_edma:
4381 if (!(gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK))
4382 return;
4383
4384 for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {
4385 for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {
4386 u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;
4387 u32 core_base;
4388
4389 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_EDMA_SHIFT + seq)))
4390 continue;
4391
4392 core_base = mmDCORE0_EDMA0_CORE_BASE + dcore * DCORE_OFFSET +
4393 inst * DCORE_EDMA_OFFSET;
4394
4395 /* Stall CPs of EDMA QMANs */
4396 gaudi2_stall_dma_common(hdev, core_base);
4397 }
4398 }
4399 }
4400
gaudi2_mme_stall(struct hl_device * hdev)4401 static void gaudi2_mme_stall(struct hl_device *hdev)
4402 {
4403 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4404 u32 offset, i;
4405
4406 offset = mmDCORE1_MME_CTRL_LO_QM_STALL - mmDCORE0_MME_CTRL_LO_QM_STALL;
4407
4408 for (i = 0 ; i < NUM_OF_DCORES ; i++)
4409 if (gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_MME_SHIFT + i))
4410 WREG32(mmDCORE0_MME_CTRL_LO_QM_STALL + (i * offset), 1);
4411 }
4412
gaudi2_tpc_stall(struct hl_device * hdev)4413 static void gaudi2_tpc_stall(struct hl_device *hdev)
4414 {
4415 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4416 u32 reg_base;
4417 int i;
4418
4419 if (!(gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK))
4420 return;
4421
4422 for (i = 0 ; i < TPC_ID_SIZE ; i++) {
4423 if (!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(HW_CAP_TPC_SHIFT + i)))
4424 continue;
4425
4426 reg_base = gaudi2_tpc_cfg_blocks_bases[i];
4427 WREG32(reg_base + TPC_CFG_STALL_OFFSET, 1);
4428 }
4429 }
4430
gaudi2_rotator_stall(struct hl_device * hdev)4431 static void gaudi2_rotator_stall(struct hl_device *hdev)
4432 {
4433 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4434 u32 reg_val;
4435 int i;
4436
4437 if (!(gaudi2->hw_cap_initialized & HW_CAP_ROT_MASK))
4438 return;
4439
4440 reg_val = FIELD_PREP(ROT_MSS_HALT_WBC_MASK, 0x1) |
4441 FIELD_PREP(ROT_MSS_HALT_RSB_MASK, 0x1) |
4442 FIELD_PREP(ROT_MSS_HALT_MRSB_MASK, 0x1);
4443
4444 for (i = 0 ; i < ROTATOR_ID_SIZE ; i++) {
4445 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_ROT_SHIFT + i)))
4446 continue;
4447
4448 WREG32(mmROT0_MSS_HALT + i * ROT_OFFSET, reg_val);
4449 }
4450 }
4451
gaudi2_disable_qman_common(struct hl_device * hdev,u32 reg_base)4452 static void gaudi2_disable_qman_common(struct hl_device *hdev, u32 reg_base)
4453 {
4454 WREG32(reg_base + QM_GLBL_CFG0_OFFSET, 0);
4455 }
4456
gaudi2_disable_dma_qmans(struct hl_device * hdev)4457 static void gaudi2_disable_dma_qmans(struct hl_device *hdev)
4458 {
4459 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4460 int dcore, inst;
4461
4462 if (!(gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK))
4463 goto stop_edma_qmans;
4464
4465 gaudi2_disable_qman_common(hdev, mmPDMA0_QM_BASE);
4466 gaudi2_disable_qman_common(hdev, mmPDMA1_QM_BASE);
4467
4468 stop_edma_qmans:
4469 if (!(gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK))
4470 return;
4471
4472 for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {
4473 for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {
4474 u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;
4475 u32 qm_base;
4476
4477 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_EDMA_SHIFT + seq)))
4478 continue;
4479
4480 qm_base = mmDCORE0_EDMA0_QM_BASE + dcore * DCORE_OFFSET +
4481 inst * DCORE_EDMA_OFFSET;
4482
4483 /* Disable CPs of EDMA QMANs */
4484 gaudi2_disable_qman_common(hdev, qm_base);
4485 }
4486 }
4487 }
4488
gaudi2_disable_mme_qmans(struct hl_device * hdev)4489 static void gaudi2_disable_mme_qmans(struct hl_device *hdev)
4490 {
4491 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4492 u32 offset, i;
4493
4494 offset = mmDCORE1_MME_QM_BASE - mmDCORE0_MME_QM_BASE;
4495
4496 for (i = 0 ; i < NUM_OF_DCORES ; i++)
4497 if (gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_MME_SHIFT + i))
4498 gaudi2_disable_qman_common(hdev, mmDCORE0_MME_QM_BASE + (i * offset));
4499 }
4500
gaudi2_disable_tpc_qmans(struct hl_device * hdev)4501 static void gaudi2_disable_tpc_qmans(struct hl_device *hdev)
4502 {
4503 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4504 u32 reg_base;
4505 int i;
4506
4507 if (!(gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK))
4508 return;
4509
4510 for (i = 0 ; i < TPC_ID_SIZE ; i++) {
4511 if (!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(HW_CAP_TPC_SHIFT + i)))
4512 continue;
4513
4514 reg_base = gaudi2_qm_blocks_bases[gaudi2_tpc_id_to_queue_id[i]];
4515 gaudi2_disable_qman_common(hdev, reg_base);
4516 }
4517 }
4518
gaudi2_disable_rot_qmans(struct hl_device * hdev)4519 static void gaudi2_disable_rot_qmans(struct hl_device *hdev)
4520 {
4521 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4522 u32 reg_base;
4523 int i;
4524
4525 if (!(gaudi2->hw_cap_initialized & HW_CAP_ROT_MASK))
4526 return;
4527
4528 for (i = 0 ; i < ROTATOR_ID_SIZE ; i++) {
4529 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_ROT_SHIFT + i)))
4530 continue;
4531
4532 reg_base = gaudi2_qm_blocks_bases[gaudi2_rot_id_to_queue_id[i]];
4533 gaudi2_disable_qman_common(hdev, reg_base);
4534 }
4535 }
4536
gaudi2_disable_nic_qmans(struct hl_device * hdev)4537 static void gaudi2_disable_nic_qmans(struct hl_device *hdev)
4538 {
4539 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4540 u32 reg_base, queue_id;
4541 int i;
4542
4543 if (!(gaudi2->nic_hw_cap_initialized & HW_CAP_NIC_MASK))
4544 return;
4545
4546 queue_id = GAUDI2_QUEUE_ID_NIC_0_0;
4547
4548 for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++, queue_id += NUM_OF_PQ_PER_QMAN) {
4549 if (!(hdev->nic_ports_mask & BIT(i)))
4550 continue;
4551
4552 reg_base = gaudi2_qm_blocks_bases[queue_id];
4553 gaudi2_disable_qman_common(hdev, reg_base);
4554 }
4555 }
4556
gaudi2_enable_timestamp(struct hl_device * hdev)4557 static void gaudi2_enable_timestamp(struct hl_device *hdev)
4558 {
4559 /* Disable the timestamp counter */
4560 WREG32(mmPSOC_TIMESTAMP_BASE, 0);
4561
4562 /* Zero the lower/upper parts of the 64-bit counter */
4563 WREG32(mmPSOC_TIMESTAMP_BASE + 0xC, 0);
4564 WREG32(mmPSOC_TIMESTAMP_BASE + 0x8, 0);
4565
4566 /* Enable the counter */
4567 WREG32(mmPSOC_TIMESTAMP_BASE, 1);
4568 }
4569
gaudi2_disable_timestamp(struct hl_device * hdev)4570 static void gaudi2_disable_timestamp(struct hl_device *hdev)
4571 {
4572 /* Disable the timestamp counter */
4573 WREG32(mmPSOC_TIMESTAMP_BASE, 0);
4574 }
4575
gaudi2_irq_name(u16 irq_number)4576 static const char *gaudi2_irq_name(u16 irq_number)
4577 {
4578 switch (irq_number) {
4579 case GAUDI2_IRQ_NUM_EVENT_QUEUE:
4580 return "gaudi2 cpu eq";
4581 case GAUDI2_IRQ_NUM_COMPLETION:
4582 return "gaudi2 completion";
4583 case GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM ... GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM:
4584 return gaudi2_vdec_irq_name[irq_number - GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM];
4585 case GAUDI2_IRQ_NUM_TPC_ASSERT:
4586 return "gaudi2 tpc assert";
4587 case GAUDI2_IRQ_NUM_UNEXPECTED_ERROR:
4588 return "gaudi2 unexpected error";
4589 case GAUDI2_IRQ_NUM_USER_FIRST ... GAUDI2_IRQ_NUM_USER_LAST:
4590 return "gaudi2 user completion";
4591 case GAUDI2_IRQ_NUM_EQ_ERROR:
4592 return "gaudi2 eq error";
4593 default:
4594 return "invalid";
4595 }
4596 }
4597
gaudi2_dec_disable_msix(struct hl_device * hdev,u32 max_irq_num)4598 static void gaudi2_dec_disable_msix(struct hl_device *hdev, u32 max_irq_num)
4599 {
4600 int i, irq, relative_idx;
4601 struct hl_dec *dec;
4602
4603 for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM ; i < max_irq_num ; i++) {
4604 irq = pci_irq_vector(hdev->pdev, i);
4605 relative_idx = i - GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM;
4606
4607 dec = hdev->dec + relative_idx / 2;
4608
4609 /* We pass different structures depending on the irq handler. For the abnormal
4610 * interrupt we pass hl_dec and for the regular interrupt we pass the relevant
4611 * user_interrupt entry
4612 */
4613 free_irq(irq, ((relative_idx % 2) ?
4614 (void *) dec :
4615 (void *) &hdev->user_interrupt[dec->core_id]));
4616 }
4617 }
4618
gaudi2_dec_enable_msix(struct hl_device * hdev)4619 static int gaudi2_dec_enable_msix(struct hl_device *hdev)
4620 {
4621 int rc, i, irq_init_cnt, irq, relative_idx;
4622 struct hl_dec *dec;
4623
4624 for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM, irq_init_cnt = 0;
4625 i <= GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM;
4626 i++, irq_init_cnt++) {
4627
4628 irq = pci_irq_vector(hdev->pdev, i);
4629 relative_idx = i - GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM;
4630
4631 /* We pass different structures depending on the irq handler. For the abnormal
4632 * interrupt we pass hl_dec and for the regular interrupt we pass the relevant
4633 * user_interrupt entry
4634 *
4635 * TODO: change the dec abnrm to threaded irq
4636 */
4637
4638 dec = hdev->dec + relative_idx / 2;
4639 if (relative_idx % 2) {
4640 rc = request_irq(irq, hl_irq_handler_dec_abnrm, 0,
4641 gaudi2_irq_name(i), (void *) dec);
4642 } else {
4643 rc = request_irq(irq, hl_irq_user_interrupt_handler, 0, gaudi2_irq_name(i),
4644 (void *) &hdev->user_interrupt[dec->core_id]);
4645 }
4646
4647 if (rc) {
4648 dev_err(hdev->dev, "Failed to request IRQ %d", irq);
4649 goto free_dec_irqs;
4650 }
4651 }
4652
4653 return 0;
4654
4655 free_dec_irqs:
4656 gaudi2_dec_disable_msix(hdev, (GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM + irq_init_cnt));
4657 return rc;
4658 }
4659
gaudi2_enable_msix(struct hl_device * hdev)4660 static int gaudi2_enable_msix(struct hl_device *hdev)
4661 {
4662 struct asic_fixed_properties *prop = &hdev->asic_prop;
4663 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4664 int rc, irq, i, j, user_irq_init_cnt;
4665 struct hl_cq *cq;
4666
4667 if (gaudi2->hw_cap_initialized & HW_CAP_MSIX)
4668 return 0;
4669
4670 hl_init_cpu_for_irq(hdev);
4671
4672 rc = pci_alloc_irq_vectors(hdev->pdev, GAUDI2_MSIX_ENTRIES, GAUDI2_MSIX_ENTRIES,
4673 PCI_IRQ_MSIX);
4674 if (rc < 0) {
4675 dev_err(hdev->dev, "MSI-X: Failed to enable support -- %d/%d\n",
4676 GAUDI2_MSIX_ENTRIES, rc);
4677 return rc;
4678 }
4679
4680 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);
4681 cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_CS_COMPLETION];
4682 rc = request_irq(irq, hl_irq_handler_cq, 0, gaudi2_irq_name(GAUDI2_IRQ_NUM_COMPLETION), cq);
4683 if (rc) {
4684 dev_err(hdev->dev, "Failed to request IRQ %d", irq);
4685 goto free_irq_vectors;
4686 }
4687
4688 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE);
4689 rc = request_irq(irq, hl_irq_handler_eq, 0, gaudi2_irq_name(GAUDI2_IRQ_NUM_EVENT_QUEUE),
4690 &hdev->event_queue);
4691 if (rc) {
4692 dev_err(hdev->dev, "Failed to request IRQ %d", irq);
4693 goto free_completion_irq;
4694 }
4695
4696 rc = gaudi2_dec_enable_msix(hdev);
4697 if (rc) {
4698 dev_err(hdev->dev, "Failed to enable decoder IRQ");
4699 goto free_event_irq;
4700 }
4701
4702 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_TPC_ASSERT);
4703 rc = request_threaded_irq(irq, NULL, hl_irq_user_interrupt_thread_handler, IRQF_ONESHOT,
4704 gaudi2_irq_name(GAUDI2_IRQ_NUM_TPC_ASSERT),
4705 &hdev->tpc_interrupt);
4706 if (rc) {
4707 dev_err(hdev->dev, "Failed to request IRQ %d", irq);
4708 goto free_dec_irq;
4709 }
4710
4711 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_UNEXPECTED_ERROR);
4712 rc = request_threaded_irq(irq, NULL, hl_irq_user_interrupt_thread_handler, IRQF_ONESHOT,
4713 gaudi2_irq_name(GAUDI2_IRQ_NUM_UNEXPECTED_ERROR),
4714 &hdev->unexpected_error_interrupt);
4715 if (rc) {
4716 dev_err(hdev->dev, "Failed to request IRQ %d", irq);
4717 goto free_tpc_irq;
4718 }
4719
4720 for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = prop->user_dec_intr_count, user_irq_init_cnt = 0;
4721 user_irq_init_cnt < prop->user_interrupt_count;
4722 i++, j++, user_irq_init_cnt++) {
4723
4724 irq = pci_irq_vector(hdev->pdev, i);
4725 hl_set_irq_affinity(hdev, irq);
4726 rc = request_irq(irq, hl_irq_user_interrupt_handler, 0, gaudi2_irq_name(i),
4727 &hdev->user_interrupt[j]);
4728 if (rc) {
4729 dev_err(hdev->dev, "Failed to request IRQ %d", irq);
4730 goto free_user_irq;
4731 }
4732 }
4733
4734 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EQ_ERROR);
4735 rc = request_threaded_irq(irq, NULL, hl_irq_eq_error_interrupt_thread_handler,
4736 IRQF_ONESHOT, gaudi2_irq_name(GAUDI2_IRQ_NUM_EQ_ERROR),
4737 hdev);
4738 if (rc) {
4739 dev_err(hdev->dev, "Failed to request IRQ %d", irq);
4740 goto free_user_irq;
4741 }
4742
4743 gaudi2->hw_cap_initialized |= HW_CAP_MSIX;
4744
4745 return 0;
4746
4747 free_user_irq:
4748 for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = prop->user_dec_intr_count;
4749 i < GAUDI2_IRQ_NUM_USER_FIRST + user_irq_init_cnt ; i++, j++) {
4750
4751 irq = pci_irq_vector(hdev->pdev, i);
4752 irq_set_affinity_and_hint(irq, NULL);
4753 free_irq(irq, &hdev->user_interrupt[j]);
4754 }
4755 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_UNEXPECTED_ERROR);
4756 free_irq(irq, &hdev->unexpected_error_interrupt);
4757 free_tpc_irq:
4758 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_TPC_ASSERT);
4759 free_irq(irq, &hdev->tpc_interrupt);
4760 free_dec_irq:
4761 gaudi2_dec_disable_msix(hdev, GAUDI2_IRQ_NUM_DEC_LAST + 1);
4762 free_event_irq:
4763 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE);
4764 free_irq(irq, cq);
4765
4766 free_completion_irq:
4767 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);
4768 free_irq(irq, cq);
4769
4770 free_irq_vectors:
4771 pci_free_irq_vectors(hdev->pdev);
4772
4773 return rc;
4774 }
4775
gaudi2_sync_irqs(struct hl_device * hdev)4776 static void gaudi2_sync_irqs(struct hl_device *hdev)
4777 {
4778 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4779 int i, j;
4780 int irq;
4781
4782 if (!(gaudi2->hw_cap_initialized & HW_CAP_MSIX))
4783 return;
4784
4785 /* Wait for all pending IRQs to be finished */
4786 synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION));
4787
4788 for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM ; i <= GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM ; i++) {
4789 irq = pci_irq_vector(hdev->pdev, i);
4790 synchronize_irq(irq);
4791 }
4792
4793 synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_TPC_ASSERT));
4794 synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_UNEXPECTED_ERROR));
4795
4796 for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = 0 ; j < hdev->asic_prop.user_interrupt_count;
4797 i++, j++) {
4798 irq = pci_irq_vector(hdev->pdev, i);
4799 synchronize_irq(irq);
4800 }
4801
4802 synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE));
4803 synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EQ_ERROR));
4804 }
4805
gaudi2_disable_msix(struct hl_device * hdev)4806 static void gaudi2_disable_msix(struct hl_device *hdev)
4807 {
4808 struct asic_fixed_properties *prop = &hdev->asic_prop;
4809 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4810 struct hl_cq *cq;
4811 int irq, i, j, k;
4812
4813 if (!(gaudi2->hw_cap_initialized & HW_CAP_MSIX))
4814 return;
4815
4816 gaudi2_sync_irqs(hdev);
4817
4818 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE);
4819 free_irq(irq, &hdev->event_queue);
4820
4821 gaudi2_dec_disable_msix(hdev, GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM + 1);
4822
4823 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_TPC_ASSERT);
4824 free_irq(irq, &hdev->tpc_interrupt);
4825
4826 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_UNEXPECTED_ERROR);
4827 free_irq(irq, &hdev->unexpected_error_interrupt);
4828
4829 for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = prop->user_dec_intr_count, k = 0;
4830 k < hdev->asic_prop.user_interrupt_count ; i++, j++, k++) {
4831
4832 irq = pci_irq_vector(hdev->pdev, i);
4833 irq_set_affinity_and_hint(irq, NULL);
4834 free_irq(irq, &hdev->user_interrupt[j]);
4835 }
4836
4837 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);
4838 cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_CS_COMPLETION];
4839 free_irq(irq, cq);
4840
4841 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EQ_ERROR);
4842 free_irq(irq, hdev);
4843
4844 pci_free_irq_vectors(hdev->pdev);
4845
4846 gaudi2->hw_cap_initialized &= ~HW_CAP_MSIX;
4847 }
4848
gaudi2_stop_dcore_dec(struct hl_device * hdev,int dcore_id)4849 static void gaudi2_stop_dcore_dec(struct hl_device *hdev, int dcore_id)
4850 {
4851 u32 reg_val = FIELD_PREP(DCORE0_VDEC0_BRDG_CTRL_GRACEFUL_STOP_MASK, 0x1);
4852 u32 graceful_pend_mask = DCORE0_VDEC0_BRDG_CTRL_GRACEFUL_PEND_MASK;
4853 u32 timeout_usec, dec_id, dec_bit, offset, graceful;
4854 int rc;
4855
4856 if (hdev->pldm)
4857 timeout_usec = GAUDI2_PLDM_VDEC_TIMEOUT_USEC;
4858 else
4859 timeout_usec = GAUDI2_VDEC_TIMEOUT_USEC;
4860
4861 for (dec_id = 0 ; dec_id < NUM_OF_DEC_PER_DCORE ; dec_id++) {
4862 dec_bit = dcore_id * NUM_OF_DEC_PER_DCORE + dec_id;
4863 if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))
4864 continue;
4865
4866 offset = dcore_id * DCORE_OFFSET + dec_id * DCORE_VDEC_OFFSET;
4867
4868 WREG32(mmDCORE0_DEC0_CMD_SWREG16 + offset, 0);
4869
4870 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_GRACEFUL + offset, reg_val);
4871
4872 /* Wait till all traffic from decoder stops
4873 * before apply core reset.
4874 */
4875 rc = hl_poll_timeout(
4876 hdev,
4877 mmDCORE0_VDEC0_BRDG_CTRL_GRACEFUL + offset,
4878 graceful,
4879 (graceful & graceful_pend_mask),
4880 100,
4881 timeout_usec);
4882 if (rc)
4883 dev_err(hdev->dev,
4884 "Failed to stop traffic from DCORE%d Decoder %d\n",
4885 dcore_id, dec_id);
4886 }
4887 }
4888
gaudi2_stop_pcie_dec(struct hl_device * hdev)4889 static void gaudi2_stop_pcie_dec(struct hl_device *hdev)
4890 {
4891 u32 reg_val = FIELD_PREP(DCORE0_VDEC0_BRDG_CTRL_GRACEFUL_STOP_MASK, 0x1);
4892 u32 graceful_pend_mask = PCIE_VDEC0_BRDG_CTRL_GRACEFUL_PEND_MASK;
4893 u32 timeout_usec, dec_id, dec_bit, offset, graceful;
4894 int rc;
4895
4896 if (hdev->pldm)
4897 timeout_usec = GAUDI2_PLDM_VDEC_TIMEOUT_USEC;
4898 else
4899 timeout_usec = GAUDI2_VDEC_TIMEOUT_USEC;
4900
4901 for (dec_id = 0 ; dec_id < NUM_OF_DEC_PER_DCORE ; dec_id++) {
4902 dec_bit = PCIE_DEC_SHIFT + dec_id;
4903 if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))
4904 continue;
4905
4906 offset = dec_id * PCIE_VDEC_OFFSET;
4907
4908 WREG32(mmPCIE_DEC0_CMD_SWREG16 + offset, 0);
4909
4910 WREG32(mmPCIE_VDEC0_BRDG_CTRL_GRACEFUL + offset, reg_val);
4911
4912 /* Wait till all traffic from decoder stops
4913 * before apply core reset.
4914 */
4915 rc = hl_poll_timeout(
4916 hdev,
4917 mmPCIE_VDEC0_BRDG_CTRL_GRACEFUL + offset,
4918 graceful,
4919 (graceful & graceful_pend_mask),
4920 100,
4921 timeout_usec);
4922 if (rc)
4923 dev_err(hdev->dev,
4924 "Failed to stop traffic from PCIe Decoder %d\n",
4925 dec_id);
4926 }
4927 }
4928
gaudi2_stop_dec(struct hl_device * hdev)4929 static void gaudi2_stop_dec(struct hl_device *hdev)
4930 {
4931 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4932 int dcore_id;
4933
4934 if ((gaudi2->dec_hw_cap_initialized & HW_CAP_DEC_MASK) == 0)
4935 return;
4936
4937 for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++)
4938 gaudi2_stop_dcore_dec(hdev, dcore_id);
4939
4940 gaudi2_stop_pcie_dec(hdev);
4941 }
4942
gaudi2_set_arc_running_mode(struct hl_device * hdev,u32 cpu_id,u32 run_mode)4943 static void gaudi2_set_arc_running_mode(struct hl_device *hdev, u32 cpu_id, u32 run_mode)
4944 {
4945 u32 reg_base, reg_val;
4946
4947 reg_base = gaudi2_arc_blocks_bases[cpu_id];
4948 if (run_mode == HL_ENGINE_CORE_RUN)
4949 reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_RUN_HALT_REQ_RUN_REQ_MASK, 1);
4950 else
4951 reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_RUN_HALT_REQ_HALT_REQ_MASK, 1);
4952
4953 WREG32(reg_base + ARC_HALT_REQ_OFFSET, reg_val);
4954 }
4955
gaudi2_halt_arcs(struct hl_device * hdev)4956 static void gaudi2_halt_arcs(struct hl_device *hdev)
4957 {
4958 u16 arc_id;
4959
4960 for (arc_id = CPU_ID_SCHED_ARC0; arc_id < CPU_ID_MAX; arc_id++) {
4961 if (gaudi2_is_arc_enabled(hdev, arc_id))
4962 gaudi2_set_arc_running_mode(hdev, arc_id, HL_ENGINE_CORE_HALT);
4963 }
4964 }
4965
gaudi2_verify_arc_running_mode(struct hl_device * hdev,u32 cpu_id,u32 run_mode)4966 static int gaudi2_verify_arc_running_mode(struct hl_device *hdev, u32 cpu_id, u32 run_mode)
4967 {
4968 int rc;
4969 u32 reg_base, val, ack_mask, timeout_usec = 100000;
4970
4971 if (hdev->pldm)
4972 timeout_usec *= 100;
4973
4974 reg_base = gaudi2_arc_blocks_bases[cpu_id];
4975 if (run_mode == HL_ENGINE_CORE_RUN)
4976 ack_mask = ARC_FARM_ARC0_AUX_RUN_HALT_ACK_RUN_ACK_MASK;
4977 else
4978 ack_mask = ARC_FARM_ARC0_AUX_RUN_HALT_ACK_HALT_ACK_MASK;
4979
4980 rc = hl_poll_timeout(hdev, reg_base + ARC_HALT_ACK_OFFSET,
4981 val, ((val & ack_mask) == ack_mask),
4982 1000, timeout_usec);
4983
4984 if (!rc) {
4985 /* Clear */
4986 val = FIELD_PREP(ARC_FARM_ARC0_AUX_RUN_HALT_REQ_RUN_REQ_MASK, 0);
4987 WREG32(reg_base + ARC_HALT_REQ_OFFSET, val);
4988 }
4989
4990 return rc;
4991 }
4992
gaudi2_reset_arcs(struct hl_device * hdev)4993 static void gaudi2_reset_arcs(struct hl_device *hdev)
4994 {
4995 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4996 u16 arc_id;
4997
4998 if (!gaudi2)
4999 return;
5000
5001 for (arc_id = CPU_ID_SCHED_ARC0; arc_id < CPU_ID_MAX; arc_id++)
5002 if (gaudi2_is_arc_enabled(hdev, arc_id))
5003 gaudi2_clr_arc_id_cap(hdev, arc_id);
5004 }
5005
gaudi2_nic_qmans_manual_flush(struct hl_device * hdev)5006 static void gaudi2_nic_qmans_manual_flush(struct hl_device *hdev)
5007 {
5008 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5009 u32 queue_id;
5010 int i;
5011
5012 if (!(gaudi2->nic_hw_cap_initialized & HW_CAP_NIC_MASK))
5013 return;
5014
5015 queue_id = GAUDI2_QUEUE_ID_NIC_0_0;
5016
5017 for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++, queue_id += NUM_OF_PQ_PER_QMAN) {
5018 if (!(hdev->nic_ports_mask & BIT(i)))
5019 continue;
5020
5021 gaudi2_qman_manual_flush_common(hdev, queue_id);
5022 }
5023 }
5024
gaudi2_set_engine_cores(struct hl_device * hdev,u32 * core_ids,u32 num_cores,u32 core_command)5025 static int gaudi2_set_engine_cores(struct hl_device *hdev, u32 *core_ids,
5026 u32 num_cores, u32 core_command)
5027 {
5028 int i, rc;
5029
5030 for (i = 0 ; i < num_cores ; i++) {
5031 if (gaudi2_is_arc_enabled(hdev, core_ids[i]))
5032 gaudi2_set_arc_running_mode(hdev, core_ids[i], core_command);
5033 }
5034
5035 for (i = 0 ; i < num_cores ; i++) {
5036 if (gaudi2_is_arc_enabled(hdev, core_ids[i])) {
5037 rc = gaudi2_verify_arc_running_mode(hdev, core_ids[i], core_command);
5038
5039 if (rc) {
5040 dev_err(hdev->dev, "failed to %s arc: %d\n",
5041 (core_command == HL_ENGINE_CORE_HALT) ?
5042 "HALT" : "RUN", core_ids[i]);
5043 return -1;
5044 }
5045 }
5046 }
5047
5048 return 0;
5049 }
5050
gaudi2_set_tpc_engine_mode(struct hl_device * hdev,u32 engine_id,u32 engine_command)5051 static int gaudi2_set_tpc_engine_mode(struct hl_device *hdev, u32 engine_id, u32 engine_command)
5052 {
5053 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5054 u32 reg_base, reg_addr, reg_val, tpc_id;
5055
5056 if (!(gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK))
5057 return 0;
5058
5059 tpc_id = gaudi2_tpc_engine_id_to_tpc_id[engine_id];
5060 if (!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(HW_CAP_TPC_SHIFT + tpc_id)))
5061 return 0;
5062
5063 reg_base = gaudi2_tpc_cfg_blocks_bases[tpc_id];
5064 reg_addr = reg_base + TPC_CFG_STALL_OFFSET;
5065 reg_val = FIELD_PREP(DCORE0_TPC0_CFG_TPC_STALL_V_MASK,
5066 (engine_command == HL_ENGINE_STALL) ? 1 : 0);
5067 WREG32(reg_addr, reg_val);
5068
5069 if (engine_command == HL_ENGINE_RESUME) {
5070 reg_base = gaudi2_tpc_eml_cfg_blocks_bases[tpc_id];
5071 reg_addr = reg_base + TPC_EML_CFG_DBG_CNT_OFFSET;
5072 RMWREG32(reg_addr, 0x1, DCORE0_TPC0_EML_CFG_DBG_CNT_DBG_EXIT_MASK);
5073 }
5074
5075 return 0;
5076 }
5077
gaudi2_set_mme_engine_mode(struct hl_device * hdev,u32 engine_id,u32 engine_command)5078 static int gaudi2_set_mme_engine_mode(struct hl_device *hdev, u32 engine_id, u32 engine_command)
5079 {
5080 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5081 u32 reg_base, reg_addr, reg_val, mme_id;
5082
5083 mme_id = gaudi2_mme_engine_id_to_mme_id[engine_id];
5084 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_MME_SHIFT + mme_id)))
5085 return 0;
5086
5087 reg_base = gaudi2_mme_ctrl_lo_blocks_bases[mme_id];
5088 reg_addr = reg_base + MME_CTRL_LO_QM_STALL_OFFSET;
5089 reg_val = FIELD_PREP(DCORE0_MME_CTRL_LO_QM_STALL_V_MASK,
5090 (engine_command == HL_ENGINE_STALL) ? 1 : 0);
5091 WREG32(reg_addr, reg_val);
5092
5093 return 0;
5094 }
5095
gaudi2_set_edma_engine_mode(struct hl_device * hdev,u32 engine_id,u32 engine_command)5096 static int gaudi2_set_edma_engine_mode(struct hl_device *hdev, u32 engine_id, u32 engine_command)
5097 {
5098 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5099 u32 reg_base, reg_addr, reg_val, edma_id;
5100
5101 if (!(gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK))
5102 return 0;
5103
5104 edma_id = gaudi2_edma_engine_id_to_edma_id[engine_id];
5105 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_EDMA_SHIFT + edma_id)))
5106 return 0;
5107
5108 reg_base = gaudi2_dma_core_blocks_bases[edma_id];
5109 reg_addr = reg_base + EDMA_CORE_CFG_STALL_OFFSET;
5110 reg_val = FIELD_PREP(DCORE0_EDMA0_CORE_CFG_1_HALT_MASK,
5111 (engine_command == HL_ENGINE_STALL) ? 1 : 0);
5112 WREG32(reg_addr, reg_val);
5113
5114 if (engine_command == HL_ENGINE_STALL) {
5115 reg_val = FIELD_PREP(DCORE0_EDMA0_CORE_CFG_1_HALT_MASK, 0x1) |
5116 FIELD_PREP(DCORE0_EDMA0_CORE_CFG_1_FLUSH_MASK, 0x1);
5117 WREG32(reg_addr, reg_val);
5118 }
5119
5120 return 0;
5121 }
5122
gaudi2_set_engine_modes(struct hl_device * hdev,u32 * engine_ids,u32 num_engines,u32 engine_command)5123 static int gaudi2_set_engine_modes(struct hl_device *hdev,
5124 u32 *engine_ids, u32 num_engines, u32 engine_command)
5125 {
5126 int i, rc;
5127
5128 for (i = 0 ; i < num_engines ; ++i) {
5129 switch (engine_ids[i]) {
5130 case GAUDI2_DCORE0_ENGINE_ID_TPC_0 ... GAUDI2_DCORE0_ENGINE_ID_TPC_5:
5131 case GAUDI2_DCORE1_ENGINE_ID_TPC_0 ... GAUDI2_DCORE1_ENGINE_ID_TPC_5:
5132 case GAUDI2_DCORE2_ENGINE_ID_TPC_0 ... GAUDI2_DCORE2_ENGINE_ID_TPC_5:
5133 case GAUDI2_DCORE3_ENGINE_ID_TPC_0 ... GAUDI2_DCORE3_ENGINE_ID_TPC_5:
5134 rc = gaudi2_set_tpc_engine_mode(hdev, engine_ids[i], engine_command);
5135 if (rc)
5136 return rc;
5137
5138 break;
5139 case GAUDI2_DCORE0_ENGINE_ID_MME:
5140 case GAUDI2_DCORE1_ENGINE_ID_MME:
5141 case GAUDI2_DCORE2_ENGINE_ID_MME:
5142 case GAUDI2_DCORE3_ENGINE_ID_MME:
5143 rc = gaudi2_set_mme_engine_mode(hdev, engine_ids[i], engine_command);
5144 if (rc)
5145 return rc;
5146
5147 break;
5148 case GAUDI2_DCORE0_ENGINE_ID_EDMA_0 ... GAUDI2_DCORE0_ENGINE_ID_EDMA_1:
5149 case GAUDI2_DCORE1_ENGINE_ID_EDMA_0 ... GAUDI2_DCORE1_ENGINE_ID_EDMA_1:
5150 case GAUDI2_DCORE2_ENGINE_ID_EDMA_0 ... GAUDI2_DCORE2_ENGINE_ID_EDMA_1:
5151 case GAUDI2_DCORE3_ENGINE_ID_EDMA_0 ... GAUDI2_DCORE3_ENGINE_ID_EDMA_1:
5152 rc = gaudi2_set_edma_engine_mode(hdev, engine_ids[i], engine_command);
5153 if (rc)
5154 return rc;
5155
5156 break;
5157 default:
5158 dev_err(hdev->dev, "Invalid engine ID %u\n", engine_ids[i]);
5159 return -EINVAL;
5160 }
5161 }
5162
5163 return 0;
5164 }
5165
gaudi2_set_engines(struct hl_device * hdev,u32 * engine_ids,u32 num_engines,u32 engine_command)5166 static int gaudi2_set_engines(struct hl_device *hdev, u32 *engine_ids,
5167 u32 num_engines, u32 engine_command)
5168 {
5169 switch (engine_command) {
5170 case HL_ENGINE_CORE_HALT:
5171 case HL_ENGINE_CORE_RUN:
5172 return gaudi2_set_engine_cores(hdev, engine_ids, num_engines, engine_command);
5173
5174 case HL_ENGINE_STALL:
5175 case HL_ENGINE_RESUME:
5176 return gaudi2_set_engine_modes(hdev, engine_ids, num_engines, engine_command);
5177
5178 default:
5179 dev_err(hdev->dev, "failed to execute command id %u\n", engine_command);
5180 return -EINVAL;
5181 }
5182 }
5183
gaudi2_halt_engines(struct hl_device * hdev,bool hard_reset,bool fw_reset)5184 static void gaudi2_halt_engines(struct hl_device *hdev, bool hard_reset, bool fw_reset)
5185 {
5186 u32 wait_timeout_ms;
5187
5188 if (hdev->pldm)
5189 wait_timeout_ms = GAUDI2_PLDM_RESET_WAIT_MSEC;
5190 else
5191 wait_timeout_ms = GAUDI2_RESET_WAIT_MSEC;
5192
5193 if (fw_reset || hdev->cpld_shutdown)
5194 goto skip_engines;
5195
5196 gaudi2_stop_dma_qmans(hdev);
5197 gaudi2_stop_mme_qmans(hdev);
5198 gaudi2_stop_tpc_qmans(hdev);
5199 gaudi2_stop_rot_qmans(hdev);
5200 gaudi2_stop_nic_qmans(hdev);
5201 msleep(wait_timeout_ms);
5202
5203 gaudi2_halt_arcs(hdev);
5204 gaudi2_dma_stall(hdev);
5205 gaudi2_mme_stall(hdev);
5206 gaudi2_tpc_stall(hdev);
5207 gaudi2_rotator_stall(hdev);
5208
5209 msleep(wait_timeout_ms);
5210
5211 gaudi2_stop_dec(hdev);
5212
5213 /*
5214 * in case of soft reset do a manual flush for QMANs (currently called
5215 * only for NIC QMANs
5216 */
5217 if (!hard_reset)
5218 gaudi2_nic_qmans_manual_flush(hdev);
5219
5220 gaudi2_disable_dma_qmans(hdev);
5221 gaudi2_disable_mme_qmans(hdev);
5222 gaudi2_disable_tpc_qmans(hdev);
5223 gaudi2_disable_rot_qmans(hdev);
5224 gaudi2_disable_nic_qmans(hdev);
5225 gaudi2_disable_timestamp(hdev);
5226
5227 skip_engines:
5228 if (hard_reset) {
5229 gaudi2_disable_msix(hdev);
5230 return;
5231 }
5232
5233 gaudi2_sync_irqs(hdev);
5234 }
5235
gaudi2_init_firmware_preload_params(struct hl_device * hdev)5236 static void gaudi2_init_firmware_preload_params(struct hl_device *hdev)
5237 {
5238 struct pre_fw_load_props *pre_fw_load = &hdev->fw_loader.pre_fw_load;
5239
5240 pre_fw_load->cpu_boot_status_reg = mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS;
5241 pre_fw_load->sts_boot_dev_sts0_reg = mmCPU_BOOT_DEV_STS0;
5242 pre_fw_load->sts_boot_dev_sts1_reg = mmCPU_BOOT_DEV_STS1;
5243 pre_fw_load->boot_err0_reg = mmCPU_BOOT_ERR0;
5244 pre_fw_load->boot_err1_reg = mmCPU_BOOT_ERR1;
5245 pre_fw_load->wait_for_preboot_timeout = GAUDI2_PREBOOT_REQ_TIMEOUT_USEC;
5246 pre_fw_load->wait_for_preboot_extended_timeout =
5247 GAUDI2_PREBOOT_EXTENDED_REQ_TIMEOUT_USEC;
5248 }
5249
gaudi2_init_firmware_loader(struct hl_device * hdev)5250 static void gaudi2_init_firmware_loader(struct hl_device *hdev)
5251 {
5252 struct fw_load_mgr *fw_loader = &hdev->fw_loader;
5253 struct dynamic_fw_load_mgr *dynamic_loader;
5254 struct cpu_dyn_regs *dyn_regs;
5255
5256 /* fill common fields */
5257 fw_loader->fw_comp_loaded = FW_TYPE_NONE;
5258 fw_loader->boot_fit_img.image_name = GAUDI2_BOOT_FIT_FILE;
5259 fw_loader->linux_img.image_name = GAUDI2_LINUX_FW_FILE;
5260 fw_loader->boot_fit_timeout = GAUDI2_BOOT_FIT_REQ_TIMEOUT_USEC;
5261 fw_loader->skip_bmc = false;
5262 fw_loader->sram_bar_id = SRAM_CFG_BAR_ID;
5263 fw_loader->dram_bar_id = DRAM_BAR_ID;
5264 fw_loader->cpu_timeout = GAUDI2_CPU_TIMEOUT_USEC;
5265
5266 /* here we update initial values for few specific dynamic regs (as
5267 * before reading the first descriptor from FW those value has to be
5268 * hard-coded). in later stages of the protocol those values will be
5269 * updated automatically by reading the FW descriptor so data there
5270 * will always be up-to-date
5271 */
5272 dynamic_loader = &hdev->fw_loader.dynamic_loader;
5273 dyn_regs = &dynamic_loader->comm_desc.cpu_dyn_regs;
5274 dyn_regs->kmd_msg_to_cpu = cpu_to_le32(mmPSOC_GLOBAL_CONF_KMD_MSG_TO_CPU);
5275 dyn_regs->cpu_cmd_status_to_host = cpu_to_le32(mmCPU_CMD_STATUS_TO_HOST);
5276 dynamic_loader->wait_for_bl_timeout = GAUDI2_WAIT_FOR_BL_TIMEOUT_USEC;
5277 }
5278
gaudi2_init_cpu(struct hl_device * hdev)5279 static int gaudi2_init_cpu(struct hl_device *hdev)
5280 {
5281 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5282 int rc;
5283
5284 if (!(hdev->fw_components & FW_TYPE_PREBOOT_CPU))
5285 return 0;
5286
5287 if (gaudi2->hw_cap_initialized & HW_CAP_CPU)
5288 return 0;
5289
5290 rc = hl_fw_init_cpu(hdev);
5291 if (rc)
5292 return rc;
5293
5294 gaudi2->hw_cap_initialized |= HW_CAP_CPU;
5295
5296 return 0;
5297 }
5298
gaudi2_init_cpu_queues(struct hl_device * hdev,u32 cpu_timeout)5299 static int gaudi2_init_cpu_queues(struct hl_device *hdev, u32 cpu_timeout)
5300 {
5301 struct hl_hw_queue *cpu_pq = &hdev->kernel_queues[GAUDI2_QUEUE_ID_CPU_PQ];
5302 struct asic_fixed_properties *prop = &hdev->asic_prop;
5303 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5304 struct cpu_dyn_regs *dyn_regs;
5305 struct hl_eq *eq;
5306 u32 status;
5307 int err;
5308
5309 if (!hdev->cpu_queues_enable)
5310 return 0;
5311
5312 if (gaudi2->hw_cap_initialized & HW_CAP_CPU_Q)
5313 return 0;
5314
5315 eq = &hdev->event_queue;
5316
5317 dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
5318
5319 WREG32(mmCPU_IF_PQ_BASE_ADDR_LOW, lower_32_bits(cpu_pq->bus_address));
5320 WREG32(mmCPU_IF_PQ_BASE_ADDR_HIGH, upper_32_bits(cpu_pq->bus_address));
5321
5322 WREG32(mmCPU_IF_EQ_BASE_ADDR_LOW, lower_32_bits(eq->bus_address));
5323 WREG32(mmCPU_IF_EQ_BASE_ADDR_HIGH, upper_32_bits(eq->bus_address));
5324
5325 WREG32(mmCPU_IF_CQ_BASE_ADDR_LOW, lower_32_bits(hdev->cpu_accessible_dma_address));
5326 WREG32(mmCPU_IF_CQ_BASE_ADDR_HIGH, upper_32_bits(hdev->cpu_accessible_dma_address));
5327
5328 WREG32(mmCPU_IF_PQ_LENGTH, HL_QUEUE_SIZE_IN_BYTES);
5329 WREG32(mmCPU_IF_EQ_LENGTH, HL_EQ_SIZE_IN_BYTES);
5330 WREG32(mmCPU_IF_CQ_LENGTH, HL_CPU_ACCESSIBLE_MEM_SIZE);
5331
5332 /* Used for EQ CI */
5333 WREG32(mmCPU_IF_EQ_RD_OFFS, 0);
5334
5335 WREG32(mmCPU_IF_PF_PQ_PI, 0);
5336
5337 WREG32(mmCPU_IF_QUEUE_INIT, PQ_INIT_STATUS_READY_FOR_CP);
5338
5339 /* Let the ARC know we are ready as it is now handling those queues */
5340
5341 WREG32(le32_to_cpu(dyn_regs->gic_host_pi_upd_irq),
5342 gaudi2_irq_map_table[GAUDI2_EVENT_CPU_PI_UPDATE].cpu_id);
5343
5344 err = hl_poll_timeout(
5345 hdev,
5346 mmCPU_IF_QUEUE_INIT,
5347 status,
5348 (status == PQ_INIT_STATUS_READY_FOR_HOST),
5349 1000,
5350 cpu_timeout);
5351
5352 if (err) {
5353 dev_err(hdev->dev, "Failed to communicate with device CPU (timeout)\n");
5354 return -EIO;
5355 }
5356
5357 /* update FW application security bits */
5358 if (prop->fw_cpu_boot_dev_sts0_valid)
5359 prop->fw_app_cpu_boot_dev_sts0 = RREG32(mmCPU_BOOT_DEV_STS0);
5360
5361 if (prop->fw_cpu_boot_dev_sts1_valid)
5362 prop->fw_app_cpu_boot_dev_sts1 = RREG32(mmCPU_BOOT_DEV_STS1);
5363
5364 gaudi2->hw_cap_initialized |= HW_CAP_CPU_Q;
5365 return 0;
5366 }
5367
gaudi2_init_qman_pq(struct hl_device * hdev,u32 reg_base,u32 queue_id_base)5368 static void gaudi2_init_qman_pq(struct hl_device *hdev, u32 reg_base,
5369 u32 queue_id_base)
5370 {
5371 struct hl_hw_queue *q;
5372 u32 pq_id, pq_offset;
5373
5374 for (pq_id = 0 ; pq_id < NUM_OF_PQ_PER_QMAN ; pq_id++) {
5375 q = &hdev->kernel_queues[queue_id_base + pq_id];
5376 pq_offset = pq_id * 4;
5377
5378 if (q->dram_bd) {
5379 WREG32(reg_base + QM_PQ_BASE_LO_0_OFFSET + pq_offset,
5380 lower_32_bits(q->pq_dram_address));
5381 WREG32(reg_base + QM_PQ_BASE_HI_0_OFFSET + pq_offset,
5382 upper_32_bits(q->pq_dram_address));
5383 } else {
5384 WREG32(reg_base + QM_PQ_BASE_LO_0_OFFSET + pq_offset,
5385 lower_32_bits(q->bus_address));
5386 WREG32(reg_base + QM_PQ_BASE_HI_0_OFFSET + pq_offset,
5387 upper_32_bits(q->bus_address));
5388 }
5389 WREG32(reg_base + QM_PQ_SIZE_0_OFFSET + pq_offset, ilog2(HL_QUEUE_LENGTH));
5390 WREG32(reg_base + QM_PQ_PI_0_OFFSET + pq_offset, 0);
5391 WREG32(reg_base + QM_PQ_CI_0_OFFSET + pq_offset, 0);
5392 }
5393 }
5394
gaudi2_init_qman_cp(struct hl_device * hdev,u32 reg_base)5395 static void gaudi2_init_qman_cp(struct hl_device *hdev, u32 reg_base)
5396 {
5397 u32 cp_id, cp_offset, mtr_base_lo, mtr_base_hi, so_base_lo, so_base_hi;
5398
5399 mtr_base_lo = lower_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
5400 mtr_base_hi = upper_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
5401 so_base_lo = lower_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);
5402 so_base_hi = upper_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);
5403
5404 for (cp_id = 0 ; cp_id < NUM_OF_CP_PER_QMAN; cp_id++) {
5405 cp_offset = cp_id * 4;
5406
5407 WREG32(reg_base + QM_CP_MSG_BASE0_ADDR_LO_0_OFFSET + cp_offset, mtr_base_lo);
5408 WREG32(reg_base + QM_CP_MSG_BASE0_ADDR_HI_0_OFFSET + cp_offset, mtr_base_hi);
5409 WREG32(reg_base + QM_CP_MSG_BASE1_ADDR_LO_0_OFFSET + cp_offset, so_base_lo);
5410 WREG32(reg_base + QM_CP_MSG_BASE1_ADDR_HI_0_OFFSET + cp_offset, so_base_hi);
5411 }
5412
5413 /* allow QMANs to accept work from ARC CQF */
5414 WREG32(reg_base + QM_CP_CFG_OFFSET, FIELD_PREP(PDMA0_QM_CP_CFG_SWITCH_EN_MASK, 0x1));
5415 }
5416
gaudi2_init_qman_pqc(struct hl_device * hdev,u32 reg_base,u32 queue_id_base)5417 static void gaudi2_init_qman_pqc(struct hl_device *hdev, u32 reg_base,
5418 u32 queue_id_base)
5419 {
5420 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5421 u32 pq_id, pq_offset, so_base_lo, so_base_hi;
5422
5423 so_base_lo = lower_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);
5424 so_base_hi = upper_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);
5425
5426 for (pq_id = 0 ; pq_id < NUM_OF_PQ_PER_QMAN ; pq_id++) {
5427 pq_offset = pq_id * 4;
5428
5429 /* Configure QMAN HBW to scratchpad as it is not needed */
5430 WREG32(reg_base + QM_PQC_HBW_BASE_LO_0_OFFSET + pq_offset,
5431 lower_32_bits(gaudi2->scratchpad_bus_address));
5432 WREG32(reg_base + QM_PQC_HBW_BASE_HI_0_OFFSET + pq_offset,
5433 upper_32_bits(gaudi2->scratchpad_bus_address));
5434 WREG32(reg_base + QM_PQC_SIZE_0_OFFSET + pq_offset,
5435 ilog2(PAGE_SIZE / sizeof(struct hl_cq_entry)));
5436
5437 WREG32(reg_base + QM_PQC_PI_0_OFFSET + pq_offset, 0);
5438 WREG32(reg_base + QM_PQC_LBW_WDATA_0_OFFSET + pq_offset, QM_PQC_LBW_WDATA);
5439 WREG32(reg_base + QM_PQC_LBW_BASE_LO_0_OFFSET + pq_offset, so_base_lo);
5440 WREG32(reg_base + QM_PQC_LBW_BASE_HI_0_OFFSET + pq_offset, so_base_hi);
5441 }
5442
5443 /* Enable QMAN H/W completion */
5444 WREG32(reg_base + QM_PQC_CFG_OFFSET, 1 << PDMA0_QM_PQC_CFG_EN_SHIFT);
5445 }
5446
gaudi2_get_dyn_sp_reg(struct hl_device * hdev,u32 queue_id_base)5447 static u32 gaudi2_get_dyn_sp_reg(struct hl_device *hdev, u32 queue_id_base)
5448 {
5449 struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
5450 u32 sp_reg_addr;
5451
5452 switch (queue_id_base) {
5453 case GAUDI2_QUEUE_ID_PDMA_0_0...GAUDI2_QUEUE_ID_PDMA_1_3:
5454 fallthrough;
5455 case GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3:
5456 fallthrough;
5457 case GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3:
5458 fallthrough;
5459 case GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3:
5460 fallthrough;
5461 case GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3:
5462 sp_reg_addr = le32_to_cpu(dyn_regs->gic_dma_qm_irq_ctrl);
5463 break;
5464 case GAUDI2_QUEUE_ID_DCORE0_MME_0_0...GAUDI2_QUEUE_ID_DCORE0_MME_0_3:
5465 fallthrough;
5466 case GAUDI2_QUEUE_ID_DCORE1_MME_0_0...GAUDI2_QUEUE_ID_DCORE1_MME_0_3:
5467 fallthrough;
5468 case GAUDI2_QUEUE_ID_DCORE2_MME_0_0...GAUDI2_QUEUE_ID_DCORE2_MME_0_3:
5469 fallthrough;
5470 case GAUDI2_QUEUE_ID_DCORE3_MME_0_0...GAUDI2_QUEUE_ID_DCORE3_MME_0_3:
5471 sp_reg_addr = le32_to_cpu(dyn_regs->gic_mme_qm_irq_ctrl);
5472 break;
5473 case GAUDI2_QUEUE_ID_DCORE0_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE0_TPC_6_3:
5474 fallthrough;
5475 case GAUDI2_QUEUE_ID_DCORE1_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE1_TPC_5_3:
5476 fallthrough;
5477 case GAUDI2_QUEUE_ID_DCORE2_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE2_TPC_5_3:
5478 fallthrough;
5479 case GAUDI2_QUEUE_ID_DCORE3_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE3_TPC_5_3:
5480 sp_reg_addr = le32_to_cpu(dyn_regs->gic_tpc_qm_irq_ctrl);
5481 break;
5482 case GAUDI2_QUEUE_ID_ROT_0_0...GAUDI2_QUEUE_ID_ROT_1_3:
5483 sp_reg_addr = le32_to_cpu(dyn_regs->gic_rot_qm_irq_ctrl);
5484 break;
5485 case GAUDI2_QUEUE_ID_NIC_0_0...GAUDI2_QUEUE_ID_NIC_23_3:
5486 sp_reg_addr = le32_to_cpu(dyn_regs->gic_nic_qm_irq_ctrl);
5487 break;
5488 default:
5489 dev_err(hdev->dev, "Unexpected h/w queue %d\n", queue_id_base);
5490 return 0;
5491 }
5492
5493 return sp_reg_addr;
5494 }
5495
gaudi2_init_qman_common(struct hl_device * hdev,u32 reg_base,u32 queue_id_base)5496 static void gaudi2_init_qman_common(struct hl_device *hdev, u32 reg_base,
5497 u32 queue_id_base)
5498 {
5499 u32 glbl_prot = QMAN_MAKE_TRUSTED, irq_handler_offset;
5500 int map_table_entry;
5501
5502 WREG32(reg_base + QM_GLBL_PROT_OFFSET, glbl_prot);
5503
5504 irq_handler_offset = gaudi2_get_dyn_sp_reg(hdev, queue_id_base);
5505 WREG32(reg_base + QM_GLBL_ERR_ADDR_LO_OFFSET, lower_32_bits(CFG_BASE + irq_handler_offset));
5506 WREG32(reg_base + QM_GLBL_ERR_ADDR_HI_OFFSET, upper_32_bits(CFG_BASE + irq_handler_offset));
5507
5508 map_table_entry = gaudi2_qman_async_event_id[queue_id_base];
5509 WREG32(reg_base + QM_GLBL_ERR_WDATA_OFFSET,
5510 gaudi2_irq_map_table[map_table_entry].cpu_id);
5511
5512 WREG32(reg_base + QM_ARB_ERR_MSG_EN_OFFSET, QM_ARB_ERR_MSG_EN_MASK);
5513
5514 WREG32(reg_base + QM_ARB_SLV_CHOISE_WDT_OFFSET, GAUDI2_ARB_WDT_TIMEOUT);
5515 WREG32(reg_base + QM_GLBL_CFG1_OFFSET, 0);
5516 WREG32(reg_base + QM_GLBL_CFG2_OFFSET, 0);
5517
5518 /* Enable the QMAN channel.
5519 * PDMA QMAN configuration is different, as we do not allow user to
5520 * access some of the CPs.
5521 * PDMA0: CP2/3 are reserved for the ARC usage.
5522 * PDMA1: CP1/2/3 are reserved for the ARC usage.
5523 */
5524 if (reg_base == gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_PDMA_1_0])
5525 WREG32(reg_base + QM_GLBL_CFG0_OFFSET, PDMA1_QMAN_ENABLE);
5526 else if (reg_base == gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_PDMA_0_0])
5527 WREG32(reg_base + QM_GLBL_CFG0_OFFSET, PDMA0_QMAN_ENABLE);
5528 else
5529 WREG32(reg_base + QM_GLBL_CFG0_OFFSET, QMAN_ENABLE);
5530 }
5531
gaudi2_init_qman(struct hl_device * hdev,u32 reg_base,u32 queue_id_base)5532 static void gaudi2_init_qman(struct hl_device *hdev, u32 reg_base,
5533 u32 queue_id_base)
5534 {
5535 u32 pq_id;
5536
5537 for (pq_id = 0 ; pq_id < NUM_OF_PQ_PER_QMAN ; pq_id++)
5538 hdev->kernel_queues[queue_id_base + pq_id].cq_id = GAUDI2_RESERVED_CQ_CS_COMPLETION;
5539
5540 gaudi2_init_qman_pq(hdev, reg_base, queue_id_base);
5541 gaudi2_init_qman_cp(hdev, reg_base);
5542 gaudi2_init_qman_pqc(hdev, reg_base, queue_id_base);
5543 gaudi2_init_qman_common(hdev, reg_base, queue_id_base);
5544 }
5545
gaudi2_init_dma_core(struct hl_device * hdev,u32 reg_base,u32 dma_core_id,bool is_secure)5546 static void gaudi2_init_dma_core(struct hl_device *hdev, u32 reg_base,
5547 u32 dma_core_id, bool is_secure)
5548 {
5549 u32 prot, irq_handler_offset;
5550 struct cpu_dyn_regs *dyn_regs;
5551 int map_table_entry;
5552
5553 prot = 1 << ARC_FARM_KDMA_PROT_ERR_VAL_SHIFT;
5554 if (is_secure)
5555 prot |= 1 << ARC_FARM_KDMA_PROT_VAL_SHIFT;
5556
5557 WREG32(reg_base + DMA_CORE_PROT_OFFSET, prot);
5558
5559 dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
5560 irq_handler_offset = le32_to_cpu(dyn_regs->gic_dma_core_irq_ctrl);
5561
5562 WREG32(reg_base + DMA_CORE_ERRMSG_ADDR_LO_OFFSET,
5563 lower_32_bits(CFG_BASE + irq_handler_offset));
5564
5565 WREG32(reg_base + DMA_CORE_ERRMSG_ADDR_HI_OFFSET,
5566 upper_32_bits(CFG_BASE + irq_handler_offset));
5567
5568 map_table_entry = gaudi2_dma_core_async_event_id[dma_core_id];
5569 WREG32(reg_base + DMA_CORE_ERRMSG_WDATA_OFFSET,
5570 gaudi2_irq_map_table[map_table_entry].cpu_id);
5571
5572 /* Enable the DMA channel */
5573 WREG32(reg_base + DMA_CORE_CFG_0_OFFSET, 1 << ARC_FARM_KDMA_CFG_0_EN_SHIFT);
5574 }
5575
gaudi2_init_kdma(struct hl_device * hdev)5576 static void gaudi2_init_kdma(struct hl_device *hdev)
5577 {
5578 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5579 u32 reg_base;
5580
5581 if ((gaudi2->hw_cap_initialized & HW_CAP_KDMA) == HW_CAP_KDMA)
5582 return;
5583
5584 reg_base = gaudi2_dma_core_blocks_bases[DMA_CORE_ID_KDMA];
5585
5586 gaudi2_init_dma_core(hdev, reg_base, DMA_CORE_ID_KDMA, true);
5587
5588 gaudi2->hw_cap_initialized |= HW_CAP_KDMA;
5589 }
5590
gaudi2_init_pdma(struct hl_device * hdev)5591 static void gaudi2_init_pdma(struct hl_device *hdev)
5592 {
5593 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5594 u32 reg_base;
5595
5596 if ((gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK) == HW_CAP_PDMA_MASK)
5597 return;
5598
5599 reg_base = gaudi2_dma_core_blocks_bases[DMA_CORE_ID_PDMA0];
5600 gaudi2_init_dma_core(hdev, reg_base, DMA_CORE_ID_PDMA0, false);
5601
5602 reg_base = gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_PDMA_0_0];
5603 gaudi2_init_qman(hdev, reg_base, GAUDI2_QUEUE_ID_PDMA_0_0);
5604
5605 reg_base = gaudi2_dma_core_blocks_bases[DMA_CORE_ID_PDMA1];
5606 gaudi2_init_dma_core(hdev, reg_base, DMA_CORE_ID_PDMA1, false);
5607
5608 reg_base = gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_PDMA_1_0];
5609 gaudi2_init_qman(hdev, reg_base, GAUDI2_QUEUE_ID_PDMA_1_0);
5610
5611 gaudi2->hw_cap_initialized |= HW_CAP_PDMA_MASK;
5612 }
5613
gaudi2_init_edma_instance(struct hl_device * hdev,u8 seq)5614 static void gaudi2_init_edma_instance(struct hl_device *hdev, u8 seq)
5615 {
5616 u32 reg_base, base_edma_core_id, base_edma_qman_id;
5617
5618 base_edma_core_id = DMA_CORE_ID_EDMA0 + seq;
5619 base_edma_qman_id = edma_stream_base[seq];
5620
5621 reg_base = gaudi2_dma_core_blocks_bases[base_edma_core_id];
5622 gaudi2_init_dma_core(hdev, reg_base, base_edma_core_id, false);
5623
5624 reg_base = gaudi2_qm_blocks_bases[base_edma_qman_id];
5625 gaudi2_init_qman(hdev, reg_base, base_edma_qman_id);
5626 }
5627
gaudi2_init_edma(struct hl_device * hdev)5628 static void gaudi2_init_edma(struct hl_device *hdev)
5629 {
5630 struct asic_fixed_properties *prop = &hdev->asic_prop;
5631 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5632 int dcore, inst;
5633
5634 if ((gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK) == HW_CAP_EDMA_MASK)
5635 return;
5636
5637 for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {
5638 for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {
5639 u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;
5640
5641 if (!(prop->edma_enabled_mask & BIT(seq)))
5642 continue;
5643
5644 gaudi2_init_edma_instance(hdev, seq);
5645
5646 gaudi2->hw_cap_initialized |= BIT_ULL(HW_CAP_EDMA_SHIFT + seq);
5647 }
5648 }
5649 }
5650
5651 /*
5652 * gaudi2_arm_monitors_for_virt_msix_db() - Arm monitors for writing to the virtual MSI-X doorbell.
5653 * @hdev: pointer to habanalabs device structure.
5654 * @sob_id: sync object ID.
5655 * @first_mon_id: ID of first monitor out of 3 consecutive monitors.
5656 * @interrupt_id: interrupt ID.
5657 *
5658 * Some initiators cannot have HBW address in their completion address registers, and thus cannot
5659 * write directly to the HBW host memory of the virtual MSI-X doorbell.
5660 * Instead, they are configured to LBW write to a sync object, and a monitor will do the HBW write.
5661 *
5662 * The mechanism in the sync manager block is composed of a master monitor with 3 messages.
5663 * In addition to the HBW write, the other 2 messages are for preparing the monitor to next
5664 * completion, by decrementing the sync object value and re-arming the monitor.
5665 */
gaudi2_arm_monitors_for_virt_msix_db(struct hl_device * hdev,u32 sob_id,u32 first_mon_id,u32 interrupt_id)5666 static void gaudi2_arm_monitors_for_virt_msix_db(struct hl_device *hdev, u32 sob_id,
5667 u32 first_mon_id, u32 interrupt_id)
5668 {
5669 u32 sob_offset, first_mon_offset, mon_offset, payload, sob_group, mode, arm, config;
5670 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5671 u64 addr;
5672 u8 mask;
5673
5674 /* Reset the SOB value */
5675 sob_offset = sob_id * sizeof(u32);
5676 WREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset, 0);
5677
5678 /* Configure 3 monitors:
5679 * 1. Write interrupt ID to the virtual MSI-X doorbell (master monitor)
5680 * 2. Decrement SOB value by 1.
5681 * 3. Re-arm the master monitor.
5682 */
5683
5684 first_mon_offset = first_mon_id * sizeof(u32);
5685
5686 /* 2nd monitor: Decrement SOB value by 1 */
5687 mon_offset = first_mon_offset + sizeof(u32);
5688
5689 addr = CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;
5690 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, lower_32_bits(addr));
5691 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + mon_offset, upper_32_bits(addr));
5692
5693 payload = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_VAL_MASK, 0x7FFF) | /* "-1" */
5694 FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_SIGN_MASK, 1) |
5695 FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_INC_MASK, 1);
5696 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, payload);
5697
5698 /* 3rd monitor: Re-arm the master monitor */
5699 mon_offset = first_mon_offset + 2 * sizeof(u32);
5700
5701 addr = CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + first_mon_offset;
5702 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, lower_32_bits(addr));
5703 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + mon_offset, upper_32_bits(addr));
5704
5705 sob_group = sob_id / 8;
5706 mask = ~BIT(sob_id & 0x7);
5707 mode = 0; /* comparison mode is "greater than or equal to" */
5708 arm = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SID_MASK, sob_group) |
5709 FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_MASK_MASK, mask) |
5710 FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOP_MASK, mode) |
5711 FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOD_MASK, 1);
5712
5713 payload = arm;
5714 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, payload);
5715
5716 /* 1st monitor (master): Write interrupt ID to the virtual MSI-X doorbell */
5717 mon_offset = first_mon_offset;
5718
5719 config = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_WR_NUM_MASK, 2); /* "2": 3 writes */
5720 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + mon_offset, config);
5721
5722 addr = gaudi2->virt_msix_db_dma_addr;
5723 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, lower_32_bits(addr));
5724 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + mon_offset, upper_32_bits(addr));
5725
5726 payload = interrupt_id;
5727 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, payload);
5728
5729 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + mon_offset, arm);
5730 }
5731
gaudi2_prepare_sm_for_virt_msix_db(struct hl_device * hdev)5732 static void gaudi2_prepare_sm_for_virt_msix_db(struct hl_device *hdev)
5733 {
5734 u32 decoder_id, sob_id, first_mon_id, interrupt_id;
5735 struct asic_fixed_properties *prop = &hdev->asic_prop;
5736
5737 /* Decoder normal/abnormal interrupts */
5738 for (decoder_id = 0 ; decoder_id < NUMBER_OF_DEC ; ++decoder_id) {
5739 if (!(prop->decoder_enabled_mask & BIT(decoder_id)))
5740 continue;
5741
5742 sob_id = GAUDI2_RESERVED_SOB_DEC_NRM_FIRST + decoder_id;
5743 first_mon_id = GAUDI2_RESERVED_MON_DEC_NRM_FIRST + 3 * decoder_id;
5744 interrupt_id = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM + 2 * decoder_id;
5745 gaudi2_arm_monitors_for_virt_msix_db(hdev, sob_id, first_mon_id, interrupt_id);
5746
5747 sob_id = GAUDI2_RESERVED_SOB_DEC_ABNRM_FIRST + decoder_id;
5748 first_mon_id = GAUDI2_RESERVED_MON_DEC_ABNRM_FIRST + 3 * decoder_id;
5749 interrupt_id += 1;
5750 gaudi2_arm_monitors_for_virt_msix_db(hdev, sob_id, first_mon_id, interrupt_id);
5751 }
5752 }
5753
gaudi2_init_sm(struct hl_device * hdev)5754 static void gaudi2_init_sm(struct hl_device *hdev)
5755 {
5756 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5757 u64 cq_address;
5758 u32 reg_val;
5759 int i;
5760
5761 /* Enable HBW/LBW CQ for completion monitors */
5762 reg_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_CQ_EN_MASK, 1);
5763 reg_val |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_LBW_EN_MASK, 1);
5764
5765 for (i = 0 ; i < GAUDI2_MAX_PENDING_CS ; i++)
5766 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + (4 * i), reg_val);
5767
5768 /* Enable only HBW CQ for KDMA completion monitor */
5769 reg_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_CQ_EN_MASK, 1);
5770 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + (4 * i), reg_val);
5771
5772 /* Init CQ0 DB - configure the monitor to trigger MSI-X interrupt */
5773 WREG32(mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0, lower_32_bits(gaudi2->virt_msix_db_dma_addr));
5774 WREG32(mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0, upper_32_bits(gaudi2->virt_msix_db_dma_addr));
5775 WREG32(mmDCORE0_SYNC_MNGR_GLBL_LBW_DATA_0, GAUDI2_IRQ_NUM_COMPLETION);
5776
5777 for (i = 0 ; i < GAUDI2_RESERVED_CQ_NUMBER ; i++) {
5778 cq_address =
5779 hdev->completion_queue[i].bus_address;
5780
5781 WREG32(mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_L_0 + (4 * i),
5782 lower_32_bits(cq_address));
5783 WREG32(mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_H_0 + (4 * i),
5784 upper_32_bits(cq_address));
5785 WREG32(mmDCORE0_SYNC_MNGR_GLBL_CQ_SIZE_LOG2_0 + (4 * i),
5786 ilog2(HL_CQ_SIZE_IN_BYTES));
5787 }
5788
5789 /* Configure kernel ASID and MMU BP*/
5790 WREG32(mmDCORE0_SYNC_MNGR_GLBL_ASID_SEC, 0x10000);
5791 WREG32(mmDCORE0_SYNC_MNGR_GLBL_ASID_NONE_SEC_PRIV, 0);
5792
5793 /* Initialize sync objects and monitors which are used for the virtual MSI-X doorbell */
5794 gaudi2_prepare_sm_for_virt_msix_db(hdev);
5795 }
5796
gaudi2_init_mme_acc(struct hl_device * hdev,u32 reg_base)5797 static void gaudi2_init_mme_acc(struct hl_device *hdev, u32 reg_base)
5798 {
5799 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5800 u32 reg_val;
5801 int i;
5802
5803 reg_val = FIELD_PREP(MME_ACC_INTR_MASK_WBC_ERR_RESP_MASK, 0);
5804 reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_SRC_POS_INF_MASK, 1);
5805 reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_SRC_NEG_INF_MASK, 1);
5806 reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_SRC_NAN_MASK, 1);
5807 reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_RESULT_POS_INF_MASK, 1);
5808 reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_RESULT_NEG_INF_MASK, 1);
5809
5810 WREG32(reg_base + MME_ACC_INTR_MASK_OFFSET, reg_val);
5811 WREG32(reg_base + MME_ACC_AP_LFSR_POLY_OFFSET, 0x80DEADAF);
5812
5813 for (i = 0 ; i < MME_NUM_OF_LFSR_SEEDS ; i++) {
5814 WREG32(reg_base + MME_ACC_AP_LFSR_SEED_SEL_OFFSET, i);
5815 WREG32(reg_base + MME_ACC_AP_LFSR_SEED_WDATA_OFFSET, gaudi2->lfsr_rand_seeds[i]);
5816 }
5817 }
5818
gaudi2_init_dcore_mme(struct hl_device * hdev,int dcore_id,bool config_qman_only)5819 static void gaudi2_init_dcore_mme(struct hl_device *hdev, int dcore_id,
5820 bool config_qman_only)
5821 {
5822 u32 queue_id_base, reg_base;
5823
5824 switch (dcore_id) {
5825 case 0:
5826 queue_id_base = GAUDI2_QUEUE_ID_DCORE0_MME_0_0;
5827 break;
5828 case 1:
5829 queue_id_base = GAUDI2_QUEUE_ID_DCORE1_MME_0_0;
5830 break;
5831 case 2:
5832 queue_id_base = GAUDI2_QUEUE_ID_DCORE2_MME_0_0;
5833 break;
5834 case 3:
5835 queue_id_base = GAUDI2_QUEUE_ID_DCORE3_MME_0_0;
5836 break;
5837 default:
5838 dev_err(hdev->dev, "Invalid dcore id %u\n", dcore_id);
5839 return;
5840 }
5841
5842 if (!config_qman_only) {
5843 reg_base = gaudi2_mme_acc_blocks_bases[dcore_id];
5844 gaudi2_init_mme_acc(hdev, reg_base);
5845 }
5846
5847 reg_base = gaudi2_qm_blocks_bases[queue_id_base];
5848 gaudi2_init_qman(hdev, reg_base, queue_id_base);
5849 }
5850
gaudi2_init_mme(struct hl_device * hdev)5851 static void gaudi2_init_mme(struct hl_device *hdev)
5852 {
5853 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5854 int i;
5855
5856 if ((gaudi2->hw_cap_initialized & HW_CAP_MME_MASK) == HW_CAP_MME_MASK)
5857 return;
5858
5859 for (i = 0 ; i < NUM_OF_DCORES ; i++) {
5860 gaudi2_init_dcore_mme(hdev, i, false);
5861
5862 gaudi2->hw_cap_initialized |= BIT_ULL(HW_CAP_MME_SHIFT + i);
5863 }
5864 }
5865
gaudi2_init_tpc_cfg(struct hl_device * hdev,u32 reg_base)5866 static void gaudi2_init_tpc_cfg(struct hl_device *hdev, u32 reg_base)
5867 {
5868 /* Mask arithmetic and QM interrupts in TPC */
5869 WREG32(reg_base + TPC_CFG_TPC_INTR_MASK_OFFSET, 0x23FFFE);
5870
5871 /* Set 16 cache lines */
5872 WREG32(reg_base + TPC_CFG_MSS_CONFIG_OFFSET,
5873 2 << DCORE0_TPC0_CFG_MSS_CONFIG_ICACHE_FETCH_LINE_NUM_SHIFT);
5874 }
5875
5876 struct gaudi2_tpc_init_cfg_data {
5877 enum gaudi2_queue_id dcore_tpc_qid_base[NUM_OF_DCORES];
5878 };
5879
gaudi2_init_tpc_config(struct hl_device * hdev,int dcore,int inst,u32 offset,struct iterate_module_ctx * ctx)5880 static void gaudi2_init_tpc_config(struct hl_device *hdev, int dcore, int inst,
5881 u32 offset, struct iterate_module_ctx *ctx)
5882 {
5883 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5884 struct gaudi2_tpc_init_cfg_data *cfg_data = ctx->data;
5885 u32 queue_id_base;
5886 u8 seq;
5887
5888 queue_id_base = cfg_data->dcore_tpc_qid_base[dcore] + (inst * NUM_OF_PQ_PER_QMAN);
5889
5890 if (dcore == 0 && inst == (NUM_DCORE0_TPC - 1))
5891 /* gets last sequence number */
5892 seq = NUM_OF_DCORES * NUM_OF_TPC_PER_DCORE;
5893 else
5894 seq = dcore * NUM_OF_TPC_PER_DCORE + inst;
5895
5896 gaudi2_init_tpc_cfg(hdev, mmDCORE0_TPC0_CFG_BASE + offset);
5897 gaudi2_init_qman(hdev, mmDCORE0_TPC0_QM_BASE + offset, queue_id_base);
5898
5899 gaudi2->tpc_hw_cap_initialized |= BIT_ULL(HW_CAP_TPC_SHIFT + seq);
5900 }
5901
gaudi2_init_tpc(struct hl_device * hdev)5902 static void gaudi2_init_tpc(struct hl_device *hdev)
5903 {
5904 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5905 struct gaudi2_tpc_init_cfg_data init_cfg_data;
5906 struct iterate_module_ctx tpc_iter;
5907
5908 if (!hdev->asic_prop.tpc_enabled_mask)
5909 return;
5910
5911 if ((gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK) == HW_CAP_TPC_MASK)
5912 return;
5913
5914 init_cfg_data.dcore_tpc_qid_base[0] = GAUDI2_QUEUE_ID_DCORE0_TPC_0_0;
5915 init_cfg_data.dcore_tpc_qid_base[1] = GAUDI2_QUEUE_ID_DCORE1_TPC_0_0;
5916 init_cfg_data.dcore_tpc_qid_base[2] = GAUDI2_QUEUE_ID_DCORE2_TPC_0_0;
5917 init_cfg_data.dcore_tpc_qid_base[3] = GAUDI2_QUEUE_ID_DCORE3_TPC_0_0;
5918 tpc_iter.fn = &gaudi2_init_tpc_config;
5919 tpc_iter.data = &init_cfg_data;
5920 gaudi2_iterate_tpcs(hdev, &tpc_iter);
5921 }
5922
gaudi2_init_rotator(struct hl_device * hdev)5923 static void gaudi2_init_rotator(struct hl_device *hdev)
5924 {
5925 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5926 u32 i, reg_base, queue_id;
5927
5928 queue_id = GAUDI2_QUEUE_ID_ROT_0_0;
5929
5930 for (i = 0 ; i < NUM_OF_ROT ; i++, queue_id += NUM_OF_PQ_PER_QMAN) {
5931 reg_base = gaudi2_qm_blocks_bases[queue_id];
5932 gaudi2_init_qman(hdev, reg_base, queue_id);
5933
5934 gaudi2->hw_cap_initialized |= BIT_ULL(HW_CAP_ROT_SHIFT + i);
5935 }
5936 }
5937
gaudi2_init_vdec_brdg_ctrl(struct hl_device * hdev,u64 base_addr,u32 decoder_id)5938 static void gaudi2_init_vdec_brdg_ctrl(struct hl_device *hdev, u64 base_addr, u32 decoder_id)
5939 {
5940 u32 sob_id;
5941
5942 /* VCMD normal interrupt */
5943 sob_id = GAUDI2_RESERVED_SOB_DEC_NRM_FIRST + decoder_id;
5944 WREG32(base_addr + BRDG_CTRL_NRM_MSIX_LBW_AWADDR,
5945 mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_id * sizeof(u32));
5946 WREG32(base_addr + BRDG_CTRL_NRM_MSIX_LBW_WDATA, GAUDI2_SOB_INCREMENT_BY_ONE);
5947
5948 /* VCMD abnormal interrupt */
5949 sob_id = GAUDI2_RESERVED_SOB_DEC_ABNRM_FIRST + decoder_id;
5950 WREG32(base_addr + BRDG_CTRL_ABNRM_MSIX_LBW_AWADDR,
5951 mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_id * sizeof(u32));
5952 WREG32(base_addr + BRDG_CTRL_ABNRM_MSIX_LBW_WDATA, GAUDI2_SOB_INCREMENT_BY_ONE);
5953 }
5954
gaudi2_init_dec(struct hl_device * hdev)5955 static void gaudi2_init_dec(struct hl_device *hdev)
5956 {
5957 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5958 u32 dcore_id, dec_id, dec_bit;
5959 u64 base_addr;
5960
5961 if (!hdev->asic_prop.decoder_enabled_mask)
5962 return;
5963
5964 if ((gaudi2->dec_hw_cap_initialized & HW_CAP_DEC_MASK) == HW_CAP_DEC_MASK)
5965 return;
5966
5967 for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++)
5968 for (dec_id = 0 ; dec_id < NUM_OF_DEC_PER_DCORE ; dec_id++) {
5969 dec_bit = dcore_id * NUM_OF_DEC_PER_DCORE + dec_id;
5970
5971 if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))
5972 continue;
5973
5974 base_addr = mmDCORE0_DEC0_CMD_BASE +
5975 BRDG_CTRL_BLOCK_OFFSET +
5976 dcore_id * DCORE_OFFSET +
5977 dec_id * DCORE_VDEC_OFFSET;
5978
5979 gaudi2_init_vdec_brdg_ctrl(hdev, base_addr, dec_bit);
5980
5981 gaudi2->dec_hw_cap_initialized |= BIT_ULL(HW_CAP_DEC_SHIFT + dec_bit);
5982 }
5983
5984 for (dec_id = 0 ; dec_id < NUM_OF_PCIE_VDEC ; dec_id++) {
5985 dec_bit = PCIE_DEC_SHIFT + dec_id;
5986 if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))
5987 continue;
5988
5989 base_addr = mmPCIE_DEC0_CMD_BASE + BRDG_CTRL_BLOCK_OFFSET +
5990 dec_id * DCORE_VDEC_OFFSET;
5991
5992 gaudi2_init_vdec_brdg_ctrl(hdev, base_addr, dec_bit);
5993
5994 gaudi2->dec_hw_cap_initialized |= BIT_ULL(HW_CAP_DEC_SHIFT + dec_bit);
5995 }
5996 }
5997
gaudi2_mmu_update_asid_hop0_addr(struct hl_device * hdev,u32 stlb_base,u32 asid,u64 phys_addr)5998 static int gaudi2_mmu_update_asid_hop0_addr(struct hl_device *hdev,
5999 u32 stlb_base, u32 asid, u64 phys_addr)
6000 {
6001 u32 status, timeout_usec;
6002 int rc;
6003
6004 if (hdev->pldm || !hdev->pdev)
6005 timeout_usec = GAUDI2_PLDM_MMU_TIMEOUT_USEC;
6006 else
6007 timeout_usec = MMU_CONFIG_TIMEOUT_USEC;
6008
6009 WREG32(stlb_base + STLB_ASID_OFFSET, asid);
6010 WREG32(stlb_base + STLB_HOP0_PA43_12_OFFSET, phys_addr >> MMU_HOP0_PA43_12_SHIFT);
6011 WREG32(stlb_base + STLB_HOP0_PA63_44_OFFSET, phys_addr >> MMU_HOP0_PA63_44_SHIFT);
6012 WREG32(stlb_base + STLB_BUSY_OFFSET, 0x80000000);
6013
6014 rc = hl_poll_timeout(
6015 hdev,
6016 stlb_base + STLB_BUSY_OFFSET,
6017 status,
6018 !(status & 0x80000000),
6019 1000,
6020 timeout_usec);
6021
6022 if (rc) {
6023 dev_err(hdev->dev, "Timeout during MMU hop0 config of asid %d\n", asid);
6024 return rc;
6025 }
6026
6027 return 0;
6028 }
6029
gaudi2_mmu_send_invalidate_cache_cmd(struct hl_device * hdev,u32 stlb_base,u32 start_offset,u32 inv_start_val,u32 flags)6030 static void gaudi2_mmu_send_invalidate_cache_cmd(struct hl_device *hdev, u32 stlb_base,
6031 u32 start_offset, u32 inv_start_val,
6032 u32 flags)
6033 {
6034 /* clear PMMU mem line cache (only needed in mmu range invalidation) */
6035 if (flags & MMU_OP_CLEAR_MEMCACHE)
6036 WREG32(mmPMMU_HBW_STLB_MEM_CACHE_INVALIDATION, 0x1);
6037
6038 if (flags & MMU_OP_SKIP_LOW_CACHE_INV)
6039 return;
6040
6041 WREG32(stlb_base + start_offset, inv_start_val);
6042 }
6043
gaudi2_mmu_invalidate_cache_status_poll(struct hl_device * hdev,u32 stlb_base,struct gaudi2_cache_invld_params * inv_params)6044 static int gaudi2_mmu_invalidate_cache_status_poll(struct hl_device *hdev, u32 stlb_base,
6045 struct gaudi2_cache_invld_params *inv_params)
6046 {
6047 u32 status, timeout_usec, start_offset;
6048 int rc;
6049
6050 timeout_usec = (hdev->pldm) ? GAUDI2_PLDM_MMU_TIMEOUT_USEC :
6051 GAUDI2_MMU_CACHE_INV_TIMEOUT_USEC;
6052
6053 /* poll PMMU mem line cache (only needed in mmu range invalidation) */
6054 if (inv_params->flags & MMU_OP_CLEAR_MEMCACHE) {
6055 rc = hl_poll_timeout(
6056 hdev,
6057 mmPMMU_HBW_STLB_MEM_CACHE_INV_STATUS,
6058 status,
6059 status & 0x1,
6060 1000,
6061 timeout_usec);
6062
6063 if (rc)
6064 return rc;
6065
6066 /* Need to manually reset the status to 0 */
6067 WREG32(mmPMMU_HBW_STLB_MEM_CACHE_INV_STATUS, 0x0);
6068 }
6069
6070 /* Lower cache does not work with cache lines, hence we can skip its
6071 * invalidation upon map and invalidate only upon unmap
6072 */
6073 if (inv_params->flags & MMU_OP_SKIP_LOW_CACHE_INV)
6074 return 0;
6075
6076 start_offset = inv_params->range_invalidation ?
6077 STLB_RANGE_CACHE_INVALIDATION_OFFSET : STLB_INV_ALL_START_OFFSET;
6078
6079 rc = hl_poll_timeout(
6080 hdev,
6081 stlb_base + start_offset,
6082 status,
6083 !(status & 0x1),
6084 1000,
6085 timeout_usec);
6086
6087 return rc;
6088 }
6089
gaudi2_is_hmmu_enabled(struct hl_device * hdev,int dcore_id,int hmmu_id)6090 bool gaudi2_is_hmmu_enabled(struct hl_device *hdev, int dcore_id, int hmmu_id)
6091 {
6092 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6093 u32 hw_cap;
6094
6095 hw_cap = HW_CAP_DCORE0_DMMU0 << (NUM_OF_HMMU_PER_DCORE * dcore_id + hmmu_id);
6096
6097 if (gaudi2->hw_cap_initialized & hw_cap)
6098 return true;
6099
6100 return false;
6101 }
6102
6103 /* this function shall be called only for HMMUs for which capability bit is set */
get_hmmu_stlb_base(int dcore_id,int hmmu_id)6104 static inline u32 get_hmmu_stlb_base(int dcore_id, int hmmu_id)
6105 {
6106 u32 offset;
6107
6108 offset = (u32) (dcore_id * DCORE_OFFSET + hmmu_id * DCORE_HMMU_OFFSET);
6109 return (u32)(mmDCORE0_HMMU0_STLB_BASE + offset);
6110 }
6111
gaudi2_mmu_invalidate_cache_trigger(struct hl_device * hdev,u32 stlb_base,struct gaudi2_cache_invld_params * inv_params)6112 static void gaudi2_mmu_invalidate_cache_trigger(struct hl_device *hdev, u32 stlb_base,
6113 struct gaudi2_cache_invld_params *inv_params)
6114 {
6115 u32 start_offset;
6116
6117 if (inv_params->range_invalidation) {
6118 /* Set the addresses range
6119 * Note: that the start address we set in register, is not included in
6120 * the range of the invalidation, by design.
6121 * that's why we need to set lower address than the one we actually
6122 * want to be included in the range invalidation.
6123 */
6124 u64 start = inv_params->start_va - 1;
6125
6126 start_offset = STLB_RANGE_CACHE_INVALIDATION_OFFSET;
6127
6128 WREG32(stlb_base + STLB_RANGE_INV_START_LSB_OFFSET,
6129 start >> MMU_RANGE_INV_VA_LSB_SHIFT);
6130
6131 WREG32(stlb_base + STLB_RANGE_INV_START_MSB_OFFSET,
6132 start >> MMU_RANGE_INV_VA_MSB_SHIFT);
6133
6134 WREG32(stlb_base + STLB_RANGE_INV_END_LSB_OFFSET,
6135 inv_params->end_va >> MMU_RANGE_INV_VA_LSB_SHIFT);
6136
6137 WREG32(stlb_base + STLB_RANGE_INV_END_MSB_OFFSET,
6138 inv_params->end_va >> MMU_RANGE_INV_VA_MSB_SHIFT);
6139 } else {
6140 start_offset = STLB_INV_ALL_START_OFFSET;
6141 }
6142
6143 gaudi2_mmu_send_invalidate_cache_cmd(hdev, stlb_base, start_offset,
6144 inv_params->inv_start_val, inv_params->flags);
6145 }
6146
gaudi2_hmmu_invalidate_cache_trigger(struct hl_device * hdev,int dcore_id,int hmmu_id,struct gaudi2_cache_invld_params * inv_params)6147 static inline void gaudi2_hmmu_invalidate_cache_trigger(struct hl_device *hdev,
6148 int dcore_id, int hmmu_id,
6149 struct gaudi2_cache_invld_params *inv_params)
6150 {
6151 u32 stlb_base = get_hmmu_stlb_base(dcore_id, hmmu_id);
6152
6153 gaudi2_mmu_invalidate_cache_trigger(hdev, stlb_base, inv_params);
6154 }
6155
gaudi2_hmmu_invalidate_cache_status_poll(struct hl_device * hdev,int dcore_id,int hmmu_id,struct gaudi2_cache_invld_params * inv_params)6156 static inline int gaudi2_hmmu_invalidate_cache_status_poll(struct hl_device *hdev,
6157 int dcore_id, int hmmu_id,
6158 struct gaudi2_cache_invld_params *inv_params)
6159 {
6160 u32 stlb_base = get_hmmu_stlb_base(dcore_id, hmmu_id);
6161
6162 return gaudi2_mmu_invalidate_cache_status_poll(hdev, stlb_base, inv_params);
6163 }
6164
gaudi2_hmmus_invalidate_cache(struct hl_device * hdev,struct gaudi2_cache_invld_params * inv_params)6165 static int gaudi2_hmmus_invalidate_cache(struct hl_device *hdev,
6166 struct gaudi2_cache_invld_params *inv_params)
6167 {
6168 int dcore_id, hmmu_id;
6169
6170 /* first send all invalidation commands */
6171 for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {
6172 for (hmmu_id = 0 ; hmmu_id < NUM_OF_HMMU_PER_DCORE ; hmmu_id++) {
6173 if (!gaudi2_is_hmmu_enabled(hdev, dcore_id, hmmu_id))
6174 continue;
6175
6176 gaudi2_hmmu_invalidate_cache_trigger(hdev, dcore_id, hmmu_id, inv_params);
6177 }
6178 }
6179
6180 /* next, poll all invalidations status */
6181 for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {
6182 for (hmmu_id = 0 ; hmmu_id < NUM_OF_HMMU_PER_DCORE ; hmmu_id++) {
6183 int rc;
6184
6185 if (!gaudi2_is_hmmu_enabled(hdev, dcore_id, hmmu_id))
6186 continue;
6187
6188 rc = gaudi2_hmmu_invalidate_cache_status_poll(hdev, dcore_id, hmmu_id,
6189 inv_params);
6190 if (rc)
6191 return rc;
6192 }
6193 }
6194
6195 return 0;
6196 }
6197
gaudi2_mmu_invalidate_cache(struct hl_device * hdev,bool is_hard,u32 flags)6198 static int gaudi2_mmu_invalidate_cache(struct hl_device *hdev, bool is_hard, u32 flags)
6199 {
6200 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6201 struct gaudi2_cache_invld_params invld_params;
6202 int rc = 0;
6203
6204 if (hdev->reset_info.hard_reset_pending)
6205 return rc;
6206
6207 invld_params.range_invalidation = false;
6208 invld_params.inv_start_val = 1;
6209
6210 if ((flags & MMU_OP_USERPTR) && (gaudi2->hw_cap_initialized & HW_CAP_PMMU)) {
6211 invld_params.flags = flags;
6212 gaudi2_mmu_invalidate_cache_trigger(hdev, mmPMMU_HBW_STLB_BASE, &invld_params);
6213 rc = gaudi2_mmu_invalidate_cache_status_poll(hdev, mmPMMU_HBW_STLB_BASE,
6214 &invld_params);
6215 } else if (flags & MMU_OP_PHYS_PACK) {
6216 invld_params.flags = 0;
6217 rc = gaudi2_hmmus_invalidate_cache(hdev, &invld_params);
6218 }
6219
6220 return rc;
6221 }
6222
gaudi2_mmu_invalidate_cache_range(struct hl_device * hdev,bool is_hard,u32 flags,u32 asid,u64 va,u64 size)6223 static int gaudi2_mmu_invalidate_cache_range(struct hl_device *hdev, bool is_hard,
6224 u32 flags, u32 asid, u64 va, u64 size)
6225 {
6226 struct gaudi2_cache_invld_params invld_params = {0};
6227 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6228 u64 start_va, end_va;
6229 u32 inv_start_val;
6230 int rc = 0;
6231
6232 if (hdev->reset_info.hard_reset_pending)
6233 return 0;
6234
6235 inv_start_val = (1 << MMU_RANGE_INV_EN_SHIFT |
6236 1 << MMU_RANGE_INV_ASID_EN_SHIFT |
6237 asid << MMU_RANGE_INV_ASID_SHIFT);
6238 start_va = va;
6239 end_va = start_va + size;
6240
6241 if ((flags & MMU_OP_USERPTR) && (gaudi2->hw_cap_initialized & HW_CAP_PMMU)) {
6242 /* As range invalidation does not support zero address we will
6243 * do full invalidation in this case
6244 */
6245 if (start_va) {
6246 invld_params.range_invalidation = true;
6247 invld_params.start_va = start_va;
6248 invld_params.end_va = end_va;
6249 invld_params.inv_start_val = inv_start_val;
6250 invld_params.flags = flags | MMU_OP_CLEAR_MEMCACHE;
6251 } else {
6252 invld_params.range_invalidation = false;
6253 invld_params.inv_start_val = 1;
6254 invld_params.flags = flags;
6255 }
6256
6257
6258 gaudi2_mmu_invalidate_cache_trigger(hdev, mmPMMU_HBW_STLB_BASE, &invld_params);
6259 rc = gaudi2_mmu_invalidate_cache_status_poll(hdev, mmPMMU_HBW_STLB_BASE,
6260 &invld_params);
6261 if (rc)
6262 return rc;
6263
6264 } else if (flags & MMU_OP_PHYS_PACK) {
6265 invld_params.start_va = gaudi2_mmu_scramble_addr(hdev, start_va);
6266 invld_params.end_va = gaudi2_mmu_scramble_addr(hdev, end_va);
6267 invld_params.inv_start_val = inv_start_val;
6268 invld_params.flags = flags;
6269 rc = gaudi2_hmmus_invalidate_cache(hdev, &invld_params);
6270 }
6271
6272 return rc;
6273 }
6274
gaudi2_mmu_update_hop0_addr(struct hl_device * hdev,u32 stlb_base,bool host_resident_pgt)6275 static int gaudi2_mmu_update_hop0_addr(struct hl_device *hdev, u32 stlb_base,
6276 bool host_resident_pgt)
6277 {
6278 struct asic_fixed_properties *prop = &hdev->asic_prop;
6279 u64 hop0_addr;
6280 u32 asid, max_asid = prop->max_asid;
6281 int rc;
6282
6283 /* it takes too much time to init all of the ASIDs on palladium */
6284 if (hdev->pldm)
6285 max_asid = min((u32) 8, max_asid);
6286
6287 for (asid = 0 ; asid < max_asid ; asid++) {
6288 if (host_resident_pgt)
6289 hop0_addr = hdev->mmu_priv.hr.mmu_asid_hop0[asid].phys_addr;
6290 else
6291 hop0_addr = prop->mmu_pgt_addr + (asid * prop->dmmu.hop_table_size);
6292
6293 rc = gaudi2_mmu_update_asid_hop0_addr(hdev, stlb_base, asid, hop0_addr);
6294 if (rc) {
6295 dev_err(hdev->dev, "failed to set hop0 addr for asid %d\n", asid);
6296 return rc;
6297 }
6298 }
6299
6300 return 0;
6301 }
6302
gaudi2_mmu_init_common(struct hl_device * hdev,u32 mmu_base,u32 stlb_base,bool host_resident_pgt)6303 static int gaudi2_mmu_init_common(struct hl_device *hdev, u32 mmu_base, u32 stlb_base,
6304 bool host_resident_pgt)
6305 {
6306 u32 status, timeout_usec;
6307 int rc;
6308
6309 if (hdev->pldm || !hdev->pdev)
6310 timeout_usec = GAUDI2_PLDM_MMU_TIMEOUT_USEC;
6311 else
6312 timeout_usec = GAUDI2_MMU_CACHE_INV_TIMEOUT_USEC;
6313
6314 WREG32(stlb_base + STLB_INV_ALL_START_OFFSET, 1);
6315
6316 rc = hl_poll_timeout(
6317 hdev,
6318 stlb_base + STLB_SRAM_INIT_OFFSET,
6319 status,
6320 !status,
6321 1000,
6322 timeout_usec);
6323
6324 if (rc)
6325 dev_notice_ratelimited(hdev->dev, "Timeout when waiting for MMU SRAM init\n");
6326
6327 rc = gaudi2_mmu_update_hop0_addr(hdev, stlb_base, host_resident_pgt);
6328 if (rc)
6329 return rc;
6330
6331 WREG32(mmu_base + MMU_BYPASS_OFFSET, 0);
6332
6333 rc = hl_poll_timeout(
6334 hdev,
6335 stlb_base + STLB_INV_ALL_START_OFFSET,
6336 status,
6337 !status,
6338 1000,
6339 timeout_usec);
6340
6341 if (rc)
6342 dev_notice_ratelimited(hdev->dev, "Timeout when waiting for MMU invalidate all\n");
6343
6344 WREG32(mmu_base + MMU_ENABLE_OFFSET, 1);
6345
6346 return rc;
6347 }
6348
gaudi2_pci_mmu_init(struct hl_device * hdev)6349 static int gaudi2_pci_mmu_init(struct hl_device *hdev)
6350 {
6351 struct asic_fixed_properties *prop = &hdev->asic_prop;
6352 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6353 u32 mmu_base, stlb_base;
6354 int rc;
6355
6356 if (gaudi2->hw_cap_initialized & HW_CAP_PMMU)
6357 return 0;
6358
6359 mmu_base = mmPMMU_HBW_MMU_BASE;
6360 stlb_base = mmPMMU_HBW_STLB_BASE;
6361
6362 RMWREG32_SHIFTED(stlb_base + STLB_HOP_CONFIGURATION_OFFSET,
6363 (0 << PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_HOP_SHIFT) |
6364 (5 << PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_SHIFT) |
6365 (4 << PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_SHIFT) |
6366 (5 << PMMU_HBW_STLB_HOP_CONFIGURATION_LAST_HOP_SHIFT) |
6367 (5 << PMMU_HBW_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_SHIFT),
6368 PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_HOP_MASK |
6369 PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_MASK |
6370 PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_MASK |
6371 PMMU_HBW_STLB_HOP_CONFIGURATION_LAST_HOP_MASK |
6372 PMMU_HBW_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_MASK);
6373
6374 WREG32(stlb_base + STLB_LL_LOOKUP_MASK_63_32_OFFSET, 0);
6375
6376 if (PAGE_SIZE == SZ_64K) {
6377 /* Set page sizes to 64K on hop5 and 16M on hop4 + enable 8 bit hops */
6378 RMWREG32_SHIFTED(mmu_base + MMU_STATIC_MULTI_PAGE_SIZE_OFFSET,
6379 FIELD_PREP(DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP5_PAGE_SIZE_MASK, 4) |
6380 FIELD_PREP(DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP4_PAGE_SIZE_MASK, 3) |
6381 FIELD_PREP(
6382 DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_CFG_8_BITS_HOP_MODE_EN_MASK,
6383 1),
6384 DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP5_PAGE_SIZE_MASK |
6385 DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP4_PAGE_SIZE_MASK |
6386 DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_CFG_8_BITS_HOP_MODE_EN_MASK);
6387 }
6388
6389 WREG32(mmu_base + MMU_SPI_SEI_MASK_OFFSET, GAUDI2_PMMU_SPI_SEI_ENABLE_MASK);
6390
6391 rc = gaudi2_mmu_init_common(hdev, mmu_base, stlb_base, prop->pmmu.host_resident);
6392 if (rc)
6393 return rc;
6394
6395 gaudi2->hw_cap_initialized |= HW_CAP_PMMU;
6396
6397 return 0;
6398 }
6399
gaudi2_dcore_hmmu_init(struct hl_device * hdev,int dcore_id,int hmmu_id)6400 static int gaudi2_dcore_hmmu_init(struct hl_device *hdev, int dcore_id,
6401 int hmmu_id)
6402 {
6403 struct asic_fixed_properties *prop = &hdev->asic_prop;
6404 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6405 u32 offset, mmu_base, stlb_base, hw_cap;
6406 u8 dmmu_seq;
6407 int rc;
6408
6409 dmmu_seq = NUM_OF_HMMU_PER_DCORE * dcore_id + hmmu_id;
6410 hw_cap = HW_CAP_DCORE0_DMMU0 << dmmu_seq;
6411
6412 /*
6413 * return if DMMU is already initialized or if it's not out of
6414 * isolation (due to cluster binning)
6415 */
6416 if ((gaudi2->hw_cap_initialized & hw_cap) || !(prop->hmmu_hif_enabled_mask & BIT(dmmu_seq)))
6417 return 0;
6418
6419 offset = (u32) (dcore_id * DCORE_OFFSET + hmmu_id * DCORE_HMMU_OFFSET);
6420 mmu_base = mmDCORE0_HMMU0_MMU_BASE + offset;
6421 stlb_base = mmDCORE0_HMMU0_STLB_BASE + offset;
6422
6423 RMWREG32(mmu_base + MMU_STATIC_MULTI_PAGE_SIZE_OFFSET, 5 /* 64MB */,
6424 MMU_STATIC_MULTI_PAGE_SIZE_HOP4_PAGE_SIZE_MASK);
6425
6426 RMWREG32_SHIFTED(stlb_base + STLB_HOP_CONFIGURATION_OFFSET,
6427 FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_HOP_MASK, 0) |
6428 FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_MASK, 3) |
6429 FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_MASK, 3) |
6430 FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_LAST_HOP_MASK, 3) |
6431 FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_MASK, 3),
6432 DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_HOP_MASK |
6433 DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_MASK |
6434 DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_MASK |
6435 DCORE0_HMMU0_STLB_HOP_CONFIGURATION_LAST_HOP_MASK |
6436 DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_MASK);
6437
6438 RMWREG32(stlb_base + STLB_HOP_CONFIGURATION_OFFSET, 1,
6439 STLB_HOP_CONFIGURATION_ONLY_LARGE_PAGE_MASK);
6440
6441 WREG32(mmu_base + MMU_SPI_SEI_MASK_OFFSET, GAUDI2_HMMU_SPI_SEI_ENABLE_MASK);
6442
6443 rc = gaudi2_mmu_init_common(hdev, mmu_base, stlb_base, prop->dmmu.host_resident);
6444 if (rc)
6445 return rc;
6446
6447 gaudi2->hw_cap_initialized |= hw_cap;
6448
6449 return 0;
6450 }
6451
gaudi2_hbm_mmu_init(struct hl_device * hdev)6452 static int gaudi2_hbm_mmu_init(struct hl_device *hdev)
6453 {
6454 int rc, dcore_id, hmmu_id;
6455
6456 for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++)
6457 for (hmmu_id = 0 ; hmmu_id < NUM_OF_HMMU_PER_DCORE; hmmu_id++) {
6458 rc = gaudi2_dcore_hmmu_init(hdev, dcore_id, hmmu_id);
6459 if (rc)
6460 return rc;
6461 }
6462
6463 return 0;
6464 }
6465
gaudi2_mmu_init(struct hl_device * hdev)6466 static int gaudi2_mmu_init(struct hl_device *hdev)
6467 {
6468 int rc;
6469
6470 rc = gaudi2_pci_mmu_init(hdev);
6471 if (rc)
6472 return rc;
6473
6474 rc = gaudi2_hbm_mmu_init(hdev);
6475 if (rc)
6476 return rc;
6477
6478 return 0;
6479 }
6480
gaudi2_hw_init(struct hl_device * hdev)6481 static int gaudi2_hw_init(struct hl_device *hdev)
6482 {
6483 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6484 int rc;
6485
6486 /* Let's mark in the H/W that we have reached this point. We check
6487 * this value in the reset_before_init function to understand whether
6488 * we need to reset the chip before doing H/W init. This register is
6489 * cleared by the H/W upon H/W reset
6490 */
6491 WREG32(mmHW_STATE, HL_DEVICE_HW_STATE_DIRTY);
6492
6493 /* Perform read from the device to make sure device is up */
6494 RREG32(mmHW_STATE);
6495
6496 /* If iATU is done by FW, the HBM bar ALWAYS points to DRAM_PHYS_BASE.
6497 * So we set it here and if anyone tries to move it later to
6498 * a different address, there will be an error
6499 */
6500 if (hdev->asic_prop.iatu_done_by_fw)
6501 gaudi2->dram_bar_cur_addr = DRAM_PHYS_BASE;
6502
6503 /*
6504 * Before pushing u-boot/linux to device, need to set the hbm bar to
6505 * base address of dram
6506 */
6507 if (gaudi2_set_hbm_bar_base(hdev, DRAM_PHYS_BASE) == U64_MAX) {
6508 dev_err(hdev->dev, "failed to map HBM bar to DRAM base address\n");
6509 return -EIO;
6510 }
6511
6512 rc = gaudi2_init_cpu(hdev);
6513 if (rc) {
6514 dev_err(hdev->dev, "failed to initialize CPU\n");
6515 return rc;
6516 }
6517
6518 gaudi2_init_scrambler_hbm(hdev);
6519 gaudi2_init_kdma(hdev);
6520
6521 rc = gaudi2_init_cpu_queues(hdev, GAUDI2_CPU_TIMEOUT_USEC);
6522 if (rc) {
6523 dev_err(hdev->dev, "failed to initialize CPU H/W queues %d\n", rc);
6524 return rc;
6525 }
6526
6527 rc = gaudi2->cpucp_info_get(hdev);
6528 if (rc) {
6529 dev_err(hdev->dev, "Failed to get cpucp info\n");
6530 return rc;
6531 }
6532
6533 rc = gaudi2_mmu_init(hdev);
6534 if (rc)
6535 return rc;
6536
6537 gaudi2_init_pdma(hdev);
6538 gaudi2_init_edma(hdev);
6539 gaudi2_init_sm(hdev);
6540 gaudi2_init_tpc(hdev);
6541 gaudi2_init_mme(hdev);
6542 gaudi2_init_rotator(hdev);
6543 gaudi2_init_dec(hdev);
6544 gaudi2_enable_timestamp(hdev);
6545
6546 rc = gaudi2_coresight_init(hdev);
6547 if (rc)
6548 goto disable_queues;
6549
6550 rc = gaudi2_enable_msix(hdev);
6551 if (rc)
6552 goto disable_queues;
6553
6554 /* Perform read from the device to flush all configuration */
6555 RREG32(mmHW_STATE);
6556
6557 return 0;
6558
6559 disable_queues:
6560 gaudi2_disable_dma_qmans(hdev);
6561 gaudi2_disable_mme_qmans(hdev);
6562 gaudi2_disable_tpc_qmans(hdev);
6563 gaudi2_disable_rot_qmans(hdev);
6564 gaudi2_disable_nic_qmans(hdev);
6565
6566 gaudi2_disable_timestamp(hdev);
6567
6568 return rc;
6569 }
6570
6571 /**
6572 * gaudi2_send_hard_reset_cmd - common function to handle reset
6573 *
6574 * @hdev: pointer to the habanalabs device structure
6575 *
6576 * This function handles the various possible scenarios for reset.
6577 * It considers if reset is handled by driver\FW and what FW components are loaded
6578 */
gaudi2_send_hard_reset_cmd(struct hl_device * hdev)6579 static void gaudi2_send_hard_reset_cmd(struct hl_device *hdev)
6580 {
6581 struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
6582 bool heartbeat_reset, preboot_only, cpu_initialized = false;
6583 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6584 u32 cpu_boot_status;
6585
6586 preboot_only = (hdev->fw_loader.fw_comp_loaded == FW_TYPE_PREBOOT_CPU);
6587 heartbeat_reset = (hdev->reset_info.curr_reset_cause == HL_RESET_CAUSE_HEARTBEAT);
6588
6589 /*
6590 * Handle corner case where failure was at cpu management app load,
6591 * and driver didn't detect any failure while loading the FW,
6592 * then at such scenario driver will send only HALT_MACHINE
6593 * and no one will respond to this request since FW already back to preboot
6594 * and it cannot handle such cmd.
6595 * In this case next time the management app loads it'll check on events register
6596 * which will still have the halt indication, and will reboot the device.
6597 * The solution is to let preboot clear all relevant registers before next boot
6598 * once driver send COMMS_RST_DEV.
6599 */
6600 cpu_boot_status = RREG32(mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS);
6601
6602 if (gaudi2 && (gaudi2->hw_cap_initialized & HW_CAP_CPU) &&
6603 (cpu_boot_status == CPU_BOOT_STATUS_SRAM_AVAIL))
6604 cpu_initialized = true;
6605
6606 /*
6607 * when Linux/Bootfit exist this write to the SP can be interpreted in 2 ways:
6608 * 1. FW reset: FW initiate the reset sequence
6609 * 2. driver reset: FW will start HALT sequence (the preparations for the
6610 * reset but not the reset itself as it is not implemented
6611 * on their part) and LKD will wait to let FW complete the
6612 * sequence before issuing the reset
6613 */
6614 if (!preboot_only && cpu_initialized) {
6615 WREG32(le32_to_cpu(dyn_regs->gic_host_halt_irq),
6616 gaudi2_irq_map_table[GAUDI2_EVENT_CPU_HALT_MACHINE].cpu_id);
6617
6618 msleep(GAUDI2_CPU_RESET_WAIT_MSEC);
6619 }
6620
6621 /*
6622 * When working with preboot (without Linux/Boot fit) we can
6623 * communicate only using the COMMS commands to issue halt/reset.
6624 *
6625 * For the case in which we are working with Linux/Bootfit this is a hail-mary
6626 * attempt to revive the card in the small chance that the f/w has
6627 * experienced a watchdog event, which caused it to return back to preboot.
6628 * In that case, triggering reset through GIC won't help. We need to
6629 * trigger the reset as if Linux wasn't loaded.
6630 *
6631 * We do it only if the reset cause was HB, because that would be the
6632 * indication of such an event.
6633 *
6634 * In case watchdog hasn't expired but we still got HB, then this won't
6635 * do any damage.
6636 */
6637
6638 if (heartbeat_reset || preboot_only || !cpu_initialized) {
6639 if (hdev->asic_prop.hard_reset_done_by_fw)
6640 hl_fw_ask_hard_reset_without_linux(hdev);
6641 else
6642 hl_fw_ask_halt_machine_without_linux(hdev);
6643 }
6644 }
6645
6646 /**
6647 * gaudi2_execute_hard_reset - execute hard reset by driver/FW
6648 *
6649 * @hdev: pointer to the habanalabs device structure
6650 *
6651 * This function executes hard reset based on if driver/FW should do the reset
6652 */
gaudi2_execute_hard_reset(struct hl_device * hdev)6653 static void gaudi2_execute_hard_reset(struct hl_device *hdev)
6654 {
6655 if (hdev->asic_prop.hard_reset_done_by_fw) {
6656 gaudi2_send_hard_reset_cmd(hdev);
6657 return;
6658 }
6659
6660 /* Set device to handle FLR by H/W as we will put the device
6661 * CPU to halt mode
6662 */
6663 WREG32(mmPCIE_AUX_FLR_CTRL,
6664 (PCIE_AUX_FLR_CTRL_HW_CTRL_MASK | PCIE_AUX_FLR_CTRL_INT_MASK_MASK));
6665
6666 gaudi2_send_hard_reset_cmd(hdev);
6667
6668 WREG32(mmPSOC_RESET_CONF_SW_ALL_RST, 1);
6669 }
6670
6671 /**
6672 * gaudi2_execute_soft_reset - execute soft reset by driver/FW
6673 *
6674 * @hdev: pointer to the habanalabs device structure
6675 * @driver_performs_reset: true if driver should perform reset instead of f/w.
6676 * @poll_timeout_us: time to wait for response from f/w.
6677 *
6678 * This function executes soft reset based on if driver/FW should do the reset
6679 */
gaudi2_execute_soft_reset(struct hl_device * hdev,bool driver_performs_reset,u32 poll_timeout_us)6680 static int gaudi2_execute_soft_reset(struct hl_device *hdev, bool driver_performs_reset,
6681 u32 poll_timeout_us)
6682 {
6683 if (!driver_performs_reset)
6684 return hl_fw_send_soft_reset(hdev);
6685
6686 /* Block access to engines, QMANs and SM during reset, these
6687 * RRs will be reconfigured after soft reset.
6688 * PCIE_MSIX is left unsecured to allow NIC packets processing during the reset.
6689 */
6690 gaudi2_write_rr_to_all_lbw_rtrs(hdev, RR_TYPE_LONG, NUM_LONG_LBW_RR - 1,
6691 mmDCORE0_TPC0_QM_DCCM_BASE, mmPCIE_MSIX_BASE);
6692
6693 gaudi2_write_rr_to_all_lbw_rtrs(hdev, RR_TYPE_LONG, NUM_LONG_LBW_RR - 2,
6694 mmPCIE_MSIX_BASE + HL_BLOCK_SIZE,
6695 mmPCIE_VDEC1_MSTR_IF_RR_SHRD_HBW_BASE + HL_BLOCK_SIZE);
6696
6697 WREG32(mmPSOC_RESET_CONF_SOFT_RST, 1);
6698 return 0;
6699 }
6700
gaudi2_poll_btm_indication(struct hl_device * hdev,u32 poll_timeout_us)6701 static void gaudi2_poll_btm_indication(struct hl_device *hdev, u32 poll_timeout_us)
6702 {
6703 int i, rc = 0;
6704 u32 reg_val;
6705
6706 /* We poll the BTM done indication multiple times after reset due to
6707 * a HW errata 'GAUDI2_0300'
6708 */
6709 for (i = 0 ; i < GAUDI2_RESET_POLL_CNT ; i++)
6710 rc = hl_poll_timeout(
6711 hdev,
6712 mmPSOC_GLOBAL_CONF_BTM_FSM,
6713 reg_val,
6714 reg_val == 0,
6715 1000,
6716 poll_timeout_us);
6717
6718 if (rc)
6719 dev_err(hdev->dev, "Timeout while waiting for device to reset 0x%x\n", reg_val);
6720 }
6721
gaudi2_hw_fini(struct hl_device * hdev,bool hard_reset,bool fw_reset)6722 static int gaudi2_hw_fini(struct hl_device *hdev, bool hard_reset, bool fw_reset)
6723 {
6724 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6725 u32 poll_timeout_us, reset_sleep_ms;
6726 bool driver_performs_reset = false;
6727 int rc;
6728
6729 if (hdev->pldm) {
6730 reset_sleep_ms = hard_reset ? GAUDI2_PLDM_HRESET_TIMEOUT_MSEC :
6731 GAUDI2_PLDM_SRESET_TIMEOUT_MSEC;
6732 poll_timeout_us = GAUDI2_PLDM_RESET_POLL_TIMEOUT_USEC;
6733 } else {
6734 reset_sleep_ms = GAUDI2_RESET_TIMEOUT_MSEC;
6735 poll_timeout_us = GAUDI2_RESET_POLL_TIMEOUT_USEC;
6736 }
6737
6738 if (fw_reset)
6739 goto skip_reset;
6740
6741 gaudi2_reset_arcs(hdev);
6742
6743 if (hard_reset) {
6744 driver_performs_reset = !hdev->asic_prop.hard_reset_done_by_fw;
6745 gaudi2_execute_hard_reset(hdev);
6746 } else {
6747 /*
6748 * As we have to support also work with preboot only (which does not supports
6749 * soft reset) we have to make sure that security is disabled before letting driver
6750 * do the reset. user shall control the BFE flags to avoid asking soft reset in
6751 * secured device with preboot only.
6752 */
6753 driver_performs_reset = (hdev->fw_components == FW_TYPE_PREBOOT_CPU &&
6754 !hdev->asic_prop.fw_security_enabled);
6755 rc = gaudi2_execute_soft_reset(hdev, driver_performs_reset, poll_timeout_us);
6756 if (rc)
6757 return rc;
6758 }
6759
6760 skip_reset:
6761 if (driver_performs_reset || hard_reset) {
6762 /*
6763 * Instead of waiting for BTM indication we should wait for preboot ready:
6764 * Consider the below scenario:
6765 * 1. FW update is being triggered
6766 * - setting the dirty bit
6767 * 2. hard reset will be triggered due to the dirty bit
6768 * 3. FW initiates the reset:
6769 * - dirty bit cleared
6770 * - BTM indication cleared
6771 * - preboot ready indication cleared
6772 * 4. during hard reset:
6773 * - BTM indication will be set
6774 * - BIST test performed and another reset triggered
6775 * 5. only after this reset the preboot will set the preboot ready
6776 *
6777 * when polling on BTM indication alone we can lose sync with FW while trying to
6778 * communicate with FW that is during reset.
6779 * to overcome this we will always wait to preboot ready indication
6780 */
6781
6782 /* without this sleep reset will not work */
6783 msleep(reset_sleep_ms);
6784
6785 if (hdev->fw_components & FW_TYPE_PREBOOT_CPU)
6786 hl_fw_wait_preboot_ready(hdev);
6787 else
6788 gaudi2_poll_btm_indication(hdev, poll_timeout_us);
6789 }
6790
6791 if (!gaudi2)
6792 return 0;
6793
6794 gaudi2->dec_hw_cap_initialized &= ~(HW_CAP_DEC_MASK);
6795 gaudi2->tpc_hw_cap_initialized &= ~(HW_CAP_TPC_MASK);
6796
6797 /*
6798 * Clear NIC capability mask in order for driver to re-configure
6799 * NIC QMANs. NIC ports will not be re-configured during soft
6800 * reset as we call gaudi2_nic_init only during hard reset
6801 */
6802 gaudi2->nic_hw_cap_initialized &= ~(HW_CAP_NIC_MASK);
6803
6804 if (hard_reset) {
6805 gaudi2->hw_cap_initialized &=
6806 ~(HW_CAP_DRAM | HW_CAP_CLK_GATE | HW_CAP_HBM_SCRAMBLER_MASK |
6807 HW_CAP_PMMU | HW_CAP_CPU | HW_CAP_CPU_Q |
6808 HW_CAP_SRAM_SCRAMBLER | HW_CAP_DMMU_MASK |
6809 HW_CAP_PDMA_MASK | HW_CAP_EDMA_MASK | HW_CAP_KDMA |
6810 HW_CAP_MME_MASK | HW_CAP_ROT_MASK);
6811
6812 memset(gaudi2->events_stat, 0, sizeof(gaudi2->events_stat));
6813 } else {
6814 gaudi2->hw_cap_initialized &=
6815 ~(HW_CAP_CLK_GATE | HW_CAP_HBM_SCRAMBLER_SW_RESET |
6816 HW_CAP_PDMA_MASK | HW_CAP_EDMA_MASK | HW_CAP_MME_MASK |
6817 HW_CAP_ROT_MASK);
6818 }
6819 return 0;
6820 }
6821
gaudi2_suspend(struct hl_device * hdev)6822 static int gaudi2_suspend(struct hl_device *hdev)
6823 {
6824 return hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_DISABLE_PCI_ACCESS, 0x0);
6825 }
6826
gaudi2_resume(struct hl_device * hdev)6827 static int gaudi2_resume(struct hl_device *hdev)
6828 {
6829 return gaudi2_init_iatu(hdev);
6830 }
6831
gaudi2_mmap(struct hl_device * hdev,struct vm_area_struct * vma,void * cpu_addr,dma_addr_t dma_addr,size_t size)6832 static int gaudi2_mmap(struct hl_device *hdev, struct vm_area_struct *vma,
6833 void *cpu_addr, dma_addr_t dma_addr, size_t size)
6834 {
6835 int rc;
6836
6837 vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
6838 VM_DONTCOPY | VM_NORESERVE);
6839
6840 #ifdef _HAS_DMA_MMAP_COHERENT
6841 /*
6842 * If dma_alloc_coherent() returns a vmalloc address, set VM_MIXEDMAP
6843 * so vm_insert_page() can handle it safely. Without this, the kernel
6844 * may BUG_ON due to VM_PFNMAP.
6845 */
6846 if (is_vmalloc_addr(cpu_addr))
6847 vm_flags_set(vma, VM_MIXEDMAP);
6848
6849 rc = dma_mmap_coherent(hdev->dev, vma, cpu_addr, dma_addr, size);
6850 if (rc)
6851 dev_err(hdev->dev, "dma_mmap_coherent error %d", rc);
6852
6853 #else
6854
6855 rc = remap_pfn_range(vma, vma->vm_start,
6856 virt_to_phys(cpu_addr) >> PAGE_SHIFT,
6857 size, vma->vm_page_prot);
6858 if (rc)
6859 dev_err(hdev->dev, "remap_pfn_range error %d", rc);
6860
6861 #endif
6862
6863 return rc;
6864 }
6865
gaudi2_is_queue_enabled(struct hl_device * hdev,u32 hw_queue_id)6866 static bool gaudi2_is_queue_enabled(struct hl_device *hdev, u32 hw_queue_id)
6867 {
6868 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6869 u64 hw_cap_mask = 0;
6870 u64 hw_tpc_cap_bit = 0;
6871 u64 hw_nic_cap_bit = 0;
6872 u64 hw_test_cap_bit = 0;
6873
6874 switch (hw_queue_id) {
6875 case GAUDI2_QUEUE_ID_PDMA_0_0:
6876 case GAUDI2_QUEUE_ID_PDMA_0_1:
6877 case GAUDI2_QUEUE_ID_PDMA_1_0:
6878 hw_cap_mask = HW_CAP_PDMA_MASK;
6879 break;
6880 case GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3:
6881 hw_test_cap_bit = HW_CAP_EDMA_SHIFT +
6882 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0) >> 2);
6883 break;
6884 case GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3:
6885 hw_test_cap_bit = HW_CAP_EDMA_SHIFT + NUM_OF_EDMA_PER_DCORE +
6886 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0) >> 2);
6887 break;
6888 case GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3:
6889 hw_test_cap_bit = HW_CAP_EDMA_SHIFT + 2 * NUM_OF_EDMA_PER_DCORE +
6890 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0) >> 2);
6891 break;
6892 case GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3:
6893 hw_test_cap_bit = HW_CAP_EDMA_SHIFT + 3 * NUM_OF_EDMA_PER_DCORE +
6894 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0) >> 2);
6895 break;
6896
6897 case GAUDI2_QUEUE_ID_DCORE0_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE0_MME_0_3:
6898 hw_test_cap_bit = HW_CAP_MME_SHIFT;
6899 break;
6900
6901 case GAUDI2_QUEUE_ID_DCORE1_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE1_MME_0_3:
6902 hw_test_cap_bit = HW_CAP_MME_SHIFT + 1;
6903 break;
6904
6905 case GAUDI2_QUEUE_ID_DCORE2_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE2_MME_0_3:
6906 hw_test_cap_bit = HW_CAP_MME_SHIFT + 2;
6907 break;
6908
6909 case GAUDI2_QUEUE_ID_DCORE3_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE3_MME_0_3:
6910 hw_test_cap_bit = HW_CAP_MME_SHIFT + 3;
6911 break;
6912
6913 case GAUDI2_QUEUE_ID_DCORE0_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE0_TPC_5_3:
6914 hw_tpc_cap_bit = HW_CAP_TPC_SHIFT +
6915 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE0_TPC_0_0) >> 2);
6916
6917 /* special case where cap bit refers to the first queue id */
6918 if (!hw_tpc_cap_bit)
6919 return !!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(0));
6920 break;
6921
6922 case GAUDI2_QUEUE_ID_DCORE1_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE1_TPC_5_3:
6923 hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + NUM_OF_TPC_PER_DCORE +
6924 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE1_TPC_0_0) >> 2);
6925 break;
6926
6927 case GAUDI2_QUEUE_ID_DCORE2_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE2_TPC_5_3:
6928 hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + (2 * NUM_OF_TPC_PER_DCORE) +
6929 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE2_TPC_0_0) >> 2);
6930 break;
6931
6932 case GAUDI2_QUEUE_ID_DCORE3_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE3_TPC_5_3:
6933 hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + (3 * NUM_OF_TPC_PER_DCORE) +
6934 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE3_TPC_0_0) >> 2);
6935 break;
6936
6937 case GAUDI2_QUEUE_ID_DCORE0_TPC_6_0 ... GAUDI2_QUEUE_ID_DCORE0_TPC_6_3:
6938 hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + (4 * NUM_OF_TPC_PER_DCORE);
6939 break;
6940
6941 case GAUDI2_QUEUE_ID_ROT_0_0 ... GAUDI2_QUEUE_ID_ROT_1_3:
6942 hw_test_cap_bit = HW_CAP_ROT_SHIFT + ((hw_queue_id - GAUDI2_QUEUE_ID_ROT_0_0) >> 2);
6943 break;
6944
6945 case GAUDI2_QUEUE_ID_NIC_0_0 ... GAUDI2_QUEUE_ID_NIC_23_3:
6946 hw_nic_cap_bit = HW_CAP_NIC_SHIFT + ((hw_queue_id - GAUDI2_QUEUE_ID_NIC_0_0) >> 2);
6947
6948 /* special case where cap bit refers to the first queue id */
6949 if (!hw_nic_cap_bit)
6950 return !!(gaudi2->nic_hw_cap_initialized & BIT_ULL(0));
6951 break;
6952
6953 case GAUDI2_QUEUE_ID_CPU_PQ:
6954 return !!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q);
6955
6956 default:
6957 return false;
6958 }
6959
6960 if (hw_tpc_cap_bit)
6961 return !!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(hw_tpc_cap_bit));
6962
6963 if (hw_nic_cap_bit)
6964 return !!(gaudi2->nic_hw_cap_initialized & BIT_ULL(hw_nic_cap_bit));
6965
6966 if (hw_test_cap_bit)
6967 hw_cap_mask = BIT_ULL(hw_test_cap_bit);
6968
6969 return !!(gaudi2->hw_cap_initialized & hw_cap_mask);
6970 }
6971
gaudi2_is_arc_enabled(struct hl_device * hdev,u64 arc_id)6972 static bool gaudi2_is_arc_enabled(struct hl_device *hdev, u64 arc_id)
6973 {
6974 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6975
6976 switch (arc_id) {
6977 case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC5:
6978 case CPU_ID_MME_QMAN_ARC0...CPU_ID_ROT_QMAN_ARC1:
6979 return !!(gaudi2->active_hw_arc & BIT_ULL(arc_id));
6980
6981 case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:
6982 return !!(gaudi2->active_tpc_arc & BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0));
6983
6984 case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:
6985 return !!(gaudi2->active_nic_arc & BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0));
6986
6987 default:
6988 return false;
6989 }
6990 }
6991
gaudi2_clr_arc_id_cap(struct hl_device * hdev,u64 arc_id)6992 static void gaudi2_clr_arc_id_cap(struct hl_device *hdev, u64 arc_id)
6993 {
6994 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6995
6996 switch (arc_id) {
6997 case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC5:
6998 case CPU_ID_MME_QMAN_ARC0...CPU_ID_ROT_QMAN_ARC1:
6999 gaudi2->active_hw_arc &= ~(BIT_ULL(arc_id));
7000 break;
7001
7002 case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:
7003 gaudi2->active_tpc_arc &= ~(BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0));
7004 break;
7005
7006 case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:
7007 gaudi2->active_nic_arc &= ~(BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0));
7008 break;
7009
7010 default:
7011 return;
7012 }
7013 }
7014
gaudi2_set_arc_id_cap(struct hl_device * hdev,u64 arc_id)7015 static void gaudi2_set_arc_id_cap(struct hl_device *hdev, u64 arc_id)
7016 {
7017 struct gaudi2_device *gaudi2 = hdev->asic_specific;
7018
7019 switch (arc_id) {
7020 case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC5:
7021 case CPU_ID_MME_QMAN_ARC0...CPU_ID_ROT_QMAN_ARC1:
7022 gaudi2->active_hw_arc |= BIT_ULL(arc_id);
7023 break;
7024
7025 case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:
7026 gaudi2->active_tpc_arc |= BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0);
7027 break;
7028
7029 case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:
7030 gaudi2->active_nic_arc |= BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0);
7031 break;
7032
7033 default:
7034 return;
7035 }
7036 }
7037
gaudi2_ring_doorbell(struct hl_device * hdev,u32 hw_queue_id,u32 pi)7038 static void gaudi2_ring_doorbell(struct hl_device *hdev, u32 hw_queue_id, u32 pi)
7039 {
7040 struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
7041 u32 pq_offset, reg_base, db_reg_offset, db_value;
7042
7043 if (hw_queue_id != GAUDI2_QUEUE_ID_CPU_PQ) {
7044 /*
7045 * QMAN has 4 successive PQ_PI registers, 1 for each of the QMAN PQs.
7046 * Masking the H/W queue ID with 0x3 extracts the QMAN internal PQ
7047 * number.
7048 */
7049 pq_offset = (hw_queue_id & 0x3) * 4;
7050 reg_base = gaudi2_qm_blocks_bases[hw_queue_id];
7051 db_reg_offset = reg_base + QM_PQ_PI_0_OFFSET + pq_offset;
7052 } else {
7053 db_reg_offset = mmCPU_IF_PF_PQ_PI;
7054 }
7055
7056 db_value = pi;
7057
7058 /* ring the doorbell */
7059 WREG32(db_reg_offset, db_value);
7060
7061 if (hw_queue_id == GAUDI2_QUEUE_ID_CPU_PQ) {
7062 /* make sure device CPU will read latest data from host */
7063 mb();
7064 WREG32(le32_to_cpu(dyn_regs->gic_host_pi_upd_irq),
7065 gaudi2_irq_map_table[GAUDI2_EVENT_CPU_PI_UPDATE].cpu_id);
7066 }
7067 }
7068
gaudi2_pqe_write(struct hl_device * hdev,__le64 * pqe,struct hl_bd * bd)7069 static void gaudi2_pqe_write(struct hl_device *hdev, __le64 *pqe, struct hl_bd *bd)
7070 {
7071 __le64 *pbd = (__le64 *) bd;
7072
7073 /* The QMANs are on the host memory so a simple copy suffice */
7074 pqe[0] = pbd[0];
7075 pqe[1] = pbd[1];
7076 }
7077
gaudi2_dma_alloc_coherent(struct hl_device * hdev,size_t size,dma_addr_t * dma_handle,gfp_t flags)7078 static void *gaudi2_dma_alloc_coherent(struct hl_device *hdev, size_t size,
7079 dma_addr_t *dma_handle, gfp_t flags)
7080 {
7081 return dma_alloc_coherent(&hdev->pdev->dev, size, dma_handle, flags);
7082 }
7083
gaudi2_dma_free_coherent(struct hl_device * hdev,size_t size,void * cpu_addr,dma_addr_t dma_handle)7084 static void gaudi2_dma_free_coherent(struct hl_device *hdev, size_t size,
7085 void *cpu_addr, dma_addr_t dma_handle)
7086 {
7087 dma_free_coherent(&hdev->pdev->dev, size, cpu_addr, dma_handle);
7088 }
7089
gaudi2_send_cpu_message(struct hl_device * hdev,u32 * msg,u16 len,u32 timeout,u64 * result)7090 static int gaudi2_send_cpu_message(struct hl_device *hdev, u32 *msg, u16 len,
7091 u32 timeout, u64 *result)
7092 {
7093 struct gaudi2_device *gaudi2 = hdev->asic_specific;
7094
7095 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q)) {
7096 if (result)
7097 *result = 0;
7098 return 0;
7099 }
7100
7101 if (!timeout)
7102 timeout = GAUDI2_MSG_TO_CPU_TIMEOUT_USEC;
7103
7104 return hl_fw_send_cpu_message(hdev, GAUDI2_QUEUE_ID_CPU_PQ, msg, len, timeout, result);
7105 }
7106
gaudi2_dma_pool_zalloc(struct hl_device * hdev,size_t size,gfp_t mem_flags,dma_addr_t * dma_handle)7107 static void *gaudi2_dma_pool_zalloc(struct hl_device *hdev, size_t size,
7108 gfp_t mem_flags, dma_addr_t *dma_handle)
7109 {
7110 if (size > GAUDI2_DMA_POOL_BLK_SIZE)
7111 return NULL;
7112
7113 return dma_pool_zalloc(hdev->dma_pool, mem_flags, dma_handle);
7114 }
7115
gaudi2_dma_pool_free(struct hl_device * hdev,void * vaddr,dma_addr_t dma_addr)7116 static void gaudi2_dma_pool_free(struct hl_device *hdev, void *vaddr, dma_addr_t dma_addr)
7117 {
7118 dma_pool_free(hdev->dma_pool, vaddr, dma_addr);
7119 }
7120
gaudi2_cpu_accessible_dma_pool_alloc(struct hl_device * hdev,size_t size,dma_addr_t * dma_handle)7121 static void *gaudi2_cpu_accessible_dma_pool_alloc(struct hl_device *hdev, size_t size,
7122 dma_addr_t *dma_handle)
7123 {
7124 return hl_fw_cpu_accessible_dma_pool_alloc(hdev, size, dma_handle);
7125 }
7126
gaudi2_cpu_accessible_dma_pool_free(struct hl_device * hdev,size_t size,void * vaddr)7127 static void gaudi2_cpu_accessible_dma_pool_free(struct hl_device *hdev, size_t size, void *vaddr)
7128 {
7129 hl_fw_cpu_accessible_dma_pool_free(hdev, size, vaddr);
7130 }
7131
gaudi2_validate_cb_address(struct hl_device * hdev,struct hl_cs_parser * parser)7132 static int gaudi2_validate_cb_address(struct hl_device *hdev, struct hl_cs_parser *parser)
7133 {
7134 struct asic_fixed_properties *asic_prop = &hdev->asic_prop;
7135 struct gaudi2_device *gaudi2 = hdev->asic_specific;
7136
7137 if (!gaudi2_is_queue_enabled(hdev, parser->hw_queue_id)) {
7138 dev_err(hdev->dev, "h/w queue %s is disabled\n",
7139 GAUDI2_QUEUE_ID_TO_STR(parser->hw_queue_id));
7140 return -EINVAL;
7141 }
7142
7143 /* Just check if CB address is valid */
7144
7145 if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,
7146 parser->user_cb_size,
7147 asic_prop->sram_user_base_address,
7148 asic_prop->sram_end_address))
7149 return 0;
7150
7151 if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,
7152 parser->user_cb_size,
7153 asic_prop->dram_user_base_address,
7154 asic_prop->dram_end_address))
7155 return 0;
7156
7157 if ((gaudi2->hw_cap_initialized & HW_CAP_DMMU_MASK) &&
7158 hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,
7159 parser->user_cb_size,
7160 asic_prop->dmmu.start_addr,
7161 asic_prop->dmmu.end_addr))
7162 return 0;
7163
7164 if (gaudi2->hw_cap_initialized & HW_CAP_PMMU) {
7165 if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,
7166 parser->user_cb_size,
7167 asic_prop->pmmu.start_addr,
7168 asic_prop->pmmu.end_addr) ||
7169 hl_mem_area_inside_range(
7170 (u64) (uintptr_t) parser->user_cb,
7171 parser->user_cb_size,
7172 asic_prop->pmmu_huge.start_addr,
7173 asic_prop->pmmu_huge.end_addr))
7174 return 0;
7175
7176 } else if (gaudi2_host_phys_addr_valid((u64) (uintptr_t) parser->user_cb)) {
7177 if (!hdev->pdev)
7178 return 0;
7179
7180 if (!device_iommu_mapped(&hdev->pdev->dev))
7181 return 0;
7182 }
7183
7184 dev_err(hdev->dev, "CB address %p + 0x%x for internal QMAN is not valid\n",
7185 parser->user_cb, parser->user_cb_size);
7186
7187 return -EFAULT;
7188 }
7189
gaudi2_cs_parser(struct hl_device * hdev,struct hl_cs_parser * parser)7190 static int gaudi2_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser)
7191 {
7192 struct gaudi2_device *gaudi2 = hdev->asic_specific;
7193
7194 if (!parser->is_kernel_allocated_cb)
7195 return gaudi2_validate_cb_address(hdev, parser);
7196
7197 if (!(gaudi2->hw_cap_initialized & HW_CAP_PMMU)) {
7198 dev_err(hdev->dev, "PMMU not initialized - Unsupported mode in Gaudi2\n");
7199 return -EINVAL;
7200 }
7201
7202 return 0;
7203 }
7204
gaudi2_send_heartbeat(struct hl_device * hdev)7205 static int gaudi2_send_heartbeat(struct hl_device *hdev)
7206 {
7207 struct gaudi2_device *gaudi2 = hdev->asic_specific;
7208
7209 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))
7210 return 0;
7211
7212 return hl_fw_send_heartbeat(hdev);
7213 }
7214
7215 /* This is an internal helper function, used to update the KDMA mmu props.
7216 * Should be called with a proper kdma lock.
7217 */
gaudi2_kdma_set_mmbp_asid(struct hl_device * hdev,bool mmu_bypass,u32 asid)7218 static void gaudi2_kdma_set_mmbp_asid(struct hl_device *hdev,
7219 bool mmu_bypass, u32 asid)
7220 {
7221 u32 rw_asid, rw_mmu_bp;
7222
7223 rw_asid = (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_SHIFT) |
7224 (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_SHIFT);
7225
7226 rw_mmu_bp = (!!mmu_bypass << ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_RD_SHIFT) |
7227 (!!mmu_bypass << ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_WR_SHIFT);
7228
7229 WREG32(mmARC_FARM_KDMA_CTX_AXUSER_HB_ASID, rw_asid);
7230 WREG32(mmARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP, rw_mmu_bp);
7231 }
7232
gaudi2_arm_cq_monitor(struct hl_device * hdev,u32 sob_id,u32 mon_id,u32 cq_id,u32 mon_payload,u32 sync_value)7233 static void gaudi2_arm_cq_monitor(struct hl_device *hdev, u32 sob_id, u32 mon_id, u32 cq_id,
7234 u32 mon_payload, u32 sync_value)
7235 {
7236 u32 sob_offset, mon_offset, sync_group_id, mode, mon_arm;
7237 u8 mask;
7238
7239 sob_offset = sob_id * 4;
7240 mon_offset = mon_id * 4;
7241
7242 /* Reset the SOB value */
7243 WREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset, 0);
7244
7245 /* Configure this address with CQ_ID 0 because CQ_EN is set */
7246 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, cq_id);
7247
7248 /* Configure this address with CS index because CQ_EN is set */
7249 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, mon_payload);
7250
7251 sync_group_id = sob_id / 8;
7252 mask = ~(1 << (sob_id & 0x7));
7253 mode = 1; /* comparison mode is "equal to" */
7254
7255 mon_arm = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOD_MASK, sync_value);
7256 mon_arm |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOP_MASK, mode);
7257 mon_arm |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_MASK_MASK, mask);
7258 mon_arm |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SID_MASK, sync_group_id);
7259 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + mon_offset, mon_arm);
7260 }
7261
7262 /* This is an internal helper function used by gaudi2_send_job_to_kdma only */
gaudi2_send_job_to_kdma(struct hl_device * hdev,u64 src_addr,u64 dst_addr,u32 size,bool is_memset)7263 static int gaudi2_send_job_to_kdma(struct hl_device *hdev,
7264 u64 src_addr, u64 dst_addr,
7265 u32 size, bool is_memset)
7266 {
7267 u32 comp_val, commit_mask, *polling_addr, timeout, status = 0;
7268 struct hl_cq_entry *cq_base;
7269 struct hl_cq *cq;
7270 u64 comp_addr;
7271 int rc;
7272
7273 gaudi2_arm_cq_monitor(hdev, GAUDI2_RESERVED_SOB_KDMA_COMPLETION,
7274 GAUDI2_RESERVED_MON_KDMA_COMPLETION,
7275 GAUDI2_RESERVED_CQ_KDMA_COMPLETION, 1, 1);
7276
7277 comp_addr = CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 +
7278 (GAUDI2_RESERVED_SOB_KDMA_COMPLETION * sizeof(u32));
7279
7280 comp_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_INC_MASK, 1) |
7281 FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_VAL_MASK, 1);
7282
7283 WREG32(mmARC_FARM_KDMA_CTX_SRC_BASE_LO, lower_32_bits(src_addr));
7284 WREG32(mmARC_FARM_KDMA_CTX_SRC_BASE_HI, upper_32_bits(src_addr));
7285 WREG32(mmARC_FARM_KDMA_CTX_DST_BASE_LO, lower_32_bits(dst_addr));
7286 WREG32(mmARC_FARM_KDMA_CTX_DST_BASE_HI, upper_32_bits(dst_addr));
7287 WREG32(mmARC_FARM_KDMA_CTX_WR_COMP_ADDR_LO, lower_32_bits(comp_addr));
7288 WREG32(mmARC_FARM_KDMA_CTX_WR_COMP_ADDR_HI, upper_32_bits(comp_addr));
7289 WREG32(mmARC_FARM_KDMA_CTX_WR_COMP_WDATA, comp_val);
7290 WREG32(mmARC_FARM_KDMA_CTX_DST_TSIZE_0, size);
7291
7292 commit_mask = FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_LIN_MASK, 1) |
7293 FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_WR_COMP_EN_MASK, 1);
7294
7295 if (is_memset)
7296 commit_mask |= FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_MEM_SET_MASK, 1);
7297
7298 WREG32(mmARC_FARM_KDMA_CTX_COMMIT, commit_mask);
7299
7300 /* Wait for completion */
7301 cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_KDMA_COMPLETION];
7302 cq_base = cq->kernel_address;
7303 polling_addr = (u32 *)&cq_base[cq->ci];
7304
7305 if (hdev->pldm)
7306 /* for each 1MB 20 second of timeout */
7307 timeout = ((size / SZ_1M) + 1) * USEC_PER_SEC * 20;
7308 else
7309 timeout = KDMA_TIMEOUT_USEC;
7310
7311 /* Polling */
7312 rc = hl_poll_timeout_memory(
7313 hdev,
7314 polling_addr,
7315 status,
7316 (status == 1),
7317 1000,
7318 timeout,
7319 true);
7320
7321 *polling_addr = 0;
7322
7323 if (rc) {
7324 dev_err(hdev->dev, "Timeout while waiting for KDMA to be idle\n");
7325 WREG32(mmARC_FARM_KDMA_CFG_1, 1 << ARC_FARM_KDMA_CFG_1_HALT_SHIFT);
7326 return rc;
7327 }
7328
7329 cq->ci = hl_cq_inc_ptr(cq->ci);
7330
7331 return 0;
7332 }
7333
gaudi2_memset_device_lbw(struct hl_device * hdev,u32 addr,u32 size,u32 val)7334 static void gaudi2_memset_device_lbw(struct hl_device *hdev, u32 addr, u32 size, u32 val)
7335 {
7336 u32 i;
7337
7338 for (i = 0 ; i < size ; i += sizeof(u32))
7339 WREG32(addr + i, val);
7340 }
7341
gaudi2_qman_set_test_mode(struct hl_device * hdev,u32 hw_queue_id,bool enable)7342 static void gaudi2_qman_set_test_mode(struct hl_device *hdev, u32 hw_queue_id, bool enable)
7343 {
7344 u32 reg_base = gaudi2_qm_blocks_bases[hw_queue_id];
7345
7346 if (enable) {
7347 WREG32(reg_base + QM_GLBL_PROT_OFFSET, QMAN_MAKE_TRUSTED_TEST_MODE);
7348 WREG32(reg_base + QM_PQC_CFG_OFFSET, 0);
7349 } else {
7350 WREG32(reg_base + QM_GLBL_PROT_OFFSET, QMAN_MAKE_TRUSTED);
7351 WREG32(reg_base + QM_PQC_CFG_OFFSET, 1 << PDMA0_QM_PQC_CFG_EN_SHIFT);
7352 }
7353 }
7354
gaudi2_test_queue_hw_queue_id_to_sob_id(struct hl_device * hdev,u32 hw_queue_id)7355 static inline u32 gaudi2_test_queue_hw_queue_id_to_sob_id(struct hl_device *hdev, u32 hw_queue_id)
7356 {
7357 return hdev->asic_prop.first_available_user_sob[0] +
7358 hw_queue_id - GAUDI2_QUEUE_ID_PDMA_0_0;
7359 }
7360
gaudi2_test_queue_clear(struct hl_device * hdev,u32 hw_queue_id)7361 static void gaudi2_test_queue_clear(struct hl_device *hdev, u32 hw_queue_id)
7362 {
7363 u32 sob_offset = gaudi2_test_queue_hw_queue_id_to_sob_id(hdev, hw_queue_id) * 4;
7364 u32 sob_addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;
7365
7366 /* Reset the SOB value */
7367 WREG32(sob_addr, 0);
7368 }
7369
gaudi2_test_queue_send_msg_short(struct hl_device * hdev,u32 hw_queue_id,u32 sob_val,struct gaudi2_queues_test_info * msg_info)7370 static int gaudi2_test_queue_send_msg_short(struct hl_device *hdev, u32 hw_queue_id, u32 sob_val,
7371 struct gaudi2_queues_test_info *msg_info)
7372 {
7373 u32 sob_offset = gaudi2_test_queue_hw_queue_id_to_sob_id(hdev, hw_queue_id) * 4;
7374 u32 tmp, sob_base = 1;
7375 struct packet_msg_short *msg_short_pkt = msg_info->kern_addr;
7376 size_t pkt_size = sizeof(struct packet_msg_short);
7377 int rc;
7378
7379 tmp = (PACKET_MSG_SHORT << GAUDI2_PKT_CTL_OPCODE_SHIFT) |
7380 (1 << GAUDI2_PKT_CTL_EB_SHIFT) |
7381 (1 << GAUDI2_PKT_CTL_MB_SHIFT) |
7382 (sob_base << GAUDI2_PKT_SHORT_CTL_BASE_SHIFT) |
7383 (sob_offset << GAUDI2_PKT_SHORT_CTL_ADDR_SHIFT);
7384
7385 msg_short_pkt->value = cpu_to_le32(sob_val);
7386 msg_short_pkt->ctl = cpu_to_le32(tmp);
7387
7388 rc = hl_hw_queue_send_cb_no_cmpl(hdev, hw_queue_id, pkt_size, msg_info->dma_addr);
7389 if (rc)
7390 dev_err(hdev->dev,
7391 "Failed to send msg_short packet to H/W queue %s\n",
7392 GAUDI2_QUEUE_ID_TO_STR(hw_queue_id));
7393
7394 return rc;
7395 }
7396
gaudi2_test_queue_wait_completion(struct hl_device * hdev,u32 hw_queue_id,u32 sob_val)7397 static int gaudi2_test_queue_wait_completion(struct hl_device *hdev, u32 hw_queue_id, u32 sob_val)
7398 {
7399 u32 sob_offset = gaudi2_test_queue_hw_queue_id_to_sob_id(hdev, hw_queue_id) * 4;
7400 u32 sob_addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;
7401 u32 timeout_usec, tmp;
7402 int rc;
7403
7404 if (hdev->pldm)
7405 timeout_usec = GAUDI2_PLDM_TEST_QUEUE_WAIT_USEC;
7406 else
7407 timeout_usec = GAUDI2_TEST_QUEUE_WAIT_USEC;
7408
7409 rc = hl_poll_timeout(
7410 hdev,
7411 sob_addr,
7412 tmp,
7413 (tmp == sob_val),
7414 1000,
7415 timeout_usec);
7416
7417 if (rc == -ETIMEDOUT) {
7418 dev_err(hdev->dev, "H/W queue %s test failed (SOB_OBJ_0 == 0x%x)\n",
7419 GAUDI2_QUEUE_ID_TO_STR(hw_queue_id), tmp);
7420 rc = -EIO;
7421 }
7422
7423 return rc;
7424 }
7425
gaudi2_test_cpu_queue(struct hl_device * hdev)7426 static int gaudi2_test_cpu_queue(struct hl_device *hdev)
7427 {
7428 struct gaudi2_device *gaudi2 = hdev->asic_specific;
7429
7430 /*
7431 * check capability here as send_cpu_message() won't update the result
7432 * value if no capability
7433 */
7434 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))
7435 return 0;
7436
7437 return hl_fw_test_cpu_queue(hdev);
7438 }
7439
gaudi2_test_queues(struct hl_device * hdev)7440 static int gaudi2_test_queues(struct hl_device *hdev)
7441 {
7442 struct gaudi2_device *gaudi2 = hdev->asic_specific;
7443 struct gaudi2_queues_test_info *msg_info;
7444 u32 sob_val = 0x5a5a;
7445 int i, rc;
7446
7447 /* send test message on all enabled Qs */
7448 for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ; i++) {
7449 if (!gaudi2_is_queue_enabled(hdev, i) || gaudi2_is_edma_queue_id(i))
7450 continue;
7451
7452 msg_info = &gaudi2->queues_test_info[i - GAUDI2_QUEUE_ID_PDMA_0_0];
7453 gaudi2_qman_set_test_mode(hdev, i, true);
7454 gaudi2_test_queue_clear(hdev, i);
7455 rc = gaudi2_test_queue_send_msg_short(hdev, i, sob_val, msg_info);
7456 if (rc)
7457 goto done;
7458 }
7459
7460 rc = gaudi2_test_cpu_queue(hdev);
7461 if (rc)
7462 goto done;
7463
7464 /* verify that all messages were processed */
7465 for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ; i++) {
7466 if (!gaudi2_is_queue_enabled(hdev, i) || gaudi2_is_edma_queue_id(i))
7467 continue;
7468
7469 rc = gaudi2_test_queue_wait_completion(hdev, i, sob_val);
7470 if (rc)
7471 /* chip is not usable, no need for cleanups, just bail-out with error */
7472 goto done;
7473
7474 gaudi2_test_queue_clear(hdev, i);
7475 gaudi2_qman_set_test_mode(hdev, i, false);
7476 }
7477
7478 done:
7479 return rc;
7480 }
7481
gaudi2_compute_reset_late_init(struct hl_device * hdev)7482 static int gaudi2_compute_reset_late_init(struct hl_device *hdev)
7483 {
7484 struct gaudi2_device *gaudi2 = hdev->asic_specific;
7485 size_t irq_arr_size;
7486 int rc;
7487
7488 gaudi2_init_arcs(hdev);
7489
7490 rc = gaudi2_scrub_arcs_dccm(hdev);
7491 if (rc) {
7492 dev_err(hdev->dev, "Failed to scrub arcs DCCM\n");
7493 return rc;
7494 }
7495
7496 gaudi2_init_security(hdev);
7497
7498 /* Unmask all IRQs since some could have been received during the soft reset */
7499 irq_arr_size = gaudi2->num_of_valid_hw_events * sizeof(gaudi2->hw_events[0]);
7500 return hl_fw_unmask_irq_arr(hdev, gaudi2->hw_events, irq_arr_size);
7501 }
7502
gaudi2_get_edma_idle_status(struct hl_device * hdev,u64 * mask_arr,u8 mask_len,struct engines_data * e)7503 static bool gaudi2_get_edma_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,
7504 struct engines_data *e)
7505 {
7506 u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts, dma_core_sts0, dma_core_sts1;
7507 struct asic_fixed_properties *prop = &hdev->asic_prop;
7508 unsigned long *mask = (unsigned long *) mask_arr;
7509 const char *edma_fmt = "%-6d%-6d%-9s%#-14x%#-15x%#x\n";
7510 bool is_idle = true, is_eng_idle;
7511 int engine_idx, i, j;
7512 u64 offset;
7513
7514 if (e)
7515 hl_engine_data_sprintf(e,
7516 "\nCORE EDMA is_idle QM_GLBL_STS0 DMA_CORE_STS0 DMA_CORE_STS1\n"
7517 "---- ---- ------- ------------ ------------- -------------\n");
7518
7519 for (i = 0; i < NUM_OF_DCORES; i++) {
7520 for (j = 0 ; j < NUM_OF_EDMA_PER_DCORE ; j++) {
7521 int seq = i * NUM_OF_EDMA_PER_DCORE + j;
7522
7523 if (!(prop->edma_enabled_mask & BIT(seq)))
7524 continue;
7525
7526 engine_idx = GAUDI2_DCORE0_ENGINE_ID_EDMA_0 +
7527 i * GAUDI2_ENGINE_ID_DCORE_OFFSET + j;
7528 offset = i * DCORE_OFFSET + j * DCORE_EDMA_OFFSET;
7529
7530 dma_core_sts0 = RREG32(mmDCORE0_EDMA0_CORE_STS0 + offset);
7531 dma_core_sts1 = RREG32(mmDCORE0_EDMA0_CORE_STS1 + offset);
7532
7533 qm_glbl_sts0 = RREG32(mmDCORE0_EDMA0_QM_GLBL_STS0 + offset);
7534 qm_glbl_sts1 = RREG32(mmDCORE0_EDMA0_QM_GLBL_STS1 + offset);
7535 qm_cgm_sts = RREG32(mmDCORE0_EDMA0_QM_CGM_STS + offset);
7536
7537 is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts) &&
7538 IS_DMA_IDLE(dma_core_sts0) && !IS_DMA_HALTED(dma_core_sts1);
7539 is_idle &= is_eng_idle;
7540
7541 if (mask && !is_eng_idle)
7542 set_bit(engine_idx, mask);
7543
7544 if (e)
7545 hl_engine_data_sprintf(e, edma_fmt, i, j, is_eng_idle ? "Y" : "N",
7546 qm_glbl_sts0, dma_core_sts0, dma_core_sts1);
7547 }
7548 }
7549
7550 return is_idle;
7551 }
7552
gaudi2_get_pdma_idle_status(struct hl_device * hdev,u64 * mask_arr,u8 mask_len,struct engines_data * e)7553 static bool gaudi2_get_pdma_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,
7554 struct engines_data *e)
7555 {
7556 u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts, dma_core_sts0, dma_core_sts1;
7557 unsigned long *mask = (unsigned long *) mask_arr;
7558 const char *pdma_fmt = "%-6d%-9s%#-14x%#-15x%#x\n";
7559 bool is_idle = true, is_eng_idle;
7560 int engine_idx, i;
7561 u64 offset;
7562
7563 if (e)
7564 hl_engine_data_sprintf(e,
7565 "\nPDMA is_idle QM_GLBL_STS0 DMA_CORE_STS0 DMA_CORE_STS1\n"
7566 "---- ------- ------------ ------------- -------------\n");
7567
7568 for (i = 0 ; i < NUM_OF_PDMA ; i++) {
7569 engine_idx = GAUDI2_ENGINE_ID_PDMA_0 + i;
7570 offset = i * PDMA_OFFSET;
7571 dma_core_sts0 = RREG32(mmPDMA0_CORE_STS0 + offset);
7572 dma_core_sts1 = RREG32(mmPDMA0_CORE_STS1 + offset);
7573
7574 qm_glbl_sts0 = RREG32(mmPDMA0_QM_GLBL_STS0 + offset);
7575 qm_glbl_sts1 = RREG32(mmPDMA0_QM_GLBL_STS1 + offset);
7576 qm_cgm_sts = RREG32(mmPDMA0_QM_CGM_STS + offset);
7577
7578 is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts) &&
7579 IS_DMA_IDLE(dma_core_sts0) && !IS_DMA_HALTED(dma_core_sts1);
7580 is_idle &= is_eng_idle;
7581
7582 if (mask && !is_eng_idle)
7583 set_bit(engine_idx, mask);
7584
7585 if (e)
7586 hl_engine_data_sprintf(e, pdma_fmt, i, is_eng_idle ? "Y" : "N",
7587 qm_glbl_sts0, dma_core_sts0, dma_core_sts1);
7588 }
7589
7590 return is_idle;
7591 }
7592
gaudi2_get_nic_idle_status(struct hl_device * hdev,u64 * mask_arr,u8 mask_len,struct engines_data * e)7593 static bool gaudi2_get_nic_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,
7594 struct engines_data *e)
7595 {
7596 unsigned long *mask = (unsigned long *) mask_arr;
7597 const char *nic_fmt = "%-5d%-9s%#-14x%#-12x\n";
7598 u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts;
7599 bool is_idle = true, is_eng_idle;
7600 int engine_idx, i;
7601 u64 offset = 0;
7602
7603 /* NIC, twelve macros in Full chip */
7604 if (e && hdev->nic_ports_mask)
7605 hl_engine_data_sprintf(e,
7606 "\nNIC is_idle QM_GLBL_STS0 QM_CGM_STS\n"
7607 "--- ------- ------------ ----------\n");
7608
7609 for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++) {
7610 if (!(i & 1))
7611 offset = i / 2 * NIC_OFFSET;
7612 else
7613 offset += NIC_QM_OFFSET;
7614
7615 if (!(hdev->nic_ports_mask & BIT(i)))
7616 continue;
7617
7618 engine_idx = GAUDI2_ENGINE_ID_NIC0_0 + i;
7619
7620
7621 qm_glbl_sts0 = RREG32(mmNIC0_QM0_GLBL_STS0 + offset);
7622 qm_glbl_sts1 = RREG32(mmNIC0_QM0_GLBL_STS1 + offset);
7623 qm_cgm_sts = RREG32(mmNIC0_QM0_CGM_STS + offset);
7624
7625 is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts);
7626 is_idle &= is_eng_idle;
7627
7628 if (mask && !is_eng_idle)
7629 set_bit(engine_idx, mask);
7630
7631 if (e)
7632 hl_engine_data_sprintf(e, nic_fmt, i, is_eng_idle ? "Y" : "N",
7633 qm_glbl_sts0, qm_cgm_sts);
7634 }
7635
7636 return is_idle;
7637 }
7638
gaudi2_get_mme_idle_status(struct hl_device * hdev,u64 * mask_arr,u8 mask_len,struct engines_data * e)7639 static bool gaudi2_get_mme_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,
7640 struct engines_data *e)
7641 {
7642 u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts, mme_arch_sts;
7643 unsigned long *mask = (unsigned long *) mask_arr;
7644 const char *mme_fmt = "%-5d%-6s%-9s%#-14x%#x\n";
7645 bool is_idle = true, is_eng_idle;
7646 int engine_idx, i;
7647 u64 offset;
7648
7649 if (e)
7650 hl_engine_data_sprintf(e,
7651 "\nMME Stub is_idle QM_GLBL_STS0 MME_ARCH_STATUS\n"
7652 "--- ---- ------- ------------ ---------------\n");
7653 /* MME, one per Dcore */
7654 for (i = 0 ; i < NUM_OF_DCORES ; i++) {
7655 engine_idx = GAUDI2_DCORE0_ENGINE_ID_MME + i * GAUDI2_ENGINE_ID_DCORE_OFFSET;
7656 offset = i * DCORE_OFFSET;
7657
7658 qm_glbl_sts0 = RREG32(mmDCORE0_MME_QM_GLBL_STS0 + offset);
7659 qm_glbl_sts1 = RREG32(mmDCORE0_MME_QM_GLBL_STS1 + offset);
7660 qm_cgm_sts = RREG32(mmDCORE0_MME_QM_CGM_STS + offset);
7661
7662 is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts);
7663 is_idle &= is_eng_idle;
7664
7665 mme_arch_sts = RREG32(mmDCORE0_MME_CTRL_LO_ARCH_STATUS + offset);
7666 is_eng_idle &= IS_MME_IDLE(mme_arch_sts);
7667 is_idle &= is_eng_idle;
7668
7669 if (e)
7670 hl_engine_data_sprintf(e, mme_fmt, i, "N",
7671 is_eng_idle ? "Y" : "N",
7672 qm_glbl_sts0,
7673 mme_arch_sts);
7674
7675 if (mask && !is_eng_idle)
7676 set_bit(engine_idx, mask);
7677 }
7678
7679 return is_idle;
7680 }
7681
gaudi2_is_tpc_engine_idle(struct hl_device * hdev,int dcore,int inst,u32 offset,struct iterate_module_ctx * ctx)7682 static void gaudi2_is_tpc_engine_idle(struct hl_device *hdev, int dcore, int inst, u32 offset,
7683 struct iterate_module_ctx *ctx)
7684 {
7685 struct gaudi2_tpc_idle_data *idle_data = ctx->data;
7686 u32 tpc_cfg_sts, qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts;
7687 bool is_eng_idle;
7688 int engine_idx;
7689
7690 if ((dcore == 0) && (inst == (NUM_DCORE0_TPC - 1)))
7691 engine_idx = GAUDI2_DCORE0_ENGINE_ID_TPC_6;
7692 else
7693 engine_idx = GAUDI2_DCORE0_ENGINE_ID_TPC_0 +
7694 dcore * GAUDI2_ENGINE_ID_DCORE_OFFSET + inst;
7695
7696 tpc_cfg_sts = RREG32(mmDCORE0_TPC0_CFG_STATUS + offset);
7697 qm_glbl_sts0 = RREG32(mmDCORE0_TPC0_QM_GLBL_STS0 + offset);
7698 qm_glbl_sts1 = RREG32(mmDCORE0_TPC0_QM_GLBL_STS1 + offset);
7699 qm_cgm_sts = RREG32(mmDCORE0_TPC0_QM_CGM_STS + offset);
7700
7701 is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts) &&
7702 IS_TPC_IDLE(tpc_cfg_sts);
7703 *(idle_data->is_idle) &= is_eng_idle;
7704
7705 if (idle_data->mask && !is_eng_idle)
7706 set_bit(engine_idx, idle_data->mask);
7707
7708 if (idle_data->e)
7709 hl_engine_data_sprintf(idle_data->e,
7710 idle_data->tpc_fmt, dcore, inst,
7711 is_eng_idle ? "Y" : "N",
7712 qm_glbl_sts0, qm_cgm_sts, tpc_cfg_sts);
7713 }
7714
gaudi2_get_tpc_idle_status(struct hl_device * hdev,u64 * mask_arr,u8 mask_len,struct engines_data * e)7715 static bool gaudi2_get_tpc_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,
7716 struct engines_data *e)
7717 {
7718 struct asic_fixed_properties *prop = &hdev->asic_prop;
7719 unsigned long *mask = (unsigned long *) mask_arr;
7720 bool is_idle = true;
7721
7722 struct gaudi2_tpc_idle_data tpc_idle_data = {
7723 .tpc_fmt = "%-6d%-5d%-9s%#-14x%#-12x%#x\n",
7724 .e = e,
7725 .mask = mask,
7726 .is_idle = &is_idle,
7727 };
7728 struct iterate_module_ctx tpc_iter = {
7729 .fn = &gaudi2_is_tpc_engine_idle,
7730 .data = &tpc_idle_data,
7731 };
7732
7733 if (e && prop->tpc_enabled_mask)
7734 hl_engine_data_sprintf(e,
7735 "\nCORE TPC is_idle QM_GLBL_STS0 QM_CGM_STS STATUS\n"
7736 "---- --- ------- ------------ ---------- ------\n");
7737
7738 gaudi2_iterate_tpcs(hdev, &tpc_iter);
7739
7740 return *tpc_idle_data.is_idle;
7741 }
7742
gaudi2_get_decoder_idle_status(struct hl_device * hdev,u64 * mask_arr,u8 mask_len,struct engines_data * e)7743 static bool gaudi2_get_decoder_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,
7744 struct engines_data *e)
7745 {
7746 struct asic_fixed_properties *prop = &hdev->asic_prop;
7747 unsigned long *mask = (unsigned long *) mask_arr;
7748 const char *pcie_dec_fmt = "%-10d%-9s%#x\n";
7749 const char *dec_fmt = "%-6d%-5d%-9s%#x\n";
7750 bool is_idle = true, is_eng_idle;
7751 u32 dec_swreg15, dec_enabled_bit;
7752 int engine_idx, i, j;
7753 u64 offset;
7754
7755 /* Decoders, two each Dcore and two shared PCIe decoders */
7756 if (e && (prop->decoder_enabled_mask & (~PCIE_DEC_EN_MASK)))
7757 hl_engine_data_sprintf(e,
7758 "\nCORE DEC is_idle VSI_CMD_SWREG15\n"
7759 "---- --- ------- ---------------\n");
7760
7761 for (i = 0 ; i < NUM_OF_DCORES ; i++) {
7762 for (j = 0 ; j < NUM_OF_DEC_PER_DCORE ; j++) {
7763 dec_enabled_bit = 1 << (i * NUM_OF_DEC_PER_DCORE + j);
7764 if (!(prop->decoder_enabled_mask & dec_enabled_bit))
7765 continue;
7766
7767 engine_idx = GAUDI2_DCORE0_ENGINE_ID_DEC_0 +
7768 i * GAUDI2_ENGINE_ID_DCORE_OFFSET + j;
7769 offset = i * DCORE_OFFSET + j * DCORE_DEC_OFFSET;
7770
7771 dec_swreg15 = RREG32(mmDCORE0_DEC0_CMD_SWREG15 + offset);
7772 is_eng_idle = IS_DEC_IDLE(dec_swreg15);
7773 is_idle &= is_eng_idle;
7774
7775 if (mask && !is_eng_idle)
7776 set_bit(engine_idx, mask);
7777
7778 if (e)
7779 hl_engine_data_sprintf(e, dec_fmt, i, j,
7780 is_eng_idle ? "Y" : "N", dec_swreg15);
7781 }
7782 }
7783
7784 if (e && (prop->decoder_enabled_mask & PCIE_DEC_EN_MASK))
7785 hl_engine_data_sprintf(e,
7786 "\nPCIe DEC is_idle VSI_CMD_SWREG15\n"
7787 "-------- ------- ---------------\n");
7788
7789 /* Check shared(PCIe) decoders */
7790 for (i = 0 ; i < NUM_OF_DEC_PER_DCORE ; i++) {
7791 dec_enabled_bit = PCIE_DEC_SHIFT + i;
7792 if (!(prop->decoder_enabled_mask & BIT(dec_enabled_bit)))
7793 continue;
7794
7795 engine_idx = GAUDI2_PCIE_ENGINE_ID_DEC_0 + i;
7796 offset = i * DCORE_DEC_OFFSET;
7797 dec_swreg15 = RREG32(mmPCIE_DEC0_CMD_SWREG15 + offset);
7798 is_eng_idle = IS_DEC_IDLE(dec_swreg15);
7799 is_idle &= is_eng_idle;
7800
7801 if (mask && !is_eng_idle)
7802 set_bit(engine_idx, mask);
7803
7804 if (e)
7805 hl_engine_data_sprintf(e, pcie_dec_fmt, i,
7806 is_eng_idle ? "Y" : "N", dec_swreg15);
7807 }
7808
7809 return is_idle;
7810 }
7811
gaudi2_get_rotator_idle_status(struct hl_device * hdev,u64 * mask_arr,u8 mask_len,struct engines_data * e)7812 static bool gaudi2_get_rotator_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,
7813 struct engines_data *e)
7814 {
7815 const char *rot_fmt = "%-6d%-5d%-9s%#-14x%#-14x%#x\n";
7816 unsigned long *mask = (unsigned long *) mask_arr;
7817 u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts;
7818 bool is_idle = true, is_eng_idle;
7819 int engine_idx, i;
7820 u64 offset;
7821
7822 if (e)
7823 hl_engine_data_sprintf(e,
7824 "\nCORE ROT is_idle QM_GLBL_STS0 QM_GLBL_STS1 QM_CGM_STS\n"
7825 "---- --- ------- ------------ ------------ ----------\n");
7826
7827 for (i = 0 ; i < NUM_OF_ROT ; i++) {
7828 engine_idx = GAUDI2_ENGINE_ID_ROT_0 + i;
7829
7830 offset = i * ROT_OFFSET;
7831
7832 qm_glbl_sts0 = RREG32(mmROT0_QM_GLBL_STS0 + offset);
7833 qm_glbl_sts1 = RREG32(mmROT0_QM_GLBL_STS1 + offset);
7834 qm_cgm_sts = RREG32(mmROT0_QM_CGM_STS + offset);
7835
7836 is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts);
7837 is_idle &= is_eng_idle;
7838
7839 if (mask && !is_eng_idle)
7840 set_bit(engine_idx, mask);
7841
7842 if (e)
7843 hl_engine_data_sprintf(e, rot_fmt, i, 0, is_eng_idle ? "Y" : "N",
7844 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts);
7845 }
7846
7847 return is_idle;
7848 }
7849
gaudi2_is_device_idle(struct hl_device * hdev,u64 * mask_arr,u8 mask_len,struct engines_data * e)7850 static bool gaudi2_is_device_idle(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,
7851 struct engines_data *e)
7852 {
7853 bool is_idle = true;
7854
7855 is_idle &= gaudi2_get_edma_idle_status(hdev, mask_arr, mask_len, e);
7856 is_idle &= gaudi2_get_pdma_idle_status(hdev, mask_arr, mask_len, e);
7857 is_idle &= gaudi2_get_nic_idle_status(hdev, mask_arr, mask_len, e);
7858 is_idle &= gaudi2_get_mme_idle_status(hdev, mask_arr, mask_len, e);
7859 is_idle &= gaudi2_get_tpc_idle_status(hdev, mask_arr, mask_len, e);
7860 is_idle &= gaudi2_get_decoder_idle_status(hdev, mask_arr, mask_len, e);
7861 is_idle &= gaudi2_get_rotator_idle_status(hdev, mask_arr, mask_len, e);
7862
7863 return is_idle;
7864 }
7865
gaudi2_hw_queues_lock(struct hl_device * hdev)7866 static void gaudi2_hw_queues_lock(struct hl_device *hdev)
7867 __acquires(&gaudi2->hw_queues_lock)
7868 {
7869 struct gaudi2_device *gaudi2 = hdev->asic_specific;
7870
7871 spin_lock(&gaudi2->hw_queues_lock);
7872 }
7873
gaudi2_hw_queues_unlock(struct hl_device * hdev)7874 static void gaudi2_hw_queues_unlock(struct hl_device *hdev)
7875 __releases(&gaudi2->hw_queues_lock)
7876 {
7877 struct gaudi2_device *gaudi2 = hdev->asic_specific;
7878
7879 spin_unlock(&gaudi2->hw_queues_lock);
7880 }
7881
gaudi2_get_pci_id(struct hl_device * hdev)7882 static u32 gaudi2_get_pci_id(struct hl_device *hdev)
7883 {
7884 return hdev->pdev->device;
7885 }
7886
gaudi2_get_eeprom_data(struct hl_device * hdev,void * data,size_t max_size)7887 static int gaudi2_get_eeprom_data(struct hl_device *hdev, void *data, size_t max_size)
7888 {
7889 struct gaudi2_device *gaudi2 = hdev->asic_specific;
7890
7891 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))
7892 return 0;
7893
7894 return hl_fw_get_eeprom_data(hdev, data, max_size);
7895 }
7896
gaudi2_update_eq_ci(struct hl_device * hdev,u32 val)7897 static void gaudi2_update_eq_ci(struct hl_device *hdev, u32 val)
7898 {
7899 WREG32(mmCPU_IF_EQ_RD_OFFS, val);
7900 }
7901
gaudi2_get_events_stat(struct hl_device * hdev,bool aggregate,u32 * size)7902 static void *gaudi2_get_events_stat(struct hl_device *hdev, bool aggregate, u32 *size)
7903 {
7904 struct gaudi2_device *gaudi2 = hdev->asic_specific;
7905
7906 if (aggregate) {
7907 *size = (u32) sizeof(gaudi2->events_stat_aggregate);
7908 return gaudi2->events_stat_aggregate;
7909 }
7910
7911 *size = (u32) sizeof(gaudi2->events_stat);
7912 return gaudi2->events_stat;
7913 }
7914
gaudi2_mmu_vdec_dcore_prepare(struct hl_device * hdev,int dcore_id,int dcore_vdec_id,u32 rw_asid,u32 rw_mmu_bp)7915 static void gaudi2_mmu_vdec_dcore_prepare(struct hl_device *hdev, int dcore_id,
7916 int dcore_vdec_id, u32 rw_asid, u32 rw_mmu_bp)
7917 {
7918 u32 offset = (mmDCORE0_VDEC1_BRDG_CTRL_BASE - mmDCORE0_VDEC0_BRDG_CTRL_BASE) *
7919 dcore_vdec_id + DCORE_OFFSET * dcore_id;
7920
7921 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_MMU_BP + offset, rw_mmu_bp);
7922 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_ASID + offset, rw_asid);
7923
7924 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_MMU_BP + offset, rw_mmu_bp);
7925 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_ASID + offset, rw_asid);
7926
7927 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_MMU_BP + offset, rw_mmu_bp);
7928 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_ASID + offset, rw_asid);
7929
7930 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_MMU_BP + offset, rw_mmu_bp);
7931 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_ASID + offset, rw_asid);
7932
7933 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_MMU_BP + offset, rw_mmu_bp);
7934 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_ASID + offset, rw_asid);
7935 }
7936
gaudi2_mmu_dcore_prepare(struct hl_device * hdev,int dcore_id,u32 asid)7937 static void gaudi2_mmu_dcore_prepare(struct hl_device *hdev, int dcore_id, u32 asid)
7938 {
7939 u32 rw_asid = (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_SHIFT) |
7940 (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_SHIFT);
7941 struct asic_fixed_properties *prop = &hdev->asic_prop;
7942 u32 dcore_offset = dcore_id * DCORE_OFFSET;
7943 u32 vdec_id, i, ports_offset, reg_val;
7944 u8 edma_seq_base;
7945
7946 /* EDMA */
7947 edma_seq_base = dcore_id * NUM_OF_EDMA_PER_DCORE;
7948 if (prop->edma_enabled_mask & BIT(edma_seq_base)) {
7949 WREG32(mmDCORE0_EDMA0_QM_AXUSER_NONSECURED_HB_MMU_BP + dcore_offset, 0);
7950 WREG32(mmDCORE0_EDMA0_QM_AXUSER_NONSECURED_HB_ASID + dcore_offset, rw_asid);
7951 WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP + dcore_offset, 0);
7952 WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_ASID + dcore_offset, rw_asid);
7953 }
7954
7955 if (prop->edma_enabled_mask & BIT(edma_seq_base + 1)) {
7956 WREG32(mmDCORE0_EDMA1_QM_AXUSER_NONSECURED_HB_MMU_BP + dcore_offset, 0);
7957 WREG32(mmDCORE0_EDMA1_QM_AXUSER_NONSECURED_HB_ASID + dcore_offset, rw_asid);
7958 WREG32(mmDCORE0_EDMA1_CORE_CTX_AXUSER_HB_ASID + dcore_offset, rw_asid);
7959 WREG32(mmDCORE0_EDMA1_CORE_CTX_AXUSER_HB_MMU_BP + dcore_offset, 0);
7960 }
7961
7962 /* Sync Mngr */
7963 WREG32(mmDCORE0_SYNC_MNGR_GLBL_ASID_NONE_SEC_PRIV + dcore_offset, asid);
7964 /*
7965 * Sync Mngrs on dcores 1 - 3 are exposed to user, so must use user ASID
7966 * for any access type
7967 */
7968 if (dcore_id > 0) {
7969 reg_val = (asid << DCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_ASID_RD_SHIFT) |
7970 (asid << DCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_ASID_WR_SHIFT);
7971 WREG32(mmDCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_ASID + dcore_offset, reg_val);
7972 WREG32(mmDCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_MMU_BP + dcore_offset, 0);
7973 }
7974
7975 WREG32(mmDCORE0_MME_CTRL_LO_MME_AXUSER_HB_MMU_BP + dcore_offset, 0);
7976 WREG32(mmDCORE0_MME_CTRL_LO_MME_AXUSER_HB_ASID + dcore_offset, rw_asid);
7977
7978 for (i = 0 ; i < NUM_OF_MME_SBTE_PORTS ; i++) {
7979 ports_offset = i * DCORE_MME_SBTE_OFFSET;
7980 WREG32(mmDCORE0_MME_SBTE0_MSTR_IF_AXUSER_HB_MMU_BP +
7981 dcore_offset + ports_offset, 0);
7982 WREG32(mmDCORE0_MME_SBTE0_MSTR_IF_AXUSER_HB_ASID +
7983 dcore_offset + ports_offset, rw_asid);
7984 }
7985
7986 for (i = 0 ; i < NUM_OF_MME_WB_PORTS ; i++) {
7987 ports_offset = i * DCORE_MME_WB_OFFSET;
7988 WREG32(mmDCORE0_MME_WB0_MSTR_IF_AXUSER_HB_MMU_BP +
7989 dcore_offset + ports_offset, 0);
7990 WREG32(mmDCORE0_MME_WB0_MSTR_IF_AXUSER_HB_ASID +
7991 dcore_offset + ports_offset, rw_asid);
7992 }
7993
7994 WREG32(mmDCORE0_MME_QM_AXUSER_NONSECURED_HB_MMU_BP + dcore_offset, 0);
7995 WREG32(mmDCORE0_MME_QM_AXUSER_NONSECURED_HB_ASID + dcore_offset, rw_asid);
7996
7997 /*
7998 * Decoders
7999 */
8000 for (vdec_id = 0 ; vdec_id < NUM_OF_DEC_PER_DCORE ; vdec_id++) {
8001 if (prop->decoder_enabled_mask & BIT(dcore_id * NUM_OF_DEC_PER_DCORE + vdec_id))
8002 gaudi2_mmu_vdec_dcore_prepare(hdev, dcore_id, vdec_id, rw_asid, 0);
8003 }
8004 }
8005
gudi2_mmu_vdec_shared_prepare(struct hl_device * hdev,int shared_vdec_id,u32 rw_asid,u32 rw_mmu_bp)8006 static void gudi2_mmu_vdec_shared_prepare(struct hl_device *hdev,
8007 int shared_vdec_id, u32 rw_asid, u32 rw_mmu_bp)
8008 {
8009 u32 offset = (mmPCIE_VDEC1_BRDG_CTRL_BASE - mmPCIE_VDEC0_BRDG_CTRL_BASE) * shared_vdec_id;
8010
8011 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_MMU_BP + offset, rw_mmu_bp);
8012 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_ASID + offset, rw_asid);
8013
8014 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_MMU_BP + offset, rw_mmu_bp);
8015 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_ASID + offset, rw_asid);
8016
8017 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_MMU_BP + offset, rw_mmu_bp);
8018 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_ASID + offset, rw_asid);
8019
8020 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_MMU_BP + offset, rw_mmu_bp);
8021 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_ASID + offset, rw_asid);
8022
8023 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_MMU_BP + offset, rw_mmu_bp);
8024 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_ASID + offset, rw_asid);
8025 }
8026
gudi2_mmu_arc_farm_arc_dup_eng_prepare(struct hl_device * hdev,int arc_farm_id,u32 rw_asid,u32 rw_mmu_bp)8027 static void gudi2_mmu_arc_farm_arc_dup_eng_prepare(struct hl_device *hdev, int arc_farm_id,
8028 u32 rw_asid, u32 rw_mmu_bp)
8029 {
8030 u32 offset = (mmARC_FARM_ARC1_DUP_ENG_BASE - mmARC_FARM_ARC0_DUP_ENG_BASE) * arc_farm_id;
8031
8032 WREG32(mmARC_FARM_ARC0_DUP_ENG_AXUSER_HB_MMU_BP + offset, rw_mmu_bp);
8033 WREG32(mmARC_FARM_ARC0_DUP_ENG_AXUSER_HB_ASID + offset, rw_asid);
8034 }
8035
gaudi2_arc_mmu_prepare(struct hl_device * hdev,u32 cpu_id,u32 asid)8036 static void gaudi2_arc_mmu_prepare(struct hl_device *hdev, u32 cpu_id, u32 asid)
8037 {
8038 u32 reg_base, reg_offset, reg_val = 0;
8039
8040 reg_base = gaudi2_arc_blocks_bases[cpu_id];
8041
8042 /* Enable MMU and configure asid for all relevant ARC regions */
8043 reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_ARC_REGION_CFG_MMU_BP_MASK, 0);
8044 reg_val |= FIELD_PREP(ARC_FARM_ARC0_AUX_ARC_REGION_CFG_0_ASID_MASK, asid);
8045
8046 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION3_GENERAL);
8047 WREG32(reg_base + reg_offset, reg_val);
8048
8049 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION4_HBM0_FW);
8050 WREG32(reg_base + reg_offset, reg_val);
8051
8052 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION5_HBM1_GC_DATA);
8053 WREG32(reg_base + reg_offset, reg_val);
8054
8055 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION6_HBM2_GC_DATA);
8056 WREG32(reg_base + reg_offset, reg_val);
8057
8058 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION7_HBM3_GC_DATA);
8059 WREG32(reg_base + reg_offset, reg_val);
8060
8061 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION9_PCIE);
8062 WREG32(reg_base + reg_offset, reg_val);
8063
8064 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION10_GENERAL);
8065 WREG32(reg_base + reg_offset, reg_val);
8066
8067 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION11_GENERAL);
8068 WREG32(reg_base + reg_offset, reg_val);
8069
8070 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION12_GENERAL);
8071 WREG32(reg_base + reg_offset, reg_val);
8072
8073 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION13_GENERAL);
8074 WREG32(reg_base + reg_offset, reg_val);
8075
8076 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION14_GENERAL);
8077 WREG32(reg_base + reg_offset, reg_val);
8078 }
8079
gaudi2_arc_mmu_prepare_all(struct hl_device * hdev,u32 asid)8080 static int gaudi2_arc_mmu_prepare_all(struct hl_device *hdev, u32 asid)
8081 {
8082 int i;
8083
8084 if (hdev->fw_components & FW_TYPE_BOOT_CPU)
8085 return hl_fw_cpucp_engine_core_asid_set(hdev, asid);
8086
8087 for (i = CPU_ID_SCHED_ARC0 ; i < NUM_OF_ARC_FARMS_ARC ; i++)
8088 gaudi2_arc_mmu_prepare(hdev, i, asid);
8089
8090 for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ ; i += 4) {
8091 if (!gaudi2_is_queue_enabled(hdev, i))
8092 continue;
8093
8094 gaudi2_arc_mmu_prepare(hdev, gaudi2_queue_id_to_arc_id[i], asid);
8095 }
8096
8097 return 0;
8098 }
8099
gaudi2_mmu_shared_prepare(struct hl_device * hdev,u32 asid)8100 static int gaudi2_mmu_shared_prepare(struct hl_device *hdev, u32 asid)
8101 {
8102 struct asic_fixed_properties *prop = &hdev->asic_prop;
8103 u32 rw_asid, offset;
8104 int rc, i;
8105
8106 rw_asid = FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_MASK, asid) |
8107 FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_MASK, asid);
8108
8109 WREG32(mmPDMA0_QM_AXUSER_NONSECURED_HB_ASID, rw_asid);
8110 WREG32(mmPDMA0_QM_AXUSER_NONSECURED_HB_MMU_BP, 0);
8111 WREG32(mmPDMA0_CORE_CTX_AXUSER_HB_ASID, rw_asid);
8112 WREG32(mmPDMA0_CORE_CTX_AXUSER_HB_MMU_BP, 0);
8113
8114 WREG32(mmPDMA1_QM_AXUSER_NONSECURED_HB_ASID, rw_asid);
8115 WREG32(mmPDMA1_QM_AXUSER_NONSECURED_HB_MMU_BP, 0);
8116 WREG32(mmPDMA1_CORE_CTX_AXUSER_HB_ASID, rw_asid);
8117 WREG32(mmPDMA1_CORE_CTX_AXUSER_HB_MMU_BP, 0);
8118
8119 /* ROT */
8120 for (i = 0 ; i < NUM_OF_ROT ; i++) {
8121 offset = i * ROT_OFFSET;
8122 WREG32(mmROT0_QM_AXUSER_NONSECURED_HB_ASID + offset, rw_asid);
8123 WREG32(mmROT0_QM_AXUSER_NONSECURED_HB_MMU_BP + offset, 0);
8124 RMWREG32(mmROT0_CPL_QUEUE_AWUSER + offset, asid, MMUBP_ASID_MASK);
8125 RMWREG32(mmROT0_DESC_HBW_ARUSER_LO + offset, asid, MMUBP_ASID_MASK);
8126 RMWREG32(mmROT0_DESC_HBW_AWUSER_LO + offset, asid, MMUBP_ASID_MASK);
8127 }
8128
8129 /* Shared Decoders are the last bits in the decoders mask */
8130 if (prop->decoder_enabled_mask & BIT(NUM_OF_DCORES * NUM_OF_DEC_PER_DCORE + 0))
8131 gudi2_mmu_vdec_shared_prepare(hdev, 0, rw_asid, 0);
8132
8133 if (prop->decoder_enabled_mask & BIT(NUM_OF_DCORES * NUM_OF_DEC_PER_DCORE + 1))
8134 gudi2_mmu_vdec_shared_prepare(hdev, 1, rw_asid, 0);
8135
8136 /* arc farm arc dup eng */
8137 for (i = 0 ; i < NUM_OF_ARC_FARMS_ARC ; i++)
8138 gudi2_mmu_arc_farm_arc_dup_eng_prepare(hdev, i, rw_asid, 0);
8139
8140 rc = gaudi2_arc_mmu_prepare_all(hdev, asid);
8141 if (rc)
8142 return rc;
8143
8144 return 0;
8145 }
8146
gaudi2_tpc_mmu_prepare(struct hl_device * hdev,int dcore,int inst,u32 offset,struct iterate_module_ctx * ctx)8147 static void gaudi2_tpc_mmu_prepare(struct hl_device *hdev, int dcore, int inst, u32 offset,
8148 struct iterate_module_ctx *ctx)
8149 {
8150 struct gaudi2_tpc_mmu_data *mmu_data = ctx->data;
8151
8152 WREG32(mmDCORE0_TPC0_CFG_AXUSER_HB_MMU_BP + offset, 0);
8153 WREG32(mmDCORE0_TPC0_CFG_AXUSER_HB_ASID + offset, mmu_data->rw_asid);
8154 WREG32(mmDCORE0_TPC0_QM_AXUSER_NONSECURED_HB_MMU_BP + offset, 0);
8155 WREG32(mmDCORE0_TPC0_QM_AXUSER_NONSECURED_HB_ASID + offset, mmu_data->rw_asid);
8156 }
8157
8158 /* zero the MMUBP and set the ASID */
gaudi2_mmu_prepare(struct hl_device * hdev,u32 asid)8159 static int gaudi2_mmu_prepare(struct hl_device *hdev, u32 asid)
8160 {
8161 struct gaudi2_device *gaudi2 = hdev->asic_specific;
8162 struct gaudi2_tpc_mmu_data tpc_mmu_data;
8163 struct iterate_module_ctx tpc_iter = {
8164 .fn = &gaudi2_tpc_mmu_prepare,
8165 .data = &tpc_mmu_data,
8166 };
8167 int rc, i;
8168
8169 if (asid & ~DCORE0_HMMU0_STLB_ASID_ASID_MASK) {
8170 dev_crit(hdev->dev, "asid %u is too big\n", asid);
8171 return -EINVAL;
8172 }
8173
8174 if (!(gaudi2->hw_cap_initialized & HW_CAP_MMU_MASK))
8175 return 0;
8176
8177 rc = gaudi2_mmu_shared_prepare(hdev, asid);
8178 if (rc)
8179 return rc;
8180
8181 /* configure DCORE MMUs */
8182 tpc_mmu_data.rw_asid = (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_SHIFT) |
8183 (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_SHIFT);
8184 gaudi2_iterate_tpcs(hdev, &tpc_iter);
8185 for (i = 0 ; i < NUM_OF_DCORES ; i++)
8186 gaudi2_mmu_dcore_prepare(hdev, i, asid);
8187
8188 return 0;
8189 }
8190
is_info_event(u32 event)8191 static inline bool is_info_event(u32 event)
8192 {
8193 switch (event) {
8194 case GAUDI2_EVENT_CPU_CPLD_SHUTDOWN_CAUSE:
8195 case GAUDI2_EVENT_CPU_FIX_POWER_ENV_S ... GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_E:
8196 case GAUDI2_EVENT_ARC_PWR_BRK_ENTRY ... GAUDI2_EVENT_ARC_PWR_RD_MODE3:
8197
8198 /* return in case of NIC status event - these events are received periodically and not as
8199 * an indication to an error.
8200 */
8201 case GAUDI2_EVENT_CPU0_STATUS_NIC0_ENG0 ... GAUDI2_EVENT_CPU11_STATUS_NIC11_ENG1:
8202 case GAUDI2_EVENT_ARC_EQ_HEARTBEAT:
8203 return true;
8204 default:
8205 return false;
8206 }
8207 }
8208
gaudi2_print_event(struct hl_device * hdev,u16 event_type,bool ratelimited,const char * fmt,...)8209 static void gaudi2_print_event(struct hl_device *hdev, u16 event_type,
8210 bool ratelimited, const char *fmt, ...)
8211 {
8212 struct va_format vaf;
8213 va_list args;
8214
8215 va_start(args, fmt);
8216 vaf.fmt = fmt;
8217 vaf.va = &args;
8218
8219 if (ratelimited)
8220 dev_err_ratelimited(hdev->dev, "%s: %pV\n",
8221 gaudi2_irq_map_table[event_type].valid ?
8222 gaudi2_irq_map_table[event_type].name : "N/A Event", &vaf);
8223 else
8224 dev_err(hdev->dev, "%s: %pV\n",
8225 gaudi2_irq_map_table[event_type].valid ?
8226 gaudi2_irq_map_table[event_type].name : "N/A Event", &vaf);
8227
8228 va_end(args);
8229 }
8230
gaudi2_handle_ecc_event(struct hl_device * hdev,u16 event_type,struct hl_eq_ecc_data * ecc_data)8231 static bool gaudi2_handle_ecc_event(struct hl_device *hdev, u16 event_type,
8232 struct hl_eq_ecc_data *ecc_data)
8233 {
8234 u64 ecc_address = 0, ecc_syndrome = 0;
8235 u8 memory_wrapper_idx = 0;
8236 bool has_block_id = false;
8237 u16 block_id;
8238
8239 if (hl_fw_version_cmp(hdev, 1, 12, 0) >= 0)
8240 has_block_id = true;
8241
8242 ecc_address = le64_to_cpu(ecc_data->ecc_address);
8243 ecc_syndrome = le64_to_cpu(ecc_data->ecc_syndrom);
8244 memory_wrapper_idx = ecc_data->memory_wrapper_idx;
8245
8246 if (has_block_id) {
8247 block_id = le16_to_cpu(ecc_data->block_id);
8248 gaudi2_print_event(hdev, event_type, !ecc_data->is_critical,
8249 "ECC error detected. address: %#llx. Syndrome: %#llx. wrapper id %u. block id %#x. critical %u.",
8250 ecc_address, ecc_syndrome, memory_wrapper_idx, block_id,
8251 ecc_data->is_critical);
8252 } else {
8253 gaudi2_print_event(hdev, event_type, !ecc_data->is_critical,
8254 "ECC error detected. address: %#llx. Syndrome: %#llx. wrapper id %u. critical %u.",
8255 ecc_address, ecc_syndrome, memory_wrapper_idx, ecc_data->is_critical);
8256 }
8257
8258 return !!ecc_data->is_critical;
8259 }
8260
handle_lower_qman_data_on_err(struct hl_device * hdev,u64 qman_base,u32 engine_id)8261 static void handle_lower_qman_data_on_err(struct hl_device *hdev, u64 qman_base, u32 engine_id)
8262 {
8263 struct undefined_opcode_info *undef_opcode = &hdev->captured_err_info.undef_opcode;
8264 u64 cq_ptr, cp_current_inst;
8265 u32 lo, hi, cq_size, cp_sts;
8266 bool is_arc_cq;
8267
8268 cp_sts = RREG32(qman_base + QM_CP_STS_4_OFFSET);
8269 is_arc_cq = FIELD_GET(PDMA0_QM_CP_STS_CUR_CQ_MASK, cp_sts); /* 0 - legacy CQ, 1 - ARC_CQ */
8270
8271 if (is_arc_cq) {
8272 lo = RREG32(qman_base + QM_ARC_CQ_PTR_LO_STS_OFFSET);
8273 hi = RREG32(qman_base + QM_ARC_CQ_PTR_HI_STS_OFFSET);
8274 cq_ptr = ((u64) hi) << 32 | lo;
8275 cq_size = RREG32(qman_base + QM_ARC_CQ_TSIZE_STS_OFFSET);
8276 } else {
8277 lo = RREG32(qman_base + QM_CQ_PTR_LO_STS_4_OFFSET);
8278 hi = RREG32(qman_base + QM_CQ_PTR_HI_STS_4_OFFSET);
8279 cq_ptr = ((u64) hi) << 32 | lo;
8280 cq_size = RREG32(qman_base + QM_CQ_TSIZE_STS_4_OFFSET);
8281 }
8282
8283 lo = RREG32(qman_base + QM_CP_CURRENT_INST_LO_4_OFFSET);
8284 hi = RREG32(qman_base + QM_CP_CURRENT_INST_HI_4_OFFSET);
8285 cp_current_inst = ((u64) hi) << 32 | lo;
8286
8287 dev_info(hdev->dev,
8288 "LowerQM. %sCQ: {ptr %#llx, size %u}, CP: {instruction %#018llx}\n",
8289 is_arc_cq ? "ARC_" : "", cq_ptr, cq_size, cp_current_inst);
8290
8291 if (undef_opcode->write_enable) {
8292 memset(undef_opcode, 0, sizeof(*undef_opcode));
8293 undef_opcode->timestamp = ktime_get();
8294 undef_opcode->cq_addr = cq_ptr;
8295 undef_opcode->cq_size = cq_size;
8296 undef_opcode->engine_id = engine_id;
8297 undef_opcode->stream_id = QMAN_STREAMS;
8298 undef_opcode->write_enable = 0;
8299 }
8300 }
8301
gaudi2_handle_qman_err_generic(struct hl_device * hdev,u16 event_type,u64 qman_base,u32 qid_base,u64 * event_mask)8302 static int gaudi2_handle_qman_err_generic(struct hl_device *hdev, u16 event_type,
8303 u64 qman_base, u32 qid_base, u64 *event_mask)
8304 {
8305 u32 i, j, glbl_sts_val, arb_err_val, num_error_causes, error_count = 0;
8306 u64 glbl_sts_addr, arb_err_addr;
8307 char reg_desc[32];
8308
8309 glbl_sts_addr = qman_base + (mmDCORE0_TPC0_QM_GLBL_ERR_STS_0 - mmDCORE0_TPC0_QM_BASE);
8310 arb_err_addr = qman_base + (mmDCORE0_TPC0_QM_ARB_ERR_CAUSE - mmDCORE0_TPC0_QM_BASE);
8311
8312 /* Iterate through all stream GLBL_ERR_STS registers + Lower CP */
8313 for (i = 0 ; i < QMAN_STREAMS + 1 ; i++) {
8314 glbl_sts_val = RREG32(glbl_sts_addr + 4 * i);
8315
8316 if (!glbl_sts_val)
8317 continue;
8318
8319 if (i == QMAN_STREAMS) {
8320 snprintf(reg_desc, ARRAY_SIZE(reg_desc), "LowerQM");
8321 num_error_causes = GAUDI2_NUM_OF_LOWER_QM_ERR_CAUSE;
8322 } else {
8323 snprintf(reg_desc, ARRAY_SIZE(reg_desc), "stream%u", i);
8324 num_error_causes = GAUDI2_NUM_OF_QM_ERR_CAUSE;
8325 }
8326
8327 for (j = 0 ; j < num_error_causes ; j++)
8328 if (glbl_sts_val & BIT(j)) {
8329 gaudi2_print_event(hdev, event_type, true,
8330 "%s. err cause: %s", reg_desc,
8331 i == QMAN_STREAMS ?
8332 gaudi2_lower_qman_error_cause[j] :
8333 gaudi2_qman_error_cause[j]);
8334 error_count++;
8335 }
8336
8337 /* Check for undefined opcode error in lower QM */
8338 if ((i == QMAN_STREAMS) &&
8339 (glbl_sts_val & PDMA0_QM_GLBL_ERR_STS_CP_UNDEF_CMD_ERR_MASK)) {
8340 handle_lower_qman_data_on_err(hdev, qman_base,
8341 gaudi2_queue_id_to_engine_id[qid_base]);
8342 *event_mask |= HL_NOTIFIER_EVENT_UNDEFINED_OPCODE;
8343 }
8344 }
8345
8346 arb_err_val = RREG32(arb_err_addr);
8347
8348 if (!arb_err_val)
8349 goto out;
8350
8351 for (j = 0 ; j < GAUDI2_NUM_OF_QM_ARB_ERR_CAUSE ; j++) {
8352 if (arb_err_val & BIT(j)) {
8353 gaudi2_print_event(hdev, event_type, true,
8354 "ARB_ERR. err cause: %s",
8355 gaudi2_qman_arb_error_cause[j]);
8356 error_count++;
8357 }
8358 }
8359
8360 out:
8361 return error_count;
8362 }
8363
gaudi2_razwi_rr_hbw_shared_printf_info(struct hl_device * hdev,u64 rtr_mstr_if_base_addr,bool is_write,char * name,enum gaudi2_engine_id id,u64 * event_mask)8364 static void gaudi2_razwi_rr_hbw_shared_printf_info(struct hl_device *hdev,
8365 u64 rtr_mstr_if_base_addr, bool is_write, char *name,
8366 enum gaudi2_engine_id id, u64 *event_mask)
8367 {
8368 u32 razwi_hi, razwi_lo, razwi_xy;
8369 u16 eng_id = id;
8370 u8 rd_wr_flag;
8371
8372 if (is_write) {
8373 razwi_hi = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_HI);
8374 razwi_lo = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_LO);
8375 razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_XY);
8376 rd_wr_flag = HL_RAZWI_WRITE;
8377 } else {
8378 razwi_hi = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_HI);
8379 razwi_lo = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_LO);
8380 razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_XY);
8381 rd_wr_flag = HL_RAZWI_READ;
8382 }
8383
8384 hl_handle_razwi(hdev, (u64)razwi_hi << 32 | razwi_lo, &eng_id, 1,
8385 rd_wr_flag | HL_RAZWI_HBW, event_mask);
8386
8387 dev_err_ratelimited(hdev->dev,
8388 "%s-RAZWI SHARED RR HBW %s error, address %#llx, Initiator coordinates 0x%x\n",
8389 name, is_write ? "WR" : "RD", (u64)razwi_hi << 32 | razwi_lo, razwi_xy);
8390 }
8391
gaudi2_razwi_rr_lbw_shared_printf_info(struct hl_device * hdev,u64 rtr_mstr_if_base_addr,bool is_write,char * name,enum gaudi2_engine_id id,u64 * event_mask)8392 static void gaudi2_razwi_rr_lbw_shared_printf_info(struct hl_device *hdev,
8393 u64 rtr_mstr_if_base_addr, bool is_write, char *name,
8394 enum gaudi2_engine_id id, u64 *event_mask)
8395 {
8396 u64 razwi_addr = CFG_BASE;
8397 u32 razwi_xy;
8398 u16 eng_id = id;
8399 u8 rd_wr_flag;
8400
8401 if (is_write) {
8402 razwi_addr += RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI);
8403 razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI_XY);
8404 rd_wr_flag = HL_RAZWI_WRITE;
8405 } else {
8406 razwi_addr += RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI);
8407 razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI_XY);
8408 rd_wr_flag = HL_RAZWI_READ;
8409 }
8410
8411 hl_handle_razwi(hdev, razwi_addr, &eng_id, 1, rd_wr_flag | HL_RAZWI_LBW, event_mask);
8412 dev_err_ratelimited(hdev->dev,
8413 "%s-RAZWI SHARED RR LBW %s error, mstr_if 0x%llx, captured address 0x%llX Initiator coordinates 0x%x\n",
8414 name, is_write ? "WR" : "RD", rtr_mstr_if_base_addr, razwi_addr,
8415 razwi_xy);
8416 }
8417
gaudi2_razwi_calc_engine_id(struct hl_device * hdev,enum razwi_event_sources module,u8 module_idx)8418 static enum gaudi2_engine_id gaudi2_razwi_calc_engine_id(struct hl_device *hdev,
8419 enum razwi_event_sources module, u8 module_idx)
8420 {
8421 switch (module) {
8422 case RAZWI_TPC:
8423 if (module_idx == (NUM_OF_TPC_PER_DCORE * NUM_OF_DCORES))
8424 return GAUDI2_DCORE0_ENGINE_ID_TPC_6;
8425 return (((module_idx / NUM_OF_TPC_PER_DCORE) * ENGINE_ID_DCORE_OFFSET) +
8426 (module_idx % NUM_OF_TPC_PER_DCORE) +
8427 (GAUDI2_DCORE0_ENGINE_ID_TPC_0 - GAUDI2_DCORE0_ENGINE_ID_EDMA_0));
8428
8429 case RAZWI_MME:
8430 return ((GAUDI2_DCORE0_ENGINE_ID_MME - GAUDI2_DCORE0_ENGINE_ID_EDMA_0) +
8431 (module_idx * ENGINE_ID_DCORE_OFFSET));
8432
8433 case RAZWI_EDMA:
8434 return (((module_idx / NUM_OF_EDMA_PER_DCORE) * ENGINE_ID_DCORE_OFFSET) +
8435 (module_idx % NUM_OF_EDMA_PER_DCORE));
8436
8437 case RAZWI_PDMA:
8438 return (GAUDI2_ENGINE_ID_PDMA_0 + module_idx);
8439
8440 case RAZWI_NIC:
8441 return (GAUDI2_ENGINE_ID_NIC0_0 + (NIC_NUMBER_OF_QM_PER_MACRO * module_idx));
8442
8443 case RAZWI_DEC:
8444 if (module_idx == 8)
8445 return GAUDI2_PCIE_ENGINE_ID_DEC_0;
8446
8447 if (module_idx == 9)
8448 return GAUDI2_PCIE_ENGINE_ID_DEC_1;
8449 ;
8450 return (((module_idx / NUM_OF_DEC_PER_DCORE) * ENGINE_ID_DCORE_OFFSET) +
8451 (module_idx % NUM_OF_DEC_PER_DCORE) +
8452 (GAUDI2_DCORE0_ENGINE_ID_DEC_0 - GAUDI2_DCORE0_ENGINE_ID_EDMA_0));
8453
8454 case RAZWI_ROT:
8455 return GAUDI2_ENGINE_ID_ROT_0 + module_idx;
8456
8457 case RAZWI_ARC_FARM:
8458 return GAUDI2_ENGINE_ID_ARC_FARM;
8459
8460 default:
8461 return GAUDI2_ENGINE_ID_SIZE;
8462 }
8463 }
8464
8465 /*
8466 * This function handles RR(Range register) hit events.
8467 * raised be initiators not PSOC RAZWI.
8468 */
gaudi2_ack_module_razwi_event_handler(struct hl_device * hdev,enum razwi_event_sources module,u8 module_idx,u8 module_sub_idx,u64 * event_mask)8469 static void gaudi2_ack_module_razwi_event_handler(struct hl_device *hdev,
8470 enum razwi_event_sources module, u8 module_idx,
8471 u8 module_sub_idx, u64 *event_mask)
8472 {
8473 bool via_sft = false;
8474 u32 hbw_rtr_id, lbw_rtr_id, dcore_id, dcore_rtr_id, eng_id, binned_idx;
8475 u64 hbw_rtr_mstr_if_base_addr, lbw_rtr_mstr_if_base_addr;
8476 u32 hbw_shrd_aw = 0, hbw_shrd_ar = 0;
8477 u32 lbw_shrd_aw = 0, lbw_shrd_ar = 0;
8478 char initiator_name[64];
8479
8480 switch (module) {
8481 case RAZWI_TPC:
8482 sprintf(initiator_name, "TPC_%u", module_idx);
8483 if (hdev->tpc_binning) {
8484 binned_idx = __ffs(hdev->tpc_binning);
8485 if (binned_idx == module_idx)
8486 module_idx = TPC_ID_DCORE0_TPC6;
8487 }
8488
8489 hbw_rtr_id = gaudi2_tpc_initiator_hbw_rtr_id[module_idx];
8490 lbw_rtr_id = gaudi2_tpc_initiator_lbw_rtr_id[module_idx];
8491 break;
8492 case RAZWI_MME:
8493 sprintf(initiator_name, "MME_%u", module_idx);
8494 switch (module_sub_idx) {
8495 case MME_WAP0:
8496 hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].wap0;
8497 break;
8498 case MME_WAP1:
8499 hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].wap1;
8500 break;
8501 case MME_WRITE:
8502 hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].write;
8503 break;
8504 case MME_READ:
8505 hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].read;
8506 break;
8507 case MME_SBTE0:
8508 hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte0;
8509 break;
8510 case MME_SBTE1:
8511 hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte1;
8512 break;
8513 case MME_SBTE2:
8514 hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte2;
8515 break;
8516 case MME_SBTE3:
8517 hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte3;
8518 break;
8519 case MME_SBTE4:
8520 hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte4;
8521 break;
8522 default:
8523 return;
8524 }
8525 lbw_rtr_id = hbw_rtr_id;
8526 break;
8527 case RAZWI_EDMA:
8528 hbw_rtr_mstr_if_base_addr = gaudi2_edma_initiator_hbw_sft[module_idx];
8529 dcore_id = module_idx / NUM_OF_EDMA_PER_DCORE;
8530 /* SFT has separate MSTR_IF for LBW, only there we can
8531 * read the LBW razwi related registers
8532 */
8533 lbw_rtr_mstr_if_base_addr = mmSFT0_LBW_RTR_IF_MSTR_IF_RR_SHRD_HBW_BASE +
8534 dcore_id * SFT_DCORE_OFFSET;
8535 via_sft = true;
8536 sprintf(initiator_name, "EDMA_%u", module_idx);
8537 break;
8538 case RAZWI_PDMA:
8539 hbw_rtr_id = gaudi2_pdma_initiator_hbw_rtr_id[module_idx];
8540 lbw_rtr_id = gaudi2_pdma_initiator_lbw_rtr_id[module_idx];
8541 sprintf(initiator_name, "PDMA_%u", module_idx);
8542 break;
8543 case RAZWI_NIC:
8544 hbw_rtr_id = gaudi2_nic_initiator_hbw_rtr_id[module_idx];
8545 lbw_rtr_id = gaudi2_nic_initiator_lbw_rtr_id[module_idx];
8546 sprintf(initiator_name, "NIC_%u", module_idx);
8547 break;
8548 case RAZWI_DEC:
8549 sprintf(initiator_name, "DEC_%u", module_idx);
8550 if (hdev->decoder_binning) {
8551 binned_idx = __ffs(hdev->decoder_binning);
8552 if (binned_idx == module_idx)
8553 module_idx = DEC_ID_PCIE_VDEC1;
8554 }
8555 hbw_rtr_id = gaudi2_dec_initiator_hbw_rtr_id[module_idx];
8556 lbw_rtr_id = gaudi2_dec_initiator_lbw_rtr_id[module_idx];
8557 break;
8558 case RAZWI_ROT:
8559 hbw_rtr_id = gaudi2_rot_initiator_hbw_rtr_id[module_idx];
8560 lbw_rtr_id = gaudi2_rot_initiator_lbw_rtr_id[module_idx];
8561 sprintf(initiator_name, "ROT_%u", module_idx);
8562 break;
8563 case RAZWI_ARC_FARM:
8564 lbw_rtr_id = DCORE1_RTR5;
8565 hbw_rtr_id = DCORE1_RTR7;
8566 sprintf(initiator_name, "ARC_FARM_%u", module_idx);
8567 break;
8568 default:
8569 return;
8570 }
8571
8572 /* Find router mstr_if register base */
8573 if (!via_sft) {
8574 dcore_id = hbw_rtr_id / NUM_OF_RTR_PER_DCORE;
8575 dcore_rtr_id = hbw_rtr_id % NUM_OF_RTR_PER_DCORE;
8576 hbw_rtr_mstr_if_base_addr = mmDCORE0_RTR0_CTRL_BASE +
8577 dcore_id * DCORE_OFFSET +
8578 dcore_rtr_id * DCORE_RTR_OFFSET +
8579 RTR_MSTR_IF_OFFSET;
8580 lbw_rtr_mstr_if_base_addr = hbw_rtr_mstr_if_base_addr +
8581 (((s32)lbw_rtr_id - hbw_rtr_id) * DCORE_RTR_OFFSET);
8582 }
8583
8584 /* Find out event cause by reading "RAZWI_HAPPENED" registers */
8585 hbw_shrd_aw = RREG32(hbw_rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_HAPPENED);
8586 hbw_shrd_ar = RREG32(hbw_rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_HAPPENED);
8587 lbw_shrd_aw = RREG32(lbw_rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI_HAPPENED);
8588 lbw_shrd_ar = RREG32(lbw_rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI_HAPPENED);
8589
8590 eng_id = gaudi2_razwi_calc_engine_id(hdev, module, module_idx);
8591 if (hbw_shrd_aw) {
8592 gaudi2_razwi_rr_hbw_shared_printf_info(hdev, hbw_rtr_mstr_if_base_addr, true,
8593 initiator_name, eng_id, event_mask);
8594
8595 /* Clear event indication */
8596 WREG32(hbw_rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_HAPPENED, hbw_shrd_aw);
8597 }
8598
8599 if (hbw_shrd_ar) {
8600 gaudi2_razwi_rr_hbw_shared_printf_info(hdev, hbw_rtr_mstr_if_base_addr, false,
8601 initiator_name, eng_id, event_mask);
8602
8603 /* Clear event indication */
8604 WREG32(hbw_rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_HAPPENED, hbw_shrd_ar);
8605 }
8606
8607 if (lbw_shrd_aw) {
8608 gaudi2_razwi_rr_lbw_shared_printf_info(hdev, lbw_rtr_mstr_if_base_addr, true,
8609 initiator_name, eng_id, event_mask);
8610
8611 /* Clear event indication */
8612 WREG32(lbw_rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI_HAPPENED, lbw_shrd_aw);
8613 }
8614
8615 if (lbw_shrd_ar) {
8616 gaudi2_razwi_rr_lbw_shared_printf_info(hdev, lbw_rtr_mstr_if_base_addr, false,
8617 initiator_name, eng_id, event_mask);
8618
8619 /* Clear event indication */
8620 WREG32(lbw_rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI_HAPPENED, lbw_shrd_ar);
8621 }
8622 }
8623
gaudi2_check_if_razwi_happened(struct hl_device * hdev)8624 static void gaudi2_check_if_razwi_happened(struct hl_device *hdev)
8625 {
8626 struct asic_fixed_properties *prop = &hdev->asic_prop;
8627 u8 mod_idx, sub_mod;
8628
8629 /* check all TPCs */
8630 for (mod_idx = 0 ; mod_idx < (NUM_OF_TPC_PER_DCORE * NUM_OF_DCORES + 1) ; mod_idx++) {
8631 if (prop->tpc_enabled_mask & BIT(mod_idx))
8632 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_TPC, mod_idx, 0, NULL);
8633 }
8634
8635 /* check all MMEs */
8636 for (mod_idx = 0 ; mod_idx < (NUM_OF_MME_PER_DCORE * NUM_OF_DCORES) ; mod_idx++)
8637 for (sub_mod = MME_WAP0 ; sub_mod < MME_INITIATORS_MAX ; sub_mod++)
8638 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mod_idx,
8639 sub_mod, NULL);
8640
8641 /* check all EDMAs */
8642 for (mod_idx = 0 ; mod_idx < (NUM_OF_EDMA_PER_DCORE * NUM_OF_DCORES) ; mod_idx++)
8643 if (prop->edma_enabled_mask & BIT(mod_idx))
8644 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_EDMA, mod_idx, 0, NULL);
8645
8646 /* check all PDMAs */
8647 for (mod_idx = 0 ; mod_idx < NUM_OF_PDMA ; mod_idx++)
8648 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_PDMA, mod_idx, 0, NULL);
8649
8650 /* check all NICs */
8651 for (mod_idx = 0 ; mod_idx < NIC_NUMBER_OF_PORTS ; mod_idx++)
8652 if (hdev->nic_ports_mask & BIT(mod_idx))
8653 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_NIC, mod_idx >> 1, 0,
8654 NULL);
8655
8656 /* check all DECs */
8657 for (mod_idx = 0 ; mod_idx < NUMBER_OF_DEC ; mod_idx++)
8658 if (prop->decoder_enabled_mask & BIT(mod_idx))
8659 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_DEC, mod_idx, 0, NULL);
8660
8661 /* check all ROTs */
8662 for (mod_idx = 0 ; mod_idx < NUM_OF_ROT ; mod_idx++)
8663 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_ROT, mod_idx, 0, NULL);
8664 }
8665
gaudi2_psoc_razwi_get_engines(struct gaudi2_razwi_info * razwi_info,u32 array_size,u32 axuser_xy,u32 * base,u16 * eng_id,char * eng_name)8666 static int gaudi2_psoc_razwi_get_engines(struct gaudi2_razwi_info *razwi_info, u32 array_size,
8667 u32 axuser_xy, u32 *base, u16 *eng_id,
8668 char *eng_name)
8669 {
8670
8671 int i, num_of_eng = 0;
8672 u16 str_size = 0;
8673
8674 for (i = 0 ; i < array_size ; i++) {
8675 if (axuser_xy != razwi_info[i].axuser_xy)
8676 continue;
8677
8678 eng_id[num_of_eng] = razwi_info[i].eng_id;
8679 base[num_of_eng] = razwi_info[i].rtr_ctrl;
8680 if (!num_of_eng)
8681 str_size += scnprintf(eng_name + str_size,
8682 PSOC_RAZWI_ENG_STR_SIZE - str_size, "%s",
8683 razwi_info[i].eng_name);
8684 else
8685 str_size += scnprintf(eng_name + str_size,
8686 PSOC_RAZWI_ENG_STR_SIZE - str_size, " or %s",
8687 razwi_info[i].eng_name);
8688 num_of_eng++;
8689 }
8690
8691 return num_of_eng;
8692 }
8693
gaudi2_handle_psoc_razwi_happened(struct hl_device * hdev,u32 razwi_reg,u64 * event_mask)8694 static bool gaudi2_handle_psoc_razwi_happened(struct hl_device *hdev, u32 razwi_reg,
8695 u64 *event_mask)
8696 {
8697 u32 axuser_xy = RAZWI_GET_AXUSER_XY(razwi_reg), addr_hi = 0, addr_lo = 0;
8698 u32 base[PSOC_RAZWI_MAX_ENG_PER_RTR];
8699 u16 num_of_eng, eng_id[PSOC_RAZWI_MAX_ENG_PER_RTR];
8700 char eng_name_str[PSOC_RAZWI_ENG_STR_SIZE];
8701 bool razwi_happened = false;
8702 u64 addr;
8703 int i;
8704
8705 num_of_eng = gaudi2_psoc_razwi_get_engines(common_razwi_info, ARRAY_SIZE(common_razwi_info),
8706 axuser_xy, base, eng_id, eng_name_str);
8707
8708 /* If no match for XY coordinates, try to find it in MME razwi table */
8709 if (!num_of_eng) {
8710 axuser_xy = RAZWI_GET_AXUSER_LOW_XY(razwi_reg);
8711 num_of_eng = gaudi2_psoc_razwi_get_engines(mme_razwi_info,
8712 ARRAY_SIZE(mme_razwi_info),
8713 axuser_xy, base, eng_id,
8714 eng_name_str);
8715 }
8716
8717 for (i = 0 ; i < num_of_eng ; i++) {
8718 if (RREG32(base[i] + DEC_RAZWI_HBW_AW_SET)) {
8719 addr_hi = RREG32(base[i] + DEC_RAZWI_HBW_AW_ADDR_HI);
8720 addr_lo = RREG32(base[i] + DEC_RAZWI_HBW_AW_ADDR_LO);
8721 addr = ((u64)addr_hi << 32) + addr_lo;
8722 if (addr) {
8723 dev_err(hdev->dev,
8724 "PSOC HBW AW RAZWI: %s, address (aligned to 128 byte): 0x%llX\n",
8725 eng_name_str, addr);
8726 hl_handle_razwi(hdev, addr, &eng_id[0],
8727 num_of_eng, HL_RAZWI_HBW | HL_RAZWI_WRITE, event_mask);
8728 razwi_happened = true;
8729 }
8730 }
8731
8732 if (RREG32(base[i] + DEC_RAZWI_HBW_AR_SET)) {
8733 addr_hi = RREG32(base[i] + DEC_RAZWI_HBW_AR_ADDR_HI);
8734 addr_lo = RREG32(base[i] + DEC_RAZWI_HBW_AR_ADDR_LO);
8735 addr = ((u64)addr_hi << 32) + addr_lo;
8736 if (addr) {
8737 dev_err(hdev->dev,
8738 "PSOC HBW AR RAZWI: %s, address (aligned to 128 byte): 0x%llX\n",
8739 eng_name_str, addr);
8740 hl_handle_razwi(hdev, addr, &eng_id[0],
8741 num_of_eng, HL_RAZWI_HBW | HL_RAZWI_READ, event_mask);
8742 razwi_happened = true;
8743 }
8744 }
8745
8746 if (RREG32(base[i] + DEC_RAZWI_LBW_AW_SET)) {
8747 addr_lo = RREG32(base[i] + DEC_RAZWI_LBW_AW_ADDR);
8748 if (addr_lo) {
8749 dev_err(hdev->dev,
8750 "PSOC LBW AW RAZWI: %s, address (aligned to 128 byte): 0x%X\n",
8751 eng_name_str, addr_lo);
8752 hl_handle_razwi(hdev, addr_lo, &eng_id[0],
8753 num_of_eng, HL_RAZWI_LBW | HL_RAZWI_WRITE, event_mask);
8754 razwi_happened = true;
8755 }
8756 }
8757
8758 if (RREG32(base[i] + DEC_RAZWI_LBW_AR_SET)) {
8759 addr_lo = RREG32(base[i] + DEC_RAZWI_LBW_AR_ADDR);
8760 if (addr_lo) {
8761 dev_err(hdev->dev,
8762 "PSOC LBW AR RAZWI: %s, address (aligned to 128 byte): 0x%X\n",
8763 eng_name_str, addr_lo);
8764 hl_handle_razwi(hdev, addr_lo, &eng_id[0],
8765 num_of_eng, HL_RAZWI_LBW | HL_RAZWI_READ, event_mask);
8766 razwi_happened = true;
8767 }
8768 }
8769 /* In common case the loop will break, when there is only one engine id, or
8770 * several engines with the same router. The exceptional case is with psoc razwi
8771 * from EDMA, where it's possible to get axuser id which fits 2 routers (2
8772 * interfaces of sft router). In this case, maybe the first router won't hold info
8773 * and we will need to iterate on the other router.
8774 */
8775 if (razwi_happened)
8776 break;
8777 }
8778
8779 return razwi_happened;
8780 }
8781
8782 /* PSOC RAZWI interrupt occurs only when trying to access a bad address */
gaudi2_ack_psoc_razwi_event_handler(struct hl_device * hdev,u64 * event_mask)8783 static int gaudi2_ack_psoc_razwi_event_handler(struct hl_device *hdev, u64 *event_mask)
8784 {
8785 u32 razwi_mask_info, razwi_intr = 0, error_count = 0;
8786
8787 if (hdev->pldm || !(hdev->fw_components & FW_TYPE_LINUX)) {
8788 razwi_intr = RREG32(mmPSOC_GLOBAL_CONF_RAZWI_INTERRUPT);
8789 if (!razwi_intr)
8790 return 0;
8791 }
8792
8793 razwi_mask_info = RREG32(mmPSOC_GLOBAL_CONF_RAZWI_MASK_INFO);
8794
8795 dev_err_ratelimited(hdev->dev,
8796 "PSOC RAZWI interrupt: Mask %d, AR %d, AW %d, AXUSER_L 0x%x AXUSER_H 0x%x\n",
8797 FIELD_GET(PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_MASK_MASK, razwi_mask_info),
8798 FIELD_GET(PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_WAS_AR_MASK, razwi_mask_info),
8799 FIELD_GET(PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_WAS_AW_MASK, razwi_mask_info),
8800 FIELD_GET(PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_AXUSER_L_MASK, razwi_mask_info),
8801 FIELD_GET(PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_AXUSER_H_MASK, razwi_mask_info));
8802
8803 if (gaudi2_handle_psoc_razwi_happened(hdev, razwi_mask_info, event_mask))
8804 error_count++;
8805 else
8806 dev_err_ratelimited(hdev->dev,
8807 "PSOC RAZWI interrupt: invalid razwi info (0x%x)\n",
8808 razwi_mask_info);
8809
8810 /* Clear Interrupts only on pldm or if f/w doesn't handle interrupts */
8811 if (hdev->pldm || !(hdev->fw_components & FW_TYPE_LINUX))
8812 WREG32(mmPSOC_GLOBAL_CONF_RAZWI_INTERRUPT, razwi_intr);
8813
8814 return error_count;
8815 }
8816
_gaudi2_handle_qm_sei_err(struct hl_device * hdev,u64 qman_base,u16 event_type)8817 static int _gaudi2_handle_qm_sei_err(struct hl_device *hdev, u64 qman_base, u16 event_type)
8818 {
8819 u32 i, sts_val, sts_clr_val = 0, error_count = 0;
8820
8821 sts_val = RREG32(qman_base + QM_SEI_STATUS_OFFSET);
8822
8823 for (i = 0 ; i < GAUDI2_NUM_OF_QM_SEI_ERR_CAUSE ; i++) {
8824 if (sts_val & BIT(i)) {
8825 gaudi2_print_event(hdev, event_type, true,
8826 "err cause: %s", gaudi2_qm_sei_error_cause[i]);
8827 sts_clr_val |= BIT(i);
8828 error_count++;
8829 }
8830 }
8831
8832 WREG32(qman_base + QM_SEI_STATUS_OFFSET, sts_clr_val);
8833
8834 return error_count;
8835 }
8836
gaudi2_handle_qm_sei_err(struct hl_device * hdev,u16 event_type,bool extended_err_check,u64 * event_mask)8837 static int gaudi2_handle_qm_sei_err(struct hl_device *hdev, u16 event_type,
8838 bool extended_err_check, u64 *event_mask)
8839 {
8840 enum razwi_event_sources module;
8841 u32 error_count = 0;
8842 u64 qman_base;
8843 u8 index;
8844
8845 switch (event_type) {
8846 case GAUDI2_EVENT_TPC0_AXI_ERR_RSP ... GAUDI2_EVENT_TPC23_AXI_ERR_RSP:
8847 index = event_type - GAUDI2_EVENT_TPC0_AXI_ERR_RSP;
8848 qman_base = mmDCORE0_TPC0_QM_BASE +
8849 (index / NUM_OF_TPC_PER_DCORE) * DCORE_OFFSET +
8850 (index % NUM_OF_TPC_PER_DCORE) * DCORE_TPC_OFFSET;
8851 module = RAZWI_TPC;
8852 break;
8853 case GAUDI2_EVENT_TPC24_AXI_ERR_RSP:
8854 qman_base = mmDCORE0_TPC6_QM_BASE;
8855 module = RAZWI_TPC;
8856 break;
8857 case GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE:
8858 case GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE:
8859 case GAUDI2_EVENT_MME2_CTRL_AXI_ERROR_RESPONSE:
8860 case GAUDI2_EVENT_MME3_CTRL_AXI_ERROR_RESPONSE:
8861 index = (event_type - GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE) /
8862 (GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE -
8863 GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE);
8864 qman_base = mmDCORE0_MME_QM_BASE + index * DCORE_OFFSET;
8865 module = RAZWI_MME;
8866 break;
8867 case GAUDI2_EVENT_PDMA_CH0_AXI_ERR_RSP:
8868 case GAUDI2_EVENT_PDMA_CH1_AXI_ERR_RSP:
8869 index = event_type - GAUDI2_EVENT_PDMA_CH0_AXI_ERR_RSP;
8870 qman_base = mmPDMA0_QM_BASE + index * PDMA_OFFSET;
8871 module = RAZWI_PDMA;
8872 break;
8873 case GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE:
8874 case GAUDI2_EVENT_ROTATOR1_AXI_ERROR_RESPONSE:
8875 index = event_type - GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE;
8876 qman_base = mmROT0_QM_BASE + index * ROT_OFFSET;
8877 module = RAZWI_ROT;
8878 break;
8879 default:
8880 return 0;
8881 }
8882
8883 error_count = _gaudi2_handle_qm_sei_err(hdev, qman_base, event_type);
8884
8885 /* There is a single event per NIC macro, so should check its both QMAN blocks */
8886 if (event_type >= GAUDI2_EVENT_NIC0_AXI_ERROR_RESPONSE &&
8887 event_type <= GAUDI2_EVENT_NIC11_AXI_ERROR_RESPONSE)
8888 error_count += _gaudi2_handle_qm_sei_err(hdev,
8889 qman_base + NIC_QM_OFFSET, event_type);
8890
8891 if (extended_err_check) {
8892 /* check if RAZWI happened */
8893 gaudi2_ack_module_razwi_event_handler(hdev, module, 0, 0, event_mask);
8894 hl_check_for_glbl_errors(hdev);
8895 }
8896
8897 return error_count;
8898 }
8899
gaudi2_handle_qman_err(struct hl_device * hdev,u16 event_type,u64 * event_mask)8900 static int gaudi2_handle_qman_err(struct hl_device *hdev, u16 event_type, u64 *event_mask)
8901 {
8902 u32 qid_base, error_count = 0;
8903 u64 qman_base;
8904 u8 index = 0;
8905
8906 switch (event_type) {
8907 case GAUDI2_EVENT_TPC0_QM ... GAUDI2_EVENT_TPC5_QM:
8908 index = event_type - GAUDI2_EVENT_TPC0_QM;
8909 qid_base = GAUDI2_QUEUE_ID_DCORE0_TPC_0_0 + index * QMAN_STREAMS;
8910 qman_base = mmDCORE0_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;
8911 break;
8912 case GAUDI2_EVENT_TPC6_QM ... GAUDI2_EVENT_TPC11_QM:
8913 index = event_type - GAUDI2_EVENT_TPC6_QM;
8914 qid_base = GAUDI2_QUEUE_ID_DCORE1_TPC_0_0 + index * QMAN_STREAMS;
8915 qman_base = mmDCORE1_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;
8916 break;
8917 case GAUDI2_EVENT_TPC12_QM ... GAUDI2_EVENT_TPC17_QM:
8918 index = event_type - GAUDI2_EVENT_TPC12_QM;
8919 qid_base = GAUDI2_QUEUE_ID_DCORE2_TPC_0_0 + index * QMAN_STREAMS;
8920 qman_base = mmDCORE2_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;
8921 break;
8922 case GAUDI2_EVENT_TPC18_QM ... GAUDI2_EVENT_TPC23_QM:
8923 index = event_type - GAUDI2_EVENT_TPC18_QM;
8924 qid_base = GAUDI2_QUEUE_ID_DCORE3_TPC_0_0 + index * QMAN_STREAMS;
8925 qman_base = mmDCORE3_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;
8926 break;
8927 case GAUDI2_EVENT_TPC24_QM:
8928 qid_base = GAUDI2_QUEUE_ID_DCORE0_TPC_6_0;
8929 qman_base = mmDCORE0_TPC6_QM_BASE;
8930 break;
8931 case GAUDI2_EVENT_MME0_QM:
8932 qid_base = GAUDI2_QUEUE_ID_DCORE0_MME_0_0;
8933 qman_base = mmDCORE0_MME_QM_BASE;
8934 break;
8935 case GAUDI2_EVENT_MME1_QM:
8936 qid_base = GAUDI2_QUEUE_ID_DCORE1_MME_0_0;
8937 qman_base = mmDCORE1_MME_QM_BASE;
8938 break;
8939 case GAUDI2_EVENT_MME2_QM:
8940 qid_base = GAUDI2_QUEUE_ID_DCORE2_MME_0_0;
8941 qman_base = mmDCORE2_MME_QM_BASE;
8942 break;
8943 case GAUDI2_EVENT_MME3_QM:
8944 qid_base = GAUDI2_QUEUE_ID_DCORE3_MME_0_0;
8945 qman_base = mmDCORE3_MME_QM_BASE;
8946 break;
8947 case GAUDI2_EVENT_HDMA0_QM:
8948 index = 0;
8949 qid_base = GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0;
8950 qman_base = mmDCORE0_EDMA0_QM_BASE;
8951 break;
8952 case GAUDI2_EVENT_HDMA1_QM:
8953 index = 1;
8954 qid_base = GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0;
8955 qman_base = mmDCORE0_EDMA1_QM_BASE;
8956 break;
8957 case GAUDI2_EVENT_HDMA2_QM:
8958 index = 2;
8959 qid_base = GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0;
8960 qman_base = mmDCORE1_EDMA0_QM_BASE;
8961 break;
8962 case GAUDI2_EVENT_HDMA3_QM:
8963 index = 3;
8964 qid_base = GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0;
8965 qman_base = mmDCORE1_EDMA1_QM_BASE;
8966 break;
8967 case GAUDI2_EVENT_HDMA4_QM:
8968 index = 4;
8969 qid_base = GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0;
8970 qman_base = mmDCORE2_EDMA0_QM_BASE;
8971 break;
8972 case GAUDI2_EVENT_HDMA5_QM:
8973 index = 5;
8974 qid_base = GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0;
8975 qman_base = mmDCORE2_EDMA1_QM_BASE;
8976 break;
8977 case GAUDI2_EVENT_HDMA6_QM:
8978 index = 6;
8979 qid_base = GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0;
8980 qman_base = mmDCORE3_EDMA0_QM_BASE;
8981 break;
8982 case GAUDI2_EVENT_HDMA7_QM:
8983 index = 7;
8984 qid_base = GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0;
8985 qman_base = mmDCORE3_EDMA1_QM_BASE;
8986 break;
8987 case GAUDI2_EVENT_PDMA0_QM:
8988 qid_base = GAUDI2_QUEUE_ID_PDMA_0_0;
8989 qman_base = mmPDMA0_QM_BASE;
8990 break;
8991 case GAUDI2_EVENT_PDMA1_QM:
8992 qid_base = GAUDI2_QUEUE_ID_PDMA_1_0;
8993 qman_base = mmPDMA1_QM_BASE;
8994 break;
8995 case GAUDI2_EVENT_ROTATOR0_ROT0_QM:
8996 qid_base = GAUDI2_QUEUE_ID_ROT_0_0;
8997 qman_base = mmROT0_QM_BASE;
8998 break;
8999 case GAUDI2_EVENT_ROTATOR1_ROT1_QM:
9000 qid_base = GAUDI2_QUEUE_ID_ROT_1_0;
9001 qman_base = mmROT1_QM_BASE;
9002 break;
9003 default:
9004 return 0;
9005 }
9006
9007 error_count = gaudi2_handle_qman_err_generic(hdev, event_type, qman_base,
9008 qid_base, event_mask);
9009
9010 /* Handle EDMA QM SEI here because there is no AXI error response event for EDMA */
9011 if (event_type >= GAUDI2_EVENT_HDMA2_QM && event_type <= GAUDI2_EVENT_HDMA5_QM) {
9012 error_count += _gaudi2_handle_qm_sei_err(hdev, qman_base, event_type);
9013 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_EDMA, index, 0, event_mask);
9014 }
9015
9016 hl_check_for_glbl_errors(hdev);
9017
9018 return error_count;
9019 }
9020
gaudi2_handle_arc_farm_sei_err(struct hl_device * hdev,u16 event_type,u64 * event_mask)9021 static int gaudi2_handle_arc_farm_sei_err(struct hl_device *hdev, u16 event_type, u64 *event_mask)
9022 {
9023 u32 i, sts_val, sts_clr_val, error_count = 0, arc_farm;
9024
9025 for (arc_farm = 0 ; arc_farm < NUM_OF_ARC_FARMS_ARC ; arc_farm++) {
9026 sts_clr_val = 0;
9027 sts_val = RREG32(mmARC_FARM_ARC0_AUX_ARC_SEI_INTR_STS +
9028 (arc_farm * ARC_FARM_OFFSET));
9029
9030 for (i = 0 ; i < GAUDI2_NUM_OF_ARC_SEI_ERR_CAUSE ; i++) {
9031 if (sts_val & BIT(i)) {
9032 gaudi2_print_event(hdev, event_type, true,
9033 "ARC FARM ARC %u err cause: %s",
9034 arc_farm, gaudi2_arc_sei_error_cause[i]);
9035 sts_clr_val |= BIT(i);
9036 error_count++;
9037 }
9038 }
9039 WREG32(mmARC_FARM_ARC0_AUX_ARC_SEI_INTR_CLR + (arc_farm * ARC_FARM_OFFSET),
9040 sts_clr_val);
9041 }
9042
9043 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_ARC_FARM, 0, 0, event_mask);
9044 hl_check_for_glbl_errors(hdev);
9045
9046 return error_count;
9047 }
9048
gaudi2_handle_cpu_sei_err(struct hl_device * hdev,u16 event_type)9049 static int gaudi2_handle_cpu_sei_err(struct hl_device *hdev, u16 event_type)
9050 {
9051 u32 i, sts_val, sts_clr_val = 0, error_count = 0;
9052
9053 sts_val = RREG32(mmCPU_IF_CPU_SEI_INTR_STS);
9054
9055 for (i = 0 ; i < GAUDI2_NUM_OF_CPU_SEI_ERR_CAUSE ; i++) {
9056 if (sts_val & BIT(i)) {
9057 gaudi2_print_event(hdev, event_type, true,
9058 "err cause: %s", gaudi2_cpu_sei_error_cause[i]);
9059 sts_clr_val |= BIT(i);
9060 error_count++;
9061 }
9062 }
9063
9064 hl_check_for_glbl_errors(hdev);
9065
9066 WREG32(mmCPU_IF_CPU_SEI_INTR_CLR, sts_clr_val);
9067
9068 return error_count;
9069 }
9070
gaudi2_handle_rot_err(struct hl_device * hdev,u8 rot_index,u16 event_type,struct hl_eq_razwi_with_intr_cause * razwi_with_intr_cause,u64 * event_mask)9071 static int gaudi2_handle_rot_err(struct hl_device *hdev, u8 rot_index, u16 event_type,
9072 struct hl_eq_razwi_with_intr_cause *razwi_with_intr_cause,
9073 u64 *event_mask)
9074 {
9075 u64 intr_cause_data = le64_to_cpu(razwi_with_intr_cause->intr_cause.intr_cause_data);
9076 u32 error_count = 0;
9077 int i;
9078
9079 for (i = 0 ; i < GAUDI2_NUM_OF_ROT_ERR_CAUSE ; i++)
9080 if (intr_cause_data & BIT(i)) {
9081 gaudi2_print_event(hdev, event_type, true,
9082 "err cause: %s", guadi2_rot_error_cause[i]);
9083 error_count++;
9084 }
9085
9086 /* check if RAZWI happened */
9087 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_ROT, rot_index, 0, event_mask);
9088 hl_check_for_glbl_errors(hdev);
9089
9090 return error_count;
9091 }
9092
gaudi2_tpc_ack_interrupts(struct hl_device * hdev,u8 tpc_index,u16 event_type,struct hl_eq_razwi_with_intr_cause * razwi_with_intr_cause,u64 * event_mask)9093 static int gaudi2_tpc_ack_interrupts(struct hl_device *hdev, u8 tpc_index, u16 event_type,
9094 struct hl_eq_razwi_with_intr_cause *razwi_with_intr_cause,
9095 u64 *event_mask)
9096 {
9097 u64 intr_cause_data = le64_to_cpu(razwi_with_intr_cause->intr_cause.intr_cause_data);
9098 u32 error_count = 0;
9099 int i;
9100
9101 for (i = 0 ; i < GAUDI2_NUM_OF_TPC_INTR_CAUSE ; i++)
9102 if (intr_cause_data & BIT(i)) {
9103 gaudi2_print_event(hdev, event_type, true,
9104 "interrupt cause: %s", gaudi2_tpc_interrupts_cause[i]);
9105 error_count++;
9106 }
9107
9108 /* check if RAZWI happened */
9109 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_TPC, tpc_index, 0, event_mask);
9110 hl_check_for_glbl_errors(hdev);
9111
9112 return error_count;
9113 }
9114
gaudi2_handle_dec_err(struct hl_device * hdev,u8 dec_index,u16 event_type,u64 * event_mask)9115 static int gaudi2_handle_dec_err(struct hl_device *hdev, u8 dec_index, u16 event_type,
9116 u64 *event_mask)
9117 {
9118 u32 sts_addr, sts_val, sts_clr_val = 0, error_count = 0;
9119 int i;
9120
9121 if (dec_index < NUM_OF_VDEC_PER_DCORE * NUM_OF_DCORES)
9122 /* DCORE DEC */
9123 sts_addr = mmDCORE0_VDEC0_BRDG_CTRL_CAUSE_INTR +
9124 DCORE_OFFSET * (dec_index / NUM_OF_DEC_PER_DCORE) +
9125 DCORE_VDEC_OFFSET * (dec_index % NUM_OF_DEC_PER_DCORE);
9126 else
9127 /* PCIE DEC */
9128 sts_addr = mmPCIE_VDEC0_BRDG_CTRL_CAUSE_INTR + PCIE_VDEC_OFFSET *
9129 (dec_index - NUM_OF_VDEC_PER_DCORE * NUM_OF_DCORES);
9130
9131 sts_val = RREG32(sts_addr);
9132
9133 for (i = 0 ; i < GAUDI2_NUM_OF_DEC_ERR_CAUSE ; i++) {
9134 if (sts_val & BIT(i)) {
9135 gaudi2_print_event(hdev, event_type, true,
9136 "err cause: %s", gaudi2_dec_error_cause[i]);
9137 sts_clr_val |= BIT(i);
9138 error_count++;
9139 }
9140 }
9141
9142 /* check if RAZWI happened */
9143 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_DEC, dec_index, 0, event_mask);
9144 hl_check_for_glbl_errors(hdev);
9145
9146 /* Write 1 clear errors */
9147 WREG32(sts_addr, sts_clr_val);
9148
9149 return error_count;
9150 }
9151
gaudi2_handle_mme_err(struct hl_device * hdev,u8 mme_index,u16 event_type,u64 * event_mask)9152 static int gaudi2_handle_mme_err(struct hl_device *hdev, u8 mme_index, u16 event_type,
9153 u64 *event_mask)
9154 {
9155 u32 sts_addr, sts_val, sts_clr_addr, sts_clr_val = 0, error_count = 0;
9156 int i;
9157
9158 sts_addr = mmDCORE0_MME_CTRL_LO_INTR_CAUSE + DCORE_OFFSET * mme_index;
9159 sts_clr_addr = mmDCORE0_MME_CTRL_LO_INTR_CLEAR + DCORE_OFFSET * mme_index;
9160
9161 sts_val = RREG32(sts_addr);
9162
9163 for (i = 0 ; i < GAUDI2_NUM_OF_MME_ERR_CAUSE ; i++) {
9164 if (sts_val & BIT(i)) {
9165 gaudi2_print_event(hdev, event_type, true,
9166 "err cause: %s", guadi2_mme_error_cause[i]);
9167 sts_clr_val |= BIT(i);
9168 error_count++;
9169 }
9170 }
9171
9172 /* check if RAZWI happened */
9173 for (i = MME_WRITE ; i < MME_INITIATORS_MAX ; i++)
9174 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mme_index, i, event_mask);
9175
9176 hl_check_for_glbl_errors(hdev);
9177
9178 WREG32(sts_clr_addr, sts_clr_val);
9179
9180 return error_count;
9181 }
9182
gaudi2_handle_mme_sbte_err(struct hl_device * hdev,u16 event_type)9183 static int gaudi2_handle_mme_sbte_err(struct hl_device *hdev, u16 event_type)
9184 {
9185 /*
9186 * We have a single error cause here but the report mechanism is
9187 * buggy. Hence there is no good reason to fetch the cause so we
9188 * just check for glbl_errors and exit.
9189 */
9190 hl_check_for_glbl_errors(hdev);
9191
9192 return GAUDI2_NA_EVENT_CAUSE;
9193 }
9194
gaudi2_handle_mme_wap_err(struct hl_device * hdev,u8 mme_index,u16 event_type,u64 * event_mask)9195 static int gaudi2_handle_mme_wap_err(struct hl_device *hdev, u8 mme_index, u16 event_type,
9196 u64 *event_mask)
9197 {
9198 u32 sts_addr, sts_val, sts_clr_addr, sts_clr_val = 0, error_count = 0;
9199 int i;
9200
9201 sts_addr = mmDCORE0_MME_ACC_INTR_CAUSE + DCORE_OFFSET * mme_index;
9202 sts_clr_addr = mmDCORE0_MME_ACC_INTR_CLEAR + DCORE_OFFSET * mme_index;
9203
9204 sts_val = RREG32(sts_addr);
9205
9206 for (i = 0 ; i < GAUDI2_NUM_OF_MME_WAP_ERR_CAUSE ; i++) {
9207 if (sts_val & BIT(i)) {
9208 gaudi2_print_event(hdev, event_type, true,
9209 "err cause: %s", guadi2_mme_wap_error_cause[i]);
9210 sts_clr_val |= BIT(i);
9211 error_count++;
9212 }
9213 }
9214
9215 /* check if RAZWI happened on WAP0/1 */
9216 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mme_index, MME_WAP0, event_mask);
9217 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mme_index, MME_WAP1, event_mask);
9218 hl_check_for_glbl_errors(hdev);
9219
9220 WREG32(sts_clr_addr, sts_clr_val);
9221
9222 return error_count;
9223 }
9224
gaudi2_handle_kdma_core_event(struct hl_device * hdev,u16 event_type,u64 intr_cause_data)9225 static int gaudi2_handle_kdma_core_event(struct hl_device *hdev, u16 event_type,
9226 u64 intr_cause_data)
9227 {
9228 u32 error_count = 0;
9229 int i;
9230
9231 /* If an AXI read or write error is received, an error is reported and
9232 * interrupt message is sent. Due to an HW errata, when reading the cause
9233 * register of the KDMA engine, the reported error is always HBW even if
9234 * the actual error caused by a LBW KDMA transaction.
9235 */
9236 for (i = 0 ; i < GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE ; i++)
9237 if (intr_cause_data & BIT(i)) {
9238 gaudi2_print_event(hdev, event_type, true,
9239 "err cause: %s", gaudi2_kdma_core_interrupts_cause[i]);
9240 error_count++;
9241 }
9242
9243 hl_check_for_glbl_errors(hdev);
9244
9245 return error_count;
9246 }
9247
gaudi2_handle_dma_core_event(struct hl_device * hdev,u16 event_type,u64 intr_cause)9248 static int gaudi2_handle_dma_core_event(struct hl_device *hdev, u16 event_type, u64 intr_cause)
9249 {
9250 u32 error_count = 0;
9251 int i;
9252
9253 for (i = 0 ; i < GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE ; i++)
9254 if (intr_cause & BIT(i)) {
9255 gaudi2_print_event(hdev, event_type, true,
9256 "err cause: %s", gaudi2_dma_core_interrupts_cause[i]);
9257 error_count++;
9258 }
9259
9260 hl_check_for_glbl_errors(hdev);
9261
9262 return error_count;
9263 }
9264
gaudi2_print_pcie_mstr_rr_mstr_if_razwi_info(struct hl_device * hdev,u64 * event_mask)9265 static void gaudi2_print_pcie_mstr_rr_mstr_if_razwi_info(struct hl_device *hdev, u64 *event_mask)
9266 {
9267 u32 mstr_if_base_addr = mmPCIE_MSTR_RR_MSTR_IF_RR_SHRD_HBW_BASE, razwi_happened_addr;
9268
9269 razwi_happened_addr = mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_HAPPENED;
9270 if (RREG32(razwi_happened_addr)) {
9271 gaudi2_razwi_rr_hbw_shared_printf_info(hdev, mstr_if_base_addr, true, "PCIE",
9272 GAUDI2_ENGINE_ID_PCIE, event_mask);
9273 WREG32(razwi_happened_addr, 0x1);
9274 }
9275
9276 razwi_happened_addr = mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_HAPPENED;
9277 if (RREG32(razwi_happened_addr)) {
9278 gaudi2_razwi_rr_hbw_shared_printf_info(hdev, mstr_if_base_addr, false, "PCIE",
9279 GAUDI2_ENGINE_ID_PCIE, event_mask);
9280 WREG32(razwi_happened_addr, 0x1);
9281 }
9282
9283 razwi_happened_addr = mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI_HAPPENED;
9284 if (RREG32(razwi_happened_addr)) {
9285 gaudi2_razwi_rr_lbw_shared_printf_info(hdev, mstr_if_base_addr, true, "PCIE",
9286 GAUDI2_ENGINE_ID_PCIE, event_mask);
9287 WREG32(razwi_happened_addr, 0x1);
9288 }
9289
9290 razwi_happened_addr = mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI_HAPPENED;
9291 if (RREG32(razwi_happened_addr)) {
9292 gaudi2_razwi_rr_lbw_shared_printf_info(hdev, mstr_if_base_addr, false, "PCIE",
9293 GAUDI2_ENGINE_ID_PCIE, event_mask);
9294 WREG32(razwi_happened_addr, 0x1);
9295 }
9296 }
9297
gaudi2_print_pcie_addr_dec_info(struct hl_device * hdev,u16 event_type,u64 intr_cause_data,u64 * event_mask)9298 static int gaudi2_print_pcie_addr_dec_info(struct hl_device *hdev, u16 event_type,
9299 u64 intr_cause_data, u64 *event_mask)
9300 {
9301 u32 error_count = 0;
9302 int i;
9303
9304 for (i = 0 ; i < GAUDI2_NUM_OF_PCIE_ADDR_DEC_ERR_CAUSE ; i++) {
9305 if (!(intr_cause_data & BIT_ULL(i)))
9306 continue;
9307
9308 gaudi2_print_event(hdev, event_type, true,
9309 "err cause: %s", gaudi2_pcie_addr_dec_error_cause[i]);
9310 error_count++;
9311
9312 switch (intr_cause_data & BIT_ULL(i)) {
9313 case PCIE_WRAP_PCIE_IC_SEI_INTR_IND_AXI_LBW_ERR_INTR_MASK:
9314 hl_check_for_glbl_errors(hdev);
9315 break;
9316 case PCIE_WRAP_PCIE_IC_SEI_INTR_IND_BAD_ACCESS_INTR_MASK:
9317 gaudi2_print_pcie_mstr_rr_mstr_if_razwi_info(hdev, event_mask);
9318 break;
9319 }
9320 }
9321
9322 return error_count;
9323 }
9324
gaudi2_handle_pif_fatal(struct hl_device * hdev,u16 event_type,u64 intr_cause_data)9325 static int gaudi2_handle_pif_fatal(struct hl_device *hdev, u16 event_type,
9326 u64 intr_cause_data)
9327
9328 {
9329 u32 error_count = 0;
9330 int i;
9331
9332 for (i = 0 ; i < GAUDI2_NUM_OF_PMMU_FATAL_ERR_CAUSE ; i++) {
9333 if (intr_cause_data & BIT_ULL(i)) {
9334 gaudi2_print_event(hdev, event_type, true,
9335 "err cause: %s", gaudi2_pmmu_fatal_interrupts_cause[i]);
9336 error_count++;
9337 }
9338 }
9339
9340 return error_count;
9341 }
9342
gaudi2_handle_hif_fatal(struct hl_device * hdev,u16 event_type,u64 intr_cause_data)9343 static int gaudi2_handle_hif_fatal(struct hl_device *hdev, u16 event_type, u64 intr_cause_data)
9344 {
9345 u32 error_count = 0;
9346 int i;
9347
9348 for (i = 0 ; i < GAUDI2_NUM_OF_HIF_FATAL_ERR_CAUSE ; i++) {
9349 if (intr_cause_data & BIT_ULL(i)) {
9350 gaudi2_print_event(hdev, event_type, true,
9351 "err cause: %s", gaudi2_hif_fatal_interrupts_cause[i]);
9352 error_count++;
9353 }
9354 }
9355
9356 return error_count;
9357 }
9358
gaudi2_handle_page_error(struct hl_device * hdev,u64 mmu_base,bool is_pmmu,u64 * event_mask)9359 static void gaudi2_handle_page_error(struct hl_device *hdev, u64 mmu_base, bool is_pmmu,
9360 u64 *event_mask)
9361 {
9362 u32 valid, val;
9363 u64 addr;
9364
9365 valid = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID));
9366
9367 if (!(valid & DCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID_PAGE_ERR_VALID_ENTRY_MASK))
9368 return;
9369
9370 val = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_PAGE_ERROR_CAPTURE));
9371 addr = val & DCORE0_HMMU0_MMU_PAGE_ERROR_CAPTURE_VA_63_32_MASK;
9372 addr <<= 32;
9373 addr |= RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_PAGE_ERROR_CAPTURE_VA));
9374
9375 if (is_pmmu) {
9376 dev_err_ratelimited(hdev->dev, "PMMU page fault on va 0x%llx\n", addr);
9377 } else {
9378 addr = gaudi2_mmu_descramble_addr(hdev, addr);
9379 addr &= HW_UNSCRAMBLED_BITS_MASK;
9380 dev_err_ratelimited(hdev->dev, "HMMU page fault on va range 0x%llx - 0x%llx\n",
9381 addr, addr + ~HW_UNSCRAMBLED_BITS_MASK);
9382 }
9383
9384 hl_handle_page_fault(hdev, addr, 0, is_pmmu, event_mask);
9385
9386 WREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID), 0);
9387 }
9388
gaudi2_handle_access_error(struct hl_device * hdev,u64 mmu_base,bool is_pmmu)9389 static void gaudi2_handle_access_error(struct hl_device *hdev, u64 mmu_base, bool is_pmmu)
9390 {
9391 u32 valid, val;
9392 u64 addr;
9393
9394 valid = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID));
9395
9396 if (!(valid & DCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID_ACCESS_ERR_VALID_ENTRY_MASK))
9397 return;
9398
9399 val = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_ERROR_CAPTURE));
9400 addr = val & DCORE0_HMMU0_MMU_ACCESS_ERROR_CAPTURE_VA_63_32_MASK;
9401 addr <<= 32;
9402 addr |= RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_ERROR_CAPTURE_VA));
9403
9404 if (!is_pmmu)
9405 addr = gaudi2_mmu_descramble_addr(hdev, addr);
9406
9407 dev_err_ratelimited(hdev->dev, "%s access error on va 0x%llx\n",
9408 is_pmmu ? "PMMU" : "HMMU", addr);
9409 WREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID), 0);
9410 }
9411
gaudi2_handle_mmu_spi_sei_generic(struct hl_device * hdev,u16 event_type,u64 mmu_base,bool is_pmmu,u64 * event_mask)9412 static int gaudi2_handle_mmu_spi_sei_generic(struct hl_device *hdev, u16 event_type,
9413 u64 mmu_base, bool is_pmmu, u64 *event_mask)
9414 {
9415 u32 spi_sei_cause, interrupt_clr = 0x0, error_count = 0;
9416 int i;
9417
9418 spi_sei_cause = RREG32(mmu_base + MMU_SPI_SEI_CAUSE_OFFSET);
9419
9420 for (i = 0 ; i < GAUDI2_NUM_OF_MMU_SPI_SEI_CAUSE ; i++) {
9421 if (spi_sei_cause & BIT(i)) {
9422 gaudi2_print_event(hdev, event_type, true,
9423 "err cause: %s", gaudi2_mmu_spi_sei[i].cause);
9424
9425 if (i == 0)
9426 gaudi2_handle_page_error(hdev, mmu_base, is_pmmu, event_mask);
9427 else if (i == 1)
9428 gaudi2_handle_access_error(hdev, mmu_base, is_pmmu);
9429
9430 if (gaudi2_mmu_spi_sei[i].clear_bit >= 0)
9431 interrupt_clr |= BIT(gaudi2_mmu_spi_sei[i].clear_bit);
9432
9433 error_count++;
9434 }
9435 }
9436
9437 /* Clear cause */
9438 WREG32_AND(mmu_base + MMU_SPI_SEI_CAUSE_OFFSET, ~spi_sei_cause);
9439
9440 /* Clear interrupt */
9441 WREG32(mmu_base + MMU_INTERRUPT_CLR_OFFSET, interrupt_clr);
9442
9443 return error_count;
9444 }
9445
gaudi2_handle_sm_err(struct hl_device * hdev,u16 event_type,u8 sm_index)9446 static int gaudi2_handle_sm_err(struct hl_device *hdev, u16 event_type, u8 sm_index)
9447 {
9448 u32 sei_cause_addr, sei_cause_val, sei_cause_cause, sei_cause_log,
9449 cq_intr_addr, cq_intr_val, cq_intr_queue_index, error_count = 0;
9450 int i;
9451
9452 sei_cause_addr = mmDCORE0_SYNC_MNGR_GLBL_SM_SEI_CAUSE + DCORE_OFFSET * sm_index;
9453 cq_intr_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_INTR + DCORE_OFFSET * sm_index;
9454
9455 sei_cause_val = RREG32(sei_cause_addr);
9456 sei_cause_cause = FIELD_GET(DCORE0_SYNC_MNGR_GLBL_SM_SEI_CAUSE_CAUSE_MASK, sei_cause_val);
9457 cq_intr_val = RREG32(cq_intr_addr);
9458
9459 /* SEI interrupt */
9460 if (sei_cause_cause) {
9461 /* There are corresponding SEI_CAUSE_log bits for every SEI_CAUSE_cause bit */
9462 sei_cause_log = FIELD_GET(DCORE0_SYNC_MNGR_GLBL_SM_SEI_CAUSE_LOG_MASK,
9463 sei_cause_val);
9464
9465 for (i = 0 ; i < GAUDI2_NUM_OF_SM_SEI_ERR_CAUSE ; i++) {
9466 if (!(sei_cause_cause & BIT(i)))
9467 continue;
9468
9469 gaudi2_print_event(hdev, event_type, true,
9470 "err cause: %s. %s: 0x%X",
9471 gaudi2_sm_sei_cause[i].cause_name,
9472 gaudi2_sm_sei_cause[i].log_name,
9473 sei_cause_log);
9474 error_count++;
9475 break;
9476 }
9477
9478 /* Clear SM_SEI_CAUSE */
9479 WREG32(sei_cause_addr, 0);
9480 }
9481
9482 /* CQ interrupt */
9483 if (cq_intr_val & DCORE0_SYNC_MNGR_GLBL_CQ_INTR_CQ_SEC_INTR_MASK) {
9484 cq_intr_queue_index =
9485 FIELD_GET(DCORE0_SYNC_MNGR_GLBL_CQ_INTR_CQ_INTR_QUEUE_INDEX_MASK,
9486 cq_intr_val);
9487
9488 dev_err_ratelimited(hdev->dev, "SM%u err. err cause: CQ_INTR. queue index: %u\n",
9489 sm_index, cq_intr_queue_index);
9490 error_count++;
9491
9492 /* Clear CQ_INTR */
9493 WREG32(cq_intr_addr, 0);
9494 }
9495
9496 hl_check_for_glbl_errors(hdev);
9497
9498 return error_count;
9499 }
9500
get_hmmu_base(u16 event_type)9501 static u64 get_hmmu_base(u16 event_type)
9502 {
9503 u8 dcore, index_in_dcore;
9504
9505 switch (event_type) {
9506 case GAUDI2_EVENT_HMMU_0_AXI_ERR_RSP:
9507 case GAUDI2_EVENT_HMMU0_SPI_BASE ... GAUDI2_EVENT_HMMU0_SECURITY_ERROR:
9508 dcore = 0;
9509 index_in_dcore = 0;
9510 break;
9511 case GAUDI2_EVENT_HMMU_1_AXI_ERR_RSP:
9512 case GAUDI2_EVENT_HMMU1_SPI_BASE ... GAUDI2_EVENT_HMMU1_SECURITY_ERROR:
9513 dcore = 1;
9514 index_in_dcore = 0;
9515 break;
9516 case GAUDI2_EVENT_HMMU_2_AXI_ERR_RSP:
9517 case GAUDI2_EVENT_HMMU2_SPI_BASE ... GAUDI2_EVENT_HMMU2_SECURITY_ERROR:
9518 dcore = 0;
9519 index_in_dcore = 1;
9520 break;
9521 case GAUDI2_EVENT_HMMU_3_AXI_ERR_RSP:
9522 case GAUDI2_EVENT_HMMU3_SPI_BASE ... GAUDI2_EVENT_HMMU3_SECURITY_ERROR:
9523 dcore = 1;
9524 index_in_dcore = 1;
9525 break;
9526 case GAUDI2_EVENT_HMMU_4_AXI_ERR_RSP:
9527 case GAUDI2_EVENT_HMMU4_SPI_BASE ... GAUDI2_EVENT_HMMU4_SECURITY_ERROR:
9528 dcore = 3;
9529 index_in_dcore = 2;
9530 break;
9531 case GAUDI2_EVENT_HMMU_5_AXI_ERR_RSP:
9532 case GAUDI2_EVENT_HMMU5_SPI_BASE ... GAUDI2_EVENT_HMMU5_SECURITY_ERROR:
9533 dcore = 2;
9534 index_in_dcore = 2;
9535 break;
9536 case GAUDI2_EVENT_HMMU_6_AXI_ERR_RSP:
9537 case GAUDI2_EVENT_HMMU6_SPI_BASE ... GAUDI2_EVENT_HMMU6_SECURITY_ERROR:
9538 dcore = 3;
9539 index_in_dcore = 3;
9540 break;
9541 case GAUDI2_EVENT_HMMU_7_AXI_ERR_RSP:
9542 case GAUDI2_EVENT_HMMU7_SPI_BASE ... GAUDI2_EVENT_HMMU7_SECURITY_ERROR:
9543 dcore = 2;
9544 index_in_dcore = 3;
9545 break;
9546 case GAUDI2_EVENT_HMMU_8_AXI_ERR_RSP:
9547 case GAUDI2_EVENT_HMMU8_SPI_BASE ... GAUDI2_EVENT_HMMU8_SECURITY_ERROR:
9548 dcore = 0;
9549 index_in_dcore = 2;
9550 break;
9551 case GAUDI2_EVENT_HMMU_9_AXI_ERR_RSP:
9552 case GAUDI2_EVENT_HMMU9_SPI_BASE ... GAUDI2_EVENT_HMMU9_SECURITY_ERROR:
9553 dcore = 1;
9554 index_in_dcore = 2;
9555 break;
9556 case GAUDI2_EVENT_HMMU_10_AXI_ERR_RSP:
9557 case GAUDI2_EVENT_HMMU10_SPI_BASE ... GAUDI2_EVENT_HMMU10_SECURITY_ERROR:
9558 dcore = 0;
9559 index_in_dcore = 3;
9560 break;
9561 case GAUDI2_EVENT_HMMU_11_AXI_ERR_RSP:
9562 case GAUDI2_EVENT_HMMU11_SPI_BASE ... GAUDI2_EVENT_HMMU11_SECURITY_ERROR:
9563 dcore = 1;
9564 index_in_dcore = 3;
9565 break;
9566 case GAUDI2_EVENT_HMMU_12_AXI_ERR_RSP:
9567 case GAUDI2_EVENT_HMMU12_SPI_BASE ... GAUDI2_EVENT_HMMU12_SECURITY_ERROR:
9568 dcore = 3;
9569 index_in_dcore = 0;
9570 break;
9571 case GAUDI2_EVENT_HMMU_13_AXI_ERR_RSP:
9572 case GAUDI2_EVENT_HMMU13_SPI_BASE ... GAUDI2_EVENT_HMMU13_SECURITY_ERROR:
9573 dcore = 2;
9574 index_in_dcore = 0;
9575 break;
9576 case GAUDI2_EVENT_HMMU_14_AXI_ERR_RSP:
9577 case GAUDI2_EVENT_HMMU14_SPI_BASE ... GAUDI2_EVENT_HMMU14_SECURITY_ERROR:
9578 dcore = 3;
9579 index_in_dcore = 1;
9580 break;
9581 case GAUDI2_EVENT_HMMU_15_AXI_ERR_RSP:
9582 case GAUDI2_EVENT_HMMU15_SPI_BASE ... GAUDI2_EVENT_HMMU15_SECURITY_ERROR:
9583 dcore = 2;
9584 index_in_dcore = 1;
9585 break;
9586 default:
9587 return ULONG_MAX;
9588 }
9589
9590 return mmDCORE0_HMMU0_MMU_BASE + dcore * DCORE_OFFSET + index_in_dcore * DCORE_HMMU_OFFSET;
9591 }
9592
gaudi2_handle_mmu_spi_sei_err(struct hl_device * hdev,u16 event_type,u64 * event_mask)9593 static int gaudi2_handle_mmu_spi_sei_err(struct hl_device *hdev, u16 event_type, u64 *event_mask)
9594 {
9595 bool is_pmmu = false;
9596 u32 error_count = 0;
9597 u64 mmu_base;
9598
9599 switch (event_type) {
9600 case GAUDI2_EVENT_HMMU_0_AXI_ERR_RSP ... GAUDI2_EVENT_HMMU_12_AXI_ERR_RSP:
9601 case GAUDI2_EVENT_HMMU0_SPI_BASE ... GAUDI2_EVENT_HMMU12_SECURITY_ERROR:
9602 mmu_base = get_hmmu_base(event_type);
9603 break;
9604
9605 case GAUDI2_EVENT_PMMU0_PAGE_FAULT_WR_PERM ... GAUDI2_EVENT_PMMU0_SECURITY_ERROR:
9606 case GAUDI2_EVENT_PMMU_AXI_ERR_RSP_0:
9607 is_pmmu = true;
9608 mmu_base = mmPMMU_HBW_MMU_BASE;
9609 break;
9610 default:
9611 return 0;
9612 }
9613
9614 if (mmu_base == ULONG_MAX)
9615 return 0;
9616
9617 error_count = gaudi2_handle_mmu_spi_sei_generic(hdev, event_type, mmu_base,
9618 is_pmmu, event_mask);
9619 hl_check_for_glbl_errors(hdev);
9620
9621 return error_count;
9622 }
9623
9624
9625 /* returns true if hard reset is required (ECC DERR or Read parity), false otherwise (ECC SERR) */
gaudi2_hbm_sei_handle_read_err(struct hl_device * hdev,struct hl_eq_hbm_sei_read_err_intr_info * rd_err_data,u32 err_cnt)9626 static bool gaudi2_hbm_sei_handle_read_err(struct hl_device *hdev,
9627 struct hl_eq_hbm_sei_read_err_intr_info *rd_err_data, u32 err_cnt)
9628 {
9629 bool require_hard_reset = false;
9630 u32 addr, beat, beat_shift;
9631
9632 dev_err_ratelimited(hdev->dev,
9633 "READ ERROR count: ECC SERR: %d, ECC DERR: %d, RD_PARITY: %d\n",
9634 FIELD_GET(HBM_ECC_SERR_CNTR_MASK, err_cnt),
9635 FIELD_GET(HBM_ECC_DERR_CNTR_MASK, err_cnt),
9636 FIELD_GET(HBM_RD_PARITY_CNTR_MASK, err_cnt));
9637
9638 addr = le32_to_cpu(rd_err_data->dbg_rd_err_addr.rd_addr_val);
9639 dev_err_ratelimited(hdev->dev,
9640 "READ ERROR address: sid(%u), bg(%u), ba(%u), col(%u), row(%u)\n",
9641 FIELD_GET(HBM_RD_ADDR_SID_MASK, addr),
9642 FIELD_GET(HBM_RD_ADDR_BG_MASK, addr),
9643 FIELD_GET(HBM_RD_ADDR_BA_MASK, addr),
9644 FIELD_GET(HBM_RD_ADDR_COL_MASK, addr),
9645 FIELD_GET(HBM_RD_ADDR_ROW_MASK, addr));
9646
9647 /* For each beat (RDQS edge), look for possible errors and print relevant info */
9648 for (beat = 0 ; beat < 4 ; beat++) {
9649 if (le32_to_cpu(rd_err_data->dbg_rd_err_misc) &
9650 (HBM_RD_ERR_SERR_BEAT0_MASK << beat))
9651 dev_err_ratelimited(hdev->dev, "Beat%d ECC SERR: DM: %#x, Syndrome: %#x\n",
9652 beat,
9653 le32_to_cpu(rd_err_data->dbg_rd_err_dm),
9654 le32_to_cpu(rd_err_data->dbg_rd_err_syndrome));
9655
9656 if (le32_to_cpu(rd_err_data->dbg_rd_err_misc) &
9657 (HBM_RD_ERR_DERR_BEAT0_MASK << beat)) {
9658 dev_err_ratelimited(hdev->dev, "Beat%d ECC DERR: DM: %#x, Syndrome: %#x\n",
9659 beat,
9660 le32_to_cpu(rd_err_data->dbg_rd_err_dm),
9661 le32_to_cpu(rd_err_data->dbg_rd_err_syndrome));
9662 require_hard_reset = true;
9663 }
9664
9665 beat_shift = beat * HBM_RD_ERR_BEAT_SHIFT;
9666 if (le32_to_cpu(rd_err_data->dbg_rd_err_misc) &
9667 (HBM_RD_ERR_PAR_ERR_BEAT0_MASK << beat_shift)) {
9668 dev_err_ratelimited(hdev->dev,
9669 "Beat%d read PARITY: DM: %#x, PAR data: %#x\n",
9670 beat,
9671 le32_to_cpu(rd_err_data->dbg_rd_err_dm),
9672 (le32_to_cpu(rd_err_data->dbg_rd_err_misc) &
9673 (HBM_RD_ERR_PAR_DATA_BEAT0_MASK << beat_shift)) >>
9674 (HBM_RD_ERR_PAR_DATA_BEAT0_SHIFT + beat_shift));
9675 require_hard_reset = true;
9676 }
9677
9678 dev_err_ratelimited(hdev->dev, "Beat%d DQ data:\n", beat);
9679 dev_err_ratelimited(hdev->dev, "\t0x%08x\n",
9680 le32_to_cpu(rd_err_data->dbg_rd_err_data[beat * 2]));
9681 dev_err_ratelimited(hdev->dev, "\t0x%08x\n",
9682 le32_to_cpu(rd_err_data->dbg_rd_err_data[beat * 2 + 1]));
9683 }
9684
9685 return require_hard_reset;
9686 }
9687
gaudi2_hbm_sei_print_wr_par_info(struct hl_device * hdev,struct hl_eq_hbm_sei_wr_par_intr_info * wr_par_err_data,u32 err_cnt)9688 static void gaudi2_hbm_sei_print_wr_par_info(struct hl_device *hdev,
9689 struct hl_eq_hbm_sei_wr_par_intr_info *wr_par_err_data, u32 err_cnt)
9690 {
9691 struct hbm_sei_wr_cmd_address *wr_cmd_addr = wr_par_err_data->dbg_last_wr_cmds;
9692 u32 i, curr_addr, derr = wr_par_err_data->dbg_derr;
9693
9694 dev_err_ratelimited(hdev->dev, "WRITE PARITY ERROR count: %d\n", err_cnt);
9695
9696 dev_err_ratelimited(hdev->dev, "CK-0 DERR: 0x%02x, CK-1 DERR: 0x%02x\n",
9697 derr & 0x3, derr & 0xc);
9698
9699 /* JIRA H6-3286 - the following prints may not be valid */
9700 dev_err_ratelimited(hdev->dev, "Last latched write commands addresses:\n");
9701 for (i = 0 ; i < HBM_WR_PAR_CMD_LIFO_LEN ; i++) {
9702 curr_addr = le32_to_cpu(wr_cmd_addr[i].dbg_wr_cmd_addr);
9703 dev_err_ratelimited(hdev->dev,
9704 "\twrite cmd[%u]: Address: SID(%u) BG(%u) BA(%u) COL(%u).\n",
9705 i,
9706 FIELD_GET(WR_PAR_LAST_CMD_SID_MASK, curr_addr),
9707 FIELD_GET(WR_PAR_LAST_CMD_BG_MASK, curr_addr),
9708 FIELD_GET(WR_PAR_LAST_CMD_BA_MASK, curr_addr),
9709 FIELD_GET(WR_PAR_LAST_CMD_COL_MASK, curr_addr));
9710 }
9711 }
9712
gaudi2_hbm_sei_print_ca_par_info(struct hl_device * hdev,struct hl_eq_hbm_sei_ca_par_intr_info * ca_par_err_data,u32 err_cnt)9713 static void gaudi2_hbm_sei_print_ca_par_info(struct hl_device *hdev,
9714 struct hl_eq_hbm_sei_ca_par_intr_info *ca_par_err_data, u32 err_cnt)
9715 {
9716 __le32 *col_cmd = ca_par_err_data->dbg_col;
9717 __le16 *row_cmd = ca_par_err_data->dbg_row;
9718 u32 i;
9719
9720 dev_err_ratelimited(hdev->dev, "CA ERROR count: %d\n", err_cnt);
9721
9722 dev_err_ratelimited(hdev->dev, "Last latched C&R bus commands:\n");
9723 for (i = 0 ; i < HBM_CA_ERR_CMD_LIFO_LEN ; i++)
9724 dev_err_ratelimited(hdev->dev, "cmd%u: ROW(0x%04x) COL(0x%05x)\n", i,
9725 le16_to_cpu(row_cmd[i]) & (u16)GENMASK(13, 0),
9726 le32_to_cpu(col_cmd[i]) & (u32)GENMASK(17, 0));
9727 }
9728
9729 /* Returns true if hard reset is needed or false otherwise */
gaudi2_handle_hbm_mc_sei_err(struct hl_device * hdev,u16 event_type,struct hl_eq_hbm_sei_data * sei_data)9730 static bool gaudi2_handle_hbm_mc_sei_err(struct hl_device *hdev, u16 event_type,
9731 struct hl_eq_hbm_sei_data *sei_data)
9732 {
9733 bool require_hard_reset = false;
9734 u32 hbm_id, mc_id, cause_idx;
9735
9736 hbm_id = (event_type - GAUDI2_EVENT_HBM0_MC0_SEI_SEVERE) / 4;
9737 mc_id = ((event_type - GAUDI2_EVENT_HBM0_MC0_SEI_SEVERE) / 2) % 2;
9738
9739 cause_idx = sei_data->hdr.sei_cause;
9740 if (cause_idx > GAUDI2_NUM_OF_HBM_SEI_CAUSE - 1) {
9741 gaudi2_print_event(hdev, event_type, true,
9742 "err cause: %s",
9743 "Invalid HBM SEI event cause (%d) provided by FW", cause_idx);
9744 return true;
9745 }
9746
9747 gaudi2_print_event(hdev, event_type, !sei_data->hdr.is_critical,
9748 "System %s Error Interrupt - HBM(%u) MC(%u) MC_CH(%u) MC_PC(%u). Error cause: %s",
9749 sei_data->hdr.is_critical ? "Critical" : "Non-critical",
9750 hbm_id, mc_id, sei_data->hdr.mc_channel, sei_data->hdr.mc_pseudo_channel,
9751 hbm_mc_sei_cause[cause_idx]);
9752
9753 /* Print error-specific info */
9754 switch (cause_idx) {
9755 case HBM_SEI_CATTRIP:
9756 require_hard_reset = true;
9757 break;
9758
9759 case HBM_SEI_CMD_PARITY_EVEN:
9760 gaudi2_hbm_sei_print_ca_par_info(hdev, &sei_data->ca_parity_even_info,
9761 le32_to_cpu(sei_data->hdr.cnt));
9762 require_hard_reset = true;
9763 break;
9764
9765 case HBM_SEI_CMD_PARITY_ODD:
9766 gaudi2_hbm_sei_print_ca_par_info(hdev, &sei_data->ca_parity_odd_info,
9767 le32_to_cpu(sei_data->hdr.cnt));
9768 require_hard_reset = true;
9769 break;
9770
9771 case HBM_SEI_WRITE_DATA_PARITY_ERR:
9772 gaudi2_hbm_sei_print_wr_par_info(hdev, &sei_data->wr_parity_info,
9773 le32_to_cpu(sei_data->hdr.cnt));
9774 require_hard_reset = true;
9775 break;
9776
9777 case HBM_SEI_READ_ERR:
9778 /* Unlike other SEI events, read error requires further processing of the
9779 * raw data in order to determine the root cause.
9780 */
9781 require_hard_reset = gaudi2_hbm_sei_handle_read_err(hdev,
9782 &sei_data->read_err_info,
9783 le32_to_cpu(sei_data->hdr.cnt));
9784 break;
9785
9786 default:
9787 break;
9788 }
9789
9790 require_hard_reset |= !!sei_data->hdr.is_critical;
9791
9792 return require_hard_reset;
9793 }
9794
gaudi2_handle_hbm_cattrip(struct hl_device * hdev,u16 event_type,u64 intr_cause_data)9795 static int gaudi2_handle_hbm_cattrip(struct hl_device *hdev, u16 event_type,
9796 u64 intr_cause_data)
9797 {
9798 if (intr_cause_data) {
9799 gaudi2_print_event(hdev, event_type, true,
9800 "temperature error cause: %#llx", intr_cause_data);
9801 return 1;
9802 }
9803
9804 return 0;
9805 }
9806
gaudi2_handle_hbm_mc_spi(struct hl_device * hdev,u64 intr_cause_data)9807 static int gaudi2_handle_hbm_mc_spi(struct hl_device *hdev, u64 intr_cause_data)
9808 {
9809 u32 i, error_count = 0;
9810
9811 for (i = 0 ; i < GAUDI2_NUM_OF_HBM_MC_SPI_CAUSE ; i++)
9812 if (intr_cause_data & hbm_mc_spi[i].mask) {
9813 dev_dbg(hdev->dev, "HBM spi event: notification cause(%s)\n",
9814 hbm_mc_spi[i].cause);
9815 error_count++;
9816 }
9817
9818 return error_count;
9819 }
9820
gaudi2_print_clk_change_info(struct hl_device * hdev,u16 event_type,u64 * event_mask)9821 static void gaudi2_print_clk_change_info(struct hl_device *hdev, u16 event_type, u64 *event_mask)
9822 {
9823 ktime_t zero_time = ktime_set(0, 0);
9824
9825 mutex_lock(&hdev->clk_throttling.lock);
9826
9827 switch (event_type) {
9828 case GAUDI2_EVENT_CPU_FIX_POWER_ENV_S:
9829 hdev->clk_throttling.current_reason |= HL_CLK_THROTTLE_POWER;
9830 hdev->clk_throttling.aggregated_reason |= HL_CLK_THROTTLE_POWER;
9831 hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_POWER].start = ktime_get();
9832 hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_POWER].end = zero_time;
9833 dev_dbg_ratelimited(hdev->dev, "Clock throttling due to power consumption\n");
9834 break;
9835
9836 case GAUDI2_EVENT_CPU_FIX_POWER_ENV_E:
9837 hdev->clk_throttling.current_reason &= ~HL_CLK_THROTTLE_POWER;
9838 hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_POWER].end = ktime_get();
9839 dev_dbg_ratelimited(hdev->dev, "Power envelop is safe, back to optimal clock\n");
9840 break;
9841
9842 case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_S:
9843 hdev->clk_throttling.current_reason |= HL_CLK_THROTTLE_THERMAL;
9844 hdev->clk_throttling.aggregated_reason |= HL_CLK_THROTTLE_THERMAL;
9845 hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_THERMAL].start = ktime_get();
9846 hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_THERMAL].end = zero_time;
9847 *event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
9848 dev_info_ratelimited(hdev->dev, "Clock throttling due to overheating\n");
9849 break;
9850
9851 case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_E:
9852 hdev->clk_throttling.current_reason &= ~HL_CLK_THROTTLE_THERMAL;
9853 hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_THERMAL].end = ktime_get();
9854 *event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
9855 dev_info_ratelimited(hdev->dev, "Thermal envelop is safe, back to optimal clock\n");
9856 break;
9857
9858 default:
9859 dev_err(hdev->dev, "Received invalid clock change event %d\n", event_type);
9860 break;
9861 }
9862
9863 mutex_unlock(&hdev->clk_throttling.lock);
9864 }
9865
gaudi2_print_out_of_sync_info(struct hl_device * hdev,u16 event_type,struct cpucp_pkt_sync_err * sync_err)9866 static void gaudi2_print_out_of_sync_info(struct hl_device *hdev, u16 event_type,
9867 struct cpucp_pkt_sync_err *sync_err)
9868 {
9869 struct hl_hw_queue *q = &hdev->kernel_queues[GAUDI2_QUEUE_ID_CPU_PQ];
9870
9871 gaudi2_print_event(hdev, event_type, false,
9872 "FW: pi=%u, ci=%u, LKD: pi=%u, ci=%d",
9873 le32_to_cpu(sync_err->pi), le32_to_cpu(sync_err->ci),
9874 q->pi, atomic_read(&q->ci));
9875 }
9876
gaudi2_handle_pcie_p2p_msix(struct hl_device * hdev,u16 event_type)9877 static int gaudi2_handle_pcie_p2p_msix(struct hl_device *hdev, u16 event_type)
9878 {
9879 u32 p2p_intr, msix_gw_intr, error_count = 0;
9880
9881 p2p_intr = RREG32(mmPCIE_WRAP_P2P_INTR);
9882 msix_gw_intr = RREG32(mmPCIE_WRAP_MSIX_GW_INTR);
9883
9884 if (p2p_intr) {
9885 gaudi2_print_event(hdev, event_type, true,
9886 "pcie p2p transaction terminated due to security, req_id(0x%x)",
9887 RREG32(mmPCIE_WRAP_P2P_REQ_ID));
9888
9889 WREG32(mmPCIE_WRAP_P2P_INTR, 0x1);
9890 error_count++;
9891 }
9892
9893 if (msix_gw_intr) {
9894 gaudi2_print_event(hdev, event_type, true,
9895 "pcie msi-x gen denied due to vector num check failure, vec(0x%X)",
9896 RREG32(mmPCIE_WRAP_MSIX_GW_VEC));
9897
9898 WREG32(mmPCIE_WRAP_MSIX_GW_INTR, 0x1);
9899 error_count++;
9900 }
9901
9902 return error_count;
9903 }
9904
gaudi2_handle_pcie_drain(struct hl_device * hdev,struct hl_eq_pcie_drain_ind_data * drain_data)9905 static int gaudi2_handle_pcie_drain(struct hl_device *hdev,
9906 struct hl_eq_pcie_drain_ind_data *drain_data)
9907 {
9908 u64 cause, error_count = 0;
9909
9910 cause = le64_to_cpu(drain_data->intr_cause.intr_cause_data);
9911
9912 if (cause & BIT_ULL(0)) {
9913 dev_err_ratelimited(hdev->dev, "PCIE AXI drain LBW completed\n");
9914 error_count++;
9915 }
9916
9917 if (cause & BIT_ULL(1)) {
9918 dev_err_ratelimited(hdev->dev, "PCIE AXI drain HBW completed\n");
9919 error_count++;
9920 }
9921
9922 return error_count;
9923 }
9924
gaudi2_handle_psoc_drain(struct hl_device * hdev,u64 intr_cause_data)9925 static int gaudi2_handle_psoc_drain(struct hl_device *hdev, u64 intr_cause_data)
9926 {
9927 u32 error_count = 0;
9928 int i;
9929
9930 for (i = 0 ; i < GAUDI2_NUM_OF_AXI_DRAIN_ERR_CAUSE ; i++) {
9931 if (intr_cause_data & BIT_ULL(i)) {
9932 dev_err_ratelimited(hdev->dev, "PSOC %s completed\n",
9933 gaudi2_psoc_axi_drain_interrupts_cause[i]);
9934 error_count++;
9935 }
9936 }
9937
9938 hl_check_for_glbl_errors(hdev);
9939
9940 return error_count;
9941 }
9942
gaudi2_print_cpu_pkt_failure_info(struct hl_device * hdev,u16 event_type,struct cpucp_pkt_sync_err * sync_err)9943 static void gaudi2_print_cpu_pkt_failure_info(struct hl_device *hdev, u16 event_type,
9944 struct cpucp_pkt_sync_err *sync_err)
9945 {
9946 struct hl_hw_queue *q = &hdev->kernel_queues[GAUDI2_QUEUE_ID_CPU_PQ];
9947
9948 gaudi2_print_event(hdev, event_type, false,
9949 "FW reported sanity check failure, FW: pi=%u, ci=%u, LKD: pi=%u, ci=%d",
9950 le32_to_cpu(sync_err->pi), le32_to_cpu(sync_err->ci), q->pi, atomic_read(&q->ci));
9951 }
9952
hl_arc_event_handle(struct hl_device * hdev,u16 event_type,struct hl_eq_engine_arc_intr_data * data)9953 static int hl_arc_event_handle(struct hl_device *hdev, u16 event_type,
9954 struct hl_eq_engine_arc_intr_data *data)
9955 {
9956 struct hl_engine_arc_dccm_queue_full_irq *q;
9957 u32 intr_type, engine_id;
9958 u64 payload;
9959
9960 intr_type = le32_to_cpu(data->intr_type);
9961 engine_id = le32_to_cpu(data->engine_id);
9962 payload = le64_to_cpu(data->payload);
9963
9964 switch (intr_type) {
9965 case ENGINE_ARC_DCCM_QUEUE_FULL_IRQ:
9966 q = (struct hl_engine_arc_dccm_queue_full_irq *) &payload;
9967
9968 gaudi2_print_event(hdev, event_type, true,
9969 "ARC DCCM Full event: Eng: %s, Intr_type: %u, Qidx: %u",
9970 GAUDI2_ENG_ID_TO_STR(engine_id), intr_type, q->queue_index);
9971 return 1;
9972 default:
9973 gaudi2_print_event(hdev, event_type, true, "Unknown ARC event type");
9974 return 0;
9975 }
9976 }
9977
event_id_to_engine_id(struct hl_device * hdev,u16 event_type)9978 static u16 event_id_to_engine_id(struct hl_device *hdev, u16 event_type)
9979 {
9980 enum gaudi2_block_types type = GAUDI2_BLOCK_TYPE_MAX;
9981 u16 index;
9982
9983 switch (event_type) {
9984 case GAUDI2_EVENT_TPC0_AXI_ERR_RSP ... GAUDI2_EVENT_TPC24_AXI_ERR_RSP:
9985 index = event_type - GAUDI2_EVENT_TPC0_AXI_ERR_RSP;
9986 type = GAUDI2_BLOCK_TYPE_TPC;
9987 break;
9988 case GAUDI2_EVENT_TPC0_QM ... GAUDI2_EVENT_TPC24_QM:
9989 index = event_type - GAUDI2_EVENT_TPC0_QM;
9990 type = GAUDI2_BLOCK_TYPE_TPC;
9991 break;
9992 case GAUDI2_EVENT_MME0_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE:
9993 case GAUDI2_EVENT_MME0_SPI_BASE ... GAUDI2_EVENT_MME0_WAP_SOURCE_RESULT_INVALID:
9994 case GAUDI2_EVENT_MME0_QM:
9995 index = 0;
9996 type = GAUDI2_BLOCK_TYPE_MME;
9997 break;
9998 case GAUDI2_EVENT_MME1_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE:
9999 case GAUDI2_EVENT_MME1_SPI_BASE ... GAUDI2_EVENT_MME1_WAP_SOURCE_RESULT_INVALID:
10000 case GAUDI2_EVENT_MME1_QM:
10001 index = 1;
10002 type = GAUDI2_BLOCK_TYPE_MME;
10003 break;
10004 case GAUDI2_EVENT_MME2_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME2_CTRL_AXI_ERROR_RESPONSE:
10005 case GAUDI2_EVENT_MME2_SPI_BASE ... GAUDI2_EVENT_MME2_WAP_SOURCE_RESULT_INVALID:
10006 case GAUDI2_EVENT_MME2_QM:
10007 index = 2;
10008 type = GAUDI2_BLOCK_TYPE_MME;
10009 break;
10010 case GAUDI2_EVENT_MME3_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME3_CTRL_AXI_ERROR_RESPONSE:
10011 case GAUDI2_EVENT_MME3_SPI_BASE ... GAUDI2_EVENT_MME3_WAP_SOURCE_RESULT_INVALID:
10012 case GAUDI2_EVENT_MME3_QM:
10013 index = 3;
10014 type = GAUDI2_BLOCK_TYPE_MME;
10015 break;
10016 case GAUDI2_EVENT_KDMA_CH0_AXI_ERR_RSP:
10017 case GAUDI2_EVENT_KDMA_BM_SPMU:
10018 case GAUDI2_EVENT_KDMA0_CORE:
10019 return GAUDI2_ENGINE_ID_KDMA;
10020 case GAUDI2_EVENT_PDMA_CH0_AXI_ERR_RSP:
10021 case GAUDI2_EVENT_PDMA0_CORE:
10022 case GAUDI2_EVENT_PDMA0_BM_SPMU:
10023 case GAUDI2_EVENT_PDMA0_QM:
10024 return GAUDI2_ENGINE_ID_PDMA_0;
10025 case GAUDI2_EVENT_PDMA_CH1_AXI_ERR_RSP:
10026 case GAUDI2_EVENT_PDMA1_CORE:
10027 case GAUDI2_EVENT_PDMA1_BM_SPMU:
10028 case GAUDI2_EVENT_PDMA1_QM:
10029 return GAUDI2_ENGINE_ID_PDMA_1;
10030 case GAUDI2_EVENT_DEC0_AXI_ERR_RSPONSE ... GAUDI2_EVENT_DEC9_AXI_ERR_RSPONSE:
10031 index = event_type - GAUDI2_EVENT_DEC0_AXI_ERR_RSPONSE;
10032 type = GAUDI2_BLOCK_TYPE_DEC;
10033 break;
10034 case GAUDI2_EVENT_DEC0_SPI ... GAUDI2_EVENT_DEC9_BMON_SPMU:
10035 index = (event_type - GAUDI2_EVENT_DEC0_SPI) >> 1;
10036 type = GAUDI2_BLOCK_TYPE_DEC;
10037 break;
10038 case GAUDI2_EVENT_NIC0_AXI_ERROR_RESPONSE ... GAUDI2_EVENT_NIC11_AXI_ERROR_RESPONSE:
10039 index = event_type - GAUDI2_EVENT_NIC0_AXI_ERROR_RESPONSE;
10040 return GAUDI2_ENGINE_ID_NIC0_0 + (index * 2);
10041 case GAUDI2_EVENT_NIC0_QM0 ... GAUDI2_EVENT_NIC11_QM1:
10042 index = event_type - GAUDI2_EVENT_NIC0_QM0;
10043 return GAUDI2_ENGINE_ID_NIC0_0 + index;
10044 case GAUDI2_EVENT_NIC0_BMON_SPMU ... GAUDI2_EVENT_NIC11_SW_ERROR:
10045 index = event_type - GAUDI2_EVENT_NIC0_BMON_SPMU;
10046 return GAUDI2_ENGINE_ID_NIC0_0 + (index * 2);
10047 case GAUDI2_EVENT_TPC0_BMON_SPMU ... GAUDI2_EVENT_TPC24_KERNEL_ERR:
10048 index = (event_type - GAUDI2_EVENT_TPC0_BMON_SPMU) >> 1;
10049 type = GAUDI2_BLOCK_TYPE_TPC;
10050 break;
10051 case GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE:
10052 case GAUDI2_EVENT_ROTATOR0_BMON_SPMU:
10053 case GAUDI2_EVENT_ROTATOR0_ROT0_QM:
10054 return GAUDI2_ENGINE_ID_ROT_0;
10055 case GAUDI2_EVENT_ROTATOR1_AXI_ERROR_RESPONSE:
10056 case GAUDI2_EVENT_ROTATOR1_BMON_SPMU:
10057 case GAUDI2_EVENT_ROTATOR1_ROT1_QM:
10058 return GAUDI2_ENGINE_ID_ROT_1;
10059 case GAUDI2_EVENT_HDMA0_BM_SPMU:
10060 case GAUDI2_EVENT_HDMA0_QM:
10061 case GAUDI2_EVENT_HDMA0_CORE:
10062 return GAUDI2_DCORE0_ENGINE_ID_EDMA_0;
10063 case GAUDI2_EVENT_HDMA1_BM_SPMU:
10064 case GAUDI2_EVENT_HDMA1_QM:
10065 case GAUDI2_EVENT_HDMA1_CORE:
10066 return GAUDI2_DCORE0_ENGINE_ID_EDMA_1;
10067 case GAUDI2_EVENT_HDMA2_BM_SPMU:
10068 case GAUDI2_EVENT_HDMA2_QM:
10069 case GAUDI2_EVENT_HDMA2_CORE:
10070 return GAUDI2_DCORE1_ENGINE_ID_EDMA_0;
10071 case GAUDI2_EVENT_HDMA3_BM_SPMU:
10072 case GAUDI2_EVENT_HDMA3_QM:
10073 case GAUDI2_EVENT_HDMA3_CORE:
10074 return GAUDI2_DCORE1_ENGINE_ID_EDMA_1;
10075 case GAUDI2_EVENT_HDMA4_BM_SPMU:
10076 case GAUDI2_EVENT_HDMA4_QM:
10077 case GAUDI2_EVENT_HDMA4_CORE:
10078 return GAUDI2_DCORE2_ENGINE_ID_EDMA_0;
10079 case GAUDI2_EVENT_HDMA5_BM_SPMU:
10080 case GAUDI2_EVENT_HDMA5_QM:
10081 case GAUDI2_EVENT_HDMA5_CORE:
10082 return GAUDI2_DCORE2_ENGINE_ID_EDMA_1;
10083 case GAUDI2_EVENT_HDMA6_BM_SPMU:
10084 case GAUDI2_EVENT_HDMA6_QM:
10085 case GAUDI2_EVENT_HDMA6_CORE:
10086 return GAUDI2_DCORE3_ENGINE_ID_EDMA_0;
10087 case GAUDI2_EVENT_HDMA7_BM_SPMU:
10088 case GAUDI2_EVENT_HDMA7_QM:
10089 case GAUDI2_EVENT_HDMA7_CORE:
10090 return GAUDI2_DCORE3_ENGINE_ID_EDMA_1;
10091 default:
10092 break;
10093 }
10094
10095 switch (type) {
10096 case GAUDI2_BLOCK_TYPE_TPC:
10097 switch (index) {
10098 case TPC_ID_DCORE0_TPC0 ... TPC_ID_DCORE0_TPC5:
10099 return GAUDI2_DCORE0_ENGINE_ID_TPC_0 + index;
10100 case TPC_ID_DCORE1_TPC0 ... TPC_ID_DCORE1_TPC5:
10101 return GAUDI2_DCORE1_ENGINE_ID_TPC_0 + index - TPC_ID_DCORE1_TPC0;
10102 case TPC_ID_DCORE2_TPC0 ... TPC_ID_DCORE2_TPC5:
10103 return GAUDI2_DCORE2_ENGINE_ID_TPC_0 + index - TPC_ID_DCORE2_TPC0;
10104 case TPC_ID_DCORE3_TPC0 ... TPC_ID_DCORE3_TPC5:
10105 return GAUDI2_DCORE3_ENGINE_ID_TPC_0 + index - TPC_ID_DCORE3_TPC0;
10106 default:
10107 break;
10108 }
10109 break;
10110 case GAUDI2_BLOCK_TYPE_MME:
10111 switch (index) {
10112 case MME_ID_DCORE0: return GAUDI2_DCORE0_ENGINE_ID_MME;
10113 case MME_ID_DCORE1: return GAUDI2_DCORE1_ENGINE_ID_MME;
10114 case MME_ID_DCORE2: return GAUDI2_DCORE2_ENGINE_ID_MME;
10115 case MME_ID_DCORE3: return GAUDI2_DCORE3_ENGINE_ID_MME;
10116 default:
10117 break;
10118 }
10119 break;
10120 case GAUDI2_BLOCK_TYPE_DEC:
10121 switch (index) {
10122 case DEC_ID_DCORE0_DEC0: return GAUDI2_DCORE0_ENGINE_ID_DEC_0;
10123 case DEC_ID_DCORE0_DEC1: return GAUDI2_DCORE0_ENGINE_ID_DEC_1;
10124 case DEC_ID_DCORE1_DEC0: return GAUDI2_DCORE1_ENGINE_ID_DEC_0;
10125 case DEC_ID_DCORE1_DEC1: return GAUDI2_DCORE1_ENGINE_ID_DEC_1;
10126 case DEC_ID_DCORE2_DEC0: return GAUDI2_DCORE2_ENGINE_ID_DEC_0;
10127 case DEC_ID_DCORE2_DEC1: return GAUDI2_DCORE2_ENGINE_ID_DEC_1;
10128 case DEC_ID_DCORE3_DEC0: return GAUDI2_DCORE3_ENGINE_ID_DEC_0;
10129 case DEC_ID_DCORE3_DEC1: return GAUDI2_DCORE3_ENGINE_ID_DEC_1;
10130 case DEC_ID_PCIE_VDEC0: return GAUDI2_PCIE_ENGINE_ID_DEC_0;
10131 case DEC_ID_PCIE_VDEC1: return GAUDI2_PCIE_ENGINE_ID_DEC_1;
10132 default:
10133 break;
10134 }
10135 break;
10136 default:
10137 break;
10138 }
10139
10140 return U16_MAX;
10141 }
10142
gaudi2_handle_eqe(struct hl_device * hdev,struct hl_eq_entry * eq_entry)10143 static void gaudi2_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entry)
10144 {
10145 struct gaudi2_device *gaudi2 = hdev->asic_specific;
10146 bool reset_required = false, is_critical = false;
10147 u32 index, ctl, reset_flags = 0, error_count = 0;
10148 u64 event_mask = 0;
10149 u16 event_type;
10150
10151 ctl = le32_to_cpu(eq_entry->hdr.ctl);
10152 event_type = ((ctl & EQ_CTL_EVENT_TYPE_MASK) >> EQ_CTL_EVENT_TYPE_SHIFT);
10153
10154 if (event_type >= GAUDI2_EVENT_SIZE) {
10155 dev_err(hdev->dev, "Event type %u exceeds maximum of %u",
10156 event_type, GAUDI2_EVENT_SIZE - 1);
10157 return;
10158 }
10159
10160 gaudi2->events_stat[event_type]++;
10161 gaudi2->events_stat_aggregate[event_type]++;
10162
10163 switch (event_type) {
10164 case GAUDI2_EVENT_PCIE_CORE_SERR ... GAUDI2_EVENT_ARC0_ECC_DERR:
10165 fallthrough;
10166 case GAUDI2_EVENT_ROTATOR0_SERR ... GAUDI2_EVENT_ROTATOR1_DERR:
10167 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10168 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10169 reset_required = gaudi2_handle_ecc_event(hdev, event_type, &eq_entry->ecc_data);
10170 is_critical = eq_entry->ecc_data.is_critical;
10171 error_count++;
10172 break;
10173
10174 case GAUDI2_EVENT_TPC0_QM ... GAUDI2_EVENT_PDMA1_QM:
10175 fallthrough;
10176 case GAUDI2_EVENT_ROTATOR0_ROT0_QM ... GAUDI2_EVENT_ROTATOR1_ROT1_QM:
10177 fallthrough;
10178 case GAUDI2_EVENT_NIC0_QM0 ... GAUDI2_EVENT_NIC11_QM1:
10179 error_count = gaudi2_handle_qman_err(hdev, event_type, &event_mask);
10180 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10181 break;
10182
10183 case GAUDI2_EVENT_ARC_AXI_ERROR_RESPONSE_0:
10184 error_count = gaudi2_handle_arc_farm_sei_err(hdev, event_type, &event_mask);
10185 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10186 break;
10187
10188 case GAUDI2_EVENT_CPU_AXI_ERR_RSP:
10189 error_count = gaudi2_handle_cpu_sei_err(hdev, event_type);
10190 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10191 event_mask |= HL_NOTIFIER_EVENT_CRITICL_FW_ERR;
10192 break;
10193
10194 case GAUDI2_EVENT_PDMA_CH0_AXI_ERR_RSP:
10195 case GAUDI2_EVENT_PDMA_CH1_AXI_ERR_RSP:
10196 error_count = gaudi2_handle_qm_sei_err(hdev, event_type, true, &event_mask);
10197 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10198 break;
10199
10200 case GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE:
10201 case GAUDI2_EVENT_ROTATOR1_AXI_ERROR_RESPONSE:
10202 index = event_type - GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE;
10203 error_count = gaudi2_handle_rot_err(hdev, index, event_type,
10204 &eq_entry->razwi_with_intr_cause, &event_mask);
10205 error_count += gaudi2_handle_qm_sei_err(hdev, event_type, false, &event_mask);
10206 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10207 break;
10208
10209 case GAUDI2_EVENT_TPC0_AXI_ERR_RSP ... GAUDI2_EVENT_TPC24_AXI_ERR_RSP:
10210 index = event_type - GAUDI2_EVENT_TPC0_AXI_ERR_RSP;
10211 error_count = gaudi2_tpc_ack_interrupts(hdev, index, event_type,
10212 &eq_entry->razwi_with_intr_cause, &event_mask);
10213 error_count += gaudi2_handle_qm_sei_err(hdev, event_type, false, &event_mask);
10214 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10215 break;
10216
10217 case GAUDI2_EVENT_DEC0_AXI_ERR_RSPONSE ... GAUDI2_EVENT_DEC9_AXI_ERR_RSPONSE:
10218 index = event_type - GAUDI2_EVENT_DEC0_AXI_ERR_RSPONSE;
10219 error_count = gaudi2_handle_dec_err(hdev, index, event_type, &event_mask);
10220 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10221 break;
10222
10223 case GAUDI2_EVENT_TPC0_KERNEL_ERR:
10224 case GAUDI2_EVENT_TPC1_KERNEL_ERR:
10225 case GAUDI2_EVENT_TPC2_KERNEL_ERR:
10226 case GAUDI2_EVENT_TPC3_KERNEL_ERR:
10227 case GAUDI2_EVENT_TPC4_KERNEL_ERR:
10228 case GAUDI2_EVENT_TPC5_KERNEL_ERR:
10229 case GAUDI2_EVENT_TPC6_KERNEL_ERR:
10230 case GAUDI2_EVENT_TPC7_KERNEL_ERR:
10231 case GAUDI2_EVENT_TPC8_KERNEL_ERR:
10232 case GAUDI2_EVENT_TPC9_KERNEL_ERR:
10233 case GAUDI2_EVENT_TPC10_KERNEL_ERR:
10234 case GAUDI2_EVENT_TPC11_KERNEL_ERR:
10235 case GAUDI2_EVENT_TPC12_KERNEL_ERR:
10236 case GAUDI2_EVENT_TPC13_KERNEL_ERR:
10237 case GAUDI2_EVENT_TPC14_KERNEL_ERR:
10238 case GAUDI2_EVENT_TPC15_KERNEL_ERR:
10239 case GAUDI2_EVENT_TPC16_KERNEL_ERR:
10240 case GAUDI2_EVENT_TPC17_KERNEL_ERR:
10241 case GAUDI2_EVENT_TPC18_KERNEL_ERR:
10242 case GAUDI2_EVENT_TPC19_KERNEL_ERR:
10243 case GAUDI2_EVENT_TPC20_KERNEL_ERR:
10244 case GAUDI2_EVENT_TPC21_KERNEL_ERR:
10245 case GAUDI2_EVENT_TPC22_KERNEL_ERR:
10246 case GAUDI2_EVENT_TPC23_KERNEL_ERR:
10247 case GAUDI2_EVENT_TPC24_KERNEL_ERR:
10248 index = (event_type - GAUDI2_EVENT_TPC0_KERNEL_ERR) /
10249 (GAUDI2_EVENT_TPC1_KERNEL_ERR - GAUDI2_EVENT_TPC0_KERNEL_ERR);
10250 error_count = gaudi2_tpc_ack_interrupts(hdev, index, event_type,
10251 &eq_entry->razwi_with_intr_cause, &event_mask);
10252 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10253 break;
10254
10255 case GAUDI2_EVENT_DEC0_SPI:
10256 case GAUDI2_EVENT_DEC1_SPI:
10257 case GAUDI2_EVENT_DEC2_SPI:
10258 case GAUDI2_EVENT_DEC3_SPI:
10259 case GAUDI2_EVENT_DEC4_SPI:
10260 case GAUDI2_EVENT_DEC5_SPI:
10261 case GAUDI2_EVENT_DEC6_SPI:
10262 case GAUDI2_EVENT_DEC7_SPI:
10263 case GAUDI2_EVENT_DEC8_SPI:
10264 case GAUDI2_EVENT_DEC9_SPI:
10265 index = (event_type - GAUDI2_EVENT_DEC0_SPI) /
10266 (GAUDI2_EVENT_DEC1_SPI - GAUDI2_EVENT_DEC0_SPI);
10267 error_count = gaudi2_handle_dec_err(hdev, index, event_type, &event_mask);
10268 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10269 break;
10270
10271 case GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE:
10272 case GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE:
10273 case GAUDI2_EVENT_MME2_CTRL_AXI_ERROR_RESPONSE:
10274 case GAUDI2_EVENT_MME3_CTRL_AXI_ERROR_RESPONSE:
10275 index = (event_type - GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE) /
10276 (GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE -
10277 GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE);
10278 error_count = gaudi2_handle_mme_err(hdev, index, event_type, &event_mask);
10279 error_count += gaudi2_handle_qm_sei_err(hdev, event_type, false, &event_mask);
10280 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10281 break;
10282
10283 case GAUDI2_EVENT_MME0_QMAN_SW_ERROR:
10284 case GAUDI2_EVENT_MME1_QMAN_SW_ERROR:
10285 case GAUDI2_EVENT_MME2_QMAN_SW_ERROR:
10286 case GAUDI2_EVENT_MME3_QMAN_SW_ERROR:
10287 index = (event_type - GAUDI2_EVENT_MME0_QMAN_SW_ERROR) /
10288 (GAUDI2_EVENT_MME1_QMAN_SW_ERROR -
10289 GAUDI2_EVENT_MME0_QMAN_SW_ERROR);
10290 error_count = gaudi2_handle_mme_err(hdev, index, event_type, &event_mask);
10291 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10292 break;
10293
10294 case GAUDI2_EVENT_MME0_WAP_SOURCE_RESULT_INVALID:
10295 case GAUDI2_EVENT_MME1_WAP_SOURCE_RESULT_INVALID:
10296 case GAUDI2_EVENT_MME2_WAP_SOURCE_RESULT_INVALID:
10297 case GAUDI2_EVENT_MME3_WAP_SOURCE_RESULT_INVALID:
10298 index = (event_type - GAUDI2_EVENT_MME0_WAP_SOURCE_RESULT_INVALID) /
10299 (GAUDI2_EVENT_MME1_WAP_SOURCE_RESULT_INVALID -
10300 GAUDI2_EVENT_MME0_WAP_SOURCE_RESULT_INVALID);
10301 error_count = gaudi2_handle_mme_wap_err(hdev, index, event_type, &event_mask);
10302 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10303 break;
10304
10305 case GAUDI2_EVENT_KDMA_CH0_AXI_ERR_RSP:
10306 case GAUDI2_EVENT_KDMA0_CORE:
10307 error_count = gaudi2_handle_kdma_core_event(hdev, event_type,
10308 le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
10309 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10310 break;
10311
10312 case GAUDI2_EVENT_HDMA2_CORE ... GAUDI2_EVENT_HDMA5_CORE:
10313 error_count = gaudi2_handle_dma_core_event(hdev, event_type,
10314 le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
10315 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10316 break;
10317
10318 case GAUDI2_EVENT_PDMA0_CORE ... GAUDI2_EVENT_PDMA1_CORE:
10319 error_count = gaudi2_handle_dma_core_event(hdev, event_type,
10320 le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
10321 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10322 break;
10323
10324 case GAUDI2_EVENT_PCIE_ADDR_DEC_ERR:
10325 error_count = gaudi2_print_pcie_addr_dec_info(hdev, event_type,
10326 le64_to_cpu(eq_entry->intr_cause.intr_cause_data), &event_mask);
10327 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10328 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10329 break;
10330
10331 case GAUDI2_EVENT_HMMU0_PAGE_FAULT_OR_WR_PERM ... GAUDI2_EVENT_HMMU12_SECURITY_ERROR:
10332 case GAUDI2_EVENT_HMMU_0_AXI_ERR_RSP ... GAUDI2_EVENT_HMMU_12_AXI_ERR_RSP:
10333 case GAUDI2_EVENT_PMMU0_PAGE_FAULT_WR_PERM ... GAUDI2_EVENT_PMMU0_SECURITY_ERROR:
10334 case GAUDI2_EVENT_PMMU_AXI_ERR_RSP_0:
10335 error_count = gaudi2_handle_mmu_spi_sei_err(hdev, event_type, &event_mask);
10336 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10337 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10338 break;
10339
10340 case GAUDI2_EVENT_HIF0_FATAL ... GAUDI2_EVENT_HIF12_FATAL:
10341 error_count = gaudi2_handle_hif_fatal(hdev, event_type,
10342 le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
10343 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10344 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10345 break;
10346
10347 case GAUDI2_EVENT_PMMU_FATAL_0:
10348 error_count = gaudi2_handle_pif_fatal(hdev, event_type,
10349 le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
10350 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10351 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10352 break;
10353
10354 case GAUDI2_EVENT_PSOC63_RAZWI_OR_PID_MIN_MAX_INTERRUPT:
10355 error_count = gaudi2_ack_psoc_razwi_event_handler(hdev, &event_mask);
10356 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10357 break;
10358
10359 case GAUDI2_EVENT_HBM0_MC0_SEI_SEVERE ... GAUDI2_EVENT_HBM5_MC1_SEI_NON_SEVERE:
10360 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10361 if (gaudi2_handle_hbm_mc_sei_err(hdev, event_type, &eq_entry->sei_data)) {
10362 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10363 reset_required = true;
10364 is_critical = eq_entry->sei_data.hdr.is_critical;
10365 }
10366 error_count++;
10367 break;
10368
10369 case GAUDI2_EVENT_HBM_CATTRIP_0 ... GAUDI2_EVENT_HBM_CATTRIP_5:
10370 error_count = gaudi2_handle_hbm_cattrip(hdev, event_type,
10371 le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
10372 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10373 break;
10374
10375 case GAUDI2_EVENT_HBM0_MC0_SPI ... GAUDI2_EVENT_HBM5_MC1_SPI:
10376 error_count = gaudi2_handle_hbm_mc_spi(hdev,
10377 le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
10378 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10379 break;
10380
10381 case GAUDI2_EVENT_PCIE_DRAIN_COMPLETE:
10382 error_count = gaudi2_handle_pcie_drain(hdev, &eq_entry->pcie_drain_ind_data);
10383 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10384 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10385 if (hl_fw_version_cmp(hdev, 1, 13, 0) >= 0)
10386 is_critical = true;
10387 break;
10388
10389 case GAUDI2_EVENT_PSOC59_RPM_ERROR_OR_DRAIN:
10390 error_count = gaudi2_handle_psoc_drain(hdev,
10391 le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
10392 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10393 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10394 break;
10395
10396 case GAUDI2_EVENT_CPU_AXI_ECC:
10397 error_count = GAUDI2_NA_EVENT_CAUSE;
10398 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10399 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10400 break;
10401 case GAUDI2_EVENT_CPU_L2_RAM_ECC:
10402 error_count = GAUDI2_NA_EVENT_CAUSE;
10403 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10404 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10405 break;
10406 case GAUDI2_EVENT_MME0_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME0_SBTE4_AXI_ERR_RSP:
10407 case GAUDI2_EVENT_MME1_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME1_SBTE4_AXI_ERR_RSP:
10408 case GAUDI2_EVENT_MME2_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME2_SBTE4_AXI_ERR_RSP:
10409 case GAUDI2_EVENT_MME3_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME3_SBTE4_AXI_ERR_RSP:
10410 error_count = gaudi2_handle_mme_sbte_err(hdev, event_type);
10411 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10412 break;
10413 case GAUDI2_EVENT_VM0_ALARM_A ... GAUDI2_EVENT_VM3_ALARM_B:
10414 error_count = GAUDI2_NA_EVENT_CAUSE;
10415 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10416 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10417 break;
10418 case GAUDI2_EVENT_PSOC_AXI_ERR_RSP:
10419 error_count = GAUDI2_NA_EVENT_CAUSE;
10420 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10421 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10422 break;
10423 case GAUDI2_EVENT_PSOC_PRSTN_FALL:
10424 error_count = GAUDI2_NA_EVENT_CAUSE;
10425 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10426 break;
10427 case GAUDI2_EVENT_PCIE_APB_TIMEOUT:
10428 error_count = GAUDI2_NA_EVENT_CAUSE;
10429 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10430 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10431 break;
10432 case GAUDI2_EVENT_PCIE_FATAL_ERR:
10433 error_count = GAUDI2_NA_EVENT_CAUSE;
10434 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10435 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10436 break;
10437 case GAUDI2_EVENT_TPC0_BMON_SPMU:
10438 case GAUDI2_EVENT_TPC1_BMON_SPMU:
10439 case GAUDI2_EVENT_TPC2_BMON_SPMU:
10440 case GAUDI2_EVENT_TPC3_BMON_SPMU:
10441 case GAUDI2_EVENT_TPC4_BMON_SPMU:
10442 case GAUDI2_EVENT_TPC5_BMON_SPMU:
10443 case GAUDI2_EVENT_TPC6_BMON_SPMU:
10444 case GAUDI2_EVENT_TPC7_BMON_SPMU:
10445 case GAUDI2_EVENT_TPC8_BMON_SPMU:
10446 case GAUDI2_EVENT_TPC9_BMON_SPMU:
10447 case GAUDI2_EVENT_TPC10_BMON_SPMU:
10448 case GAUDI2_EVENT_TPC11_BMON_SPMU:
10449 case GAUDI2_EVENT_TPC12_BMON_SPMU:
10450 case GAUDI2_EVENT_TPC13_BMON_SPMU:
10451 case GAUDI2_EVENT_TPC14_BMON_SPMU:
10452 case GAUDI2_EVENT_TPC15_BMON_SPMU:
10453 case GAUDI2_EVENT_TPC16_BMON_SPMU:
10454 case GAUDI2_EVENT_TPC17_BMON_SPMU:
10455 case GAUDI2_EVENT_TPC18_BMON_SPMU:
10456 case GAUDI2_EVENT_TPC19_BMON_SPMU:
10457 case GAUDI2_EVENT_TPC20_BMON_SPMU:
10458 case GAUDI2_EVENT_TPC21_BMON_SPMU:
10459 case GAUDI2_EVENT_TPC22_BMON_SPMU:
10460 case GAUDI2_EVENT_TPC23_BMON_SPMU:
10461 case GAUDI2_EVENT_TPC24_BMON_SPMU:
10462 case GAUDI2_EVENT_MME0_CTRL_BMON_SPMU:
10463 case GAUDI2_EVENT_MME0_SBTE_BMON_SPMU:
10464 case GAUDI2_EVENT_MME0_WAP_BMON_SPMU:
10465 case GAUDI2_EVENT_MME1_CTRL_BMON_SPMU:
10466 case GAUDI2_EVENT_MME1_SBTE_BMON_SPMU:
10467 case GAUDI2_EVENT_MME1_WAP_BMON_SPMU:
10468 case GAUDI2_EVENT_MME2_CTRL_BMON_SPMU:
10469 case GAUDI2_EVENT_MME2_SBTE_BMON_SPMU:
10470 case GAUDI2_EVENT_MME2_WAP_BMON_SPMU:
10471 case GAUDI2_EVENT_MME3_CTRL_BMON_SPMU:
10472 case GAUDI2_EVENT_MME3_SBTE_BMON_SPMU:
10473 case GAUDI2_EVENT_MME3_WAP_BMON_SPMU:
10474 case GAUDI2_EVENT_HDMA2_BM_SPMU ... GAUDI2_EVENT_PDMA1_BM_SPMU:
10475 fallthrough;
10476 case GAUDI2_EVENT_DEC0_BMON_SPMU:
10477 case GAUDI2_EVENT_DEC1_BMON_SPMU:
10478 case GAUDI2_EVENT_DEC2_BMON_SPMU:
10479 case GAUDI2_EVENT_DEC3_BMON_SPMU:
10480 case GAUDI2_EVENT_DEC4_BMON_SPMU:
10481 case GAUDI2_EVENT_DEC5_BMON_SPMU:
10482 case GAUDI2_EVENT_DEC6_BMON_SPMU:
10483 case GAUDI2_EVENT_DEC7_BMON_SPMU:
10484 case GAUDI2_EVENT_DEC8_BMON_SPMU:
10485 case GAUDI2_EVENT_DEC9_BMON_SPMU:
10486 case GAUDI2_EVENT_ROTATOR0_BMON_SPMU ... GAUDI2_EVENT_SM3_BMON_SPMU:
10487 error_count = GAUDI2_NA_EVENT_CAUSE;
10488 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10489 break;
10490
10491 case GAUDI2_EVENT_CPU_FIX_POWER_ENV_S:
10492 case GAUDI2_EVENT_CPU_FIX_POWER_ENV_E:
10493 case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_S:
10494 case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_E:
10495 gaudi2_print_clk_change_info(hdev, event_type, &event_mask);
10496 error_count = GAUDI2_NA_EVENT_CAUSE;
10497 break;
10498
10499 case GAUDI2_EVENT_CPU_PKT_QUEUE_OUT_SYNC:
10500 gaudi2_print_out_of_sync_info(hdev, event_type, &eq_entry->pkt_sync_err);
10501 error_count = GAUDI2_NA_EVENT_CAUSE;
10502 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10503 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10504 break;
10505
10506 case GAUDI2_EVENT_PCIE_FLR_REQUESTED:
10507 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10508 error_count = GAUDI2_NA_EVENT_CAUSE;
10509 /* Do nothing- FW will handle it */
10510 break;
10511
10512 case GAUDI2_EVENT_PCIE_P2P_MSIX:
10513 error_count = gaudi2_handle_pcie_p2p_msix(hdev, event_type);
10514 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10515 break;
10516
10517 case GAUDI2_EVENT_SM0_AXI_ERROR_RESPONSE ... GAUDI2_EVENT_SM3_AXI_ERROR_RESPONSE:
10518 index = event_type - GAUDI2_EVENT_SM0_AXI_ERROR_RESPONSE;
10519 error_count = gaudi2_handle_sm_err(hdev, event_type, index);
10520 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10521 break;
10522
10523 case GAUDI2_EVENT_PSOC_MME_PLL_LOCK_ERR ... GAUDI2_EVENT_DCORE2_HBM_PLL_LOCK_ERR:
10524 error_count = GAUDI2_NA_EVENT_CAUSE;
10525 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10526 break;
10527
10528 case GAUDI2_EVENT_CPU_CPLD_SHUTDOWN_CAUSE:
10529 dev_info(hdev->dev, "CPLD shutdown cause, reset reason: 0x%llx\n",
10530 le64_to_cpu(eq_entry->data[0]));
10531 error_count = GAUDI2_NA_EVENT_CAUSE;
10532 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10533 break;
10534 case GAUDI2_EVENT_CPU_CPLD_SHUTDOWN_EVENT:
10535 dev_err(hdev->dev, "CPLD shutdown event, reset reason: 0x%llx\n",
10536 le64_to_cpu(eq_entry->data[0]));
10537 error_count = GAUDI2_NA_EVENT_CAUSE;
10538 hl_eq_cpld_shutdown_event_handle(hdev, event_type, &event_mask);
10539 break;
10540
10541 case GAUDI2_EVENT_CPU_PKT_SANITY_FAILED:
10542 gaudi2_print_cpu_pkt_failure_info(hdev, event_type, &eq_entry->pkt_sync_err);
10543 error_count = GAUDI2_NA_EVENT_CAUSE;
10544 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
10545 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10546 break;
10547
10548 case GAUDI2_EVENT_ARC_DCCM_FULL:
10549 error_count = hl_arc_event_handle(hdev, event_type, &eq_entry->arc_data);
10550 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
10551 break;
10552
10553 case GAUDI2_EVENT_CPU_FP32_NOT_SUPPORTED:
10554 case GAUDI2_EVENT_CPU_DEV_RESET_REQ:
10555 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
10556 error_count = GAUDI2_NA_EVENT_CAUSE;
10557 is_critical = true;
10558 break;
10559
10560 case GAUDI2_EVENT_ARC_PWR_BRK_ENTRY:
10561 case GAUDI2_EVENT_ARC_PWR_BRK_EXT:
10562 case GAUDI2_EVENT_ARC_PWR_RD_MODE0:
10563 case GAUDI2_EVENT_ARC_PWR_RD_MODE1:
10564 case GAUDI2_EVENT_ARC_PWR_RD_MODE2:
10565 case GAUDI2_EVENT_ARC_PWR_RD_MODE3:
10566 error_count = GAUDI2_NA_EVENT_CAUSE;
10567 dev_info_ratelimited(hdev->dev, "%s event received\n",
10568 gaudi2_irq_map_table[event_type].name);
10569 break;
10570
10571 case GAUDI2_EVENT_ARC_EQ_HEARTBEAT:
10572 hl_eq_heartbeat_event_handle(hdev);
10573 error_count = GAUDI2_NA_EVENT_CAUSE;
10574 break;
10575 default:
10576 if (gaudi2_irq_map_table[event_type].valid) {
10577 dev_err_ratelimited(hdev->dev, "Cannot find handler for event %d\n",
10578 event_type);
10579 error_count = GAUDI2_NA_EVENT_CAUSE;
10580 }
10581 }
10582
10583 if (event_mask & HL_NOTIFIER_EVENT_USER_ENGINE_ERR)
10584 hl_capture_engine_err(hdev, event_id_to_engine_id(hdev, event_type), error_count);
10585
10586 /* Make sure to dump an error in case no error cause was printed so far.
10587 * Note that although we have counted the errors, we use this number as
10588 * a boolean.
10589 */
10590 if (error_count == GAUDI2_NA_EVENT_CAUSE && !is_info_event(event_type))
10591 gaudi2_print_event(hdev, event_type, true, "%d", event_type);
10592 else if (error_count == 0)
10593 gaudi2_print_event(hdev, event_type, true,
10594 "No error cause for H/W event %u", event_type);
10595
10596 if ((gaudi2_irq_map_table[event_type].reset != EVENT_RESET_TYPE_NONE) || reset_required) {
10597 if (reset_required ||
10598 (gaudi2_irq_map_table[event_type].reset == EVENT_RESET_TYPE_HARD))
10599 reset_flags |= HL_DRV_RESET_HARD;
10600
10601 if (hdev->hard_reset_on_fw_events ||
10602 (hdev->asic_prop.fw_security_enabled && is_critical))
10603 goto reset_device;
10604 }
10605
10606 /* Send unmask irq only for interrupts not classified as MSG */
10607 if (!gaudi2_irq_map_table[event_type].msg)
10608 hl_fw_unmask_irq(hdev, event_type);
10609
10610 if (event_mask)
10611 hl_notifier_event_send_all(hdev, event_mask);
10612
10613 return;
10614
10615 reset_device:
10616 if (hdev->asic_prop.fw_security_enabled && is_critical) {
10617 reset_flags |= HL_DRV_RESET_BYPASS_REQ_TO_FW;
10618 event_mask |= HL_NOTIFIER_EVENT_DEVICE_UNAVAILABLE;
10619 } else {
10620 reset_flags |= HL_DRV_RESET_DELAY;
10621 }
10622 /* escalate general hw errors to critical/fatal error */
10623 if (event_mask & HL_NOTIFIER_EVENT_GENERAL_HW_ERR)
10624 hl_handle_critical_hw_err(hdev, event_type, &event_mask);
10625
10626 hl_debugfs_cfg_access_history_dump(hdev);
10627 event_mask |= HL_NOTIFIER_EVENT_DEVICE_RESET;
10628 hl_device_cond_reset(hdev, reset_flags, event_mask);
10629 }
10630
gaudi2_memset_memory_chunk_using_edma_qm(struct hl_device * hdev,struct packet_lin_dma * lin_dma_pkt,u64 phys_addr,u32 hw_queue_id,u32 size,u64 addr,u32 val)10631 static int gaudi2_memset_memory_chunk_using_edma_qm(struct hl_device *hdev,
10632 struct packet_lin_dma *lin_dma_pkt,
10633 u64 phys_addr, u32 hw_queue_id, u32 size, u64 addr, u32 val)
10634 {
10635 u32 ctl, pkt_size;
10636 int rc = 0, i;
10637
10638 ctl = FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_LIN_DMA);
10639 ctl |= FIELD_PREP(GAUDI2_PKT_LIN_DMA_CTL_MEMSET_MASK, 1);
10640 ctl |= FIELD_PREP(GAUDI2_PKT_LIN_DMA_CTL_WRCOMP_MASK, 1);
10641 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, 1);
10642
10643 lin_dma_pkt->ctl = cpu_to_le32(ctl);
10644 lin_dma_pkt->src_addr = cpu_to_le64(val);
10645 lin_dma_pkt->dst_addr = cpu_to_le64(addr);
10646 lin_dma_pkt->tsize = cpu_to_le32(size);
10647
10648 pkt_size = sizeof(struct packet_lin_dma);
10649
10650 for (i = 0; i < 3; i++) {
10651 rc = hdev->asic_funcs->access_dev_mem(hdev, PCI_REGION_DRAM,
10652 phys_addr + (i * sizeof(u64)),
10653 ((u64 *)(lin_dma_pkt)) + i, DEBUGFS_WRITE64);
10654 if (rc) {
10655 dev_err(hdev->dev, "Failed to copy lin_dma packet to HBM (%#llx)\n",
10656 phys_addr);
10657 return rc;
10658 }
10659 }
10660
10661 rc = hl_hw_queue_send_cb_no_cmpl(hdev, hw_queue_id, pkt_size, phys_addr);
10662 if (rc)
10663 dev_err(hdev->dev, "Failed to send lin_dma packet to H/W queue %s\n",
10664 GAUDI2_QUEUE_ID_TO_STR(hw_queue_id));
10665
10666 return rc;
10667 }
10668
gaudi2_memset_device_memory(struct hl_device * hdev,u64 addr,u64 size,u64 val)10669 static int gaudi2_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size, u64 val)
10670 {
10671 u32 edma_queues_id[] = {GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0,
10672 GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0,
10673 GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0,
10674 GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0};
10675 u32 chunk_size, dcore, edma_idx, sob_offset, sob_addr, comp_val,
10676 old_mmubp, mmubp, num_of_pkts, busy, pkt_size, cb_len;
10677 u64 comp_addr, cur_addr = addr, end_addr = addr + size;
10678 struct asic_fixed_properties *prop = &hdev->asic_prop;
10679 int rc = 0, dma_num = 0, i;
10680 void *lin_dma_pkts_arr;
10681
10682 if (prop->edma_enabled_mask == 0) {
10683 dev_info(hdev->dev, "non of the EDMA engines is enabled - skip dram scrubbing\n");
10684 return -EIO;
10685 }
10686
10687 sob_offset = hdev->asic_prop.first_available_user_sob[0] * 4;
10688 sob_addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;
10689 comp_addr = CFG_BASE + sob_addr;
10690 comp_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_INC_MASK, 1) |
10691 FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_VAL_MASK, 1);
10692 mmubp = FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_WR_MASK, 1) |
10693 FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_RD_MASK, 1);
10694
10695 /* Calculate how many lin dma pkts we'll need */
10696 num_of_pkts = div64_u64(round_up(size, SZ_2G), SZ_2G);
10697 pkt_size = sizeof(struct packet_lin_dma);
10698 cb_len = pkt_size * num_of_pkts;
10699
10700 /*
10701 * if we're not scrubing HMMU or NIC reserved sections in hbm,
10702 * then it the scrubing of the user section, as we use the start of the user section
10703 * to store the CB of the EDMA QM, so shift the start address of the scrubbing accordingly
10704 * and scrub the CB section before leaving this function.
10705 */
10706 if ((addr >= prop->dram_user_base_address) &&
10707 (addr < prop->dram_user_base_address + cb_len))
10708 cur_addr += (prop->dram_user_base_address + cb_len) - addr;
10709
10710 lin_dma_pkts_arr = kvcalloc(num_of_pkts, pkt_size, GFP_KERNEL);
10711 if (!lin_dma_pkts_arr)
10712 return -ENOMEM;
10713
10714 /*
10715 * set mmu bypass for the scrubbing - all ddmas are configured the same so save
10716 * only the first one to restore later
10717 * also set the sob addr for all edma cores for completion.
10718 * set QM as trusted to allow it to access physical address with MMU bp.
10719 */
10720 old_mmubp = RREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP);
10721 for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {
10722 for (edma_idx = 0 ; edma_idx < NUM_OF_EDMA_PER_DCORE ; edma_idx++) {
10723 u32 edma_offset = dcore * DCORE_OFFSET + edma_idx * DCORE_EDMA_OFFSET;
10724 u32 edma_bit = dcore * NUM_OF_EDMA_PER_DCORE + edma_idx;
10725
10726 if (!(prop->edma_enabled_mask & BIT(edma_bit)))
10727 continue;
10728
10729 WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP +
10730 edma_offset, mmubp);
10731 WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_ADDR_LO + edma_offset,
10732 lower_32_bits(comp_addr));
10733 WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_ADDR_HI + edma_offset,
10734 upper_32_bits(comp_addr));
10735 WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_WDATA + edma_offset,
10736 comp_val);
10737 gaudi2_qman_set_test_mode(hdev,
10738 edma_queues_id[dcore] + 4 * edma_idx, true);
10739 }
10740 }
10741
10742 WREG32(sob_addr, 0);
10743
10744 while (cur_addr < end_addr) {
10745 for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {
10746 for (edma_idx = 0 ; edma_idx < NUM_OF_EDMA_PER_DCORE ; edma_idx++) {
10747 u32 edma_bit = dcore * NUM_OF_EDMA_PER_DCORE + edma_idx;
10748
10749 if (!(prop->edma_enabled_mask & BIT(edma_bit)))
10750 continue;
10751
10752 chunk_size = min_t(u64, SZ_2G, end_addr - cur_addr);
10753
10754 rc = gaudi2_memset_memory_chunk_using_edma_qm(hdev,
10755 (struct packet_lin_dma *)lin_dma_pkts_arr + dma_num,
10756 prop->dram_user_base_address + (dma_num * pkt_size),
10757 edma_queues_id[dcore] + edma_idx * 4,
10758 chunk_size, cur_addr, val);
10759 if (rc)
10760 goto end;
10761
10762 dma_num++;
10763 cur_addr += chunk_size;
10764 if (cur_addr == end_addr)
10765 goto edma_wait;
10766 }
10767 }
10768 }
10769
10770 edma_wait:
10771 rc = hl_poll_timeout(hdev, sob_addr, busy, (busy == dma_num), 1000, 1000000);
10772 if (rc) {
10773 dev_err(hdev->dev, "DMA Timeout during HBM scrubbing(sob: 0x%x, dma_num: 0x%x)\n",
10774 busy, dma_num);
10775 goto end;
10776 }
10777 end:
10778 for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {
10779 for (edma_idx = 0 ; edma_idx < NUM_OF_EDMA_PER_DCORE ; edma_idx++) {
10780 u32 edma_offset = dcore * DCORE_OFFSET + edma_idx * DCORE_EDMA_OFFSET;
10781 u32 edma_bit = dcore * NUM_OF_EDMA_PER_DCORE + edma_idx;
10782
10783 if (!(prop->edma_enabled_mask & BIT(edma_bit)))
10784 continue;
10785
10786 WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP + edma_offset, old_mmubp);
10787 WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_ADDR_LO + edma_offset, 0);
10788 WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_ADDR_HI + edma_offset, 0);
10789 WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_WDATA + edma_offset, 0);
10790 gaudi2_qman_set_test_mode(hdev,
10791 edma_queues_id[dcore] + 4 * edma_idx, false);
10792 }
10793 }
10794
10795 memset(lin_dma_pkts_arr, 0, sizeof(u64));
10796
10797 /* Zero the HBM area where we copied the CB */
10798 for (i = 0; i < cb_len / sizeof(u64); i += sizeof(u64))
10799 rc = hdev->asic_funcs->access_dev_mem(hdev, PCI_REGION_DRAM,
10800 prop->dram_user_base_address + i,
10801 (u64 *)(lin_dma_pkts_arr), DEBUGFS_WRITE64);
10802 WREG32(sob_addr, 0);
10803
10804 kvfree(lin_dma_pkts_arr);
10805
10806 return rc;
10807 }
10808
gaudi2_scrub_device_dram(struct hl_device * hdev,u64 val)10809 static int gaudi2_scrub_device_dram(struct hl_device *hdev, u64 val)
10810 {
10811 int rc;
10812 struct asic_fixed_properties *prop = &hdev->asic_prop;
10813 u64 size = prop->dram_end_address - prop->dram_user_base_address;
10814
10815 rc = gaudi2_memset_device_memory(hdev, prop->dram_user_base_address, size, val);
10816
10817 if (rc)
10818 dev_err(hdev->dev, "Failed to scrub dram, address: 0x%llx size: %llu\n",
10819 prop->dram_user_base_address, size);
10820 return rc;
10821 }
10822
gaudi2_scrub_device_mem(struct hl_device * hdev)10823 static int gaudi2_scrub_device_mem(struct hl_device *hdev)
10824 {
10825 int rc;
10826 struct asic_fixed_properties *prop = &hdev->asic_prop;
10827 u64 val = hdev->memory_scrub_val;
10828 u64 addr, size;
10829
10830 if (!hdev->memory_scrub)
10831 return 0;
10832
10833 /* scrub SRAM */
10834 addr = prop->sram_user_base_address;
10835 size = hdev->pldm ? 0x10000 : (prop->sram_size - SRAM_USER_BASE_OFFSET);
10836 dev_dbg(hdev->dev, "Scrubbing SRAM: 0x%09llx - 0x%09llx, val: 0x%llx\n",
10837 addr, addr + size, val);
10838 rc = gaudi2_memset_device_memory(hdev, addr, size, val);
10839 if (rc) {
10840 dev_err(hdev->dev, "scrubbing SRAM failed (%d)\n", rc);
10841 return rc;
10842 }
10843
10844 /* scrub DRAM */
10845 rc = gaudi2_scrub_device_dram(hdev, val);
10846 if (rc) {
10847 dev_err(hdev->dev, "scrubbing DRAM failed (%d)\n", rc);
10848 return rc;
10849 }
10850 return 0;
10851 }
10852
gaudi2_restore_user_sm_registers(struct hl_device * hdev)10853 static void gaudi2_restore_user_sm_registers(struct hl_device *hdev)
10854 {
10855 u64 addr, mon_sts_addr, mon_cfg_addr, cq_lbw_l_addr, cq_lbw_h_addr,
10856 cq_lbw_data_addr, cq_base_l_addr, cq_base_h_addr, cq_size_addr;
10857 u32 val, size, offset;
10858 int dcore_id;
10859
10860 offset = hdev->asic_prop.first_available_cq[0] * 4;
10861 cq_lbw_l_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0 + offset;
10862 cq_lbw_h_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 + offset;
10863 cq_lbw_data_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_DATA_0 + offset;
10864 cq_base_l_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_L_0 + offset;
10865 cq_base_h_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_H_0 + offset;
10866 cq_size_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_SIZE_LOG2_0 + offset;
10867 size = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 -
10868 (mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0 + offset);
10869
10870 /* memset dcore0 CQ registers */
10871 gaudi2_memset_device_lbw(hdev, cq_lbw_l_addr, size, 0);
10872 gaudi2_memset_device_lbw(hdev, cq_lbw_h_addr, size, 0);
10873 gaudi2_memset_device_lbw(hdev, cq_lbw_data_addr, size, 0);
10874 gaudi2_memset_device_lbw(hdev, cq_base_l_addr, size, 0);
10875 gaudi2_memset_device_lbw(hdev, cq_base_h_addr, size, 0);
10876 gaudi2_memset_device_lbw(hdev, cq_size_addr, size, 0);
10877
10878 cq_lbw_l_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0 + DCORE_OFFSET;
10879 cq_lbw_h_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 + DCORE_OFFSET;
10880 cq_lbw_data_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_DATA_0 + DCORE_OFFSET;
10881 cq_base_l_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_L_0 + DCORE_OFFSET;
10882 cq_base_h_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_H_0 + DCORE_OFFSET;
10883 cq_size_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_SIZE_LOG2_0 + DCORE_OFFSET;
10884 size = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 - mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0;
10885
10886 for (dcore_id = 1 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {
10887 gaudi2_memset_device_lbw(hdev, cq_lbw_l_addr, size, 0);
10888 gaudi2_memset_device_lbw(hdev, cq_lbw_h_addr, size, 0);
10889 gaudi2_memset_device_lbw(hdev, cq_lbw_data_addr, size, 0);
10890 gaudi2_memset_device_lbw(hdev, cq_base_l_addr, size, 0);
10891 gaudi2_memset_device_lbw(hdev, cq_base_h_addr, size, 0);
10892 gaudi2_memset_device_lbw(hdev, cq_size_addr, size, 0);
10893
10894 cq_lbw_l_addr += DCORE_OFFSET;
10895 cq_lbw_h_addr += DCORE_OFFSET;
10896 cq_lbw_data_addr += DCORE_OFFSET;
10897 cq_base_l_addr += DCORE_OFFSET;
10898 cq_base_h_addr += DCORE_OFFSET;
10899 cq_size_addr += DCORE_OFFSET;
10900 }
10901
10902 offset = hdev->asic_prop.first_available_user_mon[0] * 4;
10903 addr = mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0 + offset;
10904 val = 1 << DCORE0_SYNC_MNGR_OBJS_MON_STATUS_PROT_SHIFT;
10905 size = mmDCORE0_SYNC_MNGR_OBJS_SM_SEC_0 - (mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0 + offset);
10906
10907 /* memset dcore0 monitors */
10908 gaudi2_memset_device_lbw(hdev, addr, size, val);
10909
10910 addr = mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + offset;
10911 gaudi2_memset_device_lbw(hdev, addr, size, 0);
10912
10913 mon_sts_addr = mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0 + DCORE_OFFSET;
10914 mon_cfg_addr = mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + DCORE_OFFSET;
10915 size = mmDCORE0_SYNC_MNGR_OBJS_SM_SEC_0 - mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0;
10916
10917 for (dcore_id = 1 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {
10918 gaudi2_memset_device_lbw(hdev, mon_sts_addr, size, val);
10919 gaudi2_memset_device_lbw(hdev, mon_cfg_addr, size, 0);
10920 mon_sts_addr += DCORE_OFFSET;
10921 mon_cfg_addr += DCORE_OFFSET;
10922 }
10923
10924 offset = hdev->asic_prop.first_available_user_sob[0] * 4;
10925 addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + offset;
10926 val = 0;
10927 size = mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 -
10928 (mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + offset);
10929
10930 /* memset dcore0 sobs */
10931 gaudi2_memset_device_lbw(hdev, addr, size, val);
10932
10933 addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + DCORE_OFFSET;
10934 size = mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 - mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0;
10935
10936 for (dcore_id = 1 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {
10937 gaudi2_memset_device_lbw(hdev, addr, size, val);
10938 addr += DCORE_OFFSET;
10939 }
10940
10941 /* Flush all WREG to prevent race */
10942 val = RREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + offset);
10943 }
10944
gaudi2_restore_user_qm_registers(struct hl_device * hdev)10945 static void gaudi2_restore_user_qm_registers(struct hl_device *hdev)
10946 {
10947 u32 reg_base, hw_queue_id;
10948
10949 for (hw_queue_id = GAUDI2_QUEUE_ID_PDMA_0_0 ; hw_queue_id <= GAUDI2_QUEUE_ID_ROT_1_0;
10950 hw_queue_id += NUM_OF_PQ_PER_QMAN) {
10951 if (!gaudi2_is_queue_enabled(hdev, hw_queue_id))
10952 continue;
10953
10954 gaudi2_clear_qm_fence_counters_common(hdev, hw_queue_id, false);
10955
10956 reg_base = gaudi2_qm_blocks_bases[hw_queue_id];
10957 WREG32(reg_base + QM_ARB_CFG_0_OFFSET, 0);
10958 }
10959
10960 /* Flush all WREG to prevent race */
10961 RREG32(mmPDMA0_QM_ARB_CFG_0);
10962 }
10963
gaudi2_restore_nic_qm_registers(struct hl_device * hdev)10964 static void gaudi2_restore_nic_qm_registers(struct hl_device *hdev)
10965 {
10966 u32 reg_base, hw_queue_id;
10967
10968 for (hw_queue_id = GAUDI2_QUEUE_ID_NIC_0_0 ; hw_queue_id <= GAUDI2_QUEUE_ID_NIC_23_3;
10969 hw_queue_id += NUM_OF_PQ_PER_QMAN) {
10970 if (!gaudi2_is_queue_enabled(hdev, hw_queue_id))
10971 continue;
10972
10973 gaudi2_clear_qm_fence_counters_common(hdev, hw_queue_id, false);
10974
10975 reg_base = gaudi2_qm_blocks_bases[hw_queue_id];
10976 WREG32(reg_base + QM_ARB_CFG_0_OFFSET, 0);
10977 }
10978
10979 /* Flush all WREG to prevent race */
10980 RREG32(mmPDMA0_QM_ARB_CFG_0);
10981 }
10982
gaudi2_context_switch(struct hl_device * hdev,u32 asid)10983 static int gaudi2_context_switch(struct hl_device *hdev, u32 asid)
10984 {
10985 return 0;
10986 }
10987
gaudi2_restore_phase_topology(struct hl_device * hdev)10988 static void gaudi2_restore_phase_topology(struct hl_device *hdev)
10989 {
10990 }
10991
gaudi2_init_block_instances(struct hl_device * hdev,u32 block_idx,struct dup_block_ctx * cfg_ctx)10992 static void gaudi2_init_block_instances(struct hl_device *hdev, u32 block_idx,
10993 struct dup_block_ctx *cfg_ctx)
10994 {
10995 u64 block_base = cfg_ctx->base + block_idx * cfg_ctx->block_off;
10996 u8 seq;
10997 int i;
10998
10999 for (i = 0 ; i < cfg_ctx->instances ; i++) {
11000 seq = block_idx * cfg_ctx->instances + i;
11001
11002 /* skip disabled instance */
11003 if (!(cfg_ctx->enabled_mask & BIT_ULL(seq)))
11004 continue;
11005
11006 cfg_ctx->instance_cfg_fn(hdev, block_base + i * cfg_ctx->instance_off,
11007 cfg_ctx->data);
11008 }
11009 }
11010
gaudi2_init_blocks_with_mask(struct hl_device * hdev,struct dup_block_ctx * cfg_ctx,u64 mask)11011 static void gaudi2_init_blocks_with_mask(struct hl_device *hdev, struct dup_block_ctx *cfg_ctx,
11012 u64 mask)
11013 {
11014 int i;
11015
11016 cfg_ctx->enabled_mask = mask;
11017
11018 for (i = 0 ; i < cfg_ctx->blocks ; i++)
11019 gaudi2_init_block_instances(hdev, i, cfg_ctx);
11020 }
11021
gaudi2_init_blocks(struct hl_device * hdev,struct dup_block_ctx * cfg_ctx)11022 void gaudi2_init_blocks(struct hl_device *hdev, struct dup_block_ctx *cfg_ctx)
11023 {
11024 gaudi2_init_blocks_with_mask(hdev, cfg_ctx, U64_MAX);
11025 }
11026
gaudi2_debugfs_read_dma(struct hl_device * hdev,u64 addr,u32 size,void * blob_addr)11027 static int gaudi2_debugfs_read_dma(struct hl_device *hdev, u64 addr, u32 size, void *blob_addr)
11028 {
11029 void *host_mem_virtual_addr;
11030 dma_addr_t host_mem_dma_addr;
11031 u64 reserved_va_base;
11032 u32 pos, size_left, size_to_dma;
11033 struct hl_ctx *ctx;
11034 int rc = 0;
11035
11036 /* Fetch the ctx */
11037 ctx = hl_get_compute_ctx(hdev);
11038 if (!ctx) {
11039 dev_err(hdev->dev, "No ctx available\n");
11040 return -EINVAL;
11041 }
11042
11043 /* Allocate buffers for read and for poll */
11044 host_mem_virtual_addr = hl_asic_dma_alloc_coherent(hdev, SZ_2M, &host_mem_dma_addr,
11045 GFP_KERNEL | __GFP_ZERO);
11046 if (host_mem_virtual_addr == NULL) {
11047 dev_err(hdev->dev, "Failed to allocate memory for KDMA read\n");
11048 rc = -ENOMEM;
11049 goto put_ctx;
11050 }
11051
11052 /* Reserve VM region on asic side */
11053 reserved_va_base = hl_reserve_va_block(hdev, ctx, HL_VA_RANGE_TYPE_HOST, SZ_2M,
11054 HL_MMU_VA_ALIGNMENT_NOT_NEEDED);
11055 if (!reserved_va_base) {
11056 dev_err(hdev->dev, "Failed to reserve vmem on asic\n");
11057 rc = -ENOMEM;
11058 goto free_data_buffer;
11059 }
11060
11061 /* Create mapping on asic side */
11062 mutex_lock(&hdev->mmu_lock);
11063
11064 rc = hl_mmu_map_contiguous(ctx, reserved_va_base, host_mem_dma_addr, SZ_2M);
11065 if (rc) {
11066 dev_err(hdev->dev, "Failed to create mapping on asic mmu\n");
11067 goto unreserve_va;
11068 }
11069
11070 rc = hl_mmu_invalidate_cache_range(hdev, false,
11071 MMU_OP_USERPTR | MMU_OP_SKIP_LOW_CACHE_INV,
11072 ctx->asid, reserved_va_base, SZ_2M);
11073 if (rc) {
11074 hl_mmu_unmap_contiguous(ctx, reserved_va_base, SZ_2M);
11075 goto unreserve_va;
11076 }
11077
11078 mutex_unlock(&hdev->mmu_lock);
11079
11080 /* Enable MMU on KDMA */
11081 gaudi2_kdma_set_mmbp_asid(hdev, false, ctx->asid);
11082
11083 pos = 0;
11084 size_left = size;
11085 size_to_dma = SZ_2M;
11086
11087 while (size_left > 0) {
11088 if (size_left < SZ_2M)
11089 size_to_dma = size_left;
11090
11091 rc = gaudi2_send_job_to_kdma(hdev, addr, reserved_va_base, size_to_dma, false);
11092 if (rc)
11093 break;
11094
11095 memcpy(blob_addr + pos, host_mem_virtual_addr, size_to_dma);
11096
11097 if (size_left <= SZ_2M)
11098 break;
11099
11100 pos += SZ_2M;
11101 addr += SZ_2M;
11102 size_left -= SZ_2M;
11103 }
11104
11105 gaudi2_kdma_set_mmbp_asid(hdev, true, HL_KERNEL_ASID_ID);
11106
11107 mutex_lock(&hdev->mmu_lock);
11108
11109 rc = hl_mmu_unmap_contiguous(ctx, reserved_va_base, SZ_2M);
11110 if (rc)
11111 goto unreserve_va;
11112
11113 rc = hl_mmu_invalidate_cache_range(hdev, false, MMU_OP_USERPTR,
11114 ctx->asid, reserved_va_base, SZ_2M);
11115
11116 unreserve_va:
11117 mutex_unlock(&hdev->mmu_lock);
11118 hl_unreserve_va_block(hdev, ctx, reserved_va_base, SZ_2M);
11119 free_data_buffer:
11120 hl_asic_dma_free_coherent(hdev, SZ_2M, host_mem_virtual_addr, host_mem_dma_addr);
11121 put_ctx:
11122 hl_ctx_put(ctx);
11123
11124 return rc;
11125 }
11126
gaudi2_internal_cb_pool_init(struct hl_device * hdev,struct hl_ctx * ctx)11127 static int gaudi2_internal_cb_pool_init(struct hl_device *hdev, struct hl_ctx *ctx)
11128 {
11129 struct gaudi2_device *gaudi2 = hdev->asic_specific;
11130 int min_alloc_order, rc;
11131
11132 if (!(gaudi2->hw_cap_initialized & HW_CAP_PMMU))
11133 return 0;
11134
11135 hdev->internal_cb_pool_virt_addr = hl_asic_dma_alloc_coherent(hdev,
11136 HOST_SPACE_INTERNAL_CB_SZ,
11137 &hdev->internal_cb_pool_dma_addr,
11138 GFP_KERNEL | __GFP_ZERO);
11139
11140 if (!hdev->internal_cb_pool_virt_addr)
11141 return -ENOMEM;
11142
11143 min_alloc_order = ilog2(min(gaudi2_get_signal_cb_size(hdev),
11144 gaudi2_get_wait_cb_size(hdev)));
11145
11146 hdev->internal_cb_pool = gen_pool_create(min_alloc_order, -1);
11147 if (!hdev->internal_cb_pool) {
11148 dev_err(hdev->dev, "Failed to create internal CB pool\n");
11149 rc = -ENOMEM;
11150 goto free_internal_cb_pool;
11151 }
11152
11153 rc = gen_pool_add(hdev->internal_cb_pool, (uintptr_t) hdev->internal_cb_pool_virt_addr,
11154 HOST_SPACE_INTERNAL_CB_SZ, -1);
11155 if (rc) {
11156 dev_err(hdev->dev, "Failed to add memory to internal CB pool\n");
11157 rc = -EFAULT;
11158 goto destroy_internal_cb_pool;
11159 }
11160
11161 hdev->internal_cb_va_base = hl_reserve_va_block(hdev, ctx, HL_VA_RANGE_TYPE_HOST,
11162 HOST_SPACE_INTERNAL_CB_SZ, HL_MMU_VA_ALIGNMENT_NOT_NEEDED);
11163
11164 if (!hdev->internal_cb_va_base) {
11165 rc = -ENOMEM;
11166 goto destroy_internal_cb_pool;
11167 }
11168
11169 mutex_lock(&hdev->mmu_lock);
11170
11171 rc = hl_mmu_map_contiguous(ctx, hdev->internal_cb_va_base, hdev->internal_cb_pool_dma_addr,
11172 HOST_SPACE_INTERNAL_CB_SZ);
11173 if (rc)
11174 goto unreserve_internal_cb_pool;
11175
11176 rc = hl_mmu_invalidate_cache(hdev, false, MMU_OP_USERPTR);
11177 if (rc)
11178 goto unmap_internal_cb_pool;
11179
11180 mutex_unlock(&hdev->mmu_lock);
11181
11182 return 0;
11183
11184 unmap_internal_cb_pool:
11185 hl_mmu_unmap_contiguous(ctx, hdev->internal_cb_va_base, HOST_SPACE_INTERNAL_CB_SZ);
11186 unreserve_internal_cb_pool:
11187 mutex_unlock(&hdev->mmu_lock);
11188 hl_unreserve_va_block(hdev, ctx, hdev->internal_cb_va_base, HOST_SPACE_INTERNAL_CB_SZ);
11189 destroy_internal_cb_pool:
11190 gen_pool_destroy(hdev->internal_cb_pool);
11191 free_internal_cb_pool:
11192 hl_asic_dma_free_coherent(hdev, HOST_SPACE_INTERNAL_CB_SZ, hdev->internal_cb_pool_virt_addr,
11193 hdev->internal_cb_pool_dma_addr);
11194
11195 return rc;
11196 }
11197
gaudi2_internal_cb_pool_fini(struct hl_device * hdev,struct hl_ctx * ctx)11198 static void gaudi2_internal_cb_pool_fini(struct hl_device *hdev, struct hl_ctx *ctx)
11199 {
11200 struct gaudi2_device *gaudi2 = hdev->asic_specific;
11201
11202 if (!(gaudi2->hw_cap_initialized & HW_CAP_PMMU))
11203 return;
11204
11205 mutex_lock(&hdev->mmu_lock);
11206 hl_mmu_unmap_contiguous(ctx, hdev->internal_cb_va_base, HOST_SPACE_INTERNAL_CB_SZ);
11207 hl_unreserve_va_block(hdev, ctx, hdev->internal_cb_va_base, HOST_SPACE_INTERNAL_CB_SZ);
11208 hl_mmu_invalidate_cache(hdev, true, MMU_OP_USERPTR);
11209 mutex_unlock(&hdev->mmu_lock);
11210
11211 gen_pool_destroy(hdev->internal_cb_pool);
11212
11213 hl_asic_dma_free_coherent(hdev, HOST_SPACE_INTERNAL_CB_SZ, hdev->internal_cb_pool_virt_addr,
11214 hdev->internal_cb_pool_dma_addr);
11215 }
11216
gaudi2_restore_user_registers(struct hl_device * hdev)11217 static void gaudi2_restore_user_registers(struct hl_device *hdev)
11218 {
11219 gaudi2_restore_user_sm_registers(hdev);
11220 gaudi2_restore_user_qm_registers(hdev);
11221 }
11222
gaudi2_map_virtual_msix_doorbell_memory(struct hl_ctx * ctx)11223 static int gaudi2_map_virtual_msix_doorbell_memory(struct hl_ctx *ctx)
11224 {
11225 struct hl_device *hdev = ctx->hdev;
11226 struct asic_fixed_properties *prop = &hdev->asic_prop;
11227 struct gaudi2_device *gaudi2 = hdev->asic_specific;
11228 int rc;
11229
11230 rc = hl_mmu_map_page(ctx, RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START,
11231 gaudi2->virt_msix_db_dma_addr, prop->pmmu.page_size, true);
11232 if (rc)
11233 dev_err(hdev->dev, "Failed to map VA %#llx for virtual MSI-X doorbell memory\n",
11234 RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START);
11235
11236 return rc;
11237 }
11238
gaudi2_unmap_virtual_msix_doorbell_memory(struct hl_ctx * ctx)11239 static void gaudi2_unmap_virtual_msix_doorbell_memory(struct hl_ctx *ctx)
11240 {
11241 struct hl_device *hdev = ctx->hdev;
11242 struct asic_fixed_properties *prop = &hdev->asic_prop;
11243 int rc;
11244
11245 rc = hl_mmu_unmap_page(ctx, RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START,
11246 prop->pmmu.page_size, true);
11247 if (rc)
11248 dev_err(hdev->dev, "Failed to unmap VA %#llx of virtual MSI-X doorbell memory\n",
11249 RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START);
11250 }
11251
gaudi2_ctx_init(struct hl_ctx * ctx)11252 static int gaudi2_ctx_init(struct hl_ctx *ctx)
11253 {
11254 int rc;
11255
11256 if (ctx->asid == HL_KERNEL_ASID_ID)
11257 return 0;
11258
11259 rc = gaudi2_mmu_prepare(ctx->hdev, ctx->asid);
11260 if (rc)
11261 return rc;
11262
11263 /* No need to clear user registers if the device has just
11264 * performed reset, we restore only nic qm registers
11265 */
11266 if (ctx->hdev->reset_upon_device_release)
11267 gaudi2_restore_nic_qm_registers(ctx->hdev);
11268 else
11269 gaudi2_restore_user_registers(ctx->hdev);
11270
11271 rc = gaudi2_internal_cb_pool_init(ctx->hdev, ctx);
11272 if (rc)
11273 return rc;
11274
11275 rc = gaudi2_map_virtual_msix_doorbell_memory(ctx);
11276 if (rc)
11277 gaudi2_internal_cb_pool_fini(ctx->hdev, ctx);
11278
11279 return rc;
11280 }
11281
gaudi2_ctx_fini(struct hl_ctx * ctx)11282 static void gaudi2_ctx_fini(struct hl_ctx *ctx)
11283 {
11284 if (ctx->asid == HL_KERNEL_ASID_ID)
11285 return;
11286
11287 gaudi2_internal_cb_pool_fini(ctx->hdev, ctx);
11288
11289 gaudi2_unmap_virtual_msix_doorbell_memory(ctx);
11290 }
11291
gaudi2_pre_schedule_cs(struct hl_cs * cs)11292 static int gaudi2_pre_schedule_cs(struct hl_cs *cs)
11293 {
11294 struct hl_device *hdev = cs->ctx->hdev;
11295 int index = cs->sequence & (hdev->asic_prop.max_pending_cs - 1);
11296 u32 mon_payload, sob_id, mon_id;
11297
11298 if (!cs_needs_completion(cs))
11299 return 0;
11300
11301 /*
11302 * First 64 SOB/MON are reserved for driver for QMAN auto completion
11303 * mechanism. Each SOB/MON pair are used for a pending CS with the same
11304 * cyclic index. The SOB value is increased when each of the CS jobs is
11305 * completed. When the SOB reaches the number of CS jobs, the monitor
11306 * generates MSI-X interrupt.
11307 */
11308
11309 sob_id = mon_id = index;
11310 mon_payload = (1 << CQ_ENTRY_SHADOW_INDEX_VALID_SHIFT) |
11311 (1 << CQ_ENTRY_READY_SHIFT) | index;
11312
11313 gaudi2_arm_cq_monitor(hdev, sob_id, mon_id, GAUDI2_RESERVED_CQ_CS_COMPLETION, mon_payload,
11314 cs->jobs_cnt);
11315
11316 return 0;
11317 }
11318
gaudi2_get_queue_id_for_cq(struct hl_device * hdev,u32 cq_idx)11319 static u32 gaudi2_get_queue_id_for_cq(struct hl_device *hdev, u32 cq_idx)
11320 {
11321 return HL_INVALID_QUEUE;
11322 }
11323
gaudi2_gen_signal_cb(struct hl_device * hdev,void * data,u16 sob_id,u32 size,bool eb)11324 static u32 gaudi2_gen_signal_cb(struct hl_device *hdev, void *data, u16 sob_id, u32 size, bool eb)
11325 {
11326 struct hl_cb *cb = data;
11327 struct packet_msg_short *pkt;
11328 u32 value, ctl, pkt_size = sizeof(*pkt);
11329
11330 pkt = (struct packet_msg_short *) (uintptr_t) (cb->kernel_address + size);
11331 memset(pkt, 0, pkt_size);
11332
11333 /* Inc by 1, Mode ADD */
11334 value = FIELD_PREP(GAUDI2_PKT_SHORT_VAL_SOB_SYNC_VAL_MASK, 1);
11335 value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_SOB_MOD_MASK, 1);
11336
11337 ctl = FIELD_PREP(GAUDI2_PKT_SHORT_CTL_ADDR_MASK, sob_id * 4);
11338 ctl |= FIELD_PREP(GAUDI2_PKT_SHORT_CTL_BASE_MASK, 1); /* SOB base */
11339 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_MSG_SHORT);
11340 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, eb);
11341 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 1);
11342
11343 pkt->value = cpu_to_le32(value);
11344 pkt->ctl = cpu_to_le32(ctl);
11345
11346 return size + pkt_size;
11347 }
11348
gaudi2_add_mon_msg_short(struct packet_msg_short * pkt,u32 value,u16 addr)11349 static u32 gaudi2_add_mon_msg_short(struct packet_msg_short *pkt, u32 value, u16 addr)
11350 {
11351 u32 ctl, pkt_size = sizeof(*pkt);
11352
11353 memset(pkt, 0, pkt_size);
11354
11355 ctl = FIELD_PREP(GAUDI2_PKT_SHORT_CTL_ADDR_MASK, addr);
11356 ctl |= FIELD_PREP(GAUDI2_PKT_SHORT_CTL_BASE_MASK, 0); /* MON base */
11357 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_MSG_SHORT);
11358 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, 0);
11359 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 0);
11360
11361 pkt->value = cpu_to_le32(value);
11362 pkt->ctl = cpu_to_le32(ctl);
11363
11364 return pkt_size;
11365 }
11366
gaudi2_add_arm_monitor_pkt(struct hl_device * hdev,struct packet_msg_short * pkt,u16 sob_base,u8 sob_mask,u16 sob_val,u16 addr)11367 static u32 gaudi2_add_arm_monitor_pkt(struct hl_device *hdev, struct packet_msg_short *pkt,
11368 u16 sob_base, u8 sob_mask, u16 sob_val, u16 addr)
11369 {
11370 u32 ctl, value, pkt_size = sizeof(*pkt);
11371 u8 mask;
11372
11373 if (hl_gen_sob_mask(sob_base, sob_mask, &mask)) {
11374 dev_err(hdev->dev, "sob_base %u (mask %#x) is not valid\n", sob_base, sob_mask);
11375 return 0;
11376 }
11377
11378 memset(pkt, 0, pkt_size);
11379
11380 value = FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_SYNC_GID_MASK, sob_base / 8);
11381 value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_SYNC_VAL_MASK, sob_val);
11382 value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_MODE_MASK, 0); /* GREATER OR EQUAL*/
11383 value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_MASK_MASK, mask);
11384
11385 ctl = FIELD_PREP(GAUDI2_PKT_SHORT_CTL_ADDR_MASK, addr);
11386 ctl |= FIELD_PREP(GAUDI2_PKT_SHORT_CTL_BASE_MASK, 0); /* MON base */
11387 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_MSG_SHORT);
11388 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, 0);
11389 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 1);
11390
11391 pkt->value = cpu_to_le32(value);
11392 pkt->ctl = cpu_to_le32(ctl);
11393
11394 return pkt_size;
11395 }
11396
gaudi2_add_fence_pkt(struct packet_fence * pkt)11397 static u32 gaudi2_add_fence_pkt(struct packet_fence *pkt)
11398 {
11399 u32 ctl, cfg, pkt_size = sizeof(*pkt);
11400
11401 memset(pkt, 0, pkt_size);
11402
11403 cfg = FIELD_PREP(GAUDI2_PKT_FENCE_CFG_DEC_VAL_MASK, 1);
11404 cfg |= FIELD_PREP(GAUDI2_PKT_FENCE_CFG_TARGET_VAL_MASK, 1);
11405 cfg |= FIELD_PREP(GAUDI2_PKT_FENCE_CFG_ID_MASK, 2);
11406
11407 ctl = FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_FENCE);
11408 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, 0);
11409 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 1);
11410
11411 pkt->cfg = cpu_to_le32(cfg);
11412 pkt->ctl = cpu_to_le32(ctl);
11413
11414 return pkt_size;
11415 }
11416
gaudi2_gen_wait_cb(struct hl_device * hdev,struct hl_gen_wait_properties * prop)11417 static u32 gaudi2_gen_wait_cb(struct hl_device *hdev, struct hl_gen_wait_properties *prop)
11418 {
11419 struct hl_cb *cb = prop->data;
11420 void *buf = (void *) (uintptr_t) (cb->kernel_address);
11421
11422 u64 monitor_base, fence_addr = 0;
11423 u32 stream_index, size = prop->size;
11424 u16 msg_addr_offset;
11425
11426 stream_index = prop->q_idx % 4;
11427 fence_addr = CFG_BASE + gaudi2_qm_blocks_bases[prop->q_idx] +
11428 QM_FENCE2_OFFSET + stream_index * 4;
11429
11430 /*
11431 * monitor_base should be the content of the base0 address registers,
11432 * so it will be added to the msg short offsets
11433 */
11434 monitor_base = mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0;
11435
11436 /* First monitor config packet: low address of the sync */
11437 msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + prop->mon_id * 4) -
11438 monitor_base;
11439
11440 size += gaudi2_add_mon_msg_short(buf + size, (u32) fence_addr, msg_addr_offset);
11441
11442 /* Second monitor config packet: high address of the sync */
11443 msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + prop->mon_id * 4) -
11444 monitor_base;
11445
11446 size += gaudi2_add_mon_msg_short(buf + size, (u32) (fence_addr >> 32), msg_addr_offset);
11447
11448 /*
11449 * Third monitor config packet: the payload, i.e. what to write when the
11450 * sync triggers
11451 */
11452 msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + prop->mon_id * 4) -
11453 monitor_base;
11454
11455 size += gaudi2_add_mon_msg_short(buf + size, 1, msg_addr_offset);
11456
11457 /* Fourth monitor config packet: bind the monitor to a sync object */
11458 msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + prop->mon_id * 4) - monitor_base;
11459
11460 size += gaudi2_add_arm_monitor_pkt(hdev, buf + size, prop->sob_base, prop->sob_mask,
11461 prop->sob_val, msg_addr_offset);
11462
11463 /* Fence packet */
11464 size += gaudi2_add_fence_pkt(buf + size);
11465
11466 return size;
11467 }
11468
gaudi2_reset_sob(struct hl_device * hdev,void * data)11469 static void gaudi2_reset_sob(struct hl_device *hdev, void *data)
11470 {
11471 struct hl_hw_sob *hw_sob = data;
11472
11473 dev_dbg(hdev->dev, "reset SOB, q_idx: %d, sob_id: %d\n", hw_sob->q_idx, hw_sob->sob_id);
11474
11475 WREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + hw_sob->sob_id * 4, 0);
11476
11477 kref_init(&hw_sob->kref);
11478 }
11479
gaudi2_reset_sob_group(struct hl_device * hdev,u16 sob_group)11480 static void gaudi2_reset_sob_group(struct hl_device *hdev, u16 sob_group)
11481 {
11482 }
11483
gaudi2_get_device_time(struct hl_device * hdev)11484 static u64 gaudi2_get_device_time(struct hl_device *hdev)
11485 {
11486 u64 device_time = ((u64) RREG32(mmPSOC_TIMESTAMP_CNTCVU)) << 32;
11487
11488 return device_time | RREG32(mmPSOC_TIMESTAMP_CNTCVL);
11489 }
11490
gaudi2_collective_wait_init_cs(struct hl_cs * cs)11491 static int gaudi2_collective_wait_init_cs(struct hl_cs *cs)
11492 {
11493 return 0;
11494 }
11495
gaudi2_collective_wait_create_jobs(struct hl_device * hdev,struct hl_ctx * ctx,struct hl_cs * cs,u32 wait_queue_id,u32 collective_engine_id,u32 encaps_signal_offset)11496 static int gaudi2_collective_wait_create_jobs(struct hl_device *hdev, struct hl_ctx *ctx,
11497 struct hl_cs *cs, u32 wait_queue_id,
11498 u32 collective_engine_id, u32 encaps_signal_offset)
11499 {
11500 return -EINVAL;
11501 }
11502
11503 /*
11504 * hl_mmu_scramble - converts a dram (non power of 2) page-size aligned address
11505 * to DMMU page-size address (64MB) before mapping it in
11506 * the MMU.
11507 * The operation is performed on both the virtual and physical addresses.
11508 * for device with 6 HBMs the scramble is:
11509 * (addr[47:0] / 48M) * 64M + addr % 48M + addr[63:48]
11510 *
11511 * Example:
11512 * =============================================================================
11513 * Allocated DRAM Reserved VA scrambled VA for MMU mapping Scrambled PA
11514 * Phys address in MMU last
11515 * HOP
11516 * =============================================================================
11517 * PA1 0x3000000 VA1 0x9C000000 SVA1= (VA1/48M)*64M 0xD0000000 <- PA1/48M 0x1
11518 * PA2 0x9000000 VA2 0x9F000000 SVA2= (VA2/48M)*64M 0xD4000000 <- PA2/48M 0x3
11519 * =============================================================================
11520 */
gaudi2_mmu_scramble_addr(struct hl_device * hdev,u64 raw_addr)11521 static u64 gaudi2_mmu_scramble_addr(struct hl_device *hdev, u64 raw_addr)
11522 {
11523 struct asic_fixed_properties *prop = &hdev->asic_prop;
11524 u32 divisor, mod_va;
11525 u64 div_va;
11526
11527 /* accept any address in the DRAM address space */
11528 if (hl_mem_area_inside_range(raw_addr, sizeof(raw_addr), DRAM_PHYS_BASE,
11529 VA_HBM_SPACE_END)) {
11530
11531 divisor = prop->num_functional_hbms * GAUDI2_HBM_MMU_SCRM_MEM_SIZE;
11532 div_va = div_u64_rem(raw_addr & GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK, divisor, &mod_va);
11533 return (raw_addr & ~GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK) |
11534 (div_va << GAUDI2_HBM_MMU_SCRM_DIV_SHIFT) |
11535 (mod_va << GAUDI2_HBM_MMU_SCRM_MOD_SHIFT);
11536 }
11537
11538 return raw_addr;
11539 }
11540
gaudi2_mmu_descramble_addr(struct hl_device * hdev,u64 scrambled_addr)11541 static u64 gaudi2_mmu_descramble_addr(struct hl_device *hdev, u64 scrambled_addr)
11542 {
11543 struct asic_fixed_properties *prop = &hdev->asic_prop;
11544 u32 divisor, mod_va;
11545 u64 div_va;
11546
11547 /* accept any address in the DRAM address space */
11548 if (hl_mem_area_inside_range(scrambled_addr, sizeof(scrambled_addr), DRAM_PHYS_BASE,
11549 VA_HBM_SPACE_END)) {
11550
11551 divisor = prop->num_functional_hbms * GAUDI2_HBM_MMU_SCRM_MEM_SIZE;
11552 div_va = div_u64_rem(scrambled_addr & GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK,
11553 PAGE_SIZE_64MB, &mod_va);
11554
11555 return ((scrambled_addr & ~GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK) +
11556 (div_va * divisor + mod_va));
11557 }
11558
11559 return scrambled_addr;
11560 }
11561
gaudi2_get_dec_base_addr(struct hl_device * hdev,u32 core_id)11562 static u32 gaudi2_get_dec_base_addr(struct hl_device *hdev, u32 core_id)
11563 {
11564 u32 base = 0, dcore_id, dec_id;
11565
11566 if (core_id >= NUMBER_OF_DEC) {
11567 dev_err(hdev->dev, "Unexpected core number %d for DEC\n", core_id);
11568 goto out;
11569 }
11570
11571 if (core_id < 8) {
11572 dcore_id = core_id / NUM_OF_DEC_PER_DCORE;
11573 dec_id = core_id % NUM_OF_DEC_PER_DCORE;
11574
11575 base = mmDCORE0_DEC0_CMD_BASE + dcore_id * DCORE_OFFSET +
11576 dec_id * DCORE_VDEC_OFFSET;
11577 } else {
11578 /* PCIe Shared Decoder */
11579 base = mmPCIE_DEC0_CMD_BASE + ((core_id % 8) * PCIE_VDEC_OFFSET);
11580 }
11581 out:
11582 return base;
11583 }
11584
gaudi2_get_hw_block_id(struct hl_device * hdev,u64 block_addr,u32 * block_size,u32 * block_id)11585 static int gaudi2_get_hw_block_id(struct hl_device *hdev, u64 block_addr,
11586 u32 *block_size, u32 *block_id)
11587 {
11588 struct gaudi2_device *gaudi2 = hdev->asic_specific;
11589 int i;
11590
11591 for (i = 0 ; i < NUM_USER_MAPPED_BLOCKS ; i++) {
11592 if (block_addr == CFG_BASE + gaudi2->mapped_blocks[i].address) {
11593 *block_id = i;
11594 if (block_size)
11595 *block_size = gaudi2->mapped_blocks[i].size;
11596 return 0;
11597 }
11598 }
11599
11600 dev_err(hdev->dev, "Invalid block address %#llx", block_addr);
11601
11602 return -EINVAL;
11603 }
11604
gaudi2_block_mmap(struct hl_device * hdev,struct vm_area_struct * vma,u32 block_id,u32 block_size)11605 static int gaudi2_block_mmap(struct hl_device *hdev, struct vm_area_struct *vma,
11606 u32 block_id, u32 block_size)
11607 {
11608 struct gaudi2_device *gaudi2 = hdev->asic_specific;
11609 u64 offset_in_bar;
11610 u64 address;
11611 int rc;
11612
11613 if (block_id >= NUM_USER_MAPPED_BLOCKS) {
11614 dev_err(hdev->dev, "Invalid block id %u", block_id);
11615 return -EINVAL;
11616 }
11617
11618 /* we allow mapping only an entire block */
11619 if (block_size != gaudi2->mapped_blocks[block_id].size) {
11620 dev_err(hdev->dev, "Invalid block size %u", block_size);
11621 return -EINVAL;
11622 }
11623
11624 offset_in_bar = CFG_BASE + gaudi2->mapped_blocks[block_id].address - STM_FLASH_BASE_ADDR;
11625
11626 address = pci_resource_start(hdev->pdev, SRAM_CFG_BAR_ID) + offset_in_bar;
11627
11628 vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
11629 VM_DONTCOPY | VM_NORESERVE);
11630
11631 rc = remap_pfn_range(vma, vma->vm_start, address >> PAGE_SHIFT,
11632 block_size, vma->vm_page_prot);
11633 if (rc)
11634 dev_err(hdev->dev, "remap_pfn_range error %d", rc);
11635
11636 return rc;
11637 }
11638
gaudi2_enable_events_from_fw(struct hl_device * hdev)11639 static void gaudi2_enable_events_from_fw(struct hl_device *hdev)
11640 {
11641 struct gaudi2_device *gaudi2 = hdev->asic_specific;
11642
11643 struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
11644 u32 irq_handler_offset = le32_to_cpu(dyn_regs->gic_host_ints_irq);
11645
11646 if (gaudi2->hw_cap_initialized & HW_CAP_CPU_Q)
11647 WREG32(irq_handler_offset,
11648 gaudi2_irq_map_table[GAUDI2_EVENT_CPU_INTS_REGISTER].cpu_id);
11649 }
11650
gaudi2_get_mmu_base(struct hl_device * hdev,u64 mmu_id,u32 * mmu_base)11651 static int gaudi2_get_mmu_base(struct hl_device *hdev, u64 mmu_id, u32 *mmu_base)
11652 {
11653 switch (mmu_id) {
11654 case HW_CAP_DCORE0_DMMU0:
11655 *mmu_base = mmDCORE0_HMMU0_MMU_BASE;
11656 break;
11657 case HW_CAP_DCORE0_DMMU1:
11658 *mmu_base = mmDCORE0_HMMU1_MMU_BASE;
11659 break;
11660 case HW_CAP_DCORE0_DMMU2:
11661 *mmu_base = mmDCORE0_HMMU2_MMU_BASE;
11662 break;
11663 case HW_CAP_DCORE0_DMMU3:
11664 *mmu_base = mmDCORE0_HMMU3_MMU_BASE;
11665 break;
11666 case HW_CAP_DCORE1_DMMU0:
11667 *mmu_base = mmDCORE1_HMMU0_MMU_BASE;
11668 break;
11669 case HW_CAP_DCORE1_DMMU1:
11670 *mmu_base = mmDCORE1_HMMU1_MMU_BASE;
11671 break;
11672 case HW_CAP_DCORE1_DMMU2:
11673 *mmu_base = mmDCORE1_HMMU2_MMU_BASE;
11674 break;
11675 case HW_CAP_DCORE1_DMMU3:
11676 *mmu_base = mmDCORE1_HMMU3_MMU_BASE;
11677 break;
11678 case HW_CAP_DCORE2_DMMU0:
11679 *mmu_base = mmDCORE2_HMMU0_MMU_BASE;
11680 break;
11681 case HW_CAP_DCORE2_DMMU1:
11682 *mmu_base = mmDCORE2_HMMU1_MMU_BASE;
11683 break;
11684 case HW_CAP_DCORE2_DMMU2:
11685 *mmu_base = mmDCORE2_HMMU2_MMU_BASE;
11686 break;
11687 case HW_CAP_DCORE2_DMMU3:
11688 *mmu_base = mmDCORE2_HMMU3_MMU_BASE;
11689 break;
11690 case HW_CAP_DCORE3_DMMU0:
11691 *mmu_base = mmDCORE3_HMMU0_MMU_BASE;
11692 break;
11693 case HW_CAP_DCORE3_DMMU1:
11694 *mmu_base = mmDCORE3_HMMU1_MMU_BASE;
11695 break;
11696 case HW_CAP_DCORE3_DMMU2:
11697 *mmu_base = mmDCORE3_HMMU2_MMU_BASE;
11698 break;
11699 case HW_CAP_DCORE3_DMMU3:
11700 *mmu_base = mmDCORE3_HMMU3_MMU_BASE;
11701 break;
11702 case HW_CAP_PMMU:
11703 *mmu_base = mmPMMU_HBW_MMU_BASE;
11704 break;
11705 default:
11706 return -EINVAL;
11707 }
11708
11709 return 0;
11710 }
11711
gaudi2_ack_mmu_error(struct hl_device * hdev,u64 mmu_id)11712 static void gaudi2_ack_mmu_error(struct hl_device *hdev, u64 mmu_id)
11713 {
11714 bool is_pmmu = (mmu_id == HW_CAP_PMMU);
11715 struct gaudi2_device *gaudi2 = hdev->asic_specific;
11716 u32 mmu_base;
11717
11718 if (!(gaudi2->hw_cap_initialized & mmu_id))
11719 return;
11720
11721 if (gaudi2_get_mmu_base(hdev, mmu_id, &mmu_base))
11722 return;
11723
11724 gaudi2_handle_page_error(hdev, mmu_base, is_pmmu, NULL);
11725 gaudi2_handle_access_error(hdev, mmu_base, is_pmmu);
11726 }
11727
gaudi2_ack_mmu_page_fault_or_access_error(struct hl_device * hdev,u64 mmu_cap_mask)11728 static int gaudi2_ack_mmu_page_fault_or_access_error(struct hl_device *hdev, u64 mmu_cap_mask)
11729 {
11730 u32 i, mmu_id, num_of_hmmus = NUM_OF_HMMU_PER_DCORE * NUM_OF_DCORES;
11731
11732 /* check all HMMUs */
11733 for (i = 0 ; i < num_of_hmmus ; i++) {
11734 mmu_id = HW_CAP_DCORE0_DMMU0 << i;
11735
11736 if (mmu_cap_mask & mmu_id)
11737 gaudi2_ack_mmu_error(hdev, mmu_id);
11738 }
11739
11740 /* check PMMU */
11741 if (mmu_cap_mask & HW_CAP_PMMU)
11742 gaudi2_ack_mmu_error(hdev, HW_CAP_PMMU);
11743
11744 return 0;
11745 }
11746
gaudi2_get_msi_info(__le32 * table)11747 static void gaudi2_get_msi_info(__le32 *table)
11748 {
11749 table[CPUCP_EVENT_QUEUE_MSI_TYPE] = cpu_to_le32(GAUDI2_EVENT_QUEUE_MSIX_IDX);
11750 table[CPUCP_EVENT_QUEUE_ERR_MSI_TYPE] = cpu_to_le32(GAUDI2_IRQ_NUM_EQ_ERROR);
11751 }
11752
gaudi2_map_pll_idx_to_fw_idx(u32 pll_idx)11753 static int gaudi2_map_pll_idx_to_fw_idx(u32 pll_idx)
11754 {
11755 switch (pll_idx) {
11756 case HL_GAUDI2_CPU_PLL: return CPU_PLL;
11757 case HL_GAUDI2_PCI_PLL: return PCI_PLL;
11758 case HL_GAUDI2_NIC_PLL: return NIC_PLL;
11759 case HL_GAUDI2_DMA_PLL: return DMA_PLL;
11760 case HL_GAUDI2_MESH_PLL: return MESH_PLL;
11761 case HL_GAUDI2_MME_PLL: return MME_PLL;
11762 case HL_GAUDI2_TPC_PLL: return TPC_PLL;
11763 case HL_GAUDI2_IF_PLL: return IF_PLL;
11764 case HL_GAUDI2_SRAM_PLL: return SRAM_PLL;
11765 case HL_GAUDI2_HBM_PLL: return HBM_PLL;
11766 case HL_GAUDI2_VID_PLL: return VID_PLL;
11767 case HL_GAUDI2_MSS_PLL: return MSS_PLL;
11768 default: return -EINVAL;
11769 }
11770 }
11771
gaudi2_gen_sync_to_engine_map(struct hl_device * hdev,struct hl_sync_to_engine_map * map)11772 static int gaudi2_gen_sync_to_engine_map(struct hl_device *hdev, struct hl_sync_to_engine_map *map)
11773 {
11774 /* Not implemented */
11775 return 0;
11776 }
11777
gaudi2_monitor_valid(struct hl_mon_state_dump * mon)11778 static int gaudi2_monitor_valid(struct hl_mon_state_dump *mon)
11779 {
11780 /* Not implemented */
11781 return 0;
11782 }
11783
gaudi2_print_single_monitor(char ** buf,size_t * size,size_t * offset,struct hl_device * hdev,struct hl_mon_state_dump * mon)11784 static int gaudi2_print_single_monitor(char **buf, size_t *size, size_t *offset,
11785 struct hl_device *hdev, struct hl_mon_state_dump *mon)
11786 {
11787 /* Not implemented */
11788 return 0;
11789 }
11790
11791
gaudi2_print_fences_single_engine(struct hl_device * hdev,u64 base_offset,u64 status_base_offset,enum hl_sync_engine_type engine_type,u32 engine_id,char ** buf,size_t * size,size_t * offset)11792 static int gaudi2_print_fences_single_engine(struct hl_device *hdev, u64 base_offset,
11793 u64 status_base_offset, enum hl_sync_engine_type engine_type,
11794 u32 engine_id, char **buf, size_t *size, size_t *offset)
11795 {
11796 /* Not implemented */
11797 return 0;
11798 }
11799
11800
11801 static struct hl_state_dump_specs_funcs gaudi2_state_dump_funcs = {
11802 .monitor_valid = gaudi2_monitor_valid,
11803 .print_single_monitor = gaudi2_print_single_monitor,
11804 .gen_sync_to_engine_map = gaudi2_gen_sync_to_engine_map,
11805 .print_fences_single_engine = gaudi2_print_fences_single_engine,
11806 };
11807
gaudi2_state_dump_init(struct hl_device * hdev)11808 static void gaudi2_state_dump_init(struct hl_device *hdev)
11809 {
11810 /* Not implemented */
11811 hdev->state_dump_specs.props = gaudi2_state_dump_specs_props;
11812 hdev->state_dump_specs.funcs = gaudi2_state_dump_funcs;
11813 }
11814
gaudi2_get_sob_addr(struct hl_device * hdev,u32 sob_id)11815 static u32 gaudi2_get_sob_addr(struct hl_device *hdev, u32 sob_id)
11816 {
11817 return 0;
11818 }
11819
gaudi2_get_stream_master_qid_arr(void)11820 static u32 *gaudi2_get_stream_master_qid_arr(void)
11821 {
11822 return NULL;
11823 }
11824
gaudi2_add_device_attr(struct hl_device * hdev,struct attribute_group * dev_clk_attr_grp,struct attribute_group * dev_vrm_attr_grp)11825 static void gaudi2_add_device_attr(struct hl_device *hdev, struct attribute_group *dev_clk_attr_grp,
11826 struct attribute_group *dev_vrm_attr_grp)
11827 {
11828 hl_sysfs_add_dev_clk_attr(hdev, dev_clk_attr_grp);
11829 hl_sysfs_add_dev_vrm_attr(hdev, dev_vrm_attr_grp);
11830 }
11831
gaudi2_mmu_get_real_page_size(struct hl_device * hdev,struct hl_mmu_properties * mmu_prop,u32 page_size,u32 * real_page_size,bool is_dram_addr)11832 static int gaudi2_mmu_get_real_page_size(struct hl_device *hdev, struct hl_mmu_properties *mmu_prop,
11833 u32 page_size, u32 *real_page_size, bool is_dram_addr)
11834 {
11835 struct asic_fixed_properties *prop = &hdev->asic_prop;
11836
11837 /* for host pages the page size must be */
11838 if (!is_dram_addr) {
11839 if (page_size % mmu_prop->page_size)
11840 goto page_size_err;
11841
11842 *real_page_size = mmu_prop->page_size;
11843 return 0;
11844 }
11845
11846 if ((page_size % prop->dram_page_size) || (prop->dram_page_size > mmu_prop->page_size))
11847 goto page_size_err;
11848
11849 /*
11850 * MMU page size is different from DRAM page size (more precisely, DMMU page is greater
11851 * than DRAM page size).
11852 * for this reason work with the DRAM page size and let the MMU scrambling routine handle
11853 * this mismatch when calculating the address to place in the MMU page table.
11854 * (in that case also make sure that the dram_page_size is not greater than the
11855 * mmu page size)
11856 */
11857 *real_page_size = prop->dram_page_size;
11858
11859 return 0;
11860
11861 page_size_err:
11862 dev_err(hdev->dev, "page size of 0x%X is not 0x%X aligned, can't map\n",
11863 page_size, mmu_prop->page_size >> 10);
11864 return -EFAULT;
11865 }
11866
gaudi2_get_monitor_dump(struct hl_device * hdev,void * data)11867 static int gaudi2_get_monitor_dump(struct hl_device *hdev, void *data)
11868 {
11869 return -EOPNOTSUPP;
11870 }
11871
gaudi2_send_device_activity(struct hl_device * hdev,bool open)11872 int gaudi2_send_device_activity(struct hl_device *hdev, bool open)
11873 {
11874 struct gaudi2_device *gaudi2 = hdev->asic_specific;
11875
11876 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))
11877 return 0;
11878
11879 return hl_fw_send_device_activity(hdev, open);
11880 }
11881
gaudi2_read_pte(struct hl_device * hdev,u64 addr)11882 static u64 gaudi2_read_pte(struct hl_device *hdev, u64 addr)
11883 {
11884 struct gaudi2_device *gaudi2 = hdev->asic_specific;
11885 u64 val;
11886
11887 if (hdev->reset_info.hard_reset_pending)
11888 return U64_MAX;
11889
11890 val = readq(hdev->pcie_bar[DRAM_BAR_ID] + (addr - gaudi2->dram_bar_cur_addr));
11891
11892 return val;
11893 }
11894
gaudi2_write_pte(struct hl_device * hdev,u64 addr,u64 val)11895 static void gaudi2_write_pte(struct hl_device *hdev, u64 addr, u64 val)
11896 {
11897 struct gaudi2_device *gaudi2 = hdev->asic_specific;
11898
11899 if (hdev->reset_info.hard_reset_pending)
11900 return;
11901
11902 writeq(val, hdev->pcie_bar[DRAM_BAR_ID] + (addr - gaudi2->dram_bar_cur_addr));
11903 }
11904
11905 static const struct hl_asic_funcs gaudi2_funcs = {
11906 .early_init = gaudi2_early_init,
11907 .early_fini = gaudi2_early_fini,
11908 .late_init = gaudi2_late_init,
11909 .late_fini = gaudi2_late_fini,
11910 .sw_init = gaudi2_sw_init,
11911 .sw_fini = gaudi2_sw_fini,
11912 .hw_init = gaudi2_hw_init,
11913 .hw_fini = gaudi2_hw_fini,
11914 .halt_engines = gaudi2_halt_engines,
11915 .suspend = gaudi2_suspend,
11916 .resume = gaudi2_resume,
11917 .mmap = gaudi2_mmap,
11918 .ring_doorbell = gaudi2_ring_doorbell,
11919 .pqe_write = gaudi2_pqe_write,
11920 .asic_dma_alloc_coherent = gaudi2_dma_alloc_coherent,
11921 .asic_dma_free_coherent = gaudi2_dma_free_coherent,
11922 .scrub_device_mem = gaudi2_scrub_device_mem,
11923 .scrub_device_dram = gaudi2_scrub_device_dram,
11924 .get_int_queue_base = NULL,
11925 .test_queues = gaudi2_test_queues,
11926 .asic_dma_pool_zalloc = gaudi2_dma_pool_zalloc,
11927 .asic_dma_pool_free = gaudi2_dma_pool_free,
11928 .cpu_accessible_dma_pool_alloc = gaudi2_cpu_accessible_dma_pool_alloc,
11929 .cpu_accessible_dma_pool_free = gaudi2_cpu_accessible_dma_pool_free,
11930 .dma_unmap_sgtable = hl_asic_dma_unmap_sgtable,
11931 .cs_parser = gaudi2_cs_parser,
11932 .dma_map_sgtable = hl_asic_dma_map_sgtable,
11933 .add_end_of_cb_packets = NULL,
11934 .update_eq_ci = gaudi2_update_eq_ci,
11935 .context_switch = gaudi2_context_switch,
11936 .restore_phase_topology = gaudi2_restore_phase_topology,
11937 .debugfs_read_dma = gaudi2_debugfs_read_dma,
11938 .add_device_attr = gaudi2_add_device_attr,
11939 .handle_eqe = gaudi2_handle_eqe,
11940 .get_events_stat = gaudi2_get_events_stat,
11941 .read_pte = gaudi2_read_pte,
11942 .write_pte = gaudi2_write_pte,
11943 .mmu_invalidate_cache = gaudi2_mmu_invalidate_cache,
11944 .mmu_invalidate_cache_range = gaudi2_mmu_invalidate_cache_range,
11945 .mmu_prefetch_cache_range = NULL,
11946 .send_heartbeat = gaudi2_send_heartbeat,
11947 .debug_coresight = gaudi2_debug_coresight,
11948 .is_device_idle = gaudi2_is_device_idle,
11949 .compute_reset_late_init = gaudi2_compute_reset_late_init,
11950 .hw_queues_lock = gaudi2_hw_queues_lock,
11951 .hw_queues_unlock = gaudi2_hw_queues_unlock,
11952 .get_pci_id = gaudi2_get_pci_id,
11953 .get_eeprom_data = gaudi2_get_eeprom_data,
11954 .get_monitor_dump = gaudi2_get_monitor_dump,
11955 .send_cpu_message = gaudi2_send_cpu_message,
11956 .pci_bars_map = gaudi2_pci_bars_map,
11957 .init_iatu = gaudi2_init_iatu,
11958 .rreg = hl_rreg,
11959 .wreg = hl_wreg,
11960 .halt_coresight = gaudi2_halt_coresight,
11961 .ctx_init = gaudi2_ctx_init,
11962 .ctx_fini = gaudi2_ctx_fini,
11963 .pre_schedule_cs = gaudi2_pre_schedule_cs,
11964 .get_queue_id_for_cq = gaudi2_get_queue_id_for_cq,
11965 .load_firmware_to_device = NULL,
11966 .load_boot_fit_to_device = NULL,
11967 .get_signal_cb_size = gaudi2_get_signal_cb_size,
11968 .get_wait_cb_size = gaudi2_get_wait_cb_size,
11969 .gen_signal_cb = gaudi2_gen_signal_cb,
11970 .gen_wait_cb = gaudi2_gen_wait_cb,
11971 .reset_sob = gaudi2_reset_sob,
11972 .reset_sob_group = gaudi2_reset_sob_group,
11973 .get_device_time = gaudi2_get_device_time,
11974 .pb_print_security_errors = gaudi2_pb_print_security_errors,
11975 .collective_wait_init_cs = gaudi2_collective_wait_init_cs,
11976 .collective_wait_create_jobs = gaudi2_collective_wait_create_jobs,
11977 .get_dec_base_addr = gaudi2_get_dec_base_addr,
11978 .scramble_addr = gaudi2_mmu_scramble_addr,
11979 .descramble_addr = gaudi2_mmu_descramble_addr,
11980 .ack_protection_bits_errors = gaudi2_ack_protection_bits_errors,
11981 .get_hw_block_id = gaudi2_get_hw_block_id,
11982 .hw_block_mmap = gaudi2_block_mmap,
11983 .enable_events_from_fw = gaudi2_enable_events_from_fw,
11984 .ack_mmu_errors = gaudi2_ack_mmu_page_fault_or_access_error,
11985 .get_msi_info = gaudi2_get_msi_info,
11986 .map_pll_idx_to_fw_idx = gaudi2_map_pll_idx_to_fw_idx,
11987 .init_firmware_preload_params = gaudi2_init_firmware_preload_params,
11988 .init_firmware_loader = gaudi2_init_firmware_loader,
11989 .init_cpu_scrambler_dram = gaudi2_init_scrambler_hbm,
11990 .state_dump_init = gaudi2_state_dump_init,
11991 .get_sob_addr = &gaudi2_get_sob_addr,
11992 .set_pci_memory_regions = gaudi2_set_pci_memory_regions,
11993 .get_stream_master_qid_arr = gaudi2_get_stream_master_qid_arr,
11994 .check_if_razwi_happened = gaudi2_check_if_razwi_happened,
11995 .mmu_get_real_page_size = gaudi2_mmu_get_real_page_size,
11996 .access_dev_mem = hl_access_dev_mem,
11997 .set_dram_bar_base = gaudi2_set_hbm_bar_base,
11998 .set_engine_cores = gaudi2_set_engine_cores,
11999 .set_engines = gaudi2_set_engines,
12000 .send_device_activity = gaudi2_send_device_activity,
12001 .set_dram_properties = gaudi2_set_dram_properties,
12002 .set_binning_masks = gaudi2_set_binning_masks,
12003 };
12004
gaudi2_set_asic_funcs(struct hl_device * hdev)12005 void gaudi2_set_asic_funcs(struct hl_device *hdev)
12006 {
12007 hdev->asic_funcs = &gaudi2_funcs;
12008 }
12009