0001
0002
0003
0004
0005
0006
0007
0008 #include "gaudi2P.h"
0009 #include "gaudi2_masks.h"
0010 #include "../include/hw_ip/mmu/mmu_general.h"
0011 #include "../include/hw_ip/mmu/mmu_v2_0.h"
0012 #include "../include/gaudi2/gaudi2_packets.h"
0013 #include "../include/gaudi2/gaudi2_reg_map.h"
0014 #include "../include/gaudi2/gaudi2_async_ids_map_extended.h"
0015 #include "../include/gaudi2/arc/gaudi2_arc_common_packets.h"
0016
0017 #include <linux/module.h>
0018 #include <linux/pci.h>
0019 #include <linux/hwmon.h>
0020 #include <linux/iommu.h>
0021
0022 #define GAUDI2_DMA_POOL_BLK_SIZE SZ_256
0023
0024 #define GAUDI2_RESET_TIMEOUT_MSEC 500
0025 #define GAUDI2_RESET_POLL_TIMEOUT_USEC 50000
0026 #define GAUDI2_PLDM_HRESET_TIMEOUT_MSEC 25000
0027 #define GAUDI2_PLDM_SRESET_TIMEOUT_MSEC 25000
0028 #define GAUDI2_PLDM_RESET_POLL_TIMEOUT_USEC 3000000
0029 #define GAUDI2_RESET_POLL_CNT 3
0030 #define GAUDI2_RESET_WAIT_MSEC 1
0031 #define GAUDI2_CPU_RESET_WAIT_MSEC 100
0032 #define GAUDI2_PLDM_RESET_WAIT_MSEC 1000
0033 #define GAUDI2_CB_POOL_CB_CNT 512
0034 #define GAUDI2_CB_POOL_CB_SIZE SZ_128K
0035 #define GAUDI2_MSG_TO_CPU_TIMEOUT_USEC 4000000
0036 #define GAUDI2_WAIT_FOR_BL_TIMEOUT_USEC 25000000
0037 #define GAUDI2_TEST_QUEUE_WAIT_USEC 100000
0038 #define GAUDI2_PLDM_TEST_QUEUE_WAIT_USEC 1000000
0039
0040 #define GAUDI2_ALLOC_CPU_MEM_RETRY_CNT 3
0041
0042
0043
0044
0045
0046
0047 #define MAX_CLUSTER_BINNING_FAULTY_TPCS 1
0048 #define MAX_FAULTY_XBARS 1
0049 #define MAX_FAULTY_EDMAS 1
0050 #define MAX_FAULTY_DECODERS 1
0051
0052 #define GAUDI2_TPC_FULL_MASK 0x1FFFFFF
0053 #define GAUDI2_HIF_HMMU_FULL_MASK 0xFFFF
0054 #define GAUDI2_DECODER_FULL_MASK 0x3FF
0055
0056 #define GAUDI2_NUM_OF_QM_ERR_CAUSE 18
0057 #define GAUDI2_NUM_OF_QM_LCP_ERR_CAUSE 25
0058 #define GAUDI2_NUM_OF_QM_ARB_ERR_CAUSE 3
0059 #define GAUDI2_NUM_OF_ARC_SEI_ERR_CAUSE 14
0060 #define GAUDI2_NUM_OF_CPU_SEI_ERR_CAUSE 3
0061 #define GAUDI2_NUM_OF_QM_SEI_ERR_CAUSE 2
0062 #define GAUDI2_NUM_OF_ROT_ERR_CAUSE 22
0063 #define GAUDI2_NUM_OF_TPC_INTR_CAUSE 30
0064 #define GAUDI2_NUM_OF_DEC_ERR_CAUSE 25
0065 #define GAUDI2_NUM_OF_MME_ERR_CAUSE 16
0066 #define GAUDI2_NUM_OF_MME_SBTE_ERR_CAUSE 5
0067 #define GAUDI2_NUM_OF_MME_WAP_ERR_CAUSE 7
0068 #define GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE 8
0069 #define GAUDI2_NUM_OF_MMU_SPI_SEI_CAUSE 19
0070 #define GAUDI2_NUM_OF_HBM_SEI_CAUSE 9
0071 #define GAUDI2_NUM_OF_SM_SEI_ERR_CAUSE 3
0072 #define GAUDI2_NUM_OF_PCIE_ADDR_DEC_ERR_CAUSE 3
0073 #define GAUDI2_NUM_OF_PMMU_FATAL_ERR_CAUSE 2
0074 #define GAUDI2_NUM_OF_HIF_FATAL_ERR_CAUSE 2
0075 #define GAUDI2_NUM_OF_AXI_DRAIN_ERR_CAUSE 2
0076 #define GAUDI2_NUM_OF_HBM_MC_SPI_CAUSE 5
0077
0078 #define GAUDI2_MMU_CACHE_INV_TIMEOUT_USEC (MMU_CONFIG_TIMEOUT_USEC * 10)
0079 #define GAUDI2_PLDM_MMU_TIMEOUT_USEC (MMU_CONFIG_TIMEOUT_USEC * 200)
0080 #define GAUDI2_ARB_WDT_TIMEOUT (0x1000000)
0081
0082 #define GAUDI2_VDEC_TIMEOUT_USEC 10000
0083 #define GAUDI2_PLDM_VDEC_TIMEOUT_USEC (GAUDI2_VDEC_TIMEOUT_USEC * 100)
0084
0085 #define KDMA_TIMEOUT_USEC USEC_PER_SEC
0086
0087 #define IS_DMA_IDLE(dma_core_idle_ind_mask) \
0088 (!((dma_core_idle_ind_mask) & \
0089 ((DCORE0_EDMA0_CORE_IDLE_IND_MASK_DESC_CNT_STS_MASK) | \
0090 (DCORE0_EDMA0_CORE_IDLE_IND_MASK_COMP_MASK))))
0091
0092 #define IS_MME_IDLE(mme_arch_sts) (((mme_arch_sts) & MME_ARCH_IDLE_MASK) == MME_ARCH_IDLE_MASK)
0093
0094 #define IS_TPC_IDLE(tpc_cfg_sts) (((tpc_cfg_sts) & (TPC_IDLE_MASK)) == (TPC_IDLE_MASK))
0095
0096 #define IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts) \
0097 ((((qm_glbl_sts0) & (QM_IDLE_MASK)) == (QM_IDLE_MASK)) && \
0098 (((qm_glbl_sts1) & (QM_ARC_IDLE_MASK)) == (QM_ARC_IDLE_MASK)) && \
0099 (((qm_cgm_sts) & (CGM_IDLE_MASK)) == (CGM_IDLE_MASK)))
0100
0101 #define PCIE_DEC_EN_MASK 0x300
0102 #define DEC_WORK_STATE_IDLE 0
0103 #define DEC_WORK_STATE_PEND 3
0104 #define IS_DEC_IDLE(dec_swreg15) \
0105 (((dec_swreg15) & DCORE0_DEC0_CMD_SWREG15_SW_WORK_STATE_MASK) == DEC_WORK_STATE_IDLE || \
0106 ((dec_swreg15) & DCORE0_DEC0_CMD_SWREG15_SW_WORK_STATE_MASK) == DEC_WORK_STATE_PEND)
0107
0108
0109 #define GAUDI2_HBM_MMU_SCRM_MEM_SIZE SZ_8M
0110 #define GAUDI2_HBM_MMU_SCRM_DIV_SHIFT 26
0111 #define GAUDI2_HBM_MMU_SCRM_MOD_SHIFT 0
0112 #define GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK DRAM_VA_HINT_MASK
0113 #define GAUDI2_COMPENSATE_TLB_PAGE_SIZE_FACTOR 16
0114 #define MMU_RANGE_INV_VA_LSB_SHIFT 12
0115 #define MMU_RANGE_INV_VA_MSB_SHIFT 44
0116 #define MMU_RANGE_INV_EN_SHIFT 0
0117 #define MMU_RANGE_INV_ASID_EN_SHIFT 1
0118 #define MMU_RANGE_INV_ASID_SHIFT 2
0119
0120 #define GAUDI2_MAX_STRING_LEN 64
0121
0122 #define GAUDI2_VDEC_MSIX_ENTRIES (GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM - \
0123 GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM + 1)
0124
0125 enum hl_pmmu_fatal_cause {
0126 LATENCY_RD_OUT_FIFO_OVERRUN,
0127 LATENCY_WR_OUT_FIFO_OVERRUN,
0128 };
0129
0130 enum hl_pcie_drain_ind_cause {
0131 LBW_AXI_DRAIN_IND,
0132 HBW_AXI_DRAIN_IND
0133 };
0134
0135 static const u32 cluster_hmmu_hif_enabled_mask[GAUDI2_HBM_NUM] = {
0136 [HBM_ID0] = 0xFFFC,
0137 [HBM_ID1] = 0xFFCF,
0138 [HBM_ID2] = 0xF7F7,
0139 [HBM_ID3] = 0x7F7F,
0140 [HBM_ID4] = 0xFCFF,
0141 [HBM_ID5] = 0xCFFF,
0142 };
0143
0144 static const u8 xbar_edge_to_hbm_cluster[EDMA_ID_SIZE] = {
0145 [0] = HBM_ID0,
0146 [1] = HBM_ID1,
0147 [2] = HBM_ID4,
0148 [3] = HBM_ID5,
0149 };
0150
0151 static const u8 edma_to_hbm_cluster[EDMA_ID_SIZE] = {
0152 [EDMA_ID_DCORE0_INSTANCE0] = HBM_ID0,
0153 [EDMA_ID_DCORE0_INSTANCE1] = HBM_ID2,
0154 [EDMA_ID_DCORE1_INSTANCE0] = HBM_ID1,
0155 [EDMA_ID_DCORE1_INSTANCE1] = HBM_ID3,
0156 [EDMA_ID_DCORE2_INSTANCE0] = HBM_ID2,
0157 [EDMA_ID_DCORE2_INSTANCE1] = HBM_ID4,
0158 [EDMA_ID_DCORE3_INSTANCE0] = HBM_ID3,
0159 [EDMA_ID_DCORE3_INSTANCE1] = HBM_ID5,
0160 };
0161
0162 static const int gaudi2_qman_async_event_id[] = {
0163 [GAUDI2_QUEUE_ID_PDMA_0_0] = GAUDI2_EVENT_PDMA0_QM,
0164 [GAUDI2_QUEUE_ID_PDMA_0_1] = GAUDI2_EVENT_PDMA0_QM,
0165 [GAUDI2_QUEUE_ID_PDMA_0_2] = GAUDI2_EVENT_PDMA0_QM,
0166 [GAUDI2_QUEUE_ID_PDMA_0_3] = GAUDI2_EVENT_PDMA0_QM,
0167 [GAUDI2_QUEUE_ID_PDMA_1_0] = GAUDI2_EVENT_PDMA1_QM,
0168 [GAUDI2_QUEUE_ID_PDMA_1_1] = GAUDI2_EVENT_PDMA1_QM,
0169 [GAUDI2_QUEUE_ID_PDMA_1_2] = GAUDI2_EVENT_PDMA1_QM,
0170 [GAUDI2_QUEUE_ID_PDMA_1_3] = GAUDI2_EVENT_PDMA1_QM,
0171 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0] = GAUDI2_EVENT_HDMA0_QM,
0172 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_1] = GAUDI2_EVENT_HDMA0_QM,
0173 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_2] = GAUDI2_EVENT_HDMA0_QM,
0174 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3] = GAUDI2_EVENT_HDMA0_QM,
0175 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0] = GAUDI2_EVENT_HDMA1_QM,
0176 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_1] = GAUDI2_EVENT_HDMA1_QM,
0177 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_2] = GAUDI2_EVENT_HDMA1_QM,
0178 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3] = GAUDI2_EVENT_HDMA1_QM,
0179 [GAUDI2_QUEUE_ID_DCORE0_MME_0_0] = GAUDI2_EVENT_MME0_QM,
0180 [GAUDI2_QUEUE_ID_DCORE0_MME_0_1] = GAUDI2_EVENT_MME0_QM,
0181 [GAUDI2_QUEUE_ID_DCORE0_MME_0_2] = GAUDI2_EVENT_MME0_QM,
0182 [GAUDI2_QUEUE_ID_DCORE0_MME_0_3] = GAUDI2_EVENT_MME0_QM,
0183 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_0] = GAUDI2_EVENT_TPC0_QM,
0184 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_1] = GAUDI2_EVENT_TPC0_QM,
0185 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_2] = GAUDI2_EVENT_TPC0_QM,
0186 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_3] = GAUDI2_EVENT_TPC0_QM,
0187 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_0] = GAUDI2_EVENT_TPC1_QM,
0188 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_1] = GAUDI2_EVENT_TPC1_QM,
0189 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_2] = GAUDI2_EVENT_TPC1_QM,
0190 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_3] = GAUDI2_EVENT_TPC1_QM,
0191 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_0] = GAUDI2_EVENT_TPC2_QM,
0192 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_1] = GAUDI2_EVENT_TPC2_QM,
0193 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_2] = GAUDI2_EVENT_TPC2_QM,
0194 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_3] = GAUDI2_EVENT_TPC2_QM,
0195 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_0] = GAUDI2_EVENT_TPC3_QM,
0196 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_1] = GAUDI2_EVENT_TPC3_QM,
0197 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_2] = GAUDI2_EVENT_TPC3_QM,
0198 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_3] = GAUDI2_EVENT_TPC3_QM,
0199 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_0] = GAUDI2_EVENT_TPC4_QM,
0200 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_1] = GAUDI2_EVENT_TPC4_QM,
0201 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_2] = GAUDI2_EVENT_TPC4_QM,
0202 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_3] = GAUDI2_EVENT_TPC4_QM,
0203 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_0] = GAUDI2_EVENT_TPC5_QM,
0204 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_1] = GAUDI2_EVENT_TPC5_QM,
0205 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_2] = GAUDI2_EVENT_TPC5_QM,
0206 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_3] = GAUDI2_EVENT_TPC5_QM,
0207 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_0] = GAUDI2_EVENT_TPC24_QM,
0208 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_1] = GAUDI2_EVENT_TPC24_QM,
0209 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_2] = GAUDI2_EVENT_TPC24_QM,
0210 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_3] = GAUDI2_EVENT_TPC24_QM,
0211 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0] = GAUDI2_EVENT_HDMA2_QM,
0212 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_1] = GAUDI2_EVENT_HDMA2_QM,
0213 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_2] = GAUDI2_EVENT_HDMA2_QM,
0214 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3] = GAUDI2_EVENT_HDMA2_QM,
0215 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0] = GAUDI2_EVENT_HDMA3_QM,
0216 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_1] = GAUDI2_EVENT_HDMA3_QM,
0217 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_2] = GAUDI2_EVENT_HDMA3_QM,
0218 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3] = GAUDI2_EVENT_HDMA3_QM,
0219 [GAUDI2_QUEUE_ID_DCORE1_MME_0_0] = GAUDI2_EVENT_MME1_QM,
0220 [GAUDI2_QUEUE_ID_DCORE1_MME_0_1] = GAUDI2_EVENT_MME1_QM,
0221 [GAUDI2_QUEUE_ID_DCORE1_MME_0_2] = GAUDI2_EVENT_MME1_QM,
0222 [GAUDI2_QUEUE_ID_DCORE1_MME_0_3] = GAUDI2_EVENT_MME1_QM,
0223 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_0] = GAUDI2_EVENT_TPC6_QM,
0224 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_1] = GAUDI2_EVENT_TPC6_QM,
0225 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_2] = GAUDI2_EVENT_TPC6_QM,
0226 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_3] = GAUDI2_EVENT_TPC6_QM,
0227 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_0] = GAUDI2_EVENT_TPC7_QM,
0228 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_1] = GAUDI2_EVENT_TPC7_QM,
0229 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_2] = GAUDI2_EVENT_TPC7_QM,
0230 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_3] = GAUDI2_EVENT_TPC7_QM,
0231 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_0] = GAUDI2_EVENT_TPC8_QM,
0232 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_1] = GAUDI2_EVENT_TPC8_QM,
0233 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_2] = GAUDI2_EVENT_TPC8_QM,
0234 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_3] = GAUDI2_EVENT_TPC8_QM,
0235 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_0] = GAUDI2_EVENT_TPC9_QM,
0236 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_1] = GAUDI2_EVENT_TPC9_QM,
0237 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_2] = GAUDI2_EVENT_TPC9_QM,
0238 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_3] = GAUDI2_EVENT_TPC9_QM,
0239 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_0] = GAUDI2_EVENT_TPC10_QM,
0240 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_1] = GAUDI2_EVENT_TPC10_QM,
0241 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_2] = GAUDI2_EVENT_TPC10_QM,
0242 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_3] = GAUDI2_EVENT_TPC10_QM,
0243 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_0] = GAUDI2_EVENT_TPC11_QM,
0244 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_1] = GAUDI2_EVENT_TPC11_QM,
0245 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_2] = GAUDI2_EVENT_TPC11_QM,
0246 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_3] = GAUDI2_EVENT_TPC11_QM,
0247 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0] = GAUDI2_EVENT_HDMA4_QM,
0248 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_1] = GAUDI2_EVENT_HDMA4_QM,
0249 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_2] = GAUDI2_EVENT_HDMA4_QM,
0250 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3] = GAUDI2_EVENT_HDMA4_QM,
0251 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0] = GAUDI2_EVENT_HDMA5_QM,
0252 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_1] = GAUDI2_EVENT_HDMA5_QM,
0253 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_2] = GAUDI2_EVENT_HDMA5_QM,
0254 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3] = GAUDI2_EVENT_HDMA5_QM,
0255 [GAUDI2_QUEUE_ID_DCORE2_MME_0_0] = GAUDI2_EVENT_MME2_QM,
0256 [GAUDI2_QUEUE_ID_DCORE2_MME_0_1] = GAUDI2_EVENT_MME2_QM,
0257 [GAUDI2_QUEUE_ID_DCORE2_MME_0_2] = GAUDI2_EVENT_MME2_QM,
0258 [GAUDI2_QUEUE_ID_DCORE2_MME_0_3] = GAUDI2_EVENT_MME2_QM,
0259 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_0] = GAUDI2_EVENT_TPC12_QM,
0260 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_1] = GAUDI2_EVENT_TPC12_QM,
0261 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_2] = GAUDI2_EVENT_TPC12_QM,
0262 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_3] = GAUDI2_EVENT_TPC12_QM,
0263 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_0] = GAUDI2_EVENT_TPC13_QM,
0264 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_1] = GAUDI2_EVENT_TPC13_QM,
0265 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_2] = GAUDI2_EVENT_TPC13_QM,
0266 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_3] = GAUDI2_EVENT_TPC13_QM,
0267 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_0] = GAUDI2_EVENT_TPC14_QM,
0268 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_1] = GAUDI2_EVENT_TPC14_QM,
0269 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_2] = GAUDI2_EVENT_TPC14_QM,
0270 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_3] = GAUDI2_EVENT_TPC14_QM,
0271 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_0] = GAUDI2_EVENT_TPC15_QM,
0272 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_1] = GAUDI2_EVENT_TPC15_QM,
0273 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_2] = GAUDI2_EVENT_TPC15_QM,
0274 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_3] = GAUDI2_EVENT_TPC15_QM,
0275 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_0] = GAUDI2_EVENT_TPC16_QM,
0276 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_1] = GAUDI2_EVENT_TPC16_QM,
0277 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_2] = GAUDI2_EVENT_TPC16_QM,
0278 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_3] = GAUDI2_EVENT_TPC16_QM,
0279 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_0] = GAUDI2_EVENT_TPC17_QM,
0280 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_1] = GAUDI2_EVENT_TPC17_QM,
0281 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_2] = GAUDI2_EVENT_TPC17_QM,
0282 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_3] = GAUDI2_EVENT_TPC17_QM,
0283 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0] = GAUDI2_EVENT_HDMA6_QM,
0284 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_1] = GAUDI2_EVENT_HDMA6_QM,
0285 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_2] = GAUDI2_EVENT_HDMA6_QM,
0286 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3] = GAUDI2_EVENT_HDMA6_QM,
0287 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0] = GAUDI2_EVENT_HDMA7_QM,
0288 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1] = GAUDI2_EVENT_HDMA7_QM,
0289 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2] = GAUDI2_EVENT_HDMA7_QM,
0290 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3] = GAUDI2_EVENT_HDMA7_QM,
0291 [GAUDI2_QUEUE_ID_DCORE3_MME_0_0] = GAUDI2_EVENT_MME3_QM,
0292 [GAUDI2_QUEUE_ID_DCORE3_MME_0_1] = GAUDI2_EVENT_MME3_QM,
0293 [GAUDI2_QUEUE_ID_DCORE3_MME_0_2] = GAUDI2_EVENT_MME3_QM,
0294 [GAUDI2_QUEUE_ID_DCORE3_MME_0_3] = GAUDI2_EVENT_MME3_QM,
0295 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_0] = GAUDI2_EVENT_TPC18_QM,
0296 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_1] = GAUDI2_EVENT_TPC18_QM,
0297 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_2] = GAUDI2_EVENT_TPC18_QM,
0298 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_3] = GAUDI2_EVENT_TPC18_QM,
0299 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_0] = GAUDI2_EVENT_TPC19_QM,
0300 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_1] = GAUDI2_EVENT_TPC19_QM,
0301 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_2] = GAUDI2_EVENT_TPC19_QM,
0302 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_3] = GAUDI2_EVENT_TPC19_QM,
0303 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_0] = GAUDI2_EVENT_TPC20_QM,
0304 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_1] = GAUDI2_EVENT_TPC20_QM,
0305 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_2] = GAUDI2_EVENT_TPC20_QM,
0306 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_3] = GAUDI2_EVENT_TPC20_QM,
0307 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_0] = GAUDI2_EVENT_TPC21_QM,
0308 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_1] = GAUDI2_EVENT_TPC21_QM,
0309 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_2] = GAUDI2_EVENT_TPC21_QM,
0310 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_3] = GAUDI2_EVENT_TPC21_QM,
0311 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_0] = GAUDI2_EVENT_TPC22_QM,
0312 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_1] = GAUDI2_EVENT_TPC22_QM,
0313 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_2] = GAUDI2_EVENT_TPC22_QM,
0314 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_3] = GAUDI2_EVENT_TPC22_QM,
0315 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_0] = GAUDI2_EVENT_TPC23_QM,
0316 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_1] = GAUDI2_EVENT_TPC23_QM,
0317 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_2] = GAUDI2_EVENT_TPC23_QM,
0318 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_3] = GAUDI2_EVENT_TPC23_QM,
0319 [GAUDI2_QUEUE_ID_NIC_0_0] = GAUDI2_EVENT_NIC0_QM0,
0320 [GAUDI2_QUEUE_ID_NIC_0_1] = GAUDI2_EVENT_NIC0_QM0,
0321 [GAUDI2_QUEUE_ID_NIC_0_2] = GAUDI2_EVENT_NIC0_QM0,
0322 [GAUDI2_QUEUE_ID_NIC_0_3] = GAUDI2_EVENT_NIC0_QM0,
0323 [GAUDI2_QUEUE_ID_NIC_1_0] = GAUDI2_EVENT_NIC0_QM1,
0324 [GAUDI2_QUEUE_ID_NIC_1_1] = GAUDI2_EVENT_NIC0_QM1,
0325 [GAUDI2_QUEUE_ID_NIC_1_2] = GAUDI2_EVENT_NIC0_QM1,
0326 [GAUDI2_QUEUE_ID_NIC_1_3] = GAUDI2_EVENT_NIC0_QM1,
0327 [GAUDI2_QUEUE_ID_NIC_2_0] = GAUDI2_EVENT_NIC1_QM0,
0328 [GAUDI2_QUEUE_ID_NIC_2_1] = GAUDI2_EVENT_NIC1_QM0,
0329 [GAUDI2_QUEUE_ID_NIC_2_2] = GAUDI2_EVENT_NIC1_QM0,
0330 [GAUDI2_QUEUE_ID_NIC_2_3] = GAUDI2_EVENT_NIC1_QM0,
0331 [GAUDI2_QUEUE_ID_NIC_3_0] = GAUDI2_EVENT_NIC1_QM1,
0332 [GAUDI2_QUEUE_ID_NIC_3_1] = GAUDI2_EVENT_NIC1_QM1,
0333 [GAUDI2_QUEUE_ID_NIC_3_2] = GAUDI2_EVENT_NIC1_QM1,
0334 [GAUDI2_QUEUE_ID_NIC_3_3] = GAUDI2_EVENT_NIC1_QM1,
0335 [GAUDI2_QUEUE_ID_NIC_4_0] = GAUDI2_EVENT_NIC2_QM0,
0336 [GAUDI2_QUEUE_ID_NIC_4_1] = GAUDI2_EVENT_NIC2_QM0,
0337 [GAUDI2_QUEUE_ID_NIC_4_2] = GAUDI2_EVENT_NIC2_QM0,
0338 [GAUDI2_QUEUE_ID_NIC_4_3] = GAUDI2_EVENT_NIC2_QM0,
0339 [GAUDI2_QUEUE_ID_NIC_5_0] = GAUDI2_EVENT_NIC2_QM1,
0340 [GAUDI2_QUEUE_ID_NIC_5_1] = GAUDI2_EVENT_NIC2_QM1,
0341 [GAUDI2_QUEUE_ID_NIC_5_2] = GAUDI2_EVENT_NIC2_QM1,
0342 [GAUDI2_QUEUE_ID_NIC_5_3] = GAUDI2_EVENT_NIC2_QM1,
0343 [GAUDI2_QUEUE_ID_NIC_6_0] = GAUDI2_EVENT_NIC3_QM0,
0344 [GAUDI2_QUEUE_ID_NIC_6_1] = GAUDI2_EVENT_NIC3_QM0,
0345 [GAUDI2_QUEUE_ID_NIC_6_2] = GAUDI2_EVENT_NIC3_QM0,
0346 [GAUDI2_QUEUE_ID_NIC_6_3] = GAUDI2_EVENT_NIC3_QM0,
0347 [GAUDI2_QUEUE_ID_NIC_7_0] = GAUDI2_EVENT_NIC3_QM1,
0348 [GAUDI2_QUEUE_ID_NIC_7_1] = GAUDI2_EVENT_NIC3_QM1,
0349 [GAUDI2_QUEUE_ID_NIC_7_2] = GAUDI2_EVENT_NIC3_QM1,
0350 [GAUDI2_QUEUE_ID_NIC_7_3] = GAUDI2_EVENT_NIC3_QM1,
0351 [GAUDI2_QUEUE_ID_NIC_8_0] = GAUDI2_EVENT_NIC4_QM0,
0352 [GAUDI2_QUEUE_ID_NIC_8_1] = GAUDI2_EVENT_NIC4_QM0,
0353 [GAUDI2_QUEUE_ID_NIC_8_2] = GAUDI2_EVENT_NIC4_QM0,
0354 [GAUDI2_QUEUE_ID_NIC_8_3] = GAUDI2_EVENT_NIC4_QM0,
0355 [GAUDI2_QUEUE_ID_NIC_9_0] = GAUDI2_EVENT_NIC4_QM1,
0356 [GAUDI2_QUEUE_ID_NIC_9_1] = GAUDI2_EVENT_NIC4_QM1,
0357 [GAUDI2_QUEUE_ID_NIC_9_2] = GAUDI2_EVENT_NIC4_QM1,
0358 [GAUDI2_QUEUE_ID_NIC_9_3] = GAUDI2_EVENT_NIC4_QM1,
0359 [GAUDI2_QUEUE_ID_NIC_10_0] = GAUDI2_EVENT_NIC5_QM0,
0360 [GAUDI2_QUEUE_ID_NIC_10_1] = GAUDI2_EVENT_NIC5_QM0,
0361 [GAUDI2_QUEUE_ID_NIC_10_2] = GAUDI2_EVENT_NIC5_QM0,
0362 [GAUDI2_QUEUE_ID_NIC_10_3] = GAUDI2_EVENT_NIC5_QM0,
0363 [GAUDI2_QUEUE_ID_NIC_11_0] = GAUDI2_EVENT_NIC5_QM1,
0364 [GAUDI2_QUEUE_ID_NIC_11_1] = GAUDI2_EVENT_NIC5_QM1,
0365 [GAUDI2_QUEUE_ID_NIC_11_2] = GAUDI2_EVENT_NIC5_QM1,
0366 [GAUDI2_QUEUE_ID_NIC_11_3] = GAUDI2_EVENT_NIC5_QM1,
0367 [GAUDI2_QUEUE_ID_NIC_12_0] = GAUDI2_EVENT_NIC6_QM0,
0368 [GAUDI2_QUEUE_ID_NIC_12_1] = GAUDI2_EVENT_NIC6_QM0,
0369 [GAUDI2_QUEUE_ID_NIC_12_2] = GAUDI2_EVENT_NIC6_QM0,
0370 [GAUDI2_QUEUE_ID_NIC_12_3] = GAUDI2_EVENT_NIC6_QM0,
0371 [GAUDI2_QUEUE_ID_NIC_13_0] = GAUDI2_EVENT_NIC6_QM1,
0372 [GAUDI2_QUEUE_ID_NIC_13_1] = GAUDI2_EVENT_NIC6_QM1,
0373 [GAUDI2_QUEUE_ID_NIC_13_2] = GAUDI2_EVENT_NIC6_QM1,
0374 [GAUDI2_QUEUE_ID_NIC_13_3] = GAUDI2_EVENT_NIC6_QM1,
0375 [GAUDI2_QUEUE_ID_NIC_14_0] = GAUDI2_EVENT_NIC7_QM0,
0376 [GAUDI2_QUEUE_ID_NIC_14_1] = GAUDI2_EVENT_NIC7_QM0,
0377 [GAUDI2_QUEUE_ID_NIC_14_2] = GAUDI2_EVENT_NIC7_QM0,
0378 [GAUDI2_QUEUE_ID_NIC_14_3] = GAUDI2_EVENT_NIC7_QM0,
0379 [GAUDI2_QUEUE_ID_NIC_15_0] = GAUDI2_EVENT_NIC7_QM1,
0380 [GAUDI2_QUEUE_ID_NIC_15_1] = GAUDI2_EVENT_NIC7_QM1,
0381 [GAUDI2_QUEUE_ID_NIC_15_2] = GAUDI2_EVENT_NIC7_QM1,
0382 [GAUDI2_QUEUE_ID_NIC_15_3] = GAUDI2_EVENT_NIC7_QM1,
0383 [GAUDI2_QUEUE_ID_NIC_16_0] = GAUDI2_EVENT_NIC8_QM0,
0384 [GAUDI2_QUEUE_ID_NIC_16_1] = GAUDI2_EVENT_NIC8_QM0,
0385 [GAUDI2_QUEUE_ID_NIC_16_2] = GAUDI2_EVENT_NIC8_QM0,
0386 [GAUDI2_QUEUE_ID_NIC_16_3] = GAUDI2_EVENT_NIC8_QM0,
0387 [GAUDI2_QUEUE_ID_NIC_17_0] = GAUDI2_EVENT_NIC8_QM1,
0388 [GAUDI2_QUEUE_ID_NIC_17_1] = GAUDI2_EVENT_NIC8_QM1,
0389 [GAUDI2_QUEUE_ID_NIC_17_2] = GAUDI2_EVENT_NIC8_QM1,
0390 [GAUDI2_QUEUE_ID_NIC_17_3] = GAUDI2_EVENT_NIC8_QM1,
0391 [GAUDI2_QUEUE_ID_NIC_18_0] = GAUDI2_EVENT_NIC9_QM0,
0392 [GAUDI2_QUEUE_ID_NIC_18_1] = GAUDI2_EVENT_NIC9_QM0,
0393 [GAUDI2_QUEUE_ID_NIC_18_2] = GAUDI2_EVENT_NIC9_QM0,
0394 [GAUDI2_QUEUE_ID_NIC_18_3] = GAUDI2_EVENT_NIC9_QM0,
0395 [GAUDI2_QUEUE_ID_NIC_19_0] = GAUDI2_EVENT_NIC9_QM1,
0396 [GAUDI2_QUEUE_ID_NIC_19_1] = GAUDI2_EVENT_NIC9_QM1,
0397 [GAUDI2_QUEUE_ID_NIC_19_2] = GAUDI2_EVENT_NIC9_QM1,
0398 [GAUDI2_QUEUE_ID_NIC_19_3] = GAUDI2_EVENT_NIC9_QM1,
0399 [GAUDI2_QUEUE_ID_NIC_20_0] = GAUDI2_EVENT_NIC10_QM0,
0400 [GAUDI2_QUEUE_ID_NIC_20_1] = GAUDI2_EVENT_NIC10_QM0,
0401 [GAUDI2_QUEUE_ID_NIC_20_2] = GAUDI2_EVENT_NIC10_QM0,
0402 [GAUDI2_QUEUE_ID_NIC_20_3] = GAUDI2_EVENT_NIC10_QM0,
0403 [GAUDI2_QUEUE_ID_NIC_21_0] = GAUDI2_EVENT_NIC10_QM1,
0404 [GAUDI2_QUEUE_ID_NIC_21_1] = GAUDI2_EVENT_NIC10_QM1,
0405 [GAUDI2_QUEUE_ID_NIC_21_2] = GAUDI2_EVENT_NIC10_QM1,
0406 [GAUDI2_QUEUE_ID_NIC_21_3] = GAUDI2_EVENT_NIC10_QM1,
0407 [GAUDI2_QUEUE_ID_NIC_22_0] = GAUDI2_EVENT_NIC11_QM0,
0408 [GAUDI2_QUEUE_ID_NIC_22_1] = GAUDI2_EVENT_NIC11_QM0,
0409 [GAUDI2_QUEUE_ID_NIC_22_2] = GAUDI2_EVENT_NIC11_QM0,
0410 [GAUDI2_QUEUE_ID_NIC_22_3] = GAUDI2_EVENT_NIC11_QM0,
0411 [GAUDI2_QUEUE_ID_NIC_23_0] = GAUDI2_EVENT_NIC11_QM1,
0412 [GAUDI2_QUEUE_ID_NIC_23_1] = GAUDI2_EVENT_NIC11_QM1,
0413 [GAUDI2_QUEUE_ID_NIC_23_2] = GAUDI2_EVENT_NIC11_QM1,
0414 [GAUDI2_QUEUE_ID_NIC_23_3] = GAUDI2_EVENT_NIC11_QM1,
0415 [GAUDI2_QUEUE_ID_ROT_0_0] = GAUDI2_EVENT_ROTATOR0_ROT0_QM,
0416 [GAUDI2_QUEUE_ID_ROT_0_1] = GAUDI2_EVENT_ROTATOR0_ROT0_QM,
0417 [GAUDI2_QUEUE_ID_ROT_0_2] = GAUDI2_EVENT_ROTATOR0_ROT0_QM,
0418 [GAUDI2_QUEUE_ID_ROT_0_3] = GAUDI2_EVENT_ROTATOR0_ROT0_QM,
0419 [GAUDI2_QUEUE_ID_ROT_1_0] = GAUDI2_EVENT_ROTATOR1_ROT1_QM,
0420 [GAUDI2_QUEUE_ID_ROT_1_1] = GAUDI2_EVENT_ROTATOR1_ROT1_QM,
0421 [GAUDI2_QUEUE_ID_ROT_1_2] = GAUDI2_EVENT_ROTATOR1_ROT1_QM,
0422 [GAUDI2_QUEUE_ID_ROT_1_3] = GAUDI2_EVENT_ROTATOR1_ROT1_QM
0423 };
0424
0425 static const int gaudi2_dma_core_async_event_id[] = {
0426 [DMA_CORE_ID_EDMA0] = GAUDI2_EVENT_HDMA0_CORE,
0427 [DMA_CORE_ID_EDMA1] = GAUDI2_EVENT_HDMA1_CORE,
0428 [DMA_CORE_ID_EDMA2] = GAUDI2_EVENT_HDMA2_CORE,
0429 [DMA_CORE_ID_EDMA3] = GAUDI2_EVENT_HDMA3_CORE,
0430 [DMA_CORE_ID_EDMA4] = GAUDI2_EVENT_HDMA4_CORE,
0431 [DMA_CORE_ID_EDMA5] = GAUDI2_EVENT_HDMA5_CORE,
0432 [DMA_CORE_ID_EDMA6] = GAUDI2_EVENT_HDMA6_CORE,
0433 [DMA_CORE_ID_EDMA7] = GAUDI2_EVENT_HDMA7_CORE,
0434 [DMA_CORE_ID_PDMA0] = GAUDI2_EVENT_PDMA0_CORE,
0435 [DMA_CORE_ID_PDMA1] = GAUDI2_EVENT_PDMA1_CORE,
0436 [DMA_CORE_ID_KDMA] = GAUDI2_EVENT_KDMA0_CORE,
0437 };
0438
0439 static const char * const gaudi2_qm_sei_error_cause[GAUDI2_NUM_OF_QM_SEI_ERR_CAUSE] = {
0440 "qman sei intr",
0441 "arc sei intr"
0442 };
0443
0444 static const char * const gaudi2_cpu_sei_error_cause[GAUDI2_NUM_OF_CPU_SEI_ERR_CAUSE] = {
0445 "AXI_TERMINATOR WR",
0446 "AXI_TERMINATOR RD",
0447 "AXI SPLIT SEI Status"
0448 };
0449
0450 static const char * const gaudi2_arc_sei_error_cause[GAUDI2_NUM_OF_ARC_SEI_ERR_CAUSE] = {
0451 "cbu_bresp_sei_intr_cause",
0452 "cbu_rresp_sei_intr_cause",
0453 "lbu_bresp_sei_intr_cause",
0454 "lbu_rresp_sei_intr_cause",
0455 "cbu_axi_split_intr_cause",
0456 "lbu_axi_split_intr_cause",
0457 "arc_ip_excptn_sei_intr_cause",
0458 "dmi_bresp_sei_intr_cause",
0459 "aux2apb_err_sei_intr_cause",
0460 "cfg_lbw_wr_terminated_intr_cause",
0461 "cfg_lbw_rd_terminated_intr_cause",
0462 "cfg_dccm_wr_terminated_intr_cause",
0463 "cfg_dccm_rd_terminated_intr_cause",
0464 "cfg_hbw_rd_terminated_intr_cause"
0465 };
0466
0467 static const char * const gaudi2_dec_error_cause[GAUDI2_NUM_OF_DEC_ERR_CAUSE] = {
0468 "msix_vcd_hbw_sei",
0469 "msix_l2c_hbw_sei",
0470 "msix_nrm_hbw_sei",
0471 "msix_abnrm_hbw_sei",
0472 "msix_vcd_lbw_sei",
0473 "msix_l2c_lbw_sei",
0474 "msix_nrm_lbw_sei",
0475 "msix_abnrm_lbw_sei",
0476 "apb_vcd_lbw_sei",
0477 "apb_l2c_lbw_sei",
0478 "apb_nrm_lbw_sei",
0479 "apb_abnrm_lbw_sei",
0480 "dec_sei",
0481 "dec_apb_sei",
0482 "trc_apb_sei",
0483 "lbw_mstr_if_sei",
0484 "axi_split_bresp_err_sei",
0485 "hbw_axi_wr_viol_sei",
0486 "hbw_axi_rd_viol_sei",
0487 "lbw_axi_wr_viol_sei",
0488 "lbw_axi_rd_viol_sei",
0489 "vcd_spi",
0490 "l2c_spi",
0491 "nrm_spi",
0492 "abnrm_spi",
0493 };
0494
0495 static const char * const gaudi2_qman_error_cause[GAUDI2_NUM_OF_QM_ERR_CAUSE] = {
0496 "PQ AXI HBW error",
0497 "CQ AXI HBW error",
0498 "CP AXI HBW error",
0499 "CP error due to undefined OPCODE",
0500 "CP encountered STOP OPCODE",
0501 "CP AXI LBW error",
0502 "CP WRREG32 or WRBULK returned error",
0503 "N/A",
0504 "FENCE 0 inc over max value and clipped",
0505 "FENCE 1 inc over max value and clipped",
0506 "FENCE 2 inc over max value and clipped",
0507 "FENCE 3 inc over max value and clipped",
0508 "FENCE 0 dec under min value and clipped",
0509 "FENCE 1 dec under min value and clipped",
0510 "FENCE 2 dec under min value and clipped",
0511 "FENCE 3 dec under min value and clipped",
0512 "CPDMA Up overflow",
0513 "PQC L2H error"
0514 };
0515
0516 static const char * const gaudi2_qman_lower_cp_error_cause[GAUDI2_NUM_OF_QM_LCP_ERR_CAUSE] = {
0517 "RSVD0",
0518 "CQ AXI HBW error",
0519 "CP AXI HBW error",
0520 "CP error due to undefined OPCODE",
0521 "CP encountered STOP OPCODE",
0522 "CP AXI LBW error",
0523 "CP WRREG32 or WRBULK returned error",
0524 "N/A",
0525 "FENCE 0 inc over max value and clipped",
0526 "FENCE 1 inc over max value and clipped",
0527 "FENCE 2 inc over max value and clipped",
0528 "FENCE 3 inc over max value and clipped",
0529 "FENCE 0 dec under min value and clipped",
0530 "FENCE 1 dec under min value and clipped",
0531 "FENCE 2 dec under min value and clipped",
0532 "FENCE 3 dec under min value and clipped",
0533 "CPDMA Up overflow",
0534 "RSVD17",
0535 "CQ_WR_IFIFO_CI_ERR",
0536 "CQ_WR_CTL_CI_ERR",
0537 "ARC_CQF_RD_ERR",
0538 "ARC_CQ_WR_IFIFO_CI_ERR",
0539 "ARC_CQ_WR_CTL_CI_ERR",
0540 "ARC_AXI_ERR",
0541 "CP_SWITCH_WDT_ERR"
0542 };
0543
0544 static const char * const gaudi2_qman_arb_error_cause[GAUDI2_NUM_OF_QM_ARB_ERR_CAUSE] = {
0545 "Choice push while full error",
0546 "Choice Q watchdog error",
0547 "MSG AXI LBW returned with error"
0548 };
0549
0550 static const char * const guadi2_rot_error_cause[GAUDI2_NUM_OF_ROT_ERR_CAUSE] = {
0551 "qm_axi_err",
0552 "qm_trace_fence_events",
0553 "qm_sw_err",
0554 "qm_cp_sw_stop",
0555 "lbw_mstr_rresp_err",
0556 "lbw_mstr_bresp_err",
0557 "lbw_msg_slverr",
0558 "hbw_msg_slverr",
0559 "wbc_slverr",
0560 "hbw_mstr_rresp_err",
0561 "hbw_mstr_bresp_err",
0562 "sb_resp_intr",
0563 "mrsb_resp_intr",
0564 "core_dw_status_0",
0565 "core_dw_status_1",
0566 "core_dw_status_2",
0567 "core_dw_status_3",
0568 "core_dw_status_4",
0569 "core_dw_status_5",
0570 "core_dw_status_6",
0571 "core_dw_status_7",
0572 "async_arc2cpu_sei_intr",
0573 };
0574
0575 static const char * const gaudi2_tpc_interrupts_cause[GAUDI2_NUM_OF_TPC_INTR_CAUSE] = {
0576 "tpc_address_exceed_slm",
0577 "tpc_div_by_0",
0578 "tpc_spu_mac_overflow",
0579 "tpc_spu_addsub_overflow",
0580 "tpc_spu_abs_overflow",
0581 "tpc_spu_fma_fp_dst_nan",
0582 "tpc_spu_fma_fp_dst_inf",
0583 "tpc_spu_convert_fp_dst_nan",
0584 "tpc_spu_convert_fp_dst_inf",
0585 "tpc_spu_fp_dst_denorm",
0586 "tpc_vpu_mac_overflow",
0587 "tpc_vpu_addsub_overflow",
0588 "tpc_vpu_abs_overflow",
0589 "tpc_vpu_convert_fp_dst_nan",
0590 "tpc_vpu_convert_fp_dst_inf",
0591 "tpc_vpu_fma_fp_dst_nan",
0592 "tpc_vpu_fma_fp_dst_inf",
0593 "tpc_vpu_fp_dst_denorm",
0594 "tpc_assertions",
0595 "tpc_illegal_instruction",
0596 "tpc_pc_wrap_around",
0597 "tpc_qm_sw_err",
0598 "tpc_hbw_rresp_err",
0599 "tpc_hbw_bresp_err",
0600 "tpc_lbw_rresp_err",
0601 "tpc_lbw_bresp_err",
0602 "st_unlock_already_locked",
0603 "invalid_lock_access",
0604 "LD_L protection violation",
0605 "ST_L protection violation",
0606 };
0607
0608 static const char * const guadi2_mme_error_cause[GAUDI2_NUM_OF_MME_ERR_CAUSE] = {
0609 "agu_resp_intr",
0610 "qman_axi_err",
0611 "wap sei (wbc axi err)",
0612 "arc sei",
0613 "mme_cfg_unalign_addr",
0614 "qm_sw_err",
0615 "sbte_dbg_intr_0",
0616 "sbte_dbg_intr_1",
0617 "sbte_dbg_intr_2",
0618 "sbte_dbg_intr_3",
0619 "sbte_dbg_intr_4",
0620 "sbte_prtn_intr_0",
0621 "sbte_prtn_intr_1",
0622 "sbte_prtn_intr_2",
0623 "sbte_prtn_intr_3",
0624 "sbte_prtn_intr_4",
0625 };
0626
0627 static const char * const guadi2_mme_sbte_error_cause[GAUDI2_NUM_OF_MME_SBTE_ERR_CAUSE] = {
0628 "i0",
0629 "i1",
0630 "i2",
0631 "i3",
0632 "i4",
0633 };
0634
0635 static const char * const guadi2_mme_wap_error_cause[GAUDI2_NUM_OF_MME_WAP_ERR_CAUSE] = {
0636 "WBC ERR RESP_0",
0637 "WBC ERR RESP_1",
0638 "AP SOURCE POS INF",
0639 "AP SOURCE NEG INF",
0640 "AP SOURCE NAN",
0641 "AP RESULT POS INF",
0642 "AP RESULT NEG INF",
0643 };
0644
0645 static const char * const gaudi2_dma_core_interrupts_cause[GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE] = {
0646 "HBW Read returned with error RRESP",
0647 "HBW write returned with error BRESP",
0648 "LBW write returned with error BRESP",
0649 "descriptor_fifo_overflow",
0650 "KDMA SB LBW Read returned with error",
0651 "KDMA WBC LBW Write returned with error",
0652 "TRANSPOSE ENGINE DESC FIFO OVERFLOW",
0653 "WRONG CFG FOR COMMIT IN LIN DMA"
0654 };
0655
0656 static const char * const gaudi2_kdma_core_interrupts_cause[GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE] = {
0657 "HBW/LBW Read returned with error RRESP",
0658 "HBW/LBW write returned with error BRESP",
0659 "LBW write returned with error BRESP",
0660 "descriptor_fifo_overflow",
0661 "KDMA SB LBW Read returned with error",
0662 "KDMA WBC LBW Write returned with error",
0663 "TRANSPOSE ENGINE DESC FIFO OVERFLOW",
0664 "WRONG CFG FOR COMMIT IN LIN DMA"
0665 };
0666
0667 struct gaudi2_sm_sei_cause_data {
0668 const char *cause_name;
0669 const char *log_name;
0670 u32 log_mask;
0671 };
0672
0673 static const struct gaudi2_sm_sei_cause_data
0674 gaudi2_sm_sei_cause[GAUDI2_NUM_OF_SM_SEI_ERR_CAUSE] = {
0675 {"calculated SO value overflow/underflow", "SOB group ID", 0x7FF},
0676 {"payload address of monitor is not aligned to 4B", "monitor addr", 0xFFFF},
0677 {"armed monitor write got BRESP (SLVERR or DECERR)", "AXI id", 0xFFFF},
0678 };
0679
0680 static const char * const
0681 gaudi2_pmmu_fatal_interrupts_cause[GAUDI2_NUM_OF_PMMU_FATAL_ERR_CAUSE] = {
0682 "LATENCY_RD_OUT_FIFO_OVERRUN",
0683 "LATENCY_WR_OUT_FIFO_OVERRUN",
0684 };
0685
0686 static const char * const
0687 gaudi2_hif_fatal_interrupts_cause[GAUDI2_NUM_OF_HIF_FATAL_ERR_CAUSE] = {
0688 "LATENCY_RD_OUT_FIFO_OVERRUN",
0689 "LATENCY_WR_OUT_FIFO_OVERRUN",
0690 };
0691
0692 static const char * const
0693 gaudi2_psoc_axi_drain_interrupts_cause[GAUDI2_NUM_OF_AXI_DRAIN_ERR_CAUSE] = {
0694 "AXI drain HBW",
0695 "AXI drain LBW",
0696 };
0697
0698 static const char * const
0699 gaudi2_pcie_addr_dec_error_cause[GAUDI2_NUM_OF_PCIE_ADDR_DEC_ERR_CAUSE] = {
0700 "HBW error response",
0701 "LBW error response",
0702 "TLP is blocked by RR"
0703 };
0704
0705 const u32 gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_SIZE] = {
0706 [GAUDI2_QUEUE_ID_PDMA_0_0] = mmPDMA0_QM_BASE,
0707 [GAUDI2_QUEUE_ID_PDMA_0_1] = mmPDMA0_QM_BASE,
0708 [GAUDI2_QUEUE_ID_PDMA_0_2] = mmPDMA0_QM_BASE,
0709 [GAUDI2_QUEUE_ID_PDMA_0_3] = mmPDMA0_QM_BASE,
0710 [GAUDI2_QUEUE_ID_PDMA_1_0] = mmPDMA1_QM_BASE,
0711 [GAUDI2_QUEUE_ID_PDMA_1_1] = mmPDMA1_QM_BASE,
0712 [GAUDI2_QUEUE_ID_PDMA_1_2] = mmPDMA1_QM_BASE,
0713 [GAUDI2_QUEUE_ID_PDMA_1_3] = mmPDMA1_QM_BASE,
0714 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0] = mmDCORE0_EDMA0_QM_BASE,
0715 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_1] = mmDCORE0_EDMA0_QM_BASE,
0716 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_2] = mmDCORE0_EDMA0_QM_BASE,
0717 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3] = mmDCORE0_EDMA0_QM_BASE,
0718 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0] = mmDCORE0_EDMA1_QM_BASE,
0719 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_1] = mmDCORE0_EDMA1_QM_BASE,
0720 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_2] = mmDCORE0_EDMA1_QM_BASE,
0721 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3] = mmDCORE0_EDMA1_QM_BASE,
0722 [GAUDI2_QUEUE_ID_DCORE0_MME_0_0] = mmDCORE0_MME_QM_BASE,
0723 [GAUDI2_QUEUE_ID_DCORE0_MME_0_1] = mmDCORE0_MME_QM_BASE,
0724 [GAUDI2_QUEUE_ID_DCORE0_MME_0_2] = mmDCORE0_MME_QM_BASE,
0725 [GAUDI2_QUEUE_ID_DCORE0_MME_0_3] = mmDCORE0_MME_QM_BASE,
0726 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_0] = mmDCORE0_TPC0_QM_BASE,
0727 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_1] = mmDCORE0_TPC0_QM_BASE,
0728 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_2] = mmDCORE0_TPC0_QM_BASE,
0729 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_3] = mmDCORE0_TPC0_QM_BASE,
0730 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_0] = mmDCORE0_TPC1_QM_BASE,
0731 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_1] = mmDCORE0_TPC1_QM_BASE,
0732 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_2] = mmDCORE0_TPC1_QM_BASE,
0733 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_3] = mmDCORE0_TPC1_QM_BASE,
0734 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_0] = mmDCORE0_TPC2_QM_BASE,
0735 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_1] = mmDCORE0_TPC2_QM_BASE,
0736 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_2] = mmDCORE0_TPC2_QM_BASE,
0737 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_3] = mmDCORE0_TPC2_QM_BASE,
0738 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_0] = mmDCORE0_TPC3_QM_BASE,
0739 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_1] = mmDCORE0_TPC3_QM_BASE,
0740 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_2] = mmDCORE0_TPC3_QM_BASE,
0741 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_3] = mmDCORE0_TPC3_QM_BASE,
0742 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_0] = mmDCORE0_TPC4_QM_BASE,
0743 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_1] = mmDCORE0_TPC4_QM_BASE,
0744 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_2] = mmDCORE0_TPC4_QM_BASE,
0745 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_3] = mmDCORE0_TPC4_QM_BASE,
0746 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_0] = mmDCORE0_TPC5_QM_BASE,
0747 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_1] = mmDCORE0_TPC5_QM_BASE,
0748 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_2] = mmDCORE0_TPC5_QM_BASE,
0749 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_3] = mmDCORE0_TPC5_QM_BASE,
0750 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_0] = mmDCORE0_TPC6_QM_BASE,
0751 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_1] = mmDCORE0_TPC6_QM_BASE,
0752 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_2] = mmDCORE0_TPC6_QM_BASE,
0753 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_3] = mmDCORE0_TPC6_QM_BASE,
0754 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0] = mmDCORE1_EDMA0_QM_BASE,
0755 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_1] = mmDCORE1_EDMA0_QM_BASE,
0756 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_2] = mmDCORE1_EDMA0_QM_BASE,
0757 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3] = mmDCORE1_EDMA0_QM_BASE,
0758 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0] = mmDCORE1_EDMA1_QM_BASE,
0759 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_1] = mmDCORE1_EDMA1_QM_BASE,
0760 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_2] = mmDCORE1_EDMA1_QM_BASE,
0761 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3] = mmDCORE1_EDMA1_QM_BASE,
0762 [GAUDI2_QUEUE_ID_DCORE1_MME_0_0] = mmDCORE1_MME_QM_BASE,
0763 [GAUDI2_QUEUE_ID_DCORE1_MME_0_1] = mmDCORE1_MME_QM_BASE,
0764 [GAUDI2_QUEUE_ID_DCORE1_MME_0_2] = mmDCORE1_MME_QM_BASE,
0765 [GAUDI2_QUEUE_ID_DCORE1_MME_0_3] = mmDCORE1_MME_QM_BASE,
0766 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_0] = mmDCORE1_TPC0_QM_BASE,
0767 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_1] = mmDCORE1_TPC0_QM_BASE,
0768 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_2] = mmDCORE1_TPC0_QM_BASE,
0769 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_3] = mmDCORE1_TPC0_QM_BASE,
0770 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_0] = mmDCORE1_TPC1_QM_BASE,
0771 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_1] = mmDCORE1_TPC1_QM_BASE,
0772 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_2] = mmDCORE1_TPC1_QM_BASE,
0773 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_3] = mmDCORE1_TPC1_QM_BASE,
0774 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_0] = mmDCORE1_TPC2_QM_BASE,
0775 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_1] = mmDCORE1_TPC2_QM_BASE,
0776 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_2] = mmDCORE1_TPC2_QM_BASE,
0777 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_3] = mmDCORE1_TPC2_QM_BASE,
0778 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_0] = mmDCORE1_TPC3_QM_BASE,
0779 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_1] = mmDCORE1_TPC3_QM_BASE,
0780 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_2] = mmDCORE1_TPC3_QM_BASE,
0781 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_3] = mmDCORE1_TPC3_QM_BASE,
0782 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_0] = mmDCORE1_TPC4_QM_BASE,
0783 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_1] = mmDCORE1_TPC4_QM_BASE,
0784 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_2] = mmDCORE1_TPC4_QM_BASE,
0785 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_3] = mmDCORE1_TPC4_QM_BASE,
0786 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_0] = mmDCORE1_TPC5_QM_BASE,
0787 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_1] = mmDCORE1_TPC5_QM_BASE,
0788 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_2] = mmDCORE1_TPC5_QM_BASE,
0789 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_3] = mmDCORE1_TPC5_QM_BASE,
0790 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0] = mmDCORE2_EDMA0_QM_BASE,
0791 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_1] = mmDCORE2_EDMA0_QM_BASE,
0792 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_2] = mmDCORE2_EDMA0_QM_BASE,
0793 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3] = mmDCORE2_EDMA0_QM_BASE,
0794 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0] = mmDCORE2_EDMA1_QM_BASE,
0795 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_1] = mmDCORE2_EDMA1_QM_BASE,
0796 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_2] = mmDCORE2_EDMA1_QM_BASE,
0797 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3] = mmDCORE2_EDMA1_QM_BASE,
0798 [GAUDI2_QUEUE_ID_DCORE2_MME_0_0] = mmDCORE2_MME_QM_BASE,
0799 [GAUDI2_QUEUE_ID_DCORE2_MME_0_1] = mmDCORE2_MME_QM_BASE,
0800 [GAUDI2_QUEUE_ID_DCORE2_MME_0_2] = mmDCORE2_MME_QM_BASE,
0801 [GAUDI2_QUEUE_ID_DCORE2_MME_0_3] = mmDCORE2_MME_QM_BASE,
0802 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_0] = mmDCORE2_TPC0_QM_BASE,
0803 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_1] = mmDCORE2_TPC0_QM_BASE,
0804 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_2] = mmDCORE2_TPC0_QM_BASE,
0805 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_3] = mmDCORE2_TPC0_QM_BASE,
0806 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_0] = mmDCORE2_TPC1_QM_BASE,
0807 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_1] = mmDCORE2_TPC1_QM_BASE,
0808 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_2] = mmDCORE2_TPC1_QM_BASE,
0809 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_3] = mmDCORE2_TPC1_QM_BASE,
0810 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_0] = mmDCORE2_TPC2_QM_BASE,
0811 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_1] = mmDCORE2_TPC2_QM_BASE,
0812 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_2] = mmDCORE2_TPC2_QM_BASE,
0813 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_3] = mmDCORE2_TPC2_QM_BASE,
0814 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_0] = mmDCORE2_TPC3_QM_BASE,
0815 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_1] = mmDCORE2_TPC3_QM_BASE,
0816 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_2] = mmDCORE2_TPC3_QM_BASE,
0817 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_3] = mmDCORE2_TPC3_QM_BASE,
0818 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_0] = mmDCORE2_TPC4_QM_BASE,
0819 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_1] = mmDCORE2_TPC4_QM_BASE,
0820 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_2] = mmDCORE2_TPC4_QM_BASE,
0821 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_3] = mmDCORE2_TPC4_QM_BASE,
0822 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_0] = mmDCORE2_TPC5_QM_BASE,
0823 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_1] = mmDCORE2_TPC5_QM_BASE,
0824 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_2] = mmDCORE2_TPC5_QM_BASE,
0825 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_3] = mmDCORE2_TPC5_QM_BASE,
0826 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0] = mmDCORE3_EDMA0_QM_BASE,
0827 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_1] = mmDCORE3_EDMA0_QM_BASE,
0828 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_2] = mmDCORE3_EDMA0_QM_BASE,
0829 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3] = mmDCORE3_EDMA0_QM_BASE,
0830 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0] = mmDCORE3_EDMA1_QM_BASE,
0831 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1] = mmDCORE3_EDMA1_QM_BASE,
0832 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2] = mmDCORE3_EDMA1_QM_BASE,
0833 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3] = mmDCORE3_EDMA1_QM_BASE,
0834 [GAUDI2_QUEUE_ID_DCORE3_MME_0_0] = mmDCORE3_MME_QM_BASE,
0835 [GAUDI2_QUEUE_ID_DCORE3_MME_0_1] = mmDCORE3_MME_QM_BASE,
0836 [GAUDI2_QUEUE_ID_DCORE3_MME_0_2] = mmDCORE3_MME_QM_BASE,
0837 [GAUDI2_QUEUE_ID_DCORE3_MME_0_3] = mmDCORE3_MME_QM_BASE,
0838 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_0] = mmDCORE3_TPC0_QM_BASE,
0839 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_1] = mmDCORE3_TPC0_QM_BASE,
0840 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_2] = mmDCORE3_TPC0_QM_BASE,
0841 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_3] = mmDCORE3_TPC0_QM_BASE,
0842 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_0] = mmDCORE3_TPC1_QM_BASE,
0843 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_1] = mmDCORE3_TPC1_QM_BASE,
0844 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_2] = mmDCORE3_TPC1_QM_BASE,
0845 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_3] = mmDCORE3_TPC1_QM_BASE,
0846 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_0] = mmDCORE3_TPC2_QM_BASE,
0847 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_1] = mmDCORE3_TPC2_QM_BASE,
0848 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_2] = mmDCORE3_TPC2_QM_BASE,
0849 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_3] = mmDCORE3_TPC2_QM_BASE,
0850 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_0] = mmDCORE3_TPC3_QM_BASE,
0851 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_1] = mmDCORE3_TPC3_QM_BASE,
0852 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_2] = mmDCORE3_TPC3_QM_BASE,
0853 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_3] = mmDCORE3_TPC3_QM_BASE,
0854 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_0] = mmDCORE3_TPC4_QM_BASE,
0855 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_1] = mmDCORE3_TPC4_QM_BASE,
0856 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_2] = mmDCORE3_TPC4_QM_BASE,
0857 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_3] = mmDCORE3_TPC4_QM_BASE,
0858 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_0] = mmDCORE3_TPC5_QM_BASE,
0859 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_1] = mmDCORE3_TPC5_QM_BASE,
0860 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_2] = mmDCORE3_TPC5_QM_BASE,
0861 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_3] = mmDCORE3_TPC5_QM_BASE,
0862 [GAUDI2_QUEUE_ID_NIC_0_0] = mmNIC0_QM0_BASE,
0863 [GAUDI2_QUEUE_ID_NIC_0_1] = mmNIC0_QM0_BASE,
0864 [GAUDI2_QUEUE_ID_NIC_0_2] = mmNIC0_QM0_BASE,
0865 [GAUDI2_QUEUE_ID_NIC_0_3] = mmNIC0_QM0_BASE,
0866 [GAUDI2_QUEUE_ID_NIC_1_0] = mmNIC0_QM1_BASE,
0867 [GAUDI2_QUEUE_ID_NIC_1_1] = mmNIC0_QM1_BASE,
0868 [GAUDI2_QUEUE_ID_NIC_1_2] = mmNIC0_QM1_BASE,
0869 [GAUDI2_QUEUE_ID_NIC_1_3] = mmNIC0_QM1_BASE,
0870 [GAUDI2_QUEUE_ID_NIC_2_0] = mmNIC1_QM0_BASE,
0871 [GAUDI2_QUEUE_ID_NIC_2_1] = mmNIC1_QM0_BASE,
0872 [GAUDI2_QUEUE_ID_NIC_2_2] = mmNIC1_QM0_BASE,
0873 [GAUDI2_QUEUE_ID_NIC_2_3] = mmNIC1_QM0_BASE,
0874 [GAUDI2_QUEUE_ID_NIC_3_0] = mmNIC1_QM1_BASE,
0875 [GAUDI2_QUEUE_ID_NIC_3_1] = mmNIC1_QM1_BASE,
0876 [GAUDI2_QUEUE_ID_NIC_3_2] = mmNIC1_QM1_BASE,
0877 [GAUDI2_QUEUE_ID_NIC_3_3] = mmNIC1_QM1_BASE,
0878 [GAUDI2_QUEUE_ID_NIC_4_0] = mmNIC2_QM0_BASE,
0879 [GAUDI2_QUEUE_ID_NIC_4_1] = mmNIC2_QM0_BASE,
0880 [GAUDI2_QUEUE_ID_NIC_4_2] = mmNIC2_QM0_BASE,
0881 [GAUDI2_QUEUE_ID_NIC_4_3] = mmNIC2_QM0_BASE,
0882 [GAUDI2_QUEUE_ID_NIC_5_0] = mmNIC2_QM1_BASE,
0883 [GAUDI2_QUEUE_ID_NIC_5_1] = mmNIC2_QM1_BASE,
0884 [GAUDI2_QUEUE_ID_NIC_5_2] = mmNIC2_QM1_BASE,
0885 [GAUDI2_QUEUE_ID_NIC_5_3] = mmNIC2_QM1_BASE,
0886 [GAUDI2_QUEUE_ID_NIC_6_0] = mmNIC3_QM0_BASE,
0887 [GAUDI2_QUEUE_ID_NIC_6_1] = mmNIC3_QM0_BASE,
0888 [GAUDI2_QUEUE_ID_NIC_6_2] = mmNIC3_QM0_BASE,
0889 [GAUDI2_QUEUE_ID_NIC_6_3] = mmNIC3_QM0_BASE,
0890 [GAUDI2_QUEUE_ID_NIC_7_0] = mmNIC3_QM1_BASE,
0891 [GAUDI2_QUEUE_ID_NIC_7_1] = mmNIC3_QM1_BASE,
0892 [GAUDI2_QUEUE_ID_NIC_7_2] = mmNIC3_QM1_BASE,
0893 [GAUDI2_QUEUE_ID_NIC_7_3] = mmNIC3_QM1_BASE,
0894 [GAUDI2_QUEUE_ID_NIC_8_0] = mmNIC4_QM0_BASE,
0895 [GAUDI2_QUEUE_ID_NIC_8_1] = mmNIC4_QM0_BASE,
0896 [GAUDI2_QUEUE_ID_NIC_8_2] = mmNIC4_QM0_BASE,
0897 [GAUDI2_QUEUE_ID_NIC_8_3] = mmNIC4_QM0_BASE,
0898 [GAUDI2_QUEUE_ID_NIC_9_0] = mmNIC4_QM1_BASE,
0899 [GAUDI2_QUEUE_ID_NIC_9_1] = mmNIC4_QM1_BASE,
0900 [GAUDI2_QUEUE_ID_NIC_9_2] = mmNIC4_QM1_BASE,
0901 [GAUDI2_QUEUE_ID_NIC_9_3] = mmNIC4_QM1_BASE,
0902 [GAUDI2_QUEUE_ID_NIC_10_0] = mmNIC5_QM0_BASE,
0903 [GAUDI2_QUEUE_ID_NIC_10_1] = mmNIC5_QM0_BASE,
0904 [GAUDI2_QUEUE_ID_NIC_10_2] = mmNIC5_QM0_BASE,
0905 [GAUDI2_QUEUE_ID_NIC_10_3] = mmNIC5_QM0_BASE,
0906 [GAUDI2_QUEUE_ID_NIC_11_0] = mmNIC5_QM1_BASE,
0907 [GAUDI2_QUEUE_ID_NIC_11_1] = mmNIC5_QM1_BASE,
0908 [GAUDI2_QUEUE_ID_NIC_11_2] = mmNIC5_QM1_BASE,
0909 [GAUDI2_QUEUE_ID_NIC_11_3] = mmNIC5_QM1_BASE,
0910 [GAUDI2_QUEUE_ID_NIC_12_0] = mmNIC6_QM0_BASE,
0911 [GAUDI2_QUEUE_ID_NIC_12_1] = mmNIC6_QM0_BASE,
0912 [GAUDI2_QUEUE_ID_NIC_12_2] = mmNIC6_QM0_BASE,
0913 [GAUDI2_QUEUE_ID_NIC_12_3] = mmNIC6_QM0_BASE,
0914 [GAUDI2_QUEUE_ID_NIC_13_0] = mmNIC6_QM1_BASE,
0915 [GAUDI2_QUEUE_ID_NIC_13_1] = mmNIC6_QM1_BASE,
0916 [GAUDI2_QUEUE_ID_NIC_13_2] = mmNIC6_QM1_BASE,
0917 [GAUDI2_QUEUE_ID_NIC_13_3] = mmNIC6_QM1_BASE,
0918 [GAUDI2_QUEUE_ID_NIC_14_0] = mmNIC7_QM0_BASE,
0919 [GAUDI2_QUEUE_ID_NIC_14_1] = mmNIC7_QM0_BASE,
0920 [GAUDI2_QUEUE_ID_NIC_14_2] = mmNIC7_QM0_BASE,
0921 [GAUDI2_QUEUE_ID_NIC_14_3] = mmNIC7_QM0_BASE,
0922 [GAUDI2_QUEUE_ID_NIC_15_0] = mmNIC7_QM1_BASE,
0923 [GAUDI2_QUEUE_ID_NIC_15_1] = mmNIC7_QM1_BASE,
0924 [GAUDI2_QUEUE_ID_NIC_15_2] = mmNIC7_QM1_BASE,
0925 [GAUDI2_QUEUE_ID_NIC_15_3] = mmNIC7_QM1_BASE,
0926 [GAUDI2_QUEUE_ID_NIC_16_0] = mmNIC8_QM0_BASE,
0927 [GAUDI2_QUEUE_ID_NIC_16_1] = mmNIC8_QM0_BASE,
0928 [GAUDI2_QUEUE_ID_NIC_16_2] = mmNIC8_QM0_BASE,
0929 [GAUDI2_QUEUE_ID_NIC_16_3] = mmNIC8_QM0_BASE,
0930 [GAUDI2_QUEUE_ID_NIC_17_0] = mmNIC8_QM1_BASE,
0931 [GAUDI2_QUEUE_ID_NIC_17_1] = mmNIC8_QM1_BASE,
0932 [GAUDI2_QUEUE_ID_NIC_17_2] = mmNIC8_QM1_BASE,
0933 [GAUDI2_QUEUE_ID_NIC_17_3] = mmNIC8_QM1_BASE,
0934 [GAUDI2_QUEUE_ID_NIC_18_0] = mmNIC9_QM0_BASE,
0935 [GAUDI2_QUEUE_ID_NIC_18_1] = mmNIC9_QM0_BASE,
0936 [GAUDI2_QUEUE_ID_NIC_18_2] = mmNIC9_QM0_BASE,
0937 [GAUDI2_QUEUE_ID_NIC_18_3] = mmNIC9_QM0_BASE,
0938 [GAUDI2_QUEUE_ID_NIC_19_0] = mmNIC9_QM1_BASE,
0939 [GAUDI2_QUEUE_ID_NIC_19_1] = mmNIC9_QM1_BASE,
0940 [GAUDI2_QUEUE_ID_NIC_19_2] = mmNIC9_QM1_BASE,
0941 [GAUDI2_QUEUE_ID_NIC_19_3] = mmNIC9_QM1_BASE,
0942 [GAUDI2_QUEUE_ID_NIC_20_0] = mmNIC10_QM0_BASE,
0943 [GAUDI2_QUEUE_ID_NIC_20_1] = mmNIC10_QM0_BASE,
0944 [GAUDI2_QUEUE_ID_NIC_20_2] = mmNIC10_QM0_BASE,
0945 [GAUDI2_QUEUE_ID_NIC_20_3] = mmNIC10_QM0_BASE,
0946 [GAUDI2_QUEUE_ID_NIC_21_0] = mmNIC10_QM1_BASE,
0947 [GAUDI2_QUEUE_ID_NIC_21_1] = mmNIC10_QM1_BASE,
0948 [GAUDI2_QUEUE_ID_NIC_21_2] = mmNIC10_QM1_BASE,
0949 [GAUDI2_QUEUE_ID_NIC_21_3] = mmNIC10_QM1_BASE,
0950 [GAUDI2_QUEUE_ID_NIC_22_0] = mmNIC11_QM0_BASE,
0951 [GAUDI2_QUEUE_ID_NIC_22_1] = mmNIC11_QM0_BASE,
0952 [GAUDI2_QUEUE_ID_NIC_22_2] = mmNIC11_QM0_BASE,
0953 [GAUDI2_QUEUE_ID_NIC_22_3] = mmNIC11_QM0_BASE,
0954 [GAUDI2_QUEUE_ID_NIC_23_0] = mmNIC11_QM1_BASE,
0955 [GAUDI2_QUEUE_ID_NIC_23_1] = mmNIC11_QM1_BASE,
0956 [GAUDI2_QUEUE_ID_NIC_23_2] = mmNIC11_QM1_BASE,
0957 [GAUDI2_QUEUE_ID_NIC_23_3] = mmNIC11_QM1_BASE,
0958 [GAUDI2_QUEUE_ID_ROT_0_0] = mmROT0_QM_BASE,
0959 [GAUDI2_QUEUE_ID_ROT_0_1] = mmROT0_QM_BASE,
0960 [GAUDI2_QUEUE_ID_ROT_0_2] = mmROT0_QM_BASE,
0961 [GAUDI2_QUEUE_ID_ROT_0_3] = mmROT0_QM_BASE,
0962 [GAUDI2_QUEUE_ID_ROT_1_0] = mmROT1_QM_BASE,
0963 [GAUDI2_QUEUE_ID_ROT_1_1] = mmROT1_QM_BASE,
0964 [GAUDI2_QUEUE_ID_ROT_1_2] = mmROT1_QM_BASE,
0965 [GAUDI2_QUEUE_ID_ROT_1_3] = mmROT1_QM_BASE
0966 };
0967
0968 static const u32 gaudi2_arc_blocks_bases[NUM_ARC_CPUS] = {
0969 [CPU_ID_SCHED_ARC0] = mmARC_FARM_ARC0_AUX_BASE,
0970 [CPU_ID_SCHED_ARC1] = mmARC_FARM_ARC1_AUX_BASE,
0971 [CPU_ID_SCHED_ARC2] = mmARC_FARM_ARC2_AUX_BASE,
0972 [CPU_ID_SCHED_ARC3] = mmARC_FARM_ARC3_AUX_BASE,
0973 [CPU_ID_SCHED_ARC4] = mmDCORE1_MME_QM_ARC_AUX_BASE,
0974 [CPU_ID_SCHED_ARC5] = mmDCORE3_MME_QM_ARC_AUX_BASE,
0975 [CPU_ID_TPC_QMAN_ARC0] = mmDCORE0_TPC0_QM_ARC_AUX_BASE,
0976 [CPU_ID_TPC_QMAN_ARC1] = mmDCORE0_TPC1_QM_ARC_AUX_BASE,
0977 [CPU_ID_TPC_QMAN_ARC2] = mmDCORE0_TPC2_QM_ARC_AUX_BASE,
0978 [CPU_ID_TPC_QMAN_ARC3] = mmDCORE0_TPC3_QM_ARC_AUX_BASE,
0979 [CPU_ID_TPC_QMAN_ARC4] = mmDCORE0_TPC4_QM_ARC_AUX_BASE,
0980 [CPU_ID_TPC_QMAN_ARC5] = mmDCORE0_TPC5_QM_ARC_AUX_BASE,
0981 [CPU_ID_TPC_QMAN_ARC6] = mmDCORE1_TPC0_QM_ARC_AUX_BASE,
0982 [CPU_ID_TPC_QMAN_ARC7] = mmDCORE1_TPC1_QM_ARC_AUX_BASE,
0983 [CPU_ID_TPC_QMAN_ARC8] = mmDCORE1_TPC2_QM_ARC_AUX_BASE,
0984 [CPU_ID_TPC_QMAN_ARC9] = mmDCORE1_TPC3_QM_ARC_AUX_BASE,
0985 [CPU_ID_TPC_QMAN_ARC10] = mmDCORE1_TPC4_QM_ARC_AUX_BASE,
0986 [CPU_ID_TPC_QMAN_ARC11] = mmDCORE1_TPC5_QM_ARC_AUX_BASE,
0987 [CPU_ID_TPC_QMAN_ARC12] = mmDCORE2_TPC0_QM_ARC_AUX_BASE,
0988 [CPU_ID_TPC_QMAN_ARC13] = mmDCORE2_TPC1_QM_ARC_AUX_BASE,
0989 [CPU_ID_TPC_QMAN_ARC14] = mmDCORE2_TPC2_QM_ARC_AUX_BASE,
0990 [CPU_ID_TPC_QMAN_ARC15] = mmDCORE2_TPC3_QM_ARC_AUX_BASE,
0991 [CPU_ID_TPC_QMAN_ARC16] = mmDCORE2_TPC4_QM_ARC_AUX_BASE,
0992 [CPU_ID_TPC_QMAN_ARC17] = mmDCORE2_TPC5_QM_ARC_AUX_BASE,
0993 [CPU_ID_TPC_QMAN_ARC18] = mmDCORE3_TPC0_QM_ARC_AUX_BASE,
0994 [CPU_ID_TPC_QMAN_ARC19] = mmDCORE3_TPC1_QM_ARC_AUX_BASE,
0995 [CPU_ID_TPC_QMAN_ARC20] = mmDCORE3_TPC2_QM_ARC_AUX_BASE,
0996 [CPU_ID_TPC_QMAN_ARC21] = mmDCORE3_TPC3_QM_ARC_AUX_BASE,
0997 [CPU_ID_TPC_QMAN_ARC22] = mmDCORE3_TPC4_QM_ARC_AUX_BASE,
0998 [CPU_ID_TPC_QMAN_ARC23] = mmDCORE3_TPC5_QM_ARC_AUX_BASE,
0999 [CPU_ID_TPC_QMAN_ARC24] = mmDCORE0_TPC6_QM_ARC_AUX_BASE,
1000 [CPU_ID_MME_QMAN_ARC0] = mmDCORE0_MME_QM_ARC_AUX_BASE,
1001 [CPU_ID_MME_QMAN_ARC1] = mmDCORE2_MME_QM_ARC_AUX_BASE,
1002 [CPU_ID_EDMA_QMAN_ARC0] = mmDCORE0_EDMA0_QM_ARC_AUX_BASE,
1003 [CPU_ID_EDMA_QMAN_ARC1] = mmDCORE0_EDMA1_QM_ARC_AUX_BASE,
1004 [CPU_ID_EDMA_QMAN_ARC2] = mmDCORE1_EDMA0_QM_ARC_AUX_BASE,
1005 [CPU_ID_EDMA_QMAN_ARC3] = mmDCORE1_EDMA1_QM_ARC_AUX_BASE,
1006 [CPU_ID_EDMA_QMAN_ARC4] = mmDCORE2_EDMA0_QM_ARC_AUX_BASE,
1007 [CPU_ID_EDMA_QMAN_ARC5] = mmDCORE2_EDMA1_QM_ARC_AUX_BASE,
1008 [CPU_ID_EDMA_QMAN_ARC6] = mmDCORE3_EDMA0_QM_ARC_AUX_BASE,
1009 [CPU_ID_EDMA_QMAN_ARC7] = mmDCORE3_EDMA1_QM_ARC_AUX_BASE,
1010 [CPU_ID_PDMA_QMAN_ARC0] = mmPDMA0_QM_ARC_AUX_BASE,
1011 [CPU_ID_PDMA_QMAN_ARC1] = mmPDMA1_QM_ARC_AUX_BASE,
1012 [CPU_ID_ROT_QMAN_ARC0] = mmROT0_QM_ARC_AUX_BASE,
1013 [CPU_ID_ROT_QMAN_ARC1] = mmROT1_QM_ARC_AUX_BASE,
1014 [CPU_ID_NIC_QMAN_ARC0] = mmNIC0_QM_ARC_AUX0_BASE,
1015 [CPU_ID_NIC_QMAN_ARC1] = mmNIC0_QM_ARC_AUX1_BASE,
1016 [CPU_ID_NIC_QMAN_ARC2] = mmNIC1_QM_ARC_AUX0_BASE,
1017 [CPU_ID_NIC_QMAN_ARC3] = mmNIC1_QM_ARC_AUX1_BASE,
1018 [CPU_ID_NIC_QMAN_ARC4] = mmNIC2_QM_ARC_AUX0_BASE,
1019 [CPU_ID_NIC_QMAN_ARC5] = mmNIC2_QM_ARC_AUX1_BASE,
1020 [CPU_ID_NIC_QMAN_ARC6] = mmNIC3_QM_ARC_AUX0_BASE,
1021 [CPU_ID_NIC_QMAN_ARC7] = mmNIC3_QM_ARC_AUX1_BASE,
1022 [CPU_ID_NIC_QMAN_ARC8] = mmNIC4_QM_ARC_AUX0_BASE,
1023 [CPU_ID_NIC_QMAN_ARC9] = mmNIC4_QM_ARC_AUX1_BASE,
1024 [CPU_ID_NIC_QMAN_ARC10] = mmNIC5_QM_ARC_AUX0_BASE,
1025 [CPU_ID_NIC_QMAN_ARC11] = mmNIC5_QM_ARC_AUX1_BASE,
1026 [CPU_ID_NIC_QMAN_ARC12] = mmNIC6_QM_ARC_AUX0_BASE,
1027 [CPU_ID_NIC_QMAN_ARC13] = mmNIC6_QM_ARC_AUX1_BASE,
1028 [CPU_ID_NIC_QMAN_ARC14] = mmNIC7_QM_ARC_AUX0_BASE,
1029 [CPU_ID_NIC_QMAN_ARC15] = mmNIC7_QM_ARC_AUX1_BASE,
1030 [CPU_ID_NIC_QMAN_ARC16] = mmNIC8_QM_ARC_AUX0_BASE,
1031 [CPU_ID_NIC_QMAN_ARC17] = mmNIC8_QM_ARC_AUX1_BASE,
1032 [CPU_ID_NIC_QMAN_ARC18] = mmNIC9_QM_ARC_AUX0_BASE,
1033 [CPU_ID_NIC_QMAN_ARC19] = mmNIC9_QM_ARC_AUX1_BASE,
1034 [CPU_ID_NIC_QMAN_ARC20] = mmNIC10_QM_ARC_AUX0_BASE,
1035 [CPU_ID_NIC_QMAN_ARC21] = mmNIC10_QM_ARC_AUX1_BASE,
1036 [CPU_ID_NIC_QMAN_ARC22] = mmNIC11_QM_ARC_AUX0_BASE,
1037 [CPU_ID_NIC_QMAN_ARC23] = mmNIC11_QM_ARC_AUX1_BASE,
1038 };
1039
1040 static const u32 gaudi2_arc_dccm_bases[NUM_ARC_CPUS] = {
1041 [CPU_ID_SCHED_ARC0] = mmARC_FARM_ARC0_DCCM0_BASE,
1042 [CPU_ID_SCHED_ARC1] = mmARC_FARM_ARC1_DCCM0_BASE,
1043 [CPU_ID_SCHED_ARC2] = mmARC_FARM_ARC2_DCCM0_BASE,
1044 [CPU_ID_SCHED_ARC3] = mmARC_FARM_ARC3_DCCM0_BASE,
1045 [CPU_ID_SCHED_ARC4] = mmDCORE1_MME_QM_ARC_DCCM_BASE,
1046 [CPU_ID_SCHED_ARC5] = mmDCORE3_MME_QM_ARC_DCCM_BASE,
1047 [CPU_ID_TPC_QMAN_ARC0] = mmDCORE0_TPC0_QM_DCCM_BASE,
1048 [CPU_ID_TPC_QMAN_ARC1] = mmDCORE0_TPC1_QM_DCCM_BASE,
1049 [CPU_ID_TPC_QMAN_ARC2] = mmDCORE0_TPC2_QM_DCCM_BASE,
1050 [CPU_ID_TPC_QMAN_ARC3] = mmDCORE0_TPC3_QM_DCCM_BASE,
1051 [CPU_ID_TPC_QMAN_ARC4] = mmDCORE0_TPC4_QM_DCCM_BASE,
1052 [CPU_ID_TPC_QMAN_ARC5] = mmDCORE0_TPC5_QM_DCCM_BASE,
1053 [CPU_ID_TPC_QMAN_ARC6] = mmDCORE1_TPC0_QM_DCCM_BASE,
1054 [CPU_ID_TPC_QMAN_ARC7] = mmDCORE1_TPC1_QM_DCCM_BASE,
1055 [CPU_ID_TPC_QMAN_ARC8] = mmDCORE1_TPC2_QM_DCCM_BASE,
1056 [CPU_ID_TPC_QMAN_ARC9] = mmDCORE1_TPC3_QM_DCCM_BASE,
1057 [CPU_ID_TPC_QMAN_ARC10] = mmDCORE1_TPC4_QM_DCCM_BASE,
1058 [CPU_ID_TPC_QMAN_ARC11] = mmDCORE1_TPC5_QM_DCCM_BASE,
1059 [CPU_ID_TPC_QMAN_ARC12] = mmDCORE2_TPC0_QM_DCCM_BASE,
1060 [CPU_ID_TPC_QMAN_ARC13] = mmDCORE2_TPC1_QM_DCCM_BASE,
1061 [CPU_ID_TPC_QMAN_ARC14] = mmDCORE2_TPC2_QM_DCCM_BASE,
1062 [CPU_ID_TPC_QMAN_ARC15] = mmDCORE2_TPC3_QM_DCCM_BASE,
1063 [CPU_ID_TPC_QMAN_ARC16] = mmDCORE2_TPC4_QM_DCCM_BASE,
1064 [CPU_ID_TPC_QMAN_ARC17] = mmDCORE2_TPC5_QM_DCCM_BASE,
1065 [CPU_ID_TPC_QMAN_ARC18] = mmDCORE3_TPC0_QM_DCCM_BASE,
1066 [CPU_ID_TPC_QMAN_ARC19] = mmDCORE3_TPC1_QM_DCCM_BASE,
1067 [CPU_ID_TPC_QMAN_ARC20] = mmDCORE3_TPC2_QM_DCCM_BASE,
1068 [CPU_ID_TPC_QMAN_ARC21] = mmDCORE3_TPC3_QM_DCCM_BASE,
1069 [CPU_ID_TPC_QMAN_ARC22] = mmDCORE3_TPC4_QM_DCCM_BASE,
1070 [CPU_ID_TPC_QMAN_ARC23] = mmDCORE3_TPC5_QM_DCCM_BASE,
1071 [CPU_ID_TPC_QMAN_ARC24] = mmDCORE0_TPC6_QM_DCCM_BASE,
1072 [CPU_ID_MME_QMAN_ARC0] = mmDCORE0_MME_QM_ARC_DCCM_BASE,
1073 [CPU_ID_MME_QMAN_ARC1] = mmDCORE2_MME_QM_ARC_DCCM_BASE,
1074 [CPU_ID_EDMA_QMAN_ARC0] = mmDCORE0_EDMA0_QM_DCCM_BASE,
1075 [CPU_ID_EDMA_QMAN_ARC1] = mmDCORE0_EDMA1_QM_DCCM_BASE,
1076 [CPU_ID_EDMA_QMAN_ARC2] = mmDCORE1_EDMA0_QM_DCCM_BASE,
1077 [CPU_ID_EDMA_QMAN_ARC3] = mmDCORE1_EDMA1_QM_DCCM_BASE,
1078 [CPU_ID_EDMA_QMAN_ARC4] = mmDCORE2_EDMA0_QM_DCCM_BASE,
1079 [CPU_ID_EDMA_QMAN_ARC5] = mmDCORE2_EDMA1_QM_DCCM_BASE,
1080 [CPU_ID_EDMA_QMAN_ARC6] = mmDCORE3_EDMA0_QM_DCCM_BASE,
1081 [CPU_ID_EDMA_QMAN_ARC7] = mmDCORE3_EDMA1_QM_DCCM_BASE,
1082 [CPU_ID_PDMA_QMAN_ARC0] = mmPDMA0_QM_ARC_DCCM_BASE,
1083 [CPU_ID_PDMA_QMAN_ARC1] = mmPDMA1_QM_ARC_DCCM_BASE,
1084 [CPU_ID_ROT_QMAN_ARC0] = mmROT0_QM_ARC_DCCM_BASE,
1085 [CPU_ID_ROT_QMAN_ARC1] = mmROT1_QM_ARC_DCCM_BASE,
1086 [CPU_ID_NIC_QMAN_ARC0] = mmNIC0_QM_DCCM0_BASE,
1087 [CPU_ID_NIC_QMAN_ARC1] = mmNIC0_QM_DCCM1_BASE,
1088 [CPU_ID_NIC_QMAN_ARC2] = mmNIC1_QM_DCCM0_BASE,
1089 [CPU_ID_NIC_QMAN_ARC3] = mmNIC1_QM_DCCM1_BASE,
1090 [CPU_ID_NIC_QMAN_ARC4] = mmNIC2_QM_DCCM0_BASE,
1091 [CPU_ID_NIC_QMAN_ARC5] = mmNIC2_QM_DCCM1_BASE,
1092 [CPU_ID_NIC_QMAN_ARC6] = mmNIC3_QM_DCCM0_BASE,
1093 [CPU_ID_NIC_QMAN_ARC7] = mmNIC3_QM_DCCM1_BASE,
1094 [CPU_ID_NIC_QMAN_ARC8] = mmNIC4_QM_DCCM0_BASE,
1095 [CPU_ID_NIC_QMAN_ARC9] = mmNIC4_QM_DCCM1_BASE,
1096 [CPU_ID_NIC_QMAN_ARC10] = mmNIC5_QM_DCCM0_BASE,
1097 [CPU_ID_NIC_QMAN_ARC11] = mmNIC5_QM_DCCM1_BASE,
1098 [CPU_ID_NIC_QMAN_ARC12] = mmNIC6_QM_DCCM0_BASE,
1099 [CPU_ID_NIC_QMAN_ARC13] = mmNIC6_QM_DCCM1_BASE,
1100 [CPU_ID_NIC_QMAN_ARC14] = mmNIC7_QM_DCCM0_BASE,
1101 [CPU_ID_NIC_QMAN_ARC15] = mmNIC7_QM_DCCM1_BASE,
1102 [CPU_ID_NIC_QMAN_ARC16] = mmNIC8_QM_DCCM0_BASE,
1103 [CPU_ID_NIC_QMAN_ARC17] = mmNIC8_QM_DCCM1_BASE,
1104 [CPU_ID_NIC_QMAN_ARC18] = mmNIC9_QM_DCCM0_BASE,
1105 [CPU_ID_NIC_QMAN_ARC19] = mmNIC9_QM_DCCM1_BASE,
1106 [CPU_ID_NIC_QMAN_ARC20] = mmNIC10_QM_DCCM0_BASE,
1107 [CPU_ID_NIC_QMAN_ARC21] = mmNIC10_QM_DCCM1_BASE,
1108 [CPU_ID_NIC_QMAN_ARC22] = mmNIC11_QM_DCCM0_BASE,
1109 [CPU_ID_NIC_QMAN_ARC23] = mmNIC11_QM_DCCM1_BASE,
1110 };
1111
1112 const u32 gaudi2_mme_ctrl_lo_blocks_bases[MME_ID_SIZE] = {
1113 [MME_ID_DCORE0] = mmDCORE0_MME_CTRL_LO_BASE,
1114 [MME_ID_DCORE1] = mmDCORE1_MME_CTRL_LO_BASE,
1115 [MME_ID_DCORE2] = mmDCORE2_MME_CTRL_LO_BASE,
1116 [MME_ID_DCORE3] = mmDCORE3_MME_CTRL_LO_BASE,
1117 };
1118
1119 static const u32 gaudi2_queue_id_to_arc_id[GAUDI2_QUEUE_ID_SIZE] = {
1120 [GAUDI2_QUEUE_ID_PDMA_0_0] = CPU_ID_PDMA_QMAN_ARC0,
1121 [GAUDI2_QUEUE_ID_PDMA_0_1] = CPU_ID_PDMA_QMAN_ARC0,
1122 [GAUDI2_QUEUE_ID_PDMA_0_2] = CPU_ID_PDMA_QMAN_ARC0,
1123 [GAUDI2_QUEUE_ID_PDMA_0_3] = CPU_ID_PDMA_QMAN_ARC0,
1124 [GAUDI2_QUEUE_ID_PDMA_1_0] = CPU_ID_PDMA_QMAN_ARC1,
1125 [GAUDI2_QUEUE_ID_PDMA_1_1] = CPU_ID_PDMA_QMAN_ARC1,
1126 [GAUDI2_QUEUE_ID_PDMA_1_2] = CPU_ID_PDMA_QMAN_ARC1,
1127 [GAUDI2_QUEUE_ID_PDMA_1_3] = CPU_ID_PDMA_QMAN_ARC1,
1128 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC0,
1129 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC0,
1130 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC0,
1131 [GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC0,
1132 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC1,
1133 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC1,
1134 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC1,
1135 [GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC1,
1136 [GAUDI2_QUEUE_ID_DCORE0_MME_0_0] = CPU_ID_MME_QMAN_ARC0,
1137 [GAUDI2_QUEUE_ID_DCORE0_MME_0_1] = CPU_ID_MME_QMAN_ARC0,
1138 [GAUDI2_QUEUE_ID_DCORE0_MME_0_2] = CPU_ID_MME_QMAN_ARC0,
1139 [GAUDI2_QUEUE_ID_DCORE0_MME_0_3] = CPU_ID_MME_QMAN_ARC0,
1140 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_0] = CPU_ID_TPC_QMAN_ARC0,
1141 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_1] = CPU_ID_TPC_QMAN_ARC0,
1142 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_2] = CPU_ID_TPC_QMAN_ARC0,
1143 [GAUDI2_QUEUE_ID_DCORE0_TPC_0_3] = CPU_ID_TPC_QMAN_ARC0,
1144 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_0] = CPU_ID_TPC_QMAN_ARC1,
1145 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_1] = CPU_ID_TPC_QMAN_ARC1,
1146 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_2] = CPU_ID_TPC_QMAN_ARC1,
1147 [GAUDI2_QUEUE_ID_DCORE0_TPC_1_3] = CPU_ID_TPC_QMAN_ARC1,
1148 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_0] = CPU_ID_TPC_QMAN_ARC2,
1149 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_1] = CPU_ID_TPC_QMAN_ARC2,
1150 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_2] = CPU_ID_TPC_QMAN_ARC2,
1151 [GAUDI2_QUEUE_ID_DCORE0_TPC_2_3] = CPU_ID_TPC_QMAN_ARC2,
1152 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_0] = CPU_ID_TPC_QMAN_ARC3,
1153 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_1] = CPU_ID_TPC_QMAN_ARC3,
1154 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_2] = CPU_ID_TPC_QMAN_ARC3,
1155 [GAUDI2_QUEUE_ID_DCORE0_TPC_3_3] = CPU_ID_TPC_QMAN_ARC3,
1156 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_0] = CPU_ID_TPC_QMAN_ARC4,
1157 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_1] = CPU_ID_TPC_QMAN_ARC4,
1158 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_2] = CPU_ID_TPC_QMAN_ARC4,
1159 [GAUDI2_QUEUE_ID_DCORE0_TPC_4_3] = CPU_ID_TPC_QMAN_ARC4,
1160 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_0] = CPU_ID_TPC_QMAN_ARC5,
1161 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_1] = CPU_ID_TPC_QMAN_ARC5,
1162 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_2] = CPU_ID_TPC_QMAN_ARC5,
1163 [GAUDI2_QUEUE_ID_DCORE0_TPC_5_3] = CPU_ID_TPC_QMAN_ARC5,
1164 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_0] = CPU_ID_TPC_QMAN_ARC24,
1165 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_1] = CPU_ID_TPC_QMAN_ARC24,
1166 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_2] = CPU_ID_TPC_QMAN_ARC24,
1167 [GAUDI2_QUEUE_ID_DCORE0_TPC_6_3] = CPU_ID_TPC_QMAN_ARC24,
1168 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC2,
1169 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC2,
1170 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC2,
1171 [GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC2,
1172 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC3,
1173 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC3,
1174 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC3,
1175 [GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC3,
1176 [GAUDI2_QUEUE_ID_DCORE1_MME_0_0] = CPU_ID_SCHED_ARC4,
1177 [GAUDI2_QUEUE_ID_DCORE1_MME_0_1] = CPU_ID_SCHED_ARC4,
1178 [GAUDI2_QUEUE_ID_DCORE1_MME_0_2] = CPU_ID_SCHED_ARC4,
1179 [GAUDI2_QUEUE_ID_DCORE1_MME_0_3] = CPU_ID_SCHED_ARC4,
1180 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_0] = CPU_ID_TPC_QMAN_ARC6,
1181 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_1] = CPU_ID_TPC_QMAN_ARC6,
1182 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_2] = CPU_ID_TPC_QMAN_ARC6,
1183 [GAUDI2_QUEUE_ID_DCORE1_TPC_0_3] = CPU_ID_TPC_QMAN_ARC6,
1184 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_0] = CPU_ID_TPC_QMAN_ARC7,
1185 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_1] = CPU_ID_TPC_QMAN_ARC7,
1186 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_2] = CPU_ID_TPC_QMAN_ARC7,
1187 [GAUDI2_QUEUE_ID_DCORE1_TPC_1_3] = CPU_ID_TPC_QMAN_ARC7,
1188 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_0] = CPU_ID_TPC_QMAN_ARC8,
1189 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_1] = CPU_ID_TPC_QMAN_ARC8,
1190 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_2] = CPU_ID_TPC_QMAN_ARC8,
1191 [GAUDI2_QUEUE_ID_DCORE1_TPC_2_3] = CPU_ID_TPC_QMAN_ARC8,
1192 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_0] = CPU_ID_TPC_QMAN_ARC9,
1193 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_1] = CPU_ID_TPC_QMAN_ARC9,
1194 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_2] = CPU_ID_TPC_QMAN_ARC9,
1195 [GAUDI2_QUEUE_ID_DCORE1_TPC_3_3] = CPU_ID_TPC_QMAN_ARC9,
1196 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_0] = CPU_ID_TPC_QMAN_ARC10,
1197 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_1] = CPU_ID_TPC_QMAN_ARC10,
1198 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_2] = CPU_ID_TPC_QMAN_ARC10,
1199 [GAUDI2_QUEUE_ID_DCORE1_TPC_4_3] = CPU_ID_TPC_QMAN_ARC10,
1200 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_0] = CPU_ID_TPC_QMAN_ARC11,
1201 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_1] = CPU_ID_TPC_QMAN_ARC11,
1202 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_2] = CPU_ID_TPC_QMAN_ARC11,
1203 [GAUDI2_QUEUE_ID_DCORE1_TPC_5_3] = CPU_ID_TPC_QMAN_ARC11,
1204 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC4,
1205 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC4,
1206 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC4,
1207 [GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC4,
1208 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC5,
1209 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC5,
1210 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC5,
1211 [GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC5,
1212 [GAUDI2_QUEUE_ID_DCORE2_MME_0_0] = CPU_ID_MME_QMAN_ARC1,
1213 [GAUDI2_QUEUE_ID_DCORE2_MME_0_1] = CPU_ID_MME_QMAN_ARC1,
1214 [GAUDI2_QUEUE_ID_DCORE2_MME_0_2] = CPU_ID_MME_QMAN_ARC1,
1215 [GAUDI2_QUEUE_ID_DCORE2_MME_0_3] = CPU_ID_MME_QMAN_ARC1,
1216 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_0] = CPU_ID_TPC_QMAN_ARC12,
1217 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_1] = CPU_ID_TPC_QMAN_ARC12,
1218 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_2] = CPU_ID_TPC_QMAN_ARC12,
1219 [GAUDI2_QUEUE_ID_DCORE2_TPC_0_3] = CPU_ID_TPC_QMAN_ARC12,
1220 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_0] = CPU_ID_TPC_QMAN_ARC13,
1221 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_1] = CPU_ID_TPC_QMAN_ARC13,
1222 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_2] = CPU_ID_TPC_QMAN_ARC13,
1223 [GAUDI2_QUEUE_ID_DCORE2_TPC_1_3] = CPU_ID_TPC_QMAN_ARC13,
1224 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_0] = CPU_ID_TPC_QMAN_ARC14,
1225 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_1] = CPU_ID_TPC_QMAN_ARC14,
1226 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_2] = CPU_ID_TPC_QMAN_ARC14,
1227 [GAUDI2_QUEUE_ID_DCORE2_TPC_2_3] = CPU_ID_TPC_QMAN_ARC14,
1228 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_0] = CPU_ID_TPC_QMAN_ARC15,
1229 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_1] = CPU_ID_TPC_QMAN_ARC15,
1230 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_2] = CPU_ID_TPC_QMAN_ARC15,
1231 [GAUDI2_QUEUE_ID_DCORE2_TPC_3_3] = CPU_ID_TPC_QMAN_ARC15,
1232 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_0] = CPU_ID_TPC_QMAN_ARC16,
1233 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_1] = CPU_ID_TPC_QMAN_ARC16,
1234 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_2] = CPU_ID_TPC_QMAN_ARC16,
1235 [GAUDI2_QUEUE_ID_DCORE2_TPC_4_3] = CPU_ID_TPC_QMAN_ARC16,
1236 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_0] = CPU_ID_TPC_QMAN_ARC17,
1237 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_1] = CPU_ID_TPC_QMAN_ARC17,
1238 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_2] = CPU_ID_TPC_QMAN_ARC17,
1239 [GAUDI2_QUEUE_ID_DCORE2_TPC_5_3] = CPU_ID_TPC_QMAN_ARC17,
1240 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC6,
1241 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC6,
1242 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC6,
1243 [GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC6,
1244 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC7,
1245 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC7,
1246 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC7,
1247 [GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC7,
1248 [GAUDI2_QUEUE_ID_DCORE3_MME_0_0] = CPU_ID_SCHED_ARC5,
1249 [GAUDI2_QUEUE_ID_DCORE3_MME_0_1] = CPU_ID_SCHED_ARC5,
1250 [GAUDI2_QUEUE_ID_DCORE3_MME_0_2] = CPU_ID_SCHED_ARC5,
1251 [GAUDI2_QUEUE_ID_DCORE3_MME_0_3] = CPU_ID_SCHED_ARC5,
1252 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_0] = CPU_ID_TPC_QMAN_ARC18,
1253 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_1] = CPU_ID_TPC_QMAN_ARC18,
1254 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_2] = CPU_ID_TPC_QMAN_ARC18,
1255 [GAUDI2_QUEUE_ID_DCORE3_TPC_0_3] = CPU_ID_TPC_QMAN_ARC18,
1256 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_0] = CPU_ID_TPC_QMAN_ARC19,
1257 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_1] = CPU_ID_TPC_QMAN_ARC19,
1258 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_2] = CPU_ID_TPC_QMAN_ARC19,
1259 [GAUDI2_QUEUE_ID_DCORE3_TPC_1_3] = CPU_ID_TPC_QMAN_ARC19,
1260 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_0] = CPU_ID_TPC_QMAN_ARC20,
1261 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_1] = CPU_ID_TPC_QMAN_ARC20,
1262 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_2] = CPU_ID_TPC_QMAN_ARC20,
1263 [GAUDI2_QUEUE_ID_DCORE3_TPC_2_3] = CPU_ID_TPC_QMAN_ARC20,
1264 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_0] = CPU_ID_TPC_QMAN_ARC21,
1265 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_1] = CPU_ID_TPC_QMAN_ARC21,
1266 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_2] = CPU_ID_TPC_QMAN_ARC21,
1267 [GAUDI2_QUEUE_ID_DCORE3_TPC_3_3] = CPU_ID_TPC_QMAN_ARC21,
1268 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_0] = CPU_ID_TPC_QMAN_ARC22,
1269 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_1] = CPU_ID_TPC_QMAN_ARC22,
1270 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_2] = CPU_ID_TPC_QMAN_ARC22,
1271 [GAUDI2_QUEUE_ID_DCORE3_TPC_4_3] = CPU_ID_TPC_QMAN_ARC22,
1272 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_0] = CPU_ID_TPC_QMAN_ARC23,
1273 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_1] = CPU_ID_TPC_QMAN_ARC23,
1274 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_2] = CPU_ID_TPC_QMAN_ARC23,
1275 [GAUDI2_QUEUE_ID_DCORE3_TPC_5_3] = CPU_ID_TPC_QMAN_ARC23,
1276 [GAUDI2_QUEUE_ID_NIC_0_0] = CPU_ID_NIC_QMAN_ARC0,
1277 [GAUDI2_QUEUE_ID_NIC_0_1] = CPU_ID_NIC_QMAN_ARC0,
1278 [GAUDI2_QUEUE_ID_NIC_0_2] = CPU_ID_NIC_QMAN_ARC0,
1279 [GAUDI2_QUEUE_ID_NIC_0_3] = CPU_ID_NIC_QMAN_ARC0,
1280 [GAUDI2_QUEUE_ID_NIC_1_0] = CPU_ID_NIC_QMAN_ARC1,
1281 [GAUDI2_QUEUE_ID_NIC_1_1] = CPU_ID_NIC_QMAN_ARC1,
1282 [GAUDI2_QUEUE_ID_NIC_1_2] = CPU_ID_NIC_QMAN_ARC1,
1283 [GAUDI2_QUEUE_ID_NIC_1_3] = CPU_ID_NIC_QMAN_ARC1,
1284 [GAUDI2_QUEUE_ID_NIC_2_0] = CPU_ID_NIC_QMAN_ARC2,
1285 [GAUDI2_QUEUE_ID_NIC_2_1] = CPU_ID_NIC_QMAN_ARC2,
1286 [GAUDI2_QUEUE_ID_NIC_2_2] = CPU_ID_NIC_QMAN_ARC2,
1287 [GAUDI2_QUEUE_ID_NIC_2_3] = CPU_ID_NIC_QMAN_ARC2,
1288 [GAUDI2_QUEUE_ID_NIC_3_0] = CPU_ID_NIC_QMAN_ARC3,
1289 [GAUDI2_QUEUE_ID_NIC_3_1] = CPU_ID_NIC_QMAN_ARC3,
1290 [GAUDI2_QUEUE_ID_NIC_3_2] = CPU_ID_NIC_QMAN_ARC3,
1291 [GAUDI2_QUEUE_ID_NIC_3_3] = CPU_ID_NIC_QMAN_ARC3,
1292 [GAUDI2_QUEUE_ID_NIC_4_0] = CPU_ID_NIC_QMAN_ARC4,
1293 [GAUDI2_QUEUE_ID_NIC_4_1] = CPU_ID_NIC_QMAN_ARC4,
1294 [GAUDI2_QUEUE_ID_NIC_4_2] = CPU_ID_NIC_QMAN_ARC4,
1295 [GAUDI2_QUEUE_ID_NIC_4_3] = CPU_ID_NIC_QMAN_ARC4,
1296 [GAUDI2_QUEUE_ID_NIC_5_0] = CPU_ID_NIC_QMAN_ARC5,
1297 [GAUDI2_QUEUE_ID_NIC_5_1] = CPU_ID_NIC_QMAN_ARC5,
1298 [GAUDI2_QUEUE_ID_NIC_5_2] = CPU_ID_NIC_QMAN_ARC5,
1299 [GAUDI2_QUEUE_ID_NIC_5_3] = CPU_ID_NIC_QMAN_ARC5,
1300 [GAUDI2_QUEUE_ID_NIC_6_0] = CPU_ID_NIC_QMAN_ARC6,
1301 [GAUDI2_QUEUE_ID_NIC_6_1] = CPU_ID_NIC_QMAN_ARC6,
1302 [GAUDI2_QUEUE_ID_NIC_6_2] = CPU_ID_NIC_QMAN_ARC6,
1303 [GAUDI2_QUEUE_ID_NIC_6_3] = CPU_ID_NIC_QMAN_ARC6,
1304 [GAUDI2_QUEUE_ID_NIC_7_0] = CPU_ID_NIC_QMAN_ARC7,
1305 [GAUDI2_QUEUE_ID_NIC_7_1] = CPU_ID_NIC_QMAN_ARC7,
1306 [GAUDI2_QUEUE_ID_NIC_7_2] = CPU_ID_NIC_QMAN_ARC7,
1307 [GAUDI2_QUEUE_ID_NIC_7_3] = CPU_ID_NIC_QMAN_ARC7,
1308 [GAUDI2_QUEUE_ID_NIC_8_0] = CPU_ID_NIC_QMAN_ARC8,
1309 [GAUDI2_QUEUE_ID_NIC_8_1] = CPU_ID_NIC_QMAN_ARC8,
1310 [GAUDI2_QUEUE_ID_NIC_8_2] = CPU_ID_NIC_QMAN_ARC8,
1311 [GAUDI2_QUEUE_ID_NIC_8_3] = CPU_ID_NIC_QMAN_ARC8,
1312 [GAUDI2_QUEUE_ID_NIC_9_0] = CPU_ID_NIC_QMAN_ARC9,
1313 [GAUDI2_QUEUE_ID_NIC_9_1] = CPU_ID_NIC_QMAN_ARC9,
1314 [GAUDI2_QUEUE_ID_NIC_9_2] = CPU_ID_NIC_QMAN_ARC9,
1315 [GAUDI2_QUEUE_ID_NIC_9_3] = CPU_ID_NIC_QMAN_ARC9,
1316 [GAUDI2_QUEUE_ID_NIC_10_0] = CPU_ID_NIC_QMAN_ARC10,
1317 [GAUDI2_QUEUE_ID_NIC_10_1] = CPU_ID_NIC_QMAN_ARC10,
1318 [GAUDI2_QUEUE_ID_NIC_10_2] = CPU_ID_NIC_QMAN_ARC10,
1319 [GAUDI2_QUEUE_ID_NIC_10_3] = CPU_ID_NIC_QMAN_ARC10,
1320 [GAUDI2_QUEUE_ID_NIC_11_0] = CPU_ID_NIC_QMAN_ARC11,
1321 [GAUDI2_QUEUE_ID_NIC_11_1] = CPU_ID_NIC_QMAN_ARC11,
1322 [GAUDI2_QUEUE_ID_NIC_11_2] = CPU_ID_NIC_QMAN_ARC11,
1323 [GAUDI2_QUEUE_ID_NIC_11_3] = CPU_ID_NIC_QMAN_ARC11,
1324 [GAUDI2_QUEUE_ID_NIC_12_0] = CPU_ID_NIC_QMAN_ARC12,
1325 [GAUDI2_QUEUE_ID_NIC_12_1] = CPU_ID_NIC_QMAN_ARC12,
1326 [GAUDI2_QUEUE_ID_NIC_12_2] = CPU_ID_NIC_QMAN_ARC12,
1327 [GAUDI2_QUEUE_ID_NIC_12_3] = CPU_ID_NIC_QMAN_ARC12,
1328 [GAUDI2_QUEUE_ID_NIC_13_0] = CPU_ID_NIC_QMAN_ARC13,
1329 [GAUDI2_QUEUE_ID_NIC_13_1] = CPU_ID_NIC_QMAN_ARC13,
1330 [GAUDI2_QUEUE_ID_NIC_13_2] = CPU_ID_NIC_QMAN_ARC13,
1331 [GAUDI2_QUEUE_ID_NIC_13_3] = CPU_ID_NIC_QMAN_ARC13,
1332 [GAUDI2_QUEUE_ID_NIC_14_0] = CPU_ID_NIC_QMAN_ARC14,
1333 [GAUDI2_QUEUE_ID_NIC_14_1] = CPU_ID_NIC_QMAN_ARC14,
1334 [GAUDI2_QUEUE_ID_NIC_14_2] = CPU_ID_NIC_QMAN_ARC14,
1335 [GAUDI2_QUEUE_ID_NIC_14_3] = CPU_ID_NIC_QMAN_ARC14,
1336 [GAUDI2_QUEUE_ID_NIC_15_0] = CPU_ID_NIC_QMAN_ARC15,
1337 [GAUDI2_QUEUE_ID_NIC_15_1] = CPU_ID_NIC_QMAN_ARC15,
1338 [GAUDI2_QUEUE_ID_NIC_15_2] = CPU_ID_NIC_QMAN_ARC15,
1339 [GAUDI2_QUEUE_ID_NIC_15_3] = CPU_ID_NIC_QMAN_ARC15,
1340 [GAUDI2_QUEUE_ID_NIC_16_0] = CPU_ID_NIC_QMAN_ARC16,
1341 [GAUDI2_QUEUE_ID_NIC_16_1] = CPU_ID_NIC_QMAN_ARC16,
1342 [GAUDI2_QUEUE_ID_NIC_16_2] = CPU_ID_NIC_QMAN_ARC16,
1343 [GAUDI2_QUEUE_ID_NIC_16_3] = CPU_ID_NIC_QMAN_ARC16,
1344 [GAUDI2_QUEUE_ID_NIC_17_0] = CPU_ID_NIC_QMAN_ARC17,
1345 [GAUDI2_QUEUE_ID_NIC_17_1] = CPU_ID_NIC_QMAN_ARC17,
1346 [GAUDI2_QUEUE_ID_NIC_17_2] = CPU_ID_NIC_QMAN_ARC17,
1347 [GAUDI2_QUEUE_ID_NIC_17_3] = CPU_ID_NIC_QMAN_ARC17,
1348 [GAUDI2_QUEUE_ID_NIC_18_0] = CPU_ID_NIC_QMAN_ARC18,
1349 [GAUDI2_QUEUE_ID_NIC_18_1] = CPU_ID_NIC_QMAN_ARC18,
1350 [GAUDI2_QUEUE_ID_NIC_18_2] = CPU_ID_NIC_QMAN_ARC18,
1351 [GAUDI2_QUEUE_ID_NIC_18_3] = CPU_ID_NIC_QMAN_ARC18,
1352 [GAUDI2_QUEUE_ID_NIC_19_0] = CPU_ID_NIC_QMAN_ARC19,
1353 [GAUDI2_QUEUE_ID_NIC_19_1] = CPU_ID_NIC_QMAN_ARC19,
1354 [GAUDI2_QUEUE_ID_NIC_19_2] = CPU_ID_NIC_QMAN_ARC19,
1355 [GAUDI2_QUEUE_ID_NIC_19_3] = CPU_ID_NIC_QMAN_ARC19,
1356 [GAUDI2_QUEUE_ID_NIC_20_0] = CPU_ID_NIC_QMAN_ARC20,
1357 [GAUDI2_QUEUE_ID_NIC_20_1] = CPU_ID_NIC_QMAN_ARC20,
1358 [GAUDI2_QUEUE_ID_NIC_20_2] = CPU_ID_NIC_QMAN_ARC20,
1359 [GAUDI2_QUEUE_ID_NIC_20_3] = CPU_ID_NIC_QMAN_ARC20,
1360 [GAUDI2_QUEUE_ID_NIC_21_0] = CPU_ID_NIC_QMAN_ARC21,
1361 [GAUDI2_QUEUE_ID_NIC_21_1] = CPU_ID_NIC_QMAN_ARC21,
1362 [GAUDI2_QUEUE_ID_NIC_21_2] = CPU_ID_NIC_QMAN_ARC21,
1363 [GAUDI2_QUEUE_ID_NIC_21_3] = CPU_ID_NIC_QMAN_ARC21,
1364 [GAUDI2_QUEUE_ID_NIC_22_0] = CPU_ID_NIC_QMAN_ARC22,
1365 [GAUDI2_QUEUE_ID_NIC_22_1] = CPU_ID_NIC_QMAN_ARC22,
1366 [GAUDI2_QUEUE_ID_NIC_22_2] = CPU_ID_NIC_QMAN_ARC22,
1367 [GAUDI2_QUEUE_ID_NIC_22_3] = CPU_ID_NIC_QMAN_ARC22,
1368 [GAUDI2_QUEUE_ID_NIC_23_0] = CPU_ID_NIC_QMAN_ARC23,
1369 [GAUDI2_QUEUE_ID_NIC_23_1] = CPU_ID_NIC_QMAN_ARC23,
1370 [GAUDI2_QUEUE_ID_NIC_23_2] = CPU_ID_NIC_QMAN_ARC23,
1371 [GAUDI2_QUEUE_ID_NIC_23_3] = CPU_ID_NIC_QMAN_ARC23,
1372 [GAUDI2_QUEUE_ID_ROT_0_0] = CPU_ID_ROT_QMAN_ARC0,
1373 [GAUDI2_QUEUE_ID_ROT_0_1] = CPU_ID_ROT_QMAN_ARC0,
1374 [GAUDI2_QUEUE_ID_ROT_0_2] = CPU_ID_ROT_QMAN_ARC0,
1375 [GAUDI2_QUEUE_ID_ROT_0_3] = CPU_ID_ROT_QMAN_ARC0,
1376 [GAUDI2_QUEUE_ID_ROT_1_0] = CPU_ID_ROT_QMAN_ARC1,
1377 [GAUDI2_QUEUE_ID_ROT_1_1] = CPU_ID_ROT_QMAN_ARC1,
1378 [GAUDI2_QUEUE_ID_ROT_1_2] = CPU_ID_ROT_QMAN_ARC1,
1379 [GAUDI2_QUEUE_ID_ROT_1_3] = CPU_ID_ROT_QMAN_ARC1
1380 };
1381
1382 const u32 gaudi2_dma_core_blocks_bases[DMA_CORE_ID_SIZE] = {
1383 [DMA_CORE_ID_PDMA0] = mmPDMA0_CORE_BASE,
1384 [DMA_CORE_ID_PDMA1] = mmPDMA1_CORE_BASE,
1385 [DMA_CORE_ID_EDMA0] = mmDCORE0_EDMA0_CORE_BASE,
1386 [DMA_CORE_ID_EDMA1] = mmDCORE0_EDMA1_CORE_BASE,
1387 [DMA_CORE_ID_EDMA2] = mmDCORE1_EDMA0_CORE_BASE,
1388 [DMA_CORE_ID_EDMA3] = mmDCORE1_EDMA1_CORE_BASE,
1389 [DMA_CORE_ID_EDMA4] = mmDCORE2_EDMA0_CORE_BASE,
1390 [DMA_CORE_ID_EDMA5] = mmDCORE2_EDMA1_CORE_BASE,
1391 [DMA_CORE_ID_EDMA6] = mmDCORE3_EDMA0_CORE_BASE,
1392 [DMA_CORE_ID_EDMA7] = mmDCORE3_EDMA1_CORE_BASE,
1393 [DMA_CORE_ID_KDMA] = mmARC_FARM_KDMA_BASE
1394 };
1395
1396 const u32 gaudi2_mme_acc_blocks_bases[MME_ID_SIZE] = {
1397 [MME_ID_DCORE0] = mmDCORE0_MME_ACC_BASE,
1398 [MME_ID_DCORE1] = mmDCORE1_MME_ACC_BASE,
1399 [MME_ID_DCORE2] = mmDCORE2_MME_ACC_BASE,
1400 [MME_ID_DCORE3] = mmDCORE3_MME_ACC_BASE
1401 };
1402
1403 static const u32 gaudi2_tpc_cfg_blocks_bases[TPC_ID_SIZE] = {
1404 [TPC_ID_DCORE0_TPC0] = mmDCORE0_TPC0_CFG_BASE,
1405 [TPC_ID_DCORE0_TPC1] = mmDCORE0_TPC1_CFG_BASE,
1406 [TPC_ID_DCORE0_TPC2] = mmDCORE0_TPC2_CFG_BASE,
1407 [TPC_ID_DCORE0_TPC3] = mmDCORE0_TPC3_CFG_BASE,
1408 [TPC_ID_DCORE0_TPC4] = mmDCORE0_TPC4_CFG_BASE,
1409 [TPC_ID_DCORE0_TPC5] = mmDCORE0_TPC5_CFG_BASE,
1410 [TPC_ID_DCORE1_TPC0] = mmDCORE1_TPC0_CFG_BASE,
1411 [TPC_ID_DCORE1_TPC1] = mmDCORE1_TPC1_CFG_BASE,
1412 [TPC_ID_DCORE1_TPC2] = mmDCORE1_TPC2_CFG_BASE,
1413 [TPC_ID_DCORE1_TPC3] = mmDCORE1_TPC3_CFG_BASE,
1414 [TPC_ID_DCORE1_TPC4] = mmDCORE1_TPC4_CFG_BASE,
1415 [TPC_ID_DCORE1_TPC5] = mmDCORE1_TPC5_CFG_BASE,
1416 [TPC_ID_DCORE2_TPC0] = mmDCORE2_TPC0_CFG_BASE,
1417 [TPC_ID_DCORE2_TPC1] = mmDCORE2_TPC1_CFG_BASE,
1418 [TPC_ID_DCORE2_TPC2] = mmDCORE2_TPC2_CFG_BASE,
1419 [TPC_ID_DCORE2_TPC3] = mmDCORE2_TPC3_CFG_BASE,
1420 [TPC_ID_DCORE2_TPC4] = mmDCORE2_TPC4_CFG_BASE,
1421 [TPC_ID_DCORE2_TPC5] = mmDCORE2_TPC5_CFG_BASE,
1422 [TPC_ID_DCORE3_TPC0] = mmDCORE3_TPC0_CFG_BASE,
1423 [TPC_ID_DCORE3_TPC1] = mmDCORE3_TPC1_CFG_BASE,
1424 [TPC_ID_DCORE3_TPC2] = mmDCORE3_TPC2_CFG_BASE,
1425 [TPC_ID_DCORE3_TPC3] = mmDCORE3_TPC3_CFG_BASE,
1426 [TPC_ID_DCORE3_TPC4] = mmDCORE3_TPC4_CFG_BASE,
1427 [TPC_ID_DCORE3_TPC5] = mmDCORE3_TPC5_CFG_BASE,
1428 [TPC_ID_DCORE0_TPC6] = mmDCORE0_TPC6_CFG_BASE,
1429 };
1430
1431 const u32 gaudi2_rot_blocks_bases[ROTATOR_ID_SIZE] = {
1432 [ROTATOR_ID_0] = mmROT0_BASE,
1433 [ROTATOR_ID_1] = mmROT1_BASE
1434 };
1435
1436 static const u32 gaudi2_tpc_id_to_queue_id[TPC_ID_SIZE] = {
1437 [TPC_ID_DCORE0_TPC0] = GAUDI2_QUEUE_ID_DCORE0_TPC_0_0,
1438 [TPC_ID_DCORE0_TPC1] = GAUDI2_QUEUE_ID_DCORE0_TPC_1_0,
1439 [TPC_ID_DCORE0_TPC2] = GAUDI2_QUEUE_ID_DCORE0_TPC_2_0,
1440 [TPC_ID_DCORE0_TPC3] = GAUDI2_QUEUE_ID_DCORE0_TPC_3_0,
1441 [TPC_ID_DCORE0_TPC4] = GAUDI2_QUEUE_ID_DCORE0_TPC_4_0,
1442 [TPC_ID_DCORE0_TPC5] = GAUDI2_QUEUE_ID_DCORE0_TPC_5_0,
1443 [TPC_ID_DCORE1_TPC0] = GAUDI2_QUEUE_ID_DCORE1_TPC_0_0,
1444 [TPC_ID_DCORE1_TPC1] = GAUDI2_QUEUE_ID_DCORE1_TPC_1_0,
1445 [TPC_ID_DCORE1_TPC2] = GAUDI2_QUEUE_ID_DCORE1_TPC_2_0,
1446 [TPC_ID_DCORE1_TPC3] = GAUDI2_QUEUE_ID_DCORE1_TPC_3_0,
1447 [TPC_ID_DCORE1_TPC4] = GAUDI2_QUEUE_ID_DCORE1_TPC_4_0,
1448 [TPC_ID_DCORE1_TPC5] = GAUDI2_QUEUE_ID_DCORE1_TPC_5_0,
1449 [TPC_ID_DCORE2_TPC0] = GAUDI2_QUEUE_ID_DCORE2_TPC_0_0,
1450 [TPC_ID_DCORE2_TPC1] = GAUDI2_QUEUE_ID_DCORE2_TPC_1_0,
1451 [TPC_ID_DCORE2_TPC2] = GAUDI2_QUEUE_ID_DCORE2_TPC_2_0,
1452 [TPC_ID_DCORE2_TPC3] = GAUDI2_QUEUE_ID_DCORE2_TPC_3_0,
1453 [TPC_ID_DCORE2_TPC4] = GAUDI2_QUEUE_ID_DCORE2_TPC_4_0,
1454 [TPC_ID_DCORE2_TPC5] = GAUDI2_QUEUE_ID_DCORE2_TPC_5_0,
1455 [TPC_ID_DCORE3_TPC0] = GAUDI2_QUEUE_ID_DCORE3_TPC_0_0,
1456 [TPC_ID_DCORE3_TPC1] = GAUDI2_QUEUE_ID_DCORE3_TPC_1_0,
1457 [TPC_ID_DCORE3_TPC2] = GAUDI2_QUEUE_ID_DCORE3_TPC_2_0,
1458 [TPC_ID_DCORE3_TPC3] = GAUDI2_QUEUE_ID_DCORE3_TPC_3_0,
1459 [TPC_ID_DCORE3_TPC4] = GAUDI2_QUEUE_ID_DCORE3_TPC_4_0,
1460 [TPC_ID_DCORE3_TPC5] = GAUDI2_QUEUE_ID_DCORE3_TPC_5_0,
1461 [TPC_ID_DCORE0_TPC6] = GAUDI2_QUEUE_ID_DCORE0_TPC_6_0,
1462 };
1463
1464 static const u32 gaudi2_rot_id_to_queue_id[ROTATOR_ID_SIZE] = {
1465 [ROTATOR_ID_0] = GAUDI2_QUEUE_ID_ROT_0_0,
1466 [ROTATOR_ID_1] = GAUDI2_QUEUE_ID_ROT_1_0,
1467 };
1468
1469 const u32 edma_stream_base[NUM_OF_EDMA_PER_DCORE * NUM_OF_DCORES] = {
1470 GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0,
1471 GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0,
1472 GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0,
1473 GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0,
1474 GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0,
1475 GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0,
1476 GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0,
1477 GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0,
1478 };
1479
1480 static const char gaudi2_vdec_irq_name[GAUDI2_VDEC_MSIX_ENTRIES][GAUDI2_MAX_STRING_LEN] = {
1481 "gaudi2 vdec 0_0", "gaudi2 vdec 0_0 abnormal",
1482 "gaudi2 vdec 0_1", "gaudi2 vdec 0_1 abnormal",
1483 "gaudi2 vdec 1_0", "gaudi2 vdec 1_0 abnormal",
1484 "gaudi2 vdec 1_1", "gaudi2 vdec 1_1 abnormal",
1485 "gaudi2 vdec 2_0", "gaudi2 vdec 2_0 abnormal",
1486 "gaudi2 vdec 2_1", "gaudi2 vdec 2_1 abnormal",
1487 "gaudi2 vdec 3_0", "gaudi2 vdec 3_0 abnormal",
1488 "gaudi2 vdec 3_1", "gaudi2 vdec 3_1 abnormal",
1489 "gaudi2 vdec s_0", "gaudi2 vdec s_0 abnormal",
1490 "gaudi2 vdec s_1", "gaudi2 vdec s_1 abnormal"
1491 };
1492
1493 static const u32 rtr_coordinates_to_rtr_id[NUM_OF_RTR_PER_DCORE * NUM_OF_DCORES] = {
1494 RTR_ID_X_Y(2, 4),
1495 RTR_ID_X_Y(3, 4),
1496 RTR_ID_X_Y(4, 4),
1497 RTR_ID_X_Y(5, 4),
1498 RTR_ID_X_Y(6, 4),
1499 RTR_ID_X_Y(7, 4),
1500 RTR_ID_X_Y(8, 4),
1501 RTR_ID_X_Y(9, 4),
1502 RTR_ID_X_Y(10, 4),
1503 RTR_ID_X_Y(11, 4),
1504 RTR_ID_X_Y(12, 4),
1505 RTR_ID_X_Y(13, 4),
1506 RTR_ID_X_Y(14, 4),
1507 RTR_ID_X_Y(15, 4),
1508 RTR_ID_X_Y(16, 4),
1509 RTR_ID_X_Y(17, 4),
1510 RTR_ID_X_Y(2, 11),
1511 RTR_ID_X_Y(3, 11),
1512 RTR_ID_X_Y(4, 11),
1513 RTR_ID_X_Y(5, 11),
1514 RTR_ID_X_Y(6, 11),
1515 RTR_ID_X_Y(7, 11),
1516 RTR_ID_X_Y(8, 11),
1517 RTR_ID_X_Y(9, 11),
1518 RTR_ID_X_Y(0, 0),
1519 RTR_ID_X_Y(0, 0),
1520 RTR_ID_X_Y(0, 0),
1521 RTR_ID_X_Y(0, 0),
1522 RTR_ID_X_Y(14, 11),
1523 RTR_ID_X_Y(15, 11),
1524 RTR_ID_X_Y(16, 11),
1525 RTR_ID_X_Y(17, 11)
1526 };
1527
1528 static const u32 gaudi2_tpc_initiator_rtr_id[NUM_OF_TPC_PER_DCORE * NUM_OF_DCORES + 1] = {
1529 1, 1, 2, 2, 3, 3, 14, 14, 13, 13, 12, 12, 19, 19, 18, 18, 17,
1530 17, 28, 28, 29, 29, 30, 30, 0
1531 };
1532
1533 static const u32 gaudi2_dec_initiator_rtr_id[NUMBER_OF_DEC] = {
1534 0, 0, 15, 15, 16, 16, 31, 31, 0, 0
1535 };
1536
1537 static const u32 gaudi2_nic_initiator_rtr_id[NIC_NUMBER_OF_MACROS] = {
1538 15, 15, 15, 15, 15, 16, 16, 16, 16, 31, 31, 31
1539 };
1540
1541 struct sft_info {
1542 u8 interface_id;
1543 u8 dcore_id;
1544 };
1545
1546 static const struct sft_info gaudi2_edma_initiator_sft_id[NUM_OF_EDMA_PER_DCORE * NUM_OF_DCORES] = {
1547 {0, 0}, {1, 0}, {0, 1}, {1, 1}, {1, 2}, {1, 3}, {0, 2}, {0, 3},
1548 };
1549
1550 static const u32 gaudi2_pdma_initiator_rtr_id[NUM_OF_PDMA] = {
1551 0, 0
1552 };
1553
1554 static const u32 gaudi2_rot_initiator_rtr_id[NUM_OF_ROT] = {
1555 16, 31
1556 };
1557
1558 struct mme_initiators_rtr_id {
1559 u32 wap0;
1560 u32 wap1;
1561 u32 write;
1562 u32 read;
1563 u32 sbte0;
1564 u32 sbte1;
1565 u32 sbte2;
1566 u32 sbte3;
1567 u32 sbte4;
1568 };
1569
1570 enum mme_initiators {
1571 MME_WAP0 = 0,
1572 MME_WAP1,
1573 MME_WRITE,
1574 MME_READ,
1575 MME_SBTE0,
1576 MME_SBTE1,
1577 MME_SBTE2,
1578 MME_SBTE3,
1579 MME_SBTE4,
1580 MME_INITIATORS_MAX
1581 };
1582
1583 static const struct mme_initiators_rtr_id
1584 gaudi2_mme_initiator_rtr_id[NUM_OF_MME_PER_DCORE * NUM_OF_DCORES] = {
1585 { .wap0 = 5, .wap1 = 7, .write = 6, .read = 7,
1586 .sbte0 = 7, .sbte1 = 4, .sbte2 = 4, .sbte3 = 5, .sbte4 = 6},
1587 { .wap0 = 10, .wap1 = 8, .write = 9, .read = 8,
1588 .sbte0 = 11, .sbte1 = 11, .sbte2 = 10, .sbte3 = 9, .sbte4 = 8},
1589 { .wap0 = 21, .wap1 = 23, .write = 22, .read = 23,
1590 .sbte0 = 20, .sbte1 = 20, .sbte2 = 21, .sbte3 = 22, .sbte4 = 23},
1591 { .wap0 = 30, .wap1 = 28, .write = 29, .read = 30,
1592 .sbte0 = 31, .sbte1 = 31, .sbte2 = 30, .sbte3 = 29, .sbte4 = 28},
1593 };
1594
1595 enum razwi_event_sources {
1596 RAZWI_TPC,
1597 RAZWI_MME,
1598 RAZWI_EDMA,
1599 RAZWI_PDMA,
1600 RAZWI_NIC,
1601 RAZWI_DEC,
1602 RAZWI_ROT
1603 };
1604
1605 struct hbm_mc_error_causes {
1606 u32 mask;
1607 char cause[50];
1608 };
1609
1610 static struct hbm_mc_error_causes hbm_mc_spi[GAUDI2_NUM_OF_HBM_MC_SPI_CAUSE] = {
1611 {HBM_MC_SPI_TEMP_PIN_CHG_MASK, "temperature pins changed"},
1612 {HBM_MC_SPI_THR_ENG_MASK, "temperature-based throttling engaged"},
1613 {HBM_MC_SPI_THR_DIS_ENG_MASK, "temperature-based throttling disengaged"},
1614 {HBM_MC_SPI_IEEE1500_COMP_MASK, "IEEE1500 op comp"},
1615 {HBM_MC_SPI_IEEE1500_PAUSED_MASK, "IEEE1500 op paused"},
1616 };
1617
1618 static const char * const hbm_mc_sei_cause[GAUDI2_NUM_OF_HBM_SEI_CAUSE] = {
1619 [HBM_SEI_CMD_PARITY_EVEN] = "SEI C/A parity even",
1620 [HBM_SEI_CMD_PARITY_ODD] = "SEI C/A parity odd",
1621 [HBM_SEI_READ_ERR] = "SEI read data error",
1622 [HBM_SEI_WRITE_DATA_PARITY_ERR] = "SEI write data parity error",
1623 [HBM_SEI_CATTRIP] = "SEI CATTRIP asserted",
1624 [HBM_SEI_MEM_BIST_FAIL] = "SEI memory BIST fail",
1625 [HBM_SEI_DFI] = "SEI DFI error",
1626 [HBM_SEI_INV_TEMP_READ_OUT] = "SEI invalid temp read",
1627 [HBM_SEI_BIST_FAIL] = "SEI BIST fail"
1628 };
1629
1630 struct mmu_spi_sei_cause {
1631 char cause[50];
1632 int clear_bit;
1633 };
1634
1635 static const struct mmu_spi_sei_cause gaudi2_mmu_spi_sei[GAUDI2_NUM_OF_MMU_SPI_SEI_CAUSE] = {
1636 {"page fault", 1},
1637 {"page access", 1},
1638 {"bypass ddr", 2},
1639 {"multi hit", 2},
1640 {"mmu rei0", -1},
1641 {"mmu rei1", -1},
1642 {"stlb rei0", -1},
1643 {"stlb rei1", -1},
1644 {"rr privileged write hit", 2},
1645 {"rr privileged read hit", 2},
1646 {"rr secure write hit", 2},
1647 {"rr secure read hit", 2},
1648 {"bist_fail no use", 2},
1649 {"bist_fail no use", 2},
1650 {"bist_fail no use", 2},
1651 {"bist_fail no use", 2},
1652 {"slave error", 16},
1653 {"dec error", 17},
1654 {"burst fifo full", 2}
1655 };
1656
1657 struct gaudi2_cache_invld_params {
1658 u64 start_va;
1659 u64 end_va;
1660 u32 inv_start_val;
1661 u32 flags;
1662 bool range_invalidation;
1663 };
1664
1665 struct gaudi2_tpc_idle_data {
1666 struct seq_file *s;
1667 unsigned long *mask;
1668 bool *is_idle;
1669 const char *tpc_fmt;
1670 };
1671
1672 struct gaudi2_tpc_mmu_data {
1673 u32 rw_asid;
1674 };
1675
1676 static s64 gaudi2_state_dump_specs_props[SP_MAX] = {0};
1677
1678 static int gaudi2_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size, u64 val);
1679 static bool gaudi2_is_queue_enabled(struct hl_device *hdev, u32 hw_queue_id);
1680 static bool gaudi2_is_arc_enabled(struct hl_device *hdev, u64 arc_id);
1681 static void gaudi2_clr_arc_id_cap(struct hl_device *hdev, u64 arc_id);
1682 static void gaudi2_set_arc_id_cap(struct hl_device *hdev, u64 arc_id);
1683 static void gaudi2_memset_device_lbw(struct hl_device *hdev, u32 addr, u32 size, u32 val);
1684 static int gaudi2_send_job_to_kdma(struct hl_device *hdev, u64 src_addr, u64 dst_addr, u32 size,
1685 bool is_memset);
1686 static u64 gaudi2_mmu_scramble_addr(struct hl_device *hdev, u64 raw_addr);
1687
1688 static void gaudi2_init_scrambler_hbm(struct hl_device *hdev)
1689 {
1690
1691 }
1692
1693 static u32 gaudi2_get_signal_cb_size(struct hl_device *hdev)
1694 {
1695 return sizeof(struct packet_msg_short);
1696 }
1697
1698 static u32 gaudi2_get_wait_cb_size(struct hl_device *hdev)
1699 {
1700 return sizeof(struct packet_msg_short) * 4 + sizeof(struct packet_fence);
1701 }
1702
1703 void gaudi2_iterate_tpcs(struct hl_device *hdev, struct iterate_module_ctx *ctx)
1704 {
1705 struct asic_fixed_properties *prop = &hdev->asic_prop;
1706 int dcore, inst, tpc_seq;
1707 u32 offset;
1708
1709 for (dcore = 0; dcore < NUM_OF_DCORES; dcore++) {
1710 for (inst = 0; inst < NUM_OF_TPC_PER_DCORE; inst++) {
1711 tpc_seq = dcore * NUM_OF_TPC_PER_DCORE + inst;
1712
1713 if (!(prop->tpc_enabled_mask & BIT(tpc_seq)))
1714 continue;
1715
1716 offset = (DCORE_OFFSET * dcore) + (DCORE_TPC_OFFSET * inst);
1717
1718 ctx->fn(hdev, dcore, inst, offset, ctx->data);
1719 }
1720 }
1721
1722 if (!(prop->tpc_enabled_mask & BIT(TPC_ID_DCORE0_TPC6)))
1723 return;
1724
1725
1726 offset = DCORE_TPC_OFFSET * (NUM_DCORE0_TPC - 1);
1727 ctx->fn(hdev, 0, NUM_DCORE0_TPC - 1, offset, ctx->data);
1728 }
1729
1730 static bool gaudi2_host_phys_addr_valid(u64 addr)
1731 {
1732 if ((addr < HOST_PHYS_BASE_0 + HOST_PHYS_SIZE_0) || (addr >= HOST_PHYS_BASE_1))
1733 return true;
1734
1735 return false;
1736 }
1737
1738 static int set_number_of_functional_hbms(struct hl_device *hdev)
1739 {
1740 struct asic_fixed_properties *prop = &hdev->asic_prop;
1741 u8 faulty_hbms = hweight64(hdev->dram_binning);
1742
1743
1744 if (!faulty_hbms) {
1745 dev_dbg(hdev->dev, "All HBM are in use (no binning)\n");
1746 prop->num_functional_hbms = GAUDI2_HBM_NUM;
1747 return 0;
1748 }
1749
1750
1751
1752
1753
1754
1755
1756 if (faulty_hbms > MAX_FAULTY_HBMS) {
1757 dev_err(hdev->dev,
1758 "HBM binning supports max of %d faulty HBMs, supplied mask 0x%llx.\n",
1759 MAX_FAULTY_HBMS, hdev->dram_binning);
1760 return -EINVAL;
1761 }
1762
1763
1764
1765
1766
1767 prop->num_functional_hbms = GAUDI2_HBM_NUM - faulty_hbms;
1768 return 0;
1769 }
1770
1771 static int gaudi2_set_dram_properties(struct hl_device *hdev)
1772 {
1773 struct asic_fixed_properties *prop = &hdev->asic_prop;
1774 u32 basic_hbm_page_size;
1775 int rc;
1776
1777 rc = set_number_of_functional_hbms(hdev);
1778 if (rc)
1779 return -EINVAL;
1780
1781
1782
1783
1784
1785
1786 basic_hbm_page_size = prop->num_functional_hbms * SZ_8M;
1787 prop->dram_page_size = GAUDI2_COMPENSATE_TLB_PAGE_SIZE_FACTOR * basic_hbm_page_size;
1788 prop->device_mem_alloc_default_page_size = prop->dram_page_size;
1789 prop->dram_size = prop->num_functional_hbms * SZ_16G;
1790 prop->dram_base_address = DRAM_PHYS_BASE;
1791 prop->dram_end_address = prop->dram_base_address + prop->dram_size;
1792 prop->dram_supports_virtual_memory = true;
1793
1794 prop->dram_user_base_address = DRAM_PHYS_BASE + prop->dram_page_size;
1795 prop->dram_hints_align_mask = ~GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK;
1796 prop->hints_dram_reserved_va_range.start_addr = RESERVED_VA_RANGE_FOR_ARC_ON_HBM_START;
1797 prop->hints_dram_reserved_va_range.end_addr = RESERVED_VA_RANGE_FOR_ARC_ON_HBM_END;
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816 prop->dmmu.start_addr = prop->dram_base_address +
1817 (prop->dram_page_size *
1818 DIV_ROUND_UP_SECTOR_T(prop->dram_size, prop->dram_page_size));
1819
1820 prop->dmmu.end_addr = prop->dmmu.start_addr + prop->dram_page_size *
1821 div_u64((VA_HBM_SPACE_END - prop->dmmu.start_addr), prop->dmmu.page_size);
1822
1823 return 0;
1824 }
1825
1826 static int gaudi2_set_fixed_properties(struct hl_device *hdev)
1827 {
1828 struct asic_fixed_properties *prop = &hdev->asic_prop;
1829 struct hw_queue_properties *q_props;
1830 u32 num_sync_stream_queues = 0;
1831 int i;
1832
1833 prop->max_queues = GAUDI2_QUEUE_ID_SIZE;
1834 prop->hw_queues_props = kcalloc(prop->max_queues, sizeof(struct hw_queue_properties),
1835 GFP_KERNEL);
1836
1837 if (!prop->hw_queues_props)
1838 return -ENOMEM;
1839
1840 q_props = prop->hw_queues_props;
1841
1842 for (i = 0 ; i < GAUDI2_QUEUE_ID_CPU_PQ ; i++) {
1843 q_props[i].type = QUEUE_TYPE_HW;
1844 q_props[i].driver_only = 0;
1845
1846 if (i >= GAUDI2_QUEUE_ID_NIC_0_0 && i <= GAUDI2_QUEUE_ID_NIC_23_3) {
1847 q_props[i].supports_sync_stream = 0;
1848 } else {
1849 q_props[i].supports_sync_stream = 1;
1850 num_sync_stream_queues++;
1851 }
1852
1853 q_props[i].cb_alloc_flags = CB_ALLOC_USER;
1854 }
1855
1856 q_props[GAUDI2_QUEUE_ID_CPU_PQ].type = QUEUE_TYPE_CPU;
1857 q_props[GAUDI2_QUEUE_ID_CPU_PQ].driver_only = 1;
1858 q_props[GAUDI2_QUEUE_ID_CPU_PQ].cb_alloc_flags = CB_ALLOC_KERNEL;
1859
1860 prop->cache_line_size = DEVICE_CACHE_LINE_SIZE;
1861 prop->cfg_base_address = CFG_BASE;
1862 prop->device_dma_offset_for_host_access = HOST_PHYS_BASE_0;
1863 prop->host_base_address = HOST_PHYS_BASE_0;
1864 prop->host_end_address = prop->host_base_address + HOST_PHYS_SIZE_0;
1865 prop->max_pending_cs = GAUDI2_MAX_PENDING_CS;
1866 prop->completion_queues_count = GAUDI2_RESERVED_CQ_NUMBER;
1867 prop->user_dec_intr_count = NUMBER_OF_DEC;
1868 prop->user_interrupt_count = GAUDI2_IRQ_NUM_USER_LAST - GAUDI2_IRQ_NUM_USER_FIRST + 1;
1869 prop->completion_mode = HL_COMPLETION_MODE_CS;
1870 prop->sync_stream_first_sob = GAUDI2_RESERVED_SOB_NUMBER;
1871 prop->sync_stream_first_mon = GAUDI2_RESERVED_MON_NUMBER;
1872
1873 prop->sram_base_address = SRAM_BASE_ADDR;
1874 prop->sram_size = SRAM_SIZE;
1875 prop->sram_end_address = prop->sram_base_address + prop->sram_size;
1876 prop->sram_user_base_address = prop->sram_base_address + SRAM_USER_BASE_OFFSET;
1877
1878 prop->hints_range_reservation = true;
1879
1880 if (hdev->pldm)
1881 prop->mmu_pgt_size = 0x800000;
1882 else
1883 prop->mmu_pgt_size = MMU_PAGE_TABLES_INITIAL_SIZE;
1884
1885 prop->mmu_pte_size = HL_PTE_SIZE;
1886 prop->mmu_hop_table_size = HOP_TABLE_SIZE_512_PTE;
1887 prop->mmu_hop0_tables_total_size = HOP0_512_PTE_TABLES_TOTAL_SIZE;
1888
1889 prop->dmmu.hop_shifts[MMU_HOP0] = DHOP0_SHIFT;
1890 prop->dmmu.hop_shifts[MMU_HOP1] = DHOP1_SHIFT;
1891 prop->dmmu.hop_shifts[MMU_HOP2] = DHOP2_SHIFT;
1892 prop->dmmu.hop_shifts[MMU_HOP3] = DHOP3_SHIFT;
1893 prop->dmmu.hop_shifts[MMU_HOP4] = DHOP4_SHIFT;
1894 prop->dmmu.hop_masks[MMU_HOP0] = DHOP0_MASK;
1895 prop->dmmu.hop_masks[MMU_HOP1] = DHOP1_MASK;
1896 prop->dmmu.hop_masks[MMU_HOP2] = DHOP2_MASK;
1897 prop->dmmu.hop_masks[MMU_HOP3] = DHOP3_MASK;
1898 prop->dmmu.hop_masks[MMU_HOP4] = DHOP4_MASK;
1899 prop->dmmu.page_size = PAGE_SIZE_1GB;
1900 prop->dmmu.num_hops = MMU_ARCH_6_HOPS;
1901 prop->dmmu.last_mask = LAST_MASK;
1902 prop->dmmu.host_resident = 1;
1903
1904 prop->dmmu.hop_table_size = prop->mmu_hop_table_size;
1905 prop->dmmu.hop0_tables_total_size = prop->mmu_hop0_tables_total_size;
1906
1907
1908
1909
1910
1911
1912
1913 prop->dram_size = (GAUDI2_HBM_NUM - 1) * SZ_16G;
1914
1915 hdev->pmmu_huge_range = true;
1916 prop->pmmu.host_resident = 1;
1917 prop->pmmu.num_hops = MMU_ARCH_6_HOPS;
1918 prop->pmmu.last_mask = LAST_MASK;
1919
1920 prop->pmmu.hop_table_size = prop->mmu_hop_table_size;
1921 prop->pmmu.hop0_tables_total_size = prop->mmu_hop0_tables_total_size;
1922
1923 prop->hints_host_reserved_va_range.start_addr = RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START;
1924 prop->hints_host_reserved_va_range.end_addr = RESERVED_VA_RANGE_FOR_ARC_ON_HOST_END;
1925 prop->hints_host_hpage_reserved_va_range.start_addr =
1926 RESERVED_VA_RANGE_FOR_ARC_ON_HOST_HPAGE_START;
1927 prop->hints_host_hpage_reserved_va_range.end_addr =
1928 RESERVED_VA_RANGE_FOR_ARC_ON_HOST_HPAGE_END;
1929
1930 if (PAGE_SIZE == SZ_64K) {
1931 prop->pmmu.hop_shifts[MMU_HOP0] = HOP0_SHIFT_64K;
1932 prop->pmmu.hop_shifts[MMU_HOP1] = HOP1_SHIFT_64K;
1933 prop->pmmu.hop_shifts[MMU_HOP2] = HOP2_SHIFT_64K;
1934 prop->pmmu.hop_shifts[MMU_HOP3] = HOP3_SHIFT_64K;
1935 prop->pmmu.hop_shifts[MMU_HOP4] = HOP4_SHIFT_64K;
1936 prop->pmmu.hop_shifts[MMU_HOP5] = HOP5_SHIFT_64K;
1937 prop->pmmu.hop_masks[MMU_HOP0] = HOP0_MASK_64K;
1938 prop->pmmu.hop_masks[MMU_HOP1] = HOP1_MASK_64K;
1939 prop->pmmu.hop_masks[MMU_HOP2] = HOP2_MASK_64K;
1940 prop->pmmu.hop_masks[MMU_HOP3] = HOP3_MASK_64K;
1941 prop->pmmu.hop_masks[MMU_HOP4] = HOP4_MASK_64K;
1942 prop->pmmu.hop_masks[MMU_HOP5] = HOP5_MASK_64K;
1943 prop->pmmu.start_addr = VA_HOST_SPACE_PAGE_START;
1944 prop->pmmu.end_addr = VA_HOST_SPACE_PAGE_END;
1945 prop->pmmu.page_size = PAGE_SIZE_64KB;
1946
1947
1948 memcpy(&prop->pmmu_huge, &prop->pmmu, sizeof(prop->pmmu));
1949 prop->pmmu_huge.page_size = PAGE_SIZE_16MB;
1950 prop->pmmu_huge.start_addr = VA_HOST_SPACE_HPAGE_START;
1951 prop->pmmu_huge.end_addr = VA_HOST_SPACE_HPAGE_END;
1952 } else {
1953 prop->pmmu.hop_shifts[MMU_HOP0] = HOP0_SHIFT_4K;
1954 prop->pmmu.hop_shifts[MMU_HOP1] = HOP1_SHIFT_4K;
1955 prop->pmmu.hop_shifts[MMU_HOP2] = HOP2_SHIFT_4K;
1956 prop->pmmu.hop_shifts[MMU_HOP3] = HOP3_SHIFT_4K;
1957 prop->pmmu.hop_shifts[MMU_HOP4] = HOP4_SHIFT_4K;
1958 prop->pmmu.hop_shifts[MMU_HOP5] = HOP5_SHIFT_4K;
1959 prop->pmmu.hop_masks[MMU_HOP0] = HOP0_MASK_4K;
1960 prop->pmmu.hop_masks[MMU_HOP1] = HOP1_MASK_4K;
1961 prop->pmmu.hop_masks[MMU_HOP2] = HOP2_MASK_4K;
1962 prop->pmmu.hop_masks[MMU_HOP3] = HOP3_MASK_4K;
1963 prop->pmmu.hop_masks[MMU_HOP4] = HOP4_MASK_4K;
1964 prop->pmmu.hop_masks[MMU_HOP5] = HOP5_MASK_4K;
1965 prop->pmmu.start_addr = VA_HOST_SPACE_PAGE_START;
1966 prop->pmmu.end_addr = VA_HOST_SPACE_PAGE_END;
1967 prop->pmmu.page_size = PAGE_SIZE_4KB;
1968
1969
1970 memcpy(&prop->pmmu_huge, &prop->pmmu, sizeof(prop->pmmu));
1971 prop->pmmu_huge.page_size = PAGE_SIZE_2MB;
1972 prop->pmmu_huge.start_addr = VA_HOST_SPACE_HPAGE_START;
1973 prop->pmmu_huge.end_addr = VA_HOST_SPACE_HPAGE_END;
1974 }
1975
1976 prop->cfg_size = CFG_SIZE;
1977 prop->max_asid = MAX_ASID;
1978 prop->num_of_events = GAUDI2_EVENT_SIZE;
1979
1980 prop->dc_power_default = DC_POWER_DEFAULT;
1981
1982 prop->cb_pool_cb_cnt = GAUDI2_CB_POOL_CB_CNT;
1983 prop->cb_pool_cb_size = GAUDI2_CB_POOL_CB_SIZE;
1984 prop->pcie_dbi_base_address = CFG_BASE + mmPCIE_DBI_BASE;
1985 prop->pcie_aux_dbi_reg_addr = CFG_BASE + mmPCIE_AUX_DBI;
1986
1987 strncpy(prop->cpucp_info.card_name, GAUDI2_DEFAULT_CARD_NAME, CARD_NAME_MAX_LEN);
1988
1989 prop->mme_master_slave_mode = 1;
1990
1991 prop->first_available_user_sob[0] = GAUDI2_RESERVED_SOB_NUMBER +
1992 (num_sync_stream_queues * HL_RSVD_SOBS);
1993
1994 prop->first_available_user_mon[0] = GAUDI2_RESERVED_MON_NUMBER +
1995 (num_sync_stream_queues * HL_RSVD_MONS);
1996
1997 prop->first_available_user_interrupt = GAUDI2_IRQ_NUM_USER_FIRST;
1998
1999 prop->first_available_cq[0] = GAUDI2_RESERVED_CQ_NUMBER;
2000
2001 prop->fw_cpu_boot_dev_sts0_valid = false;
2002 prop->fw_cpu_boot_dev_sts1_valid = false;
2003 prop->hard_reset_done_by_fw = false;
2004 prop->gic_interrupts_enable = true;
2005
2006 prop->server_type = HL_SERVER_TYPE_UNKNOWN;
2007
2008 prop->cb_va_start_addr = VA_HOST_SPACE_USER_MAPPED_CB_START;
2009 prop->cb_va_end_addr = VA_HOST_SPACE_USER_MAPPED_CB_END;
2010
2011 prop->max_dec = NUMBER_OF_DEC;
2012
2013 prop->clk_pll_index = HL_GAUDI2_MME_PLL;
2014
2015 prop->dma_mask = 64;
2016
2017 return 0;
2018 }
2019
2020 static int gaudi2_pci_bars_map(struct hl_device *hdev)
2021 {
2022 static const char * const name[] = {"CFG_SRAM", "MSIX", "DRAM"};
2023 bool is_wc[3] = {false, false, true};
2024 int rc;
2025
2026 rc = hl_pci_bars_map(hdev, name, is_wc);
2027 if (rc)
2028 return rc;
2029
2030 hdev->rmmio = hdev->pcie_bar[SRAM_CFG_BAR_ID] + (CFG_BASE - STM_FLASH_BASE_ADDR);
2031
2032 return 0;
2033 }
2034
2035 static u64 gaudi2_set_hbm_bar_base(struct hl_device *hdev, u64 addr)
2036 {
2037 struct gaudi2_device *gaudi2 = hdev->asic_specific;
2038 struct hl_inbound_pci_region pci_region;
2039 u64 old_addr = addr;
2040 int rc;
2041
2042 if ((gaudi2) && (gaudi2->dram_bar_cur_addr == addr))
2043 return old_addr;
2044
2045 if (hdev->asic_prop.iatu_done_by_fw)
2046 return U64_MAX;
2047
2048
2049 pci_region.mode = PCI_BAR_MATCH_MODE;
2050 pci_region.bar = DRAM_BAR_ID;
2051 pci_region.addr = addr;
2052 rc = hl_pci_set_inbound_region(hdev, 2, &pci_region);
2053 if (rc)
2054 return U64_MAX;
2055
2056 if (gaudi2) {
2057 old_addr = gaudi2->dram_bar_cur_addr;
2058 gaudi2->dram_bar_cur_addr = addr;
2059 }
2060
2061 return old_addr;
2062 }
2063
2064 static int gaudi2_init_iatu(struct hl_device *hdev)
2065 {
2066 struct hl_inbound_pci_region inbound_region;
2067 struct hl_outbound_pci_region outbound_region;
2068 u32 bar_addr_low, bar_addr_high;
2069 int rc;
2070
2071 if (hdev->asic_prop.iatu_done_by_fw)
2072 return 0;
2073
2074
2075
2076
2077
2078 inbound_region.mode = PCI_BAR_MATCH_MODE;
2079 inbound_region.bar = SRAM_CFG_BAR_ID;
2080
2081 inbound_region.addr = STM_FLASH_BASE_ADDR - STM_FLASH_ALIGNED_OFF;
2082 rc = hl_pci_set_inbound_region(hdev, 0, &inbound_region);
2083 if (rc)
2084 return rc;
2085
2086
2087 bar_addr_high = RREG32(mmPCIE_DBI_BAR1_REG + STM_FLASH_ALIGNED_OFF);
2088 bar_addr_low = RREG32(mmPCIE_DBI_BAR0_REG + STM_FLASH_ALIGNED_OFF) & ~0xF;
2089
2090 hdev->pcie_bar_phys[SRAM_CFG_BAR_ID] = (u64)bar_addr_high << 32 | bar_addr_low;
2091
2092
2093 inbound_region.mode = PCI_ADDRESS_MATCH_MODE;
2094 inbound_region.bar = SRAM_CFG_BAR_ID;
2095 inbound_region.offset_in_bar = 0;
2096 inbound_region.addr = STM_FLASH_BASE_ADDR;
2097 inbound_region.size = CFG_REGION_SIZE;
2098 rc = hl_pci_set_inbound_region(hdev, 0, &inbound_region);
2099 if (rc)
2100 return rc;
2101
2102
2103 inbound_region.mode = PCI_ADDRESS_MATCH_MODE;
2104 inbound_region.bar = SRAM_CFG_BAR_ID;
2105 inbound_region.offset_in_bar = CFG_REGION_SIZE;
2106 inbound_region.addr = BAR0_RSRVD_BASE_ADDR;
2107 inbound_region.size = BAR0_RSRVD_SIZE + SRAM_SIZE;
2108 rc = hl_pci_set_inbound_region(hdev, 1, &inbound_region);
2109 if (rc)
2110 return rc;
2111
2112
2113 inbound_region.mode = PCI_BAR_MATCH_MODE;
2114 inbound_region.bar = DRAM_BAR_ID;
2115 inbound_region.addr = DRAM_PHYS_BASE;
2116 rc = hl_pci_set_inbound_region(hdev, 2, &inbound_region);
2117 if (rc)
2118 return rc;
2119
2120
2121 outbound_region.addr = HOST_PHYS_BASE_0;
2122 outbound_region.size = HOST_PHYS_SIZE_0;
2123 rc = hl_pci_set_outbound_region(hdev, &outbound_region);
2124
2125 return rc;
2126 }
2127
2128 static enum hl_device_hw_state gaudi2_get_hw_state(struct hl_device *hdev)
2129 {
2130 return RREG32(mmHW_STATE);
2131 }
2132
2133 static int gaudi2_tpc_binning_init_prop(struct hl_device *hdev)
2134 {
2135 struct asic_fixed_properties *prop = &hdev->asic_prop;
2136
2137
2138
2139
2140
2141 if (hweight64(hdev->tpc_binning) > MAX_CLUSTER_BINNING_FAULTY_TPCS) {
2142 dev_err(hdev->dev, "TPC binning is supported for max of %d faulty TPCs, provided mask 0x%llx\n",
2143 MAX_CLUSTER_BINNING_FAULTY_TPCS,
2144 hdev->tpc_binning);
2145 return -EINVAL;
2146 }
2147
2148 prop->tpc_binning_mask = hdev->tpc_binning;
2149 prop->tpc_enabled_mask = GAUDI2_TPC_FULL_MASK;
2150
2151 return 0;
2152 }
2153
2154 static int gaudi2_set_tpc_binning_masks(struct hl_device *hdev)
2155 {
2156 struct asic_fixed_properties *prop = &hdev->asic_prop;
2157 struct hw_queue_properties *q_props = prop->hw_queues_props;
2158 u64 tpc_binning_mask;
2159 u8 subst_idx = 0;
2160 int i, rc;
2161
2162 rc = gaudi2_tpc_binning_init_prop(hdev);
2163 if (rc)
2164 return rc;
2165
2166 tpc_binning_mask = prop->tpc_binning_mask;
2167
2168 for (i = 0 ; i < MAX_FAULTY_TPCS ; i++) {
2169 u8 subst_seq, binned, qid_base;
2170
2171 if (tpc_binning_mask == 0)
2172 break;
2173
2174 if (subst_idx == 0) {
2175 subst_seq = TPC_ID_DCORE0_TPC6;
2176 qid_base = GAUDI2_QUEUE_ID_DCORE0_TPC_6_0;
2177 } else {
2178 subst_seq = TPC_ID_DCORE3_TPC5;
2179 qid_base = GAUDI2_QUEUE_ID_DCORE3_TPC_5_0;
2180 }
2181
2182
2183
2184 binned = __ffs(tpc_binning_mask);
2185
2186
2187
2188
2189 if (binned >= TPC_ID_SIZE) {
2190 dev_err(hdev->dev,
2191 "Invalid binned TPC (binning mask: %llx)\n",
2192 tpc_binning_mask);
2193 return -EINVAL;
2194 }
2195 clear_bit(binned, (unsigned long *)&tpc_binning_mask);
2196
2197
2198 clear_bit(subst_seq, (unsigned long *)&prop->tpc_enabled_mask);
2199
2200
2201 q_props[qid_base].binned = 1;
2202 q_props[qid_base + 1].binned = 1;
2203 q_props[qid_base + 2].binned = 1;
2204 q_props[qid_base + 3].binned = 1;
2205
2206 subst_idx++;
2207 }
2208
2209 return 0;
2210 }
2211
2212 static int gaudi2_set_dec_binning_masks(struct hl_device *hdev)
2213 {
2214 struct asic_fixed_properties *prop = &hdev->asic_prop;
2215 u8 num_faulty;
2216
2217 num_faulty = hweight32(hdev->decoder_binning);
2218
2219
2220
2221
2222
2223 if (num_faulty > MAX_FAULTY_DECODERS) {
2224 dev_err(hdev->dev, "decoder binning is supported for max of single faulty decoder, provided mask 0x%x\n",
2225 hdev->decoder_binning);
2226 return -EINVAL;
2227 }
2228
2229 prop->decoder_binning_mask = (hdev->decoder_binning & GAUDI2_DECODER_FULL_MASK);
2230
2231 if (prop->decoder_binning_mask)
2232 prop->decoder_enabled_mask = (GAUDI2_DECODER_FULL_MASK & ~BIT(DEC_ID_PCIE_VDEC1));
2233 else
2234 prop->decoder_enabled_mask = GAUDI2_DECODER_FULL_MASK;
2235
2236 return 0;
2237 }
2238
2239 static void gaudi2_set_dram_binning_masks(struct hl_device *hdev)
2240 {
2241 struct asic_fixed_properties *prop = &hdev->asic_prop;
2242
2243
2244 if (!hdev->dram_binning) {
2245 prop->dram_binning_mask = 0;
2246 prop->dram_enabled_mask = GAUDI2_DRAM_FULL_MASK;
2247 return;
2248 }
2249
2250
2251 prop->faulty_dram_cluster_map |= hdev->dram_binning;
2252 prop->dram_binning_mask = hdev->dram_binning;
2253 prop->dram_enabled_mask = GAUDI2_DRAM_FULL_MASK & ~BIT(HBM_ID5);
2254 }
2255
2256 static int gaudi2_set_edma_binning_masks(struct hl_device *hdev)
2257 {
2258 struct asic_fixed_properties *prop = &hdev->asic_prop;
2259 struct hw_queue_properties *q_props;
2260 u8 seq, num_faulty;
2261
2262 num_faulty = hweight32(hdev->edma_binning);
2263
2264
2265
2266
2267
2268 if (num_faulty > MAX_FAULTY_EDMAS) {
2269 dev_err(hdev->dev,
2270 "EDMA binning is supported for max of single faulty EDMA, provided mask 0x%x\n",
2271 hdev->edma_binning);
2272 return -EINVAL;
2273 }
2274
2275 if (!hdev->edma_binning) {
2276 prop->edma_binning_mask = 0;
2277 prop->edma_enabled_mask = GAUDI2_EDMA_FULL_MASK;
2278 return 0;
2279 }
2280
2281 seq = __ffs((unsigned long)hdev->edma_binning);
2282
2283
2284 prop->faulty_dram_cluster_map |= BIT(edma_to_hbm_cluster[seq]);
2285 prop->edma_binning_mask = hdev->edma_binning;
2286 prop->edma_enabled_mask = GAUDI2_EDMA_FULL_MASK & ~BIT(EDMA_ID_DCORE3_INSTANCE1);
2287
2288
2289 q_props = prop->hw_queues_props;
2290 q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0].binned = 1;
2291 q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1].binned = 1;
2292 q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2].binned = 1;
2293 q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3].binned = 1;
2294
2295 return 0;
2296 }
2297
2298 static int gaudi2_set_xbar_edge_enable_mask(struct hl_device *hdev, u32 xbar_edge_iso_mask)
2299 {
2300 struct asic_fixed_properties *prop = &hdev->asic_prop;
2301 u8 num_faulty, seq;
2302
2303
2304 if (!xbar_edge_iso_mask) {
2305 prop->xbar_edge_enabled_mask = GAUDI2_XBAR_EDGE_FULL_MASK;
2306 return 0;
2307 }
2308
2309
2310
2311
2312
2313 num_faulty = hweight32(xbar_edge_iso_mask);
2314
2315
2316
2317
2318
2319 if (num_faulty > MAX_FAULTY_XBARS) {
2320 dev_err(hdev->dev, "we cannot have more than %d faulty XBAR EDGE\n",
2321 MAX_FAULTY_XBARS);
2322 return -EINVAL;
2323 }
2324
2325 seq = __ffs((unsigned long)xbar_edge_iso_mask);
2326
2327
2328 prop->faulty_dram_cluster_map |= BIT(xbar_edge_to_hbm_cluster[seq]);
2329 prop->xbar_edge_enabled_mask = (~xbar_edge_iso_mask) & GAUDI2_XBAR_EDGE_FULL_MASK;
2330
2331 return 0;
2332 }
2333
2334 static int gaudi2_set_cluster_binning_masks_common(struct hl_device *hdev, u8 xbar_edge_iso_mask)
2335 {
2336 int rc;
2337
2338
2339
2340
2341
2342
2343 hdev->asic_prop.faulty_dram_cluster_map = 0;
2344
2345 gaudi2_set_dram_binning_masks(hdev);
2346
2347 rc = gaudi2_set_edma_binning_masks(hdev);
2348 if (rc)
2349 return rc;
2350
2351 rc = gaudi2_set_xbar_edge_enable_mask(hdev, xbar_edge_iso_mask);
2352 if (rc)
2353 return rc;
2354
2355
2356
2357 hdev->asic_prop.hmmu_hif_enabled_mask = GAUDI2_HIF_HMMU_FULL_MASK;
2358
2359 return 0;
2360 }
2361
2362 static int gaudi2_set_cluster_binning_masks(struct hl_device *hdev)
2363 {
2364 struct asic_fixed_properties *prop = &hdev->asic_prop;
2365 int rc;
2366
2367 rc = gaudi2_set_cluster_binning_masks_common(hdev, prop->cpucp_info.xbar_binning_mask);
2368 if (rc)
2369 return rc;
2370
2371
2372 if (prop->faulty_dram_cluster_map) {
2373 u8 cluster_seq = __ffs((unsigned long)prop->faulty_dram_cluster_map);
2374
2375 prop->hmmu_hif_enabled_mask = cluster_hmmu_hif_enabled_mask[cluster_seq];
2376 }
2377
2378 return 0;
2379 }
2380
2381 static int gaudi2_cpucp_info_get(struct hl_device *hdev)
2382 {
2383 struct gaudi2_device *gaudi2 = hdev->asic_specific;
2384 struct asic_fixed_properties *prop = &hdev->asic_prop;
2385 long max_power;
2386 u64 dram_size;
2387 int rc;
2388
2389 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))
2390 return 0;
2391
2392
2393
2394
2395 if (hdev->reset_info.in_compute_reset)
2396 return 0;
2397
2398 rc = hl_fw_cpucp_handshake(hdev, mmCPU_BOOT_DEV_STS0, mmCPU_BOOT_DEV_STS1, mmCPU_BOOT_ERR0,
2399 mmCPU_BOOT_ERR1);
2400 if (rc)
2401 return rc;
2402
2403 dram_size = le64_to_cpu(prop->cpucp_info.dram_size);
2404 if (dram_size) {
2405
2406
2407 if ((dram_size != ((GAUDI2_HBM_NUM - 1) * SZ_16G)) &&
2408 (dram_size != (GAUDI2_HBM_NUM * SZ_16G))) {
2409 dev_err(hdev->dev,
2410 "F/W reported invalid DRAM size %llu. Trying to use default size %llu\n",
2411 dram_size, prop->dram_size);
2412 dram_size = prop->dram_size;
2413 }
2414
2415 prop->dram_size = dram_size;
2416 prop->dram_end_address = prop->dram_base_address + dram_size;
2417 }
2418
2419 if (!strlen(prop->cpucp_info.card_name))
2420 strncpy(prop->cpucp_info.card_name, GAUDI2_DEFAULT_CARD_NAME, CARD_NAME_MAX_LEN);
2421
2422
2423 hdev->dram_binning = prop->cpucp_info.dram_binning_mask;
2424 hdev->edma_binning = prop->cpucp_info.edma_binning_mask;
2425 hdev->tpc_binning = le64_to_cpu(prop->cpucp_info.tpc_binning_mask);
2426 hdev->decoder_binning = lower_32_bits(le64_to_cpu(prop->cpucp_info.decoder_binning_mask));
2427
2428
2429
2430
2431
2432 rc = gaudi2_set_dram_properties(hdev);
2433 if (rc)
2434 return rc;
2435
2436 rc = gaudi2_set_cluster_binning_masks(hdev);
2437 if (rc)
2438 return rc;
2439
2440 rc = gaudi2_set_tpc_binning_masks(hdev);
2441 if (rc)
2442 return rc;
2443
2444 rc = gaudi2_set_dec_binning_masks(hdev);
2445 if (rc)
2446 return rc;
2447
2448 max_power = hl_fw_get_max_power(hdev);
2449 if (max_power < 0)
2450 return max_power;
2451
2452 prop->max_power_default = (u64) max_power;
2453
2454 return 0;
2455 }
2456
2457 static int gaudi2_fetch_psoc_frequency(struct hl_device *hdev)
2458 {
2459 struct gaudi2_device *gaudi2 = hdev->asic_specific;
2460 u16 pll_freq_arr[HL_PLL_NUM_OUTPUTS];
2461 int rc;
2462
2463 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))
2464 return 0;
2465
2466 rc = hl_fw_cpucp_pll_info_get(hdev, HL_GAUDI2_CPU_PLL, pll_freq_arr);
2467 if (rc)
2468 return rc;
2469
2470 hdev->asic_prop.psoc_timestamp_frequency = pll_freq_arr[3];
2471
2472 return 0;
2473 }
2474
2475 static int gaudi2_early_init(struct hl_device *hdev)
2476 {
2477 struct asic_fixed_properties *prop = &hdev->asic_prop;
2478 struct pci_dev *pdev = hdev->pdev;
2479 resource_size_t pci_bar_size;
2480 u32 fw_boot_status;
2481 int rc;
2482
2483 rc = gaudi2_set_fixed_properties(hdev);
2484 if (rc)
2485 return rc;
2486
2487
2488 pci_bar_size = pci_resource_len(pdev, SRAM_CFG_BAR_ID);
2489
2490 if (pci_bar_size != CFG_BAR_SIZE) {
2491 dev_err(hdev->dev, "Not " HL_NAME "? BAR %d size %pa, expecting %llu\n",
2492 SRAM_CFG_BAR_ID, &pci_bar_size, CFG_BAR_SIZE);
2493 rc = -ENODEV;
2494 goto free_queue_props;
2495 }
2496
2497 pci_bar_size = pci_resource_len(pdev, MSIX_BAR_ID);
2498 if (pci_bar_size != MSIX_BAR_SIZE) {
2499 dev_err(hdev->dev, "Not " HL_NAME "? BAR %d size %pa, expecting %llu\n",
2500 MSIX_BAR_ID, &pci_bar_size, MSIX_BAR_SIZE);
2501 rc = -ENODEV;
2502 goto free_queue_props;
2503 }
2504
2505 prop->dram_pci_bar_size = pci_resource_len(pdev, DRAM_BAR_ID);
2506 hdev->dram_pci_bar_start = pci_resource_start(pdev, DRAM_BAR_ID);
2507
2508
2509 if (hdev->asic_prop.fw_security_enabled) {
2510 hdev->asic_prop.iatu_done_by_fw = true;
2511 goto pci_init;
2512 }
2513
2514 rc = hl_pci_elbi_read(hdev, CFG_BASE + mmCPU_BOOT_DEV_STS0, &fw_boot_status);
2515 if (rc)
2516 goto free_queue_props;
2517
2518
2519 if ((fw_boot_status & CPU_BOOT_DEV_STS0_ENABLED) &&
2520 (fw_boot_status & CPU_BOOT_DEV_STS0_FW_IATU_CONF_EN))
2521 hdev->asic_prop.iatu_done_by_fw = true;
2522
2523 pci_init:
2524 rc = hl_pci_init(hdev);
2525 if (rc)
2526 goto free_queue_props;
2527
2528
2529
2530
2531 rc = hl_fw_read_preboot_status(hdev);
2532 if (rc) {
2533 if (hdev->reset_on_preboot_fail)
2534 hdev->asic_funcs->hw_fini(hdev, true, false);
2535 goto pci_fini;
2536 }
2537
2538 if (gaudi2_get_hw_state(hdev) == HL_DEVICE_HW_STATE_DIRTY) {
2539 dev_dbg(hdev->dev, "H/W state is dirty, must reset before initializing\n");
2540 hdev->asic_funcs->hw_fini(hdev, true, false);
2541 }
2542
2543 return 0;
2544
2545 pci_fini:
2546 hl_pci_fini(hdev);
2547 free_queue_props:
2548 kfree(hdev->asic_prop.hw_queues_props);
2549 return rc;
2550 }
2551
2552 static int gaudi2_early_fini(struct hl_device *hdev)
2553 {
2554 kfree(hdev->asic_prop.hw_queues_props);
2555 hl_pci_fini(hdev);
2556
2557 return 0;
2558 }
2559
2560 static bool gaudi2_is_arc_nic_owned(u64 arc_id)
2561 {
2562 switch (arc_id) {
2563 case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:
2564 return true;
2565 default:
2566 return false;
2567 }
2568 }
2569
2570 static bool gaudi2_is_arc_tpc_owned(u64 arc_id)
2571 {
2572 switch (arc_id) {
2573 case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:
2574 return true;
2575 default:
2576 return false;
2577 }
2578 }
2579
2580 static void gaudi2_init_arcs(struct hl_device *hdev)
2581 {
2582 struct gaudi2_device *gaudi2 = hdev->asic_specific;
2583 u64 arc_id;
2584 u32 i;
2585
2586 for (i = CPU_ID_SCHED_ARC0 ; i <= CPU_ID_SCHED_ARC3 ; i++) {
2587 if (gaudi2_is_arc_enabled(hdev, i))
2588 continue;
2589
2590 gaudi2_set_arc_id_cap(hdev, i);
2591 }
2592
2593 for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ ; i += 4) {
2594 if (!gaudi2_is_queue_enabled(hdev, i))
2595 continue;
2596
2597 arc_id = gaudi2_queue_id_to_arc_id[i];
2598 if (gaudi2_is_arc_enabled(hdev, arc_id))
2599 continue;
2600
2601 if (gaudi2_is_arc_nic_owned(arc_id) &&
2602 !(hdev->nic_ports_mask & BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0)))
2603 continue;
2604
2605 if (gaudi2_is_arc_tpc_owned(arc_id) && !(gaudi2->tpc_hw_cap_initialized &
2606 BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0)))
2607 continue;
2608
2609 gaudi2_set_arc_id_cap(hdev, arc_id);
2610 }
2611 }
2612
2613 static int gaudi2_scrub_arc_dccm(struct hl_device *hdev, u32 cpu_id)
2614 {
2615 u32 reg_base, reg_val;
2616 int rc;
2617
2618 switch (cpu_id) {
2619 case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC3:
2620
2621 rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],
2622 ARC_DCCM_BLOCK_SIZE * 2, true);
2623 if (rc)
2624 return rc;
2625 break;
2626 case CPU_ID_SCHED_ARC4:
2627 case CPU_ID_SCHED_ARC5:
2628 case CPU_ID_MME_QMAN_ARC0:
2629 case CPU_ID_MME_QMAN_ARC1:
2630 reg_base = gaudi2_arc_blocks_bases[cpu_id];
2631
2632
2633 rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],
2634 ARC_DCCM_BLOCK_SIZE, true);
2635 if (rc)
2636 return rc;
2637
2638
2639 reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_MME_ARC_UPPER_DCCM_EN_VAL_MASK, 1);
2640 WREG32(reg_base + ARC_DCCM_UPPER_EN_OFFSET, reg_val);
2641
2642
2643 rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],
2644 ARC_DCCM_BLOCK_SIZE, true);
2645 if (rc)
2646 return rc;
2647
2648
2649 reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_MME_ARC_UPPER_DCCM_EN_VAL_MASK, 0);
2650 WREG32(reg_base + ARC_DCCM_UPPER_EN_OFFSET, reg_val);
2651 break;
2652 default:
2653 rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],
2654 ARC_DCCM_BLOCK_SIZE, true);
2655 if (rc)
2656 return rc;
2657 }
2658
2659 return 0;
2660 }
2661
2662 static void gaudi2_scrub_arcs_dccm(struct hl_device *hdev)
2663 {
2664 u16 arc_id;
2665
2666 for (arc_id = CPU_ID_SCHED_ARC0 ; arc_id < CPU_ID_MAX ; arc_id++) {
2667 if (!gaudi2_is_arc_enabled(hdev, arc_id))
2668 continue;
2669
2670 gaudi2_scrub_arc_dccm(hdev, arc_id);
2671 }
2672 }
2673
2674 static int gaudi2_late_init(struct hl_device *hdev)
2675 {
2676 struct gaudi2_device *gaudi2 = hdev->asic_specific;
2677 int rc;
2678
2679 rc = hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_ENABLE_PCI_ACCESS,
2680 gaudi2->virt_msix_db_dma_addr);
2681 if (rc) {
2682 dev_err(hdev->dev, "Failed to enable PCI access from CPU\n");
2683 return rc;
2684 }
2685
2686 rc = gaudi2_fetch_psoc_frequency(hdev);
2687 if (rc) {
2688 dev_err(hdev->dev, "Failed to fetch psoc frequency\n");
2689 goto disable_pci_access;
2690 }
2691
2692 gaudi2_init_arcs(hdev);
2693 gaudi2_scrub_arcs_dccm(hdev);
2694 gaudi2_init_security(hdev);
2695
2696 return 0;
2697
2698 disable_pci_access:
2699 hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_DISABLE_PCI_ACCESS, 0x0);
2700
2701 return rc;
2702 }
2703
2704 static void gaudi2_late_fini(struct hl_device *hdev)
2705 {
2706 const struct hwmon_channel_info **channel_info_arr;
2707 int i = 0;
2708
2709 if (!hdev->hl_chip_info->info)
2710 return;
2711
2712 channel_info_arr = hdev->hl_chip_info->info;
2713
2714 while (channel_info_arr[i]) {
2715 kfree(channel_info_arr[i]->config);
2716 kfree(channel_info_arr[i]);
2717 i++;
2718 }
2719
2720 kfree(channel_info_arr);
2721
2722 hdev->hl_chip_info->info = NULL;
2723 }
2724
2725 static void gaudi2_user_mapped_dec_init(struct gaudi2_device *gaudi2, u32 start_idx)
2726 {
2727 struct user_mapped_block *blocks = gaudi2->mapped_blocks;
2728
2729 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE0_DEC0_CMD_BASE, HL_BLOCK_SIZE);
2730 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE0_DEC1_CMD_BASE, HL_BLOCK_SIZE);
2731 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE1_DEC0_CMD_BASE, HL_BLOCK_SIZE);
2732 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE1_DEC1_CMD_BASE, HL_BLOCK_SIZE);
2733 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE2_DEC0_CMD_BASE, HL_BLOCK_SIZE);
2734 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE2_DEC1_CMD_BASE, HL_BLOCK_SIZE);
2735 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE3_DEC0_CMD_BASE, HL_BLOCK_SIZE);
2736 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE3_DEC1_CMD_BASE, HL_BLOCK_SIZE);
2737 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmPCIE_DEC0_CMD_BASE, HL_BLOCK_SIZE);
2738 HL_USR_MAPPED_BLK_INIT(&blocks[start_idx], mmPCIE_DEC1_CMD_BASE, HL_BLOCK_SIZE);
2739 }
2740
2741 static void gaudi2_user_mapped_blocks_init(struct hl_device *hdev)
2742 {
2743 struct gaudi2_device *gaudi2 = hdev->asic_specific;
2744 struct user_mapped_block *blocks = gaudi2->mapped_blocks;
2745 u32 block_size, umr_start_idx, num_umr_blocks;
2746 int i;
2747
2748 for (i = 0 ; i < NUM_ARC_CPUS ; i++) {
2749 if (i >= CPU_ID_SCHED_ARC0 && i <= CPU_ID_SCHED_ARC3)
2750 block_size = ARC_DCCM_BLOCK_SIZE * 2;
2751 else
2752 block_size = ARC_DCCM_BLOCK_SIZE;
2753
2754 blocks[i].address = gaudi2_arc_dccm_bases[i];
2755 blocks[i].size = block_size;
2756 }
2757
2758 blocks[NUM_ARC_CPUS].address = mmARC_FARM_ARC0_ACP_ENG_BASE;
2759 blocks[NUM_ARC_CPUS].size = HL_BLOCK_SIZE;
2760
2761 blocks[NUM_ARC_CPUS + 1].address = mmARC_FARM_ARC1_ACP_ENG_BASE;
2762 blocks[NUM_ARC_CPUS + 1].size = HL_BLOCK_SIZE;
2763
2764 blocks[NUM_ARC_CPUS + 2].address = mmARC_FARM_ARC2_ACP_ENG_BASE;
2765 blocks[NUM_ARC_CPUS + 2].size = HL_BLOCK_SIZE;
2766
2767 blocks[NUM_ARC_CPUS + 3].address = mmARC_FARM_ARC3_ACP_ENG_BASE;
2768 blocks[NUM_ARC_CPUS + 3].size = HL_BLOCK_SIZE;
2769
2770 blocks[NUM_ARC_CPUS + 4].address = mmDCORE0_MME_QM_ARC_ACP_ENG_BASE;
2771 blocks[NUM_ARC_CPUS + 4].size = HL_BLOCK_SIZE;
2772
2773 blocks[NUM_ARC_CPUS + 5].address = mmDCORE1_MME_QM_ARC_ACP_ENG_BASE;
2774 blocks[NUM_ARC_CPUS + 5].size = HL_BLOCK_SIZE;
2775
2776 blocks[NUM_ARC_CPUS + 6].address = mmDCORE2_MME_QM_ARC_ACP_ENG_BASE;
2777 blocks[NUM_ARC_CPUS + 6].size = HL_BLOCK_SIZE;
2778
2779 blocks[NUM_ARC_CPUS + 7].address = mmDCORE3_MME_QM_ARC_ACP_ENG_BASE;
2780 blocks[NUM_ARC_CPUS + 7].size = HL_BLOCK_SIZE;
2781
2782 umr_start_idx = NUM_ARC_CPUS + NUM_OF_USER_ACP_BLOCKS;
2783 num_umr_blocks = NIC_NUMBER_OF_ENGINES * NUM_OF_USER_NIC_UMR_BLOCKS;
2784 for (i = 0 ; i < num_umr_blocks ; i++) {
2785 u8 nic_id, umr_block_id;
2786
2787 nic_id = i / NUM_OF_USER_NIC_UMR_BLOCKS;
2788 umr_block_id = i % NUM_OF_USER_NIC_UMR_BLOCKS;
2789
2790 blocks[umr_start_idx + i].address =
2791 mmNIC0_UMR0_0_UNSECURE_DOORBELL0_BASE +
2792 (nic_id / NIC_NUMBER_OF_QM_PER_MACRO) * NIC_OFFSET +
2793 (nic_id % NIC_NUMBER_OF_QM_PER_MACRO) * NIC_QM_OFFSET +
2794 umr_block_id * NIC_UMR_OFFSET;
2795 blocks[umr_start_idx + i].size = HL_BLOCK_SIZE;
2796 }
2797
2798
2799 gaudi2_user_mapped_dec_init(gaudi2, USR_MAPPED_BLK_DEC_START_IDX);
2800
2801 for (i = 1; i < NUM_OF_DCORES; ++i) {
2802 blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1)].size = SM_OBJS_BLOCK_SIZE;
2803 blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1) + 1].size = HL_BLOCK_SIZE;
2804
2805 blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1)].address =
2806 mmDCORE0_SYNC_MNGR_OBJS_BASE + i * DCORE_OFFSET;
2807
2808 blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1) + 1].address =
2809 mmDCORE0_SYNC_MNGR_GLBL_BASE + i * DCORE_OFFSET;
2810 }
2811 }
2812
2813 static int gaudi2_alloc_cpu_accessible_dma_mem(struct hl_device *hdev)
2814 {
2815 dma_addr_t dma_addr_arr[GAUDI2_ALLOC_CPU_MEM_RETRY_CNT] = {}, end_addr;
2816 void *virt_addr_arr[GAUDI2_ALLOC_CPU_MEM_RETRY_CNT] = {};
2817 int i, j, rc = 0;
2818
2819
2820
2821
2822
2823
2824 for (i = 0 ; i < GAUDI2_ALLOC_CPU_MEM_RETRY_CNT ; i++) {
2825 virt_addr_arr[i] = hl_asic_dma_alloc_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE,
2826 &dma_addr_arr[i], GFP_KERNEL | __GFP_ZERO);
2827 if (!virt_addr_arr[i]) {
2828 rc = -ENOMEM;
2829 goto free_dma_mem_arr;
2830 }
2831
2832 end_addr = dma_addr_arr[i] + HL_CPU_ACCESSIBLE_MEM_SIZE - 1;
2833 if (GAUDI2_ARC_PCI_MSB_ADDR(dma_addr_arr[i]) == GAUDI2_ARC_PCI_MSB_ADDR(end_addr))
2834 break;
2835 }
2836
2837 if (i == GAUDI2_ALLOC_CPU_MEM_RETRY_CNT) {
2838 dev_err(hdev->dev,
2839 "MSB of ARC accessible DMA memory are not identical in all range\n");
2840 rc = -EFAULT;
2841 goto free_dma_mem_arr;
2842 }
2843
2844 hdev->cpu_accessible_dma_mem = virt_addr_arr[i];
2845 hdev->cpu_accessible_dma_address = dma_addr_arr[i];
2846
2847 free_dma_mem_arr:
2848 for (j = 0 ; j < i ; j++)
2849 hl_asic_dma_free_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE, virt_addr_arr[j],
2850 dma_addr_arr[j]);
2851
2852 return rc;
2853 }
2854
2855 static void gaudi2_set_pci_memory_regions(struct hl_device *hdev)
2856 {
2857 struct asic_fixed_properties *prop = &hdev->asic_prop;
2858 struct pci_mem_region *region;
2859
2860
2861 region = &hdev->pci_mem_region[PCI_REGION_CFG];
2862 region->region_base = CFG_BASE;
2863 region->region_size = CFG_SIZE;
2864 region->offset_in_bar = CFG_BASE - STM_FLASH_BASE_ADDR;
2865 region->bar_size = CFG_BAR_SIZE;
2866 region->bar_id = SRAM_CFG_BAR_ID;
2867 region->used = 1;
2868
2869
2870 region = &hdev->pci_mem_region[PCI_REGION_SRAM];
2871 region->region_base = SRAM_BASE_ADDR;
2872 region->region_size = SRAM_SIZE;
2873 region->offset_in_bar = CFG_REGION_SIZE + BAR0_RSRVD_SIZE;
2874 region->bar_size = CFG_BAR_SIZE;
2875 region->bar_id = SRAM_CFG_BAR_ID;
2876 region->used = 1;
2877
2878
2879 region = &hdev->pci_mem_region[PCI_REGION_DRAM];
2880 region->region_base = DRAM_PHYS_BASE;
2881 region->region_size = hdev->asic_prop.dram_size;
2882 region->offset_in_bar = 0;
2883 region->bar_size = prop->dram_pci_bar_size;
2884 region->bar_id = DRAM_BAR_ID;
2885 region->used = 1;
2886 }
2887
2888 static void gaudi2_user_interrupt_setup(struct hl_device *hdev)
2889 {
2890 struct asic_fixed_properties *prop = &hdev->asic_prop;
2891 int i, j, k;
2892
2893
2894 HL_USR_INTR_STRUCT_INIT(hdev->common_user_cq_interrupt, hdev,
2895 HL_COMMON_USER_CQ_INTERRUPT_ID, false);
2896
2897
2898 HL_USR_INTR_STRUCT_INIT(hdev->common_decoder_interrupt, hdev,
2899 HL_COMMON_DEC_INTERRUPT_ID, true);
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910 for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM, j = 0 ; i <= GAUDI2_IRQ_NUM_SHARED_DEC1_NRM;
2911 i += 2, j++)
2912 HL_USR_INTR_STRUCT_INIT(hdev->user_interrupt[j], hdev, i, true);
2913
2914 for (i = GAUDI2_IRQ_NUM_USER_FIRST, k = 0 ; k < prop->user_interrupt_count; i++, j++, k++)
2915 HL_USR_INTR_STRUCT_INIT(hdev->user_interrupt[j], hdev, i, false);
2916 }
2917
2918 static inline int gaudi2_get_non_zero_random_int(void)
2919 {
2920 int rand = get_random_int();
2921
2922 return rand ? rand : 1;
2923 }
2924
2925 static int gaudi2_sw_init(struct hl_device *hdev)
2926 {
2927 struct asic_fixed_properties *prop = &hdev->asic_prop;
2928 struct gaudi2_device *gaudi2;
2929 int i, rc;
2930
2931
2932 gaudi2 = kzalloc(sizeof(*gaudi2), GFP_KERNEL);
2933 if (!gaudi2)
2934 return -ENOMEM;
2935
2936 for (i = 0 ; i < ARRAY_SIZE(gaudi2_irq_map_table) ; i++) {
2937 if (gaudi2_irq_map_table[i].msg || !gaudi2_irq_map_table[i].valid)
2938 continue;
2939
2940 if (gaudi2->num_of_valid_hw_events == GAUDI2_EVENT_SIZE) {
2941 dev_err(hdev->dev, "H/W events array exceeds the limit of %u events\n",
2942 GAUDI2_EVENT_SIZE);
2943 rc = -EINVAL;
2944 goto free_gaudi2_device;
2945 }
2946
2947 gaudi2->hw_events[gaudi2->num_of_valid_hw_events++] = gaudi2_irq_map_table[i].fc_id;
2948 }
2949
2950 for (i = 0 ; i < MME_NUM_OF_LFSR_SEEDS ; i++)
2951 gaudi2->lfsr_rand_seeds[i] = gaudi2_get_non_zero_random_int();
2952
2953 gaudi2->cpucp_info_get = gaudi2_cpucp_info_get;
2954
2955 hdev->asic_specific = gaudi2;
2956
2957
2958
2959
2960
2961 hdev->dma_pool = dma_pool_create(dev_name(hdev->dev), &hdev->pdev->dev,
2962 GAUDI2_DMA_POOL_BLK_SIZE, DEVICE_CACHE_LINE_SIZE, 0);
2963 if (!hdev->dma_pool) {
2964 dev_err(hdev->dev, "failed to create DMA pool\n");
2965 rc = -ENOMEM;
2966 goto free_gaudi2_device;
2967 }
2968
2969 rc = gaudi2_alloc_cpu_accessible_dma_mem(hdev);
2970 if (rc)
2971 goto free_dma_pool;
2972
2973 hdev->cpu_accessible_dma_pool = gen_pool_create(ilog2(32), -1);
2974 if (!hdev->cpu_accessible_dma_pool) {
2975 dev_err(hdev->dev, "Failed to create CPU accessible DMA pool\n");
2976 rc = -ENOMEM;
2977 goto free_cpu_dma_mem;
2978 }
2979
2980 rc = gen_pool_add(hdev->cpu_accessible_dma_pool, (uintptr_t) hdev->cpu_accessible_dma_mem,
2981 HL_CPU_ACCESSIBLE_MEM_SIZE, -1);
2982 if (rc) {
2983 dev_err(hdev->dev, "Failed to add memory to CPU accessible DMA pool\n");
2984 rc = -EFAULT;
2985 goto free_cpu_accessible_dma_pool;
2986 }
2987
2988 gaudi2->virt_msix_db_cpu_addr = hl_cpu_accessible_dma_pool_alloc(hdev, prop->pmmu.page_size,
2989 &gaudi2->virt_msix_db_dma_addr);
2990 if (!gaudi2->virt_msix_db_cpu_addr) {
2991 dev_err(hdev->dev, "Failed to allocate DMA memory for virtual MSI-X doorbell\n");
2992 rc = -ENOMEM;
2993 goto free_cpu_accessible_dma_pool;
2994 }
2995
2996 spin_lock_init(&gaudi2->hw_queues_lock);
2997 spin_lock_init(&gaudi2->kdma_lock);
2998
2999 gaudi2->scratchpad_kernel_address = hl_asic_dma_alloc_coherent(hdev, PAGE_SIZE,
3000 &gaudi2->scratchpad_bus_address,
3001 GFP_KERNEL | __GFP_ZERO);
3002 if (!gaudi2->scratchpad_kernel_address) {
3003 rc = -ENOMEM;
3004 goto free_virt_msix_db_mem;
3005 }
3006
3007 gaudi2_user_mapped_blocks_init(hdev);
3008
3009
3010 gaudi2_user_interrupt_setup(hdev);
3011
3012 hdev->supports_coresight = true;
3013 hdev->supports_sync_stream = true;
3014 hdev->supports_cb_mapping = true;
3015 hdev->supports_wait_for_multi_cs = false;
3016
3017 prop->supports_compute_reset = true;
3018
3019 hdev->asic_funcs->set_pci_memory_regions(hdev);
3020
3021 return 0;
3022
3023 free_virt_msix_db_mem:
3024 hl_cpu_accessible_dma_pool_free(hdev, prop->pmmu.page_size, gaudi2->virt_msix_db_cpu_addr);
3025 free_cpu_accessible_dma_pool:
3026 gen_pool_destroy(hdev->cpu_accessible_dma_pool);
3027 free_cpu_dma_mem:
3028 hl_asic_dma_free_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE, hdev->cpu_accessible_dma_mem,
3029 hdev->cpu_accessible_dma_address);
3030 free_dma_pool:
3031 dma_pool_destroy(hdev->dma_pool);
3032 free_gaudi2_device:
3033 kfree(gaudi2);
3034 return rc;
3035 }
3036
3037 static int gaudi2_sw_fini(struct hl_device *hdev)
3038 {
3039 struct asic_fixed_properties *prop = &hdev->asic_prop;
3040 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3041
3042 hl_cpu_accessible_dma_pool_free(hdev, prop->pmmu.page_size, gaudi2->virt_msix_db_cpu_addr);
3043
3044 gen_pool_destroy(hdev->cpu_accessible_dma_pool);
3045
3046 hl_asic_dma_free_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE, hdev->cpu_accessible_dma_mem,
3047 hdev->cpu_accessible_dma_address);
3048
3049 hl_asic_dma_free_coherent(hdev, PAGE_SIZE, gaudi2->scratchpad_kernel_address,
3050 gaudi2->scratchpad_bus_address);
3051
3052 dma_pool_destroy(hdev->dma_pool);
3053
3054 kfree(gaudi2);
3055
3056 return 0;
3057 }
3058
3059 static void gaudi2_stop_qman_common(struct hl_device *hdev, u32 reg_base)
3060 {
3061 WREG32(reg_base + QM_GLBL_CFG1_OFFSET, QM_GLBL_CFG1_PQF_STOP |
3062 QM_GLBL_CFG1_CQF_STOP |
3063 QM_GLBL_CFG1_CP_STOP);
3064
3065
3066 WREG32(reg_base + QM_GLBL_CFG2_OFFSET, QM_GLBL_CFG2_ARC_CQF_STOP);
3067 }
3068
3069 static void gaudi2_flush_qman_common(struct hl_device *hdev, u32 reg_base)
3070 {
3071 WREG32(reg_base + QM_GLBL_CFG1_OFFSET, QM_GLBL_CFG1_PQF_FLUSH |
3072 QM_GLBL_CFG1_CQF_FLUSH |
3073 QM_GLBL_CFG1_CP_FLUSH);
3074 }
3075
3076 static void gaudi2_flush_qman_arc_common(struct hl_device *hdev, u32 reg_base)
3077 {
3078 WREG32(reg_base + QM_GLBL_CFG2_OFFSET, QM_GLBL_CFG2_ARC_CQF_FLUSH);
3079 }
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090 static void gaudi2_clear_qm_fence_counters_common(struct hl_device *hdev, u32 queue_id,
3091 bool skip_fence)
3092 {
3093 u32 size, reg_base;
3094 u32 addr, val;
3095
3096 reg_base = gaudi2_qm_blocks_bases[queue_id];
3097
3098 addr = reg_base + QM_CP_FENCE0_CNT_0_OFFSET;
3099 size = mmPDMA0_QM_CP_BARRIER_CFG - mmPDMA0_QM_CP_FENCE0_CNT_0;
3100
3101
3102
3103
3104
3105
3106
3107 val = skip_fence ? U32_MAX : 0;
3108 gaudi2_memset_device_lbw(hdev, addr, size, val);
3109 }
3110
3111 static void gaudi2_qman_manual_flush_common(struct hl_device *hdev, u32 queue_id)
3112 {
3113 u32 reg_base = gaudi2_qm_blocks_bases[queue_id];
3114
3115 gaudi2_clear_qm_fence_counters_common(hdev, queue_id, true);
3116 gaudi2_flush_qman_common(hdev, reg_base);
3117 gaudi2_flush_qman_arc_common(hdev, reg_base);
3118 }
3119
3120 static void gaudi2_stop_dma_qmans(struct hl_device *hdev)
3121 {
3122 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3123 int dcore, inst;
3124
3125 if (!(gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK))
3126 goto stop_edma_qmans;
3127
3128
3129 gaudi2_stop_qman_common(hdev, mmPDMA0_QM_BASE);
3130 gaudi2_stop_qman_common(hdev, mmPDMA1_QM_BASE);
3131
3132 stop_edma_qmans:
3133 if (!(gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK))
3134 return;
3135
3136 for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {
3137 for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {
3138 u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;
3139 u32 qm_base;
3140
3141 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_EDMA_SHIFT + seq)))
3142 continue;
3143
3144 qm_base = mmDCORE0_EDMA0_QM_BASE + dcore * DCORE_OFFSET +
3145 inst * DCORE_EDMA_OFFSET;
3146
3147
3148 gaudi2_stop_qman_common(hdev, qm_base);
3149 }
3150 }
3151 }
3152
3153 static void gaudi2_stop_mme_qmans(struct hl_device *hdev)
3154 {
3155 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3156 u32 offset, i;
3157
3158 offset = mmDCORE1_MME_QM_BASE - mmDCORE0_MME_QM_BASE;
3159
3160 for (i = 0 ; i < NUM_OF_DCORES ; i++) {
3161 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_MME_SHIFT + i)))
3162 continue;
3163
3164 gaudi2_stop_qman_common(hdev, mmDCORE0_MME_QM_BASE + (i * offset));
3165 }
3166 }
3167
3168 static void gaudi2_stop_tpc_qmans(struct hl_device *hdev)
3169 {
3170 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3171 u32 reg_base;
3172 int i;
3173
3174 if (!(gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK))
3175 return;
3176
3177 for (i = 0 ; i < TPC_ID_SIZE ; i++) {
3178 if (!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(HW_CAP_TPC_SHIFT + i)))
3179 continue;
3180
3181 reg_base = gaudi2_qm_blocks_bases[gaudi2_tpc_id_to_queue_id[i]];
3182 gaudi2_stop_qman_common(hdev, reg_base);
3183 }
3184 }
3185
3186 static void gaudi2_stop_rot_qmans(struct hl_device *hdev)
3187 {
3188 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3189 u32 reg_base;
3190 int i;
3191
3192 if (!(gaudi2->hw_cap_initialized & HW_CAP_ROT_MASK))
3193 return;
3194
3195 for (i = 0 ; i < ROTATOR_ID_SIZE ; i++) {
3196 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_ROT_SHIFT + i)))
3197 continue;
3198
3199 reg_base = gaudi2_qm_blocks_bases[gaudi2_rot_id_to_queue_id[i]];
3200 gaudi2_stop_qman_common(hdev, reg_base);
3201 }
3202 }
3203
3204 static void gaudi2_stop_nic_qmans(struct hl_device *hdev)
3205 {
3206 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3207 u32 reg_base, queue_id;
3208 int i;
3209
3210 if (!(gaudi2->nic_hw_cap_initialized & HW_CAP_NIC_MASK))
3211 return;
3212
3213 queue_id = GAUDI2_QUEUE_ID_NIC_0_0;
3214
3215 for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++, queue_id += NUM_OF_PQ_PER_QMAN) {
3216 if (!(hdev->nic_ports_mask & BIT(i)))
3217 continue;
3218
3219 reg_base = gaudi2_qm_blocks_bases[queue_id];
3220 gaudi2_stop_qman_common(hdev, reg_base);
3221 }
3222 }
3223
3224 static void gaudi2_stall_dma_common(struct hl_device *hdev, u32 reg_base)
3225 {
3226 u32 reg_val;
3227
3228 reg_val = FIELD_PREP(PDMA0_CORE_CFG_1_HALT_MASK, 0x1);
3229 WREG32(reg_base + DMA_CORE_CFG_1_OFFSET, reg_val);
3230 }
3231
3232 static void gaudi2_dma_stall(struct hl_device *hdev)
3233 {
3234 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3235 int dcore, inst;
3236
3237 if (!(gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK))
3238 goto stall_edma;
3239
3240 gaudi2_stall_dma_common(hdev, mmPDMA0_CORE_BASE);
3241 gaudi2_stall_dma_common(hdev, mmPDMA1_CORE_BASE);
3242
3243 stall_edma:
3244 if (!(gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK))
3245 return;
3246
3247 for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {
3248 for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {
3249 u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;
3250 u32 core_base;
3251
3252 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_EDMA_SHIFT + seq)))
3253 continue;
3254
3255 core_base = mmDCORE0_EDMA0_CORE_BASE + dcore * DCORE_OFFSET +
3256 inst * DCORE_EDMA_OFFSET;
3257
3258
3259 gaudi2_stall_dma_common(hdev, core_base);
3260 }
3261 }
3262 }
3263
3264 static void gaudi2_mme_stall(struct hl_device *hdev)
3265 {
3266 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3267 u32 offset, i;
3268
3269 offset = mmDCORE1_MME_CTRL_LO_QM_STALL - mmDCORE0_MME_CTRL_LO_QM_STALL;
3270
3271 for (i = 0 ; i < NUM_OF_DCORES ; i++)
3272 if (gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_MME_SHIFT + i))
3273 WREG32(mmDCORE0_MME_CTRL_LO_QM_STALL + (i * offset), 1);
3274 }
3275
3276 static void gaudi2_tpc_stall(struct hl_device *hdev)
3277 {
3278 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3279 u32 reg_base;
3280 int i;
3281
3282 if (!(gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK))
3283 return;
3284
3285 for (i = 0 ; i < TPC_ID_SIZE ; i++) {
3286 if (!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(HW_CAP_TPC_SHIFT + i)))
3287 continue;
3288
3289 reg_base = gaudi2_tpc_cfg_blocks_bases[i];
3290 WREG32(reg_base + TPC_CFG_STALL_OFFSET, 1);
3291 }
3292 }
3293
3294 static void gaudi2_rotator_stall(struct hl_device *hdev)
3295 {
3296 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3297 u32 reg_val;
3298 int i;
3299
3300 if (!(gaudi2->hw_cap_initialized & HW_CAP_ROT_MASK))
3301 return;
3302
3303 reg_val = FIELD_PREP(ROT_MSS_HALT_WBC_MASK, 0x1) |
3304 FIELD_PREP(ROT_MSS_HALT_RSB_MASK, 0x1) |
3305 FIELD_PREP(ROT_MSS_HALT_MRSB_MASK, 0x1);
3306
3307 for (i = 0 ; i < ROTATOR_ID_SIZE ; i++) {
3308 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_ROT_SHIFT + i)))
3309 continue;
3310
3311 WREG32(mmROT0_MSS_HALT + i * ROT_OFFSET, reg_val);
3312 }
3313 }
3314
3315 static void gaudi2_disable_qman_common(struct hl_device *hdev, u32 reg_base)
3316 {
3317 WREG32(reg_base + QM_GLBL_CFG0_OFFSET, 0);
3318 }
3319
3320 static void gaudi2_disable_dma_qmans(struct hl_device *hdev)
3321 {
3322 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3323 int dcore, inst;
3324
3325 if (!(gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK))
3326 goto stop_edma_qmans;
3327
3328 gaudi2_disable_qman_common(hdev, mmPDMA0_QM_BASE);
3329 gaudi2_disable_qman_common(hdev, mmPDMA1_QM_BASE);
3330
3331 stop_edma_qmans:
3332 if (!(gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK))
3333 return;
3334
3335 for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {
3336 for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {
3337 u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;
3338 u32 qm_base;
3339
3340 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_EDMA_SHIFT + seq)))
3341 continue;
3342
3343 qm_base = mmDCORE0_EDMA0_QM_BASE + dcore * DCORE_OFFSET +
3344 inst * DCORE_EDMA_OFFSET;
3345
3346
3347 gaudi2_disable_qman_common(hdev, qm_base);
3348 }
3349 }
3350 }
3351
3352 static void gaudi2_disable_mme_qmans(struct hl_device *hdev)
3353 {
3354 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3355 u32 offset, i;
3356
3357 offset = mmDCORE1_MME_QM_BASE - mmDCORE0_MME_QM_BASE;
3358
3359 for (i = 0 ; i < NUM_OF_DCORES ; i++)
3360 if (gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_MME_SHIFT + i))
3361 gaudi2_disable_qman_common(hdev, mmDCORE0_MME_QM_BASE + (i * offset));
3362 }
3363
3364 static void gaudi2_disable_tpc_qmans(struct hl_device *hdev)
3365 {
3366 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3367 u32 reg_base;
3368 int i;
3369
3370 if (!(gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK))
3371 return;
3372
3373 for (i = 0 ; i < TPC_ID_SIZE ; i++) {
3374 if (!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(HW_CAP_TPC_SHIFT + i)))
3375 continue;
3376
3377 reg_base = gaudi2_qm_blocks_bases[gaudi2_tpc_id_to_queue_id[i]];
3378 gaudi2_disable_qman_common(hdev, reg_base);
3379 }
3380 }
3381
3382 static void gaudi2_disable_rot_qmans(struct hl_device *hdev)
3383 {
3384 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3385 u32 reg_base;
3386 int i;
3387
3388 if (!(gaudi2->hw_cap_initialized & HW_CAP_ROT_MASK))
3389 return;
3390
3391 for (i = 0 ; i < ROTATOR_ID_SIZE ; i++) {
3392 if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_ROT_SHIFT + i)))
3393 continue;
3394
3395 reg_base = gaudi2_qm_blocks_bases[gaudi2_rot_id_to_queue_id[i]];
3396 gaudi2_disable_qman_common(hdev, reg_base);
3397 }
3398 }
3399
3400 static void gaudi2_disable_nic_qmans(struct hl_device *hdev)
3401 {
3402 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3403 u32 reg_base, queue_id;
3404 int i;
3405
3406 if (!(gaudi2->nic_hw_cap_initialized & HW_CAP_NIC_MASK))
3407 return;
3408
3409 queue_id = GAUDI2_QUEUE_ID_NIC_0_0;
3410
3411 for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++, queue_id += NUM_OF_PQ_PER_QMAN) {
3412 if (!(hdev->nic_ports_mask & BIT(i)))
3413 continue;
3414
3415 reg_base = gaudi2_qm_blocks_bases[queue_id];
3416 gaudi2_disable_qman_common(hdev, reg_base);
3417 }
3418 }
3419
3420 static void gaudi2_enable_timestamp(struct hl_device *hdev)
3421 {
3422
3423 WREG32(mmPSOC_TIMESTAMP_BASE, 0);
3424
3425
3426 WREG32(mmPSOC_TIMESTAMP_BASE + 0xC, 0);
3427 WREG32(mmPSOC_TIMESTAMP_BASE + 0x8, 0);
3428
3429
3430 WREG32(mmPSOC_TIMESTAMP_BASE, 1);
3431 }
3432
3433 static void gaudi2_disable_timestamp(struct hl_device *hdev)
3434 {
3435
3436 WREG32(mmPSOC_TIMESTAMP_BASE, 0);
3437 }
3438
3439 static const char *gaudi2_irq_name(u16 irq_number)
3440 {
3441 switch (irq_number) {
3442 case GAUDI2_IRQ_NUM_EVENT_QUEUE:
3443 return "gaudi2 cpu eq";
3444 case GAUDI2_IRQ_NUM_COMPLETION:
3445 return "gaudi2 completion";
3446 case GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM ... GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM:
3447 return gaudi2_vdec_irq_name[irq_number - GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM];
3448 case GAUDI2_IRQ_NUM_USER_FIRST ... GAUDI2_IRQ_NUM_USER_LAST:
3449 return "gaudi2 user completion";
3450 default:
3451 return "invalid";
3452 }
3453 }
3454
3455 static void gaudi2_dec_disable_msix(struct hl_device *hdev, u32 max_irq_num)
3456 {
3457 int i, irq, relative_idx;
3458 struct hl_dec *dec;
3459
3460 for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM ; i < max_irq_num ; i++) {
3461 irq = pci_irq_vector(hdev->pdev, i);
3462 relative_idx = i - GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM;
3463
3464 dec = hdev->dec + relative_idx / 2;
3465
3466
3467
3468
3469
3470 free_irq(irq, ((relative_idx % 2) ?
3471 (void *) dec :
3472 (void *) &hdev->user_interrupt[dec->core_id]));
3473 }
3474 }
3475
3476 static int gaudi2_dec_enable_msix(struct hl_device *hdev)
3477 {
3478 int rc, i, irq_init_cnt, irq, relative_idx;
3479 irq_handler_t irq_handler;
3480 struct hl_dec *dec;
3481
3482 for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM, irq_init_cnt = 0;
3483 i <= GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM;
3484 i++, irq_init_cnt++) {
3485
3486 irq = pci_irq_vector(hdev->pdev, i);
3487 relative_idx = i - GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM;
3488
3489 irq_handler = (relative_idx % 2) ?
3490 hl_irq_handler_dec_abnrm :
3491 hl_irq_handler_user_interrupt;
3492
3493 dec = hdev->dec + relative_idx / 2;
3494
3495
3496
3497
3498
3499 rc = request_irq(irq, irq_handler, 0, gaudi2_irq_name(i),
3500 ((relative_idx % 2) ?
3501 (void *) dec :
3502 (void *) &hdev->user_interrupt[dec->core_id]));
3503 if (rc) {
3504 dev_err(hdev->dev, "Failed to request IRQ %d", irq);
3505 goto free_dec_irqs;
3506 }
3507 }
3508
3509 return 0;
3510
3511 free_dec_irqs:
3512 gaudi2_dec_disable_msix(hdev, (GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM + irq_init_cnt));
3513 return rc;
3514 }
3515
3516 static int gaudi2_enable_msix(struct hl_device *hdev)
3517 {
3518 struct asic_fixed_properties *prop = &hdev->asic_prop;
3519 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3520 int rc, irq, i, j, user_irq_init_cnt;
3521 irq_handler_t irq_handler;
3522 struct hl_cq *cq;
3523
3524 if (gaudi2->hw_cap_initialized & HW_CAP_MSIX)
3525 return 0;
3526
3527 rc = pci_alloc_irq_vectors(hdev->pdev, GAUDI2_MSIX_ENTRIES, GAUDI2_MSIX_ENTRIES,
3528 PCI_IRQ_MSIX);
3529 if (rc < 0) {
3530 dev_err(hdev->dev, "MSI-X: Failed to enable support -- %d/%d\n",
3531 GAUDI2_MSIX_ENTRIES, rc);
3532 return rc;
3533 }
3534
3535 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);
3536 cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_CS_COMPLETION];
3537 rc = request_irq(irq, hl_irq_handler_cq, 0, gaudi2_irq_name(GAUDI2_IRQ_NUM_COMPLETION), cq);
3538 if (rc) {
3539 dev_err(hdev->dev, "Failed to request IRQ %d", irq);
3540 goto free_irq_vectors;
3541 }
3542
3543 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE);
3544 rc = request_irq(irq, hl_irq_handler_eq, 0, gaudi2_irq_name(GAUDI2_IRQ_NUM_EVENT_QUEUE),
3545 &hdev->event_queue);
3546 if (rc) {
3547 dev_err(hdev->dev, "Failed to request IRQ %d", irq);
3548 goto free_completion_irq;
3549 }
3550
3551 rc = gaudi2_dec_enable_msix(hdev);
3552 if (rc) {
3553 dev_err(hdev->dev, "Failed to enable decoder IRQ");
3554 goto free_completion_irq;
3555 }
3556
3557 for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = prop->user_dec_intr_count, user_irq_init_cnt = 0;
3558 user_irq_init_cnt < prop->user_interrupt_count;
3559 i++, j++, user_irq_init_cnt++) {
3560
3561 irq = pci_irq_vector(hdev->pdev, i);
3562 irq_handler = hl_irq_handler_user_interrupt;
3563
3564 rc = request_irq(irq, irq_handler, 0, gaudi2_irq_name(i), &hdev->user_interrupt[j]);
3565 if (rc) {
3566 dev_err(hdev->dev, "Failed to request IRQ %d", irq);
3567 goto free_user_irq;
3568 }
3569 }
3570
3571 gaudi2->hw_cap_initialized |= HW_CAP_MSIX;
3572
3573 return 0;
3574
3575 free_user_irq:
3576 for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = prop->user_dec_intr_count;
3577 i < GAUDI2_IRQ_NUM_USER_FIRST + user_irq_init_cnt ; i++, j++) {
3578
3579 irq = pci_irq_vector(hdev->pdev, i);
3580 free_irq(irq, &hdev->user_interrupt[j]);
3581 }
3582
3583 gaudi2_dec_disable_msix(hdev, GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM + 1);
3584
3585 free_completion_irq:
3586 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);
3587 free_irq(irq, cq);
3588
3589 free_irq_vectors:
3590 pci_free_irq_vectors(hdev->pdev);
3591
3592 return rc;
3593 }
3594
3595 static void gaudi2_sync_irqs(struct hl_device *hdev)
3596 {
3597 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3598 int i, j;
3599 int irq;
3600
3601 if (!(gaudi2->hw_cap_initialized & HW_CAP_MSIX))
3602 return;
3603
3604
3605 synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION));
3606
3607 for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM ; i <= GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM ; i++) {
3608 irq = pci_irq_vector(hdev->pdev, i);
3609 synchronize_irq(irq);
3610 }
3611
3612 for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = 0 ; j < hdev->asic_prop.user_interrupt_count;
3613 i++, j++) {
3614 irq = pci_irq_vector(hdev->pdev, i);
3615 synchronize_irq(irq);
3616 }
3617
3618 synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE));
3619 }
3620
3621 static void gaudi2_disable_msix(struct hl_device *hdev)
3622 {
3623 struct asic_fixed_properties *prop = &hdev->asic_prop;
3624 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3625 struct hl_cq *cq;
3626 int irq, i, j, k;
3627
3628 if (!(gaudi2->hw_cap_initialized & HW_CAP_MSIX))
3629 return;
3630
3631 gaudi2_sync_irqs(hdev);
3632
3633 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE);
3634 free_irq(irq, &hdev->event_queue);
3635
3636 gaudi2_dec_disable_msix(hdev, GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM + 1);
3637
3638 for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = prop->user_dec_intr_count, k = 0;
3639 k < hdev->asic_prop.user_interrupt_count ; i++, j++, k++) {
3640
3641 irq = pci_irq_vector(hdev->pdev, i);
3642 free_irq(irq, &hdev->user_interrupt[j]);
3643 }
3644
3645 irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);
3646 cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_CS_COMPLETION];
3647 free_irq(irq, cq);
3648
3649 pci_free_irq_vectors(hdev->pdev);
3650
3651 gaudi2->hw_cap_initialized &= ~HW_CAP_MSIX;
3652 }
3653
3654 static void gaudi2_stop_dcore_dec(struct hl_device *hdev, int dcore_id)
3655 {
3656 u32 reg_val = FIELD_PREP(DCORE0_VDEC0_BRDG_CTRL_GRACEFUL_STOP_MASK, 0x1);
3657 u32 graceful_pend_mask = DCORE0_VDEC0_BRDG_CTRL_GRACEFUL_PEND_MASK;
3658 u32 timeout_usec, dec_id, dec_bit, offset, graceful;
3659 int rc;
3660
3661 if (hdev->pldm)
3662 timeout_usec = GAUDI2_PLDM_VDEC_TIMEOUT_USEC;
3663 else
3664 timeout_usec = GAUDI2_VDEC_TIMEOUT_USEC;
3665
3666 for (dec_id = 0 ; dec_id < NUM_OF_DEC_PER_DCORE ; dec_id++) {
3667 dec_bit = dcore_id * NUM_OF_DEC_PER_DCORE + dec_id;
3668 if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))
3669 continue;
3670
3671 offset = dcore_id * DCORE_OFFSET + dec_id * DCORE_VDEC_OFFSET;
3672
3673 WREG32(mmDCORE0_DEC0_CMD_SWREG16 + offset, 0);
3674
3675 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_GRACEFUL + offset, reg_val);
3676
3677
3678
3679
3680 rc = hl_poll_timeout(
3681 hdev,
3682 mmDCORE0_VDEC0_BRDG_CTRL_GRACEFUL + offset,
3683 graceful,
3684 (graceful & graceful_pend_mask),
3685 100,
3686 timeout_usec);
3687 if (rc)
3688 dev_err(hdev->dev,
3689 "Failed to stop traffic from DCORE%d Decoder %d\n",
3690 dcore_id, dec_id);
3691 }
3692 }
3693
3694 static void gaudi2_stop_pcie_dec(struct hl_device *hdev)
3695 {
3696 u32 reg_val = FIELD_PREP(DCORE0_VDEC0_BRDG_CTRL_GRACEFUL_STOP_MASK, 0x1);
3697 u32 graceful_pend_mask = PCIE_VDEC0_BRDG_CTRL_GRACEFUL_PEND_MASK;
3698 u32 timeout_usec, dec_id, dec_bit, offset, graceful;
3699 int rc;
3700
3701 if (hdev->pldm)
3702 timeout_usec = GAUDI2_PLDM_VDEC_TIMEOUT_USEC;
3703 else
3704 timeout_usec = GAUDI2_VDEC_TIMEOUT_USEC;
3705
3706 for (dec_id = 0 ; dec_id < NUM_OF_DEC_PER_DCORE ; dec_id++) {
3707 dec_bit = PCIE_DEC_SHIFT + dec_id;
3708 if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))
3709 continue;
3710
3711 offset = dec_id * PCIE_VDEC_OFFSET;
3712
3713 WREG32(mmPCIE_DEC0_CMD_SWREG16 + offset, 0);
3714
3715 WREG32(mmPCIE_VDEC0_BRDG_CTRL_GRACEFUL + offset, reg_val);
3716
3717
3718
3719
3720 rc = hl_poll_timeout(
3721 hdev,
3722 mmPCIE_VDEC0_BRDG_CTRL_GRACEFUL + offset,
3723 graceful,
3724 (graceful & graceful_pend_mask),
3725 100,
3726 timeout_usec);
3727 if (rc)
3728 dev_err(hdev->dev,
3729 "Failed to stop traffic from PCIe Decoder %d\n",
3730 dec_id);
3731 }
3732 }
3733
3734 static void gaudi2_stop_dec(struct hl_device *hdev)
3735 {
3736 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3737 int dcore_id;
3738
3739 if ((gaudi2->dec_hw_cap_initialized & HW_CAP_DEC_MASK) == 0)
3740 return;
3741
3742 for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++)
3743 gaudi2_stop_dcore_dec(hdev, dcore_id);
3744
3745 gaudi2_stop_pcie_dec(hdev);
3746 }
3747
3748 static void gaudi2_halt_arc(struct hl_device *hdev, u32 cpu_id)
3749 {
3750 u32 reg_base, reg_val;
3751
3752 reg_base = gaudi2_arc_blocks_bases[cpu_id];
3753
3754
3755 reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_RUN_HALT_REQ_HALT_REQ_MASK, 1);
3756 WREG32(reg_base + ARC_HALT_REQ_OFFSET, reg_val);
3757 }
3758
3759 static void gaudi2_halt_arcs(struct hl_device *hdev)
3760 {
3761 u16 arc_id;
3762
3763 for (arc_id = CPU_ID_SCHED_ARC0; arc_id < CPU_ID_MAX; arc_id++) {
3764 if (gaudi2_is_arc_enabled(hdev, arc_id))
3765 gaudi2_halt_arc(hdev, arc_id);
3766 }
3767 }
3768
3769 static void gaudi2_reset_arcs(struct hl_device *hdev)
3770 {
3771 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3772 u16 arc_id;
3773
3774 if (!gaudi2)
3775 return;
3776
3777 for (arc_id = CPU_ID_SCHED_ARC0; arc_id < CPU_ID_MAX; arc_id++)
3778 if (gaudi2_is_arc_enabled(hdev, arc_id))
3779 gaudi2_clr_arc_id_cap(hdev, arc_id);
3780 }
3781
3782 static void gaudi2_nic_qmans_manual_flush(struct hl_device *hdev)
3783 {
3784 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3785 u32 queue_id;
3786 int i;
3787
3788 if (!(gaudi2->nic_hw_cap_initialized & HW_CAP_NIC_MASK))
3789 return;
3790
3791 queue_id = GAUDI2_QUEUE_ID_NIC_0_0;
3792
3793 for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++, queue_id += NUM_OF_PQ_PER_QMAN)
3794 gaudi2_qman_manual_flush_common(hdev, queue_id);
3795 }
3796
3797 static void gaudi2_halt_engines(struct hl_device *hdev, bool hard_reset, bool fw_reset)
3798 {
3799 u32 wait_timeout_ms;
3800
3801 if (hdev->pldm)
3802 wait_timeout_ms = GAUDI2_PLDM_RESET_WAIT_MSEC;
3803 else
3804 wait_timeout_ms = GAUDI2_RESET_WAIT_MSEC;
3805
3806 if (fw_reset)
3807 goto skip_engines;
3808
3809 gaudi2_stop_dma_qmans(hdev);
3810 gaudi2_stop_mme_qmans(hdev);
3811 gaudi2_stop_tpc_qmans(hdev);
3812 gaudi2_stop_rot_qmans(hdev);
3813 gaudi2_stop_nic_qmans(hdev);
3814 msleep(wait_timeout_ms);
3815
3816 gaudi2_halt_arcs(hdev);
3817 gaudi2_dma_stall(hdev);
3818 gaudi2_mme_stall(hdev);
3819 gaudi2_tpc_stall(hdev);
3820 gaudi2_rotator_stall(hdev);
3821
3822 msleep(wait_timeout_ms);
3823
3824 gaudi2_stop_dec(hdev);
3825
3826
3827
3828
3829
3830 if (!hard_reset)
3831 gaudi2_nic_qmans_manual_flush(hdev);
3832
3833 gaudi2_disable_dma_qmans(hdev);
3834 gaudi2_disable_mme_qmans(hdev);
3835 gaudi2_disable_tpc_qmans(hdev);
3836 gaudi2_disable_rot_qmans(hdev);
3837 gaudi2_disable_nic_qmans(hdev);
3838 gaudi2_disable_timestamp(hdev);
3839
3840 skip_engines:
3841 if (hard_reset) {
3842 gaudi2_disable_msix(hdev);
3843 return;
3844 }
3845
3846 gaudi2_sync_irqs(hdev);
3847 }
3848
3849 static void gaudi2_init_firmware_preload_params(struct hl_device *hdev)
3850 {
3851 struct pre_fw_load_props *pre_fw_load = &hdev->fw_loader.pre_fw_load;
3852
3853 pre_fw_load->cpu_boot_status_reg = mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS;
3854 pre_fw_load->sts_boot_dev_sts0_reg = mmCPU_BOOT_DEV_STS0;
3855 pre_fw_load->sts_boot_dev_sts1_reg = mmCPU_BOOT_DEV_STS1;
3856 pre_fw_load->boot_err0_reg = mmCPU_BOOT_ERR0;
3857 pre_fw_load->boot_err1_reg = mmCPU_BOOT_ERR1;
3858 pre_fw_load->wait_for_preboot_timeout = GAUDI2_PREBOOT_REQ_TIMEOUT_USEC;
3859 }
3860
3861 static void gaudi2_init_firmware_loader(struct hl_device *hdev)
3862 {
3863 struct fw_load_mgr *fw_loader = &hdev->fw_loader;
3864 struct dynamic_fw_load_mgr *dynamic_loader;
3865 struct cpu_dyn_regs *dyn_regs;
3866
3867
3868 fw_loader->fw_comp_loaded = FW_TYPE_NONE;
3869 fw_loader->boot_fit_img.image_name = GAUDI2_BOOT_FIT_FILE;
3870 fw_loader->linux_img.image_name = GAUDI2_LINUX_FW_FILE;
3871 fw_loader->boot_fit_timeout = GAUDI2_BOOT_FIT_REQ_TIMEOUT_USEC;
3872 fw_loader->skip_bmc = false;
3873 fw_loader->sram_bar_id = SRAM_CFG_BAR_ID;
3874 fw_loader->dram_bar_id = DRAM_BAR_ID;
3875
3876 if (hdev->asic_type == ASIC_GAUDI2 || hdev->asic_type == ASIC_GAUDI2_SEC)
3877 fw_loader->cpu_timeout = GAUDI2_CPU_TIMEOUT_USEC;
3878 else
3879 fw_loader->cpu_timeout = GAUDI2_FPGA_CPU_TIMEOUT;
3880
3881
3882
3883
3884
3885
3886
3887 dynamic_loader = &hdev->fw_loader.dynamic_loader;
3888 dyn_regs = &dynamic_loader->comm_desc.cpu_dyn_regs;
3889 dyn_regs->kmd_msg_to_cpu = cpu_to_le32(mmPSOC_GLOBAL_CONF_KMD_MSG_TO_CPU);
3890 dyn_regs->cpu_cmd_status_to_host = cpu_to_le32(mmCPU_CMD_STATUS_TO_HOST);
3891 dynamic_loader->wait_for_bl_timeout = GAUDI2_WAIT_FOR_BL_TIMEOUT_USEC;
3892 }
3893
3894 static int gaudi2_init_cpu(struct hl_device *hdev)
3895 {
3896 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3897 int rc;
3898
3899 if (!(hdev->fw_components & FW_TYPE_PREBOOT_CPU))
3900 return 0;
3901
3902 if (gaudi2->hw_cap_initialized & HW_CAP_CPU)
3903 return 0;
3904
3905 rc = hl_fw_init_cpu(hdev);
3906 if (rc)
3907 return rc;
3908
3909 gaudi2->hw_cap_initialized |= HW_CAP_CPU;
3910
3911 return 0;
3912 }
3913
3914 static int gaudi2_init_cpu_queues(struct hl_device *hdev, u32 cpu_timeout)
3915 {
3916 struct hl_hw_queue *cpu_pq = &hdev->kernel_queues[GAUDI2_QUEUE_ID_CPU_PQ];
3917 struct asic_fixed_properties *prop = &hdev->asic_prop;
3918 struct gaudi2_device *gaudi2 = hdev->asic_specific;
3919 struct cpu_dyn_regs *dyn_regs;
3920 struct hl_eq *eq;
3921 u32 status;
3922 int err;
3923
3924 if (!hdev->cpu_queues_enable)
3925 return 0;
3926
3927 if (gaudi2->hw_cap_initialized & HW_CAP_CPU_Q)
3928 return 0;
3929
3930 eq = &hdev->event_queue;
3931
3932 dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
3933
3934 WREG32(mmCPU_IF_PQ_BASE_ADDR_LOW, lower_32_bits(cpu_pq->bus_address));
3935 WREG32(mmCPU_IF_PQ_BASE_ADDR_HIGH, upper_32_bits(cpu_pq->bus_address));
3936
3937 WREG32(mmCPU_IF_EQ_BASE_ADDR_LOW, lower_32_bits(eq->bus_address));
3938 WREG32(mmCPU_IF_EQ_BASE_ADDR_HIGH, upper_32_bits(eq->bus_address));
3939
3940 WREG32(mmCPU_IF_CQ_BASE_ADDR_LOW, lower_32_bits(hdev->cpu_accessible_dma_address));
3941 WREG32(mmCPU_IF_CQ_BASE_ADDR_HIGH, upper_32_bits(hdev->cpu_accessible_dma_address));
3942
3943 WREG32(mmCPU_IF_PQ_LENGTH, HL_QUEUE_SIZE_IN_BYTES);
3944 WREG32(mmCPU_IF_EQ_LENGTH, HL_EQ_SIZE_IN_BYTES);
3945 WREG32(mmCPU_IF_CQ_LENGTH, HL_CPU_ACCESSIBLE_MEM_SIZE);
3946
3947
3948 WREG32(mmCPU_IF_EQ_RD_OFFS, 0);
3949
3950 WREG32(mmCPU_IF_PF_PQ_PI, 0);
3951
3952 WREG32(mmCPU_IF_QUEUE_INIT, PQ_INIT_STATUS_READY_FOR_CP);
3953
3954
3955
3956 WREG32(le32_to_cpu(dyn_regs->gic_host_pi_upd_irq),
3957 gaudi2_irq_map_table[GAUDI2_EVENT_CPU_PI_UPDATE].cpu_id);
3958
3959 err = hl_poll_timeout(
3960 hdev,
3961 mmCPU_IF_QUEUE_INIT,
3962 status,
3963 (status == PQ_INIT_STATUS_READY_FOR_HOST),
3964 1000,
3965 cpu_timeout);
3966
3967 if (err) {
3968 dev_err(hdev->dev, "Failed to communicate with device CPU (timeout)\n");
3969 return -EIO;
3970 }
3971
3972
3973 if (prop->fw_cpu_boot_dev_sts0_valid)
3974 prop->fw_app_cpu_boot_dev_sts0 = RREG32(mmCPU_BOOT_DEV_STS0);
3975
3976 if (prop->fw_cpu_boot_dev_sts1_valid)
3977 prop->fw_app_cpu_boot_dev_sts1 = RREG32(mmCPU_BOOT_DEV_STS1);
3978
3979 gaudi2->hw_cap_initialized |= HW_CAP_CPU_Q;
3980 return 0;
3981 }
3982
3983 static void gaudi2_init_qman_pq(struct hl_device *hdev, u32 reg_base,
3984 u32 queue_id_base)
3985 {
3986 struct hl_hw_queue *q;
3987 u32 pq_id, pq_offset;
3988
3989 for (pq_id = 0 ; pq_id < NUM_OF_PQ_PER_QMAN ; pq_id++) {
3990 q = &hdev->kernel_queues[queue_id_base + pq_id];
3991 pq_offset = pq_id * 4;
3992
3993 WREG32(reg_base + QM_PQ_BASE_LO_0_OFFSET + pq_offset,
3994 lower_32_bits(q->bus_address));
3995 WREG32(reg_base + QM_PQ_BASE_HI_0_OFFSET + pq_offset,
3996 upper_32_bits(q->bus_address));
3997 WREG32(reg_base + QM_PQ_SIZE_0_OFFSET + pq_offset, ilog2(HL_QUEUE_LENGTH));
3998 WREG32(reg_base + QM_PQ_PI_0_OFFSET + pq_offset, 0);
3999 WREG32(reg_base + QM_PQ_CI_0_OFFSET + pq_offset, 0);
4000 }
4001 }
4002
4003 static void gaudi2_init_qman_cp(struct hl_device *hdev, u32 reg_base)
4004 {
4005 u32 cp_id, cp_offset, mtr_base_lo, mtr_base_hi, so_base_lo, so_base_hi;
4006
4007 mtr_base_lo = lower_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
4008 mtr_base_hi = upper_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);
4009 so_base_lo = lower_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);
4010 so_base_hi = upper_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);
4011
4012 for (cp_id = 0 ; cp_id < NUM_OF_CP_PER_QMAN; cp_id++) {
4013 cp_offset = cp_id * 4;
4014
4015 WREG32(reg_base + QM_CP_MSG_BASE0_ADDR_LO_0_OFFSET + cp_offset, mtr_base_lo);
4016 WREG32(reg_base + QM_CP_MSG_BASE0_ADDR_HI_0_OFFSET + cp_offset, mtr_base_hi);
4017 WREG32(reg_base + QM_CP_MSG_BASE1_ADDR_LO_0_OFFSET + cp_offset, so_base_lo);
4018 WREG32(reg_base + QM_CP_MSG_BASE1_ADDR_HI_0_OFFSET + cp_offset, so_base_hi);
4019 }
4020
4021
4022 WREG32(reg_base + QM_CP_CFG_OFFSET, FIELD_PREP(PDMA0_QM_CP_CFG_SWITCH_EN_MASK, 0x1));
4023 }
4024
4025 static void gaudi2_init_qman_pqc(struct hl_device *hdev, u32 reg_base,
4026 u32 queue_id_base)
4027 {
4028 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4029 u32 pq_id, pq_offset, so_base_lo, so_base_hi;
4030
4031 so_base_lo = lower_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);
4032 so_base_hi = upper_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);
4033
4034 for (pq_id = 0 ; pq_id < NUM_OF_PQ_PER_QMAN ; pq_id++) {
4035 pq_offset = pq_id * 4;
4036
4037
4038 WREG32(reg_base + QM_PQC_HBW_BASE_LO_0_OFFSET + pq_offset,
4039 lower_32_bits(gaudi2->scratchpad_bus_address));
4040 WREG32(reg_base + QM_PQC_HBW_BASE_HI_0_OFFSET + pq_offset,
4041 upper_32_bits(gaudi2->scratchpad_bus_address));
4042 WREG32(reg_base + QM_PQC_SIZE_0_OFFSET + pq_offset,
4043 ilog2(PAGE_SIZE / sizeof(struct hl_cq_entry)));
4044
4045 WREG32(reg_base + QM_PQC_PI_0_OFFSET + pq_offset, 0);
4046 WREG32(reg_base + QM_PQC_LBW_WDATA_0_OFFSET + pq_offset, QM_PQC_LBW_WDATA);
4047 WREG32(reg_base + QM_PQC_LBW_BASE_LO_0_OFFSET + pq_offset, so_base_lo);
4048 WREG32(reg_base + QM_PQC_LBW_BASE_HI_0_OFFSET + pq_offset, so_base_hi);
4049 }
4050
4051
4052 WREG32(reg_base + QM_PQC_CFG_OFFSET, 1 << PDMA0_QM_PQC_CFG_EN_SHIFT);
4053 }
4054
4055 static u32 gaudi2_get_dyn_sp_reg(struct hl_device *hdev, u32 queue_id_base)
4056 {
4057 struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
4058 u32 sp_reg_addr;
4059
4060 switch (queue_id_base) {
4061 case GAUDI2_QUEUE_ID_PDMA_0_0...GAUDI2_QUEUE_ID_PDMA_1_3:
4062 fallthrough;
4063 case GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3:
4064 fallthrough;
4065 case GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3:
4066 fallthrough;
4067 case GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3:
4068 fallthrough;
4069 case GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3:
4070 sp_reg_addr = le32_to_cpu(dyn_regs->gic_dma_qm_irq_ctrl);
4071 break;
4072 case GAUDI2_QUEUE_ID_DCORE0_MME_0_0...GAUDI2_QUEUE_ID_DCORE0_MME_0_3:
4073 fallthrough;
4074 case GAUDI2_QUEUE_ID_DCORE1_MME_0_0...GAUDI2_QUEUE_ID_DCORE1_MME_0_3:
4075 fallthrough;
4076 case GAUDI2_QUEUE_ID_DCORE2_MME_0_0...GAUDI2_QUEUE_ID_DCORE2_MME_0_3:
4077 fallthrough;
4078 case GAUDI2_QUEUE_ID_DCORE3_MME_0_0...GAUDI2_QUEUE_ID_DCORE3_MME_0_3:
4079 sp_reg_addr = le32_to_cpu(dyn_regs->gic_mme_qm_irq_ctrl);
4080 break;
4081 case GAUDI2_QUEUE_ID_DCORE0_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE0_TPC_6_3:
4082 fallthrough;
4083 case GAUDI2_QUEUE_ID_DCORE1_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE1_TPC_5_3:
4084 fallthrough;
4085 case GAUDI2_QUEUE_ID_DCORE2_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE2_TPC_5_3:
4086 fallthrough;
4087 case GAUDI2_QUEUE_ID_DCORE3_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE3_TPC_5_3:
4088 sp_reg_addr = le32_to_cpu(dyn_regs->gic_tpc_qm_irq_ctrl);
4089 break;
4090 case GAUDI2_QUEUE_ID_ROT_0_0...GAUDI2_QUEUE_ID_ROT_1_3:
4091 sp_reg_addr = le32_to_cpu(dyn_regs->gic_rot_qm_irq_ctrl);
4092 break;
4093 case GAUDI2_QUEUE_ID_NIC_0_0...GAUDI2_QUEUE_ID_NIC_23_3:
4094 sp_reg_addr = le32_to_cpu(dyn_regs->gic_nic_qm_irq_ctrl);
4095 break;
4096 default:
4097 dev_err(hdev->dev, "Unexpected h/w queue %d\n", queue_id_base);
4098 return 0;
4099 }
4100
4101 return sp_reg_addr;
4102 }
4103
4104 static void gaudi2_init_qman_common(struct hl_device *hdev, u32 reg_base,
4105 u32 queue_id_base)
4106 {
4107 u32 glbl_prot = QMAN_MAKE_TRUSTED, irq_handler_offset;
4108 int map_table_entry;
4109
4110 WREG32(reg_base + QM_GLBL_PROT_OFFSET, glbl_prot);
4111
4112 irq_handler_offset = gaudi2_get_dyn_sp_reg(hdev, queue_id_base);
4113 WREG32(reg_base + QM_GLBL_ERR_ADDR_LO_OFFSET, lower_32_bits(CFG_BASE + irq_handler_offset));
4114 WREG32(reg_base + QM_GLBL_ERR_ADDR_HI_OFFSET, upper_32_bits(CFG_BASE + irq_handler_offset));
4115
4116 map_table_entry = gaudi2_qman_async_event_id[queue_id_base];
4117 WREG32(reg_base + QM_GLBL_ERR_WDATA_OFFSET,
4118 gaudi2_irq_map_table[map_table_entry].cpu_id);
4119
4120 WREG32(reg_base + QM_ARB_ERR_MSG_EN_OFFSET, QM_ARB_ERR_MSG_EN_MASK);
4121
4122 WREG32(reg_base + QM_ARB_SLV_CHOISE_WDT_OFFSET, GAUDI2_ARB_WDT_TIMEOUT);
4123 WREG32(reg_base + QM_GLBL_CFG1_OFFSET, 0);
4124 WREG32(reg_base + QM_GLBL_CFG2_OFFSET, 0);
4125
4126
4127
4128
4129
4130 if (reg_base == gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_PDMA_1_0])
4131 WREG32(reg_base + QM_GLBL_CFG0_OFFSET, PDMA1_QMAN_ENABLE);
4132 else
4133 WREG32(reg_base + QM_GLBL_CFG0_OFFSET, QMAN_ENABLE);
4134 }
4135
4136 static void gaudi2_init_qman(struct hl_device *hdev, u32 reg_base,
4137 u32 queue_id_base)
4138 {
4139 u32 pq_id;
4140
4141 for (pq_id = 0 ; pq_id < NUM_OF_PQ_PER_QMAN ; pq_id++)
4142 hdev->kernel_queues[queue_id_base + pq_id].cq_id = GAUDI2_RESERVED_CQ_CS_COMPLETION;
4143
4144 gaudi2_init_qman_pq(hdev, reg_base, queue_id_base);
4145 gaudi2_init_qman_cp(hdev, reg_base);
4146 gaudi2_init_qman_pqc(hdev, reg_base, queue_id_base);
4147 gaudi2_init_qman_common(hdev, reg_base, queue_id_base);
4148 }
4149
4150 static void gaudi2_init_dma_core(struct hl_device *hdev, u32 reg_base,
4151 u32 dma_core_id, bool is_secure)
4152 {
4153 u32 prot, irq_handler_offset;
4154 struct cpu_dyn_regs *dyn_regs;
4155 int map_table_entry;
4156
4157 prot = 1 << ARC_FARM_KDMA_PROT_ERR_VAL_SHIFT;
4158 if (is_secure)
4159 prot |= 1 << ARC_FARM_KDMA_PROT_VAL_SHIFT;
4160
4161 WREG32(reg_base + DMA_CORE_PROT_OFFSET, prot);
4162
4163 dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
4164 irq_handler_offset = le32_to_cpu(dyn_regs->gic_dma_core_irq_ctrl);
4165
4166 WREG32(reg_base + DMA_CORE_ERRMSG_ADDR_LO_OFFSET,
4167 lower_32_bits(CFG_BASE + irq_handler_offset));
4168
4169 WREG32(reg_base + DMA_CORE_ERRMSG_ADDR_HI_OFFSET,
4170 upper_32_bits(CFG_BASE + irq_handler_offset));
4171
4172 map_table_entry = gaudi2_dma_core_async_event_id[dma_core_id];
4173 WREG32(reg_base + DMA_CORE_ERRMSG_WDATA_OFFSET,
4174 gaudi2_irq_map_table[map_table_entry].cpu_id);
4175
4176
4177 WREG32(reg_base + DMA_CORE_CFG_0_OFFSET, 1 << ARC_FARM_KDMA_CFG_0_EN_SHIFT);
4178 }
4179
4180 static void gaudi2_init_kdma(struct hl_device *hdev)
4181 {
4182 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4183 u32 reg_base;
4184
4185 if ((gaudi2->hw_cap_initialized & HW_CAP_KDMA) == HW_CAP_KDMA)
4186 return;
4187
4188 reg_base = gaudi2_dma_core_blocks_bases[DMA_CORE_ID_KDMA];
4189
4190 gaudi2_init_dma_core(hdev, reg_base, DMA_CORE_ID_KDMA, true);
4191
4192 gaudi2->hw_cap_initialized |= HW_CAP_KDMA;
4193 }
4194
4195 static void gaudi2_init_pdma(struct hl_device *hdev)
4196 {
4197 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4198 u32 reg_base;
4199
4200 if ((gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK) == HW_CAP_PDMA_MASK)
4201 return;
4202
4203 reg_base = gaudi2_dma_core_blocks_bases[DMA_CORE_ID_PDMA0];
4204 gaudi2_init_dma_core(hdev, reg_base, DMA_CORE_ID_PDMA0, false);
4205
4206 reg_base = gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_PDMA_0_0];
4207 gaudi2_init_qman(hdev, reg_base, GAUDI2_QUEUE_ID_PDMA_0_0);
4208
4209 reg_base = gaudi2_dma_core_blocks_bases[DMA_CORE_ID_PDMA1];
4210 gaudi2_init_dma_core(hdev, reg_base, DMA_CORE_ID_PDMA1, false);
4211
4212 reg_base = gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_PDMA_1_0];
4213 gaudi2_init_qman(hdev, reg_base, GAUDI2_QUEUE_ID_PDMA_1_0);
4214
4215 gaudi2->hw_cap_initialized |= HW_CAP_PDMA_MASK;
4216 }
4217
4218 static void gaudi2_init_edma_instance(struct hl_device *hdev, u8 seq)
4219 {
4220 u32 reg_base, base_edma_core_id, base_edma_qman_id;
4221
4222 base_edma_core_id = DMA_CORE_ID_EDMA0 + seq;
4223 base_edma_qman_id = edma_stream_base[seq];
4224
4225 reg_base = gaudi2_dma_core_blocks_bases[base_edma_core_id];
4226 gaudi2_init_dma_core(hdev, reg_base, base_edma_core_id, false);
4227
4228 reg_base = gaudi2_qm_blocks_bases[base_edma_qman_id];
4229 gaudi2_init_qman(hdev, reg_base, base_edma_qman_id);
4230 }
4231
4232 static void gaudi2_init_edma(struct hl_device *hdev)
4233 {
4234 struct asic_fixed_properties *prop = &hdev->asic_prop;
4235 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4236 int dcore, inst;
4237
4238 if ((gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK) == HW_CAP_EDMA_MASK)
4239 return;
4240
4241 for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {
4242 for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {
4243 u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;
4244
4245 if (!(prop->edma_enabled_mask & BIT(seq)))
4246 continue;
4247
4248 gaudi2_init_edma_instance(hdev, seq);
4249
4250 gaudi2->hw_cap_initialized |= BIT_ULL(HW_CAP_EDMA_SHIFT + seq);
4251 }
4252 }
4253 }
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270 static void gaudi2_arm_monitors_for_virt_msix_db(struct hl_device *hdev, u32 sob_id,
4271 u32 first_mon_id, u32 interrupt_id)
4272 {
4273 u32 sob_offset, first_mon_offset, mon_offset, payload, sob_group, mode, arm, config;
4274 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4275 u64 addr;
4276 u8 mask;
4277
4278
4279 sob_offset = sob_id * sizeof(u32);
4280 WREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset, 0);
4281
4282
4283
4284
4285
4286
4287
4288 first_mon_offset = first_mon_id * sizeof(u32);
4289
4290
4291 mon_offset = first_mon_offset + sizeof(u32);
4292
4293 addr = CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;
4294 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, lower_32_bits(addr));
4295 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + mon_offset, upper_32_bits(addr));
4296
4297 payload = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_VAL_MASK, 0x7FFF) |
4298 FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_SIGN_MASK, 1) |
4299 FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_INC_MASK, 1);
4300 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, payload);
4301
4302
4303 mon_offset = first_mon_offset + 2 * sizeof(u32);
4304
4305 addr = CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + first_mon_offset;
4306 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, lower_32_bits(addr));
4307 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + mon_offset, upper_32_bits(addr));
4308
4309 sob_group = sob_id / 8;
4310 mask = ~BIT(sob_id & 0x7);
4311 mode = 0;
4312 arm = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SID_MASK, sob_group) |
4313 FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_MASK_MASK, mask) |
4314 FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOP_MASK, mode) |
4315 FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOD_MASK, 1);
4316
4317 payload = arm;
4318 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, payload);
4319
4320
4321 mon_offset = first_mon_offset;
4322
4323 config = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_WR_NUM_MASK, 2);
4324 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + mon_offset, config);
4325
4326 addr = gaudi2->virt_msix_db_dma_addr;
4327 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, lower_32_bits(addr));
4328 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + mon_offset, upper_32_bits(addr));
4329
4330 payload = interrupt_id;
4331 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, payload);
4332
4333 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + mon_offset, arm);
4334 }
4335
4336 static void gaudi2_prepare_sm_for_virt_msix_db(struct hl_device *hdev)
4337 {
4338 u32 decoder_id, sob_id, first_mon_id, interrupt_id;
4339 struct asic_fixed_properties *prop = &hdev->asic_prop;
4340
4341
4342 for (decoder_id = 0 ; decoder_id < NUMBER_OF_DEC ; ++decoder_id) {
4343 if (!(prop->decoder_enabled_mask & BIT(decoder_id)))
4344 continue;
4345
4346 sob_id = GAUDI2_RESERVED_SOB_DEC_NRM_FIRST + decoder_id;
4347 first_mon_id = GAUDI2_RESERVED_MON_DEC_NRM_FIRST + 3 * decoder_id;
4348 interrupt_id = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM + 2 * decoder_id;
4349 gaudi2_arm_monitors_for_virt_msix_db(hdev, sob_id, first_mon_id, interrupt_id);
4350
4351 sob_id = GAUDI2_RESERVED_SOB_DEC_ABNRM_FIRST + decoder_id;
4352 first_mon_id = GAUDI2_RESERVED_MON_DEC_ABNRM_FIRST + 3 * decoder_id;
4353 interrupt_id += 1;
4354 gaudi2_arm_monitors_for_virt_msix_db(hdev, sob_id, first_mon_id, interrupt_id);
4355 }
4356 }
4357
4358 static void gaudi2_init_sm(struct hl_device *hdev)
4359 {
4360 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4361 u64 cq_address;
4362 u32 reg_val;
4363 int i;
4364
4365
4366 reg_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_CQ_EN_MASK, 1);
4367 reg_val |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_LBW_EN_MASK, 1);
4368
4369 for (i = 0 ; i < GAUDI2_MAX_PENDING_CS ; i++)
4370 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + (4 * i), reg_val);
4371
4372
4373 reg_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_CQ_EN_MASK, 1);
4374 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + (4 * i), reg_val);
4375
4376
4377
4378
4379
4380
4381
4382 if (!hdev->pdev || hdev->asic_prop.fw_security_enabled) {
4383 u64 msix_db_reg = CFG_BASE + mmPCIE_DBI_MSIX_DOORBELL_OFF;
4384
4385 WREG32(mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0, lower_32_bits(msix_db_reg));
4386 WREG32(mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0, upper_32_bits(msix_db_reg));
4387 } else {
4388 WREG32(mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0,
4389 lower_32_bits(gaudi2->virt_msix_db_dma_addr));
4390 WREG32(mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0,
4391 upper_32_bits(gaudi2->virt_msix_db_dma_addr));
4392 }
4393 WREG32(mmDCORE0_SYNC_MNGR_GLBL_LBW_DATA_0, GAUDI2_IRQ_NUM_COMPLETION);
4394
4395 for (i = 0 ; i < GAUDI2_RESERVED_CQ_NUMBER ; i++) {
4396 cq_address =
4397 hdev->completion_queue[i].bus_address;
4398
4399 WREG32(mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_L_0 + (4 * i),
4400 lower_32_bits(cq_address));
4401 WREG32(mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_H_0 + (4 * i),
4402 upper_32_bits(cq_address));
4403 WREG32(mmDCORE0_SYNC_MNGR_GLBL_CQ_SIZE_LOG2_0 + (4 * i),
4404 ilog2(HL_CQ_SIZE_IN_BYTES));
4405 }
4406
4407
4408 WREG32(mmDCORE0_SYNC_MNGR_GLBL_ASID_SEC, 0x10000);
4409 WREG32(mmDCORE0_SYNC_MNGR_GLBL_ASID_NONE_SEC_PRIV, 0);
4410
4411
4412 gaudi2_prepare_sm_for_virt_msix_db(hdev);
4413 }
4414
4415 static void gaudi2_init_mme_acc(struct hl_device *hdev, u32 reg_base)
4416 {
4417 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4418 u32 reg_val;
4419 int i;
4420
4421 reg_val = FIELD_PREP(MME_ACC_INTR_MASK_WBC_ERR_RESP_MASK, 0);
4422 reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_SRC_POS_INF_MASK, 1);
4423 reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_SRC_NEG_INF_MASK, 1);
4424 reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_SRC_NAN_MASK, 1);
4425 reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_RESULT_POS_INF_MASK, 1);
4426 reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_RESULT_NEG_INF_MASK, 1);
4427
4428 WREG32(reg_base + MME_ACC_INTR_MASK_OFFSET, reg_val);
4429 WREG32(reg_base + MME_ACC_AP_LFSR_POLY_OFFSET, 0x80DEADAF);
4430
4431 for (i = 0 ; i < MME_NUM_OF_LFSR_SEEDS ; i++) {
4432 WREG32(reg_base + MME_ACC_AP_LFSR_SEED_SEL_OFFSET, i);
4433 WREG32(reg_base + MME_ACC_AP_LFSR_SEED_WDATA_OFFSET, gaudi2->lfsr_rand_seeds[i]);
4434 }
4435 }
4436
4437 static void gaudi2_init_dcore_mme(struct hl_device *hdev, int dcore_id,
4438 bool config_qman_only)
4439 {
4440 u32 queue_id_base, reg_base, clk_en_addr = 0;
4441
4442 switch (dcore_id) {
4443 case 0:
4444 queue_id_base = GAUDI2_QUEUE_ID_DCORE0_MME_0_0;
4445 break;
4446 case 1:
4447 queue_id_base = GAUDI2_QUEUE_ID_DCORE1_MME_0_0;
4448 clk_en_addr = mmDCORE1_MME_CTRL_LO_QM_SLV_CLK_EN;
4449 break;
4450 case 2:
4451 queue_id_base = GAUDI2_QUEUE_ID_DCORE2_MME_0_0;
4452 break;
4453 case 3:
4454 queue_id_base = GAUDI2_QUEUE_ID_DCORE3_MME_0_0;
4455 clk_en_addr = mmDCORE3_MME_CTRL_LO_QM_SLV_CLK_EN;
4456 break;
4457 default:
4458 dev_err(hdev->dev, "Invalid dcore id %u\n", dcore_id);
4459 return;
4460 }
4461
4462 if (clk_en_addr && !(hdev->fw_components & FW_TYPE_BOOT_CPU))
4463 WREG32(clk_en_addr, 0x1);
4464
4465 if (!config_qman_only) {
4466 reg_base = gaudi2_mme_acc_blocks_bases[dcore_id];
4467 gaudi2_init_mme_acc(hdev, reg_base);
4468 }
4469
4470 reg_base = gaudi2_qm_blocks_bases[queue_id_base];
4471 gaudi2_init_qman(hdev, reg_base, queue_id_base);
4472 }
4473
4474 static void gaudi2_init_mme(struct hl_device *hdev)
4475 {
4476 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4477 int i;
4478
4479 if ((gaudi2->hw_cap_initialized & HW_CAP_MME_MASK) == HW_CAP_MME_MASK)
4480 return;
4481
4482 for (i = 0 ; i < NUM_OF_DCORES ; i++) {
4483 gaudi2_init_dcore_mme(hdev, i, false);
4484
4485 gaudi2->hw_cap_initialized |= BIT_ULL(HW_CAP_MME_SHIFT + i);
4486 }
4487 }
4488
4489 static void gaudi2_init_tpc_cfg(struct hl_device *hdev, u32 reg_base)
4490 {
4491
4492 WREG32(reg_base + TPC_CFG_TPC_INTR_MASK_OFFSET, 0x23FFFE);
4493
4494
4495 WREG32(reg_base + TPC_CFG_MSS_CONFIG_OFFSET,
4496 2 << DCORE0_TPC0_CFG_MSS_CONFIG_ICACHE_FETCH_LINE_NUM_SHIFT);
4497 }
4498
4499 struct gaudi2_tpc_init_cfg_data {
4500 enum gaudi2_queue_id dcore_tpc_qid_base[NUM_OF_DCORES];
4501 };
4502
4503 static void gaudi2_init_tpc_config(struct hl_device *hdev, int dcore, int inst,
4504 u32 offset, void *data)
4505 {
4506 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4507 struct gaudi2_tpc_init_cfg_data *cfg_data = data;
4508 u32 queue_id_base;
4509 u8 seq;
4510
4511 queue_id_base = cfg_data->dcore_tpc_qid_base[dcore] + (inst * NUM_OF_PQ_PER_QMAN);
4512
4513 if (dcore == 0 && inst == (NUM_DCORE0_TPC - 1))
4514
4515 seq = NUM_OF_DCORES * NUM_OF_TPC_PER_DCORE;
4516 else
4517 seq = dcore * NUM_OF_TPC_PER_DCORE + inst;
4518
4519 gaudi2_init_tpc_cfg(hdev, mmDCORE0_TPC0_CFG_BASE + offset);
4520 gaudi2_init_qman(hdev, mmDCORE0_TPC0_QM_BASE + offset, queue_id_base);
4521
4522 gaudi2->tpc_hw_cap_initialized |= BIT_ULL(HW_CAP_TPC_SHIFT + seq);
4523 }
4524
4525 static void gaudi2_init_tpc(struct hl_device *hdev)
4526 {
4527 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4528 struct gaudi2_tpc_init_cfg_data init_cfg_data;
4529 struct iterate_module_ctx tpc_iter;
4530
4531 if (!hdev->asic_prop.tpc_enabled_mask)
4532 return;
4533
4534 if ((gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK) == HW_CAP_TPC_MASK)
4535 return;
4536
4537 init_cfg_data.dcore_tpc_qid_base[0] = GAUDI2_QUEUE_ID_DCORE0_TPC_0_0;
4538 init_cfg_data.dcore_tpc_qid_base[1] = GAUDI2_QUEUE_ID_DCORE1_TPC_0_0;
4539 init_cfg_data.dcore_tpc_qid_base[2] = GAUDI2_QUEUE_ID_DCORE2_TPC_0_0;
4540 init_cfg_data.dcore_tpc_qid_base[3] = GAUDI2_QUEUE_ID_DCORE3_TPC_0_0;
4541 tpc_iter.fn = &gaudi2_init_tpc_config;
4542 tpc_iter.data = &init_cfg_data;
4543 gaudi2_iterate_tpcs(hdev, &tpc_iter);
4544 }
4545
4546 static void gaudi2_init_rotator(struct hl_device *hdev)
4547 {
4548 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4549 u32 i, reg_base, queue_id;
4550
4551 queue_id = GAUDI2_QUEUE_ID_ROT_0_0;
4552
4553 for (i = 0 ; i < NUM_OF_ROT ; i++, queue_id += NUM_OF_PQ_PER_QMAN) {
4554 reg_base = gaudi2_qm_blocks_bases[queue_id];
4555 gaudi2_init_qman(hdev, reg_base, queue_id);
4556
4557 gaudi2->hw_cap_initialized |= BIT_ULL(HW_CAP_ROT_SHIFT + i);
4558 }
4559 }
4560
4561 static void gaudi2_init_vdec_brdg_ctrl(struct hl_device *hdev, u64 base_addr, u32 decoder_id)
4562 {
4563 u32 sob_id;
4564
4565
4566
4567
4568
4569 if (!hdev->pdev || hdev->asic_prop.fw_security_enabled) {
4570 u32 interrupt_id = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM + 2 * decoder_id;
4571
4572 WREG32(base_addr + BRDG_CTRL_NRM_MSIX_LBW_AWADDR, mmPCIE_DBI_MSIX_DOORBELL_OFF);
4573 WREG32(base_addr + BRDG_CTRL_NRM_MSIX_LBW_WDATA, interrupt_id);
4574 WREG32(base_addr + BRDG_CTRL_ABNRM_MSIX_LBW_AWADDR, mmPCIE_DBI_MSIX_DOORBELL_OFF);
4575 WREG32(base_addr + BRDG_CTRL_ABNRM_MSIX_LBW_WDATA, interrupt_id + 1);
4576 return;
4577 }
4578
4579
4580 sob_id = GAUDI2_RESERVED_SOB_DEC_NRM_FIRST + decoder_id;
4581 WREG32(base_addr + BRDG_CTRL_NRM_MSIX_LBW_AWADDR,
4582 mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_id * sizeof(u32));
4583 WREG32(base_addr + BRDG_CTRL_NRM_MSIX_LBW_WDATA, GAUDI2_SOB_INCREMENT_BY_ONE);
4584
4585
4586 sob_id = GAUDI2_RESERVED_SOB_DEC_ABNRM_FIRST + decoder_id;
4587 WREG32(base_addr + BRDG_CTRL_ABNRM_MSIX_LBW_AWADDR,
4588 mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_id * sizeof(u32));
4589 WREG32(base_addr + BRDG_CTRL_ABNRM_MSIX_LBW_WDATA, GAUDI2_SOB_INCREMENT_BY_ONE);
4590 }
4591
4592 static void gaudi2_init_dec(struct hl_device *hdev)
4593 {
4594 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4595 u32 dcore_id, dec_id, dec_bit;
4596 u64 base_addr;
4597
4598 if (!hdev->asic_prop.decoder_enabled_mask)
4599 return;
4600
4601 if ((gaudi2->dec_hw_cap_initialized & HW_CAP_DEC_MASK) == HW_CAP_DEC_MASK)
4602 return;
4603
4604 for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++)
4605 for (dec_id = 0 ; dec_id < NUM_OF_DEC_PER_DCORE ; dec_id++) {
4606 dec_bit = dcore_id * NUM_OF_DEC_PER_DCORE + dec_id;
4607
4608 if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))
4609 continue;
4610
4611 base_addr = mmDCORE0_DEC0_CMD_BASE +
4612 BRDG_CTRL_BLOCK_OFFSET +
4613 dcore_id * DCORE_OFFSET +
4614 dec_id * DCORE_VDEC_OFFSET;
4615
4616 gaudi2_init_vdec_brdg_ctrl(hdev, base_addr, dec_bit);
4617
4618 gaudi2->dec_hw_cap_initialized |= BIT_ULL(HW_CAP_DEC_SHIFT + dec_bit);
4619 }
4620
4621 for (dec_id = 0 ; dec_id < NUM_OF_PCIE_VDEC ; dec_id++) {
4622 dec_bit = PCIE_DEC_SHIFT + dec_id;
4623 if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))
4624 continue;
4625
4626 base_addr = mmPCIE_DEC0_CMD_BASE + BRDG_CTRL_BLOCK_OFFSET +
4627 dec_id * DCORE_VDEC_OFFSET;
4628
4629 gaudi2_init_vdec_brdg_ctrl(hdev, base_addr, dec_bit);
4630
4631 gaudi2->dec_hw_cap_initialized |= BIT_ULL(HW_CAP_DEC_SHIFT + dec_bit);
4632 }
4633 }
4634
4635 static void gaudi2_init_msix_gw_table(struct hl_device *hdev)
4636 {
4637 u32 first_reg_offset, last_reg_offset, msix_gw_table_base;
4638 u8 first_bit, last_bit;
4639 int i;
4640
4641 msix_gw_table_base = mmPCIE_WRAP_MSIX_GW_TABLE_0;
4642 first_reg_offset = (GAUDI2_IRQ_NUM_USER_FIRST >> 5) << 2;
4643 first_bit = GAUDI2_IRQ_NUM_USER_FIRST % 32;
4644 last_reg_offset = (GAUDI2_IRQ_NUM_USER_LAST >> 5) << 2;
4645 last_bit = GAUDI2_IRQ_NUM_USER_LAST % 32;
4646
4647 if (first_reg_offset == last_reg_offset) {
4648 WREG32(msix_gw_table_base + first_reg_offset, GENMASK(last_bit, first_bit));
4649 return;
4650 }
4651
4652 WREG32(msix_gw_table_base + first_reg_offset, GENMASK(31, first_bit));
4653 WREG32(msix_gw_table_base + last_reg_offset, GENMASK(last_bit, 0));
4654
4655 for (i = first_reg_offset + 4; i < last_reg_offset ; i += 4)
4656 WREG32(msix_gw_table_base + i, 0xFFFFFFFF);
4657 }
4658
4659 static int gaudi2_mmu_update_asid_hop0_addr(struct hl_device *hdev,
4660 u32 stlb_base, u32 asid, u64 phys_addr)
4661 {
4662 u32 status, timeout_usec;
4663 int rc;
4664
4665 if (hdev->pldm || !hdev->pdev)
4666 timeout_usec = GAUDI2_PLDM_MMU_TIMEOUT_USEC;
4667 else
4668 timeout_usec = MMU_CONFIG_TIMEOUT_USEC;
4669
4670 WREG32(stlb_base + STLB_ASID_OFFSET, asid);
4671 WREG32(stlb_base + STLB_HOP0_PA43_12_OFFSET, phys_addr >> MMU_HOP0_PA43_12_SHIFT);
4672 WREG32(stlb_base + STLB_HOP0_PA63_44_OFFSET, phys_addr >> MMU_HOP0_PA63_44_SHIFT);
4673 WREG32(stlb_base + STLB_BUSY_OFFSET, 0x80000000);
4674
4675 rc = hl_poll_timeout(
4676 hdev,
4677 stlb_base + STLB_BUSY_OFFSET,
4678 status,
4679 !(status & 0x80000000),
4680 1000,
4681 timeout_usec);
4682
4683 if (rc) {
4684 dev_err(hdev->dev, "Timeout during MMU hop0 config of asid %d\n", asid);
4685 return rc;
4686 }
4687
4688 return 0;
4689 }
4690
4691 static void gaudi2_mmu_send_invalidate_cache_cmd(struct hl_device *hdev, u32 stlb_base,
4692 u32 start_offset, u32 inv_start_val,
4693 u32 flags)
4694 {
4695
4696 if (flags & MMU_OP_CLEAR_MEMCACHE)
4697 WREG32(mmPMMU_HBW_STLB_MEM_CACHE_INVALIDATION, 0x1);
4698
4699 if (flags & MMU_OP_SKIP_LOW_CACHE_INV)
4700 return;
4701
4702 WREG32(stlb_base + start_offset, inv_start_val);
4703 }
4704
4705 static int gaudi2_mmu_invalidate_cache_status_poll(struct hl_device *hdev, u32 stlb_base,
4706 struct gaudi2_cache_invld_params *inv_params)
4707 {
4708 u32 status, timeout_usec, start_offset;
4709 int rc;
4710
4711 timeout_usec = (hdev->pldm) ? GAUDI2_PLDM_MMU_TIMEOUT_USEC :
4712 GAUDI2_MMU_CACHE_INV_TIMEOUT_USEC;
4713
4714
4715 if (inv_params->flags & MMU_OP_CLEAR_MEMCACHE) {
4716 rc = hl_poll_timeout(
4717 hdev,
4718 mmPMMU_HBW_STLB_MEM_CACHE_INV_STATUS,
4719 status,
4720 status & 0x1,
4721 1000,
4722 timeout_usec);
4723
4724 if (rc)
4725 return rc;
4726
4727
4728 WREG32(mmPMMU_HBW_STLB_MEM_CACHE_INV_STATUS, 0x0);
4729 }
4730
4731
4732
4733
4734 if (inv_params->flags & MMU_OP_SKIP_LOW_CACHE_INV)
4735 return 0;
4736
4737 start_offset = inv_params->range_invalidation ?
4738 STLB_RANGE_CACHE_INVALIDATION_OFFSET : STLB_INV_ALL_START_OFFSET;
4739
4740 rc = hl_poll_timeout(
4741 hdev,
4742 stlb_base + start_offset,
4743 status,
4744 !(status & 0x1),
4745 1000,
4746 timeout_usec);
4747
4748 return rc;
4749 }
4750
4751 bool gaudi2_is_hmmu_enabled(struct hl_device *hdev, int dcore_id, int hmmu_id)
4752 {
4753 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4754 u32 hw_cap;
4755
4756 hw_cap = HW_CAP_DCORE0_DMMU0 << (NUM_OF_HMMU_PER_DCORE * dcore_id + hmmu_id);
4757
4758 if (gaudi2->hw_cap_initialized & hw_cap)
4759 return true;
4760
4761 return false;
4762 }
4763
4764
4765 static inline u32 get_hmmu_stlb_base(int dcore_id, int hmmu_id)
4766 {
4767 u32 offset;
4768
4769 offset = (u32) (dcore_id * DCORE_OFFSET + hmmu_id * DCORE_HMMU_OFFSET);
4770 return (u32)(mmDCORE0_HMMU0_STLB_BASE + offset);
4771 }
4772
4773 static void gaudi2_mmu_invalidate_cache_trigger(struct hl_device *hdev, u32 stlb_base,
4774 struct gaudi2_cache_invld_params *inv_params)
4775 {
4776 u32 start_offset;
4777
4778 if (inv_params->range_invalidation) {
4779
4780
4781
4782
4783
4784
4785 u64 start = inv_params->start_va - 1;
4786
4787 start_offset = STLB_RANGE_CACHE_INVALIDATION_OFFSET;
4788
4789 WREG32(stlb_base + STLB_RANGE_INV_START_LSB_OFFSET,
4790 start >> MMU_RANGE_INV_VA_LSB_SHIFT);
4791
4792 WREG32(stlb_base + STLB_RANGE_INV_START_MSB_OFFSET,
4793 start >> MMU_RANGE_INV_VA_MSB_SHIFT);
4794
4795 WREG32(stlb_base + STLB_RANGE_INV_END_LSB_OFFSET,
4796 inv_params->end_va >> MMU_RANGE_INV_VA_LSB_SHIFT);
4797
4798 WREG32(stlb_base + STLB_RANGE_INV_END_MSB_OFFSET,
4799 inv_params->end_va >> MMU_RANGE_INV_VA_MSB_SHIFT);
4800 } else {
4801 start_offset = STLB_INV_ALL_START_OFFSET;
4802 }
4803
4804 gaudi2_mmu_send_invalidate_cache_cmd(hdev, stlb_base, start_offset,
4805 inv_params->inv_start_val, inv_params->flags);
4806 }
4807
4808 static inline void gaudi2_hmmu_invalidate_cache_trigger(struct hl_device *hdev,
4809 int dcore_id, int hmmu_id,
4810 struct gaudi2_cache_invld_params *inv_params)
4811 {
4812 u32 stlb_base = get_hmmu_stlb_base(dcore_id, hmmu_id);
4813
4814 gaudi2_mmu_invalidate_cache_trigger(hdev, stlb_base, inv_params);
4815 }
4816
4817 static inline int gaudi2_hmmu_invalidate_cache_status_poll(struct hl_device *hdev,
4818 int dcore_id, int hmmu_id,
4819 struct gaudi2_cache_invld_params *inv_params)
4820 {
4821 u32 stlb_base = get_hmmu_stlb_base(dcore_id, hmmu_id);
4822
4823 return gaudi2_mmu_invalidate_cache_status_poll(hdev, stlb_base, inv_params);
4824 }
4825
4826 static int gaudi2_hmmus_invalidate_cache(struct hl_device *hdev,
4827 struct gaudi2_cache_invld_params *inv_params)
4828 {
4829 int dcore_id, hmmu_id;
4830
4831
4832 for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {
4833 for (hmmu_id = 0 ; hmmu_id < NUM_OF_HMMU_PER_DCORE ; hmmu_id++) {
4834 if (!gaudi2_is_hmmu_enabled(hdev, dcore_id, hmmu_id))
4835 continue;
4836
4837 gaudi2_hmmu_invalidate_cache_trigger(hdev, dcore_id, hmmu_id, inv_params);
4838 }
4839 }
4840
4841
4842 for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {
4843 for (hmmu_id = 0 ; hmmu_id < NUM_OF_HMMU_PER_DCORE ; hmmu_id++) {
4844 int rc;
4845
4846 if (!gaudi2_is_hmmu_enabled(hdev, dcore_id, hmmu_id))
4847 continue;
4848
4849 rc = gaudi2_hmmu_invalidate_cache_status_poll(hdev, dcore_id, hmmu_id,
4850 inv_params);
4851 if (rc)
4852 return rc;
4853 }
4854 }
4855
4856 return 0;
4857 }
4858
4859 static int gaudi2_mmu_invalidate_cache(struct hl_device *hdev, bool is_hard, u32 flags)
4860 {
4861 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4862 struct gaudi2_cache_invld_params invld_params;
4863 int rc = 0;
4864
4865 if (hdev->reset_info.hard_reset_pending)
4866 return rc;
4867
4868 invld_params.range_invalidation = false;
4869 invld_params.inv_start_val = 1;
4870
4871 if ((flags & MMU_OP_USERPTR) && (gaudi2->hw_cap_initialized & HW_CAP_PMMU)) {
4872 invld_params.flags = flags;
4873 gaudi2_mmu_invalidate_cache_trigger(hdev, mmPMMU_HBW_STLB_BASE, &invld_params);
4874 rc = gaudi2_mmu_invalidate_cache_status_poll(hdev, mmPMMU_HBW_STLB_BASE,
4875 &invld_params);
4876 } else if (flags & MMU_OP_PHYS_PACK) {
4877 invld_params.flags = 0;
4878 rc = gaudi2_hmmus_invalidate_cache(hdev, &invld_params);
4879 }
4880
4881 return rc;
4882 }
4883
4884 static int gaudi2_mmu_invalidate_cache_range(struct hl_device *hdev, bool is_hard,
4885 u32 flags, u32 asid, u64 va, u64 size)
4886 {
4887 struct gaudi2_cache_invld_params invld_params = {0};
4888 struct gaudi2_device *gaudi2 = hdev->asic_specific;
4889 u64 start_va, end_va;
4890 u32 inv_start_val;
4891 int rc = 0;
4892
4893 if (hdev->reset_info.hard_reset_pending)
4894 return 0;
4895
4896 inv_start_val = (1 << MMU_RANGE_INV_EN_SHIFT |
4897 1 << MMU_RANGE_INV_ASID_EN_SHIFT |
4898 asid << MMU_RANGE_INV_ASID_SHIFT);
4899 start_va = va;
4900 end_va = start_va + size;
4901
4902 if ((flags & MMU_OP_USERPTR) && (gaudi2->hw_cap_initialized & HW_CAP_PMMU)) {
4903
4904
4905
4906 if (start_va) {
4907 invld_params.range_invalidation = true;
4908 invld_params.start_va = start_va;
4909 invld_params.end_va = end_va;
4910 invld_params.inv_start_val = inv_start_val;
4911 invld_params.flags = flags | MMU_OP_CLEAR_MEMCACHE;
4912 } else {
4913 invld_params.range_invalidation = false;
4914 invld_params.inv_start_val = 1;
4915 invld_params.flags = flags;
4916 }
4917
4918
4919 gaudi2_mmu_invalidate_cache_trigger(hdev, mmPMMU_HBW_STLB_BASE, &invld_params);
4920 rc = gaudi2_mmu_invalidate_cache_status_poll(hdev, mmPMMU_HBW_STLB_BASE,
4921 &invld_params);
4922 if (rc)
4923 return rc;
4924
4925 } else if (flags & MMU_OP_PHYS_PACK) {
4926 invld_params.start_va = gaudi2_mmu_scramble_addr(hdev, start_va);
4927 invld_params.end_va = gaudi2_mmu_scramble_addr(hdev, end_va);
4928 invld_params.inv_start_val = inv_start_val;
4929 invld_params.flags = flags;
4930 rc = gaudi2_hmmus_invalidate_cache(hdev, &invld_params);
4931 }
4932
4933 return rc;
4934 }
4935
4936 static int gaudi2_mmu_update_hop0_addr(struct hl_device *hdev, u32 stlb_base)
4937 {
4938 struct asic_fixed_properties *prop = &hdev->asic_prop;
4939 u64 hop0_addr;
4940 u32 asid, max_asid = prop->max_asid;
4941 int rc;
4942
4943
4944 if (hdev->pldm)
4945 max_asid = min((u32) 8, max_asid);
4946
4947 for (asid = 0 ; asid < max_asid ; asid++) {
4948 hop0_addr = hdev->mmu_priv.hr.mmu_asid_hop0[asid].phys_addr;
4949 rc = gaudi2_mmu_update_asid_hop0_addr(hdev, stlb_base, asid, hop0_addr);
4950 if (rc) {
4951 dev_err(hdev->dev, "failed to set hop0 addr for asid %d\n", asid);
4952 return rc;
4953 }
4954 }
4955
4956 return 0;
4957 }
4958
4959 static int gaudi2_mmu_init_common(struct hl_device *hdev, u32 mmu_base,
4960 u32 stlb_base)
4961 {
4962 u32 status, timeout_usec;
4963 int rc;
4964
4965 if (hdev->pldm || !hdev->pdev)
4966 timeout_usec = GAUDI2_PLDM_MMU_TIMEOUT_USEC;
4967 else
4968 timeout_usec = GAUDI2_MMU_CACHE_INV_TIMEOUT_USEC;
4969
4970 WREG32(stlb_base + STLB_INV_ALL_START_OFFSET, 1);
4971
4972 rc = hl_poll_timeout(
4973 hdev,
4974 stlb_base + STLB_SRAM_INIT_OFFSET,
4975 status,
4976 !status,
4977 1000,
4978 timeout_usec);
4979
4980 if (rc)
4981 dev_notice_ratelimited(hdev->dev, "Timeout when waiting for MMU SRAM init\n");
4982
4983 rc = gaudi2_mmu_update_hop0_addr(hdev, stlb_base);
4984 if (rc)
4985 return rc;
4986
4987 WREG32(mmu_base + MMU_BYPASS_OFFSET, 0);
4988 WREG32(mmu_base + MMU_SPI_SEI_MASK_OFFSET, 0xF);
4989
4990 rc = hl_poll_timeout(
4991 hdev,
4992 stlb_base + STLB_INV_ALL_START_OFFSET,
4993 status,
4994 !status,
4995 1000,
4996 timeout_usec);
4997
4998 if (rc)
4999 dev_notice_ratelimited(hdev->dev, "Timeout when waiting for MMU invalidate all\n");
5000
5001 WREG32(mmu_base + MMU_ENABLE_OFFSET, 1);
5002
5003 return rc;
5004 }
5005
5006 static int gaudi2_pci_mmu_init(struct hl_device *hdev)
5007 {
5008 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5009 u32 mmu_base, stlb_base;
5010 int rc;
5011
5012 if (gaudi2->hw_cap_initialized & HW_CAP_PMMU)
5013 return 0;
5014
5015 mmu_base = mmPMMU_HBW_MMU_BASE;
5016 stlb_base = mmPMMU_HBW_STLB_BASE;
5017
5018 RMWREG32(stlb_base + STLB_HOP_CONFIGURATION_OFFSET,
5019 (0 << PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_HOP_SHIFT) |
5020 (5 << PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_SHIFT) |
5021 (4 << PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_SHIFT) |
5022 (5 << PMMU_HBW_STLB_HOP_CONFIGURATION_LAST_HOP_SHIFT) |
5023 (5 << PMMU_HBW_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_SHIFT),
5024 PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_HOP_MASK |
5025 PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_MASK |
5026 PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_MASK |
5027 PMMU_HBW_STLB_HOP_CONFIGURATION_LAST_HOP_MASK |
5028 PMMU_HBW_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_MASK);
5029
5030 WREG32(stlb_base + STLB_LL_LOOKUP_MASK_63_32_OFFSET, 0);
5031
5032 if (PAGE_SIZE == SZ_64K) {
5033
5034 RMWREG32(mmu_base + MMU_STATIC_MULTI_PAGE_SIZE_OFFSET,
5035 FIELD_PREP(DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP5_PAGE_SIZE_MASK, 4) |
5036 FIELD_PREP(DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP4_PAGE_SIZE_MASK, 3) |
5037 FIELD_PREP(
5038 DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_CFG_8_BITS_HOP_MODE_EN_MASK,
5039 1),
5040 DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP5_PAGE_SIZE_MASK |
5041 DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP4_PAGE_SIZE_MASK |
5042 DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_CFG_8_BITS_HOP_MODE_EN_MASK);
5043 }
5044
5045 rc = gaudi2_mmu_init_common(hdev, mmu_base, stlb_base);
5046 if (rc)
5047 return rc;
5048
5049 gaudi2->hw_cap_initialized |= HW_CAP_PMMU;
5050
5051 return 0;
5052 }
5053
5054 static int gaudi2_dcore_hmmu_init(struct hl_device *hdev, int dcore_id,
5055 int hmmu_id)
5056 {
5057 struct asic_fixed_properties *prop = &hdev->asic_prop;
5058 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5059 u32 offset, mmu_base, stlb_base, hw_cap;
5060 u8 dmmu_seq;
5061 int rc;
5062
5063 dmmu_seq = NUM_OF_HMMU_PER_DCORE * dcore_id + hmmu_id;
5064 hw_cap = HW_CAP_DCORE0_DMMU0 << dmmu_seq;
5065
5066
5067
5068
5069
5070 if ((gaudi2->hw_cap_initialized & hw_cap) || !(prop->hmmu_hif_enabled_mask & BIT(dmmu_seq)))
5071 return 0;
5072
5073 offset = (u32) (dcore_id * DCORE_OFFSET + hmmu_id * DCORE_HMMU_OFFSET);
5074 mmu_base = mmDCORE0_HMMU0_MMU_BASE + offset;
5075 stlb_base = mmDCORE0_HMMU0_STLB_BASE + offset;
5076
5077 RMWREG32(mmu_base + MMU_STATIC_MULTI_PAGE_SIZE_OFFSET, 5 ,
5078 MMU_STATIC_MULTI_PAGE_SIZE_HOP4_PAGE_SIZE_MASK);
5079
5080 RMWREG32(stlb_base + STLB_HOP_CONFIGURATION_OFFSET,
5081 FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_HOP_MASK, 0) |
5082 FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_MASK, 3) |
5083 FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_MASK, 3) |
5084 FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_LAST_HOP_MASK, 3) |
5085 FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_MASK, 3),
5086 DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_HOP_MASK |
5087 DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_MASK |
5088 DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_MASK |
5089 DCORE0_HMMU0_STLB_HOP_CONFIGURATION_LAST_HOP_MASK |
5090 DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_MASK);
5091
5092 RMWREG32(stlb_base + STLB_HOP_CONFIGURATION_OFFSET, 1,
5093 STLB_HOP_CONFIGURATION_ONLY_LARGE_PAGE_MASK);
5094
5095 rc = gaudi2_mmu_init_common(hdev, mmu_base, stlb_base);
5096 if (rc)
5097 return rc;
5098
5099 gaudi2->hw_cap_initialized |= hw_cap;
5100
5101 return 0;
5102 }
5103
5104 static int gaudi2_hbm_mmu_init(struct hl_device *hdev)
5105 {
5106 int rc, dcore_id, hmmu_id;
5107
5108 for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++)
5109 for (hmmu_id = 0 ; hmmu_id < NUM_OF_HMMU_PER_DCORE; hmmu_id++) {
5110 rc = gaudi2_dcore_hmmu_init(hdev, dcore_id, hmmu_id);
5111 if (rc)
5112 return rc;
5113 }
5114
5115 return 0;
5116 }
5117
5118 static int gaudi2_mmu_init(struct hl_device *hdev)
5119 {
5120 int rc;
5121
5122 rc = gaudi2_pci_mmu_init(hdev);
5123 if (rc)
5124 return rc;
5125
5126 rc = gaudi2_hbm_mmu_init(hdev);
5127 if (rc)
5128 return rc;
5129
5130 return 0;
5131 }
5132
5133 static int gaudi2_hw_init(struct hl_device *hdev)
5134 {
5135 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5136 int rc;
5137
5138
5139
5140
5141
5142
5143 WREG32(mmHW_STATE, HL_DEVICE_HW_STATE_DIRTY);
5144
5145
5146 RREG32(mmHW_STATE);
5147
5148
5149
5150
5151
5152 if (hdev->asic_prop.iatu_done_by_fw)
5153 gaudi2->dram_bar_cur_addr = DRAM_PHYS_BASE;
5154
5155
5156
5157
5158
5159 if (gaudi2_set_hbm_bar_base(hdev, DRAM_PHYS_BASE) == U64_MAX) {
5160 dev_err(hdev->dev, "failed to map HBM bar to DRAM base address\n");
5161 return -EIO;
5162 }
5163
5164 rc = gaudi2_init_cpu(hdev);
5165 if (rc) {
5166 dev_err(hdev->dev, "failed to initialize CPU\n");
5167 return rc;
5168 }
5169
5170 gaudi2_init_msix_gw_table(hdev);
5171
5172 gaudi2_init_scrambler_hbm(hdev);
5173 gaudi2_init_kdma(hdev);
5174
5175 rc = gaudi2_init_cpu_queues(hdev, GAUDI2_CPU_TIMEOUT_USEC);
5176 if (rc) {
5177 dev_err(hdev->dev, "failed to initialize CPU H/W queues %d\n", rc);
5178 return rc;
5179 }
5180
5181 rc = gaudi2->cpucp_info_get(hdev);
5182 if (rc) {
5183 dev_err(hdev->dev, "Failed to get cpucp info\n");
5184 return rc;
5185 }
5186
5187 rc = gaudi2_mmu_init(hdev);
5188 if (rc)
5189 return rc;
5190
5191 gaudi2_init_pdma(hdev);
5192 gaudi2_init_edma(hdev);
5193 gaudi2_init_sm(hdev);
5194 gaudi2_init_tpc(hdev);
5195 gaudi2_init_mme(hdev);
5196 gaudi2_init_rotator(hdev);
5197 gaudi2_init_dec(hdev);
5198 gaudi2_enable_timestamp(hdev);
5199
5200 rc = gaudi2_coresight_init(hdev);
5201 if (rc)
5202 goto disable_queues;
5203
5204 rc = gaudi2_enable_msix(hdev);
5205 if (rc)
5206 goto disable_queues;
5207
5208
5209 RREG32(mmHW_STATE);
5210
5211 return 0;
5212
5213 disable_queues:
5214 gaudi2_disable_dma_qmans(hdev);
5215 gaudi2_disable_mme_qmans(hdev);
5216 gaudi2_disable_tpc_qmans(hdev);
5217 gaudi2_disable_rot_qmans(hdev);
5218 gaudi2_disable_nic_qmans(hdev);
5219
5220 gaudi2_disable_timestamp(hdev);
5221
5222 return rc;
5223 }
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233 static void gaudi2_send_hard_reset_cmd(struct hl_device *hdev)
5234 {
5235 struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
5236 bool heartbeat_reset, preboot_only, cpu_initialized = false;
5237 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5238 u32 cpu_boot_status;
5239
5240 preboot_only = (hdev->fw_loader.fw_comp_loaded == FW_TYPE_PREBOOT_CPU);
5241 heartbeat_reset = (hdev->reset_info.curr_reset_cause == HL_RESET_CAUSE_HEARTBEAT);
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254 cpu_boot_status = RREG32(mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS);
5255
5256 if (gaudi2 && (gaudi2->hw_cap_initialized & HW_CAP_CPU) &&
5257 (cpu_boot_status == CPU_BOOT_STATUS_SRAM_AVAIL))
5258 cpu_initialized = true;
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268 if (!preboot_only && cpu_initialized) {
5269 WREG32(le32_to_cpu(dyn_regs->gic_host_halt_irq),
5270 gaudi2_irq_map_table[GAUDI2_EVENT_CPU_HALT_MACHINE].cpu_id);
5271
5272 msleep(GAUDI2_CPU_RESET_WAIT_MSEC);
5273 }
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292 if (heartbeat_reset || preboot_only || !cpu_initialized) {
5293 if (hdev->asic_prop.hard_reset_done_by_fw)
5294 hl_fw_ask_hard_reset_without_linux(hdev);
5295 else
5296 hl_fw_ask_halt_machine_without_linux(hdev);
5297 }
5298 }
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308 static void gaudi2_execute_hard_reset(struct hl_device *hdev, u32 reset_sleep_ms)
5309 {
5310 if (hdev->asic_prop.hard_reset_done_by_fw) {
5311 gaudi2_send_hard_reset_cmd(hdev);
5312 return;
5313 }
5314
5315
5316
5317
5318 WREG32(mmPCIE_AUX_FLR_CTRL,
5319 (PCIE_AUX_FLR_CTRL_HW_CTRL_MASK | PCIE_AUX_FLR_CTRL_INT_MASK_MASK));
5320
5321 gaudi2_send_hard_reset_cmd(hdev);
5322
5323 WREG32(mmPSOC_RESET_CONF_SW_ALL_RST, 1);
5324 }
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335 static void gaudi2_execute_soft_reset(struct hl_device *hdev, u32 reset_sleep_ms,
5336 bool driver_performs_reset)
5337 {
5338 struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
5339
5340 if (!driver_performs_reset) {
5341
5342 WREG32(mmCPU_RST_STATUS_TO_HOST, CPU_RST_STATUS_NA);
5343
5344 WREG32(le32_to_cpu(dyn_regs->gic_host_soft_rst_irq),
5345 gaudi2_irq_map_table[GAUDI2_EVENT_CPU_SOFT_RESET].cpu_id);
5346 return;
5347 }
5348
5349
5350
5351
5352
5353 gaudi2_write_rr_to_all_lbw_rtrs(hdev, RR_TYPE_LONG, NUM_LONG_LBW_RR - 1,
5354 mmDCORE0_TPC0_QM_DCCM_BASE, mmPCIE_MSIX_BASE);
5355
5356 gaudi2_write_rr_to_all_lbw_rtrs(hdev, RR_TYPE_LONG, NUM_LONG_LBW_RR - 2,
5357 mmPCIE_MSIX_BASE + HL_BLOCK_SIZE,
5358 mmPCIE_VDEC1_MSTR_IF_RR_SHRD_HBW_BASE + HL_BLOCK_SIZE);
5359
5360 WREG32(mmPSOC_RESET_CONF_SOFT_RST, 1);
5361 }
5362
5363 static void gaudi2_poll_btm_indication(struct hl_device *hdev, u32 reset_sleep_ms,
5364 u32 poll_timeout_us)
5365 {
5366 int i, rc = 0;
5367 u32 reg_val;
5368
5369
5370 msleep(reset_sleep_ms);
5371
5372
5373
5374
5375 for (i = 0 ; i < GAUDI2_RESET_POLL_CNT ; i++)
5376 rc = hl_poll_timeout(
5377 hdev,
5378 mmPSOC_GLOBAL_CONF_BTM_FSM,
5379 reg_val,
5380 reg_val == 0,
5381 1000,
5382 poll_timeout_us);
5383
5384 if (rc)
5385 dev_err(hdev->dev, "Timeout while waiting for device to reset 0x%x\n", reg_val);
5386 }
5387
5388 static void gaudi2_get_soft_rst_done_indication(struct hl_device *hdev, u32 poll_timeout_us)
5389 {
5390 int i, rc = 0;
5391 u32 reg_val;
5392
5393 for (i = 0 ; i < GAUDI2_RESET_POLL_CNT ; i++)
5394 rc = hl_poll_timeout(
5395 hdev,
5396 mmCPU_RST_STATUS_TO_HOST,
5397 reg_val,
5398 reg_val == CPU_RST_STATUS_SOFT_RST_DONE,
5399 1000,
5400 poll_timeout_us);
5401
5402 if (rc)
5403 dev_err(hdev->dev, "Timeout while waiting for FW to complete soft reset (0x%x)\n",
5404 reg_val);
5405 }
5406
5407 static void gaudi2_hw_fini(struct hl_device *hdev, bool hard_reset, bool fw_reset)
5408 {
5409 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5410 u32 poll_timeout_us, reset_sleep_ms;
5411 bool driver_performs_reset = false;
5412
5413 if (hdev->pldm) {
5414 reset_sleep_ms = hard_reset ? GAUDI2_PLDM_HRESET_TIMEOUT_MSEC :
5415 GAUDI2_PLDM_SRESET_TIMEOUT_MSEC;
5416 poll_timeout_us = GAUDI2_PLDM_RESET_POLL_TIMEOUT_USEC;
5417 } else {
5418 reset_sleep_ms = GAUDI2_RESET_TIMEOUT_MSEC;
5419 poll_timeout_us = GAUDI2_RESET_POLL_TIMEOUT_USEC;
5420 }
5421
5422 if (fw_reset)
5423 goto skip_reset;
5424
5425 gaudi2_reset_arcs(hdev);
5426
5427 if (hard_reset) {
5428 driver_performs_reset = !hdev->asic_prop.hard_reset_done_by_fw;
5429 gaudi2_execute_hard_reset(hdev, reset_sleep_ms);
5430 } else {
5431
5432
5433
5434
5435
5436
5437 driver_performs_reset = (hdev->fw_components == FW_TYPE_PREBOOT_CPU &&
5438 !hdev->asic_prop.fw_security_enabled);
5439 gaudi2_execute_soft_reset(hdev, reset_sleep_ms, driver_performs_reset);
5440 }
5441
5442 skip_reset:
5443 if (driver_performs_reset || hard_reset)
5444 gaudi2_poll_btm_indication(hdev, reset_sleep_ms, poll_timeout_us);
5445 else
5446 gaudi2_get_soft_rst_done_indication(hdev, poll_timeout_us);
5447
5448 if (!gaudi2)
5449 return;
5450
5451 gaudi2->dec_hw_cap_initialized &= ~(HW_CAP_DEC_MASK);
5452 gaudi2->tpc_hw_cap_initialized &= ~(HW_CAP_TPC_MASK);
5453
5454
5455
5456
5457
5458
5459 gaudi2->nic_hw_cap_initialized &= ~(HW_CAP_NIC_MASK);
5460
5461 if (hard_reset) {
5462 gaudi2->hw_cap_initialized &=
5463 ~(HW_CAP_DRAM | HW_CAP_CLK_GATE | HW_CAP_HBM_SCRAMBLER_MASK |
5464 HW_CAP_PMMU | HW_CAP_CPU | HW_CAP_CPU_Q |
5465 HW_CAP_SRAM_SCRAMBLER | HW_CAP_DMMU_MASK |
5466 HW_CAP_PDMA_MASK | HW_CAP_EDMA_MASK | HW_CAP_KDMA |
5467 HW_CAP_MME_MASK | HW_CAP_ROT_MASK);
5468
5469 memset(gaudi2->events_stat, 0, sizeof(gaudi2->events_stat));
5470 } else {
5471 gaudi2->hw_cap_initialized &=
5472 ~(HW_CAP_CLK_GATE | HW_CAP_HBM_SCRAMBLER_SW_RESET |
5473 HW_CAP_PDMA_MASK | HW_CAP_EDMA_MASK | HW_CAP_MME_MASK |
5474 HW_CAP_ROT_MASK);
5475 }
5476 }
5477
5478 static int gaudi2_suspend(struct hl_device *hdev)
5479 {
5480 int rc;
5481
5482 rc = hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_DISABLE_PCI_ACCESS, 0x0);
5483 if (rc)
5484 dev_err(hdev->dev, "Failed to disable PCI access from CPU\n");
5485
5486 return rc;
5487 }
5488
5489 static int gaudi2_resume(struct hl_device *hdev)
5490 {
5491 return gaudi2_init_iatu(hdev);
5492 }
5493
5494 static int gaudi2_mmap(struct hl_device *hdev, struct vm_area_struct *vma,
5495 void *cpu_addr, dma_addr_t dma_addr, size_t size)
5496 {
5497 int rc;
5498
5499 vma->vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
5500 VM_DONTCOPY | VM_NORESERVE;
5501
5502 #ifdef _HAS_DMA_MMAP_COHERENT
5503
5504 rc = dma_mmap_coherent(hdev->dev, vma, cpu_addr, dma_addr, size);
5505 if (rc)
5506 dev_err(hdev->dev, "dma_mmap_coherent error %d", rc);
5507
5508 #else
5509
5510 rc = remap_pfn_range(vma, vma->vm_start,
5511 virt_to_phys(cpu_addr) >> PAGE_SHIFT,
5512 size, vma->vm_page_prot);
5513 if (rc)
5514 dev_err(hdev->dev, "remap_pfn_range error %d", rc);
5515
5516 #endif
5517
5518 return rc;
5519 }
5520
5521 static bool gaudi2_is_queue_enabled(struct hl_device *hdev, u32 hw_queue_id)
5522 {
5523 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5524 u64 hw_cap_mask = 0;
5525 u64 hw_tpc_cap_bit = 0;
5526 u64 hw_nic_cap_bit = 0;
5527 u64 hw_test_cap_bit = 0;
5528
5529 switch (hw_queue_id) {
5530 case GAUDI2_QUEUE_ID_PDMA_0_0 ... GAUDI2_QUEUE_ID_PDMA_1_1:
5531 hw_cap_mask = HW_CAP_PDMA_MASK;
5532 break;
5533
5534 case GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3:
5535 hw_test_cap_bit = HW_CAP_EDMA_SHIFT +
5536 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0) >> 2);
5537 break;
5538 case GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3:
5539 hw_test_cap_bit = HW_CAP_EDMA_SHIFT + NUM_OF_EDMA_PER_DCORE +
5540 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0) >> 2);
5541 break;
5542 case GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3:
5543 hw_test_cap_bit = HW_CAP_EDMA_SHIFT + 2 * NUM_OF_EDMA_PER_DCORE +
5544 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0) >> 2);
5545 break;
5546 case GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3:
5547 hw_test_cap_bit = HW_CAP_EDMA_SHIFT + 3 * NUM_OF_EDMA_PER_DCORE +
5548 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0) >> 2);
5549 break;
5550
5551 case GAUDI2_QUEUE_ID_DCORE0_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE0_MME_0_3:
5552 hw_test_cap_bit = HW_CAP_MME_SHIFT;
5553 break;
5554
5555 case GAUDI2_QUEUE_ID_DCORE1_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE1_MME_0_3:
5556 hw_test_cap_bit = HW_CAP_MME_SHIFT + 1;
5557 break;
5558
5559 case GAUDI2_QUEUE_ID_DCORE2_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE2_MME_0_3:
5560 hw_test_cap_bit = HW_CAP_MME_SHIFT + 2;
5561 break;
5562
5563 case GAUDI2_QUEUE_ID_DCORE3_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE3_MME_0_3:
5564 hw_test_cap_bit = HW_CAP_MME_SHIFT + 3;
5565 break;
5566
5567 case GAUDI2_QUEUE_ID_DCORE0_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE0_TPC_5_3:
5568 hw_tpc_cap_bit = HW_CAP_TPC_SHIFT +
5569 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE0_TPC_0_0) >> 2);
5570
5571
5572 if (!hw_tpc_cap_bit)
5573 return !!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(0));
5574 break;
5575
5576 case GAUDI2_QUEUE_ID_DCORE1_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE1_TPC_5_3:
5577 hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + NUM_OF_TPC_PER_DCORE +
5578 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE1_TPC_0_0) >> 2);
5579 break;
5580
5581 case GAUDI2_QUEUE_ID_DCORE2_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE2_TPC_5_3:
5582 hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + (2 * NUM_OF_TPC_PER_DCORE) +
5583 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE2_TPC_0_0) >> 2);
5584 break;
5585
5586 case GAUDI2_QUEUE_ID_DCORE3_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE3_TPC_5_3:
5587 hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + (3 * NUM_OF_TPC_PER_DCORE) +
5588 ((hw_queue_id - GAUDI2_QUEUE_ID_DCORE3_TPC_0_0) >> 2);
5589 break;
5590
5591 case GAUDI2_QUEUE_ID_DCORE0_TPC_6_0 ... GAUDI2_QUEUE_ID_DCORE0_TPC_6_3:
5592 hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + (4 * NUM_OF_TPC_PER_DCORE);
5593 break;
5594
5595 case GAUDI2_QUEUE_ID_ROT_0_0 ... GAUDI2_QUEUE_ID_ROT_1_3:
5596 hw_test_cap_bit = HW_CAP_ROT_SHIFT + ((hw_queue_id - GAUDI2_QUEUE_ID_ROT_0_0) >> 2);
5597 break;
5598
5599 case GAUDI2_QUEUE_ID_NIC_0_0 ... GAUDI2_QUEUE_ID_NIC_23_3:
5600 hw_nic_cap_bit = HW_CAP_NIC_SHIFT + ((hw_queue_id - GAUDI2_QUEUE_ID_NIC_0_0) >> 2);
5601
5602
5603 if (!hw_nic_cap_bit)
5604 return !!(gaudi2->nic_hw_cap_initialized & BIT_ULL(0));
5605 break;
5606
5607 case GAUDI2_QUEUE_ID_CPU_PQ:
5608 return !!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q);
5609
5610 default:
5611 return false;
5612 }
5613
5614 if (hw_tpc_cap_bit)
5615 return !!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(hw_tpc_cap_bit));
5616
5617 if (hw_nic_cap_bit)
5618 return !!(gaudi2->nic_hw_cap_initialized & BIT_ULL(hw_nic_cap_bit));
5619
5620 if (hw_test_cap_bit)
5621 hw_cap_mask = BIT_ULL(hw_test_cap_bit);
5622
5623 return !!(gaudi2->hw_cap_initialized & hw_cap_mask);
5624 }
5625
5626 static bool gaudi2_is_arc_enabled(struct hl_device *hdev, u64 arc_id)
5627 {
5628 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5629
5630 switch (arc_id) {
5631 case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC5:
5632 case CPU_ID_MME_QMAN_ARC0...CPU_ID_ROT_QMAN_ARC1:
5633 return !!(gaudi2->active_hw_arc & BIT_ULL(arc_id));
5634
5635 case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:
5636 return !!(gaudi2->active_tpc_arc & BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0));
5637
5638 case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:
5639 return !!(gaudi2->active_nic_arc & BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0));
5640
5641 default:
5642 return false;
5643 }
5644 }
5645
5646 static void gaudi2_clr_arc_id_cap(struct hl_device *hdev, u64 arc_id)
5647 {
5648 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5649
5650 switch (arc_id) {
5651 case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC5:
5652 case CPU_ID_MME_QMAN_ARC0...CPU_ID_ROT_QMAN_ARC1:
5653 gaudi2->active_hw_arc &= ~(BIT_ULL(arc_id));
5654 break;
5655
5656 case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:
5657 gaudi2->active_tpc_arc &= ~(BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0));
5658 break;
5659
5660 case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:
5661 gaudi2->active_nic_arc &= ~(BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0));
5662 break;
5663
5664 default:
5665 return;
5666 }
5667 }
5668
5669 static void gaudi2_set_arc_id_cap(struct hl_device *hdev, u64 arc_id)
5670 {
5671 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5672
5673 switch (arc_id) {
5674 case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC5:
5675 case CPU_ID_MME_QMAN_ARC0...CPU_ID_ROT_QMAN_ARC1:
5676 gaudi2->active_hw_arc |= BIT_ULL(arc_id);
5677 break;
5678
5679 case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:
5680 gaudi2->active_tpc_arc |= BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0);
5681 break;
5682
5683 case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:
5684 gaudi2->active_nic_arc |= BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0);
5685 break;
5686
5687 default:
5688 return;
5689 }
5690 }
5691
5692 static void gaudi2_ring_doorbell(struct hl_device *hdev, u32 hw_queue_id, u32 pi)
5693 {
5694 struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
5695 u32 pq_offset, reg_base, db_reg_offset, db_value;
5696
5697 if (hw_queue_id != GAUDI2_QUEUE_ID_CPU_PQ) {
5698
5699
5700
5701
5702
5703 pq_offset = (hw_queue_id & 0x3) * 4;
5704 reg_base = gaudi2_qm_blocks_bases[hw_queue_id];
5705 db_reg_offset = reg_base + QM_PQ_PI_0_OFFSET + pq_offset;
5706 } else {
5707 db_reg_offset = mmCPU_IF_PF_PQ_PI;
5708 }
5709
5710 db_value = pi;
5711
5712
5713 WREG32(db_reg_offset, db_value);
5714
5715 if (hw_queue_id == GAUDI2_QUEUE_ID_CPU_PQ) {
5716
5717 mb();
5718 WREG32(le32_to_cpu(dyn_regs->gic_host_pi_upd_irq),
5719 gaudi2_irq_map_table[GAUDI2_EVENT_CPU_PI_UPDATE].cpu_id);
5720 }
5721 }
5722
5723 static void gaudi2_pqe_write(struct hl_device *hdev, __le64 *pqe, struct hl_bd *bd)
5724 {
5725 __le64 *pbd = (__le64 *) bd;
5726
5727
5728 pqe[0] = pbd[0];
5729 pqe[1] = pbd[1];
5730 }
5731
5732 static void *gaudi2_dma_alloc_coherent(struct hl_device *hdev, size_t size,
5733 dma_addr_t *dma_handle, gfp_t flags)
5734 {
5735 return dma_alloc_coherent(&hdev->pdev->dev, size, dma_handle, flags);
5736 }
5737
5738 static void gaudi2_dma_free_coherent(struct hl_device *hdev, size_t size,
5739 void *cpu_addr, dma_addr_t dma_handle)
5740 {
5741 dma_free_coherent(&hdev->pdev->dev, size, cpu_addr, dma_handle);
5742 }
5743
5744 static int gaudi2_send_cpu_message(struct hl_device *hdev, u32 *msg, u16 len,
5745 u32 timeout, u64 *result)
5746 {
5747 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5748
5749 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q)) {
5750 if (result)
5751 *result = 0;
5752 return 0;
5753 }
5754
5755 if (!timeout)
5756 timeout = GAUDI2_MSG_TO_CPU_TIMEOUT_USEC;
5757
5758 return hl_fw_send_cpu_message(hdev, GAUDI2_QUEUE_ID_CPU_PQ, msg, len, timeout, result);
5759 }
5760
5761 static void *gaudi2_dma_pool_zalloc(struct hl_device *hdev, size_t size,
5762 gfp_t mem_flags, dma_addr_t *dma_handle)
5763 {
5764 if (size > GAUDI2_DMA_POOL_BLK_SIZE)
5765 return NULL;
5766
5767 return dma_pool_zalloc(hdev->dma_pool, mem_flags, dma_handle);
5768 }
5769
5770 static void gaudi2_dma_pool_free(struct hl_device *hdev, void *vaddr, dma_addr_t dma_addr)
5771 {
5772 dma_pool_free(hdev->dma_pool, vaddr, dma_addr);
5773 }
5774
5775 static void *gaudi2_cpu_accessible_dma_pool_alloc(struct hl_device *hdev, size_t size,
5776 dma_addr_t *dma_handle)
5777 {
5778 return hl_fw_cpu_accessible_dma_pool_alloc(hdev, size, dma_handle);
5779 }
5780
5781 static void gaudi2_cpu_accessible_dma_pool_free(struct hl_device *hdev, size_t size, void *vaddr)
5782 {
5783 hl_fw_cpu_accessible_dma_pool_free(hdev, size, vaddr);
5784 }
5785
5786 static dma_addr_t gaudi2_dma_map_single(struct hl_device *hdev, void *addr, int len,
5787 enum dma_data_direction dir)
5788 {
5789 dma_addr_t dma_addr;
5790
5791 dma_addr = dma_map_single(&hdev->pdev->dev, addr, len, dir);
5792 if (unlikely(dma_mapping_error(&hdev->pdev->dev, dma_addr)))
5793 return 0;
5794
5795 return dma_addr;
5796 }
5797
5798 static void gaudi2_dma_unmap_single(struct hl_device *hdev, dma_addr_t addr, int len,
5799 enum dma_data_direction dir)
5800 {
5801 dma_unmap_single(&hdev->pdev->dev, addr, len, dir);
5802 }
5803
5804 static int gaudi2_validate_cb_address(struct hl_device *hdev, struct hl_cs_parser *parser)
5805 {
5806 struct asic_fixed_properties *asic_prop = &hdev->asic_prop;
5807 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5808
5809 if (!gaudi2_is_queue_enabled(hdev, parser->hw_queue_id)) {
5810 dev_err(hdev->dev, "h/w queue %d is disabled\n", parser->hw_queue_id);
5811 return -EINVAL;
5812 }
5813
5814
5815
5816 if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,
5817 parser->user_cb_size,
5818 asic_prop->sram_user_base_address,
5819 asic_prop->sram_end_address))
5820 return 0;
5821
5822 if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,
5823 parser->user_cb_size,
5824 asic_prop->dram_user_base_address,
5825 asic_prop->dram_end_address))
5826 return 0;
5827
5828 if ((gaudi2->hw_cap_initialized & HW_CAP_DMMU_MASK) &&
5829 hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,
5830 parser->user_cb_size,
5831 asic_prop->dmmu.start_addr,
5832 asic_prop->dmmu.end_addr))
5833 return 0;
5834
5835 if (gaudi2->hw_cap_initialized & HW_CAP_PMMU) {
5836 if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,
5837 parser->user_cb_size,
5838 asic_prop->pmmu.start_addr,
5839 asic_prop->pmmu.end_addr) ||
5840 hl_mem_area_inside_range(
5841 (u64) (uintptr_t) parser->user_cb,
5842 parser->user_cb_size,
5843 asic_prop->pmmu_huge.start_addr,
5844 asic_prop->pmmu_huge.end_addr))
5845 return 0;
5846
5847 } else if (gaudi2_host_phys_addr_valid((u64) (uintptr_t) parser->user_cb)) {
5848 if (!hdev->pdev)
5849 return 0;
5850
5851 if (!device_iommu_mapped(&hdev->pdev->dev))
5852 return 0;
5853 }
5854
5855 dev_err(hdev->dev, "CB address %p + 0x%x for internal QMAN is not valid\n",
5856 parser->user_cb, parser->user_cb_size);
5857
5858 return -EFAULT;
5859 }
5860
5861 static int gaudi2_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser)
5862 {
5863 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5864
5865 if (!parser->is_kernel_allocated_cb)
5866 return gaudi2_validate_cb_address(hdev, parser);
5867
5868 if (!(gaudi2->hw_cap_initialized & HW_CAP_PMMU)) {
5869 dev_err(hdev->dev, "PMMU not initialized - Unsupported mode in Gaudi2\n");
5870 return -EINVAL;
5871 }
5872
5873 return 0;
5874 }
5875
5876 static int gaudi2_send_heartbeat(struct hl_device *hdev)
5877 {
5878 struct gaudi2_device *gaudi2 = hdev->asic_specific;
5879
5880 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))
5881 return 0;
5882
5883 return hl_fw_send_heartbeat(hdev);
5884 }
5885
5886
5887
5888
5889 static void gaudi2_kdma_set_mmbp_asid(struct hl_device *hdev,
5890 bool mmu_bypass, u32 asid)
5891 {
5892 u32 rw_asid, rw_mmu_bp;
5893
5894 rw_asid = (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_SHIFT) |
5895 (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_SHIFT);
5896
5897 rw_mmu_bp = (!!mmu_bypass << ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_RD_SHIFT) |
5898 (!!mmu_bypass << ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_WR_SHIFT);
5899
5900 WREG32(mmARC_FARM_KDMA_CTX_AXUSER_HB_ASID, rw_asid);
5901 WREG32(mmARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP, rw_mmu_bp);
5902 }
5903
5904 static void gaudi2_arm_cq_monitor(struct hl_device *hdev, u32 sob_id, u32 mon_id, u32 cq_id,
5905 u32 mon_payload, u32 sync_value)
5906 {
5907 u32 sob_offset, mon_offset, sync_group_id, mode, mon_arm;
5908 u8 mask;
5909
5910 sob_offset = sob_id * 4;
5911 mon_offset = mon_id * 4;
5912
5913
5914 WREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset, 0);
5915
5916
5917 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, cq_id);
5918
5919
5920 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, mon_payload);
5921
5922 sync_group_id = sob_id / 8;
5923 mask = ~(1 << (sob_id & 0x7));
5924 mode = 1;
5925
5926 mon_arm = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOD_MASK, sync_value);
5927 mon_arm |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOP_MASK, mode);
5928 mon_arm |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_MASK_MASK, mask);
5929 mon_arm |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SID_MASK, sync_group_id);
5930 WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + mon_offset, mon_arm);
5931 }
5932
5933
5934 static int gaudi2_send_job_to_kdma(struct hl_device *hdev,
5935 u64 src_addr, u64 dst_addr,
5936 u32 size, bool is_memset)
5937 {
5938 u32 comp_val, commit_mask, *polling_addr, timeout, status = 0;
5939 struct hl_cq_entry *cq_base;
5940 struct hl_cq *cq;
5941 u64 comp_addr;
5942 int rc;
5943
5944 gaudi2_arm_cq_monitor(hdev, GAUDI2_RESERVED_SOB_KDMA_COMPLETION,
5945 GAUDI2_RESERVED_MON_KDMA_COMPLETION,
5946 GAUDI2_RESERVED_CQ_KDMA_COMPLETION, 1, 1);
5947
5948 comp_addr = CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 +
5949 (GAUDI2_RESERVED_SOB_KDMA_COMPLETION * sizeof(u32));
5950
5951 comp_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_INC_MASK, 1) |
5952 FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_VAL_MASK, 1);
5953
5954 WREG32(mmARC_FARM_KDMA_CTX_SRC_BASE_LO, lower_32_bits(src_addr));
5955 WREG32(mmARC_FARM_KDMA_CTX_SRC_BASE_HI, upper_32_bits(src_addr));
5956 WREG32(mmARC_FARM_KDMA_CTX_DST_BASE_LO, lower_32_bits(dst_addr));
5957 WREG32(mmARC_FARM_KDMA_CTX_DST_BASE_HI, upper_32_bits(dst_addr));
5958 WREG32(mmARC_FARM_KDMA_CTX_WR_COMP_ADDR_LO, lower_32_bits(comp_addr));
5959 WREG32(mmARC_FARM_KDMA_CTX_WR_COMP_ADDR_HI, upper_32_bits(comp_addr));
5960 WREG32(mmARC_FARM_KDMA_CTX_WR_COMP_WDATA, comp_val);
5961 WREG32(mmARC_FARM_KDMA_CTX_DST_TSIZE_0, size);
5962
5963 commit_mask = FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_LIN_MASK, 1) |
5964 FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_WR_COMP_EN_MASK, 1);
5965
5966 if (is_memset)
5967 commit_mask |= FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_MEM_SET_MASK, 1);
5968
5969 WREG32(mmARC_FARM_KDMA_CTX_COMMIT, commit_mask);
5970
5971
5972 cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_KDMA_COMPLETION];
5973 cq_base = cq->kernel_address;
5974 polling_addr = (u32 *)&cq_base[cq->ci];
5975
5976 if (hdev->pldm)
5977
5978 timeout = ((size / SZ_1M) + 1) * USEC_PER_SEC * 20;
5979 else
5980 timeout = KDMA_TIMEOUT_USEC;
5981
5982
5983 rc = hl_poll_timeout_memory(
5984 hdev,
5985 polling_addr,
5986 status,
5987 (status == 1),
5988 1000,
5989 timeout,
5990 true);
5991
5992 *polling_addr = 0;
5993
5994 if (rc) {
5995 dev_err(hdev->dev, "Timeout while waiting for KDMA to be idle\n");
5996 WREG32(mmARC_FARM_KDMA_CFG_1, 1 << ARC_FARM_KDMA_CFG_1_HALT_SHIFT);
5997 return rc;
5998 }
5999
6000 cq->ci = hl_cq_inc_ptr(cq->ci);
6001
6002 return 0;
6003 }
6004
6005 static void gaudi2_memset_device_lbw(struct hl_device *hdev, u32 addr, u32 size, u32 val)
6006 {
6007 u32 i;
6008
6009 for (i = 0 ; i < size ; i += sizeof(u32))
6010 WREG32(addr + i, val);
6011 }
6012
6013 static void gaudi2_qman_set_test_mode(struct hl_device *hdev, u32 hw_queue_id, bool enable)
6014 {
6015 u32 reg_base = gaudi2_qm_blocks_bases[hw_queue_id];
6016
6017 if (enable) {
6018 WREG32(reg_base + QM_GLBL_PROT_OFFSET, QMAN_MAKE_TRUSTED_TEST_MODE);
6019 WREG32(reg_base + QM_PQC_CFG_OFFSET, 0);
6020 } else {
6021 WREG32(reg_base + QM_GLBL_PROT_OFFSET, QMAN_MAKE_TRUSTED);
6022 WREG32(reg_base + QM_PQC_CFG_OFFSET, 1 << PDMA0_QM_PQC_CFG_EN_SHIFT);
6023 }
6024 }
6025
6026 static int gaudi2_test_queue(struct hl_device *hdev, u32 hw_queue_id)
6027 {
6028 u32 sob_offset = hdev->asic_prop.first_available_user_sob[0] * 4;
6029 u32 sob_addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;
6030 u32 timeout_usec, tmp, sob_base = 1, sob_val = 0x5a5a;
6031 struct packet_msg_short *msg_short_pkt;
6032 dma_addr_t pkt_dma_addr;
6033 size_t pkt_size;
6034 int rc;
6035
6036 if (hdev->pldm)
6037 timeout_usec = GAUDI2_PLDM_TEST_QUEUE_WAIT_USEC;
6038 else
6039 timeout_usec = GAUDI2_TEST_QUEUE_WAIT_USEC;
6040
6041 pkt_size = sizeof(*msg_short_pkt);
6042 msg_short_pkt = hl_asic_dma_pool_zalloc(hdev, pkt_size, GFP_KERNEL, &pkt_dma_addr);
6043 if (!msg_short_pkt) {
6044 dev_err(hdev->dev, "Failed to allocate packet for H/W queue %d testing\n",
6045 hw_queue_id);
6046 return -ENOMEM;
6047 }
6048
6049 tmp = (PACKET_MSG_SHORT << GAUDI2_PKT_CTL_OPCODE_SHIFT) |
6050 (1 << GAUDI2_PKT_CTL_EB_SHIFT) |
6051 (1 << GAUDI2_PKT_CTL_MB_SHIFT) |
6052 (sob_base << GAUDI2_PKT_SHORT_CTL_BASE_SHIFT) |
6053 (sob_offset << GAUDI2_PKT_SHORT_CTL_ADDR_SHIFT);
6054
6055 msg_short_pkt->value = cpu_to_le32(sob_val);
6056 msg_short_pkt->ctl = cpu_to_le32(tmp);
6057
6058
6059 WREG32(sob_addr, 0);
6060
6061 rc = hl_hw_queue_send_cb_no_cmpl(hdev, hw_queue_id, pkt_size, pkt_dma_addr);
6062 if (rc) {
6063 dev_err(hdev->dev, "Failed to send msg_short packet to H/W queue %d\n",
6064 hw_queue_id);
6065 goto free_pkt;
6066 }
6067
6068 rc = hl_poll_timeout(
6069 hdev,
6070 sob_addr,
6071 tmp,
6072 (tmp == sob_val),
6073 1000,
6074 timeout_usec);
6075
6076 if (rc == -ETIMEDOUT) {
6077 dev_err(hdev->dev, "H/W queue %d test failed (SOB_OBJ_0 == 0x%x)\n",
6078 hw_queue_id, tmp);
6079 rc = -EIO;
6080 }
6081
6082
6083 WREG32(sob_addr, 0);
6084
6085 free_pkt:
6086 hl_asic_dma_pool_free(hdev, (void *) msg_short_pkt, pkt_dma_addr);
6087 return rc;
6088 }
6089
6090 static int gaudi2_test_cpu_queue(struct hl_device *hdev)
6091 {
6092 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6093
6094
6095
6096
6097
6098 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))
6099 return 0;
6100
6101 return hl_fw_test_cpu_queue(hdev);
6102 }
6103
6104 static int gaudi2_test_queues(struct hl_device *hdev)
6105 {
6106 int i, rc, ret_val = 0;
6107
6108 for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ; i++) {
6109 if (!gaudi2_is_queue_enabled(hdev, i))
6110 continue;
6111
6112 gaudi2_qman_set_test_mode(hdev, i, true);
6113 rc = gaudi2_test_queue(hdev, i);
6114 gaudi2_qman_set_test_mode(hdev, i, false);
6115
6116 if (rc) {
6117 ret_val = -EINVAL;
6118 goto done;
6119 }
6120 }
6121
6122 rc = gaudi2_test_cpu_queue(hdev);
6123 if (rc) {
6124 ret_val = -EINVAL;
6125 goto done;
6126 }
6127
6128 done:
6129 return ret_val;
6130 }
6131
6132 static int gaudi2_non_hard_reset_late_init(struct hl_device *hdev)
6133 {
6134 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6135 size_t irq_arr_size;
6136
6137
6138
6139
6140 gaudi2_init_arcs(hdev);
6141 gaudi2_scrub_arcs_dccm(hdev);
6142 gaudi2_init_security(hdev);
6143
6144
6145 irq_arr_size = gaudi2->num_of_valid_hw_events * sizeof(gaudi2->hw_events[0]);
6146 return hl_fw_unmask_irq_arr(hdev, gaudi2->hw_events, irq_arr_size);
6147 }
6148
6149 static void gaudi2_is_tpc_engine_idle(struct hl_device *hdev, int dcore, int inst, u32 offset,
6150 void *data)
6151 {
6152 struct gaudi2_tpc_idle_data *idle_data = (struct gaudi2_tpc_idle_data *)data;
6153 u32 tpc_cfg_sts, qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts;
6154 bool is_eng_idle;
6155 int engine_idx;
6156
6157 if ((dcore == 0) && (inst == (NUM_DCORE0_TPC - 1)))
6158 engine_idx = GAUDI2_DCORE0_ENGINE_ID_TPC_6;
6159 else
6160 engine_idx = GAUDI2_DCORE0_ENGINE_ID_TPC_0 +
6161 dcore * GAUDI2_ENGINE_ID_DCORE_OFFSET + inst;
6162
6163 tpc_cfg_sts = RREG32(mmDCORE0_TPC0_CFG_STATUS + offset);
6164 qm_glbl_sts0 = RREG32(mmDCORE0_TPC0_QM_GLBL_STS0 + offset);
6165 qm_glbl_sts1 = RREG32(mmDCORE0_TPC0_QM_GLBL_STS1 + offset);
6166 qm_cgm_sts = RREG32(mmDCORE0_TPC0_QM_CGM_STS + offset);
6167
6168 is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts) &&
6169 IS_TPC_IDLE(tpc_cfg_sts);
6170 *(idle_data->is_idle) &= is_eng_idle;
6171
6172 if (idle_data->mask && !is_eng_idle)
6173 set_bit(engine_idx, idle_data->mask);
6174
6175 if (idle_data->s)
6176 seq_printf(idle_data->s, idle_data->tpc_fmt, dcore, inst,
6177 is_eng_idle ? "Y" : "N",
6178 qm_glbl_sts0, qm_cgm_sts, tpc_cfg_sts);
6179 }
6180
6181 static bool gaudi2_is_device_idle(struct hl_device *hdev, u64 *mask_arr,
6182 u8 mask_len, struct seq_file *s)
6183 {
6184 u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts, dma_core_idle_ind_mask,
6185 mme_arch_sts, dec_swreg15, dec_enabled_bit;
6186 struct asic_fixed_properties *prop = &hdev->asic_prop;
6187 const char *rot_fmt = "%-6d%-5d%-9s%#-14x%#-12x%s\n";
6188 unsigned long *mask = (unsigned long *) mask_arr;
6189 const char *edma_fmt = "%-6d%-6d%-9s%#-14x%#x\n";
6190 const char *mme_fmt = "%-5d%-6s%-9s%#-14x%#x\n";
6191 const char *nic_fmt = "%-5d%-9s%#-14x%#-12x\n";
6192 const char *pdma_fmt = "%-6d%-9s%#-14x%#x\n";
6193 const char *pcie_dec_fmt = "%-10d%-9s%#x\n";
6194 const char *dec_fmt = "%-6d%-5d%-9s%#x\n";
6195 bool is_idle = true, is_eng_idle;
6196 u64 offset;
6197
6198 struct gaudi2_tpc_idle_data tpc_idle_data = {
6199 .tpc_fmt = "%-6d%-5d%-9s%#-14x%#-12x%#x\n",
6200 .s = s,
6201 .mask = mask,
6202 .is_idle = &is_idle,
6203 };
6204 struct iterate_module_ctx tpc_iter = {
6205 .fn = &gaudi2_is_tpc_engine_idle,
6206 .data = &tpc_idle_data,
6207 };
6208
6209 int engine_idx, i, j;
6210
6211
6212 if (s)
6213 seq_puts(s,
6214 "\nCORE EDMA is_idle QM_GLBL_STS0 DMA_CORE_IDLE_IND_MASK\n"
6215 "---- ---- ------- ------------ ----------------------\n");
6216
6217 for (i = 0; i < NUM_OF_DCORES; i++) {
6218 for (j = 0 ; j < NUM_OF_EDMA_PER_DCORE ; j++) {
6219 int seq = i * NUM_OF_EDMA_PER_DCORE + j;
6220
6221 if (!(prop->edma_enabled_mask & BIT(seq)))
6222 continue;
6223
6224 engine_idx = GAUDI2_DCORE0_ENGINE_ID_EDMA_0 +
6225 i * GAUDI2_ENGINE_ID_DCORE_OFFSET + j;
6226 offset = i * DCORE_OFFSET + j * DCORE_EDMA_OFFSET;
6227
6228 dma_core_idle_ind_mask =
6229 RREG32(mmDCORE0_EDMA0_CORE_IDLE_IND_MASK + offset);
6230
6231 qm_glbl_sts0 = RREG32(mmDCORE0_EDMA0_QM_GLBL_STS0 + offset);
6232 qm_glbl_sts1 = RREG32(mmDCORE0_EDMA0_QM_GLBL_STS1 + offset);
6233 qm_cgm_sts = RREG32(mmDCORE0_EDMA0_QM_CGM_STS + offset);
6234
6235 is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts) &&
6236 IS_DMA_IDLE(dma_core_idle_ind_mask);
6237 is_idle &= is_eng_idle;
6238
6239 if (mask && !is_eng_idle)
6240 set_bit(engine_idx, mask);
6241
6242 if (s)
6243 seq_printf(s, edma_fmt, i, j,
6244 is_eng_idle ? "Y" : "N",
6245 qm_glbl_sts0,
6246 dma_core_idle_ind_mask);
6247 }
6248 }
6249
6250
6251 if (s)
6252 seq_puts(s,
6253 "\nPDMA is_idle QM_GLBL_STS0 DMA_CORE_IDLE_IND_MASK\n"
6254 "---- ------- ------------ ----------------------\n");
6255
6256 for (i = 0 ; i < NUM_OF_PDMA ; i++) {
6257 engine_idx = GAUDI2_ENGINE_ID_PDMA_0 + i;
6258 offset = i * PDMA_OFFSET;
6259 dma_core_idle_ind_mask = RREG32(mmPDMA0_CORE_IDLE_IND_MASK + offset);
6260
6261 qm_glbl_sts0 = RREG32(mmPDMA0_QM_GLBL_STS0 + offset);
6262 qm_glbl_sts1 = RREG32(mmPDMA0_QM_GLBL_STS1 + offset);
6263 qm_cgm_sts = RREG32(mmPDMA0_QM_CGM_STS + offset);
6264
6265 is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts) &&
6266 IS_DMA_IDLE(dma_core_idle_ind_mask);
6267 is_idle &= is_eng_idle;
6268
6269 if (mask && !is_eng_idle)
6270 set_bit(engine_idx, mask);
6271
6272 if (s)
6273 seq_printf(s, pdma_fmt, i, is_eng_idle ? "Y" : "N", qm_glbl_sts0,
6274 dma_core_idle_ind_mask);
6275 }
6276
6277
6278 if (s && hdev->nic_ports_mask)
6279 seq_puts(s,
6280 "\nNIC is_idle QM_GLBL_STS0 QM_CGM_STS\n"
6281 "--- ------- ------------ ----------\n");
6282
6283 for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++) {
6284 if (!(i & 1))
6285 offset = i / 2 * NIC_OFFSET;
6286 else
6287 offset += NIC_QM_OFFSET;
6288
6289 if (!(hdev->nic_ports_mask & BIT(i)))
6290 continue;
6291
6292 engine_idx = GAUDI2_ENGINE_ID_NIC0_0 + i;
6293
6294
6295 qm_glbl_sts0 = RREG32(mmNIC0_QM0_GLBL_STS0 + offset);
6296 qm_glbl_sts1 = RREG32(mmNIC0_QM0_GLBL_STS1 + offset);
6297 qm_cgm_sts = RREG32(mmNIC0_QM0_CGM_STS + offset);
6298
6299 is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts);
6300 is_idle &= is_eng_idle;
6301
6302 if (mask && !is_eng_idle)
6303 set_bit(engine_idx, mask);
6304
6305 if (s)
6306 seq_printf(s, nic_fmt, i, is_eng_idle ? "Y" : "N", qm_glbl_sts0,
6307 qm_cgm_sts);
6308 }
6309
6310 if (s)
6311 seq_puts(s,
6312 "\nMME Stub is_idle QM_GLBL_STS0 MME_ARCH_STATUS\n"
6313 "--- ---- ------- ------------ ---------------\n");
6314
6315 for (i = 0 ; i < NUM_OF_DCORES ; i++) {
6316 engine_idx = GAUDI2_DCORE0_ENGINE_ID_MME + i * GAUDI2_ENGINE_ID_DCORE_OFFSET;
6317 offset = i * DCORE_OFFSET;
6318
6319 qm_glbl_sts0 = RREG32(mmDCORE0_MME_QM_GLBL_STS0 + offset);
6320 qm_glbl_sts1 = RREG32(mmDCORE0_MME_QM_GLBL_STS1 + offset);
6321 qm_cgm_sts = RREG32(mmDCORE0_MME_QM_CGM_STS + offset);
6322
6323 is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts);
6324 is_idle &= is_eng_idle;
6325
6326 mme_arch_sts = RREG32(mmDCORE0_MME_CTRL_LO_ARCH_STATUS + offset);
6327 is_eng_idle &= IS_MME_IDLE(mme_arch_sts);
6328 is_idle &= is_eng_idle;
6329
6330 if (s)
6331 seq_printf(s, mme_fmt, i, "N",
6332 is_eng_idle ? "Y" : "N",
6333 qm_glbl_sts0,
6334 mme_arch_sts);
6335
6336 if (mask && !is_eng_idle)
6337 set_bit(engine_idx, mask);
6338 }
6339
6340
6341
6342
6343 if (s && prop->tpc_enabled_mask)
6344 seq_puts(s,
6345 "\nCORE TPC is_idle QM_GLBL_STS0 QM_CGM_STS DMA_CORE_IDLE_IND_MASK\n"
6346 "---- --- -------- ------------ ---------- ----------------------\n");
6347
6348 gaudi2_iterate_tpcs(hdev, &tpc_iter);
6349
6350
6351 if (s && (prop->decoder_enabled_mask & (~PCIE_DEC_EN_MASK)))
6352 seq_puts(s,
6353 "\nCORE DEC is_idle VSI_CMD_SWREG15\n"
6354 "---- --- ------- ---------------\n");
6355
6356 for (i = 0 ; i < NUM_OF_DCORES ; i++) {
6357 for (j = 0 ; j < NUM_OF_DEC_PER_DCORE ; j++) {
6358 dec_enabled_bit = 1 << (i * NUM_OF_DEC_PER_DCORE + j);
6359 if (!(prop->decoder_enabled_mask & dec_enabled_bit))
6360 continue;
6361
6362 engine_idx = GAUDI2_DCORE0_ENGINE_ID_DEC_0 +
6363 i * GAUDI2_ENGINE_ID_DCORE_OFFSET + j;
6364 offset = i * DCORE_OFFSET + j * DCORE_DEC_OFFSET;
6365
6366 dec_swreg15 = RREG32(mmDCORE0_DEC0_CMD_SWREG15 + offset);
6367 is_eng_idle = IS_DEC_IDLE(dec_swreg15);
6368 is_idle &= is_eng_idle;
6369
6370 if (mask && !is_eng_idle)
6371 set_bit(engine_idx, mask);
6372
6373 if (s)
6374 seq_printf(s, dec_fmt, i, j, is_eng_idle ? "Y" : "N", dec_swreg15);
6375 }
6376 }
6377
6378 if (s && (prop->decoder_enabled_mask & PCIE_DEC_EN_MASK))
6379 seq_puts(s,
6380 "\nPCIe DEC is_idle VSI_CMD_SWREG15\n"
6381 "-------- ------- ---------------\n");
6382
6383
6384 for (i = 0 ; i < NUM_OF_DEC_PER_DCORE ; i++) {
6385 dec_enabled_bit = PCIE_DEC_SHIFT + i;
6386 if (!(prop->decoder_enabled_mask & BIT(dec_enabled_bit)))
6387 continue;
6388
6389 engine_idx = GAUDI2_PCIE_ENGINE_ID_DEC_0 + i;
6390 offset = i * DCORE_DEC_OFFSET;
6391 dec_swreg15 = RREG32(mmPCIE_DEC0_CMD_SWREG15 + offset);
6392 is_eng_idle = IS_DEC_IDLE(dec_swreg15);
6393 is_idle &= is_eng_idle;
6394
6395 if (mask && !is_eng_idle)
6396 set_bit(engine_idx, mask);
6397
6398 if (s)
6399 seq_printf(s, pcie_dec_fmt, i, is_eng_idle ? "Y" : "N", dec_swreg15);
6400 }
6401
6402 if (s)
6403 seq_puts(s,
6404 "\nCORE ROT is_idle QM_GLBL_STS0 QM_CGM_STS DMA_CORE_STS0\n"
6405 "---- ---- ------- ------------ ---------- -------------\n");
6406
6407 for (i = 0 ; i < NUM_OF_ROT ; i++) {
6408 engine_idx = GAUDI2_ENGINE_ID_ROT_0 + i;
6409
6410 offset = i * ROT_OFFSET;
6411
6412 qm_glbl_sts0 = RREG32(mmROT0_QM_GLBL_STS0 + offset);
6413 qm_glbl_sts1 = RREG32(mmROT0_QM_GLBL_STS1 + offset);
6414 qm_cgm_sts = RREG32(mmROT0_QM_CGM_STS + offset);
6415
6416 is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts);
6417 is_idle &= is_eng_idle;
6418
6419 if (mask && !is_eng_idle)
6420 set_bit(engine_idx, mask);
6421
6422 if (s)
6423 seq_printf(s, rot_fmt, i, 0, is_eng_idle ? "Y" : "N",
6424 qm_glbl_sts0, qm_cgm_sts, "-");
6425 }
6426
6427 return is_idle;
6428 }
6429
6430 static void gaudi2_hw_queues_lock(struct hl_device *hdev)
6431 __acquires(&gaudi2->hw_queues_lock)
6432 {
6433 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6434
6435 spin_lock(&gaudi2->hw_queues_lock);
6436 }
6437
6438 static void gaudi2_hw_queues_unlock(struct hl_device *hdev)
6439 __releases(&gaudi2->hw_queues_lock)
6440 {
6441 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6442
6443 spin_unlock(&gaudi2->hw_queues_lock);
6444 }
6445
6446 static void gaudi2_kdma_lock(struct hl_device *hdev, int dcore_id)
6447 __acquires(&gaudi2->kdma_lock)
6448 {
6449 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6450
6451 spin_lock(&gaudi2->kdma_lock);
6452 }
6453
6454 static void gaudi2_kdma_unlock(struct hl_device *hdev, int dcore_id)
6455 __releases(&gaudi2->kdma_lock)
6456 {
6457 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6458
6459 spin_unlock(&gaudi2->kdma_lock);
6460 }
6461
6462 static u32 gaudi2_get_pci_id(struct hl_device *hdev)
6463 {
6464 return hdev->pdev->device;
6465 }
6466
6467 static int gaudi2_get_eeprom_data(struct hl_device *hdev, void *data, size_t max_size)
6468 {
6469 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6470
6471 if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))
6472 return 0;
6473
6474 return hl_fw_get_eeprom_data(hdev, data, max_size);
6475 }
6476
6477 static void gaudi2_update_eq_ci(struct hl_device *hdev, u32 val)
6478 {
6479 WREG32(mmCPU_IF_EQ_RD_OFFS, val);
6480 }
6481
6482 static void *gaudi2_get_events_stat(struct hl_device *hdev, bool aggregate, u32 *size)
6483 {
6484 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6485
6486 if (aggregate) {
6487 *size = (u32) sizeof(gaudi2->events_stat_aggregate);
6488 return gaudi2->events_stat_aggregate;
6489 }
6490
6491 *size = (u32) sizeof(gaudi2->events_stat);
6492 return gaudi2->events_stat;
6493 }
6494
6495 static void gaudi2_mmu_vdec_dcore_prepare(struct hl_device *hdev, int dcore_id,
6496 int dcore_vdec_id, u32 rw_asid, u32 rw_mmu_bp)
6497 {
6498 u32 offset = (mmDCORE0_VDEC1_BRDG_CTRL_BASE - mmDCORE0_VDEC0_BRDG_CTRL_BASE) *
6499 dcore_vdec_id + DCORE_OFFSET * dcore_id;
6500
6501 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_MMU_BP + offset, rw_mmu_bp);
6502 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_ASID + offset, rw_asid);
6503
6504 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_MMU_BP + offset, rw_mmu_bp);
6505 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_ASID + offset, rw_asid);
6506
6507 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_MMU_BP + offset, rw_mmu_bp);
6508 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_ASID + offset, rw_asid);
6509
6510 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_MMU_BP + offset, rw_mmu_bp);
6511 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_ASID + offset, rw_asid);
6512
6513 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_MMU_BP + offset, rw_mmu_bp);
6514 WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_ASID + offset, rw_asid);
6515 }
6516
6517 static void gaudi2_mmu_dcore_prepare(struct hl_device *hdev, int dcore_id, u32 asid)
6518 {
6519 u32 rw_asid = (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_SHIFT) |
6520 (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_SHIFT);
6521 struct asic_fixed_properties *prop = &hdev->asic_prop;
6522 u32 dcore_offset = dcore_id * DCORE_OFFSET;
6523 u32 vdec_id, i, ports_offset, reg_val;
6524 u8 edma_seq_base;
6525
6526
6527 edma_seq_base = dcore_id * NUM_OF_EDMA_PER_DCORE;
6528 if (prop->edma_enabled_mask & BIT(edma_seq_base)) {
6529 WREG32(mmDCORE0_EDMA0_QM_AXUSER_NONSECURED_HB_MMU_BP + dcore_offset, 0);
6530 WREG32(mmDCORE0_EDMA0_QM_AXUSER_NONSECURED_HB_ASID + dcore_offset, rw_asid);
6531 WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP + dcore_offset, 0);
6532 WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_ASID + dcore_offset, rw_asid);
6533 }
6534
6535 if (prop->edma_enabled_mask & BIT(edma_seq_base + 1)) {
6536 WREG32(mmDCORE0_EDMA1_QM_AXUSER_NONSECURED_HB_MMU_BP + dcore_offset, 0);
6537 WREG32(mmDCORE0_EDMA1_QM_AXUSER_NONSECURED_HB_ASID + dcore_offset, rw_asid);
6538 WREG32(mmDCORE0_EDMA1_CORE_CTX_AXUSER_HB_ASID + dcore_offset, rw_asid);
6539 WREG32(mmDCORE0_EDMA1_CORE_CTX_AXUSER_HB_MMU_BP + dcore_offset, 0);
6540 }
6541
6542
6543 WREG32(mmDCORE0_SYNC_MNGR_GLBL_ASID_NONE_SEC_PRIV + dcore_offset, asid);
6544
6545
6546
6547
6548 if (dcore_id > 0) {
6549 reg_val = (asid << DCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_ASID_RD_SHIFT) |
6550 (asid << DCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_ASID_WR_SHIFT);
6551 WREG32(mmDCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_ASID + dcore_offset, reg_val);
6552 WREG32(mmDCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_MMU_BP + dcore_offset, 0);
6553 }
6554
6555 WREG32(mmDCORE0_MME_CTRL_LO_MME_AXUSER_HB_MMU_BP + dcore_offset, 0);
6556 WREG32(mmDCORE0_MME_CTRL_LO_MME_AXUSER_HB_ASID + dcore_offset, rw_asid);
6557
6558 for (i = 0 ; i < NUM_OF_MME_SBTE_PORTS ; i++) {
6559 ports_offset = i * DCORE_MME_SBTE_OFFSET;
6560 WREG32(mmDCORE0_MME_SBTE0_MSTR_IF_AXUSER_HB_MMU_BP +
6561 dcore_offset + ports_offset, 0);
6562 WREG32(mmDCORE0_MME_SBTE0_MSTR_IF_AXUSER_HB_ASID +
6563 dcore_offset + ports_offset, rw_asid);
6564 }
6565
6566 for (i = 0 ; i < NUM_OF_MME_WB_PORTS ; i++) {
6567 ports_offset = i * DCORE_MME_WB_OFFSET;
6568 WREG32(mmDCORE0_MME_WB0_MSTR_IF_AXUSER_HB_MMU_BP +
6569 dcore_offset + ports_offset, 0);
6570 WREG32(mmDCORE0_MME_WB0_MSTR_IF_AXUSER_HB_ASID +
6571 dcore_offset + ports_offset, rw_asid);
6572 }
6573
6574 WREG32(mmDCORE0_MME_QM_AXUSER_NONSECURED_HB_MMU_BP + dcore_offset, 0);
6575 WREG32(mmDCORE0_MME_QM_AXUSER_NONSECURED_HB_ASID + dcore_offset, rw_asid);
6576
6577
6578
6579
6580 for (vdec_id = 0 ; vdec_id < NUM_OF_DEC_PER_DCORE ; vdec_id++) {
6581 if (prop->decoder_enabled_mask & BIT(dcore_id * NUM_OF_DEC_PER_DCORE + vdec_id))
6582 gaudi2_mmu_vdec_dcore_prepare(hdev, dcore_id, vdec_id, rw_asid, 0);
6583 }
6584 }
6585
6586 static void gudi2_mmu_vdec_shared_prepare(struct hl_device *hdev,
6587 int shared_vdec_id, u32 rw_asid, u32 rw_mmu_bp)
6588 {
6589 u32 offset = (mmPCIE_VDEC1_BRDG_CTRL_BASE - mmPCIE_VDEC0_BRDG_CTRL_BASE) * shared_vdec_id;
6590
6591 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_MMU_BP + offset, rw_mmu_bp);
6592 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_ASID + offset, rw_asid);
6593
6594 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_MMU_BP + offset, rw_mmu_bp);
6595 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_ASID + offset, rw_asid);
6596
6597 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_MMU_BP + offset, rw_mmu_bp);
6598 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_ASID + offset, rw_asid);
6599
6600 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_MMU_BP + offset, rw_mmu_bp);
6601 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_ASID + offset, rw_asid);
6602
6603 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_MMU_BP + offset, rw_mmu_bp);
6604 WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_ASID + offset, rw_asid);
6605 }
6606
6607 static void gudi2_mmu_arc_farm_arc_dup_eng_prepare(struct hl_device *hdev, int arc_farm_id,
6608 u32 rw_asid, u32 rw_mmu_bp)
6609 {
6610 u32 offset = (mmARC_FARM_ARC1_DUP_ENG_BASE - mmARC_FARM_ARC0_DUP_ENG_BASE) * arc_farm_id;
6611
6612 WREG32(mmARC_FARM_ARC0_DUP_ENG_AXUSER_HB_MMU_BP + offset, rw_mmu_bp);
6613 WREG32(mmARC_FARM_ARC0_DUP_ENG_AXUSER_HB_ASID + offset, rw_asid);
6614 }
6615
6616 static void gaudi2_arc_mmu_prepare(struct hl_device *hdev, u32 cpu_id, u32 asid)
6617 {
6618 u32 reg_base, reg_offset, reg_val = 0;
6619
6620 reg_base = gaudi2_arc_blocks_bases[cpu_id];
6621
6622
6623 reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_ARC_REGION_CFG_MMU_BP_MASK, 0);
6624 reg_val |= FIELD_PREP(ARC_FARM_ARC0_AUX_ARC_REGION_CFG_0_ASID_MASK, asid);
6625
6626 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION3_GENERAL);
6627 WREG32(reg_base + reg_offset, reg_val);
6628
6629 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION4_HBM0_FW);
6630 WREG32(reg_base + reg_offset, reg_val);
6631
6632 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION5_HBM1_GC_DATA);
6633 WREG32(reg_base + reg_offset, reg_val);
6634
6635 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION6_HBM2_GC_DATA);
6636 WREG32(reg_base + reg_offset, reg_val);
6637
6638 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION7_HBM3_GC_DATA);
6639 WREG32(reg_base + reg_offset, reg_val);
6640
6641 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION9_PCIE);
6642 WREG32(reg_base + reg_offset, reg_val);
6643
6644 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION10_GENERAL);
6645 WREG32(reg_base + reg_offset, reg_val);
6646
6647 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION11_GENERAL);
6648 WREG32(reg_base + reg_offset, reg_val);
6649
6650 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION12_GENERAL);
6651 WREG32(reg_base + reg_offset, reg_val);
6652
6653 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION13_GENERAL);
6654 WREG32(reg_base + reg_offset, reg_val);
6655
6656 reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION14_GENERAL);
6657 WREG32(reg_base + reg_offset, reg_val);
6658 }
6659
6660 static int gaudi2_arc_mmu_prepare_all(struct hl_device *hdev, u32 asid)
6661 {
6662 int i;
6663
6664 if (hdev->fw_components & FW_TYPE_BOOT_CPU)
6665 return hl_fw_cpucp_engine_core_asid_set(hdev, asid);
6666
6667 for (i = CPU_ID_SCHED_ARC0 ; i < NUM_OF_ARC_FARMS_ARC ; i++)
6668 gaudi2_arc_mmu_prepare(hdev, i, asid);
6669
6670 for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ ; i += 4) {
6671 if (!gaudi2_is_queue_enabled(hdev, i))
6672 continue;
6673
6674 gaudi2_arc_mmu_prepare(hdev, gaudi2_queue_id_to_arc_id[i], asid);
6675 }
6676
6677 return 0;
6678 }
6679
6680 static int gaudi2_mmu_shared_prepare(struct hl_device *hdev, u32 asid)
6681 {
6682 struct asic_fixed_properties *prop = &hdev->asic_prop;
6683 u32 rw_asid, offset;
6684 int rc, i;
6685
6686 rw_asid = FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_MASK, asid) |
6687 FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_MASK, asid);
6688
6689 WREG32(mmPDMA0_QM_AXUSER_NONSECURED_HB_ASID, rw_asid);
6690 WREG32(mmPDMA0_QM_AXUSER_NONSECURED_HB_MMU_BP, 0);
6691 WREG32(mmPDMA0_CORE_CTX_AXUSER_HB_ASID, rw_asid);
6692 WREG32(mmPDMA0_CORE_CTX_AXUSER_HB_MMU_BP, 0);
6693
6694 WREG32(mmPDMA1_QM_AXUSER_NONSECURED_HB_ASID, rw_asid);
6695 WREG32(mmPDMA1_QM_AXUSER_NONSECURED_HB_MMU_BP, 0);
6696 WREG32(mmPDMA1_CORE_CTX_AXUSER_HB_ASID, rw_asid);
6697 WREG32(mmPDMA1_CORE_CTX_AXUSER_HB_MMU_BP, 0);
6698
6699
6700 for (i = 0 ; i < NUM_OF_ROT ; i++) {
6701 offset = i * ROT_OFFSET;
6702 WREG32(mmROT0_QM_AXUSER_NONSECURED_HB_ASID + offset, rw_asid);
6703 WREG32(mmROT0_QM_AXUSER_NONSECURED_HB_MMU_BP + offset, 0);
6704 RMWREG32(mmROT0_CPL_QUEUE_AWUSER + offset, asid, MMUBP_ASID_MASK);
6705 RMWREG32(mmROT0_DESC_HBW_ARUSER_LO + offset, asid, MMUBP_ASID_MASK);
6706 RMWREG32(mmROT0_DESC_HBW_AWUSER_LO + offset, asid, MMUBP_ASID_MASK);
6707 }
6708
6709
6710 if (prop->decoder_enabled_mask & BIT(NUM_OF_DCORES * NUM_OF_DEC_PER_DCORE + 0))
6711 gudi2_mmu_vdec_shared_prepare(hdev, 0, rw_asid, 0);
6712
6713 if (prop->decoder_enabled_mask & BIT(NUM_OF_DCORES * NUM_OF_DEC_PER_DCORE + 1))
6714 gudi2_mmu_vdec_shared_prepare(hdev, 1, rw_asid, 0);
6715
6716
6717 for (i = 0 ; i < NUM_OF_ARC_FARMS_ARC ; i++)
6718 gudi2_mmu_arc_farm_arc_dup_eng_prepare(hdev, i, rw_asid, 0);
6719
6720 rc = gaudi2_arc_mmu_prepare_all(hdev, asid);
6721 if (rc)
6722 return rc;
6723
6724 return 0;
6725 }
6726
6727 static void gaudi2_tpc_mmu_prepare(struct hl_device *hdev, int dcore, int inst, u32 offset,
6728 void *data)
6729 {
6730 struct gaudi2_tpc_mmu_data *mmu_data = (struct gaudi2_tpc_mmu_data *)data;
6731
6732 WREG32(mmDCORE0_TPC0_CFG_AXUSER_HB_MMU_BP + offset, 0);
6733 WREG32(mmDCORE0_TPC0_CFG_AXUSER_HB_ASID + offset, mmu_data->rw_asid);
6734 WREG32(mmDCORE0_TPC0_QM_AXUSER_NONSECURED_HB_MMU_BP + offset, 0);
6735 WREG32(mmDCORE0_TPC0_QM_AXUSER_NONSECURED_HB_ASID + offset, mmu_data->rw_asid);
6736 }
6737
6738
6739 static int gaudi2_mmu_prepare(struct hl_device *hdev, u32 asid)
6740 {
6741 struct gaudi2_device *gaudi2 = hdev->asic_specific;
6742 struct gaudi2_tpc_mmu_data tpc_mmu_data;
6743 struct iterate_module_ctx tpc_iter = {
6744 .fn = &gaudi2_tpc_mmu_prepare,
6745 .data = &tpc_mmu_data,
6746 };
6747 int rc, i;
6748
6749 if (asid & ~DCORE0_HMMU0_STLB_ASID_ASID_MASK) {
6750 dev_crit(hdev->dev, "asid %u is too big\n", asid);
6751 return -EINVAL;
6752 }
6753
6754 if (!(gaudi2->hw_cap_initialized & HW_CAP_MMU_MASK))
6755 return 0;
6756
6757 rc = gaudi2_mmu_shared_prepare(hdev, asid);
6758 if (rc)
6759 return rc;
6760
6761
6762 tpc_mmu_data.rw_asid = (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_SHIFT) |
6763 (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_SHIFT);
6764 gaudi2_iterate_tpcs(hdev, &tpc_iter);
6765 for (i = 0 ; i < NUM_OF_DCORES ; i++)
6766 gaudi2_mmu_dcore_prepare(hdev, i, asid);
6767
6768 return 0;
6769 }
6770
6771 static inline bool is_info_event(u32 event)
6772 {
6773 switch (event) {
6774 case GAUDI2_EVENT_CPU_CPLD_SHUTDOWN_CAUSE:
6775 return true;
6776 default:
6777 return false;
6778 }
6779 }
6780
6781 static void gaudi2_print_irq_info(struct hl_device *hdev, u16 event_type)
6782 {
6783 char desc[64] = "";
6784 bool event_valid = false;
6785
6786
6787
6788
6789 if (event_type >= GAUDI2_EVENT_CPU0_STATUS_NIC0_ENG0 &&
6790 event_type <= GAUDI2_EVENT_CPU11_STATUS_NIC11_ENG1)
6791 return;
6792
6793 if (gaudi2_irq_map_table[event_type].valid) {
6794 snprintf(desc, sizeof(desc), gaudi2_irq_map_table[event_type].name);
6795 event_valid = true;
6796 }
6797
6798 if (!event_valid)
6799 snprintf(desc, sizeof(desc), "N/A");
6800
6801 if (is_info_event(event_type))
6802 dev_info_ratelimited(hdev->dev, "Received H/W interrupt %d [\"%s\"]\n",
6803 event_type, desc);
6804 else
6805 dev_err_ratelimited(hdev->dev, "Received H/W interrupt %d [\"%s\"]\n",
6806 event_type, desc);
6807 }
6808
6809 static bool gaudi2_handle_ecc_event(struct hl_device *hdev, u16 event_type,
6810 struct hl_eq_ecc_data *ecc_data)
6811 {
6812 u64 ecc_address = 0, ecc_syndrom = 0;
6813 u8 memory_wrapper_idx = 0;
6814
6815 ecc_address = le64_to_cpu(ecc_data->ecc_address);
6816 ecc_syndrom = le64_to_cpu(ecc_data->ecc_syndrom);
6817 memory_wrapper_idx = ecc_data->memory_wrapper_idx;
6818
6819 dev_err(hdev->dev,
6820 "ECC error detected. address: %#llx. Syndrom: %#llx. block id %u. critical %u.\n",
6821 ecc_address, ecc_syndrom, memory_wrapper_idx, ecc_data->is_critical);
6822
6823 return !!ecc_data->is_critical;
6824 }
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834 static inline u32 gaudi2_queue_idx_dec(u32 idx, u32 q_len)
6835 {
6836 u32 mask = q_len - 1;
6837
6838
6839
6840
6841
6842
6843 return (idx + q_len - 1) & mask;
6844 }
6845
6846
6847
6848
6849
6850
6851
6852
6853 static void gaudi2_print_sw_config_stream_data(struct hl_device *hdev,
6854 u32 stream, u64 qman_base)
6855 {
6856 u64 cq_ptr_lo, cq_ptr_hi, cq_tsize, cq_ptr;
6857 u32 cq_ptr_lo_off, size;
6858
6859 cq_ptr_lo_off = mmDCORE0_TPC0_QM_CQ_PTR_LO_1 - mmDCORE0_TPC0_QM_CQ_PTR_LO_0;
6860
6861 cq_ptr_lo = qman_base + (mmDCORE0_TPC0_QM_CQ_PTR_LO_0 - mmDCORE0_TPC0_QM_BASE) +
6862 stream * cq_ptr_lo_off;
6863
6864 cq_ptr_hi = cq_ptr_lo + (mmDCORE0_TPC0_QM_CQ_PTR_HI_0 - mmDCORE0_TPC0_QM_CQ_PTR_LO_0);
6865
6866 cq_tsize = cq_ptr_lo + (mmDCORE0_TPC0_QM_CQ_TSIZE_0 - mmDCORE0_TPC0_QM_CQ_PTR_LO_0);
6867
6868 cq_ptr = (((u64) RREG32(cq_ptr_hi)) << 32) | RREG32(cq_ptr_lo);
6869 size = RREG32(cq_tsize);
6870 dev_info(hdev->dev, "stop on err: stream: %u, addr: %#llx, size: %x\n",
6871 stream, cq_ptr, size);
6872 }
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883 static void gaudi2_print_last_pqes_on_err(struct hl_device *hdev, u32 qid_base, u32 stream,
6884 u64 qman_base, bool pr_sw_conf)
6885 {
6886 u32 ci, qm_ci_stream_off;
6887 struct hl_hw_queue *q;
6888 u64 pq_ci;
6889 int i;
6890
6891 q = &hdev->kernel_queues[qid_base + stream];
6892
6893 qm_ci_stream_off = mmDCORE0_TPC0_QM_PQ_CI_1 - mmDCORE0_TPC0_QM_PQ_CI_0;
6894 pq_ci = qman_base + (mmDCORE0_TPC0_QM_PQ_CI_0 - mmDCORE0_TPC0_QM_BASE) +
6895 stream * qm_ci_stream_off;
6896
6897 hdev->asic_funcs->hw_queues_lock(hdev);
6898
6899 if (pr_sw_conf)
6900 gaudi2_print_sw_config_stream_data(hdev, stream, qman_base);
6901
6902 ci = RREG32(pq_ci);
6903
6904
6905 ci = gaudi2_queue_idx_dec(ci, HL_QUEUE_LENGTH);
6906
6907 for (i = 0; i < PQ_FETCHER_CACHE_SIZE; i++) {
6908 struct hl_bd *bd;
6909 u64 addr;
6910 u32 len;
6911
6912 bd = q->kernel_address;
6913 bd += ci;
6914
6915 len = le32_to_cpu(bd->len);
6916
6917 if (!len)
6918 break;
6919
6920 addr = le64_to_cpu(bd->ptr);
6921
6922 dev_info(hdev->dev, "stop on err PQE(stream %u): ci: %u, addr: %#llx, size: %x\n",
6923 stream, ci, addr, len);
6924
6925
6926 ci = gaudi2_queue_idx_dec(ci, HL_QUEUE_LENGTH);
6927 }
6928
6929 hdev->asic_funcs->hw_queues_unlock(hdev);
6930 }
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944 static void print_qman_data_on_err(struct hl_device *hdev, u32 qid_base, u32 stream, u64 qman_base)
6945 {
6946 u32 i;
6947
6948 if (stream != QMAN_STREAMS) {
6949 gaudi2_print_last_pqes_on_err(hdev, qid_base, stream, qman_base, true);
6950 return;
6951 }
6952
6953 gaudi2_print_sw_config_stream_data(hdev, stream, qman_base);
6954
6955 for (i = 0 ; i < QMAN_STREAMS ; i++)
6956 gaudi2_print_last_pqes_on_err(hdev, qid_base, i, qman_base, false);
6957 }
6958
6959 static void gaudi2_handle_qman_err_generic(struct hl_device *hdev, const char *qm_name,
6960 u64 qman_base, u32 qid_base)
6961 {
6962 u32 i, j, glbl_sts_val, arb_err_val, num_error_causes;
6963 u64 glbl_sts_addr, arb_err_addr;
6964 char reg_desc[32];
6965
6966 glbl_sts_addr = qman_base + (mmDCORE0_TPC0_QM_GLBL_ERR_STS_0 - mmDCORE0_TPC0_QM_BASE);
6967 arb_err_addr = qman_base + (mmDCORE0_TPC0_QM_ARB_ERR_CAUSE - mmDCORE0_TPC0_QM_BASE);
6968
6969
6970 for (i = 0 ; i < QMAN_STREAMS + 1 ; i++) {
6971 glbl_sts_val = RREG32(glbl_sts_addr + 4 * i);
6972
6973 if (!glbl_sts_val)
6974 continue;
6975
6976 if (i == QMAN_STREAMS) {
6977 snprintf(reg_desc, ARRAY_SIZE(reg_desc), "LowerCP");
6978 num_error_causes = GAUDI2_NUM_OF_QM_LCP_ERR_CAUSE;
6979 } else {
6980 snprintf(reg_desc, ARRAY_SIZE(reg_desc), "stream%u", i);
6981 num_error_causes = GAUDI2_NUM_OF_QM_ERR_CAUSE;
6982 }
6983
6984 for (j = 0 ; j < num_error_causes ; j++)
6985 if (glbl_sts_val & BIT(j))
6986 dev_err_ratelimited(hdev->dev, "%s %s. err cause: %s\n",
6987 qm_name, reg_desc,
6988 i == QMAN_STREAMS ?
6989 gaudi2_qman_lower_cp_error_cause[j] :
6990 gaudi2_qman_error_cause[j]);
6991
6992 print_qman_data_on_err(hdev, qid_base, i, qman_base);
6993 }
6994
6995 arb_err_val = RREG32(arb_err_addr);
6996
6997 if (!arb_err_val)
6998 return;
6999
7000 for (j = 0 ; j < GAUDI2_NUM_OF_QM_ARB_ERR_CAUSE ; j++) {
7001 if (arb_err_val & BIT(j))
7002 dev_err_ratelimited(hdev->dev, "%s ARB_ERR. err cause: %s\n",
7003 qm_name, gaudi2_qman_arb_error_cause[j]);
7004 }
7005 }
7006
7007 static void gaudi2_razwi_rr_hbw_shared_printf_info(struct hl_device *hdev,
7008 u64 rtr_mstr_if_base_addr, bool is_write, char *name,
7009 bool read_razwi_regs, struct hl_eq_razwi_info *razwi_info)
7010 {
7011 u32 razwi_hi, razwi_lo, razwi_xy;
7012
7013 if (is_write) {
7014 if (read_razwi_regs) {
7015 razwi_hi = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_HI);
7016 razwi_lo = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_LO);
7017 razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_XY);
7018 } else {
7019 razwi_hi = le32_to_cpu(razwi_info->hbw.rr_aw_razwi_hi_reg);
7020 razwi_lo = le32_to_cpu(razwi_info->hbw.rr_aw_razwi_lo_reg);
7021 razwi_xy = le32_to_cpu(razwi_info->hbw.rr_aw_razwi_id_reg);
7022 }
7023
7024 dev_err_ratelimited(hdev->dev,
7025 "%s-RAZWI SHARED RR HBW WR error, captured address HI 0x%x LO 0x%x, Initiator coordinates 0x%x\n",
7026 name, razwi_hi, razwi_lo, razwi_xy);
7027 } else {
7028 if (read_razwi_regs) {
7029 razwi_hi = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_HI);
7030 razwi_lo = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_LO);
7031 razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_XY);
7032 } else {
7033 razwi_hi = le32_to_cpu(razwi_info->hbw.rr_ar_razwi_hi_reg);
7034 razwi_lo = le32_to_cpu(razwi_info->hbw.rr_ar_razwi_lo_reg);
7035 razwi_xy = le32_to_cpu(razwi_info->hbw.rr_ar_razwi_id_reg);
7036 }
7037
7038 dev_err_ratelimited(hdev->dev,
7039 "%s-RAZWI SHARED RR HBW AR error, captured address HI 0x%x LO 0x%x, Initiator coordinates 0x%x\n",
7040 name, razwi_hi, razwi_lo, razwi_xy);
7041 }
7042 }
7043
7044 static void gaudi2_razwi_rr_lbw_shared_printf_info(struct hl_device *hdev,
7045 u64 rtr_mstr_if_base_addr, bool is_write, char *name,
7046 bool read_razwi_regs, struct hl_eq_razwi_info *razwi_info)
7047 {
7048 u32 razwi_addr, razwi_xy;
7049
7050 if (is_write) {
7051 if (read_razwi_regs) {
7052 razwi_addr = RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI);
7053 razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI_XY);
7054 } else {
7055 razwi_addr = le32_to_cpu(razwi_info->lbw.rr_aw_razwi_reg);
7056 razwi_xy = le32_to_cpu(razwi_info->lbw.rr_aw_razwi_id_reg);
7057 }
7058
7059 dev_err_ratelimited(hdev->dev,
7060 "%s-RAZWI SHARED RR LBW WR error, mstr_if 0x%llx, captured address 0x%x, Initiator coordinates 0x%x\n",
7061 name, rtr_mstr_if_base_addr, razwi_addr, razwi_xy);
7062 } else {
7063 if (read_razwi_regs) {
7064 razwi_addr = RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI);
7065 razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI_XY);
7066 } else {
7067 razwi_addr = le32_to_cpu(razwi_info->lbw.rr_ar_razwi_reg);
7068 razwi_xy = le32_to_cpu(razwi_info->lbw.rr_ar_razwi_id_reg);
7069 }
7070
7071 dev_err_ratelimited(hdev->dev,
7072 "%s-RAZWI SHARED RR LBW AR error, mstr_if 0x%llx, captured address 0x%x Initiator coordinates 0x%x\n",
7073 name, rtr_mstr_if_base_addr, razwi_addr, razwi_xy);
7074 }
7075 }
7076
7077
7078
7079
7080
7081 static void gaudi2_ack_module_razwi_event_handler(struct hl_device *hdev,
7082 enum razwi_event_sources module, u8 module_idx,
7083 u8 module_sub_idx, struct hl_eq_razwi_info *razwi_info)
7084 {
7085 bool via_sft = false, read_razwi_regs = false;
7086 u32 rtr_id, dcore_id, dcore_rtr_id, sft_id;
7087 u64 rtr_mstr_if_base_addr;
7088 u32 hbw_shrd_aw = 0, hbw_shrd_ar = 0;
7089 u32 lbw_shrd_aw = 0, lbw_shrd_ar = 0;
7090 char initiator_name[64];
7091
7092 if (hdev->pldm || !(hdev->fw_components & FW_TYPE_LINUX) || !razwi_info)
7093 read_razwi_regs = true;
7094
7095 switch (module) {
7096 case RAZWI_TPC:
7097 rtr_id = gaudi2_tpc_initiator_rtr_id[module_idx];
7098 sprintf(initiator_name, "TPC_%u", module_idx);
7099 break;
7100 case RAZWI_MME:
7101 sprintf(initiator_name, "MME_%u", module_idx);
7102 switch (module_sub_idx) {
7103 case MME_WAP0:
7104 rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].wap0;
7105 break;
7106 case MME_WAP1:
7107 rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].wap1;
7108 break;
7109 case MME_WRITE:
7110 rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].write;
7111 break;
7112 case MME_READ:
7113 rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].read;
7114 break;
7115 case MME_SBTE0:
7116 rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte0;
7117 break;
7118 case MME_SBTE1:
7119 rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte1;
7120 break;
7121 case MME_SBTE2:
7122 rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte2;
7123 break;
7124 case MME_SBTE3:
7125 rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte3;
7126 break;
7127 case MME_SBTE4:
7128 rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte4;
7129 break;
7130 default:
7131 return;
7132 }
7133 break;
7134 case RAZWI_EDMA:
7135 sft_id = gaudi2_edma_initiator_sft_id[module_idx].interface_id;
7136 dcore_id = gaudi2_edma_initiator_sft_id[module_idx].dcore_id;
7137 via_sft = true;
7138 sprintf(initiator_name, "EDMA_%u", module_idx);
7139 break;
7140 case RAZWI_PDMA:
7141 rtr_id = gaudi2_pdma_initiator_rtr_id[module_idx];
7142 sprintf(initiator_name, "PDMA_%u", module_idx);
7143 break;
7144 case RAZWI_NIC:
7145 rtr_id = gaudi2_nic_initiator_rtr_id[module_idx];
7146 sprintf(initiator_name, "NIC_%u", module_idx);
7147 break;
7148 case RAZWI_DEC:
7149 rtr_id = gaudi2_dec_initiator_rtr_id[module_idx];
7150 sprintf(initiator_name, "DEC_%u", module_idx);
7151 break;
7152 case RAZWI_ROT:
7153 rtr_id = gaudi2_rot_initiator_rtr_id[module_idx];
7154 sprintf(initiator_name, "ROT_%u", module_idx);
7155 break;
7156 default:
7157 return;
7158 }
7159
7160 if (!read_razwi_regs) {
7161 if (le32_to_cpu(razwi_info->razwi_happened_mask) & RAZWI_HAPPENED_HBW) {
7162 hbw_shrd_aw = le32_to_cpu(razwi_info->razwi_happened_mask) &
7163 RAZWI_HAPPENED_AW;
7164 hbw_shrd_ar = le32_to_cpu(razwi_info->razwi_happened_mask) &
7165 RAZWI_HAPPENED_AR;
7166 } else if (le32_to_cpu(razwi_info->razwi_happened_mask) & RAZWI_HAPPENED_LBW) {
7167 lbw_shrd_aw = le32_to_cpu(razwi_info->razwi_happened_mask) &
7168 RAZWI_HAPPENED_AW;
7169 lbw_shrd_ar = le32_to_cpu(razwi_info->razwi_happened_mask) &
7170 RAZWI_HAPPENED_AR;
7171 }
7172 rtr_mstr_if_base_addr = 0;
7173
7174 goto dump_info;
7175 }
7176
7177
7178 if (via_sft) {
7179 rtr_mstr_if_base_addr = mmSFT0_HBW_RTR_IF0_RTR_CTRL_BASE +
7180 dcore_id * SFT_DCORE_OFFSET +
7181 sft_id * SFT_IF_OFFSET +
7182 RTR_MSTR_IF_OFFSET;
7183 } else {
7184 dcore_id = rtr_id / NUM_OF_RTR_PER_DCORE;
7185 dcore_rtr_id = rtr_id % NUM_OF_RTR_PER_DCORE;
7186 rtr_mstr_if_base_addr = mmDCORE0_RTR0_CTRL_BASE +
7187 dcore_id * DCORE_OFFSET +
7188 dcore_rtr_id * DCORE_RTR_OFFSET +
7189 RTR_MSTR_IF_OFFSET;
7190 }
7191
7192
7193 hbw_shrd_aw = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_HAPPENED);
7194
7195 hbw_shrd_ar = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_HAPPENED);
7196
7197 if (via_sft) {
7198
7199
7200
7201 u64 base;
7202
7203 base = mmSFT0_HBW_RTR_IF0_RTR_CTRL_BASE + dcore_id * SFT_DCORE_OFFSET +
7204 RTR_LBW_MSTR_IF_OFFSET;
7205
7206 lbw_shrd_aw = RREG32(base + RR_SHRD_LBW_AW_RAZWI_HAPPENED);
7207
7208 lbw_shrd_ar = RREG32(base + RR_SHRD_LBW_AR_RAZWI_HAPPENED);
7209 } else {
7210 lbw_shrd_aw = RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI_HAPPENED);
7211
7212 lbw_shrd_ar = RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI_HAPPENED);
7213 }
7214
7215 dump_info:
7216
7217 if (!hbw_shrd_aw && !hbw_shrd_ar && !lbw_shrd_aw && !lbw_shrd_ar)
7218 return;
7219
7220 if (hbw_shrd_aw) {
7221 gaudi2_razwi_rr_hbw_shared_printf_info(hdev, rtr_mstr_if_base_addr, true,
7222 initiator_name, read_razwi_regs, razwi_info);
7223
7224
7225 if (read_razwi_regs)
7226 WREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_HAPPENED, hbw_shrd_aw);
7227 }
7228
7229 if (hbw_shrd_ar) {
7230 gaudi2_razwi_rr_hbw_shared_printf_info(hdev, rtr_mstr_if_base_addr, false,
7231 initiator_name, read_razwi_regs, razwi_info);
7232
7233
7234 if (read_razwi_regs)
7235 WREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_HAPPENED, hbw_shrd_ar);
7236 }
7237
7238 if (lbw_shrd_aw) {
7239 gaudi2_razwi_rr_lbw_shared_printf_info(hdev, rtr_mstr_if_base_addr, true,
7240 initiator_name, read_razwi_regs, razwi_info);
7241
7242
7243 if (read_razwi_regs)
7244 WREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI_HAPPENED, lbw_shrd_aw);
7245 }
7246
7247 if (lbw_shrd_ar) {
7248 gaudi2_razwi_rr_lbw_shared_printf_info(hdev, rtr_mstr_if_base_addr, false,
7249 initiator_name, read_razwi_regs, razwi_info);
7250
7251
7252 if (read_razwi_regs)
7253 WREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI_HAPPENED, lbw_shrd_ar);
7254 }
7255 }
7256
7257 static void gaudi2_check_if_razwi_happened(struct hl_device *hdev)
7258 {
7259 struct asic_fixed_properties *prop = &hdev->asic_prop;
7260 u8 mod_idx, sub_mod;
7261
7262
7263 for (mod_idx = 0 ; mod_idx < (NUM_OF_TPC_PER_DCORE * NUM_OF_DCORES + 1) ; mod_idx++) {
7264 if (prop->tpc_enabled_mask & BIT(mod_idx))
7265 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_TPC, mod_idx, 0, NULL);
7266 }
7267
7268
7269 for (mod_idx = 0 ; mod_idx < (NUM_OF_MME_PER_DCORE * NUM_OF_DCORES) ; mod_idx++)
7270 for (sub_mod = MME_WAP0 ; sub_mod < MME_INITIATORS_MAX ; sub_mod++)
7271 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mod_idx,
7272 sub_mod, NULL);
7273
7274
7275 for (mod_idx = 0 ; mod_idx < (NUM_OF_EDMA_PER_DCORE * NUM_OF_DCORES) ; mod_idx++)
7276 if (prop->edma_enabled_mask & BIT(mod_idx))
7277 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_EDMA, mod_idx, 0, NULL);
7278
7279
7280 for (mod_idx = 0 ; mod_idx < NUM_OF_PDMA ; mod_idx++)
7281 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_PDMA, mod_idx, 0, NULL);
7282
7283
7284 for (mod_idx = 0 ; mod_idx < NIC_NUMBER_OF_PORTS ; mod_idx++)
7285 if (hdev->nic_ports_mask & BIT(mod_idx))
7286 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_NIC, mod_idx >> 1, 0,
7287 NULL);
7288
7289
7290 for (mod_idx = 0 ; mod_idx < NUMBER_OF_DEC ; mod_idx++)
7291 if (prop->decoder_enabled_mask & BIT(mod_idx))
7292 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_DEC, mod_idx, 0, NULL);
7293
7294
7295 for (mod_idx = 0 ; mod_idx < NUM_OF_ROT ; mod_idx++)
7296 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_ROT, mod_idx, 0, NULL);
7297 }
7298
7299 static void gaudi2_razwi_unmapped_addr_hbw_printf_info(struct hl_device *hdev,
7300 u64 rtr_ctrl_base_addr, bool is_write)
7301 {
7302 u32 razwi_hi, razwi_lo;
7303
7304 if (is_write) {
7305 razwi_hi = RREG32(rtr_ctrl_base_addr + DEC_RAZWI_HBW_AW_ADDR_HI);
7306 razwi_lo = RREG32(rtr_ctrl_base_addr + DEC_RAZWI_HBW_AW_ADDR_LO);
7307
7308 dev_err_ratelimited(hdev->dev,
7309 "RAZWI PSOC unmapped HBW WR error, ctr_base 0x%llx, captured address HI 0x%x, LO 0x%x\n",
7310 rtr_ctrl_base_addr, razwi_hi, razwi_lo);
7311
7312
7313 WREG32(rtr_ctrl_base_addr + DEC_RAZWI_HBW_AW_SET, 0x1);
7314 } else {
7315 razwi_hi = RREG32(rtr_ctrl_base_addr + DEC_RAZWI_HBW_AR_ADDR_HI);
7316
7317 razwi_lo = RREG32(rtr_ctrl_base_addr + DEC_RAZWI_HBW_AR_ADDR_LO);
7318
7319 dev_err_ratelimited(hdev->dev,
7320 "RAZWI PSOC unmapped HBW AR error, ctr_base 0x%llx, captured address HI 0x%x, LO 0x%x\n",
7321 rtr_ctrl_base_addr, razwi_hi, razwi_lo);
7322
7323
7324 WREG32(rtr_ctrl_base_addr + DEC_RAZWI_HBW_AR_SET, 0x1);
7325 }
7326 }
7327
7328 static void gaudi2_razwi_unmapped_addr_lbw_printf_info(struct hl_device *hdev,
7329 u64 rtr_ctrl_base_addr, bool is_write)
7330 {
7331 u32 razwi_addr;
7332
7333 if (is_write) {
7334 razwi_addr = RREG32(rtr_ctrl_base_addr + DEC_RAZWI_LBW_AW_ADDR);
7335
7336 dev_err_ratelimited(hdev->dev,
7337 "RAZWI PSOC unmapped LBW WR error, ctr_base 0x%llx, captured address 0x%x\n",
7338 rtr_ctrl_base_addr, razwi_addr);
7339
7340
7341 WREG32(rtr_ctrl_base_addr + DEC_RAZWI_LBW_AW_SET, 0x1);
7342 } else {
7343 razwi_addr = RREG32(rtr_ctrl_base_addr + DEC_RAZWI_LBW_AR_ADDR);
7344
7345 dev_err_ratelimited(hdev->dev,
7346 "RAZWI PSOC unmapped LBW AR error, ctr_base 0x%llx, captured address 0x%x\n",
7347 rtr_ctrl_base_addr, razwi_addr);
7348
7349
7350 WREG32(rtr_ctrl_base_addr + DEC_RAZWI_LBW_AR_SET, 0x1);
7351 }
7352 }
7353
7354
7355 static void gaudi2_ack_psoc_razwi_event_handler(struct hl_device *hdev)
7356 {
7357 u32 hbw_aw_set, hbw_ar_set, lbw_aw_set, lbw_ar_set, rtr_id, dcore_id, dcore_rtr_id, xy,
7358 razwi_mask_info, razwi_intr = 0;
7359 int rtr_map_arr_len = NUM_OF_RTR_PER_DCORE * NUM_OF_DCORES;
7360 u64 rtr_ctrl_base_addr;
7361
7362 if (hdev->pldm || !(hdev->fw_components & FW_TYPE_LINUX)) {
7363 razwi_intr = RREG32(mmPSOC_GLOBAL_CONF_RAZWI_INTERRUPT);
7364 if (!razwi_intr)
7365 return;
7366 }
7367
7368 razwi_mask_info = RREG32(mmPSOC_GLOBAL_CONF_RAZWI_MASK_INFO);
7369
7370 xy = (razwi_mask_info & PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_AXUSER_L_MASK)
7371 >> PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_AXUSER_L_SHIFT;
7372
7373 dev_err_ratelimited(hdev->dev,
7374 "PSOC RAZWI interrupt: Mask %d, WAS_AR %d, WAS_AW %d, AXUSER_L 0x%x AXUSER_H 0x%x\n",
7375 (razwi_mask_info & PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_MASK_MASK)
7376 >> PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_MASK_SHIFT,
7377 (razwi_mask_info & PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_WAS_AR_MASK)
7378 >> PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_WAS_AR_SHIFT,
7379 (razwi_mask_info & PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_WAS_AW_MASK)
7380 >> PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_WAS_AW_SHIFT, xy,
7381 (razwi_mask_info &
7382 PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_AXUSER_H_MASK)
7383 >> PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_AXUSER_H_SHIFT);
7384 if (xy == 0) {
7385 dev_err_ratelimited(hdev->dev,
7386 "PSOC RAZWI interrupt: received event from 0 rtr coordinates\n");
7387 goto clear;
7388 }
7389
7390
7391 for (rtr_id = 0 ; rtr_id < rtr_map_arr_len ; rtr_id++)
7392 if (rtr_coordinates_to_rtr_id[rtr_id] == xy)
7393 break;
7394
7395 if (rtr_id == rtr_map_arr_len) {
7396 dev_err_ratelimited(hdev->dev,
7397 "PSOC RAZWI interrupt: invalid rtr coordinates (0x%x)\n", xy);
7398 goto clear;
7399 }
7400
7401
7402 dcore_id = rtr_id / NUM_OF_RTR_PER_DCORE;
7403 dcore_rtr_id = rtr_id % NUM_OF_RTR_PER_DCORE;
7404 rtr_ctrl_base_addr = mmDCORE0_RTR0_CTRL_BASE + dcore_id * DCORE_OFFSET +
7405 dcore_rtr_id * DCORE_RTR_OFFSET;
7406
7407 hbw_aw_set = RREG32(rtr_ctrl_base_addr + DEC_RAZWI_HBW_AW_SET);
7408 hbw_ar_set = RREG32(rtr_ctrl_base_addr + DEC_RAZWI_HBW_AR_SET);
7409 lbw_aw_set = RREG32(rtr_ctrl_base_addr + DEC_RAZWI_LBW_AW_SET);
7410 lbw_ar_set = RREG32(rtr_ctrl_base_addr + DEC_RAZWI_LBW_AR_SET);
7411
7412 if (hbw_aw_set)
7413 gaudi2_razwi_unmapped_addr_hbw_printf_info(hdev, rtr_ctrl_base_addr, true);
7414
7415 if (hbw_ar_set)
7416 gaudi2_razwi_unmapped_addr_hbw_printf_info(hdev, rtr_ctrl_base_addr, false);
7417
7418 if (lbw_aw_set)
7419 gaudi2_razwi_unmapped_addr_lbw_printf_info(hdev, rtr_ctrl_base_addr, true);
7420
7421 if (lbw_ar_set)
7422 gaudi2_razwi_unmapped_addr_lbw_printf_info(hdev, rtr_ctrl_base_addr, false);
7423
7424 clear:
7425
7426 if (hdev->pldm || !(hdev->fw_components & FW_TYPE_LINUX))
7427 WREG32(mmPSOC_GLOBAL_CONF_RAZWI_INTERRUPT, razwi_intr);
7428 }
7429
7430 static void _gaudi2_handle_qm_sei_err(struct hl_device *hdev, u64 qman_base)
7431 {
7432 u32 i, sts_val, sts_clr_val = 0;
7433
7434 sts_val = RREG32(qman_base + QM_SEI_STATUS_OFFSET);
7435
7436 for (i = 0 ; i < GAUDI2_NUM_OF_QM_SEI_ERR_CAUSE ; i++) {
7437 if (sts_val & BIT(i)) {
7438 dev_err_ratelimited(hdev->dev, "QM SEI. err cause: %s\n",
7439 gaudi2_qm_sei_error_cause[i]);
7440 sts_clr_val |= BIT(i);
7441 }
7442 }
7443
7444 WREG32(qman_base + QM_SEI_STATUS_OFFSET, sts_clr_val);
7445 }
7446
7447 static void gaudi2_handle_qm_sei_err(struct hl_device *hdev, u16 event_type,
7448 struct hl_eq_razwi_info *razwi_info)
7449 {
7450 u64 qman_base;
7451 u8 index;
7452
7453 switch (event_type) {
7454 case GAUDI2_EVENT_TPC0_AXI_ERR_RSP ... GAUDI2_EVENT_TPC23_AXI_ERR_RSP:
7455 index = event_type - GAUDI2_EVENT_TPC0_AXI_ERR_RSP;
7456 qman_base = mmDCORE0_TPC0_QM_BASE +
7457 (index / NUM_OF_TPC_PER_DCORE) * DCORE_OFFSET +
7458 (index % NUM_OF_TPC_PER_DCORE) * DCORE_TPC_OFFSET;
7459 break;
7460 case GAUDI2_EVENT_TPC24_AXI_ERR_RSP:
7461 qman_base = mmDCORE0_TPC6_QM_BASE;
7462 break;
7463 case GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE:
7464 case GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE:
7465 case GAUDI2_EVENT_MME2_CTRL_AXI_ERROR_RESPONSE:
7466 case GAUDI2_EVENT_MME3_CTRL_AXI_ERROR_RESPONSE:
7467 index = (event_type - GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE) /
7468 (GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE -
7469 GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE);
7470 qman_base = mmDCORE0_MME_QM_BASE + index * DCORE_OFFSET;
7471 break;
7472 case GAUDI2_EVENT_PDMA_CH0_AXI_ERR_RSP:
7473 case GAUDI2_EVENT_PDMA_CH1_AXI_ERR_RSP:
7474 index = event_type - GAUDI2_EVENT_PDMA_CH0_AXI_ERR_RSP;
7475 qman_base = mmPDMA0_QM_BASE + index * PDMA_OFFSET;
7476 break;
7477 case GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE:
7478 case GAUDI2_EVENT_ROTATOR1_AXI_ERROR_RESPONSE:
7479 index = event_type - GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE;
7480 qman_base = mmROT0_QM_BASE + index * ROT_OFFSET;
7481 break;
7482 default:
7483 return;
7484 }
7485
7486 _gaudi2_handle_qm_sei_err(hdev, qman_base);
7487
7488
7489 if (event_type >= GAUDI2_EVENT_NIC0_AXI_ERROR_RESPONSE &&
7490 event_type <= GAUDI2_EVENT_NIC11_AXI_ERROR_RESPONSE)
7491 _gaudi2_handle_qm_sei_err(hdev, qman_base + NIC_QM_OFFSET);
7492
7493
7494 if (razwi_info)
7495 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_PDMA, 0, 0, razwi_info);
7496 }
7497
7498 static void gaudi2_handle_qman_err(struct hl_device *hdev, u16 event_type)
7499 {
7500 u32 qid_base;
7501 u64 qman_base;
7502 char desc[32];
7503 u8 index;
7504
7505 switch (event_type) {
7506 case GAUDI2_EVENT_TPC0_QM ... GAUDI2_EVENT_TPC5_QM:
7507 index = event_type - GAUDI2_EVENT_TPC0_QM;
7508 qid_base = GAUDI2_QUEUE_ID_DCORE0_TPC_0_0 + index * QMAN_STREAMS;
7509 qman_base = mmDCORE0_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;
7510 snprintf(desc, ARRAY_SIZE(desc), "DCORE0_TPC%d_QM", index);
7511 break;
7512 case GAUDI2_EVENT_TPC6_QM ... GAUDI2_EVENT_TPC11_QM:
7513 index = event_type - GAUDI2_EVENT_TPC6_QM;
7514 qid_base = GAUDI2_QUEUE_ID_DCORE1_TPC_0_0 + index * QMAN_STREAMS;
7515 qman_base = mmDCORE1_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;
7516 snprintf(desc, ARRAY_SIZE(desc), "DCORE1_TPC%d_QM", index);
7517 break;
7518 case GAUDI2_EVENT_TPC12_QM ... GAUDI2_EVENT_TPC17_QM:
7519 index = event_type - GAUDI2_EVENT_TPC12_QM;
7520 qid_base = GAUDI2_QUEUE_ID_DCORE2_TPC_0_0 + index * QMAN_STREAMS;
7521 qman_base = mmDCORE2_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;
7522 snprintf(desc, ARRAY_SIZE(desc), "DCORE2_TPC%d_QM", index);
7523 break;
7524 case GAUDI2_EVENT_TPC18_QM ... GAUDI2_EVENT_TPC23_QM:
7525 index = event_type - GAUDI2_EVENT_TPC18_QM;
7526 qid_base = GAUDI2_QUEUE_ID_DCORE3_TPC_0_0 + index * QMAN_STREAMS;
7527 qman_base = mmDCORE3_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;
7528 snprintf(desc, ARRAY_SIZE(desc), "DCORE3_TPC%d_QM", index);
7529 break;
7530 case GAUDI2_EVENT_TPC24_QM:
7531 qid_base = GAUDI2_QUEUE_ID_DCORE0_TPC_6_0;
7532 qman_base = mmDCORE0_TPC6_QM_BASE;
7533 snprintf(desc, ARRAY_SIZE(desc), "DCORE0_TPC6_QM");
7534 break;
7535 case GAUDI2_EVENT_MME0_QM:
7536 qid_base = GAUDI2_QUEUE_ID_DCORE0_MME_0_0;
7537 qman_base = mmDCORE0_MME_QM_BASE;
7538 snprintf(desc, ARRAY_SIZE(desc), "DCORE0_MME_QM");
7539 break;
7540 case GAUDI2_EVENT_MME1_QM:
7541 qid_base = GAUDI2_QUEUE_ID_DCORE1_MME_0_0;
7542 qman_base = mmDCORE1_MME_QM_BASE;
7543 snprintf(desc, ARRAY_SIZE(desc), "DCORE1_MME_QM");
7544 break;
7545 case GAUDI2_EVENT_MME2_QM:
7546 qid_base = GAUDI2_QUEUE_ID_DCORE2_MME_0_0;
7547 qman_base = mmDCORE2_MME_QM_BASE;
7548 snprintf(desc, ARRAY_SIZE(desc), "DCORE2_MME_QM");
7549 break;
7550 case GAUDI2_EVENT_MME3_QM:
7551 qid_base = GAUDI2_QUEUE_ID_DCORE3_MME_0_0;
7552 qman_base = mmDCORE3_MME_QM_BASE;
7553 snprintf(desc, ARRAY_SIZE(desc), "DCORE3_MME_QM");
7554 break;
7555 case GAUDI2_EVENT_HDMA0_QM:
7556 qid_base = GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0;
7557 qman_base = mmDCORE0_EDMA0_QM_BASE;
7558 snprintf(desc, ARRAY_SIZE(desc), "DCORE0_EDMA0_QM");
7559 break;
7560 case GAUDI2_EVENT_HDMA1_QM:
7561 qid_base = GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0;
7562 qman_base = mmDCORE0_EDMA1_QM_BASE;
7563 snprintf(desc, ARRAY_SIZE(desc), "DCORE0_EDMA1_QM");
7564 break;
7565 case GAUDI2_EVENT_HDMA2_QM:
7566 qid_base = GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0;
7567 qman_base = mmDCORE1_EDMA0_QM_BASE;
7568 snprintf(desc, ARRAY_SIZE(desc), "DCORE1_EDMA0_QM");
7569 break;
7570 case GAUDI2_EVENT_HDMA3_QM:
7571 qid_base = GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0;
7572 qman_base = mmDCORE1_EDMA1_QM_BASE;
7573 snprintf(desc, ARRAY_SIZE(desc), "DCORE1_EDMA1_QM");
7574 break;
7575 case GAUDI2_EVENT_HDMA4_QM:
7576 qid_base = GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0;
7577 qman_base = mmDCORE2_EDMA0_QM_BASE;
7578 snprintf(desc, ARRAY_SIZE(desc), "DCORE2_EDMA0_QM");
7579 break;
7580 case GAUDI2_EVENT_HDMA5_QM:
7581 qid_base = GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0;
7582 qman_base = mmDCORE2_EDMA1_QM_BASE;
7583 snprintf(desc, ARRAY_SIZE(desc), "DCORE2_EDMA1_QM");
7584 break;
7585 case GAUDI2_EVENT_HDMA6_QM:
7586 qid_base = GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0;
7587 qman_base = mmDCORE3_EDMA0_QM_BASE;
7588 snprintf(desc, ARRAY_SIZE(desc), "DCORE3_EDMA0_QM");
7589 break;
7590 case GAUDI2_EVENT_HDMA7_QM:
7591 qid_base = GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0;
7592 qman_base = mmDCORE3_EDMA1_QM_BASE;
7593 snprintf(desc, ARRAY_SIZE(desc), "DCORE3_EDMA1_QM");
7594 break;
7595 case GAUDI2_EVENT_PDMA0_QM:
7596 qid_base = GAUDI2_QUEUE_ID_PDMA_0_0;
7597 qman_base = mmPDMA0_QM_BASE;
7598 snprintf(desc, ARRAY_SIZE(desc), "PDMA0_QM");
7599 break;
7600 case GAUDI2_EVENT_PDMA1_QM:
7601 qid_base = GAUDI2_QUEUE_ID_PDMA_1_0;
7602 qman_base = mmPDMA1_QM_BASE;
7603 snprintf(desc, ARRAY_SIZE(desc), "PDMA1_QM");
7604 break;
7605 case GAUDI2_EVENT_ROTATOR0_ROT0_QM:
7606 qid_base = GAUDI2_QUEUE_ID_ROT_0_0;
7607 qman_base = mmROT0_QM_BASE;
7608 snprintf(desc, ARRAY_SIZE(desc), "ROTATOR0_QM");
7609 break;
7610 case GAUDI2_EVENT_ROTATOR1_ROT1_QM:
7611 qid_base = GAUDI2_QUEUE_ID_ROT_1_0;
7612 qman_base = mmROT1_QM_BASE;
7613 snprintf(desc, ARRAY_SIZE(desc), "ROTATOR1_QM");
7614 break;
7615 default:
7616 return;
7617 }
7618
7619 gaudi2_handle_qman_err_generic(hdev, desc, qman_base, qid_base);
7620
7621
7622 if (event_type >= GAUDI2_EVENT_HDMA2_QM && event_type <= GAUDI2_EVENT_HDMA5_QM)
7623 _gaudi2_handle_qm_sei_err(hdev, qman_base);
7624 }
7625
7626 static void gaudi2_handle_arc_farm_sei_err(struct hl_device *hdev)
7627 {
7628 u32 i, sts_val, sts_clr_val = 0;
7629
7630 sts_val = RREG32(mmARC_FARM_ARC0_AUX_ARC_SEI_INTR_STS);
7631
7632 for (i = 0 ; i < GAUDI2_NUM_OF_ARC_SEI_ERR_CAUSE ; i++) {
7633 if (sts_val & BIT(i)) {
7634 dev_err_ratelimited(hdev->dev, "ARC SEI. err cause: %s\n",
7635 gaudi2_arc_sei_error_cause[i]);
7636 sts_clr_val |= BIT(i);
7637 }
7638 }
7639
7640 WREG32(mmARC_FARM_ARC0_AUX_ARC_SEI_INTR_CLR, sts_clr_val);
7641 }
7642
7643 static void gaudi2_handle_cpu_sei_err(struct hl_device *hdev)
7644 {
7645 u32 i, sts_val, sts_clr_val = 0;
7646
7647 sts_val = RREG32(mmCPU_IF_CPU_SEI_INTR_STS);
7648
7649 for (i = 0 ; i < GAUDI2_NUM_OF_CPU_SEI_ERR_CAUSE ; i++) {
7650 if (sts_val & BIT(i)) {
7651 dev_err_ratelimited(hdev->dev, "CPU SEI. err cause: %s\n",
7652 gaudi2_cpu_sei_error_cause[i]);
7653 sts_clr_val |= BIT(i);
7654 }
7655 }
7656
7657 WREG32(mmCPU_IF_CPU_SEI_INTR_CLR, sts_clr_val);
7658 }
7659
7660 static void gaudi2_handle_rot_err(struct hl_device *hdev, u8 rot_index,
7661 struct hl_eq_razwi_with_intr_cause *razwi_with_intr_cause)
7662 {
7663 u64 intr_cause_data = le64_to_cpu(razwi_with_intr_cause->intr_cause.intr_cause_data);
7664 int i;
7665
7666 for (i = 0 ; i < GAUDI2_NUM_OF_ROT_ERR_CAUSE ; i++)
7667 if (intr_cause_data & BIT(i))
7668 dev_err_ratelimited(hdev->dev, "ROT%u. err cause: %s\n",
7669 rot_index, guadi2_rot_error_cause[i]);
7670
7671
7672 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_ROT, rot_index, 0,
7673 &razwi_with_intr_cause->razwi_info);
7674 }
7675
7676 static void gaudi2_tpc_ack_interrupts(struct hl_device *hdev, u8 tpc_index, char *interrupt_name,
7677 struct hl_eq_razwi_with_intr_cause *razwi_with_intr_cause)
7678 {
7679 u64 intr_cause_data = le64_to_cpu(razwi_with_intr_cause->intr_cause.intr_cause_data);
7680 int i;
7681
7682 for (i = 0 ; i < GAUDI2_NUM_OF_TPC_INTR_CAUSE ; i++)
7683 if (intr_cause_data & BIT(i))
7684 dev_err_ratelimited(hdev->dev, "TPC%d_%s interrupt cause: %s\n",
7685 tpc_index, interrupt_name, gaudi2_tpc_interrupts_cause[i]);
7686
7687
7688 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_TPC, tpc_index, 0,
7689 &razwi_with_intr_cause->razwi_info);
7690 }
7691
7692 static void gaudi2_handle_dec_err(struct hl_device *hdev, u8 dec_index, const char *interrupt_name,
7693 struct hl_eq_razwi_info *razwi_info)
7694 {
7695 u32 sts_addr, sts_val, sts_clr_val = 0;
7696 int i;
7697
7698 if (dec_index < NUM_OF_VDEC_PER_DCORE * NUM_OF_DCORES)
7699
7700 sts_addr = mmDCORE0_VDEC0_BRDG_CTRL_CAUSE_INTR +
7701 DCORE_OFFSET * (dec_index / NUM_OF_DEC_PER_DCORE) +
7702 DCORE_VDEC_OFFSET * (dec_index % NUM_OF_DEC_PER_DCORE);
7703 else
7704
7705 sts_addr = mmPCIE_VDEC0_BRDG_CTRL_CAUSE_INTR + PCIE_VDEC_OFFSET *
7706 (dec_index - NUM_OF_VDEC_PER_DCORE * NUM_OF_DCORES);
7707
7708 sts_val = RREG32(sts_addr);
7709
7710 for (i = 0 ; i < GAUDI2_NUM_OF_DEC_ERR_CAUSE ; i++) {
7711 if (sts_val & BIT(i)) {
7712 dev_err_ratelimited(hdev->dev, "DEC%u_%s err cause: %s\n",
7713 dec_index, interrupt_name, gaudi2_dec_error_cause[i]);
7714 sts_clr_val |= BIT(i);
7715 }
7716 }
7717
7718
7719 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_DEC, dec_index, 0, razwi_info);
7720
7721
7722 WREG32(sts_addr, sts_clr_val);
7723 }
7724
7725 static void gaudi2_handle_mme_err(struct hl_device *hdev, u8 mme_index, const char *interrupt_name,
7726 struct hl_eq_razwi_info *razwi_info)
7727 {
7728 u32 sts_addr, sts_val, sts_clr_addr, sts_clr_val = 0;
7729 int i;
7730
7731 sts_addr = mmDCORE0_MME_CTRL_LO_INTR_CAUSE + DCORE_OFFSET * mme_index;
7732 sts_clr_addr = mmDCORE0_MME_CTRL_LO_INTR_CLEAR + DCORE_OFFSET * mme_index;
7733
7734 sts_val = RREG32(sts_addr);
7735
7736 for (i = 0 ; i < GAUDI2_NUM_OF_MME_ERR_CAUSE ; i++) {
7737 if (sts_val & BIT(i)) {
7738 dev_err_ratelimited(hdev->dev, "MME%u_%s err cause: %s\n",
7739 mme_index, interrupt_name, guadi2_mme_error_cause[i]);
7740 sts_clr_val |= BIT(i);
7741 }
7742 }
7743
7744
7745 for (i = MME_WRITE ; i < MME_INITIATORS_MAX ; i++)
7746 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mme_index, i, razwi_info);
7747
7748 WREG32(sts_clr_addr, sts_clr_val);
7749 }
7750
7751 static void gaudi2_handle_mme_sbte_err(struct hl_device *hdev, u8 mme_index, u8 sbte_index,
7752 u64 intr_cause_data)
7753 {
7754 int i;
7755
7756 for (i = 0 ; i < GAUDI2_NUM_OF_MME_SBTE_ERR_CAUSE ; i++)
7757 if (intr_cause_data & BIT(i))
7758 dev_err_ratelimited(hdev->dev, "MME%uSBTE%u_AXI_ERR_RSP err cause: %s\n",
7759 mme_index, sbte_index, guadi2_mme_sbte_error_cause[i]);
7760 }
7761
7762 static void gaudi2_handle_mme_wap_err(struct hl_device *hdev, u8 mme_index,
7763 struct hl_eq_razwi_info *razwi_info)
7764 {
7765 u32 sts_addr, sts_val, sts_clr_addr, sts_clr_val = 0;
7766 int i;
7767
7768 sts_addr = mmDCORE0_MME_ACC_INTR_CAUSE + DCORE_OFFSET * mme_index;
7769 sts_clr_addr = mmDCORE0_MME_ACC_INTR_CLEAR + DCORE_OFFSET * mme_index;
7770
7771 sts_val = RREG32(sts_addr);
7772
7773 for (i = 0 ; i < GAUDI2_NUM_OF_MME_WAP_ERR_CAUSE ; i++) {
7774 if (sts_val & BIT(i)) {
7775 dev_err_ratelimited(hdev->dev,
7776 "MME%u_WAP_SOURCE_RESULT_INVALID err cause: %s\n",
7777 mme_index, guadi2_mme_wap_error_cause[i]);
7778 sts_clr_val |= BIT(i);
7779 }
7780 }
7781
7782
7783 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mme_index, MME_WAP0, razwi_info);
7784 gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mme_index, MME_WAP1, razwi_info);
7785
7786 WREG32(sts_clr_addr, sts_clr_val);
7787 }
7788
7789 static void gaudi2_handle_kdma_core_event(struct hl_device *hdev, u64 intr_cause_data)
7790 {
7791 int i;
7792
7793
7794
7795
7796
7797
7798 for (i = 0 ; i < GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE ; i++)
7799 if (intr_cause_data & BIT(i))
7800 dev_err_ratelimited(hdev->dev, "kdma core err cause: %s\n",
7801 gaudi2_kdma_core_interrupts_cause[i]);
7802 }
7803
7804 static void gaudi2_handle_dma_core_event(struct hl_device *hdev, u64 intr_cause_data)
7805 {
7806 int i;
7807
7808 for (i = 0 ; i < GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE ; i++)
7809 if (intr_cause_data & BIT(i))
7810 dev_err_ratelimited(hdev->dev, "dma core err cause: %s\n",
7811 gaudi2_dma_core_interrupts_cause[i]);
7812 }
7813
7814 static void gaudi2_print_pcie_addr_dec_info(struct hl_device *hdev, u64 intr_cause_data)
7815 {
7816 int i;
7817
7818 for (i = 0 ; i < GAUDI2_NUM_OF_PCIE_ADDR_DEC_ERR_CAUSE; i++)
7819 if (intr_cause_data & BIT_ULL(i))
7820 dev_err_ratelimited(hdev->dev, "PCIE ADDR DEC Error: %s\n",
7821 gaudi2_pcie_addr_dec_error_cause[i]);
7822 }
7823
7824 static void gaudi2_handle_pif_fatal(struct hl_device *hdev, u64 intr_cause_data)
7825
7826 {
7827 int i;
7828
7829 for (i = 0 ; i < GAUDI2_NUM_OF_PMMU_FATAL_ERR_CAUSE ; i++) {
7830 if (intr_cause_data & BIT_ULL(i))
7831 dev_err_ratelimited(hdev->dev, "PMMU PIF err cause: %s\n",
7832 gaudi2_pmmu_fatal_interrupts_cause[i]);
7833 }
7834 }
7835
7836 static void gaudi2_handle_hif_fatal(struct hl_device *hdev, u16 event_type, u64 intr_cause_data)
7837 {
7838 u32 dcore_id, hif_id;
7839 int i;
7840
7841 dcore_id = (event_type - GAUDI2_EVENT_HIF0_FATAL) / 4;
7842 hif_id = (event_type - GAUDI2_EVENT_HIF0_FATAL) % 4;
7843
7844 for (i = 0 ; i < GAUDI2_NUM_OF_HIF_FATAL_ERR_CAUSE ; i++) {
7845 if (intr_cause_data & BIT_ULL(i))
7846 dev_err_ratelimited(hdev->dev, "DCORE%u_HIF%u: %s\n", dcore_id, hif_id,
7847 gaudi2_hif_fatal_interrupts_cause[i]);
7848 }
7849 }
7850
7851 static void gaudi2_handle_page_error(struct hl_device *hdev, u64 mmu_base, bool is_pmmu)
7852 {
7853 u32 valid, val;
7854 u64 addr;
7855
7856 valid = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID));
7857
7858 if (!(valid & DCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID_PAGE_ERR_VALID_ENTRY_MASK))
7859 return;
7860
7861 val = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_PAGE_ERROR_CAPTURE));
7862 addr = val & DCORE0_HMMU0_MMU_PAGE_ERROR_CAPTURE_VA_63_32_MASK;
7863 addr <<= 32;
7864 addr |= RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_PAGE_ERROR_CAPTURE_VA));
7865
7866 dev_err_ratelimited(hdev->dev, "%s page fault on va 0x%llx\n",
7867 is_pmmu ? "PMMU" : "HMMU", addr);
7868
7869 WREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_PAGE_ERROR_CAPTURE), 0);
7870 }
7871
7872 static void gaudi2_handle_access_error(struct hl_device *hdev, u64 mmu_base, bool is_pmmu)
7873 {
7874 u32 valid, val;
7875 u64 addr;
7876
7877 valid = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID));
7878
7879 if (!(valid & DCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID_ACCESS_ERR_VALID_ENTRY_MASK))
7880 return;
7881
7882 val = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_ERROR_CAPTURE));
7883 addr = val & DCORE0_HMMU0_MMU_ACCESS_ERROR_CAPTURE_VA_63_32_MASK;
7884 addr <<= 32;
7885 addr |= RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_ERROR_CAPTURE_VA));
7886
7887 dev_err_ratelimited(hdev->dev, "%s access error on va 0x%llx\n",
7888 is_pmmu ? "PMMU" : "HMMU", addr);
7889 WREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_ERROR_CAPTURE), 0);
7890 }
7891
7892 static void gaudi2_handle_mmu_spi_sei_generic(struct hl_device *hdev, const char *mmu_name,
7893 u64 mmu_base, bool is_pmmu)
7894 {
7895 u32 spi_sei_cause, interrupt_clr = 0x0;
7896 int i;
7897
7898 spi_sei_cause = RREG32(mmu_base + MMU_SPI_SEI_CAUSE_OFFSET);
7899
7900 for (i = 0 ; i < GAUDI2_NUM_OF_MMU_SPI_SEI_CAUSE ; i++) {
7901 if (spi_sei_cause & BIT(i)) {
7902 dev_err_ratelimited(hdev->dev, "%s SPI_SEI ERR. err cause: %s\n",
7903 mmu_name, gaudi2_mmu_spi_sei[i].cause);
7904
7905 if (i == 0)
7906 gaudi2_handle_page_error(hdev, mmu_base, is_pmmu);
7907 else if (i == 1)
7908 gaudi2_handle_access_error(hdev, mmu_base, is_pmmu);
7909
7910 if (gaudi2_mmu_spi_sei[i].clear_bit >= 0)
7911 interrupt_clr |= BIT(gaudi2_mmu_spi_sei[i].clear_bit);
7912 }
7913 }
7914
7915
7916 WREG32_AND(mmu_base + MMU_SPI_SEI_CAUSE_OFFSET, ~spi_sei_cause);
7917
7918
7919 WREG32(mmu_base + MMU_INTERRUPT_CLR_OFFSET, interrupt_clr);
7920 }
7921
7922 static bool gaudi2_handle_sm_err(struct hl_device *hdev, u8 sm_index)
7923 {
7924 u32 sei_cause_addr, sei_cause_val, sei_cause_cause, sei_cause_log;
7925 u32 cq_intr_addr, cq_intr_val, cq_intr_queue_index;
7926 bool reset = true;
7927 int i;
7928
7929 sei_cause_addr = mmDCORE0_SYNC_MNGR_GLBL_SM_SEI_CAUSE + DCORE_OFFSET * sm_index;
7930 cq_intr_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_INTR + DCORE_OFFSET * sm_index;
7931
7932 sei_cause_val = RREG32(sei_cause_addr);
7933 sei_cause_cause = FIELD_GET(DCORE0_SYNC_MNGR_GLBL_SM_SEI_CAUSE_CAUSE_MASK, sei_cause_val);
7934 cq_intr_val = RREG32(cq_intr_addr);
7935
7936
7937 if (sei_cause_cause) {
7938
7939 sei_cause_log = FIELD_GET(DCORE0_SYNC_MNGR_GLBL_SM_SEI_CAUSE_LOG_MASK,
7940 sei_cause_val);
7941
7942 for (i = 0 ; i < GAUDI2_NUM_OF_SM_SEI_ERR_CAUSE ; i++) {
7943 if (!(sei_cause_cause & BIT(i)))
7944 continue;
7945
7946 dev_err_ratelimited(hdev->dev, "SM%u SEI ERR. err cause: %s. %s: 0x%X\n",
7947 sm_index,
7948 gaudi2_sm_sei_cause[i].cause_name,
7949 gaudi2_sm_sei_cause[i].log_name,
7950 sei_cause_log & gaudi2_sm_sei_cause[i].log_mask);
7951
7952
7953 if (i == 2)
7954 reset = false;
7955 break;
7956 }
7957
7958
7959 WREG32(sei_cause_addr, 0);
7960 }
7961
7962
7963 if (cq_intr_val & DCORE0_SYNC_MNGR_GLBL_CQ_INTR_CQ_SEC_INTR_MASK) {
7964 cq_intr_queue_index =
7965 FIELD_GET(DCORE0_SYNC_MNGR_GLBL_CQ_INTR_CQ_INTR_QUEUE_INDEX_MASK,
7966 cq_intr_val);
7967
7968 dev_err_ratelimited(hdev->dev, "SM%u err. err cause: CQ_INTR. queue index: %u\n",
7969 sm_index, cq_intr_queue_index);
7970
7971
7972 WREG32(cq_intr_addr, 0);
7973 }
7974
7975 return reset;
7976 }
7977
7978 static void gaudi2_handle_mmu_spi_sei_err(struct hl_device *hdev, u16 event_type)
7979 {
7980 bool is_pmmu = false;
7981 char desc[32];
7982 u64 mmu_base;
7983 u8 index;
7984
7985 switch (event_type) {
7986 case GAUDI2_EVENT_HMMU0_PAGE_FAULT_OR_WR_PERM ... GAUDI2_EVENT_HMMU3_SECURITY_ERROR:
7987 index = (event_type - GAUDI2_EVENT_HMMU0_PAGE_FAULT_OR_WR_PERM) / 3;
7988 mmu_base = mmDCORE0_HMMU0_MMU_BASE + index * DCORE_HMMU_OFFSET;
7989 snprintf(desc, ARRAY_SIZE(desc), "DCORE0_HMMU%d", index);
7990 break;
7991 case GAUDI2_EVENT_HMMU_0_AXI_ERR_RSP ... GAUDI2_EVENT_HMMU_3_AXI_ERR_RSP:
7992 index = (event_type - GAUDI2_EVENT_HMMU_0_AXI_ERR_RSP);
7993 mmu_base = mmDCORE0_HMMU0_MMU_BASE + index * DCORE_HMMU_OFFSET;
7994 snprintf(desc, ARRAY_SIZE(desc), "DCORE0_HMMU%d", index);
7995 break;
7996 case GAUDI2_EVENT_HMMU8_PAGE_FAULT_WR_PERM ... GAUDI2_EVENT_HMMU11_SECURITY_ERROR:
7997 index = (event_type - GAUDI2_EVENT_HMMU8_PAGE_FAULT_WR_PERM) / 3;
7998 mmu_base = mmDCORE1_HMMU0_MMU_BASE + index * DCORE_HMMU_OFFSET;
7999 snprintf(desc, ARRAY_SIZE(desc), "DCORE1_HMMU%d", index);
8000 break;
8001 case GAUDI2_EVENT_HMMU_8_AXI_ERR_RSP ... GAUDI2_EVENT_HMMU_11_AXI_ERR_RSP:
8002 index = (event_type - GAUDI2_EVENT_HMMU_8_AXI_ERR_RSP);
8003 mmu_base = mmDCORE1_HMMU0_MMU_BASE + index * DCORE_HMMU_OFFSET;
8004 snprintf(desc, ARRAY_SIZE(desc), "DCORE1_HMMU%d", index);
8005 break;
8006 case GAUDI2_EVENT_HMMU7_PAGE_FAULT_WR_PERM ... GAUDI2_EVENT_HMMU4_SECURITY_ERROR:
8007 index = (event_type - GAUDI2_EVENT_HMMU7_PAGE_FAULT_WR_PERM) / 3;
8008 mmu_base = mmDCORE2_HMMU0_MMU_BASE + index * DCORE_HMMU_OFFSET;
8009 snprintf(desc, ARRAY_SIZE(desc), "DCORE2_HMMU%d", index);
8010 break;
8011 case GAUDI2_EVENT_HMMU_7_AXI_ERR_RSP ... GAUDI2_EVENT_HMMU_4_AXI_ERR_RSP:
8012 index = (event_type - GAUDI2_EVENT_HMMU_7_AXI_ERR_RSP);
8013 mmu_base = mmDCORE2_HMMU0_MMU_BASE + index * DCORE_HMMU_OFFSET;
8014 snprintf(desc, ARRAY_SIZE(desc), "DCORE2_HMMU%d", index);
8015 break;
8016 case GAUDI2_EVENT_HMMU15_PAGE_FAULT_WR_PERM ... GAUDI2_EVENT_HMMU12_SECURITY_ERROR:
8017 index = (event_type - GAUDI2_EVENT_HMMU15_PAGE_FAULT_WR_PERM) / 3;
8018 mmu_base = mmDCORE3_HMMU0_MMU_BASE + index * DCORE_HMMU_OFFSET;
8019 snprintf(desc, ARRAY_SIZE(desc), "DCORE3_HMMU%d", index);
8020 break;
8021 case GAUDI2_EVENT_HMMU_15_AXI_ERR_RSP ... GAUDI2_EVENT_HMMU_12_AXI_ERR_RSP:
8022 index = (event_type - GAUDI2_EVENT_HMMU_15_AXI_ERR_RSP);
8023 mmu_base = mmDCORE3_HMMU0_MMU_BASE + index * DCORE_HMMU_OFFSET;
8024 snprintf(desc, ARRAY_SIZE(desc), "DCORE3_HMMU%d", index);
8025 break;
8026 case GAUDI2_EVENT_PMMU0_PAGE_FAULT_WR_PERM ... GAUDI2_EVENT_PMMU0_SECURITY_ERROR:
8027 case GAUDI2_EVENT_PMMU_AXI_ERR_RSP_0:
8028 is_pmmu = true;
8029 mmu_base = mmPMMU_HBW_MMU_BASE;
8030 snprintf(desc, ARRAY_SIZE(desc), "PMMU");
8031 break;
8032 default:
8033 return;
8034 }
8035
8036 gaudi2_handle_mmu_spi_sei_generic(hdev, desc, mmu_base, is_pmmu);
8037 }
8038
8039
8040
8041 static bool gaudi2_hbm_sei_handle_read_err(struct hl_device *hdev,
8042 struct hl_eq_hbm_sei_read_err_intr_info *rd_err_data, u32 err_cnt)
8043 {
8044 u32 addr, beat, beat_shift;
8045 bool rc = false;
8046
8047 dev_err_ratelimited(hdev->dev,
8048 "READ ERROR count: ECC SERR: %d, ECC DERR: %d, RD_PARITY: %d\n",
8049 FIELD_GET(HBM_ECC_SERR_CNTR_MASK, err_cnt),
8050 FIELD_GET(HBM_ECC_DERR_CNTR_MASK, err_cnt),
8051 FIELD_GET(HBM_RD_PARITY_CNTR_MASK, err_cnt));
8052
8053 addr = le32_to_cpu(rd_err_data->dbg_rd_err_addr.rd_addr_val);
8054 dev_err_ratelimited(hdev->dev,
8055 "READ ERROR address: sid(%u), bg(%u), ba(%u), col(%u), row(%u)\n",
8056 FIELD_GET(HBM_RD_ADDR_SID_MASK, addr),
8057 FIELD_GET(HBM_RD_ADDR_BG_MASK, addr),
8058 FIELD_GET(HBM_RD_ADDR_BA_MASK, addr),
8059 FIELD_GET(HBM_RD_ADDR_COL_MASK, addr),
8060 FIELD_GET(HBM_RD_ADDR_ROW_MASK, addr));
8061
8062
8063 for (beat = 0 ; beat < 4 ; beat++) {
8064 if (le32_to_cpu(rd_err_data->dbg_rd_err_misc) &
8065 (HBM_RD_ERR_SERR_BEAT0_MASK << beat))
8066 dev_err_ratelimited(hdev->dev, "Beat%d ECC SERR: DM: %#x, Syndrome: %#x\n",
8067 beat,
8068 le32_to_cpu(rd_err_data->dbg_rd_err_dm),
8069 le32_to_cpu(rd_err_data->dbg_rd_err_syndrome));
8070
8071 if (le32_to_cpu(rd_err_data->dbg_rd_err_misc) &
8072 (HBM_RD_ERR_DERR_BEAT0_MASK << beat)) {
8073 dev_err_ratelimited(hdev->dev, "Beat%d ECC DERR: DM: %#x, Syndrome: %#x\n",
8074 beat,
8075 le32_to_cpu(rd_err_data->dbg_rd_err_dm),
8076 le32_to_cpu(rd_err_data->dbg_rd_err_syndrome));
8077 rc |= true;
8078 }
8079
8080 beat_shift = beat * HBM_RD_ERR_BEAT_SHIFT;
8081 if (le32_to_cpu(rd_err_data->dbg_rd_err_misc) &
8082 (HBM_RD_ERR_PAR_ERR_BEAT0_MASK << beat_shift)) {
8083 dev_err_ratelimited(hdev->dev,
8084 "Beat%d read PARITY: DM: %#x, PAR data: %#x\n",
8085 beat,
8086 le32_to_cpu(rd_err_data->dbg_rd_err_dm),
8087 (le32_to_cpu(rd_err_data->dbg_rd_err_misc) &
8088 (HBM_RD_ERR_PAR_DATA_BEAT0_MASK << beat_shift)) >>
8089 (HBM_RD_ERR_PAR_DATA_BEAT0_SHIFT + beat_shift));
8090 rc |= true;
8091 }
8092
8093 dev_err_ratelimited(hdev->dev, "Beat%d DQ data:\n", beat);
8094 dev_err_ratelimited(hdev->dev, "\t0x%08x\n",
8095 le32_to_cpu(rd_err_data->dbg_rd_err_data[beat * 2]));
8096 dev_err_ratelimited(hdev->dev, "\t0x%08x\n",
8097 le32_to_cpu(rd_err_data->dbg_rd_err_data[beat * 2 + 1]));
8098 }
8099
8100 return rc;
8101 }
8102
8103 static void gaudi2_hbm_sei_print_wr_par_info(struct hl_device *hdev,
8104 struct hl_eq_hbm_sei_wr_par_intr_info *wr_par_err_data, u32 err_cnt)
8105 {
8106 struct hbm_sei_wr_cmd_address *wr_cmd_addr = wr_par_err_data->dbg_last_wr_cmds;
8107 u32 i, curr_addr, derr = wr_par_err_data->dbg_derr;
8108
8109 dev_err_ratelimited(hdev->dev, "WRITE PARITY ERROR count: %d\n", err_cnt);
8110
8111 dev_err_ratelimited(hdev->dev, "CK-0 DERR: 0x%02x, CK-1 DERR: 0x%02x\n",
8112 derr & 0x3, derr & 0xc);
8113
8114
8115 dev_err_ratelimited(hdev->dev, "Last latched write commands addresses:\n");
8116 for (i = 0 ; i < HBM_WR_PAR_CMD_LIFO_LEN ; i++) {
8117 curr_addr = le32_to_cpu(wr_cmd_addr[i].dbg_wr_cmd_addr);
8118 dev_err_ratelimited(hdev->dev,
8119 "\twrite cmd[%u]: Address: SID(%u) BG(%u) BA(%u) COL(%u).\n",
8120 i,
8121 FIELD_GET(WR_PAR_LAST_CMD_SID_MASK, curr_addr),
8122 FIELD_GET(WR_PAR_LAST_CMD_BG_MASK, curr_addr),
8123 FIELD_GET(WR_PAR_LAST_CMD_BA_MASK, curr_addr),
8124 FIELD_GET(WR_PAR_LAST_CMD_COL_MASK, curr_addr));
8125 }
8126 }
8127
8128 static void gaudi2_hbm_sei_print_ca_par_info(struct hl_device *hdev,
8129 struct hl_eq_hbm_sei_ca_par_intr_info *ca_par_err_data, u32 err_cnt)
8130 {
8131 __le32 *col_cmd = ca_par_err_data->dbg_col;
8132 __le16 *row_cmd = ca_par_err_data->dbg_row;
8133 u32 i;
8134
8135 dev_err_ratelimited(hdev->dev, "CA ERROR count: %d\n", err_cnt);
8136
8137 dev_err_ratelimited(hdev->dev, "Last latched C&R bus commands:\n");
8138 for (i = 0 ; i < HBM_CA_ERR_CMD_LIFO_LEN ; i++)
8139 dev_err_ratelimited(hdev->dev, "cmd%u: ROW(0x%04x) COL(0x%05x)\n", i,
8140 le16_to_cpu(row_cmd[i]) & (u16)GENMASK(13, 0),
8141 le32_to_cpu(col_cmd[i]) & (u32)GENMASK(17, 0));
8142 }
8143
8144
8145 static bool gaudi2_handle_hbm_mc_sei_err(struct hl_device *hdev, u16 event_type,
8146 struct hl_eq_hbm_sei_data *sei_data)
8147 {
8148 bool require_hard_reset = false;
8149 u32 hbm_id, mc_id, cause_idx;
8150
8151 hbm_id = (event_type - GAUDI2_EVENT_HBM0_MC0_SEI_SEVERE) / 4;
8152 mc_id = ((event_type - GAUDI2_EVENT_HBM0_MC0_SEI_SEVERE) / 2) % 2;
8153
8154 cause_idx = sei_data->hdr.sei_cause;
8155 if (cause_idx > GAUDI2_NUM_OF_HBM_SEI_CAUSE - 1) {
8156 dev_err_ratelimited(hdev->dev, "Invalid HBM SEI event cause (%d) provided by FW\n",
8157 cause_idx);
8158 return true;
8159 }
8160
8161 dev_err_ratelimited(hdev->dev,
8162 "System Error Interrupt - HBM(%u) MC(%u) MC_CH(%u) MC_PC(%u). Critical(%u). Error cause: %s\n",
8163 hbm_id, mc_id, sei_data->hdr.mc_channel, sei_data->hdr.mc_pseudo_channel,
8164 sei_data->hdr.is_critical, hbm_mc_sei_cause[cause_idx]);
8165
8166
8167 switch (cause_idx) {
8168 case HBM_SEI_CATTRIP:
8169 require_hard_reset = true;
8170 break;
8171
8172 case HBM_SEI_CMD_PARITY_EVEN:
8173 gaudi2_hbm_sei_print_ca_par_info(hdev, &sei_data->ca_parity_even_info,
8174 le32_to_cpu(sei_data->hdr.cnt));
8175 require_hard_reset = true;
8176 break;
8177
8178 case HBM_SEI_CMD_PARITY_ODD:
8179 gaudi2_hbm_sei_print_ca_par_info(hdev, &sei_data->ca_parity_odd_info,
8180 le32_to_cpu(sei_data->hdr.cnt));
8181 require_hard_reset = true;
8182 break;
8183
8184 case HBM_SEI_WRITE_DATA_PARITY_ERR:
8185 gaudi2_hbm_sei_print_wr_par_info(hdev, &sei_data->wr_parity_info,
8186 le32_to_cpu(sei_data->hdr.cnt));
8187 require_hard_reset = true;
8188 break;
8189
8190 case HBM_SEI_READ_ERR:
8191
8192
8193
8194 require_hard_reset = gaudi2_hbm_sei_handle_read_err(hdev,
8195 &sei_data->read_err_info,
8196 le32_to_cpu(sei_data->hdr.cnt));
8197 break;
8198
8199 default:
8200 break;
8201 }
8202
8203 require_hard_reset |= !!sei_data->hdr.is_critical;
8204
8205 return require_hard_reset;
8206 }
8207
8208 static void gaudi2_handle_hbm_cattrip(struct hl_device *hdev, u64 intr_cause_data)
8209 {
8210 dev_err(hdev->dev,
8211 "HBM catastrophic temperature error (CATTRIP) cause %#llx\n",
8212 intr_cause_data);
8213 }
8214
8215 static void gaudi2_handle_hbm_mc_spi(struct hl_device *hdev, u64 intr_cause_data)
8216 {
8217 u32 i;
8218
8219 for (i = 0 ; i < GAUDI2_NUM_OF_HBM_MC_SPI_CAUSE ; i++)
8220 if (intr_cause_data & hbm_mc_spi[i].mask)
8221 dev_dbg(hdev->dev, "HBM spi event: notification cause(%s)\n",
8222 hbm_mc_spi[i].cause);
8223 }
8224
8225 static void gaudi2_print_clk_change_info(struct hl_device *hdev, u16 event_type)
8226 {
8227 ktime_t zero_time = ktime_set(0, 0);
8228
8229 mutex_lock(&hdev->clk_throttling.lock);
8230
8231 switch (event_type) {
8232 case GAUDI2_EVENT_CPU_FIX_POWER_ENV_S:
8233 hdev->clk_throttling.current_reason |= HL_CLK_THROTTLE_POWER;
8234 hdev->clk_throttling.aggregated_reason |= HL_CLK_THROTTLE_POWER;
8235 hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_POWER].start = ktime_get();
8236 hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_POWER].end = zero_time;
8237 dev_info_ratelimited(hdev->dev, "Clock throttling due to power consumption\n");
8238 break;
8239
8240 case GAUDI2_EVENT_CPU_FIX_POWER_ENV_E:
8241 hdev->clk_throttling.current_reason &= ~HL_CLK_THROTTLE_POWER;
8242 hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_POWER].end = ktime_get();
8243 dev_info_ratelimited(hdev->dev, "Power envelop is safe, back to optimal clock\n");
8244 break;
8245
8246 case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_S:
8247 hdev->clk_throttling.current_reason |= HL_CLK_THROTTLE_THERMAL;
8248 hdev->clk_throttling.aggregated_reason |= HL_CLK_THROTTLE_THERMAL;
8249 hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_THERMAL].start = ktime_get();
8250 hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_THERMAL].end = zero_time;
8251 dev_info_ratelimited(hdev->dev, "Clock throttling due to overheating\n");
8252 break;
8253
8254 case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_E:
8255 hdev->clk_throttling.current_reason &= ~HL_CLK_THROTTLE_THERMAL;
8256 hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_THERMAL].end = ktime_get();
8257 dev_info_ratelimited(hdev->dev, "Thermal envelop is safe, back to optimal clock\n");
8258 break;
8259
8260 default:
8261 dev_err(hdev->dev, "Received invalid clock change event %d\n", event_type);
8262 break;
8263 }
8264
8265 mutex_unlock(&hdev->clk_throttling.lock);
8266 }
8267
8268 static void gaudi2_print_out_of_sync_info(struct hl_device *hdev,
8269 struct cpucp_pkt_sync_err *sync_err)
8270 {
8271 struct hl_hw_queue *q = &hdev->kernel_queues[GAUDI2_QUEUE_ID_CPU_PQ];
8272
8273 dev_err(hdev->dev, "Out of sync with FW, FW: pi=%u, ci=%u, LKD: pi=%u, ci=%u\n",
8274 sync_err->pi, sync_err->ci, q->pi, atomic_read(&q->ci));
8275 }
8276
8277 static void gaudi2_handle_pcie_p2p_msix(struct hl_device *hdev)
8278 {
8279 u32 p2p_intr, msix_gw_intr;
8280
8281 p2p_intr = RREG32(mmPCIE_WRAP_P2P_INTR);
8282 msix_gw_intr = RREG32(mmPCIE_WRAP_MSIX_GW_INTR);
8283
8284 if (p2p_intr) {
8285 dev_err_ratelimited(hdev->dev,
8286 "pcie p2p transaction terminated due to security, req_id(0x%x)\n",
8287 RREG32(mmPCIE_WRAP_P2P_REQ_ID));
8288
8289 WREG32(mmPCIE_WRAP_P2P_INTR, 0x1);
8290 }
8291
8292 if (msix_gw_intr) {
8293 dev_err_ratelimited(hdev->dev,
8294 "pcie msi-x gen denied due to vector num check failure, vec(0x%X)\n",
8295 RREG32(mmPCIE_WRAP_MSIX_GW_VEC));
8296
8297 WREG32(mmPCIE_WRAP_MSIX_GW_INTR, 0x1);
8298 }
8299 }
8300
8301 static void gaudi2_handle_pcie_drain(struct hl_device *hdev,
8302 struct hl_eq_pcie_drain_ind_data *drain_data)
8303 {
8304 u64 lbw_rd, lbw_wr, hbw_rd, hbw_wr, cause;
8305
8306 cause = le64_to_cpu(drain_data->intr_cause.intr_cause_data);
8307 lbw_rd = le64_to_cpu(drain_data->drain_rd_addr_lbw);
8308 lbw_wr = le64_to_cpu(drain_data->drain_wr_addr_lbw);
8309 hbw_rd = le64_to_cpu(drain_data->drain_rd_addr_hbw);
8310 hbw_wr = le64_to_cpu(drain_data->drain_wr_addr_hbw);
8311
8312 if (cause & BIT_ULL(0))
8313 dev_err_ratelimited(hdev->dev,
8314 "PCIE AXI drain LBW completed, read_err %u, write_err %u\n",
8315 !!lbw_rd, !!lbw_wr);
8316
8317 if (cause & BIT_ULL(1))
8318 dev_err_ratelimited(hdev->dev,
8319 "PCIE AXI drain HBW completed, raddr %#llx, waddr %#llx\n",
8320 hbw_rd, hbw_wr);
8321 }
8322
8323 static void gaudi2_handle_psoc_drain(struct hl_device *hdev, u64 intr_cause_data)
8324 {
8325 int i;
8326
8327 for (i = 0 ; i < GAUDI2_NUM_OF_AXI_DRAIN_ERR_CAUSE ; i++) {
8328 if (intr_cause_data & BIT_ULL(i))
8329 dev_err_ratelimited(hdev->dev, "PSOC %s completed\n",
8330 gaudi2_psoc_axi_drain_interrupts_cause[i]);
8331 }
8332 }
8333
8334 static void gaudi2_print_cpu_pkt_failure_info(struct hl_device *hdev,
8335 struct cpucp_pkt_sync_err *sync_err)
8336 {
8337 struct hl_hw_queue *q = &hdev->kernel_queues[GAUDI2_QUEUE_ID_CPU_PQ];
8338
8339 dev_warn(hdev->dev,
8340 "FW reported sanity check failure, FW: pi=%u, ci=%u, LKD: pi=%u, ci=%u\n",
8341 sync_err->pi, sync_err->ci, q->pi, atomic_read(&q->ci));
8342 }
8343
8344 static void hl_arc_event_handle(struct hl_device *hdev,
8345 struct hl_eq_engine_arc_intr_data *data)
8346 {
8347 struct hl_engine_arc_dccm_queue_full_irq *q;
8348 u32 intr_type, engine_id;
8349 u64 payload;
8350
8351 intr_type = le32_to_cpu(data->intr_type);
8352 engine_id = le32_to_cpu(data->engine_id);
8353 payload = le64_to_cpu(data->payload);
8354
8355 switch (intr_type) {
8356 case ENGINE_ARC_DCCM_QUEUE_FULL_IRQ:
8357 q = (struct hl_engine_arc_dccm_queue_full_irq *) &payload;
8358
8359 dev_err_ratelimited(hdev->dev,
8360 "ARC DCCM Full event: EngId: %u, Intr_type: %u, Qidx: %u\n",
8361 engine_id, intr_type, q->queue_index);
8362 break;
8363 default:
8364 dev_err_ratelimited(hdev->dev, "Unknown ARC event type\n");
8365 }
8366 }
8367
8368 static void gaudi2_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entry)
8369 {
8370 u32 ctl, reset_flags = HL_DRV_RESET_HARD | HL_DRV_RESET_DELAY;
8371 struct gaudi2_device *gaudi2 = hdev->asic_specific;
8372 bool reset_required = false, skip_reset = false;
8373 int index, sbte_index;
8374 u16 event_type;
8375
8376 ctl = le32_to_cpu(eq_entry->hdr.ctl);
8377 event_type = ((ctl & EQ_CTL_EVENT_TYPE_MASK) >> EQ_CTL_EVENT_TYPE_SHIFT);
8378
8379 if (event_type >= GAUDI2_EVENT_SIZE) {
8380 dev_err(hdev->dev, "Event type %u exceeds maximum of %u",
8381 event_type, GAUDI2_EVENT_SIZE - 1);
8382 return;
8383 }
8384
8385 gaudi2->events_stat[event_type]++;
8386 gaudi2->events_stat_aggregate[event_type]++;
8387
8388 gaudi2_print_irq_info(hdev, event_type);
8389
8390 switch (event_type) {
8391 case GAUDI2_EVENT_PCIE_CORE_SERR ... GAUDI2_EVENT_ARC0_ECC_DERR:
8392 fallthrough;
8393 case GAUDI2_EVENT_ROTATOR0_SERR ... GAUDI2_EVENT_ROTATOR1_DERR:
8394 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
8395 reset_required = gaudi2_handle_ecc_event(hdev, event_type, &eq_entry->ecc_data);
8396 break;
8397
8398 case GAUDI2_EVENT_TPC0_QM ... GAUDI2_EVENT_PDMA1_QM:
8399 fallthrough;
8400 case GAUDI2_EVENT_ROTATOR0_ROT0_QM ... GAUDI2_EVENT_ROTATOR1_ROT1_QM:
8401 fallthrough;
8402 case GAUDI2_EVENT_NIC0_QM0 ... GAUDI2_EVENT_NIC11_QM1:
8403 gaudi2_handle_qman_err(hdev, event_type);
8404 break;
8405
8406 case GAUDI2_EVENT_ARC_AXI_ERROR_RESPONSE_0:
8407 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
8408 gaudi2_handle_arc_farm_sei_err(hdev);
8409 break;
8410
8411 case GAUDI2_EVENT_CPU_AXI_ERR_RSP:
8412 gaudi2_handle_cpu_sei_err(hdev);
8413 break;
8414
8415 case GAUDI2_EVENT_PDMA_CH0_AXI_ERR_RSP:
8416 case GAUDI2_EVENT_PDMA_CH1_AXI_ERR_RSP:
8417 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
8418 gaudi2_handle_qm_sei_err(hdev, event_type, &eq_entry->razwi_info);
8419 break;
8420
8421 case GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE:
8422 case GAUDI2_EVENT_ROTATOR1_AXI_ERROR_RESPONSE:
8423 index = event_type - GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE;
8424 gaudi2_handle_rot_err(hdev, index, &eq_entry->razwi_with_intr_cause);
8425 gaudi2_handle_qm_sei_err(hdev, event_type, NULL);
8426 break;
8427
8428 case GAUDI2_EVENT_TPC0_AXI_ERR_RSP ... GAUDI2_EVENT_TPC24_AXI_ERR_RSP:
8429 index = event_type - GAUDI2_EVENT_TPC0_AXI_ERR_RSP;
8430 gaudi2_tpc_ack_interrupts(hdev, index, "AXI_ERR_RSP",
8431 &eq_entry->razwi_with_intr_cause);
8432 gaudi2_handle_qm_sei_err(hdev, event_type, NULL);
8433 break;
8434
8435 case GAUDI2_EVENT_DEC0_AXI_ERR_RSPONSE ... GAUDI2_EVENT_DEC9_AXI_ERR_RSPONSE:
8436 index = event_type - GAUDI2_EVENT_DEC0_AXI_ERR_RSPONSE;
8437 gaudi2_handle_dec_err(hdev, index, "AXI_ERR_RESPONSE", &eq_entry->razwi_info);
8438 break;
8439
8440 case GAUDI2_EVENT_TPC0_KERNEL_ERR:
8441 case GAUDI2_EVENT_TPC1_KERNEL_ERR:
8442 case GAUDI2_EVENT_TPC2_KERNEL_ERR:
8443 case GAUDI2_EVENT_TPC3_KERNEL_ERR:
8444 case GAUDI2_EVENT_TPC4_KERNEL_ERR:
8445 case GAUDI2_EVENT_TPC5_KERNEL_ERR:
8446 case GAUDI2_EVENT_TPC6_KERNEL_ERR:
8447 case GAUDI2_EVENT_TPC7_KERNEL_ERR:
8448 case GAUDI2_EVENT_TPC8_KERNEL_ERR:
8449 case GAUDI2_EVENT_TPC9_KERNEL_ERR:
8450 case GAUDI2_EVENT_TPC10_KERNEL_ERR:
8451 case GAUDI2_EVENT_TPC11_KERNEL_ERR:
8452 case GAUDI2_EVENT_TPC12_KERNEL_ERR:
8453 case GAUDI2_EVENT_TPC13_KERNEL_ERR:
8454 case GAUDI2_EVENT_TPC14_KERNEL_ERR:
8455 case GAUDI2_EVENT_TPC15_KERNEL_ERR:
8456 case GAUDI2_EVENT_TPC16_KERNEL_ERR:
8457 case GAUDI2_EVENT_TPC17_KERNEL_ERR:
8458 case GAUDI2_EVENT_TPC18_KERNEL_ERR:
8459 case GAUDI2_EVENT_TPC19_KERNEL_ERR:
8460 case GAUDI2_EVENT_TPC20_KERNEL_ERR:
8461 case GAUDI2_EVENT_TPC21_KERNEL_ERR:
8462 case GAUDI2_EVENT_TPC22_KERNEL_ERR:
8463 case GAUDI2_EVENT_TPC23_KERNEL_ERR:
8464 case GAUDI2_EVENT_TPC24_KERNEL_ERR:
8465 index = (event_type - GAUDI2_EVENT_TPC0_KERNEL_ERR) /
8466 (GAUDI2_EVENT_TPC1_KERNEL_ERR - GAUDI2_EVENT_TPC0_KERNEL_ERR);
8467 gaudi2_tpc_ack_interrupts(hdev, index, "KRN_ERR", &eq_entry->razwi_with_intr_cause);
8468 break;
8469
8470 case GAUDI2_EVENT_DEC0_SPI:
8471 case GAUDI2_EVENT_DEC1_SPI:
8472 case GAUDI2_EVENT_DEC2_SPI:
8473 case GAUDI2_EVENT_DEC3_SPI:
8474 case GAUDI2_EVENT_DEC4_SPI:
8475 case GAUDI2_EVENT_DEC5_SPI:
8476 case GAUDI2_EVENT_DEC6_SPI:
8477 case GAUDI2_EVENT_DEC7_SPI:
8478 case GAUDI2_EVENT_DEC8_SPI:
8479 case GAUDI2_EVENT_DEC9_SPI:
8480 index = (event_type - GAUDI2_EVENT_DEC0_SPI) /
8481 (GAUDI2_EVENT_DEC1_SPI - GAUDI2_EVENT_DEC0_SPI);
8482 gaudi2_handle_dec_err(hdev, index, "SPI", &eq_entry->razwi_info);
8483 break;
8484
8485 case GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE:
8486 case GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE:
8487 case GAUDI2_EVENT_MME2_CTRL_AXI_ERROR_RESPONSE:
8488 case GAUDI2_EVENT_MME3_CTRL_AXI_ERROR_RESPONSE:
8489 index = (event_type - GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE) /
8490 (GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE -
8491 GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE);
8492 gaudi2_handle_mme_err(hdev, index,
8493 "CTRL_AXI_ERROR_RESPONSE", &eq_entry->razwi_info);
8494 gaudi2_handle_qm_sei_err(hdev, event_type, NULL);
8495 break;
8496
8497 case GAUDI2_EVENT_MME0_QMAN_SW_ERROR:
8498 case GAUDI2_EVENT_MME1_QMAN_SW_ERROR:
8499 case GAUDI2_EVENT_MME2_QMAN_SW_ERROR:
8500 case GAUDI2_EVENT_MME3_QMAN_SW_ERROR:
8501 index = (event_type - GAUDI2_EVENT_MME0_QMAN_SW_ERROR) /
8502 (GAUDI2_EVENT_MME1_QMAN_SW_ERROR -
8503 GAUDI2_EVENT_MME0_QMAN_SW_ERROR);
8504 gaudi2_handle_mme_err(hdev, index, "QMAN_SW_ERROR", &eq_entry->razwi_info);
8505 break;
8506
8507 case GAUDI2_EVENT_MME0_WAP_SOURCE_RESULT_INVALID:
8508 case GAUDI2_EVENT_MME1_WAP_SOURCE_RESULT_INVALID:
8509 case GAUDI2_EVENT_MME2_WAP_SOURCE_RESULT_INVALID:
8510 case GAUDI2_EVENT_MME3_WAP_SOURCE_RESULT_INVALID:
8511 index = (event_type - GAUDI2_EVENT_MME0_WAP_SOURCE_RESULT_INVALID) /
8512 (GAUDI2_EVENT_MME1_WAP_SOURCE_RESULT_INVALID -
8513 GAUDI2_EVENT_MME0_WAP_SOURCE_RESULT_INVALID);
8514 gaudi2_handle_mme_wap_err(hdev, index, &eq_entry->razwi_info);
8515 break;
8516
8517 case GAUDI2_EVENT_KDMA_CH0_AXI_ERR_RSP:
8518 case GAUDI2_EVENT_KDMA0_CORE:
8519 gaudi2_handle_kdma_core_event(hdev,
8520 le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
8521 break;
8522
8523 case GAUDI2_EVENT_HDMA2_CORE ... GAUDI2_EVENT_PDMA1_CORE:
8524 gaudi2_handle_dma_core_event(hdev,
8525 le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
8526 break;
8527
8528 case GAUDI2_EVENT_PCIE_ADDR_DEC_ERR:
8529 gaudi2_print_pcie_addr_dec_info(hdev,
8530 le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
8531 break;
8532
8533 case GAUDI2_EVENT_HMMU0_PAGE_FAULT_OR_WR_PERM ... GAUDI2_EVENT_HMMU12_SECURITY_ERROR:
8534 case GAUDI2_EVENT_HMMU_0_AXI_ERR_RSP ... GAUDI2_EVENT_HMMU_12_AXI_ERR_RSP:
8535 case GAUDI2_EVENT_PMMU0_PAGE_FAULT_WR_PERM ... GAUDI2_EVENT_PMMU0_SECURITY_ERROR:
8536 case GAUDI2_EVENT_PMMU_AXI_ERR_RSP_0:
8537 gaudi2_handle_mmu_spi_sei_err(hdev, event_type);
8538 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
8539 break;
8540
8541 case GAUDI2_EVENT_HIF0_FATAL ... GAUDI2_EVENT_HIF12_FATAL:
8542 gaudi2_handle_hif_fatal(hdev, event_type,
8543 le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
8544 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
8545 break;
8546
8547 case GAUDI2_EVENT_PMMU_FATAL_0:
8548 gaudi2_handle_pif_fatal(hdev,
8549 le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
8550 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
8551 break;
8552
8553 case GAUDI2_EVENT_PSOC63_RAZWI_OR_PID_MIN_MAX_INTERRUPT:
8554 gaudi2_ack_psoc_razwi_event_handler(hdev);
8555 break;
8556
8557 case GAUDI2_EVENT_HBM0_MC0_SEI_SEVERE ... GAUDI2_EVENT_HBM5_MC1_SEI_NON_SEVERE:
8558 if (gaudi2_handle_hbm_mc_sei_err(hdev, event_type, &eq_entry->sei_data)) {
8559 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
8560 reset_required = true;
8561 }
8562 break;
8563
8564 case GAUDI2_EVENT_HBM_CATTRIP_0 ... GAUDI2_EVENT_HBM_CATTRIP_5:
8565 gaudi2_handle_hbm_cattrip(hdev, le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
8566 break;
8567
8568 case GAUDI2_EVENT_HBM0_MC0_SPI ... GAUDI2_EVENT_HBM5_MC1_SPI:
8569 gaudi2_handle_hbm_mc_spi(hdev, le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
8570 break;
8571
8572 case GAUDI2_EVENT_PCIE_DRAIN_COMPLETE:
8573 gaudi2_handle_pcie_drain(hdev, &eq_entry->pcie_drain_ind_data);
8574 break;
8575
8576 case GAUDI2_EVENT_PSOC59_RPM_ERROR_OR_DRAIN:
8577 gaudi2_handle_psoc_drain(hdev, le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
8578 break;
8579
8580 case GAUDI2_EVENT_CPU_AXI_ECC:
8581 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
8582 break;
8583 case GAUDI2_EVENT_CPU_L2_RAM_ECC:
8584 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
8585 break;
8586 case GAUDI2_EVENT_MME0_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME0_SBTE4_AXI_ERR_RSP:
8587 case GAUDI2_EVENT_MME1_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME1_SBTE4_AXI_ERR_RSP:
8588 case GAUDI2_EVENT_MME2_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME2_SBTE4_AXI_ERR_RSP:
8589 case GAUDI2_EVENT_MME3_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME3_SBTE4_AXI_ERR_RSP:
8590 index = (event_type - GAUDI2_EVENT_MME0_SBTE0_AXI_ERR_RSP) /
8591 (GAUDI2_EVENT_MME1_SBTE0_AXI_ERR_RSP -
8592 GAUDI2_EVENT_MME0_SBTE0_AXI_ERR_RSP);
8593 sbte_index = (event_type - GAUDI2_EVENT_MME0_SBTE0_AXI_ERR_RSP) %
8594 (GAUDI2_EVENT_MME1_SBTE0_AXI_ERR_RSP -
8595 GAUDI2_EVENT_MME0_SBTE0_AXI_ERR_RSP);
8596 gaudi2_handle_mme_sbte_err(hdev, index, sbte_index,
8597 le64_to_cpu(eq_entry->intr_cause.intr_cause_data));
8598 break;
8599 case GAUDI2_EVENT_VM0_ALARM_A ... GAUDI2_EVENT_VM3_ALARM_B:
8600 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
8601 break;
8602 case GAUDI2_EVENT_PSOC_AXI_ERR_RSP:
8603 case GAUDI2_EVENT_PSOC_PRSTN_FALL:
8604 break;
8605 case GAUDI2_EVENT_PCIE_APB_TIMEOUT:
8606 reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;
8607 break;
8608 case GAUDI2_EVENT_PCIE_FATAL_ERR:
8609 break;
8610 case GAUDI2_EVENT_TPC0_BMON_SPMU:
8611 case GAUDI2_EVENT_TPC1_BMON_SPMU:
8612 case GAUDI2_EVENT_TPC2_BMON_SPMU:
8613 case GAUDI2_EVENT_TPC3_BMON_SPMU:
8614 case GAUDI2_EVENT_TPC4_BMON_SPMU:
8615 case GAUDI2_EVENT_TPC5_BMON_SPMU:
8616 case GAUDI2_EVENT_TPC6_BMON_SPMU:
8617 case GAUDI2_EVENT_TPC7_BMON_SPMU:
8618 case GAUDI2_EVENT_TPC8_BMON_SPMU:
8619 case GAUDI2_EVENT_TPC9_BMON_SPMU:
8620 case GAUDI2_EVENT_TPC10_BMON_SPMU:
8621 case GAUDI2_EVENT_TPC11_BMON_SPMU:
8622 case GAUDI2_EVENT_TPC12_BMON_SPMU:
8623 case GAUDI2_EVENT_TPC13_BMON_SPMU:
8624 case GAUDI2_EVENT_TPC14_BMON_SPMU:
8625 case GAUDI2_EVENT_TPC15_BMON_SPMU:
8626 case GAUDI2_EVENT_TPC16_BMON_SPMU:
8627 case GAUDI2_EVENT_TPC17_BMON_SPMU:
8628 case GAUDI2_EVENT_TPC18_BMON_SPMU:
8629 case GAUDI2_EVENT_TPC19_BMON_SPMU:
8630 case GAUDI2_EVENT_TPC20_BMON_SPMU:
8631 case GAUDI2_EVENT_TPC21_BMON_SPMU:
8632 case GAUDI2_EVENT_TPC22_BMON_SPMU:
8633 case GAUDI2_EVENT_TPC23_BMON_SPMU:
8634 case GAUDI2_EVENT_TPC24_BMON_SPMU:
8635 case GAUDI2_EVENT_MME0_CTRL_BMON_SPMU:
8636 case GAUDI2_EVENT_MME0_SBTE_BMON_SPMU:
8637 case GAUDI2_EVENT_MME0_WAP_BMON_SPMU:
8638 case GAUDI2_EVENT_MME1_CTRL_BMON_SPMU:
8639 case GAUDI2_EVENT_MME1_SBTE_BMON_SPMU:
8640 case GAUDI2_EVENT_MME1_WAP_BMON_SPMU:
8641 case GAUDI2_EVENT_MME2_CTRL_BMON_SPMU:
8642 case GAUDI2_EVENT_MME2_SBTE_BMON_SPMU:
8643 case GAUDI2_EVENT_MME2_WAP_BMON_SPMU:
8644 case GAUDI2_EVENT_MME3_CTRL_BMON_SPMU:
8645 case GAUDI2_EVENT_MME3_SBTE_BMON_SPMU:
8646 case GAUDI2_EVENT_MME3_WAP_BMON_SPMU:
8647 case GAUDI2_EVENT_HDMA2_BM_SPMU ... GAUDI2_EVENT_PDMA1_BM_SPMU:
8648 fallthrough;
8649 case GAUDI2_EVENT_DEC0_BMON_SPMU:
8650 case GAUDI2_EVENT_DEC1_BMON_SPMU:
8651 case GAUDI2_EVENT_DEC2_BMON_SPMU:
8652 case GAUDI2_EVENT_DEC3_BMON_SPMU:
8653 case GAUDI2_EVENT_DEC4_BMON_SPMU:
8654 case GAUDI2_EVENT_DEC5_BMON_SPMU:
8655 case GAUDI2_EVENT_DEC6_BMON_SPMU:
8656 case GAUDI2_EVENT_DEC7_BMON_SPMU:
8657 case GAUDI2_EVENT_DEC8_BMON_SPMU:
8658 case GAUDI2_EVENT_DEC9_BMON_SPMU:
8659 case GAUDI2_EVENT_ROTATOR0_BMON_SPMU ... GAUDI2_EVENT_SM3_BMON_SPMU:
8660 break;
8661
8662 case GAUDI2_EVENT_CPU_FIX_POWER_ENV_S:
8663 case GAUDI2_EVENT_CPU_FIX_POWER_ENV_E:
8664 case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_S:
8665 case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_E:
8666 gaudi2_print_clk_change_info(hdev, event_type);
8667 break;
8668
8669 case GAUDI2_EVENT_CPU_PKT_QUEUE_OUT_SYNC:
8670 gaudi2_print_out_of_sync_info(hdev, &eq_entry->pkt_sync_err);
8671 break;
8672
8673 case GAUDI2_EVENT_PCIE_FLR_REQUESTED:
8674
8675 break;
8676
8677 case GAUDI2_EVENT_PCIE_P2P_MSIX:
8678 gaudi2_handle_pcie_p2p_msix(hdev);
8679 break;
8680
8681 case GAUDI2_EVENT_SM0_AXI_ERROR_RESPONSE ... GAUDI2_EVENT_SM3_AXI_ERROR_RESPONSE:
8682 index = event_type - GAUDI2_EVENT_SM0_AXI_ERROR_RESPONSE;
8683 skip_reset = !gaudi2_handle_sm_err(hdev, index);
8684 break;
8685
8686 case GAUDI2_EVENT_PSOC_MME_PLL_LOCK_ERR ... GAUDI2_EVENT_DCORE2_HBM_PLL_LOCK_ERR:
8687 break;
8688
8689 case GAUDI2_EVENT_CPU_CPLD_SHUTDOWN_CAUSE:
8690 dev_info(hdev->dev, "CPLD shutdown cause, reset reason: 0x%llx\n",
8691 le64_to_cpu(eq_entry->data[0]));
8692 break;
8693 case GAUDI2_EVENT_CPU_CPLD_SHUTDOWN_EVENT:
8694 dev_err(hdev->dev, "CPLD shutdown event, reset reason: 0x%llx\n",
8695 le64_to_cpu(eq_entry->data[0]));
8696 break;
8697
8698 case GAUDI2_EVENT_CPU_PKT_SANITY_FAILED:
8699 gaudi2_print_cpu_pkt_failure_info(hdev, &eq_entry->pkt_sync_err);
8700 break;
8701
8702 case GAUDI2_EVENT_ARC_DCCM_FULL:
8703 hl_arc_event_handle(hdev, &eq_entry->arc_data);
8704 break;
8705
8706 default:
8707 if (gaudi2_irq_map_table[event_type].valid)
8708 dev_err_ratelimited(hdev->dev, "Cannot find handler for event %d\n",
8709 event_type);
8710 }
8711
8712 if ((gaudi2_irq_map_table[event_type].reset || reset_required) && !skip_reset)
8713 goto reset_device;
8714
8715
8716 if (!gaudi2_irq_map_table[event_type].msg)
8717 hl_fw_unmask_irq(hdev, event_type);
8718
8719 return;
8720
8721 reset_device:
8722 if (hdev->hard_reset_on_fw_events) {
8723 hl_device_reset(hdev, reset_flags);
8724 } else {
8725 if (!gaudi2_irq_map_table[event_type].msg)
8726 hl_fw_unmask_irq(hdev, event_type);
8727 }
8728 }
8729
8730 static int gaudi2_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size, u64 val)
8731 {
8732 struct asic_fixed_properties *prop = &hdev->asic_prop;
8733 u64 comp_addr, cur_addr = addr, end_addr = addr + size;
8734 u32 chunk_size, busy, dcore, edma_idx, sob_offset, sob_addr, comp_val, edma_commit;
8735 u32 old_mmubp, mmubp;
8736 int rc = 0;
8737
8738 sob_offset = hdev->asic_prop.first_available_user_sob[0] * 4;
8739 sob_addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;
8740 comp_addr = CFG_BASE + sob_addr;
8741 comp_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_INC_MASK, 1) |
8742 FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_VAL_MASK, 1);
8743
8744 edma_commit = FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_LIN_MASK, 1) |
8745 FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_MEM_SET_MASK, 1) |
8746 FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_WR_COMP_EN_MASK, 1);
8747 mmubp = FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_WR_MASK, 1) |
8748 FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_RD_MASK, 1);
8749
8750 if (prop->edma_enabled_mask == 0) {
8751 dev_info(hdev->dev, "non of the EDMA engines is enabled - skip dram scrubbing\n");
8752 return -EIO;
8753 }
8754
8755
8756
8757
8758
8759 old_mmubp = RREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP);
8760 for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {
8761 for (edma_idx = 0 ; edma_idx < NUM_OF_EDMA_PER_DCORE ; edma_idx++) {
8762 u32 edma_offset = dcore * DCORE_OFFSET + edma_idx * DCORE_EDMA_OFFSET;
8763 u32 edma_bit = dcore * NUM_OF_EDMA_PER_DCORE + edma_idx;
8764
8765 if (!(prop->edma_enabled_mask & BIT(edma_bit)))
8766 continue;
8767
8768 WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP +
8769 edma_offset, mmubp);
8770 }
8771 }
8772
8773 while (cur_addr < end_addr) {
8774 int dma_num = 0;
8775
8776 WREG32(sob_addr, 0);
8777 for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {
8778 for (edma_idx = 0 ; edma_idx < NUM_OF_EDMA_PER_DCORE ; edma_idx++) {
8779 u32 edma_offset = dcore * DCORE_OFFSET +
8780 edma_idx * DCORE_EDMA_OFFSET;
8781 u32 edma_bit = dcore * NUM_OF_EDMA_PER_DCORE + edma_idx;
8782
8783 if (!(prop->edma_enabled_mask & BIT(edma_bit)))
8784 continue;
8785
8786 chunk_size = min_t(u64, SZ_2G, end_addr - cur_addr);
8787
8788 WREG32(mmDCORE0_EDMA0_CORE_CTX_SRC_BASE_LO + edma_offset,
8789 lower_32_bits(val));
8790 WREG32(mmDCORE0_EDMA0_CORE_CTX_SRC_BASE_HI + edma_offset,
8791 upper_32_bits(val));
8792
8793 WREG32(mmDCORE0_EDMA0_CORE_CTX_DST_BASE_LO + edma_offset,
8794 lower_32_bits(cur_addr));
8795 WREG32(mmDCORE0_EDMA0_CORE_CTX_DST_BASE_HI + edma_offset,
8796 upper_32_bits(cur_addr));
8797
8798 WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_ADDR_LO + edma_offset,
8799 lower_32_bits(comp_addr));
8800 WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_ADDR_HI + edma_offset,
8801 upper_32_bits(comp_addr));
8802 WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_WDATA + edma_offset,
8803 comp_val);
8804
8805 WREG32(mmDCORE0_EDMA0_CORE_CTX_DST_TSIZE_0 + edma_offset,
8806 chunk_size);
8807 WREG32(mmDCORE0_EDMA0_CORE_CTX_COMMIT + edma_offset, edma_commit);
8808
8809 dma_num++;
8810
8811 cur_addr += chunk_size;
8812
8813 if (cur_addr == end_addr)
8814 goto poll;
8815 }
8816 }
8817 poll:
8818 rc = hl_poll_timeout(hdev, sob_addr, busy, (busy == dma_num), 1000, 1000000);
8819 if (rc) {
8820 dev_err(hdev->dev, "DMA Timeout during HBM scrubbing\n");
8821 goto end;
8822 }
8823 }
8824 end:
8825 for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {
8826 for (edma_idx = 0 ; edma_idx < NUM_OF_EDMA_PER_DCORE ; edma_idx++) {
8827 u32 edma_offset = dcore * DCORE_OFFSET + edma_idx * DCORE_EDMA_OFFSET;
8828 u32 edma_bit = dcore * NUM_OF_EDMA_PER_DCORE + edma_idx;
8829
8830 if (!(prop->edma_enabled_mask & BIT(edma_bit)))
8831 continue;
8832
8833 WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP + edma_offset, old_mmubp);
8834 }
8835 }
8836
8837 WREG32(sob_addr, 0);
8838 return rc;
8839 }
8840
8841 static int gaudi2_scrub_device_dram(struct hl_device *hdev, u64 val)
8842 {
8843 int rc;
8844 struct asic_fixed_properties *prop = &hdev->asic_prop;
8845 u64 size = prop->dram_end_address - prop->dram_user_base_address;
8846
8847 rc = gaudi2_memset_device_memory(hdev, prop->dram_user_base_address, size, val);
8848
8849 if (rc)
8850 dev_err(hdev->dev, "Failed to scrub dram, address: 0x%llx size: %llu\n",
8851 prop->dram_user_base_address, size);
8852 return rc;
8853 }
8854
8855 static int gaudi2_scrub_device_mem(struct hl_device *hdev)
8856 {
8857 int rc;
8858 struct asic_fixed_properties *prop = &hdev->asic_prop;
8859 u64 val = hdev->memory_scrub_val;
8860 u64 addr, size;
8861
8862 if (!hdev->memory_scrub)
8863 return 0;
8864
8865
8866 addr = prop->sram_user_base_address;
8867 size = hdev->pldm ? 0x10000 : (prop->sram_size - SRAM_USER_BASE_OFFSET);
8868 dev_dbg(hdev->dev, "Scrubbing SRAM: 0x%09llx - 0x%09llx, val: 0x%llx\n",
8869 addr, addr + size, val);
8870 rc = gaudi2_memset_device_memory(hdev, addr, size, val);
8871 if (rc) {
8872 dev_err(hdev->dev, "scrubbing SRAM failed (%d)\n", rc);
8873 return rc;
8874 }
8875
8876
8877 rc = gaudi2_scrub_device_dram(hdev, val);
8878 if (rc) {
8879 dev_err(hdev->dev, "scrubbing DRAM failed (%d)\n", rc);
8880 return rc;
8881 }
8882 return 0;
8883 }
8884
8885 static void gaudi2_restore_user_sm_registers(struct hl_device *hdev)
8886 {
8887 u64 addr, mon_sts_addr, mon_cfg_addr, cq_lbw_l_addr, cq_lbw_h_addr,
8888 cq_lbw_data_addr, cq_base_l_addr, cq_base_h_addr, cq_size_addr;
8889 u32 val, size, offset;
8890 int dcore_id;
8891
8892 offset = hdev->asic_prop.first_available_cq[0] * 4;
8893 cq_lbw_l_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0 + offset;
8894 cq_lbw_h_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 + offset;
8895 cq_lbw_data_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_DATA_0 + offset;
8896 cq_base_l_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_L_0 + offset;
8897 cq_base_h_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_H_0 + offset;
8898 cq_size_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_SIZE_LOG2_0 + offset;
8899 size = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 -
8900 (mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0 + offset);
8901
8902
8903 gaudi2_memset_device_lbw(hdev, cq_lbw_l_addr, size, 0);
8904 gaudi2_memset_device_lbw(hdev, cq_lbw_h_addr, size, 0);
8905 gaudi2_memset_device_lbw(hdev, cq_lbw_data_addr, size, 0);
8906 gaudi2_memset_device_lbw(hdev, cq_base_l_addr, size, 0);
8907 gaudi2_memset_device_lbw(hdev, cq_base_h_addr, size, 0);
8908
8909 cq_lbw_l_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0 + DCORE_OFFSET;
8910 cq_lbw_h_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 + DCORE_OFFSET;
8911 cq_lbw_data_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_DATA_0 + DCORE_OFFSET;
8912 cq_base_l_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_L_0 + DCORE_OFFSET;
8913 cq_base_h_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_H_0 + DCORE_OFFSET;
8914 cq_size_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_SIZE_LOG2_0 + DCORE_OFFSET;
8915 size = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 - mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0;
8916
8917 for (dcore_id = 1 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {
8918 gaudi2_memset_device_lbw(hdev, cq_lbw_l_addr, size, 0);
8919 gaudi2_memset_device_lbw(hdev, cq_lbw_h_addr, size, 0);
8920 gaudi2_memset_device_lbw(hdev, cq_lbw_data_addr, size, 0);
8921 gaudi2_memset_device_lbw(hdev, cq_base_l_addr, size, 0);
8922 gaudi2_memset_device_lbw(hdev, cq_base_h_addr, size, 0);
8923 gaudi2_memset_device_lbw(hdev, cq_size_addr, size, 0);
8924
8925 cq_lbw_l_addr += DCORE_OFFSET;
8926 cq_lbw_h_addr += DCORE_OFFSET;
8927 cq_lbw_data_addr += DCORE_OFFSET;
8928 cq_base_l_addr += DCORE_OFFSET;
8929 cq_base_h_addr += DCORE_OFFSET;
8930 cq_size_addr += DCORE_OFFSET;
8931 }
8932
8933 offset = hdev->asic_prop.first_available_user_mon[0] * 4;
8934 addr = mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0 + offset;
8935 val = 1 << DCORE0_SYNC_MNGR_OBJS_MON_STATUS_PROT_SHIFT;
8936 size = mmDCORE0_SYNC_MNGR_OBJS_SM_SEC_0 - (mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0 + offset);
8937
8938
8939 gaudi2_memset_device_lbw(hdev, addr, size, val);
8940
8941 addr = mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + offset;
8942 gaudi2_memset_device_lbw(hdev, addr, size, 0);
8943
8944 mon_sts_addr = mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0 + DCORE_OFFSET;
8945 mon_cfg_addr = mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + DCORE_OFFSET;
8946 size = mmDCORE0_SYNC_MNGR_OBJS_SM_SEC_0 - mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0;
8947
8948 for (dcore_id = 1 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {
8949 gaudi2_memset_device_lbw(hdev, mon_sts_addr, size, val);
8950 gaudi2_memset_device_lbw(hdev, mon_cfg_addr, size, 0);
8951 mon_sts_addr += DCORE_OFFSET;
8952 mon_cfg_addr += DCORE_OFFSET;
8953 }
8954
8955 offset = hdev->asic_prop.first_available_user_sob[0] * 4;
8956 addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + offset;
8957 val = 0;
8958 size = mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 -
8959 (mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + offset);
8960
8961
8962 gaudi2_memset_device_lbw(hdev, addr, size, val);
8963
8964 addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + DCORE_OFFSET;
8965 size = mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 - mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0;
8966
8967 for (dcore_id = 1 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {
8968 gaudi2_memset_device_lbw(hdev, addr, size, val);
8969 addr += DCORE_OFFSET;
8970 }
8971
8972
8973 val = RREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + offset);
8974 }
8975
8976 static void gaudi2_restore_user_qm_registers(struct hl_device *hdev)
8977 {
8978 u32 reg_base, hw_queue_id;
8979
8980 for (hw_queue_id = GAUDI2_QUEUE_ID_PDMA_0_0 ; hw_queue_id <= GAUDI2_QUEUE_ID_ROT_1_0;
8981 hw_queue_id += NUM_OF_PQ_PER_QMAN) {
8982 if (!gaudi2_is_queue_enabled(hdev, hw_queue_id))
8983 continue;
8984
8985 gaudi2_clear_qm_fence_counters_common(hdev, hw_queue_id, false);
8986
8987 reg_base = gaudi2_qm_blocks_bases[hw_queue_id];
8988 WREG32(reg_base + QM_ARB_CFG_0_OFFSET, 0);
8989 }
8990
8991
8992 RREG32(mmPDMA0_QM_ARB_CFG_0);
8993 }
8994
8995 static void gaudi2_restore_nic_qm_registers(struct hl_device *hdev)
8996 {
8997 u32 reg_base, hw_queue_id;
8998
8999 for (hw_queue_id = GAUDI2_QUEUE_ID_NIC_0_0 ; hw_queue_id <= GAUDI2_QUEUE_ID_NIC_23_3;
9000 hw_queue_id += NUM_OF_PQ_PER_QMAN) {
9001 if (!gaudi2_is_queue_enabled(hdev, hw_queue_id))
9002 continue;
9003
9004 gaudi2_clear_qm_fence_counters_common(hdev, hw_queue_id, false);
9005
9006 reg_base = gaudi2_qm_blocks_bases[hw_queue_id];
9007 WREG32(reg_base + QM_ARB_CFG_0_OFFSET, 0);
9008 }
9009
9010
9011 RREG32(mmPDMA0_QM_ARB_CFG_0);
9012 }
9013
9014 static int gaudi2_context_switch(struct hl_device *hdev, u32 asid)
9015 {
9016 return 0;
9017 }
9018
9019 static void gaudi2_restore_phase_topology(struct hl_device *hdev)
9020 {
9021 }
9022
9023 static void gaudi2_init_block_instances(struct hl_device *hdev, u32 block_idx,
9024 struct dup_block_ctx *cfg_ctx)
9025 {
9026 u64 block_base = cfg_ctx->base + block_idx * cfg_ctx->block_off;
9027 u8 seq;
9028 int i;
9029
9030 for (i = 0 ; i < cfg_ctx->instances ; i++) {
9031 seq = block_idx * cfg_ctx->instances + i;
9032
9033
9034 if (!(cfg_ctx->enabled_mask & BIT_ULL(seq)))
9035 continue;
9036
9037 cfg_ctx->instance_cfg_fn(hdev, block_base + i * cfg_ctx->instance_off,
9038 cfg_ctx->data);
9039 }
9040 }
9041
9042 static void gaudi2_init_blocks_with_mask(struct hl_device *hdev, struct dup_block_ctx *cfg_ctx,
9043 u64 mask)
9044 {
9045 int i;
9046
9047 cfg_ctx->enabled_mask = mask;
9048
9049 for (i = 0 ; i < cfg_ctx->blocks ; i++)
9050 gaudi2_init_block_instances(hdev, i, cfg_ctx);
9051 }
9052
9053 void gaudi2_init_blocks(struct hl_device *hdev, struct dup_block_ctx *cfg_ctx)
9054 {
9055 gaudi2_init_blocks_with_mask(hdev, cfg_ctx, U64_MAX);
9056 }
9057
9058 static int gaudi2_debugfs_read_dma(struct hl_device *hdev, u64 addr, u32 size, void *blob_addr)
9059 {
9060 void *host_mem_virtual_addr;
9061 dma_addr_t host_mem_dma_addr;
9062 u64 reserved_va_base;
9063 u32 pos, size_left, size_to_dma;
9064 struct hl_ctx *ctx;
9065 int rc = 0;
9066
9067
9068 ctx = hl_get_compute_ctx(hdev);
9069 if (!ctx) {
9070 dev_err(hdev->dev, "No ctx available\n");
9071 return -EINVAL;
9072 }
9073
9074
9075 host_mem_virtual_addr = hl_asic_dma_alloc_coherent(hdev, SZ_2M, &host_mem_dma_addr,
9076 GFP_KERNEL | __GFP_ZERO);
9077 if (host_mem_virtual_addr == NULL) {
9078 dev_err(hdev->dev, "Failed to allocate memory for KDMA read\n");
9079 rc = -ENOMEM;
9080 goto put_ctx;
9081 }
9082
9083
9084 reserved_va_base = hl_reserve_va_block(hdev, ctx, HL_VA_RANGE_TYPE_HOST, SZ_2M,
9085 HL_MMU_VA_ALIGNMENT_NOT_NEEDED);
9086 if (!reserved_va_base) {
9087 dev_err(hdev->dev, "Failed to reserve vmem on asic\n");
9088 rc = -ENOMEM;
9089 goto free_data_buffer;
9090 }
9091
9092
9093 mutex_lock(&ctx->mmu_lock);
9094 rc = hl_mmu_map_contiguous(ctx, reserved_va_base, host_mem_dma_addr, SZ_2M);
9095 hl_mmu_invalidate_cache_range(hdev, false,
9096 MMU_OP_USERPTR | MMU_OP_SKIP_LOW_CACHE_INV,
9097 ctx->asid, reserved_va_base, SZ_2M);
9098 mutex_unlock(&ctx->mmu_lock);
9099 if (rc) {
9100 dev_err(hdev->dev, "Failed to create mapping on asic mmu\n");
9101 goto unreserve_va;
9102 }
9103
9104 hdev->asic_funcs->kdma_lock(hdev, 0);
9105
9106
9107 gaudi2_kdma_set_mmbp_asid(hdev, false, ctx->asid);
9108
9109 pos = 0;
9110 size_left = size;
9111 size_to_dma = SZ_2M;
9112
9113 while (size_left > 0) {
9114 if (size_left < SZ_2M)
9115 size_to_dma = size_left;
9116
9117 rc = gaudi2_send_job_to_kdma(hdev, addr, reserved_va_base, size_to_dma, false);
9118 if (rc)
9119 break;
9120
9121 memcpy(blob_addr + pos, host_mem_virtual_addr, size_to_dma);
9122
9123 if (size_left <= SZ_2M)
9124 break;
9125
9126 pos += SZ_2M;
9127 addr += SZ_2M;
9128 size_left -= SZ_2M;
9129 }
9130
9131 gaudi2_kdma_set_mmbp_asid(hdev, true, HL_KERNEL_ASID_ID);
9132
9133 hdev->asic_funcs->kdma_unlock(hdev, 0);
9134
9135 mutex_lock(&ctx->mmu_lock);
9136 hl_mmu_unmap_contiguous(ctx, reserved_va_base, SZ_2M);
9137 hl_mmu_invalidate_cache_range(hdev, false, MMU_OP_USERPTR,
9138 ctx->asid, reserved_va_base, SZ_2M);
9139 mutex_unlock(&ctx->mmu_lock);
9140 unreserve_va:
9141 hl_unreserve_va_block(hdev, ctx, reserved_va_base, SZ_2M);
9142 free_data_buffer:
9143 hl_asic_dma_free_coherent(hdev, SZ_2M, host_mem_virtual_addr, host_mem_dma_addr);
9144 put_ctx:
9145 hl_ctx_put(ctx);
9146
9147 return rc;
9148 }
9149
9150 static int gaudi2_internal_cb_pool_init(struct hl_device *hdev, struct hl_ctx *ctx)
9151 {
9152 struct gaudi2_device *gaudi2 = hdev->asic_specific;
9153 int min_alloc_order, rc;
9154
9155 if (!(gaudi2->hw_cap_initialized & HW_CAP_PMMU))
9156 return 0;
9157
9158 hdev->internal_cb_pool_virt_addr = hl_asic_dma_alloc_coherent(hdev,
9159 HOST_SPACE_INTERNAL_CB_SZ,
9160 &hdev->internal_cb_pool_dma_addr,
9161 GFP_KERNEL | __GFP_ZERO);
9162
9163 if (!hdev->internal_cb_pool_virt_addr)
9164 return -ENOMEM;
9165
9166 min_alloc_order = ilog2(min(gaudi2_get_signal_cb_size(hdev),
9167 gaudi2_get_wait_cb_size(hdev)));
9168
9169 hdev->internal_cb_pool = gen_pool_create(min_alloc_order, -1);
9170 if (!hdev->internal_cb_pool) {
9171 dev_err(hdev->dev, "Failed to create internal CB pool\n");
9172 rc = -ENOMEM;
9173 goto free_internal_cb_pool;
9174 }
9175
9176 rc = gen_pool_add(hdev->internal_cb_pool, (uintptr_t) hdev->internal_cb_pool_virt_addr,
9177 HOST_SPACE_INTERNAL_CB_SZ, -1);
9178 if (rc) {
9179 dev_err(hdev->dev, "Failed to add memory to internal CB pool\n");
9180 rc = -EFAULT;
9181 goto destroy_internal_cb_pool;
9182 }
9183
9184 hdev->internal_cb_va_base = hl_reserve_va_block(hdev, ctx, HL_VA_RANGE_TYPE_HOST,
9185 HOST_SPACE_INTERNAL_CB_SZ, HL_MMU_VA_ALIGNMENT_NOT_NEEDED);
9186
9187 if (!hdev->internal_cb_va_base) {
9188 rc = -ENOMEM;
9189 goto destroy_internal_cb_pool;
9190 }
9191
9192 mutex_lock(&ctx->mmu_lock);
9193 rc = hl_mmu_map_contiguous(ctx, hdev->internal_cb_va_base, hdev->internal_cb_pool_dma_addr,
9194 HOST_SPACE_INTERNAL_CB_SZ);
9195 hl_mmu_invalidate_cache(hdev, false, MMU_OP_USERPTR);
9196 mutex_unlock(&ctx->mmu_lock);
9197
9198 if (rc)
9199 goto unreserve_internal_cb_pool;
9200
9201 return 0;
9202
9203 unreserve_internal_cb_pool:
9204 hl_unreserve_va_block(hdev, ctx, hdev->internal_cb_va_base, HOST_SPACE_INTERNAL_CB_SZ);
9205 destroy_internal_cb_pool:
9206 gen_pool_destroy(hdev->internal_cb_pool);
9207 free_internal_cb_pool:
9208 hl_asic_dma_free_coherent(hdev, HOST_SPACE_INTERNAL_CB_SZ, hdev->internal_cb_pool_virt_addr,
9209 hdev->internal_cb_pool_dma_addr);
9210
9211 return rc;
9212 }
9213
9214 static void gaudi2_internal_cb_pool_fini(struct hl_device *hdev, struct hl_ctx *ctx)
9215 {
9216 struct gaudi2_device *gaudi2 = hdev->asic_specific;
9217
9218 if (!(gaudi2->hw_cap_initialized & HW_CAP_PMMU))
9219 return;
9220
9221 mutex_lock(&ctx->mmu_lock);
9222 hl_mmu_unmap_contiguous(ctx, hdev->internal_cb_va_base, HOST_SPACE_INTERNAL_CB_SZ);
9223 hl_unreserve_va_block(hdev, ctx, hdev->internal_cb_va_base, HOST_SPACE_INTERNAL_CB_SZ);
9224 hl_mmu_invalidate_cache(hdev, true, MMU_OP_USERPTR);
9225 mutex_unlock(&ctx->mmu_lock);
9226
9227 gen_pool_destroy(hdev->internal_cb_pool);
9228
9229 hl_asic_dma_free_coherent(hdev, HOST_SPACE_INTERNAL_CB_SZ, hdev->internal_cb_pool_virt_addr,
9230 hdev->internal_cb_pool_dma_addr);
9231 }
9232
9233 static void gaudi2_restore_user_registers(struct hl_device *hdev)
9234 {
9235 gaudi2_restore_user_sm_registers(hdev);
9236 gaudi2_restore_user_qm_registers(hdev);
9237 }
9238
9239 static int gaudi2_map_virtual_msix_doorbell_memory(struct hl_ctx *ctx)
9240 {
9241 struct hl_device *hdev = ctx->hdev;
9242 struct asic_fixed_properties *prop = &hdev->asic_prop;
9243 struct gaudi2_device *gaudi2 = hdev->asic_specific;
9244 int rc;
9245
9246 rc = hl_mmu_map_page(ctx, RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START,
9247 gaudi2->virt_msix_db_dma_addr, prop->pmmu.page_size, true);
9248 if (rc)
9249 dev_err(hdev->dev, "Failed to map VA %#llx for virtual MSI-X doorbell memory\n",
9250 RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START);
9251
9252 return rc;
9253 }
9254
9255 static void gaudi2_unmap_virtual_msix_doorbell_memory(struct hl_ctx *ctx)
9256 {
9257 struct hl_device *hdev = ctx->hdev;
9258 struct asic_fixed_properties *prop = &hdev->asic_prop;
9259 int rc;
9260
9261 rc = hl_mmu_unmap_page(ctx, RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START,
9262 prop->pmmu.page_size, true);
9263 if (rc)
9264 dev_err(hdev->dev, "Failed to unmap VA %#llx of virtual MSI-X doorbell memory\n",
9265 RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START);
9266 }
9267
9268 static int gaudi2_ctx_init(struct hl_ctx *ctx)
9269 {
9270 int rc;
9271
9272 rc = gaudi2_mmu_prepare(ctx->hdev, ctx->asid);
9273 if (rc)
9274 return rc;
9275
9276
9277
9278
9279 if (ctx->hdev->reset_upon_device_release)
9280 gaudi2_restore_nic_qm_registers(ctx->hdev);
9281 else
9282 gaudi2_restore_user_registers(ctx->hdev);
9283
9284 rc = gaudi2_internal_cb_pool_init(ctx->hdev, ctx);
9285 if (rc)
9286 return rc;
9287
9288 rc = gaudi2_map_virtual_msix_doorbell_memory(ctx);
9289 if (rc)
9290 gaudi2_internal_cb_pool_fini(ctx->hdev, ctx);
9291
9292 return rc;
9293 }
9294
9295 static void gaudi2_ctx_fini(struct hl_ctx *ctx)
9296 {
9297 if (ctx->asid == HL_KERNEL_ASID_ID)
9298 return;
9299
9300 gaudi2_internal_cb_pool_fini(ctx->hdev, ctx);
9301
9302 gaudi2_unmap_virtual_msix_doorbell_memory(ctx);
9303 }
9304
9305 static int gaudi2_pre_schedule_cs(struct hl_cs *cs)
9306 {
9307 struct hl_device *hdev = cs->ctx->hdev;
9308 int index = cs->sequence & (hdev->asic_prop.max_pending_cs - 1);
9309 u32 mon_payload, sob_id, mon_id;
9310
9311 if (!cs_needs_completion(cs))
9312 return 0;
9313
9314
9315
9316
9317
9318
9319
9320
9321
9322 sob_id = mon_id = index;
9323 mon_payload = (1 << CQ_ENTRY_SHADOW_INDEX_VALID_SHIFT) |
9324 (1 << CQ_ENTRY_READY_SHIFT) | index;
9325
9326 gaudi2_arm_cq_monitor(hdev, sob_id, mon_id, GAUDI2_RESERVED_CQ_CS_COMPLETION, mon_payload,
9327 cs->jobs_cnt);
9328
9329 return 0;
9330 }
9331
9332 static u32 gaudi2_get_queue_id_for_cq(struct hl_device *hdev, u32 cq_idx)
9333 {
9334 return HL_INVALID_QUEUE;
9335 }
9336
9337 static u32 gaudi2_gen_signal_cb(struct hl_device *hdev, void *data, u16 sob_id, u32 size, bool eb)
9338 {
9339 struct hl_cb *cb = (struct hl_cb *) data;
9340 struct packet_msg_short *pkt;
9341 u32 value, ctl, pkt_size = sizeof(*pkt);
9342
9343 pkt = (struct packet_msg_short *) (uintptr_t) (cb->kernel_address + size);
9344 memset(pkt, 0, pkt_size);
9345
9346
9347 value = FIELD_PREP(GAUDI2_PKT_SHORT_VAL_SOB_SYNC_VAL_MASK, 1);
9348 value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_SOB_MOD_MASK, 1);
9349
9350 ctl = FIELD_PREP(GAUDI2_PKT_SHORT_CTL_ADDR_MASK, sob_id * 4);
9351 ctl |= FIELD_PREP(GAUDI2_PKT_SHORT_CTL_BASE_MASK, 1);
9352 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_MSG_SHORT);
9353 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, eb);
9354 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 1);
9355
9356 pkt->value = cpu_to_le32(value);
9357 pkt->ctl = cpu_to_le32(ctl);
9358
9359 return size + pkt_size;
9360 }
9361
9362 static u32 gaudi2_add_mon_msg_short(struct packet_msg_short *pkt, u32 value, u16 addr)
9363 {
9364 u32 ctl, pkt_size = sizeof(*pkt);
9365
9366 memset(pkt, 0, pkt_size);
9367
9368 ctl = FIELD_PREP(GAUDI2_PKT_SHORT_CTL_ADDR_MASK, addr);
9369 ctl |= FIELD_PREP(GAUDI2_PKT_SHORT_CTL_BASE_MASK, 0);
9370 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_MSG_SHORT);
9371 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, 0);
9372 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 0);
9373
9374 pkt->value = cpu_to_le32(value);
9375 pkt->ctl = cpu_to_le32(ctl);
9376
9377 return pkt_size;
9378 }
9379
9380 static u32 gaudi2_add_arm_monitor_pkt(struct hl_device *hdev, struct packet_msg_short *pkt,
9381 u16 sob_base, u8 sob_mask, u16 sob_val, u16 addr)
9382 {
9383 u32 ctl, value, pkt_size = sizeof(*pkt);
9384 u8 mask;
9385
9386 if (hl_gen_sob_mask(sob_base, sob_mask, &mask)) {
9387 dev_err(hdev->dev, "sob_base %u (mask %#x) is not valid\n", sob_base, sob_mask);
9388 return 0;
9389 }
9390
9391 memset(pkt, 0, pkt_size);
9392
9393 value = FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_SYNC_GID_MASK, sob_base / 8);
9394 value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_SYNC_VAL_MASK, sob_val);
9395 value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_MODE_MASK, 0);
9396 value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_MASK_MASK, mask);
9397
9398 ctl = FIELD_PREP(GAUDI2_PKT_SHORT_CTL_ADDR_MASK, addr);
9399 ctl |= FIELD_PREP(GAUDI2_PKT_SHORT_CTL_BASE_MASK, 0);
9400 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_MSG_SHORT);
9401 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, 0);
9402 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 1);
9403
9404 pkt->value = cpu_to_le32(value);
9405 pkt->ctl = cpu_to_le32(ctl);
9406
9407 return pkt_size;
9408 }
9409
9410 static u32 gaudi2_add_fence_pkt(struct packet_fence *pkt)
9411 {
9412 u32 ctl, cfg, pkt_size = sizeof(*pkt);
9413
9414 memset(pkt, 0, pkt_size);
9415
9416 cfg = FIELD_PREP(GAUDI2_PKT_FENCE_CFG_DEC_VAL_MASK, 1);
9417 cfg |= FIELD_PREP(GAUDI2_PKT_FENCE_CFG_TARGET_VAL_MASK, 1);
9418 cfg |= FIELD_PREP(GAUDI2_PKT_FENCE_CFG_ID_MASK, 2);
9419
9420 ctl = FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_FENCE);
9421 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, 0);
9422 ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 1);
9423
9424 pkt->cfg = cpu_to_le32(cfg);
9425 pkt->ctl = cpu_to_le32(ctl);
9426
9427 return pkt_size;
9428 }
9429
9430 static u32 gaudi2_gen_wait_cb(struct hl_device *hdev, struct hl_gen_wait_properties *prop)
9431 {
9432 struct hl_cb *cb = (struct hl_cb *) prop->data;
9433 void *buf = (void *) (uintptr_t) (cb->kernel_address);
9434
9435 u64 monitor_base, fence_addr = 0;
9436 u32 stream_index, size = prop->size;
9437 u16 msg_addr_offset;
9438
9439 stream_index = prop->q_idx % 4;
9440 fence_addr = CFG_BASE + gaudi2_qm_blocks_bases[prop->q_idx] +
9441 QM_FENCE2_OFFSET + stream_index * 4;
9442
9443
9444
9445
9446
9447 monitor_base = mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0;
9448
9449
9450 msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + prop->mon_id * 4) -
9451 monitor_base;
9452
9453 size += gaudi2_add_mon_msg_short(buf + size, (u32) fence_addr, msg_addr_offset);
9454
9455
9456 msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + prop->mon_id * 4) -
9457 monitor_base;
9458
9459 size += gaudi2_add_mon_msg_short(buf + size, (u32) (fence_addr >> 32), msg_addr_offset);
9460
9461
9462
9463
9464
9465 msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + prop->mon_id * 4) -
9466 monitor_base;
9467
9468 size += gaudi2_add_mon_msg_short(buf + size, 1, msg_addr_offset);
9469
9470
9471 msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + prop->mon_id * 4) - monitor_base;
9472
9473 size += gaudi2_add_arm_monitor_pkt(hdev, buf + size, prop->sob_base, prop->sob_mask,
9474 prop->sob_val, msg_addr_offset);
9475
9476
9477 size += gaudi2_add_fence_pkt(buf + size);
9478
9479 return size;
9480 }
9481
9482 static void gaudi2_reset_sob(struct hl_device *hdev, void *data)
9483 {
9484 struct hl_hw_sob *hw_sob = (struct hl_hw_sob *) data;
9485
9486 dev_dbg(hdev->dev, "reset SOB, q_idx: %d, sob_id: %d\n", hw_sob->q_idx, hw_sob->sob_id);
9487
9488 WREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + hw_sob->sob_id * 4, 0);
9489
9490 kref_init(&hw_sob->kref);
9491 }
9492
9493 static void gaudi2_reset_sob_group(struct hl_device *hdev, u16 sob_group)
9494 {
9495 }
9496
9497 static u64 gaudi2_get_device_time(struct hl_device *hdev)
9498 {
9499 u64 device_time = ((u64) RREG32(mmPSOC_TIMESTAMP_CNTCVU)) << 32;
9500
9501 return device_time | RREG32(mmPSOC_TIMESTAMP_CNTCVL);
9502 }
9503
9504 static int gaudi2_collective_wait_init_cs(struct hl_cs *cs)
9505 {
9506 return 0;
9507 }
9508
9509 static int gaudi2_collective_wait_create_jobs(struct hl_device *hdev, struct hl_ctx *ctx,
9510 struct hl_cs *cs, u32 wait_queue_id,
9511 u32 collective_engine_id, u32 encaps_signal_offset)
9512 {
9513 return -EINVAL;
9514 }
9515
9516
9517
9518
9519
9520
9521
9522
9523
9524
9525
9526
9527
9528
9529
9530
9531
9532
9533
9534 static u64 gaudi2_mmu_scramble_addr(struct hl_device *hdev, u64 raw_addr)
9535 {
9536 struct asic_fixed_properties *prop = &hdev->asic_prop;
9537 u32 divisor, mod_va;
9538 u64 div_va;
9539
9540
9541 if (hl_mem_area_inside_range(raw_addr, sizeof(raw_addr), DRAM_PHYS_BASE,
9542 VA_HBM_SPACE_END)) {
9543
9544 divisor = prop->num_functional_hbms * GAUDI2_HBM_MMU_SCRM_MEM_SIZE;
9545 div_va = div_u64_rem(raw_addr & GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK, divisor, &mod_va);
9546 return (raw_addr & ~GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK) |
9547 (div_va << GAUDI2_HBM_MMU_SCRM_DIV_SHIFT) |
9548 (mod_va << GAUDI2_HBM_MMU_SCRM_MOD_SHIFT);
9549 }
9550
9551 return raw_addr;
9552 }
9553
9554 static u64 gaudi2_mmu_descramble_addr(struct hl_device *hdev, u64 scrambled_addr)
9555 {
9556 struct asic_fixed_properties *prop = &hdev->asic_prop;
9557 u32 divisor, mod_va;
9558 u64 div_va;
9559
9560
9561 if (hl_mem_area_inside_range(scrambled_addr, sizeof(scrambled_addr), DRAM_PHYS_BASE,
9562 VA_HBM_SPACE_END)) {
9563
9564 divisor = prop->num_functional_hbms * GAUDI2_HBM_MMU_SCRM_MEM_SIZE;
9565 div_va = div_u64_rem(scrambled_addr & GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK,
9566 PAGE_SIZE_64MB, &mod_va);
9567
9568 return ((scrambled_addr & ~GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK) +
9569 (div_va * divisor + mod_va));
9570 }
9571
9572 return scrambled_addr;
9573 }
9574
9575 static u32 gaudi2_get_dec_base_addr(struct hl_device *hdev, u32 core_id)
9576 {
9577 u32 base = 0, dcore_id, dec_id;
9578
9579 if (core_id >= NUMBER_OF_DEC) {
9580 dev_err(hdev->dev, "Unexpected core number %d for DEC\n", core_id);
9581 goto out;
9582 }
9583
9584 if (core_id < 8) {
9585 dcore_id = core_id / NUM_OF_DEC_PER_DCORE;
9586 dec_id = core_id % NUM_OF_DEC_PER_DCORE;
9587
9588 base = mmDCORE0_DEC0_CMD_BASE + dcore_id * DCORE_OFFSET +
9589 dec_id * DCORE_VDEC_OFFSET;
9590 } else {
9591
9592 base = mmPCIE_DEC0_CMD_BASE + ((core_id % 8) * PCIE_VDEC_OFFSET);
9593 }
9594 out:
9595 return base;
9596 }
9597
9598 static int gaudi2_get_hw_block_id(struct hl_device *hdev, u64 block_addr,
9599 u32 *block_size, u32 *block_id)
9600 {
9601 struct gaudi2_device *gaudi2 = hdev->asic_specific;
9602 int i;
9603
9604 for (i = 0 ; i < NUM_USER_MAPPED_BLOCKS ; i++) {
9605 if (block_addr == CFG_BASE + gaudi2->mapped_blocks[i].address) {
9606 *block_id = i;
9607 if (block_size)
9608 *block_size = gaudi2->mapped_blocks[i].size;
9609 return 0;
9610 }
9611 }
9612
9613 dev_err(hdev->dev, "Invalid block address %#llx", block_addr);
9614
9615 return -EINVAL;
9616 }
9617
9618 static int gaudi2_block_mmap(struct hl_device *hdev, struct vm_area_struct *vma,
9619 u32 block_id, u32 block_size)
9620 {
9621 struct gaudi2_device *gaudi2 = hdev->asic_specific;
9622 u64 offset_in_bar;
9623 u64 address;
9624 int rc;
9625
9626 if (block_id >= NUM_USER_MAPPED_BLOCKS) {
9627 dev_err(hdev->dev, "Invalid block id %u", block_id);
9628 return -EINVAL;
9629 }
9630
9631
9632 if (block_size != gaudi2->mapped_blocks[block_id].size) {
9633 dev_err(hdev->dev, "Invalid block size %u", block_size);
9634 return -EINVAL;
9635 }
9636
9637 offset_in_bar = CFG_BASE + gaudi2->mapped_blocks[block_id].address - STM_FLASH_BASE_ADDR;
9638
9639 address = pci_resource_start(hdev->pdev, SRAM_CFG_BAR_ID) + offset_in_bar;
9640
9641 vma->vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
9642 VM_DONTCOPY | VM_NORESERVE;
9643
9644 rc = remap_pfn_range(vma, vma->vm_start, address >> PAGE_SHIFT,
9645 block_size, vma->vm_page_prot);
9646 if (rc)
9647 dev_err(hdev->dev, "remap_pfn_range error %d", rc);
9648
9649 return rc;
9650 }
9651
9652 static void gaudi2_enable_events_from_fw(struct hl_device *hdev)
9653 {
9654 struct gaudi2_device *gaudi2 = hdev->asic_specific;
9655
9656 struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;
9657 u32 irq_handler_offset = le32_to_cpu(dyn_regs->gic_host_ints_irq);
9658
9659 if (gaudi2->hw_cap_initialized & HW_CAP_CPU_Q)
9660 WREG32(irq_handler_offset,
9661 gaudi2_irq_map_table[GAUDI2_EVENT_CPU_INTS_REGISTER].cpu_id);
9662 }
9663
9664 static int gaudi2_get_mmu_base(struct hl_device *hdev, u64 mmu_id, u32 *mmu_base)
9665 {
9666 switch (mmu_id) {
9667 case HW_CAP_DCORE0_DMMU0:
9668 *mmu_base = mmDCORE0_HMMU0_MMU_BASE;
9669 break;
9670 case HW_CAP_DCORE0_DMMU1:
9671 *mmu_base = mmDCORE0_HMMU1_MMU_BASE;
9672 break;
9673 case HW_CAP_DCORE0_DMMU2:
9674 *mmu_base = mmDCORE0_HMMU2_MMU_BASE;
9675 break;
9676 case HW_CAP_DCORE0_DMMU3:
9677 *mmu_base = mmDCORE0_HMMU3_MMU_BASE;
9678 break;
9679 case HW_CAP_DCORE1_DMMU0:
9680 *mmu_base = mmDCORE1_HMMU0_MMU_BASE;
9681 break;
9682 case HW_CAP_DCORE1_DMMU1:
9683 *mmu_base = mmDCORE1_HMMU1_MMU_BASE;
9684 break;
9685 case HW_CAP_DCORE1_DMMU2:
9686 *mmu_base = mmDCORE1_HMMU2_MMU_BASE;
9687 break;
9688 case HW_CAP_DCORE1_DMMU3:
9689 *mmu_base = mmDCORE1_HMMU3_MMU_BASE;
9690 break;
9691 case HW_CAP_DCORE2_DMMU0:
9692 *mmu_base = mmDCORE2_HMMU0_MMU_BASE;
9693 break;
9694 case HW_CAP_DCORE2_DMMU1:
9695 *mmu_base = mmDCORE2_HMMU1_MMU_BASE;
9696 break;
9697 case HW_CAP_DCORE2_DMMU2:
9698 *mmu_base = mmDCORE2_HMMU2_MMU_BASE;
9699 break;
9700 case HW_CAP_DCORE2_DMMU3:
9701 *mmu_base = mmDCORE2_HMMU3_MMU_BASE;
9702 break;
9703 case HW_CAP_DCORE3_DMMU0:
9704 *mmu_base = mmDCORE3_HMMU0_MMU_BASE;
9705 break;
9706 case HW_CAP_DCORE3_DMMU1:
9707 *mmu_base = mmDCORE3_HMMU1_MMU_BASE;
9708 break;
9709 case HW_CAP_DCORE3_DMMU2:
9710 *mmu_base = mmDCORE3_HMMU2_MMU_BASE;
9711 break;
9712 case HW_CAP_DCORE3_DMMU3:
9713 *mmu_base = mmDCORE3_HMMU3_MMU_BASE;
9714 break;
9715 case HW_CAP_PMMU:
9716 *mmu_base = mmPMMU_HBW_MMU_BASE;
9717 break;
9718 default:
9719 return -EINVAL;
9720 }
9721
9722 return 0;
9723 }
9724
9725 static void gaudi2_ack_mmu_error(struct hl_device *hdev, u64 mmu_id)
9726 {
9727 bool is_pmmu = (mmu_id == HW_CAP_PMMU ? true : false);
9728 struct gaudi2_device *gaudi2 = hdev->asic_specific;
9729 u32 mmu_base;
9730
9731 if (!(gaudi2->hw_cap_initialized & mmu_id))
9732 return;
9733
9734 if (gaudi2_get_mmu_base(hdev, mmu_id, &mmu_base))
9735 return;
9736
9737 gaudi2_handle_page_error(hdev, mmu_base, is_pmmu);
9738 gaudi2_handle_access_error(hdev, mmu_base, is_pmmu);
9739 }
9740
9741 static int gaudi2_ack_mmu_page_fault_or_access_error(struct hl_device *hdev, u64 mmu_cap_mask)
9742 {
9743 u32 i, mmu_id, num_of_hmmus = NUM_OF_HMMU_PER_DCORE * NUM_OF_DCORES;
9744
9745
9746 for (i = 0 ; i < num_of_hmmus ; i++) {
9747 mmu_id = HW_CAP_DCORE0_DMMU0 << i;
9748
9749 if (mmu_cap_mask & mmu_id)
9750 gaudi2_ack_mmu_error(hdev, mmu_id);
9751 }
9752
9753
9754 if (mmu_cap_mask & HW_CAP_PMMU)
9755 gaudi2_ack_mmu_error(hdev, HW_CAP_PMMU);
9756
9757 return 0;
9758 }
9759
9760 static void gaudi2_get_msi_info(__le32 *table)
9761 {
9762 table[CPUCP_EVENT_QUEUE_MSI_TYPE] = cpu_to_le32(GAUDI2_EVENT_QUEUE_MSIX_IDX);
9763 }
9764
9765 static int gaudi2_map_pll_idx_to_fw_idx(u32 pll_idx)
9766 {
9767 switch (pll_idx) {
9768 case HL_GAUDI2_CPU_PLL: return CPU_PLL;
9769 case HL_GAUDI2_PCI_PLL: return PCI_PLL;
9770 case HL_GAUDI2_NIC_PLL: return NIC_PLL;
9771 case HL_GAUDI2_DMA_PLL: return DMA_PLL;
9772 case HL_GAUDI2_MESH_PLL: return MESH_PLL;
9773 case HL_GAUDI2_MME_PLL: return MME_PLL;
9774 case HL_GAUDI2_TPC_PLL: return TPC_PLL;
9775 case HL_GAUDI2_IF_PLL: return IF_PLL;
9776 case HL_GAUDI2_SRAM_PLL: return SRAM_PLL;
9777 case HL_GAUDI2_HBM_PLL: return HBM_PLL;
9778 case HL_GAUDI2_VID_PLL: return VID_PLL;
9779 case HL_GAUDI2_MSS_PLL: return MSS_PLL;
9780 default: return -EINVAL;
9781 }
9782 }
9783
9784 static int gaudi2_gen_sync_to_engine_map(struct hl_device *hdev, struct hl_sync_to_engine_map *map)
9785 {
9786
9787 return 0;
9788 }
9789
9790 static int gaudi2_monitor_valid(struct hl_mon_state_dump *mon)
9791 {
9792
9793 return 0;
9794 }
9795
9796 static int gaudi2_print_single_monitor(char **buf, size_t *size, size_t *offset,
9797 struct hl_device *hdev, struct hl_mon_state_dump *mon)
9798 {
9799
9800 return 0;
9801 }
9802
9803
9804 static int gaudi2_print_fences_single_engine(struct hl_device *hdev, u64 base_offset,
9805 u64 status_base_offset, enum hl_sync_engine_type engine_type,
9806 u32 engine_id, char **buf, size_t *size, size_t *offset)
9807 {
9808
9809 return 0;
9810 }
9811
9812
9813 static struct hl_state_dump_specs_funcs gaudi2_state_dump_funcs = {
9814 .monitor_valid = gaudi2_monitor_valid,
9815 .print_single_monitor = gaudi2_print_single_monitor,
9816 .gen_sync_to_engine_map = gaudi2_gen_sync_to_engine_map,
9817 .print_fences_single_engine = gaudi2_print_fences_single_engine,
9818 };
9819
9820 static void gaudi2_state_dump_init(struct hl_device *hdev)
9821 {
9822
9823 hdev->state_dump_specs.props = gaudi2_state_dump_specs_props;
9824 hdev->state_dump_specs.funcs = gaudi2_state_dump_funcs;
9825 }
9826
9827 static u32 gaudi2_get_sob_addr(struct hl_device *hdev, u32 sob_id)
9828 {
9829 return 0;
9830 }
9831
9832 static u32 *gaudi2_get_stream_master_qid_arr(void)
9833 {
9834 return NULL;
9835 }
9836
9837 static void gaudi2_add_device_attr(struct hl_device *hdev, struct attribute_group *dev_clk_attr_grp,
9838 struct attribute_group *dev_vrm_attr_grp)
9839 {
9840 hl_sysfs_add_dev_clk_attr(hdev, dev_clk_attr_grp);
9841 hl_sysfs_add_dev_vrm_attr(hdev, dev_vrm_attr_grp);
9842 }
9843
9844 static int gaudi2_mmu_get_real_page_size(struct hl_device *hdev, struct hl_mmu_properties *mmu_prop,
9845 u32 page_size, u32 *real_page_size, bool is_dram_addr)
9846 {
9847 struct asic_fixed_properties *prop = &hdev->asic_prop;
9848
9849
9850 if (!is_dram_addr) {
9851 if (page_size % mmu_prop->page_size)
9852 goto page_size_err;
9853
9854 *real_page_size = mmu_prop->page_size;
9855 return 0;
9856 }
9857
9858 if ((page_size % prop->dram_page_size) || (prop->dram_page_size > mmu_prop->page_size))
9859 goto page_size_err;
9860
9861
9862
9863
9864
9865
9866
9867
9868
9869 *real_page_size = prop->dram_page_size;
9870
9871 return 0;
9872
9873 page_size_err:
9874 dev_err(hdev->dev, "page size of %u is not %uKB aligned, can't map\n",
9875 page_size, mmu_prop->page_size >> 10);
9876 return -EFAULT;
9877 }
9878
9879 static int gaudi2_get_monitor_dump(struct hl_device *hdev, void *data)
9880 {
9881 return -EOPNOTSUPP;
9882 }
9883
9884 static const struct hl_asic_funcs gaudi2_funcs = {
9885 .early_init = gaudi2_early_init,
9886 .early_fini = gaudi2_early_fini,
9887 .late_init = gaudi2_late_init,
9888 .late_fini = gaudi2_late_fini,
9889 .sw_init = gaudi2_sw_init,
9890 .sw_fini = gaudi2_sw_fini,
9891 .hw_init = gaudi2_hw_init,
9892 .hw_fini = gaudi2_hw_fini,
9893 .halt_engines = gaudi2_halt_engines,
9894 .suspend = gaudi2_suspend,
9895 .resume = gaudi2_resume,
9896 .mmap = gaudi2_mmap,
9897 .ring_doorbell = gaudi2_ring_doorbell,
9898 .pqe_write = gaudi2_pqe_write,
9899 .asic_dma_alloc_coherent = gaudi2_dma_alloc_coherent,
9900 .asic_dma_free_coherent = gaudi2_dma_free_coherent,
9901 .scrub_device_mem = gaudi2_scrub_device_mem,
9902 .scrub_device_dram = gaudi2_scrub_device_dram,
9903 .get_int_queue_base = NULL,
9904 .test_queues = gaudi2_test_queues,
9905 .asic_dma_pool_zalloc = gaudi2_dma_pool_zalloc,
9906 .asic_dma_pool_free = gaudi2_dma_pool_free,
9907 .cpu_accessible_dma_pool_alloc = gaudi2_cpu_accessible_dma_pool_alloc,
9908 .cpu_accessible_dma_pool_free = gaudi2_cpu_accessible_dma_pool_free,
9909 .asic_dma_unmap_single = gaudi2_dma_unmap_single,
9910 .asic_dma_map_single = gaudi2_dma_map_single,
9911 .hl_dma_unmap_sgtable = hl_dma_unmap_sgtable,
9912 .cs_parser = gaudi2_cs_parser,
9913 .asic_dma_map_sgtable = hl_dma_map_sgtable,
9914 .add_end_of_cb_packets = NULL,
9915 .update_eq_ci = gaudi2_update_eq_ci,
9916 .context_switch = gaudi2_context_switch,
9917 .restore_phase_topology = gaudi2_restore_phase_topology,
9918 .debugfs_read_dma = gaudi2_debugfs_read_dma,
9919 .add_device_attr = gaudi2_add_device_attr,
9920 .handle_eqe = gaudi2_handle_eqe,
9921 .get_events_stat = gaudi2_get_events_stat,
9922 .read_pte = NULL,
9923 .write_pte = NULL,
9924 .mmu_invalidate_cache = gaudi2_mmu_invalidate_cache,
9925 .mmu_invalidate_cache_range = gaudi2_mmu_invalidate_cache_range,
9926 .mmu_prefetch_cache_range = NULL,
9927 .send_heartbeat = gaudi2_send_heartbeat,
9928 .debug_coresight = gaudi2_debug_coresight,
9929 .is_device_idle = gaudi2_is_device_idle,
9930 .non_hard_reset_late_init = gaudi2_non_hard_reset_late_init,
9931 .hw_queues_lock = gaudi2_hw_queues_lock,
9932 .hw_queues_unlock = gaudi2_hw_queues_unlock,
9933 .kdma_lock = gaudi2_kdma_lock,
9934 .kdma_unlock = gaudi2_kdma_unlock,
9935 .get_pci_id = gaudi2_get_pci_id,
9936 .get_eeprom_data = gaudi2_get_eeprom_data,
9937 .get_monitor_dump = gaudi2_get_monitor_dump,
9938 .send_cpu_message = gaudi2_send_cpu_message,
9939 .pci_bars_map = gaudi2_pci_bars_map,
9940 .init_iatu = gaudi2_init_iatu,
9941 .rreg = hl_rreg,
9942 .wreg = hl_wreg,
9943 .halt_coresight = gaudi2_halt_coresight,
9944 .ctx_init = gaudi2_ctx_init,
9945 .ctx_fini = gaudi2_ctx_fini,
9946 .pre_schedule_cs = gaudi2_pre_schedule_cs,
9947 .get_queue_id_for_cq = gaudi2_get_queue_id_for_cq,
9948 .load_firmware_to_device = NULL,
9949 .load_boot_fit_to_device = NULL,
9950 .get_signal_cb_size = gaudi2_get_signal_cb_size,
9951 .get_wait_cb_size = gaudi2_get_wait_cb_size,
9952 .gen_signal_cb = gaudi2_gen_signal_cb,
9953 .gen_wait_cb = gaudi2_gen_wait_cb,
9954 .reset_sob = gaudi2_reset_sob,
9955 .reset_sob_group = gaudi2_reset_sob_group,
9956 .get_device_time = gaudi2_get_device_time,
9957 .pb_print_security_errors = gaudi2_pb_print_security_errors,
9958 .collective_wait_init_cs = gaudi2_collective_wait_init_cs,
9959 .collective_wait_create_jobs = gaudi2_collective_wait_create_jobs,
9960 .get_dec_base_addr = gaudi2_get_dec_base_addr,
9961 .scramble_addr = gaudi2_mmu_scramble_addr,
9962 .descramble_addr = gaudi2_mmu_descramble_addr,
9963 .ack_protection_bits_errors = gaudi2_ack_protection_bits_errors,
9964 .get_hw_block_id = gaudi2_get_hw_block_id,
9965 .hw_block_mmap = gaudi2_block_mmap,
9966 .enable_events_from_fw = gaudi2_enable_events_from_fw,
9967 .ack_mmu_errors = gaudi2_ack_mmu_page_fault_or_access_error,
9968 .get_msi_info = gaudi2_get_msi_info,
9969 .map_pll_idx_to_fw_idx = gaudi2_map_pll_idx_to_fw_idx,
9970 .init_firmware_preload_params = gaudi2_init_firmware_preload_params,
9971 .init_firmware_loader = gaudi2_init_firmware_loader,
9972 .init_cpu_scrambler_dram = gaudi2_init_scrambler_hbm,
9973 .state_dump_init = gaudi2_state_dump_init,
9974 .get_sob_addr = &gaudi2_get_sob_addr,
9975 .set_pci_memory_regions = gaudi2_set_pci_memory_regions,
9976 .get_stream_master_qid_arr = gaudi2_get_stream_master_qid_arr,
9977 .check_if_razwi_happened = gaudi2_check_if_razwi_happened,
9978 .mmu_get_real_page_size = gaudi2_mmu_get_real_page_size,
9979 .access_dev_mem = hl_access_dev_mem,
9980 .set_dram_bar_base = gaudi2_set_hbm_bar_base,
9981 };
9982
9983 void gaudi2_set_asic_funcs(struct hl_device *hdev)
9984 {
9985 hdev->asic_funcs = &gaudi2_funcs;
9986 }