xref: /linux/drivers/accel/habanalabs/gaudi/gaudi.c (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
1e65e175bSOded Gabbay // SPDX-License-Identifier: GPL-2.0
2e65e175bSOded Gabbay 
3e65e175bSOded Gabbay /*
4e65e175bSOded Gabbay  * Copyright 2016-2022 HabanaLabs, Ltd.
5e65e175bSOded Gabbay  * All Rights Reserved.
6e65e175bSOded Gabbay  */
7e65e175bSOded Gabbay 
8e65e175bSOded Gabbay #include "gaudiP.h"
9e65e175bSOded Gabbay #include "../include/hw_ip/mmu/mmu_general.h"
10e65e175bSOded Gabbay #include "../include/hw_ip/mmu/mmu_v1_1.h"
11e65e175bSOded Gabbay #include "../include/gaudi/gaudi_masks.h"
12e65e175bSOded Gabbay #include "../include/gaudi/gaudi_fw_if.h"
13e65e175bSOded Gabbay #include "../include/gaudi/gaudi_reg_map.h"
14e65e175bSOded Gabbay #include "../include/gaudi/gaudi_async_ids_map_extended.h"
15e65e175bSOded Gabbay 
16e65e175bSOded Gabbay #include <linux/module.h>
17e65e175bSOded Gabbay #include <linux/pci.h>
18e65e175bSOded Gabbay #include <linux/firmware.h>
19e65e175bSOded Gabbay #include <linux/hwmon.h>
20e65e175bSOded Gabbay #include <linux/iommu.h>
21e65e175bSOded Gabbay #include <linux/seq_file.h>
22e65e175bSOded Gabbay 
23e65e175bSOded Gabbay /*
24e65e175bSOded Gabbay  * Gaudi security scheme:
25e65e175bSOded Gabbay  *
26e65e175bSOded Gabbay  * 1. Host is protected by:
27e65e175bSOded Gabbay  *        - Range registers
28e65e175bSOded Gabbay  *        - MMU
29e65e175bSOded Gabbay  *
30e65e175bSOded Gabbay  * 2. DDR is protected by:
31e65e175bSOded Gabbay  *        - Range registers (protect the first 512MB)
32e65e175bSOded Gabbay  *
33e65e175bSOded Gabbay  * 3. Configuration is protected by:
34e65e175bSOded Gabbay  *        - Range registers
35e65e175bSOded Gabbay  *        - Protection bits
36e65e175bSOded Gabbay  *
37e65e175bSOded Gabbay  * MMU is always enabled.
38e65e175bSOded Gabbay  *
39e65e175bSOded Gabbay  * QMAN DMA channels 0,1 (PCI DMAN):
40e65e175bSOded Gabbay  *     - DMA is not secured.
41e65e175bSOded Gabbay  *     - PQ and CQ are secured.
42e65e175bSOded Gabbay  *     - CP is secured: The driver needs to parse CB but WREG should be allowed
43e65e175bSOded Gabbay  *                      because of TDMA (tensor DMA). Hence, WREG is always not
44e65e175bSOded Gabbay  *                      secured.
45e65e175bSOded Gabbay  *
46e65e175bSOded Gabbay  * When the driver needs to use DMA it will check that Gaudi is idle, set DMA
47e65e175bSOded Gabbay  * channel 0 to be secured, execute the DMA and change it back to not secured.
48e65e175bSOded Gabbay  * Currently, the driver doesn't use the DMA while there are compute jobs
49e65e175bSOded Gabbay  * running.
50e65e175bSOded Gabbay  *
51e65e175bSOded Gabbay  * The current use cases for the driver to use the DMA are:
52e65e175bSOded Gabbay  *     - Clear SRAM on context switch (happens on context switch when device is
53e65e175bSOded Gabbay  *       idle)
54e65e175bSOded Gabbay  *     - MMU page tables area clear (happens on init)
55e65e175bSOded Gabbay  *
56e65e175bSOded Gabbay  * QMAN DMA 2-7, TPC, MME, NIC:
57e65e175bSOded Gabbay  * PQ is secured and is located on the Host (HBM CON TPC3 bug)
58e65e175bSOded Gabbay  * CQ, CP and the engine are not secured
59e65e175bSOded Gabbay  *
60e65e175bSOded Gabbay  */
61e65e175bSOded Gabbay 
62e65e175bSOded Gabbay #define GAUDI_BOOT_FIT_FILE	"habanalabs/gaudi/gaudi-boot-fit.itb"
63e65e175bSOded Gabbay #define GAUDI_LINUX_FW_FILE	"habanalabs/gaudi/gaudi-fit.itb"
64e65e175bSOded Gabbay #define GAUDI_TPC_FW_FILE	"habanalabs/gaudi/gaudi_tpc.bin"
65e65e175bSOded Gabbay 
66b03dc2b6SJuerg Haefliger MODULE_FIRMWARE(GAUDI_BOOT_FIT_FILE);
67b03dc2b6SJuerg Haefliger MODULE_FIRMWARE(GAUDI_LINUX_FW_FILE);
68b03dc2b6SJuerg Haefliger MODULE_FIRMWARE(GAUDI_TPC_FW_FILE);
69b03dc2b6SJuerg Haefliger 
70e65e175bSOded Gabbay #define GAUDI_DMA_POOL_BLK_SIZE		0x100 /* 256 bytes */
71e65e175bSOded Gabbay 
72e65e175bSOded Gabbay #define GAUDI_RESET_TIMEOUT_MSEC	2000		/* 2000ms */
73e65e175bSOded Gabbay #define GAUDI_RESET_WAIT_MSEC		1		/* 1ms */
74e65e175bSOded Gabbay #define GAUDI_CPU_RESET_WAIT_MSEC	200		/* 200ms */
75e65e175bSOded Gabbay #define GAUDI_TEST_QUEUE_WAIT_USEC	100000		/* 100ms */
76e65e175bSOded Gabbay 
77e65e175bSOded Gabbay #define GAUDI_PLDM_RESET_WAIT_MSEC	1000		/* 1s */
78e65e175bSOded Gabbay #define GAUDI_PLDM_HRESET_TIMEOUT_MSEC	20000		/* 20s */
79e65e175bSOded Gabbay #define GAUDI_PLDM_TEST_QUEUE_WAIT_USEC	1000000		/* 1s */
80e65e175bSOded Gabbay #define GAUDI_PLDM_MMU_TIMEOUT_USEC	(MMU_CONFIG_TIMEOUT_USEC * 100)
81e65e175bSOded Gabbay #define GAUDI_PLDM_QMAN0_TIMEOUT_USEC	(HL_DEVICE_TIMEOUT_USEC * 30)
82e65e175bSOded Gabbay #define GAUDI_PLDM_TPC_KERNEL_WAIT_USEC	(HL_DEVICE_TIMEOUT_USEC * 30)
83e65e175bSOded Gabbay #define GAUDI_BOOT_FIT_REQ_TIMEOUT_USEC	4000000		/* 4s */
84e65e175bSOded Gabbay #define GAUDI_MSG_TO_CPU_TIMEOUT_USEC	4000000		/* 4s */
85e65e175bSOded Gabbay #define GAUDI_WAIT_FOR_BL_TIMEOUT_USEC	15000000	/* 15s */
86e65e175bSOded Gabbay 
87e65e175bSOded Gabbay #define GAUDI_QMAN0_FENCE_VAL		0x72E91AB9
88e65e175bSOded Gabbay 
89e65e175bSOded Gabbay #define GAUDI_MAX_STRING_LEN		20
90e65e175bSOded Gabbay 
91e65e175bSOded Gabbay #define GAUDI_CB_POOL_CB_CNT		512
92e65e175bSOded Gabbay #define GAUDI_CB_POOL_CB_SIZE		0x20000 /* 128KB */
93e65e175bSOded Gabbay 
94e65e175bSOded Gabbay #define GAUDI_ALLOC_CPU_MEM_RETRY_CNT	3
95e65e175bSOded Gabbay 
96e65e175bSOded Gabbay #define GAUDI_NUM_OF_TPC_INTR_CAUSE	20
97e65e175bSOded Gabbay 
98e65e175bSOded Gabbay #define GAUDI_NUM_OF_QM_ERR_CAUSE	16
99e65e175bSOded Gabbay 
100e65e175bSOded Gabbay #define GAUDI_NUM_OF_QM_ARB_ERR_CAUSE	3
101e65e175bSOded Gabbay 
102e65e175bSOded Gabbay #define GAUDI_ARB_WDT_TIMEOUT		0xEE6b27FF /* 8 seconds */
103e65e175bSOded Gabbay 
104e65e175bSOded Gabbay #define HBM_SCRUBBING_TIMEOUT_US	1000000 /* 1s */
105e65e175bSOded Gabbay 
106e65e175bSOded Gabbay #define BIN_REG_STRING_SIZE	sizeof("0b10101010101010101010101010101010")
107e65e175bSOded Gabbay 
108e65e175bSOded Gabbay #define MONITOR_SOB_STRING_SIZE		256
109e65e175bSOded Gabbay 
110e65e175bSOded Gabbay static u32 gaudi_stream_master[GAUDI_STREAM_MASTER_ARR_SIZE] = {
111e65e175bSOded Gabbay 	GAUDI_QUEUE_ID_DMA_0_0,
112e65e175bSOded Gabbay 	GAUDI_QUEUE_ID_DMA_0_1,
113e65e175bSOded Gabbay 	GAUDI_QUEUE_ID_DMA_0_2,
114e65e175bSOded Gabbay 	GAUDI_QUEUE_ID_DMA_0_3,
115e65e175bSOded Gabbay 	GAUDI_QUEUE_ID_DMA_1_0,
116e65e175bSOded Gabbay 	GAUDI_QUEUE_ID_DMA_1_1,
117e65e175bSOded Gabbay 	GAUDI_QUEUE_ID_DMA_1_2,
118e65e175bSOded Gabbay 	GAUDI_QUEUE_ID_DMA_1_3
119e65e175bSOded Gabbay };
120e65e175bSOded Gabbay 
121e65e175bSOded Gabbay static const u8 gaudi_dma_assignment[GAUDI_DMA_MAX] = {
122e65e175bSOded Gabbay 	[GAUDI_PCI_DMA_1] = GAUDI_ENGINE_ID_DMA_0,
123e65e175bSOded Gabbay 	[GAUDI_PCI_DMA_2] = GAUDI_ENGINE_ID_DMA_1,
124e65e175bSOded Gabbay 	[GAUDI_HBM_DMA_1] = GAUDI_ENGINE_ID_DMA_2,
125e65e175bSOded Gabbay 	[GAUDI_HBM_DMA_2] = GAUDI_ENGINE_ID_DMA_3,
126e65e175bSOded Gabbay 	[GAUDI_HBM_DMA_3] = GAUDI_ENGINE_ID_DMA_4,
127e65e175bSOded Gabbay 	[GAUDI_HBM_DMA_4] = GAUDI_ENGINE_ID_DMA_5,
128e65e175bSOded Gabbay 	[GAUDI_HBM_DMA_5] = GAUDI_ENGINE_ID_DMA_6,
129e65e175bSOded Gabbay 	[GAUDI_HBM_DMA_6] = GAUDI_ENGINE_ID_DMA_7
130e65e175bSOded Gabbay };
131e65e175bSOded Gabbay 
132e65e175bSOded Gabbay static const u8 gaudi_cq_assignment[NUMBER_OF_CMPLT_QUEUES] = {
133e65e175bSOded Gabbay 	[0] = GAUDI_QUEUE_ID_DMA_0_0,
134e65e175bSOded Gabbay 	[1] = GAUDI_QUEUE_ID_DMA_0_1,
135e65e175bSOded Gabbay 	[2] = GAUDI_QUEUE_ID_DMA_0_2,
136e65e175bSOded Gabbay 	[3] = GAUDI_QUEUE_ID_DMA_0_3,
137e65e175bSOded Gabbay 	[4] = GAUDI_QUEUE_ID_DMA_1_0,
138e65e175bSOded Gabbay 	[5] = GAUDI_QUEUE_ID_DMA_1_1,
139e65e175bSOded Gabbay 	[6] = GAUDI_QUEUE_ID_DMA_1_2,
140e65e175bSOded Gabbay 	[7] = GAUDI_QUEUE_ID_DMA_1_3,
141e65e175bSOded Gabbay };
142e65e175bSOded Gabbay 
143e65e175bSOded Gabbay static const u16 gaudi_packet_sizes[MAX_PACKET_ID] = {
144e65e175bSOded Gabbay 	[PACKET_WREG_32]	= sizeof(struct packet_wreg32),
145e65e175bSOded Gabbay 	[PACKET_WREG_BULK]	= sizeof(struct packet_wreg_bulk),
146e65e175bSOded Gabbay 	[PACKET_MSG_LONG]	= sizeof(struct packet_msg_long),
147e65e175bSOded Gabbay 	[PACKET_MSG_SHORT]	= sizeof(struct packet_msg_short),
148e65e175bSOded Gabbay 	[PACKET_CP_DMA]		= sizeof(struct packet_cp_dma),
149e65e175bSOded Gabbay 	[PACKET_REPEAT]		= sizeof(struct packet_repeat),
150e65e175bSOded Gabbay 	[PACKET_MSG_PROT]	= sizeof(struct packet_msg_prot),
151e65e175bSOded Gabbay 	[PACKET_FENCE]		= sizeof(struct packet_fence),
152e65e175bSOded Gabbay 	[PACKET_LIN_DMA]	= sizeof(struct packet_lin_dma),
153e65e175bSOded Gabbay 	[PACKET_NOP]		= sizeof(struct packet_nop),
154e65e175bSOded Gabbay 	[PACKET_STOP]		= sizeof(struct packet_stop),
155e65e175bSOded Gabbay 	[PACKET_ARB_POINT]	= sizeof(struct packet_arb_point),
156e65e175bSOded Gabbay 	[PACKET_WAIT]		= sizeof(struct packet_wait),
157e65e175bSOded Gabbay 	[PACKET_LOAD_AND_EXE]	= sizeof(struct packet_load_and_exe)
158e65e175bSOded Gabbay };
159e65e175bSOded Gabbay 
validate_packet_id(enum packet_id id)160e65e175bSOded Gabbay static inline bool validate_packet_id(enum packet_id id)
161e65e175bSOded Gabbay {
162e65e175bSOded Gabbay 	switch (id) {
163e65e175bSOded Gabbay 	case PACKET_WREG_32:
164e65e175bSOded Gabbay 	case PACKET_WREG_BULK:
165e65e175bSOded Gabbay 	case PACKET_MSG_LONG:
166e65e175bSOded Gabbay 	case PACKET_MSG_SHORT:
167e65e175bSOded Gabbay 	case PACKET_CP_DMA:
168e65e175bSOded Gabbay 	case PACKET_REPEAT:
169e65e175bSOded Gabbay 	case PACKET_MSG_PROT:
170e65e175bSOded Gabbay 	case PACKET_FENCE:
171e65e175bSOded Gabbay 	case PACKET_LIN_DMA:
172e65e175bSOded Gabbay 	case PACKET_NOP:
173e65e175bSOded Gabbay 	case PACKET_STOP:
174e65e175bSOded Gabbay 	case PACKET_ARB_POINT:
175e65e175bSOded Gabbay 	case PACKET_WAIT:
176e65e175bSOded Gabbay 	case PACKET_LOAD_AND_EXE:
177e65e175bSOded Gabbay 		return true;
178e65e175bSOded Gabbay 	default:
179e65e175bSOded Gabbay 		return false;
180e65e175bSOded Gabbay 	}
181e65e175bSOded Gabbay }
182e65e175bSOded Gabbay 
183e65e175bSOded Gabbay static const char * const
184e65e175bSOded Gabbay gaudi_tpc_interrupts_cause[GAUDI_NUM_OF_TPC_INTR_CAUSE] = {
185e65e175bSOded Gabbay 	"tpc_address_exceed_slm",
186e65e175bSOded Gabbay 	"tpc_div_by_0",
187e65e175bSOded Gabbay 	"tpc_spu_mac_overflow",
188e65e175bSOded Gabbay 	"tpc_spu_addsub_overflow",
189e65e175bSOded Gabbay 	"tpc_spu_abs_overflow",
190e65e175bSOded Gabbay 	"tpc_spu_fp_dst_nan_inf",
191e65e175bSOded Gabbay 	"tpc_spu_fp_dst_denorm",
192e65e175bSOded Gabbay 	"tpc_vpu_mac_overflow",
193e65e175bSOded Gabbay 	"tpc_vpu_addsub_overflow",
194e65e175bSOded Gabbay 	"tpc_vpu_abs_overflow",
195e65e175bSOded Gabbay 	"tpc_vpu_fp_dst_nan_inf",
196e65e175bSOded Gabbay 	"tpc_vpu_fp_dst_denorm",
197e65e175bSOded Gabbay 	"tpc_assertions",
198e65e175bSOded Gabbay 	"tpc_illegal_instruction",
199e65e175bSOded Gabbay 	"tpc_pc_wrap_around",
200e65e175bSOded Gabbay 	"tpc_qm_sw_err",
201e65e175bSOded Gabbay 	"tpc_hbw_rresp_err",
202e65e175bSOded Gabbay 	"tpc_hbw_bresp_err",
203e65e175bSOded Gabbay 	"tpc_lbw_rresp_err",
204e65e175bSOded Gabbay 	"tpc_lbw_bresp_err"
205e65e175bSOded Gabbay };
206e65e175bSOded Gabbay 
207e65e175bSOded Gabbay static const char * const
208e65e175bSOded Gabbay gaudi_qman_error_cause[GAUDI_NUM_OF_QM_ERR_CAUSE] = {
209e65e175bSOded Gabbay 	"PQ AXI HBW error",
210e65e175bSOded Gabbay 	"CQ AXI HBW error",
211e65e175bSOded Gabbay 	"CP AXI HBW error",
212e65e175bSOded Gabbay 	"CP error due to undefined OPCODE",
213e65e175bSOded Gabbay 	"CP encountered STOP OPCODE",
214e65e175bSOded Gabbay 	"CP AXI LBW error",
215e65e175bSOded Gabbay 	"CP WRREG32 or WRBULK returned error",
216e65e175bSOded Gabbay 	"N/A",
217e65e175bSOded Gabbay 	"FENCE 0 inc over max value and clipped",
218e65e175bSOded Gabbay 	"FENCE 1 inc over max value and clipped",
219e65e175bSOded Gabbay 	"FENCE 2 inc over max value and clipped",
220e65e175bSOded Gabbay 	"FENCE 3 inc over max value and clipped",
221e65e175bSOded Gabbay 	"FENCE 0 dec under min value and clipped",
222e65e175bSOded Gabbay 	"FENCE 1 dec under min value and clipped",
223e65e175bSOded Gabbay 	"FENCE 2 dec under min value and clipped",
224e65e175bSOded Gabbay 	"FENCE 3 dec under min value and clipped"
225e65e175bSOded Gabbay };
226e65e175bSOded Gabbay 
227e65e175bSOded Gabbay static const char * const
228e65e175bSOded Gabbay gaudi_qman_arb_error_cause[GAUDI_NUM_OF_QM_ARB_ERR_CAUSE] = {
229e65e175bSOded Gabbay 	"Choice push while full error",
230e65e175bSOded Gabbay 	"Choice Q watchdog error",
231e65e175bSOded Gabbay 	"MSG AXI LBW returned with error"
232e65e175bSOded Gabbay };
233e65e175bSOded Gabbay 
234e65e175bSOded Gabbay static enum hl_queue_type gaudi_queue_type[GAUDI_QUEUE_ID_SIZE] = {
235e65e175bSOded Gabbay 	QUEUE_TYPE_EXT, /* GAUDI_QUEUE_ID_DMA_0_0 */
236e65e175bSOded Gabbay 	QUEUE_TYPE_EXT, /* GAUDI_QUEUE_ID_DMA_0_1 */
237e65e175bSOded Gabbay 	QUEUE_TYPE_EXT, /* GAUDI_QUEUE_ID_DMA_0_2 */
238e65e175bSOded Gabbay 	QUEUE_TYPE_EXT, /* GAUDI_QUEUE_ID_DMA_0_3 */
239e65e175bSOded Gabbay 	QUEUE_TYPE_EXT, /* GAUDI_QUEUE_ID_DMA_1_0 */
240e65e175bSOded Gabbay 	QUEUE_TYPE_EXT, /* GAUDI_QUEUE_ID_DMA_1_1 */
241e65e175bSOded Gabbay 	QUEUE_TYPE_EXT, /* GAUDI_QUEUE_ID_DMA_1_2 */
242e65e175bSOded Gabbay 	QUEUE_TYPE_EXT, /* GAUDI_QUEUE_ID_DMA_1_3 */
243e65e175bSOded Gabbay 	QUEUE_TYPE_CPU, /* GAUDI_QUEUE_ID_CPU_PQ */
244e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_2_0 */
245e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_2_1 */
246e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_2_2 */
247e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_2_3 */
248e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_3_0 */
249e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_3_1 */
250e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_3_2 */
251e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_3_3 */
252e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_4_0 */
253e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_4_1 */
254e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_4_2 */
255e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_4_3 */
256e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_5_0 */
257e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_5_1 */
258e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_5_2 */
259e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_5_3 */
260e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_6_0 */
261e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_6_1 */
262e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_6_2 */
263e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_6_3 */
264e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_7_0 */
265e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_7_1 */
266e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_7_2 */
267e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_DMA_7_3 */
268e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_MME_0_0 */
269e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_MME_0_1 */
270e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_MME_0_2 */
271e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_MME_0_3 */
272e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_MME_1_0 */
273e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_MME_1_1 */
274e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_MME_1_2 */
275e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_MME_1_3 */
276e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_0_0 */
277e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_0_1 */
278e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_0_2 */
279e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_0_3 */
280e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_1_0 */
281e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_1_1 */
282e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_1_2 */
283e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_1_3 */
284e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_2_0 */
285e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_2_1 */
286e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_2_2 */
287e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_2_3 */
288e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_3_0 */
289e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_3_1 */
290e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_3_2 */
291e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_3_3 */
292e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_4_0 */
293e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_4_1 */
294e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_4_2 */
295e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_4_3 */
296e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_5_0 */
297e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_5_1 */
298e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_5_2 */
299e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_5_3 */
300e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_6_0 */
301e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_6_1 */
302e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_6_2 */
303e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_6_3 */
304e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_7_0 */
305e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_7_1 */
306e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_7_2 */
307e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_TPC_7_3 */
308e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_0_0 */
309e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_0_1 */
310e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_0_2 */
311e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_0_3 */
312e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_1_0 */
313e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_1_1 */
314e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_1_2 */
315e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_1_3 */
316e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_2_0 */
317e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_2_1 */
318e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_2_2 */
319e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_2_3 */
320e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_3_0 */
321e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_3_1 */
322e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_3_2 */
323e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_3_3 */
324e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_4_0 */
325e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_4_1 */
326e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_4_2 */
327e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_4_3 */
328e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_5_0 */
329e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_5_1 */
330e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_5_2 */
331e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_5_3 */
332e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_6_0 */
333e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_6_1 */
334e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_6_2 */
335e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_6_3 */
336e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_7_0 */
337e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_7_1 */
338e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_7_2 */
339e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_7_3 */
340e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_8_0 */
341e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_8_1 */
342e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_8_2 */
343e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_8_3 */
344e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_9_0 */
345e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_9_1 */
346e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_9_2 */
347e65e175bSOded Gabbay 	QUEUE_TYPE_INT, /* GAUDI_QUEUE_ID_NIC_9_3 */
348e65e175bSOded Gabbay };
349e65e175bSOded Gabbay 
350e65e175bSOded Gabbay static struct hl_hw_obj_name_entry gaudi_so_id_to_str[] = {
351e65e175bSOded Gabbay 	{ .id = 0,  .name = "SYNC_OBJ_DMA_DOWN_FEEDBACK" },
352e65e175bSOded Gabbay 	{ .id = 1,  .name = "SYNC_OBJ_DMA_UP_FEEDBACK" },
353e65e175bSOded Gabbay 	{ .id = 2,  .name = "SYNC_OBJ_DMA_STATIC_DRAM_SRAM_FEEDBACK" },
354e65e175bSOded Gabbay 	{ .id = 3,  .name = "SYNC_OBJ_DMA_SRAM_DRAM_FEEDBACK" },
355e65e175bSOded Gabbay 	{ .id = 4,  .name = "SYNC_OBJ_FIRST_COMPUTE_FINISH" },
356e65e175bSOded Gabbay 	{ .id = 5,  .name = "SYNC_OBJ_HOST_DRAM_DONE" },
357e65e175bSOded Gabbay 	{ .id = 6,  .name = "SYNC_OBJ_DBG_CTR_DEPRECATED" },
358e65e175bSOded Gabbay 	{ .id = 7,  .name = "SYNC_OBJ_DMA_ACTIVATIONS_DRAM_SRAM_FEEDBACK" },
359e65e175bSOded Gabbay 	{ .id = 8,  .name = "SYNC_OBJ_ENGINE_SEM_MME_0" },
360e65e175bSOded Gabbay 	{ .id = 9,  .name = "SYNC_OBJ_ENGINE_SEM_MME_1" },
361e65e175bSOded Gabbay 	{ .id = 10, .name = "SYNC_OBJ_ENGINE_SEM_TPC_0" },
362e65e175bSOded Gabbay 	{ .id = 11, .name = "SYNC_OBJ_ENGINE_SEM_TPC_1" },
363e65e175bSOded Gabbay 	{ .id = 12, .name = "SYNC_OBJ_ENGINE_SEM_TPC_2" },
364e65e175bSOded Gabbay 	{ .id = 13, .name = "SYNC_OBJ_ENGINE_SEM_TPC_3" },
365e65e175bSOded Gabbay 	{ .id = 14, .name = "SYNC_OBJ_ENGINE_SEM_TPC_4" },
366e65e175bSOded Gabbay 	{ .id = 15, .name = "SYNC_OBJ_ENGINE_SEM_TPC_5" },
367e65e175bSOded Gabbay 	{ .id = 16, .name = "SYNC_OBJ_ENGINE_SEM_TPC_6" },
368e65e175bSOded Gabbay 	{ .id = 17, .name = "SYNC_OBJ_ENGINE_SEM_TPC_7" },
369e65e175bSOded Gabbay 	{ .id = 18, .name = "SYNC_OBJ_ENGINE_SEM_DMA_1" },
370e65e175bSOded Gabbay 	{ .id = 19, .name = "SYNC_OBJ_ENGINE_SEM_DMA_2" },
371e65e175bSOded Gabbay 	{ .id = 20, .name = "SYNC_OBJ_ENGINE_SEM_DMA_3" },
372e65e175bSOded Gabbay 	{ .id = 21, .name = "SYNC_OBJ_ENGINE_SEM_DMA_4" },
373e65e175bSOded Gabbay 	{ .id = 22, .name = "SYNC_OBJ_ENGINE_SEM_DMA_5" },
374e65e175bSOded Gabbay 	{ .id = 23, .name = "SYNC_OBJ_ENGINE_SEM_DMA_6" },
375e65e175bSOded Gabbay 	{ .id = 24, .name = "SYNC_OBJ_ENGINE_SEM_DMA_7" },
376e65e175bSOded Gabbay 	{ .id = 25, .name = "SYNC_OBJ_DBG_CTR_0" },
377e65e175bSOded Gabbay 	{ .id = 26, .name = "SYNC_OBJ_DBG_CTR_1" },
378e65e175bSOded Gabbay };
379e65e175bSOded Gabbay 
380e65e175bSOded Gabbay static struct hl_hw_obj_name_entry gaudi_monitor_id_to_str[] = {
381e65e175bSOded Gabbay 	{ .id = 200, .name = "MON_OBJ_DMA_DOWN_FEEDBACK_RESET" },
382e65e175bSOded Gabbay 	{ .id = 201, .name = "MON_OBJ_DMA_UP_FEEDBACK_RESET" },
383e65e175bSOded Gabbay 	{ .id = 203, .name = "MON_OBJ_DRAM_TO_SRAM_QUEUE_FENCE" },
384e65e175bSOded Gabbay 	{ .id = 204, .name = "MON_OBJ_TPC_0_CLK_GATE" },
385e65e175bSOded Gabbay 	{ .id = 205, .name = "MON_OBJ_TPC_1_CLK_GATE" },
386e65e175bSOded Gabbay 	{ .id = 206, .name = "MON_OBJ_TPC_2_CLK_GATE" },
387e65e175bSOded Gabbay 	{ .id = 207, .name = "MON_OBJ_TPC_3_CLK_GATE" },
388e65e175bSOded Gabbay 	{ .id = 208, .name = "MON_OBJ_TPC_4_CLK_GATE" },
389e65e175bSOded Gabbay 	{ .id = 209, .name = "MON_OBJ_TPC_5_CLK_GATE" },
390e65e175bSOded Gabbay 	{ .id = 210, .name = "MON_OBJ_TPC_6_CLK_GATE" },
391e65e175bSOded Gabbay 	{ .id = 211, .name = "MON_OBJ_TPC_7_CLK_GATE" },
392e65e175bSOded Gabbay };
393e65e175bSOded Gabbay 
394e65e175bSOded Gabbay static s64 gaudi_state_dump_specs_props[] = {
395e65e175bSOded Gabbay 	[SP_SYNC_OBJ_BASE_ADDR] = mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0,
396e65e175bSOded Gabbay 	[SP_NEXT_SYNC_OBJ_ADDR] = NEXT_SYNC_OBJ_ADDR_INTERVAL,
397e65e175bSOded Gabbay 	[SP_SYNC_OBJ_AMOUNT] = NUM_OF_SOB_IN_BLOCK,
398e65e175bSOded Gabbay 	[SP_MON_OBJ_WR_ADDR_LOW] =
399e65e175bSOded Gabbay 		mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0,
400e65e175bSOded Gabbay 	[SP_MON_OBJ_WR_ADDR_HIGH] =
401e65e175bSOded Gabbay 		mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0,
402e65e175bSOded Gabbay 	[SP_MON_OBJ_WR_DATA] = mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_PAY_DATA_0,
403e65e175bSOded Gabbay 	[SP_MON_OBJ_ARM_DATA] = mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_ARM_0,
404e65e175bSOded Gabbay 	[SP_MON_OBJ_STATUS] = mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_STATUS_0,
405e65e175bSOded Gabbay 	[SP_MONITORS_AMOUNT] = NUM_OF_MONITORS_IN_BLOCK,
406e65e175bSOded Gabbay 	[SP_TPC0_CMDQ] = mmTPC0_QM_GLBL_CFG0,
407e65e175bSOded Gabbay 	[SP_TPC0_CFG_SO] = mmTPC0_CFG_QM_SYNC_OBJECT_ADDR,
408e65e175bSOded Gabbay 	[SP_NEXT_TPC] = mmTPC1_QM_GLBL_CFG0 - mmTPC0_QM_GLBL_CFG0,
409e65e175bSOded Gabbay 	[SP_MME_CMDQ] = mmMME0_QM_GLBL_CFG0,
410e65e175bSOded Gabbay 	[SP_MME_CFG_SO] = mmMME0_CTRL_ARCH_DESC_SYNC_OBJECT_ADDR_LOW_LOCAL,
411e65e175bSOded Gabbay 	[SP_NEXT_MME] = mmMME2_QM_GLBL_CFG0 - mmMME0_QM_GLBL_CFG0,
412e65e175bSOded Gabbay 	[SP_DMA_CMDQ] = mmDMA0_QM_GLBL_CFG0,
413e65e175bSOded Gabbay 	[SP_DMA_CFG_SO] = mmDMA0_CORE_WR_COMP_ADDR_LO,
414e65e175bSOded Gabbay 	[SP_DMA_QUEUES_OFFSET] = mmDMA1_QM_GLBL_CFG0 - mmDMA0_QM_GLBL_CFG0,
415e65e175bSOded Gabbay 	[SP_NUM_OF_MME_ENGINES] = NUM_OF_MME_ENGINES,
416e65e175bSOded Gabbay 	[SP_SUB_MME_ENG_NUM] = NUM_OF_MME_SUB_ENGINES,
417e65e175bSOded Gabbay 	[SP_NUM_OF_DMA_ENGINES] = NUM_OF_DMA_ENGINES,
418e65e175bSOded Gabbay 	[SP_NUM_OF_TPC_ENGINES] = NUM_OF_TPC_ENGINES,
419e65e175bSOded Gabbay 	[SP_ENGINE_NUM_OF_QUEUES] = NUM_OF_QUEUES,
420e65e175bSOded Gabbay 	[SP_ENGINE_NUM_OF_STREAMS] = NUM_OF_STREAMS,
421e65e175bSOded Gabbay 	[SP_ENGINE_NUM_OF_FENCES] = NUM_OF_FENCES,
422e65e175bSOded Gabbay 	[SP_FENCE0_CNT_OFFSET] =
423e65e175bSOded Gabbay 		mmDMA0_QM_CP_FENCE0_CNT_0 - mmDMA0_QM_GLBL_CFG0,
424e65e175bSOded Gabbay 	[SP_FENCE0_RDATA_OFFSET] =
425e65e175bSOded Gabbay 		mmDMA0_QM_CP_FENCE0_RDATA_0 - mmDMA0_QM_GLBL_CFG0,
426e65e175bSOded Gabbay 	[SP_CP_STS_OFFSET] = mmDMA0_QM_CP_STS_0 - mmDMA0_QM_GLBL_CFG0,
427e65e175bSOded Gabbay 	[SP_NUM_CORES] = 1,
428e65e175bSOded Gabbay };
429e65e175bSOded Gabbay 
430e65e175bSOded Gabbay static const int gaudi_queue_id_to_engine_id[] = {
431e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_DMA_0_0...GAUDI_QUEUE_ID_DMA_0_3] = GAUDI_ENGINE_ID_DMA_0,
432e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_DMA_1_0...GAUDI_QUEUE_ID_DMA_1_3] = GAUDI_ENGINE_ID_DMA_1,
433e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_CPU_PQ] = GAUDI_ENGINE_ID_SIZE,
434e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_DMA_2_0...GAUDI_QUEUE_ID_DMA_2_3] = GAUDI_ENGINE_ID_DMA_2,
435e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_DMA_3_0...GAUDI_QUEUE_ID_DMA_3_3] = GAUDI_ENGINE_ID_DMA_3,
436e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_DMA_4_0...GAUDI_QUEUE_ID_DMA_4_3] = GAUDI_ENGINE_ID_DMA_4,
437e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_DMA_5_0...GAUDI_QUEUE_ID_DMA_5_3] = GAUDI_ENGINE_ID_DMA_5,
438e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_DMA_6_0...GAUDI_QUEUE_ID_DMA_6_3] = GAUDI_ENGINE_ID_DMA_6,
439e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_DMA_7_0...GAUDI_QUEUE_ID_DMA_7_3] = GAUDI_ENGINE_ID_DMA_7,
440e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_MME_0_0...GAUDI_QUEUE_ID_MME_0_3] = GAUDI_ENGINE_ID_MME_0,
441e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_MME_1_0...GAUDI_QUEUE_ID_MME_1_3] = GAUDI_ENGINE_ID_MME_2,
442e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_TPC_0_0...GAUDI_QUEUE_ID_TPC_0_3] = GAUDI_ENGINE_ID_TPC_0,
443e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_TPC_1_0...GAUDI_QUEUE_ID_TPC_1_3] = GAUDI_ENGINE_ID_TPC_1,
444e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_TPC_2_0...GAUDI_QUEUE_ID_TPC_2_3] = GAUDI_ENGINE_ID_TPC_2,
445e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_TPC_3_0...GAUDI_QUEUE_ID_TPC_3_3] = GAUDI_ENGINE_ID_TPC_3,
446e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_TPC_4_0...GAUDI_QUEUE_ID_TPC_4_3] = GAUDI_ENGINE_ID_TPC_4,
447e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_TPC_5_0...GAUDI_QUEUE_ID_TPC_5_3] = GAUDI_ENGINE_ID_TPC_5,
448e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_TPC_6_0...GAUDI_QUEUE_ID_TPC_6_3] = GAUDI_ENGINE_ID_TPC_6,
449e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_TPC_7_0...GAUDI_QUEUE_ID_TPC_7_3] = GAUDI_ENGINE_ID_TPC_7,
450e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_NIC_0_0...GAUDI_QUEUE_ID_NIC_0_3] = GAUDI_ENGINE_ID_NIC_0,
451e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_NIC_1_0...GAUDI_QUEUE_ID_NIC_1_3] = GAUDI_ENGINE_ID_NIC_1,
452e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_NIC_2_0...GAUDI_QUEUE_ID_NIC_2_3] = GAUDI_ENGINE_ID_NIC_2,
453e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_NIC_3_0...GAUDI_QUEUE_ID_NIC_3_3] = GAUDI_ENGINE_ID_NIC_3,
454e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_NIC_4_0...GAUDI_QUEUE_ID_NIC_4_3] = GAUDI_ENGINE_ID_NIC_4,
455e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_NIC_5_0...GAUDI_QUEUE_ID_NIC_5_3] = GAUDI_ENGINE_ID_NIC_5,
456e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_NIC_6_0...GAUDI_QUEUE_ID_NIC_6_3] = GAUDI_ENGINE_ID_NIC_6,
457e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_NIC_7_0...GAUDI_QUEUE_ID_NIC_7_3] = GAUDI_ENGINE_ID_NIC_7,
458e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_NIC_8_0...GAUDI_QUEUE_ID_NIC_8_3] = GAUDI_ENGINE_ID_NIC_8,
459e65e175bSOded Gabbay 	[GAUDI_QUEUE_ID_NIC_9_0...GAUDI_QUEUE_ID_NIC_9_3] = GAUDI_ENGINE_ID_NIC_9,
460e65e175bSOded Gabbay };
461e65e175bSOded Gabbay 
462e65e175bSOded Gabbay /* The order here is opposite to the order of the indexing in the h/w.
463e65e175bSOded Gabbay  * i.e. SYNC_MGR_W_S is actually 0, SYNC_MGR_E_S is 1, etc.
464e65e175bSOded Gabbay  */
465e65e175bSOded Gabbay static const char * const gaudi_sync_manager_names[] = {
466e65e175bSOded Gabbay 	"SYNC_MGR_E_N",
467e65e175bSOded Gabbay 	"SYNC_MGR_W_N",
468e65e175bSOded Gabbay 	"SYNC_MGR_E_S",
469e65e175bSOded Gabbay 	"SYNC_MGR_W_S",
470e65e175bSOded Gabbay 	NULL
471e65e175bSOded Gabbay };
472e65e175bSOded Gabbay 
473e65e175bSOded Gabbay struct ecc_info_extract_params {
474e65e175bSOded Gabbay 	u64 block_address;
475e65e175bSOded Gabbay 	u32 num_memories;
476e65e175bSOded Gabbay 	bool derr;
477e65e175bSOded Gabbay };
478e65e175bSOded Gabbay 
479e65e175bSOded Gabbay static int gaudi_mmu_update_asid_hop0_addr(struct hl_device *hdev, u32 asid,
480e65e175bSOded Gabbay 								u64 phys_addr);
481e65e175bSOded Gabbay static int gaudi_send_job_on_qman0(struct hl_device *hdev,
482e65e175bSOded Gabbay 					struct hl_cs_job *job);
483e65e175bSOded Gabbay static int gaudi_memset_device_memory(struct hl_device *hdev, u64 addr,
484e65e175bSOded Gabbay 					u32 size, u64 val);
485e65e175bSOded Gabbay static int gaudi_memset_registers(struct hl_device *hdev, u64 reg_base,
486e65e175bSOded Gabbay 					u32 num_regs, u32 val);
487e65e175bSOded Gabbay static int gaudi_run_tpc_kernel(struct hl_device *hdev, u64 tpc_kernel,
488e65e175bSOded Gabbay 				u32 tpc_id);
489e65e175bSOded Gabbay static int gaudi_mmu_clear_pgt_range(struct hl_device *hdev);
490e65e175bSOded Gabbay static int gaudi_cpucp_info_get(struct hl_device *hdev);
491e65e175bSOded Gabbay static void gaudi_disable_clock_gating(struct hl_device *hdev);
492e65e175bSOded Gabbay static void gaudi_mmu_prepare(struct hl_device *hdev, u32 asid);
493e65e175bSOded Gabbay static u32 gaudi_gen_signal_cb(struct hl_device *hdev, void *data, u16 sob_id,
494e65e175bSOded Gabbay 				u32 size, bool eb);
495e65e175bSOded Gabbay static u32 gaudi_gen_wait_cb(struct hl_device *hdev,
496e65e175bSOded Gabbay 				struct hl_gen_wait_properties *prop);
497e65e175bSOded Gabbay static inline enum hl_collective_mode
get_collective_mode(struct hl_device * hdev,u32 queue_id)498e65e175bSOded Gabbay get_collective_mode(struct hl_device *hdev, u32 queue_id)
499e65e175bSOded Gabbay {
500e65e175bSOded Gabbay 	if (gaudi_queue_type[queue_id] == QUEUE_TYPE_EXT)
501e65e175bSOded Gabbay 		return HL_COLLECTIVE_MASTER;
502e65e175bSOded Gabbay 
503e65e175bSOded Gabbay 	if (queue_id >= GAUDI_QUEUE_ID_DMA_5_0 &&
504e65e175bSOded Gabbay 			queue_id <= GAUDI_QUEUE_ID_DMA_5_3)
505e65e175bSOded Gabbay 		return HL_COLLECTIVE_SLAVE;
506e65e175bSOded Gabbay 
507e65e175bSOded Gabbay 	if (queue_id >= GAUDI_QUEUE_ID_TPC_7_0 &&
508e65e175bSOded Gabbay 			queue_id <= GAUDI_QUEUE_ID_TPC_7_3)
509e65e175bSOded Gabbay 		return HL_COLLECTIVE_SLAVE;
510e65e175bSOded Gabbay 
511e65e175bSOded Gabbay 	if (queue_id >= GAUDI_QUEUE_ID_NIC_0_0 &&
512e65e175bSOded Gabbay 			queue_id <= GAUDI_QUEUE_ID_NIC_9_3)
513e65e175bSOded Gabbay 		return HL_COLLECTIVE_SLAVE;
514e65e175bSOded Gabbay 
515e65e175bSOded Gabbay 	return HL_COLLECTIVE_NOT_SUPPORTED;
516e65e175bSOded Gabbay }
517e65e175bSOded Gabbay 
set_default_power_values(struct hl_device * hdev)518e65e175bSOded Gabbay static inline void set_default_power_values(struct hl_device *hdev)
519e65e175bSOded Gabbay {
520e65e175bSOded Gabbay 	struct asic_fixed_properties *prop = &hdev->asic_prop;
521e65e175bSOded Gabbay 
522e65e175bSOded Gabbay 	if (hdev->card_type == cpucp_card_type_pmc) {
523e65e175bSOded Gabbay 		prop->max_power_default = MAX_POWER_DEFAULT_PMC;
524e65e175bSOded Gabbay 
525e65e175bSOded Gabbay 		if (prop->fw_security_enabled)
526e65e175bSOded Gabbay 			prop->dc_power_default = DC_POWER_DEFAULT_PMC_SEC;
527e65e175bSOded Gabbay 		else
528e65e175bSOded Gabbay 			prop->dc_power_default = DC_POWER_DEFAULT_PMC;
529e65e175bSOded Gabbay 	} else {
530e65e175bSOded Gabbay 		prop->max_power_default = MAX_POWER_DEFAULT_PCI;
531e65e175bSOded Gabbay 		prop->dc_power_default = DC_POWER_DEFAULT_PCI;
532e65e175bSOded Gabbay 	}
533e65e175bSOded Gabbay }
534e65e175bSOded Gabbay 
gaudi_set_fixed_properties(struct hl_device * hdev)535e65e175bSOded Gabbay static int gaudi_set_fixed_properties(struct hl_device *hdev)
536e65e175bSOded Gabbay {
537e65e175bSOded Gabbay 	struct asic_fixed_properties *prop = &hdev->asic_prop;
538e65e175bSOded Gabbay 	u32 num_sync_stream_queues = 0;
539e65e175bSOded Gabbay 	int i;
540e65e175bSOded Gabbay 
541e65e175bSOded Gabbay 	prop->max_queues = GAUDI_QUEUE_ID_SIZE;
542e65e175bSOded Gabbay 	prop->hw_queues_props = kcalloc(prop->max_queues,
543e65e175bSOded Gabbay 			sizeof(struct hw_queue_properties),
544e65e175bSOded Gabbay 			GFP_KERNEL);
545e65e175bSOded Gabbay 
546e65e175bSOded Gabbay 	if (!prop->hw_queues_props)
547e65e175bSOded Gabbay 		return -ENOMEM;
548e65e175bSOded Gabbay 
549e65e175bSOded Gabbay 	for (i = 0 ; i < prop->max_queues ; i++) {
550e65e175bSOded Gabbay 		if (gaudi_queue_type[i] == QUEUE_TYPE_EXT) {
551e65e175bSOded Gabbay 			prop->hw_queues_props[i].type = QUEUE_TYPE_EXT;
552e65e175bSOded Gabbay 			prop->hw_queues_props[i].driver_only = 0;
553e65e175bSOded Gabbay 			prop->hw_queues_props[i].supports_sync_stream = 1;
554e65e175bSOded Gabbay 			prop->hw_queues_props[i].cb_alloc_flags =
555e65e175bSOded Gabbay 				CB_ALLOC_KERNEL;
556e65e175bSOded Gabbay 			num_sync_stream_queues++;
557e65e175bSOded Gabbay 		} else if (gaudi_queue_type[i] == QUEUE_TYPE_CPU) {
558e65e175bSOded Gabbay 			prop->hw_queues_props[i].type = QUEUE_TYPE_CPU;
559e65e175bSOded Gabbay 			prop->hw_queues_props[i].driver_only = 1;
560e65e175bSOded Gabbay 			prop->hw_queues_props[i].supports_sync_stream = 0;
561e65e175bSOded Gabbay 			prop->hw_queues_props[i].cb_alloc_flags =
562e65e175bSOded Gabbay 				CB_ALLOC_KERNEL;
563e65e175bSOded Gabbay 		} else if (gaudi_queue_type[i] == QUEUE_TYPE_INT) {
564e65e175bSOded Gabbay 			prop->hw_queues_props[i].type = QUEUE_TYPE_INT;
565e65e175bSOded Gabbay 			prop->hw_queues_props[i].driver_only = 0;
566e65e175bSOded Gabbay 			prop->hw_queues_props[i].supports_sync_stream = 0;
567e65e175bSOded Gabbay 			prop->hw_queues_props[i].cb_alloc_flags =
568e65e175bSOded Gabbay 				CB_ALLOC_USER;
569e65e175bSOded Gabbay 
570e65e175bSOded Gabbay 		}
571e65e175bSOded Gabbay 		prop->hw_queues_props[i].collective_mode =
572e65e175bSOded Gabbay 						get_collective_mode(hdev, i);
573e65e175bSOded Gabbay 	}
574e65e175bSOded Gabbay 
575e65e175bSOded Gabbay 	prop->cache_line_size = DEVICE_CACHE_LINE_SIZE;
576e65e175bSOded Gabbay 	prop->cfg_base_address = CFG_BASE;
577e65e175bSOded Gabbay 	prop->device_dma_offset_for_host_access = HOST_PHYS_BASE;
578e65e175bSOded Gabbay 	prop->host_base_address = HOST_PHYS_BASE;
579e65e175bSOded Gabbay 	prop->host_end_address = prop->host_base_address + HOST_PHYS_SIZE;
580e65e175bSOded Gabbay 	prop->completion_queues_count = NUMBER_OF_CMPLT_QUEUES;
581e65e175bSOded Gabbay 	prop->completion_mode = HL_COMPLETION_MODE_JOB;
582e65e175bSOded Gabbay 	prop->collective_first_sob = 0;
583e65e175bSOded Gabbay 	prop->collective_first_mon = 0;
584e65e175bSOded Gabbay 
585e65e175bSOded Gabbay 	/* 2 SOBs per internal queue stream are reserved for collective */
586e65e175bSOded Gabbay 	prop->sync_stream_first_sob =
587e65e175bSOded Gabbay 			ALIGN(NUMBER_OF_SOBS_IN_GRP, HL_MAX_SOBS_PER_MONITOR)
588e65e175bSOded Gabbay 			* QMAN_STREAMS * HL_RSVD_SOBS;
589e65e175bSOded Gabbay 
590e65e175bSOded Gabbay 	/* 1 monitor per internal queue stream are reserved for collective
591e65e175bSOded Gabbay 	 * 2 monitors per external queue stream are reserved for collective
592e65e175bSOded Gabbay 	 */
593e65e175bSOded Gabbay 	prop->sync_stream_first_mon =
594e65e175bSOded Gabbay 			(NUMBER_OF_COLLECTIVE_QUEUES * QMAN_STREAMS) +
595e65e175bSOded Gabbay 			(NUMBER_OF_EXT_HW_QUEUES * 2);
596e65e175bSOded Gabbay 
597e65e175bSOded Gabbay 	prop->dram_base_address = DRAM_PHYS_BASE;
598e65e175bSOded Gabbay 	prop->dram_size = GAUDI_HBM_SIZE_32GB;
599e65e175bSOded Gabbay 	prop->dram_end_address = prop->dram_base_address + prop->dram_size;
600e65e175bSOded Gabbay 	prop->dram_user_base_address = DRAM_BASE_ADDR_USER;
601e65e175bSOded Gabbay 
602e65e175bSOded Gabbay 	prop->sram_base_address = SRAM_BASE_ADDR;
603e65e175bSOded Gabbay 	prop->sram_size = SRAM_SIZE;
604e65e175bSOded Gabbay 	prop->sram_end_address = prop->sram_base_address + prop->sram_size;
605e65e175bSOded Gabbay 	prop->sram_user_base_address =
606e65e175bSOded Gabbay 			prop->sram_base_address + SRAM_USER_BASE_OFFSET;
607e65e175bSOded Gabbay 
608e65e175bSOded Gabbay 	prop->mmu_cache_mng_addr = MMU_CACHE_MNG_ADDR;
609e65e175bSOded Gabbay 	prop->mmu_cache_mng_size = MMU_CACHE_MNG_SIZE;
610e65e175bSOded Gabbay 
611e65e175bSOded Gabbay 	prop->mmu_pgt_addr = MMU_PAGE_TABLES_ADDR;
612e65e175bSOded Gabbay 	if (hdev->pldm)
613e65e175bSOded Gabbay 		prop->mmu_pgt_size = 0x800000; /* 8MB */
614e65e175bSOded Gabbay 	else
615e65e175bSOded Gabbay 		prop->mmu_pgt_size = MMU_PAGE_TABLES_SIZE;
616e65e175bSOded Gabbay 	prop->mmu_pte_size = HL_PTE_SIZE;
617e65e175bSOded Gabbay 	prop->dram_page_size = PAGE_SIZE_2MB;
618e65e175bSOded Gabbay 	prop->device_mem_alloc_default_page_size = prop->dram_page_size;
619e65e175bSOded Gabbay 	prop->dram_supports_virtual_memory = false;
620e65e175bSOded Gabbay 
621e65e175bSOded Gabbay 	prop->pmmu.hop_shifts[MMU_HOP0] = MMU_V1_1_HOP0_SHIFT;
622e65e175bSOded Gabbay 	prop->pmmu.hop_shifts[MMU_HOP1] = MMU_V1_1_HOP1_SHIFT;
623e65e175bSOded Gabbay 	prop->pmmu.hop_shifts[MMU_HOP2] = MMU_V1_1_HOP2_SHIFT;
624e65e175bSOded Gabbay 	prop->pmmu.hop_shifts[MMU_HOP3] = MMU_V1_1_HOP3_SHIFT;
625e65e175bSOded Gabbay 	prop->pmmu.hop_shifts[MMU_HOP4] = MMU_V1_1_HOP4_SHIFT;
626e65e175bSOded Gabbay 	prop->pmmu.hop_masks[MMU_HOP0] = MMU_V1_1_HOP0_MASK;
627e65e175bSOded Gabbay 	prop->pmmu.hop_masks[MMU_HOP1] = MMU_V1_1_HOP1_MASK;
628e65e175bSOded Gabbay 	prop->pmmu.hop_masks[MMU_HOP2] = MMU_V1_1_HOP2_MASK;
629e65e175bSOded Gabbay 	prop->pmmu.hop_masks[MMU_HOP3] = MMU_V1_1_HOP3_MASK;
630e65e175bSOded Gabbay 	prop->pmmu.hop_masks[MMU_HOP4] = MMU_V1_1_HOP4_MASK;
631e65e175bSOded Gabbay 	prop->pmmu.start_addr = VA_HOST_SPACE_START;
632e65e175bSOded Gabbay 	prop->pmmu.end_addr =
633e65e175bSOded Gabbay 			(VA_HOST_SPACE_START + VA_HOST_SPACE_SIZE / 2) - 1;
634e65e175bSOded Gabbay 	prop->pmmu.page_size = PAGE_SIZE_4KB;
635e65e175bSOded Gabbay 	prop->pmmu.num_hops = MMU_ARCH_5_HOPS;
636e65e175bSOded Gabbay 	prop->pmmu.last_mask = LAST_MASK;
637e65e175bSOded Gabbay 	/* TODO: will be duplicated until implementing per-MMU props */
638c14e5cd3SFarah Kassabri 	prop->pmmu.hop_table_size = HOP_TABLE_SIZE_512_PTE;
639c14e5cd3SFarah Kassabri 	prop->pmmu.hop0_tables_total_size = HOP0_512_PTE_TABLES_TOTAL_SIZE;
640e65e175bSOded Gabbay 
641e65e175bSOded Gabbay 	/* PMMU and HPMMU are the same except of page size */
642e65e175bSOded Gabbay 	memcpy(&prop->pmmu_huge, &prop->pmmu, sizeof(prop->pmmu));
643e65e175bSOded Gabbay 	prop->pmmu_huge.page_size = PAGE_SIZE_2MB;
644e65e175bSOded Gabbay 
645e65e175bSOded Gabbay 	/* shifts and masks are the same in PMMU and DMMU */
646e65e175bSOded Gabbay 	memcpy(&prop->dmmu, &prop->pmmu, sizeof(prop->pmmu));
647e65e175bSOded Gabbay 	prop->dmmu.start_addr = (VA_HOST_SPACE_START + VA_HOST_SPACE_SIZE / 2);
648e65e175bSOded Gabbay 	prop->dmmu.end_addr = VA_HOST_SPACE_END;
649e65e175bSOded Gabbay 	prop->dmmu.page_size = PAGE_SIZE_2MB;
650f728c17fSFarah Kassabri 	prop->dmmu.pgt_size = prop->mmu_pgt_size;
651e65e175bSOded Gabbay 
652e65e175bSOded Gabbay 	prop->cfg_size = CFG_SIZE;
653e65e175bSOded Gabbay 	prop->max_asid = MAX_ASID;
654e65e175bSOded Gabbay 	prop->num_of_events = GAUDI_EVENT_SIZE;
655f7f0085eSKoby Elbaz 	prop->max_num_of_engines = GAUDI_ENGINE_ID_SIZE;
656e65e175bSOded Gabbay 	prop->tpc_enabled_mask = TPC_ENABLED_MASK;
657e65e175bSOded Gabbay 
658e65e175bSOded Gabbay 	set_default_power_values(hdev);
659e65e175bSOded Gabbay 
660e65e175bSOded Gabbay 	prop->cb_pool_cb_cnt = GAUDI_CB_POOL_CB_CNT;
661e65e175bSOded Gabbay 	prop->cb_pool_cb_size = GAUDI_CB_POOL_CB_SIZE;
662e65e175bSOded Gabbay 
663e65e175bSOded Gabbay 	prop->pcie_dbi_base_address = mmPCIE_DBI_BASE;
664e65e175bSOded Gabbay 	prop->pcie_aux_dbi_reg_addr = CFG_BASE + mmPCIE_AUX_DBI;
665e65e175bSOded Gabbay 
666a45d5cf0SJustin Stitt 	strscpy_pad(prop->cpucp_info.card_name, GAUDI_DEFAULT_CARD_NAME,
667e65e175bSOded Gabbay 					CARD_NAME_MAX_LEN);
668e65e175bSOded Gabbay 
669e65e175bSOded Gabbay 	prop->max_pending_cs = GAUDI_MAX_PENDING_CS;
670e65e175bSOded Gabbay 
671e65e175bSOded Gabbay 	prop->first_available_user_sob[HL_GAUDI_WS_DCORE] =
672e65e175bSOded Gabbay 			prop->sync_stream_first_sob +
673e65e175bSOded Gabbay 			(num_sync_stream_queues * HL_RSVD_SOBS);
674e65e175bSOded Gabbay 	prop->first_available_user_mon[HL_GAUDI_WS_DCORE] =
675e65e175bSOded Gabbay 			prop->sync_stream_first_mon +
676e65e175bSOded Gabbay 			(num_sync_stream_queues * HL_RSVD_MONS);
677e65e175bSOded Gabbay 
678e65e175bSOded Gabbay 	prop->first_available_user_interrupt = USHRT_MAX;
6794713ace3SOfir Bitton 	prop->tpc_interrupt_id = USHRT_MAX;
680e65e175bSOded Gabbay 
681802f25b6STal Cohen 	/* single msi */
682802f25b6STal Cohen 	prop->eq_interrupt_id = 0;
683802f25b6STal Cohen 
684e65e175bSOded Gabbay 	for (i = 0 ; i < HL_MAX_DCORES ; i++)
685e65e175bSOded Gabbay 		prop->first_available_cq[i] = USHRT_MAX;
686e65e175bSOded Gabbay 
687e65e175bSOded Gabbay 	prop->fw_cpu_boot_dev_sts0_valid = false;
688e65e175bSOded Gabbay 	prop->fw_cpu_boot_dev_sts1_valid = false;
689e65e175bSOded Gabbay 	prop->hard_reset_done_by_fw = false;
690e65e175bSOded Gabbay 	prop->gic_interrupts_enable = true;
691e65e175bSOded Gabbay 
692e65e175bSOded Gabbay 	prop->server_type = HL_SERVER_TYPE_UNKNOWN;
693e65e175bSOded Gabbay 
694e65e175bSOded Gabbay 	prop->clk_pll_index = HL_GAUDI_MME_PLL;
695e65e175bSOded Gabbay 	prop->max_freq_value = GAUDI_MAX_CLK_FREQ;
696e65e175bSOded Gabbay 
697e65e175bSOded Gabbay 	prop->use_get_power_for_reset_history = true;
698e65e175bSOded Gabbay 
699e65e175bSOded Gabbay 	prop->configurable_stop_on_err = true;
700e65e175bSOded Gabbay 
701e65e175bSOded Gabbay 	prop->set_max_power_on_device_init = true;
702e65e175bSOded Gabbay 
703e65e175bSOded Gabbay 	prop->dma_mask = 48;
704e65e175bSOded Gabbay 
70520faaeecSOhad Sharabi 	prop->hbw_flush_reg = mmPCIE_WRAP_RR_ELBI_RD_SEC_REG_CTRL;
70620faaeecSOhad Sharabi 
707e65e175bSOded Gabbay 	return 0;
708e65e175bSOded Gabbay }
709e65e175bSOded Gabbay 
gaudi_pci_bars_map(struct hl_device * hdev)710e65e175bSOded Gabbay static int gaudi_pci_bars_map(struct hl_device *hdev)
711e65e175bSOded Gabbay {
712e65e175bSOded Gabbay 	static const char * const name[] = {"SRAM", "CFG", "HBM"};
713e65e175bSOded Gabbay 	bool is_wc[3] = {false, false, true};
714e65e175bSOded Gabbay 	int rc;
715e65e175bSOded Gabbay 
716e65e175bSOded Gabbay 	rc = hl_pci_bars_map(hdev, name, is_wc);
717e65e175bSOded Gabbay 	if (rc)
718e65e175bSOded Gabbay 		return rc;
719e65e175bSOded Gabbay 
720e65e175bSOded Gabbay 	hdev->rmmio = hdev->pcie_bar[CFG_BAR_ID] +
721e65e175bSOded Gabbay 			(CFG_BASE - SPI_FLASH_BASE_ADDR);
722e65e175bSOded Gabbay 
723e65e175bSOded Gabbay 	return 0;
724e65e175bSOded Gabbay }
725e65e175bSOded Gabbay 
gaudi_set_hbm_bar_base(struct hl_device * hdev,u64 addr)726e65e175bSOded Gabbay static u64 gaudi_set_hbm_bar_base(struct hl_device *hdev, u64 addr)
727e65e175bSOded Gabbay {
728e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
729e65e175bSOded Gabbay 	struct hl_inbound_pci_region pci_region;
730e65e175bSOded Gabbay 	u64 old_addr = addr;
731e65e175bSOded Gabbay 	int rc;
732e65e175bSOded Gabbay 
733e65e175bSOded Gabbay 	if ((gaudi) && (gaudi->hbm_bar_cur_addr == addr))
734e65e175bSOded Gabbay 		return old_addr;
735e65e175bSOded Gabbay 
736e65e175bSOded Gabbay 	if (hdev->asic_prop.iatu_done_by_fw)
737e65e175bSOded Gabbay 		return U64_MAX;
738e65e175bSOded Gabbay 
739e65e175bSOded Gabbay 	/* Inbound Region 2 - Bar 4 - Point to HBM */
740e65e175bSOded Gabbay 	pci_region.mode = PCI_BAR_MATCH_MODE;
741e65e175bSOded Gabbay 	pci_region.bar = HBM_BAR_ID;
742e65e175bSOded Gabbay 	pci_region.addr = addr;
743e65e175bSOded Gabbay 	rc = hl_pci_set_inbound_region(hdev, 2, &pci_region);
744e65e175bSOded Gabbay 	if (rc)
745e65e175bSOded Gabbay 		return U64_MAX;
746e65e175bSOded Gabbay 
747e65e175bSOded Gabbay 	if (gaudi) {
748e65e175bSOded Gabbay 		old_addr = gaudi->hbm_bar_cur_addr;
749e65e175bSOded Gabbay 		gaudi->hbm_bar_cur_addr = addr;
750e65e175bSOded Gabbay 	}
751e65e175bSOded Gabbay 
752e65e175bSOded Gabbay 	return old_addr;
753e65e175bSOded Gabbay }
754e65e175bSOded Gabbay 
gaudi_init_iatu(struct hl_device * hdev)755e65e175bSOded Gabbay static int gaudi_init_iatu(struct hl_device *hdev)
756e65e175bSOded Gabbay {
757e65e175bSOded Gabbay 	struct hl_inbound_pci_region inbound_region;
758e65e175bSOded Gabbay 	struct hl_outbound_pci_region outbound_region;
759e65e175bSOded Gabbay 	int rc;
760e65e175bSOded Gabbay 
761e65e175bSOded Gabbay 	if (hdev->asic_prop.iatu_done_by_fw)
762e65e175bSOded Gabbay 		return 0;
763e65e175bSOded Gabbay 
764e65e175bSOded Gabbay 	/* Inbound Region 0 - Bar 0 - Point to SRAM + CFG */
765e65e175bSOded Gabbay 	inbound_region.mode = PCI_BAR_MATCH_MODE;
766e65e175bSOded Gabbay 	inbound_region.bar = SRAM_BAR_ID;
767e65e175bSOded Gabbay 	inbound_region.addr = SRAM_BASE_ADDR;
768e65e175bSOded Gabbay 	rc = hl_pci_set_inbound_region(hdev, 0, &inbound_region);
769e65e175bSOded Gabbay 	if (rc)
770e65e175bSOded Gabbay 		goto done;
771e65e175bSOded Gabbay 
772e65e175bSOded Gabbay 	/* Inbound Region 1 - Bar 2 - Point to SPI FLASH */
773e65e175bSOded Gabbay 	inbound_region.mode = PCI_BAR_MATCH_MODE;
774e65e175bSOded Gabbay 	inbound_region.bar = CFG_BAR_ID;
775e65e175bSOded Gabbay 	inbound_region.addr = SPI_FLASH_BASE_ADDR;
776e65e175bSOded Gabbay 	rc = hl_pci_set_inbound_region(hdev, 1, &inbound_region);
777e65e175bSOded Gabbay 	if (rc)
778e65e175bSOded Gabbay 		goto done;
779e65e175bSOded Gabbay 
780e65e175bSOded Gabbay 	/* Inbound Region 2 - Bar 4 - Point to HBM */
781e65e175bSOded Gabbay 	inbound_region.mode = PCI_BAR_MATCH_MODE;
782e65e175bSOded Gabbay 	inbound_region.bar = HBM_BAR_ID;
783e65e175bSOded Gabbay 	inbound_region.addr = DRAM_PHYS_BASE;
784e65e175bSOded Gabbay 	rc = hl_pci_set_inbound_region(hdev, 2, &inbound_region);
785e65e175bSOded Gabbay 	if (rc)
786e65e175bSOded Gabbay 		goto done;
787e65e175bSOded Gabbay 
788e65e175bSOded Gabbay 	/* Outbound Region 0 - Point to Host */
789e65e175bSOded Gabbay 	outbound_region.addr = HOST_PHYS_BASE;
790e65e175bSOded Gabbay 	outbound_region.size = HOST_PHYS_SIZE;
791e65e175bSOded Gabbay 	rc = hl_pci_set_outbound_region(hdev, &outbound_region);
792e65e175bSOded Gabbay 
793e65e175bSOded Gabbay done:
794e65e175bSOded Gabbay 	return rc;
795e65e175bSOded Gabbay }
796e65e175bSOded Gabbay 
gaudi_get_hw_state(struct hl_device * hdev)797e65e175bSOded Gabbay static enum hl_device_hw_state gaudi_get_hw_state(struct hl_device *hdev)
798e65e175bSOded Gabbay {
799e65e175bSOded Gabbay 	return RREG32(mmHW_STATE);
800e65e175bSOded Gabbay }
801e65e175bSOded Gabbay 
gaudi_early_init(struct hl_device * hdev)802e65e175bSOded Gabbay static int gaudi_early_init(struct hl_device *hdev)
803e65e175bSOded Gabbay {
804e65e175bSOded Gabbay 	struct asic_fixed_properties *prop = &hdev->asic_prop;
805e65e175bSOded Gabbay 	struct pci_dev *pdev = hdev->pdev;
806e65e175bSOded Gabbay 	resource_size_t pci_bar_size;
807e65e175bSOded Gabbay 	u32 fw_boot_status;
808e65e175bSOded Gabbay 	int rc;
809e65e175bSOded Gabbay 
810e65e175bSOded Gabbay 	rc = gaudi_set_fixed_properties(hdev);
811e65e175bSOded Gabbay 	if (rc) {
812e65e175bSOded Gabbay 		dev_err(hdev->dev, "Failed setting fixed properties\n");
813e65e175bSOded Gabbay 		return rc;
814e65e175bSOded Gabbay 	}
815e65e175bSOded Gabbay 
816e65e175bSOded Gabbay 	/* Check BAR sizes */
817e65e175bSOded Gabbay 	pci_bar_size = pci_resource_len(pdev, SRAM_BAR_ID);
818e65e175bSOded Gabbay 
819e65e175bSOded Gabbay 	if (pci_bar_size != SRAM_BAR_SIZE) {
820e65e175bSOded Gabbay 		dev_err(hdev->dev, "Not " HL_NAME "? BAR %d size %pa, expecting %llu\n",
821e65e175bSOded Gabbay 			SRAM_BAR_ID, &pci_bar_size, SRAM_BAR_SIZE);
822e65e175bSOded Gabbay 		rc = -ENODEV;
823e65e175bSOded Gabbay 		goto free_queue_props;
824e65e175bSOded Gabbay 	}
825e65e175bSOded Gabbay 
826e65e175bSOded Gabbay 	pci_bar_size = pci_resource_len(pdev, CFG_BAR_ID);
827e65e175bSOded Gabbay 
828e65e175bSOded Gabbay 	if (pci_bar_size != CFG_BAR_SIZE) {
829e65e175bSOded Gabbay 		dev_err(hdev->dev, "Not " HL_NAME "? BAR %d size %pa, expecting %llu\n",
830e65e175bSOded Gabbay 			CFG_BAR_ID, &pci_bar_size, CFG_BAR_SIZE);
831e65e175bSOded Gabbay 		rc = -ENODEV;
832e65e175bSOded Gabbay 		goto free_queue_props;
833e65e175bSOded Gabbay 	}
834e65e175bSOded Gabbay 
835e65e175bSOded Gabbay 	prop->dram_pci_bar_size = pci_resource_len(pdev, HBM_BAR_ID);
836e65e175bSOded Gabbay 	hdev->dram_pci_bar_start = pci_resource_start(pdev, HBM_BAR_ID);
837e65e175bSOded Gabbay 
838e65e175bSOded Gabbay 	/* If FW security is enabled at this point it means no access to ELBI */
839e65e175bSOded Gabbay 	if (hdev->asic_prop.fw_security_enabled) {
840e65e175bSOded Gabbay 		hdev->asic_prop.iatu_done_by_fw = true;
841e65e175bSOded Gabbay 
842e65e175bSOded Gabbay 		/*
843e65e175bSOded Gabbay 		 * GIC-security-bit can ONLY be set by CPUCP, so in this stage
844e65e175bSOded Gabbay 		 * decision can only be taken based on PCI ID security.
845e65e175bSOded Gabbay 		 */
846e65e175bSOded Gabbay 		hdev->asic_prop.gic_interrupts_enable = false;
847e65e175bSOded Gabbay 		goto pci_init;
848e65e175bSOded Gabbay 	}
849e65e175bSOded Gabbay 
850e65e175bSOded Gabbay 	rc = hl_pci_elbi_read(hdev, CFG_BASE + mmCPU_BOOT_DEV_STS0,
851e65e175bSOded Gabbay 				&fw_boot_status);
852e65e175bSOded Gabbay 	if (rc)
853e65e175bSOded Gabbay 		goto free_queue_props;
854e65e175bSOded Gabbay 
855e65e175bSOded Gabbay 	/* Check whether FW is configuring iATU */
856e65e175bSOded Gabbay 	if ((fw_boot_status & CPU_BOOT_DEV_STS0_ENABLED) &&
857e65e175bSOded Gabbay 			(fw_boot_status & CPU_BOOT_DEV_STS0_FW_IATU_CONF_EN))
858e65e175bSOded Gabbay 		hdev->asic_prop.iatu_done_by_fw = true;
859e65e175bSOded Gabbay 
860e65e175bSOded Gabbay pci_init:
861e65e175bSOded Gabbay 	rc = hl_pci_init(hdev);
862e65e175bSOded Gabbay 	if (rc)
863e65e175bSOded Gabbay 		goto free_queue_props;
864e65e175bSOded Gabbay 
865e65e175bSOded Gabbay 	/* Before continuing in the initialization, we need to read the preboot
866e65e175bSOded Gabbay 	 * version to determine whether we run with a security-enabled firmware
867e65e175bSOded Gabbay 	 */
868e65e175bSOded Gabbay 	rc = hl_fw_read_preboot_status(hdev);
869e65e175bSOded Gabbay 	if (rc) {
870e65e175bSOded Gabbay 		if (hdev->reset_on_preboot_fail)
87186b74d84SDafna Hirschfeld 			/* we are already on failure flow, so don't check if hw_fini fails. */
872e65e175bSOded Gabbay 			hdev->asic_funcs->hw_fini(hdev, true, false);
873e65e175bSOded Gabbay 		goto pci_fini;
874e65e175bSOded Gabbay 	}
875e65e175bSOded Gabbay 
876e65e175bSOded Gabbay 	if (gaudi_get_hw_state(hdev) == HL_DEVICE_HW_STATE_DIRTY) {
877e65e175bSOded Gabbay 		dev_dbg(hdev->dev, "H/W state is dirty, must reset before initializing\n");
87886b74d84SDafna Hirschfeld 		rc = hdev->asic_funcs->hw_fini(hdev, true, false);
87986b74d84SDafna Hirschfeld 		if (rc) {
88086b74d84SDafna Hirschfeld 			dev_err(hdev->dev, "failed to reset HW in dirty state (%d)\n", rc);
88186b74d84SDafna Hirschfeld 			goto pci_fini;
88286b74d84SDafna Hirschfeld 		}
883e65e175bSOded Gabbay 	}
884e65e175bSOded Gabbay 
885e65e175bSOded Gabbay 	return 0;
886e65e175bSOded Gabbay 
887e65e175bSOded Gabbay pci_fini:
888e65e175bSOded Gabbay 	hl_pci_fini(hdev);
889e65e175bSOded Gabbay free_queue_props:
890e65e175bSOded Gabbay 	kfree(hdev->asic_prop.hw_queues_props);
891e65e175bSOded Gabbay 	return rc;
892e65e175bSOded Gabbay }
893e65e175bSOded Gabbay 
gaudi_early_fini(struct hl_device * hdev)894e65e175bSOded Gabbay static int gaudi_early_fini(struct hl_device *hdev)
895e65e175bSOded Gabbay {
896e65e175bSOded Gabbay 	kfree(hdev->asic_prop.hw_queues_props);
897e65e175bSOded Gabbay 	hl_pci_fini(hdev);
898e65e175bSOded Gabbay 
899e65e175bSOded Gabbay 	return 0;
900e65e175bSOded Gabbay }
901e65e175bSOded Gabbay 
902e65e175bSOded Gabbay /**
903e65e175bSOded Gabbay  * gaudi_fetch_psoc_frequency - Fetch PSOC frequency values
904e65e175bSOded Gabbay  *
905e65e175bSOded Gabbay  * @hdev: pointer to hl_device structure
906e65e175bSOded Gabbay  *
907e65e175bSOded Gabbay  */
gaudi_fetch_psoc_frequency(struct hl_device * hdev)908e65e175bSOded Gabbay static int gaudi_fetch_psoc_frequency(struct hl_device *hdev)
909e65e175bSOded Gabbay {
910e65e175bSOded Gabbay 	u32 nr = 0, nf = 0, od = 0, div_fctr = 0, pll_clk, div_sel;
911e65e175bSOded Gabbay 	struct asic_fixed_properties *prop = &hdev->asic_prop;
912e65e175bSOded Gabbay 	u16 pll_freq_arr[HL_PLL_NUM_OUTPUTS], freq;
913e65e175bSOded Gabbay 	int rc;
914e65e175bSOded Gabbay 
915e65e175bSOded Gabbay 	if ((hdev->fw_components & FW_TYPE_LINUX) &&
916e65e175bSOded Gabbay 			(prop->fw_app_cpu_boot_dev_sts0 & CPU_BOOT_DEV_STS0_PLL_INFO_EN)) {
917e65e175bSOded Gabbay 		struct gaudi_device *gaudi = hdev->asic_specific;
918e65e175bSOded Gabbay 
919e65e175bSOded Gabbay 		if (!(gaudi->hw_cap_initialized & HW_CAP_CPU_Q))
920e65e175bSOded Gabbay 			return 0;
921e65e175bSOded Gabbay 
922e65e175bSOded Gabbay 		rc = hl_fw_cpucp_pll_info_get(hdev, HL_GAUDI_CPU_PLL, pll_freq_arr);
923e65e175bSOded Gabbay 
924e65e175bSOded Gabbay 		if (rc)
925e65e175bSOded Gabbay 			return rc;
926e65e175bSOded Gabbay 
927e65e175bSOded Gabbay 		freq = pll_freq_arr[2];
928e65e175bSOded Gabbay 	} else {
929e65e175bSOded Gabbay 		/* Backward compatibility */
930e65e175bSOded Gabbay 		div_fctr = RREG32(mmPSOC_CPU_PLL_DIV_FACTOR_2);
931e65e175bSOded Gabbay 		div_sel = RREG32(mmPSOC_CPU_PLL_DIV_SEL_2);
932e65e175bSOded Gabbay 		nr = RREG32(mmPSOC_CPU_PLL_NR);
933e65e175bSOded Gabbay 		nf = RREG32(mmPSOC_CPU_PLL_NF);
934e65e175bSOded Gabbay 		od = RREG32(mmPSOC_CPU_PLL_OD);
935e65e175bSOded Gabbay 
936e65e175bSOded Gabbay 		if (div_sel == DIV_SEL_REF_CLK ||
937e65e175bSOded Gabbay 				div_sel == DIV_SEL_DIVIDED_REF) {
938e65e175bSOded Gabbay 			if (div_sel == DIV_SEL_REF_CLK)
939e65e175bSOded Gabbay 				freq = PLL_REF_CLK;
940e65e175bSOded Gabbay 			else
941e65e175bSOded Gabbay 				freq = PLL_REF_CLK / (div_fctr + 1);
942e65e175bSOded Gabbay 		} else if (div_sel == DIV_SEL_PLL_CLK ||
943e65e175bSOded Gabbay 			div_sel == DIV_SEL_DIVIDED_PLL) {
944e65e175bSOded Gabbay 			pll_clk = PLL_REF_CLK * (nf + 1) /
945e65e175bSOded Gabbay 					((nr + 1) * (od + 1));
946e65e175bSOded Gabbay 			if (div_sel == DIV_SEL_PLL_CLK)
947e65e175bSOded Gabbay 				freq = pll_clk;
948e65e175bSOded Gabbay 			else
949e65e175bSOded Gabbay 				freq = pll_clk / (div_fctr + 1);
950e65e175bSOded Gabbay 		} else {
951e65e175bSOded Gabbay 			dev_warn(hdev->dev, "Received invalid div select value: %#x", div_sel);
952e65e175bSOded Gabbay 			freq = 0;
953e65e175bSOded Gabbay 		}
954e65e175bSOded Gabbay 	}
955e65e175bSOded Gabbay 
956e65e175bSOded Gabbay 	prop->psoc_timestamp_frequency = freq;
957e65e175bSOded Gabbay 	prop->psoc_pci_pll_nr = nr;
958e65e175bSOded Gabbay 	prop->psoc_pci_pll_nf = nf;
959e65e175bSOded Gabbay 	prop->psoc_pci_pll_od = od;
960e65e175bSOded Gabbay 	prop->psoc_pci_pll_div_factor = div_fctr;
961e65e175bSOded Gabbay 
962e65e175bSOded Gabbay 	return 0;
963e65e175bSOded Gabbay }
964e65e175bSOded Gabbay 
_gaudi_init_tpc_mem(struct hl_device * hdev,dma_addr_t tpc_kernel_src_addr,u32 tpc_kernel_size)965e65e175bSOded Gabbay static int _gaudi_init_tpc_mem(struct hl_device *hdev,
966e65e175bSOded Gabbay 		dma_addr_t tpc_kernel_src_addr, u32 tpc_kernel_size)
967e65e175bSOded Gabbay {
968e65e175bSOded Gabbay 	struct asic_fixed_properties *prop = &hdev->asic_prop;
969e65e175bSOded Gabbay 	struct packet_lin_dma *init_tpc_mem_pkt;
970e65e175bSOded Gabbay 	struct hl_cs_job *job;
971e65e175bSOded Gabbay 	struct hl_cb *cb;
972e65e175bSOded Gabbay 	u64 dst_addr;
973e65e175bSOded Gabbay 	u32 cb_size, ctl;
974e65e175bSOded Gabbay 	u8 tpc_id;
975e65e175bSOded Gabbay 	int rc;
976e65e175bSOded Gabbay 
977e65e175bSOded Gabbay 	cb = hl_cb_kernel_create(hdev, PAGE_SIZE, false);
978e65e175bSOded Gabbay 	if (!cb)
979e65e175bSOded Gabbay 		return -EFAULT;
980e65e175bSOded Gabbay 
981e65e175bSOded Gabbay 	init_tpc_mem_pkt = cb->kernel_address;
982e65e175bSOded Gabbay 	cb_size = sizeof(*init_tpc_mem_pkt);
983e65e175bSOded Gabbay 	memset(init_tpc_mem_pkt, 0, cb_size);
984e65e175bSOded Gabbay 
985e65e175bSOded Gabbay 	init_tpc_mem_pkt->tsize = cpu_to_le32(tpc_kernel_size);
986e65e175bSOded Gabbay 
987e65e175bSOded Gabbay 	ctl = FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_LIN_DMA);
988e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_LIN_DMA_CTL_LIN_MASK, 1);
989e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_RB_MASK, 1);
990e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_MB_MASK, 1);
991e65e175bSOded Gabbay 
992e65e175bSOded Gabbay 	init_tpc_mem_pkt->ctl = cpu_to_le32(ctl);
993e65e175bSOded Gabbay 
994e65e175bSOded Gabbay 	init_tpc_mem_pkt->src_addr = cpu_to_le64(tpc_kernel_src_addr);
995e65e175bSOded Gabbay 
996e65e175bSOded Gabbay 	/* TPC_CMD is configured with I$ prefetch enabled, so address should be aligned to 8KB */
997e65e175bSOded Gabbay 	dst_addr = FIELD_PREP(GAUDI_PKT_LIN_DMA_DST_ADDR_MASK,
998e65e175bSOded Gabbay 				round_up(prop->sram_user_base_address, SZ_8K));
999e65e175bSOded Gabbay 	init_tpc_mem_pkt->dst_addr |= cpu_to_le64(dst_addr);
1000e65e175bSOded Gabbay 
1001e65e175bSOded Gabbay 	job = hl_cs_allocate_job(hdev, QUEUE_TYPE_EXT, true);
1002e65e175bSOded Gabbay 	if (!job) {
1003e65e175bSOded Gabbay 		dev_err(hdev->dev, "Failed to allocate a new job\n");
1004e65e175bSOded Gabbay 		rc = -ENOMEM;
1005e65e175bSOded Gabbay 		goto release_cb;
1006e65e175bSOded Gabbay 	}
1007e65e175bSOded Gabbay 
1008e65e175bSOded Gabbay 	job->id = 0;
1009e65e175bSOded Gabbay 	job->user_cb = cb;
1010e65e175bSOded Gabbay 	atomic_inc(&job->user_cb->cs_cnt);
1011e65e175bSOded Gabbay 	job->user_cb_size = cb_size;
1012e65e175bSOded Gabbay 	job->hw_queue_id = GAUDI_QUEUE_ID_DMA_0_0;
1013e65e175bSOded Gabbay 	job->patched_cb = job->user_cb;
1014e65e175bSOded Gabbay 	job->job_cb_size = job->user_cb_size + sizeof(struct packet_msg_prot);
1015e65e175bSOded Gabbay 
1016e65e175bSOded Gabbay 	hl_debugfs_add_job(hdev, job);
1017e65e175bSOded Gabbay 
1018e65e175bSOded Gabbay 	rc = gaudi_send_job_on_qman0(hdev, job);
1019e65e175bSOded Gabbay 
1020e65e175bSOded Gabbay 	if (rc)
1021e65e175bSOded Gabbay 		goto free_job;
1022e65e175bSOded Gabbay 
1023e65e175bSOded Gabbay 	for (tpc_id = 0 ; tpc_id < TPC_NUMBER_OF_ENGINES ; tpc_id++) {
1024e65e175bSOded Gabbay 		rc = gaudi_run_tpc_kernel(hdev, dst_addr, tpc_id);
1025e65e175bSOded Gabbay 		if (rc)
1026e65e175bSOded Gabbay 			break;
1027e65e175bSOded Gabbay 	}
1028e65e175bSOded Gabbay 
1029e65e175bSOded Gabbay free_job:
1030e65e175bSOded Gabbay 	hl_userptr_delete_list(hdev, &job->userptr_list);
1031e65e175bSOded Gabbay 	hl_debugfs_remove_job(hdev, job);
1032e65e175bSOded Gabbay 	kfree(job);
1033e65e175bSOded Gabbay 	atomic_dec(&cb->cs_cnt);
1034e65e175bSOded Gabbay 
1035e65e175bSOded Gabbay release_cb:
1036e65e175bSOded Gabbay 	hl_cb_put(cb);
1037e65e175bSOded Gabbay 	hl_cb_destroy(&hdev->kernel_mem_mgr, cb->buf->handle);
1038e65e175bSOded Gabbay 
1039e65e175bSOded Gabbay 	return rc;
1040e65e175bSOded Gabbay }
1041e65e175bSOded Gabbay 
1042e65e175bSOded Gabbay /*
1043e65e175bSOded Gabbay  * gaudi_init_tpc_mem() - Initialize TPC memories.
1044e65e175bSOded Gabbay  * @hdev: Pointer to hl_device structure.
1045e65e175bSOded Gabbay  *
1046e65e175bSOded Gabbay  * Copy TPC kernel fw from firmware file and run it to initialize TPC memories.
1047e65e175bSOded Gabbay  *
1048e65e175bSOded Gabbay  * Return: 0 for success, negative value for error.
1049e65e175bSOded Gabbay  */
gaudi_init_tpc_mem(struct hl_device * hdev)1050e65e175bSOded Gabbay static int gaudi_init_tpc_mem(struct hl_device *hdev)
1051e65e175bSOded Gabbay {
1052e65e175bSOded Gabbay 	const struct firmware *fw;
1053e65e175bSOded Gabbay 	size_t fw_size;
1054e65e175bSOded Gabbay 	void *cpu_addr;
1055e65e175bSOded Gabbay 	dma_addr_t dma_handle;
1056e65e175bSOded Gabbay 	int rc, count = 5;
1057e65e175bSOded Gabbay 
1058e65e175bSOded Gabbay again:
1059e65e175bSOded Gabbay 	rc = request_firmware(&fw, GAUDI_TPC_FW_FILE, hdev->dev);
1060e65e175bSOded Gabbay 	if (rc == -EINTR && count-- > 0) {
1061e65e175bSOded Gabbay 		msleep(50);
1062e65e175bSOded Gabbay 		goto again;
1063e65e175bSOded Gabbay 	}
1064e65e175bSOded Gabbay 
1065e65e175bSOded Gabbay 	if (rc) {
1066e65e175bSOded Gabbay 		dev_err(hdev->dev, "Failed to load firmware file %s\n",
1067e65e175bSOded Gabbay 				GAUDI_TPC_FW_FILE);
1068e65e175bSOded Gabbay 		goto out;
1069e65e175bSOded Gabbay 	}
1070e65e175bSOded Gabbay 
1071e65e175bSOded Gabbay 	fw_size = fw->size;
1072e65e175bSOded Gabbay 	cpu_addr = hl_asic_dma_alloc_coherent(hdev, fw_size, &dma_handle, GFP_KERNEL | __GFP_ZERO);
1073e65e175bSOded Gabbay 	if (!cpu_addr) {
1074e65e175bSOded Gabbay 		dev_err(hdev->dev,
1075e65e175bSOded Gabbay 			"Failed to allocate %zu of dma memory for TPC kernel\n",
1076e65e175bSOded Gabbay 			fw_size);
1077e65e175bSOded Gabbay 		rc = -ENOMEM;
1078e65e175bSOded Gabbay 		goto out;
1079e65e175bSOded Gabbay 	}
1080e65e175bSOded Gabbay 
1081e65e175bSOded Gabbay 	memcpy(cpu_addr, fw->data, fw_size);
1082e65e175bSOded Gabbay 
1083e65e175bSOded Gabbay 	rc = _gaudi_init_tpc_mem(hdev, dma_handle, fw_size);
1084e65e175bSOded Gabbay 
1085e65e175bSOded Gabbay 	hl_asic_dma_free_coherent(hdev, fw->size, cpu_addr, dma_handle);
1086e65e175bSOded Gabbay 
1087e65e175bSOded Gabbay out:
1088e65e175bSOded Gabbay 	release_firmware(fw);
1089e65e175bSOded Gabbay 	return rc;
1090e65e175bSOded Gabbay }
1091e65e175bSOded Gabbay 
gaudi_collective_map_sobs(struct hl_device * hdev,u32 stream)1092e65e175bSOded Gabbay static void gaudi_collective_map_sobs(struct hl_device *hdev, u32 stream)
1093e65e175bSOded Gabbay {
1094e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
1095e65e175bSOded Gabbay 	struct gaudi_collective_properties *prop = &gaudi->collective_props;
1096e65e175bSOded Gabbay 	struct hl_hw_queue *q;
1097e65e175bSOded Gabbay 	u32 i, sob_id, sob_group_id, queue_id;
1098e65e175bSOded Gabbay 
1099e65e175bSOded Gabbay 	/* Iterate through SOB groups and assign a SOB for each slave queue */
1100e65e175bSOded Gabbay 	sob_group_id =
1101e65e175bSOded Gabbay 		stream * HL_RSVD_SOBS + prop->curr_sob_group_idx[stream];
1102e65e175bSOded Gabbay 	sob_id = prop->hw_sob_group[sob_group_id].base_sob_id;
1103e65e175bSOded Gabbay 
1104e65e175bSOded Gabbay 	queue_id = GAUDI_QUEUE_ID_NIC_0_0 + stream;
1105e65e175bSOded Gabbay 	for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++) {
1106e65e175bSOded Gabbay 		q = &hdev->kernel_queues[queue_id + (4 * i)];
1107e65e175bSOded Gabbay 		q->sync_stream_prop.collective_sob_id = sob_id + i;
1108e65e175bSOded Gabbay 	}
1109e65e175bSOded Gabbay 
1110e65e175bSOded Gabbay 	/* Both DMA5 and TPC7 use the same resources since only a single
1111e65e175bSOded Gabbay 	 * engine need to participate in the reduction process
1112e65e175bSOded Gabbay 	 */
1113e65e175bSOded Gabbay 	queue_id = GAUDI_QUEUE_ID_DMA_5_0 + stream;
1114e65e175bSOded Gabbay 	q = &hdev->kernel_queues[queue_id];
1115e65e175bSOded Gabbay 	q->sync_stream_prop.collective_sob_id =
1116e65e175bSOded Gabbay 			sob_id + NIC_NUMBER_OF_ENGINES;
1117e65e175bSOded Gabbay 
1118e65e175bSOded Gabbay 	queue_id = GAUDI_QUEUE_ID_TPC_7_0 + stream;
1119e65e175bSOded Gabbay 	q = &hdev->kernel_queues[queue_id];
1120e65e175bSOded Gabbay 	q->sync_stream_prop.collective_sob_id =
1121e65e175bSOded Gabbay 			sob_id + NIC_NUMBER_OF_ENGINES;
1122e65e175bSOded Gabbay }
1123e65e175bSOded Gabbay 
gaudi_sob_group_hw_reset(struct kref * ref)1124e65e175bSOded Gabbay static void gaudi_sob_group_hw_reset(struct kref *ref)
1125e65e175bSOded Gabbay {
1126e65e175bSOded Gabbay 	struct gaudi_hw_sob_group *hw_sob_group =
1127e65e175bSOded Gabbay 		container_of(ref, struct gaudi_hw_sob_group, kref);
1128e65e175bSOded Gabbay 	struct hl_device *hdev = hw_sob_group->hdev;
1129e65e175bSOded Gabbay 	int i;
1130e65e175bSOded Gabbay 
1131e65e175bSOded Gabbay 	for (i = 0 ; i < NUMBER_OF_SOBS_IN_GRP ; i++)
1132e65e175bSOded Gabbay 		WREG32((mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_SOB_OBJ_0 +
1133e65e175bSOded Gabbay 			(hw_sob_group->base_sob_id * 4) + (i * 4)), 0);
1134e65e175bSOded Gabbay 
1135e65e175bSOded Gabbay 	kref_init(&hw_sob_group->kref);
1136e65e175bSOded Gabbay }
1137e65e175bSOded Gabbay 
gaudi_sob_group_reset_error(struct kref * ref)1138e65e175bSOded Gabbay static void gaudi_sob_group_reset_error(struct kref *ref)
1139e65e175bSOded Gabbay {
1140e65e175bSOded Gabbay 	struct gaudi_hw_sob_group *hw_sob_group =
1141e65e175bSOded Gabbay 		container_of(ref, struct gaudi_hw_sob_group, kref);
1142e65e175bSOded Gabbay 	struct hl_device *hdev = hw_sob_group->hdev;
1143e65e175bSOded Gabbay 
1144e65e175bSOded Gabbay 	dev_crit(hdev->dev,
1145e65e175bSOded Gabbay 		"SOB release shouldn't be called here, base_sob_id: %d\n",
1146e65e175bSOded Gabbay 		hw_sob_group->base_sob_id);
1147e65e175bSOded Gabbay }
1148e65e175bSOded Gabbay 
gaudi_collective_mstr_sob_mask_set(struct gaudi_device * gaudi)1149e65e175bSOded Gabbay static void gaudi_collective_mstr_sob_mask_set(struct gaudi_device *gaudi)
1150e65e175bSOded Gabbay {
1151e65e175bSOded Gabbay 	struct gaudi_collective_properties *prop;
1152e65e175bSOded Gabbay 	int i;
1153e65e175bSOded Gabbay 
1154e65e175bSOded Gabbay 	prop = &gaudi->collective_props;
1155e65e175bSOded Gabbay 
1156e65e175bSOded Gabbay 	memset(prop->mstr_sob_mask, 0, sizeof(prop->mstr_sob_mask));
1157e65e175bSOded Gabbay 
1158e65e175bSOded Gabbay 	for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++)
1159e65e175bSOded Gabbay 		if (gaudi->hw_cap_initialized & BIT(HW_CAP_NIC_SHIFT + i))
1160e65e175bSOded Gabbay 			prop->mstr_sob_mask[i / HL_MAX_SOBS_PER_MONITOR] |=
1161e65e175bSOded Gabbay 					BIT(i % HL_MAX_SOBS_PER_MONITOR);
1162e65e175bSOded Gabbay 	/* Set collective engine bit */
1163e65e175bSOded Gabbay 	prop->mstr_sob_mask[i / HL_MAX_SOBS_PER_MONITOR] |=
1164e65e175bSOded Gabbay 				BIT(i % HL_MAX_SOBS_PER_MONITOR);
1165e65e175bSOded Gabbay }
1166e65e175bSOded Gabbay 
gaudi_collective_init(struct hl_device * hdev)1167e65e175bSOded Gabbay static int gaudi_collective_init(struct hl_device *hdev)
1168e65e175bSOded Gabbay {
1169e65e175bSOded Gabbay 	u32 i, sob_id, reserved_sobs_per_group;
1170e65e175bSOded Gabbay 	struct gaudi_collective_properties *prop;
1171e65e175bSOded Gabbay 	struct gaudi_device *gaudi;
1172e65e175bSOded Gabbay 
1173e65e175bSOded Gabbay 	gaudi = hdev->asic_specific;
1174e65e175bSOded Gabbay 	prop = &gaudi->collective_props;
1175e65e175bSOded Gabbay 	sob_id = hdev->asic_prop.collective_first_sob;
1176e65e175bSOded Gabbay 
1177e65e175bSOded Gabbay 	/* First sob in group must be aligned to HL_MAX_SOBS_PER_MONITOR */
1178e65e175bSOded Gabbay 	reserved_sobs_per_group =
1179e65e175bSOded Gabbay 		ALIGN(NUMBER_OF_SOBS_IN_GRP, HL_MAX_SOBS_PER_MONITOR);
1180e65e175bSOded Gabbay 
1181e65e175bSOded Gabbay 	/* Init SOB groups */
1182e65e175bSOded Gabbay 	for (i = 0 ; i < NUM_SOB_GROUPS; i++) {
1183e65e175bSOded Gabbay 		prop->hw_sob_group[i].hdev = hdev;
1184e65e175bSOded Gabbay 		prop->hw_sob_group[i].base_sob_id = sob_id;
1185e65e175bSOded Gabbay 		sob_id += reserved_sobs_per_group;
1186e65e175bSOded Gabbay 		gaudi_sob_group_hw_reset(&prop->hw_sob_group[i].kref);
1187e65e175bSOded Gabbay 	}
1188e65e175bSOded Gabbay 
1189e65e175bSOded Gabbay 	for (i = 0 ; i < QMAN_STREAMS; i++) {
1190e65e175bSOded Gabbay 		prop->next_sob_group_val[i] = 1;
1191e65e175bSOded Gabbay 		prop->curr_sob_group_idx[i] = 0;
1192e65e175bSOded Gabbay 		gaudi_collective_map_sobs(hdev, i);
1193e65e175bSOded Gabbay 	}
1194e65e175bSOded Gabbay 
1195e65e175bSOded Gabbay 	gaudi_collective_mstr_sob_mask_set(gaudi);
1196e65e175bSOded Gabbay 
1197e65e175bSOded Gabbay 	return 0;
1198e65e175bSOded Gabbay }
1199e65e175bSOded Gabbay 
gaudi_reset_sob_group(struct hl_device * hdev,u16 sob_group)1200e65e175bSOded Gabbay static void gaudi_reset_sob_group(struct hl_device *hdev, u16 sob_group)
1201e65e175bSOded Gabbay {
1202e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
1203e65e175bSOded Gabbay 	struct gaudi_collective_properties *cprop = &gaudi->collective_props;
1204e65e175bSOded Gabbay 
1205e65e175bSOded Gabbay 	kref_put(&cprop->hw_sob_group[sob_group].kref,
1206e65e175bSOded Gabbay 					gaudi_sob_group_hw_reset);
1207e65e175bSOded Gabbay }
1208e65e175bSOded Gabbay 
gaudi_collective_master_init_job(struct hl_device * hdev,struct hl_cs_job * job,u32 stream,u32 sob_group_offset)1209e65e175bSOded Gabbay static void gaudi_collective_master_init_job(struct hl_device *hdev,
1210e65e175bSOded Gabbay 		struct hl_cs_job *job, u32 stream, u32 sob_group_offset)
1211e65e175bSOded Gabbay {
1212e65e175bSOded Gabbay 	u32 master_sob_base, master_monitor, queue_id, cb_size = 0;
1213e65e175bSOded Gabbay 	struct gaudi_collective_properties *cprop;
1214e65e175bSOded Gabbay 	struct hl_gen_wait_properties wait_prop;
1215e65e175bSOded Gabbay 	struct hl_sync_stream_properties *prop;
1216e65e175bSOded Gabbay 	struct gaudi_device *gaudi;
1217e65e175bSOded Gabbay 
1218e65e175bSOded Gabbay 	gaudi = hdev->asic_specific;
1219e65e175bSOded Gabbay 	cprop = &gaudi->collective_props;
1220e65e175bSOded Gabbay 	queue_id = job->hw_queue_id;
1221e65e175bSOded Gabbay 	prop = &hdev->kernel_queues[queue_id].sync_stream_prop;
1222e65e175bSOded Gabbay 
1223e65e175bSOded Gabbay 	master_sob_base =
1224e65e175bSOded Gabbay 		cprop->hw_sob_group[sob_group_offset].base_sob_id;
1225e65e175bSOded Gabbay 	master_monitor = prop->collective_mstr_mon_id[0];
1226e65e175bSOded Gabbay 
1227e65e175bSOded Gabbay 	cprop->hw_sob_group[sob_group_offset].queue_id = queue_id;
1228e65e175bSOded Gabbay 
1229e65e175bSOded Gabbay 	dev_dbg(hdev->dev,
1230e65e175bSOded Gabbay 		"Generate master wait CBs, sob %d (mask %#x), val:0x%x, mon %u, q %d\n",
1231e65e175bSOded Gabbay 		master_sob_base, cprop->mstr_sob_mask[0],
1232e65e175bSOded Gabbay 		cprop->next_sob_group_val[stream],
1233e65e175bSOded Gabbay 		master_monitor, queue_id);
1234e65e175bSOded Gabbay 
1235e65e175bSOded Gabbay 	wait_prop.data = (void *) job->patched_cb;
1236e65e175bSOded Gabbay 	wait_prop.sob_base = master_sob_base;
1237e65e175bSOded Gabbay 	wait_prop.sob_mask = cprop->mstr_sob_mask[0];
1238e65e175bSOded Gabbay 	wait_prop.sob_val = cprop->next_sob_group_val[stream];
1239e65e175bSOded Gabbay 	wait_prop.mon_id = master_monitor;
1240e65e175bSOded Gabbay 	wait_prop.q_idx = queue_id;
1241e65e175bSOded Gabbay 	wait_prop.size = cb_size;
1242e65e175bSOded Gabbay 	cb_size += gaudi_gen_wait_cb(hdev, &wait_prop);
1243e65e175bSOded Gabbay 
1244e65e175bSOded Gabbay 	master_sob_base += HL_MAX_SOBS_PER_MONITOR;
1245e65e175bSOded Gabbay 	master_monitor = prop->collective_mstr_mon_id[1];
1246e65e175bSOded Gabbay 
1247e65e175bSOded Gabbay 	dev_dbg(hdev->dev,
1248e65e175bSOded Gabbay 		"Generate master wait CBs, sob %d (mask %#x), val:0x%x, mon %u, q %d\n",
1249e65e175bSOded Gabbay 		master_sob_base, cprop->mstr_sob_mask[1],
1250e65e175bSOded Gabbay 		cprop->next_sob_group_val[stream],
1251e65e175bSOded Gabbay 		master_monitor, queue_id);
1252e65e175bSOded Gabbay 
1253e65e175bSOded Gabbay 	wait_prop.sob_base = master_sob_base;
1254e65e175bSOded Gabbay 	wait_prop.sob_mask = cprop->mstr_sob_mask[1];
1255e65e175bSOded Gabbay 	wait_prop.mon_id = master_monitor;
1256e65e175bSOded Gabbay 	wait_prop.size = cb_size;
1257e65e175bSOded Gabbay 	cb_size += gaudi_gen_wait_cb(hdev, &wait_prop);
1258e65e175bSOded Gabbay }
1259e65e175bSOded Gabbay 
gaudi_collective_slave_init_job(struct hl_device * hdev,struct hl_cs_job * job,struct hl_cs_compl * cs_cmpl)1260e65e175bSOded Gabbay static void gaudi_collective_slave_init_job(struct hl_device *hdev,
1261e65e175bSOded Gabbay 		struct hl_cs_job *job, struct hl_cs_compl *cs_cmpl)
1262e65e175bSOded Gabbay {
1263e65e175bSOded Gabbay 	struct hl_gen_wait_properties wait_prop;
1264e65e175bSOded Gabbay 	struct hl_sync_stream_properties *prop;
1265e65e175bSOded Gabbay 	u32 queue_id, cb_size = 0;
1266e65e175bSOded Gabbay 
1267e65e175bSOded Gabbay 	queue_id = job->hw_queue_id;
1268e65e175bSOded Gabbay 	prop = &hdev->kernel_queues[queue_id].sync_stream_prop;
1269e65e175bSOded Gabbay 
1270e65e175bSOded Gabbay 	if (job->cs->encaps_signals) {
1271e65e175bSOded Gabbay 		/* use the encaps signal handle store earlier in the flow
1272e65e175bSOded Gabbay 		 * and set the SOB information from the encaps
1273e65e175bSOded Gabbay 		 * signals handle
1274e65e175bSOded Gabbay 		 */
1275e65e175bSOded Gabbay 		hl_hw_queue_encaps_sig_set_sob_info(hdev, job->cs, job,
1276e65e175bSOded Gabbay 						cs_cmpl);
1277e65e175bSOded Gabbay 
1278e65e175bSOded Gabbay 		dev_dbg(hdev->dev, "collective wait: Sequence %llu found, sob_id: %u,  wait for sob_val: %u\n",
1279e65e175bSOded Gabbay 				job->cs->sequence,
1280e65e175bSOded Gabbay 				cs_cmpl->hw_sob->sob_id,
1281e65e175bSOded Gabbay 				cs_cmpl->sob_val);
1282e65e175bSOded Gabbay 	}
1283e65e175bSOded Gabbay 
1284e65e175bSOded Gabbay 	/* Add to wait CBs using slave monitor */
1285e65e175bSOded Gabbay 	wait_prop.data = (void *) job->user_cb;
1286e65e175bSOded Gabbay 	wait_prop.sob_base = cs_cmpl->hw_sob->sob_id;
1287e65e175bSOded Gabbay 	wait_prop.sob_mask = 0x1;
1288e65e175bSOded Gabbay 	wait_prop.sob_val = cs_cmpl->sob_val;
1289e65e175bSOded Gabbay 	wait_prop.mon_id = prop->collective_slave_mon_id;
1290e65e175bSOded Gabbay 	wait_prop.q_idx = queue_id;
1291e65e175bSOded Gabbay 	wait_prop.size = cb_size;
1292e65e175bSOded Gabbay 
1293e65e175bSOded Gabbay 	dev_dbg(hdev->dev,
1294e65e175bSOded Gabbay 		"Generate slave wait CB, sob %d, val:%x, mon %d, q %d\n",
1295e65e175bSOded Gabbay 		cs_cmpl->hw_sob->sob_id, cs_cmpl->sob_val,
1296e65e175bSOded Gabbay 		prop->collective_slave_mon_id, queue_id);
1297e65e175bSOded Gabbay 
1298e65e175bSOded Gabbay 	cb_size += gaudi_gen_wait_cb(hdev, &wait_prop);
1299e65e175bSOded Gabbay 
1300e65e175bSOded Gabbay 	dev_dbg(hdev->dev,
1301e65e175bSOded Gabbay 		"generate signal CB, sob_id: %d, sob val: 1, q_idx: %d\n",
1302e65e175bSOded Gabbay 		prop->collective_sob_id, queue_id);
1303e65e175bSOded Gabbay 
1304e65e175bSOded Gabbay 	cb_size += gaudi_gen_signal_cb(hdev, job->user_cb,
1305e65e175bSOded Gabbay 			prop->collective_sob_id, cb_size, false);
1306e65e175bSOded Gabbay }
1307e65e175bSOded Gabbay 
gaudi_collective_wait_init_cs(struct hl_cs * cs)1308e65e175bSOded Gabbay static int gaudi_collective_wait_init_cs(struct hl_cs *cs)
1309e65e175bSOded Gabbay {
1310e65e175bSOded Gabbay 	struct hl_cs_compl *signal_cs_cmpl =
1311e65e175bSOded Gabbay 		container_of(cs->signal_fence, struct hl_cs_compl, base_fence);
1312e65e175bSOded Gabbay 	struct hl_cs_compl *cs_cmpl =
1313e65e175bSOded Gabbay 		container_of(cs->fence, struct hl_cs_compl, base_fence);
1314e65e175bSOded Gabbay 	struct hl_cs_encaps_sig_handle *handle = cs->encaps_sig_hdl;
1315e65e175bSOded Gabbay 	struct gaudi_collective_properties *cprop;
1316e65e175bSOded Gabbay 	u32 stream, queue_id, sob_group_offset;
1317e65e175bSOded Gabbay 	struct gaudi_device *gaudi;
1318e65e175bSOded Gabbay 	struct hl_device *hdev;
1319e65e175bSOded Gabbay 	struct hl_cs_job *job;
1320e65e175bSOded Gabbay 	struct hl_ctx *ctx;
1321e65e175bSOded Gabbay 
1322e65e175bSOded Gabbay 	ctx = cs->ctx;
1323e65e175bSOded Gabbay 	hdev = ctx->hdev;
1324e65e175bSOded Gabbay 	gaudi = hdev->asic_specific;
1325e65e175bSOded Gabbay 	cprop = &gaudi->collective_props;
1326e65e175bSOded Gabbay 
1327e65e175bSOded Gabbay 	if (cs->encaps_signals) {
1328e65e175bSOded Gabbay 		cs_cmpl->hw_sob = handle->hw_sob;
1329e65e175bSOded Gabbay 		/* at this checkpoint we only need the hw_sob pointer
1330e65e175bSOded Gabbay 		 * for the completion check before start going over the jobs
1331e65e175bSOded Gabbay 		 * of the master/slaves, the sob_value will be taken later on
1332e65e175bSOded Gabbay 		 * in gaudi_collective_slave_init_job depends on each
1333e65e175bSOded Gabbay 		 * job wait offset value.
1334e65e175bSOded Gabbay 		 */
1335e65e175bSOded Gabbay 		cs_cmpl->sob_val = 0;
1336e65e175bSOded Gabbay 	} else {
1337e65e175bSOded Gabbay 		/* copy the SOB id and value of the signal CS */
1338e65e175bSOded Gabbay 		cs_cmpl->hw_sob = signal_cs_cmpl->hw_sob;
1339e65e175bSOded Gabbay 		cs_cmpl->sob_val = signal_cs_cmpl->sob_val;
1340e65e175bSOded Gabbay 	}
1341e65e175bSOded Gabbay 
1342e65e175bSOded Gabbay 	/* check again if the signal cs already completed.
1343e65e175bSOded Gabbay 	 * if yes then don't send any wait cs since the hw_sob
1344e65e175bSOded Gabbay 	 * could be in reset already. if signal is not completed
1345e65e175bSOded Gabbay 	 * then get refcount to hw_sob to prevent resetting the sob
1346e65e175bSOded Gabbay 	 * while wait cs is not submitted.
1347e65e175bSOded Gabbay 	 * note that this check is protected by two locks,
1348e65e175bSOded Gabbay 	 * hw queue lock and completion object lock,
1349e65e175bSOded Gabbay 	 * and the same completion object lock also protects
1350e65e175bSOded Gabbay 	 * the hw_sob reset handler function.
1351e65e175bSOded Gabbay 	 * The hw_queue lock prevent out of sync of hw_sob
1352e65e175bSOded Gabbay 	 * refcount value, changed by signal/wait flows.
1353e65e175bSOded Gabbay 	 */
1354e65e175bSOded Gabbay 	spin_lock(&signal_cs_cmpl->lock);
1355e65e175bSOded Gabbay 
1356e65e175bSOded Gabbay 	if (completion_done(&cs->signal_fence->completion)) {
1357e65e175bSOded Gabbay 		spin_unlock(&signal_cs_cmpl->lock);
1358e65e175bSOded Gabbay 		return -EINVAL;
1359e65e175bSOded Gabbay 	}
1360e65e175bSOded Gabbay 	/* Increment kref since all slave queues are now waiting on it */
1361e65e175bSOded Gabbay 	kref_get(&cs_cmpl->hw_sob->kref);
1362e65e175bSOded Gabbay 
1363e65e175bSOded Gabbay 	spin_unlock(&signal_cs_cmpl->lock);
1364e65e175bSOded Gabbay 
1365e65e175bSOded Gabbay 	/* Calculate the stream from collective master queue (1st job) */
1366e65e175bSOded Gabbay 	job = list_first_entry(&cs->job_list, struct hl_cs_job, cs_node);
1367e65e175bSOded Gabbay 	stream = job->hw_queue_id % 4;
1368e65e175bSOded Gabbay 	sob_group_offset =
1369e65e175bSOded Gabbay 		stream * HL_RSVD_SOBS + cprop->curr_sob_group_idx[stream];
1370e65e175bSOded Gabbay 
1371e65e175bSOded Gabbay 	list_for_each_entry(job, &cs->job_list, cs_node) {
1372e65e175bSOded Gabbay 		queue_id = job->hw_queue_id;
1373e65e175bSOded Gabbay 
1374e65e175bSOded Gabbay 		if (hdev->kernel_queues[queue_id].collective_mode ==
1375e65e175bSOded Gabbay 				HL_COLLECTIVE_MASTER)
1376e65e175bSOded Gabbay 			gaudi_collective_master_init_job(hdev, job, stream,
1377e65e175bSOded Gabbay 						sob_group_offset);
1378e65e175bSOded Gabbay 		else
1379e65e175bSOded Gabbay 			gaudi_collective_slave_init_job(hdev, job, cs_cmpl);
1380e65e175bSOded Gabbay 	}
1381e65e175bSOded Gabbay 
1382e65e175bSOded Gabbay 	cs_cmpl->sob_group = sob_group_offset;
1383e65e175bSOded Gabbay 
1384e65e175bSOded Gabbay 	/* Handle sob group kref and wraparound */
1385e65e175bSOded Gabbay 	kref_get(&cprop->hw_sob_group[sob_group_offset].kref);
1386e65e175bSOded Gabbay 	cprop->next_sob_group_val[stream]++;
1387e65e175bSOded Gabbay 
1388e65e175bSOded Gabbay 	if (cprop->next_sob_group_val[stream] == HL_MAX_SOB_VAL) {
1389e65e175bSOded Gabbay 		/*
1390e65e175bSOded Gabbay 		 * Decrement as we reached the max value.
1391e65e175bSOded Gabbay 		 * The release function won't be called here as we've
1392e65e175bSOded Gabbay 		 * just incremented the refcount.
1393e65e175bSOded Gabbay 		 */
1394e65e175bSOded Gabbay 		kref_put(&cprop->hw_sob_group[sob_group_offset].kref,
1395e65e175bSOded Gabbay 				gaudi_sob_group_reset_error);
1396e65e175bSOded Gabbay 		cprop->next_sob_group_val[stream] = 1;
1397e65e175bSOded Gabbay 		/* only two SOBs are currently in use */
1398e65e175bSOded Gabbay 		cprop->curr_sob_group_idx[stream] =
1399e65e175bSOded Gabbay 			(cprop->curr_sob_group_idx[stream] + 1) &
1400e65e175bSOded Gabbay 							(HL_RSVD_SOBS - 1);
1401e65e175bSOded Gabbay 
1402e65e175bSOded Gabbay 		gaudi_collective_map_sobs(hdev, stream);
1403e65e175bSOded Gabbay 
1404e65e175bSOded Gabbay 		dev_dbg(hdev->dev, "switched to SOB group %d, stream: %d\n",
1405e65e175bSOded Gabbay 				cprop->curr_sob_group_idx[stream], stream);
1406e65e175bSOded Gabbay 	}
1407e65e175bSOded Gabbay 
1408e65e175bSOded Gabbay 	mb();
1409e65e175bSOded Gabbay 	hl_fence_put(cs->signal_fence);
1410e65e175bSOded Gabbay 	cs->signal_fence = NULL;
1411e65e175bSOded Gabbay 
1412e65e175bSOded Gabbay 	return 0;
1413e65e175bSOded Gabbay }
1414e65e175bSOded Gabbay 
gaudi_get_patched_cb_extra_size(u32 user_cb_size)1415e65e175bSOded Gabbay static u32 gaudi_get_patched_cb_extra_size(u32 user_cb_size)
1416e65e175bSOded Gabbay {
1417e65e175bSOded Gabbay 	u32 cacheline_end, additional_commands;
1418e65e175bSOded Gabbay 
1419e65e175bSOded Gabbay 	cacheline_end = round_up(user_cb_size, DEVICE_CACHE_LINE_SIZE);
1420e65e175bSOded Gabbay 	additional_commands = sizeof(struct packet_msg_prot) * 2;
1421e65e175bSOded Gabbay 
1422e65e175bSOded Gabbay 	if (user_cb_size + additional_commands > cacheline_end)
1423e65e175bSOded Gabbay 		return cacheline_end - user_cb_size + additional_commands;
1424e65e175bSOded Gabbay 	else
1425e65e175bSOded Gabbay 		return additional_commands;
1426e65e175bSOded Gabbay }
1427e65e175bSOded Gabbay 
gaudi_collective_wait_create_job(struct hl_device * hdev,struct hl_ctx * ctx,struct hl_cs * cs,enum hl_collective_mode mode,u32 queue_id,u32 wait_queue_id,u32 encaps_signal_offset)1428e65e175bSOded Gabbay static int gaudi_collective_wait_create_job(struct hl_device *hdev,
1429e65e175bSOded Gabbay 		struct hl_ctx *ctx, struct hl_cs *cs,
1430e65e175bSOded Gabbay 		enum hl_collective_mode mode, u32 queue_id, u32 wait_queue_id,
1431e65e175bSOded Gabbay 		u32 encaps_signal_offset)
1432e65e175bSOded Gabbay {
1433e65e175bSOded Gabbay 	struct hw_queue_properties *hw_queue_prop;
1434e65e175bSOded Gabbay 	struct hl_cs_counters_atomic *cntr;
1435e65e175bSOded Gabbay 	struct hl_cs_job *job;
1436e65e175bSOded Gabbay 	struct hl_cb *cb;
1437e65e175bSOded Gabbay 	u32 cb_size;
1438e65e175bSOded Gabbay 	bool patched_cb;
1439e65e175bSOded Gabbay 
1440e65e175bSOded Gabbay 	cntr = &hdev->aggregated_cs_counters;
1441e65e175bSOded Gabbay 
1442e65e175bSOded Gabbay 	if (mode == HL_COLLECTIVE_MASTER) {
1443e65e175bSOded Gabbay 		/* CB size of collective master queue contains
1444e65e175bSOded Gabbay 		 * 4 msg short packets for monitor 1 configuration
1445e65e175bSOded Gabbay 		 * 1 fence packet
1446e65e175bSOded Gabbay 		 * 4 msg short packets for monitor 2 configuration
1447e65e175bSOded Gabbay 		 * 1 fence packet
1448e65e175bSOded Gabbay 		 * 2 msg prot packets for completion and MSI
1449e65e175bSOded Gabbay 		 */
1450e65e175bSOded Gabbay 		cb_size = sizeof(struct packet_msg_short) * 8 +
1451e65e175bSOded Gabbay 				sizeof(struct packet_fence) * 2 +
1452e65e175bSOded Gabbay 				sizeof(struct packet_msg_prot) * 2;
1453e65e175bSOded Gabbay 		patched_cb = true;
1454e65e175bSOded Gabbay 	} else {
1455e65e175bSOded Gabbay 		/* CB size of collective slave queues contains
1456e65e175bSOded Gabbay 		 * 4 msg short packets for monitor configuration
1457e65e175bSOded Gabbay 		 * 1 fence packet
1458e65e175bSOded Gabbay 		 * 1 additional msg short packet for sob signal
1459e65e175bSOded Gabbay 		 */
1460e65e175bSOded Gabbay 		cb_size = sizeof(struct packet_msg_short) * 5 +
1461e65e175bSOded Gabbay 				sizeof(struct packet_fence);
1462e65e175bSOded Gabbay 		patched_cb = false;
1463e65e175bSOded Gabbay 	}
1464e65e175bSOded Gabbay 
1465e65e175bSOded Gabbay 	hw_queue_prop = &hdev->asic_prop.hw_queues_props[queue_id];
1466e65e175bSOded Gabbay 	job = hl_cs_allocate_job(hdev, hw_queue_prop->type, true);
1467e65e175bSOded Gabbay 	if (!job) {
1468e65e175bSOded Gabbay 		atomic64_inc(&ctx->cs_counters.out_of_mem_drop_cnt);
1469e65e175bSOded Gabbay 		atomic64_inc(&cntr->out_of_mem_drop_cnt);
1470e65e175bSOded Gabbay 		dev_err(hdev->dev, "Failed to allocate a new job\n");
1471e65e175bSOded Gabbay 		return -ENOMEM;
1472e65e175bSOded Gabbay 	}
1473e65e175bSOded Gabbay 
1474e65e175bSOded Gabbay 	/* Allocate internal mapped CB for non patched CBs */
1475583f12a8SOfir Bitton 	cb = hl_cb_kernel_create(hdev, cb_size, !patched_cb);
1476e65e175bSOded Gabbay 	if (!cb) {
1477e65e175bSOded Gabbay 		atomic64_inc(&ctx->cs_counters.out_of_mem_drop_cnt);
1478e65e175bSOded Gabbay 		atomic64_inc(&cntr->out_of_mem_drop_cnt);
1479e65e175bSOded Gabbay 		kfree(job);
1480e65e175bSOded Gabbay 		return -EFAULT;
1481e65e175bSOded Gabbay 	}
1482e65e175bSOded Gabbay 
1483e65e175bSOded Gabbay 	job->id = 0;
1484e65e175bSOded Gabbay 	job->cs = cs;
1485e65e175bSOded Gabbay 	job->user_cb = cb;
1486e65e175bSOded Gabbay 	atomic_inc(&job->user_cb->cs_cnt);
1487e65e175bSOded Gabbay 	job->user_cb_size = cb_size;
1488e65e175bSOded Gabbay 	job->hw_queue_id = queue_id;
1489e65e175bSOded Gabbay 
1490e65e175bSOded Gabbay 	/* since its guaranteed to have only one chunk in the collective wait
1491e65e175bSOded Gabbay 	 * cs, we can use this chunk to set the encapsulated signal offset
1492e65e175bSOded Gabbay 	 * in the jobs.
1493e65e175bSOded Gabbay 	 */
1494e65e175bSOded Gabbay 	if (cs->encaps_signals)
1495e65e175bSOded Gabbay 		job->encaps_sig_wait_offset = encaps_signal_offset;
1496e65e175bSOded Gabbay 
1497e65e175bSOded Gabbay 	/*
1498e65e175bSOded Gabbay 	 * No need in parsing, user CB is the patched CB.
1499e65e175bSOded Gabbay 	 * We call hl_cb_destroy() out of two reasons - we don't need
1500e65e175bSOded Gabbay 	 * the CB in the CB idr anymore and to decrement its refcount as
1501e65e175bSOded Gabbay 	 * it was incremented inside hl_cb_kernel_create().
1502e65e175bSOded Gabbay 	 */
1503e65e175bSOded Gabbay 	if (patched_cb)
1504e65e175bSOded Gabbay 		job->patched_cb = job->user_cb;
1505e65e175bSOded Gabbay 	else
1506e65e175bSOded Gabbay 		job->patched_cb = NULL;
1507e65e175bSOded Gabbay 
1508e65e175bSOded Gabbay 	job->job_cb_size = job->user_cb_size;
1509e65e175bSOded Gabbay 	hl_cb_destroy(&hdev->kernel_mem_mgr, cb->buf->handle);
1510e65e175bSOded Gabbay 
1511e65e175bSOded Gabbay 	/* increment refcount as for external queues we get completion */
1512e65e175bSOded Gabbay 	if (hw_queue_prop->type == QUEUE_TYPE_EXT)
1513e65e175bSOded Gabbay 		cs_get(cs);
1514e65e175bSOded Gabbay 
1515e65e175bSOded Gabbay 	cs->jobs_in_queue_cnt[job->hw_queue_id]++;
1516e65e175bSOded Gabbay 
1517e65e175bSOded Gabbay 	list_add_tail(&job->cs_node, &cs->job_list);
1518e65e175bSOded Gabbay 
1519e65e175bSOded Gabbay 	hl_debugfs_add_job(hdev, job);
1520e65e175bSOded Gabbay 
1521e65e175bSOded Gabbay 	return 0;
1522e65e175bSOded Gabbay }
1523e65e175bSOded Gabbay 
gaudi_collective_wait_create_jobs(struct hl_device * hdev,struct hl_ctx * ctx,struct hl_cs * cs,u32 wait_queue_id,u32 collective_engine_id,u32 encaps_signal_offset)1524e65e175bSOded Gabbay static int gaudi_collective_wait_create_jobs(struct hl_device *hdev,
1525e65e175bSOded Gabbay 		struct hl_ctx *ctx, struct hl_cs *cs,
1526e65e175bSOded Gabbay 		u32 wait_queue_id, u32 collective_engine_id,
1527e65e175bSOded Gabbay 		u32 encaps_signal_offset)
1528e65e175bSOded Gabbay {
1529e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
1530e65e175bSOded Gabbay 	struct hw_queue_properties *hw_queue_prop;
1531e65e175bSOded Gabbay 	u32 queue_id, collective_queue, num_jobs;
1532e65e175bSOded Gabbay 	u32 stream, nic_queue, nic_idx = 0;
1533e65e175bSOded Gabbay 	bool skip;
1534e65e175bSOded Gabbay 	int i, rc = 0;
1535e65e175bSOded Gabbay 
1536e65e175bSOded Gabbay 	/* Verify wait queue id is configured as master */
1537e65e175bSOded Gabbay 	hw_queue_prop = &hdev->asic_prop.hw_queues_props[wait_queue_id];
1538e65e175bSOded Gabbay 	if (!(hw_queue_prop->collective_mode == HL_COLLECTIVE_MASTER)) {
1539e65e175bSOded Gabbay 		dev_err(hdev->dev,
1540e65e175bSOded Gabbay 			"Queue %d is not configured as collective master\n",
1541e65e175bSOded Gabbay 			wait_queue_id);
1542e65e175bSOded Gabbay 		return -EINVAL;
1543e65e175bSOded Gabbay 	}
1544e65e175bSOded Gabbay 
1545e65e175bSOded Gabbay 	/* Verify engine id is supported */
1546e65e175bSOded Gabbay 	if (collective_engine_id != GAUDI_ENGINE_ID_DMA_5 &&
1547e65e175bSOded Gabbay 			collective_engine_id != GAUDI_ENGINE_ID_TPC_7) {
1548e65e175bSOded Gabbay 		dev_err(hdev->dev,
1549e65e175bSOded Gabbay 			"Collective wait does not support engine %u\n",
1550e65e175bSOded Gabbay 			collective_engine_id);
1551e65e175bSOded Gabbay 		return -EINVAL;
1552e65e175bSOded Gabbay 	}
1553e65e175bSOded Gabbay 
1554e65e175bSOded Gabbay 	stream = wait_queue_id % 4;
1555e65e175bSOded Gabbay 
1556e65e175bSOded Gabbay 	if (collective_engine_id == GAUDI_ENGINE_ID_DMA_5)
1557e65e175bSOded Gabbay 		collective_queue = GAUDI_QUEUE_ID_DMA_5_0 + stream;
1558e65e175bSOded Gabbay 	else
1559e65e175bSOded Gabbay 		collective_queue = GAUDI_QUEUE_ID_TPC_7_0 + stream;
1560e65e175bSOded Gabbay 
1561e65e175bSOded Gabbay 	num_jobs = NUMBER_OF_SOBS_IN_GRP + 1;
1562e65e175bSOded Gabbay 	nic_queue = GAUDI_QUEUE_ID_NIC_0_0 + stream;
1563e65e175bSOded Gabbay 
1564e65e175bSOded Gabbay 	/* First job goes to the collective master queue, it will wait for
1565e65e175bSOded Gabbay 	 * the collective slave queues to finish execution.
1566e65e175bSOded Gabbay 	 * The synchronization is done using two monitors:
1567e65e175bSOded Gabbay 	 * First monitor for NICs 0-7, second monitor for NICs 8-9 and the
1568e65e175bSOded Gabbay 	 * reduction engine (DMA5/TPC7).
1569e65e175bSOded Gabbay 	 *
1570e65e175bSOded Gabbay 	 * Rest of the jobs goes to the collective slave queues which will
1571e65e175bSOded Gabbay 	 * all wait for the user to signal sob 'cs_cmpl->sob_val'.
1572e65e175bSOded Gabbay 	 */
1573e65e175bSOded Gabbay 	for (i = 0 ; i < num_jobs ; i++) {
1574e65e175bSOded Gabbay 		if (i == 0) {
1575e65e175bSOded Gabbay 			queue_id = wait_queue_id;
1576e65e175bSOded Gabbay 			rc = gaudi_collective_wait_create_job(hdev, ctx, cs,
1577e65e175bSOded Gabbay 				HL_COLLECTIVE_MASTER, queue_id,
1578e65e175bSOded Gabbay 				wait_queue_id, encaps_signal_offset);
1579e65e175bSOded Gabbay 		} else {
1580e65e175bSOded Gabbay 			if (nic_idx < NIC_NUMBER_OF_ENGINES) {
1581e65e175bSOded Gabbay 				if (gaudi->hw_cap_initialized &
1582e65e175bSOded Gabbay 					BIT(HW_CAP_NIC_SHIFT + nic_idx))
1583e65e175bSOded Gabbay 					skip = false;
1584e65e175bSOded Gabbay 				else
1585e65e175bSOded Gabbay 					skip = true;
1586e65e175bSOded Gabbay 
1587e65e175bSOded Gabbay 				queue_id = nic_queue;
1588e65e175bSOded Gabbay 				nic_queue += 4;
1589e65e175bSOded Gabbay 				nic_idx++;
1590e65e175bSOded Gabbay 
1591e65e175bSOded Gabbay 				if (skip)
1592e65e175bSOded Gabbay 					continue;
1593e65e175bSOded Gabbay 			} else {
1594e65e175bSOded Gabbay 				queue_id = collective_queue;
1595e65e175bSOded Gabbay 			}
1596e65e175bSOded Gabbay 
1597e65e175bSOded Gabbay 			rc = gaudi_collective_wait_create_job(hdev, ctx, cs,
1598e65e175bSOded Gabbay 				HL_COLLECTIVE_SLAVE, queue_id,
1599e65e175bSOded Gabbay 				wait_queue_id, encaps_signal_offset);
1600e65e175bSOded Gabbay 		}
1601e65e175bSOded Gabbay 
1602e65e175bSOded Gabbay 		if (rc)
1603e65e175bSOded Gabbay 			return rc;
1604e65e175bSOded Gabbay 	}
1605e65e175bSOded Gabbay 
1606e65e175bSOded Gabbay 	return rc;
1607e65e175bSOded Gabbay }
1608e65e175bSOded Gabbay 
gaudi_late_init(struct hl_device * hdev)1609e65e175bSOded Gabbay static int gaudi_late_init(struct hl_device *hdev)
1610e65e175bSOded Gabbay {
1611e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
1612e65e175bSOded Gabbay 	int rc;
1613e65e175bSOded Gabbay 
1614e65e175bSOded Gabbay 	rc = gaudi->cpucp_info_get(hdev);
1615e65e175bSOded Gabbay 	if (rc) {
1616e65e175bSOded Gabbay 		dev_err(hdev->dev, "Failed to get cpucp info\n");
1617e65e175bSOded Gabbay 		return rc;
1618e65e175bSOded Gabbay 	}
1619e65e175bSOded Gabbay 
1620e65e175bSOded Gabbay 	if ((hdev->card_type == cpucp_card_type_pci) &&
1621e65e175bSOded Gabbay 			(hdev->nic_ports_mask & 0x3)) {
1622e65e175bSOded Gabbay 		dev_info(hdev->dev,
1623e65e175bSOded Gabbay 			"PCI card detected, only 8 ports are enabled\n");
1624e65e175bSOded Gabbay 		hdev->nic_ports_mask &= ~0x3;
1625e65e175bSOded Gabbay 
1626e65e175bSOded Gabbay 		/* Stop and disable unused NIC QMANs */
1627e65e175bSOded Gabbay 		WREG32(mmNIC0_QM0_GLBL_CFG1, NIC0_QM0_GLBL_CFG1_PQF_STOP_MASK |
1628e65e175bSOded Gabbay 					NIC0_QM0_GLBL_CFG1_CQF_STOP_MASK |
1629e65e175bSOded Gabbay 					NIC0_QM0_GLBL_CFG1_CP_STOP_MASK);
1630e65e175bSOded Gabbay 
1631e65e175bSOded Gabbay 		WREG32(mmNIC0_QM1_GLBL_CFG1, NIC0_QM0_GLBL_CFG1_PQF_STOP_MASK |
1632e65e175bSOded Gabbay 					NIC0_QM0_GLBL_CFG1_CQF_STOP_MASK |
1633e65e175bSOded Gabbay 					NIC0_QM0_GLBL_CFG1_CP_STOP_MASK);
1634e65e175bSOded Gabbay 
1635e65e175bSOded Gabbay 		WREG32(mmNIC0_QM0_GLBL_CFG0, 0);
1636e65e175bSOded Gabbay 		WREG32(mmNIC0_QM1_GLBL_CFG0, 0);
1637e65e175bSOded Gabbay 
1638e65e175bSOded Gabbay 		gaudi->hw_cap_initialized &= ~(HW_CAP_NIC0 | HW_CAP_NIC1);
1639e65e175bSOded Gabbay 	}
1640e65e175bSOded Gabbay 
1641e65e175bSOded Gabbay 	rc = hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_ENABLE_PCI_ACCESS, 0x0);
1642*ecda35d4SOhad Sharabi 	if (rc)
1643e65e175bSOded Gabbay 		return rc;
1644e65e175bSOded Gabbay 
1645e65e175bSOded Gabbay 	/* Scrub both SRAM and DRAM */
1646e65e175bSOded Gabbay 	rc = hdev->asic_funcs->scrub_device_mem(hdev);
1647e65e175bSOded Gabbay 	if (rc)
1648e65e175bSOded Gabbay 		goto disable_pci_access;
1649e65e175bSOded Gabbay 
1650e65e175bSOded Gabbay 	rc = gaudi_fetch_psoc_frequency(hdev);
1651e65e175bSOded Gabbay 	if (rc) {
1652e65e175bSOded Gabbay 		dev_err(hdev->dev, "Failed to fetch psoc frequency\n");
1653e65e175bSOded Gabbay 		goto disable_pci_access;
1654e65e175bSOded Gabbay 	}
1655e65e175bSOded Gabbay 
1656e65e175bSOded Gabbay 	rc = gaudi_mmu_clear_pgt_range(hdev);
1657e65e175bSOded Gabbay 	if (rc) {
1658e65e175bSOded Gabbay 		dev_err(hdev->dev, "Failed to clear MMU page tables range\n");
1659e65e175bSOded Gabbay 		goto disable_pci_access;
1660e65e175bSOded Gabbay 	}
1661e65e175bSOded Gabbay 
1662e65e175bSOded Gabbay 	rc = gaudi_init_tpc_mem(hdev);
1663e65e175bSOded Gabbay 	if (rc) {
1664e65e175bSOded Gabbay 		dev_err(hdev->dev, "Failed to initialize TPC memories\n");
1665e65e175bSOded Gabbay 		goto disable_pci_access;
1666e65e175bSOded Gabbay 	}
1667e65e175bSOded Gabbay 
1668e65e175bSOded Gabbay 	rc = gaudi_collective_init(hdev);
1669e65e175bSOded Gabbay 	if (rc) {
1670e65e175bSOded Gabbay 		dev_err(hdev->dev, "Failed to init collective\n");
1671e65e175bSOded Gabbay 		goto disable_pci_access;
1672e65e175bSOded Gabbay 	}
1673e65e175bSOded Gabbay 
1674e65e175bSOded Gabbay 	/* We only support a single ASID for the user, so for the sake of optimization, just
1675e65e175bSOded Gabbay 	 * initialize the ASID one time during device initialization with the fixed value of 1
1676e65e175bSOded Gabbay 	 */
1677e65e175bSOded Gabbay 	gaudi_mmu_prepare(hdev, 1);
1678e65e175bSOded Gabbay 
1679e65e175bSOded Gabbay 	hl_fw_set_pll_profile(hdev);
1680e65e175bSOded Gabbay 
1681e65e175bSOded Gabbay 	return 0;
1682e65e175bSOded Gabbay 
1683e65e175bSOded Gabbay disable_pci_access:
1684e65e175bSOded Gabbay 	hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_DISABLE_PCI_ACCESS, 0x0);
1685e65e175bSOded Gabbay 
1686e65e175bSOded Gabbay 	return rc;
1687e65e175bSOded Gabbay }
1688e65e175bSOded Gabbay 
gaudi_late_fini(struct hl_device * hdev)1689e65e175bSOded Gabbay static void gaudi_late_fini(struct hl_device *hdev)
1690e65e175bSOded Gabbay {
1691e65e175bSOded Gabbay 	hl_hwmon_release_resources(hdev);
1692e65e175bSOded Gabbay }
1693e65e175bSOded Gabbay 
gaudi_alloc_cpu_accessible_dma_mem(struct hl_device * hdev)1694e65e175bSOded Gabbay static int gaudi_alloc_cpu_accessible_dma_mem(struct hl_device *hdev)
1695e65e175bSOded Gabbay {
1696e65e175bSOded Gabbay 	dma_addr_t dma_addr_arr[GAUDI_ALLOC_CPU_MEM_RETRY_CNT] = {}, end_addr;
1697e65e175bSOded Gabbay 	void *virt_addr_arr[GAUDI_ALLOC_CPU_MEM_RETRY_CNT] = {};
1698e65e175bSOded Gabbay 	int i, j, rc = 0;
1699e65e175bSOded Gabbay 
1700e65e175bSOded Gabbay 	/*
1701e65e175bSOded Gabbay 	 * The device CPU works with 40-bits addresses, while bit 39 must be set
1702e65e175bSOded Gabbay 	 * to '1' when accessing the host.
1703e65e175bSOded Gabbay 	 * Bits 49:39 of the full host address are saved for a later
1704e65e175bSOded Gabbay 	 * configuration of the HW to perform extension to 50 bits.
1705e65e175bSOded Gabbay 	 * Because there is a single HW register that holds the extension bits,
1706e65e175bSOded Gabbay 	 * these bits must be identical in all allocated range.
1707e65e175bSOded Gabbay 	 */
1708e65e175bSOded Gabbay 
1709e65e175bSOded Gabbay 	for (i = 0 ; i < GAUDI_ALLOC_CPU_MEM_RETRY_CNT ; i++) {
1710e65e175bSOded Gabbay 		virt_addr_arr[i] = hl_asic_dma_alloc_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE,
1711e65e175bSOded Gabbay 								&dma_addr_arr[i],
1712e65e175bSOded Gabbay 								GFP_KERNEL | __GFP_ZERO);
1713e65e175bSOded Gabbay 		if (!virt_addr_arr[i]) {
1714e65e175bSOded Gabbay 			rc = -ENOMEM;
1715e65e175bSOded Gabbay 			goto free_dma_mem_arr;
1716e65e175bSOded Gabbay 		}
1717e65e175bSOded Gabbay 
1718e65e175bSOded Gabbay 		end_addr = dma_addr_arr[i] + HL_CPU_ACCESSIBLE_MEM_SIZE - 1;
1719e65e175bSOded Gabbay 		if (GAUDI_CPU_PCI_MSB_ADDR(dma_addr_arr[i]) ==
1720e65e175bSOded Gabbay 				GAUDI_CPU_PCI_MSB_ADDR(end_addr))
1721e65e175bSOded Gabbay 			break;
1722e65e175bSOded Gabbay 	}
1723e65e175bSOded Gabbay 
1724e65e175bSOded Gabbay 	if (i == GAUDI_ALLOC_CPU_MEM_RETRY_CNT) {
1725e65e175bSOded Gabbay 		dev_err(hdev->dev,
1726e65e175bSOded Gabbay 			"MSB of CPU accessible DMA memory are not identical in all range\n");
1727e65e175bSOded Gabbay 		rc = -EFAULT;
1728e65e175bSOded Gabbay 		goto free_dma_mem_arr;
1729e65e175bSOded Gabbay 	}
1730e65e175bSOded Gabbay 
1731e65e175bSOded Gabbay 	hdev->cpu_accessible_dma_mem = virt_addr_arr[i];
1732e65e175bSOded Gabbay 	hdev->cpu_accessible_dma_address = dma_addr_arr[i];
1733e65e175bSOded Gabbay 	hdev->cpu_pci_msb_addr =
1734e65e175bSOded Gabbay 		GAUDI_CPU_PCI_MSB_ADDR(hdev->cpu_accessible_dma_address);
1735e65e175bSOded Gabbay 
1736e65e175bSOded Gabbay 	if (!hdev->asic_prop.fw_security_enabled)
1737e65e175bSOded Gabbay 		GAUDI_PCI_TO_CPU_ADDR(hdev->cpu_accessible_dma_address);
1738e65e175bSOded Gabbay 
1739e65e175bSOded Gabbay free_dma_mem_arr:
1740e65e175bSOded Gabbay 	for (j = 0 ; j < i ; j++)
1741e65e175bSOded Gabbay 		hl_asic_dma_free_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE, virt_addr_arr[j],
1742e65e175bSOded Gabbay 						dma_addr_arr[j]);
1743e65e175bSOded Gabbay 
1744e65e175bSOded Gabbay 	return rc;
1745e65e175bSOded Gabbay }
1746e65e175bSOded Gabbay 
gaudi_free_internal_qmans_pq_mem(struct hl_device * hdev)1747e65e175bSOded Gabbay static void gaudi_free_internal_qmans_pq_mem(struct hl_device *hdev)
1748e65e175bSOded Gabbay {
1749e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
1750e65e175bSOded Gabbay 	struct gaudi_internal_qman_info *q;
1751e65e175bSOded Gabbay 	u32 i;
1752e65e175bSOded Gabbay 
1753e65e175bSOded Gabbay 	for (i = 0 ; i < GAUDI_QUEUE_ID_SIZE ; i++) {
1754e65e175bSOded Gabbay 		q = &gaudi->internal_qmans[i];
1755e65e175bSOded Gabbay 		if (!q->pq_kernel_addr)
1756e65e175bSOded Gabbay 			continue;
1757e65e175bSOded Gabbay 		hl_asic_dma_free_coherent(hdev, q->pq_size, q->pq_kernel_addr, q->pq_dma_addr);
1758e65e175bSOded Gabbay 	}
1759e65e175bSOded Gabbay }
1760e65e175bSOded Gabbay 
gaudi_alloc_internal_qmans_pq_mem(struct hl_device * hdev)1761e65e175bSOded Gabbay static int gaudi_alloc_internal_qmans_pq_mem(struct hl_device *hdev)
1762e65e175bSOded Gabbay {
1763e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
1764e65e175bSOded Gabbay 	struct gaudi_internal_qman_info *q;
1765e65e175bSOded Gabbay 	int rc, i;
1766e65e175bSOded Gabbay 
1767e65e175bSOded Gabbay 	for (i = 0 ; i < GAUDI_QUEUE_ID_SIZE ; i++) {
1768e65e175bSOded Gabbay 		if (gaudi_queue_type[i] != QUEUE_TYPE_INT)
1769e65e175bSOded Gabbay 			continue;
1770e65e175bSOded Gabbay 
1771e65e175bSOded Gabbay 		q = &gaudi->internal_qmans[i];
1772e65e175bSOded Gabbay 
1773e65e175bSOded Gabbay 		switch (i) {
1774e65e175bSOded Gabbay 		case GAUDI_QUEUE_ID_DMA_2_0 ... GAUDI_QUEUE_ID_DMA_7_3:
1775e65e175bSOded Gabbay 			q->pq_size = HBM_DMA_QMAN_SIZE_IN_BYTES;
1776e65e175bSOded Gabbay 			break;
1777e65e175bSOded Gabbay 		case GAUDI_QUEUE_ID_MME_0_0 ... GAUDI_QUEUE_ID_MME_1_3:
1778e65e175bSOded Gabbay 			q->pq_size = MME_QMAN_SIZE_IN_BYTES;
1779e65e175bSOded Gabbay 			break;
1780e65e175bSOded Gabbay 		case GAUDI_QUEUE_ID_TPC_0_0 ... GAUDI_QUEUE_ID_TPC_7_3:
1781e65e175bSOded Gabbay 			q->pq_size = TPC_QMAN_SIZE_IN_BYTES;
1782e65e175bSOded Gabbay 			break;
1783e65e175bSOded Gabbay 		case GAUDI_QUEUE_ID_NIC_0_0 ... GAUDI_QUEUE_ID_NIC_9_3:
1784e65e175bSOded Gabbay 			q->pq_size = NIC_QMAN_SIZE_IN_BYTES;
1785e65e175bSOded Gabbay 			break;
1786e65e175bSOded Gabbay 		default:
1787e65e175bSOded Gabbay 			dev_err(hdev->dev, "Bad internal queue index %d", i);
1788e65e175bSOded Gabbay 			rc = -EINVAL;
1789e65e175bSOded Gabbay 			goto free_internal_qmans_pq_mem;
1790e65e175bSOded Gabbay 		}
1791e65e175bSOded Gabbay 
1792e65e175bSOded Gabbay 		q->pq_kernel_addr = hl_asic_dma_alloc_coherent(hdev, q->pq_size, &q->pq_dma_addr,
1793e65e175bSOded Gabbay 								GFP_KERNEL | __GFP_ZERO);
1794e65e175bSOded Gabbay 		if (!q->pq_kernel_addr) {
1795e65e175bSOded Gabbay 			rc = -ENOMEM;
1796e65e175bSOded Gabbay 			goto free_internal_qmans_pq_mem;
1797e65e175bSOded Gabbay 		}
1798e65e175bSOded Gabbay 	}
1799e65e175bSOded Gabbay 
1800e65e175bSOded Gabbay 	return 0;
1801e65e175bSOded Gabbay 
1802e65e175bSOded Gabbay free_internal_qmans_pq_mem:
1803e65e175bSOded Gabbay 	gaudi_free_internal_qmans_pq_mem(hdev);
1804e65e175bSOded Gabbay 	return rc;
1805e65e175bSOded Gabbay }
1806e65e175bSOded Gabbay 
gaudi_set_pci_memory_regions(struct hl_device * hdev)1807e65e175bSOded Gabbay static void gaudi_set_pci_memory_regions(struct hl_device *hdev)
1808e65e175bSOded Gabbay {
1809e65e175bSOded Gabbay 	struct asic_fixed_properties *prop = &hdev->asic_prop;
1810e65e175bSOded Gabbay 	struct pci_mem_region *region;
1811e65e175bSOded Gabbay 
1812e65e175bSOded Gabbay 	/* CFG */
1813e65e175bSOded Gabbay 	region = &hdev->pci_mem_region[PCI_REGION_CFG];
1814e65e175bSOded Gabbay 	region->region_base = CFG_BASE;
1815e65e175bSOded Gabbay 	region->region_size = CFG_SIZE;
1816e65e175bSOded Gabbay 	region->offset_in_bar = CFG_BASE - SPI_FLASH_BASE_ADDR;
1817e65e175bSOded Gabbay 	region->bar_size = CFG_BAR_SIZE;
1818e65e175bSOded Gabbay 	region->bar_id = CFG_BAR_ID;
1819e65e175bSOded Gabbay 	region->used = 1;
1820e65e175bSOded Gabbay 
1821e65e175bSOded Gabbay 	/* SRAM */
1822e65e175bSOded Gabbay 	region = &hdev->pci_mem_region[PCI_REGION_SRAM];
1823e65e175bSOded Gabbay 	region->region_base = SRAM_BASE_ADDR;
1824e65e175bSOded Gabbay 	region->region_size = SRAM_SIZE;
1825e65e175bSOded Gabbay 	region->offset_in_bar = 0;
1826e65e175bSOded Gabbay 	region->bar_size = SRAM_BAR_SIZE;
1827e65e175bSOded Gabbay 	region->bar_id = SRAM_BAR_ID;
1828e65e175bSOded Gabbay 	region->used = 1;
1829e65e175bSOded Gabbay 
1830e65e175bSOded Gabbay 	/* DRAM */
1831e65e175bSOded Gabbay 	region = &hdev->pci_mem_region[PCI_REGION_DRAM];
1832e65e175bSOded Gabbay 	region->region_base = DRAM_PHYS_BASE;
1833e65e175bSOded Gabbay 	region->region_size = hdev->asic_prop.dram_size;
1834e65e175bSOded Gabbay 	region->offset_in_bar = 0;
1835e65e175bSOded Gabbay 	region->bar_size = prop->dram_pci_bar_size;
1836e65e175bSOded Gabbay 	region->bar_id = HBM_BAR_ID;
1837e65e175bSOded Gabbay 	region->used = 1;
1838e65e175bSOded Gabbay 
1839e65e175bSOded Gabbay 	/* SP SRAM */
1840e65e175bSOded Gabbay 	region = &hdev->pci_mem_region[PCI_REGION_SP_SRAM];
1841e65e175bSOded Gabbay 	region->region_base = PSOC_SCRATCHPAD_ADDR;
1842e65e175bSOded Gabbay 	region->region_size = PSOC_SCRATCHPAD_SIZE;
1843e65e175bSOded Gabbay 	region->offset_in_bar = PSOC_SCRATCHPAD_ADDR - SPI_FLASH_BASE_ADDR;
1844e65e175bSOded Gabbay 	region->bar_size = CFG_BAR_SIZE;
1845e65e175bSOded Gabbay 	region->bar_id = CFG_BAR_ID;
1846e65e175bSOded Gabbay 	region->used = 1;
1847e65e175bSOded Gabbay }
1848e65e175bSOded Gabbay 
gaudi_sw_init(struct hl_device * hdev)1849e65e175bSOded Gabbay static int gaudi_sw_init(struct hl_device *hdev)
1850e65e175bSOded Gabbay {
1851e65e175bSOded Gabbay 	struct gaudi_device *gaudi;
1852e65e175bSOded Gabbay 	u32 i, event_id = 0;
1853e65e175bSOded Gabbay 	int rc;
1854e65e175bSOded Gabbay 
1855e65e175bSOded Gabbay 	/* Allocate device structure */
1856e65e175bSOded Gabbay 	gaudi = kzalloc(sizeof(*gaudi), GFP_KERNEL);
1857e65e175bSOded Gabbay 	if (!gaudi)
1858e65e175bSOded Gabbay 		return -ENOMEM;
1859e65e175bSOded Gabbay 
1860e65e175bSOded Gabbay 	for (i = 0 ; i < ARRAY_SIZE(gaudi_irq_map_table) ; i++) {
1861e65e175bSOded Gabbay 		if (gaudi_irq_map_table[i].valid) {
1862e65e175bSOded Gabbay 			if (event_id == GAUDI_EVENT_SIZE) {
1863e65e175bSOded Gabbay 				dev_err(hdev->dev,
1864e65e175bSOded Gabbay 					"Event array exceeds the limit of %u events\n",
1865e65e175bSOded Gabbay 					GAUDI_EVENT_SIZE);
1866e65e175bSOded Gabbay 				rc = -EINVAL;
1867e65e175bSOded Gabbay 				goto free_gaudi_device;
1868e65e175bSOded Gabbay 			}
1869e65e175bSOded Gabbay 
1870e65e175bSOded Gabbay 			gaudi->events[event_id++] =
1871e65e175bSOded Gabbay 					gaudi_irq_map_table[i].fc_id;
1872e65e175bSOded Gabbay 		}
1873e65e175bSOded Gabbay 	}
1874e65e175bSOded Gabbay 
1875e65e175bSOded Gabbay 	gaudi->cpucp_info_get = gaudi_cpucp_info_get;
1876e65e175bSOded Gabbay 
1877e65e175bSOded Gabbay 	hdev->asic_specific = gaudi;
1878e65e175bSOded Gabbay 
1879e65e175bSOded Gabbay 	/* Create DMA pool for small allocations */
1880e65e175bSOded Gabbay 	hdev->dma_pool = dma_pool_create(dev_name(hdev->dev),
1881e65e175bSOded Gabbay 			&hdev->pdev->dev, GAUDI_DMA_POOL_BLK_SIZE, 8, 0);
1882e65e175bSOded Gabbay 	if (!hdev->dma_pool) {
1883e65e175bSOded Gabbay 		dev_err(hdev->dev, "failed to create DMA pool\n");
1884e65e175bSOded Gabbay 		rc = -ENOMEM;
1885e65e175bSOded Gabbay 		goto free_gaudi_device;
1886e65e175bSOded Gabbay 	}
1887e65e175bSOded Gabbay 
1888e65e175bSOded Gabbay 	rc = gaudi_alloc_cpu_accessible_dma_mem(hdev);
1889e65e175bSOded Gabbay 	if (rc)
1890e65e175bSOded Gabbay 		goto free_dma_pool;
1891e65e175bSOded Gabbay 
1892e65e175bSOded Gabbay 	hdev->cpu_accessible_dma_pool = gen_pool_create(ilog2(32), -1);
1893e65e175bSOded Gabbay 	if (!hdev->cpu_accessible_dma_pool) {
1894e65e175bSOded Gabbay 		dev_err(hdev->dev,
1895e65e175bSOded Gabbay 			"Failed to create CPU accessible DMA pool\n");
1896e65e175bSOded Gabbay 		rc = -ENOMEM;
1897e65e175bSOded Gabbay 		goto free_cpu_dma_mem;
1898e65e175bSOded Gabbay 	}
1899e65e175bSOded Gabbay 
1900e65e175bSOded Gabbay 	rc = gen_pool_add(hdev->cpu_accessible_dma_pool,
1901e65e175bSOded Gabbay 				(uintptr_t) hdev->cpu_accessible_dma_mem,
1902e65e175bSOded Gabbay 				HL_CPU_ACCESSIBLE_MEM_SIZE, -1);
1903e65e175bSOded Gabbay 	if (rc) {
1904e65e175bSOded Gabbay 		dev_err(hdev->dev,
1905e65e175bSOded Gabbay 			"Failed to add memory to CPU accessible DMA pool\n");
1906e65e175bSOded Gabbay 		rc = -EFAULT;
1907e65e175bSOded Gabbay 		goto free_cpu_accessible_dma_pool;
1908e65e175bSOded Gabbay 	}
1909e65e175bSOded Gabbay 
1910e65e175bSOded Gabbay 	rc = gaudi_alloc_internal_qmans_pq_mem(hdev);
1911e65e175bSOded Gabbay 	if (rc)
1912e65e175bSOded Gabbay 		goto free_cpu_accessible_dma_pool;
1913e65e175bSOded Gabbay 
1914e65e175bSOded Gabbay 	spin_lock_init(&gaudi->hw_queues_lock);
1915e65e175bSOded Gabbay 
1916e65e175bSOded Gabbay 	hdev->supports_sync_stream = true;
1917e65e175bSOded Gabbay 	hdev->supports_coresight = true;
1918e65e175bSOded Gabbay 	hdev->supports_staged_submission = true;
1919e65e175bSOded Gabbay 	hdev->supports_wait_for_multi_cs = true;
1920e65e175bSOded Gabbay 
1921e65e175bSOded Gabbay 	hdev->asic_funcs->set_pci_memory_regions(hdev);
1922e65e175bSOded Gabbay 	hdev->stream_master_qid_arr =
1923e65e175bSOded Gabbay 				hdev->asic_funcs->get_stream_master_qid_arr();
1924e65e175bSOded Gabbay 	hdev->stream_master_qid_arr_size = GAUDI_STREAM_MASTER_ARR_SIZE;
1925e65e175bSOded Gabbay 
1926e65e175bSOded Gabbay 	return 0;
1927e65e175bSOded Gabbay 
1928e65e175bSOded Gabbay free_cpu_accessible_dma_pool:
1929e65e175bSOded Gabbay 	gen_pool_destroy(hdev->cpu_accessible_dma_pool);
1930e65e175bSOded Gabbay free_cpu_dma_mem:
1931e65e175bSOded Gabbay 	if (!hdev->asic_prop.fw_security_enabled)
1932e65e175bSOded Gabbay 		GAUDI_CPU_TO_PCI_ADDR(hdev->cpu_accessible_dma_address,
1933e65e175bSOded Gabbay 					hdev->cpu_pci_msb_addr);
1934e65e175bSOded Gabbay 	hl_asic_dma_free_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE, hdev->cpu_accessible_dma_mem,
1935e65e175bSOded Gabbay 					hdev->cpu_accessible_dma_address);
1936e65e175bSOded Gabbay free_dma_pool:
1937e65e175bSOded Gabbay 	dma_pool_destroy(hdev->dma_pool);
1938e65e175bSOded Gabbay free_gaudi_device:
1939e65e175bSOded Gabbay 	kfree(gaudi);
1940e65e175bSOded Gabbay 	return rc;
1941e65e175bSOded Gabbay }
1942e65e175bSOded Gabbay 
gaudi_sw_fini(struct hl_device * hdev)1943e65e175bSOded Gabbay static int gaudi_sw_fini(struct hl_device *hdev)
1944e65e175bSOded Gabbay {
1945e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
1946e65e175bSOded Gabbay 
1947e65e175bSOded Gabbay 	gaudi_free_internal_qmans_pq_mem(hdev);
1948e65e175bSOded Gabbay 
1949e65e175bSOded Gabbay 	gen_pool_destroy(hdev->cpu_accessible_dma_pool);
1950e65e175bSOded Gabbay 
1951e65e175bSOded Gabbay 	if (!hdev->asic_prop.fw_security_enabled)
1952e65e175bSOded Gabbay 		GAUDI_CPU_TO_PCI_ADDR(hdev->cpu_accessible_dma_address,
1953e65e175bSOded Gabbay 					hdev->cpu_pci_msb_addr);
1954e65e175bSOded Gabbay 
1955e65e175bSOded Gabbay 	hl_asic_dma_free_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE, hdev->cpu_accessible_dma_mem,
1956e65e175bSOded Gabbay 					hdev->cpu_accessible_dma_address);
1957e65e175bSOded Gabbay 
1958e65e175bSOded Gabbay 	dma_pool_destroy(hdev->dma_pool);
1959e65e175bSOded Gabbay 
1960e65e175bSOded Gabbay 	kfree(gaudi);
1961e65e175bSOded Gabbay 
1962e65e175bSOded Gabbay 	return 0;
1963e65e175bSOded Gabbay }
1964e65e175bSOded Gabbay 
gaudi_irq_handler_single(int irq,void * arg)1965e65e175bSOded Gabbay static irqreturn_t gaudi_irq_handler_single(int irq, void *arg)
1966e65e175bSOded Gabbay {
1967e65e175bSOded Gabbay 	struct hl_device *hdev = arg;
1968e65e175bSOded Gabbay 	int i;
1969e65e175bSOded Gabbay 
1970e65e175bSOded Gabbay 	if (hdev->disabled)
1971e65e175bSOded Gabbay 		return IRQ_HANDLED;
1972e65e175bSOded Gabbay 
1973e65e175bSOded Gabbay 	for (i = 0 ; i < hdev->asic_prop.completion_queues_count ; i++)
1974e65e175bSOded Gabbay 		hl_irq_handler_cq(irq, &hdev->completion_queue[i]);
1975e65e175bSOded Gabbay 
1976e65e175bSOded Gabbay 	hl_irq_handler_eq(irq, &hdev->event_queue);
1977e65e175bSOded Gabbay 
1978e65e175bSOded Gabbay 	return IRQ_HANDLED;
1979e65e175bSOded Gabbay }
1980e65e175bSOded Gabbay 
1981e65e175bSOded Gabbay /*
1982e65e175bSOded Gabbay  * For backward compatibility, new MSI interrupts should be set after the
1983e65e175bSOded Gabbay  * existing CPU and NIC interrupts.
1984e65e175bSOded Gabbay  */
gaudi_pci_irq_vector(struct hl_device * hdev,unsigned int nr,bool cpu_eq)1985e65e175bSOded Gabbay static int gaudi_pci_irq_vector(struct hl_device *hdev, unsigned int nr,
1986e65e175bSOded Gabbay 				bool cpu_eq)
1987e65e175bSOded Gabbay {
1988e65e175bSOded Gabbay 	int msi_vec;
1989e65e175bSOded Gabbay 
1990e65e175bSOded Gabbay 	if ((nr != GAUDI_EVENT_QUEUE_MSI_IDX) && (cpu_eq))
1991e65e175bSOded Gabbay 		dev_crit(hdev->dev, "CPU EQ must use IRQ %d\n",
1992e65e175bSOded Gabbay 				GAUDI_EVENT_QUEUE_MSI_IDX);
1993e65e175bSOded Gabbay 
1994e65e175bSOded Gabbay 	msi_vec = ((nr < GAUDI_EVENT_QUEUE_MSI_IDX) || (cpu_eq)) ? nr :
1995e65e175bSOded Gabbay 			(nr + NIC_NUMBER_OF_ENGINES + 1);
1996e65e175bSOded Gabbay 
1997e65e175bSOded Gabbay 	return pci_irq_vector(hdev->pdev, msi_vec);
1998e65e175bSOded Gabbay }
1999e65e175bSOded Gabbay 
gaudi_enable_msi_single(struct hl_device * hdev)2000e65e175bSOded Gabbay static int gaudi_enable_msi_single(struct hl_device *hdev)
2001e65e175bSOded Gabbay {
2002e65e175bSOded Gabbay 	int rc, irq;
2003e65e175bSOded Gabbay 
2004e65e175bSOded Gabbay 	dev_dbg(hdev->dev, "Working in single MSI IRQ mode\n");
2005e65e175bSOded Gabbay 
2006e65e175bSOded Gabbay 	irq = gaudi_pci_irq_vector(hdev, 0, false);
2007e65e175bSOded Gabbay 	rc = request_irq(irq, gaudi_irq_handler_single, 0,
2008e65e175bSOded Gabbay 			"gaudi single msi", hdev);
2009e65e175bSOded Gabbay 	if (rc)
2010e65e175bSOded Gabbay 		dev_err(hdev->dev,
2011e65e175bSOded Gabbay 			"Failed to request single MSI IRQ\n");
2012e65e175bSOded Gabbay 
2013e65e175bSOded Gabbay 	return rc;
2014e65e175bSOded Gabbay }
2015e65e175bSOded Gabbay 
gaudi_enable_msi(struct hl_device * hdev)2016e65e175bSOded Gabbay static int gaudi_enable_msi(struct hl_device *hdev)
2017e65e175bSOded Gabbay {
2018e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
2019e65e175bSOded Gabbay 	int rc;
2020e65e175bSOded Gabbay 
2021e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_MSI)
2022e65e175bSOded Gabbay 		return 0;
2023e65e175bSOded Gabbay 
2024e65e175bSOded Gabbay 	rc = pci_alloc_irq_vectors(hdev->pdev, 1, 1, PCI_IRQ_MSI);
2025e65e175bSOded Gabbay 	if (rc < 0) {
2026e65e175bSOded Gabbay 		dev_err(hdev->dev, "MSI: Failed to enable support %d\n", rc);
2027e65e175bSOded Gabbay 		return rc;
2028e65e175bSOded Gabbay 	}
2029e65e175bSOded Gabbay 
2030e65e175bSOded Gabbay 	rc = gaudi_enable_msi_single(hdev);
2031e65e175bSOded Gabbay 	if (rc)
2032e65e175bSOded Gabbay 		goto free_pci_irq_vectors;
2033e65e175bSOded Gabbay 
2034e65e175bSOded Gabbay 	gaudi->hw_cap_initialized |= HW_CAP_MSI;
2035e65e175bSOded Gabbay 
2036e65e175bSOded Gabbay 	return 0;
2037e65e175bSOded Gabbay 
2038e65e175bSOded Gabbay free_pci_irq_vectors:
2039e65e175bSOded Gabbay 	pci_free_irq_vectors(hdev->pdev);
2040e65e175bSOded Gabbay 	return rc;
2041e65e175bSOded Gabbay }
2042e65e175bSOded Gabbay 
gaudi_sync_irqs(struct hl_device * hdev)2043e65e175bSOded Gabbay static void gaudi_sync_irqs(struct hl_device *hdev)
2044e65e175bSOded Gabbay {
2045e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
2046e65e175bSOded Gabbay 
2047e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_MSI))
2048e65e175bSOded Gabbay 		return;
2049e65e175bSOded Gabbay 
2050e65e175bSOded Gabbay 	/* Wait for all pending IRQs to be finished */
2051e65e175bSOded Gabbay 	synchronize_irq(gaudi_pci_irq_vector(hdev, 0, false));
2052e65e175bSOded Gabbay }
2053e65e175bSOded Gabbay 
gaudi_disable_msi(struct hl_device * hdev)2054e65e175bSOded Gabbay static void gaudi_disable_msi(struct hl_device *hdev)
2055e65e175bSOded Gabbay {
2056e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
2057e65e175bSOded Gabbay 
2058e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_MSI))
2059e65e175bSOded Gabbay 		return;
2060e65e175bSOded Gabbay 
2061e65e175bSOded Gabbay 	gaudi_sync_irqs(hdev);
2062e65e175bSOded Gabbay 	free_irq(gaudi_pci_irq_vector(hdev, 0, false), hdev);
2063e65e175bSOded Gabbay 	pci_free_irq_vectors(hdev->pdev);
2064e65e175bSOded Gabbay 
2065e65e175bSOded Gabbay 	gaudi->hw_cap_initialized &= ~HW_CAP_MSI;
2066e65e175bSOded Gabbay }
2067e65e175bSOded Gabbay 
gaudi_init_scrambler_sram(struct hl_device * hdev)2068e65e175bSOded Gabbay static void gaudi_init_scrambler_sram(struct hl_device *hdev)
2069e65e175bSOded Gabbay {
2070e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
2071e65e175bSOded Gabbay 
2072e65e175bSOded Gabbay 	if (hdev->asic_prop.fw_security_enabled)
2073e65e175bSOded Gabbay 		return;
2074e65e175bSOded Gabbay 
2075e65e175bSOded Gabbay 	if (hdev->asic_prop.fw_app_cpu_boot_dev_sts0 &
2076e65e175bSOded Gabbay 						CPU_BOOT_DEV_STS0_SRAM_SCR_EN)
2077e65e175bSOded Gabbay 		return;
2078e65e175bSOded Gabbay 
2079e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_SRAM_SCRAMBLER)
2080e65e175bSOded Gabbay 		return;
2081e65e175bSOded Gabbay 
2082e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_0_SCRAM_SRAM_EN,
2083e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2084e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_1_SCRAM_SRAM_EN,
2085e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2086e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_2_SCRAM_SRAM_EN,
2087e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2088e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_3_SCRAM_SRAM_EN,
2089e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2090e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_4_SCRAM_SRAM_EN,
2091e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2092e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_5_SCRAM_SRAM_EN,
2093e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2094e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_6_SCRAM_SRAM_EN,
2095e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2096e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_7_SCRAM_SRAM_EN,
2097e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2098e65e175bSOded Gabbay 
2099e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_0_SCRAM_SRAM_EN,
2100e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2101e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_1_SCRAM_SRAM_EN,
2102e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2103e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_2_SCRAM_SRAM_EN,
2104e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2105e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_3_SCRAM_SRAM_EN,
2106e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2107e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_4_SCRAM_SRAM_EN,
2108e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2109e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_5_SCRAM_SRAM_EN,
2110e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2111e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_6_SCRAM_SRAM_EN,
2112e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2113e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_7_SCRAM_SRAM_EN,
2114e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_SRAM_EN_VAL_SHIFT);
2115e65e175bSOded Gabbay 
2116e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH0_SCRAM_SRAM_EN,
2117e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_SRAM_EN_VAL_SHIFT);
2118e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH1_SCRAM_SRAM_EN,
2119e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_SRAM_EN_VAL_SHIFT);
2120e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH0_SCRAM_SRAM_EN,
2121e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_SRAM_EN_VAL_SHIFT);
2122e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH1_SCRAM_SRAM_EN,
2123e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_SRAM_EN_VAL_SHIFT);
2124e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH0_SCRAM_SRAM_EN,
2125e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_SRAM_EN_VAL_SHIFT);
2126e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH1_SCRAM_SRAM_EN,
2127e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_SRAM_EN_VAL_SHIFT);
2128e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH0_SCRAM_SRAM_EN,
2129e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_SRAM_EN_VAL_SHIFT);
2130e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH1_SCRAM_SRAM_EN,
2131e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_SRAM_EN_VAL_SHIFT);
2132e65e175bSOded Gabbay 
2133e65e175bSOded Gabbay 	gaudi->hw_cap_initialized |= HW_CAP_SRAM_SCRAMBLER;
2134e65e175bSOded Gabbay }
2135e65e175bSOded Gabbay 
gaudi_init_scrambler_hbm(struct hl_device * hdev)2136e65e175bSOded Gabbay static void gaudi_init_scrambler_hbm(struct hl_device *hdev)
2137e65e175bSOded Gabbay {
2138e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
2139e65e175bSOded Gabbay 
2140e65e175bSOded Gabbay 	if (hdev->asic_prop.fw_security_enabled)
2141e65e175bSOded Gabbay 		return;
2142e65e175bSOded Gabbay 
2143e65e175bSOded Gabbay 	if (hdev->asic_prop.fw_bootfit_cpu_boot_dev_sts0 &
2144e65e175bSOded Gabbay 					CPU_BOOT_DEV_STS0_DRAM_SCR_EN)
2145e65e175bSOded Gabbay 		return;
2146e65e175bSOded Gabbay 
2147e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_HBM_SCRAMBLER)
2148e65e175bSOded Gabbay 		return;
2149e65e175bSOded Gabbay 
2150e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_0_SCRAM_HBM_EN,
2151e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2152e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_1_SCRAM_HBM_EN,
2153e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2154e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_2_SCRAM_HBM_EN,
2155e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2156e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_3_SCRAM_HBM_EN,
2157e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2158e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_4_SCRAM_HBM_EN,
2159e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2160e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_5_SCRAM_HBM_EN,
2161e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2162e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_6_SCRAM_HBM_EN,
2163e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2164e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_7_SCRAM_HBM_EN,
2165e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2166e65e175bSOded Gabbay 
2167e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_0_SCRAM_HBM_EN,
2168e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2169e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_1_SCRAM_HBM_EN,
2170e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2171e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_2_SCRAM_HBM_EN,
2172e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2173e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_3_SCRAM_HBM_EN,
2174e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2175e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_4_SCRAM_HBM_EN,
2176e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2177e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_5_SCRAM_HBM_EN,
2178e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2179e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_6_SCRAM_HBM_EN,
2180e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2181e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_7_SCRAM_HBM_EN,
2182e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_SCRAM_HBM_EN_VAL_SHIFT);
2183e65e175bSOded Gabbay 
2184e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH0_SCRAM_HBM_EN,
2185e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_HBM_EN_VAL_SHIFT);
2186e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH1_SCRAM_HBM_EN,
2187e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_HBM_EN_VAL_SHIFT);
2188e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH0_SCRAM_HBM_EN,
2189e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_HBM_EN_VAL_SHIFT);
2190e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH1_SCRAM_HBM_EN,
2191e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_HBM_EN_VAL_SHIFT);
2192e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH0_SCRAM_HBM_EN,
2193e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_HBM_EN_VAL_SHIFT);
2194e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH1_SCRAM_HBM_EN,
2195e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_HBM_EN_VAL_SHIFT);
2196e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH0_SCRAM_HBM_EN,
2197e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_HBM_EN_VAL_SHIFT);
2198e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH1_SCRAM_HBM_EN,
2199e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_SCRAM_HBM_EN_VAL_SHIFT);
2200e65e175bSOded Gabbay 
2201e65e175bSOded Gabbay 	gaudi->hw_cap_initialized |= HW_CAP_HBM_SCRAMBLER;
2202e65e175bSOded Gabbay }
2203e65e175bSOded Gabbay 
gaudi_init_e2e(struct hl_device * hdev)2204e65e175bSOded Gabbay static void gaudi_init_e2e(struct hl_device *hdev)
2205e65e175bSOded Gabbay {
2206e65e175bSOded Gabbay 	if (hdev->asic_prop.fw_security_enabled)
2207e65e175bSOded Gabbay 		return;
2208e65e175bSOded Gabbay 
2209e65e175bSOded Gabbay 	if (hdev->asic_prop.fw_bootfit_cpu_boot_dev_sts0 &
2210e65e175bSOded Gabbay 					CPU_BOOT_DEV_STS0_E2E_CRED_EN)
2211e65e175bSOded Gabbay 		return;
2212e65e175bSOded Gabbay 
2213e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_0_E2E_HBM_WR_SIZE, 247 >> 3);
2214e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_0_E2E_HBM_RD_SIZE, 785 >> 3);
2215e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_0_E2E_PCI_WR_SIZE, 49);
2216e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_0_E2E_PCI_RD_SIZE, 101);
2217e65e175bSOded Gabbay 
2218e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_1_E2E_HBM_WR_SIZE, 275 >> 3);
2219e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_1_E2E_HBM_RD_SIZE, 614 >> 3);
2220e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_1_E2E_PCI_WR_SIZE, 1);
2221e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_1_E2E_PCI_RD_SIZE, 39);
2222e65e175bSOded Gabbay 
2223e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_2_E2E_HBM_WR_SIZE, 1);
2224e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_2_E2E_HBM_RD_SIZE, 1);
2225e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_2_E2E_PCI_WR_SIZE, 1);
2226e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_2_E2E_PCI_RD_SIZE, 32);
2227e65e175bSOded Gabbay 
2228e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_3_E2E_HBM_WR_SIZE, 176 >> 3);
2229e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_3_E2E_HBM_RD_SIZE, 32 >> 3);
2230e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_3_E2E_PCI_WR_SIZE, 19);
2231e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_3_E2E_PCI_RD_SIZE, 32);
2232e65e175bSOded Gabbay 
2233e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_4_E2E_HBM_WR_SIZE, 176 >> 3);
2234e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_4_E2E_HBM_RD_SIZE, 32 >> 3);
2235e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_4_E2E_PCI_WR_SIZE, 19);
2236e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_4_E2E_PCI_RD_SIZE, 32);
2237e65e175bSOded Gabbay 
2238e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_5_E2E_HBM_WR_SIZE, 1);
2239e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_5_E2E_HBM_RD_SIZE, 1);
2240e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_5_E2E_PCI_WR_SIZE, 1);
2241e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_5_E2E_PCI_RD_SIZE, 32);
2242e65e175bSOded Gabbay 
2243e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_6_E2E_HBM_WR_SIZE, 275 >> 3);
2244e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_6_E2E_HBM_RD_SIZE, 614 >> 3);
2245e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_6_E2E_PCI_WR_SIZE, 1);
2246e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_6_E2E_PCI_RD_SIZE, 39);
2247e65e175bSOded Gabbay 
2248e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_7_E2E_HBM_WR_SIZE, 297 >> 3);
2249e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_7_E2E_HBM_RD_SIZE, 908 >> 3);
2250e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_7_E2E_PCI_WR_SIZE, 19);
2251e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_7_E2E_PCI_RD_SIZE, 19);
2252e65e175bSOded Gabbay 
2253e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_0_E2E_HBM_WR_SIZE, 318 >> 3);
2254e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_0_E2E_HBM_RD_SIZE, 956 >> 3);
2255e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_0_E2E_PCI_WR_SIZE, 79);
2256e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_0_E2E_PCI_RD_SIZE, 163);
2257e65e175bSOded Gabbay 
2258e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_1_E2E_HBM_WR_SIZE, 275 >> 3);
2259e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_1_E2E_HBM_RD_SIZE, 614 >> 3);
2260e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_1_E2E_PCI_WR_SIZE, 1);
2261e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_1_E2E_PCI_RD_SIZE, 39);
2262e65e175bSOded Gabbay 
2263e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_2_E2E_HBM_WR_SIZE, 1);
2264e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_2_E2E_HBM_RD_SIZE, 1);
2265e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_2_E2E_PCI_WR_SIZE, 1);
2266e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_2_E2E_PCI_RD_SIZE, 32);
2267e65e175bSOded Gabbay 
2268e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_3_E2E_HBM_WR_SIZE, 176 >> 3);
2269e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_3_E2E_HBM_RD_SIZE, 32 >> 3);
2270e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_3_E2E_PCI_WR_SIZE, 19);
2271e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_3_E2E_PCI_RD_SIZE, 32);
2272e65e175bSOded Gabbay 
2273e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_4_E2E_HBM_WR_SIZE, 176 >> 3);
2274e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_4_E2E_HBM_RD_SIZE, 32 >> 3);
2275e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_4_E2E_PCI_WR_SIZE, 19);
2276e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_4_E2E_PCI_RD_SIZE, 32);
2277e65e175bSOded Gabbay 
2278e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_5_E2E_HBM_WR_SIZE, 1);
2279e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_5_E2E_HBM_RD_SIZE, 1);
2280e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_5_E2E_PCI_WR_SIZE, 1);
2281e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_5_E2E_PCI_RD_SIZE, 32);
2282e65e175bSOded Gabbay 
2283e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_6_E2E_HBM_WR_SIZE, 275 >> 3);
2284e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_6_E2E_HBM_RD_SIZE, 614 >> 3);
2285e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_6_E2E_PCI_WR_SIZE, 1);
2286e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_6_E2E_PCI_RD_SIZE, 39);
2287e65e175bSOded Gabbay 
2288e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_7_E2E_HBM_WR_SIZE, 318 >> 3);
2289e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_7_E2E_HBM_RD_SIZE, 956 >> 3);
2290e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_7_E2E_PCI_WR_SIZE, 79);
2291e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_7_E2E_PCI_RD_SIZE, 79);
2292e65e175bSOded Gabbay 
2293e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH0_E2E_HBM_WR_SIZE, 344 >> 3);
2294e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH0_E2E_HBM_RD_SIZE, 1000 >> 3);
2295e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH0_E2E_PCI_WR_SIZE, 162);
2296e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH0_E2E_PCI_RD_SIZE, 338);
2297e65e175bSOded Gabbay 
2298e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH1_E2E_HBM_WR_SIZE, 344 >> 3);
2299e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH1_E2E_HBM_RD_SIZE, 1000 >> 3);
2300e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH1_E2E_PCI_WR_SIZE, 162);
2301e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH1_E2E_PCI_RD_SIZE, 338);
2302e65e175bSOded Gabbay 
2303e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH0_E2E_HBM_WR_SIZE, 344 >> 3);
2304e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH0_E2E_HBM_RD_SIZE, 1000 >> 3);
2305e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH0_E2E_PCI_WR_SIZE, 162);
2306e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH0_E2E_PCI_RD_SIZE, 338);
2307e65e175bSOded Gabbay 
2308e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH1_E2E_HBM_WR_SIZE, 344 >> 3);
2309e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH1_E2E_HBM_RD_SIZE, 1000 >> 3);
2310e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH1_E2E_PCI_WR_SIZE, 162);
2311e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH1_E2E_PCI_RD_SIZE, 338);
2312e65e175bSOded Gabbay 
2313e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH0_E2E_HBM_WR_SIZE, 344 >> 3);
2314e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH0_E2E_HBM_RD_SIZE, 1000 >> 3);
2315e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH0_E2E_PCI_WR_SIZE, 162);
2316e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH0_E2E_PCI_RD_SIZE, 338);
2317e65e175bSOded Gabbay 
2318e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH1_E2E_HBM_WR_SIZE, 344 >> 3);
2319e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH1_E2E_HBM_RD_SIZE, 1000 >> 3);
2320e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH1_E2E_PCI_WR_SIZE, 162);
2321e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH1_E2E_PCI_RD_SIZE, 338);
2322e65e175bSOded Gabbay 
2323e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH0_E2E_HBM_WR_SIZE, 344 >> 3);
2324e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH0_E2E_HBM_RD_SIZE, 1000 >> 3);
2325e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH0_E2E_PCI_WR_SIZE, 162);
2326e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH0_E2E_PCI_RD_SIZE, 338);
2327e65e175bSOded Gabbay 
2328e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH1_E2E_HBM_WR_SIZE, 344 >> 3);
2329e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH1_E2E_HBM_RD_SIZE, 1000 >> 3);
2330e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH1_E2E_PCI_WR_SIZE, 162);
2331e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH1_E2E_PCI_RD_SIZE, 338);
2332e65e175bSOded Gabbay 
2333e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_0_E2E_HBM_EN,
2334e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2335e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_0_E2E_PCI_EN,
2336e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2337e65e175bSOded Gabbay 
2338e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_1_E2E_HBM_EN,
2339e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2340e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_1_E2E_PCI_EN,
2341e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2342e65e175bSOded Gabbay 
2343e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_2_E2E_HBM_EN,
2344e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2345e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_2_E2E_PCI_EN,
2346e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2347e65e175bSOded Gabbay 
2348e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_3_E2E_HBM_EN,
2349e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2350e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_3_E2E_PCI_EN,
2351e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2352e65e175bSOded Gabbay 
2353e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_4_E2E_HBM_EN,
2354e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2355e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_4_E2E_PCI_EN,
2356e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2357e65e175bSOded Gabbay 
2358e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_5_E2E_HBM_EN,
2359e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2360e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_5_E2E_PCI_EN,
2361e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2362e65e175bSOded Gabbay 
2363e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_6_E2E_HBM_EN,
2364e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2365e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_6_E2E_PCI_EN,
2366e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2367e65e175bSOded Gabbay 
2368e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_7_E2E_HBM_EN,
2369e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2370e65e175bSOded Gabbay 	WREG32(mmSIF_RTR_CTRL_7_E2E_PCI_EN,
2371e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2372e65e175bSOded Gabbay 
2373e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_0_E2E_HBM_EN,
2374e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2375e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_0_E2E_PCI_EN,
2376e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2377e65e175bSOded Gabbay 
2378e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_1_E2E_HBM_EN,
2379e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2380e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_1_E2E_PCI_EN,
2381e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2382e65e175bSOded Gabbay 
2383e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_2_E2E_HBM_EN,
2384e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2385e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_2_E2E_PCI_EN,
2386e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2387e65e175bSOded Gabbay 
2388e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_3_E2E_HBM_EN,
2389e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2390e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_3_E2E_PCI_EN,
2391e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2392e65e175bSOded Gabbay 
2393e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_4_E2E_HBM_EN,
2394e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2395e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_4_E2E_PCI_EN,
2396e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2397e65e175bSOded Gabbay 
2398e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_5_E2E_HBM_EN,
2399e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2400e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_5_E2E_PCI_EN,
2401e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2402e65e175bSOded Gabbay 
2403e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_6_E2E_HBM_EN,
2404e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2405e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_6_E2E_PCI_EN,
2406e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2407e65e175bSOded Gabbay 
2408e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_7_E2E_HBM_EN,
2409e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_HBM_EN_VAL_SHIFT);
2410e65e175bSOded Gabbay 	WREG32(mmNIF_RTR_CTRL_7_E2E_PCI_EN,
2411e65e175bSOded Gabbay 			1 << IF_RTR_CTRL_E2E_PCI_EN_VAL_SHIFT);
2412e65e175bSOded Gabbay 
2413e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH0_E2E_HBM_EN,
2414e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_HBM_EN_VAL_SHIFT);
2415e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH0_E2E_PCI_EN,
2416e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_PCI_EN_VAL_SHIFT);
2417e65e175bSOded Gabbay 
2418e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH1_E2E_HBM_EN,
2419e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_HBM_EN_VAL_SHIFT);
2420e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_DOWN_CH1_E2E_PCI_EN,
2421e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_PCI_EN_VAL_SHIFT);
2422e65e175bSOded Gabbay 
2423e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH0_E2E_HBM_EN,
2424e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_HBM_EN_VAL_SHIFT);
2425e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH0_E2E_PCI_EN,
2426e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_PCI_EN_VAL_SHIFT);
2427e65e175bSOded Gabbay 
2428e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH1_E2E_HBM_EN,
2429e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_HBM_EN_VAL_SHIFT);
2430e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_DOWN_CH1_E2E_PCI_EN,
2431e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_PCI_EN_VAL_SHIFT);
2432e65e175bSOded Gabbay 
2433e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH0_E2E_HBM_EN,
2434e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_HBM_EN_VAL_SHIFT);
2435e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH0_E2E_PCI_EN,
2436e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_PCI_EN_VAL_SHIFT);
2437e65e175bSOded Gabbay 
2438e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH1_E2E_HBM_EN,
2439e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_HBM_EN_VAL_SHIFT);
2440e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_DOWN_CH1_E2E_PCI_EN,
2441e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_PCI_EN_VAL_SHIFT);
2442e65e175bSOded Gabbay 
2443e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH0_E2E_HBM_EN,
2444e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_HBM_EN_VAL_SHIFT);
2445e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH0_E2E_PCI_EN,
2446e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_PCI_EN_VAL_SHIFT);
2447e65e175bSOded Gabbay 
2448e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH1_E2E_HBM_EN,
2449e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_HBM_EN_VAL_SHIFT);
2450e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_DOWN_CH1_E2E_PCI_EN,
2451e65e175bSOded Gabbay 			1 << DMA_IF_DOWN_CHX_E2E_PCI_EN_VAL_SHIFT);
2452e65e175bSOded Gabbay }
2453e65e175bSOded Gabbay 
gaudi_init_hbm_cred(struct hl_device * hdev)2454e65e175bSOded Gabbay static void gaudi_init_hbm_cred(struct hl_device *hdev)
2455e65e175bSOded Gabbay {
2456e65e175bSOded Gabbay 	u32 hbm0_wr, hbm1_wr, hbm0_rd, hbm1_rd;
2457e65e175bSOded Gabbay 
2458e65e175bSOded Gabbay 	if (hdev->asic_prop.fw_security_enabled)
2459e65e175bSOded Gabbay 		return;
2460e65e175bSOded Gabbay 
2461e65e175bSOded Gabbay 	if (hdev->asic_prop.fw_bootfit_cpu_boot_dev_sts0 &
2462e65e175bSOded Gabbay 						CPU_BOOT_DEV_STS0_HBM_CRED_EN)
2463e65e175bSOded Gabbay 		return;
2464e65e175bSOded Gabbay 
2465e65e175bSOded Gabbay 	hbm0_wr = 0x33333333;
2466e65e175bSOded Gabbay 	hbm0_rd = 0x77777777;
2467e65e175bSOded Gabbay 	hbm1_wr = 0x55555555;
2468e65e175bSOded Gabbay 	hbm1_rd = 0xDDDDDDDD;
2469e65e175bSOded Gabbay 
2470e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_HBM0_WR_CRED_CNT, hbm0_wr);
2471e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_HBM1_WR_CRED_CNT, hbm1_wr);
2472e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_HBM0_RD_CRED_CNT, hbm0_rd);
2473e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_HBM1_RD_CRED_CNT, hbm1_rd);
2474e65e175bSOded Gabbay 
2475e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_HBM0_WR_CRED_CNT, hbm0_wr);
2476e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_HBM1_WR_CRED_CNT, hbm1_wr);
2477e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_HBM0_RD_CRED_CNT, hbm0_rd);
2478e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_HBM1_RD_CRED_CNT, hbm1_rd);
2479e65e175bSOded Gabbay 
2480e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_HBM0_WR_CRED_CNT, hbm0_wr);
2481e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_HBM1_WR_CRED_CNT, hbm1_wr);
2482e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_HBM0_RD_CRED_CNT, hbm0_rd);
2483e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_HBM1_RD_CRED_CNT, hbm1_rd);
2484e65e175bSOded Gabbay 
2485e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_HBM0_WR_CRED_CNT, hbm0_wr);
2486e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_HBM1_WR_CRED_CNT, hbm1_wr);
2487e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_HBM0_RD_CRED_CNT, hbm0_rd);
2488e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_HBM1_RD_CRED_CNT, hbm1_rd);
2489e65e175bSOded Gabbay 
2490e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_HBM_CRED_EN_0,
2491e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_READ_CREDIT_EN_SHIFT) |
2492e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_WRITE_CREDIT_EN_SHIFT));
2493e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_HBM_CRED_EN_0,
2494e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_READ_CREDIT_EN_SHIFT) |
2495e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_WRITE_CREDIT_EN_SHIFT));
2496e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_HBM_CRED_EN_0,
2497e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_READ_CREDIT_EN_SHIFT) |
2498e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_WRITE_CREDIT_EN_SHIFT));
2499e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_HBM_CRED_EN_0,
2500e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_READ_CREDIT_EN_SHIFT) |
2501e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_WRITE_CREDIT_EN_SHIFT));
2502e65e175bSOded Gabbay 
2503e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_N_HBM_CRED_EN_1,
2504e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_READ_CREDIT_EN_SHIFT) |
2505e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_WRITE_CREDIT_EN_SHIFT));
2506e65e175bSOded Gabbay 	WREG32(mmDMA_IF_E_S_HBM_CRED_EN_1,
2507e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_READ_CREDIT_EN_SHIFT) |
2508e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_WRITE_CREDIT_EN_SHIFT));
2509e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_N_HBM_CRED_EN_1,
2510e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_READ_CREDIT_EN_SHIFT) |
2511e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_WRITE_CREDIT_EN_SHIFT));
2512e65e175bSOded Gabbay 	WREG32(mmDMA_IF_W_S_HBM_CRED_EN_1,
2513e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_READ_CREDIT_EN_SHIFT) |
2514e65e175bSOded Gabbay 			(1 << DMA_IF_HBM_CRED_EN_WRITE_CREDIT_EN_SHIFT));
2515e65e175bSOded Gabbay }
2516e65e175bSOded Gabbay 
gaudi_init_golden_registers(struct hl_device * hdev)2517e65e175bSOded Gabbay static void gaudi_init_golden_registers(struct hl_device *hdev)
2518e65e175bSOded Gabbay {
2519e65e175bSOded Gabbay 	u32 tpc_offset;
2520e65e175bSOded Gabbay 	int tpc_id, i;
2521e65e175bSOded Gabbay 
2522e65e175bSOded Gabbay 	gaudi_init_e2e(hdev);
2523e65e175bSOded Gabbay 	gaudi_init_hbm_cred(hdev);
2524e65e175bSOded Gabbay 
2525e65e175bSOded Gabbay 	for (tpc_id = 0, tpc_offset = 0;
2526e65e175bSOded Gabbay 				tpc_id < TPC_NUMBER_OF_ENGINES;
2527e65e175bSOded Gabbay 				tpc_id++, tpc_offset += TPC_CFG_OFFSET) {
2528e65e175bSOded Gabbay 		/* Mask all arithmetic interrupts from TPC */
2529e65e175bSOded Gabbay 		WREG32(mmTPC0_CFG_TPC_INTR_MASK + tpc_offset, 0x8FFE);
2530e65e175bSOded Gabbay 		/* Set 16 cache lines */
2531e65e175bSOded Gabbay 		WREG32_FIELD(TPC0_CFG_MSS_CONFIG, tpc_offset,
2532e65e175bSOded Gabbay 				ICACHE_FETCH_LINE_NUM, 2);
2533e65e175bSOded Gabbay 	}
2534e65e175bSOded Gabbay 
2535e65e175bSOded Gabbay 	/* Make sure 1st 128 bytes in SRAM are 0 for Tensor DMA */
2536e65e175bSOded Gabbay 	for (i = 0 ; i < 128 ; i += 8)
2537e65e175bSOded Gabbay 		writeq(0, hdev->pcie_bar[SRAM_BAR_ID] + i);
2538e65e175bSOded Gabbay 
2539e65e175bSOded Gabbay 	WREG32(mmMME0_CTRL_EUS_ROLLUP_CNT_ADD, 3);
2540e65e175bSOded Gabbay 	WREG32(mmMME1_CTRL_EUS_ROLLUP_CNT_ADD, 3);
2541e65e175bSOded Gabbay 	WREG32(mmMME2_CTRL_EUS_ROLLUP_CNT_ADD, 3);
2542e65e175bSOded Gabbay 	WREG32(mmMME3_CTRL_EUS_ROLLUP_CNT_ADD, 3);
2543e65e175bSOded Gabbay }
2544e65e175bSOded Gabbay 
gaudi_init_pci_dma_qman(struct hl_device * hdev,int dma_id,int qman_id,dma_addr_t qman_pq_addr)2545e65e175bSOded Gabbay static void gaudi_init_pci_dma_qman(struct hl_device *hdev, int dma_id,
2546e65e175bSOded Gabbay 					int qman_id, dma_addr_t qman_pq_addr)
2547e65e175bSOded Gabbay {
2548e65e175bSOded Gabbay 	struct cpu_dyn_regs *dyn_regs =
2549e65e175bSOded Gabbay 			&hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
2550e65e175bSOded Gabbay 	u32 mtr_base_en_lo, mtr_base_en_hi, mtr_base_ws_lo, mtr_base_ws_hi;
2551e65e175bSOded Gabbay 	u32 so_base_en_lo, so_base_en_hi, so_base_ws_lo, so_base_ws_hi;
2552e65e175bSOded Gabbay 	u32 q_off, dma_qm_offset;
2553e65e175bSOded Gabbay 	u32 dma_qm_err_cfg, irq_handler_offset;
2554e65e175bSOded Gabbay 
2555e65e175bSOded Gabbay 	dma_qm_offset = dma_id * DMA_QMAN_OFFSET;
2556e65e175bSOded Gabbay 
2557e65e175bSOded Gabbay 	mtr_base_en_lo = lower_32_bits(CFG_BASE +
2558e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
2559e65e175bSOded Gabbay 	mtr_base_en_hi = upper_32_bits(CFG_BASE +
2560e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
2561e65e175bSOded Gabbay 	so_base_en_lo = lower_32_bits(CFG_BASE +
2562e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0);
2563e65e175bSOded Gabbay 	so_base_en_hi = upper_32_bits(CFG_BASE +
2564e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0);
2565e65e175bSOded Gabbay 	mtr_base_ws_lo = lower_32_bits(CFG_BASE +
2566e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
2567e65e175bSOded Gabbay 	mtr_base_ws_hi = upper_32_bits(CFG_BASE +
2568e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
2569e65e175bSOded Gabbay 	so_base_ws_lo = lower_32_bits(CFG_BASE +
2570e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_SOB_OBJ_0);
2571e65e175bSOded Gabbay 	so_base_ws_hi = upper_32_bits(CFG_BASE +
2572e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_SOB_OBJ_0);
2573e65e175bSOded Gabbay 
2574e65e175bSOded Gabbay 	q_off = dma_qm_offset + qman_id * 4;
2575e65e175bSOded Gabbay 
2576e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_PQ_BASE_LO_0 + q_off, lower_32_bits(qman_pq_addr));
2577e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_PQ_BASE_HI_0 + q_off, upper_32_bits(qman_pq_addr));
2578e65e175bSOded Gabbay 
2579e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_PQ_SIZE_0 + q_off, ilog2(HL_QUEUE_LENGTH));
2580e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_PQ_PI_0 + q_off, 0);
2581e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_PQ_CI_0 + q_off, 0);
2582e65e175bSOded Gabbay 
2583e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_LDMA_TSIZE_OFFSET_0 + q_off, QMAN_LDMA_SIZE_OFFSET);
2584e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_LDMA_SRC_BASE_LO_OFFSET_0 + q_off,
2585e65e175bSOded Gabbay 							QMAN_LDMA_SRC_OFFSET);
2586e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_LDMA_DST_BASE_LO_OFFSET_0 + q_off,
2587e65e175bSOded Gabbay 							QMAN_LDMA_DST_OFFSET);
2588e65e175bSOded Gabbay 
2589e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_MSG_BASE0_ADDR_LO_0 + q_off, mtr_base_en_lo);
2590e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_MSG_BASE0_ADDR_HI_0 + q_off, mtr_base_en_hi);
2591e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_MSG_BASE1_ADDR_LO_0 + q_off, so_base_en_lo);
2592e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_MSG_BASE1_ADDR_HI_0 + q_off, so_base_en_hi);
2593e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_MSG_BASE2_ADDR_LO_0 + q_off, mtr_base_ws_lo);
2594e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_MSG_BASE2_ADDR_HI_0 + q_off, mtr_base_ws_hi);
2595e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_MSG_BASE3_ADDR_LO_0 + q_off, so_base_ws_lo);
2596e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_MSG_BASE3_ADDR_HI_0 + q_off, so_base_ws_hi);
2597e65e175bSOded Gabbay 
2598e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_BARRIER_CFG_0 + q_off, 0x100);
2599e65e175bSOded Gabbay 
2600e65e175bSOded Gabbay 	/* The following configuration is needed only once per QMAN */
2601e65e175bSOded Gabbay 	if (qman_id == 0) {
2602e65e175bSOded Gabbay 		irq_handler_offset = hdev->asic_prop.gic_interrupts_enable ?
2603e65e175bSOded Gabbay 				mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR :
2604e65e175bSOded Gabbay 				le32_to_cpu(dyn_regs->gic_dma_qm_irq_ctrl);
2605e65e175bSOded Gabbay 
2606e65e175bSOded Gabbay 		/* Configure RAZWI IRQ */
2607e65e175bSOded Gabbay 		dma_qm_err_cfg = PCI_DMA_QMAN_GLBL_ERR_CFG_MSG_EN_MASK;
2608e65e175bSOded Gabbay 		if (hdev->stop_on_err)
2609e65e175bSOded Gabbay 			dma_qm_err_cfg |=
2610e65e175bSOded Gabbay 				PCI_DMA_QMAN_GLBL_ERR_CFG_STOP_ON_ERR_EN_MASK;
2611e65e175bSOded Gabbay 
2612e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_GLBL_ERR_CFG + dma_qm_offset, dma_qm_err_cfg);
2613e65e175bSOded Gabbay 
2614e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_GLBL_ERR_ADDR_LO + dma_qm_offset,
2615e65e175bSOded Gabbay 			lower_32_bits(CFG_BASE + irq_handler_offset));
2616e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_GLBL_ERR_ADDR_HI + dma_qm_offset,
2617e65e175bSOded Gabbay 			upper_32_bits(CFG_BASE + irq_handler_offset));
2618e65e175bSOded Gabbay 
2619e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_GLBL_ERR_WDATA + dma_qm_offset,
2620e65e175bSOded Gabbay 			gaudi_irq_map_table[GAUDI_EVENT_DMA0_QM].cpu_id +
2621e65e175bSOded Gabbay 									dma_id);
2622e65e175bSOded Gabbay 
2623e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_ARB_ERR_MSG_EN + dma_qm_offset,
2624e65e175bSOded Gabbay 				QM_ARB_ERR_MSG_EN_MASK);
2625e65e175bSOded Gabbay 
2626e65e175bSOded Gabbay 		/* Set timeout to maximum */
2627e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_ARB_SLV_CHOISE_WDT + dma_qm_offset, GAUDI_ARB_WDT_TIMEOUT);
2628e65e175bSOded Gabbay 
2629e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_GLBL_PROT + dma_qm_offset,
2630e65e175bSOded Gabbay 				QMAN_EXTERNAL_MAKE_TRUSTED);
2631e65e175bSOded Gabbay 
2632e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_GLBL_CFG1 + dma_qm_offset, 0);
2633e65e175bSOded Gabbay 	}
2634e65e175bSOded Gabbay }
2635e65e175bSOded Gabbay 
gaudi_init_dma_core(struct hl_device * hdev,int dma_id)2636e65e175bSOded Gabbay static void gaudi_init_dma_core(struct hl_device *hdev, int dma_id)
2637e65e175bSOded Gabbay {
2638e65e175bSOded Gabbay 	struct cpu_dyn_regs *dyn_regs =
2639e65e175bSOded Gabbay 			&hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
2640e65e175bSOded Gabbay 	u32 dma_err_cfg = 1 << DMA0_CORE_ERR_CFG_ERR_MSG_EN_SHIFT;
2641e65e175bSOded Gabbay 	u32 dma_offset = dma_id * DMA_CORE_OFFSET;
2642e65e175bSOded Gabbay 	u32 irq_handler_offset;
2643e65e175bSOded Gabbay 
2644e65e175bSOded Gabbay 	/* Set to maximum possible according to physical size */
2645e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_RD_MAX_OUTSTAND + dma_offset, 0);
2646e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_RD_MAX_SIZE + dma_offset, 0);
2647e65e175bSOded Gabbay 
2648e65e175bSOded Gabbay 	/* WA for H/W bug H3-2116 */
2649e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_LBW_MAX_OUTSTAND + dma_offset, 15);
2650e65e175bSOded Gabbay 
2651e65e175bSOded Gabbay 	/* STOP_ON bit implies no completion to operation in case of RAZWI */
2652e65e175bSOded Gabbay 	if (hdev->stop_on_err)
2653e65e175bSOded Gabbay 		dma_err_cfg |= 1 << DMA0_CORE_ERR_CFG_STOP_ON_ERR_SHIFT;
2654e65e175bSOded Gabbay 
2655e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_ERR_CFG + dma_offset, dma_err_cfg);
2656e65e175bSOded Gabbay 
2657e65e175bSOded Gabbay 	irq_handler_offset = hdev->asic_prop.gic_interrupts_enable ?
2658e65e175bSOded Gabbay 			mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR :
2659e65e175bSOded Gabbay 			le32_to_cpu(dyn_regs->gic_dma_core_irq_ctrl);
2660e65e175bSOded Gabbay 
2661e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_ERRMSG_ADDR_LO + dma_offset,
2662e65e175bSOded Gabbay 		lower_32_bits(CFG_BASE + irq_handler_offset));
2663e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_ERRMSG_ADDR_HI + dma_offset,
2664e65e175bSOded Gabbay 		upper_32_bits(CFG_BASE + irq_handler_offset));
2665e65e175bSOded Gabbay 
2666e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_ERRMSG_WDATA + dma_offset,
2667e65e175bSOded Gabbay 		gaudi_irq_map_table[GAUDI_EVENT_DMA0_CORE].cpu_id + dma_id);
2668e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_PROT + dma_offset,
2669e65e175bSOded Gabbay 			1 << DMA0_CORE_PROT_ERR_VAL_SHIFT);
2670e65e175bSOded Gabbay 	/* If the channel is secured, it should be in MMU bypass mode */
2671e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_SECURE_PROPS + dma_offset,
2672e65e175bSOded Gabbay 			1 << DMA0_CORE_SECURE_PROPS_MMBP_SHIFT);
2673e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_CFG_0 + dma_offset, 1 << DMA0_CORE_CFG_0_EN_SHIFT);
2674e65e175bSOded Gabbay }
2675e65e175bSOded Gabbay 
gaudi_enable_qman(struct hl_device * hdev,int dma_id,u32 enable_mask)2676e65e175bSOded Gabbay static void gaudi_enable_qman(struct hl_device *hdev, int dma_id,
2677e65e175bSOded Gabbay 				u32 enable_mask)
2678e65e175bSOded Gabbay {
2679e65e175bSOded Gabbay 	u32 dma_qm_offset = dma_id * DMA_QMAN_OFFSET;
2680e65e175bSOded Gabbay 
2681e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_GLBL_CFG0 + dma_qm_offset, enable_mask);
2682e65e175bSOded Gabbay }
2683e65e175bSOded Gabbay 
gaudi_init_pci_dma_qmans(struct hl_device * hdev)2684e65e175bSOded Gabbay static void gaudi_init_pci_dma_qmans(struct hl_device *hdev)
2685e65e175bSOded Gabbay {
2686e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
2687e65e175bSOded Gabbay 	struct hl_hw_queue *q;
2688e65e175bSOded Gabbay 	int i, j, dma_id, cpu_skip, nic_skip, cq_id = 0, q_idx, msi_vec = 0;
2689e65e175bSOded Gabbay 
2690e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_PCI_DMA)
2691e65e175bSOded Gabbay 		return;
2692e65e175bSOded Gabbay 
2693e65e175bSOded Gabbay 	for (i = 0 ; i < PCI_DMA_NUMBER_OF_CHNLS ; i++) {
2694e65e175bSOded Gabbay 		dma_id = gaudi_dma_assignment[i];
2695e65e175bSOded Gabbay 		/*
2696e65e175bSOded Gabbay 		 * For queues after the CPU Q need to add 1 to get the correct
2697e65e175bSOded Gabbay 		 * queue. In addition, need to add the CPU EQ and NIC IRQs in
2698e65e175bSOded Gabbay 		 * order to get the correct MSI register.
2699e65e175bSOded Gabbay 		 */
2700e65e175bSOded Gabbay 		if (dma_id > 1) {
2701e65e175bSOded Gabbay 			cpu_skip = 1;
2702e65e175bSOded Gabbay 			nic_skip = NIC_NUMBER_OF_ENGINES;
2703e65e175bSOded Gabbay 		} else {
2704e65e175bSOded Gabbay 			cpu_skip = 0;
2705e65e175bSOded Gabbay 			nic_skip = 0;
2706e65e175bSOded Gabbay 		}
2707e65e175bSOded Gabbay 
2708e65e175bSOded Gabbay 		for (j = 0 ; j < QMAN_STREAMS ; j++) {
2709e65e175bSOded Gabbay 			q_idx = 4 * dma_id + j + cpu_skip;
2710e65e175bSOded Gabbay 			q = &hdev->kernel_queues[q_idx];
2711e65e175bSOded Gabbay 			q->cq_id = cq_id++;
2712e65e175bSOded Gabbay 			q->msi_vec = nic_skip + cpu_skip + msi_vec++;
2713e65e175bSOded Gabbay 			gaudi_init_pci_dma_qman(hdev, dma_id, j,
2714e65e175bSOded Gabbay 						q->bus_address);
2715e65e175bSOded Gabbay 		}
2716e65e175bSOded Gabbay 
2717e65e175bSOded Gabbay 		gaudi_init_dma_core(hdev, dma_id);
2718e65e175bSOded Gabbay 
2719e65e175bSOded Gabbay 		gaudi_enable_qman(hdev, dma_id, PCI_DMA_QMAN_ENABLE);
2720e65e175bSOded Gabbay 	}
2721e65e175bSOded Gabbay 
2722e65e175bSOded Gabbay 	gaudi->hw_cap_initialized |= HW_CAP_PCI_DMA;
2723e65e175bSOded Gabbay }
2724e65e175bSOded Gabbay 
gaudi_init_hbm_dma_qman(struct hl_device * hdev,int dma_id,int qman_id,u64 qman_base_addr)2725e65e175bSOded Gabbay static void gaudi_init_hbm_dma_qman(struct hl_device *hdev, int dma_id,
2726e65e175bSOded Gabbay 					int qman_id, u64 qman_base_addr)
2727e65e175bSOded Gabbay {
2728e65e175bSOded Gabbay 	struct cpu_dyn_regs *dyn_regs =
2729e65e175bSOded Gabbay 			&hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
2730e65e175bSOded Gabbay 	u32 mtr_base_en_lo, mtr_base_en_hi, mtr_base_ws_lo, mtr_base_ws_hi;
2731e65e175bSOded Gabbay 	u32 so_base_en_lo, so_base_en_hi, so_base_ws_lo, so_base_ws_hi;
2732e65e175bSOded Gabbay 	u32 dma_qm_err_cfg, irq_handler_offset;
2733e65e175bSOded Gabbay 	u32 q_off, dma_qm_offset;
2734e65e175bSOded Gabbay 
2735e65e175bSOded Gabbay 	dma_qm_offset = dma_id * DMA_QMAN_OFFSET;
2736e65e175bSOded Gabbay 
2737e65e175bSOded Gabbay 	mtr_base_en_lo = lower_32_bits(CFG_BASE +
2738e65e175bSOded Gabbay 			mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
2739e65e175bSOded Gabbay 	mtr_base_en_hi = upper_32_bits(CFG_BASE +
2740e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
2741e65e175bSOded Gabbay 	so_base_en_lo = lower_32_bits(CFG_BASE +
2742e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0);
2743e65e175bSOded Gabbay 	so_base_en_hi = upper_32_bits(CFG_BASE +
2744e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0);
2745e65e175bSOded Gabbay 	mtr_base_ws_lo = lower_32_bits(CFG_BASE +
2746e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
2747e65e175bSOded Gabbay 	mtr_base_ws_hi = upper_32_bits(CFG_BASE +
2748e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
2749e65e175bSOded Gabbay 	so_base_ws_lo = lower_32_bits(CFG_BASE +
2750e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_SOB_OBJ_0);
2751e65e175bSOded Gabbay 	so_base_ws_hi = upper_32_bits(CFG_BASE +
2752e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_SOB_OBJ_0);
2753e65e175bSOded Gabbay 
2754e65e175bSOded Gabbay 	q_off = dma_qm_offset + qman_id * 4;
2755e65e175bSOded Gabbay 
2756e65e175bSOded Gabbay 	if (qman_id < 4) {
2757e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_PQ_BASE_LO_0 + q_off,
2758e65e175bSOded Gabbay 					lower_32_bits(qman_base_addr));
2759e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_PQ_BASE_HI_0 + q_off,
2760e65e175bSOded Gabbay 					upper_32_bits(qman_base_addr));
2761e65e175bSOded Gabbay 
2762e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_PQ_SIZE_0 + q_off, ilog2(HBM_DMA_QMAN_LENGTH));
2763e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_PQ_PI_0 + q_off, 0);
2764e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_PQ_CI_0 + q_off, 0);
2765e65e175bSOded Gabbay 
2766e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_CP_LDMA_TSIZE_OFFSET_0 + q_off,
2767e65e175bSOded Gabbay 							QMAN_CPDMA_SIZE_OFFSET);
2768e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_CP_LDMA_SRC_BASE_LO_OFFSET_0 + q_off,
2769e65e175bSOded Gabbay 							QMAN_CPDMA_SRC_OFFSET);
2770e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_CP_LDMA_DST_BASE_LO_OFFSET_0 + q_off,
2771e65e175bSOded Gabbay 							QMAN_CPDMA_DST_OFFSET);
2772e65e175bSOded Gabbay 	} else {
2773e65e175bSOded Gabbay 		irq_handler_offset = hdev->asic_prop.gic_interrupts_enable ?
2774e65e175bSOded Gabbay 				mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR :
2775e65e175bSOded Gabbay 				le32_to_cpu(dyn_regs->gic_dma_qm_irq_ctrl);
2776e65e175bSOded Gabbay 
2777e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_CP_LDMA_TSIZE_OFFSET_0 + q_off,
2778e65e175bSOded Gabbay 							QMAN_LDMA_SIZE_OFFSET);
2779e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_CP_LDMA_SRC_BASE_LO_OFFSET_0 + q_off,
2780e65e175bSOded Gabbay 							QMAN_LDMA_SRC_OFFSET);
2781e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_CP_LDMA_DST_BASE_LO_OFFSET_0 + q_off,
2782e65e175bSOded Gabbay 							QMAN_LDMA_DST_OFFSET);
2783e65e175bSOded Gabbay 
2784e65e175bSOded Gabbay 		/* Configure RAZWI IRQ */
2785e65e175bSOded Gabbay 		dma_qm_err_cfg = HBM_DMA_QMAN_GLBL_ERR_CFG_MSG_EN_MASK;
2786e65e175bSOded Gabbay 		if (hdev->stop_on_err)
2787e65e175bSOded Gabbay 			dma_qm_err_cfg |=
2788e65e175bSOded Gabbay 				HBM_DMA_QMAN_GLBL_ERR_CFG_STOP_ON_ERR_EN_MASK;
2789e65e175bSOded Gabbay 
2790e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_GLBL_ERR_CFG + dma_qm_offset, dma_qm_err_cfg);
2791e65e175bSOded Gabbay 
2792e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_GLBL_ERR_ADDR_LO + dma_qm_offset,
2793e65e175bSOded Gabbay 			lower_32_bits(CFG_BASE + irq_handler_offset));
2794e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_GLBL_ERR_ADDR_HI + dma_qm_offset,
2795e65e175bSOded Gabbay 			upper_32_bits(CFG_BASE + irq_handler_offset));
2796e65e175bSOded Gabbay 
2797e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_GLBL_ERR_WDATA + dma_qm_offset,
2798e65e175bSOded Gabbay 			gaudi_irq_map_table[GAUDI_EVENT_DMA0_QM].cpu_id +
2799e65e175bSOded Gabbay 									dma_id);
2800e65e175bSOded Gabbay 
2801e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_ARB_ERR_MSG_EN + dma_qm_offset,
2802e65e175bSOded Gabbay 				QM_ARB_ERR_MSG_EN_MASK);
2803e65e175bSOded Gabbay 
2804e65e175bSOded Gabbay 		/* Set timeout to maximum */
2805e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_ARB_SLV_CHOISE_WDT + dma_qm_offset, GAUDI_ARB_WDT_TIMEOUT);
2806e65e175bSOded Gabbay 
2807e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_GLBL_CFG1 + dma_qm_offset, 0);
2808e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_GLBL_PROT + dma_qm_offset,
2809e65e175bSOded Gabbay 				QMAN_INTERNAL_MAKE_TRUSTED);
2810e65e175bSOded Gabbay 	}
2811e65e175bSOded Gabbay 
2812e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_MSG_BASE0_ADDR_LO_0 + q_off, mtr_base_en_lo);
2813e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_MSG_BASE0_ADDR_HI_0 + q_off, mtr_base_en_hi);
2814e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_MSG_BASE1_ADDR_LO_0 + q_off, so_base_en_lo);
2815e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_CP_MSG_BASE1_ADDR_HI_0 + q_off, so_base_en_hi);
2816e65e175bSOded Gabbay 
2817e65e175bSOded Gabbay 	/* Configure DMA5 CP_MSG_BASE 2/3 for sync stream collective */
2818e65e175bSOded Gabbay 	if (gaudi_dma_assignment[dma_id] == GAUDI_ENGINE_ID_DMA_5) {
2819e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_CP_MSG_BASE2_ADDR_LO_0 + q_off,
2820e65e175bSOded Gabbay 				mtr_base_ws_lo);
2821e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_CP_MSG_BASE2_ADDR_HI_0 + q_off,
2822e65e175bSOded Gabbay 				mtr_base_ws_hi);
2823e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_CP_MSG_BASE3_ADDR_LO_0 + q_off,
2824e65e175bSOded Gabbay 				so_base_ws_lo);
2825e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_CP_MSG_BASE3_ADDR_HI_0 + q_off,
2826e65e175bSOded Gabbay 				so_base_ws_hi);
2827e65e175bSOded Gabbay 	}
2828e65e175bSOded Gabbay }
2829e65e175bSOded Gabbay 
gaudi_init_hbm_dma_qmans(struct hl_device * hdev)2830e65e175bSOded Gabbay static void gaudi_init_hbm_dma_qmans(struct hl_device *hdev)
2831e65e175bSOded Gabbay {
2832e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
2833e65e175bSOded Gabbay 	struct gaudi_internal_qman_info *q;
2834e65e175bSOded Gabbay 	u64 qman_base_addr;
2835e65e175bSOded Gabbay 	int i, j, dma_id, internal_q_index;
2836e65e175bSOded Gabbay 
2837e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_HBM_DMA)
2838e65e175bSOded Gabbay 		return;
2839e65e175bSOded Gabbay 
2840e65e175bSOded Gabbay 	for (i = 0 ; i < HBM_DMA_NUMBER_OF_CHNLS ; i++) {
2841e65e175bSOded Gabbay 		dma_id = gaudi_dma_assignment[GAUDI_HBM_DMA_1 + i];
2842e65e175bSOded Gabbay 
2843e65e175bSOded Gabbay 		for (j = 0 ; j < QMAN_STREAMS ; j++) {
2844e65e175bSOded Gabbay 			 /*
2845e65e175bSOded Gabbay 			  * Add the CPU queue in order to get the correct queue
2846e65e175bSOded Gabbay 			  * number as all internal queue are placed after it
2847e65e175bSOded Gabbay 			  */
2848e65e175bSOded Gabbay 			internal_q_index = dma_id * QMAN_STREAMS + j + 1;
2849e65e175bSOded Gabbay 
2850e65e175bSOded Gabbay 			q = &gaudi->internal_qmans[internal_q_index];
2851e65e175bSOded Gabbay 			qman_base_addr = (u64) q->pq_dma_addr;
2852e65e175bSOded Gabbay 			gaudi_init_hbm_dma_qman(hdev, dma_id, j,
2853e65e175bSOded Gabbay 						qman_base_addr);
2854e65e175bSOded Gabbay 		}
2855e65e175bSOded Gabbay 
2856e65e175bSOded Gabbay 		/* Initializing lower CP for HBM DMA QMAN */
2857e65e175bSOded Gabbay 		gaudi_init_hbm_dma_qman(hdev, dma_id, 4, 0);
2858e65e175bSOded Gabbay 
2859e65e175bSOded Gabbay 		gaudi_init_dma_core(hdev, dma_id);
2860e65e175bSOded Gabbay 
2861e65e175bSOded Gabbay 		gaudi_enable_qman(hdev, dma_id, HBM_DMA_QMAN_ENABLE);
2862e65e175bSOded Gabbay 	}
2863e65e175bSOded Gabbay 
2864e65e175bSOded Gabbay 	gaudi->hw_cap_initialized |= HW_CAP_HBM_DMA;
2865e65e175bSOded Gabbay }
2866e65e175bSOded Gabbay 
gaudi_init_mme_qman(struct hl_device * hdev,u32 mme_offset,int qman_id,u64 qman_base_addr)2867e65e175bSOded Gabbay static void gaudi_init_mme_qman(struct hl_device *hdev, u32 mme_offset,
2868e65e175bSOded Gabbay 					int qman_id, u64 qman_base_addr)
2869e65e175bSOded Gabbay {
2870e65e175bSOded Gabbay 	struct cpu_dyn_regs *dyn_regs =
2871e65e175bSOded Gabbay 			&hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
2872e65e175bSOded Gabbay 	u32 mtr_base_lo, mtr_base_hi;
2873e65e175bSOded Gabbay 	u32 so_base_lo, so_base_hi;
2874e65e175bSOded Gabbay 	u32 irq_handler_offset;
2875e65e175bSOded Gabbay 	u32 q_off, mme_id;
2876e65e175bSOded Gabbay 	u32 mme_qm_err_cfg;
2877e65e175bSOded Gabbay 
2878e65e175bSOded Gabbay 	mtr_base_lo = lower_32_bits(CFG_BASE +
2879e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
2880e65e175bSOded Gabbay 	mtr_base_hi = upper_32_bits(CFG_BASE +
2881e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
2882e65e175bSOded Gabbay 	so_base_lo = lower_32_bits(CFG_BASE +
2883e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0);
2884e65e175bSOded Gabbay 	so_base_hi = upper_32_bits(CFG_BASE +
2885e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0);
2886e65e175bSOded Gabbay 
2887e65e175bSOded Gabbay 	q_off = mme_offset + qman_id * 4;
2888e65e175bSOded Gabbay 
2889e65e175bSOded Gabbay 	if (qman_id < 4) {
2890e65e175bSOded Gabbay 		WREG32(mmMME0_QM_PQ_BASE_LO_0 + q_off,
2891e65e175bSOded Gabbay 					lower_32_bits(qman_base_addr));
2892e65e175bSOded Gabbay 		WREG32(mmMME0_QM_PQ_BASE_HI_0 + q_off,
2893e65e175bSOded Gabbay 					upper_32_bits(qman_base_addr));
2894e65e175bSOded Gabbay 
2895e65e175bSOded Gabbay 		WREG32(mmMME0_QM_PQ_SIZE_0 + q_off, ilog2(MME_QMAN_LENGTH));
2896e65e175bSOded Gabbay 		WREG32(mmMME0_QM_PQ_PI_0 + q_off, 0);
2897e65e175bSOded Gabbay 		WREG32(mmMME0_QM_PQ_CI_0 + q_off, 0);
2898e65e175bSOded Gabbay 
2899e65e175bSOded Gabbay 		WREG32(mmMME0_QM_CP_LDMA_TSIZE_OFFSET_0 + q_off,
2900e65e175bSOded Gabbay 							QMAN_CPDMA_SIZE_OFFSET);
2901e65e175bSOded Gabbay 		WREG32(mmMME0_QM_CP_LDMA_SRC_BASE_LO_OFFSET_0 + q_off,
2902e65e175bSOded Gabbay 							QMAN_CPDMA_SRC_OFFSET);
2903e65e175bSOded Gabbay 		WREG32(mmMME0_QM_CP_LDMA_DST_BASE_LO_OFFSET_0 + q_off,
2904e65e175bSOded Gabbay 							QMAN_CPDMA_DST_OFFSET);
2905e65e175bSOded Gabbay 	} else {
2906e65e175bSOded Gabbay 		irq_handler_offset = hdev->asic_prop.gic_interrupts_enable ?
2907e65e175bSOded Gabbay 				mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR :
2908e65e175bSOded Gabbay 				le32_to_cpu(dyn_regs->gic_mme_qm_irq_ctrl);
2909e65e175bSOded Gabbay 
2910e65e175bSOded Gabbay 		WREG32(mmMME0_QM_CP_LDMA_TSIZE_OFFSET_0 + q_off,
2911e65e175bSOded Gabbay 							QMAN_LDMA_SIZE_OFFSET);
2912e65e175bSOded Gabbay 		WREG32(mmMME0_QM_CP_LDMA_SRC_BASE_LO_OFFSET_0 + q_off,
2913e65e175bSOded Gabbay 							QMAN_LDMA_SRC_OFFSET);
2914e65e175bSOded Gabbay 		WREG32(mmMME0_QM_CP_LDMA_DST_BASE_LO_OFFSET_0 + q_off,
2915e65e175bSOded Gabbay 							QMAN_LDMA_DST_OFFSET);
2916e65e175bSOded Gabbay 
2917e65e175bSOded Gabbay 		/* Configure RAZWI IRQ */
2918e65e175bSOded Gabbay 		mme_id = mme_offset /
2919e65e175bSOded Gabbay 				(mmMME1_QM_GLBL_CFG0 - mmMME0_QM_GLBL_CFG0) / 2;
2920e65e175bSOded Gabbay 
2921e65e175bSOded Gabbay 		mme_qm_err_cfg = MME_QMAN_GLBL_ERR_CFG_MSG_EN_MASK;
2922e65e175bSOded Gabbay 		if (hdev->stop_on_err)
2923e65e175bSOded Gabbay 			mme_qm_err_cfg |=
2924e65e175bSOded Gabbay 				MME_QMAN_GLBL_ERR_CFG_STOP_ON_ERR_EN_MASK;
2925e65e175bSOded Gabbay 
2926e65e175bSOded Gabbay 		WREG32(mmMME0_QM_GLBL_ERR_CFG + mme_offset, mme_qm_err_cfg);
2927e65e175bSOded Gabbay 
2928e65e175bSOded Gabbay 		WREG32(mmMME0_QM_GLBL_ERR_ADDR_LO + mme_offset,
2929e65e175bSOded Gabbay 			lower_32_bits(CFG_BASE + irq_handler_offset));
2930e65e175bSOded Gabbay 		WREG32(mmMME0_QM_GLBL_ERR_ADDR_HI + mme_offset,
2931e65e175bSOded Gabbay 			upper_32_bits(CFG_BASE + irq_handler_offset));
2932e65e175bSOded Gabbay 
2933e65e175bSOded Gabbay 		WREG32(mmMME0_QM_GLBL_ERR_WDATA + mme_offset,
2934e65e175bSOded Gabbay 			gaudi_irq_map_table[GAUDI_EVENT_MME0_QM].cpu_id +
2935e65e175bSOded Gabbay 									mme_id);
2936e65e175bSOded Gabbay 
2937e65e175bSOded Gabbay 		WREG32(mmMME0_QM_ARB_ERR_MSG_EN + mme_offset,
2938e65e175bSOded Gabbay 				QM_ARB_ERR_MSG_EN_MASK);
2939e65e175bSOded Gabbay 
2940e65e175bSOded Gabbay 		/* Set timeout to maximum */
2941e65e175bSOded Gabbay 		WREG32(mmMME0_QM_ARB_SLV_CHOISE_WDT + mme_offset, GAUDI_ARB_WDT_TIMEOUT);
2942e65e175bSOded Gabbay 
2943e65e175bSOded Gabbay 		WREG32(mmMME0_QM_GLBL_CFG1 + mme_offset, 0);
2944e65e175bSOded Gabbay 		WREG32(mmMME0_QM_GLBL_PROT + mme_offset,
2945e65e175bSOded Gabbay 				QMAN_INTERNAL_MAKE_TRUSTED);
2946e65e175bSOded Gabbay 	}
2947e65e175bSOded Gabbay 
2948e65e175bSOded Gabbay 	WREG32(mmMME0_QM_CP_MSG_BASE0_ADDR_LO_0 + q_off, mtr_base_lo);
2949e65e175bSOded Gabbay 	WREG32(mmMME0_QM_CP_MSG_BASE0_ADDR_HI_0 + q_off, mtr_base_hi);
2950e65e175bSOded Gabbay 	WREG32(mmMME0_QM_CP_MSG_BASE1_ADDR_LO_0 + q_off, so_base_lo);
2951e65e175bSOded Gabbay 	WREG32(mmMME0_QM_CP_MSG_BASE1_ADDR_HI_0 + q_off, so_base_hi);
2952e65e175bSOded Gabbay }
2953e65e175bSOded Gabbay 
gaudi_init_mme_qmans(struct hl_device * hdev)2954e65e175bSOded Gabbay static void gaudi_init_mme_qmans(struct hl_device *hdev)
2955e65e175bSOded Gabbay {
2956e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
2957e65e175bSOded Gabbay 	struct gaudi_internal_qman_info *q;
2958e65e175bSOded Gabbay 	u64 qman_base_addr;
2959e65e175bSOded Gabbay 	u32 mme_offset;
2960e65e175bSOded Gabbay 	int i, internal_q_index;
2961e65e175bSOded Gabbay 
2962e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_MME)
2963e65e175bSOded Gabbay 		return;
2964e65e175bSOded Gabbay 
2965e65e175bSOded Gabbay 	/*
2966e65e175bSOded Gabbay 	 * map GAUDI_QUEUE_ID_MME_0_X to the N_W_MME (mmMME2_QM_BASE)
2967e65e175bSOded Gabbay 	 * and GAUDI_QUEUE_ID_MME_1_X to the S_W_MME (mmMME0_QM_BASE)
2968e65e175bSOded Gabbay 	 */
2969e65e175bSOded Gabbay 
2970e65e175bSOded Gabbay 	mme_offset = mmMME2_QM_GLBL_CFG0 - mmMME0_QM_GLBL_CFG0;
2971e65e175bSOded Gabbay 
2972e65e175bSOded Gabbay 	for (i = 0 ; i < MME_NUMBER_OF_QMANS ; i++) {
2973e65e175bSOded Gabbay 		internal_q_index = GAUDI_QUEUE_ID_MME_0_0 + i;
2974e65e175bSOded Gabbay 		q = &gaudi->internal_qmans[internal_q_index];
2975e65e175bSOded Gabbay 		qman_base_addr = (u64) q->pq_dma_addr;
2976e65e175bSOded Gabbay 		gaudi_init_mme_qman(hdev, mme_offset, (i & 0x3),
2977e65e175bSOded Gabbay 					qman_base_addr);
2978e65e175bSOded Gabbay 		if (i == 3)
2979e65e175bSOded Gabbay 			mme_offset = 0;
2980e65e175bSOded Gabbay 	}
2981e65e175bSOded Gabbay 
2982e65e175bSOded Gabbay 	/* Initializing lower CP for MME QMANs */
2983e65e175bSOded Gabbay 	mme_offset = mmMME2_QM_GLBL_CFG0 - mmMME0_QM_GLBL_CFG0;
2984e65e175bSOded Gabbay 	gaudi_init_mme_qman(hdev, mme_offset, 4, 0);
2985e65e175bSOded Gabbay 	gaudi_init_mme_qman(hdev, 0, 4, 0);
2986e65e175bSOded Gabbay 
2987e65e175bSOded Gabbay 	WREG32(mmMME2_QM_GLBL_CFG0, QMAN_MME_ENABLE);
2988e65e175bSOded Gabbay 	WREG32(mmMME0_QM_GLBL_CFG0, QMAN_MME_ENABLE);
2989e65e175bSOded Gabbay 
2990e65e175bSOded Gabbay 	gaudi->hw_cap_initialized |= HW_CAP_MME;
2991e65e175bSOded Gabbay }
2992e65e175bSOded Gabbay 
gaudi_init_tpc_qman(struct hl_device * hdev,u32 tpc_offset,int qman_id,u64 qman_base_addr)2993e65e175bSOded Gabbay static void gaudi_init_tpc_qman(struct hl_device *hdev, u32 tpc_offset,
2994e65e175bSOded Gabbay 				int qman_id, u64 qman_base_addr)
2995e65e175bSOded Gabbay {
2996e65e175bSOded Gabbay 	struct cpu_dyn_regs *dyn_regs =
2997e65e175bSOded Gabbay 			&hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
2998e65e175bSOded Gabbay 	u32 mtr_base_en_lo, mtr_base_en_hi, mtr_base_ws_lo, mtr_base_ws_hi;
2999e65e175bSOded Gabbay 	u32 so_base_en_lo, so_base_en_hi, so_base_ws_lo, so_base_ws_hi;
3000e65e175bSOded Gabbay 	u32 tpc_qm_err_cfg, irq_handler_offset;
3001e65e175bSOded Gabbay 	u32 q_off, tpc_id;
3002e65e175bSOded Gabbay 
3003e65e175bSOded Gabbay 	mtr_base_en_lo = lower_32_bits(CFG_BASE +
3004e65e175bSOded Gabbay 			mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
3005e65e175bSOded Gabbay 	mtr_base_en_hi = upper_32_bits(CFG_BASE +
3006e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
3007e65e175bSOded Gabbay 	so_base_en_lo = lower_32_bits(CFG_BASE +
3008e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0);
3009e65e175bSOded Gabbay 	so_base_en_hi = upper_32_bits(CFG_BASE +
3010e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0);
3011e65e175bSOded Gabbay 	mtr_base_ws_lo = lower_32_bits(CFG_BASE +
3012e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
3013e65e175bSOded Gabbay 	mtr_base_ws_hi = upper_32_bits(CFG_BASE +
3014e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
3015e65e175bSOded Gabbay 	so_base_ws_lo = lower_32_bits(CFG_BASE +
3016e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_SOB_OBJ_0);
3017e65e175bSOded Gabbay 	so_base_ws_hi = upper_32_bits(CFG_BASE +
3018e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_SOB_OBJ_0);
3019e65e175bSOded Gabbay 
3020e65e175bSOded Gabbay 	q_off = tpc_offset + qman_id * 4;
3021e65e175bSOded Gabbay 
3022e65e175bSOded Gabbay 	tpc_id = tpc_offset /
3023e65e175bSOded Gabbay 			(mmTPC1_QM_GLBL_CFG0 - mmTPC0_QM_GLBL_CFG0);
3024e65e175bSOded Gabbay 
3025e65e175bSOded Gabbay 	if (qman_id < 4) {
3026e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_PQ_BASE_LO_0 + q_off,
3027e65e175bSOded Gabbay 					lower_32_bits(qman_base_addr));
3028e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_PQ_BASE_HI_0 + q_off,
3029e65e175bSOded Gabbay 					upper_32_bits(qman_base_addr));
3030e65e175bSOded Gabbay 
3031e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_PQ_SIZE_0 + q_off, ilog2(TPC_QMAN_LENGTH));
3032e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_PQ_PI_0 + q_off, 0);
3033e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_PQ_CI_0 + q_off, 0);
3034e65e175bSOded Gabbay 
3035e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_CP_LDMA_TSIZE_OFFSET_0 + q_off,
3036e65e175bSOded Gabbay 							QMAN_CPDMA_SIZE_OFFSET);
3037e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_CP_LDMA_SRC_BASE_LO_OFFSET_0 + q_off,
3038e65e175bSOded Gabbay 							QMAN_CPDMA_SRC_OFFSET);
3039e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_CP_LDMA_DST_BASE_LO_OFFSET_0 + q_off,
3040e65e175bSOded Gabbay 							QMAN_CPDMA_DST_OFFSET);
3041e65e175bSOded Gabbay 	} else {
3042e65e175bSOded Gabbay 		irq_handler_offset = hdev->asic_prop.gic_interrupts_enable ?
3043e65e175bSOded Gabbay 				mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR :
3044e65e175bSOded Gabbay 				le32_to_cpu(dyn_regs->gic_tpc_qm_irq_ctrl);
3045e65e175bSOded Gabbay 
3046e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_CP_LDMA_TSIZE_OFFSET_0 + q_off,
3047e65e175bSOded Gabbay 							QMAN_LDMA_SIZE_OFFSET);
3048e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_CP_LDMA_SRC_BASE_LO_OFFSET_0 + q_off,
3049e65e175bSOded Gabbay 							QMAN_LDMA_SRC_OFFSET);
3050e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_CP_LDMA_DST_BASE_LO_OFFSET_0 + q_off,
3051e65e175bSOded Gabbay 							QMAN_LDMA_DST_OFFSET);
3052e65e175bSOded Gabbay 
3053e65e175bSOded Gabbay 		/* Configure RAZWI IRQ */
3054e65e175bSOded Gabbay 		tpc_qm_err_cfg = TPC_QMAN_GLBL_ERR_CFG_MSG_EN_MASK;
3055e65e175bSOded Gabbay 		if (hdev->stop_on_err)
3056e65e175bSOded Gabbay 			tpc_qm_err_cfg |=
3057e65e175bSOded Gabbay 				TPC_QMAN_GLBL_ERR_CFG_STOP_ON_ERR_EN_MASK;
3058e65e175bSOded Gabbay 
3059e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_GLBL_ERR_CFG + tpc_offset, tpc_qm_err_cfg);
3060e65e175bSOded Gabbay 
3061e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_GLBL_ERR_ADDR_LO + tpc_offset,
3062e65e175bSOded Gabbay 			lower_32_bits(CFG_BASE + irq_handler_offset));
3063e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_GLBL_ERR_ADDR_HI + tpc_offset,
3064e65e175bSOded Gabbay 			upper_32_bits(CFG_BASE + irq_handler_offset));
3065e65e175bSOded Gabbay 
3066e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_GLBL_ERR_WDATA + tpc_offset,
3067e65e175bSOded Gabbay 			gaudi_irq_map_table[GAUDI_EVENT_TPC0_QM].cpu_id +
3068e65e175bSOded Gabbay 									tpc_id);
3069e65e175bSOded Gabbay 
3070e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_ARB_ERR_MSG_EN + tpc_offset,
3071e65e175bSOded Gabbay 				QM_ARB_ERR_MSG_EN_MASK);
3072e65e175bSOded Gabbay 
3073e65e175bSOded Gabbay 		/* Set timeout to maximum */
3074e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_ARB_SLV_CHOISE_WDT + tpc_offset, GAUDI_ARB_WDT_TIMEOUT);
3075e65e175bSOded Gabbay 
3076e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_GLBL_CFG1 + tpc_offset, 0);
3077e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_GLBL_PROT + tpc_offset,
3078e65e175bSOded Gabbay 				QMAN_INTERNAL_MAKE_TRUSTED);
3079e65e175bSOded Gabbay 	}
3080e65e175bSOded Gabbay 
3081e65e175bSOded Gabbay 	WREG32(mmTPC0_QM_CP_MSG_BASE0_ADDR_LO_0 + q_off, mtr_base_en_lo);
3082e65e175bSOded Gabbay 	WREG32(mmTPC0_QM_CP_MSG_BASE0_ADDR_HI_0 + q_off, mtr_base_en_hi);
3083e65e175bSOded Gabbay 	WREG32(mmTPC0_QM_CP_MSG_BASE1_ADDR_LO_0 + q_off, so_base_en_lo);
3084e65e175bSOded Gabbay 	WREG32(mmTPC0_QM_CP_MSG_BASE1_ADDR_HI_0 + q_off, so_base_en_hi);
3085e65e175bSOded Gabbay 
3086e65e175bSOded Gabbay 	/* Configure TPC7 CP_MSG_BASE 2/3 for sync stream collective */
3087e65e175bSOded Gabbay 	if (tpc_id == 6) {
3088e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_CP_MSG_BASE2_ADDR_LO_0 + q_off,
3089e65e175bSOded Gabbay 				mtr_base_ws_lo);
3090e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_CP_MSG_BASE2_ADDR_HI_0 + q_off,
3091e65e175bSOded Gabbay 				mtr_base_ws_hi);
3092e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_CP_MSG_BASE3_ADDR_LO_0 + q_off,
3093e65e175bSOded Gabbay 				so_base_ws_lo);
3094e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_CP_MSG_BASE3_ADDR_HI_0 + q_off,
3095e65e175bSOded Gabbay 				so_base_ws_hi);
3096e65e175bSOded Gabbay 	}
3097e65e175bSOded Gabbay }
3098e65e175bSOded Gabbay 
gaudi_init_tpc_qmans(struct hl_device * hdev)3099e65e175bSOded Gabbay static void gaudi_init_tpc_qmans(struct hl_device *hdev)
3100e65e175bSOded Gabbay {
3101e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3102e65e175bSOded Gabbay 	struct gaudi_internal_qman_info *q;
3103e65e175bSOded Gabbay 	u64 qman_base_addr;
3104e65e175bSOded Gabbay 	u32 so_base_hi, tpc_offset = 0;
3105e65e175bSOded Gabbay 	u32 tpc_delta = mmTPC1_CFG_SM_BASE_ADDRESS_HIGH -
3106e65e175bSOded Gabbay 			mmTPC0_CFG_SM_BASE_ADDRESS_HIGH;
3107e65e175bSOded Gabbay 	int i, tpc_id, internal_q_index;
3108e65e175bSOded Gabbay 
3109e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_TPC_MASK)
3110e65e175bSOded Gabbay 		return;
3111e65e175bSOded Gabbay 
3112e65e175bSOded Gabbay 	so_base_hi = upper_32_bits(CFG_BASE +
3113e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0);
3114e65e175bSOded Gabbay 
3115e65e175bSOded Gabbay 	for (tpc_id = 0 ; tpc_id < TPC_NUMBER_OF_ENGINES ; tpc_id++) {
3116e65e175bSOded Gabbay 		for (i = 0 ; i < QMAN_STREAMS ; i++) {
3117e65e175bSOded Gabbay 			internal_q_index = GAUDI_QUEUE_ID_TPC_0_0 +
3118e65e175bSOded Gabbay 						tpc_id * QMAN_STREAMS + i;
3119e65e175bSOded Gabbay 			q = &gaudi->internal_qmans[internal_q_index];
3120e65e175bSOded Gabbay 			qman_base_addr = (u64) q->pq_dma_addr;
3121e65e175bSOded Gabbay 			gaudi_init_tpc_qman(hdev, tpc_offset, i,
3122e65e175bSOded Gabbay 						qman_base_addr);
3123e65e175bSOded Gabbay 
3124e65e175bSOded Gabbay 			if (i == 3) {
3125e65e175bSOded Gabbay 				/* Initializing lower CP for TPC QMAN */
3126e65e175bSOded Gabbay 				gaudi_init_tpc_qman(hdev, tpc_offset, 4, 0);
3127e65e175bSOded Gabbay 
3128e65e175bSOded Gabbay 				/* Enable the QMAN and TPC channel */
3129e65e175bSOded Gabbay 				WREG32(mmTPC0_QM_GLBL_CFG0 + tpc_offset,
3130e65e175bSOded Gabbay 						QMAN_TPC_ENABLE);
3131e65e175bSOded Gabbay 			}
3132e65e175bSOded Gabbay 		}
3133e65e175bSOded Gabbay 
3134e65e175bSOded Gabbay 		WREG32(mmTPC0_CFG_SM_BASE_ADDRESS_HIGH + tpc_id * tpc_delta,
3135e65e175bSOded Gabbay 				so_base_hi);
3136e65e175bSOded Gabbay 
3137e65e175bSOded Gabbay 		tpc_offset += mmTPC1_QM_GLBL_CFG0 - mmTPC0_QM_GLBL_CFG0;
3138e65e175bSOded Gabbay 
3139e65e175bSOded Gabbay 		gaudi->hw_cap_initialized |=
3140e65e175bSOded Gabbay 				FIELD_PREP(HW_CAP_TPC_MASK, 1 << tpc_id);
3141e65e175bSOded Gabbay 	}
3142e65e175bSOded Gabbay }
3143e65e175bSOded Gabbay 
gaudi_init_nic_qman(struct hl_device * hdev,u32 nic_offset,int qman_id,u64 qman_base_addr,int nic_id)3144e65e175bSOded Gabbay static void gaudi_init_nic_qman(struct hl_device *hdev, u32 nic_offset,
3145e65e175bSOded Gabbay 				int qman_id, u64 qman_base_addr, int nic_id)
3146e65e175bSOded Gabbay {
3147e65e175bSOded Gabbay 	struct cpu_dyn_regs *dyn_regs =
3148e65e175bSOded Gabbay 			&hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
3149e65e175bSOded Gabbay 	u32 mtr_base_en_lo, mtr_base_en_hi, mtr_base_ws_lo, mtr_base_ws_hi;
3150e65e175bSOded Gabbay 	u32 so_base_en_lo, so_base_en_hi, so_base_ws_lo, so_base_ws_hi;
3151e65e175bSOded Gabbay 	u32 nic_qm_err_cfg, irq_handler_offset;
3152e65e175bSOded Gabbay 	u32 q_off;
3153e65e175bSOded Gabbay 
3154e65e175bSOded Gabbay 	mtr_base_en_lo = lower_32_bits((CFG_BASE & U32_MAX) +
3155e65e175bSOded Gabbay 			mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
3156e65e175bSOded Gabbay 	mtr_base_en_hi = upper_32_bits(CFG_BASE +
3157e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
3158e65e175bSOded Gabbay 	so_base_en_lo = lower_32_bits((CFG_BASE & U32_MAX) +
3159e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0);
3160e65e175bSOded Gabbay 	so_base_en_hi = upper_32_bits(CFG_BASE +
3161e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0);
3162e65e175bSOded Gabbay 	mtr_base_ws_lo = lower_32_bits((CFG_BASE & U32_MAX) +
3163e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
3164e65e175bSOded Gabbay 	mtr_base_ws_hi = upper_32_bits(CFG_BASE +
3165e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
3166e65e175bSOded Gabbay 	so_base_ws_lo = lower_32_bits((CFG_BASE & U32_MAX) +
3167e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_SOB_OBJ_0);
3168e65e175bSOded Gabbay 	so_base_ws_hi = upper_32_bits(CFG_BASE +
3169e65e175bSOded Gabbay 				mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_SOB_OBJ_0);
3170e65e175bSOded Gabbay 
3171e65e175bSOded Gabbay 	q_off = nic_offset + qman_id * 4;
3172e65e175bSOded Gabbay 
3173e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_PQ_BASE_LO_0 + q_off, lower_32_bits(qman_base_addr));
3174e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_PQ_BASE_HI_0 + q_off, upper_32_bits(qman_base_addr));
3175e65e175bSOded Gabbay 
3176e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_PQ_SIZE_0 + q_off, ilog2(NIC_QMAN_LENGTH));
3177e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_PQ_PI_0 + q_off, 0);
3178e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_PQ_CI_0 + q_off, 0);
3179e65e175bSOded Gabbay 
3180e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_CP_LDMA_TSIZE_OFFSET_0 + q_off,
3181e65e175bSOded Gabbay 							QMAN_LDMA_SIZE_OFFSET);
3182e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_CP_LDMA_SRC_BASE_LO_OFFSET_0 + q_off,
3183e65e175bSOded Gabbay 							QMAN_LDMA_SRC_OFFSET);
3184e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_CP_LDMA_DST_BASE_LO_OFFSET_0 + q_off,
3185e65e175bSOded Gabbay 							QMAN_LDMA_DST_OFFSET);
3186e65e175bSOded Gabbay 
3187e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_CP_MSG_BASE0_ADDR_LO_0 + q_off, mtr_base_en_lo);
3188e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_CP_MSG_BASE0_ADDR_HI_0 + q_off, mtr_base_en_hi);
3189e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_CP_MSG_BASE1_ADDR_LO_0 + q_off, so_base_en_lo);
3190e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_CP_MSG_BASE1_ADDR_HI_0 + q_off, so_base_en_hi);
3191e65e175bSOded Gabbay 
3192e65e175bSOded Gabbay 	/* Configure NIC CP_MSG_BASE 2/3 for sync stream collective */
3193e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_CP_MSG_BASE2_ADDR_LO_0 + q_off, mtr_base_ws_lo);
3194e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_CP_MSG_BASE2_ADDR_HI_0 + q_off, mtr_base_ws_hi);
3195e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_CP_MSG_BASE3_ADDR_LO_0 + q_off, so_base_ws_lo);
3196e65e175bSOded Gabbay 	WREG32(mmNIC0_QM0_CP_MSG_BASE3_ADDR_HI_0 + q_off, so_base_ws_hi);
3197e65e175bSOded Gabbay 
3198e65e175bSOded Gabbay 	if (qman_id == 0) {
3199e65e175bSOded Gabbay 		irq_handler_offset = hdev->asic_prop.gic_interrupts_enable ?
3200e65e175bSOded Gabbay 				mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR :
3201e65e175bSOded Gabbay 				le32_to_cpu(dyn_regs->gic_nic_qm_irq_ctrl);
3202e65e175bSOded Gabbay 
3203e65e175bSOded Gabbay 		/* Configure RAZWI IRQ */
3204e65e175bSOded Gabbay 		nic_qm_err_cfg = NIC_QMAN_GLBL_ERR_CFG_MSG_EN_MASK;
3205e65e175bSOded Gabbay 		if (hdev->stop_on_err)
3206e65e175bSOded Gabbay 			nic_qm_err_cfg |=
3207e65e175bSOded Gabbay 				NIC_QMAN_GLBL_ERR_CFG_STOP_ON_ERR_EN_MASK;
3208e65e175bSOded Gabbay 
3209e65e175bSOded Gabbay 		WREG32(mmNIC0_QM0_GLBL_ERR_CFG + nic_offset, nic_qm_err_cfg);
3210e65e175bSOded Gabbay 
3211e65e175bSOded Gabbay 		WREG32(mmNIC0_QM0_GLBL_ERR_ADDR_LO + nic_offset,
3212e65e175bSOded Gabbay 			lower_32_bits(CFG_BASE + irq_handler_offset));
3213e65e175bSOded Gabbay 		WREG32(mmNIC0_QM0_GLBL_ERR_ADDR_HI + nic_offset,
3214e65e175bSOded Gabbay 			upper_32_bits(CFG_BASE + irq_handler_offset));
3215e65e175bSOded Gabbay 
3216e65e175bSOded Gabbay 		WREG32(mmNIC0_QM0_GLBL_ERR_WDATA + nic_offset,
3217e65e175bSOded Gabbay 			gaudi_irq_map_table[GAUDI_EVENT_NIC0_QM0].cpu_id +
3218e65e175bSOded Gabbay 									nic_id);
3219e65e175bSOded Gabbay 
3220e65e175bSOded Gabbay 		WREG32(mmNIC0_QM0_ARB_ERR_MSG_EN + nic_offset,
3221e65e175bSOded Gabbay 				QM_ARB_ERR_MSG_EN_MASK);
3222e65e175bSOded Gabbay 
3223e65e175bSOded Gabbay 		/* Set timeout to maximum */
3224e65e175bSOded Gabbay 		WREG32(mmNIC0_QM0_ARB_SLV_CHOISE_WDT + nic_offset, GAUDI_ARB_WDT_TIMEOUT);
3225e65e175bSOded Gabbay 
3226e65e175bSOded Gabbay 		WREG32(mmNIC0_QM0_GLBL_CFG1 + nic_offset, 0);
3227e65e175bSOded Gabbay 		WREG32(mmNIC0_QM0_GLBL_PROT + nic_offset,
3228e65e175bSOded Gabbay 				QMAN_INTERNAL_MAKE_TRUSTED);
3229e65e175bSOded Gabbay 	}
3230e65e175bSOded Gabbay }
3231e65e175bSOded Gabbay 
gaudi_init_nic_qmans(struct hl_device * hdev)3232e65e175bSOded Gabbay static void gaudi_init_nic_qmans(struct hl_device *hdev)
3233e65e175bSOded Gabbay {
3234e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3235e65e175bSOded Gabbay 	struct gaudi_internal_qman_info *q;
3236e65e175bSOded Gabbay 	u64 qman_base_addr;
3237e65e175bSOded Gabbay 	u32 nic_offset = 0;
3238e65e175bSOded Gabbay 	u32 nic_delta_between_qmans =
3239e65e175bSOded Gabbay 			mmNIC0_QM1_GLBL_CFG0 - mmNIC0_QM0_GLBL_CFG0;
3240e65e175bSOded Gabbay 	u32 nic_delta_between_nics =
3241e65e175bSOded Gabbay 			mmNIC1_QM0_GLBL_CFG0 - mmNIC0_QM0_GLBL_CFG0;
3242e65e175bSOded Gabbay 	int i, nic_id, internal_q_index;
3243e65e175bSOded Gabbay 
3244e65e175bSOded Gabbay 	if (!hdev->nic_ports_mask)
3245e65e175bSOded Gabbay 		return;
3246e65e175bSOded Gabbay 
3247e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC_MASK)
3248e65e175bSOded Gabbay 		return;
3249e65e175bSOded Gabbay 
3250e65e175bSOded Gabbay 	dev_dbg(hdev->dev, "Initializing NIC QMANs\n");
3251e65e175bSOded Gabbay 
3252e65e175bSOded Gabbay 	for (nic_id = 0 ; nic_id < NIC_NUMBER_OF_ENGINES ; nic_id++) {
3253e65e175bSOded Gabbay 		if (!(hdev->nic_ports_mask & (1 << nic_id))) {
3254e65e175bSOded Gabbay 			nic_offset += nic_delta_between_qmans;
3255e65e175bSOded Gabbay 			if (nic_id & 1) {
3256e65e175bSOded Gabbay 				nic_offset -= (nic_delta_between_qmans * 2);
3257e65e175bSOded Gabbay 				nic_offset += nic_delta_between_nics;
3258e65e175bSOded Gabbay 			}
3259e65e175bSOded Gabbay 			continue;
3260e65e175bSOded Gabbay 		}
3261e65e175bSOded Gabbay 
3262e65e175bSOded Gabbay 		for (i = 0 ; i < QMAN_STREAMS ; i++) {
3263e65e175bSOded Gabbay 			internal_q_index = GAUDI_QUEUE_ID_NIC_0_0 +
3264e65e175bSOded Gabbay 						nic_id * QMAN_STREAMS + i;
3265e65e175bSOded Gabbay 			q = &gaudi->internal_qmans[internal_q_index];
3266e65e175bSOded Gabbay 			qman_base_addr = (u64) q->pq_dma_addr;
3267e65e175bSOded Gabbay 			gaudi_init_nic_qman(hdev, nic_offset, (i & 0x3),
3268e65e175bSOded Gabbay 						qman_base_addr, nic_id);
3269e65e175bSOded Gabbay 		}
3270e65e175bSOded Gabbay 
3271e65e175bSOded Gabbay 		/* Enable the QMAN */
3272e65e175bSOded Gabbay 		WREG32(mmNIC0_QM0_GLBL_CFG0 + nic_offset, NIC_QMAN_ENABLE);
3273e65e175bSOded Gabbay 
3274e65e175bSOded Gabbay 		nic_offset += nic_delta_between_qmans;
3275e65e175bSOded Gabbay 		if (nic_id & 1) {
3276e65e175bSOded Gabbay 			nic_offset -= (nic_delta_between_qmans * 2);
3277e65e175bSOded Gabbay 			nic_offset += nic_delta_between_nics;
3278e65e175bSOded Gabbay 		}
3279e65e175bSOded Gabbay 
3280e65e175bSOded Gabbay 		gaudi->hw_cap_initialized |= 1 << (HW_CAP_NIC_SHIFT + nic_id);
3281e65e175bSOded Gabbay 	}
3282e65e175bSOded Gabbay }
3283e65e175bSOded Gabbay 
gaudi_disable_pci_dma_qmans(struct hl_device * hdev)3284e65e175bSOded Gabbay static void gaudi_disable_pci_dma_qmans(struct hl_device *hdev)
3285e65e175bSOded Gabbay {
3286e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3287e65e175bSOded Gabbay 
3288e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_PCI_DMA))
3289e65e175bSOded Gabbay 		return;
3290e65e175bSOded Gabbay 
3291e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_GLBL_CFG0, 0);
3292e65e175bSOded Gabbay 	WREG32(mmDMA1_QM_GLBL_CFG0, 0);
3293e65e175bSOded Gabbay 	WREG32(mmDMA5_QM_GLBL_CFG0, 0);
3294e65e175bSOded Gabbay }
3295e65e175bSOded Gabbay 
gaudi_disable_hbm_dma_qmans(struct hl_device * hdev)3296e65e175bSOded Gabbay static void gaudi_disable_hbm_dma_qmans(struct hl_device *hdev)
3297e65e175bSOded Gabbay {
3298e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3299e65e175bSOded Gabbay 
3300e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_HBM_DMA))
3301e65e175bSOded Gabbay 		return;
3302e65e175bSOded Gabbay 
3303e65e175bSOded Gabbay 	WREG32(mmDMA2_QM_GLBL_CFG0, 0);
3304e65e175bSOded Gabbay 	WREG32(mmDMA3_QM_GLBL_CFG0, 0);
3305e65e175bSOded Gabbay 	WREG32(mmDMA4_QM_GLBL_CFG0, 0);
3306e65e175bSOded Gabbay 	WREG32(mmDMA6_QM_GLBL_CFG0, 0);
3307e65e175bSOded Gabbay 	WREG32(mmDMA7_QM_GLBL_CFG0, 0);
3308e65e175bSOded Gabbay }
3309e65e175bSOded Gabbay 
gaudi_disable_mme_qmans(struct hl_device * hdev)3310e65e175bSOded Gabbay static void gaudi_disable_mme_qmans(struct hl_device *hdev)
3311e65e175bSOded Gabbay {
3312e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3313e65e175bSOded Gabbay 
3314e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_MME))
3315e65e175bSOded Gabbay 		return;
3316e65e175bSOded Gabbay 
3317e65e175bSOded Gabbay 	WREG32(mmMME2_QM_GLBL_CFG0, 0);
3318e65e175bSOded Gabbay 	WREG32(mmMME0_QM_GLBL_CFG0, 0);
3319e65e175bSOded Gabbay }
3320e65e175bSOded Gabbay 
gaudi_disable_tpc_qmans(struct hl_device * hdev)3321e65e175bSOded Gabbay static void gaudi_disable_tpc_qmans(struct hl_device *hdev)
3322e65e175bSOded Gabbay {
3323e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3324e65e175bSOded Gabbay 	u32 tpc_offset = 0;
3325e65e175bSOded Gabbay 	int tpc_id;
3326e65e175bSOded Gabbay 
3327e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_TPC_MASK))
3328e65e175bSOded Gabbay 		return;
3329e65e175bSOded Gabbay 
3330e65e175bSOded Gabbay 	for (tpc_id = 0 ; tpc_id < TPC_NUMBER_OF_ENGINES ; tpc_id++) {
3331e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_GLBL_CFG0 + tpc_offset, 0);
3332e65e175bSOded Gabbay 		tpc_offset += mmTPC1_QM_GLBL_CFG0 - mmTPC0_QM_GLBL_CFG0;
3333e65e175bSOded Gabbay 	}
3334e65e175bSOded Gabbay }
3335e65e175bSOded Gabbay 
gaudi_disable_nic_qmans(struct hl_device * hdev)3336e65e175bSOded Gabbay static void gaudi_disable_nic_qmans(struct hl_device *hdev)
3337e65e175bSOded Gabbay {
3338e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3339e65e175bSOded Gabbay 	u32 nic_mask, nic_offset = 0;
3340e65e175bSOded Gabbay 	u32 nic_delta_between_qmans =
3341e65e175bSOded Gabbay 			mmNIC0_QM1_GLBL_CFG0 - mmNIC0_QM0_GLBL_CFG0;
3342e65e175bSOded Gabbay 	u32 nic_delta_between_nics =
3343e65e175bSOded Gabbay 			mmNIC1_QM0_GLBL_CFG0 - mmNIC0_QM0_GLBL_CFG0;
3344e65e175bSOded Gabbay 	int nic_id;
3345e65e175bSOded Gabbay 
3346e65e175bSOded Gabbay 	for (nic_id = 0 ; nic_id < NIC_NUMBER_OF_ENGINES ; nic_id++) {
3347e65e175bSOded Gabbay 		nic_mask = 1 << (HW_CAP_NIC_SHIFT + nic_id);
3348e65e175bSOded Gabbay 
3349e65e175bSOded Gabbay 		if (gaudi->hw_cap_initialized & nic_mask)
3350e65e175bSOded Gabbay 			WREG32(mmNIC0_QM0_GLBL_CFG0 + nic_offset, 0);
3351e65e175bSOded Gabbay 
3352e65e175bSOded Gabbay 		nic_offset += nic_delta_between_qmans;
3353e65e175bSOded Gabbay 		if (nic_id & 1) {
3354e65e175bSOded Gabbay 			nic_offset -= (nic_delta_between_qmans * 2);
3355e65e175bSOded Gabbay 			nic_offset += nic_delta_between_nics;
3356e65e175bSOded Gabbay 		}
3357e65e175bSOded Gabbay 	}
3358e65e175bSOded Gabbay }
3359e65e175bSOded Gabbay 
gaudi_stop_pci_dma_qmans(struct hl_device * hdev)3360e65e175bSOded Gabbay static void gaudi_stop_pci_dma_qmans(struct hl_device *hdev)
3361e65e175bSOded Gabbay {
3362e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3363e65e175bSOded Gabbay 
3364e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_PCI_DMA))
3365e65e175bSOded Gabbay 		return;
3366e65e175bSOded Gabbay 
3367e65e175bSOded Gabbay 	/* Stop upper CPs of QMANs 0.0 to 1.3 and 5.0 to 5.3 */
3368e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_GLBL_CFG1, 0xF << DMA0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3369e65e175bSOded Gabbay 	WREG32(mmDMA1_QM_GLBL_CFG1, 0xF << DMA0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3370e65e175bSOded Gabbay 	WREG32(mmDMA5_QM_GLBL_CFG1, 0xF << DMA0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3371e65e175bSOded Gabbay }
3372e65e175bSOded Gabbay 
gaudi_stop_hbm_dma_qmans(struct hl_device * hdev)3373e65e175bSOded Gabbay static void gaudi_stop_hbm_dma_qmans(struct hl_device *hdev)
3374e65e175bSOded Gabbay {
3375e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3376e65e175bSOded Gabbay 
3377e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_HBM_DMA))
3378e65e175bSOded Gabbay 		return;
3379e65e175bSOded Gabbay 
3380e65e175bSOded Gabbay 	/* Stop CPs of HBM DMA QMANs */
3381e65e175bSOded Gabbay 
3382e65e175bSOded Gabbay 	WREG32(mmDMA2_QM_GLBL_CFG1, 0x1F << DMA0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3383e65e175bSOded Gabbay 	WREG32(mmDMA3_QM_GLBL_CFG1, 0x1F << DMA0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3384e65e175bSOded Gabbay 	WREG32(mmDMA4_QM_GLBL_CFG1, 0x1F << DMA0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3385e65e175bSOded Gabbay 	WREG32(mmDMA6_QM_GLBL_CFG1, 0x1F << DMA0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3386e65e175bSOded Gabbay 	WREG32(mmDMA7_QM_GLBL_CFG1, 0x1F << DMA0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3387e65e175bSOded Gabbay }
3388e65e175bSOded Gabbay 
gaudi_stop_mme_qmans(struct hl_device * hdev)3389e65e175bSOded Gabbay static void gaudi_stop_mme_qmans(struct hl_device *hdev)
3390e65e175bSOded Gabbay {
3391e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3392e65e175bSOded Gabbay 
3393e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_MME))
3394e65e175bSOded Gabbay 		return;
3395e65e175bSOded Gabbay 
3396e65e175bSOded Gabbay 	/* Stop CPs of MME QMANs */
3397e65e175bSOded Gabbay 	WREG32(mmMME2_QM_GLBL_CFG1, 0x1F << MME0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3398e65e175bSOded Gabbay 	WREG32(mmMME0_QM_GLBL_CFG1, 0x1F << MME0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3399e65e175bSOded Gabbay }
3400e65e175bSOded Gabbay 
gaudi_stop_tpc_qmans(struct hl_device * hdev)3401e65e175bSOded Gabbay static void gaudi_stop_tpc_qmans(struct hl_device *hdev)
3402e65e175bSOded Gabbay {
3403e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3404e65e175bSOded Gabbay 
3405e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_TPC_MASK))
3406e65e175bSOded Gabbay 		return;
3407e65e175bSOded Gabbay 
3408e65e175bSOded Gabbay 	WREG32(mmTPC0_QM_GLBL_CFG1, 0x1F << TPC0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3409e65e175bSOded Gabbay 	WREG32(mmTPC1_QM_GLBL_CFG1, 0x1F << TPC0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3410e65e175bSOded Gabbay 	WREG32(mmTPC2_QM_GLBL_CFG1, 0x1F << TPC0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3411e65e175bSOded Gabbay 	WREG32(mmTPC3_QM_GLBL_CFG1, 0x1F << TPC0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3412e65e175bSOded Gabbay 	WREG32(mmTPC4_QM_GLBL_CFG1, 0x1F << TPC0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3413e65e175bSOded Gabbay 	WREG32(mmTPC5_QM_GLBL_CFG1, 0x1F << TPC0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3414e65e175bSOded Gabbay 	WREG32(mmTPC6_QM_GLBL_CFG1, 0x1F << TPC0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3415e65e175bSOded Gabbay 	WREG32(mmTPC7_QM_GLBL_CFG1, 0x1F << TPC0_QM_GLBL_CFG1_CP_STOP_SHIFT);
3416e65e175bSOded Gabbay }
3417e65e175bSOded Gabbay 
gaudi_stop_nic_qmans(struct hl_device * hdev)3418e65e175bSOded Gabbay static void gaudi_stop_nic_qmans(struct hl_device *hdev)
3419e65e175bSOded Gabbay {
3420e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3421e65e175bSOded Gabbay 
3422e65e175bSOded Gabbay 	/* Stop upper CPs of QMANs */
3423e65e175bSOded Gabbay 
3424e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC0)
3425e65e175bSOded Gabbay 		WREG32(mmNIC0_QM0_GLBL_CFG1,
3426e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_PQF_STOP_MASK |
3427e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CQF_STOP_MASK |
3428e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CP_STOP_MASK);
3429e65e175bSOded Gabbay 
3430e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC1)
3431e65e175bSOded Gabbay 		WREG32(mmNIC0_QM1_GLBL_CFG1,
3432e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_PQF_STOP_MASK |
3433e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CQF_STOP_MASK |
3434e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CP_STOP_MASK);
3435e65e175bSOded Gabbay 
3436e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC2)
3437e65e175bSOded Gabbay 		WREG32(mmNIC1_QM0_GLBL_CFG1,
3438e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_PQF_STOP_MASK |
3439e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CQF_STOP_MASK |
3440e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CP_STOP_MASK);
3441e65e175bSOded Gabbay 
3442e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC3)
3443e65e175bSOded Gabbay 		WREG32(mmNIC1_QM1_GLBL_CFG1,
3444e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_PQF_STOP_MASK |
3445e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CQF_STOP_MASK |
3446e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CP_STOP_MASK);
3447e65e175bSOded Gabbay 
3448e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC4)
3449e65e175bSOded Gabbay 		WREG32(mmNIC2_QM0_GLBL_CFG1,
3450e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_PQF_STOP_MASK |
3451e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CQF_STOP_MASK |
3452e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CP_STOP_MASK);
3453e65e175bSOded Gabbay 
3454e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC5)
3455e65e175bSOded Gabbay 		WREG32(mmNIC2_QM1_GLBL_CFG1,
3456e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_PQF_STOP_MASK |
3457e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CQF_STOP_MASK |
3458e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CP_STOP_MASK);
3459e65e175bSOded Gabbay 
3460e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC6)
3461e65e175bSOded Gabbay 		WREG32(mmNIC3_QM0_GLBL_CFG1,
3462e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_PQF_STOP_MASK |
3463e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CQF_STOP_MASK |
3464e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CP_STOP_MASK);
3465e65e175bSOded Gabbay 
3466e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC7)
3467e65e175bSOded Gabbay 		WREG32(mmNIC3_QM1_GLBL_CFG1,
3468e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_PQF_STOP_MASK |
3469e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CQF_STOP_MASK |
3470e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CP_STOP_MASK);
3471e65e175bSOded Gabbay 
3472e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC8)
3473e65e175bSOded Gabbay 		WREG32(mmNIC4_QM0_GLBL_CFG1,
3474e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_PQF_STOP_MASK |
3475e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CQF_STOP_MASK |
3476e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CP_STOP_MASK);
3477e65e175bSOded Gabbay 
3478e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC9)
3479e65e175bSOded Gabbay 		WREG32(mmNIC4_QM1_GLBL_CFG1,
3480e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_PQF_STOP_MASK |
3481e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CQF_STOP_MASK |
3482e65e175bSOded Gabbay 				NIC0_QM0_GLBL_CFG1_CP_STOP_MASK);
3483e65e175bSOded Gabbay }
3484e65e175bSOded Gabbay 
gaudi_pci_dma_stall(struct hl_device * hdev)3485e65e175bSOded Gabbay static void gaudi_pci_dma_stall(struct hl_device *hdev)
3486e65e175bSOded Gabbay {
3487e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3488e65e175bSOded Gabbay 
3489e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_PCI_DMA))
3490e65e175bSOded Gabbay 		return;
3491e65e175bSOded Gabbay 
3492e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_CFG_1, 1 << DMA0_CORE_CFG_1_HALT_SHIFT);
3493e65e175bSOded Gabbay 	WREG32(mmDMA1_CORE_CFG_1, 1 << DMA0_CORE_CFG_1_HALT_SHIFT);
3494e65e175bSOded Gabbay 	WREG32(mmDMA5_CORE_CFG_1, 1 << DMA0_CORE_CFG_1_HALT_SHIFT);
3495e65e175bSOded Gabbay }
3496e65e175bSOded Gabbay 
gaudi_hbm_dma_stall(struct hl_device * hdev)3497e65e175bSOded Gabbay static void gaudi_hbm_dma_stall(struct hl_device *hdev)
3498e65e175bSOded Gabbay {
3499e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3500e65e175bSOded Gabbay 
3501e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_HBM_DMA))
3502e65e175bSOded Gabbay 		return;
3503e65e175bSOded Gabbay 
3504e65e175bSOded Gabbay 	WREG32(mmDMA2_CORE_CFG_1, 1 << DMA0_CORE_CFG_1_HALT_SHIFT);
3505e65e175bSOded Gabbay 	WREG32(mmDMA3_CORE_CFG_1, 1 << DMA0_CORE_CFG_1_HALT_SHIFT);
3506e65e175bSOded Gabbay 	WREG32(mmDMA4_CORE_CFG_1, 1 << DMA0_CORE_CFG_1_HALT_SHIFT);
3507e65e175bSOded Gabbay 	WREG32(mmDMA6_CORE_CFG_1, 1 << DMA0_CORE_CFG_1_HALT_SHIFT);
3508e65e175bSOded Gabbay 	WREG32(mmDMA7_CORE_CFG_1, 1 << DMA0_CORE_CFG_1_HALT_SHIFT);
3509e65e175bSOded Gabbay }
3510e65e175bSOded Gabbay 
gaudi_mme_stall(struct hl_device * hdev)3511e65e175bSOded Gabbay static void gaudi_mme_stall(struct hl_device *hdev)
3512e65e175bSOded Gabbay {
3513e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3514e65e175bSOded Gabbay 
3515e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_MME))
3516e65e175bSOded Gabbay 		return;
3517e65e175bSOded Gabbay 
3518e65e175bSOded Gabbay 	/* WA for H3-1800 bug: do ACC and SBAB writes twice */
3519e65e175bSOded Gabbay 	WREG32(mmMME0_ACC_ACC_STALL, 1 << MME_ACC_ACC_STALL_R_SHIFT);
3520e65e175bSOded Gabbay 	WREG32(mmMME0_ACC_ACC_STALL, 1 << MME_ACC_ACC_STALL_R_SHIFT);
3521e65e175bSOded Gabbay 	WREG32(mmMME0_SBAB_SB_STALL, 1 << MME_SBAB_SB_STALL_R_SHIFT);
3522e65e175bSOded Gabbay 	WREG32(mmMME0_SBAB_SB_STALL, 1 << MME_SBAB_SB_STALL_R_SHIFT);
3523e65e175bSOded Gabbay 	WREG32(mmMME1_ACC_ACC_STALL, 1 << MME_ACC_ACC_STALL_R_SHIFT);
3524e65e175bSOded Gabbay 	WREG32(mmMME1_ACC_ACC_STALL, 1 << MME_ACC_ACC_STALL_R_SHIFT);
3525e65e175bSOded Gabbay 	WREG32(mmMME1_SBAB_SB_STALL, 1 << MME_SBAB_SB_STALL_R_SHIFT);
3526e65e175bSOded Gabbay 	WREG32(mmMME1_SBAB_SB_STALL, 1 << MME_SBAB_SB_STALL_R_SHIFT);
3527e65e175bSOded Gabbay 	WREG32(mmMME2_ACC_ACC_STALL, 1 << MME_ACC_ACC_STALL_R_SHIFT);
3528e65e175bSOded Gabbay 	WREG32(mmMME2_ACC_ACC_STALL, 1 << MME_ACC_ACC_STALL_R_SHIFT);
3529e65e175bSOded Gabbay 	WREG32(mmMME2_SBAB_SB_STALL, 1 << MME_SBAB_SB_STALL_R_SHIFT);
3530e65e175bSOded Gabbay 	WREG32(mmMME2_SBAB_SB_STALL, 1 << MME_SBAB_SB_STALL_R_SHIFT);
3531e65e175bSOded Gabbay 	WREG32(mmMME3_ACC_ACC_STALL, 1 << MME_ACC_ACC_STALL_R_SHIFT);
3532e65e175bSOded Gabbay 	WREG32(mmMME3_ACC_ACC_STALL, 1 << MME_ACC_ACC_STALL_R_SHIFT);
3533e65e175bSOded Gabbay 	WREG32(mmMME3_SBAB_SB_STALL, 1 << MME_SBAB_SB_STALL_R_SHIFT);
3534e65e175bSOded Gabbay 	WREG32(mmMME3_SBAB_SB_STALL, 1 << MME_SBAB_SB_STALL_R_SHIFT);
3535e65e175bSOded Gabbay }
3536e65e175bSOded Gabbay 
gaudi_tpc_stall(struct hl_device * hdev)3537e65e175bSOded Gabbay static void gaudi_tpc_stall(struct hl_device *hdev)
3538e65e175bSOded Gabbay {
3539e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3540e65e175bSOded Gabbay 
3541e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_TPC_MASK))
3542e65e175bSOded Gabbay 		return;
3543e65e175bSOded Gabbay 
3544e65e175bSOded Gabbay 	WREG32(mmTPC0_CFG_TPC_STALL, 1 << TPC0_CFG_TPC_STALL_V_SHIFT);
3545e65e175bSOded Gabbay 	WREG32(mmTPC1_CFG_TPC_STALL, 1 << TPC0_CFG_TPC_STALL_V_SHIFT);
3546e65e175bSOded Gabbay 	WREG32(mmTPC2_CFG_TPC_STALL, 1 << TPC0_CFG_TPC_STALL_V_SHIFT);
3547e65e175bSOded Gabbay 	WREG32(mmTPC3_CFG_TPC_STALL, 1 << TPC0_CFG_TPC_STALL_V_SHIFT);
3548e65e175bSOded Gabbay 	WREG32(mmTPC4_CFG_TPC_STALL, 1 << TPC0_CFG_TPC_STALL_V_SHIFT);
3549e65e175bSOded Gabbay 	WREG32(mmTPC5_CFG_TPC_STALL, 1 << TPC0_CFG_TPC_STALL_V_SHIFT);
3550e65e175bSOded Gabbay 	WREG32(mmTPC6_CFG_TPC_STALL, 1 << TPC0_CFG_TPC_STALL_V_SHIFT);
3551e65e175bSOded Gabbay 	WREG32(mmTPC7_CFG_TPC_STALL, 1 << TPC0_CFG_TPC_STALL_V_SHIFT);
3552e65e175bSOded Gabbay }
3553e65e175bSOded Gabbay 
gaudi_disable_clock_gating(struct hl_device * hdev)3554e65e175bSOded Gabbay static void gaudi_disable_clock_gating(struct hl_device *hdev)
3555e65e175bSOded Gabbay {
3556e65e175bSOded Gabbay 	u32 qman_offset;
3557e65e175bSOded Gabbay 	int i;
3558e65e175bSOded Gabbay 
3559e65e175bSOded Gabbay 	if (hdev->asic_prop.fw_security_enabled)
3560e65e175bSOded Gabbay 		return;
3561e65e175bSOded Gabbay 
3562e65e175bSOded Gabbay 	for (i = 0, qman_offset = 0 ; i < DMA_NUMBER_OF_CHANNELS ; i++) {
3563e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_CGM_CFG + qman_offset, 0);
3564e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_CGM_CFG1 + qman_offset, 0);
3565e65e175bSOded Gabbay 
3566e65e175bSOded Gabbay 		qman_offset += (mmDMA1_QM_CGM_CFG - mmDMA0_QM_CGM_CFG);
3567e65e175bSOded Gabbay 	}
3568e65e175bSOded Gabbay 
3569e65e175bSOded Gabbay 	WREG32(mmMME0_QM_CGM_CFG, 0);
3570e65e175bSOded Gabbay 	WREG32(mmMME0_QM_CGM_CFG1, 0);
3571e65e175bSOded Gabbay 	WREG32(mmMME2_QM_CGM_CFG, 0);
3572e65e175bSOded Gabbay 	WREG32(mmMME2_QM_CGM_CFG1, 0);
3573e65e175bSOded Gabbay 
3574e65e175bSOded Gabbay 	for (i = 0, qman_offset = 0 ; i < TPC_NUMBER_OF_ENGINES ; i++) {
3575e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_CGM_CFG + qman_offset, 0);
3576e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_CGM_CFG1 + qman_offset, 0);
3577e65e175bSOded Gabbay 
3578e65e175bSOded Gabbay 		qman_offset += (mmTPC1_QM_CGM_CFG - mmTPC0_QM_CGM_CFG);
3579e65e175bSOded Gabbay 	}
3580e65e175bSOded Gabbay }
3581e65e175bSOded Gabbay 
gaudi_enable_timestamp(struct hl_device * hdev)3582e65e175bSOded Gabbay static void gaudi_enable_timestamp(struct hl_device *hdev)
3583e65e175bSOded Gabbay {
3584e65e175bSOded Gabbay 	/* Disable the timestamp counter */
3585e65e175bSOded Gabbay 	WREG32(mmPSOC_TIMESTAMP_BASE - CFG_BASE, 0);
3586e65e175bSOded Gabbay 
3587e65e175bSOded Gabbay 	/* Zero the lower/upper parts of the 64-bit counter */
3588e65e175bSOded Gabbay 	WREG32(mmPSOC_TIMESTAMP_BASE - CFG_BASE + 0xC, 0);
3589e65e175bSOded Gabbay 	WREG32(mmPSOC_TIMESTAMP_BASE - CFG_BASE + 0x8, 0);
3590e65e175bSOded Gabbay 
3591e65e175bSOded Gabbay 	/* Enable the counter */
3592e65e175bSOded Gabbay 	WREG32(mmPSOC_TIMESTAMP_BASE - CFG_BASE, 1);
3593e65e175bSOded Gabbay }
3594e65e175bSOded Gabbay 
gaudi_disable_timestamp(struct hl_device * hdev)3595e65e175bSOded Gabbay static void gaudi_disable_timestamp(struct hl_device *hdev)
3596e65e175bSOded Gabbay {
3597e65e175bSOded Gabbay 	/* Disable the timestamp counter */
3598e65e175bSOded Gabbay 	WREG32(mmPSOC_TIMESTAMP_BASE - CFG_BASE, 0);
3599e65e175bSOded Gabbay }
3600e65e175bSOded Gabbay 
gaudi_halt_engines(struct hl_device * hdev,bool hard_reset,bool fw_reset)3601e65e175bSOded Gabbay static void gaudi_halt_engines(struct hl_device *hdev, bool hard_reset, bool fw_reset)
3602e65e175bSOded Gabbay {
3603e65e175bSOded Gabbay 	u32 wait_timeout_ms;
3604e65e175bSOded Gabbay 
3605e65e175bSOded Gabbay 	if (hdev->pldm)
3606e65e175bSOded Gabbay 		wait_timeout_ms = GAUDI_PLDM_RESET_WAIT_MSEC;
3607e65e175bSOded Gabbay 	else
3608e65e175bSOded Gabbay 		wait_timeout_ms = GAUDI_RESET_WAIT_MSEC;
3609e65e175bSOded Gabbay 
3610e65e175bSOded Gabbay 	if (fw_reset)
3611e65e175bSOded Gabbay 		goto skip_engines;
3612e65e175bSOded Gabbay 
3613e65e175bSOded Gabbay 	gaudi_stop_nic_qmans(hdev);
3614e65e175bSOded Gabbay 	gaudi_stop_mme_qmans(hdev);
3615e65e175bSOded Gabbay 	gaudi_stop_tpc_qmans(hdev);
3616e65e175bSOded Gabbay 	gaudi_stop_hbm_dma_qmans(hdev);
3617e65e175bSOded Gabbay 	gaudi_stop_pci_dma_qmans(hdev);
3618e65e175bSOded Gabbay 
3619e65e175bSOded Gabbay 	msleep(wait_timeout_ms);
3620e65e175bSOded Gabbay 
3621e65e175bSOded Gabbay 	gaudi_pci_dma_stall(hdev);
3622e65e175bSOded Gabbay 	gaudi_hbm_dma_stall(hdev);
3623e65e175bSOded Gabbay 	gaudi_tpc_stall(hdev);
3624e65e175bSOded Gabbay 	gaudi_mme_stall(hdev);
3625e65e175bSOded Gabbay 
3626e65e175bSOded Gabbay 	msleep(wait_timeout_ms);
3627e65e175bSOded Gabbay 
3628e65e175bSOded Gabbay 	gaudi_disable_nic_qmans(hdev);
3629e65e175bSOded Gabbay 	gaudi_disable_mme_qmans(hdev);
3630e65e175bSOded Gabbay 	gaudi_disable_tpc_qmans(hdev);
3631e65e175bSOded Gabbay 	gaudi_disable_hbm_dma_qmans(hdev);
3632e65e175bSOded Gabbay 	gaudi_disable_pci_dma_qmans(hdev);
3633e65e175bSOded Gabbay 
3634e65e175bSOded Gabbay 	gaudi_disable_timestamp(hdev);
3635e65e175bSOded Gabbay 
3636e65e175bSOded Gabbay skip_engines:
3637e65e175bSOded Gabbay 	gaudi_disable_msi(hdev);
3638e65e175bSOded Gabbay }
3639e65e175bSOded Gabbay 
gaudi_mmu_init(struct hl_device * hdev)3640e65e175bSOded Gabbay static int gaudi_mmu_init(struct hl_device *hdev)
3641e65e175bSOded Gabbay {
3642e65e175bSOded Gabbay 	struct asic_fixed_properties *prop = &hdev->asic_prop;
3643e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3644e65e175bSOded Gabbay 	u64 hop0_addr;
3645e65e175bSOded Gabbay 	int rc, i;
3646e65e175bSOded Gabbay 
3647e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_MMU)
3648e65e175bSOded Gabbay 		return 0;
3649e65e175bSOded Gabbay 
3650e65e175bSOded Gabbay 	for (i = 0 ; i < prop->max_asid ; i++) {
3651e65e175bSOded Gabbay 		hop0_addr = prop->mmu_pgt_addr +
3652c14e5cd3SFarah Kassabri 				(i * prop->dmmu.hop_table_size);
3653e65e175bSOded Gabbay 
3654e65e175bSOded Gabbay 		rc = gaudi_mmu_update_asid_hop0_addr(hdev, i, hop0_addr);
3655e65e175bSOded Gabbay 		if (rc) {
3656e65e175bSOded Gabbay 			dev_err(hdev->dev,
3657e65e175bSOded Gabbay 				"failed to set hop0 addr for asid %d\n", i);
3658af5e675fSKoby Elbaz 			return rc;
3659e65e175bSOded Gabbay 		}
3660e65e175bSOded Gabbay 	}
3661e65e175bSOded Gabbay 
3662e65e175bSOded Gabbay 	/* init MMU cache manage page */
3663e65e175bSOded Gabbay 	WREG32(mmSTLB_CACHE_INV_BASE_39_8, prop->mmu_cache_mng_addr >> 8);
3664e65e175bSOded Gabbay 	WREG32(mmSTLB_CACHE_INV_BASE_49_40, prop->mmu_cache_mng_addr >> 40);
3665e65e175bSOded Gabbay 
3666e65e175bSOded Gabbay 	/* mem cache invalidation */
3667e65e175bSOded Gabbay 	WREG32(mmSTLB_MEM_CACHE_INVALIDATION, 1);
3668e65e175bSOded Gabbay 
3669af5e675fSKoby Elbaz 	rc = hl_mmu_invalidate_cache(hdev, true, 0);
3670af5e675fSKoby Elbaz 	if (rc)
3671af5e675fSKoby Elbaz 		return rc;
3672e65e175bSOded Gabbay 
3673e65e175bSOded Gabbay 	WREG32(mmMMU_UP_MMU_ENABLE, 1);
3674e65e175bSOded Gabbay 	WREG32(mmMMU_UP_SPI_MASK, 0xF);
3675e65e175bSOded Gabbay 
3676e65e175bSOded Gabbay 	WREG32(mmSTLB_HOP_CONFIGURATION, 0x30440);
3677e65e175bSOded Gabbay 
3678e65e175bSOded Gabbay 	/*
3679e65e175bSOded Gabbay 	 * The H/W expects the first PI after init to be 1. After wraparound
3680e65e175bSOded Gabbay 	 * we'll write 0.
3681e65e175bSOded Gabbay 	 */
3682e65e175bSOded Gabbay 	gaudi->mmu_cache_inv_pi = 1;
3683e65e175bSOded Gabbay 
3684e65e175bSOded Gabbay 	gaudi->hw_cap_initialized |= HW_CAP_MMU;
3685e65e175bSOded Gabbay 
3686e65e175bSOded Gabbay 	return 0;
3687e65e175bSOded Gabbay }
3688e65e175bSOded Gabbay 
gaudi_load_firmware_to_device(struct hl_device * hdev)3689e65e175bSOded Gabbay static int gaudi_load_firmware_to_device(struct hl_device *hdev)
3690e65e175bSOded Gabbay {
3691e65e175bSOded Gabbay 	void __iomem *dst;
3692e65e175bSOded Gabbay 
3693e65e175bSOded Gabbay 	dst = hdev->pcie_bar[HBM_BAR_ID] + LINUX_FW_OFFSET;
3694e65e175bSOded Gabbay 
3695e65e175bSOded Gabbay 	return hl_fw_load_fw_to_device(hdev, GAUDI_LINUX_FW_FILE, dst, 0, 0);
3696e65e175bSOded Gabbay }
3697e65e175bSOded Gabbay 
gaudi_load_boot_fit_to_device(struct hl_device * hdev)3698e65e175bSOded Gabbay static int gaudi_load_boot_fit_to_device(struct hl_device *hdev)
3699e65e175bSOded Gabbay {
3700e65e175bSOded Gabbay 	void __iomem *dst;
3701e65e175bSOded Gabbay 
3702e65e175bSOded Gabbay 	dst = hdev->pcie_bar[SRAM_BAR_ID] + BOOT_FIT_SRAM_OFFSET;
3703e65e175bSOded Gabbay 
3704e65e175bSOded Gabbay 	return hl_fw_load_fw_to_device(hdev, GAUDI_BOOT_FIT_FILE, dst, 0, 0);
3705e65e175bSOded Gabbay }
3706e65e175bSOded Gabbay 
gaudi_init_dynamic_firmware_loader(struct hl_device * hdev)3707e65e175bSOded Gabbay static void gaudi_init_dynamic_firmware_loader(struct hl_device *hdev)
3708e65e175bSOded Gabbay {
3709e65e175bSOded Gabbay 	struct dynamic_fw_load_mgr *dynamic_loader;
3710e65e175bSOded Gabbay 	struct cpu_dyn_regs *dyn_regs;
3711e65e175bSOded Gabbay 
3712e65e175bSOded Gabbay 	dynamic_loader = &hdev->fw_loader.dynamic_loader;
3713e65e175bSOded Gabbay 
3714e65e175bSOded Gabbay 	/*
3715e65e175bSOded Gabbay 	 * here we update initial values for few specific dynamic regs (as
3716e65e175bSOded Gabbay 	 * before reading the first descriptor from FW those value has to be
3717e65e175bSOded Gabbay 	 * hard-coded) in later stages of the protocol those values will be
3718e65e175bSOded Gabbay 	 * updated automatically by reading the FW descriptor so data there
3719e65e175bSOded Gabbay 	 * will always be up-to-date
3720e65e175bSOded Gabbay 	 */
3721e65e175bSOded Gabbay 	dyn_regs = &dynamic_loader->comm_desc.cpu_dyn_regs;
3722e65e175bSOded Gabbay 	dyn_regs->kmd_msg_to_cpu =
3723e65e175bSOded Gabbay 				cpu_to_le32(mmPSOC_GLOBAL_CONF_KMD_MSG_TO_CPU);
3724e65e175bSOded Gabbay 	dyn_regs->cpu_cmd_status_to_host =
3725e65e175bSOded Gabbay 				cpu_to_le32(mmCPU_CMD_STATUS_TO_HOST);
3726e65e175bSOded Gabbay 
3727e65e175bSOded Gabbay 	dynamic_loader->wait_for_bl_timeout = GAUDI_WAIT_FOR_BL_TIMEOUT_USEC;
3728e65e175bSOded Gabbay }
3729e65e175bSOded Gabbay 
gaudi_init_static_firmware_loader(struct hl_device * hdev)3730e65e175bSOded Gabbay static void gaudi_init_static_firmware_loader(struct hl_device *hdev)
3731e65e175bSOded Gabbay {
3732e65e175bSOded Gabbay 	struct static_fw_load_mgr *static_loader;
3733e65e175bSOded Gabbay 
3734e65e175bSOded Gabbay 	static_loader = &hdev->fw_loader.static_loader;
3735e65e175bSOded Gabbay 
3736e65e175bSOded Gabbay 	static_loader->preboot_version_max_off = SRAM_SIZE - VERSION_MAX_LEN;
3737e65e175bSOded Gabbay 	static_loader->boot_fit_version_max_off = SRAM_SIZE - VERSION_MAX_LEN;
3738e65e175bSOded Gabbay 	static_loader->kmd_msg_to_cpu_reg = mmPSOC_GLOBAL_CONF_KMD_MSG_TO_CPU;
3739e65e175bSOded Gabbay 	static_loader->cpu_cmd_status_to_host_reg = mmCPU_CMD_STATUS_TO_HOST;
3740e65e175bSOded Gabbay 	static_loader->cpu_boot_status_reg = mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS;
3741e65e175bSOded Gabbay 	static_loader->cpu_boot_dev_status0_reg = mmCPU_BOOT_DEV_STS0;
3742e65e175bSOded Gabbay 	static_loader->cpu_boot_dev_status1_reg = mmCPU_BOOT_DEV_STS1;
3743e65e175bSOded Gabbay 	static_loader->boot_err0_reg = mmCPU_BOOT_ERR0;
3744e65e175bSOded Gabbay 	static_loader->boot_err1_reg = mmCPU_BOOT_ERR1;
3745e65e175bSOded Gabbay 	static_loader->preboot_version_offset_reg = mmPREBOOT_VER_OFFSET;
3746e65e175bSOded Gabbay 	static_loader->boot_fit_version_offset_reg = mmUBOOT_VER_OFFSET;
3747e65e175bSOded Gabbay 	static_loader->sram_offset_mask = ~(lower_32_bits(SRAM_BASE_ADDR));
3748e65e175bSOded Gabbay 	static_loader->cpu_reset_wait_msec = hdev->pldm ?
3749e65e175bSOded Gabbay 			GAUDI_PLDM_RESET_WAIT_MSEC :
3750e65e175bSOded Gabbay 			GAUDI_CPU_RESET_WAIT_MSEC;
3751e65e175bSOded Gabbay }
3752e65e175bSOded Gabbay 
gaudi_init_firmware_preload_params(struct hl_device * hdev)3753e65e175bSOded Gabbay static void gaudi_init_firmware_preload_params(struct hl_device *hdev)
3754e65e175bSOded Gabbay {
3755e65e175bSOded Gabbay 	struct pre_fw_load_props *pre_fw_load = &hdev->fw_loader.pre_fw_load;
3756e65e175bSOded Gabbay 
3757e65e175bSOded Gabbay 	pre_fw_load->cpu_boot_status_reg = mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS;
3758e65e175bSOded Gabbay 	pre_fw_load->sts_boot_dev_sts0_reg = mmCPU_BOOT_DEV_STS0;
3759e65e175bSOded Gabbay 	pre_fw_load->sts_boot_dev_sts1_reg = mmCPU_BOOT_DEV_STS1;
3760e65e175bSOded Gabbay 	pre_fw_load->boot_err0_reg = mmCPU_BOOT_ERR0;
3761e65e175bSOded Gabbay 	pre_fw_load->boot_err1_reg = mmCPU_BOOT_ERR1;
3762e65e175bSOded Gabbay 	pre_fw_load->wait_for_preboot_timeout = GAUDI_BOOT_FIT_REQ_TIMEOUT_USEC;
3763e65e175bSOded Gabbay }
3764e65e175bSOded Gabbay 
gaudi_init_firmware_loader(struct hl_device * hdev)3765e65e175bSOded Gabbay static void gaudi_init_firmware_loader(struct hl_device *hdev)
3766e65e175bSOded Gabbay {
3767e65e175bSOded Gabbay 	struct asic_fixed_properties *prop = &hdev->asic_prop;
3768e65e175bSOded Gabbay 	struct fw_load_mgr *fw_loader = &hdev->fw_loader;
3769e65e175bSOded Gabbay 
3770e65e175bSOded Gabbay 	/* fill common fields */
3771e65e175bSOded Gabbay 	fw_loader->fw_comp_loaded = FW_TYPE_NONE;
3772e65e175bSOded Gabbay 	fw_loader->boot_fit_img.image_name = GAUDI_BOOT_FIT_FILE;
3773e65e175bSOded Gabbay 	fw_loader->linux_img.image_name = GAUDI_LINUX_FW_FILE;
3774e65e175bSOded Gabbay 	fw_loader->cpu_timeout = GAUDI_CPU_TIMEOUT_USEC;
3775e65e175bSOded Gabbay 	fw_loader->boot_fit_timeout = GAUDI_BOOT_FIT_REQ_TIMEOUT_USEC;
3776e65e175bSOded Gabbay 	fw_loader->skip_bmc = !hdev->bmc_enable;
3777e65e175bSOded Gabbay 	fw_loader->sram_bar_id = SRAM_BAR_ID;
3778e65e175bSOded Gabbay 	fw_loader->dram_bar_id = HBM_BAR_ID;
3779e65e175bSOded Gabbay 
3780e65e175bSOded Gabbay 	if (prop->dynamic_fw_load)
3781e65e175bSOded Gabbay 		gaudi_init_dynamic_firmware_loader(hdev);
3782e65e175bSOded Gabbay 	else
3783e65e175bSOded Gabbay 		gaudi_init_static_firmware_loader(hdev);
3784e65e175bSOded Gabbay }
3785e65e175bSOded Gabbay 
gaudi_init_cpu(struct hl_device * hdev)3786e65e175bSOded Gabbay static int gaudi_init_cpu(struct hl_device *hdev)
3787e65e175bSOded Gabbay {
3788e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3789e65e175bSOded Gabbay 	int rc;
3790e65e175bSOded Gabbay 
3791e65e175bSOded Gabbay 	if (!(hdev->fw_components & FW_TYPE_PREBOOT_CPU))
3792e65e175bSOded Gabbay 		return 0;
3793e65e175bSOded Gabbay 
3794e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_CPU)
3795e65e175bSOded Gabbay 		return 0;
3796e65e175bSOded Gabbay 
3797e65e175bSOded Gabbay 	/*
3798e65e175bSOded Gabbay 	 * The device CPU works with 40 bits addresses.
3799e65e175bSOded Gabbay 	 * This register sets the extension to 50 bits.
3800e65e175bSOded Gabbay 	 */
3801e65e175bSOded Gabbay 	if (!hdev->asic_prop.fw_security_enabled)
3802e65e175bSOded Gabbay 		WREG32(mmCPU_IF_CPU_MSB_ADDR, hdev->cpu_pci_msb_addr);
3803e65e175bSOded Gabbay 
3804e65e175bSOded Gabbay 	rc = hl_fw_init_cpu(hdev);
3805e65e175bSOded Gabbay 
3806e65e175bSOded Gabbay 	if (rc)
3807e65e175bSOded Gabbay 		return rc;
3808e65e175bSOded Gabbay 
3809e65e175bSOded Gabbay 	gaudi->hw_cap_initialized |= HW_CAP_CPU;
3810e65e175bSOded Gabbay 
3811e65e175bSOded Gabbay 	return 0;
3812e65e175bSOded Gabbay }
3813e65e175bSOded Gabbay 
gaudi_init_cpu_queues(struct hl_device * hdev,u32 cpu_timeout)3814e65e175bSOded Gabbay static int gaudi_init_cpu_queues(struct hl_device *hdev, u32 cpu_timeout)
3815e65e175bSOded Gabbay {
3816e65e175bSOded Gabbay 	struct cpu_dyn_regs *dyn_regs =
3817e65e175bSOded Gabbay 			&hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
3818e65e175bSOded Gabbay 	struct asic_fixed_properties *prop = &hdev->asic_prop;
3819e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3820e65e175bSOded Gabbay 	u32 status, irq_handler_offset;
3821e65e175bSOded Gabbay 	struct hl_eq *eq;
3822e65e175bSOded Gabbay 	struct hl_hw_queue *cpu_pq =
3823e65e175bSOded Gabbay 			&hdev->kernel_queues[GAUDI_QUEUE_ID_CPU_PQ];
3824e65e175bSOded Gabbay 	int err;
3825e65e175bSOded Gabbay 
3826e65e175bSOded Gabbay 	if (!hdev->cpu_queues_enable)
3827e65e175bSOded Gabbay 		return 0;
3828e65e175bSOded Gabbay 
3829e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_CPU_Q)
3830e65e175bSOded Gabbay 		return 0;
3831e65e175bSOded Gabbay 
3832e65e175bSOded Gabbay 	eq = &hdev->event_queue;
3833e65e175bSOded Gabbay 
3834e65e175bSOded Gabbay 	WREG32(mmCPU_IF_PQ_BASE_ADDR_LOW, lower_32_bits(cpu_pq->bus_address));
3835e65e175bSOded Gabbay 	WREG32(mmCPU_IF_PQ_BASE_ADDR_HIGH, upper_32_bits(cpu_pq->bus_address));
3836e65e175bSOded Gabbay 
3837e65e175bSOded Gabbay 	WREG32(mmCPU_IF_EQ_BASE_ADDR_LOW, lower_32_bits(eq->bus_address));
3838e65e175bSOded Gabbay 	WREG32(mmCPU_IF_EQ_BASE_ADDR_HIGH, upper_32_bits(eq->bus_address));
3839e65e175bSOded Gabbay 
3840e65e175bSOded Gabbay 	WREG32(mmCPU_IF_CQ_BASE_ADDR_LOW,
3841e65e175bSOded Gabbay 			lower_32_bits(hdev->cpu_accessible_dma_address));
3842e65e175bSOded Gabbay 	WREG32(mmCPU_IF_CQ_BASE_ADDR_HIGH,
3843e65e175bSOded Gabbay 			upper_32_bits(hdev->cpu_accessible_dma_address));
3844e65e175bSOded Gabbay 
3845e65e175bSOded Gabbay 	WREG32(mmCPU_IF_PQ_LENGTH, HL_QUEUE_SIZE_IN_BYTES);
3846e65e175bSOded Gabbay 	WREG32(mmCPU_IF_EQ_LENGTH, HL_EQ_SIZE_IN_BYTES);
3847e65e175bSOded Gabbay 	WREG32(mmCPU_IF_CQ_LENGTH, HL_CPU_ACCESSIBLE_MEM_SIZE);
3848e65e175bSOded Gabbay 
3849e65e175bSOded Gabbay 	/* Used for EQ CI */
3850e65e175bSOded Gabbay 	WREG32(mmCPU_IF_EQ_RD_OFFS, 0);
3851e65e175bSOded Gabbay 
3852e65e175bSOded Gabbay 	WREG32(mmCPU_IF_PF_PQ_PI, 0);
3853e65e175bSOded Gabbay 
3854b207e166SOfir Bitton 	WREG32(mmCPU_IF_QUEUE_INIT, PQ_INIT_STATUS_READY_FOR_CP_SINGLE_MSI);
3855e65e175bSOded Gabbay 
3856e65e175bSOded Gabbay 	irq_handler_offset = prop->gic_interrupts_enable ?
3857e65e175bSOded Gabbay 			mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR :
3858e65e175bSOded Gabbay 			le32_to_cpu(dyn_regs->gic_host_pi_upd_irq);
3859e65e175bSOded Gabbay 
3860e65e175bSOded Gabbay 	WREG32(irq_handler_offset,
3861e65e175bSOded Gabbay 		gaudi_irq_map_table[GAUDI_EVENT_PI_UPDATE].cpu_id);
3862e65e175bSOded Gabbay 
3863e65e175bSOded Gabbay 	err = hl_poll_timeout(
3864e65e175bSOded Gabbay 		hdev,
3865e65e175bSOded Gabbay 		mmCPU_IF_QUEUE_INIT,
3866e65e175bSOded Gabbay 		status,
3867e65e175bSOded Gabbay 		(status == PQ_INIT_STATUS_READY_FOR_HOST),
3868e65e175bSOded Gabbay 		1000,
3869e65e175bSOded Gabbay 		cpu_timeout);
3870e65e175bSOded Gabbay 
3871e65e175bSOded Gabbay 	if (err) {
3872e65e175bSOded Gabbay 		dev_err(hdev->dev,
3873e65e175bSOded Gabbay 			"Failed to communicate with Device CPU (CPU-CP timeout)\n");
3874e65e175bSOded Gabbay 		return -EIO;
3875e65e175bSOded Gabbay 	}
3876e65e175bSOded Gabbay 
3877e65e175bSOded Gabbay 	/* update FW application security bits */
3878e65e175bSOded Gabbay 	if (prop->fw_cpu_boot_dev_sts0_valid)
3879e65e175bSOded Gabbay 		prop->fw_app_cpu_boot_dev_sts0 = RREG32(mmCPU_BOOT_DEV_STS0);
3880e65e175bSOded Gabbay 	if (prop->fw_cpu_boot_dev_sts1_valid)
3881e65e175bSOded Gabbay 		prop->fw_app_cpu_boot_dev_sts1 = RREG32(mmCPU_BOOT_DEV_STS1);
3882e65e175bSOded Gabbay 
3883e65e175bSOded Gabbay 	gaudi->hw_cap_initialized |= HW_CAP_CPU_Q;
3884e65e175bSOded Gabbay 	return 0;
3885e65e175bSOded Gabbay }
3886e65e175bSOded Gabbay 
gaudi_pre_hw_init(struct hl_device * hdev)3887e65e175bSOded Gabbay static void gaudi_pre_hw_init(struct hl_device *hdev)
3888e65e175bSOded Gabbay {
3889e65e175bSOded Gabbay 	/* Perform read from the device to make sure device is up */
3890e65e175bSOded Gabbay 	RREG32(mmHW_STATE);
3891e65e175bSOded Gabbay 
3892e65e175bSOded Gabbay 	if (!hdev->asic_prop.fw_security_enabled) {
3893e65e175bSOded Gabbay 		/* Set the access through PCI bars (Linux driver only) as
3894e65e175bSOded Gabbay 		 * secured
3895e65e175bSOded Gabbay 		 */
3896e65e175bSOded Gabbay 		WREG32(mmPCIE_WRAP_LBW_PROT_OVR,
3897e65e175bSOded Gabbay 				(PCIE_WRAP_LBW_PROT_OVR_RD_EN_MASK |
3898e65e175bSOded Gabbay 				PCIE_WRAP_LBW_PROT_OVR_WR_EN_MASK));
3899e65e175bSOded Gabbay 
3900e65e175bSOded Gabbay 		/* Perform read to flush the waiting writes to ensure
3901e65e175bSOded Gabbay 		 * configuration was set in the device
3902e65e175bSOded Gabbay 		 */
3903e65e175bSOded Gabbay 		RREG32(mmPCIE_WRAP_LBW_PROT_OVR);
3904e65e175bSOded Gabbay 	}
3905e65e175bSOded Gabbay 
3906e65e175bSOded Gabbay 	/*
3907e65e175bSOded Gabbay 	 * Let's mark in the H/W that we have reached this point. We check
3908e65e175bSOded Gabbay 	 * this value in the reset_before_init function to understand whether
3909e65e175bSOded Gabbay 	 * we need to reset the chip before doing H/W init. This register is
3910e65e175bSOded Gabbay 	 * cleared by the H/W upon H/W reset
3911e65e175bSOded Gabbay 	 */
3912e65e175bSOded Gabbay 	WREG32(mmHW_STATE, HL_DEVICE_HW_STATE_DIRTY);
3913e65e175bSOded Gabbay }
3914e65e175bSOded Gabbay 
gaudi_hw_init(struct hl_device * hdev)3915e65e175bSOded Gabbay static int gaudi_hw_init(struct hl_device *hdev)
3916e65e175bSOded Gabbay {
3917e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
3918e65e175bSOded Gabbay 	int rc;
3919e65e175bSOded Gabbay 
3920e65e175bSOded Gabbay 	gaudi_pre_hw_init(hdev);
3921e65e175bSOded Gabbay 
3922e65e175bSOded Gabbay 	/* If iATU is done by FW, the HBM bar ALWAYS points to DRAM_PHYS_BASE.
3923e65e175bSOded Gabbay 	 * So we set it here and if anyone tries to move it later to
3924e65e175bSOded Gabbay 	 * a different address, there will be an error
3925e65e175bSOded Gabbay 	 */
3926e65e175bSOded Gabbay 	if (hdev->asic_prop.iatu_done_by_fw)
3927e65e175bSOded Gabbay 		gaudi->hbm_bar_cur_addr = DRAM_PHYS_BASE;
3928e65e175bSOded Gabbay 
3929e65e175bSOded Gabbay 	/*
3930e65e175bSOded Gabbay 	 * Before pushing u-boot/linux to device, need to set the hbm bar to
3931e65e175bSOded Gabbay 	 * base address of dram
3932e65e175bSOded Gabbay 	 */
3933e65e175bSOded Gabbay 	if (gaudi_set_hbm_bar_base(hdev, DRAM_PHYS_BASE) == U64_MAX) {
3934e65e175bSOded Gabbay 		dev_err(hdev->dev,
3935e65e175bSOded Gabbay 			"failed to map HBM bar to DRAM base address\n");
3936e65e175bSOded Gabbay 		return -EIO;
3937e65e175bSOded Gabbay 	}
3938e65e175bSOded Gabbay 
3939e65e175bSOded Gabbay 	rc = gaudi_init_cpu(hdev);
3940e65e175bSOded Gabbay 	if (rc) {
3941e65e175bSOded Gabbay 		dev_err(hdev->dev, "failed to initialize CPU\n");
3942e65e175bSOded Gabbay 		return rc;
3943e65e175bSOded Gabbay 	}
3944e65e175bSOded Gabbay 
3945e65e175bSOded Gabbay 	/* In case the clock gating was enabled in preboot we need to disable
3946e65e175bSOded Gabbay 	 * it here before touching the MME/TPC registers.
3947e65e175bSOded Gabbay 	 */
3948e65e175bSOded Gabbay 	gaudi_disable_clock_gating(hdev);
3949e65e175bSOded Gabbay 
3950e65e175bSOded Gabbay 	/* SRAM scrambler must be initialized after CPU is running from HBM */
3951e65e175bSOded Gabbay 	gaudi_init_scrambler_sram(hdev);
3952e65e175bSOded Gabbay 
3953e65e175bSOded Gabbay 	/* This is here just in case we are working without CPU */
3954e65e175bSOded Gabbay 	gaudi_init_scrambler_hbm(hdev);
3955e65e175bSOded Gabbay 
3956e65e175bSOded Gabbay 	gaudi_init_golden_registers(hdev);
3957e65e175bSOded Gabbay 
3958e65e175bSOded Gabbay 	rc = gaudi_mmu_init(hdev);
3959e65e175bSOded Gabbay 	if (rc)
3960e65e175bSOded Gabbay 		return rc;
3961e65e175bSOded Gabbay 
3962e65e175bSOded Gabbay 	gaudi_init_security(hdev);
3963e65e175bSOded Gabbay 
3964e65e175bSOded Gabbay 	gaudi_init_pci_dma_qmans(hdev);
3965e65e175bSOded Gabbay 
3966e65e175bSOded Gabbay 	gaudi_init_hbm_dma_qmans(hdev);
3967e65e175bSOded Gabbay 
3968e65e175bSOded Gabbay 	gaudi_init_mme_qmans(hdev);
3969e65e175bSOded Gabbay 
3970e65e175bSOded Gabbay 	gaudi_init_tpc_qmans(hdev);
3971e65e175bSOded Gabbay 
3972e65e175bSOded Gabbay 	gaudi_init_nic_qmans(hdev);
3973e65e175bSOded Gabbay 
3974e65e175bSOded Gabbay 	gaudi_enable_timestamp(hdev);
3975e65e175bSOded Gabbay 
3976e65e175bSOded Gabbay 	/* MSI must be enabled before CPU queues and NIC are initialized */
3977e65e175bSOded Gabbay 	rc = gaudi_enable_msi(hdev);
3978e65e175bSOded Gabbay 	if (rc)
3979e65e175bSOded Gabbay 		goto disable_queues;
3980e65e175bSOded Gabbay 
3981e65e175bSOded Gabbay 	/* must be called after MSI was enabled */
3982e65e175bSOded Gabbay 	rc = gaudi_init_cpu_queues(hdev, GAUDI_CPU_TIMEOUT_USEC);
3983e65e175bSOded Gabbay 	if (rc) {
3984e65e175bSOded Gabbay 		dev_err(hdev->dev, "failed to initialize CPU H/W queues %d\n",
3985e65e175bSOded Gabbay 			rc);
3986e65e175bSOded Gabbay 		goto disable_msi;
3987e65e175bSOded Gabbay 	}
3988e65e175bSOded Gabbay 
3989e65e175bSOded Gabbay 	/* Perform read from the device to flush all configuration */
3990e65e175bSOded Gabbay 	RREG32(mmHW_STATE);
3991e65e175bSOded Gabbay 
3992e65e175bSOded Gabbay 	return 0;
3993e65e175bSOded Gabbay 
3994e65e175bSOded Gabbay disable_msi:
3995e65e175bSOded Gabbay 	gaudi_disable_msi(hdev);
3996e65e175bSOded Gabbay disable_queues:
3997e65e175bSOded Gabbay 	gaudi_disable_mme_qmans(hdev);
3998e65e175bSOded Gabbay 	gaudi_disable_pci_dma_qmans(hdev);
3999e65e175bSOded Gabbay 
4000e65e175bSOded Gabbay 	return rc;
4001e65e175bSOded Gabbay }
4002e65e175bSOded Gabbay 
gaudi_hw_fini(struct hl_device * hdev,bool hard_reset,bool fw_reset)40035e09ae92SDafna Hirschfeld static int gaudi_hw_fini(struct hl_device *hdev, bool hard_reset, bool fw_reset)
4004e65e175bSOded Gabbay {
4005e65e175bSOded Gabbay 	struct cpu_dyn_regs *dyn_regs =
4006e65e175bSOded Gabbay 			&hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
4007e65e175bSOded Gabbay 	u32 status, reset_timeout_ms, cpu_timeout_ms, irq_handler_offset;
4008e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
4009e65e175bSOded Gabbay 	bool driver_performs_reset;
4010e65e175bSOded Gabbay 
4011e65e175bSOded Gabbay 	if (!hard_reset) {
4012e65e175bSOded Gabbay 		dev_err(hdev->dev, "GAUDI doesn't support soft-reset\n");
40135e09ae92SDafna Hirschfeld 		return 0;
4014e65e175bSOded Gabbay 	}
4015e65e175bSOded Gabbay 
4016e65e175bSOded Gabbay 	if (hdev->pldm) {
4017e65e175bSOded Gabbay 		reset_timeout_ms = GAUDI_PLDM_HRESET_TIMEOUT_MSEC;
4018e65e175bSOded Gabbay 		cpu_timeout_ms = GAUDI_PLDM_RESET_WAIT_MSEC;
4019e65e175bSOded Gabbay 	} else {
4020e65e175bSOded Gabbay 		reset_timeout_ms = GAUDI_RESET_TIMEOUT_MSEC;
4021e65e175bSOded Gabbay 		cpu_timeout_ms = GAUDI_CPU_RESET_WAIT_MSEC;
4022e65e175bSOded Gabbay 	}
4023e65e175bSOded Gabbay 
4024e65e175bSOded Gabbay 	if (fw_reset) {
4025e65e175bSOded Gabbay 		dev_dbg(hdev->dev,
4026e65e175bSOded Gabbay 			"Firmware performs HARD reset, going to wait %dms\n",
4027e65e175bSOded Gabbay 			reset_timeout_ms);
4028e65e175bSOded Gabbay 
4029e65e175bSOded Gabbay 		goto skip_reset;
4030e65e175bSOded Gabbay 	}
4031e65e175bSOded Gabbay 
4032e65e175bSOded Gabbay 	driver_performs_reset = !!(!hdev->asic_prop.fw_security_enabled &&
4033e65e175bSOded Gabbay 					!hdev->asic_prop.hard_reset_done_by_fw);
4034e65e175bSOded Gabbay 
4035e65e175bSOded Gabbay 	/* Set device to handle FLR by H/W as we will put the device CPU to
4036e65e175bSOded Gabbay 	 * halt mode
4037e65e175bSOded Gabbay 	 */
4038e65e175bSOded Gabbay 	if (driver_performs_reset)
4039e65e175bSOded Gabbay 		WREG32(mmPCIE_AUX_FLR_CTRL, (PCIE_AUX_FLR_CTRL_HW_CTRL_MASK |
4040e65e175bSOded Gabbay 					PCIE_AUX_FLR_CTRL_INT_MASK_MASK));
4041e65e175bSOded Gabbay 
4042e65e175bSOded Gabbay 	/* If linux is loaded in the device CPU we need to communicate with it
4043e65e175bSOded Gabbay 	 * via the GIC. Otherwise, we need to use COMMS or the MSG_TO_CPU
4044e65e175bSOded Gabbay 	 * registers in case of old F/Ws
4045e65e175bSOded Gabbay 	 */
4046e65e175bSOded Gabbay 	if (hdev->fw_loader.fw_comp_loaded & FW_TYPE_LINUX) {
4047e65e175bSOded Gabbay 		irq_handler_offset = hdev->asic_prop.gic_interrupts_enable ?
4048e65e175bSOded Gabbay 				mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR :
4049e65e175bSOded Gabbay 				le32_to_cpu(dyn_regs->gic_host_halt_irq);
4050e65e175bSOded Gabbay 
4051e65e175bSOded Gabbay 		WREG32(irq_handler_offset,
4052e65e175bSOded Gabbay 			gaudi_irq_map_table[GAUDI_EVENT_HALT_MACHINE].cpu_id);
4053e65e175bSOded Gabbay 
4054e65e175bSOded Gabbay 		/* This is a hail-mary attempt to revive the card in the small chance that the
4055e65e175bSOded Gabbay 		 * f/w has experienced a watchdog event, which caused it to return back to preboot.
4056e65e175bSOded Gabbay 		 * In that case, triggering reset through GIC won't help. We need to trigger the
4057e65e175bSOded Gabbay 		 * reset as if Linux wasn't loaded.
4058e65e175bSOded Gabbay 		 *
4059e65e175bSOded Gabbay 		 * We do it only if the reset cause was HB, because that would be the indication
4060e65e175bSOded Gabbay 		 * of such an event.
4061e65e175bSOded Gabbay 		 *
4062e65e175bSOded Gabbay 		 * In case watchdog hasn't expired but we still got HB, then this won't do any
4063e65e175bSOded Gabbay 		 * damage.
4064e65e175bSOded Gabbay 		 */
4065e65e175bSOded Gabbay 		if (hdev->reset_info.curr_reset_cause == HL_RESET_CAUSE_HEARTBEAT) {
4066e65e175bSOded Gabbay 			if (hdev->asic_prop.hard_reset_done_by_fw)
4067e65e175bSOded Gabbay 				hl_fw_ask_hard_reset_without_linux(hdev);
4068e65e175bSOded Gabbay 			else
4069e65e175bSOded Gabbay 				hl_fw_ask_halt_machine_without_linux(hdev);
4070e65e175bSOded Gabbay 		}
4071e65e175bSOded Gabbay 	} else {
4072e65e175bSOded Gabbay 		if (hdev->asic_prop.hard_reset_done_by_fw)
4073e65e175bSOded Gabbay 			hl_fw_ask_hard_reset_without_linux(hdev);
4074e65e175bSOded Gabbay 		else
4075e65e175bSOded Gabbay 			hl_fw_ask_halt_machine_without_linux(hdev);
4076e65e175bSOded Gabbay 	}
4077e65e175bSOded Gabbay 
4078e65e175bSOded Gabbay 	if (driver_performs_reset) {
4079e65e175bSOded Gabbay 
4080e65e175bSOded Gabbay 		/* Configure the reset registers. Must be done as early as
4081e65e175bSOded Gabbay 		 * possible in case we fail during H/W initialization
4082e65e175bSOded Gabbay 		 */
4083e65e175bSOded Gabbay 		WREG32(mmPSOC_GLOBAL_CONF_SOFT_RST_CFG_H,
4084e65e175bSOded Gabbay 						(CFG_RST_H_DMA_MASK |
4085e65e175bSOded Gabbay 						CFG_RST_H_MME_MASK |
4086e65e175bSOded Gabbay 						CFG_RST_H_SM_MASK |
4087e65e175bSOded Gabbay 						CFG_RST_H_TPC_7_MASK));
4088e65e175bSOded Gabbay 
4089e65e175bSOded Gabbay 		WREG32(mmPSOC_GLOBAL_CONF_SOFT_RST_CFG_L, CFG_RST_L_TPC_MASK);
4090e65e175bSOded Gabbay 
4091e65e175bSOded Gabbay 		WREG32(mmPSOC_GLOBAL_CONF_SW_ALL_RST_CFG_H,
4092e65e175bSOded Gabbay 						(CFG_RST_H_HBM_MASK |
4093e65e175bSOded Gabbay 						CFG_RST_H_TPC_7_MASK |
4094e65e175bSOded Gabbay 						CFG_RST_H_NIC_MASK |
4095e65e175bSOded Gabbay 						CFG_RST_H_SM_MASK |
4096e65e175bSOded Gabbay 						CFG_RST_H_DMA_MASK |
4097e65e175bSOded Gabbay 						CFG_RST_H_MME_MASK |
4098e65e175bSOded Gabbay 						CFG_RST_H_CPU_MASK |
4099e65e175bSOded Gabbay 						CFG_RST_H_MMU_MASK));
4100e65e175bSOded Gabbay 
4101e65e175bSOded Gabbay 		WREG32(mmPSOC_GLOBAL_CONF_SW_ALL_RST_CFG_L,
4102e65e175bSOded Gabbay 						(CFG_RST_L_IF_MASK |
4103e65e175bSOded Gabbay 						CFG_RST_L_PSOC_MASK |
4104e65e175bSOded Gabbay 						CFG_RST_L_TPC_MASK));
4105e65e175bSOded Gabbay 
4106e65e175bSOded Gabbay 		msleep(cpu_timeout_ms);
4107e65e175bSOded Gabbay 
4108e65e175bSOded Gabbay 		/* Tell ASIC not to re-initialize PCIe */
4109e65e175bSOded Gabbay 		WREG32(mmPREBOOT_PCIE_EN, LKD_HARD_RESET_MAGIC);
4110e65e175bSOded Gabbay 
4111e65e175bSOded Gabbay 		/* Restart BTL/BLR upon hard-reset */
4112e65e175bSOded Gabbay 		WREG32(mmPSOC_GLOBAL_CONF_BOOT_SEQ_RE_START, 1);
4113e65e175bSOded Gabbay 
4114e65e175bSOded Gabbay 		WREG32(mmPSOC_GLOBAL_CONF_SW_ALL_RST,
4115e65e175bSOded Gabbay 			1 << PSOC_GLOBAL_CONF_SW_ALL_RST_IND_SHIFT);
4116e65e175bSOded Gabbay 
4117e65e175bSOded Gabbay 		dev_dbg(hdev->dev,
4118e65e175bSOded Gabbay 			"Issued HARD reset command, going to wait %dms\n",
4119e65e175bSOded Gabbay 			reset_timeout_ms);
4120e65e175bSOded Gabbay 	} else {
4121e65e175bSOded Gabbay 		dev_dbg(hdev->dev,
4122e65e175bSOded Gabbay 			"Firmware performs HARD reset, going to wait %dms\n",
4123e65e175bSOded Gabbay 			reset_timeout_ms);
4124e65e175bSOded Gabbay 	}
4125e65e175bSOded Gabbay 
4126e65e175bSOded Gabbay skip_reset:
4127e65e175bSOded Gabbay 	/*
4128e65e175bSOded Gabbay 	 * After hard reset, we can't poll the BTM_FSM register because the PSOC
4129e65e175bSOded Gabbay 	 * itself is in reset. Need to wait until the reset is deasserted
4130e65e175bSOded Gabbay 	 */
4131e65e175bSOded Gabbay 	msleep(reset_timeout_ms);
4132e65e175bSOded Gabbay 
4133e65e175bSOded Gabbay 	status = RREG32(mmPSOC_GLOBAL_CONF_BTM_FSM);
4134077a39faSDafna Hirschfeld 	if (status & PSOC_GLOBAL_CONF_BTM_FSM_STATE_MASK) {
4135077a39faSDafna Hirschfeld 		dev_err(hdev->dev, "Timeout while waiting for device to reset 0x%x\n", status);
4136077a39faSDafna Hirschfeld 		return -ETIMEDOUT;
4137077a39faSDafna Hirschfeld 	}
4138e65e175bSOded Gabbay 
4139e65e175bSOded Gabbay 	if (gaudi) {
4140e65e175bSOded Gabbay 		gaudi->hw_cap_initialized &= ~(HW_CAP_CPU | HW_CAP_CPU_Q | HW_CAP_HBM |
4141e65e175bSOded Gabbay 						HW_CAP_PCI_DMA | HW_CAP_MME | HW_CAP_TPC_MASK |
4142e65e175bSOded Gabbay 						HW_CAP_HBM_DMA | HW_CAP_PLL | HW_CAP_NIC_MASK |
4143e65e175bSOded Gabbay 						HW_CAP_MMU | HW_CAP_SRAM_SCRAMBLER |
4144e65e175bSOded Gabbay 						HW_CAP_HBM_SCRAMBLER);
4145e65e175bSOded Gabbay 
4146e65e175bSOded Gabbay 		memset(gaudi->events_stat, 0, sizeof(gaudi->events_stat));
4147e65e175bSOded Gabbay 
4148e65e175bSOded Gabbay 		hdev->device_cpu_is_halted = false;
4149e65e175bSOded Gabbay 	}
41505e09ae92SDafna Hirschfeld 	return 0;
4151e65e175bSOded Gabbay }
4152e65e175bSOded Gabbay 
gaudi_suspend(struct hl_device * hdev)4153e65e175bSOded Gabbay static int gaudi_suspend(struct hl_device *hdev)
4154e65e175bSOded Gabbay {
4155*ecda35d4SOhad Sharabi 	return hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_DISABLE_PCI_ACCESS, 0x0);
4156e65e175bSOded Gabbay }
4157e65e175bSOded Gabbay 
gaudi_resume(struct hl_device * hdev)4158e65e175bSOded Gabbay static int gaudi_resume(struct hl_device *hdev)
4159e65e175bSOded Gabbay {
4160e65e175bSOded Gabbay 	return gaudi_init_iatu(hdev);
4161e65e175bSOded Gabbay }
4162e65e175bSOded Gabbay 
gaudi_mmap(struct hl_device * hdev,struct vm_area_struct * vma,void * cpu_addr,dma_addr_t dma_addr,size_t size)4163e65e175bSOded Gabbay static int gaudi_mmap(struct hl_device *hdev, struct vm_area_struct *vma,
4164e65e175bSOded Gabbay 			void *cpu_addr, dma_addr_t dma_addr, size_t size)
4165e65e175bSOded Gabbay {
4166e65e175bSOded Gabbay 	int rc;
4167e65e175bSOded Gabbay 
41683822a7c4SLinus Torvalds 	vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
41693822a7c4SLinus Torvalds 			VM_DONTCOPY | VM_NORESERVE);
4170e65e175bSOded Gabbay 
4171e65e175bSOded Gabbay 	rc = dma_mmap_coherent(hdev->dev, vma, cpu_addr,
4172e65e175bSOded Gabbay 				(dma_addr - HOST_PHYS_BASE), size);
4173e65e175bSOded Gabbay 	if (rc)
4174e65e175bSOded Gabbay 		dev_err(hdev->dev, "dma_mmap_coherent error %d", rc);
4175e65e175bSOded Gabbay 
4176e65e175bSOded Gabbay 	return rc;
4177e65e175bSOded Gabbay }
4178e65e175bSOded Gabbay 
gaudi_ring_doorbell(struct hl_device * hdev,u32 hw_queue_id,u32 pi)4179e65e175bSOded Gabbay static void gaudi_ring_doorbell(struct hl_device *hdev, u32 hw_queue_id, u32 pi)
4180e65e175bSOded Gabbay {
4181e65e175bSOded Gabbay 	struct cpu_dyn_regs *dyn_regs =
4182e65e175bSOded Gabbay 			&hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
4183e65e175bSOded Gabbay 	u32 db_reg_offset, db_value, dma_qm_offset, q_off, irq_handler_offset;
4184e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
4185e65e175bSOded Gabbay 	bool invalid_queue = false;
4186e65e175bSOded Gabbay 	int dma_id;
4187e65e175bSOded Gabbay 
4188e65e175bSOded Gabbay 	switch (hw_queue_id) {
4189e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_0_0...GAUDI_QUEUE_ID_DMA_0_3:
4190e65e175bSOded Gabbay 		dma_id = gaudi_dma_assignment[GAUDI_PCI_DMA_1];
4191e65e175bSOded Gabbay 		dma_qm_offset = dma_id * DMA_QMAN_OFFSET;
4192e65e175bSOded Gabbay 		q_off = dma_qm_offset + (hw_queue_id & 0x3) * 4;
4193e65e175bSOded Gabbay 		db_reg_offset = mmDMA0_QM_PQ_PI_0 + q_off;
4194e65e175bSOded Gabbay 		break;
4195e65e175bSOded Gabbay 
4196e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_1_0...GAUDI_QUEUE_ID_DMA_1_3:
4197e65e175bSOded Gabbay 		dma_id = gaudi_dma_assignment[GAUDI_PCI_DMA_2];
4198e65e175bSOded Gabbay 		dma_qm_offset = dma_id * DMA_QMAN_OFFSET;
4199e65e175bSOded Gabbay 		q_off = dma_qm_offset + (hw_queue_id & 0x3) * 4;
4200e65e175bSOded Gabbay 		db_reg_offset = mmDMA0_QM_PQ_PI_0 + q_off;
4201e65e175bSOded Gabbay 		break;
4202e65e175bSOded Gabbay 
4203e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_2_0...GAUDI_QUEUE_ID_DMA_2_3:
4204e65e175bSOded Gabbay 		dma_id = gaudi_dma_assignment[GAUDI_HBM_DMA_1];
4205e65e175bSOded Gabbay 		dma_qm_offset = dma_id * DMA_QMAN_OFFSET;
4206e65e175bSOded Gabbay 		q_off = dma_qm_offset + ((hw_queue_id - 1) & 0x3) * 4;
4207e65e175bSOded Gabbay 		db_reg_offset = mmDMA0_QM_PQ_PI_0 + q_off;
4208e65e175bSOded Gabbay 		break;
4209e65e175bSOded Gabbay 
4210e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_3_0...GAUDI_QUEUE_ID_DMA_3_3:
4211e65e175bSOded Gabbay 		dma_id = gaudi_dma_assignment[GAUDI_HBM_DMA_2];
4212e65e175bSOded Gabbay 		dma_qm_offset = dma_id * DMA_QMAN_OFFSET;
4213e65e175bSOded Gabbay 		q_off = dma_qm_offset + ((hw_queue_id - 1) & 0x3) * 4;
4214e65e175bSOded Gabbay 		db_reg_offset = mmDMA0_QM_PQ_PI_0 + q_off;
4215e65e175bSOded Gabbay 		break;
4216e65e175bSOded Gabbay 
4217e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_4_0...GAUDI_QUEUE_ID_DMA_4_3:
4218e65e175bSOded Gabbay 		dma_id = gaudi_dma_assignment[GAUDI_HBM_DMA_3];
4219e65e175bSOded Gabbay 		dma_qm_offset = dma_id * DMA_QMAN_OFFSET;
4220e65e175bSOded Gabbay 		q_off = dma_qm_offset + ((hw_queue_id - 1) & 0x3) * 4;
4221e65e175bSOded Gabbay 		db_reg_offset = mmDMA0_QM_PQ_PI_0 + q_off;
4222e65e175bSOded Gabbay 		break;
4223e65e175bSOded Gabbay 
4224e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_5_0...GAUDI_QUEUE_ID_DMA_5_3:
4225e65e175bSOded Gabbay 		dma_id = gaudi_dma_assignment[GAUDI_HBM_DMA_4];
4226e65e175bSOded Gabbay 		dma_qm_offset = dma_id * DMA_QMAN_OFFSET;
4227e65e175bSOded Gabbay 		q_off = dma_qm_offset + ((hw_queue_id - 1) & 0x3) * 4;
4228e65e175bSOded Gabbay 		db_reg_offset = mmDMA0_QM_PQ_PI_0 + q_off;
4229e65e175bSOded Gabbay 		break;
4230e65e175bSOded Gabbay 
4231e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_6_0...GAUDI_QUEUE_ID_DMA_6_3:
4232e65e175bSOded Gabbay 		dma_id = gaudi_dma_assignment[GAUDI_HBM_DMA_5];
4233e65e175bSOded Gabbay 		dma_qm_offset = dma_id * DMA_QMAN_OFFSET;
4234e65e175bSOded Gabbay 		q_off = dma_qm_offset + ((hw_queue_id - 1) & 0x3) * 4;
4235e65e175bSOded Gabbay 		db_reg_offset = mmDMA0_QM_PQ_PI_0 + q_off;
4236e65e175bSOded Gabbay 		break;
4237e65e175bSOded Gabbay 
4238e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_7_0...GAUDI_QUEUE_ID_DMA_7_3:
4239e65e175bSOded Gabbay 		dma_id = gaudi_dma_assignment[GAUDI_HBM_DMA_6];
4240e65e175bSOded Gabbay 		dma_qm_offset = dma_id * DMA_QMAN_OFFSET;
4241e65e175bSOded Gabbay 		q_off = dma_qm_offset + ((hw_queue_id - 1) & 0x3) * 4;
4242e65e175bSOded Gabbay 		db_reg_offset = mmDMA0_QM_PQ_PI_0 + q_off;
4243e65e175bSOded Gabbay 		break;
4244e65e175bSOded Gabbay 
4245e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_CPU_PQ:
4246e65e175bSOded Gabbay 		if (gaudi->hw_cap_initialized & HW_CAP_CPU_Q)
4247e65e175bSOded Gabbay 			db_reg_offset = mmCPU_IF_PF_PQ_PI;
4248e65e175bSOded Gabbay 		else
4249e65e175bSOded Gabbay 			invalid_queue = true;
4250e65e175bSOded Gabbay 		break;
4251e65e175bSOded Gabbay 
4252e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_MME_0_0:
4253e65e175bSOded Gabbay 		db_reg_offset = mmMME2_QM_PQ_PI_0;
4254e65e175bSOded Gabbay 		break;
4255e65e175bSOded Gabbay 
4256e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_MME_0_1:
4257e65e175bSOded Gabbay 		db_reg_offset = mmMME2_QM_PQ_PI_1;
4258e65e175bSOded Gabbay 		break;
4259e65e175bSOded Gabbay 
4260e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_MME_0_2:
4261e65e175bSOded Gabbay 		db_reg_offset = mmMME2_QM_PQ_PI_2;
4262e65e175bSOded Gabbay 		break;
4263e65e175bSOded Gabbay 
4264e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_MME_0_3:
4265e65e175bSOded Gabbay 		db_reg_offset = mmMME2_QM_PQ_PI_3;
4266e65e175bSOded Gabbay 		break;
4267e65e175bSOded Gabbay 
4268e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_MME_1_0:
4269e65e175bSOded Gabbay 		db_reg_offset = mmMME0_QM_PQ_PI_0;
4270e65e175bSOded Gabbay 		break;
4271e65e175bSOded Gabbay 
4272e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_MME_1_1:
4273e65e175bSOded Gabbay 		db_reg_offset = mmMME0_QM_PQ_PI_1;
4274e65e175bSOded Gabbay 		break;
4275e65e175bSOded Gabbay 
4276e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_MME_1_2:
4277e65e175bSOded Gabbay 		db_reg_offset = mmMME0_QM_PQ_PI_2;
4278e65e175bSOded Gabbay 		break;
4279e65e175bSOded Gabbay 
4280e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_MME_1_3:
4281e65e175bSOded Gabbay 		db_reg_offset = mmMME0_QM_PQ_PI_3;
4282e65e175bSOded Gabbay 		break;
4283e65e175bSOded Gabbay 
4284e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_0_0:
4285e65e175bSOded Gabbay 		db_reg_offset = mmTPC0_QM_PQ_PI_0;
4286e65e175bSOded Gabbay 		break;
4287e65e175bSOded Gabbay 
4288e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_0_1:
4289e65e175bSOded Gabbay 		db_reg_offset = mmTPC0_QM_PQ_PI_1;
4290e65e175bSOded Gabbay 		break;
4291e65e175bSOded Gabbay 
4292e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_0_2:
4293e65e175bSOded Gabbay 		db_reg_offset = mmTPC0_QM_PQ_PI_2;
4294e65e175bSOded Gabbay 		break;
4295e65e175bSOded Gabbay 
4296e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_0_3:
4297e65e175bSOded Gabbay 		db_reg_offset = mmTPC0_QM_PQ_PI_3;
4298e65e175bSOded Gabbay 		break;
4299e65e175bSOded Gabbay 
4300e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_1_0:
4301e65e175bSOded Gabbay 		db_reg_offset = mmTPC1_QM_PQ_PI_0;
4302e65e175bSOded Gabbay 		break;
4303e65e175bSOded Gabbay 
4304e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_1_1:
4305e65e175bSOded Gabbay 		db_reg_offset = mmTPC1_QM_PQ_PI_1;
4306e65e175bSOded Gabbay 		break;
4307e65e175bSOded Gabbay 
4308e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_1_2:
4309e65e175bSOded Gabbay 		db_reg_offset = mmTPC1_QM_PQ_PI_2;
4310e65e175bSOded Gabbay 		break;
4311e65e175bSOded Gabbay 
4312e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_1_3:
4313e65e175bSOded Gabbay 		db_reg_offset = mmTPC1_QM_PQ_PI_3;
4314e65e175bSOded Gabbay 		break;
4315e65e175bSOded Gabbay 
4316e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_2_0:
4317e65e175bSOded Gabbay 		db_reg_offset = mmTPC2_QM_PQ_PI_0;
4318e65e175bSOded Gabbay 		break;
4319e65e175bSOded Gabbay 
4320e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_2_1:
4321e65e175bSOded Gabbay 		db_reg_offset = mmTPC2_QM_PQ_PI_1;
4322e65e175bSOded Gabbay 		break;
4323e65e175bSOded Gabbay 
4324e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_2_2:
4325e65e175bSOded Gabbay 		db_reg_offset = mmTPC2_QM_PQ_PI_2;
4326e65e175bSOded Gabbay 		break;
4327e65e175bSOded Gabbay 
4328e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_2_3:
4329e65e175bSOded Gabbay 		db_reg_offset = mmTPC2_QM_PQ_PI_3;
4330e65e175bSOded Gabbay 		break;
4331e65e175bSOded Gabbay 
4332e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_3_0:
4333e65e175bSOded Gabbay 		db_reg_offset = mmTPC3_QM_PQ_PI_0;
4334e65e175bSOded Gabbay 		break;
4335e65e175bSOded Gabbay 
4336e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_3_1:
4337e65e175bSOded Gabbay 		db_reg_offset = mmTPC3_QM_PQ_PI_1;
4338e65e175bSOded Gabbay 		break;
4339e65e175bSOded Gabbay 
4340e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_3_2:
4341e65e175bSOded Gabbay 		db_reg_offset = mmTPC3_QM_PQ_PI_2;
4342e65e175bSOded Gabbay 		break;
4343e65e175bSOded Gabbay 
4344e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_3_3:
4345e65e175bSOded Gabbay 		db_reg_offset = mmTPC3_QM_PQ_PI_3;
4346e65e175bSOded Gabbay 		break;
4347e65e175bSOded Gabbay 
4348e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_4_0:
4349e65e175bSOded Gabbay 		db_reg_offset = mmTPC4_QM_PQ_PI_0;
4350e65e175bSOded Gabbay 		break;
4351e65e175bSOded Gabbay 
4352e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_4_1:
4353e65e175bSOded Gabbay 		db_reg_offset = mmTPC4_QM_PQ_PI_1;
4354e65e175bSOded Gabbay 		break;
4355e65e175bSOded Gabbay 
4356e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_4_2:
4357e65e175bSOded Gabbay 		db_reg_offset = mmTPC4_QM_PQ_PI_2;
4358e65e175bSOded Gabbay 		break;
4359e65e175bSOded Gabbay 
4360e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_4_3:
4361e65e175bSOded Gabbay 		db_reg_offset = mmTPC4_QM_PQ_PI_3;
4362e65e175bSOded Gabbay 		break;
4363e65e175bSOded Gabbay 
4364e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_5_0:
4365e65e175bSOded Gabbay 		db_reg_offset = mmTPC5_QM_PQ_PI_0;
4366e65e175bSOded Gabbay 		break;
4367e65e175bSOded Gabbay 
4368e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_5_1:
4369e65e175bSOded Gabbay 		db_reg_offset = mmTPC5_QM_PQ_PI_1;
4370e65e175bSOded Gabbay 		break;
4371e65e175bSOded Gabbay 
4372e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_5_2:
4373e65e175bSOded Gabbay 		db_reg_offset = mmTPC5_QM_PQ_PI_2;
4374e65e175bSOded Gabbay 		break;
4375e65e175bSOded Gabbay 
4376e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_5_3:
4377e65e175bSOded Gabbay 		db_reg_offset = mmTPC5_QM_PQ_PI_3;
4378e65e175bSOded Gabbay 		break;
4379e65e175bSOded Gabbay 
4380e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_6_0:
4381e65e175bSOded Gabbay 		db_reg_offset = mmTPC6_QM_PQ_PI_0;
4382e65e175bSOded Gabbay 		break;
4383e65e175bSOded Gabbay 
4384e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_6_1:
4385e65e175bSOded Gabbay 		db_reg_offset = mmTPC6_QM_PQ_PI_1;
4386e65e175bSOded Gabbay 		break;
4387e65e175bSOded Gabbay 
4388e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_6_2:
4389e65e175bSOded Gabbay 		db_reg_offset = mmTPC6_QM_PQ_PI_2;
4390e65e175bSOded Gabbay 		break;
4391e65e175bSOded Gabbay 
4392e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_6_3:
4393e65e175bSOded Gabbay 		db_reg_offset = mmTPC6_QM_PQ_PI_3;
4394e65e175bSOded Gabbay 		break;
4395e65e175bSOded Gabbay 
4396e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_7_0:
4397e65e175bSOded Gabbay 		db_reg_offset = mmTPC7_QM_PQ_PI_0;
4398e65e175bSOded Gabbay 		break;
4399e65e175bSOded Gabbay 
4400e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_7_1:
4401e65e175bSOded Gabbay 		db_reg_offset = mmTPC7_QM_PQ_PI_1;
4402e65e175bSOded Gabbay 		break;
4403e65e175bSOded Gabbay 
4404e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_7_2:
4405e65e175bSOded Gabbay 		db_reg_offset = mmTPC7_QM_PQ_PI_2;
4406e65e175bSOded Gabbay 		break;
4407e65e175bSOded Gabbay 
4408e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_7_3:
4409e65e175bSOded Gabbay 		db_reg_offset = mmTPC7_QM_PQ_PI_3;
4410e65e175bSOded Gabbay 		break;
4411e65e175bSOded Gabbay 
4412e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_0_0...GAUDI_QUEUE_ID_NIC_0_3:
4413e65e175bSOded Gabbay 		if (!(gaudi->hw_cap_initialized & HW_CAP_NIC0))
4414e65e175bSOded Gabbay 			invalid_queue = true;
4415e65e175bSOded Gabbay 
4416e65e175bSOded Gabbay 		q_off = ((hw_queue_id - 1) & 0x3) * 4;
4417e65e175bSOded Gabbay 		db_reg_offset = mmNIC0_QM0_PQ_PI_0 + q_off;
4418e65e175bSOded Gabbay 		break;
4419e65e175bSOded Gabbay 
4420e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_1_0...GAUDI_QUEUE_ID_NIC_1_3:
4421e65e175bSOded Gabbay 		if (!(gaudi->hw_cap_initialized & HW_CAP_NIC1))
4422e65e175bSOded Gabbay 			invalid_queue = true;
4423e65e175bSOded Gabbay 
4424e65e175bSOded Gabbay 		q_off = ((hw_queue_id - 1) & 0x3) * 4;
4425e65e175bSOded Gabbay 		db_reg_offset = mmNIC0_QM1_PQ_PI_0 + q_off;
4426e65e175bSOded Gabbay 		break;
4427e65e175bSOded Gabbay 
4428e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_2_0...GAUDI_QUEUE_ID_NIC_2_3:
4429e65e175bSOded Gabbay 		if (!(gaudi->hw_cap_initialized & HW_CAP_NIC2))
4430e65e175bSOded Gabbay 			invalid_queue = true;
4431e65e175bSOded Gabbay 
4432e65e175bSOded Gabbay 		q_off = ((hw_queue_id - 1) & 0x3) * 4;
4433e65e175bSOded Gabbay 		db_reg_offset = mmNIC1_QM0_PQ_PI_0 + q_off;
4434e65e175bSOded Gabbay 		break;
4435e65e175bSOded Gabbay 
4436e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_3_0...GAUDI_QUEUE_ID_NIC_3_3:
4437e65e175bSOded Gabbay 		if (!(gaudi->hw_cap_initialized & HW_CAP_NIC3))
4438e65e175bSOded Gabbay 			invalid_queue = true;
4439e65e175bSOded Gabbay 
4440e65e175bSOded Gabbay 		q_off = ((hw_queue_id - 1) & 0x3) * 4;
4441e65e175bSOded Gabbay 		db_reg_offset = mmNIC1_QM1_PQ_PI_0 + q_off;
4442e65e175bSOded Gabbay 		break;
4443e65e175bSOded Gabbay 
4444e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_4_0...GAUDI_QUEUE_ID_NIC_4_3:
4445e65e175bSOded Gabbay 		if (!(gaudi->hw_cap_initialized & HW_CAP_NIC4))
4446e65e175bSOded Gabbay 			invalid_queue = true;
4447e65e175bSOded Gabbay 
4448e65e175bSOded Gabbay 		q_off = ((hw_queue_id - 1) & 0x3) * 4;
4449e65e175bSOded Gabbay 		db_reg_offset = mmNIC2_QM0_PQ_PI_0 + q_off;
4450e65e175bSOded Gabbay 		break;
4451e65e175bSOded Gabbay 
4452e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_5_0...GAUDI_QUEUE_ID_NIC_5_3:
4453e65e175bSOded Gabbay 		if (!(gaudi->hw_cap_initialized & HW_CAP_NIC5))
4454e65e175bSOded Gabbay 			invalid_queue = true;
4455e65e175bSOded Gabbay 
4456e65e175bSOded Gabbay 		q_off = ((hw_queue_id - 1) & 0x3) * 4;
4457e65e175bSOded Gabbay 		db_reg_offset = mmNIC2_QM1_PQ_PI_0 + q_off;
4458e65e175bSOded Gabbay 		break;
4459e65e175bSOded Gabbay 
4460e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_6_0...GAUDI_QUEUE_ID_NIC_6_3:
4461e65e175bSOded Gabbay 		if (!(gaudi->hw_cap_initialized & HW_CAP_NIC6))
4462e65e175bSOded Gabbay 			invalid_queue = true;
4463e65e175bSOded Gabbay 
4464e65e175bSOded Gabbay 		q_off = ((hw_queue_id - 1) & 0x3) * 4;
4465e65e175bSOded Gabbay 		db_reg_offset = mmNIC3_QM0_PQ_PI_0 + q_off;
4466e65e175bSOded Gabbay 		break;
4467e65e175bSOded Gabbay 
4468e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_7_0...GAUDI_QUEUE_ID_NIC_7_3:
4469e65e175bSOded Gabbay 		if (!(gaudi->hw_cap_initialized & HW_CAP_NIC7))
4470e65e175bSOded Gabbay 			invalid_queue = true;
4471e65e175bSOded Gabbay 
4472e65e175bSOded Gabbay 		q_off = ((hw_queue_id - 1) & 0x3) * 4;
4473e65e175bSOded Gabbay 		db_reg_offset = mmNIC3_QM1_PQ_PI_0 + q_off;
4474e65e175bSOded Gabbay 		break;
4475e65e175bSOded Gabbay 
4476e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_8_0...GAUDI_QUEUE_ID_NIC_8_3:
4477e65e175bSOded Gabbay 		if (!(gaudi->hw_cap_initialized & HW_CAP_NIC8))
4478e65e175bSOded Gabbay 			invalid_queue = true;
4479e65e175bSOded Gabbay 
4480e65e175bSOded Gabbay 		q_off = ((hw_queue_id - 1) & 0x3) * 4;
4481e65e175bSOded Gabbay 		db_reg_offset = mmNIC4_QM0_PQ_PI_0 + q_off;
4482e65e175bSOded Gabbay 		break;
4483e65e175bSOded Gabbay 
4484e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_9_0...GAUDI_QUEUE_ID_NIC_9_3:
4485e65e175bSOded Gabbay 		if (!(gaudi->hw_cap_initialized & HW_CAP_NIC9))
4486e65e175bSOded Gabbay 			invalid_queue = true;
4487e65e175bSOded Gabbay 
4488e65e175bSOded Gabbay 		q_off = ((hw_queue_id - 1) & 0x3) * 4;
4489e65e175bSOded Gabbay 		db_reg_offset = mmNIC4_QM1_PQ_PI_0 + q_off;
4490e65e175bSOded Gabbay 		break;
4491e65e175bSOded Gabbay 
4492e65e175bSOded Gabbay 	default:
4493e65e175bSOded Gabbay 		invalid_queue = true;
4494e65e175bSOded Gabbay 	}
4495e65e175bSOded Gabbay 
4496e65e175bSOded Gabbay 	if (invalid_queue) {
4497e65e175bSOded Gabbay 		/* Should never get here */
4498e65e175bSOded Gabbay 		dev_err(hdev->dev, "h/w queue %d is invalid. Can't set pi\n",
4499e65e175bSOded Gabbay 			hw_queue_id);
4500e65e175bSOded Gabbay 		return;
4501e65e175bSOded Gabbay 	}
4502e65e175bSOded Gabbay 
4503e65e175bSOded Gabbay 	db_value = pi;
4504e65e175bSOded Gabbay 
4505e65e175bSOded Gabbay 	/* ring the doorbell */
4506e65e175bSOded Gabbay 	WREG32(db_reg_offset, db_value);
4507e65e175bSOded Gabbay 
4508e65e175bSOded Gabbay 	if (hw_queue_id == GAUDI_QUEUE_ID_CPU_PQ) {
4509e65e175bSOded Gabbay 		/* make sure device CPU will read latest data from host */
4510e65e175bSOded Gabbay 		mb();
4511e65e175bSOded Gabbay 
4512e65e175bSOded Gabbay 		irq_handler_offset = hdev->asic_prop.gic_interrupts_enable ?
4513e65e175bSOded Gabbay 				mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR :
4514e65e175bSOded Gabbay 				le32_to_cpu(dyn_regs->gic_host_pi_upd_irq);
4515e65e175bSOded Gabbay 
4516e65e175bSOded Gabbay 		WREG32(irq_handler_offset,
4517e65e175bSOded Gabbay 			gaudi_irq_map_table[GAUDI_EVENT_PI_UPDATE].cpu_id);
4518e65e175bSOded Gabbay 	}
4519e65e175bSOded Gabbay }
4520e65e175bSOded Gabbay 
gaudi_pqe_write(struct hl_device * hdev,__le64 * pqe,struct hl_bd * bd)4521e65e175bSOded Gabbay static void gaudi_pqe_write(struct hl_device *hdev, __le64 *pqe,
4522e65e175bSOded Gabbay 				struct hl_bd *bd)
4523e65e175bSOded Gabbay {
4524e65e175bSOded Gabbay 	__le64 *pbd = (__le64 *) bd;
4525e65e175bSOded Gabbay 
4526e65e175bSOded Gabbay 	/* The QMANs are on the host memory so a simple copy suffice */
4527e65e175bSOded Gabbay 	pqe[0] = pbd[0];
4528e65e175bSOded Gabbay 	pqe[1] = pbd[1];
4529e65e175bSOded Gabbay }
4530e65e175bSOded Gabbay 
gaudi_dma_alloc_coherent(struct hl_device * hdev,size_t size,dma_addr_t * dma_handle,gfp_t flags)4531e65e175bSOded Gabbay static void *gaudi_dma_alloc_coherent(struct hl_device *hdev, size_t size,
4532e65e175bSOded Gabbay 					dma_addr_t *dma_handle, gfp_t flags)
4533e65e175bSOded Gabbay {
4534e65e175bSOded Gabbay 	void *kernel_addr = dma_alloc_coherent(&hdev->pdev->dev, size,
4535e65e175bSOded Gabbay 						dma_handle, flags);
4536e65e175bSOded Gabbay 
4537e65e175bSOded Gabbay 	/* Shift to the device's base physical address of host memory */
4538e65e175bSOded Gabbay 	if (kernel_addr)
4539e65e175bSOded Gabbay 		*dma_handle += HOST_PHYS_BASE;
4540e65e175bSOded Gabbay 
4541e65e175bSOded Gabbay 	return kernel_addr;
4542e65e175bSOded Gabbay }
4543e65e175bSOded Gabbay 
gaudi_dma_free_coherent(struct hl_device * hdev,size_t size,void * cpu_addr,dma_addr_t dma_handle)4544e65e175bSOded Gabbay static void gaudi_dma_free_coherent(struct hl_device *hdev, size_t size,
4545e65e175bSOded Gabbay 		void *cpu_addr, dma_addr_t dma_handle)
4546e65e175bSOded Gabbay {
4547e65e175bSOded Gabbay 	/* Cancel the device's base physical address of host memory */
4548e65e175bSOded Gabbay 	dma_addr_t fixed_dma_handle = dma_handle - HOST_PHYS_BASE;
4549e65e175bSOded Gabbay 
4550e65e175bSOded Gabbay 	dma_free_coherent(&hdev->pdev->dev, size, cpu_addr, fixed_dma_handle);
4551e65e175bSOded Gabbay }
4552e65e175bSOded Gabbay 
gaudi_scrub_device_dram(struct hl_device * hdev,u64 val)4553e65e175bSOded Gabbay static int gaudi_scrub_device_dram(struct hl_device *hdev, u64 val)
4554e65e175bSOded Gabbay {
4555e65e175bSOded Gabbay 	struct asic_fixed_properties *prop = &hdev->asic_prop;
4556e65e175bSOded Gabbay 	u64 cur_addr = prop->dram_user_base_address;
4557e65e175bSOded Gabbay 	u32 chunk_size, busy;
4558e65e175bSOded Gabbay 	int rc, dma_id;
4559e65e175bSOded Gabbay 
4560e65e175bSOded Gabbay 	while (cur_addr < prop->dram_end_address) {
4561e65e175bSOded Gabbay 		for (dma_id = 0 ; dma_id < DMA_NUMBER_OF_CHANNELS ; dma_id++) {
4562e65e175bSOded Gabbay 			u32 dma_offset = dma_id * DMA_CORE_OFFSET;
4563e65e175bSOded Gabbay 
4564e65e175bSOded Gabbay 			chunk_size =
4565e65e175bSOded Gabbay 			min((u64)SZ_2G, prop->dram_end_address - cur_addr);
4566e65e175bSOded Gabbay 
4567e65e175bSOded Gabbay 			dev_dbg(hdev->dev,
4568e65e175bSOded Gabbay 				"Doing HBM scrubbing for 0x%09llx - 0x%09llx\n",
4569e65e175bSOded Gabbay 				cur_addr, cur_addr + chunk_size);
4570e65e175bSOded Gabbay 
4571e65e175bSOded Gabbay 			WREG32(mmDMA0_CORE_SRC_BASE_LO + dma_offset,
4572e65e175bSOded Gabbay 					lower_32_bits(val));
4573e65e175bSOded Gabbay 			WREG32(mmDMA0_CORE_SRC_BASE_HI + dma_offset,
4574e65e175bSOded Gabbay 					upper_32_bits(val));
4575e65e175bSOded Gabbay 			WREG32(mmDMA0_CORE_DST_BASE_LO + dma_offset,
4576e65e175bSOded Gabbay 						lower_32_bits(cur_addr));
4577e65e175bSOded Gabbay 			WREG32(mmDMA0_CORE_DST_BASE_HI + dma_offset,
4578e65e175bSOded Gabbay 						upper_32_bits(cur_addr));
4579e65e175bSOded Gabbay 			WREG32(mmDMA0_CORE_DST_TSIZE_0 + dma_offset,
4580e65e175bSOded Gabbay 					chunk_size);
4581e65e175bSOded Gabbay 			WREG32(mmDMA0_CORE_COMMIT + dma_offset,
4582e65e175bSOded Gabbay 					((1 << DMA0_CORE_COMMIT_LIN_SHIFT) |
4583e65e175bSOded Gabbay 					(1 << DMA0_CORE_COMMIT_MEM_SET_SHIFT)));
4584e65e175bSOded Gabbay 
4585e65e175bSOded Gabbay 			cur_addr += chunk_size;
4586e65e175bSOded Gabbay 
4587e65e175bSOded Gabbay 			if (cur_addr == prop->dram_end_address)
4588e65e175bSOded Gabbay 				break;
4589e65e175bSOded Gabbay 		}
4590e65e175bSOded Gabbay 
4591e65e175bSOded Gabbay 		for (dma_id = 0 ; dma_id < DMA_NUMBER_OF_CHANNELS ; dma_id++) {
4592e65e175bSOded Gabbay 			u32 dma_offset = dma_id * DMA_CORE_OFFSET;
4593e65e175bSOded Gabbay 
4594e65e175bSOded Gabbay 			rc = hl_poll_timeout(
4595e65e175bSOded Gabbay 				hdev,
4596e65e175bSOded Gabbay 				mmDMA0_CORE_STS0 + dma_offset,
4597e65e175bSOded Gabbay 				busy,
4598e65e175bSOded Gabbay 				((busy & DMA0_CORE_STS0_BUSY_MASK) == 0),
4599e65e175bSOded Gabbay 				1000,
4600e65e175bSOded Gabbay 				HBM_SCRUBBING_TIMEOUT_US);
4601e65e175bSOded Gabbay 
4602e65e175bSOded Gabbay 			if (rc) {
4603e65e175bSOded Gabbay 				dev_err(hdev->dev,
4604e65e175bSOded Gabbay 					"DMA Timeout during HBM scrubbing of DMA #%d\n",
4605e65e175bSOded Gabbay 					dma_id);
4606e65e175bSOded Gabbay 				return -EIO;
4607e65e175bSOded Gabbay 			}
4608e65e175bSOded Gabbay 		}
4609e65e175bSOded Gabbay 	}
4610e65e175bSOded Gabbay 
4611e65e175bSOded Gabbay 	return 0;
4612e65e175bSOded Gabbay }
4613e65e175bSOded Gabbay 
gaudi_scrub_device_mem(struct hl_device * hdev)4614e65e175bSOded Gabbay static int gaudi_scrub_device_mem(struct hl_device *hdev)
4615e65e175bSOded Gabbay {
4616e65e175bSOded Gabbay 	struct asic_fixed_properties *prop = &hdev->asic_prop;
46174355f2c3SOded Gabbay 	u64 wait_to_idle_time = HBM_SCRUBBING_TIMEOUT_US;
4618e65e175bSOded Gabbay 	u64 addr, size, val = hdev->memory_scrub_val;
4619e65e175bSOded Gabbay 	ktime_t timeout;
4620e65e175bSOded Gabbay 	int rc = 0;
4621e65e175bSOded Gabbay 
4622e65e175bSOded Gabbay 	if (!hdev->memory_scrub)
4623e65e175bSOded Gabbay 		return 0;
4624e65e175bSOded Gabbay 
4625e65e175bSOded Gabbay 	timeout = ktime_add_us(ktime_get(), wait_to_idle_time);
4626e65e175bSOded Gabbay 	while (!hdev->asic_funcs->is_device_idle(hdev, NULL, 0, NULL)) {
4627e65e175bSOded Gabbay 		if (ktime_compare(ktime_get(), timeout) > 0) {
4628e65e175bSOded Gabbay 			dev_err(hdev->dev, "waiting for idle timeout\n");
4629e65e175bSOded Gabbay 			return -ETIMEDOUT;
4630e65e175bSOded Gabbay 		}
4631e65e175bSOded Gabbay 		usleep_range((1000 >> 2) + 1, 1000);
4632e65e175bSOded Gabbay 	}
4633e65e175bSOded Gabbay 
4634e65e175bSOded Gabbay 	/* Scrub SRAM */
4635e65e175bSOded Gabbay 	addr = prop->sram_user_base_address;
4636e65e175bSOded Gabbay 	size = hdev->pldm ? 0x10000 : prop->sram_size - SRAM_USER_BASE_OFFSET;
4637e65e175bSOded Gabbay 
4638e65e175bSOded Gabbay 	dev_dbg(hdev->dev, "Scrubbing SRAM: 0x%09llx - 0x%09llx val: 0x%llx\n",
4639e65e175bSOded Gabbay 			addr, addr + size, val);
4640e65e175bSOded Gabbay 	rc = gaudi_memset_device_memory(hdev, addr, size, val);
4641e65e175bSOded Gabbay 	if (rc) {
4642e65e175bSOded Gabbay 		dev_err(hdev->dev, "Failed to clear SRAM (%d)\n", rc);
4643e65e175bSOded Gabbay 		return rc;
4644e65e175bSOded Gabbay 	}
4645e65e175bSOded Gabbay 
4646e65e175bSOded Gabbay 	/* Scrub HBM using all DMA channels in parallel */
4647e65e175bSOded Gabbay 	rc = gaudi_scrub_device_dram(hdev, val);
4648e65e175bSOded Gabbay 	if (rc) {
4649e65e175bSOded Gabbay 		dev_err(hdev->dev, "Failed to clear HBM (%d)\n", rc);
4650e65e175bSOded Gabbay 		return rc;
4651e65e175bSOded Gabbay 	}
4652e65e175bSOded Gabbay 
4653e65e175bSOded Gabbay 	return 0;
4654e65e175bSOded Gabbay }
4655e65e175bSOded Gabbay 
gaudi_get_int_queue_base(struct hl_device * hdev,u32 queue_id,dma_addr_t * dma_handle,u16 * queue_len)4656e65e175bSOded Gabbay static void *gaudi_get_int_queue_base(struct hl_device *hdev,
4657e65e175bSOded Gabbay 				u32 queue_id, dma_addr_t *dma_handle,
4658e65e175bSOded Gabbay 				u16 *queue_len)
4659e65e175bSOded Gabbay {
4660e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
4661e65e175bSOded Gabbay 	struct gaudi_internal_qman_info *q;
4662e65e175bSOded Gabbay 
4663e65e175bSOded Gabbay 	if (queue_id >= GAUDI_QUEUE_ID_SIZE ||
4664e65e175bSOded Gabbay 			gaudi_queue_type[queue_id] != QUEUE_TYPE_INT) {
4665e65e175bSOded Gabbay 		dev_err(hdev->dev, "Got invalid queue id %d\n", queue_id);
4666e65e175bSOded Gabbay 		return NULL;
4667e65e175bSOded Gabbay 	}
4668e65e175bSOded Gabbay 
4669e65e175bSOded Gabbay 	q = &gaudi->internal_qmans[queue_id];
4670e65e175bSOded Gabbay 	*dma_handle = q->pq_dma_addr;
4671e65e175bSOded Gabbay 	*queue_len = q->pq_size / QMAN_PQ_ENTRY_SIZE;
4672e65e175bSOded Gabbay 
4673e65e175bSOded Gabbay 	return q->pq_kernel_addr;
4674e65e175bSOded Gabbay }
4675e65e175bSOded Gabbay 
gaudi_send_cpu_message(struct hl_device * hdev,u32 * msg,u16 len,u32 timeout,u64 * result)4676e65e175bSOded Gabbay static int gaudi_send_cpu_message(struct hl_device *hdev, u32 *msg,
4677e65e175bSOded Gabbay 				u16 len, u32 timeout, u64 *result)
4678e65e175bSOded Gabbay {
4679e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
4680e65e175bSOded Gabbay 
4681e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_CPU_Q)) {
4682e65e175bSOded Gabbay 		if (result)
4683e65e175bSOded Gabbay 			*result = 0;
4684e65e175bSOded Gabbay 		return 0;
4685e65e175bSOded Gabbay 	}
4686e65e175bSOded Gabbay 
4687e65e175bSOded Gabbay 	if (!timeout)
4688e65e175bSOded Gabbay 		timeout = GAUDI_MSG_TO_CPU_TIMEOUT_USEC;
4689e65e175bSOded Gabbay 
4690e65e175bSOded Gabbay 	return hl_fw_send_cpu_message(hdev, GAUDI_QUEUE_ID_CPU_PQ, msg, len,
4691e65e175bSOded Gabbay 						timeout, result);
4692e65e175bSOded Gabbay }
4693e65e175bSOded Gabbay 
gaudi_test_queue(struct hl_device * hdev,u32 hw_queue_id)4694e65e175bSOded Gabbay static int gaudi_test_queue(struct hl_device *hdev, u32 hw_queue_id)
4695e65e175bSOded Gabbay {
4696e65e175bSOded Gabbay 	struct packet_msg_prot *fence_pkt;
4697e65e175bSOded Gabbay 	dma_addr_t pkt_dma_addr;
4698e65e175bSOded Gabbay 	u32 fence_val, tmp, timeout_usec;
4699e65e175bSOded Gabbay 	dma_addr_t fence_dma_addr;
4700e65e175bSOded Gabbay 	u32 *fence_ptr;
4701e65e175bSOded Gabbay 	int rc;
4702e65e175bSOded Gabbay 
4703e65e175bSOded Gabbay 	if (hdev->pldm)
4704e65e175bSOded Gabbay 		timeout_usec = GAUDI_PLDM_TEST_QUEUE_WAIT_USEC;
4705e65e175bSOded Gabbay 	else
4706e65e175bSOded Gabbay 		timeout_usec = GAUDI_TEST_QUEUE_WAIT_USEC;
4707e65e175bSOded Gabbay 
4708e65e175bSOded Gabbay 	fence_val = GAUDI_QMAN0_FENCE_VAL;
4709e65e175bSOded Gabbay 
4710e65e175bSOded Gabbay 	fence_ptr = hl_asic_dma_pool_zalloc(hdev, 4, GFP_KERNEL, &fence_dma_addr);
4711e65e175bSOded Gabbay 	if (!fence_ptr) {
4712e65e175bSOded Gabbay 		dev_err(hdev->dev,
4713e65e175bSOded Gabbay 			"Failed to allocate memory for H/W queue %d testing\n",
4714e65e175bSOded Gabbay 			hw_queue_id);
4715e65e175bSOded Gabbay 		return -ENOMEM;
4716e65e175bSOded Gabbay 	}
4717e65e175bSOded Gabbay 
4718e65e175bSOded Gabbay 	*fence_ptr = 0;
4719e65e175bSOded Gabbay 
4720e65e175bSOded Gabbay 	fence_pkt = hl_asic_dma_pool_zalloc(hdev, sizeof(struct packet_msg_prot), GFP_KERNEL,
4721e65e175bSOded Gabbay 						&pkt_dma_addr);
4722e65e175bSOded Gabbay 	if (!fence_pkt) {
4723e65e175bSOded Gabbay 		dev_err(hdev->dev,
4724e65e175bSOded Gabbay 			"Failed to allocate packet for H/W queue %d testing\n",
4725e65e175bSOded Gabbay 			hw_queue_id);
4726e65e175bSOded Gabbay 		rc = -ENOMEM;
4727e65e175bSOded Gabbay 		goto free_fence_ptr;
4728e65e175bSOded Gabbay 	}
4729e65e175bSOded Gabbay 
4730e65e175bSOded Gabbay 	tmp = FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_MSG_PROT);
4731e65e175bSOded Gabbay 	tmp |= FIELD_PREP(GAUDI_PKT_CTL_EB_MASK, 1);
4732e65e175bSOded Gabbay 	tmp |= FIELD_PREP(GAUDI_PKT_CTL_MB_MASK, 1);
4733e65e175bSOded Gabbay 
4734e65e175bSOded Gabbay 	fence_pkt->ctl = cpu_to_le32(tmp);
4735e65e175bSOded Gabbay 	fence_pkt->value = cpu_to_le32(fence_val);
4736e65e175bSOded Gabbay 	fence_pkt->addr = cpu_to_le64(fence_dma_addr);
4737e65e175bSOded Gabbay 
4738e65e175bSOded Gabbay 	rc = hl_hw_queue_send_cb_no_cmpl(hdev, hw_queue_id,
4739e65e175bSOded Gabbay 					sizeof(struct packet_msg_prot),
4740e65e175bSOded Gabbay 					pkt_dma_addr);
4741e65e175bSOded Gabbay 	if (rc) {
4742e65e175bSOded Gabbay 		dev_err(hdev->dev,
4743e65e175bSOded Gabbay 			"Failed to send fence packet to H/W queue %d\n",
4744e65e175bSOded Gabbay 			hw_queue_id);
4745e65e175bSOded Gabbay 		goto free_pkt;
4746e65e175bSOded Gabbay 	}
4747e65e175bSOded Gabbay 
4748e65e175bSOded Gabbay 	rc = hl_poll_timeout_memory(hdev, fence_ptr, tmp, (tmp == fence_val),
4749e65e175bSOded Gabbay 					1000, timeout_usec, true);
4750e65e175bSOded Gabbay 
4751e65e175bSOded Gabbay 	hl_hw_queue_inc_ci_kernel(hdev, hw_queue_id);
4752e65e175bSOded Gabbay 
4753e65e175bSOded Gabbay 	if (rc == -ETIMEDOUT) {
4754e65e175bSOded Gabbay 		dev_err(hdev->dev,
4755e65e175bSOded Gabbay 			"H/W queue %d test failed (scratch(0x%08llX) == 0x%08X)\n",
4756e65e175bSOded Gabbay 			hw_queue_id, (unsigned long long) fence_dma_addr, tmp);
4757e65e175bSOded Gabbay 		rc = -EIO;
4758e65e175bSOded Gabbay 	}
4759e65e175bSOded Gabbay 
4760e65e175bSOded Gabbay free_pkt:
4761e65e175bSOded Gabbay 	hl_asic_dma_pool_free(hdev, (void *) fence_pkt, pkt_dma_addr);
4762e65e175bSOded Gabbay free_fence_ptr:
4763e65e175bSOded Gabbay 	hl_asic_dma_pool_free(hdev, (void *) fence_ptr, fence_dma_addr);
4764e65e175bSOded Gabbay 	return rc;
4765e65e175bSOded Gabbay }
4766e65e175bSOded Gabbay 
gaudi_test_cpu_queue(struct hl_device * hdev)4767e65e175bSOded Gabbay static int gaudi_test_cpu_queue(struct hl_device *hdev)
4768e65e175bSOded Gabbay {
4769e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
4770e65e175bSOded Gabbay 
4771e65e175bSOded Gabbay 	/*
4772e65e175bSOded Gabbay 	 * check capability here as send_cpu_message() won't update the result
4773e65e175bSOded Gabbay 	 * value if no capability
4774e65e175bSOded Gabbay 	 */
4775e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_CPU_Q))
4776e65e175bSOded Gabbay 		return 0;
4777e65e175bSOded Gabbay 
4778e65e175bSOded Gabbay 	return hl_fw_test_cpu_queue(hdev);
4779e65e175bSOded Gabbay }
4780e65e175bSOded Gabbay 
gaudi_test_queues(struct hl_device * hdev)4781e65e175bSOded Gabbay static int gaudi_test_queues(struct hl_device *hdev)
4782e65e175bSOded Gabbay {
4783e65e175bSOded Gabbay 	int i, rc, ret_val = 0;
4784e65e175bSOded Gabbay 
4785e65e175bSOded Gabbay 	for (i = 0 ; i < hdev->asic_prop.max_queues ; i++) {
4786e65e175bSOded Gabbay 		if (hdev->asic_prop.hw_queues_props[i].type == QUEUE_TYPE_EXT) {
4787e65e175bSOded Gabbay 			rc = gaudi_test_queue(hdev, i);
4788e65e175bSOded Gabbay 			if (rc)
4789e65e175bSOded Gabbay 				ret_val = -EINVAL;
4790e65e175bSOded Gabbay 		}
4791e65e175bSOded Gabbay 	}
4792e65e175bSOded Gabbay 
4793e65e175bSOded Gabbay 	rc = gaudi_test_cpu_queue(hdev);
4794e65e175bSOded Gabbay 	if (rc)
4795e65e175bSOded Gabbay 		ret_val = -EINVAL;
4796e65e175bSOded Gabbay 
4797e65e175bSOded Gabbay 	return ret_val;
4798e65e175bSOded Gabbay }
4799e65e175bSOded Gabbay 
gaudi_dma_pool_zalloc(struct hl_device * hdev,size_t size,gfp_t mem_flags,dma_addr_t * dma_handle)4800e65e175bSOded Gabbay static void *gaudi_dma_pool_zalloc(struct hl_device *hdev, size_t size,
4801e65e175bSOded Gabbay 		gfp_t mem_flags, dma_addr_t *dma_handle)
4802e65e175bSOded Gabbay {
4803e65e175bSOded Gabbay 	void *kernel_addr;
4804e65e175bSOded Gabbay 
4805e65e175bSOded Gabbay 	if (size > GAUDI_DMA_POOL_BLK_SIZE)
4806e65e175bSOded Gabbay 		return NULL;
4807e65e175bSOded Gabbay 
4808e65e175bSOded Gabbay 	kernel_addr = dma_pool_zalloc(hdev->dma_pool, mem_flags, dma_handle);
4809e65e175bSOded Gabbay 
4810e65e175bSOded Gabbay 	/* Shift to the device's base physical address of host memory */
4811e65e175bSOded Gabbay 	if (kernel_addr)
4812e65e175bSOded Gabbay 		*dma_handle += HOST_PHYS_BASE;
4813e65e175bSOded Gabbay 
4814e65e175bSOded Gabbay 	return kernel_addr;
4815e65e175bSOded Gabbay }
4816e65e175bSOded Gabbay 
gaudi_dma_pool_free(struct hl_device * hdev,void * vaddr,dma_addr_t dma_addr)4817e65e175bSOded Gabbay static void gaudi_dma_pool_free(struct hl_device *hdev, void *vaddr,
4818e65e175bSOded Gabbay 			dma_addr_t dma_addr)
4819e65e175bSOded Gabbay {
4820e65e175bSOded Gabbay 	/* Cancel the device's base physical address of host memory */
4821e65e175bSOded Gabbay 	dma_addr_t fixed_dma_addr = dma_addr - HOST_PHYS_BASE;
4822e65e175bSOded Gabbay 
4823e65e175bSOded Gabbay 	dma_pool_free(hdev->dma_pool, vaddr, fixed_dma_addr);
4824e65e175bSOded Gabbay }
4825e65e175bSOded Gabbay 
gaudi_cpu_accessible_dma_pool_alloc(struct hl_device * hdev,size_t size,dma_addr_t * dma_handle)4826e65e175bSOded Gabbay static void *gaudi_cpu_accessible_dma_pool_alloc(struct hl_device *hdev,
4827e65e175bSOded Gabbay 					size_t size, dma_addr_t *dma_handle)
4828e65e175bSOded Gabbay {
4829e65e175bSOded Gabbay 	return hl_fw_cpu_accessible_dma_pool_alloc(hdev, size, dma_handle);
4830e65e175bSOded Gabbay }
4831e65e175bSOded Gabbay 
gaudi_cpu_accessible_dma_pool_free(struct hl_device * hdev,size_t size,void * vaddr)4832e65e175bSOded Gabbay static void gaudi_cpu_accessible_dma_pool_free(struct hl_device *hdev,
4833e65e175bSOded Gabbay 						size_t size, void *vaddr)
4834e65e175bSOded Gabbay {
4835e65e175bSOded Gabbay 	hl_fw_cpu_accessible_dma_pool_free(hdev, size, vaddr);
4836e65e175bSOded Gabbay }
4837e65e175bSOded Gabbay 
gaudi_get_dma_desc_list_size(struct hl_device * hdev,struct sg_table * sgt)4838e65e175bSOded Gabbay static u32 gaudi_get_dma_desc_list_size(struct hl_device *hdev, struct sg_table *sgt)
4839e65e175bSOded Gabbay {
4840e65e175bSOded Gabbay 	struct scatterlist *sg, *sg_next_iter;
4841e65e175bSOded Gabbay 	u32 count, dma_desc_cnt;
4842e65e175bSOded Gabbay 	u64 len, len_next;
4843e65e175bSOded Gabbay 	dma_addr_t addr, addr_next;
4844e65e175bSOded Gabbay 
4845e65e175bSOded Gabbay 	dma_desc_cnt = 0;
4846e65e175bSOded Gabbay 
4847e65e175bSOded Gabbay 	for_each_sgtable_dma_sg(sgt, sg, count) {
4848e65e175bSOded Gabbay 		len = sg_dma_len(sg);
4849e65e175bSOded Gabbay 		addr = sg_dma_address(sg);
4850e65e175bSOded Gabbay 
4851e65e175bSOded Gabbay 		if (len == 0)
4852e65e175bSOded Gabbay 			break;
4853e65e175bSOded Gabbay 
4854e65e175bSOded Gabbay 		while ((count + 1) < sgt->nents) {
4855e65e175bSOded Gabbay 			sg_next_iter = sg_next(sg);
4856e65e175bSOded Gabbay 			len_next = sg_dma_len(sg_next_iter);
4857e65e175bSOded Gabbay 			addr_next = sg_dma_address(sg_next_iter);
4858e65e175bSOded Gabbay 
4859e65e175bSOded Gabbay 			if (len_next == 0)
4860e65e175bSOded Gabbay 				break;
4861e65e175bSOded Gabbay 
4862e65e175bSOded Gabbay 			if ((addr + len == addr_next) &&
4863e65e175bSOded Gabbay 				(len + len_next <= DMA_MAX_TRANSFER_SIZE)) {
4864e65e175bSOded Gabbay 				len += len_next;
4865e65e175bSOded Gabbay 				count++;
4866e65e175bSOded Gabbay 				sg = sg_next_iter;
4867e65e175bSOded Gabbay 			} else {
4868e65e175bSOded Gabbay 				break;
4869e65e175bSOded Gabbay 			}
4870e65e175bSOded Gabbay 		}
4871e65e175bSOded Gabbay 
4872e65e175bSOded Gabbay 		dma_desc_cnt++;
4873e65e175bSOded Gabbay 	}
4874e65e175bSOded Gabbay 
4875e65e175bSOded Gabbay 	return dma_desc_cnt * sizeof(struct packet_lin_dma);
4876e65e175bSOded Gabbay }
4877e65e175bSOded Gabbay 
gaudi_pin_memory_before_cs(struct hl_device * hdev,struct hl_cs_parser * parser,struct packet_lin_dma * user_dma_pkt,u64 addr,enum dma_data_direction dir)4878e65e175bSOded Gabbay static int gaudi_pin_memory_before_cs(struct hl_device *hdev,
4879e65e175bSOded Gabbay 				struct hl_cs_parser *parser,
4880e65e175bSOded Gabbay 				struct packet_lin_dma *user_dma_pkt,
4881e65e175bSOded Gabbay 				u64 addr, enum dma_data_direction dir)
4882e65e175bSOded Gabbay {
4883e65e175bSOded Gabbay 	struct hl_userptr *userptr;
4884e65e175bSOded Gabbay 	int rc;
4885e65e175bSOded Gabbay 
4886e65e175bSOded Gabbay 	if (hl_userptr_is_pinned(hdev, addr, le32_to_cpu(user_dma_pkt->tsize),
4887e65e175bSOded Gabbay 			parser->job_userptr_list, &userptr))
4888e65e175bSOded Gabbay 		goto already_pinned;
4889e65e175bSOded Gabbay 
4890e65e175bSOded Gabbay 	userptr = kzalloc(sizeof(*userptr), GFP_KERNEL);
4891e65e175bSOded Gabbay 	if (!userptr)
4892e65e175bSOded Gabbay 		return -ENOMEM;
4893e65e175bSOded Gabbay 
4894e65e175bSOded Gabbay 	rc = hl_pin_host_memory(hdev, addr, le32_to_cpu(user_dma_pkt->tsize),
4895e65e175bSOded Gabbay 				userptr);
4896e65e175bSOded Gabbay 	if (rc)
4897e65e175bSOded Gabbay 		goto free_userptr;
4898e65e175bSOded Gabbay 
4899e65e175bSOded Gabbay 	list_add_tail(&userptr->job_node, parser->job_userptr_list);
4900e65e175bSOded Gabbay 
4901ff92d010SOhad Sharabi 	rc = hl_dma_map_sgtable(hdev, userptr->sgt, dir);
4902e65e175bSOded Gabbay 	if (rc) {
4903e65e175bSOded Gabbay 		dev_err(hdev->dev, "failed to map sgt with DMA region\n");
4904e65e175bSOded Gabbay 		goto unpin_memory;
4905e65e175bSOded Gabbay 	}
4906e65e175bSOded Gabbay 
4907e65e175bSOded Gabbay 	userptr->dma_mapped = true;
4908e65e175bSOded Gabbay 	userptr->dir = dir;
4909e65e175bSOded Gabbay 
4910e65e175bSOded Gabbay already_pinned:
4911e65e175bSOded Gabbay 	parser->patched_cb_size +=
4912e65e175bSOded Gabbay 			gaudi_get_dma_desc_list_size(hdev, userptr->sgt);
4913e65e175bSOded Gabbay 
4914e65e175bSOded Gabbay 	return 0;
4915e65e175bSOded Gabbay 
4916e65e175bSOded Gabbay unpin_memory:
4917e65e175bSOded Gabbay 	list_del(&userptr->job_node);
4918e65e175bSOded Gabbay 	hl_unpin_host_memory(hdev, userptr);
4919e65e175bSOded Gabbay free_userptr:
4920e65e175bSOded Gabbay 	kfree(userptr);
4921e65e175bSOded Gabbay 	return rc;
4922e65e175bSOded Gabbay }
4923e65e175bSOded Gabbay 
gaudi_validate_dma_pkt_host(struct hl_device * hdev,struct hl_cs_parser * parser,struct packet_lin_dma * user_dma_pkt,bool src_in_host)4924e65e175bSOded Gabbay static int gaudi_validate_dma_pkt_host(struct hl_device *hdev,
4925e65e175bSOded Gabbay 				struct hl_cs_parser *parser,
4926e65e175bSOded Gabbay 				struct packet_lin_dma *user_dma_pkt,
4927e65e175bSOded Gabbay 				bool src_in_host)
4928e65e175bSOded Gabbay {
4929e65e175bSOded Gabbay 	enum dma_data_direction dir;
4930e65e175bSOded Gabbay 	bool skip_host_mem_pin = false, user_memset;
4931e65e175bSOded Gabbay 	u64 addr;
4932e65e175bSOded Gabbay 	int rc = 0;
4933e65e175bSOded Gabbay 
4934e65e175bSOded Gabbay 	user_memset = (le32_to_cpu(user_dma_pkt->ctl) &
4935e65e175bSOded Gabbay 			GAUDI_PKT_LIN_DMA_CTL_MEMSET_MASK) >>
4936e65e175bSOded Gabbay 			GAUDI_PKT_LIN_DMA_CTL_MEMSET_SHIFT;
4937e65e175bSOded Gabbay 
4938e65e175bSOded Gabbay 	if (src_in_host) {
4939e65e175bSOded Gabbay 		if (user_memset)
4940e65e175bSOded Gabbay 			skip_host_mem_pin = true;
4941e65e175bSOded Gabbay 
4942e65e175bSOded Gabbay 		dev_dbg(hdev->dev, "DMA direction is HOST --> DEVICE\n");
4943e65e175bSOded Gabbay 		dir = DMA_TO_DEVICE;
4944e65e175bSOded Gabbay 		addr = le64_to_cpu(user_dma_pkt->src_addr);
4945e65e175bSOded Gabbay 	} else {
4946e65e175bSOded Gabbay 		dev_dbg(hdev->dev, "DMA direction is DEVICE --> HOST\n");
4947e65e175bSOded Gabbay 		dir = DMA_FROM_DEVICE;
4948e65e175bSOded Gabbay 		addr = (le64_to_cpu(user_dma_pkt->dst_addr) &
4949e65e175bSOded Gabbay 				GAUDI_PKT_LIN_DMA_DST_ADDR_MASK) >>
4950e65e175bSOded Gabbay 				GAUDI_PKT_LIN_DMA_DST_ADDR_SHIFT;
4951e65e175bSOded Gabbay 	}
4952e65e175bSOded Gabbay 
4953e65e175bSOded Gabbay 	if (skip_host_mem_pin)
4954e65e175bSOded Gabbay 		parser->patched_cb_size += sizeof(*user_dma_pkt);
4955e65e175bSOded Gabbay 	else
4956e65e175bSOded Gabbay 		rc = gaudi_pin_memory_before_cs(hdev, parser, user_dma_pkt,
4957e65e175bSOded Gabbay 						addr, dir);
4958e65e175bSOded Gabbay 
4959e65e175bSOded Gabbay 	return rc;
4960e65e175bSOded Gabbay }
4961e65e175bSOded Gabbay 
gaudi_validate_dma_pkt_no_mmu(struct hl_device * hdev,struct hl_cs_parser * parser,struct packet_lin_dma * user_dma_pkt)4962e65e175bSOded Gabbay static int gaudi_validate_dma_pkt_no_mmu(struct hl_device *hdev,
4963e65e175bSOded Gabbay 				struct hl_cs_parser *parser,
4964e65e175bSOded Gabbay 				struct packet_lin_dma *user_dma_pkt)
4965e65e175bSOded Gabbay {
4966e65e175bSOded Gabbay 	bool src_in_host = false;
4967e65e175bSOded Gabbay 	u64 dst_addr = (le64_to_cpu(user_dma_pkt->dst_addr) &
4968e65e175bSOded Gabbay 			GAUDI_PKT_LIN_DMA_DST_ADDR_MASK) >>
4969e65e175bSOded Gabbay 			GAUDI_PKT_LIN_DMA_DST_ADDR_SHIFT;
4970e65e175bSOded Gabbay 
4971e65e175bSOded Gabbay 	dev_dbg(hdev->dev, "DMA packet details:\n");
4972e65e175bSOded Gabbay 	dev_dbg(hdev->dev, "source == 0x%llx\n",
4973e65e175bSOded Gabbay 				le64_to_cpu(user_dma_pkt->src_addr));
4974e65e175bSOded Gabbay 	dev_dbg(hdev->dev, "destination == 0x%llx\n", dst_addr);
4975e65e175bSOded Gabbay 	dev_dbg(hdev->dev, "size == %u\n", le32_to_cpu(user_dma_pkt->tsize));
4976e65e175bSOded Gabbay 
4977e65e175bSOded Gabbay 	/*
4978e65e175bSOded Gabbay 	 * Special handling for DMA with size 0. Bypass all validations
4979e65e175bSOded Gabbay 	 * because no transactions will be done except for WR_COMP, which
4980e65e175bSOded Gabbay 	 * is not a security issue
4981e65e175bSOded Gabbay 	 */
4982e65e175bSOded Gabbay 	if (!le32_to_cpu(user_dma_pkt->tsize)) {
4983e65e175bSOded Gabbay 		parser->patched_cb_size += sizeof(*user_dma_pkt);
4984e65e175bSOded Gabbay 		return 0;
4985e65e175bSOded Gabbay 	}
4986e65e175bSOded Gabbay 
4987e65e175bSOded Gabbay 	if (parser->hw_queue_id <= GAUDI_QUEUE_ID_DMA_0_3)
4988e65e175bSOded Gabbay 		src_in_host = true;
4989e65e175bSOded Gabbay 
4990e65e175bSOded Gabbay 	return gaudi_validate_dma_pkt_host(hdev, parser, user_dma_pkt,
4991e65e175bSOded Gabbay 						src_in_host);
4992e65e175bSOded Gabbay }
4993e65e175bSOded Gabbay 
gaudi_validate_load_and_exe_pkt(struct hl_device * hdev,struct hl_cs_parser * parser,struct packet_load_and_exe * user_pkt)4994e65e175bSOded Gabbay static int gaudi_validate_load_and_exe_pkt(struct hl_device *hdev,
4995e65e175bSOded Gabbay 					struct hl_cs_parser *parser,
4996e65e175bSOded Gabbay 					struct packet_load_and_exe *user_pkt)
4997e65e175bSOded Gabbay {
4998e65e175bSOded Gabbay 	u32 cfg;
4999e65e175bSOded Gabbay 
5000e65e175bSOded Gabbay 	cfg = le32_to_cpu(user_pkt->cfg);
5001e65e175bSOded Gabbay 
5002e65e175bSOded Gabbay 	if (cfg & GAUDI_PKT_LOAD_AND_EXE_CFG_DST_MASK) {
5003e65e175bSOded Gabbay 		dev_err(hdev->dev,
5004e65e175bSOded Gabbay 			"User not allowed to use Load and Execute\n");
5005e65e175bSOded Gabbay 		return -EPERM;
5006e65e175bSOded Gabbay 	}
5007e65e175bSOded Gabbay 
5008e65e175bSOded Gabbay 	parser->patched_cb_size += sizeof(struct packet_load_and_exe);
5009e65e175bSOded Gabbay 
5010e65e175bSOded Gabbay 	return 0;
5011e65e175bSOded Gabbay }
5012e65e175bSOded Gabbay 
gaudi_validate_cb(struct hl_device * hdev,struct hl_cs_parser * parser,bool is_mmu)5013e65e175bSOded Gabbay static int gaudi_validate_cb(struct hl_device *hdev,
5014e65e175bSOded Gabbay 			struct hl_cs_parser *parser, bool is_mmu)
5015e65e175bSOded Gabbay {
5016e65e175bSOded Gabbay 	u32 cb_parsed_length = 0;
5017e65e175bSOded Gabbay 	int rc = 0;
5018e65e175bSOded Gabbay 
5019e65e175bSOded Gabbay 	parser->patched_cb_size = 0;
5020e65e175bSOded Gabbay 
5021e65e175bSOded Gabbay 	/* cb_user_size is more than 0 so loop will always be executed */
5022e65e175bSOded Gabbay 	while (cb_parsed_length < parser->user_cb_size) {
5023e65e175bSOded Gabbay 		enum packet_id pkt_id;
5024e65e175bSOded Gabbay 		u16 pkt_size;
5025e65e175bSOded Gabbay 		struct gaudi_packet *user_pkt;
5026e65e175bSOded Gabbay 
5027e65e175bSOded Gabbay 		user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
5028e65e175bSOded Gabbay 
5029e65e175bSOded Gabbay 		pkt_id = (enum packet_id) (
5030e65e175bSOded Gabbay 				(le64_to_cpu(user_pkt->header) &
5031e65e175bSOded Gabbay 				PACKET_HEADER_PACKET_ID_MASK) >>
5032e65e175bSOded Gabbay 					PACKET_HEADER_PACKET_ID_SHIFT);
5033e65e175bSOded Gabbay 
5034e65e175bSOded Gabbay 		if (!validate_packet_id(pkt_id)) {
5035e65e175bSOded Gabbay 			dev_err(hdev->dev, "Invalid packet id %u\n", pkt_id);
5036e65e175bSOded Gabbay 			rc = -EINVAL;
5037e65e175bSOded Gabbay 			break;
5038e65e175bSOded Gabbay 		}
5039e65e175bSOded Gabbay 
5040e65e175bSOded Gabbay 		pkt_size = gaudi_packet_sizes[pkt_id];
5041e65e175bSOded Gabbay 		cb_parsed_length += pkt_size;
5042e65e175bSOded Gabbay 		if (cb_parsed_length > parser->user_cb_size) {
5043e65e175bSOded Gabbay 			dev_err(hdev->dev,
5044e65e175bSOded Gabbay 				"packet 0x%x is out of CB boundary\n", pkt_id);
5045e65e175bSOded Gabbay 			rc = -EINVAL;
5046e65e175bSOded Gabbay 			break;
5047e65e175bSOded Gabbay 		}
5048e65e175bSOded Gabbay 
5049e65e175bSOded Gabbay 		switch (pkt_id) {
5050e65e175bSOded Gabbay 		case PACKET_MSG_PROT:
5051e65e175bSOded Gabbay 			dev_err(hdev->dev,
5052e65e175bSOded Gabbay 				"User not allowed to use MSG_PROT\n");
5053e65e175bSOded Gabbay 			rc = -EPERM;
5054e65e175bSOded Gabbay 			break;
5055e65e175bSOded Gabbay 
5056e65e175bSOded Gabbay 		case PACKET_CP_DMA:
5057e65e175bSOded Gabbay 			dev_err(hdev->dev, "User not allowed to use CP_DMA\n");
5058e65e175bSOded Gabbay 			rc = -EPERM;
5059e65e175bSOded Gabbay 			break;
5060e65e175bSOded Gabbay 
5061e65e175bSOded Gabbay 		case PACKET_STOP:
5062e65e175bSOded Gabbay 			dev_err(hdev->dev, "User not allowed to use STOP\n");
5063e65e175bSOded Gabbay 			rc = -EPERM;
5064e65e175bSOded Gabbay 			break;
5065e65e175bSOded Gabbay 
5066e65e175bSOded Gabbay 		case PACKET_WREG_BULK:
5067e65e175bSOded Gabbay 			dev_err(hdev->dev,
5068e65e175bSOded Gabbay 				"User not allowed to use WREG_BULK\n");
5069e65e175bSOded Gabbay 			rc = -EPERM;
5070e65e175bSOded Gabbay 			break;
5071e65e175bSOded Gabbay 
5072e65e175bSOded Gabbay 		case PACKET_LOAD_AND_EXE:
5073e65e175bSOded Gabbay 			rc = gaudi_validate_load_and_exe_pkt(hdev, parser,
5074e65e175bSOded Gabbay 				(struct packet_load_and_exe *) user_pkt);
5075e65e175bSOded Gabbay 			break;
5076e65e175bSOded Gabbay 
5077e65e175bSOded Gabbay 		case PACKET_LIN_DMA:
5078e65e175bSOded Gabbay 			parser->contains_dma_pkt = true;
5079e65e175bSOded Gabbay 			if (is_mmu)
5080e65e175bSOded Gabbay 				parser->patched_cb_size += pkt_size;
5081e65e175bSOded Gabbay 			else
5082e65e175bSOded Gabbay 				rc = gaudi_validate_dma_pkt_no_mmu(hdev, parser,
5083e65e175bSOded Gabbay 					(struct packet_lin_dma *) user_pkt);
5084e65e175bSOded Gabbay 			break;
5085e65e175bSOded Gabbay 
5086e65e175bSOded Gabbay 		case PACKET_WREG_32:
5087e65e175bSOded Gabbay 		case PACKET_MSG_LONG:
5088e65e175bSOded Gabbay 		case PACKET_MSG_SHORT:
5089e65e175bSOded Gabbay 		case PACKET_REPEAT:
5090e65e175bSOded Gabbay 		case PACKET_FENCE:
5091e65e175bSOded Gabbay 		case PACKET_NOP:
5092e65e175bSOded Gabbay 		case PACKET_ARB_POINT:
5093e65e175bSOded Gabbay 			parser->patched_cb_size += pkt_size;
5094e65e175bSOded Gabbay 			break;
5095e65e175bSOded Gabbay 
5096e65e175bSOded Gabbay 		default:
5097e65e175bSOded Gabbay 			dev_err(hdev->dev, "Invalid packet header 0x%x\n",
5098e65e175bSOded Gabbay 				pkt_id);
5099e65e175bSOded Gabbay 			rc = -EINVAL;
5100e65e175bSOded Gabbay 			break;
5101e65e175bSOded Gabbay 		}
5102e65e175bSOded Gabbay 
5103e65e175bSOded Gabbay 		if (rc)
5104e65e175bSOded Gabbay 			break;
5105e65e175bSOded Gabbay 	}
5106e65e175bSOded Gabbay 
5107e65e175bSOded Gabbay 	/*
5108e65e175bSOded Gabbay 	 * The new CB should have space at the end for two MSG_PROT packets:
5109e65e175bSOded Gabbay 	 * 1. Optional NOP padding for cacheline alignment
5110e65e175bSOded Gabbay 	 * 2. A packet that will act as a completion packet
5111e65e175bSOded Gabbay 	 * 3. A packet that will generate MSI interrupt
5112e65e175bSOded Gabbay 	 */
5113e65e175bSOded Gabbay 	if (parser->completion)
5114e65e175bSOded Gabbay 		parser->patched_cb_size += gaudi_get_patched_cb_extra_size(
5115e65e175bSOded Gabbay 			parser->patched_cb_size);
5116e65e175bSOded Gabbay 
5117e65e175bSOded Gabbay 	return rc;
5118e65e175bSOded Gabbay }
5119e65e175bSOded Gabbay 
gaudi_patch_dma_packet(struct hl_device * hdev,struct hl_cs_parser * parser,struct packet_lin_dma * user_dma_pkt,struct packet_lin_dma * new_dma_pkt,u32 * new_dma_pkt_size)5120e65e175bSOded Gabbay static int gaudi_patch_dma_packet(struct hl_device *hdev,
5121e65e175bSOded Gabbay 				struct hl_cs_parser *parser,
5122e65e175bSOded Gabbay 				struct packet_lin_dma *user_dma_pkt,
5123e65e175bSOded Gabbay 				struct packet_lin_dma *new_dma_pkt,
5124e65e175bSOded Gabbay 				u32 *new_dma_pkt_size)
5125e65e175bSOded Gabbay {
5126e65e175bSOded Gabbay 	struct hl_userptr *userptr;
5127e65e175bSOded Gabbay 	struct scatterlist *sg, *sg_next_iter;
5128e65e175bSOded Gabbay 	u32 count, dma_desc_cnt, user_wrcomp_en_mask, ctl;
5129e65e175bSOded Gabbay 	u64 len, len_next;
5130e65e175bSOded Gabbay 	dma_addr_t dma_addr, dma_addr_next;
5131e65e175bSOded Gabbay 	u64 device_memory_addr, addr;
5132e65e175bSOded Gabbay 	enum dma_data_direction dir;
5133e65e175bSOded Gabbay 	struct sg_table *sgt;
5134e65e175bSOded Gabbay 	bool src_in_host = false;
5135e65e175bSOded Gabbay 	bool skip_host_mem_pin = false;
5136e65e175bSOded Gabbay 	bool user_memset;
5137e65e175bSOded Gabbay 
5138e65e175bSOded Gabbay 	ctl = le32_to_cpu(user_dma_pkt->ctl);
5139e65e175bSOded Gabbay 
5140e65e175bSOded Gabbay 	if (parser->hw_queue_id <= GAUDI_QUEUE_ID_DMA_0_3)
5141e65e175bSOded Gabbay 		src_in_host = true;
5142e65e175bSOded Gabbay 
5143e65e175bSOded Gabbay 	user_memset = (ctl & GAUDI_PKT_LIN_DMA_CTL_MEMSET_MASK) >>
5144e65e175bSOded Gabbay 			GAUDI_PKT_LIN_DMA_CTL_MEMSET_SHIFT;
5145e65e175bSOded Gabbay 
5146e65e175bSOded Gabbay 	if (src_in_host) {
5147e65e175bSOded Gabbay 		addr = le64_to_cpu(user_dma_pkt->src_addr);
5148e65e175bSOded Gabbay 		device_memory_addr = le64_to_cpu(user_dma_pkt->dst_addr);
5149e65e175bSOded Gabbay 		dir = DMA_TO_DEVICE;
5150e65e175bSOded Gabbay 		if (user_memset)
5151e65e175bSOded Gabbay 			skip_host_mem_pin = true;
5152e65e175bSOded Gabbay 	} else {
5153e65e175bSOded Gabbay 		addr = le64_to_cpu(user_dma_pkt->dst_addr);
5154e65e175bSOded Gabbay 		device_memory_addr = le64_to_cpu(user_dma_pkt->src_addr);
5155e65e175bSOded Gabbay 		dir = DMA_FROM_DEVICE;
5156e65e175bSOded Gabbay 	}
5157e65e175bSOded Gabbay 
5158e65e175bSOded Gabbay 	if ((!skip_host_mem_pin) &&
5159e65e175bSOded Gabbay 		(!hl_userptr_is_pinned(hdev, addr,
5160e65e175bSOded Gabbay 					le32_to_cpu(user_dma_pkt->tsize),
5161e65e175bSOded Gabbay 					parser->job_userptr_list, &userptr))) {
5162e65e175bSOded Gabbay 		dev_err(hdev->dev, "Userptr 0x%llx + 0x%x NOT mapped\n",
5163e65e175bSOded Gabbay 				addr, user_dma_pkt->tsize);
5164e65e175bSOded Gabbay 		return -EFAULT;
5165e65e175bSOded Gabbay 	}
5166e65e175bSOded Gabbay 
5167e65e175bSOded Gabbay 	if ((user_memset) && (dir == DMA_TO_DEVICE)) {
5168e65e175bSOded Gabbay 		memcpy(new_dma_pkt, user_dma_pkt, sizeof(*user_dma_pkt));
5169e65e175bSOded Gabbay 		*new_dma_pkt_size = sizeof(*user_dma_pkt);
5170e65e175bSOded Gabbay 		return 0;
5171e65e175bSOded Gabbay 	}
5172e65e175bSOded Gabbay 
5173e65e175bSOded Gabbay 	user_wrcomp_en_mask = ctl & GAUDI_PKT_LIN_DMA_CTL_WRCOMP_EN_MASK;
5174e65e175bSOded Gabbay 
5175e65e175bSOded Gabbay 	sgt = userptr->sgt;
5176e65e175bSOded Gabbay 	dma_desc_cnt = 0;
5177e65e175bSOded Gabbay 
5178e65e175bSOded Gabbay 	for_each_sgtable_dma_sg(sgt, sg, count) {
5179e65e175bSOded Gabbay 		len = sg_dma_len(sg);
5180e65e175bSOded Gabbay 		dma_addr = sg_dma_address(sg);
5181e65e175bSOded Gabbay 
5182e65e175bSOded Gabbay 		if (len == 0)
5183e65e175bSOded Gabbay 			break;
5184e65e175bSOded Gabbay 
5185e65e175bSOded Gabbay 		while ((count + 1) < sgt->nents) {
5186e65e175bSOded Gabbay 			sg_next_iter = sg_next(sg);
5187e65e175bSOded Gabbay 			len_next = sg_dma_len(sg_next_iter);
5188e65e175bSOded Gabbay 			dma_addr_next = sg_dma_address(sg_next_iter);
5189e65e175bSOded Gabbay 
5190e65e175bSOded Gabbay 			if (len_next == 0)
5191e65e175bSOded Gabbay 				break;
5192e65e175bSOded Gabbay 
5193e65e175bSOded Gabbay 			if ((dma_addr + len == dma_addr_next) &&
5194e65e175bSOded Gabbay 				(len + len_next <= DMA_MAX_TRANSFER_SIZE)) {
5195e65e175bSOded Gabbay 				len += len_next;
5196e65e175bSOded Gabbay 				count++;
5197e65e175bSOded Gabbay 				sg = sg_next_iter;
5198e65e175bSOded Gabbay 			} else {
5199e65e175bSOded Gabbay 				break;
5200e65e175bSOded Gabbay 			}
5201e65e175bSOded Gabbay 		}
5202e65e175bSOded Gabbay 
5203e65e175bSOded Gabbay 		ctl = le32_to_cpu(user_dma_pkt->ctl);
5204e65e175bSOded Gabbay 		if (likely(dma_desc_cnt))
5205e65e175bSOded Gabbay 			ctl &= ~GAUDI_PKT_CTL_EB_MASK;
5206e65e175bSOded Gabbay 		ctl &= ~GAUDI_PKT_LIN_DMA_CTL_WRCOMP_EN_MASK;
5207e65e175bSOded Gabbay 		new_dma_pkt->ctl = cpu_to_le32(ctl);
5208e65e175bSOded Gabbay 		new_dma_pkt->tsize = cpu_to_le32(len);
5209e65e175bSOded Gabbay 
5210e65e175bSOded Gabbay 		if (dir == DMA_TO_DEVICE) {
5211e65e175bSOded Gabbay 			new_dma_pkt->src_addr = cpu_to_le64(dma_addr);
5212e65e175bSOded Gabbay 			new_dma_pkt->dst_addr = cpu_to_le64(device_memory_addr);
5213e65e175bSOded Gabbay 		} else {
5214e65e175bSOded Gabbay 			new_dma_pkt->src_addr = cpu_to_le64(device_memory_addr);
5215e65e175bSOded Gabbay 			new_dma_pkt->dst_addr = cpu_to_le64(dma_addr);
5216e65e175bSOded Gabbay 		}
5217e65e175bSOded Gabbay 
5218e65e175bSOded Gabbay 		if (!user_memset)
5219e65e175bSOded Gabbay 			device_memory_addr += len;
5220e65e175bSOded Gabbay 		dma_desc_cnt++;
5221e65e175bSOded Gabbay 		new_dma_pkt++;
5222e65e175bSOded Gabbay 	}
5223e65e175bSOded Gabbay 
5224e65e175bSOded Gabbay 	if (!dma_desc_cnt) {
5225e65e175bSOded Gabbay 		dev_err(hdev->dev,
5226e65e175bSOded Gabbay 			"Error of 0 SG entries when patching DMA packet\n");
5227e65e175bSOded Gabbay 		return -EFAULT;
5228e65e175bSOded Gabbay 	}
5229e65e175bSOded Gabbay 
5230e65e175bSOded Gabbay 	/* Fix the last dma packet - wrcomp must be as user set it */
5231e65e175bSOded Gabbay 	new_dma_pkt--;
5232e65e175bSOded Gabbay 	new_dma_pkt->ctl |= cpu_to_le32(user_wrcomp_en_mask);
5233e65e175bSOded Gabbay 
5234e65e175bSOded Gabbay 	*new_dma_pkt_size = dma_desc_cnt * sizeof(struct packet_lin_dma);
5235e65e175bSOded Gabbay 
5236e65e175bSOded Gabbay 	return 0;
5237e65e175bSOded Gabbay }
5238e65e175bSOded Gabbay 
gaudi_patch_cb(struct hl_device * hdev,struct hl_cs_parser * parser)5239e65e175bSOded Gabbay static int gaudi_patch_cb(struct hl_device *hdev,
5240e65e175bSOded Gabbay 				struct hl_cs_parser *parser)
5241e65e175bSOded Gabbay {
5242e65e175bSOded Gabbay 	u32 cb_parsed_length = 0;
5243e65e175bSOded Gabbay 	u32 cb_patched_cur_length = 0;
5244e65e175bSOded Gabbay 	int rc = 0;
5245e65e175bSOded Gabbay 
5246e65e175bSOded Gabbay 	/* cb_user_size is more than 0 so loop will always be executed */
5247e65e175bSOded Gabbay 	while (cb_parsed_length < parser->user_cb_size) {
5248e65e175bSOded Gabbay 		enum packet_id pkt_id;
5249e65e175bSOded Gabbay 		u16 pkt_size;
5250e65e175bSOded Gabbay 		u32 new_pkt_size = 0;
5251e65e175bSOded Gabbay 		struct gaudi_packet *user_pkt, *kernel_pkt;
5252e65e175bSOded Gabbay 
5253e65e175bSOded Gabbay 		user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
5254e65e175bSOded Gabbay 		kernel_pkt = parser->patched_cb->kernel_address +
5255e65e175bSOded Gabbay 					cb_patched_cur_length;
5256e65e175bSOded Gabbay 
5257e65e175bSOded Gabbay 		pkt_id = (enum packet_id) (
5258e65e175bSOded Gabbay 				(le64_to_cpu(user_pkt->header) &
5259e65e175bSOded Gabbay 				PACKET_HEADER_PACKET_ID_MASK) >>
5260e65e175bSOded Gabbay 					PACKET_HEADER_PACKET_ID_SHIFT);
5261e65e175bSOded Gabbay 
5262e65e175bSOded Gabbay 		if (!validate_packet_id(pkt_id)) {
5263e65e175bSOded Gabbay 			dev_err(hdev->dev, "Invalid packet id %u\n", pkt_id);
5264e65e175bSOded Gabbay 			rc = -EINVAL;
5265e65e175bSOded Gabbay 			break;
5266e65e175bSOded Gabbay 		}
5267e65e175bSOded Gabbay 
5268e65e175bSOded Gabbay 		pkt_size = gaudi_packet_sizes[pkt_id];
5269e65e175bSOded Gabbay 		cb_parsed_length += pkt_size;
5270e65e175bSOded Gabbay 		if (cb_parsed_length > parser->user_cb_size) {
5271e65e175bSOded Gabbay 			dev_err(hdev->dev,
5272e65e175bSOded Gabbay 				"packet 0x%x is out of CB boundary\n", pkt_id);
5273e65e175bSOded Gabbay 			rc = -EINVAL;
5274e65e175bSOded Gabbay 			break;
5275e65e175bSOded Gabbay 		}
5276e65e175bSOded Gabbay 
5277e65e175bSOded Gabbay 		switch (pkt_id) {
5278e65e175bSOded Gabbay 		case PACKET_LIN_DMA:
5279e65e175bSOded Gabbay 			rc = gaudi_patch_dma_packet(hdev, parser,
5280e65e175bSOded Gabbay 					(struct packet_lin_dma *) user_pkt,
5281e65e175bSOded Gabbay 					(struct packet_lin_dma *) kernel_pkt,
5282e65e175bSOded Gabbay 					&new_pkt_size);
5283e65e175bSOded Gabbay 			cb_patched_cur_length += new_pkt_size;
5284e65e175bSOded Gabbay 			break;
5285e65e175bSOded Gabbay 
5286e65e175bSOded Gabbay 		case PACKET_MSG_PROT:
5287e65e175bSOded Gabbay 			dev_err(hdev->dev,
5288e65e175bSOded Gabbay 				"User not allowed to use MSG_PROT\n");
5289e65e175bSOded Gabbay 			rc = -EPERM;
5290e65e175bSOded Gabbay 			break;
5291e65e175bSOded Gabbay 
5292e65e175bSOded Gabbay 		case PACKET_CP_DMA:
5293e65e175bSOded Gabbay 			dev_err(hdev->dev, "User not allowed to use CP_DMA\n");
5294e65e175bSOded Gabbay 			rc = -EPERM;
5295e65e175bSOded Gabbay 			break;
5296e65e175bSOded Gabbay 
5297e65e175bSOded Gabbay 		case PACKET_STOP:
5298e65e175bSOded Gabbay 			dev_err(hdev->dev, "User not allowed to use STOP\n");
5299e65e175bSOded Gabbay 			rc = -EPERM;
5300e65e175bSOded Gabbay 			break;
5301e65e175bSOded Gabbay 
5302e65e175bSOded Gabbay 		case PACKET_WREG_32:
5303e65e175bSOded Gabbay 		case PACKET_WREG_BULK:
5304e65e175bSOded Gabbay 		case PACKET_MSG_LONG:
5305e65e175bSOded Gabbay 		case PACKET_MSG_SHORT:
5306e65e175bSOded Gabbay 		case PACKET_REPEAT:
5307e65e175bSOded Gabbay 		case PACKET_FENCE:
5308e65e175bSOded Gabbay 		case PACKET_NOP:
5309e65e175bSOded Gabbay 		case PACKET_ARB_POINT:
5310e65e175bSOded Gabbay 		case PACKET_LOAD_AND_EXE:
5311e65e175bSOded Gabbay 			memcpy(kernel_pkt, user_pkt, pkt_size);
5312e65e175bSOded Gabbay 			cb_patched_cur_length += pkt_size;
5313e65e175bSOded Gabbay 			break;
5314e65e175bSOded Gabbay 
5315e65e175bSOded Gabbay 		default:
5316e65e175bSOded Gabbay 			dev_err(hdev->dev, "Invalid packet header 0x%x\n",
5317e65e175bSOded Gabbay 				pkt_id);
5318e65e175bSOded Gabbay 			rc = -EINVAL;
5319e65e175bSOded Gabbay 			break;
5320e65e175bSOded Gabbay 		}
5321e65e175bSOded Gabbay 
5322e65e175bSOded Gabbay 		if (rc)
5323e65e175bSOded Gabbay 			break;
5324e65e175bSOded Gabbay 	}
5325e65e175bSOded Gabbay 
5326e65e175bSOded Gabbay 	return rc;
5327e65e175bSOded Gabbay }
5328e65e175bSOded Gabbay 
gaudi_parse_cb_mmu(struct hl_device * hdev,struct hl_cs_parser * parser)5329e65e175bSOded Gabbay static int gaudi_parse_cb_mmu(struct hl_device *hdev,
5330e65e175bSOded Gabbay 		struct hl_cs_parser *parser)
5331e65e175bSOded Gabbay {
5332e65e175bSOded Gabbay 	u64 handle;
5333e65e175bSOded Gabbay 	u32 patched_cb_size;
5334e65e175bSOded Gabbay 	struct hl_cb *user_cb;
5335e65e175bSOded Gabbay 	int rc;
5336e65e175bSOded Gabbay 
5337e65e175bSOded Gabbay 	/*
5338e65e175bSOded Gabbay 	 * The new CB should have space at the end for two MSG_PROT packets:
5339e65e175bSOded Gabbay 	 * 1. Optional NOP padding for cacheline alignment
5340e65e175bSOded Gabbay 	 * 2. A packet that will act as a completion packet
5341e65e175bSOded Gabbay 	 * 3. A packet that will generate MSI interrupt
5342e65e175bSOded Gabbay 	 */
5343e65e175bSOded Gabbay 	if (parser->completion)
5344e65e175bSOded Gabbay 		parser->patched_cb_size = parser->user_cb_size +
5345e65e175bSOded Gabbay 				gaudi_get_patched_cb_extra_size(parser->user_cb_size);
5346e65e175bSOded Gabbay 	else
5347e65e175bSOded Gabbay 		parser->patched_cb_size = parser->user_cb_size;
5348e65e175bSOded Gabbay 
5349e65e175bSOded Gabbay 	rc = hl_cb_create(hdev, &hdev->kernel_mem_mgr, hdev->kernel_ctx,
5350e65e175bSOded Gabbay 				parser->patched_cb_size, false, false,
5351e65e175bSOded Gabbay 				&handle);
5352e65e175bSOded Gabbay 
5353e65e175bSOded Gabbay 	if (rc) {
5354e65e175bSOded Gabbay 		dev_err(hdev->dev,
5355e65e175bSOded Gabbay 			"Failed to allocate patched CB for DMA CS %d\n",
5356e65e175bSOded Gabbay 			rc);
5357e65e175bSOded Gabbay 		return rc;
5358e65e175bSOded Gabbay 	}
5359e65e175bSOded Gabbay 
5360e65e175bSOded Gabbay 	parser->patched_cb = hl_cb_get(&hdev->kernel_mem_mgr, handle);
5361e65e175bSOded Gabbay 	/* hl_cb_get should never fail */
5362e65e175bSOded Gabbay 	if (!parser->patched_cb) {
5363e65e175bSOded Gabbay 		dev_crit(hdev->dev, "DMA CB handle invalid 0x%llx\n", handle);
5364e65e175bSOded Gabbay 		rc = -EFAULT;
5365e65e175bSOded Gabbay 		goto out;
5366e65e175bSOded Gabbay 	}
5367e65e175bSOded Gabbay 
5368e65e175bSOded Gabbay 	/*
5369e65e175bSOded Gabbay 	 * We are protected from overflow because the check
5370e65e175bSOded Gabbay 	 * "parser->user_cb_size <= parser->user_cb->size" was done in get_cb_from_cs_chunk()
5371e65e175bSOded Gabbay 	 * in the common code. That check is done only if is_kernel_allocated_cb is true.
5372e65e175bSOded Gabbay 	 *
5373e65e175bSOded Gabbay 	 * There is no option to reach here without going through that check because:
5374e65e175bSOded Gabbay 	 * 1. validate_queue_index() assigns true to is_kernel_allocated_cb for any submission to
5375e65e175bSOded Gabbay 	 *    an external queue.
5376e65e175bSOded Gabbay 	 * 2. For Gaudi, we only parse CBs that were submitted to the external queues.
5377e65e175bSOded Gabbay 	 */
5378e65e175bSOded Gabbay 	memcpy(parser->patched_cb->kernel_address,
5379e65e175bSOded Gabbay 		parser->user_cb->kernel_address,
5380e65e175bSOded Gabbay 		parser->user_cb_size);
5381e65e175bSOded Gabbay 
5382e65e175bSOded Gabbay 	patched_cb_size = parser->patched_cb_size;
5383e65e175bSOded Gabbay 
5384e65e175bSOded Gabbay 	/* Validate patched CB instead of user CB */
5385e65e175bSOded Gabbay 	user_cb = parser->user_cb;
5386e65e175bSOded Gabbay 	parser->user_cb = parser->patched_cb;
5387e65e175bSOded Gabbay 	rc = gaudi_validate_cb(hdev, parser, true);
5388e65e175bSOded Gabbay 	parser->user_cb = user_cb;
5389e65e175bSOded Gabbay 
5390e65e175bSOded Gabbay 	if (rc) {
5391e65e175bSOded Gabbay 		hl_cb_put(parser->patched_cb);
5392e65e175bSOded Gabbay 		goto out;
5393e65e175bSOded Gabbay 	}
5394e65e175bSOded Gabbay 
5395e65e175bSOded Gabbay 	if (patched_cb_size != parser->patched_cb_size) {
5396e65e175bSOded Gabbay 		dev_err(hdev->dev, "user CB size mismatch\n");
5397e65e175bSOded Gabbay 		hl_cb_put(parser->patched_cb);
5398e65e175bSOded Gabbay 		rc = -EINVAL;
5399e65e175bSOded Gabbay 		goto out;
5400e65e175bSOded Gabbay 	}
5401e65e175bSOded Gabbay 
5402e65e175bSOded Gabbay out:
5403e65e175bSOded Gabbay 	/*
5404e65e175bSOded Gabbay 	 * Always call cb destroy here because we still have 1 reference
5405e65e175bSOded Gabbay 	 * to it by calling cb_get earlier. After the job will be completed,
5406e65e175bSOded Gabbay 	 * cb_put will release it, but here we want to remove it from the
5407e65e175bSOded Gabbay 	 * idr
5408e65e175bSOded Gabbay 	 */
5409e65e175bSOded Gabbay 	hl_cb_destroy(&hdev->kernel_mem_mgr, handle);
5410e65e175bSOded Gabbay 
5411e65e175bSOded Gabbay 	return rc;
5412e65e175bSOded Gabbay }
5413e65e175bSOded Gabbay 
gaudi_parse_cb_no_mmu(struct hl_device * hdev,struct hl_cs_parser * parser)5414e65e175bSOded Gabbay static int gaudi_parse_cb_no_mmu(struct hl_device *hdev,
5415e65e175bSOded Gabbay 		struct hl_cs_parser *parser)
5416e65e175bSOded Gabbay {
5417e65e175bSOded Gabbay 	u64 handle;
5418e65e175bSOded Gabbay 	int rc;
5419e65e175bSOded Gabbay 
5420e65e175bSOded Gabbay 	rc = gaudi_validate_cb(hdev, parser, false);
5421e65e175bSOded Gabbay 
5422e65e175bSOded Gabbay 	if (rc)
5423e65e175bSOded Gabbay 		goto free_userptr;
5424e65e175bSOded Gabbay 
5425e65e175bSOded Gabbay 	rc = hl_cb_create(hdev, &hdev->kernel_mem_mgr, hdev->kernel_ctx,
5426e65e175bSOded Gabbay 				parser->patched_cb_size, false, false,
5427e65e175bSOded Gabbay 				&handle);
5428e65e175bSOded Gabbay 	if (rc) {
5429e65e175bSOded Gabbay 		dev_err(hdev->dev,
5430e65e175bSOded Gabbay 			"Failed to allocate patched CB for DMA CS %d\n", rc);
5431e65e175bSOded Gabbay 		goto free_userptr;
5432e65e175bSOded Gabbay 	}
5433e65e175bSOded Gabbay 
5434e65e175bSOded Gabbay 	parser->patched_cb = hl_cb_get(&hdev->kernel_mem_mgr, handle);
5435e65e175bSOded Gabbay 	/* hl_cb_get should never fail here */
5436e65e175bSOded Gabbay 	if (!parser->patched_cb) {
5437e65e175bSOded Gabbay 		dev_crit(hdev->dev, "DMA CB handle invalid 0x%llx\n", handle);
5438e65e175bSOded Gabbay 		rc = -EFAULT;
5439e65e175bSOded Gabbay 		goto out;
5440e65e175bSOded Gabbay 	}
5441e65e175bSOded Gabbay 
5442e65e175bSOded Gabbay 	rc = gaudi_patch_cb(hdev, parser);
5443e65e175bSOded Gabbay 
5444e65e175bSOded Gabbay 	if (rc)
5445e65e175bSOded Gabbay 		hl_cb_put(parser->patched_cb);
5446e65e175bSOded Gabbay 
5447e65e175bSOded Gabbay out:
5448e65e175bSOded Gabbay 	/*
5449e65e175bSOded Gabbay 	 * Always call cb destroy here because we still have 1 reference
5450e65e175bSOded Gabbay 	 * to it by calling cb_get earlier. After the job will be completed,
5451e65e175bSOded Gabbay 	 * cb_put will release it, but here we want to remove it from the
5452e65e175bSOded Gabbay 	 * idr
5453e65e175bSOded Gabbay 	 */
5454e65e175bSOded Gabbay 	hl_cb_destroy(&hdev->kernel_mem_mgr, handle);
5455e65e175bSOded Gabbay 
5456e65e175bSOded Gabbay free_userptr:
5457e65e175bSOded Gabbay 	if (rc)
5458e65e175bSOded Gabbay 		hl_userptr_delete_list(hdev, parser->job_userptr_list);
5459e65e175bSOded Gabbay 	return rc;
5460e65e175bSOded Gabbay }
5461e65e175bSOded Gabbay 
gaudi_parse_cb_no_ext_queue(struct hl_device * hdev,struct hl_cs_parser * parser)5462e65e175bSOded Gabbay static int gaudi_parse_cb_no_ext_queue(struct hl_device *hdev,
5463e65e175bSOded Gabbay 					struct hl_cs_parser *parser)
5464e65e175bSOded Gabbay {
5465e65e175bSOded Gabbay 	struct asic_fixed_properties *asic_prop = &hdev->asic_prop;
5466e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
5467e65e175bSOded Gabbay 	u32 nic_queue_offset, nic_mask_q_id;
5468e65e175bSOded Gabbay 
5469e65e175bSOded Gabbay 	if ((parser->hw_queue_id >= GAUDI_QUEUE_ID_NIC_0_0) &&
5470e65e175bSOded Gabbay 			(parser->hw_queue_id <= GAUDI_QUEUE_ID_NIC_9_3)) {
5471e65e175bSOded Gabbay 		nic_queue_offset = parser->hw_queue_id - GAUDI_QUEUE_ID_NIC_0_0;
5472e65e175bSOded Gabbay 		nic_mask_q_id = 1 << (HW_CAP_NIC_SHIFT + (nic_queue_offset >> 2));
5473e65e175bSOded Gabbay 
5474e65e175bSOded Gabbay 		if (!(gaudi->hw_cap_initialized & nic_mask_q_id)) {
5475e65e175bSOded Gabbay 			dev_err(hdev->dev, "h/w queue %d is disabled\n", parser->hw_queue_id);
5476e65e175bSOded Gabbay 			return -EINVAL;
5477e65e175bSOded Gabbay 		}
5478e65e175bSOded Gabbay 	}
5479e65e175bSOded Gabbay 
5480e65e175bSOded Gabbay 	/* For internal queue jobs just check if CB address is valid */
5481e65e175bSOded Gabbay 	if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,
5482e65e175bSOded Gabbay 					parser->user_cb_size,
5483e65e175bSOded Gabbay 					asic_prop->sram_user_base_address,
5484e65e175bSOded Gabbay 					asic_prop->sram_end_address))
5485e65e175bSOded Gabbay 		return 0;
5486e65e175bSOded Gabbay 
5487e65e175bSOded Gabbay 	if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,
5488e65e175bSOded Gabbay 					parser->user_cb_size,
5489e65e175bSOded Gabbay 					asic_prop->dram_user_base_address,
5490e65e175bSOded Gabbay 					asic_prop->dram_end_address))
5491e65e175bSOded Gabbay 		return 0;
5492e65e175bSOded Gabbay 
5493e65e175bSOded Gabbay 	/* PMMU and HPMMU addresses are equal, check only one of them */
5494e65e175bSOded Gabbay 	if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,
5495e65e175bSOded Gabbay 					parser->user_cb_size,
5496e65e175bSOded Gabbay 					asic_prop->pmmu.start_addr,
5497e65e175bSOded Gabbay 					asic_prop->pmmu.end_addr))
5498e65e175bSOded Gabbay 		return 0;
5499e65e175bSOded Gabbay 
5500e65e175bSOded Gabbay 	dev_err(hdev->dev,
5501e65e175bSOded Gabbay 		"CB address 0x%px + 0x%x for internal QMAN is not valid\n",
5502e65e175bSOded Gabbay 		parser->user_cb, parser->user_cb_size);
5503e65e175bSOded Gabbay 
5504e65e175bSOded Gabbay 	return -EFAULT;
5505e65e175bSOded Gabbay }
5506e65e175bSOded Gabbay 
gaudi_cs_parser(struct hl_device * hdev,struct hl_cs_parser * parser)5507e65e175bSOded Gabbay static int gaudi_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser)
5508e65e175bSOded Gabbay {
5509e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
5510e65e175bSOded Gabbay 
5511e65e175bSOded Gabbay 	if (parser->queue_type == QUEUE_TYPE_INT)
5512e65e175bSOded Gabbay 		return gaudi_parse_cb_no_ext_queue(hdev, parser);
5513e65e175bSOded Gabbay 
5514e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_MMU)
5515e65e175bSOded Gabbay 		return gaudi_parse_cb_mmu(hdev, parser);
5516e65e175bSOded Gabbay 	else
5517e65e175bSOded Gabbay 		return gaudi_parse_cb_no_mmu(hdev, parser);
5518e65e175bSOded Gabbay }
5519e65e175bSOded Gabbay 
gaudi_add_end_of_cb_packets(struct hl_device * hdev,void * kernel_address,u32 len,u32 original_len,u64 cq_addr,u32 cq_val,u32 msi_vec,bool eb)5520e65e175bSOded Gabbay static void gaudi_add_end_of_cb_packets(struct hl_device *hdev, void *kernel_address,
5521e65e175bSOded Gabbay 				u32 len, u32 original_len, u64 cq_addr, u32 cq_val,
5522e65e175bSOded Gabbay 				u32 msi_vec, bool eb)
5523e65e175bSOded Gabbay {
5524e65e175bSOded Gabbay 	struct packet_msg_prot *cq_pkt;
5525e65e175bSOded Gabbay 	struct packet_nop *cq_padding;
5526e65e175bSOded Gabbay 	u64 msi_addr;
5527e65e175bSOded Gabbay 	u32 tmp;
5528e65e175bSOded Gabbay 
5529e65e175bSOded Gabbay 	cq_padding = kernel_address + original_len;
5530e65e175bSOded Gabbay 	cq_pkt = kernel_address + len - (sizeof(struct packet_msg_prot) * 2);
5531e65e175bSOded Gabbay 
5532e65e175bSOded Gabbay 	while ((void *)cq_padding < (void *)cq_pkt) {
5533e65e175bSOded Gabbay 		cq_padding->ctl = cpu_to_le32(FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_NOP));
5534e65e175bSOded Gabbay 		cq_padding++;
5535e65e175bSOded Gabbay 	}
5536e65e175bSOded Gabbay 
5537e65e175bSOded Gabbay 	tmp = FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_MSG_PROT);
5538e65e175bSOded Gabbay 	tmp |= FIELD_PREP(GAUDI_PKT_CTL_MB_MASK, 1);
5539e65e175bSOded Gabbay 
5540e65e175bSOded Gabbay 	if (eb)
5541e65e175bSOded Gabbay 		tmp |= FIELD_PREP(GAUDI_PKT_CTL_EB_MASK, 1);
5542e65e175bSOded Gabbay 
5543e65e175bSOded Gabbay 	cq_pkt->ctl = cpu_to_le32(tmp);
5544e65e175bSOded Gabbay 	cq_pkt->value = cpu_to_le32(cq_val);
5545e65e175bSOded Gabbay 	cq_pkt->addr = cpu_to_le64(cq_addr);
5546e65e175bSOded Gabbay 
5547e65e175bSOded Gabbay 	cq_pkt++;
5548e65e175bSOded Gabbay 
5549e65e175bSOded Gabbay 	tmp = FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_MSG_PROT);
5550e65e175bSOded Gabbay 	tmp |= FIELD_PREP(GAUDI_PKT_CTL_MB_MASK, 1);
5551e65e175bSOded Gabbay 	cq_pkt->ctl = cpu_to_le32(tmp);
5552e65e175bSOded Gabbay 	cq_pkt->value = cpu_to_le32(1);
5553b207e166SOfir Bitton 	msi_addr = hdev->pdev ? mmPCIE_CORE_MSI_REQ : mmPCIE_MSI_INTR_0 + msi_vec * 4;
5554e65e175bSOded Gabbay 	cq_pkt->addr = cpu_to_le64(CFG_BASE + msi_addr);
5555e65e175bSOded Gabbay }
5556e65e175bSOded Gabbay 
gaudi_update_eq_ci(struct hl_device * hdev,u32 val)5557e65e175bSOded Gabbay static void gaudi_update_eq_ci(struct hl_device *hdev, u32 val)
5558e65e175bSOded Gabbay {
5559e65e175bSOded Gabbay 	WREG32(mmCPU_IF_EQ_RD_OFFS, val);
5560e65e175bSOded Gabbay }
5561e65e175bSOded Gabbay 
gaudi_memset_device_memory(struct hl_device * hdev,u64 addr,u32 size,u64 val)5562e65e175bSOded Gabbay static int gaudi_memset_device_memory(struct hl_device *hdev, u64 addr,
5563e65e175bSOded Gabbay 					u32 size, u64 val)
5564e65e175bSOded Gabbay {
5565e65e175bSOded Gabbay 	struct packet_lin_dma *lin_dma_pkt;
5566e65e175bSOded Gabbay 	struct hl_cs_job *job;
5567e65e175bSOded Gabbay 	u32 cb_size, ctl, err_cause;
5568e65e175bSOded Gabbay 	struct hl_cb *cb;
5569e65e175bSOded Gabbay 	int rc;
5570e65e175bSOded Gabbay 
5571e65e175bSOded Gabbay 	cb = hl_cb_kernel_create(hdev, PAGE_SIZE, false);
5572e65e175bSOded Gabbay 	if (!cb)
5573e65e175bSOded Gabbay 		return -EFAULT;
5574e65e175bSOded Gabbay 
5575e65e175bSOded Gabbay 	lin_dma_pkt = cb->kernel_address;
5576e65e175bSOded Gabbay 	memset(lin_dma_pkt, 0, sizeof(*lin_dma_pkt));
5577e65e175bSOded Gabbay 	cb_size = sizeof(*lin_dma_pkt);
5578e65e175bSOded Gabbay 
5579e65e175bSOded Gabbay 	ctl = FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_LIN_DMA);
5580e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_LIN_DMA_CTL_MEMSET_MASK, 1);
5581e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_LIN_DMA_CTL_LIN_MASK, 1);
5582e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_MB_MASK, 1);
5583e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_RB_MASK, 1);
5584e65e175bSOded Gabbay 
5585e65e175bSOded Gabbay 	lin_dma_pkt->ctl = cpu_to_le32(ctl);
5586e65e175bSOded Gabbay 	lin_dma_pkt->src_addr = cpu_to_le64(val);
5587e65e175bSOded Gabbay 	lin_dma_pkt->dst_addr |= cpu_to_le64(addr);
5588e65e175bSOded Gabbay 	lin_dma_pkt->tsize = cpu_to_le32(size);
5589e65e175bSOded Gabbay 
5590e65e175bSOded Gabbay 	job = hl_cs_allocate_job(hdev, QUEUE_TYPE_EXT, true);
5591e65e175bSOded Gabbay 	if (!job) {
5592e65e175bSOded Gabbay 		dev_err(hdev->dev, "Failed to allocate a new job\n");
5593e65e175bSOded Gabbay 		rc = -ENOMEM;
5594e65e175bSOded Gabbay 		goto release_cb;
5595e65e175bSOded Gabbay 	}
5596e65e175bSOded Gabbay 
5597e65e175bSOded Gabbay 	/* Verify DMA is OK */
5598e65e175bSOded Gabbay 	err_cause = RREG32(mmDMA0_CORE_ERR_CAUSE);
5599e65e175bSOded Gabbay 	if (err_cause && !hdev->init_done) {
5600e65e175bSOded Gabbay 		dev_dbg(hdev->dev,
5601e65e175bSOded Gabbay 			"Clearing DMA0 engine from errors (cause 0x%x)\n",
5602e65e175bSOded Gabbay 			err_cause);
5603e65e175bSOded Gabbay 		WREG32(mmDMA0_CORE_ERR_CAUSE, err_cause);
5604e65e175bSOded Gabbay 	}
5605e65e175bSOded Gabbay 
5606e65e175bSOded Gabbay 	job->id = 0;
5607e65e175bSOded Gabbay 	job->user_cb = cb;
5608e65e175bSOded Gabbay 	atomic_inc(&job->user_cb->cs_cnt);
5609e65e175bSOded Gabbay 	job->user_cb_size = cb_size;
5610e65e175bSOded Gabbay 	job->hw_queue_id = GAUDI_QUEUE_ID_DMA_0_0;
5611e65e175bSOded Gabbay 	job->patched_cb = job->user_cb;
5612e65e175bSOded Gabbay 	job->job_cb_size = job->user_cb_size + sizeof(struct packet_msg_prot);
5613e65e175bSOded Gabbay 
5614e65e175bSOded Gabbay 	hl_debugfs_add_job(hdev, job);
5615e65e175bSOded Gabbay 
5616e65e175bSOded Gabbay 	rc = gaudi_send_job_on_qman0(hdev, job);
5617e65e175bSOded Gabbay 	hl_debugfs_remove_job(hdev, job);
5618e65e175bSOded Gabbay 	kfree(job);
5619e65e175bSOded Gabbay 	atomic_dec(&cb->cs_cnt);
5620e65e175bSOded Gabbay 
5621e65e175bSOded Gabbay 	/* Verify DMA is OK */
5622e65e175bSOded Gabbay 	err_cause = RREG32(mmDMA0_CORE_ERR_CAUSE);
5623e65e175bSOded Gabbay 	if (err_cause) {
5624e65e175bSOded Gabbay 		dev_err(hdev->dev, "DMA Failed, cause 0x%x\n", err_cause);
5625e65e175bSOded Gabbay 		rc = -EIO;
5626e65e175bSOded Gabbay 		if (!hdev->init_done) {
5627e65e175bSOded Gabbay 			dev_dbg(hdev->dev,
5628e65e175bSOded Gabbay 				"Clearing DMA0 engine from errors (cause 0x%x)\n",
5629e65e175bSOded Gabbay 				err_cause);
5630e65e175bSOded Gabbay 			WREG32(mmDMA0_CORE_ERR_CAUSE, err_cause);
5631e65e175bSOded Gabbay 		}
5632e65e175bSOded Gabbay 	}
5633e65e175bSOded Gabbay 
5634e65e175bSOded Gabbay release_cb:
5635e65e175bSOded Gabbay 	hl_cb_put(cb);
5636e65e175bSOded Gabbay 	hl_cb_destroy(&hdev->kernel_mem_mgr, cb->buf->handle);
5637e65e175bSOded Gabbay 
5638e65e175bSOded Gabbay 	return rc;
5639e65e175bSOded Gabbay }
5640e65e175bSOded Gabbay 
gaudi_memset_registers(struct hl_device * hdev,u64 reg_base,u32 num_regs,u32 val)5641e65e175bSOded Gabbay static int gaudi_memset_registers(struct hl_device *hdev, u64 reg_base,
5642e65e175bSOded Gabbay 					u32 num_regs, u32 val)
5643e65e175bSOded Gabbay {
5644e65e175bSOded Gabbay 	struct packet_msg_long *pkt;
5645e65e175bSOded Gabbay 	struct hl_cs_job *job;
5646e65e175bSOded Gabbay 	u32 cb_size, ctl;
5647e65e175bSOded Gabbay 	struct hl_cb *cb;
5648e65e175bSOded Gabbay 	int i, rc;
5649e65e175bSOded Gabbay 
5650e65e175bSOded Gabbay 	cb_size = (sizeof(*pkt) * num_regs) + sizeof(struct packet_msg_prot);
5651e65e175bSOded Gabbay 
5652e65e175bSOded Gabbay 	if (cb_size > SZ_2M) {
5653e65e175bSOded Gabbay 		dev_err(hdev->dev, "CB size must be smaller than %uMB", SZ_2M);
5654e65e175bSOded Gabbay 		return -ENOMEM;
5655e65e175bSOded Gabbay 	}
5656e65e175bSOded Gabbay 
5657e65e175bSOded Gabbay 	cb = hl_cb_kernel_create(hdev, cb_size, false);
5658e65e175bSOded Gabbay 	if (!cb)
5659e65e175bSOded Gabbay 		return -EFAULT;
5660e65e175bSOded Gabbay 
5661e65e175bSOded Gabbay 	pkt = cb->kernel_address;
5662e65e175bSOded Gabbay 
5663e65e175bSOded Gabbay 	ctl = FIELD_PREP(GAUDI_PKT_LONG_CTL_OP_MASK, 0); /* write the value */
5664e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_MSG_LONG);
5665e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_EB_MASK, 1);
5666e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_RB_MASK, 1);
5667e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_MB_MASK, 1);
5668e65e175bSOded Gabbay 
5669e65e175bSOded Gabbay 	for (i = 0; i < num_regs ; i++, pkt++) {
5670e65e175bSOded Gabbay 		pkt->ctl = cpu_to_le32(ctl);
5671e65e175bSOded Gabbay 		pkt->value = cpu_to_le32(val);
5672e65e175bSOded Gabbay 		pkt->addr = cpu_to_le64(reg_base + (i * 4));
5673e65e175bSOded Gabbay 	}
5674e65e175bSOded Gabbay 
5675e65e175bSOded Gabbay 	job = hl_cs_allocate_job(hdev, QUEUE_TYPE_EXT, true);
5676e65e175bSOded Gabbay 	if (!job) {
5677e65e175bSOded Gabbay 		dev_err(hdev->dev, "Failed to allocate a new job\n");
5678e65e175bSOded Gabbay 		rc = -ENOMEM;
5679e65e175bSOded Gabbay 		goto release_cb;
5680e65e175bSOded Gabbay 	}
5681e65e175bSOded Gabbay 
5682e65e175bSOded Gabbay 	job->id = 0;
5683e65e175bSOded Gabbay 	job->user_cb = cb;
5684e65e175bSOded Gabbay 	atomic_inc(&job->user_cb->cs_cnt);
5685e65e175bSOded Gabbay 	job->user_cb_size = cb_size;
5686e65e175bSOded Gabbay 	job->hw_queue_id = GAUDI_QUEUE_ID_DMA_0_0;
5687e65e175bSOded Gabbay 	job->patched_cb = job->user_cb;
5688e65e175bSOded Gabbay 	job->job_cb_size = cb_size;
5689e65e175bSOded Gabbay 
5690e65e175bSOded Gabbay 	hl_debugfs_add_job(hdev, job);
5691e65e175bSOded Gabbay 
5692e65e175bSOded Gabbay 	rc = gaudi_send_job_on_qman0(hdev, job);
5693e65e175bSOded Gabbay 	hl_debugfs_remove_job(hdev, job);
5694e65e175bSOded Gabbay 	kfree(job);
5695e65e175bSOded Gabbay 	atomic_dec(&cb->cs_cnt);
5696e65e175bSOded Gabbay 
5697e65e175bSOded Gabbay release_cb:
5698e65e175bSOded Gabbay 	hl_cb_put(cb);
5699e65e175bSOded Gabbay 	hl_cb_destroy(&hdev->kernel_mem_mgr, cb->buf->handle);
5700e65e175bSOded Gabbay 
5701e65e175bSOded Gabbay 	return rc;
5702e65e175bSOded Gabbay }
5703e65e175bSOded Gabbay 
gaudi_restore_sm_registers(struct hl_device * hdev)5704e65e175bSOded Gabbay static int gaudi_restore_sm_registers(struct hl_device *hdev)
5705e65e175bSOded Gabbay {
5706e65e175bSOded Gabbay 	u64 base_addr;
5707e65e175bSOded Gabbay 	u32 num_regs;
5708e65e175bSOded Gabbay 	int rc;
5709e65e175bSOded Gabbay 
5710e65e175bSOded Gabbay 	base_addr = CFG_BASE + mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0;
5711e65e175bSOded Gabbay 	num_regs = NUM_OF_SOB_IN_BLOCK;
5712e65e175bSOded Gabbay 	rc = gaudi_memset_registers(hdev, base_addr, num_regs, 0);
5713e65e175bSOded Gabbay 	if (rc) {
5714e65e175bSOded Gabbay 		dev_err(hdev->dev, "failed resetting SM registers");
5715e65e175bSOded Gabbay 		return -ENOMEM;
5716e65e175bSOded Gabbay 	}
5717e65e175bSOded Gabbay 
5718e65e175bSOded Gabbay 	base_addr = CFG_BASE +  mmSYNC_MNGR_E_S_SYNC_MNGR_OBJS_SOB_OBJ_0;
5719e65e175bSOded Gabbay 	num_regs = NUM_OF_SOB_IN_BLOCK;
5720e65e175bSOded Gabbay 	rc = gaudi_memset_registers(hdev, base_addr, num_regs, 0);
5721e65e175bSOded Gabbay 	if (rc) {
5722e65e175bSOded Gabbay 		dev_err(hdev->dev, "failed resetting SM registers");
5723e65e175bSOded Gabbay 		return -ENOMEM;
5724e65e175bSOded Gabbay 	}
5725e65e175bSOded Gabbay 
5726e65e175bSOded Gabbay 	base_addr = CFG_BASE +  mmSYNC_MNGR_W_N_SYNC_MNGR_OBJS_SOB_OBJ_0;
5727e65e175bSOded Gabbay 	num_regs = NUM_OF_SOB_IN_BLOCK;
5728e65e175bSOded Gabbay 	rc = gaudi_memset_registers(hdev, base_addr, num_regs, 0);
5729e65e175bSOded Gabbay 	if (rc) {
5730e65e175bSOded Gabbay 		dev_err(hdev->dev, "failed resetting SM registers");
5731e65e175bSOded Gabbay 		return -ENOMEM;
5732e65e175bSOded Gabbay 	}
5733e65e175bSOded Gabbay 
5734e65e175bSOded Gabbay 	base_addr = CFG_BASE +  mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_MON_STATUS_0;
5735e65e175bSOded Gabbay 	num_regs = NUM_OF_MONITORS_IN_BLOCK;
5736e65e175bSOded Gabbay 	rc = gaudi_memset_registers(hdev, base_addr, num_regs, 0);
5737e65e175bSOded Gabbay 	if (rc) {
5738e65e175bSOded Gabbay 		dev_err(hdev->dev, "failed resetting SM registers");
5739e65e175bSOded Gabbay 		return -ENOMEM;
5740e65e175bSOded Gabbay 	}
5741e65e175bSOded Gabbay 
5742e65e175bSOded Gabbay 	base_addr = CFG_BASE +  mmSYNC_MNGR_E_S_SYNC_MNGR_OBJS_MON_STATUS_0;
5743e65e175bSOded Gabbay 	num_regs = NUM_OF_MONITORS_IN_BLOCK;
5744e65e175bSOded Gabbay 	rc = gaudi_memset_registers(hdev, base_addr, num_regs, 0);
5745e65e175bSOded Gabbay 	if (rc) {
5746e65e175bSOded Gabbay 		dev_err(hdev->dev, "failed resetting SM registers");
5747e65e175bSOded Gabbay 		return -ENOMEM;
5748e65e175bSOded Gabbay 	}
5749e65e175bSOded Gabbay 
5750e65e175bSOded Gabbay 	base_addr = CFG_BASE +  mmSYNC_MNGR_W_N_SYNC_MNGR_OBJS_MON_STATUS_0;
5751e65e175bSOded Gabbay 	num_regs = NUM_OF_MONITORS_IN_BLOCK;
5752e65e175bSOded Gabbay 	rc = gaudi_memset_registers(hdev, base_addr, num_regs, 0);
5753e65e175bSOded Gabbay 	if (rc) {
5754e65e175bSOded Gabbay 		dev_err(hdev->dev, "failed resetting SM registers");
5755e65e175bSOded Gabbay 		return -ENOMEM;
5756e65e175bSOded Gabbay 	}
5757e65e175bSOded Gabbay 
5758e65e175bSOded Gabbay 	base_addr = CFG_BASE +  mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_SOB_OBJ_0 +
5759e65e175bSOded Gabbay 			(GAUDI_FIRST_AVAILABLE_W_S_SYNC_OBJECT * 4);
5760e65e175bSOded Gabbay 	num_regs = NUM_OF_SOB_IN_BLOCK - GAUDI_FIRST_AVAILABLE_W_S_SYNC_OBJECT;
5761e65e175bSOded Gabbay 	rc = gaudi_memset_registers(hdev, base_addr, num_regs, 0);
5762e65e175bSOded Gabbay 	if (rc) {
5763e65e175bSOded Gabbay 		dev_err(hdev->dev, "failed resetting SM registers");
5764e65e175bSOded Gabbay 		return -ENOMEM;
5765e65e175bSOded Gabbay 	}
5766e65e175bSOded Gabbay 
5767e65e175bSOded Gabbay 	base_addr = CFG_BASE +  mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_STATUS_0 +
5768e65e175bSOded Gabbay 			(GAUDI_FIRST_AVAILABLE_W_S_MONITOR * 4);
5769e65e175bSOded Gabbay 	num_regs = NUM_OF_MONITORS_IN_BLOCK - GAUDI_FIRST_AVAILABLE_W_S_MONITOR;
5770e65e175bSOded Gabbay 	rc = gaudi_memset_registers(hdev, base_addr, num_regs, 0);
5771e65e175bSOded Gabbay 	if (rc) {
5772e65e175bSOded Gabbay 		dev_err(hdev->dev, "failed resetting SM registers");
5773e65e175bSOded Gabbay 		return -ENOMEM;
5774e65e175bSOded Gabbay 	}
5775e65e175bSOded Gabbay 
5776e65e175bSOded Gabbay 	return 0;
5777e65e175bSOded Gabbay }
5778e65e175bSOded Gabbay 
gaudi_restore_dma_registers(struct hl_device * hdev)5779e65e175bSOded Gabbay static void gaudi_restore_dma_registers(struct hl_device *hdev)
5780e65e175bSOded Gabbay {
5781e65e175bSOded Gabbay 	u32 sob_delta = mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_1 -
5782e65e175bSOded Gabbay 			mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0;
5783e65e175bSOded Gabbay 	int i;
5784e65e175bSOded Gabbay 
5785e65e175bSOded Gabbay 	for (i = 0 ; i < DMA_NUMBER_OF_CHANNELS ; i++) {
5786e65e175bSOded Gabbay 		u64 sob_addr = CFG_BASE +
5787e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0 +
5788e65e175bSOded Gabbay 				(i * sob_delta);
5789e65e175bSOded Gabbay 		u32 dma_offset = i * DMA_CORE_OFFSET;
5790e65e175bSOded Gabbay 
5791e65e175bSOded Gabbay 		WREG32(mmDMA0_CORE_WR_COMP_ADDR_LO + dma_offset,
5792e65e175bSOded Gabbay 				lower_32_bits(sob_addr));
5793e65e175bSOded Gabbay 		WREG32(mmDMA0_CORE_WR_COMP_ADDR_HI + dma_offset,
5794e65e175bSOded Gabbay 				upper_32_bits(sob_addr));
5795e65e175bSOded Gabbay 		WREG32(mmDMA0_CORE_WR_COMP_WDATA + dma_offset, 0x80000001);
5796e65e175bSOded Gabbay 
5797e65e175bSOded Gabbay 		/* For DMAs 2-7, need to restore WR_AWUSER_31_11 as it can be
5798e65e175bSOded Gabbay 		 * modified by the user for SRAM reduction
5799e65e175bSOded Gabbay 		 */
5800e65e175bSOded Gabbay 		if (i > 1)
5801e65e175bSOded Gabbay 			WREG32(mmDMA0_CORE_WR_AWUSER_31_11 + dma_offset,
5802e65e175bSOded Gabbay 								0x00000001);
5803e65e175bSOded Gabbay 	}
5804e65e175bSOded Gabbay }
5805e65e175bSOded Gabbay 
gaudi_restore_qm_registers(struct hl_device * hdev)5806e65e175bSOded Gabbay static void gaudi_restore_qm_registers(struct hl_device *hdev)
5807e65e175bSOded Gabbay {
5808e65e175bSOded Gabbay 	u32 qman_offset;
5809e65e175bSOded Gabbay 	int i;
5810e65e175bSOded Gabbay 
5811e65e175bSOded Gabbay 	for (i = 0 ; i < DMA_NUMBER_OF_CHANNELS ; i++) {
5812e65e175bSOded Gabbay 		qman_offset = i * DMA_QMAN_OFFSET;
5813e65e175bSOded Gabbay 		WREG32(mmDMA0_QM_ARB_CFG_0 + qman_offset, 0);
5814e65e175bSOded Gabbay 	}
5815e65e175bSOded Gabbay 
5816e65e175bSOded Gabbay 	for (i = 0 ; i < MME_NUMBER_OF_MASTER_ENGINES ; i++) {
5817e65e175bSOded Gabbay 		qman_offset = i * (mmMME2_QM_BASE - mmMME0_QM_BASE);
5818e65e175bSOded Gabbay 		WREG32(mmMME0_QM_ARB_CFG_0 + qman_offset, 0);
5819e65e175bSOded Gabbay 	}
5820e65e175bSOded Gabbay 
5821e65e175bSOded Gabbay 	for (i = 0 ; i < TPC_NUMBER_OF_ENGINES ; i++) {
5822e65e175bSOded Gabbay 		qman_offset = i * TPC_QMAN_OFFSET;
5823e65e175bSOded Gabbay 		WREG32(mmTPC0_QM_ARB_CFG_0 + qman_offset, 0);
5824e65e175bSOded Gabbay 	}
5825e65e175bSOded Gabbay 
5826e65e175bSOded Gabbay 	for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++) {
5827e65e175bSOded Gabbay 		qman_offset = (i >> 1) * NIC_MACRO_QMAN_OFFSET +
5828e65e175bSOded Gabbay 				(i & 0x1) * NIC_ENGINE_QMAN_OFFSET;
5829e65e175bSOded Gabbay 		WREG32(mmNIC0_QM0_ARB_CFG_0 + qman_offset, 0);
5830e65e175bSOded Gabbay 	}
5831e65e175bSOded Gabbay }
5832e65e175bSOded Gabbay 
gaudi_restore_user_registers(struct hl_device * hdev)5833e65e175bSOded Gabbay static int gaudi_restore_user_registers(struct hl_device *hdev)
5834e65e175bSOded Gabbay {
5835e65e175bSOded Gabbay 	int rc;
5836e65e175bSOded Gabbay 
5837e65e175bSOded Gabbay 	rc = gaudi_restore_sm_registers(hdev);
5838e65e175bSOded Gabbay 	if (rc)
5839e65e175bSOded Gabbay 		return rc;
5840e65e175bSOded Gabbay 
5841e65e175bSOded Gabbay 	gaudi_restore_dma_registers(hdev);
5842e65e175bSOded Gabbay 	gaudi_restore_qm_registers(hdev);
5843e65e175bSOded Gabbay 
5844e65e175bSOded Gabbay 	return 0;
5845e65e175bSOded Gabbay }
5846e65e175bSOded Gabbay 
gaudi_context_switch(struct hl_device * hdev,u32 asid)5847e65e175bSOded Gabbay static int gaudi_context_switch(struct hl_device *hdev, u32 asid)
5848e65e175bSOded Gabbay {
5849e65e175bSOded Gabbay 	return 0;
5850e65e175bSOded Gabbay }
5851e65e175bSOded Gabbay 
gaudi_mmu_clear_pgt_range(struct hl_device * hdev)5852e65e175bSOded Gabbay static int gaudi_mmu_clear_pgt_range(struct hl_device *hdev)
5853e65e175bSOded Gabbay {
5854e65e175bSOded Gabbay 	u32 size = hdev->asic_prop.mmu_pgt_size +
5855e65e175bSOded Gabbay 			hdev->asic_prop.mmu_cache_mng_size;
5856e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
5857e65e175bSOded Gabbay 	u64 addr = hdev->asic_prop.mmu_pgt_addr;
5858e65e175bSOded Gabbay 
5859e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_MMU))
5860e65e175bSOded Gabbay 		return 0;
5861e65e175bSOded Gabbay 
5862e65e175bSOded Gabbay 	return gaudi_memset_device_memory(hdev, addr, size, 0);
5863e65e175bSOded Gabbay }
5864e65e175bSOded Gabbay 
gaudi_restore_phase_topology(struct hl_device * hdev)5865e65e175bSOded Gabbay static void gaudi_restore_phase_topology(struct hl_device *hdev)
5866e65e175bSOded Gabbay {
5867e65e175bSOded Gabbay 
5868e65e175bSOded Gabbay }
5869e65e175bSOded Gabbay 
gaudi_dma_core_transfer(struct hl_device * hdev,int dma_id,u64 addr,u32 size_to_dma,dma_addr_t dma_addr)5870e65e175bSOded Gabbay static int gaudi_dma_core_transfer(struct hl_device *hdev, int dma_id, u64 addr,
5871e65e175bSOded Gabbay 					u32 size_to_dma, dma_addr_t dma_addr)
5872e65e175bSOded Gabbay {
5873e65e175bSOded Gabbay 	u32 err_cause, val;
5874e65e175bSOded Gabbay 	u64 dma_offset;
5875e65e175bSOded Gabbay 	int rc;
5876e65e175bSOded Gabbay 
5877e65e175bSOded Gabbay 	dma_offset = dma_id * DMA_CORE_OFFSET;
5878e65e175bSOded Gabbay 
5879e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_SRC_BASE_LO + dma_offset, lower_32_bits(addr));
5880e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_SRC_BASE_HI + dma_offset, upper_32_bits(addr));
5881e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_DST_BASE_LO + dma_offset, lower_32_bits(dma_addr));
5882e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_DST_BASE_HI + dma_offset, upper_32_bits(dma_addr));
5883e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_DST_TSIZE_0 + dma_offset, size_to_dma);
5884e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_COMMIT + dma_offset,
5885e65e175bSOded Gabbay 			(1 << DMA0_CORE_COMMIT_LIN_SHIFT));
5886e65e175bSOded Gabbay 
5887e65e175bSOded Gabbay 	rc = hl_poll_timeout(
5888e65e175bSOded Gabbay 		hdev,
5889e65e175bSOded Gabbay 		mmDMA0_CORE_STS0 + dma_offset,
5890e65e175bSOded Gabbay 		val,
5891e65e175bSOded Gabbay 		((val & DMA0_CORE_STS0_BUSY_MASK) == 0),
5892e65e175bSOded Gabbay 		0,
5893e65e175bSOded Gabbay 		1000000);
5894e65e175bSOded Gabbay 
5895e65e175bSOded Gabbay 	if (rc) {
5896e65e175bSOded Gabbay 		dev_err(hdev->dev,
5897e65e175bSOded Gabbay 			"DMA %d timed-out during reading of 0x%llx\n",
5898e65e175bSOded Gabbay 			dma_id, addr);
5899e65e175bSOded Gabbay 		return -EIO;
5900e65e175bSOded Gabbay 	}
5901e65e175bSOded Gabbay 
5902e65e175bSOded Gabbay 	/* Verify DMA is OK */
5903e65e175bSOded Gabbay 	err_cause = RREG32(mmDMA0_CORE_ERR_CAUSE + dma_offset);
5904e65e175bSOded Gabbay 	if (err_cause) {
5905e65e175bSOded Gabbay 		dev_err(hdev->dev, "DMA Failed, cause 0x%x\n", err_cause);
5906e65e175bSOded Gabbay 		dev_dbg(hdev->dev,
5907e65e175bSOded Gabbay 			"Clearing DMA0 engine from errors (cause 0x%x)\n",
5908e65e175bSOded Gabbay 			err_cause);
5909e65e175bSOded Gabbay 		WREG32(mmDMA0_CORE_ERR_CAUSE + dma_offset, err_cause);
5910e65e175bSOded Gabbay 
5911e65e175bSOded Gabbay 		return -EIO;
5912e65e175bSOded Gabbay 	}
5913e65e175bSOded Gabbay 
5914e65e175bSOded Gabbay 	return 0;
5915e65e175bSOded Gabbay }
5916e65e175bSOded Gabbay 
gaudi_debugfs_read_dma(struct hl_device * hdev,u64 addr,u32 size,void * blob_addr)5917e65e175bSOded Gabbay static int gaudi_debugfs_read_dma(struct hl_device *hdev, u64 addr, u32 size,
5918e65e175bSOded Gabbay 				void *blob_addr)
5919e65e175bSOded Gabbay {
5920e65e175bSOded Gabbay 	u32 dma_core_sts0, err_cause, cfg1, size_left, pos, size_to_dma;
5921e65e175bSOded Gabbay 	u32 qm_glbl_sts0, qm_cgm_sts;
5922e65e175bSOded Gabbay 	u64 dma_offset, qm_offset;
5923e65e175bSOded Gabbay 	dma_addr_t dma_addr;
5924e65e175bSOded Gabbay 	void *kernel_addr;
5925e65e175bSOded Gabbay 	bool is_eng_idle;
5926e65e175bSOded Gabbay 	int rc = 0, dma_id;
5927e65e175bSOded Gabbay 
5928e65e175bSOded Gabbay 	kernel_addr = hl_asic_dma_alloc_coherent(hdev, SZ_2M, &dma_addr, GFP_KERNEL | __GFP_ZERO);
5929e65e175bSOded Gabbay 
5930e65e175bSOded Gabbay 	if (!kernel_addr)
5931e65e175bSOded Gabbay 		return -ENOMEM;
5932e65e175bSOded Gabbay 
5933e65e175bSOded Gabbay 	hdev->asic_funcs->hw_queues_lock(hdev);
5934e65e175bSOded Gabbay 
5935e65e175bSOded Gabbay 	dma_id = gaudi_dma_assignment[GAUDI_PCI_DMA_1];
5936e65e175bSOded Gabbay 	dma_offset = dma_id * DMA_CORE_OFFSET;
5937e65e175bSOded Gabbay 	qm_offset = dma_id * DMA_QMAN_OFFSET;
5938e65e175bSOded Gabbay 	dma_core_sts0 = RREG32(mmDMA0_CORE_STS0 + dma_offset);
5939e65e175bSOded Gabbay 	qm_glbl_sts0 = RREG32(mmDMA0_QM_GLBL_STS0 + qm_offset);
5940e65e175bSOded Gabbay 	qm_cgm_sts = RREG32(mmDMA0_QM_CGM_STS + qm_offset);
5941e65e175bSOded Gabbay 	is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_cgm_sts) &&
5942e65e175bSOded Gabbay 		      IS_DMA_IDLE(dma_core_sts0);
5943e65e175bSOded Gabbay 
5944e65e175bSOded Gabbay 	if (!is_eng_idle) {
5945e65e175bSOded Gabbay 		dma_id = gaudi_dma_assignment[GAUDI_PCI_DMA_2];
5946e65e175bSOded Gabbay 		dma_offset = dma_id * DMA_CORE_OFFSET;
5947e65e175bSOded Gabbay 		qm_offset = dma_id * DMA_QMAN_OFFSET;
5948e65e175bSOded Gabbay 		dma_core_sts0 = RREG32(mmDMA0_CORE_STS0 + dma_offset);
5949e65e175bSOded Gabbay 		qm_glbl_sts0 = RREG32(mmDMA0_QM_GLBL_STS0 + qm_offset);
5950e65e175bSOded Gabbay 		qm_cgm_sts = RREG32(mmDMA0_QM_CGM_STS + qm_offset);
5951e65e175bSOded Gabbay 		is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_cgm_sts) &&
5952e65e175bSOded Gabbay 			      IS_DMA_IDLE(dma_core_sts0);
5953e65e175bSOded Gabbay 
5954e65e175bSOded Gabbay 		if (!is_eng_idle) {
5955e65e175bSOded Gabbay 			dev_err_ratelimited(hdev->dev,
5956e65e175bSOded Gabbay 				"Can't read via DMA because it is BUSY\n");
5957e65e175bSOded Gabbay 			rc = -EAGAIN;
5958e65e175bSOded Gabbay 			goto out;
5959e65e175bSOded Gabbay 		}
5960e65e175bSOded Gabbay 	}
5961e65e175bSOded Gabbay 
5962e65e175bSOded Gabbay 	cfg1 = RREG32(mmDMA0_QM_GLBL_CFG1 + qm_offset);
5963e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_GLBL_CFG1 + qm_offset,
5964e65e175bSOded Gabbay 			0xF << DMA0_QM_GLBL_CFG1_CP_STOP_SHIFT);
5965e65e175bSOded Gabbay 
5966e65e175bSOded Gabbay 	/* TODO: remove this by mapping the DMA temporary buffer to the MMU
5967e65e175bSOded Gabbay 	 * using the compute ctx ASID, if exists. If not, use the kernel ctx
5968e65e175bSOded Gabbay 	 * ASID
5969e65e175bSOded Gabbay 	 */
5970e65e175bSOded Gabbay 	WREG32_OR(mmDMA0_CORE_PROT + dma_offset, BIT(DMA0_CORE_PROT_VAL_SHIFT));
5971e65e175bSOded Gabbay 
5972e65e175bSOded Gabbay 	/* Verify DMA is OK */
5973e65e175bSOded Gabbay 	err_cause = RREG32(mmDMA0_CORE_ERR_CAUSE + dma_offset);
5974e65e175bSOded Gabbay 	if (err_cause) {
5975e65e175bSOded Gabbay 		dev_dbg(hdev->dev,
5976e65e175bSOded Gabbay 			"Clearing DMA0 engine from errors (cause 0x%x)\n",
5977e65e175bSOded Gabbay 			err_cause);
5978e65e175bSOded Gabbay 		WREG32(mmDMA0_CORE_ERR_CAUSE + dma_offset, err_cause);
5979e65e175bSOded Gabbay 	}
5980e65e175bSOded Gabbay 
5981e65e175bSOded Gabbay 	pos = 0;
5982e65e175bSOded Gabbay 	size_left = size;
5983e65e175bSOded Gabbay 	size_to_dma = SZ_2M;
5984e65e175bSOded Gabbay 
5985e65e175bSOded Gabbay 	while (size_left > 0) {
5986e65e175bSOded Gabbay 
5987e65e175bSOded Gabbay 		if (size_left < SZ_2M)
5988e65e175bSOded Gabbay 			size_to_dma = size_left;
5989e65e175bSOded Gabbay 
5990e65e175bSOded Gabbay 		rc = gaudi_dma_core_transfer(hdev, dma_id, addr, size_to_dma,
5991e65e175bSOded Gabbay 						dma_addr);
5992e65e175bSOded Gabbay 		if (rc)
5993e65e175bSOded Gabbay 			break;
5994e65e175bSOded Gabbay 
5995e65e175bSOded Gabbay 		memcpy(blob_addr + pos, kernel_addr, size_to_dma);
5996e65e175bSOded Gabbay 
5997e65e175bSOded Gabbay 		if (size_left <= SZ_2M)
5998e65e175bSOded Gabbay 			break;
5999e65e175bSOded Gabbay 
6000e65e175bSOded Gabbay 		pos += SZ_2M;
6001e65e175bSOded Gabbay 		addr += SZ_2M;
6002e65e175bSOded Gabbay 		size_left -= SZ_2M;
6003e65e175bSOded Gabbay 	}
6004e65e175bSOded Gabbay 
6005e65e175bSOded Gabbay 	/* TODO: remove this by mapping the DMA temporary buffer to the MMU
6006e65e175bSOded Gabbay 	 * using the compute ctx ASID, if exists. If not, use the kernel ctx
6007e65e175bSOded Gabbay 	 * ASID
6008e65e175bSOded Gabbay 	 */
6009e65e175bSOded Gabbay 	WREG32_AND(mmDMA0_CORE_PROT + dma_offset,
6010e65e175bSOded Gabbay 			~BIT(DMA0_CORE_PROT_VAL_SHIFT));
6011e65e175bSOded Gabbay 
6012e65e175bSOded Gabbay 	WREG32(mmDMA0_QM_GLBL_CFG1 + qm_offset, cfg1);
6013e65e175bSOded Gabbay 
6014e65e175bSOded Gabbay out:
6015e65e175bSOded Gabbay 	hdev->asic_funcs->hw_queues_unlock(hdev);
6016e65e175bSOded Gabbay 
6017e65e175bSOded Gabbay 	hl_asic_dma_free_coherent(hdev, SZ_2M, kernel_addr, dma_addr);
6018e65e175bSOded Gabbay 
6019e65e175bSOded Gabbay 	return rc;
6020e65e175bSOded Gabbay }
6021e65e175bSOded Gabbay 
gaudi_read_pte(struct hl_device * hdev,u64 addr)6022e65e175bSOded Gabbay static u64 gaudi_read_pte(struct hl_device *hdev, u64 addr)
6023e65e175bSOded Gabbay {
6024e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
6025e65e175bSOded Gabbay 
6026e65e175bSOded Gabbay 	if (hdev->reset_info.hard_reset_pending)
6027e65e175bSOded Gabbay 		return U64_MAX;
6028e65e175bSOded Gabbay 
6029e65e175bSOded Gabbay 	return readq(hdev->pcie_bar[HBM_BAR_ID] +
6030e65e175bSOded Gabbay 			(addr - gaudi->hbm_bar_cur_addr));
6031e65e175bSOded Gabbay }
6032e65e175bSOded Gabbay 
gaudi_write_pte(struct hl_device * hdev,u64 addr,u64 val)6033e65e175bSOded Gabbay static void gaudi_write_pte(struct hl_device *hdev, u64 addr, u64 val)
6034e65e175bSOded Gabbay {
6035e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
6036e65e175bSOded Gabbay 
6037e65e175bSOded Gabbay 	if (hdev->reset_info.hard_reset_pending)
6038e65e175bSOded Gabbay 		return;
6039e65e175bSOded Gabbay 
6040e65e175bSOded Gabbay 	writeq(val, hdev->pcie_bar[HBM_BAR_ID] +
6041e65e175bSOded Gabbay 			(addr - gaudi->hbm_bar_cur_addr));
6042e65e175bSOded Gabbay }
6043e65e175bSOded Gabbay 
gaudi_mmu_prepare_reg(struct hl_device * hdev,u64 reg,u32 asid)6044e65e175bSOded Gabbay void gaudi_mmu_prepare_reg(struct hl_device *hdev, u64 reg, u32 asid)
6045e65e175bSOded Gabbay {
6046e65e175bSOded Gabbay 	/* mask to zero the MMBP and ASID bits */
6047e65e175bSOded Gabbay 	WREG32_AND(reg, ~0x7FF);
6048e65e175bSOded Gabbay 	WREG32_OR(reg, asid);
6049e65e175bSOded Gabbay }
6050e65e175bSOded Gabbay 
gaudi_mmu_prepare(struct hl_device * hdev,u32 asid)6051e65e175bSOded Gabbay static void gaudi_mmu_prepare(struct hl_device *hdev, u32 asid)
6052e65e175bSOded Gabbay {
6053e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
6054e65e175bSOded Gabbay 
6055e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_MMU))
6056e65e175bSOded Gabbay 		return;
6057e65e175bSOded Gabbay 
6058e65e175bSOded Gabbay 	if (asid & ~DMA0_QM_GLBL_NON_SECURE_PROPS_0_ASID_MASK) {
6059e65e175bSOded Gabbay 		dev_crit(hdev->dev, "asid %u is too big\n", asid);
6060e65e175bSOded Gabbay 		return;
6061e65e175bSOded Gabbay 	}
6062e65e175bSOded Gabbay 
6063e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA0_QM_GLBL_NON_SECURE_PROPS_0, asid);
6064e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA0_QM_GLBL_NON_SECURE_PROPS_1, asid);
6065e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA0_QM_GLBL_NON_SECURE_PROPS_2, asid);
6066e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA0_QM_GLBL_NON_SECURE_PROPS_3, asid);
6067e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA0_QM_GLBL_NON_SECURE_PROPS_4, asid);
6068e65e175bSOded Gabbay 
6069e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA1_QM_GLBL_NON_SECURE_PROPS_0, asid);
6070e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA1_QM_GLBL_NON_SECURE_PROPS_1, asid);
6071e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA1_QM_GLBL_NON_SECURE_PROPS_2, asid);
6072e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA1_QM_GLBL_NON_SECURE_PROPS_3, asid);
6073e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA1_QM_GLBL_NON_SECURE_PROPS_4, asid);
6074e65e175bSOded Gabbay 
6075e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA2_QM_GLBL_NON_SECURE_PROPS_0, asid);
6076e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA2_QM_GLBL_NON_SECURE_PROPS_1, asid);
6077e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA2_QM_GLBL_NON_SECURE_PROPS_2, asid);
6078e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA2_QM_GLBL_NON_SECURE_PROPS_3, asid);
6079e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA2_QM_GLBL_NON_SECURE_PROPS_4, asid);
6080e65e175bSOded Gabbay 
6081e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA3_QM_GLBL_NON_SECURE_PROPS_0, asid);
6082e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA3_QM_GLBL_NON_SECURE_PROPS_1, asid);
6083e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA3_QM_GLBL_NON_SECURE_PROPS_2, asid);
6084e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA3_QM_GLBL_NON_SECURE_PROPS_3, asid);
6085e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA3_QM_GLBL_NON_SECURE_PROPS_4, asid);
6086e65e175bSOded Gabbay 
6087e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA4_QM_GLBL_NON_SECURE_PROPS_0, asid);
6088e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA4_QM_GLBL_NON_SECURE_PROPS_1, asid);
6089e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA4_QM_GLBL_NON_SECURE_PROPS_2, asid);
6090e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA4_QM_GLBL_NON_SECURE_PROPS_3, asid);
6091e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA4_QM_GLBL_NON_SECURE_PROPS_4, asid);
6092e65e175bSOded Gabbay 
6093e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA5_QM_GLBL_NON_SECURE_PROPS_0, asid);
6094e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA5_QM_GLBL_NON_SECURE_PROPS_1, asid);
6095e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA5_QM_GLBL_NON_SECURE_PROPS_2, asid);
6096e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA5_QM_GLBL_NON_SECURE_PROPS_3, asid);
6097e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA5_QM_GLBL_NON_SECURE_PROPS_4, asid);
6098e65e175bSOded Gabbay 
6099e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA6_QM_GLBL_NON_SECURE_PROPS_0, asid);
6100e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA6_QM_GLBL_NON_SECURE_PROPS_1, asid);
6101e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA6_QM_GLBL_NON_SECURE_PROPS_2, asid);
6102e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA6_QM_GLBL_NON_SECURE_PROPS_3, asid);
6103e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA6_QM_GLBL_NON_SECURE_PROPS_4, asid);
6104e65e175bSOded Gabbay 
6105e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA7_QM_GLBL_NON_SECURE_PROPS_0, asid);
6106e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA7_QM_GLBL_NON_SECURE_PROPS_1, asid);
6107e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA7_QM_GLBL_NON_SECURE_PROPS_2, asid);
6108e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA7_QM_GLBL_NON_SECURE_PROPS_3, asid);
6109e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA7_QM_GLBL_NON_SECURE_PROPS_4, asid);
6110e65e175bSOded Gabbay 
6111e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA0_CORE_NON_SECURE_PROPS, asid);
6112e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA1_CORE_NON_SECURE_PROPS, asid);
6113e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA2_CORE_NON_SECURE_PROPS, asid);
6114e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA3_CORE_NON_SECURE_PROPS, asid);
6115e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA4_CORE_NON_SECURE_PROPS, asid);
6116e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA5_CORE_NON_SECURE_PROPS, asid);
6117e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA6_CORE_NON_SECURE_PROPS, asid);
6118e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmDMA7_CORE_NON_SECURE_PROPS, asid);
6119e65e175bSOded Gabbay 
6120e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC0_QM_GLBL_NON_SECURE_PROPS_0, asid);
6121e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC0_QM_GLBL_NON_SECURE_PROPS_1, asid);
6122e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC0_QM_GLBL_NON_SECURE_PROPS_2, asid);
6123e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC0_QM_GLBL_NON_SECURE_PROPS_3, asid);
6124e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC0_QM_GLBL_NON_SECURE_PROPS_4, asid);
6125e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC0_CFG_ARUSER_LO, asid);
6126e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC0_CFG_AWUSER_LO, asid);
6127e65e175bSOded Gabbay 
6128e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC1_QM_GLBL_NON_SECURE_PROPS_0, asid);
6129e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC1_QM_GLBL_NON_SECURE_PROPS_1, asid);
6130e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC1_QM_GLBL_NON_SECURE_PROPS_2, asid);
6131e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC1_QM_GLBL_NON_SECURE_PROPS_3, asid);
6132e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC1_QM_GLBL_NON_SECURE_PROPS_4, asid);
6133e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC1_CFG_ARUSER_LO, asid);
6134e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC1_CFG_AWUSER_LO, asid);
6135e65e175bSOded Gabbay 
6136e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC2_QM_GLBL_NON_SECURE_PROPS_0, asid);
6137e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC2_QM_GLBL_NON_SECURE_PROPS_1, asid);
6138e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC2_QM_GLBL_NON_SECURE_PROPS_2, asid);
6139e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC2_QM_GLBL_NON_SECURE_PROPS_3, asid);
6140e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC2_QM_GLBL_NON_SECURE_PROPS_4, asid);
6141e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC2_CFG_ARUSER_LO, asid);
6142e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC2_CFG_AWUSER_LO, asid);
6143e65e175bSOded Gabbay 
6144e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC3_QM_GLBL_NON_SECURE_PROPS_0, asid);
6145e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC3_QM_GLBL_NON_SECURE_PROPS_1, asid);
6146e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC3_QM_GLBL_NON_SECURE_PROPS_2, asid);
6147e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC3_QM_GLBL_NON_SECURE_PROPS_3, asid);
6148e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC3_QM_GLBL_NON_SECURE_PROPS_4, asid);
6149e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC3_CFG_ARUSER_LO, asid);
6150e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC3_CFG_AWUSER_LO, asid);
6151e65e175bSOded Gabbay 
6152e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC4_QM_GLBL_NON_SECURE_PROPS_0, asid);
6153e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC4_QM_GLBL_NON_SECURE_PROPS_1, asid);
6154e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC4_QM_GLBL_NON_SECURE_PROPS_2, asid);
6155e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC4_QM_GLBL_NON_SECURE_PROPS_3, asid);
6156e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC4_QM_GLBL_NON_SECURE_PROPS_4, asid);
6157e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC4_CFG_ARUSER_LO, asid);
6158e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC4_CFG_AWUSER_LO, asid);
6159e65e175bSOded Gabbay 
6160e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC5_QM_GLBL_NON_SECURE_PROPS_0, asid);
6161e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC5_QM_GLBL_NON_SECURE_PROPS_1, asid);
6162e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC5_QM_GLBL_NON_SECURE_PROPS_2, asid);
6163e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC5_QM_GLBL_NON_SECURE_PROPS_3, asid);
6164e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC5_QM_GLBL_NON_SECURE_PROPS_4, asid);
6165e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC5_CFG_ARUSER_LO, asid);
6166e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC5_CFG_AWUSER_LO, asid);
6167e65e175bSOded Gabbay 
6168e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC6_QM_GLBL_NON_SECURE_PROPS_0, asid);
6169e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC6_QM_GLBL_NON_SECURE_PROPS_1, asid);
6170e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC6_QM_GLBL_NON_SECURE_PROPS_2, asid);
6171e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC6_QM_GLBL_NON_SECURE_PROPS_3, asid);
6172e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC6_QM_GLBL_NON_SECURE_PROPS_4, asid);
6173e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC6_CFG_ARUSER_LO, asid);
6174e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC6_CFG_AWUSER_LO, asid);
6175e65e175bSOded Gabbay 
6176e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC7_QM_GLBL_NON_SECURE_PROPS_0, asid);
6177e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC7_QM_GLBL_NON_SECURE_PROPS_1, asid);
6178e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC7_QM_GLBL_NON_SECURE_PROPS_2, asid);
6179e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC7_QM_GLBL_NON_SECURE_PROPS_3, asid);
6180e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC7_QM_GLBL_NON_SECURE_PROPS_4, asid);
6181e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC7_CFG_ARUSER_LO, asid);
6182e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmTPC7_CFG_AWUSER_LO, asid);
6183e65e175bSOded Gabbay 
6184e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME0_QM_GLBL_NON_SECURE_PROPS_0, asid);
6185e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME0_QM_GLBL_NON_SECURE_PROPS_1, asid);
6186e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME0_QM_GLBL_NON_SECURE_PROPS_2, asid);
6187e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME0_QM_GLBL_NON_SECURE_PROPS_3, asid);
6188e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME0_QM_GLBL_NON_SECURE_PROPS_4, asid);
6189e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME2_QM_GLBL_NON_SECURE_PROPS_0, asid);
6190e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME2_QM_GLBL_NON_SECURE_PROPS_1, asid);
6191e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME2_QM_GLBL_NON_SECURE_PROPS_2, asid);
6192e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME2_QM_GLBL_NON_SECURE_PROPS_3, asid);
6193e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME2_QM_GLBL_NON_SECURE_PROPS_4, asid);
6194e65e175bSOded Gabbay 
6195e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME0_SBAB_ARUSER0, asid);
6196e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME0_SBAB_ARUSER1, asid);
6197e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME1_SBAB_ARUSER0, asid);
6198e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME1_SBAB_ARUSER1, asid);
6199e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME2_SBAB_ARUSER0, asid);
6200e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME2_SBAB_ARUSER1, asid);
6201e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME3_SBAB_ARUSER0, asid);
6202e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME3_SBAB_ARUSER1, asid);
6203e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME0_ACC_WBC, asid);
6204e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME1_ACC_WBC, asid);
6205e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME2_ACC_WBC, asid);
6206e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmMME3_ACC_WBC, asid);
6207e65e175bSOded Gabbay 
6208e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC0) {
6209e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC0_QM0_GLBL_NON_SECURE_PROPS_0,
6210e65e175bSOded Gabbay 				asid);
6211e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC0_QM0_GLBL_NON_SECURE_PROPS_1,
6212e65e175bSOded Gabbay 				asid);
6213e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC0_QM0_GLBL_NON_SECURE_PROPS_2,
6214e65e175bSOded Gabbay 				asid);
6215e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC0_QM0_GLBL_NON_SECURE_PROPS_3,
6216e65e175bSOded Gabbay 				asid);
6217e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC0_QM0_GLBL_NON_SECURE_PROPS_4,
6218e65e175bSOded Gabbay 				asid);
6219e65e175bSOded Gabbay 	}
6220e65e175bSOded Gabbay 
6221e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC1) {
6222e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC0_QM1_GLBL_NON_SECURE_PROPS_0,
6223e65e175bSOded Gabbay 				asid);
6224e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC0_QM1_GLBL_NON_SECURE_PROPS_1,
6225e65e175bSOded Gabbay 				asid);
6226e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC0_QM1_GLBL_NON_SECURE_PROPS_2,
6227e65e175bSOded Gabbay 				asid);
6228e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC0_QM1_GLBL_NON_SECURE_PROPS_3,
6229e65e175bSOded Gabbay 				asid);
6230e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC0_QM1_GLBL_NON_SECURE_PROPS_4,
6231e65e175bSOded Gabbay 				asid);
6232e65e175bSOded Gabbay 	}
6233e65e175bSOded Gabbay 
6234e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC2) {
6235e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC1_QM0_GLBL_NON_SECURE_PROPS_0,
6236e65e175bSOded Gabbay 				asid);
6237e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC1_QM0_GLBL_NON_SECURE_PROPS_1,
6238e65e175bSOded Gabbay 				asid);
6239e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC1_QM0_GLBL_NON_SECURE_PROPS_2,
6240e65e175bSOded Gabbay 				asid);
6241e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC1_QM0_GLBL_NON_SECURE_PROPS_3,
6242e65e175bSOded Gabbay 				asid);
6243e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC1_QM0_GLBL_NON_SECURE_PROPS_4,
6244e65e175bSOded Gabbay 				asid);
6245e65e175bSOded Gabbay 	}
6246e65e175bSOded Gabbay 
6247e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC3) {
6248e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC1_QM1_GLBL_NON_SECURE_PROPS_0,
6249e65e175bSOded Gabbay 				asid);
6250e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC1_QM1_GLBL_NON_SECURE_PROPS_1,
6251e65e175bSOded Gabbay 				asid);
6252e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC1_QM1_GLBL_NON_SECURE_PROPS_2,
6253e65e175bSOded Gabbay 				asid);
6254e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC1_QM1_GLBL_NON_SECURE_PROPS_3,
6255e65e175bSOded Gabbay 				asid);
6256e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC1_QM1_GLBL_NON_SECURE_PROPS_4,
6257e65e175bSOded Gabbay 				asid);
6258e65e175bSOded Gabbay 	}
6259e65e175bSOded Gabbay 
6260e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC4) {
6261e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC2_QM0_GLBL_NON_SECURE_PROPS_0,
6262e65e175bSOded Gabbay 				asid);
6263e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC2_QM0_GLBL_NON_SECURE_PROPS_1,
6264e65e175bSOded Gabbay 				asid);
6265e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC2_QM0_GLBL_NON_SECURE_PROPS_2,
6266e65e175bSOded Gabbay 				asid);
6267e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC2_QM0_GLBL_NON_SECURE_PROPS_3,
6268e65e175bSOded Gabbay 				asid);
6269e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC2_QM0_GLBL_NON_SECURE_PROPS_4,
6270e65e175bSOded Gabbay 				asid);
6271e65e175bSOded Gabbay 	}
6272e65e175bSOded Gabbay 
6273e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC5) {
6274e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC2_QM1_GLBL_NON_SECURE_PROPS_0,
6275e65e175bSOded Gabbay 				asid);
6276e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC2_QM1_GLBL_NON_SECURE_PROPS_1,
6277e65e175bSOded Gabbay 				asid);
6278e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC2_QM1_GLBL_NON_SECURE_PROPS_2,
6279e65e175bSOded Gabbay 				asid);
6280e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC2_QM1_GLBL_NON_SECURE_PROPS_3,
6281e65e175bSOded Gabbay 				asid);
6282e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC2_QM1_GLBL_NON_SECURE_PROPS_4,
6283e65e175bSOded Gabbay 				asid);
6284e65e175bSOded Gabbay 	}
6285e65e175bSOded Gabbay 
6286e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC6) {
6287e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC3_QM0_GLBL_NON_SECURE_PROPS_0,
6288e65e175bSOded Gabbay 				asid);
6289e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC3_QM0_GLBL_NON_SECURE_PROPS_1,
6290e65e175bSOded Gabbay 				asid);
6291e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC3_QM0_GLBL_NON_SECURE_PROPS_2,
6292e65e175bSOded Gabbay 				asid);
6293e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC3_QM0_GLBL_NON_SECURE_PROPS_3,
6294e65e175bSOded Gabbay 				asid);
6295e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC3_QM0_GLBL_NON_SECURE_PROPS_4,
6296e65e175bSOded Gabbay 				asid);
6297e65e175bSOded Gabbay 	}
6298e65e175bSOded Gabbay 
6299e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC7) {
6300e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC3_QM1_GLBL_NON_SECURE_PROPS_0,
6301e65e175bSOded Gabbay 				asid);
6302e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC3_QM1_GLBL_NON_SECURE_PROPS_1,
6303e65e175bSOded Gabbay 				asid);
6304e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC3_QM1_GLBL_NON_SECURE_PROPS_2,
6305e65e175bSOded Gabbay 				asid);
6306e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC3_QM1_GLBL_NON_SECURE_PROPS_3,
6307e65e175bSOded Gabbay 				asid);
6308e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC3_QM1_GLBL_NON_SECURE_PROPS_4,
6309e65e175bSOded Gabbay 				asid);
6310e65e175bSOded Gabbay 	}
6311e65e175bSOded Gabbay 
6312e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC8) {
6313e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC4_QM0_GLBL_NON_SECURE_PROPS_0,
6314e65e175bSOded Gabbay 				asid);
6315e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC4_QM0_GLBL_NON_SECURE_PROPS_1,
6316e65e175bSOded Gabbay 				asid);
6317e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC4_QM0_GLBL_NON_SECURE_PROPS_2,
6318e65e175bSOded Gabbay 				asid);
6319e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC4_QM0_GLBL_NON_SECURE_PROPS_3,
6320e65e175bSOded Gabbay 				asid);
6321e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC4_QM0_GLBL_NON_SECURE_PROPS_4,
6322e65e175bSOded Gabbay 				asid);
6323e65e175bSOded Gabbay 	}
6324e65e175bSOded Gabbay 
6325e65e175bSOded Gabbay 	if (gaudi->hw_cap_initialized & HW_CAP_NIC9) {
6326e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC4_QM1_GLBL_NON_SECURE_PROPS_0,
6327e65e175bSOded Gabbay 				asid);
6328e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC4_QM1_GLBL_NON_SECURE_PROPS_1,
6329e65e175bSOded Gabbay 				asid);
6330e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC4_QM1_GLBL_NON_SECURE_PROPS_2,
6331e65e175bSOded Gabbay 				asid);
6332e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC4_QM1_GLBL_NON_SECURE_PROPS_3,
6333e65e175bSOded Gabbay 				asid);
6334e65e175bSOded Gabbay 		gaudi_mmu_prepare_reg(hdev, mmNIC4_QM1_GLBL_NON_SECURE_PROPS_4,
6335e65e175bSOded Gabbay 				asid);
6336e65e175bSOded Gabbay 	}
6337e65e175bSOded Gabbay 
6338e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_ARUSER, asid);
6339e65e175bSOded Gabbay 	gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_AWUSER, asid);
6340e65e175bSOded Gabbay }
6341e65e175bSOded Gabbay 
gaudi_send_job_on_qman0(struct hl_device * hdev,struct hl_cs_job * job)6342e65e175bSOded Gabbay static int gaudi_send_job_on_qman0(struct hl_device *hdev,
6343e65e175bSOded Gabbay 		struct hl_cs_job *job)
6344e65e175bSOded Gabbay {
6345e65e175bSOded Gabbay 	struct packet_msg_prot *fence_pkt;
6346e65e175bSOded Gabbay 	u32 *fence_ptr;
6347e65e175bSOded Gabbay 	dma_addr_t fence_dma_addr;
6348e65e175bSOded Gabbay 	struct hl_cb *cb;
6349e65e175bSOded Gabbay 	u32 tmp, timeout, dma_offset;
6350e65e175bSOded Gabbay 	int rc;
6351e65e175bSOded Gabbay 
6352e65e175bSOded Gabbay 	if (hdev->pldm)
6353e65e175bSOded Gabbay 		timeout = GAUDI_PLDM_QMAN0_TIMEOUT_USEC;
6354e65e175bSOded Gabbay 	else
6355e65e175bSOded Gabbay 		timeout = HL_DEVICE_TIMEOUT_USEC;
6356e65e175bSOded Gabbay 
6357e65e175bSOded Gabbay 	fence_ptr = hl_asic_dma_pool_zalloc(hdev, 4, GFP_KERNEL, &fence_dma_addr);
6358e65e175bSOded Gabbay 	if (!fence_ptr) {
6359e65e175bSOded Gabbay 		dev_err(hdev->dev,
6360e65e175bSOded Gabbay 			"Failed to allocate fence memory for QMAN0\n");
6361e65e175bSOded Gabbay 		return -ENOMEM;
6362e65e175bSOded Gabbay 	}
6363e65e175bSOded Gabbay 
6364e65e175bSOded Gabbay 	cb = job->patched_cb;
6365e65e175bSOded Gabbay 
6366e65e175bSOded Gabbay 	fence_pkt = cb->kernel_address +
6367e65e175bSOded Gabbay 			job->job_cb_size - sizeof(struct packet_msg_prot);
6368e65e175bSOded Gabbay 
6369e65e175bSOded Gabbay 	tmp = FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_MSG_PROT);
6370e65e175bSOded Gabbay 	tmp |= FIELD_PREP(GAUDI_PKT_CTL_EB_MASK, 1);
6371e65e175bSOded Gabbay 	tmp |= FIELD_PREP(GAUDI_PKT_CTL_MB_MASK, 1);
6372e65e175bSOded Gabbay 
6373e65e175bSOded Gabbay 	fence_pkt->ctl = cpu_to_le32(tmp);
6374e65e175bSOded Gabbay 	fence_pkt->value = cpu_to_le32(GAUDI_QMAN0_FENCE_VAL);
6375e65e175bSOded Gabbay 	fence_pkt->addr = cpu_to_le64(fence_dma_addr);
6376e65e175bSOded Gabbay 
6377e65e175bSOded Gabbay 	dma_offset = gaudi_dma_assignment[GAUDI_PCI_DMA_1] * DMA_CORE_OFFSET;
6378e65e175bSOded Gabbay 
6379e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_PROT + dma_offset,
6380e65e175bSOded Gabbay 			BIT(DMA0_CORE_PROT_ERR_VAL_SHIFT) | BIT(DMA0_CORE_PROT_VAL_SHIFT));
6381e65e175bSOded Gabbay 
6382e65e175bSOded Gabbay 	rc = hl_hw_queue_send_cb_no_cmpl(hdev, GAUDI_QUEUE_ID_DMA_0_0,
6383e65e175bSOded Gabbay 					job->job_cb_size, cb->bus_address);
6384e65e175bSOded Gabbay 	if (rc) {
6385e65e175bSOded Gabbay 		dev_err(hdev->dev, "Failed to send CB on QMAN0, %d\n", rc);
6386e65e175bSOded Gabbay 		goto free_fence_ptr;
6387e65e175bSOded Gabbay 	}
6388e65e175bSOded Gabbay 
6389e65e175bSOded Gabbay 	rc = hl_poll_timeout_memory(hdev, fence_ptr, tmp,
6390e65e175bSOded Gabbay 				(tmp == GAUDI_QMAN0_FENCE_VAL), 1000,
6391e65e175bSOded Gabbay 				timeout, true);
6392e65e175bSOded Gabbay 
6393e65e175bSOded Gabbay 	hl_hw_queue_inc_ci_kernel(hdev, GAUDI_QUEUE_ID_DMA_0_0);
6394e65e175bSOded Gabbay 
6395e65e175bSOded Gabbay 	if (rc == -ETIMEDOUT) {
6396e65e175bSOded Gabbay 		dev_err(hdev->dev, "QMAN0 Job timeout (0x%x)\n", tmp);
6397e65e175bSOded Gabbay 		goto free_fence_ptr;
6398e65e175bSOded Gabbay 	}
6399e65e175bSOded Gabbay 
6400e65e175bSOded Gabbay free_fence_ptr:
6401e65e175bSOded Gabbay 	WREG32(mmDMA0_CORE_PROT + dma_offset, BIT(DMA0_CORE_PROT_ERR_VAL_SHIFT));
6402e65e175bSOded Gabbay 
6403e65e175bSOded Gabbay 	hl_asic_dma_pool_free(hdev, (void *) fence_ptr, fence_dma_addr);
6404e65e175bSOded Gabbay 	return rc;
6405e65e175bSOded Gabbay }
6406e65e175bSOded Gabbay 
gaudi_get_event_desc(u16 event_type,char * desc,size_t size)6407e65e175bSOded Gabbay static void gaudi_get_event_desc(u16 event_type, char *desc, size_t size)
6408e65e175bSOded Gabbay {
6409e65e175bSOded Gabbay 	if (event_type >= GAUDI_EVENT_SIZE)
6410e65e175bSOded Gabbay 		goto event_not_supported;
6411e65e175bSOded Gabbay 
6412e65e175bSOded Gabbay 	if (!gaudi_irq_map_table[event_type].valid)
6413e65e175bSOded Gabbay 		goto event_not_supported;
6414e65e175bSOded Gabbay 
6415e65e175bSOded Gabbay 	snprintf(desc, size, gaudi_irq_map_table[event_type].name);
6416e65e175bSOded Gabbay 
6417e65e175bSOded Gabbay 	return;
6418e65e175bSOded Gabbay 
6419e65e175bSOded Gabbay event_not_supported:
6420e65e175bSOded Gabbay 	snprintf(desc, size, "N/A");
6421e65e175bSOded Gabbay }
6422e65e175bSOded Gabbay 
gaudi_get_razwi_initiator_dma_name(struct hl_device * hdev,u32 x_y,bool is_write,u16 * engine_id_1,u16 * engine_id_2)6423e65e175bSOded Gabbay static const char *gaudi_get_razwi_initiator_dma_name(struct hl_device *hdev, u32 x_y,
6424e65e175bSOded Gabbay 							bool is_write, u16 *engine_id_1,
6425e65e175bSOded Gabbay 							u16 *engine_id_2)
6426e65e175bSOded Gabbay {
6427e65e175bSOded Gabbay 	u32 dma_id[2], dma_offset, err_cause[2], mask, i;
6428e65e175bSOded Gabbay 
6429e65e175bSOded Gabbay 	mask = is_write ? DMA0_CORE_ERR_CAUSE_HBW_WR_ERR_MASK :
6430e65e175bSOded Gabbay 				DMA0_CORE_ERR_CAUSE_HBW_RD_ERR_MASK;
6431e65e175bSOded Gabbay 
6432e65e175bSOded Gabbay 	switch (x_y) {
6433e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_W_S_0:
6434e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_W_S_1:
6435e65e175bSOded Gabbay 		dma_id[0] = 0;
6436e65e175bSOded Gabbay 		dma_id[1] = 2;
6437e65e175bSOded Gabbay 		break;
6438e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_E_S_0:
6439e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_E_S_1:
6440e65e175bSOded Gabbay 		dma_id[0] = 1;
6441e65e175bSOded Gabbay 		dma_id[1] = 3;
6442e65e175bSOded Gabbay 		break;
6443e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_W_N_0:
6444e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_W_N_1:
6445e65e175bSOded Gabbay 		dma_id[0] = 4;
6446e65e175bSOded Gabbay 		dma_id[1] = 6;
6447e65e175bSOded Gabbay 		break;
6448e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_E_N_0:
6449e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_E_N_1:
6450e65e175bSOded Gabbay 		dma_id[0] = 5;
6451e65e175bSOded Gabbay 		dma_id[1] = 7;
6452e65e175bSOded Gabbay 		break;
6453e65e175bSOded Gabbay 	default:
6454e65e175bSOded Gabbay 		goto unknown_initiator;
6455e65e175bSOded Gabbay 	}
6456e65e175bSOded Gabbay 
6457e65e175bSOded Gabbay 	for (i = 0 ; i < 2 ; i++) {
6458e65e175bSOded Gabbay 		dma_offset = dma_id[i] * DMA_CORE_OFFSET;
6459e65e175bSOded Gabbay 		err_cause[i] = RREG32(mmDMA0_CORE_ERR_CAUSE + dma_offset);
6460e65e175bSOded Gabbay 	}
6461e65e175bSOded Gabbay 
6462e65e175bSOded Gabbay 	switch (x_y) {
6463e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_W_S_0:
6464e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_W_S_1:
6465e65e175bSOded Gabbay 		if ((err_cause[0] & mask) && !(err_cause[1] & mask)) {
6466e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_DMA_0;
6467e65e175bSOded Gabbay 			return "DMA0";
6468e65e175bSOded Gabbay 		} else if (!(err_cause[0] & mask) && (err_cause[1] & mask)) {
6469e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_DMA_2;
6470e65e175bSOded Gabbay 			return "DMA2";
6471e65e175bSOded Gabbay 		} else {
6472e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_DMA_0;
6473e65e175bSOded Gabbay 			*engine_id_2 = GAUDI_ENGINE_ID_DMA_2;
6474e65e175bSOded Gabbay 			return "DMA0 or DMA2";
6475e65e175bSOded Gabbay 		}
6476e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_E_S_0:
6477e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_E_S_1:
6478e65e175bSOded Gabbay 		if ((err_cause[0] & mask) && !(err_cause[1] & mask)) {
6479e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_DMA_1;
6480e65e175bSOded Gabbay 			return "DMA1";
6481e65e175bSOded Gabbay 		} else if (!(err_cause[0] & mask) && (err_cause[1] & mask)) {
6482e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_DMA_3;
6483e65e175bSOded Gabbay 			return "DMA3";
6484e65e175bSOded Gabbay 		} else {
6485e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_DMA_1;
6486e65e175bSOded Gabbay 			*engine_id_2 = GAUDI_ENGINE_ID_DMA_3;
6487e65e175bSOded Gabbay 			return "DMA1 or DMA3";
6488e65e175bSOded Gabbay 		}
6489e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_W_N_0:
6490e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_W_N_1:
6491e65e175bSOded Gabbay 		if ((err_cause[0] & mask) && !(err_cause[1] & mask)) {
6492e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_DMA_4;
6493e65e175bSOded Gabbay 			return "DMA4";
6494e65e175bSOded Gabbay 		} else if (!(err_cause[0] & mask) && (err_cause[1] & mask)) {
6495e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_DMA_6;
6496e65e175bSOded Gabbay 			return "DMA6";
6497e65e175bSOded Gabbay 		} else {
6498e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_DMA_4;
6499e65e175bSOded Gabbay 			*engine_id_2 = GAUDI_ENGINE_ID_DMA_6;
6500e65e175bSOded Gabbay 			return "DMA4 or DMA6";
6501e65e175bSOded Gabbay 		}
6502e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_E_N_0:
6503e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_E_N_1:
6504e65e175bSOded Gabbay 		if ((err_cause[0] & mask) && !(err_cause[1] & mask)) {
6505e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_DMA_5;
6506e65e175bSOded Gabbay 			return "DMA5";
6507e65e175bSOded Gabbay 		} else if (!(err_cause[0] & mask) && (err_cause[1] & mask)) {
6508e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_DMA_7;
6509e65e175bSOded Gabbay 			return "DMA7";
6510e65e175bSOded Gabbay 		} else {
6511e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_DMA_5;
6512e65e175bSOded Gabbay 			*engine_id_2 = GAUDI_ENGINE_ID_DMA_7;
6513e65e175bSOded Gabbay 			return "DMA5 or DMA7";
6514e65e175bSOded Gabbay 		}
6515e65e175bSOded Gabbay 	}
6516e65e175bSOded Gabbay 
6517e65e175bSOded Gabbay unknown_initiator:
6518e65e175bSOded Gabbay 	return "unknown initiator";
6519e65e175bSOded Gabbay }
6520e65e175bSOded Gabbay 
gaudi_get_razwi_initiator_name(struct hl_device * hdev,bool is_write,u16 * engine_id_1,u16 * engine_id_2)6521e65e175bSOded Gabbay static const char *gaudi_get_razwi_initiator_name(struct hl_device *hdev, bool is_write,
6522e65e175bSOded Gabbay 							u16 *engine_id_1, u16 *engine_id_2)
6523e65e175bSOded Gabbay {
6524e65e175bSOded Gabbay 	u32 val, x_y, axi_id;
6525e65e175bSOded Gabbay 
6526e65e175bSOded Gabbay 	val = is_write ? RREG32(mmMMU_UP_RAZWI_WRITE_ID) :
6527e65e175bSOded Gabbay 				RREG32(mmMMU_UP_RAZWI_READ_ID);
6528e65e175bSOded Gabbay 	x_y = val & ((RAZWI_INITIATOR_Y_MASK << RAZWI_INITIATOR_Y_SHIFT) |
6529e65e175bSOded Gabbay 			(RAZWI_INITIATOR_X_MASK << RAZWI_INITIATOR_X_SHIFT));
6530e65e175bSOded Gabbay 	axi_id = val & (RAZWI_INITIATOR_AXI_ID_MASK <<
6531e65e175bSOded Gabbay 			RAZWI_INITIATOR_AXI_ID_SHIFT);
6532e65e175bSOded Gabbay 
6533e65e175bSOded Gabbay 	switch (x_y) {
6534e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_TPC0_NIC0:
6535e65e175bSOded Gabbay 		if (axi_id == RAZWI_INITIATOR_ID_AXI_ID(AXI_ID_TPC)) {
6536e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_TPC_0;
6537e65e175bSOded Gabbay 			return "TPC0";
6538e65e175bSOded Gabbay 		}
6539e65e175bSOded Gabbay 		if (axi_id == RAZWI_INITIATOR_ID_AXI_ID(AXI_ID_NIC)) {
6540e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_NIC_0;
6541e65e175bSOded Gabbay 			return "NIC0";
6542e65e175bSOded Gabbay 		}
6543e65e175bSOded Gabbay 		break;
6544e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_TPC1:
6545e65e175bSOded Gabbay 		*engine_id_1 = GAUDI_ENGINE_ID_TPC_1;
6546e65e175bSOded Gabbay 		return "TPC1";
6547e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_MME0_0:
6548e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_MME0_1:
6549e65e175bSOded Gabbay 		*engine_id_1 = GAUDI_ENGINE_ID_MME_0;
6550e65e175bSOded Gabbay 		return "MME0";
6551e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_MME1_0:
6552e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_MME1_1:
6553e65e175bSOded Gabbay 		*engine_id_1 = GAUDI_ENGINE_ID_MME_1;
6554e65e175bSOded Gabbay 		return "MME1";
6555e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_TPC2:
6556e65e175bSOded Gabbay 		*engine_id_1 = GAUDI_ENGINE_ID_TPC_2;
6557e65e175bSOded Gabbay 		return "TPC2";
6558e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_TPC3_PCI_CPU_PSOC:
6559e65e175bSOded Gabbay 		if (axi_id == RAZWI_INITIATOR_ID_AXI_ID(AXI_ID_TPC)) {
6560e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_TPC_3;
6561e65e175bSOded Gabbay 			return "TPC3";
6562e65e175bSOded Gabbay 		}
6563e65e175bSOded Gabbay 		/* PCI, CPU or PSOC does not have engine id*/
6564e65e175bSOded Gabbay 		if (axi_id == RAZWI_INITIATOR_ID_AXI_ID(AXI_ID_PCI))
6565e65e175bSOded Gabbay 			return "PCI";
6566e65e175bSOded Gabbay 		if (axi_id == RAZWI_INITIATOR_ID_AXI_ID(AXI_ID_CPU))
6567e65e175bSOded Gabbay 			return "CPU";
6568e65e175bSOded Gabbay 		if (axi_id == RAZWI_INITIATOR_ID_AXI_ID(AXI_ID_PSOC))
6569e65e175bSOded Gabbay 			return "PSOC";
6570e65e175bSOded Gabbay 		break;
6571e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_W_S_0:
6572e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_W_S_1:
6573e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_E_S_0:
6574e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_E_S_1:
6575e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_W_N_0:
6576e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_W_N_1:
6577e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_E_N_0:
6578e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_DMA_IF_E_N_1:
6579e65e175bSOded Gabbay 		return gaudi_get_razwi_initiator_dma_name(hdev, x_y, is_write,
6580e65e175bSOded Gabbay 				engine_id_1, engine_id_2);
6581e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_TPC4_NIC1_NIC2:
6582e65e175bSOded Gabbay 		if (axi_id == RAZWI_INITIATOR_ID_AXI_ID(AXI_ID_TPC)) {
6583e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_TPC_4;
6584e65e175bSOded Gabbay 			return "TPC4";
6585e65e175bSOded Gabbay 		}
6586e65e175bSOded Gabbay 		if (axi_id == RAZWI_INITIATOR_ID_AXI_ID(AXI_ID_NIC)) {
6587e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_NIC_1;
6588e65e175bSOded Gabbay 			return "NIC1";
6589e65e175bSOded Gabbay 		}
6590e65e175bSOded Gabbay 		if (axi_id == RAZWI_INITIATOR_ID_AXI_ID(AXI_ID_NIC_FT)) {
6591e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_NIC_2;
6592e65e175bSOded Gabbay 			return "NIC2";
6593e65e175bSOded Gabbay 		}
6594e65e175bSOded Gabbay 		break;
6595e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_TPC5:
6596e65e175bSOded Gabbay 		*engine_id_1 = GAUDI_ENGINE_ID_TPC_5;
6597e65e175bSOded Gabbay 		return "TPC5";
6598e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_MME2_0:
6599e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_MME2_1:
6600e65e175bSOded Gabbay 		*engine_id_1 = GAUDI_ENGINE_ID_MME_2;
6601e65e175bSOded Gabbay 		return "MME2";
6602e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_MME3_0:
6603e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_MME3_1:
6604e65e175bSOded Gabbay 		*engine_id_1 = GAUDI_ENGINE_ID_MME_3;
6605e65e175bSOded Gabbay 		return "MME3";
6606e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_TPC6:
6607e65e175bSOded Gabbay 		*engine_id_1 = GAUDI_ENGINE_ID_TPC_6;
6608e65e175bSOded Gabbay 		return "TPC6";
6609e65e175bSOded Gabbay 	case RAZWI_INITIATOR_ID_X_Y_TPC7_NIC4_NIC5:
6610e65e175bSOded Gabbay 		if (axi_id == RAZWI_INITIATOR_ID_AXI_ID(AXI_ID_TPC)) {
6611e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_TPC_7;
6612e65e175bSOded Gabbay 			return "TPC7";
6613e65e175bSOded Gabbay 		}
6614e65e175bSOded Gabbay 		if (axi_id == RAZWI_INITIATOR_ID_AXI_ID(AXI_ID_NIC)) {
6615e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_NIC_4;
6616e65e175bSOded Gabbay 			return "NIC4";
6617e65e175bSOded Gabbay 		}
6618e65e175bSOded Gabbay 		if (axi_id == RAZWI_INITIATOR_ID_AXI_ID(AXI_ID_NIC_FT)) {
6619e65e175bSOded Gabbay 			*engine_id_1 = GAUDI_ENGINE_ID_NIC_5;
6620e65e175bSOded Gabbay 			return "NIC5";
6621e65e175bSOded Gabbay 		}
6622e65e175bSOded Gabbay 		break;
6623e65e175bSOded Gabbay 	default:
6624e65e175bSOded Gabbay 		break;
6625e65e175bSOded Gabbay 	}
6626e65e175bSOded Gabbay 
6627e65e175bSOded Gabbay 	dev_err(hdev->dev,
6628e65e175bSOded Gabbay 		"Unknown RAZWI initiator ID 0x%x [Y=%d, X=%d, AXI_ID=%d]\n",
6629e65e175bSOded Gabbay 		val,
6630e65e175bSOded Gabbay 		(val >> RAZWI_INITIATOR_Y_SHIFT) & RAZWI_INITIATOR_Y_MASK,
6631e65e175bSOded Gabbay 		(val >> RAZWI_INITIATOR_X_SHIFT) & RAZWI_INITIATOR_X_MASK,
6632e65e175bSOded Gabbay 		(val >> RAZWI_INITIATOR_AXI_ID_SHIFT) &
6633e65e175bSOded Gabbay 			RAZWI_INITIATOR_AXI_ID_MASK);
6634e65e175bSOded Gabbay 
6635e65e175bSOded Gabbay 	return "unknown initiator";
6636e65e175bSOded Gabbay }
6637e65e175bSOded Gabbay 
gaudi_print_and_get_razwi_info(struct hl_device * hdev,u16 * engine_id_1,u16 * engine_id_2,bool * is_read,bool * is_write)6638e65e175bSOded Gabbay static void gaudi_print_and_get_razwi_info(struct hl_device *hdev, u16 *engine_id_1,
6639e65e175bSOded Gabbay 						u16 *engine_id_2, bool *is_read, bool *is_write)
6640e65e175bSOded Gabbay {
6641e65e175bSOded Gabbay 
6642e65e175bSOded Gabbay 	if (RREG32(mmMMU_UP_RAZWI_WRITE_VLD)) {
6643e65e175bSOded Gabbay 		dev_err_ratelimited(hdev->dev,
6644e65e175bSOded Gabbay 			"RAZWI event caused by illegal write of %s\n",
6645e65e175bSOded Gabbay 			gaudi_get_razwi_initiator_name(hdev, true, engine_id_1, engine_id_2));
6646e65e175bSOded Gabbay 		WREG32(mmMMU_UP_RAZWI_WRITE_VLD, 0);
6647e65e175bSOded Gabbay 		*is_write = true;
6648e65e175bSOded Gabbay 	}
6649e65e175bSOded Gabbay 
6650e65e175bSOded Gabbay 	if (RREG32(mmMMU_UP_RAZWI_READ_VLD)) {
6651e65e175bSOded Gabbay 		dev_err_ratelimited(hdev->dev,
6652e65e175bSOded Gabbay 			"RAZWI event caused by illegal read of %s\n",
6653e65e175bSOded Gabbay 			gaudi_get_razwi_initiator_name(hdev, false, engine_id_1, engine_id_2));
6654e65e175bSOded Gabbay 		WREG32(mmMMU_UP_RAZWI_READ_VLD, 0);
6655e65e175bSOded Gabbay 		*is_read = true;
6656e65e175bSOded Gabbay 	}
6657e65e175bSOded Gabbay }
6658e65e175bSOded Gabbay 
gaudi_print_and_get_mmu_error_info(struct hl_device * hdev,u64 * addr,u64 * event_mask)6659e65e175bSOded Gabbay static void gaudi_print_and_get_mmu_error_info(struct hl_device *hdev, u64 *addr, u64 *event_mask)
6660e65e175bSOded Gabbay {
6661e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
6662e65e175bSOded Gabbay 	u32 val;
6663e65e175bSOded Gabbay 
6664e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_MMU))
6665e65e175bSOded Gabbay 		return;
6666e65e175bSOded Gabbay 
6667e65e175bSOded Gabbay 	val = RREG32(mmMMU_UP_PAGE_ERROR_CAPTURE);
6668e65e175bSOded Gabbay 	if (val & MMU_UP_PAGE_ERROR_CAPTURE_ENTRY_VALID_MASK) {
6669e65e175bSOded Gabbay 		*addr = val & MMU_UP_PAGE_ERROR_CAPTURE_VA_49_32_MASK;
6670e65e175bSOded Gabbay 		*addr <<= 32;
6671e65e175bSOded Gabbay 		*addr |= RREG32(mmMMU_UP_PAGE_ERROR_CAPTURE_VA);
6672e65e175bSOded Gabbay 
6673e65e175bSOded Gabbay 		dev_err_ratelimited(hdev->dev, "MMU page fault on va 0x%llx\n", *addr);
6674e65e175bSOded Gabbay 		hl_handle_page_fault(hdev, *addr, 0, true, event_mask);
6675e65e175bSOded Gabbay 
6676e65e175bSOded Gabbay 		WREG32(mmMMU_UP_PAGE_ERROR_CAPTURE, 0);
6677e65e175bSOded Gabbay 	}
6678e65e175bSOded Gabbay 
6679e65e175bSOded Gabbay 	val = RREG32(mmMMU_UP_ACCESS_ERROR_CAPTURE);
6680e65e175bSOded Gabbay 	if (val & MMU_UP_ACCESS_ERROR_CAPTURE_ENTRY_VALID_MASK) {
6681e65e175bSOded Gabbay 		*addr = val & MMU_UP_ACCESS_ERROR_CAPTURE_VA_49_32_MASK;
6682e65e175bSOded Gabbay 		*addr <<= 32;
6683e65e175bSOded Gabbay 		*addr |= RREG32(mmMMU_UP_ACCESS_ERROR_CAPTURE_VA);
6684e65e175bSOded Gabbay 
6685e65e175bSOded Gabbay 		dev_err_ratelimited(hdev->dev, "MMU access error on va 0x%llx\n", *addr);
6686e65e175bSOded Gabbay 
6687e65e175bSOded Gabbay 		WREG32(mmMMU_UP_ACCESS_ERROR_CAPTURE, 0);
6688e65e175bSOded Gabbay 	}
6689e65e175bSOded Gabbay }
6690e65e175bSOded Gabbay 
6691e65e175bSOded Gabbay /*
6692e65e175bSOded Gabbay  *  +-------------------+------------------------------------------------------+
6693e65e175bSOded Gabbay  *  | Configuration Reg |                     Description                      |
6694e65e175bSOded Gabbay  *  |      Address      |                                                      |
6695e65e175bSOded Gabbay  *  +-------------------+------------------------------------------------------+
6696e65e175bSOded Gabbay  *  |  0xF30 - 0xF3F    |ECC single error indication (1 bit per memory wrapper)|
6697e65e175bSOded Gabbay  *  |                   |0xF30 memory wrappers 31:0 (MSB to LSB)               |
6698e65e175bSOded Gabbay  *  |                   |0xF34 memory wrappers 63:32                           |
6699e65e175bSOded Gabbay  *  |                   |0xF38 memory wrappers 95:64                           |
6700e65e175bSOded Gabbay  *  |                   |0xF3C memory wrappers 127:96                          |
6701e65e175bSOded Gabbay  *  +-------------------+------------------------------------------------------+
6702e65e175bSOded Gabbay  *  |  0xF40 - 0xF4F    |ECC double error indication (1 bit per memory wrapper)|
6703e65e175bSOded Gabbay  *  |                   |0xF40 memory wrappers 31:0 (MSB to LSB)               |
6704e65e175bSOded Gabbay  *  |                   |0xF44 memory wrappers 63:32                           |
6705e65e175bSOded Gabbay  *  |                   |0xF48 memory wrappers 95:64                           |
6706e65e175bSOded Gabbay  *  |                   |0xF4C memory wrappers 127:96                          |
6707e65e175bSOded Gabbay  *  +-------------------+------------------------------------------------------+
6708e65e175bSOded Gabbay  */
gaudi_extract_ecc_info(struct hl_device * hdev,struct ecc_info_extract_params * params,u64 * ecc_address,u64 * ecc_syndrom,u8 * memory_wrapper_idx)6709e65e175bSOded Gabbay static int gaudi_extract_ecc_info(struct hl_device *hdev,
6710e65e175bSOded Gabbay 		struct ecc_info_extract_params *params, u64 *ecc_address,
6711e65e175bSOded Gabbay 		u64 *ecc_syndrom, u8 *memory_wrapper_idx)
6712e65e175bSOded Gabbay {
6713e65e175bSOded Gabbay 	u32 i, num_mem_regs, reg, err_bit;
6714e65e175bSOded Gabbay 	u64 err_addr, err_word = 0;
6715e65e175bSOded Gabbay 
6716e65e175bSOded Gabbay 	num_mem_regs = params->num_memories / 32 +
6717e65e175bSOded Gabbay 			((params->num_memories % 32) ? 1 : 0);
6718e65e175bSOded Gabbay 
6719e65e175bSOded Gabbay 	if (params->block_address >= CFG_BASE)
6720e65e175bSOded Gabbay 		params->block_address -= CFG_BASE;
6721e65e175bSOded Gabbay 
6722e65e175bSOded Gabbay 	if (params->derr)
6723e65e175bSOded Gabbay 		err_addr = params->block_address + GAUDI_ECC_DERR0_OFFSET;
6724e65e175bSOded Gabbay 	else
6725e65e175bSOded Gabbay 		err_addr = params->block_address + GAUDI_ECC_SERR0_OFFSET;
6726e65e175bSOded Gabbay 
6727e65e175bSOded Gabbay 	/* Set invalid wrapper index */
6728e65e175bSOded Gabbay 	*memory_wrapper_idx = 0xFF;
6729e65e175bSOded Gabbay 
6730e65e175bSOded Gabbay 	/* Iterate through memory wrappers, a single bit must be set */
6731e65e175bSOded Gabbay 	for (i = 0 ; i < num_mem_regs ; i++) {
6732e65e175bSOded Gabbay 		err_addr += i * 4;
6733e65e175bSOded Gabbay 		err_word = RREG32(err_addr);
6734e65e175bSOded Gabbay 		if (err_word) {
6735e65e175bSOded Gabbay 			err_bit = __ffs(err_word);
6736e65e175bSOded Gabbay 			*memory_wrapper_idx = err_bit + (32 * i);
6737e65e175bSOded Gabbay 			break;
6738e65e175bSOded Gabbay 		}
6739e65e175bSOded Gabbay 	}
6740e65e175bSOded Gabbay 
6741e65e175bSOded Gabbay 	if (*memory_wrapper_idx == 0xFF) {
6742e65e175bSOded Gabbay 		dev_err(hdev->dev, "ECC error information cannot be found\n");
6743e65e175bSOded Gabbay 		return -EINVAL;
6744e65e175bSOded Gabbay 	}
6745e65e175bSOded Gabbay 
6746e65e175bSOded Gabbay 	WREG32(params->block_address + GAUDI_ECC_MEM_SEL_OFFSET,
6747e65e175bSOded Gabbay 			*memory_wrapper_idx);
6748e65e175bSOded Gabbay 
6749e65e175bSOded Gabbay 	*ecc_address =
6750e65e175bSOded Gabbay 		RREG32(params->block_address + GAUDI_ECC_ADDRESS_OFFSET);
6751e65e175bSOded Gabbay 	*ecc_syndrom =
6752e65e175bSOded Gabbay 		RREG32(params->block_address + GAUDI_ECC_SYNDROME_OFFSET);
6753e65e175bSOded Gabbay 
6754e65e175bSOded Gabbay 	/* Clear error indication */
6755e65e175bSOded Gabbay 	reg = RREG32(params->block_address + GAUDI_ECC_MEM_INFO_CLR_OFFSET);
6756e65e175bSOded Gabbay 	if (params->derr)
6757e65e175bSOded Gabbay 		reg |= FIELD_PREP(GAUDI_ECC_MEM_INFO_CLR_DERR_MASK, 1);
6758e65e175bSOded Gabbay 	else
6759e65e175bSOded Gabbay 		reg |= FIELD_PREP(GAUDI_ECC_MEM_INFO_CLR_SERR_MASK, 1);
6760e65e175bSOded Gabbay 
6761e65e175bSOded Gabbay 	WREG32(params->block_address + GAUDI_ECC_MEM_INFO_CLR_OFFSET, reg);
6762e65e175bSOded Gabbay 
6763e65e175bSOded Gabbay 	return 0;
6764e65e175bSOded Gabbay }
6765e65e175bSOded Gabbay 
6766e65e175bSOded Gabbay /*
6767e65e175bSOded Gabbay  * gaudi_queue_idx_dec - decrement queue index (pi/ci) and handle wrap
6768e65e175bSOded Gabbay  *
6769e65e175bSOded Gabbay  * @idx: the current pi/ci value
6770e65e175bSOded Gabbay  * @q_len: the queue length (power of 2)
6771e65e175bSOded Gabbay  *
6772e65e175bSOded Gabbay  * @return the cyclically decremented index
6773e65e175bSOded Gabbay  */
gaudi_queue_idx_dec(u32 idx,u32 q_len)6774e65e175bSOded Gabbay static inline u32 gaudi_queue_idx_dec(u32 idx, u32 q_len)
6775e65e175bSOded Gabbay {
6776e65e175bSOded Gabbay 	u32 mask = q_len - 1;
6777e65e175bSOded Gabbay 
6778e65e175bSOded Gabbay 	/*
6779e65e175bSOded Gabbay 	 * modular decrement is equivalent to adding (queue_size -1)
6780e65e175bSOded Gabbay 	 * later we take LSBs to make sure the value is in the
6781e65e175bSOded Gabbay 	 * range [0, queue_len - 1]
6782e65e175bSOded Gabbay 	 */
6783e65e175bSOded Gabbay 	return (idx + q_len - 1) & mask;
6784e65e175bSOded Gabbay }
6785e65e175bSOded Gabbay 
6786e65e175bSOded Gabbay /**
6787e65e175bSOded Gabbay  * gaudi_handle_sw_config_stream_data - print SW config stream data
6788e65e175bSOded Gabbay  *
6789e65e175bSOded Gabbay  * @hdev: pointer to the habanalabs device structure
6790e65e175bSOded Gabbay  * @stream: the QMAN's stream
6791e65e175bSOded Gabbay  * @qman_base: base address of QMAN registers block
6792e65e175bSOded Gabbay  * @event_mask: mask of the last events occurred
6793e65e175bSOded Gabbay  */
gaudi_handle_sw_config_stream_data(struct hl_device * hdev,u32 stream,u64 qman_base,u64 event_mask)6794e65e175bSOded Gabbay static void gaudi_handle_sw_config_stream_data(struct hl_device *hdev, u32 stream,
6795e65e175bSOded Gabbay 						u64 qman_base, u64 event_mask)
6796e65e175bSOded Gabbay {
6797e65e175bSOded Gabbay 	u64 cq_ptr_lo, cq_ptr_hi, cq_tsize, cq_ptr;
6798e65e175bSOded Gabbay 	u32 cq_ptr_lo_off, size;
6799e65e175bSOded Gabbay 
6800e65e175bSOded Gabbay 	cq_ptr_lo_off = mmTPC0_QM_CQ_PTR_LO_1 - mmTPC0_QM_CQ_PTR_LO_0;
6801e65e175bSOded Gabbay 
6802e65e175bSOded Gabbay 	cq_ptr_lo = qman_base + (mmTPC0_QM_CQ_PTR_LO_0 - mmTPC0_QM_BASE) +
6803e65e175bSOded Gabbay 						stream * cq_ptr_lo_off;
6804e65e175bSOded Gabbay 	cq_ptr_hi = cq_ptr_lo +
6805e65e175bSOded Gabbay 				(mmTPC0_QM_CQ_PTR_HI_0 - mmTPC0_QM_CQ_PTR_LO_0);
6806e65e175bSOded Gabbay 	cq_tsize = cq_ptr_lo +
6807e65e175bSOded Gabbay 				(mmTPC0_QM_CQ_TSIZE_0 - mmTPC0_QM_CQ_PTR_LO_0);
6808e65e175bSOded Gabbay 
6809e65e175bSOded Gabbay 	cq_ptr = (((u64) RREG32(cq_ptr_hi)) << 32) | RREG32(cq_ptr_lo);
6810e65e175bSOded Gabbay 	size = RREG32(cq_tsize);
6811e65e175bSOded Gabbay 	dev_info(hdev->dev, "stop on err: stream: %u, addr: %#llx, size: %u\n",
6812e65e175bSOded Gabbay 							stream, cq_ptr, size);
6813e65e175bSOded Gabbay 
6814e65e175bSOded Gabbay 	if (event_mask & HL_NOTIFIER_EVENT_UNDEFINED_OPCODE) {
6815e65e175bSOded Gabbay 		hdev->captured_err_info.undef_opcode.cq_addr = cq_ptr;
6816e65e175bSOded Gabbay 		hdev->captured_err_info.undef_opcode.cq_size = size;
6817e65e175bSOded Gabbay 		hdev->captured_err_info.undef_opcode.stream_id = stream;
6818e65e175bSOded Gabbay 	}
6819e65e175bSOded Gabbay }
6820e65e175bSOded Gabbay 
6821e65e175bSOded Gabbay /**
6822e65e175bSOded Gabbay  * gaudi_handle_last_pqes_on_err - print last PQEs on error
6823e65e175bSOded Gabbay  *
6824e65e175bSOded Gabbay  * @hdev: pointer to the habanalabs device structure
6825e65e175bSOded Gabbay  * @qid_base: first QID of the QMAN (out of 4 streams)
6826e65e175bSOded Gabbay  * @stream: the QMAN's stream
6827e65e175bSOded Gabbay  * @qman_base: base address of QMAN registers block
6828e65e175bSOded Gabbay  * @event_mask: mask of the last events occurred
6829e65e175bSOded Gabbay  * @pr_sw_conf: if true print the SW config stream data (CQ PTR and SIZE)
6830e65e175bSOded Gabbay  */
gaudi_handle_last_pqes_on_err(struct hl_device * hdev,u32 qid_base,u32 stream,u64 qman_base,u64 event_mask,bool pr_sw_conf)6831e65e175bSOded Gabbay static void gaudi_handle_last_pqes_on_err(struct hl_device *hdev, u32 qid_base,
6832e65e175bSOded Gabbay 						u32 stream, u64 qman_base,
6833e65e175bSOded Gabbay 						u64 event_mask,
6834e65e175bSOded Gabbay 						bool pr_sw_conf)
6835e65e175bSOded Gabbay {
6836e65e175bSOded Gabbay 	u32 ci, qm_ci_stream_off, queue_len;
6837e65e175bSOded Gabbay 	struct hl_hw_queue *q;
6838e65e175bSOded Gabbay 	u64 pq_ci, addr[PQ_FETCHER_CACHE_SIZE];
6839e65e175bSOded Gabbay 	int i;
6840e65e175bSOded Gabbay 
6841e65e175bSOded Gabbay 	q = &hdev->kernel_queues[qid_base + stream];
6842e65e175bSOded Gabbay 
6843e65e175bSOded Gabbay 	qm_ci_stream_off = mmTPC0_QM_PQ_CI_1 - mmTPC0_QM_PQ_CI_0;
6844e65e175bSOded Gabbay 	pq_ci = qman_base + (mmTPC0_QM_PQ_CI_0 - mmTPC0_QM_BASE) +
6845e65e175bSOded Gabbay 						stream * qm_ci_stream_off;
6846e65e175bSOded Gabbay 
6847e65e175bSOded Gabbay 	queue_len = (q->queue_type == QUEUE_TYPE_INT) ?
6848e65e175bSOded Gabbay 					q->int_queue_len : HL_QUEUE_LENGTH;
6849e65e175bSOded Gabbay 
6850e65e175bSOded Gabbay 	hdev->asic_funcs->hw_queues_lock(hdev);
6851e65e175bSOded Gabbay 
6852e65e175bSOded Gabbay 	if (pr_sw_conf)
6853e65e175bSOded Gabbay 		gaudi_handle_sw_config_stream_data(hdev, stream, qman_base, event_mask);
6854e65e175bSOded Gabbay 
6855e65e175bSOded Gabbay 	ci = RREG32(pq_ci);
6856e65e175bSOded Gabbay 
6857e65e175bSOded Gabbay 	/* we should start printing form ci -1 */
6858e65e175bSOded Gabbay 	ci = gaudi_queue_idx_dec(ci, queue_len);
6859e65e175bSOded Gabbay 	memset(addr, 0, sizeof(addr));
6860e65e175bSOded Gabbay 
6861e65e175bSOded Gabbay 	for (i = 0; i < PQ_FETCHER_CACHE_SIZE; i++) {
6862e65e175bSOded Gabbay 		struct hl_bd *bd;
6863e65e175bSOded Gabbay 		u32 len;
6864e65e175bSOded Gabbay 
6865e65e175bSOded Gabbay 		bd = q->kernel_address;
6866e65e175bSOded Gabbay 		bd += ci;
6867e65e175bSOded Gabbay 
6868e65e175bSOded Gabbay 		len = le32_to_cpu(bd->len);
6869e65e175bSOded Gabbay 		/* len 0 means uninitialized entry- break */
6870e65e175bSOded Gabbay 		if (!len)
6871e65e175bSOded Gabbay 			break;
6872e65e175bSOded Gabbay 
6873e65e175bSOded Gabbay 		addr[i] = le64_to_cpu(bd->ptr);
6874e65e175bSOded Gabbay 
6875e65e175bSOded Gabbay 		dev_info(hdev->dev, "stop on err PQE(stream %u): ci: %u, addr: %#llx, size: %u\n",
6876e65e175bSOded Gabbay 							stream, ci, addr[i], len);
6877e65e175bSOded Gabbay 
6878e65e175bSOded Gabbay 		/* get previous ci, wrap if needed */
6879e65e175bSOded Gabbay 		ci = gaudi_queue_idx_dec(ci, queue_len);
6880e65e175bSOded Gabbay 	}
6881e65e175bSOded Gabbay 
6882e65e175bSOded Gabbay 	if (event_mask & HL_NOTIFIER_EVENT_UNDEFINED_OPCODE) {
6883e65e175bSOded Gabbay 		struct undefined_opcode_info *undef_opcode = &hdev->captured_err_info.undef_opcode;
6884e65e175bSOded Gabbay 		u32 arr_idx = undef_opcode->cb_addr_streams_len;
6885e65e175bSOded Gabbay 
6886e65e175bSOded Gabbay 		if (arr_idx == 0) {
6887e65e175bSOded Gabbay 			undef_opcode->timestamp = ktime_get();
6888e65e175bSOded Gabbay 			undef_opcode->engine_id = gaudi_queue_id_to_engine_id[qid_base];
6889e65e175bSOded Gabbay 		}
6890e65e175bSOded Gabbay 
6891e65e175bSOded Gabbay 		memcpy(undef_opcode->cb_addr_streams[arr_idx], addr, sizeof(addr));
6892e65e175bSOded Gabbay 		undef_opcode->cb_addr_streams_len++;
6893e65e175bSOded Gabbay 	}
6894e65e175bSOded Gabbay 
6895e65e175bSOded Gabbay 	hdev->asic_funcs->hw_queues_unlock(hdev);
6896e65e175bSOded Gabbay }
6897e65e175bSOded Gabbay 
6898e65e175bSOded Gabbay /**
6899e65e175bSOded Gabbay  * handle_qman_data_on_err - extract QMAN data on error
6900e65e175bSOded Gabbay  *
6901e65e175bSOded Gabbay  * @hdev: pointer to the habanalabs device structure
6902e65e175bSOded Gabbay  * @qid_base: first QID of the QMAN (out of 4 streams)
6903e65e175bSOded Gabbay  * @stream: the QMAN's stream
6904e65e175bSOded Gabbay  * @qman_base: base address of QMAN registers block
6905e65e175bSOded Gabbay  * @event_mask: mask of the last events occurred
6906e65e175bSOded Gabbay  *
6907e65e175bSOded Gabbay  * This function attempt to exatract as much data as possible on QMAN error.
6908e65e175bSOded Gabbay  * On upper CP print the SW config stream data and last 8 PQEs.
6909e65e175bSOded Gabbay  * On lower CP print SW config data and last PQEs of ALL 4 upper CPs
6910e65e175bSOded Gabbay  */
handle_qman_data_on_err(struct hl_device * hdev,u32 qid_base,u32 stream,u64 qman_base,u64 event_mask)6911e65e175bSOded Gabbay static void handle_qman_data_on_err(struct hl_device *hdev, u32 qid_base,
6912e65e175bSOded Gabbay 				   u32 stream, u64 qman_base, u64 event_mask)
6913e65e175bSOded Gabbay {
6914e65e175bSOded Gabbay 	u32 i;
6915e65e175bSOded Gabbay 
6916e65e175bSOded Gabbay 	if (stream != QMAN_STREAMS) {
6917e65e175bSOded Gabbay 		gaudi_handle_last_pqes_on_err(hdev, qid_base, stream,
6918e65e175bSOded Gabbay 			qman_base, event_mask, true);
6919e65e175bSOded Gabbay 		return;
6920e65e175bSOded Gabbay 	}
6921e65e175bSOded Gabbay 
6922e65e175bSOded Gabbay 	/* handle Lower-CP */
6923e65e175bSOded Gabbay 	gaudi_handle_sw_config_stream_data(hdev, stream, qman_base, event_mask);
6924e65e175bSOded Gabbay 
6925e65e175bSOded Gabbay 	for (i = 0; i < QMAN_STREAMS; i++)
6926e65e175bSOded Gabbay 		gaudi_handle_last_pqes_on_err(hdev, qid_base, i,
6927e65e175bSOded Gabbay 			qman_base, event_mask, false);
6928e65e175bSOded Gabbay }
6929e65e175bSOded Gabbay 
gaudi_handle_qman_err_generic(struct hl_device * hdev,const char * qm_name,u64 qman_base,u32 qid_base,u64 * event_mask)6930e65e175bSOded Gabbay static void gaudi_handle_qman_err_generic(struct hl_device *hdev,
6931e65e175bSOded Gabbay 					  const char *qm_name,
6932e65e175bSOded Gabbay 					  u64 qman_base,
6933e65e175bSOded Gabbay 					  u32 qid_base,
6934e65e175bSOded Gabbay 					  u64 *event_mask)
6935e65e175bSOded Gabbay {
6936e65e175bSOded Gabbay 	u32 i, j, glbl_sts_val, arb_err_val, glbl_sts_clr_val;
6937e65e175bSOded Gabbay 	u64 glbl_sts_addr, arb_err_addr;
6938e65e175bSOded Gabbay 	char reg_desc[32];
6939e65e175bSOded Gabbay 
6940e65e175bSOded Gabbay 	glbl_sts_addr = qman_base + (mmTPC0_QM_GLBL_STS1_0 - mmTPC0_QM_BASE);
6941e65e175bSOded Gabbay 	arb_err_addr = qman_base + (mmTPC0_QM_ARB_ERR_CAUSE - mmTPC0_QM_BASE);
6942e65e175bSOded Gabbay 
6943e65e175bSOded Gabbay 	/* Iterate through all stream GLBL_STS1 registers + Lower CP */
6944e65e175bSOded Gabbay 	for (i = 0 ; i < QMAN_STREAMS + 1 ; i++) {
6945e65e175bSOded Gabbay 		glbl_sts_clr_val = 0;
6946e65e175bSOded Gabbay 		glbl_sts_val = RREG32(glbl_sts_addr + 4 * i);
6947e65e175bSOded Gabbay 
6948e65e175bSOded Gabbay 		if (!glbl_sts_val)
6949e65e175bSOded Gabbay 			continue;
6950e65e175bSOded Gabbay 
6951e65e175bSOded Gabbay 		if (i == QMAN_STREAMS)
6952e65e175bSOded Gabbay 			snprintf(reg_desc, ARRAY_SIZE(reg_desc), "LowerCP");
6953e65e175bSOded Gabbay 		else
6954e65e175bSOded Gabbay 			snprintf(reg_desc, ARRAY_SIZE(reg_desc), "stream%u", i);
6955e65e175bSOded Gabbay 
6956e65e175bSOded Gabbay 		for (j = 0 ; j < GAUDI_NUM_OF_QM_ERR_CAUSE ; j++) {
6957e65e175bSOded Gabbay 			if (glbl_sts_val & BIT(j)) {
6958e65e175bSOded Gabbay 				dev_err_ratelimited(hdev->dev,
6959e65e175bSOded Gabbay 						"%s %s. err cause: %s\n",
6960e65e175bSOded Gabbay 						qm_name, reg_desc,
6961e65e175bSOded Gabbay 						gaudi_qman_error_cause[j]);
6962e65e175bSOded Gabbay 				glbl_sts_clr_val |= BIT(j);
6963e65e175bSOded Gabbay 			}
6964e65e175bSOded Gabbay 		}
6965e65e175bSOded Gabbay 		/* check for undefined opcode */
6966e65e175bSOded Gabbay 		if (glbl_sts_val & TPC0_QM_GLBL_STS1_CP_UNDEF_CMD_ERR_MASK &&
6967e65e175bSOded Gabbay 				hdev->captured_err_info.undef_opcode.write_enable) {
6968e65e175bSOded Gabbay 			memset(&hdev->captured_err_info.undef_opcode, 0,
6969e65e175bSOded Gabbay 						sizeof(hdev->captured_err_info.undef_opcode));
6970e65e175bSOded Gabbay 
6971e65e175bSOded Gabbay 			hdev->captured_err_info.undef_opcode.write_enable = false;
6972e65e175bSOded Gabbay 			*event_mask |= HL_NOTIFIER_EVENT_UNDEFINED_OPCODE;
6973e65e175bSOded Gabbay 		}
6974e65e175bSOded Gabbay 
6975e65e175bSOded Gabbay 		/* Write 1 clear errors */
6976e65e175bSOded Gabbay 		if (!hdev->stop_on_err)
6977e65e175bSOded Gabbay 			WREG32(glbl_sts_addr + 4 * i, glbl_sts_clr_val);
6978e65e175bSOded Gabbay 		else
6979e65e175bSOded Gabbay 			handle_qman_data_on_err(hdev, qid_base, i, qman_base, *event_mask);
6980e65e175bSOded Gabbay 	}
6981e65e175bSOded Gabbay 
6982e65e175bSOded Gabbay 	arb_err_val = RREG32(arb_err_addr);
6983e65e175bSOded Gabbay 
6984e65e175bSOded Gabbay 	if (!arb_err_val)
6985e65e175bSOded Gabbay 		return;
6986e65e175bSOded Gabbay 
6987e65e175bSOded Gabbay 	for (j = 0 ; j < GAUDI_NUM_OF_QM_ARB_ERR_CAUSE ; j++) {
6988e65e175bSOded Gabbay 		if (arb_err_val & BIT(j)) {
6989e65e175bSOded Gabbay 			dev_err_ratelimited(hdev->dev,
6990e65e175bSOded Gabbay 					"%s ARB_ERR. err cause: %s\n",
6991e65e175bSOded Gabbay 					qm_name,
6992e65e175bSOded Gabbay 					gaudi_qman_arb_error_cause[j]);
6993e65e175bSOded Gabbay 		}
6994e65e175bSOded Gabbay 	}
6995e65e175bSOded Gabbay }
6996e65e175bSOded Gabbay 
gaudi_print_sm_sei_info(struct hl_device * hdev,u16 event_type,struct hl_eq_sm_sei_data * sei_data)6997e65e175bSOded Gabbay static void gaudi_print_sm_sei_info(struct hl_device *hdev, u16 event_type,
6998e65e175bSOded Gabbay 		struct hl_eq_sm_sei_data *sei_data)
6999e65e175bSOded Gabbay {
7000e65e175bSOded Gabbay 	u32 index = event_type - GAUDI_EVENT_DMA_IF_SEI_0;
7001e65e175bSOded Gabbay 
7002e65e175bSOded Gabbay 	/* Flip the bits as the enum is ordered in the opposite way */
7003e65e175bSOded Gabbay 	index = (index ^ 0x3) & 0x3;
7004e65e175bSOded Gabbay 
7005e65e175bSOded Gabbay 	switch (sei_data->sei_cause) {
7006e65e175bSOded Gabbay 	case SM_SEI_SO_OVERFLOW:
7007e65e175bSOded Gabbay 		dev_err_ratelimited(hdev->dev,
7008e65e175bSOded Gabbay 			"%s SEI Error: SOB Group %u overflow/underflow",
7009e65e175bSOded Gabbay 			gaudi_sync_manager_names[index],
7010e65e175bSOded Gabbay 			le32_to_cpu(sei_data->sei_log));
7011e65e175bSOded Gabbay 		break;
7012e65e175bSOded Gabbay 	case SM_SEI_LBW_4B_UNALIGNED:
7013e65e175bSOded Gabbay 		dev_err_ratelimited(hdev->dev,
7014e65e175bSOded Gabbay 			"%s SEI Error: Unaligned 4B LBW access, monitor agent address low - %#x",
7015e65e175bSOded Gabbay 			gaudi_sync_manager_names[index],
7016e65e175bSOded Gabbay 			le32_to_cpu(sei_data->sei_log));
7017e65e175bSOded Gabbay 		break;
7018e65e175bSOded Gabbay 	case SM_SEI_AXI_RESPONSE_ERR:
7019e65e175bSOded Gabbay 		dev_err_ratelimited(hdev->dev,
7020e65e175bSOded Gabbay 			"%s SEI Error: AXI ID %u response error",
7021e65e175bSOded Gabbay 			gaudi_sync_manager_names[index],
7022e65e175bSOded Gabbay 			le32_to_cpu(sei_data->sei_log));
7023e65e175bSOded Gabbay 		break;
7024e65e175bSOded Gabbay 	default:
7025e65e175bSOded Gabbay 		dev_err_ratelimited(hdev->dev, "Unknown SM SEI cause %u",
7026e65e175bSOded Gabbay 				le32_to_cpu(sei_data->sei_log));
7027e65e175bSOded Gabbay 		break;
7028e65e175bSOded Gabbay 	}
7029e65e175bSOded Gabbay }
7030e65e175bSOded Gabbay 
gaudi_handle_ecc_event(struct hl_device * hdev,u16 event_type,struct hl_eq_ecc_data * ecc_data)7031e65e175bSOded Gabbay static void gaudi_handle_ecc_event(struct hl_device *hdev, u16 event_type,
7032e65e175bSOded Gabbay 		struct hl_eq_ecc_data *ecc_data)
7033e65e175bSOded Gabbay {
7034e65e175bSOded Gabbay 	struct ecc_info_extract_params params;
7035e65e175bSOded Gabbay 	u64 ecc_address = 0, ecc_syndrom = 0;
7036e65e175bSOded Gabbay 	u8 index, memory_wrapper_idx = 0;
7037e65e175bSOded Gabbay 	bool extract_info_from_fw;
7038e65e175bSOded Gabbay 	int rc;
7039e65e175bSOded Gabbay 
7040e65e175bSOded Gabbay 	if (hdev->asic_prop.fw_security_enabled) {
7041e65e175bSOded Gabbay 		extract_info_from_fw = true;
7042e65e175bSOded Gabbay 		goto extract_ecc_info;
7043e65e175bSOded Gabbay 	}
7044e65e175bSOded Gabbay 
7045e65e175bSOded Gabbay 	switch (event_type) {
7046e65e175bSOded Gabbay 	case GAUDI_EVENT_PCIE_CORE_SERR ... GAUDI_EVENT_PCIE_PHY_DERR:
7047e65e175bSOded Gabbay 	case GAUDI_EVENT_DMA0_SERR_ECC ... GAUDI_EVENT_MMU_DERR:
7048e65e175bSOded Gabbay 		extract_info_from_fw = true;
7049e65e175bSOded Gabbay 		break;
7050e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC0_SERR ... GAUDI_EVENT_TPC7_SERR:
7051e65e175bSOded Gabbay 		index = event_type - GAUDI_EVENT_TPC0_SERR;
7052e65e175bSOded Gabbay 		params.block_address = mmTPC0_CFG_BASE + index * TPC_CFG_OFFSET;
7053e65e175bSOded Gabbay 		params.num_memories = 90;
7054e65e175bSOded Gabbay 		params.derr = false;
7055e65e175bSOded Gabbay 		extract_info_from_fw = false;
7056e65e175bSOded Gabbay 		break;
7057e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC0_DERR ... GAUDI_EVENT_TPC7_DERR:
7058e65e175bSOded Gabbay 		index = event_type - GAUDI_EVENT_TPC0_DERR;
7059e65e175bSOded Gabbay 		params.block_address =
7060e65e175bSOded Gabbay 			mmTPC0_CFG_BASE + index * TPC_CFG_OFFSET;
7061e65e175bSOded Gabbay 		params.num_memories = 90;
7062e65e175bSOded Gabbay 		params.derr = true;
7063e65e175bSOded Gabbay 		extract_info_from_fw = false;
7064e65e175bSOded Gabbay 		break;
7065e65e175bSOded Gabbay 	case GAUDI_EVENT_MME0_ACC_SERR:
7066e65e175bSOded Gabbay 	case GAUDI_EVENT_MME1_ACC_SERR:
7067e65e175bSOded Gabbay 	case GAUDI_EVENT_MME2_ACC_SERR:
7068e65e175bSOded Gabbay 	case GAUDI_EVENT_MME3_ACC_SERR:
7069e65e175bSOded Gabbay 		index = (event_type - GAUDI_EVENT_MME0_ACC_SERR) / 4;
7070e65e175bSOded Gabbay 		params.block_address = mmMME0_ACC_BASE + index * MME_ACC_OFFSET;
7071e65e175bSOded Gabbay 		params.num_memories = 128;
7072e65e175bSOded Gabbay 		params.derr = false;
7073e65e175bSOded Gabbay 		extract_info_from_fw = false;
7074e65e175bSOded Gabbay 		break;
7075e65e175bSOded Gabbay 	case GAUDI_EVENT_MME0_ACC_DERR:
7076e65e175bSOded Gabbay 	case GAUDI_EVENT_MME1_ACC_DERR:
7077e65e175bSOded Gabbay 	case GAUDI_EVENT_MME2_ACC_DERR:
7078e65e175bSOded Gabbay 	case GAUDI_EVENT_MME3_ACC_DERR:
7079e65e175bSOded Gabbay 		index = (event_type - GAUDI_EVENT_MME0_ACC_DERR) / 4;
7080e65e175bSOded Gabbay 		params.block_address = mmMME0_ACC_BASE + index * MME_ACC_OFFSET;
7081e65e175bSOded Gabbay 		params.num_memories = 128;
7082e65e175bSOded Gabbay 		params.derr = true;
7083e65e175bSOded Gabbay 		extract_info_from_fw = false;
7084e65e175bSOded Gabbay 		break;
7085e65e175bSOded Gabbay 	case GAUDI_EVENT_MME0_SBAB_SERR:
7086e65e175bSOded Gabbay 	case GAUDI_EVENT_MME1_SBAB_SERR:
7087e65e175bSOded Gabbay 	case GAUDI_EVENT_MME2_SBAB_SERR:
7088e65e175bSOded Gabbay 	case GAUDI_EVENT_MME3_SBAB_SERR:
7089e65e175bSOded Gabbay 		index = (event_type - GAUDI_EVENT_MME0_SBAB_SERR) / 4;
7090e65e175bSOded Gabbay 		params.block_address =
7091e65e175bSOded Gabbay 			mmMME0_SBAB_BASE + index * MME_ACC_OFFSET;
7092e65e175bSOded Gabbay 		params.num_memories = 33;
7093e65e175bSOded Gabbay 		params.derr = false;
7094e65e175bSOded Gabbay 		extract_info_from_fw = false;
7095e65e175bSOded Gabbay 		break;
7096e65e175bSOded Gabbay 	case GAUDI_EVENT_MME0_SBAB_DERR:
7097e65e175bSOded Gabbay 	case GAUDI_EVENT_MME1_SBAB_DERR:
7098e65e175bSOded Gabbay 	case GAUDI_EVENT_MME2_SBAB_DERR:
7099e65e175bSOded Gabbay 	case GAUDI_EVENT_MME3_SBAB_DERR:
7100e65e175bSOded Gabbay 		index = (event_type - GAUDI_EVENT_MME0_SBAB_DERR) / 4;
7101e65e175bSOded Gabbay 		params.block_address =
7102e65e175bSOded Gabbay 			mmMME0_SBAB_BASE + index * MME_ACC_OFFSET;
7103e65e175bSOded Gabbay 		params.num_memories = 33;
7104e65e175bSOded Gabbay 		params.derr = true;
7105e65e175bSOded Gabbay 		extract_info_from_fw = false;
7106e65e175bSOded Gabbay 		break;
7107e65e175bSOded Gabbay 	default:
7108e65e175bSOded Gabbay 		return;
7109e65e175bSOded Gabbay 	}
7110e65e175bSOded Gabbay 
7111e65e175bSOded Gabbay extract_ecc_info:
7112e65e175bSOded Gabbay 	if (extract_info_from_fw) {
7113e65e175bSOded Gabbay 		ecc_address = le64_to_cpu(ecc_data->ecc_address);
7114e65e175bSOded Gabbay 		ecc_syndrom = le64_to_cpu(ecc_data->ecc_syndrom);
7115e65e175bSOded Gabbay 		memory_wrapper_idx = ecc_data->memory_wrapper_idx;
7116e65e175bSOded Gabbay 	} else {
7117e65e175bSOded Gabbay 		rc = gaudi_extract_ecc_info(hdev, &params, &ecc_address,
7118e65e175bSOded Gabbay 				&ecc_syndrom, &memory_wrapper_idx);
7119e65e175bSOded Gabbay 		if (rc)
7120e65e175bSOded Gabbay 			return;
7121e65e175bSOded Gabbay 	}
7122e65e175bSOded Gabbay 
7123e65e175bSOded Gabbay 	dev_err(hdev->dev,
7124e65e175bSOded Gabbay 		"ECC error detected. address: %#llx. Syndrom: %#llx. block id %u\n",
7125e65e175bSOded Gabbay 		ecc_address, ecc_syndrom, memory_wrapper_idx);
7126e65e175bSOded Gabbay }
7127e65e175bSOded Gabbay 
gaudi_handle_qman_err(struct hl_device * hdev,u16 event_type,u64 * event_mask)7128e65e175bSOded Gabbay static void gaudi_handle_qman_err(struct hl_device *hdev, u16 event_type, u64 *event_mask)
7129e65e175bSOded Gabbay {
7130e65e175bSOded Gabbay 	u64 qman_base;
7131e65e175bSOded Gabbay 	char desc[32];
7132e65e175bSOded Gabbay 	u32 qid_base;
7133e65e175bSOded Gabbay 	u8 index;
7134e65e175bSOded Gabbay 
7135e65e175bSOded Gabbay 	switch (event_type) {
7136e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC0_QM ... GAUDI_EVENT_TPC7_QM:
7137e65e175bSOded Gabbay 		index = event_type - GAUDI_EVENT_TPC0_QM;
7138e65e175bSOded Gabbay 		qid_base = GAUDI_QUEUE_ID_TPC_0_0 + index * QMAN_STREAMS;
7139e65e175bSOded Gabbay 		qman_base = mmTPC0_QM_BASE + index * TPC_QMAN_OFFSET;
7140e65e175bSOded Gabbay 		snprintf(desc, ARRAY_SIZE(desc), "%s%d", "TPC_QM", index);
7141e65e175bSOded Gabbay 		break;
7142e65e175bSOded Gabbay 	case GAUDI_EVENT_MME0_QM ... GAUDI_EVENT_MME2_QM:
7143e65e175bSOded Gabbay 		if (event_type == GAUDI_EVENT_MME0_QM) {
7144e65e175bSOded Gabbay 			index = 0;
7145e65e175bSOded Gabbay 			qid_base = GAUDI_QUEUE_ID_MME_0_0;
7146e65e175bSOded Gabbay 		} else { /* event_type == GAUDI_EVENT_MME2_QM */
7147e65e175bSOded Gabbay 			index = 2;
7148e65e175bSOded Gabbay 			qid_base = GAUDI_QUEUE_ID_MME_1_0;
7149e65e175bSOded Gabbay 		}
7150e65e175bSOded Gabbay 		qman_base = mmMME0_QM_BASE + index * MME_QMAN_OFFSET;
7151e65e175bSOded Gabbay 		snprintf(desc, ARRAY_SIZE(desc), "%s%d", "MME_QM", index);
7152e65e175bSOded Gabbay 		break;
7153e65e175bSOded Gabbay 	case GAUDI_EVENT_DMA0_QM ... GAUDI_EVENT_DMA7_QM:
7154e65e175bSOded Gabbay 		index = event_type - GAUDI_EVENT_DMA0_QM;
7155e65e175bSOded Gabbay 		qid_base = GAUDI_QUEUE_ID_DMA_0_0 + index * QMAN_STREAMS;
7156e65e175bSOded Gabbay 		/* skip GAUDI_QUEUE_ID_CPU_PQ if necessary */
7157e65e175bSOded Gabbay 		if (index > 1)
7158e65e175bSOded Gabbay 			qid_base++;
7159e65e175bSOded Gabbay 		qman_base = mmDMA0_QM_BASE + index * DMA_QMAN_OFFSET;
7160e65e175bSOded Gabbay 		snprintf(desc, ARRAY_SIZE(desc), "%s%d", "DMA_QM", index);
7161e65e175bSOded Gabbay 		break;
7162e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC0_QM0:
7163e65e175bSOded Gabbay 		qid_base = GAUDI_QUEUE_ID_NIC_0_0;
7164e65e175bSOded Gabbay 		qman_base = mmNIC0_QM0_BASE;
7165e65e175bSOded Gabbay 		snprintf(desc, ARRAY_SIZE(desc), "NIC0_QM0");
7166e65e175bSOded Gabbay 		break;
7167e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC0_QM1:
7168e65e175bSOded Gabbay 		qid_base = GAUDI_QUEUE_ID_NIC_1_0;
7169e65e175bSOded Gabbay 		qman_base = mmNIC0_QM1_BASE;
7170e65e175bSOded Gabbay 		snprintf(desc, ARRAY_SIZE(desc), "NIC0_QM1");
7171e65e175bSOded Gabbay 		break;
7172e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC1_QM0:
7173e65e175bSOded Gabbay 		qid_base = GAUDI_QUEUE_ID_NIC_2_0;
7174e65e175bSOded Gabbay 		qman_base = mmNIC1_QM0_BASE;
7175e65e175bSOded Gabbay 		snprintf(desc, ARRAY_SIZE(desc), "NIC1_QM0");
7176e65e175bSOded Gabbay 		break;
7177e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC1_QM1:
7178e65e175bSOded Gabbay 		qid_base = GAUDI_QUEUE_ID_NIC_3_0;
7179e65e175bSOded Gabbay 		qman_base = mmNIC1_QM1_BASE;
7180e65e175bSOded Gabbay 		snprintf(desc, ARRAY_SIZE(desc), "NIC1_QM1");
7181e65e175bSOded Gabbay 		break;
7182e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC2_QM0:
7183e65e175bSOded Gabbay 		qid_base = GAUDI_QUEUE_ID_NIC_4_0;
7184e65e175bSOded Gabbay 		qman_base = mmNIC2_QM0_BASE;
7185e65e175bSOded Gabbay 		snprintf(desc, ARRAY_SIZE(desc), "NIC2_QM0");
7186e65e175bSOded Gabbay 		break;
7187e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC2_QM1:
7188e65e175bSOded Gabbay 		qid_base = GAUDI_QUEUE_ID_NIC_5_0;
7189e65e175bSOded Gabbay 		qman_base = mmNIC2_QM1_BASE;
7190e65e175bSOded Gabbay 		snprintf(desc, ARRAY_SIZE(desc), "NIC2_QM1");
7191e65e175bSOded Gabbay 		break;
7192e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC3_QM0:
7193e65e175bSOded Gabbay 		qid_base = GAUDI_QUEUE_ID_NIC_6_0;
7194e65e175bSOded Gabbay 		qman_base = mmNIC3_QM0_BASE;
7195e65e175bSOded Gabbay 		snprintf(desc, ARRAY_SIZE(desc), "NIC3_QM0");
7196e65e175bSOded Gabbay 		break;
7197e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC3_QM1:
7198e65e175bSOded Gabbay 		qid_base = GAUDI_QUEUE_ID_NIC_7_0;
7199e65e175bSOded Gabbay 		qman_base = mmNIC3_QM1_BASE;
7200e65e175bSOded Gabbay 		snprintf(desc, ARRAY_SIZE(desc), "NIC3_QM1");
7201e65e175bSOded Gabbay 		break;
7202e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC4_QM0:
7203e65e175bSOded Gabbay 		qid_base = GAUDI_QUEUE_ID_NIC_8_0;
7204e65e175bSOded Gabbay 		qman_base = mmNIC4_QM0_BASE;
7205e65e175bSOded Gabbay 		snprintf(desc, ARRAY_SIZE(desc), "NIC4_QM0");
7206e65e175bSOded Gabbay 		break;
7207e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC4_QM1:
7208e65e175bSOded Gabbay 		qid_base = GAUDI_QUEUE_ID_NIC_9_0;
7209e65e175bSOded Gabbay 		qman_base = mmNIC4_QM1_BASE;
7210e65e175bSOded Gabbay 		snprintf(desc, ARRAY_SIZE(desc), "NIC4_QM1");
7211e65e175bSOded Gabbay 		break;
7212e65e175bSOded Gabbay 	default:
7213e65e175bSOded Gabbay 		return;
7214e65e175bSOded Gabbay 	}
7215e65e175bSOded Gabbay 
7216e65e175bSOded Gabbay 	gaudi_handle_qman_err_generic(hdev, desc, qman_base, qid_base, event_mask);
7217e65e175bSOded Gabbay }
7218e65e175bSOded Gabbay 
gaudi_print_irq_info(struct hl_device * hdev,u16 event_type,bool check_razwi,u64 * event_mask)7219e65e175bSOded Gabbay static void gaudi_print_irq_info(struct hl_device *hdev, u16 event_type,
72204b9c2d36SKoby Elbaz 					bool check_razwi, u64 *event_mask)
7221e65e175bSOded Gabbay {
7222e65e175bSOded Gabbay 	bool is_read = false, is_write = false;
7223e65e175bSOded Gabbay 	u16 engine_id[2], num_of_razwi_eng = 0;
7224e65e175bSOded Gabbay 	char desc[64] = "";
7225e65e175bSOded Gabbay 	u64 razwi_addr = 0;
7226e65e175bSOded Gabbay 	u8 razwi_flags = 0;
7227e65e175bSOded Gabbay 
7228e65e175bSOded Gabbay 	/*
7229e65e175bSOded Gabbay 	 * Init engine id by default as not valid and only if razwi initiated from engine with
7230e65e175bSOded Gabbay 	 * engine id it will get valid value.
7231e65e175bSOded Gabbay 	 */
7232e65e175bSOded Gabbay 	engine_id[0] = HL_RAZWI_NA_ENG_ID;
7233e65e175bSOded Gabbay 	engine_id[1] = HL_RAZWI_NA_ENG_ID;
7234e65e175bSOded Gabbay 
7235e65e175bSOded Gabbay 	gaudi_get_event_desc(event_type, desc, sizeof(desc));
7236e65e175bSOded Gabbay 	dev_err_ratelimited(hdev->dev, "Received H/W interrupt %d [\"%s\"]\n",
7237e65e175bSOded Gabbay 		event_type, desc);
7238e65e175bSOded Gabbay 
72394b9c2d36SKoby Elbaz 	if (check_razwi) {
7240e65e175bSOded Gabbay 		gaudi_print_and_get_razwi_info(hdev, &engine_id[0], &engine_id[1], &is_read,
7241e65e175bSOded Gabbay 						&is_write);
7242e65e175bSOded Gabbay 		gaudi_print_and_get_mmu_error_info(hdev, &razwi_addr, event_mask);
7243e65e175bSOded Gabbay 
7244e65e175bSOded Gabbay 		if (is_read)
7245e65e175bSOded Gabbay 			razwi_flags |= HL_RAZWI_READ;
7246e65e175bSOded Gabbay 		if (is_write)
7247e65e175bSOded Gabbay 			razwi_flags |= HL_RAZWI_WRITE;
7248e65e175bSOded Gabbay 
7249e65e175bSOded Gabbay 		if (engine_id[0] != HL_RAZWI_NA_ENG_ID) {
7250e65e175bSOded Gabbay 			if (engine_id[1] != HL_RAZWI_NA_ENG_ID)
7251e65e175bSOded Gabbay 				num_of_razwi_eng = 2;
7252e65e175bSOded Gabbay 			else
7253e65e175bSOded Gabbay 				num_of_razwi_eng = 1;
7254e65e175bSOded Gabbay 		}
7255e65e175bSOded Gabbay 
72564b9c2d36SKoby Elbaz 		if (razwi_flags)
72574b9c2d36SKoby Elbaz 			hl_handle_razwi(hdev, razwi_addr, engine_id, num_of_razwi_eng,
72584b9c2d36SKoby Elbaz 					razwi_flags, event_mask);
7259e65e175bSOded Gabbay 	}
7260e65e175bSOded Gabbay }
7261e65e175bSOded Gabbay 
gaudi_print_out_of_sync_info(struct hl_device * hdev,struct cpucp_pkt_sync_err * sync_err)7262e65e175bSOded Gabbay static void gaudi_print_out_of_sync_info(struct hl_device *hdev,
7263e65e175bSOded Gabbay 					struct cpucp_pkt_sync_err *sync_err)
7264e65e175bSOded Gabbay {
7265e65e175bSOded Gabbay 	struct hl_hw_queue *q = &hdev->kernel_queues[GAUDI_QUEUE_ID_CPU_PQ];
7266e65e175bSOded Gabbay 
7267e65e175bSOded Gabbay 	dev_err(hdev->dev, "Out of sync with FW, FW: pi=%u, ci=%u, LKD: pi=%u, ci=%d\n",
7268e65e175bSOded Gabbay 		le32_to_cpu(sync_err->pi), le32_to_cpu(sync_err->ci), q->pi, atomic_read(&q->ci));
7269e65e175bSOded Gabbay }
7270e65e175bSOded Gabbay 
gaudi_print_fw_alive_info(struct hl_device * hdev,struct hl_eq_fw_alive * fw_alive)7271e65e175bSOded Gabbay static void gaudi_print_fw_alive_info(struct hl_device *hdev,
7272e65e175bSOded Gabbay 					struct hl_eq_fw_alive *fw_alive)
7273e65e175bSOded Gabbay {
7274e65e175bSOded Gabbay 	dev_err(hdev->dev,
7275e65e175bSOded Gabbay 		"FW alive report: severity=%s, process_id=%u, thread_id=%u, uptime=%llu seconds\n",
7276e65e175bSOded Gabbay 		(fw_alive->severity == FW_ALIVE_SEVERITY_MINOR) ? "Minor" : "Critical",
7277e65e175bSOded Gabbay 		le32_to_cpu(fw_alive->process_id),
7278e65e175bSOded Gabbay 		le32_to_cpu(fw_alive->thread_id),
7279e65e175bSOded Gabbay 		le64_to_cpu(fw_alive->uptime_seconds));
7280e65e175bSOded Gabbay }
7281e65e175bSOded Gabbay 
gaudi_print_nic_axi_irq_info(struct hl_device * hdev,u16 event_type,void * data)7282e65e175bSOded Gabbay static void gaudi_print_nic_axi_irq_info(struct hl_device *hdev, u16 event_type,
7283e65e175bSOded Gabbay 						void *data)
7284e65e175bSOded Gabbay {
7285e65e175bSOded Gabbay 	char desc[64] = "", *type;
7286e65e175bSOded Gabbay 	struct eq_nic_sei_event *eq_nic_sei = data;
7287e65e175bSOded Gabbay 	u16 nic_id = event_type - GAUDI_EVENT_NIC_SEI_0;
7288e65e175bSOded Gabbay 
7289e65e175bSOded Gabbay 	switch (eq_nic_sei->axi_error_cause) {
7290e65e175bSOded Gabbay 	case RXB:
7291e65e175bSOded Gabbay 		type = "RXB";
7292e65e175bSOded Gabbay 		break;
7293e65e175bSOded Gabbay 	case RXE:
7294e65e175bSOded Gabbay 		type = "RXE";
7295e65e175bSOded Gabbay 		break;
7296e65e175bSOded Gabbay 	case TXS:
7297e65e175bSOded Gabbay 		type = "TXS";
7298e65e175bSOded Gabbay 		break;
7299e65e175bSOded Gabbay 	case TXE:
7300e65e175bSOded Gabbay 		type = "TXE";
7301e65e175bSOded Gabbay 		break;
7302e65e175bSOded Gabbay 	case QPC_RESP:
7303e65e175bSOded Gabbay 		type = "QPC_RESP";
7304e65e175bSOded Gabbay 		break;
7305e65e175bSOded Gabbay 	case NON_AXI_ERR:
7306e65e175bSOded Gabbay 		type = "NON_AXI_ERR";
7307e65e175bSOded Gabbay 		break;
7308e65e175bSOded Gabbay 	case TMR:
7309e65e175bSOded Gabbay 		type = "TMR";
7310e65e175bSOded Gabbay 		break;
7311e65e175bSOded Gabbay 	default:
7312e65e175bSOded Gabbay 		dev_err(hdev->dev, "unknown NIC AXI cause %d\n",
7313e65e175bSOded Gabbay 			eq_nic_sei->axi_error_cause);
7314e65e175bSOded Gabbay 		type = "N/A";
7315e65e175bSOded Gabbay 		break;
7316e65e175bSOded Gabbay 	}
7317e65e175bSOded Gabbay 
7318e65e175bSOded Gabbay 	snprintf(desc, sizeof(desc), "NIC%d_%s%d", nic_id, type,
7319e65e175bSOded Gabbay 			eq_nic_sei->id);
7320e65e175bSOded Gabbay 	dev_err_ratelimited(hdev->dev, "Received H/W interrupt %d [\"%s\"]\n",
7321e65e175bSOded Gabbay 		event_type, desc);
7322e65e175bSOded Gabbay }
7323e65e175bSOded Gabbay 
gaudi_compute_reset_late_init(struct hl_device * hdev)7324e65e175bSOded Gabbay static int gaudi_compute_reset_late_init(struct hl_device *hdev)
7325e65e175bSOded Gabbay {
7326e65e175bSOded Gabbay 	/* GAUDI doesn't support any reset except hard-reset */
7327e65e175bSOded Gabbay 	return -EPERM;
7328e65e175bSOded Gabbay }
7329e65e175bSOded Gabbay 
gaudi_hbm_read_interrupts(struct hl_device * hdev,int device,struct hl_eq_hbm_ecc_data * hbm_ecc_data)7330e65e175bSOded Gabbay static int gaudi_hbm_read_interrupts(struct hl_device *hdev, int device,
7331e65e175bSOded Gabbay 			struct hl_eq_hbm_ecc_data *hbm_ecc_data)
7332e65e175bSOded Gabbay {
7333e65e175bSOded Gabbay 	u32 base, val, val2, wr_par, rd_par, ca_par, derr, serr, type, ch;
7334e65e175bSOded Gabbay 	int rc = 0;
7335e65e175bSOded Gabbay 
7336e65e175bSOded Gabbay 	if (hdev->asic_prop.fw_app_cpu_boot_dev_sts0 &
7337e65e175bSOded Gabbay 					CPU_BOOT_DEV_STS0_HBM_ECC_EN) {
7338e65e175bSOded Gabbay 		if (!hbm_ecc_data) {
7339e65e175bSOded Gabbay 			dev_err(hdev->dev, "No FW ECC data");
7340e65e175bSOded Gabbay 			return 0;
7341e65e175bSOded Gabbay 		}
7342e65e175bSOded Gabbay 
7343e65e175bSOded Gabbay 		wr_par = FIELD_GET(CPUCP_PKT_HBM_ECC_INFO_WR_PAR_MASK,
7344e65e175bSOded Gabbay 				le32_to_cpu(hbm_ecc_data->hbm_ecc_info));
7345e65e175bSOded Gabbay 		rd_par = FIELD_GET(CPUCP_PKT_HBM_ECC_INFO_RD_PAR_MASK,
7346e65e175bSOded Gabbay 				le32_to_cpu(hbm_ecc_data->hbm_ecc_info));
7347e65e175bSOded Gabbay 		ca_par = FIELD_GET(CPUCP_PKT_HBM_ECC_INFO_CA_PAR_MASK,
7348e65e175bSOded Gabbay 				le32_to_cpu(hbm_ecc_data->hbm_ecc_info));
7349e65e175bSOded Gabbay 		derr = FIELD_GET(CPUCP_PKT_HBM_ECC_INFO_DERR_MASK,
7350e65e175bSOded Gabbay 				le32_to_cpu(hbm_ecc_data->hbm_ecc_info));
7351e65e175bSOded Gabbay 		serr = FIELD_GET(CPUCP_PKT_HBM_ECC_INFO_SERR_MASK,
7352e65e175bSOded Gabbay 				le32_to_cpu(hbm_ecc_data->hbm_ecc_info));
7353e65e175bSOded Gabbay 		type = FIELD_GET(CPUCP_PKT_HBM_ECC_INFO_TYPE_MASK,
7354e65e175bSOded Gabbay 				le32_to_cpu(hbm_ecc_data->hbm_ecc_info));
7355e65e175bSOded Gabbay 		ch = FIELD_GET(CPUCP_PKT_HBM_ECC_INFO_HBM_CH_MASK,
7356e65e175bSOded Gabbay 				le32_to_cpu(hbm_ecc_data->hbm_ecc_info));
7357e65e175bSOded Gabbay 
7358e65e175bSOded Gabbay 		dev_err(hdev->dev,
7359e65e175bSOded Gabbay 			"HBM%d pc%d interrupts info: WR_PAR=%d, RD_PAR=%d, CA_PAR=%d, SERR=%d, DERR=%d\n",
7360e65e175bSOded Gabbay 			device, ch, wr_par, rd_par, ca_par, serr, derr);
7361e65e175bSOded Gabbay 		dev_err(hdev->dev,
7362e65e175bSOded Gabbay 			"HBM%d pc%d ECC info: 1ST_ERR_ADDR=0x%x, 1ST_ERR_TYPE=%d, SEC_CONT_CNT=%u, SEC_CNT=%d, DEC_CNT=%d\n",
7363e65e175bSOded Gabbay 			device, ch, hbm_ecc_data->first_addr, type,
7364e65e175bSOded Gabbay 			hbm_ecc_data->sec_cont_cnt, hbm_ecc_data->sec_cnt,
7365e65e175bSOded Gabbay 			hbm_ecc_data->dec_cnt);
7366e65e175bSOded Gabbay 		return 0;
7367e65e175bSOded Gabbay 	}
7368e65e175bSOded Gabbay 
7369e65e175bSOded Gabbay 	if (hdev->asic_prop.fw_security_enabled) {
7370e65e175bSOded Gabbay 		dev_info(hdev->dev, "Cannot access MC regs for ECC data while security is enabled\n");
7371e65e175bSOded Gabbay 		return 0;
7372e65e175bSOded Gabbay 	}
7373e65e175bSOded Gabbay 
7374e65e175bSOded Gabbay 	base = GAUDI_HBM_CFG_BASE + device * GAUDI_HBM_CFG_OFFSET;
7375e65e175bSOded Gabbay 	for (ch = 0 ; ch < GAUDI_HBM_CHANNELS ; ch++) {
7376e65e175bSOded Gabbay 		val = RREG32_MASK(base + ch * 0x1000 + 0x06C, 0x0000FFFF);
7377e65e175bSOded Gabbay 		val = (val & 0xFF) | ((val >> 8) & 0xFF);
7378e65e175bSOded Gabbay 		if (val) {
7379e65e175bSOded Gabbay 			rc = -EIO;
7380e65e175bSOded Gabbay 			dev_err(hdev->dev,
7381e65e175bSOded Gabbay 				"HBM%d pc%d interrupts info: WR_PAR=%d, RD_PAR=%d, CA_PAR=%d, SERR=%d, DERR=%d\n",
7382e65e175bSOded Gabbay 				device, ch * 2, val & 0x1, (val >> 1) & 0x1,
7383e65e175bSOded Gabbay 				(val >> 2) & 0x1, (val >> 3) & 0x1,
7384e65e175bSOded Gabbay 				(val >> 4) & 0x1);
7385e65e175bSOded Gabbay 
7386e65e175bSOded Gabbay 			val2 = RREG32(base + ch * 0x1000 + 0x060);
7387e65e175bSOded Gabbay 			dev_err(hdev->dev,
7388e65e175bSOded Gabbay 				"HBM%d pc%d ECC info: 1ST_ERR_ADDR=0x%x, 1ST_ERR_TYPE=%d, SEC_CONT_CNT=%d, SEC_CNT=%d, DEC_CNT=%d\n",
7389e65e175bSOded Gabbay 				device, ch * 2,
7390e65e175bSOded Gabbay 				RREG32(base + ch * 0x1000 + 0x064),
7391e65e175bSOded Gabbay 				(val2 & 0x200) >> 9, (val2 & 0xFC00) >> 10,
7392e65e175bSOded Gabbay 				(val2 & 0xFF0000) >> 16,
7393e65e175bSOded Gabbay 				(val2 & 0xFF000000) >> 24);
7394e65e175bSOded Gabbay 		}
7395e65e175bSOded Gabbay 
7396e65e175bSOded Gabbay 		val = RREG32_MASK(base + ch * 0x1000 + 0x07C, 0x0000FFFF);
7397e65e175bSOded Gabbay 		val = (val & 0xFF) | ((val >> 8) & 0xFF);
7398e65e175bSOded Gabbay 		if (val) {
7399e65e175bSOded Gabbay 			rc = -EIO;
7400e65e175bSOded Gabbay 			dev_err(hdev->dev,
7401e65e175bSOded Gabbay 				"HBM%d pc%d interrupts info: WR_PAR=%d, RD_PAR=%d, CA_PAR=%d, SERR=%d, DERR=%d\n",
7402e65e175bSOded Gabbay 				device, ch * 2 + 1, val & 0x1, (val >> 1) & 0x1,
7403e65e175bSOded Gabbay 				(val >> 2) & 0x1, (val >> 3) & 0x1,
7404e65e175bSOded Gabbay 				(val >> 4) & 0x1);
7405e65e175bSOded Gabbay 
7406e65e175bSOded Gabbay 			val2 = RREG32(base + ch * 0x1000 + 0x070);
7407e65e175bSOded Gabbay 			dev_err(hdev->dev,
7408e65e175bSOded Gabbay 				"HBM%d pc%d ECC info: 1ST_ERR_ADDR=0x%x, 1ST_ERR_TYPE=%d, SEC_CONT_CNT=%d, SEC_CNT=%d, DEC_CNT=%d\n",
7409e65e175bSOded Gabbay 				device, ch * 2 + 1,
7410e65e175bSOded Gabbay 				RREG32(base + ch * 0x1000 + 0x074),
7411e65e175bSOded Gabbay 				(val2 & 0x200) >> 9, (val2 & 0xFC00) >> 10,
7412e65e175bSOded Gabbay 				(val2 & 0xFF0000) >> 16,
7413e65e175bSOded Gabbay 				(val2 & 0xFF000000) >> 24);
7414e65e175bSOded Gabbay 		}
7415e65e175bSOded Gabbay 
7416e65e175bSOded Gabbay 		/* Clear interrupts */
7417e65e175bSOded Gabbay 		RMWREG32(base + (ch * 0x1000) + 0x060, 0x1C8, 0x1FF);
7418e65e175bSOded Gabbay 		RMWREG32(base + (ch * 0x1000) + 0x070, 0x1C8, 0x1FF);
7419e65e175bSOded Gabbay 		WREG32(base + (ch * 0x1000) + 0x06C, 0x1F1F);
7420e65e175bSOded Gabbay 		WREG32(base + (ch * 0x1000) + 0x07C, 0x1F1F);
7421e65e175bSOded Gabbay 		RMWREG32(base + (ch * 0x1000) + 0x060, 0x0, 0xF);
7422e65e175bSOded Gabbay 		RMWREG32(base + (ch * 0x1000) + 0x070, 0x0, 0xF);
7423e65e175bSOded Gabbay 	}
7424e65e175bSOded Gabbay 
7425e65e175bSOded Gabbay 	val  = RREG32(base + 0x8F30);
7426e65e175bSOded Gabbay 	val2 = RREG32(base + 0x8F34);
7427e65e175bSOded Gabbay 	if (val | val2) {
7428e65e175bSOded Gabbay 		rc = -EIO;
7429e65e175bSOded Gabbay 		dev_err(hdev->dev,
7430e65e175bSOded Gabbay 			"HBM %d MC SRAM SERR info: Reg 0x8F30=0x%x, Reg 0x8F34=0x%x\n",
7431e65e175bSOded Gabbay 			device, val, val2);
7432e65e175bSOded Gabbay 	}
7433e65e175bSOded Gabbay 	val  = RREG32(base + 0x8F40);
7434e65e175bSOded Gabbay 	val2 = RREG32(base + 0x8F44);
7435e65e175bSOded Gabbay 	if (val | val2) {
7436e65e175bSOded Gabbay 		rc = -EIO;
7437e65e175bSOded Gabbay 		dev_err(hdev->dev,
7438e65e175bSOded Gabbay 			"HBM %d MC SRAM DERR info: Reg 0x8F40=0x%x, Reg 0x8F44=0x%x\n",
7439e65e175bSOded Gabbay 			device, val, val2);
7440e65e175bSOded Gabbay 	}
7441e65e175bSOded Gabbay 
7442e65e175bSOded Gabbay 	return rc;
7443e65e175bSOded Gabbay }
7444e65e175bSOded Gabbay 
gaudi_hbm_event_to_dev(u16 hbm_event_type)7445e65e175bSOded Gabbay static int gaudi_hbm_event_to_dev(u16 hbm_event_type)
7446e65e175bSOded Gabbay {
7447e65e175bSOded Gabbay 	switch (hbm_event_type) {
7448e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM0_SPI_0:
7449e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM0_SPI_1:
7450e65e175bSOded Gabbay 		return 0;
7451e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM1_SPI_0:
7452e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM1_SPI_1:
7453e65e175bSOded Gabbay 		return 1;
7454e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM2_SPI_0:
7455e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM2_SPI_1:
7456e65e175bSOded Gabbay 		return 2;
7457e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM3_SPI_0:
7458e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM3_SPI_1:
7459e65e175bSOded Gabbay 		return 3;
7460e65e175bSOded Gabbay 	default:
7461e65e175bSOded Gabbay 		break;
7462e65e175bSOded Gabbay 	}
7463e65e175bSOded Gabbay 
7464e65e175bSOded Gabbay 	/* Should never happen */
7465e65e175bSOded Gabbay 	return 0;
7466e65e175bSOded Gabbay }
7467e65e175bSOded Gabbay 
gaudi_tpc_read_interrupts(struct hl_device * hdev,u8 tpc_id,char * interrupt_name)7468e65e175bSOded Gabbay static bool gaudi_tpc_read_interrupts(struct hl_device *hdev, u8 tpc_id,
7469e65e175bSOded Gabbay 					char *interrupt_name)
7470e65e175bSOded Gabbay {
7471e65e175bSOded Gabbay 	u32 tpc_offset = tpc_id * TPC_CFG_OFFSET, tpc_interrupts_cause, i;
7472e65e175bSOded Gabbay 	bool soft_reset_required = false;
7473e65e175bSOded Gabbay 
7474e65e175bSOded Gabbay 	tpc_interrupts_cause = RREG32(mmTPC0_CFG_TPC_INTR_CAUSE + tpc_offset) &
7475e65e175bSOded Gabbay 				TPC0_CFG_TPC_INTR_CAUSE_CAUSE_MASK;
7476e65e175bSOded Gabbay 
7477e65e175bSOded Gabbay 	for (i = 0 ; i < GAUDI_NUM_OF_TPC_INTR_CAUSE ; i++)
7478e65e175bSOded Gabbay 		if (tpc_interrupts_cause & BIT(i)) {
7479e65e175bSOded Gabbay 			dev_err_ratelimited(hdev->dev,
7480e65e175bSOded Gabbay 					"TPC%d_%s interrupt cause: %s\n",
7481e65e175bSOded Gabbay 					tpc_id, interrupt_name,
7482e65e175bSOded Gabbay 					gaudi_tpc_interrupts_cause[i]);
7483e65e175bSOded Gabbay 			/* If this is QM error, we need to soft-reset */
7484e65e175bSOded Gabbay 			if (i == 15)
7485e65e175bSOded Gabbay 				soft_reset_required = true;
7486e65e175bSOded Gabbay 		}
7487e65e175bSOded Gabbay 
7488e65e175bSOded Gabbay 	/* Clear interrupts */
7489e65e175bSOded Gabbay 	WREG32(mmTPC0_CFG_TPC_INTR_CAUSE + tpc_offset, 0);
7490e65e175bSOded Gabbay 
7491e65e175bSOded Gabbay 	return soft_reset_required;
7492e65e175bSOded Gabbay }
7493e65e175bSOded Gabbay 
tpc_dec_event_to_tpc_id(u16 tpc_dec_event_type)7494e65e175bSOded Gabbay static int tpc_dec_event_to_tpc_id(u16 tpc_dec_event_type)
7495e65e175bSOded Gabbay {
7496e65e175bSOded Gabbay 	return (tpc_dec_event_type - GAUDI_EVENT_TPC0_DEC) >> 1;
7497e65e175bSOded Gabbay }
7498e65e175bSOded Gabbay 
tpc_krn_event_to_tpc_id(u16 tpc_dec_event_type)7499e65e175bSOded Gabbay static int tpc_krn_event_to_tpc_id(u16 tpc_dec_event_type)
7500e65e175bSOded Gabbay {
7501e65e175bSOded Gabbay 	return (tpc_dec_event_type - GAUDI_EVENT_TPC0_KRN_ERR) / 6;
7502e65e175bSOded Gabbay }
7503e65e175bSOded Gabbay 
gaudi_print_clk_change_info(struct hl_device * hdev,u16 event_type,u64 * event_mask)7504e65e175bSOded Gabbay static void gaudi_print_clk_change_info(struct hl_device *hdev, u16 event_type, u64 *event_mask)
7505e65e175bSOded Gabbay {
7506e65e175bSOded Gabbay 	ktime_t zero_time = ktime_set(0, 0);
7507e65e175bSOded Gabbay 
7508e65e175bSOded Gabbay 	mutex_lock(&hdev->clk_throttling.lock);
7509e65e175bSOded Gabbay 
7510e65e175bSOded Gabbay 	switch (event_type) {
7511e65e175bSOded Gabbay 	case GAUDI_EVENT_FIX_POWER_ENV_S:
7512e65e175bSOded Gabbay 		hdev->clk_throttling.current_reason |= HL_CLK_THROTTLE_POWER;
7513e65e175bSOded Gabbay 		hdev->clk_throttling.aggregated_reason |= HL_CLK_THROTTLE_POWER;
7514e65e175bSOded Gabbay 		hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_POWER].start = ktime_get();
7515e65e175bSOded Gabbay 		hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_POWER].end = zero_time;
7516e65e175bSOded Gabbay 		dev_info_ratelimited(hdev->dev,
7517e65e175bSOded Gabbay 			"Clock throttling due to power consumption\n");
7518e65e175bSOded Gabbay 		break;
7519e65e175bSOded Gabbay 
7520e65e175bSOded Gabbay 	case GAUDI_EVENT_FIX_POWER_ENV_E:
7521e65e175bSOded Gabbay 		hdev->clk_throttling.current_reason &= ~HL_CLK_THROTTLE_POWER;
7522e65e175bSOded Gabbay 		hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_POWER].end = ktime_get();
7523e65e175bSOded Gabbay 		dev_info_ratelimited(hdev->dev,
7524e65e175bSOded Gabbay 			"Power envelop is safe, back to optimal clock\n");
7525e65e175bSOded Gabbay 		break;
7526e65e175bSOded Gabbay 
7527e65e175bSOded Gabbay 	case GAUDI_EVENT_FIX_THERMAL_ENV_S:
7528e65e175bSOded Gabbay 		hdev->clk_throttling.current_reason |= HL_CLK_THROTTLE_THERMAL;
7529e65e175bSOded Gabbay 		hdev->clk_throttling.aggregated_reason |= HL_CLK_THROTTLE_THERMAL;
7530e65e175bSOded Gabbay 		hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_THERMAL].start = ktime_get();
7531e65e175bSOded Gabbay 		hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_THERMAL].end = zero_time;
7532e65e175bSOded Gabbay 		*event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
7533e65e175bSOded Gabbay 		dev_info_ratelimited(hdev->dev,
7534e65e175bSOded Gabbay 			"Clock throttling due to overheating\n");
7535e65e175bSOded Gabbay 		break;
7536e65e175bSOded Gabbay 
7537e65e175bSOded Gabbay 	case GAUDI_EVENT_FIX_THERMAL_ENV_E:
7538e65e175bSOded Gabbay 		hdev->clk_throttling.current_reason &= ~HL_CLK_THROTTLE_THERMAL;
7539e65e175bSOded Gabbay 		hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_THERMAL].end = ktime_get();
7540e65e175bSOded Gabbay 		*event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
7541e65e175bSOded Gabbay 		dev_info_ratelimited(hdev->dev,
7542e65e175bSOded Gabbay 			"Thermal envelop is safe, back to optimal clock\n");
7543e65e175bSOded Gabbay 		break;
7544e65e175bSOded Gabbay 
7545e65e175bSOded Gabbay 	default:
7546e65e175bSOded Gabbay 		dev_err(hdev->dev, "Received invalid clock change event %d\n",
7547e65e175bSOded Gabbay 			event_type);
7548e65e175bSOded Gabbay 		break;
7549e65e175bSOded Gabbay 	}
7550e65e175bSOded Gabbay 
7551e65e175bSOded Gabbay 	mutex_unlock(&hdev->clk_throttling.lock);
7552e65e175bSOded Gabbay }
7553e65e175bSOded Gabbay 
gaudi_handle_eqe(struct hl_device * hdev,struct hl_eq_entry * eq_entry)7554e65e175bSOded Gabbay static void gaudi_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entry)
7555e65e175bSOded Gabbay {
7556e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
7557313e9f63SMoti Haimovski 	struct hl_info_fw_err_info fw_err_info;
7558e65e175bSOded Gabbay 	u64 data = le64_to_cpu(eq_entry->data[0]), event_mask = 0;
7559e65e175bSOded Gabbay 	u32 ctl = le32_to_cpu(eq_entry->hdr.ctl);
7560e65e175bSOded Gabbay 	u32 fw_fatal_err_flag = 0, flags = 0;
7561e65e175bSOded Gabbay 	u16 event_type = ((ctl & EQ_CTL_EVENT_TYPE_MASK)
7562e65e175bSOded Gabbay 			>> EQ_CTL_EVENT_TYPE_SHIFT);
7563e65e175bSOded Gabbay 	bool reset_required, reset_direct = false;
7564e65e175bSOded Gabbay 	u8 cause;
7565e65e175bSOded Gabbay 	int rc;
7566e65e175bSOded Gabbay 
7567e65e175bSOded Gabbay 	if (event_type >= GAUDI_EVENT_SIZE) {
7568e65e175bSOded Gabbay 		dev_err(hdev->dev, "Event type %u exceeds maximum of %u",
7569e65e175bSOded Gabbay 				event_type, GAUDI_EVENT_SIZE - 1);
7570e65e175bSOded Gabbay 		return;
7571e65e175bSOded Gabbay 	}
7572e65e175bSOded Gabbay 
7573e65e175bSOded Gabbay 	gaudi->events_stat[event_type]++;
7574e65e175bSOded Gabbay 	gaudi->events_stat_aggregate[event_type]++;
7575e65e175bSOded Gabbay 
7576e65e175bSOded Gabbay 	switch (event_type) {
7577e65e175bSOded Gabbay 	case GAUDI_EVENT_PCIE_CORE_DERR:
7578e65e175bSOded Gabbay 	case GAUDI_EVENT_PCIE_IF_DERR:
7579e65e175bSOded Gabbay 	case GAUDI_EVENT_PCIE_PHY_DERR:
7580e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC0_DERR ... GAUDI_EVENT_TPC7_DERR:
7581e65e175bSOded Gabbay 	case GAUDI_EVENT_MME0_ACC_DERR:
7582e65e175bSOded Gabbay 	case GAUDI_EVENT_MME0_SBAB_DERR:
7583e65e175bSOded Gabbay 	case GAUDI_EVENT_MME1_ACC_DERR:
7584e65e175bSOded Gabbay 	case GAUDI_EVENT_MME1_SBAB_DERR:
7585e65e175bSOded Gabbay 	case GAUDI_EVENT_MME2_ACC_DERR:
7586e65e175bSOded Gabbay 	case GAUDI_EVENT_MME2_SBAB_DERR:
7587e65e175bSOded Gabbay 	case GAUDI_EVENT_MME3_ACC_DERR:
7588e65e175bSOded Gabbay 	case GAUDI_EVENT_MME3_SBAB_DERR:
7589e65e175bSOded Gabbay 	case GAUDI_EVENT_DMA0_DERR_ECC ... GAUDI_EVENT_DMA7_DERR_ECC:
7590e65e175bSOded Gabbay 		fallthrough;
7591e65e175bSOded Gabbay 	case GAUDI_EVENT_CPU_IF_ECC_DERR:
7592e65e175bSOded Gabbay 	case GAUDI_EVENT_PSOC_MEM_DERR:
7593e65e175bSOded Gabbay 	case GAUDI_EVENT_PSOC_CORESIGHT_DERR:
7594e65e175bSOded Gabbay 	case GAUDI_EVENT_SRAM0_DERR ... GAUDI_EVENT_SRAM28_DERR:
7595e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC0_DERR ... GAUDI_EVENT_NIC4_DERR:
7596e65e175bSOded Gabbay 	case GAUDI_EVENT_DMA_IF0_DERR ... GAUDI_EVENT_DMA_IF3_DERR:
7597e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM_0_DERR ... GAUDI_EVENT_HBM_3_DERR:
7598e65e175bSOded Gabbay 	case GAUDI_EVENT_MMU_DERR:
7599e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC0_CS_DBG_DERR ... GAUDI_EVENT_NIC4_CS_DBG_DERR:
7600e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, true, &event_mask);
7601e65e175bSOded Gabbay 		gaudi_handle_ecc_event(hdev, event_type, &eq_entry->ecc_data);
7602e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
7603e65e175bSOded Gabbay 		fw_fatal_err_flag = HL_DRV_RESET_FW_FATAL_ERR;
7604e65e175bSOded Gabbay 		goto reset_device;
7605e65e175bSOded Gabbay 
7606e65e175bSOded Gabbay 	case GAUDI_EVENT_GIC500:
7607e65e175bSOded Gabbay 	case GAUDI_EVENT_AXI_ECC:
7608e65e175bSOded Gabbay 	case GAUDI_EVENT_L2_RAM_ECC:
7609e65e175bSOded Gabbay 	case GAUDI_EVENT_PLL0 ... GAUDI_EVENT_PLL17:
7610e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, false, &event_mask);
7611e65e175bSOded Gabbay 		fw_fatal_err_flag = HL_DRV_RESET_FW_FATAL_ERR;
7612e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
7613e65e175bSOded Gabbay 		goto reset_device;
7614e65e175bSOded Gabbay 
7615e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM0_SPI_0:
7616e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM1_SPI_0:
7617e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM2_SPI_0:
7618e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM3_SPI_0:
7619e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, false, &event_mask);
7620e65e175bSOded Gabbay 		gaudi_hbm_read_interrupts(hdev,
7621e65e175bSOded Gabbay 				gaudi_hbm_event_to_dev(event_type),
7622e65e175bSOded Gabbay 				&eq_entry->hbm_ecc_data);
7623e65e175bSOded Gabbay 		fw_fatal_err_flag = HL_DRV_RESET_FW_FATAL_ERR;
7624e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
7625e65e175bSOded Gabbay 		goto reset_device;
7626e65e175bSOded Gabbay 
7627e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM0_SPI_1:
7628e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM1_SPI_1:
7629e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM2_SPI_1:
7630e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM3_SPI_1:
7631e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, false, &event_mask);
7632e65e175bSOded Gabbay 		gaudi_hbm_read_interrupts(hdev,
7633e65e175bSOded Gabbay 				gaudi_hbm_event_to_dev(event_type),
7634e65e175bSOded Gabbay 				&eq_entry->hbm_ecc_data);
7635e65e175bSOded Gabbay 		hl_fw_unmask_irq(hdev, event_type);
7636e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
7637e65e175bSOded Gabbay 		break;
7638e65e175bSOded Gabbay 
7639e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC0_DEC:
7640e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC1_DEC:
7641e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC2_DEC:
7642e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC3_DEC:
7643e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC4_DEC:
7644e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC5_DEC:
7645e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC6_DEC:
7646e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC7_DEC:
7647e65e175bSOded Gabbay 		/* In TPC DEC event, notify on TPC assertion. While there isn't
7648e65e175bSOded Gabbay 		 * a specific event for assertion yet, the FW generates TPC DEC event.
7649e65e175bSOded Gabbay 		 * The SW upper layer will inspect an internal mapped area to indicate
7650e65e175bSOded Gabbay 		 * if the event is a TPC Assertion or a "real" TPC DEC.
7651e65e175bSOded Gabbay 		 */
7652e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_TPC_ASSERT;
7653e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, true, &event_mask);
7654e65e175bSOded Gabbay 		reset_required = gaudi_tpc_read_interrupts(hdev,
7655e65e175bSOded Gabbay 					tpc_dec_event_to_tpc_id(event_type),
7656e65e175bSOded Gabbay 					"AXI_SLV_DEC_Error");
7657e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
7658e65e175bSOded Gabbay 		if (reset_required) {
7659e65e175bSOded Gabbay 			dev_err(hdev->dev, "reset required due to %s\n",
7660e65e175bSOded Gabbay 				gaudi_irq_map_table[event_type].name);
7661e65e175bSOded Gabbay 
7662e65e175bSOded Gabbay 			reset_direct = true;
7663e65e175bSOded Gabbay 			goto reset_device;
7664e65e175bSOded Gabbay 		} else {
7665e65e175bSOded Gabbay 			hl_fw_unmask_irq(hdev, event_type);
7666e65e175bSOded Gabbay 			event_mask |= HL_NOTIFIER_EVENT_DEVICE_RESET;
7667e65e175bSOded Gabbay 		}
7668e65e175bSOded Gabbay 		break;
7669e65e175bSOded Gabbay 
7670e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC0_KRN_ERR:
7671e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC1_KRN_ERR:
7672e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC2_KRN_ERR:
7673e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC3_KRN_ERR:
7674e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC4_KRN_ERR:
7675e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC5_KRN_ERR:
7676e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC6_KRN_ERR:
7677e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC7_KRN_ERR:
7678e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, true, &event_mask);
7679e65e175bSOded Gabbay 		reset_required = gaudi_tpc_read_interrupts(hdev,
7680e65e175bSOded Gabbay 					tpc_krn_event_to_tpc_id(event_type),
7681e65e175bSOded Gabbay 					"KRN_ERR");
7682e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
7683e65e175bSOded Gabbay 		if (reset_required) {
7684e65e175bSOded Gabbay 			dev_err(hdev->dev, "reset required due to %s\n",
7685e65e175bSOded Gabbay 				gaudi_irq_map_table[event_type].name);
7686e65e175bSOded Gabbay 
7687e65e175bSOded Gabbay 			reset_direct = true;
7688e65e175bSOded Gabbay 			goto reset_device;
7689e65e175bSOded Gabbay 		} else {
7690e65e175bSOded Gabbay 			hl_fw_unmask_irq(hdev, event_type);
7691e65e175bSOded Gabbay 			event_mask |= HL_NOTIFIER_EVENT_DEVICE_RESET;
7692e65e175bSOded Gabbay 		}
7693e65e175bSOded Gabbay 		break;
7694e65e175bSOded Gabbay 
7695e65e175bSOded Gabbay 	case GAUDI_EVENT_PCIE_CORE_SERR:
7696e65e175bSOded Gabbay 	case GAUDI_EVENT_PCIE_IF_SERR:
7697e65e175bSOded Gabbay 	case GAUDI_EVENT_PCIE_PHY_SERR:
7698e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC0_SERR ... GAUDI_EVENT_TPC7_SERR:
7699e65e175bSOded Gabbay 	case GAUDI_EVENT_MME0_ACC_SERR:
7700e65e175bSOded Gabbay 	case GAUDI_EVENT_MME0_SBAB_SERR:
7701e65e175bSOded Gabbay 	case GAUDI_EVENT_MME1_ACC_SERR:
7702e65e175bSOded Gabbay 	case GAUDI_EVENT_MME1_SBAB_SERR:
7703e65e175bSOded Gabbay 	case GAUDI_EVENT_MME2_ACC_SERR:
7704e65e175bSOded Gabbay 	case GAUDI_EVENT_MME2_SBAB_SERR:
7705e65e175bSOded Gabbay 	case GAUDI_EVENT_MME3_ACC_SERR:
7706e65e175bSOded Gabbay 	case GAUDI_EVENT_MME3_SBAB_SERR:
7707e65e175bSOded Gabbay 	case GAUDI_EVENT_DMA0_SERR_ECC ... GAUDI_EVENT_DMA7_SERR_ECC:
7708e65e175bSOded Gabbay 	case GAUDI_EVENT_CPU_IF_ECC_SERR:
7709e65e175bSOded Gabbay 	case GAUDI_EVENT_PSOC_MEM_SERR:
7710e65e175bSOded Gabbay 	case GAUDI_EVENT_PSOC_CORESIGHT_SERR:
7711e65e175bSOded Gabbay 	case GAUDI_EVENT_SRAM0_SERR ... GAUDI_EVENT_SRAM28_SERR:
7712e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC0_SERR ... GAUDI_EVENT_NIC4_SERR:
7713e65e175bSOded Gabbay 	case GAUDI_EVENT_DMA_IF0_SERR ... GAUDI_EVENT_DMA_IF3_SERR:
7714e65e175bSOded Gabbay 	case GAUDI_EVENT_HBM_0_SERR ... GAUDI_EVENT_HBM_3_SERR:
7715e65e175bSOded Gabbay 		fallthrough;
7716e65e175bSOded Gabbay 	case GAUDI_EVENT_MMU_SERR:
7717e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, true, &event_mask);
7718e65e175bSOded Gabbay 		gaudi_handle_ecc_event(hdev, event_type, &eq_entry->ecc_data);
7719e65e175bSOded Gabbay 		hl_fw_unmask_irq(hdev, event_type);
7720e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
7721e65e175bSOded Gabbay 		break;
7722e65e175bSOded Gabbay 
7723e65e175bSOded Gabbay 	case GAUDI_EVENT_PCIE_DEC:
7724e65e175bSOded Gabbay 	case GAUDI_EVENT_CPU_AXI_SPLITTER:
7725e65e175bSOded Gabbay 	case GAUDI_EVENT_PSOC_AXI_DEC:
7726e65e175bSOded Gabbay 	case GAUDI_EVENT_PSOC_PRSTN_FALL:
7727e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, true, &event_mask);
7728e65e175bSOded Gabbay 		hl_fw_unmask_irq(hdev, event_type);
7729e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
7730e65e175bSOded Gabbay 		break;
7731e65e175bSOded Gabbay 
7732e65e175bSOded Gabbay 	case GAUDI_EVENT_MMU_PAGE_FAULT:
7733e65e175bSOded Gabbay 	case GAUDI_EVENT_MMU_WR_PERM:
7734e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, true, &event_mask);
7735e65e175bSOded Gabbay 		hl_fw_unmask_irq(hdev, event_type);
7736e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
7737e65e175bSOded Gabbay 		break;
7738e65e175bSOded Gabbay 
7739e65e175bSOded Gabbay 	case GAUDI_EVENT_MME0_WBC_RSP:
7740e65e175bSOded Gabbay 	case GAUDI_EVENT_MME0_SBAB0_RSP:
7741e65e175bSOded Gabbay 	case GAUDI_EVENT_MME1_WBC_RSP:
7742e65e175bSOded Gabbay 	case GAUDI_EVENT_MME1_SBAB0_RSP:
7743e65e175bSOded Gabbay 	case GAUDI_EVENT_MME2_WBC_RSP:
7744e65e175bSOded Gabbay 	case GAUDI_EVENT_MME2_SBAB0_RSP:
7745e65e175bSOded Gabbay 	case GAUDI_EVENT_MME3_WBC_RSP:
7746e65e175bSOded Gabbay 	case GAUDI_EVENT_MME3_SBAB0_RSP:
7747e65e175bSOded Gabbay 	case GAUDI_EVENT_RAZWI_OR_ADC:
7748e65e175bSOded Gabbay 	case GAUDI_EVENT_MME0_QM ... GAUDI_EVENT_MME2_QM:
7749e65e175bSOded Gabbay 	case GAUDI_EVENT_DMA0_QM ... GAUDI_EVENT_DMA7_QM:
7750e65e175bSOded Gabbay 		fallthrough;
7751e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC0_QM0:
7752e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC0_QM1:
7753e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC1_QM0:
7754e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC1_QM1:
7755e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC2_QM0:
7756e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC2_QM1:
7757e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC3_QM0:
7758e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC3_QM1:
7759e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC4_QM0:
7760e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC4_QM1:
7761e65e175bSOded Gabbay 	case GAUDI_EVENT_DMA0_CORE ... GAUDI_EVENT_DMA7_CORE:
7762e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC0_QM ... GAUDI_EVENT_TPC7_QM:
7763e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, true, &event_mask);
7764e65e175bSOded Gabbay 		gaudi_handle_qman_err(hdev, event_type, &event_mask);
7765e65e175bSOded Gabbay 		hl_fw_unmask_irq(hdev, event_type);
7766e65e175bSOded Gabbay 		event_mask |= (HL_NOTIFIER_EVENT_USER_ENGINE_ERR | HL_NOTIFIER_EVENT_DEVICE_RESET);
7767e65e175bSOded Gabbay 		break;
7768e65e175bSOded Gabbay 
7769e65e175bSOded Gabbay 	case GAUDI_EVENT_RAZWI_OR_ADC_SW:
7770e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, true, &event_mask);
7771e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
7772e65e175bSOded Gabbay 		goto reset_device;
7773e65e175bSOded Gabbay 
7774e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC0_BMON_SPMU:
7775e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC1_BMON_SPMU:
7776e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC2_BMON_SPMU:
7777e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC3_BMON_SPMU:
7778e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC4_BMON_SPMU:
7779e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC5_BMON_SPMU:
7780e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC6_BMON_SPMU:
7781e65e175bSOded Gabbay 	case GAUDI_EVENT_TPC7_BMON_SPMU:
7782e65e175bSOded Gabbay 	case GAUDI_EVENT_DMA_BM_CH0 ... GAUDI_EVENT_DMA_BM_CH7:
7783e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, false, &event_mask);
7784e65e175bSOded Gabbay 		hl_fw_unmask_irq(hdev, event_type);
7785e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
7786e65e175bSOded Gabbay 		break;
7787e65e175bSOded Gabbay 
7788e65e175bSOded Gabbay 	case GAUDI_EVENT_NIC_SEI_0 ... GAUDI_EVENT_NIC_SEI_4:
7789e65e175bSOded Gabbay 		gaudi_print_nic_axi_irq_info(hdev, event_type, &data);
7790e65e175bSOded Gabbay 		hl_fw_unmask_irq(hdev, event_type);
7791e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
7792e65e175bSOded Gabbay 		break;
7793e65e175bSOded Gabbay 
7794e65e175bSOded Gabbay 	case GAUDI_EVENT_DMA_IF_SEI_0 ... GAUDI_EVENT_DMA_IF_SEI_3:
7795e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, false, &event_mask);
7796e65e175bSOded Gabbay 		gaudi_print_sm_sei_info(hdev, event_type,
7797e65e175bSOded Gabbay 					&eq_entry->sm_sei_data);
7798e65e175bSOded Gabbay 		rc = hl_state_dump(hdev);
7799e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
7800e65e175bSOded Gabbay 		if (rc)
7801e65e175bSOded Gabbay 			dev_err(hdev->dev,
7802e65e175bSOded Gabbay 				"Error during system state dump %d\n", rc);
7803e65e175bSOded Gabbay 		hl_fw_unmask_irq(hdev, event_type);
7804e65e175bSOded Gabbay 		break;
7805e65e175bSOded Gabbay 
7806e65e175bSOded Gabbay 	case GAUDI_EVENT_STATUS_NIC0_ENG0 ... GAUDI_EVENT_STATUS_NIC4_ENG1:
7807e65e175bSOded Gabbay 		break;
7808e65e175bSOded Gabbay 
7809e65e175bSOded Gabbay 	case GAUDI_EVENT_FIX_POWER_ENV_S ... GAUDI_EVENT_FIX_THERMAL_ENV_E:
7810e65e175bSOded Gabbay 		gaudi_print_clk_change_info(hdev, event_type, &event_mask);
7811e65e175bSOded Gabbay 		hl_fw_unmask_irq(hdev, event_type);
7812e65e175bSOded Gabbay 		break;
7813e65e175bSOded Gabbay 
7814e65e175bSOded Gabbay 	case GAUDI_EVENT_PSOC_GPIO_U16_0:
7815e65e175bSOded Gabbay 		cause = le64_to_cpu(eq_entry->data[0]) & 0xFF;
7816e65e175bSOded Gabbay 		dev_err(hdev->dev,
7817e65e175bSOded Gabbay 			"Received high temp H/W interrupt %d (cause %d)\n",
7818e65e175bSOded Gabbay 			event_type, cause);
7819e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
7820e65e175bSOded Gabbay 		break;
7821e65e175bSOded Gabbay 
7822e65e175bSOded Gabbay 	case GAUDI_EVENT_DEV_RESET_REQ:
7823e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, false, &event_mask);
7824e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
7825e65e175bSOded Gabbay 		goto reset_device;
7826e65e175bSOded Gabbay 
7827e65e175bSOded Gabbay 	case GAUDI_EVENT_PKT_QUEUE_OUT_SYNC:
7828e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, false, &event_mask);
7829e65e175bSOded Gabbay 		gaudi_print_out_of_sync_info(hdev, &eq_entry->pkt_sync_err);
7830e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
7831e65e175bSOded Gabbay 		goto reset_device;
7832e65e175bSOded Gabbay 
7833e65e175bSOded Gabbay 	case GAUDI_EVENT_FW_ALIVE_S:
7834e65e175bSOded Gabbay 		gaudi_print_irq_info(hdev, event_type, false, &event_mask);
7835e65e175bSOded Gabbay 		gaudi_print_fw_alive_info(hdev, &eq_entry->fw_alive);
7836313e9f63SMoti Haimovski 		fw_err_info.err_type = HL_INFO_FW_REPORTED_ERR;
7837313e9f63SMoti Haimovski 		fw_err_info.event_id = event_type;
7838313e9f63SMoti Haimovski 		fw_err_info.event_mask = &event_mask;
7839313e9f63SMoti Haimovski 		hl_handle_fw_err(hdev, &fw_err_info);
7840e65e175bSOded Gabbay 		goto reset_device;
7841e65e175bSOded Gabbay 
7842e65e175bSOded Gabbay 	default:
7843e65e175bSOded Gabbay 		dev_err(hdev->dev, "Received invalid H/W interrupt %d\n",
7844e65e175bSOded Gabbay 				event_type);
7845e65e175bSOded Gabbay 		break;
7846e65e175bSOded Gabbay 	}
7847e65e175bSOded Gabbay 
7848e65e175bSOded Gabbay 	if (event_mask)
7849e65e175bSOded Gabbay 		hl_notifier_event_send_all(hdev, event_mask);
7850e65e175bSOded Gabbay 
7851e65e175bSOded Gabbay 	return;
7852e65e175bSOded Gabbay 
7853e65e175bSOded Gabbay reset_device:
7854e65e175bSOded Gabbay 	reset_required = true;
7855e65e175bSOded Gabbay 
7856e65e175bSOded Gabbay 	if (hdev->asic_prop.fw_security_enabled && !reset_direct) {
7857e65e175bSOded Gabbay 		flags = HL_DRV_RESET_HARD | HL_DRV_RESET_BYPASS_REQ_TO_FW | fw_fatal_err_flag;
7858e65e175bSOded Gabbay 
7859e65e175bSOded Gabbay 		/* notify on device unavailable while the reset triggered by fw */
7860e65e175bSOded Gabbay 		event_mask |= (HL_NOTIFIER_EVENT_DEVICE_RESET |
7861e65e175bSOded Gabbay 					HL_NOTIFIER_EVENT_DEVICE_UNAVAILABLE);
7862e65e175bSOded Gabbay 	} else if (hdev->hard_reset_on_fw_events) {
7863e65e175bSOded Gabbay 		flags = HL_DRV_RESET_HARD | HL_DRV_RESET_DELAY | fw_fatal_err_flag;
7864e65e175bSOded Gabbay 		event_mask |= HL_NOTIFIER_EVENT_DEVICE_RESET;
7865e65e175bSOded Gabbay 	} else {
7866e65e175bSOded Gabbay 		reset_required = false;
7867e65e175bSOded Gabbay 	}
7868e65e175bSOded Gabbay 
7869e65e175bSOded Gabbay 	if (reset_required) {
7870313e9f63SMoti Haimovski 		/* escalate general hw errors to critical/fatal error */
7871313e9f63SMoti Haimovski 		if (event_mask & HL_NOTIFIER_EVENT_GENERAL_HW_ERR)
7872313e9f63SMoti Haimovski 			hl_handle_critical_hw_err(hdev, event_type, &event_mask);
7873313e9f63SMoti Haimovski 
7874e65e175bSOded Gabbay 		hl_device_cond_reset(hdev, flags, event_mask);
7875e65e175bSOded Gabbay 	} else {
7876e65e175bSOded Gabbay 		hl_fw_unmask_irq(hdev, event_type);
7877e65e175bSOded Gabbay 		/* Notification on occurred event needs to be sent although reset is not executed */
7878e65e175bSOded Gabbay 		if (event_mask)
7879e65e175bSOded Gabbay 			hl_notifier_event_send_all(hdev, event_mask);
7880e65e175bSOded Gabbay 	}
7881e65e175bSOded Gabbay }
7882e65e175bSOded Gabbay 
gaudi_get_events_stat(struct hl_device * hdev,bool aggregate,u32 * size)7883e65e175bSOded Gabbay static void *gaudi_get_events_stat(struct hl_device *hdev, bool aggregate, u32 *size)
7884e65e175bSOded Gabbay {
7885e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
7886e65e175bSOded Gabbay 
7887e65e175bSOded Gabbay 	if (aggregate) {
7888e65e175bSOded Gabbay 		*size = (u32) sizeof(gaudi->events_stat_aggregate);
7889e65e175bSOded Gabbay 		return gaudi->events_stat_aggregate;
7890e65e175bSOded Gabbay 	}
7891e65e175bSOded Gabbay 
7892e65e175bSOded Gabbay 	*size = (u32) sizeof(gaudi->events_stat);
7893e65e175bSOded Gabbay 	return gaudi->events_stat;
7894e65e175bSOded Gabbay }
7895e65e175bSOded Gabbay 
gaudi_mmu_invalidate_cache(struct hl_device * hdev,bool is_hard,u32 flags)7896e65e175bSOded Gabbay static int gaudi_mmu_invalidate_cache(struct hl_device *hdev, bool is_hard, u32 flags)
7897e65e175bSOded Gabbay {
7898e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
7899e65e175bSOded Gabbay 	u32 status, timeout_usec;
7900e65e175bSOded Gabbay 	int rc;
7901e65e175bSOded Gabbay 
7902e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_MMU) ||
7903e65e175bSOded Gabbay 		hdev->reset_info.hard_reset_pending)
7904e65e175bSOded Gabbay 		return 0;
7905e65e175bSOded Gabbay 
7906e65e175bSOded Gabbay 	if (hdev->pldm)
7907e65e175bSOded Gabbay 		timeout_usec = GAUDI_PLDM_MMU_TIMEOUT_USEC;
7908e65e175bSOded Gabbay 	else
7909e65e175bSOded Gabbay 		timeout_usec = MMU_CONFIG_TIMEOUT_USEC;
7910e65e175bSOded Gabbay 
7911e65e175bSOded Gabbay 	/* L0 & L1 invalidation */
7912e65e175bSOded Gabbay 	WREG32(mmSTLB_INV_PS, 3);
7913e65e175bSOded Gabbay 	WREG32(mmSTLB_CACHE_INV, gaudi->mmu_cache_inv_pi++);
7914e65e175bSOded Gabbay 	WREG32(mmSTLB_INV_PS, 2);
7915e65e175bSOded Gabbay 
7916e65e175bSOded Gabbay 	rc = hl_poll_timeout(
7917e65e175bSOded Gabbay 		hdev,
7918e65e175bSOded Gabbay 		mmSTLB_INV_PS,
7919e65e175bSOded Gabbay 		status,
7920e65e175bSOded Gabbay 		!status,
7921e65e175bSOded Gabbay 		1000,
7922e65e175bSOded Gabbay 		timeout_usec);
7923e65e175bSOded Gabbay 
7924e65e175bSOded Gabbay 	WREG32(mmSTLB_INV_SET, 0);
7925e65e175bSOded Gabbay 
7926e65e175bSOded Gabbay 	return rc;
7927e65e175bSOded Gabbay }
7928e65e175bSOded Gabbay 
gaudi_mmu_invalidate_cache_range(struct hl_device * hdev,bool is_hard,u32 flags,u32 asid,u64 va,u64 size)7929e65e175bSOded Gabbay static int gaudi_mmu_invalidate_cache_range(struct hl_device *hdev,
7930e65e175bSOded Gabbay 						bool is_hard, u32 flags,
7931e65e175bSOded Gabbay 						u32 asid, u64 va, u64 size)
7932e65e175bSOded Gabbay {
7933e65e175bSOded Gabbay 	/* Treat as invalidate all because there is no range invalidation
7934e65e175bSOded Gabbay 	 * in Gaudi
7935e65e175bSOded Gabbay 	 */
7936e65e175bSOded Gabbay 	return hdev->asic_funcs->mmu_invalidate_cache(hdev, is_hard, flags);
7937e65e175bSOded Gabbay }
7938e65e175bSOded Gabbay 
gaudi_mmu_update_asid_hop0_addr(struct hl_device * hdev,u32 asid,u64 phys_addr)7939e65e175bSOded Gabbay static int gaudi_mmu_update_asid_hop0_addr(struct hl_device *hdev, u32 asid, u64 phys_addr)
7940e65e175bSOded Gabbay {
7941e65e175bSOded Gabbay 	u32 status, timeout_usec;
7942e65e175bSOded Gabbay 	int rc;
7943e65e175bSOded Gabbay 
7944e65e175bSOded Gabbay 	if (hdev->pldm)
7945e65e175bSOded Gabbay 		timeout_usec = GAUDI_PLDM_MMU_TIMEOUT_USEC;
7946e65e175bSOded Gabbay 	else
7947e65e175bSOded Gabbay 		timeout_usec = MMU_CONFIG_TIMEOUT_USEC;
7948e65e175bSOded Gabbay 
7949e65e175bSOded Gabbay 	WREG32(MMU_ASID, asid);
7950e65e175bSOded Gabbay 	WREG32(MMU_HOP0_PA43_12, phys_addr >> MMU_HOP0_PA43_12_SHIFT);
7951e65e175bSOded Gabbay 	WREG32(MMU_HOP0_PA49_44, phys_addr >> MMU_HOP0_PA49_44_SHIFT);
7952e65e175bSOded Gabbay 	WREG32(MMU_BUSY, 0x80000000);
7953e65e175bSOded Gabbay 
7954e65e175bSOded Gabbay 	rc = hl_poll_timeout(
7955e65e175bSOded Gabbay 		hdev,
7956e65e175bSOded Gabbay 		MMU_BUSY,
7957e65e175bSOded Gabbay 		status,
7958e65e175bSOded Gabbay 		!(status & 0x80000000),
7959e65e175bSOded Gabbay 		1000,
7960e65e175bSOded Gabbay 		timeout_usec);
7961e65e175bSOded Gabbay 
7962e65e175bSOded Gabbay 	if (rc) {
7963e65e175bSOded Gabbay 		dev_err(hdev->dev,
7964e65e175bSOded Gabbay 			"Timeout during MMU hop0 config of asid %d\n", asid);
7965e65e175bSOded Gabbay 		return rc;
7966e65e175bSOded Gabbay 	}
7967e65e175bSOded Gabbay 
7968e65e175bSOded Gabbay 	return 0;
7969e65e175bSOded Gabbay }
7970e65e175bSOded Gabbay 
gaudi_send_heartbeat(struct hl_device * hdev)7971e65e175bSOded Gabbay static int gaudi_send_heartbeat(struct hl_device *hdev)
7972e65e175bSOded Gabbay {
7973e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
7974e65e175bSOded Gabbay 
7975e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_CPU_Q))
7976e65e175bSOded Gabbay 		return 0;
7977e65e175bSOded Gabbay 
7978e65e175bSOded Gabbay 	return hl_fw_send_heartbeat(hdev);
7979e65e175bSOded Gabbay }
7980e65e175bSOded Gabbay 
gaudi_cpucp_info_get(struct hl_device * hdev)7981e65e175bSOded Gabbay static int gaudi_cpucp_info_get(struct hl_device *hdev)
7982e65e175bSOded Gabbay {
7983e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
7984e65e175bSOded Gabbay 	struct asic_fixed_properties *prop = &hdev->asic_prop;
7985e65e175bSOded Gabbay 	int rc;
7986e65e175bSOded Gabbay 
7987e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_CPU_Q))
7988e65e175bSOded Gabbay 		return 0;
7989e65e175bSOded Gabbay 
7990e65e175bSOded Gabbay 	rc = hl_fw_cpucp_handshake(hdev, mmCPU_BOOT_DEV_STS0,
7991e65e175bSOded Gabbay 					mmCPU_BOOT_DEV_STS1, mmCPU_BOOT_ERR0,
7992e65e175bSOded Gabbay 					mmCPU_BOOT_ERR1);
7993e65e175bSOded Gabbay 	if (rc)
7994e65e175bSOded Gabbay 		return rc;
7995e65e175bSOded Gabbay 
7996e65e175bSOded Gabbay 	if (!strlen(prop->cpucp_info.card_name))
7997a45d5cf0SJustin Stitt 		strscpy_pad(prop->cpucp_info.card_name, GAUDI_DEFAULT_CARD_NAME,
7998e65e175bSOded Gabbay 				CARD_NAME_MAX_LEN);
7999e65e175bSOded Gabbay 
8000e65e175bSOded Gabbay 	hdev->card_type = le32_to_cpu(hdev->asic_prop.cpucp_info.card_type);
8001e65e175bSOded Gabbay 
8002e65e175bSOded Gabbay 	set_default_power_values(hdev);
8003e65e175bSOded Gabbay 
8004e65e175bSOded Gabbay 	return 0;
8005e65e175bSOded Gabbay }
8006e65e175bSOded Gabbay 
gaudi_is_device_idle(struct hl_device * hdev,u64 * mask_arr,u8 mask_len,struct engines_data * e)8007e65e175bSOded Gabbay static bool gaudi_is_device_idle(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,
8008e65e175bSOded Gabbay 		struct engines_data *e)
8009e65e175bSOded Gabbay {
8010e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
8011e65e175bSOded Gabbay 	const char *fmt = "%-5d%-9s%#-14x%#-12x%#x\n";
8012e65e175bSOded Gabbay 	const char *mme_slave_fmt = "%-5d%-9s%-14s%-12s%#x\n";
8013e65e175bSOded Gabbay 	const char *nic_fmt = "%-5d%-9s%#-14x%#x\n";
8014e65e175bSOded Gabbay 	unsigned long *mask = (unsigned long *)mask_arr;
8015e65e175bSOded Gabbay 	u32 qm_glbl_sts0, qm_cgm_sts, dma_core_sts0, tpc_cfg_sts, mme_arch_sts;
8016e65e175bSOded Gabbay 	bool is_idle = true, is_eng_idle, is_slave;
8017e65e175bSOded Gabbay 	u64 offset;
8018e65e175bSOded Gabbay 	int i, dma_id, port;
8019e65e175bSOded Gabbay 
8020e65e175bSOded Gabbay 	if (e)
8021e65e175bSOded Gabbay 		hl_engine_data_sprintf(e,
8022e65e175bSOded Gabbay 			"\nDMA  is_idle  QM_GLBL_STS0  QM_CGM_STS  DMA_CORE_STS0\n"
8023e65e175bSOded Gabbay 			"---  -------  ------------  ----------  -------------\n");
8024e65e175bSOded Gabbay 
8025e65e175bSOded Gabbay 	for (i = 0 ; i < DMA_NUMBER_OF_CHNLS ; i++) {
8026e65e175bSOded Gabbay 		dma_id = gaudi_dma_assignment[i];
8027e65e175bSOded Gabbay 		offset = dma_id * DMA_QMAN_OFFSET;
8028e65e175bSOded Gabbay 
8029e65e175bSOded Gabbay 		qm_glbl_sts0 = RREG32(mmDMA0_QM_GLBL_STS0 + offset);
8030e65e175bSOded Gabbay 		qm_cgm_sts = RREG32(mmDMA0_QM_CGM_STS + offset);
8031e65e175bSOded Gabbay 		dma_core_sts0 = RREG32(mmDMA0_CORE_STS0 + offset);
8032e65e175bSOded Gabbay 		is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_cgm_sts) &&
8033e65e175bSOded Gabbay 				IS_DMA_IDLE(dma_core_sts0);
8034e65e175bSOded Gabbay 		is_idle &= is_eng_idle;
8035e65e175bSOded Gabbay 
8036e65e175bSOded Gabbay 		if (mask && !is_eng_idle)
8037e65e175bSOded Gabbay 			set_bit(GAUDI_ENGINE_ID_DMA_0 + dma_id, mask);
8038e65e175bSOded Gabbay 		if (e)
8039e65e175bSOded Gabbay 			hl_engine_data_sprintf(e, fmt, dma_id,
8040e65e175bSOded Gabbay 				is_eng_idle ? "Y" : "N", qm_glbl_sts0,
8041e65e175bSOded Gabbay 				qm_cgm_sts, dma_core_sts0);
8042e65e175bSOded Gabbay 	}
8043e65e175bSOded Gabbay 
8044e65e175bSOded Gabbay 	if (e)
8045e65e175bSOded Gabbay 		hl_engine_data_sprintf(e,
8046e65e175bSOded Gabbay 			"\nTPC  is_idle  QM_GLBL_STS0  QM_CGM_STS  CFG_STATUS\n"
8047e65e175bSOded Gabbay 			"---  -------  ------------  ----------  ----------\n");
8048e65e175bSOded Gabbay 
8049e65e175bSOded Gabbay 	for (i = 0 ; i < TPC_NUMBER_OF_ENGINES ; i++) {
8050e65e175bSOded Gabbay 		offset = i * TPC_QMAN_OFFSET;
8051e65e175bSOded Gabbay 		qm_glbl_sts0 = RREG32(mmTPC0_QM_GLBL_STS0 + offset);
8052e65e175bSOded Gabbay 		qm_cgm_sts = RREG32(mmTPC0_QM_CGM_STS + offset);
8053e65e175bSOded Gabbay 		tpc_cfg_sts = RREG32(mmTPC0_CFG_STATUS + offset);
8054e65e175bSOded Gabbay 		is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_cgm_sts) &&
8055e65e175bSOded Gabbay 				IS_TPC_IDLE(tpc_cfg_sts);
8056e65e175bSOded Gabbay 		is_idle &= is_eng_idle;
8057e65e175bSOded Gabbay 
8058e65e175bSOded Gabbay 		if (mask && !is_eng_idle)
8059e65e175bSOded Gabbay 			set_bit(GAUDI_ENGINE_ID_TPC_0 + i, mask);
8060e65e175bSOded Gabbay 		if (e)
8061e65e175bSOded Gabbay 			hl_engine_data_sprintf(e, fmt, i,
8062e65e175bSOded Gabbay 				is_eng_idle ? "Y" : "N",
8063e65e175bSOded Gabbay 				qm_glbl_sts0, qm_cgm_sts, tpc_cfg_sts);
8064e65e175bSOded Gabbay 	}
8065e65e175bSOded Gabbay 
8066e65e175bSOded Gabbay 	if (e)
8067e65e175bSOded Gabbay 		hl_engine_data_sprintf(e,
8068e65e175bSOded Gabbay 			"\nMME  is_idle  QM_GLBL_STS0  QM_CGM_STS  ARCH_STATUS\n"
8069e65e175bSOded Gabbay 			"---  -------  ------------  ----------  -----------\n");
8070e65e175bSOded Gabbay 
8071e65e175bSOded Gabbay 	for (i = 0 ; i < MME_NUMBER_OF_ENGINES ; i++) {
8072e65e175bSOded Gabbay 		offset = i * MME_QMAN_OFFSET;
8073e65e175bSOded Gabbay 		mme_arch_sts = RREG32(mmMME0_CTRL_ARCH_STATUS + offset);
8074e65e175bSOded Gabbay 		is_eng_idle = IS_MME_IDLE(mme_arch_sts);
8075e65e175bSOded Gabbay 
8076e65e175bSOded Gabbay 		/* MME 1 & 3 are slaves, no need to check their QMANs */
8077e65e175bSOded Gabbay 		is_slave = i % 2;
8078e65e175bSOded Gabbay 		if (!is_slave) {
8079e65e175bSOded Gabbay 			qm_glbl_sts0 = RREG32(mmMME0_QM_GLBL_STS0 + offset);
8080e65e175bSOded Gabbay 			qm_cgm_sts = RREG32(mmMME0_QM_CGM_STS + offset);
8081e65e175bSOded Gabbay 			is_eng_idle &= IS_QM_IDLE(qm_glbl_sts0, qm_cgm_sts);
8082e65e175bSOded Gabbay 		}
8083e65e175bSOded Gabbay 
8084e65e175bSOded Gabbay 		is_idle &= is_eng_idle;
8085e65e175bSOded Gabbay 
8086e65e175bSOded Gabbay 		if (mask && !is_eng_idle)
8087e65e175bSOded Gabbay 			set_bit(GAUDI_ENGINE_ID_MME_0 + i, mask);
8088e65e175bSOded Gabbay 		if (e) {
8089e65e175bSOded Gabbay 			if (!is_slave)
8090e65e175bSOded Gabbay 				hl_engine_data_sprintf(e, fmt, i,
8091e65e175bSOded Gabbay 					is_eng_idle ? "Y" : "N",
8092e65e175bSOded Gabbay 					qm_glbl_sts0, qm_cgm_sts, mme_arch_sts);
8093e65e175bSOded Gabbay 			else
8094e65e175bSOded Gabbay 				hl_engine_data_sprintf(e, mme_slave_fmt, i,
8095e65e175bSOded Gabbay 					is_eng_idle ? "Y" : "N", "-",
8096e65e175bSOded Gabbay 					"-", mme_arch_sts);
8097e65e175bSOded Gabbay 		}
8098e65e175bSOded Gabbay 	}
8099e65e175bSOded Gabbay 
8100e65e175bSOded Gabbay 	if (e)
8101e65e175bSOded Gabbay 		hl_engine_data_sprintf(e,
8102e65e175bSOded Gabbay 				"\nNIC  is_idle  QM_GLBL_STS0  QM_CGM_STS\n"
8103e65e175bSOded Gabbay 				"---  -------  ------------  ----------\n");
8104e65e175bSOded Gabbay 
8105e65e175bSOded Gabbay 	for (i = 0 ; i < (NIC_NUMBER_OF_ENGINES / 2) ; i++) {
8106e65e175bSOded Gabbay 		offset = i * NIC_MACRO_QMAN_OFFSET;
8107e65e175bSOded Gabbay 		port = 2 * i;
8108e65e175bSOded Gabbay 		if (gaudi->hw_cap_initialized & BIT(HW_CAP_NIC_SHIFT + port)) {
8109e65e175bSOded Gabbay 			qm_glbl_sts0 = RREG32(mmNIC0_QM0_GLBL_STS0 + offset);
8110e65e175bSOded Gabbay 			qm_cgm_sts = RREG32(mmNIC0_QM0_CGM_STS + offset);
8111e65e175bSOded Gabbay 			is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_cgm_sts);
8112e65e175bSOded Gabbay 			is_idle &= is_eng_idle;
8113e65e175bSOded Gabbay 
8114e65e175bSOded Gabbay 			if (mask && !is_eng_idle)
8115e65e175bSOded Gabbay 				set_bit(GAUDI_ENGINE_ID_NIC_0 + port, mask);
8116e65e175bSOded Gabbay 			if (e)
8117e65e175bSOded Gabbay 				hl_engine_data_sprintf(e, nic_fmt, port,
8118e65e175bSOded Gabbay 						is_eng_idle ? "Y" : "N",
8119e65e175bSOded Gabbay 						qm_glbl_sts0, qm_cgm_sts);
8120e65e175bSOded Gabbay 		}
8121e65e175bSOded Gabbay 
8122e65e175bSOded Gabbay 		port = 2 * i + 1;
8123e65e175bSOded Gabbay 		if (gaudi->hw_cap_initialized & BIT(HW_CAP_NIC_SHIFT + port)) {
8124e65e175bSOded Gabbay 			qm_glbl_sts0 = RREG32(mmNIC0_QM1_GLBL_STS0 + offset);
8125e65e175bSOded Gabbay 			qm_cgm_sts = RREG32(mmNIC0_QM1_CGM_STS + offset);
8126e65e175bSOded Gabbay 			is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_cgm_sts);
8127e65e175bSOded Gabbay 			is_idle &= is_eng_idle;
8128e65e175bSOded Gabbay 
8129e65e175bSOded Gabbay 			if (mask && !is_eng_idle)
8130e65e175bSOded Gabbay 				set_bit(GAUDI_ENGINE_ID_NIC_0 + port, mask);
8131e65e175bSOded Gabbay 			if (e)
8132e65e175bSOded Gabbay 				hl_engine_data_sprintf(e, nic_fmt, port,
8133e65e175bSOded Gabbay 						is_eng_idle ? "Y" : "N",
8134e65e175bSOded Gabbay 						qm_glbl_sts0, qm_cgm_sts);
8135e65e175bSOded Gabbay 		}
8136e65e175bSOded Gabbay 	}
8137e65e175bSOded Gabbay 
8138e65e175bSOded Gabbay 	if (e)
8139e65e175bSOded Gabbay 		hl_engine_data_sprintf(e, "\n");
8140e65e175bSOded Gabbay 
8141e65e175bSOded Gabbay 	return is_idle;
8142e65e175bSOded Gabbay }
8143e65e175bSOded Gabbay 
gaudi_hw_queues_lock(struct hl_device * hdev)8144e65e175bSOded Gabbay static void gaudi_hw_queues_lock(struct hl_device *hdev)
8145e65e175bSOded Gabbay 	__acquires(&gaudi->hw_queues_lock)
8146e65e175bSOded Gabbay {
8147e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
8148e65e175bSOded Gabbay 
8149e65e175bSOded Gabbay 	spin_lock(&gaudi->hw_queues_lock);
8150e65e175bSOded Gabbay }
8151e65e175bSOded Gabbay 
gaudi_hw_queues_unlock(struct hl_device * hdev)8152e65e175bSOded Gabbay static void gaudi_hw_queues_unlock(struct hl_device *hdev)
8153e65e175bSOded Gabbay 	__releases(&gaudi->hw_queues_lock)
8154e65e175bSOded Gabbay {
8155e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
8156e65e175bSOded Gabbay 
8157e65e175bSOded Gabbay 	spin_unlock(&gaudi->hw_queues_lock);
8158e65e175bSOded Gabbay }
8159e65e175bSOded Gabbay 
gaudi_get_pci_id(struct hl_device * hdev)8160e65e175bSOded Gabbay static u32 gaudi_get_pci_id(struct hl_device *hdev)
8161e65e175bSOded Gabbay {
8162e65e175bSOded Gabbay 	return hdev->pdev->device;
8163e65e175bSOded Gabbay }
8164e65e175bSOded Gabbay 
gaudi_get_eeprom_data(struct hl_device * hdev,void * data,size_t max_size)8165e65e175bSOded Gabbay static int gaudi_get_eeprom_data(struct hl_device *hdev, void *data,
8166e65e175bSOded Gabbay 				size_t max_size)
8167e65e175bSOded Gabbay {
8168e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
8169e65e175bSOded Gabbay 
8170e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_CPU_Q))
8171e65e175bSOded Gabbay 		return 0;
8172e65e175bSOded Gabbay 
8173e65e175bSOded Gabbay 	return hl_fw_get_eeprom_data(hdev, data, max_size);
8174e65e175bSOded Gabbay }
8175e65e175bSOded Gabbay 
gaudi_get_monitor_dump(struct hl_device * hdev,void * data)8176e65e175bSOded Gabbay static int gaudi_get_monitor_dump(struct hl_device *hdev, void *data)
8177e65e175bSOded Gabbay {
8178e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
8179e65e175bSOded Gabbay 
8180e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_CPU_Q))
8181e65e175bSOded Gabbay 		return 0;
8182e65e175bSOded Gabbay 
8183e65e175bSOded Gabbay 	return hl_fw_get_monitor_dump(hdev, data);
8184e65e175bSOded Gabbay }
8185e65e175bSOded Gabbay 
8186e65e175bSOded Gabbay /*
8187e65e175bSOded Gabbay  * this function should be used only during initialization and/or after reset,
8188e65e175bSOded Gabbay  * when there are no active users.
8189e65e175bSOded Gabbay  */
gaudi_run_tpc_kernel(struct hl_device * hdev,u64 tpc_kernel,u32 tpc_id)8190e65e175bSOded Gabbay static int gaudi_run_tpc_kernel(struct hl_device *hdev, u64 tpc_kernel,	u32 tpc_id)
8191e65e175bSOded Gabbay {
8192e65e175bSOded Gabbay 	u64 kernel_timeout;
8193e65e175bSOded Gabbay 	u32 status, offset;
8194e65e175bSOded Gabbay 	int rc;
8195e65e175bSOded Gabbay 
8196e65e175bSOded Gabbay 	offset = tpc_id * (mmTPC1_CFG_STATUS - mmTPC0_CFG_STATUS);
8197e65e175bSOded Gabbay 
8198e65e175bSOded Gabbay 	if (hdev->pldm)
8199e65e175bSOded Gabbay 		kernel_timeout = GAUDI_PLDM_TPC_KERNEL_WAIT_USEC;
8200e65e175bSOded Gabbay 	else
8201e65e175bSOded Gabbay 		kernel_timeout = HL_DEVICE_TIMEOUT_USEC;
8202e65e175bSOded Gabbay 
8203e65e175bSOded Gabbay 	WREG32(mmTPC0_CFG_QM_KERNEL_BASE_ADDRESS_LOW + offset,
8204e65e175bSOded Gabbay 			lower_32_bits(tpc_kernel));
8205e65e175bSOded Gabbay 	WREG32(mmTPC0_CFG_QM_KERNEL_BASE_ADDRESS_HIGH + offset,
8206e65e175bSOded Gabbay 			upper_32_bits(tpc_kernel));
8207e65e175bSOded Gabbay 
8208e65e175bSOded Gabbay 	WREG32(mmTPC0_CFG_ICACHE_BASE_ADDERESS_LOW + offset,
8209e65e175bSOded Gabbay 			lower_32_bits(tpc_kernel));
8210e65e175bSOded Gabbay 	WREG32(mmTPC0_CFG_ICACHE_BASE_ADDERESS_HIGH + offset,
8211e65e175bSOded Gabbay 			upper_32_bits(tpc_kernel));
8212e65e175bSOded Gabbay 	/* set a valid LUT pointer, content is of no significance */
8213e65e175bSOded Gabbay 	WREG32(mmTPC0_CFG_LUT_FUNC256_BASE_ADDR_LO + offset,
8214e65e175bSOded Gabbay 			lower_32_bits(tpc_kernel));
8215e65e175bSOded Gabbay 	WREG32(mmTPC0_CFG_LUT_FUNC256_BASE_ADDR_HI + offset,
8216e65e175bSOded Gabbay 			upper_32_bits(tpc_kernel));
8217e65e175bSOded Gabbay 
8218e65e175bSOded Gabbay 	WREG32(mmTPC0_CFG_QM_SYNC_OBJECT_ADDR + offset,
8219e65e175bSOded Gabbay 			lower_32_bits(CFG_BASE +
8220e65e175bSOded Gabbay 				mmSYNC_MNGR_E_N_SYNC_MNGR_OBJS_SOB_OBJ_0));
8221e65e175bSOded Gabbay 
8222e65e175bSOded Gabbay 	WREG32(mmTPC0_CFG_TPC_CMD + offset,
8223e65e175bSOded Gabbay 			(1 << TPC0_CFG_TPC_CMD_ICACHE_INVALIDATE_SHIFT |
8224e65e175bSOded Gabbay 			1 << TPC0_CFG_TPC_CMD_ICACHE_PREFETCH_64KB_SHIFT));
8225e65e175bSOded Gabbay 	/* wait a bit for the engine to start executing */
8226e65e175bSOded Gabbay 	usleep_range(1000, 1500);
8227e65e175bSOded Gabbay 
8228e65e175bSOded Gabbay 	/* wait until engine has finished executing */
8229e65e175bSOded Gabbay 	rc = hl_poll_timeout(
8230e65e175bSOded Gabbay 		hdev,
8231e65e175bSOded Gabbay 		mmTPC0_CFG_STATUS + offset,
8232e65e175bSOded Gabbay 		status,
8233e65e175bSOded Gabbay 		(status & TPC0_CFG_STATUS_VECTOR_PIPE_EMPTY_MASK) ==
8234e65e175bSOded Gabbay 				TPC0_CFG_STATUS_VECTOR_PIPE_EMPTY_MASK,
8235e65e175bSOded Gabbay 		1000,
8236e65e175bSOded Gabbay 		kernel_timeout);
8237e65e175bSOded Gabbay 
8238e65e175bSOded Gabbay 	if (rc) {
8239e65e175bSOded Gabbay 		dev_err(hdev->dev,
8240e65e175bSOded Gabbay 			"Timeout while waiting for TPC%d icache prefetch\n",
8241e65e175bSOded Gabbay 			tpc_id);
8242e65e175bSOded Gabbay 		return -EIO;
8243e65e175bSOded Gabbay 	}
8244e65e175bSOded Gabbay 
8245e65e175bSOded Gabbay 	WREG32(mmTPC0_CFG_TPC_EXECUTE + offset,
8246e65e175bSOded Gabbay 			1 << TPC0_CFG_TPC_EXECUTE_V_SHIFT);
8247e65e175bSOded Gabbay 
8248e65e175bSOded Gabbay 	/* wait a bit for the engine to start executing */
8249e65e175bSOded Gabbay 	usleep_range(1000, 1500);
8250e65e175bSOded Gabbay 
8251e65e175bSOded Gabbay 	/* wait until engine has finished executing */
8252e65e175bSOded Gabbay 	rc = hl_poll_timeout(
8253e65e175bSOded Gabbay 		hdev,
8254e65e175bSOded Gabbay 		mmTPC0_CFG_STATUS + offset,
8255e65e175bSOded Gabbay 		status,
8256e65e175bSOded Gabbay 		(status & TPC0_CFG_STATUS_VECTOR_PIPE_EMPTY_MASK) ==
8257e65e175bSOded Gabbay 				TPC0_CFG_STATUS_VECTOR_PIPE_EMPTY_MASK,
8258e65e175bSOded Gabbay 		1000,
8259e65e175bSOded Gabbay 		kernel_timeout);
8260e65e175bSOded Gabbay 
8261e65e175bSOded Gabbay 	if (rc) {
8262e65e175bSOded Gabbay 		dev_err(hdev->dev,
8263e65e175bSOded Gabbay 			"Timeout while waiting for TPC%d vector pipe\n",
8264e65e175bSOded Gabbay 			tpc_id);
8265e65e175bSOded Gabbay 		return -EIO;
8266e65e175bSOded Gabbay 	}
8267e65e175bSOded Gabbay 
8268e65e175bSOded Gabbay 	rc = hl_poll_timeout(
8269e65e175bSOded Gabbay 		hdev,
8270e65e175bSOded Gabbay 		mmTPC0_CFG_WQ_INFLIGHT_CNTR + offset,
8271e65e175bSOded Gabbay 		status,
8272e65e175bSOded Gabbay 		(status == 0),
8273e65e175bSOded Gabbay 		1000,
8274e65e175bSOded Gabbay 		kernel_timeout);
8275e65e175bSOded Gabbay 
8276e65e175bSOded Gabbay 	if (rc) {
8277e65e175bSOded Gabbay 		dev_err(hdev->dev,
8278e65e175bSOded Gabbay 			"Timeout while waiting for TPC%d kernel to execute\n",
8279e65e175bSOded Gabbay 			tpc_id);
8280e65e175bSOded Gabbay 		return -EIO;
8281e65e175bSOded Gabbay 	}
8282e65e175bSOded Gabbay 
8283e65e175bSOded Gabbay 	return 0;
8284e65e175bSOded Gabbay }
8285e65e175bSOded Gabbay 
gaudi_internal_cb_pool_init(struct hl_device * hdev,struct hl_ctx * ctx)8286e65e175bSOded Gabbay static int gaudi_internal_cb_pool_init(struct hl_device *hdev,
8287e65e175bSOded Gabbay 		struct hl_ctx *ctx)
8288e65e175bSOded Gabbay {
8289e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
8290e65e175bSOded Gabbay 	int min_alloc_order, rc, collective_cb_size;
8291e65e175bSOded Gabbay 
8292e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_MMU))
8293e65e175bSOded Gabbay 		return 0;
8294e65e175bSOded Gabbay 
8295e65e175bSOded Gabbay 	hdev->internal_cb_pool_virt_addr = hl_asic_dma_alloc_coherent(hdev,
8296e65e175bSOded Gabbay 							HOST_SPACE_INTERNAL_CB_SZ,
8297e65e175bSOded Gabbay 							&hdev->internal_cb_pool_dma_addr,
8298e65e175bSOded Gabbay 							GFP_KERNEL | __GFP_ZERO);
8299e65e175bSOded Gabbay 
8300e65e175bSOded Gabbay 	if (!hdev->internal_cb_pool_virt_addr)
8301e65e175bSOded Gabbay 		return -ENOMEM;
8302e65e175bSOded Gabbay 
8303e65e175bSOded Gabbay 	collective_cb_size = sizeof(struct packet_msg_short) * 5 +
8304e65e175bSOded Gabbay 			sizeof(struct packet_fence);
8305e65e175bSOded Gabbay 	min_alloc_order = ilog2(collective_cb_size);
8306e65e175bSOded Gabbay 
8307e65e175bSOded Gabbay 	hdev->internal_cb_pool = gen_pool_create(min_alloc_order, -1);
8308e65e175bSOded Gabbay 	if (!hdev->internal_cb_pool) {
8309e65e175bSOded Gabbay 		dev_err(hdev->dev,
8310e65e175bSOded Gabbay 			"Failed to create internal CB pool\n");
8311e65e175bSOded Gabbay 		rc = -ENOMEM;
8312e65e175bSOded Gabbay 		goto free_internal_cb_pool;
8313e65e175bSOded Gabbay 	}
8314e65e175bSOded Gabbay 
8315e65e175bSOded Gabbay 	rc = gen_pool_add(hdev->internal_cb_pool,
8316e65e175bSOded Gabbay 				(uintptr_t) hdev->internal_cb_pool_virt_addr,
8317e65e175bSOded Gabbay 				HOST_SPACE_INTERNAL_CB_SZ, -1);
8318e65e175bSOded Gabbay 	if (rc) {
8319e65e175bSOded Gabbay 		dev_err(hdev->dev,
8320e65e175bSOded Gabbay 			"Failed to add memory to internal CB pool\n");
8321e65e175bSOded Gabbay 		rc = -EFAULT;
8322e65e175bSOded Gabbay 		goto destroy_internal_cb_pool;
8323e65e175bSOded Gabbay 	}
8324e65e175bSOded Gabbay 
8325e65e175bSOded Gabbay 	hdev->internal_cb_va_base = hl_reserve_va_block(hdev, ctx,
8326e65e175bSOded Gabbay 			HL_VA_RANGE_TYPE_HOST, HOST_SPACE_INTERNAL_CB_SZ,
8327e65e175bSOded Gabbay 			HL_MMU_VA_ALIGNMENT_NOT_NEEDED);
8328e65e175bSOded Gabbay 
8329e65e175bSOded Gabbay 	if (!hdev->internal_cb_va_base) {
8330e65e175bSOded Gabbay 		rc = -ENOMEM;
8331e65e175bSOded Gabbay 		goto destroy_internal_cb_pool;
8332e65e175bSOded Gabbay 	}
8333e65e175bSOded Gabbay 
8334e65e175bSOded Gabbay 	mutex_lock(&hdev->mmu_lock);
8335af5e675fSKoby Elbaz 
8336e65e175bSOded Gabbay 	rc = hl_mmu_map_contiguous(ctx, hdev->internal_cb_va_base,
8337e65e175bSOded Gabbay 			hdev->internal_cb_pool_dma_addr,
8338e65e175bSOded Gabbay 			HOST_SPACE_INTERNAL_CB_SZ);
8339e65e175bSOded Gabbay 	if (rc)
8340e65e175bSOded Gabbay 		goto unreserve_internal_cb_pool;
8341e65e175bSOded Gabbay 
8342af5e675fSKoby Elbaz 	rc = hl_mmu_invalidate_cache(hdev, false, MMU_OP_USERPTR);
8343af5e675fSKoby Elbaz 	if (rc)
8344af5e675fSKoby Elbaz 		goto unmap_internal_cb_pool;
8345af5e675fSKoby Elbaz 
8346af5e675fSKoby Elbaz 	mutex_unlock(&hdev->mmu_lock);
8347af5e675fSKoby Elbaz 
8348e65e175bSOded Gabbay 	return 0;
8349e65e175bSOded Gabbay 
8350af5e675fSKoby Elbaz unmap_internal_cb_pool:
8351af5e675fSKoby Elbaz 	hl_mmu_unmap_contiguous(ctx, hdev->internal_cb_va_base,
8352af5e675fSKoby Elbaz 			HOST_SPACE_INTERNAL_CB_SZ);
8353e65e175bSOded Gabbay unreserve_internal_cb_pool:
8354af5e675fSKoby Elbaz 	mutex_unlock(&hdev->mmu_lock);
8355e65e175bSOded Gabbay 	hl_unreserve_va_block(hdev, ctx, hdev->internal_cb_va_base,
8356e65e175bSOded Gabbay 			HOST_SPACE_INTERNAL_CB_SZ);
8357e65e175bSOded Gabbay destroy_internal_cb_pool:
8358e65e175bSOded Gabbay 	gen_pool_destroy(hdev->internal_cb_pool);
8359e65e175bSOded Gabbay free_internal_cb_pool:
8360e65e175bSOded Gabbay 	hl_asic_dma_free_coherent(hdev, HOST_SPACE_INTERNAL_CB_SZ, hdev->internal_cb_pool_virt_addr,
8361e65e175bSOded Gabbay 					hdev->internal_cb_pool_dma_addr);
8362e65e175bSOded Gabbay 
8363e65e175bSOded Gabbay 	return rc;
8364e65e175bSOded Gabbay }
8365e65e175bSOded Gabbay 
gaudi_internal_cb_pool_fini(struct hl_device * hdev,struct hl_ctx * ctx)8366e65e175bSOded Gabbay static void gaudi_internal_cb_pool_fini(struct hl_device *hdev,
8367e65e175bSOded Gabbay 		struct hl_ctx *ctx)
8368e65e175bSOded Gabbay {
8369e65e175bSOded Gabbay 	struct gaudi_device *gaudi = hdev->asic_specific;
8370e65e175bSOded Gabbay 
8371e65e175bSOded Gabbay 	if (!(gaudi->hw_cap_initialized & HW_CAP_MMU))
8372e65e175bSOded Gabbay 		return;
8373e65e175bSOded Gabbay 
8374e65e175bSOded Gabbay 	mutex_lock(&hdev->mmu_lock);
8375e65e175bSOded Gabbay 	hl_mmu_unmap_contiguous(ctx, hdev->internal_cb_va_base,
8376e65e175bSOded Gabbay 			HOST_SPACE_INTERNAL_CB_SZ);
8377e65e175bSOded Gabbay 	hl_unreserve_va_block(hdev, ctx, hdev->internal_cb_va_base,
8378e65e175bSOded Gabbay 			HOST_SPACE_INTERNAL_CB_SZ);
8379e65e175bSOded Gabbay 	hl_mmu_invalidate_cache(hdev, true, MMU_OP_USERPTR);
8380e65e175bSOded Gabbay 	mutex_unlock(&hdev->mmu_lock);
8381e65e175bSOded Gabbay 
8382e65e175bSOded Gabbay 	gen_pool_destroy(hdev->internal_cb_pool);
8383e65e175bSOded Gabbay 
8384e65e175bSOded Gabbay 	hl_asic_dma_free_coherent(hdev, HOST_SPACE_INTERNAL_CB_SZ, hdev->internal_cb_pool_virt_addr,
8385e65e175bSOded Gabbay 					hdev->internal_cb_pool_dma_addr);
8386e65e175bSOded Gabbay }
8387e65e175bSOded Gabbay 
gaudi_ctx_init(struct hl_ctx * ctx)8388e65e175bSOded Gabbay static int gaudi_ctx_init(struct hl_ctx *ctx)
8389e65e175bSOded Gabbay {
8390e65e175bSOded Gabbay 	int rc;
8391e65e175bSOded Gabbay 
8392e65e175bSOded Gabbay 	if (ctx->asid == HL_KERNEL_ASID_ID)
8393e65e175bSOded Gabbay 		return 0;
8394e65e175bSOded Gabbay 
8395e65e175bSOded Gabbay 	rc = gaudi_internal_cb_pool_init(ctx->hdev, ctx);
8396e65e175bSOded Gabbay 	if (rc)
8397e65e175bSOded Gabbay 		return rc;
8398e65e175bSOded Gabbay 
8399e65e175bSOded Gabbay 	rc = gaudi_restore_user_registers(ctx->hdev);
8400e65e175bSOded Gabbay 	if (rc)
8401e65e175bSOded Gabbay 		gaudi_internal_cb_pool_fini(ctx->hdev, ctx);
8402e65e175bSOded Gabbay 
8403e65e175bSOded Gabbay 	return rc;
8404e65e175bSOded Gabbay }
8405e65e175bSOded Gabbay 
gaudi_ctx_fini(struct hl_ctx * ctx)8406e65e175bSOded Gabbay static void gaudi_ctx_fini(struct hl_ctx *ctx)
8407e65e175bSOded Gabbay {
8408e65e175bSOded Gabbay 	if (ctx->asid == HL_KERNEL_ASID_ID)
8409e65e175bSOded Gabbay 		return;
8410e65e175bSOded Gabbay 
8411e65e175bSOded Gabbay 	gaudi_internal_cb_pool_fini(ctx->hdev, ctx);
8412e65e175bSOded Gabbay }
8413e65e175bSOded Gabbay 
gaudi_pre_schedule_cs(struct hl_cs * cs)8414e65e175bSOded Gabbay static int gaudi_pre_schedule_cs(struct hl_cs *cs)
8415e65e175bSOded Gabbay {
8416e65e175bSOded Gabbay 	return 0;
8417e65e175bSOded Gabbay }
8418e65e175bSOded Gabbay 
gaudi_get_queue_id_for_cq(struct hl_device * hdev,u32 cq_idx)8419e65e175bSOded Gabbay static u32 gaudi_get_queue_id_for_cq(struct hl_device *hdev, u32 cq_idx)
8420e65e175bSOded Gabbay {
8421e65e175bSOded Gabbay 	return gaudi_cq_assignment[cq_idx];
8422e65e175bSOded Gabbay }
8423e65e175bSOded Gabbay 
gaudi_get_signal_cb_size(struct hl_device * hdev)8424e65e175bSOded Gabbay static u32 gaudi_get_signal_cb_size(struct hl_device *hdev)
8425e65e175bSOded Gabbay {
8426e65e175bSOded Gabbay 	return sizeof(struct packet_msg_short) +
8427e65e175bSOded Gabbay 			sizeof(struct packet_msg_prot) * 2;
8428e65e175bSOded Gabbay }
8429e65e175bSOded Gabbay 
gaudi_get_wait_cb_size(struct hl_device * hdev)8430e65e175bSOded Gabbay static u32 gaudi_get_wait_cb_size(struct hl_device *hdev)
8431e65e175bSOded Gabbay {
8432e65e175bSOded Gabbay 	return sizeof(struct packet_msg_short) * 4 +
8433e65e175bSOded Gabbay 			sizeof(struct packet_fence) +
8434e65e175bSOded Gabbay 			sizeof(struct packet_msg_prot) * 2;
8435e65e175bSOded Gabbay }
8436e65e175bSOded Gabbay 
gaudi_get_sob_addr(struct hl_device * hdev,u32 sob_id)8437e65e175bSOded Gabbay static u32 gaudi_get_sob_addr(struct hl_device *hdev, u32 sob_id)
8438e65e175bSOded Gabbay {
8439e65e175bSOded Gabbay 	return mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_SOB_OBJ_0 + (sob_id * 4);
8440e65e175bSOded Gabbay }
8441e65e175bSOded Gabbay 
gaudi_gen_signal_cb(struct hl_device * hdev,void * data,u16 sob_id,u32 size,bool eb)8442e65e175bSOded Gabbay static u32 gaudi_gen_signal_cb(struct hl_device *hdev, void *data, u16 sob_id,
8443e65e175bSOded Gabbay 				u32 size, bool eb)
8444e65e175bSOded Gabbay {
8445e65e175bSOded Gabbay 	struct hl_cb *cb = (struct hl_cb *) data;
8446e65e175bSOded Gabbay 	struct packet_msg_short *pkt;
8447e65e175bSOded Gabbay 	u32 value, ctl, pkt_size = sizeof(*pkt);
8448e65e175bSOded Gabbay 
8449e65e175bSOded Gabbay 	pkt = cb->kernel_address + size;
8450e65e175bSOded Gabbay 	memset(pkt, 0, pkt_size);
8451e65e175bSOded Gabbay 
8452e65e175bSOded Gabbay 	/* Inc by 1, Mode ADD */
8453e65e175bSOded Gabbay 	value = FIELD_PREP(GAUDI_PKT_SHORT_VAL_SOB_SYNC_VAL_MASK, 1);
8454e65e175bSOded Gabbay 	value |= FIELD_PREP(GAUDI_PKT_SHORT_VAL_SOB_MOD_MASK, 1);
8455e65e175bSOded Gabbay 
8456e65e175bSOded Gabbay 	ctl = FIELD_PREP(GAUDI_PKT_SHORT_CTL_ADDR_MASK, sob_id * 4);
8457e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_SHORT_CTL_OP_MASK, 0); /* write the value */
8458e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_SHORT_CTL_BASE_MASK, 3); /* W_S SOB base */
8459e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_MSG_SHORT);
8460e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_EB_MASK, eb);
8461e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_RB_MASK, 1);
8462e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_MB_MASK, 1);
8463e65e175bSOded Gabbay 
8464e65e175bSOded Gabbay 	pkt->value = cpu_to_le32(value);
8465e65e175bSOded Gabbay 	pkt->ctl = cpu_to_le32(ctl);
8466e65e175bSOded Gabbay 
8467e65e175bSOded Gabbay 	return size + pkt_size;
8468e65e175bSOded Gabbay }
8469e65e175bSOded Gabbay 
gaudi_add_mon_msg_short(struct packet_msg_short * pkt,u32 value,u16 addr)8470e65e175bSOded Gabbay static u32 gaudi_add_mon_msg_short(struct packet_msg_short *pkt, u32 value,
8471e65e175bSOded Gabbay 					u16 addr)
8472e65e175bSOded Gabbay {
8473e65e175bSOded Gabbay 	u32 ctl, pkt_size = sizeof(*pkt);
8474e65e175bSOded Gabbay 
8475e65e175bSOded Gabbay 	memset(pkt, 0, pkt_size);
8476e65e175bSOded Gabbay 
8477e65e175bSOded Gabbay 	ctl = FIELD_PREP(GAUDI_PKT_SHORT_CTL_ADDR_MASK, addr);
8478e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_SHORT_CTL_BASE_MASK, 2);  /* W_S MON base */
8479e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_MSG_SHORT);
8480e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_EB_MASK, 0);
8481e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_RB_MASK, 1);
8482e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_MB_MASK, 0); /* last pkt MB */
8483e65e175bSOded Gabbay 
8484e65e175bSOded Gabbay 	pkt->value = cpu_to_le32(value);
8485e65e175bSOded Gabbay 	pkt->ctl = cpu_to_le32(ctl);
8486e65e175bSOded Gabbay 
8487e65e175bSOded Gabbay 	return pkt_size;
8488e65e175bSOded Gabbay }
8489e65e175bSOded Gabbay 
gaudi_add_arm_monitor_pkt(struct hl_device * hdev,struct packet_msg_short * pkt,u16 sob_base,u8 sob_mask,u16 sob_val,u16 mon_id)8490e65e175bSOded Gabbay static u32 gaudi_add_arm_monitor_pkt(struct hl_device *hdev,
8491e65e175bSOded Gabbay 		struct packet_msg_short *pkt, u16 sob_base, u8 sob_mask,
8492e65e175bSOded Gabbay 		u16 sob_val, u16 mon_id)
8493e65e175bSOded Gabbay {
8494e65e175bSOded Gabbay 	u64 monitor_base;
8495e65e175bSOded Gabbay 	u32 ctl, value, pkt_size = sizeof(*pkt);
8496e65e175bSOded Gabbay 	u16 msg_addr_offset;
8497e65e175bSOded Gabbay 	u8 mask;
8498e65e175bSOded Gabbay 
8499e65e175bSOded Gabbay 	if (hl_gen_sob_mask(sob_base, sob_mask, &mask)) {
8500e65e175bSOded Gabbay 		dev_err(hdev->dev,
8501e65e175bSOded Gabbay 			"sob_base %u (mask %#x) is not valid\n",
8502e65e175bSOded Gabbay 			sob_base, sob_mask);
8503e65e175bSOded Gabbay 		return 0;
8504e65e175bSOded Gabbay 	}
8505e65e175bSOded Gabbay 
8506e65e175bSOded Gabbay 	/*
8507e65e175bSOded Gabbay 	 * monitor_base should be the content of the base0 address registers,
8508e65e175bSOded Gabbay 	 * so it will be added to the msg short offsets
8509e65e175bSOded Gabbay 	 */
8510e65e175bSOded Gabbay 	monitor_base = mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0;
8511e65e175bSOded Gabbay 
8512e65e175bSOded Gabbay 	msg_addr_offset =
8513e65e175bSOded Gabbay 		(mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_ARM_0 + mon_id * 4) -
8514e65e175bSOded Gabbay 				monitor_base;
8515e65e175bSOded Gabbay 
8516e65e175bSOded Gabbay 	memset(pkt, 0, pkt_size);
8517e65e175bSOded Gabbay 
8518e65e175bSOded Gabbay 	/* Monitor config packet: bind the monitor to a sync object */
8519e65e175bSOded Gabbay 	value = FIELD_PREP(GAUDI_PKT_SHORT_VAL_MON_SYNC_GID_MASK, sob_base / 8);
8520e65e175bSOded Gabbay 	value |= FIELD_PREP(GAUDI_PKT_SHORT_VAL_MON_SYNC_VAL_MASK, sob_val);
8521e65e175bSOded Gabbay 	value |= FIELD_PREP(GAUDI_PKT_SHORT_VAL_MON_MODE_MASK,
8522e65e175bSOded Gabbay 			0); /* GREATER OR EQUAL*/
8523e65e175bSOded Gabbay 	value |= FIELD_PREP(GAUDI_PKT_SHORT_VAL_MON_MASK_MASK, mask);
8524e65e175bSOded Gabbay 
8525e65e175bSOded Gabbay 	ctl = FIELD_PREP(GAUDI_PKT_SHORT_CTL_ADDR_MASK, msg_addr_offset);
8526e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_SHORT_CTL_OP_MASK, 0); /* write the value */
8527e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_SHORT_CTL_BASE_MASK, 2); /* W_S MON base */
8528e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_MSG_SHORT);
8529e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_EB_MASK, 0);
8530e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_RB_MASK, 1);
8531e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_MB_MASK, 1);
8532e65e175bSOded Gabbay 
8533e65e175bSOded Gabbay 	pkt->value = cpu_to_le32(value);
8534e65e175bSOded Gabbay 	pkt->ctl = cpu_to_le32(ctl);
8535e65e175bSOded Gabbay 
8536e65e175bSOded Gabbay 	return pkt_size;
8537e65e175bSOded Gabbay }
8538e65e175bSOded Gabbay 
gaudi_add_fence_pkt(struct packet_fence * pkt)8539e65e175bSOded Gabbay static u32 gaudi_add_fence_pkt(struct packet_fence *pkt)
8540e65e175bSOded Gabbay {
8541e65e175bSOded Gabbay 	u32 ctl, cfg, pkt_size = sizeof(*pkt);
8542e65e175bSOded Gabbay 
8543e65e175bSOded Gabbay 	memset(pkt, 0, pkt_size);
8544e65e175bSOded Gabbay 
8545e65e175bSOded Gabbay 	cfg = FIELD_PREP(GAUDI_PKT_FENCE_CFG_DEC_VAL_MASK, 1);
8546e65e175bSOded Gabbay 	cfg |= FIELD_PREP(GAUDI_PKT_FENCE_CFG_TARGET_VAL_MASK, 1);
8547e65e175bSOded Gabbay 	cfg |= FIELD_PREP(GAUDI_PKT_FENCE_CFG_ID_MASK, 2);
8548e65e175bSOded Gabbay 
8549e65e175bSOded Gabbay 	ctl = FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_FENCE);
8550e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_EB_MASK, 0);
8551e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_RB_MASK, 1);
8552e65e175bSOded Gabbay 	ctl |= FIELD_PREP(GAUDI_PKT_CTL_MB_MASK, 1);
8553e65e175bSOded Gabbay 
8554e65e175bSOded Gabbay 	pkt->cfg = cpu_to_le32(cfg);
8555e65e175bSOded Gabbay 	pkt->ctl = cpu_to_le32(ctl);
8556e65e175bSOded Gabbay 
8557e65e175bSOded Gabbay 	return pkt_size;
8558e65e175bSOded Gabbay }
8559e65e175bSOded Gabbay 
gaudi_get_fence_addr(struct hl_device * hdev,u32 queue_id,u64 * addr)8560e65e175bSOded Gabbay static int gaudi_get_fence_addr(struct hl_device *hdev, u32 queue_id, u64 *addr)
8561e65e175bSOded Gabbay {
8562e65e175bSOded Gabbay 	u32 offset, nic_index;
8563e65e175bSOded Gabbay 
8564e65e175bSOded Gabbay 	switch (queue_id) {
8565e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_0_0:
8566e65e175bSOded Gabbay 		offset = mmDMA0_QM_CP_FENCE2_RDATA_0;
8567e65e175bSOded Gabbay 		break;
8568e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_0_1:
8569e65e175bSOded Gabbay 		offset = mmDMA0_QM_CP_FENCE2_RDATA_1;
8570e65e175bSOded Gabbay 		break;
8571e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_0_2:
8572e65e175bSOded Gabbay 		offset = mmDMA0_QM_CP_FENCE2_RDATA_2;
8573e65e175bSOded Gabbay 		break;
8574e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_0_3:
8575e65e175bSOded Gabbay 		offset = mmDMA0_QM_CP_FENCE2_RDATA_3;
8576e65e175bSOded Gabbay 		break;
8577e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_1_0:
8578e65e175bSOded Gabbay 		offset = mmDMA1_QM_CP_FENCE2_RDATA_0;
8579e65e175bSOded Gabbay 		break;
8580e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_1_1:
8581e65e175bSOded Gabbay 		offset = mmDMA1_QM_CP_FENCE2_RDATA_1;
8582e65e175bSOded Gabbay 		break;
8583e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_1_2:
8584e65e175bSOded Gabbay 		offset = mmDMA1_QM_CP_FENCE2_RDATA_2;
8585e65e175bSOded Gabbay 		break;
8586e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_1_3:
8587e65e175bSOded Gabbay 		offset = mmDMA1_QM_CP_FENCE2_RDATA_3;
8588e65e175bSOded Gabbay 		break;
8589e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_5_0:
8590e65e175bSOded Gabbay 		offset = mmDMA5_QM_CP_FENCE2_RDATA_0;
8591e65e175bSOded Gabbay 		break;
8592e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_5_1:
8593e65e175bSOded Gabbay 		offset = mmDMA5_QM_CP_FENCE2_RDATA_1;
8594e65e175bSOded Gabbay 		break;
8595e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_5_2:
8596e65e175bSOded Gabbay 		offset = mmDMA5_QM_CP_FENCE2_RDATA_2;
8597e65e175bSOded Gabbay 		break;
8598e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_DMA_5_3:
8599e65e175bSOded Gabbay 		offset = mmDMA5_QM_CP_FENCE2_RDATA_3;
8600e65e175bSOded Gabbay 		break;
8601e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_7_0:
8602e65e175bSOded Gabbay 		offset = mmTPC7_QM_CP_FENCE2_RDATA_0;
8603e65e175bSOded Gabbay 		break;
8604e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_7_1:
8605e65e175bSOded Gabbay 		offset = mmTPC7_QM_CP_FENCE2_RDATA_1;
8606e65e175bSOded Gabbay 		break;
8607e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_7_2:
8608e65e175bSOded Gabbay 		offset = mmTPC7_QM_CP_FENCE2_RDATA_2;
8609e65e175bSOded Gabbay 		break;
8610e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_TPC_7_3:
8611e65e175bSOded Gabbay 		offset = mmTPC7_QM_CP_FENCE2_RDATA_3;
8612e65e175bSOded Gabbay 		break;
8613e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_0_0:
8614e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_1_0:
8615e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_2_0:
8616e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_3_0:
8617e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_4_0:
8618e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_5_0:
8619e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_6_0:
8620e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_7_0:
8621e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_8_0:
8622e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_9_0:
8623e65e175bSOded Gabbay 		nic_index = (queue_id - GAUDI_QUEUE_ID_NIC_0_0) >> 2;
8624e65e175bSOded Gabbay 		offset = mmNIC0_QM0_CP_FENCE2_RDATA_0 +
8625e65e175bSOded Gabbay 				(nic_index >> 1) * NIC_MACRO_QMAN_OFFSET +
8626e65e175bSOded Gabbay 				(nic_index & 0x1) * NIC_ENGINE_QMAN_OFFSET;
8627e65e175bSOded Gabbay 		break;
8628e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_0_1:
8629e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_1_1:
8630e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_2_1:
8631e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_3_1:
8632e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_4_1:
8633e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_5_1:
8634e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_6_1:
8635e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_7_1:
8636e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_8_1:
8637e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_9_1:
8638e65e175bSOded Gabbay 		nic_index = (queue_id - GAUDI_QUEUE_ID_NIC_0_1) >> 2;
8639e65e175bSOded Gabbay 		offset = mmNIC0_QM0_CP_FENCE2_RDATA_1 +
8640e65e175bSOded Gabbay 				(nic_index >> 1) * NIC_MACRO_QMAN_OFFSET +
8641e65e175bSOded Gabbay 				(nic_index & 0x1) * NIC_ENGINE_QMAN_OFFSET;
8642e65e175bSOded Gabbay 		break;
8643e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_0_2:
8644e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_1_2:
8645e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_2_2:
8646e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_3_2:
8647e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_4_2:
8648e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_5_2:
8649e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_6_2:
8650e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_7_2:
8651e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_8_2:
8652e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_9_2:
8653e65e175bSOded Gabbay 		nic_index = (queue_id - GAUDI_QUEUE_ID_NIC_0_2) >> 2;
8654e65e175bSOded Gabbay 		offset = mmNIC0_QM0_CP_FENCE2_RDATA_2 +
8655e65e175bSOded Gabbay 				(nic_index >> 1) * NIC_MACRO_QMAN_OFFSET +
8656e65e175bSOded Gabbay 				(nic_index & 0x1) * NIC_ENGINE_QMAN_OFFSET;
8657e65e175bSOded Gabbay 		break;
8658e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_0_3:
8659e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_1_3:
8660e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_2_3:
8661e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_3_3:
8662e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_4_3:
8663e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_5_3:
8664e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_6_3:
8665e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_7_3:
8666e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_8_3:
8667e65e175bSOded Gabbay 	case GAUDI_QUEUE_ID_NIC_9_3:
8668e65e175bSOded Gabbay 		nic_index = (queue_id - GAUDI_QUEUE_ID_NIC_0_3) >> 2;
8669e65e175bSOded Gabbay 		offset = mmNIC0_QM0_CP_FENCE2_RDATA_3 +
8670e65e175bSOded Gabbay 				(nic_index >> 1) * NIC_MACRO_QMAN_OFFSET +
8671e65e175bSOded Gabbay 				(nic_index & 0x1) * NIC_ENGINE_QMAN_OFFSET;
8672e65e175bSOded Gabbay 		break;
8673e65e175bSOded Gabbay 	default:
8674e65e175bSOded Gabbay 		return -EINVAL;
8675e65e175bSOded Gabbay 	}
8676e65e175bSOded Gabbay 
8677e65e175bSOded Gabbay 	*addr = CFG_BASE + offset;
8678e65e175bSOded Gabbay 
8679e65e175bSOded Gabbay 	return 0;
8680e65e175bSOded Gabbay }
8681e65e175bSOded Gabbay 
gaudi_add_mon_pkts(void * buf,u16 mon_id,u64 fence_addr)8682e65e175bSOded Gabbay static u32 gaudi_add_mon_pkts(void *buf, u16 mon_id, u64 fence_addr)
8683e65e175bSOded Gabbay {
8684e65e175bSOded Gabbay 	u64 monitor_base;
8685e65e175bSOded Gabbay 	u32 size = 0;
8686e65e175bSOded Gabbay 	u16 msg_addr_offset;
8687e65e175bSOded Gabbay 
8688e65e175bSOded Gabbay 	/*
8689e65e175bSOded Gabbay 	 * monitor_base should be the content of the base0 address registers,
8690e65e175bSOded Gabbay 	 * so it will be added to the msg short offsets
8691e65e175bSOded Gabbay 	 */
8692e65e175bSOded Gabbay 	monitor_base = mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0;
8693e65e175bSOded Gabbay 
8694e65e175bSOded Gabbay 	/* First monitor config packet: low address of the sync */
8695e65e175bSOded Gabbay 	msg_addr_offset =
8696e65e175bSOded Gabbay 		(mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_id * 4) -
8697e65e175bSOded Gabbay 				monitor_base;
8698e65e175bSOded Gabbay 
8699e65e175bSOded Gabbay 	size += gaudi_add_mon_msg_short(buf + size, (u32) fence_addr,
8700e65e175bSOded Gabbay 					msg_addr_offset);
8701e65e175bSOded Gabbay 
8702e65e175bSOded Gabbay 	/* Second monitor config packet: high address of the sync */
8703e65e175bSOded Gabbay 	msg_addr_offset =
8704e65e175bSOded Gabbay 		(mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + mon_id * 4) -
8705e65e175bSOded Gabbay 				monitor_base;
8706e65e175bSOded Gabbay 
8707e65e175bSOded Gabbay 	size += gaudi_add_mon_msg_short(buf + size, (u32) (fence_addr >> 32),
8708e65e175bSOded Gabbay 					msg_addr_offset);
8709e65e175bSOded Gabbay 
8710e65e175bSOded Gabbay 	/*
8711e65e175bSOded Gabbay 	 * Third monitor config packet: the payload, i.e. what to write when the
8712e65e175bSOded Gabbay 	 * sync triggers
8713e65e175bSOded Gabbay 	 */
8714e65e175bSOded Gabbay 	msg_addr_offset =
8715e65e175bSOded Gabbay 		(mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_id * 4) -
8716e65e175bSOded Gabbay 				monitor_base;
8717e65e175bSOded Gabbay 
8718e65e175bSOded Gabbay 	size += gaudi_add_mon_msg_short(buf + size, 1, msg_addr_offset);
8719e65e175bSOded Gabbay 
8720e65e175bSOded Gabbay 	return size;
8721e65e175bSOded Gabbay }
8722e65e175bSOded Gabbay 
gaudi_gen_wait_cb(struct hl_device * hdev,struct hl_gen_wait_properties * prop)8723e65e175bSOded Gabbay static u32 gaudi_gen_wait_cb(struct hl_device *hdev,
8724e65e175bSOded Gabbay 				struct hl_gen_wait_properties *prop)
8725e65e175bSOded Gabbay {
8726e65e175bSOded Gabbay 	struct hl_cb *cb = (struct hl_cb *) prop->data;
8727e65e175bSOded Gabbay 	void *buf = cb->kernel_address;
8728e65e175bSOded Gabbay 	u64 fence_addr = 0;
8729e65e175bSOded Gabbay 	u32 size = prop->size;
8730e65e175bSOded Gabbay 
8731e65e175bSOded Gabbay 	if (gaudi_get_fence_addr(hdev, prop->q_idx, &fence_addr)) {
8732e65e175bSOded Gabbay 		dev_crit(hdev->dev, "wrong queue id %d for wait packet\n",
8733e65e175bSOded Gabbay 				prop->q_idx);
8734e65e175bSOded Gabbay 		return 0;
8735e65e175bSOded Gabbay 	}
8736e65e175bSOded Gabbay 
8737e65e175bSOded Gabbay 	size += gaudi_add_mon_pkts(buf + size, prop->mon_id, fence_addr);
8738e65e175bSOded Gabbay 	size += gaudi_add_arm_monitor_pkt(hdev, buf + size, prop->sob_base,
8739e65e175bSOded Gabbay 			prop->sob_mask, prop->sob_val, prop->mon_id);
8740e65e175bSOded Gabbay 	size += gaudi_add_fence_pkt(buf + size);
8741e65e175bSOded Gabbay 
8742e65e175bSOded Gabbay 	return size;
8743e65e175bSOded Gabbay }
8744e65e175bSOded Gabbay 
gaudi_reset_sob(struct hl_device * hdev,void * data)8745e65e175bSOded Gabbay static void gaudi_reset_sob(struct hl_device *hdev, void *data)
8746e65e175bSOded Gabbay {
8747e65e175bSOded Gabbay 	struct hl_hw_sob *hw_sob = (struct hl_hw_sob *) data;
8748e65e175bSOded Gabbay 
8749e65e175bSOded Gabbay 	dev_dbg(hdev->dev, "reset SOB, q_idx: %d, sob_id: %d\n", hw_sob->q_idx,
8750e65e175bSOded Gabbay 		hw_sob->sob_id);
8751e65e175bSOded Gabbay 
8752e65e175bSOded Gabbay 	WREG32(mmSYNC_MNGR_W_S_SYNC_MNGR_OBJS_SOB_OBJ_0 +
8753e65e175bSOded Gabbay 			hw_sob->sob_id * 4, 0);
8754e65e175bSOded Gabbay 
8755e65e175bSOded Gabbay 	kref_init(&hw_sob->kref);
8756e65e175bSOded Gabbay }
8757e65e175bSOded Gabbay 
gaudi_get_device_time(struct hl_device * hdev)8758e65e175bSOded Gabbay static u64 gaudi_get_device_time(struct hl_device *hdev)
8759e65e175bSOded Gabbay {
8760e65e175bSOded Gabbay 	u64 device_time = ((u64) RREG32(mmPSOC_TIMESTAMP_CNTCVU)) << 32;
8761e65e175bSOded Gabbay 
8762e65e175bSOded Gabbay 	return device_time | RREG32(mmPSOC_TIMESTAMP_CNTCVL);
8763e65e175bSOded Gabbay }
8764e65e175bSOded Gabbay 
gaudi_get_hw_block_id(struct hl_device * hdev,u64 block_addr,u32 * block_size,u32 * block_id)8765e65e175bSOded Gabbay static int gaudi_get_hw_block_id(struct hl_device *hdev, u64 block_addr,
8766e65e175bSOded Gabbay 				u32 *block_size, u32 *block_id)
8767e65e175bSOded Gabbay {
8768e65e175bSOded Gabbay 	return -EPERM;
8769e65e175bSOded Gabbay }
8770e65e175bSOded Gabbay 
gaudi_block_mmap(struct hl_device * hdev,struct vm_area_struct * vma,u32 block_id,u32 block_size)8771e65e175bSOded Gabbay static int gaudi_block_mmap(struct hl_device *hdev,
8772e65e175bSOded Gabbay 				struct vm_area_struct *vma,
8773e65e175bSOded Gabbay 				u32 block_id, u32 block_size)
8774e65e175bSOded Gabbay {
8775e65e175bSOded Gabbay 	return -EPERM;
8776e65e175bSOded Gabbay }
8777e65e175bSOded Gabbay 
gaudi_enable_events_from_fw(struct hl_device * hdev)8778e65e175bSOded Gabbay static void gaudi_enable_events_from_fw(struct hl_device *hdev)
8779e65e175bSOded Gabbay {
8780e65e175bSOded Gabbay 	struct cpu_dyn_regs *dyn_regs =
8781e65e175bSOded Gabbay 			&hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
8782e65e175bSOded Gabbay 	u32 irq_handler_offset = hdev->asic_prop.gic_interrupts_enable ?
8783e65e175bSOded Gabbay 			mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR :
8784e65e175bSOded Gabbay 			le32_to_cpu(dyn_regs->gic_host_ints_irq);
8785e65e175bSOded Gabbay 
8786e65e175bSOded Gabbay 	WREG32(irq_handler_offset,
8787e65e175bSOded Gabbay 		gaudi_irq_map_table[GAUDI_EVENT_INTS_REGISTER].cpu_id);
8788e65e175bSOded Gabbay }
8789e65e175bSOded Gabbay 
gaudi_ack_mmu_page_fault_or_access_error(struct hl_device * hdev,u64 mmu_cap_mask)8790e65e175bSOded Gabbay static int gaudi_ack_mmu_page_fault_or_access_error(struct hl_device *hdev, u64 mmu_cap_mask)
8791e65e175bSOded Gabbay {
8792e65e175bSOded Gabbay 	return -EINVAL;
8793e65e175bSOded Gabbay }
8794e65e175bSOded Gabbay 
gaudi_map_pll_idx_to_fw_idx(u32 pll_idx)8795e65e175bSOded Gabbay static int gaudi_map_pll_idx_to_fw_idx(u32 pll_idx)
8796e65e175bSOded Gabbay {
8797e65e175bSOded Gabbay 	switch (pll_idx) {
8798e65e175bSOded Gabbay 	case HL_GAUDI_CPU_PLL: return CPU_PLL;
8799e65e175bSOded Gabbay 	case HL_GAUDI_PCI_PLL: return PCI_PLL;
8800e65e175bSOded Gabbay 	case HL_GAUDI_NIC_PLL: return NIC_PLL;
8801e65e175bSOded Gabbay 	case HL_GAUDI_DMA_PLL: return DMA_PLL;
8802e65e175bSOded Gabbay 	case HL_GAUDI_MESH_PLL: return MESH_PLL;
8803e65e175bSOded Gabbay 	case HL_GAUDI_MME_PLL: return MME_PLL;
8804e65e175bSOded Gabbay 	case HL_GAUDI_TPC_PLL: return TPC_PLL;
8805e65e175bSOded Gabbay 	case HL_GAUDI_IF_PLL: return IF_PLL;
8806e65e175bSOded Gabbay 	case HL_GAUDI_SRAM_PLL: return SRAM_PLL;
8807e65e175bSOded Gabbay 	case HL_GAUDI_HBM_PLL: return HBM_PLL;
8808e65e175bSOded Gabbay 	default: return -EINVAL;
8809e65e175bSOded Gabbay 	}
8810e65e175bSOded Gabbay }
8811e65e175bSOded Gabbay 
gaudi_add_sync_to_engine_map_entry(struct hl_sync_to_engine_map * map,u32 reg_value,enum hl_sync_engine_type engine_type,u32 engine_id)8812e65e175bSOded Gabbay static int gaudi_add_sync_to_engine_map_entry(
8813e65e175bSOded Gabbay 	struct hl_sync_to_engine_map *map, u32 reg_value,
8814e65e175bSOded Gabbay 	enum hl_sync_engine_type engine_type, u32 engine_id)
8815e65e175bSOded Gabbay {
8816e65e175bSOded Gabbay 	struct hl_sync_to_engine_map_entry *entry;
8817e65e175bSOded Gabbay 
8818e65e175bSOded Gabbay 	/* Reg value represents a partial address of sync object,
8819e65e175bSOded Gabbay 	 * it is used as unique identifier. For this we need to
8820e65e175bSOded Gabbay 	 * clear the cutoff cfg base bits from the value.
8821e65e175bSOded Gabbay 	 */
8822e65e175bSOded Gabbay 	if (reg_value == 0 || reg_value == 0xffffffff)
8823e65e175bSOded Gabbay 		return 0;
8824e65e175bSOded Gabbay 	reg_value -= lower_32_bits(CFG_BASE);
8825e65e175bSOded Gabbay 
8826e65e175bSOded Gabbay 	/* create a new hash entry */
8827e65e175bSOded Gabbay 	entry = kzalloc(sizeof(*entry), GFP_KERNEL);
8828e65e175bSOded Gabbay 	if (!entry)
8829e65e175bSOded Gabbay 		return -ENOMEM;
8830e65e175bSOded Gabbay 	entry->engine_type = engine_type;
8831e65e175bSOded Gabbay 	entry->engine_id = engine_id;
8832e65e175bSOded Gabbay 	entry->sync_id = reg_value;
8833e65e175bSOded Gabbay 	hash_add(map->tb, &entry->node, reg_value);
8834e65e175bSOded Gabbay 
8835e65e175bSOded Gabbay 	return 0;
8836e65e175bSOded Gabbay }
8837e65e175bSOded Gabbay 
gaudi_gen_sync_to_engine_map(struct hl_device * hdev,struct hl_sync_to_engine_map * map)8838e65e175bSOded Gabbay static int gaudi_gen_sync_to_engine_map(struct hl_device *hdev,
8839e65e175bSOded Gabbay 				struct hl_sync_to_engine_map *map)
8840e65e175bSOded Gabbay {
8841e65e175bSOded Gabbay 	struct hl_state_dump_specs *sds = &hdev->state_dump_specs;
8842e65e175bSOded Gabbay 	int i, j, rc;
8843e65e175bSOded Gabbay 	u32 reg_value;
8844e65e175bSOded Gabbay 
8845e65e175bSOded Gabbay 	/* Iterate over TPC engines */
8846e65e175bSOded Gabbay 	for (i = 0; i < sds->props[SP_NUM_OF_TPC_ENGINES]; ++i) {
8847e65e175bSOded Gabbay 
8848e65e175bSOded Gabbay 		reg_value = RREG32(sds->props[SP_TPC0_CFG_SO] +
8849e65e175bSOded Gabbay 					sds->props[SP_NEXT_TPC] * i);
8850e65e175bSOded Gabbay 
8851e65e175bSOded Gabbay 		rc = gaudi_add_sync_to_engine_map_entry(map, reg_value,
8852e65e175bSOded Gabbay 							ENGINE_TPC, i);
8853e65e175bSOded Gabbay 		if (rc)
8854e65e175bSOded Gabbay 			goto free_sync_to_engine_map;
8855e65e175bSOded Gabbay 	}
8856e65e175bSOded Gabbay 
8857e65e175bSOded Gabbay 	/* Iterate over MME engines */
8858e65e175bSOded Gabbay 	for (i = 0; i < sds->props[SP_NUM_OF_MME_ENGINES]; ++i) {
8859e65e175bSOded Gabbay 		for (j = 0; j < sds->props[SP_SUB_MME_ENG_NUM]; ++j) {
8860e65e175bSOded Gabbay 
8861e65e175bSOded Gabbay 			reg_value = RREG32(sds->props[SP_MME_CFG_SO] +
8862e65e175bSOded Gabbay 						sds->props[SP_NEXT_MME] * i +
8863e65e175bSOded Gabbay 						j * sizeof(u32));
8864e65e175bSOded Gabbay 
8865e65e175bSOded Gabbay 			rc = gaudi_add_sync_to_engine_map_entry(
8866e65e175bSOded Gabbay 				map, reg_value, ENGINE_MME,
8867e65e175bSOded Gabbay 				i * sds->props[SP_SUB_MME_ENG_NUM] + j);
8868e65e175bSOded Gabbay 			if (rc)
8869e65e175bSOded Gabbay 				goto free_sync_to_engine_map;
8870e65e175bSOded Gabbay 		}
8871e65e175bSOded Gabbay 	}
8872e65e175bSOded Gabbay 
8873e65e175bSOded Gabbay 	/* Iterate over DMA engines */
8874e65e175bSOded Gabbay 	for (i = 0; i < sds->props[SP_NUM_OF_DMA_ENGINES]; ++i) {
8875e65e175bSOded Gabbay 		reg_value = RREG32(sds->props[SP_DMA_CFG_SO] +
8876e65e175bSOded Gabbay 					sds->props[SP_DMA_QUEUES_OFFSET] * i);
8877e65e175bSOded Gabbay 		rc = gaudi_add_sync_to_engine_map_entry(map, reg_value,
8878e65e175bSOded Gabbay 							ENGINE_DMA, i);
8879e65e175bSOded Gabbay 		if (rc)
8880e65e175bSOded Gabbay 			goto free_sync_to_engine_map;
8881e65e175bSOded Gabbay 	}
8882e65e175bSOded Gabbay 
8883e65e175bSOded Gabbay 	return 0;
8884e65e175bSOded Gabbay 
8885e65e175bSOded Gabbay free_sync_to_engine_map:
8886e65e175bSOded Gabbay 	hl_state_dump_free_sync_to_engine_map(map);
8887e65e175bSOded Gabbay 
8888e65e175bSOded Gabbay 	return rc;
8889e65e175bSOded Gabbay }
8890e65e175bSOded Gabbay 
gaudi_monitor_valid(struct hl_mon_state_dump * mon)8891e65e175bSOded Gabbay static int gaudi_monitor_valid(struct hl_mon_state_dump *mon)
8892e65e175bSOded Gabbay {
8893e65e175bSOded Gabbay 	return FIELD_GET(
8894e65e175bSOded Gabbay 		SYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_STATUS_0_VALID_MASK,
8895e65e175bSOded Gabbay 		mon->status);
8896e65e175bSOded Gabbay }
8897e65e175bSOded Gabbay 
gaudi_fill_sobs_from_mon(char * sobs,struct hl_mon_state_dump * mon)8898e65e175bSOded Gabbay static void gaudi_fill_sobs_from_mon(char *sobs, struct hl_mon_state_dump *mon)
8899e65e175bSOded Gabbay {
8900e65e175bSOded Gabbay 	const size_t max_write = 10;
8901e65e175bSOded Gabbay 	u32 gid, mask, sob;
8902e65e175bSOded Gabbay 	int i, offset;
8903e65e175bSOded Gabbay 
8904e65e175bSOded Gabbay 	/* Sync object ID is calculated as follows:
8905e65e175bSOded Gabbay 	 * (8 * group_id + cleared bits in mask)
8906e65e175bSOded Gabbay 	 */
8907e65e175bSOded Gabbay 	gid = FIELD_GET(SYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_ARM_0_SID_MASK,
8908e65e175bSOded Gabbay 			mon->arm_data);
8909e65e175bSOded Gabbay 	mask = FIELD_GET(SYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_ARM_0_MASK_MASK,
8910e65e175bSOded Gabbay 			mon->arm_data);
8911e65e175bSOded Gabbay 
8912e65e175bSOded Gabbay 	for (i = 0, offset = 0; mask && offset < MONITOR_SOB_STRING_SIZE -
8913e65e175bSOded Gabbay 		max_write; mask >>= 1, i++) {
8914e65e175bSOded Gabbay 		if (!(mask & 1)) {
8915e65e175bSOded Gabbay 			sob = gid * MONITOR_MAX_SOBS + i;
8916e65e175bSOded Gabbay 
8917e65e175bSOded Gabbay 			if (offset > 0)
8918e65e175bSOded Gabbay 				offset += snprintf(sobs + offset, max_write,
8919e65e175bSOded Gabbay 							", ");
8920e65e175bSOded Gabbay 
8921e65e175bSOded Gabbay 			offset += snprintf(sobs + offset, max_write, "%u", sob);
8922e65e175bSOded Gabbay 		}
8923e65e175bSOded Gabbay 	}
8924e65e175bSOded Gabbay }
8925e65e175bSOded Gabbay 
gaudi_print_single_monitor(char ** buf,size_t * size,size_t * offset,struct hl_device * hdev,struct hl_mon_state_dump * mon)8926e65e175bSOded Gabbay static int gaudi_print_single_monitor(char **buf, size_t *size, size_t *offset,
8927e65e175bSOded Gabbay 				struct hl_device *hdev,
8928e65e175bSOded Gabbay 				struct hl_mon_state_dump *mon)
8929e65e175bSOded Gabbay {
8930e65e175bSOded Gabbay 	const char *name;
8931e65e175bSOded Gabbay 	char scratch_buf1[BIN_REG_STRING_SIZE],
8932e65e175bSOded Gabbay 		scratch_buf2[BIN_REG_STRING_SIZE];
8933e65e175bSOded Gabbay 	char monitored_sobs[MONITOR_SOB_STRING_SIZE] = {0};
8934e65e175bSOded Gabbay 
8935e65e175bSOded Gabbay 	name = hl_state_dump_get_monitor_name(hdev, mon);
8936e65e175bSOded Gabbay 	if (!name)
8937e65e175bSOded Gabbay 		name = "";
8938e65e175bSOded Gabbay 
8939e65e175bSOded Gabbay 	gaudi_fill_sobs_from_mon(monitored_sobs, mon);
8940e65e175bSOded Gabbay 
8941e65e175bSOded Gabbay 	return hl_snprintf_resize(
8942e65e175bSOded Gabbay 		buf, size, offset,
8943e65e175bSOded Gabbay 		"Mon id: %u%s, wait for group id: %u mask %s to reach val: %u and write %u to address 0x%llx. Pending: %s. Means sync objects [%s] are being monitored.",
8944e65e175bSOded Gabbay 		mon->id, name,
8945e65e175bSOded Gabbay 		FIELD_GET(SYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_ARM_0_SID_MASK,
8946e65e175bSOded Gabbay 				mon->arm_data),
8947e65e175bSOded Gabbay 		hl_format_as_binary(
8948e65e175bSOded Gabbay 			scratch_buf1, sizeof(scratch_buf1),
8949e65e175bSOded Gabbay 			FIELD_GET(
8950e65e175bSOded Gabbay 				SYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_ARM_0_MASK_MASK,
8951e65e175bSOded Gabbay 				mon->arm_data)),
8952e65e175bSOded Gabbay 		FIELD_GET(SYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_ARM_0_SOD_MASK,
8953e65e175bSOded Gabbay 				mon->arm_data),
8954e65e175bSOded Gabbay 		mon->wr_data,
8955e65e175bSOded Gabbay 		(((u64)mon->wr_addr_high) << 32) | mon->wr_addr_low,
8956e65e175bSOded Gabbay 		hl_format_as_binary(
8957e65e175bSOded Gabbay 			scratch_buf2, sizeof(scratch_buf2),
8958e65e175bSOded Gabbay 			FIELD_GET(
8959e65e175bSOded Gabbay 				SYNC_MNGR_W_S_SYNC_MNGR_OBJS_MON_STATUS_0_PENDING_MASK,
8960e65e175bSOded Gabbay 				mon->status)),
8961e65e175bSOded Gabbay 		monitored_sobs);
8962e65e175bSOded Gabbay }
8963e65e175bSOded Gabbay 
8964e65e175bSOded Gabbay 
gaudi_print_fences_single_engine(struct hl_device * hdev,u64 base_offset,u64 status_base_offset,enum hl_sync_engine_type engine_type,u32 engine_id,char ** buf,size_t * size,size_t * offset)8965e65e175bSOded Gabbay static int gaudi_print_fences_single_engine(
8966e65e175bSOded Gabbay 	struct hl_device *hdev, u64 base_offset, u64 status_base_offset,
8967e65e175bSOded Gabbay 	enum hl_sync_engine_type engine_type, u32 engine_id, char **buf,
8968e65e175bSOded Gabbay 	size_t *size, size_t *offset)
8969e65e175bSOded Gabbay {
8970e65e175bSOded Gabbay 	struct hl_state_dump_specs *sds = &hdev->state_dump_specs;
8971e65e175bSOded Gabbay 	int rc = -ENOMEM, i;
8972e65e175bSOded Gabbay 	u32 *statuses, *fences;
8973e65e175bSOded Gabbay 
8974e65e175bSOded Gabbay 	statuses = kcalloc(sds->props[SP_ENGINE_NUM_OF_QUEUES],
8975e65e175bSOded Gabbay 			sizeof(*statuses), GFP_KERNEL);
8976e65e175bSOded Gabbay 	if (!statuses)
8977e65e175bSOded Gabbay 		goto out;
8978e65e175bSOded Gabbay 
8979e65e175bSOded Gabbay 	fences = kcalloc(sds->props[SP_ENGINE_NUM_OF_FENCES] *
8980e65e175bSOded Gabbay 				sds->props[SP_ENGINE_NUM_OF_QUEUES],
8981e65e175bSOded Gabbay 			 sizeof(*fences), GFP_KERNEL);
8982e65e175bSOded Gabbay 	if (!fences)
8983e65e175bSOded Gabbay 		goto free_status;
8984e65e175bSOded Gabbay 
8985e65e175bSOded Gabbay 	for (i = 0; i < sds->props[SP_ENGINE_NUM_OF_FENCES]; ++i)
8986e65e175bSOded Gabbay 		statuses[i] = RREG32(status_base_offset + i * sizeof(u32));
8987e65e175bSOded Gabbay 
8988e65e175bSOded Gabbay 	for (i = 0; i < sds->props[SP_ENGINE_NUM_OF_FENCES] *
8989e65e175bSOded Gabbay 				sds->props[SP_ENGINE_NUM_OF_QUEUES]; ++i)
8990e65e175bSOded Gabbay 		fences[i] = RREG32(base_offset + i * sizeof(u32));
8991e65e175bSOded Gabbay 
8992e65e175bSOded Gabbay 	/* The actual print */
8993e65e175bSOded Gabbay 	for (i = 0; i < sds->props[SP_ENGINE_NUM_OF_QUEUES]; ++i) {
8994e65e175bSOded Gabbay 		u32 fence_id;
8995e65e175bSOded Gabbay 		u64 fence_cnt, fence_rdata;
8996e65e175bSOded Gabbay 		const char *engine_name;
8997e65e175bSOded Gabbay 
8998e65e175bSOded Gabbay 		if (!FIELD_GET(TPC0_QM_CP_STS_0_FENCE_IN_PROGRESS_MASK,
8999e65e175bSOded Gabbay 			statuses[i]))
9000e65e175bSOded Gabbay 			continue;
9001e65e175bSOded Gabbay 
9002e65e175bSOded Gabbay 		fence_id =
9003e65e175bSOded Gabbay 			FIELD_GET(TPC0_QM_CP_STS_0_FENCE_ID_MASK, statuses[i]);
9004e65e175bSOded Gabbay 		fence_cnt = base_offset + CFG_BASE +
9005e65e175bSOded Gabbay 			sizeof(u32) *
9006e65e175bSOded Gabbay 			(i + fence_id * sds->props[SP_ENGINE_NUM_OF_QUEUES]);
9007e65e175bSOded Gabbay 		fence_rdata = fence_cnt - sds->props[SP_FENCE0_CNT_OFFSET] +
9008e65e175bSOded Gabbay 				sds->props[SP_FENCE0_RDATA_OFFSET];
9009e65e175bSOded Gabbay 		engine_name = hl_sync_engine_to_string(engine_type);
9010e65e175bSOded Gabbay 
9011e65e175bSOded Gabbay 		rc = hl_snprintf_resize(
9012e65e175bSOded Gabbay 			buf, size, offset,
9013e65e175bSOded Gabbay 			"%s%u, stream %u: fence id %u cnt = 0x%llx (%s%u_QM.CP_FENCE%u_CNT_%u) rdata = 0x%llx (%s%u_QM.CP_FENCE%u_RDATA_%u) value = %u, cp_status = %u\n",
9014e65e175bSOded Gabbay 			engine_name, engine_id,
9015e65e175bSOded Gabbay 			i, fence_id,
9016e65e175bSOded Gabbay 			fence_cnt, engine_name, engine_id, fence_id, i,
9017e65e175bSOded Gabbay 			fence_rdata, engine_name, engine_id, fence_id, i,
9018e65e175bSOded Gabbay 			fences[fence_id],
9019e65e175bSOded Gabbay 			statuses[i]);
9020e65e175bSOded Gabbay 		if (rc)
9021e65e175bSOded Gabbay 			goto free_fences;
9022e65e175bSOded Gabbay 	}
9023e65e175bSOded Gabbay 
9024e65e175bSOded Gabbay 	rc = 0;
9025e65e175bSOded Gabbay 
9026e65e175bSOded Gabbay free_fences:
9027e65e175bSOded Gabbay 	kfree(fences);
9028e65e175bSOded Gabbay free_status:
9029e65e175bSOded Gabbay 	kfree(statuses);
9030e65e175bSOded Gabbay out:
9031e65e175bSOded Gabbay 	return rc;
9032e65e175bSOded Gabbay }
9033e65e175bSOded Gabbay 
9034e65e175bSOded Gabbay 
9035e65e175bSOded Gabbay static struct hl_state_dump_specs_funcs gaudi_state_dump_funcs = {
9036e65e175bSOded Gabbay 	.monitor_valid = gaudi_monitor_valid,
9037e65e175bSOded Gabbay 	.print_single_monitor = gaudi_print_single_monitor,
9038e65e175bSOded Gabbay 	.gen_sync_to_engine_map = gaudi_gen_sync_to_engine_map,
9039e65e175bSOded Gabbay 	.print_fences_single_engine = gaudi_print_fences_single_engine,
9040e65e175bSOded Gabbay };
9041e65e175bSOded Gabbay 
gaudi_state_dump_init(struct hl_device * hdev)9042e65e175bSOded Gabbay static void gaudi_state_dump_init(struct hl_device *hdev)
9043e65e175bSOded Gabbay {
9044e65e175bSOded Gabbay 	struct hl_state_dump_specs *sds = &hdev->state_dump_specs;
9045e65e175bSOded Gabbay 	int i;
9046e65e175bSOded Gabbay 
9047e65e175bSOded Gabbay 	for (i = 0; i < ARRAY_SIZE(gaudi_so_id_to_str); ++i)
9048e65e175bSOded Gabbay 		hash_add(sds->so_id_to_str_tb,
9049e65e175bSOded Gabbay 			&gaudi_so_id_to_str[i].node,
9050e65e175bSOded Gabbay 			gaudi_so_id_to_str[i].id);
9051e65e175bSOded Gabbay 
9052e65e175bSOded Gabbay 	for (i = 0; i < ARRAY_SIZE(gaudi_monitor_id_to_str); ++i)
9053e65e175bSOded Gabbay 		hash_add(sds->monitor_id_to_str_tb,
9054e65e175bSOded Gabbay 			&gaudi_monitor_id_to_str[i].node,
9055e65e175bSOded Gabbay 			gaudi_monitor_id_to_str[i].id);
9056e65e175bSOded Gabbay 
9057e65e175bSOded Gabbay 	sds->props = gaudi_state_dump_specs_props;
9058e65e175bSOded Gabbay 
9059e65e175bSOded Gabbay 	sds->sync_namager_names = gaudi_sync_manager_names;
9060e65e175bSOded Gabbay 
9061e65e175bSOded Gabbay 	sds->funcs = gaudi_state_dump_funcs;
9062e65e175bSOded Gabbay }
9063e65e175bSOded Gabbay 
gaudi_get_stream_master_qid_arr(void)9064e65e175bSOded Gabbay static u32 *gaudi_get_stream_master_qid_arr(void)
9065e65e175bSOded Gabbay {
9066e65e175bSOded Gabbay 	return gaudi_stream_master;
9067e65e175bSOded Gabbay }
9068e65e175bSOded Gabbay 
gaudi_set_dram_properties(struct hl_device * hdev)9069e65e175bSOded Gabbay static int gaudi_set_dram_properties(struct hl_device *hdev)
9070e65e175bSOded Gabbay {
9071e65e175bSOded Gabbay 	return 0;
9072e65e175bSOded Gabbay }
9073e65e175bSOded Gabbay 
gaudi_set_binning_masks(struct hl_device * hdev)9074ab509d81SOhad Sharabi static int gaudi_set_binning_masks(struct hl_device *hdev)
9075ab509d81SOhad Sharabi {
9076ab509d81SOhad Sharabi 	return 0;
9077ab509d81SOhad Sharabi }
9078ab509d81SOhad Sharabi 
gaudi_check_if_razwi_happened(struct hl_device * hdev)9079e65e175bSOded Gabbay static void gaudi_check_if_razwi_happened(struct hl_device *hdev)
9080e65e175bSOded Gabbay {
9081e65e175bSOded Gabbay }
9082e65e175bSOded Gabbay 
infineon_ver_show(struct device * dev,struct device_attribute * attr,char * buf)9083e65e175bSOded Gabbay static ssize_t infineon_ver_show(struct device *dev, struct device_attribute *attr, char *buf)
9084e65e175bSOded Gabbay {
9085e65e175bSOded Gabbay 	struct hl_device *hdev = dev_get_drvdata(dev);
9086e65e175bSOded Gabbay 	struct cpucp_info *cpucp_info;
9087e65e175bSOded Gabbay 
9088e65e175bSOded Gabbay 	cpucp_info = &hdev->asic_prop.cpucp_info;
9089e65e175bSOded Gabbay 
9090e65e175bSOded Gabbay 	return sprintf(buf, "%#04x\n", le32_to_cpu(cpucp_info->infineon_version));
9091e65e175bSOded Gabbay }
9092e65e175bSOded Gabbay 
9093e65e175bSOded Gabbay static DEVICE_ATTR_RO(infineon_ver);
9094e65e175bSOded Gabbay 
9095e65e175bSOded Gabbay static struct attribute *gaudi_vrm_dev_attrs[] = {
9096e65e175bSOded Gabbay 	&dev_attr_infineon_ver.attr,
9097e65e175bSOded Gabbay 	NULL,
9098e65e175bSOded Gabbay };
9099e65e175bSOded Gabbay 
gaudi_add_device_attr(struct hl_device * hdev,struct attribute_group * dev_clk_attr_grp,struct attribute_group * dev_vrm_attr_grp)9100e65e175bSOded Gabbay static void gaudi_add_device_attr(struct hl_device *hdev, struct attribute_group *dev_clk_attr_grp,
9101e65e175bSOded Gabbay 					struct attribute_group *dev_vrm_attr_grp)
9102e65e175bSOded Gabbay {
9103e65e175bSOded Gabbay 	hl_sysfs_add_dev_clk_attr(hdev, dev_clk_attr_grp);
9104e65e175bSOded Gabbay 	dev_vrm_attr_grp->attrs = gaudi_vrm_dev_attrs;
9105e65e175bSOded Gabbay }
9106e65e175bSOded Gabbay 
gaudi_send_device_activity(struct hl_device * hdev,bool open)9107e65e175bSOded Gabbay static int gaudi_send_device_activity(struct hl_device *hdev, bool open)
9108e65e175bSOded Gabbay {
9109e65e175bSOded Gabbay 	return 0;
9110e65e175bSOded Gabbay }
9111e65e175bSOded Gabbay 
9112e65e175bSOded Gabbay static const struct hl_asic_funcs gaudi_funcs = {
9113e65e175bSOded Gabbay 	.early_init = gaudi_early_init,
9114e65e175bSOded Gabbay 	.early_fini = gaudi_early_fini,
9115e65e175bSOded Gabbay 	.late_init = gaudi_late_init,
9116e65e175bSOded Gabbay 	.late_fini = gaudi_late_fini,
9117e65e175bSOded Gabbay 	.sw_init = gaudi_sw_init,
9118e65e175bSOded Gabbay 	.sw_fini = gaudi_sw_fini,
9119e65e175bSOded Gabbay 	.hw_init = gaudi_hw_init,
9120e65e175bSOded Gabbay 	.hw_fini = gaudi_hw_fini,
9121e65e175bSOded Gabbay 	.halt_engines = gaudi_halt_engines,
9122e65e175bSOded Gabbay 	.suspend = gaudi_suspend,
9123e65e175bSOded Gabbay 	.resume = gaudi_resume,
9124e65e175bSOded Gabbay 	.mmap = gaudi_mmap,
9125e65e175bSOded Gabbay 	.ring_doorbell = gaudi_ring_doorbell,
9126e65e175bSOded Gabbay 	.pqe_write = gaudi_pqe_write,
9127e65e175bSOded Gabbay 	.asic_dma_alloc_coherent = gaudi_dma_alloc_coherent,
9128e65e175bSOded Gabbay 	.asic_dma_free_coherent = gaudi_dma_free_coherent,
9129e65e175bSOded Gabbay 	.scrub_device_mem = gaudi_scrub_device_mem,
9130e65e175bSOded Gabbay 	.scrub_device_dram = gaudi_scrub_device_dram,
9131e65e175bSOded Gabbay 	.get_int_queue_base = gaudi_get_int_queue_base,
9132e65e175bSOded Gabbay 	.test_queues = gaudi_test_queues,
9133e65e175bSOded Gabbay 	.asic_dma_pool_zalloc = gaudi_dma_pool_zalloc,
9134e65e175bSOded Gabbay 	.asic_dma_pool_free = gaudi_dma_pool_free,
9135e65e175bSOded Gabbay 	.cpu_accessible_dma_pool_alloc = gaudi_cpu_accessible_dma_pool_alloc,
9136e65e175bSOded Gabbay 	.cpu_accessible_dma_pool_free = gaudi_cpu_accessible_dma_pool_free,
9137ff92d010SOhad Sharabi 	.dma_unmap_sgtable = hl_asic_dma_unmap_sgtable,
9138e65e175bSOded Gabbay 	.cs_parser = gaudi_cs_parser,
9139ff92d010SOhad Sharabi 	.dma_map_sgtable = hl_asic_dma_map_sgtable,
9140e65e175bSOded Gabbay 	.add_end_of_cb_packets = gaudi_add_end_of_cb_packets,
9141e65e175bSOded Gabbay 	.update_eq_ci = gaudi_update_eq_ci,
9142e65e175bSOded Gabbay 	.context_switch = gaudi_context_switch,
9143e65e175bSOded Gabbay 	.restore_phase_topology = gaudi_restore_phase_topology,
9144e65e175bSOded Gabbay 	.debugfs_read_dma = gaudi_debugfs_read_dma,
9145e65e175bSOded Gabbay 	.add_device_attr = gaudi_add_device_attr,
9146e65e175bSOded Gabbay 	.handle_eqe = gaudi_handle_eqe,
9147e65e175bSOded Gabbay 	.get_events_stat = gaudi_get_events_stat,
9148e65e175bSOded Gabbay 	.read_pte = gaudi_read_pte,
9149e65e175bSOded Gabbay 	.write_pte = gaudi_write_pte,
9150e65e175bSOded Gabbay 	.mmu_invalidate_cache = gaudi_mmu_invalidate_cache,
9151e65e175bSOded Gabbay 	.mmu_invalidate_cache_range = gaudi_mmu_invalidate_cache_range,
9152e65e175bSOded Gabbay 	.mmu_prefetch_cache_range = NULL,
9153e65e175bSOded Gabbay 	.send_heartbeat = gaudi_send_heartbeat,
9154e65e175bSOded Gabbay 	.debug_coresight = gaudi_debug_coresight,
9155e65e175bSOded Gabbay 	.is_device_idle = gaudi_is_device_idle,
9156e65e175bSOded Gabbay 	.compute_reset_late_init = gaudi_compute_reset_late_init,
9157e65e175bSOded Gabbay 	.hw_queues_lock = gaudi_hw_queues_lock,
9158e65e175bSOded Gabbay 	.hw_queues_unlock = gaudi_hw_queues_unlock,
9159e65e175bSOded Gabbay 	.get_pci_id = gaudi_get_pci_id,
9160e65e175bSOded Gabbay 	.get_eeprom_data = gaudi_get_eeprom_data,
9161e65e175bSOded Gabbay 	.get_monitor_dump = gaudi_get_monitor_dump,
9162e65e175bSOded Gabbay 	.send_cpu_message = gaudi_send_cpu_message,
9163e65e175bSOded Gabbay 	.pci_bars_map = gaudi_pci_bars_map,
9164e65e175bSOded Gabbay 	.init_iatu = gaudi_init_iatu,
9165e65e175bSOded Gabbay 	.rreg = hl_rreg,
9166e65e175bSOded Gabbay 	.wreg = hl_wreg,
9167e65e175bSOded Gabbay 	.halt_coresight = gaudi_halt_coresight,
9168e65e175bSOded Gabbay 	.ctx_init = gaudi_ctx_init,
9169e65e175bSOded Gabbay 	.ctx_fini = gaudi_ctx_fini,
9170e65e175bSOded Gabbay 	.pre_schedule_cs = gaudi_pre_schedule_cs,
9171e65e175bSOded Gabbay 	.get_queue_id_for_cq = gaudi_get_queue_id_for_cq,
9172e65e175bSOded Gabbay 	.load_firmware_to_device = gaudi_load_firmware_to_device,
9173e65e175bSOded Gabbay 	.load_boot_fit_to_device = gaudi_load_boot_fit_to_device,
9174e65e175bSOded Gabbay 	.get_signal_cb_size = gaudi_get_signal_cb_size,
9175e65e175bSOded Gabbay 	.get_wait_cb_size = gaudi_get_wait_cb_size,
9176e65e175bSOded Gabbay 	.gen_signal_cb = gaudi_gen_signal_cb,
9177e65e175bSOded Gabbay 	.gen_wait_cb = gaudi_gen_wait_cb,
9178e65e175bSOded Gabbay 	.reset_sob = gaudi_reset_sob,
9179e65e175bSOded Gabbay 	.reset_sob_group = gaudi_reset_sob_group,
9180e65e175bSOded Gabbay 	.get_device_time = gaudi_get_device_time,
9181e65e175bSOded Gabbay 	.pb_print_security_errors = NULL,
9182e65e175bSOded Gabbay 	.collective_wait_init_cs = gaudi_collective_wait_init_cs,
9183e65e175bSOded Gabbay 	.collective_wait_create_jobs = gaudi_collective_wait_create_jobs,
9184e65e175bSOded Gabbay 	.get_dec_base_addr = NULL,
9185e65e175bSOded Gabbay 	.scramble_addr = hl_mmu_scramble_addr,
9186e65e175bSOded Gabbay 	.descramble_addr = hl_mmu_descramble_addr,
9187e65e175bSOded Gabbay 	.ack_protection_bits_errors = gaudi_ack_protection_bits_errors,
9188e65e175bSOded Gabbay 	.get_hw_block_id = gaudi_get_hw_block_id,
9189e65e175bSOded Gabbay 	.hw_block_mmap = gaudi_block_mmap,
9190e65e175bSOded Gabbay 	.enable_events_from_fw = gaudi_enable_events_from_fw,
9191e65e175bSOded Gabbay 	.ack_mmu_errors = gaudi_ack_mmu_page_fault_or_access_error,
9192e65e175bSOded Gabbay 	.map_pll_idx_to_fw_idx = gaudi_map_pll_idx_to_fw_idx,
9193e65e175bSOded Gabbay 	.init_firmware_preload_params = gaudi_init_firmware_preload_params,
9194e65e175bSOded Gabbay 	.init_firmware_loader = gaudi_init_firmware_loader,
9195e65e175bSOded Gabbay 	.init_cpu_scrambler_dram = gaudi_init_scrambler_hbm,
9196e65e175bSOded Gabbay 	.state_dump_init = gaudi_state_dump_init,
9197e65e175bSOded Gabbay 	.get_sob_addr = gaudi_get_sob_addr,
9198e65e175bSOded Gabbay 	.set_pci_memory_regions = gaudi_set_pci_memory_regions,
9199e65e175bSOded Gabbay 	.get_stream_master_qid_arr = gaudi_get_stream_master_qid_arr,
9200e65e175bSOded Gabbay 	.check_if_razwi_happened = gaudi_check_if_razwi_happened,
9201e65e175bSOded Gabbay 	.mmu_get_real_page_size = hl_mmu_get_real_page_size,
9202e65e175bSOded Gabbay 	.access_dev_mem = hl_access_dev_mem,
9203e65e175bSOded Gabbay 	.set_dram_bar_base = gaudi_set_hbm_bar_base,
9204e65e175bSOded Gabbay 	.send_device_activity = gaudi_send_device_activity,
9205e65e175bSOded Gabbay 	.set_dram_properties = gaudi_set_dram_properties,
9206ab509d81SOhad Sharabi 	.set_binning_masks = gaudi_set_binning_masks,
9207e65e175bSOded Gabbay };
9208e65e175bSOded Gabbay 
9209e65e175bSOded Gabbay /**
9210e65e175bSOded Gabbay  * gaudi_set_asic_funcs - set GAUDI function pointers
9211e65e175bSOded Gabbay  *
9212e65e175bSOded Gabbay  * @hdev: pointer to hl_device structure
9213e65e175bSOded Gabbay  *
9214e65e175bSOded Gabbay  */
gaudi_set_asic_funcs(struct hl_device * hdev)9215e65e175bSOded Gabbay void gaudi_set_asic_funcs(struct hl_device *hdev)
9216e65e175bSOded Gabbay {
9217e65e175bSOded Gabbay 	hdev->asic_funcs = &gaudi_funcs;
9218e65e175bSOded Gabbay }
9219