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