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