Path: blob/master/drivers/accel/habanalabs/gaudi2/gaudi2.c
29286 views
// SPDX-License-Identifier: GPL-2.012/*3* Copyright 2020-2022 HabanaLabs, Ltd.4* All Rights Reserved.5*/67#include "gaudi2P.h"8#include "gaudi2_masks.h"9#include "../include/gaudi2/gaudi2_special_blocks.h"10#include "../include/hw_ip/mmu/mmu_general.h"11#include "../include/hw_ip/mmu/mmu_v2_0.h"12#include "../include/gaudi2/gaudi2_packets.h"13#include "../include/gaudi2/gaudi2_reg_map.h"14#include "../include/gaudi2/gaudi2_async_ids_map_extended.h"15#include "../include/gaudi2/arc/gaudi2_arc_common_packets.h"1617#include <linux/module.h>18#include <linux/pci.h>19#include <linux/hwmon.h>20#include <linux/iommu.h>2122#define GAUDI2_DMA_POOL_BLK_SIZE SZ_256 /* 256 bytes */2324#define GAUDI2_RESET_TIMEOUT_MSEC 2000 /* 2000ms */2526#define GAUDI2_RESET_POLL_TIMEOUT_USEC 500000 /* 500ms */27#define GAUDI2_PLDM_HRESET_TIMEOUT_MSEC 25000 /* 25s */28#define GAUDI2_PLDM_SRESET_TIMEOUT_MSEC 25000 /* 25s */29#define GAUDI2_PLDM_RESET_POLL_TIMEOUT_USEC 3000000 /* 3s */30#define GAUDI2_RESET_POLL_CNT 331#define GAUDI2_RESET_WAIT_MSEC 1 /* 1ms */32#define GAUDI2_CPU_RESET_WAIT_MSEC 100 /* 100ms */33#define GAUDI2_PLDM_RESET_WAIT_MSEC 1000 /* 1s */34#define GAUDI2_CB_POOL_CB_CNT 51235#define GAUDI2_CB_POOL_CB_SIZE SZ_128K /* 128KB */36#define GAUDI2_MSG_TO_CPU_TIMEOUT_USEC 4000000 /* 4s */37#define GAUDI2_WAIT_FOR_BL_TIMEOUT_USEC 25000000 /* 25s */38#define GAUDI2_TEST_QUEUE_WAIT_USEC 100000 /* 100ms */39#define GAUDI2_PLDM_TEST_QUEUE_WAIT_USEC 1000000 /* 1s */4041#define GAUDI2_ALLOC_CPU_MEM_RETRY_CNT 34243/*44* since the code already has built-in support for binning of up to MAX_FAULTY_TPCS TPCs45* and the code relies on that value (for array size etc..) we define another value46* for MAX faulty TPCs which reflects the cluster binning requirements47*/48#define MAX_CLUSTER_BINNING_FAULTY_TPCS 149#define MAX_FAULTY_XBARS 150#define MAX_FAULTY_EDMAS 151#define MAX_FAULTY_DECODERS 15253#define GAUDI2_TPC_FULL_MASK 0x1FFFFFF54#define GAUDI2_HIF_HMMU_FULL_MASK 0xFFFF55#define GAUDI2_DECODER_FULL_MASK 0x3FF5657#define GAUDI2_NA_EVENT_CAUSE 0xFF58#define GAUDI2_NUM_OF_QM_ERR_CAUSE 1859#define GAUDI2_NUM_OF_LOWER_QM_ERR_CAUSE 2560#define GAUDI2_NUM_OF_QM_ARB_ERR_CAUSE 361#define GAUDI2_NUM_OF_ARC_SEI_ERR_CAUSE 1462#define GAUDI2_NUM_OF_CPU_SEI_ERR_CAUSE 363#define GAUDI2_NUM_OF_QM_SEI_ERR_CAUSE 264#define GAUDI2_NUM_OF_ROT_ERR_CAUSE 2265#define GAUDI2_NUM_OF_TPC_INTR_CAUSE 3166#define GAUDI2_NUM_OF_DEC_ERR_CAUSE 2567#define GAUDI2_NUM_OF_MME_ERR_CAUSE 1668#define GAUDI2_NUM_OF_MME_WAP_ERR_CAUSE 769#define GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE 870#define GAUDI2_NUM_OF_MMU_SPI_SEI_CAUSE 1971#define GAUDI2_NUM_OF_HBM_SEI_CAUSE 972#define GAUDI2_NUM_OF_SM_SEI_ERR_CAUSE 373#define GAUDI2_NUM_OF_PCIE_ADDR_DEC_ERR_CAUSE 374#define GAUDI2_NUM_OF_PMMU_FATAL_ERR_CAUSE 275#define GAUDI2_NUM_OF_HIF_FATAL_ERR_CAUSE 276#define GAUDI2_NUM_OF_AXI_DRAIN_ERR_CAUSE 277#define GAUDI2_NUM_OF_HBM_MC_SPI_CAUSE 57879#define GAUDI2_MMU_CACHE_INV_TIMEOUT_USEC (MMU_CONFIG_TIMEOUT_USEC * 10)80#define GAUDI2_PLDM_MMU_TIMEOUT_USEC (MMU_CONFIG_TIMEOUT_USEC * 200)81#define GAUDI2_ARB_WDT_TIMEOUT (0x1000000)8283#define GAUDI2_VDEC_TIMEOUT_USEC 10000 /* 10ms */84#define GAUDI2_PLDM_VDEC_TIMEOUT_USEC (GAUDI2_VDEC_TIMEOUT_USEC * 100)8586#define KDMA_TIMEOUT_USEC USEC_PER_SEC8788#define IS_DMA_IDLE(dma_core_sts0) \89(!((dma_core_sts0) & (DCORE0_EDMA0_CORE_STS0_BUSY_MASK)))9091#define IS_DMA_HALTED(dma_core_sts1) \92((dma_core_sts1) & (DCORE0_EDMA0_CORE_STS1_IS_HALT_MASK))9394#define IS_MME_IDLE(mme_arch_sts) (((mme_arch_sts) & MME_ARCH_IDLE_MASK) == MME_ARCH_IDLE_MASK)9596#define IS_TPC_IDLE(tpc_cfg_sts) (((tpc_cfg_sts) & (TPC_IDLE_MASK)) == (TPC_IDLE_MASK))9798#define IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts) \99((((qm_glbl_sts0) & (QM_IDLE_MASK)) == (QM_IDLE_MASK)) && \100(((qm_glbl_sts1) & (QM_ARC_IDLE_MASK)) == (QM_ARC_IDLE_MASK)) && \101(((qm_cgm_sts) & (CGM_IDLE_MASK)) == (CGM_IDLE_MASK)))102103#define PCIE_DEC_EN_MASK 0x300104#define DEC_WORK_STATE_IDLE 0105#define DEC_WORK_STATE_PEND 3106#define IS_DEC_IDLE(dec_swreg15) \107(((dec_swreg15) & DCORE0_DEC0_CMD_SWREG15_SW_WORK_STATE_MASK) == DEC_WORK_STATE_IDLE || \108((dec_swreg15) & DCORE0_DEC0_CMD_SWREG15_SW_WORK_STATE_MASK) == DEC_WORK_STATE_PEND)109110/* HBM MMU address scrambling parameters */111#define GAUDI2_HBM_MMU_SCRM_MEM_SIZE SZ_8M112#define GAUDI2_HBM_MMU_SCRM_DIV_SHIFT 26113#define GAUDI2_HBM_MMU_SCRM_MOD_SHIFT 0114#define GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK DRAM_VA_HINT_MASK115#define GAUDI2_COMPENSATE_TLB_PAGE_SIZE_FACTOR 16116#define MMU_RANGE_INV_VA_LSB_SHIFT 12117#define MMU_RANGE_INV_VA_MSB_SHIFT 44118#define MMU_RANGE_INV_EN_SHIFT 0119#define MMU_RANGE_INV_ASID_EN_SHIFT 1120#define MMU_RANGE_INV_ASID_SHIFT 2121122/* The last SPI_SEI cause bit, "burst_fifo_full", is expected to be triggered in PMMU because it has123* a 2 entries FIFO, and hence it is not enabled for it.124*/125#define GAUDI2_PMMU_SPI_SEI_ENABLE_MASK GENMASK(GAUDI2_NUM_OF_MMU_SPI_SEI_CAUSE - 2, 0)126#define GAUDI2_HMMU_SPI_SEI_ENABLE_MASK GENMASK(GAUDI2_NUM_OF_MMU_SPI_SEI_CAUSE - 1, 0)127128#define GAUDI2_MAX_STRING_LEN 64129130#define GAUDI2_VDEC_MSIX_ENTRIES (GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM - \131GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM + 1)132133#define ENGINE_ID_DCORE_OFFSET (GAUDI2_DCORE1_ENGINE_ID_EDMA_0 - GAUDI2_DCORE0_ENGINE_ID_EDMA_0)134135/* RAZWI initiator coordinates */136#define RAZWI_GET_AXUSER_XY(x) \137((x & 0xF8001FF0) >> 4)138139#define RAZWI_GET_AXUSER_LOW_XY(x) \140((x & 0x00001FF0) >> 4)141142#define RAZWI_INITIATOR_AXUER_L_X_SHIFT 0143#define RAZWI_INITIATOR_AXUER_L_X_MASK 0x1F144#define RAZWI_INITIATOR_AXUER_L_Y_SHIFT 5145#define RAZWI_INITIATOR_AXUER_L_Y_MASK 0xF146147#define RAZWI_INITIATOR_AXUER_H_X_SHIFT 23148#define RAZWI_INITIATOR_AXUER_H_X_MASK 0x1F149150#define RAZWI_INITIATOR_ID_X_Y_LOW(x, y) \151((((y) & RAZWI_INITIATOR_AXUER_L_Y_MASK) << RAZWI_INITIATOR_AXUER_L_Y_SHIFT) | \152(((x) & RAZWI_INITIATOR_AXUER_L_X_MASK) << RAZWI_INITIATOR_AXUER_L_X_SHIFT))153154#define RAZWI_INITIATOR_ID_X_HIGH(x) \155(((x) & RAZWI_INITIATOR_AXUER_H_X_MASK) << RAZWI_INITIATOR_AXUER_H_X_SHIFT)156157#define RAZWI_INITIATOR_ID_X_Y(xl, yl, xh) \158(RAZWI_INITIATOR_ID_X_Y_LOW(xl, yl) | RAZWI_INITIATOR_ID_X_HIGH(xh))159160#define PSOC_RAZWI_ENG_STR_SIZE 128161#define PSOC_RAZWI_MAX_ENG_PER_RTR 5162163/* HW scrambles only bits 0-25 */164#define HW_UNSCRAMBLED_BITS_MASK GENMASK_ULL(63, 26)165166#define GAUDI2_GLBL_ERR_MAX_CAUSE_NUM 17167168struct gaudi2_razwi_info {169u32 axuser_xy;170u32 rtr_ctrl;171u16 eng_id;172char *eng_name;173};174175static struct gaudi2_razwi_info common_razwi_info[] = {176{RAZWI_INITIATOR_ID_X_Y(2, 4, 0), mmDCORE0_RTR0_CTRL_BASE,177GAUDI2_DCORE0_ENGINE_ID_DEC_0, "DEC0"},178{RAZWI_INITIATOR_ID_X_Y(2, 4, 4), mmDCORE0_RTR0_CTRL_BASE,179GAUDI2_DCORE0_ENGINE_ID_DEC_1, "DEC1"},180{RAZWI_INITIATOR_ID_X_Y(17, 4, 18), mmDCORE1_RTR7_CTRL_BASE,181GAUDI2_DCORE1_ENGINE_ID_DEC_0, "DEC2"},182{RAZWI_INITIATOR_ID_X_Y(17, 4, 14), mmDCORE1_RTR7_CTRL_BASE,183GAUDI2_DCORE1_ENGINE_ID_DEC_1, "DEC3"},184{RAZWI_INITIATOR_ID_X_Y(2, 11, 0), mmDCORE2_RTR0_CTRL_BASE,185GAUDI2_DCORE2_ENGINE_ID_DEC_0, "DEC4"},186{RAZWI_INITIATOR_ID_X_Y(2, 11, 4), mmDCORE2_RTR0_CTRL_BASE,187GAUDI2_DCORE2_ENGINE_ID_DEC_1, "DEC5"},188{RAZWI_INITIATOR_ID_X_Y(17, 11, 18), mmDCORE3_RTR7_CTRL_BASE,189GAUDI2_DCORE3_ENGINE_ID_DEC_0, "DEC6"},190{RAZWI_INITIATOR_ID_X_Y(17, 11, 14), mmDCORE3_RTR7_CTRL_BASE,191GAUDI2_DCORE3_ENGINE_ID_DEC_1, "DEC7"},192{RAZWI_INITIATOR_ID_X_Y(2, 4, 6), mmDCORE0_RTR0_CTRL_BASE,193GAUDI2_PCIE_ENGINE_ID_DEC_0, "DEC8"},194{RAZWI_INITIATOR_ID_X_Y(2, 4, 7), mmDCORE0_RTR0_CTRL_BASE,195GAUDI2_PCIE_ENGINE_ID_DEC_0, "DEC9"},196{RAZWI_INITIATOR_ID_X_Y(3, 4, 2), mmDCORE0_RTR1_CTRL_BASE,197GAUDI2_DCORE0_ENGINE_ID_TPC_0, "TPC0"},198{RAZWI_INITIATOR_ID_X_Y(3, 4, 4), mmDCORE0_RTR1_CTRL_BASE,199GAUDI2_DCORE0_ENGINE_ID_TPC_1, "TPC1"},200{RAZWI_INITIATOR_ID_X_Y(4, 4, 2), mmDCORE0_RTR2_CTRL_BASE,201GAUDI2_DCORE0_ENGINE_ID_TPC_2, "TPC2"},202{RAZWI_INITIATOR_ID_X_Y(4, 4, 4), mmDCORE0_RTR2_CTRL_BASE,203GAUDI2_DCORE0_ENGINE_ID_TPC_3, "TPC3"},204{RAZWI_INITIATOR_ID_X_Y(5, 4, 2), mmDCORE0_RTR3_CTRL_BASE,205GAUDI2_DCORE0_ENGINE_ID_TPC_4, "TPC4"},206{RAZWI_INITIATOR_ID_X_Y(5, 4, 4), mmDCORE0_RTR3_CTRL_BASE,207GAUDI2_DCORE0_ENGINE_ID_TPC_5, "TPC5"},208{RAZWI_INITIATOR_ID_X_Y(16, 4, 14), mmDCORE1_RTR6_CTRL_BASE,209GAUDI2_DCORE1_ENGINE_ID_TPC_0, "TPC6"},210{RAZWI_INITIATOR_ID_X_Y(16, 4, 16), mmDCORE1_RTR6_CTRL_BASE,211GAUDI2_DCORE1_ENGINE_ID_TPC_1, "TPC7"},212{RAZWI_INITIATOR_ID_X_Y(15, 4, 14), mmDCORE1_RTR5_CTRL_BASE,213GAUDI2_DCORE1_ENGINE_ID_TPC_2, "TPC8"},214{RAZWI_INITIATOR_ID_X_Y(15, 4, 16), mmDCORE1_RTR5_CTRL_BASE,215GAUDI2_DCORE1_ENGINE_ID_TPC_3, "TPC9"},216{RAZWI_INITIATOR_ID_X_Y(14, 4, 14), mmDCORE1_RTR4_CTRL_BASE,217GAUDI2_DCORE1_ENGINE_ID_TPC_4, "TPC10"},218{RAZWI_INITIATOR_ID_X_Y(14, 4, 16), mmDCORE1_RTR4_CTRL_BASE,219GAUDI2_DCORE1_ENGINE_ID_TPC_5, "TPC11"},220{RAZWI_INITIATOR_ID_X_Y(5, 11, 2), mmDCORE2_RTR3_CTRL_BASE,221GAUDI2_DCORE2_ENGINE_ID_TPC_0, "TPC12"},222{RAZWI_INITIATOR_ID_X_Y(5, 11, 4), mmDCORE2_RTR3_CTRL_BASE,223GAUDI2_DCORE2_ENGINE_ID_TPC_1, "TPC13"},224{RAZWI_INITIATOR_ID_X_Y(4, 11, 2), mmDCORE2_RTR2_CTRL_BASE,225GAUDI2_DCORE2_ENGINE_ID_TPC_2, "TPC14"},226{RAZWI_INITIATOR_ID_X_Y(4, 11, 4), mmDCORE2_RTR2_CTRL_BASE,227GAUDI2_DCORE2_ENGINE_ID_TPC_3, "TPC15"},228{RAZWI_INITIATOR_ID_X_Y(3, 11, 2), mmDCORE2_RTR1_CTRL_BASE,229GAUDI2_DCORE2_ENGINE_ID_TPC_4, "TPC16"},230{RAZWI_INITIATOR_ID_X_Y(3, 11, 4), mmDCORE2_RTR1_CTRL_BASE,231GAUDI2_DCORE2_ENGINE_ID_TPC_5, "TPC17"},232{RAZWI_INITIATOR_ID_X_Y(14, 11, 14), mmDCORE3_RTR4_CTRL_BASE,233GAUDI2_DCORE3_ENGINE_ID_TPC_0, "TPC18"},234{RAZWI_INITIATOR_ID_X_Y(14, 11, 16), mmDCORE3_RTR4_CTRL_BASE,235GAUDI2_DCORE3_ENGINE_ID_TPC_1, "TPC19"},236{RAZWI_INITIATOR_ID_X_Y(15, 11, 14), mmDCORE3_RTR5_CTRL_BASE,237GAUDI2_DCORE3_ENGINE_ID_TPC_2, "TPC20"},238{RAZWI_INITIATOR_ID_X_Y(15, 11, 16), mmDCORE3_RTR5_CTRL_BASE,239GAUDI2_DCORE3_ENGINE_ID_TPC_3, "TPC21"},240{RAZWI_INITIATOR_ID_X_Y(16, 11, 14), mmDCORE3_RTR6_CTRL_BASE,241GAUDI2_DCORE3_ENGINE_ID_TPC_4, "TPC22"},242{RAZWI_INITIATOR_ID_X_Y(16, 11, 16), mmDCORE3_RTR6_CTRL_BASE,243GAUDI2_DCORE3_ENGINE_ID_TPC_5, "TPC23"},244{RAZWI_INITIATOR_ID_X_Y(2, 4, 2), mmDCORE0_RTR0_CTRL_BASE,245GAUDI2_DCORE3_ENGINE_ID_TPC_5, "TPC24"},246{RAZWI_INITIATOR_ID_X_Y(17, 4, 8), mmDCORE1_RTR7_CTRL_BASE,247GAUDI2_ENGINE_ID_NIC0_0, "NIC0"},248{RAZWI_INITIATOR_ID_X_Y(17, 4, 10), mmDCORE1_RTR7_CTRL_BASE,249GAUDI2_ENGINE_ID_NIC0_1, "NIC1"},250{RAZWI_INITIATOR_ID_X_Y(17, 4, 12), mmDCORE1_RTR7_CTRL_BASE,251GAUDI2_ENGINE_ID_NIC1_0, "NIC2"},252{RAZWI_INITIATOR_ID_X_Y(17, 4, 14), mmDCORE1_RTR7_CTRL_BASE,253GAUDI2_ENGINE_ID_NIC1_1, "NIC3"},254{RAZWI_INITIATOR_ID_X_Y(17, 4, 15), mmDCORE1_RTR7_CTRL_BASE,255GAUDI2_ENGINE_ID_NIC2_0, "NIC4"},256{RAZWI_INITIATOR_ID_X_Y(2, 11, 2), mmDCORE2_RTR0_CTRL_BASE,257GAUDI2_ENGINE_ID_NIC2_1, "NIC5"},258{RAZWI_INITIATOR_ID_X_Y(2, 11, 4), mmDCORE2_RTR0_CTRL_BASE,259GAUDI2_ENGINE_ID_NIC3_0, "NIC6"},260{RAZWI_INITIATOR_ID_X_Y(2, 11, 6), mmDCORE2_RTR0_CTRL_BASE,261GAUDI2_ENGINE_ID_NIC3_1, "NIC7"},262{RAZWI_INITIATOR_ID_X_Y(2, 11, 8), mmDCORE2_RTR0_CTRL_BASE,263GAUDI2_ENGINE_ID_NIC4_0, "NIC8"},264{RAZWI_INITIATOR_ID_X_Y(17, 11, 12), mmDCORE3_RTR7_CTRL_BASE,265GAUDI2_ENGINE_ID_NIC4_1, "NIC9"},266{RAZWI_INITIATOR_ID_X_Y(17, 11, 14), mmDCORE3_RTR7_CTRL_BASE,267GAUDI2_ENGINE_ID_NIC5_0, "NIC10"},268{RAZWI_INITIATOR_ID_X_Y(17, 11, 16), mmDCORE3_RTR7_CTRL_BASE,269GAUDI2_ENGINE_ID_NIC5_1, "NIC11"},270{RAZWI_INITIATOR_ID_X_Y(2, 4, 2), mmDCORE0_RTR0_CTRL_BASE,271GAUDI2_ENGINE_ID_PDMA_0, "PDMA0"},272{RAZWI_INITIATOR_ID_X_Y(2, 4, 3), mmDCORE0_RTR0_CTRL_BASE,273GAUDI2_ENGINE_ID_PDMA_1, "PDMA1"},274{RAZWI_INITIATOR_ID_X_Y(2, 4, 4), mmDCORE0_RTR0_CTRL_BASE,275GAUDI2_ENGINE_ID_SIZE, "PMMU"},276{RAZWI_INITIATOR_ID_X_Y(2, 4, 5), mmDCORE0_RTR0_CTRL_BASE,277GAUDI2_ENGINE_ID_SIZE, "PCIE"},278{RAZWI_INITIATOR_ID_X_Y(17, 4, 16), mmDCORE1_RTR7_CTRL_BASE,279GAUDI2_ENGINE_ID_ARC_FARM, "ARC_FARM"},280{RAZWI_INITIATOR_ID_X_Y(17, 4, 17), mmDCORE1_RTR7_CTRL_BASE,281GAUDI2_ENGINE_ID_KDMA, "KDMA"},282{RAZWI_INITIATOR_ID_X_Y(1, 5, 1), mmSFT0_HBW_RTR_IF1_RTR_CTRL_BASE,283GAUDI2_DCORE0_ENGINE_ID_EDMA_0, "EDMA0"},284{RAZWI_INITIATOR_ID_X_Y(1, 5, 1), mmSFT0_HBW_RTR_IF0_RTR_CTRL_BASE,285GAUDI2_DCORE0_ENGINE_ID_EDMA_1, "EDMA1"},286{RAZWI_INITIATOR_ID_X_Y(18, 5, 18), mmSFT1_HBW_RTR_IF1_RTR_CTRL_BASE,287GAUDI2_DCORE1_ENGINE_ID_EDMA_0, "EDMA2"},288{RAZWI_INITIATOR_ID_X_Y(18, 5, 18), mmSFT1_HBW_RTR_IF0_RTR_CTRL_BASE,289GAUDI2_DCORE1_ENGINE_ID_EDMA_1, "EDMA3"},290{RAZWI_INITIATOR_ID_X_Y(1, 10, 1), mmSFT2_HBW_RTR_IF0_RTR_CTRL_BASE,291GAUDI2_DCORE2_ENGINE_ID_EDMA_0, "EDMA4"},292{RAZWI_INITIATOR_ID_X_Y(1, 10, 1), mmSFT2_HBW_RTR_IF1_RTR_CTRL_BASE,293GAUDI2_DCORE2_ENGINE_ID_EDMA_1, "EDMA5"},294{RAZWI_INITIATOR_ID_X_Y(18, 10, 18), mmSFT2_HBW_RTR_IF0_RTR_CTRL_BASE,295GAUDI2_DCORE3_ENGINE_ID_EDMA_0, "EDMA6"},296{RAZWI_INITIATOR_ID_X_Y(18, 10, 18), mmSFT2_HBW_RTR_IF1_RTR_CTRL_BASE,297GAUDI2_DCORE3_ENGINE_ID_EDMA_1, "EDMA7"},298{RAZWI_INITIATOR_ID_X_Y(1, 5, 0), mmDCORE0_RTR0_CTRL_BASE,299GAUDI2_ENGINE_ID_SIZE, "HMMU0"},300{RAZWI_INITIATOR_ID_X_Y(18, 5, 19), mmDCORE1_RTR7_CTRL_BASE,301GAUDI2_ENGINE_ID_SIZE, "HMMU1"},302{RAZWI_INITIATOR_ID_X_Y(1, 5, 0), mmDCORE0_RTR0_CTRL_BASE,303GAUDI2_ENGINE_ID_SIZE, "HMMU2"},304{RAZWI_INITIATOR_ID_X_Y(18, 5, 19), mmDCORE1_RTR7_CTRL_BASE,305GAUDI2_ENGINE_ID_SIZE, "HMMU3"},306{RAZWI_INITIATOR_ID_X_Y(1, 5, 0), mmDCORE0_RTR0_CTRL_BASE,307GAUDI2_ENGINE_ID_SIZE, "HMMU4"},308{RAZWI_INITIATOR_ID_X_Y(18, 5, 19), mmDCORE1_RTR7_CTRL_BASE,309GAUDI2_ENGINE_ID_SIZE, "HMMU5"},310{RAZWI_INITIATOR_ID_X_Y(1, 5, 0), mmDCORE0_RTR0_CTRL_BASE,311GAUDI2_ENGINE_ID_SIZE, "HMMU6"},312{RAZWI_INITIATOR_ID_X_Y(18, 5, 19), mmDCORE1_RTR7_CTRL_BASE,313GAUDI2_ENGINE_ID_SIZE, "HMMU7"},314{RAZWI_INITIATOR_ID_X_Y(1, 10, 0), mmDCORE2_RTR0_CTRL_BASE,315GAUDI2_ENGINE_ID_SIZE, "HMMU8"},316{RAZWI_INITIATOR_ID_X_Y(18, 10, 19), mmDCORE3_RTR7_CTRL_BASE,317GAUDI2_ENGINE_ID_SIZE, "HMMU9"},318{RAZWI_INITIATOR_ID_X_Y(1, 10, 0), mmDCORE2_RTR0_CTRL_BASE,319GAUDI2_ENGINE_ID_SIZE, "HMMU10"},320{RAZWI_INITIATOR_ID_X_Y(18, 10, 19), mmDCORE3_RTR7_CTRL_BASE,321GAUDI2_ENGINE_ID_SIZE, "HMMU11"},322{RAZWI_INITIATOR_ID_X_Y(1, 10, 0), mmDCORE2_RTR0_CTRL_BASE,323GAUDI2_ENGINE_ID_SIZE, "HMMU12"},324{RAZWI_INITIATOR_ID_X_Y(18, 10, 19), mmDCORE3_RTR7_CTRL_BASE,325GAUDI2_ENGINE_ID_SIZE, "HMMU13"},326{RAZWI_INITIATOR_ID_X_Y(1, 10, 0), mmDCORE2_RTR0_CTRL_BASE,327GAUDI2_ENGINE_ID_SIZE, "HMMU14"},328{RAZWI_INITIATOR_ID_X_Y(18, 10, 19), mmDCORE3_RTR7_CTRL_BASE,329GAUDI2_ENGINE_ID_SIZE, "HMMU15"},330{RAZWI_INITIATOR_ID_X_Y(2, 11, 2), mmDCORE2_RTR0_CTRL_BASE,331GAUDI2_ENGINE_ID_ROT_0, "ROT0"},332{RAZWI_INITIATOR_ID_X_Y(17, 11, 16), mmDCORE3_RTR7_CTRL_BASE,333GAUDI2_ENGINE_ID_ROT_1, "ROT1"},334{RAZWI_INITIATOR_ID_X_Y(2, 11, 2), mmDCORE2_RTR0_CTRL_BASE,335GAUDI2_ENGINE_ID_PSOC, "CPU"},336{RAZWI_INITIATOR_ID_X_Y(17, 11, 11), mmDCORE3_RTR7_CTRL_BASE,337GAUDI2_ENGINE_ID_PSOC, "PSOC"}338};339340static struct gaudi2_razwi_info mme_razwi_info[] = {341/* MME X high coordinate is N/A, hence using only low coordinates */342{RAZWI_INITIATOR_ID_X_Y_LOW(7, 4), mmDCORE0_RTR5_CTRL_BASE,343GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_WAP0"},344{RAZWI_INITIATOR_ID_X_Y_LOW(9, 4), mmDCORE0_RTR7_CTRL_BASE,345GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_WAP1"},346{RAZWI_INITIATOR_ID_X_Y_LOW(8, 4), mmDCORE0_RTR6_CTRL_BASE,347GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_CTRL_WR"},348{RAZWI_INITIATOR_ID_X_Y_LOW(9, 4), mmDCORE0_RTR7_CTRL_BASE,349GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_CTRL_RD"},350{RAZWI_INITIATOR_ID_X_Y_LOW(6, 4), mmDCORE0_RTR4_CTRL_BASE,351GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_SBTE0"},352{RAZWI_INITIATOR_ID_X_Y_LOW(6, 4), mmDCORE0_RTR4_CTRL_BASE,353GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_SBTE1"},354{RAZWI_INITIATOR_ID_X_Y_LOW(7, 4), mmDCORE0_RTR5_CTRL_BASE,355GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_SBTE2"},356{RAZWI_INITIATOR_ID_X_Y_LOW(8, 4), mmDCORE0_RTR6_CTRL_BASE,357GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_SBTE3"},358{RAZWI_INITIATOR_ID_X_Y_LOW(9, 4), mmDCORE0_RTR7_CTRL_BASE,359GAUDI2_DCORE0_ENGINE_ID_MME, "MME0_SBTE4"},360{RAZWI_INITIATOR_ID_X_Y_LOW(12, 4), mmDCORE1_RTR2_CTRL_BASE,361GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_WAP0"},362{RAZWI_INITIATOR_ID_X_Y_LOW(10, 4), mmDCORE1_RTR0_CTRL_BASE,363GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_WAP1"},364{RAZWI_INITIATOR_ID_X_Y_LOW(11, 4), mmDCORE1_RTR1_CTRL_BASE,365GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_CTRL_WR"},366{RAZWI_INITIATOR_ID_X_Y_LOW(10, 4), mmDCORE1_RTR0_CTRL_BASE,367GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_CTRL_RD"},368{RAZWI_INITIATOR_ID_X_Y_LOW(13, 4), mmDCORE1_RTR3_CTRL_BASE,369GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_SBTE0"},370{RAZWI_INITIATOR_ID_X_Y_LOW(13, 4), mmDCORE1_RTR3_CTRL_BASE,371GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_SBTE1"},372{RAZWI_INITIATOR_ID_X_Y_LOW(12, 4), mmDCORE1_RTR2_CTRL_BASE,373GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_SBTE2"},374{RAZWI_INITIATOR_ID_X_Y_LOW(11, 4), mmDCORE1_RTR1_CTRL_BASE,375GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_SBTE3"},376{RAZWI_INITIATOR_ID_X_Y_LOW(10, 4), mmDCORE1_RTR0_CTRL_BASE,377GAUDI2_DCORE1_ENGINE_ID_MME, "MME1_SBTE4"},378{RAZWI_INITIATOR_ID_X_Y_LOW(7, 11), mmDCORE2_RTR5_CTRL_BASE,379GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_WAP0"},380{RAZWI_INITIATOR_ID_X_Y_LOW(9, 11), mmDCORE2_RTR7_CTRL_BASE,381GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_WAP1"},382{RAZWI_INITIATOR_ID_X_Y_LOW(8, 11), mmDCORE2_RTR6_CTRL_BASE,383GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_CTRL_WR"},384{RAZWI_INITIATOR_ID_X_Y_LOW(9, 11), mmDCORE2_RTR7_CTRL_BASE,385GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_CTRL_RD"},386{RAZWI_INITIATOR_ID_X_Y_LOW(6, 11), mmDCORE2_RTR4_CTRL_BASE,387GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_SBTE0"},388{RAZWI_INITIATOR_ID_X_Y_LOW(6, 11), mmDCORE2_RTR4_CTRL_BASE,389GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_SBTE1"},390{RAZWI_INITIATOR_ID_X_Y_LOW(7, 11), mmDCORE2_RTR5_CTRL_BASE,391GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_SBTE2"},392{RAZWI_INITIATOR_ID_X_Y_LOW(8, 11), mmDCORE2_RTR6_CTRL_BASE,393GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_SBTE3"},394{RAZWI_INITIATOR_ID_X_Y_LOW(9, 11), mmDCORE2_RTR7_CTRL_BASE,395GAUDI2_DCORE2_ENGINE_ID_MME, "MME2_SBTE4"},396{RAZWI_INITIATOR_ID_X_Y_LOW(12, 11), mmDCORE3_RTR2_CTRL_BASE,397GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_WAP0"},398{RAZWI_INITIATOR_ID_X_Y_LOW(10, 11), mmDCORE3_RTR0_CTRL_BASE,399GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_WAP1"},400{RAZWI_INITIATOR_ID_X_Y_LOW(11, 11), mmDCORE3_RTR1_CTRL_BASE,401GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_CTRL_WR"},402{RAZWI_INITIATOR_ID_X_Y_LOW(10, 11), mmDCORE3_RTR0_CTRL_BASE,403GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_CTRL_RD"},404{RAZWI_INITIATOR_ID_X_Y_LOW(13, 11), mmDCORE3_RTR3_CTRL_BASE,405GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_SBTE0"},406{RAZWI_INITIATOR_ID_X_Y_LOW(13, 11), mmDCORE3_RTR3_CTRL_BASE,407GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_SBTE1"},408{RAZWI_INITIATOR_ID_X_Y_LOW(12, 11), mmDCORE3_RTR2_CTRL_BASE,409GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_SBTE2"},410{RAZWI_INITIATOR_ID_X_Y_LOW(11, 11), mmDCORE3_RTR1_CTRL_BASE,411GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_SBTE3"},412{RAZWI_INITIATOR_ID_X_Y_LOW(10, 11), mmDCORE3_RTR0_CTRL_BASE,413GAUDI2_DCORE3_ENGINE_ID_MME, "MME3_SBTE4"}414};415416enum hl_pmmu_fatal_cause {417LATENCY_RD_OUT_FIFO_OVERRUN,418LATENCY_WR_OUT_FIFO_OVERRUN,419};420421enum hl_pcie_drain_ind_cause {422LBW_AXI_DRAIN_IND,423HBW_AXI_DRAIN_IND424};425426static const u32 cluster_hmmu_hif_enabled_mask[GAUDI2_HBM_NUM] = {427[HBM_ID0] = 0xFFFC,428[HBM_ID1] = 0xFFCF,429[HBM_ID2] = 0xF7F7,430[HBM_ID3] = 0x7F7F,431[HBM_ID4] = 0xFCFF,432[HBM_ID5] = 0xCFFF,433};434435static const u8 xbar_edge_to_hbm_cluster[EDMA_ID_SIZE] = {436[0] = HBM_ID0,437[1] = HBM_ID1,438[2] = HBM_ID4,439[3] = HBM_ID5,440};441442static const u8 edma_to_hbm_cluster[EDMA_ID_SIZE] = {443[EDMA_ID_DCORE0_INSTANCE0] = HBM_ID0,444[EDMA_ID_DCORE0_INSTANCE1] = HBM_ID2,445[EDMA_ID_DCORE1_INSTANCE0] = HBM_ID1,446[EDMA_ID_DCORE1_INSTANCE1] = HBM_ID3,447[EDMA_ID_DCORE2_INSTANCE0] = HBM_ID2,448[EDMA_ID_DCORE2_INSTANCE1] = HBM_ID4,449[EDMA_ID_DCORE3_INSTANCE0] = HBM_ID3,450[EDMA_ID_DCORE3_INSTANCE1] = HBM_ID5,451};452453static const int gaudi2_qman_async_event_id[] = {454[GAUDI2_QUEUE_ID_PDMA_0_0] = GAUDI2_EVENT_PDMA0_QM,455[GAUDI2_QUEUE_ID_PDMA_0_1] = GAUDI2_EVENT_PDMA0_QM,456[GAUDI2_QUEUE_ID_PDMA_0_2] = GAUDI2_EVENT_PDMA0_QM,457[GAUDI2_QUEUE_ID_PDMA_0_3] = GAUDI2_EVENT_PDMA0_QM,458[GAUDI2_QUEUE_ID_PDMA_1_0] = GAUDI2_EVENT_PDMA1_QM,459[GAUDI2_QUEUE_ID_PDMA_1_1] = GAUDI2_EVENT_PDMA1_QM,460[GAUDI2_QUEUE_ID_PDMA_1_2] = GAUDI2_EVENT_PDMA1_QM,461[GAUDI2_QUEUE_ID_PDMA_1_3] = GAUDI2_EVENT_PDMA1_QM,462[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0] = GAUDI2_EVENT_HDMA0_QM,463[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_1] = GAUDI2_EVENT_HDMA0_QM,464[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_2] = GAUDI2_EVENT_HDMA0_QM,465[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3] = GAUDI2_EVENT_HDMA0_QM,466[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0] = GAUDI2_EVENT_HDMA1_QM,467[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_1] = GAUDI2_EVENT_HDMA1_QM,468[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_2] = GAUDI2_EVENT_HDMA1_QM,469[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3] = GAUDI2_EVENT_HDMA1_QM,470[GAUDI2_QUEUE_ID_DCORE0_MME_0_0] = GAUDI2_EVENT_MME0_QM,471[GAUDI2_QUEUE_ID_DCORE0_MME_0_1] = GAUDI2_EVENT_MME0_QM,472[GAUDI2_QUEUE_ID_DCORE0_MME_0_2] = GAUDI2_EVENT_MME0_QM,473[GAUDI2_QUEUE_ID_DCORE0_MME_0_3] = GAUDI2_EVENT_MME0_QM,474[GAUDI2_QUEUE_ID_DCORE0_TPC_0_0] = GAUDI2_EVENT_TPC0_QM,475[GAUDI2_QUEUE_ID_DCORE0_TPC_0_1] = GAUDI2_EVENT_TPC0_QM,476[GAUDI2_QUEUE_ID_DCORE0_TPC_0_2] = GAUDI2_EVENT_TPC0_QM,477[GAUDI2_QUEUE_ID_DCORE0_TPC_0_3] = GAUDI2_EVENT_TPC0_QM,478[GAUDI2_QUEUE_ID_DCORE0_TPC_1_0] = GAUDI2_EVENT_TPC1_QM,479[GAUDI2_QUEUE_ID_DCORE0_TPC_1_1] = GAUDI2_EVENT_TPC1_QM,480[GAUDI2_QUEUE_ID_DCORE0_TPC_1_2] = GAUDI2_EVENT_TPC1_QM,481[GAUDI2_QUEUE_ID_DCORE0_TPC_1_3] = GAUDI2_EVENT_TPC1_QM,482[GAUDI2_QUEUE_ID_DCORE0_TPC_2_0] = GAUDI2_EVENT_TPC2_QM,483[GAUDI2_QUEUE_ID_DCORE0_TPC_2_1] = GAUDI2_EVENT_TPC2_QM,484[GAUDI2_QUEUE_ID_DCORE0_TPC_2_2] = GAUDI2_EVENT_TPC2_QM,485[GAUDI2_QUEUE_ID_DCORE0_TPC_2_3] = GAUDI2_EVENT_TPC2_QM,486[GAUDI2_QUEUE_ID_DCORE0_TPC_3_0] = GAUDI2_EVENT_TPC3_QM,487[GAUDI2_QUEUE_ID_DCORE0_TPC_3_1] = GAUDI2_EVENT_TPC3_QM,488[GAUDI2_QUEUE_ID_DCORE0_TPC_3_2] = GAUDI2_EVENT_TPC3_QM,489[GAUDI2_QUEUE_ID_DCORE0_TPC_3_3] = GAUDI2_EVENT_TPC3_QM,490[GAUDI2_QUEUE_ID_DCORE0_TPC_4_0] = GAUDI2_EVENT_TPC4_QM,491[GAUDI2_QUEUE_ID_DCORE0_TPC_4_1] = GAUDI2_EVENT_TPC4_QM,492[GAUDI2_QUEUE_ID_DCORE0_TPC_4_2] = GAUDI2_EVENT_TPC4_QM,493[GAUDI2_QUEUE_ID_DCORE0_TPC_4_3] = GAUDI2_EVENT_TPC4_QM,494[GAUDI2_QUEUE_ID_DCORE0_TPC_5_0] = GAUDI2_EVENT_TPC5_QM,495[GAUDI2_QUEUE_ID_DCORE0_TPC_5_1] = GAUDI2_EVENT_TPC5_QM,496[GAUDI2_QUEUE_ID_DCORE0_TPC_5_2] = GAUDI2_EVENT_TPC5_QM,497[GAUDI2_QUEUE_ID_DCORE0_TPC_5_3] = GAUDI2_EVENT_TPC5_QM,498[GAUDI2_QUEUE_ID_DCORE0_TPC_6_0] = GAUDI2_EVENT_TPC24_QM,499[GAUDI2_QUEUE_ID_DCORE0_TPC_6_1] = GAUDI2_EVENT_TPC24_QM,500[GAUDI2_QUEUE_ID_DCORE0_TPC_6_2] = GAUDI2_EVENT_TPC24_QM,501[GAUDI2_QUEUE_ID_DCORE0_TPC_6_3] = GAUDI2_EVENT_TPC24_QM,502[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0] = GAUDI2_EVENT_HDMA2_QM,503[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_1] = GAUDI2_EVENT_HDMA2_QM,504[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_2] = GAUDI2_EVENT_HDMA2_QM,505[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3] = GAUDI2_EVENT_HDMA2_QM,506[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0] = GAUDI2_EVENT_HDMA3_QM,507[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_1] = GAUDI2_EVENT_HDMA3_QM,508[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_2] = GAUDI2_EVENT_HDMA3_QM,509[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3] = GAUDI2_EVENT_HDMA3_QM,510[GAUDI2_QUEUE_ID_DCORE1_MME_0_0] = GAUDI2_EVENT_MME1_QM,511[GAUDI2_QUEUE_ID_DCORE1_MME_0_1] = GAUDI2_EVENT_MME1_QM,512[GAUDI2_QUEUE_ID_DCORE1_MME_0_2] = GAUDI2_EVENT_MME1_QM,513[GAUDI2_QUEUE_ID_DCORE1_MME_0_3] = GAUDI2_EVENT_MME1_QM,514[GAUDI2_QUEUE_ID_DCORE1_TPC_0_0] = GAUDI2_EVENT_TPC6_QM,515[GAUDI2_QUEUE_ID_DCORE1_TPC_0_1] = GAUDI2_EVENT_TPC6_QM,516[GAUDI2_QUEUE_ID_DCORE1_TPC_0_2] = GAUDI2_EVENT_TPC6_QM,517[GAUDI2_QUEUE_ID_DCORE1_TPC_0_3] = GAUDI2_EVENT_TPC6_QM,518[GAUDI2_QUEUE_ID_DCORE1_TPC_1_0] = GAUDI2_EVENT_TPC7_QM,519[GAUDI2_QUEUE_ID_DCORE1_TPC_1_1] = GAUDI2_EVENT_TPC7_QM,520[GAUDI2_QUEUE_ID_DCORE1_TPC_1_2] = GAUDI2_EVENT_TPC7_QM,521[GAUDI2_QUEUE_ID_DCORE1_TPC_1_3] = GAUDI2_EVENT_TPC7_QM,522[GAUDI2_QUEUE_ID_DCORE1_TPC_2_0] = GAUDI2_EVENT_TPC8_QM,523[GAUDI2_QUEUE_ID_DCORE1_TPC_2_1] = GAUDI2_EVENT_TPC8_QM,524[GAUDI2_QUEUE_ID_DCORE1_TPC_2_2] = GAUDI2_EVENT_TPC8_QM,525[GAUDI2_QUEUE_ID_DCORE1_TPC_2_3] = GAUDI2_EVENT_TPC8_QM,526[GAUDI2_QUEUE_ID_DCORE1_TPC_3_0] = GAUDI2_EVENT_TPC9_QM,527[GAUDI2_QUEUE_ID_DCORE1_TPC_3_1] = GAUDI2_EVENT_TPC9_QM,528[GAUDI2_QUEUE_ID_DCORE1_TPC_3_2] = GAUDI2_EVENT_TPC9_QM,529[GAUDI2_QUEUE_ID_DCORE1_TPC_3_3] = GAUDI2_EVENT_TPC9_QM,530[GAUDI2_QUEUE_ID_DCORE1_TPC_4_0] = GAUDI2_EVENT_TPC10_QM,531[GAUDI2_QUEUE_ID_DCORE1_TPC_4_1] = GAUDI2_EVENT_TPC10_QM,532[GAUDI2_QUEUE_ID_DCORE1_TPC_4_2] = GAUDI2_EVENT_TPC10_QM,533[GAUDI2_QUEUE_ID_DCORE1_TPC_4_3] = GAUDI2_EVENT_TPC10_QM,534[GAUDI2_QUEUE_ID_DCORE1_TPC_5_0] = GAUDI2_EVENT_TPC11_QM,535[GAUDI2_QUEUE_ID_DCORE1_TPC_5_1] = GAUDI2_EVENT_TPC11_QM,536[GAUDI2_QUEUE_ID_DCORE1_TPC_5_2] = GAUDI2_EVENT_TPC11_QM,537[GAUDI2_QUEUE_ID_DCORE1_TPC_5_3] = GAUDI2_EVENT_TPC11_QM,538[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0] = GAUDI2_EVENT_HDMA4_QM,539[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_1] = GAUDI2_EVENT_HDMA4_QM,540[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_2] = GAUDI2_EVENT_HDMA4_QM,541[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3] = GAUDI2_EVENT_HDMA4_QM,542[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0] = GAUDI2_EVENT_HDMA5_QM,543[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_1] = GAUDI2_EVENT_HDMA5_QM,544[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_2] = GAUDI2_EVENT_HDMA5_QM,545[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3] = GAUDI2_EVENT_HDMA5_QM,546[GAUDI2_QUEUE_ID_DCORE2_MME_0_0] = GAUDI2_EVENT_MME2_QM,547[GAUDI2_QUEUE_ID_DCORE2_MME_0_1] = GAUDI2_EVENT_MME2_QM,548[GAUDI2_QUEUE_ID_DCORE2_MME_0_2] = GAUDI2_EVENT_MME2_QM,549[GAUDI2_QUEUE_ID_DCORE2_MME_0_3] = GAUDI2_EVENT_MME2_QM,550[GAUDI2_QUEUE_ID_DCORE2_TPC_0_0] = GAUDI2_EVENT_TPC12_QM,551[GAUDI2_QUEUE_ID_DCORE2_TPC_0_1] = GAUDI2_EVENT_TPC12_QM,552[GAUDI2_QUEUE_ID_DCORE2_TPC_0_2] = GAUDI2_EVENT_TPC12_QM,553[GAUDI2_QUEUE_ID_DCORE2_TPC_0_3] = GAUDI2_EVENT_TPC12_QM,554[GAUDI2_QUEUE_ID_DCORE2_TPC_1_0] = GAUDI2_EVENT_TPC13_QM,555[GAUDI2_QUEUE_ID_DCORE2_TPC_1_1] = GAUDI2_EVENT_TPC13_QM,556[GAUDI2_QUEUE_ID_DCORE2_TPC_1_2] = GAUDI2_EVENT_TPC13_QM,557[GAUDI2_QUEUE_ID_DCORE2_TPC_1_3] = GAUDI2_EVENT_TPC13_QM,558[GAUDI2_QUEUE_ID_DCORE2_TPC_2_0] = GAUDI2_EVENT_TPC14_QM,559[GAUDI2_QUEUE_ID_DCORE2_TPC_2_1] = GAUDI2_EVENT_TPC14_QM,560[GAUDI2_QUEUE_ID_DCORE2_TPC_2_2] = GAUDI2_EVENT_TPC14_QM,561[GAUDI2_QUEUE_ID_DCORE2_TPC_2_3] = GAUDI2_EVENT_TPC14_QM,562[GAUDI2_QUEUE_ID_DCORE2_TPC_3_0] = GAUDI2_EVENT_TPC15_QM,563[GAUDI2_QUEUE_ID_DCORE2_TPC_3_1] = GAUDI2_EVENT_TPC15_QM,564[GAUDI2_QUEUE_ID_DCORE2_TPC_3_2] = GAUDI2_EVENT_TPC15_QM,565[GAUDI2_QUEUE_ID_DCORE2_TPC_3_3] = GAUDI2_EVENT_TPC15_QM,566[GAUDI2_QUEUE_ID_DCORE2_TPC_4_0] = GAUDI2_EVENT_TPC16_QM,567[GAUDI2_QUEUE_ID_DCORE2_TPC_4_1] = GAUDI2_EVENT_TPC16_QM,568[GAUDI2_QUEUE_ID_DCORE2_TPC_4_2] = GAUDI2_EVENT_TPC16_QM,569[GAUDI2_QUEUE_ID_DCORE2_TPC_4_3] = GAUDI2_EVENT_TPC16_QM,570[GAUDI2_QUEUE_ID_DCORE2_TPC_5_0] = GAUDI2_EVENT_TPC17_QM,571[GAUDI2_QUEUE_ID_DCORE2_TPC_5_1] = GAUDI2_EVENT_TPC17_QM,572[GAUDI2_QUEUE_ID_DCORE2_TPC_5_2] = GAUDI2_EVENT_TPC17_QM,573[GAUDI2_QUEUE_ID_DCORE2_TPC_5_3] = GAUDI2_EVENT_TPC17_QM,574[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0] = GAUDI2_EVENT_HDMA6_QM,575[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_1] = GAUDI2_EVENT_HDMA6_QM,576[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_2] = GAUDI2_EVENT_HDMA6_QM,577[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3] = GAUDI2_EVENT_HDMA6_QM,578[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0] = GAUDI2_EVENT_HDMA7_QM,579[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1] = GAUDI2_EVENT_HDMA7_QM,580[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2] = GAUDI2_EVENT_HDMA7_QM,581[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3] = GAUDI2_EVENT_HDMA7_QM,582[GAUDI2_QUEUE_ID_DCORE3_MME_0_0] = GAUDI2_EVENT_MME3_QM,583[GAUDI2_QUEUE_ID_DCORE3_MME_0_1] = GAUDI2_EVENT_MME3_QM,584[GAUDI2_QUEUE_ID_DCORE3_MME_0_2] = GAUDI2_EVENT_MME3_QM,585[GAUDI2_QUEUE_ID_DCORE3_MME_0_3] = GAUDI2_EVENT_MME3_QM,586[GAUDI2_QUEUE_ID_DCORE3_TPC_0_0] = GAUDI2_EVENT_TPC18_QM,587[GAUDI2_QUEUE_ID_DCORE3_TPC_0_1] = GAUDI2_EVENT_TPC18_QM,588[GAUDI2_QUEUE_ID_DCORE3_TPC_0_2] = GAUDI2_EVENT_TPC18_QM,589[GAUDI2_QUEUE_ID_DCORE3_TPC_0_3] = GAUDI2_EVENT_TPC18_QM,590[GAUDI2_QUEUE_ID_DCORE3_TPC_1_0] = GAUDI2_EVENT_TPC19_QM,591[GAUDI2_QUEUE_ID_DCORE3_TPC_1_1] = GAUDI2_EVENT_TPC19_QM,592[GAUDI2_QUEUE_ID_DCORE3_TPC_1_2] = GAUDI2_EVENT_TPC19_QM,593[GAUDI2_QUEUE_ID_DCORE3_TPC_1_3] = GAUDI2_EVENT_TPC19_QM,594[GAUDI2_QUEUE_ID_DCORE3_TPC_2_0] = GAUDI2_EVENT_TPC20_QM,595[GAUDI2_QUEUE_ID_DCORE3_TPC_2_1] = GAUDI2_EVENT_TPC20_QM,596[GAUDI2_QUEUE_ID_DCORE3_TPC_2_2] = GAUDI2_EVENT_TPC20_QM,597[GAUDI2_QUEUE_ID_DCORE3_TPC_2_3] = GAUDI2_EVENT_TPC20_QM,598[GAUDI2_QUEUE_ID_DCORE3_TPC_3_0] = GAUDI2_EVENT_TPC21_QM,599[GAUDI2_QUEUE_ID_DCORE3_TPC_3_1] = GAUDI2_EVENT_TPC21_QM,600[GAUDI2_QUEUE_ID_DCORE3_TPC_3_2] = GAUDI2_EVENT_TPC21_QM,601[GAUDI2_QUEUE_ID_DCORE3_TPC_3_3] = GAUDI2_EVENT_TPC21_QM,602[GAUDI2_QUEUE_ID_DCORE3_TPC_4_0] = GAUDI2_EVENT_TPC22_QM,603[GAUDI2_QUEUE_ID_DCORE3_TPC_4_1] = GAUDI2_EVENT_TPC22_QM,604[GAUDI2_QUEUE_ID_DCORE3_TPC_4_2] = GAUDI2_EVENT_TPC22_QM,605[GAUDI2_QUEUE_ID_DCORE3_TPC_4_3] = GAUDI2_EVENT_TPC22_QM,606[GAUDI2_QUEUE_ID_DCORE3_TPC_5_0] = GAUDI2_EVENT_TPC23_QM,607[GAUDI2_QUEUE_ID_DCORE3_TPC_5_1] = GAUDI2_EVENT_TPC23_QM,608[GAUDI2_QUEUE_ID_DCORE3_TPC_5_2] = GAUDI2_EVENT_TPC23_QM,609[GAUDI2_QUEUE_ID_DCORE3_TPC_5_3] = GAUDI2_EVENT_TPC23_QM,610[GAUDI2_QUEUE_ID_NIC_0_0] = GAUDI2_EVENT_NIC0_QM0,611[GAUDI2_QUEUE_ID_NIC_0_1] = GAUDI2_EVENT_NIC0_QM0,612[GAUDI2_QUEUE_ID_NIC_0_2] = GAUDI2_EVENT_NIC0_QM0,613[GAUDI2_QUEUE_ID_NIC_0_3] = GAUDI2_EVENT_NIC0_QM0,614[GAUDI2_QUEUE_ID_NIC_1_0] = GAUDI2_EVENT_NIC0_QM1,615[GAUDI2_QUEUE_ID_NIC_1_1] = GAUDI2_EVENT_NIC0_QM1,616[GAUDI2_QUEUE_ID_NIC_1_2] = GAUDI2_EVENT_NIC0_QM1,617[GAUDI2_QUEUE_ID_NIC_1_3] = GAUDI2_EVENT_NIC0_QM1,618[GAUDI2_QUEUE_ID_NIC_2_0] = GAUDI2_EVENT_NIC1_QM0,619[GAUDI2_QUEUE_ID_NIC_2_1] = GAUDI2_EVENT_NIC1_QM0,620[GAUDI2_QUEUE_ID_NIC_2_2] = GAUDI2_EVENT_NIC1_QM0,621[GAUDI2_QUEUE_ID_NIC_2_3] = GAUDI2_EVENT_NIC1_QM0,622[GAUDI2_QUEUE_ID_NIC_3_0] = GAUDI2_EVENT_NIC1_QM1,623[GAUDI2_QUEUE_ID_NIC_3_1] = GAUDI2_EVENT_NIC1_QM1,624[GAUDI2_QUEUE_ID_NIC_3_2] = GAUDI2_EVENT_NIC1_QM1,625[GAUDI2_QUEUE_ID_NIC_3_3] = GAUDI2_EVENT_NIC1_QM1,626[GAUDI2_QUEUE_ID_NIC_4_0] = GAUDI2_EVENT_NIC2_QM0,627[GAUDI2_QUEUE_ID_NIC_4_1] = GAUDI2_EVENT_NIC2_QM0,628[GAUDI2_QUEUE_ID_NIC_4_2] = GAUDI2_EVENT_NIC2_QM0,629[GAUDI2_QUEUE_ID_NIC_4_3] = GAUDI2_EVENT_NIC2_QM0,630[GAUDI2_QUEUE_ID_NIC_5_0] = GAUDI2_EVENT_NIC2_QM1,631[GAUDI2_QUEUE_ID_NIC_5_1] = GAUDI2_EVENT_NIC2_QM1,632[GAUDI2_QUEUE_ID_NIC_5_2] = GAUDI2_EVENT_NIC2_QM1,633[GAUDI2_QUEUE_ID_NIC_5_3] = GAUDI2_EVENT_NIC2_QM1,634[GAUDI2_QUEUE_ID_NIC_6_0] = GAUDI2_EVENT_NIC3_QM0,635[GAUDI2_QUEUE_ID_NIC_6_1] = GAUDI2_EVENT_NIC3_QM0,636[GAUDI2_QUEUE_ID_NIC_6_2] = GAUDI2_EVENT_NIC3_QM0,637[GAUDI2_QUEUE_ID_NIC_6_3] = GAUDI2_EVENT_NIC3_QM0,638[GAUDI2_QUEUE_ID_NIC_7_0] = GAUDI2_EVENT_NIC3_QM1,639[GAUDI2_QUEUE_ID_NIC_7_1] = GAUDI2_EVENT_NIC3_QM1,640[GAUDI2_QUEUE_ID_NIC_7_2] = GAUDI2_EVENT_NIC3_QM1,641[GAUDI2_QUEUE_ID_NIC_7_3] = GAUDI2_EVENT_NIC3_QM1,642[GAUDI2_QUEUE_ID_NIC_8_0] = GAUDI2_EVENT_NIC4_QM0,643[GAUDI2_QUEUE_ID_NIC_8_1] = GAUDI2_EVENT_NIC4_QM0,644[GAUDI2_QUEUE_ID_NIC_8_2] = GAUDI2_EVENT_NIC4_QM0,645[GAUDI2_QUEUE_ID_NIC_8_3] = GAUDI2_EVENT_NIC4_QM0,646[GAUDI2_QUEUE_ID_NIC_9_0] = GAUDI2_EVENT_NIC4_QM1,647[GAUDI2_QUEUE_ID_NIC_9_1] = GAUDI2_EVENT_NIC4_QM1,648[GAUDI2_QUEUE_ID_NIC_9_2] = GAUDI2_EVENT_NIC4_QM1,649[GAUDI2_QUEUE_ID_NIC_9_3] = GAUDI2_EVENT_NIC4_QM1,650[GAUDI2_QUEUE_ID_NIC_10_0] = GAUDI2_EVENT_NIC5_QM0,651[GAUDI2_QUEUE_ID_NIC_10_1] = GAUDI2_EVENT_NIC5_QM0,652[GAUDI2_QUEUE_ID_NIC_10_2] = GAUDI2_EVENT_NIC5_QM0,653[GAUDI2_QUEUE_ID_NIC_10_3] = GAUDI2_EVENT_NIC5_QM0,654[GAUDI2_QUEUE_ID_NIC_11_0] = GAUDI2_EVENT_NIC5_QM1,655[GAUDI2_QUEUE_ID_NIC_11_1] = GAUDI2_EVENT_NIC5_QM1,656[GAUDI2_QUEUE_ID_NIC_11_2] = GAUDI2_EVENT_NIC5_QM1,657[GAUDI2_QUEUE_ID_NIC_11_3] = GAUDI2_EVENT_NIC5_QM1,658[GAUDI2_QUEUE_ID_NIC_12_0] = GAUDI2_EVENT_NIC6_QM0,659[GAUDI2_QUEUE_ID_NIC_12_1] = GAUDI2_EVENT_NIC6_QM0,660[GAUDI2_QUEUE_ID_NIC_12_2] = GAUDI2_EVENT_NIC6_QM0,661[GAUDI2_QUEUE_ID_NIC_12_3] = GAUDI2_EVENT_NIC6_QM0,662[GAUDI2_QUEUE_ID_NIC_13_0] = GAUDI2_EVENT_NIC6_QM1,663[GAUDI2_QUEUE_ID_NIC_13_1] = GAUDI2_EVENT_NIC6_QM1,664[GAUDI2_QUEUE_ID_NIC_13_2] = GAUDI2_EVENT_NIC6_QM1,665[GAUDI2_QUEUE_ID_NIC_13_3] = GAUDI2_EVENT_NIC6_QM1,666[GAUDI2_QUEUE_ID_NIC_14_0] = GAUDI2_EVENT_NIC7_QM0,667[GAUDI2_QUEUE_ID_NIC_14_1] = GAUDI2_EVENT_NIC7_QM0,668[GAUDI2_QUEUE_ID_NIC_14_2] = GAUDI2_EVENT_NIC7_QM0,669[GAUDI2_QUEUE_ID_NIC_14_3] = GAUDI2_EVENT_NIC7_QM0,670[GAUDI2_QUEUE_ID_NIC_15_0] = GAUDI2_EVENT_NIC7_QM1,671[GAUDI2_QUEUE_ID_NIC_15_1] = GAUDI2_EVENT_NIC7_QM1,672[GAUDI2_QUEUE_ID_NIC_15_2] = GAUDI2_EVENT_NIC7_QM1,673[GAUDI2_QUEUE_ID_NIC_15_3] = GAUDI2_EVENT_NIC7_QM1,674[GAUDI2_QUEUE_ID_NIC_16_0] = GAUDI2_EVENT_NIC8_QM0,675[GAUDI2_QUEUE_ID_NIC_16_1] = GAUDI2_EVENT_NIC8_QM0,676[GAUDI2_QUEUE_ID_NIC_16_2] = GAUDI2_EVENT_NIC8_QM0,677[GAUDI2_QUEUE_ID_NIC_16_3] = GAUDI2_EVENT_NIC8_QM0,678[GAUDI2_QUEUE_ID_NIC_17_0] = GAUDI2_EVENT_NIC8_QM1,679[GAUDI2_QUEUE_ID_NIC_17_1] = GAUDI2_EVENT_NIC8_QM1,680[GAUDI2_QUEUE_ID_NIC_17_2] = GAUDI2_EVENT_NIC8_QM1,681[GAUDI2_QUEUE_ID_NIC_17_3] = GAUDI2_EVENT_NIC8_QM1,682[GAUDI2_QUEUE_ID_NIC_18_0] = GAUDI2_EVENT_NIC9_QM0,683[GAUDI2_QUEUE_ID_NIC_18_1] = GAUDI2_EVENT_NIC9_QM0,684[GAUDI2_QUEUE_ID_NIC_18_2] = GAUDI2_EVENT_NIC9_QM0,685[GAUDI2_QUEUE_ID_NIC_18_3] = GAUDI2_EVENT_NIC9_QM0,686[GAUDI2_QUEUE_ID_NIC_19_0] = GAUDI2_EVENT_NIC9_QM1,687[GAUDI2_QUEUE_ID_NIC_19_1] = GAUDI2_EVENT_NIC9_QM1,688[GAUDI2_QUEUE_ID_NIC_19_2] = GAUDI2_EVENT_NIC9_QM1,689[GAUDI2_QUEUE_ID_NIC_19_3] = GAUDI2_EVENT_NIC9_QM1,690[GAUDI2_QUEUE_ID_NIC_20_0] = GAUDI2_EVENT_NIC10_QM0,691[GAUDI2_QUEUE_ID_NIC_20_1] = GAUDI2_EVENT_NIC10_QM0,692[GAUDI2_QUEUE_ID_NIC_20_2] = GAUDI2_EVENT_NIC10_QM0,693[GAUDI2_QUEUE_ID_NIC_20_3] = GAUDI2_EVENT_NIC10_QM0,694[GAUDI2_QUEUE_ID_NIC_21_0] = GAUDI2_EVENT_NIC10_QM1,695[GAUDI2_QUEUE_ID_NIC_21_1] = GAUDI2_EVENT_NIC10_QM1,696[GAUDI2_QUEUE_ID_NIC_21_2] = GAUDI2_EVENT_NIC10_QM1,697[GAUDI2_QUEUE_ID_NIC_21_3] = GAUDI2_EVENT_NIC10_QM1,698[GAUDI2_QUEUE_ID_NIC_22_0] = GAUDI2_EVENT_NIC11_QM0,699[GAUDI2_QUEUE_ID_NIC_22_1] = GAUDI2_EVENT_NIC11_QM0,700[GAUDI2_QUEUE_ID_NIC_22_2] = GAUDI2_EVENT_NIC11_QM0,701[GAUDI2_QUEUE_ID_NIC_22_3] = GAUDI2_EVENT_NIC11_QM0,702[GAUDI2_QUEUE_ID_NIC_23_0] = GAUDI2_EVENT_NIC11_QM1,703[GAUDI2_QUEUE_ID_NIC_23_1] = GAUDI2_EVENT_NIC11_QM1,704[GAUDI2_QUEUE_ID_NIC_23_2] = GAUDI2_EVENT_NIC11_QM1,705[GAUDI2_QUEUE_ID_NIC_23_3] = GAUDI2_EVENT_NIC11_QM1,706[GAUDI2_QUEUE_ID_ROT_0_0] = GAUDI2_EVENT_ROTATOR0_ROT0_QM,707[GAUDI2_QUEUE_ID_ROT_0_1] = GAUDI2_EVENT_ROTATOR0_ROT0_QM,708[GAUDI2_QUEUE_ID_ROT_0_2] = GAUDI2_EVENT_ROTATOR0_ROT0_QM,709[GAUDI2_QUEUE_ID_ROT_0_3] = GAUDI2_EVENT_ROTATOR0_ROT0_QM,710[GAUDI2_QUEUE_ID_ROT_1_0] = GAUDI2_EVENT_ROTATOR1_ROT1_QM,711[GAUDI2_QUEUE_ID_ROT_1_1] = GAUDI2_EVENT_ROTATOR1_ROT1_QM,712[GAUDI2_QUEUE_ID_ROT_1_2] = GAUDI2_EVENT_ROTATOR1_ROT1_QM,713[GAUDI2_QUEUE_ID_ROT_1_3] = GAUDI2_EVENT_ROTATOR1_ROT1_QM714};715716static const int gaudi2_dma_core_async_event_id[] = {717[DMA_CORE_ID_EDMA0] = GAUDI2_EVENT_HDMA0_CORE,718[DMA_CORE_ID_EDMA1] = GAUDI2_EVENT_HDMA1_CORE,719[DMA_CORE_ID_EDMA2] = GAUDI2_EVENT_HDMA2_CORE,720[DMA_CORE_ID_EDMA3] = GAUDI2_EVENT_HDMA3_CORE,721[DMA_CORE_ID_EDMA4] = GAUDI2_EVENT_HDMA4_CORE,722[DMA_CORE_ID_EDMA5] = GAUDI2_EVENT_HDMA5_CORE,723[DMA_CORE_ID_EDMA6] = GAUDI2_EVENT_HDMA6_CORE,724[DMA_CORE_ID_EDMA7] = GAUDI2_EVENT_HDMA7_CORE,725[DMA_CORE_ID_PDMA0] = GAUDI2_EVENT_PDMA0_CORE,726[DMA_CORE_ID_PDMA1] = GAUDI2_EVENT_PDMA1_CORE,727[DMA_CORE_ID_KDMA] = GAUDI2_EVENT_KDMA0_CORE,728};729730const char *gaudi2_engine_id_str[] = {731__stringify(GAUDI2_DCORE0_ENGINE_ID_EDMA_0),732__stringify(GAUDI2_DCORE0_ENGINE_ID_EDMA_1),733__stringify(GAUDI2_DCORE0_ENGINE_ID_MME),734__stringify(GAUDI2_DCORE0_ENGINE_ID_TPC_0),735__stringify(GAUDI2_DCORE0_ENGINE_ID_TPC_1),736__stringify(GAUDI2_DCORE0_ENGINE_ID_TPC_2),737__stringify(GAUDI2_DCORE0_ENGINE_ID_TPC_3),738__stringify(GAUDI2_DCORE0_ENGINE_ID_TPC_4),739__stringify(GAUDI2_DCORE0_ENGINE_ID_TPC_5),740__stringify(GAUDI2_DCORE0_ENGINE_ID_DEC_0),741__stringify(GAUDI2_DCORE0_ENGINE_ID_DEC_1),742__stringify(GAUDI2_DCORE1_ENGINE_ID_EDMA_0),743__stringify(GAUDI2_DCORE1_ENGINE_ID_EDMA_1),744__stringify(GAUDI2_DCORE1_ENGINE_ID_MME),745__stringify(GAUDI2_DCORE1_ENGINE_ID_TPC_0),746__stringify(GAUDI2_DCORE1_ENGINE_ID_TPC_1),747__stringify(GAUDI2_DCORE1_ENGINE_ID_TPC_2),748__stringify(GAUDI2_DCORE1_ENGINE_ID_TPC_3),749__stringify(GAUDI2_DCORE1_ENGINE_ID_TPC_4),750__stringify(GAUDI2_DCORE1_ENGINE_ID_TPC_5),751__stringify(GAUDI2_DCORE1_ENGINE_ID_DEC_0),752__stringify(GAUDI2_DCORE1_ENGINE_ID_DEC_1),753__stringify(GAUDI2_DCORE2_ENGINE_ID_EDMA_0),754__stringify(GAUDI2_DCORE2_ENGINE_ID_EDMA_1),755__stringify(GAUDI2_DCORE2_ENGINE_ID_MME),756__stringify(GAUDI2_DCORE2_ENGINE_ID_TPC_0),757__stringify(GAUDI2_DCORE2_ENGINE_ID_TPC_1),758__stringify(GAUDI2_DCORE2_ENGINE_ID_TPC_2),759__stringify(GAUDI2_DCORE2_ENGINE_ID_TPC_3),760__stringify(GAUDI2_DCORE2_ENGINE_ID_TPC_4),761__stringify(GAUDI2_DCORE2_ENGINE_ID_TPC_5),762__stringify(GAUDI2_DCORE2_ENGINE_ID_DEC_0),763__stringify(GAUDI2_DCORE2_ENGINE_ID_DEC_1),764__stringify(GAUDI2_DCORE3_ENGINE_ID_EDMA_0),765__stringify(GAUDI2_DCORE3_ENGINE_ID_EDMA_1),766__stringify(GAUDI2_DCORE3_ENGINE_ID_MME),767__stringify(GAUDI2_DCORE3_ENGINE_ID_TPC_0),768__stringify(GAUDI2_DCORE3_ENGINE_ID_TPC_1),769__stringify(GAUDI2_DCORE3_ENGINE_ID_TPC_2),770__stringify(GAUDI2_DCORE3_ENGINE_ID_TPC_3),771__stringify(GAUDI2_DCORE3_ENGINE_ID_TPC_4),772__stringify(GAUDI2_DCORE3_ENGINE_ID_TPC_5),773__stringify(GAUDI2_DCORE3_ENGINE_ID_DEC_0),774__stringify(GAUDI2_DCORE3_ENGINE_ID_DEC_1),775__stringify(GAUDI2_DCORE0_ENGINE_ID_TPC_6),776__stringify(GAUDI2_ENGINE_ID_PDMA_0),777__stringify(GAUDI2_ENGINE_ID_PDMA_1),778__stringify(GAUDI2_ENGINE_ID_ROT_0),779__stringify(GAUDI2_ENGINE_ID_ROT_1),780__stringify(GAUDI2_PCIE_ENGINE_ID_DEC_0),781__stringify(GAUDI2_PCIE_ENGINE_ID_DEC_1),782__stringify(GAUDI2_ENGINE_ID_NIC0_0),783__stringify(GAUDI2_ENGINE_ID_NIC0_1),784__stringify(GAUDI2_ENGINE_ID_NIC1_0),785__stringify(GAUDI2_ENGINE_ID_NIC1_1),786__stringify(GAUDI2_ENGINE_ID_NIC2_0),787__stringify(GAUDI2_ENGINE_ID_NIC2_1),788__stringify(GAUDI2_ENGINE_ID_NIC3_0),789__stringify(GAUDI2_ENGINE_ID_NIC3_1),790__stringify(GAUDI2_ENGINE_ID_NIC4_0),791__stringify(GAUDI2_ENGINE_ID_NIC4_1),792__stringify(GAUDI2_ENGINE_ID_NIC5_0),793__stringify(GAUDI2_ENGINE_ID_NIC5_1),794__stringify(GAUDI2_ENGINE_ID_NIC6_0),795__stringify(GAUDI2_ENGINE_ID_NIC6_1),796__stringify(GAUDI2_ENGINE_ID_NIC7_0),797__stringify(GAUDI2_ENGINE_ID_NIC7_1),798__stringify(GAUDI2_ENGINE_ID_NIC8_0),799__stringify(GAUDI2_ENGINE_ID_NIC8_1),800__stringify(GAUDI2_ENGINE_ID_NIC9_0),801__stringify(GAUDI2_ENGINE_ID_NIC9_1),802__stringify(GAUDI2_ENGINE_ID_NIC10_0),803__stringify(GAUDI2_ENGINE_ID_NIC10_1),804__stringify(GAUDI2_ENGINE_ID_NIC11_0),805__stringify(GAUDI2_ENGINE_ID_NIC11_1),806__stringify(GAUDI2_ENGINE_ID_PCIE),807__stringify(GAUDI2_ENGINE_ID_PSOC),808__stringify(GAUDI2_ENGINE_ID_ARC_FARM),809__stringify(GAUDI2_ENGINE_ID_KDMA),810__stringify(GAUDI2_ENGINE_ID_SIZE),811};812813const char *gaudi2_queue_id_str[] = {814__stringify(GAUDI2_QUEUE_ID_PDMA_0_0),815__stringify(GAUDI2_QUEUE_ID_PDMA_0_1),816__stringify(GAUDI2_QUEUE_ID_PDMA_0_2),817__stringify(GAUDI2_QUEUE_ID_PDMA_0_3),818__stringify(GAUDI2_QUEUE_ID_PDMA_1_0),819__stringify(GAUDI2_QUEUE_ID_PDMA_1_1),820__stringify(GAUDI2_QUEUE_ID_PDMA_1_2),821__stringify(GAUDI2_QUEUE_ID_PDMA_1_3),822__stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0),823__stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_0_1),824__stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_0_2),825__stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3),826__stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0),827__stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_1_1),828__stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_1_2),829__stringify(GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3),830__stringify(GAUDI2_QUEUE_ID_DCORE0_MME_0_0),831__stringify(GAUDI2_QUEUE_ID_DCORE0_MME_0_1),832__stringify(GAUDI2_QUEUE_ID_DCORE0_MME_0_2),833__stringify(GAUDI2_QUEUE_ID_DCORE0_MME_0_3),834__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_0_0),835__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_0_1),836__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_0_2),837__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_0_3),838__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_1_0),839__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_1_1),840__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_1_2),841__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_1_3),842__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_2_0),843__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_2_1),844__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_2_2),845__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_2_3),846__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_3_0),847__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_3_1),848__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_3_2),849__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_3_3),850__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_4_0),851__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_4_1),852__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_4_2),853__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_4_3),854__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_5_0),855__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_5_1),856__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_5_2),857__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_5_3),858__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_6_0),859__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_6_1),860__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_6_2),861__stringify(GAUDI2_QUEUE_ID_DCORE0_TPC_6_3),862__stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0),863__stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_0_1),864__stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_0_2),865__stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3),866__stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0),867__stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_1_1),868__stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_1_2),869__stringify(GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3),870__stringify(GAUDI2_QUEUE_ID_DCORE1_MME_0_0),871__stringify(GAUDI2_QUEUE_ID_DCORE1_MME_0_1),872__stringify(GAUDI2_QUEUE_ID_DCORE1_MME_0_2),873__stringify(GAUDI2_QUEUE_ID_DCORE1_MME_0_3),874__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_0_0),875__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_0_1),876__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_0_2),877__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_0_3),878__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_1_0),879__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_1_1),880__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_1_2),881__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_1_3),882__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_2_0),883__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_2_1),884__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_2_2),885__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_2_3),886__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_3_0),887__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_3_1),888__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_3_2),889__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_3_3),890__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_4_0),891__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_4_1),892__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_4_2),893__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_4_3),894__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_5_0),895__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_5_1),896__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_5_2),897__stringify(GAUDI2_QUEUE_ID_DCORE1_TPC_5_3),898__stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0),899__stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_0_1),900__stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_0_2),901__stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3),902__stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0),903__stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_1_1),904__stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_1_2),905__stringify(GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3),906__stringify(GAUDI2_QUEUE_ID_DCORE2_MME_0_0),907__stringify(GAUDI2_QUEUE_ID_DCORE2_MME_0_1),908__stringify(GAUDI2_QUEUE_ID_DCORE2_MME_0_2),909__stringify(GAUDI2_QUEUE_ID_DCORE2_MME_0_3),910__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_0_0),911__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_0_1),912__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_0_2),913__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_0_3),914__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_1_0),915__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_1_1),916__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_1_2),917__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_1_3),918__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_2_0),919__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_2_1),920__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_2_2),921__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_2_3),922__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_3_0),923__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_3_1),924__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_3_2),925__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_3_3),926__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_4_0),927__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_4_1),928__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_4_2),929__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_4_3),930__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_5_0),931__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_5_1),932__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_5_2),933__stringify(GAUDI2_QUEUE_ID_DCORE2_TPC_5_3),934__stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0),935__stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_0_1),936__stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_0_2),937__stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3),938__stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0),939__stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1),940__stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2),941__stringify(GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3),942__stringify(GAUDI2_QUEUE_ID_DCORE3_MME_0_0),943__stringify(GAUDI2_QUEUE_ID_DCORE3_MME_0_1),944__stringify(GAUDI2_QUEUE_ID_DCORE3_MME_0_2),945__stringify(GAUDI2_QUEUE_ID_DCORE3_MME_0_3),946__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_0_0),947__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_0_1),948__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_0_2),949__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_0_3),950__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_1_0),951__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_1_1),952__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_1_2),953__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_1_3),954__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_2_0),955__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_2_1),956__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_2_2),957__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_2_3),958__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_3_0),959__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_3_1),960__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_3_2),961__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_3_3),962__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_4_0),963__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_4_1),964__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_4_2),965__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_4_3),966__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_5_0),967__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_5_1),968__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_5_2),969__stringify(GAUDI2_QUEUE_ID_DCORE3_TPC_5_3),970__stringify(GAUDI2_QUEUE_ID_NIC_0_0),971__stringify(GAUDI2_QUEUE_ID_NIC_0_1),972__stringify(GAUDI2_QUEUE_ID_NIC_0_2),973__stringify(GAUDI2_QUEUE_ID_NIC_0_3),974__stringify(GAUDI2_QUEUE_ID_NIC_1_0),975__stringify(GAUDI2_QUEUE_ID_NIC_1_1),976__stringify(GAUDI2_QUEUE_ID_NIC_1_2),977__stringify(GAUDI2_QUEUE_ID_NIC_1_3),978__stringify(GAUDI2_QUEUE_ID_NIC_2_0),979__stringify(GAUDI2_QUEUE_ID_NIC_2_1),980__stringify(GAUDI2_QUEUE_ID_NIC_2_2),981__stringify(GAUDI2_QUEUE_ID_NIC_2_3),982__stringify(GAUDI2_QUEUE_ID_NIC_3_0),983__stringify(GAUDI2_QUEUE_ID_NIC_3_1),984__stringify(GAUDI2_QUEUE_ID_NIC_3_2),985__stringify(GAUDI2_QUEUE_ID_NIC_3_3),986__stringify(GAUDI2_QUEUE_ID_NIC_4_0),987__stringify(GAUDI2_QUEUE_ID_NIC_4_1),988__stringify(GAUDI2_QUEUE_ID_NIC_4_2),989__stringify(GAUDI2_QUEUE_ID_NIC_4_3),990__stringify(GAUDI2_QUEUE_ID_NIC_5_0),991__stringify(GAUDI2_QUEUE_ID_NIC_5_1),992__stringify(GAUDI2_QUEUE_ID_NIC_5_2),993__stringify(GAUDI2_QUEUE_ID_NIC_5_3),994__stringify(GAUDI2_QUEUE_ID_NIC_6_0),995__stringify(GAUDI2_QUEUE_ID_NIC_6_1),996__stringify(GAUDI2_QUEUE_ID_NIC_6_2),997__stringify(GAUDI2_QUEUE_ID_NIC_6_3),998__stringify(GAUDI2_QUEUE_ID_NIC_7_0),999__stringify(GAUDI2_QUEUE_ID_NIC_7_1),1000__stringify(GAUDI2_QUEUE_ID_NIC_7_2),1001__stringify(GAUDI2_QUEUE_ID_NIC_7_3),1002__stringify(GAUDI2_QUEUE_ID_NIC_8_0),1003__stringify(GAUDI2_QUEUE_ID_NIC_8_1),1004__stringify(GAUDI2_QUEUE_ID_NIC_8_2),1005__stringify(GAUDI2_QUEUE_ID_NIC_8_3),1006__stringify(GAUDI2_QUEUE_ID_NIC_9_0),1007__stringify(GAUDI2_QUEUE_ID_NIC_9_1),1008__stringify(GAUDI2_QUEUE_ID_NIC_9_2),1009__stringify(GAUDI2_QUEUE_ID_NIC_9_3),1010__stringify(GAUDI2_QUEUE_ID_NIC_10_0),1011__stringify(GAUDI2_QUEUE_ID_NIC_10_1),1012__stringify(GAUDI2_QUEUE_ID_NIC_10_2),1013__stringify(GAUDI2_QUEUE_ID_NIC_10_3),1014__stringify(GAUDI2_QUEUE_ID_NIC_11_0),1015__stringify(GAUDI2_QUEUE_ID_NIC_11_1),1016__stringify(GAUDI2_QUEUE_ID_NIC_11_2),1017__stringify(GAUDI2_QUEUE_ID_NIC_11_3),1018__stringify(GAUDI2_QUEUE_ID_NIC_12_0),1019__stringify(GAUDI2_QUEUE_ID_NIC_12_1),1020__stringify(GAUDI2_QUEUE_ID_NIC_12_2),1021__stringify(GAUDI2_QUEUE_ID_NIC_12_3),1022__stringify(GAUDI2_QUEUE_ID_NIC_13_0),1023__stringify(GAUDI2_QUEUE_ID_NIC_13_1),1024__stringify(GAUDI2_QUEUE_ID_NIC_13_2),1025__stringify(GAUDI2_QUEUE_ID_NIC_13_3),1026__stringify(GAUDI2_QUEUE_ID_NIC_14_0),1027__stringify(GAUDI2_QUEUE_ID_NIC_14_1),1028__stringify(GAUDI2_QUEUE_ID_NIC_14_2),1029__stringify(GAUDI2_QUEUE_ID_NIC_14_3),1030__stringify(GAUDI2_QUEUE_ID_NIC_15_0),1031__stringify(GAUDI2_QUEUE_ID_NIC_15_1),1032__stringify(GAUDI2_QUEUE_ID_NIC_15_2),1033__stringify(GAUDI2_QUEUE_ID_NIC_15_3),1034__stringify(GAUDI2_QUEUE_ID_NIC_16_0),1035__stringify(GAUDI2_QUEUE_ID_NIC_16_1),1036__stringify(GAUDI2_QUEUE_ID_NIC_16_2),1037__stringify(GAUDI2_QUEUE_ID_NIC_16_3),1038__stringify(GAUDI2_QUEUE_ID_NIC_17_0),1039__stringify(GAUDI2_QUEUE_ID_NIC_17_1),1040__stringify(GAUDI2_QUEUE_ID_NIC_17_2),1041__stringify(GAUDI2_QUEUE_ID_NIC_17_3),1042__stringify(GAUDI2_QUEUE_ID_NIC_18_0),1043__stringify(GAUDI2_QUEUE_ID_NIC_18_1),1044__stringify(GAUDI2_QUEUE_ID_NIC_18_2),1045__stringify(GAUDI2_QUEUE_ID_NIC_18_3),1046__stringify(GAUDI2_QUEUE_ID_NIC_19_0),1047__stringify(GAUDI2_QUEUE_ID_NIC_19_1),1048__stringify(GAUDI2_QUEUE_ID_NIC_19_2),1049__stringify(GAUDI2_QUEUE_ID_NIC_19_3),1050__stringify(GAUDI2_QUEUE_ID_NIC_20_0),1051__stringify(GAUDI2_QUEUE_ID_NIC_20_1),1052__stringify(GAUDI2_QUEUE_ID_NIC_20_2),1053__stringify(GAUDI2_QUEUE_ID_NIC_20_3),1054__stringify(GAUDI2_QUEUE_ID_NIC_21_0),1055__stringify(GAUDI2_QUEUE_ID_NIC_21_1),1056__stringify(GAUDI2_QUEUE_ID_NIC_21_2),1057__stringify(GAUDI2_QUEUE_ID_NIC_21_3),1058__stringify(GAUDI2_QUEUE_ID_NIC_22_0),1059__stringify(GAUDI2_QUEUE_ID_NIC_22_1),1060__stringify(GAUDI2_QUEUE_ID_NIC_22_2),1061__stringify(GAUDI2_QUEUE_ID_NIC_22_3),1062__stringify(GAUDI2_QUEUE_ID_NIC_23_0),1063__stringify(GAUDI2_QUEUE_ID_NIC_23_1),1064__stringify(GAUDI2_QUEUE_ID_NIC_23_2),1065__stringify(GAUDI2_QUEUE_ID_NIC_23_3),1066__stringify(GAUDI2_QUEUE_ID_ROT_0_0),1067__stringify(GAUDI2_QUEUE_ID_ROT_0_1),1068__stringify(GAUDI2_QUEUE_ID_ROT_0_2),1069__stringify(GAUDI2_QUEUE_ID_ROT_0_3),1070__stringify(GAUDI2_QUEUE_ID_ROT_1_0),1071__stringify(GAUDI2_QUEUE_ID_ROT_1_1),1072__stringify(GAUDI2_QUEUE_ID_ROT_1_2),1073__stringify(GAUDI2_QUEUE_ID_ROT_1_3),1074__stringify(GAUDI2_QUEUE_ID_CPU_PQ),1075__stringify(GAUDI2_QUEUE_ID_SIZE),1076};10771078static const char * const gaudi2_qm_sei_error_cause[GAUDI2_NUM_OF_QM_SEI_ERR_CAUSE] = {1079"qman sei intr",1080"arc sei intr"1081};10821083static const char * const gaudi2_cpu_sei_error_cause[GAUDI2_NUM_OF_CPU_SEI_ERR_CAUSE] = {1084"AXI_TERMINATOR WR",1085"AXI_TERMINATOR RD",1086"AXI SPLIT SEI Status"1087};10881089static const char * const gaudi2_arc_sei_error_cause[GAUDI2_NUM_OF_ARC_SEI_ERR_CAUSE] = {1090"cbu_bresp_sei_intr_cause",1091"cbu_rresp_sei_intr_cause",1092"lbu_bresp_sei_intr_cause",1093"lbu_rresp_sei_intr_cause",1094"cbu_axi_split_intr_cause",1095"lbu_axi_split_intr_cause",1096"arc_ip_excptn_sei_intr_cause",1097"dmi_bresp_sei_intr_cause",1098"aux2apb_err_sei_intr_cause",1099"cfg_lbw_wr_terminated_intr_cause",1100"cfg_lbw_rd_terminated_intr_cause",1101"cfg_dccm_wr_terminated_intr_cause",1102"cfg_dccm_rd_terminated_intr_cause",1103"cfg_hbw_rd_terminated_intr_cause"1104};11051106static const char * const gaudi2_dec_error_cause[GAUDI2_NUM_OF_DEC_ERR_CAUSE] = {1107"msix_vcd_hbw_sei",1108"msix_l2c_hbw_sei",1109"msix_nrm_hbw_sei",1110"msix_abnrm_hbw_sei",1111"msix_vcd_lbw_sei",1112"msix_l2c_lbw_sei",1113"msix_nrm_lbw_sei",1114"msix_abnrm_lbw_sei",1115"apb_vcd_lbw_sei",1116"apb_l2c_lbw_sei",1117"apb_nrm_lbw_sei",1118"apb_abnrm_lbw_sei",1119"dec_sei",1120"dec_apb_sei",1121"trc_apb_sei",1122"lbw_mstr_if_sei",1123"axi_split_bresp_err_sei",1124"hbw_axi_wr_viol_sei",1125"hbw_axi_rd_viol_sei",1126"lbw_axi_wr_viol_sei",1127"lbw_axi_rd_viol_sei",1128"vcd_spi",1129"l2c_spi",1130"nrm_spi",1131"abnrm_spi",1132};11331134static const char * const gaudi2_qman_error_cause[GAUDI2_NUM_OF_QM_ERR_CAUSE] = {1135"PQ AXI HBW error",1136"CQ AXI HBW error",1137"CP AXI HBW error",1138"CP error due to undefined OPCODE",1139"CP encountered STOP OPCODE",1140"CP AXI LBW error",1141"CP WRREG32 or WRBULK returned error",1142"N/A",1143"FENCE 0 inc over max value and clipped",1144"FENCE 1 inc over max value and clipped",1145"FENCE 2 inc over max value and clipped",1146"FENCE 3 inc over max value and clipped",1147"FENCE 0 dec under min value and clipped",1148"FENCE 1 dec under min value and clipped",1149"FENCE 2 dec under min value and clipped",1150"FENCE 3 dec under min value and clipped",1151"CPDMA Up overflow",1152"PQC L2H error"1153};11541155static const char * const gaudi2_lower_qman_error_cause[GAUDI2_NUM_OF_LOWER_QM_ERR_CAUSE] = {1156"RSVD0",1157"CQ AXI HBW error",1158"CP AXI HBW error",1159"CP error due to undefined OPCODE",1160"CP encountered STOP OPCODE",1161"CP AXI LBW error",1162"CP WRREG32 or WRBULK returned error",1163"N/A",1164"FENCE 0 inc over max value and clipped",1165"FENCE 1 inc over max value and clipped",1166"FENCE 2 inc over max value and clipped",1167"FENCE 3 inc over max value and clipped",1168"FENCE 0 dec under min value and clipped",1169"FENCE 1 dec under min value and clipped",1170"FENCE 2 dec under min value and clipped",1171"FENCE 3 dec under min value and clipped",1172"CPDMA Up overflow",1173"RSVD17",1174"CQ_WR_IFIFO_CI_ERR",1175"CQ_WR_CTL_CI_ERR",1176"ARC_CQF_RD_ERR",1177"ARC_CQ_WR_IFIFO_CI_ERR",1178"ARC_CQ_WR_CTL_CI_ERR",1179"ARC_AXI_ERR",1180"CP_SWITCH_WDT_ERR"1181};11821183static const char * const gaudi2_qman_arb_error_cause[GAUDI2_NUM_OF_QM_ARB_ERR_CAUSE] = {1184"Choice push while full error",1185"Choice Q watchdog error",1186"MSG AXI LBW returned with error"1187};11881189static const char * const guadi2_rot_error_cause[GAUDI2_NUM_OF_ROT_ERR_CAUSE] = {1190"qm_axi_err",1191"qm_trace_fence_events",1192"qm_sw_err",1193"qm_cp_sw_stop",1194"lbw_mstr_rresp_err",1195"lbw_mstr_bresp_err",1196"lbw_msg_slverr",1197"hbw_msg_slverr",1198"wbc_slverr",1199"hbw_mstr_rresp_err",1200"hbw_mstr_bresp_err",1201"sb_resp_intr",1202"mrsb_resp_intr",1203"core_dw_status_0",1204"core_dw_status_1",1205"core_dw_status_2",1206"core_dw_status_3",1207"core_dw_status_4",1208"core_dw_status_5",1209"core_dw_status_6",1210"core_dw_status_7",1211"async_arc2cpu_sei_intr",1212};12131214static const char * const gaudi2_tpc_interrupts_cause[GAUDI2_NUM_OF_TPC_INTR_CAUSE] = {1215"tpc_address_exceed_slm",1216"tpc_div_by_0",1217"tpc_spu_mac_overflow",1218"tpc_spu_addsub_overflow",1219"tpc_spu_abs_overflow",1220"tpc_spu_fma_fp_dst_nan",1221"tpc_spu_fma_fp_dst_inf",1222"tpc_spu_convert_fp_dst_nan",1223"tpc_spu_convert_fp_dst_inf",1224"tpc_spu_fp_dst_denorm",1225"tpc_vpu_mac_overflow",1226"tpc_vpu_addsub_overflow",1227"tpc_vpu_abs_overflow",1228"tpc_vpu_convert_fp_dst_nan",1229"tpc_vpu_convert_fp_dst_inf",1230"tpc_vpu_fma_fp_dst_nan",1231"tpc_vpu_fma_fp_dst_inf",1232"tpc_vpu_fp_dst_denorm",1233"tpc_assertions",1234"tpc_illegal_instruction",1235"tpc_pc_wrap_around",1236"tpc_qm_sw_err",1237"tpc_hbw_rresp_err",1238"tpc_hbw_bresp_err",1239"tpc_lbw_rresp_err",1240"tpc_lbw_bresp_err",1241"st_unlock_already_locked",1242"invalid_lock_access",1243"LD_L protection violation",1244"ST_L protection violation",1245"D$ L0CS mismatch",1246};12471248static const char * const guadi2_mme_error_cause[GAUDI2_NUM_OF_MME_ERR_CAUSE] = {1249"agu_resp_intr",1250"qman_axi_err",1251"wap sei (wbc axi err)",1252"arc sei",1253"cfg access error",1254"qm_sw_err",1255"sbte_dbg_intr_0",1256"sbte_dbg_intr_1",1257"sbte_dbg_intr_2",1258"sbte_dbg_intr_3",1259"sbte_dbg_intr_4",1260"sbte_prtn_intr_0",1261"sbte_prtn_intr_1",1262"sbte_prtn_intr_2",1263"sbte_prtn_intr_3",1264"sbte_prtn_intr_4",1265};12661267static const char * const guadi2_mme_wap_error_cause[GAUDI2_NUM_OF_MME_WAP_ERR_CAUSE] = {1268"WBC ERR RESP_0",1269"WBC ERR RESP_1",1270"AP SOURCE POS INF",1271"AP SOURCE NEG INF",1272"AP SOURCE NAN",1273"AP RESULT POS INF",1274"AP RESULT NEG INF",1275};12761277static const char * const gaudi2_dma_core_interrupts_cause[GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE] = {1278"HBW Read returned with error RRESP",1279"HBW write returned with error BRESP",1280"LBW write returned with error BRESP",1281"descriptor_fifo_overflow",1282"KDMA SB LBW Read returned with error",1283"KDMA WBC LBW Write returned with error",1284"TRANSPOSE ENGINE DESC FIFO OVERFLOW",1285"WRONG CFG FOR COMMIT IN LIN DMA"1286};12871288static const char * const gaudi2_kdma_core_interrupts_cause[GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE] = {1289"HBW/LBW Read returned with error RRESP",1290"HBW/LBW write returned with error BRESP",1291"LBW write returned with error BRESP",1292"descriptor_fifo_overflow",1293"KDMA SB LBW Read returned with error",1294"KDMA WBC LBW Write returned with error",1295"TRANSPOSE ENGINE DESC FIFO OVERFLOW",1296"WRONG CFG FOR COMMIT IN LIN DMA"1297};12981299struct gaudi2_sm_sei_cause_data {1300const char *cause_name;1301const char *log_name;1302};13031304static const struct gaudi2_sm_sei_cause_data1305gaudi2_sm_sei_cause[GAUDI2_NUM_OF_SM_SEI_ERR_CAUSE] = {1306{"calculated SO value overflow/underflow", "SOB ID"},1307{"payload address of monitor is not aligned to 4B", "monitor addr"},1308{"armed monitor write got BRESP (SLVERR or DECERR)", "AXI id"},1309};13101311static const char * const1312gaudi2_pmmu_fatal_interrupts_cause[GAUDI2_NUM_OF_PMMU_FATAL_ERR_CAUSE] = {1313"LATENCY_RD_OUT_FIFO_OVERRUN",1314"LATENCY_WR_OUT_FIFO_OVERRUN",1315};13161317static const char * const1318gaudi2_hif_fatal_interrupts_cause[GAUDI2_NUM_OF_HIF_FATAL_ERR_CAUSE] = {1319"LATENCY_RD_OUT_FIFO_OVERRUN",1320"LATENCY_WR_OUT_FIFO_OVERRUN",1321};13221323static const char * const1324gaudi2_psoc_axi_drain_interrupts_cause[GAUDI2_NUM_OF_AXI_DRAIN_ERR_CAUSE] = {1325"AXI drain HBW",1326"AXI drain LBW",1327};13281329static const char * const1330gaudi2_pcie_addr_dec_error_cause[GAUDI2_NUM_OF_PCIE_ADDR_DEC_ERR_CAUSE] = {1331"HBW error response",1332"LBW error response",1333"TLP is blocked by RR"1334};13351336static const int gaudi2_queue_id_to_engine_id[] = {1337[GAUDI2_QUEUE_ID_PDMA_0_0...GAUDI2_QUEUE_ID_PDMA_0_3] = GAUDI2_ENGINE_ID_PDMA_0,1338[GAUDI2_QUEUE_ID_PDMA_1_0...GAUDI2_QUEUE_ID_PDMA_1_3] = GAUDI2_ENGINE_ID_PDMA_1,1339[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3] =1340GAUDI2_DCORE0_ENGINE_ID_EDMA_0,1341[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3] =1342GAUDI2_DCORE0_ENGINE_ID_EDMA_1,1343[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3] =1344GAUDI2_DCORE1_ENGINE_ID_EDMA_0,1345[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3] =1346GAUDI2_DCORE1_ENGINE_ID_EDMA_1,1347[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3] =1348GAUDI2_DCORE2_ENGINE_ID_EDMA_0,1349[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3] =1350GAUDI2_DCORE2_ENGINE_ID_EDMA_1,1351[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3] =1352GAUDI2_DCORE3_ENGINE_ID_EDMA_0,1353[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3] =1354GAUDI2_DCORE3_ENGINE_ID_EDMA_1,1355[GAUDI2_QUEUE_ID_DCORE0_MME_0_0...GAUDI2_QUEUE_ID_DCORE0_MME_0_3] =1356GAUDI2_DCORE0_ENGINE_ID_MME,1357[GAUDI2_QUEUE_ID_DCORE1_MME_0_0...GAUDI2_QUEUE_ID_DCORE1_MME_0_3] =1358GAUDI2_DCORE1_ENGINE_ID_MME,1359[GAUDI2_QUEUE_ID_DCORE2_MME_0_0...GAUDI2_QUEUE_ID_DCORE2_MME_0_3] =1360GAUDI2_DCORE2_ENGINE_ID_MME,1361[GAUDI2_QUEUE_ID_DCORE3_MME_0_0...GAUDI2_QUEUE_ID_DCORE3_MME_0_3] =1362GAUDI2_DCORE3_ENGINE_ID_MME,1363[GAUDI2_QUEUE_ID_DCORE0_TPC_0_0...GAUDI2_QUEUE_ID_DCORE0_TPC_0_3] =1364GAUDI2_DCORE0_ENGINE_ID_TPC_0,1365[GAUDI2_QUEUE_ID_DCORE0_TPC_1_0...GAUDI2_QUEUE_ID_DCORE0_TPC_1_3] =1366GAUDI2_DCORE0_ENGINE_ID_TPC_1,1367[GAUDI2_QUEUE_ID_DCORE0_TPC_2_0...GAUDI2_QUEUE_ID_DCORE0_TPC_2_3] =1368GAUDI2_DCORE0_ENGINE_ID_TPC_2,1369[GAUDI2_QUEUE_ID_DCORE0_TPC_3_0...GAUDI2_QUEUE_ID_DCORE0_TPC_3_3] =1370GAUDI2_DCORE0_ENGINE_ID_TPC_3,1371[GAUDI2_QUEUE_ID_DCORE0_TPC_4_0...GAUDI2_QUEUE_ID_DCORE0_TPC_4_3] =1372GAUDI2_DCORE0_ENGINE_ID_TPC_4,1373[GAUDI2_QUEUE_ID_DCORE0_TPC_5_0...GAUDI2_QUEUE_ID_DCORE0_TPC_5_3] =1374GAUDI2_DCORE0_ENGINE_ID_TPC_5,1375[GAUDI2_QUEUE_ID_DCORE0_TPC_6_0...GAUDI2_QUEUE_ID_DCORE0_TPC_6_3] =1376GAUDI2_DCORE0_ENGINE_ID_TPC_6,1377[GAUDI2_QUEUE_ID_DCORE1_TPC_0_0...GAUDI2_QUEUE_ID_DCORE1_TPC_0_3] =1378GAUDI2_DCORE1_ENGINE_ID_TPC_0,1379[GAUDI2_QUEUE_ID_DCORE1_TPC_1_0...GAUDI2_QUEUE_ID_DCORE1_TPC_1_3] =1380GAUDI2_DCORE1_ENGINE_ID_TPC_1,1381[GAUDI2_QUEUE_ID_DCORE1_TPC_2_0...GAUDI2_QUEUE_ID_DCORE1_TPC_2_3] =1382GAUDI2_DCORE1_ENGINE_ID_TPC_2,1383[GAUDI2_QUEUE_ID_DCORE1_TPC_3_0...GAUDI2_QUEUE_ID_DCORE1_TPC_3_3] =1384GAUDI2_DCORE1_ENGINE_ID_TPC_3,1385[GAUDI2_QUEUE_ID_DCORE1_TPC_4_0...GAUDI2_QUEUE_ID_DCORE1_TPC_4_3] =1386GAUDI2_DCORE1_ENGINE_ID_TPC_4,1387[GAUDI2_QUEUE_ID_DCORE1_TPC_5_0...GAUDI2_QUEUE_ID_DCORE1_TPC_5_3] =1388GAUDI2_DCORE1_ENGINE_ID_TPC_5,1389[GAUDI2_QUEUE_ID_DCORE2_TPC_0_0...GAUDI2_QUEUE_ID_DCORE2_TPC_0_3] =1390GAUDI2_DCORE2_ENGINE_ID_TPC_0,1391[GAUDI2_QUEUE_ID_DCORE2_TPC_1_0...GAUDI2_QUEUE_ID_DCORE2_TPC_1_3] =1392GAUDI2_DCORE2_ENGINE_ID_TPC_1,1393[GAUDI2_QUEUE_ID_DCORE2_TPC_2_0...GAUDI2_QUEUE_ID_DCORE2_TPC_2_3] =1394GAUDI2_DCORE2_ENGINE_ID_TPC_2,1395[GAUDI2_QUEUE_ID_DCORE2_TPC_3_0...GAUDI2_QUEUE_ID_DCORE2_TPC_3_3] =1396GAUDI2_DCORE2_ENGINE_ID_TPC_3,1397[GAUDI2_QUEUE_ID_DCORE2_TPC_4_0...GAUDI2_QUEUE_ID_DCORE2_TPC_4_3] =1398GAUDI2_DCORE2_ENGINE_ID_TPC_4,1399[GAUDI2_QUEUE_ID_DCORE2_TPC_5_0...GAUDI2_QUEUE_ID_DCORE2_TPC_5_3] =1400GAUDI2_DCORE2_ENGINE_ID_TPC_5,1401[GAUDI2_QUEUE_ID_DCORE3_TPC_0_0...GAUDI2_QUEUE_ID_DCORE3_TPC_0_3] =1402GAUDI2_DCORE3_ENGINE_ID_TPC_0,1403[GAUDI2_QUEUE_ID_DCORE3_TPC_1_0...GAUDI2_QUEUE_ID_DCORE3_TPC_1_3] =1404GAUDI2_DCORE3_ENGINE_ID_TPC_1,1405[GAUDI2_QUEUE_ID_DCORE3_TPC_2_0...GAUDI2_QUEUE_ID_DCORE3_TPC_2_3] =1406GAUDI2_DCORE3_ENGINE_ID_TPC_2,1407[GAUDI2_QUEUE_ID_DCORE3_TPC_3_0...GAUDI2_QUEUE_ID_DCORE3_TPC_3_3] =1408GAUDI2_DCORE3_ENGINE_ID_TPC_3,1409[GAUDI2_QUEUE_ID_DCORE3_TPC_4_0...GAUDI2_QUEUE_ID_DCORE3_TPC_4_3] =1410GAUDI2_DCORE3_ENGINE_ID_TPC_4,1411[GAUDI2_QUEUE_ID_DCORE3_TPC_5_0...GAUDI2_QUEUE_ID_DCORE3_TPC_5_3] =1412GAUDI2_DCORE3_ENGINE_ID_TPC_5,1413[GAUDI2_QUEUE_ID_NIC_0_0...GAUDI2_QUEUE_ID_NIC_0_3] = GAUDI2_ENGINE_ID_NIC0_0,1414[GAUDI2_QUEUE_ID_NIC_1_0...GAUDI2_QUEUE_ID_NIC_1_3] = GAUDI2_ENGINE_ID_NIC0_1,1415[GAUDI2_QUEUE_ID_NIC_2_0...GAUDI2_QUEUE_ID_NIC_2_3] = GAUDI2_ENGINE_ID_NIC1_0,1416[GAUDI2_QUEUE_ID_NIC_3_0...GAUDI2_QUEUE_ID_NIC_3_3] = GAUDI2_ENGINE_ID_NIC1_1,1417[GAUDI2_QUEUE_ID_NIC_4_0...GAUDI2_QUEUE_ID_NIC_4_3] = GAUDI2_ENGINE_ID_NIC2_0,1418[GAUDI2_QUEUE_ID_NIC_5_0...GAUDI2_QUEUE_ID_NIC_5_3] = GAUDI2_ENGINE_ID_NIC2_1,1419[GAUDI2_QUEUE_ID_NIC_6_0...GAUDI2_QUEUE_ID_NIC_6_3] = GAUDI2_ENGINE_ID_NIC3_0,1420[GAUDI2_QUEUE_ID_NIC_7_0...GAUDI2_QUEUE_ID_NIC_7_3] = GAUDI2_ENGINE_ID_NIC3_1,1421[GAUDI2_QUEUE_ID_NIC_8_0...GAUDI2_QUEUE_ID_NIC_8_3] = GAUDI2_ENGINE_ID_NIC4_0,1422[GAUDI2_QUEUE_ID_NIC_9_0...GAUDI2_QUEUE_ID_NIC_9_3] = GAUDI2_ENGINE_ID_NIC4_1,1423[GAUDI2_QUEUE_ID_NIC_10_0...GAUDI2_QUEUE_ID_NIC_10_3] = GAUDI2_ENGINE_ID_NIC5_0,1424[GAUDI2_QUEUE_ID_NIC_11_0...GAUDI2_QUEUE_ID_NIC_11_3] = GAUDI2_ENGINE_ID_NIC5_1,1425[GAUDI2_QUEUE_ID_NIC_12_0...GAUDI2_QUEUE_ID_NIC_12_3] = GAUDI2_ENGINE_ID_NIC6_0,1426[GAUDI2_QUEUE_ID_NIC_13_0...GAUDI2_QUEUE_ID_NIC_13_3] = GAUDI2_ENGINE_ID_NIC6_1,1427[GAUDI2_QUEUE_ID_NIC_14_0...GAUDI2_QUEUE_ID_NIC_14_3] = GAUDI2_ENGINE_ID_NIC7_0,1428[GAUDI2_QUEUE_ID_NIC_15_0...GAUDI2_QUEUE_ID_NIC_15_3] = GAUDI2_ENGINE_ID_NIC7_1,1429[GAUDI2_QUEUE_ID_NIC_16_0...GAUDI2_QUEUE_ID_NIC_16_3] = GAUDI2_ENGINE_ID_NIC8_0,1430[GAUDI2_QUEUE_ID_NIC_17_0...GAUDI2_QUEUE_ID_NIC_17_3] = GAUDI2_ENGINE_ID_NIC8_1,1431[GAUDI2_QUEUE_ID_NIC_18_0...GAUDI2_QUEUE_ID_NIC_18_3] = GAUDI2_ENGINE_ID_NIC9_0,1432[GAUDI2_QUEUE_ID_NIC_19_0...GAUDI2_QUEUE_ID_NIC_19_3] = GAUDI2_ENGINE_ID_NIC9_1,1433[GAUDI2_QUEUE_ID_NIC_20_0...GAUDI2_QUEUE_ID_NIC_20_3] = GAUDI2_ENGINE_ID_NIC10_0,1434[GAUDI2_QUEUE_ID_NIC_21_0...GAUDI2_QUEUE_ID_NIC_21_3] = GAUDI2_ENGINE_ID_NIC10_1,1435[GAUDI2_QUEUE_ID_NIC_22_0...GAUDI2_QUEUE_ID_NIC_22_3] = GAUDI2_ENGINE_ID_NIC11_0,1436[GAUDI2_QUEUE_ID_NIC_23_0...GAUDI2_QUEUE_ID_NIC_23_3] = GAUDI2_ENGINE_ID_NIC11_1,1437[GAUDI2_QUEUE_ID_ROT_0_0...GAUDI2_QUEUE_ID_ROT_0_3] = GAUDI2_ENGINE_ID_ROT_0,1438[GAUDI2_QUEUE_ID_ROT_1_0...GAUDI2_QUEUE_ID_ROT_1_3] = GAUDI2_ENGINE_ID_ROT_1,1439};14401441const u32 gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_SIZE] = {1442[GAUDI2_QUEUE_ID_PDMA_0_0] = mmPDMA0_QM_BASE,1443[GAUDI2_QUEUE_ID_PDMA_0_1] = mmPDMA0_QM_BASE,1444[GAUDI2_QUEUE_ID_PDMA_0_2] = mmPDMA0_QM_BASE,1445[GAUDI2_QUEUE_ID_PDMA_0_3] = mmPDMA0_QM_BASE,1446[GAUDI2_QUEUE_ID_PDMA_1_0] = mmPDMA1_QM_BASE,1447[GAUDI2_QUEUE_ID_PDMA_1_1] = mmPDMA1_QM_BASE,1448[GAUDI2_QUEUE_ID_PDMA_1_2] = mmPDMA1_QM_BASE,1449[GAUDI2_QUEUE_ID_PDMA_1_3] = mmPDMA1_QM_BASE,1450[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0] = mmDCORE0_EDMA0_QM_BASE,1451[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_1] = mmDCORE0_EDMA0_QM_BASE,1452[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_2] = mmDCORE0_EDMA0_QM_BASE,1453[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3] = mmDCORE0_EDMA0_QM_BASE,1454[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0] = mmDCORE0_EDMA1_QM_BASE,1455[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_1] = mmDCORE0_EDMA1_QM_BASE,1456[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_2] = mmDCORE0_EDMA1_QM_BASE,1457[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3] = mmDCORE0_EDMA1_QM_BASE,1458[GAUDI2_QUEUE_ID_DCORE0_MME_0_0] = mmDCORE0_MME_QM_BASE,1459[GAUDI2_QUEUE_ID_DCORE0_MME_0_1] = mmDCORE0_MME_QM_BASE,1460[GAUDI2_QUEUE_ID_DCORE0_MME_0_2] = mmDCORE0_MME_QM_BASE,1461[GAUDI2_QUEUE_ID_DCORE0_MME_0_3] = mmDCORE0_MME_QM_BASE,1462[GAUDI2_QUEUE_ID_DCORE0_TPC_0_0] = mmDCORE0_TPC0_QM_BASE,1463[GAUDI2_QUEUE_ID_DCORE0_TPC_0_1] = mmDCORE0_TPC0_QM_BASE,1464[GAUDI2_QUEUE_ID_DCORE0_TPC_0_2] = mmDCORE0_TPC0_QM_BASE,1465[GAUDI2_QUEUE_ID_DCORE0_TPC_0_3] = mmDCORE0_TPC0_QM_BASE,1466[GAUDI2_QUEUE_ID_DCORE0_TPC_1_0] = mmDCORE0_TPC1_QM_BASE,1467[GAUDI2_QUEUE_ID_DCORE0_TPC_1_1] = mmDCORE0_TPC1_QM_BASE,1468[GAUDI2_QUEUE_ID_DCORE0_TPC_1_2] = mmDCORE0_TPC1_QM_BASE,1469[GAUDI2_QUEUE_ID_DCORE0_TPC_1_3] = mmDCORE0_TPC1_QM_BASE,1470[GAUDI2_QUEUE_ID_DCORE0_TPC_2_0] = mmDCORE0_TPC2_QM_BASE,1471[GAUDI2_QUEUE_ID_DCORE0_TPC_2_1] = mmDCORE0_TPC2_QM_BASE,1472[GAUDI2_QUEUE_ID_DCORE0_TPC_2_2] = mmDCORE0_TPC2_QM_BASE,1473[GAUDI2_QUEUE_ID_DCORE0_TPC_2_3] = mmDCORE0_TPC2_QM_BASE,1474[GAUDI2_QUEUE_ID_DCORE0_TPC_3_0] = mmDCORE0_TPC3_QM_BASE,1475[GAUDI2_QUEUE_ID_DCORE0_TPC_3_1] = mmDCORE0_TPC3_QM_BASE,1476[GAUDI2_QUEUE_ID_DCORE0_TPC_3_2] = mmDCORE0_TPC3_QM_BASE,1477[GAUDI2_QUEUE_ID_DCORE0_TPC_3_3] = mmDCORE0_TPC3_QM_BASE,1478[GAUDI2_QUEUE_ID_DCORE0_TPC_4_0] = mmDCORE0_TPC4_QM_BASE,1479[GAUDI2_QUEUE_ID_DCORE0_TPC_4_1] = mmDCORE0_TPC4_QM_BASE,1480[GAUDI2_QUEUE_ID_DCORE0_TPC_4_2] = mmDCORE0_TPC4_QM_BASE,1481[GAUDI2_QUEUE_ID_DCORE0_TPC_4_3] = mmDCORE0_TPC4_QM_BASE,1482[GAUDI2_QUEUE_ID_DCORE0_TPC_5_0] = mmDCORE0_TPC5_QM_BASE,1483[GAUDI2_QUEUE_ID_DCORE0_TPC_5_1] = mmDCORE0_TPC5_QM_BASE,1484[GAUDI2_QUEUE_ID_DCORE0_TPC_5_2] = mmDCORE0_TPC5_QM_BASE,1485[GAUDI2_QUEUE_ID_DCORE0_TPC_5_3] = mmDCORE0_TPC5_QM_BASE,1486[GAUDI2_QUEUE_ID_DCORE0_TPC_6_0] = mmDCORE0_TPC6_QM_BASE,1487[GAUDI2_QUEUE_ID_DCORE0_TPC_6_1] = mmDCORE0_TPC6_QM_BASE,1488[GAUDI2_QUEUE_ID_DCORE0_TPC_6_2] = mmDCORE0_TPC6_QM_BASE,1489[GAUDI2_QUEUE_ID_DCORE0_TPC_6_3] = mmDCORE0_TPC6_QM_BASE,1490[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0] = mmDCORE1_EDMA0_QM_BASE,1491[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_1] = mmDCORE1_EDMA0_QM_BASE,1492[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_2] = mmDCORE1_EDMA0_QM_BASE,1493[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3] = mmDCORE1_EDMA0_QM_BASE,1494[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0] = mmDCORE1_EDMA1_QM_BASE,1495[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_1] = mmDCORE1_EDMA1_QM_BASE,1496[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_2] = mmDCORE1_EDMA1_QM_BASE,1497[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3] = mmDCORE1_EDMA1_QM_BASE,1498[GAUDI2_QUEUE_ID_DCORE1_MME_0_0] = mmDCORE1_MME_QM_BASE,1499[GAUDI2_QUEUE_ID_DCORE1_MME_0_1] = mmDCORE1_MME_QM_BASE,1500[GAUDI2_QUEUE_ID_DCORE1_MME_0_2] = mmDCORE1_MME_QM_BASE,1501[GAUDI2_QUEUE_ID_DCORE1_MME_0_3] = mmDCORE1_MME_QM_BASE,1502[GAUDI2_QUEUE_ID_DCORE1_TPC_0_0] = mmDCORE1_TPC0_QM_BASE,1503[GAUDI2_QUEUE_ID_DCORE1_TPC_0_1] = mmDCORE1_TPC0_QM_BASE,1504[GAUDI2_QUEUE_ID_DCORE1_TPC_0_2] = mmDCORE1_TPC0_QM_BASE,1505[GAUDI2_QUEUE_ID_DCORE1_TPC_0_3] = mmDCORE1_TPC0_QM_BASE,1506[GAUDI2_QUEUE_ID_DCORE1_TPC_1_0] = mmDCORE1_TPC1_QM_BASE,1507[GAUDI2_QUEUE_ID_DCORE1_TPC_1_1] = mmDCORE1_TPC1_QM_BASE,1508[GAUDI2_QUEUE_ID_DCORE1_TPC_1_2] = mmDCORE1_TPC1_QM_BASE,1509[GAUDI2_QUEUE_ID_DCORE1_TPC_1_3] = mmDCORE1_TPC1_QM_BASE,1510[GAUDI2_QUEUE_ID_DCORE1_TPC_2_0] = mmDCORE1_TPC2_QM_BASE,1511[GAUDI2_QUEUE_ID_DCORE1_TPC_2_1] = mmDCORE1_TPC2_QM_BASE,1512[GAUDI2_QUEUE_ID_DCORE1_TPC_2_2] = mmDCORE1_TPC2_QM_BASE,1513[GAUDI2_QUEUE_ID_DCORE1_TPC_2_3] = mmDCORE1_TPC2_QM_BASE,1514[GAUDI2_QUEUE_ID_DCORE1_TPC_3_0] = mmDCORE1_TPC3_QM_BASE,1515[GAUDI2_QUEUE_ID_DCORE1_TPC_3_1] = mmDCORE1_TPC3_QM_BASE,1516[GAUDI2_QUEUE_ID_DCORE1_TPC_3_2] = mmDCORE1_TPC3_QM_BASE,1517[GAUDI2_QUEUE_ID_DCORE1_TPC_3_3] = mmDCORE1_TPC3_QM_BASE,1518[GAUDI2_QUEUE_ID_DCORE1_TPC_4_0] = mmDCORE1_TPC4_QM_BASE,1519[GAUDI2_QUEUE_ID_DCORE1_TPC_4_1] = mmDCORE1_TPC4_QM_BASE,1520[GAUDI2_QUEUE_ID_DCORE1_TPC_4_2] = mmDCORE1_TPC4_QM_BASE,1521[GAUDI2_QUEUE_ID_DCORE1_TPC_4_3] = mmDCORE1_TPC4_QM_BASE,1522[GAUDI2_QUEUE_ID_DCORE1_TPC_5_0] = mmDCORE1_TPC5_QM_BASE,1523[GAUDI2_QUEUE_ID_DCORE1_TPC_5_1] = mmDCORE1_TPC5_QM_BASE,1524[GAUDI2_QUEUE_ID_DCORE1_TPC_5_2] = mmDCORE1_TPC5_QM_BASE,1525[GAUDI2_QUEUE_ID_DCORE1_TPC_5_3] = mmDCORE1_TPC5_QM_BASE,1526[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0] = mmDCORE2_EDMA0_QM_BASE,1527[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_1] = mmDCORE2_EDMA0_QM_BASE,1528[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_2] = mmDCORE2_EDMA0_QM_BASE,1529[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3] = mmDCORE2_EDMA0_QM_BASE,1530[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0] = mmDCORE2_EDMA1_QM_BASE,1531[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_1] = mmDCORE2_EDMA1_QM_BASE,1532[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_2] = mmDCORE2_EDMA1_QM_BASE,1533[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3] = mmDCORE2_EDMA1_QM_BASE,1534[GAUDI2_QUEUE_ID_DCORE2_MME_0_0] = mmDCORE2_MME_QM_BASE,1535[GAUDI2_QUEUE_ID_DCORE2_MME_0_1] = mmDCORE2_MME_QM_BASE,1536[GAUDI2_QUEUE_ID_DCORE2_MME_0_2] = mmDCORE2_MME_QM_BASE,1537[GAUDI2_QUEUE_ID_DCORE2_MME_0_3] = mmDCORE2_MME_QM_BASE,1538[GAUDI2_QUEUE_ID_DCORE2_TPC_0_0] = mmDCORE2_TPC0_QM_BASE,1539[GAUDI2_QUEUE_ID_DCORE2_TPC_0_1] = mmDCORE2_TPC0_QM_BASE,1540[GAUDI2_QUEUE_ID_DCORE2_TPC_0_2] = mmDCORE2_TPC0_QM_BASE,1541[GAUDI2_QUEUE_ID_DCORE2_TPC_0_3] = mmDCORE2_TPC0_QM_BASE,1542[GAUDI2_QUEUE_ID_DCORE2_TPC_1_0] = mmDCORE2_TPC1_QM_BASE,1543[GAUDI2_QUEUE_ID_DCORE2_TPC_1_1] = mmDCORE2_TPC1_QM_BASE,1544[GAUDI2_QUEUE_ID_DCORE2_TPC_1_2] = mmDCORE2_TPC1_QM_BASE,1545[GAUDI2_QUEUE_ID_DCORE2_TPC_1_3] = mmDCORE2_TPC1_QM_BASE,1546[GAUDI2_QUEUE_ID_DCORE2_TPC_2_0] = mmDCORE2_TPC2_QM_BASE,1547[GAUDI2_QUEUE_ID_DCORE2_TPC_2_1] = mmDCORE2_TPC2_QM_BASE,1548[GAUDI2_QUEUE_ID_DCORE2_TPC_2_2] = mmDCORE2_TPC2_QM_BASE,1549[GAUDI2_QUEUE_ID_DCORE2_TPC_2_3] = mmDCORE2_TPC2_QM_BASE,1550[GAUDI2_QUEUE_ID_DCORE2_TPC_3_0] = mmDCORE2_TPC3_QM_BASE,1551[GAUDI2_QUEUE_ID_DCORE2_TPC_3_1] = mmDCORE2_TPC3_QM_BASE,1552[GAUDI2_QUEUE_ID_DCORE2_TPC_3_2] = mmDCORE2_TPC3_QM_BASE,1553[GAUDI2_QUEUE_ID_DCORE2_TPC_3_3] = mmDCORE2_TPC3_QM_BASE,1554[GAUDI2_QUEUE_ID_DCORE2_TPC_4_0] = mmDCORE2_TPC4_QM_BASE,1555[GAUDI2_QUEUE_ID_DCORE2_TPC_4_1] = mmDCORE2_TPC4_QM_BASE,1556[GAUDI2_QUEUE_ID_DCORE2_TPC_4_2] = mmDCORE2_TPC4_QM_BASE,1557[GAUDI2_QUEUE_ID_DCORE2_TPC_4_3] = mmDCORE2_TPC4_QM_BASE,1558[GAUDI2_QUEUE_ID_DCORE2_TPC_5_0] = mmDCORE2_TPC5_QM_BASE,1559[GAUDI2_QUEUE_ID_DCORE2_TPC_5_1] = mmDCORE2_TPC5_QM_BASE,1560[GAUDI2_QUEUE_ID_DCORE2_TPC_5_2] = mmDCORE2_TPC5_QM_BASE,1561[GAUDI2_QUEUE_ID_DCORE2_TPC_5_3] = mmDCORE2_TPC5_QM_BASE,1562[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0] = mmDCORE3_EDMA0_QM_BASE,1563[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_1] = mmDCORE3_EDMA0_QM_BASE,1564[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_2] = mmDCORE3_EDMA0_QM_BASE,1565[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3] = mmDCORE3_EDMA0_QM_BASE,1566[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0] = mmDCORE3_EDMA1_QM_BASE,1567[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1] = mmDCORE3_EDMA1_QM_BASE,1568[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2] = mmDCORE3_EDMA1_QM_BASE,1569[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3] = mmDCORE3_EDMA1_QM_BASE,1570[GAUDI2_QUEUE_ID_DCORE3_MME_0_0] = mmDCORE3_MME_QM_BASE,1571[GAUDI2_QUEUE_ID_DCORE3_MME_0_1] = mmDCORE3_MME_QM_BASE,1572[GAUDI2_QUEUE_ID_DCORE3_MME_0_2] = mmDCORE3_MME_QM_BASE,1573[GAUDI2_QUEUE_ID_DCORE3_MME_0_3] = mmDCORE3_MME_QM_BASE,1574[GAUDI2_QUEUE_ID_DCORE3_TPC_0_0] = mmDCORE3_TPC0_QM_BASE,1575[GAUDI2_QUEUE_ID_DCORE3_TPC_0_1] = mmDCORE3_TPC0_QM_BASE,1576[GAUDI2_QUEUE_ID_DCORE3_TPC_0_2] = mmDCORE3_TPC0_QM_BASE,1577[GAUDI2_QUEUE_ID_DCORE3_TPC_0_3] = mmDCORE3_TPC0_QM_BASE,1578[GAUDI2_QUEUE_ID_DCORE3_TPC_1_0] = mmDCORE3_TPC1_QM_BASE,1579[GAUDI2_QUEUE_ID_DCORE3_TPC_1_1] = mmDCORE3_TPC1_QM_BASE,1580[GAUDI2_QUEUE_ID_DCORE3_TPC_1_2] = mmDCORE3_TPC1_QM_BASE,1581[GAUDI2_QUEUE_ID_DCORE3_TPC_1_3] = mmDCORE3_TPC1_QM_BASE,1582[GAUDI2_QUEUE_ID_DCORE3_TPC_2_0] = mmDCORE3_TPC2_QM_BASE,1583[GAUDI2_QUEUE_ID_DCORE3_TPC_2_1] = mmDCORE3_TPC2_QM_BASE,1584[GAUDI2_QUEUE_ID_DCORE3_TPC_2_2] = mmDCORE3_TPC2_QM_BASE,1585[GAUDI2_QUEUE_ID_DCORE3_TPC_2_3] = mmDCORE3_TPC2_QM_BASE,1586[GAUDI2_QUEUE_ID_DCORE3_TPC_3_0] = mmDCORE3_TPC3_QM_BASE,1587[GAUDI2_QUEUE_ID_DCORE3_TPC_3_1] = mmDCORE3_TPC3_QM_BASE,1588[GAUDI2_QUEUE_ID_DCORE3_TPC_3_2] = mmDCORE3_TPC3_QM_BASE,1589[GAUDI2_QUEUE_ID_DCORE3_TPC_3_3] = mmDCORE3_TPC3_QM_BASE,1590[GAUDI2_QUEUE_ID_DCORE3_TPC_4_0] = mmDCORE3_TPC4_QM_BASE,1591[GAUDI2_QUEUE_ID_DCORE3_TPC_4_1] = mmDCORE3_TPC4_QM_BASE,1592[GAUDI2_QUEUE_ID_DCORE3_TPC_4_2] = mmDCORE3_TPC4_QM_BASE,1593[GAUDI2_QUEUE_ID_DCORE3_TPC_4_3] = mmDCORE3_TPC4_QM_BASE,1594[GAUDI2_QUEUE_ID_DCORE3_TPC_5_0] = mmDCORE3_TPC5_QM_BASE,1595[GAUDI2_QUEUE_ID_DCORE3_TPC_5_1] = mmDCORE3_TPC5_QM_BASE,1596[GAUDI2_QUEUE_ID_DCORE3_TPC_5_2] = mmDCORE3_TPC5_QM_BASE,1597[GAUDI2_QUEUE_ID_DCORE3_TPC_5_3] = mmDCORE3_TPC5_QM_BASE,1598[GAUDI2_QUEUE_ID_NIC_0_0] = mmNIC0_QM0_BASE,1599[GAUDI2_QUEUE_ID_NIC_0_1] = mmNIC0_QM0_BASE,1600[GAUDI2_QUEUE_ID_NIC_0_2] = mmNIC0_QM0_BASE,1601[GAUDI2_QUEUE_ID_NIC_0_3] = mmNIC0_QM0_BASE,1602[GAUDI2_QUEUE_ID_NIC_1_0] = mmNIC0_QM1_BASE,1603[GAUDI2_QUEUE_ID_NIC_1_1] = mmNIC0_QM1_BASE,1604[GAUDI2_QUEUE_ID_NIC_1_2] = mmNIC0_QM1_BASE,1605[GAUDI2_QUEUE_ID_NIC_1_3] = mmNIC0_QM1_BASE,1606[GAUDI2_QUEUE_ID_NIC_2_0] = mmNIC1_QM0_BASE,1607[GAUDI2_QUEUE_ID_NIC_2_1] = mmNIC1_QM0_BASE,1608[GAUDI2_QUEUE_ID_NIC_2_2] = mmNIC1_QM0_BASE,1609[GAUDI2_QUEUE_ID_NIC_2_3] = mmNIC1_QM0_BASE,1610[GAUDI2_QUEUE_ID_NIC_3_0] = mmNIC1_QM1_BASE,1611[GAUDI2_QUEUE_ID_NIC_3_1] = mmNIC1_QM1_BASE,1612[GAUDI2_QUEUE_ID_NIC_3_2] = mmNIC1_QM1_BASE,1613[GAUDI2_QUEUE_ID_NIC_3_3] = mmNIC1_QM1_BASE,1614[GAUDI2_QUEUE_ID_NIC_4_0] = mmNIC2_QM0_BASE,1615[GAUDI2_QUEUE_ID_NIC_4_1] = mmNIC2_QM0_BASE,1616[GAUDI2_QUEUE_ID_NIC_4_2] = mmNIC2_QM0_BASE,1617[GAUDI2_QUEUE_ID_NIC_4_3] = mmNIC2_QM0_BASE,1618[GAUDI2_QUEUE_ID_NIC_5_0] = mmNIC2_QM1_BASE,1619[GAUDI2_QUEUE_ID_NIC_5_1] = mmNIC2_QM1_BASE,1620[GAUDI2_QUEUE_ID_NIC_5_2] = mmNIC2_QM1_BASE,1621[GAUDI2_QUEUE_ID_NIC_5_3] = mmNIC2_QM1_BASE,1622[GAUDI2_QUEUE_ID_NIC_6_0] = mmNIC3_QM0_BASE,1623[GAUDI2_QUEUE_ID_NIC_6_1] = mmNIC3_QM0_BASE,1624[GAUDI2_QUEUE_ID_NIC_6_2] = mmNIC3_QM0_BASE,1625[GAUDI2_QUEUE_ID_NIC_6_3] = mmNIC3_QM0_BASE,1626[GAUDI2_QUEUE_ID_NIC_7_0] = mmNIC3_QM1_BASE,1627[GAUDI2_QUEUE_ID_NIC_7_1] = mmNIC3_QM1_BASE,1628[GAUDI2_QUEUE_ID_NIC_7_2] = mmNIC3_QM1_BASE,1629[GAUDI2_QUEUE_ID_NIC_7_3] = mmNIC3_QM1_BASE,1630[GAUDI2_QUEUE_ID_NIC_8_0] = mmNIC4_QM0_BASE,1631[GAUDI2_QUEUE_ID_NIC_8_1] = mmNIC4_QM0_BASE,1632[GAUDI2_QUEUE_ID_NIC_8_2] = mmNIC4_QM0_BASE,1633[GAUDI2_QUEUE_ID_NIC_8_3] = mmNIC4_QM0_BASE,1634[GAUDI2_QUEUE_ID_NIC_9_0] = mmNIC4_QM1_BASE,1635[GAUDI2_QUEUE_ID_NIC_9_1] = mmNIC4_QM1_BASE,1636[GAUDI2_QUEUE_ID_NIC_9_2] = mmNIC4_QM1_BASE,1637[GAUDI2_QUEUE_ID_NIC_9_3] = mmNIC4_QM1_BASE,1638[GAUDI2_QUEUE_ID_NIC_10_0] = mmNIC5_QM0_BASE,1639[GAUDI2_QUEUE_ID_NIC_10_1] = mmNIC5_QM0_BASE,1640[GAUDI2_QUEUE_ID_NIC_10_2] = mmNIC5_QM0_BASE,1641[GAUDI2_QUEUE_ID_NIC_10_3] = mmNIC5_QM0_BASE,1642[GAUDI2_QUEUE_ID_NIC_11_0] = mmNIC5_QM1_BASE,1643[GAUDI2_QUEUE_ID_NIC_11_1] = mmNIC5_QM1_BASE,1644[GAUDI2_QUEUE_ID_NIC_11_2] = mmNIC5_QM1_BASE,1645[GAUDI2_QUEUE_ID_NIC_11_3] = mmNIC5_QM1_BASE,1646[GAUDI2_QUEUE_ID_NIC_12_0] = mmNIC6_QM0_BASE,1647[GAUDI2_QUEUE_ID_NIC_12_1] = mmNIC6_QM0_BASE,1648[GAUDI2_QUEUE_ID_NIC_12_2] = mmNIC6_QM0_BASE,1649[GAUDI2_QUEUE_ID_NIC_12_3] = mmNIC6_QM0_BASE,1650[GAUDI2_QUEUE_ID_NIC_13_0] = mmNIC6_QM1_BASE,1651[GAUDI2_QUEUE_ID_NIC_13_1] = mmNIC6_QM1_BASE,1652[GAUDI2_QUEUE_ID_NIC_13_2] = mmNIC6_QM1_BASE,1653[GAUDI2_QUEUE_ID_NIC_13_3] = mmNIC6_QM1_BASE,1654[GAUDI2_QUEUE_ID_NIC_14_0] = mmNIC7_QM0_BASE,1655[GAUDI2_QUEUE_ID_NIC_14_1] = mmNIC7_QM0_BASE,1656[GAUDI2_QUEUE_ID_NIC_14_2] = mmNIC7_QM0_BASE,1657[GAUDI2_QUEUE_ID_NIC_14_3] = mmNIC7_QM0_BASE,1658[GAUDI2_QUEUE_ID_NIC_15_0] = mmNIC7_QM1_BASE,1659[GAUDI2_QUEUE_ID_NIC_15_1] = mmNIC7_QM1_BASE,1660[GAUDI2_QUEUE_ID_NIC_15_2] = mmNIC7_QM1_BASE,1661[GAUDI2_QUEUE_ID_NIC_15_3] = mmNIC7_QM1_BASE,1662[GAUDI2_QUEUE_ID_NIC_16_0] = mmNIC8_QM0_BASE,1663[GAUDI2_QUEUE_ID_NIC_16_1] = mmNIC8_QM0_BASE,1664[GAUDI2_QUEUE_ID_NIC_16_2] = mmNIC8_QM0_BASE,1665[GAUDI2_QUEUE_ID_NIC_16_3] = mmNIC8_QM0_BASE,1666[GAUDI2_QUEUE_ID_NIC_17_0] = mmNIC8_QM1_BASE,1667[GAUDI2_QUEUE_ID_NIC_17_1] = mmNIC8_QM1_BASE,1668[GAUDI2_QUEUE_ID_NIC_17_2] = mmNIC8_QM1_BASE,1669[GAUDI2_QUEUE_ID_NIC_17_3] = mmNIC8_QM1_BASE,1670[GAUDI2_QUEUE_ID_NIC_18_0] = mmNIC9_QM0_BASE,1671[GAUDI2_QUEUE_ID_NIC_18_1] = mmNIC9_QM0_BASE,1672[GAUDI2_QUEUE_ID_NIC_18_2] = mmNIC9_QM0_BASE,1673[GAUDI2_QUEUE_ID_NIC_18_3] = mmNIC9_QM0_BASE,1674[GAUDI2_QUEUE_ID_NIC_19_0] = mmNIC9_QM1_BASE,1675[GAUDI2_QUEUE_ID_NIC_19_1] = mmNIC9_QM1_BASE,1676[GAUDI2_QUEUE_ID_NIC_19_2] = mmNIC9_QM1_BASE,1677[GAUDI2_QUEUE_ID_NIC_19_3] = mmNIC9_QM1_BASE,1678[GAUDI2_QUEUE_ID_NIC_20_0] = mmNIC10_QM0_BASE,1679[GAUDI2_QUEUE_ID_NIC_20_1] = mmNIC10_QM0_BASE,1680[GAUDI2_QUEUE_ID_NIC_20_2] = mmNIC10_QM0_BASE,1681[GAUDI2_QUEUE_ID_NIC_20_3] = mmNIC10_QM0_BASE,1682[GAUDI2_QUEUE_ID_NIC_21_0] = mmNIC10_QM1_BASE,1683[GAUDI2_QUEUE_ID_NIC_21_1] = mmNIC10_QM1_BASE,1684[GAUDI2_QUEUE_ID_NIC_21_2] = mmNIC10_QM1_BASE,1685[GAUDI2_QUEUE_ID_NIC_21_3] = mmNIC10_QM1_BASE,1686[GAUDI2_QUEUE_ID_NIC_22_0] = mmNIC11_QM0_BASE,1687[GAUDI2_QUEUE_ID_NIC_22_1] = mmNIC11_QM0_BASE,1688[GAUDI2_QUEUE_ID_NIC_22_2] = mmNIC11_QM0_BASE,1689[GAUDI2_QUEUE_ID_NIC_22_3] = mmNIC11_QM0_BASE,1690[GAUDI2_QUEUE_ID_NIC_23_0] = mmNIC11_QM1_BASE,1691[GAUDI2_QUEUE_ID_NIC_23_1] = mmNIC11_QM1_BASE,1692[GAUDI2_QUEUE_ID_NIC_23_2] = mmNIC11_QM1_BASE,1693[GAUDI2_QUEUE_ID_NIC_23_3] = mmNIC11_QM1_BASE,1694[GAUDI2_QUEUE_ID_ROT_0_0] = mmROT0_QM_BASE,1695[GAUDI2_QUEUE_ID_ROT_0_1] = mmROT0_QM_BASE,1696[GAUDI2_QUEUE_ID_ROT_0_2] = mmROT0_QM_BASE,1697[GAUDI2_QUEUE_ID_ROT_0_3] = mmROT0_QM_BASE,1698[GAUDI2_QUEUE_ID_ROT_1_0] = mmROT1_QM_BASE,1699[GAUDI2_QUEUE_ID_ROT_1_1] = mmROT1_QM_BASE,1700[GAUDI2_QUEUE_ID_ROT_1_2] = mmROT1_QM_BASE,1701[GAUDI2_QUEUE_ID_ROT_1_3] = mmROT1_QM_BASE1702};17031704static const u32 gaudi2_arc_blocks_bases[NUM_ARC_CPUS] = {1705[CPU_ID_SCHED_ARC0] = mmARC_FARM_ARC0_AUX_BASE,1706[CPU_ID_SCHED_ARC1] = mmARC_FARM_ARC1_AUX_BASE,1707[CPU_ID_SCHED_ARC2] = mmARC_FARM_ARC2_AUX_BASE,1708[CPU_ID_SCHED_ARC3] = mmARC_FARM_ARC3_AUX_BASE,1709[CPU_ID_SCHED_ARC4] = mmDCORE1_MME_QM_ARC_AUX_BASE,1710[CPU_ID_SCHED_ARC5] = mmDCORE3_MME_QM_ARC_AUX_BASE,1711[CPU_ID_TPC_QMAN_ARC0] = mmDCORE0_TPC0_QM_ARC_AUX_BASE,1712[CPU_ID_TPC_QMAN_ARC1] = mmDCORE0_TPC1_QM_ARC_AUX_BASE,1713[CPU_ID_TPC_QMAN_ARC2] = mmDCORE0_TPC2_QM_ARC_AUX_BASE,1714[CPU_ID_TPC_QMAN_ARC3] = mmDCORE0_TPC3_QM_ARC_AUX_BASE,1715[CPU_ID_TPC_QMAN_ARC4] = mmDCORE0_TPC4_QM_ARC_AUX_BASE,1716[CPU_ID_TPC_QMAN_ARC5] = mmDCORE0_TPC5_QM_ARC_AUX_BASE,1717[CPU_ID_TPC_QMAN_ARC6] = mmDCORE1_TPC0_QM_ARC_AUX_BASE,1718[CPU_ID_TPC_QMAN_ARC7] = mmDCORE1_TPC1_QM_ARC_AUX_BASE,1719[CPU_ID_TPC_QMAN_ARC8] = mmDCORE1_TPC2_QM_ARC_AUX_BASE,1720[CPU_ID_TPC_QMAN_ARC9] = mmDCORE1_TPC3_QM_ARC_AUX_BASE,1721[CPU_ID_TPC_QMAN_ARC10] = mmDCORE1_TPC4_QM_ARC_AUX_BASE,1722[CPU_ID_TPC_QMAN_ARC11] = mmDCORE1_TPC5_QM_ARC_AUX_BASE,1723[CPU_ID_TPC_QMAN_ARC12] = mmDCORE2_TPC0_QM_ARC_AUX_BASE,1724[CPU_ID_TPC_QMAN_ARC13] = mmDCORE2_TPC1_QM_ARC_AUX_BASE,1725[CPU_ID_TPC_QMAN_ARC14] = mmDCORE2_TPC2_QM_ARC_AUX_BASE,1726[CPU_ID_TPC_QMAN_ARC15] = mmDCORE2_TPC3_QM_ARC_AUX_BASE,1727[CPU_ID_TPC_QMAN_ARC16] = mmDCORE2_TPC4_QM_ARC_AUX_BASE,1728[CPU_ID_TPC_QMAN_ARC17] = mmDCORE2_TPC5_QM_ARC_AUX_BASE,1729[CPU_ID_TPC_QMAN_ARC18] = mmDCORE3_TPC0_QM_ARC_AUX_BASE,1730[CPU_ID_TPC_QMAN_ARC19] = mmDCORE3_TPC1_QM_ARC_AUX_BASE,1731[CPU_ID_TPC_QMAN_ARC20] = mmDCORE3_TPC2_QM_ARC_AUX_BASE,1732[CPU_ID_TPC_QMAN_ARC21] = mmDCORE3_TPC3_QM_ARC_AUX_BASE,1733[CPU_ID_TPC_QMAN_ARC22] = mmDCORE3_TPC4_QM_ARC_AUX_BASE,1734[CPU_ID_TPC_QMAN_ARC23] = mmDCORE3_TPC5_QM_ARC_AUX_BASE,1735[CPU_ID_TPC_QMAN_ARC24] = mmDCORE0_TPC6_QM_ARC_AUX_BASE,1736[CPU_ID_MME_QMAN_ARC0] = mmDCORE0_MME_QM_ARC_AUX_BASE,1737[CPU_ID_MME_QMAN_ARC1] = mmDCORE2_MME_QM_ARC_AUX_BASE,1738[CPU_ID_EDMA_QMAN_ARC0] = mmDCORE0_EDMA0_QM_ARC_AUX_BASE,1739[CPU_ID_EDMA_QMAN_ARC1] = mmDCORE0_EDMA1_QM_ARC_AUX_BASE,1740[CPU_ID_EDMA_QMAN_ARC2] = mmDCORE1_EDMA0_QM_ARC_AUX_BASE,1741[CPU_ID_EDMA_QMAN_ARC3] = mmDCORE1_EDMA1_QM_ARC_AUX_BASE,1742[CPU_ID_EDMA_QMAN_ARC4] = mmDCORE2_EDMA0_QM_ARC_AUX_BASE,1743[CPU_ID_EDMA_QMAN_ARC5] = mmDCORE2_EDMA1_QM_ARC_AUX_BASE,1744[CPU_ID_EDMA_QMAN_ARC6] = mmDCORE3_EDMA0_QM_ARC_AUX_BASE,1745[CPU_ID_EDMA_QMAN_ARC7] = mmDCORE3_EDMA1_QM_ARC_AUX_BASE,1746[CPU_ID_PDMA_QMAN_ARC0] = mmPDMA0_QM_ARC_AUX_BASE,1747[CPU_ID_PDMA_QMAN_ARC1] = mmPDMA1_QM_ARC_AUX_BASE,1748[CPU_ID_ROT_QMAN_ARC0] = mmROT0_QM_ARC_AUX_BASE,1749[CPU_ID_ROT_QMAN_ARC1] = mmROT1_QM_ARC_AUX_BASE,1750[CPU_ID_NIC_QMAN_ARC0] = mmNIC0_QM_ARC_AUX0_BASE,1751[CPU_ID_NIC_QMAN_ARC1] = mmNIC0_QM_ARC_AUX1_BASE,1752[CPU_ID_NIC_QMAN_ARC2] = mmNIC1_QM_ARC_AUX0_BASE,1753[CPU_ID_NIC_QMAN_ARC3] = mmNIC1_QM_ARC_AUX1_BASE,1754[CPU_ID_NIC_QMAN_ARC4] = mmNIC2_QM_ARC_AUX0_BASE,1755[CPU_ID_NIC_QMAN_ARC5] = mmNIC2_QM_ARC_AUX1_BASE,1756[CPU_ID_NIC_QMAN_ARC6] = mmNIC3_QM_ARC_AUX0_BASE,1757[CPU_ID_NIC_QMAN_ARC7] = mmNIC3_QM_ARC_AUX1_BASE,1758[CPU_ID_NIC_QMAN_ARC8] = mmNIC4_QM_ARC_AUX0_BASE,1759[CPU_ID_NIC_QMAN_ARC9] = mmNIC4_QM_ARC_AUX1_BASE,1760[CPU_ID_NIC_QMAN_ARC10] = mmNIC5_QM_ARC_AUX0_BASE,1761[CPU_ID_NIC_QMAN_ARC11] = mmNIC5_QM_ARC_AUX1_BASE,1762[CPU_ID_NIC_QMAN_ARC12] = mmNIC6_QM_ARC_AUX0_BASE,1763[CPU_ID_NIC_QMAN_ARC13] = mmNIC6_QM_ARC_AUX1_BASE,1764[CPU_ID_NIC_QMAN_ARC14] = mmNIC7_QM_ARC_AUX0_BASE,1765[CPU_ID_NIC_QMAN_ARC15] = mmNIC7_QM_ARC_AUX1_BASE,1766[CPU_ID_NIC_QMAN_ARC16] = mmNIC8_QM_ARC_AUX0_BASE,1767[CPU_ID_NIC_QMAN_ARC17] = mmNIC8_QM_ARC_AUX1_BASE,1768[CPU_ID_NIC_QMAN_ARC18] = mmNIC9_QM_ARC_AUX0_BASE,1769[CPU_ID_NIC_QMAN_ARC19] = mmNIC9_QM_ARC_AUX1_BASE,1770[CPU_ID_NIC_QMAN_ARC20] = mmNIC10_QM_ARC_AUX0_BASE,1771[CPU_ID_NIC_QMAN_ARC21] = mmNIC10_QM_ARC_AUX1_BASE,1772[CPU_ID_NIC_QMAN_ARC22] = mmNIC11_QM_ARC_AUX0_BASE,1773[CPU_ID_NIC_QMAN_ARC23] = mmNIC11_QM_ARC_AUX1_BASE,1774};17751776static const u32 gaudi2_arc_dccm_bases[NUM_ARC_CPUS] = {1777[CPU_ID_SCHED_ARC0] = mmARC_FARM_ARC0_DCCM0_BASE,1778[CPU_ID_SCHED_ARC1] = mmARC_FARM_ARC1_DCCM0_BASE,1779[CPU_ID_SCHED_ARC2] = mmARC_FARM_ARC2_DCCM0_BASE,1780[CPU_ID_SCHED_ARC3] = mmARC_FARM_ARC3_DCCM0_BASE,1781[CPU_ID_SCHED_ARC4] = mmDCORE1_MME_QM_ARC_DCCM_BASE,1782[CPU_ID_SCHED_ARC5] = mmDCORE3_MME_QM_ARC_DCCM_BASE,1783[CPU_ID_TPC_QMAN_ARC0] = mmDCORE0_TPC0_QM_DCCM_BASE,1784[CPU_ID_TPC_QMAN_ARC1] = mmDCORE0_TPC1_QM_DCCM_BASE,1785[CPU_ID_TPC_QMAN_ARC2] = mmDCORE0_TPC2_QM_DCCM_BASE,1786[CPU_ID_TPC_QMAN_ARC3] = mmDCORE0_TPC3_QM_DCCM_BASE,1787[CPU_ID_TPC_QMAN_ARC4] = mmDCORE0_TPC4_QM_DCCM_BASE,1788[CPU_ID_TPC_QMAN_ARC5] = mmDCORE0_TPC5_QM_DCCM_BASE,1789[CPU_ID_TPC_QMAN_ARC6] = mmDCORE1_TPC0_QM_DCCM_BASE,1790[CPU_ID_TPC_QMAN_ARC7] = mmDCORE1_TPC1_QM_DCCM_BASE,1791[CPU_ID_TPC_QMAN_ARC8] = mmDCORE1_TPC2_QM_DCCM_BASE,1792[CPU_ID_TPC_QMAN_ARC9] = mmDCORE1_TPC3_QM_DCCM_BASE,1793[CPU_ID_TPC_QMAN_ARC10] = mmDCORE1_TPC4_QM_DCCM_BASE,1794[CPU_ID_TPC_QMAN_ARC11] = mmDCORE1_TPC5_QM_DCCM_BASE,1795[CPU_ID_TPC_QMAN_ARC12] = mmDCORE2_TPC0_QM_DCCM_BASE,1796[CPU_ID_TPC_QMAN_ARC13] = mmDCORE2_TPC1_QM_DCCM_BASE,1797[CPU_ID_TPC_QMAN_ARC14] = mmDCORE2_TPC2_QM_DCCM_BASE,1798[CPU_ID_TPC_QMAN_ARC15] = mmDCORE2_TPC3_QM_DCCM_BASE,1799[CPU_ID_TPC_QMAN_ARC16] = mmDCORE2_TPC4_QM_DCCM_BASE,1800[CPU_ID_TPC_QMAN_ARC17] = mmDCORE2_TPC5_QM_DCCM_BASE,1801[CPU_ID_TPC_QMAN_ARC18] = mmDCORE3_TPC0_QM_DCCM_BASE,1802[CPU_ID_TPC_QMAN_ARC19] = mmDCORE3_TPC1_QM_DCCM_BASE,1803[CPU_ID_TPC_QMAN_ARC20] = mmDCORE3_TPC2_QM_DCCM_BASE,1804[CPU_ID_TPC_QMAN_ARC21] = mmDCORE3_TPC3_QM_DCCM_BASE,1805[CPU_ID_TPC_QMAN_ARC22] = mmDCORE3_TPC4_QM_DCCM_BASE,1806[CPU_ID_TPC_QMAN_ARC23] = mmDCORE3_TPC5_QM_DCCM_BASE,1807[CPU_ID_TPC_QMAN_ARC24] = mmDCORE0_TPC6_QM_DCCM_BASE,1808[CPU_ID_MME_QMAN_ARC0] = mmDCORE0_MME_QM_ARC_DCCM_BASE,1809[CPU_ID_MME_QMAN_ARC1] = mmDCORE2_MME_QM_ARC_DCCM_BASE,1810[CPU_ID_EDMA_QMAN_ARC0] = mmDCORE0_EDMA0_QM_DCCM_BASE,1811[CPU_ID_EDMA_QMAN_ARC1] = mmDCORE0_EDMA1_QM_DCCM_BASE,1812[CPU_ID_EDMA_QMAN_ARC2] = mmDCORE1_EDMA0_QM_DCCM_BASE,1813[CPU_ID_EDMA_QMAN_ARC3] = mmDCORE1_EDMA1_QM_DCCM_BASE,1814[CPU_ID_EDMA_QMAN_ARC4] = mmDCORE2_EDMA0_QM_DCCM_BASE,1815[CPU_ID_EDMA_QMAN_ARC5] = mmDCORE2_EDMA1_QM_DCCM_BASE,1816[CPU_ID_EDMA_QMAN_ARC6] = mmDCORE3_EDMA0_QM_DCCM_BASE,1817[CPU_ID_EDMA_QMAN_ARC7] = mmDCORE3_EDMA1_QM_DCCM_BASE,1818[CPU_ID_PDMA_QMAN_ARC0] = mmPDMA0_QM_ARC_DCCM_BASE,1819[CPU_ID_PDMA_QMAN_ARC1] = mmPDMA1_QM_ARC_DCCM_BASE,1820[CPU_ID_ROT_QMAN_ARC0] = mmROT0_QM_ARC_DCCM_BASE,1821[CPU_ID_ROT_QMAN_ARC1] = mmROT1_QM_ARC_DCCM_BASE,1822[CPU_ID_NIC_QMAN_ARC0] = mmNIC0_QM_DCCM0_BASE,1823[CPU_ID_NIC_QMAN_ARC1] = mmNIC0_QM_DCCM1_BASE,1824[CPU_ID_NIC_QMAN_ARC2] = mmNIC1_QM_DCCM0_BASE,1825[CPU_ID_NIC_QMAN_ARC3] = mmNIC1_QM_DCCM1_BASE,1826[CPU_ID_NIC_QMAN_ARC4] = mmNIC2_QM_DCCM0_BASE,1827[CPU_ID_NIC_QMAN_ARC5] = mmNIC2_QM_DCCM1_BASE,1828[CPU_ID_NIC_QMAN_ARC6] = mmNIC3_QM_DCCM0_BASE,1829[CPU_ID_NIC_QMAN_ARC7] = mmNIC3_QM_DCCM1_BASE,1830[CPU_ID_NIC_QMAN_ARC8] = mmNIC4_QM_DCCM0_BASE,1831[CPU_ID_NIC_QMAN_ARC9] = mmNIC4_QM_DCCM1_BASE,1832[CPU_ID_NIC_QMAN_ARC10] = mmNIC5_QM_DCCM0_BASE,1833[CPU_ID_NIC_QMAN_ARC11] = mmNIC5_QM_DCCM1_BASE,1834[CPU_ID_NIC_QMAN_ARC12] = mmNIC6_QM_DCCM0_BASE,1835[CPU_ID_NIC_QMAN_ARC13] = mmNIC6_QM_DCCM1_BASE,1836[CPU_ID_NIC_QMAN_ARC14] = mmNIC7_QM_DCCM0_BASE,1837[CPU_ID_NIC_QMAN_ARC15] = mmNIC7_QM_DCCM1_BASE,1838[CPU_ID_NIC_QMAN_ARC16] = mmNIC8_QM_DCCM0_BASE,1839[CPU_ID_NIC_QMAN_ARC17] = mmNIC8_QM_DCCM1_BASE,1840[CPU_ID_NIC_QMAN_ARC18] = mmNIC9_QM_DCCM0_BASE,1841[CPU_ID_NIC_QMAN_ARC19] = mmNIC9_QM_DCCM1_BASE,1842[CPU_ID_NIC_QMAN_ARC20] = mmNIC10_QM_DCCM0_BASE,1843[CPU_ID_NIC_QMAN_ARC21] = mmNIC10_QM_DCCM1_BASE,1844[CPU_ID_NIC_QMAN_ARC22] = mmNIC11_QM_DCCM0_BASE,1845[CPU_ID_NIC_QMAN_ARC23] = mmNIC11_QM_DCCM1_BASE,1846};18471848const u32 gaudi2_mme_ctrl_lo_blocks_bases[MME_ID_SIZE] = {1849[MME_ID_DCORE0] = mmDCORE0_MME_CTRL_LO_BASE,1850[MME_ID_DCORE1] = mmDCORE1_MME_CTRL_LO_BASE,1851[MME_ID_DCORE2] = mmDCORE2_MME_CTRL_LO_BASE,1852[MME_ID_DCORE3] = mmDCORE3_MME_CTRL_LO_BASE,1853};18541855static const u32 gaudi2_queue_id_to_arc_id[GAUDI2_QUEUE_ID_SIZE] = {1856[GAUDI2_QUEUE_ID_PDMA_0_0] = CPU_ID_PDMA_QMAN_ARC0,1857[GAUDI2_QUEUE_ID_PDMA_0_1] = CPU_ID_PDMA_QMAN_ARC0,1858[GAUDI2_QUEUE_ID_PDMA_0_2] = CPU_ID_PDMA_QMAN_ARC0,1859[GAUDI2_QUEUE_ID_PDMA_0_3] = CPU_ID_PDMA_QMAN_ARC0,1860[GAUDI2_QUEUE_ID_PDMA_1_0] = CPU_ID_PDMA_QMAN_ARC1,1861[GAUDI2_QUEUE_ID_PDMA_1_1] = CPU_ID_PDMA_QMAN_ARC1,1862[GAUDI2_QUEUE_ID_PDMA_1_2] = CPU_ID_PDMA_QMAN_ARC1,1863[GAUDI2_QUEUE_ID_PDMA_1_3] = CPU_ID_PDMA_QMAN_ARC1,1864[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC0,1865[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC0,1866[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC0,1867[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC0,1868[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC1,1869[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC1,1870[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC1,1871[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC1,1872[GAUDI2_QUEUE_ID_DCORE0_MME_0_0] = CPU_ID_MME_QMAN_ARC0,1873[GAUDI2_QUEUE_ID_DCORE0_MME_0_1] = CPU_ID_MME_QMAN_ARC0,1874[GAUDI2_QUEUE_ID_DCORE0_MME_0_2] = CPU_ID_MME_QMAN_ARC0,1875[GAUDI2_QUEUE_ID_DCORE0_MME_0_3] = CPU_ID_MME_QMAN_ARC0,1876[GAUDI2_QUEUE_ID_DCORE0_TPC_0_0] = CPU_ID_TPC_QMAN_ARC0,1877[GAUDI2_QUEUE_ID_DCORE0_TPC_0_1] = CPU_ID_TPC_QMAN_ARC0,1878[GAUDI2_QUEUE_ID_DCORE0_TPC_0_2] = CPU_ID_TPC_QMAN_ARC0,1879[GAUDI2_QUEUE_ID_DCORE0_TPC_0_3] = CPU_ID_TPC_QMAN_ARC0,1880[GAUDI2_QUEUE_ID_DCORE0_TPC_1_0] = CPU_ID_TPC_QMAN_ARC1,1881[GAUDI2_QUEUE_ID_DCORE0_TPC_1_1] = CPU_ID_TPC_QMAN_ARC1,1882[GAUDI2_QUEUE_ID_DCORE0_TPC_1_2] = CPU_ID_TPC_QMAN_ARC1,1883[GAUDI2_QUEUE_ID_DCORE0_TPC_1_3] = CPU_ID_TPC_QMAN_ARC1,1884[GAUDI2_QUEUE_ID_DCORE0_TPC_2_0] = CPU_ID_TPC_QMAN_ARC2,1885[GAUDI2_QUEUE_ID_DCORE0_TPC_2_1] = CPU_ID_TPC_QMAN_ARC2,1886[GAUDI2_QUEUE_ID_DCORE0_TPC_2_2] = CPU_ID_TPC_QMAN_ARC2,1887[GAUDI2_QUEUE_ID_DCORE0_TPC_2_3] = CPU_ID_TPC_QMAN_ARC2,1888[GAUDI2_QUEUE_ID_DCORE0_TPC_3_0] = CPU_ID_TPC_QMAN_ARC3,1889[GAUDI2_QUEUE_ID_DCORE0_TPC_3_1] = CPU_ID_TPC_QMAN_ARC3,1890[GAUDI2_QUEUE_ID_DCORE0_TPC_3_2] = CPU_ID_TPC_QMAN_ARC3,1891[GAUDI2_QUEUE_ID_DCORE0_TPC_3_3] = CPU_ID_TPC_QMAN_ARC3,1892[GAUDI2_QUEUE_ID_DCORE0_TPC_4_0] = CPU_ID_TPC_QMAN_ARC4,1893[GAUDI2_QUEUE_ID_DCORE0_TPC_4_1] = CPU_ID_TPC_QMAN_ARC4,1894[GAUDI2_QUEUE_ID_DCORE0_TPC_4_2] = CPU_ID_TPC_QMAN_ARC4,1895[GAUDI2_QUEUE_ID_DCORE0_TPC_4_3] = CPU_ID_TPC_QMAN_ARC4,1896[GAUDI2_QUEUE_ID_DCORE0_TPC_5_0] = CPU_ID_TPC_QMAN_ARC5,1897[GAUDI2_QUEUE_ID_DCORE0_TPC_5_1] = CPU_ID_TPC_QMAN_ARC5,1898[GAUDI2_QUEUE_ID_DCORE0_TPC_5_2] = CPU_ID_TPC_QMAN_ARC5,1899[GAUDI2_QUEUE_ID_DCORE0_TPC_5_3] = CPU_ID_TPC_QMAN_ARC5,1900[GAUDI2_QUEUE_ID_DCORE0_TPC_6_0] = CPU_ID_TPC_QMAN_ARC24,1901[GAUDI2_QUEUE_ID_DCORE0_TPC_6_1] = CPU_ID_TPC_QMAN_ARC24,1902[GAUDI2_QUEUE_ID_DCORE0_TPC_6_2] = CPU_ID_TPC_QMAN_ARC24,1903[GAUDI2_QUEUE_ID_DCORE0_TPC_6_3] = CPU_ID_TPC_QMAN_ARC24,1904[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC2,1905[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC2,1906[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC2,1907[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC2,1908[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC3,1909[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC3,1910[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC3,1911[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC3,1912[GAUDI2_QUEUE_ID_DCORE1_MME_0_0] = CPU_ID_SCHED_ARC4,1913[GAUDI2_QUEUE_ID_DCORE1_MME_0_1] = CPU_ID_SCHED_ARC4,1914[GAUDI2_QUEUE_ID_DCORE1_MME_0_2] = CPU_ID_SCHED_ARC4,1915[GAUDI2_QUEUE_ID_DCORE1_MME_0_3] = CPU_ID_SCHED_ARC4,1916[GAUDI2_QUEUE_ID_DCORE1_TPC_0_0] = CPU_ID_TPC_QMAN_ARC6,1917[GAUDI2_QUEUE_ID_DCORE1_TPC_0_1] = CPU_ID_TPC_QMAN_ARC6,1918[GAUDI2_QUEUE_ID_DCORE1_TPC_0_2] = CPU_ID_TPC_QMAN_ARC6,1919[GAUDI2_QUEUE_ID_DCORE1_TPC_0_3] = CPU_ID_TPC_QMAN_ARC6,1920[GAUDI2_QUEUE_ID_DCORE1_TPC_1_0] = CPU_ID_TPC_QMAN_ARC7,1921[GAUDI2_QUEUE_ID_DCORE1_TPC_1_1] = CPU_ID_TPC_QMAN_ARC7,1922[GAUDI2_QUEUE_ID_DCORE1_TPC_1_2] = CPU_ID_TPC_QMAN_ARC7,1923[GAUDI2_QUEUE_ID_DCORE1_TPC_1_3] = CPU_ID_TPC_QMAN_ARC7,1924[GAUDI2_QUEUE_ID_DCORE1_TPC_2_0] = CPU_ID_TPC_QMAN_ARC8,1925[GAUDI2_QUEUE_ID_DCORE1_TPC_2_1] = CPU_ID_TPC_QMAN_ARC8,1926[GAUDI2_QUEUE_ID_DCORE1_TPC_2_2] = CPU_ID_TPC_QMAN_ARC8,1927[GAUDI2_QUEUE_ID_DCORE1_TPC_2_3] = CPU_ID_TPC_QMAN_ARC8,1928[GAUDI2_QUEUE_ID_DCORE1_TPC_3_0] = CPU_ID_TPC_QMAN_ARC9,1929[GAUDI2_QUEUE_ID_DCORE1_TPC_3_1] = CPU_ID_TPC_QMAN_ARC9,1930[GAUDI2_QUEUE_ID_DCORE1_TPC_3_2] = CPU_ID_TPC_QMAN_ARC9,1931[GAUDI2_QUEUE_ID_DCORE1_TPC_3_3] = CPU_ID_TPC_QMAN_ARC9,1932[GAUDI2_QUEUE_ID_DCORE1_TPC_4_0] = CPU_ID_TPC_QMAN_ARC10,1933[GAUDI2_QUEUE_ID_DCORE1_TPC_4_1] = CPU_ID_TPC_QMAN_ARC10,1934[GAUDI2_QUEUE_ID_DCORE1_TPC_4_2] = CPU_ID_TPC_QMAN_ARC10,1935[GAUDI2_QUEUE_ID_DCORE1_TPC_4_3] = CPU_ID_TPC_QMAN_ARC10,1936[GAUDI2_QUEUE_ID_DCORE1_TPC_5_0] = CPU_ID_TPC_QMAN_ARC11,1937[GAUDI2_QUEUE_ID_DCORE1_TPC_5_1] = CPU_ID_TPC_QMAN_ARC11,1938[GAUDI2_QUEUE_ID_DCORE1_TPC_5_2] = CPU_ID_TPC_QMAN_ARC11,1939[GAUDI2_QUEUE_ID_DCORE1_TPC_5_3] = CPU_ID_TPC_QMAN_ARC11,1940[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC4,1941[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC4,1942[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC4,1943[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC4,1944[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC5,1945[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC5,1946[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC5,1947[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC5,1948[GAUDI2_QUEUE_ID_DCORE2_MME_0_0] = CPU_ID_MME_QMAN_ARC1,1949[GAUDI2_QUEUE_ID_DCORE2_MME_0_1] = CPU_ID_MME_QMAN_ARC1,1950[GAUDI2_QUEUE_ID_DCORE2_MME_0_2] = CPU_ID_MME_QMAN_ARC1,1951[GAUDI2_QUEUE_ID_DCORE2_MME_0_3] = CPU_ID_MME_QMAN_ARC1,1952[GAUDI2_QUEUE_ID_DCORE2_TPC_0_0] = CPU_ID_TPC_QMAN_ARC12,1953[GAUDI2_QUEUE_ID_DCORE2_TPC_0_1] = CPU_ID_TPC_QMAN_ARC12,1954[GAUDI2_QUEUE_ID_DCORE2_TPC_0_2] = CPU_ID_TPC_QMAN_ARC12,1955[GAUDI2_QUEUE_ID_DCORE2_TPC_0_3] = CPU_ID_TPC_QMAN_ARC12,1956[GAUDI2_QUEUE_ID_DCORE2_TPC_1_0] = CPU_ID_TPC_QMAN_ARC13,1957[GAUDI2_QUEUE_ID_DCORE2_TPC_1_1] = CPU_ID_TPC_QMAN_ARC13,1958[GAUDI2_QUEUE_ID_DCORE2_TPC_1_2] = CPU_ID_TPC_QMAN_ARC13,1959[GAUDI2_QUEUE_ID_DCORE2_TPC_1_3] = CPU_ID_TPC_QMAN_ARC13,1960[GAUDI2_QUEUE_ID_DCORE2_TPC_2_0] = CPU_ID_TPC_QMAN_ARC14,1961[GAUDI2_QUEUE_ID_DCORE2_TPC_2_1] = CPU_ID_TPC_QMAN_ARC14,1962[GAUDI2_QUEUE_ID_DCORE2_TPC_2_2] = CPU_ID_TPC_QMAN_ARC14,1963[GAUDI2_QUEUE_ID_DCORE2_TPC_2_3] = CPU_ID_TPC_QMAN_ARC14,1964[GAUDI2_QUEUE_ID_DCORE2_TPC_3_0] = CPU_ID_TPC_QMAN_ARC15,1965[GAUDI2_QUEUE_ID_DCORE2_TPC_3_1] = CPU_ID_TPC_QMAN_ARC15,1966[GAUDI2_QUEUE_ID_DCORE2_TPC_3_2] = CPU_ID_TPC_QMAN_ARC15,1967[GAUDI2_QUEUE_ID_DCORE2_TPC_3_3] = CPU_ID_TPC_QMAN_ARC15,1968[GAUDI2_QUEUE_ID_DCORE2_TPC_4_0] = CPU_ID_TPC_QMAN_ARC16,1969[GAUDI2_QUEUE_ID_DCORE2_TPC_4_1] = CPU_ID_TPC_QMAN_ARC16,1970[GAUDI2_QUEUE_ID_DCORE2_TPC_4_2] = CPU_ID_TPC_QMAN_ARC16,1971[GAUDI2_QUEUE_ID_DCORE2_TPC_4_3] = CPU_ID_TPC_QMAN_ARC16,1972[GAUDI2_QUEUE_ID_DCORE2_TPC_5_0] = CPU_ID_TPC_QMAN_ARC17,1973[GAUDI2_QUEUE_ID_DCORE2_TPC_5_1] = CPU_ID_TPC_QMAN_ARC17,1974[GAUDI2_QUEUE_ID_DCORE2_TPC_5_2] = CPU_ID_TPC_QMAN_ARC17,1975[GAUDI2_QUEUE_ID_DCORE2_TPC_5_3] = CPU_ID_TPC_QMAN_ARC17,1976[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC6,1977[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC6,1978[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC6,1979[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC6,1980[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC7,1981[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC7,1982[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC7,1983[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC7,1984[GAUDI2_QUEUE_ID_DCORE3_MME_0_0] = CPU_ID_SCHED_ARC5,1985[GAUDI2_QUEUE_ID_DCORE3_MME_0_1] = CPU_ID_SCHED_ARC5,1986[GAUDI2_QUEUE_ID_DCORE3_MME_0_2] = CPU_ID_SCHED_ARC5,1987[GAUDI2_QUEUE_ID_DCORE3_MME_0_3] = CPU_ID_SCHED_ARC5,1988[GAUDI2_QUEUE_ID_DCORE3_TPC_0_0] = CPU_ID_TPC_QMAN_ARC18,1989[GAUDI2_QUEUE_ID_DCORE3_TPC_0_1] = CPU_ID_TPC_QMAN_ARC18,1990[GAUDI2_QUEUE_ID_DCORE3_TPC_0_2] = CPU_ID_TPC_QMAN_ARC18,1991[GAUDI2_QUEUE_ID_DCORE3_TPC_0_3] = CPU_ID_TPC_QMAN_ARC18,1992[GAUDI2_QUEUE_ID_DCORE3_TPC_1_0] = CPU_ID_TPC_QMAN_ARC19,1993[GAUDI2_QUEUE_ID_DCORE3_TPC_1_1] = CPU_ID_TPC_QMAN_ARC19,1994[GAUDI2_QUEUE_ID_DCORE3_TPC_1_2] = CPU_ID_TPC_QMAN_ARC19,1995[GAUDI2_QUEUE_ID_DCORE3_TPC_1_3] = CPU_ID_TPC_QMAN_ARC19,1996[GAUDI2_QUEUE_ID_DCORE3_TPC_2_0] = CPU_ID_TPC_QMAN_ARC20,1997[GAUDI2_QUEUE_ID_DCORE3_TPC_2_1] = CPU_ID_TPC_QMAN_ARC20,1998[GAUDI2_QUEUE_ID_DCORE3_TPC_2_2] = CPU_ID_TPC_QMAN_ARC20,1999[GAUDI2_QUEUE_ID_DCORE3_TPC_2_3] = CPU_ID_TPC_QMAN_ARC20,2000[GAUDI2_QUEUE_ID_DCORE3_TPC_3_0] = CPU_ID_TPC_QMAN_ARC21,2001[GAUDI2_QUEUE_ID_DCORE3_TPC_3_1] = CPU_ID_TPC_QMAN_ARC21,2002[GAUDI2_QUEUE_ID_DCORE3_TPC_3_2] = CPU_ID_TPC_QMAN_ARC21,2003[GAUDI2_QUEUE_ID_DCORE3_TPC_3_3] = CPU_ID_TPC_QMAN_ARC21,2004[GAUDI2_QUEUE_ID_DCORE3_TPC_4_0] = CPU_ID_TPC_QMAN_ARC22,2005[GAUDI2_QUEUE_ID_DCORE3_TPC_4_1] = CPU_ID_TPC_QMAN_ARC22,2006[GAUDI2_QUEUE_ID_DCORE3_TPC_4_2] = CPU_ID_TPC_QMAN_ARC22,2007[GAUDI2_QUEUE_ID_DCORE3_TPC_4_3] = CPU_ID_TPC_QMAN_ARC22,2008[GAUDI2_QUEUE_ID_DCORE3_TPC_5_0] = CPU_ID_TPC_QMAN_ARC23,2009[GAUDI2_QUEUE_ID_DCORE3_TPC_5_1] = CPU_ID_TPC_QMAN_ARC23,2010[GAUDI2_QUEUE_ID_DCORE3_TPC_5_2] = CPU_ID_TPC_QMAN_ARC23,2011[GAUDI2_QUEUE_ID_DCORE3_TPC_5_3] = CPU_ID_TPC_QMAN_ARC23,2012[GAUDI2_QUEUE_ID_NIC_0_0] = CPU_ID_NIC_QMAN_ARC0,2013[GAUDI2_QUEUE_ID_NIC_0_1] = CPU_ID_NIC_QMAN_ARC0,2014[GAUDI2_QUEUE_ID_NIC_0_2] = CPU_ID_NIC_QMAN_ARC0,2015[GAUDI2_QUEUE_ID_NIC_0_3] = CPU_ID_NIC_QMAN_ARC0,2016[GAUDI2_QUEUE_ID_NIC_1_0] = CPU_ID_NIC_QMAN_ARC1,2017[GAUDI2_QUEUE_ID_NIC_1_1] = CPU_ID_NIC_QMAN_ARC1,2018[GAUDI2_QUEUE_ID_NIC_1_2] = CPU_ID_NIC_QMAN_ARC1,2019[GAUDI2_QUEUE_ID_NIC_1_3] = CPU_ID_NIC_QMAN_ARC1,2020[GAUDI2_QUEUE_ID_NIC_2_0] = CPU_ID_NIC_QMAN_ARC2,2021[GAUDI2_QUEUE_ID_NIC_2_1] = CPU_ID_NIC_QMAN_ARC2,2022[GAUDI2_QUEUE_ID_NIC_2_2] = CPU_ID_NIC_QMAN_ARC2,2023[GAUDI2_QUEUE_ID_NIC_2_3] = CPU_ID_NIC_QMAN_ARC2,2024[GAUDI2_QUEUE_ID_NIC_3_0] = CPU_ID_NIC_QMAN_ARC3,2025[GAUDI2_QUEUE_ID_NIC_3_1] = CPU_ID_NIC_QMAN_ARC3,2026[GAUDI2_QUEUE_ID_NIC_3_2] = CPU_ID_NIC_QMAN_ARC3,2027[GAUDI2_QUEUE_ID_NIC_3_3] = CPU_ID_NIC_QMAN_ARC3,2028[GAUDI2_QUEUE_ID_NIC_4_0] = CPU_ID_NIC_QMAN_ARC4,2029[GAUDI2_QUEUE_ID_NIC_4_1] = CPU_ID_NIC_QMAN_ARC4,2030[GAUDI2_QUEUE_ID_NIC_4_2] = CPU_ID_NIC_QMAN_ARC4,2031[GAUDI2_QUEUE_ID_NIC_4_3] = CPU_ID_NIC_QMAN_ARC4,2032[GAUDI2_QUEUE_ID_NIC_5_0] = CPU_ID_NIC_QMAN_ARC5,2033[GAUDI2_QUEUE_ID_NIC_5_1] = CPU_ID_NIC_QMAN_ARC5,2034[GAUDI2_QUEUE_ID_NIC_5_2] = CPU_ID_NIC_QMAN_ARC5,2035[GAUDI2_QUEUE_ID_NIC_5_3] = CPU_ID_NIC_QMAN_ARC5,2036[GAUDI2_QUEUE_ID_NIC_6_0] = CPU_ID_NIC_QMAN_ARC6,2037[GAUDI2_QUEUE_ID_NIC_6_1] = CPU_ID_NIC_QMAN_ARC6,2038[GAUDI2_QUEUE_ID_NIC_6_2] = CPU_ID_NIC_QMAN_ARC6,2039[GAUDI2_QUEUE_ID_NIC_6_3] = CPU_ID_NIC_QMAN_ARC6,2040[GAUDI2_QUEUE_ID_NIC_7_0] = CPU_ID_NIC_QMAN_ARC7,2041[GAUDI2_QUEUE_ID_NIC_7_1] = CPU_ID_NIC_QMAN_ARC7,2042[GAUDI2_QUEUE_ID_NIC_7_2] = CPU_ID_NIC_QMAN_ARC7,2043[GAUDI2_QUEUE_ID_NIC_7_3] = CPU_ID_NIC_QMAN_ARC7,2044[GAUDI2_QUEUE_ID_NIC_8_0] = CPU_ID_NIC_QMAN_ARC8,2045[GAUDI2_QUEUE_ID_NIC_8_1] = CPU_ID_NIC_QMAN_ARC8,2046[GAUDI2_QUEUE_ID_NIC_8_2] = CPU_ID_NIC_QMAN_ARC8,2047[GAUDI2_QUEUE_ID_NIC_8_3] = CPU_ID_NIC_QMAN_ARC8,2048[GAUDI2_QUEUE_ID_NIC_9_0] = CPU_ID_NIC_QMAN_ARC9,2049[GAUDI2_QUEUE_ID_NIC_9_1] = CPU_ID_NIC_QMAN_ARC9,2050[GAUDI2_QUEUE_ID_NIC_9_2] = CPU_ID_NIC_QMAN_ARC9,2051[GAUDI2_QUEUE_ID_NIC_9_3] = CPU_ID_NIC_QMAN_ARC9,2052[GAUDI2_QUEUE_ID_NIC_10_0] = CPU_ID_NIC_QMAN_ARC10,2053[GAUDI2_QUEUE_ID_NIC_10_1] = CPU_ID_NIC_QMAN_ARC10,2054[GAUDI2_QUEUE_ID_NIC_10_2] = CPU_ID_NIC_QMAN_ARC10,2055[GAUDI2_QUEUE_ID_NIC_10_3] = CPU_ID_NIC_QMAN_ARC10,2056[GAUDI2_QUEUE_ID_NIC_11_0] = CPU_ID_NIC_QMAN_ARC11,2057[GAUDI2_QUEUE_ID_NIC_11_1] = CPU_ID_NIC_QMAN_ARC11,2058[GAUDI2_QUEUE_ID_NIC_11_2] = CPU_ID_NIC_QMAN_ARC11,2059[GAUDI2_QUEUE_ID_NIC_11_3] = CPU_ID_NIC_QMAN_ARC11,2060[GAUDI2_QUEUE_ID_NIC_12_0] = CPU_ID_NIC_QMAN_ARC12,2061[GAUDI2_QUEUE_ID_NIC_12_1] = CPU_ID_NIC_QMAN_ARC12,2062[GAUDI2_QUEUE_ID_NIC_12_2] = CPU_ID_NIC_QMAN_ARC12,2063[GAUDI2_QUEUE_ID_NIC_12_3] = CPU_ID_NIC_QMAN_ARC12,2064[GAUDI2_QUEUE_ID_NIC_13_0] = CPU_ID_NIC_QMAN_ARC13,2065[GAUDI2_QUEUE_ID_NIC_13_1] = CPU_ID_NIC_QMAN_ARC13,2066[GAUDI2_QUEUE_ID_NIC_13_2] = CPU_ID_NIC_QMAN_ARC13,2067[GAUDI2_QUEUE_ID_NIC_13_3] = CPU_ID_NIC_QMAN_ARC13,2068[GAUDI2_QUEUE_ID_NIC_14_0] = CPU_ID_NIC_QMAN_ARC14,2069[GAUDI2_QUEUE_ID_NIC_14_1] = CPU_ID_NIC_QMAN_ARC14,2070[GAUDI2_QUEUE_ID_NIC_14_2] = CPU_ID_NIC_QMAN_ARC14,2071[GAUDI2_QUEUE_ID_NIC_14_3] = CPU_ID_NIC_QMAN_ARC14,2072[GAUDI2_QUEUE_ID_NIC_15_0] = CPU_ID_NIC_QMAN_ARC15,2073[GAUDI2_QUEUE_ID_NIC_15_1] = CPU_ID_NIC_QMAN_ARC15,2074[GAUDI2_QUEUE_ID_NIC_15_2] = CPU_ID_NIC_QMAN_ARC15,2075[GAUDI2_QUEUE_ID_NIC_15_3] = CPU_ID_NIC_QMAN_ARC15,2076[GAUDI2_QUEUE_ID_NIC_16_0] = CPU_ID_NIC_QMAN_ARC16,2077[GAUDI2_QUEUE_ID_NIC_16_1] = CPU_ID_NIC_QMAN_ARC16,2078[GAUDI2_QUEUE_ID_NIC_16_2] = CPU_ID_NIC_QMAN_ARC16,2079[GAUDI2_QUEUE_ID_NIC_16_3] = CPU_ID_NIC_QMAN_ARC16,2080[GAUDI2_QUEUE_ID_NIC_17_0] = CPU_ID_NIC_QMAN_ARC17,2081[GAUDI2_QUEUE_ID_NIC_17_1] = CPU_ID_NIC_QMAN_ARC17,2082[GAUDI2_QUEUE_ID_NIC_17_2] = CPU_ID_NIC_QMAN_ARC17,2083[GAUDI2_QUEUE_ID_NIC_17_3] = CPU_ID_NIC_QMAN_ARC17,2084[GAUDI2_QUEUE_ID_NIC_18_0] = CPU_ID_NIC_QMAN_ARC18,2085[GAUDI2_QUEUE_ID_NIC_18_1] = CPU_ID_NIC_QMAN_ARC18,2086[GAUDI2_QUEUE_ID_NIC_18_2] = CPU_ID_NIC_QMAN_ARC18,2087[GAUDI2_QUEUE_ID_NIC_18_3] = CPU_ID_NIC_QMAN_ARC18,2088[GAUDI2_QUEUE_ID_NIC_19_0] = CPU_ID_NIC_QMAN_ARC19,2089[GAUDI2_QUEUE_ID_NIC_19_1] = CPU_ID_NIC_QMAN_ARC19,2090[GAUDI2_QUEUE_ID_NIC_19_2] = CPU_ID_NIC_QMAN_ARC19,2091[GAUDI2_QUEUE_ID_NIC_19_3] = CPU_ID_NIC_QMAN_ARC19,2092[GAUDI2_QUEUE_ID_NIC_20_0] = CPU_ID_NIC_QMAN_ARC20,2093[GAUDI2_QUEUE_ID_NIC_20_1] = CPU_ID_NIC_QMAN_ARC20,2094[GAUDI2_QUEUE_ID_NIC_20_2] = CPU_ID_NIC_QMAN_ARC20,2095[GAUDI2_QUEUE_ID_NIC_20_3] = CPU_ID_NIC_QMAN_ARC20,2096[GAUDI2_QUEUE_ID_NIC_21_0] = CPU_ID_NIC_QMAN_ARC21,2097[GAUDI2_QUEUE_ID_NIC_21_1] = CPU_ID_NIC_QMAN_ARC21,2098[GAUDI2_QUEUE_ID_NIC_21_2] = CPU_ID_NIC_QMAN_ARC21,2099[GAUDI2_QUEUE_ID_NIC_21_3] = CPU_ID_NIC_QMAN_ARC21,2100[GAUDI2_QUEUE_ID_NIC_22_0] = CPU_ID_NIC_QMAN_ARC22,2101[GAUDI2_QUEUE_ID_NIC_22_1] = CPU_ID_NIC_QMAN_ARC22,2102[GAUDI2_QUEUE_ID_NIC_22_2] = CPU_ID_NIC_QMAN_ARC22,2103[GAUDI2_QUEUE_ID_NIC_22_3] = CPU_ID_NIC_QMAN_ARC22,2104[GAUDI2_QUEUE_ID_NIC_23_0] = CPU_ID_NIC_QMAN_ARC23,2105[GAUDI2_QUEUE_ID_NIC_23_1] = CPU_ID_NIC_QMAN_ARC23,2106[GAUDI2_QUEUE_ID_NIC_23_2] = CPU_ID_NIC_QMAN_ARC23,2107[GAUDI2_QUEUE_ID_NIC_23_3] = CPU_ID_NIC_QMAN_ARC23,2108[GAUDI2_QUEUE_ID_ROT_0_0] = CPU_ID_ROT_QMAN_ARC0,2109[GAUDI2_QUEUE_ID_ROT_0_1] = CPU_ID_ROT_QMAN_ARC0,2110[GAUDI2_QUEUE_ID_ROT_0_2] = CPU_ID_ROT_QMAN_ARC0,2111[GAUDI2_QUEUE_ID_ROT_0_3] = CPU_ID_ROT_QMAN_ARC0,2112[GAUDI2_QUEUE_ID_ROT_1_0] = CPU_ID_ROT_QMAN_ARC1,2113[GAUDI2_QUEUE_ID_ROT_1_1] = CPU_ID_ROT_QMAN_ARC1,2114[GAUDI2_QUEUE_ID_ROT_1_2] = CPU_ID_ROT_QMAN_ARC1,2115[GAUDI2_QUEUE_ID_ROT_1_3] = CPU_ID_ROT_QMAN_ARC12116};21172118const u32 gaudi2_dma_core_blocks_bases[DMA_CORE_ID_SIZE] = {2119[DMA_CORE_ID_PDMA0] = mmPDMA0_CORE_BASE,2120[DMA_CORE_ID_PDMA1] = mmPDMA1_CORE_BASE,2121[DMA_CORE_ID_EDMA0] = mmDCORE0_EDMA0_CORE_BASE,2122[DMA_CORE_ID_EDMA1] = mmDCORE0_EDMA1_CORE_BASE,2123[DMA_CORE_ID_EDMA2] = mmDCORE1_EDMA0_CORE_BASE,2124[DMA_CORE_ID_EDMA3] = mmDCORE1_EDMA1_CORE_BASE,2125[DMA_CORE_ID_EDMA4] = mmDCORE2_EDMA0_CORE_BASE,2126[DMA_CORE_ID_EDMA5] = mmDCORE2_EDMA1_CORE_BASE,2127[DMA_CORE_ID_EDMA6] = mmDCORE3_EDMA0_CORE_BASE,2128[DMA_CORE_ID_EDMA7] = mmDCORE3_EDMA1_CORE_BASE,2129[DMA_CORE_ID_KDMA] = mmARC_FARM_KDMA_BASE2130};21312132const u32 gaudi2_mme_acc_blocks_bases[MME_ID_SIZE] = {2133[MME_ID_DCORE0] = mmDCORE0_MME_ACC_BASE,2134[MME_ID_DCORE1] = mmDCORE1_MME_ACC_BASE,2135[MME_ID_DCORE2] = mmDCORE2_MME_ACC_BASE,2136[MME_ID_DCORE3] = mmDCORE3_MME_ACC_BASE2137};21382139static const u32 gaudi2_tpc_cfg_blocks_bases[TPC_ID_SIZE] = {2140[TPC_ID_DCORE0_TPC0] = mmDCORE0_TPC0_CFG_BASE,2141[TPC_ID_DCORE0_TPC1] = mmDCORE0_TPC1_CFG_BASE,2142[TPC_ID_DCORE0_TPC2] = mmDCORE0_TPC2_CFG_BASE,2143[TPC_ID_DCORE0_TPC3] = mmDCORE0_TPC3_CFG_BASE,2144[TPC_ID_DCORE0_TPC4] = mmDCORE0_TPC4_CFG_BASE,2145[TPC_ID_DCORE0_TPC5] = mmDCORE0_TPC5_CFG_BASE,2146[TPC_ID_DCORE1_TPC0] = mmDCORE1_TPC0_CFG_BASE,2147[TPC_ID_DCORE1_TPC1] = mmDCORE1_TPC1_CFG_BASE,2148[TPC_ID_DCORE1_TPC2] = mmDCORE1_TPC2_CFG_BASE,2149[TPC_ID_DCORE1_TPC3] = mmDCORE1_TPC3_CFG_BASE,2150[TPC_ID_DCORE1_TPC4] = mmDCORE1_TPC4_CFG_BASE,2151[TPC_ID_DCORE1_TPC5] = mmDCORE1_TPC5_CFG_BASE,2152[TPC_ID_DCORE2_TPC0] = mmDCORE2_TPC0_CFG_BASE,2153[TPC_ID_DCORE2_TPC1] = mmDCORE2_TPC1_CFG_BASE,2154[TPC_ID_DCORE2_TPC2] = mmDCORE2_TPC2_CFG_BASE,2155[TPC_ID_DCORE2_TPC3] = mmDCORE2_TPC3_CFG_BASE,2156[TPC_ID_DCORE2_TPC4] = mmDCORE2_TPC4_CFG_BASE,2157[TPC_ID_DCORE2_TPC5] = mmDCORE2_TPC5_CFG_BASE,2158[TPC_ID_DCORE3_TPC0] = mmDCORE3_TPC0_CFG_BASE,2159[TPC_ID_DCORE3_TPC1] = mmDCORE3_TPC1_CFG_BASE,2160[TPC_ID_DCORE3_TPC2] = mmDCORE3_TPC2_CFG_BASE,2161[TPC_ID_DCORE3_TPC3] = mmDCORE3_TPC3_CFG_BASE,2162[TPC_ID_DCORE3_TPC4] = mmDCORE3_TPC4_CFG_BASE,2163[TPC_ID_DCORE3_TPC5] = mmDCORE3_TPC5_CFG_BASE,2164[TPC_ID_DCORE0_TPC6] = mmDCORE0_TPC6_CFG_BASE,2165};21662167static const u32 gaudi2_tpc_eml_cfg_blocks_bases[TPC_ID_SIZE] = {2168[TPC_ID_DCORE0_TPC0] = mmDCORE0_TPC0_EML_CFG_BASE,2169[TPC_ID_DCORE0_TPC1] = mmDCORE0_TPC1_EML_CFG_BASE,2170[TPC_ID_DCORE0_TPC2] = mmDCORE0_TPC2_EML_CFG_BASE,2171[TPC_ID_DCORE0_TPC3] = mmDCORE0_TPC3_EML_CFG_BASE,2172[TPC_ID_DCORE0_TPC4] = mmDCORE0_TPC4_EML_CFG_BASE,2173[TPC_ID_DCORE0_TPC5] = mmDCORE0_TPC5_EML_CFG_BASE,2174[TPC_ID_DCORE1_TPC0] = mmDCORE1_TPC0_EML_CFG_BASE,2175[TPC_ID_DCORE1_TPC1] = mmDCORE1_TPC1_EML_CFG_BASE,2176[TPC_ID_DCORE1_TPC2] = mmDCORE1_TPC2_EML_CFG_BASE,2177[TPC_ID_DCORE1_TPC3] = mmDCORE1_TPC3_EML_CFG_BASE,2178[TPC_ID_DCORE1_TPC4] = mmDCORE1_TPC4_EML_CFG_BASE,2179[TPC_ID_DCORE1_TPC5] = mmDCORE1_TPC5_EML_CFG_BASE,2180[TPC_ID_DCORE2_TPC0] = mmDCORE2_TPC0_EML_CFG_BASE,2181[TPC_ID_DCORE2_TPC1] = mmDCORE2_TPC1_EML_CFG_BASE,2182[TPC_ID_DCORE2_TPC2] = mmDCORE2_TPC2_EML_CFG_BASE,2183[TPC_ID_DCORE2_TPC3] = mmDCORE2_TPC3_EML_CFG_BASE,2184[TPC_ID_DCORE2_TPC4] = mmDCORE2_TPC4_EML_CFG_BASE,2185[TPC_ID_DCORE2_TPC5] = mmDCORE2_TPC5_EML_CFG_BASE,2186[TPC_ID_DCORE3_TPC0] = mmDCORE3_TPC0_EML_CFG_BASE,2187[TPC_ID_DCORE3_TPC1] = mmDCORE3_TPC1_EML_CFG_BASE,2188[TPC_ID_DCORE3_TPC2] = mmDCORE3_TPC2_EML_CFG_BASE,2189[TPC_ID_DCORE3_TPC3] = mmDCORE3_TPC3_EML_CFG_BASE,2190[TPC_ID_DCORE3_TPC4] = mmDCORE3_TPC4_EML_CFG_BASE,2191[TPC_ID_DCORE3_TPC5] = mmDCORE3_TPC5_EML_CFG_BASE,2192[TPC_ID_DCORE0_TPC6] = mmDCORE0_TPC6_EML_CFG_BASE,2193};21942195const u32 gaudi2_rot_blocks_bases[ROTATOR_ID_SIZE] = {2196[ROTATOR_ID_0] = mmROT0_BASE,2197[ROTATOR_ID_1] = mmROT1_BASE2198};21992200static const u32 gaudi2_tpc_id_to_queue_id[TPC_ID_SIZE] = {2201[TPC_ID_DCORE0_TPC0] = GAUDI2_QUEUE_ID_DCORE0_TPC_0_0,2202[TPC_ID_DCORE0_TPC1] = GAUDI2_QUEUE_ID_DCORE0_TPC_1_0,2203[TPC_ID_DCORE0_TPC2] = GAUDI2_QUEUE_ID_DCORE0_TPC_2_0,2204[TPC_ID_DCORE0_TPC3] = GAUDI2_QUEUE_ID_DCORE0_TPC_3_0,2205[TPC_ID_DCORE0_TPC4] = GAUDI2_QUEUE_ID_DCORE0_TPC_4_0,2206[TPC_ID_DCORE0_TPC5] = GAUDI2_QUEUE_ID_DCORE0_TPC_5_0,2207[TPC_ID_DCORE1_TPC0] = GAUDI2_QUEUE_ID_DCORE1_TPC_0_0,2208[TPC_ID_DCORE1_TPC1] = GAUDI2_QUEUE_ID_DCORE1_TPC_1_0,2209[TPC_ID_DCORE1_TPC2] = GAUDI2_QUEUE_ID_DCORE1_TPC_2_0,2210[TPC_ID_DCORE1_TPC3] = GAUDI2_QUEUE_ID_DCORE1_TPC_3_0,2211[TPC_ID_DCORE1_TPC4] = GAUDI2_QUEUE_ID_DCORE1_TPC_4_0,2212[TPC_ID_DCORE1_TPC5] = GAUDI2_QUEUE_ID_DCORE1_TPC_5_0,2213[TPC_ID_DCORE2_TPC0] = GAUDI2_QUEUE_ID_DCORE2_TPC_0_0,2214[TPC_ID_DCORE2_TPC1] = GAUDI2_QUEUE_ID_DCORE2_TPC_1_0,2215[TPC_ID_DCORE2_TPC2] = GAUDI2_QUEUE_ID_DCORE2_TPC_2_0,2216[TPC_ID_DCORE2_TPC3] = GAUDI2_QUEUE_ID_DCORE2_TPC_3_0,2217[TPC_ID_DCORE2_TPC4] = GAUDI2_QUEUE_ID_DCORE2_TPC_4_0,2218[TPC_ID_DCORE2_TPC5] = GAUDI2_QUEUE_ID_DCORE2_TPC_5_0,2219[TPC_ID_DCORE3_TPC0] = GAUDI2_QUEUE_ID_DCORE3_TPC_0_0,2220[TPC_ID_DCORE3_TPC1] = GAUDI2_QUEUE_ID_DCORE3_TPC_1_0,2221[TPC_ID_DCORE3_TPC2] = GAUDI2_QUEUE_ID_DCORE3_TPC_2_0,2222[TPC_ID_DCORE3_TPC3] = GAUDI2_QUEUE_ID_DCORE3_TPC_3_0,2223[TPC_ID_DCORE3_TPC4] = GAUDI2_QUEUE_ID_DCORE3_TPC_4_0,2224[TPC_ID_DCORE3_TPC5] = GAUDI2_QUEUE_ID_DCORE3_TPC_5_0,2225[TPC_ID_DCORE0_TPC6] = GAUDI2_QUEUE_ID_DCORE0_TPC_6_0,2226};22272228static const u32 gaudi2_rot_id_to_queue_id[ROTATOR_ID_SIZE] = {2229[ROTATOR_ID_0] = GAUDI2_QUEUE_ID_ROT_0_0,2230[ROTATOR_ID_1] = GAUDI2_QUEUE_ID_ROT_1_0,2231};22322233static const u32 gaudi2_tpc_engine_id_to_tpc_id[] = {2234[GAUDI2_DCORE0_ENGINE_ID_TPC_0] = TPC_ID_DCORE0_TPC0,2235[GAUDI2_DCORE0_ENGINE_ID_TPC_1] = TPC_ID_DCORE0_TPC1,2236[GAUDI2_DCORE0_ENGINE_ID_TPC_2] = TPC_ID_DCORE0_TPC2,2237[GAUDI2_DCORE0_ENGINE_ID_TPC_3] = TPC_ID_DCORE0_TPC3,2238[GAUDI2_DCORE0_ENGINE_ID_TPC_4] = TPC_ID_DCORE0_TPC4,2239[GAUDI2_DCORE0_ENGINE_ID_TPC_5] = TPC_ID_DCORE0_TPC5,2240[GAUDI2_DCORE1_ENGINE_ID_TPC_0] = TPC_ID_DCORE1_TPC0,2241[GAUDI2_DCORE1_ENGINE_ID_TPC_1] = TPC_ID_DCORE1_TPC1,2242[GAUDI2_DCORE1_ENGINE_ID_TPC_2] = TPC_ID_DCORE1_TPC2,2243[GAUDI2_DCORE1_ENGINE_ID_TPC_3] = TPC_ID_DCORE1_TPC3,2244[GAUDI2_DCORE1_ENGINE_ID_TPC_4] = TPC_ID_DCORE1_TPC4,2245[GAUDI2_DCORE1_ENGINE_ID_TPC_5] = TPC_ID_DCORE1_TPC5,2246[GAUDI2_DCORE2_ENGINE_ID_TPC_0] = TPC_ID_DCORE2_TPC0,2247[GAUDI2_DCORE2_ENGINE_ID_TPC_1] = TPC_ID_DCORE2_TPC1,2248[GAUDI2_DCORE2_ENGINE_ID_TPC_2] = TPC_ID_DCORE2_TPC2,2249[GAUDI2_DCORE2_ENGINE_ID_TPC_3] = TPC_ID_DCORE2_TPC3,2250[GAUDI2_DCORE2_ENGINE_ID_TPC_4] = TPC_ID_DCORE2_TPC4,2251[GAUDI2_DCORE2_ENGINE_ID_TPC_5] = TPC_ID_DCORE2_TPC5,2252[GAUDI2_DCORE3_ENGINE_ID_TPC_0] = TPC_ID_DCORE3_TPC0,2253[GAUDI2_DCORE3_ENGINE_ID_TPC_1] = TPC_ID_DCORE3_TPC1,2254[GAUDI2_DCORE3_ENGINE_ID_TPC_2] = TPC_ID_DCORE3_TPC2,2255[GAUDI2_DCORE3_ENGINE_ID_TPC_3] = TPC_ID_DCORE3_TPC3,2256[GAUDI2_DCORE3_ENGINE_ID_TPC_4] = TPC_ID_DCORE3_TPC4,2257[GAUDI2_DCORE3_ENGINE_ID_TPC_5] = TPC_ID_DCORE3_TPC5,2258/* the PCI TPC is placed last (mapped liked HW) */2259[GAUDI2_DCORE0_ENGINE_ID_TPC_6] = TPC_ID_DCORE0_TPC6,2260};22612262static const u32 gaudi2_mme_engine_id_to_mme_id[] = {2263[GAUDI2_DCORE0_ENGINE_ID_MME] = MME_ID_DCORE0,2264[GAUDI2_DCORE1_ENGINE_ID_MME] = MME_ID_DCORE1,2265[GAUDI2_DCORE2_ENGINE_ID_MME] = MME_ID_DCORE2,2266[GAUDI2_DCORE3_ENGINE_ID_MME] = MME_ID_DCORE3,2267};22682269static const u32 gaudi2_edma_engine_id_to_edma_id[] = {2270[GAUDI2_ENGINE_ID_PDMA_0] = DMA_CORE_ID_PDMA0,2271[GAUDI2_ENGINE_ID_PDMA_1] = DMA_CORE_ID_PDMA1,2272[GAUDI2_DCORE0_ENGINE_ID_EDMA_0] = DMA_CORE_ID_EDMA0,2273[GAUDI2_DCORE0_ENGINE_ID_EDMA_1] = DMA_CORE_ID_EDMA1,2274[GAUDI2_DCORE1_ENGINE_ID_EDMA_0] = DMA_CORE_ID_EDMA2,2275[GAUDI2_DCORE1_ENGINE_ID_EDMA_1] = DMA_CORE_ID_EDMA3,2276[GAUDI2_DCORE2_ENGINE_ID_EDMA_0] = DMA_CORE_ID_EDMA4,2277[GAUDI2_DCORE2_ENGINE_ID_EDMA_1] = DMA_CORE_ID_EDMA5,2278[GAUDI2_DCORE3_ENGINE_ID_EDMA_0] = DMA_CORE_ID_EDMA6,2279[GAUDI2_DCORE3_ENGINE_ID_EDMA_1] = DMA_CORE_ID_EDMA7,2280[GAUDI2_ENGINE_ID_KDMA] = DMA_CORE_ID_KDMA,2281};22822283const u32 edma_stream_base[NUM_OF_EDMA_PER_DCORE * NUM_OF_DCORES] = {2284GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0,2285GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0,2286GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0,2287GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0,2288GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0,2289GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0,2290GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0,2291GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0,2292};22932294static const char gaudi2_vdec_irq_name[GAUDI2_VDEC_MSIX_ENTRIES][GAUDI2_MAX_STRING_LEN] = {2295"gaudi2 vdec 0_0", "gaudi2 vdec 0_0 abnormal",2296"gaudi2 vdec 0_1", "gaudi2 vdec 0_1 abnormal",2297"gaudi2 vdec 1_0", "gaudi2 vdec 1_0 abnormal",2298"gaudi2 vdec 1_1", "gaudi2 vdec 1_1 abnormal",2299"gaudi2 vdec 2_0", "gaudi2 vdec 2_0 abnormal",2300"gaudi2 vdec 2_1", "gaudi2 vdec 2_1 abnormal",2301"gaudi2 vdec 3_0", "gaudi2 vdec 3_0 abnormal",2302"gaudi2 vdec 3_1", "gaudi2 vdec 3_1 abnormal",2303"gaudi2 vdec s_0", "gaudi2 vdec s_0 abnormal",2304"gaudi2 vdec s_1", "gaudi2 vdec s_1 abnormal"2305};23062307enum rtr_id {2308DCORE0_RTR0,2309DCORE0_RTR1,2310DCORE0_RTR2,2311DCORE0_RTR3,2312DCORE0_RTR4,2313DCORE0_RTR5,2314DCORE0_RTR6,2315DCORE0_RTR7,2316DCORE1_RTR0,2317DCORE1_RTR1,2318DCORE1_RTR2,2319DCORE1_RTR3,2320DCORE1_RTR4,2321DCORE1_RTR5,2322DCORE1_RTR6,2323DCORE1_RTR7,2324DCORE2_RTR0,2325DCORE2_RTR1,2326DCORE2_RTR2,2327DCORE2_RTR3,2328DCORE2_RTR4,2329DCORE2_RTR5,2330DCORE2_RTR6,2331DCORE2_RTR7,2332DCORE3_RTR0,2333DCORE3_RTR1,2334DCORE3_RTR2,2335DCORE3_RTR3,2336DCORE3_RTR4,2337DCORE3_RTR5,2338DCORE3_RTR6,2339DCORE3_RTR7,2340};23412342static const u32 gaudi2_tpc_initiator_hbw_rtr_id[NUM_OF_TPC_PER_DCORE * NUM_OF_DCORES + 1] = {2343DCORE0_RTR1, DCORE0_RTR1, DCORE0_RTR2, DCORE0_RTR2, DCORE0_RTR3, DCORE0_RTR3,2344DCORE1_RTR6, DCORE1_RTR6, DCORE1_RTR5, DCORE1_RTR5, DCORE1_RTR4, DCORE1_RTR4,2345DCORE2_RTR3, DCORE2_RTR3, DCORE2_RTR2, DCORE2_RTR2, DCORE2_RTR1, DCORE2_RTR1,2346DCORE3_RTR4, DCORE3_RTR4, DCORE3_RTR5, DCORE3_RTR5, DCORE3_RTR6, DCORE3_RTR6,2347DCORE0_RTR02348};23492350static const u32 gaudi2_tpc_initiator_lbw_rtr_id[NUM_OF_TPC_PER_DCORE * NUM_OF_DCORES + 1] = {2351DCORE0_RTR1, DCORE0_RTR1, DCORE0_RTR1, DCORE0_RTR1, DCORE0_RTR2, DCORE0_RTR2,2352DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR6, DCORE1_RTR6, DCORE1_RTR5, DCORE1_RTR5,2353DCORE2_RTR2, DCORE2_RTR2, DCORE2_RTR1, DCORE2_RTR1, DCORE2_RTR0, DCORE2_RTR0,2354DCORE3_RTR5, DCORE3_RTR5, DCORE3_RTR6, DCORE3_RTR6, DCORE3_RTR7, DCORE3_RTR7,2355DCORE0_RTR02356};23572358static const u32 gaudi2_dec_initiator_hbw_rtr_id[NUMBER_OF_DEC] = {2359DCORE0_RTR0, DCORE0_RTR0, DCORE1_RTR7, DCORE1_RTR7, DCORE2_RTR0, DCORE2_RTR0,2360DCORE3_RTR7, DCORE3_RTR7, DCORE0_RTR0, DCORE0_RTR02361};23622363static const u32 gaudi2_dec_initiator_lbw_rtr_id[NUMBER_OF_DEC] = {2364DCORE0_RTR1, DCORE0_RTR1, DCORE1_RTR6, DCORE1_RTR6, DCORE2_RTR1, DCORE2_RTR1,2365DCORE3_RTR6, DCORE3_RTR6, DCORE0_RTR0, DCORE0_RTR02366};23672368static const u32 gaudi2_nic_initiator_hbw_rtr_id[NIC_NUMBER_OF_MACROS] = {2369DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE2_RTR0,2370DCORE2_RTR0, DCORE2_RTR0, DCORE2_RTR0, DCORE3_RTR7, DCORE3_RTR7, DCORE3_RTR72371};23722373static const u32 gaudi2_nic_initiator_lbw_rtr_id[NIC_NUMBER_OF_MACROS] = {2374DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE2_RTR0,2375DCORE2_RTR0, DCORE2_RTR0, DCORE2_RTR0, DCORE3_RTR7, DCORE3_RTR7, DCORE3_RTR72376};23772378static const u32 gaudi2_edma_initiator_hbw_sft[NUM_OF_EDMA_PER_DCORE * NUM_OF_DCORES] = {2379mmSFT0_HBW_RTR_IF1_MSTR_IF_RR_SHRD_HBW_BASE,2380mmSFT0_HBW_RTR_IF0_MSTR_IF_RR_SHRD_HBW_BASE,2381mmSFT1_HBW_RTR_IF1_MSTR_IF_RR_SHRD_HBW_BASE,2382mmSFT1_HBW_RTR_IF0_MSTR_IF_RR_SHRD_HBW_BASE,2383mmSFT2_HBW_RTR_IF0_MSTR_IF_RR_SHRD_HBW_BASE,2384mmSFT2_HBW_RTR_IF1_MSTR_IF_RR_SHRD_HBW_BASE,2385mmSFT3_HBW_RTR_IF0_MSTR_IF_RR_SHRD_HBW_BASE,2386mmSFT3_HBW_RTR_IF1_MSTR_IF_RR_SHRD_HBW_BASE2387};23882389static const u32 gaudi2_pdma_initiator_hbw_rtr_id[NUM_OF_PDMA] = {2390DCORE0_RTR0, DCORE0_RTR02391};23922393static const u32 gaudi2_pdma_initiator_lbw_rtr_id[NUM_OF_PDMA] = {2394DCORE0_RTR2, DCORE0_RTR22395};23962397static const u32 gaudi2_rot_initiator_hbw_rtr_id[NUM_OF_ROT] = {2398DCORE2_RTR0, DCORE3_RTR72399};24002401static const u32 gaudi2_rot_initiator_lbw_rtr_id[NUM_OF_ROT] = {2402DCORE2_RTR2, DCORE3_RTR52403};24042405struct mme_initiators_rtr_id {2406u32 wap0;2407u32 wap1;2408u32 write;2409u32 read;2410u32 sbte0;2411u32 sbte1;2412u32 sbte2;2413u32 sbte3;2414u32 sbte4;2415};24162417enum mme_initiators {2418MME_WAP0 = 0,2419MME_WAP1,2420MME_WRITE,2421MME_READ,2422MME_SBTE0,2423MME_SBTE1,2424MME_SBTE2,2425MME_SBTE3,2426MME_SBTE4,2427MME_INITIATORS_MAX2428};24292430static const struct mme_initiators_rtr_id2431gaudi2_mme_initiator_rtr_id[NUM_OF_MME_PER_DCORE * NUM_OF_DCORES] = {2432{ .wap0 = 5, .wap1 = 7, .write = 6, .read = 7,2433.sbte0 = 7, .sbte1 = 4, .sbte2 = 4, .sbte3 = 5, .sbte4 = 6},2434{ .wap0 = 10, .wap1 = 8, .write = 9, .read = 8,2435.sbte0 = 11, .sbte1 = 11, .sbte2 = 10, .sbte3 = 9, .sbte4 = 8},2436{ .wap0 = 21, .wap1 = 23, .write = 22, .read = 23,2437.sbte0 = 20, .sbte1 = 20, .sbte2 = 21, .sbte3 = 22, .sbte4 = 23},2438{ .wap0 = 30, .wap1 = 28, .write = 29, .read = 30,2439.sbte0 = 31, .sbte1 = 31, .sbte2 = 30, .sbte3 = 29, .sbte4 = 28},2440};24412442enum razwi_event_sources {2443RAZWI_TPC,2444RAZWI_MME,2445RAZWI_EDMA,2446RAZWI_PDMA,2447RAZWI_NIC,2448RAZWI_DEC,2449RAZWI_ROT,2450RAZWI_ARC_FARM2451};24522453struct hbm_mc_error_causes {2454u32 mask;2455char cause[50];2456};24572458static struct hl_special_block_info gaudi2_special_blocks[] = GAUDI2_SPECIAL_BLOCKS;24592460/* Special blocks iterator is currently used to configure security protection bits,2461* and read global errors. Most HW blocks are addressable and those who aren't (N/A)-2462* must be skipped. Following configurations are commonly used for both PB config2463* and global error reading, since currently they both share the same settings.2464* Once it changes, we must remember to use separate configurations for either one.2465*/2466static int gaudi2_iterator_skip_block_types[] = {2467GAUDI2_BLOCK_TYPE_PLL,2468GAUDI2_BLOCK_TYPE_EU_BIST,2469GAUDI2_BLOCK_TYPE_HBM,2470GAUDI2_BLOCK_TYPE_XFT2471};24722473static struct range gaudi2_iterator_skip_block_ranges[] = {2474/* Skip all PSOC blocks except for PSOC_GLOBAL_CONF */2475{mmPSOC_I2C_M0_BASE, mmPSOC_EFUSE_BASE},2476{mmPSOC_BTL_BASE, mmPSOC_MSTR_IF_RR_SHRD_HBW_BASE},2477/* Skip all CPU blocks except for CPU_IF */2478{mmCPU_CA53_CFG_BASE, mmCPU_CA53_CFG_BASE},2479{mmCPU_TIMESTAMP_BASE, mmCPU_MSTR_IF_RR_SHRD_HBW_BASE}2480};24812482static struct hbm_mc_error_causes hbm_mc_spi[GAUDI2_NUM_OF_HBM_MC_SPI_CAUSE] = {2483{HBM_MC_SPI_TEMP_PIN_CHG_MASK, "temperature pins changed"},2484{HBM_MC_SPI_THR_ENG_MASK, "temperature-based throttling engaged"},2485{HBM_MC_SPI_THR_DIS_ENG_MASK, "temperature-based throttling disengaged"},2486{HBM_MC_SPI_IEEE1500_COMP_MASK, "IEEE1500 op comp"},2487{HBM_MC_SPI_IEEE1500_PAUSED_MASK, "IEEE1500 op paused"},2488};24892490static const char * const hbm_mc_sei_cause[GAUDI2_NUM_OF_HBM_SEI_CAUSE] = {2491[HBM_SEI_CMD_PARITY_EVEN] = "SEI C/A parity even",2492[HBM_SEI_CMD_PARITY_ODD] = "SEI C/A parity odd",2493[HBM_SEI_READ_ERR] = "SEI read data error",2494[HBM_SEI_WRITE_DATA_PARITY_ERR] = "SEI write data parity error",2495[HBM_SEI_CATTRIP] = "SEI CATTRIP asserted",2496[HBM_SEI_MEM_BIST_FAIL] = "SEI memory BIST fail",2497[HBM_SEI_DFI] = "SEI DFI error",2498[HBM_SEI_INV_TEMP_READ_OUT] = "SEI invalid temp read",2499[HBM_SEI_BIST_FAIL] = "SEI BIST fail"2500};25012502struct mmu_spi_sei_cause {2503char cause[50];2504int clear_bit;2505};25062507static const struct mmu_spi_sei_cause gaudi2_mmu_spi_sei[GAUDI2_NUM_OF_MMU_SPI_SEI_CAUSE] = {2508{"page fault", 1}, /* INTERRUPT_CLR[1] */2509{"page access", 1}, /* INTERRUPT_CLR[1] */2510{"bypass ddr", 2}, /* INTERRUPT_CLR[2] */2511{"multi hit", 2}, /* INTERRUPT_CLR[2] */2512{"mmu rei0", -1}, /* no clear register bit */2513{"mmu rei1", -1}, /* no clear register bit */2514{"stlb rei0", -1}, /* no clear register bit */2515{"stlb rei1", -1}, /* no clear register bit */2516{"rr privileged write hit", 2}, /* INTERRUPT_CLR[2] */2517{"rr privileged read hit", 2}, /* INTERRUPT_CLR[2] */2518{"rr secure write hit", 2}, /* INTERRUPT_CLR[2] */2519{"rr secure read hit", 2}, /* INTERRUPT_CLR[2] */2520{"bist_fail no use", 2}, /* INTERRUPT_CLR[2] */2521{"bist_fail no use", 2}, /* INTERRUPT_CLR[2] */2522{"bist_fail no use", 2}, /* INTERRUPT_CLR[2] */2523{"bist_fail no use", 2}, /* INTERRUPT_CLR[2] */2524{"slave error", 16}, /* INTERRUPT_CLR[16] */2525{"dec error", 17}, /* INTERRUPT_CLR[17] */2526{"burst fifo full", 2} /* INTERRUPT_CLR[2] */2527};25282529struct gaudi2_cache_invld_params {2530u64 start_va;2531u64 end_va;2532u32 inv_start_val;2533u32 flags;2534bool range_invalidation;2535};25362537struct gaudi2_tpc_idle_data {2538struct engines_data *e;2539unsigned long *mask;2540bool *is_idle;2541const char *tpc_fmt;2542};25432544struct gaudi2_tpc_mmu_data {2545u32 rw_asid;2546};25472548static s64 gaudi2_state_dump_specs_props[SP_MAX] = {0};25492550static int gaudi2_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size, u64 val);2551static bool gaudi2_is_queue_enabled(struct hl_device *hdev, u32 hw_queue_id);2552static bool gaudi2_is_arc_enabled(struct hl_device *hdev, u64 arc_id);2553static void gaudi2_clr_arc_id_cap(struct hl_device *hdev, u64 arc_id);2554static void gaudi2_set_arc_id_cap(struct hl_device *hdev, u64 arc_id);2555static void gaudi2_memset_device_lbw(struct hl_device *hdev, u32 addr, u32 size, u32 val);2556static int gaudi2_send_job_to_kdma(struct hl_device *hdev, u64 src_addr, u64 dst_addr, u32 size,2557bool is_memset);2558static bool gaudi2_get_tpc_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,2559struct engines_data *e);2560static bool gaudi2_get_mme_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,2561struct engines_data *e);2562static bool gaudi2_get_edma_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,2563struct engines_data *e);2564static u64 gaudi2_mmu_scramble_addr(struct hl_device *hdev, u64 raw_addr);2565static u64 gaudi2_mmu_descramble_addr(struct hl_device *hdev, u64 scrambled_addr);25662567static void gaudi2_init_scrambler_hbm(struct hl_device *hdev)2568{25692570}25712572static u32 gaudi2_get_signal_cb_size(struct hl_device *hdev)2573{2574return sizeof(struct packet_msg_short);2575}25762577static u32 gaudi2_get_wait_cb_size(struct hl_device *hdev)2578{2579return sizeof(struct packet_msg_short) * 4 + sizeof(struct packet_fence);2580}25812582void gaudi2_iterate_tpcs(struct hl_device *hdev, struct iterate_module_ctx *ctx)2583{2584struct asic_fixed_properties *prop = &hdev->asic_prop;2585int dcore, inst, tpc_seq;2586u32 offset;25872588/* init the return code */2589ctx->rc = 0;25902591for (dcore = 0; dcore < NUM_OF_DCORES; dcore++) {2592for (inst = 0; inst < NUM_OF_TPC_PER_DCORE; inst++) {2593tpc_seq = dcore * NUM_OF_TPC_PER_DCORE + inst;25942595if (!(prop->tpc_enabled_mask & BIT(tpc_seq)))2596continue;25972598offset = (DCORE_OFFSET * dcore) + (DCORE_TPC_OFFSET * inst);25992600ctx->fn(hdev, dcore, inst, offset, ctx);2601if (ctx->rc) {2602dev_err(hdev->dev, "TPC iterator failed for DCORE%d TPC%d\n",2603dcore, inst);2604return;2605}2606}2607}26082609if (!(prop->tpc_enabled_mask & BIT(TPC_ID_DCORE0_TPC6)))2610return;26112612/* special check for PCI TPC (DCORE0_TPC6) */2613offset = DCORE_TPC_OFFSET * (NUM_DCORE0_TPC - 1);2614ctx->fn(hdev, 0, NUM_DCORE0_TPC - 1, offset, ctx);2615if (ctx->rc)2616dev_err(hdev->dev, "TPC iterator failed for DCORE0 TPC6\n");2617}26182619static bool gaudi2_host_phys_addr_valid(u64 addr)2620{2621if ((addr < HOST_PHYS_BASE_0 + HOST_PHYS_SIZE_0) || (addr >= HOST_PHYS_BASE_1))2622return true;26232624return false;2625}26262627static int set_number_of_functional_hbms(struct hl_device *hdev)2628{2629struct asic_fixed_properties *prop = &hdev->asic_prop;2630u8 faulty_hbms = hweight64(hdev->dram_binning);26312632/* check if all HBMs should be used */2633if (!faulty_hbms) {2634dev_dbg(hdev->dev, "All HBM are in use (no binning)\n");2635prop->num_functional_hbms = GAUDI2_HBM_NUM;2636return 0;2637}26382639/*2640* check for error condition in which number of binning2641* candidates is higher than the maximum supported by the2642* driver (in which case binning mask shall be ignored and driver will2643* set the default)2644*/2645if (faulty_hbms > MAX_FAULTY_HBMS) {2646dev_err(hdev->dev,2647"HBM binning supports max of %d faulty HBMs, supplied mask 0x%llx.\n",2648MAX_FAULTY_HBMS, hdev->dram_binning);2649return -EINVAL;2650}26512652/*2653* by default, number of functional HBMs in Gaudi2 is always2654* GAUDI2_HBM_NUM - 1.2655*/2656prop->num_functional_hbms = GAUDI2_HBM_NUM - faulty_hbms;2657return 0;2658}26592660static bool gaudi2_is_edma_queue_id(u32 queue_id)2661{26622663switch (queue_id) {2664case GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3:2665case GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3:2666case GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3:2667case GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3:2668return true;2669default:2670return false;2671}2672}26732674static int gaudi2_set_dram_properties(struct hl_device *hdev)2675{2676struct asic_fixed_properties *prop = &hdev->asic_prop;2677u64 hbm_drv_base_offset = 0, edma_pq_base_addr;2678u32 basic_hbm_page_size, edma_idx = 0;2679int rc, i;26802681rc = set_number_of_functional_hbms(hdev);2682if (rc)2683return -EINVAL;26842685/*2686* Due to HW bug in which TLB size is x16 smaller than expected we use a workaround2687* in which we are using x16 bigger page size to be able to populate the entire2688* HBM mappings in the TLB2689*/2690basic_hbm_page_size = prop->num_functional_hbms * SZ_8M;2691prop->dram_page_size = GAUDI2_COMPENSATE_TLB_PAGE_SIZE_FACTOR * basic_hbm_page_size;2692prop->device_mem_alloc_default_page_size = prop->dram_page_size;2693prop->dram_size = prop->num_functional_hbms * SZ_16G;2694prop->dram_base_address = DRAM_PHYS_BASE;2695prop->dram_end_address = prop->dram_base_address + prop->dram_size;2696prop->dram_supports_virtual_memory = true;26972698prop->dram_user_base_address = DRAM_PHYS_BASE + prop->dram_page_size;2699prop->dram_hints_align_mask = ~GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK;2700prop->hints_dram_reserved_va_range.start_addr = RESERVED_VA_RANGE_FOR_ARC_ON_HBM_START;2701prop->hints_dram_reserved_va_range.end_addr = RESERVED_VA_RANGE_FOR_ARC_ON_HBM_END;27022703/* since DRAM page size differs from DMMU page size we need to allocate2704* DRAM memory in units of dram_page size and mapping this memory in2705* units of DMMU page size. we overcome this size mismatch using a2706* scrambling routine which takes a DRAM page and converts it to a DMMU2707* page.2708* We therefore:2709* 1. partition the virtual address space to DRAM-page (whole) pages.2710* (suppose we get n such pages)2711* 2. limit the amount of virtual address space we got from 1 above to2712* a multiple of 64M as we don't want the scrambled address to cross2713* the DRAM virtual address space.2714* ( m = (n * DRAM_page_size) / DMMU_page_size).2715* 3. determine the and address accordingly2716* end_addr = start_addr + m * 48M2717*2718* the DRAM address MSBs (63:48) are not part of the roundup calculation2719*/2720prop->dmmu.start_addr = prop->dram_base_address +2721(prop->dram_page_size *2722DIV_ROUND_UP_SECTOR_T(prop->dram_size, prop->dram_page_size));2723prop->dmmu.end_addr = prop->dmmu.start_addr + prop->dram_page_size *2724div_u64((VA_HBM_SPACE_END - prop->dmmu.start_addr), prop->dmmu.page_size);2725/*2726* Driver can't share an (48MB) HBM page with the F/W in order to prevent FW to block2727* the driver part by range register, so it must start at the next (48MB) page2728*/2729hbm_drv_base_offset = roundup(CPU_FW_IMAGE_SIZE, prop->num_functional_hbms * SZ_8M);27302731/*2732* The NIC driver section size and the HMMU page tables section in the HBM needs2733* to be the remaining size in the first dram page after taking into2734* account the F/W image size2735*/27362737/* Reserve region in HBM for HMMU page tables */2738prop->mmu_pgt_addr = DRAM_PHYS_BASE + hbm_drv_base_offset +2739((prop->dram_page_size - hbm_drv_base_offset) -2740(HMMU_PAGE_TABLES_SIZE + EDMA_PQS_SIZE + EDMA_SCRATCHPAD_SIZE));27412742/* Set EDMA PQs HBM addresses */2743edma_pq_base_addr = prop->mmu_pgt_addr + HMMU_PAGE_TABLES_SIZE;27442745for (i = 0 ; i < GAUDI2_QUEUE_ID_CPU_PQ ; i++) {2746if (gaudi2_is_edma_queue_id(i)) {2747prop->hw_queues_props[i].q_dram_bd_address = edma_pq_base_addr +2748(edma_idx * HL_QUEUE_SIZE_IN_BYTES);2749edma_idx++;2750}2751}27522753return 0;2754}27552756static int gaudi2_set_fixed_properties(struct hl_device *hdev)2757{2758struct asic_fixed_properties *prop = &hdev->asic_prop;2759struct hw_queue_properties *q_props;2760u32 num_sync_stream_queues = 0;2761int i, rc;27622763prop->max_queues = GAUDI2_QUEUE_ID_SIZE;2764prop->hw_queues_props = kcalloc(prop->max_queues, sizeof(struct hw_queue_properties),2765GFP_KERNEL);27662767if (!prop->hw_queues_props)2768return -ENOMEM;27692770q_props = prop->hw_queues_props;27712772for (i = 0 ; i < GAUDI2_QUEUE_ID_CPU_PQ ; i++) {2773q_props[i].type = QUEUE_TYPE_HW;2774q_props[i].driver_only = 0;27752776if (i >= GAUDI2_QUEUE_ID_NIC_0_0 && i <= GAUDI2_QUEUE_ID_NIC_23_3) {2777q_props[i].supports_sync_stream = 0;2778} else {2779q_props[i].supports_sync_stream = 1;2780num_sync_stream_queues++;2781}27822783q_props[i].cb_alloc_flags = CB_ALLOC_USER;27842785if (gaudi2_is_edma_queue_id(i))2786q_props[i].dram_bd = 1;2787}27882789q_props[GAUDI2_QUEUE_ID_CPU_PQ].type = QUEUE_TYPE_CPU;2790q_props[GAUDI2_QUEUE_ID_CPU_PQ].driver_only = 1;2791q_props[GAUDI2_QUEUE_ID_CPU_PQ].cb_alloc_flags = CB_ALLOC_KERNEL;27922793prop->cache_line_size = DEVICE_CACHE_LINE_SIZE;2794prop->cfg_base_address = CFG_BASE;2795prop->device_dma_offset_for_host_access = HOST_PHYS_BASE_0;2796prop->host_base_address = HOST_PHYS_BASE_0;2797prop->host_end_address = prop->host_base_address + HOST_PHYS_SIZE_0;2798prop->max_pending_cs = GAUDI2_MAX_PENDING_CS;2799prop->completion_queues_count = GAUDI2_RESERVED_CQ_NUMBER;2800prop->user_dec_intr_count = NUMBER_OF_DEC;2801prop->user_interrupt_count = GAUDI2_IRQ_NUM_USER_LAST - GAUDI2_IRQ_NUM_USER_FIRST + 1;2802prop->completion_mode = HL_COMPLETION_MODE_CS;2803prop->sync_stream_first_sob = GAUDI2_RESERVED_SOB_NUMBER;2804prop->sync_stream_first_mon = GAUDI2_RESERVED_MON_NUMBER;28052806prop->sram_base_address = SRAM_BASE_ADDR;2807prop->sram_size = SRAM_SIZE;2808prop->sram_end_address = prop->sram_base_address + prop->sram_size;2809prop->sram_user_base_address = prop->sram_base_address + SRAM_USER_BASE_OFFSET;28102811prop->hints_range_reservation = true;28122813prop->rotator_enabled_mask = BIT(NUM_OF_ROT) - 1;28142815prop->max_asid = 2;28162817prop->dmmu.pgt_size = HMMU_PAGE_TABLES_SIZE;2818prop->mmu_pte_size = HL_PTE_SIZE;28192820prop->dmmu.hop_shifts[MMU_HOP0] = DHOP0_SHIFT;2821prop->dmmu.hop_shifts[MMU_HOP1] = DHOP1_SHIFT;2822prop->dmmu.hop_shifts[MMU_HOP2] = DHOP2_SHIFT;2823prop->dmmu.hop_shifts[MMU_HOP3] = DHOP3_SHIFT;2824prop->dmmu.hop_masks[MMU_HOP0] = DHOP0_MASK;2825prop->dmmu.hop_masks[MMU_HOP1] = DHOP1_MASK;2826prop->dmmu.hop_masks[MMU_HOP2] = DHOP2_MASK;2827prop->dmmu.hop_masks[MMU_HOP3] = DHOP3_MASK;2828prop->dmmu.page_size = PAGE_SIZE_1GB;2829prop->dmmu.num_hops = MMU_ARCH_4_HOPS;2830prop->dmmu.last_mask = LAST_MASK;2831prop->dmmu.host_resident = 0;2832prop->dmmu.hop_table_size = HOP_TABLE_SIZE_512_PTE;2833prop->dmmu.hop0_tables_total_size = HOP_TABLE_SIZE_512_PTE * prop->max_asid;28342835/* As we need to set the pgt address in dram for HMMU init so we cannot2836* wait to the fw cpucp info to set the dram props as mmu init comes before2837* hw init2838*/2839rc = hdev->asic_funcs->set_dram_properties(hdev);2840if (rc)2841goto free_qprops;28422843prop->mmu_pgt_size = PMMU_PAGE_TABLES_SIZE;28442845prop->pmmu.pgt_size = prop->mmu_pgt_size;2846hdev->pmmu_huge_range = true;2847prop->pmmu.host_resident = 1;2848prop->pmmu.num_hops = MMU_ARCH_6_HOPS;2849prop->pmmu.last_mask = LAST_MASK;2850prop->pmmu.hop_table_size = HOP_TABLE_SIZE_512_PTE;2851prop->pmmu.hop0_tables_total_size = HOP_TABLE_SIZE_512_PTE * prop->max_asid;28522853prop->hints_host_reserved_va_range.start_addr = RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START;2854prop->hints_host_reserved_va_range.end_addr = RESERVED_VA_RANGE_FOR_ARC_ON_HOST_END;2855prop->hints_host_hpage_reserved_va_range.start_addr =2856RESERVED_VA_RANGE_FOR_ARC_ON_HOST_HPAGE_START;2857prop->hints_host_hpage_reserved_va_range.end_addr =2858RESERVED_VA_RANGE_FOR_ARC_ON_HOST_HPAGE_END;28592860if (PAGE_SIZE == SZ_64K) {2861prop->pmmu.hop_shifts[MMU_HOP0] = HOP0_SHIFT_64K;2862prop->pmmu.hop_shifts[MMU_HOP1] = HOP1_SHIFT_64K;2863prop->pmmu.hop_shifts[MMU_HOP2] = HOP2_SHIFT_64K;2864prop->pmmu.hop_shifts[MMU_HOP3] = HOP3_SHIFT_64K;2865prop->pmmu.hop_shifts[MMU_HOP4] = HOP4_SHIFT_64K;2866prop->pmmu.hop_shifts[MMU_HOP5] = HOP5_SHIFT_64K;2867prop->pmmu.hop_masks[MMU_HOP0] = HOP0_MASK_64K;2868prop->pmmu.hop_masks[MMU_HOP1] = HOP1_MASK_64K;2869prop->pmmu.hop_masks[MMU_HOP2] = HOP2_MASK_64K;2870prop->pmmu.hop_masks[MMU_HOP3] = HOP3_MASK_64K;2871prop->pmmu.hop_masks[MMU_HOP4] = HOP4_MASK_64K;2872prop->pmmu.hop_masks[MMU_HOP5] = HOP5_MASK_64K;2873prop->pmmu.start_addr = VA_HOST_SPACE_PAGE_START;2874prop->pmmu.end_addr = VA_HOST_SPACE_PAGE_END;2875prop->pmmu.page_size = PAGE_SIZE_64KB;28762877/* shifts and masks are the same in PMMU and HPMMU */2878memcpy(&prop->pmmu_huge, &prop->pmmu, sizeof(prop->pmmu));2879prop->pmmu_huge.page_size = PAGE_SIZE_16MB;2880prop->pmmu_huge.start_addr = VA_HOST_SPACE_HPAGE_START;2881prop->pmmu_huge.end_addr = VA_HOST_SPACE_HPAGE_END;2882} else {2883prop->pmmu.hop_shifts[MMU_HOP0] = HOP0_SHIFT_4K;2884prop->pmmu.hop_shifts[MMU_HOP1] = HOP1_SHIFT_4K;2885prop->pmmu.hop_shifts[MMU_HOP2] = HOP2_SHIFT_4K;2886prop->pmmu.hop_shifts[MMU_HOP3] = HOP3_SHIFT_4K;2887prop->pmmu.hop_shifts[MMU_HOP4] = HOP4_SHIFT_4K;2888prop->pmmu.hop_shifts[MMU_HOP5] = HOP5_SHIFT_4K;2889prop->pmmu.hop_masks[MMU_HOP0] = HOP0_MASK_4K;2890prop->pmmu.hop_masks[MMU_HOP1] = HOP1_MASK_4K;2891prop->pmmu.hop_masks[MMU_HOP2] = HOP2_MASK_4K;2892prop->pmmu.hop_masks[MMU_HOP3] = HOP3_MASK_4K;2893prop->pmmu.hop_masks[MMU_HOP4] = HOP4_MASK_4K;2894prop->pmmu.hop_masks[MMU_HOP5] = HOP5_MASK_4K;2895prop->pmmu.start_addr = VA_HOST_SPACE_PAGE_START;2896prop->pmmu.end_addr = VA_HOST_SPACE_PAGE_END;2897prop->pmmu.page_size = PAGE_SIZE_4KB;28982899/* shifts and masks are the same in PMMU and HPMMU */2900memcpy(&prop->pmmu_huge, &prop->pmmu, sizeof(prop->pmmu));2901prop->pmmu_huge.page_size = PAGE_SIZE_2MB;2902prop->pmmu_huge.start_addr = VA_HOST_SPACE_HPAGE_START;2903prop->pmmu_huge.end_addr = VA_HOST_SPACE_HPAGE_END;2904}29052906prop->max_num_of_engines = GAUDI2_ENGINE_ID_SIZE;2907prop->num_engine_cores = CPU_ID_MAX;2908prop->cfg_size = CFG_SIZE;2909prop->num_of_events = GAUDI2_EVENT_SIZE;29102911prop->supports_engine_modes = true;29122913prop->dc_power_default = DC_POWER_DEFAULT;29142915prop->cb_pool_cb_cnt = GAUDI2_CB_POOL_CB_CNT;2916prop->cb_pool_cb_size = GAUDI2_CB_POOL_CB_SIZE;2917prop->pcie_dbi_base_address = CFG_BASE + mmPCIE_DBI_BASE;2918prop->pcie_aux_dbi_reg_addr = CFG_BASE + mmPCIE_AUX_DBI;29192920strscpy_pad(prop->cpucp_info.card_name, GAUDI2_DEFAULT_CARD_NAME, CARD_NAME_MAX_LEN);29212922prop->mme_master_slave_mode = 1;29232924prop->first_available_user_sob[0] = GAUDI2_RESERVED_SOB_NUMBER +2925(num_sync_stream_queues * HL_RSVD_SOBS);29262927prop->first_available_user_mon[0] = GAUDI2_RESERVED_MON_NUMBER +2928(num_sync_stream_queues * HL_RSVD_MONS);29292930prop->first_available_user_interrupt = GAUDI2_IRQ_NUM_USER_FIRST;2931prop->tpc_interrupt_id = GAUDI2_IRQ_NUM_TPC_ASSERT;2932prop->eq_interrupt_id = GAUDI2_IRQ_NUM_EVENT_QUEUE;29332934prop->first_available_cq[0] = GAUDI2_RESERVED_CQ_NUMBER;29352936prop->fw_cpu_boot_dev_sts0_valid = false;2937prop->fw_cpu_boot_dev_sts1_valid = false;2938prop->hard_reset_done_by_fw = false;2939prop->gic_interrupts_enable = true;29402941prop->server_type = HL_SERVER_TYPE_UNKNOWN;29422943prop->max_dec = NUMBER_OF_DEC;29442945prop->clk_pll_index = HL_GAUDI2_MME_PLL;29462947prop->dma_mask = 64;29482949prop->hbw_flush_reg = mmPCIE_WRAP_SPECIAL_GLBL_SPARE_0;29502951prop->supports_advanced_cpucp_rc = true;29522953return 0;29542955free_qprops:2956kfree(prop->hw_queues_props);2957return rc;2958}29592960static int gaudi2_pci_bars_map(struct hl_device *hdev)2961{2962static const char * const name[] = {"CFG_SRAM", "MSIX", "DRAM"};2963bool is_wc[3] = {false, false, true};2964int rc;29652966rc = hl_pci_bars_map(hdev, name, is_wc);2967if (rc)2968return rc;29692970hdev->rmmio = hdev->pcie_bar[SRAM_CFG_BAR_ID] + (CFG_BASE - STM_FLASH_BASE_ADDR);29712972return 0;2973}29742975static u64 gaudi2_set_hbm_bar_base(struct hl_device *hdev, u64 addr)2976{2977struct gaudi2_device *gaudi2 = hdev->asic_specific;2978struct hl_inbound_pci_region pci_region;2979u64 old_addr = addr;2980int rc;29812982if ((gaudi2) && (gaudi2->dram_bar_cur_addr == addr))2983return old_addr;29842985if (hdev->asic_prop.iatu_done_by_fw)2986return U64_MAX;29872988/* Inbound Region 2 - Bar 4 - Point to DRAM */2989pci_region.mode = PCI_BAR_MATCH_MODE;2990pci_region.bar = DRAM_BAR_ID;2991pci_region.addr = addr;2992rc = hl_pci_set_inbound_region(hdev, 2, &pci_region);2993if (rc)2994return U64_MAX;29952996if (gaudi2) {2997old_addr = gaudi2->dram_bar_cur_addr;2998gaudi2->dram_bar_cur_addr = addr;2999}30003001return old_addr;3002}30033004static int gaudi2_init_iatu(struct hl_device *hdev)3005{3006struct hl_inbound_pci_region inbound_region;3007struct hl_outbound_pci_region outbound_region;3008u32 bar_addr_low, bar_addr_high;3009int rc;30103011if (hdev->asic_prop.iatu_done_by_fw)3012return 0;30133014/* Temporary inbound Region 0 - Bar 0 - Point to CFG3015* We must map this region in BAR match mode in order to3016* fetch BAR physical base address3017*/3018inbound_region.mode = PCI_BAR_MATCH_MODE;3019inbound_region.bar = SRAM_CFG_BAR_ID;3020/* Base address must be aligned to Bar size which is 256 MB */3021inbound_region.addr = STM_FLASH_BASE_ADDR - STM_FLASH_ALIGNED_OFF;3022rc = hl_pci_set_inbound_region(hdev, 0, &inbound_region);3023if (rc)3024return rc;30253026/* Fetch physical BAR address */3027bar_addr_high = RREG32(mmPCIE_DBI_BAR1_REG + STM_FLASH_ALIGNED_OFF);3028bar_addr_low = RREG32(mmPCIE_DBI_BAR0_REG + STM_FLASH_ALIGNED_OFF) & ~0xF;30293030hdev->pcie_bar_phys[SRAM_CFG_BAR_ID] = (u64)bar_addr_high << 32 | bar_addr_low;30313032/* Inbound Region 0 - Bar 0 - Point to CFG */3033inbound_region.mode = PCI_ADDRESS_MATCH_MODE;3034inbound_region.bar = SRAM_CFG_BAR_ID;3035inbound_region.offset_in_bar = 0;3036inbound_region.addr = STM_FLASH_BASE_ADDR;3037inbound_region.size = CFG_REGION_SIZE;3038rc = hl_pci_set_inbound_region(hdev, 0, &inbound_region);3039if (rc)3040return rc;30413042/* Inbound Region 1 - Bar 0 - Point to BAR0_RESERVED + SRAM */3043inbound_region.mode = PCI_ADDRESS_MATCH_MODE;3044inbound_region.bar = SRAM_CFG_BAR_ID;3045inbound_region.offset_in_bar = CFG_REGION_SIZE;3046inbound_region.addr = BAR0_RSRVD_BASE_ADDR;3047inbound_region.size = BAR0_RSRVD_SIZE + SRAM_SIZE;3048rc = hl_pci_set_inbound_region(hdev, 1, &inbound_region);3049if (rc)3050return rc;30513052/* Inbound Region 2 - Bar 4 - Point to DRAM */3053inbound_region.mode = PCI_BAR_MATCH_MODE;3054inbound_region.bar = DRAM_BAR_ID;3055inbound_region.addr = DRAM_PHYS_BASE;3056rc = hl_pci_set_inbound_region(hdev, 2, &inbound_region);3057if (rc)3058return rc;30593060/* Outbound Region 0 - Point to Host */3061outbound_region.addr = HOST_PHYS_BASE_0;3062outbound_region.size = HOST_PHYS_SIZE_0;3063rc = hl_pci_set_outbound_region(hdev, &outbound_region);30643065return rc;3066}30673068static enum hl_device_hw_state gaudi2_get_hw_state(struct hl_device *hdev)3069{3070return RREG32(mmHW_STATE);3071}30723073static int gaudi2_tpc_binning_init_prop(struct hl_device *hdev)3074{3075struct asic_fixed_properties *prop = &hdev->asic_prop;30763077/*3078* check for error condition in which number of binning candidates3079* is higher than the maximum supported by the driver3080*/3081if (hweight64(hdev->tpc_binning) > MAX_CLUSTER_BINNING_FAULTY_TPCS) {3082dev_err(hdev->dev, "TPC binning is supported for max of %d faulty TPCs, provided mask 0x%llx\n",3083MAX_CLUSTER_BINNING_FAULTY_TPCS,3084hdev->tpc_binning);3085return -EINVAL;3086}30873088prop->tpc_binning_mask = hdev->tpc_binning;3089prop->tpc_enabled_mask = GAUDI2_TPC_FULL_MASK;30903091return 0;3092}30933094static int gaudi2_set_tpc_binning_masks(struct hl_device *hdev)3095{3096struct asic_fixed_properties *prop = &hdev->asic_prop;3097struct hw_queue_properties *q_props = prop->hw_queues_props;3098u64 tpc_binning_mask;3099u8 subst_idx = 0;3100int i, rc;31013102rc = gaudi2_tpc_binning_init_prop(hdev);3103if (rc)3104return rc;31053106tpc_binning_mask = prop->tpc_binning_mask;31073108for (i = 0 ; i < MAX_FAULTY_TPCS ; i++) {3109u8 subst_seq, binned, qid_base;31103111if (tpc_binning_mask == 0)3112break;31133114if (subst_idx == 0) {3115subst_seq = TPC_ID_DCORE0_TPC6;3116qid_base = GAUDI2_QUEUE_ID_DCORE0_TPC_6_0;3117} else {3118subst_seq = TPC_ID_DCORE3_TPC5;3119qid_base = GAUDI2_QUEUE_ID_DCORE3_TPC_5_0;3120}312131223123/* clear bit from mask */3124binned = __ffs(tpc_binning_mask);3125/*3126* Coverity complains about possible out-of-bound access in3127* clear_bit3128*/3129if (binned >= TPC_ID_SIZE) {3130dev_err(hdev->dev,3131"Invalid binned TPC (binning mask: %llx)\n",3132tpc_binning_mask);3133return -EINVAL;3134}3135clear_bit(binned, (unsigned long *)&tpc_binning_mask);31363137/* also clear replacing TPC bit from enabled mask */3138clear_bit(subst_seq, (unsigned long *)&prop->tpc_enabled_mask);31393140/* bin substite TPC's Qs */3141q_props[qid_base].binned = 1;3142q_props[qid_base + 1].binned = 1;3143q_props[qid_base + 2].binned = 1;3144q_props[qid_base + 3].binned = 1;31453146subst_idx++;3147}31483149return 0;3150}31513152static int gaudi2_set_dec_binning_masks(struct hl_device *hdev)3153{3154struct asic_fixed_properties *prop = &hdev->asic_prop;3155u8 num_faulty;31563157num_faulty = hweight32(hdev->decoder_binning);31583159/*3160* check for error condition in which number of binning candidates3161* is higher than the maximum supported by the driver3162*/3163if (num_faulty > MAX_FAULTY_DECODERS) {3164dev_err(hdev->dev, "decoder binning is supported for max of single faulty decoder, provided mask 0x%x\n",3165hdev->decoder_binning);3166return -EINVAL;3167}31683169prop->decoder_binning_mask = (hdev->decoder_binning & GAUDI2_DECODER_FULL_MASK);31703171if (prop->decoder_binning_mask)3172prop->decoder_enabled_mask = (GAUDI2_DECODER_FULL_MASK & ~BIT(DEC_ID_PCIE_VDEC1));3173else3174prop->decoder_enabled_mask = GAUDI2_DECODER_FULL_MASK;31753176return 0;3177}31783179static void gaudi2_set_dram_binning_masks(struct hl_device *hdev)3180{3181struct asic_fixed_properties *prop = &hdev->asic_prop;31823183/* check if we should override default binning */3184if (!hdev->dram_binning) {3185prop->dram_binning_mask = 0;3186prop->dram_enabled_mask = GAUDI2_DRAM_FULL_MASK;3187return;3188}31893190/* set DRAM binning constraints */3191prop->faulty_dram_cluster_map |= hdev->dram_binning;3192prop->dram_binning_mask = hdev->dram_binning;3193prop->dram_enabled_mask = GAUDI2_DRAM_FULL_MASK & ~BIT(HBM_ID5);3194}31953196static int gaudi2_set_edma_binning_masks(struct hl_device *hdev)3197{3198struct asic_fixed_properties *prop = &hdev->asic_prop;3199struct hw_queue_properties *q_props;3200u8 seq, num_faulty;32013202num_faulty = hweight32(hdev->edma_binning);32033204/*3205* check for error condition in which number of binning candidates3206* is higher than the maximum supported by the driver3207*/3208if (num_faulty > MAX_FAULTY_EDMAS) {3209dev_err(hdev->dev,3210"EDMA binning is supported for max of single faulty EDMA, provided mask 0x%x\n",3211hdev->edma_binning);3212return -EINVAL;3213}32143215if (!hdev->edma_binning) {3216prop->edma_binning_mask = 0;3217prop->edma_enabled_mask = GAUDI2_EDMA_FULL_MASK;3218return 0;3219}32203221seq = __ffs((unsigned long)hdev->edma_binning);32223223/* set binning constraints */3224prop->faulty_dram_cluster_map |= BIT(edma_to_hbm_cluster[seq]);3225prop->edma_binning_mask = hdev->edma_binning;3226prop->edma_enabled_mask = GAUDI2_EDMA_FULL_MASK & ~BIT(EDMA_ID_DCORE3_INSTANCE1);32273228/* bin substitute EDMA's queue */3229q_props = prop->hw_queues_props;3230q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0].binned = 1;3231q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1].binned = 1;3232q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2].binned = 1;3233q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3].binned = 1;32343235return 0;3236}32373238static int gaudi2_set_xbar_edge_enable_mask(struct hl_device *hdev, u32 xbar_edge_iso_mask)3239{3240struct asic_fixed_properties *prop = &hdev->asic_prop;3241u8 num_faulty, seq;32423243/* check if we should override default binning */3244if (!xbar_edge_iso_mask) {3245prop->xbar_edge_enabled_mask = GAUDI2_XBAR_EDGE_FULL_MASK;3246return 0;3247}32483249/*3250* note that it can be set to value other than 0 only after cpucp packet (i.e.3251* only the FW can set a redundancy value). for user it'll always be 0.3252*/3253num_faulty = hweight32(xbar_edge_iso_mask);32543255/*3256* check for error condition in which number of binning candidates3257* is higher than the maximum supported by the driver3258*/3259if (num_faulty > MAX_FAULTY_XBARS) {3260dev_err(hdev->dev, "we cannot have more than %d faulty XBAR EDGE\n",3261MAX_FAULTY_XBARS);3262return -EINVAL;3263}32643265seq = __ffs((unsigned long)xbar_edge_iso_mask);32663267/* set binning constraints */3268prop->faulty_dram_cluster_map |= BIT(xbar_edge_to_hbm_cluster[seq]);3269prop->xbar_edge_enabled_mask = (~xbar_edge_iso_mask) & GAUDI2_XBAR_EDGE_FULL_MASK;32703271return 0;3272}32733274static int gaudi2_set_cluster_binning_masks_common(struct hl_device *hdev, u8 xbar_edge_iso_mask)3275{3276int rc;32773278/*3279* mark all clusters as good, each component will "fail" cluster3280* based on eFuse/user values.3281* If more than single cluster is faulty- the chip is unusable3282*/3283hdev->asic_prop.faulty_dram_cluster_map = 0;32843285gaudi2_set_dram_binning_masks(hdev);32863287rc = gaudi2_set_edma_binning_masks(hdev);3288if (rc)3289return rc;32903291rc = gaudi2_set_xbar_edge_enable_mask(hdev, xbar_edge_iso_mask);3292if (rc)3293return rc;329432953296/* always initially set to full mask */3297hdev->asic_prop.hmmu_hif_enabled_mask = GAUDI2_HIF_HMMU_FULL_MASK;32983299return 0;3300}33013302static int gaudi2_set_cluster_binning_masks(struct hl_device *hdev)3303{3304struct asic_fixed_properties *prop = &hdev->asic_prop;3305int rc;33063307rc = gaudi2_set_cluster_binning_masks_common(hdev, prop->cpucp_info.xbar_binning_mask);3308if (rc)3309return rc;33103311/* if we have DRAM binning reported by FW we should perform cluster config */3312if (prop->faulty_dram_cluster_map) {3313u8 cluster_seq = __ffs((unsigned long)prop->faulty_dram_cluster_map);33143315prop->hmmu_hif_enabled_mask = cluster_hmmu_hif_enabled_mask[cluster_seq];3316}33173318return 0;3319}33203321static int gaudi2_set_binning_masks(struct hl_device *hdev)3322{3323int rc;33243325rc = gaudi2_set_cluster_binning_masks(hdev);3326if (rc)3327return rc;33283329rc = gaudi2_set_tpc_binning_masks(hdev);3330if (rc)3331return rc;33323333rc = gaudi2_set_dec_binning_masks(hdev);3334if (rc)3335return rc;33363337return 0;3338}33393340static int gaudi2_cpucp_info_get(struct hl_device *hdev)3341{3342struct gaudi2_device *gaudi2 = hdev->asic_specific;3343struct asic_fixed_properties *prop = &hdev->asic_prop;3344long max_power;3345u64 dram_size;3346int rc;33473348if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))3349return 0;33503351/* No point of asking this information again when not doing hard reset, as the device3352* CPU hasn't been reset3353*/3354if (hdev->reset_info.in_compute_reset)3355return 0;33563357rc = hl_fw_cpucp_handshake(hdev, mmCPU_BOOT_DEV_STS0, mmCPU_BOOT_DEV_STS1, mmCPU_BOOT_ERR0,3358mmCPU_BOOT_ERR1);3359if (rc)3360return rc;33613362dram_size = le64_to_cpu(prop->cpucp_info.dram_size);3363if (dram_size) {3364/* we can have wither 5 or 6 HBMs. other values are invalid */33653366if ((dram_size != ((GAUDI2_HBM_NUM - 1) * SZ_16G)) &&3367(dram_size != (GAUDI2_HBM_NUM * SZ_16G))) {3368dev_err(hdev->dev,3369"F/W reported invalid DRAM size %llu. Trying to use default size %llu\n",3370dram_size, prop->dram_size);3371dram_size = prop->dram_size;3372}33733374prop->dram_size = dram_size;3375prop->dram_end_address = prop->dram_base_address + dram_size;3376}33773378if (!strlen(prop->cpucp_info.card_name))3379strscpy_pad(prop->cpucp_info.card_name, GAUDI2_DEFAULT_CARD_NAME,3380CARD_NAME_MAX_LEN);33813382/* Overwrite binning masks with the actual binning values from F/W */3383hdev->dram_binning = prop->cpucp_info.dram_binning_mask;3384hdev->edma_binning = prop->cpucp_info.edma_binning_mask;3385hdev->tpc_binning = le64_to_cpu(prop->cpucp_info.tpc_binning_mask);3386hdev->decoder_binning = lower_32_bits(le64_to_cpu(prop->cpucp_info.decoder_binning_mask));33873388dev_dbg(hdev->dev, "Read binning masks: tpc: 0x%llx, dram: 0x%llx, edma: 0x%x, dec: 0x%x\n",3389hdev->tpc_binning, hdev->dram_binning, hdev->edma_binning,3390hdev->decoder_binning);33913392/*3393* at this point the DRAM parameters need to be updated according to data obtained3394* from the FW3395*/3396rc = hdev->asic_funcs->set_dram_properties(hdev);3397if (rc)3398return rc;33993400rc = hdev->asic_funcs->set_binning_masks(hdev);3401if (rc)3402return rc;34033404max_power = hl_fw_get_max_power(hdev);3405if (max_power < 0)3406return max_power;34073408prop->max_power_default = (u64) max_power;34093410return 0;3411}34123413static int gaudi2_fetch_psoc_frequency(struct hl_device *hdev)3414{3415struct gaudi2_device *gaudi2 = hdev->asic_specific;3416u16 pll_freq_arr[HL_PLL_NUM_OUTPUTS];3417int rc;34183419if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))3420return 0;34213422rc = hl_fw_cpucp_pll_info_get(hdev, HL_GAUDI2_CPU_PLL, pll_freq_arr);3423if (rc)3424return rc;34253426hdev->asic_prop.psoc_timestamp_frequency = pll_freq_arr[3];34273428return 0;3429}34303431static int gaudi2_mmu_clear_pgt_range(struct hl_device *hdev)3432{3433struct gaudi2_device *gaudi2 = hdev->asic_specific;3434struct asic_fixed_properties *prop = &hdev->asic_prop;3435int rc;34363437if (!(gaudi2->hw_cap_initialized & HW_CAP_MMU_MASK))3438return 0;34393440if (prop->dmmu.host_resident)3441return 0;34423443rc = gaudi2_memset_device_memory(hdev, prop->mmu_pgt_addr, prop->dmmu.pgt_size, 0);3444if (rc)3445dev_err(hdev->dev, "Failed to clear mmu pgt");34463447return rc;3448}34493450static int gaudi2_early_init(struct hl_device *hdev)3451{3452struct asic_fixed_properties *prop = &hdev->asic_prop;3453struct pci_dev *pdev = hdev->pdev;3454resource_size_t pci_bar_size;3455int rc;34563457rc = gaudi2_set_fixed_properties(hdev);3458if (rc)3459return rc;34603461/* Check BAR sizes */3462pci_bar_size = pci_resource_len(pdev, SRAM_CFG_BAR_ID);34633464if (pci_bar_size != CFG_BAR_SIZE) {3465dev_err(hdev->dev, "Not " HL_NAME "? BAR %d size %pa, expecting %llu\n",3466SRAM_CFG_BAR_ID, &pci_bar_size, CFG_BAR_SIZE);3467rc = -ENODEV;3468goto free_queue_props;3469}34703471pci_bar_size = pci_resource_len(pdev, MSIX_BAR_ID);3472if (pci_bar_size != MSIX_BAR_SIZE) {3473dev_err(hdev->dev, "Not " HL_NAME "? BAR %d size %pa, expecting %llu\n",3474MSIX_BAR_ID, &pci_bar_size, MSIX_BAR_SIZE);3475rc = -ENODEV;3476goto free_queue_props;3477}34783479prop->dram_pci_bar_size = pci_resource_len(pdev, DRAM_BAR_ID);3480hdev->dram_pci_bar_start = pci_resource_start(pdev, DRAM_BAR_ID);34813482/*3483* Only in pldm driver config iATU3484*/3485if (hdev->pldm)3486hdev->asic_prop.iatu_done_by_fw = false;3487else3488hdev->asic_prop.iatu_done_by_fw = true;34893490rc = hl_pci_init(hdev);3491if (rc)3492goto free_queue_props;34933494/* Before continuing in the initialization, we need to read the preboot3495* version to determine whether we run with a security-enabled firmware3496*/3497rc = hl_fw_read_preboot_status(hdev);3498if (rc) {3499if (hdev->reset_on_preboot_fail)3500hdev->asic_funcs->hw_fini(hdev, true, false);3501goto pci_fini;3502}35033504if (gaudi2_get_hw_state(hdev) == HL_DEVICE_HW_STATE_DIRTY) {3505dev_dbg(hdev->dev, "H/W state is dirty, must reset before initializing\n");3506rc = hdev->asic_funcs->hw_fini(hdev, true, false);3507if (rc) {3508dev_err(hdev->dev, "failed to reset HW in dirty state (%d)\n", rc);3509goto pci_fini;3510}35113512rc = hl_fw_read_preboot_status(hdev);3513if (rc) {3514if (hdev->reset_on_preboot_fail)3515hdev->asic_funcs->hw_fini(hdev, true, false);3516goto pci_fini;3517}3518}35193520return 0;35213522pci_fini:3523hl_pci_fini(hdev);3524free_queue_props:3525kfree(hdev->asic_prop.hw_queues_props);3526return rc;3527}35283529static int gaudi2_early_fini(struct hl_device *hdev)3530{3531kfree(hdev->asic_prop.hw_queues_props);3532hl_pci_fini(hdev);35333534return 0;3535}35363537static bool gaudi2_is_arc_nic_owned(u64 arc_id)3538{3539switch (arc_id) {3540case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:3541return true;3542default:3543return false;3544}3545}35463547static bool gaudi2_is_arc_tpc_owned(u64 arc_id)3548{3549switch (arc_id) {3550case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:3551return true;3552default:3553return false;3554}3555}35563557static void gaudi2_init_arcs(struct hl_device *hdev)3558{3559struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;3560struct gaudi2_device *gaudi2 = hdev->asic_specific;3561u64 arc_id;3562u32 i;35633564for (i = CPU_ID_SCHED_ARC0 ; i <= CPU_ID_SCHED_ARC3 ; i++) {3565if (gaudi2_is_arc_enabled(hdev, i))3566continue;35673568gaudi2_set_arc_id_cap(hdev, i);3569}35703571for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ ; i += 4) {3572if (!gaudi2_is_queue_enabled(hdev, i))3573continue;35743575arc_id = gaudi2_queue_id_to_arc_id[i];3576if (gaudi2_is_arc_enabled(hdev, arc_id))3577continue;35783579if (gaudi2_is_arc_nic_owned(arc_id) &&3580!(hdev->nic_ports_mask & BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0)))3581continue;35823583if (gaudi2_is_arc_tpc_owned(arc_id) && !(gaudi2->tpc_hw_cap_initialized &3584BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0)))3585continue;35863587gaudi2_set_arc_id_cap(hdev, arc_id);3588}35893590/* Fetch ARC scratchpad address */3591hdev->asic_prop.engine_core_interrupt_reg_addr =3592CFG_BASE + le32_to_cpu(dyn_regs->eng_arc_irq_ctrl);3593}35943595static int gaudi2_scrub_arc_dccm(struct hl_device *hdev, u32 cpu_id)3596{3597u32 reg_base, reg_val;3598int rc;35993600switch (cpu_id) {3601case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC3:3602/* Each ARC scheduler has 2 consecutive DCCM blocks */3603rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],3604ARC_DCCM_BLOCK_SIZE * 2, true);3605if (rc)3606return rc;3607break;3608case CPU_ID_SCHED_ARC4:3609case CPU_ID_SCHED_ARC5:3610case CPU_ID_MME_QMAN_ARC0:3611case CPU_ID_MME_QMAN_ARC1:3612reg_base = gaudi2_arc_blocks_bases[cpu_id];36133614/* Scrub lower DCCM block */3615rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],3616ARC_DCCM_BLOCK_SIZE, true);3617if (rc)3618return rc;36193620/* Switch to upper DCCM block */3621reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_MME_ARC_UPPER_DCCM_EN_VAL_MASK, 1);3622WREG32(reg_base + ARC_DCCM_UPPER_EN_OFFSET, reg_val);36233624/* Scrub upper DCCM block */3625rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],3626ARC_DCCM_BLOCK_SIZE, true);3627if (rc)3628return rc;36293630/* Switch to lower DCCM block */3631reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_MME_ARC_UPPER_DCCM_EN_VAL_MASK, 0);3632WREG32(reg_base + ARC_DCCM_UPPER_EN_OFFSET, reg_val);3633break;3634default:3635rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],3636ARC_DCCM_BLOCK_SIZE, true);3637if (rc)3638return rc;3639}36403641return 0;3642}36433644static int gaudi2_scrub_arcs_dccm(struct hl_device *hdev)3645{3646u16 arc_id;3647int rc;36483649for (arc_id = CPU_ID_SCHED_ARC0 ; arc_id < CPU_ID_MAX ; arc_id++) {3650if (!gaudi2_is_arc_enabled(hdev, arc_id))3651continue;36523653rc = gaudi2_scrub_arc_dccm(hdev, arc_id);3654if (rc)3655return rc;3656}36573658return 0;3659}36603661static int gaudi2_late_init(struct hl_device *hdev)3662{3663struct gaudi2_device *gaudi2 = hdev->asic_specific;3664int rc;36653666rc = hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_ENABLE_PCI_ACCESS,3667gaudi2->virt_msix_db_dma_addr);3668if (rc)3669return rc;36703671rc = gaudi2_fetch_psoc_frequency(hdev);3672if (rc) {3673dev_err(hdev->dev, "Failed to fetch psoc frequency\n");3674goto disable_pci_access;3675}36763677rc = gaudi2_mmu_clear_pgt_range(hdev);3678if (rc) {3679dev_err(hdev->dev, "Failed to clear MMU page tables range\n");3680goto disable_pci_access;3681}36823683gaudi2_init_arcs(hdev);36843685rc = gaudi2_scrub_arcs_dccm(hdev);3686if (rc) {3687dev_err(hdev->dev, "Failed to scrub arcs DCCM\n");3688goto disable_pci_access;3689}36903691gaudi2_init_security(hdev);36923693return 0;36943695disable_pci_access:3696hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_DISABLE_PCI_ACCESS, 0x0);36973698return rc;3699}37003701static void gaudi2_late_fini(struct hl_device *hdev)3702{3703hl_hwmon_release_resources(hdev);3704}37053706static void gaudi2_user_mapped_dec_init(struct gaudi2_device *gaudi2, u32 start_idx)3707{3708struct user_mapped_block *blocks = gaudi2->mapped_blocks;37093710HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE0_DEC0_CMD_BASE, HL_BLOCK_SIZE);3711HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE0_DEC1_CMD_BASE, HL_BLOCK_SIZE);3712HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE1_DEC0_CMD_BASE, HL_BLOCK_SIZE);3713HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE1_DEC1_CMD_BASE, HL_BLOCK_SIZE);3714HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE2_DEC0_CMD_BASE, HL_BLOCK_SIZE);3715HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE2_DEC1_CMD_BASE, HL_BLOCK_SIZE);3716HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE3_DEC0_CMD_BASE, HL_BLOCK_SIZE);3717HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE3_DEC1_CMD_BASE, HL_BLOCK_SIZE);3718HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmPCIE_DEC0_CMD_BASE, HL_BLOCK_SIZE);3719HL_USR_MAPPED_BLK_INIT(&blocks[start_idx], mmPCIE_DEC1_CMD_BASE, HL_BLOCK_SIZE);3720}37213722static void gaudi2_user_mapped_blocks_init(struct hl_device *hdev)3723{3724struct gaudi2_device *gaudi2 = hdev->asic_specific;3725struct user_mapped_block *blocks = gaudi2->mapped_blocks;3726u32 block_size, umr_start_idx, num_umr_blocks;3727int i;37283729for (i = 0 ; i < NUM_ARC_CPUS ; i++) {3730if (i >= CPU_ID_SCHED_ARC0 && i <= CPU_ID_SCHED_ARC3)3731block_size = ARC_DCCM_BLOCK_SIZE * 2;3732else3733block_size = ARC_DCCM_BLOCK_SIZE;37343735blocks[i].address = gaudi2_arc_dccm_bases[i];3736blocks[i].size = block_size;3737}37383739blocks[NUM_ARC_CPUS].address = mmARC_FARM_ARC0_ACP_ENG_BASE;3740blocks[NUM_ARC_CPUS].size = HL_BLOCK_SIZE;37413742blocks[NUM_ARC_CPUS + 1].address = mmARC_FARM_ARC1_ACP_ENG_BASE;3743blocks[NUM_ARC_CPUS + 1].size = HL_BLOCK_SIZE;37443745blocks[NUM_ARC_CPUS + 2].address = mmARC_FARM_ARC2_ACP_ENG_BASE;3746blocks[NUM_ARC_CPUS + 2].size = HL_BLOCK_SIZE;37473748blocks[NUM_ARC_CPUS + 3].address = mmARC_FARM_ARC3_ACP_ENG_BASE;3749blocks[NUM_ARC_CPUS + 3].size = HL_BLOCK_SIZE;37503751blocks[NUM_ARC_CPUS + 4].address = mmDCORE0_MME_QM_ARC_ACP_ENG_BASE;3752blocks[NUM_ARC_CPUS + 4].size = HL_BLOCK_SIZE;37533754blocks[NUM_ARC_CPUS + 5].address = mmDCORE1_MME_QM_ARC_ACP_ENG_BASE;3755blocks[NUM_ARC_CPUS + 5].size = HL_BLOCK_SIZE;37563757blocks[NUM_ARC_CPUS + 6].address = mmDCORE2_MME_QM_ARC_ACP_ENG_BASE;3758blocks[NUM_ARC_CPUS + 6].size = HL_BLOCK_SIZE;37593760blocks[NUM_ARC_CPUS + 7].address = mmDCORE3_MME_QM_ARC_ACP_ENG_BASE;3761blocks[NUM_ARC_CPUS + 7].size = HL_BLOCK_SIZE;37623763umr_start_idx = NUM_ARC_CPUS + NUM_OF_USER_ACP_BLOCKS;3764num_umr_blocks = NIC_NUMBER_OF_ENGINES * NUM_OF_USER_NIC_UMR_BLOCKS;3765for (i = 0 ; i < num_umr_blocks ; i++) {3766u8 nic_id, umr_block_id;37673768nic_id = i / NUM_OF_USER_NIC_UMR_BLOCKS;3769umr_block_id = i % NUM_OF_USER_NIC_UMR_BLOCKS;37703771blocks[umr_start_idx + i].address =3772mmNIC0_UMR0_0_UNSECURE_DOORBELL0_BASE +3773(nic_id / NIC_NUMBER_OF_QM_PER_MACRO) * NIC_OFFSET +3774(nic_id % NIC_NUMBER_OF_QM_PER_MACRO) * NIC_QM_OFFSET +3775umr_block_id * NIC_UMR_OFFSET;3776blocks[umr_start_idx + i].size = HL_BLOCK_SIZE;3777}37783779/* Expose decoder HW configuration block to user */3780gaudi2_user_mapped_dec_init(gaudi2, USR_MAPPED_BLK_DEC_START_IDX);37813782for (i = 1; i < NUM_OF_DCORES; ++i) {3783blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1)].size = SM_OBJS_BLOCK_SIZE;3784blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1) + 1].size = HL_BLOCK_SIZE;37853786blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1)].address =3787mmDCORE0_SYNC_MNGR_OBJS_BASE + i * DCORE_OFFSET;37883789blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1) + 1].address =3790mmDCORE0_SYNC_MNGR_GLBL_BASE + i * DCORE_OFFSET;3791}3792}37933794static int gaudi2_alloc_cpu_accessible_dma_mem(struct hl_device *hdev)3795{3796dma_addr_t dma_addr_arr[GAUDI2_ALLOC_CPU_MEM_RETRY_CNT] = {}, end_addr;3797void *virt_addr_arr[GAUDI2_ALLOC_CPU_MEM_RETRY_CNT] = {};3798int i, j, rc = 0;37993800/* The device ARC works with 32-bits addresses, and because there is a single HW register3801* that holds the extension bits (49..28), these bits must be identical in all the allocated3802* range.3803*/38043805for (i = 0 ; i < GAUDI2_ALLOC_CPU_MEM_RETRY_CNT ; i++) {3806virt_addr_arr[i] = hl_asic_dma_alloc_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE,3807&dma_addr_arr[i], GFP_KERNEL | __GFP_ZERO);3808if (!virt_addr_arr[i]) {3809rc = -ENOMEM;3810goto free_dma_mem_arr;3811}38123813end_addr = dma_addr_arr[i] + HL_CPU_ACCESSIBLE_MEM_SIZE - 1;3814if (GAUDI2_ARC_PCI_MSB_ADDR(dma_addr_arr[i]) == GAUDI2_ARC_PCI_MSB_ADDR(end_addr))3815break;3816}38173818if (i == GAUDI2_ALLOC_CPU_MEM_RETRY_CNT) {3819dev_err(hdev->dev,3820"MSB of ARC accessible DMA memory are not identical in all range\n");3821rc = -EFAULT;3822goto free_dma_mem_arr;3823}38243825hdev->cpu_accessible_dma_mem = virt_addr_arr[i];3826hdev->cpu_accessible_dma_address = dma_addr_arr[i];38273828free_dma_mem_arr:3829for (j = 0 ; j < i ; j++)3830hl_asic_dma_free_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE, virt_addr_arr[j],3831dma_addr_arr[j]);38323833return rc;3834}38353836static void gaudi2_set_pci_memory_regions(struct hl_device *hdev)3837{3838struct asic_fixed_properties *prop = &hdev->asic_prop;3839struct pci_mem_region *region;38403841/* CFG */3842region = &hdev->pci_mem_region[PCI_REGION_CFG];3843region->region_base = CFG_BASE;3844region->region_size = CFG_SIZE;3845region->offset_in_bar = CFG_BASE - STM_FLASH_BASE_ADDR;3846region->bar_size = CFG_BAR_SIZE;3847region->bar_id = SRAM_CFG_BAR_ID;3848region->used = 1;38493850/* SRAM */3851region = &hdev->pci_mem_region[PCI_REGION_SRAM];3852region->region_base = SRAM_BASE_ADDR;3853region->region_size = SRAM_SIZE;3854region->offset_in_bar = CFG_REGION_SIZE + BAR0_RSRVD_SIZE;3855region->bar_size = CFG_BAR_SIZE;3856region->bar_id = SRAM_CFG_BAR_ID;3857region->used = 1;38583859/* DRAM */3860region = &hdev->pci_mem_region[PCI_REGION_DRAM];3861region->region_base = DRAM_PHYS_BASE;3862region->region_size = hdev->asic_prop.dram_size;3863region->offset_in_bar = 0;3864region->bar_size = prop->dram_pci_bar_size;3865region->bar_id = DRAM_BAR_ID;3866region->used = 1;3867}38683869static void gaudi2_user_interrupt_setup(struct hl_device *hdev)3870{3871struct asic_fixed_properties *prop = &hdev->asic_prop;3872int i, j, k;38733874/* Initialize TPC interrupt */3875HL_USR_INTR_STRUCT_INIT(hdev->tpc_interrupt, hdev, 0, HL_USR_INTERRUPT_TPC);38763877/* Initialize unexpected error interrupt */3878HL_USR_INTR_STRUCT_INIT(hdev->unexpected_error_interrupt, hdev, 0,3879HL_USR_INTERRUPT_UNEXPECTED);38803881/* Initialize common user CQ interrupt */3882HL_USR_INTR_STRUCT_INIT(hdev->common_user_cq_interrupt, hdev,3883HL_COMMON_USER_CQ_INTERRUPT_ID, HL_USR_INTERRUPT_CQ);38843885/* Initialize common decoder interrupt */3886HL_USR_INTR_STRUCT_INIT(hdev->common_decoder_interrupt, hdev,3887HL_COMMON_DEC_INTERRUPT_ID, HL_USR_INTERRUPT_DECODER);38883889/* User interrupts structure holds both decoder and user interrupts from various engines.3890* We first initialize the decoder interrupts and then we add the user interrupts.3891* The only limitation is that the last decoder interrupt id must be smaller3892* then GAUDI2_IRQ_NUM_USER_FIRST. This is checked at compilation time.3893*/38943895/* Initialize decoder interrupts, expose only normal interrupts,3896* error interrupts to be handled by driver3897*/3898for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM, j = 0 ; i <= GAUDI2_IRQ_NUM_SHARED_DEC1_NRM;3899i += 2, j++)3900HL_USR_INTR_STRUCT_INIT(hdev->user_interrupt[j], hdev, i,3901HL_USR_INTERRUPT_DECODER);39023903for (i = GAUDI2_IRQ_NUM_USER_FIRST, k = 0 ; k < prop->user_interrupt_count; i++, j++, k++)3904HL_USR_INTR_STRUCT_INIT(hdev->user_interrupt[j], hdev, i, HL_USR_INTERRUPT_CQ);3905}39063907static inline int gaudi2_get_non_zero_random_int(void)3908{3909int rand = get_random_u32();39103911return rand ? rand : 1;3912}39133914static void gaudi2_special_blocks_free(struct hl_device *hdev)3915{3916struct asic_fixed_properties *prop = &hdev->asic_prop;3917struct hl_skip_blocks_cfg *skip_special_blocks_cfg =3918&prop->skip_special_blocks_cfg;39193920kfree(prop->special_blocks);3921kfree(skip_special_blocks_cfg->block_types);3922kfree(skip_special_blocks_cfg->block_ranges);3923}39243925static void gaudi2_special_blocks_iterator_free(struct hl_device *hdev)3926{3927gaudi2_special_blocks_free(hdev);3928}39293930static bool gaudi2_special_block_skip(struct hl_device *hdev,3931struct hl_special_blocks_cfg *special_blocks_cfg,3932u32 blk_idx, u32 major, u32 minor, u32 sub_minor)3933{3934return false;3935}39363937static int gaudi2_special_blocks_config(struct hl_device *hdev)3938{3939struct asic_fixed_properties *prop = &hdev->asic_prop;3940int i, rc;39413942/* Configure Special blocks */3943prop->glbl_err_max_cause_num = GAUDI2_GLBL_ERR_MAX_CAUSE_NUM;3944prop->num_of_special_blocks = ARRAY_SIZE(gaudi2_special_blocks);3945prop->special_blocks = kmalloc_array(prop->num_of_special_blocks,3946sizeof(*prop->special_blocks), GFP_KERNEL);3947if (!prop->special_blocks)3948return -ENOMEM;39493950for (i = 0 ; i < prop->num_of_special_blocks ; i++)3951memcpy(&prop->special_blocks[i], &gaudi2_special_blocks[i],3952sizeof(*prop->special_blocks));39533954/* Configure when to skip Special blocks */3955memset(&prop->skip_special_blocks_cfg, 0, sizeof(prop->skip_special_blocks_cfg));3956prop->skip_special_blocks_cfg.skip_block_hook = gaudi2_special_block_skip;39573958if (ARRAY_SIZE(gaudi2_iterator_skip_block_types)) {3959prop->skip_special_blocks_cfg.block_types =3960kmalloc_array(ARRAY_SIZE(gaudi2_iterator_skip_block_types),3961sizeof(gaudi2_iterator_skip_block_types[0]), GFP_KERNEL);3962if (!prop->skip_special_blocks_cfg.block_types) {3963rc = -ENOMEM;3964goto free_special_blocks;3965}39663967memcpy(prop->skip_special_blocks_cfg.block_types, gaudi2_iterator_skip_block_types,3968sizeof(gaudi2_iterator_skip_block_types));39693970prop->skip_special_blocks_cfg.block_types_len =3971ARRAY_SIZE(gaudi2_iterator_skip_block_types);3972}39733974if (ARRAY_SIZE(gaudi2_iterator_skip_block_ranges)) {3975prop->skip_special_blocks_cfg.block_ranges =3976kmalloc_array(ARRAY_SIZE(gaudi2_iterator_skip_block_ranges),3977sizeof(gaudi2_iterator_skip_block_ranges[0]), GFP_KERNEL);3978if (!prop->skip_special_blocks_cfg.block_ranges) {3979rc = -ENOMEM;3980goto free_skip_special_blocks_types;3981}39823983for (i = 0 ; i < ARRAY_SIZE(gaudi2_iterator_skip_block_ranges) ; i++)3984memcpy(&prop->skip_special_blocks_cfg.block_ranges[i],3985&gaudi2_iterator_skip_block_ranges[i],3986sizeof(struct range));39873988prop->skip_special_blocks_cfg.block_ranges_len =3989ARRAY_SIZE(gaudi2_iterator_skip_block_ranges);3990}39913992return 0;39933994free_skip_special_blocks_types:3995kfree(prop->skip_special_blocks_cfg.block_types);3996free_special_blocks:3997kfree(prop->special_blocks);39983999return rc;4000}40014002static int gaudi2_special_blocks_iterator_config(struct hl_device *hdev)4003{4004return gaudi2_special_blocks_config(hdev);4005}40064007static void gaudi2_test_queues_msgs_free(struct hl_device *hdev)4008{4009struct gaudi2_device *gaudi2 = hdev->asic_specific;4010struct gaudi2_queues_test_info *msg_info = gaudi2->queues_test_info;4011int i;40124013for (i = 0 ; i < GAUDI2_NUM_TESTED_QS ; i++) {4014/* bail-out if this is an allocation failure point */4015if (!msg_info[i].kern_addr)4016break;40174018hl_asic_dma_pool_free(hdev, msg_info[i].kern_addr, msg_info[i].dma_addr);4019msg_info[i].kern_addr = NULL;4020}4021}40224023static int gaudi2_test_queues_msgs_alloc(struct hl_device *hdev)4024{4025struct gaudi2_device *gaudi2 = hdev->asic_specific;4026struct gaudi2_queues_test_info *msg_info = gaudi2->queues_test_info;4027int i, rc;40284029/* allocate a message-short buf for each Q we intend to test */4030for (i = 0 ; i < GAUDI2_NUM_TESTED_QS ; i++) {4031msg_info[i].kern_addr =4032(void *)hl_asic_dma_pool_zalloc(hdev, sizeof(struct packet_msg_short),4033GFP_KERNEL, &msg_info[i].dma_addr);4034if (!msg_info[i].kern_addr) {4035dev_err(hdev->dev,4036"Failed to allocate dma memory for H/W queue %d testing\n", i);4037rc = -ENOMEM;4038goto err_exit;4039}4040}40414042return 0;40434044err_exit:4045gaudi2_test_queues_msgs_free(hdev);4046return rc;4047}40484049static int gaudi2_sw_init(struct hl_device *hdev)4050{4051struct asic_fixed_properties *prop = &hdev->asic_prop;4052struct gaudi2_device *gaudi2;4053int i, rc;40544055/* Allocate device structure */4056gaudi2 = kzalloc(sizeof(*gaudi2), GFP_KERNEL);4057if (!gaudi2)4058return -ENOMEM;40594060for (i = 0 ; i < ARRAY_SIZE(gaudi2_irq_map_table) ; i++) {4061if (gaudi2_irq_map_table[i].msg || !gaudi2_irq_map_table[i].valid)4062continue;40634064if (gaudi2->num_of_valid_hw_events == GAUDI2_EVENT_SIZE) {4065dev_err(hdev->dev, "H/W events array exceeds the limit of %u events\n",4066GAUDI2_EVENT_SIZE);4067rc = -EINVAL;4068goto free_gaudi2_device;4069}40704071gaudi2->hw_events[gaudi2->num_of_valid_hw_events++] = gaudi2_irq_map_table[i].fc_id;4072}40734074for (i = 0 ; i < MME_NUM_OF_LFSR_SEEDS ; i++)4075gaudi2->lfsr_rand_seeds[i] = gaudi2_get_non_zero_random_int();40764077gaudi2->cpucp_info_get = gaudi2_cpucp_info_get;40784079hdev->asic_specific = gaudi2;40804081/* Create DMA pool for small allocations.4082* Use DEVICE_CACHE_LINE_SIZE for alignment since the NIC memory-mapped4083* PI/CI registers allocated from this pool have this restriction4084*/4085hdev->dma_pool = dma_pool_create(dev_name(hdev->dev), &hdev->pdev->dev,4086GAUDI2_DMA_POOL_BLK_SIZE, DEVICE_CACHE_LINE_SIZE, 0);4087if (!hdev->dma_pool) {4088dev_err(hdev->dev, "failed to create DMA pool\n");4089rc = -ENOMEM;4090goto free_gaudi2_device;4091}40924093rc = gaudi2_alloc_cpu_accessible_dma_mem(hdev);4094if (rc)4095goto free_dma_pool;40964097hdev->cpu_accessible_dma_pool = gen_pool_create(ilog2(32), -1);4098if (!hdev->cpu_accessible_dma_pool) {4099dev_err(hdev->dev, "Failed to create CPU accessible DMA pool\n");4100rc = -ENOMEM;4101goto free_cpu_dma_mem;4102}41034104rc = gen_pool_add(hdev->cpu_accessible_dma_pool, (uintptr_t) hdev->cpu_accessible_dma_mem,4105HL_CPU_ACCESSIBLE_MEM_SIZE, -1);4106if (rc) {4107dev_err(hdev->dev, "Failed to add memory to CPU accessible DMA pool\n");4108rc = -EFAULT;4109goto free_cpu_accessible_dma_pool;4110}41114112gaudi2->virt_msix_db_cpu_addr = hl_cpu_accessible_dma_pool_alloc(hdev, prop->pmmu.page_size,4113&gaudi2->virt_msix_db_dma_addr);4114if (!gaudi2->virt_msix_db_cpu_addr) {4115dev_err(hdev->dev, "Failed to allocate DMA memory for virtual MSI-X doorbell\n");4116rc = -ENOMEM;4117goto free_cpu_accessible_dma_pool;4118}41194120spin_lock_init(&gaudi2->hw_queues_lock);41214122gaudi2->scratchpad_bus_address = prop->mmu_pgt_addr + HMMU_PAGE_TABLES_SIZE + EDMA_PQS_SIZE;41234124gaudi2_user_mapped_blocks_init(hdev);41254126/* Initialize user interrupts */4127gaudi2_user_interrupt_setup(hdev);41284129hdev->supports_coresight = true;4130hdev->supports_sync_stream = true;4131hdev->supports_cb_mapping = true;4132hdev->supports_wait_for_multi_cs = false;41334134prop->supports_compute_reset = true;41354136/* Event queue sanity check added in FW version 1.11 */4137if (hl_fw_version_cmp(hdev, 1, 11, 0) < 0)4138hdev->event_queue.check_eqe_index = false;4139else4140hdev->event_queue.check_eqe_index = true;41414142hdev->asic_funcs->set_pci_memory_regions(hdev);41434144rc = gaudi2_special_blocks_iterator_config(hdev);4145if (rc)4146goto free_virt_msix_db_mem;41474148rc = gaudi2_test_queues_msgs_alloc(hdev);4149if (rc)4150goto special_blocks_free;41514152hdev->heartbeat_debug_info.cpu_queue_id = GAUDI2_QUEUE_ID_CPU_PQ;41534154return 0;41554156special_blocks_free:4157gaudi2_special_blocks_iterator_free(hdev);4158free_virt_msix_db_mem:4159hl_cpu_accessible_dma_pool_free(hdev, prop->pmmu.page_size, gaudi2->virt_msix_db_cpu_addr);4160free_cpu_accessible_dma_pool:4161gen_pool_destroy(hdev->cpu_accessible_dma_pool);4162free_cpu_dma_mem:4163hl_asic_dma_free_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE, hdev->cpu_accessible_dma_mem,4164hdev->cpu_accessible_dma_address);4165free_dma_pool:4166dma_pool_destroy(hdev->dma_pool);4167free_gaudi2_device:4168kfree(gaudi2);4169return rc;4170}41714172static int gaudi2_sw_fini(struct hl_device *hdev)4173{4174struct asic_fixed_properties *prop = &hdev->asic_prop;4175struct gaudi2_device *gaudi2 = hdev->asic_specific;41764177gaudi2_test_queues_msgs_free(hdev);41784179gaudi2_special_blocks_iterator_free(hdev);41804181hl_cpu_accessible_dma_pool_free(hdev, prop->pmmu.page_size, gaudi2->virt_msix_db_cpu_addr);41824183gen_pool_destroy(hdev->cpu_accessible_dma_pool);41844185hl_asic_dma_free_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE, hdev->cpu_accessible_dma_mem,4186hdev->cpu_accessible_dma_address);41874188dma_pool_destroy(hdev->dma_pool);41894190kfree(gaudi2);41914192return 0;4193}41944195static void gaudi2_stop_qman_common(struct hl_device *hdev, u32 reg_base)4196{4197WREG32(reg_base + QM_GLBL_CFG1_OFFSET, QM_GLBL_CFG1_PQF_STOP |4198QM_GLBL_CFG1_CQF_STOP |4199QM_GLBL_CFG1_CP_STOP);42004201/* stop also the ARC */4202WREG32(reg_base + QM_GLBL_CFG2_OFFSET, QM_GLBL_CFG2_ARC_CQF_STOP);4203}42044205static void gaudi2_flush_qman_common(struct hl_device *hdev, u32 reg_base)4206{4207WREG32(reg_base + QM_GLBL_CFG1_OFFSET, QM_GLBL_CFG1_PQF_FLUSH |4208QM_GLBL_CFG1_CQF_FLUSH |4209QM_GLBL_CFG1_CP_FLUSH);4210}42114212static void gaudi2_flush_qman_arc_common(struct hl_device *hdev, u32 reg_base)4213{4214WREG32(reg_base + QM_GLBL_CFG2_OFFSET, QM_GLBL_CFG2_ARC_CQF_FLUSH);4215}42164217/**4218* gaudi2_clear_qm_fence_counters_common - clear QM's fence counters4219*4220* @hdev: pointer to the habanalabs device structure4221* @queue_id: queue to clear fence counters to4222* @skip_fence: if true set maximum fence value to all fence counters to avoid4223* getting stuck on any fence value. otherwise set all fence4224* counters to 0 (standard clear of fence counters)4225*/4226static void gaudi2_clear_qm_fence_counters_common(struct hl_device *hdev, u32 queue_id,4227bool skip_fence)4228{4229u32 size, reg_base;4230u32 addr, val;42314232reg_base = gaudi2_qm_blocks_bases[queue_id];42334234addr = reg_base + QM_CP_FENCE0_CNT_0_OFFSET;4235size = mmPDMA0_QM_CP_BARRIER_CFG - mmPDMA0_QM_CP_FENCE0_CNT_0;42364237/*4238* in case we want to make sure that QM that is stuck on a fence will4239* be released we should set the fence counter to a higher value that4240* the value the QM waiting for. to comply with any fence counter of4241* any value we set maximum fence value to all counters4242*/4243val = skip_fence ? U32_MAX : 0;4244gaudi2_memset_device_lbw(hdev, addr, size, val);4245}42464247static void gaudi2_qman_manual_flush_common(struct hl_device *hdev, u32 queue_id)4248{4249u32 reg_base = gaudi2_qm_blocks_bases[queue_id];42504251gaudi2_clear_qm_fence_counters_common(hdev, queue_id, true);4252gaudi2_flush_qman_common(hdev, reg_base);4253gaudi2_flush_qman_arc_common(hdev, reg_base);4254}42554256static void gaudi2_stop_dma_qmans(struct hl_device *hdev)4257{4258struct gaudi2_device *gaudi2 = hdev->asic_specific;4259int dcore, inst;42604261if (!(gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK))4262goto stop_edma_qmans;42634264/* Stop CPs of PDMA QMANs */4265gaudi2_stop_qman_common(hdev, mmPDMA0_QM_BASE);4266gaudi2_stop_qman_common(hdev, mmPDMA1_QM_BASE);42674268stop_edma_qmans:4269if (!(gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK))4270return;42714272for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {4273for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {4274u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;4275u32 qm_base;42764277if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_EDMA_SHIFT + seq)))4278continue;42794280qm_base = mmDCORE0_EDMA0_QM_BASE + dcore * DCORE_OFFSET +4281inst * DCORE_EDMA_OFFSET;42824283/* Stop CPs of EDMA QMANs */4284gaudi2_stop_qman_common(hdev, qm_base);4285}4286}4287}42884289static void gaudi2_stop_mme_qmans(struct hl_device *hdev)4290{4291struct gaudi2_device *gaudi2 = hdev->asic_specific;4292u32 offset, i;42934294offset = mmDCORE1_MME_QM_BASE - mmDCORE0_MME_QM_BASE;42954296for (i = 0 ; i < NUM_OF_DCORES ; i++) {4297if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_MME_SHIFT + i)))4298continue;42994300gaudi2_stop_qman_common(hdev, mmDCORE0_MME_QM_BASE + (i * offset));4301}4302}43034304static void gaudi2_stop_tpc_qmans(struct hl_device *hdev)4305{4306struct gaudi2_device *gaudi2 = hdev->asic_specific;4307u32 reg_base;4308int i;43094310if (!(gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK))4311return;43124313for (i = 0 ; i < TPC_ID_SIZE ; i++) {4314if (!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(HW_CAP_TPC_SHIFT + i)))4315continue;43164317reg_base = gaudi2_qm_blocks_bases[gaudi2_tpc_id_to_queue_id[i]];4318gaudi2_stop_qman_common(hdev, reg_base);4319}4320}43214322static void gaudi2_stop_rot_qmans(struct hl_device *hdev)4323{4324struct gaudi2_device *gaudi2 = hdev->asic_specific;4325u32 reg_base;4326int i;43274328if (!(gaudi2->hw_cap_initialized & HW_CAP_ROT_MASK))4329return;43304331for (i = 0 ; i < ROTATOR_ID_SIZE ; i++) {4332if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_ROT_SHIFT + i)))4333continue;43344335reg_base = gaudi2_qm_blocks_bases[gaudi2_rot_id_to_queue_id[i]];4336gaudi2_stop_qman_common(hdev, reg_base);4337}4338}43394340static void gaudi2_stop_nic_qmans(struct hl_device *hdev)4341{4342struct gaudi2_device *gaudi2 = hdev->asic_specific;4343u32 reg_base, queue_id;4344int i;43454346if (!(gaudi2->nic_hw_cap_initialized & HW_CAP_NIC_MASK))4347return;43484349queue_id = GAUDI2_QUEUE_ID_NIC_0_0;43504351for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++, queue_id += NUM_OF_PQ_PER_QMAN) {4352if (!(hdev->nic_ports_mask & BIT(i)))4353continue;43544355reg_base = gaudi2_qm_blocks_bases[queue_id];4356gaudi2_stop_qman_common(hdev, reg_base);4357}4358}43594360static void gaudi2_stall_dma_common(struct hl_device *hdev, u32 reg_base)4361{4362u32 reg_val;43634364reg_val = FIELD_PREP(PDMA0_CORE_CFG_1_HALT_MASK, 0x1);4365WREG32(reg_base + DMA_CORE_CFG_1_OFFSET, reg_val);4366}43674368static void gaudi2_dma_stall(struct hl_device *hdev)4369{4370struct gaudi2_device *gaudi2 = hdev->asic_specific;4371int dcore, inst;43724373if (!(gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK))4374goto stall_edma;43754376gaudi2_stall_dma_common(hdev, mmPDMA0_CORE_BASE);4377gaudi2_stall_dma_common(hdev, mmPDMA1_CORE_BASE);43784379stall_edma:4380if (!(gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK))4381return;43824383for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {4384for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {4385u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;4386u32 core_base;43874388if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_EDMA_SHIFT + seq)))4389continue;43904391core_base = mmDCORE0_EDMA0_CORE_BASE + dcore * DCORE_OFFSET +4392inst * DCORE_EDMA_OFFSET;43934394/* Stall CPs of EDMA QMANs */4395gaudi2_stall_dma_common(hdev, core_base);4396}4397}4398}43994400static void gaudi2_mme_stall(struct hl_device *hdev)4401{4402struct gaudi2_device *gaudi2 = hdev->asic_specific;4403u32 offset, i;44044405offset = mmDCORE1_MME_CTRL_LO_QM_STALL - mmDCORE0_MME_CTRL_LO_QM_STALL;44064407for (i = 0 ; i < NUM_OF_DCORES ; i++)4408if (gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_MME_SHIFT + i))4409WREG32(mmDCORE0_MME_CTRL_LO_QM_STALL + (i * offset), 1);4410}44114412static void gaudi2_tpc_stall(struct hl_device *hdev)4413{4414struct gaudi2_device *gaudi2 = hdev->asic_specific;4415u32 reg_base;4416int i;44174418if (!(gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK))4419return;44204421for (i = 0 ; i < TPC_ID_SIZE ; i++) {4422if (!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(HW_CAP_TPC_SHIFT + i)))4423continue;44244425reg_base = gaudi2_tpc_cfg_blocks_bases[i];4426WREG32(reg_base + TPC_CFG_STALL_OFFSET, 1);4427}4428}44294430static void gaudi2_rotator_stall(struct hl_device *hdev)4431{4432struct gaudi2_device *gaudi2 = hdev->asic_specific;4433u32 reg_val;4434int i;44354436if (!(gaudi2->hw_cap_initialized & HW_CAP_ROT_MASK))4437return;44384439reg_val = FIELD_PREP(ROT_MSS_HALT_WBC_MASK, 0x1) |4440FIELD_PREP(ROT_MSS_HALT_RSB_MASK, 0x1) |4441FIELD_PREP(ROT_MSS_HALT_MRSB_MASK, 0x1);44424443for (i = 0 ; i < ROTATOR_ID_SIZE ; i++) {4444if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_ROT_SHIFT + i)))4445continue;44464447WREG32(mmROT0_MSS_HALT + i * ROT_OFFSET, reg_val);4448}4449}44504451static void gaudi2_disable_qman_common(struct hl_device *hdev, u32 reg_base)4452{4453WREG32(reg_base + QM_GLBL_CFG0_OFFSET, 0);4454}44554456static void gaudi2_disable_dma_qmans(struct hl_device *hdev)4457{4458struct gaudi2_device *gaudi2 = hdev->asic_specific;4459int dcore, inst;44604461if (!(gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK))4462goto stop_edma_qmans;44634464gaudi2_disable_qman_common(hdev, mmPDMA0_QM_BASE);4465gaudi2_disable_qman_common(hdev, mmPDMA1_QM_BASE);44664467stop_edma_qmans:4468if (!(gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK))4469return;44704471for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {4472for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {4473u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;4474u32 qm_base;44754476if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_EDMA_SHIFT + seq)))4477continue;44784479qm_base = mmDCORE0_EDMA0_QM_BASE + dcore * DCORE_OFFSET +4480inst * DCORE_EDMA_OFFSET;44814482/* Disable CPs of EDMA QMANs */4483gaudi2_disable_qman_common(hdev, qm_base);4484}4485}4486}44874488static void gaudi2_disable_mme_qmans(struct hl_device *hdev)4489{4490struct gaudi2_device *gaudi2 = hdev->asic_specific;4491u32 offset, i;44924493offset = mmDCORE1_MME_QM_BASE - mmDCORE0_MME_QM_BASE;44944495for (i = 0 ; i < NUM_OF_DCORES ; i++)4496if (gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_MME_SHIFT + i))4497gaudi2_disable_qman_common(hdev, mmDCORE0_MME_QM_BASE + (i * offset));4498}44994500static void gaudi2_disable_tpc_qmans(struct hl_device *hdev)4501{4502struct gaudi2_device *gaudi2 = hdev->asic_specific;4503u32 reg_base;4504int i;45054506if (!(gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK))4507return;45084509for (i = 0 ; i < TPC_ID_SIZE ; i++) {4510if (!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(HW_CAP_TPC_SHIFT + i)))4511continue;45124513reg_base = gaudi2_qm_blocks_bases[gaudi2_tpc_id_to_queue_id[i]];4514gaudi2_disable_qman_common(hdev, reg_base);4515}4516}45174518static void gaudi2_disable_rot_qmans(struct hl_device *hdev)4519{4520struct gaudi2_device *gaudi2 = hdev->asic_specific;4521u32 reg_base;4522int i;45234524if (!(gaudi2->hw_cap_initialized & HW_CAP_ROT_MASK))4525return;45264527for (i = 0 ; i < ROTATOR_ID_SIZE ; i++) {4528if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_ROT_SHIFT + i)))4529continue;45304531reg_base = gaudi2_qm_blocks_bases[gaudi2_rot_id_to_queue_id[i]];4532gaudi2_disable_qman_common(hdev, reg_base);4533}4534}45354536static void gaudi2_disable_nic_qmans(struct hl_device *hdev)4537{4538struct gaudi2_device *gaudi2 = hdev->asic_specific;4539u32 reg_base, queue_id;4540int i;45414542if (!(gaudi2->nic_hw_cap_initialized & HW_CAP_NIC_MASK))4543return;45444545queue_id = GAUDI2_QUEUE_ID_NIC_0_0;45464547for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++, queue_id += NUM_OF_PQ_PER_QMAN) {4548if (!(hdev->nic_ports_mask & BIT(i)))4549continue;45504551reg_base = gaudi2_qm_blocks_bases[queue_id];4552gaudi2_disable_qman_common(hdev, reg_base);4553}4554}45554556static void gaudi2_enable_timestamp(struct hl_device *hdev)4557{4558/* Disable the timestamp counter */4559WREG32(mmPSOC_TIMESTAMP_BASE, 0);45604561/* Zero the lower/upper parts of the 64-bit counter */4562WREG32(mmPSOC_TIMESTAMP_BASE + 0xC, 0);4563WREG32(mmPSOC_TIMESTAMP_BASE + 0x8, 0);45644565/* Enable the counter */4566WREG32(mmPSOC_TIMESTAMP_BASE, 1);4567}45684569static void gaudi2_disable_timestamp(struct hl_device *hdev)4570{4571/* Disable the timestamp counter */4572WREG32(mmPSOC_TIMESTAMP_BASE, 0);4573}45744575static const char *gaudi2_irq_name(u16 irq_number)4576{4577switch (irq_number) {4578case GAUDI2_IRQ_NUM_EVENT_QUEUE:4579return "gaudi2 cpu eq";4580case GAUDI2_IRQ_NUM_COMPLETION:4581return "gaudi2 completion";4582case GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM ... GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM:4583return gaudi2_vdec_irq_name[irq_number - GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM];4584case GAUDI2_IRQ_NUM_TPC_ASSERT:4585return "gaudi2 tpc assert";4586case GAUDI2_IRQ_NUM_UNEXPECTED_ERROR:4587return "gaudi2 unexpected error";4588case GAUDI2_IRQ_NUM_USER_FIRST ... GAUDI2_IRQ_NUM_USER_LAST:4589return "gaudi2 user completion";4590case GAUDI2_IRQ_NUM_EQ_ERROR:4591return "gaudi2 eq error";4592default:4593return "invalid";4594}4595}45964597static void gaudi2_dec_disable_msix(struct hl_device *hdev, u32 max_irq_num)4598{4599int i, irq, relative_idx;4600struct hl_dec *dec;46014602for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM ; i < max_irq_num ; i++) {4603irq = pci_irq_vector(hdev->pdev, i);4604relative_idx = i - GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM;46054606dec = hdev->dec + relative_idx / 2;46074608/* We pass different structures depending on the irq handler. For the abnormal4609* interrupt we pass hl_dec and for the regular interrupt we pass the relevant4610* user_interrupt entry4611*/4612free_irq(irq, ((relative_idx % 2) ?4613(void *) dec :4614(void *) &hdev->user_interrupt[dec->core_id]));4615}4616}46174618static int gaudi2_dec_enable_msix(struct hl_device *hdev)4619{4620int rc, i, irq_init_cnt, irq, relative_idx;4621struct hl_dec *dec;46224623for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM, irq_init_cnt = 0;4624i <= GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM;4625i++, irq_init_cnt++) {46264627irq = pci_irq_vector(hdev->pdev, i);4628relative_idx = i - GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM;46294630/* We pass different structures depending on the irq handler. For the abnormal4631* interrupt we pass hl_dec and for the regular interrupt we pass the relevant4632* user_interrupt entry4633*4634* TODO: change the dec abnrm to threaded irq4635*/46364637dec = hdev->dec + relative_idx / 2;4638if (relative_idx % 2) {4639rc = request_irq(irq, hl_irq_handler_dec_abnrm, 0,4640gaudi2_irq_name(i), (void *) dec);4641} else {4642rc = request_irq(irq, hl_irq_user_interrupt_handler, 0, gaudi2_irq_name(i),4643(void *) &hdev->user_interrupt[dec->core_id]);4644}46454646if (rc) {4647dev_err(hdev->dev, "Failed to request IRQ %d", irq);4648goto free_dec_irqs;4649}4650}46514652return 0;46534654free_dec_irqs:4655gaudi2_dec_disable_msix(hdev, (GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM + irq_init_cnt));4656return rc;4657}46584659static int gaudi2_enable_msix(struct hl_device *hdev)4660{4661struct asic_fixed_properties *prop = &hdev->asic_prop;4662struct gaudi2_device *gaudi2 = hdev->asic_specific;4663int rc, irq, i, j, user_irq_init_cnt;4664struct hl_cq *cq;46654666if (gaudi2->hw_cap_initialized & HW_CAP_MSIX)4667return 0;46684669hl_init_cpu_for_irq(hdev);46704671rc = pci_alloc_irq_vectors(hdev->pdev, GAUDI2_MSIX_ENTRIES, GAUDI2_MSIX_ENTRIES,4672PCI_IRQ_MSIX);4673if (rc < 0) {4674dev_err(hdev->dev, "MSI-X: Failed to enable support -- %d/%d\n",4675GAUDI2_MSIX_ENTRIES, rc);4676return rc;4677}46784679irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);4680cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_CS_COMPLETION];4681rc = request_irq(irq, hl_irq_handler_cq, 0, gaudi2_irq_name(GAUDI2_IRQ_NUM_COMPLETION), cq);4682if (rc) {4683dev_err(hdev->dev, "Failed to request IRQ %d", irq);4684goto free_irq_vectors;4685}46864687irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE);4688rc = request_irq(irq, hl_irq_handler_eq, 0, gaudi2_irq_name(GAUDI2_IRQ_NUM_EVENT_QUEUE),4689&hdev->event_queue);4690if (rc) {4691dev_err(hdev->dev, "Failed to request IRQ %d", irq);4692goto free_completion_irq;4693}46944695rc = gaudi2_dec_enable_msix(hdev);4696if (rc) {4697dev_err(hdev->dev, "Failed to enable decoder IRQ");4698goto free_event_irq;4699}47004701irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_TPC_ASSERT);4702rc = request_threaded_irq(irq, NULL, hl_irq_user_interrupt_thread_handler, IRQF_ONESHOT,4703gaudi2_irq_name(GAUDI2_IRQ_NUM_TPC_ASSERT),4704&hdev->tpc_interrupt);4705if (rc) {4706dev_err(hdev->dev, "Failed to request IRQ %d", irq);4707goto free_dec_irq;4708}47094710irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_UNEXPECTED_ERROR);4711rc = request_threaded_irq(irq, NULL, hl_irq_user_interrupt_thread_handler, IRQF_ONESHOT,4712gaudi2_irq_name(GAUDI2_IRQ_NUM_UNEXPECTED_ERROR),4713&hdev->unexpected_error_interrupt);4714if (rc) {4715dev_err(hdev->dev, "Failed to request IRQ %d", irq);4716goto free_tpc_irq;4717}47184719for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = prop->user_dec_intr_count, user_irq_init_cnt = 0;4720user_irq_init_cnt < prop->user_interrupt_count;4721i++, j++, user_irq_init_cnt++) {47224723irq = pci_irq_vector(hdev->pdev, i);4724hl_set_irq_affinity(hdev, irq);4725rc = request_irq(irq, hl_irq_user_interrupt_handler, 0, gaudi2_irq_name(i),4726&hdev->user_interrupt[j]);4727if (rc) {4728dev_err(hdev->dev, "Failed to request IRQ %d", irq);4729goto free_user_irq;4730}4731}47324733irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EQ_ERROR);4734rc = request_threaded_irq(irq, NULL, hl_irq_eq_error_interrupt_thread_handler,4735IRQF_ONESHOT, gaudi2_irq_name(GAUDI2_IRQ_NUM_EQ_ERROR),4736hdev);4737if (rc) {4738dev_err(hdev->dev, "Failed to request IRQ %d", irq);4739goto free_user_irq;4740}47414742gaudi2->hw_cap_initialized |= HW_CAP_MSIX;47434744return 0;47454746free_user_irq:4747for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = prop->user_dec_intr_count;4748i < GAUDI2_IRQ_NUM_USER_FIRST + user_irq_init_cnt ; i++, j++) {47494750irq = pci_irq_vector(hdev->pdev, i);4751irq_set_affinity_and_hint(irq, NULL);4752free_irq(irq, &hdev->user_interrupt[j]);4753}4754irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_UNEXPECTED_ERROR);4755free_irq(irq, &hdev->unexpected_error_interrupt);4756free_tpc_irq:4757irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_TPC_ASSERT);4758free_irq(irq, &hdev->tpc_interrupt);4759free_dec_irq:4760gaudi2_dec_disable_msix(hdev, GAUDI2_IRQ_NUM_DEC_LAST + 1);4761free_event_irq:4762irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE);4763free_irq(irq, cq);47644765free_completion_irq:4766irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);4767free_irq(irq, cq);47684769free_irq_vectors:4770pci_free_irq_vectors(hdev->pdev);47714772return rc;4773}47744775static void gaudi2_sync_irqs(struct hl_device *hdev)4776{4777struct gaudi2_device *gaudi2 = hdev->asic_specific;4778int i, j;4779int irq;47804781if (!(gaudi2->hw_cap_initialized & HW_CAP_MSIX))4782return;47834784/* Wait for all pending IRQs to be finished */4785synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION));47864787for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM ; i <= GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM ; i++) {4788irq = pci_irq_vector(hdev->pdev, i);4789synchronize_irq(irq);4790}47914792synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_TPC_ASSERT));4793synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_UNEXPECTED_ERROR));47944795for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = 0 ; j < hdev->asic_prop.user_interrupt_count;4796i++, j++) {4797irq = pci_irq_vector(hdev->pdev, i);4798synchronize_irq(irq);4799}48004801synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE));4802synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EQ_ERROR));4803}48044805static void gaudi2_disable_msix(struct hl_device *hdev)4806{4807struct asic_fixed_properties *prop = &hdev->asic_prop;4808struct gaudi2_device *gaudi2 = hdev->asic_specific;4809struct hl_cq *cq;4810int irq, i, j, k;48114812if (!(gaudi2->hw_cap_initialized & HW_CAP_MSIX))4813return;48144815gaudi2_sync_irqs(hdev);48164817irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE);4818free_irq(irq, &hdev->event_queue);48194820gaudi2_dec_disable_msix(hdev, GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM + 1);48214822irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_TPC_ASSERT);4823free_irq(irq, &hdev->tpc_interrupt);48244825irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_UNEXPECTED_ERROR);4826free_irq(irq, &hdev->unexpected_error_interrupt);48274828for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = prop->user_dec_intr_count, k = 0;4829k < hdev->asic_prop.user_interrupt_count ; i++, j++, k++) {48304831irq = pci_irq_vector(hdev->pdev, i);4832irq_set_affinity_and_hint(irq, NULL);4833free_irq(irq, &hdev->user_interrupt[j]);4834}48354836irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);4837cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_CS_COMPLETION];4838free_irq(irq, cq);48394840irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EQ_ERROR);4841free_irq(irq, hdev);48424843pci_free_irq_vectors(hdev->pdev);48444845gaudi2->hw_cap_initialized &= ~HW_CAP_MSIX;4846}48474848static void gaudi2_stop_dcore_dec(struct hl_device *hdev, int dcore_id)4849{4850u32 reg_val = FIELD_PREP(DCORE0_VDEC0_BRDG_CTRL_GRACEFUL_STOP_MASK, 0x1);4851u32 graceful_pend_mask = DCORE0_VDEC0_BRDG_CTRL_GRACEFUL_PEND_MASK;4852u32 timeout_usec, dec_id, dec_bit, offset, graceful;4853int rc;48544855if (hdev->pldm)4856timeout_usec = GAUDI2_PLDM_VDEC_TIMEOUT_USEC;4857else4858timeout_usec = GAUDI2_VDEC_TIMEOUT_USEC;48594860for (dec_id = 0 ; dec_id < NUM_OF_DEC_PER_DCORE ; dec_id++) {4861dec_bit = dcore_id * NUM_OF_DEC_PER_DCORE + dec_id;4862if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))4863continue;48644865offset = dcore_id * DCORE_OFFSET + dec_id * DCORE_VDEC_OFFSET;48664867WREG32(mmDCORE0_DEC0_CMD_SWREG16 + offset, 0);48684869WREG32(mmDCORE0_VDEC0_BRDG_CTRL_GRACEFUL + offset, reg_val);48704871/* Wait till all traffic from decoder stops4872* before apply core reset.4873*/4874rc = hl_poll_timeout(4875hdev,4876mmDCORE0_VDEC0_BRDG_CTRL_GRACEFUL + offset,4877graceful,4878(graceful & graceful_pend_mask),4879100,4880timeout_usec);4881if (rc)4882dev_err(hdev->dev,4883"Failed to stop traffic from DCORE%d Decoder %d\n",4884dcore_id, dec_id);4885}4886}48874888static void gaudi2_stop_pcie_dec(struct hl_device *hdev)4889{4890u32 reg_val = FIELD_PREP(DCORE0_VDEC0_BRDG_CTRL_GRACEFUL_STOP_MASK, 0x1);4891u32 graceful_pend_mask = PCIE_VDEC0_BRDG_CTRL_GRACEFUL_PEND_MASK;4892u32 timeout_usec, dec_id, dec_bit, offset, graceful;4893int rc;48944895if (hdev->pldm)4896timeout_usec = GAUDI2_PLDM_VDEC_TIMEOUT_USEC;4897else4898timeout_usec = GAUDI2_VDEC_TIMEOUT_USEC;48994900for (dec_id = 0 ; dec_id < NUM_OF_DEC_PER_DCORE ; dec_id++) {4901dec_bit = PCIE_DEC_SHIFT + dec_id;4902if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))4903continue;49044905offset = dec_id * PCIE_VDEC_OFFSET;49064907WREG32(mmPCIE_DEC0_CMD_SWREG16 + offset, 0);49084909WREG32(mmPCIE_VDEC0_BRDG_CTRL_GRACEFUL + offset, reg_val);49104911/* Wait till all traffic from decoder stops4912* before apply core reset.4913*/4914rc = hl_poll_timeout(4915hdev,4916mmPCIE_VDEC0_BRDG_CTRL_GRACEFUL + offset,4917graceful,4918(graceful & graceful_pend_mask),4919100,4920timeout_usec);4921if (rc)4922dev_err(hdev->dev,4923"Failed to stop traffic from PCIe Decoder %d\n",4924dec_id);4925}4926}49274928static void gaudi2_stop_dec(struct hl_device *hdev)4929{4930struct gaudi2_device *gaudi2 = hdev->asic_specific;4931int dcore_id;49324933if ((gaudi2->dec_hw_cap_initialized & HW_CAP_DEC_MASK) == 0)4934return;49354936for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++)4937gaudi2_stop_dcore_dec(hdev, dcore_id);49384939gaudi2_stop_pcie_dec(hdev);4940}49414942static void gaudi2_set_arc_running_mode(struct hl_device *hdev, u32 cpu_id, u32 run_mode)4943{4944u32 reg_base, reg_val;49454946reg_base = gaudi2_arc_blocks_bases[cpu_id];4947if (run_mode == HL_ENGINE_CORE_RUN)4948reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_RUN_HALT_REQ_RUN_REQ_MASK, 1);4949else4950reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_RUN_HALT_REQ_HALT_REQ_MASK, 1);49514952WREG32(reg_base + ARC_HALT_REQ_OFFSET, reg_val);4953}49544955static void gaudi2_halt_arcs(struct hl_device *hdev)4956{4957u16 arc_id;49584959for (arc_id = CPU_ID_SCHED_ARC0; arc_id < CPU_ID_MAX; arc_id++) {4960if (gaudi2_is_arc_enabled(hdev, arc_id))4961gaudi2_set_arc_running_mode(hdev, arc_id, HL_ENGINE_CORE_HALT);4962}4963}49644965static int gaudi2_verify_arc_running_mode(struct hl_device *hdev, u32 cpu_id, u32 run_mode)4966{4967int rc;4968u32 reg_base, val, ack_mask, timeout_usec = 100000;49694970if (hdev->pldm)4971timeout_usec *= 100;49724973reg_base = gaudi2_arc_blocks_bases[cpu_id];4974if (run_mode == HL_ENGINE_CORE_RUN)4975ack_mask = ARC_FARM_ARC0_AUX_RUN_HALT_ACK_RUN_ACK_MASK;4976else4977ack_mask = ARC_FARM_ARC0_AUX_RUN_HALT_ACK_HALT_ACK_MASK;49784979rc = hl_poll_timeout(hdev, reg_base + ARC_HALT_ACK_OFFSET,4980val, ((val & ack_mask) == ack_mask),49811000, timeout_usec);49824983if (!rc) {4984/* Clear */4985val = FIELD_PREP(ARC_FARM_ARC0_AUX_RUN_HALT_REQ_RUN_REQ_MASK, 0);4986WREG32(reg_base + ARC_HALT_REQ_OFFSET, val);4987}49884989return rc;4990}49914992static void gaudi2_reset_arcs(struct hl_device *hdev)4993{4994struct gaudi2_device *gaudi2 = hdev->asic_specific;4995u16 arc_id;49964997if (!gaudi2)4998return;49995000for (arc_id = CPU_ID_SCHED_ARC0; arc_id < CPU_ID_MAX; arc_id++)5001if (gaudi2_is_arc_enabled(hdev, arc_id))5002gaudi2_clr_arc_id_cap(hdev, arc_id);5003}50045005static void gaudi2_nic_qmans_manual_flush(struct hl_device *hdev)5006{5007struct gaudi2_device *gaudi2 = hdev->asic_specific;5008u32 queue_id;5009int i;50105011if (!(gaudi2->nic_hw_cap_initialized & HW_CAP_NIC_MASK))5012return;50135014queue_id = GAUDI2_QUEUE_ID_NIC_0_0;50155016for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++, queue_id += NUM_OF_PQ_PER_QMAN) {5017if (!(hdev->nic_ports_mask & BIT(i)))5018continue;50195020gaudi2_qman_manual_flush_common(hdev, queue_id);5021}5022}50235024static int gaudi2_set_engine_cores(struct hl_device *hdev, u32 *core_ids,5025u32 num_cores, u32 core_command)5026{5027int i, rc;50285029for (i = 0 ; i < num_cores ; i++) {5030if (gaudi2_is_arc_enabled(hdev, core_ids[i]))5031gaudi2_set_arc_running_mode(hdev, core_ids[i], core_command);5032}50335034for (i = 0 ; i < num_cores ; i++) {5035if (gaudi2_is_arc_enabled(hdev, core_ids[i])) {5036rc = gaudi2_verify_arc_running_mode(hdev, core_ids[i], core_command);50375038if (rc) {5039dev_err(hdev->dev, "failed to %s arc: %d\n",5040(core_command == HL_ENGINE_CORE_HALT) ?5041"HALT" : "RUN", core_ids[i]);5042return -1;5043}5044}5045}50465047return 0;5048}50495050static int gaudi2_set_tpc_engine_mode(struct hl_device *hdev, u32 engine_id, u32 engine_command)5051{5052struct gaudi2_device *gaudi2 = hdev->asic_specific;5053u32 reg_base, reg_addr, reg_val, tpc_id;50545055if (!(gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK))5056return 0;50575058tpc_id = gaudi2_tpc_engine_id_to_tpc_id[engine_id];5059if (!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(HW_CAP_TPC_SHIFT + tpc_id)))5060return 0;50615062reg_base = gaudi2_tpc_cfg_blocks_bases[tpc_id];5063reg_addr = reg_base + TPC_CFG_STALL_OFFSET;5064reg_val = FIELD_PREP(DCORE0_TPC0_CFG_TPC_STALL_V_MASK,5065(engine_command == HL_ENGINE_STALL) ? 1 : 0);5066WREG32(reg_addr, reg_val);50675068if (engine_command == HL_ENGINE_RESUME) {5069reg_base = gaudi2_tpc_eml_cfg_blocks_bases[tpc_id];5070reg_addr = reg_base + TPC_EML_CFG_DBG_CNT_OFFSET;5071RMWREG32(reg_addr, 0x1, DCORE0_TPC0_EML_CFG_DBG_CNT_DBG_EXIT_MASK);5072}50735074return 0;5075}50765077static int gaudi2_set_mme_engine_mode(struct hl_device *hdev, u32 engine_id, u32 engine_command)5078{5079struct gaudi2_device *gaudi2 = hdev->asic_specific;5080u32 reg_base, reg_addr, reg_val, mme_id;50815082mme_id = gaudi2_mme_engine_id_to_mme_id[engine_id];5083if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_MME_SHIFT + mme_id)))5084return 0;50855086reg_base = gaudi2_mme_ctrl_lo_blocks_bases[mme_id];5087reg_addr = reg_base + MME_CTRL_LO_QM_STALL_OFFSET;5088reg_val = FIELD_PREP(DCORE0_MME_CTRL_LO_QM_STALL_V_MASK,5089(engine_command == HL_ENGINE_STALL) ? 1 : 0);5090WREG32(reg_addr, reg_val);50915092return 0;5093}50945095static int gaudi2_set_edma_engine_mode(struct hl_device *hdev, u32 engine_id, u32 engine_command)5096{5097struct gaudi2_device *gaudi2 = hdev->asic_specific;5098u32 reg_base, reg_addr, reg_val, edma_id;50995100if (!(gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK))5101return 0;51025103edma_id = gaudi2_edma_engine_id_to_edma_id[engine_id];5104if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_EDMA_SHIFT + edma_id)))5105return 0;51065107reg_base = gaudi2_dma_core_blocks_bases[edma_id];5108reg_addr = reg_base + EDMA_CORE_CFG_STALL_OFFSET;5109reg_val = FIELD_PREP(DCORE0_EDMA0_CORE_CFG_1_HALT_MASK,5110(engine_command == HL_ENGINE_STALL) ? 1 : 0);5111WREG32(reg_addr, reg_val);51125113if (engine_command == HL_ENGINE_STALL) {5114reg_val = FIELD_PREP(DCORE0_EDMA0_CORE_CFG_1_HALT_MASK, 0x1) |5115FIELD_PREP(DCORE0_EDMA0_CORE_CFG_1_FLUSH_MASK, 0x1);5116WREG32(reg_addr, reg_val);5117}51185119return 0;5120}51215122static int gaudi2_set_engine_modes(struct hl_device *hdev,5123u32 *engine_ids, u32 num_engines, u32 engine_command)5124{5125int i, rc;51265127for (i = 0 ; i < num_engines ; ++i) {5128switch (engine_ids[i]) {5129case GAUDI2_DCORE0_ENGINE_ID_TPC_0 ... GAUDI2_DCORE0_ENGINE_ID_TPC_5:5130case GAUDI2_DCORE1_ENGINE_ID_TPC_0 ... GAUDI2_DCORE1_ENGINE_ID_TPC_5:5131case GAUDI2_DCORE2_ENGINE_ID_TPC_0 ... GAUDI2_DCORE2_ENGINE_ID_TPC_5:5132case GAUDI2_DCORE3_ENGINE_ID_TPC_0 ... GAUDI2_DCORE3_ENGINE_ID_TPC_5:5133rc = gaudi2_set_tpc_engine_mode(hdev, engine_ids[i], engine_command);5134if (rc)5135return rc;51365137break;5138case GAUDI2_DCORE0_ENGINE_ID_MME:5139case GAUDI2_DCORE1_ENGINE_ID_MME:5140case GAUDI2_DCORE2_ENGINE_ID_MME:5141case GAUDI2_DCORE3_ENGINE_ID_MME:5142rc = gaudi2_set_mme_engine_mode(hdev, engine_ids[i], engine_command);5143if (rc)5144return rc;51455146break;5147case GAUDI2_DCORE0_ENGINE_ID_EDMA_0 ... GAUDI2_DCORE0_ENGINE_ID_EDMA_1:5148case GAUDI2_DCORE1_ENGINE_ID_EDMA_0 ... GAUDI2_DCORE1_ENGINE_ID_EDMA_1:5149case GAUDI2_DCORE2_ENGINE_ID_EDMA_0 ... GAUDI2_DCORE2_ENGINE_ID_EDMA_1:5150case GAUDI2_DCORE3_ENGINE_ID_EDMA_0 ... GAUDI2_DCORE3_ENGINE_ID_EDMA_1:5151rc = gaudi2_set_edma_engine_mode(hdev, engine_ids[i], engine_command);5152if (rc)5153return rc;51545155break;5156default:5157dev_err(hdev->dev, "Invalid engine ID %u\n", engine_ids[i]);5158return -EINVAL;5159}5160}51615162return 0;5163}51645165static int gaudi2_set_engines(struct hl_device *hdev, u32 *engine_ids,5166u32 num_engines, u32 engine_command)5167{5168switch (engine_command) {5169case HL_ENGINE_CORE_HALT:5170case HL_ENGINE_CORE_RUN:5171return gaudi2_set_engine_cores(hdev, engine_ids, num_engines, engine_command);51725173case HL_ENGINE_STALL:5174case HL_ENGINE_RESUME:5175return gaudi2_set_engine_modes(hdev, engine_ids, num_engines, engine_command);51765177default:5178dev_err(hdev->dev, "failed to execute command id %u\n", engine_command);5179return -EINVAL;5180}5181}51825183static void gaudi2_halt_engines(struct hl_device *hdev, bool hard_reset, bool fw_reset)5184{5185u32 wait_timeout_ms;51865187if (hdev->pldm)5188wait_timeout_ms = GAUDI2_PLDM_RESET_WAIT_MSEC;5189else5190wait_timeout_ms = GAUDI2_RESET_WAIT_MSEC;51915192if (fw_reset || hdev->cpld_shutdown)5193goto skip_engines;51945195gaudi2_stop_dma_qmans(hdev);5196gaudi2_stop_mme_qmans(hdev);5197gaudi2_stop_tpc_qmans(hdev);5198gaudi2_stop_rot_qmans(hdev);5199gaudi2_stop_nic_qmans(hdev);5200msleep(wait_timeout_ms);52015202gaudi2_halt_arcs(hdev);5203gaudi2_dma_stall(hdev);5204gaudi2_mme_stall(hdev);5205gaudi2_tpc_stall(hdev);5206gaudi2_rotator_stall(hdev);52075208msleep(wait_timeout_ms);52095210gaudi2_stop_dec(hdev);52115212/*5213* in case of soft reset do a manual flush for QMANs (currently called5214* only for NIC QMANs5215*/5216if (!hard_reset)5217gaudi2_nic_qmans_manual_flush(hdev);52185219gaudi2_disable_dma_qmans(hdev);5220gaudi2_disable_mme_qmans(hdev);5221gaudi2_disable_tpc_qmans(hdev);5222gaudi2_disable_rot_qmans(hdev);5223gaudi2_disable_nic_qmans(hdev);5224gaudi2_disable_timestamp(hdev);52255226skip_engines:5227if (hard_reset) {5228gaudi2_disable_msix(hdev);5229return;5230}52315232gaudi2_sync_irqs(hdev);5233}52345235static void gaudi2_init_firmware_preload_params(struct hl_device *hdev)5236{5237struct pre_fw_load_props *pre_fw_load = &hdev->fw_loader.pre_fw_load;52385239pre_fw_load->cpu_boot_status_reg = mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS;5240pre_fw_load->sts_boot_dev_sts0_reg = mmCPU_BOOT_DEV_STS0;5241pre_fw_load->sts_boot_dev_sts1_reg = mmCPU_BOOT_DEV_STS1;5242pre_fw_load->boot_err0_reg = mmCPU_BOOT_ERR0;5243pre_fw_load->boot_err1_reg = mmCPU_BOOT_ERR1;5244pre_fw_load->wait_for_preboot_timeout = GAUDI2_PREBOOT_REQ_TIMEOUT_USEC;5245pre_fw_load->wait_for_preboot_extended_timeout =5246GAUDI2_PREBOOT_EXTENDED_REQ_TIMEOUT_USEC;5247}52485249static void gaudi2_init_firmware_loader(struct hl_device *hdev)5250{5251struct fw_load_mgr *fw_loader = &hdev->fw_loader;5252struct dynamic_fw_load_mgr *dynamic_loader;5253struct cpu_dyn_regs *dyn_regs;52545255/* fill common fields */5256fw_loader->fw_comp_loaded = FW_TYPE_NONE;5257fw_loader->boot_fit_img.image_name = GAUDI2_BOOT_FIT_FILE;5258fw_loader->linux_img.image_name = GAUDI2_LINUX_FW_FILE;5259fw_loader->boot_fit_timeout = GAUDI2_BOOT_FIT_REQ_TIMEOUT_USEC;5260fw_loader->skip_bmc = false;5261fw_loader->sram_bar_id = SRAM_CFG_BAR_ID;5262fw_loader->dram_bar_id = DRAM_BAR_ID;5263fw_loader->cpu_timeout = GAUDI2_CPU_TIMEOUT_USEC;52645265/* here we update initial values for few specific dynamic regs (as5266* before reading the first descriptor from FW those value has to be5267* hard-coded). in later stages of the protocol those values will be5268* updated automatically by reading the FW descriptor so data there5269* will always be up-to-date5270*/5271dynamic_loader = &hdev->fw_loader.dynamic_loader;5272dyn_regs = &dynamic_loader->comm_desc.cpu_dyn_regs;5273dyn_regs->kmd_msg_to_cpu = cpu_to_le32(mmPSOC_GLOBAL_CONF_KMD_MSG_TO_CPU);5274dyn_regs->cpu_cmd_status_to_host = cpu_to_le32(mmCPU_CMD_STATUS_TO_HOST);5275dynamic_loader->wait_for_bl_timeout = GAUDI2_WAIT_FOR_BL_TIMEOUT_USEC;5276}52775278static int gaudi2_init_cpu(struct hl_device *hdev)5279{5280struct gaudi2_device *gaudi2 = hdev->asic_specific;5281int rc;52825283if (!(hdev->fw_components & FW_TYPE_PREBOOT_CPU))5284return 0;52855286if (gaudi2->hw_cap_initialized & HW_CAP_CPU)5287return 0;52885289rc = hl_fw_init_cpu(hdev);5290if (rc)5291return rc;52925293gaudi2->hw_cap_initialized |= HW_CAP_CPU;52945295return 0;5296}52975298static int gaudi2_init_cpu_queues(struct hl_device *hdev, u32 cpu_timeout)5299{5300struct hl_hw_queue *cpu_pq = &hdev->kernel_queues[GAUDI2_QUEUE_ID_CPU_PQ];5301struct asic_fixed_properties *prop = &hdev->asic_prop;5302struct gaudi2_device *gaudi2 = hdev->asic_specific;5303struct cpu_dyn_regs *dyn_regs;5304struct hl_eq *eq;5305u32 status;5306int err;53075308if (!hdev->cpu_queues_enable)5309return 0;53105311if (gaudi2->hw_cap_initialized & HW_CAP_CPU_Q)5312return 0;53135314eq = &hdev->event_queue;53155316dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;53175318WREG32(mmCPU_IF_PQ_BASE_ADDR_LOW, lower_32_bits(cpu_pq->bus_address));5319WREG32(mmCPU_IF_PQ_BASE_ADDR_HIGH, upper_32_bits(cpu_pq->bus_address));53205321WREG32(mmCPU_IF_EQ_BASE_ADDR_LOW, lower_32_bits(eq->bus_address));5322WREG32(mmCPU_IF_EQ_BASE_ADDR_HIGH, upper_32_bits(eq->bus_address));53235324WREG32(mmCPU_IF_CQ_BASE_ADDR_LOW, lower_32_bits(hdev->cpu_accessible_dma_address));5325WREG32(mmCPU_IF_CQ_BASE_ADDR_HIGH, upper_32_bits(hdev->cpu_accessible_dma_address));53265327WREG32(mmCPU_IF_PQ_LENGTH, HL_QUEUE_SIZE_IN_BYTES);5328WREG32(mmCPU_IF_EQ_LENGTH, HL_EQ_SIZE_IN_BYTES);5329WREG32(mmCPU_IF_CQ_LENGTH, HL_CPU_ACCESSIBLE_MEM_SIZE);53305331/* Used for EQ CI */5332WREG32(mmCPU_IF_EQ_RD_OFFS, 0);53335334WREG32(mmCPU_IF_PF_PQ_PI, 0);53355336WREG32(mmCPU_IF_QUEUE_INIT, PQ_INIT_STATUS_READY_FOR_CP);53375338/* Let the ARC know we are ready as it is now handling those queues */53395340WREG32(le32_to_cpu(dyn_regs->gic_host_pi_upd_irq),5341gaudi2_irq_map_table[GAUDI2_EVENT_CPU_PI_UPDATE].cpu_id);53425343err = hl_poll_timeout(5344hdev,5345mmCPU_IF_QUEUE_INIT,5346status,5347(status == PQ_INIT_STATUS_READY_FOR_HOST),53481000,5349cpu_timeout);53505351if (err) {5352dev_err(hdev->dev, "Failed to communicate with device CPU (timeout)\n");5353return -EIO;5354}53555356/* update FW application security bits */5357if (prop->fw_cpu_boot_dev_sts0_valid)5358prop->fw_app_cpu_boot_dev_sts0 = RREG32(mmCPU_BOOT_DEV_STS0);53595360if (prop->fw_cpu_boot_dev_sts1_valid)5361prop->fw_app_cpu_boot_dev_sts1 = RREG32(mmCPU_BOOT_DEV_STS1);53625363gaudi2->hw_cap_initialized |= HW_CAP_CPU_Q;5364return 0;5365}53665367static void gaudi2_init_qman_pq(struct hl_device *hdev, u32 reg_base,5368u32 queue_id_base)5369{5370struct hl_hw_queue *q;5371u32 pq_id, pq_offset;53725373for (pq_id = 0 ; pq_id < NUM_OF_PQ_PER_QMAN ; pq_id++) {5374q = &hdev->kernel_queues[queue_id_base + pq_id];5375pq_offset = pq_id * 4;53765377if (q->dram_bd) {5378WREG32(reg_base + QM_PQ_BASE_LO_0_OFFSET + pq_offset,5379lower_32_bits(q->pq_dram_address));5380WREG32(reg_base + QM_PQ_BASE_HI_0_OFFSET + pq_offset,5381upper_32_bits(q->pq_dram_address));5382} else {5383WREG32(reg_base + QM_PQ_BASE_LO_0_OFFSET + pq_offset,5384lower_32_bits(q->bus_address));5385WREG32(reg_base + QM_PQ_BASE_HI_0_OFFSET + pq_offset,5386upper_32_bits(q->bus_address));5387}5388WREG32(reg_base + QM_PQ_SIZE_0_OFFSET + pq_offset, ilog2(HL_QUEUE_LENGTH));5389WREG32(reg_base + QM_PQ_PI_0_OFFSET + pq_offset, 0);5390WREG32(reg_base + QM_PQ_CI_0_OFFSET + pq_offset, 0);5391}5392}53935394static void gaudi2_init_qman_cp(struct hl_device *hdev, u32 reg_base)5395{5396u32 cp_id, cp_offset, mtr_base_lo, mtr_base_hi, so_base_lo, so_base_hi;53975398mtr_base_lo = lower_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);5399mtr_base_hi = upper_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);5400so_base_lo = lower_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);5401so_base_hi = upper_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);54025403for (cp_id = 0 ; cp_id < NUM_OF_CP_PER_QMAN; cp_id++) {5404cp_offset = cp_id * 4;54055406WREG32(reg_base + QM_CP_MSG_BASE0_ADDR_LO_0_OFFSET + cp_offset, mtr_base_lo);5407WREG32(reg_base + QM_CP_MSG_BASE0_ADDR_HI_0_OFFSET + cp_offset, mtr_base_hi);5408WREG32(reg_base + QM_CP_MSG_BASE1_ADDR_LO_0_OFFSET + cp_offset, so_base_lo);5409WREG32(reg_base + QM_CP_MSG_BASE1_ADDR_HI_0_OFFSET + cp_offset, so_base_hi);5410}54115412/* allow QMANs to accept work from ARC CQF */5413WREG32(reg_base + QM_CP_CFG_OFFSET, FIELD_PREP(PDMA0_QM_CP_CFG_SWITCH_EN_MASK, 0x1));5414}54155416static void gaudi2_init_qman_pqc(struct hl_device *hdev, u32 reg_base,5417u32 queue_id_base)5418{5419struct gaudi2_device *gaudi2 = hdev->asic_specific;5420u32 pq_id, pq_offset, so_base_lo, so_base_hi;54215422so_base_lo = lower_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);5423so_base_hi = upper_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);54245425for (pq_id = 0 ; pq_id < NUM_OF_PQ_PER_QMAN ; pq_id++) {5426pq_offset = pq_id * 4;54275428/* Configure QMAN HBW to scratchpad as it is not needed */5429WREG32(reg_base + QM_PQC_HBW_BASE_LO_0_OFFSET + pq_offset,5430lower_32_bits(gaudi2->scratchpad_bus_address));5431WREG32(reg_base + QM_PQC_HBW_BASE_HI_0_OFFSET + pq_offset,5432upper_32_bits(gaudi2->scratchpad_bus_address));5433WREG32(reg_base + QM_PQC_SIZE_0_OFFSET + pq_offset,5434ilog2(PAGE_SIZE / sizeof(struct hl_cq_entry)));54355436WREG32(reg_base + QM_PQC_PI_0_OFFSET + pq_offset, 0);5437WREG32(reg_base + QM_PQC_LBW_WDATA_0_OFFSET + pq_offset, QM_PQC_LBW_WDATA);5438WREG32(reg_base + QM_PQC_LBW_BASE_LO_0_OFFSET + pq_offset, so_base_lo);5439WREG32(reg_base + QM_PQC_LBW_BASE_HI_0_OFFSET + pq_offset, so_base_hi);5440}54415442/* Enable QMAN H/W completion */5443WREG32(reg_base + QM_PQC_CFG_OFFSET, 1 << PDMA0_QM_PQC_CFG_EN_SHIFT);5444}54455446static u32 gaudi2_get_dyn_sp_reg(struct hl_device *hdev, u32 queue_id_base)5447{5448struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;5449u32 sp_reg_addr;54505451switch (queue_id_base) {5452case GAUDI2_QUEUE_ID_PDMA_0_0...GAUDI2_QUEUE_ID_PDMA_1_3:5453fallthrough;5454case GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3:5455fallthrough;5456case GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3:5457fallthrough;5458case GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3:5459fallthrough;5460case GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3:5461sp_reg_addr = le32_to_cpu(dyn_regs->gic_dma_qm_irq_ctrl);5462break;5463case GAUDI2_QUEUE_ID_DCORE0_MME_0_0...GAUDI2_QUEUE_ID_DCORE0_MME_0_3:5464fallthrough;5465case GAUDI2_QUEUE_ID_DCORE1_MME_0_0...GAUDI2_QUEUE_ID_DCORE1_MME_0_3:5466fallthrough;5467case GAUDI2_QUEUE_ID_DCORE2_MME_0_0...GAUDI2_QUEUE_ID_DCORE2_MME_0_3:5468fallthrough;5469case GAUDI2_QUEUE_ID_DCORE3_MME_0_0...GAUDI2_QUEUE_ID_DCORE3_MME_0_3:5470sp_reg_addr = le32_to_cpu(dyn_regs->gic_mme_qm_irq_ctrl);5471break;5472case GAUDI2_QUEUE_ID_DCORE0_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE0_TPC_6_3:5473fallthrough;5474case GAUDI2_QUEUE_ID_DCORE1_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE1_TPC_5_3:5475fallthrough;5476case GAUDI2_QUEUE_ID_DCORE2_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE2_TPC_5_3:5477fallthrough;5478case GAUDI2_QUEUE_ID_DCORE3_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE3_TPC_5_3:5479sp_reg_addr = le32_to_cpu(dyn_regs->gic_tpc_qm_irq_ctrl);5480break;5481case GAUDI2_QUEUE_ID_ROT_0_0...GAUDI2_QUEUE_ID_ROT_1_3:5482sp_reg_addr = le32_to_cpu(dyn_regs->gic_rot_qm_irq_ctrl);5483break;5484case GAUDI2_QUEUE_ID_NIC_0_0...GAUDI2_QUEUE_ID_NIC_23_3:5485sp_reg_addr = le32_to_cpu(dyn_regs->gic_nic_qm_irq_ctrl);5486break;5487default:5488dev_err(hdev->dev, "Unexpected h/w queue %d\n", queue_id_base);5489return 0;5490}54915492return sp_reg_addr;5493}54945495static void gaudi2_init_qman_common(struct hl_device *hdev, u32 reg_base,5496u32 queue_id_base)5497{5498u32 glbl_prot = QMAN_MAKE_TRUSTED, irq_handler_offset;5499int map_table_entry;55005501WREG32(reg_base + QM_GLBL_PROT_OFFSET, glbl_prot);55025503irq_handler_offset = gaudi2_get_dyn_sp_reg(hdev, queue_id_base);5504WREG32(reg_base + QM_GLBL_ERR_ADDR_LO_OFFSET, lower_32_bits(CFG_BASE + irq_handler_offset));5505WREG32(reg_base + QM_GLBL_ERR_ADDR_HI_OFFSET, upper_32_bits(CFG_BASE + irq_handler_offset));55065507map_table_entry = gaudi2_qman_async_event_id[queue_id_base];5508WREG32(reg_base + QM_GLBL_ERR_WDATA_OFFSET,5509gaudi2_irq_map_table[map_table_entry].cpu_id);55105511WREG32(reg_base + QM_ARB_ERR_MSG_EN_OFFSET, QM_ARB_ERR_MSG_EN_MASK);55125513WREG32(reg_base + QM_ARB_SLV_CHOISE_WDT_OFFSET, GAUDI2_ARB_WDT_TIMEOUT);5514WREG32(reg_base + QM_GLBL_CFG1_OFFSET, 0);5515WREG32(reg_base + QM_GLBL_CFG2_OFFSET, 0);55165517/* Enable the QMAN channel.5518* PDMA QMAN configuration is different, as we do not allow user to5519* access some of the CPs.5520* PDMA0: CP2/3 are reserved for the ARC usage.5521* PDMA1: CP1/2/3 are reserved for the ARC usage.5522*/5523if (reg_base == gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_PDMA_1_0])5524WREG32(reg_base + QM_GLBL_CFG0_OFFSET, PDMA1_QMAN_ENABLE);5525else if (reg_base == gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_PDMA_0_0])5526WREG32(reg_base + QM_GLBL_CFG0_OFFSET, PDMA0_QMAN_ENABLE);5527else5528WREG32(reg_base + QM_GLBL_CFG0_OFFSET, QMAN_ENABLE);5529}55305531static void gaudi2_init_qman(struct hl_device *hdev, u32 reg_base,5532u32 queue_id_base)5533{5534u32 pq_id;55355536for (pq_id = 0 ; pq_id < NUM_OF_PQ_PER_QMAN ; pq_id++)5537hdev->kernel_queues[queue_id_base + pq_id].cq_id = GAUDI2_RESERVED_CQ_CS_COMPLETION;55385539gaudi2_init_qman_pq(hdev, reg_base, queue_id_base);5540gaudi2_init_qman_cp(hdev, reg_base);5541gaudi2_init_qman_pqc(hdev, reg_base, queue_id_base);5542gaudi2_init_qman_common(hdev, reg_base, queue_id_base);5543}55445545static void gaudi2_init_dma_core(struct hl_device *hdev, u32 reg_base,5546u32 dma_core_id, bool is_secure)5547{5548u32 prot, irq_handler_offset;5549struct cpu_dyn_regs *dyn_regs;5550int map_table_entry;55515552prot = 1 << ARC_FARM_KDMA_PROT_ERR_VAL_SHIFT;5553if (is_secure)5554prot |= 1 << ARC_FARM_KDMA_PROT_VAL_SHIFT;55555556WREG32(reg_base + DMA_CORE_PROT_OFFSET, prot);55575558dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;5559irq_handler_offset = le32_to_cpu(dyn_regs->gic_dma_core_irq_ctrl);55605561WREG32(reg_base + DMA_CORE_ERRMSG_ADDR_LO_OFFSET,5562lower_32_bits(CFG_BASE + irq_handler_offset));55635564WREG32(reg_base + DMA_CORE_ERRMSG_ADDR_HI_OFFSET,5565upper_32_bits(CFG_BASE + irq_handler_offset));55665567map_table_entry = gaudi2_dma_core_async_event_id[dma_core_id];5568WREG32(reg_base + DMA_CORE_ERRMSG_WDATA_OFFSET,5569gaudi2_irq_map_table[map_table_entry].cpu_id);55705571/* Enable the DMA channel */5572WREG32(reg_base + DMA_CORE_CFG_0_OFFSET, 1 << ARC_FARM_KDMA_CFG_0_EN_SHIFT);5573}55745575static void gaudi2_init_kdma(struct hl_device *hdev)5576{5577struct gaudi2_device *gaudi2 = hdev->asic_specific;5578u32 reg_base;55795580if ((gaudi2->hw_cap_initialized & HW_CAP_KDMA) == HW_CAP_KDMA)5581return;55825583reg_base = gaudi2_dma_core_blocks_bases[DMA_CORE_ID_KDMA];55845585gaudi2_init_dma_core(hdev, reg_base, DMA_CORE_ID_KDMA, true);55865587gaudi2->hw_cap_initialized |= HW_CAP_KDMA;5588}55895590static void gaudi2_init_pdma(struct hl_device *hdev)5591{5592struct gaudi2_device *gaudi2 = hdev->asic_specific;5593u32 reg_base;55945595if ((gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK) == HW_CAP_PDMA_MASK)5596return;55975598reg_base = gaudi2_dma_core_blocks_bases[DMA_CORE_ID_PDMA0];5599gaudi2_init_dma_core(hdev, reg_base, DMA_CORE_ID_PDMA0, false);56005601reg_base = gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_PDMA_0_0];5602gaudi2_init_qman(hdev, reg_base, GAUDI2_QUEUE_ID_PDMA_0_0);56035604reg_base = gaudi2_dma_core_blocks_bases[DMA_CORE_ID_PDMA1];5605gaudi2_init_dma_core(hdev, reg_base, DMA_CORE_ID_PDMA1, false);56065607reg_base = gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_PDMA_1_0];5608gaudi2_init_qman(hdev, reg_base, GAUDI2_QUEUE_ID_PDMA_1_0);56095610gaudi2->hw_cap_initialized |= HW_CAP_PDMA_MASK;5611}56125613static void gaudi2_init_edma_instance(struct hl_device *hdev, u8 seq)5614{5615u32 reg_base, base_edma_core_id, base_edma_qman_id;56165617base_edma_core_id = DMA_CORE_ID_EDMA0 + seq;5618base_edma_qman_id = edma_stream_base[seq];56195620reg_base = gaudi2_dma_core_blocks_bases[base_edma_core_id];5621gaudi2_init_dma_core(hdev, reg_base, base_edma_core_id, false);56225623reg_base = gaudi2_qm_blocks_bases[base_edma_qman_id];5624gaudi2_init_qman(hdev, reg_base, base_edma_qman_id);5625}56265627static void gaudi2_init_edma(struct hl_device *hdev)5628{5629struct asic_fixed_properties *prop = &hdev->asic_prop;5630struct gaudi2_device *gaudi2 = hdev->asic_specific;5631int dcore, inst;56325633if ((gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK) == HW_CAP_EDMA_MASK)5634return;56355636for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {5637for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {5638u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;56395640if (!(prop->edma_enabled_mask & BIT(seq)))5641continue;56425643gaudi2_init_edma_instance(hdev, seq);56445645gaudi2->hw_cap_initialized |= BIT_ULL(HW_CAP_EDMA_SHIFT + seq);5646}5647}5648}56495650/*5651* gaudi2_arm_monitors_for_virt_msix_db() - Arm monitors for writing to the virtual MSI-X doorbell.5652* @hdev: pointer to habanalabs device structure.5653* @sob_id: sync object ID.5654* @first_mon_id: ID of first monitor out of 3 consecutive monitors.5655* @interrupt_id: interrupt ID.5656*5657* Some initiators cannot have HBW address in their completion address registers, and thus cannot5658* write directly to the HBW host memory of the virtual MSI-X doorbell.5659* Instead, they are configured to LBW write to a sync object, and a monitor will do the HBW write.5660*5661* The mechanism in the sync manager block is composed of a master monitor with 3 messages.5662* In addition to the HBW write, the other 2 messages are for preparing the monitor to next5663* completion, by decrementing the sync object value and re-arming the monitor.5664*/5665static void gaudi2_arm_monitors_for_virt_msix_db(struct hl_device *hdev, u32 sob_id,5666u32 first_mon_id, u32 interrupt_id)5667{5668u32 sob_offset, first_mon_offset, mon_offset, payload, sob_group, mode, arm, config;5669struct gaudi2_device *gaudi2 = hdev->asic_specific;5670u64 addr;5671u8 mask;56725673/* Reset the SOB value */5674sob_offset = sob_id * sizeof(u32);5675WREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset, 0);56765677/* Configure 3 monitors:5678* 1. Write interrupt ID to the virtual MSI-X doorbell (master monitor)5679* 2. Decrement SOB value by 1.5680* 3. Re-arm the master monitor.5681*/56825683first_mon_offset = first_mon_id * sizeof(u32);56845685/* 2nd monitor: Decrement SOB value by 1 */5686mon_offset = first_mon_offset + sizeof(u32);56875688addr = CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;5689WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, lower_32_bits(addr));5690WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + mon_offset, upper_32_bits(addr));56915692payload = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_VAL_MASK, 0x7FFF) | /* "-1" */5693FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_SIGN_MASK, 1) |5694FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_INC_MASK, 1);5695WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, payload);56965697/* 3rd monitor: Re-arm the master monitor */5698mon_offset = first_mon_offset + 2 * sizeof(u32);56995700addr = CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + first_mon_offset;5701WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, lower_32_bits(addr));5702WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + mon_offset, upper_32_bits(addr));57035704sob_group = sob_id / 8;5705mask = ~BIT(sob_id & 0x7);5706mode = 0; /* comparison mode is "greater than or equal to" */5707arm = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SID_MASK, sob_group) |5708FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_MASK_MASK, mask) |5709FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOP_MASK, mode) |5710FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOD_MASK, 1);57115712payload = arm;5713WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, payload);57145715/* 1st monitor (master): Write interrupt ID to the virtual MSI-X doorbell */5716mon_offset = first_mon_offset;57175718config = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_WR_NUM_MASK, 2); /* "2": 3 writes */5719WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + mon_offset, config);57205721addr = gaudi2->virt_msix_db_dma_addr;5722WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, lower_32_bits(addr));5723WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + mon_offset, upper_32_bits(addr));57245725payload = interrupt_id;5726WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, payload);57275728WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + mon_offset, arm);5729}57305731static void gaudi2_prepare_sm_for_virt_msix_db(struct hl_device *hdev)5732{5733u32 decoder_id, sob_id, first_mon_id, interrupt_id;5734struct asic_fixed_properties *prop = &hdev->asic_prop;57355736/* Decoder normal/abnormal interrupts */5737for (decoder_id = 0 ; decoder_id < NUMBER_OF_DEC ; ++decoder_id) {5738if (!(prop->decoder_enabled_mask & BIT(decoder_id)))5739continue;57405741sob_id = GAUDI2_RESERVED_SOB_DEC_NRM_FIRST + decoder_id;5742first_mon_id = GAUDI2_RESERVED_MON_DEC_NRM_FIRST + 3 * decoder_id;5743interrupt_id = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM + 2 * decoder_id;5744gaudi2_arm_monitors_for_virt_msix_db(hdev, sob_id, first_mon_id, interrupt_id);57455746sob_id = GAUDI2_RESERVED_SOB_DEC_ABNRM_FIRST + decoder_id;5747first_mon_id = GAUDI2_RESERVED_MON_DEC_ABNRM_FIRST + 3 * decoder_id;5748interrupt_id += 1;5749gaudi2_arm_monitors_for_virt_msix_db(hdev, sob_id, first_mon_id, interrupt_id);5750}5751}57525753static void gaudi2_init_sm(struct hl_device *hdev)5754{5755struct gaudi2_device *gaudi2 = hdev->asic_specific;5756u64 cq_address;5757u32 reg_val;5758int i;57595760/* Enable HBW/LBW CQ for completion monitors */5761reg_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_CQ_EN_MASK, 1);5762reg_val |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_LBW_EN_MASK, 1);57635764for (i = 0 ; i < GAUDI2_MAX_PENDING_CS ; i++)5765WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + (4 * i), reg_val);57665767/* Enable only HBW CQ for KDMA completion monitor */5768reg_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_CQ_EN_MASK, 1);5769WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + (4 * i), reg_val);57705771/* Init CQ0 DB - configure the monitor to trigger MSI-X interrupt */5772WREG32(mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0, lower_32_bits(gaudi2->virt_msix_db_dma_addr));5773WREG32(mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0, upper_32_bits(gaudi2->virt_msix_db_dma_addr));5774WREG32(mmDCORE0_SYNC_MNGR_GLBL_LBW_DATA_0, GAUDI2_IRQ_NUM_COMPLETION);57755776for (i = 0 ; i < GAUDI2_RESERVED_CQ_NUMBER ; i++) {5777cq_address =5778hdev->completion_queue[i].bus_address;57795780WREG32(mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_L_0 + (4 * i),5781lower_32_bits(cq_address));5782WREG32(mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_H_0 + (4 * i),5783upper_32_bits(cq_address));5784WREG32(mmDCORE0_SYNC_MNGR_GLBL_CQ_SIZE_LOG2_0 + (4 * i),5785ilog2(HL_CQ_SIZE_IN_BYTES));5786}57875788/* Configure kernel ASID and MMU BP*/5789WREG32(mmDCORE0_SYNC_MNGR_GLBL_ASID_SEC, 0x10000);5790WREG32(mmDCORE0_SYNC_MNGR_GLBL_ASID_NONE_SEC_PRIV, 0);57915792/* Initialize sync objects and monitors which are used for the virtual MSI-X doorbell */5793gaudi2_prepare_sm_for_virt_msix_db(hdev);5794}57955796static void gaudi2_init_mme_acc(struct hl_device *hdev, u32 reg_base)5797{5798struct gaudi2_device *gaudi2 = hdev->asic_specific;5799u32 reg_val;5800int i;58015802reg_val = FIELD_PREP(MME_ACC_INTR_MASK_WBC_ERR_RESP_MASK, 0);5803reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_SRC_POS_INF_MASK, 1);5804reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_SRC_NEG_INF_MASK, 1);5805reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_SRC_NAN_MASK, 1);5806reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_RESULT_POS_INF_MASK, 1);5807reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_RESULT_NEG_INF_MASK, 1);58085809WREG32(reg_base + MME_ACC_INTR_MASK_OFFSET, reg_val);5810WREG32(reg_base + MME_ACC_AP_LFSR_POLY_OFFSET, 0x80DEADAF);58115812for (i = 0 ; i < MME_NUM_OF_LFSR_SEEDS ; i++) {5813WREG32(reg_base + MME_ACC_AP_LFSR_SEED_SEL_OFFSET, i);5814WREG32(reg_base + MME_ACC_AP_LFSR_SEED_WDATA_OFFSET, gaudi2->lfsr_rand_seeds[i]);5815}5816}58175818static void gaudi2_init_dcore_mme(struct hl_device *hdev, int dcore_id,5819bool config_qman_only)5820{5821u32 queue_id_base, reg_base;58225823switch (dcore_id) {5824case 0:5825queue_id_base = GAUDI2_QUEUE_ID_DCORE0_MME_0_0;5826break;5827case 1:5828queue_id_base = GAUDI2_QUEUE_ID_DCORE1_MME_0_0;5829break;5830case 2:5831queue_id_base = GAUDI2_QUEUE_ID_DCORE2_MME_0_0;5832break;5833case 3:5834queue_id_base = GAUDI2_QUEUE_ID_DCORE3_MME_0_0;5835break;5836default:5837dev_err(hdev->dev, "Invalid dcore id %u\n", dcore_id);5838return;5839}58405841if (!config_qman_only) {5842reg_base = gaudi2_mme_acc_blocks_bases[dcore_id];5843gaudi2_init_mme_acc(hdev, reg_base);5844}58455846reg_base = gaudi2_qm_blocks_bases[queue_id_base];5847gaudi2_init_qman(hdev, reg_base, queue_id_base);5848}58495850static void gaudi2_init_mme(struct hl_device *hdev)5851{5852struct gaudi2_device *gaudi2 = hdev->asic_specific;5853int i;58545855if ((gaudi2->hw_cap_initialized & HW_CAP_MME_MASK) == HW_CAP_MME_MASK)5856return;58575858for (i = 0 ; i < NUM_OF_DCORES ; i++) {5859gaudi2_init_dcore_mme(hdev, i, false);58605861gaudi2->hw_cap_initialized |= BIT_ULL(HW_CAP_MME_SHIFT + i);5862}5863}58645865static void gaudi2_init_tpc_cfg(struct hl_device *hdev, u32 reg_base)5866{5867/* Mask arithmetic and QM interrupts in TPC */5868WREG32(reg_base + TPC_CFG_TPC_INTR_MASK_OFFSET, 0x23FFFE);58695870/* Set 16 cache lines */5871WREG32(reg_base + TPC_CFG_MSS_CONFIG_OFFSET,58722 << DCORE0_TPC0_CFG_MSS_CONFIG_ICACHE_FETCH_LINE_NUM_SHIFT);5873}58745875struct gaudi2_tpc_init_cfg_data {5876enum gaudi2_queue_id dcore_tpc_qid_base[NUM_OF_DCORES];5877};58785879static void gaudi2_init_tpc_config(struct hl_device *hdev, int dcore, int inst,5880u32 offset, struct iterate_module_ctx *ctx)5881{5882struct gaudi2_device *gaudi2 = hdev->asic_specific;5883struct gaudi2_tpc_init_cfg_data *cfg_data = ctx->data;5884u32 queue_id_base;5885u8 seq;58865887queue_id_base = cfg_data->dcore_tpc_qid_base[dcore] + (inst * NUM_OF_PQ_PER_QMAN);58885889if (dcore == 0 && inst == (NUM_DCORE0_TPC - 1))5890/* gets last sequence number */5891seq = NUM_OF_DCORES * NUM_OF_TPC_PER_DCORE;5892else5893seq = dcore * NUM_OF_TPC_PER_DCORE + inst;58945895gaudi2_init_tpc_cfg(hdev, mmDCORE0_TPC0_CFG_BASE + offset);5896gaudi2_init_qman(hdev, mmDCORE0_TPC0_QM_BASE + offset, queue_id_base);58975898gaudi2->tpc_hw_cap_initialized |= BIT_ULL(HW_CAP_TPC_SHIFT + seq);5899}59005901static void gaudi2_init_tpc(struct hl_device *hdev)5902{5903struct gaudi2_device *gaudi2 = hdev->asic_specific;5904struct gaudi2_tpc_init_cfg_data init_cfg_data;5905struct iterate_module_ctx tpc_iter;59065907if (!hdev->asic_prop.tpc_enabled_mask)5908return;59095910if ((gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK) == HW_CAP_TPC_MASK)5911return;59125913init_cfg_data.dcore_tpc_qid_base[0] = GAUDI2_QUEUE_ID_DCORE0_TPC_0_0;5914init_cfg_data.dcore_tpc_qid_base[1] = GAUDI2_QUEUE_ID_DCORE1_TPC_0_0;5915init_cfg_data.dcore_tpc_qid_base[2] = GAUDI2_QUEUE_ID_DCORE2_TPC_0_0;5916init_cfg_data.dcore_tpc_qid_base[3] = GAUDI2_QUEUE_ID_DCORE3_TPC_0_0;5917tpc_iter.fn = &gaudi2_init_tpc_config;5918tpc_iter.data = &init_cfg_data;5919gaudi2_iterate_tpcs(hdev, &tpc_iter);5920}59215922static void gaudi2_init_rotator(struct hl_device *hdev)5923{5924struct gaudi2_device *gaudi2 = hdev->asic_specific;5925u32 i, reg_base, queue_id;59265927queue_id = GAUDI2_QUEUE_ID_ROT_0_0;59285929for (i = 0 ; i < NUM_OF_ROT ; i++, queue_id += NUM_OF_PQ_PER_QMAN) {5930reg_base = gaudi2_qm_blocks_bases[queue_id];5931gaudi2_init_qman(hdev, reg_base, queue_id);59325933gaudi2->hw_cap_initialized |= BIT_ULL(HW_CAP_ROT_SHIFT + i);5934}5935}59365937static void gaudi2_init_vdec_brdg_ctrl(struct hl_device *hdev, u64 base_addr, u32 decoder_id)5938{5939u32 sob_id;59405941/* VCMD normal interrupt */5942sob_id = GAUDI2_RESERVED_SOB_DEC_NRM_FIRST + decoder_id;5943WREG32(base_addr + BRDG_CTRL_NRM_MSIX_LBW_AWADDR,5944mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_id * sizeof(u32));5945WREG32(base_addr + BRDG_CTRL_NRM_MSIX_LBW_WDATA, GAUDI2_SOB_INCREMENT_BY_ONE);59465947/* VCMD abnormal interrupt */5948sob_id = GAUDI2_RESERVED_SOB_DEC_ABNRM_FIRST + decoder_id;5949WREG32(base_addr + BRDG_CTRL_ABNRM_MSIX_LBW_AWADDR,5950mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_id * sizeof(u32));5951WREG32(base_addr + BRDG_CTRL_ABNRM_MSIX_LBW_WDATA, GAUDI2_SOB_INCREMENT_BY_ONE);5952}59535954static void gaudi2_init_dec(struct hl_device *hdev)5955{5956struct gaudi2_device *gaudi2 = hdev->asic_specific;5957u32 dcore_id, dec_id, dec_bit;5958u64 base_addr;59595960if (!hdev->asic_prop.decoder_enabled_mask)5961return;59625963if ((gaudi2->dec_hw_cap_initialized & HW_CAP_DEC_MASK) == HW_CAP_DEC_MASK)5964return;59655966for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++)5967for (dec_id = 0 ; dec_id < NUM_OF_DEC_PER_DCORE ; dec_id++) {5968dec_bit = dcore_id * NUM_OF_DEC_PER_DCORE + dec_id;59695970if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))5971continue;59725973base_addr = mmDCORE0_DEC0_CMD_BASE +5974BRDG_CTRL_BLOCK_OFFSET +5975dcore_id * DCORE_OFFSET +5976dec_id * DCORE_VDEC_OFFSET;59775978gaudi2_init_vdec_brdg_ctrl(hdev, base_addr, dec_bit);59795980gaudi2->dec_hw_cap_initialized |= BIT_ULL(HW_CAP_DEC_SHIFT + dec_bit);5981}59825983for (dec_id = 0 ; dec_id < NUM_OF_PCIE_VDEC ; dec_id++) {5984dec_bit = PCIE_DEC_SHIFT + dec_id;5985if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))5986continue;59875988base_addr = mmPCIE_DEC0_CMD_BASE + BRDG_CTRL_BLOCK_OFFSET +5989dec_id * DCORE_VDEC_OFFSET;59905991gaudi2_init_vdec_brdg_ctrl(hdev, base_addr, dec_bit);59925993gaudi2->dec_hw_cap_initialized |= BIT_ULL(HW_CAP_DEC_SHIFT + dec_bit);5994}5995}59965997static int gaudi2_mmu_update_asid_hop0_addr(struct hl_device *hdev,5998u32 stlb_base, u32 asid, u64 phys_addr)5999{6000u32 status, timeout_usec;6001int rc;60026003if (hdev->pldm || !hdev->pdev)6004timeout_usec = GAUDI2_PLDM_MMU_TIMEOUT_USEC;6005else6006timeout_usec = MMU_CONFIG_TIMEOUT_USEC;60076008WREG32(stlb_base + STLB_ASID_OFFSET, asid);6009WREG32(stlb_base + STLB_HOP0_PA43_12_OFFSET, phys_addr >> MMU_HOP0_PA43_12_SHIFT);6010WREG32(stlb_base + STLB_HOP0_PA63_44_OFFSET, phys_addr >> MMU_HOP0_PA63_44_SHIFT);6011WREG32(stlb_base + STLB_BUSY_OFFSET, 0x80000000);60126013rc = hl_poll_timeout(6014hdev,6015stlb_base + STLB_BUSY_OFFSET,6016status,6017!(status & 0x80000000),60181000,6019timeout_usec);60206021if (rc) {6022dev_err(hdev->dev, "Timeout during MMU hop0 config of asid %d\n", asid);6023return rc;6024}60256026return 0;6027}60286029static void gaudi2_mmu_send_invalidate_cache_cmd(struct hl_device *hdev, u32 stlb_base,6030u32 start_offset, u32 inv_start_val,6031u32 flags)6032{6033/* clear PMMU mem line cache (only needed in mmu range invalidation) */6034if (flags & MMU_OP_CLEAR_MEMCACHE)6035WREG32(mmPMMU_HBW_STLB_MEM_CACHE_INVALIDATION, 0x1);60366037if (flags & MMU_OP_SKIP_LOW_CACHE_INV)6038return;60396040WREG32(stlb_base + start_offset, inv_start_val);6041}60426043static int gaudi2_mmu_invalidate_cache_status_poll(struct hl_device *hdev, u32 stlb_base,6044struct gaudi2_cache_invld_params *inv_params)6045{6046u32 status, timeout_usec, start_offset;6047int rc;60486049timeout_usec = (hdev->pldm) ? GAUDI2_PLDM_MMU_TIMEOUT_USEC :6050GAUDI2_MMU_CACHE_INV_TIMEOUT_USEC;60516052/* poll PMMU mem line cache (only needed in mmu range invalidation) */6053if (inv_params->flags & MMU_OP_CLEAR_MEMCACHE) {6054rc = hl_poll_timeout(6055hdev,6056mmPMMU_HBW_STLB_MEM_CACHE_INV_STATUS,6057status,6058status & 0x1,60591000,6060timeout_usec);60616062if (rc)6063return rc;60646065/* Need to manually reset the status to 0 */6066WREG32(mmPMMU_HBW_STLB_MEM_CACHE_INV_STATUS, 0x0);6067}60686069/* Lower cache does not work with cache lines, hence we can skip its6070* invalidation upon map and invalidate only upon unmap6071*/6072if (inv_params->flags & MMU_OP_SKIP_LOW_CACHE_INV)6073return 0;60746075start_offset = inv_params->range_invalidation ?6076STLB_RANGE_CACHE_INVALIDATION_OFFSET : STLB_INV_ALL_START_OFFSET;60776078rc = hl_poll_timeout(6079hdev,6080stlb_base + start_offset,6081status,6082!(status & 0x1),60831000,6084timeout_usec);60856086return rc;6087}60886089bool gaudi2_is_hmmu_enabled(struct hl_device *hdev, int dcore_id, int hmmu_id)6090{6091struct gaudi2_device *gaudi2 = hdev->asic_specific;6092u32 hw_cap;60936094hw_cap = HW_CAP_DCORE0_DMMU0 << (NUM_OF_HMMU_PER_DCORE * dcore_id + hmmu_id);60956096if (gaudi2->hw_cap_initialized & hw_cap)6097return true;60986099return false;6100}61016102/* this function shall be called only for HMMUs for which capability bit is set */6103static inline u32 get_hmmu_stlb_base(int dcore_id, int hmmu_id)6104{6105u32 offset;61066107offset = (u32) (dcore_id * DCORE_OFFSET + hmmu_id * DCORE_HMMU_OFFSET);6108return (u32)(mmDCORE0_HMMU0_STLB_BASE + offset);6109}61106111static void gaudi2_mmu_invalidate_cache_trigger(struct hl_device *hdev, u32 stlb_base,6112struct gaudi2_cache_invld_params *inv_params)6113{6114u32 start_offset;61156116if (inv_params->range_invalidation) {6117/* Set the addresses range6118* Note: that the start address we set in register, is not included in6119* the range of the invalidation, by design.6120* that's why we need to set lower address than the one we actually6121* want to be included in the range invalidation.6122*/6123u64 start = inv_params->start_va - 1;61246125start_offset = STLB_RANGE_CACHE_INVALIDATION_OFFSET;61266127WREG32(stlb_base + STLB_RANGE_INV_START_LSB_OFFSET,6128start >> MMU_RANGE_INV_VA_LSB_SHIFT);61296130WREG32(stlb_base + STLB_RANGE_INV_START_MSB_OFFSET,6131start >> MMU_RANGE_INV_VA_MSB_SHIFT);61326133WREG32(stlb_base + STLB_RANGE_INV_END_LSB_OFFSET,6134inv_params->end_va >> MMU_RANGE_INV_VA_LSB_SHIFT);61356136WREG32(stlb_base + STLB_RANGE_INV_END_MSB_OFFSET,6137inv_params->end_va >> MMU_RANGE_INV_VA_MSB_SHIFT);6138} else {6139start_offset = STLB_INV_ALL_START_OFFSET;6140}61416142gaudi2_mmu_send_invalidate_cache_cmd(hdev, stlb_base, start_offset,6143inv_params->inv_start_val, inv_params->flags);6144}61456146static inline void gaudi2_hmmu_invalidate_cache_trigger(struct hl_device *hdev,6147int dcore_id, int hmmu_id,6148struct gaudi2_cache_invld_params *inv_params)6149{6150u32 stlb_base = get_hmmu_stlb_base(dcore_id, hmmu_id);61516152gaudi2_mmu_invalidate_cache_trigger(hdev, stlb_base, inv_params);6153}61546155static inline int gaudi2_hmmu_invalidate_cache_status_poll(struct hl_device *hdev,6156int dcore_id, int hmmu_id,6157struct gaudi2_cache_invld_params *inv_params)6158{6159u32 stlb_base = get_hmmu_stlb_base(dcore_id, hmmu_id);61606161return gaudi2_mmu_invalidate_cache_status_poll(hdev, stlb_base, inv_params);6162}61636164static int gaudi2_hmmus_invalidate_cache(struct hl_device *hdev,6165struct gaudi2_cache_invld_params *inv_params)6166{6167int dcore_id, hmmu_id;61686169/* first send all invalidation commands */6170for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {6171for (hmmu_id = 0 ; hmmu_id < NUM_OF_HMMU_PER_DCORE ; hmmu_id++) {6172if (!gaudi2_is_hmmu_enabled(hdev, dcore_id, hmmu_id))6173continue;61746175gaudi2_hmmu_invalidate_cache_trigger(hdev, dcore_id, hmmu_id, inv_params);6176}6177}61786179/* next, poll all invalidations status */6180for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {6181for (hmmu_id = 0 ; hmmu_id < NUM_OF_HMMU_PER_DCORE ; hmmu_id++) {6182int rc;61836184if (!gaudi2_is_hmmu_enabled(hdev, dcore_id, hmmu_id))6185continue;61866187rc = gaudi2_hmmu_invalidate_cache_status_poll(hdev, dcore_id, hmmu_id,6188inv_params);6189if (rc)6190return rc;6191}6192}61936194return 0;6195}61966197static int gaudi2_mmu_invalidate_cache(struct hl_device *hdev, bool is_hard, u32 flags)6198{6199struct gaudi2_device *gaudi2 = hdev->asic_specific;6200struct gaudi2_cache_invld_params invld_params;6201int rc = 0;62026203if (hdev->reset_info.hard_reset_pending)6204return rc;62056206invld_params.range_invalidation = false;6207invld_params.inv_start_val = 1;62086209if ((flags & MMU_OP_USERPTR) && (gaudi2->hw_cap_initialized & HW_CAP_PMMU)) {6210invld_params.flags = flags;6211gaudi2_mmu_invalidate_cache_trigger(hdev, mmPMMU_HBW_STLB_BASE, &invld_params);6212rc = gaudi2_mmu_invalidate_cache_status_poll(hdev, mmPMMU_HBW_STLB_BASE,6213&invld_params);6214} else if (flags & MMU_OP_PHYS_PACK) {6215invld_params.flags = 0;6216rc = gaudi2_hmmus_invalidate_cache(hdev, &invld_params);6217}62186219return rc;6220}62216222static int gaudi2_mmu_invalidate_cache_range(struct hl_device *hdev, bool is_hard,6223u32 flags, u32 asid, u64 va, u64 size)6224{6225struct gaudi2_cache_invld_params invld_params = {0};6226struct gaudi2_device *gaudi2 = hdev->asic_specific;6227u64 start_va, end_va;6228u32 inv_start_val;6229int rc = 0;62306231if (hdev->reset_info.hard_reset_pending)6232return 0;62336234inv_start_val = (1 << MMU_RANGE_INV_EN_SHIFT |62351 << MMU_RANGE_INV_ASID_EN_SHIFT |6236asid << MMU_RANGE_INV_ASID_SHIFT);6237start_va = va;6238end_va = start_va + size;62396240if ((flags & MMU_OP_USERPTR) && (gaudi2->hw_cap_initialized & HW_CAP_PMMU)) {6241/* As range invalidation does not support zero address we will6242* do full invalidation in this case6243*/6244if (start_va) {6245invld_params.range_invalidation = true;6246invld_params.start_va = start_va;6247invld_params.end_va = end_va;6248invld_params.inv_start_val = inv_start_val;6249invld_params.flags = flags | MMU_OP_CLEAR_MEMCACHE;6250} else {6251invld_params.range_invalidation = false;6252invld_params.inv_start_val = 1;6253invld_params.flags = flags;6254}625562566257gaudi2_mmu_invalidate_cache_trigger(hdev, mmPMMU_HBW_STLB_BASE, &invld_params);6258rc = gaudi2_mmu_invalidate_cache_status_poll(hdev, mmPMMU_HBW_STLB_BASE,6259&invld_params);6260if (rc)6261return rc;62626263} else if (flags & MMU_OP_PHYS_PACK) {6264invld_params.start_va = gaudi2_mmu_scramble_addr(hdev, start_va);6265invld_params.end_va = gaudi2_mmu_scramble_addr(hdev, end_va);6266invld_params.inv_start_val = inv_start_val;6267invld_params.flags = flags;6268rc = gaudi2_hmmus_invalidate_cache(hdev, &invld_params);6269}62706271return rc;6272}62736274static int gaudi2_mmu_update_hop0_addr(struct hl_device *hdev, u32 stlb_base,6275bool host_resident_pgt)6276{6277struct asic_fixed_properties *prop = &hdev->asic_prop;6278u64 hop0_addr;6279u32 asid, max_asid = prop->max_asid;6280int rc;62816282/* it takes too much time to init all of the ASIDs on palladium */6283if (hdev->pldm)6284max_asid = min((u32) 8, max_asid);62856286for (asid = 0 ; asid < max_asid ; asid++) {6287if (host_resident_pgt)6288hop0_addr = hdev->mmu_priv.hr.mmu_asid_hop0[asid].phys_addr;6289else6290hop0_addr = prop->mmu_pgt_addr + (asid * prop->dmmu.hop_table_size);62916292rc = gaudi2_mmu_update_asid_hop0_addr(hdev, stlb_base, asid, hop0_addr);6293if (rc) {6294dev_err(hdev->dev, "failed to set hop0 addr for asid %d\n", asid);6295return rc;6296}6297}62986299return 0;6300}63016302static int gaudi2_mmu_init_common(struct hl_device *hdev, u32 mmu_base, u32 stlb_base,6303bool host_resident_pgt)6304{6305u32 status, timeout_usec;6306int rc;63076308if (hdev->pldm || !hdev->pdev)6309timeout_usec = GAUDI2_PLDM_MMU_TIMEOUT_USEC;6310else6311timeout_usec = GAUDI2_MMU_CACHE_INV_TIMEOUT_USEC;63126313WREG32(stlb_base + STLB_INV_ALL_START_OFFSET, 1);63146315rc = hl_poll_timeout(6316hdev,6317stlb_base + STLB_SRAM_INIT_OFFSET,6318status,6319!status,63201000,6321timeout_usec);63226323if (rc)6324dev_notice_ratelimited(hdev->dev, "Timeout when waiting for MMU SRAM init\n");63256326rc = gaudi2_mmu_update_hop0_addr(hdev, stlb_base, host_resident_pgt);6327if (rc)6328return rc;63296330WREG32(mmu_base + MMU_BYPASS_OFFSET, 0);63316332rc = hl_poll_timeout(6333hdev,6334stlb_base + STLB_INV_ALL_START_OFFSET,6335status,6336!status,63371000,6338timeout_usec);63396340if (rc)6341dev_notice_ratelimited(hdev->dev, "Timeout when waiting for MMU invalidate all\n");63426343WREG32(mmu_base + MMU_ENABLE_OFFSET, 1);63446345return rc;6346}63476348static int gaudi2_pci_mmu_init(struct hl_device *hdev)6349{6350struct asic_fixed_properties *prop = &hdev->asic_prop;6351struct gaudi2_device *gaudi2 = hdev->asic_specific;6352u32 mmu_base, stlb_base;6353int rc;63546355if (gaudi2->hw_cap_initialized & HW_CAP_PMMU)6356return 0;63576358mmu_base = mmPMMU_HBW_MMU_BASE;6359stlb_base = mmPMMU_HBW_STLB_BASE;63606361RMWREG32_SHIFTED(stlb_base + STLB_HOP_CONFIGURATION_OFFSET,6362(0 << PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_HOP_SHIFT) |6363(5 << PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_SHIFT) |6364(4 << PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_SHIFT) |6365(5 << PMMU_HBW_STLB_HOP_CONFIGURATION_LAST_HOP_SHIFT) |6366(5 << PMMU_HBW_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_SHIFT),6367PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_HOP_MASK |6368PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_MASK |6369PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_MASK |6370PMMU_HBW_STLB_HOP_CONFIGURATION_LAST_HOP_MASK |6371PMMU_HBW_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_MASK);63726373WREG32(stlb_base + STLB_LL_LOOKUP_MASK_63_32_OFFSET, 0);63746375if (PAGE_SIZE == SZ_64K) {6376/* Set page sizes to 64K on hop5 and 16M on hop4 + enable 8 bit hops */6377RMWREG32_SHIFTED(mmu_base + MMU_STATIC_MULTI_PAGE_SIZE_OFFSET,6378FIELD_PREP(DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP5_PAGE_SIZE_MASK, 4) |6379FIELD_PREP(DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP4_PAGE_SIZE_MASK, 3) |6380FIELD_PREP(6381DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_CFG_8_BITS_HOP_MODE_EN_MASK,63821),6383DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP5_PAGE_SIZE_MASK |6384DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP4_PAGE_SIZE_MASK |6385DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_CFG_8_BITS_HOP_MODE_EN_MASK);6386}63876388WREG32(mmu_base + MMU_SPI_SEI_MASK_OFFSET, GAUDI2_PMMU_SPI_SEI_ENABLE_MASK);63896390rc = gaudi2_mmu_init_common(hdev, mmu_base, stlb_base, prop->pmmu.host_resident);6391if (rc)6392return rc;63936394gaudi2->hw_cap_initialized |= HW_CAP_PMMU;63956396return 0;6397}63986399static int gaudi2_dcore_hmmu_init(struct hl_device *hdev, int dcore_id,6400int hmmu_id)6401{6402struct asic_fixed_properties *prop = &hdev->asic_prop;6403struct gaudi2_device *gaudi2 = hdev->asic_specific;6404u32 offset, mmu_base, stlb_base, hw_cap;6405u8 dmmu_seq;6406int rc;64076408dmmu_seq = NUM_OF_HMMU_PER_DCORE * dcore_id + hmmu_id;6409hw_cap = HW_CAP_DCORE0_DMMU0 << dmmu_seq;64106411/*6412* return if DMMU is already initialized or if it's not out of6413* isolation (due to cluster binning)6414*/6415if ((gaudi2->hw_cap_initialized & hw_cap) || !(prop->hmmu_hif_enabled_mask & BIT(dmmu_seq)))6416return 0;64176418offset = (u32) (dcore_id * DCORE_OFFSET + hmmu_id * DCORE_HMMU_OFFSET);6419mmu_base = mmDCORE0_HMMU0_MMU_BASE + offset;6420stlb_base = mmDCORE0_HMMU0_STLB_BASE + offset;64216422RMWREG32(mmu_base + MMU_STATIC_MULTI_PAGE_SIZE_OFFSET, 5 /* 64MB */,6423MMU_STATIC_MULTI_PAGE_SIZE_HOP4_PAGE_SIZE_MASK);64246425RMWREG32_SHIFTED(stlb_base + STLB_HOP_CONFIGURATION_OFFSET,6426FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_HOP_MASK, 0) |6427FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_MASK, 3) |6428FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_MASK, 3) |6429FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_LAST_HOP_MASK, 3) |6430FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_MASK, 3),6431DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_HOP_MASK |6432DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_MASK |6433DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_MASK |6434DCORE0_HMMU0_STLB_HOP_CONFIGURATION_LAST_HOP_MASK |6435DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_MASK);64366437RMWREG32(stlb_base + STLB_HOP_CONFIGURATION_OFFSET, 1,6438STLB_HOP_CONFIGURATION_ONLY_LARGE_PAGE_MASK);64396440WREG32(mmu_base + MMU_SPI_SEI_MASK_OFFSET, GAUDI2_HMMU_SPI_SEI_ENABLE_MASK);64416442rc = gaudi2_mmu_init_common(hdev, mmu_base, stlb_base, prop->dmmu.host_resident);6443if (rc)6444return rc;64456446gaudi2->hw_cap_initialized |= hw_cap;64476448return 0;6449}64506451static int gaudi2_hbm_mmu_init(struct hl_device *hdev)6452{6453int rc, dcore_id, hmmu_id;64546455for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++)6456for (hmmu_id = 0 ; hmmu_id < NUM_OF_HMMU_PER_DCORE; hmmu_id++) {6457rc = gaudi2_dcore_hmmu_init(hdev, dcore_id, hmmu_id);6458if (rc)6459return rc;6460}64616462return 0;6463}64646465static int gaudi2_mmu_init(struct hl_device *hdev)6466{6467int rc;64686469rc = gaudi2_pci_mmu_init(hdev);6470if (rc)6471return rc;64726473rc = gaudi2_hbm_mmu_init(hdev);6474if (rc)6475return rc;64766477return 0;6478}64796480static int gaudi2_hw_init(struct hl_device *hdev)6481{6482struct gaudi2_device *gaudi2 = hdev->asic_specific;6483int rc;64846485/* Let's mark in the H/W that we have reached this point. We check6486* this value in the reset_before_init function to understand whether6487* we need to reset the chip before doing H/W init. This register is6488* cleared by the H/W upon H/W reset6489*/6490WREG32(mmHW_STATE, HL_DEVICE_HW_STATE_DIRTY);64916492/* Perform read from the device to make sure device is up */6493RREG32(mmHW_STATE);64946495/* If iATU is done by FW, the HBM bar ALWAYS points to DRAM_PHYS_BASE.6496* So we set it here and if anyone tries to move it later to6497* a different address, there will be an error6498*/6499if (hdev->asic_prop.iatu_done_by_fw)6500gaudi2->dram_bar_cur_addr = DRAM_PHYS_BASE;65016502/*6503* Before pushing u-boot/linux to device, need to set the hbm bar to6504* base address of dram6505*/6506if (gaudi2_set_hbm_bar_base(hdev, DRAM_PHYS_BASE) == U64_MAX) {6507dev_err(hdev->dev, "failed to map HBM bar to DRAM base address\n");6508return -EIO;6509}65106511rc = gaudi2_init_cpu(hdev);6512if (rc) {6513dev_err(hdev->dev, "failed to initialize CPU\n");6514return rc;6515}65166517gaudi2_init_scrambler_hbm(hdev);6518gaudi2_init_kdma(hdev);65196520rc = gaudi2_init_cpu_queues(hdev, GAUDI2_CPU_TIMEOUT_USEC);6521if (rc) {6522dev_err(hdev->dev, "failed to initialize CPU H/W queues %d\n", rc);6523return rc;6524}65256526rc = gaudi2->cpucp_info_get(hdev);6527if (rc) {6528dev_err(hdev->dev, "Failed to get cpucp info\n");6529return rc;6530}65316532rc = gaudi2_mmu_init(hdev);6533if (rc)6534return rc;65356536gaudi2_init_pdma(hdev);6537gaudi2_init_edma(hdev);6538gaudi2_init_sm(hdev);6539gaudi2_init_tpc(hdev);6540gaudi2_init_mme(hdev);6541gaudi2_init_rotator(hdev);6542gaudi2_init_dec(hdev);6543gaudi2_enable_timestamp(hdev);65446545rc = gaudi2_coresight_init(hdev);6546if (rc)6547goto disable_queues;65486549rc = gaudi2_enable_msix(hdev);6550if (rc)6551goto disable_queues;65526553/* Perform read from the device to flush all configuration */6554RREG32(mmHW_STATE);65556556return 0;65576558disable_queues:6559gaudi2_disable_dma_qmans(hdev);6560gaudi2_disable_mme_qmans(hdev);6561gaudi2_disable_tpc_qmans(hdev);6562gaudi2_disable_rot_qmans(hdev);6563gaudi2_disable_nic_qmans(hdev);65646565gaudi2_disable_timestamp(hdev);65666567return rc;6568}65696570/**6571* gaudi2_send_hard_reset_cmd - common function to handle reset6572*6573* @hdev: pointer to the habanalabs device structure6574*6575* This function handles the various possible scenarios for reset.6576* It considers if reset is handled by driver\FW and what FW components are loaded6577*/6578static void gaudi2_send_hard_reset_cmd(struct hl_device *hdev)6579{6580struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;6581bool heartbeat_reset, preboot_only, cpu_initialized = false;6582struct gaudi2_device *gaudi2 = hdev->asic_specific;6583u32 cpu_boot_status;65846585preboot_only = (hdev->fw_loader.fw_comp_loaded == FW_TYPE_PREBOOT_CPU);6586heartbeat_reset = (hdev->reset_info.curr_reset_cause == HL_RESET_CAUSE_HEARTBEAT);65876588/*6589* Handle corner case where failure was at cpu management app load,6590* and driver didn't detect any failure while loading the FW,6591* then at such scenario driver will send only HALT_MACHINE6592* and no one will respond to this request since FW already back to preboot6593* and it cannot handle such cmd.6594* In this case next time the management app loads it'll check on events register6595* which will still have the halt indication, and will reboot the device.6596* The solution is to let preboot clear all relevant registers before next boot6597* once driver send COMMS_RST_DEV.6598*/6599cpu_boot_status = RREG32(mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS);66006601if (gaudi2 && (gaudi2->hw_cap_initialized & HW_CAP_CPU) &&6602(cpu_boot_status == CPU_BOOT_STATUS_SRAM_AVAIL))6603cpu_initialized = true;66046605/*6606* when Linux/Bootfit exist this write to the SP can be interpreted in 2 ways:6607* 1. FW reset: FW initiate the reset sequence6608* 2. driver reset: FW will start HALT sequence (the preparations for the6609* reset but not the reset itself as it is not implemented6610* on their part) and LKD will wait to let FW complete the6611* sequence before issuing the reset6612*/6613if (!preboot_only && cpu_initialized) {6614WREG32(le32_to_cpu(dyn_regs->gic_host_halt_irq),6615gaudi2_irq_map_table[GAUDI2_EVENT_CPU_HALT_MACHINE].cpu_id);66166617msleep(GAUDI2_CPU_RESET_WAIT_MSEC);6618}66196620/*6621* When working with preboot (without Linux/Boot fit) we can6622* communicate only using the COMMS commands to issue halt/reset.6623*6624* For the case in which we are working with Linux/Bootfit this is a hail-mary6625* attempt to revive the card in the small chance that the f/w has6626* experienced a watchdog event, which caused it to return back to preboot.6627* In that case, triggering reset through GIC won't help. We need to6628* trigger the reset as if Linux wasn't loaded.6629*6630* We do it only if the reset cause was HB, because that would be the6631* indication of such an event.6632*6633* In case watchdog hasn't expired but we still got HB, then this won't6634* do any damage.6635*/66366637if (heartbeat_reset || preboot_only || !cpu_initialized) {6638if (hdev->asic_prop.hard_reset_done_by_fw)6639hl_fw_ask_hard_reset_without_linux(hdev);6640else6641hl_fw_ask_halt_machine_without_linux(hdev);6642}6643}66446645/**6646* gaudi2_execute_hard_reset - execute hard reset by driver/FW6647*6648* @hdev: pointer to the habanalabs device structure6649*6650* This function executes hard reset based on if driver/FW should do the reset6651*/6652static void gaudi2_execute_hard_reset(struct hl_device *hdev)6653{6654if (hdev->asic_prop.hard_reset_done_by_fw) {6655gaudi2_send_hard_reset_cmd(hdev);6656return;6657}66586659/* Set device to handle FLR by H/W as we will put the device6660* CPU to halt mode6661*/6662WREG32(mmPCIE_AUX_FLR_CTRL,6663(PCIE_AUX_FLR_CTRL_HW_CTRL_MASK | PCIE_AUX_FLR_CTRL_INT_MASK_MASK));66646665gaudi2_send_hard_reset_cmd(hdev);66666667WREG32(mmPSOC_RESET_CONF_SW_ALL_RST, 1);6668}66696670/**6671* gaudi2_execute_soft_reset - execute soft reset by driver/FW6672*6673* @hdev: pointer to the habanalabs device structure6674* @driver_performs_reset: true if driver should perform reset instead of f/w.6675* @poll_timeout_us: time to wait for response from f/w.6676*6677* This function executes soft reset based on if driver/FW should do the reset6678*/6679static int gaudi2_execute_soft_reset(struct hl_device *hdev, bool driver_performs_reset,6680u32 poll_timeout_us)6681{6682if (!driver_performs_reset)6683return hl_fw_send_soft_reset(hdev);66846685/* Block access to engines, QMANs and SM during reset, these6686* RRs will be reconfigured after soft reset.6687* PCIE_MSIX is left unsecured to allow NIC packets processing during the reset.6688*/6689gaudi2_write_rr_to_all_lbw_rtrs(hdev, RR_TYPE_LONG, NUM_LONG_LBW_RR - 1,6690mmDCORE0_TPC0_QM_DCCM_BASE, mmPCIE_MSIX_BASE);66916692gaudi2_write_rr_to_all_lbw_rtrs(hdev, RR_TYPE_LONG, NUM_LONG_LBW_RR - 2,6693mmPCIE_MSIX_BASE + HL_BLOCK_SIZE,6694mmPCIE_VDEC1_MSTR_IF_RR_SHRD_HBW_BASE + HL_BLOCK_SIZE);66956696WREG32(mmPSOC_RESET_CONF_SOFT_RST, 1);6697return 0;6698}66996700static void gaudi2_poll_btm_indication(struct hl_device *hdev, u32 poll_timeout_us)6701{6702int i, rc = 0;6703u32 reg_val;67046705/* We poll the BTM done indication multiple times after reset due to6706* a HW errata 'GAUDI2_0300'6707*/6708for (i = 0 ; i < GAUDI2_RESET_POLL_CNT ; i++)6709rc = hl_poll_timeout(6710hdev,6711mmPSOC_GLOBAL_CONF_BTM_FSM,6712reg_val,6713reg_val == 0,67141000,6715poll_timeout_us);67166717if (rc)6718dev_err(hdev->dev, "Timeout while waiting for device to reset 0x%x\n", reg_val);6719}67206721static int gaudi2_hw_fini(struct hl_device *hdev, bool hard_reset, bool fw_reset)6722{6723struct gaudi2_device *gaudi2 = hdev->asic_specific;6724u32 poll_timeout_us, reset_sleep_ms;6725bool driver_performs_reset = false;6726int rc;67276728if (hdev->pldm) {6729reset_sleep_ms = hard_reset ? GAUDI2_PLDM_HRESET_TIMEOUT_MSEC :6730GAUDI2_PLDM_SRESET_TIMEOUT_MSEC;6731poll_timeout_us = GAUDI2_PLDM_RESET_POLL_TIMEOUT_USEC;6732} else {6733reset_sleep_ms = GAUDI2_RESET_TIMEOUT_MSEC;6734poll_timeout_us = GAUDI2_RESET_POLL_TIMEOUT_USEC;6735}67366737if (fw_reset)6738goto skip_reset;67396740gaudi2_reset_arcs(hdev);67416742if (hard_reset) {6743driver_performs_reset = !hdev->asic_prop.hard_reset_done_by_fw;6744gaudi2_execute_hard_reset(hdev);6745} else {6746/*6747* As we have to support also work with preboot only (which does not supports6748* soft reset) we have to make sure that security is disabled before letting driver6749* do the reset. user shall control the BFE flags to avoid asking soft reset in6750* secured device with preboot only.6751*/6752driver_performs_reset = (hdev->fw_components == FW_TYPE_PREBOOT_CPU &&6753!hdev->asic_prop.fw_security_enabled);6754rc = gaudi2_execute_soft_reset(hdev, driver_performs_reset, poll_timeout_us);6755if (rc)6756return rc;6757}67586759skip_reset:6760if (driver_performs_reset || hard_reset) {6761/*6762* Instead of waiting for BTM indication we should wait for preboot ready:6763* Consider the below scenario:6764* 1. FW update is being triggered6765* - setting the dirty bit6766* 2. hard reset will be triggered due to the dirty bit6767* 3. FW initiates the reset:6768* - dirty bit cleared6769* - BTM indication cleared6770* - preboot ready indication cleared6771* 4. during hard reset:6772* - BTM indication will be set6773* - BIST test performed and another reset triggered6774* 5. only after this reset the preboot will set the preboot ready6775*6776* when polling on BTM indication alone we can lose sync with FW while trying to6777* communicate with FW that is during reset.6778* to overcome this we will always wait to preboot ready indication6779*/67806781/* without this sleep reset will not work */6782msleep(reset_sleep_ms);67836784if (hdev->fw_components & FW_TYPE_PREBOOT_CPU)6785hl_fw_wait_preboot_ready(hdev);6786else6787gaudi2_poll_btm_indication(hdev, poll_timeout_us);6788}67896790if (!gaudi2)6791return 0;67926793gaudi2->dec_hw_cap_initialized &= ~(HW_CAP_DEC_MASK);6794gaudi2->tpc_hw_cap_initialized &= ~(HW_CAP_TPC_MASK);67956796/*6797* Clear NIC capability mask in order for driver to re-configure6798* NIC QMANs. NIC ports will not be re-configured during soft6799* reset as we call gaudi2_nic_init only during hard reset6800*/6801gaudi2->nic_hw_cap_initialized &= ~(HW_CAP_NIC_MASK);68026803if (hard_reset) {6804gaudi2->hw_cap_initialized &=6805~(HW_CAP_DRAM | HW_CAP_CLK_GATE | HW_CAP_HBM_SCRAMBLER_MASK |6806HW_CAP_PMMU | HW_CAP_CPU | HW_CAP_CPU_Q |6807HW_CAP_SRAM_SCRAMBLER | HW_CAP_DMMU_MASK |6808HW_CAP_PDMA_MASK | HW_CAP_EDMA_MASK | HW_CAP_KDMA |6809HW_CAP_MME_MASK | HW_CAP_ROT_MASK);68106811memset(gaudi2->events_stat, 0, sizeof(gaudi2->events_stat));6812} else {6813gaudi2->hw_cap_initialized &=6814~(HW_CAP_CLK_GATE | HW_CAP_HBM_SCRAMBLER_SW_RESET |6815HW_CAP_PDMA_MASK | HW_CAP_EDMA_MASK | HW_CAP_MME_MASK |6816HW_CAP_ROT_MASK);6817}6818return 0;6819}68206821static int gaudi2_suspend(struct hl_device *hdev)6822{6823return hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_DISABLE_PCI_ACCESS, 0x0);6824}68256826static int gaudi2_resume(struct hl_device *hdev)6827{6828return gaudi2_init_iatu(hdev);6829}68306831static int gaudi2_mmap(struct hl_device *hdev, struct vm_area_struct *vma,6832void *cpu_addr, dma_addr_t dma_addr, size_t size)6833{6834int rc;68356836vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |6837VM_DONTCOPY | VM_NORESERVE);68386839#ifdef _HAS_DMA_MMAP_COHERENT6840/*6841* If dma_alloc_coherent() returns a vmalloc address, set VM_MIXEDMAP6842* so vm_insert_page() can handle it safely. Without this, the kernel6843* may BUG_ON due to VM_PFNMAP.6844*/6845if (is_vmalloc_addr(cpu_addr))6846vm_flags_set(vma, VM_MIXEDMAP);68476848rc = dma_mmap_coherent(hdev->dev, vma, cpu_addr, dma_addr, size);6849if (rc)6850dev_err(hdev->dev, "dma_mmap_coherent error %d", rc);68516852#else68536854rc = remap_pfn_range(vma, vma->vm_start,6855virt_to_phys(cpu_addr) >> PAGE_SHIFT,6856size, vma->vm_page_prot);6857if (rc)6858dev_err(hdev->dev, "remap_pfn_range error %d", rc);68596860#endif68616862return rc;6863}68646865static bool gaudi2_is_queue_enabled(struct hl_device *hdev, u32 hw_queue_id)6866{6867struct gaudi2_device *gaudi2 = hdev->asic_specific;6868u64 hw_cap_mask = 0;6869u64 hw_tpc_cap_bit = 0;6870u64 hw_nic_cap_bit = 0;6871u64 hw_test_cap_bit = 0;68726873switch (hw_queue_id) {6874case GAUDI2_QUEUE_ID_PDMA_0_0:6875case GAUDI2_QUEUE_ID_PDMA_0_1:6876case GAUDI2_QUEUE_ID_PDMA_1_0:6877hw_cap_mask = HW_CAP_PDMA_MASK;6878break;6879case GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3:6880hw_test_cap_bit = HW_CAP_EDMA_SHIFT +6881((hw_queue_id - GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0) >> 2);6882break;6883case GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3:6884hw_test_cap_bit = HW_CAP_EDMA_SHIFT + NUM_OF_EDMA_PER_DCORE +6885((hw_queue_id - GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0) >> 2);6886break;6887case GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3:6888hw_test_cap_bit = HW_CAP_EDMA_SHIFT + 2 * NUM_OF_EDMA_PER_DCORE +6889((hw_queue_id - GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0) >> 2);6890break;6891case GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3:6892hw_test_cap_bit = HW_CAP_EDMA_SHIFT + 3 * NUM_OF_EDMA_PER_DCORE +6893((hw_queue_id - GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0) >> 2);6894break;68956896case GAUDI2_QUEUE_ID_DCORE0_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE0_MME_0_3:6897hw_test_cap_bit = HW_CAP_MME_SHIFT;6898break;68996900case GAUDI2_QUEUE_ID_DCORE1_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE1_MME_0_3:6901hw_test_cap_bit = HW_CAP_MME_SHIFT + 1;6902break;69036904case GAUDI2_QUEUE_ID_DCORE2_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE2_MME_0_3:6905hw_test_cap_bit = HW_CAP_MME_SHIFT + 2;6906break;69076908case GAUDI2_QUEUE_ID_DCORE3_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE3_MME_0_3:6909hw_test_cap_bit = HW_CAP_MME_SHIFT + 3;6910break;69116912case GAUDI2_QUEUE_ID_DCORE0_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE0_TPC_5_3:6913hw_tpc_cap_bit = HW_CAP_TPC_SHIFT +6914((hw_queue_id - GAUDI2_QUEUE_ID_DCORE0_TPC_0_0) >> 2);69156916/* special case where cap bit refers to the first queue id */6917if (!hw_tpc_cap_bit)6918return !!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(0));6919break;69206921case GAUDI2_QUEUE_ID_DCORE1_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE1_TPC_5_3:6922hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + NUM_OF_TPC_PER_DCORE +6923((hw_queue_id - GAUDI2_QUEUE_ID_DCORE1_TPC_0_0) >> 2);6924break;69256926case GAUDI2_QUEUE_ID_DCORE2_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE2_TPC_5_3:6927hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + (2 * NUM_OF_TPC_PER_DCORE) +6928((hw_queue_id - GAUDI2_QUEUE_ID_DCORE2_TPC_0_0) >> 2);6929break;69306931case GAUDI2_QUEUE_ID_DCORE3_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE3_TPC_5_3:6932hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + (3 * NUM_OF_TPC_PER_DCORE) +6933((hw_queue_id - GAUDI2_QUEUE_ID_DCORE3_TPC_0_0) >> 2);6934break;69356936case GAUDI2_QUEUE_ID_DCORE0_TPC_6_0 ... GAUDI2_QUEUE_ID_DCORE0_TPC_6_3:6937hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + (4 * NUM_OF_TPC_PER_DCORE);6938break;69396940case GAUDI2_QUEUE_ID_ROT_0_0 ... GAUDI2_QUEUE_ID_ROT_1_3:6941hw_test_cap_bit = HW_CAP_ROT_SHIFT + ((hw_queue_id - GAUDI2_QUEUE_ID_ROT_0_0) >> 2);6942break;69436944case GAUDI2_QUEUE_ID_NIC_0_0 ... GAUDI2_QUEUE_ID_NIC_23_3:6945hw_nic_cap_bit = HW_CAP_NIC_SHIFT + ((hw_queue_id - GAUDI2_QUEUE_ID_NIC_0_0) >> 2);69466947/* special case where cap bit refers to the first queue id */6948if (!hw_nic_cap_bit)6949return !!(gaudi2->nic_hw_cap_initialized & BIT_ULL(0));6950break;69516952case GAUDI2_QUEUE_ID_CPU_PQ:6953return !!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q);69546955default:6956return false;6957}69586959if (hw_tpc_cap_bit)6960return !!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(hw_tpc_cap_bit));69616962if (hw_nic_cap_bit)6963return !!(gaudi2->nic_hw_cap_initialized & BIT_ULL(hw_nic_cap_bit));69646965if (hw_test_cap_bit)6966hw_cap_mask = BIT_ULL(hw_test_cap_bit);69676968return !!(gaudi2->hw_cap_initialized & hw_cap_mask);6969}69706971static bool gaudi2_is_arc_enabled(struct hl_device *hdev, u64 arc_id)6972{6973struct gaudi2_device *gaudi2 = hdev->asic_specific;69746975switch (arc_id) {6976case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC5:6977case CPU_ID_MME_QMAN_ARC0...CPU_ID_ROT_QMAN_ARC1:6978return !!(gaudi2->active_hw_arc & BIT_ULL(arc_id));69796980case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:6981return !!(gaudi2->active_tpc_arc & BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0));69826983case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:6984return !!(gaudi2->active_nic_arc & BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0));69856986default:6987return false;6988}6989}69906991static void gaudi2_clr_arc_id_cap(struct hl_device *hdev, u64 arc_id)6992{6993struct gaudi2_device *gaudi2 = hdev->asic_specific;69946995switch (arc_id) {6996case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC5:6997case CPU_ID_MME_QMAN_ARC0...CPU_ID_ROT_QMAN_ARC1:6998gaudi2->active_hw_arc &= ~(BIT_ULL(arc_id));6999break;70007001case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:7002gaudi2->active_tpc_arc &= ~(BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0));7003break;70047005case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:7006gaudi2->active_nic_arc &= ~(BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0));7007break;70087009default:7010return;7011}7012}70137014static void gaudi2_set_arc_id_cap(struct hl_device *hdev, u64 arc_id)7015{7016struct gaudi2_device *gaudi2 = hdev->asic_specific;70177018switch (arc_id) {7019case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC5:7020case CPU_ID_MME_QMAN_ARC0...CPU_ID_ROT_QMAN_ARC1:7021gaudi2->active_hw_arc |= BIT_ULL(arc_id);7022break;70237024case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:7025gaudi2->active_tpc_arc |= BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0);7026break;70277028case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:7029gaudi2->active_nic_arc |= BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0);7030break;70317032default:7033return;7034}7035}70367037static void gaudi2_ring_doorbell(struct hl_device *hdev, u32 hw_queue_id, u32 pi)7038{7039struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;7040u32 pq_offset, reg_base, db_reg_offset, db_value;70417042if (hw_queue_id != GAUDI2_QUEUE_ID_CPU_PQ) {7043/*7044* QMAN has 4 successive PQ_PI registers, 1 for each of the QMAN PQs.7045* Masking the H/W queue ID with 0x3 extracts the QMAN internal PQ7046* number.7047*/7048pq_offset = (hw_queue_id & 0x3) * 4;7049reg_base = gaudi2_qm_blocks_bases[hw_queue_id];7050db_reg_offset = reg_base + QM_PQ_PI_0_OFFSET + pq_offset;7051} else {7052db_reg_offset = mmCPU_IF_PF_PQ_PI;7053}70547055db_value = pi;70567057/* ring the doorbell */7058WREG32(db_reg_offset, db_value);70597060if (hw_queue_id == GAUDI2_QUEUE_ID_CPU_PQ) {7061/* make sure device CPU will read latest data from host */7062mb();7063WREG32(le32_to_cpu(dyn_regs->gic_host_pi_upd_irq),7064gaudi2_irq_map_table[GAUDI2_EVENT_CPU_PI_UPDATE].cpu_id);7065}7066}70677068static void gaudi2_pqe_write(struct hl_device *hdev, __le64 *pqe, struct hl_bd *bd)7069{7070__le64 *pbd = (__le64 *) bd;70717072/* The QMANs are on the host memory so a simple copy suffice */7073pqe[0] = pbd[0];7074pqe[1] = pbd[1];7075}70767077static void *gaudi2_dma_alloc_coherent(struct hl_device *hdev, size_t size,7078dma_addr_t *dma_handle, gfp_t flags)7079{7080return dma_alloc_coherent(&hdev->pdev->dev, size, dma_handle, flags);7081}70827083static void gaudi2_dma_free_coherent(struct hl_device *hdev, size_t size,7084void *cpu_addr, dma_addr_t dma_handle)7085{7086dma_free_coherent(&hdev->pdev->dev, size, cpu_addr, dma_handle);7087}70887089static int gaudi2_send_cpu_message(struct hl_device *hdev, u32 *msg, u16 len,7090u32 timeout, u64 *result)7091{7092struct gaudi2_device *gaudi2 = hdev->asic_specific;70937094if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q)) {7095if (result)7096*result = 0;7097return 0;7098}70997100if (!timeout)7101timeout = GAUDI2_MSG_TO_CPU_TIMEOUT_USEC;71027103return hl_fw_send_cpu_message(hdev, GAUDI2_QUEUE_ID_CPU_PQ, msg, len, timeout, result);7104}71057106static void *gaudi2_dma_pool_zalloc(struct hl_device *hdev, size_t size,7107gfp_t mem_flags, dma_addr_t *dma_handle)7108{7109if (size > GAUDI2_DMA_POOL_BLK_SIZE)7110return NULL;71117112return dma_pool_zalloc(hdev->dma_pool, mem_flags, dma_handle);7113}71147115static void gaudi2_dma_pool_free(struct hl_device *hdev, void *vaddr, dma_addr_t dma_addr)7116{7117dma_pool_free(hdev->dma_pool, vaddr, dma_addr);7118}71197120static void *gaudi2_cpu_accessible_dma_pool_alloc(struct hl_device *hdev, size_t size,7121dma_addr_t *dma_handle)7122{7123return hl_fw_cpu_accessible_dma_pool_alloc(hdev, size, dma_handle);7124}71257126static void gaudi2_cpu_accessible_dma_pool_free(struct hl_device *hdev, size_t size, void *vaddr)7127{7128hl_fw_cpu_accessible_dma_pool_free(hdev, size, vaddr);7129}71307131static int gaudi2_validate_cb_address(struct hl_device *hdev, struct hl_cs_parser *parser)7132{7133struct asic_fixed_properties *asic_prop = &hdev->asic_prop;7134struct gaudi2_device *gaudi2 = hdev->asic_specific;71357136if (!gaudi2_is_queue_enabled(hdev, parser->hw_queue_id)) {7137dev_err(hdev->dev, "h/w queue %s is disabled\n",7138GAUDI2_QUEUE_ID_TO_STR(parser->hw_queue_id));7139return -EINVAL;7140}71417142/* Just check if CB address is valid */71437144if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,7145parser->user_cb_size,7146asic_prop->sram_user_base_address,7147asic_prop->sram_end_address))7148return 0;71497150if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,7151parser->user_cb_size,7152asic_prop->dram_user_base_address,7153asic_prop->dram_end_address))7154return 0;71557156if ((gaudi2->hw_cap_initialized & HW_CAP_DMMU_MASK) &&7157hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,7158parser->user_cb_size,7159asic_prop->dmmu.start_addr,7160asic_prop->dmmu.end_addr))7161return 0;71627163if (gaudi2->hw_cap_initialized & HW_CAP_PMMU) {7164if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,7165parser->user_cb_size,7166asic_prop->pmmu.start_addr,7167asic_prop->pmmu.end_addr) ||7168hl_mem_area_inside_range(7169(u64) (uintptr_t) parser->user_cb,7170parser->user_cb_size,7171asic_prop->pmmu_huge.start_addr,7172asic_prop->pmmu_huge.end_addr))7173return 0;71747175} else if (gaudi2_host_phys_addr_valid((u64) (uintptr_t) parser->user_cb)) {7176if (!hdev->pdev)7177return 0;71787179if (!device_iommu_mapped(&hdev->pdev->dev))7180return 0;7181}71827183dev_err(hdev->dev, "CB address %p + 0x%x for internal QMAN is not valid\n",7184parser->user_cb, parser->user_cb_size);71857186return -EFAULT;7187}71887189static int gaudi2_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser)7190{7191struct gaudi2_device *gaudi2 = hdev->asic_specific;71927193if (!parser->is_kernel_allocated_cb)7194return gaudi2_validate_cb_address(hdev, parser);71957196if (!(gaudi2->hw_cap_initialized & HW_CAP_PMMU)) {7197dev_err(hdev->dev, "PMMU not initialized - Unsupported mode in Gaudi2\n");7198return -EINVAL;7199}72007201return 0;7202}72037204static int gaudi2_send_heartbeat(struct hl_device *hdev)7205{7206struct gaudi2_device *gaudi2 = hdev->asic_specific;72077208if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))7209return 0;72107211return hl_fw_send_heartbeat(hdev);7212}72137214/* This is an internal helper function, used to update the KDMA mmu props.7215* Should be called with a proper kdma lock.7216*/7217static void gaudi2_kdma_set_mmbp_asid(struct hl_device *hdev,7218bool mmu_bypass, u32 asid)7219{7220u32 rw_asid, rw_mmu_bp;72217222rw_asid = (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_SHIFT) |7223(asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_SHIFT);72247225rw_mmu_bp = (!!mmu_bypass << ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_RD_SHIFT) |7226(!!mmu_bypass << ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_WR_SHIFT);72277228WREG32(mmARC_FARM_KDMA_CTX_AXUSER_HB_ASID, rw_asid);7229WREG32(mmARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP, rw_mmu_bp);7230}72317232static void gaudi2_arm_cq_monitor(struct hl_device *hdev, u32 sob_id, u32 mon_id, u32 cq_id,7233u32 mon_payload, u32 sync_value)7234{7235u32 sob_offset, mon_offset, sync_group_id, mode, mon_arm;7236u8 mask;72377238sob_offset = sob_id * 4;7239mon_offset = mon_id * 4;72407241/* Reset the SOB value */7242WREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset, 0);72437244/* Configure this address with CQ_ID 0 because CQ_EN is set */7245WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, cq_id);72467247/* Configure this address with CS index because CQ_EN is set */7248WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, mon_payload);72497250sync_group_id = sob_id / 8;7251mask = ~(1 << (sob_id & 0x7));7252mode = 1; /* comparison mode is "equal to" */72537254mon_arm = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOD_MASK, sync_value);7255mon_arm |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOP_MASK, mode);7256mon_arm |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_MASK_MASK, mask);7257mon_arm |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SID_MASK, sync_group_id);7258WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + mon_offset, mon_arm);7259}72607261/* This is an internal helper function used by gaudi2_send_job_to_kdma only */7262static int gaudi2_send_job_to_kdma(struct hl_device *hdev,7263u64 src_addr, u64 dst_addr,7264u32 size, bool is_memset)7265{7266u32 comp_val, commit_mask, *polling_addr, timeout, status = 0;7267struct hl_cq_entry *cq_base;7268struct hl_cq *cq;7269u64 comp_addr;7270int rc;72717272gaudi2_arm_cq_monitor(hdev, GAUDI2_RESERVED_SOB_KDMA_COMPLETION,7273GAUDI2_RESERVED_MON_KDMA_COMPLETION,7274GAUDI2_RESERVED_CQ_KDMA_COMPLETION, 1, 1);72757276comp_addr = CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 +7277(GAUDI2_RESERVED_SOB_KDMA_COMPLETION * sizeof(u32));72787279comp_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_INC_MASK, 1) |7280FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_VAL_MASK, 1);72817282WREG32(mmARC_FARM_KDMA_CTX_SRC_BASE_LO, lower_32_bits(src_addr));7283WREG32(mmARC_FARM_KDMA_CTX_SRC_BASE_HI, upper_32_bits(src_addr));7284WREG32(mmARC_FARM_KDMA_CTX_DST_BASE_LO, lower_32_bits(dst_addr));7285WREG32(mmARC_FARM_KDMA_CTX_DST_BASE_HI, upper_32_bits(dst_addr));7286WREG32(mmARC_FARM_KDMA_CTX_WR_COMP_ADDR_LO, lower_32_bits(comp_addr));7287WREG32(mmARC_FARM_KDMA_CTX_WR_COMP_ADDR_HI, upper_32_bits(comp_addr));7288WREG32(mmARC_FARM_KDMA_CTX_WR_COMP_WDATA, comp_val);7289WREG32(mmARC_FARM_KDMA_CTX_DST_TSIZE_0, size);72907291commit_mask = FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_LIN_MASK, 1) |7292FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_WR_COMP_EN_MASK, 1);72937294if (is_memset)7295commit_mask |= FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_MEM_SET_MASK, 1);72967297WREG32(mmARC_FARM_KDMA_CTX_COMMIT, commit_mask);72987299/* Wait for completion */7300cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_KDMA_COMPLETION];7301cq_base = cq->kernel_address;7302polling_addr = (u32 *)&cq_base[cq->ci];73037304if (hdev->pldm)7305/* for each 1MB 20 second of timeout */7306timeout = ((size / SZ_1M) + 1) * USEC_PER_SEC * 20;7307else7308timeout = KDMA_TIMEOUT_USEC;73097310/* Polling */7311rc = hl_poll_timeout_memory(7312hdev,7313polling_addr,7314status,7315(status == 1),73161000,7317timeout,7318true);73197320*polling_addr = 0;73217322if (rc) {7323dev_err(hdev->dev, "Timeout while waiting for KDMA to be idle\n");7324WREG32(mmARC_FARM_KDMA_CFG_1, 1 << ARC_FARM_KDMA_CFG_1_HALT_SHIFT);7325return rc;7326}73277328cq->ci = hl_cq_inc_ptr(cq->ci);73297330return 0;7331}73327333static void gaudi2_memset_device_lbw(struct hl_device *hdev, u32 addr, u32 size, u32 val)7334{7335u32 i;73367337for (i = 0 ; i < size ; i += sizeof(u32))7338WREG32(addr + i, val);7339}73407341static void gaudi2_qman_set_test_mode(struct hl_device *hdev, u32 hw_queue_id, bool enable)7342{7343u32 reg_base = gaudi2_qm_blocks_bases[hw_queue_id];73447345if (enable) {7346WREG32(reg_base + QM_GLBL_PROT_OFFSET, QMAN_MAKE_TRUSTED_TEST_MODE);7347WREG32(reg_base + QM_PQC_CFG_OFFSET, 0);7348} else {7349WREG32(reg_base + QM_GLBL_PROT_OFFSET, QMAN_MAKE_TRUSTED);7350WREG32(reg_base + QM_PQC_CFG_OFFSET, 1 << PDMA0_QM_PQC_CFG_EN_SHIFT);7351}7352}73537354static inline u32 gaudi2_test_queue_hw_queue_id_to_sob_id(struct hl_device *hdev, u32 hw_queue_id)7355{7356return hdev->asic_prop.first_available_user_sob[0] +7357hw_queue_id - GAUDI2_QUEUE_ID_PDMA_0_0;7358}73597360static void gaudi2_test_queue_clear(struct hl_device *hdev, u32 hw_queue_id)7361{7362u32 sob_offset = gaudi2_test_queue_hw_queue_id_to_sob_id(hdev, hw_queue_id) * 4;7363u32 sob_addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;73647365/* Reset the SOB value */7366WREG32(sob_addr, 0);7367}73687369static int gaudi2_test_queue_send_msg_short(struct hl_device *hdev, u32 hw_queue_id, u32 sob_val,7370struct gaudi2_queues_test_info *msg_info)7371{7372u32 sob_offset = gaudi2_test_queue_hw_queue_id_to_sob_id(hdev, hw_queue_id) * 4;7373u32 tmp, sob_base = 1;7374struct packet_msg_short *msg_short_pkt = msg_info->kern_addr;7375size_t pkt_size = sizeof(struct packet_msg_short);7376int rc;73777378tmp = (PACKET_MSG_SHORT << GAUDI2_PKT_CTL_OPCODE_SHIFT) |7379(1 << GAUDI2_PKT_CTL_EB_SHIFT) |7380(1 << GAUDI2_PKT_CTL_MB_SHIFT) |7381(sob_base << GAUDI2_PKT_SHORT_CTL_BASE_SHIFT) |7382(sob_offset << GAUDI2_PKT_SHORT_CTL_ADDR_SHIFT);73837384msg_short_pkt->value = cpu_to_le32(sob_val);7385msg_short_pkt->ctl = cpu_to_le32(tmp);73867387rc = hl_hw_queue_send_cb_no_cmpl(hdev, hw_queue_id, pkt_size, msg_info->dma_addr);7388if (rc)7389dev_err(hdev->dev,7390"Failed to send msg_short packet to H/W queue %s\n",7391GAUDI2_QUEUE_ID_TO_STR(hw_queue_id));73927393return rc;7394}73957396static int gaudi2_test_queue_wait_completion(struct hl_device *hdev, u32 hw_queue_id, u32 sob_val)7397{7398u32 sob_offset = gaudi2_test_queue_hw_queue_id_to_sob_id(hdev, hw_queue_id) * 4;7399u32 sob_addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;7400u32 timeout_usec, tmp;7401int rc;74027403if (hdev->pldm)7404timeout_usec = GAUDI2_PLDM_TEST_QUEUE_WAIT_USEC;7405else7406timeout_usec = GAUDI2_TEST_QUEUE_WAIT_USEC;74077408rc = hl_poll_timeout(7409hdev,7410sob_addr,7411tmp,7412(tmp == sob_val),74131000,7414timeout_usec);74157416if (rc == -ETIMEDOUT) {7417dev_err(hdev->dev, "H/W queue %s test failed (SOB_OBJ_0 == 0x%x)\n",7418GAUDI2_QUEUE_ID_TO_STR(hw_queue_id), tmp);7419rc = -EIO;7420}74217422return rc;7423}74247425static int gaudi2_test_cpu_queue(struct hl_device *hdev)7426{7427struct gaudi2_device *gaudi2 = hdev->asic_specific;74287429/*7430* check capability here as send_cpu_message() won't update the result7431* value if no capability7432*/7433if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))7434return 0;74357436return hl_fw_test_cpu_queue(hdev);7437}74387439static int gaudi2_test_queues(struct hl_device *hdev)7440{7441struct gaudi2_device *gaudi2 = hdev->asic_specific;7442struct gaudi2_queues_test_info *msg_info;7443u32 sob_val = 0x5a5a;7444int i, rc;74457446/* send test message on all enabled Qs */7447for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ; i++) {7448if (!gaudi2_is_queue_enabled(hdev, i) || gaudi2_is_edma_queue_id(i))7449continue;74507451msg_info = &gaudi2->queues_test_info[i - GAUDI2_QUEUE_ID_PDMA_0_0];7452gaudi2_qman_set_test_mode(hdev, i, true);7453gaudi2_test_queue_clear(hdev, i);7454rc = gaudi2_test_queue_send_msg_short(hdev, i, sob_val, msg_info);7455if (rc)7456goto done;7457}74587459rc = gaudi2_test_cpu_queue(hdev);7460if (rc)7461goto done;74627463/* verify that all messages were processed */7464for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ; i++) {7465if (!gaudi2_is_queue_enabled(hdev, i) || gaudi2_is_edma_queue_id(i))7466continue;74677468rc = gaudi2_test_queue_wait_completion(hdev, i, sob_val);7469if (rc)7470/* chip is not usable, no need for cleanups, just bail-out with error */7471goto done;74727473gaudi2_test_queue_clear(hdev, i);7474gaudi2_qman_set_test_mode(hdev, i, false);7475}74767477done:7478return rc;7479}74807481static int gaudi2_compute_reset_late_init(struct hl_device *hdev)7482{7483struct gaudi2_device *gaudi2 = hdev->asic_specific;7484size_t irq_arr_size;7485int rc;74867487gaudi2_init_arcs(hdev);74887489rc = gaudi2_scrub_arcs_dccm(hdev);7490if (rc) {7491dev_err(hdev->dev, "Failed to scrub arcs DCCM\n");7492return rc;7493}74947495gaudi2_init_security(hdev);74967497/* Unmask all IRQs since some could have been received during the soft reset */7498irq_arr_size = gaudi2->num_of_valid_hw_events * sizeof(gaudi2->hw_events[0]);7499return hl_fw_unmask_irq_arr(hdev, gaudi2->hw_events, irq_arr_size);7500}75017502static bool gaudi2_get_edma_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7503struct engines_data *e)7504{7505u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts, dma_core_sts0, dma_core_sts1;7506struct asic_fixed_properties *prop = &hdev->asic_prop;7507unsigned long *mask = (unsigned long *) mask_arr;7508const char *edma_fmt = "%-6d%-6d%-9s%#-14x%#-15x%#x\n";7509bool is_idle = true, is_eng_idle;7510int engine_idx, i, j;7511u64 offset;75127513if (e)7514hl_engine_data_sprintf(e,7515"\nCORE EDMA is_idle QM_GLBL_STS0 DMA_CORE_STS0 DMA_CORE_STS1\n"7516"---- ---- ------- ------------ ------------- -------------\n");75177518for (i = 0; i < NUM_OF_DCORES; i++) {7519for (j = 0 ; j < NUM_OF_EDMA_PER_DCORE ; j++) {7520int seq = i * NUM_OF_EDMA_PER_DCORE + j;75217522if (!(prop->edma_enabled_mask & BIT(seq)))7523continue;75247525engine_idx = GAUDI2_DCORE0_ENGINE_ID_EDMA_0 +7526i * GAUDI2_ENGINE_ID_DCORE_OFFSET + j;7527offset = i * DCORE_OFFSET + j * DCORE_EDMA_OFFSET;75287529dma_core_sts0 = RREG32(mmDCORE0_EDMA0_CORE_STS0 + offset);7530dma_core_sts1 = RREG32(mmDCORE0_EDMA0_CORE_STS1 + offset);75317532qm_glbl_sts0 = RREG32(mmDCORE0_EDMA0_QM_GLBL_STS0 + offset);7533qm_glbl_sts1 = RREG32(mmDCORE0_EDMA0_QM_GLBL_STS1 + offset);7534qm_cgm_sts = RREG32(mmDCORE0_EDMA0_QM_CGM_STS + offset);75357536is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts) &&7537IS_DMA_IDLE(dma_core_sts0) && !IS_DMA_HALTED(dma_core_sts1);7538is_idle &= is_eng_idle;75397540if (mask && !is_eng_idle)7541set_bit(engine_idx, mask);75427543if (e)7544hl_engine_data_sprintf(e, edma_fmt, i, j, is_eng_idle ? "Y" : "N",7545qm_glbl_sts0, dma_core_sts0, dma_core_sts1);7546}7547}75487549return is_idle;7550}75517552static bool gaudi2_get_pdma_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7553struct engines_data *e)7554{7555u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts, dma_core_sts0, dma_core_sts1;7556unsigned long *mask = (unsigned long *) mask_arr;7557const char *pdma_fmt = "%-6d%-9s%#-14x%#-15x%#x\n";7558bool is_idle = true, is_eng_idle;7559int engine_idx, i;7560u64 offset;75617562if (e)7563hl_engine_data_sprintf(e,7564"\nPDMA is_idle QM_GLBL_STS0 DMA_CORE_STS0 DMA_CORE_STS1\n"7565"---- ------- ------------ ------------- -------------\n");75667567for (i = 0 ; i < NUM_OF_PDMA ; i++) {7568engine_idx = GAUDI2_ENGINE_ID_PDMA_0 + i;7569offset = i * PDMA_OFFSET;7570dma_core_sts0 = RREG32(mmPDMA0_CORE_STS0 + offset);7571dma_core_sts1 = RREG32(mmPDMA0_CORE_STS1 + offset);75727573qm_glbl_sts0 = RREG32(mmPDMA0_QM_GLBL_STS0 + offset);7574qm_glbl_sts1 = RREG32(mmPDMA0_QM_GLBL_STS1 + offset);7575qm_cgm_sts = RREG32(mmPDMA0_QM_CGM_STS + offset);75767577is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts) &&7578IS_DMA_IDLE(dma_core_sts0) && !IS_DMA_HALTED(dma_core_sts1);7579is_idle &= is_eng_idle;75807581if (mask && !is_eng_idle)7582set_bit(engine_idx, mask);75837584if (e)7585hl_engine_data_sprintf(e, pdma_fmt, i, is_eng_idle ? "Y" : "N",7586qm_glbl_sts0, dma_core_sts0, dma_core_sts1);7587}75887589return is_idle;7590}75917592static bool gaudi2_get_nic_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7593struct engines_data *e)7594{7595unsigned long *mask = (unsigned long *) mask_arr;7596const char *nic_fmt = "%-5d%-9s%#-14x%#-12x\n";7597u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts;7598bool is_idle = true, is_eng_idle;7599int engine_idx, i;7600u64 offset = 0;76017602/* NIC, twelve macros in Full chip */7603if (e && hdev->nic_ports_mask)7604hl_engine_data_sprintf(e,7605"\nNIC is_idle QM_GLBL_STS0 QM_CGM_STS\n"7606"--- ------- ------------ ----------\n");76077608for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++) {7609if (!(i & 1))7610offset = i / 2 * NIC_OFFSET;7611else7612offset += NIC_QM_OFFSET;76137614if (!(hdev->nic_ports_mask & BIT(i)))7615continue;76167617engine_idx = GAUDI2_ENGINE_ID_NIC0_0 + i;761876197620qm_glbl_sts0 = RREG32(mmNIC0_QM0_GLBL_STS0 + offset);7621qm_glbl_sts1 = RREG32(mmNIC0_QM0_GLBL_STS1 + offset);7622qm_cgm_sts = RREG32(mmNIC0_QM0_CGM_STS + offset);76237624is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts);7625is_idle &= is_eng_idle;76267627if (mask && !is_eng_idle)7628set_bit(engine_idx, mask);76297630if (e)7631hl_engine_data_sprintf(e, nic_fmt, i, is_eng_idle ? "Y" : "N",7632qm_glbl_sts0, qm_cgm_sts);7633}76347635return is_idle;7636}76377638static bool gaudi2_get_mme_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7639struct engines_data *e)7640{7641u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts, mme_arch_sts;7642unsigned long *mask = (unsigned long *) mask_arr;7643const char *mme_fmt = "%-5d%-6s%-9s%#-14x%#x\n";7644bool is_idle = true, is_eng_idle;7645int engine_idx, i;7646u64 offset;76477648if (e)7649hl_engine_data_sprintf(e,7650"\nMME Stub is_idle QM_GLBL_STS0 MME_ARCH_STATUS\n"7651"--- ---- ------- ------------ ---------------\n");7652/* MME, one per Dcore */7653for (i = 0 ; i < NUM_OF_DCORES ; i++) {7654engine_idx = GAUDI2_DCORE0_ENGINE_ID_MME + i * GAUDI2_ENGINE_ID_DCORE_OFFSET;7655offset = i * DCORE_OFFSET;76567657qm_glbl_sts0 = RREG32(mmDCORE0_MME_QM_GLBL_STS0 + offset);7658qm_glbl_sts1 = RREG32(mmDCORE0_MME_QM_GLBL_STS1 + offset);7659qm_cgm_sts = RREG32(mmDCORE0_MME_QM_CGM_STS + offset);76607661is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts);7662is_idle &= is_eng_idle;76637664mme_arch_sts = RREG32(mmDCORE0_MME_CTRL_LO_ARCH_STATUS + offset);7665is_eng_idle &= IS_MME_IDLE(mme_arch_sts);7666is_idle &= is_eng_idle;76677668if (e)7669hl_engine_data_sprintf(e, mme_fmt, i, "N",7670is_eng_idle ? "Y" : "N",7671qm_glbl_sts0,7672mme_arch_sts);76737674if (mask && !is_eng_idle)7675set_bit(engine_idx, mask);7676}76777678return is_idle;7679}76807681static void gaudi2_is_tpc_engine_idle(struct hl_device *hdev, int dcore, int inst, u32 offset,7682struct iterate_module_ctx *ctx)7683{7684struct gaudi2_tpc_idle_data *idle_data = ctx->data;7685u32 tpc_cfg_sts, qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts;7686bool is_eng_idle;7687int engine_idx;76887689if ((dcore == 0) && (inst == (NUM_DCORE0_TPC - 1)))7690engine_idx = GAUDI2_DCORE0_ENGINE_ID_TPC_6;7691else7692engine_idx = GAUDI2_DCORE0_ENGINE_ID_TPC_0 +7693dcore * GAUDI2_ENGINE_ID_DCORE_OFFSET + inst;76947695tpc_cfg_sts = RREG32(mmDCORE0_TPC0_CFG_STATUS + offset);7696qm_glbl_sts0 = RREG32(mmDCORE0_TPC0_QM_GLBL_STS0 + offset);7697qm_glbl_sts1 = RREG32(mmDCORE0_TPC0_QM_GLBL_STS1 + offset);7698qm_cgm_sts = RREG32(mmDCORE0_TPC0_QM_CGM_STS + offset);76997700is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts) &&7701IS_TPC_IDLE(tpc_cfg_sts);7702*(idle_data->is_idle) &= is_eng_idle;77037704if (idle_data->mask && !is_eng_idle)7705set_bit(engine_idx, idle_data->mask);77067707if (idle_data->e)7708hl_engine_data_sprintf(idle_data->e,7709idle_data->tpc_fmt, dcore, inst,7710is_eng_idle ? "Y" : "N",7711qm_glbl_sts0, qm_cgm_sts, tpc_cfg_sts);7712}77137714static bool gaudi2_get_tpc_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7715struct engines_data *e)7716{7717struct asic_fixed_properties *prop = &hdev->asic_prop;7718unsigned long *mask = (unsigned long *) mask_arr;7719bool is_idle = true;77207721struct gaudi2_tpc_idle_data tpc_idle_data = {7722.tpc_fmt = "%-6d%-5d%-9s%#-14x%#-12x%#x\n",7723.e = e,7724.mask = mask,7725.is_idle = &is_idle,7726};7727struct iterate_module_ctx tpc_iter = {7728.fn = &gaudi2_is_tpc_engine_idle,7729.data = &tpc_idle_data,7730};77317732if (e && prop->tpc_enabled_mask)7733hl_engine_data_sprintf(e,7734"\nCORE TPC is_idle QM_GLBL_STS0 QM_CGM_STS STATUS\n"7735"---- --- ------- ------------ ---------- ------\n");77367737gaudi2_iterate_tpcs(hdev, &tpc_iter);77387739return *tpc_idle_data.is_idle;7740}77417742static bool gaudi2_get_decoder_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7743struct engines_data *e)7744{7745struct asic_fixed_properties *prop = &hdev->asic_prop;7746unsigned long *mask = (unsigned long *) mask_arr;7747const char *pcie_dec_fmt = "%-10d%-9s%#x\n";7748const char *dec_fmt = "%-6d%-5d%-9s%#x\n";7749bool is_idle = true, is_eng_idle;7750u32 dec_swreg15, dec_enabled_bit;7751int engine_idx, i, j;7752u64 offset;77537754/* Decoders, two each Dcore and two shared PCIe decoders */7755if (e && (prop->decoder_enabled_mask & (~PCIE_DEC_EN_MASK)))7756hl_engine_data_sprintf(e,7757"\nCORE DEC is_idle VSI_CMD_SWREG15\n"7758"---- --- ------- ---------------\n");77597760for (i = 0 ; i < NUM_OF_DCORES ; i++) {7761for (j = 0 ; j < NUM_OF_DEC_PER_DCORE ; j++) {7762dec_enabled_bit = 1 << (i * NUM_OF_DEC_PER_DCORE + j);7763if (!(prop->decoder_enabled_mask & dec_enabled_bit))7764continue;77657766engine_idx = GAUDI2_DCORE0_ENGINE_ID_DEC_0 +7767i * GAUDI2_ENGINE_ID_DCORE_OFFSET + j;7768offset = i * DCORE_OFFSET + j * DCORE_DEC_OFFSET;77697770dec_swreg15 = RREG32(mmDCORE0_DEC0_CMD_SWREG15 + offset);7771is_eng_idle = IS_DEC_IDLE(dec_swreg15);7772is_idle &= is_eng_idle;77737774if (mask && !is_eng_idle)7775set_bit(engine_idx, mask);77767777if (e)7778hl_engine_data_sprintf(e, dec_fmt, i, j,7779is_eng_idle ? "Y" : "N", dec_swreg15);7780}7781}77827783if (e && (prop->decoder_enabled_mask & PCIE_DEC_EN_MASK))7784hl_engine_data_sprintf(e,7785"\nPCIe DEC is_idle VSI_CMD_SWREG15\n"7786"-------- ------- ---------------\n");77877788/* Check shared(PCIe) decoders */7789for (i = 0 ; i < NUM_OF_DEC_PER_DCORE ; i++) {7790dec_enabled_bit = PCIE_DEC_SHIFT + i;7791if (!(prop->decoder_enabled_mask & BIT(dec_enabled_bit)))7792continue;77937794engine_idx = GAUDI2_PCIE_ENGINE_ID_DEC_0 + i;7795offset = i * DCORE_DEC_OFFSET;7796dec_swreg15 = RREG32(mmPCIE_DEC0_CMD_SWREG15 + offset);7797is_eng_idle = IS_DEC_IDLE(dec_swreg15);7798is_idle &= is_eng_idle;77997800if (mask && !is_eng_idle)7801set_bit(engine_idx, mask);78027803if (e)7804hl_engine_data_sprintf(e, pcie_dec_fmt, i,7805is_eng_idle ? "Y" : "N", dec_swreg15);7806}78077808return is_idle;7809}78107811static bool gaudi2_get_rotator_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7812struct engines_data *e)7813{7814const char *rot_fmt = "%-6d%-5d%-9s%#-14x%#-14x%#x\n";7815unsigned long *mask = (unsigned long *) mask_arr;7816u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts;7817bool is_idle = true, is_eng_idle;7818int engine_idx, i;7819u64 offset;78207821if (e)7822hl_engine_data_sprintf(e,7823"\nCORE ROT is_idle QM_GLBL_STS0 QM_GLBL_STS1 QM_CGM_STS\n"7824"---- --- ------- ------------ ------------ ----------\n");78257826for (i = 0 ; i < NUM_OF_ROT ; i++) {7827engine_idx = GAUDI2_ENGINE_ID_ROT_0 + i;78287829offset = i * ROT_OFFSET;78307831qm_glbl_sts0 = RREG32(mmROT0_QM_GLBL_STS0 + offset);7832qm_glbl_sts1 = RREG32(mmROT0_QM_GLBL_STS1 + offset);7833qm_cgm_sts = RREG32(mmROT0_QM_CGM_STS + offset);78347835is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts);7836is_idle &= is_eng_idle;78377838if (mask && !is_eng_idle)7839set_bit(engine_idx, mask);78407841if (e)7842hl_engine_data_sprintf(e, rot_fmt, i, 0, is_eng_idle ? "Y" : "N",7843qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts);7844}78457846return is_idle;7847}78487849static bool gaudi2_is_device_idle(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7850struct engines_data *e)7851{7852bool is_idle = true;78537854is_idle &= gaudi2_get_edma_idle_status(hdev, mask_arr, mask_len, e);7855is_idle &= gaudi2_get_pdma_idle_status(hdev, mask_arr, mask_len, e);7856is_idle &= gaudi2_get_nic_idle_status(hdev, mask_arr, mask_len, e);7857is_idle &= gaudi2_get_mme_idle_status(hdev, mask_arr, mask_len, e);7858is_idle &= gaudi2_get_tpc_idle_status(hdev, mask_arr, mask_len, e);7859is_idle &= gaudi2_get_decoder_idle_status(hdev, mask_arr, mask_len, e);7860is_idle &= gaudi2_get_rotator_idle_status(hdev, mask_arr, mask_len, e);78617862return is_idle;7863}78647865static void gaudi2_hw_queues_lock(struct hl_device *hdev)7866__acquires(&gaudi2->hw_queues_lock)7867{7868struct gaudi2_device *gaudi2 = hdev->asic_specific;78697870spin_lock(&gaudi2->hw_queues_lock);7871}78727873static void gaudi2_hw_queues_unlock(struct hl_device *hdev)7874__releases(&gaudi2->hw_queues_lock)7875{7876struct gaudi2_device *gaudi2 = hdev->asic_specific;78777878spin_unlock(&gaudi2->hw_queues_lock);7879}78807881static u32 gaudi2_get_pci_id(struct hl_device *hdev)7882{7883return hdev->pdev->device;7884}78857886static int gaudi2_get_eeprom_data(struct hl_device *hdev, void *data, size_t max_size)7887{7888struct gaudi2_device *gaudi2 = hdev->asic_specific;78897890if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))7891return 0;78927893return hl_fw_get_eeprom_data(hdev, data, max_size);7894}78957896static void gaudi2_update_eq_ci(struct hl_device *hdev, u32 val)7897{7898WREG32(mmCPU_IF_EQ_RD_OFFS, val);7899}79007901static void *gaudi2_get_events_stat(struct hl_device *hdev, bool aggregate, u32 *size)7902{7903struct gaudi2_device *gaudi2 = hdev->asic_specific;79047905if (aggregate) {7906*size = (u32) sizeof(gaudi2->events_stat_aggregate);7907return gaudi2->events_stat_aggregate;7908}79097910*size = (u32) sizeof(gaudi2->events_stat);7911return gaudi2->events_stat;7912}79137914static void gaudi2_mmu_vdec_dcore_prepare(struct hl_device *hdev, int dcore_id,7915int dcore_vdec_id, u32 rw_asid, u32 rw_mmu_bp)7916{7917u32 offset = (mmDCORE0_VDEC1_BRDG_CTRL_BASE - mmDCORE0_VDEC0_BRDG_CTRL_BASE) *7918dcore_vdec_id + DCORE_OFFSET * dcore_id;79197920WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_MMU_BP + offset, rw_mmu_bp);7921WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_ASID + offset, rw_asid);79227923WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_MMU_BP + offset, rw_mmu_bp);7924WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_ASID + offset, rw_asid);79257926WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_MMU_BP + offset, rw_mmu_bp);7927WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_ASID + offset, rw_asid);79287929WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_MMU_BP + offset, rw_mmu_bp);7930WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_ASID + offset, rw_asid);79317932WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_MMU_BP + offset, rw_mmu_bp);7933WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_ASID + offset, rw_asid);7934}79357936static void gaudi2_mmu_dcore_prepare(struct hl_device *hdev, int dcore_id, u32 asid)7937{7938u32 rw_asid = (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_SHIFT) |7939(asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_SHIFT);7940struct asic_fixed_properties *prop = &hdev->asic_prop;7941u32 dcore_offset = dcore_id * DCORE_OFFSET;7942u32 vdec_id, i, ports_offset, reg_val;7943u8 edma_seq_base;79447945/* EDMA */7946edma_seq_base = dcore_id * NUM_OF_EDMA_PER_DCORE;7947if (prop->edma_enabled_mask & BIT(edma_seq_base)) {7948WREG32(mmDCORE0_EDMA0_QM_AXUSER_NONSECURED_HB_MMU_BP + dcore_offset, 0);7949WREG32(mmDCORE0_EDMA0_QM_AXUSER_NONSECURED_HB_ASID + dcore_offset, rw_asid);7950WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP + dcore_offset, 0);7951WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_ASID + dcore_offset, rw_asid);7952}79537954if (prop->edma_enabled_mask & BIT(edma_seq_base + 1)) {7955WREG32(mmDCORE0_EDMA1_QM_AXUSER_NONSECURED_HB_MMU_BP + dcore_offset, 0);7956WREG32(mmDCORE0_EDMA1_QM_AXUSER_NONSECURED_HB_ASID + dcore_offset, rw_asid);7957WREG32(mmDCORE0_EDMA1_CORE_CTX_AXUSER_HB_ASID + dcore_offset, rw_asid);7958WREG32(mmDCORE0_EDMA1_CORE_CTX_AXUSER_HB_MMU_BP + dcore_offset, 0);7959}79607961/* Sync Mngr */7962WREG32(mmDCORE0_SYNC_MNGR_GLBL_ASID_NONE_SEC_PRIV + dcore_offset, asid);7963/*7964* Sync Mngrs on dcores 1 - 3 are exposed to user, so must use user ASID7965* for any access type7966*/7967if (dcore_id > 0) {7968reg_val = (asid << DCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_ASID_RD_SHIFT) |7969(asid << DCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_ASID_WR_SHIFT);7970WREG32(mmDCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_ASID + dcore_offset, reg_val);7971WREG32(mmDCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_MMU_BP + dcore_offset, 0);7972}79737974WREG32(mmDCORE0_MME_CTRL_LO_MME_AXUSER_HB_MMU_BP + dcore_offset, 0);7975WREG32(mmDCORE0_MME_CTRL_LO_MME_AXUSER_HB_ASID + dcore_offset, rw_asid);79767977for (i = 0 ; i < NUM_OF_MME_SBTE_PORTS ; i++) {7978ports_offset = i * DCORE_MME_SBTE_OFFSET;7979WREG32(mmDCORE0_MME_SBTE0_MSTR_IF_AXUSER_HB_MMU_BP +7980dcore_offset + ports_offset, 0);7981WREG32(mmDCORE0_MME_SBTE0_MSTR_IF_AXUSER_HB_ASID +7982dcore_offset + ports_offset, rw_asid);7983}79847985for (i = 0 ; i < NUM_OF_MME_WB_PORTS ; i++) {7986ports_offset = i * DCORE_MME_WB_OFFSET;7987WREG32(mmDCORE0_MME_WB0_MSTR_IF_AXUSER_HB_MMU_BP +7988dcore_offset + ports_offset, 0);7989WREG32(mmDCORE0_MME_WB0_MSTR_IF_AXUSER_HB_ASID +7990dcore_offset + ports_offset, rw_asid);7991}79927993WREG32(mmDCORE0_MME_QM_AXUSER_NONSECURED_HB_MMU_BP + dcore_offset, 0);7994WREG32(mmDCORE0_MME_QM_AXUSER_NONSECURED_HB_ASID + dcore_offset, rw_asid);79957996/*7997* Decoders7998*/7999for (vdec_id = 0 ; vdec_id < NUM_OF_DEC_PER_DCORE ; vdec_id++) {8000if (prop->decoder_enabled_mask & BIT(dcore_id * NUM_OF_DEC_PER_DCORE + vdec_id))8001gaudi2_mmu_vdec_dcore_prepare(hdev, dcore_id, vdec_id, rw_asid, 0);8002}8003}80048005static void gudi2_mmu_vdec_shared_prepare(struct hl_device *hdev,8006int shared_vdec_id, u32 rw_asid, u32 rw_mmu_bp)8007{8008u32 offset = (mmPCIE_VDEC1_BRDG_CTRL_BASE - mmPCIE_VDEC0_BRDG_CTRL_BASE) * shared_vdec_id;80098010WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_MMU_BP + offset, rw_mmu_bp);8011WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_ASID + offset, rw_asid);80128013WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_MMU_BP + offset, rw_mmu_bp);8014WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_ASID + offset, rw_asid);80158016WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_MMU_BP + offset, rw_mmu_bp);8017WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_ASID + offset, rw_asid);80188019WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_MMU_BP + offset, rw_mmu_bp);8020WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_ASID + offset, rw_asid);80218022WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_MMU_BP + offset, rw_mmu_bp);8023WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_ASID + offset, rw_asid);8024}80258026static void gudi2_mmu_arc_farm_arc_dup_eng_prepare(struct hl_device *hdev, int arc_farm_id,8027u32 rw_asid, u32 rw_mmu_bp)8028{8029u32 offset = (mmARC_FARM_ARC1_DUP_ENG_BASE - mmARC_FARM_ARC0_DUP_ENG_BASE) * arc_farm_id;80308031WREG32(mmARC_FARM_ARC0_DUP_ENG_AXUSER_HB_MMU_BP + offset, rw_mmu_bp);8032WREG32(mmARC_FARM_ARC0_DUP_ENG_AXUSER_HB_ASID + offset, rw_asid);8033}80348035static void gaudi2_arc_mmu_prepare(struct hl_device *hdev, u32 cpu_id, u32 asid)8036{8037u32 reg_base, reg_offset, reg_val = 0;80388039reg_base = gaudi2_arc_blocks_bases[cpu_id];80408041/* Enable MMU and configure asid for all relevant ARC regions */8042reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_ARC_REGION_CFG_MMU_BP_MASK, 0);8043reg_val |= FIELD_PREP(ARC_FARM_ARC0_AUX_ARC_REGION_CFG_0_ASID_MASK, asid);80448045reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION3_GENERAL);8046WREG32(reg_base + reg_offset, reg_val);80478048reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION4_HBM0_FW);8049WREG32(reg_base + reg_offset, reg_val);80508051reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION5_HBM1_GC_DATA);8052WREG32(reg_base + reg_offset, reg_val);80538054reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION6_HBM2_GC_DATA);8055WREG32(reg_base + reg_offset, reg_val);80568057reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION7_HBM3_GC_DATA);8058WREG32(reg_base + reg_offset, reg_val);80598060reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION9_PCIE);8061WREG32(reg_base + reg_offset, reg_val);80628063reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION10_GENERAL);8064WREG32(reg_base + reg_offset, reg_val);80658066reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION11_GENERAL);8067WREG32(reg_base + reg_offset, reg_val);80688069reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION12_GENERAL);8070WREG32(reg_base + reg_offset, reg_val);80718072reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION13_GENERAL);8073WREG32(reg_base + reg_offset, reg_val);80748075reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION14_GENERAL);8076WREG32(reg_base + reg_offset, reg_val);8077}80788079static int gaudi2_arc_mmu_prepare_all(struct hl_device *hdev, u32 asid)8080{8081int i;80828083if (hdev->fw_components & FW_TYPE_BOOT_CPU)8084return hl_fw_cpucp_engine_core_asid_set(hdev, asid);80858086for (i = CPU_ID_SCHED_ARC0 ; i < NUM_OF_ARC_FARMS_ARC ; i++)8087gaudi2_arc_mmu_prepare(hdev, i, asid);80888089for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ ; i += 4) {8090if (!gaudi2_is_queue_enabled(hdev, i))8091continue;80928093gaudi2_arc_mmu_prepare(hdev, gaudi2_queue_id_to_arc_id[i], asid);8094}80958096return 0;8097}80988099static int gaudi2_mmu_shared_prepare(struct hl_device *hdev, u32 asid)8100{8101struct asic_fixed_properties *prop = &hdev->asic_prop;8102u32 rw_asid, offset;8103int rc, i;81048105rw_asid = FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_MASK, asid) |8106FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_MASK, asid);81078108WREG32(mmPDMA0_QM_AXUSER_NONSECURED_HB_ASID, rw_asid);8109WREG32(mmPDMA0_QM_AXUSER_NONSECURED_HB_MMU_BP, 0);8110WREG32(mmPDMA0_CORE_CTX_AXUSER_HB_ASID, rw_asid);8111WREG32(mmPDMA0_CORE_CTX_AXUSER_HB_MMU_BP, 0);81128113WREG32(mmPDMA1_QM_AXUSER_NONSECURED_HB_ASID, rw_asid);8114WREG32(mmPDMA1_QM_AXUSER_NONSECURED_HB_MMU_BP, 0);8115WREG32(mmPDMA1_CORE_CTX_AXUSER_HB_ASID, rw_asid);8116WREG32(mmPDMA1_CORE_CTX_AXUSER_HB_MMU_BP, 0);81178118/* ROT */8119for (i = 0 ; i < NUM_OF_ROT ; i++) {8120offset = i * ROT_OFFSET;8121WREG32(mmROT0_QM_AXUSER_NONSECURED_HB_ASID + offset, rw_asid);8122WREG32(mmROT0_QM_AXUSER_NONSECURED_HB_MMU_BP + offset, 0);8123RMWREG32(mmROT0_CPL_QUEUE_AWUSER + offset, asid, MMUBP_ASID_MASK);8124RMWREG32(mmROT0_DESC_HBW_ARUSER_LO + offset, asid, MMUBP_ASID_MASK);8125RMWREG32(mmROT0_DESC_HBW_AWUSER_LO + offset, asid, MMUBP_ASID_MASK);8126}81278128/* Shared Decoders are the last bits in the decoders mask */8129if (prop->decoder_enabled_mask & BIT(NUM_OF_DCORES * NUM_OF_DEC_PER_DCORE + 0))8130gudi2_mmu_vdec_shared_prepare(hdev, 0, rw_asid, 0);81318132if (prop->decoder_enabled_mask & BIT(NUM_OF_DCORES * NUM_OF_DEC_PER_DCORE + 1))8133gudi2_mmu_vdec_shared_prepare(hdev, 1, rw_asid, 0);81348135/* arc farm arc dup eng */8136for (i = 0 ; i < NUM_OF_ARC_FARMS_ARC ; i++)8137gudi2_mmu_arc_farm_arc_dup_eng_prepare(hdev, i, rw_asid, 0);81388139rc = gaudi2_arc_mmu_prepare_all(hdev, asid);8140if (rc)8141return rc;81428143return 0;8144}81458146static void gaudi2_tpc_mmu_prepare(struct hl_device *hdev, int dcore, int inst, u32 offset,8147struct iterate_module_ctx *ctx)8148{8149struct gaudi2_tpc_mmu_data *mmu_data = ctx->data;81508151WREG32(mmDCORE0_TPC0_CFG_AXUSER_HB_MMU_BP + offset, 0);8152WREG32(mmDCORE0_TPC0_CFG_AXUSER_HB_ASID + offset, mmu_data->rw_asid);8153WREG32(mmDCORE0_TPC0_QM_AXUSER_NONSECURED_HB_MMU_BP + offset, 0);8154WREG32(mmDCORE0_TPC0_QM_AXUSER_NONSECURED_HB_ASID + offset, mmu_data->rw_asid);8155}81568157/* zero the MMUBP and set the ASID */8158static int gaudi2_mmu_prepare(struct hl_device *hdev, u32 asid)8159{8160struct gaudi2_device *gaudi2 = hdev->asic_specific;8161struct gaudi2_tpc_mmu_data tpc_mmu_data;8162struct iterate_module_ctx tpc_iter = {8163.fn = &gaudi2_tpc_mmu_prepare,8164.data = &tpc_mmu_data,8165};8166int rc, i;81678168if (asid & ~DCORE0_HMMU0_STLB_ASID_ASID_MASK) {8169dev_crit(hdev->dev, "asid %u is too big\n", asid);8170return -EINVAL;8171}81728173if (!(gaudi2->hw_cap_initialized & HW_CAP_MMU_MASK))8174return 0;81758176rc = gaudi2_mmu_shared_prepare(hdev, asid);8177if (rc)8178return rc;81798180/* configure DCORE MMUs */8181tpc_mmu_data.rw_asid = (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_SHIFT) |8182(asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_SHIFT);8183gaudi2_iterate_tpcs(hdev, &tpc_iter);8184for (i = 0 ; i < NUM_OF_DCORES ; i++)8185gaudi2_mmu_dcore_prepare(hdev, i, asid);81868187return 0;8188}81898190static inline bool is_info_event(u32 event)8191{8192switch (event) {8193case GAUDI2_EVENT_CPU_CPLD_SHUTDOWN_CAUSE:8194case GAUDI2_EVENT_CPU_FIX_POWER_ENV_S ... GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_E:8195case GAUDI2_EVENT_ARC_PWR_BRK_ENTRY ... GAUDI2_EVENT_ARC_PWR_RD_MODE3:81968197/* return in case of NIC status event - these events are received periodically and not as8198* an indication to an error.8199*/8200case GAUDI2_EVENT_CPU0_STATUS_NIC0_ENG0 ... GAUDI2_EVENT_CPU11_STATUS_NIC11_ENG1:8201case GAUDI2_EVENT_ARC_EQ_HEARTBEAT:8202return true;8203default:8204return false;8205}8206}82078208static void gaudi2_print_event(struct hl_device *hdev, u16 event_type,8209bool ratelimited, const char *fmt, ...)8210{8211struct va_format vaf;8212va_list args;82138214va_start(args, fmt);8215vaf.fmt = fmt;8216vaf.va = &args;82178218if (ratelimited)8219dev_err_ratelimited(hdev->dev, "%s: %pV\n",8220gaudi2_irq_map_table[event_type].valid ?8221gaudi2_irq_map_table[event_type].name : "N/A Event", &vaf);8222else8223dev_err(hdev->dev, "%s: %pV\n",8224gaudi2_irq_map_table[event_type].valid ?8225gaudi2_irq_map_table[event_type].name : "N/A Event", &vaf);82268227va_end(args);8228}82298230static bool gaudi2_handle_ecc_event(struct hl_device *hdev, u16 event_type,8231struct hl_eq_ecc_data *ecc_data)8232{8233u64 ecc_address = 0, ecc_syndrome = 0;8234u8 memory_wrapper_idx = 0;8235bool has_block_id = false;8236u16 block_id;82378238if (hl_fw_version_cmp(hdev, 1, 12, 0) >= 0)8239has_block_id = true;82408241ecc_address = le64_to_cpu(ecc_data->ecc_address);8242ecc_syndrome = le64_to_cpu(ecc_data->ecc_syndrom);8243memory_wrapper_idx = ecc_data->memory_wrapper_idx;82448245if (has_block_id) {8246block_id = le16_to_cpu(ecc_data->block_id);8247gaudi2_print_event(hdev, event_type, !ecc_data->is_critical,8248"ECC error detected. address: %#llx. Syndrome: %#llx. wrapper id %u. block id %#x. critical %u.",8249ecc_address, ecc_syndrome, memory_wrapper_idx, block_id,8250ecc_data->is_critical);8251} else {8252gaudi2_print_event(hdev, event_type, !ecc_data->is_critical,8253"ECC error detected. address: %#llx. Syndrome: %#llx. wrapper id %u. critical %u.",8254ecc_address, ecc_syndrome, memory_wrapper_idx, ecc_data->is_critical);8255}82568257return !!ecc_data->is_critical;8258}82598260static void handle_lower_qman_data_on_err(struct hl_device *hdev, u64 qman_base, u32 engine_id)8261{8262struct undefined_opcode_info *undef_opcode = &hdev->captured_err_info.undef_opcode;8263u64 cq_ptr, cp_current_inst;8264u32 lo, hi, cq_size, cp_sts;8265bool is_arc_cq;82668267cp_sts = RREG32(qman_base + QM_CP_STS_4_OFFSET);8268is_arc_cq = FIELD_GET(PDMA0_QM_CP_STS_CUR_CQ_MASK, cp_sts); /* 0 - legacy CQ, 1 - ARC_CQ */82698270if (is_arc_cq) {8271lo = RREG32(qman_base + QM_ARC_CQ_PTR_LO_STS_OFFSET);8272hi = RREG32(qman_base + QM_ARC_CQ_PTR_HI_STS_OFFSET);8273cq_ptr = ((u64) hi) << 32 | lo;8274cq_size = RREG32(qman_base + QM_ARC_CQ_TSIZE_STS_OFFSET);8275} else {8276lo = RREG32(qman_base + QM_CQ_PTR_LO_STS_4_OFFSET);8277hi = RREG32(qman_base + QM_CQ_PTR_HI_STS_4_OFFSET);8278cq_ptr = ((u64) hi) << 32 | lo;8279cq_size = RREG32(qman_base + QM_CQ_TSIZE_STS_4_OFFSET);8280}82818282lo = RREG32(qman_base + QM_CP_CURRENT_INST_LO_4_OFFSET);8283hi = RREG32(qman_base + QM_CP_CURRENT_INST_HI_4_OFFSET);8284cp_current_inst = ((u64) hi) << 32 | lo;82858286dev_info(hdev->dev,8287"LowerQM. %sCQ: {ptr %#llx, size %u}, CP: {instruction %#018llx}\n",8288is_arc_cq ? "ARC_" : "", cq_ptr, cq_size, cp_current_inst);82898290if (undef_opcode->write_enable) {8291memset(undef_opcode, 0, sizeof(*undef_opcode));8292undef_opcode->timestamp = ktime_get();8293undef_opcode->cq_addr = cq_ptr;8294undef_opcode->cq_size = cq_size;8295undef_opcode->engine_id = engine_id;8296undef_opcode->stream_id = QMAN_STREAMS;8297undef_opcode->write_enable = 0;8298}8299}83008301static int gaudi2_handle_qman_err_generic(struct hl_device *hdev, u16 event_type,8302u64 qman_base, u32 qid_base, u64 *event_mask)8303{8304u32 i, j, glbl_sts_val, arb_err_val, num_error_causes, error_count = 0;8305u64 glbl_sts_addr, arb_err_addr;8306char reg_desc[32];83078308glbl_sts_addr = qman_base + (mmDCORE0_TPC0_QM_GLBL_ERR_STS_0 - mmDCORE0_TPC0_QM_BASE);8309arb_err_addr = qman_base + (mmDCORE0_TPC0_QM_ARB_ERR_CAUSE - mmDCORE0_TPC0_QM_BASE);83108311/* Iterate through all stream GLBL_ERR_STS registers + Lower CP */8312for (i = 0 ; i < QMAN_STREAMS + 1 ; i++) {8313glbl_sts_val = RREG32(glbl_sts_addr + 4 * i);83148315if (!glbl_sts_val)8316continue;83178318if (i == QMAN_STREAMS) {8319snprintf(reg_desc, ARRAY_SIZE(reg_desc), "LowerQM");8320num_error_causes = GAUDI2_NUM_OF_LOWER_QM_ERR_CAUSE;8321} else {8322snprintf(reg_desc, ARRAY_SIZE(reg_desc), "stream%u", i);8323num_error_causes = GAUDI2_NUM_OF_QM_ERR_CAUSE;8324}83258326for (j = 0 ; j < num_error_causes ; j++)8327if (glbl_sts_val & BIT(j)) {8328gaudi2_print_event(hdev, event_type, true,8329"%s. err cause: %s", reg_desc,8330i == QMAN_STREAMS ?8331gaudi2_lower_qman_error_cause[j] :8332gaudi2_qman_error_cause[j]);8333error_count++;8334}83358336/* Check for undefined opcode error in lower QM */8337if ((i == QMAN_STREAMS) &&8338(glbl_sts_val & PDMA0_QM_GLBL_ERR_STS_CP_UNDEF_CMD_ERR_MASK)) {8339handle_lower_qman_data_on_err(hdev, qman_base,8340gaudi2_queue_id_to_engine_id[qid_base]);8341*event_mask |= HL_NOTIFIER_EVENT_UNDEFINED_OPCODE;8342}8343}83448345arb_err_val = RREG32(arb_err_addr);83468347if (!arb_err_val)8348goto out;83498350for (j = 0 ; j < GAUDI2_NUM_OF_QM_ARB_ERR_CAUSE ; j++) {8351if (arb_err_val & BIT(j)) {8352gaudi2_print_event(hdev, event_type, true,8353"ARB_ERR. err cause: %s",8354gaudi2_qman_arb_error_cause[j]);8355error_count++;8356}8357}83588359out:8360return error_count;8361}83628363static void gaudi2_razwi_rr_hbw_shared_printf_info(struct hl_device *hdev,8364u64 rtr_mstr_if_base_addr, bool is_write, char *name,8365enum gaudi2_engine_id id, u64 *event_mask)8366{8367u32 razwi_hi, razwi_lo, razwi_xy;8368u16 eng_id = id;8369u8 rd_wr_flag;83708371if (is_write) {8372razwi_hi = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_HI);8373razwi_lo = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_LO);8374razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_XY);8375rd_wr_flag = HL_RAZWI_WRITE;8376} else {8377razwi_hi = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_HI);8378razwi_lo = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_LO);8379razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_XY);8380rd_wr_flag = HL_RAZWI_READ;8381}83828383hl_handle_razwi(hdev, (u64)razwi_hi << 32 | razwi_lo, &eng_id, 1,8384rd_wr_flag | HL_RAZWI_HBW, event_mask);83858386dev_err_ratelimited(hdev->dev,8387"%s-RAZWI SHARED RR HBW %s error, address %#llx, Initiator coordinates 0x%x\n",8388name, is_write ? "WR" : "RD", (u64)razwi_hi << 32 | razwi_lo, razwi_xy);8389}83908391static void gaudi2_razwi_rr_lbw_shared_printf_info(struct hl_device *hdev,8392u64 rtr_mstr_if_base_addr, bool is_write, char *name,8393enum gaudi2_engine_id id, u64 *event_mask)8394{8395u64 razwi_addr = CFG_BASE;8396u32 razwi_xy;8397u16 eng_id = id;8398u8 rd_wr_flag;83998400if (is_write) {8401razwi_addr += RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI);8402razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI_XY);8403rd_wr_flag = HL_RAZWI_WRITE;8404} else {8405razwi_addr += RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI);8406razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI_XY);8407rd_wr_flag = HL_RAZWI_READ;8408}84098410hl_handle_razwi(hdev, razwi_addr, &eng_id, 1, rd_wr_flag | HL_RAZWI_LBW, event_mask);8411dev_err_ratelimited(hdev->dev,8412"%s-RAZWI SHARED RR LBW %s error, mstr_if 0x%llx, captured address 0x%llX Initiator coordinates 0x%x\n",8413name, is_write ? "WR" : "RD", rtr_mstr_if_base_addr, razwi_addr,8414razwi_xy);8415}84168417static enum gaudi2_engine_id gaudi2_razwi_calc_engine_id(struct hl_device *hdev,8418enum razwi_event_sources module, u8 module_idx)8419{8420switch (module) {8421case RAZWI_TPC:8422if (module_idx == (NUM_OF_TPC_PER_DCORE * NUM_OF_DCORES))8423return GAUDI2_DCORE0_ENGINE_ID_TPC_6;8424return (((module_idx / NUM_OF_TPC_PER_DCORE) * ENGINE_ID_DCORE_OFFSET) +8425(module_idx % NUM_OF_TPC_PER_DCORE) +8426(GAUDI2_DCORE0_ENGINE_ID_TPC_0 - GAUDI2_DCORE0_ENGINE_ID_EDMA_0));84278428case RAZWI_MME:8429return ((GAUDI2_DCORE0_ENGINE_ID_MME - GAUDI2_DCORE0_ENGINE_ID_EDMA_0) +8430(module_idx * ENGINE_ID_DCORE_OFFSET));84318432case RAZWI_EDMA:8433return (((module_idx / NUM_OF_EDMA_PER_DCORE) * ENGINE_ID_DCORE_OFFSET) +8434(module_idx % NUM_OF_EDMA_PER_DCORE));84358436case RAZWI_PDMA:8437return (GAUDI2_ENGINE_ID_PDMA_0 + module_idx);84388439case RAZWI_NIC:8440return (GAUDI2_ENGINE_ID_NIC0_0 + (NIC_NUMBER_OF_QM_PER_MACRO * module_idx));84418442case RAZWI_DEC:8443if (module_idx == 8)8444return GAUDI2_PCIE_ENGINE_ID_DEC_0;84458446if (module_idx == 9)8447return GAUDI2_PCIE_ENGINE_ID_DEC_1;8448;8449return (((module_idx / NUM_OF_DEC_PER_DCORE) * ENGINE_ID_DCORE_OFFSET) +8450(module_idx % NUM_OF_DEC_PER_DCORE) +8451(GAUDI2_DCORE0_ENGINE_ID_DEC_0 - GAUDI2_DCORE0_ENGINE_ID_EDMA_0));84528453case RAZWI_ROT:8454return GAUDI2_ENGINE_ID_ROT_0 + module_idx;84558456case RAZWI_ARC_FARM:8457return GAUDI2_ENGINE_ID_ARC_FARM;84588459default:8460return GAUDI2_ENGINE_ID_SIZE;8461}8462}84638464/*8465* This function handles RR(Range register) hit events.8466* raised be initiators not PSOC RAZWI.8467*/8468static void gaudi2_ack_module_razwi_event_handler(struct hl_device *hdev,8469enum razwi_event_sources module, u8 module_idx,8470u8 module_sub_idx, u64 *event_mask)8471{8472bool via_sft = false;8473u32 hbw_rtr_id, lbw_rtr_id, dcore_id, dcore_rtr_id, eng_id, binned_idx;8474u64 hbw_rtr_mstr_if_base_addr, lbw_rtr_mstr_if_base_addr;8475u32 hbw_shrd_aw = 0, hbw_shrd_ar = 0;8476u32 lbw_shrd_aw = 0, lbw_shrd_ar = 0;8477char initiator_name[64];84788479switch (module) {8480case RAZWI_TPC:8481sprintf(initiator_name, "TPC_%u", module_idx);8482if (hdev->tpc_binning) {8483binned_idx = __ffs(hdev->tpc_binning);8484if (binned_idx == module_idx)8485module_idx = TPC_ID_DCORE0_TPC6;8486}84878488hbw_rtr_id = gaudi2_tpc_initiator_hbw_rtr_id[module_idx];8489lbw_rtr_id = gaudi2_tpc_initiator_lbw_rtr_id[module_idx];8490break;8491case RAZWI_MME:8492sprintf(initiator_name, "MME_%u", module_idx);8493switch (module_sub_idx) {8494case MME_WAP0:8495hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].wap0;8496break;8497case MME_WAP1:8498hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].wap1;8499break;8500case MME_WRITE:8501hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].write;8502break;8503case MME_READ:8504hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].read;8505break;8506case MME_SBTE0:8507hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte0;8508break;8509case MME_SBTE1:8510hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte1;8511break;8512case MME_SBTE2:8513hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte2;8514break;8515case MME_SBTE3:8516hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte3;8517break;8518case MME_SBTE4:8519hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte4;8520break;8521default:8522return;8523}8524lbw_rtr_id = hbw_rtr_id;8525break;8526case RAZWI_EDMA:8527hbw_rtr_mstr_if_base_addr = gaudi2_edma_initiator_hbw_sft[module_idx];8528dcore_id = module_idx / NUM_OF_EDMA_PER_DCORE;8529/* SFT has separate MSTR_IF for LBW, only there we can8530* read the LBW razwi related registers8531*/8532lbw_rtr_mstr_if_base_addr = mmSFT0_LBW_RTR_IF_MSTR_IF_RR_SHRD_HBW_BASE +8533dcore_id * SFT_DCORE_OFFSET;8534via_sft = true;8535sprintf(initiator_name, "EDMA_%u", module_idx);8536break;8537case RAZWI_PDMA:8538hbw_rtr_id = gaudi2_pdma_initiator_hbw_rtr_id[module_idx];8539lbw_rtr_id = gaudi2_pdma_initiator_lbw_rtr_id[module_idx];8540sprintf(initiator_name, "PDMA_%u", module_idx);8541break;8542case RAZWI_NIC:8543hbw_rtr_id = gaudi2_nic_initiator_hbw_rtr_id[module_idx];8544lbw_rtr_id = gaudi2_nic_initiator_lbw_rtr_id[module_idx];8545sprintf(initiator_name, "NIC_%u", module_idx);8546break;8547case RAZWI_DEC:8548sprintf(initiator_name, "DEC_%u", module_idx);8549if (hdev->decoder_binning) {8550binned_idx = __ffs(hdev->decoder_binning);8551if (binned_idx == module_idx)8552module_idx = DEC_ID_PCIE_VDEC1;8553}8554hbw_rtr_id = gaudi2_dec_initiator_hbw_rtr_id[module_idx];8555lbw_rtr_id = gaudi2_dec_initiator_lbw_rtr_id[module_idx];8556break;8557case RAZWI_ROT:8558hbw_rtr_id = gaudi2_rot_initiator_hbw_rtr_id[module_idx];8559lbw_rtr_id = gaudi2_rot_initiator_lbw_rtr_id[module_idx];8560sprintf(initiator_name, "ROT_%u", module_idx);8561break;8562case RAZWI_ARC_FARM:8563lbw_rtr_id = DCORE1_RTR5;8564hbw_rtr_id = DCORE1_RTR7;8565sprintf(initiator_name, "ARC_FARM_%u", module_idx);8566break;8567default:8568return;8569}85708571/* Find router mstr_if register base */8572if (!via_sft) {8573dcore_id = hbw_rtr_id / NUM_OF_RTR_PER_DCORE;8574dcore_rtr_id = hbw_rtr_id % NUM_OF_RTR_PER_DCORE;8575hbw_rtr_mstr_if_base_addr = mmDCORE0_RTR0_CTRL_BASE +8576dcore_id * DCORE_OFFSET +8577dcore_rtr_id * DCORE_RTR_OFFSET +8578RTR_MSTR_IF_OFFSET;8579lbw_rtr_mstr_if_base_addr = hbw_rtr_mstr_if_base_addr +8580(((s32)lbw_rtr_id - hbw_rtr_id) * DCORE_RTR_OFFSET);8581}85828583/* Find out event cause by reading "RAZWI_HAPPENED" registers */8584hbw_shrd_aw = RREG32(hbw_rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_HAPPENED);8585hbw_shrd_ar = RREG32(hbw_rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_HAPPENED);8586lbw_shrd_aw = RREG32(lbw_rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI_HAPPENED);8587lbw_shrd_ar = RREG32(lbw_rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI_HAPPENED);85888589eng_id = gaudi2_razwi_calc_engine_id(hdev, module, module_idx);8590if (hbw_shrd_aw) {8591gaudi2_razwi_rr_hbw_shared_printf_info(hdev, hbw_rtr_mstr_if_base_addr, true,8592initiator_name, eng_id, event_mask);85938594/* Clear event indication */8595WREG32(hbw_rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_HAPPENED, hbw_shrd_aw);8596}85978598if (hbw_shrd_ar) {8599gaudi2_razwi_rr_hbw_shared_printf_info(hdev, hbw_rtr_mstr_if_base_addr, false,8600initiator_name, eng_id, event_mask);86018602/* Clear event indication */8603WREG32(hbw_rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_HAPPENED, hbw_shrd_ar);8604}86058606if (lbw_shrd_aw) {8607gaudi2_razwi_rr_lbw_shared_printf_info(hdev, lbw_rtr_mstr_if_base_addr, true,8608initiator_name, eng_id, event_mask);86098610/* Clear event indication */8611WREG32(lbw_rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI_HAPPENED, lbw_shrd_aw);8612}86138614if (lbw_shrd_ar) {8615gaudi2_razwi_rr_lbw_shared_printf_info(hdev, lbw_rtr_mstr_if_base_addr, false,8616initiator_name, eng_id, event_mask);86178618/* Clear event indication */8619WREG32(lbw_rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI_HAPPENED, lbw_shrd_ar);8620}8621}86228623static void gaudi2_check_if_razwi_happened(struct hl_device *hdev)8624{8625struct asic_fixed_properties *prop = &hdev->asic_prop;8626u8 mod_idx, sub_mod;86278628/* check all TPCs */8629for (mod_idx = 0 ; mod_idx < (NUM_OF_TPC_PER_DCORE * NUM_OF_DCORES + 1) ; mod_idx++) {8630if (prop->tpc_enabled_mask & BIT(mod_idx))8631gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_TPC, mod_idx, 0, NULL);8632}86338634/* check all MMEs */8635for (mod_idx = 0 ; mod_idx < (NUM_OF_MME_PER_DCORE * NUM_OF_DCORES) ; mod_idx++)8636for (sub_mod = MME_WAP0 ; sub_mod < MME_INITIATORS_MAX ; sub_mod++)8637gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mod_idx,8638sub_mod, NULL);86398640/* check all EDMAs */8641for (mod_idx = 0 ; mod_idx < (NUM_OF_EDMA_PER_DCORE * NUM_OF_DCORES) ; mod_idx++)8642if (prop->edma_enabled_mask & BIT(mod_idx))8643gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_EDMA, mod_idx, 0, NULL);86448645/* check all PDMAs */8646for (mod_idx = 0 ; mod_idx < NUM_OF_PDMA ; mod_idx++)8647gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_PDMA, mod_idx, 0, NULL);86488649/* check all NICs */8650for (mod_idx = 0 ; mod_idx < NIC_NUMBER_OF_PORTS ; mod_idx++)8651if (hdev->nic_ports_mask & BIT(mod_idx))8652gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_NIC, mod_idx >> 1, 0,8653NULL);86548655/* check all DECs */8656for (mod_idx = 0 ; mod_idx < NUMBER_OF_DEC ; mod_idx++)8657if (prop->decoder_enabled_mask & BIT(mod_idx))8658gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_DEC, mod_idx, 0, NULL);86598660/* check all ROTs */8661for (mod_idx = 0 ; mod_idx < NUM_OF_ROT ; mod_idx++)8662gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_ROT, mod_idx, 0, NULL);8663}86648665static int gaudi2_psoc_razwi_get_engines(struct gaudi2_razwi_info *razwi_info, u32 array_size,8666u32 axuser_xy, u32 *base, u16 *eng_id,8667char *eng_name)8668{86698670int i, num_of_eng = 0;8671u16 str_size = 0;86728673for (i = 0 ; i < array_size ; i++) {8674if (axuser_xy != razwi_info[i].axuser_xy)8675continue;86768677eng_id[num_of_eng] = razwi_info[i].eng_id;8678base[num_of_eng] = razwi_info[i].rtr_ctrl;8679if (!num_of_eng)8680str_size += scnprintf(eng_name + str_size,8681PSOC_RAZWI_ENG_STR_SIZE - str_size, "%s",8682razwi_info[i].eng_name);8683else8684str_size += scnprintf(eng_name + str_size,8685PSOC_RAZWI_ENG_STR_SIZE - str_size, " or %s",8686razwi_info[i].eng_name);8687num_of_eng++;8688}86898690return num_of_eng;8691}86928693static bool gaudi2_handle_psoc_razwi_happened(struct hl_device *hdev, u32 razwi_reg,8694u64 *event_mask)8695{8696u32 axuser_xy = RAZWI_GET_AXUSER_XY(razwi_reg), addr_hi = 0, addr_lo = 0;8697u32 base[PSOC_RAZWI_MAX_ENG_PER_RTR];8698u16 num_of_eng, eng_id[PSOC_RAZWI_MAX_ENG_PER_RTR];8699char eng_name_str[PSOC_RAZWI_ENG_STR_SIZE];8700bool razwi_happened = false;8701u64 addr;8702int i;87038704num_of_eng = gaudi2_psoc_razwi_get_engines(common_razwi_info, ARRAY_SIZE(common_razwi_info),8705axuser_xy, base, eng_id, eng_name_str);87068707/* If no match for XY coordinates, try to find it in MME razwi table */8708if (!num_of_eng) {8709axuser_xy = RAZWI_GET_AXUSER_LOW_XY(razwi_reg);8710num_of_eng = gaudi2_psoc_razwi_get_engines(mme_razwi_info,8711ARRAY_SIZE(mme_razwi_info),8712axuser_xy, base, eng_id,8713eng_name_str);8714}87158716for (i = 0 ; i < num_of_eng ; i++) {8717if (RREG32(base[i] + DEC_RAZWI_HBW_AW_SET)) {8718addr_hi = RREG32(base[i] + DEC_RAZWI_HBW_AW_ADDR_HI);8719addr_lo = RREG32(base[i] + DEC_RAZWI_HBW_AW_ADDR_LO);8720addr = ((u64)addr_hi << 32) + addr_lo;8721if (addr) {8722dev_err(hdev->dev,8723"PSOC HBW AW RAZWI: %s, address (aligned to 128 byte): 0x%llX\n",8724eng_name_str, addr);8725hl_handle_razwi(hdev, addr, &eng_id[0],8726num_of_eng, HL_RAZWI_HBW | HL_RAZWI_WRITE, event_mask);8727razwi_happened = true;8728}8729}87308731if (RREG32(base[i] + DEC_RAZWI_HBW_AR_SET)) {8732addr_hi = RREG32(base[i] + DEC_RAZWI_HBW_AR_ADDR_HI);8733addr_lo = RREG32(base[i] + DEC_RAZWI_HBW_AR_ADDR_LO);8734addr = ((u64)addr_hi << 32) + addr_lo;8735if (addr) {8736dev_err(hdev->dev,8737"PSOC HBW AR RAZWI: %s, address (aligned to 128 byte): 0x%llX\n",8738eng_name_str, addr);8739hl_handle_razwi(hdev, addr, &eng_id[0],8740num_of_eng, HL_RAZWI_HBW | HL_RAZWI_READ, event_mask);8741razwi_happened = true;8742}8743}87448745if (RREG32(base[i] + DEC_RAZWI_LBW_AW_SET)) {8746addr_lo = RREG32(base[i] + DEC_RAZWI_LBW_AW_ADDR);8747if (addr_lo) {8748dev_err(hdev->dev,8749"PSOC LBW AW RAZWI: %s, address (aligned to 128 byte): 0x%X\n",8750eng_name_str, addr_lo);8751hl_handle_razwi(hdev, addr_lo, &eng_id[0],8752num_of_eng, HL_RAZWI_LBW | HL_RAZWI_WRITE, event_mask);8753razwi_happened = true;8754}8755}87568757if (RREG32(base[i] + DEC_RAZWI_LBW_AR_SET)) {8758addr_lo = RREG32(base[i] + DEC_RAZWI_LBW_AR_ADDR);8759if (addr_lo) {8760dev_err(hdev->dev,8761"PSOC LBW AR RAZWI: %s, address (aligned to 128 byte): 0x%X\n",8762eng_name_str, addr_lo);8763hl_handle_razwi(hdev, addr_lo, &eng_id[0],8764num_of_eng, HL_RAZWI_LBW | HL_RAZWI_READ, event_mask);8765razwi_happened = true;8766}8767}8768/* In common case the loop will break, when there is only one engine id, or8769* several engines with the same router. The exceptional case is with psoc razwi8770* from EDMA, where it's possible to get axuser id which fits 2 routers (28771* interfaces of sft router). In this case, maybe the first router won't hold info8772* and we will need to iterate on the other router.8773*/8774if (razwi_happened)8775break;8776}87778778return razwi_happened;8779}87808781/* PSOC RAZWI interrupt occurs only when trying to access a bad address */8782static int gaudi2_ack_psoc_razwi_event_handler(struct hl_device *hdev, u64 *event_mask)8783{8784u32 razwi_mask_info, razwi_intr = 0, error_count = 0;87858786if (hdev->pldm || !(hdev->fw_components & FW_TYPE_LINUX)) {8787razwi_intr = RREG32(mmPSOC_GLOBAL_CONF_RAZWI_INTERRUPT);8788if (!razwi_intr)8789return 0;8790}87918792razwi_mask_info = RREG32(mmPSOC_GLOBAL_CONF_RAZWI_MASK_INFO);87938794dev_err_ratelimited(hdev->dev,8795"PSOC RAZWI interrupt: Mask %d, AR %d, AW %d, AXUSER_L 0x%x AXUSER_H 0x%x\n",8796FIELD_GET(PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_MASK_MASK, razwi_mask_info),8797FIELD_GET(PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_WAS_AR_MASK, razwi_mask_info),8798FIELD_GET(PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_WAS_AW_MASK, razwi_mask_info),8799FIELD_GET(PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_AXUSER_L_MASK, razwi_mask_info),8800FIELD_GET(PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_AXUSER_H_MASK, razwi_mask_info));88018802if (gaudi2_handle_psoc_razwi_happened(hdev, razwi_mask_info, event_mask))8803error_count++;8804else8805dev_err_ratelimited(hdev->dev,8806"PSOC RAZWI interrupt: invalid razwi info (0x%x)\n",8807razwi_mask_info);88088809/* Clear Interrupts only on pldm or if f/w doesn't handle interrupts */8810if (hdev->pldm || !(hdev->fw_components & FW_TYPE_LINUX))8811WREG32(mmPSOC_GLOBAL_CONF_RAZWI_INTERRUPT, razwi_intr);88128813return error_count;8814}88158816static int _gaudi2_handle_qm_sei_err(struct hl_device *hdev, u64 qman_base, u16 event_type)8817{8818u32 i, sts_val, sts_clr_val = 0, error_count = 0;88198820sts_val = RREG32(qman_base + QM_SEI_STATUS_OFFSET);88218822for (i = 0 ; i < GAUDI2_NUM_OF_QM_SEI_ERR_CAUSE ; i++) {8823if (sts_val & BIT(i)) {8824gaudi2_print_event(hdev, event_type, true,8825"err cause: %s", gaudi2_qm_sei_error_cause[i]);8826sts_clr_val |= BIT(i);8827error_count++;8828}8829}88308831WREG32(qman_base + QM_SEI_STATUS_OFFSET, sts_clr_val);88328833return error_count;8834}88358836static int gaudi2_handle_qm_sei_err(struct hl_device *hdev, u16 event_type,8837bool extended_err_check, u64 *event_mask)8838{8839enum razwi_event_sources module;8840u32 error_count = 0;8841u64 qman_base;8842u8 index;88438844switch (event_type) {8845case GAUDI2_EVENT_TPC0_AXI_ERR_RSP ... GAUDI2_EVENT_TPC23_AXI_ERR_RSP:8846index = event_type - GAUDI2_EVENT_TPC0_AXI_ERR_RSP;8847qman_base = mmDCORE0_TPC0_QM_BASE +8848(index / NUM_OF_TPC_PER_DCORE) * DCORE_OFFSET +8849(index % NUM_OF_TPC_PER_DCORE) * DCORE_TPC_OFFSET;8850module = RAZWI_TPC;8851break;8852case GAUDI2_EVENT_TPC24_AXI_ERR_RSP:8853qman_base = mmDCORE0_TPC6_QM_BASE;8854module = RAZWI_TPC;8855break;8856case GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE:8857case GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE:8858case GAUDI2_EVENT_MME2_CTRL_AXI_ERROR_RESPONSE:8859case GAUDI2_EVENT_MME3_CTRL_AXI_ERROR_RESPONSE:8860index = (event_type - GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE) /8861(GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE -8862GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE);8863qman_base = mmDCORE0_MME_QM_BASE + index * DCORE_OFFSET;8864module = RAZWI_MME;8865break;8866case GAUDI2_EVENT_PDMA_CH0_AXI_ERR_RSP:8867case GAUDI2_EVENT_PDMA_CH1_AXI_ERR_RSP:8868index = event_type - GAUDI2_EVENT_PDMA_CH0_AXI_ERR_RSP;8869qman_base = mmPDMA0_QM_BASE + index * PDMA_OFFSET;8870module = RAZWI_PDMA;8871break;8872case GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE:8873case GAUDI2_EVENT_ROTATOR1_AXI_ERROR_RESPONSE:8874index = event_type - GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE;8875qman_base = mmROT0_QM_BASE + index * ROT_OFFSET;8876module = RAZWI_ROT;8877break;8878default:8879return 0;8880}88818882error_count = _gaudi2_handle_qm_sei_err(hdev, qman_base, event_type);88838884/* There is a single event per NIC macro, so should check its both QMAN blocks */8885if (event_type >= GAUDI2_EVENT_NIC0_AXI_ERROR_RESPONSE &&8886event_type <= GAUDI2_EVENT_NIC11_AXI_ERROR_RESPONSE)8887error_count += _gaudi2_handle_qm_sei_err(hdev,8888qman_base + NIC_QM_OFFSET, event_type);88898890if (extended_err_check) {8891/* check if RAZWI happened */8892gaudi2_ack_module_razwi_event_handler(hdev, module, 0, 0, event_mask);8893hl_check_for_glbl_errors(hdev);8894}88958896return error_count;8897}88988899static int gaudi2_handle_qman_err(struct hl_device *hdev, u16 event_type, u64 *event_mask)8900{8901u32 qid_base, error_count = 0;8902u64 qman_base;8903u8 index = 0;89048905switch (event_type) {8906case GAUDI2_EVENT_TPC0_QM ... GAUDI2_EVENT_TPC5_QM:8907index = event_type - GAUDI2_EVENT_TPC0_QM;8908qid_base = GAUDI2_QUEUE_ID_DCORE0_TPC_0_0 + index * QMAN_STREAMS;8909qman_base = mmDCORE0_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;8910break;8911case GAUDI2_EVENT_TPC6_QM ... GAUDI2_EVENT_TPC11_QM:8912index = event_type - GAUDI2_EVENT_TPC6_QM;8913qid_base = GAUDI2_QUEUE_ID_DCORE1_TPC_0_0 + index * QMAN_STREAMS;8914qman_base = mmDCORE1_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;8915break;8916case GAUDI2_EVENT_TPC12_QM ... GAUDI2_EVENT_TPC17_QM:8917index = event_type - GAUDI2_EVENT_TPC12_QM;8918qid_base = GAUDI2_QUEUE_ID_DCORE2_TPC_0_0 + index * QMAN_STREAMS;8919qman_base = mmDCORE2_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;8920break;8921case GAUDI2_EVENT_TPC18_QM ... GAUDI2_EVENT_TPC23_QM:8922index = event_type - GAUDI2_EVENT_TPC18_QM;8923qid_base = GAUDI2_QUEUE_ID_DCORE3_TPC_0_0 + index * QMAN_STREAMS;8924qman_base = mmDCORE3_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;8925break;8926case GAUDI2_EVENT_TPC24_QM:8927qid_base = GAUDI2_QUEUE_ID_DCORE0_TPC_6_0;8928qman_base = mmDCORE0_TPC6_QM_BASE;8929break;8930case GAUDI2_EVENT_MME0_QM:8931qid_base = GAUDI2_QUEUE_ID_DCORE0_MME_0_0;8932qman_base = mmDCORE0_MME_QM_BASE;8933break;8934case GAUDI2_EVENT_MME1_QM:8935qid_base = GAUDI2_QUEUE_ID_DCORE1_MME_0_0;8936qman_base = mmDCORE1_MME_QM_BASE;8937break;8938case GAUDI2_EVENT_MME2_QM:8939qid_base = GAUDI2_QUEUE_ID_DCORE2_MME_0_0;8940qman_base = mmDCORE2_MME_QM_BASE;8941break;8942case GAUDI2_EVENT_MME3_QM:8943qid_base = GAUDI2_QUEUE_ID_DCORE3_MME_0_0;8944qman_base = mmDCORE3_MME_QM_BASE;8945break;8946case GAUDI2_EVENT_HDMA0_QM:8947index = 0;8948qid_base = GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0;8949qman_base = mmDCORE0_EDMA0_QM_BASE;8950break;8951case GAUDI2_EVENT_HDMA1_QM:8952index = 1;8953qid_base = GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0;8954qman_base = mmDCORE0_EDMA1_QM_BASE;8955break;8956case GAUDI2_EVENT_HDMA2_QM:8957index = 2;8958qid_base = GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0;8959qman_base = mmDCORE1_EDMA0_QM_BASE;8960break;8961case GAUDI2_EVENT_HDMA3_QM:8962index = 3;8963qid_base = GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0;8964qman_base = mmDCORE1_EDMA1_QM_BASE;8965break;8966case GAUDI2_EVENT_HDMA4_QM:8967index = 4;8968qid_base = GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0;8969qman_base = mmDCORE2_EDMA0_QM_BASE;8970break;8971case GAUDI2_EVENT_HDMA5_QM:8972index = 5;8973qid_base = GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0;8974qman_base = mmDCORE2_EDMA1_QM_BASE;8975break;8976case GAUDI2_EVENT_HDMA6_QM:8977index = 6;8978qid_base = GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0;8979qman_base = mmDCORE3_EDMA0_QM_BASE;8980break;8981case GAUDI2_EVENT_HDMA7_QM:8982index = 7;8983qid_base = GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0;8984qman_base = mmDCORE3_EDMA1_QM_BASE;8985break;8986case GAUDI2_EVENT_PDMA0_QM:8987qid_base = GAUDI2_QUEUE_ID_PDMA_0_0;8988qman_base = mmPDMA0_QM_BASE;8989break;8990case GAUDI2_EVENT_PDMA1_QM:8991qid_base = GAUDI2_QUEUE_ID_PDMA_1_0;8992qman_base = mmPDMA1_QM_BASE;8993break;8994case GAUDI2_EVENT_ROTATOR0_ROT0_QM:8995qid_base = GAUDI2_QUEUE_ID_ROT_0_0;8996qman_base = mmROT0_QM_BASE;8997break;8998case GAUDI2_EVENT_ROTATOR1_ROT1_QM:8999qid_base = GAUDI2_QUEUE_ID_ROT_1_0;9000qman_base = mmROT1_QM_BASE;9001break;9002default:9003return 0;9004}90059006error_count = gaudi2_handle_qman_err_generic(hdev, event_type, qman_base,9007qid_base, event_mask);90089009/* Handle EDMA QM SEI here because there is no AXI error response event for EDMA */9010if (event_type >= GAUDI2_EVENT_HDMA2_QM && event_type <= GAUDI2_EVENT_HDMA5_QM) {9011error_count += _gaudi2_handle_qm_sei_err(hdev, qman_base, event_type);9012gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_EDMA, index, 0, event_mask);9013}90149015hl_check_for_glbl_errors(hdev);90169017return error_count;9018}90199020static int gaudi2_handle_arc_farm_sei_err(struct hl_device *hdev, u16 event_type, u64 *event_mask)9021{9022u32 i, sts_val, sts_clr_val, error_count = 0, arc_farm;90239024for (arc_farm = 0 ; arc_farm < NUM_OF_ARC_FARMS_ARC ; arc_farm++) {9025sts_clr_val = 0;9026sts_val = RREG32(mmARC_FARM_ARC0_AUX_ARC_SEI_INTR_STS +9027(arc_farm * ARC_FARM_OFFSET));90289029for (i = 0 ; i < GAUDI2_NUM_OF_ARC_SEI_ERR_CAUSE ; i++) {9030if (sts_val & BIT(i)) {9031gaudi2_print_event(hdev, event_type, true,9032"ARC FARM ARC %u err cause: %s",9033arc_farm, gaudi2_arc_sei_error_cause[i]);9034sts_clr_val |= BIT(i);9035error_count++;9036}9037}9038WREG32(mmARC_FARM_ARC0_AUX_ARC_SEI_INTR_CLR + (arc_farm * ARC_FARM_OFFSET),9039sts_clr_val);9040}90419042gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_ARC_FARM, 0, 0, event_mask);9043hl_check_for_glbl_errors(hdev);90449045return error_count;9046}90479048static int gaudi2_handle_cpu_sei_err(struct hl_device *hdev, u16 event_type)9049{9050u32 i, sts_val, sts_clr_val = 0, error_count = 0;90519052sts_val = RREG32(mmCPU_IF_CPU_SEI_INTR_STS);90539054for (i = 0 ; i < GAUDI2_NUM_OF_CPU_SEI_ERR_CAUSE ; i++) {9055if (sts_val & BIT(i)) {9056gaudi2_print_event(hdev, event_type, true,9057"err cause: %s", gaudi2_cpu_sei_error_cause[i]);9058sts_clr_val |= BIT(i);9059error_count++;9060}9061}90629063hl_check_for_glbl_errors(hdev);90649065WREG32(mmCPU_IF_CPU_SEI_INTR_CLR, sts_clr_val);90669067return error_count;9068}90699070static int gaudi2_handle_rot_err(struct hl_device *hdev, u8 rot_index, u16 event_type,9071struct hl_eq_razwi_with_intr_cause *razwi_with_intr_cause,9072u64 *event_mask)9073{9074u64 intr_cause_data = le64_to_cpu(razwi_with_intr_cause->intr_cause.intr_cause_data);9075u32 error_count = 0;9076int i;90779078for (i = 0 ; i < GAUDI2_NUM_OF_ROT_ERR_CAUSE ; i++)9079if (intr_cause_data & BIT(i)) {9080gaudi2_print_event(hdev, event_type, true,9081"err cause: %s", guadi2_rot_error_cause[i]);9082error_count++;9083}90849085/* check if RAZWI happened */9086gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_ROT, rot_index, 0, event_mask);9087hl_check_for_glbl_errors(hdev);90889089return error_count;9090}90919092static int gaudi2_tpc_ack_interrupts(struct hl_device *hdev, u8 tpc_index, u16 event_type,9093struct hl_eq_razwi_with_intr_cause *razwi_with_intr_cause,9094u64 *event_mask)9095{9096u64 intr_cause_data = le64_to_cpu(razwi_with_intr_cause->intr_cause.intr_cause_data);9097u32 error_count = 0;9098int i;90999100for (i = 0 ; i < GAUDI2_NUM_OF_TPC_INTR_CAUSE ; i++)9101if (intr_cause_data & BIT(i)) {9102gaudi2_print_event(hdev, event_type, true,9103"interrupt cause: %s", gaudi2_tpc_interrupts_cause[i]);9104error_count++;9105}91069107/* check if RAZWI happened */9108gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_TPC, tpc_index, 0, event_mask);9109hl_check_for_glbl_errors(hdev);91109111return error_count;9112}91139114static int gaudi2_handle_dec_err(struct hl_device *hdev, u8 dec_index, u16 event_type,9115u64 *event_mask)9116{9117u32 sts_addr, sts_val, sts_clr_val = 0, error_count = 0;9118int i;91199120if (dec_index < NUM_OF_VDEC_PER_DCORE * NUM_OF_DCORES)9121/* DCORE DEC */9122sts_addr = mmDCORE0_VDEC0_BRDG_CTRL_CAUSE_INTR +9123DCORE_OFFSET * (dec_index / NUM_OF_DEC_PER_DCORE) +9124DCORE_VDEC_OFFSET * (dec_index % NUM_OF_DEC_PER_DCORE);9125else9126/* PCIE DEC */9127sts_addr = mmPCIE_VDEC0_BRDG_CTRL_CAUSE_INTR + PCIE_VDEC_OFFSET *9128(dec_index - NUM_OF_VDEC_PER_DCORE * NUM_OF_DCORES);91299130sts_val = RREG32(sts_addr);91319132for (i = 0 ; i < GAUDI2_NUM_OF_DEC_ERR_CAUSE ; i++) {9133if (sts_val & BIT(i)) {9134gaudi2_print_event(hdev, event_type, true,9135"err cause: %s", gaudi2_dec_error_cause[i]);9136sts_clr_val |= BIT(i);9137error_count++;9138}9139}91409141/* check if RAZWI happened */9142gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_DEC, dec_index, 0, event_mask);9143hl_check_for_glbl_errors(hdev);91449145/* Write 1 clear errors */9146WREG32(sts_addr, sts_clr_val);91479148return error_count;9149}91509151static int gaudi2_handle_mme_err(struct hl_device *hdev, u8 mme_index, u16 event_type,9152u64 *event_mask)9153{9154u32 sts_addr, sts_val, sts_clr_addr, sts_clr_val = 0, error_count = 0;9155int i;91569157sts_addr = mmDCORE0_MME_CTRL_LO_INTR_CAUSE + DCORE_OFFSET * mme_index;9158sts_clr_addr = mmDCORE0_MME_CTRL_LO_INTR_CLEAR + DCORE_OFFSET * mme_index;91599160sts_val = RREG32(sts_addr);91619162for (i = 0 ; i < GAUDI2_NUM_OF_MME_ERR_CAUSE ; i++) {9163if (sts_val & BIT(i)) {9164gaudi2_print_event(hdev, event_type, true,9165"err cause: %s", guadi2_mme_error_cause[i]);9166sts_clr_val |= BIT(i);9167error_count++;9168}9169}91709171/* check if RAZWI happened */9172for (i = MME_WRITE ; i < MME_INITIATORS_MAX ; i++)9173gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mme_index, i, event_mask);91749175hl_check_for_glbl_errors(hdev);91769177WREG32(sts_clr_addr, sts_clr_val);91789179return error_count;9180}91819182static int gaudi2_handle_mme_sbte_err(struct hl_device *hdev, u16 event_type)9183{9184/*9185* We have a single error cause here but the report mechanism is9186* buggy. Hence there is no good reason to fetch the cause so we9187* just check for glbl_errors and exit.9188*/9189hl_check_for_glbl_errors(hdev);91909191return GAUDI2_NA_EVENT_CAUSE;9192}91939194static int gaudi2_handle_mme_wap_err(struct hl_device *hdev, u8 mme_index, u16 event_type,9195u64 *event_mask)9196{9197u32 sts_addr, sts_val, sts_clr_addr, sts_clr_val = 0, error_count = 0;9198int i;91999200sts_addr = mmDCORE0_MME_ACC_INTR_CAUSE + DCORE_OFFSET * mme_index;9201sts_clr_addr = mmDCORE0_MME_ACC_INTR_CLEAR + DCORE_OFFSET * mme_index;92029203sts_val = RREG32(sts_addr);92049205for (i = 0 ; i < GAUDI2_NUM_OF_MME_WAP_ERR_CAUSE ; i++) {9206if (sts_val & BIT(i)) {9207gaudi2_print_event(hdev, event_type, true,9208"err cause: %s", guadi2_mme_wap_error_cause[i]);9209sts_clr_val |= BIT(i);9210error_count++;9211}9212}92139214/* check if RAZWI happened on WAP0/1 */9215gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mme_index, MME_WAP0, event_mask);9216gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mme_index, MME_WAP1, event_mask);9217hl_check_for_glbl_errors(hdev);92189219WREG32(sts_clr_addr, sts_clr_val);92209221return error_count;9222}92239224static int gaudi2_handle_kdma_core_event(struct hl_device *hdev, u16 event_type,9225u64 intr_cause_data)9226{9227u32 error_count = 0;9228int i;92299230/* If an AXI read or write error is received, an error is reported and9231* interrupt message is sent. Due to an HW errata, when reading the cause9232* register of the KDMA engine, the reported error is always HBW even if9233* the actual error caused by a LBW KDMA transaction.9234*/9235for (i = 0 ; i < GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE ; i++)9236if (intr_cause_data & BIT(i)) {9237gaudi2_print_event(hdev, event_type, true,9238"err cause: %s", gaudi2_kdma_core_interrupts_cause[i]);9239error_count++;9240}92419242hl_check_for_glbl_errors(hdev);92439244return error_count;9245}92469247static int gaudi2_handle_dma_core_event(struct hl_device *hdev, u16 event_type, u64 intr_cause)9248{9249u32 error_count = 0;9250int i;92519252for (i = 0 ; i < GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE ; i++)9253if (intr_cause & BIT(i)) {9254gaudi2_print_event(hdev, event_type, true,9255"err cause: %s", gaudi2_dma_core_interrupts_cause[i]);9256error_count++;9257}92589259hl_check_for_glbl_errors(hdev);92609261return error_count;9262}92639264static void gaudi2_print_pcie_mstr_rr_mstr_if_razwi_info(struct hl_device *hdev, u64 *event_mask)9265{9266u32 mstr_if_base_addr = mmPCIE_MSTR_RR_MSTR_IF_RR_SHRD_HBW_BASE, razwi_happened_addr;92679268razwi_happened_addr = mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_HAPPENED;9269if (RREG32(razwi_happened_addr)) {9270gaudi2_razwi_rr_hbw_shared_printf_info(hdev, mstr_if_base_addr, true, "PCIE",9271GAUDI2_ENGINE_ID_PCIE, event_mask);9272WREG32(razwi_happened_addr, 0x1);9273}92749275razwi_happened_addr = mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_HAPPENED;9276if (RREG32(razwi_happened_addr)) {9277gaudi2_razwi_rr_hbw_shared_printf_info(hdev, mstr_if_base_addr, false, "PCIE",9278GAUDI2_ENGINE_ID_PCIE, event_mask);9279WREG32(razwi_happened_addr, 0x1);9280}92819282razwi_happened_addr = mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI_HAPPENED;9283if (RREG32(razwi_happened_addr)) {9284gaudi2_razwi_rr_lbw_shared_printf_info(hdev, mstr_if_base_addr, true, "PCIE",9285GAUDI2_ENGINE_ID_PCIE, event_mask);9286WREG32(razwi_happened_addr, 0x1);9287}92889289razwi_happened_addr = mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI_HAPPENED;9290if (RREG32(razwi_happened_addr)) {9291gaudi2_razwi_rr_lbw_shared_printf_info(hdev, mstr_if_base_addr, false, "PCIE",9292GAUDI2_ENGINE_ID_PCIE, event_mask);9293WREG32(razwi_happened_addr, 0x1);9294}9295}92969297static int gaudi2_print_pcie_addr_dec_info(struct hl_device *hdev, u16 event_type,9298u64 intr_cause_data, u64 *event_mask)9299{9300u32 error_count = 0;9301int i;93029303for (i = 0 ; i < GAUDI2_NUM_OF_PCIE_ADDR_DEC_ERR_CAUSE ; i++) {9304if (!(intr_cause_data & BIT_ULL(i)))9305continue;93069307gaudi2_print_event(hdev, event_type, true,9308"err cause: %s", gaudi2_pcie_addr_dec_error_cause[i]);9309error_count++;93109311switch (intr_cause_data & BIT_ULL(i)) {9312case PCIE_WRAP_PCIE_IC_SEI_INTR_IND_AXI_LBW_ERR_INTR_MASK:9313hl_check_for_glbl_errors(hdev);9314break;9315case PCIE_WRAP_PCIE_IC_SEI_INTR_IND_BAD_ACCESS_INTR_MASK:9316gaudi2_print_pcie_mstr_rr_mstr_if_razwi_info(hdev, event_mask);9317break;9318}9319}93209321return error_count;9322}93239324static int gaudi2_handle_pif_fatal(struct hl_device *hdev, u16 event_type,9325u64 intr_cause_data)93269327{9328u32 error_count = 0;9329int i;93309331for (i = 0 ; i < GAUDI2_NUM_OF_PMMU_FATAL_ERR_CAUSE ; i++) {9332if (intr_cause_data & BIT_ULL(i)) {9333gaudi2_print_event(hdev, event_type, true,9334"err cause: %s", gaudi2_pmmu_fatal_interrupts_cause[i]);9335error_count++;9336}9337}93389339return error_count;9340}93419342static int gaudi2_handle_hif_fatal(struct hl_device *hdev, u16 event_type, u64 intr_cause_data)9343{9344u32 error_count = 0;9345int i;93469347for (i = 0 ; i < GAUDI2_NUM_OF_HIF_FATAL_ERR_CAUSE ; i++) {9348if (intr_cause_data & BIT_ULL(i)) {9349gaudi2_print_event(hdev, event_type, true,9350"err cause: %s", gaudi2_hif_fatal_interrupts_cause[i]);9351error_count++;9352}9353}93549355return error_count;9356}93579358static void gaudi2_handle_page_error(struct hl_device *hdev, u64 mmu_base, bool is_pmmu,9359u64 *event_mask)9360{9361u32 valid, val;9362u64 addr;93639364valid = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID));93659366if (!(valid & DCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID_PAGE_ERR_VALID_ENTRY_MASK))9367return;93689369val = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_PAGE_ERROR_CAPTURE));9370addr = val & DCORE0_HMMU0_MMU_PAGE_ERROR_CAPTURE_VA_63_32_MASK;9371addr <<= 32;9372addr |= RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_PAGE_ERROR_CAPTURE_VA));93739374if (is_pmmu) {9375dev_err_ratelimited(hdev->dev, "PMMU page fault on va 0x%llx\n", addr);9376} else {9377addr = gaudi2_mmu_descramble_addr(hdev, addr);9378addr &= HW_UNSCRAMBLED_BITS_MASK;9379dev_err_ratelimited(hdev->dev, "HMMU page fault on va range 0x%llx - 0x%llx\n",9380addr, addr + ~HW_UNSCRAMBLED_BITS_MASK);9381}93829383hl_handle_page_fault(hdev, addr, 0, is_pmmu, event_mask);93849385WREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID), 0);9386}93879388static void gaudi2_handle_access_error(struct hl_device *hdev, u64 mmu_base, bool is_pmmu)9389{9390u32 valid, val;9391u64 addr;93929393valid = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID));93949395if (!(valid & DCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID_ACCESS_ERR_VALID_ENTRY_MASK))9396return;93979398val = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_ERROR_CAPTURE));9399addr = val & DCORE0_HMMU0_MMU_ACCESS_ERROR_CAPTURE_VA_63_32_MASK;9400addr <<= 32;9401addr |= RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_ERROR_CAPTURE_VA));94029403if (!is_pmmu)9404addr = gaudi2_mmu_descramble_addr(hdev, addr);94059406dev_err_ratelimited(hdev->dev, "%s access error on va 0x%llx\n",9407is_pmmu ? "PMMU" : "HMMU", addr);9408WREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID), 0);9409}94109411static int gaudi2_handle_mmu_spi_sei_generic(struct hl_device *hdev, u16 event_type,9412u64 mmu_base, bool is_pmmu, u64 *event_mask)9413{9414u32 spi_sei_cause, interrupt_clr = 0x0, error_count = 0;9415int i;94169417spi_sei_cause = RREG32(mmu_base + MMU_SPI_SEI_CAUSE_OFFSET);94189419for (i = 0 ; i < GAUDI2_NUM_OF_MMU_SPI_SEI_CAUSE ; i++) {9420if (spi_sei_cause & BIT(i)) {9421gaudi2_print_event(hdev, event_type, true,9422"err cause: %s", gaudi2_mmu_spi_sei[i].cause);94239424if (i == 0)9425gaudi2_handle_page_error(hdev, mmu_base, is_pmmu, event_mask);9426else if (i == 1)9427gaudi2_handle_access_error(hdev, mmu_base, is_pmmu);94289429if (gaudi2_mmu_spi_sei[i].clear_bit >= 0)9430interrupt_clr |= BIT(gaudi2_mmu_spi_sei[i].clear_bit);94319432error_count++;9433}9434}94359436/* Clear cause */9437WREG32_AND(mmu_base + MMU_SPI_SEI_CAUSE_OFFSET, ~spi_sei_cause);94389439/* Clear interrupt */9440WREG32(mmu_base + MMU_INTERRUPT_CLR_OFFSET, interrupt_clr);94419442return error_count;9443}94449445static int gaudi2_handle_sm_err(struct hl_device *hdev, u16 event_type, u8 sm_index)9446{9447u32 sei_cause_addr, sei_cause_val, sei_cause_cause, sei_cause_log,9448cq_intr_addr, cq_intr_val, cq_intr_queue_index, error_count = 0;9449int i;94509451sei_cause_addr = mmDCORE0_SYNC_MNGR_GLBL_SM_SEI_CAUSE + DCORE_OFFSET * sm_index;9452cq_intr_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_INTR + DCORE_OFFSET * sm_index;94539454sei_cause_val = RREG32(sei_cause_addr);9455sei_cause_cause = FIELD_GET(DCORE0_SYNC_MNGR_GLBL_SM_SEI_CAUSE_CAUSE_MASK, sei_cause_val);9456cq_intr_val = RREG32(cq_intr_addr);94579458/* SEI interrupt */9459if (sei_cause_cause) {9460/* There are corresponding SEI_CAUSE_log bits for every SEI_CAUSE_cause bit */9461sei_cause_log = FIELD_GET(DCORE0_SYNC_MNGR_GLBL_SM_SEI_CAUSE_LOG_MASK,9462sei_cause_val);94639464for (i = 0 ; i < GAUDI2_NUM_OF_SM_SEI_ERR_CAUSE ; i++) {9465if (!(sei_cause_cause & BIT(i)))9466continue;94679468gaudi2_print_event(hdev, event_type, true,9469"err cause: %s. %s: 0x%X",9470gaudi2_sm_sei_cause[i].cause_name,9471gaudi2_sm_sei_cause[i].log_name,9472sei_cause_log);9473error_count++;9474break;9475}94769477/* Clear SM_SEI_CAUSE */9478WREG32(sei_cause_addr, 0);9479}94809481/* CQ interrupt */9482if (cq_intr_val & DCORE0_SYNC_MNGR_GLBL_CQ_INTR_CQ_SEC_INTR_MASK) {9483cq_intr_queue_index =9484FIELD_GET(DCORE0_SYNC_MNGR_GLBL_CQ_INTR_CQ_INTR_QUEUE_INDEX_MASK,9485cq_intr_val);94869487dev_err_ratelimited(hdev->dev, "SM%u err. err cause: CQ_INTR. queue index: %u\n",9488sm_index, cq_intr_queue_index);9489error_count++;94909491/* Clear CQ_INTR */9492WREG32(cq_intr_addr, 0);9493}94949495hl_check_for_glbl_errors(hdev);94969497return error_count;9498}94999500static u64 get_hmmu_base(u16 event_type)9501{9502u8 dcore, index_in_dcore;95039504switch (event_type) {9505case GAUDI2_EVENT_HMMU_0_AXI_ERR_RSP:9506case GAUDI2_EVENT_HMMU0_SPI_BASE ... GAUDI2_EVENT_HMMU0_SECURITY_ERROR:9507dcore = 0;9508index_in_dcore = 0;9509break;9510case GAUDI2_EVENT_HMMU_1_AXI_ERR_RSP:9511case GAUDI2_EVENT_HMMU1_SPI_BASE ... GAUDI2_EVENT_HMMU1_SECURITY_ERROR:9512dcore = 1;9513index_in_dcore = 0;9514break;9515case GAUDI2_EVENT_HMMU_2_AXI_ERR_RSP:9516case GAUDI2_EVENT_HMMU2_SPI_BASE ... GAUDI2_EVENT_HMMU2_SECURITY_ERROR:9517dcore = 0;9518index_in_dcore = 1;9519break;9520case GAUDI2_EVENT_HMMU_3_AXI_ERR_RSP:9521case GAUDI2_EVENT_HMMU3_SPI_BASE ... GAUDI2_EVENT_HMMU3_SECURITY_ERROR:9522dcore = 1;9523index_in_dcore = 1;9524break;9525case GAUDI2_EVENT_HMMU_4_AXI_ERR_RSP:9526case GAUDI2_EVENT_HMMU4_SPI_BASE ... GAUDI2_EVENT_HMMU4_SECURITY_ERROR:9527dcore = 3;9528index_in_dcore = 2;9529break;9530case GAUDI2_EVENT_HMMU_5_AXI_ERR_RSP:9531case GAUDI2_EVENT_HMMU5_SPI_BASE ... GAUDI2_EVENT_HMMU5_SECURITY_ERROR:9532dcore = 2;9533index_in_dcore = 2;9534break;9535case GAUDI2_EVENT_HMMU_6_AXI_ERR_RSP:9536case GAUDI2_EVENT_HMMU6_SPI_BASE ... GAUDI2_EVENT_HMMU6_SECURITY_ERROR:9537dcore = 3;9538index_in_dcore = 3;9539break;9540case GAUDI2_EVENT_HMMU_7_AXI_ERR_RSP:9541case GAUDI2_EVENT_HMMU7_SPI_BASE ... GAUDI2_EVENT_HMMU7_SECURITY_ERROR:9542dcore = 2;9543index_in_dcore = 3;9544break;9545case GAUDI2_EVENT_HMMU_8_AXI_ERR_RSP:9546case GAUDI2_EVENT_HMMU8_SPI_BASE ... GAUDI2_EVENT_HMMU8_SECURITY_ERROR:9547dcore = 0;9548index_in_dcore = 2;9549break;9550case GAUDI2_EVENT_HMMU_9_AXI_ERR_RSP:9551case GAUDI2_EVENT_HMMU9_SPI_BASE ... GAUDI2_EVENT_HMMU9_SECURITY_ERROR:9552dcore = 1;9553index_in_dcore = 2;9554break;9555case GAUDI2_EVENT_HMMU_10_AXI_ERR_RSP:9556case GAUDI2_EVENT_HMMU10_SPI_BASE ... GAUDI2_EVENT_HMMU10_SECURITY_ERROR:9557dcore = 0;9558index_in_dcore = 3;9559break;9560case GAUDI2_EVENT_HMMU_11_AXI_ERR_RSP:9561case GAUDI2_EVENT_HMMU11_SPI_BASE ... GAUDI2_EVENT_HMMU11_SECURITY_ERROR:9562dcore = 1;9563index_in_dcore = 3;9564break;9565case GAUDI2_EVENT_HMMU_12_AXI_ERR_RSP:9566case GAUDI2_EVENT_HMMU12_SPI_BASE ... GAUDI2_EVENT_HMMU12_SECURITY_ERROR:9567dcore = 3;9568index_in_dcore = 0;9569break;9570case GAUDI2_EVENT_HMMU_13_AXI_ERR_RSP:9571case GAUDI2_EVENT_HMMU13_SPI_BASE ... GAUDI2_EVENT_HMMU13_SECURITY_ERROR:9572dcore = 2;9573index_in_dcore = 0;9574break;9575case GAUDI2_EVENT_HMMU_14_AXI_ERR_RSP:9576case GAUDI2_EVENT_HMMU14_SPI_BASE ... GAUDI2_EVENT_HMMU14_SECURITY_ERROR:9577dcore = 3;9578index_in_dcore = 1;9579break;9580case GAUDI2_EVENT_HMMU_15_AXI_ERR_RSP:9581case GAUDI2_EVENT_HMMU15_SPI_BASE ... GAUDI2_EVENT_HMMU15_SECURITY_ERROR:9582dcore = 2;9583index_in_dcore = 1;9584break;9585default:9586return ULONG_MAX;9587}95889589return mmDCORE0_HMMU0_MMU_BASE + dcore * DCORE_OFFSET + index_in_dcore * DCORE_HMMU_OFFSET;9590}95919592static int gaudi2_handle_mmu_spi_sei_err(struct hl_device *hdev, u16 event_type, u64 *event_mask)9593{9594bool is_pmmu = false;9595u32 error_count = 0;9596u64 mmu_base;95979598switch (event_type) {9599case GAUDI2_EVENT_HMMU_0_AXI_ERR_RSP ... GAUDI2_EVENT_HMMU_12_AXI_ERR_RSP:9600case GAUDI2_EVENT_HMMU0_SPI_BASE ... GAUDI2_EVENT_HMMU12_SECURITY_ERROR:9601mmu_base = get_hmmu_base(event_type);9602break;96039604case GAUDI2_EVENT_PMMU0_PAGE_FAULT_WR_PERM ... GAUDI2_EVENT_PMMU0_SECURITY_ERROR:9605case GAUDI2_EVENT_PMMU_AXI_ERR_RSP_0:9606is_pmmu = true;9607mmu_base = mmPMMU_HBW_MMU_BASE;9608break;9609default:9610return 0;9611}96129613if (mmu_base == ULONG_MAX)9614return 0;96159616error_count = gaudi2_handle_mmu_spi_sei_generic(hdev, event_type, mmu_base,9617is_pmmu, event_mask);9618hl_check_for_glbl_errors(hdev);96199620return error_count;9621}962296239624/* returns true if hard reset is required (ECC DERR or Read parity), false otherwise (ECC SERR) */9625static bool gaudi2_hbm_sei_handle_read_err(struct hl_device *hdev,9626struct hl_eq_hbm_sei_read_err_intr_info *rd_err_data, u32 err_cnt)9627{9628bool require_hard_reset = false;9629u32 addr, beat, beat_shift;96309631dev_err_ratelimited(hdev->dev,9632"READ ERROR count: ECC SERR: %d, ECC DERR: %d, RD_PARITY: %d\n",9633FIELD_GET(HBM_ECC_SERR_CNTR_MASK, err_cnt),9634FIELD_GET(HBM_ECC_DERR_CNTR_MASK, err_cnt),9635FIELD_GET(HBM_RD_PARITY_CNTR_MASK, err_cnt));96369637addr = le32_to_cpu(rd_err_data->dbg_rd_err_addr.rd_addr_val);9638dev_err_ratelimited(hdev->dev,9639"READ ERROR address: sid(%u), bg(%u), ba(%u), col(%u), row(%u)\n",9640FIELD_GET(HBM_RD_ADDR_SID_MASK, addr),9641FIELD_GET(HBM_RD_ADDR_BG_MASK, addr),9642FIELD_GET(HBM_RD_ADDR_BA_MASK, addr),9643FIELD_GET(HBM_RD_ADDR_COL_MASK, addr),9644FIELD_GET(HBM_RD_ADDR_ROW_MASK, addr));96459646/* For each beat (RDQS edge), look for possible errors and print relevant info */9647for (beat = 0 ; beat < 4 ; beat++) {9648if (le32_to_cpu(rd_err_data->dbg_rd_err_misc) &9649(HBM_RD_ERR_SERR_BEAT0_MASK << beat))9650dev_err_ratelimited(hdev->dev, "Beat%d ECC SERR: DM: %#x, Syndrome: %#x\n",9651beat,9652le32_to_cpu(rd_err_data->dbg_rd_err_dm),9653le32_to_cpu(rd_err_data->dbg_rd_err_syndrome));96549655if (le32_to_cpu(rd_err_data->dbg_rd_err_misc) &9656(HBM_RD_ERR_DERR_BEAT0_MASK << beat)) {9657dev_err_ratelimited(hdev->dev, "Beat%d ECC DERR: DM: %#x, Syndrome: %#x\n",9658beat,9659le32_to_cpu(rd_err_data->dbg_rd_err_dm),9660le32_to_cpu(rd_err_data->dbg_rd_err_syndrome));9661require_hard_reset = true;9662}96639664beat_shift = beat * HBM_RD_ERR_BEAT_SHIFT;9665if (le32_to_cpu(rd_err_data->dbg_rd_err_misc) &9666(HBM_RD_ERR_PAR_ERR_BEAT0_MASK << beat_shift)) {9667dev_err_ratelimited(hdev->dev,9668"Beat%d read PARITY: DM: %#x, PAR data: %#x\n",9669beat,9670le32_to_cpu(rd_err_data->dbg_rd_err_dm),9671(le32_to_cpu(rd_err_data->dbg_rd_err_misc) &9672(HBM_RD_ERR_PAR_DATA_BEAT0_MASK << beat_shift)) >>9673(HBM_RD_ERR_PAR_DATA_BEAT0_SHIFT + beat_shift));9674require_hard_reset = true;9675}96769677dev_err_ratelimited(hdev->dev, "Beat%d DQ data:\n", beat);9678dev_err_ratelimited(hdev->dev, "\t0x%08x\n",9679le32_to_cpu(rd_err_data->dbg_rd_err_data[beat * 2]));9680dev_err_ratelimited(hdev->dev, "\t0x%08x\n",9681le32_to_cpu(rd_err_data->dbg_rd_err_data[beat * 2 + 1]));9682}96839684return require_hard_reset;9685}96869687static void gaudi2_hbm_sei_print_wr_par_info(struct hl_device *hdev,9688struct hl_eq_hbm_sei_wr_par_intr_info *wr_par_err_data, u32 err_cnt)9689{9690struct hbm_sei_wr_cmd_address *wr_cmd_addr = wr_par_err_data->dbg_last_wr_cmds;9691u32 i, curr_addr, derr = wr_par_err_data->dbg_derr;96929693dev_err_ratelimited(hdev->dev, "WRITE PARITY ERROR count: %d\n", err_cnt);96949695dev_err_ratelimited(hdev->dev, "CK-0 DERR: 0x%02x, CK-1 DERR: 0x%02x\n",9696derr & 0x3, derr & 0xc);96979698/* JIRA H6-3286 - the following prints may not be valid */9699dev_err_ratelimited(hdev->dev, "Last latched write commands addresses:\n");9700for (i = 0 ; i < HBM_WR_PAR_CMD_LIFO_LEN ; i++) {9701curr_addr = le32_to_cpu(wr_cmd_addr[i].dbg_wr_cmd_addr);9702dev_err_ratelimited(hdev->dev,9703"\twrite cmd[%u]: Address: SID(%u) BG(%u) BA(%u) COL(%u).\n",9704i,9705FIELD_GET(WR_PAR_LAST_CMD_SID_MASK, curr_addr),9706FIELD_GET(WR_PAR_LAST_CMD_BG_MASK, curr_addr),9707FIELD_GET(WR_PAR_LAST_CMD_BA_MASK, curr_addr),9708FIELD_GET(WR_PAR_LAST_CMD_COL_MASK, curr_addr));9709}9710}97119712static void gaudi2_hbm_sei_print_ca_par_info(struct hl_device *hdev,9713struct hl_eq_hbm_sei_ca_par_intr_info *ca_par_err_data, u32 err_cnt)9714{9715__le32 *col_cmd = ca_par_err_data->dbg_col;9716__le16 *row_cmd = ca_par_err_data->dbg_row;9717u32 i;97189719dev_err_ratelimited(hdev->dev, "CA ERROR count: %d\n", err_cnt);97209721dev_err_ratelimited(hdev->dev, "Last latched C&R bus commands:\n");9722for (i = 0 ; i < HBM_CA_ERR_CMD_LIFO_LEN ; i++)9723dev_err_ratelimited(hdev->dev, "cmd%u: ROW(0x%04x) COL(0x%05x)\n", i,9724le16_to_cpu(row_cmd[i]) & (u16)GENMASK(13, 0),9725le32_to_cpu(col_cmd[i]) & (u32)GENMASK(17, 0));9726}97279728/* Returns true if hard reset is needed or false otherwise */9729static bool gaudi2_handle_hbm_mc_sei_err(struct hl_device *hdev, u16 event_type,9730struct hl_eq_hbm_sei_data *sei_data)9731{9732bool require_hard_reset = false;9733u32 hbm_id, mc_id, cause_idx;97349735hbm_id = (event_type - GAUDI2_EVENT_HBM0_MC0_SEI_SEVERE) / 4;9736mc_id = ((event_type - GAUDI2_EVENT_HBM0_MC0_SEI_SEVERE) / 2) % 2;97379738cause_idx = sei_data->hdr.sei_cause;9739if (cause_idx > GAUDI2_NUM_OF_HBM_SEI_CAUSE - 1) {9740gaudi2_print_event(hdev, event_type, true,9741"err cause: %s",9742"Invalid HBM SEI event cause (%d) provided by FW", cause_idx);9743return true;9744}97459746gaudi2_print_event(hdev, event_type, !sei_data->hdr.is_critical,9747"System %s Error Interrupt - HBM(%u) MC(%u) MC_CH(%u) MC_PC(%u). Error cause: %s",9748sei_data->hdr.is_critical ? "Critical" : "Non-critical",9749hbm_id, mc_id, sei_data->hdr.mc_channel, sei_data->hdr.mc_pseudo_channel,9750hbm_mc_sei_cause[cause_idx]);97519752/* Print error-specific info */9753switch (cause_idx) {9754case HBM_SEI_CATTRIP:9755require_hard_reset = true;9756break;97579758case HBM_SEI_CMD_PARITY_EVEN:9759gaudi2_hbm_sei_print_ca_par_info(hdev, &sei_data->ca_parity_even_info,9760le32_to_cpu(sei_data->hdr.cnt));9761require_hard_reset = true;9762break;97639764case HBM_SEI_CMD_PARITY_ODD:9765gaudi2_hbm_sei_print_ca_par_info(hdev, &sei_data->ca_parity_odd_info,9766le32_to_cpu(sei_data->hdr.cnt));9767require_hard_reset = true;9768break;97699770case HBM_SEI_WRITE_DATA_PARITY_ERR:9771gaudi2_hbm_sei_print_wr_par_info(hdev, &sei_data->wr_parity_info,9772le32_to_cpu(sei_data->hdr.cnt));9773require_hard_reset = true;9774break;97759776case HBM_SEI_READ_ERR:9777/* Unlike other SEI events, read error requires further processing of the9778* raw data in order to determine the root cause.9779*/9780require_hard_reset = gaudi2_hbm_sei_handle_read_err(hdev,9781&sei_data->read_err_info,9782le32_to_cpu(sei_data->hdr.cnt));9783break;97849785default:9786break;9787}97889789require_hard_reset |= !!sei_data->hdr.is_critical;97909791return require_hard_reset;9792}97939794static int gaudi2_handle_hbm_cattrip(struct hl_device *hdev, u16 event_type,9795u64 intr_cause_data)9796{9797if (intr_cause_data) {9798gaudi2_print_event(hdev, event_type, true,9799"temperature error cause: %#llx", intr_cause_data);9800return 1;9801}98029803return 0;9804}98059806static int gaudi2_handle_hbm_mc_spi(struct hl_device *hdev, u64 intr_cause_data)9807{9808u32 i, error_count = 0;98099810for (i = 0 ; i < GAUDI2_NUM_OF_HBM_MC_SPI_CAUSE ; i++)9811if (intr_cause_data & hbm_mc_spi[i].mask) {9812dev_dbg(hdev->dev, "HBM spi event: notification cause(%s)\n",9813hbm_mc_spi[i].cause);9814error_count++;9815}98169817return error_count;9818}98199820static void gaudi2_print_clk_change_info(struct hl_device *hdev, u16 event_type, u64 *event_mask)9821{9822ktime_t zero_time = ktime_set(0, 0);98239824mutex_lock(&hdev->clk_throttling.lock);98259826switch (event_type) {9827case GAUDI2_EVENT_CPU_FIX_POWER_ENV_S:9828hdev->clk_throttling.current_reason |= HL_CLK_THROTTLE_POWER;9829hdev->clk_throttling.aggregated_reason |= HL_CLK_THROTTLE_POWER;9830hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_POWER].start = ktime_get();9831hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_POWER].end = zero_time;9832dev_dbg_ratelimited(hdev->dev, "Clock throttling due to power consumption\n");9833break;98349835case GAUDI2_EVENT_CPU_FIX_POWER_ENV_E:9836hdev->clk_throttling.current_reason &= ~HL_CLK_THROTTLE_POWER;9837hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_POWER].end = ktime_get();9838dev_dbg_ratelimited(hdev->dev, "Power envelop is safe, back to optimal clock\n");9839break;98409841case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_S:9842hdev->clk_throttling.current_reason |= HL_CLK_THROTTLE_THERMAL;9843hdev->clk_throttling.aggregated_reason |= HL_CLK_THROTTLE_THERMAL;9844hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_THERMAL].start = ktime_get();9845hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_THERMAL].end = zero_time;9846*event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9847dev_info_ratelimited(hdev->dev, "Clock throttling due to overheating\n");9848break;98499850case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_E:9851hdev->clk_throttling.current_reason &= ~HL_CLK_THROTTLE_THERMAL;9852hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_THERMAL].end = ktime_get();9853*event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9854dev_info_ratelimited(hdev->dev, "Thermal envelop is safe, back to optimal clock\n");9855break;98569857default:9858dev_err(hdev->dev, "Received invalid clock change event %d\n", event_type);9859break;9860}98619862mutex_unlock(&hdev->clk_throttling.lock);9863}98649865static void gaudi2_print_out_of_sync_info(struct hl_device *hdev, u16 event_type,9866struct cpucp_pkt_sync_err *sync_err)9867{9868struct hl_hw_queue *q = &hdev->kernel_queues[GAUDI2_QUEUE_ID_CPU_PQ];98699870gaudi2_print_event(hdev, event_type, false,9871"FW: pi=%u, ci=%u, LKD: pi=%u, ci=%d",9872le32_to_cpu(sync_err->pi), le32_to_cpu(sync_err->ci),9873q->pi, atomic_read(&q->ci));9874}98759876static int gaudi2_handle_pcie_p2p_msix(struct hl_device *hdev, u16 event_type)9877{9878u32 p2p_intr, msix_gw_intr, error_count = 0;98799880p2p_intr = RREG32(mmPCIE_WRAP_P2P_INTR);9881msix_gw_intr = RREG32(mmPCIE_WRAP_MSIX_GW_INTR);98829883if (p2p_intr) {9884gaudi2_print_event(hdev, event_type, true,9885"pcie p2p transaction terminated due to security, req_id(0x%x)",9886RREG32(mmPCIE_WRAP_P2P_REQ_ID));98879888WREG32(mmPCIE_WRAP_P2P_INTR, 0x1);9889error_count++;9890}98919892if (msix_gw_intr) {9893gaudi2_print_event(hdev, event_type, true,9894"pcie msi-x gen denied due to vector num check failure, vec(0x%X)",9895RREG32(mmPCIE_WRAP_MSIX_GW_VEC));98969897WREG32(mmPCIE_WRAP_MSIX_GW_INTR, 0x1);9898error_count++;9899}99009901return error_count;9902}99039904static int gaudi2_handle_pcie_drain(struct hl_device *hdev,9905struct hl_eq_pcie_drain_ind_data *drain_data)9906{9907u64 cause, error_count = 0;99089909cause = le64_to_cpu(drain_data->intr_cause.intr_cause_data);99109911if (cause & BIT_ULL(0)) {9912dev_err_ratelimited(hdev->dev, "PCIE AXI drain LBW completed\n");9913error_count++;9914}99159916if (cause & BIT_ULL(1)) {9917dev_err_ratelimited(hdev->dev, "PCIE AXI drain HBW completed\n");9918error_count++;9919}99209921return error_count;9922}99239924static int gaudi2_handle_psoc_drain(struct hl_device *hdev, u64 intr_cause_data)9925{9926u32 error_count = 0;9927int i;99289929for (i = 0 ; i < GAUDI2_NUM_OF_AXI_DRAIN_ERR_CAUSE ; i++) {9930if (intr_cause_data & BIT_ULL(i)) {9931dev_err_ratelimited(hdev->dev, "PSOC %s completed\n",9932gaudi2_psoc_axi_drain_interrupts_cause[i]);9933error_count++;9934}9935}99369937hl_check_for_glbl_errors(hdev);99389939return error_count;9940}99419942static void gaudi2_print_cpu_pkt_failure_info(struct hl_device *hdev, u16 event_type,9943struct cpucp_pkt_sync_err *sync_err)9944{9945struct hl_hw_queue *q = &hdev->kernel_queues[GAUDI2_QUEUE_ID_CPU_PQ];99469947gaudi2_print_event(hdev, event_type, false,9948"FW reported sanity check failure, FW: pi=%u, ci=%u, LKD: pi=%u, ci=%d",9949le32_to_cpu(sync_err->pi), le32_to_cpu(sync_err->ci), q->pi, atomic_read(&q->ci));9950}99519952static int hl_arc_event_handle(struct hl_device *hdev, u16 event_type,9953struct hl_eq_engine_arc_intr_data *data)9954{9955struct hl_engine_arc_dccm_queue_full_irq *q;9956u32 intr_type, engine_id;9957u64 payload;99589959intr_type = le32_to_cpu(data->intr_type);9960engine_id = le32_to_cpu(data->engine_id);9961payload = le64_to_cpu(data->payload);99629963switch (intr_type) {9964case ENGINE_ARC_DCCM_QUEUE_FULL_IRQ:9965q = (struct hl_engine_arc_dccm_queue_full_irq *) &payload;99669967gaudi2_print_event(hdev, event_type, true,9968"ARC DCCM Full event: Eng: %s, Intr_type: %u, Qidx: %u",9969GAUDI2_ENG_ID_TO_STR(engine_id), intr_type, q->queue_index);9970return 1;9971default:9972gaudi2_print_event(hdev, event_type, true, "Unknown ARC event type");9973return 0;9974}9975}99769977static u16 event_id_to_engine_id(struct hl_device *hdev, u16 event_type)9978{9979enum gaudi2_block_types type = GAUDI2_BLOCK_TYPE_MAX;9980u16 index;99819982switch (event_type) {9983case GAUDI2_EVENT_TPC0_AXI_ERR_RSP ... GAUDI2_EVENT_TPC24_AXI_ERR_RSP:9984index = event_type - GAUDI2_EVENT_TPC0_AXI_ERR_RSP;9985type = GAUDI2_BLOCK_TYPE_TPC;9986break;9987case GAUDI2_EVENT_TPC0_QM ... GAUDI2_EVENT_TPC24_QM:9988index = event_type - GAUDI2_EVENT_TPC0_QM;9989type = GAUDI2_BLOCK_TYPE_TPC;9990break;9991case GAUDI2_EVENT_MME0_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE:9992case GAUDI2_EVENT_MME0_SPI_BASE ... GAUDI2_EVENT_MME0_WAP_SOURCE_RESULT_INVALID:9993case GAUDI2_EVENT_MME0_QM:9994index = 0;9995type = GAUDI2_BLOCK_TYPE_MME;9996break;9997case GAUDI2_EVENT_MME1_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE:9998case GAUDI2_EVENT_MME1_SPI_BASE ... GAUDI2_EVENT_MME1_WAP_SOURCE_RESULT_INVALID:9999case GAUDI2_EVENT_MME1_QM:10000index = 1;10001type = GAUDI2_BLOCK_TYPE_MME;10002break;10003case GAUDI2_EVENT_MME2_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME2_CTRL_AXI_ERROR_RESPONSE:10004case GAUDI2_EVENT_MME2_SPI_BASE ... GAUDI2_EVENT_MME2_WAP_SOURCE_RESULT_INVALID:10005case GAUDI2_EVENT_MME2_QM:10006index = 2;10007type = GAUDI2_BLOCK_TYPE_MME;10008break;10009case GAUDI2_EVENT_MME3_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME3_CTRL_AXI_ERROR_RESPONSE:10010case GAUDI2_EVENT_MME3_SPI_BASE ... GAUDI2_EVENT_MME3_WAP_SOURCE_RESULT_INVALID:10011case GAUDI2_EVENT_MME3_QM:10012index = 3;10013type = GAUDI2_BLOCK_TYPE_MME;10014break;10015case GAUDI2_EVENT_KDMA_CH0_AXI_ERR_RSP:10016case GAUDI2_EVENT_KDMA_BM_SPMU:10017case GAUDI2_EVENT_KDMA0_CORE:10018return GAUDI2_ENGINE_ID_KDMA;10019case GAUDI2_EVENT_PDMA_CH0_AXI_ERR_RSP:10020case GAUDI2_EVENT_PDMA0_CORE:10021case GAUDI2_EVENT_PDMA0_BM_SPMU:10022case GAUDI2_EVENT_PDMA0_QM:10023return GAUDI2_ENGINE_ID_PDMA_0;10024case GAUDI2_EVENT_PDMA_CH1_AXI_ERR_RSP:10025case GAUDI2_EVENT_PDMA1_CORE:10026case GAUDI2_EVENT_PDMA1_BM_SPMU:10027case GAUDI2_EVENT_PDMA1_QM:10028return GAUDI2_ENGINE_ID_PDMA_1;10029case GAUDI2_EVENT_DEC0_AXI_ERR_RSPONSE ... GAUDI2_EVENT_DEC9_AXI_ERR_RSPONSE:10030index = event_type - GAUDI2_EVENT_DEC0_AXI_ERR_RSPONSE;10031type = GAUDI2_BLOCK_TYPE_DEC;10032break;10033case GAUDI2_EVENT_DEC0_SPI ... GAUDI2_EVENT_DEC9_BMON_SPMU:10034index = (event_type - GAUDI2_EVENT_DEC0_SPI) >> 1;10035type = GAUDI2_BLOCK_TYPE_DEC;10036break;10037case GAUDI2_EVENT_NIC0_AXI_ERROR_RESPONSE ... GAUDI2_EVENT_NIC11_AXI_ERROR_RESPONSE:10038index = event_type - GAUDI2_EVENT_NIC0_AXI_ERROR_RESPONSE;10039return GAUDI2_ENGINE_ID_NIC0_0 + (index * 2);10040case GAUDI2_EVENT_NIC0_QM0 ... GAUDI2_EVENT_NIC11_QM1:10041index = event_type - GAUDI2_EVENT_NIC0_QM0;10042return GAUDI2_ENGINE_ID_NIC0_0 + index;10043case GAUDI2_EVENT_NIC0_BMON_SPMU ... GAUDI2_EVENT_NIC11_SW_ERROR:10044index = event_type - GAUDI2_EVENT_NIC0_BMON_SPMU;10045return GAUDI2_ENGINE_ID_NIC0_0 + (index * 2);10046case GAUDI2_EVENT_TPC0_BMON_SPMU ... GAUDI2_EVENT_TPC24_KERNEL_ERR:10047index = (event_type - GAUDI2_EVENT_TPC0_BMON_SPMU) >> 1;10048type = GAUDI2_BLOCK_TYPE_TPC;10049break;10050case GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE:10051case GAUDI2_EVENT_ROTATOR0_BMON_SPMU:10052case GAUDI2_EVENT_ROTATOR0_ROT0_QM:10053return GAUDI2_ENGINE_ID_ROT_0;10054case GAUDI2_EVENT_ROTATOR1_AXI_ERROR_RESPONSE:10055case GAUDI2_EVENT_ROTATOR1_BMON_SPMU:10056case GAUDI2_EVENT_ROTATOR1_ROT1_QM:10057return GAUDI2_ENGINE_ID_ROT_1;10058case GAUDI2_EVENT_HDMA0_BM_SPMU:10059case GAUDI2_EVENT_HDMA0_QM:10060case GAUDI2_EVENT_HDMA0_CORE:10061return GAUDI2_DCORE0_ENGINE_ID_EDMA_0;10062case GAUDI2_EVENT_HDMA1_BM_SPMU:10063case GAUDI2_EVENT_HDMA1_QM:10064case GAUDI2_EVENT_HDMA1_CORE:10065return GAUDI2_DCORE0_ENGINE_ID_EDMA_1;10066case GAUDI2_EVENT_HDMA2_BM_SPMU:10067case GAUDI2_EVENT_HDMA2_QM:10068case GAUDI2_EVENT_HDMA2_CORE:10069return GAUDI2_DCORE1_ENGINE_ID_EDMA_0;10070case GAUDI2_EVENT_HDMA3_BM_SPMU:10071case GAUDI2_EVENT_HDMA3_QM:10072case GAUDI2_EVENT_HDMA3_CORE:10073return GAUDI2_DCORE1_ENGINE_ID_EDMA_1;10074case GAUDI2_EVENT_HDMA4_BM_SPMU:10075case GAUDI2_EVENT_HDMA4_QM:10076case GAUDI2_EVENT_HDMA4_CORE:10077return GAUDI2_DCORE2_ENGINE_ID_EDMA_0;10078case GAUDI2_EVENT_HDMA5_BM_SPMU:10079case GAUDI2_EVENT_HDMA5_QM:10080case GAUDI2_EVENT_HDMA5_CORE:10081return GAUDI2_DCORE2_ENGINE_ID_EDMA_1;10082case GAUDI2_EVENT_HDMA6_BM_SPMU:10083case GAUDI2_EVENT_HDMA6_QM:10084case GAUDI2_EVENT_HDMA6_CORE:10085return GAUDI2_DCORE3_ENGINE_ID_EDMA_0;10086case GAUDI2_EVENT_HDMA7_BM_SPMU:10087case GAUDI2_EVENT_HDMA7_QM:10088case GAUDI2_EVENT_HDMA7_CORE:10089return GAUDI2_DCORE3_ENGINE_ID_EDMA_1;10090default:10091break;10092}1009310094switch (type) {10095case GAUDI2_BLOCK_TYPE_TPC:10096switch (index) {10097case TPC_ID_DCORE0_TPC0 ... TPC_ID_DCORE0_TPC5:10098return GAUDI2_DCORE0_ENGINE_ID_TPC_0 + index;10099case TPC_ID_DCORE1_TPC0 ... TPC_ID_DCORE1_TPC5:10100return GAUDI2_DCORE1_ENGINE_ID_TPC_0 + index - TPC_ID_DCORE1_TPC0;10101case TPC_ID_DCORE2_TPC0 ... TPC_ID_DCORE2_TPC5:10102return GAUDI2_DCORE2_ENGINE_ID_TPC_0 + index - TPC_ID_DCORE2_TPC0;10103case TPC_ID_DCORE3_TPC0 ... TPC_ID_DCORE3_TPC5:10104return GAUDI2_DCORE3_ENGINE_ID_TPC_0 + index - TPC_ID_DCORE3_TPC0;10105default:10106break;10107}10108break;10109case GAUDI2_BLOCK_TYPE_MME:10110switch (index) {10111case MME_ID_DCORE0: return GAUDI2_DCORE0_ENGINE_ID_MME;10112case MME_ID_DCORE1: return GAUDI2_DCORE1_ENGINE_ID_MME;10113case MME_ID_DCORE2: return GAUDI2_DCORE2_ENGINE_ID_MME;10114case MME_ID_DCORE3: return GAUDI2_DCORE3_ENGINE_ID_MME;10115default:10116break;10117}10118break;10119case GAUDI2_BLOCK_TYPE_DEC:10120switch (index) {10121case DEC_ID_DCORE0_DEC0: return GAUDI2_DCORE0_ENGINE_ID_DEC_0;10122case DEC_ID_DCORE0_DEC1: return GAUDI2_DCORE0_ENGINE_ID_DEC_1;10123case DEC_ID_DCORE1_DEC0: return GAUDI2_DCORE1_ENGINE_ID_DEC_0;10124case DEC_ID_DCORE1_DEC1: return GAUDI2_DCORE1_ENGINE_ID_DEC_1;10125case DEC_ID_DCORE2_DEC0: return GAUDI2_DCORE2_ENGINE_ID_DEC_0;10126case DEC_ID_DCORE2_DEC1: return GAUDI2_DCORE2_ENGINE_ID_DEC_1;10127case DEC_ID_DCORE3_DEC0: return GAUDI2_DCORE3_ENGINE_ID_DEC_0;10128case DEC_ID_DCORE3_DEC1: return GAUDI2_DCORE3_ENGINE_ID_DEC_1;10129case DEC_ID_PCIE_VDEC0: return GAUDI2_PCIE_ENGINE_ID_DEC_0;10130case DEC_ID_PCIE_VDEC1: return GAUDI2_PCIE_ENGINE_ID_DEC_1;10131default:10132break;10133}10134break;10135default:10136break;10137}1013810139return U16_MAX;10140}1014110142static void gaudi2_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entry)10143{10144struct gaudi2_device *gaudi2 = hdev->asic_specific;10145bool reset_required = false, is_critical = false;10146u32 index, ctl, reset_flags = 0, error_count = 0;10147u64 event_mask = 0;10148u16 event_type;1014910150ctl = le32_to_cpu(eq_entry->hdr.ctl);10151event_type = ((ctl & EQ_CTL_EVENT_TYPE_MASK) >> EQ_CTL_EVENT_TYPE_SHIFT);1015210153if (event_type >= GAUDI2_EVENT_SIZE) {10154dev_err(hdev->dev, "Event type %u exceeds maximum of %u",10155event_type, GAUDI2_EVENT_SIZE - 1);10156return;10157}1015810159gaudi2->events_stat[event_type]++;10160gaudi2->events_stat_aggregate[event_type]++;1016110162switch (event_type) {10163case GAUDI2_EVENT_PCIE_CORE_SERR ... GAUDI2_EVENT_ARC0_ECC_DERR:10164fallthrough;10165case GAUDI2_EVENT_ROTATOR0_SERR ... GAUDI2_EVENT_ROTATOR1_DERR:10166reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10167event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10168reset_required = gaudi2_handle_ecc_event(hdev, event_type, &eq_entry->ecc_data);10169is_critical = eq_entry->ecc_data.is_critical;10170error_count++;10171break;1017210173case GAUDI2_EVENT_TPC0_QM ... GAUDI2_EVENT_PDMA1_QM:10174fallthrough;10175case GAUDI2_EVENT_ROTATOR0_ROT0_QM ... GAUDI2_EVENT_ROTATOR1_ROT1_QM:10176fallthrough;10177case GAUDI2_EVENT_NIC0_QM0 ... GAUDI2_EVENT_NIC11_QM1:10178error_count = gaudi2_handle_qman_err(hdev, event_type, &event_mask);10179event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10180break;1018110182case GAUDI2_EVENT_ARC_AXI_ERROR_RESPONSE_0:10183error_count = gaudi2_handle_arc_farm_sei_err(hdev, event_type, &event_mask);10184event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10185break;1018610187case GAUDI2_EVENT_CPU_AXI_ERR_RSP:10188error_count = gaudi2_handle_cpu_sei_err(hdev, event_type);10189reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10190event_mask |= HL_NOTIFIER_EVENT_CRITICL_FW_ERR;10191break;1019210193case GAUDI2_EVENT_PDMA_CH0_AXI_ERR_RSP:10194case GAUDI2_EVENT_PDMA_CH1_AXI_ERR_RSP:10195error_count = gaudi2_handle_qm_sei_err(hdev, event_type, true, &event_mask);10196event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10197break;1019810199case GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE:10200case GAUDI2_EVENT_ROTATOR1_AXI_ERROR_RESPONSE:10201index = event_type - GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE;10202error_count = gaudi2_handle_rot_err(hdev, index, event_type,10203&eq_entry->razwi_with_intr_cause, &event_mask);10204error_count += gaudi2_handle_qm_sei_err(hdev, event_type, false, &event_mask);10205event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10206break;1020710208case GAUDI2_EVENT_TPC0_AXI_ERR_RSP ... GAUDI2_EVENT_TPC24_AXI_ERR_RSP:10209index = event_type - GAUDI2_EVENT_TPC0_AXI_ERR_RSP;10210error_count = gaudi2_tpc_ack_interrupts(hdev, index, event_type,10211&eq_entry->razwi_with_intr_cause, &event_mask);10212error_count += gaudi2_handle_qm_sei_err(hdev, event_type, false, &event_mask);10213event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10214break;1021510216case GAUDI2_EVENT_DEC0_AXI_ERR_RSPONSE ... GAUDI2_EVENT_DEC9_AXI_ERR_RSPONSE:10217index = event_type - GAUDI2_EVENT_DEC0_AXI_ERR_RSPONSE;10218error_count = gaudi2_handle_dec_err(hdev, index, event_type, &event_mask);10219event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10220break;1022110222case GAUDI2_EVENT_TPC0_KERNEL_ERR:10223case GAUDI2_EVENT_TPC1_KERNEL_ERR:10224case GAUDI2_EVENT_TPC2_KERNEL_ERR:10225case GAUDI2_EVENT_TPC3_KERNEL_ERR:10226case GAUDI2_EVENT_TPC4_KERNEL_ERR:10227case GAUDI2_EVENT_TPC5_KERNEL_ERR:10228case GAUDI2_EVENT_TPC6_KERNEL_ERR:10229case GAUDI2_EVENT_TPC7_KERNEL_ERR:10230case GAUDI2_EVENT_TPC8_KERNEL_ERR:10231case GAUDI2_EVENT_TPC9_KERNEL_ERR:10232case GAUDI2_EVENT_TPC10_KERNEL_ERR:10233case GAUDI2_EVENT_TPC11_KERNEL_ERR:10234case GAUDI2_EVENT_TPC12_KERNEL_ERR:10235case GAUDI2_EVENT_TPC13_KERNEL_ERR:10236case GAUDI2_EVENT_TPC14_KERNEL_ERR:10237case GAUDI2_EVENT_TPC15_KERNEL_ERR:10238case GAUDI2_EVENT_TPC16_KERNEL_ERR:10239case GAUDI2_EVENT_TPC17_KERNEL_ERR:10240case GAUDI2_EVENT_TPC18_KERNEL_ERR:10241case GAUDI2_EVENT_TPC19_KERNEL_ERR:10242case GAUDI2_EVENT_TPC20_KERNEL_ERR:10243case GAUDI2_EVENT_TPC21_KERNEL_ERR:10244case GAUDI2_EVENT_TPC22_KERNEL_ERR:10245case GAUDI2_EVENT_TPC23_KERNEL_ERR:10246case GAUDI2_EVENT_TPC24_KERNEL_ERR:10247index = (event_type - GAUDI2_EVENT_TPC0_KERNEL_ERR) /10248(GAUDI2_EVENT_TPC1_KERNEL_ERR - GAUDI2_EVENT_TPC0_KERNEL_ERR);10249error_count = gaudi2_tpc_ack_interrupts(hdev, index, event_type,10250&eq_entry->razwi_with_intr_cause, &event_mask);10251event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10252break;1025310254case GAUDI2_EVENT_DEC0_SPI:10255case GAUDI2_EVENT_DEC1_SPI:10256case GAUDI2_EVENT_DEC2_SPI:10257case GAUDI2_EVENT_DEC3_SPI:10258case GAUDI2_EVENT_DEC4_SPI:10259case GAUDI2_EVENT_DEC5_SPI:10260case GAUDI2_EVENT_DEC6_SPI:10261case GAUDI2_EVENT_DEC7_SPI:10262case GAUDI2_EVENT_DEC8_SPI:10263case GAUDI2_EVENT_DEC9_SPI:10264index = (event_type - GAUDI2_EVENT_DEC0_SPI) /10265(GAUDI2_EVENT_DEC1_SPI - GAUDI2_EVENT_DEC0_SPI);10266error_count = gaudi2_handle_dec_err(hdev, index, event_type, &event_mask);10267event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10268break;1026910270case GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE:10271case GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE:10272case GAUDI2_EVENT_MME2_CTRL_AXI_ERROR_RESPONSE:10273case GAUDI2_EVENT_MME3_CTRL_AXI_ERROR_RESPONSE:10274index = (event_type - GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE) /10275(GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE -10276GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE);10277error_count = gaudi2_handle_mme_err(hdev, index, event_type, &event_mask);10278error_count += gaudi2_handle_qm_sei_err(hdev, event_type, false, &event_mask);10279event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10280break;1028110282case GAUDI2_EVENT_MME0_QMAN_SW_ERROR:10283case GAUDI2_EVENT_MME1_QMAN_SW_ERROR:10284case GAUDI2_EVENT_MME2_QMAN_SW_ERROR:10285case GAUDI2_EVENT_MME3_QMAN_SW_ERROR:10286index = (event_type - GAUDI2_EVENT_MME0_QMAN_SW_ERROR) /10287(GAUDI2_EVENT_MME1_QMAN_SW_ERROR -10288GAUDI2_EVENT_MME0_QMAN_SW_ERROR);10289error_count = gaudi2_handle_mme_err(hdev, index, event_type, &event_mask);10290event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10291break;1029210293case GAUDI2_EVENT_MME0_WAP_SOURCE_RESULT_INVALID:10294case GAUDI2_EVENT_MME1_WAP_SOURCE_RESULT_INVALID:10295case GAUDI2_EVENT_MME2_WAP_SOURCE_RESULT_INVALID:10296case GAUDI2_EVENT_MME3_WAP_SOURCE_RESULT_INVALID:10297index = (event_type - GAUDI2_EVENT_MME0_WAP_SOURCE_RESULT_INVALID) /10298(GAUDI2_EVENT_MME1_WAP_SOURCE_RESULT_INVALID -10299GAUDI2_EVENT_MME0_WAP_SOURCE_RESULT_INVALID);10300error_count = gaudi2_handle_mme_wap_err(hdev, index, event_type, &event_mask);10301event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10302break;1030310304case GAUDI2_EVENT_KDMA_CH0_AXI_ERR_RSP:10305case GAUDI2_EVENT_KDMA0_CORE:10306error_count = gaudi2_handle_kdma_core_event(hdev, event_type,10307le64_to_cpu(eq_entry->intr_cause.intr_cause_data));10308event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10309break;1031010311case GAUDI2_EVENT_HDMA2_CORE ... GAUDI2_EVENT_HDMA5_CORE:10312error_count = gaudi2_handle_dma_core_event(hdev, event_type,10313le64_to_cpu(eq_entry->intr_cause.intr_cause_data));10314event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10315break;1031610317case GAUDI2_EVENT_PDMA0_CORE ... GAUDI2_EVENT_PDMA1_CORE:10318error_count = gaudi2_handle_dma_core_event(hdev, event_type,10319le64_to_cpu(eq_entry->intr_cause.intr_cause_data));10320event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10321break;1032210323case GAUDI2_EVENT_PCIE_ADDR_DEC_ERR:10324error_count = gaudi2_print_pcie_addr_dec_info(hdev, event_type,10325le64_to_cpu(eq_entry->intr_cause.intr_cause_data), &event_mask);10326reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10327event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10328break;1032910330case GAUDI2_EVENT_HMMU0_PAGE_FAULT_OR_WR_PERM ... GAUDI2_EVENT_HMMU12_SECURITY_ERROR:10331case GAUDI2_EVENT_HMMU_0_AXI_ERR_RSP ... GAUDI2_EVENT_HMMU_12_AXI_ERR_RSP:10332case GAUDI2_EVENT_PMMU0_PAGE_FAULT_WR_PERM ... GAUDI2_EVENT_PMMU0_SECURITY_ERROR:10333case GAUDI2_EVENT_PMMU_AXI_ERR_RSP_0:10334error_count = gaudi2_handle_mmu_spi_sei_err(hdev, event_type, &event_mask);10335reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10336event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10337break;1033810339case GAUDI2_EVENT_HIF0_FATAL ... GAUDI2_EVENT_HIF12_FATAL:10340error_count = gaudi2_handle_hif_fatal(hdev, event_type,10341le64_to_cpu(eq_entry->intr_cause.intr_cause_data));10342reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10343event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10344break;1034510346case GAUDI2_EVENT_PMMU_FATAL_0:10347error_count = gaudi2_handle_pif_fatal(hdev, event_type,10348le64_to_cpu(eq_entry->intr_cause.intr_cause_data));10349reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10350event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10351break;1035210353case GAUDI2_EVENT_PSOC63_RAZWI_OR_PID_MIN_MAX_INTERRUPT:10354error_count = gaudi2_ack_psoc_razwi_event_handler(hdev, &event_mask);10355event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10356break;1035710358case GAUDI2_EVENT_HBM0_MC0_SEI_SEVERE ... GAUDI2_EVENT_HBM5_MC1_SEI_NON_SEVERE:10359event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10360if (gaudi2_handle_hbm_mc_sei_err(hdev, event_type, &eq_entry->sei_data)) {10361reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10362reset_required = true;10363is_critical = eq_entry->sei_data.hdr.is_critical;10364}10365error_count++;10366break;1036710368case GAUDI2_EVENT_HBM_CATTRIP_0 ... GAUDI2_EVENT_HBM_CATTRIP_5:10369error_count = gaudi2_handle_hbm_cattrip(hdev, event_type,10370le64_to_cpu(eq_entry->intr_cause.intr_cause_data));10371event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10372break;1037310374case GAUDI2_EVENT_HBM0_MC0_SPI ... GAUDI2_EVENT_HBM5_MC1_SPI:10375error_count = gaudi2_handle_hbm_mc_spi(hdev,10376le64_to_cpu(eq_entry->intr_cause.intr_cause_data));10377event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10378break;1037910380case GAUDI2_EVENT_PCIE_DRAIN_COMPLETE:10381error_count = gaudi2_handle_pcie_drain(hdev, &eq_entry->pcie_drain_ind_data);10382reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10383event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10384if (hl_fw_version_cmp(hdev, 1, 13, 0) >= 0)10385is_critical = true;10386break;1038710388case GAUDI2_EVENT_PSOC59_RPM_ERROR_OR_DRAIN:10389error_count = gaudi2_handle_psoc_drain(hdev,10390le64_to_cpu(eq_entry->intr_cause.intr_cause_data));10391reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10392event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10393break;1039410395case GAUDI2_EVENT_CPU_AXI_ECC:10396error_count = GAUDI2_NA_EVENT_CAUSE;10397reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10398event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10399break;10400case GAUDI2_EVENT_CPU_L2_RAM_ECC:10401error_count = GAUDI2_NA_EVENT_CAUSE;10402reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10403event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10404break;10405case GAUDI2_EVENT_MME0_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME0_SBTE4_AXI_ERR_RSP:10406case GAUDI2_EVENT_MME1_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME1_SBTE4_AXI_ERR_RSP:10407case GAUDI2_EVENT_MME2_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME2_SBTE4_AXI_ERR_RSP:10408case GAUDI2_EVENT_MME3_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME3_SBTE4_AXI_ERR_RSP:10409error_count = gaudi2_handle_mme_sbte_err(hdev, event_type);10410event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10411break;10412case GAUDI2_EVENT_VM0_ALARM_A ... GAUDI2_EVENT_VM3_ALARM_B:10413error_count = GAUDI2_NA_EVENT_CAUSE;10414reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10415event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10416break;10417case GAUDI2_EVENT_PSOC_AXI_ERR_RSP:10418error_count = GAUDI2_NA_EVENT_CAUSE;10419reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10420event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10421break;10422case GAUDI2_EVENT_PSOC_PRSTN_FALL:10423error_count = GAUDI2_NA_EVENT_CAUSE;10424event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10425break;10426case GAUDI2_EVENT_PCIE_APB_TIMEOUT:10427error_count = GAUDI2_NA_EVENT_CAUSE;10428reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10429event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10430break;10431case GAUDI2_EVENT_PCIE_FATAL_ERR:10432error_count = GAUDI2_NA_EVENT_CAUSE;10433reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10434event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10435break;10436case GAUDI2_EVENT_TPC0_BMON_SPMU:10437case GAUDI2_EVENT_TPC1_BMON_SPMU:10438case GAUDI2_EVENT_TPC2_BMON_SPMU:10439case GAUDI2_EVENT_TPC3_BMON_SPMU:10440case GAUDI2_EVENT_TPC4_BMON_SPMU:10441case GAUDI2_EVENT_TPC5_BMON_SPMU:10442case GAUDI2_EVENT_TPC6_BMON_SPMU:10443case GAUDI2_EVENT_TPC7_BMON_SPMU:10444case GAUDI2_EVENT_TPC8_BMON_SPMU:10445case GAUDI2_EVENT_TPC9_BMON_SPMU:10446case GAUDI2_EVENT_TPC10_BMON_SPMU:10447case GAUDI2_EVENT_TPC11_BMON_SPMU:10448case GAUDI2_EVENT_TPC12_BMON_SPMU:10449case GAUDI2_EVENT_TPC13_BMON_SPMU:10450case GAUDI2_EVENT_TPC14_BMON_SPMU:10451case GAUDI2_EVENT_TPC15_BMON_SPMU:10452case GAUDI2_EVENT_TPC16_BMON_SPMU:10453case GAUDI2_EVENT_TPC17_BMON_SPMU:10454case GAUDI2_EVENT_TPC18_BMON_SPMU:10455case GAUDI2_EVENT_TPC19_BMON_SPMU:10456case GAUDI2_EVENT_TPC20_BMON_SPMU:10457case GAUDI2_EVENT_TPC21_BMON_SPMU:10458case GAUDI2_EVENT_TPC22_BMON_SPMU:10459case GAUDI2_EVENT_TPC23_BMON_SPMU:10460case GAUDI2_EVENT_TPC24_BMON_SPMU:10461case GAUDI2_EVENT_MME0_CTRL_BMON_SPMU:10462case GAUDI2_EVENT_MME0_SBTE_BMON_SPMU:10463case GAUDI2_EVENT_MME0_WAP_BMON_SPMU:10464case GAUDI2_EVENT_MME1_CTRL_BMON_SPMU:10465case GAUDI2_EVENT_MME1_SBTE_BMON_SPMU:10466case GAUDI2_EVENT_MME1_WAP_BMON_SPMU:10467case GAUDI2_EVENT_MME2_CTRL_BMON_SPMU:10468case GAUDI2_EVENT_MME2_SBTE_BMON_SPMU:10469case GAUDI2_EVENT_MME2_WAP_BMON_SPMU:10470case GAUDI2_EVENT_MME3_CTRL_BMON_SPMU:10471case GAUDI2_EVENT_MME3_SBTE_BMON_SPMU:10472case GAUDI2_EVENT_MME3_WAP_BMON_SPMU:10473case GAUDI2_EVENT_HDMA2_BM_SPMU ... GAUDI2_EVENT_PDMA1_BM_SPMU:10474fallthrough;10475case GAUDI2_EVENT_DEC0_BMON_SPMU:10476case GAUDI2_EVENT_DEC1_BMON_SPMU:10477case GAUDI2_EVENT_DEC2_BMON_SPMU:10478case GAUDI2_EVENT_DEC3_BMON_SPMU:10479case GAUDI2_EVENT_DEC4_BMON_SPMU:10480case GAUDI2_EVENT_DEC5_BMON_SPMU:10481case GAUDI2_EVENT_DEC6_BMON_SPMU:10482case GAUDI2_EVENT_DEC7_BMON_SPMU:10483case GAUDI2_EVENT_DEC8_BMON_SPMU:10484case GAUDI2_EVENT_DEC9_BMON_SPMU:10485case GAUDI2_EVENT_ROTATOR0_BMON_SPMU ... GAUDI2_EVENT_SM3_BMON_SPMU:10486error_count = GAUDI2_NA_EVENT_CAUSE;10487event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10488break;1048910490case GAUDI2_EVENT_CPU_FIX_POWER_ENV_S:10491case GAUDI2_EVENT_CPU_FIX_POWER_ENV_E:10492case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_S:10493case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_E:10494gaudi2_print_clk_change_info(hdev, event_type, &event_mask);10495error_count = GAUDI2_NA_EVENT_CAUSE;10496break;1049710498case GAUDI2_EVENT_CPU_PKT_QUEUE_OUT_SYNC:10499gaudi2_print_out_of_sync_info(hdev, event_type, &eq_entry->pkt_sync_err);10500error_count = GAUDI2_NA_EVENT_CAUSE;10501reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10502event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10503break;1050410505case GAUDI2_EVENT_PCIE_FLR_REQUESTED:10506event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10507error_count = GAUDI2_NA_EVENT_CAUSE;10508/* Do nothing- FW will handle it */10509break;1051010511case GAUDI2_EVENT_PCIE_P2P_MSIX:10512error_count = gaudi2_handle_pcie_p2p_msix(hdev, event_type);10513event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10514break;1051510516case GAUDI2_EVENT_SM0_AXI_ERROR_RESPONSE ... GAUDI2_EVENT_SM3_AXI_ERROR_RESPONSE:10517index = event_type - GAUDI2_EVENT_SM0_AXI_ERROR_RESPONSE;10518error_count = gaudi2_handle_sm_err(hdev, event_type, index);10519event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10520break;1052110522case GAUDI2_EVENT_PSOC_MME_PLL_LOCK_ERR ... GAUDI2_EVENT_DCORE2_HBM_PLL_LOCK_ERR:10523error_count = GAUDI2_NA_EVENT_CAUSE;10524event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10525break;1052610527case GAUDI2_EVENT_CPU_CPLD_SHUTDOWN_CAUSE:10528dev_info(hdev->dev, "CPLD shutdown cause, reset reason: 0x%llx\n",10529le64_to_cpu(eq_entry->data[0]));10530error_count = GAUDI2_NA_EVENT_CAUSE;10531event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10532break;10533case GAUDI2_EVENT_CPU_CPLD_SHUTDOWN_EVENT:10534dev_err(hdev->dev, "CPLD shutdown event, reset reason: 0x%llx\n",10535le64_to_cpu(eq_entry->data[0]));10536error_count = GAUDI2_NA_EVENT_CAUSE;10537hl_eq_cpld_shutdown_event_handle(hdev, event_type, &event_mask);10538break;1053910540case GAUDI2_EVENT_CPU_PKT_SANITY_FAILED:10541gaudi2_print_cpu_pkt_failure_info(hdev, event_type, &eq_entry->pkt_sync_err);10542error_count = GAUDI2_NA_EVENT_CAUSE;10543reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10544event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10545break;1054610547case GAUDI2_EVENT_ARC_DCCM_FULL:10548error_count = hl_arc_event_handle(hdev, event_type, &eq_entry->arc_data);10549event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10550break;1055110552case GAUDI2_EVENT_CPU_FP32_NOT_SUPPORTED:10553case GAUDI2_EVENT_CPU_DEV_RESET_REQ:10554event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10555error_count = GAUDI2_NA_EVENT_CAUSE;10556is_critical = true;10557break;1055810559case GAUDI2_EVENT_ARC_PWR_BRK_ENTRY:10560case GAUDI2_EVENT_ARC_PWR_BRK_EXT:10561case GAUDI2_EVENT_ARC_PWR_RD_MODE0:10562case GAUDI2_EVENT_ARC_PWR_RD_MODE1:10563case GAUDI2_EVENT_ARC_PWR_RD_MODE2:10564case GAUDI2_EVENT_ARC_PWR_RD_MODE3:10565error_count = GAUDI2_NA_EVENT_CAUSE;10566dev_info_ratelimited(hdev->dev, "%s event received\n",10567gaudi2_irq_map_table[event_type].name);10568break;1056910570case GAUDI2_EVENT_ARC_EQ_HEARTBEAT:10571hl_eq_heartbeat_event_handle(hdev);10572error_count = GAUDI2_NA_EVENT_CAUSE;10573break;10574default:10575if (gaudi2_irq_map_table[event_type].valid) {10576dev_err_ratelimited(hdev->dev, "Cannot find handler for event %d\n",10577event_type);10578error_count = GAUDI2_NA_EVENT_CAUSE;10579}10580}1058110582if (event_mask & HL_NOTIFIER_EVENT_USER_ENGINE_ERR)10583hl_capture_engine_err(hdev, event_id_to_engine_id(hdev, event_type), error_count);1058410585/* Make sure to dump an error in case no error cause was printed so far.10586* Note that although we have counted the errors, we use this number as10587* a boolean.10588*/10589if (error_count == GAUDI2_NA_EVENT_CAUSE && !is_info_event(event_type))10590gaudi2_print_event(hdev, event_type, true, "%d", event_type);10591else if (error_count == 0)10592gaudi2_print_event(hdev, event_type, true,10593"No error cause for H/W event %u", event_type);1059410595if ((gaudi2_irq_map_table[event_type].reset != EVENT_RESET_TYPE_NONE) || reset_required) {10596if (reset_required ||10597(gaudi2_irq_map_table[event_type].reset == EVENT_RESET_TYPE_HARD))10598reset_flags |= HL_DRV_RESET_HARD;1059910600if (hdev->hard_reset_on_fw_events ||10601(hdev->asic_prop.fw_security_enabled && is_critical))10602goto reset_device;10603}1060410605/* Send unmask irq only for interrupts not classified as MSG */10606if (!gaudi2_irq_map_table[event_type].msg)10607hl_fw_unmask_irq(hdev, event_type);1060810609if (event_mask)10610hl_notifier_event_send_all(hdev, event_mask);1061110612return;1061310614reset_device:10615if (hdev->asic_prop.fw_security_enabled && is_critical) {10616reset_flags |= HL_DRV_RESET_BYPASS_REQ_TO_FW;10617event_mask |= HL_NOTIFIER_EVENT_DEVICE_UNAVAILABLE;10618} else {10619reset_flags |= HL_DRV_RESET_DELAY;10620}10621/* escalate general hw errors to critical/fatal error */10622if (event_mask & HL_NOTIFIER_EVENT_GENERAL_HW_ERR)10623hl_handle_critical_hw_err(hdev, event_type, &event_mask);1062410625hl_debugfs_cfg_access_history_dump(hdev);10626event_mask |= HL_NOTIFIER_EVENT_DEVICE_RESET;10627hl_device_cond_reset(hdev, reset_flags, event_mask);10628}1062910630static int gaudi2_memset_memory_chunk_using_edma_qm(struct hl_device *hdev,10631struct packet_lin_dma *lin_dma_pkt,10632u64 phys_addr, u32 hw_queue_id, u32 size, u64 addr, u32 val)10633{10634u32 ctl, pkt_size;10635int rc = 0, i;1063610637ctl = FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_LIN_DMA);10638ctl |= FIELD_PREP(GAUDI2_PKT_LIN_DMA_CTL_MEMSET_MASK, 1);10639ctl |= FIELD_PREP(GAUDI2_PKT_LIN_DMA_CTL_WRCOMP_MASK, 1);10640ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, 1);1064110642lin_dma_pkt->ctl = cpu_to_le32(ctl);10643lin_dma_pkt->src_addr = cpu_to_le64(val);10644lin_dma_pkt->dst_addr = cpu_to_le64(addr);10645lin_dma_pkt->tsize = cpu_to_le32(size);1064610647pkt_size = sizeof(struct packet_lin_dma);1064810649for (i = 0; i < 3; i++) {10650rc = hdev->asic_funcs->access_dev_mem(hdev, PCI_REGION_DRAM,10651phys_addr + (i * sizeof(u64)),10652((u64 *)(lin_dma_pkt)) + i, DEBUGFS_WRITE64);10653if (rc) {10654dev_err(hdev->dev, "Failed to copy lin_dma packet to HBM (%#llx)\n",10655phys_addr);10656return rc;10657}10658}1065910660rc = hl_hw_queue_send_cb_no_cmpl(hdev, hw_queue_id, pkt_size, phys_addr);10661if (rc)10662dev_err(hdev->dev, "Failed to send lin_dma packet to H/W queue %s\n",10663GAUDI2_QUEUE_ID_TO_STR(hw_queue_id));1066410665return rc;10666}1066710668static int gaudi2_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size, u64 val)10669{10670u32 edma_queues_id[] = {GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0,10671GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0,10672GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0,10673GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0};10674u32 chunk_size, dcore, edma_idx, sob_offset, sob_addr, comp_val,10675old_mmubp, mmubp, num_of_pkts, busy, pkt_size, cb_len;10676u64 comp_addr, cur_addr = addr, end_addr = addr + size;10677struct asic_fixed_properties *prop = &hdev->asic_prop;10678int rc = 0, dma_num = 0, i;10679void *lin_dma_pkts_arr;1068010681if (prop->edma_enabled_mask == 0) {10682dev_info(hdev->dev, "non of the EDMA engines is enabled - skip dram scrubbing\n");10683return -EIO;10684}1068510686sob_offset = hdev->asic_prop.first_available_user_sob[0] * 4;10687sob_addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;10688comp_addr = CFG_BASE + sob_addr;10689comp_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_INC_MASK, 1) |10690FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_VAL_MASK, 1);10691mmubp = FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_WR_MASK, 1) |10692FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_RD_MASK, 1);1069310694/* Calculate how many lin dma pkts we'll need */10695num_of_pkts = div64_u64(round_up(size, SZ_2G), SZ_2G);10696pkt_size = sizeof(struct packet_lin_dma);10697cb_len = pkt_size * num_of_pkts;1069810699/*10700* if we're not scrubing HMMU or NIC reserved sections in hbm,10701* then it the scrubing of the user section, as we use the start of the user section10702* to store the CB of the EDMA QM, so shift the start address of the scrubbing accordingly10703* and scrub the CB section before leaving this function.10704*/10705if ((addr >= prop->dram_user_base_address) &&10706(addr < prop->dram_user_base_address + cb_len))10707cur_addr += (prop->dram_user_base_address + cb_len) - addr;1070810709lin_dma_pkts_arr = kvcalloc(num_of_pkts, pkt_size, GFP_KERNEL);10710if (!lin_dma_pkts_arr)10711return -ENOMEM;1071210713/*10714* set mmu bypass for the scrubbing - all ddmas are configured the same so save10715* only the first one to restore later10716* also set the sob addr for all edma cores for completion.10717* set QM as trusted to allow it to access physical address with MMU bp.10718*/10719old_mmubp = RREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP);10720for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {10721for (edma_idx = 0 ; edma_idx < NUM_OF_EDMA_PER_DCORE ; edma_idx++) {10722u32 edma_offset = dcore * DCORE_OFFSET + edma_idx * DCORE_EDMA_OFFSET;10723u32 edma_bit = dcore * NUM_OF_EDMA_PER_DCORE + edma_idx;1072410725if (!(prop->edma_enabled_mask & BIT(edma_bit)))10726continue;1072710728WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP +10729edma_offset, mmubp);10730WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_ADDR_LO + edma_offset,10731lower_32_bits(comp_addr));10732WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_ADDR_HI + edma_offset,10733upper_32_bits(comp_addr));10734WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_WDATA + edma_offset,10735comp_val);10736gaudi2_qman_set_test_mode(hdev,10737edma_queues_id[dcore] + 4 * edma_idx, true);10738}10739}1074010741WREG32(sob_addr, 0);1074210743while (cur_addr < end_addr) {10744for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {10745for (edma_idx = 0 ; edma_idx < NUM_OF_EDMA_PER_DCORE ; edma_idx++) {10746u32 edma_bit = dcore * NUM_OF_EDMA_PER_DCORE + edma_idx;1074710748if (!(prop->edma_enabled_mask & BIT(edma_bit)))10749continue;1075010751chunk_size = min_t(u64, SZ_2G, end_addr - cur_addr);1075210753rc = gaudi2_memset_memory_chunk_using_edma_qm(hdev,10754(struct packet_lin_dma *)lin_dma_pkts_arr + dma_num,10755prop->dram_user_base_address + (dma_num * pkt_size),10756edma_queues_id[dcore] + edma_idx * 4,10757chunk_size, cur_addr, val);10758if (rc)10759goto end;1076010761dma_num++;10762cur_addr += chunk_size;10763if (cur_addr == end_addr)10764goto edma_wait;10765}10766}10767}1076810769edma_wait:10770rc = hl_poll_timeout(hdev, sob_addr, busy, (busy == dma_num), 1000, 1000000);10771if (rc) {10772dev_err(hdev->dev, "DMA Timeout during HBM scrubbing(sob: 0x%x, dma_num: 0x%x)\n",10773busy, dma_num);10774goto end;10775}10776end:10777for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {10778for (edma_idx = 0 ; edma_idx < NUM_OF_EDMA_PER_DCORE ; edma_idx++) {10779u32 edma_offset = dcore * DCORE_OFFSET + edma_idx * DCORE_EDMA_OFFSET;10780u32 edma_bit = dcore * NUM_OF_EDMA_PER_DCORE + edma_idx;1078110782if (!(prop->edma_enabled_mask & BIT(edma_bit)))10783continue;1078410785WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP + edma_offset, old_mmubp);10786WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_ADDR_LO + edma_offset, 0);10787WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_ADDR_HI + edma_offset, 0);10788WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_WDATA + edma_offset, 0);10789gaudi2_qman_set_test_mode(hdev,10790edma_queues_id[dcore] + 4 * edma_idx, false);10791}10792}1079310794memset(lin_dma_pkts_arr, 0, sizeof(u64));1079510796/* Zero the HBM area where we copied the CB */10797for (i = 0; i < cb_len / sizeof(u64); i += sizeof(u64))10798rc = hdev->asic_funcs->access_dev_mem(hdev, PCI_REGION_DRAM,10799prop->dram_user_base_address + i,10800(u64 *)(lin_dma_pkts_arr), DEBUGFS_WRITE64);10801WREG32(sob_addr, 0);1080210803kvfree(lin_dma_pkts_arr);1080410805return rc;10806}1080710808static int gaudi2_scrub_device_dram(struct hl_device *hdev, u64 val)10809{10810int rc;10811struct asic_fixed_properties *prop = &hdev->asic_prop;10812u64 size = prop->dram_end_address - prop->dram_user_base_address;1081310814rc = gaudi2_memset_device_memory(hdev, prop->dram_user_base_address, size, val);1081510816if (rc)10817dev_err(hdev->dev, "Failed to scrub dram, address: 0x%llx size: %llu\n",10818prop->dram_user_base_address, size);10819return rc;10820}1082110822static int gaudi2_scrub_device_mem(struct hl_device *hdev)10823{10824int rc;10825struct asic_fixed_properties *prop = &hdev->asic_prop;10826u64 val = hdev->memory_scrub_val;10827u64 addr, size;1082810829if (!hdev->memory_scrub)10830return 0;1083110832/* scrub SRAM */10833addr = prop->sram_user_base_address;10834size = hdev->pldm ? 0x10000 : (prop->sram_size - SRAM_USER_BASE_OFFSET);10835dev_dbg(hdev->dev, "Scrubbing SRAM: 0x%09llx - 0x%09llx, val: 0x%llx\n",10836addr, addr + size, val);10837rc = gaudi2_memset_device_memory(hdev, addr, size, val);10838if (rc) {10839dev_err(hdev->dev, "scrubbing SRAM failed (%d)\n", rc);10840return rc;10841}1084210843/* scrub DRAM */10844rc = gaudi2_scrub_device_dram(hdev, val);10845if (rc) {10846dev_err(hdev->dev, "scrubbing DRAM failed (%d)\n", rc);10847return rc;10848}10849return 0;10850}1085110852static void gaudi2_restore_user_sm_registers(struct hl_device *hdev)10853{10854u64 addr, mon_sts_addr, mon_cfg_addr, cq_lbw_l_addr, cq_lbw_h_addr,10855cq_lbw_data_addr, cq_base_l_addr, cq_base_h_addr, cq_size_addr;10856u32 val, size, offset;10857int dcore_id;1085810859offset = hdev->asic_prop.first_available_cq[0] * 4;10860cq_lbw_l_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0 + offset;10861cq_lbw_h_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 + offset;10862cq_lbw_data_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_DATA_0 + offset;10863cq_base_l_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_L_0 + offset;10864cq_base_h_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_H_0 + offset;10865cq_size_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_SIZE_LOG2_0 + offset;10866size = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 -10867(mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0 + offset);1086810869/* memset dcore0 CQ registers */10870gaudi2_memset_device_lbw(hdev, cq_lbw_l_addr, size, 0);10871gaudi2_memset_device_lbw(hdev, cq_lbw_h_addr, size, 0);10872gaudi2_memset_device_lbw(hdev, cq_lbw_data_addr, size, 0);10873gaudi2_memset_device_lbw(hdev, cq_base_l_addr, size, 0);10874gaudi2_memset_device_lbw(hdev, cq_base_h_addr, size, 0);10875gaudi2_memset_device_lbw(hdev, cq_size_addr, size, 0);1087610877cq_lbw_l_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0 + DCORE_OFFSET;10878cq_lbw_h_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 + DCORE_OFFSET;10879cq_lbw_data_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_DATA_0 + DCORE_OFFSET;10880cq_base_l_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_L_0 + DCORE_OFFSET;10881cq_base_h_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_H_0 + DCORE_OFFSET;10882cq_size_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_SIZE_LOG2_0 + DCORE_OFFSET;10883size = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 - mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0;1088410885for (dcore_id = 1 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {10886gaudi2_memset_device_lbw(hdev, cq_lbw_l_addr, size, 0);10887gaudi2_memset_device_lbw(hdev, cq_lbw_h_addr, size, 0);10888gaudi2_memset_device_lbw(hdev, cq_lbw_data_addr, size, 0);10889gaudi2_memset_device_lbw(hdev, cq_base_l_addr, size, 0);10890gaudi2_memset_device_lbw(hdev, cq_base_h_addr, size, 0);10891gaudi2_memset_device_lbw(hdev, cq_size_addr, size, 0);1089210893cq_lbw_l_addr += DCORE_OFFSET;10894cq_lbw_h_addr += DCORE_OFFSET;10895cq_lbw_data_addr += DCORE_OFFSET;10896cq_base_l_addr += DCORE_OFFSET;10897cq_base_h_addr += DCORE_OFFSET;10898cq_size_addr += DCORE_OFFSET;10899}1090010901offset = hdev->asic_prop.first_available_user_mon[0] * 4;10902addr = mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0 + offset;10903val = 1 << DCORE0_SYNC_MNGR_OBJS_MON_STATUS_PROT_SHIFT;10904size = mmDCORE0_SYNC_MNGR_OBJS_SM_SEC_0 - (mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0 + offset);1090510906/* memset dcore0 monitors */10907gaudi2_memset_device_lbw(hdev, addr, size, val);1090810909addr = mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + offset;10910gaudi2_memset_device_lbw(hdev, addr, size, 0);1091110912mon_sts_addr = mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0 + DCORE_OFFSET;10913mon_cfg_addr = mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + DCORE_OFFSET;10914size = mmDCORE0_SYNC_MNGR_OBJS_SM_SEC_0 - mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0;1091510916for (dcore_id = 1 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {10917gaudi2_memset_device_lbw(hdev, mon_sts_addr, size, val);10918gaudi2_memset_device_lbw(hdev, mon_cfg_addr, size, 0);10919mon_sts_addr += DCORE_OFFSET;10920mon_cfg_addr += DCORE_OFFSET;10921}1092210923offset = hdev->asic_prop.first_available_user_sob[0] * 4;10924addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + offset;10925val = 0;10926size = mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 -10927(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + offset);1092810929/* memset dcore0 sobs */10930gaudi2_memset_device_lbw(hdev, addr, size, val);1093110932addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + DCORE_OFFSET;10933size = mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 - mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0;1093410935for (dcore_id = 1 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {10936gaudi2_memset_device_lbw(hdev, addr, size, val);10937addr += DCORE_OFFSET;10938}1093910940/* Flush all WREG to prevent race */10941val = RREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + offset);10942}1094310944static void gaudi2_restore_user_qm_registers(struct hl_device *hdev)10945{10946u32 reg_base, hw_queue_id;1094710948for (hw_queue_id = GAUDI2_QUEUE_ID_PDMA_0_0 ; hw_queue_id <= GAUDI2_QUEUE_ID_ROT_1_0;10949hw_queue_id += NUM_OF_PQ_PER_QMAN) {10950if (!gaudi2_is_queue_enabled(hdev, hw_queue_id))10951continue;1095210953gaudi2_clear_qm_fence_counters_common(hdev, hw_queue_id, false);1095410955reg_base = gaudi2_qm_blocks_bases[hw_queue_id];10956WREG32(reg_base + QM_ARB_CFG_0_OFFSET, 0);10957}1095810959/* Flush all WREG to prevent race */10960RREG32(mmPDMA0_QM_ARB_CFG_0);10961}1096210963static void gaudi2_restore_nic_qm_registers(struct hl_device *hdev)10964{10965u32 reg_base, hw_queue_id;1096610967for (hw_queue_id = GAUDI2_QUEUE_ID_NIC_0_0 ; hw_queue_id <= GAUDI2_QUEUE_ID_NIC_23_3;10968hw_queue_id += NUM_OF_PQ_PER_QMAN) {10969if (!gaudi2_is_queue_enabled(hdev, hw_queue_id))10970continue;1097110972gaudi2_clear_qm_fence_counters_common(hdev, hw_queue_id, false);1097310974reg_base = gaudi2_qm_blocks_bases[hw_queue_id];10975WREG32(reg_base + QM_ARB_CFG_0_OFFSET, 0);10976}1097710978/* Flush all WREG to prevent race */10979RREG32(mmPDMA0_QM_ARB_CFG_0);10980}1098110982static int gaudi2_context_switch(struct hl_device *hdev, u32 asid)10983{10984return 0;10985}1098610987static void gaudi2_restore_phase_topology(struct hl_device *hdev)10988{10989}1099010991static void gaudi2_init_block_instances(struct hl_device *hdev, u32 block_idx,10992struct dup_block_ctx *cfg_ctx)10993{10994u64 block_base = cfg_ctx->base + block_idx * cfg_ctx->block_off;10995u8 seq;10996int i;1099710998for (i = 0 ; i < cfg_ctx->instances ; i++) {10999seq = block_idx * cfg_ctx->instances + i;1100011001/* skip disabled instance */11002if (!(cfg_ctx->enabled_mask & BIT_ULL(seq)))11003continue;1100411005cfg_ctx->instance_cfg_fn(hdev, block_base + i * cfg_ctx->instance_off,11006cfg_ctx->data);11007}11008}1100911010static void gaudi2_init_blocks_with_mask(struct hl_device *hdev, struct dup_block_ctx *cfg_ctx,11011u64 mask)11012{11013int i;1101411015cfg_ctx->enabled_mask = mask;1101611017for (i = 0 ; i < cfg_ctx->blocks ; i++)11018gaudi2_init_block_instances(hdev, i, cfg_ctx);11019}1102011021void gaudi2_init_blocks(struct hl_device *hdev, struct dup_block_ctx *cfg_ctx)11022{11023gaudi2_init_blocks_with_mask(hdev, cfg_ctx, U64_MAX);11024}1102511026static int gaudi2_debugfs_read_dma(struct hl_device *hdev, u64 addr, u32 size, void *blob_addr)11027{11028void *host_mem_virtual_addr;11029dma_addr_t host_mem_dma_addr;11030u64 reserved_va_base;11031u32 pos, size_left, size_to_dma;11032struct hl_ctx *ctx;11033int rc = 0;1103411035/* Fetch the ctx */11036ctx = hl_get_compute_ctx(hdev);11037if (!ctx) {11038dev_err(hdev->dev, "No ctx available\n");11039return -EINVAL;11040}1104111042/* Allocate buffers for read and for poll */11043host_mem_virtual_addr = hl_asic_dma_alloc_coherent(hdev, SZ_2M, &host_mem_dma_addr,11044GFP_KERNEL | __GFP_ZERO);11045if (host_mem_virtual_addr == NULL) {11046dev_err(hdev->dev, "Failed to allocate memory for KDMA read\n");11047rc = -ENOMEM;11048goto put_ctx;11049}1105011051/* Reserve VM region on asic side */11052reserved_va_base = hl_reserve_va_block(hdev, ctx, HL_VA_RANGE_TYPE_HOST, SZ_2M,11053HL_MMU_VA_ALIGNMENT_NOT_NEEDED);11054if (!reserved_va_base) {11055dev_err(hdev->dev, "Failed to reserve vmem on asic\n");11056rc = -ENOMEM;11057goto free_data_buffer;11058}1105911060/* Create mapping on asic side */11061mutex_lock(&hdev->mmu_lock);1106211063rc = hl_mmu_map_contiguous(ctx, reserved_va_base, host_mem_dma_addr, SZ_2M);11064if (rc) {11065dev_err(hdev->dev, "Failed to create mapping on asic mmu\n");11066goto unreserve_va;11067}1106811069rc = hl_mmu_invalidate_cache_range(hdev, false,11070MMU_OP_USERPTR | MMU_OP_SKIP_LOW_CACHE_INV,11071ctx->asid, reserved_va_base, SZ_2M);11072if (rc) {11073hl_mmu_unmap_contiguous(ctx, reserved_va_base, SZ_2M);11074goto unreserve_va;11075}1107611077mutex_unlock(&hdev->mmu_lock);1107811079/* Enable MMU on KDMA */11080gaudi2_kdma_set_mmbp_asid(hdev, false, ctx->asid);1108111082pos = 0;11083size_left = size;11084size_to_dma = SZ_2M;1108511086while (size_left > 0) {11087if (size_left < SZ_2M)11088size_to_dma = size_left;1108911090rc = gaudi2_send_job_to_kdma(hdev, addr, reserved_va_base, size_to_dma, false);11091if (rc)11092break;1109311094memcpy(blob_addr + pos, host_mem_virtual_addr, size_to_dma);1109511096if (size_left <= SZ_2M)11097break;1109811099pos += SZ_2M;11100addr += SZ_2M;11101size_left -= SZ_2M;11102}1110311104gaudi2_kdma_set_mmbp_asid(hdev, true, HL_KERNEL_ASID_ID);1110511106mutex_lock(&hdev->mmu_lock);1110711108rc = hl_mmu_unmap_contiguous(ctx, reserved_va_base, SZ_2M);11109if (rc)11110goto unreserve_va;1111111112rc = hl_mmu_invalidate_cache_range(hdev, false, MMU_OP_USERPTR,11113ctx->asid, reserved_va_base, SZ_2M);1111411115unreserve_va:11116mutex_unlock(&hdev->mmu_lock);11117hl_unreserve_va_block(hdev, ctx, reserved_va_base, SZ_2M);11118free_data_buffer:11119hl_asic_dma_free_coherent(hdev, SZ_2M, host_mem_virtual_addr, host_mem_dma_addr);11120put_ctx:11121hl_ctx_put(ctx);1112211123return rc;11124}1112511126static int gaudi2_internal_cb_pool_init(struct hl_device *hdev, struct hl_ctx *ctx)11127{11128struct gaudi2_device *gaudi2 = hdev->asic_specific;11129int min_alloc_order, rc;1113011131if (!(gaudi2->hw_cap_initialized & HW_CAP_PMMU))11132return 0;1113311134hdev->internal_cb_pool_virt_addr = hl_asic_dma_alloc_coherent(hdev,11135HOST_SPACE_INTERNAL_CB_SZ,11136&hdev->internal_cb_pool_dma_addr,11137GFP_KERNEL | __GFP_ZERO);1113811139if (!hdev->internal_cb_pool_virt_addr)11140return -ENOMEM;1114111142min_alloc_order = ilog2(min(gaudi2_get_signal_cb_size(hdev),11143gaudi2_get_wait_cb_size(hdev)));1114411145hdev->internal_cb_pool = gen_pool_create(min_alloc_order, -1);11146if (!hdev->internal_cb_pool) {11147dev_err(hdev->dev, "Failed to create internal CB pool\n");11148rc = -ENOMEM;11149goto free_internal_cb_pool;11150}1115111152rc = gen_pool_add(hdev->internal_cb_pool, (uintptr_t) hdev->internal_cb_pool_virt_addr,11153HOST_SPACE_INTERNAL_CB_SZ, -1);11154if (rc) {11155dev_err(hdev->dev, "Failed to add memory to internal CB pool\n");11156rc = -EFAULT;11157goto destroy_internal_cb_pool;11158}1115911160hdev->internal_cb_va_base = hl_reserve_va_block(hdev, ctx, HL_VA_RANGE_TYPE_HOST,11161HOST_SPACE_INTERNAL_CB_SZ, HL_MMU_VA_ALIGNMENT_NOT_NEEDED);1116211163if (!hdev->internal_cb_va_base) {11164rc = -ENOMEM;11165goto destroy_internal_cb_pool;11166}1116711168mutex_lock(&hdev->mmu_lock);1116911170rc = hl_mmu_map_contiguous(ctx, hdev->internal_cb_va_base, hdev->internal_cb_pool_dma_addr,11171HOST_SPACE_INTERNAL_CB_SZ);11172if (rc)11173goto unreserve_internal_cb_pool;1117411175rc = hl_mmu_invalidate_cache(hdev, false, MMU_OP_USERPTR);11176if (rc)11177goto unmap_internal_cb_pool;1117811179mutex_unlock(&hdev->mmu_lock);1118011181return 0;1118211183unmap_internal_cb_pool:11184hl_mmu_unmap_contiguous(ctx, hdev->internal_cb_va_base, HOST_SPACE_INTERNAL_CB_SZ);11185unreserve_internal_cb_pool:11186mutex_unlock(&hdev->mmu_lock);11187hl_unreserve_va_block(hdev, ctx, hdev->internal_cb_va_base, HOST_SPACE_INTERNAL_CB_SZ);11188destroy_internal_cb_pool:11189gen_pool_destroy(hdev->internal_cb_pool);11190free_internal_cb_pool:11191hl_asic_dma_free_coherent(hdev, HOST_SPACE_INTERNAL_CB_SZ, hdev->internal_cb_pool_virt_addr,11192hdev->internal_cb_pool_dma_addr);1119311194return rc;11195}1119611197static void gaudi2_internal_cb_pool_fini(struct hl_device *hdev, struct hl_ctx *ctx)11198{11199struct gaudi2_device *gaudi2 = hdev->asic_specific;1120011201if (!(gaudi2->hw_cap_initialized & HW_CAP_PMMU))11202return;1120311204mutex_lock(&hdev->mmu_lock);11205hl_mmu_unmap_contiguous(ctx, hdev->internal_cb_va_base, HOST_SPACE_INTERNAL_CB_SZ);11206hl_unreserve_va_block(hdev, ctx, hdev->internal_cb_va_base, HOST_SPACE_INTERNAL_CB_SZ);11207hl_mmu_invalidate_cache(hdev, true, MMU_OP_USERPTR);11208mutex_unlock(&hdev->mmu_lock);1120911210gen_pool_destroy(hdev->internal_cb_pool);1121111212hl_asic_dma_free_coherent(hdev, HOST_SPACE_INTERNAL_CB_SZ, hdev->internal_cb_pool_virt_addr,11213hdev->internal_cb_pool_dma_addr);11214}1121511216static void gaudi2_restore_user_registers(struct hl_device *hdev)11217{11218gaudi2_restore_user_sm_registers(hdev);11219gaudi2_restore_user_qm_registers(hdev);11220}1122111222static int gaudi2_map_virtual_msix_doorbell_memory(struct hl_ctx *ctx)11223{11224struct hl_device *hdev = ctx->hdev;11225struct asic_fixed_properties *prop = &hdev->asic_prop;11226struct gaudi2_device *gaudi2 = hdev->asic_specific;11227int rc;1122811229rc = hl_mmu_map_page(ctx, RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START,11230gaudi2->virt_msix_db_dma_addr, prop->pmmu.page_size, true);11231if (rc)11232dev_err(hdev->dev, "Failed to map VA %#llx for virtual MSI-X doorbell memory\n",11233RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START);1123411235return rc;11236}1123711238static void gaudi2_unmap_virtual_msix_doorbell_memory(struct hl_ctx *ctx)11239{11240struct hl_device *hdev = ctx->hdev;11241struct asic_fixed_properties *prop = &hdev->asic_prop;11242int rc;1124311244rc = hl_mmu_unmap_page(ctx, RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START,11245prop->pmmu.page_size, true);11246if (rc)11247dev_err(hdev->dev, "Failed to unmap VA %#llx of virtual MSI-X doorbell memory\n",11248RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START);11249}1125011251static int gaudi2_ctx_init(struct hl_ctx *ctx)11252{11253int rc;1125411255if (ctx->asid == HL_KERNEL_ASID_ID)11256return 0;1125711258rc = gaudi2_mmu_prepare(ctx->hdev, ctx->asid);11259if (rc)11260return rc;1126111262/* No need to clear user registers if the device has just11263* performed reset, we restore only nic qm registers11264*/11265if (ctx->hdev->reset_upon_device_release)11266gaudi2_restore_nic_qm_registers(ctx->hdev);11267else11268gaudi2_restore_user_registers(ctx->hdev);1126911270rc = gaudi2_internal_cb_pool_init(ctx->hdev, ctx);11271if (rc)11272return rc;1127311274rc = gaudi2_map_virtual_msix_doorbell_memory(ctx);11275if (rc)11276gaudi2_internal_cb_pool_fini(ctx->hdev, ctx);1127711278return rc;11279}1128011281static void gaudi2_ctx_fini(struct hl_ctx *ctx)11282{11283if (ctx->asid == HL_KERNEL_ASID_ID)11284return;1128511286gaudi2_internal_cb_pool_fini(ctx->hdev, ctx);1128711288gaudi2_unmap_virtual_msix_doorbell_memory(ctx);11289}1129011291static int gaudi2_pre_schedule_cs(struct hl_cs *cs)11292{11293struct hl_device *hdev = cs->ctx->hdev;11294int index = cs->sequence & (hdev->asic_prop.max_pending_cs - 1);11295u32 mon_payload, sob_id, mon_id;1129611297if (!cs_needs_completion(cs))11298return 0;1129911300/*11301* First 64 SOB/MON are reserved for driver for QMAN auto completion11302* mechanism. Each SOB/MON pair are used for a pending CS with the same11303* cyclic index. The SOB value is increased when each of the CS jobs is11304* completed. When the SOB reaches the number of CS jobs, the monitor11305* generates MSI-X interrupt.11306*/1130711308sob_id = mon_id = index;11309mon_payload = (1 << CQ_ENTRY_SHADOW_INDEX_VALID_SHIFT) |11310(1 << CQ_ENTRY_READY_SHIFT) | index;1131111312gaudi2_arm_cq_monitor(hdev, sob_id, mon_id, GAUDI2_RESERVED_CQ_CS_COMPLETION, mon_payload,11313cs->jobs_cnt);1131411315return 0;11316}1131711318static u32 gaudi2_get_queue_id_for_cq(struct hl_device *hdev, u32 cq_idx)11319{11320return HL_INVALID_QUEUE;11321}1132211323static u32 gaudi2_gen_signal_cb(struct hl_device *hdev, void *data, u16 sob_id, u32 size, bool eb)11324{11325struct hl_cb *cb = data;11326struct packet_msg_short *pkt;11327u32 value, ctl, pkt_size = sizeof(*pkt);1132811329pkt = (struct packet_msg_short *) (uintptr_t) (cb->kernel_address + size);11330memset(pkt, 0, pkt_size);1133111332/* Inc by 1, Mode ADD */11333value = FIELD_PREP(GAUDI2_PKT_SHORT_VAL_SOB_SYNC_VAL_MASK, 1);11334value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_SOB_MOD_MASK, 1);1133511336ctl = FIELD_PREP(GAUDI2_PKT_SHORT_CTL_ADDR_MASK, sob_id * 4);11337ctl |= FIELD_PREP(GAUDI2_PKT_SHORT_CTL_BASE_MASK, 1); /* SOB base */11338ctl |= FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_MSG_SHORT);11339ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, eb);11340ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 1);1134111342pkt->value = cpu_to_le32(value);11343pkt->ctl = cpu_to_le32(ctl);1134411345return size + pkt_size;11346}1134711348static u32 gaudi2_add_mon_msg_short(struct packet_msg_short *pkt, u32 value, u16 addr)11349{11350u32 ctl, pkt_size = sizeof(*pkt);1135111352memset(pkt, 0, pkt_size);1135311354ctl = FIELD_PREP(GAUDI2_PKT_SHORT_CTL_ADDR_MASK, addr);11355ctl |= FIELD_PREP(GAUDI2_PKT_SHORT_CTL_BASE_MASK, 0); /* MON base */11356ctl |= FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_MSG_SHORT);11357ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, 0);11358ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 0);1135911360pkt->value = cpu_to_le32(value);11361pkt->ctl = cpu_to_le32(ctl);1136211363return pkt_size;11364}1136511366static u32 gaudi2_add_arm_monitor_pkt(struct hl_device *hdev, struct packet_msg_short *pkt,11367u16 sob_base, u8 sob_mask, u16 sob_val, u16 addr)11368{11369u32 ctl, value, pkt_size = sizeof(*pkt);11370u8 mask;1137111372if (hl_gen_sob_mask(sob_base, sob_mask, &mask)) {11373dev_err(hdev->dev, "sob_base %u (mask %#x) is not valid\n", sob_base, sob_mask);11374return 0;11375}1137611377memset(pkt, 0, pkt_size);1137811379value = FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_SYNC_GID_MASK, sob_base / 8);11380value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_SYNC_VAL_MASK, sob_val);11381value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_MODE_MASK, 0); /* GREATER OR EQUAL*/11382value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_MASK_MASK, mask);1138311384ctl = FIELD_PREP(GAUDI2_PKT_SHORT_CTL_ADDR_MASK, addr);11385ctl |= FIELD_PREP(GAUDI2_PKT_SHORT_CTL_BASE_MASK, 0); /* MON base */11386ctl |= FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_MSG_SHORT);11387ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, 0);11388ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 1);1138911390pkt->value = cpu_to_le32(value);11391pkt->ctl = cpu_to_le32(ctl);1139211393return pkt_size;11394}1139511396static u32 gaudi2_add_fence_pkt(struct packet_fence *pkt)11397{11398u32 ctl, cfg, pkt_size = sizeof(*pkt);1139911400memset(pkt, 0, pkt_size);1140111402cfg = FIELD_PREP(GAUDI2_PKT_FENCE_CFG_DEC_VAL_MASK, 1);11403cfg |= FIELD_PREP(GAUDI2_PKT_FENCE_CFG_TARGET_VAL_MASK, 1);11404cfg |= FIELD_PREP(GAUDI2_PKT_FENCE_CFG_ID_MASK, 2);1140511406ctl = FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_FENCE);11407ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, 0);11408ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 1);1140911410pkt->cfg = cpu_to_le32(cfg);11411pkt->ctl = cpu_to_le32(ctl);1141211413return pkt_size;11414}1141511416static u32 gaudi2_gen_wait_cb(struct hl_device *hdev, struct hl_gen_wait_properties *prop)11417{11418struct hl_cb *cb = prop->data;11419void *buf = (void *) (uintptr_t) (cb->kernel_address);1142011421u64 monitor_base, fence_addr = 0;11422u32 stream_index, size = prop->size;11423u16 msg_addr_offset;1142411425stream_index = prop->q_idx % 4;11426fence_addr = CFG_BASE + gaudi2_qm_blocks_bases[prop->q_idx] +11427QM_FENCE2_OFFSET + stream_index * 4;1142811429/*11430* monitor_base should be the content of the base0 address registers,11431* so it will be added to the msg short offsets11432*/11433monitor_base = mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0;1143411435/* First monitor config packet: low address of the sync */11436msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + prop->mon_id * 4) -11437monitor_base;1143811439size += gaudi2_add_mon_msg_short(buf + size, (u32) fence_addr, msg_addr_offset);1144011441/* Second monitor config packet: high address of the sync */11442msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + prop->mon_id * 4) -11443monitor_base;1144411445size += gaudi2_add_mon_msg_short(buf + size, (u32) (fence_addr >> 32), msg_addr_offset);1144611447/*11448* Third monitor config packet: the payload, i.e. what to write when the11449* sync triggers11450*/11451msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + prop->mon_id * 4) -11452monitor_base;1145311454size += gaudi2_add_mon_msg_short(buf + size, 1, msg_addr_offset);1145511456/* Fourth monitor config packet: bind the monitor to a sync object */11457msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + prop->mon_id * 4) - monitor_base;1145811459size += gaudi2_add_arm_monitor_pkt(hdev, buf + size, prop->sob_base, prop->sob_mask,11460prop->sob_val, msg_addr_offset);1146111462/* Fence packet */11463size += gaudi2_add_fence_pkt(buf + size);1146411465return size;11466}1146711468static void gaudi2_reset_sob(struct hl_device *hdev, void *data)11469{11470struct hl_hw_sob *hw_sob = data;1147111472dev_dbg(hdev->dev, "reset SOB, q_idx: %d, sob_id: %d\n", hw_sob->q_idx, hw_sob->sob_id);1147311474WREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + hw_sob->sob_id * 4, 0);1147511476kref_init(&hw_sob->kref);11477}1147811479static void gaudi2_reset_sob_group(struct hl_device *hdev, u16 sob_group)11480{11481}1148211483static u64 gaudi2_get_device_time(struct hl_device *hdev)11484{11485u64 device_time = ((u64) RREG32(mmPSOC_TIMESTAMP_CNTCVU)) << 32;1148611487return device_time | RREG32(mmPSOC_TIMESTAMP_CNTCVL);11488}1148911490static int gaudi2_collective_wait_init_cs(struct hl_cs *cs)11491{11492return 0;11493}1149411495static int gaudi2_collective_wait_create_jobs(struct hl_device *hdev, struct hl_ctx *ctx,11496struct hl_cs *cs, u32 wait_queue_id,11497u32 collective_engine_id, u32 encaps_signal_offset)11498{11499return -EINVAL;11500}1150111502/*11503* hl_mmu_scramble - converts a dram (non power of 2) page-size aligned address11504* to DMMU page-size address (64MB) before mapping it in11505* the MMU.11506* The operation is performed on both the virtual and physical addresses.11507* for device with 6 HBMs the scramble is:11508* (addr[47:0] / 48M) * 64M + addr % 48M + addr[63:48]11509*11510* Example:11511* =============================================================================11512* Allocated DRAM Reserved VA scrambled VA for MMU mapping Scrambled PA11513* Phys address in MMU last11514* HOP11515* =============================================================================11516* PA1 0x3000000 VA1 0x9C000000 SVA1= (VA1/48M)*64M 0xD0000000 <- PA1/48M 0x111517* PA2 0x9000000 VA2 0x9F000000 SVA2= (VA2/48M)*64M 0xD4000000 <- PA2/48M 0x311518* =============================================================================11519*/11520static u64 gaudi2_mmu_scramble_addr(struct hl_device *hdev, u64 raw_addr)11521{11522struct asic_fixed_properties *prop = &hdev->asic_prop;11523u32 divisor, mod_va;11524u64 div_va;1152511526/* accept any address in the DRAM address space */11527if (hl_mem_area_inside_range(raw_addr, sizeof(raw_addr), DRAM_PHYS_BASE,11528VA_HBM_SPACE_END)) {1152911530divisor = prop->num_functional_hbms * GAUDI2_HBM_MMU_SCRM_MEM_SIZE;11531div_va = div_u64_rem(raw_addr & GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK, divisor, &mod_va);11532return (raw_addr & ~GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK) |11533(div_va << GAUDI2_HBM_MMU_SCRM_DIV_SHIFT) |11534(mod_va << GAUDI2_HBM_MMU_SCRM_MOD_SHIFT);11535}1153611537return raw_addr;11538}1153911540static u64 gaudi2_mmu_descramble_addr(struct hl_device *hdev, u64 scrambled_addr)11541{11542struct asic_fixed_properties *prop = &hdev->asic_prop;11543u32 divisor, mod_va;11544u64 div_va;1154511546/* accept any address in the DRAM address space */11547if (hl_mem_area_inside_range(scrambled_addr, sizeof(scrambled_addr), DRAM_PHYS_BASE,11548VA_HBM_SPACE_END)) {1154911550divisor = prop->num_functional_hbms * GAUDI2_HBM_MMU_SCRM_MEM_SIZE;11551div_va = div_u64_rem(scrambled_addr & GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK,11552PAGE_SIZE_64MB, &mod_va);1155311554return ((scrambled_addr & ~GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK) +11555(div_va * divisor + mod_va));11556}1155711558return scrambled_addr;11559}1156011561static u32 gaudi2_get_dec_base_addr(struct hl_device *hdev, u32 core_id)11562{11563u32 base = 0, dcore_id, dec_id;1156411565if (core_id >= NUMBER_OF_DEC) {11566dev_err(hdev->dev, "Unexpected core number %d for DEC\n", core_id);11567goto out;11568}1156911570if (core_id < 8) {11571dcore_id = core_id / NUM_OF_DEC_PER_DCORE;11572dec_id = core_id % NUM_OF_DEC_PER_DCORE;1157311574base = mmDCORE0_DEC0_CMD_BASE + dcore_id * DCORE_OFFSET +11575dec_id * DCORE_VDEC_OFFSET;11576} else {11577/* PCIe Shared Decoder */11578base = mmPCIE_DEC0_CMD_BASE + ((core_id % 8) * PCIE_VDEC_OFFSET);11579}11580out:11581return base;11582}1158311584static int gaudi2_get_hw_block_id(struct hl_device *hdev, u64 block_addr,11585u32 *block_size, u32 *block_id)11586{11587struct gaudi2_device *gaudi2 = hdev->asic_specific;11588int i;1158911590for (i = 0 ; i < NUM_USER_MAPPED_BLOCKS ; i++) {11591if (block_addr == CFG_BASE + gaudi2->mapped_blocks[i].address) {11592*block_id = i;11593if (block_size)11594*block_size = gaudi2->mapped_blocks[i].size;11595return 0;11596}11597}1159811599dev_err(hdev->dev, "Invalid block address %#llx", block_addr);1160011601return -EINVAL;11602}1160311604static int gaudi2_block_mmap(struct hl_device *hdev, struct vm_area_struct *vma,11605u32 block_id, u32 block_size)11606{11607struct gaudi2_device *gaudi2 = hdev->asic_specific;11608u64 offset_in_bar;11609u64 address;11610int rc;1161111612if (block_id >= NUM_USER_MAPPED_BLOCKS) {11613dev_err(hdev->dev, "Invalid block id %u", block_id);11614return -EINVAL;11615}1161611617/* we allow mapping only an entire block */11618if (block_size != gaudi2->mapped_blocks[block_id].size) {11619dev_err(hdev->dev, "Invalid block size %u", block_size);11620return -EINVAL;11621}1162211623offset_in_bar = CFG_BASE + gaudi2->mapped_blocks[block_id].address - STM_FLASH_BASE_ADDR;1162411625address = pci_resource_start(hdev->pdev, SRAM_CFG_BAR_ID) + offset_in_bar;1162611627vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |11628VM_DONTCOPY | VM_NORESERVE);1162911630rc = remap_pfn_range(vma, vma->vm_start, address >> PAGE_SHIFT,11631block_size, vma->vm_page_prot);11632if (rc)11633dev_err(hdev->dev, "remap_pfn_range error %d", rc);1163411635return rc;11636}1163711638static void gaudi2_enable_events_from_fw(struct hl_device *hdev)11639{11640struct gaudi2_device *gaudi2 = hdev->asic_specific;1164111642struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;11643u32 irq_handler_offset = le32_to_cpu(dyn_regs->gic_host_ints_irq);1164411645if (gaudi2->hw_cap_initialized & HW_CAP_CPU_Q)11646WREG32(irq_handler_offset,11647gaudi2_irq_map_table[GAUDI2_EVENT_CPU_INTS_REGISTER].cpu_id);11648}1164911650static int gaudi2_get_mmu_base(struct hl_device *hdev, u64 mmu_id, u32 *mmu_base)11651{11652switch (mmu_id) {11653case HW_CAP_DCORE0_DMMU0:11654*mmu_base = mmDCORE0_HMMU0_MMU_BASE;11655break;11656case HW_CAP_DCORE0_DMMU1:11657*mmu_base = mmDCORE0_HMMU1_MMU_BASE;11658break;11659case HW_CAP_DCORE0_DMMU2:11660*mmu_base = mmDCORE0_HMMU2_MMU_BASE;11661break;11662case HW_CAP_DCORE0_DMMU3:11663*mmu_base = mmDCORE0_HMMU3_MMU_BASE;11664break;11665case HW_CAP_DCORE1_DMMU0:11666*mmu_base = mmDCORE1_HMMU0_MMU_BASE;11667break;11668case HW_CAP_DCORE1_DMMU1:11669*mmu_base = mmDCORE1_HMMU1_MMU_BASE;11670break;11671case HW_CAP_DCORE1_DMMU2:11672*mmu_base = mmDCORE1_HMMU2_MMU_BASE;11673break;11674case HW_CAP_DCORE1_DMMU3:11675*mmu_base = mmDCORE1_HMMU3_MMU_BASE;11676break;11677case HW_CAP_DCORE2_DMMU0:11678*mmu_base = mmDCORE2_HMMU0_MMU_BASE;11679break;11680case HW_CAP_DCORE2_DMMU1:11681*mmu_base = mmDCORE2_HMMU1_MMU_BASE;11682break;11683case HW_CAP_DCORE2_DMMU2:11684*mmu_base = mmDCORE2_HMMU2_MMU_BASE;11685break;11686case HW_CAP_DCORE2_DMMU3:11687*mmu_base = mmDCORE2_HMMU3_MMU_BASE;11688break;11689case HW_CAP_DCORE3_DMMU0:11690*mmu_base = mmDCORE3_HMMU0_MMU_BASE;11691break;11692case HW_CAP_DCORE3_DMMU1:11693*mmu_base = mmDCORE3_HMMU1_MMU_BASE;11694break;11695case HW_CAP_DCORE3_DMMU2:11696*mmu_base = mmDCORE3_HMMU2_MMU_BASE;11697break;11698case HW_CAP_DCORE3_DMMU3:11699*mmu_base = mmDCORE3_HMMU3_MMU_BASE;11700break;11701case HW_CAP_PMMU:11702*mmu_base = mmPMMU_HBW_MMU_BASE;11703break;11704default:11705return -EINVAL;11706}1170711708return 0;11709}1171011711static void gaudi2_ack_mmu_error(struct hl_device *hdev, u64 mmu_id)11712{11713bool is_pmmu = (mmu_id == HW_CAP_PMMU);11714struct gaudi2_device *gaudi2 = hdev->asic_specific;11715u32 mmu_base;1171611717if (!(gaudi2->hw_cap_initialized & mmu_id))11718return;1171911720if (gaudi2_get_mmu_base(hdev, mmu_id, &mmu_base))11721return;1172211723gaudi2_handle_page_error(hdev, mmu_base, is_pmmu, NULL);11724gaudi2_handle_access_error(hdev, mmu_base, is_pmmu);11725}1172611727static int gaudi2_ack_mmu_page_fault_or_access_error(struct hl_device *hdev, u64 mmu_cap_mask)11728{11729u32 i, mmu_id, num_of_hmmus = NUM_OF_HMMU_PER_DCORE * NUM_OF_DCORES;1173011731/* check all HMMUs */11732for (i = 0 ; i < num_of_hmmus ; i++) {11733mmu_id = HW_CAP_DCORE0_DMMU0 << i;1173411735if (mmu_cap_mask & mmu_id)11736gaudi2_ack_mmu_error(hdev, mmu_id);11737}1173811739/* check PMMU */11740if (mmu_cap_mask & HW_CAP_PMMU)11741gaudi2_ack_mmu_error(hdev, HW_CAP_PMMU);1174211743return 0;11744}1174511746static void gaudi2_get_msi_info(__le32 *table)11747{11748table[CPUCP_EVENT_QUEUE_MSI_TYPE] = cpu_to_le32(GAUDI2_EVENT_QUEUE_MSIX_IDX);11749table[CPUCP_EVENT_QUEUE_ERR_MSI_TYPE] = cpu_to_le32(GAUDI2_IRQ_NUM_EQ_ERROR);11750}1175111752static int gaudi2_map_pll_idx_to_fw_idx(u32 pll_idx)11753{11754switch (pll_idx) {11755case HL_GAUDI2_CPU_PLL: return CPU_PLL;11756case HL_GAUDI2_PCI_PLL: return PCI_PLL;11757case HL_GAUDI2_NIC_PLL: return NIC_PLL;11758case HL_GAUDI2_DMA_PLL: return DMA_PLL;11759case HL_GAUDI2_MESH_PLL: return MESH_PLL;11760case HL_GAUDI2_MME_PLL: return MME_PLL;11761case HL_GAUDI2_TPC_PLL: return TPC_PLL;11762case HL_GAUDI2_IF_PLL: return IF_PLL;11763case HL_GAUDI2_SRAM_PLL: return SRAM_PLL;11764case HL_GAUDI2_HBM_PLL: return HBM_PLL;11765case HL_GAUDI2_VID_PLL: return VID_PLL;11766case HL_GAUDI2_MSS_PLL: return MSS_PLL;11767default: return -EINVAL;11768}11769}1177011771static int gaudi2_gen_sync_to_engine_map(struct hl_device *hdev, struct hl_sync_to_engine_map *map)11772{11773/* Not implemented */11774return 0;11775}1177611777static int gaudi2_monitor_valid(struct hl_mon_state_dump *mon)11778{11779/* Not implemented */11780return 0;11781}1178211783static int gaudi2_print_single_monitor(char **buf, size_t *size, size_t *offset,11784struct hl_device *hdev, struct hl_mon_state_dump *mon)11785{11786/* Not implemented */11787return 0;11788}117891179011791static int gaudi2_print_fences_single_engine(struct hl_device *hdev, u64 base_offset,11792u64 status_base_offset, enum hl_sync_engine_type engine_type,11793u32 engine_id, char **buf, size_t *size, size_t *offset)11794{11795/* Not implemented */11796return 0;11797}117981179911800static struct hl_state_dump_specs_funcs gaudi2_state_dump_funcs = {11801.monitor_valid = gaudi2_monitor_valid,11802.print_single_monitor = gaudi2_print_single_monitor,11803.gen_sync_to_engine_map = gaudi2_gen_sync_to_engine_map,11804.print_fences_single_engine = gaudi2_print_fences_single_engine,11805};1180611807static void gaudi2_state_dump_init(struct hl_device *hdev)11808{11809/* Not implemented */11810hdev->state_dump_specs.props = gaudi2_state_dump_specs_props;11811hdev->state_dump_specs.funcs = gaudi2_state_dump_funcs;11812}1181311814static u32 gaudi2_get_sob_addr(struct hl_device *hdev, u32 sob_id)11815{11816return 0;11817}1181811819static u32 *gaudi2_get_stream_master_qid_arr(void)11820{11821return NULL;11822}1182311824static void gaudi2_add_device_attr(struct hl_device *hdev, struct attribute_group *dev_clk_attr_grp,11825struct attribute_group *dev_vrm_attr_grp)11826{11827hl_sysfs_add_dev_clk_attr(hdev, dev_clk_attr_grp);11828hl_sysfs_add_dev_vrm_attr(hdev, dev_vrm_attr_grp);11829}1183011831static int gaudi2_mmu_get_real_page_size(struct hl_device *hdev, struct hl_mmu_properties *mmu_prop,11832u32 page_size, u32 *real_page_size, bool is_dram_addr)11833{11834struct asic_fixed_properties *prop = &hdev->asic_prop;1183511836/* for host pages the page size must be */11837if (!is_dram_addr) {11838if (page_size % mmu_prop->page_size)11839goto page_size_err;1184011841*real_page_size = mmu_prop->page_size;11842return 0;11843}1184411845if ((page_size % prop->dram_page_size) || (prop->dram_page_size > mmu_prop->page_size))11846goto page_size_err;1184711848/*11849* MMU page size is different from DRAM page size (more precisely, DMMU page is greater11850* than DRAM page size).11851* for this reason work with the DRAM page size and let the MMU scrambling routine handle11852* this mismatch when calculating the address to place in the MMU page table.11853* (in that case also make sure that the dram_page_size is not greater than the11854* mmu page size)11855*/11856*real_page_size = prop->dram_page_size;1185711858return 0;1185911860page_size_err:11861dev_err(hdev->dev, "page size of 0x%X is not 0x%X aligned, can't map\n",11862page_size, mmu_prop->page_size >> 10);11863return -EFAULT;11864}1186511866static int gaudi2_get_monitor_dump(struct hl_device *hdev, void *data)11867{11868return -EOPNOTSUPP;11869}1187011871int gaudi2_send_device_activity(struct hl_device *hdev, bool open)11872{11873struct gaudi2_device *gaudi2 = hdev->asic_specific;1187411875if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))11876return 0;1187711878return hl_fw_send_device_activity(hdev, open);11879}1188011881static u64 gaudi2_read_pte(struct hl_device *hdev, u64 addr)11882{11883struct gaudi2_device *gaudi2 = hdev->asic_specific;11884u64 val;1188511886if (hdev->reset_info.hard_reset_pending)11887return U64_MAX;1188811889val = readq(hdev->pcie_bar[DRAM_BAR_ID] + (addr - gaudi2->dram_bar_cur_addr));1189011891return val;11892}1189311894static void gaudi2_write_pte(struct hl_device *hdev, u64 addr, u64 val)11895{11896struct gaudi2_device *gaudi2 = hdev->asic_specific;1189711898if (hdev->reset_info.hard_reset_pending)11899return;1190011901writeq(val, hdev->pcie_bar[DRAM_BAR_ID] + (addr - gaudi2->dram_bar_cur_addr));11902}1190311904static const struct hl_asic_funcs gaudi2_funcs = {11905.early_init = gaudi2_early_init,11906.early_fini = gaudi2_early_fini,11907.late_init = gaudi2_late_init,11908.late_fini = gaudi2_late_fini,11909.sw_init = gaudi2_sw_init,11910.sw_fini = gaudi2_sw_fini,11911.hw_init = gaudi2_hw_init,11912.hw_fini = gaudi2_hw_fini,11913.halt_engines = gaudi2_halt_engines,11914.suspend = gaudi2_suspend,11915.resume = gaudi2_resume,11916.mmap = gaudi2_mmap,11917.ring_doorbell = gaudi2_ring_doorbell,11918.pqe_write = gaudi2_pqe_write,11919.asic_dma_alloc_coherent = gaudi2_dma_alloc_coherent,11920.asic_dma_free_coherent = gaudi2_dma_free_coherent,11921.scrub_device_mem = gaudi2_scrub_device_mem,11922.scrub_device_dram = gaudi2_scrub_device_dram,11923.get_int_queue_base = NULL,11924.test_queues = gaudi2_test_queues,11925.asic_dma_pool_zalloc = gaudi2_dma_pool_zalloc,11926.asic_dma_pool_free = gaudi2_dma_pool_free,11927.cpu_accessible_dma_pool_alloc = gaudi2_cpu_accessible_dma_pool_alloc,11928.cpu_accessible_dma_pool_free = gaudi2_cpu_accessible_dma_pool_free,11929.dma_unmap_sgtable = hl_asic_dma_unmap_sgtable,11930.cs_parser = gaudi2_cs_parser,11931.dma_map_sgtable = hl_asic_dma_map_sgtable,11932.add_end_of_cb_packets = NULL,11933.update_eq_ci = gaudi2_update_eq_ci,11934.context_switch = gaudi2_context_switch,11935.restore_phase_topology = gaudi2_restore_phase_topology,11936.debugfs_read_dma = gaudi2_debugfs_read_dma,11937.add_device_attr = gaudi2_add_device_attr,11938.handle_eqe = gaudi2_handle_eqe,11939.get_events_stat = gaudi2_get_events_stat,11940.read_pte = gaudi2_read_pte,11941.write_pte = gaudi2_write_pte,11942.mmu_invalidate_cache = gaudi2_mmu_invalidate_cache,11943.mmu_invalidate_cache_range = gaudi2_mmu_invalidate_cache_range,11944.mmu_prefetch_cache_range = NULL,11945.send_heartbeat = gaudi2_send_heartbeat,11946.debug_coresight = gaudi2_debug_coresight,11947.is_device_idle = gaudi2_is_device_idle,11948.compute_reset_late_init = gaudi2_compute_reset_late_init,11949.hw_queues_lock = gaudi2_hw_queues_lock,11950.hw_queues_unlock = gaudi2_hw_queues_unlock,11951.get_pci_id = gaudi2_get_pci_id,11952.get_eeprom_data = gaudi2_get_eeprom_data,11953.get_monitor_dump = gaudi2_get_monitor_dump,11954.send_cpu_message = gaudi2_send_cpu_message,11955.pci_bars_map = gaudi2_pci_bars_map,11956.init_iatu = gaudi2_init_iatu,11957.rreg = hl_rreg,11958.wreg = hl_wreg,11959.halt_coresight = gaudi2_halt_coresight,11960.ctx_init = gaudi2_ctx_init,11961.ctx_fini = gaudi2_ctx_fini,11962.pre_schedule_cs = gaudi2_pre_schedule_cs,11963.get_queue_id_for_cq = gaudi2_get_queue_id_for_cq,11964.load_firmware_to_device = NULL,11965.load_boot_fit_to_device = NULL,11966.get_signal_cb_size = gaudi2_get_signal_cb_size,11967.get_wait_cb_size = gaudi2_get_wait_cb_size,11968.gen_signal_cb = gaudi2_gen_signal_cb,11969.gen_wait_cb = gaudi2_gen_wait_cb,11970.reset_sob = gaudi2_reset_sob,11971.reset_sob_group = gaudi2_reset_sob_group,11972.get_device_time = gaudi2_get_device_time,11973.pb_print_security_errors = gaudi2_pb_print_security_errors,11974.collective_wait_init_cs = gaudi2_collective_wait_init_cs,11975.collective_wait_create_jobs = gaudi2_collective_wait_create_jobs,11976.get_dec_base_addr = gaudi2_get_dec_base_addr,11977.scramble_addr = gaudi2_mmu_scramble_addr,11978.descramble_addr = gaudi2_mmu_descramble_addr,11979.ack_protection_bits_errors = gaudi2_ack_protection_bits_errors,11980.get_hw_block_id = gaudi2_get_hw_block_id,11981.hw_block_mmap = gaudi2_block_mmap,11982.enable_events_from_fw = gaudi2_enable_events_from_fw,11983.ack_mmu_errors = gaudi2_ack_mmu_page_fault_or_access_error,11984.get_msi_info = gaudi2_get_msi_info,11985.map_pll_idx_to_fw_idx = gaudi2_map_pll_idx_to_fw_idx,11986.init_firmware_preload_params = gaudi2_init_firmware_preload_params,11987.init_firmware_loader = gaudi2_init_firmware_loader,11988.init_cpu_scrambler_dram = gaudi2_init_scrambler_hbm,11989.state_dump_init = gaudi2_state_dump_init,11990.get_sob_addr = &gaudi2_get_sob_addr,11991.set_pci_memory_regions = gaudi2_set_pci_memory_regions,11992.get_stream_master_qid_arr = gaudi2_get_stream_master_qid_arr,11993.check_if_razwi_happened = gaudi2_check_if_razwi_happened,11994.mmu_get_real_page_size = gaudi2_mmu_get_real_page_size,11995.access_dev_mem = hl_access_dev_mem,11996.set_dram_bar_base = gaudi2_set_hbm_bar_base,11997.set_engine_cores = gaudi2_set_engine_cores,11998.set_engines = gaudi2_set_engines,11999.send_device_activity = gaudi2_send_device_activity,12000.set_dram_properties = gaudi2_set_dram_properties,12001.set_binning_masks = gaudi2_set_binning_masks,12002};1200312004void gaudi2_set_asic_funcs(struct hl_device *hdev)12005{12006hdev->asic_funcs = &gaudi2_funcs;12007}120081200912010