Path: blob/master/drivers/accel/habanalabs/gaudi2/gaudi2.c
26439 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};729730static const char * const gaudi2_qm_sei_error_cause[GAUDI2_NUM_OF_QM_SEI_ERR_CAUSE] = {731"qman sei intr",732"arc sei intr"733};734735static const char * const gaudi2_cpu_sei_error_cause[GAUDI2_NUM_OF_CPU_SEI_ERR_CAUSE] = {736"AXI_TERMINATOR WR",737"AXI_TERMINATOR RD",738"AXI SPLIT SEI Status"739};740741static const char * const gaudi2_arc_sei_error_cause[GAUDI2_NUM_OF_ARC_SEI_ERR_CAUSE] = {742"cbu_bresp_sei_intr_cause",743"cbu_rresp_sei_intr_cause",744"lbu_bresp_sei_intr_cause",745"lbu_rresp_sei_intr_cause",746"cbu_axi_split_intr_cause",747"lbu_axi_split_intr_cause",748"arc_ip_excptn_sei_intr_cause",749"dmi_bresp_sei_intr_cause",750"aux2apb_err_sei_intr_cause",751"cfg_lbw_wr_terminated_intr_cause",752"cfg_lbw_rd_terminated_intr_cause",753"cfg_dccm_wr_terminated_intr_cause",754"cfg_dccm_rd_terminated_intr_cause",755"cfg_hbw_rd_terminated_intr_cause"756};757758static const char * const gaudi2_dec_error_cause[GAUDI2_NUM_OF_DEC_ERR_CAUSE] = {759"msix_vcd_hbw_sei",760"msix_l2c_hbw_sei",761"msix_nrm_hbw_sei",762"msix_abnrm_hbw_sei",763"msix_vcd_lbw_sei",764"msix_l2c_lbw_sei",765"msix_nrm_lbw_sei",766"msix_abnrm_lbw_sei",767"apb_vcd_lbw_sei",768"apb_l2c_lbw_sei",769"apb_nrm_lbw_sei",770"apb_abnrm_lbw_sei",771"dec_sei",772"dec_apb_sei",773"trc_apb_sei",774"lbw_mstr_if_sei",775"axi_split_bresp_err_sei",776"hbw_axi_wr_viol_sei",777"hbw_axi_rd_viol_sei",778"lbw_axi_wr_viol_sei",779"lbw_axi_rd_viol_sei",780"vcd_spi",781"l2c_spi",782"nrm_spi",783"abnrm_spi",784};785786static const char * const gaudi2_qman_error_cause[GAUDI2_NUM_OF_QM_ERR_CAUSE] = {787"PQ AXI HBW error",788"CQ AXI HBW error",789"CP AXI HBW error",790"CP error due to undefined OPCODE",791"CP encountered STOP OPCODE",792"CP AXI LBW error",793"CP WRREG32 or WRBULK returned error",794"N/A",795"FENCE 0 inc over max value and clipped",796"FENCE 1 inc over max value and clipped",797"FENCE 2 inc over max value and clipped",798"FENCE 3 inc over max value and clipped",799"FENCE 0 dec under min value and clipped",800"FENCE 1 dec under min value and clipped",801"FENCE 2 dec under min value and clipped",802"FENCE 3 dec under min value and clipped",803"CPDMA Up overflow",804"PQC L2H error"805};806807static const char * const gaudi2_lower_qman_error_cause[GAUDI2_NUM_OF_LOWER_QM_ERR_CAUSE] = {808"RSVD0",809"CQ AXI HBW error",810"CP AXI HBW error",811"CP error due to undefined OPCODE",812"CP encountered STOP OPCODE",813"CP AXI LBW error",814"CP WRREG32 or WRBULK returned error",815"N/A",816"FENCE 0 inc over max value and clipped",817"FENCE 1 inc over max value and clipped",818"FENCE 2 inc over max value and clipped",819"FENCE 3 inc over max value and clipped",820"FENCE 0 dec under min value and clipped",821"FENCE 1 dec under min value and clipped",822"FENCE 2 dec under min value and clipped",823"FENCE 3 dec under min value and clipped",824"CPDMA Up overflow",825"RSVD17",826"CQ_WR_IFIFO_CI_ERR",827"CQ_WR_CTL_CI_ERR",828"ARC_CQF_RD_ERR",829"ARC_CQ_WR_IFIFO_CI_ERR",830"ARC_CQ_WR_CTL_CI_ERR",831"ARC_AXI_ERR",832"CP_SWITCH_WDT_ERR"833};834835static const char * const gaudi2_qman_arb_error_cause[GAUDI2_NUM_OF_QM_ARB_ERR_CAUSE] = {836"Choice push while full error",837"Choice Q watchdog error",838"MSG AXI LBW returned with error"839};840841static const char * const guadi2_rot_error_cause[GAUDI2_NUM_OF_ROT_ERR_CAUSE] = {842"qm_axi_err",843"qm_trace_fence_events",844"qm_sw_err",845"qm_cp_sw_stop",846"lbw_mstr_rresp_err",847"lbw_mstr_bresp_err",848"lbw_msg_slverr",849"hbw_msg_slverr",850"wbc_slverr",851"hbw_mstr_rresp_err",852"hbw_mstr_bresp_err",853"sb_resp_intr",854"mrsb_resp_intr",855"core_dw_status_0",856"core_dw_status_1",857"core_dw_status_2",858"core_dw_status_3",859"core_dw_status_4",860"core_dw_status_5",861"core_dw_status_6",862"core_dw_status_7",863"async_arc2cpu_sei_intr",864};865866static const char * const gaudi2_tpc_interrupts_cause[GAUDI2_NUM_OF_TPC_INTR_CAUSE] = {867"tpc_address_exceed_slm",868"tpc_div_by_0",869"tpc_spu_mac_overflow",870"tpc_spu_addsub_overflow",871"tpc_spu_abs_overflow",872"tpc_spu_fma_fp_dst_nan",873"tpc_spu_fma_fp_dst_inf",874"tpc_spu_convert_fp_dst_nan",875"tpc_spu_convert_fp_dst_inf",876"tpc_spu_fp_dst_denorm",877"tpc_vpu_mac_overflow",878"tpc_vpu_addsub_overflow",879"tpc_vpu_abs_overflow",880"tpc_vpu_convert_fp_dst_nan",881"tpc_vpu_convert_fp_dst_inf",882"tpc_vpu_fma_fp_dst_nan",883"tpc_vpu_fma_fp_dst_inf",884"tpc_vpu_fp_dst_denorm",885"tpc_assertions",886"tpc_illegal_instruction",887"tpc_pc_wrap_around",888"tpc_qm_sw_err",889"tpc_hbw_rresp_err",890"tpc_hbw_bresp_err",891"tpc_lbw_rresp_err",892"tpc_lbw_bresp_err",893"st_unlock_already_locked",894"invalid_lock_access",895"LD_L protection violation",896"ST_L protection violation",897"D$ L0CS mismatch",898};899900static const char * const guadi2_mme_error_cause[GAUDI2_NUM_OF_MME_ERR_CAUSE] = {901"agu_resp_intr",902"qman_axi_err",903"wap sei (wbc axi err)",904"arc sei",905"cfg access error",906"qm_sw_err",907"sbte_dbg_intr_0",908"sbte_dbg_intr_1",909"sbte_dbg_intr_2",910"sbte_dbg_intr_3",911"sbte_dbg_intr_4",912"sbte_prtn_intr_0",913"sbte_prtn_intr_1",914"sbte_prtn_intr_2",915"sbte_prtn_intr_3",916"sbte_prtn_intr_4",917};918919static const char * const guadi2_mme_wap_error_cause[GAUDI2_NUM_OF_MME_WAP_ERR_CAUSE] = {920"WBC ERR RESP_0",921"WBC ERR RESP_1",922"AP SOURCE POS INF",923"AP SOURCE NEG INF",924"AP SOURCE NAN",925"AP RESULT POS INF",926"AP RESULT NEG INF",927};928929static const char * const gaudi2_dma_core_interrupts_cause[GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE] = {930"HBW Read returned with error RRESP",931"HBW write returned with error BRESP",932"LBW write returned with error BRESP",933"descriptor_fifo_overflow",934"KDMA SB LBW Read returned with error",935"KDMA WBC LBW Write returned with error",936"TRANSPOSE ENGINE DESC FIFO OVERFLOW",937"WRONG CFG FOR COMMIT IN LIN DMA"938};939940static const char * const gaudi2_kdma_core_interrupts_cause[GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE] = {941"HBW/LBW Read returned with error RRESP",942"HBW/LBW write returned with error BRESP",943"LBW write returned with error BRESP",944"descriptor_fifo_overflow",945"KDMA SB LBW Read returned with error",946"KDMA WBC LBW Write returned with error",947"TRANSPOSE ENGINE DESC FIFO OVERFLOW",948"WRONG CFG FOR COMMIT IN LIN DMA"949};950951struct gaudi2_sm_sei_cause_data {952const char *cause_name;953const char *log_name;954};955956static const struct gaudi2_sm_sei_cause_data957gaudi2_sm_sei_cause[GAUDI2_NUM_OF_SM_SEI_ERR_CAUSE] = {958{"calculated SO value overflow/underflow", "SOB ID"},959{"payload address of monitor is not aligned to 4B", "monitor addr"},960{"armed monitor write got BRESP (SLVERR or DECERR)", "AXI id"},961};962963static const char * const964gaudi2_pmmu_fatal_interrupts_cause[GAUDI2_NUM_OF_PMMU_FATAL_ERR_CAUSE] = {965"LATENCY_RD_OUT_FIFO_OVERRUN",966"LATENCY_WR_OUT_FIFO_OVERRUN",967};968969static const char * const970gaudi2_hif_fatal_interrupts_cause[GAUDI2_NUM_OF_HIF_FATAL_ERR_CAUSE] = {971"LATENCY_RD_OUT_FIFO_OVERRUN",972"LATENCY_WR_OUT_FIFO_OVERRUN",973};974975static const char * const976gaudi2_psoc_axi_drain_interrupts_cause[GAUDI2_NUM_OF_AXI_DRAIN_ERR_CAUSE] = {977"AXI drain HBW",978"AXI drain LBW",979};980981static const char * const982gaudi2_pcie_addr_dec_error_cause[GAUDI2_NUM_OF_PCIE_ADDR_DEC_ERR_CAUSE] = {983"HBW error response",984"LBW error response",985"TLP is blocked by RR"986};987988static const int gaudi2_queue_id_to_engine_id[] = {989[GAUDI2_QUEUE_ID_PDMA_0_0...GAUDI2_QUEUE_ID_PDMA_0_3] = GAUDI2_ENGINE_ID_PDMA_0,990[GAUDI2_QUEUE_ID_PDMA_1_0...GAUDI2_QUEUE_ID_PDMA_1_3] = GAUDI2_ENGINE_ID_PDMA_1,991[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3] =992GAUDI2_DCORE0_ENGINE_ID_EDMA_0,993[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3] =994GAUDI2_DCORE0_ENGINE_ID_EDMA_1,995[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3] =996GAUDI2_DCORE1_ENGINE_ID_EDMA_0,997[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3] =998GAUDI2_DCORE1_ENGINE_ID_EDMA_1,999[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3] =1000GAUDI2_DCORE2_ENGINE_ID_EDMA_0,1001[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3] =1002GAUDI2_DCORE2_ENGINE_ID_EDMA_1,1003[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3] =1004GAUDI2_DCORE3_ENGINE_ID_EDMA_0,1005[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3] =1006GAUDI2_DCORE3_ENGINE_ID_EDMA_1,1007[GAUDI2_QUEUE_ID_DCORE0_MME_0_0...GAUDI2_QUEUE_ID_DCORE0_MME_0_3] =1008GAUDI2_DCORE0_ENGINE_ID_MME,1009[GAUDI2_QUEUE_ID_DCORE1_MME_0_0...GAUDI2_QUEUE_ID_DCORE1_MME_0_3] =1010GAUDI2_DCORE1_ENGINE_ID_MME,1011[GAUDI2_QUEUE_ID_DCORE2_MME_0_0...GAUDI2_QUEUE_ID_DCORE2_MME_0_3] =1012GAUDI2_DCORE2_ENGINE_ID_MME,1013[GAUDI2_QUEUE_ID_DCORE3_MME_0_0...GAUDI2_QUEUE_ID_DCORE3_MME_0_3] =1014GAUDI2_DCORE3_ENGINE_ID_MME,1015[GAUDI2_QUEUE_ID_DCORE0_TPC_0_0...GAUDI2_QUEUE_ID_DCORE0_TPC_0_3] =1016GAUDI2_DCORE0_ENGINE_ID_TPC_0,1017[GAUDI2_QUEUE_ID_DCORE0_TPC_1_0...GAUDI2_QUEUE_ID_DCORE0_TPC_1_3] =1018GAUDI2_DCORE0_ENGINE_ID_TPC_1,1019[GAUDI2_QUEUE_ID_DCORE0_TPC_2_0...GAUDI2_QUEUE_ID_DCORE0_TPC_2_3] =1020GAUDI2_DCORE0_ENGINE_ID_TPC_2,1021[GAUDI2_QUEUE_ID_DCORE0_TPC_3_0...GAUDI2_QUEUE_ID_DCORE0_TPC_3_3] =1022GAUDI2_DCORE0_ENGINE_ID_TPC_3,1023[GAUDI2_QUEUE_ID_DCORE0_TPC_4_0...GAUDI2_QUEUE_ID_DCORE0_TPC_4_3] =1024GAUDI2_DCORE0_ENGINE_ID_TPC_4,1025[GAUDI2_QUEUE_ID_DCORE0_TPC_5_0...GAUDI2_QUEUE_ID_DCORE0_TPC_5_3] =1026GAUDI2_DCORE0_ENGINE_ID_TPC_5,1027[GAUDI2_QUEUE_ID_DCORE0_TPC_6_0...GAUDI2_QUEUE_ID_DCORE0_TPC_6_3] =1028GAUDI2_DCORE0_ENGINE_ID_TPC_6,1029[GAUDI2_QUEUE_ID_DCORE1_TPC_0_0...GAUDI2_QUEUE_ID_DCORE1_TPC_0_3] =1030GAUDI2_DCORE1_ENGINE_ID_TPC_0,1031[GAUDI2_QUEUE_ID_DCORE1_TPC_1_0...GAUDI2_QUEUE_ID_DCORE1_TPC_1_3] =1032GAUDI2_DCORE1_ENGINE_ID_TPC_1,1033[GAUDI2_QUEUE_ID_DCORE1_TPC_2_0...GAUDI2_QUEUE_ID_DCORE1_TPC_2_3] =1034GAUDI2_DCORE1_ENGINE_ID_TPC_2,1035[GAUDI2_QUEUE_ID_DCORE1_TPC_3_0...GAUDI2_QUEUE_ID_DCORE1_TPC_3_3] =1036GAUDI2_DCORE1_ENGINE_ID_TPC_3,1037[GAUDI2_QUEUE_ID_DCORE1_TPC_4_0...GAUDI2_QUEUE_ID_DCORE1_TPC_4_3] =1038GAUDI2_DCORE1_ENGINE_ID_TPC_4,1039[GAUDI2_QUEUE_ID_DCORE1_TPC_5_0...GAUDI2_QUEUE_ID_DCORE1_TPC_5_3] =1040GAUDI2_DCORE1_ENGINE_ID_TPC_5,1041[GAUDI2_QUEUE_ID_DCORE2_TPC_0_0...GAUDI2_QUEUE_ID_DCORE2_TPC_0_3] =1042GAUDI2_DCORE2_ENGINE_ID_TPC_0,1043[GAUDI2_QUEUE_ID_DCORE2_TPC_1_0...GAUDI2_QUEUE_ID_DCORE2_TPC_1_3] =1044GAUDI2_DCORE2_ENGINE_ID_TPC_1,1045[GAUDI2_QUEUE_ID_DCORE2_TPC_2_0...GAUDI2_QUEUE_ID_DCORE2_TPC_2_3] =1046GAUDI2_DCORE2_ENGINE_ID_TPC_2,1047[GAUDI2_QUEUE_ID_DCORE2_TPC_3_0...GAUDI2_QUEUE_ID_DCORE2_TPC_3_3] =1048GAUDI2_DCORE2_ENGINE_ID_TPC_3,1049[GAUDI2_QUEUE_ID_DCORE2_TPC_4_0...GAUDI2_QUEUE_ID_DCORE2_TPC_4_3] =1050GAUDI2_DCORE2_ENGINE_ID_TPC_4,1051[GAUDI2_QUEUE_ID_DCORE2_TPC_5_0...GAUDI2_QUEUE_ID_DCORE2_TPC_5_3] =1052GAUDI2_DCORE2_ENGINE_ID_TPC_5,1053[GAUDI2_QUEUE_ID_DCORE3_TPC_0_0...GAUDI2_QUEUE_ID_DCORE3_TPC_0_3] =1054GAUDI2_DCORE3_ENGINE_ID_TPC_0,1055[GAUDI2_QUEUE_ID_DCORE3_TPC_1_0...GAUDI2_QUEUE_ID_DCORE3_TPC_1_3] =1056GAUDI2_DCORE3_ENGINE_ID_TPC_1,1057[GAUDI2_QUEUE_ID_DCORE3_TPC_2_0...GAUDI2_QUEUE_ID_DCORE3_TPC_2_3] =1058GAUDI2_DCORE3_ENGINE_ID_TPC_2,1059[GAUDI2_QUEUE_ID_DCORE3_TPC_3_0...GAUDI2_QUEUE_ID_DCORE3_TPC_3_3] =1060GAUDI2_DCORE3_ENGINE_ID_TPC_3,1061[GAUDI2_QUEUE_ID_DCORE3_TPC_4_0...GAUDI2_QUEUE_ID_DCORE3_TPC_4_3] =1062GAUDI2_DCORE3_ENGINE_ID_TPC_4,1063[GAUDI2_QUEUE_ID_DCORE3_TPC_5_0...GAUDI2_QUEUE_ID_DCORE3_TPC_5_3] =1064GAUDI2_DCORE3_ENGINE_ID_TPC_5,1065[GAUDI2_QUEUE_ID_NIC_0_0...GAUDI2_QUEUE_ID_NIC_0_3] = GAUDI2_ENGINE_ID_NIC0_0,1066[GAUDI2_QUEUE_ID_NIC_1_0...GAUDI2_QUEUE_ID_NIC_1_3] = GAUDI2_ENGINE_ID_NIC0_1,1067[GAUDI2_QUEUE_ID_NIC_2_0...GAUDI2_QUEUE_ID_NIC_2_3] = GAUDI2_ENGINE_ID_NIC1_0,1068[GAUDI2_QUEUE_ID_NIC_3_0...GAUDI2_QUEUE_ID_NIC_3_3] = GAUDI2_ENGINE_ID_NIC1_1,1069[GAUDI2_QUEUE_ID_NIC_4_0...GAUDI2_QUEUE_ID_NIC_4_3] = GAUDI2_ENGINE_ID_NIC2_0,1070[GAUDI2_QUEUE_ID_NIC_5_0...GAUDI2_QUEUE_ID_NIC_5_3] = GAUDI2_ENGINE_ID_NIC2_1,1071[GAUDI2_QUEUE_ID_NIC_6_0...GAUDI2_QUEUE_ID_NIC_6_3] = GAUDI2_ENGINE_ID_NIC3_0,1072[GAUDI2_QUEUE_ID_NIC_7_0...GAUDI2_QUEUE_ID_NIC_7_3] = GAUDI2_ENGINE_ID_NIC3_1,1073[GAUDI2_QUEUE_ID_NIC_8_0...GAUDI2_QUEUE_ID_NIC_8_3] = GAUDI2_ENGINE_ID_NIC4_0,1074[GAUDI2_QUEUE_ID_NIC_9_0...GAUDI2_QUEUE_ID_NIC_9_3] = GAUDI2_ENGINE_ID_NIC4_1,1075[GAUDI2_QUEUE_ID_NIC_10_0...GAUDI2_QUEUE_ID_NIC_10_3] = GAUDI2_ENGINE_ID_NIC5_0,1076[GAUDI2_QUEUE_ID_NIC_11_0...GAUDI2_QUEUE_ID_NIC_11_3] = GAUDI2_ENGINE_ID_NIC5_1,1077[GAUDI2_QUEUE_ID_NIC_12_0...GAUDI2_QUEUE_ID_NIC_12_3] = GAUDI2_ENGINE_ID_NIC6_0,1078[GAUDI2_QUEUE_ID_NIC_13_0...GAUDI2_QUEUE_ID_NIC_13_3] = GAUDI2_ENGINE_ID_NIC6_1,1079[GAUDI2_QUEUE_ID_NIC_14_0...GAUDI2_QUEUE_ID_NIC_14_3] = GAUDI2_ENGINE_ID_NIC7_0,1080[GAUDI2_QUEUE_ID_NIC_15_0...GAUDI2_QUEUE_ID_NIC_15_3] = GAUDI2_ENGINE_ID_NIC7_1,1081[GAUDI2_QUEUE_ID_NIC_16_0...GAUDI2_QUEUE_ID_NIC_16_3] = GAUDI2_ENGINE_ID_NIC8_0,1082[GAUDI2_QUEUE_ID_NIC_17_0...GAUDI2_QUEUE_ID_NIC_17_3] = GAUDI2_ENGINE_ID_NIC8_1,1083[GAUDI2_QUEUE_ID_NIC_18_0...GAUDI2_QUEUE_ID_NIC_18_3] = GAUDI2_ENGINE_ID_NIC9_0,1084[GAUDI2_QUEUE_ID_NIC_19_0...GAUDI2_QUEUE_ID_NIC_19_3] = GAUDI2_ENGINE_ID_NIC9_1,1085[GAUDI2_QUEUE_ID_NIC_20_0...GAUDI2_QUEUE_ID_NIC_20_3] = GAUDI2_ENGINE_ID_NIC10_0,1086[GAUDI2_QUEUE_ID_NIC_21_0...GAUDI2_QUEUE_ID_NIC_21_3] = GAUDI2_ENGINE_ID_NIC10_1,1087[GAUDI2_QUEUE_ID_NIC_22_0...GAUDI2_QUEUE_ID_NIC_22_3] = GAUDI2_ENGINE_ID_NIC11_0,1088[GAUDI2_QUEUE_ID_NIC_23_0...GAUDI2_QUEUE_ID_NIC_23_3] = GAUDI2_ENGINE_ID_NIC11_1,1089[GAUDI2_QUEUE_ID_ROT_0_0...GAUDI2_QUEUE_ID_ROT_0_3] = GAUDI2_ENGINE_ID_ROT_0,1090[GAUDI2_QUEUE_ID_ROT_1_0...GAUDI2_QUEUE_ID_ROT_1_3] = GAUDI2_ENGINE_ID_ROT_1,1091};10921093const u32 gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_SIZE] = {1094[GAUDI2_QUEUE_ID_PDMA_0_0] = mmPDMA0_QM_BASE,1095[GAUDI2_QUEUE_ID_PDMA_0_1] = mmPDMA0_QM_BASE,1096[GAUDI2_QUEUE_ID_PDMA_0_2] = mmPDMA0_QM_BASE,1097[GAUDI2_QUEUE_ID_PDMA_0_3] = mmPDMA0_QM_BASE,1098[GAUDI2_QUEUE_ID_PDMA_1_0] = mmPDMA1_QM_BASE,1099[GAUDI2_QUEUE_ID_PDMA_1_1] = mmPDMA1_QM_BASE,1100[GAUDI2_QUEUE_ID_PDMA_1_2] = mmPDMA1_QM_BASE,1101[GAUDI2_QUEUE_ID_PDMA_1_3] = mmPDMA1_QM_BASE,1102[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0] = mmDCORE0_EDMA0_QM_BASE,1103[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_1] = mmDCORE0_EDMA0_QM_BASE,1104[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_2] = mmDCORE0_EDMA0_QM_BASE,1105[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3] = mmDCORE0_EDMA0_QM_BASE,1106[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0] = mmDCORE0_EDMA1_QM_BASE,1107[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_1] = mmDCORE0_EDMA1_QM_BASE,1108[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_2] = mmDCORE0_EDMA1_QM_BASE,1109[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3] = mmDCORE0_EDMA1_QM_BASE,1110[GAUDI2_QUEUE_ID_DCORE0_MME_0_0] = mmDCORE0_MME_QM_BASE,1111[GAUDI2_QUEUE_ID_DCORE0_MME_0_1] = mmDCORE0_MME_QM_BASE,1112[GAUDI2_QUEUE_ID_DCORE0_MME_0_2] = mmDCORE0_MME_QM_BASE,1113[GAUDI2_QUEUE_ID_DCORE0_MME_0_3] = mmDCORE0_MME_QM_BASE,1114[GAUDI2_QUEUE_ID_DCORE0_TPC_0_0] = mmDCORE0_TPC0_QM_BASE,1115[GAUDI2_QUEUE_ID_DCORE0_TPC_0_1] = mmDCORE0_TPC0_QM_BASE,1116[GAUDI2_QUEUE_ID_DCORE0_TPC_0_2] = mmDCORE0_TPC0_QM_BASE,1117[GAUDI2_QUEUE_ID_DCORE0_TPC_0_3] = mmDCORE0_TPC0_QM_BASE,1118[GAUDI2_QUEUE_ID_DCORE0_TPC_1_0] = mmDCORE0_TPC1_QM_BASE,1119[GAUDI2_QUEUE_ID_DCORE0_TPC_1_1] = mmDCORE0_TPC1_QM_BASE,1120[GAUDI2_QUEUE_ID_DCORE0_TPC_1_2] = mmDCORE0_TPC1_QM_BASE,1121[GAUDI2_QUEUE_ID_DCORE0_TPC_1_3] = mmDCORE0_TPC1_QM_BASE,1122[GAUDI2_QUEUE_ID_DCORE0_TPC_2_0] = mmDCORE0_TPC2_QM_BASE,1123[GAUDI2_QUEUE_ID_DCORE0_TPC_2_1] = mmDCORE0_TPC2_QM_BASE,1124[GAUDI2_QUEUE_ID_DCORE0_TPC_2_2] = mmDCORE0_TPC2_QM_BASE,1125[GAUDI2_QUEUE_ID_DCORE0_TPC_2_3] = mmDCORE0_TPC2_QM_BASE,1126[GAUDI2_QUEUE_ID_DCORE0_TPC_3_0] = mmDCORE0_TPC3_QM_BASE,1127[GAUDI2_QUEUE_ID_DCORE0_TPC_3_1] = mmDCORE0_TPC3_QM_BASE,1128[GAUDI2_QUEUE_ID_DCORE0_TPC_3_2] = mmDCORE0_TPC3_QM_BASE,1129[GAUDI2_QUEUE_ID_DCORE0_TPC_3_3] = mmDCORE0_TPC3_QM_BASE,1130[GAUDI2_QUEUE_ID_DCORE0_TPC_4_0] = mmDCORE0_TPC4_QM_BASE,1131[GAUDI2_QUEUE_ID_DCORE0_TPC_4_1] = mmDCORE0_TPC4_QM_BASE,1132[GAUDI2_QUEUE_ID_DCORE0_TPC_4_2] = mmDCORE0_TPC4_QM_BASE,1133[GAUDI2_QUEUE_ID_DCORE0_TPC_4_3] = mmDCORE0_TPC4_QM_BASE,1134[GAUDI2_QUEUE_ID_DCORE0_TPC_5_0] = mmDCORE0_TPC5_QM_BASE,1135[GAUDI2_QUEUE_ID_DCORE0_TPC_5_1] = mmDCORE0_TPC5_QM_BASE,1136[GAUDI2_QUEUE_ID_DCORE0_TPC_5_2] = mmDCORE0_TPC5_QM_BASE,1137[GAUDI2_QUEUE_ID_DCORE0_TPC_5_3] = mmDCORE0_TPC5_QM_BASE,1138[GAUDI2_QUEUE_ID_DCORE0_TPC_6_0] = mmDCORE0_TPC6_QM_BASE,1139[GAUDI2_QUEUE_ID_DCORE0_TPC_6_1] = mmDCORE0_TPC6_QM_BASE,1140[GAUDI2_QUEUE_ID_DCORE0_TPC_6_2] = mmDCORE0_TPC6_QM_BASE,1141[GAUDI2_QUEUE_ID_DCORE0_TPC_6_3] = mmDCORE0_TPC6_QM_BASE,1142[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0] = mmDCORE1_EDMA0_QM_BASE,1143[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_1] = mmDCORE1_EDMA0_QM_BASE,1144[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_2] = mmDCORE1_EDMA0_QM_BASE,1145[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3] = mmDCORE1_EDMA0_QM_BASE,1146[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0] = mmDCORE1_EDMA1_QM_BASE,1147[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_1] = mmDCORE1_EDMA1_QM_BASE,1148[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_2] = mmDCORE1_EDMA1_QM_BASE,1149[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3] = mmDCORE1_EDMA1_QM_BASE,1150[GAUDI2_QUEUE_ID_DCORE1_MME_0_0] = mmDCORE1_MME_QM_BASE,1151[GAUDI2_QUEUE_ID_DCORE1_MME_0_1] = mmDCORE1_MME_QM_BASE,1152[GAUDI2_QUEUE_ID_DCORE1_MME_0_2] = mmDCORE1_MME_QM_BASE,1153[GAUDI2_QUEUE_ID_DCORE1_MME_0_3] = mmDCORE1_MME_QM_BASE,1154[GAUDI2_QUEUE_ID_DCORE1_TPC_0_0] = mmDCORE1_TPC0_QM_BASE,1155[GAUDI2_QUEUE_ID_DCORE1_TPC_0_1] = mmDCORE1_TPC0_QM_BASE,1156[GAUDI2_QUEUE_ID_DCORE1_TPC_0_2] = mmDCORE1_TPC0_QM_BASE,1157[GAUDI2_QUEUE_ID_DCORE1_TPC_0_3] = mmDCORE1_TPC0_QM_BASE,1158[GAUDI2_QUEUE_ID_DCORE1_TPC_1_0] = mmDCORE1_TPC1_QM_BASE,1159[GAUDI2_QUEUE_ID_DCORE1_TPC_1_1] = mmDCORE1_TPC1_QM_BASE,1160[GAUDI2_QUEUE_ID_DCORE1_TPC_1_2] = mmDCORE1_TPC1_QM_BASE,1161[GAUDI2_QUEUE_ID_DCORE1_TPC_1_3] = mmDCORE1_TPC1_QM_BASE,1162[GAUDI2_QUEUE_ID_DCORE1_TPC_2_0] = mmDCORE1_TPC2_QM_BASE,1163[GAUDI2_QUEUE_ID_DCORE1_TPC_2_1] = mmDCORE1_TPC2_QM_BASE,1164[GAUDI2_QUEUE_ID_DCORE1_TPC_2_2] = mmDCORE1_TPC2_QM_BASE,1165[GAUDI2_QUEUE_ID_DCORE1_TPC_2_3] = mmDCORE1_TPC2_QM_BASE,1166[GAUDI2_QUEUE_ID_DCORE1_TPC_3_0] = mmDCORE1_TPC3_QM_BASE,1167[GAUDI2_QUEUE_ID_DCORE1_TPC_3_1] = mmDCORE1_TPC3_QM_BASE,1168[GAUDI2_QUEUE_ID_DCORE1_TPC_3_2] = mmDCORE1_TPC3_QM_BASE,1169[GAUDI2_QUEUE_ID_DCORE1_TPC_3_3] = mmDCORE1_TPC3_QM_BASE,1170[GAUDI2_QUEUE_ID_DCORE1_TPC_4_0] = mmDCORE1_TPC4_QM_BASE,1171[GAUDI2_QUEUE_ID_DCORE1_TPC_4_1] = mmDCORE1_TPC4_QM_BASE,1172[GAUDI2_QUEUE_ID_DCORE1_TPC_4_2] = mmDCORE1_TPC4_QM_BASE,1173[GAUDI2_QUEUE_ID_DCORE1_TPC_4_3] = mmDCORE1_TPC4_QM_BASE,1174[GAUDI2_QUEUE_ID_DCORE1_TPC_5_0] = mmDCORE1_TPC5_QM_BASE,1175[GAUDI2_QUEUE_ID_DCORE1_TPC_5_1] = mmDCORE1_TPC5_QM_BASE,1176[GAUDI2_QUEUE_ID_DCORE1_TPC_5_2] = mmDCORE1_TPC5_QM_BASE,1177[GAUDI2_QUEUE_ID_DCORE1_TPC_5_3] = mmDCORE1_TPC5_QM_BASE,1178[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0] = mmDCORE2_EDMA0_QM_BASE,1179[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_1] = mmDCORE2_EDMA0_QM_BASE,1180[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_2] = mmDCORE2_EDMA0_QM_BASE,1181[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3] = mmDCORE2_EDMA0_QM_BASE,1182[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0] = mmDCORE2_EDMA1_QM_BASE,1183[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_1] = mmDCORE2_EDMA1_QM_BASE,1184[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_2] = mmDCORE2_EDMA1_QM_BASE,1185[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3] = mmDCORE2_EDMA1_QM_BASE,1186[GAUDI2_QUEUE_ID_DCORE2_MME_0_0] = mmDCORE2_MME_QM_BASE,1187[GAUDI2_QUEUE_ID_DCORE2_MME_0_1] = mmDCORE2_MME_QM_BASE,1188[GAUDI2_QUEUE_ID_DCORE2_MME_0_2] = mmDCORE2_MME_QM_BASE,1189[GAUDI2_QUEUE_ID_DCORE2_MME_0_3] = mmDCORE2_MME_QM_BASE,1190[GAUDI2_QUEUE_ID_DCORE2_TPC_0_0] = mmDCORE2_TPC0_QM_BASE,1191[GAUDI2_QUEUE_ID_DCORE2_TPC_0_1] = mmDCORE2_TPC0_QM_BASE,1192[GAUDI2_QUEUE_ID_DCORE2_TPC_0_2] = mmDCORE2_TPC0_QM_BASE,1193[GAUDI2_QUEUE_ID_DCORE2_TPC_0_3] = mmDCORE2_TPC0_QM_BASE,1194[GAUDI2_QUEUE_ID_DCORE2_TPC_1_0] = mmDCORE2_TPC1_QM_BASE,1195[GAUDI2_QUEUE_ID_DCORE2_TPC_1_1] = mmDCORE2_TPC1_QM_BASE,1196[GAUDI2_QUEUE_ID_DCORE2_TPC_1_2] = mmDCORE2_TPC1_QM_BASE,1197[GAUDI2_QUEUE_ID_DCORE2_TPC_1_3] = mmDCORE2_TPC1_QM_BASE,1198[GAUDI2_QUEUE_ID_DCORE2_TPC_2_0] = mmDCORE2_TPC2_QM_BASE,1199[GAUDI2_QUEUE_ID_DCORE2_TPC_2_1] = mmDCORE2_TPC2_QM_BASE,1200[GAUDI2_QUEUE_ID_DCORE2_TPC_2_2] = mmDCORE2_TPC2_QM_BASE,1201[GAUDI2_QUEUE_ID_DCORE2_TPC_2_3] = mmDCORE2_TPC2_QM_BASE,1202[GAUDI2_QUEUE_ID_DCORE2_TPC_3_0] = mmDCORE2_TPC3_QM_BASE,1203[GAUDI2_QUEUE_ID_DCORE2_TPC_3_1] = mmDCORE2_TPC3_QM_BASE,1204[GAUDI2_QUEUE_ID_DCORE2_TPC_3_2] = mmDCORE2_TPC3_QM_BASE,1205[GAUDI2_QUEUE_ID_DCORE2_TPC_3_3] = mmDCORE2_TPC3_QM_BASE,1206[GAUDI2_QUEUE_ID_DCORE2_TPC_4_0] = mmDCORE2_TPC4_QM_BASE,1207[GAUDI2_QUEUE_ID_DCORE2_TPC_4_1] = mmDCORE2_TPC4_QM_BASE,1208[GAUDI2_QUEUE_ID_DCORE2_TPC_4_2] = mmDCORE2_TPC4_QM_BASE,1209[GAUDI2_QUEUE_ID_DCORE2_TPC_4_3] = mmDCORE2_TPC4_QM_BASE,1210[GAUDI2_QUEUE_ID_DCORE2_TPC_5_0] = mmDCORE2_TPC5_QM_BASE,1211[GAUDI2_QUEUE_ID_DCORE2_TPC_5_1] = mmDCORE2_TPC5_QM_BASE,1212[GAUDI2_QUEUE_ID_DCORE2_TPC_5_2] = mmDCORE2_TPC5_QM_BASE,1213[GAUDI2_QUEUE_ID_DCORE2_TPC_5_3] = mmDCORE2_TPC5_QM_BASE,1214[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0] = mmDCORE3_EDMA0_QM_BASE,1215[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_1] = mmDCORE3_EDMA0_QM_BASE,1216[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_2] = mmDCORE3_EDMA0_QM_BASE,1217[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3] = mmDCORE3_EDMA0_QM_BASE,1218[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0] = mmDCORE3_EDMA1_QM_BASE,1219[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1] = mmDCORE3_EDMA1_QM_BASE,1220[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2] = mmDCORE3_EDMA1_QM_BASE,1221[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3] = mmDCORE3_EDMA1_QM_BASE,1222[GAUDI2_QUEUE_ID_DCORE3_MME_0_0] = mmDCORE3_MME_QM_BASE,1223[GAUDI2_QUEUE_ID_DCORE3_MME_0_1] = mmDCORE3_MME_QM_BASE,1224[GAUDI2_QUEUE_ID_DCORE3_MME_0_2] = mmDCORE3_MME_QM_BASE,1225[GAUDI2_QUEUE_ID_DCORE3_MME_0_3] = mmDCORE3_MME_QM_BASE,1226[GAUDI2_QUEUE_ID_DCORE3_TPC_0_0] = mmDCORE3_TPC0_QM_BASE,1227[GAUDI2_QUEUE_ID_DCORE3_TPC_0_1] = mmDCORE3_TPC0_QM_BASE,1228[GAUDI2_QUEUE_ID_DCORE3_TPC_0_2] = mmDCORE3_TPC0_QM_BASE,1229[GAUDI2_QUEUE_ID_DCORE3_TPC_0_3] = mmDCORE3_TPC0_QM_BASE,1230[GAUDI2_QUEUE_ID_DCORE3_TPC_1_0] = mmDCORE3_TPC1_QM_BASE,1231[GAUDI2_QUEUE_ID_DCORE3_TPC_1_1] = mmDCORE3_TPC1_QM_BASE,1232[GAUDI2_QUEUE_ID_DCORE3_TPC_1_2] = mmDCORE3_TPC1_QM_BASE,1233[GAUDI2_QUEUE_ID_DCORE3_TPC_1_3] = mmDCORE3_TPC1_QM_BASE,1234[GAUDI2_QUEUE_ID_DCORE3_TPC_2_0] = mmDCORE3_TPC2_QM_BASE,1235[GAUDI2_QUEUE_ID_DCORE3_TPC_2_1] = mmDCORE3_TPC2_QM_BASE,1236[GAUDI2_QUEUE_ID_DCORE3_TPC_2_2] = mmDCORE3_TPC2_QM_BASE,1237[GAUDI2_QUEUE_ID_DCORE3_TPC_2_3] = mmDCORE3_TPC2_QM_BASE,1238[GAUDI2_QUEUE_ID_DCORE3_TPC_3_0] = mmDCORE3_TPC3_QM_BASE,1239[GAUDI2_QUEUE_ID_DCORE3_TPC_3_1] = mmDCORE3_TPC3_QM_BASE,1240[GAUDI2_QUEUE_ID_DCORE3_TPC_3_2] = mmDCORE3_TPC3_QM_BASE,1241[GAUDI2_QUEUE_ID_DCORE3_TPC_3_3] = mmDCORE3_TPC3_QM_BASE,1242[GAUDI2_QUEUE_ID_DCORE3_TPC_4_0] = mmDCORE3_TPC4_QM_BASE,1243[GAUDI2_QUEUE_ID_DCORE3_TPC_4_1] = mmDCORE3_TPC4_QM_BASE,1244[GAUDI2_QUEUE_ID_DCORE3_TPC_4_2] = mmDCORE3_TPC4_QM_BASE,1245[GAUDI2_QUEUE_ID_DCORE3_TPC_4_3] = mmDCORE3_TPC4_QM_BASE,1246[GAUDI2_QUEUE_ID_DCORE3_TPC_5_0] = mmDCORE3_TPC5_QM_BASE,1247[GAUDI2_QUEUE_ID_DCORE3_TPC_5_1] = mmDCORE3_TPC5_QM_BASE,1248[GAUDI2_QUEUE_ID_DCORE3_TPC_5_2] = mmDCORE3_TPC5_QM_BASE,1249[GAUDI2_QUEUE_ID_DCORE3_TPC_5_3] = mmDCORE3_TPC5_QM_BASE,1250[GAUDI2_QUEUE_ID_NIC_0_0] = mmNIC0_QM0_BASE,1251[GAUDI2_QUEUE_ID_NIC_0_1] = mmNIC0_QM0_BASE,1252[GAUDI2_QUEUE_ID_NIC_0_2] = mmNIC0_QM0_BASE,1253[GAUDI2_QUEUE_ID_NIC_0_3] = mmNIC0_QM0_BASE,1254[GAUDI2_QUEUE_ID_NIC_1_0] = mmNIC0_QM1_BASE,1255[GAUDI2_QUEUE_ID_NIC_1_1] = mmNIC0_QM1_BASE,1256[GAUDI2_QUEUE_ID_NIC_1_2] = mmNIC0_QM1_BASE,1257[GAUDI2_QUEUE_ID_NIC_1_3] = mmNIC0_QM1_BASE,1258[GAUDI2_QUEUE_ID_NIC_2_0] = mmNIC1_QM0_BASE,1259[GAUDI2_QUEUE_ID_NIC_2_1] = mmNIC1_QM0_BASE,1260[GAUDI2_QUEUE_ID_NIC_2_2] = mmNIC1_QM0_BASE,1261[GAUDI2_QUEUE_ID_NIC_2_3] = mmNIC1_QM0_BASE,1262[GAUDI2_QUEUE_ID_NIC_3_0] = mmNIC1_QM1_BASE,1263[GAUDI2_QUEUE_ID_NIC_3_1] = mmNIC1_QM1_BASE,1264[GAUDI2_QUEUE_ID_NIC_3_2] = mmNIC1_QM1_BASE,1265[GAUDI2_QUEUE_ID_NIC_3_3] = mmNIC1_QM1_BASE,1266[GAUDI2_QUEUE_ID_NIC_4_0] = mmNIC2_QM0_BASE,1267[GAUDI2_QUEUE_ID_NIC_4_1] = mmNIC2_QM0_BASE,1268[GAUDI2_QUEUE_ID_NIC_4_2] = mmNIC2_QM0_BASE,1269[GAUDI2_QUEUE_ID_NIC_4_3] = mmNIC2_QM0_BASE,1270[GAUDI2_QUEUE_ID_NIC_5_0] = mmNIC2_QM1_BASE,1271[GAUDI2_QUEUE_ID_NIC_5_1] = mmNIC2_QM1_BASE,1272[GAUDI2_QUEUE_ID_NIC_5_2] = mmNIC2_QM1_BASE,1273[GAUDI2_QUEUE_ID_NIC_5_3] = mmNIC2_QM1_BASE,1274[GAUDI2_QUEUE_ID_NIC_6_0] = mmNIC3_QM0_BASE,1275[GAUDI2_QUEUE_ID_NIC_6_1] = mmNIC3_QM0_BASE,1276[GAUDI2_QUEUE_ID_NIC_6_2] = mmNIC3_QM0_BASE,1277[GAUDI2_QUEUE_ID_NIC_6_3] = mmNIC3_QM0_BASE,1278[GAUDI2_QUEUE_ID_NIC_7_0] = mmNIC3_QM1_BASE,1279[GAUDI2_QUEUE_ID_NIC_7_1] = mmNIC3_QM1_BASE,1280[GAUDI2_QUEUE_ID_NIC_7_2] = mmNIC3_QM1_BASE,1281[GAUDI2_QUEUE_ID_NIC_7_3] = mmNIC3_QM1_BASE,1282[GAUDI2_QUEUE_ID_NIC_8_0] = mmNIC4_QM0_BASE,1283[GAUDI2_QUEUE_ID_NIC_8_1] = mmNIC4_QM0_BASE,1284[GAUDI2_QUEUE_ID_NIC_8_2] = mmNIC4_QM0_BASE,1285[GAUDI2_QUEUE_ID_NIC_8_3] = mmNIC4_QM0_BASE,1286[GAUDI2_QUEUE_ID_NIC_9_0] = mmNIC4_QM1_BASE,1287[GAUDI2_QUEUE_ID_NIC_9_1] = mmNIC4_QM1_BASE,1288[GAUDI2_QUEUE_ID_NIC_9_2] = mmNIC4_QM1_BASE,1289[GAUDI2_QUEUE_ID_NIC_9_3] = mmNIC4_QM1_BASE,1290[GAUDI2_QUEUE_ID_NIC_10_0] = mmNIC5_QM0_BASE,1291[GAUDI2_QUEUE_ID_NIC_10_1] = mmNIC5_QM0_BASE,1292[GAUDI2_QUEUE_ID_NIC_10_2] = mmNIC5_QM0_BASE,1293[GAUDI2_QUEUE_ID_NIC_10_3] = mmNIC5_QM0_BASE,1294[GAUDI2_QUEUE_ID_NIC_11_0] = mmNIC5_QM1_BASE,1295[GAUDI2_QUEUE_ID_NIC_11_1] = mmNIC5_QM1_BASE,1296[GAUDI2_QUEUE_ID_NIC_11_2] = mmNIC5_QM1_BASE,1297[GAUDI2_QUEUE_ID_NIC_11_3] = mmNIC5_QM1_BASE,1298[GAUDI2_QUEUE_ID_NIC_12_0] = mmNIC6_QM0_BASE,1299[GAUDI2_QUEUE_ID_NIC_12_1] = mmNIC6_QM0_BASE,1300[GAUDI2_QUEUE_ID_NIC_12_2] = mmNIC6_QM0_BASE,1301[GAUDI2_QUEUE_ID_NIC_12_3] = mmNIC6_QM0_BASE,1302[GAUDI2_QUEUE_ID_NIC_13_0] = mmNIC6_QM1_BASE,1303[GAUDI2_QUEUE_ID_NIC_13_1] = mmNIC6_QM1_BASE,1304[GAUDI2_QUEUE_ID_NIC_13_2] = mmNIC6_QM1_BASE,1305[GAUDI2_QUEUE_ID_NIC_13_3] = mmNIC6_QM1_BASE,1306[GAUDI2_QUEUE_ID_NIC_14_0] = mmNIC7_QM0_BASE,1307[GAUDI2_QUEUE_ID_NIC_14_1] = mmNIC7_QM0_BASE,1308[GAUDI2_QUEUE_ID_NIC_14_2] = mmNIC7_QM0_BASE,1309[GAUDI2_QUEUE_ID_NIC_14_3] = mmNIC7_QM0_BASE,1310[GAUDI2_QUEUE_ID_NIC_15_0] = mmNIC7_QM1_BASE,1311[GAUDI2_QUEUE_ID_NIC_15_1] = mmNIC7_QM1_BASE,1312[GAUDI2_QUEUE_ID_NIC_15_2] = mmNIC7_QM1_BASE,1313[GAUDI2_QUEUE_ID_NIC_15_3] = mmNIC7_QM1_BASE,1314[GAUDI2_QUEUE_ID_NIC_16_0] = mmNIC8_QM0_BASE,1315[GAUDI2_QUEUE_ID_NIC_16_1] = mmNIC8_QM0_BASE,1316[GAUDI2_QUEUE_ID_NIC_16_2] = mmNIC8_QM0_BASE,1317[GAUDI2_QUEUE_ID_NIC_16_3] = mmNIC8_QM0_BASE,1318[GAUDI2_QUEUE_ID_NIC_17_0] = mmNIC8_QM1_BASE,1319[GAUDI2_QUEUE_ID_NIC_17_1] = mmNIC8_QM1_BASE,1320[GAUDI2_QUEUE_ID_NIC_17_2] = mmNIC8_QM1_BASE,1321[GAUDI2_QUEUE_ID_NIC_17_3] = mmNIC8_QM1_BASE,1322[GAUDI2_QUEUE_ID_NIC_18_0] = mmNIC9_QM0_BASE,1323[GAUDI2_QUEUE_ID_NIC_18_1] = mmNIC9_QM0_BASE,1324[GAUDI2_QUEUE_ID_NIC_18_2] = mmNIC9_QM0_BASE,1325[GAUDI2_QUEUE_ID_NIC_18_3] = mmNIC9_QM0_BASE,1326[GAUDI2_QUEUE_ID_NIC_19_0] = mmNIC9_QM1_BASE,1327[GAUDI2_QUEUE_ID_NIC_19_1] = mmNIC9_QM1_BASE,1328[GAUDI2_QUEUE_ID_NIC_19_2] = mmNIC9_QM1_BASE,1329[GAUDI2_QUEUE_ID_NIC_19_3] = mmNIC9_QM1_BASE,1330[GAUDI2_QUEUE_ID_NIC_20_0] = mmNIC10_QM0_BASE,1331[GAUDI2_QUEUE_ID_NIC_20_1] = mmNIC10_QM0_BASE,1332[GAUDI2_QUEUE_ID_NIC_20_2] = mmNIC10_QM0_BASE,1333[GAUDI2_QUEUE_ID_NIC_20_3] = mmNIC10_QM0_BASE,1334[GAUDI2_QUEUE_ID_NIC_21_0] = mmNIC10_QM1_BASE,1335[GAUDI2_QUEUE_ID_NIC_21_1] = mmNIC10_QM1_BASE,1336[GAUDI2_QUEUE_ID_NIC_21_2] = mmNIC10_QM1_BASE,1337[GAUDI2_QUEUE_ID_NIC_21_3] = mmNIC10_QM1_BASE,1338[GAUDI2_QUEUE_ID_NIC_22_0] = mmNIC11_QM0_BASE,1339[GAUDI2_QUEUE_ID_NIC_22_1] = mmNIC11_QM0_BASE,1340[GAUDI2_QUEUE_ID_NIC_22_2] = mmNIC11_QM0_BASE,1341[GAUDI2_QUEUE_ID_NIC_22_3] = mmNIC11_QM0_BASE,1342[GAUDI2_QUEUE_ID_NIC_23_0] = mmNIC11_QM1_BASE,1343[GAUDI2_QUEUE_ID_NIC_23_1] = mmNIC11_QM1_BASE,1344[GAUDI2_QUEUE_ID_NIC_23_2] = mmNIC11_QM1_BASE,1345[GAUDI2_QUEUE_ID_NIC_23_3] = mmNIC11_QM1_BASE,1346[GAUDI2_QUEUE_ID_ROT_0_0] = mmROT0_QM_BASE,1347[GAUDI2_QUEUE_ID_ROT_0_1] = mmROT0_QM_BASE,1348[GAUDI2_QUEUE_ID_ROT_0_2] = mmROT0_QM_BASE,1349[GAUDI2_QUEUE_ID_ROT_0_3] = mmROT0_QM_BASE,1350[GAUDI2_QUEUE_ID_ROT_1_0] = mmROT1_QM_BASE,1351[GAUDI2_QUEUE_ID_ROT_1_1] = mmROT1_QM_BASE,1352[GAUDI2_QUEUE_ID_ROT_1_2] = mmROT1_QM_BASE,1353[GAUDI2_QUEUE_ID_ROT_1_3] = mmROT1_QM_BASE1354};13551356static const u32 gaudi2_arc_blocks_bases[NUM_ARC_CPUS] = {1357[CPU_ID_SCHED_ARC0] = mmARC_FARM_ARC0_AUX_BASE,1358[CPU_ID_SCHED_ARC1] = mmARC_FARM_ARC1_AUX_BASE,1359[CPU_ID_SCHED_ARC2] = mmARC_FARM_ARC2_AUX_BASE,1360[CPU_ID_SCHED_ARC3] = mmARC_FARM_ARC3_AUX_BASE,1361[CPU_ID_SCHED_ARC4] = mmDCORE1_MME_QM_ARC_AUX_BASE,1362[CPU_ID_SCHED_ARC5] = mmDCORE3_MME_QM_ARC_AUX_BASE,1363[CPU_ID_TPC_QMAN_ARC0] = mmDCORE0_TPC0_QM_ARC_AUX_BASE,1364[CPU_ID_TPC_QMAN_ARC1] = mmDCORE0_TPC1_QM_ARC_AUX_BASE,1365[CPU_ID_TPC_QMAN_ARC2] = mmDCORE0_TPC2_QM_ARC_AUX_BASE,1366[CPU_ID_TPC_QMAN_ARC3] = mmDCORE0_TPC3_QM_ARC_AUX_BASE,1367[CPU_ID_TPC_QMAN_ARC4] = mmDCORE0_TPC4_QM_ARC_AUX_BASE,1368[CPU_ID_TPC_QMAN_ARC5] = mmDCORE0_TPC5_QM_ARC_AUX_BASE,1369[CPU_ID_TPC_QMAN_ARC6] = mmDCORE1_TPC0_QM_ARC_AUX_BASE,1370[CPU_ID_TPC_QMAN_ARC7] = mmDCORE1_TPC1_QM_ARC_AUX_BASE,1371[CPU_ID_TPC_QMAN_ARC8] = mmDCORE1_TPC2_QM_ARC_AUX_BASE,1372[CPU_ID_TPC_QMAN_ARC9] = mmDCORE1_TPC3_QM_ARC_AUX_BASE,1373[CPU_ID_TPC_QMAN_ARC10] = mmDCORE1_TPC4_QM_ARC_AUX_BASE,1374[CPU_ID_TPC_QMAN_ARC11] = mmDCORE1_TPC5_QM_ARC_AUX_BASE,1375[CPU_ID_TPC_QMAN_ARC12] = mmDCORE2_TPC0_QM_ARC_AUX_BASE,1376[CPU_ID_TPC_QMAN_ARC13] = mmDCORE2_TPC1_QM_ARC_AUX_BASE,1377[CPU_ID_TPC_QMAN_ARC14] = mmDCORE2_TPC2_QM_ARC_AUX_BASE,1378[CPU_ID_TPC_QMAN_ARC15] = mmDCORE2_TPC3_QM_ARC_AUX_BASE,1379[CPU_ID_TPC_QMAN_ARC16] = mmDCORE2_TPC4_QM_ARC_AUX_BASE,1380[CPU_ID_TPC_QMAN_ARC17] = mmDCORE2_TPC5_QM_ARC_AUX_BASE,1381[CPU_ID_TPC_QMAN_ARC18] = mmDCORE3_TPC0_QM_ARC_AUX_BASE,1382[CPU_ID_TPC_QMAN_ARC19] = mmDCORE3_TPC1_QM_ARC_AUX_BASE,1383[CPU_ID_TPC_QMAN_ARC20] = mmDCORE3_TPC2_QM_ARC_AUX_BASE,1384[CPU_ID_TPC_QMAN_ARC21] = mmDCORE3_TPC3_QM_ARC_AUX_BASE,1385[CPU_ID_TPC_QMAN_ARC22] = mmDCORE3_TPC4_QM_ARC_AUX_BASE,1386[CPU_ID_TPC_QMAN_ARC23] = mmDCORE3_TPC5_QM_ARC_AUX_BASE,1387[CPU_ID_TPC_QMAN_ARC24] = mmDCORE0_TPC6_QM_ARC_AUX_BASE,1388[CPU_ID_MME_QMAN_ARC0] = mmDCORE0_MME_QM_ARC_AUX_BASE,1389[CPU_ID_MME_QMAN_ARC1] = mmDCORE2_MME_QM_ARC_AUX_BASE,1390[CPU_ID_EDMA_QMAN_ARC0] = mmDCORE0_EDMA0_QM_ARC_AUX_BASE,1391[CPU_ID_EDMA_QMAN_ARC1] = mmDCORE0_EDMA1_QM_ARC_AUX_BASE,1392[CPU_ID_EDMA_QMAN_ARC2] = mmDCORE1_EDMA0_QM_ARC_AUX_BASE,1393[CPU_ID_EDMA_QMAN_ARC3] = mmDCORE1_EDMA1_QM_ARC_AUX_BASE,1394[CPU_ID_EDMA_QMAN_ARC4] = mmDCORE2_EDMA0_QM_ARC_AUX_BASE,1395[CPU_ID_EDMA_QMAN_ARC5] = mmDCORE2_EDMA1_QM_ARC_AUX_BASE,1396[CPU_ID_EDMA_QMAN_ARC6] = mmDCORE3_EDMA0_QM_ARC_AUX_BASE,1397[CPU_ID_EDMA_QMAN_ARC7] = mmDCORE3_EDMA1_QM_ARC_AUX_BASE,1398[CPU_ID_PDMA_QMAN_ARC0] = mmPDMA0_QM_ARC_AUX_BASE,1399[CPU_ID_PDMA_QMAN_ARC1] = mmPDMA1_QM_ARC_AUX_BASE,1400[CPU_ID_ROT_QMAN_ARC0] = mmROT0_QM_ARC_AUX_BASE,1401[CPU_ID_ROT_QMAN_ARC1] = mmROT1_QM_ARC_AUX_BASE,1402[CPU_ID_NIC_QMAN_ARC0] = mmNIC0_QM_ARC_AUX0_BASE,1403[CPU_ID_NIC_QMAN_ARC1] = mmNIC0_QM_ARC_AUX1_BASE,1404[CPU_ID_NIC_QMAN_ARC2] = mmNIC1_QM_ARC_AUX0_BASE,1405[CPU_ID_NIC_QMAN_ARC3] = mmNIC1_QM_ARC_AUX1_BASE,1406[CPU_ID_NIC_QMAN_ARC4] = mmNIC2_QM_ARC_AUX0_BASE,1407[CPU_ID_NIC_QMAN_ARC5] = mmNIC2_QM_ARC_AUX1_BASE,1408[CPU_ID_NIC_QMAN_ARC6] = mmNIC3_QM_ARC_AUX0_BASE,1409[CPU_ID_NIC_QMAN_ARC7] = mmNIC3_QM_ARC_AUX1_BASE,1410[CPU_ID_NIC_QMAN_ARC8] = mmNIC4_QM_ARC_AUX0_BASE,1411[CPU_ID_NIC_QMAN_ARC9] = mmNIC4_QM_ARC_AUX1_BASE,1412[CPU_ID_NIC_QMAN_ARC10] = mmNIC5_QM_ARC_AUX0_BASE,1413[CPU_ID_NIC_QMAN_ARC11] = mmNIC5_QM_ARC_AUX1_BASE,1414[CPU_ID_NIC_QMAN_ARC12] = mmNIC6_QM_ARC_AUX0_BASE,1415[CPU_ID_NIC_QMAN_ARC13] = mmNIC6_QM_ARC_AUX1_BASE,1416[CPU_ID_NIC_QMAN_ARC14] = mmNIC7_QM_ARC_AUX0_BASE,1417[CPU_ID_NIC_QMAN_ARC15] = mmNIC7_QM_ARC_AUX1_BASE,1418[CPU_ID_NIC_QMAN_ARC16] = mmNIC8_QM_ARC_AUX0_BASE,1419[CPU_ID_NIC_QMAN_ARC17] = mmNIC8_QM_ARC_AUX1_BASE,1420[CPU_ID_NIC_QMAN_ARC18] = mmNIC9_QM_ARC_AUX0_BASE,1421[CPU_ID_NIC_QMAN_ARC19] = mmNIC9_QM_ARC_AUX1_BASE,1422[CPU_ID_NIC_QMAN_ARC20] = mmNIC10_QM_ARC_AUX0_BASE,1423[CPU_ID_NIC_QMAN_ARC21] = mmNIC10_QM_ARC_AUX1_BASE,1424[CPU_ID_NIC_QMAN_ARC22] = mmNIC11_QM_ARC_AUX0_BASE,1425[CPU_ID_NIC_QMAN_ARC23] = mmNIC11_QM_ARC_AUX1_BASE,1426};14271428static const u32 gaudi2_arc_dccm_bases[NUM_ARC_CPUS] = {1429[CPU_ID_SCHED_ARC0] = mmARC_FARM_ARC0_DCCM0_BASE,1430[CPU_ID_SCHED_ARC1] = mmARC_FARM_ARC1_DCCM0_BASE,1431[CPU_ID_SCHED_ARC2] = mmARC_FARM_ARC2_DCCM0_BASE,1432[CPU_ID_SCHED_ARC3] = mmARC_FARM_ARC3_DCCM0_BASE,1433[CPU_ID_SCHED_ARC4] = mmDCORE1_MME_QM_ARC_DCCM_BASE,1434[CPU_ID_SCHED_ARC5] = mmDCORE3_MME_QM_ARC_DCCM_BASE,1435[CPU_ID_TPC_QMAN_ARC0] = mmDCORE0_TPC0_QM_DCCM_BASE,1436[CPU_ID_TPC_QMAN_ARC1] = mmDCORE0_TPC1_QM_DCCM_BASE,1437[CPU_ID_TPC_QMAN_ARC2] = mmDCORE0_TPC2_QM_DCCM_BASE,1438[CPU_ID_TPC_QMAN_ARC3] = mmDCORE0_TPC3_QM_DCCM_BASE,1439[CPU_ID_TPC_QMAN_ARC4] = mmDCORE0_TPC4_QM_DCCM_BASE,1440[CPU_ID_TPC_QMAN_ARC5] = mmDCORE0_TPC5_QM_DCCM_BASE,1441[CPU_ID_TPC_QMAN_ARC6] = mmDCORE1_TPC0_QM_DCCM_BASE,1442[CPU_ID_TPC_QMAN_ARC7] = mmDCORE1_TPC1_QM_DCCM_BASE,1443[CPU_ID_TPC_QMAN_ARC8] = mmDCORE1_TPC2_QM_DCCM_BASE,1444[CPU_ID_TPC_QMAN_ARC9] = mmDCORE1_TPC3_QM_DCCM_BASE,1445[CPU_ID_TPC_QMAN_ARC10] = mmDCORE1_TPC4_QM_DCCM_BASE,1446[CPU_ID_TPC_QMAN_ARC11] = mmDCORE1_TPC5_QM_DCCM_BASE,1447[CPU_ID_TPC_QMAN_ARC12] = mmDCORE2_TPC0_QM_DCCM_BASE,1448[CPU_ID_TPC_QMAN_ARC13] = mmDCORE2_TPC1_QM_DCCM_BASE,1449[CPU_ID_TPC_QMAN_ARC14] = mmDCORE2_TPC2_QM_DCCM_BASE,1450[CPU_ID_TPC_QMAN_ARC15] = mmDCORE2_TPC3_QM_DCCM_BASE,1451[CPU_ID_TPC_QMAN_ARC16] = mmDCORE2_TPC4_QM_DCCM_BASE,1452[CPU_ID_TPC_QMAN_ARC17] = mmDCORE2_TPC5_QM_DCCM_BASE,1453[CPU_ID_TPC_QMAN_ARC18] = mmDCORE3_TPC0_QM_DCCM_BASE,1454[CPU_ID_TPC_QMAN_ARC19] = mmDCORE3_TPC1_QM_DCCM_BASE,1455[CPU_ID_TPC_QMAN_ARC20] = mmDCORE3_TPC2_QM_DCCM_BASE,1456[CPU_ID_TPC_QMAN_ARC21] = mmDCORE3_TPC3_QM_DCCM_BASE,1457[CPU_ID_TPC_QMAN_ARC22] = mmDCORE3_TPC4_QM_DCCM_BASE,1458[CPU_ID_TPC_QMAN_ARC23] = mmDCORE3_TPC5_QM_DCCM_BASE,1459[CPU_ID_TPC_QMAN_ARC24] = mmDCORE0_TPC6_QM_DCCM_BASE,1460[CPU_ID_MME_QMAN_ARC0] = mmDCORE0_MME_QM_ARC_DCCM_BASE,1461[CPU_ID_MME_QMAN_ARC1] = mmDCORE2_MME_QM_ARC_DCCM_BASE,1462[CPU_ID_EDMA_QMAN_ARC0] = mmDCORE0_EDMA0_QM_DCCM_BASE,1463[CPU_ID_EDMA_QMAN_ARC1] = mmDCORE0_EDMA1_QM_DCCM_BASE,1464[CPU_ID_EDMA_QMAN_ARC2] = mmDCORE1_EDMA0_QM_DCCM_BASE,1465[CPU_ID_EDMA_QMAN_ARC3] = mmDCORE1_EDMA1_QM_DCCM_BASE,1466[CPU_ID_EDMA_QMAN_ARC4] = mmDCORE2_EDMA0_QM_DCCM_BASE,1467[CPU_ID_EDMA_QMAN_ARC5] = mmDCORE2_EDMA1_QM_DCCM_BASE,1468[CPU_ID_EDMA_QMAN_ARC6] = mmDCORE3_EDMA0_QM_DCCM_BASE,1469[CPU_ID_EDMA_QMAN_ARC7] = mmDCORE3_EDMA1_QM_DCCM_BASE,1470[CPU_ID_PDMA_QMAN_ARC0] = mmPDMA0_QM_ARC_DCCM_BASE,1471[CPU_ID_PDMA_QMAN_ARC1] = mmPDMA1_QM_ARC_DCCM_BASE,1472[CPU_ID_ROT_QMAN_ARC0] = mmROT0_QM_ARC_DCCM_BASE,1473[CPU_ID_ROT_QMAN_ARC1] = mmROT1_QM_ARC_DCCM_BASE,1474[CPU_ID_NIC_QMAN_ARC0] = mmNIC0_QM_DCCM0_BASE,1475[CPU_ID_NIC_QMAN_ARC1] = mmNIC0_QM_DCCM1_BASE,1476[CPU_ID_NIC_QMAN_ARC2] = mmNIC1_QM_DCCM0_BASE,1477[CPU_ID_NIC_QMAN_ARC3] = mmNIC1_QM_DCCM1_BASE,1478[CPU_ID_NIC_QMAN_ARC4] = mmNIC2_QM_DCCM0_BASE,1479[CPU_ID_NIC_QMAN_ARC5] = mmNIC2_QM_DCCM1_BASE,1480[CPU_ID_NIC_QMAN_ARC6] = mmNIC3_QM_DCCM0_BASE,1481[CPU_ID_NIC_QMAN_ARC7] = mmNIC3_QM_DCCM1_BASE,1482[CPU_ID_NIC_QMAN_ARC8] = mmNIC4_QM_DCCM0_BASE,1483[CPU_ID_NIC_QMAN_ARC9] = mmNIC4_QM_DCCM1_BASE,1484[CPU_ID_NIC_QMAN_ARC10] = mmNIC5_QM_DCCM0_BASE,1485[CPU_ID_NIC_QMAN_ARC11] = mmNIC5_QM_DCCM1_BASE,1486[CPU_ID_NIC_QMAN_ARC12] = mmNIC6_QM_DCCM0_BASE,1487[CPU_ID_NIC_QMAN_ARC13] = mmNIC6_QM_DCCM1_BASE,1488[CPU_ID_NIC_QMAN_ARC14] = mmNIC7_QM_DCCM0_BASE,1489[CPU_ID_NIC_QMAN_ARC15] = mmNIC7_QM_DCCM1_BASE,1490[CPU_ID_NIC_QMAN_ARC16] = mmNIC8_QM_DCCM0_BASE,1491[CPU_ID_NIC_QMAN_ARC17] = mmNIC8_QM_DCCM1_BASE,1492[CPU_ID_NIC_QMAN_ARC18] = mmNIC9_QM_DCCM0_BASE,1493[CPU_ID_NIC_QMAN_ARC19] = mmNIC9_QM_DCCM1_BASE,1494[CPU_ID_NIC_QMAN_ARC20] = mmNIC10_QM_DCCM0_BASE,1495[CPU_ID_NIC_QMAN_ARC21] = mmNIC10_QM_DCCM1_BASE,1496[CPU_ID_NIC_QMAN_ARC22] = mmNIC11_QM_DCCM0_BASE,1497[CPU_ID_NIC_QMAN_ARC23] = mmNIC11_QM_DCCM1_BASE,1498};14991500const u32 gaudi2_mme_ctrl_lo_blocks_bases[MME_ID_SIZE] = {1501[MME_ID_DCORE0] = mmDCORE0_MME_CTRL_LO_BASE,1502[MME_ID_DCORE1] = mmDCORE1_MME_CTRL_LO_BASE,1503[MME_ID_DCORE2] = mmDCORE2_MME_CTRL_LO_BASE,1504[MME_ID_DCORE3] = mmDCORE3_MME_CTRL_LO_BASE,1505};15061507static const u32 gaudi2_queue_id_to_arc_id[GAUDI2_QUEUE_ID_SIZE] = {1508[GAUDI2_QUEUE_ID_PDMA_0_0] = CPU_ID_PDMA_QMAN_ARC0,1509[GAUDI2_QUEUE_ID_PDMA_0_1] = CPU_ID_PDMA_QMAN_ARC0,1510[GAUDI2_QUEUE_ID_PDMA_0_2] = CPU_ID_PDMA_QMAN_ARC0,1511[GAUDI2_QUEUE_ID_PDMA_0_3] = CPU_ID_PDMA_QMAN_ARC0,1512[GAUDI2_QUEUE_ID_PDMA_1_0] = CPU_ID_PDMA_QMAN_ARC1,1513[GAUDI2_QUEUE_ID_PDMA_1_1] = CPU_ID_PDMA_QMAN_ARC1,1514[GAUDI2_QUEUE_ID_PDMA_1_2] = CPU_ID_PDMA_QMAN_ARC1,1515[GAUDI2_QUEUE_ID_PDMA_1_3] = CPU_ID_PDMA_QMAN_ARC1,1516[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC0,1517[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC0,1518[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC0,1519[GAUDI2_QUEUE_ID_DCORE0_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC0,1520[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC1,1521[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC1,1522[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC1,1523[GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC1,1524[GAUDI2_QUEUE_ID_DCORE0_MME_0_0] = CPU_ID_MME_QMAN_ARC0,1525[GAUDI2_QUEUE_ID_DCORE0_MME_0_1] = CPU_ID_MME_QMAN_ARC0,1526[GAUDI2_QUEUE_ID_DCORE0_MME_0_2] = CPU_ID_MME_QMAN_ARC0,1527[GAUDI2_QUEUE_ID_DCORE0_MME_0_3] = CPU_ID_MME_QMAN_ARC0,1528[GAUDI2_QUEUE_ID_DCORE0_TPC_0_0] = CPU_ID_TPC_QMAN_ARC0,1529[GAUDI2_QUEUE_ID_DCORE0_TPC_0_1] = CPU_ID_TPC_QMAN_ARC0,1530[GAUDI2_QUEUE_ID_DCORE0_TPC_0_2] = CPU_ID_TPC_QMAN_ARC0,1531[GAUDI2_QUEUE_ID_DCORE0_TPC_0_3] = CPU_ID_TPC_QMAN_ARC0,1532[GAUDI2_QUEUE_ID_DCORE0_TPC_1_0] = CPU_ID_TPC_QMAN_ARC1,1533[GAUDI2_QUEUE_ID_DCORE0_TPC_1_1] = CPU_ID_TPC_QMAN_ARC1,1534[GAUDI2_QUEUE_ID_DCORE0_TPC_1_2] = CPU_ID_TPC_QMAN_ARC1,1535[GAUDI2_QUEUE_ID_DCORE0_TPC_1_3] = CPU_ID_TPC_QMAN_ARC1,1536[GAUDI2_QUEUE_ID_DCORE0_TPC_2_0] = CPU_ID_TPC_QMAN_ARC2,1537[GAUDI2_QUEUE_ID_DCORE0_TPC_2_1] = CPU_ID_TPC_QMAN_ARC2,1538[GAUDI2_QUEUE_ID_DCORE0_TPC_2_2] = CPU_ID_TPC_QMAN_ARC2,1539[GAUDI2_QUEUE_ID_DCORE0_TPC_2_3] = CPU_ID_TPC_QMAN_ARC2,1540[GAUDI2_QUEUE_ID_DCORE0_TPC_3_0] = CPU_ID_TPC_QMAN_ARC3,1541[GAUDI2_QUEUE_ID_DCORE0_TPC_3_1] = CPU_ID_TPC_QMAN_ARC3,1542[GAUDI2_QUEUE_ID_DCORE0_TPC_3_2] = CPU_ID_TPC_QMAN_ARC3,1543[GAUDI2_QUEUE_ID_DCORE0_TPC_3_3] = CPU_ID_TPC_QMAN_ARC3,1544[GAUDI2_QUEUE_ID_DCORE0_TPC_4_0] = CPU_ID_TPC_QMAN_ARC4,1545[GAUDI2_QUEUE_ID_DCORE0_TPC_4_1] = CPU_ID_TPC_QMAN_ARC4,1546[GAUDI2_QUEUE_ID_DCORE0_TPC_4_2] = CPU_ID_TPC_QMAN_ARC4,1547[GAUDI2_QUEUE_ID_DCORE0_TPC_4_3] = CPU_ID_TPC_QMAN_ARC4,1548[GAUDI2_QUEUE_ID_DCORE0_TPC_5_0] = CPU_ID_TPC_QMAN_ARC5,1549[GAUDI2_QUEUE_ID_DCORE0_TPC_5_1] = CPU_ID_TPC_QMAN_ARC5,1550[GAUDI2_QUEUE_ID_DCORE0_TPC_5_2] = CPU_ID_TPC_QMAN_ARC5,1551[GAUDI2_QUEUE_ID_DCORE0_TPC_5_3] = CPU_ID_TPC_QMAN_ARC5,1552[GAUDI2_QUEUE_ID_DCORE0_TPC_6_0] = CPU_ID_TPC_QMAN_ARC24,1553[GAUDI2_QUEUE_ID_DCORE0_TPC_6_1] = CPU_ID_TPC_QMAN_ARC24,1554[GAUDI2_QUEUE_ID_DCORE0_TPC_6_2] = CPU_ID_TPC_QMAN_ARC24,1555[GAUDI2_QUEUE_ID_DCORE0_TPC_6_3] = CPU_ID_TPC_QMAN_ARC24,1556[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC2,1557[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC2,1558[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC2,1559[GAUDI2_QUEUE_ID_DCORE1_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC2,1560[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC3,1561[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC3,1562[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC3,1563[GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC3,1564[GAUDI2_QUEUE_ID_DCORE1_MME_0_0] = CPU_ID_SCHED_ARC4,1565[GAUDI2_QUEUE_ID_DCORE1_MME_0_1] = CPU_ID_SCHED_ARC4,1566[GAUDI2_QUEUE_ID_DCORE1_MME_0_2] = CPU_ID_SCHED_ARC4,1567[GAUDI2_QUEUE_ID_DCORE1_MME_0_3] = CPU_ID_SCHED_ARC4,1568[GAUDI2_QUEUE_ID_DCORE1_TPC_0_0] = CPU_ID_TPC_QMAN_ARC6,1569[GAUDI2_QUEUE_ID_DCORE1_TPC_0_1] = CPU_ID_TPC_QMAN_ARC6,1570[GAUDI2_QUEUE_ID_DCORE1_TPC_0_2] = CPU_ID_TPC_QMAN_ARC6,1571[GAUDI2_QUEUE_ID_DCORE1_TPC_0_3] = CPU_ID_TPC_QMAN_ARC6,1572[GAUDI2_QUEUE_ID_DCORE1_TPC_1_0] = CPU_ID_TPC_QMAN_ARC7,1573[GAUDI2_QUEUE_ID_DCORE1_TPC_1_1] = CPU_ID_TPC_QMAN_ARC7,1574[GAUDI2_QUEUE_ID_DCORE1_TPC_1_2] = CPU_ID_TPC_QMAN_ARC7,1575[GAUDI2_QUEUE_ID_DCORE1_TPC_1_3] = CPU_ID_TPC_QMAN_ARC7,1576[GAUDI2_QUEUE_ID_DCORE1_TPC_2_0] = CPU_ID_TPC_QMAN_ARC8,1577[GAUDI2_QUEUE_ID_DCORE1_TPC_2_1] = CPU_ID_TPC_QMAN_ARC8,1578[GAUDI2_QUEUE_ID_DCORE1_TPC_2_2] = CPU_ID_TPC_QMAN_ARC8,1579[GAUDI2_QUEUE_ID_DCORE1_TPC_2_3] = CPU_ID_TPC_QMAN_ARC8,1580[GAUDI2_QUEUE_ID_DCORE1_TPC_3_0] = CPU_ID_TPC_QMAN_ARC9,1581[GAUDI2_QUEUE_ID_DCORE1_TPC_3_1] = CPU_ID_TPC_QMAN_ARC9,1582[GAUDI2_QUEUE_ID_DCORE1_TPC_3_2] = CPU_ID_TPC_QMAN_ARC9,1583[GAUDI2_QUEUE_ID_DCORE1_TPC_3_3] = CPU_ID_TPC_QMAN_ARC9,1584[GAUDI2_QUEUE_ID_DCORE1_TPC_4_0] = CPU_ID_TPC_QMAN_ARC10,1585[GAUDI2_QUEUE_ID_DCORE1_TPC_4_1] = CPU_ID_TPC_QMAN_ARC10,1586[GAUDI2_QUEUE_ID_DCORE1_TPC_4_2] = CPU_ID_TPC_QMAN_ARC10,1587[GAUDI2_QUEUE_ID_DCORE1_TPC_4_3] = CPU_ID_TPC_QMAN_ARC10,1588[GAUDI2_QUEUE_ID_DCORE1_TPC_5_0] = CPU_ID_TPC_QMAN_ARC11,1589[GAUDI2_QUEUE_ID_DCORE1_TPC_5_1] = CPU_ID_TPC_QMAN_ARC11,1590[GAUDI2_QUEUE_ID_DCORE1_TPC_5_2] = CPU_ID_TPC_QMAN_ARC11,1591[GAUDI2_QUEUE_ID_DCORE1_TPC_5_3] = CPU_ID_TPC_QMAN_ARC11,1592[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC4,1593[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC4,1594[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC4,1595[GAUDI2_QUEUE_ID_DCORE2_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC4,1596[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC5,1597[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC5,1598[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC5,1599[GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC5,1600[GAUDI2_QUEUE_ID_DCORE2_MME_0_0] = CPU_ID_MME_QMAN_ARC1,1601[GAUDI2_QUEUE_ID_DCORE2_MME_0_1] = CPU_ID_MME_QMAN_ARC1,1602[GAUDI2_QUEUE_ID_DCORE2_MME_0_2] = CPU_ID_MME_QMAN_ARC1,1603[GAUDI2_QUEUE_ID_DCORE2_MME_0_3] = CPU_ID_MME_QMAN_ARC1,1604[GAUDI2_QUEUE_ID_DCORE2_TPC_0_0] = CPU_ID_TPC_QMAN_ARC12,1605[GAUDI2_QUEUE_ID_DCORE2_TPC_0_1] = CPU_ID_TPC_QMAN_ARC12,1606[GAUDI2_QUEUE_ID_DCORE2_TPC_0_2] = CPU_ID_TPC_QMAN_ARC12,1607[GAUDI2_QUEUE_ID_DCORE2_TPC_0_3] = CPU_ID_TPC_QMAN_ARC12,1608[GAUDI2_QUEUE_ID_DCORE2_TPC_1_0] = CPU_ID_TPC_QMAN_ARC13,1609[GAUDI2_QUEUE_ID_DCORE2_TPC_1_1] = CPU_ID_TPC_QMAN_ARC13,1610[GAUDI2_QUEUE_ID_DCORE2_TPC_1_2] = CPU_ID_TPC_QMAN_ARC13,1611[GAUDI2_QUEUE_ID_DCORE2_TPC_1_3] = CPU_ID_TPC_QMAN_ARC13,1612[GAUDI2_QUEUE_ID_DCORE2_TPC_2_0] = CPU_ID_TPC_QMAN_ARC14,1613[GAUDI2_QUEUE_ID_DCORE2_TPC_2_1] = CPU_ID_TPC_QMAN_ARC14,1614[GAUDI2_QUEUE_ID_DCORE2_TPC_2_2] = CPU_ID_TPC_QMAN_ARC14,1615[GAUDI2_QUEUE_ID_DCORE2_TPC_2_3] = CPU_ID_TPC_QMAN_ARC14,1616[GAUDI2_QUEUE_ID_DCORE2_TPC_3_0] = CPU_ID_TPC_QMAN_ARC15,1617[GAUDI2_QUEUE_ID_DCORE2_TPC_3_1] = CPU_ID_TPC_QMAN_ARC15,1618[GAUDI2_QUEUE_ID_DCORE2_TPC_3_2] = CPU_ID_TPC_QMAN_ARC15,1619[GAUDI2_QUEUE_ID_DCORE2_TPC_3_3] = CPU_ID_TPC_QMAN_ARC15,1620[GAUDI2_QUEUE_ID_DCORE2_TPC_4_0] = CPU_ID_TPC_QMAN_ARC16,1621[GAUDI2_QUEUE_ID_DCORE2_TPC_4_1] = CPU_ID_TPC_QMAN_ARC16,1622[GAUDI2_QUEUE_ID_DCORE2_TPC_4_2] = CPU_ID_TPC_QMAN_ARC16,1623[GAUDI2_QUEUE_ID_DCORE2_TPC_4_3] = CPU_ID_TPC_QMAN_ARC16,1624[GAUDI2_QUEUE_ID_DCORE2_TPC_5_0] = CPU_ID_TPC_QMAN_ARC17,1625[GAUDI2_QUEUE_ID_DCORE2_TPC_5_1] = CPU_ID_TPC_QMAN_ARC17,1626[GAUDI2_QUEUE_ID_DCORE2_TPC_5_2] = CPU_ID_TPC_QMAN_ARC17,1627[GAUDI2_QUEUE_ID_DCORE2_TPC_5_3] = CPU_ID_TPC_QMAN_ARC17,1628[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0] = CPU_ID_EDMA_QMAN_ARC6,1629[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_1] = CPU_ID_EDMA_QMAN_ARC6,1630[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_2] = CPU_ID_EDMA_QMAN_ARC6,1631[GAUDI2_QUEUE_ID_DCORE3_EDMA_0_3] = CPU_ID_EDMA_QMAN_ARC6,1632[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0] = CPU_ID_EDMA_QMAN_ARC7,1633[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1] = CPU_ID_EDMA_QMAN_ARC7,1634[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2] = CPU_ID_EDMA_QMAN_ARC7,1635[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3] = CPU_ID_EDMA_QMAN_ARC7,1636[GAUDI2_QUEUE_ID_DCORE3_MME_0_0] = CPU_ID_SCHED_ARC5,1637[GAUDI2_QUEUE_ID_DCORE3_MME_0_1] = CPU_ID_SCHED_ARC5,1638[GAUDI2_QUEUE_ID_DCORE3_MME_0_2] = CPU_ID_SCHED_ARC5,1639[GAUDI2_QUEUE_ID_DCORE3_MME_0_3] = CPU_ID_SCHED_ARC5,1640[GAUDI2_QUEUE_ID_DCORE3_TPC_0_0] = CPU_ID_TPC_QMAN_ARC18,1641[GAUDI2_QUEUE_ID_DCORE3_TPC_0_1] = CPU_ID_TPC_QMAN_ARC18,1642[GAUDI2_QUEUE_ID_DCORE3_TPC_0_2] = CPU_ID_TPC_QMAN_ARC18,1643[GAUDI2_QUEUE_ID_DCORE3_TPC_0_3] = CPU_ID_TPC_QMAN_ARC18,1644[GAUDI2_QUEUE_ID_DCORE3_TPC_1_0] = CPU_ID_TPC_QMAN_ARC19,1645[GAUDI2_QUEUE_ID_DCORE3_TPC_1_1] = CPU_ID_TPC_QMAN_ARC19,1646[GAUDI2_QUEUE_ID_DCORE3_TPC_1_2] = CPU_ID_TPC_QMAN_ARC19,1647[GAUDI2_QUEUE_ID_DCORE3_TPC_1_3] = CPU_ID_TPC_QMAN_ARC19,1648[GAUDI2_QUEUE_ID_DCORE3_TPC_2_0] = CPU_ID_TPC_QMAN_ARC20,1649[GAUDI2_QUEUE_ID_DCORE3_TPC_2_1] = CPU_ID_TPC_QMAN_ARC20,1650[GAUDI2_QUEUE_ID_DCORE3_TPC_2_2] = CPU_ID_TPC_QMAN_ARC20,1651[GAUDI2_QUEUE_ID_DCORE3_TPC_2_3] = CPU_ID_TPC_QMAN_ARC20,1652[GAUDI2_QUEUE_ID_DCORE3_TPC_3_0] = CPU_ID_TPC_QMAN_ARC21,1653[GAUDI2_QUEUE_ID_DCORE3_TPC_3_1] = CPU_ID_TPC_QMAN_ARC21,1654[GAUDI2_QUEUE_ID_DCORE3_TPC_3_2] = CPU_ID_TPC_QMAN_ARC21,1655[GAUDI2_QUEUE_ID_DCORE3_TPC_3_3] = CPU_ID_TPC_QMAN_ARC21,1656[GAUDI2_QUEUE_ID_DCORE3_TPC_4_0] = CPU_ID_TPC_QMAN_ARC22,1657[GAUDI2_QUEUE_ID_DCORE3_TPC_4_1] = CPU_ID_TPC_QMAN_ARC22,1658[GAUDI2_QUEUE_ID_DCORE3_TPC_4_2] = CPU_ID_TPC_QMAN_ARC22,1659[GAUDI2_QUEUE_ID_DCORE3_TPC_4_3] = CPU_ID_TPC_QMAN_ARC22,1660[GAUDI2_QUEUE_ID_DCORE3_TPC_5_0] = CPU_ID_TPC_QMAN_ARC23,1661[GAUDI2_QUEUE_ID_DCORE3_TPC_5_1] = CPU_ID_TPC_QMAN_ARC23,1662[GAUDI2_QUEUE_ID_DCORE3_TPC_5_2] = CPU_ID_TPC_QMAN_ARC23,1663[GAUDI2_QUEUE_ID_DCORE3_TPC_5_3] = CPU_ID_TPC_QMAN_ARC23,1664[GAUDI2_QUEUE_ID_NIC_0_0] = CPU_ID_NIC_QMAN_ARC0,1665[GAUDI2_QUEUE_ID_NIC_0_1] = CPU_ID_NIC_QMAN_ARC0,1666[GAUDI2_QUEUE_ID_NIC_0_2] = CPU_ID_NIC_QMAN_ARC0,1667[GAUDI2_QUEUE_ID_NIC_0_3] = CPU_ID_NIC_QMAN_ARC0,1668[GAUDI2_QUEUE_ID_NIC_1_0] = CPU_ID_NIC_QMAN_ARC1,1669[GAUDI2_QUEUE_ID_NIC_1_1] = CPU_ID_NIC_QMAN_ARC1,1670[GAUDI2_QUEUE_ID_NIC_1_2] = CPU_ID_NIC_QMAN_ARC1,1671[GAUDI2_QUEUE_ID_NIC_1_3] = CPU_ID_NIC_QMAN_ARC1,1672[GAUDI2_QUEUE_ID_NIC_2_0] = CPU_ID_NIC_QMAN_ARC2,1673[GAUDI2_QUEUE_ID_NIC_2_1] = CPU_ID_NIC_QMAN_ARC2,1674[GAUDI2_QUEUE_ID_NIC_2_2] = CPU_ID_NIC_QMAN_ARC2,1675[GAUDI2_QUEUE_ID_NIC_2_3] = CPU_ID_NIC_QMAN_ARC2,1676[GAUDI2_QUEUE_ID_NIC_3_0] = CPU_ID_NIC_QMAN_ARC3,1677[GAUDI2_QUEUE_ID_NIC_3_1] = CPU_ID_NIC_QMAN_ARC3,1678[GAUDI2_QUEUE_ID_NIC_3_2] = CPU_ID_NIC_QMAN_ARC3,1679[GAUDI2_QUEUE_ID_NIC_3_3] = CPU_ID_NIC_QMAN_ARC3,1680[GAUDI2_QUEUE_ID_NIC_4_0] = CPU_ID_NIC_QMAN_ARC4,1681[GAUDI2_QUEUE_ID_NIC_4_1] = CPU_ID_NIC_QMAN_ARC4,1682[GAUDI2_QUEUE_ID_NIC_4_2] = CPU_ID_NIC_QMAN_ARC4,1683[GAUDI2_QUEUE_ID_NIC_4_3] = CPU_ID_NIC_QMAN_ARC4,1684[GAUDI2_QUEUE_ID_NIC_5_0] = CPU_ID_NIC_QMAN_ARC5,1685[GAUDI2_QUEUE_ID_NIC_5_1] = CPU_ID_NIC_QMAN_ARC5,1686[GAUDI2_QUEUE_ID_NIC_5_2] = CPU_ID_NIC_QMAN_ARC5,1687[GAUDI2_QUEUE_ID_NIC_5_3] = CPU_ID_NIC_QMAN_ARC5,1688[GAUDI2_QUEUE_ID_NIC_6_0] = CPU_ID_NIC_QMAN_ARC6,1689[GAUDI2_QUEUE_ID_NIC_6_1] = CPU_ID_NIC_QMAN_ARC6,1690[GAUDI2_QUEUE_ID_NIC_6_2] = CPU_ID_NIC_QMAN_ARC6,1691[GAUDI2_QUEUE_ID_NIC_6_3] = CPU_ID_NIC_QMAN_ARC6,1692[GAUDI2_QUEUE_ID_NIC_7_0] = CPU_ID_NIC_QMAN_ARC7,1693[GAUDI2_QUEUE_ID_NIC_7_1] = CPU_ID_NIC_QMAN_ARC7,1694[GAUDI2_QUEUE_ID_NIC_7_2] = CPU_ID_NIC_QMAN_ARC7,1695[GAUDI2_QUEUE_ID_NIC_7_3] = CPU_ID_NIC_QMAN_ARC7,1696[GAUDI2_QUEUE_ID_NIC_8_0] = CPU_ID_NIC_QMAN_ARC8,1697[GAUDI2_QUEUE_ID_NIC_8_1] = CPU_ID_NIC_QMAN_ARC8,1698[GAUDI2_QUEUE_ID_NIC_8_2] = CPU_ID_NIC_QMAN_ARC8,1699[GAUDI2_QUEUE_ID_NIC_8_3] = CPU_ID_NIC_QMAN_ARC8,1700[GAUDI2_QUEUE_ID_NIC_9_0] = CPU_ID_NIC_QMAN_ARC9,1701[GAUDI2_QUEUE_ID_NIC_9_1] = CPU_ID_NIC_QMAN_ARC9,1702[GAUDI2_QUEUE_ID_NIC_9_2] = CPU_ID_NIC_QMAN_ARC9,1703[GAUDI2_QUEUE_ID_NIC_9_3] = CPU_ID_NIC_QMAN_ARC9,1704[GAUDI2_QUEUE_ID_NIC_10_0] = CPU_ID_NIC_QMAN_ARC10,1705[GAUDI2_QUEUE_ID_NIC_10_1] = CPU_ID_NIC_QMAN_ARC10,1706[GAUDI2_QUEUE_ID_NIC_10_2] = CPU_ID_NIC_QMAN_ARC10,1707[GAUDI2_QUEUE_ID_NIC_10_3] = CPU_ID_NIC_QMAN_ARC10,1708[GAUDI2_QUEUE_ID_NIC_11_0] = CPU_ID_NIC_QMAN_ARC11,1709[GAUDI2_QUEUE_ID_NIC_11_1] = CPU_ID_NIC_QMAN_ARC11,1710[GAUDI2_QUEUE_ID_NIC_11_2] = CPU_ID_NIC_QMAN_ARC11,1711[GAUDI2_QUEUE_ID_NIC_11_3] = CPU_ID_NIC_QMAN_ARC11,1712[GAUDI2_QUEUE_ID_NIC_12_0] = CPU_ID_NIC_QMAN_ARC12,1713[GAUDI2_QUEUE_ID_NIC_12_1] = CPU_ID_NIC_QMAN_ARC12,1714[GAUDI2_QUEUE_ID_NIC_12_2] = CPU_ID_NIC_QMAN_ARC12,1715[GAUDI2_QUEUE_ID_NIC_12_3] = CPU_ID_NIC_QMAN_ARC12,1716[GAUDI2_QUEUE_ID_NIC_13_0] = CPU_ID_NIC_QMAN_ARC13,1717[GAUDI2_QUEUE_ID_NIC_13_1] = CPU_ID_NIC_QMAN_ARC13,1718[GAUDI2_QUEUE_ID_NIC_13_2] = CPU_ID_NIC_QMAN_ARC13,1719[GAUDI2_QUEUE_ID_NIC_13_3] = CPU_ID_NIC_QMAN_ARC13,1720[GAUDI2_QUEUE_ID_NIC_14_0] = CPU_ID_NIC_QMAN_ARC14,1721[GAUDI2_QUEUE_ID_NIC_14_1] = CPU_ID_NIC_QMAN_ARC14,1722[GAUDI2_QUEUE_ID_NIC_14_2] = CPU_ID_NIC_QMAN_ARC14,1723[GAUDI2_QUEUE_ID_NIC_14_3] = CPU_ID_NIC_QMAN_ARC14,1724[GAUDI2_QUEUE_ID_NIC_15_0] = CPU_ID_NIC_QMAN_ARC15,1725[GAUDI2_QUEUE_ID_NIC_15_1] = CPU_ID_NIC_QMAN_ARC15,1726[GAUDI2_QUEUE_ID_NIC_15_2] = CPU_ID_NIC_QMAN_ARC15,1727[GAUDI2_QUEUE_ID_NIC_15_3] = CPU_ID_NIC_QMAN_ARC15,1728[GAUDI2_QUEUE_ID_NIC_16_0] = CPU_ID_NIC_QMAN_ARC16,1729[GAUDI2_QUEUE_ID_NIC_16_1] = CPU_ID_NIC_QMAN_ARC16,1730[GAUDI2_QUEUE_ID_NIC_16_2] = CPU_ID_NIC_QMAN_ARC16,1731[GAUDI2_QUEUE_ID_NIC_16_3] = CPU_ID_NIC_QMAN_ARC16,1732[GAUDI2_QUEUE_ID_NIC_17_0] = CPU_ID_NIC_QMAN_ARC17,1733[GAUDI2_QUEUE_ID_NIC_17_1] = CPU_ID_NIC_QMAN_ARC17,1734[GAUDI2_QUEUE_ID_NIC_17_2] = CPU_ID_NIC_QMAN_ARC17,1735[GAUDI2_QUEUE_ID_NIC_17_3] = CPU_ID_NIC_QMAN_ARC17,1736[GAUDI2_QUEUE_ID_NIC_18_0] = CPU_ID_NIC_QMAN_ARC18,1737[GAUDI2_QUEUE_ID_NIC_18_1] = CPU_ID_NIC_QMAN_ARC18,1738[GAUDI2_QUEUE_ID_NIC_18_2] = CPU_ID_NIC_QMAN_ARC18,1739[GAUDI2_QUEUE_ID_NIC_18_3] = CPU_ID_NIC_QMAN_ARC18,1740[GAUDI2_QUEUE_ID_NIC_19_0] = CPU_ID_NIC_QMAN_ARC19,1741[GAUDI2_QUEUE_ID_NIC_19_1] = CPU_ID_NIC_QMAN_ARC19,1742[GAUDI2_QUEUE_ID_NIC_19_2] = CPU_ID_NIC_QMAN_ARC19,1743[GAUDI2_QUEUE_ID_NIC_19_3] = CPU_ID_NIC_QMAN_ARC19,1744[GAUDI2_QUEUE_ID_NIC_20_0] = CPU_ID_NIC_QMAN_ARC20,1745[GAUDI2_QUEUE_ID_NIC_20_1] = CPU_ID_NIC_QMAN_ARC20,1746[GAUDI2_QUEUE_ID_NIC_20_2] = CPU_ID_NIC_QMAN_ARC20,1747[GAUDI2_QUEUE_ID_NIC_20_3] = CPU_ID_NIC_QMAN_ARC20,1748[GAUDI2_QUEUE_ID_NIC_21_0] = CPU_ID_NIC_QMAN_ARC21,1749[GAUDI2_QUEUE_ID_NIC_21_1] = CPU_ID_NIC_QMAN_ARC21,1750[GAUDI2_QUEUE_ID_NIC_21_2] = CPU_ID_NIC_QMAN_ARC21,1751[GAUDI2_QUEUE_ID_NIC_21_3] = CPU_ID_NIC_QMAN_ARC21,1752[GAUDI2_QUEUE_ID_NIC_22_0] = CPU_ID_NIC_QMAN_ARC22,1753[GAUDI2_QUEUE_ID_NIC_22_1] = CPU_ID_NIC_QMAN_ARC22,1754[GAUDI2_QUEUE_ID_NIC_22_2] = CPU_ID_NIC_QMAN_ARC22,1755[GAUDI2_QUEUE_ID_NIC_22_3] = CPU_ID_NIC_QMAN_ARC22,1756[GAUDI2_QUEUE_ID_NIC_23_0] = CPU_ID_NIC_QMAN_ARC23,1757[GAUDI2_QUEUE_ID_NIC_23_1] = CPU_ID_NIC_QMAN_ARC23,1758[GAUDI2_QUEUE_ID_NIC_23_2] = CPU_ID_NIC_QMAN_ARC23,1759[GAUDI2_QUEUE_ID_NIC_23_3] = CPU_ID_NIC_QMAN_ARC23,1760[GAUDI2_QUEUE_ID_ROT_0_0] = CPU_ID_ROT_QMAN_ARC0,1761[GAUDI2_QUEUE_ID_ROT_0_1] = CPU_ID_ROT_QMAN_ARC0,1762[GAUDI2_QUEUE_ID_ROT_0_2] = CPU_ID_ROT_QMAN_ARC0,1763[GAUDI2_QUEUE_ID_ROT_0_3] = CPU_ID_ROT_QMAN_ARC0,1764[GAUDI2_QUEUE_ID_ROT_1_0] = CPU_ID_ROT_QMAN_ARC1,1765[GAUDI2_QUEUE_ID_ROT_1_1] = CPU_ID_ROT_QMAN_ARC1,1766[GAUDI2_QUEUE_ID_ROT_1_2] = CPU_ID_ROT_QMAN_ARC1,1767[GAUDI2_QUEUE_ID_ROT_1_3] = CPU_ID_ROT_QMAN_ARC11768};17691770const u32 gaudi2_dma_core_blocks_bases[DMA_CORE_ID_SIZE] = {1771[DMA_CORE_ID_PDMA0] = mmPDMA0_CORE_BASE,1772[DMA_CORE_ID_PDMA1] = mmPDMA1_CORE_BASE,1773[DMA_CORE_ID_EDMA0] = mmDCORE0_EDMA0_CORE_BASE,1774[DMA_CORE_ID_EDMA1] = mmDCORE0_EDMA1_CORE_BASE,1775[DMA_CORE_ID_EDMA2] = mmDCORE1_EDMA0_CORE_BASE,1776[DMA_CORE_ID_EDMA3] = mmDCORE1_EDMA1_CORE_BASE,1777[DMA_CORE_ID_EDMA4] = mmDCORE2_EDMA0_CORE_BASE,1778[DMA_CORE_ID_EDMA5] = mmDCORE2_EDMA1_CORE_BASE,1779[DMA_CORE_ID_EDMA6] = mmDCORE3_EDMA0_CORE_BASE,1780[DMA_CORE_ID_EDMA7] = mmDCORE3_EDMA1_CORE_BASE,1781[DMA_CORE_ID_KDMA] = mmARC_FARM_KDMA_BASE1782};17831784const u32 gaudi2_mme_acc_blocks_bases[MME_ID_SIZE] = {1785[MME_ID_DCORE0] = mmDCORE0_MME_ACC_BASE,1786[MME_ID_DCORE1] = mmDCORE1_MME_ACC_BASE,1787[MME_ID_DCORE2] = mmDCORE2_MME_ACC_BASE,1788[MME_ID_DCORE3] = mmDCORE3_MME_ACC_BASE1789};17901791static const u32 gaudi2_tpc_cfg_blocks_bases[TPC_ID_SIZE] = {1792[TPC_ID_DCORE0_TPC0] = mmDCORE0_TPC0_CFG_BASE,1793[TPC_ID_DCORE0_TPC1] = mmDCORE0_TPC1_CFG_BASE,1794[TPC_ID_DCORE0_TPC2] = mmDCORE0_TPC2_CFG_BASE,1795[TPC_ID_DCORE0_TPC3] = mmDCORE0_TPC3_CFG_BASE,1796[TPC_ID_DCORE0_TPC4] = mmDCORE0_TPC4_CFG_BASE,1797[TPC_ID_DCORE0_TPC5] = mmDCORE0_TPC5_CFG_BASE,1798[TPC_ID_DCORE1_TPC0] = mmDCORE1_TPC0_CFG_BASE,1799[TPC_ID_DCORE1_TPC1] = mmDCORE1_TPC1_CFG_BASE,1800[TPC_ID_DCORE1_TPC2] = mmDCORE1_TPC2_CFG_BASE,1801[TPC_ID_DCORE1_TPC3] = mmDCORE1_TPC3_CFG_BASE,1802[TPC_ID_DCORE1_TPC4] = mmDCORE1_TPC4_CFG_BASE,1803[TPC_ID_DCORE1_TPC5] = mmDCORE1_TPC5_CFG_BASE,1804[TPC_ID_DCORE2_TPC0] = mmDCORE2_TPC0_CFG_BASE,1805[TPC_ID_DCORE2_TPC1] = mmDCORE2_TPC1_CFG_BASE,1806[TPC_ID_DCORE2_TPC2] = mmDCORE2_TPC2_CFG_BASE,1807[TPC_ID_DCORE2_TPC3] = mmDCORE2_TPC3_CFG_BASE,1808[TPC_ID_DCORE2_TPC4] = mmDCORE2_TPC4_CFG_BASE,1809[TPC_ID_DCORE2_TPC5] = mmDCORE2_TPC5_CFG_BASE,1810[TPC_ID_DCORE3_TPC0] = mmDCORE3_TPC0_CFG_BASE,1811[TPC_ID_DCORE3_TPC1] = mmDCORE3_TPC1_CFG_BASE,1812[TPC_ID_DCORE3_TPC2] = mmDCORE3_TPC2_CFG_BASE,1813[TPC_ID_DCORE3_TPC3] = mmDCORE3_TPC3_CFG_BASE,1814[TPC_ID_DCORE3_TPC4] = mmDCORE3_TPC4_CFG_BASE,1815[TPC_ID_DCORE3_TPC5] = mmDCORE3_TPC5_CFG_BASE,1816[TPC_ID_DCORE0_TPC6] = mmDCORE0_TPC6_CFG_BASE,1817};18181819static const u32 gaudi2_tpc_eml_cfg_blocks_bases[TPC_ID_SIZE] = {1820[TPC_ID_DCORE0_TPC0] = mmDCORE0_TPC0_EML_CFG_BASE,1821[TPC_ID_DCORE0_TPC1] = mmDCORE0_TPC1_EML_CFG_BASE,1822[TPC_ID_DCORE0_TPC2] = mmDCORE0_TPC2_EML_CFG_BASE,1823[TPC_ID_DCORE0_TPC3] = mmDCORE0_TPC3_EML_CFG_BASE,1824[TPC_ID_DCORE0_TPC4] = mmDCORE0_TPC4_EML_CFG_BASE,1825[TPC_ID_DCORE0_TPC5] = mmDCORE0_TPC5_EML_CFG_BASE,1826[TPC_ID_DCORE1_TPC0] = mmDCORE1_TPC0_EML_CFG_BASE,1827[TPC_ID_DCORE1_TPC1] = mmDCORE1_TPC1_EML_CFG_BASE,1828[TPC_ID_DCORE1_TPC2] = mmDCORE1_TPC2_EML_CFG_BASE,1829[TPC_ID_DCORE1_TPC3] = mmDCORE1_TPC3_EML_CFG_BASE,1830[TPC_ID_DCORE1_TPC4] = mmDCORE1_TPC4_EML_CFG_BASE,1831[TPC_ID_DCORE1_TPC5] = mmDCORE1_TPC5_EML_CFG_BASE,1832[TPC_ID_DCORE2_TPC0] = mmDCORE2_TPC0_EML_CFG_BASE,1833[TPC_ID_DCORE2_TPC1] = mmDCORE2_TPC1_EML_CFG_BASE,1834[TPC_ID_DCORE2_TPC2] = mmDCORE2_TPC2_EML_CFG_BASE,1835[TPC_ID_DCORE2_TPC3] = mmDCORE2_TPC3_EML_CFG_BASE,1836[TPC_ID_DCORE2_TPC4] = mmDCORE2_TPC4_EML_CFG_BASE,1837[TPC_ID_DCORE2_TPC5] = mmDCORE2_TPC5_EML_CFG_BASE,1838[TPC_ID_DCORE3_TPC0] = mmDCORE3_TPC0_EML_CFG_BASE,1839[TPC_ID_DCORE3_TPC1] = mmDCORE3_TPC1_EML_CFG_BASE,1840[TPC_ID_DCORE3_TPC2] = mmDCORE3_TPC2_EML_CFG_BASE,1841[TPC_ID_DCORE3_TPC3] = mmDCORE3_TPC3_EML_CFG_BASE,1842[TPC_ID_DCORE3_TPC4] = mmDCORE3_TPC4_EML_CFG_BASE,1843[TPC_ID_DCORE3_TPC5] = mmDCORE3_TPC5_EML_CFG_BASE,1844[TPC_ID_DCORE0_TPC6] = mmDCORE0_TPC6_EML_CFG_BASE,1845};18461847const u32 gaudi2_rot_blocks_bases[ROTATOR_ID_SIZE] = {1848[ROTATOR_ID_0] = mmROT0_BASE,1849[ROTATOR_ID_1] = mmROT1_BASE1850};18511852static const u32 gaudi2_tpc_id_to_queue_id[TPC_ID_SIZE] = {1853[TPC_ID_DCORE0_TPC0] = GAUDI2_QUEUE_ID_DCORE0_TPC_0_0,1854[TPC_ID_DCORE0_TPC1] = GAUDI2_QUEUE_ID_DCORE0_TPC_1_0,1855[TPC_ID_DCORE0_TPC2] = GAUDI2_QUEUE_ID_DCORE0_TPC_2_0,1856[TPC_ID_DCORE0_TPC3] = GAUDI2_QUEUE_ID_DCORE0_TPC_3_0,1857[TPC_ID_DCORE0_TPC4] = GAUDI2_QUEUE_ID_DCORE0_TPC_4_0,1858[TPC_ID_DCORE0_TPC5] = GAUDI2_QUEUE_ID_DCORE0_TPC_5_0,1859[TPC_ID_DCORE1_TPC0] = GAUDI2_QUEUE_ID_DCORE1_TPC_0_0,1860[TPC_ID_DCORE1_TPC1] = GAUDI2_QUEUE_ID_DCORE1_TPC_1_0,1861[TPC_ID_DCORE1_TPC2] = GAUDI2_QUEUE_ID_DCORE1_TPC_2_0,1862[TPC_ID_DCORE1_TPC3] = GAUDI2_QUEUE_ID_DCORE1_TPC_3_0,1863[TPC_ID_DCORE1_TPC4] = GAUDI2_QUEUE_ID_DCORE1_TPC_4_0,1864[TPC_ID_DCORE1_TPC5] = GAUDI2_QUEUE_ID_DCORE1_TPC_5_0,1865[TPC_ID_DCORE2_TPC0] = GAUDI2_QUEUE_ID_DCORE2_TPC_0_0,1866[TPC_ID_DCORE2_TPC1] = GAUDI2_QUEUE_ID_DCORE2_TPC_1_0,1867[TPC_ID_DCORE2_TPC2] = GAUDI2_QUEUE_ID_DCORE2_TPC_2_0,1868[TPC_ID_DCORE2_TPC3] = GAUDI2_QUEUE_ID_DCORE2_TPC_3_0,1869[TPC_ID_DCORE2_TPC4] = GAUDI2_QUEUE_ID_DCORE2_TPC_4_0,1870[TPC_ID_DCORE2_TPC5] = GAUDI2_QUEUE_ID_DCORE2_TPC_5_0,1871[TPC_ID_DCORE3_TPC0] = GAUDI2_QUEUE_ID_DCORE3_TPC_0_0,1872[TPC_ID_DCORE3_TPC1] = GAUDI2_QUEUE_ID_DCORE3_TPC_1_0,1873[TPC_ID_DCORE3_TPC2] = GAUDI2_QUEUE_ID_DCORE3_TPC_2_0,1874[TPC_ID_DCORE3_TPC3] = GAUDI2_QUEUE_ID_DCORE3_TPC_3_0,1875[TPC_ID_DCORE3_TPC4] = GAUDI2_QUEUE_ID_DCORE3_TPC_4_0,1876[TPC_ID_DCORE3_TPC5] = GAUDI2_QUEUE_ID_DCORE3_TPC_5_0,1877[TPC_ID_DCORE0_TPC6] = GAUDI2_QUEUE_ID_DCORE0_TPC_6_0,1878};18791880static const u32 gaudi2_rot_id_to_queue_id[ROTATOR_ID_SIZE] = {1881[ROTATOR_ID_0] = GAUDI2_QUEUE_ID_ROT_0_0,1882[ROTATOR_ID_1] = GAUDI2_QUEUE_ID_ROT_1_0,1883};18841885static const u32 gaudi2_tpc_engine_id_to_tpc_id[] = {1886[GAUDI2_DCORE0_ENGINE_ID_TPC_0] = TPC_ID_DCORE0_TPC0,1887[GAUDI2_DCORE0_ENGINE_ID_TPC_1] = TPC_ID_DCORE0_TPC1,1888[GAUDI2_DCORE0_ENGINE_ID_TPC_2] = TPC_ID_DCORE0_TPC2,1889[GAUDI2_DCORE0_ENGINE_ID_TPC_3] = TPC_ID_DCORE0_TPC3,1890[GAUDI2_DCORE0_ENGINE_ID_TPC_4] = TPC_ID_DCORE0_TPC4,1891[GAUDI2_DCORE0_ENGINE_ID_TPC_5] = TPC_ID_DCORE0_TPC5,1892[GAUDI2_DCORE1_ENGINE_ID_TPC_0] = TPC_ID_DCORE1_TPC0,1893[GAUDI2_DCORE1_ENGINE_ID_TPC_1] = TPC_ID_DCORE1_TPC1,1894[GAUDI2_DCORE1_ENGINE_ID_TPC_2] = TPC_ID_DCORE1_TPC2,1895[GAUDI2_DCORE1_ENGINE_ID_TPC_3] = TPC_ID_DCORE1_TPC3,1896[GAUDI2_DCORE1_ENGINE_ID_TPC_4] = TPC_ID_DCORE1_TPC4,1897[GAUDI2_DCORE1_ENGINE_ID_TPC_5] = TPC_ID_DCORE1_TPC5,1898[GAUDI2_DCORE2_ENGINE_ID_TPC_0] = TPC_ID_DCORE2_TPC0,1899[GAUDI2_DCORE2_ENGINE_ID_TPC_1] = TPC_ID_DCORE2_TPC1,1900[GAUDI2_DCORE2_ENGINE_ID_TPC_2] = TPC_ID_DCORE2_TPC2,1901[GAUDI2_DCORE2_ENGINE_ID_TPC_3] = TPC_ID_DCORE2_TPC3,1902[GAUDI2_DCORE2_ENGINE_ID_TPC_4] = TPC_ID_DCORE2_TPC4,1903[GAUDI2_DCORE2_ENGINE_ID_TPC_5] = TPC_ID_DCORE2_TPC5,1904[GAUDI2_DCORE3_ENGINE_ID_TPC_0] = TPC_ID_DCORE3_TPC0,1905[GAUDI2_DCORE3_ENGINE_ID_TPC_1] = TPC_ID_DCORE3_TPC1,1906[GAUDI2_DCORE3_ENGINE_ID_TPC_2] = TPC_ID_DCORE3_TPC2,1907[GAUDI2_DCORE3_ENGINE_ID_TPC_3] = TPC_ID_DCORE3_TPC3,1908[GAUDI2_DCORE3_ENGINE_ID_TPC_4] = TPC_ID_DCORE3_TPC4,1909[GAUDI2_DCORE3_ENGINE_ID_TPC_5] = TPC_ID_DCORE3_TPC5,1910/* the PCI TPC is placed last (mapped liked HW) */1911[GAUDI2_DCORE0_ENGINE_ID_TPC_6] = TPC_ID_DCORE0_TPC6,1912};19131914static const u32 gaudi2_mme_engine_id_to_mme_id[] = {1915[GAUDI2_DCORE0_ENGINE_ID_MME] = MME_ID_DCORE0,1916[GAUDI2_DCORE1_ENGINE_ID_MME] = MME_ID_DCORE1,1917[GAUDI2_DCORE2_ENGINE_ID_MME] = MME_ID_DCORE2,1918[GAUDI2_DCORE3_ENGINE_ID_MME] = MME_ID_DCORE3,1919};19201921static const u32 gaudi2_edma_engine_id_to_edma_id[] = {1922[GAUDI2_ENGINE_ID_PDMA_0] = DMA_CORE_ID_PDMA0,1923[GAUDI2_ENGINE_ID_PDMA_1] = DMA_CORE_ID_PDMA1,1924[GAUDI2_DCORE0_ENGINE_ID_EDMA_0] = DMA_CORE_ID_EDMA0,1925[GAUDI2_DCORE0_ENGINE_ID_EDMA_1] = DMA_CORE_ID_EDMA1,1926[GAUDI2_DCORE1_ENGINE_ID_EDMA_0] = DMA_CORE_ID_EDMA2,1927[GAUDI2_DCORE1_ENGINE_ID_EDMA_1] = DMA_CORE_ID_EDMA3,1928[GAUDI2_DCORE2_ENGINE_ID_EDMA_0] = DMA_CORE_ID_EDMA4,1929[GAUDI2_DCORE2_ENGINE_ID_EDMA_1] = DMA_CORE_ID_EDMA5,1930[GAUDI2_DCORE3_ENGINE_ID_EDMA_0] = DMA_CORE_ID_EDMA6,1931[GAUDI2_DCORE3_ENGINE_ID_EDMA_1] = DMA_CORE_ID_EDMA7,1932[GAUDI2_ENGINE_ID_KDMA] = DMA_CORE_ID_KDMA,1933};19341935const u32 edma_stream_base[NUM_OF_EDMA_PER_DCORE * NUM_OF_DCORES] = {1936GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0,1937GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0,1938GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0,1939GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0,1940GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0,1941GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0,1942GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0,1943GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0,1944};19451946static const char gaudi2_vdec_irq_name[GAUDI2_VDEC_MSIX_ENTRIES][GAUDI2_MAX_STRING_LEN] = {1947"gaudi2 vdec 0_0", "gaudi2 vdec 0_0 abnormal",1948"gaudi2 vdec 0_1", "gaudi2 vdec 0_1 abnormal",1949"gaudi2 vdec 1_0", "gaudi2 vdec 1_0 abnormal",1950"gaudi2 vdec 1_1", "gaudi2 vdec 1_1 abnormal",1951"gaudi2 vdec 2_0", "gaudi2 vdec 2_0 abnormal",1952"gaudi2 vdec 2_1", "gaudi2 vdec 2_1 abnormal",1953"gaudi2 vdec 3_0", "gaudi2 vdec 3_0 abnormal",1954"gaudi2 vdec 3_1", "gaudi2 vdec 3_1 abnormal",1955"gaudi2 vdec s_0", "gaudi2 vdec s_0 abnormal",1956"gaudi2 vdec s_1", "gaudi2 vdec s_1 abnormal"1957};19581959enum rtr_id {1960DCORE0_RTR0,1961DCORE0_RTR1,1962DCORE0_RTR2,1963DCORE0_RTR3,1964DCORE0_RTR4,1965DCORE0_RTR5,1966DCORE0_RTR6,1967DCORE0_RTR7,1968DCORE1_RTR0,1969DCORE1_RTR1,1970DCORE1_RTR2,1971DCORE1_RTR3,1972DCORE1_RTR4,1973DCORE1_RTR5,1974DCORE1_RTR6,1975DCORE1_RTR7,1976DCORE2_RTR0,1977DCORE2_RTR1,1978DCORE2_RTR2,1979DCORE2_RTR3,1980DCORE2_RTR4,1981DCORE2_RTR5,1982DCORE2_RTR6,1983DCORE2_RTR7,1984DCORE3_RTR0,1985DCORE3_RTR1,1986DCORE3_RTR2,1987DCORE3_RTR3,1988DCORE3_RTR4,1989DCORE3_RTR5,1990DCORE3_RTR6,1991DCORE3_RTR7,1992};19931994static const u32 gaudi2_tpc_initiator_hbw_rtr_id[NUM_OF_TPC_PER_DCORE * NUM_OF_DCORES + 1] = {1995DCORE0_RTR1, DCORE0_RTR1, DCORE0_RTR2, DCORE0_RTR2, DCORE0_RTR3, DCORE0_RTR3,1996DCORE1_RTR6, DCORE1_RTR6, DCORE1_RTR5, DCORE1_RTR5, DCORE1_RTR4, DCORE1_RTR4,1997DCORE2_RTR3, DCORE2_RTR3, DCORE2_RTR2, DCORE2_RTR2, DCORE2_RTR1, DCORE2_RTR1,1998DCORE3_RTR4, DCORE3_RTR4, DCORE3_RTR5, DCORE3_RTR5, DCORE3_RTR6, DCORE3_RTR6,1999DCORE0_RTR02000};20012002static const u32 gaudi2_tpc_initiator_lbw_rtr_id[NUM_OF_TPC_PER_DCORE * NUM_OF_DCORES + 1] = {2003DCORE0_RTR1, DCORE0_RTR1, DCORE0_RTR1, DCORE0_RTR1, DCORE0_RTR2, DCORE0_RTR2,2004DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR6, DCORE1_RTR6, DCORE1_RTR5, DCORE1_RTR5,2005DCORE2_RTR2, DCORE2_RTR2, DCORE2_RTR1, DCORE2_RTR1, DCORE2_RTR0, DCORE2_RTR0,2006DCORE3_RTR5, DCORE3_RTR5, DCORE3_RTR6, DCORE3_RTR6, DCORE3_RTR7, DCORE3_RTR7,2007DCORE0_RTR02008};20092010static const u32 gaudi2_dec_initiator_hbw_rtr_id[NUMBER_OF_DEC] = {2011DCORE0_RTR0, DCORE0_RTR0, DCORE1_RTR7, DCORE1_RTR7, DCORE2_RTR0, DCORE2_RTR0,2012DCORE3_RTR7, DCORE3_RTR7, DCORE0_RTR0, DCORE0_RTR02013};20142015static const u32 gaudi2_dec_initiator_lbw_rtr_id[NUMBER_OF_DEC] = {2016DCORE0_RTR1, DCORE0_RTR1, DCORE1_RTR6, DCORE1_RTR6, DCORE2_RTR1, DCORE2_RTR1,2017DCORE3_RTR6, DCORE3_RTR6, DCORE0_RTR0, DCORE0_RTR02018};20192020static const u32 gaudi2_nic_initiator_hbw_rtr_id[NIC_NUMBER_OF_MACROS] = {2021DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE2_RTR0,2022DCORE2_RTR0, DCORE2_RTR0, DCORE2_RTR0, DCORE3_RTR7, DCORE3_RTR7, DCORE3_RTR72023};20242025static const u32 gaudi2_nic_initiator_lbw_rtr_id[NIC_NUMBER_OF_MACROS] = {2026DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE1_RTR7, DCORE2_RTR0,2027DCORE2_RTR0, DCORE2_RTR0, DCORE2_RTR0, DCORE3_RTR7, DCORE3_RTR7, DCORE3_RTR72028};20292030static const u32 gaudi2_edma_initiator_hbw_sft[NUM_OF_EDMA_PER_DCORE * NUM_OF_DCORES] = {2031mmSFT0_HBW_RTR_IF1_MSTR_IF_RR_SHRD_HBW_BASE,2032mmSFT0_HBW_RTR_IF0_MSTR_IF_RR_SHRD_HBW_BASE,2033mmSFT1_HBW_RTR_IF1_MSTR_IF_RR_SHRD_HBW_BASE,2034mmSFT1_HBW_RTR_IF0_MSTR_IF_RR_SHRD_HBW_BASE,2035mmSFT2_HBW_RTR_IF0_MSTR_IF_RR_SHRD_HBW_BASE,2036mmSFT2_HBW_RTR_IF1_MSTR_IF_RR_SHRD_HBW_BASE,2037mmSFT3_HBW_RTR_IF0_MSTR_IF_RR_SHRD_HBW_BASE,2038mmSFT3_HBW_RTR_IF1_MSTR_IF_RR_SHRD_HBW_BASE2039};20402041static const u32 gaudi2_pdma_initiator_hbw_rtr_id[NUM_OF_PDMA] = {2042DCORE0_RTR0, DCORE0_RTR02043};20442045static const u32 gaudi2_pdma_initiator_lbw_rtr_id[NUM_OF_PDMA] = {2046DCORE0_RTR2, DCORE0_RTR22047};20482049static const u32 gaudi2_rot_initiator_hbw_rtr_id[NUM_OF_ROT] = {2050DCORE2_RTR0, DCORE3_RTR72051};20522053static const u32 gaudi2_rot_initiator_lbw_rtr_id[NUM_OF_ROT] = {2054DCORE2_RTR2, DCORE3_RTR52055};20562057struct mme_initiators_rtr_id {2058u32 wap0;2059u32 wap1;2060u32 write;2061u32 read;2062u32 sbte0;2063u32 sbte1;2064u32 sbte2;2065u32 sbte3;2066u32 sbte4;2067};20682069enum mme_initiators {2070MME_WAP0 = 0,2071MME_WAP1,2072MME_WRITE,2073MME_READ,2074MME_SBTE0,2075MME_SBTE1,2076MME_SBTE2,2077MME_SBTE3,2078MME_SBTE4,2079MME_INITIATORS_MAX2080};20812082static const struct mme_initiators_rtr_id2083gaudi2_mme_initiator_rtr_id[NUM_OF_MME_PER_DCORE * NUM_OF_DCORES] = {2084{ .wap0 = 5, .wap1 = 7, .write = 6, .read = 7,2085.sbte0 = 7, .sbte1 = 4, .sbte2 = 4, .sbte3 = 5, .sbte4 = 6},2086{ .wap0 = 10, .wap1 = 8, .write = 9, .read = 8,2087.sbte0 = 11, .sbte1 = 11, .sbte2 = 10, .sbte3 = 9, .sbte4 = 8},2088{ .wap0 = 21, .wap1 = 23, .write = 22, .read = 23,2089.sbte0 = 20, .sbte1 = 20, .sbte2 = 21, .sbte3 = 22, .sbte4 = 23},2090{ .wap0 = 30, .wap1 = 28, .write = 29, .read = 30,2091.sbte0 = 31, .sbte1 = 31, .sbte2 = 30, .sbte3 = 29, .sbte4 = 28},2092};20932094enum razwi_event_sources {2095RAZWI_TPC,2096RAZWI_MME,2097RAZWI_EDMA,2098RAZWI_PDMA,2099RAZWI_NIC,2100RAZWI_DEC,2101RAZWI_ROT,2102RAZWI_ARC_FARM2103};21042105struct hbm_mc_error_causes {2106u32 mask;2107char cause[50];2108};21092110static struct hl_special_block_info gaudi2_special_blocks[] = GAUDI2_SPECIAL_BLOCKS;21112112/* Special blocks iterator is currently used to configure security protection bits,2113* and read global errors. Most HW blocks are addressable and those who aren't (N/A)-2114* must be skipped. Following configurations are commonly used for both PB config2115* and global error reading, since currently they both share the same settings.2116* Once it changes, we must remember to use separate configurations for either one.2117*/2118static int gaudi2_iterator_skip_block_types[] = {2119GAUDI2_BLOCK_TYPE_PLL,2120GAUDI2_BLOCK_TYPE_EU_BIST,2121GAUDI2_BLOCK_TYPE_HBM,2122GAUDI2_BLOCK_TYPE_XFT2123};21242125static struct range gaudi2_iterator_skip_block_ranges[] = {2126/* Skip all PSOC blocks except for PSOC_GLOBAL_CONF */2127{mmPSOC_I2C_M0_BASE, mmPSOC_EFUSE_BASE},2128{mmPSOC_BTL_BASE, mmPSOC_MSTR_IF_RR_SHRD_HBW_BASE},2129/* Skip all CPU blocks except for CPU_IF */2130{mmCPU_CA53_CFG_BASE, mmCPU_CA53_CFG_BASE},2131{mmCPU_TIMESTAMP_BASE, mmCPU_MSTR_IF_RR_SHRD_HBW_BASE}2132};21332134static struct hbm_mc_error_causes hbm_mc_spi[GAUDI2_NUM_OF_HBM_MC_SPI_CAUSE] = {2135{HBM_MC_SPI_TEMP_PIN_CHG_MASK, "temperature pins changed"},2136{HBM_MC_SPI_THR_ENG_MASK, "temperature-based throttling engaged"},2137{HBM_MC_SPI_THR_DIS_ENG_MASK, "temperature-based throttling disengaged"},2138{HBM_MC_SPI_IEEE1500_COMP_MASK, "IEEE1500 op comp"},2139{HBM_MC_SPI_IEEE1500_PAUSED_MASK, "IEEE1500 op paused"},2140};21412142static const char * const hbm_mc_sei_cause[GAUDI2_NUM_OF_HBM_SEI_CAUSE] = {2143[HBM_SEI_CMD_PARITY_EVEN] = "SEI C/A parity even",2144[HBM_SEI_CMD_PARITY_ODD] = "SEI C/A parity odd",2145[HBM_SEI_READ_ERR] = "SEI read data error",2146[HBM_SEI_WRITE_DATA_PARITY_ERR] = "SEI write data parity error",2147[HBM_SEI_CATTRIP] = "SEI CATTRIP asserted",2148[HBM_SEI_MEM_BIST_FAIL] = "SEI memory BIST fail",2149[HBM_SEI_DFI] = "SEI DFI error",2150[HBM_SEI_INV_TEMP_READ_OUT] = "SEI invalid temp read",2151[HBM_SEI_BIST_FAIL] = "SEI BIST fail"2152};21532154struct mmu_spi_sei_cause {2155char cause[50];2156int clear_bit;2157};21582159static const struct mmu_spi_sei_cause gaudi2_mmu_spi_sei[GAUDI2_NUM_OF_MMU_SPI_SEI_CAUSE] = {2160{"page fault", 1}, /* INTERRUPT_CLR[1] */2161{"page access", 1}, /* INTERRUPT_CLR[1] */2162{"bypass ddr", 2}, /* INTERRUPT_CLR[2] */2163{"multi hit", 2}, /* INTERRUPT_CLR[2] */2164{"mmu rei0", -1}, /* no clear register bit */2165{"mmu rei1", -1}, /* no clear register bit */2166{"stlb rei0", -1}, /* no clear register bit */2167{"stlb rei1", -1}, /* no clear register bit */2168{"rr privileged write hit", 2}, /* INTERRUPT_CLR[2] */2169{"rr privileged read hit", 2}, /* INTERRUPT_CLR[2] */2170{"rr secure write hit", 2}, /* INTERRUPT_CLR[2] */2171{"rr secure read hit", 2}, /* INTERRUPT_CLR[2] */2172{"bist_fail no use", 2}, /* INTERRUPT_CLR[2] */2173{"bist_fail no use", 2}, /* INTERRUPT_CLR[2] */2174{"bist_fail no use", 2}, /* INTERRUPT_CLR[2] */2175{"bist_fail no use", 2}, /* INTERRUPT_CLR[2] */2176{"slave error", 16}, /* INTERRUPT_CLR[16] */2177{"dec error", 17}, /* INTERRUPT_CLR[17] */2178{"burst fifo full", 2} /* INTERRUPT_CLR[2] */2179};21802181struct gaudi2_cache_invld_params {2182u64 start_va;2183u64 end_va;2184u32 inv_start_val;2185u32 flags;2186bool range_invalidation;2187};21882189struct gaudi2_tpc_idle_data {2190struct engines_data *e;2191unsigned long *mask;2192bool *is_idle;2193const char *tpc_fmt;2194};21952196struct gaudi2_tpc_mmu_data {2197u32 rw_asid;2198};21992200static s64 gaudi2_state_dump_specs_props[SP_MAX] = {0};22012202static int gaudi2_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size, u64 val);2203static bool gaudi2_is_queue_enabled(struct hl_device *hdev, u32 hw_queue_id);2204static bool gaudi2_is_arc_enabled(struct hl_device *hdev, u64 arc_id);2205static void gaudi2_clr_arc_id_cap(struct hl_device *hdev, u64 arc_id);2206static void gaudi2_set_arc_id_cap(struct hl_device *hdev, u64 arc_id);2207static void gaudi2_memset_device_lbw(struct hl_device *hdev, u32 addr, u32 size, u32 val);2208static int gaudi2_send_job_to_kdma(struct hl_device *hdev, u64 src_addr, u64 dst_addr, u32 size,2209bool is_memset);2210static bool gaudi2_get_tpc_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,2211struct engines_data *e);2212static bool gaudi2_get_mme_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,2213struct engines_data *e);2214static bool gaudi2_get_edma_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,2215struct engines_data *e);2216static u64 gaudi2_mmu_scramble_addr(struct hl_device *hdev, u64 raw_addr);2217static u64 gaudi2_mmu_descramble_addr(struct hl_device *hdev, u64 scrambled_addr);22182219static void gaudi2_init_scrambler_hbm(struct hl_device *hdev)2220{22212222}22232224static u32 gaudi2_get_signal_cb_size(struct hl_device *hdev)2225{2226return sizeof(struct packet_msg_short);2227}22282229static u32 gaudi2_get_wait_cb_size(struct hl_device *hdev)2230{2231return sizeof(struct packet_msg_short) * 4 + sizeof(struct packet_fence);2232}22332234void gaudi2_iterate_tpcs(struct hl_device *hdev, struct iterate_module_ctx *ctx)2235{2236struct asic_fixed_properties *prop = &hdev->asic_prop;2237int dcore, inst, tpc_seq;2238u32 offset;22392240/* init the return code */2241ctx->rc = 0;22422243for (dcore = 0; dcore < NUM_OF_DCORES; dcore++) {2244for (inst = 0; inst < NUM_OF_TPC_PER_DCORE; inst++) {2245tpc_seq = dcore * NUM_OF_TPC_PER_DCORE + inst;22462247if (!(prop->tpc_enabled_mask & BIT(tpc_seq)))2248continue;22492250offset = (DCORE_OFFSET * dcore) + (DCORE_TPC_OFFSET * inst);22512252ctx->fn(hdev, dcore, inst, offset, ctx);2253if (ctx->rc) {2254dev_err(hdev->dev, "TPC iterator failed for DCORE%d TPC%d\n",2255dcore, inst);2256return;2257}2258}2259}22602261if (!(prop->tpc_enabled_mask & BIT(TPC_ID_DCORE0_TPC6)))2262return;22632264/* special check for PCI TPC (DCORE0_TPC6) */2265offset = DCORE_TPC_OFFSET * (NUM_DCORE0_TPC - 1);2266ctx->fn(hdev, 0, NUM_DCORE0_TPC - 1, offset, ctx);2267if (ctx->rc)2268dev_err(hdev->dev, "TPC iterator failed for DCORE0 TPC6\n");2269}22702271static bool gaudi2_host_phys_addr_valid(u64 addr)2272{2273if ((addr < HOST_PHYS_BASE_0 + HOST_PHYS_SIZE_0) || (addr >= HOST_PHYS_BASE_1))2274return true;22752276return false;2277}22782279static int set_number_of_functional_hbms(struct hl_device *hdev)2280{2281struct asic_fixed_properties *prop = &hdev->asic_prop;2282u8 faulty_hbms = hweight64(hdev->dram_binning);22832284/* check if all HBMs should be used */2285if (!faulty_hbms) {2286dev_dbg(hdev->dev, "All HBM are in use (no binning)\n");2287prop->num_functional_hbms = GAUDI2_HBM_NUM;2288return 0;2289}22902291/*2292* check for error condition in which number of binning2293* candidates is higher than the maximum supported by the2294* driver (in which case binning mask shall be ignored and driver will2295* set the default)2296*/2297if (faulty_hbms > MAX_FAULTY_HBMS) {2298dev_err(hdev->dev,2299"HBM binning supports max of %d faulty HBMs, supplied mask 0x%llx.\n",2300MAX_FAULTY_HBMS, hdev->dram_binning);2301return -EINVAL;2302}23032304/*2305* by default, number of functional HBMs in Gaudi2 is always2306* GAUDI2_HBM_NUM - 1.2307*/2308prop->num_functional_hbms = GAUDI2_HBM_NUM - faulty_hbms;2309return 0;2310}23112312static bool gaudi2_is_edma_queue_id(u32 queue_id)2313{23142315switch (queue_id) {2316case GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3:2317case GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3:2318case GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3:2319case GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3:2320return true;2321default:2322return false;2323}2324}23252326static int gaudi2_set_dram_properties(struct hl_device *hdev)2327{2328struct asic_fixed_properties *prop = &hdev->asic_prop;2329u64 hbm_drv_base_offset = 0, edma_pq_base_addr;2330u32 basic_hbm_page_size, edma_idx = 0;2331int rc, i;23322333rc = set_number_of_functional_hbms(hdev);2334if (rc)2335return -EINVAL;23362337/*2338* Due to HW bug in which TLB size is x16 smaller than expected we use a workaround2339* in which we are using x16 bigger page size to be able to populate the entire2340* HBM mappings in the TLB2341*/2342basic_hbm_page_size = prop->num_functional_hbms * SZ_8M;2343prop->dram_page_size = GAUDI2_COMPENSATE_TLB_PAGE_SIZE_FACTOR * basic_hbm_page_size;2344prop->device_mem_alloc_default_page_size = prop->dram_page_size;2345prop->dram_size = prop->num_functional_hbms * SZ_16G;2346prop->dram_base_address = DRAM_PHYS_BASE;2347prop->dram_end_address = prop->dram_base_address + prop->dram_size;2348prop->dram_supports_virtual_memory = true;23492350prop->dram_user_base_address = DRAM_PHYS_BASE + prop->dram_page_size;2351prop->dram_hints_align_mask = ~GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK;2352prop->hints_dram_reserved_va_range.start_addr = RESERVED_VA_RANGE_FOR_ARC_ON_HBM_START;2353prop->hints_dram_reserved_va_range.end_addr = RESERVED_VA_RANGE_FOR_ARC_ON_HBM_END;23542355/* since DRAM page size differs from DMMU page size we need to allocate2356* DRAM memory in units of dram_page size and mapping this memory in2357* units of DMMU page size. we overcome this size mismatch using a2358* scrambling routine which takes a DRAM page and converts it to a DMMU2359* page.2360* We therefore:2361* 1. partition the virtual address space to DRAM-page (whole) pages.2362* (suppose we get n such pages)2363* 2. limit the amount of virtual address space we got from 1 above to2364* a multiple of 64M as we don't want the scrambled address to cross2365* the DRAM virtual address space.2366* ( m = (n * DRAM_page_size) / DMMU_page_size).2367* 3. determine the and address accordingly2368* end_addr = start_addr + m * 48M2369*2370* the DRAM address MSBs (63:48) are not part of the roundup calculation2371*/2372prop->dmmu.start_addr = prop->dram_base_address +2373(prop->dram_page_size *2374DIV_ROUND_UP_SECTOR_T(prop->dram_size, prop->dram_page_size));2375prop->dmmu.end_addr = prop->dmmu.start_addr + prop->dram_page_size *2376div_u64((VA_HBM_SPACE_END - prop->dmmu.start_addr), prop->dmmu.page_size);2377/*2378* Driver can't share an (48MB) HBM page with the F/W in order to prevent FW to block2379* the driver part by range register, so it must start at the next (48MB) page2380*/2381hbm_drv_base_offset = roundup(CPU_FW_IMAGE_SIZE, prop->num_functional_hbms * SZ_8M);23822383/*2384* The NIC driver section size and the HMMU page tables section in the HBM needs2385* to be the remaining size in the first dram page after taking into2386* account the F/W image size2387*/23882389/* Reserve region in HBM for HMMU page tables */2390prop->mmu_pgt_addr = DRAM_PHYS_BASE + hbm_drv_base_offset +2391((prop->dram_page_size - hbm_drv_base_offset) -2392(HMMU_PAGE_TABLES_SIZE + EDMA_PQS_SIZE + EDMA_SCRATCHPAD_SIZE));23932394/* Set EDMA PQs HBM addresses */2395edma_pq_base_addr = prop->mmu_pgt_addr + HMMU_PAGE_TABLES_SIZE;23962397for (i = 0 ; i < GAUDI2_QUEUE_ID_CPU_PQ ; i++) {2398if (gaudi2_is_edma_queue_id(i)) {2399prop->hw_queues_props[i].q_dram_bd_address = edma_pq_base_addr +2400(edma_idx * HL_QUEUE_SIZE_IN_BYTES);2401edma_idx++;2402}2403}24042405return 0;2406}24072408static int gaudi2_set_fixed_properties(struct hl_device *hdev)2409{2410struct asic_fixed_properties *prop = &hdev->asic_prop;2411struct hw_queue_properties *q_props;2412u32 num_sync_stream_queues = 0;2413int i, rc;24142415prop->max_queues = GAUDI2_QUEUE_ID_SIZE;2416prop->hw_queues_props = kcalloc(prop->max_queues, sizeof(struct hw_queue_properties),2417GFP_KERNEL);24182419if (!prop->hw_queues_props)2420return -ENOMEM;24212422q_props = prop->hw_queues_props;24232424for (i = 0 ; i < GAUDI2_QUEUE_ID_CPU_PQ ; i++) {2425q_props[i].type = QUEUE_TYPE_HW;2426q_props[i].driver_only = 0;24272428if (i >= GAUDI2_QUEUE_ID_NIC_0_0 && i <= GAUDI2_QUEUE_ID_NIC_23_3) {2429q_props[i].supports_sync_stream = 0;2430} else {2431q_props[i].supports_sync_stream = 1;2432num_sync_stream_queues++;2433}24342435q_props[i].cb_alloc_flags = CB_ALLOC_USER;24362437if (gaudi2_is_edma_queue_id(i))2438q_props[i].dram_bd = 1;2439}24402441q_props[GAUDI2_QUEUE_ID_CPU_PQ].type = QUEUE_TYPE_CPU;2442q_props[GAUDI2_QUEUE_ID_CPU_PQ].driver_only = 1;2443q_props[GAUDI2_QUEUE_ID_CPU_PQ].cb_alloc_flags = CB_ALLOC_KERNEL;24442445prop->cache_line_size = DEVICE_CACHE_LINE_SIZE;2446prop->cfg_base_address = CFG_BASE;2447prop->device_dma_offset_for_host_access = HOST_PHYS_BASE_0;2448prop->host_base_address = HOST_PHYS_BASE_0;2449prop->host_end_address = prop->host_base_address + HOST_PHYS_SIZE_0;2450prop->max_pending_cs = GAUDI2_MAX_PENDING_CS;2451prop->completion_queues_count = GAUDI2_RESERVED_CQ_NUMBER;2452prop->user_dec_intr_count = NUMBER_OF_DEC;2453prop->user_interrupt_count = GAUDI2_IRQ_NUM_USER_LAST - GAUDI2_IRQ_NUM_USER_FIRST + 1;2454prop->completion_mode = HL_COMPLETION_MODE_CS;2455prop->sync_stream_first_sob = GAUDI2_RESERVED_SOB_NUMBER;2456prop->sync_stream_first_mon = GAUDI2_RESERVED_MON_NUMBER;24572458prop->sram_base_address = SRAM_BASE_ADDR;2459prop->sram_size = SRAM_SIZE;2460prop->sram_end_address = prop->sram_base_address + prop->sram_size;2461prop->sram_user_base_address = prop->sram_base_address + SRAM_USER_BASE_OFFSET;24622463prop->hints_range_reservation = true;24642465prop->rotator_enabled_mask = BIT(NUM_OF_ROT) - 1;24662467prop->max_asid = 2;24682469prop->dmmu.pgt_size = HMMU_PAGE_TABLES_SIZE;2470prop->mmu_pte_size = HL_PTE_SIZE;24712472prop->dmmu.hop_shifts[MMU_HOP0] = DHOP0_SHIFT;2473prop->dmmu.hop_shifts[MMU_HOP1] = DHOP1_SHIFT;2474prop->dmmu.hop_shifts[MMU_HOP2] = DHOP2_SHIFT;2475prop->dmmu.hop_shifts[MMU_HOP3] = DHOP3_SHIFT;2476prop->dmmu.hop_masks[MMU_HOP0] = DHOP0_MASK;2477prop->dmmu.hop_masks[MMU_HOP1] = DHOP1_MASK;2478prop->dmmu.hop_masks[MMU_HOP2] = DHOP2_MASK;2479prop->dmmu.hop_masks[MMU_HOP3] = DHOP3_MASK;2480prop->dmmu.page_size = PAGE_SIZE_1GB;2481prop->dmmu.num_hops = MMU_ARCH_4_HOPS;2482prop->dmmu.last_mask = LAST_MASK;2483prop->dmmu.host_resident = 0;2484prop->dmmu.hop_table_size = HOP_TABLE_SIZE_512_PTE;2485prop->dmmu.hop0_tables_total_size = HOP_TABLE_SIZE_512_PTE * prop->max_asid;24862487/* As we need to set the pgt address in dram for HMMU init so we cannot2488* wait to the fw cpucp info to set the dram props as mmu init comes before2489* hw init2490*/2491rc = hdev->asic_funcs->set_dram_properties(hdev);2492if (rc)2493goto free_qprops;24942495prop->mmu_pgt_size = PMMU_PAGE_TABLES_SIZE;24962497prop->pmmu.pgt_size = prop->mmu_pgt_size;2498hdev->pmmu_huge_range = true;2499prop->pmmu.host_resident = 1;2500prop->pmmu.num_hops = MMU_ARCH_6_HOPS;2501prop->pmmu.last_mask = LAST_MASK;2502prop->pmmu.hop_table_size = HOP_TABLE_SIZE_512_PTE;2503prop->pmmu.hop0_tables_total_size = HOP_TABLE_SIZE_512_PTE * prop->max_asid;25042505prop->hints_host_reserved_va_range.start_addr = RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START;2506prop->hints_host_reserved_va_range.end_addr = RESERVED_VA_RANGE_FOR_ARC_ON_HOST_END;2507prop->hints_host_hpage_reserved_va_range.start_addr =2508RESERVED_VA_RANGE_FOR_ARC_ON_HOST_HPAGE_START;2509prop->hints_host_hpage_reserved_va_range.end_addr =2510RESERVED_VA_RANGE_FOR_ARC_ON_HOST_HPAGE_END;25112512if (PAGE_SIZE == SZ_64K) {2513prop->pmmu.hop_shifts[MMU_HOP0] = HOP0_SHIFT_64K;2514prop->pmmu.hop_shifts[MMU_HOP1] = HOP1_SHIFT_64K;2515prop->pmmu.hop_shifts[MMU_HOP2] = HOP2_SHIFT_64K;2516prop->pmmu.hop_shifts[MMU_HOP3] = HOP3_SHIFT_64K;2517prop->pmmu.hop_shifts[MMU_HOP4] = HOP4_SHIFT_64K;2518prop->pmmu.hop_shifts[MMU_HOP5] = HOP5_SHIFT_64K;2519prop->pmmu.hop_masks[MMU_HOP0] = HOP0_MASK_64K;2520prop->pmmu.hop_masks[MMU_HOP1] = HOP1_MASK_64K;2521prop->pmmu.hop_masks[MMU_HOP2] = HOP2_MASK_64K;2522prop->pmmu.hop_masks[MMU_HOP3] = HOP3_MASK_64K;2523prop->pmmu.hop_masks[MMU_HOP4] = HOP4_MASK_64K;2524prop->pmmu.hop_masks[MMU_HOP5] = HOP5_MASK_64K;2525prop->pmmu.start_addr = VA_HOST_SPACE_PAGE_START;2526prop->pmmu.end_addr = VA_HOST_SPACE_PAGE_END;2527prop->pmmu.page_size = PAGE_SIZE_64KB;25282529/* shifts and masks are the same in PMMU and HPMMU */2530memcpy(&prop->pmmu_huge, &prop->pmmu, sizeof(prop->pmmu));2531prop->pmmu_huge.page_size = PAGE_SIZE_16MB;2532prop->pmmu_huge.start_addr = VA_HOST_SPACE_HPAGE_START;2533prop->pmmu_huge.end_addr = VA_HOST_SPACE_HPAGE_END;2534} else {2535prop->pmmu.hop_shifts[MMU_HOP0] = HOP0_SHIFT_4K;2536prop->pmmu.hop_shifts[MMU_HOP1] = HOP1_SHIFT_4K;2537prop->pmmu.hop_shifts[MMU_HOP2] = HOP2_SHIFT_4K;2538prop->pmmu.hop_shifts[MMU_HOP3] = HOP3_SHIFT_4K;2539prop->pmmu.hop_shifts[MMU_HOP4] = HOP4_SHIFT_4K;2540prop->pmmu.hop_shifts[MMU_HOP5] = HOP5_SHIFT_4K;2541prop->pmmu.hop_masks[MMU_HOP0] = HOP0_MASK_4K;2542prop->pmmu.hop_masks[MMU_HOP1] = HOP1_MASK_4K;2543prop->pmmu.hop_masks[MMU_HOP2] = HOP2_MASK_4K;2544prop->pmmu.hop_masks[MMU_HOP3] = HOP3_MASK_4K;2545prop->pmmu.hop_masks[MMU_HOP4] = HOP4_MASK_4K;2546prop->pmmu.hop_masks[MMU_HOP5] = HOP5_MASK_4K;2547prop->pmmu.start_addr = VA_HOST_SPACE_PAGE_START;2548prop->pmmu.end_addr = VA_HOST_SPACE_PAGE_END;2549prop->pmmu.page_size = PAGE_SIZE_4KB;25502551/* shifts and masks are the same in PMMU and HPMMU */2552memcpy(&prop->pmmu_huge, &prop->pmmu, sizeof(prop->pmmu));2553prop->pmmu_huge.page_size = PAGE_SIZE_2MB;2554prop->pmmu_huge.start_addr = VA_HOST_SPACE_HPAGE_START;2555prop->pmmu_huge.end_addr = VA_HOST_SPACE_HPAGE_END;2556}25572558prop->max_num_of_engines = GAUDI2_ENGINE_ID_SIZE;2559prop->num_engine_cores = CPU_ID_MAX;2560prop->cfg_size = CFG_SIZE;2561prop->num_of_events = GAUDI2_EVENT_SIZE;25622563prop->supports_engine_modes = true;25642565prop->dc_power_default = DC_POWER_DEFAULT;25662567prop->cb_pool_cb_cnt = GAUDI2_CB_POOL_CB_CNT;2568prop->cb_pool_cb_size = GAUDI2_CB_POOL_CB_SIZE;2569prop->pcie_dbi_base_address = CFG_BASE + mmPCIE_DBI_BASE;2570prop->pcie_aux_dbi_reg_addr = CFG_BASE + mmPCIE_AUX_DBI;25712572strscpy_pad(prop->cpucp_info.card_name, GAUDI2_DEFAULT_CARD_NAME, CARD_NAME_MAX_LEN);25732574prop->mme_master_slave_mode = 1;25752576prop->first_available_user_sob[0] = GAUDI2_RESERVED_SOB_NUMBER +2577(num_sync_stream_queues * HL_RSVD_SOBS);25782579prop->first_available_user_mon[0] = GAUDI2_RESERVED_MON_NUMBER +2580(num_sync_stream_queues * HL_RSVD_MONS);25812582prop->first_available_user_interrupt = GAUDI2_IRQ_NUM_USER_FIRST;2583prop->tpc_interrupt_id = GAUDI2_IRQ_NUM_TPC_ASSERT;2584prop->eq_interrupt_id = GAUDI2_IRQ_NUM_EVENT_QUEUE;25852586prop->first_available_cq[0] = GAUDI2_RESERVED_CQ_NUMBER;25872588prop->fw_cpu_boot_dev_sts0_valid = false;2589prop->fw_cpu_boot_dev_sts1_valid = false;2590prop->hard_reset_done_by_fw = false;2591prop->gic_interrupts_enable = true;25922593prop->server_type = HL_SERVER_TYPE_UNKNOWN;25942595prop->max_dec = NUMBER_OF_DEC;25962597prop->clk_pll_index = HL_GAUDI2_MME_PLL;25982599prop->dma_mask = 64;26002601prop->hbw_flush_reg = mmPCIE_WRAP_SPECIAL_GLBL_SPARE_0;26022603prop->supports_advanced_cpucp_rc = true;26042605return 0;26062607free_qprops:2608kfree(prop->hw_queues_props);2609return rc;2610}26112612static int gaudi2_pci_bars_map(struct hl_device *hdev)2613{2614static const char * const name[] = {"CFG_SRAM", "MSIX", "DRAM"};2615bool is_wc[3] = {false, false, true};2616int rc;26172618rc = hl_pci_bars_map(hdev, name, is_wc);2619if (rc)2620return rc;26212622hdev->rmmio = hdev->pcie_bar[SRAM_CFG_BAR_ID] + (CFG_BASE - STM_FLASH_BASE_ADDR);26232624return 0;2625}26262627static u64 gaudi2_set_hbm_bar_base(struct hl_device *hdev, u64 addr)2628{2629struct gaudi2_device *gaudi2 = hdev->asic_specific;2630struct hl_inbound_pci_region pci_region;2631u64 old_addr = addr;2632int rc;26332634if ((gaudi2) && (gaudi2->dram_bar_cur_addr == addr))2635return old_addr;26362637if (hdev->asic_prop.iatu_done_by_fw)2638return U64_MAX;26392640/* Inbound Region 2 - Bar 4 - Point to DRAM */2641pci_region.mode = PCI_BAR_MATCH_MODE;2642pci_region.bar = DRAM_BAR_ID;2643pci_region.addr = addr;2644rc = hl_pci_set_inbound_region(hdev, 2, &pci_region);2645if (rc)2646return U64_MAX;26472648if (gaudi2) {2649old_addr = gaudi2->dram_bar_cur_addr;2650gaudi2->dram_bar_cur_addr = addr;2651}26522653return old_addr;2654}26552656static int gaudi2_init_iatu(struct hl_device *hdev)2657{2658struct hl_inbound_pci_region inbound_region;2659struct hl_outbound_pci_region outbound_region;2660u32 bar_addr_low, bar_addr_high;2661int rc;26622663if (hdev->asic_prop.iatu_done_by_fw)2664return 0;26652666/* Temporary inbound Region 0 - Bar 0 - Point to CFG2667* We must map this region in BAR match mode in order to2668* fetch BAR physical base address2669*/2670inbound_region.mode = PCI_BAR_MATCH_MODE;2671inbound_region.bar = SRAM_CFG_BAR_ID;2672/* Base address must be aligned to Bar size which is 256 MB */2673inbound_region.addr = STM_FLASH_BASE_ADDR - STM_FLASH_ALIGNED_OFF;2674rc = hl_pci_set_inbound_region(hdev, 0, &inbound_region);2675if (rc)2676return rc;26772678/* Fetch physical BAR address */2679bar_addr_high = RREG32(mmPCIE_DBI_BAR1_REG + STM_FLASH_ALIGNED_OFF);2680bar_addr_low = RREG32(mmPCIE_DBI_BAR0_REG + STM_FLASH_ALIGNED_OFF) & ~0xF;26812682hdev->pcie_bar_phys[SRAM_CFG_BAR_ID] = (u64)bar_addr_high << 32 | bar_addr_low;26832684/* Inbound Region 0 - Bar 0 - Point to CFG */2685inbound_region.mode = PCI_ADDRESS_MATCH_MODE;2686inbound_region.bar = SRAM_CFG_BAR_ID;2687inbound_region.offset_in_bar = 0;2688inbound_region.addr = STM_FLASH_BASE_ADDR;2689inbound_region.size = CFG_REGION_SIZE;2690rc = hl_pci_set_inbound_region(hdev, 0, &inbound_region);2691if (rc)2692return rc;26932694/* Inbound Region 1 - Bar 0 - Point to BAR0_RESERVED + SRAM */2695inbound_region.mode = PCI_ADDRESS_MATCH_MODE;2696inbound_region.bar = SRAM_CFG_BAR_ID;2697inbound_region.offset_in_bar = CFG_REGION_SIZE;2698inbound_region.addr = BAR0_RSRVD_BASE_ADDR;2699inbound_region.size = BAR0_RSRVD_SIZE + SRAM_SIZE;2700rc = hl_pci_set_inbound_region(hdev, 1, &inbound_region);2701if (rc)2702return rc;27032704/* Inbound Region 2 - Bar 4 - Point to DRAM */2705inbound_region.mode = PCI_BAR_MATCH_MODE;2706inbound_region.bar = DRAM_BAR_ID;2707inbound_region.addr = DRAM_PHYS_BASE;2708rc = hl_pci_set_inbound_region(hdev, 2, &inbound_region);2709if (rc)2710return rc;27112712/* Outbound Region 0 - Point to Host */2713outbound_region.addr = HOST_PHYS_BASE_0;2714outbound_region.size = HOST_PHYS_SIZE_0;2715rc = hl_pci_set_outbound_region(hdev, &outbound_region);27162717return rc;2718}27192720static enum hl_device_hw_state gaudi2_get_hw_state(struct hl_device *hdev)2721{2722return RREG32(mmHW_STATE);2723}27242725static int gaudi2_tpc_binning_init_prop(struct hl_device *hdev)2726{2727struct asic_fixed_properties *prop = &hdev->asic_prop;27282729/*2730* check for error condition in which number of binning candidates2731* is higher than the maximum supported by the driver2732*/2733if (hweight64(hdev->tpc_binning) > MAX_CLUSTER_BINNING_FAULTY_TPCS) {2734dev_err(hdev->dev, "TPC binning is supported for max of %d faulty TPCs, provided mask 0x%llx\n",2735MAX_CLUSTER_BINNING_FAULTY_TPCS,2736hdev->tpc_binning);2737return -EINVAL;2738}27392740prop->tpc_binning_mask = hdev->tpc_binning;2741prop->tpc_enabled_mask = GAUDI2_TPC_FULL_MASK;27422743return 0;2744}27452746static int gaudi2_set_tpc_binning_masks(struct hl_device *hdev)2747{2748struct asic_fixed_properties *prop = &hdev->asic_prop;2749struct hw_queue_properties *q_props = prop->hw_queues_props;2750u64 tpc_binning_mask;2751u8 subst_idx = 0;2752int i, rc;27532754rc = gaudi2_tpc_binning_init_prop(hdev);2755if (rc)2756return rc;27572758tpc_binning_mask = prop->tpc_binning_mask;27592760for (i = 0 ; i < MAX_FAULTY_TPCS ; i++) {2761u8 subst_seq, binned, qid_base;27622763if (tpc_binning_mask == 0)2764break;27652766if (subst_idx == 0) {2767subst_seq = TPC_ID_DCORE0_TPC6;2768qid_base = GAUDI2_QUEUE_ID_DCORE0_TPC_6_0;2769} else {2770subst_seq = TPC_ID_DCORE3_TPC5;2771qid_base = GAUDI2_QUEUE_ID_DCORE3_TPC_5_0;2772}277327742775/* clear bit from mask */2776binned = __ffs(tpc_binning_mask);2777/*2778* Coverity complains about possible out-of-bound access in2779* clear_bit2780*/2781if (binned >= TPC_ID_SIZE) {2782dev_err(hdev->dev,2783"Invalid binned TPC (binning mask: %llx)\n",2784tpc_binning_mask);2785return -EINVAL;2786}2787clear_bit(binned, (unsigned long *)&tpc_binning_mask);27882789/* also clear replacing TPC bit from enabled mask */2790clear_bit(subst_seq, (unsigned long *)&prop->tpc_enabled_mask);27912792/* bin substite TPC's Qs */2793q_props[qid_base].binned = 1;2794q_props[qid_base + 1].binned = 1;2795q_props[qid_base + 2].binned = 1;2796q_props[qid_base + 3].binned = 1;27972798subst_idx++;2799}28002801return 0;2802}28032804static int gaudi2_set_dec_binning_masks(struct hl_device *hdev)2805{2806struct asic_fixed_properties *prop = &hdev->asic_prop;2807u8 num_faulty;28082809num_faulty = hweight32(hdev->decoder_binning);28102811/*2812* check for error condition in which number of binning candidates2813* is higher than the maximum supported by the driver2814*/2815if (num_faulty > MAX_FAULTY_DECODERS) {2816dev_err(hdev->dev, "decoder binning is supported for max of single faulty decoder, provided mask 0x%x\n",2817hdev->decoder_binning);2818return -EINVAL;2819}28202821prop->decoder_binning_mask = (hdev->decoder_binning & GAUDI2_DECODER_FULL_MASK);28222823if (prop->decoder_binning_mask)2824prop->decoder_enabled_mask = (GAUDI2_DECODER_FULL_MASK & ~BIT(DEC_ID_PCIE_VDEC1));2825else2826prop->decoder_enabled_mask = GAUDI2_DECODER_FULL_MASK;28272828return 0;2829}28302831static void gaudi2_set_dram_binning_masks(struct hl_device *hdev)2832{2833struct asic_fixed_properties *prop = &hdev->asic_prop;28342835/* check if we should override default binning */2836if (!hdev->dram_binning) {2837prop->dram_binning_mask = 0;2838prop->dram_enabled_mask = GAUDI2_DRAM_FULL_MASK;2839return;2840}28412842/* set DRAM binning constraints */2843prop->faulty_dram_cluster_map |= hdev->dram_binning;2844prop->dram_binning_mask = hdev->dram_binning;2845prop->dram_enabled_mask = GAUDI2_DRAM_FULL_MASK & ~BIT(HBM_ID5);2846}28472848static int gaudi2_set_edma_binning_masks(struct hl_device *hdev)2849{2850struct asic_fixed_properties *prop = &hdev->asic_prop;2851struct hw_queue_properties *q_props;2852u8 seq, num_faulty;28532854num_faulty = hweight32(hdev->edma_binning);28552856/*2857* check for error condition in which number of binning candidates2858* is higher than the maximum supported by the driver2859*/2860if (num_faulty > MAX_FAULTY_EDMAS) {2861dev_err(hdev->dev,2862"EDMA binning is supported for max of single faulty EDMA, provided mask 0x%x\n",2863hdev->edma_binning);2864return -EINVAL;2865}28662867if (!hdev->edma_binning) {2868prop->edma_binning_mask = 0;2869prop->edma_enabled_mask = GAUDI2_EDMA_FULL_MASK;2870return 0;2871}28722873seq = __ffs((unsigned long)hdev->edma_binning);28742875/* set binning constraints */2876prop->faulty_dram_cluster_map |= BIT(edma_to_hbm_cluster[seq]);2877prop->edma_binning_mask = hdev->edma_binning;2878prop->edma_enabled_mask = GAUDI2_EDMA_FULL_MASK & ~BIT(EDMA_ID_DCORE3_INSTANCE1);28792880/* bin substitute EDMA's queue */2881q_props = prop->hw_queues_props;2882q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0].binned = 1;2883q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_1].binned = 1;2884q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_2].binned = 1;2885q_props[GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3].binned = 1;28862887return 0;2888}28892890static int gaudi2_set_xbar_edge_enable_mask(struct hl_device *hdev, u32 xbar_edge_iso_mask)2891{2892struct asic_fixed_properties *prop = &hdev->asic_prop;2893u8 num_faulty, seq;28942895/* check if we should override default binning */2896if (!xbar_edge_iso_mask) {2897prop->xbar_edge_enabled_mask = GAUDI2_XBAR_EDGE_FULL_MASK;2898return 0;2899}29002901/*2902* note that it can be set to value other than 0 only after cpucp packet (i.e.2903* only the FW can set a redundancy value). for user it'll always be 0.2904*/2905num_faulty = hweight32(xbar_edge_iso_mask);29062907/*2908* check for error condition in which number of binning candidates2909* is higher than the maximum supported by the driver2910*/2911if (num_faulty > MAX_FAULTY_XBARS) {2912dev_err(hdev->dev, "we cannot have more than %d faulty XBAR EDGE\n",2913MAX_FAULTY_XBARS);2914return -EINVAL;2915}29162917seq = __ffs((unsigned long)xbar_edge_iso_mask);29182919/* set binning constraints */2920prop->faulty_dram_cluster_map |= BIT(xbar_edge_to_hbm_cluster[seq]);2921prop->xbar_edge_enabled_mask = (~xbar_edge_iso_mask) & GAUDI2_XBAR_EDGE_FULL_MASK;29222923return 0;2924}29252926static int gaudi2_set_cluster_binning_masks_common(struct hl_device *hdev, u8 xbar_edge_iso_mask)2927{2928int rc;29292930/*2931* mark all clusters as good, each component will "fail" cluster2932* based on eFuse/user values.2933* If more than single cluster is faulty- the chip is unusable2934*/2935hdev->asic_prop.faulty_dram_cluster_map = 0;29362937gaudi2_set_dram_binning_masks(hdev);29382939rc = gaudi2_set_edma_binning_masks(hdev);2940if (rc)2941return rc;29422943rc = gaudi2_set_xbar_edge_enable_mask(hdev, xbar_edge_iso_mask);2944if (rc)2945return rc;294629472948/* always initially set to full mask */2949hdev->asic_prop.hmmu_hif_enabled_mask = GAUDI2_HIF_HMMU_FULL_MASK;29502951return 0;2952}29532954static int gaudi2_set_cluster_binning_masks(struct hl_device *hdev)2955{2956struct asic_fixed_properties *prop = &hdev->asic_prop;2957int rc;29582959rc = gaudi2_set_cluster_binning_masks_common(hdev, prop->cpucp_info.xbar_binning_mask);2960if (rc)2961return rc;29622963/* if we have DRAM binning reported by FW we should perform cluster config */2964if (prop->faulty_dram_cluster_map) {2965u8 cluster_seq = __ffs((unsigned long)prop->faulty_dram_cluster_map);29662967prop->hmmu_hif_enabled_mask = cluster_hmmu_hif_enabled_mask[cluster_seq];2968}29692970return 0;2971}29722973static int gaudi2_set_binning_masks(struct hl_device *hdev)2974{2975int rc;29762977rc = gaudi2_set_cluster_binning_masks(hdev);2978if (rc)2979return rc;29802981rc = gaudi2_set_tpc_binning_masks(hdev);2982if (rc)2983return rc;29842985rc = gaudi2_set_dec_binning_masks(hdev);2986if (rc)2987return rc;29882989return 0;2990}29912992static int gaudi2_cpucp_info_get(struct hl_device *hdev)2993{2994struct gaudi2_device *gaudi2 = hdev->asic_specific;2995struct asic_fixed_properties *prop = &hdev->asic_prop;2996long max_power;2997u64 dram_size;2998int rc;29993000if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))3001return 0;30023003/* No point of asking this information again when not doing hard reset, as the device3004* CPU hasn't been reset3005*/3006if (hdev->reset_info.in_compute_reset)3007return 0;30083009rc = hl_fw_cpucp_handshake(hdev, mmCPU_BOOT_DEV_STS0, mmCPU_BOOT_DEV_STS1, mmCPU_BOOT_ERR0,3010mmCPU_BOOT_ERR1);3011if (rc)3012return rc;30133014dram_size = le64_to_cpu(prop->cpucp_info.dram_size);3015if (dram_size) {3016/* we can have wither 5 or 6 HBMs. other values are invalid */30173018if ((dram_size != ((GAUDI2_HBM_NUM - 1) * SZ_16G)) &&3019(dram_size != (GAUDI2_HBM_NUM * SZ_16G))) {3020dev_err(hdev->dev,3021"F/W reported invalid DRAM size %llu. Trying to use default size %llu\n",3022dram_size, prop->dram_size);3023dram_size = prop->dram_size;3024}30253026prop->dram_size = dram_size;3027prop->dram_end_address = prop->dram_base_address + dram_size;3028}30293030if (!strlen(prop->cpucp_info.card_name))3031strscpy_pad(prop->cpucp_info.card_name, GAUDI2_DEFAULT_CARD_NAME,3032CARD_NAME_MAX_LEN);30333034/* Overwrite binning masks with the actual binning values from F/W */3035hdev->dram_binning = prop->cpucp_info.dram_binning_mask;3036hdev->edma_binning = prop->cpucp_info.edma_binning_mask;3037hdev->tpc_binning = le64_to_cpu(prop->cpucp_info.tpc_binning_mask);3038hdev->decoder_binning = lower_32_bits(le64_to_cpu(prop->cpucp_info.decoder_binning_mask));30393040dev_dbg(hdev->dev, "Read binning masks: tpc: 0x%llx, dram: 0x%llx, edma: 0x%x, dec: 0x%x\n",3041hdev->tpc_binning, hdev->dram_binning, hdev->edma_binning,3042hdev->decoder_binning);30433044/*3045* at this point the DRAM parameters need to be updated according to data obtained3046* from the FW3047*/3048rc = hdev->asic_funcs->set_dram_properties(hdev);3049if (rc)3050return rc;30513052rc = hdev->asic_funcs->set_binning_masks(hdev);3053if (rc)3054return rc;30553056max_power = hl_fw_get_max_power(hdev);3057if (max_power < 0)3058return max_power;30593060prop->max_power_default = (u64) max_power;30613062return 0;3063}30643065static int gaudi2_fetch_psoc_frequency(struct hl_device *hdev)3066{3067struct gaudi2_device *gaudi2 = hdev->asic_specific;3068u16 pll_freq_arr[HL_PLL_NUM_OUTPUTS];3069int rc;30703071if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))3072return 0;30733074rc = hl_fw_cpucp_pll_info_get(hdev, HL_GAUDI2_CPU_PLL, pll_freq_arr);3075if (rc)3076return rc;30773078hdev->asic_prop.psoc_timestamp_frequency = pll_freq_arr[3];30793080return 0;3081}30823083static int gaudi2_mmu_clear_pgt_range(struct hl_device *hdev)3084{3085struct gaudi2_device *gaudi2 = hdev->asic_specific;3086struct asic_fixed_properties *prop = &hdev->asic_prop;3087int rc;30883089if (!(gaudi2->hw_cap_initialized & HW_CAP_MMU_MASK))3090return 0;30913092if (prop->dmmu.host_resident)3093return 0;30943095rc = gaudi2_memset_device_memory(hdev, prop->mmu_pgt_addr, prop->dmmu.pgt_size, 0);3096if (rc)3097dev_err(hdev->dev, "Failed to clear mmu pgt");30983099return rc;3100}31013102static int gaudi2_early_init(struct hl_device *hdev)3103{3104struct asic_fixed_properties *prop = &hdev->asic_prop;3105struct pci_dev *pdev = hdev->pdev;3106resource_size_t pci_bar_size;3107int rc;31083109rc = gaudi2_set_fixed_properties(hdev);3110if (rc)3111return rc;31123113/* Check BAR sizes */3114pci_bar_size = pci_resource_len(pdev, SRAM_CFG_BAR_ID);31153116if (pci_bar_size != CFG_BAR_SIZE) {3117dev_err(hdev->dev, "Not " HL_NAME "? BAR %d size %pa, expecting %llu\n",3118SRAM_CFG_BAR_ID, &pci_bar_size, CFG_BAR_SIZE);3119rc = -ENODEV;3120goto free_queue_props;3121}31223123pci_bar_size = pci_resource_len(pdev, MSIX_BAR_ID);3124if (pci_bar_size != MSIX_BAR_SIZE) {3125dev_err(hdev->dev, "Not " HL_NAME "? BAR %d size %pa, expecting %llu\n",3126MSIX_BAR_ID, &pci_bar_size, MSIX_BAR_SIZE);3127rc = -ENODEV;3128goto free_queue_props;3129}31303131prop->dram_pci_bar_size = pci_resource_len(pdev, DRAM_BAR_ID);3132hdev->dram_pci_bar_start = pci_resource_start(pdev, DRAM_BAR_ID);31333134/*3135* Only in pldm driver config iATU3136*/3137if (hdev->pldm)3138hdev->asic_prop.iatu_done_by_fw = false;3139else3140hdev->asic_prop.iatu_done_by_fw = true;31413142rc = hl_pci_init(hdev);3143if (rc)3144goto free_queue_props;31453146/* Before continuing in the initialization, we need to read the preboot3147* version to determine whether we run with a security-enabled firmware3148*/3149rc = hl_fw_read_preboot_status(hdev);3150if (rc) {3151if (hdev->reset_on_preboot_fail)3152/* we are already on failure flow, so don't check if hw_fini fails. */3153hdev->asic_funcs->hw_fini(hdev, true, false);3154goto pci_fini;3155}31563157if (gaudi2_get_hw_state(hdev) == HL_DEVICE_HW_STATE_DIRTY) {3158dev_dbg(hdev->dev, "H/W state is dirty, must reset before initializing\n");3159rc = hdev->asic_funcs->hw_fini(hdev, true, false);3160if (rc) {3161dev_err(hdev->dev, "failed to reset HW in dirty state (%d)\n", rc);3162goto pci_fini;3163}3164}31653166return 0;31673168pci_fini:3169hl_pci_fini(hdev);3170free_queue_props:3171kfree(hdev->asic_prop.hw_queues_props);3172return rc;3173}31743175static int gaudi2_early_fini(struct hl_device *hdev)3176{3177kfree(hdev->asic_prop.hw_queues_props);3178hl_pci_fini(hdev);31793180return 0;3181}31823183static bool gaudi2_is_arc_nic_owned(u64 arc_id)3184{3185switch (arc_id) {3186case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:3187return true;3188default:3189return false;3190}3191}31923193static bool gaudi2_is_arc_tpc_owned(u64 arc_id)3194{3195switch (arc_id) {3196case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:3197return true;3198default:3199return false;3200}3201}32023203static void gaudi2_init_arcs(struct hl_device *hdev)3204{3205struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;3206struct gaudi2_device *gaudi2 = hdev->asic_specific;3207u64 arc_id;3208u32 i;32093210for (i = CPU_ID_SCHED_ARC0 ; i <= CPU_ID_SCHED_ARC3 ; i++) {3211if (gaudi2_is_arc_enabled(hdev, i))3212continue;32133214gaudi2_set_arc_id_cap(hdev, i);3215}32163217for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ ; i += 4) {3218if (!gaudi2_is_queue_enabled(hdev, i))3219continue;32203221arc_id = gaudi2_queue_id_to_arc_id[i];3222if (gaudi2_is_arc_enabled(hdev, arc_id))3223continue;32243225if (gaudi2_is_arc_nic_owned(arc_id) &&3226!(hdev->nic_ports_mask & BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0)))3227continue;32283229if (gaudi2_is_arc_tpc_owned(arc_id) && !(gaudi2->tpc_hw_cap_initialized &3230BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0)))3231continue;32323233gaudi2_set_arc_id_cap(hdev, arc_id);3234}32353236/* Fetch ARC scratchpad address */3237hdev->asic_prop.engine_core_interrupt_reg_addr =3238CFG_BASE + le32_to_cpu(dyn_regs->eng_arc_irq_ctrl);3239}32403241static int gaudi2_scrub_arc_dccm(struct hl_device *hdev, u32 cpu_id)3242{3243u32 reg_base, reg_val;3244int rc;32453246switch (cpu_id) {3247case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC3:3248/* Each ARC scheduler has 2 consecutive DCCM blocks */3249rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],3250ARC_DCCM_BLOCK_SIZE * 2, true);3251if (rc)3252return rc;3253break;3254case CPU_ID_SCHED_ARC4:3255case CPU_ID_SCHED_ARC5:3256case CPU_ID_MME_QMAN_ARC0:3257case CPU_ID_MME_QMAN_ARC1:3258reg_base = gaudi2_arc_blocks_bases[cpu_id];32593260/* Scrub lower DCCM block */3261rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],3262ARC_DCCM_BLOCK_SIZE, true);3263if (rc)3264return rc;32653266/* Switch to upper DCCM block */3267reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_MME_ARC_UPPER_DCCM_EN_VAL_MASK, 1);3268WREG32(reg_base + ARC_DCCM_UPPER_EN_OFFSET, reg_val);32693270/* Scrub upper DCCM block */3271rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],3272ARC_DCCM_BLOCK_SIZE, true);3273if (rc)3274return rc;32753276/* Switch to lower DCCM block */3277reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_MME_ARC_UPPER_DCCM_EN_VAL_MASK, 0);3278WREG32(reg_base + ARC_DCCM_UPPER_EN_OFFSET, reg_val);3279break;3280default:3281rc = gaudi2_send_job_to_kdma(hdev, 0, CFG_BASE + gaudi2_arc_dccm_bases[cpu_id],3282ARC_DCCM_BLOCK_SIZE, true);3283if (rc)3284return rc;3285}32863287return 0;3288}32893290static int gaudi2_scrub_arcs_dccm(struct hl_device *hdev)3291{3292u16 arc_id;3293int rc;32943295for (arc_id = CPU_ID_SCHED_ARC0 ; arc_id < CPU_ID_MAX ; arc_id++) {3296if (!gaudi2_is_arc_enabled(hdev, arc_id))3297continue;32983299rc = gaudi2_scrub_arc_dccm(hdev, arc_id);3300if (rc)3301return rc;3302}33033304return 0;3305}33063307static int gaudi2_late_init(struct hl_device *hdev)3308{3309struct gaudi2_device *gaudi2 = hdev->asic_specific;3310int rc;33113312rc = hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_ENABLE_PCI_ACCESS,3313gaudi2->virt_msix_db_dma_addr);3314if (rc)3315return rc;33163317rc = gaudi2_fetch_psoc_frequency(hdev);3318if (rc) {3319dev_err(hdev->dev, "Failed to fetch psoc frequency\n");3320goto disable_pci_access;3321}33223323rc = gaudi2_mmu_clear_pgt_range(hdev);3324if (rc) {3325dev_err(hdev->dev, "Failed to clear MMU page tables range\n");3326goto disable_pci_access;3327}33283329gaudi2_init_arcs(hdev);33303331rc = gaudi2_scrub_arcs_dccm(hdev);3332if (rc) {3333dev_err(hdev->dev, "Failed to scrub arcs DCCM\n");3334goto disable_pci_access;3335}33363337gaudi2_init_security(hdev);33383339return 0;33403341disable_pci_access:3342hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_DISABLE_PCI_ACCESS, 0x0);33433344return rc;3345}33463347static void gaudi2_late_fini(struct hl_device *hdev)3348{3349hl_hwmon_release_resources(hdev);3350}33513352static void gaudi2_user_mapped_dec_init(struct gaudi2_device *gaudi2, u32 start_idx)3353{3354struct user_mapped_block *blocks = gaudi2->mapped_blocks;33553356HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE0_DEC0_CMD_BASE, HL_BLOCK_SIZE);3357HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE0_DEC1_CMD_BASE, HL_BLOCK_SIZE);3358HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE1_DEC0_CMD_BASE, HL_BLOCK_SIZE);3359HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE1_DEC1_CMD_BASE, HL_BLOCK_SIZE);3360HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE2_DEC0_CMD_BASE, HL_BLOCK_SIZE);3361HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE2_DEC1_CMD_BASE, HL_BLOCK_SIZE);3362HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE3_DEC0_CMD_BASE, HL_BLOCK_SIZE);3363HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmDCORE3_DEC1_CMD_BASE, HL_BLOCK_SIZE);3364HL_USR_MAPPED_BLK_INIT(&blocks[start_idx++], mmPCIE_DEC0_CMD_BASE, HL_BLOCK_SIZE);3365HL_USR_MAPPED_BLK_INIT(&blocks[start_idx], mmPCIE_DEC1_CMD_BASE, HL_BLOCK_SIZE);3366}33673368static void gaudi2_user_mapped_blocks_init(struct hl_device *hdev)3369{3370struct gaudi2_device *gaudi2 = hdev->asic_specific;3371struct user_mapped_block *blocks = gaudi2->mapped_blocks;3372u32 block_size, umr_start_idx, num_umr_blocks;3373int i;33743375for (i = 0 ; i < NUM_ARC_CPUS ; i++) {3376if (i >= CPU_ID_SCHED_ARC0 && i <= CPU_ID_SCHED_ARC3)3377block_size = ARC_DCCM_BLOCK_SIZE * 2;3378else3379block_size = ARC_DCCM_BLOCK_SIZE;33803381blocks[i].address = gaudi2_arc_dccm_bases[i];3382blocks[i].size = block_size;3383}33843385blocks[NUM_ARC_CPUS].address = mmARC_FARM_ARC0_ACP_ENG_BASE;3386blocks[NUM_ARC_CPUS].size = HL_BLOCK_SIZE;33873388blocks[NUM_ARC_CPUS + 1].address = mmARC_FARM_ARC1_ACP_ENG_BASE;3389blocks[NUM_ARC_CPUS + 1].size = HL_BLOCK_SIZE;33903391blocks[NUM_ARC_CPUS + 2].address = mmARC_FARM_ARC2_ACP_ENG_BASE;3392blocks[NUM_ARC_CPUS + 2].size = HL_BLOCK_SIZE;33933394blocks[NUM_ARC_CPUS + 3].address = mmARC_FARM_ARC3_ACP_ENG_BASE;3395blocks[NUM_ARC_CPUS + 3].size = HL_BLOCK_SIZE;33963397blocks[NUM_ARC_CPUS + 4].address = mmDCORE0_MME_QM_ARC_ACP_ENG_BASE;3398blocks[NUM_ARC_CPUS + 4].size = HL_BLOCK_SIZE;33993400blocks[NUM_ARC_CPUS + 5].address = mmDCORE1_MME_QM_ARC_ACP_ENG_BASE;3401blocks[NUM_ARC_CPUS + 5].size = HL_BLOCK_SIZE;34023403blocks[NUM_ARC_CPUS + 6].address = mmDCORE2_MME_QM_ARC_ACP_ENG_BASE;3404blocks[NUM_ARC_CPUS + 6].size = HL_BLOCK_SIZE;34053406blocks[NUM_ARC_CPUS + 7].address = mmDCORE3_MME_QM_ARC_ACP_ENG_BASE;3407blocks[NUM_ARC_CPUS + 7].size = HL_BLOCK_SIZE;34083409umr_start_idx = NUM_ARC_CPUS + NUM_OF_USER_ACP_BLOCKS;3410num_umr_blocks = NIC_NUMBER_OF_ENGINES * NUM_OF_USER_NIC_UMR_BLOCKS;3411for (i = 0 ; i < num_umr_blocks ; i++) {3412u8 nic_id, umr_block_id;34133414nic_id = i / NUM_OF_USER_NIC_UMR_BLOCKS;3415umr_block_id = i % NUM_OF_USER_NIC_UMR_BLOCKS;34163417blocks[umr_start_idx + i].address =3418mmNIC0_UMR0_0_UNSECURE_DOORBELL0_BASE +3419(nic_id / NIC_NUMBER_OF_QM_PER_MACRO) * NIC_OFFSET +3420(nic_id % NIC_NUMBER_OF_QM_PER_MACRO) * NIC_QM_OFFSET +3421umr_block_id * NIC_UMR_OFFSET;3422blocks[umr_start_idx + i].size = HL_BLOCK_SIZE;3423}34243425/* Expose decoder HW configuration block to user */3426gaudi2_user_mapped_dec_init(gaudi2, USR_MAPPED_BLK_DEC_START_IDX);34273428for (i = 1; i < NUM_OF_DCORES; ++i) {3429blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1)].size = SM_OBJS_BLOCK_SIZE;3430blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1) + 1].size = HL_BLOCK_SIZE;34313432blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1)].address =3433mmDCORE0_SYNC_MNGR_OBJS_BASE + i * DCORE_OFFSET;34343435blocks[USR_MAPPED_BLK_SM_START_IDX + 2 * (i - 1) + 1].address =3436mmDCORE0_SYNC_MNGR_GLBL_BASE + i * DCORE_OFFSET;3437}3438}34393440static int gaudi2_alloc_cpu_accessible_dma_mem(struct hl_device *hdev)3441{3442dma_addr_t dma_addr_arr[GAUDI2_ALLOC_CPU_MEM_RETRY_CNT] = {}, end_addr;3443void *virt_addr_arr[GAUDI2_ALLOC_CPU_MEM_RETRY_CNT] = {};3444int i, j, rc = 0;34453446/* The device ARC works with 32-bits addresses, and because there is a single HW register3447* that holds the extension bits (49..28), these bits must be identical in all the allocated3448* range.3449*/34503451for (i = 0 ; i < GAUDI2_ALLOC_CPU_MEM_RETRY_CNT ; i++) {3452virt_addr_arr[i] = hl_asic_dma_alloc_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE,3453&dma_addr_arr[i], GFP_KERNEL | __GFP_ZERO);3454if (!virt_addr_arr[i]) {3455rc = -ENOMEM;3456goto free_dma_mem_arr;3457}34583459end_addr = dma_addr_arr[i] + HL_CPU_ACCESSIBLE_MEM_SIZE - 1;3460if (GAUDI2_ARC_PCI_MSB_ADDR(dma_addr_arr[i]) == GAUDI2_ARC_PCI_MSB_ADDR(end_addr))3461break;3462}34633464if (i == GAUDI2_ALLOC_CPU_MEM_RETRY_CNT) {3465dev_err(hdev->dev,3466"MSB of ARC accessible DMA memory are not identical in all range\n");3467rc = -EFAULT;3468goto free_dma_mem_arr;3469}34703471hdev->cpu_accessible_dma_mem = virt_addr_arr[i];3472hdev->cpu_accessible_dma_address = dma_addr_arr[i];34733474free_dma_mem_arr:3475for (j = 0 ; j < i ; j++)3476hl_asic_dma_free_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE, virt_addr_arr[j],3477dma_addr_arr[j]);34783479return rc;3480}34813482static void gaudi2_set_pci_memory_regions(struct hl_device *hdev)3483{3484struct asic_fixed_properties *prop = &hdev->asic_prop;3485struct pci_mem_region *region;34863487/* CFG */3488region = &hdev->pci_mem_region[PCI_REGION_CFG];3489region->region_base = CFG_BASE;3490region->region_size = CFG_SIZE;3491region->offset_in_bar = CFG_BASE - STM_FLASH_BASE_ADDR;3492region->bar_size = CFG_BAR_SIZE;3493region->bar_id = SRAM_CFG_BAR_ID;3494region->used = 1;34953496/* SRAM */3497region = &hdev->pci_mem_region[PCI_REGION_SRAM];3498region->region_base = SRAM_BASE_ADDR;3499region->region_size = SRAM_SIZE;3500region->offset_in_bar = CFG_REGION_SIZE + BAR0_RSRVD_SIZE;3501region->bar_size = CFG_BAR_SIZE;3502region->bar_id = SRAM_CFG_BAR_ID;3503region->used = 1;35043505/* DRAM */3506region = &hdev->pci_mem_region[PCI_REGION_DRAM];3507region->region_base = DRAM_PHYS_BASE;3508region->region_size = hdev->asic_prop.dram_size;3509region->offset_in_bar = 0;3510region->bar_size = prop->dram_pci_bar_size;3511region->bar_id = DRAM_BAR_ID;3512region->used = 1;3513}35143515static void gaudi2_user_interrupt_setup(struct hl_device *hdev)3516{3517struct asic_fixed_properties *prop = &hdev->asic_prop;3518int i, j, k;35193520/* Initialize TPC interrupt */3521HL_USR_INTR_STRUCT_INIT(hdev->tpc_interrupt, hdev, 0, HL_USR_INTERRUPT_TPC);35223523/* Initialize unexpected error interrupt */3524HL_USR_INTR_STRUCT_INIT(hdev->unexpected_error_interrupt, hdev, 0,3525HL_USR_INTERRUPT_UNEXPECTED);35263527/* Initialize common user CQ interrupt */3528HL_USR_INTR_STRUCT_INIT(hdev->common_user_cq_interrupt, hdev,3529HL_COMMON_USER_CQ_INTERRUPT_ID, HL_USR_INTERRUPT_CQ);35303531/* Initialize common decoder interrupt */3532HL_USR_INTR_STRUCT_INIT(hdev->common_decoder_interrupt, hdev,3533HL_COMMON_DEC_INTERRUPT_ID, HL_USR_INTERRUPT_DECODER);35343535/* User interrupts structure holds both decoder and user interrupts from various engines.3536* We first initialize the decoder interrupts and then we add the user interrupts.3537* The only limitation is that the last decoder interrupt id must be smaller3538* then GAUDI2_IRQ_NUM_USER_FIRST. This is checked at compilation time.3539*/35403541/* Initialize decoder interrupts, expose only normal interrupts,3542* error interrupts to be handled by driver3543*/3544for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM, j = 0 ; i <= GAUDI2_IRQ_NUM_SHARED_DEC1_NRM;3545i += 2, j++)3546HL_USR_INTR_STRUCT_INIT(hdev->user_interrupt[j], hdev, i,3547HL_USR_INTERRUPT_DECODER);35483549for (i = GAUDI2_IRQ_NUM_USER_FIRST, k = 0 ; k < prop->user_interrupt_count; i++, j++, k++)3550HL_USR_INTR_STRUCT_INIT(hdev->user_interrupt[j], hdev, i, HL_USR_INTERRUPT_CQ);3551}35523553static inline int gaudi2_get_non_zero_random_int(void)3554{3555int rand = get_random_u32();35563557return rand ? rand : 1;3558}35593560static void gaudi2_special_blocks_free(struct hl_device *hdev)3561{3562struct asic_fixed_properties *prop = &hdev->asic_prop;3563struct hl_skip_blocks_cfg *skip_special_blocks_cfg =3564&prop->skip_special_blocks_cfg;35653566kfree(prop->special_blocks);3567kfree(skip_special_blocks_cfg->block_types);3568kfree(skip_special_blocks_cfg->block_ranges);3569}35703571static void gaudi2_special_blocks_iterator_free(struct hl_device *hdev)3572{3573gaudi2_special_blocks_free(hdev);3574}35753576static bool gaudi2_special_block_skip(struct hl_device *hdev,3577struct hl_special_blocks_cfg *special_blocks_cfg,3578u32 blk_idx, u32 major, u32 minor, u32 sub_minor)3579{3580return false;3581}35823583static int gaudi2_special_blocks_config(struct hl_device *hdev)3584{3585struct asic_fixed_properties *prop = &hdev->asic_prop;3586int i, rc;35873588/* Configure Special blocks */3589prop->glbl_err_max_cause_num = GAUDI2_GLBL_ERR_MAX_CAUSE_NUM;3590prop->num_of_special_blocks = ARRAY_SIZE(gaudi2_special_blocks);3591prop->special_blocks = kmalloc_array(prop->num_of_special_blocks,3592sizeof(*prop->special_blocks), GFP_KERNEL);3593if (!prop->special_blocks)3594return -ENOMEM;35953596for (i = 0 ; i < prop->num_of_special_blocks ; i++)3597memcpy(&prop->special_blocks[i], &gaudi2_special_blocks[i],3598sizeof(*prop->special_blocks));35993600/* Configure when to skip Special blocks */3601memset(&prop->skip_special_blocks_cfg, 0, sizeof(prop->skip_special_blocks_cfg));3602prop->skip_special_blocks_cfg.skip_block_hook = gaudi2_special_block_skip;36033604if (ARRAY_SIZE(gaudi2_iterator_skip_block_types)) {3605prop->skip_special_blocks_cfg.block_types =3606kmalloc_array(ARRAY_SIZE(gaudi2_iterator_skip_block_types),3607sizeof(gaudi2_iterator_skip_block_types[0]), GFP_KERNEL);3608if (!prop->skip_special_blocks_cfg.block_types) {3609rc = -ENOMEM;3610goto free_special_blocks;3611}36123613memcpy(prop->skip_special_blocks_cfg.block_types, gaudi2_iterator_skip_block_types,3614sizeof(gaudi2_iterator_skip_block_types));36153616prop->skip_special_blocks_cfg.block_types_len =3617ARRAY_SIZE(gaudi2_iterator_skip_block_types);3618}36193620if (ARRAY_SIZE(gaudi2_iterator_skip_block_ranges)) {3621prop->skip_special_blocks_cfg.block_ranges =3622kmalloc_array(ARRAY_SIZE(gaudi2_iterator_skip_block_ranges),3623sizeof(gaudi2_iterator_skip_block_ranges[0]), GFP_KERNEL);3624if (!prop->skip_special_blocks_cfg.block_ranges) {3625rc = -ENOMEM;3626goto free_skip_special_blocks_types;3627}36283629for (i = 0 ; i < ARRAY_SIZE(gaudi2_iterator_skip_block_ranges) ; i++)3630memcpy(&prop->skip_special_blocks_cfg.block_ranges[i],3631&gaudi2_iterator_skip_block_ranges[i],3632sizeof(struct range));36333634prop->skip_special_blocks_cfg.block_ranges_len =3635ARRAY_SIZE(gaudi2_iterator_skip_block_ranges);3636}36373638return 0;36393640free_skip_special_blocks_types:3641kfree(prop->skip_special_blocks_cfg.block_types);3642free_special_blocks:3643kfree(prop->special_blocks);36443645return rc;3646}36473648static int gaudi2_special_blocks_iterator_config(struct hl_device *hdev)3649{3650return gaudi2_special_blocks_config(hdev);3651}36523653static void gaudi2_test_queues_msgs_free(struct hl_device *hdev)3654{3655struct gaudi2_device *gaudi2 = hdev->asic_specific;3656struct gaudi2_queues_test_info *msg_info = gaudi2->queues_test_info;3657int i;36583659for (i = 0 ; i < GAUDI2_NUM_TESTED_QS ; i++) {3660/* bail-out if this is an allocation failure point */3661if (!msg_info[i].kern_addr)3662break;36633664hl_asic_dma_pool_free(hdev, msg_info[i].kern_addr, msg_info[i].dma_addr);3665msg_info[i].kern_addr = NULL;3666}3667}36683669static int gaudi2_test_queues_msgs_alloc(struct hl_device *hdev)3670{3671struct gaudi2_device *gaudi2 = hdev->asic_specific;3672struct gaudi2_queues_test_info *msg_info = gaudi2->queues_test_info;3673int i, rc;36743675/* allocate a message-short buf for each Q we intend to test */3676for (i = 0 ; i < GAUDI2_NUM_TESTED_QS ; i++) {3677msg_info[i].kern_addr =3678(void *)hl_asic_dma_pool_zalloc(hdev, sizeof(struct packet_msg_short),3679GFP_KERNEL, &msg_info[i].dma_addr);3680if (!msg_info[i].kern_addr) {3681dev_err(hdev->dev,3682"Failed to allocate dma memory for H/W queue %d testing\n", i);3683rc = -ENOMEM;3684goto err_exit;3685}3686}36873688return 0;36893690err_exit:3691gaudi2_test_queues_msgs_free(hdev);3692return rc;3693}36943695static int gaudi2_sw_init(struct hl_device *hdev)3696{3697struct asic_fixed_properties *prop = &hdev->asic_prop;3698struct gaudi2_device *gaudi2;3699int i, rc;37003701/* Allocate device structure */3702gaudi2 = kzalloc(sizeof(*gaudi2), GFP_KERNEL);3703if (!gaudi2)3704return -ENOMEM;37053706for (i = 0 ; i < ARRAY_SIZE(gaudi2_irq_map_table) ; i++) {3707if (gaudi2_irq_map_table[i].msg || !gaudi2_irq_map_table[i].valid)3708continue;37093710if (gaudi2->num_of_valid_hw_events == GAUDI2_EVENT_SIZE) {3711dev_err(hdev->dev, "H/W events array exceeds the limit of %u events\n",3712GAUDI2_EVENT_SIZE);3713rc = -EINVAL;3714goto free_gaudi2_device;3715}37163717gaudi2->hw_events[gaudi2->num_of_valid_hw_events++] = gaudi2_irq_map_table[i].fc_id;3718}37193720for (i = 0 ; i < MME_NUM_OF_LFSR_SEEDS ; i++)3721gaudi2->lfsr_rand_seeds[i] = gaudi2_get_non_zero_random_int();37223723gaudi2->cpucp_info_get = gaudi2_cpucp_info_get;37243725hdev->asic_specific = gaudi2;37263727/* Create DMA pool for small allocations.3728* Use DEVICE_CACHE_LINE_SIZE for alignment since the NIC memory-mapped3729* PI/CI registers allocated from this pool have this restriction3730*/3731hdev->dma_pool = dma_pool_create(dev_name(hdev->dev), &hdev->pdev->dev,3732GAUDI2_DMA_POOL_BLK_SIZE, DEVICE_CACHE_LINE_SIZE, 0);3733if (!hdev->dma_pool) {3734dev_err(hdev->dev, "failed to create DMA pool\n");3735rc = -ENOMEM;3736goto free_gaudi2_device;3737}37383739rc = gaudi2_alloc_cpu_accessible_dma_mem(hdev);3740if (rc)3741goto free_dma_pool;37423743hdev->cpu_accessible_dma_pool = gen_pool_create(ilog2(32), -1);3744if (!hdev->cpu_accessible_dma_pool) {3745dev_err(hdev->dev, "Failed to create CPU accessible DMA pool\n");3746rc = -ENOMEM;3747goto free_cpu_dma_mem;3748}37493750rc = gen_pool_add(hdev->cpu_accessible_dma_pool, (uintptr_t) hdev->cpu_accessible_dma_mem,3751HL_CPU_ACCESSIBLE_MEM_SIZE, -1);3752if (rc) {3753dev_err(hdev->dev, "Failed to add memory to CPU accessible DMA pool\n");3754rc = -EFAULT;3755goto free_cpu_accessible_dma_pool;3756}37573758gaudi2->virt_msix_db_cpu_addr = hl_cpu_accessible_dma_pool_alloc(hdev, prop->pmmu.page_size,3759&gaudi2->virt_msix_db_dma_addr);3760if (!gaudi2->virt_msix_db_cpu_addr) {3761dev_err(hdev->dev, "Failed to allocate DMA memory for virtual MSI-X doorbell\n");3762rc = -ENOMEM;3763goto free_cpu_accessible_dma_pool;3764}37653766spin_lock_init(&gaudi2->hw_queues_lock);37673768gaudi2->scratchpad_bus_address = prop->mmu_pgt_addr + HMMU_PAGE_TABLES_SIZE + EDMA_PQS_SIZE;37693770gaudi2_user_mapped_blocks_init(hdev);37713772/* Initialize user interrupts */3773gaudi2_user_interrupt_setup(hdev);37743775hdev->supports_coresight = true;3776hdev->supports_sync_stream = true;3777hdev->supports_cb_mapping = true;3778hdev->supports_wait_for_multi_cs = false;37793780prop->supports_compute_reset = true;37813782/* Event queue sanity check added in FW version 1.11 */3783if (hl_fw_version_cmp(hdev, 1, 11, 0) < 0)3784hdev->event_queue.check_eqe_index = false;3785else3786hdev->event_queue.check_eqe_index = true;37873788hdev->asic_funcs->set_pci_memory_regions(hdev);37893790rc = gaudi2_special_blocks_iterator_config(hdev);3791if (rc)3792goto free_virt_msix_db_mem;37933794rc = gaudi2_test_queues_msgs_alloc(hdev);3795if (rc)3796goto special_blocks_free;37973798hdev->heartbeat_debug_info.cpu_queue_id = GAUDI2_QUEUE_ID_CPU_PQ;37993800return 0;38013802special_blocks_free:3803gaudi2_special_blocks_iterator_free(hdev);3804free_virt_msix_db_mem:3805hl_cpu_accessible_dma_pool_free(hdev, prop->pmmu.page_size, gaudi2->virt_msix_db_cpu_addr);3806free_cpu_accessible_dma_pool:3807gen_pool_destroy(hdev->cpu_accessible_dma_pool);3808free_cpu_dma_mem:3809hl_asic_dma_free_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE, hdev->cpu_accessible_dma_mem,3810hdev->cpu_accessible_dma_address);3811free_dma_pool:3812dma_pool_destroy(hdev->dma_pool);3813free_gaudi2_device:3814kfree(gaudi2);3815return rc;3816}38173818static int gaudi2_sw_fini(struct hl_device *hdev)3819{3820struct asic_fixed_properties *prop = &hdev->asic_prop;3821struct gaudi2_device *gaudi2 = hdev->asic_specific;38223823gaudi2_test_queues_msgs_free(hdev);38243825gaudi2_special_blocks_iterator_free(hdev);38263827hl_cpu_accessible_dma_pool_free(hdev, prop->pmmu.page_size, gaudi2->virt_msix_db_cpu_addr);38283829gen_pool_destroy(hdev->cpu_accessible_dma_pool);38303831hl_asic_dma_free_coherent(hdev, HL_CPU_ACCESSIBLE_MEM_SIZE, hdev->cpu_accessible_dma_mem,3832hdev->cpu_accessible_dma_address);38333834dma_pool_destroy(hdev->dma_pool);38353836kfree(gaudi2);38373838return 0;3839}38403841static void gaudi2_stop_qman_common(struct hl_device *hdev, u32 reg_base)3842{3843WREG32(reg_base + QM_GLBL_CFG1_OFFSET, QM_GLBL_CFG1_PQF_STOP |3844QM_GLBL_CFG1_CQF_STOP |3845QM_GLBL_CFG1_CP_STOP);38463847/* stop also the ARC */3848WREG32(reg_base + QM_GLBL_CFG2_OFFSET, QM_GLBL_CFG2_ARC_CQF_STOP);3849}38503851static void gaudi2_flush_qman_common(struct hl_device *hdev, u32 reg_base)3852{3853WREG32(reg_base + QM_GLBL_CFG1_OFFSET, QM_GLBL_CFG1_PQF_FLUSH |3854QM_GLBL_CFG1_CQF_FLUSH |3855QM_GLBL_CFG1_CP_FLUSH);3856}38573858static void gaudi2_flush_qman_arc_common(struct hl_device *hdev, u32 reg_base)3859{3860WREG32(reg_base + QM_GLBL_CFG2_OFFSET, QM_GLBL_CFG2_ARC_CQF_FLUSH);3861}38623863/**3864* gaudi2_clear_qm_fence_counters_common - clear QM's fence counters3865*3866* @hdev: pointer to the habanalabs device structure3867* @queue_id: queue to clear fence counters to3868* @skip_fence: if true set maximum fence value to all fence counters to avoid3869* getting stuck on any fence value. otherwise set all fence3870* counters to 0 (standard clear of fence counters)3871*/3872static void gaudi2_clear_qm_fence_counters_common(struct hl_device *hdev, u32 queue_id,3873bool skip_fence)3874{3875u32 size, reg_base;3876u32 addr, val;38773878reg_base = gaudi2_qm_blocks_bases[queue_id];38793880addr = reg_base + QM_CP_FENCE0_CNT_0_OFFSET;3881size = mmPDMA0_QM_CP_BARRIER_CFG - mmPDMA0_QM_CP_FENCE0_CNT_0;38823883/*3884* in case we want to make sure that QM that is stuck on a fence will3885* be released we should set the fence counter to a higher value that3886* the value the QM waiting for. to comply with any fence counter of3887* any value we set maximum fence value to all counters3888*/3889val = skip_fence ? U32_MAX : 0;3890gaudi2_memset_device_lbw(hdev, addr, size, val);3891}38923893static void gaudi2_qman_manual_flush_common(struct hl_device *hdev, u32 queue_id)3894{3895u32 reg_base = gaudi2_qm_blocks_bases[queue_id];38963897gaudi2_clear_qm_fence_counters_common(hdev, queue_id, true);3898gaudi2_flush_qman_common(hdev, reg_base);3899gaudi2_flush_qman_arc_common(hdev, reg_base);3900}39013902static void gaudi2_stop_dma_qmans(struct hl_device *hdev)3903{3904struct gaudi2_device *gaudi2 = hdev->asic_specific;3905int dcore, inst;39063907if (!(gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK))3908goto stop_edma_qmans;39093910/* Stop CPs of PDMA QMANs */3911gaudi2_stop_qman_common(hdev, mmPDMA0_QM_BASE);3912gaudi2_stop_qman_common(hdev, mmPDMA1_QM_BASE);39133914stop_edma_qmans:3915if (!(gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK))3916return;39173918for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {3919for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {3920u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;3921u32 qm_base;39223923if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_EDMA_SHIFT + seq)))3924continue;39253926qm_base = mmDCORE0_EDMA0_QM_BASE + dcore * DCORE_OFFSET +3927inst * DCORE_EDMA_OFFSET;39283929/* Stop CPs of EDMA QMANs */3930gaudi2_stop_qman_common(hdev, qm_base);3931}3932}3933}39343935static void gaudi2_stop_mme_qmans(struct hl_device *hdev)3936{3937struct gaudi2_device *gaudi2 = hdev->asic_specific;3938u32 offset, i;39393940offset = mmDCORE1_MME_QM_BASE - mmDCORE0_MME_QM_BASE;39413942for (i = 0 ; i < NUM_OF_DCORES ; i++) {3943if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_MME_SHIFT + i)))3944continue;39453946gaudi2_stop_qman_common(hdev, mmDCORE0_MME_QM_BASE + (i * offset));3947}3948}39493950static void gaudi2_stop_tpc_qmans(struct hl_device *hdev)3951{3952struct gaudi2_device *gaudi2 = hdev->asic_specific;3953u32 reg_base;3954int i;39553956if (!(gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK))3957return;39583959for (i = 0 ; i < TPC_ID_SIZE ; i++) {3960if (!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(HW_CAP_TPC_SHIFT + i)))3961continue;39623963reg_base = gaudi2_qm_blocks_bases[gaudi2_tpc_id_to_queue_id[i]];3964gaudi2_stop_qman_common(hdev, reg_base);3965}3966}39673968static void gaudi2_stop_rot_qmans(struct hl_device *hdev)3969{3970struct gaudi2_device *gaudi2 = hdev->asic_specific;3971u32 reg_base;3972int i;39733974if (!(gaudi2->hw_cap_initialized & HW_CAP_ROT_MASK))3975return;39763977for (i = 0 ; i < ROTATOR_ID_SIZE ; i++) {3978if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_ROT_SHIFT + i)))3979continue;39803981reg_base = gaudi2_qm_blocks_bases[gaudi2_rot_id_to_queue_id[i]];3982gaudi2_stop_qman_common(hdev, reg_base);3983}3984}39853986static void gaudi2_stop_nic_qmans(struct hl_device *hdev)3987{3988struct gaudi2_device *gaudi2 = hdev->asic_specific;3989u32 reg_base, queue_id;3990int i;39913992if (!(gaudi2->nic_hw_cap_initialized & HW_CAP_NIC_MASK))3993return;39943995queue_id = GAUDI2_QUEUE_ID_NIC_0_0;39963997for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++, queue_id += NUM_OF_PQ_PER_QMAN) {3998if (!(hdev->nic_ports_mask & BIT(i)))3999continue;40004001reg_base = gaudi2_qm_blocks_bases[queue_id];4002gaudi2_stop_qman_common(hdev, reg_base);4003}4004}40054006static void gaudi2_stall_dma_common(struct hl_device *hdev, u32 reg_base)4007{4008u32 reg_val;40094010reg_val = FIELD_PREP(PDMA0_CORE_CFG_1_HALT_MASK, 0x1);4011WREG32(reg_base + DMA_CORE_CFG_1_OFFSET, reg_val);4012}40134014static void gaudi2_dma_stall(struct hl_device *hdev)4015{4016struct gaudi2_device *gaudi2 = hdev->asic_specific;4017int dcore, inst;40184019if (!(gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK))4020goto stall_edma;40214022gaudi2_stall_dma_common(hdev, mmPDMA0_CORE_BASE);4023gaudi2_stall_dma_common(hdev, mmPDMA1_CORE_BASE);40244025stall_edma:4026if (!(gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK))4027return;40284029for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {4030for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {4031u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;4032u32 core_base;40334034if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_EDMA_SHIFT + seq)))4035continue;40364037core_base = mmDCORE0_EDMA0_CORE_BASE + dcore * DCORE_OFFSET +4038inst * DCORE_EDMA_OFFSET;40394040/* Stall CPs of EDMA QMANs */4041gaudi2_stall_dma_common(hdev, core_base);4042}4043}4044}40454046static void gaudi2_mme_stall(struct hl_device *hdev)4047{4048struct gaudi2_device *gaudi2 = hdev->asic_specific;4049u32 offset, i;40504051offset = mmDCORE1_MME_CTRL_LO_QM_STALL - mmDCORE0_MME_CTRL_LO_QM_STALL;40524053for (i = 0 ; i < NUM_OF_DCORES ; i++)4054if (gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_MME_SHIFT + i))4055WREG32(mmDCORE0_MME_CTRL_LO_QM_STALL + (i * offset), 1);4056}40574058static void gaudi2_tpc_stall(struct hl_device *hdev)4059{4060struct gaudi2_device *gaudi2 = hdev->asic_specific;4061u32 reg_base;4062int i;40634064if (!(gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK))4065return;40664067for (i = 0 ; i < TPC_ID_SIZE ; i++) {4068if (!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(HW_CAP_TPC_SHIFT + i)))4069continue;40704071reg_base = gaudi2_tpc_cfg_blocks_bases[i];4072WREG32(reg_base + TPC_CFG_STALL_OFFSET, 1);4073}4074}40754076static void gaudi2_rotator_stall(struct hl_device *hdev)4077{4078struct gaudi2_device *gaudi2 = hdev->asic_specific;4079u32 reg_val;4080int i;40814082if (!(gaudi2->hw_cap_initialized & HW_CAP_ROT_MASK))4083return;40844085reg_val = FIELD_PREP(ROT_MSS_HALT_WBC_MASK, 0x1) |4086FIELD_PREP(ROT_MSS_HALT_RSB_MASK, 0x1) |4087FIELD_PREP(ROT_MSS_HALT_MRSB_MASK, 0x1);40884089for (i = 0 ; i < ROTATOR_ID_SIZE ; i++) {4090if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_ROT_SHIFT + i)))4091continue;40924093WREG32(mmROT0_MSS_HALT + i * ROT_OFFSET, reg_val);4094}4095}40964097static void gaudi2_disable_qman_common(struct hl_device *hdev, u32 reg_base)4098{4099WREG32(reg_base + QM_GLBL_CFG0_OFFSET, 0);4100}41014102static void gaudi2_disable_dma_qmans(struct hl_device *hdev)4103{4104struct gaudi2_device *gaudi2 = hdev->asic_specific;4105int dcore, inst;41064107if (!(gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK))4108goto stop_edma_qmans;41094110gaudi2_disable_qman_common(hdev, mmPDMA0_QM_BASE);4111gaudi2_disable_qman_common(hdev, mmPDMA1_QM_BASE);41124113stop_edma_qmans:4114if (!(gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK))4115return;41164117for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {4118for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {4119u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;4120u32 qm_base;41214122if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_EDMA_SHIFT + seq)))4123continue;41244125qm_base = mmDCORE0_EDMA0_QM_BASE + dcore * DCORE_OFFSET +4126inst * DCORE_EDMA_OFFSET;41274128/* Disable CPs of EDMA QMANs */4129gaudi2_disable_qman_common(hdev, qm_base);4130}4131}4132}41334134static void gaudi2_disable_mme_qmans(struct hl_device *hdev)4135{4136struct gaudi2_device *gaudi2 = hdev->asic_specific;4137u32 offset, i;41384139offset = mmDCORE1_MME_QM_BASE - mmDCORE0_MME_QM_BASE;41404141for (i = 0 ; i < NUM_OF_DCORES ; i++)4142if (gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_MME_SHIFT + i))4143gaudi2_disable_qman_common(hdev, mmDCORE0_MME_QM_BASE + (i * offset));4144}41454146static void gaudi2_disable_tpc_qmans(struct hl_device *hdev)4147{4148struct gaudi2_device *gaudi2 = hdev->asic_specific;4149u32 reg_base;4150int i;41514152if (!(gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK))4153return;41544155for (i = 0 ; i < TPC_ID_SIZE ; i++) {4156if (!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(HW_CAP_TPC_SHIFT + i)))4157continue;41584159reg_base = gaudi2_qm_blocks_bases[gaudi2_tpc_id_to_queue_id[i]];4160gaudi2_disable_qman_common(hdev, reg_base);4161}4162}41634164static void gaudi2_disable_rot_qmans(struct hl_device *hdev)4165{4166struct gaudi2_device *gaudi2 = hdev->asic_specific;4167u32 reg_base;4168int i;41694170if (!(gaudi2->hw_cap_initialized & HW_CAP_ROT_MASK))4171return;41724173for (i = 0 ; i < ROTATOR_ID_SIZE ; i++) {4174if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_ROT_SHIFT + i)))4175continue;41764177reg_base = gaudi2_qm_blocks_bases[gaudi2_rot_id_to_queue_id[i]];4178gaudi2_disable_qman_common(hdev, reg_base);4179}4180}41814182static void gaudi2_disable_nic_qmans(struct hl_device *hdev)4183{4184struct gaudi2_device *gaudi2 = hdev->asic_specific;4185u32 reg_base, queue_id;4186int i;41874188if (!(gaudi2->nic_hw_cap_initialized & HW_CAP_NIC_MASK))4189return;41904191queue_id = GAUDI2_QUEUE_ID_NIC_0_0;41924193for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++, queue_id += NUM_OF_PQ_PER_QMAN) {4194if (!(hdev->nic_ports_mask & BIT(i)))4195continue;41964197reg_base = gaudi2_qm_blocks_bases[queue_id];4198gaudi2_disable_qman_common(hdev, reg_base);4199}4200}42014202static void gaudi2_enable_timestamp(struct hl_device *hdev)4203{4204/* Disable the timestamp counter */4205WREG32(mmPSOC_TIMESTAMP_BASE, 0);42064207/* Zero the lower/upper parts of the 64-bit counter */4208WREG32(mmPSOC_TIMESTAMP_BASE + 0xC, 0);4209WREG32(mmPSOC_TIMESTAMP_BASE + 0x8, 0);42104211/* Enable the counter */4212WREG32(mmPSOC_TIMESTAMP_BASE, 1);4213}42144215static void gaudi2_disable_timestamp(struct hl_device *hdev)4216{4217/* Disable the timestamp counter */4218WREG32(mmPSOC_TIMESTAMP_BASE, 0);4219}42204221static const char *gaudi2_irq_name(u16 irq_number)4222{4223switch (irq_number) {4224case GAUDI2_IRQ_NUM_EVENT_QUEUE:4225return "gaudi2 cpu eq";4226case GAUDI2_IRQ_NUM_COMPLETION:4227return "gaudi2 completion";4228case GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM ... GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM:4229return gaudi2_vdec_irq_name[irq_number - GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM];4230case GAUDI2_IRQ_NUM_TPC_ASSERT:4231return "gaudi2 tpc assert";4232case GAUDI2_IRQ_NUM_UNEXPECTED_ERROR:4233return "gaudi2 unexpected error";4234case GAUDI2_IRQ_NUM_USER_FIRST ... GAUDI2_IRQ_NUM_USER_LAST:4235return "gaudi2 user completion";4236case GAUDI2_IRQ_NUM_EQ_ERROR:4237return "gaudi2 eq error";4238default:4239return "invalid";4240}4241}42424243static void gaudi2_dec_disable_msix(struct hl_device *hdev, u32 max_irq_num)4244{4245int i, irq, relative_idx;4246struct hl_dec *dec;42474248for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM ; i < max_irq_num ; i++) {4249irq = pci_irq_vector(hdev->pdev, i);4250relative_idx = i - GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM;42514252dec = hdev->dec + relative_idx / 2;42534254/* We pass different structures depending on the irq handler. For the abnormal4255* interrupt we pass hl_dec and for the regular interrupt we pass the relevant4256* user_interrupt entry4257*/4258free_irq(irq, ((relative_idx % 2) ?4259(void *) dec :4260(void *) &hdev->user_interrupt[dec->core_id]));4261}4262}42634264static int gaudi2_dec_enable_msix(struct hl_device *hdev)4265{4266int rc, i, irq_init_cnt, irq, relative_idx;4267struct hl_dec *dec;42684269for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM, irq_init_cnt = 0;4270i <= GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM;4271i++, irq_init_cnt++) {42724273irq = pci_irq_vector(hdev->pdev, i);4274relative_idx = i - GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM;42754276/* We pass different structures depending on the irq handler. For the abnormal4277* interrupt we pass hl_dec and for the regular interrupt we pass the relevant4278* user_interrupt entry4279*4280* TODO: change the dec abnrm to threaded irq4281*/42824283dec = hdev->dec + relative_idx / 2;4284if (relative_idx % 2) {4285rc = request_irq(irq, hl_irq_handler_dec_abnrm, 0,4286gaudi2_irq_name(i), (void *) dec);4287} else {4288rc = request_irq(irq, hl_irq_user_interrupt_handler, 0, gaudi2_irq_name(i),4289(void *) &hdev->user_interrupt[dec->core_id]);4290}42914292if (rc) {4293dev_err(hdev->dev, "Failed to request IRQ %d", irq);4294goto free_dec_irqs;4295}4296}42974298return 0;42994300free_dec_irqs:4301gaudi2_dec_disable_msix(hdev, (GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM + irq_init_cnt));4302return rc;4303}43044305static int gaudi2_enable_msix(struct hl_device *hdev)4306{4307struct asic_fixed_properties *prop = &hdev->asic_prop;4308struct gaudi2_device *gaudi2 = hdev->asic_specific;4309int rc, irq, i, j, user_irq_init_cnt;4310struct hl_cq *cq;43114312if (gaudi2->hw_cap_initialized & HW_CAP_MSIX)4313return 0;43144315hl_init_cpu_for_irq(hdev);43164317rc = pci_alloc_irq_vectors(hdev->pdev, GAUDI2_MSIX_ENTRIES, GAUDI2_MSIX_ENTRIES,4318PCI_IRQ_MSIX);4319if (rc < 0) {4320dev_err(hdev->dev, "MSI-X: Failed to enable support -- %d/%d\n",4321GAUDI2_MSIX_ENTRIES, rc);4322return rc;4323}43244325irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);4326cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_CS_COMPLETION];4327rc = request_irq(irq, hl_irq_handler_cq, 0, gaudi2_irq_name(GAUDI2_IRQ_NUM_COMPLETION), cq);4328if (rc) {4329dev_err(hdev->dev, "Failed to request IRQ %d", irq);4330goto free_irq_vectors;4331}43324333irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE);4334rc = request_irq(irq, hl_irq_handler_eq, 0, gaudi2_irq_name(GAUDI2_IRQ_NUM_EVENT_QUEUE),4335&hdev->event_queue);4336if (rc) {4337dev_err(hdev->dev, "Failed to request IRQ %d", irq);4338goto free_completion_irq;4339}43404341rc = gaudi2_dec_enable_msix(hdev);4342if (rc) {4343dev_err(hdev->dev, "Failed to enable decoder IRQ");4344goto free_event_irq;4345}43464347irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_TPC_ASSERT);4348rc = request_threaded_irq(irq, NULL, hl_irq_user_interrupt_thread_handler, IRQF_ONESHOT,4349gaudi2_irq_name(GAUDI2_IRQ_NUM_TPC_ASSERT),4350&hdev->tpc_interrupt);4351if (rc) {4352dev_err(hdev->dev, "Failed to request IRQ %d", irq);4353goto free_dec_irq;4354}43554356irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_UNEXPECTED_ERROR);4357rc = request_threaded_irq(irq, NULL, hl_irq_user_interrupt_thread_handler, IRQF_ONESHOT,4358gaudi2_irq_name(GAUDI2_IRQ_NUM_UNEXPECTED_ERROR),4359&hdev->unexpected_error_interrupt);4360if (rc) {4361dev_err(hdev->dev, "Failed to request IRQ %d", irq);4362goto free_tpc_irq;4363}43644365for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = prop->user_dec_intr_count, user_irq_init_cnt = 0;4366user_irq_init_cnt < prop->user_interrupt_count;4367i++, j++, user_irq_init_cnt++) {43684369irq = pci_irq_vector(hdev->pdev, i);4370hl_set_irq_affinity(hdev, irq);4371rc = request_irq(irq, hl_irq_user_interrupt_handler, 0, gaudi2_irq_name(i),4372&hdev->user_interrupt[j]);4373if (rc) {4374dev_err(hdev->dev, "Failed to request IRQ %d", irq);4375goto free_user_irq;4376}4377}43784379irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EQ_ERROR);4380rc = request_threaded_irq(irq, NULL, hl_irq_eq_error_interrupt_thread_handler,4381IRQF_ONESHOT, gaudi2_irq_name(GAUDI2_IRQ_NUM_EQ_ERROR),4382hdev);4383if (rc) {4384dev_err(hdev->dev, "Failed to request IRQ %d", irq);4385goto free_user_irq;4386}43874388gaudi2->hw_cap_initialized |= HW_CAP_MSIX;43894390return 0;43914392free_user_irq:4393for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = prop->user_dec_intr_count;4394i < GAUDI2_IRQ_NUM_USER_FIRST + user_irq_init_cnt ; i++, j++) {43954396irq = pci_irq_vector(hdev->pdev, i);4397irq_set_affinity_and_hint(irq, NULL);4398free_irq(irq, &hdev->user_interrupt[j]);4399}4400irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_UNEXPECTED_ERROR);4401free_irq(irq, &hdev->unexpected_error_interrupt);4402free_tpc_irq:4403irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_TPC_ASSERT);4404free_irq(irq, &hdev->tpc_interrupt);4405free_dec_irq:4406gaudi2_dec_disable_msix(hdev, GAUDI2_IRQ_NUM_DEC_LAST + 1);4407free_event_irq:4408irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE);4409free_irq(irq, cq);44104411free_completion_irq:4412irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);4413free_irq(irq, cq);44144415free_irq_vectors:4416pci_free_irq_vectors(hdev->pdev);44174418return rc;4419}44204421static void gaudi2_sync_irqs(struct hl_device *hdev)4422{4423struct gaudi2_device *gaudi2 = hdev->asic_specific;4424int i, j;4425int irq;44264427if (!(gaudi2->hw_cap_initialized & HW_CAP_MSIX))4428return;44294430/* Wait for all pending IRQs to be finished */4431synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION));44324433for (i = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM ; i <= GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM ; i++) {4434irq = pci_irq_vector(hdev->pdev, i);4435synchronize_irq(irq);4436}44374438synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_TPC_ASSERT));4439synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_UNEXPECTED_ERROR));44404441for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = 0 ; j < hdev->asic_prop.user_interrupt_count;4442i++, j++) {4443irq = pci_irq_vector(hdev->pdev, i);4444synchronize_irq(irq);4445}44464447synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE));4448synchronize_irq(pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EQ_ERROR));4449}44504451static void gaudi2_disable_msix(struct hl_device *hdev)4452{4453struct asic_fixed_properties *prop = &hdev->asic_prop;4454struct gaudi2_device *gaudi2 = hdev->asic_specific;4455struct hl_cq *cq;4456int irq, i, j, k;44574458if (!(gaudi2->hw_cap_initialized & HW_CAP_MSIX))4459return;44604461gaudi2_sync_irqs(hdev);44624463irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE);4464free_irq(irq, &hdev->event_queue);44654466gaudi2_dec_disable_msix(hdev, GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM + 1);44674468irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_TPC_ASSERT);4469free_irq(irq, &hdev->tpc_interrupt);44704471irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_UNEXPECTED_ERROR);4472free_irq(irq, &hdev->unexpected_error_interrupt);44734474for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = prop->user_dec_intr_count, k = 0;4475k < hdev->asic_prop.user_interrupt_count ; i++, j++, k++) {44764477irq = pci_irq_vector(hdev->pdev, i);4478irq_set_affinity_and_hint(irq, NULL);4479free_irq(irq, &hdev->user_interrupt[j]);4480}44814482irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);4483cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_CS_COMPLETION];4484free_irq(irq, cq);44854486irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EQ_ERROR);4487free_irq(irq, hdev);44884489pci_free_irq_vectors(hdev->pdev);44904491gaudi2->hw_cap_initialized &= ~HW_CAP_MSIX;4492}44934494static void gaudi2_stop_dcore_dec(struct hl_device *hdev, int dcore_id)4495{4496u32 reg_val = FIELD_PREP(DCORE0_VDEC0_BRDG_CTRL_GRACEFUL_STOP_MASK, 0x1);4497u32 graceful_pend_mask = DCORE0_VDEC0_BRDG_CTRL_GRACEFUL_PEND_MASK;4498u32 timeout_usec, dec_id, dec_bit, offset, graceful;4499int rc;45004501if (hdev->pldm)4502timeout_usec = GAUDI2_PLDM_VDEC_TIMEOUT_USEC;4503else4504timeout_usec = GAUDI2_VDEC_TIMEOUT_USEC;45054506for (dec_id = 0 ; dec_id < NUM_OF_DEC_PER_DCORE ; dec_id++) {4507dec_bit = dcore_id * NUM_OF_DEC_PER_DCORE + dec_id;4508if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))4509continue;45104511offset = dcore_id * DCORE_OFFSET + dec_id * DCORE_VDEC_OFFSET;45124513WREG32(mmDCORE0_DEC0_CMD_SWREG16 + offset, 0);45144515WREG32(mmDCORE0_VDEC0_BRDG_CTRL_GRACEFUL + offset, reg_val);45164517/* Wait till all traffic from decoder stops4518* before apply core reset.4519*/4520rc = hl_poll_timeout(4521hdev,4522mmDCORE0_VDEC0_BRDG_CTRL_GRACEFUL + offset,4523graceful,4524(graceful & graceful_pend_mask),4525100,4526timeout_usec);4527if (rc)4528dev_err(hdev->dev,4529"Failed to stop traffic from DCORE%d Decoder %d\n",4530dcore_id, dec_id);4531}4532}45334534static void gaudi2_stop_pcie_dec(struct hl_device *hdev)4535{4536u32 reg_val = FIELD_PREP(DCORE0_VDEC0_BRDG_CTRL_GRACEFUL_STOP_MASK, 0x1);4537u32 graceful_pend_mask = PCIE_VDEC0_BRDG_CTRL_GRACEFUL_PEND_MASK;4538u32 timeout_usec, dec_id, dec_bit, offset, graceful;4539int rc;45404541if (hdev->pldm)4542timeout_usec = GAUDI2_PLDM_VDEC_TIMEOUT_USEC;4543else4544timeout_usec = GAUDI2_VDEC_TIMEOUT_USEC;45454546for (dec_id = 0 ; dec_id < NUM_OF_DEC_PER_DCORE ; dec_id++) {4547dec_bit = PCIE_DEC_SHIFT + dec_id;4548if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))4549continue;45504551offset = dec_id * PCIE_VDEC_OFFSET;45524553WREG32(mmPCIE_DEC0_CMD_SWREG16 + offset, 0);45544555WREG32(mmPCIE_VDEC0_BRDG_CTRL_GRACEFUL + offset, reg_val);45564557/* Wait till all traffic from decoder stops4558* before apply core reset.4559*/4560rc = hl_poll_timeout(4561hdev,4562mmPCIE_VDEC0_BRDG_CTRL_GRACEFUL + offset,4563graceful,4564(graceful & graceful_pend_mask),4565100,4566timeout_usec);4567if (rc)4568dev_err(hdev->dev,4569"Failed to stop traffic from PCIe Decoder %d\n",4570dec_id);4571}4572}45734574static void gaudi2_stop_dec(struct hl_device *hdev)4575{4576struct gaudi2_device *gaudi2 = hdev->asic_specific;4577int dcore_id;45784579if ((gaudi2->dec_hw_cap_initialized & HW_CAP_DEC_MASK) == 0)4580return;45814582for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++)4583gaudi2_stop_dcore_dec(hdev, dcore_id);45844585gaudi2_stop_pcie_dec(hdev);4586}45874588static void gaudi2_set_arc_running_mode(struct hl_device *hdev, u32 cpu_id, u32 run_mode)4589{4590u32 reg_base, reg_val;45914592reg_base = gaudi2_arc_blocks_bases[cpu_id];4593if (run_mode == HL_ENGINE_CORE_RUN)4594reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_RUN_HALT_REQ_RUN_REQ_MASK, 1);4595else4596reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_RUN_HALT_REQ_HALT_REQ_MASK, 1);45974598WREG32(reg_base + ARC_HALT_REQ_OFFSET, reg_val);4599}46004601static void gaudi2_halt_arcs(struct hl_device *hdev)4602{4603u16 arc_id;46044605for (arc_id = CPU_ID_SCHED_ARC0; arc_id < CPU_ID_MAX; arc_id++) {4606if (gaudi2_is_arc_enabled(hdev, arc_id))4607gaudi2_set_arc_running_mode(hdev, arc_id, HL_ENGINE_CORE_HALT);4608}4609}46104611static int gaudi2_verify_arc_running_mode(struct hl_device *hdev, u32 cpu_id, u32 run_mode)4612{4613int rc;4614u32 reg_base, val, ack_mask, timeout_usec = 100000;46154616if (hdev->pldm)4617timeout_usec *= 100;46184619reg_base = gaudi2_arc_blocks_bases[cpu_id];4620if (run_mode == HL_ENGINE_CORE_RUN)4621ack_mask = ARC_FARM_ARC0_AUX_RUN_HALT_ACK_RUN_ACK_MASK;4622else4623ack_mask = ARC_FARM_ARC0_AUX_RUN_HALT_ACK_HALT_ACK_MASK;46244625rc = hl_poll_timeout(hdev, reg_base + ARC_HALT_ACK_OFFSET,4626val, ((val & ack_mask) == ack_mask),46271000, timeout_usec);46284629if (!rc) {4630/* Clear */4631val = FIELD_PREP(ARC_FARM_ARC0_AUX_RUN_HALT_REQ_RUN_REQ_MASK, 0);4632WREG32(reg_base + ARC_HALT_REQ_OFFSET, val);4633}46344635return rc;4636}46374638static void gaudi2_reset_arcs(struct hl_device *hdev)4639{4640struct gaudi2_device *gaudi2 = hdev->asic_specific;4641u16 arc_id;46424643if (!gaudi2)4644return;46454646for (arc_id = CPU_ID_SCHED_ARC0; arc_id < CPU_ID_MAX; arc_id++)4647if (gaudi2_is_arc_enabled(hdev, arc_id))4648gaudi2_clr_arc_id_cap(hdev, arc_id);4649}46504651static void gaudi2_nic_qmans_manual_flush(struct hl_device *hdev)4652{4653struct gaudi2_device *gaudi2 = hdev->asic_specific;4654u32 queue_id;4655int i;46564657if (!(gaudi2->nic_hw_cap_initialized & HW_CAP_NIC_MASK))4658return;46594660queue_id = GAUDI2_QUEUE_ID_NIC_0_0;46614662for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++, queue_id += NUM_OF_PQ_PER_QMAN) {4663if (!(hdev->nic_ports_mask & BIT(i)))4664continue;46654666gaudi2_qman_manual_flush_common(hdev, queue_id);4667}4668}46694670static int gaudi2_set_engine_cores(struct hl_device *hdev, u32 *core_ids,4671u32 num_cores, u32 core_command)4672{4673int i, rc;46744675for (i = 0 ; i < num_cores ; i++) {4676if (gaudi2_is_arc_enabled(hdev, core_ids[i]))4677gaudi2_set_arc_running_mode(hdev, core_ids[i], core_command);4678}46794680for (i = 0 ; i < num_cores ; i++) {4681if (gaudi2_is_arc_enabled(hdev, core_ids[i])) {4682rc = gaudi2_verify_arc_running_mode(hdev, core_ids[i], core_command);46834684if (rc) {4685dev_err(hdev->dev, "failed to %s arc: %d\n",4686(core_command == HL_ENGINE_CORE_HALT) ?4687"HALT" : "RUN", core_ids[i]);4688return -1;4689}4690}4691}46924693return 0;4694}46954696static int gaudi2_set_tpc_engine_mode(struct hl_device *hdev, u32 engine_id, u32 engine_command)4697{4698struct gaudi2_device *gaudi2 = hdev->asic_specific;4699u32 reg_base, reg_addr, reg_val, tpc_id;47004701if (!(gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK))4702return 0;47034704tpc_id = gaudi2_tpc_engine_id_to_tpc_id[engine_id];4705if (!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(HW_CAP_TPC_SHIFT + tpc_id)))4706return 0;47074708reg_base = gaudi2_tpc_cfg_blocks_bases[tpc_id];4709reg_addr = reg_base + TPC_CFG_STALL_OFFSET;4710reg_val = FIELD_PREP(DCORE0_TPC0_CFG_TPC_STALL_V_MASK,4711(engine_command == HL_ENGINE_STALL) ? 1 : 0);4712WREG32(reg_addr, reg_val);47134714if (engine_command == HL_ENGINE_RESUME) {4715reg_base = gaudi2_tpc_eml_cfg_blocks_bases[tpc_id];4716reg_addr = reg_base + TPC_EML_CFG_DBG_CNT_OFFSET;4717RMWREG32(reg_addr, 0x1, DCORE0_TPC0_EML_CFG_DBG_CNT_DBG_EXIT_MASK);4718}47194720return 0;4721}47224723static int gaudi2_set_mme_engine_mode(struct hl_device *hdev, u32 engine_id, u32 engine_command)4724{4725struct gaudi2_device *gaudi2 = hdev->asic_specific;4726u32 reg_base, reg_addr, reg_val, mme_id;47274728mme_id = gaudi2_mme_engine_id_to_mme_id[engine_id];4729if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_MME_SHIFT + mme_id)))4730return 0;47314732reg_base = gaudi2_mme_ctrl_lo_blocks_bases[mme_id];4733reg_addr = reg_base + MME_CTRL_LO_QM_STALL_OFFSET;4734reg_val = FIELD_PREP(DCORE0_MME_CTRL_LO_QM_STALL_V_MASK,4735(engine_command == HL_ENGINE_STALL) ? 1 : 0);4736WREG32(reg_addr, reg_val);47374738return 0;4739}47404741static int gaudi2_set_edma_engine_mode(struct hl_device *hdev, u32 engine_id, u32 engine_command)4742{4743struct gaudi2_device *gaudi2 = hdev->asic_specific;4744u32 reg_base, reg_addr, reg_val, edma_id;47454746if (!(gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK))4747return 0;47484749edma_id = gaudi2_edma_engine_id_to_edma_id[engine_id];4750if (!(gaudi2->hw_cap_initialized & BIT_ULL(HW_CAP_EDMA_SHIFT + edma_id)))4751return 0;47524753reg_base = gaudi2_dma_core_blocks_bases[edma_id];4754reg_addr = reg_base + EDMA_CORE_CFG_STALL_OFFSET;4755reg_val = FIELD_PREP(DCORE0_EDMA0_CORE_CFG_1_HALT_MASK,4756(engine_command == HL_ENGINE_STALL) ? 1 : 0);4757WREG32(reg_addr, reg_val);47584759if (engine_command == HL_ENGINE_STALL) {4760reg_val = FIELD_PREP(DCORE0_EDMA0_CORE_CFG_1_HALT_MASK, 0x1) |4761FIELD_PREP(DCORE0_EDMA0_CORE_CFG_1_FLUSH_MASK, 0x1);4762WREG32(reg_addr, reg_val);4763}47644765return 0;4766}47674768static int gaudi2_set_engine_modes(struct hl_device *hdev,4769u32 *engine_ids, u32 num_engines, u32 engine_command)4770{4771int i, rc;47724773for (i = 0 ; i < num_engines ; ++i) {4774switch (engine_ids[i]) {4775case GAUDI2_DCORE0_ENGINE_ID_TPC_0 ... GAUDI2_DCORE0_ENGINE_ID_TPC_5:4776case GAUDI2_DCORE1_ENGINE_ID_TPC_0 ... GAUDI2_DCORE1_ENGINE_ID_TPC_5:4777case GAUDI2_DCORE2_ENGINE_ID_TPC_0 ... GAUDI2_DCORE2_ENGINE_ID_TPC_5:4778case GAUDI2_DCORE3_ENGINE_ID_TPC_0 ... GAUDI2_DCORE3_ENGINE_ID_TPC_5:4779rc = gaudi2_set_tpc_engine_mode(hdev, engine_ids[i], engine_command);4780if (rc)4781return rc;47824783break;4784case GAUDI2_DCORE0_ENGINE_ID_MME:4785case GAUDI2_DCORE1_ENGINE_ID_MME:4786case GAUDI2_DCORE2_ENGINE_ID_MME:4787case GAUDI2_DCORE3_ENGINE_ID_MME:4788rc = gaudi2_set_mme_engine_mode(hdev, engine_ids[i], engine_command);4789if (rc)4790return rc;47914792break;4793case GAUDI2_DCORE0_ENGINE_ID_EDMA_0 ... GAUDI2_DCORE0_ENGINE_ID_EDMA_1:4794case GAUDI2_DCORE1_ENGINE_ID_EDMA_0 ... GAUDI2_DCORE1_ENGINE_ID_EDMA_1:4795case GAUDI2_DCORE2_ENGINE_ID_EDMA_0 ... GAUDI2_DCORE2_ENGINE_ID_EDMA_1:4796case GAUDI2_DCORE3_ENGINE_ID_EDMA_0 ... GAUDI2_DCORE3_ENGINE_ID_EDMA_1:4797rc = gaudi2_set_edma_engine_mode(hdev, engine_ids[i], engine_command);4798if (rc)4799return rc;48004801break;4802default:4803dev_err(hdev->dev, "Invalid engine ID %u\n", engine_ids[i]);4804return -EINVAL;4805}4806}48074808return 0;4809}48104811static int gaudi2_set_engines(struct hl_device *hdev, u32 *engine_ids,4812u32 num_engines, u32 engine_command)4813{4814switch (engine_command) {4815case HL_ENGINE_CORE_HALT:4816case HL_ENGINE_CORE_RUN:4817return gaudi2_set_engine_cores(hdev, engine_ids, num_engines, engine_command);48184819case HL_ENGINE_STALL:4820case HL_ENGINE_RESUME:4821return gaudi2_set_engine_modes(hdev, engine_ids, num_engines, engine_command);48224823default:4824dev_err(hdev->dev, "failed to execute command id %u\n", engine_command);4825return -EINVAL;4826}4827}48284829static void gaudi2_halt_engines(struct hl_device *hdev, bool hard_reset, bool fw_reset)4830{4831u32 wait_timeout_ms;48324833if (hdev->pldm)4834wait_timeout_ms = GAUDI2_PLDM_RESET_WAIT_MSEC;4835else4836wait_timeout_ms = GAUDI2_RESET_WAIT_MSEC;48374838if (fw_reset)4839goto skip_engines;48404841gaudi2_stop_dma_qmans(hdev);4842gaudi2_stop_mme_qmans(hdev);4843gaudi2_stop_tpc_qmans(hdev);4844gaudi2_stop_rot_qmans(hdev);4845gaudi2_stop_nic_qmans(hdev);4846msleep(wait_timeout_ms);48474848gaudi2_halt_arcs(hdev);4849gaudi2_dma_stall(hdev);4850gaudi2_mme_stall(hdev);4851gaudi2_tpc_stall(hdev);4852gaudi2_rotator_stall(hdev);48534854msleep(wait_timeout_ms);48554856gaudi2_stop_dec(hdev);48574858/*4859* in case of soft reset do a manual flush for QMANs (currently called4860* only for NIC QMANs4861*/4862if (!hard_reset)4863gaudi2_nic_qmans_manual_flush(hdev);48644865gaudi2_disable_dma_qmans(hdev);4866gaudi2_disable_mme_qmans(hdev);4867gaudi2_disable_tpc_qmans(hdev);4868gaudi2_disable_rot_qmans(hdev);4869gaudi2_disable_nic_qmans(hdev);4870gaudi2_disable_timestamp(hdev);48714872skip_engines:4873if (hard_reset) {4874gaudi2_disable_msix(hdev);4875return;4876}48774878gaudi2_sync_irqs(hdev);4879}48804881static void gaudi2_init_firmware_preload_params(struct hl_device *hdev)4882{4883struct pre_fw_load_props *pre_fw_load = &hdev->fw_loader.pre_fw_load;48844885pre_fw_load->cpu_boot_status_reg = mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS;4886pre_fw_load->sts_boot_dev_sts0_reg = mmCPU_BOOT_DEV_STS0;4887pre_fw_load->sts_boot_dev_sts1_reg = mmCPU_BOOT_DEV_STS1;4888pre_fw_load->boot_err0_reg = mmCPU_BOOT_ERR0;4889pre_fw_load->boot_err1_reg = mmCPU_BOOT_ERR1;4890pre_fw_load->wait_for_preboot_timeout = GAUDI2_PREBOOT_REQ_TIMEOUT_USEC;4891pre_fw_load->wait_for_preboot_extended_timeout =4892GAUDI2_PREBOOT_EXTENDED_REQ_TIMEOUT_USEC;4893}48944895static void gaudi2_init_firmware_loader(struct hl_device *hdev)4896{4897struct fw_load_mgr *fw_loader = &hdev->fw_loader;4898struct dynamic_fw_load_mgr *dynamic_loader;4899struct cpu_dyn_regs *dyn_regs;49004901/* fill common fields */4902fw_loader->fw_comp_loaded = FW_TYPE_NONE;4903fw_loader->boot_fit_img.image_name = GAUDI2_BOOT_FIT_FILE;4904fw_loader->linux_img.image_name = GAUDI2_LINUX_FW_FILE;4905fw_loader->boot_fit_timeout = GAUDI2_BOOT_FIT_REQ_TIMEOUT_USEC;4906fw_loader->skip_bmc = false;4907fw_loader->sram_bar_id = SRAM_CFG_BAR_ID;4908fw_loader->dram_bar_id = DRAM_BAR_ID;4909fw_loader->cpu_timeout = GAUDI2_CPU_TIMEOUT_USEC;49104911/* here we update initial values for few specific dynamic regs (as4912* before reading the first descriptor from FW those value has to be4913* hard-coded). in later stages of the protocol those values will be4914* updated automatically by reading the FW descriptor so data there4915* will always be up-to-date4916*/4917dynamic_loader = &hdev->fw_loader.dynamic_loader;4918dyn_regs = &dynamic_loader->comm_desc.cpu_dyn_regs;4919dyn_regs->kmd_msg_to_cpu = cpu_to_le32(mmPSOC_GLOBAL_CONF_KMD_MSG_TO_CPU);4920dyn_regs->cpu_cmd_status_to_host = cpu_to_le32(mmCPU_CMD_STATUS_TO_HOST);4921dynamic_loader->wait_for_bl_timeout = GAUDI2_WAIT_FOR_BL_TIMEOUT_USEC;4922}49234924static int gaudi2_init_cpu(struct hl_device *hdev)4925{4926struct gaudi2_device *gaudi2 = hdev->asic_specific;4927int rc;49284929if (!(hdev->fw_components & FW_TYPE_PREBOOT_CPU))4930return 0;49314932if (gaudi2->hw_cap_initialized & HW_CAP_CPU)4933return 0;49344935rc = hl_fw_init_cpu(hdev);4936if (rc)4937return rc;49384939gaudi2->hw_cap_initialized |= HW_CAP_CPU;49404941return 0;4942}49434944static int gaudi2_init_cpu_queues(struct hl_device *hdev, u32 cpu_timeout)4945{4946struct hl_hw_queue *cpu_pq = &hdev->kernel_queues[GAUDI2_QUEUE_ID_CPU_PQ];4947struct asic_fixed_properties *prop = &hdev->asic_prop;4948struct gaudi2_device *gaudi2 = hdev->asic_specific;4949struct cpu_dyn_regs *dyn_regs;4950struct hl_eq *eq;4951u32 status;4952int err;49534954if (!hdev->cpu_queues_enable)4955return 0;49564957if (gaudi2->hw_cap_initialized & HW_CAP_CPU_Q)4958return 0;49594960eq = &hdev->event_queue;49614962dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;49634964WREG32(mmCPU_IF_PQ_BASE_ADDR_LOW, lower_32_bits(cpu_pq->bus_address));4965WREG32(mmCPU_IF_PQ_BASE_ADDR_HIGH, upper_32_bits(cpu_pq->bus_address));49664967WREG32(mmCPU_IF_EQ_BASE_ADDR_LOW, lower_32_bits(eq->bus_address));4968WREG32(mmCPU_IF_EQ_BASE_ADDR_HIGH, upper_32_bits(eq->bus_address));49694970WREG32(mmCPU_IF_CQ_BASE_ADDR_LOW, lower_32_bits(hdev->cpu_accessible_dma_address));4971WREG32(mmCPU_IF_CQ_BASE_ADDR_HIGH, upper_32_bits(hdev->cpu_accessible_dma_address));49724973WREG32(mmCPU_IF_PQ_LENGTH, HL_QUEUE_SIZE_IN_BYTES);4974WREG32(mmCPU_IF_EQ_LENGTH, HL_EQ_SIZE_IN_BYTES);4975WREG32(mmCPU_IF_CQ_LENGTH, HL_CPU_ACCESSIBLE_MEM_SIZE);49764977/* Used for EQ CI */4978WREG32(mmCPU_IF_EQ_RD_OFFS, 0);49794980WREG32(mmCPU_IF_PF_PQ_PI, 0);49814982WREG32(mmCPU_IF_QUEUE_INIT, PQ_INIT_STATUS_READY_FOR_CP);49834984/* Let the ARC know we are ready as it is now handling those queues */49854986WREG32(le32_to_cpu(dyn_regs->gic_host_pi_upd_irq),4987gaudi2_irq_map_table[GAUDI2_EVENT_CPU_PI_UPDATE].cpu_id);49884989err = hl_poll_timeout(4990hdev,4991mmCPU_IF_QUEUE_INIT,4992status,4993(status == PQ_INIT_STATUS_READY_FOR_HOST),49941000,4995cpu_timeout);49964997if (err) {4998dev_err(hdev->dev, "Failed to communicate with device CPU (timeout)\n");4999return -EIO;5000}50015002/* update FW application security bits */5003if (prop->fw_cpu_boot_dev_sts0_valid)5004prop->fw_app_cpu_boot_dev_sts0 = RREG32(mmCPU_BOOT_DEV_STS0);50055006if (prop->fw_cpu_boot_dev_sts1_valid)5007prop->fw_app_cpu_boot_dev_sts1 = RREG32(mmCPU_BOOT_DEV_STS1);50085009gaudi2->hw_cap_initialized |= HW_CAP_CPU_Q;5010return 0;5011}50125013static void gaudi2_init_qman_pq(struct hl_device *hdev, u32 reg_base,5014u32 queue_id_base)5015{5016struct hl_hw_queue *q;5017u32 pq_id, pq_offset;50185019for (pq_id = 0 ; pq_id < NUM_OF_PQ_PER_QMAN ; pq_id++) {5020q = &hdev->kernel_queues[queue_id_base + pq_id];5021pq_offset = pq_id * 4;50225023if (q->dram_bd) {5024WREG32(reg_base + QM_PQ_BASE_LO_0_OFFSET + pq_offset,5025lower_32_bits(q->pq_dram_address));5026WREG32(reg_base + QM_PQ_BASE_HI_0_OFFSET + pq_offset,5027upper_32_bits(q->pq_dram_address));5028} else {5029WREG32(reg_base + QM_PQ_BASE_LO_0_OFFSET + pq_offset,5030lower_32_bits(q->bus_address));5031WREG32(reg_base + QM_PQ_BASE_HI_0_OFFSET + pq_offset,5032upper_32_bits(q->bus_address));5033}5034WREG32(reg_base + QM_PQ_SIZE_0_OFFSET + pq_offset, ilog2(HL_QUEUE_LENGTH));5035WREG32(reg_base + QM_PQ_PI_0_OFFSET + pq_offset, 0);5036WREG32(reg_base + QM_PQ_CI_0_OFFSET + pq_offset, 0);5037}5038}50395040static void gaudi2_init_qman_cp(struct hl_device *hdev, u32 reg_base)5041{5042u32 cp_id, cp_offset, mtr_base_lo, mtr_base_hi, so_base_lo, so_base_hi;50435044mtr_base_lo = lower_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);5045mtr_base_hi = upper_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0);5046so_base_lo = lower_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);5047so_base_hi = upper_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);50485049for (cp_id = 0 ; cp_id < NUM_OF_CP_PER_QMAN; cp_id++) {5050cp_offset = cp_id * 4;50515052WREG32(reg_base + QM_CP_MSG_BASE0_ADDR_LO_0_OFFSET + cp_offset, mtr_base_lo);5053WREG32(reg_base + QM_CP_MSG_BASE0_ADDR_HI_0_OFFSET + cp_offset, mtr_base_hi);5054WREG32(reg_base + QM_CP_MSG_BASE1_ADDR_LO_0_OFFSET + cp_offset, so_base_lo);5055WREG32(reg_base + QM_CP_MSG_BASE1_ADDR_HI_0_OFFSET + cp_offset, so_base_hi);5056}50575058/* allow QMANs to accept work from ARC CQF */5059WREG32(reg_base + QM_CP_CFG_OFFSET, FIELD_PREP(PDMA0_QM_CP_CFG_SWITCH_EN_MASK, 0x1));5060}50615062static void gaudi2_init_qman_pqc(struct hl_device *hdev, u32 reg_base,5063u32 queue_id_base)5064{5065struct gaudi2_device *gaudi2 = hdev->asic_specific;5066u32 pq_id, pq_offset, so_base_lo, so_base_hi;50675068so_base_lo = lower_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);5069so_base_hi = upper_32_bits(CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0);50705071for (pq_id = 0 ; pq_id < NUM_OF_PQ_PER_QMAN ; pq_id++) {5072pq_offset = pq_id * 4;50735074/* Configure QMAN HBW to scratchpad as it is not needed */5075WREG32(reg_base + QM_PQC_HBW_BASE_LO_0_OFFSET + pq_offset,5076lower_32_bits(gaudi2->scratchpad_bus_address));5077WREG32(reg_base + QM_PQC_HBW_BASE_HI_0_OFFSET + pq_offset,5078upper_32_bits(gaudi2->scratchpad_bus_address));5079WREG32(reg_base + QM_PQC_SIZE_0_OFFSET + pq_offset,5080ilog2(PAGE_SIZE / sizeof(struct hl_cq_entry)));50815082WREG32(reg_base + QM_PQC_PI_0_OFFSET + pq_offset, 0);5083WREG32(reg_base + QM_PQC_LBW_WDATA_0_OFFSET + pq_offset, QM_PQC_LBW_WDATA);5084WREG32(reg_base + QM_PQC_LBW_BASE_LO_0_OFFSET + pq_offset, so_base_lo);5085WREG32(reg_base + QM_PQC_LBW_BASE_HI_0_OFFSET + pq_offset, so_base_hi);5086}50875088/* Enable QMAN H/W completion */5089WREG32(reg_base + QM_PQC_CFG_OFFSET, 1 << PDMA0_QM_PQC_CFG_EN_SHIFT);5090}50915092static u32 gaudi2_get_dyn_sp_reg(struct hl_device *hdev, u32 queue_id_base)5093{5094struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;5095u32 sp_reg_addr;50965097switch (queue_id_base) {5098case GAUDI2_QUEUE_ID_PDMA_0_0...GAUDI2_QUEUE_ID_PDMA_1_3:5099fallthrough;5100case GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3:5101fallthrough;5102case GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3:5103fallthrough;5104case GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3:5105fallthrough;5106case GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3:5107sp_reg_addr = le32_to_cpu(dyn_regs->gic_dma_qm_irq_ctrl);5108break;5109case GAUDI2_QUEUE_ID_DCORE0_MME_0_0...GAUDI2_QUEUE_ID_DCORE0_MME_0_3:5110fallthrough;5111case GAUDI2_QUEUE_ID_DCORE1_MME_0_0...GAUDI2_QUEUE_ID_DCORE1_MME_0_3:5112fallthrough;5113case GAUDI2_QUEUE_ID_DCORE2_MME_0_0...GAUDI2_QUEUE_ID_DCORE2_MME_0_3:5114fallthrough;5115case GAUDI2_QUEUE_ID_DCORE3_MME_0_0...GAUDI2_QUEUE_ID_DCORE3_MME_0_3:5116sp_reg_addr = le32_to_cpu(dyn_regs->gic_mme_qm_irq_ctrl);5117break;5118case GAUDI2_QUEUE_ID_DCORE0_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE0_TPC_6_3:5119fallthrough;5120case GAUDI2_QUEUE_ID_DCORE1_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE1_TPC_5_3:5121fallthrough;5122case GAUDI2_QUEUE_ID_DCORE2_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE2_TPC_5_3:5123fallthrough;5124case GAUDI2_QUEUE_ID_DCORE3_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE3_TPC_5_3:5125sp_reg_addr = le32_to_cpu(dyn_regs->gic_tpc_qm_irq_ctrl);5126break;5127case GAUDI2_QUEUE_ID_ROT_0_0...GAUDI2_QUEUE_ID_ROT_1_3:5128sp_reg_addr = le32_to_cpu(dyn_regs->gic_rot_qm_irq_ctrl);5129break;5130case GAUDI2_QUEUE_ID_NIC_0_0...GAUDI2_QUEUE_ID_NIC_23_3:5131sp_reg_addr = le32_to_cpu(dyn_regs->gic_nic_qm_irq_ctrl);5132break;5133default:5134dev_err(hdev->dev, "Unexpected h/w queue %d\n", queue_id_base);5135return 0;5136}51375138return sp_reg_addr;5139}51405141static void gaudi2_init_qman_common(struct hl_device *hdev, u32 reg_base,5142u32 queue_id_base)5143{5144u32 glbl_prot = QMAN_MAKE_TRUSTED, irq_handler_offset;5145int map_table_entry;51465147WREG32(reg_base + QM_GLBL_PROT_OFFSET, glbl_prot);51485149irq_handler_offset = gaudi2_get_dyn_sp_reg(hdev, queue_id_base);5150WREG32(reg_base + QM_GLBL_ERR_ADDR_LO_OFFSET, lower_32_bits(CFG_BASE + irq_handler_offset));5151WREG32(reg_base + QM_GLBL_ERR_ADDR_HI_OFFSET, upper_32_bits(CFG_BASE + irq_handler_offset));51525153map_table_entry = gaudi2_qman_async_event_id[queue_id_base];5154WREG32(reg_base + QM_GLBL_ERR_WDATA_OFFSET,5155gaudi2_irq_map_table[map_table_entry].cpu_id);51565157WREG32(reg_base + QM_ARB_ERR_MSG_EN_OFFSET, QM_ARB_ERR_MSG_EN_MASK);51585159WREG32(reg_base + QM_ARB_SLV_CHOISE_WDT_OFFSET, GAUDI2_ARB_WDT_TIMEOUT);5160WREG32(reg_base + QM_GLBL_CFG1_OFFSET, 0);5161WREG32(reg_base + QM_GLBL_CFG2_OFFSET, 0);51625163/* Enable the QMAN channel.5164* PDMA QMAN configuration is different, as we do not allow user to5165* access some of the CPs.5166* PDMA0: CP2/3 are reserved for the ARC usage.5167* PDMA1: CP1/2/3 are reserved for the ARC usage.5168*/5169if (reg_base == gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_PDMA_1_0])5170WREG32(reg_base + QM_GLBL_CFG0_OFFSET, PDMA1_QMAN_ENABLE);5171else if (reg_base == gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_PDMA_0_0])5172WREG32(reg_base + QM_GLBL_CFG0_OFFSET, PDMA0_QMAN_ENABLE);5173else5174WREG32(reg_base + QM_GLBL_CFG0_OFFSET, QMAN_ENABLE);5175}51765177static void gaudi2_init_qman(struct hl_device *hdev, u32 reg_base,5178u32 queue_id_base)5179{5180u32 pq_id;51815182for (pq_id = 0 ; pq_id < NUM_OF_PQ_PER_QMAN ; pq_id++)5183hdev->kernel_queues[queue_id_base + pq_id].cq_id = GAUDI2_RESERVED_CQ_CS_COMPLETION;51845185gaudi2_init_qman_pq(hdev, reg_base, queue_id_base);5186gaudi2_init_qman_cp(hdev, reg_base);5187gaudi2_init_qman_pqc(hdev, reg_base, queue_id_base);5188gaudi2_init_qman_common(hdev, reg_base, queue_id_base);5189}51905191static void gaudi2_init_dma_core(struct hl_device *hdev, u32 reg_base,5192u32 dma_core_id, bool is_secure)5193{5194u32 prot, irq_handler_offset;5195struct cpu_dyn_regs *dyn_regs;5196int map_table_entry;51975198prot = 1 << ARC_FARM_KDMA_PROT_ERR_VAL_SHIFT;5199if (is_secure)5200prot |= 1 << ARC_FARM_KDMA_PROT_VAL_SHIFT;52015202WREG32(reg_base + DMA_CORE_PROT_OFFSET, prot);52035204dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;5205irq_handler_offset = le32_to_cpu(dyn_regs->gic_dma_core_irq_ctrl);52065207WREG32(reg_base + DMA_CORE_ERRMSG_ADDR_LO_OFFSET,5208lower_32_bits(CFG_BASE + irq_handler_offset));52095210WREG32(reg_base + DMA_CORE_ERRMSG_ADDR_HI_OFFSET,5211upper_32_bits(CFG_BASE + irq_handler_offset));52125213map_table_entry = gaudi2_dma_core_async_event_id[dma_core_id];5214WREG32(reg_base + DMA_CORE_ERRMSG_WDATA_OFFSET,5215gaudi2_irq_map_table[map_table_entry].cpu_id);52165217/* Enable the DMA channel */5218WREG32(reg_base + DMA_CORE_CFG_0_OFFSET, 1 << ARC_FARM_KDMA_CFG_0_EN_SHIFT);5219}52205221static void gaudi2_init_kdma(struct hl_device *hdev)5222{5223struct gaudi2_device *gaudi2 = hdev->asic_specific;5224u32 reg_base;52255226if ((gaudi2->hw_cap_initialized & HW_CAP_KDMA) == HW_CAP_KDMA)5227return;52285229reg_base = gaudi2_dma_core_blocks_bases[DMA_CORE_ID_KDMA];52305231gaudi2_init_dma_core(hdev, reg_base, DMA_CORE_ID_KDMA, true);52325233gaudi2->hw_cap_initialized |= HW_CAP_KDMA;5234}52355236static void gaudi2_init_pdma(struct hl_device *hdev)5237{5238struct gaudi2_device *gaudi2 = hdev->asic_specific;5239u32 reg_base;52405241if ((gaudi2->hw_cap_initialized & HW_CAP_PDMA_MASK) == HW_CAP_PDMA_MASK)5242return;52435244reg_base = gaudi2_dma_core_blocks_bases[DMA_CORE_ID_PDMA0];5245gaudi2_init_dma_core(hdev, reg_base, DMA_CORE_ID_PDMA0, false);52465247reg_base = gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_PDMA_0_0];5248gaudi2_init_qman(hdev, reg_base, GAUDI2_QUEUE_ID_PDMA_0_0);52495250reg_base = gaudi2_dma_core_blocks_bases[DMA_CORE_ID_PDMA1];5251gaudi2_init_dma_core(hdev, reg_base, DMA_CORE_ID_PDMA1, false);52525253reg_base = gaudi2_qm_blocks_bases[GAUDI2_QUEUE_ID_PDMA_1_0];5254gaudi2_init_qman(hdev, reg_base, GAUDI2_QUEUE_ID_PDMA_1_0);52555256gaudi2->hw_cap_initialized |= HW_CAP_PDMA_MASK;5257}52585259static void gaudi2_init_edma_instance(struct hl_device *hdev, u8 seq)5260{5261u32 reg_base, base_edma_core_id, base_edma_qman_id;52625263base_edma_core_id = DMA_CORE_ID_EDMA0 + seq;5264base_edma_qman_id = edma_stream_base[seq];52655266reg_base = gaudi2_dma_core_blocks_bases[base_edma_core_id];5267gaudi2_init_dma_core(hdev, reg_base, base_edma_core_id, false);52685269reg_base = gaudi2_qm_blocks_bases[base_edma_qman_id];5270gaudi2_init_qman(hdev, reg_base, base_edma_qman_id);5271}52725273static void gaudi2_init_edma(struct hl_device *hdev)5274{5275struct asic_fixed_properties *prop = &hdev->asic_prop;5276struct gaudi2_device *gaudi2 = hdev->asic_specific;5277int dcore, inst;52785279if ((gaudi2->hw_cap_initialized & HW_CAP_EDMA_MASK) == HW_CAP_EDMA_MASK)5280return;52815282for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {5283for (inst = 0 ; inst < NUM_OF_EDMA_PER_DCORE ; inst++) {5284u8 seq = dcore * NUM_OF_EDMA_PER_DCORE + inst;52855286if (!(prop->edma_enabled_mask & BIT(seq)))5287continue;52885289gaudi2_init_edma_instance(hdev, seq);52905291gaudi2->hw_cap_initialized |= BIT_ULL(HW_CAP_EDMA_SHIFT + seq);5292}5293}5294}52955296/*5297* gaudi2_arm_monitors_for_virt_msix_db() - Arm monitors for writing to the virtual MSI-X doorbell.5298* @hdev: pointer to habanalabs device structure.5299* @sob_id: sync object ID.5300* @first_mon_id: ID of first monitor out of 3 consecutive monitors.5301* @interrupt_id: interrupt ID.5302*5303* Some initiators cannot have HBW address in their completion address registers, and thus cannot5304* write directly to the HBW host memory of the virtual MSI-X doorbell.5305* Instead, they are configured to LBW write to a sync object, and a monitor will do the HBW write.5306*5307* The mechanism in the sync manager block is composed of a master monitor with 3 messages.5308* In addition to the HBW write, the other 2 messages are for preparing the monitor to next5309* completion, by decrementing the sync object value and re-arming the monitor.5310*/5311static void gaudi2_arm_monitors_for_virt_msix_db(struct hl_device *hdev, u32 sob_id,5312u32 first_mon_id, u32 interrupt_id)5313{5314u32 sob_offset, first_mon_offset, mon_offset, payload, sob_group, mode, arm, config;5315struct gaudi2_device *gaudi2 = hdev->asic_specific;5316u64 addr;5317u8 mask;53185319/* Reset the SOB value */5320sob_offset = sob_id * sizeof(u32);5321WREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset, 0);53225323/* Configure 3 monitors:5324* 1. Write interrupt ID to the virtual MSI-X doorbell (master monitor)5325* 2. Decrement SOB value by 1.5326* 3. Re-arm the master monitor.5327*/53285329first_mon_offset = first_mon_id * sizeof(u32);53305331/* 2nd monitor: Decrement SOB value by 1 */5332mon_offset = first_mon_offset + sizeof(u32);53335334addr = CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;5335WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, lower_32_bits(addr));5336WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + mon_offset, upper_32_bits(addr));53375338payload = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_VAL_MASK, 0x7FFF) | /* "-1" */5339FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_SIGN_MASK, 1) |5340FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_INC_MASK, 1);5341WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, payload);53425343/* 3rd monitor: Re-arm the master monitor */5344mon_offset = first_mon_offset + 2 * sizeof(u32);53455346addr = CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + first_mon_offset;5347WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, lower_32_bits(addr));5348WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + mon_offset, upper_32_bits(addr));53495350sob_group = sob_id / 8;5351mask = ~BIT(sob_id & 0x7);5352mode = 0; /* comparison mode is "greater than or equal to" */5353arm = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SID_MASK, sob_group) |5354FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_MASK_MASK, mask) |5355FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOP_MASK, mode) |5356FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOD_MASK, 1);53575358payload = arm;5359WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, payload);53605361/* 1st monitor (master): Write interrupt ID to the virtual MSI-X doorbell */5362mon_offset = first_mon_offset;53635364config = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_WR_NUM_MASK, 2); /* "2": 3 writes */5365WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + mon_offset, config);53665367addr = gaudi2->virt_msix_db_dma_addr;5368WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, lower_32_bits(addr));5369WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + mon_offset, upper_32_bits(addr));53705371payload = interrupt_id;5372WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, payload);53735374WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + mon_offset, arm);5375}53765377static void gaudi2_prepare_sm_for_virt_msix_db(struct hl_device *hdev)5378{5379u32 decoder_id, sob_id, first_mon_id, interrupt_id;5380struct asic_fixed_properties *prop = &hdev->asic_prop;53815382/* Decoder normal/abnormal interrupts */5383for (decoder_id = 0 ; decoder_id < NUMBER_OF_DEC ; ++decoder_id) {5384if (!(prop->decoder_enabled_mask & BIT(decoder_id)))5385continue;53865387sob_id = GAUDI2_RESERVED_SOB_DEC_NRM_FIRST + decoder_id;5388first_mon_id = GAUDI2_RESERVED_MON_DEC_NRM_FIRST + 3 * decoder_id;5389interrupt_id = GAUDI2_IRQ_NUM_DCORE0_DEC0_NRM + 2 * decoder_id;5390gaudi2_arm_monitors_for_virt_msix_db(hdev, sob_id, first_mon_id, interrupt_id);53915392sob_id = GAUDI2_RESERVED_SOB_DEC_ABNRM_FIRST + decoder_id;5393first_mon_id = GAUDI2_RESERVED_MON_DEC_ABNRM_FIRST + 3 * decoder_id;5394interrupt_id += 1;5395gaudi2_arm_monitors_for_virt_msix_db(hdev, sob_id, first_mon_id, interrupt_id);5396}5397}53985399static void gaudi2_init_sm(struct hl_device *hdev)5400{5401struct gaudi2_device *gaudi2 = hdev->asic_specific;5402u64 cq_address;5403u32 reg_val;5404int i;54055406/* Enable HBW/LBW CQ for completion monitors */5407reg_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_CQ_EN_MASK, 1);5408reg_val |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_LBW_EN_MASK, 1);54095410for (i = 0 ; i < GAUDI2_MAX_PENDING_CS ; i++)5411WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + (4 * i), reg_val);54125413/* Enable only HBW CQ for KDMA completion monitor */5414reg_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_CONFIG_CQ_EN_MASK, 1);5415WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + (4 * i), reg_val);54165417/* Init CQ0 DB - configure the monitor to trigger MSI-X interrupt */5418WREG32(mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0, lower_32_bits(gaudi2->virt_msix_db_dma_addr));5419WREG32(mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0, upper_32_bits(gaudi2->virt_msix_db_dma_addr));5420WREG32(mmDCORE0_SYNC_MNGR_GLBL_LBW_DATA_0, GAUDI2_IRQ_NUM_COMPLETION);54215422for (i = 0 ; i < GAUDI2_RESERVED_CQ_NUMBER ; i++) {5423cq_address =5424hdev->completion_queue[i].bus_address;54255426WREG32(mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_L_0 + (4 * i),5427lower_32_bits(cq_address));5428WREG32(mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_H_0 + (4 * i),5429upper_32_bits(cq_address));5430WREG32(mmDCORE0_SYNC_MNGR_GLBL_CQ_SIZE_LOG2_0 + (4 * i),5431ilog2(HL_CQ_SIZE_IN_BYTES));5432}54335434/* Configure kernel ASID and MMU BP*/5435WREG32(mmDCORE0_SYNC_MNGR_GLBL_ASID_SEC, 0x10000);5436WREG32(mmDCORE0_SYNC_MNGR_GLBL_ASID_NONE_SEC_PRIV, 0);54375438/* Initialize sync objects and monitors which are used for the virtual MSI-X doorbell */5439gaudi2_prepare_sm_for_virt_msix_db(hdev);5440}54415442static void gaudi2_init_mme_acc(struct hl_device *hdev, u32 reg_base)5443{5444struct gaudi2_device *gaudi2 = hdev->asic_specific;5445u32 reg_val;5446int i;54475448reg_val = FIELD_PREP(MME_ACC_INTR_MASK_WBC_ERR_RESP_MASK, 0);5449reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_SRC_POS_INF_MASK, 1);5450reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_SRC_NEG_INF_MASK, 1);5451reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_SRC_NAN_MASK, 1);5452reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_RESULT_POS_INF_MASK, 1);5453reg_val |= FIELD_PREP(MME_ACC_INTR_MASK_AP_RESULT_NEG_INF_MASK, 1);54545455WREG32(reg_base + MME_ACC_INTR_MASK_OFFSET, reg_val);5456WREG32(reg_base + MME_ACC_AP_LFSR_POLY_OFFSET, 0x80DEADAF);54575458for (i = 0 ; i < MME_NUM_OF_LFSR_SEEDS ; i++) {5459WREG32(reg_base + MME_ACC_AP_LFSR_SEED_SEL_OFFSET, i);5460WREG32(reg_base + MME_ACC_AP_LFSR_SEED_WDATA_OFFSET, gaudi2->lfsr_rand_seeds[i]);5461}5462}54635464static void gaudi2_init_dcore_mme(struct hl_device *hdev, int dcore_id,5465bool config_qman_only)5466{5467u32 queue_id_base, reg_base;54685469switch (dcore_id) {5470case 0:5471queue_id_base = GAUDI2_QUEUE_ID_DCORE0_MME_0_0;5472break;5473case 1:5474queue_id_base = GAUDI2_QUEUE_ID_DCORE1_MME_0_0;5475break;5476case 2:5477queue_id_base = GAUDI2_QUEUE_ID_DCORE2_MME_0_0;5478break;5479case 3:5480queue_id_base = GAUDI2_QUEUE_ID_DCORE3_MME_0_0;5481break;5482default:5483dev_err(hdev->dev, "Invalid dcore id %u\n", dcore_id);5484return;5485}54865487if (!config_qman_only) {5488reg_base = gaudi2_mme_acc_blocks_bases[dcore_id];5489gaudi2_init_mme_acc(hdev, reg_base);5490}54915492reg_base = gaudi2_qm_blocks_bases[queue_id_base];5493gaudi2_init_qman(hdev, reg_base, queue_id_base);5494}54955496static void gaudi2_init_mme(struct hl_device *hdev)5497{5498struct gaudi2_device *gaudi2 = hdev->asic_specific;5499int i;55005501if ((gaudi2->hw_cap_initialized & HW_CAP_MME_MASK) == HW_CAP_MME_MASK)5502return;55035504for (i = 0 ; i < NUM_OF_DCORES ; i++) {5505gaudi2_init_dcore_mme(hdev, i, false);55065507gaudi2->hw_cap_initialized |= BIT_ULL(HW_CAP_MME_SHIFT + i);5508}5509}55105511static void gaudi2_init_tpc_cfg(struct hl_device *hdev, u32 reg_base)5512{5513/* Mask arithmetic and QM interrupts in TPC */5514WREG32(reg_base + TPC_CFG_TPC_INTR_MASK_OFFSET, 0x23FFFE);55155516/* Set 16 cache lines */5517WREG32(reg_base + TPC_CFG_MSS_CONFIG_OFFSET,55182 << DCORE0_TPC0_CFG_MSS_CONFIG_ICACHE_FETCH_LINE_NUM_SHIFT);5519}55205521struct gaudi2_tpc_init_cfg_data {5522enum gaudi2_queue_id dcore_tpc_qid_base[NUM_OF_DCORES];5523};55245525static void gaudi2_init_tpc_config(struct hl_device *hdev, int dcore, int inst,5526u32 offset, struct iterate_module_ctx *ctx)5527{5528struct gaudi2_device *gaudi2 = hdev->asic_specific;5529struct gaudi2_tpc_init_cfg_data *cfg_data = ctx->data;5530u32 queue_id_base;5531u8 seq;55325533queue_id_base = cfg_data->dcore_tpc_qid_base[dcore] + (inst * NUM_OF_PQ_PER_QMAN);55345535if (dcore == 0 && inst == (NUM_DCORE0_TPC - 1))5536/* gets last sequence number */5537seq = NUM_OF_DCORES * NUM_OF_TPC_PER_DCORE;5538else5539seq = dcore * NUM_OF_TPC_PER_DCORE + inst;55405541gaudi2_init_tpc_cfg(hdev, mmDCORE0_TPC0_CFG_BASE + offset);5542gaudi2_init_qman(hdev, mmDCORE0_TPC0_QM_BASE + offset, queue_id_base);55435544gaudi2->tpc_hw_cap_initialized |= BIT_ULL(HW_CAP_TPC_SHIFT + seq);5545}55465547static void gaudi2_init_tpc(struct hl_device *hdev)5548{5549struct gaudi2_device *gaudi2 = hdev->asic_specific;5550struct gaudi2_tpc_init_cfg_data init_cfg_data;5551struct iterate_module_ctx tpc_iter;55525553if (!hdev->asic_prop.tpc_enabled_mask)5554return;55555556if ((gaudi2->tpc_hw_cap_initialized & HW_CAP_TPC_MASK) == HW_CAP_TPC_MASK)5557return;55585559init_cfg_data.dcore_tpc_qid_base[0] = GAUDI2_QUEUE_ID_DCORE0_TPC_0_0;5560init_cfg_data.dcore_tpc_qid_base[1] = GAUDI2_QUEUE_ID_DCORE1_TPC_0_0;5561init_cfg_data.dcore_tpc_qid_base[2] = GAUDI2_QUEUE_ID_DCORE2_TPC_0_0;5562init_cfg_data.dcore_tpc_qid_base[3] = GAUDI2_QUEUE_ID_DCORE3_TPC_0_0;5563tpc_iter.fn = &gaudi2_init_tpc_config;5564tpc_iter.data = &init_cfg_data;5565gaudi2_iterate_tpcs(hdev, &tpc_iter);5566}55675568static void gaudi2_init_rotator(struct hl_device *hdev)5569{5570struct gaudi2_device *gaudi2 = hdev->asic_specific;5571u32 i, reg_base, queue_id;55725573queue_id = GAUDI2_QUEUE_ID_ROT_0_0;55745575for (i = 0 ; i < NUM_OF_ROT ; i++, queue_id += NUM_OF_PQ_PER_QMAN) {5576reg_base = gaudi2_qm_blocks_bases[queue_id];5577gaudi2_init_qman(hdev, reg_base, queue_id);55785579gaudi2->hw_cap_initialized |= BIT_ULL(HW_CAP_ROT_SHIFT + i);5580}5581}55825583static void gaudi2_init_vdec_brdg_ctrl(struct hl_device *hdev, u64 base_addr, u32 decoder_id)5584{5585u32 sob_id;55865587/* VCMD normal interrupt */5588sob_id = GAUDI2_RESERVED_SOB_DEC_NRM_FIRST + decoder_id;5589WREG32(base_addr + BRDG_CTRL_NRM_MSIX_LBW_AWADDR,5590mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_id * sizeof(u32));5591WREG32(base_addr + BRDG_CTRL_NRM_MSIX_LBW_WDATA, GAUDI2_SOB_INCREMENT_BY_ONE);55925593/* VCMD abnormal interrupt */5594sob_id = GAUDI2_RESERVED_SOB_DEC_ABNRM_FIRST + decoder_id;5595WREG32(base_addr + BRDG_CTRL_ABNRM_MSIX_LBW_AWADDR,5596mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_id * sizeof(u32));5597WREG32(base_addr + BRDG_CTRL_ABNRM_MSIX_LBW_WDATA, GAUDI2_SOB_INCREMENT_BY_ONE);5598}55995600static void gaudi2_init_dec(struct hl_device *hdev)5601{5602struct gaudi2_device *gaudi2 = hdev->asic_specific;5603u32 dcore_id, dec_id, dec_bit;5604u64 base_addr;56055606if (!hdev->asic_prop.decoder_enabled_mask)5607return;56085609if ((gaudi2->dec_hw_cap_initialized & HW_CAP_DEC_MASK) == HW_CAP_DEC_MASK)5610return;56115612for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++)5613for (dec_id = 0 ; dec_id < NUM_OF_DEC_PER_DCORE ; dec_id++) {5614dec_bit = dcore_id * NUM_OF_DEC_PER_DCORE + dec_id;56155616if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))5617continue;56185619base_addr = mmDCORE0_DEC0_CMD_BASE +5620BRDG_CTRL_BLOCK_OFFSET +5621dcore_id * DCORE_OFFSET +5622dec_id * DCORE_VDEC_OFFSET;56235624gaudi2_init_vdec_brdg_ctrl(hdev, base_addr, dec_bit);56255626gaudi2->dec_hw_cap_initialized |= BIT_ULL(HW_CAP_DEC_SHIFT + dec_bit);5627}56285629for (dec_id = 0 ; dec_id < NUM_OF_PCIE_VDEC ; dec_id++) {5630dec_bit = PCIE_DEC_SHIFT + dec_id;5631if (!(hdev->asic_prop.decoder_enabled_mask & BIT(dec_bit)))5632continue;56335634base_addr = mmPCIE_DEC0_CMD_BASE + BRDG_CTRL_BLOCK_OFFSET +5635dec_id * DCORE_VDEC_OFFSET;56365637gaudi2_init_vdec_brdg_ctrl(hdev, base_addr, dec_bit);56385639gaudi2->dec_hw_cap_initialized |= BIT_ULL(HW_CAP_DEC_SHIFT + dec_bit);5640}5641}56425643static int gaudi2_mmu_update_asid_hop0_addr(struct hl_device *hdev,5644u32 stlb_base, u32 asid, u64 phys_addr)5645{5646u32 status, timeout_usec;5647int rc;56485649if (hdev->pldm || !hdev->pdev)5650timeout_usec = GAUDI2_PLDM_MMU_TIMEOUT_USEC;5651else5652timeout_usec = MMU_CONFIG_TIMEOUT_USEC;56535654WREG32(stlb_base + STLB_ASID_OFFSET, asid);5655WREG32(stlb_base + STLB_HOP0_PA43_12_OFFSET, phys_addr >> MMU_HOP0_PA43_12_SHIFT);5656WREG32(stlb_base + STLB_HOP0_PA63_44_OFFSET, phys_addr >> MMU_HOP0_PA63_44_SHIFT);5657WREG32(stlb_base + STLB_BUSY_OFFSET, 0x80000000);56585659rc = hl_poll_timeout(5660hdev,5661stlb_base + STLB_BUSY_OFFSET,5662status,5663!(status & 0x80000000),56641000,5665timeout_usec);56665667if (rc) {5668dev_err(hdev->dev, "Timeout during MMU hop0 config of asid %d\n", asid);5669return rc;5670}56715672return 0;5673}56745675static void gaudi2_mmu_send_invalidate_cache_cmd(struct hl_device *hdev, u32 stlb_base,5676u32 start_offset, u32 inv_start_val,5677u32 flags)5678{5679/* clear PMMU mem line cache (only needed in mmu range invalidation) */5680if (flags & MMU_OP_CLEAR_MEMCACHE)5681WREG32(mmPMMU_HBW_STLB_MEM_CACHE_INVALIDATION, 0x1);56825683if (flags & MMU_OP_SKIP_LOW_CACHE_INV)5684return;56855686WREG32(stlb_base + start_offset, inv_start_val);5687}56885689static int gaudi2_mmu_invalidate_cache_status_poll(struct hl_device *hdev, u32 stlb_base,5690struct gaudi2_cache_invld_params *inv_params)5691{5692u32 status, timeout_usec, start_offset;5693int rc;56945695timeout_usec = (hdev->pldm) ? GAUDI2_PLDM_MMU_TIMEOUT_USEC :5696GAUDI2_MMU_CACHE_INV_TIMEOUT_USEC;56975698/* poll PMMU mem line cache (only needed in mmu range invalidation) */5699if (inv_params->flags & MMU_OP_CLEAR_MEMCACHE) {5700rc = hl_poll_timeout(5701hdev,5702mmPMMU_HBW_STLB_MEM_CACHE_INV_STATUS,5703status,5704status & 0x1,57051000,5706timeout_usec);57075708if (rc)5709return rc;57105711/* Need to manually reset the status to 0 */5712WREG32(mmPMMU_HBW_STLB_MEM_CACHE_INV_STATUS, 0x0);5713}57145715/* Lower cache does not work with cache lines, hence we can skip its5716* invalidation upon map and invalidate only upon unmap5717*/5718if (inv_params->flags & MMU_OP_SKIP_LOW_CACHE_INV)5719return 0;57205721start_offset = inv_params->range_invalidation ?5722STLB_RANGE_CACHE_INVALIDATION_OFFSET : STLB_INV_ALL_START_OFFSET;57235724rc = hl_poll_timeout(5725hdev,5726stlb_base + start_offset,5727status,5728!(status & 0x1),57291000,5730timeout_usec);57315732return rc;5733}57345735bool gaudi2_is_hmmu_enabled(struct hl_device *hdev, int dcore_id, int hmmu_id)5736{5737struct gaudi2_device *gaudi2 = hdev->asic_specific;5738u32 hw_cap;57395740hw_cap = HW_CAP_DCORE0_DMMU0 << (NUM_OF_HMMU_PER_DCORE * dcore_id + hmmu_id);57415742if (gaudi2->hw_cap_initialized & hw_cap)5743return true;57445745return false;5746}57475748/* this function shall be called only for HMMUs for which capability bit is set */5749static inline u32 get_hmmu_stlb_base(int dcore_id, int hmmu_id)5750{5751u32 offset;57525753offset = (u32) (dcore_id * DCORE_OFFSET + hmmu_id * DCORE_HMMU_OFFSET);5754return (u32)(mmDCORE0_HMMU0_STLB_BASE + offset);5755}57565757static void gaudi2_mmu_invalidate_cache_trigger(struct hl_device *hdev, u32 stlb_base,5758struct gaudi2_cache_invld_params *inv_params)5759{5760u32 start_offset;57615762if (inv_params->range_invalidation) {5763/* Set the addresses range5764* Note: that the start address we set in register, is not included in5765* the range of the invalidation, by design.5766* that's why we need to set lower address than the one we actually5767* want to be included in the range invalidation.5768*/5769u64 start = inv_params->start_va - 1;57705771start_offset = STLB_RANGE_CACHE_INVALIDATION_OFFSET;57725773WREG32(stlb_base + STLB_RANGE_INV_START_LSB_OFFSET,5774start >> MMU_RANGE_INV_VA_LSB_SHIFT);57755776WREG32(stlb_base + STLB_RANGE_INV_START_MSB_OFFSET,5777start >> MMU_RANGE_INV_VA_MSB_SHIFT);57785779WREG32(stlb_base + STLB_RANGE_INV_END_LSB_OFFSET,5780inv_params->end_va >> MMU_RANGE_INV_VA_LSB_SHIFT);57815782WREG32(stlb_base + STLB_RANGE_INV_END_MSB_OFFSET,5783inv_params->end_va >> MMU_RANGE_INV_VA_MSB_SHIFT);5784} else {5785start_offset = STLB_INV_ALL_START_OFFSET;5786}57875788gaudi2_mmu_send_invalidate_cache_cmd(hdev, stlb_base, start_offset,5789inv_params->inv_start_val, inv_params->flags);5790}57915792static inline void gaudi2_hmmu_invalidate_cache_trigger(struct hl_device *hdev,5793int dcore_id, int hmmu_id,5794struct gaudi2_cache_invld_params *inv_params)5795{5796u32 stlb_base = get_hmmu_stlb_base(dcore_id, hmmu_id);57975798gaudi2_mmu_invalidate_cache_trigger(hdev, stlb_base, inv_params);5799}58005801static inline int gaudi2_hmmu_invalidate_cache_status_poll(struct hl_device *hdev,5802int dcore_id, int hmmu_id,5803struct gaudi2_cache_invld_params *inv_params)5804{5805u32 stlb_base = get_hmmu_stlb_base(dcore_id, hmmu_id);58065807return gaudi2_mmu_invalidate_cache_status_poll(hdev, stlb_base, inv_params);5808}58095810static int gaudi2_hmmus_invalidate_cache(struct hl_device *hdev,5811struct gaudi2_cache_invld_params *inv_params)5812{5813int dcore_id, hmmu_id;58145815/* first send all invalidation commands */5816for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {5817for (hmmu_id = 0 ; hmmu_id < NUM_OF_HMMU_PER_DCORE ; hmmu_id++) {5818if (!gaudi2_is_hmmu_enabled(hdev, dcore_id, hmmu_id))5819continue;58205821gaudi2_hmmu_invalidate_cache_trigger(hdev, dcore_id, hmmu_id, inv_params);5822}5823}58245825/* next, poll all invalidations status */5826for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {5827for (hmmu_id = 0 ; hmmu_id < NUM_OF_HMMU_PER_DCORE ; hmmu_id++) {5828int rc;58295830if (!gaudi2_is_hmmu_enabled(hdev, dcore_id, hmmu_id))5831continue;58325833rc = gaudi2_hmmu_invalidate_cache_status_poll(hdev, dcore_id, hmmu_id,5834inv_params);5835if (rc)5836return rc;5837}5838}58395840return 0;5841}58425843static int gaudi2_mmu_invalidate_cache(struct hl_device *hdev, bool is_hard, u32 flags)5844{5845struct gaudi2_device *gaudi2 = hdev->asic_specific;5846struct gaudi2_cache_invld_params invld_params;5847int rc = 0;58485849if (hdev->reset_info.hard_reset_pending)5850return rc;58515852invld_params.range_invalidation = false;5853invld_params.inv_start_val = 1;58545855if ((flags & MMU_OP_USERPTR) && (gaudi2->hw_cap_initialized & HW_CAP_PMMU)) {5856invld_params.flags = flags;5857gaudi2_mmu_invalidate_cache_trigger(hdev, mmPMMU_HBW_STLB_BASE, &invld_params);5858rc = gaudi2_mmu_invalidate_cache_status_poll(hdev, mmPMMU_HBW_STLB_BASE,5859&invld_params);5860} else if (flags & MMU_OP_PHYS_PACK) {5861invld_params.flags = 0;5862rc = gaudi2_hmmus_invalidate_cache(hdev, &invld_params);5863}58645865return rc;5866}58675868static int gaudi2_mmu_invalidate_cache_range(struct hl_device *hdev, bool is_hard,5869u32 flags, u32 asid, u64 va, u64 size)5870{5871struct gaudi2_cache_invld_params invld_params = {0};5872struct gaudi2_device *gaudi2 = hdev->asic_specific;5873u64 start_va, end_va;5874u32 inv_start_val;5875int rc = 0;58765877if (hdev->reset_info.hard_reset_pending)5878return 0;58795880inv_start_val = (1 << MMU_RANGE_INV_EN_SHIFT |58811 << MMU_RANGE_INV_ASID_EN_SHIFT |5882asid << MMU_RANGE_INV_ASID_SHIFT);5883start_va = va;5884end_va = start_va + size;58855886if ((flags & MMU_OP_USERPTR) && (gaudi2->hw_cap_initialized & HW_CAP_PMMU)) {5887/* As range invalidation does not support zero address we will5888* do full invalidation in this case5889*/5890if (start_va) {5891invld_params.range_invalidation = true;5892invld_params.start_va = start_va;5893invld_params.end_va = end_va;5894invld_params.inv_start_val = inv_start_val;5895invld_params.flags = flags | MMU_OP_CLEAR_MEMCACHE;5896} else {5897invld_params.range_invalidation = false;5898invld_params.inv_start_val = 1;5899invld_params.flags = flags;5900}590159025903gaudi2_mmu_invalidate_cache_trigger(hdev, mmPMMU_HBW_STLB_BASE, &invld_params);5904rc = gaudi2_mmu_invalidate_cache_status_poll(hdev, mmPMMU_HBW_STLB_BASE,5905&invld_params);5906if (rc)5907return rc;59085909} else if (flags & MMU_OP_PHYS_PACK) {5910invld_params.start_va = gaudi2_mmu_scramble_addr(hdev, start_va);5911invld_params.end_va = gaudi2_mmu_scramble_addr(hdev, end_va);5912invld_params.inv_start_val = inv_start_val;5913invld_params.flags = flags;5914rc = gaudi2_hmmus_invalidate_cache(hdev, &invld_params);5915}59165917return rc;5918}59195920static int gaudi2_mmu_update_hop0_addr(struct hl_device *hdev, u32 stlb_base,5921bool host_resident_pgt)5922{5923struct asic_fixed_properties *prop = &hdev->asic_prop;5924u64 hop0_addr;5925u32 asid, max_asid = prop->max_asid;5926int rc;59275928/* it takes too much time to init all of the ASIDs on palladium */5929if (hdev->pldm)5930max_asid = min((u32) 8, max_asid);59315932for (asid = 0 ; asid < max_asid ; asid++) {5933if (host_resident_pgt)5934hop0_addr = hdev->mmu_priv.hr.mmu_asid_hop0[asid].phys_addr;5935else5936hop0_addr = prop->mmu_pgt_addr + (asid * prop->dmmu.hop_table_size);59375938rc = gaudi2_mmu_update_asid_hop0_addr(hdev, stlb_base, asid, hop0_addr);5939if (rc) {5940dev_err(hdev->dev, "failed to set hop0 addr for asid %d\n", asid);5941return rc;5942}5943}59445945return 0;5946}59475948static int gaudi2_mmu_init_common(struct hl_device *hdev, u32 mmu_base, u32 stlb_base,5949bool host_resident_pgt)5950{5951u32 status, timeout_usec;5952int rc;59535954if (hdev->pldm || !hdev->pdev)5955timeout_usec = GAUDI2_PLDM_MMU_TIMEOUT_USEC;5956else5957timeout_usec = GAUDI2_MMU_CACHE_INV_TIMEOUT_USEC;59585959WREG32(stlb_base + STLB_INV_ALL_START_OFFSET, 1);59605961rc = hl_poll_timeout(5962hdev,5963stlb_base + STLB_SRAM_INIT_OFFSET,5964status,5965!status,59661000,5967timeout_usec);59685969if (rc)5970dev_notice_ratelimited(hdev->dev, "Timeout when waiting for MMU SRAM init\n");59715972rc = gaudi2_mmu_update_hop0_addr(hdev, stlb_base, host_resident_pgt);5973if (rc)5974return rc;59755976WREG32(mmu_base + MMU_BYPASS_OFFSET, 0);59775978rc = hl_poll_timeout(5979hdev,5980stlb_base + STLB_INV_ALL_START_OFFSET,5981status,5982!status,59831000,5984timeout_usec);59855986if (rc)5987dev_notice_ratelimited(hdev->dev, "Timeout when waiting for MMU invalidate all\n");59885989WREG32(mmu_base + MMU_ENABLE_OFFSET, 1);59905991return rc;5992}59935994static int gaudi2_pci_mmu_init(struct hl_device *hdev)5995{5996struct asic_fixed_properties *prop = &hdev->asic_prop;5997struct gaudi2_device *gaudi2 = hdev->asic_specific;5998u32 mmu_base, stlb_base;5999int rc;60006001if (gaudi2->hw_cap_initialized & HW_CAP_PMMU)6002return 0;60036004mmu_base = mmPMMU_HBW_MMU_BASE;6005stlb_base = mmPMMU_HBW_STLB_BASE;60066007RMWREG32_SHIFTED(stlb_base + STLB_HOP_CONFIGURATION_OFFSET,6008(0 << PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_HOP_SHIFT) |6009(5 << PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_SHIFT) |6010(4 << PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_SHIFT) |6011(5 << PMMU_HBW_STLB_HOP_CONFIGURATION_LAST_HOP_SHIFT) |6012(5 << PMMU_HBW_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_SHIFT),6013PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_HOP_MASK |6014PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_MASK |6015PMMU_HBW_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_MASK |6016PMMU_HBW_STLB_HOP_CONFIGURATION_LAST_HOP_MASK |6017PMMU_HBW_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_MASK);60186019WREG32(stlb_base + STLB_LL_LOOKUP_MASK_63_32_OFFSET, 0);60206021if (PAGE_SIZE == SZ_64K) {6022/* Set page sizes to 64K on hop5 and 16M on hop4 + enable 8 bit hops */6023RMWREG32_SHIFTED(mmu_base + MMU_STATIC_MULTI_PAGE_SIZE_OFFSET,6024FIELD_PREP(DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP5_PAGE_SIZE_MASK, 4) |6025FIELD_PREP(DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP4_PAGE_SIZE_MASK, 3) |6026FIELD_PREP(6027DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_CFG_8_BITS_HOP_MODE_EN_MASK,60281),6029DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP5_PAGE_SIZE_MASK |6030DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_HOP4_PAGE_SIZE_MASK |6031DCORE0_HMMU0_MMU_STATIC_MULTI_PAGE_SIZE_CFG_8_BITS_HOP_MODE_EN_MASK);6032}60336034WREG32(mmu_base + MMU_SPI_SEI_MASK_OFFSET, GAUDI2_PMMU_SPI_SEI_ENABLE_MASK);60356036rc = gaudi2_mmu_init_common(hdev, mmu_base, stlb_base, prop->pmmu.host_resident);6037if (rc)6038return rc;60396040gaudi2->hw_cap_initialized |= HW_CAP_PMMU;60416042return 0;6043}60446045static int gaudi2_dcore_hmmu_init(struct hl_device *hdev, int dcore_id,6046int hmmu_id)6047{6048struct asic_fixed_properties *prop = &hdev->asic_prop;6049struct gaudi2_device *gaudi2 = hdev->asic_specific;6050u32 offset, mmu_base, stlb_base, hw_cap;6051u8 dmmu_seq;6052int rc;60536054dmmu_seq = NUM_OF_HMMU_PER_DCORE * dcore_id + hmmu_id;6055hw_cap = HW_CAP_DCORE0_DMMU0 << dmmu_seq;60566057/*6058* return if DMMU is already initialized or if it's not out of6059* isolation (due to cluster binning)6060*/6061if ((gaudi2->hw_cap_initialized & hw_cap) || !(prop->hmmu_hif_enabled_mask & BIT(dmmu_seq)))6062return 0;60636064offset = (u32) (dcore_id * DCORE_OFFSET + hmmu_id * DCORE_HMMU_OFFSET);6065mmu_base = mmDCORE0_HMMU0_MMU_BASE + offset;6066stlb_base = mmDCORE0_HMMU0_STLB_BASE + offset;60676068RMWREG32(mmu_base + MMU_STATIC_MULTI_PAGE_SIZE_OFFSET, 5 /* 64MB */,6069MMU_STATIC_MULTI_PAGE_SIZE_HOP4_PAGE_SIZE_MASK);60706071RMWREG32_SHIFTED(stlb_base + STLB_HOP_CONFIGURATION_OFFSET,6072FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_HOP_MASK, 0) |6073FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_MASK, 3) |6074FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_MASK, 3) |6075FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_LAST_HOP_MASK, 3) |6076FIELD_PREP(DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_MASK, 3),6077DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_HOP_MASK |6078DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_SMALL_P_MASK |6079DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FIRST_LOOKUP_HOP_LARGE_P_MASK |6080DCORE0_HMMU0_STLB_HOP_CONFIGURATION_LAST_HOP_MASK |6081DCORE0_HMMU0_STLB_HOP_CONFIGURATION_FOLLOWER_HOP_MASK);60826083RMWREG32(stlb_base + STLB_HOP_CONFIGURATION_OFFSET, 1,6084STLB_HOP_CONFIGURATION_ONLY_LARGE_PAGE_MASK);60856086WREG32(mmu_base + MMU_SPI_SEI_MASK_OFFSET, GAUDI2_HMMU_SPI_SEI_ENABLE_MASK);60876088rc = gaudi2_mmu_init_common(hdev, mmu_base, stlb_base, prop->dmmu.host_resident);6089if (rc)6090return rc;60916092gaudi2->hw_cap_initialized |= hw_cap;60936094return 0;6095}60966097static int gaudi2_hbm_mmu_init(struct hl_device *hdev)6098{6099int rc, dcore_id, hmmu_id;61006101for (dcore_id = 0 ; dcore_id < NUM_OF_DCORES ; dcore_id++)6102for (hmmu_id = 0 ; hmmu_id < NUM_OF_HMMU_PER_DCORE; hmmu_id++) {6103rc = gaudi2_dcore_hmmu_init(hdev, dcore_id, hmmu_id);6104if (rc)6105return rc;6106}61076108return 0;6109}61106111static int gaudi2_mmu_init(struct hl_device *hdev)6112{6113int rc;61146115rc = gaudi2_pci_mmu_init(hdev);6116if (rc)6117return rc;61186119rc = gaudi2_hbm_mmu_init(hdev);6120if (rc)6121return rc;61226123return 0;6124}61256126static int gaudi2_hw_init(struct hl_device *hdev)6127{6128struct gaudi2_device *gaudi2 = hdev->asic_specific;6129int rc;61306131/* Let's mark in the H/W that we have reached this point. We check6132* this value in the reset_before_init function to understand whether6133* we need to reset the chip before doing H/W init. This register is6134* cleared by the H/W upon H/W reset6135*/6136WREG32(mmHW_STATE, HL_DEVICE_HW_STATE_DIRTY);61376138/* Perform read from the device to make sure device is up */6139RREG32(mmHW_STATE);61406141/* If iATU is done by FW, the HBM bar ALWAYS points to DRAM_PHYS_BASE.6142* So we set it here and if anyone tries to move it later to6143* a different address, there will be an error6144*/6145if (hdev->asic_prop.iatu_done_by_fw)6146gaudi2->dram_bar_cur_addr = DRAM_PHYS_BASE;61476148/*6149* Before pushing u-boot/linux to device, need to set the hbm bar to6150* base address of dram6151*/6152if (gaudi2_set_hbm_bar_base(hdev, DRAM_PHYS_BASE) == U64_MAX) {6153dev_err(hdev->dev, "failed to map HBM bar to DRAM base address\n");6154return -EIO;6155}61566157rc = gaudi2_init_cpu(hdev);6158if (rc) {6159dev_err(hdev->dev, "failed to initialize CPU\n");6160return rc;6161}61626163gaudi2_init_scrambler_hbm(hdev);6164gaudi2_init_kdma(hdev);61656166rc = gaudi2_init_cpu_queues(hdev, GAUDI2_CPU_TIMEOUT_USEC);6167if (rc) {6168dev_err(hdev->dev, "failed to initialize CPU H/W queues %d\n", rc);6169return rc;6170}61716172rc = gaudi2->cpucp_info_get(hdev);6173if (rc) {6174dev_err(hdev->dev, "Failed to get cpucp info\n");6175return rc;6176}61776178rc = gaudi2_mmu_init(hdev);6179if (rc)6180return rc;61816182gaudi2_init_pdma(hdev);6183gaudi2_init_edma(hdev);6184gaudi2_init_sm(hdev);6185gaudi2_init_tpc(hdev);6186gaudi2_init_mme(hdev);6187gaudi2_init_rotator(hdev);6188gaudi2_init_dec(hdev);6189gaudi2_enable_timestamp(hdev);61906191rc = gaudi2_coresight_init(hdev);6192if (rc)6193goto disable_queues;61946195rc = gaudi2_enable_msix(hdev);6196if (rc)6197goto disable_queues;61986199/* Perform read from the device to flush all configuration */6200RREG32(mmHW_STATE);62016202return 0;62036204disable_queues:6205gaudi2_disable_dma_qmans(hdev);6206gaudi2_disable_mme_qmans(hdev);6207gaudi2_disable_tpc_qmans(hdev);6208gaudi2_disable_rot_qmans(hdev);6209gaudi2_disable_nic_qmans(hdev);62106211gaudi2_disable_timestamp(hdev);62126213return rc;6214}62156216/**6217* gaudi2_send_hard_reset_cmd - common function to handle reset6218*6219* @hdev: pointer to the habanalabs device structure6220*6221* This function handles the various possible scenarios for reset.6222* It considers if reset is handled by driver\FW and what FW components are loaded6223*/6224static void gaudi2_send_hard_reset_cmd(struct hl_device *hdev)6225{6226struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;6227bool heartbeat_reset, preboot_only, cpu_initialized = false;6228struct gaudi2_device *gaudi2 = hdev->asic_specific;6229u32 cpu_boot_status;62306231preboot_only = (hdev->fw_loader.fw_comp_loaded == FW_TYPE_PREBOOT_CPU);6232heartbeat_reset = (hdev->reset_info.curr_reset_cause == HL_RESET_CAUSE_HEARTBEAT);62336234/*6235* Handle corner case where failure was at cpu management app load,6236* and driver didn't detect any failure while loading the FW,6237* then at such scenario driver will send only HALT_MACHINE6238* and no one will respond to this request since FW already back to preboot6239* and it cannot handle such cmd.6240* In this case next time the management app loads it'll check on events register6241* which will still have the halt indication, and will reboot the device.6242* The solution is to let preboot clear all relevant registers before next boot6243* once driver send COMMS_RST_DEV.6244*/6245cpu_boot_status = RREG32(mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS);62466247if (gaudi2 && (gaudi2->hw_cap_initialized & HW_CAP_CPU) &&6248(cpu_boot_status == CPU_BOOT_STATUS_SRAM_AVAIL))6249cpu_initialized = true;62506251/*6252* when Linux/Bootfit exist this write to the SP can be interpreted in 2 ways:6253* 1. FW reset: FW initiate the reset sequence6254* 2. driver reset: FW will start HALT sequence (the preparations for the6255* reset but not the reset itself as it is not implemented6256* on their part) and LKD will wait to let FW complete the6257* sequence before issuing the reset6258*/6259if (!preboot_only && cpu_initialized) {6260WREG32(le32_to_cpu(dyn_regs->gic_host_halt_irq),6261gaudi2_irq_map_table[GAUDI2_EVENT_CPU_HALT_MACHINE].cpu_id);62626263msleep(GAUDI2_CPU_RESET_WAIT_MSEC);6264}62656266/*6267* When working with preboot (without Linux/Boot fit) we can6268* communicate only using the COMMS commands to issue halt/reset.6269*6270* For the case in which we are working with Linux/Bootfit this is a hail-mary6271* attempt to revive the card in the small chance that the f/w has6272* experienced a watchdog event, which caused it to return back to preboot.6273* In that case, triggering reset through GIC won't help. We need to6274* trigger the reset as if Linux wasn't loaded.6275*6276* We do it only if the reset cause was HB, because that would be the6277* indication of such an event.6278*6279* In case watchdog hasn't expired but we still got HB, then this won't6280* do any damage.6281*/62826283if (heartbeat_reset || preboot_only || !cpu_initialized) {6284if (hdev->asic_prop.hard_reset_done_by_fw)6285hl_fw_ask_hard_reset_without_linux(hdev);6286else6287hl_fw_ask_halt_machine_without_linux(hdev);6288}6289}62906291/**6292* gaudi2_execute_hard_reset - execute hard reset by driver/FW6293*6294* @hdev: pointer to the habanalabs device structure6295*6296* This function executes hard reset based on if driver/FW should do the reset6297*/6298static void gaudi2_execute_hard_reset(struct hl_device *hdev)6299{6300if (hdev->asic_prop.hard_reset_done_by_fw) {6301gaudi2_send_hard_reset_cmd(hdev);6302return;6303}63046305/* Set device to handle FLR by H/W as we will put the device6306* CPU to halt mode6307*/6308WREG32(mmPCIE_AUX_FLR_CTRL,6309(PCIE_AUX_FLR_CTRL_HW_CTRL_MASK | PCIE_AUX_FLR_CTRL_INT_MASK_MASK));63106311gaudi2_send_hard_reset_cmd(hdev);63126313WREG32(mmPSOC_RESET_CONF_SW_ALL_RST, 1);6314}63156316/**6317* gaudi2_execute_soft_reset - execute soft reset by driver/FW6318*6319* @hdev: pointer to the habanalabs device structure6320* @driver_performs_reset: true if driver should perform reset instead of f/w.6321* @poll_timeout_us: time to wait for response from f/w.6322*6323* This function executes soft reset based on if driver/FW should do the reset6324*/6325static int gaudi2_execute_soft_reset(struct hl_device *hdev, bool driver_performs_reset,6326u32 poll_timeout_us)6327{6328if (!driver_performs_reset)6329return hl_fw_send_soft_reset(hdev);63306331/* Block access to engines, QMANs and SM during reset, these6332* RRs will be reconfigured after soft reset.6333* PCIE_MSIX is left unsecured to allow NIC packets processing during the reset.6334*/6335gaudi2_write_rr_to_all_lbw_rtrs(hdev, RR_TYPE_LONG, NUM_LONG_LBW_RR - 1,6336mmDCORE0_TPC0_QM_DCCM_BASE, mmPCIE_MSIX_BASE);63376338gaudi2_write_rr_to_all_lbw_rtrs(hdev, RR_TYPE_LONG, NUM_LONG_LBW_RR - 2,6339mmPCIE_MSIX_BASE + HL_BLOCK_SIZE,6340mmPCIE_VDEC1_MSTR_IF_RR_SHRD_HBW_BASE + HL_BLOCK_SIZE);63416342WREG32(mmPSOC_RESET_CONF_SOFT_RST, 1);6343return 0;6344}63456346static void gaudi2_poll_btm_indication(struct hl_device *hdev, u32 poll_timeout_us)6347{6348int i, rc = 0;6349u32 reg_val;63506351/* We poll the BTM done indication multiple times after reset due to6352* a HW errata 'GAUDI2_0300'6353*/6354for (i = 0 ; i < GAUDI2_RESET_POLL_CNT ; i++)6355rc = hl_poll_timeout(6356hdev,6357mmPSOC_GLOBAL_CONF_BTM_FSM,6358reg_val,6359reg_val == 0,63601000,6361poll_timeout_us);63626363if (rc)6364dev_err(hdev->dev, "Timeout while waiting for device to reset 0x%x\n", reg_val);6365}63666367static int gaudi2_hw_fini(struct hl_device *hdev, bool hard_reset, bool fw_reset)6368{6369struct gaudi2_device *gaudi2 = hdev->asic_specific;6370u32 poll_timeout_us, reset_sleep_ms;6371bool driver_performs_reset = false;6372int rc;63736374if (hdev->pldm) {6375reset_sleep_ms = hard_reset ? GAUDI2_PLDM_HRESET_TIMEOUT_MSEC :6376GAUDI2_PLDM_SRESET_TIMEOUT_MSEC;6377poll_timeout_us = GAUDI2_PLDM_RESET_POLL_TIMEOUT_USEC;6378} else {6379reset_sleep_ms = GAUDI2_RESET_TIMEOUT_MSEC;6380poll_timeout_us = GAUDI2_RESET_POLL_TIMEOUT_USEC;6381}63826383if (fw_reset)6384goto skip_reset;63856386gaudi2_reset_arcs(hdev);63876388if (hard_reset) {6389driver_performs_reset = !hdev->asic_prop.hard_reset_done_by_fw;6390gaudi2_execute_hard_reset(hdev);6391} else {6392/*6393* As we have to support also work with preboot only (which does not supports6394* soft reset) we have to make sure that security is disabled before letting driver6395* do the reset. user shall control the BFE flags to avoid asking soft reset in6396* secured device with preboot only.6397*/6398driver_performs_reset = (hdev->fw_components == FW_TYPE_PREBOOT_CPU &&6399!hdev->asic_prop.fw_security_enabled);6400rc = gaudi2_execute_soft_reset(hdev, driver_performs_reset, poll_timeout_us);6401if (rc)6402return rc;6403}64046405skip_reset:6406if (driver_performs_reset || hard_reset) {6407/*6408* Instead of waiting for BTM indication we should wait for preboot ready:6409* Consider the below scenario:6410* 1. FW update is being triggered6411* - setting the dirty bit6412* 2. hard reset will be triggered due to the dirty bit6413* 3. FW initiates the reset:6414* - dirty bit cleared6415* - BTM indication cleared6416* - preboot ready indication cleared6417* 4. during hard reset:6418* - BTM indication will be set6419* - BIST test performed and another reset triggered6420* 5. only after this reset the preboot will set the preboot ready6421*6422* when polling on BTM indication alone we can lose sync with FW while trying to6423* communicate with FW that is during reset.6424* to overcome this we will always wait to preboot ready indication6425*/64266427/* without this sleep reset will not work */6428msleep(reset_sleep_ms);64296430if (hdev->fw_components & FW_TYPE_PREBOOT_CPU)6431hl_fw_wait_preboot_ready(hdev);6432else6433gaudi2_poll_btm_indication(hdev, poll_timeout_us);6434}64356436if (!gaudi2)6437return 0;64386439gaudi2->dec_hw_cap_initialized &= ~(HW_CAP_DEC_MASK);6440gaudi2->tpc_hw_cap_initialized &= ~(HW_CAP_TPC_MASK);64416442/*6443* Clear NIC capability mask in order for driver to re-configure6444* NIC QMANs. NIC ports will not be re-configured during soft6445* reset as we call gaudi2_nic_init only during hard reset6446*/6447gaudi2->nic_hw_cap_initialized &= ~(HW_CAP_NIC_MASK);64486449if (hard_reset) {6450gaudi2->hw_cap_initialized &=6451~(HW_CAP_DRAM | HW_CAP_CLK_GATE | HW_CAP_HBM_SCRAMBLER_MASK |6452HW_CAP_PMMU | HW_CAP_CPU | HW_CAP_CPU_Q |6453HW_CAP_SRAM_SCRAMBLER | HW_CAP_DMMU_MASK |6454HW_CAP_PDMA_MASK | HW_CAP_EDMA_MASK | HW_CAP_KDMA |6455HW_CAP_MME_MASK | HW_CAP_ROT_MASK);64566457memset(gaudi2->events_stat, 0, sizeof(gaudi2->events_stat));6458} else {6459gaudi2->hw_cap_initialized &=6460~(HW_CAP_CLK_GATE | HW_CAP_HBM_SCRAMBLER_SW_RESET |6461HW_CAP_PDMA_MASK | HW_CAP_EDMA_MASK | HW_CAP_MME_MASK |6462HW_CAP_ROT_MASK);6463}6464return 0;6465}64666467static int gaudi2_suspend(struct hl_device *hdev)6468{6469return hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_DISABLE_PCI_ACCESS, 0x0);6470}64716472static int gaudi2_resume(struct hl_device *hdev)6473{6474return gaudi2_init_iatu(hdev);6475}64766477static int gaudi2_mmap(struct hl_device *hdev, struct vm_area_struct *vma,6478void *cpu_addr, dma_addr_t dma_addr, size_t size)6479{6480int rc;64816482vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |6483VM_DONTCOPY | VM_NORESERVE);64846485#ifdef _HAS_DMA_MMAP_COHERENT64866487rc = dma_mmap_coherent(hdev->dev, vma, cpu_addr, dma_addr, size);6488if (rc)6489dev_err(hdev->dev, "dma_mmap_coherent error %d", rc);64906491#else64926493rc = remap_pfn_range(vma, vma->vm_start,6494virt_to_phys(cpu_addr) >> PAGE_SHIFT,6495size, vma->vm_page_prot);6496if (rc)6497dev_err(hdev->dev, "remap_pfn_range error %d", rc);64986499#endif65006501return rc;6502}65036504static bool gaudi2_is_queue_enabled(struct hl_device *hdev, u32 hw_queue_id)6505{6506struct gaudi2_device *gaudi2 = hdev->asic_specific;6507u64 hw_cap_mask = 0;6508u64 hw_tpc_cap_bit = 0;6509u64 hw_nic_cap_bit = 0;6510u64 hw_test_cap_bit = 0;65116512switch (hw_queue_id) {6513case GAUDI2_QUEUE_ID_PDMA_0_0:6514case GAUDI2_QUEUE_ID_PDMA_0_1:6515case GAUDI2_QUEUE_ID_PDMA_1_0:6516hw_cap_mask = HW_CAP_PDMA_MASK;6517break;6518case GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE0_EDMA_1_3:6519hw_test_cap_bit = HW_CAP_EDMA_SHIFT +6520((hw_queue_id - GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0) >> 2);6521break;6522case GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE1_EDMA_1_3:6523hw_test_cap_bit = HW_CAP_EDMA_SHIFT + NUM_OF_EDMA_PER_DCORE +6524((hw_queue_id - GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0) >> 2);6525break;6526case GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE2_EDMA_1_3:6527hw_test_cap_bit = HW_CAP_EDMA_SHIFT + 2 * NUM_OF_EDMA_PER_DCORE +6528((hw_queue_id - GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0) >> 2);6529break;6530case GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0...GAUDI2_QUEUE_ID_DCORE3_EDMA_1_3:6531hw_test_cap_bit = HW_CAP_EDMA_SHIFT + 3 * NUM_OF_EDMA_PER_DCORE +6532((hw_queue_id - GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0) >> 2);6533break;65346535case GAUDI2_QUEUE_ID_DCORE0_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE0_MME_0_3:6536hw_test_cap_bit = HW_CAP_MME_SHIFT;6537break;65386539case GAUDI2_QUEUE_ID_DCORE1_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE1_MME_0_3:6540hw_test_cap_bit = HW_CAP_MME_SHIFT + 1;6541break;65426543case GAUDI2_QUEUE_ID_DCORE2_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE2_MME_0_3:6544hw_test_cap_bit = HW_CAP_MME_SHIFT + 2;6545break;65466547case GAUDI2_QUEUE_ID_DCORE3_MME_0_0 ... GAUDI2_QUEUE_ID_DCORE3_MME_0_3:6548hw_test_cap_bit = HW_CAP_MME_SHIFT + 3;6549break;65506551case GAUDI2_QUEUE_ID_DCORE0_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE0_TPC_5_3:6552hw_tpc_cap_bit = HW_CAP_TPC_SHIFT +6553((hw_queue_id - GAUDI2_QUEUE_ID_DCORE0_TPC_0_0) >> 2);65546555/* special case where cap bit refers to the first queue id */6556if (!hw_tpc_cap_bit)6557return !!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(0));6558break;65596560case GAUDI2_QUEUE_ID_DCORE1_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE1_TPC_5_3:6561hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + NUM_OF_TPC_PER_DCORE +6562((hw_queue_id - GAUDI2_QUEUE_ID_DCORE1_TPC_0_0) >> 2);6563break;65646565case GAUDI2_QUEUE_ID_DCORE2_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE2_TPC_5_3:6566hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + (2 * NUM_OF_TPC_PER_DCORE) +6567((hw_queue_id - GAUDI2_QUEUE_ID_DCORE2_TPC_0_0) >> 2);6568break;65696570case GAUDI2_QUEUE_ID_DCORE3_TPC_0_0 ... GAUDI2_QUEUE_ID_DCORE3_TPC_5_3:6571hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + (3 * NUM_OF_TPC_PER_DCORE) +6572((hw_queue_id - GAUDI2_QUEUE_ID_DCORE3_TPC_0_0) >> 2);6573break;65746575case GAUDI2_QUEUE_ID_DCORE0_TPC_6_0 ... GAUDI2_QUEUE_ID_DCORE0_TPC_6_3:6576hw_tpc_cap_bit = HW_CAP_TPC_SHIFT + (4 * NUM_OF_TPC_PER_DCORE);6577break;65786579case GAUDI2_QUEUE_ID_ROT_0_0 ... GAUDI2_QUEUE_ID_ROT_1_3:6580hw_test_cap_bit = HW_CAP_ROT_SHIFT + ((hw_queue_id - GAUDI2_QUEUE_ID_ROT_0_0) >> 2);6581break;65826583case GAUDI2_QUEUE_ID_NIC_0_0 ... GAUDI2_QUEUE_ID_NIC_23_3:6584hw_nic_cap_bit = HW_CAP_NIC_SHIFT + ((hw_queue_id - GAUDI2_QUEUE_ID_NIC_0_0) >> 2);65856586/* special case where cap bit refers to the first queue id */6587if (!hw_nic_cap_bit)6588return !!(gaudi2->nic_hw_cap_initialized & BIT_ULL(0));6589break;65906591case GAUDI2_QUEUE_ID_CPU_PQ:6592return !!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q);65936594default:6595return false;6596}65976598if (hw_tpc_cap_bit)6599return !!(gaudi2->tpc_hw_cap_initialized & BIT_ULL(hw_tpc_cap_bit));66006601if (hw_nic_cap_bit)6602return !!(gaudi2->nic_hw_cap_initialized & BIT_ULL(hw_nic_cap_bit));66036604if (hw_test_cap_bit)6605hw_cap_mask = BIT_ULL(hw_test_cap_bit);66066607return !!(gaudi2->hw_cap_initialized & hw_cap_mask);6608}66096610static bool gaudi2_is_arc_enabled(struct hl_device *hdev, u64 arc_id)6611{6612struct gaudi2_device *gaudi2 = hdev->asic_specific;66136614switch (arc_id) {6615case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC5:6616case CPU_ID_MME_QMAN_ARC0...CPU_ID_ROT_QMAN_ARC1:6617return !!(gaudi2->active_hw_arc & BIT_ULL(arc_id));66186619case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:6620return !!(gaudi2->active_tpc_arc & BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0));66216622case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:6623return !!(gaudi2->active_nic_arc & BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0));66246625default:6626return false;6627}6628}66296630static void gaudi2_clr_arc_id_cap(struct hl_device *hdev, u64 arc_id)6631{6632struct gaudi2_device *gaudi2 = hdev->asic_specific;66336634switch (arc_id) {6635case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC5:6636case CPU_ID_MME_QMAN_ARC0...CPU_ID_ROT_QMAN_ARC1:6637gaudi2->active_hw_arc &= ~(BIT_ULL(arc_id));6638break;66396640case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:6641gaudi2->active_tpc_arc &= ~(BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0));6642break;66436644case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:6645gaudi2->active_nic_arc &= ~(BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0));6646break;66476648default:6649return;6650}6651}66526653static void gaudi2_set_arc_id_cap(struct hl_device *hdev, u64 arc_id)6654{6655struct gaudi2_device *gaudi2 = hdev->asic_specific;66566657switch (arc_id) {6658case CPU_ID_SCHED_ARC0 ... CPU_ID_SCHED_ARC5:6659case CPU_ID_MME_QMAN_ARC0...CPU_ID_ROT_QMAN_ARC1:6660gaudi2->active_hw_arc |= BIT_ULL(arc_id);6661break;66626663case CPU_ID_TPC_QMAN_ARC0...CPU_ID_TPC_QMAN_ARC24:6664gaudi2->active_tpc_arc |= BIT_ULL(arc_id - CPU_ID_TPC_QMAN_ARC0);6665break;66666667case CPU_ID_NIC_QMAN_ARC0...CPU_ID_NIC_QMAN_ARC23:6668gaudi2->active_nic_arc |= BIT_ULL(arc_id - CPU_ID_NIC_QMAN_ARC0);6669break;66706671default:6672return;6673}6674}66756676static void gaudi2_ring_doorbell(struct hl_device *hdev, u32 hw_queue_id, u32 pi)6677{6678struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;6679u32 pq_offset, reg_base, db_reg_offset, db_value;66806681if (hw_queue_id != GAUDI2_QUEUE_ID_CPU_PQ) {6682/*6683* QMAN has 4 successive PQ_PI registers, 1 for each of the QMAN PQs.6684* Masking the H/W queue ID with 0x3 extracts the QMAN internal PQ6685* number.6686*/6687pq_offset = (hw_queue_id & 0x3) * 4;6688reg_base = gaudi2_qm_blocks_bases[hw_queue_id];6689db_reg_offset = reg_base + QM_PQ_PI_0_OFFSET + pq_offset;6690} else {6691db_reg_offset = mmCPU_IF_PF_PQ_PI;6692}66936694db_value = pi;66956696/* ring the doorbell */6697WREG32(db_reg_offset, db_value);66986699if (hw_queue_id == GAUDI2_QUEUE_ID_CPU_PQ) {6700/* make sure device CPU will read latest data from host */6701mb();6702WREG32(le32_to_cpu(dyn_regs->gic_host_pi_upd_irq),6703gaudi2_irq_map_table[GAUDI2_EVENT_CPU_PI_UPDATE].cpu_id);6704}6705}67066707static void gaudi2_pqe_write(struct hl_device *hdev, __le64 *pqe, struct hl_bd *bd)6708{6709__le64 *pbd = (__le64 *) bd;67106711/* The QMANs are on the host memory so a simple copy suffice */6712pqe[0] = pbd[0];6713pqe[1] = pbd[1];6714}67156716static void *gaudi2_dma_alloc_coherent(struct hl_device *hdev, size_t size,6717dma_addr_t *dma_handle, gfp_t flags)6718{6719return dma_alloc_coherent(&hdev->pdev->dev, size, dma_handle, flags);6720}67216722static void gaudi2_dma_free_coherent(struct hl_device *hdev, size_t size,6723void *cpu_addr, dma_addr_t dma_handle)6724{6725dma_free_coherent(&hdev->pdev->dev, size, cpu_addr, dma_handle);6726}67276728static int gaudi2_send_cpu_message(struct hl_device *hdev, u32 *msg, u16 len,6729u32 timeout, u64 *result)6730{6731struct gaudi2_device *gaudi2 = hdev->asic_specific;67326733if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q)) {6734if (result)6735*result = 0;6736return 0;6737}67386739if (!timeout)6740timeout = GAUDI2_MSG_TO_CPU_TIMEOUT_USEC;67416742return hl_fw_send_cpu_message(hdev, GAUDI2_QUEUE_ID_CPU_PQ, msg, len, timeout, result);6743}67446745static void *gaudi2_dma_pool_zalloc(struct hl_device *hdev, size_t size,6746gfp_t mem_flags, dma_addr_t *dma_handle)6747{6748if (size > GAUDI2_DMA_POOL_BLK_SIZE)6749return NULL;67506751return dma_pool_zalloc(hdev->dma_pool, mem_flags, dma_handle);6752}67536754static void gaudi2_dma_pool_free(struct hl_device *hdev, void *vaddr, dma_addr_t dma_addr)6755{6756dma_pool_free(hdev->dma_pool, vaddr, dma_addr);6757}67586759static void *gaudi2_cpu_accessible_dma_pool_alloc(struct hl_device *hdev, size_t size,6760dma_addr_t *dma_handle)6761{6762return hl_fw_cpu_accessible_dma_pool_alloc(hdev, size, dma_handle);6763}67646765static void gaudi2_cpu_accessible_dma_pool_free(struct hl_device *hdev, size_t size, void *vaddr)6766{6767hl_fw_cpu_accessible_dma_pool_free(hdev, size, vaddr);6768}67696770static int gaudi2_validate_cb_address(struct hl_device *hdev, struct hl_cs_parser *parser)6771{6772struct asic_fixed_properties *asic_prop = &hdev->asic_prop;6773struct gaudi2_device *gaudi2 = hdev->asic_specific;67746775if (!gaudi2_is_queue_enabled(hdev, parser->hw_queue_id)) {6776dev_err(hdev->dev, "h/w queue %d is disabled\n", parser->hw_queue_id);6777return -EINVAL;6778}67796780/* Just check if CB address is valid */67816782if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,6783parser->user_cb_size,6784asic_prop->sram_user_base_address,6785asic_prop->sram_end_address))6786return 0;67876788if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,6789parser->user_cb_size,6790asic_prop->dram_user_base_address,6791asic_prop->dram_end_address))6792return 0;67936794if ((gaudi2->hw_cap_initialized & HW_CAP_DMMU_MASK) &&6795hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,6796parser->user_cb_size,6797asic_prop->dmmu.start_addr,6798asic_prop->dmmu.end_addr))6799return 0;68006801if (gaudi2->hw_cap_initialized & HW_CAP_PMMU) {6802if (hl_mem_area_inside_range((u64) (uintptr_t) parser->user_cb,6803parser->user_cb_size,6804asic_prop->pmmu.start_addr,6805asic_prop->pmmu.end_addr) ||6806hl_mem_area_inside_range(6807(u64) (uintptr_t) parser->user_cb,6808parser->user_cb_size,6809asic_prop->pmmu_huge.start_addr,6810asic_prop->pmmu_huge.end_addr))6811return 0;68126813} else if (gaudi2_host_phys_addr_valid((u64) (uintptr_t) parser->user_cb)) {6814if (!hdev->pdev)6815return 0;68166817if (!device_iommu_mapped(&hdev->pdev->dev))6818return 0;6819}68206821dev_err(hdev->dev, "CB address %p + 0x%x for internal QMAN is not valid\n",6822parser->user_cb, parser->user_cb_size);68236824return -EFAULT;6825}68266827static int gaudi2_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser)6828{6829struct gaudi2_device *gaudi2 = hdev->asic_specific;68306831if (!parser->is_kernel_allocated_cb)6832return gaudi2_validate_cb_address(hdev, parser);68336834if (!(gaudi2->hw_cap_initialized & HW_CAP_PMMU)) {6835dev_err(hdev->dev, "PMMU not initialized - Unsupported mode in Gaudi2\n");6836return -EINVAL;6837}68386839return 0;6840}68416842static int gaudi2_send_heartbeat(struct hl_device *hdev)6843{6844struct gaudi2_device *gaudi2 = hdev->asic_specific;68456846if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))6847return 0;68486849return hl_fw_send_heartbeat(hdev);6850}68516852/* This is an internal helper function, used to update the KDMA mmu props.6853* Should be called with a proper kdma lock.6854*/6855static void gaudi2_kdma_set_mmbp_asid(struct hl_device *hdev,6856bool mmu_bypass, u32 asid)6857{6858u32 rw_asid, rw_mmu_bp;68596860rw_asid = (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_SHIFT) |6861(asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_SHIFT);68626863rw_mmu_bp = (!!mmu_bypass << ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_RD_SHIFT) |6864(!!mmu_bypass << ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_WR_SHIFT);68656866WREG32(mmARC_FARM_KDMA_CTX_AXUSER_HB_ASID, rw_asid);6867WREG32(mmARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP, rw_mmu_bp);6868}68696870static void gaudi2_arm_cq_monitor(struct hl_device *hdev, u32 sob_id, u32 mon_id, u32 cq_id,6871u32 mon_payload, u32 sync_value)6872{6873u32 sob_offset, mon_offset, sync_group_id, mode, mon_arm;6874u8 mask;68756876sob_offset = sob_id * 4;6877mon_offset = mon_id * 4;68786879/* Reset the SOB value */6880WREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset, 0);68816882/* Configure this address with CQ_ID 0 because CQ_EN is set */6883WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + mon_offset, cq_id);68846885/* Configure this address with CS index because CQ_EN is set */6886WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + mon_offset, mon_payload);68876888sync_group_id = sob_id / 8;6889mask = ~(1 << (sob_id & 0x7));6890mode = 1; /* comparison mode is "equal to" */68916892mon_arm = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOD_MASK, sync_value);6893mon_arm |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SOP_MASK, mode);6894mon_arm |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_MASK_MASK, mask);6895mon_arm |= FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_MON_ARM_SID_MASK, sync_group_id);6896WREG32(mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + mon_offset, mon_arm);6897}68986899/* This is an internal helper function used by gaudi2_send_job_to_kdma only */6900static int gaudi2_send_job_to_kdma(struct hl_device *hdev,6901u64 src_addr, u64 dst_addr,6902u32 size, bool is_memset)6903{6904u32 comp_val, commit_mask, *polling_addr, timeout, status = 0;6905struct hl_cq_entry *cq_base;6906struct hl_cq *cq;6907u64 comp_addr;6908int rc;69096910gaudi2_arm_cq_monitor(hdev, GAUDI2_RESERVED_SOB_KDMA_COMPLETION,6911GAUDI2_RESERVED_MON_KDMA_COMPLETION,6912GAUDI2_RESERVED_CQ_KDMA_COMPLETION, 1, 1);69136914comp_addr = CFG_BASE + mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 +6915(GAUDI2_RESERVED_SOB_KDMA_COMPLETION * sizeof(u32));69166917comp_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_INC_MASK, 1) |6918FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_VAL_MASK, 1);69196920WREG32(mmARC_FARM_KDMA_CTX_SRC_BASE_LO, lower_32_bits(src_addr));6921WREG32(mmARC_FARM_KDMA_CTX_SRC_BASE_HI, upper_32_bits(src_addr));6922WREG32(mmARC_FARM_KDMA_CTX_DST_BASE_LO, lower_32_bits(dst_addr));6923WREG32(mmARC_FARM_KDMA_CTX_DST_BASE_HI, upper_32_bits(dst_addr));6924WREG32(mmARC_FARM_KDMA_CTX_WR_COMP_ADDR_LO, lower_32_bits(comp_addr));6925WREG32(mmARC_FARM_KDMA_CTX_WR_COMP_ADDR_HI, upper_32_bits(comp_addr));6926WREG32(mmARC_FARM_KDMA_CTX_WR_COMP_WDATA, comp_val);6927WREG32(mmARC_FARM_KDMA_CTX_DST_TSIZE_0, size);69286929commit_mask = FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_LIN_MASK, 1) |6930FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_WR_COMP_EN_MASK, 1);69316932if (is_memset)6933commit_mask |= FIELD_PREP(ARC_FARM_KDMA_CTX_COMMIT_MEM_SET_MASK, 1);69346935WREG32(mmARC_FARM_KDMA_CTX_COMMIT, commit_mask);69366937/* Wait for completion */6938cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_KDMA_COMPLETION];6939cq_base = cq->kernel_address;6940polling_addr = (u32 *)&cq_base[cq->ci];69416942if (hdev->pldm)6943/* for each 1MB 20 second of timeout */6944timeout = ((size / SZ_1M) + 1) * USEC_PER_SEC * 20;6945else6946timeout = KDMA_TIMEOUT_USEC;69476948/* Polling */6949rc = hl_poll_timeout_memory(6950hdev,6951polling_addr,6952status,6953(status == 1),69541000,6955timeout,6956true);69576958*polling_addr = 0;69596960if (rc) {6961dev_err(hdev->dev, "Timeout while waiting for KDMA to be idle\n");6962WREG32(mmARC_FARM_KDMA_CFG_1, 1 << ARC_FARM_KDMA_CFG_1_HALT_SHIFT);6963return rc;6964}69656966cq->ci = hl_cq_inc_ptr(cq->ci);69676968return 0;6969}69706971static void gaudi2_memset_device_lbw(struct hl_device *hdev, u32 addr, u32 size, u32 val)6972{6973u32 i;69746975for (i = 0 ; i < size ; i += sizeof(u32))6976WREG32(addr + i, val);6977}69786979static void gaudi2_qman_set_test_mode(struct hl_device *hdev, u32 hw_queue_id, bool enable)6980{6981u32 reg_base = gaudi2_qm_blocks_bases[hw_queue_id];69826983if (enable) {6984WREG32(reg_base + QM_GLBL_PROT_OFFSET, QMAN_MAKE_TRUSTED_TEST_MODE);6985WREG32(reg_base + QM_PQC_CFG_OFFSET, 0);6986} else {6987WREG32(reg_base + QM_GLBL_PROT_OFFSET, QMAN_MAKE_TRUSTED);6988WREG32(reg_base + QM_PQC_CFG_OFFSET, 1 << PDMA0_QM_PQC_CFG_EN_SHIFT);6989}6990}69916992static inline u32 gaudi2_test_queue_hw_queue_id_to_sob_id(struct hl_device *hdev, u32 hw_queue_id)6993{6994return hdev->asic_prop.first_available_user_sob[0] +6995hw_queue_id - GAUDI2_QUEUE_ID_PDMA_0_0;6996}69976998static void gaudi2_test_queue_clear(struct hl_device *hdev, u32 hw_queue_id)6999{7000u32 sob_offset = gaudi2_test_queue_hw_queue_id_to_sob_id(hdev, hw_queue_id) * 4;7001u32 sob_addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;70027003/* Reset the SOB value */7004WREG32(sob_addr, 0);7005}70067007static int gaudi2_test_queue_send_msg_short(struct hl_device *hdev, u32 hw_queue_id, u32 sob_val,7008struct gaudi2_queues_test_info *msg_info)7009{7010u32 sob_offset = gaudi2_test_queue_hw_queue_id_to_sob_id(hdev, hw_queue_id) * 4;7011u32 tmp, sob_base = 1;7012struct packet_msg_short *msg_short_pkt = msg_info->kern_addr;7013size_t pkt_size = sizeof(struct packet_msg_short);7014int rc;70157016tmp = (PACKET_MSG_SHORT << GAUDI2_PKT_CTL_OPCODE_SHIFT) |7017(1 << GAUDI2_PKT_CTL_EB_SHIFT) |7018(1 << GAUDI2_PKT_CTL_MB_SHIFT) |7019(sob_base << GAUDI2_PKT_SHORT_CTL_BASE_SHIFT) |7020(sob_offset << GAUDI2_PKT_SHORT_CTL_ADDR_SHIFT);70217022msg_short_pkt->value = cpu_to_le32(sob_val);7023msg_short_pkt->ctl = cpu_to_le32(tmp);70247025rc = hl_hw_queue_send_cb_no_cmpl(hdev, hw_queue_id, pkt_size, msg_info->dma_addr);7026if (rc)7027dev_err(hdev->dev,7028"Failed to send msg_short packet to H/W queue %d\n", hw_queue_id);70297030return rc;7031}70327033static int gaudi2_test_queue_wait_completion(struct hl_device *hdev, u32 hw_queue_id, u32 sob_val)7034{7035u32 sob_offset = gaudi2_test_queue_hw_queue_id_to_sob_id(hdev, hw_queue_id) * 4;7036u32 sob_addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;7037u32 timeout_usec, tmp;7038int rc;70397040if (hdev->pldm)7041timeout_usec = GAUDI2_PLDM_TEST_QUEUE_WAIT_USEC;7042else7043timeout_usec = GAUDI2_TEST_QUEUE_WAIT_USEC;70447045rc = hl_poll_timeout(7046hdev,7047sob_addr,7048tmp,7049(tmp == sob_val),70501000,7051timeout_usec);70527053if (rc == -ETIMEDOUT) {7054dev_err(hdev->dev, "H/W queue %d test failed (SOB_OBJ_0 == 0x%x)\n",7055hw_queue_id, tmp);7056rc = -EIO;7057}70587059return rc;7060}70617062static int gaudi2_test_cpu_queue(struct hl_device *hdev)7063{7064struct gaudi2_device *gaudi2 = hdev->asic_specific;70657066/*7067* check capability here as send_cpu_message() won't update the result7068* value if no capability7069*/7070if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))7071return 0;70727073return hl_fw_test_cpu_queue(hdev);7074}70757076static int gaudi2_test_queues(struct hl_device *hdev)7077{7078struct gaudi2_device *gaudi2 = hdev->asic_specific;7079struct gaudi2_queues_test_info *msg_info;7080u32 sob_val = 0x5a5a;7081int i, rc;70827083/* send test message on all enabled Qs */7084for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ; i++) {7085if (!gaudi2_is_queue_enabled(hdev, i) || gaudi2_is_edma_queue_id(i))7086continue;70877088msg_info = &gaudi2->queues_test_info[i - GAUDI2_QUEUE_ID_PDMA_0_0];7089gaudi2_qman_set_test_mode(hdev, i, true);7090gaudi2_test_queue_clear(hdev, i);7091rc = gaudi2_test_queue_send_msg_short(hdev, i, sob_val, msg_info);7092if (rc)7093goto done;7094}70957096rc = gaudi2_test_cpu_queue(hdev);7097if (rc)7098goto done;70997100/* verify that all messages were processed */7101for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ; i++) {7102if (!gaudi2_is_queue_enabled(hdev, i) || gaudi2_is_edma_queue_id(i))7103continue;71047105rc = gaudi2_test_queue_wait_completion(hdev, i, sob_val);7106if (rc)7107/* chip is not usable, no need for cleanups, just bail-out with error */7108goto done;71097110gaudi2_test_queue_clear(hdev, i);7111gaudi2_qman_set_test_mode(hdev, i, false);7112}71137114done:7115return rc;7116}71177118static int gaudi2_compute_reset_late_init(struct hl_device *hdev)7119{7120struct gaudi2_device *gaudi2 = hdev->asic_specific;7121size_t irq_arr_size;7122int rc;71237124gaudi2_init_arcs(hdev);71257126rc = gaudi2_scrub_arcs_dccm(hdev);7127if (rc) {7128dev_err(hdev->dev, "Failed to scrub arcs DCCM\n");7129return rc;7130}71317132gaudi2_init_security(hdev);71337134/* Unmask all IRQs since some could have been received during the soft reset */7135irq_arr_size = gaudi2->num_of_valid_hw_events * sizeof(gaudi2->hw_events[0]);7136return hl_fw_unmask_irq_arr(hdev, gaudi2->hw_events, irq_arr_size);7137}71387139static bool gaudi2_get_edma_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7140struct engines_data *e)7141{7142u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts, dma_core_sts0, dma_core_sts1;7143struct asic_fixed_properties *prop = &hdev->asic_prop;7144unsigned long *mask = (unsigned long *) mask_arr;7145const char *edma_fmt = "%-6d%-6d%-9s%#-14x%#-15x%#x\n";7146bool is_idle = true, is_eng_idle;7147int engine_idx, i, j;7148u64 offset;71497150if (e)7151hl_engine_data_sprintf(e,7152"\nCORE EDMA is_idle QM_GLBL_STS0 DMA_CORE_STS0 DMA_CORE_STS1\n"7153"---- ---- ------- ------------ ------------- -------------\n");71547155for (i = 0; i < NUM_OF_DCORES; i++) {7156for (j = 0 ; j < NUM_OF_EDMA_PER_DCORE ; j++) {7157int seq = i * NUM_OF_EDMA_PER_DCORE + j;71587159if (!(prop->edma_enabled_mask & BIT(seq)))7160continue;71617162engine_idx = GAUDI2_DCORE0_ENGINE_ID_EDMA_0 +7163i * GAUDI2_ENGINE_ID_DCORE_OFFSET + j;7164offset = i * DCORE_OFFSET + j * DCORE_EDMA_OFFSET;71657166dma_core_sts0 = RREG32(mmDCORE0_EDMA0_CORE_STS0 + offset);7167dma_core_sts1 = RREG32(mmDCORE0_EDMA0_CORE_STS1 + offset);71687169qm_glbl_sts0 = RREG32(mmDCORE0_EDMA0_QM_GLBL_STS0 + offset);7170qm_glbl_sts1 = RREG32(mmDCORE0_EDMA0_QM_GLBL_STS1 + offset);7171qm_cgm_sts = RREG32(mmDCORE0_EDMA0_QM_CGM_STS + offset);71727173is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts) &&7174IS_DMA_IDLE(dma_core_sts0) && !IS_DMA_HALTED(dma_core_sts1);7175is_idle &= is_eng_idle;71767177if (mask && !is_eng_idle)7178set_bit(engine_idx, mask);71797180if (e)7181hl_engine_data_sprintf(e, edma_fmt, i, j, is_eng_idle ? "Y" : "N",7182qm_glbl_sts0, dma_core_sts0, dma_core_sts1);7183}7184}71857186return is_idle;7187}71887189static bool gaudi2_get_pdma_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7190struct engines_data *e)7191{7192u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts, dma_core_sts0, dma_core_sts1;7193unsigned long *mask = (unsigned long *) mask_arr;7194const char *pdma_fmt = "%-6d%-9s%#-14x%#-15x%#x\n";7195bool is_idle = true, is_eng_idle;7196int engine_idx, i;7197u64 offset;71987199if (e)7200hl_engine_data_sprintf(e,7201"\nPDMA is_idle QM_GLBL_STS0 DMA_CORE_STS0 DMA_CORE_STS1\n"7202"---- ------- ------------ ------------- -------------\n");72037204for (i = 0 ; i < NUM_OF_PDMA ; i++) {7205engine_idx = GAUDI2_ENGINE_ID_PDMA_0 + i;7206offset = i * PDMA_OFFSET;7207dma_core_sts0 = RREG32(mmPDMA0_CORE_STS0 + offset);7208dma_core_sts1 = RREG32(mmPDMA0_CORE_STS1 + offset);72097210qm_glbl_sts0 = RREG32(mmPDMA0_QM_GLBL_STS0 + offset);7211qm_glbl_sts1 = RREG32(mmPDMA0_QM_GLBL_STS1 + offset);7212qm_cgm_sts = RREG32(mmPDMA0_QM_CGM_STS + offset);72137214is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts) &&7215IS_DMA_IDLE(dma_core_sts0) && !IS_DMA_HALTED(dma_core_sts1);7216is_idle &= is_eng_idle;72177218if (mask && !is_eng_idle)7219set_bit(engine_idx, mask);72207221if (e)7222hl_engine_data_sprintf(e, pdma_fmt, i, is_eng_idle ? "Y" : "N",7223qm_glbl_sts0, dma_core_sts0, dma_core_sts1);7224}72257226return is_idle;7227}72287229static bool gaudi2_get_nic_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7230struct engines_data *e)7231{7232unsigned long *mask = (unsigned long *) mask_arr;7233const char *nic_fmt = "%-5d%-9s%#-14x%#-12x\n";7234u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts;7235bool is_idle = true, is_eng_idle;7236int engine_idx, i;7237u64 offset = 0;72387239/* NIC, twelve macros in Full chip */7240if (e && hdev->nic_ports_mask)7241hl_engine_data_sprintf(e,7242"\nNIC is_idle QM_GLBL_STS0 QM_CGM_STS\n"7243"--- ------- ------------ ----------\n");72447245for (i = 0 ; i < NIC_NUMBER_OF_ENGINES ; i++) {7246if (!(i & 1))7247offset = i / 2 * NIC_OFFSET;7248else7249offset += NIC_QM_OFFSET;72507251if (!(hdev->nic_ports_mask & BIT(i)))7252continue;72537254engine_idx = GAUDI2_ENGINE_ID_NIC0_0 + i;725572567257qm_glbl_sts0 = RREG32(mmNIC0_QM0_GLBL_STS0 + offset);7258qm_glbl_sts1 = RREG32(mmNIC0_QM0_GLBL_STS1 + offset);7259qm_cgm_sts = RREG32(mmNIC0_QM0_CGM_STS + offset);72607261is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts);7262is_idle &= is_eng_idle;72637264if (mask && !is_eng_idle)7265set_bit(engine_idx, mask);72667267if (e)7268hl_engine_data_sprintf(e, nic_fmt, i, is_eng_idle ? "Y" : "N",7269qm_glbl_sts0, qm_cgm_sts);7270}72717272return is_idle;7273}72747275static bool gaudi2_get_mme_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7276struct engines_data *e)7277{7278u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts, mme_arch_sts;7279unsigned long *mask = (unsigned long *) mask_arr;7280const char *mme_fmt = "%-5d%-6s%-9s%#-14x%#x\n";7281bool is_idle = true, is_eng_idle;7282int engine_idx, i;7283u64 offset;72847285if (e)7286hl_engine_data_sprintf(e,7287"\nMME Stub is_idle QM_GLBL_STS0 MME_ARCH_STATUS\n"7288"--- ---- ------- ------------ ---------------\n");7289/* MME, one per Dcore */7290for (i = 0 ; i < NUM_OF_DCORES ; i++) {7291engine_idx = GAUDI2_DCORE0_ENGINE_ID_MME + i * GAUDI2_ENGINE_ID_DCORE_OFFSET;7292offset = i * DCORE_OFFSET;72937294qm_glbl_sts0 = RREG32(mmDCORE0_MME_QM_GLBL_STS0 + offset);7295qm_glbl_sts1 = RREG32(mmDCORE0_MME_QM_GLBL_STS1 + offset);7296qm_cgm_sts = RREG32(mmDCORE0_MME_QM_CGM_STS + offset);72977298is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts);7299is_idle &= is_eng_idle;73007301mme_arch_sts = RREG32(mmDCORE0_MME_CTRL_LO_ARCH_STATUS + offset);7302is_eng_idle &= IS_MME_IDLE(mme_arch_sts);7303is_idle &= is_eng_idle;73047305if (e)7306hl_engine_data_sprintf(e, mme_fmt, i, "N",7307is_eng_idle ? "Y" : "N",7308qm_glbl_sts0,7309mme_arch_sts);73107311if (mask && !is_eng_idle)7312set_bit(engine_idx, mask);7313}73147315return is_idle;7316}73177318static void gaudi2_is_tpc_engine_idle(struct hl_device *hdev, int dcore, int inst, u32 offset,7319struct iterate_module_ctx *ctx)7320{7321struct gaudi2_tpc_idle_data *idle_data = ctx->data;7322u32 tpc_cfg_sts, qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts;7323bool is_eng_idle;7324int engine_idx;73257326if ((dcore == 0) && (inst == (NUM_DCORE0_TPC - 1)))7327engine_idx = GAUDI2_DCORE0_ENGINE_ID_TPC_6;7328else7329engine_idx = GAUDI2_DCORE0_ENGINE_ID_TPC_0 +7330dcore * GAUDI2_ENGINE_ID_DCORE_OFFSET + inst;73317332tpc_cfg_sts = RREG32(mmDCORE0_TPC0_CFG_STATUS + offset);7333qm_glbl_sts0 = RREG32(mmDCORE0_TPC0_QM_GLBL_STS0 + offset);7334qm_glbl_sts1 = RREG32(mmDCORE0_TPC0_QM_GLBL_STS1 + offset);7335qm_cgm_sts = RREG32(mmDCORE0_TPC0_QM_CGM_STS + offset);73367337is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts) &&7338IS_TPC_IDLE(tpc_cfg_sts);7339*(idle_data->is_idle) &= is_eng_idle;73407341if (idle_data->mask && !is_eng_idle)7342set_bit(engine_idx, idle_data->mask);73437344if (idle_data->e)7345hl_engine_data_sprintf(idle_data->e,7346idle_data->tpc_fmt, dcore, inst,7347is_eng_idle ? "Y" : "N",7348qm_glbl_sts0, qm_cgm_sts, tpc_cfg_sts);7349}73507351static bool gaudi2_get_tpc_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7352struct engines_data *e)7353{7354struct asic_fixed_properties *prop = &hdev->asic_prop;7355unsigned long *mask = (unsigned long *) mask_arr;7356bool is_idle = true;73577358struct gaudi2_tpc_idle_data tpc_idle_data = {7359.tpc_fmt = "%-6d%-5d%-9s%#-14x%#-12x%#x\n",7360.e = e,7361.mask = mask,7362.is_idle = &is_idle,7363};7364struct iterate_module_ctx tpc_iter = {7365.fn = &gaudi2_is_tpc_engine_idle,7366.data = &tpc_idle_data,7367};73687369if (e && prop->tpc_enabled_mask)7370hl_engine_data_sprintf(e,7371"\nCORE TPC is_idle QM_GLBL_STS0 QM_CGM_STS STATUS\n"7372"---- --- ------- ------------ ---------- ------\n");73737374gaudi2_iterate_tpcs(hdev, &tpc_iter);73757376return *tpc_idle_data.is_idle;7377}73787379static bool gaudi2_get_decoder_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7380struct engines_data *e)7381{7382struct asic_fixed_properties *prop = &hdev->asic_prop;7383unsigned long *mask = (unsigned long *) mask_arr;7384const char *pcie_dec_fmt = "%-10d%-9s%#x\n";7385const char *dec_fmt = "%-6d%-5d%-9s%#x\n";7386bool is_idle = true, is_eng_idle;7387u32 dec_swreg15, dec_enabled_bit;7388int engine_idx, i, j;7389u64 offset;73907391/* Decoders, two each Dcore and two shared PCIe decoders */7392if (e && (prop->decoder_enabled_mask & (~PCIE_DEC_EN_MASK)))7393hl_engine_data_sprintf(e,7394"\nCORE DEC is_idle VSI_CMD_SWREG15\n"7395"---- --- ------- ---------------\n");73967397for (i = 0 ; i < NUM_OF_DCORES ; i++) {7398for (j = 0 ; j < NUM_OF_DEC_PER_DCORE ; j++) {7399dec_enabled_bit = 1 << (i * NUM_OF_DEC_PER_DCORE + j);7400if (!(prop->decoder_enabled_mask & dec_enabled_bit))7401continue;74027403engine_idx = GAUDI2_DCORE0_ENGINE_ID_DEC_0 +7404i * GAUDI2_ENGINE_ID_DCORE_OFFSET + j;7405offset = i * DCORE_OFFSET + j * DCORE_DEC_OFFSET;74067407dec_swreg15 = RREG32(mmDCORE0_DEC0_CMD_SWREG15 + offset);7408is_eng_idle = IS_DEC_IDLE(dec_swreg15);7409is_idle &= is_eng_idle;74107411if (mask && !is_eng_idle)7412set_bit(engine_idx, mask);74137414if (e)7415hl_engine_data_sprintf(e, dec_fmt, i, j,7416is_eng_idle ? "Y" : "N", dec_swreg15);7417}7418}74197420if (e && (prop->decoder_enabled_mask & PCIE_DEC_EN_MASK))7421hl_engine_data_sprintf(e,7422"\nPCIe DEC is_idle VSI_CMD_SWREG15\n"7423"-------- ------- ---------------\n");74247425/* Check shared(PCIe) decoders */7426for (i = 0 ; i < NUM_OF_DEC_PER_DCORE ; i++) {7427dec_enabled_bit = PCIE_DEC_SHIFT + i;7428if (!(prop->decoder_enabled_mask & BIT(dec_enabled_bit)))7429continue;74307431engine_idx = GAUDI2_PCIE_ENGINE_ID_DEC_0 + i;7432offset = i * DCORE_DEC_OFFSET;7433dec_swreg15 = RREG32(mmPCIE_DEC0_CMD_SWREG15 + offset);7434is_eng_idle = IS_DEC_IDLE(dec_swreg15);7435is_idle &= is_eng_idle;74367437if (mask && !is_eng_idle)7438set_bit(engine_idx, mask);74397440if (e)7441hl_engine_data_sprintf(e, pcie_dec_fmt, i,7442is_eng_idle ? "Y" : "N", dec_swreg15);7443}74447445return is_idle;7446}74477448static bool gaudi2_get_rotator_idle_status(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7449struct engines_data *e)7450{7451const char *rot_fmt = "%-6d%-5d%-9s%#-14x%#-14x%#x\n";7452unsigned long *mask = (unsigned long *) mask_arr;7453u32 qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts;7454bool is_idle = true, is_eng_idle;7455int engine_idx, i;7456u64 offset;74577458if (e)7459hl_engine_data_sprintf(e,7460"\nCORE ROT is_idle QM_GLBL_STS0 QM_GLBL_STS1 QM_CGM_STS\n"7461"---- --- ------- ------------ ------------ ----------\n");74627463for (i = 0 ; i < NUM_OF_ROT ; i++) {7464engine_idx = GAUDI2_ENGINE_ID_ROT_0 + i;74657466offset = i * ROT_OFFSET;74677468qm_glbl_sts0 = RREG32(mmROT0_QM_GLBL_STS0 + offset);7469qm_glbl_sts1 = RREG32(mmROT0_QM_GLBL_STS1 + offset);7470qm_cgm_sts = RREG32(mmROT0_QM_CGM_STS + offset);74717472is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts);7473is_idle &= is_eng_idle;74747475if (mask && !is_eng_idle)7476set_bit(engine_idx, mask);74777478if (e)7479hl_engine_data_sprintf(e, rot_fmt, i, 0, is_eng_idle ? "Y" : "N",7480qm_glbl_sts0, qm_glbl_sts1, qm_cgm_sts);7481}74827483return is_idle;7484}74857486static bool gaudi2_is_device_idle(struct hl_device *hdev, u64 *mask_arr, u8 mask_len,7487struct engines_data *e)7488{7489bool is_idle = true;74907491is_idle &= gaudi2_get_edma_idle_status(hdev, mask_arr, mask_len, e);7492is_idle &= gaudi2_get_pdma_idle_status(hdev, mask_arr, mask_len, e);7493is_idle &= gaudi2_get_nic_idle_status(hdev, mask_arr, mask_len, e);7494is_idle &= gaudi2_get_mme_idle_status(hdev, mask_arr, mask_len, e);7495is_idle &= gaudi2_get_tpc_idle_status(hdev, mask_arr, mask_len, e);7496is_idle &= gaudi2_get_decoder_idle_status(hdev, mask_arr, mask_len, e);7497is_idle &= gaudi2_get_rotator_idle_status(hdev, mask_arr, mask_len, e);74987499return is_idle;7500}75017502static void gaudi2_hw_queues_lock(struct hl_device *hdev)7503__acquires(&gaudi2->hw_queues_lock)7504{7505struct gaudi2_device *gaudi2 = hdev->asic_specific;75067507spin_lock(&gaudi2->hw_queues_lock);7508}75097510static void gaudi2_hw_queues_unlock(struct hl_device *hdev)7511__releases(&gaudi2->hw_queues_lock)7512{7513struct gaudi2_device *gaudi2 = hdev->asic_specific;75147515spin_unlock(&gaudi2->hw_queues_lock);7516}75177518static u32 gaudi2_get_pci_id(struct hl_device *hdev)7519{7520return hdev->pdev->device;7521}75227523static int gaudi2_get_eeprom_data(struct hl_device *hdev, void *data, size_t max_size)7524{7525struct gaudi2_device *gaudi2 = hdev->asic_specific;75267527if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))7528return 0;75297530return hl_fw_get_eeprom_data(hdev, data, max_size);7531}75327533static void gaudi2_update_eq_ci(struct hl_device *hdev, u32 val)7534{7535WREG32(mmCPU_IF_EQ_RD_OFFS, val);7536}75377538static void *gaudi2_get_events_stat(struct hl_device *hdev, bool aggregate, u32 *size)7539{7540struct gaudi2_device *gaudi2 = hdev->asic_specific;75417542if (aggregate) {7543*size = (u32) sizeof(gaudi2->events_stat_aggregate);7544return gaudi2->events_stat_aggregate;7545}75467547*size = (u32) sizeof(gaudi2->events_stat);7548return gaudi2->events_stat;7549}75507551static void gaudi2_mmu_vdec_dcore_prepare(struct hl_device *hdev, int dcore_id,7552int dcore_vdec_id, u32 rw_asid, u32 rw_mmu_bp)7553{7554u32 offset = (mmDCORE0_VDEC1_BRDG_CTRL_BASE - mmDCORE0_VDEC0_BRDG_CTRL_BASE) *7555dcore_vdec_id + DCORE_OFFSET * dcore_id;75567557WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_MMU_BP + offset, rw_mmu_bp);7558WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_ASID + offset, rw_asid);75597560WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_MMU_BP + offset, rw_mmu_bp);7561WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_ASID + offset, rw_asid);75627563WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_MMU_BP + offset, rw_mmu_bp);7564WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_ASID + offset, rw_asid);75657566WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_MMU_BP + offset, rw_mmu_bp);7567WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_ASID + offset, rw_asid);75687569WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_MMU_BP + offset, rw_mmu_bp);7570WREG32(mmDCORE0_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_ASID + offset, rw_asid);7571}75727573static void gaudi2_mmu_dcore_prepare(struct hl_device *hdev, int dcore_id, u32 asid)7574{7575u32 rw_asid = (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_SHIFT) |7576(asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_SHIFT);7577struct asic_fixed_properties *prop = &hdev->asic_prop;7578u32 dcore_offset = dcore_id * DCORE_OFFSET;7579u32 vdec_id, i, ports_offset, reg_val;7580u8 edma_seq_base;75817582/* EDMA */7583edma_seq_base = dcore_id * NUM_OF_EDMA_PER_DCORE;7584if (prop->edma_enabled_mask & BIT(edma_seq_base)) {7585WREG32(mmDCORE0_EDMA0_QM_AXUSER_NONSECURED_HB_MMU_BP + dcore_offset, 0);7586WREG32(mmDCORE0_EDMA0_QM_AXUSER_NONSECURED_HB_ASID + dcore_offset, rw_asid);7587WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP + dcore_offset, 0);7588WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_ASID + dcore_offset, rw_asid);7589}75907591if (prop->edma_enabled_mask & BIT(edma_seq_base + 1)) {7592WREG32(mmDCORE0_EDMA1_QM_AXUSER_NONSECURED_HB_MMU_BP + dcore_offset, 0);7593WREG32(mmDCORE0_EDMA1_QM_AXUSER_NONSECURED_HB_ASID + dcore_offset, rw_asid);7594WREG32(mmDCORE0_EDMA1_CORE_CTX_AXUSER_HB_ASID + dcore_offset, rw_asid);7595WREG32(mmDCORE0_EDMA1_CORE_CTX_AXUSER_HB_MMU_BP + dcore_offset, 0);7596}75977598/* Sync Mngr */7599WREG32(mmDCORE0_SYNC_MNGR_GLBL_ASID_NONE_SEC_PRIV + dcore_offset, asid);7600/*7601* Sync Mngrs on dcores 1 - 3 are exposed to user, so must use user ASID7602* for any access type7603*/7604if (dcore_id > 0) {7605reg_val = (asid << DCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_ASID_RD_SHIFT) |7606(asid << DCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_ASID_WR_SHIFT);7607WREG32(mmDCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_ASID + dcore_offset, reg_val);7608WREG32(mmDCORE0_SYNC_MNGR_MSTR_IF_AXUSER_HB_MMU_BP + dcore_offset, 0);7609}76107611WREG32(mmDCORE0_MME_CTRL_LO_MME_AXUSER_HB_MMU_BP + dcore_offset, 0);7612WREG32(mmDCORE0_MME_CTRL_LO_MME_AXUSER_HB_ASID + dcore_offset, rw_asid);76137614for (i = 0 ; i < NUM_OF_MME_SBTE_PORTS ; i++) {7615ports_offset = i * DCORE_MME_SBTE_OFFSET;7616WREG32(mmDCORE0_MME_SBTE0_MSTR_IF_AXUSER_HB_MMU_BP +7617dcore_offset + ports_offset, 0);7618WREG32(mmDCORE0_MME_SBTE0_MSTR_IF_AXUSER_HB_ASID +7619dcore_offset + ports_offset, rw_asid);7620}76217622for (i = 0 ; i < NUM_OF_MME_WB_PORTS ; i++) {7623ports_offset = i * DCORE_MME_WB_OFFSET;7624WREG32(mmDCORE0_MME_WB0_MSTR_IF_AXUSER_HB_MMU_BP +7625dcore_offset + ports_offset, 0);7626WREG32(mmDCORE0_MME_WB0_MSTR_IF_AXUSER_HB_ASID +7627dcore_offset + ports_offset, rw_asid);7628}76297630WREG32(mmDCORE0_MME_QM_AXUSER_NONSECURED_HB_MMU_BP + dcore_offset, 0);7631WREG32(mmDCORE0_MME_QM_AXUSER_NONSECURED_HB_ASID + dcore_offset, rw_asid);76327633/*7634* Decoders7635*/7636for (vdec_id = 0 ; vdec_id < NUM_OF_DEC_PER_DCORE ; vdec_id++) {7637if (prop->decoder_enabled_mask & BIT(dcore_id * NUM_OF_DEC_PER_DCORE + vdec_id))7638gaudi2_mmu_vdec_dcore_prepare(hdev, dcore_id, vdec_id, rw_asid, 0);7639}7640}76417642static void gudi2_mmu_vdec_shared_prepare(struct hl_device *hdev,7643int shared_vdec_id, u32 rw_asid, u32 rw_mmu_bp)7644{7645u32 offset = (mmPCIE_VDEC1_BRDG_CTRL_BASE - mmPCIE_VDEC0_BRDG_CTRL_BASE) * shared_vdec_id;76467647WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_MMU_BP + offset, rw_mmu_bp);7648WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_DEC_HB_ASID + offset, rw_asid);76497650WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_MMU_BP + offset, rw_mmu_bp);7651WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_ABNRM_HB_ASID + offset, rw_asid);76527653WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_MMU_BP + offset, rw_mmu_bp);7654WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_L2C_HB_ASID + offset, rw_asid);76557656WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_MMU_BP + offset, rw_mmu_bp);7657WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_NRM_HB_ASID + offset, rw_asid);76587659WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_MMU_BP + offset, rw_mmu_bp);7660WREG32(mmPCIE_VDEC0_BRDG_CTRL_AXUSER_MSIX_VCD_HB_ASID + offset, rw_asid);7661}76627663static void gudi2_mmu_arc_farm_arc_dup_eng_prepare(struct hl_device *hdev, int arc_farm_id,7664u32 rw_asid, u32 rw_mmu_bp)7665{7666u32 offset = (mmARC_FARM_ARC1_DUP_ENG_BASE - mmARC_FARM_ARC0_DUP_ENG_BASE) * arc_farm_id;76677668WREG32(mmARC_FARM_ARC0_DUP_ENG_AXUSER_HB_MMU_BP + offset, rw_mmu_bp);7669WREG32(mmARC_FARM_ARC0_DUP_ENG_AXUSER_HB_ASID + offset, rw_asid);7670}76717672static void gaudi2_arc_mmu_prepare(struct hl_device *hdev, u32 cpu_id, u32 asid)7673{7674u32 reg_base, reg_offset, reg_val = 0;76757676reg_base = gaudi2_arc_blocks_bases[cpu_id];76777678/* Enable MMU and configure asid for all relevant ARC regions */7679reg_val = FIELD_PREP(ARC_FARM_ARC0_AUX_ARC_REGION_CFG_MMU_BP_MASK, 0);7680reg_val |= FIELD_PREP(ARC_FARM_ARC0_AUX_ARC_REGION_CFG_0_ASID_MASK, asid);76817682reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION3_GENERAL);7683WREG32(reg_base + reg_offset, reg_val);76847685reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION4_HBM0_FW);7686WREG32(reg_base + reg_offset, reg_val);76877688reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION5_HBM1_GC_DATA);7689WREG32(reg_base + reg_offset, reg_val);76907691reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION6_HBM2_GC_DATA);7692WREG32(reg_base + reg_offset, reg_val);76937694reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION7_HBM3_GC_DATA);7695WREG32(reg_base + reg_offset, reg_val);76967697reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION9_PCIE);7698WREG32(reg_base + reg_offset, reg_val);76997700reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION10_GENERAL);7701WREG32(reg_base + reg_offset, reg_val);77027703reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION11_GENERAL);7704WREG32(reg_base + reg_offset, reg_val);77057706reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION12_GENERAL);7707WREG32(reg_base + reg_offset, reg_val);77087709reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION13_GENERAL);7710WREG32(reg_base + reg_offset, reg_val);77117712reg_offset = ARC_REGION_CFG_OFFSET(ARC_REGION14_GENERAL);7713WREG32(reg_base + reg_offset, reg_val);7714}77157716static int gaudi2_arc_mmu_prepare_all(struct hl_device *hdev, u32 asid)7717{7718int i;77197720if (hdev->fw_components & FW_TYPE_BOOT_CPU)7721return hl_fw_cpucp_engine_core_asid_set(hdev, asid);77227723for (i = CPU_ID_SCHED_ARC0 ; i < NUM_OF_ARC_FARMS_ARC ; i++)7724gaudi2_arc_mmu_prepare(hdev, i, asid);77257726for (i = GAUDI2_QUEUE_ID_PDMA_0_0 ; i < GAUDI2_QUEUE_ID_CPU_PQ ; i += 4) {7727if (!gaudi2_is_queue_enabled(hdev, i))7728continue;77297730gaudi2_arc_mmu_prepare(hdev, gaudi2_queue_id_to_arc_id[i], asid);7731}77327733return 0;7734}77357736static int gaudi2_mmu_shared_prepare(struct hl_device *hdev, u32 asid)7737{7738struct asic_fixed_properties *prop = &hdev->asic_prop;7739u32 rw_asid, offset;7740int rc, i;77417742rw_asid = FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_MASK, asid) |7743FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_MASK, asid);77447745WREG32(mmPDMA0_QM_AXUSER_NONSECURED_HB_ASID, rw_asid);7746WREG32(mmPDMA0_QM_AXUSER_NONSECURED_HB_MMU_BP, 0);7747WREG32(mmPDMA0_CORE_CTX_AXUSER_HB_ASID, rw_asid);7748WREG32(mmPDMA0_CORE_CTX_AXUSER_HB_MMU_BP, 0);77497750WREG32(mmPDMA1_QM_AXUSER_NONSECURED_HB_ASID, rw_asid);7751WREG32(mmPDMA1_QM_AXUSER_NONSECURED_HB_MMU_BP, 0);7752WREG32(mmPDMA1_CORE_CTX_AXUSER_HB_ASID, rw_asid);7753WREG32(mmPDMA1_CORE_CTX_AXUSER_HB_MMU_BP, 0);77547755/* ROT */7756for (i = 0 ; i < NUM_OF_ROT ; i++) {7757offset = i * ROT_OFFSET;7758WREG32(mmROT0_QM_AXUSER_NONSECURED_HB_ASID + offset, rw_asid);7759WREG32(mmROT0_QM_AXUSER_NONSECURED_HB_MMU_BP + offset, 0);7760RMWREG32(mmROT0_CPL_QUEUE_AWUSER + offset, asid, MMUBP_ASID_MASK);7761RMWREG32(mmROT0_DESC_HBW_ARUSER_LO + offset, asid, MMUBP_ASID_MASK);7762RMWREG32(mmROT0_DESC_HBW_AWUSER_LO + offset, asid, MMUBP_ASID_MASK);7763}77647765/* Shared Decoders are the last bits in the decoders mask */7766if (prop->decoder_enabled_mask & BIT(NUM_OF_DCORES * NUM_OF_DEC_PER_DCORE + 0))7767gudi2_mmu_vdec_shared_prepare(hdev, 0, rw_asid, 0);77687769if (prop->decoder_enabled_mask & BIT(NUM_OF_DCORES * NUM_OF_DEC_PER_DCORE + 1))7770gudi2_mmu_vdec_shared_prepare(hdev, 1, rw_asid, 0);77717772/* arc farm arc dup eng */7773for (i = 0 ; i < NUM_OF_ARC_FARMS_ARC ; i++)7774gudi2_mmu_arc_farm_arc_dup_eng_prepare(hdev, i, rw_asid, 0);77757776rc = gaudi2_arc_mmu_prepare_all(hdev, asid);7777if (rc)7778return rc;77797780return 0;7781}77827783static void gaudi2_tpc_mmu_prepare(struct hl_device *hdev, int dcore, int inst, u32 offset,7784struct iterate_module_ctx *ctx)7785{7786struct gaudi2_tpc_mmu_data *mmu_data = ctx->data;77877788WREG32(mmDCORE0_TPC0_CFG_AXUSER_HB_MMU_BP + offset, 0);7789WREG32(mmDCORE0_TPC0_CFG_AXUSER_HB_ASID + offset, mmu_data->rw_asid);7790WREG32(mmDCORE0_TPC0_QM_AXUSER_NONSECURED_HB_MMU_BP + offset, 0);7791WREG32(mmDCORE0_TPC0_QM_AXUSER_NONSECURED_HB_ASID + offset, mmu_data->rw_asid);7792}77937794/* zero the MMUBP and set the ASID */7795static int gaudi2_mmu_prepare(struct hl_device *hdev, u32 asid)7796{7797struct gaudi2_device *gaudi2 = hdev->asic_specific;7798struct gaudi2_tpc_mmu_data tpc_mmu_data;7799struct iterate_module_ctx tpc_iter = {7800.fn = &gaudi2_tpc_mmu_prepare,7801.data = &tpc_mmu_data,7802};7803int rc, i;78047805if (asid & ~DCORE0_HMMU0_STLB_ASID_ASID_MASK) {7806dev_crit(hdev->dev, "asid %u is too big\n", asid);7807return -EINVAL;7808}78097810if (!(gaudi2->hw_cap_initialized & HW_CAP_MMU_MASK))7811return 0;78127813rc = gaudi2_mmu_shared_prepare(hdev, asid);7814if (rc)7815return rc;78167817/* configure DCORE MMUs */7818tpc_mmu_data.rw_asid = (asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_RD_SHIFT) |7819(asid << ARC_FARM_KDMA_CTX_AXUSER_HB_ASID_WR_SHIFT);7820gaudi2_iterate_tpcs(hdev, &tpc_iter);7821for (i = 0 ; i < NUM_OF_DCORES ; i++)7822gaudi2_mmu_dcore_prepare(hdev, i, asid);78237824return 0;7825}78267827static inline bool is_info_event(u32 event)7828{7829switch (event) {7830case GAUDI2_EVENT_CPU_CPLD_SHUTDOWN_CAUSE:7831case GAUDI2_EVENT_CPU_FIX_POWER_ENV_S ... GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_E:7832case GAUDI2_EVENT_ARC_PWR_BRK_ENTRY ... GAUDI2_EVENT_ARC_PWR_RD_MODE3:78337834/* return in case of NIC status event - these events are received periodically and not as7835* an indication to an error.7836*/7837case GAUDI2_EVENT_CPU0_STATUS_NIC0_ENG0 ... GAUDI2_EVENT_CPU11_STATUS_NIC11_ENG1:7838case GAUDI2_EVENT_ARC_EQ_HEARTBEAT:7839return true;7840default:7841return false;7842}7843}78447845static void gaudi2_print_event(struct hl_device *hdev, u16 event_type,7846bool ratelimited, const char *fmt, ...)7847{7848struct va_format vaf;7849va_list args;78507851va_start(args, fmt);7852vaf.fmt = fmt;7853vaf.va = &args;78547855if (ratelimited)7856dev_err_ratelimited(hdev->dev, "%s: %pV\n",7857gaudi2_irq_map_table[event_type].valid ?7858gaudi2_irq_map_table[event_type].name : "N/A Event", &vaf);7859else7860dev_err(hdev->dev, "%s: %pV\n",7861gaudi2_irq_map_table[event_type].valid ?7862gaudi2_irq_map_table[event_type].name : "N/A Event", &vaf);78637864va_end(args);7865}78667867static bool gaudi2_handle_ecc_event(struct hl_device *hdev, u16 event_type,7868struct hl_eq_ecc_data *ecc_data)7869{7870u64 ecc_address = 0, ecc_syndrome = 0;7871u8 memory_wrapper_idx = 0;7872bool has_block_id = false;7873u16 block_id;78747875if (hl_fw_version_cmp(hdev, 1, 12, 0) >= 0)7876has_block_id = true;78777878ecc_address = le64_to_cpu(ecc_data->ecc_address);7879ecc_syndrome = le64_to_cpu(ecc_data->ecc_syndrom);7880memory_wrapper_idx = ecc_data->memory_wrapper_idx;78817882if (has_block_id) {7883block_id = le16_to_cpu(ecc_data->block_id);7884gaudi2_print_event(hdev, event_type, !ecc_data->is_critical,7885"ECC error detected. address: %#llx. Syndrome: %#llx. wrapper id %u. block id %#x. critical %u.",7886ecc_address, ecc_syndrome, memory_wrapper_idx, block_id,7887ecc_data->is_critical);7888} else {7889gaudi2_print_event(hdev, event_type, !ecc_data->is_critical,7890"ECC error detected. address: %#llx. Syndrome: %#llx. wrapper id %u. critical %u.",7891ecc_address, ecc_syndrome, memory_wrapper_idx, ecc_data->is_critical);7892}78937894return !!ecc_data->is_critical;7895}78967897static void handle_lower_qman_data_on_err(struct hl_device *hdev, u64 qman_base, u32 engine_id)7898{7899struct undefined_opcode_info *undef_opcode = &hdev->captured_err_info.undef_opcode;7900u64 cq_ptr, cp_current_inst;7901u32 lo, hi, cq_size, cp_sts;7902bool is_arc_cq;79037904cp_sts = RREG32(qman_base + QM_CP_STS_4_OFFSET);7905is_arc_cq = FIELD_GET(PDMA0_QM_CP_STS_CUR_CQ_MASK, cp_sts); /* 0 - legacy CQ, 1 - ARC_CQ */79067907if (is_arc_cq) {7908lo = RREG32(qman_base + QM_ARC_CQ_PTR_LO_STS_OFFSET);7909hi = RREG32(qman_base + QM_ARC_CQ_PTR_HI_STS_OFFSET);7910cq_ptr = ((u64) hi) << 32 | lo;7911cq_size = RREG32(qman_base + QM_ARC_CQ_TSIZE_STS_OFFSET);7912} else {7913lo = RREG32(qman_base + QM_CQ_PTR_LO_STS_4_OFFSET);7914hi = RREG32(qman_base + QM_CQ_PTR_HI_STS_4_OFFSET);7915cq_ptr = ((u64) hi) << 32 | lo;7916cq_size = RREG32(qman_base + QM_CQ_TSIZE_STS_4_OFFSET);7917}79187919lo = RREG32(qman_base + QM_CP_CURRENT_INST_LO_4_OFFSET);7920hi = RREG32(qman_base + QM_CP_CURRENT_INST_HI_4_OFFSET);7921cp_current_inst = ((u64) hi) << 32 | lo;79227923dev_info(hdev->dev,7924"LowerQM. %sCQ: {ptr %#llx, size %u}, CP: {instruction %#018llx}\n",7925is_arc_cq ? "ARC_" : "", cq_ptr, cq_size, cp_current_inst);79267927if (undef_opcode->write_enable) {7928memset(undef_opcode, 0, sizeof(*undef_opcode));7929undef_opcode->timestamp = ktime_get();7930undef_opcode->cq_addr = cq_ptr;7931undef_opcode->cq_size = cq_size;7932undef_opcode->engine_id = engine_id;7933undef_opcode->stream_id = QMAN_STREAMS;7934undef_opcode->write_enable = 0;7935}7936}79377938static int gaudi2_handle_qman_err_generic(struct hl_device *hdev, u16 event_type,7939u64 qman_base, u32 qid_base, u64 *event_mask)7940{7941u32 i, j, glbl_sts_val, arb_err_val, num_error_causes, error_count = 0;7942u64 glbl_sts_addr, arb_err_addr;7943char reg_desc[32];79447945glbl_sts_addr = qman_base + (mmDCORE0_TPC0_QM_GLBL_ERR_STS_0 - mmDCORE0_TPC0_QM_BASE);7946arb_err_addr = qman_base + (mmDCORE0_TPC0_QM_ARB_ERR_CAUSE - mmDCORE0_TPC0_QM_BASE);79477948/* Iterate through all stream GLBL_ERR_STS registers + Lower CP */7949for (i = 0 ; i < QMAN_STREAMS + 1 ; i++) {7950glbl_sts_val = RREG32(glbl_sts_addr + 4 * i);79517952if (!glbl_sts_val)7953continue;79547955if (i == QMAN_STREAMS) {7956snprintf(reg_desc, ARRAY_SIZE(reg_desc), "LowerQM");7957num_error_causes = GAUDI2_NUM_OF_LOWER_QM_ERR_CAUSE;7958} else {7959snprintf(reg_desc, ARRAY_SIZE(reg_desc), "stream%u", i);7960num_error_causes = GAUDI2_NUM_OF_QM_ERR_CAUSE;7961}79627963for (j = 0 ; j < num_error_causes ; j++)7964if (glbl_sts_val & BIT(j)) {7965gaudi2_print_event(hdev, event_type, true,7966"%s. err cause: %s", reg_desc,7967i == QMAN_STREAMS ?7968gaudi2_lower_qman_error_cause[j] :7969gaudi2_qman_error_cause[j]);7970error_count++;7971}79727973/* Check for undefined opcode error in lower QM */7974if ((i == QMAN_STREAMS) &&7975(glbl_sts_val & PDMA0_QM_GLBL_ERR_STS_CP_UNDEF_CMD_ERR_MASK)) {7976handle_lower_qman_data_on_err(hdev, qman_base,7977gaudi2_queue_id_to_engine_id[qid_base]);7978*event_mask |= HL_NOTIFIER_EVENT_UNDEFINED_OPCODE;7979}7980}79817982arb_err_val = RREG32(arb_err_addr);79837984if (!arb_err_val)7985goto out;79867987for (j = 0 ; j < GAUDI2_NUM_OF_QM_ARB_ERR_CAUSE ; j++) {7988if (arb_err_val & BIT(j)) {7989gaudi2_print_event(hdev, event_type, true,7990"ARB_ERR. err cause: %s",7991gaudi2_qman_arb_error_cause[j]);7992error_count++;7993}7994}79957996out:7997return error_count;7998}79998000static void gaudi2_razwi_rr_hbw_shared_printf_info(struct hl_device *hdev,8001u64 rtr_mstr_if_base_addr, bool is_write, char *name,8002enum gaudi2_engine_id id, u64 *event_mask)8003{8004u32 razwi_hi, razwi_lo, razwi_xy;8005u16 eng_id = id;8006u8 rd_wr_flag;80078008if (is_write) {8009razwi_hi = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_HI);8010razwi_lo = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_LO);8011razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_XY);8012rd_wr_flag = HL_RAZWI_WRITE;8013} else {8014razwi_hi = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_HI);8015razwi_lo = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_LO);8016razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_XY);8017rd_wr_flag = HL_RAZWI_READ;8018}80198020hl_handle_razwi(hdev, (u64)razwi_hi << 32 | razwi_lo, &eng_id, 1,8021rd_wr_flag | HL_RAZWI_HBW, event_mask);80228023dev_err_ratelimited(hdev->dev,8024"%s-RAZWI SHARED RR HBW %s error, address %#llx, Initiator coordinates 0x%x\n",8025name, is_write ? "WR" : "RD", (u64)razwi_hi << 32 | razwi_lo, razwi_xy);8026}80278028static void gaudi2_razwi_rr_lbw_shared_printf_info(struct hl_device *hdev,8029u64 rtr_mstr_if_base_addr, bool is_write, char *name,8030enum gaudi2_engine_id id, u64 *event_mask)8031{8032u64 razwi_addr = CFG_BASE;8033u32 razwi_xy;8034u16 eng_id = id;8035u8 rd_wr_flag;80368037if (is_write) {8038razwi_addr += RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI);8039razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI_XY);8040rd_wr_flag = HL_RAZWI_WRITE;8041} else {8042razwi_addr += RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI);8043razwi_xy = RREG32(rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI_XY);8044rd_wr_flag = HL_RAZWI_READ;8045}80468047hl_handle_razwi(hdev, razwi_addr, &eng_id, 1, rd_wr_flag | HL_RAZWI_LBW, event_mask);8048dev_err_ratelimited(hdev->dev,8049"%s-RAZWI SHARED RR LBW %s error, mstr_if 0x%llx, captured address 0x%llX Initiator coordinates 0x%x\n",8050name, is_write ? "WR" : "RD", rtr_mstr_if_base_addr, razwi_addr,8051razwi_xy);8052}80538054static enum gaudi2_engine_id gaudi2_razwi_calc_engine_id(struct hl_device *hdev,8055enum razwi_event_sources module, u8 module_idx)8056{8057switch (module) {8058case RAZWI_TPC:8059if (module_idx == (NUM_OF_TPC_PER_DCORE * NUM_OF_DCORES))8060return GAUDI2_DCORE0_ENGINE_ID_TPC_6;8061return (((module_idx / NUM_OF_TPC_PER_DCORE) * ENGINE_ID_DCORE_OFFSET) +8062(module_idx % NUM_OF_TPC_PER_DCORE) +8063(GAUDI2_DCORE0_ENGINE_ID_TPC_0 - GAUDI2_DCORE0_ENGINE_ID_EDMA_0));80648065case RAZWI_MME:8066return ((GAUDI2_DCORE0_ENGINE_ID_MME - GAUDI2_DCORE0_ENGINE_ID_EDMA_0) +8067(module_idx * ENGINE_ID_DCORE_OFFSET));80688069case RAZWI_EDMA:8070return (((module_idx / NUM_OF_EDMA_PER_DCORE) * ENGINE_ID_DCORE_OFFSET) +8071(module_idx % NUM_OF_EDMA_PER_DCORE));80728073case RAZWI_PDMA:8074return (GAUDI2_ENGINE_ID_PDMA_0 + module_idx);80758076case RAZWI_NIC:8077return (GAUDI2_ENGINE_ID_NIC0_0 + (NIC_NUMBER_OF_QM_PER_MACRO * module_idx));80788079case RAZWI_DEC:8080if (module_idx == 8)8081return GAUDI2_PCIE_ENGINE_ID_DEC_0;80828083if (module_idx == 9)8084return GAUDI2_PCIE_ENGINE_ID_DEC_1;8085;8086return (((module_idx / NUM_OF_DEC_PER_DCORE) * ENGINE_ID_DCORE_OFFSET) +8087(module_idx % NUM_OF_DEC_PER_DCORE) +8088(GAUDI2_DCORE0_ENGINE_ID_DEC_0 - GAUDI2_DCORE0_ENGINE_ID_EDMA_0));80898090case RAZWI_ROT:8091return GAUDI2_ENGINE_ID_ROT_0 + module_idx;80928093case RAZWI_ARC_FARM:8094return GAUDI2_ENGINE_ID_ARC_FARM;80958096default:8097return GAUDI2_ENGINE_ID_SIZE;8098}8099}81008101/*8102* This function handles RR(Range register) hit events.8103* raised be initiators not PSOC RAZWI.8104*/8105static void gaudi2_ack_module_razwi_event_handler(struct hl_device *hdev,8106enum razwi_event_sources module, u8 module_idx,8107u8 module_sub_idx, u64 *event_mask)8108{8109bool via_sft = false;8110u32 hbw_rtr_id, lbw_rtr_id, dcore_id, dcore_rtr_id, eng_id, binned_idx;8111u64 hbw_rtr_mstr_if_base_addr, lbw_rtr_mstr_if_base_addr;8112u32 hbw_shrd_aw = 0, hbw_shrd_ar = 0;8113u32 lbw_shrd_aw = 0, lbw_shrd_ar = 0;8114char initiator_name[64];81158116switch (module) {8117case RAZWI_TPC:8118sprintf(initiator_name, "TPC_%u", module_idx);8119if (hdev->tpc_binning) {8120binned_idx = __ffs(hdev->tpc_binning);8121if (binned_idx == module_idx)8122module_idx = TPC_ID_DCORE0_TPC6;8123}81248125hbw_rtr_id = gaudi2_tpc_initiator_hbw_rtr_id[module_idx];8126lbw_rtr_id = gaudi2_tpc_initiator_lbw_rtr_id[module_idx];8127break;8128case RAZWI_MME:8129sprintf(initiator_name, "MME_%u", module_idx);8130switch (module_sub_idx) {8131case MME_WAP0:8132hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].wap0;8133break;8134case MME_WAP1:8135hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].wap1;8136break;8137case MME_WRITE:8138hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].write;8139break;8140case MME_READ:8141hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].read;8142break;8143case MME_SBTE0:8144hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte0;8145break;8146case MME_SBTE1:8147hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte1;8148break;8149case MME_SBTE2:8150hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte2;8151break;8152case MME_SBTE3:8153hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte3;8154break;8155case MME_SBTE4:8156hbw_rtr_id = gaudi2_mme_initiator_rtr_id[module_idx].sbte4;8157break;8158default:8159return;8160}8161lbw_rtr_id = hbw_rtr_id;8162break;8163case RAZWI_EDMA:8164hbw_rtr_mstr_if_base_addr = gaudi2_edma_initiator_hbw_sft[module_idx];8165dcore_id = module_idx / NUM_OF_EDMA_PER_DCORE;8166/* SFT has separate MSTR_IF for LBW, only there we can8167* read the LBW razwi related registers8168*/8169lbw_rtr_mstr_if_base_addr = mmSFT0_LBW_RTR_IF_MSTR_IF_RR_SHRD_HBW_BASE +8170dcore_id * SFT_DCORE_OFFSET;8171via_sft = true;8172sprintf(initiator_name, "EDMA_%u", module_idx);8173break;8174case RAZWI_PDMA:8175hbw_rtr_id = gaudi2_pdma_initiator_hbw_rtr_id[module_idx];8176lbw_rtr_id = gaudi2_pdma_initiator_lbw_rtr_id[module_idx];8177sprintf(initiator_name, "PDMA_%u", module_idx);8178break;8179case RAZWI_NIC:8180hbw_rtr_id = gaudi2_nic_initiator_hbw_rtr_id[module_idx];8181lbw_rtr_id = gaudi2_nic_initiator_lbw_rtr_id[module_idx];8182sprintf(initiator_name, "NIC_%u", module_idx);8183break;8184case RAZWI_DEC:8185sprintf(initiator_name, "DEC_%u", module_idx);8186if (hdev->decoder_binning) {8187binned_idx = __ffs(hdev->decoder_binning);8188if (binned_idx == module_idx)8189module_idx = DEC_ID_PCIE_VDEC1;8190}8191hbw_rtr_id = gaudi2_dec_initiator_hbw_rtr_id[module_idx];8192lbw_rtr_id = gaudi2_dec_initiator_lbw_rtr_id[module_idx];8193break;8194case RAZWI_ROT:8195hbw_rtr_id = gaudi2_rot_initiator_hbw_rtr_id[module_idx];8196lbw_rtr_id = gaudi2_rot_initiator_lbw_rtr_id[module_idx];8197sprintf(initiator_name, "ROT_%u", module_idx);8198break;8199case RAZWI_ARC_FARM:8200lbw_rtr_id = DCORE1_RTR5;8201hbw_rtr_id = DCORE1_RTR7;8202sprintf(initiator_name, "ARC_FARM_%u", module_idx);8203break;8204default:8205return;8206}82078208/* Find router mstr_if register base */8209if (!via_sft) {8210dcore_id = hbw_rtr_id / NUM_OF_RTR_PER_DCORE;8211dcore_rtr_id = hbw_rtr_id % NUM_OF_RTR_PER_DCORE;8212hbw_rtr_mstr_if_base_addr = mmDCORE0_RTR0_CTRL_BASE +8213dcore_id * DCORE_OFFSET +8214dcore_rtr_id * DCORE_RTR_OFFSET +8215RTR_MSTR_IF_OFFSET;8216lbw_rtr_mstr_if_base_addr = hbw_rtr_mstr_if_base_addr +8217(((s32)lbw_rtr_id - hbw_rtr_id) * DCORE_RTR_OFFSET);8218}82198220/* Find out event cause by reading "RAZWI_HAPPENED" registers */8221hbw_shrd_aw = RREG32(hbw_rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_HAPPENED);8222hbw_shrd_ar = RREG32(hbw_rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_HAPPENED);8223lbw_shrd_aw = RREG32(lbw_rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI_HAPPENED);8224lbw_shrd_ar = RREG32(lbw_rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI_HAPPENED);82258226eng_id = gaudi2_razwi_calc_engine_id(hdev, module, module_idx);8227if (hbw_shrd_aw) {8228gaudi2_razwi_rr_hbw_shared_printf_info(hdev, hbw_rtr_mstr_if_base_addr, true,8229initiator_name, eng_id, event_mask);82308231/* Clear event indication */8232WREG32(hbw_rtr_mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_HAPPENED, hbw_shrd_aw);8233}82348235if (hbw_shrd_ar) {8236gaudi2_razwi_rr_hbw_shared_printf_info(hdev, hbw_rtr_mstr_if_base_addr, false,8237initiator_name, eng_id, event_mask);82388239/* Clear event indication */8240WREG32(hbw_rtr_mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_HAPPENED, hbw_shrd_ar);8241}82428243if (lbw_shrd_aw) {8244gaudi2_razwi_rr_lbw_shared_printf_info(hdev, lbw_rtr_mstr_if_base_addr, true,8245initiator_name, eng_id, event_mask);82468247/* Clear event indication */8248WREG32(lbw_rtr_mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI_HAPPENED, lbw_shrd_aw);8249}82508251if (lbw_shrd_ar) {8252gaudi2_razwi_rr_lbw_shared_printf_info(hdev, lbw_rtr_mstr_if_base_addr, false,8253initiator_name, eng_id, event_mask);82548255/* Clear event indication */8256WREG32(lbw_rtr_mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI_HAPPENED, lbw_shrd_ar);8257}8258}82598260static void gaudi2_check_if_razwi_happened(struct hl_device *hdev)8261{8262struct asic_fixed_properties *prop = &hdev->asic_prop;8263u8 mod_idx, sub_mod;82648265/* check all TPCs */8266for (mod_idx = 0 ; mod_idx < (NUM_OF_TPC_PER_DCORE * NUM_OF_DCORES + 1) ; mod_idx++) {8267if (prop->tpc_enabled_mask & BIT(mod_idx))8268gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_TPC, mod_idx, 0, NULL);8269}82708271/* check all MMEs */8272for (mod_idx = 0 ; mod_idx < (NUM_OF_MME_PER_DCORE * NUM_OF_DCORES) ; mod_idx++)8273for (sub_mod = MME_WAP0 ; sub_mod < MME_INITIATORS_MAX ; sub_mod++)8274gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mod_idx,8275sub_mod, NULL);82768277/* check all EDMAs */8278for (mod_idx = 0 ; mod_idx < (NUM_OF_EDMA_PER_DCORE * NUM_OF_DCORES) ; mod_idx++)8279if (prop->edma_enabled_mask & BIT(mod_idx))8280gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_EDMA, mod_idx, 0, NULL);82818282/* check all PDMAs */8283for (mod_idx = 0 ; mod_idx < NUM_OF_PDMA ; mod_idx++)8284gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_PDMA, mod_idx, 0, NULL);82858286/* check all NICs */8287for (mod_idx = 0 ; mod_idx < NIC_NUMBER_OF_PORTS ; mod_idx++)8288if (hdev->nic_ports_mask & BIT(mod_idx))8289gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_NIC, mod_idx >> 1, 0,8290NULL);82918292/* check all DECs */8293for (mod_idx = 0 ; mod_idx < NUMBER_OF_DEC ; mod_idx++)8294if (prop->decoder_enabled_mask & BIT(mod_idx))8295gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_DEC, mod_idx, 0, NULL);82968297/* check all ROTs */8298for (mod_idx = 0 ; mod_idx < NUM_OF_ROT ; mod_idx++)8299gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_ROT, mod_idx, 0, NULL);8300}83018302static int gaudi2_psoc_razwi_get_engines(struct gaudi2_razwi_info *razwi_info, u32 array_size,8303u32 axuser_xy, u32 *base, u16 *eng_id,8304char *eng_name)8305{83068307int i, num_of_eng = 0;8308u16 str_size = 0;83098310for (i = 0 ; i < array_size ; i++) {8311if (axuser_xy != razwi_info[i].axuser_xy)8312continue;83138314eng_id[num_of_eng] = razwi_info[i].eng_id;8315base[num_of_eng] = razwi_info[i].rtr_ctrl;8316if (!num_of_eng)8317str_size += scnprintf(eng_name + str_size,8318PSOC_RAZWI_ENG_STR_SIZE - str_size, "%s",8319razwi_info[i].eng_name);8320else8321str_size += scnprintf(eng_name + str_size,8322PSOC_RAZWI_ENG_STR_SIZE - str_size, " or %s",8323razwi_info[i].eng_name);8324num_of_eng++;8325}83268327return num_of_eng;8328}83298330static bool gaudi2_handle_psoc_razwi_happened(struct hl_device *hdev, u32 razwi_reg,8331u64 *event_mask)8332{8333u32 axuser_xy = RAZWI_GET_AXUSER_XY(razwi_reg), addr_hi = 0, addr_lo = 0;8334u32 base[PSOC_RAZWI_MAX_ENG_PER_RTR];8335u16 num_of_eng, eng_id[PSOC_RAZWI_MAX_ENG_PER_RTR];8336char eng_name_str[PSOC_RAZWI_ENG_STR_SIZE];8337bool razwi_happened = false;8338u64 addr;8339int i;83408341num_of_eng = gaudi2_psoc_razwi_get_engines(common_razwi_info, ARRAY_SIZE(common_razwi_info),8342axuser_xy, base, eng_id, eng_name_str);83438344/* If no match for XY coordinates, try to find it in MME razwi table */8345if (!num_of_eng) {8346axuser_xy = RAZWI_GET_AXUSER_LOW_XY(razwi_reg);8347num_of_eng = gaudi2_psoc_razwi_get_engines(mme_razwi_info,8348ARRAY_SIZE(mme_razwi_info),8349axuser_xy, base, eng_id,8350eng_name_str);8351}83528353for (i = 0 ; i < num_of_eng ; i++) {8354if (RREG32(base[i] + DEC_RAZWI_HBW_AW_SET)) {8355addr_hi = RREG32(base[i] + DEC_RAZWI_HBW_AW_ADDR_HI);8356addr_lo = RREG32(base[i] + DEC_RAZWI_HBW_AW_ADDR_LO);8357addr = ((u64)addr_hi << 32) + addr_lo;8358if (addr) {8359dev_err(hdev->dev,8360"PSOC HBW AW RAZWI: %s, address (aligned to 128 byte): 0x%llX\n",8361eng_name_str, addr);8362hl_handle_razwi(hdev, addr, &eng_id[0],8363num_of_eng, HL_RAZWI_HBW | HL_RAZWI_WRITE, event_mask);8364razwi_happened = true;8365}8366}83678368if (RREG32(base[i] + DEC_RAZWI_HBW_AR_SET)) {8369addr_hi = RREG32(base[i] + DEC_RAZWI_HBW_AR_ADDR_HI);8370addr_lo = RREG32(base[i] + DEC_RAZWI_HBW_AR_ADDR_LO);8371addr = ((u64)addr_hi << 32) + addr_lo;8372if (addr) {8373dev_err(hdev->dev,8374"PSOC HBW AR RAZWI: %s, address (aligned to 128 byte): 0x%llX\n",8375eng_name_str, addr);8376hl_handle_razwi(hdev, addr, &eng_id[0],8377num_of_eng, HL_RAZWI_HBW | HL_RAZWI_READ, event_mask);8378razwi_happened = true;8379}8380}83818382if (RREG32(base[i] + DEC_RAZWI_LBW_AW_SET)) {8383addr_lo = RREG32(base[i] + DEC_RAZWI_LBW_AW_ADDR);8384if (addr_lo) {8385dev_err(hdev->dev,8386"PSOC LBW AW RAZWI: %s, address (aligned to 128 byte): 0x%X\n",8387eng_name_str, addr_lo);8388hl_handle_razwi(hdev, addr_lo, &eng_id[0],8389num_of_eng, HL_RAZWI_LBW | HL_RAZWI_WRITE, event_mask);8390razwi_happened = true;8391}8392}83938394if (RREG32(base[i] + DEC_RAZWI_LBW_AR_SET)) {8395addr_lo = RREG32(base[i] + DEC_RAZWI_LBW_AR_ADDR);8396if (addr_lo) {8397dev_err(hdev->dev,8398"PSOC LBW AR RAZWI: %s, address (aligned to 128 byte): 0x%X\n",8399eng_name_str, addr_lo);8400hl_handle_razwi(hdev, addr_lo, &eng_id[0],8401num_of_eng, HL_RAZWI_LBW | HL_RAZWI_READ, event_mask);8402razwi_happened = true;8403}8404}8405/* In common case the loop will break, when there is only one engine id, or8406* several engines with the same router. The exceptional case is with psoc razwi8407* from EDMA, where it's possible to get axuser id which fits 2 routers (28408* interfaces of sft router). In this case, maybe the first router won't hold info8409* and we will need to iterate on the other router.8410*/8411if (razwi_happened)8412break;8413}84148415return razwi_happened;8416}84178418/* PSOC RAZWI interrupt occurs only when trying to access a bad address */8419static int gaudi2_ack_psoc_razwi_event_handler(struct hl_device *hdev, u64 *event_mask)8420{8421u32 razwi_mask_info, razwi_intr = 0, error_count = 0;84228423if (hdev->pldm || !(hdev->fw_components & FW_TYPE_LINUX)) {8424razwi_intr = RREG32(mmPSOC_GLOBAL_CONF_RAZWI_INTERRUPT);8425if (!razwi_intr)8426return 0;8427}84288429razwi_mask_info = RREG32(mmPSOC_GLOBAL_CONF_RAZWI_MASK_INFO);84308431dev_err_ratelimited(hdev->dev,8432"PSOC RAZWI interrupt: Mask %d, AR %d, AW %d, AXUSER_L 0x%x AXUSER_H 0x%x\n",8433FIELD_GET(PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_MASK_MASK, razwi_mask_info),8434FIELD_GET(PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_WAS_AR_MASK, razwi_mask_info),8435FIELD_GET(PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_WAS_AW_MASK, razwi_mask_info),8436FIELD_GET(PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_AXUSER_L_MASK, razwi_mask_info),8437FIELD_GET(PSOC_GLOBAL_CONF_RAZWI_MASK_INFO_AXUSER_H_MASK, razwi_mask_info));84388439if (gaudi2_handle_psoc_razwi_happened(hdev, razwi_mask_info, event_mask))8440error_count++;8441else8442dev_err_ratelimited(hdev->dev,8443"PSOC RAZWI interrupt: invalid razwi info (0x%x)\n",8444razwi_mask_info);84458446/* Clear Interrupts only on pldm or if f/w doesn't handle interrupts */8447if (hdev->pldm || !(hdev->fw_components & FW_TYPE_LINUX))8448WREG32(mmPSOC_GLOBAL_CONF_RAZWI_INTERRUPT, razwi_intr);84498450return error_count;8451}84528453static int _gaudi2_handle_qm_sei_err(struct hl_device *hdev, u64 qman_base, u16 event_type)8454{8455u32 i, sts_val, sts_clr_val = 0, error_count = 0;84568457sts_val = RREG32(qman_base + QM_SEI_STATUS_OFFSET);84588459for (i = 0 ; i < GAUDI2_NUM_OF_QM_SEI_ERR_CAUSE ; i++) {8460if (sts_val & BIT(i)) {8461gaudi2_print_event(hdev, event_type, true,8462"err cause: %s", gaudi2_qm_sei_error_cause[i]);8463sts_clr_val |= BIT(i);8464error_count++;8465}8466}84678468WREG32(qman_base + QM_SEI_STATUS_OFFSET, sts_clr_val);84698470return error_count;8471}84728473static int gaudi2_handle_qm_sei_err(struct hl_device *hdev, u16 event_type,8474bool extended_err_check, u64 *event_mask)8475{8476enum razwi_event_sources module;8477u32 error_count = 0;8478u64 qman_base;8479u8 index;84808481switch (event_type) {8482case GAUDI2_EVENT_TPC0_AXI_ERR_RSP ... GAUDI2_EVENT_TPC23_AXI_ERR_RSP:8483index = event_type - GAUDI2_EVENT_TPC0_AXI_ERR_RSP;8484qman_base = mmDCORE0_TPC0_QM_BASE +8485(index / NUM_OF_TPC_PER_DCORE) * DCORE_OFFSET +8486(index % NUM_OF_TPC_PER_DCORE) * DCORE_TPC_OFFSET;8487module = RAZWI_TPC;8488break;8489case GAUDI2_EVENT_TPC24_AXI_ERR_RSP:8490qman_base = mmDCORE0_TPC6_QM_BASE;8491module = RAZWI_TPC;8492break;8493case GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE:8494case GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE:8495case GAUDI2_EVENT_MME2_CTRL_AXI_ERROR_RESPONSE:8496case GAUDI2_EVENT_MME3_CTRL_AXI_ERROR_RESPONSE:8497index = (event_type - GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE) /8498(GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE -8499GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE);8500qman_base = mmDCORE0_MME_QM_BASE + index * DCORE_OFFSET;8501module = RAZWI_MME;8502break;8503case GAUDI2_EVENT_PDMA_CH0_AXI_ERR_RSP:8504case GAUDI2_EVENT_PDMA_CH1_AXI_ERR_RSP:8505index = event_type - GAUDI2_EVENT_PDMA_CH0_AXI_ERR_RSP;8506qman_base = mmPDMA0_QM_BASE + index * PDMA_OFFSET;8507module = RAZWI_PDMA;8508break;8509case GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE:8510case GAUDI2_EVENT_ROTATOR1_AXI_ERROR_RESPONSE:8511index = event_type - GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE;8512qman_base = mmROT0_QM_BASE + index * ROT_OFFSET;8513module = RAZWI_ROT;8514break;8515default:8516return 0;8517}85188519error_count = _gaudi2_handle_qm_sei_err(hdev, qman_base, event_type);85208521/* There is a single event per NIC macro, so should check its both QMAN blocks */8522if (event_type >= GAUDI2_EVENT_NIC0_AXI_ERROR_RESPONSE &&8523event_type <= GAUDI2_EVENT_NIC11_AXI_ERROR_RESPONSE)8524error_count += _gaudi2_handle_qm_sei_err(hdev,8525qman_base + NIC_QM_OFFSET, event_type);85268527if (extended_err_check) {8528/* check if RAZWI happened */8529gaudi2_ack_module_razwi_event_handler(hdev, module, 0, 0, event_mask);8530hl_check_for_glbl_errors(hdev);8531}85328533return error_count;8534}85358536static int gaudi2_handle_qman_err(struct hl_device *hdev, u16 event_type, u64 *event_mask)8537{8538u32 qid_base, error_count = 0;8539u64 qman_base;8540u8 index = 0;85418542switch (event_type) {8543case GAUDI2_EVENT_TPC0_QM ... GAUDI2_EVENT_TPC5_QM:8544index = event_type - GAUDI2_EVENT_TPC0_QM;8545qid_base = GAUDI2_QUEUE_ID_DCORE0_TPC_0_0 + index * QMAN_STREAMS;8546qman_base = mmDCORE0_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;8547break;8548case GAUDI2_EVENT_TPC6_QM ... GAUDI2_EVENT_TPC11_QM:8549index = event_type - GAUDI2_EVENT_TPC6_QM;8550qid_base = GAUDI2_QUEUE_ID_DCORE1_TPC_0_0 + index * QMAN_STREAMS;8551qman_base = mmDCORE1_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;8552break;8553case GAUDI2_EVENT_TPC12_QM ... GAUDI2_EVENT_TPC17_QM:8554index = event_type - GAUDI2_EVENT_TPC12_QM;8555qid_base = GAUDI2_QUEUE_ID_DCORE2_TPC_0_0 + index * QMAN_STREAMS;8556qman_base = mmDCORE2_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;8557break;8558case GAUDI2_EVENT_TPC18_QM ... GAUDI2_EVENT_TPC23_QM:8559index = event_type - GAUDI2_EVENT_TPC18_QM;8560qid_base = GAUDI2_QUEUE_ID_DCORE3_TPC_0_0 + index * QMAN_STREAMS;8561qman_base = mmDCORE3_TPC0_QM_BASE + index * DCORE_TPC_OFFSET;8562break;8563case GAUDI2_EVENT_TPC24_QM:8564qid_base = GAUDI2_QUEUE_ID_DCORE0_TPC_6_0;8565qman_base = mmDCORE0_TPC6_QM_BASE;8566break;8567case GAUDI2_EVENT_MME0_QM:8568qid_base = GAUDI2_QUEUE_ID_DCORE0_MME_0_0;8569qman_base = mmDCORE0_MME_QM_BASE;8570break;8571case GAUDI2_EVENT_MME1_QM:8572qid_base = GAUDI2_QUEUE_ID_DCORE1_MME_0_0;8573qman_base = mmDCORE1_MME_QM_BASE;8574break;8575case GAUDI2_EVENT_MME2_QM:8576qid_base = GAUDI2_QUEUE_ID_DCORE2_MME_0_0;8577qman_base = mmDCORE2_MME_QM_BASE;8578break;8579case GAUDI2_EVENT_MME3_QM:8580qid_base = GAUDI2_QUEUE_ID_DCORE3_MME_0_0;8581qman_base = mmDCORE3_MME_QM_BASE;8582break;8583case GAUDI2_EVENT_HDMA0_QM:8584index = 0;8585qid_base = GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0;8586qman_base = mmDCORE0_EDMA0_QM_BASE;8587break;8588case GAUDI2_EVENT_HDMA1_QM:8589index = 1;8590qid_base = GAUDI2_QUEUE_ID_DCORE0_EDMA_1_0;8591qman_base = mmDCORE0_EDMA1_QM_BASE;8592break;8593case GAUDI2_EVENT_HDMA2_QM:8594index = 2;8595qid_base = GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0;8596qman_base = mmDCORE1_EDMA0_QM_BASE;8597break;8598case GAUDI2_EVENT_HDMA3_QM:8599index = 3;8600qid_base = GAUDI2_QUEUE_ID_DCORE1_EDMA_1_0;8601qman_base = mmDCORE1_EDMA1_QM_BASE;8602break;8603case GAUDI2_EVENT_HDMA4_QM:8604index = 4;8605qid_base = GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0;8606qman_base = mmDCORE2_EDMA0_QM_BASE;8607break;8608case GAUDI2_EVENT_HDMA5_QM:8609index = 5;8610qid_base = GAUDI2_QUEUE_ID_DCORE2_EDMA_1_0;8611qman_base = mmDCORE2_EDMA1_QM_BASE;8612break;8613case GAUDI2_EVENT_HDMA6_QM:8614index = 6;8615qid_base = GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0;8616qman_base = mmDCORE3_EDMA0_QM_BASE;8617break;8618case GAUDI2_EVENT_HDMA7_QM:8619index = 7;8620qid_base = GAUDI2_QUEUE_ID_DCORE3_EDMA_1_0;8621qman_base = mmDCORE3_EDMA1_QM_BASE;8622break;8623case GAUDI2_EVENT_PDMA0_QM:8624qid_base = GAUDI2_QUEUE_ID_PDMA_0_0;8625qman_base = mmPDMA0_QM_BASE;8626break;8627case GAUDI2_EVENT_PDMA1_QM:8628qid_base = GAUDI2_QUEUE_ID_PDMA_1_0;8629qman_base = mmPDMA1_QM_BASE;8630break;8631case GAUDI2_EVENT_ROTATOR0_ROT0_QM:8632qid_base = GAUDI2_QUEUE_ID_ROT_0_0;8633qman_base = mmROT0_QM_BASE;8634break;8635case GAUDI2_EVENT_ROTATOR1_ROT1_QM:8636qid_base = GAUDI2_QUEUE_ID_ROT_1_0;8637qman_base = mmROT1_QM_BASE;8638break;8639default:8640return 0;8641}86428643error_count = gaudi2_handle_qman_err_generic(hdev, event_type, qman_base,8644qid_base, event_mask);86458646/* Handle EDMA QM SEI here because there is no AXI error response event for EDMA */8647if (event_type >= GAUDI2_EVENT_HDMA2_QM && event_type <= GAUDI2_EVENT_HDMA5_QM) {8648error_count += _gaudi2_handle_qm_sei_err(hdev, qman_base, event_type);8649gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_EDMA, index, 0, event_mask);8650}86518652hl_check_for_glbl_errors(hdev);86538654return error_count;8655}86568657static int gaudi2_handle_arc_farm_sei_err(struct hl_device *hdev, u16 event_type, u64 *event_mask)8658{8659u32 i, sts_val, sts_clr_val, error_count = 0, arc_farm;86608661for (arc_farm = 0 ; arc_farm < NUM_OF_ARC_FARMS_ARC ; arc_farm++) {8662sts_clr_val = 0;8663sts_val = RREG32(mmARC_FARM_ARC0_AUX_ARC_SEI_INTR_STS +8664(arc_farm * ARC_FARM_OFFSET));86658666for (i = 0 ; i < GAUDI2_NUM_OF_ARC_SEI_ERR_CAUSE ; i++) {8667if (sts_val & BIT(i)) {8668gaudi2_print_event(hdev, event_type, true,8669"ARC FARM ARC %u err cause: %s",8670arc_farm, gaudi2_arc_sei_error_cause[i]);8671sts_clr_val |= BIT(i);8672error_count++;8673}8674}8675WREG32(mmARC_FARM_ARC0_AUX_ARC_SEI_INTR_CLR + (arc_farm * ARC_FARM_OFFSET),8676sts_clr_val);8677}86788679gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_ARC_FARM, 0, 0, event_mask);8680hl_check_for_glbl_errors(hdev);86818682return error_count;8683}86848685static int gaudi2_handle_cpu_sei_err(struct hl_device *hdev, u16 event_type)8686{8687u32 i, sts_val, sts_clr_val = 0, error_count = 0;86888689sts_val = RREG32(mmCPU_IF_CPU_SEI_INTR_STS);86908691for (i = 0 ; i < GAUDI2_NUM_OF_CPU_SEI_ERR_CAUSE ; i++) {8692if (sts_val & BIT(i)) {8693gaudi2_print_event(hdev, event_type, true,8694"err cause: %s", gaudi2_cpu_sei_error_cause[i]);8695sts_clr_val |= BIT(i);8696error_count++;8697}8698}86998700hl_check_for_glbl_errors(hdev);87018702WREG32(mmCPU_IF_CPU_SEI_INTR_CLR, sts_clr_val);87038704return error_count;8705}87068707static int gaudi2_handle_rot_err(struct hl_device *hdev, u8 rot_index, u16 event_type,8708struct hl_eq_razwi_with_intr_cause *razwi_with_intr_cause,8709u64 *event_mask)8710{8711u64 intr_cause_data = le64_to_cpu(razwi_with_intr_cause->intr_cause.intr_cause_data);8712u32 error_count = 0;8713int i;87148715for (i = 0 ; i < GAUDI2_NUM_OF_ROT_ERR_CAUSE ; i++)8716if (intr_cause_data & BIT(i)) {8717gaudi2_print_event(hdev, event_type, true,8718"err cause: %s", guadi2_rot_error_cause[i]);8719error_count++;8720}87218722/* check if RAZWI happened */8723gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_ROT, rot_index, 0, event_mask);8724hl_check_for_glbl_errors(hdev);87258726return error_count;8727}87288729static int gaudi2_tpc_ack_interrupts(struct hl_device *hdev, u8 tpc_index, u16 event_type,8730struct hl_eq_razwi_with_intr_cause *razwi_with_intr_cause,8731u64 *event_mask)8732{8733u64 intr_cause_data = le64_to_cpu(razwi_with_intr_cause->intr_cause.intr_cause_data);8734u32 error_count = 0;8735int i;87368737for (i = 0 ; i < GAUDI2_NUM_OF_TPC_INTR_CAUSE ; i++)8738if (intr_cause_data & BIT(i)) {8739gaudi2_print_event(hdev, event_type, true,8740"interrupt cause: %s", gaudi2_tpc_interrupts_cause[i]);8741error_count++;8742}87438744/* check if RAZWI happened */8745gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_TPC, tpc_index, 0, event_mask);8746hl_check_for_glbl_errors(hdev);87478748return error_count;8749}87508751static int gaudi2_handle_dec_err(struct hl_device *hdev, u8 dec_index, u16 event_type,8752u64 *event_mask)8753{8754u32 sts_addr, sts_val, sts_clr_val = 0, error_count = 0;8755int i;87568757if (dec_index < NUM_OF_VDEC_PER_DCORE * NUM_OF_DCORES)8758/* DCORE DEC */8759sts_addr = mmDCORE0_VDEC0_BRDG_CTRL_CAUSE_INTR +8760DCORE_OFFSET * (dec_index / NUM_OF_DEC_PER_DCORE) +8761DCORE_VDEC_OFFSET * (dec_index % NUM_OF_DEC_PER_DCORE);8762else8763/* PCIE DEC */8764sts_addr = mmPCIE_VDEC0_BRDG_CTRL_CAUSE_INTR + PCIE_VDEC_OFFSET *8765(dec_index - NUM_OF_VDEC_PER_DCORE * NUM_OF_DCORES);87668767sts_val = RREG32(sts_addr);87688769for (i = 0 ; i < GAUDI2_NUM_OF_DEC_ERR_CAUSE ; i++) {8770if (sts_val & BIT(i)) {8771gaudi2_print_event(hdev, event_type, true,8772"err cause: %s", gaudi2_dec_error_cause[i]);8773sts_clr_val |= BIT(i);8774error_count++;8775}8776}87778778/* check if RAZWI happened */8779gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_DEC, dec_index, 0, event_mask);8780hl_check_for_glbl_errors(hdev);87818782/* Write 1 clear errors */8783WREG32(sts_addr, sts_clr_val);87848785return error_count;8786}87878788static int gaudi2_handle_mme_err(struct hl_device *hdev, u8 mme_index, u16 event_type,8789u64 *event_mask)8790{8791u32 sts_addr, sts_val, sts_clr_addr, sts_clr_val = 0, error_count = 0;8792int i;87938794sts_addr = mmDCORE0_MME_CTRL_LO_INTR_CAUSE + DCORE_OFFSET * mme_index;8795sts_clr_addr = mmDCORE0_MME_CTRL_LO_INTR_CLEAR + DCORE_OFFSET * mme_index;87968797sts_val = RREG32(sts_addr);87988799for (i = 0 ; i < GAUDI2_NUM_OF_MME_ERR_CAUSE ; i++) {8800if (sts_val & BIT(i)) {8801gaudi2_print_event(hdev, event_type, true,8802"err cause: %s", guadi2_mme_error_cause[i]);8803sts_clr_val |= BIT(i);8804error_count++;8805}8806}88078808/* check if RAZWI happened */8809for (i = MME_WRITE ; i < MME_INITIATORS_MAX ; i++)8810gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mme_index, i, event_mask);88118812hl_check_for_glbl_errors(hdev);88138814WREG32(sts_clr_addr, sts_clr_val);88158816return error_count;8817}88188819static int gaudi2_handle_mme_sbte_err(struct hl_device *hdev, u16 event_type)8820{8821/*8822* We have a single error cause here but the report mechanism is8823* buggy. Hence there is no good reason to fetch the cause so we8824* just check for glbl_errors and exit.8825*/8826hl_check_for_glbl_errors(hdev);88278828return GAUDI2_NA_EVENT_CAUSE;8829}88308831static int gaudi2_handle_mme_wap_err(struct hl_device *hdev, u8 mme_index, u16 event_type,8832u64 *event_mask)8833{8834u32 sts_addr, sts_val, sts_clr_addr, sts_clr_val = 0, error_count = 0;8835int i;88368837sts_addr = mmDCORE0_MME_ACC_INTR_CAUSE + DCORE_OFFSET * mme_index;8838sts_clr_addr = mmDCORE0_MME_ACC_INTR_CLEAR + DCORE_OFFSET * mme_index;88398840sts_val = RREG32(sts_addr);88418842for (i = 0 ; i < GAUDI2_NUM_OF_MME_WAP_ERR_CAUSE ; i++) {8843if (sts_val & BIT(i)) {8844gaudi2_print_event(hdev, event_type, true,8845"err cause: %s", guadi2_mme_wap_error_cause[i]);8846sts_clr_val |= BIT(i);8847error_count++;8848}8849}88508851/* check if RAZWI happened on WAP0/1 */8852gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mme_index, MME_WAP0, event_mask);8853gaudi2_ack_module_razwi_event_handler(hdev, RAZWI_MME, mme_index, MME_WAP1, event_mask);8854hl_check_for_glbl_errors(hdev);88558856WREG32(sts_clr_addr, sts_clr_val);88578858return error_count;8859}88608861static int gaudi2_handle_kdma_core_event(struct hl_device *hdev, u16 event_type,8862u64 intr_cause_data)8863{8864u32 error_count = 0;8865int i;88668867/* If an AXI read or write error is received, an error is reported and8868* interrupt message is sent. Due to an HW errata, when reading the cause8869* register of the KDMA engine, the reported error is always HBW even if8870* the actual error caused by a LBW KDMA transaction.8871*/8872for (i = 0 ; i < GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE ; i++)8873if (intr_cause_data & BIT(i)) {8874gaudi2_print_event(hdev, event_type, true,8875"err cause: %s", gaudi2_kdma_core_interrupts_cause[i]);8876error_count++;8877}88788879hl_check_for_glbl_errors(hdev);88808881return error_count;8882}88838884static int gaudi2_handle_dma_core_event(struct hl_device *hdev, u16 event_type, u64 intr_cause)8885{8886u32 error_count = 0;8887int i;88888889for (i = 0 ; i < GAUDI2_NUM_OF_DMA_CORE_INTR_CAUSE ; i++)8890if (intr_cause & BIT(i)) {8891gaudi2_print_event(hdev, event_type, true,8892"err cause: %s", gaudi2_dma_core_interrupts_cause[i]);8893error_count++;8894}88958896hl_check_for_glbl_errors(hdev);88978898return error_count;8899}89008901static void gaudi2_print_pcie_mstr_rr_mstr_if_razwi_info(struct hl_device *hdev, u64 *event_mask)8902{8903u32 mstr_if_base_addr = mmPCIE_MSTR_RR_MSTR_IF_RR_SHRD_HBW_BASE, razwi_happened_addr;89048905razwi_happened_addr = mstr_if_base_addr + RR_SHRD_HBW_AW_RAZWI_HAPPENED;8906if (RREG32(razwi_happened_addr)) {8907gaudi2_razwi_rr_hbw_shared_printf_info(hdev, mstr_if_base_addr, true, "PCIE",8908GAUDI2_ENGINE_ID_PCIE, event_mask);8909WREG32(razwi_happened_addr, 0x1);8910}89118912razwi_happened_addr = mstr_if_base_addr + RR_SHRD_HBW_AR_RAZWI_HAPPENED;8913if (RREG32(razwi_happened_addr)) {8914gaudi2_razwi_rr_hbw_shared_printf_info(hdev, mstr_if_base_addr, false, "PCIE",8915GAUDI2_ENGINE_ID_PCIE, event_mask);8916WREG32(razwi_happened_addr, 0x1);8917}89188919razwi_happened_addr = mstr_if_base_addr + RR_SHRD_LBW_AW_RAZWI_HAPPENED;8920if (RREG32(razwi_happened_addr)) {8921gaudi2_razwi_rr_lbw_shared_printf_info(hdev, mstr_if_base_addr, true, "PCIE",8922GAUDI2_ENGINE_ID_PCIE, event_mask);8923WREG32(razwi_happened_addr, 0x1);8924}89258926razwi_happened_addr = mstr_if_base_addr + RR_SHRD_LBW_AR_RAZWI_HAPPENED;8927if (RREG32(razwi_happened_addr)) {8928gaudi2_razwi_rr_lbw_shared_printf_info(hdev, mstr_if_base_addr, false, "PCIE",8929GAUDI2_ENGINE_ID_PCIE, event_mask);8930WREG32(razwi_happened_addr, 0x1);8931}8932}89338934static int gaudi2_print_pcie_addr_dec_info(struct hl_device *hdev, u16 event_type,8935u64 intr_cause_data, u64 *event_mask)8936{8937u32 error_count = 0;8938int i;89398940for (i = 0 ; i < GAUDI2_NUM_OF_PCIE_ADDR_DEC_ERR_CAUSE ; i++) {8941if (!(intr_cause_data & BIT_ULL(i)))8942continue;89438944gaudi2_print_event(hdev, event_type, true,8945"err cause: %s", gaudi2_pcie_addr_dec_error_cause[i]);8946error_count++;89478948switch (intr_cause_data & BIT_ULL(i)) {8949case PCIE_WRAP_PCIE_IC_SEI_INTR_IND_AXI_LBW_ERR_INTR_MASK:8950hl_check_for_glbl_errors(hdev);8951break;8952case PCIE_WRAP_PCIE_IC_SEI_INTR_IND_BAD_ACCESS_INTR_MASK:8953gaudi2_print_pcie_mstr_rr_mstr_if_razwi_info(hdev, event_mask);8954break;8955}8956}89578958return error_count;8959}89608961static int gaudi2_handle_pif_fatal(struct hl_device *hdev, u16 event_type,8962u64 intr_cause_data)89638964{8965u32 error_count = 0;8966int i;89678968for (i = 0 ; i < GAUDI2_NUM_OF_PMMU_FATAL_ERR_CAUSE ; i++) {8969if (intr_cause_data & BIT_ULL(i)) {8970gaudi2_print_event(hdev, event_type, true,8971"err cause: %s", gaudi2_pmmu_fatal_interrupts_cause[i]);8972error_count++;8973}8974}89758976return error_count;8977}89788979static int gaudi2_handle_hif_fatal(struct hl_device *hdev, u16 event_type, u64 intr_cause_data)8980{8981u32 error_count = 0;8982int i;89838984for (i = 0 ; i < GAUDI2_NUM_OF_HIF_FATAL_ERR_CAUSE ; i++) {8985if (intr_cause_data & BIT_ULL(i)) {8986gaudi2_print_event(hdev, event_type, true,8987"err cause: %s", gaudi2_hif_fatal_interrupts_cause[i]);8988error_count++;8989}8990}89918992return error_count;8993}89948995static void gaudi2_handle_page_error(struct hl_device *hdev, u64 mmu_base, bool is_pmmu,8996u64 *event_mask)8997{8998u32 valid, val;8999u64 addr;90009001valid = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID));90029003if (!(valid & DCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID_PAGE_ERR_VALID_ENTRY_MASK))9004return;90059006val = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_PAGE_ERROR_CAPTURE));9007addr = val & DCORE0_HMMU0_MMU_PAGE_ERROR_CAPTURE_VA_63_32_MASK;9008addr <<= 32;9009addr |= RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_PAGE_ERROR_CAPTURE_VA));90109011if (is_pmmu) {9012dev_err_ratelimited(hdev->dev, "PMMU page fault on va 0x%llx\n", addr);9013} else {9014addr = gaudi2_mmu_descramble_addr(hdev, addr);9015addr &= HW_UNSCRAMBLED_BITS_MASK;9016dev_err_ratelimited(hdev->dev, "HMMU page fault on va range 0x%llx - 0x%llx\n",9017addr, addr + ~HW_UNSCRAMBLED_BITS_MASK);9018}90199020hl_handle_page_fault(hdev, addr, 0, is_pmmu, event_mask);90219022WREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID), 0);9023}90249025static void gaudi2_handle_access_error(struct hl_device *hdev, u64 mmu_base, bool is_pmmu)9026{9027u32 valid, val;9028u64 addr;90299030valid = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID));90319032if (!(valid & DCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID_ACCESS_ERR_VALID_ENTRY_MASK))9033return;90349035val = RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_ERROR_CAPTURE));9036addr = val & DCORE0_HMMU0_MMU_ACCESS_ERROR_CAPTURE_VA_63_32_MASK;9037addr <<= 32;9038addr |= RREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_ERROR_CAPTURE_VA));90399040if (!is_pmmu)9041addr = gaudi2_mmu_descramble_addr(hdev, addr);90429043dev_err_ratelimited(hdev->dev, "%s access error on va 0x%llx\n",9044is_pmmu ? "PMMU" : "HMMU", addr);9045WREG32(mmu_base + MMU_OFFSET(mmDCORE0_HMMU0_MMU_ACCESS_PAGE_ERROR_VALID), 0);9046}90479048static int gaudi2_handle_mmu_spi_sei_generic(struct hl_device *hdev, u16 event_type,9049u64 mmu_base, bool is_pmmu, u64 *event_mask)9050{9051u32 spi_sei_cause, interrupt_clr = 0x0, error_count = 0;9052int i;90539054spi_sei_cause = RREG32(mmu_base + MMU_SPI_SEI_CAUSE_OFFSET);90559056for (i = 0 ; i < GAUDI2_NUM_OF_MMU_SPI_SEI_CAUSE ; i++) {9057if (spi_sei_cause & BIT(i)) {9058gaudi2_print_event(hdev, event_type, true,9059"err cause: %s", gaudi2_mmu_spi_sei[i].cause);90609061if (i == 0)9062gaudi2_handle_page_error(hdev, mmu_base, is_pmmu, event_mask);9063else if (i == 1)9064gaudi2_handle_access_error(hdev, mmu_base, is_pmmu);90659066if (gaudi2_mmu_spi_sei[i].clear_bit >= 0)9067interrupt_clr |= BIT(gaudi2_mmu_spi_sei[i].clear_bit);90689069error_count++;9070}9071}90729073/* Clear cause */9074WREG32_AND(mmu_base + MMU_SPI_SEI_CAUSE_OFFSET, ~spi_sei_cause);90759076/* Clear interrupt */9077WREG32(mmu_base + MMU_INTERRUPT_CLR_OFFSET, interrupt_clr);90789079return error_count;9080}90819082static int gaudi2_handle_sm_err(struct hl_device *hdev, u16 event_type, u8 sm_index)9083{9084u32 sei_cause_addr, sei_cause_val, sei_cause_cause, sei_cause_log,9085cq_intr_addr, cq_intr_val, cq_intr_queue_index, error_count = 0;9086int i;90879088sei_cause_addr = mmDCORE0_SYNC_MNGR_GLBL_SM_SEI_CAUSE + DCORE_OFFSET * sm_index;9089cq_intr_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_INTR + DCORE_OFFSET * sm_index;90909091sei_cause_val = RREG32(sei_cause_addr);9092sei_cause_cause = FIELD_GET(DCORE0_SYNC_MNGR_GLBL_SM_SEI_CAUSE_CAUSE_MASK, sei_cause_val);9093cq_intr_val = RREG32(cq_intr_addr);90949095/* SEI interrupt */9096if (sei_cause_cause) {9097/* There are corresponding SEI_CAUSE_log bits for every SEI_CAUSE_cause bit */9098sei_cause_log = FIELD_GET(DCORE0_SYNC_MNGR_GLBL_SM_SEI_CAUSE_LOG_MASK,9099sei_cause_val);91009101for (i = 0 ; i < GAUDI2_NUM_OF_SM_SEI_ERR_CAUSE ; i++) {9102if (!(sei_cause_cause & BIT(i)))9103continue;91049105gaudi2_print_event(hdev, event_type, true,9106"err cause: %s. %s: 0x%X",9107gaudi2_sm_sei_cause[i].cause_name,9108gaudi2_sm_sei_cause[i].log_name,9109sei_cause_log);9110error_count++;9111break;9112}91139114/* Clear SM_SEI_CAUSE */9115WREG32(sei_cause_addr, 0);9116}91179118/* CQ interrupt */9119if (cq_intr_val & DCORE0_SYNC_MNGR_GLBL_CQ_INTR_CQ_SEC_INTR_MASK) {9120cq_intr_queue_index =9121FIELD_GET(DCORE0_SYNC_MNGR_GLBL_CQ_INTR_CQ_INTR_QUEUE_INDEX_MASK,9122cq_intr_val);91239124dev_err_ratelimited(hdev->dev, "SM%u err. err cause: CQ_INTR. queue index: %u\n",9125sm_index, cq_intr_queue_index);9126error_count++;91279128/* Clear CQ_INTR */9129WREG32(cq_intr_addr, 0);9130}91319132hl_check_for_glbl_errors(hdev);91339134return error_count;9135}91369137static u64 get_hmmu_base(u16 event_type)9138{9139u8 dcore, index_in_dcore;91409141switch (event_type) {9142case GAUDI2_EVENT_HMMU_0_AXI_ERR_RSP:9143case GAUDI2_EVENT_HMMU0_SPI_BASE ... GAUDI2_EVENT_HMMU0_SECURITY_ERROR:9144dcore = 0;9145index_in_dcore = 0;9146break;9147case GAUDI2_EVENT_HMMU_1_AXI_ERR_RSP:9148case GAUDI2_EVENT_HMMU1_SPI_BASE ... GAUDI2_EVENT_HMMU1_SECURITY_ERROR:9149dcore = 1;9150index_in_dcore = 0;9151break;9152case GAUDI2_EVENT_HMMU_2_AXI_ERR_RSP:9153case GAUDI2_EVENT_HMMU2_SPI_BASE ... GAUDI2_EVENT_HMMU2_SECURITY_ERROR:9154dcore = 0;9155index_in_dcore = 1;9156break;9157case GAUDI2_EVENT_HMMU_3_AXI_ERR_RSP:9158case GAUDI2_EVENT_HMMU3_SPI_BASE ... GAUDI2_EVENT_HMMU3_SECURITY_ERROR:9159dcore = 1;9160index_in_dcore = 1;9161break;9162case GAUDI2_EVENT_HMMU_4_AXI_ERR_RSP:9163case GAUDI2_EVENT_HMMU4_SPI_BASE ... GAUDI2_EVENT_HMMU4_SECURITY_ERROR:9164dcore = 3;9165index_in_dcore = 2;9166break;9167case GAUDI2_EVENT_HMMU_5_AXI_ERR_RSP:9168case GAUDI2_EVENT_HMMU5_SPI_BASE ... GAUDI2_EVENT_HMMU5_SECURITY_ERROR:9169dcore = 2;9170index_in_dcore = 2;9171break;9172case GAUDI2_EVENT_HMMU_6_AXI_ERR_RSP:9173case GAUDI2_EVENT_HMMU6_SPI_BASE ... GAUDI2_EVENT_HMMU6_SECURITY_ERROR:9174dcore = 3;9175index_in_dcore = 3;9176break;9177case GAUDI2_EVENT_HMMU_7_AXI_ERR_RSP:9178case GAUDI2_EVENT_HMMU7_SPI_BASE ... GAUDI2_EVENT_HMMU7_SECURITY_ERROR:9179dcore = 2;9180index_in_dcore = 3;9181break;9182case GAUDI2_EVENT_HMMU_8_AXI_ERR_RSP:9183case GAUDI2_EVENT_HMMU8_SPI_BASE ... GAUDI2_EVENT_HMMU8_SECURITY_ERROR:9184dcore = 0;9185index_in_dcore = 2;9186break;9187case GAUDI2_EVENT_HMMU_9_AXI_ERR_RSP:9188case GAUDI2_EVENT_HMMU9_SPI_BASE ... GAUDI2_EVENT_HMMU9_SECURITY_ERROR:9189dcore = 1;9190index_in_dcore = 2;9191break;9192case GAUDI2_EVENT_HMMU_10_AXI_ERR_RSP:9193case GAUDI2_EVENT_HMMU10_SPI_BASE ... GAUDI2_EVENT_HMMU10_SECURITY_ERROR:9194dcore = 0;9195index_in_dcore = 3;9196break;9197case GAUDI2_EVENT_HMMU_11_AXI_ERR_RSP:9198case GAUDI2_EVENT_HMMU11_SPI_BASE ... GAUDI2_EVENT_HMMU11_SECURITY_ERROR:9199dcore = 1;9200index_in_dcore = 3;9201break;9202case GAUDI2_EVENT_HMMU_12_AXI_ERR_RSP:9203case GAUDI2_EVENT_HMMU12_SPI_BASE ... GAUDI2_EVENT_HMMU12_SECURITY_ERROR:9204dcore = 3;9205index_in_dcore = 0;9206break;9207case GAUDI2_EVENT_HMMU_13_AXI_ERR_RSP:9208case GAUDI2_EVENT_HMMU13_SPI_BASE ... GAUDI2_EVENT_HMMU13_SECURITY_ERROR:9209dcore = 2;9210index_in_dcore = 0;9211break;9212case GAUDI2_EVENT_HMMU_14_AXI_ERR_RSP:9213case GAUDI2_EVENT_HMMU14_SPI_BASE ... GAUDI2_EVENT_HMMU14_SECURITY_ERROR:9214dcore = 3;9215index_in_dcore = 1;9216break;9217case GAUDI2_EVENT_HMMU_15_AXI_ERR_RSP:9218case GAUDI2_EVENT_HMMU15_SPI_BASE ... GAUDI2_EVENT_HMMU15_SECURITY_ERROR:9219dcore = 2;9220index_in_dcore = 1;9221break;9222default:9223return ULONG_MAX;9224}92259226return mmDCORE0_HMMU0_MMU_BASE + dcore * DCORE_OFFSET + index_in_dcore * DCORE_HMMU_OFFSET;9227}92289229static int gaudi2_handle_mmu_spi_sei_err(struct hl_device *hdev, u16 event_type, u64 *event_mask)9230{9231bool is_pmmu = false;9232u32 error_count = 0;9233u64 mmu_base;92349235switch (event_type) {9236case GAUDI2_EVENT_HMMU_0_AXI_ERR_RSP ... GAUDI2_EVENT_HMMU_12_AXI_ERR_RSP:9237case GAUDI2_EVENT_HMMU0_SPI_BASE ... GAUDI2_EVENT_HMMU12_SECURITY_ERROR:9238mmu_base = get_hmmu_base(event_type);9239break;92409241case GAUDI2_EVENT_PMMU0_PAGE_FAULT_WR_PERM ... GAUDI2_EVENT_PMMU0_SECURITY_ERROR:9242case GAUDI2_EVENT_PMMU_AXI_ERR_RSP_0:9243is_pmmu = true;9244mmu_base = mmPMMU_HBW_MMU_BASE;9245break;9246default:9247return 0;9248}92499250if (mmu_base == ULONG_MAX)9251return 0;92529253error_count = gaudi2_handle_mmu_spi_sei_generic(hdev, event_type, mmu_base,9254is_pmmu, event_mask);9255hl_check_for_glbl_errors(hdev);92569257return error_count;9258}925992609261/* returns true if hard reset is required (ECC DERR or Read parity), false otherwise (ECC SERR) */9262static bool gaudi2_hbm_sei_handle_read_err(struct hl_device *hdev,9263struct hl_eq_hbm_sei_read_err_intr_info *rd_err_data, u32 err_cnt)9264{9265bool require_hard_reset = false;9266u32 addr, beat, beat_shift;92679268dev_err_ratelimited(hdev->dev,9269"READ ERROR count: ECC SERR: %d, ECC DERR: %d, RD_PARITY: %d\n",9270FIELD_GET(HBM_ECC_SERR_CNTR_MASK, err_cnt),9271FIELD_GET(HBM_ECC_DERR_CNTR_MASK, err_cnt),9272FIELD_GET(HBM_RD_PARITY_CNTR_MASK, err_cnt));92739274addr = le32_to_cpu(rd_err_data->dbg_rd_err_addr.rd_addr_val);9275dev_err_ratelimited(hdev->dev,9276"READ ERROR address: sid(%u), bg(%u), ba(%u), col(%u), row(%u)\n",9277FIELD_GET(HBM_RD_ADDR_SID_MASK, addr),9278FIELD_GET(HBM_RD_ADDR_BG_MASK, addr),9279FIELD_GET(HBM_RD_ADDR_BA_MASK, addr),9280FIELD_GET(HBM_RD_ADDR_COL_MASK, addr),9281FIELD_GET(HBM_RD_ADDR_ROW_MASK, addr));92829283/* For each beat (RDQS edge), look for possible errors and print relevant info */9284for (beat = 0 ; beat < 4 ; beat++) {9285if (le32_to_cpu(rd_err_data->dbg_rd_err_misc) &9286(HBM_RD_ERR_SERR_BEAT0_MASK << beat))9287dev_err_ratelimited(hdev->dev, "Beat%d ECC SERR: DM: %#x, Syndrome: %#x\n",9288beat,9289le32_to_cpu(rd_err_data->dbg_rd_err_dm),9290le32_to_cpu(rd_err_data->dbg_rd_err_syndrome));92919292if (le32_to_cpu(rd_err_data->dbg_rd_err_misc) &9293(HBM_RD_ERR_DERR_BEAT0_MASK << beat)) {9294dev_err_ratelimited(hdev->dev, "Beat%d ECC DERR: DM: %#x, Syndrome: %#x\n",9295beat,9296le32_to_cpu(rd_err_data->dbg_rd_err_dm),9297le32_to_cpu(rd_err_data->dbg_rd_err_syndrome));9298require_hard_reset = true;9299}93009301beat_shift = beat * HBM_RD_ERR_BEAT_SHIFT;9302if (le32_to_cpu(rd_err_data->dbg_rd_err_misc) &9303(HBM_RD_ERR_PAR_ERR_BEAT0_MASK << beat_shift)) {9304dev_err_ratelimited(hdev->dev,9305"Beat%d read PARITY: DM: %#x, PAR data: %#x\n",9306beat,9307le32_to_cpu(rd_err_data->dbg_rd_err_dm),9308(le32_to_cpu(rd_err_data->dbg_rd_err_misc) &9309(HBM_RD_ERR_PAR_DATA_BEAT0_MASK << beat_shift)) >>9310(HBM_RD_ERR_PAR_DATA_BEAT0_SHIFT + beat_shift));9311require_hard_reset = true;9312}93139314dev_err_ratelimited(hdev->dev, "Beat%d DQ data:\n", beat);9315dev_err_ratelimited(hdev->dev, "\t0x%08x\n",9316le32_to_cpu(rd_err_data->dbg_rd_err_data[beat * 2]));9317dev_err_ratelimited(hdev->dev, "\t0x%08x\n",9318le32_to_cpu(rd_err_data->dbg_rd_err_data[beat * 2 + 1]));9319}93209321return require_hard_reset;9322}93239324static void gaudi2_hbm_sei_print_wr_par_info(struct hl_device *hdev,9325struct hl_eq_hbm_sei_wr_par_intr_info *wr_par_err_data, u32 err_cnt)9326{9327struct hbm_sei_wr_cmd_address *wr_cmd_addr = wr_par_err_data->dbg_last_wr_cmds;9328u32 i, curr_addr, derr = wr_par_err_data->dbg_derr;93299330dev_err_ratelimited(hdev->dev, "WRITE PARITY ERROR count: %d\n", err_cnt);93319332dev_err_ratelimited(hdev->dev, "CK-0 DERR: 0x%02x, CK-1 DERR: 0x%02x\n",9333derr & 0x3, derr & 0xc);93349335/* JIRA H6-3286 - the following prints may not be valid */9336dev_err_ratelimited(hdev->dev, "Last latched write commands addresses:\n");9337for (i = 0 ; i < HBM_WR_PAR_CMD_LIFO_LEN ; i++) {9338curr_addr = le32_to_cpu(wr_cmd_addr[i].dbg_wr_cmd_addr);9339dev_err_ratelimited(hdev->dev,9340"\twrite cmd[%u]: Address: SID(%u) BG(%u) BA(%u) COL(%u).\n",9341i,9342FIELD_GET(WR_PAR_LAST_CMD_SID_MASK, curr_addr),9343FIELD_GET(WR_PAR_LAST_CMD_BG_MASK, curr_addr),9344FIELD_GET(WR_PAR_LAST_CMD_BA_MASK, curr_addr),9345FIELD_GET(WR_PAR_LAST_CMD_COL_MASK, curr_addr));9346}9347}93489349static void gaudi2_hbm_sei_print_ca_par_info(struct hl_device *hdev,9350struct hl_eq_hbm_sei_ca_par_intr_info *ca_par_err_data, u32 err_cnt)9351{9352__le32 *col_cmd = ca_par_err_data->dbg_col;9353__le16 *row_cmd = ca_par_err_data->dbg_row;9354u32 i;93559356dev_err_ratelimited(hdev->dev, "CA ERROR count: %d\n", err_cnt);93579358dev_err_ratelimited(hdev->dev, "Last latched C&R bus commands:\n");9359for (i = 0 ; i < HBM_CA_ERR_CMD_LIFO_LEN ; i++)9360dev_err_ratelimited(hdev->dev, "cmd%u: ROW(0x%04x) COL(0x%05x)\n", i,9361le16_to_cpu(row_cmd[i]) & (u16)GENMASK(13, 0),9362le32_to_cpu(col_cmd[i]) & (u32)GENMASK(17, 0));9363}93649365/* Returns true if hard reset is needed or false otherwise */9366static bool gaudi2_handle_hbm_mc_sei_err(struct hl_device *hdev, u16 event_type,9367struct hl_eq_hbm_sei_data *sei_data)9368{9369bool require_hard_reset = false;9370u32 hbm_id, mc_id, cause_idx;93719372hbm_id = (event_type - GAUDI2_EVENT_HBM0_MC0_SEI_SEVERE) / 4;9373mc_id = ((event_type - GAUDI2_EVENT_HBM0_MC0_SEI_SEVERE) / 2) % 2;93749375cause_idx = sei_data->hdr.sei_cause;9376if (cause_idx > GAUDI2_NUM_OF_HBM_SEI_CAUSE - 1) {9377gaudi2_print_event(hdev, event_type, true,9378"err cause: %s",9379"Invalid HBM SEI event cause (%d) provided by FW", cause_idx);9380return true;9381}93829383gaudi2_print_event(hdev, event_type, !sei_data->hdr.is_critical,9384"System %s Error Interrupt - HBM(%u) MC(%u) MC_CH(%u) MC_PC(%u). Error cause: %s",9385sei_data->hdr.is_critical ? "Critical" : "Non-critical",9386hbm_id, mc_id, sei_data->hdr.mc_channel, sei_data->hdr.mc_pseudo_channel,9387hbm_mc_sei_cause[cause_idx]);93889389/* Print error-specific info */9390switch (cause_idx) {9391case HBM_SEI_CATTRIP:9392require_hard_reset = true;9393break;93949395case HBM_SEI_CMD_PARITY_EVEN:9396gaudi2_hbm_sei_print_ca_par_info(hdev, &sei_data->ca_parity_even_info,9397le32_to_cpu(sei_data->hdr.cnt));9398require_hard_reset = true;9399break;94009401case HBM_SEI_CMD_PARITY_ODD:9402gaudi2_hbm_sei_print_ca_par_info(hdev, &sei_data->ca_parity_odd_info,9403le32_to_cpu(sei_data->hdr.cnt));9404require_hard_reset = true;9405break;94069407case HBM_SEI_WRITE_DATA_PARITY_ERR:9408gaudi2_hbm_sei_print_wr_par_info(hdev, &sei_data->wr_parity_info,9409le32_to_cpu(sei_data->hdr.cnt));9410require_hard_reset = true;9411break;94129413case HBM_SEI_READ_ERR:9414/* Unlike other SEI events, read error requires further processing of the9415* raw data in order to determine the root cause.9416*/9417require_hard_reset = gaudi2_hbm_sei_handle_read_err(hdev,9418&sei_data->read_err_info,9419le32_to_cpu(sei_data->hdr.cnt));9420break;94219422default:9423break;9424}94259426require_hard_reset |= !!sei_data->hdr.is_critical;94279428return require_hard_reset;9429}94309431static int gaudi2_handle_hbm_cattrip(struct hl_device *hdev, u16 event_type,9432u64 intr_cause_data)9433{9434if (intr_cause_data) {9435gaudi2_print_event(hdev, event_type, true,9436"temperature error cause: %#llx", intr_cause_data);9437return 1;9438}94399440return 0;9441}94429443static int gaudi2_handle_hbm_mc_spi(struct hl_device *hdev, u64 intr_cause_data)9444{9445u32 i, error_count = 0;94469447for (i = 0 ; i < GAUDI2_NUM_OF_HBM_MC_SPI_CAUSE ; i++)9448if (intr_cause_data & hbm_mc_spi[i].mask) {9449dev_dbg(hdev->dev, "HBM spi event: notification cause(%s)\n",9450hbm_mc_spi[i].cause);9451error_count++;9452}94539454return error_count;9455}94569457static void gaudi2_print_clk_change_info(struct hl_device *hdev, u16 event_type, u64 *event_mask)9458{9459ktime_t zero_time = ktime_set(0, 0);94609461mutex_lock(&hdev->clk_throttling.lock);94629463switch (event_type) {9464case GAUDI2_EVENT_CPU_FIX_POWER_ENV_S:9465hdev->clk_throttling.current_reason |= HL_CLK_THROTTLE_POWER;9466hdev->clk_throttling.aggregated_reason |= HL_CLK_THROTTLE_POWER;9467hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_POWER].start = ktime_get();9468hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_POWER].end = zero_time;9469dev_dbg_ratelimited(hdev->dev, "Clock throttling due to power consumption\n");9470break;94719472case GAUDI2_EVENT_CPU_FIX_POWER_ENV_E:9473hdev->clk_throttling.current_reason &= ~HL_CLK_THROTTLE_POWER;9474hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_POWER].end = ktime_get();9475dev_dbg_ratelimited(hdev->dev, "Power envelop is safe, back to optimal clock\n");9476break;94779478case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_S:9479hdev->clk_throttling.current_reason |= HL_CLK_THROTTLE_THERMAL;9480hdev->clk_throttling.aggregated_reason |= HL_CLK_THROTTLE_THERMAL;9481hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_THERMAL].start = ktime_get();9482hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_THERMAL].end = zero_time;9483*event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9484dev_info_ratelimited(hdev->dev, "Clock throttling due to overheating\n");9485break;94869487case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_E:9488hdev->clk_throttling.current_reason &= ~HL_CLK_THROTTLE_THERMAL;9489hdev->clk_throttling.timestamp[HL_CLK_THROTTLE_TYPE_THERMAL].end = ktime_get();9490*event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9491dev_info_ratelimited(hdev->dev, "Thermal envelop is safe, back to optimal clock\n");9492break;94939494default:9495dev_err(hdev->dev, "Received invalid clock change event %d\n", event_type);9496break;9497}94989499mutex_unlock(&hdev->clk_throttling.lock);9500}95019502static void gaudi2_print_out_of_sync_info(struct hl_device *hdev, u16 event_type,9503struct cpucp_pkt_sync_err *sync_err)9504{9505struct hl_hw_queue *q = &hdev->kernel_queues[GAUDI2_QUEUE_ID_CPU_PQ];95069507gaudi2_print_event(hdev, event_type, false,9508"FW: pi=%u, ci=%u, LKD: pi=%u, ci=%d",9509le32_to_cpu(sync_err->pi), le32_to_cpu(sync_err->ci),9510q->pi, atomic_read(&q->ci));9511}95129513static int gaudi2_handle_pcie_p2p_msix(struct hl_device *hdev, u16 event_type)9514{9515u32 p2p_intr, msix_gw_intr, error_count = 0;95169517p2p_intr = RREG32(mmPCIE_WRAP_P2P_INTR);9518msix_gw_intr = RREG32(mmPCIE_WRAP_MSIX_GW_INTR);95199520if (p2p_intr) {9521gaudi2_print_event(hdev, event_type, true,9522"pcie p2p transaction terminated due to security, req_id(0x%x)",9523RREG32(mmPCIE_WRAP_P2P_REQ_ID));95249525WREG32(mmPCIE_WRAP_P2P_INTR, 0x1);9526error_count++;9527}95289529if (msix_gw_intr) {9530gaudi2_print_event(hdev, event_type, true,9531"pcie msi-x gen denied due to vector num check failure, vec(0x%X)",9532RREG32(mmPCIE_WRAP_MSIX_GW_VEC));95339534WREG32(mmPCIE_WRAP_MSIX_GW_INTR, 0x1);9535error_count++;9536}95379538return error_count;9539}95409541static int gaudi2_handle_pcie_drain(struct hl_device *hdev,9542struct hl_eq_pcie_drain_ind_data *drain_data)9543{9544u64 cause, error_count = 0;95459546cause = le64_to_cpu(drain_data->intr_cause.intr_cause_data);95479548if (cause & BIT_ULL(0)) {9549dev_err_ratelimited(hdev->dev, "PCIE AXI drain LBW completed\n");9550error_count++;9551}95529553if (cause & BIT_ULL(1)) {9554dev_err_ratelimited(hdev->dev, "PCIE AXI drain HBW completed\n");9555error_count++;9556}95579558return error_count;9559}95609561static int gaudi2_handle_psoc_drain(struct hl_device *hdev, u64 intr_cause_data)9562{9563u32 error_count = 0;9564int i;95659566for (i = 0 ; i < GAUDI2_NUM_OF_AXI_DRAIN_ERR_CAUSE ; i++) {9567if (intr_cause_data & BIT_ULL(i)) {9568dev_err_ratelimited(hdev->dev, "PSOC %s completed\n",9569gaudi2_psoc_axi_drain_interrupts_cause[i]);9570error_count++;9571}9572}95739574hl_check_for_glbl_errors(hdev);95759576return error_count;9577}95789579static void gaudi2_print_cpu_pkt_failure_info(struct hl_device *hdev, u16 event_type,9580struct cpucp_pkt_sync_err *sync_err)9581{9582struct hl_hw_queue *q = &hdev->kernel_queues[GAUDI2_QUEUE_ID_CPU_PQ];95839584gaudi2_print_event(hdev, event_type, false,9585"FW reported sanity check failure, FW: pi=%u, ci=%u, LKD: pi=%u, ci=%d",9586le32_to_cpu(sync_err->pi), le32_to_cpu(sync_err->ci), q->pi, atomic_read(&q->ci));9587}95889589static int hl_arc_event_handle(struct hl_device *hdev, u16 event_type,9590struct hl_eq_engine_arc_intr_data *data)9591{9592struct hl_engine_arc_dccm_queue_full_irq *q;9593u32 intr_type, engine_id;9594u64 payload;95959596intr_type = le32_to_cpu(data->intr_type);9597engine_id = le32_to_cpu(data->engine_id);9598payload = le64_to_cpu(data->payload);95999600switch (intr_type) {9601case ENGINE_ARC_DCCM_QUEUE_FULL_IRQ:9602q = (struct hl_engine_arc_dccm_queue_full_irq *) &payload;96039604gaudi2_print_event(hdev, event_type, true,9605"ARC DCCM Full event: EngId: %u, Intr_type: %u, Qidx: %u",9606engine_id, intr_type, q->queue_index);9607return 1;9608default:9609gaudi2_print_event(hdev, event_type, true, "Unknown ARC event type");9610return 0;9611}9612}96139614static u16 event_id_to_engine_id(struct hl_device *hdev, u16 event_type)9615{9616enum gaudi2_block_types type = GAUDI2_BLOCK_TYPE_MAX;9617u16 index;96189619switch (event_type) {9620case GAUDI2_EVENT_TPC0_AXI_ERR_RSP ... GAUDI2_EVENT_TPC24_AXI_ERR_RSP:9621index = event_type - GAUDI2_EVENT_TPC0_AXI_ERR_RSP;9622type = GAUDI2_BLOCK_TYPE_TPC;9623break;9624case GAUDI2_EVENT_TPC0_QM ... GAUDI2_EVENT_TPC24_QM:9625index = event_type - GAUDI2_EVENT_TPC0_QM;9626type = GAUDI2_BLOCK_TYPE_TPC;9627break;9628case GAUDI2_EVENT_MME0_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE:9629case GAUDI2_EVENT_MME0_SPI_BASE ... GAUDI2_EVENT_MME0_WAP_SOURCE_RESULT_INVALID:9630case GAUDI2_EVENT_MME0_QM:9631index = 0;9632type = GAUDI2_BLOCK_TYPE_MME;9633break;9634case GAUDI2_EVENT_MME1_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE:9635case GAUDI2_EVENT_MME1_SPI_BASE ... GAUDI2_EVENT_MME1_WAP_SOURCE_RESULT_INVALID:9636case GAUDI2_EVENT_MME1_QM:9637index = 1;9638type = GAUDI2_BLOCK_TYPE_MME;9639break;9640case GAUDI2_EVENT_MME2_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME2_CTRL_AXI_ERROR_RESPONSE:9641case GAUDI2_EVENT_MME2_SPI_BASE ... GAUDI2_EVENT_MME2_WAP_SOURCE_RESULT_INVALID:9642case GAUDI2_EVENT_MME2_QM:9643index = 2;9644type = GAUDI2_BLOCK_TYPE_MME;9645break;9646case GAUDI2_EVENT_MME3_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME3_CTRL_AXI_ERROR_RESPONSE:9647case GAUDI2_EVENT_MME3_SPI_BASE ... GAUDI2_EVENT_MME3_WAP_SOURCE_RESULT_INVALID:9648case GAUDI2_EVENT_MME3_QM:9649index = 3;9650type = GAUDI2_BLOCK_TYPE_MME;9651break;9652case GAUDI2_EVENT_KDMA_CH0_AXI_ERR_RSP:9653case GAUDI2_EVENT_KDMA_BM_SPMU:9654case GAUDI2_EVENT_KDMA0_CORE:9655return GAUDI2_ENGINE_ID_KDMA;9656case GAUDI2_EVENT_PDMA_CH0_AXI_ERR_RSP:9657case GAUDI2_EVENT_PDMA0_CORE:9658case GAUDI2_EVENT_PDMA0_BM_SPMU:9659case GAUDI2_EVENT_PDMA0_QM:9660return GAUDI2_ENGINE_ID_PDMA_0;9661case GAUDI2_EVENT_PDMA_CH1_AXI_ERR_RSP:9662case GAUDI2_EVENT_PDMA1_CORE:9663case GAUDI2_EVENT_PDMA1_BM_SPMU:9664case GAUDI2_EVENT_PDMA1_QM:9665return GAUDI2_ENGINE_ID_PDMA_1;9666case GAUDI2_EVENT_DEC0_AXI_ERR_RSPONSE ... GAUDI2_EVENT_DEC9_AXI_ERR_RSPONSE:9667index = event_type - GAUDI2_EVENT_DEC0_AXI_ERR_RSPONSE;9668type = GAUDI2_BLOCK_TYPE_DEC;9669break;9670case GAUDI2_EVENT_DEC0_SPI ... GAUDI2_EVENT_DEC9_BMON_SPMU:9671index = (event_type - GAUDI2_EVENT_DEC0_SPI) >> 1;9672type = GAUDI2_BLOCK_TYPE_DEC;9673break;9674case GAUDI2_EVENT_NIC0_AXI_ERROR_RESPONSE ... GAUDI2_EVENT_NIC11_AXI_ERROR_RESPONSE:9675index = event_type - GAUDI2_EVENT_NIC0_AXI_ERROR_RESPONSE;9676return GAUDI2_ENGINE_ID_NIC0_0 + (index * 2);9677case GAUDI2_EVENT_NIC0_QM0 ... GAUDI2_EVENT_NIC11_QM1:9678index = event_type - GAUDI2_EVENT_NIC0_QM0;9679return GAUDI2_ENGINE_ID_NIC0_0 + index;9680case GAUDI2_EVENT_NIC0_BMON_SPMU ... GAUDI2_EVENT_NIC11_SW_ERROR:9681index = event_type - GAUDI2_EVENT_NIC0_BMON_SPMU;9682return GAUDI2_ENGINE_ID_NIC0_0 + (index * 2);9683case GAUDI2_EVENT_TPC0_BMON_SPMU ... GAUDI2_EVENT_TPC24_KERNEL_ERR:9684index = (event_type - GAUDI2_EVENT_TPC0_BMON_SPMU) >> 1;9685type = GAUDI2_BLOCK_TYPE_TPC;9686break;9687case GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE:9688case GAUDI2_EVENT_ROTATOR0_BMON_SPMU:9689case GAUDI2_EVENT_ROTATOR0_ROT0_QM:9690return GAUDI2_ENGINE_ID_ROT_0;9691case GAUDI2_EVENT_ROTATOR1_AXI_ERROR_RESPONSE:9692case GAUDI2_EVENT_ROTATOR1_BMON_SPMU:9693case GAUDI2_EVENT_ROTATOR1_ROT1_QM:9694return GAUDI2_ENGINE_ID_ROT_1;9695case GAUDI2_EVENT_HDMA0_BM_SPMU:9696case GAUDI2_EVENT_HDMA0_QM:9697case GAUDI2_EVENT_HDMA0_CORE:9698return GAUDI2_DCORE0_ENGINE_ID_EDMA_0;9699case GAUDI2_EVENT_HDMA1_BM_SPMU:9700case GAUDI2_EVENT_HDMA1_QM:9701case GAUDI2_EVENT_HDMA1_CORE:9702return GAUDI2_DCORE0_ENGINE_ID_EDMA_1;9703case GAUDI2_EVENT_HDMA2_BM_SPMU:9704case GAUDI2_EVENT_HDMA2_QM:9705case GAUDI2_EVENT_HDMA2_CORE:9706return GAUDI2_DCORE1_ENGINE_ID_EDMA_0;9707case GAUDI2_EVENT_HDMA3_BM_SPMU:9708case GAUDI2_EVENT_HDMA3_QM:9709case GAUDI2_EVENT_HDMA3_CORE:9710return GAUDI2_DCORE1_ENGINE_ID_EDMA_1;9711case GAUDI2_EVENT_HDMA4_BM_SPMU:9712case GAUDI2_EVENT_HDMA4_QM:9713case GAUDI2_EVENT_HDMA4_CORE:9714return GAUDI2_DCORE2_ENGINE_ID_EDMA_0;9715case GAUDI2_EVENT_HDMA5_BM_SPMU:9716case GAUDI2_EVENT_HDMA5_QM:9717case GAUDI2_EVENT_HDMA5_CORE:9718return GAUDI2_DCORE2_ENGINE_ID_EDMA_1;9719case GAUDI2_EVENT_HDMA6_BM_SPMU:9720case GAUDI2_EVENT_HDMA6_QM:9721case GAUDI2_EVENT_HDMA6_CORE:9722return GAUDI2_DCORE3_ENGINE_ID_EDMA_0;9723case GAUDI2_EVENT_HDMA7_BM_SPMU:9724case GAUDI2_EVENT_HDMA7_QM:9725case GAUDI2_EVENT_HDMA7_CORE:9726return GAUDI2_DCORE3_ENGINE_ID_EDMA_1;9727default:9728break;9729}97309731switch (type) {9732case GAUDI2_BLOCK_TYPE_TPC:9733switch (index) {9734case TPC_ID_DCORE0_TPC0 ... TPC_ID_DCORE0_TPC5:9735return GAUDI2_DCORE0_ENGINE_ID_TPC_0 + index;9736case TPC_ID_DCORE1_TPC0 ... TPC_ID_DCORE1_TPC5:9737return GAUDI2_DCORE1_ENGINE_ID_TPC_0 + index - TPC_ID_DCORE1_TPC0;9738case TPC_ID_DCORE2_TPC0 ... TPC_ID_DCORE2_TPC5:9739return GAUDI2_DCORE2_ENGINE_ID_TPC_0 + index - TPC_ID_DCORE2_TPC0;9740case TPC_ID_DCORE3_TPC0 ... TPC_ID_DCORE3_TPC5:9741return GAUDI2_DCORE3_ENGINE_ID_TPC_0 + index - TPC_ID_DCORE3_TPC0;9742default:9743break;9744}9745break;9746case GAUDI2_BLOCK_TYPE_MME:9747switch (index) {9748case MME_ID_DCORE0: return GAUDI2_DCORE0_ENGINE_ID_MME;9749case MME_ID_DCORE1: return GAUDI2_DCORE1_ENGINE_ID_MME;9750case MME_ID_DCORE2: return GAUDI2_DCORE2_ENGINE_ID_MME;9751case MME_ID_DCORE3: return GAUDI2_DCORE3_ENGINE_ID_MME;9752default:9753break;9754}9755break;9756case GAUDI2_BLOCK_TYPE_DEC:9757switch (index) {9758case DEC_ID_DCORE0_DEC0: return GAUDI2_DCORE0_ENGINE_ID_DEC_0;9759case DEC_ID_DCORE0_DEC1: return GAUDI2_DCORE0_ENGINE_ID_DEC_1;9760case DEC_ID_DCORE1_DEC0: return GAUDI2_DCORE1_ENGINE_ID_DEC_0;9761case DEC_ID_DCORE1_DEC1: return GAUDI2_DCORE1_ENGINE_ID_DEC_1;9762case DEC_ID_DCORE2_DEC0: return GAUDI2_DCORE2_ENGINE_ID_DEC_0;9763case DEC_ID_DCORE2_DEC1: return GAUDI2_DCORE2_ENGINE_ID_DEC_1;9764case DEC_ID_DCORE3_DEC0: return GAUDI2_DCORE3_ENGINE_ID_DEC_0;9765case DEC_ID_DCORE3_DEC1: return GAUDI2_DCORE3_ENGINE_ID_DEC_1;9766case DEC_ID_PCIE_VDEC0: return GAUDI2_PCIE_ENGINE_ID_DEC_0;9767case DEC_ID_PCIE_VDEC1: return GAUDI2_PCIE_ENGINE_ID_DEC_1;9768default:9769break;9770}9771break;9772default:9773break;9774}97759776return U16_MAX;9777}97789779static void gaudi2_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entry)9780{9781struct gaudi2_device *gaudi2 = hdev->asic_specific;9782bool reset_required = false, is_critical = false;9783u32 index, ctl, reset_flags = 0, error_count = 0;9784u64 event_mask = 0;9785u16 event_type;97869787ctl = le32_to_cpu(eq_entry->hdr.ctl);9788event_type = ((ctl & EQ_CTL_EVENT_TYPE_MASK) >> EQ_CTL_EVENT_TYPE_SHIFT);97899790if (event_type >= GAUDI2_EVENT_SIZE) {9791dev_err(hdev->dev, "Event type %u exceeds maximum of %u",9792event_type, GAUDI2_EVENT_SIZE - 1);9793return;9794}97959796gaudi2->events_stat[event_type]++;9797gaudi2->events_stat_aggregate[event_type]++;97989799switch (event_type) {9800case GAUDI2_EVENT_PCIE_CORE_SERR ... GAUDI2_EVENT_ARC0_ECC_DERR:9801fallthrough;9802case GAUDI2_EVENT_ROTATOR0_SERR ... GAUDI2_EVENT_ROTATOR1_DERR:9803reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;9804event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;9805reset_required = gaudi2_handle_ecc_event(hdev, event_type, &eq_entry->ecc_data);9806is_critical = eq_entry->ecc_data.is_critical;9807error_count++;9808break;98099810case GAUDI2_EVENT_TPC0_QM ... GAUDI2_EVENT_PDMA1_QM:9811fallthrough;9812case GAUDI2_EVENT_ROTATOR0_ROT0_QM ... GAUDI2_EVENT_ROTATOR1_ROT1_QM:9813fallthrough;9814case GAUDI2_EVENT_NIC0_QM0 ... GAUDI2_EVENT_NIC11_QM1:9815error_count = gaudi2_handle_qman_err(hdev, event_type, &event_mask);9816event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9817break;98189819case GAUDI2_EVENT_ARC_AXI_ERROR_RESPONSE_0:9820error_count = gaudi2_handle_arc_farm_sei_err(hdev, event_type, &event_mask);9821event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9822break;98239824case GAUDI2_EVENT_CPU_AXI_ERR_RSP:9825error_count = gaudi2_handle_cpu_sei_err(hdev, event_type);9826reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;9827event_mask |= HL_NOTIFIER_EVENT_CRITICL_FW_ERR;9828break;98299830case GAUDI2_EVENT_PDMA_CH0_AXI_ERR_RSP:9831case GAUDI2_EVENT_PDMA_CH1_AXI_ERR_RSP:9832error_count = gaudi2_handle_qm_sei_err(hdev, event_type, true, &event_mask);9833event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9834break;98359836case GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE:9837case GAUDI2_EVENT_ROTATOR1_AXI_ERROR_RESPONSE:9838index = event_type - GAUDI2_EVENT_ROTATOR0_AXI_ERROR_RESPONSE;9839error_count = gaudi2_handle_rot_err(hdev, index, event_type,9840&eq_entry->razwi_with_intr_cause, &event_mask);9841error_count += gaudi2_handle_qm_sei_err(hdev, event_type, false, &event_mask);9842event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9843break;98449845case GAUDI2_EVENT_TPC0_AXI_ERR_RSP ... GAUDI2_EVENT_TPC24_AXI_ERR_RSP:9846index = event_type - GAUDI2_EVENT_TPC0_AXI_ERR_RSP;9847error_count = gaudi2_tpc_ack_interrupts(hdev, index, event_type,9848&eq_entry->razwi_with_intr_cause, &event_mask);9849error_count += gaudi2_handle_qm_sei_err(hdev, event_type, false, &event_mask);9850event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9851break;98529853case GAUDI2_EVENT_DEC0_AXI_ERR_RSPONSE ... GAUDI2_EVENT_DEC9_AXI_ERR_RSPONSE:9854index = event_type - GAUDI2_EVENT_DEC0_AXI_ERR_RSPONSE;9855error_count = gaudi2_handle_dec_err(hdev, index, event_type, &event_mask);9856event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9857break;98589859case GAUDI2_EVENT_TPC0_KERNEL_ERR:9860case GAUDI2_EVENT_TPC1_KERNEL_ERR:9861case GAUDI2_EVENT_TPC2_KERNEL_ERR:9862case GAUDI2_EVENT_TPC3_KERNEL_ERR:9863case GAUDI2_EVENT_TPC4_KERNEL_ERR:9864case GAUDI2_EVENT_TPC5_KERNEL_ERR:9865case GAUDI2_EVENT_TPC6_KERNEL_ERR:9866case GAUDI2_EVENT_TPC7_KERNEL_ERR:9867case GAUDI2_EVENT_TPC8_KERNEL_ERR:9868case GAUDI2_EVENT_TPC9_KERNEL_ERR:9869case GAUDI2_EVENT_TPC10_KERNEL_ERR:9870case GAUDI2_EVENT_TPC11_KERNEL_ERR:9871case GAUDI2_EVENT_TPC12_KERNEL_ERR:9872case GAUDI2_EVENT_TPC13_KERNEL_ERR:9873case GAUDI2_EVENT_TPC14_KERNEL_ERR:9874case GAUDI2_EVENT_TPC15_KERNEL_ERR:9875case GAUDI2_EVENT_TPC16_KERNEL_ERR:9876case GAUDI2_EVENT_TPC17_KERNEL_ERR:9877case GAUDI2_EVENT_TPC18_KERNEL_ERR:9878case GAUDI2_EVENT_TPC19_KERNEL_ERR:9879case GAUDI2_EVENT_TPC20_KERNEL_ERR:9880case GAUDI2_EVENT_TPC21_KERNEL_ERR:9881case GAUDI2_EVENT_TPC22_KERNEL_ERR:9882case GAUDI2_EVENT_TPC23_KERNEL_ERR:9883case GAUDI2_EVENT_TPC24_KERNEL_ERR:9884index = (event_type - GAUDI2_EVENT_TPC0_KERNEL_ERR) /9885(GAUDI2_EVENT_TPC1_KERNEL_ERR - GAUDI2_EVENT_TPC0_KERNEL_ERR);9886error_count = gaudi2_tpc_ack_interrupts(hdev, index, event_type,9887&eq_entry->razwi_with_intr_cause, &event_mask);9888event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9889break;98909891case GAUDI2_EVENT_DEC0_SPI:9892case GAUDI2_EVENT_DEC1_SPI:9893case GAUDI2_EVENT_DEC2_SPI:9894case GAUDI2_EVENT_DEC3_SPI:9895case GAUDI2_EVENT_DEC4_SPI:9896case GAUDI2_EVENT_DEC5_SPI:9897case GAUDI2_EVENT_DEC6_SPI:9898case GAUDI2_EVENT_DEC7_SPI:9899case GAUDI2_EVENT_DEC8_SPI:9900case GAUDI2_EVENT_DEC9_SPI:9901index = (event_type - GAUDI2_EVENT_DEC0_SPI) /9902(GAUDI2_EVENT_DEC1_SPI - GAUDI2_EVENT_DEC0_SPI);9903error_count = gaudi2_handle_dec_err(hdev, index, event_type, &event_mask);9904event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9905break;99069907case GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE:9908case GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE:9909case GAUDI2_EVENT_MME2_CTRL_AXI_ERROR_RESPONSE:9910case GAUDI2_EVENT_MME3_CTRL_AXI_ERROR_RESPONSE:9911index = (event_type - GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE) /9912(GAUDI2_EVENT_MME1_CTRL_AXI_ERROR_RESPONSE -9913GAUDI2_EVENT_MME0_CTRL_AXI_ERROR_RESPONSE);9914error_count = gaudi2_handle_mme_err(hdev, index, event_type, &event_mask);9915error_count += gaudi2_handle_qm_sei_err(hdev, event_type, false, &event_mask);9916event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9917break;99189919case GAUDI2_EVENT_MME0_QMAN_SW_ERROR:9920case GAUDI2_EVENT_MME1_QMAN_SW_ERROR:9921case GAUDI2_EVENT_MME2_QMAN_SW_ERROR:9922case GAUDI2_EVENT_MME3_QMAN_SW_ERROR:9923index = (event_type - GAUDI2_EVENT_MME0_QMAN_SW_ERROR) /9924(GAUDI2_EVENT_MME1_QMAN_SW_ERROR -9925GAUDI2_EVENT_MME0_QMAN_SW_ERROR);9926error_count = gaudi2_handle_mme_err(hdev, index, event_type, &event_mask);9927event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9928break;99299930case GAUDI2_EVENT_MME0_WAP_SOURCE_RESULT_INVALID:9931case GAUDI2_EVENT_MME1_WAP_SOURCE_RESULT_INVALID:9932case GAUDI2_EVENT_MME2_WAP_SOURCE_RESULT_INVALID:9933case GAUDI2_EVENT_MME3_WAP_SOURCE_RESULT_INVALID:9934index = (event_type - GAUDI2_EVENT_MME0_WAP_SOURCE_RESULT_INVALID) /9935(GAUDI2_EVENT_MME1_WAP_SOURCE_RESULT_INVALID -9936GAUDI2_EVENT_MME0_WAP_SOURCE_RESULT_INVALID);9937error_count = gaudi2_handle_mme_wap_err(hdev, index, event_type, &event_mask);9938event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9939break;99409941case GAUDI2_EVENT_KDMA_CH0_AXI_ERR_RSP:9942case GAUDI2_EVENT_KDMA0_CORE:9943error_count = gaudi2_handle_kdma_core_event(hdev, event_type,9944le64_to_cpu(eq_entry->intr_cause.intr_cause_data));9945event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;9946break;99479948case GAUDI2_EVENT_HDMA2_CORE ... GAUDI2_EVENT_HDMA5_CORE:9949error_count = gaudi2_handle_dma_core_event(hdev, event_type,9950le64_to_cpu(eq_entry->intr_cause.intr_cause_data));9951event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9952break;99539954case GAUDI2_EVENT_PDMA0_CORE ... GAUDI2_EVENT_PDMA1_CORE:9955error_count = gaudi2_handle_dma_core_event(hdev, event_type,9956le64_to_cpu(eq_entry->intr_cause.intr_cause_data));9957event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9958break;99599960case GAUDI2_EVENT_PCIE_ADDR_DEC_ERR:9961error_count = gaudi2_print_pcie_addr_dec_info(hdev, event_type,9962le64_to_cpu(eq_entry->intr_cause.intr_cause_data), &event_mask);9963reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;9964event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;9965break;99669967case GAUDI2_EVENT_HMMU0_PAGE_FAULT_OR_WR_PERM ... GAUDI2_EVENT_HMMU12_SECURITY_ERROR:9968case GAUDI2_EVENT_HMMU_0_AXI_ERR_RSP ... GAUDI2_EVENT_HMMU_12_AXI_ERR_RSP:9969case GAUDI2_EVENT_PMMU0_PAGE_FAULT_WR_PERM ... GAUDI2_EVENT_PMMU0_SECURITY_ERROR:9970case GAUDI2_EVENT_PMMU_AXI_ERR_RSP_0:9971error_count = gaudi2_handle_mmu_spi_sei_err(hdev, event_type, &event_mask);9972reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;9973event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9974break;99759976case GAUDI2_EVENT_HIF0_FATAL ... GAUDI2_EVENT_HIF12_FATAL:9977error_count = gaudi2_handle_hif_fatal(hdev, event_type,9978le64_to_cpu(eq_entry->intr_cause.intr_cause_data));9979reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;9980event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;9981break;99829983case GAUDI2_EVENT_PMMU_FATAL_0:9984error_count = gaudi2_handle_pif_fatal(hdev, event_type,9985le64_to_cpu(eq_entry->intr_cause.intr_cause_data));9986reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;9987event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;9988break;99899990case GAUDI2_EVENT_PSOC63_RAZWI_OR_PID_MIN_MAX_INTERRUPT:9991error_count = gaudi2_ack_psoc_razwi_event_handler(hdev, &event_mask);9992event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;9993break;99949995case GAUDI2_EVENT_HBM0_MC0_SEI_SEVERE ... GAUDI2_EVENT_HBM5_MC1_SEI_NON_SEVERE:9996event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;9997if (gaudi2_handle_hbm_mc_sei_err(hdev, event_type, &eq_entry->sei_data)) {9998reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;9999reset_required = true;10000is_critical = eq_entry->sei_data.hdr.is_critical;10001}10002error_count++;10003break;1000410005case GAUDI2_EVENT_HBM_CATTRIP_0 ... GAUDI2_EVENT_HBM_CATTRIP_5:10006error_count = gaudi2_handle_hbm_cattrip(hdev, event_type,10007le64_to_cpu(eq_entry->intr_cause.intr_cause_data));10008event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10009break;1001010011case GAUDI2_EVENT_HBM0_MC0_SPI ... GAUDI2_EVENT_HBM5_MC1_SPI:10012error_count = gaudi2_handle_hbm_mc_spi(hdev,10013le64_to_cpu(eq_entry->intr_cause.intr_cause_data));10014event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10015break;1001610017case GAUDI2_EVENT_PCIE_DRAIN_COMPLETE:10018error_count = gaudi2_handle_pcie_drain(hdev, &eq_entry->pcie_drain_ind_data);10019reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10020event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10021if (hl_fw_version_cmp(hdev, 1, 13, 0) >= 0)10022is_critical = true;10023break;1002410025case GAUDI2_EVENT_PSOC59_RPM_ERROR_OR_DRAIN:10026error_count = gaudi2_handle_psoc_drain(hdev,10027le64_to_cpu(eq_entry->intr_cause.intr_cause_data));10028reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10029event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10030break;1003110032case GAUDI2_EVENT_CPU_AXI_ECC:10033error_count = GAUDI2_NA_EVENT_CAUSE;10034reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10035event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10036break;10037case GAUDI2_EVENT_CPU_L2_RAM_ECC:10038error_count = GAUDI2_NA_EVENT_CAUSE;10039reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10040event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10041break;10042case GAUDI2_EVENT_MME0_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME0_SBTE4_AXI_ERR_RSP:10043case GAUDI2_EVENT_MME1_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME1_SBTE4_AXI_ERR_RSP:10044case GAUDI2_EVENT_MME2_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME2_SBTE4_AXI_ERR_RSP:10045case GAUDI2_EVENT_MME3_SBTE0_AXI_ERR_RSP ... GAUDI2_EVENT_MME3_SBTE4_AXI_ERR_RSP:10046error_count = gaudi2_handle_mme_sbte_err(hdev, event_type);10047event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10048break;10049case GAUDI2_EVENT_VM0_ALARM_A ... GAUDI2_EVENT_VM3_ALARM_B:10050error_count = GAUDI2_NA_EVENT_CAUSE;10051reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10052event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10053break;10054case GAUDI2_EVENT_PSOC_AXI_ERR_RSP:10055error_count = GAUDI2_NA_EVENT_CAUSE;10056reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10057event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10058break;10059case GAUDI2_EVENT_PSOC_PRSTN_FALL:10060error_count = GAUDI2_NA_EVENT_CAUSE;10061event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10062break;10063case GAUDI2_EVENT_PCIE_APB_TIMEOUT:10064error_count = GAUDI2_NA_EVENT_CAUSE;10065reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10066event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10067break;10068case GAUDI2_EVENT_PCIE_FATAL_ERR:10069error_count = GAUDI2_NA_EVENT_CAUSE;10070reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10071event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10072break;10073case GAUDI2_EVENT_TPC0_BMON_SPMU:10074case GAUDI2_EVENT_TPC1_BMON_SPMU:10075case GAUDI2_EVENT_TPC2_BMON_SPMU:10076case GAUDI2_EVENT_TPC3_BMON_SPMU:10077case GAUDI2_EVENT_TPC4_BMON_SPMU:10078case GAUDI2_EVENT_TPC5_BMON_SPMU:10079case GAUDI2_EVENT_TPC6_BMON_SPMU:10080case GAUDI2_EVENT_TPC7_BMON_SPMU:10081case GAUDI2_EVENT_TPC8_BMON_SPMU:10082case GAUDI2_EVENT_TPC9_BMON_SPMU:10083case GAUDI2_EVENT_TPC10_BMON_SPMU:10084case GAUDI2_EVENT_TPC11_BMON_SPMU:10085case GAUDI2_EVENT_TPC12_BMON_SPMU:10086case GAUDI2_EVENT_TPC13_BMON_SPMU:10087case GAUDI2_EVENT_TPC14_BMON_SPMU:10088case GAUDI2_EVENT_TPC15_BMON_SPMU:10089case GAUDI2_EVENT_TPC16_BMON_SPMU:10090case GAUDI2_EVENT_TPC17_BMON_SPMU:10091case GAUDI2_EVENT_TPC18_BMON_SPMU:10092case GAUDI2_EVENT_TPC19_BMON_SPMU:10093case GAUDI2_EVENT_TPC20_BMON_SPMU:10094case GAUDI2_EVENT_TPC21_BMON_SPMU:10095case GAUDI2_EVENT_TPC22_BMON_SPMU:10096case GAUDI2_EVENT_TPC23_BMON_SPMU:10097case GAUDI2_EVENT_TPC24_BMON_SPMU:10098case GAUDI2_EVENT_MME0_CTRL_BMON_SPMU:10099case GAUDI2_EVENT_MME0_SBTE_BMON_SPMU:10100case GAUDI2_EVENT_MME0_WAP_BMON_SPMU:10101case GAUDI2_EVENT_MME1_CTRL_BMON_SPMU:10102case GAUDI2_EVENT_MME1_SBTE_BMON_SPMU:10103case GAUDI2_EVENT_MME1_WAP_BMON_SPMU:10104case GAUDI2_EVENT_MME2_CTRL_BMON_SPMU:10105case GAUDI2_EVENT_MME2_SBTE_BMON_SPMU:10106case GAUDI2_EVENT_MME2_WAP_BMON_SPMU:10107case GAUDI2_EVENT_MME3_CTRL_BMON_SPMU:10108case GAUDI2_EVENT_MME3_SBTE_BMON_SPMU:10109case GAUDI2_EVENT_MME3_WAP_BMON_SPMU:10110case GAUDI2_EVENT_HDMA2_BM_SPMU ... GAUDI2_EVENT_PDMA1_BM_SPMU:10111fallthrough;10112case GAUDI2_EVENT_DEC0_BMON_SPMU:10113case GAUDI2_EVENT_DEC1_BMON_SPMU:10114case GAUDI2_EVENT_DEC2_BMON_SPMU:10115case GAUDI2_EVENT_DEC3_BMON_SPMU:10116case GAUDI2_EVENT_DEC4_BMON_SPMU:10117case GAUDI2_EVENT_DEC5_BMON_SPMU:10118case GAUDI2_EVENT_DEC6_BMON_SPMU:10119case GAUDI2_EVENT_DEC7_BMON_SPMU:10120case GAUDI2_EVENT_DEC8_BMON_SPMU:10121case GAUDI2_EVENT_DEC9_BMON_SPMU:10122case GAUDI2_EVENT_ROTATOR0_BMON_SPMU ... GAUDI2_EVENT_SM3_BMON_SPMU:10123error_count = GAUDI2_NA_EVENT_CAUSE;10124event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10125break;1012610127case GAUDI2_EVENT_CPU_FIX_POWER_ENV_S:10128case GAUDI2_EVENT_CPU_FIX_POWER_ENV_E:10129case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_S:10130case GAUDI2_EVENT_CPU_FIX_THERMAL_ENV_E:10131gaudi2_print_clk_change_info(hdev, event_type, &event_mask);10132error_count = GAUDI2_NA_EVENT_CAUSE;10133break;1013410135case GAUDI2_EVENT_CPU_PKT_QUEUE_OUT_SYNC:10136gaudi2_print_out_of_sync_info(hdev, event_type, &eq_entry->pkt_sync_err);10137error_count = GAUDI2_NA_EVENT_CAUSE;10138reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10139event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10140break;1014110142case GAUDI2_EVENT_PCIE_FLR_REQUESTED:10143event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10144error_count = GAUDI2_NA_EVENT_CAUSE;10145/* Do nothing- FW will handle it */10146break;1014710148case GAUDI2_EVENT_PCIE_P2P_MSIX:10149error_count = gaudi2_handle_pcie_p2p_msix(hdev, event_type);10150event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10151break;1015210153case GAUDI2_EVENT_SM0_AXI_ERROR_RESPONSE ... GAUDI2_EVENT_SM3_AXI_ERROR_RESPONSE:10154index = event_type - GAUDI2_EVENT_SM0_AXI_ERROR_RESPONSE;10155error_count = gaudi2_handle_sm_err(hdev, event_type, index);10156event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10157break;1015810159case GAUDI2_EVENT_PSOC_MME_PLL_LOCK_ERR ... GAUDI2_EVENT_DCORE2_HBM_PLL_LOCK_ERR:10160error_count = GAUDI2_NA_EVENT_CAUSE;10161event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10162break;1016310164case GAUDI2_EVENT_CPU_CPLD_SHUTDOWN_CAUSE:10165dev_info(hdev->dev, "CPLD shutdown cause, reset reason: 0x%llx\n",10166le64_to_cpu(eq_entry->data[0]));10167error_count = GAUDI2_NA_EVENT_CAUSE;10168event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10169break;10170case GAUDI2_EVENT_CPU_CPLD_SHUTDOWN_EVENT:10171dev_err(hdev->dev, "CPLD shutdown event, reset reason: 0x%llx\n",10172le64_to_cpu(eq_entry->data[0]));10173error_count = GAUDI2_NA_EVENT_CAUSE;10174event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10175break;1017610177case GAUDI2_EVENT_CPU_PKT_SANITY_FAILED:10178gaudi2_print_cpu_pkt_failure_info(hdev, event_type, &eq_entry->pkt_sync_err);10179error_count = GAUDI2_NA_EVENT_CAUSE;10180reset_flags |= HL_DRV_RESET_FW_FATAL_ERR;10181event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10182break;1018310184case GAUDI2_EVENT_ARC_DCCM_FULL:10185error_count = hl_arc_event_handle(hdev, event_type, &eq_entry->arc_data);10186event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;10187break;1018810189case GAUDI2_EVENT_CPU_FP32_NOT_SUPPORTED:10190case GAUDI2_EVENT_CPU_DEV_RESET_REQ:10191event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;10192error_count = GAUDI2_NA_EVENT_CAUSE;10193is_critical = true;10194break;1019510196case GAUDI2_EVENT_ARC_PWR_BRK_ENTRY:10197case GAUDI2_EVENT_ARC_PWR_BRK_EXT:10198case GAUDI2_EVENT_ARC_PWR_RD_MODE0:10199case GAUDI2_EVENT_ARC_PWR_RD_MODE1:10200case GAUDI2_EVENT_ARC_PWR_RD_MODE2:10201case GAUDI2_EVENT_ARC_PWR_RD_MODE3:10202error_count = GAUDI2_NA_EVENT_CAUSE;10203dev_info_ratelimited(hdev->dev, "%s event received\n",10204gaudi2_irq_map_table[event_type].name);10205break;1020610207case GAUDI2_EVENT_ARC_EQ_HEARTBEAT:10208hl_eq_heartbeat_event_handle(hdev);10209error_count = GAUDI2_NA_EVENT_CAUSE;10210break;10211default:10212if (gaudi2_irq_map_table[event_type].valid) {10213dev_err_ratelimited(hdev->dev, "Cannot find handler for event %d\n",10214event_type);10215error_count = GAUDI2_NA_EVENT_CAUSE;10216}10217}1021810219if (event_mask & HL_NOTIFIER_EVENT_USER_ENGINE_ERR)10220hl_capture_engine_err(hdev, event_id_to_engine_id(hdev, event_type), error_count);1022110222/* Make sure to dump an error in case no error cause was printed so far.10223* Note that although we have counted the errors, we use this number as10224* a boolean.10225*/10226if (error_count == GAUDI2_NA_EVENT_CAUSE && !is_info_event(event_type))10227gaudi2_print_event(hdev, event_type, true, "%d", event_type);10228else if (error_count == 0)10229gaudi2_print_event(hdev, event_type, true,10230"No error cause for H/W event %u", event_type);1023110232if ((gaudi2_irq_map_table[event_type].reset != EVENT_RESET_TYPE_NONE) || reset_required) {10233if (reset_required ||10234(gaudi2_irq_map_table[event_type].reset == EVENT_RESET_TYPE_HARD))10235reset_flags |= HL_DRV_RESET_HARD;1023610237if (hdev->hard_reset_on_fw_events ||10238(hdev->asic_prop.fw_security_enabled && is_critical))10239goto reset_device;10240}1024110242/* Send unmask irq only for interrupts not classified as MSG */10243if (!gaudi2_irq_map_table[event_type].msg)10244hl_fw_unmask_irq(hdev, event_type);1024510246if (event_mask)10247hl_notifier_event_send_all(hdev, event_mask);1024810249return;1025010251reset_device:10252if (hdev->asic_prop.fw_security_enabled && is_critical) {10253reset_flags |= HL_DRV_RESET_BYPASS_REQ_TO_FW;10254event_mask |= HL_NOTIFIER_EVENT_DEVICE_UNAVAILABLE;10255} else {10256reset_flags |= HL_DRV_RESET_DELAY;10257}10258/* escalate general hw errors to critical/fatal error */10259if (event_mask & HL_NOTIFIER_EVENT_GENERAL_HW_ERR)10260hl_handle_critical_hw_err(hdev, event_type, &event_mask);1026110262event_mask |= HL_NOTIFIER_EVENT_DEVICE_RESET;10263hl_device_cond_reset(hdev, reset_flags, event_mask);10264}1026510266static int gaudi2_memset_memory_chunk_using_edma_qm(struct hl_device *hdev,10267struct packet_lin_dma *lin_dma_pkt,10268u64 phys_addr, u32 hw_queue_id, u32 size, u64 addr, u32 val)10269{10270u32 ctl, pkt_size;10271int rc = 0, i;1027210273ctl = FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_LIN_DMA);10274ctl |= FIELD_PREP(GAUDI2_PKT_LIN_DMA_CTL_MEMSET_MASK, 1);10275ctl |= FIELD_PREP(GAUDI2_PKT_LIN_DMA_CTL_WRCOMP_MASK, 1);10276ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, 1);1027710278lin_dma_pkt->ctl = cpu_to_le32(ctl);10279lin_dma_pkt->src_addr = cpu_to_le64(val);10280lin_dma_pkt->dst_addr = cpu_to_le64(addr);10281lin_dma_pkt->tsize = cpu_to_le32(size);1028210283pkt_size = sizeof(struct packet_lin_dma);1028410285for (i = 0; i < 3; i++) {10286rc = hdev->asic_funcs->access_dev_mem(hdev, PCI_REGION_DRAM,10287phys_addr + (i * sizeof(u64)),10288((u64 *)(lin_dma_pkt)) + i, DEBUGFS_WRITE64);10289if (rc) {10290dev_err(hdev->dev, "Failed to copy lin_dma packet to HBM (%#llx)\n",10291phys_addr);10292return rc;10293}10294}1029510296rc = hl_hw_queue_send_cb_no_cmpl(hdev, hw_queue_id, pkt_size, phys_addr);10297if (rc)10298dev_err(hdev->dev, "Failed to send lin_dma packet to H/W queue %d\n",10299hw_queue_id);1030010301return rc;10302}1030310304static int gaudi2_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size, u64 val)10305{10306u32 edma_queues_id[] = {GAUDI2_QUEUE_ID_DCORE0_EDMA_0_0,10307GAUDI2_QUEUE_ID_DCORE1_EDMA_0_0,10308GAUDI2_QUEUE_ID_DCORE2_EDMA_0_0,10309GAUDI2_QUEUE_ID_DCORE3_EDMA_0_0};10310u32 chunk_size, dcore, edma_idx, sob_offset, sob_addr, comp_val,10311old_mmubp, mmubp, num_of_pkts, busy, pkt_size, cb_len;10312u64 comp_addr, cur_addr = addr, end_addr = addr + size;10313struct asic_fixed_properties *prop = &hdev->asic_prop;10314int rc = 0, dma_num = 0, i;10315void *lin_dma_pkts_arr;1031610317if (prop->edma_enabled_mask == 0) {10318dev_info(hdev->dev, "non of the EDMA engines is enabled - skip dram scrubbing\n");10319return -EIO;10320}1032110322sob_offset = hdev->asic_prop.first_available_user_sob[0] * 4;10323sob_addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + sob_offset;10324comp_addr = CFG_BASE + sob_addr;10325comp_val = FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_INC_MASK, 1) |10326FIELD_PREP(DCORE0_SYNC_MNGR_OBJS_SOB_OBJ_VAL_MASK, 1);10327mmubp = FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_WR_MASK, 1) |10328FIELD_PREP(ARC_FARM_KDMA_CTX_AXUSER_HB_MMU_BP_RD_MASK, 1);1032910330/* Calculate how many lin dma pkts we'll need */10331num_of_pkts = div64_u64(round_up(size, SZ_2G), SZ_2G);10332pkt_size = sizeof(struct packet_lin_dma);10333cb_len = pkt_size * num_of_pkts;1033410335/*10336* if we're not scrubing HMMU or NIC reserved sections in hbm,10337* then it the scrubing of the user section, as we use the start of the user section10338* to store the CB of the EDMA QM, so shift the start address of the scrubbing accordingly10339* and scrub the CB section before leaving this function.10340*/10341if ((addr >= prop->dram_user_base_address) &&10342(addr < prop->dram_user_base_address + cb_len))10343cur_addr += (prop->dram_user_base_address + cb_len) - addr;1034410345lin_dma_pkts_arr = kvcalloc(num_of_pkts, pkt_size, GFP_KERNEL);10346if (!lin_dma_pkts_arr)10347return -ENOMEM;1034810349/*10350* set mmu bypass for the scrubbing - all ddmas are configured the same so save10351* only the first one to restore later10352* also set the sob addr for all edma cores for completion.10353* set QM as trusted to allow it to access physical address with MMU bp.10354*/10355old_mmubp = RREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP);10356for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {10357for (edma_idx = 0 ; edma_idx < NUM_OF_EDMA_PER_DCORE ; edma_idx++) {10358u32 edma_offset = dcore * DCORE_OFFSET + edma_idx * DCORE_EDMA_OFFSET;10359u32 edma_bit = dcore * NUM_OF_EDMA_PER_DCORE + edma_idx;1036010361if (!(prop->edma_enabled_mask & BIT(edma_bit)))10362continue;1036310364WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP +10365edma_offset, mmubp);10366WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_ADDR_LO + edma_offset,10367lower_32_bits(comp_addr));10368WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_ADDR_HI + edma_offset,10369upper_32_bits(comp_addr));10370WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_WDATA + edma_offset,10371comp_val);10372gaudi2_qman_set_test_mode(hdev,10373edma_queues_id[dcore] + 4 * edma_idx, true);10374}10375}1037610377WREG32(sob_addr, 0);1037810379while (cur_addr < end_addr) {10380for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {10381for (edma_idx = 0 ; edma_idx < NUM_OF_EDMA_PER_DCORE ; edma_idx++) {10382u32 edma_bit = dcore * NUM_OF_EDMA_PER_DCORE + edma_idx;1038310384if (!(prop->edma_enabled_mask & BIT(edma_bit)))10385continue;1038610387chunk_size = min_t(u64, SZ_2G, end_addr - cur_addr);1038810389rc = gaudi2_memset_memory_chunk_using_edma_qm(hdev,10390(struct packet_lin_dma *)lin_dma_pkts_arr + dma_num,10391prop->dram_user_base_address + (dma_num * pkt_size),10392edma_queues_id[dcore] + edma_idx * 4,10393chunk_size, cur_addr, val);10394if (rc)10395goto end;1039610397dma_num++;10398cur_addr += chunk_size;10399if (cur_addr == end_addr)10400goto edma_wait;10401}10402}10403}1040410405edma_wait:10406rc = hl_poll_timeout(hdev, sob_addr, busy, (busy == dma_num), 1000, 1000000);10407if (rc) {10408dev_err(hdev->dev, "DMA Timeout during HBM scrubbing(sob: 0x%x, dma_num: 0x%x)\n",10409busy, dma_num);10410goto end;10411}10412end:10413for (dcore = 0 ; dcore < NUM_OF_DCORES ; dcore++) {10414for (edma_idx = 0 ; edma_idx < NUM_OF_EDMA_PER_DCORE ; edma_idx++) {10415u32 edma_offset = dcore * DCORE_OFFSET + edma_idx * DCORE_EDMA_OFFSET;10416u32 edma_bit = dcore * NUM_OF_EDMA_PER_DCORE + edma_idx;1041710418if (!(prop->edma_enabled_mask & BIT(edma_bit)))10419continue;1042010421WREG32(mmDCORE0_EDMA0_CORE_CTX_AXUSER_HB_MMU_BP + edma_offset, old_mmubp);10422WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_ADDR_LO + edma_offset, 0);10423WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_ADDR_HI + edma_offset, 0);10424WREG32(mmDCORE0_EDMA0_CORE_CTX_WR_COMP_WDATA + edma_offset, 0);10425gaudi2_qman_set_test_mode(hdev,10426edma_queues_id[dcore] + 4 * edma_idx, false);10427}10428}1042910430memset(lin_dma_pkts_arr, 0, sizeof(u64));1043110432/* Zero the HBM area where we copied the CB */10433for (i = 0; i < cb_len / sizeof(u64); i += sizeof(u64))10434rc = hdev->asic_funcs->access_dev_mem(hdev, PCI_REGION_DRAM,10435prop->dram_user_base_address + i,10436(u64 *)(lin_dma_pkts_arr), DEBUGFS_WRITE64);10437WREG32(sob_addr, 0);1043810439kvfree(lin_dma_pkts_arr);1044010441return rc;10442}1044310444static int gaudi2_scrub_device_dram(struct hl_device *hdev, u64 val)10445{10446int rc;10447struct asic_fixed_properties *prop = &hdev->asic_prop;10448u64 size = prop->dram_end_address - prop->dram_user_base_address;1044910450rc = gaudi2_memset_device_memory(hdev, prop->dram_user_base_address, size, val);1045110452if (rc)10453dev_err(hdev->dev, "Failed to scrub dram, address: 0x%llx size: %llu\n",10454prop->dram_user_base_address, size);10455return rc;10456}1045710458static int gaudi2_scrub_device_mem(struct hl_device *hdev)10459{10460int rc;10461struct asic_fixed_properties *prop = &hdev->asic_prop;10462u64 val = hdev->memory_scrub_val;10463u64 addr, size;1046410465if (!hdev->memory_scrub)10466return 0;1046710468/* scrub SRAM */10469addr = prop->sram_user_base_address;10470size = hdev->pldm ? 0x10000 : (prop->sram_size - SRAM_USER_BASE_OFFSET);10471dev_dbg(hdev->dev, "Scrubbing SRAM: 0x%09llx - 0x%09llx, val: 0x%llx\n",10472addr, addr + size, val);10473rc = gaudi2_memset_device_memory(hdev, addr, size, val);10474if (rc) {10475dev_err(hdev->dev, "scrubbing SRAM failed (%d)\n", rc);10476return rc;10477}1047810479/* scrub DRAM */10480rc = gaudi2_scrub_device_dram(hdev, val);10481if (rc) {10482dev_err(hdev->dev, "scrubbing DRAM failed (%d)\n", rc);10483return rc;10484}10485return 0;10486}1048710488static void gaudi2_restore_user_sm_registers(struct hl_device *hdev)10489{10490u64 addr, mon_sts_addr, mon_cfg_addr, cq_lbw_l_addr, cq_lbw_h_addr,10491cq_lbw_data_addr, cq_base_l_addr, cq_base_h_addr, cq_size_addr;10492u32 val, size, offset;10493int dcore_id;1049410495offset = hdev->asic_prop.first_available_cq[0] * 4;10496cq_lbw_l_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0 + offset;10497cq_lbw_h_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 + offset;10498cq_lbw_data_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_DATA_0 + offset;10499cq_base_l_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_L_0 + offset;10500cq_base_h_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_H_0 + offset;10501cq_size_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_SIZE_LOG2_0 + offset;10502size = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 -10503(mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0 + offset);1050410505/* memset dcore0 CQ registers */10506gaudi2_memset_device_lbw(hdev, cq_lbw_l_addr, size, 0);10507gaudi2_memset_device_lbw(hdev, cq_lbw_h_addr, size, 0);10508gaudi2_memset_device_lbw(hdev, cq_lbw_data_addr, size, 0);10509gaudi2_memset_device_lbw(hdev, cq_base_l_addr, size, 0);10510gaudi2_memset_device_lbw(hdev, cq_base_h_addr, size, 0);10511gaudi2_memset_device_lbw(hdev, cq_size_addr, size, 0);1051210513cq_lbw_l_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0 + DCORE_OFFSET;10514cq_lbw_h_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 + DCORE_OFFSET;10515cq_lbw_data_addr = mmDCORE0_SYNC_MNGR_GLBL_LBW_DATA_0 + DCORE_OFFSET;10516cq_base_l_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_L_0 + DCORE_OFFSET;10517cq_base_h_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_BASE_ADDR_H_0 + DCORE_OFFSET;10518cq_size_addr = mmDCORE0_SYNC_MNGR_GLBL_CQ_SIZE_LOG2_0 + DCORE_OFFSET;10519size = mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_H_0 - mmDCORE0_SYNC_MNGR_GLBL_LBW_ADDR_L_0;1052010521for (dcore_id = 1 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {10522gaudi2_memset_device_lbw(hdev, cq_lbw_l_addr, size, 0);10523gaudi2_memset_device_lbw(hdev, cq_lbw_h_addr, size, 0);10524gaudi2_memset_device_lbw(hdev, cq_lbw_data_addr, size, 0);10525gaudi2_memset_device_lbw(hdev, cq_base_l_addr, size, 0);10526gaudi2_memset_device_lbw(hdev, cq_base_h_addr, size, 0);10527gaudi2_memset_device_lbw(hdev, cq_size_addr, size, 0);1052810529cq_lbw_l_addr += DCORE_OFFSET;10530cq_lbw_h_addr += DCORE_OFFSET;10531cq_lbw_data_addr += DCORE_OFFSET;10532cq_base_l_addr += DCORE_OFFSET;10533cq_base_h_addr += DCORE_OFFSET;10534cq_size_addr += DCORE_OFFSET;10535}1053610537offset = hdev->asic_prop.first_available_user_mon[0] * 4;10538addr = mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0 + offset;10539val = 1 << DCORE0_SYNC_MNGR_OBJS_MON_STATUS_PROT_SHIFT;10540size = mmDCORE0_SYNC_MNGR_OBJS_SM_SEC_0 - (mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0 + offset);1054110542/* memset dcore0 monitors */10543gaudi2_memset_device_lbw(hdev, addr, size, val);1054410545addr = mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + offset;10546gaudi2_memset_device_lbw(hdev, addr, size, 0);1054710548mon_sts_addr = mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0 + DCORE_OFFSET;10549mon_cfg_addr = mmDCORE0_SYNC_MNGR_OBJS_MON_CONFIG_0 + DCORE_OFFSET;10550size = mmDCORE0_SYNC_MNGR_OBJS_SM_SEC_0 - mmDCORE0_SYNC_MNGR_OBJS_MON_STATUS_0;1055110552for (dcore_id = 1 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {10553gaudi2_memset_device_lbw(hdev, mon_sts_addr, size, val);10554gaudi2_memset_device_lbw(hdev, mon_cfg_addr, size, 0);10555mon_sts_addr += DCORE_OFFSET;10556mon_cfg_addr += DCORE_OFFSET;10557}1055810559offset = hdev->asic_prop.first_available_user_sob[0] * 4;10560addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + offset;10561val = 0;10562size = mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 -10563(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + offset);1056410565/* memset dcore0 sobs */10566gaudi2_memset_device_lbw(hdev, addr, size, val);1056710568addr = mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + DCORE_OFFSET;10569size = mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 - mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0;1057010571for (dcore_id = 1 ; dcore_id < NUM_OF_DCORES ; dcore_id++) {10572gaudi2_memset_device_lbw(hdev, addr, size, val);10573addr += DCORE_OFFSET;10574}1057510576/* Flush all WREG to prevent race */10577val = RREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + offset);10578}1057910580static void gaudi2_restore_user_qm_registers(struct hl_device *hdev)10581{10582u32 reg_base, hw_queue_id;1058310584for (hw_queue_id = GAUDI2_QUEUE_ID_PDMA_0_0 ; hw_queue_id <= GAUDI2_QUEUE_ID_ROT_1_0;10585hw_queue_id += NUM_OF_PQ_PER_QMAN) {10586if (!gaudi2_is_queue_enabled(hdev, hw_queue_id))10587continue;1058810589gaudi2_clear_qm_fence_counters_common(hdev, hw_queue_id, false);1059010591reg_base = gaudi2_qm_blocks_bases[hw_queue_id];10592WREG32(reg_base + QM_ARB_CFG_0_OFFSET, 0);10593}1059410595/* Flush all WREG to prevent race */10596RREG32(mmPDMA0_QM_ARB_CFG_0);10597}1059810599static void gaudi2_restore_nic_qm_registers(struct hl_device *hdev)10600{10601u32 reg_base, hw_queue_id;1060210603for (hw_queue_id = GAUDI2_QUEUE_ID_NIC_0_0 ; hw_queue_id <= GAUDI2_QUEUE_ID_NIC_23_3;10604hw_queue_id += NUM_OF_PQ_PER_QMAN) {10605if (!gaudi2_is_queue_enabled(hdev, hw_queue_id))10606continue;1060710608gaudi2_clear_qm_fence_counters_common(hdev, hw_queue_id, false);1060910610reg_base = gaudi2_qm_blocks_bases[hw_queue_id];10611WREG32(reg_base + QM_ARB_CFG_0_OFFSET, 0);10612}1061310614/* Flush all WREG to prevent race */10615RREG32(mmPDMA0_QM_ARB_CFG_0);10616}1061710618static int gaudi2_context_switch(struct hl_device *hdev, u32 asid)10619{10620return 0;10621}1062210623static void gaudi2_restore_phase_topology(struct hl_device *hdev)10624{10625}1062610627static void gaudi2_init_block_instances(struct hl_device *hdev, u32 block_idx,10628struct dup_block_ctx *cfg_ctx)10629{10630u64 block_base = cfg_ctx->base + block_idx * cfg_ctx->block_off;10631u8 seq;10632int i;1063310634for (i = 0 ; i < cfg_ctx->instances ; i++) {10635seq = block_idx * cfg_ctx->instances + i;1063610637/* skip disabled instance */10638if (!(cfg_ctx->enabled_mask & BIT_ULL(seq)))10639continue;1064010641cfg_ctx->instance_cfg_fn(hdev, block_base + i * cfg_ctx->instance_off,10642cfg_ctx->data);10643}10644}1064510646static void gaudi2_init_blocks_with_mask(struct hl_device *hdev, struct dup_block_ctx *cfg_ctx,10647u64 mask)10648{10649int i;1065010651cfg_ctx->enabled_mask = mask;1065210653for (i = 0 ; i < cfg_ctx->blocks ; i++)10654gaudi2_init_block_instances(hdev, i, cfg_ctx);10655}1065610657void gaudi2_init_blocks(struct hl_device *hdev, struct dup_block_ctx *cfg_ctx)10658{10659gaudi2_init_blocks_with_mask(hdev, cfg_ctx, U64_MAX);10660}1066110662static int gaudi2_debugfs_read_dma(struct hl_device *hdev, u64 addr, u32 size, void *blob_addr)10663{10664void *host_mem_virtual_addr;10665dma_addr_t host_mem_dma_addr;10666u64 reserved_va_base;10667u32 pos, size_left, size_to_dma;10668struct hl_ctx *ctx;10669int rc = 0;1067010671/* Fetch the ctx */10672ctx = hl_get_compute_ctx(hdev);10673if (!ctx) {10674dev_err(hdev->dev, "No ctx available\n");10675return -EINVAL;10676}1067710678/* Allocate buffers for read and for poll */10679host_mem_virtual_addr = hl_asic_dma_alloc_coherent(hdev, SZ_2M, &host_mem_dma_addr,10680GFP_KERNEL | __GFP_ZERO);10681if (host_mem_virtual_addr == NULL) {10682dev_err(hdev->dev, "Failed to allocate memory for KDMA read\n");10683rc = -ENOMEM;10684goto put_ctx;10685}1068610687/* Reserve VM region on asic side */10688reserved_va_base = hl_reserve_va_block(hdev, ctx, HL_VA_RANGE_TYPE_HOST, SZ_2M,10689HL_MMU_VA_ALIGNMENT_NOT_NEEDED);10690if (!reserved_va_base) {10691dev_err(hdev->dev, "Failed to reserve vmem on asic\n");10692rc = -ENOMEM;10693goto free_data_buffer;10694}1069510696/* Create mapping on asic side */10697mutex_lock(&hdev->mmu_lock);1069810699rc = hl_mmu_map_contiguous(ctx, reserved_va_base, host_mem_dma_addr, SZ_2M);10700if (rc) {10701dev_err(hdev->dev, "Failed to create mapping on asic mmu\n");10702goto unreserve_va;10703}1070410705rc = hl_mmu_invalidate_cache_range(hdev, false,10706MMU_OP_USERPTR | MMU_OP_SKIP_LOW_CACHE_INV,10707ctx->asid, reserved_va_base, SZ_2M);10708if (rc) {10709hl_mmu_unmap_contiguous(ctx, reserved_va_base, SZ_2M);10710goto unreserve_va;10711}1071210713mutex_unlock(&hdev->mmu_lock);1071410715/* Enable MMU on KDMA */10716gaudi2_kdma_set_mmbp_asid(hdev, false, ctx->asid);1071710718pos = 0;10719size_left = size;10720size_to_dma = SZ_2M;1072110722while (size_left > 0) {10723if (size_left < SZ_2M)10724size_to_dma = size_left;1072510726rc = gaudi2_send_job_to_kdma(hdev, addr, reserved_va_base, size_to_dma, false);10727if (rc)10728break;1072910730memcpy(blob_addr + pos, host_mem_virtual_addr, size_to_dma);1073110732if (size_left <= SZ_2M)10733break;1073410735pos += SZ_2M;10736addr += SZ_2M;10737size_left -= SZ_2M;10738}1073910740gaudi2_kdma_set_mmbp_asid(hdev, true, HL_KERNEL_ASID_ID);1074110742mutex_lock(&hdev->mmu_lock);1074310744rc = hl_mmu_unmap_contiguous(ctx, reserved_va_base, SZ_2M);10745if (rc)10746goto unreserve_va;1074710748rc = hl_mmu_invalidate_cache_range(hdev, false, MMU_OP_USERPTR,10749ctx->asid, reserved_va_base, SZ_2M);1075010751unreserve_va:10752mutex_unlock(&hdev->mmu_lock);10753hl_unreserve_va_block(hdev, ctx, reserved_va_base, SZ_2M);10754free_data_buffer:10755hl_asic_dma_free_coherent(hdev, SZ_2M, host_mem_virtual_addr, host_mem_dma_addr);10756put_ctx:10757hl_ctx_put(ctx);1075810759return rc;10760}1076110762static int gaudi2_internal_cb_pool_init(struct hl_device *hdev, struct hl_ctx *ctx)10763{10764struct gaudi2_device *gaudi2 = hdev->asic_specific;10765int min_alloc_order, rc;1076610767if (!(gaudi2->hw_cap_initialized & HW_CAP_PMMU))10768return 0;1076910770hdev->internal_cb_pool_virt_addr = hl_asic_dma_alloc_coherent(hdev,10771HOST_SPACE_INTERNAL_CB_SZ,10772&hdev->internal_cb_pool_dma_addr,10773GFP_KERNEL | __GFP_ZERO);1077410775if (!hdev->internal_cb_pool_virt_addr)10776return -ENOMEM;1077710778min_alloc_order = ilog2(min(gaudi2_get_signal_cb_size(hdev),10779gaudi2_get_wait_cb_size(hdev)));1078010781hdev->internal_cb_pool = gen_pool_create(min_alloc_order, -1);10782if (!hdev->internal_cb_pool) {10783dev_err(hdev->dev, "Failed to create internal CB pool\n");10784rc = -ENOMEM;10785goto free_internal_cb_pool;10786}1078710788rc = gen_pool_add(hdev->internal_cb_pool, (uintptr_t) hdev->internal_cb_pool_virt_addr,10789HOST_SPACE_INTERNAL_CB_SZ, -1);10790if (rc) {10791dev_err(hdev->dev, "Failed to add memory to internal CB pool\n");10792rc = -EFAULT;10793goto destroy_internal_cb_pool;10794}1079510796hdev->internal_cb_va_base = hl_reserve_va_block(hdev, ctx, HL_VA_RANGE_TYPE_HOST,10797HOST_SPACE_INTERNAL_CB_SZ, HL_MMU_VA_ALIGNMENT_NOT_NEEDED);1079810799if (!hdev->internal_cb_va_base) {10800rc = -ENOMEM;10801goto destroy_internal_cb_pool;10802}1080310804mutex_lock(&hdev->mmu_lock);1080510806rc = hl_mmu_map_contiguous(ctx, hdev->internal_cb_va_base, hdev->internal_cb_pool_dma_addr,10807HOST_SPACE_INTERNAL_CB_SZ);10808if (rc)10809goto unreserve_internal_cb_pool;1081010811rc = hl_mmu_invalidate_cache(hdev, false, MMU_OP_USERPTR);10812if (rc)10813goto unmap_internal_cb_pool;1081410815mutex_unlock(&hdev->mmu_lock);1081610817return 0;1081810819unmap_internal_cb_pool:10820hl_mmu_unmap_contiguous(ctx, hdev->internal_cb_va_base, HOST_SPACE_INTERNAL_CB_SZ);10821unreserve_internal_cb_pool:10822mutex_unlock(&hdev->mmu_lock);10823hl_unreserve_va_block(hdev, ctx, hdev->internal_cb_va_base, HOST_SPACE_INTERNAL_CB_SZ);10824destroy_internal_cb_pool:10825gen_pool_destroy(hdev->internal_cb_pool);10826free_internal_cb_pool:10827hl_asic_dma_free_coherent(hdev, HOST_SPACE_INTERNAL_CB_SZ, hdev->internal_cb_pool_virt_addr,10828hdev->internal_cb_pool_dma_addr);1082910830return rc;10831}1083210833static void gaudi2_internal_cb_pool_fini(struct hl_device *hdev, struct hl_ctx *ctx)10834{10835struct gaudi2_device *gaudi2 = hdev->asic_specific;1083610837if (!(gaudi2->hw_cap_initialized & HW_CAP_PMMU))10838return;1083910840mutex_lock(&hdev->mmu_lock);10841hl_mmu_unmap_contiguous(ctx, hdev->internal_cb_va_base, HOST_SPACE_INTERNAL_CB_SZ);10842hl_unreserve_va_block(hdev, ctx, hdev->internal_cb_va_base, HOST_SPACE_INTERNAL_CB_SZ);10843hl_mmu_invalidate_cache(hdev, true, MMU_OP_USERPTR);10844mutex_unlock(&hdev->mmu_lock);1084510846gen_pool_destroy(hdev->internal_cb_pool);1084710848hl_asic_dma_free_coherent(hdev, HOST_SPACE_INTERNAL_CB_SZ, hdev->internal_cb_pool_virt_addr,10849hdev->internal_cb_pool_dma_addr);10850}1085110852static void gaudi2_restore_user_registers(struct hl_device *hdev)10853{10854gaudi2_restore_user_sm_registers(hdev);10855gaudi2_restore_user_qm_registers(hdev);10856}1085710858static int gaudi2_map_virtual_msix_doorbell_memory(struct hl_ctx *ctx)10859{10860struct hl_device *hdev = ctx->hdev;10861struct asic_fixed_properties *prop = &hdev->asic_prop;10862struct gaudi2_device *gaudi2 = hdev->asic_specific;10863int rc;1086410865rc = hl_mmu_map_page(ctx, RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START,10866gaudi2->virt_msix_db_dma_addr, prop->pmmu.page_size, true);10867if (rc)10868dev_err(hdev->dev, "Failed to map VA %#llx for virtual MSI-X doorbell memory\n",10869RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START);1087010871return rc;10872}1087310874static void gaudi2_unmap_virtual_msix_doorbell_memory(struct hl_ctx *ctx)10875{10876struct hl_device *hdev = ctx->hdev;10877struct asic_fixed_properties *prop = &hdev->asic_prop;10878int rc;1087910880rc = hl_mmu_unmap_page(ctx, RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START,10881prop->pmmu.page_size, true);10882if (rc)10883dev_err(hdev->dev, "Failed to unmap VA %#llx of virtual MSI-X doorbell memory\n",10884RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START);10885}1088610887static int gaudi2_ctx_init(struct hl_ctx *ctx)10888{10889int rc;1089010891if (ctx->asid == HL_KERNEL_ASID_ID)10892return 0;1089310894rc = gaudi2_mmu_prepare(ctx->hdev, ctx->asid);10895if (rc)10896return rc;1089710898/* No need to clear user registers if the device has just10899* performed reset, we restore only nic qm registers10900*/10901if (ctx->hdev->reset_upon_device_release)10902gaudi2_restore_nic_qm_registers(ctx->hdev);10903else10904gaudi2_restore_user_registers(ctx->hdev);1090510906rc = gaudi2_internal_cb_pool_init(ctx->hdev, ctx);10907if (rc)10908return rc;1090910910rc = gaudi2_map_virtual_msix_doorbell_memory(ctx);10911if (rc)10912gaudi2_internal_cb_pool_fini(ctx->hdev, ctx);1091310914return rc;10915}1091610917static void gaudi2_ctx_fini(struct hl_ctx *ctx)10918{10919if (ctx->asid == HL_KERNEL_ASID_ID)10920return;1092110922gaudi2_internal_cb_pool_fini(ctx->hdev, ctx);1092310924gaudi2_unmap_virtual_msix_doorbell_memory(ctx);10925}1092610927static int gaudi2_pre_schedule_cs(struct hl_cs *cs)10928{10929struct hl_device *hdev = cs->ctx->hdev;10930int index = cs->sequence & (hdev->asic_prop.max_pending_cs - 1);10931u32 mon_payload, sob_id, mon_id;1093210933if (!cs_needs_completion(cs))10934return 0;1093510936/*10937* First 64 SOB/MON are reserved for driver for QMAN auto completion10938* mechanism. Each SOB/MON pair are used for a pending CS with the same10939* cyclic index. The SOB value is increased when each of the CS jobs is10940* completed. When the SOB reaches the number of CS jobs, the monitor10941* generates MSI-X interrupt.10942*/1094310944sob_id = mon_id = index;10945mon_payload = (1 << CQ_ENTRY_SHADOW_INDEX_VALID_SHIFT) |10946(1 << CQ_ENTRY_READY_SHIFT) | index;1094710948gaudi2_arm_cq_monitor(hdev, sob_id, mon_id, GAUDI2_RESERVED_CQ_CS_COMPLETION, mon_payload,10949cs->jobs_cnt);1095010951return 0;10952}1095310954static u32 gaudi2_get_queue_id_for_cq(struct hl_device *hdev, u32 cq_idx)10955{10956return HL_INVALID_QUEUE;10957}1095810959static u32 gaudi2_gen_signal_cb(struct hl_device *hdev, void *data, u16 sob_id, u32 size, bool eb)10960{10961struct hl_cb *cb = data;10962struct packet_msg_short *pkt;10963u32 value, ctl, pkt_size = sizeof(*pkt);1096410965pkt = (struct packet_msg_short *) (uintptr_t) (cb->kernel_address + size);10966memset(pkt, 0, pkt_size);1096710968/* Inc by 1, Mode ADD */10969value = FIELD_PREP(GAUDI2_PKT_SHORT_VAL_SOB_SYNC_VAL_MASK, 1);10970value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_SOB_MOD_MASK, 1);1097110972ctl = FIELD_PREP(GAUDI2_PKT_SHORT_CTL_ADDR_MASK, sob_id * 4);10973ctl |= FIELD_PREP(GAUDI2_PKT_SHORT_CTL_BASE_MASK, 1); /* SOB base */10974ctl |= FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_MSG_SHORT);10975ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, eb);10976ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 1);1097710978pkt->value = cpu_to_le32(value);10979pkt->ctl = cpu_to_le32(ctl);1098010981return size + pkt_size;10982}1098310984static u32 gaudi2_add_mon_msg_short(struct packet_msg_short *pkt, u32 value, u16 addr)10985{10986u32 ctl, pkt_size = sizeof(*pkt);1098710988memset(pkt, 0, pkt_size);1098910990ctl = FIELD_PREP(GAUDI2_PKT_SHORT_CTL_ADDR_MASK, addr);10991ctl |= FIELD_PREP(GAUDI2_PKT_SHORT_CTL_BASE_MASK, 0); /* MON base */10992ctl |= FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_MSG_SHORT);10993ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, 0);10994ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 0);1099510996pkt->value = cpu_to_le32(value);10997pkt->ctl = cpu_to_le32(ctl);1099810999return pkt_size;11000}1100111002static u32 gaudi2_add_arm_monitor_pkt(struct hl_device *hdev, struct packet_msg_short *pkt,11003u16 sob_base, u8 sob_mask, u16 sob_val, u16 addr)11004{11005u32 ctl, value, pkt_size = sizeof(*pkt);11006u8 mask;1100711008if (hl_gen_sob_mask(sob_base, sob_mask, &mask)) {11009dev_err(hdev->dev, "sob_base %u (mask %#x) is not valid\n", sob_base, sob_mask);11010return 0;11011}1101211013memset(pkt, 0, pkt_size);1101411015value = FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_SYNC_GID_MASK, sob_base / 8);11016value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_SYNC_VAL_MASK, sob_val);11017value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_MODE_MASK, 0); /* GREATER OR EQUAL*/11018value |= FIELD_PREP(GAUDI2_PKT_SHORT_VAL_MON_MASK_MASK, mask);1101911020ctl = FIELD_PREP(GAUDI2_PKT_SHORT_CTL_ADDR_MASK, addr);11021ctl |= FIELD_PREP(GAUDI2_PKT_SHORT_CTL_BASE_MASK, 0); /* MON base */11022ctl |= FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_MSG_SHORT);11023ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, 0);11024ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 1);1102511026pkt->value = cpu_to_le32(value);11027pkt->ctl = cpu_to_le32(ctl);1102811029return pkt_size;11030}1103111032static u32 gaudi2_add_fence_pkt(struct packet_fence *pkt)11033{11034u32 ctl, cfg, pkt_size = sizeof(*pkt);1103511036memset(pkt, 0, pkt_size);1103711038cfg = FIELD_PREP(GAUDI2_PKT_FENCE_CFG_DEC_VAL_MASK, 1);11039cfg |= FIELD_PREP(GAUDI2_PKT_FENCE_CFG_TARGET_VAL_MASK, 1);11040cfg |= FIELD_PREP(GAUDI2_PKT_FENCE_CFG_ID_MASK, 2);1104111042ctl = FIELD_PREP(GAUDI2_PKT_CTL_OPCODE_MASK, PACKET_FENCE);11043ctl |= FIELD_PREP(GAUDI2_PKT_CTL_EB_MASK, 0);11044ctl |= FIELD_PREP(GAUDI2_PKT_CTL_MB_MASK, 1);1104511046pkt->cfg = cpu_to_le32(cfg);11047pkt->ctl = cpu_to_le32(ctl);1104811049return pkt_size;11050}1105111052static u32 gaudi2_gen_wait_cb(struct hl_device *hdev, struct hl_gen_wait_properties *prop)11053{11054struct hl_cb *cb = prop->data;11055void *buf = (void *) (uintptr_t) (cb->kernel_address);1105611057u64 monitor_base, fence_addr = 0;11058u32 stream_index, size = prop->size;11059u16 msg_addr_offset;1106011061stream_index = prop->q_idx % 4;11062fence_addr = CFG_BASE + gaudi2_qm_blocks_bases[prop->q_idx] +11063QM_FENCE2_OFFSET + stream_index * 4;1106411065/*11066* monitor_base should be the content of the base0 address registers,11067* so it will be added to the msg short offsets11068*/11069monitor_base = mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0;1107011071/* First monitor config packet: low address of the sync */11072msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRL_0 + prop->mon_id * 4) -11073monitor_base;1107411075size += gaudi2_add_mon_msg_short(buf + size, (u32) fence_addr, msg_addr_offset);1107611077/* Second monitor config packet: high address of the sync */11078msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_ADDRH_0 + prop->mon_id * 4) -11079monitor_base;1108011081size += gaudi2_add_mon_msg_short(buf + size, (u32) (fence_addr >> 32), msg_addr_offset);1108211083/*11084* Third monitor config packet: the payload, i.e. what to write when the11085* sync triggers11086*/11087msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_PAY_DATA_0 + prop->mon_id * 4) -11088monitor_base;1108911090size += gaudi2_add_mon_msg_short(buf + size, 1, msg_addr_offset);1109111092/* Fourth monitor config packet: bind the monitor to a sync object */11093msg_addr_offset = (mmDCORE0_SYNC_MNGR_OBJS_MON_ARM_0 + prop->mon_id * 4) - monitor_base;1109411095size += gaudi2_add_arm_monitor_pkt(hdev, buf + size, prop->sob_base, prop->sob_mask,11096prop->sob_val, msg_addr_offset);1109711098/* Fence packet */11099size += gaudi2_add_fence_pkt(buf + size);1110011101return size;11102}1110311104static void gaudi2_reset_sob(struct hl_device *hdev, void *data)11105{11106struct hl_hw_sob *hw_sob = data;1110711108dev_dbg(hdev->dev, "reset SOB, q_idx: %d, sob_id: %d\n", hw_sob->q_idx, hw_sob->sob_id);1110911110WREG32(mmDCORE0_SYNC_MNGR_OBJS_SOB_OBJ_0 + hw_sob->sob_id * 4, 0);1111111112kref_init(&hw_sob->kref);11113}1111411115static void gaudi2_reset_sob_group(struct hl_device *hdev, u16 sob_group)11116{11117}1111811119static u64 gaudi2_get_device_time(struct hl_device *hdev)11120{11121u64 device_time = ((u64) RREG32(mmPSOC_TIMESTAMP_CNTCVU)) << 32;1112211123return device_time | RREG32(mmPSOC_TIMESTAMP_CNTCVL);11124}1112511126static int gaudi2_collective_wait_init_cs(struct hl_cs *cs)11127{11128return 0;11129}1113011131static int gaudi2_collective_wait_create_jobs(struct hl_device *hdev, struct hl_ctx *ctx,11132struct hl_cs *cs, u32 wait_queue_id,11133u32 collective_engine_id, u32 encaps_signal_offset)11134{11135return -EINVAL;11136}1113711138/*11139* hl_mmu_scramble - converts a dram (non power of 2) page-size aligned address11140* to DMMU page-size address (64MB) before mapping it in11141* the MMU.11142* The operation is performed on both the virtual and physical addresses.11143* for device with 6 HBMs the scramble is:11144* (addr[47:0] / 48M) * 64M + addr % 48M + addr[63:48]11145*11146* Example:11147* =============================================================================11148* Allocated DRAM Reserved VA scrambled VA for MMU mapping Scrambled PA11149* Phys address in MMU last11150* HOP11151* =============================================================================11152* PA1 0x3000000 VA1 0x9C000000 SVA1= (VA1/48M)*64M 0xD0000000 <- PA1/48M 0x111153* PA2 0x9000000 VA2 0x9F000000 SVA2= (VA2/48M)*64M 0xD4000000 <- PA2/48M 0x311154* =============================================================================11155*/11156static u64 gaudi2_mmu_scramble_addr(struct hl_device *hdev, u64 raw_addr)11157{11158struct asic_fixed_properties *prop = &hdev->asic_prop;11159u32 divisor, mod_va;11160u64 div_va;1116111162/* accept any address in the DRAM address space */11163if (hl_mem_area_inside_range(raw_addr, sizeof(raw_addr), DRAM_PHYS_BASE,11164VA_HBM_SPACE_END)) {1116511166divisor = prop->num_functional_hbms * GAUDI2_HBM_MMU_SCRM_MEM_SIZE;11167div_va = div_u64_rem(raw_addr & GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK, divisor, &mod_va);11168return (raw_addr & ~GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK) |11169(div_va << GAUDI2_HBM_MMU_SCRM_DIV_SHIFT) |11170(mod_va << GAUDI2_HBM_MMU_SCRM_MOD_SHIFT);11171}1117211173return raw_addr;11174}1117511176static u64 gaudi2_mmu_descramble_addr(struct hl_device *hdev, u64 scrambled_addr)11177{11178struct asic_fixed_properties *prop = &hdev->asic_prop;11179u32 divisor, mod_va;11180u64 div_va;1118111182/* accept any address in the DRAM address space */11183if (hl_mem_area_inside_range(scrambled_addr, sizeof(scrambled_addr), DRAM_PHYS_BASE,11184VA_HBM_SPACE_END)) {1118511186divisor = prop->num_functional_hbms * GAUDI2_HBM_MMU_SCRM_MEM_SIZE;11187div_va = div_u64_rem(scrambled_addr & GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK,11188PAGE_SIZE_64MB, &mod_va);1118911190return ((scrambled_addr & ~GAUDI2_HBM_MMU_SCRM_ADDRESS_MASK) +11191(div_va * divisor + mod_va));11192}1119311194return scrambled_addr;11195}1119611197static u32 gaudi2_get_dec_base_addr(struct hl_device *hdev, u32 core_id)11198{11199u32 base = 0, dcore_id, dec_id;1120011201if (core_id >= NUMBER_OF_DEC) {11202dev_err(hdev->dev, "Unexpected core number %d for DEC\n", core_id);11203goto out;11204}1120511206if (core_id < 8) {11207dcore_id = core_id / NUM_OF_DEC_PER_DCORE;11208dec_id = core_id % NUM_OF_DEC_PER_DCORE;1120911210base = mmDCORE0_DEC0_CMD_BASE + dcore_id * DCORE_OFFSET +11211dec_id * DCORE_VDEC_OFFSET;11212} else {11213/* PCIe Shared Decoder */11214base = mmPCIE_DEC0_CMD_BASE + ((core_id % 8) * PCIE_VDEC_OFFSET);11215}11216out:11217return base;11218}1121911220static int gaudi2_get_hw_block_id(struct hl_device *hdev, u64 block_addr,11221u32 *block_size, u32 *block_id)11222{11223struct gaudi2_device *gaudi2 = hdev->asic_specific;11224int i;1122511226for (i = 0 ; i < NUM_USER_MAPPED_BLOCKS ; i++) {11227if (block_addr == CFG_BASE + gaudi2->mapped_blocks[i].address) {11228*block_id = i;11229if (block_size)11230*block_size = gaudi2->mapped_blocks[i].size;11231return 0;11232}11233}1123411235dev_err(hdev->dev, "Invalid block address %#llx", block_addr);1123611237return -EINVAL;11238}1123911240static int gaudi2_block_mmap(struct hl_device *hdev, struct vm_area_struct *vma,11241u32 block_id, u32 block_size)11242{11243struct gaudi2_device *gaudi2 = hdev->asic_specific;11244u64 offset_in_bar;11245u64 address;11246int rc;1124711248if (block_id >= NUM_USER_MAPPED_BLOCKS) {11249dev_err(hdev->dev, "Invalid block id %u", block_id);11250return -EINVAL;11251}1125211253/* we allow mapping only an entire block */11254if (block_size != gaudi2->mapped_blocks[block_id].size) {11255dev_err(hdev->dev, "Invalid block size %u", block_size);11256return -EINVAL;11257}1125811259offset_in_bar = CFG_BASE + gaudi2->mapped_blocks[block_id].address - STM_FLASH_BASE_ADDR;1126011261address = pci_resource_start(hdev->pdev, SRAM_CFG_BAR_ID) + offset_in_bar;1126211263vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |11264VM_DONTCOPY | VM_NORESERVE);1126511266rc = remap_pfn_range(vma, vma->vm_start, address >> PAGE_SHIFT,11267block_size, vma->vm_page_prot);11268if (rc)11269dev_err(hdev->dev, "remap_pfn_range error %d", rc);1127011271return rc;11272}1127311274static void gaudi2_enable_events_from_fw(struct hl_device *hdev)11275{11276struct gaudi2_device *gaudi2 = hdev->asic_specific;1127711278struct cpu_dyn_regs *dyn_regs = &hdev->fw_loader.dynamic_loader.comm_desc.cpu_dyn_regs;11279u32 irq_handler_offset = le32_to_cpu(dyn_regs->gic_host_ints_irq);1128011281if (gaudi2->hw_cap_initialized & HW_CAP_CPU_Q)11282WREG32(irq_handler_offset,11283gaudi2_irq_map_table[GAUDI2_EVENT_CPU_INTS_REGISTER].cpu_id);11284}1128511286static int gaudi2_get_mmu_base(struct hl_device *hdev, u64 mmu_id, u32 *mmu_base)11287{11288switch (mmu_id) {11289case HW_CAP_DCORE0_DMMU0:11290*mmu_base = mmDCORE0_HMMU0_MMU_BASE;11291break;11292case HW_CAP_DCORE0_DMMU1:11293*mmu_base = mmDCORE0_HMMU1_MMU_BASE;11294break;11295case HW_CAP_DCORE0_DMMU2:11296*mmu_base = mmDCORE0_HMMU2_MMU_BASE;11297break;11298case HW_CAP_DCORE0_DMMU3:11299*mmu_base = mmDCORE0_HMMU3_MMU_BASE;11300break;11301case HW_CAP_DCORE1_DMMU0:11302*mmu_base = mmDCORE1_HMMU0_MMU_BASE;11303break;11304case HW_CAP_DCORE1_DMMU1:11305*mmu_base = mmDCORE1_HMMU1_MMU_BASE;11306break;11307case HW_CAP_DCORE1_DMMU2:11308*mmu_base = mmDCORE1_HMMU2_MMU_BASE;11309break;11310case HW_CAP_DCORE1_DMMU3:11311*mmu_base = mmDCORE1_HMMU3_MMU_BASE;11312break;11313case HW_CAP_DCORE2_DMMU0:11314*mmu_base = mmDCORE2_HMMU0_MMU_BASE;11315break;11316case HW_CAP_DCORE2_DMMU1:11317*mmu_base = mmDCORE2_HMMU1_MMU_BASE;11318break;11319case HW_CAP_DCORE2_DMMU2:11320*mmu_base = mmDCORE2_HMMU2_MMU_BASE;11321break;11322case HW_CAP_DCORE2_DMMU3:11323*mmu_base = mmDCORE2_HMMU3_MMU_BASE;11324break;11325case HW_CAP_DCORE3_DMMU0:11326*mmu_base = mmDCORE3_HMMU0_MMU_BASE;11327break;11328case HW_CAP_DCORE3_DMMU1:11329*mmu_base = mmDCORE3_HMMU1_MMU_BASE;11330break;11331case HW_CAP_DCORE3_DMMU2:11332*mmu_base = mmDCORE3_HMMU2_MMU_BASE;11333break;11334case HW_CAP_DCORE3_DMMU3:11335*mmu_base = mmDCORE3_HMMU3_MMU_BASE;11336break;11337case HW_CAP_PMMU:11338*mmu_base = mmPMMU_HBW_MMU_BASE;11339break;11340default:11341return -EINVAL;11342}1134311344return 0;11345}1134611347static void gaudi2_ack_mmu_error(struct hl_device *hdev, u64 mmu_id)11348{11349bool is_pmmu = (mmu_id == HW_CAP_PMMU);11350struct gaudi2_device *gaudi2 = hdev->asic_specific;11351u32 mmu_base;1135211353if (!(gaudi2->hw_cap_initialized & mmu_id))11354return;1135511356if (gaudi2_get_mmu_base(hdev, mmu_id, &mmu_base))11357return;1135811359gaudi2_handle_page_error(hdev, mmu_base, is_pmmu, NULL);11360gaudi2_handle_access_error(hdev, mmu_base, is_pmmu);11361}1136211363static int gaudi2_ack_mmu_page_fault_or_access_error(struct hl_device *hdev, u64 mmu_cap_mask)11364{11365u32 i, mmu_id, num_of_hmmus = NUM_OF_HMMU_PER_DCORE * NUM_OF_DCORES;1136611367/* check all HMMUs */11368for (i = 0 ; i < num_of_hmmus ; i++) {11369mmu_id = HW_CAP_DCORE0_DMMU0 << i;1137011371if (mmu_cap_mask & mmu_id)11372gaudi2_ack_mmu_error(hdev, mmu_id);11373}1137411375/* check PMMU */11376if (mmu_cap_mask & HW_CAP_PMMU)11377gaudi2_ack_mmu_error(hdev, HW_CAP_PMMU);1137811379return 0;11380}1138111382static void gaudi2_get_msi_info(__le32 *table)11383{11384table[CPUCP_EVENT_QUEUE_MSI_TYPE] = cpu_to_le32(GAUDI2_EVENT_QUEUE_MSIX_IDX);11385table[CPUCP_EVENT_QUEUE_ERR_MSI_TYPE] = cpu_to_le32(GAUDI2_IRQ_NUM_EQ_ERROR);11386}1138711388static int gaudi2_map_pll_idx_to_fw_idx(u32 pll_idx)11389{11390switch (pll_idx) {11391case HL_GAUDI2_CPU_PLL: return CPU_PLL;11392case HL_GAUDI2_PCI_PLL: return PCI_PLL;11393case HL_GAUDI2_NIC_PLL: return NIC_PLL;11394case HL_GAUDI2_DMA_PLL: return DMA_PLL;11395case HL_GAUDI2_MESH_PLL: return MESH_PLL;11396case HL_GAUDI2_MME_PLL: return MME_PLL;11397case HL_GAUDI2_TPC_PLL: return TPC_PLL;11398case HL_GAUDI2_IF_PLL: return IF_PLL;11399case HL_GAUDI2_SRAM_PLL: return SRAM_PLL;11400case HL_GAUDI2_HBM_PLL: return HBM_PLL;11401case HL_GAUDI2_VID_PLL: return VID_PLL;11402case HL_GAUDI2_MSS_PLL: return MSS_PLL;11403default: return -EINVAL;11404}11405}1140611407static int gaudi2_gen_sync_to_engine_map(struct hl_device *hdev, struct hl_sync_to_engine_map *map)11408{11409/* Not implemented */11410return 0;11411}1141211413static int gaudi2_monitor_valid(struct hl_mon_state_dump *mon)11414{11415/* Not implemented */11416return 0;11417}1141811419static int gaudi2_print_single_monitor(char **buf, size_t *size, size_t *offset,11420struct hl_device *hdev, struct hl_mon_state_dump *mon)11421{11422/* Not implemented */11423return 0;11424}114251142611427static int gaudi2_print_fences_single_engine(struct hl_device *hdev, u64 base_offset,11428u64 status_base_offset, enum hl_sync_engine_type engine_type,11429u32 engine_id, char **buf, size_t *size, size_t *offset)11430{11431/* Not implemented */11432return 0;11433}114341143511436static struct hl_state_dump_specs_funcs gaudi2_state_dump_funcs = {11437.monitor_valid = gaudi2_monitor_valid,11438.print_single_monitor = gaudi2_print_single_monitor,11439.gen_sync_to_engine_map = gaudi2_gen_sync_to_engine_map,11440.print_fences_single_engine = gaudi2_print_fences_single_engine,11441};1144211443static void gaudi2_state_dump_init(struct hl_device *hdev)11444{11445/* Not implemented */11446hdev->state_dump_specs.props = gaudi2_state_dump_specs_props;11447hdev->state_dump_specs.funcs = gaudi2_state_dump_funcs;11448}1144911450static u32 gaudi2_get_sob_addr(struct hl_device *hdev, u32 sob_id)11451{11452return 0;11453}1145411455static u32 *gaudi2_get_stream_master_qid_arr(void)11456{11457return NULL;11458}1145911460static void gaudi2_add_device_attr(struct hl_device *hdev, struct attribute_group *dev_clk_attr_grp,11461struct attribute_group *dev_vrm_attr_grp)11462{11463hl_sysfs_add_dev_clk_attr(hdev, dev_clk_attr_grp);11464hl_sysfs_add_dev_vrm_attr(hdev, dev_vrm_attr_grp);11465}1146611467static int gaudi2_mmu_get_real_page_size(struct hl_device *hdev, struct hl_mmu_properties *mmu_prop,11468u32 page_size, u32 *real_page_size, bool is_dram_addr)11469{11470struct asic_fixed_properties *prop = &hdev->asic_prop;1147111472/* for host pages the page size must be */11473if (!is_dram_addr) {11474if (page_size % mmu_prop->page_size)11475goto page_size_err;1147611477*real_page_size = mmu_prop->page_size;11478return 0;11479}1148011481if ((page_size % prop->dram_page_size) || (prop->dram_page_size > mmu_prop->page_size))11482goto page_size_err;1148311484/*11485* MMU page size is different from DRAM page size (more precisely, DMMU page is greater11486* than DRAM page size).11487* for this reason work with the DRAM page size and let the MMU scrambling routine handle11488* this mismatch when calculating the address to place in the MMU page table.11489* (in that case also make sure that the dram_page_size is not greater than the11490* mmu page size)11491*/11492*real_page_size = prop->dram_page_size;1149311494return 0;1149511496page_size_err:11497dev_err(hdev->dev, "page size of 0x%X is not 0x%X aligned, can't map\n",11498page_size, mmu_prop->page_size >> 10);11499return -EFAULT;11500}1150111502static int gaudi2_get_monitor_dump(struct hl_device *hdev, void *data)11503{11504return -EOPNOTSUPP;11505}1150611507int gaudi2_send_device_activity(struct hl_device *hdev, bool open)11508{11509struct gaudi2_device *gaudi2 = hdev->asic_specific;1151011511if (!(gaudi2->hw_cap_initialized & HW_CAP_CPU_Q))11512return 0;1151311514return hl_fw_send_device_activity(hdev, open);11515}1151611517static u64 gaudi2_read_pte(struct hl_device *hdev, u64 addr)11518{11519struct gaudi2_device *gaudi2 = hdev->asic_specific;11520u64 val;1152111522if (hdev->reset_info.hard_reset_pending)11523return U64_MAX;1152411525val = readq(hdev->pcie_bar[DRAM_BAR_ID] + (addr - gaudi2->dram_bar_cur_addr));1152611527return val;11528}1152911530static void gaudi2_write_pte(struct hl_device *hdev, u64 addr, u64 val)11531{11532struct gaudi2_device *gaudi2 = hdev->asic_specific;1153311534if (hdev->reset_info.hard_reset_pending)11535return;1153611537writeq(val, hdev->pcie_bar[DRAM_BAR_ID] + (addr - gaudi2->dram_bar_cur_addr));11538}1153911540static const struct hl_asic_funcs gaudi2_funcs = {11541.early_init = gaudi2_early_init,11542.early_fini = gaudi2_early_fini,11543.late_init = gaudi2_late_init,11544.late_fini = gaudi2_late_fini,11545.sw_init = gaudi2_sw_init,11546.sw_fini = gaudi2_sw_fini,11547.hw_init = gaudi2_hw_init,11548.hw_fini = gaudi2_hw_fini,11549.halt_engines = gaudi2_halt_engines,11550.suspend = gaudi2_suspend,11551.resume = gaudi2_resume,11552.mmap = gaudi2_mmap,11553.ring_doorbell = gaudi2_ring_doorbell,11554.pqe_write = gaudi2_pqe_write,11555.asic_dma_alloc_coherent = gaudi2_dma_alloc_coherent,11556.asic_dma_free_coherent = gaudi2_dma_free_coherent,11557.scrub_device_mem = gaudi2_scrub_device_mem,11558.scrub_device_dram = gaudi2_scrub_device_dram,11559.get_int_queue_base = NULL,11560.test_queues = gaudi2_test_queues,11561.asic_dma_pool_zalloc = gaudi2_dma_pool_zalloc,11562.asic_dma_pool_free = gaudi2_dma_pool_free,11563.cpu_accessible_dma_pool_alloc = gaudi2_cpu_accessible_dma_pool_alloc,11564.cpu_accessible_dma_pool_free = gaudi2_cpu_accessible_dma_pool_free,11565.dma_unmap_sgtable = hl_asic_dma_unmap_sgtable,11566.cs_parser = gaudi2_cs_parser,11567.dma_map_sgtable = hl_asic_dma_map_sgtable,11568.add_end_of_cb_packets = NULL,11569.update_eq_ci = gaudi2_update_eq_ci,11570.context_switch = gaudi2_context_switch,11571.restore_phase_topology = gaudi2_restore_phase_topology,11572.debugfs_read_dma = gaudi2_debugfs_read_dma,11573.add_device_attr = gaudi2_add_device_attr,11574.handle_eqe = gaudi2_handle_eqe,11575.get_events_stat = gaudi2_get_events_stat,11576.read_pte = gaudi2_read_pte,11577.write_pte = gaudi2_write_pte,11578.mmu_invalidate_cache = gaudi2_mmu_invalidate_cache,11579.mmu_invalidate_cache_range = gaudi2_mmu_invalidate_cache_range,11580.mmu_prefetch_cache_range = NULL,11581.send_heartbeat = gaudi2_send_heartbeat,11582.debug_coresight = gaudi2_debug_coresight,11583.is_device_idle = gaudi2_is_device_idle,11584.compute_reset_late_init = gaudi2_compute_reset_late_init,11585.hw_queues_lock = gaudi2_hw_queues_lock,11586.hw_queues_unlock = gaudi2_hw_queues_unlock,11587.get_pci_id = gaudi2_get_pci_id,11588.get_eeprom_data = gaudi2_get_eeprom_data,11589.get_monitor_dump = gaudi2_get_monitor_dump,11590.send_cpu_message = gaudi2_send_cpu_message,11591.pci_bars_map = gaudi2_pci_bars_map,11592.init_iatu = gaudi2_init_iatu,11593.rreg = hl_rreg,11594.wreg = hl_wreg,11595.halt_coresight = gaudi2_halt_coresight,11596.ctx_init = gaudi2_ctx_init,11597.ctx_fini = gaudi2_ctx_fini,11598.pre_schedule_cs = gaudi2_pre_schedule_cs,11599.get_queue_id_for_cq = gaudi2_get_queue_id_for_cq,11600.load_firmware_to_device = NULL,11601.load_boot_fit_to_device = NULL,11602.get_signal_cb_size = gaudi2_get_signal_cb_size,11603.get_wait_cb_size = gaudi2_get_wait_cb_size,11604.gen_signal_cb = gaudi2_gen_signal_cb,11605.gen_wait_cb = gaudi2_gen_wait_cb,11606.reset_sob = gaudi2_reset_sob,11607.reset_sob_group = gaudi2_reset_sob_group,11608.get_device_time = gaudi2_get_device_time,11609.pb_print_security_errors = gaudi2_pb_print_security_errors,11610.collective_wait_init_cs = gaudi2_collective_wait_init_cs,11611.collective_wait_create_jobs = gaudi2_collective_wait_create_jobs,11612.get_dec_base_addr = gaudi2_get_dec_base_addr,11613.scramble_addr = gaudi2_mmu_scramble_addr,11614.descramble_addr = gaudi2_mmu_descramble_addr,11615.ack_protection_bits_errors = gaudi2_ack_protection_bits_errors,11616.get_hw_block_id = gaudi2_get_hw_block_id,11617.hw_block_mmap = gaudi2_block_mmap,11618.enable_events_from_fw = gaudi2_enable_events_from_fw,11619.ack_mmu_errors = gaudi2_ack_mmu_page_fault_or_access_error,11620.get_msi_info = gaudi2_get_msi_info,11621.map_pll_idx_to_fw_idx = gaudi2_map_pll_idx_to_fw_idx,11622.init_firmware_preload_params = gaudi2_init_firmware_preload_params,11623.init_firmware_loader = gaudi2_init_firmware_loader,11624.init_cpu_scrambler_dram = gaudi2_init_scrambler_hbm,11625.state_dump_init = gaudi2_state_dump_init,11626.get_sob_addr = &gaudi2_get_sob_addr,11627.set_pci_memory_regions = gaudi2_set_pci_memory_regions,11628.get_stream_master_qid_arr = gaudi2_get_stream_master_qid_arr,11629.check_if_razwi_happened = gaudi2_check_if_razwi_happened,11630.mmu_get_real_page_size = gaudi2_mmu_get_real_page_size,11631.access_dev_mem = hl_access_dev_mem,11632.set_dram_bar_base = gaudi2_set_hbm_bar_base,11633.set_engine_cores = gaudi2_set_engine_cores,11634.set_engines = gaudi2_set_engines,11635.send_device_activity = gaudi2_send_device_activity,11636.set_dram_properties = gaudi2_set_dram_properties,11637.set_binning_masks = gaudi2_set_binning_masks,11638};1163911640void gaudi2_set_asic_funcs(struct hl_device *hdev)11641{11642hdev->asic_funcs = &gaudi2_funcs;11643}116441164511646