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