xref: /linux/drivers/accel/habanalabs/gaudi2/gaudi2.c (revision 55a42f78ffd386e01a5404419f8c5ded7db70a21)
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 
2568 static void gaudi2_init_scrambler_hbm(struct hl_device *hdev)
2569 {
2570 
2571 }
2572 
2573 static u32 gaudi2_get_signal_cb_size(struct hl_device *hdev)
2574 {
2575 	return sizeof(struct packet_msg_short);
2576 }
2577 
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 
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 
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 
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 
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 
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 
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 = kcalloc(prop->max_queues, sizeof(struct hw_queue_properties),
2766 					GFP_KERNEL);
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 
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 
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 
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 
3069 static enum hl_device_hw_state gaudi2_get_hw_state(struct hl_device *hdev)
3070 {
3071 	return RREG32(mmHW_STATE);
3072 }
3073 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
3702 static void gaudi2_late_fini(struct hl_device *hdev)
3703 {
3704 	hl_hwmon_release_resources(hdev);
3705 }
3706 
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 
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 
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 
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 
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 
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 
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 
3926 static void gaudi2_special_blocks_iterator_free(struct hl_device *hdev)
3927 {
3928 	gaudi2_special_blocks_free(hdev);
3929 }
3930 
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 
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_array(prop->num_of_special_blocks,
3947 			sizeof(*prop->special_blocks), GFP_KERNEL);
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_array(ARRAY_SIZE(gaudi2_iterator_skip_block_types),
3962 					sizeof(gaudi2_iterator_skip_block_types[0]), GFP_KERNEL);
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_array(ARRAY_SIZE(gaudi2_iterator_skip_block_ranges),
3978 					sizeof(gaudi2_iterator_skip_block_ranges[0]), GFP_KERNEL);
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 
4003 static int gaudi2_special_blocks_iterator_config(struct hl_device *hdev)
4004 {
4005 	return gaudi2_special_blocks_config(hdev);
4006 }
4007 
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 
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 
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(sizeof(*gaudi2), GFP_KERNEL);
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 
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 
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 
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 
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  */
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
4570 static void gaudi2_disable_timestamp(struct hl_device *hdev)
4571 {
4572 	/* Disable the timestamp counter */
4573 	WREG32(mmPSOC_TIMESTAMP_BASE, 0);
4574 }
4575 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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  */
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 */
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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  */
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  */
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  */
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 
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 
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 
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 
6827 static int gaudi2_resume(struct hl_device *hdev)
6828 {
6829 	return gaudi2_init_iatu(hdev);
6830 }
6831 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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  */
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 
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 */
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
7882 static u32 gaudi2_get_pci_id(struct hl_device *hdev)
7883 {
7884 	return hdev->pdev->device;
7885 }
7886 
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 
7897 static void gaudi2_update_eq_ci(struct hl_device *hdev, u32 val)
7898 {
7899 	WREG32(mmCPU_IF_EQ_RD_OFFS, val);
7900 }
7901 
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 
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 
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 
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 
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 
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 
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 
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 
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 */
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 
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 
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 
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 
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 
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 
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 
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 
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  */
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 
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 
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 
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 */
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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) */
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 
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 
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 */
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
10983 static int gaudi2_context_switch(struct hl_device *hdev, u32 asid)
10984 {
10985 	return 0;
10986 }
10987 
10988 static void gaudi2_restore_phase_topology(struct hl_device *hdev)
10989 {
10990 }
10991 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
11319 static u32 gaudi2_get_queue_id_for_cq(struct hl_device *hdev, u32 cq_idx)
11320 {
11321 	return HL_INVALID_QUEUE;
11322 }
11323 
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 
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 
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 
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 
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 
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 
11480 static void gaudi2_reset_sob_group(struct hl_device *hdev, u16 sob_group)
11481 {
11482 }
11483 
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 
11491 static int gaudi2_collective_wait_init_cs(struct hl_cs *cs)
11492 {
11493 	return 0;
11494 }
11495 
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  */
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
11778 static int gaudi2_monitor_valid(struct hl_mon_state_dump *mon)
11779 {
11780 	/* Not implemented */
11781 	return 0;
11782 }
11783 
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 
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 
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 
11815 static u32 gaudi2_get_sob_addr(struct hl_device *hdev, u32 sob_id)
11816 {
11817 	return 0;
11818 }
11819 
11820 static u32 *gaudi2_get_stream_master_qid_arr(void)
11821 {
11822 	return NULL;
11823 }
11824 
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 
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 
11867 static int gaudi2_get_monitor_dump(struct hl_device *hdev, void *data)
11868 {
11869 	return -EOPNOTSUPP;
11870 }
11871 
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 
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 
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 
12005 void gaudi2_set_asic_funcs(struct hl_device *hdev)
12006 {
12007 	hdev->asic_funcs = &gaudi2_funcs;
12008 }
12009