18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci
38c2ecf20Sopenharmony_ci/*
48c2ecf20Sopenharmony_ci * Copyright 2016-2019 HabanaLabs, Ltd.
58c2ecf20Sopenharmony_ci * All Rights Reserved.
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include "goyaP.h"
98c2ecf20Sopenharmony_ci#include "../include/hw_ip/mmu/mmu_general.h"
108c2ecf20Sopenharmony_ci#include "../include/hw_ip/mmu/mmu_v1_0.h"
118c2ecf20Sopenharmony_ci#include "../include/goya/asic_reg/goya_masks.h"
128c2ecf20Sopenharmony_ci#include "../include/goya/goya_reg_map.h"
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <linux/pci.h>
158c2ecf20Sopenharmony_ci#include <linux/genalloc.h>
168c2ecf20Sopenharmony_ci#include <linux/hwmon.h>
178c2ecf20Sopenharmony_ci#include <linux/io-64-nonatomic-lo-hi.h>
188c2ecf20Sopenharmony_ci#include <linux/iommu.h>
198c2ecf20Sopenharmony_ci#include <linux/seq_file.h>
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci/*
228c2ecf20Sopenharmony_ci * GOYA security scheme:
238c2ecf20Sopenharmony_ci *
248c2ecf20Sopenharmony_ci * 1. Host is protected by:
258c2ecf20Sopenharmony_ci *        - Range registers (When MMU is enabled, DMA RR does NOT protect host)
268c2ecf20Sopenharmony_ci *        - MMU
278c2ecf20Sopenharmony_ci *
288c2ecf20Sopenharmony_ci * 2. DRAM is protected by:
298c2ecf20Sopenharmony_ci *        - Range registers (protect the first 512MB)
308c2ecf20Sopenharmony_ci *        - MMU (isolation between users)
318c2ecf20Sopenharmony_ci *
328c2ecf20Sopenharmony_ci * 3. Configuration is protected by:
338c2ecf20Sopenharmony_ci *        - Range registers
348c2ecf20Sopenharmony_ci *        - Protection bits
358c2ecf20Sopenharmony_ci *
368c2ecf20Sopenharmony_ci * When MMU is disabled:
378c2ecf20Sopenharmony_ci *
388c2ecf20Sopenharmony_ci * QMAN DMA: PQ, CQ, CP, DMA are secured.
398c2ecf20Sopenharmony_ci * PQ, CB and the data are on the host.
408c2ecf20Sopenharmony_ci *
418c2ecf20Sopenharmony_ci * QMAN TPC/MME:
428c2ecf20Sopenharmony_ci * PQ, CQ and CP are not secured.
438c2ecf20Sopenharmony_ci * PQ, CB and the data are on the SRAM/DRAM.
448c2ecf20Sopenharmony_ci *
458c2ecf20Sopenharmony_ci * Since QMAN DMA is secured, the driver is parsing the DMA CB:
468c2ecf20Sopenharmony_ci *     - checks DMA pointer
478c2ecf20Sopenharmony_ci *     - WREG, MSG_PROT are not allowed.
488c2ecf20Sopenharmony_ci *     - MSG_LONG/SHORT are allowed.
498c2ecf20Sopenharmony_ci *
508c2ecf20Sopenharmony_ci * A read/write transaction by the QMAN to a protected area will succeed if
518c2ecf20Sopenharmony_ci * and only if the QMAN's CP is secured and MSG_PROT is used
528c2ecf20Sopenharmony_ci *
538c2ecf20Sopenharmony_ci *
548c2ecf20Sopenharmony_ci * When MMU is enabled:
558c2ecf20Sopenharmony_ci *
568c2ecf20Sopenharmony_ci * QMAN DMA: PQ, CQ and CP are secured.
578c2ecf20Sopenharmony_ci * MMU is set to bypass on the Secure props register of the QMAN.
588c2ecf20Sopenharmony_ci * The reasons we don't enable MMU for PQ, CQ and CP are:
598c2ecf20Sopenharmony_ci *     - PQ entry is in kernel address space and the driver doesn't map it.
608c2ecf20Sopenharmony_ci *     - CP writes to MSIX register and to kernel address space (completion
618c2ecf20Sopenharmony_ci *       queue).
628c2ecf20Sopenharmony_ci *
638c2ecf20Sopenharmony_ci * DMA is not secured but because CP is secured, the driver still needs to parse
648c2ecf20Sopenharmony_ci * the CB, but doesn't need to check the DMA addresses.
658c2ecf20Sopenharmony_ci *
668c2ecf20Sopenharmony_ci * For QMAN DMA 0, DMA is also secured because only the driver uses this DMA and
678c2ecf20Sopenharmony_ci * the driver doesn't map memory in MMU.
688c2ecf20Sopenharmony_ci *
698c2ecf20Sopenharmony_ci * QMAN TPC/MME: PQ, CQ and CP aren't secured (no change from MMU disabled mode)
708c2ecf20Sopenharmony_ci *
718c2ecf20Sopenharmony_ci * DMA RR does NOT protect host because DMA is not secured
728c2ecf20Sopenharmony_ci *
738c2ecf20Sopenharmony_ci */
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci#define GOYA_BOOT_FIT_FILE	"habanalabs/goya/goya-boot-fit.itb"
768c2ecf20Sopenharmony_ci#define GOYA_LINUX_FW_FILE	"habanalabs/goya/goya-fit.itb"
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci#define GOYA_MMU_REGS_NUM		63
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci#define GOYA_DMA_POOL_BLK_SIZE		0x100		/* 256 bytes */
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci#define GOYA_RESET_TIMEOUT_MSEC		500		/* 500ms */
838c2ecf20Sopenharmony_ci#define GOYA_PLDM_RESET_TIMEOUT_MSEC	20000		/* 20s */
848c2ecf20Sopenharmony_ci#define GOYA_RESET_WAIT_MSEC		1		/* 1ms */
858c2ecf20Sopenharmony_ci#define GOYA_CPU_RESET_WAIT_MSEC	100		/* 100ms */
868c2ecf20Sopenharmony_ci#define GOYA_PLDM_RESET_WAIT_MSEC	1000		/* 1s */
878c2ecf20Sopenharmony_ci#define GOYA_TEST_QUEUE_WAIT_USEC	100000		/* 100ms */
888c2ecf20Sopenharmony_ci#define GOYA_PLDM_MMU_TIMEOUT_USEC	(MMU_CONFIG_TIMEOUT_USEC * 100)
898c2ecf20Sopenharmony_ci#define GOYA_PLDM_QMAN0_TIMEOUT_USEC	(HL_DEVICE_TIMEOUT_USEC * 30)
908c2ecf20Sopenharmony_ci#define GOYA_BOOT_FIT_REQ_TIMEOUT_USEC	1000000		/* 1s */
918c2ecf20Sopenharmony_ci#define GOYA_MSG_TO_CPU_TIMEOUT_USEC	4000000		/* 4s */
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci#define GOYA_QMAN0_FENCE_VAL		0xD169B243
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci#define GOYA_MAX_STRING_LEN		20
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci#define GOYA_CB_POOL_CB_CNT		512
988c2ecf20Sopenharmony_ci#define GOYA_CB_POOL_CB_SIZE		0x20000		/* 128KB */
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci#define IS_QM_IDLE(engine, qm_glbl_sts0) \
1018c2ecf20Sopenharmony_ci	(((qm_glbl_sts0) & engine##_QM_IDLE_MASK) == engine##_QM_IDLE_MASK)
1028c2ecf20Sopenharmony_ci#define IS_DMA_QM_IDLE(qm_glbl_sts0)	IS_QM_IDLE(DMA, qm_glbl_sts0)
1038c2ecf20Sopenharmony_ci#define IS_TPC_QM_IDLE(qm_glbl_sts0)	IS_QM_IDLE(TPC, qm_glbl_sts0)
1048c2ecf20Sopenharmony_ci#define IS_MME_QM_IDLE(qm_glbl_sts0)	IS_QM_IDLE(MME, qm_glbl_sts0)
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_ci#define IS_CMDQ_IDLE(engine, cmdq_glbl_sts0) \
1078c2ecf20Sopenharmony_ci	(((cmdq_glbl_sts0) & engine##_CMDQ_IDLE_MASK) == \
1088c2ecf20Sopenharmony_ci			engine##_CMDQ_IDLE_MASK)
1098c2ecf20Sopenharmony_ci#define IS_TPC_CMDQ_IDLE(cmdq_glbl_sts0) \
1108c2ecf20Sopenharmony_ci	IS_CMDQ_IDLE(TPC, cmdq_glbl_sts0)
1118c2ecf20Sopenharmony_ci#define IS_MME_CMDQ_IDLE(cmdq_glbl_sts0) \
1128c2ecf20Sopenharmony_ci	IS_CMDQ_IDLE(MME, cmdq_glbl_sts0)
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_ci#define IS_DMA_IDLE(dma_core_sts0) \
1158c2ecf20Sopenharmony_ci	!((dma_core_sts0) & DMA_CH_0_STS0_DMA_BUSY_MASK)
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci#define IS_TPC_IDLE(tpc_cfg_sts) \
1188c2ecf20Sopenharmony_ci	(((tpc_cfg_sts) & TPC_CFG_IDLE_MASK) == TPC_CFG_IDLE_MASK)
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ci#define IS_MME_IDLE(mme_arch_sts) \
1218c2ecf20Sopenharmony_ci	(((mme_arch_sts) & MME_ARCH_IDLE_MASK) == MME_ARCH_IDLE_MASK)
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_cistatic const char goya_irq_name[GOYA_MSIX_ENTRIES][GOYA_MAX_STRING_LEN] = {
1258c2ecf20Sopenharmony_ci		"goya cq 0", "goya cq 1", "goya cq 2", "goya cq 3",
1268c2ecf20Sopenharmony_ci		"goya cq 4", "goya cpu eq"
1278c2ecf20Sopenharmony_ci};
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_cistatic u16 goya_packet_sizes[MAX_PACKET_ID] = {
1308c2ecf20Sopenharmony_ci	[PACKET_WREG_32]	= sizeof(struct packet_wreg32),
1318c2ecf20Sopenharmony_ci	[PACKET_WREG_BULK]	= sizeof(struct packet_wreg_bulk),
1328c2ecf20Sopenharmony_ci	[PACKET_MSG_LONG]	= sizeof(struct packet_msg_long),
1338c2ecf20Sopenharmony_ci	[PACKET_MSG_SHORT]	= sizeof(struct packet_msg_short),
1348c2ecf20Sopenharmony_ci	[PACKET_CP_DMA]		= sizeof(struct packet_cp_dma),
1358c2ecf20Sopenharmony_ci	[PACKET_MSG_PROT]	= sizeof(struct packet_msg_prot),
1368c2ecf20Sopenharmony_ci	[PACKET_FENCE]		= sizeof(struct packet_fence),
1378c2ecf20Sopenharmony_ci	[PACKET_LIN_DMA]	= sizeof(struct packet_lin_dma),
1388c2ecf20Sopenharmony_ci	[PACKET_NOP]		= sizeof(struct packet_nop),
1398c2ecf20Sopenharmony_ci	[PACKET_STOP]		= sizeof(struct packet_stop)
1408c2ecf20Sopenharmony_ci};
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_cistatic inline bool validate_packet_id(enum packet_id id)
1438c2ecf20Sopenharmony_ci{
1448c2ecf20Sopenharmony_ci	switch (id) {
1458c2ecf20Sopenharmony_ci	case PACKET_WREG_32:
1468c2ecf20Sopenharmony_ci	case PACKET_WREG_BULK:
1478c2ecf20Sopenharmony_ci	case PACKET_MSG_LONG:
1488c2ecf20Sopenharmony_ci	case PACKET_MSG_SHORT:
1498c2ecf20Sopenharmony_ci	case PACKET_CP_DMA:
1508c2ecf20Sopenharmony_ci	case PACKET_MSG_PROT:
1518c2ecf20Sopenharmony_ci	case PACKET_FENCE:
1528c2ecf20Sopenharmony_ci	case PACKET_LIN_DMA:
1538c2ecf20Sopenharmony_ci	case PACKET_NOP:
1548c2ecf20Sopenharmony_ci	case PACKET_STOP:
1558c2ecf20Sopenharmony_ci		return true;
1568c2ecf20Sopenharmony_ci	default:
1578c2ecf20Sopenharmony_ci		return false;
1588c2ecf20Sopenharmony_ci	}
1598c2ecf20Sopenharmony_ci}
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_cistatic u64 goya_mmu_regs[GOYA_MMU_REGS_NUM] = {
1628c2ecf20Sopenharmony_ci	mmDMA_QM_0_GLBL_NON_SECURE_PROPS,
1638c2ecf20Sopenharmony_ci	mmDMA_QM_1_GLBL_NON_SECURE_PROPS,
1648c2ecf20Sopenharmony_ci	mmDMA_QM_2_GLBL_NON_SECURE_PROPS,
1658c2ecf20Sopenharmony_ci	mmDMA_QM_3_GLBL_NON_SECURE_PROPS,
1668c2ecf20Sopenharmony_ci	mmDMA_QM_4_GLBL_NON_SECURE_PROPS,
1678c2ecf20Sopenharmony_ci	mmTPC0_QM_GLBL_SECURE_PROPS,
1688c2ecf20Sopenharmony_ci	mmTPC0_QM_GLBL_NON_SECURE_PROPS,
1698c2ecf20Sopenharmony_ci	mmTPC0_CMDQ_GLBL_SECURE_PROPS,
1708c2ecf20Sopenharmony_ci	mmTPC0_CMDQ_GLBL_NON_SECURE_PROPS,
1718c2ecf20Sopenharmony_ci	mmTPC0_CFG_ARUSER,
1728c2ecf20Sopenharmony_ci	mmTPC0_CFG_AWUSER,
1738c2ecf20Sopenharmony_ci	mmTPC1_QM_GLBL_SECURE_PROPS,
1748c2ecf20Sopenharmony_ci	mmTPC1_QM_GLBL_NON_SECURE_PROPS,
1758c2ecf20Sopenharmony_ci	mmTPC1_CMDQ_GLBL_SECURE_PROPS,
1768c2ecf20Sopenharmony_ci	mmTPC1_CMDQ_GLBL_NON_SECURE_PROPS,
1778c2ecf20Sopenharmony_ci	mmTPC1_CFG_ARUSER,
1788c2ecf20Sopenharmony_ci	mmTPC1_CFG_AWUSER,
1798c2ecf20Sopenharmony_ci	mmTPC2_QM_GLBL_SECURE_PROPS,
1808c2ecf20Sopenharmony_ci	mmTPC2_QM_GLBL_NON_SECURE_PROPS,
1818c2ecf20Sopenharmony_ci	mmTPC2_CMDQ_GLBL_SECURE_PROPS,
1828c2ecf20Sopenharmony_ci	mmTPC2_CMDQ_GLBL_NON_SECURE_PROPS,
1838c2ecf20Sopenharmony_ci	mmTPC2_CFG_ARUSER,
1848c2ecf20Sopenharmony_ci	mmTPC2_CFG_AWUSER,
1858c2ecf20Sopenharmony_ci	mmTPC3_QM_GLBL_SECURE_PROPS,
1868c2ecf20Sopenharmony_ci	mmTPC3_QM_GLBL_NON_SECURE_PROPS,
1878c2ecf20Sopenharmony_ci	mmTPC3_CMDQ_GLBL_SECURE_PROPS,
1888c2ecf20Sopenharmony_ci	mmTPC3_CMDQ_GLBL_NON_SECURE_PROPS,
1898c2ecf20Sopenharmony_ci	mmTPC3_CFG_ARUSER,
1908c2ecf20Sopenharmony_ci	mmTPC3_CFG_AWUSER,
1918c2ecf20Sopenharmony_ci	mmTPC4_QM_GLBL_SECURE_PROPS,
1928c2ecf20Sopenharmony_ci	mmTPC4_QM_GLBL_NON_SECURE_PROPS,
1938c2ecf20Sopenharmony_ci	mmTPC4_CMDQ_GLBL_SECURE_PROPS,
1948c2ecf20Sopenharmony_ci	mmTPC4_CMDQ_GLBL_NON_SECURE_PROPS,
1958c2ecf20Sopenharmony_ci	mmTPC4_CFG_ARUSER,
1968c2ecf20Sopenharmony_ci	mmTPC4_CFG_AWUSER,
1978c2ecf20Sopenharmony_ci	mmTPC5_QM_GLBL_SECURE_PROPS,
1988c2ecf20Sopenharmony_ci	mmTPC5_QM_GLBL_NON_SECURE_PROPS,
1998c2ecf20Sopenharmony_ci	mmTPC5_CMDQ_GLBL_SECURE_PROPS,
2008c2ecf20Sopenharmony_ci	mmTPC5_CMDQ_GLBL_NON_SECURE_PROPS,
2018c2ecf20Sopenharmony_ci	mmTPC5_CFG_ARUSER,
2028c2ecf20Sopenharmony_ci	mmTPC5_CFG_AWUSER,
2038c2ecf20Sopenharmony_ci	mmTPC6_QM_GLBL_SECURE_PROPS,
2048c2ecf20Sopenharmony_ci	mmTPC6_QM_GLBL_NON_SECURE_PROPS,
2058c2ecf20Sopenharmony_ci	mmTPC6_CMDQ_GLBL_SECURE_PROPS,
2068c2ecf20Sopenharmony_ci	mmTPC6_CMDQ_GLBL_NON_SECURE_PROPS,
2078c2ecf20Sopenharmony_ci	mmTPC6_CFG_ARUSER,
2088c2ecf20Sopenharmony_ci	mmTPC6_CFG_AWUSER,
2098c2ecf20Sopenharmony_ci	mmTPC7_QM_GLBL_SECURE_PROPS,
2108c2ecf20Sopenharmony_ci	mmTPC7_QM_GLBL_NON_SECURE_PROPS,
2118c2ecf20Sopenharmony_ci	mmTPC7_CMDQ_GLBL_SECURE_PROPS,
2128c2ecf20Sopenharmony_ci	mmTPC7_CMDQ_GLBL_NON_SECURE_PROPS,
2138c2ecf20Sopenharmony_ci	mmTPC7_CFG_ARUSER,
2148c2ecf20Sopenharmony_ci	mmTPC7_CFG_AWUSER,
2158c2ecf20Sopenharmony_ci	mmMME_QM_GLBL_SECURE_PROPS,
2168c2ecf20Sopenharmony_ci	mmMME_QM_GLBL_NON_SECURE_PROPS,
2178c2ecf20Sopenharmony_ci	mmMME_CMDQ_GLBL_SECURE_PROPS,
2188c2ecf20Sopenharmony_ci	mmMME_CMDQ_GLBL_NON_SECURE_PROPS,
2198c2ecf20Sopenharmony_ci	mmMME_SBA_CONTROL_DATA,
2208c2ecf20Sopenharmony_ci	mmMME_SBB_CONTROL_DATA,
2218c2ecf20Sopenharmony_ci	mmMME_SBC_CONTROL_DATA,
2228c2ecf20Sopenharmony_ci	mmMME_WBC_CONTROL_DATA,
2238c2ecf20Sopenharmony_ci	mmPCIE_WRAP_PSOC_ARUSER,
2248c2ecf20Sopenharmony_ci	mmPCIE_WRAP_PSOC_AWUSER
2258c2ecf20Sopenharmony_ci};
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_cistatic u32 goya_all_events[] = {
2288c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_PCIE_IF,
2298c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC0_ECC,
2308c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC1_ECC,
2318c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC2_ECC,
2328c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC3_ECC,
2338c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC4_ECC,
2348c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC5_ECC,
2358c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC6_ECC,
2368c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC7_ECC,
2378c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_MME_ECC,
2388c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_MME_ECC_EXT,
2398c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_MMU_ECC,
2408c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA_MACRO,
2418c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA_ECC,
2428c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_CPU_IF_ECC,
2438c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_PSOC_MEM,
2448c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_PSOC_CORESIGHT,
2458c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM0,
2468c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM1,
2478c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM2,
2488c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM3,
2498c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM4,
2508c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM5,
2518c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM6,
2528c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM7,
2538c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM8,
2548c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM9,
2558c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM10,
2568c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM11,
2578c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM12,
2588c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM13,
2598c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM14,
2608c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM15,
2618c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM16,
2628c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM17,
2638c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM18,
2648c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM19,
2658c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM20,
2668c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM21,
2678c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM22,
2688c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM23,
2698c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM24,
2708c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM25,
2718c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM26,
2728c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM27,
2738c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM28,
2748c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_SRAM29,
2758c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_GIC500,
2768c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_PLL0,
2778c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_PLL1,
2788c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_PLL3,
2798c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_PLL4,
2808c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_PLL5,
2818c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_PLL6,
2828c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_AXI_ECC,
2838c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_L2_RAM_ECC,
2848c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_PSOC_GPIO_05_SW_RESET,
2858c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_PSOC_GPIO_10_VRHOT_ICRIT,
2868c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_PCIE_DEC,
2878c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC0_DEC,
2888c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC1_DEC,
2898c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC2_DEC,
2908c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC3_DEC,
2918c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC4_DEC,
2928c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC5_DEC,
2938c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC6_DEC,
2948c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC7_DEC,
2958c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_MME_WACS,
2968c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_MME_WACSD,
2978c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_CPU_AXI_SPLITTER,
2988c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_PSOC_AXI_DEC,
2998c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_PSOC,
3008c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC0_KRN_ERR,
3018c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC1_KRN_ERR,
3028c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC2_KRN_ERR,
3038c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC3_KRN_ERR,
3048c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC4_KRN_ERR,
3058c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC5_KRN_ERR,
3068c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC6_KRN_ERR,
3078c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC7_KRN_ERR,
3088c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC0_CMDQ,
3098c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC1_CMDQ,
3108c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC2_CMDQ,
3118c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC3_CMDQ,
3128c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC4_CMDQ,
3138c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC5_CMDQ,
3148c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC6_CMDQ,
3158c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC7_CMDQ,
3168c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC0_QM,
3178c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC1_QM,
3188c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC2_QM,
3198c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC3_QM,
3208c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC4_QM,
3218c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC5_QM,
3228c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC6_QM,
3238c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC7_QM,
3248c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_MME_QM,
3258c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_MME_CMDQ,
3268c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA0_QM,
3278c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA1_QM,
3288c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA2_QM,
3298c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA3_QM,
3308c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA4_QM,
3318c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA0_CH,
3328c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA1_CH,
3338c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA2_CH,
3348c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA3_CH,
3358c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA4_CH,
3368c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC0_BMON_SPMU,
3378c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC1_BMON_SPMU,
3388c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC2_BMON_SPMU,
3398c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC3_BMON_SPMU,
3408c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC4_BMON_SPMU,
3418c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC5_BMON_SPMU,
3428c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC6_BMON_SPMU,
3438c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_TPC7_BMON_SPMU,
3448c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA_BM_CH0,
3458c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA_BM_CH1,
3468c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA_BM_CH2,
3478c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA_BM_CH3,
3488c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_DMA_BM_CH4,
3498c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_FIX_POWER_ENV_S,
3508c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_FIX_POWER_ENV_E,
3518c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_FIX_THERMAL_ENV_S,
3528c2ecf20Sopenharmony_ci	GOYA_ASYNC_EVENT_ID_FIX_THERMAL_ENV_E
3538c2ecf20Sopenharmony_ci};
3548c2ecf20Sopenharmony_ci
3558c2ecf20Sopenharmony_cistatic int goya_mmu_clear_pgt_range(struct hl_device *hdev);
3568c2ecf20Sopenharmony_cistatic int goya_mmu_set_dram_default_page(struct hl_device *hdev);
3578c2ecf20Sopenharmony_cistatic int goya_mmu_add_mappings_for_device_cpu(struct hl_device *hdev);
3588c2ecf20Sopenharmony_cistatic void goya_mmu_prepare(struct hl_device *hdev, u32 asid);
3598c2ecf20Sopenharmony_ci
3608c2ecf20Sopenharmony_ciint goya_get_fixed_properties(struct hl_device *hdev)
3618c2ecf20Sopenharmony_ci{
3628c2ecf20Sopenharmony_ci	struct asic_fixed_properties *prop = &hdev->asic_prop;
3638c2ecf20Sopenharmony_ci	int i;
3648c2ecf20Sopenharmony_ci
3658c2ecf20Sopenharmony_ci	prop->max_queues = GOYA_QUEUE_ID_SIZE;
3668c2ecf20Sopenharmony_ci	prop->hw_queues_props = kcalloc(prop->max_queues,
3678c2ecf20Sopenharmony_ci			sizeof(struct hw_queue_properties),
3688c2ecf20Sopenharmony_ci			GFP_KERNEL);
3698c2ecf20Sopenharmony_ci
3708c2ecf20Sopenharmony_ci	if (!prop->hw_queues_props)
3718c2ecf20Sopenharmony_ci		return -ENOMEM;
3728c2ecf20Sopenharmony_ci
3738c2ecf20Sopenharmony_ci	for (i = 0 ; i < NUMBER_OF_EXT_HW_QUEUES ; i++) {
3748c2ecf20Sopenharmony_ci		prop->hw_queues_props[i].type = QUEUE_TYPE_EXT;
3758c2ecf20Sopenharmony_ci		prop->hw_queues_props[i].driver_only = 0;
3768c2ecf20Sopenharmony_ci		prop->hw_queues_props[i].requires_kernel_cb = 1;
3778c2ecf20Sopenharmony_ci	}
3788c2ecf20Sopenharmony_ci
3798c2ecf20Sopenharmony_ci	for (; i < NUMBER_OF_EXT_HW_QUEUES + NUMBER_OF_CPU_HW_QUEUES ; i++) {
3808c2ecf20Sopenharmony_ci		prop->hw_queues_props[i].type = QUEUE_TYPE_CPU;
3818c2ecf20Sopenharmony_ci		prop->hw_queues_props[i].driver_only = 1;
3828c2ecf20Sopenharmony_ci		prop->hw_queues_props[i].requires_kernel_cb = 0;
3838c2ecf20Sopenharmony_ci	}
3848c2ecf20Sopenharmony_ci
3858c2ecf20Sopenharmony_ci	for (; i < NUMBER_OF_EXT_HW_QUEUES + NUMBER_OF_CPU_HW_QUEUES +
3868c2ecf20Sopenharmony_ci			NUMBER_OF_INT_HW_QUEUES; i++) {
3878c2ecf20Sopenharmony_ci		prop->hw_queues_props[i].type = QUEUE_TYPE_INT;
3888c2ecf20Sopenharmony_ci		prop->hw_queues_props[i].driver_only = 0;
3898c2ecf20Sopenharmony_ci		prop->hw_queues_props[i].requires_kernel_cb = 0;
3908c2ecf20Sopenharmony_ci	}
3918c2ecf20Sopenharmony_ci
3928c2ecf20Sopenharmony_ci	prop->completion_queues_count = NUMBER_OF_CMPLT_QUEUES;
3938c2ecf20Sopenharmony_ci
3948c2ecf20Sopenharmony_ci	prop->dram_base_address = DRAM_PHYS_BASE;
3958c2ecf20Sopenharmony_ci	prop->dram_size = DRAM_PHYS_DEFAULT_SIZE;
3968c2ecf20Sopenharmony_ci	prop->dram_end_address = prop->dram_base_address + prop->dram_size;
3978c2ecf20Sopenharmony_ci	prop->dram_user_base_address = DRAM_BASE_ADDR_USER;
3988c2ecf20Sopenharmony_ci
3998c2ecf20Sopenharmony_ci	prop->sram_base_address = SRAM_BASE_ADDR;
4008c2ecf20Sopenharmony_ci	prop->sram_size = SRAM_SIZE;
4018c2ecf20Sopenharmony_ci	prop->sram_end_address = prop->sram_base_address + prop->sram_size;
4028c2ecf20Sopenharmony_ci	prop->sram_user_base_address = prop->sram_base_address +
4038c2ecf20Sopenharmony_ci						SRAM_USER_BASE_OFFSET;
4048c2ecf20Sopenharmony_ci
4058c2ecf20Sopenharmony_ci	prop->mmu_pgt_addr = MMU_PAGE_TABLES_ADDR;
4068c2ecf20Sopenharmony_ci	prop->mmu_dram_default_page_addr = MMU_DRAM_DEFAULT_PAGE_ADDR;
4078c2ecf20Sopenharmony_ci	if (hdev->pldm)
4088c2ecf20Sopenharmony_ci		prop->mmu_pgt_size = 0x800000; /* 8MB */
4098c2ecf20Sopenharmony_ci	else
4108c2ecf20Sopenharmony_ci		prop->mmu_pgt_size = MMU_PAGE_TABLES_SIZE;
4118c2ecf20Sopenharmony_ci	prop->mmu_pte_size = HL_PTE_SIZE;
4128c2ecf20Sopenharmony_ci	prop->mmu_hop_table_size = HOP_TABLE_SIZE;
4138c2ecf20Sopenharmony_ci	prop->mmu_hop0_tables_total_size = HOP0_TABLES_TOTAL_SIZE;
4148c2ecf20Sopenharmony_ci	prop->dram_page_size = PAGE_SIZE_2MB;
4158c2ecf20Sopenharmony_ci
4168c2ecf20Sopenharmony_ci	prop->dmmu.hop0_shift = HOP0_SHIFT;
4178c2ecf20Sopenharmony_ci	prop->dmmu.hop1_shift = HOP1_SHIFT;
4188c2ecf20Sopenharmony_ci	prop->dmmu.hop2_shift = HOP2_SHIFT;
4198c2ecf20Sopenharmony_ci	prop->dmmu.hop3_shift = HOP3_SHIFT;
4208c2ecf20Sopenharmony_ci	prop->dmmu.hop4_shift = HOP4_SHIFT;
4218c2ecf20Sopenharmony_ci	prop->dmmu.hop0_mask = HOP0_MASK;
4228c2ecf20Sopenharmony_ci	prop->dmmu.hop1_mask = HOP1_MASK;
4238c2ecf20Sopenharmony_ci	prop->dmmu.hop2_mask = HOP2_MASK;
4248c2ecf20Sopenharmony_ci	prop->dmmu.hop3_mask = HOP3_MASK;
4258c2ecf20Sopenharmony_ci	prop->dmmu.hop4_mask = HOP4_MASK;
4268c2ecf20Sopenharmony_ci	prop->dmmu.start_addr = VA_DDR_SPACE_START;
4278c2ecf20Sopenharmony_ci	prop->dmmu.end_addr = VA_DDR_SPACE_END;
4288c2ecf20Sopenharmony_ci	prop->dmmu.page_size = PAGE_SIZE_2MB;
4298c2ecf20Sopenharmony_ci	prop->dmmu.num_hops = MMU_ARCH_5_HOPS;
4308c2ecf20Sopenharmony_ci
4318c2ecf20Sopenharmony_ci	/* shifts and masks are the same in PMMU and DMMU */
4328c2ecf20Sopenharmony_ci	memcpy(&prop->pmmu, &prop->dmmu, sizeof(prop->dmmu));
4338c2ecf20Sopenharmony_ci	prop->pmmu.start_addr = VA_HOST_SPACE_START;
4348c2ecf20Sopenharmony_ci	prop->pmmu.end_addr = VA_HOST_SPACE_END;
4358c2ecf20Sopenharmony_ci	prop->pmmu.page_size = PAGE_SIZE_4KB;
4368c2ecf20Sopenharmony_ci	prop->pmmu.num_hops = MMU_ARCH_5_HOPS;
4378c2ecf20Sopenharmony_ci
4388c2ecf20Sopenharmony_ci	/* PMMU and HPMMU are the same except of page size */
4398c2ecf20Sopenharmony_ci	memcpy(&prop->pmmu_huge, &prop->pmmu, sizeof(prop->pmmu));
4408c2ecf20Sopenharmony_ci	prop->pmmu_huge.page_size = PAGE_SIZE_2MB;
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ci	prop->dram_size_for_default_page_mapping = VA_DDR_SPACE_END;
4438c2ecf20Sopenharmony_ci	prop->cfg_size = CFG_SIZE;
4448c2ecf20Sopenharmony_ci	prop->max_asid = MAX_ASID;
4458c2ecf20Sopenharmony_ci	prop->num_of_events = GOYA_ASYNC_EVENT_ID_SIZE;
4468c2ecf20Sopenharmony_ci	prop->high_pll = PLL_HIGH_DEFAULT;
4478c2ecf20Sopenharmony_ci	prop->cb_pool_cb_cnt = GOYA_CB_POOL_CB_CNT;
4488c2ecf20Sopenharmony_ci	prop->cb_pool_cb_size = GOYA_CB_POOL_CB_SIZE;
4498c2ecf20Sopenharmony_ci	prop->max_power_default = MAX_POWER_DEFAULT;
4508c2ecf20Sopenharmony_ci	prop->tpc_enabled_mask = TPC_ENABLED_MASK;
4518c2ecf20Sopenharmony_ci	prop->pcie_dbi_base_address = mmPCIE_DBI_BASE;
4528c2ecf20Sopenharmony_ci	prop->pcie_aux_dbi_reg_addr = CFG_BASE + mmPCIE_AUX_DBI;
4538c2ecf20Sopenharmony_ci
4548c2ecf20Sopenharmony_ci	strncpy(prop->cpucp_info.card_name, GOYA_DEFAULT_CARD_NAME,
4558c2ecf20Sopenharmony_ci		CARD_NAME_MAX_LEN);
4568c2ecf20Sopenharmony_ci
4578c2ecf20Sopenharmony_ci	prop->max_pending_cs = GOYA_MAX_PENDING_CS;
4588c2ecf20Sopenharmony_ci
4598c2ecf20Sopenharmony_ci	return 0;
4608c2ecf20Sopenharmony_ci}
4618c2ecf20Sopenharmony_ci
4628c2ecf20Sopenharmony_ci/*
4638c2ecf20Sopenharmony_ci * goya_pci_bars_map - Map PCI BARS of Goya device
4648c2ecf20Sopenharmony_ci *
4658c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
4668c2ecf20Sopenharmony_ci *
4678c2ecf20Sopenharmony_ci * Request PCI regions and map them to kernel virtual addresses.
4688c2ecf20Sopenharmony_ci * Returns 0 on success
4698c2ecf20Sopenharmony_ci *
4708c2ecf20Sopenharmony_ci */
4718c2ecf20Sopenharmony_cistatic int goya_pci_bars_map(struct hl_device *hdev)
4728c2ecf20Sopenharmony_ci{
4738c2ecf20Sopenharmony_ci	static const char * const name[] = {"SRAM_CFG", "MSIX", "DDR"};
4748c2ecf20Sopenharmony_ci	bool is_wc[3] = {false, false, true};
4758c2ecf20Sopenharmony_ci	int rc;
4768c2ecf20Sopenharmony_ci
4778c2ecf20Sopenharmony_ci	rc = hl_pci_bars_map(hdev, name, is_wc);
4788c2ecf20Sopenharmony_ci	if (rc)
4798c2ecf20Sopenharmony_ci		return rc;
4808c2ecf20Sopenharmony_ci
4818c2ecf20Sopenharmony_ci	hdev->rmmio = hdev->pcie_bar[SRAM_CFG_BAR_ID] +
4828c2ecf20Sopenharmony_ci			(CFG_BASE - SRAM_BASE_ADDR);
4838c2ecf20Sopenharmony_ci
4848c2ecf20Sopenharmony_ci	return 0;
4858c2ecf20Sopenharmony_ci}
4868c2ecf20Sopenharmony_ci
4878c2ecf20Sopenharmony_cistatic u64 goya_set_ddr_bar_base(struct hl_device *hdev, u64 addr)
4888c2ecf20Sopenharmony_ci{
4898c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
4908c2ecf20Sopenharmony_ci	struct hl_inbound_pci_region pci_region;
4918c2ecf20Sopenharmony_ci	u64 old_addr = addr;
4928c2ecf20Sopenharmony_ci	int rc;
4938c2ecf20Sopenharmony_ci
4948c2ecf20Sopenharmony_ci	if ((goya) && (goya->ddr_bar_cur_addr == addr))
4958c2ecf20Sopenharmony_ci		return old_addr;
4968c2ecf20Sopenharmony_ci
4978c2ecf20Sopenharmony_ci	/* Inbound Region 1 - Bar 4 - Point to DDR */
4988c2ecf20Sopenharmony_ci	pci_region.mode = PCI_BAR_MATCH_MODE;
4998c2ecf20Sopenharmony_ci	pci_region.bar = DDR_BAR_ID;
5008c2ecf20Sopenharmony_ci	pci_region.addr = addr;
5018c2ecf20Sopenharmony_ci	rc = hl_pci_set_inbound_region(hdev, 1, &pci_region);
5028c2ecf20Sopenharmony_ci	if (rc)
5038c2ecf20Sopenharmony_ci		return U64_MAX;
5048c2ecf20Sopenharmony_ci
5058c2ecf20Sopenharmony_ci	if (goya) {
5068c2ecf20Sopenharmony_ci		old_addr = goya->ddr_bar_cur_addr;
5078c2ecf20Sopenharmony_ci		goya->ddr_bar_cur_addr = addr;
5088c2ecf20Sopenharmony_ci	}
5098c2ecf20Sopenharmony_ci
5108c2ecf20Sopenharmony_ci	return old_addr;
5118c2ecf20Sopenharmony_ci}
5128c2ecf20Sopenharmony_ci
5138c2ecf20Sopenharmony_ci/*
5148c2ecf20Sopenharmony_ci * goya_init_iatu - Initialize the iATU unit inside the PCI controller
5158c2ecf20Sopenharmony_ci *
5168c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
5178c2ecf20Sopenharmony_ci *
5188c2ecf20Sopenharmony_ci * This is needed in case the firmware doesn't initialize the iATU
5198c2ecf20Sopenharmony_ci *
5208c2ecf20Sopenharmony_ci */
5218c2ecf20Sopenharmony_cistatic int goya_init_iatu(struct hl_device *hdev)
5228c2ecf20Sopenharmony_ci{
5238c2ecf20Sopenharmony_ci	struct hl_inbound_pci_region inbound_region;
5248c2ecf20Sopenharmony_ci	struct hl_outbound_pci_region outbound_region;
5258c2ecf20Sopenharmony_ci	int rc;
5268c2ecf20Sopenharmony_ci
5278c2ecf20Sopenharmony_ci	/* Inbound Region 0 - Bar 0 - Point to SRAM and CFG */
5288c2ecf20Sopenharmony_ci	inbound_region.mode = PCI_BAR_MATCH_MODE;
5298c2ecf20Sopenharmony_ci	inbound_region.bar = SRAM_CFG_BAR_ID;
5308c2ecf20Sopenharmony_ci	inbound_region.addr = SRAM_BASE_ADDR;
5318c2ecf20Sopenharmony_ci	rc = hl_pci_set_inbound_region(hdev, 0, &inbound_region);
5328c2ecf20Sopenharmony_ci	if (rc)
5338c2ecf20Sopenharmony_ci		goto done;
5348c2ecf20Sopenharmony_ci
5358c2ecf20Sopenharmony_ci	/* Inbound Region 1 - Bar 4 - Point to DDR */
5368c2ecf20Sopenharmony_ci	inbound_region.mode = PCI_BAR_MATCH_MODE;
5378c2ecf20Sopenharmony_ci	inbound_region.bar = DDR_BAR_ID;
5388c2ecf20Sopenharmony_ci	inbound_region.addr = DRAM_PHYS_BASE;
5398c2ecf20Sopenharmony_ci	rc = hl_pci_set_inbound_region(hdev, 1, &inbound_region);
5408c2ecf20Sopenharmony_ci	if (rc)
5418c2ecf20Sopenharmony_ci		goto done;
5428c2ecf20Sopenharmony_ci
5438c2ecf20Sopenharmony_ci	hdev->asic_funcs->set_dma_mask_from_fw(hdev);
5448c2ecf20Sopenharmony_ci
5458c2ecf20Sopenharmony_ci	/* Outbound Region 0 - Point to Host  */
5468c2ecf20Sopenharmony_ci	outbound_region.addr = HOST_PHYS_BASE;
5478c2ecf20Sopenharmony_ci	outbound_region.size = HOST_PHYS_SIZE;
5488c2ecf20Sopenharmony_ci	rc = hl_pci_set_outbound_region(hdev, &outbound_region);
5498c2ecf20Sopenharmony_ci
5508c2ecf20Sopenharmony_cidone:
5518c2ecf20Sopenharmony_ci	return rc;
5528c2ecf20Sopenharmony_ci}
5538c2ecf20Sopenharmony_ci
5548c2ecf20Sopenharmony_ci/*
5558c2ecf20Sopenharmony_ci * goya_early_init - GOYA early initialization code
5568c2ecf20Sopenharmony_ci *
5578c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
5588c2ecf20Sopenharmony_ci *
5598c2ecf20Sopenharmony_ci * Verify PCI bars
5608c2ecf20Sopenharmony_ci * Set DMA masks
5618c2ecf20Sopenharmony_ci * PCI controller initialization
5628c2ecf20Sopenharmony_ci * Map PCI bars
5638c2ecf20Sopenharmony_ci *
5648c2ecf20Sopenharmony_ci */
5658c2ecf20Sopenharmony_cistatic int goya_early_init(struct hl_device *hdev)
5668c2ecf20Sopenharmony_ci{
5678c2ecf20Sopenharmony_ci	struct asic_fixed_properties *prop = &hdev->asic_prop;
5688c2ecf20Sopenharmony_ci	struct pci_dev *pdev = hdev->pdev;
5698c2ecf20Sopenharmony_ci	u32 val;
5708c2ecf20Sopenharmony_ci	int rc;
5718c2ecf20Sopenharmony_ci
5728c2ecf20Sopenharmony_ci	rc = goya_get_fixed_properties(hdev);
5738c2ecf20Sopenharmony_ci	if (rc) {
5748c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "Failed to get fixed properties\n");
5758c2ecf20Sopenharmony_ci		return rc;
5768c2ecf20Sopenharmony_ci	}
5778c2ecf20Sopenharmony_ci
5788c2ecf20Sopenharmony_ci	/* Check BAR sizes */
5798c2ecf20Sopenharmony_ci	if (pci_resource_len(pdev, SRAM_CFG_BAR_ID) != CFG_BAR_SIZE) {
5808c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
5818c2ecf20Sopenharmony_ci			"Not " HL_NAME "? BAR %d size %llu, expecting %llu\n",
5828c2ecf20Sopenharmony_ci			SRAM_CFG_BAR_ID,
5838c2ecf20Sopenharmony_ci			(unsigned long long) pci_resource_len(pdev,
5848c2ecf20Sopenharmony_ci							SRAM_CFG_BAR_ID),
5858c2ecf20Sopenharmony_ci			CFG_BAR_SIZE);
5868c2ecf20Sopenharmony_ci		rc = -ENODEV;
5878c2ecf20Sopenharmony_ci		goto free_queue_props;
5888c2ecf20Sopenharmony_ci	}
5898c2ecf20Sopenharmony_ci
5908c2ecf20Sopenharmony_ci	if (pci_resource_len(pdev, MSIX_BAR_ID) != MSIX_BAR_SIZE) {
5918c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
5928c2ecf20Sopenharmony_ci			"Not " HL_NAME "? BAR %d size %llu, expecting %llu\n",
5938c2ecf20Sopenharmony_ci			MSIX_BAR_ID,
5948c2ecf20Sopenharmony_ci			(unsigned long long) pci_resource_len(pdev,
5958c2ecf20Sopenharmony_ci								MSIX_BAR_ID),
5968c2ecf20Sopenharmony_ci			MSIX_BAR_SIZE);
5978c2ecf20Sopenharmony_ci		rc = -ENODEV;
5988c2ecf20Sopenharmony_ci		goto free_queue_props;
5998c2ecf20Sopenharmony_ci	}
6008c2ecf20Sopenharmony_ci
6018c2ecf20Sopenharmony_ci	prop->dram_pci_bar_size = pci_resource_len(pdev, DDR_BAR_ID);
6028c2ecf20Sopenharmony_ci
6038c2ecf20Sopenharmony_ci	rc = hl_pci_init(hdev, mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS,
6048c2ecf20Sopenharmony_ci			mmCPU_BOOT_ERR0, GOYA_BOOT_FIT_REQ_TIMEOUT_USEC);
6058c2ecf20Sopenharmony_ci	if (rc)
6068c2ecf20Sopenharmony_ci		goto free_queue_props;
6078c2ecf20Sopenharmony_ci
6088c2ecf20Sopenharmony_ci	/* Goya Firmware does not support security */
6098c2ecf20Sopenharmony_ci	prop->fw_security_disabled = true;
6108c2ecf20Sopenharmony_ci	dev_info(hdev->dev, "firmware-level security is disabled\n");
6118c2ecf20Sopenharmony_ci
6128c2ecf20Sopenharmony_ci	if (!hdev->pldm) {
6138c2ecf20Sopenharmony_ci		val = RREG32(mmPSOC_GLOBAL_CONF_BOOT_STRAP_PINS);
6148c2ecf20Sopenharmony_ci		if (val & PSOC_GLOBAL_CONF_BOOT_STRAP_PINS_SRIOV_EN_MASK)
6158c2ecf20Sopenharmony_ci			dev_warn(hdev->dev,
6168c2ecf20Sopenharmony_ci				"PCI strap is not configured correctly, PCI bus errors may occur\n");
6178c2ecf20Sopenharmony_ci	}
6188c2ecf20Sopenharmony_ci
6198c2ecf20Sopenharmony_ci	return 0;
6208c2ecf20Sopenharmony_ci
6218c2ecf20Sopenharmony_cifree_queue_props:
6228c2ecf20Sopenharmony_ci	kfree(hdev->asic_prop.hw_queues_props);
6238c2ecf20Sopenharmony_ci	return rc;
6248c2ecf20Sopenharmony_ci}
6258c2ecf20Sopenharmony_ci
6268c2ecf20Sopenharmony_ci/*
6278c2ecf20Sopenharmony_ci * goya_early_fini - GOYA early finalization code
6288c2ecf20Sopenharmony_ci *
6298c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
6308c2ecf20Sopenharmony_ci *
6318c2ecf20Sopenharmony_ci * Unmap PCI bars
6328c2ecf20Sopenharmony_ci *
6338c2ecf20Sopenharmony_ci */
6348c2ecf20Sopenharmony_cistatic int goya_early_fini(struct hl_device *hdev)
6358c2ecf20Sopenharmony_ci{
6368c2ecf20Sopenharmony_ci	kfree(hdev->asic_prop.hw_queues_props);
6378c2ecf20Sopenharmony_ci	hl_pci_fini(hdev);
6388c2ecf20Sopenharmony_ci
6398c2ecf20Sopenharmony_ci	return 0;
6408c2ecf20Sopenharmony_ci}
6418c2ecf20Sopenharmony_ci
6428c2ecf20Sopenharmony_cistatic void goya_mmu_prepare_reg(struct hl_device *hdev, u64 reg, u32 asid)
6438c2ecf20Sopenharmony_ci{
6448c2ecf20Sopenharmony_ci	/* mask to zero the MMBP and ASID bits */
6458c2ecf20Sopenharmony_ci	WREG32_AND(reg, ~0x7FF);
6468c2ecf20Sopenharmony_ci	WREG32_OR(reg, asid);
6478c2ecf20Sopenharmony_ci}
6488c2ecf20Sopenharmony_ci
6498c2ecf20Sopenharmony_cistatic void goya_qman0_set_security(struct hl_device *hdev, bool secure)
6508c2ecf20Sopenharmony_ci{
6518c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
6528c2ecf20Sopenharmony_ci
6538c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_MMU))
6548c2ecf20Sopenharmony_ci		return;
6558c2ecf20Sopenharmony_ci
6568c2ecf20Sopenharmony_ci	if (secure)
6578c2ecf20Sopenharmony_ci		WREG32(mmDMA_QM_0_GLBL_PROT, QMAN_DMA_FULLY_TRUSTED);
6588c2ecf20Sopenharmony_ci	else
6598c2ecf20Sopenharmony_ci		WREG32(mmDMA_QM_0_GLBL_PROT, QMAN_DMA_PARTLY_TRUSTED);
6608c2ecf20Sopenharmony_ci
6618c2ecf20Sopenharmony_ci	RREG32(mmDMA_QM_0_GLBL_PROT);
6628c2ecf20Sopenharmony_ci}
6638c2ecf20Sopenharmony_ci
6648c2ecf20Sopenharmony_ci/*
6658c2ecf20Sopenharmony_ci * goya_fetch_psoc_frequency - Fetch PSOC frequency values
6668c2ecf20Sopenharmony_ci *
6678c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
6688c2ecf20Sopenharmony_ci *
6698c2ecf20Sopenharmony_ci */
6708c2ecf20Sopenharmony_cistatic void goya_fetch_psoc_frequency(struct hl_device *hdev)
6718c2ecf20Sopenharmony_ci{
6728c2ecf20Sopenharmony_ci	struct asic_fixed_properties *prop = &hdev->asic_prop;
6738c2ecf20Sopenharmony_ci	u32 trace_freq = 0;
6748c2ecf20Sopenharmony_ci	u32 pll_clk = 0;
6758c2ecf20Sopenharmony_ci	u32 div_fctr = RREG32(mmPSOC_PCI_PLL_DIV_FACTOR_1);
6768c2ecf20Sopenharmony_ci	u32 div_sel = RREG32(mmPSOC_PCI_PLL_DIV_SEL_1);
6778c2ecf20Sopenharmony_ci	u32 nr = RREG32(mmPSOC_PCI_PLL_NR);
6788c2ecf20Sopenharmony_ci	u32 nf = RREG32(mmPSOC_PCI_PLL_NF);
6798c2ecf20Sopenharmony_ci	u32 od = RREG32(mmPSOC_PCI_PLL_OD);
6808c2ecf20Sopenharmony_ci
6818c2ecf20Sopenharmony_ci	if (div_sel == DIV_SEL_REF_CLK || div_sel == DIV_SEL_DIVIDED_REF) {
6828c2ecf20Sopenharmony_ci		if (div_sel == DIV_SEL_REF_CLK)
6838c2ecf20Sopenharmony_ci			trace_freq = PLL_REF_CLK;
6848c2ecf20Sopenharmony_ci		else
6858c2ecf20Sopenharmony_ci			trace_freq = PLL_REF_CLK / (div_fctr + 1);
6868c2ecf20Sopenharmony_ci	} else if (div_sel == DIV_SEL_PLL_CLK ||
6878c2ecf20Sopenharmony_ci					div_sel == DIV_SEL_DIVIDED_PLL) {
6888c2ecf20Sopenharmony_ci		pll_clk = PLL_REF_CLK * (nf + 1) / ((nr + 1) * (od + 1));
6898c2ecf20Sopenharmony_ci		if (div_sel == DIV_SEL_PLL_CLK)
6908c2ecf20Sopenharmony_ci			trace_freq = pll_clk;
6918c2ecf20Sopenharmony_ci		else
6928c2ecf20Sopenharmony_ci			trace_freq = pll_clk / (div_fctr + 1);
6938c2ecf20Sopenharmony_ci	} else {
6948c2ecf20Sopenharmony_ci		dev_warn(hdev->dev,
6958c2ecf20Sopenharmony_ci			"Received invalid div select value: %d", div_sel);
6968c2ecf20Sopenharmony_ci	}
6978c2ecf20Sopenharmony_ci
6988c2ecf20Sopenharmony_ci	prop->psoc_timestamp_frequency = trace_freq;
6998c2ecf20Sopenharmony_ci	prop->psoc_pci_pll_nr = nr;
7008c2ecf20Sopenharmony_ci	prop->psoc_pci_pll_nf = nf;
7018c2ecf20Sopenharmony_ci	prop->psoc_pci_pll_od = od;
7028c2ecf20Sopenharmony_ci	prop->psoc_pci_pll_div_factor = div_fctr;
7038c2ecf20Sopenharmony_ci}
7048c2ecf20Sopenharmony_ci
7058c2ecf20Sopenharmony_ciint goya_late_init(struct hl_device *hdev)
7068c2ecf20Sopenharmony_ci{
7078c2ecf20Sopenharmony_ci	struct asic_fixed_properties *prop = &hdev->asic_prop;
7088c2ecf20Sopenharmony_ci	int rc;
7098c2ecf20Sopenharmony_ci
7108c2ecf20Sopenharmony_ci	goya_fetch_psoc_frequency(hdev);
7118c2ecf20Sopenharmony_ci
7128c2ecf20Sopenharmony_ci	rc = goya_mmu_clear_pgt_range(hdev);
7138c2ecf20Sopenharmony_ci	if (rc) {
7148c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
7158c2ecf20Sopenharmony_ci			"Failed to clear MMU page tables range %d\n", rc);
7168c2ecf20Sopenharmony_ci		return rc;
7178c2ecf20Sopenharmony_ci	}
7188c2ecf20Sopenharmony_ci
7198c2ecf20Sopenharmony_ci	rc = goya_mmu_set_dram_default_page(hdev);
7208c2ecf20Sopenharmony_ci	if (rc) {
7218c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "Failed to set DRAM default page %d\n", rc);
7228c2ecf20Sopenharmony_ci		return rc;
7238c2ecf20Sopenharmony_ci	}
7248c2ecf20Sopenharmony_ci
7258c2ecf20Sopenharmony_ci	rc = goya_mmu_add_mappings_for_device_cpu(hdev);
7268c2ecf20Sopenharmony_ci	if (rc)
7278c2ecf20Sopenharmony_ci		return rc;
7288c2ecf20Sopenharmony_ci
7298c2ecf20Sopenharmony_ci	rc = goya_init_cpu_queues(hdev);
7308c2ecf20Sopenharmony_ci	if (rc)
7318c2ecf20Sopenharmony_ci		return rc;
7328c2ecf20Sopenharmony_ci
7338c2ecf20Sopenharmony_ci	rc = goya_test_cpu_queue(hdev);
7348c2ecf20Sopenharmony_ci	if (rc)
7358c2ecf20Sopenharmony_ci		return rc;
7368c2ecf20Sopenharmony_ci
7378c2ecf20Sopenharmony_ci	rc = goya_cpucp_info_get(hdev);
7388c2ecf20Sopenharmony_ci	if (rc) {
7398c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "Failed to get cpucp info %d\n", rc);
7408c2ecf20Sopenharmony_ci		return rc;
7418c2ecf20Sopenharmony_ci	}
7428c2ecf20Sopenharmony_ci
7438c2ecf20Sopenharmony_ci	/* Now that we have the DRAM size in ASIC prop, we need to check
7448c2ecf20Sopenharmony_ci	 * its size and configure the DMA_IF DDR wrap protection (which is in
7458c2ecf20Sopenharmony_ci	 * the MMU block) accordingly. The value is the log2 of the DRAM size
7468c2ecf20Sopenharmony_ci	 */
7478c2ecf20Sopenharmony_ci	WREG32(mmMMU_LOG2_DDR_SIZE, ilog2(prop->dram_size));
7488c2ecf20Sopenharmony_ci
7498c2ecf20Sopenharmony_ci	rc = hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_ENABLE_PCI_ACCESS);
7508c2ecf20Sopenharmony_ci	if (rc) {
7518c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
7528c2ecf20Sopenharmony_ci			"Failed to enable PCI access from CPU %d\n", rc);
7538c2ecf20Sopenharmony_ci		return rc;
7548c2ecf20Sopenharmony_ci	}
7558c2ecf20Sopenharmony_ci
7568c2ecf20Sopenharmony_ci	WREG32(mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR,
7578c2ecf20Sopenharmony_ci			GOYA_ASYNC_EVENT_ID_INTS_REGISTER);
7588c2ecf20Sopenharmony_ci
7598c2ecf20Sopenharmony_ci	return 0;
7608c2ecf20Sopenharmony_ci}
7618c2ecf20Sopenharmony_ci
7628c2ecf20Sopenharmony_ci/*
7638c2ecf20Sopenharmony_ci * goya_late_fini - GOYA late tear-down code
7648c2ecf20Sopenharmony_ci *
7658c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
7668c2ecf20Sopenharmony_ci *
7678c2ecf20Sopenharmony_ci * Free sensors allocated structures
7688c2ecf20Sopenharmony_ci */
7698c2ecf20Sopenharmony_civoid goya_late_fini(struct hl_device *hdev)
7708c2ecf20Sopenharmony_ci{
7718c2ecf20Sopenharmony_ci	const struct hwmon_channel_info **channel_info_arr;
7728c2ecf20Sopenharmony_ci	int i = 0;
7738c2ecf20Sopenharmony_ci
7748c2ecf20Sopenharmony_ci	if (!hdev->hl_chip_info->info)
7758c2ecf20Sopenharmony_ci		return;
7768c2ecf20Sopenharmony_ci
7778c2ecf20Sopenharmony_ci	channel_info_arr = hdev->hl_chip_info->info;
7788c2ecf20Sopenharmony_ci
7798c2ecf20Sopenharmony_ci	while (channel_info_arr[i]) {
7808c2ecf20Sopenharmony_ci		kfree(channel_info_arr[i]->config);
7818c2ecf20Sopenharmony_ci		kfree(channel_info_arr[i]);
7828c2ecf20Sopenharmony_ci		i++;
7838c2ecf20Sopenharmony_ci	}
7848c2ecf20Sopenharmony_ci
7858c2ecf20Sopenharmony_ci	kfree(channel_info_arr);
7868c2ecf20Sopenharmony_ci
7878c2ecf20Sopenharmony_ci	hdev->hl_chip_info->info = NULL;
7888c2ecf20Sopenharmony_ci}
7898c2ecf20Sopenharmony_ci
7908c2ecf20Sopenharmony_ci/*
7918c2ecf20Sopenharmony_ci * goya_sw_init - Goya software initialization code
7928c2ecf20Sopenharmony_ci *
7938c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
7948c2ecf20Sopenharmony_ci *
7958c2ecf20Sopenharmony_ci */
7968c2ecf20Sopenharmony_cistatic int goya_sw_init(struct hl_device *hdev)
7978c2ecf20Sopenharmony_ci{
7988c2ecf20Sopenharmony_ci	struct goya_device *goya;
7998c2ecf20Sopenharmony_ci	int rc;
8008c2ecf20Sopenharmony_ci
8018c2ecf20Sopenharmony_ci	/* Allocate device structure */
8028c2ecf20Sopenharmony_ci	goya = kzalloc(sizeof(*goya), GFP_KERNEL);
8038c2ecf20Sopenharmony_ci	if (!goya)
8048c2ecf20Sopenharmony_ci		return -ENOMEM;
8058c2ecf20Sopenharmony_ci
8068c2ecf20Sopenharmony_ci	/* according to goya_init_iatu */
8078c2ecf20Sopenharmony_ci	goya->ddr_bar_cur_addr = DRAM_PHYS_BASE;
8088c2ecf20Sopenharmony_ci
8098c2ecf20Sopenharmony_ci	goya->mme_clk = GOYA_PLL_FREQ_LOW;
8108c2ecf20Sopenharmony_ci	goya->tpc_clk = GOYA_PLL_FREQ_LOW;
8118c2ecf20Sopenharmony_ci	goya->ic_clk = GOYA_PLL_FREQ_LOW;
8128c2ecf20Sopenharmony_ci
8138c2ecf20Sopenharmony_ci	hdev->asic_specific = goya;
8148c2ecf20Sopenharmony_ci
8158c2ecf20Sopenharmony_ci	/* Create DMA pool for small allocations */
8168c2ecf20Sopenharmony_ci	hdev->dma_pool = dma_pool_create(dev_name(hdev->dev),
8178c2ecf20Sopenharmony_ci			&hdev->pdev->dev, GOYA_DMA_POOL_BLK_SIZE, 8, 0);
8188c2ecf20Sopenharmony_ci	if (!hdev->dma_pool) {
8198c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to create DMA pool\n");
8208c2ecf20Sopenharmony_ci		rc = -ENOMEM;
8218c2ecf20Sopenharmony_ci		goto free_goya_device;
8228c2ecf20Sopenharmony_ci	}
8238c2ecf20Sopenharmony_ci
8248c2ecf20Sopenharmony_ci	hdev->cpu_accessible_dma_mem =
8258c2ecf20Sopenharmony_ci			hdev->asic_funcs->asic_dma_alloc_coherent(hdev,
8268c2ecf20Sopenharmony_ci					HL_CPU_ACCESSIBLE_MEM_SIZE,
8278c2ecf20Sopenharmony_ci					&hdev->cpu_accessible_dma_address,
8288c2ecf20Sopenharmony_ci					GFP_KERNEL | __GFP_ZERO);
8298c2ecf20Sopenharmony_ci
8308c2ecf20Sopenharmony_ci	if (!hdev->cpu_accessible_dma_mem) {
8318c2ecf20Sopenharmony_ci		rc = -ENOMEM;
8328c2ecf20Sopenharmony_ci		goto free_dma_pool;
8338c2ecf20Sopenharmony_ci	}
8348c2ecf20Sopenharmony_ci
8358c2ecf20Sopenharmony_ci	dev_dbg(hdev->dev, "cpu accessible memory at bus address %pad\n",
8368c2ecf20Sopenharmony_ci		&hdev->cpu_accessible_dma_address);
8378c2ecf20Sopenharmony_ci
8388c2ecf20Sopenharmony_ci	hdev->cpu_accessible_dma_pool = gen_pool_create(ilog2(32), -1);
8398c2ecf20Sopenharmony_ci	if (!hdev->cpu_accessible_dma_pool) {
8408c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
8418c2ecf20Sopenharmony_ci			"Failed to create CPU accessible DMA pool\n");
8428c2ecf20Sopenharmony_ci		rc = -ENOMEM;
8438c2ecf20Sopenharmony_ci		goto free_cpu_dma_mem;
8448c2ecf20Sopenharmony_ci	}
8458c2ecf20Sopenharmony_ci
8468c2ecf20Sopenharmony_ci	rc = gen_pool_add(hdev->cpu_accessible_dma_pool,
8478c2ecf20Sopenharmony_ci				(uintptr_t) hdev->cpu_accessible_dma_mem,
8488c2ecf20Sopenharmony_ci				HL_CPU_ACCESSIBLE_MEM_SIZE, -1);
8498c2ecf20Sopenharmony_ci	if (rc) {
8508c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
8518c2ecf20Sopenharmony_ci			"Failed to add memory to CPU accessible DMA pool\n");
8528c2ecf20Sopenharmony_ci		rc = -EFAULT;
8538c2ecf20Sopenharmony_ci		goto free_cpu_accessible_dma_pool;
8548c2ecf20Sopenharmony_ci	}
8558c2ecf20Sopenharmony_ci
8568c2ecf20Sopenharmony_ci	spin_lock_init(&goya->hw_queues_lock);
8578c2ecf20Sopenharmony_ci	hdev->supports_coresight = true;
8588c2ecf20Sopenharmony_ci	hdev->supports_soft_reset = true;
8598c2ecf20Sopenharmony_ci
8608c2ecf20Sopenharmony_ci	return 0;
8618c2ecf20Sopenharmony_ci
8628c2ecf20Sopenharmony_cifree_cpu_accessible_dma_pool:
8638c2ecf20Sopenharmony_ci	gen_pool_destroy(hdev->cpu_accessible_dma_pool);
8648c2ecf20Sopenharmony_cifree_cpu_dma_mem:
8658c2ecf20Sopenharmony_ci	hdev->asic_funcs->asic_dma_free_coherent(hdev,
8668c2ecf20Sopenharmony_ci			HL_CPU_ACCESSIBLE_MEM_SIZE,
8678c2ecf20Sopenharmony_ci			hdev->cpu_accessible_dma_mem,
8688c2ecf20Sopenharmony_ci			hdev->cpu_accessible_dma_address);
8698c2ecf20Sopenharmony_cifree_dma_pool:
8708c2ecf20Sopenharmony_ci	dma_pool_destroy(hdev->dma_pool);
8718c2ecf20Sopenharmony_cifree_goya_device:
8728c2ecf20Sopenharmony_ci	kfree(goya);
8738c2ecf20Sopenharmony_ci
8748c2ecf20Sopenharmony_ci	return rc;
8758c2ecf20Sopenharmony_ci}
8768c2ecf20Sopenharmony_ci
8778c2ecf20Sopenharmony_ci/*
8788c2ecf20Sopenharmony_ci * goya_sw_fini - Goya software tear-down code
8798c2ecf20Sopenharmony_ci *
8808c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
8818c2ecf20Sopenharmony_ci *
8828c2ecf20Sopenharmony_ci */
8838c2ecf20Sopenharmony_cistatic int goya_sw_fini(struct hl_device *hdev)
8848c2ecf20Sopenharmony_ci{
8858c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
8868c2ecf20Sopenharmony_ci
8878c2ecf20Sopenharmony_ci	gen_pool_destroy(hdev->cpu_accessible_dma_pool);
8888c2ecf20Sopenharmony_ci
8898c2ecf20Sopenharmony_ci	hdev->asic_funcs->asic_dma_free_coherent(hdev,
8908c2ecf20Sopenharmony_ci			HL_CPU_ACCESSIBLE_MEM_SIZE,
8918c2ecf20Sopenharmony_ci			hdev->cpu_accessible_dma_mem,
8928c2ecf20Sopenharmony_ci			hdev->cpu_accessible_dma_address);
8938c2ecf20Sopenharmony_ci
8948c2ecf20Sopenharmony_ci	dma_pool_destroy(hdev->dma_pool);
8958c2ecf20Sopenharmony_ci
8968c2ecf20Sopenharmony_ci	kfree(goya);
8978c2ecf20Sopenharmony_ci
8988c2ecf20Sopenharmony_ci	return 0;
8998c2ecf20Sopenharmony_ci}
9008c2ecf20Sopenharmony_ci
9018c2ecf20Sopenharmony_cistatic void goya_init_dma_qman(struct hl_device *hdev, int dma_id,
9028c2ecf20Sopenharmony_ci		dma_addr_t bus_address)
9038c2ecf20Sopenharmony_ci{
9048c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
9058c2ecf20Sopenharmony_ci	u32 mtr_base_lo, mtr_base_hi;
9068c2ecf20Sopenharmony_ci	u32 so_base_lo, so_base_hi;
9078c2ecf20Sopenharmony_ci	u32 gic_base_lo, gic_base_hi;
9088c2ecf20Sopenharmony_ci	u32 reg_off = dma_id * (mmDMA_QM_1_PQ_PI - mmDMA_QM_0_PQ_PI);
9098c2ecf20Sopenharmony_ci	u32 dma_err_cfg = QMAN_DMA_ERR_MSG_EN;
9108c2ecf20Sopenharmony_ci
9118c2ecf20Sopenharmony_ci	mtr_base_lo = lower_32_bits(CFG_BASE + mmSYNC_MNGR_MON_PAY_ADDRL_0);
9128c2ecf20Sopenharmony_ci	mtr_base_hi = upper_32_bits(CFG_BASE + mmSYNC_MNGR_MON_PAY_ADDRL_0);
9138c2ecf20Sopenharmony_ci	so_base_lo = lower_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_0);
9148c2ecf20Sopenharmony_ci	so_base_hi = upper_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_0);
9158c2ecf20Sopenharmony_ci
9168c2ecf20Sopenharmony_ci	gic_base_lo =
9178c2ecf20Sopenharmony_ci		lower_32_bits(CFG_BASE + mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR);
9188c2ecf20Sopenharmony_ci	gic_base_hi =
9198c2ecf20Sopenharmony_ci		upper_32_bits(CFG_BASE + mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR);
9208c2ecf20Sopenharmony_ci
9218c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_PQ_BASE_LO + reg_off, lower_32_bits(bus_address));
9228c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_PQ_BASE_HI + reg_off, upper_32_bits(bus_address));
9238c2ecf20Sopenharmony_ci
9248c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_PQ_SIZE + reg_off, ilog2(HL_QUEUE_LENGTH));
9258c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_PQ_PI + reg_off, 0);
9268c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_PQ_CI + reg_off, 0);
9278c2ecf20Sopenharmony_ci
9288c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_CP_MSG_BASE0_ADDR_LO + reg_off, mtr_base_lo);
9298c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_CP_MSG_BASE0_ADDR_HI + reg_off, mtr_base_hi);
9308c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_CP_MSG_BASE1_ADDR_LO + reg_off, so_base_lo);
9318c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_CP_MSG_BASE1_ADDR_HI + reg_off, so_base_hi);
9328c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_GLBL_ERR_ADDR_LO + reg_off, gic_base_lo);
9338c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_GLBL_ERR_ADDR_HI + reg_off, gic_base_hi);
9348c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_GLBL_ERR_WDATA + reg_off,
9358c2ecf20Sopenharmony_ci			GOYA_ASYNC_EVENT_ID_DMA0_QM + dma_id);
9368c2ecf20Sopenharmony_ci
9378c2ecf20Sopenharmony_ci	/* PQ has buffer of 2 cache lines, while CQ has 8 lines */
9388c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_PQ_CFG1 + reg_off, 0x00020002);
9398c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_CQ_CFG1 + reg_off, 0x00080008);
9408c2ecf20Sopenharmony_ci
9418c2ecf20Sopenharmony_ci	if (goya->hw_cap_initialized & HW_CAP_MMU)
9428c2ecf20Sopenharmony_ci		WREG32(mmDMA_QM_0_GLBL_PROT + reg_off, QMAN_DMA_PARTLY_TRUSTED);
9438c2ecf20Sopenharmony_ci	else
9448c2ecf20Sopenharmony_ci		WREG32(mmDMA_QM_0_GLBL_PROT + reg_off, QMAN_DMA_FULLY_TRUSTED);
9458c2ecf20Sopenharmony_ci
9468c2ecf20Sopenharmony_ci	if (hdev->stop_on_err)
9478c2ecf20Sopenharmony_ci		dma_err_cfg |= 1 << DMA_QM_0_GLBL_ERR_CFG_DMA_STOP_ON_ERR_SHIFT;
9488c2ecf20Sopenharmony_ci
9498c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_GLBL_ERR_CFG + reg_off, dma_err_cfg);
9508c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_GLBL_CFG0 + reg_off, QMAN_DMA_ENABLE);
9518c2ecf20Sopenharmony_ci}
9528c2ecf20Sopenharmony_ci
9538c2ecf20Sopenharmony_cistatic void goya_init_dma_ch(struct hl_device *hdev, int dma_id)
9548c2ecf20Sopenharmony_ci{
9558c2ecf20Sopenharmony_ci	u32 gic_base_lo, gic_base_hi;
9568c2ecf20Sopenharmony_ci	u64 sob_addr;
9578c2ecf20Sopenharmony_ci	u32 reg_off = dma_id * (mmDMA_CH_1_CFG1 - mmDMA_CH_0_CFG1);
9588c2ecf20Sopenharmony_ci
9598c2ecf20Sopenharmony_ci	gic_base_lo =
9608c2ecf20Sopenharmony_ci		lower_32_bits(CFG_BASE + mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR);
9618c2ecf20Sopenharmony_ci	gic_base_hi =
9628c2ecf20Sopenharmony_ci		upper_32_bits(CFG_BASE + mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR);
9638c2ecf20Sopenharmony_ci
9648c2ecf20Sopenharmony_ci	WREG32(mmDMA_CH_0_ERRMSG_ADDR_LO + reg_off, gic_base_lo);
9658c2ecf20Sopenharmony_ci	WREG32(mmDMA_CH_0_ERRMSG_ADDR_HI + reg_off, gic_base_hi);
9668c2ecf20Sopenharmony_ci	WREG32(mmDMA_CH_0_ERRMSG_WDATA + reg_off,
9678c2ecf20Sopenharmony_ci			GOYA_ASYNC_EVENT_ID_DMA0_CH + dma_id);
9688c2ecf20Sopenharmony_ci
9698c2ecf20Sopenharmony_ci	if (dma_id)
9708c2ecf20Sopenharmony_ci		sob_addr = CFG_BASE + mmSYNC_MNGR_SOB_OBJ_1000 +
9718c2ecf20Sopenharmony_ci				(dma_id - 1) * 4;
9728c2ecf20Sopenharmony_ci	else
9738c2ecf20Sopenharmony_ci		sob_addr = CFG_BASE + mmSYNC_MNGR_SOB_OBJ_1007;
9748c2ecf20Sopenharmony_ci
9758c2ecf20Sopenharmony_ci	WREG32(mmDMA_CH_0_WR_COMP_ADDR_HI + reg_off, upper_32_bits(sob_addr));
9768c2ecf20Sopenharmony_ci	WREG32(mmDMA_CH_0_WR_COMP_WDATA + reg_off, 0x80000001);
9778c2ecf20Sopenharmony_ci}
9788c2ecf20Sopenharmony_ci
9798c2ecf20Sopenharmony_ci/*
9808c2ecf20Sopenharmony_ci * goya_init_dma_qmans - Initialize QMAN DMA registers
9818c2ecf20Sopenharmony_ci *
9828c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
9838c2ecf20Sopenharmony_ci *
9848c2ecf20Sopenharmony_ci * Initialize the H/W registers of the QMAN DMA channels
9858c2ecf20Sopenharmony_ci *
9868c2ecf20Sopenharmony_ci */
9878c2ecf20Sopenharmony_civoid goya_init_dma_qmans(struct hl_device *hdev)
9888c2ecf20Sopenharmony_ci{
9898c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
9908c2ecf20Sopenharmony_ci	struct hl_hw_queue *q;
9918c2ecf20Sopenharmony_ci	int i;
9928c2ecf20Sopenharmony_ci
9938c2ecf20Sopenharmony_ci	if (goya->hw_cap_initialized & HW_CAP_DMA)
9948c2ecf20Sopenharmony_ci		return;
9958c2ecf20Sopenharmony_ci
9968c2ecf20Sopenharmony_ci	q = &hdev->kernel_queues[0];
9978c2ecf20Sopenharmony_ci
9988c2ecf20Sopenharmony_ci	for (i = 0 ; i < NUMBER_OF_EXT_HW_QUEUES ; i++, q++) {
9998c2ecf20Sopenharmony_ci		q->cq_id = q->msi_vec = i;
10008c2ecf20Sopenharmony_ci		goya_init_dma_qman(hdev, i, q->bus_address);
10018c2ecf20Sopenharmony_ci		goya_init_dma_ch(hdev, i);
10028c2ecf20Sopenharmony_ci	}
10038c2ecf20Sopenharmony_ci
10048c2ecf20Sopenharmony_ci	goya->hw_cap_initialized |= HW_CAP_DMA;
10058c2ecf20Sopenharmony_ci}
10068c2ecf20Sopenharmony_ci
10078c2ecf20Sopenharmony_ci/*
10088c2ecf20Sopenharmony_ci * goya_disable_external_queues - Disable external queues
10098c2ecf20Sopenharmony_ci *
10108c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
10118c2ecf20Sopenharmony_ci *
10128c2ecf20Sopenharmony_ci */
10138c2ecf20Sopenharmony_cistatic void goya_disable_external_queues(struct hl_device *hdev)
10148c2ecf20Sopenharmony_ci{
10158c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
10168c2ecf20Sopenharmony_ci
10178c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_DMA))
10188c2ecf20Sopenharmony_ci		return;
10198c2ecf20Sopenharmony_ci
10208c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_GLBL_CFG0, 0);
10218c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_1_GLBL_CFG0, 0);
10228c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_2_GLBL_CFG0, 0);
10238c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_3_GLBL_CFG0, 0);
10248c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_4_GLBL_CFG0, 0);
10258c2ecf20Sopenharmony_ci}
10268c2ecf20Sopenharmony_ci
10278c2ecf20Sopenharmony_cistatic int goya_stop_queue(struct hl_device *hdev, u32 cfg_reg,
10288c2ecf20Sopenharmony_ci				u32 cp_sts_reg, u32 glbl_sts0_reg)
10298c2ecf20Sopenharmony_ci{
10308c2ecf20Sopenharmony_ci	int rc;
10318c2ecf20Sopenharmony_ci	u32 status;
10328c2ecf20Sopenharmony_ci
10338c2ecf20Sopenharmony_ci	/* use the values of TPC0 as they are all the same*/
10348c2ecf20Sopenharmony_ci
10358c2ecf20Sopenharmony_ci	WREG32(cfg_reg, 1 << TPC0_QM_GLBL_CFG1_CP_STOP_SHIFT);
10368c2ecf20Sopenharmony_ci
10378c2ecf20Sopenharmony_ci	status = RREG32(cp_sts_reg);
10388c2ecf20Sopenharmony_ci	if (status & TPC0_QM_CP_STS_FENCE_IN_PROGRESS_MASK) {
10398c2ecf20Sopenharmony_ci		rc = hl_poll_timeout(
10408c2ecf20Sopenharmony_ci			hdev,
10418c2ecf20Sopenharmony_ci			cp_sts_reg,
10428c2ecf20Sopenharmony_ci			status,
10438c2ecf20Sopenharmony_ci			!(status & TPC0_QM_CP_STS_FENCE_IN_PROGRESS_MASK),
10448c2ecf20Sopenharmony_ci			1000,
10458c2ecf20Sopenharmony_ci			QMAN_FENCE_TIMEOUT_USEC);
10468c2ecf20Sopenharmony_ci
10478c2ecf20Sopenharmony_ci		/* if QMAN is stuck in fence no need to check for stop */
10488c2ecf20Sopenharmony_ci		if (rc)
10498c2ecf20Sopenharmony_ci			return 0;
10508c2ecf20Sopenharmony_ci	}
10518c2ecf20Sopenharmony_ci
10528c2ecf20Sopenharmony_ci	rc = hl_poll_timeout(
10538c2ecf20Sopenharmony_ci		hdev,
10548c2ecf20Sopenharmony_ci		glbl_sts0_reg,
10558c2ecf20Sopenharmony_ci		status,
10568c2ecf20Sopenharmony_ci		(status & TPC0_QM_GLBL_STS0_CP_IS_STOP_MASK),
10578c2ecf20Sopenharmony_ci		1000,
10588c2ecf20Sopenharmony_ci		QMAN_STOP_TIMEOUT_USEC);
10598c2ecf20Sopenharmony_ci
10608c2ecf20Sopenharmony_ci	if (rc) {
10618c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
10628c2ecf20Sopenharmony_ci			"Timeout while waiting for QMAN to stop\n");
10638c2ecf20Sopenharmony_ci		return -EINVAL;
10648c2ecf20Sopenharmony_ci	}
10658c2ecf20Sopenharmony_ci
10668c2ecf20Sopenharmony_ci	return 0;
10678c2ecf20Sopenharmony_ci}
10688c2ecf20Sopenharmony_ci
10698c2ecf20Sopenharmony_ci/*
10708c2ecf20Sopenharmony_ci * goya_stop_external_queues - Stop external queues
10718c2ecf20Sopenharmony_ci *
10728c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
10738c2ecf20Sopenharmony_ci *
10748c2ecf20Sopenharmony_ci * Returns 0 on success
10758c2ecf20Sopenharmony_ci *
10768c2ecf20Sopenharmony_ci */
10778c2ecf20Sopenharmony_cistatic int goya_stop_external_queues(struct hl_device *hdev)
10788c2ecf20Sopenharmony_ci{
10798c2ecf20Sopenharmony_ci	int rc, retval = 0;
10808c2ecf20Sopenharmony_ci
10818c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
10828c2ecf20Sopenharmony_ci
10838c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_DMA))
10848c2ecf20Sopenharmony_ci		return retval;
10858c2ecf20Sopenharmony_ci
10868c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
10878c2ecf20Sopenharmony_ci			mmDMA_QM_0_GLBL_CFG1,
10888c2ecf20Sopenharmony_ci			mmDMA_QM_0_CP_STS,
10898c2ecf20Sopenharmony_ci			mmDMA_QM_0_GLBL_STS0);
10908c2ecf20Sopenharmony_ci
10918c2ecf20Sopenharmony_ci	if (rc) {
10928c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop DMA QMAN 0\n");
10938c2ecf20Sopenharmony_ci		retval = -EIO;
10948c2ecf20Sopenharmony_ci	}
10958c2ecf20Sopenharmony_ci
10968c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
10978c2ecf20Sopenharmony_ci			mmDMA_QM_1_GLBL_CFG1,
10988c2ecf20Sopenharmony_ci			mmDMA_QM_1_CP_STS,
10998c2ecf20Sopenharmony_ci			mmDMA_QM_1_GLBL_STS0);
11008c2ecf20Sopenharmony_ci
11018c2ecf20Sopenharmony_ci	if (rc) {
11028c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop DMA QMAN 1\n");
11038c2ecf20Sopenharmony_ci		retval = -EIO;
11048c2ecf20Sopenharmony_ci	}
11058c2ecf20Sopenharmony_ci
11068c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
11078c2ecf20Sopenharmony_ci			mmDMA_QM_2_GLBL_CFG1,
11088c2ecf20Sopenharmony_ci			mmDMA_QM_2_CP_STS,
11098c2ecf20Sopenharmony_ci			mmDMA_QM_2_GLBL_STS0);
11108c2ecf20Sopenharmony_ci
11118c2ecf20Sopenharmony_ci	if (rc) {
11128c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop DMA QMAN 2\n");
11138c2ecf20Sopenharmony_ci		retval = -EIO;
11148c2ecf20Sopenharmony_ci	}
11158c2ecf20Sopenharmony_ci
11168c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
11178c2ecf20Sopenharmony_ci			mmDMA_QM_3_GLBL_CFG1,
11188c2ecf20Sopenharmony_ci			mmDMA_QM_3_CP_STS,
11198c2ecf20Sopenharmony_ci			mmDMA_QM_3_GLBL_STS0);
11208c2ecf20Sopenharmony_ci
11218c2ecf20Sopenharmony_ci	if (rc) {
11228c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop DMA QMAN 3\n");
11238c2ecf20Sopenharmony_ci		retval = -EIO;
11248c2ecf20Sopenharmony_ci	}
11258c2ecf20Sopenharmony_ci
11268c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
11278c2ecf20Sopenharmony_ci			mmDMA_QM_4_GLBL_CFG1,
11288c2ecf20Sopenharmony_ci			mmDMA_QM_4_CP_STS,
11298c2ecf20Sopenharmony_ci			mmDMA_QM_4_GLBL_STS0);
11308c2ecf20Sopenharmony_ci
11318c2ecf20Sopenharmony_ci	if (rc) {
11328c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop DMA QMAN 4\n");
11338c2ecf20Sopenharmony_ci		retval = -EIO;
11348c2ecf20Sopenharmony_ci	}
11358c2ecf20Sopenharmony_ci
11368c2ecf20Sopenharmony_ci	return retval;
11378c2ecf20Sopenharmony_ci}
11388c2ecf20Sopenharmony_ci
11398c2ecf20Sopenharmony_ci/*
11408c2ecf20Sopenharmony_ci * goya_init_cpu_queues - Initialize PQ/CQ/EQ of CPU
11418c2ecf20Sopenharmony_ci *
11428c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
11438c2ecf20Sopenharmony_ci *
11448c2ecf20Sopenharmony_ci * Returns 0 on success
11458c2ecf20Sopenharmony_ci *
11468c2ecf20Sopenharmony_ci */
11478c2ecf20Sopenharmony_ciint goya_init_cpu_queues(struct hl_device *hdev)
11488c2ecf20Sopenharmony_ci{
11498c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
11508c2ecf20Sopenharmony_ci	struct hl_eq *eq;
11518c2ecf20Sopenharmony_ci	u32 status;
11528c2ecf20Sopenharmony_ci	struct hl_hw_queue *cpu_pq = &hdev->kernel_queues[GOYA_QUEUE_ID_CPU_PQ];
11538c2ecf20Sopenharmony_ci	int err;
11548c2ecf20Sopenharmony_ci
11558c2ecf20Sopenharmony_ci	if (!hdev->cpu_queues_enable)
11568c2ecf20Sopenharmony_ci		return 0;
11578c2ecf20Sopenharmony_ci
11588c2ecf20Sopenharmony_ci	if (goya->hw_cap_initialized & HW_CAP_CPU_Q)
11598c2ecf20Sopenharmony_ci		return 0;
11608c2ecf20Sopenharmony_ci
11618c2ecf20Sopenharmony_ci	eq = &hdev->event_queue;
11628c2ecf20Sopenharmony_ci
11638c2ecf20Sopenharmony_ci	WREG32(mmCPU_PQ_BASE_ADDR_LOW, lower_32_bits(cpu_pq->bus_address));
11648c2ecf20Sopenharmony_ci	WREG32(mmCPU_PQ_BASE_ADDR_HIGH, upper_32_bits(cpu_pq->bus_address));
11658c2ecf20Sopenharmony_ci
11668c2ecf20Sopenharmony_ci	WREG32(mmCPU_EQ_BASE_ADDR_LOW, lower_32_bits(eq->bus_address));
11678c2ecf20Sopenharmony_ci	WREG32(mmCPU_EQ_BASE_ADDR_HIGH, upper_32_bits(eq->bus_address));
11688c2ecf20Sopenharmony_ci
11698c2ecf20Sopenharmony_ci	WREG32(mmCPU_CQ_BASE_ADDR_LOW,
11708c2ecf20Sopenharmony_ci			lower_32_bits(VA_CPU_ACCESSIBLE_MEM_ADDR));
11718c2ecf20Sopenharmony_ci	WREG32(mmCPU_CQ_BASE_ADDR_HIGH,
11728c2ecf20Sopenharmony_ci			upper_32_bits(VA_CPU_ACCESSIBLE_MEM_ADDR));
11738c2ecf20Sopenharmony_ci
11748c2ecf20Sopenharmony_ci	WREG32(mmCPU_PQ_LENGTH, HL_QUEUE_SIZE_IN_BYTES);
11758c2ecf20Sopenharmony_ci	WREG32(mmCPU_EQ_LENGTH, HL_EQ_SIZE_IN_BYTES);
11768c2ecf20Sopenharmony_ci	WREG32(mmCPU_CQ_LENGTH, HL_CPU_ACCESSIBLE_MEM_SIZE);
11778c2ecf20Sopenharmony_ci
11788c2ecf20Sopenharmony_ci	/* Used for EQ CI */
11798c2ecf20Sopenharmony_ci	WREG32(mmCPU_EQ_CI, 0);
11808c2ecf20Sopenharmony_ci
11818c2ecf20Sopenharmony_ci	WREG32(mmCPU_IF_PF_PQ_PI, 0);
11828c2ecf20Sopenharmony_ci
11838c2ecf20Sopenharmony_ci	WREG32(mmCPU_PQ_INIT_STATUS, PQ_INIT_STATUS_READY_FOR_CP);
11848c2ecf20Sopenharmony_ci
11858c2ecf20Sopenharmony_ci	WREG32(mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR,
11868c2ecf20Sopenharmony_ci			GOYA_ASYNC_EVENT_ID_PI_UPDATE);
11878c2ecf20Sopenharmony_ci
11888c2ecf20Sopenharmony_ci	err = hl_poll_timeout(
11898c2ecf20Sopenharmony_ci		hdev,
11908c2ecf20Sopenharmony_ci		mmCPU_PQ_INIT_STATUS,
11918c2ecf20Sopenharmony_ci		status,
11928c2ecf20Sopenharmony_ci		(status == PQ_INIT_STATUS_READY_FOR_HOST),
11938c2ecf20Sopenharmony_ci		1000,
11948c2ecf20Sopenharmony_ci		GOYA_CPU_TIMEOUT_USEC);
11958c2ecf20Sopenharmony_ci
11968c2ecf20Sopenharmony_ci	if (err) {
11978c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
11988c2ecf20Sopenharmony_ci			"Failed to setup communication with device CPU\n");
11998c2ecf20Sopenharmony_ci		return -EIO;
12008c2ecf20Sopenharmony_ci	}
12018c2ecf20Sopenharmony_ci
12028c2ecf20Sopenharmony_ci	goya->hw_cap_initialized |= HW_CAP_CPU_Q;
12038c2ecf20Sopenharmony_ci	return 0;
12048c2ecf20Sopenharmony_ci}
12058c2ecf20Sopenharmony_ci
12068c2ecf20Sopenharmony_cistatic void goya_set_pll_refclk(struct hl_device *hdev)
12078c2ecf20Sopenharmony_ci{
12088c2ecf20Sopenharmony_ci	WREG32(mmCPU_PLL_DIV_SEL_0, 0x0);
12098c2ecf20Sopenharmony_ci	WREG32(mmCPU_PLL_DIV_SEL_1, 0x0);
12108c2ecf20Sopenharmony_ci	WREG32(mmCPU_PLL_DIV_SEL_2, 0x0);
12118c2ecf20Sopenharmony_ci	WREG32(mmCPU_PLL_DIV_SEL_3, 0x0);
12128c2ecf20Sopenharmony_ci
12138c2ecf20Sopenharmony_ci	WREG32(mmIC_PLL_DIV_SEL_0, 0x0);
12148c2ecf20Sopenharmony_ci	WREG32(mmIC_PLL_DIV_SEL_1, 0x0);
12158c2ecf20Sopenharmony_ci	WREG32(mmIC_PLL_DIV_SEL_2, 0x0);
12168c2ecf20Sopenharmony_ci	WREG32(mmIC_PLL_DIV_SEL_3, 0x0);
12178c2ecf20Sopenharmony_ci
12188c2ecf20Sopenharmony_ci	WREG32(mmMC_PLL_DIV_SEL_0, 0x0);
12198c2ecf20Sopenharmony_ci	WREG32(mmMC_PLL_DIV_SEL_1, 0x0);
12208c2ecf20Sopenharmony_ci	WREG32(mmMC_PLL_DIV_SEL_2, 0x0);
12218c2ecf20Sopenharmony_ci	WREG32(mmMC_PLL_DIV_SEL_3, 0x0);
12228c2ecf20Sopenharmony_ci
12238c2ecf20Sopenharmony_ci	WREG32(mmPSOC_MME_PLL_DIV_SEL_0, 0x0);
12248c2ecf20Sopenharmony_ci	WREG32(mmPSOC_MME_PLL_DIV_SEL_1, 0x0);
12258c2ecf20Sopenharmony_ci	WREG32(mmPSOC_MME_PLL_DIV_SEL_2, 0x0);
12268c2ecf20Sopenharmony_ci	WREG32(mmPSOC_MME_PLL_DIV_SEL_3, 0x0);
12278c2ecf20Sopenharmony_ci
12288c2ecf20Sopenharmony_ci	WREG32(mmPSOC_PCI_PLL_DIV_SEL_0, 0x0);
12298c2ecf20Sopenharmony_ci	WREG32(mmPSOC_PCI_PLL_DIV_SEL_1, 0x0);
12308c2ecf20Sopenharmony_ci	WREG32(mmPSOC_PCI_PLL_DIV_SEL_2, 0x0);
12318c2ecf20Sopenharmony_ci	WREG32(mmPSOC_PCI_PLL_DIV_SEL_3, 0x0);
12328c2ecf20Sopenharmony_ci
12338c2ecf20Sopenharmony_ci	WREG32(mmPSOC_EMMC_PLL_DIV_SEL_0, 0x0);
12348c2ecf20Sopenharmony_ci	WREG32(mmPSOC_EMMC_PLL_DIV_SEL_1, 0x0);
12358c2ecf20Sopenharmony_ci	WREG32(mmPSOC_EMMC_PLL_DIV_SEL_2, 0x0);
12368c2ecf20Sopenharmony_ci	WREG32(mmPSOC_EMMC_PLL_DIV_SEL_3, 0x0);
12378c2ecf20Sopenharmony_ci
12388c2ecf20Sopenharmony_ci	WREG32(mmTPC_PLL_DIV_SEL_0, 0x0);
12398c2ecf20Sopenharmony_ci	WREG32(mmTPC_PLL_DIV_SEL_1, 0x0);
12408c2ecf20Sopenharmony_ci	WREG32(mmTPC_PLL_DIV_SEL_2, 0x0);
12418c2ecf20Sopenharmony_ci	WREG32(mmTPC_PLL_DIV_SEL_3, 0x0);
12428c2ecf20Sopenharmony_ci}
12438c2ecf20Sopenharmony_ci
12448c2ecf20Sopenharmony_cistatic void goya_disable_clk_rlx(struct hl_device *hdev)
12458c2ecf20Sopenharmony_ci{
12468c2ecf20Sopenharmony_ci	WREG32(mmPSOC_MME_PLL_CLK_RLX_0, 0x100010);
12478c2ecf20Sopenharmony_ci	WREG32(mmIC_PLL_CLK_RLX_0, 0x100010);
12488c2ecf20Sopenharmony_ci}
12498c2ecf20Sopenharmony_ci
12508c2ecf20Sopenharmony_cistatic void _goya_tpc_mbist_workaround(struct hl_device *hdev, u8 tpc_id)
12518c2ecf20Sopenharmony_ci{
12528c2ecf20Sopenharmony_ci	u64 tpc_eml_address;
12538c2ecf20Sopenharmony_ci	u32 val, tpc_offset, tpc_eml_offset, tpc_slm_offset;
12548c2ecf20Sopenharmony_ci	int err, slm_index;
12558c2ecf20Sopenharmony_ci
12568c2ecf20Sopenharmony_ci	tpc_offset = tpc_id * 0x40000;
12578c2ecf20Sopenharmony_ci	tpc_eml_offset = tpc_id * 0x200000;
12588c2ecf20Sopenharmony_ci	tpc_eml_address = (mmTPC0_EML_CFG_BASE + tpc_eml_offset - CFG_BASE);
12598c2ecf20Sopenharmony_ci	tpc_slm_offset = tpc_eml_address + 0x100000;
12608c2ecf20Sopenharmony_ci
12618c2ecf20Sopenharmony_ci	/*
12628c2ecf20Sopenharmony_ci	 * Workaround for Bug H2 #2443 :
12638c2ecf20Sopenharmony_ci	 * "TPC SB is not initialized on chip reset"
12648c2ecf20Sopenharmony_ci	 */
12658c2ecf20Sopenharmony_ci
12668c2ecf20Sopenharmony_ci	val = RREG32(mmTPC0_CFG_FUNC_MBIST_CNTRL + tpc_offset);
12678c2ecf20Sopenharmony_ci	if (val & TPC0_CFG_FUNC_MBIST_CNTRL_MBIST_ACTIVE_MASK)
12688c2ecf20Sopenharmony_ci		dev_warn(hdev->dev, "TPC%d MBIST ACTIVE is not cleared\n",
12698c2ecf20Sopenharmony_ci			tpc_id);
12708c2ecf20Sopenharmony_ci
12718c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CFG_FUNC_MBIST_PAT + tpc_offset, val & 0xFFFFF000);
12728c2ecf20Sopenharmony_ci
12738c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CFG_FUNC_MBIST_MEM_0 + tpc_offset, 0x37FF);
12748c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CFG_FUNC_MBIST_MEM_1 + tpc_offset, 0x303F);
12758c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CFG_FUNC_MBIST_MEM_2 + tpc_offset, 0x71FF);
12768c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CFG_FUNC_MBIST_MEM_3 + tpc_offset, 0x71FF);
12778c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CFG_FUNC_MBIST_MEM_4 + tpc_offset, 0x70FF);
12788c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CFG_FUNC_MBIST_MEM_5 + tpc_offset, 0x70FF);
12798c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CFG_FUNC_MBIST_MEM_6 + tpc_offset, 0x70FF);
12808c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CFG_FUNC_MBIST_MEM_7 + tpc_offset, 0x70FF);
12818c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CFG_FUNC_MBIST_MEM_8 + tpc_offset, 0x70FF);
12828c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CFG_FUNC_MBIST_MEM_9 + tpc_offset, 0x70FF);
12838c2ecf20Sopenharmony_ci
12848c2ecf20Sopenharmony_ci	WREG32_OR(mmTPC0_CFG_FUNC_MBIST_CNTRL + tpc_offset,
12858c2ecf20Sopenharmony_ci		1 << TPC0_CFG_FUNC_MBIST_CNTRL_MBIST_START_SHIFT);
12868c2ecf20Sopenharmony_ci
12878c2ecf20Sopenharmony_ci	err = hl_poll_timeout(
12888c2ecf20Sopenharmony_ci		hdev,
12898c2ecf20Sopenharmony_ci		mmTPC0_CFG_FUNC_MBIST_CNTRL + tpc_offset,
12908c2ecf20Sopenharmony_ci		val,
12918c2ecf20Sopenharmony_ci		(val & TPC0_CFG_FUNC_MBIST_CNTRL_MBIST_DONE_MASK),
12928c2ecf20Sopenharmony_ci		1000,
12938c2ecf20Sopenharmony_ci		HL_DEVICE_TIMEOUT_USEC);
12948c2ecf20Sopenharmony_ci
12958c2ecf20Sopenharmony_ci	if (err)
12968c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
12978c2ecf20Sopenharmony_ci			"Timeout while waiting for TPC%d MBIST DONE\n", tpc_id);
12988c2ecf20Sopenharmony_ci
12998c2ecf20Sopenharmony_ci	WREG32_OR(mmTPC0_EML_CFG_DBG_CNT + tpc_eml_offset,
13008c2ecf20Sopenharmony_ci		1 << TPC0_EML_CFG_DBG_CNT_CORE_RST_SHIFT);
13018c2ecf20Sopenharmony_ci
13028c2ecf20Sopenharmony_ci	msleep(GOYA_RESET_WAIT_MSEC);
13038c2ecf20Sopenharmony_ci
13048c2ecf20Sopenharmony_ci	WREG32_AND(mmTPC0_EML_CFG_DBG_CNT + tpc_eml_offset,
13058c2ecf20Sopenharmony_ci		~(1 << TPC0_EML_CFG_DBG_CNT_CORE_RST_SHIFT));
13068c2ecf20Sopenharmony_ci
13078c2ecf20Sopenharmony_ci	msleep(GOYA_RESET_WAIT_MSEC);
13088c2ecf20Sopenharmony_ci
13098c2ecf20Sopenharmony_ci	for (slm_index = 0 ; slm_index < 256 ; slm_index++)
13108c2ecf20Sopenharmony_ci		WREG32(tpc_slm_offset + (slm_index << 2), 0);
13118c2ecf20Sopenharmony_ci
13128c2ecf20Sopenharmony_ci	val = RREG32(tpc_slm_offset);
13138c2ecf20Sopenharmony_ci}
13148c2ecf20Sopenharmony_ci
13158c2ecf20Sopenharmony_cistatic void goya_tpc_mbist_workaround(struct hl_device *hdev)
13168c2ecf20Sopenharmony_ci{
13178c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
13188c2ecf20Sopenharmony_ci	int i;
13198c2ecf20Sopenharmony_ci
13208c2ecf20Sopenharmony_ci	if (hdev->pldm)
13218c2ecf20Sopenharmony_ci		return;
13228c2ecf20Sopenharmony_ci
13238c2ecf20Sopenharmony_ci	if (goya->hw_cap_initialized & HW_CAP_TPC_MBIST)
13248c2ecf20Sopenharmony_ci		return;
13258c2ecf20Sopenharmony_ci
13268c2ecf20Sopenharmony_ci	/* Workaround for H2 #2443 */
13278c2ecf20Sopenharmony_ci
13288c2ecf20Sopenharmony_ci	for (i = 0 ; i < TPC_MAX_NUM ; i++)
13298c2ecf20Sopenharmony_ci		_goya_tpc_mbist_workaround(hdev, i);
13308c2ecf20Sopenharmony_ci
13318c2ecf20Sopenharmony_ci	goya->hw_cap_initialized |= HW_CAP_TPC_MBIST;
13328c2ecf20Sopenharmony_ci}
13338c2ecf20Sopenharmony_ci
13348c2ecf20Sopenharmony_ci/*
13358c2ecf20Sopenharmony_ci * goya_init_golden_registers - Initialize golden registers
13368c2ecf20Sopenharmony_ci *
13378c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
13388c2ecf20Sopenharmony_ci *
13398c2ecf20Sopenharmony_ci * Initialize the H/W registers of the device
13408c2ecf20Sopenharmony_ci *
13418c2ecf20Sopenharmony_ci */
13428c2ecf20Sopenharmony_cistatic void goya_init_golden_registers(struct hl_device *hdev)
13438c2ecf20Sopenharmony_ci{
13448c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
13458c2ecf20Sopenharmony_ci	u32 polynom[10], tpc_intr_mask, offset;
13468c2ecf20Sopenharmony_ci	int i;
13478c2ecf20Sopenharmony_ci
13488c2ecf20Sopenharmony_ci	if (goya->hw_cap_initialized & HW_CAP_GOLDEN)
13498c2ecf20Sopenharmony_ci		return;
13508c2ecf20Sopenharmony_ci
13518c2ecf20Sopenharmony_ci	polynom[0] = 0x00020080;
13528c2ecf20Sopenharmony_ci	polynom[1] = 0x00401000;
13538c2ecf20Sopenharmony_ci	polynom[2] = 0x00200800;
13548c2ecf20Sopenharmony_ci	polynom[3] = 0x00002000;
13558c2ecf20Sopenharmony_ci	polynom[4] = 0x00080200;
13568c2ecf20Sopenharmony_ci	polynom[5] = 0x00040100;
13578c2ecf20Sopenharmony_ci	polynom[6] = 0x00100400;
13588c2ecf20Sopenharmony_ci	polynom[7] = 0x00004000;
13598c2ecf20Sopenharmony_ci	polynom[8] = 0x00010000;
13608c2ecf20Sopenharmony_ci	polynom[9] = 0x00008000;
13618c2ecf20Sopenharmony_ci
13628c2ecf20Sopenharmony_ci	/* Mask all arithmetic interrupts from TPC */
13638c2ecf20Sopenharmony_ci	tpc_intr_mask = 0x7FFF;
13648c2ecf20Sopenharmony_ci
13658c2ecf20Sopenharmony_ci	for (i = 0, offset = 0 ; i < 6 ; i++, offset += 0x20000) {
13668c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X0_RTR_HBW_RD_RQ_L_ARB + offset, 0x302);
13678c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X1_RTR_HBW_RD_RQ_L_ARB + offset, 0x302);
13688c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X2_RTR_HBW_RD_RQ_L_ARB + offset, 0x302);
13698c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X3_RTR_HBW_RD_RQ_L_ARB + offset, 0x302);
13708c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X4_RTR_HBW_RD_RQ_L_ARB + offset, 0x302);
13718c2ecf20Sopenharmony_ci
13728c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X0_RTR_HBW_DATA_L_ARB + offset, 0x204);
13738c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X1_RTR_HBW_DATA_L_ARB + offset, 0x204);
13748c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X2_RTR_HBW_DATA_L_ARB + offset, 0x204);
13758c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X3_RTR_HBW_DATA_L_ARB + offset, 0x204);
13768c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X4_RTR_HBW_DATA_L_ARB + offset, 0x204);
13778c2ecf20Sopenharmony_ci
13788c2ecf20Sopenharmony_ci
13798c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X0_RTR_HBW_DATA_E_ARB + offset, 0x206);
13808c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X1_RTR_HBW_DATA_E_ARB + offset, 0x206);
13818c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X2_RTR_HBW_DATA_E_ARB + offset, 0x206);
13828c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X3_RTR_HBW_DATA_E_ARB + offset, 0x207);
13838c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X4_RTR_HBW_DATA_E_ARB + offset, 0x207);
13848c2ecf20Sopenharmony_ci
13858c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X0_RTR_HBW_DATA_W_ARB + offset, 0x207);
13868c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X1_RTR_HBW_DATA_W_ARB + offset, 0x207);
13878c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X2_RTR_HBW_DATA_W_ARB + offset, 0x206);
13888c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X3_RTR_HBW_DATA_W_ARB + offset, 0x206);
13898c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X4_RTR_HBW_DATA_W_ARB + offset, 0x206);
13908c2ecf20Sopenharmony_ci
13918c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X0_RTR_HBW_WR_RS_E_ARB + offset, 0x101);
13928c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X1_RTR_HBW_WR_RS_E_ARB + offset, 0x102);
13938c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X2_RTR_HBW_WR_RS_E_ARB + offset, 0x103);
13948c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X3_RTR_HBW_WR_RS_E_ARB + offset, 0x104);
13958c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X4_RTR_HBW_WR_RS_E_ARB + offset, 0x105);
13968c2ecf20Sopenharmony_ci
13978c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X0_RTR_HBW_WR_RS_W_ARB + offset, 0x105);
13988c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X1_RTR_HBW_WR_RS_W_ARB + offset, 0x104);
13998c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X2_RTR_HBW_WR_RS_W_ARB + offset, 0x103);
14008c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X3_RTR_HBW_WR_RS_W_ARB + offset, 0x102);
14018c2ecf20Sopenharmony_ci		WREG32(mmSRAM_Y0_X4_RTR_HBW_WR_RS_W_ARB + offset, 0x101);
14028c2ecf20Sopenharmony_ci	}
14038c2ecf20Sopenharmony_ci
14048c2ecf20Sopenharmony_ci	WREG32(mmMME_STORE_MAX_CREDIT, 0x21);
14058c2ecf20Sopenharmony_ci	WREG32(mmMME_AGU, 0x0f0f0f10);
14068c2ecf20Sopenharmony_ci	WREG32(mmMME_SEI_MASK, ~0x0);
14078c2ecf20Sopenharmony_ci
14088c2ecf20Sopenharmony_ci	WREG32(mmMME6_RTR_HBW_RD_RQ_N_ARB, 0x01010101);
14098c2ecf20Sopenharmony_ci	WREG32(mmMME5_RTR_HBW_RD_RQ_N_ARB, 0x01040101);
14108c2ecf20Sopenharmony_ci	WREG32(mmMME4_RTR_HBW_RD_RQ_N_ARB, 0x01030101);
14118c2ecf20Sopenharmony_ci	WREG32(mmMME3_RTR_HBW_RD_RQ_N_ARB, 0x01020101);
14128c2ecf20Sopenharmony_ci	WREG32(mmMME2_RTR_HBW_RD_RQ_N_ARB, 0x01010101);
14138c2ecf20Sopenharmony_ci	WREG32(mmMME1_RTR_HBW_RD_RQ_N_ARB, 0x07010701);
14148c2ecf20Sopenharmony_ci	WREG32(mmMME6_RTR_HBW_RD_RQ_S_ARB, 0x04010401);
14158c2ecf20Sopenharmony_ci	WREG32(mmMME5_RTR_HBW_RD_RQ_S_ARB, 0x04050401);
14168c2ecf20Sopenharmony_ci	WREG32(mmMME4_RTR_HBW_RD_RQ_S_ARB, 0x03070301);
14178c2ecf20Sopenharmony_ci	WREG32(mmMME3_RTR_HBW_RD_RQ_S_ARB, 0x01030101);
14188c2ecf20Sopenharmony_ci	WREG32(mmMME2_RTR_HBW_RD_RQ_S_ARB, 0x01040101);
14198c2ecf20Sopenharmony_ci	WREG32(mmMME1_RTR_HBW_RD_RQ_S_ARB, 0x01050105);
14208c2ecf20Sopenharmony_ci	WREG32(mmMME6_RTR_HBW_RD_RQ_W_ARB, 0x01010501);
14218c2ecf20Sopenharmony_ci	WREG32(mmMME5_RTR_HBW_RD_RQ_W_ARB, 0x01010501);
14228c2ecf20Sopenharmony_ci	WREG32(mmMME4_RTR_HBW_RD_RQ_W_ARB, 0x01040301);
14238c2ecf20Sopenharmony_ci	WREG32(mmMME3_RTR_HBW_RD_RQ_W_ARB, 0x01030401);
14248c2ecf20Sopenharmony_ci	WREG32(mmMME2_RTR_HBW_RD_RQ_W_ARB, 0x01040101);
14258c2ecf20Sopenharmony_ci	WREG32(mmMME1_RTR_HBW_RD_RQ_W_ARB, 0x01050101);
14268c2ecf20Sopenharmony_ci	WREG32(mmMME6_RTR_HBW_WR_RQ_N_ARB, 0x02020202);
14278c2ecf20Sopenharmony_ci	WREG32(mmMME5_RTR_HBW_WR_RQ_N_ARB, 0x01070101);
14288c2ecf20Sopenharmony_ci	WREG32(mmMME4_RTR_HBW_WR_RQ_N_ARB, 0x02020201);
14298c2ecf20Sopenharmony_ci	WREG32(mmMME3_RTR_HBW_WR_RQ_N_ARB, 0x07020701);
14308c2ecf20Sopenharmony_ci	WREG32(mmMME2_RTR_HBW_WR_RQ_N_ARB, 0x01020101);
14318c2ecf20Sopenharmony_ci	WREG32(mmMME1_RTR_HBW_WR_RQ_S_ARB, 0x01010101);
14328c2ecf20Sopenharmony_ci	WREG32(mmMME6_RTR_HBW_WR_RQ_S_ARB, 0x01070101);
14338c2ecf20Sopenharmony_ci	WREG32(mmMME5_RTR_HBW_WR_RQ_S_ARB, 0x01070101);
14348c2ecf20Sopenharmony_ci	WREG32(mmMME4_RTR_HBW_WR_RQ_S_ARB, 0x07020701);
14358c2ecf20Sopenharmony_ci	WREG32(mmMME3_RTR_HBW_WR_RQ_S_ARB, 0x02020201);
14368c2ecf20Sopenharmony_ci	WREG32(mmMME2_RTR_HBW_WR_RQ_S_ARB, 0x01070101);
14378c2ecf20Sopenharmony_ci	WREG32(mmMME1_RTR_HBW_WR_RQ_S_ARB, 0x01020102);
14388c2ecf20Sopenharmony_ci	WREG32(mmMME6_RTR_HBW_WR_RQ_W_ARB, 0x01020701);
14398c2ecf20Sopenharmony_ci	WREG32(mmMME5_RTR_HBW_WR_RQ_W_ARB, 0x01020701);
14408c2ecf20Sopenharmony_ci	WREG32(mmMME4_RTR_HBW_WR_RQ_W_ARB, 0x07020707);
14418c2ecf20Sopenharmony_ci	WREG32(mmMME3_RTR_HBW_WR_RQ_W_ARB, 0x01020201);
14428c2ecf20Sopenharmony_ci	WREG32(mmMME2_RTR_HBW_WR_RQ_W_ARB, 0x01070201);
14438c2ecf20Sopenharmony_ci	WREG32(mmMME1_RTR_HBW_WR_RQ_W_ARB, 0x01070201);
14448c2ecf20Sopenharmony_ci	WREG32(mmMME6_RTR_HBW_RD_RS_N_ARB, 0x01070102);
14458c2ecf20Sopenharmony_ci	WREG32(mmMME5_RTR_HBW_RD_RS_N_ARB, 0x01070102);
14468c2ecf20Sopenharmony_ci	WREG32(mmMME4_RTR_HBW_RD_RS_N_ARB, 0x01060102);
14478c2ecf20Sopenharmony_ci	WREG32(mmMME3_RTR_HBW_RD_RS_N_ARB, 0x01040102);
14488c2ecf20Sopenharmony_ci	WREG32(mmMME2_RTR_HBW_RD_RS_N_ARB, 0x01020102);
14498c2ecf20Sopenharmony_ci	WREG32(mmMME1_RTR_HBW_RD_RS_N_ARB, 0x01020107);
14508c2ecf20Sopenharmony_ci	WREG32(mmMME6_RTR_HBW_RD_RS_S_ARB, 0x01020106);
14518c2ecf20Sopenharmony_ci	WREG32(mmMME5_RTR_HBW_RD_RS_S_ARB, 0x01020102);
14528c2ecf20Sopenharmony_ci	WREG32(mmMME4_RTR_HBW_RD_RS_S_ARB, 0x01040102);
14538c2ecf20Sopenharmony_ci	WREG32(mmMME3_RTR_HBW_RD_RS_S_ARB, 0x01060102);
14548c2ecf20Sopenharmony_ci	WREG32(mmMME2_RTR_HBW_RD_RS_S_ARB, 0x01070102);
14558c2ecf20Sopenharmony_ci	WREG32(mmMME1_RTR_HBW_RD_RS_S_ARB, 0x01070102);
14568c2ecf20Sopenharmony_ci	WREG32(mmMME6_RTR_HBW_RD_RS_E_ARB, 0x01020702);
14578c2ecf20Sopenharmony_ci	WREG32(mmMME5_RTR_HBW_RD_RS_E_ARB, 0x01020702);
14588c2ecf20Sopenharmony_ci	WREG32(mmMME4_RTR_HBW_RD_RS_E_ARB, 0x01040602);
14598c2ecf20Sopenharmony_ci	WREG32(mmMME3_RTR_HBW_RD_RS_E_ARB, 0x01060402);
14608c2ecf20Sopenharmony_ci	WREG32(mmMME2_RTR_HBW_RD_RS_E_ARB, 0x01070202);
14618c2ecf20Sopenharmony_ci	WREG32(mmMME1_RTR_HBW_RD_RS_E_ARB, 0x01070102);
14628c2ecf20Sopenharmony_ci	WREG32(mmMME6_RTR_HBW_RD_RS_W_ARB, 0x01060401);
14638c2ecf20Sopenharmony_ci	WREG32(mmMME5_RTR_HBW_RD_RS_W_ARB, 0x01060401);
14648c2ecf20Sopenharmony_ci	WREG32(mmMME4_RTR_HBW_RD_RS_W_ARB, 0x01060401);
14658c2ecf20Sopenharmony_ci	WREG32(mmMME3_RTR_HBW_RD_RS_W_ARB, 0x01060401);
14668c2ecf20Sopenharmony_ci	WREG32(mmMME2_RTR_HBW_RD_RS_W_ARB, 0x01060401);
14678c2ecf20Sopenharmony_ci	WREG32(mmMME1_RTR_HBW_RD_RS_W_ARB, 0x01060401);
14688c2ecf20Sopenharmony_ci	WREG32(mmMME6_RTR_HBW_WR_RS_N_ARB, 0x01050101);
14698c2ecf20Sopenharmony_ci	WREG32(mmMME5_RTR_HBW_WR_RS_N_ARB, 0x01040101);
14708c2ecf20Sopenharmony_ci	WREG32(mmMME4_RTR_HBW_WR_RS_N_ARB, 0x01030101);
14718c2ecf20Sopenharmony_ci	WREG32(mmMME3_RTR_HBW_WR_RS_N_ARB, 0x01020101);
14728c2ecf20Sopenharmony_ci	WREG32(mmMME2_RTR_HBW_WR_RS_N_ARB, 0x01010101);
14738c2ecf20Sopenharmony_ci	WREG32(mmMME1_RTR_HBW_WR_RS_N_ARB, 0x01010107);
14748c2ecf20Sopenharmony_ci	WREG32(mmMME6_RTR_HBW_WR_RS_S_ARB, 0x01010107);
14758c2ecf20Sopenharmony_ci	WREG32(mmMME5_RTR_HBW_WR_RS_S_ARB, 0x01010101);
14768c2ecf20Sopenharmony_ci	WREG32(mmMME4_RTR_HBW_WR_RS_S_ARB, 0x01020101);
14778c2ecf20Sopenharmony_ci	WREG32(mmMME3_RTR_HBW_WR_RS_S_ARB, 0x01030101);
14788c2ecf20Sopenharmony_ci	WREG32(mmMME2_RTR_HBW_WR_RS_S_ARB, 0x01040101);
14798c2ecf20Sopenharmony_ci	WREG32(mmMME1_RTR_HBW_WR_RS_S_ARB, 0x01050101);
14808c2ecf20Sopenharmony_ci	WREG32(mmMME6_RTR_HBW_WR_RS_E_ARB, 0x01010501);
14818c2ecf20Sopenharmony_ci	WREG32(mmMME5_RTR_HBW_WR_RS_E_ARB, 0x01010501);
14828c2ecf20Sopenharmony_ci	WREG32(mmMME4_RTR_HBW_WR_RS_E_ARB, 0x01040301);
14838c2ecf20Sopenharmony_ci	WREG32(mmMME3_RTR_HBW_WR_RS_E_ARB, 0x01030401);
14848c2ecf20Sopenharmony_ci	WREG32(mmMME2_RTR_HBW_WR_RS_E_ARB, 0x01040101);
14858c2ecf20Sopenharmony_ci	WREG32(mmMME1_RTR_HBW_WR_RS_E_ARB, 0x01050101);
14868c2ecf20Sopenharmony_ci	WREG32(mmMME6_RTR_HBW_WR_RS_W_ARB, 0x01010101);
14878c2ecf20Sopenharmony_ci	WREG32(mmMME5_RTR_HBW_WR_RS_W_ARB, 0x01010101);
14888c2ecf20Sopenharmony_ci	WREG32(mmMME4_RTR_HBW_WR_RS_W_ARB, 0x01010101);
14898c2ecf20Sopenharmony_ci	WREG32(mmMME3_RTR_HBW_WR_RS_W_ARB, 0x01010101);
14908c2ecf20Sopenharmony_ci	WREG32(mmMME2_RTR_HBW_WR_RS_W_ARB, 0x01010101);
14918c2ecf20Sopenharmony_ci	WREG32(mmMME1_RTR_HBW_WR_RS_W_ARB, 0x01010101);
14928c2ecf20Sopenharmony_ci
14938c2ecf20Sopenharmony_ci	WREG32(mmTPC1_RTR_HBW_RD_RQ_N_ARB, 0x01010101);
14948c2ecf20Sopenharmony_ci	WREG32(mmTPC1_RTR_HBW_RD_RQ_S_ARB, 0x01010101);
14958c2ecf20Sopenharmony_ci	WREG32(mmTPC1_RTR_HBW_RD_RQ_E_ARB, 0x01060101);
14968c2ecf20Sopenharmony_ci	WREG32(mmTPC1_RTR_HBW_WR_RQ_N_ARB, 0x02020102);
14978c2ecf20Sopenharmony_ci	WREG32(mmTPC1_RTR_HBW_WR_RQ_S_ARB, 0x01010101);
14988c2ecf20Sopenharmony_ci	WREG32(mmTPC1_RTR_HBW_WR_RQ_E_ARB, 0x02070202);
14998c2ecf20Sopenharmony_ci	WREG32(mmTPC1_RTR_HBW_RD_RS_N_ARB, 0x01020201);
15008c2ecf20Sopenharmony_ci	WREG32(mmTPC1_RTR_HBW_RD_RS_S_ARB, 0x01070201);
15018c2ecf20Sopenharmony_ci	WREG32(mmTPC1_RTR_HBW_RD_RS_W_ARB, 0x01070202);
15028c2ecf20Sopenharmony_ci	WREG32(mmTPC1_RTR_HBW_WR_RS_N_ARB, 0x01010101);
15038c2ecf20Sopenharmony_ci	WREG32(mmTPC1_RTR_HBW_WR_RS_S_ARB, 0x01050101);
15048c2ecf20Sopenharmony_ci	WREG32(mmTPC1_RTR_HBW_WR_RS_W_ARB, 0x01050101);
15058c2ecf20Sopenharmony_ci
15068c2ecf20Sopenharmony_ci	WREG32(mmTPC2_RTR_HBW_RD_RQ_N_ARB, 0x01020101);
15078c2ecf20Sopenharmony_ci	WREG32(mmTPC2_RTR_HBW_RD_RQ_S_ARB, 0x01050101);
15088c2ecf20Sopenharmony_ci	WREG32(mmTPC2_RTR_HBW_RD_RQ_E_ARB, 0x01010201);
15098c2ecf20Sopenharmony_ci	WREG32(mmTPC2_RTR_HBW_WR_RQ_N_ARB, 0x02040102);
15108c2ecf20Sopenharmony_ci	WREG32(mmTPC2_RTR_HBW_WR_RQ_S_ARB, 0x01050101);
15118c2ecf20Sopenharmony_ci	WREG32(mmTPC2_RTR_HBW_WR_RQ_E_ARB, 0x02060202);
15128c2ecf20Sopenharmony_ci	WREG32(mmTPC2_RTR_HBW_RD_RS_N_ARB, 0x01020201);
15138c2ecf20Sopenharmony_ci	WREG32(mmTPC2_RTR_HBW_RD_RS_S_ARB, 0x01070201);
15148c2ecf20Sopenharmony_ci	WREG32(mmTPC2_RTR_HBW_RD_RS_W_ARB, 0x01070202);
15158c2ecf20Sopenharmony_ci	WREG32(mmTPC2_RTR_HBW_WR_RS_N_ARB, 0x01010101);
15168c2ecf20Sopenharmony_ci	WREG32(mmTPC2_RTR_HBW_WR_RS_S_ARB, 0x01040101);
15178c2ecf20Sopenharmony_ci	WREG32(mmTPC2_RTR_HBW_WR_RS_W_ARB, 0x01040101);
15188c2ecf20Sopenharmony_ci
15198c2ecf20Sopenharmony_ci	WREG32(mmTPC3_RTR_HBW_RD_RQ_N_ARB, 0x01030101);
15208c2ecf20Sopenharmony_ci	WREG32(mmTPC3_RTR_HBW_RD_RQ_S_ARB, 0x01040101);
15218c2ecf20Sopenharmony_ci	WREG32(mmTPC3_RTR_HBW_RD_RQ_E_ARB, 0x01040301);
15228c2ecf20Sopenharmony_ci	WREG32(mmTPC3_RTR_HBW_WR_RQ_N_ARB, 0x02060102);
15238c2ecf20Sopenharmony_ci	WREG32(mmTPC3_RTR_HBW_WR_RQ_S_ARB, 0x01040101);
15248c2ecf20Sopenharmony_ci	WREG32(mmTPC3_RTR_HBW_WR_RQ_E_ARB, 0x01040301);
15258c2ecf20Sopenharmony_ci	WREG32(mmTPC3_RTR_HBW_RD_RS_N_ARB, 0x01040201);
15268c2ecf20Sopenharmony_ci	WREG32(mmTPC3_RTR_HBW_RD_RS_S_ARB, 0x01060201);
15278c2ecf20Sopenharmony_ci	WREG32(mmTPC3_RTR_HBW_RD_RS_W_ARB, 0x01060402);
15288c2ecf20Sopenharmony_ci	WREG32(mmTPC3_RTR_HBW_WR_RS_N_ARB, 0x01020101);
15298c2ecf20Sopenharmony_ci	WREG32(mmTPC3_RTR_HBW_WR_RS_S_ARB, 0x01030101);
15308c2ecf20Sopenharmony_ci	WREG32(mmTPC3_RTR_HBW_WR_RS_W_ARB, 0x01030401);
15318c2ecf20Sopenharmony_ci
15328c2ecf20Sopenharmony_ci	WREG32(mmTPC4_RTR_HBW_RD_RQ_N_ARB, 0x01040101);
15338c2ecf20Sopenharmony_ci	WREG32(mmTPC4_RTR_HBW_RD_RQ_S_ARB, 0x01030101);
15348c2ecf20Sopenharmony_ci	WREG32(mmTPC4_RTR_HBW_RD_RQ_E_ARB, 0x01030401);
15358c2ecf20Sopenharmony_ci	WREG32(mmTPC4_RTR_HBW_WR_RQ_N_ARB, 0x02070102);
15368c2ecf20Sopenharmony_ci	WREG32(mmTPC4_RTR_HBW_WR_RQ_S_ARB, 0x01030101);
15378c2ecf20Sopenharmony_ci	WREG32(mmTPC4_RTR_HBW_WR_RQ_E_ARB, 0x02060702);
15388c2ecf20Sopenharmony_ci	WREG32(mmTPC4_RTR_HBW_RD_RS_N_ARB, 0x01060201);
15398c2ecf20Sopenharmony_ci	WREG32(mmTPC4_RTR_HBW_RD_RS_S_ARB, 0x01040201);
15408c2ecf20Sopenharmony_ci	WREG32(mmTPC4_RTR_HBW_RD_RS_W_ARB, 0x01040602);
15418c2ecf20Sopenharmony_ci	WREG32(mmTPC4_RTR_HBW_WR_RS_N_ARB, 0x01030101);
15428c2ecf20Sopenharmony_ci	WREG32(mmTPC4_RTR_HBW_WR_RS_S_ARB, 0x01020101);
15438c2ecf20Sopenharmony_ci	WREG32(mmTPC4_RTR_HBW_WR_RS_W_ARB, 0x01040301);
15448c2ecf20Sopenharmony_ci
15458c2ecf20Sopenharmony_ci	WREG32(mmTPC5_RTR_HBW_RD_RQ_N_ARB, 0x01050101);
15468c2ecf20Sopenharmony_ci	WREG32(mmTPC5_RTR_HBW_RD_RQ_S_ARB, 0x01020101);
15478c2ecf20Sopenharmony_ci	WREG32(mmTPC5_RTR_HBW_RD_RQ_E_ARB, 0x01200501);
15488c2ecf20Sopenharmony_ci	WREG32(mmTPC5_RTR_HBW_WR_RQ_N_ARB, 0x02070102);
15498c2ecf20Sopenharmony_ci	WREG32(mmTPC5_RTR_HBW_WR_RQ_S_ARB, 0x01020101);
15508c2ecf20Sopenharmony_ci	WREG32(mmTPC5_RTR_HBW_WR_RQ_E_ARB, 0x02020602);
15518c2ecf20Sopenharmony_ci	WREG32(mmTPC5_RTR_HBW_RD_RS_N_ARB, 0x01070201);
15528c2ecf20Sopenharmony_ci	WREG32(mmTPC5_RTR_HBW_RD_RS_S_ARB, 0x01020201);
15538c2ecf20Sopenharmony_ci	WREG32(mmTPC5_RTR_HBW_RD_RS_W_ARB, 0x01020702);
15548c2ecf20Sopenharmony_ci	WREG32(mmTPC5_RTR_HBW_WR_RS_N_ARB, 0x01040101);
15558c2ecf20Sopenharmony_ci	WREG32(mmTPC5_RTR_HBW_WR_RS_S_ARB, 0x01010101);
15568c2ecf20Sopenharmony_ci	WREG32(mmTPC5_RTR_HBW_WR_RS_W_ARB, 0x01010501);
15578c2ecf20Sopenharmony_ci
15588c2ecf20Sopenharmony_ci	WREG32(mmTPC6_RTR_HBW_RD_RQ_N_ARB, 0x01010101);
15598c2ecf20Sopenharmony_ci	WREG32(mmTPC6_RTR_HBW_RD_RQ_S_ARB, 0x01010101);
15608c2ecf20Sopenharmony_ci	WREG32(mmTPC6_RTR_HBW_RD_RQ_E_ARB, 0x01010601);
15618c2ecf20Sopenharmony_ci	WREG32(mmTPC6_RTR_HBW_WR_RQ_N_ARB, 0x01010101);
15628c2ecf20Sopenharmony_ci	WREG32(mmTPC6_RTR_HBW_WR_RQ_S_ARB, 0x01010101);
15638c2ecf20Sopenharmony_ci	WREG32(mmTPC6_RTR_HBW_WR_RQ_E_ARB, 0x02020702);
15648c2ecf20Sopenharmony_ci	WREG32(mmTPC6_RTR_HBW_RD_RS_N_ARB, 0x01010101);
15658c2ecf20Sopenharmony_ci	WREG32(mmTPC6_RTR_HBW_RD_RS_S_ARB, 0x01010101);
15668c2ecf20Sopenharmony_ci	WREG32(mmTPC6_RTR_HBW_RD_RS_W_ARB, 0x01020702);
15678c2ecf20Sopenharmony_ci	WREG32(mmTPC6_RTR_HBW_WR_RS_N_ARB, 0x01050101);
15688c2ecf20Sopenharmony_ci	WREG32(mmTPC6_RTR_HBW_WR_RS_S_ARB, 0x01010101);
15698c2ecf20Sopenharmony_ci	WREG32(mmTPC6_RTR_HBW_WR_RS_W_ARB, 0x01010501);
15708c2ecf20Sopenharmony_ci
15718c2ecf20Sopenharmony_ci	for (i = 0, offset = 0 ; i < 10 ; i++, offset += 4) {
15728c2ecf20Sopenharmony_ci		WREG32(mmMME1_RTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15738c2ecf20Sopenharmony_ci		WREG32(mmMME2_RTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15748c2ecf20Sopenharmony_ci		WREG32(mmMME3_RTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15758c2ecf20Sopenharmony_ci		WREG32(mmMME4_RTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15768c2ecf20Sopenharmony_ci		WREG32(mmMME5_RTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15778c2ecf20Sopenharmony_ci		WREG32(mmMME6_RTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15788c2ecf20Sopenharmony_ci
15798c2ecf20Sopenharmony_ci		WREG32(mmTPC0_NRTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15808c2ecf20Sopenharmony_ci		WREG32(mmTPC1_RTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15818c2ecf20Sopenharmony_ci		WREG32(mmTPC2_RTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15828c2ecf20Sopenharmony_ci		WREG32(mmTPC3_RTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15838c2ecf20Sopenharmony_ci		WREG32(mmTPC4_RTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15848c2ecf20Sopenharmony_ci		WREG32(mmTPC5_RTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15858c2ecf20Sopenharmony_ci		WREG32(mmTPC6_RTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15868c2ecf20Sopenharmony_ci		WREG32(mmTPC7_NRTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15878c2ecf20Sopenharmony_ci
15888c2ecf20Sopenharmony_ci		WREG32(mmPCI_NRTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15898c2ecf20Sopenharmony_ci		WREG32(mmDMA_NRTR_SPLIT_COEF_0 + offset, polynom[i] >> 7);
15908c2ecf20Sopenharmony_ci	}
15918c2ecf20Sopenharmony_ci
15928c2ecf20Sopenharmony_ci	for (i = 0, offset = 0 ; i < 6 ; i++, offset += 0x40000) {
15938c2ecf20Sopenharmony_ci		WREG32(mmMME1_RTR_SCRAMB_EN + offset,
15948c2ecf20Sopenharmony_ci				1 << MME1_RTR_SCRAMB_EN_VAL_SHIFT);
15958c2ecf20Sopenharmony_ci		WREG32(mmMME1_RTR_NON_LIN_SCRAMB + offset,
15968c2ecf20Sopenharmony_ci				1 << MME1_RTR_NON_LIN_SCRAMB_EN_SHIFT);
15978c2ecf20Sopenharmony_ci	}
15988c2ecf20Sopenharmony_ci
15998c2ecf20Sopenharmony_ci	for (i = 0, offset = 0 ; i < 8 ; i++, offset += 0x40000) {
16008c2ecf20Sopenharmony_ci		/*
16018c2ecf20Sopenharmony_ci		 * Workaround for Bug H2 #2441 :
16028c2ecf20Sopenharmony_ci		 * "ST.NOP set trace event illegal opcode"
16038c2ecf20Sopenharmony_ci		 */
16048c2ecf20Sopenharmony_ci		WREG32(mmTPC0_CFG_TPC_INTR_MASK + offset, tpc_intr_mask);
16058c2ecf20Sopenharmony_ci
16068c2ecf20Sopenharmony_ci		WREG32(mmTPC0_NRTR_SCRAMB_EN + offset,
16078c2ecf20Sopenharmony_ci				1 << TPC0_NRTR_SCRAMB_EN_VAL_SHIFT);
16088c2ecf20Sopenharmony_ci		WREG32(mmTPC0_NRTR_NON_LIN_SCRAMB + offset,
16098c2ecf20Sopenharmony_ci				1 << TPC0_NRTR_NON_LIN_SCRAMB_EN_SHIFT);
16108c2ecf20Sopenharmony_ci
16118c2ecf20Sopenharmony_ci		WREG32_FIELD(TPC0_CFG_MSS_CONFIG, offset,
16128c2ecf20Sopenharmony_ci				ICACHE_FETCH_LINE_NUM, 2);
16138c2ecf20Sopenharmony_ci	}
16148c2ecf20Sopenharmony_ci
16158c2ecf20Sopenharmony_ci	WREG32(mmDMA_NRTR_SCRAMB_EN, 1 << DMA_NRTR_SCRAMB_EN_VAL_SHIFT);
16168c2ecf20Sopenharmony_ci	WREG32(mmDMA_NRTR_NON_LIN_SCRAMB,
16178c2ecf20Sopenharmony_ci			1 << DMA_NRTR_NON_LIN_SCRAMB_EN_SHIFT);
16188c2ecf20Sopenharmony_ci
16198c2ecf20Sopenharmony_ci	WREG32(mmPCI_NRTR_SCRAMB_EN, 1 << PCI_NRTR_SCRAMB_EN_VAL_SHIFT);
16208c2ecf20Sopenharmony_ci	WREG32(mmPCI_NRTR_NON_LIN_SCRAMB,
16218c2ecf20Sopenharmony_ci			1 << PCI_NRTR_NON_LIN_SCRAMB_EN_SHIFT);
16228c2ecf20Sopenharmony_ci
16238c2ecf20Sopenharmony_ci	/*
16248c2ecf20Sopenharmony_ci	 * Workaround for H2 #HW-23 bug
16258c2ecf20Sopenharmony_ci	 * Set DMA max outstanding read requests to 240 on DMA CH 1.
16268c2ecf20Sopenharmony_ci	 * This limitation is still large enough to not affect Gen4 bandwidth.
16278c2ecf20Sopenharmony_ci	 * We need to only limit that DMA channel because the user can only read
16288c2ecf20Sopenharmony_ci	 * from Host using DMA CH 1
16298c2ecf20Sopenharmony_ci	 */
16308c2ecf20Sopenharmony_ci	WREG32(mmDMA_CH_1_CFG0, 0x0fff00F0);
16318c2ecf20Sopenharmony_ci
16328c2ecf20Sopenharmony_ci	WREG32(mmTPC_PLL_CLK_RLX_0, 0x200020);
16338c2ecf20Sopenharmony_ci
16348c2ecf20Sopenharmony_ci	goya->hw_cap_initialized |= HW_CAP_GOLDEN;
16358c2ecf20Sopenharmony_ci}
16368c2ecf20Sopenharmony_ci
16378c2ecf20Sopenharmony_cistatic void goya_init_mme_qman(struct hl_device *hdev)
16388c2ecf20Sopenharmony_ci{
16398c2ecf20Sopenharmony_ci	u32 mtr_base_lo, mtr_base_hi;
16408c2ecf20Sopenharmony_ci	u32 so_base_lo, so_base_hi;
16418c2ecf20Sopenharmony_ci	u32 gic_base_lo, gic_base_hi;
16428c2ecf20Sopenharmony_ci	u64 qman_base_addr;
16438c2ecf20Sopenharmony_ci
16448c2ecf20Sopenharmony_ci	mtr_base_lo = lower_32_bits(CFG_BASE + mmSYNC_MNGR_MON_PAY_ADDRL_0);
16458c2ecf20Sopenharmony_ci	mtr_base_hi = upper_32_bits(CFG_BASE + mmSYNC_MNGR_MON_PAY_ADDRL_0);
16468c2ecf20Sopenharmony_ci	so_base_lo = lower_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_0);
16478c2ecf20Sopenharmony_ci	so_base_hi = upper_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_0);
16488c2ecf20Sopenharmony_ci
16498c2ecf20Sopenharmony_ci	gic_base_lo =
16508c2ecf20Sopenharmony_ci		lower_32_bits(CFG_BASE + mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR);
16518c2ecf20Sopenharmony_ci	gic_base_hi =
16528c2ecf20Sopenharmony_ci		upper_32_bits(CFG_BASE + mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR);
16538c2ecf20Sopenharmony_ci
16548c2ecf20Sopenharmony_ci	qman_base_addr = hdev->asic_prop.sram_base_address +
16558c2ecf20Sopenharmony_ci				MME_QMAN_BASE_OFFSET;
16568c2ecf20Sopenharmony_ci
16578c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_PQ_BASE_LO, lower_32_bits(qman_base_addr));
16588c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_PQ_BASE_HI, upper_32_bits(qman_base_addr));
16598c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_PQ_SIZE, ilog2(MME_QMAN_LENGTH));
16608c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_PQ_PI, 0);
16618c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_PQ_CI, 0);
16628c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_CP_LDMA_SRC_BASE_LO_OFFSET, 0x10C0);
16638c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_CP_LDMA_SRC_BASE_HI_OFFSET, 0x10C4);
16648c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_CP_LDMA_TSIZE_OFFSET, 0x10C8);
16658c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_CP_LDMA_COMMIT_OFFSET, 0x10CC);
16668c2ecf20Sopenharmony_ci
16678c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_CP_MSG_BASE0_ADDR_LO, mtr_base_lo);
16688c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_CP_MSG_BASE0_ADDR_HI, mtr_base_hi);
16698c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_CP_MSG_BASE1_ADDR_LO, so_base_lo);
16708c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_CP_MSG_BASE1_ADDR_HI, so_base_hi);
16718c2ecf20Sopenharmony_ci
16728c2ecf20Sopenharmony_ci	/* QMAN CQ has 8 cache lines */
16738c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_CQ_CFG1, 0x00080008);
16748c2ecf20Sopenharmony_ci
16758c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_GLBL_ERR_ADDR_LO, gic_base_lo);
16768c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_GLBL_ERR_ADDR_HI, gic_base_hi);
16778c2ecf20Sopenharmony_ci
16788c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_GLBL_ERR_WDATA, GOYA_ASYNC_EVENT_ID_MME_QM);
16798c2ecf20Sopenharmony_ci
16808c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_GLBL_ERR_CFG, QMAN_MME_ERR_MSG_EN);
16818c2ecf20Sopenharmony_ci
16828c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_GLBL_PROT, QMAN_MME_ERR_PROT);
16838c2ecf20Sopenharmony_ci
16848c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_GLBL_CFG0, QMAN_MME_ENABLE);
16858c2ecf20Sopenharmony_ci}
16868c2ecf20Sopenharmony_ci
16878c2ecf20Sopenharmony_cistatic void goya_init_mme_cmdq(struct hl_device *hdev)
16888c2ecf20Sopenharmony_ci{
16898c2ecf20Sopenharmony_ci	u32 mtr_base_lo, mtr_base_hi;
16908c2ecf20Sopenharmony_ci	u32 so_base_lo, so_base_hi;
16918c2ecf20Sopenharmony_ci	u32 gic_base_lo, gic_base_hi;
16928c2ecf20Sopenharmony_ci
16938c2ecf20Sopenharmony_ci	mtr_base_lo = lower_32_bits(CFG_BASE + mmSYNC_MNGR_MON_PAY_ADDRL_0);
16948c2ecf20Sopenharmony_ci	mtr_base_hi = upper_32_bits(CFG_BASE + mmSYNC_MNGR_MON_PAY_ADDRL_0);
16958c2ecf20Sopenharmony_ci	so_base_lo = lower_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_0);
16968c2ecf20Sopenharmony_ci	so_base_hi = upper_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_0);
16978c2ecf20Sopenharmony_ci
16988c2ecf20Sopenharmony_ci	gic_base_lo =
16998c2ecf20Sopenharmony_ci		lower_32_bits(CFG_BASE + mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR);
17008c2ecf20Sopenharmony_ci	gic_base_hi =
17018c2ecf20Sopenharmony_ci		upper_32_bits(CFG_BASE + mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR);
17028c2ecf20Sopenharmony_ci
17038c2ecf20Sopenharmony_ci	WREG32(mmMME_CMDQ_CP_MSG_BASE0_ADDR_LO, mtr_base_lo);
17048c2ecf20Sopenharmony_ci	WREG32(mmMME_CMDQ_CP_MSG_BASE0_ADDR_HI, mtr_base_hi);
17058c2ecf20Sopenharmony_ci	WREG32(mmMME_CMDQ_CP_MSG_BASE1_ADDR_LO,	so_base_lo);
17068c2ecf20Sopenharmony_ci	WREG32(mmMME_CMDQ_CP_MSG_BASE1_ADDR_HI, so_base_hi);
17078c2ecf20Sopenharmony_ci
17088c2ecf20Sopenharmony_ci	/* CMDQ CQ has 20 cache lines */
17098c2ecf20Sopenharmony_ci	WREG32(mmMME_CMDQ_CQ_CFG1, 0x00140014);
17108c2ecf20Sopenharmony_ci
17118c2ecf20Sopenharmony_ci	WREG32(mmMME_CMDQ_GLBL_ERR_ADDR_LO, gic_base_lo);
17128c2ecf20Sopenharmony_ci	WREG32(mmMME_CMDQ_GLBL_ERR_ADDR_HI, gic_base_hi);
17138c2ecf20Sopenharmony_ci
17148c2ecf20Sopenharmony_ci	WREG32(mmMME_CMDQ_GLBL_ERR_WDATA, GOYA_ASYNC_EVENT_ID_MME_CMDQ);
17158c2ecf20Sopenharmony_ci
17168c2ecf20Sopenharmony_ci	WREG32(mmMME_CMDQ_GLBL_ERR_CFG, CMDQ_MME_ERR_MSG_EN);
17178c2ecf20Sopenharmony_ci
17188c2ecf20Sopenharmony_ci	WREG32(mmMME_CMDQ_GLBL_PROT, CMDQ_MME_ERR_PROT);
17198c2ecf20Sopenharmony_ci
17208c2ecf20Sopenharmony_ci	WREG32(mmMME_CMDQ_GLBL_CFG0, CMDQ_MME_ENABLE);
17218c2ecf20Sopenharmony_ci}
17228c2ecf20Sopenharmony_ci
17238c2ecf20Sopenharmony_civoid goya_init_mme_qmans(struct hl_device *hdev)
17248c2ecf20Sopenharmony_ci{
17258c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
17268c2ecf20Sopenharmony_ci	u32 so_base_lo, so_base_hi;
17278c2ecf20Sopenharmony_ci
17288c2ecf20Sopenharmony_ci	if (goya->hw_cap_initialized & HW_CAP_MME)
17298c2ecf20Sopenharmony_ci		return;
17308c2ecf20Sopenharmony_ci
17318c2ecf20Sopenharmony_ci	so_base_lo = lower_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_0);
17328c2ecf20Sopenharmony_ci	so_base_hi = upper_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_0);
17338c2ecf20Sopenharmony_ci
17348c2ecf20Sopenharmony_ci	WREG32(mmMME_SM_BASE_ADDRESS_LOW, so_base_lo);
17358c2ecf20Sopenharmony_ci	WREG32(mmMME_SM_BASE_ADDRESS_HIGH, so_base_hi);
17368c2ecf20Sopenharmony_ci
17378c2ecf20Sopenharmony_ci	goya_init_mme_qman(hdev);
17388c2ecf20Sopenharmony_ci	goya_init_mme_cmdq(hdev);
17398c2ecf20Sopenharmony_ci
17408c2ecf20Sopenharmony_ci	goya->hw_cap_initialized |= HW_CAP_MME;
17418c2ecf20Sopenharmony_ci}
17428c2ecf20Sopenharmony_ci
17438c2ecf20Sopenharmony_cistatic void goya_init_tpc_qman(struct hl_device *hdev, u32 base_off, int tpc_id)
17448c2ecf20Sopenharmony_ci{
17458c2ecf20Sopenharmony_ci	u32 mtr_base_lo, mtr_base_hi;
17468c2ecf20Sopenharmony_ci	u32 so_base_lo, so_base_hi;
17478c2ecf20Sopenharmony_ci	u32 gic_base_lo, gic_base_hi;
17488c2ecf20Sopenharmony_ci	u64 qman_base_addr;
17498c2ecf20Sopenharmony_ci	u32 reg_off = tpc_id * (mmTPC1_QM_PQ_PI - mmTPC0_QM_PQ_PI);
17508c2ecf20Sopenharmony_ci
17518c2ecf20Sopenharmony_ci	mtr_base_lo = lower_32_bits(CFG_BASE + mmSYNC_MNGR_MON_PAY_ADDRL_0);
17528c2ecf20Sopenharmony_ci	mtr_base_hi = upper_32_bits(CFG_BASE + mmSYNC_MNGR_MON_PAY_ADDRL_0);
17538c2ecf20Sopenharmony_ci	so_base_lo = lower_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_0);
17548c2ecf20Sopenharmony_ci	so_base_hi = upper_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_0);
17558c2ecf20Sopenharmony_ci
17568c2ecf20Sopenharmony_ci	gic_base_lo =
17578c2ecf20Sopenharmony_ci		lower_32_bits(CFG_BASE + mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR);
17588c2ecf20Sopenharmony_ci	gic_base_hi =
17598c2ecf20Sopenharmony_ci		upper_32_bits(CFG_BASE + mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR);
17608c2ecf20Sopenharmony_ci
17618c2ecf20Sopenharmony_ci	qman_base_addr = hdev->asic_prop.sram_base_address + base_off;
17628c2ecf20Sopenharmony_ci
17638c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_PQ_BASE_LO + reg_off, lower_32_bits(qman_base_addr));
17648c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_PQ_BASE_HI + reg_off, upper_32_bits(qman_base_addr));
17658c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_PQ_SIZE + reg_off, ilog2(TPC_QMAN_LENGTH));
17668c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_PQ_PI + reg_off, 0);
17678c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_PQ_CI + reg_off, 0);
17688c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_CP_LDMA_SRC_BASE_LO_OFFSET + reg_off, 0x10C0);
17698c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_CP_LDMA_SRC_BASE_HI_OFFSET + reg_off, 0x10C4);
17708c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_CP_LDMA_TSIZE_OFFSET + reg_off, 0x10C8);
17718c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_CP_LDMA_COMMIT_OFFSET + reg_off, 0x10CC);
17728c2ecf20Sopenharmony_ci
17738c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_CP_MSG_BASE0_ADDR_LO + reg_off, mtr_base_lo);
17748c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_CP_MSG_BASE0_ADDR_HI + reg_off, mtr_base_hi);
17758c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_CP_MSG_BASE1_ADDR_LO + reg_off, so_base_lo);
17768c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_CP_MSG_BASE1_ADDR_HI + reg_off, so_base_hi);
17778c2ecf20Sopenharmony_ci
17788c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_CQ_CFG1 + reg_off, 0x00080008);
17798c2ecf20Sopenharmony_ci
17808c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_GLBL_ERR_ADDR_LO + reg_off, gic_base_lo);
17818c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_GLBL_ERR_ADDR_HI + reg_off, gic_base_hi);
17828c2ecf20Sopenharmony_ci
17838c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_GLBL_ERR_WDATA + reg_off,
17848c2ecf20Sopenharmony_ci			GOYA_ASYNC_EVENT_ID_TPC0_QM + tpc_id);
17858c2ecf20Sopenharmony_ci
17868c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_GLBL_ERR_CFG + reg_off, QMAN_TPC_ERR_MSG_EN);
17878c2ecf20Sopenharmony_ci
17888c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_GLBL_PROT + reg_off, QMAN_TPC_ERR_PROT);
17898c2ecf20Sopenharmony_ci
17908c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_GLBL_CFG0 + reg_off, QMAN_TPC_ENABLE);
17918c2ecf20Sopenharmony_ci}
17928c2ecf20Sopenharmony_ci
17938c2ecf20Sopenharmony_cistatic void goya_init_tpc_cmdq(struct hl_device *hdev, int tpc_id)
17948c2ecf20Sopenharmony_ci{
17958c2ecf20Sopenharmony_ci	u32 mtr_base_lo, mtr_base_hi;
17968c2ecf20Sopenharmony_ci	u32 so_base_lo, so_base_hi;
17978c2ecf20Sopenharmony_ci	u32 gic_base_lo, gic_base_hi;
17988c2ecf20Sopenharmony_ci	u32 reg_off = tpc_id * (mmTPC1_CMDQ_CQ_CFG1 - mmTPC0_CMDQ_CQ_CFG1);
17998c2ecf20Sopenharmony_ci
18008c2ecf20Sopenharmony_ci	mtr_base_lo = lower_32_bits(CFG_BASE + mmSYNC_MNGR_MON_PAY_ADDRL_0);
18018c2ecf20Sopenharmony_ci	mtr_base_hi = upper_32_bits(CFG_BASE + mmSYNC_MNGR_MON_PAY_ADDRL_0);
18028c2ecf20Sopenharmony_ci	so_base_lo = lower_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_0);
18038c2ecf20Sopenharmony_ci	so_base_hi = upper_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_0);
18048c2ecf20Sopenharmony_ci
18058c2ecf20Sopenharmony_ci	gic_base_lo =
18068c2ecf20Sopenharmony_ci		lower_32_bits(CFG_BASE + mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR);
18078c2ecf20Sopenharmony_ci	gic_base_hi =
18088c2ecf20Sopenharmony_ci		upper_32_bits(CFG_BASE + mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR);
18098c2ecf20Sopenharmony_ci
18108c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CMDQ_CP_MSG_BASE0_ADDR_LO + reg_off, mtr_base_lo);
18118c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CMDQ_CP_MSG_BASE0_ADDR_HI + reg_off, mtr_base_hi);
18128c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CMDQ_CP_MSG_BASE1_ADDR_LO + reg_off, so_base_lo);
18138c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CMDQ_CP_MSG_BASE1_ADDR_HI + reg_off, so_base_hi);
18148c2ecf20Sopenharmony_ci
18158c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CMDQ_CQ_CFG1 + reg_off, 0x00140014);
18168c2ecf20Sopenharmony_ci
18178c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CMDQ_GLBL_ERR_ADDR_LO + reg_off, gic_base_lo);
18188c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CMDQ_GLBL_ERR_ADDR_HI + reg_off, gic_base_hi);
18198c2ecf20Sopenharmony_ci
18208c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CMDQ_GLBL_ERR_WDATA + reg_off,
18218c2ecf20Sopenharmony_ci			GOYA_ASYNC_EVENT_ID_TPC0_CMDQ + tpc_id);
18228c2ecf20Sopenharmony_ci
18238c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CMDQ_GLBL_ERR_CFG + reg_off, CMDQ_TPC_ERR_MSG_EN);
18248c2ecf20Sopenharmony_ci
18258c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CMDQ_GLBL_PROT + reg_off, CMDQ_TPC_ERR_PROT);
18268c2ecf20Sopenharmony_ci
18278c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CMDQ_GLBL_CFG0 + reg_off, CMDQ_TPC_ENABLE);
18288c2ecf20Sopenharmony_ci}
18298c2ecf20Sopenharmony_ci
18308c2ecf20Sopenharmony_civoid goya_init_tpc_qmans(struct hl_device *hdev)
18318c2ecf20Sopenharmony_ci{
18328c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
18338c2ecf20Sopenharmony_ci	u32 so_base_lo, so_base_hi;
18348c2ecf20Sopenharmony_ci	u32 cfg_off = mmTPC1_CFG_SM_BASE_ADDRESS_LOW -
18358c2ecf20Sopenharmony_ci			mmTPC0_CFG_SM_BASE_ADDRESS_LOW;
18368c2ecf20Sopenharmony_ci	int i;
18378c2ecf20Sopenharmony_ci
18388c2ecf20Sopenharmony_ci	if (goya->hw_cap_initialized & HW_CAP_TPC)
18398c2ecf20Sopenharmony_ci		return;
18408c2ecf20Sopenharmony_ci
18418c2ecf20Sopenharmony_ci	so_base_lo = lower_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_0);
18428c2ecf20Sopenharmony_ci	so_base_hi = upper_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_0);
18438c2ecf20Sopenharmony_ci
18448c2ecf20Sopenharmony_ci	for (i = 0 ; i < TPC_MAX_NUM ; i++) {
18458c2ecf20Sopenharmony_ci		WREG32(mmTPC0_CFG_SM_BASE_ADDRESS_LOW + i * cfg_off,
18468c2ecf20Sopenharmony_ci				so_base_lo);
18478c2ecf20Sopenharmony_ci		WREG32(mmTPC0_CFG_SM_BASE_ADDRESS_HIGH + i * cfg_off,
18488c2ecf20Sopenharmony_ci				so_base_hi);
18498c2ecf20Sopenharmony_ci	}
18508c2ecf20Sopenharmony_ci
18518c2ecf20Sopenharmony_ci	goya_init_tpc_qman(hdev, TPC0_QMAN_BASE_OFFSET, 0);
18528c2ecf20Sopenharmony_ci	goya_init_tpc_qman(hdev, TPC1_QMAN_BASE_OFFSET, 1);
18538c2ecf20Sopenharmony_ci	goya_init_tpc_qman(hdev, TPC2_QMAN_BASE_OFFSET, 2);
18548c2ecf20Sopenharmony_ci	goya_init_tpc_qman(hdev, TPC3_QMAN_BASE_OFFSET, 3);
18558c2ecf20Sopenharmony_ci	goya_init_tpc_qman(hdev, TPC4_QMAN_BASE_OFFSET, 4);
18568c2ecf20Sopenharmony_ci	goya_init_tpc_qman(hdev, TPC5_QMAN_BASE_OFFSET, 5);
18578c2ecf20Sopenharmony_ci	goya_init_tpc_qman(hdev, TPC6_QMAN_BASE_OFFSET, 6);
18588c2ecf20Sopenharmony_ci	goya_init_tpc_qman(hdev, TPC7_QMAN_BASE_OFFSET, 7);
18598c2ecf20Sopenharmony_ci
18608c2ecf20Sopenharmony_ci	for (i = 0 ; i < TPC_MAX_NUM ; i++)
18618c2ecf20Sopenharmony_ci		goya_init_tpc_cmdq(hdev, i);
18628c2ecf20Sopenharmony_ci
18638c2ecf20Sopenharmony_ci	goya->hw_cap_initialized |= HW_CAP_TPC;
18648c2ecf20Sopenharmony_ci}
18658c2ecf20Sopenharmony_ci
18668c2ecf20Sopenharmony_ci/*
18678c2ecf20Sopenharmony_ci * goya_disable_internal_queues - Disable internal queues
18688c2ecf20Sopenharmony_ci *
18698c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
18708c2ecf20Sopenharmony_ci *
18718c2ecf20Sopenharmony_ci */
18728c2ecf20Sopenharmony_cistatic void goya_disable_internal_queues(struct hl_device *hdev)
18738c2ecf20Sopenharmony_ci{
18748c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
18758c2ecf20Sopenharmony_ci
18768c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_MME))
18778c2ecf20Sopenharmony_ci		goto disable_tpc;
18788c2ecf20Sopenharmony_ci
18798c2ecf20Sopenharmony_ci	WREG32(mmMME_QM_GLBL_CFG0, 0);
18808c2ecf20Sopenharmony_ci	WREG32(mmMME_CMDQ_GLBL_CFG0, 0);
18818c2ecf20Sopenharmony_ci
18828c2ecf20Sopenharmony_cidisable_tpc:
18838c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_TPC))
18848c2ecf20Sopenharmony_ci		return;
18858c2ecf20Sopenharmony_ci
18868c2ecf20Sopenharmony_ci	WREG32(mmTPC0_QM_GLBL_CFG0, 0);
18878c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CMDQ_GLBL_CFG0, 0);
18888c2ecf20Sopenharmony_ci
18898c2ecf20Sopenharmony_ci	WREG32(mmTPC1_QM_GLBL_CFG0, 0);
18908c2ecf20Sopenharmony_ci	WREG32(mmTPC1_CMDQ_GLBL_CFG0, 0);
18918c2ecf20Sopenharmony_ci
18928c2ecf20Sopenharmony_ci	WREG32(mmTPC2_QM_GLBL_CFG0, 0);
18938c2ecf20Sopenharmony_ci	WREG32(mmTPC2_CMDQ_GLBL_CFG0, 0);
18948c2ecf20Sopenharmony_ci
18958c2ecf20Sopenharmony_ci	WREG32(mmTPC3_QM_GLBL_CFG0, 0);
18968c2ecf20Sopenharmony_ci	WREG32(mmTPC3_CMDQ_GLBL_CFG0, 0);
18978c2ecf20Sopenharmony_ci
18988c2ecf20Sopenharmony_ci	WREG32(mmTPC4_QM_GLBL_CFG0, 0);
18998c2ecf20Sopenharmony_ci	WREG32(mmTPC4_CMDQ_GLBL_CFG0, 0);
19008c2ecf20Sopenharmony_ci
19018c2ecf20Sopenharmony_ci	WREG32(mmTPC5_QM_GLBL_CFG0, 0);
19028c2ecf20Sopenharmony_ci	WREG32(mmTPC5_CMDQ_GLBL_CFG0, 0);
19038c2ecf20Sopenharmony_ci
19048c2ecf20Sopenharmony_ci	WREG32(mmTPC6_QM_GLBL_CFG0, 0);
19058c2ecf20Sopenharmony_ci	WREG32(mmTPC6_CMDQ_GLBL_CFG0, 0);
19068c2ecf20Sopenharmony_ci
19078c2ecf20Sopenharmony_ci	WREG32(mmTPC7_QM_GLBL_CFG0, 0);
19088c2ecf20Sopenharmony_ci	WREG32(mmTPC7_CMDQ_GLBL_CFG0, 0);
19098c2ecf20Sopenharmony_ci}
19108c2ecf20Sopenharmony_ci
19118c2ecf20Sopenharmony_ci/*
19128c2ecf20Sopenharmony_ci * goya_stop_internal_queues - Stop internal queues
19138c2ecf20Sopenharmony_ci *
19148c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
19158c2ecf20Sopenharmony_ci *
19168c2ecf20Sopenharmony_ci * Returns 0 on success
19178c2ecf20Sopenharmony_ci *
19188c2ecf20Sopenharmony_ci */
19198c2ecf20Sopenharmony_cistatic int goya_stop_internal_queues(struct hl_device *hdev)
19208c2ecf20Sopenharmony_ci{
19218c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
19228c2ecf20Sopenharmony_ci	int rc, retval = 0;
19238c2ecf20Sopenharmony_ci
19248c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_MME))
19258c2ecf20Sopenharmony_ci		goto stop_tpc;
19268c2ecf20Sopenharmony_ci
19278c2ecf20Sopenharmony_ci	/*
19288c2ecf20Sopenharmony_ci	 * Each queue (QMAN) is a separate H/W logic. That means that each
19298c2ecf20Sopenharmony_ci	 * QMAN can be stopped independently and failure to stop one does NOT
19308c2ecf20Sopenharmony_ci	 * mandate we should not try to stop other QMANs
19318c2ecf20Sopenharmony_ci	 */
19328c2ecf20Sopenharmony_ci
19338c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
19348c2ecf20Sopenharmony_ci			mmMME_QM_GLBL_CFG1,
19358c2ecf20Sopenharmony_ci			mmMME_QM_CP_STS,
19368c2ecf20Sopenharmony_ci			mmMME_QM_GLBL_STS0);
19378c2ecf20Sopenharmony_ci
19388c2ecf20Sopenharmony_ci	if (rc) {
19398c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop MME QMAN\n");
19408c2ecf20Sopenharmony_ci		retval = -EIO;
19418c2ecf20Sopenharmony_ci	}
19428c2ecf20Sopenharmony_ci
19438c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
19448c2ecf20Sopenharmony_ci			mmMME_CMDQ_GLBL_CFG1,
19458c2ecf20Sopenharmony_ci			mmMME_CMDQ_CP_STS,
19468c2ecf20Sopenharmony_ci			mmMME_CMDQ_GLBL_STS0);
19478c2ecf20Sopenharmony_ci
19488c2ecf20Sopenharmony_ci	if (rc) {
19498c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop MME CMDQ\n");
19508c2ecf20Sopenharmony_ci		retval = -EIO;
19518c2ecf20Sopenharmony_ci	}
19528c2ecf20Sopenharmony_ci
19538c2ecf20Sopenharmony_cistop_tpc:
19548c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_TPC))
19558c2ecf20Sopenharmony_ci		return retval;
19568c2ecf20Sopenharmony_ci
19578c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
19588c2ecf20Sopenharmony_ci			mmTPC0_QM_GLBL_CFG1,
19598c2ecf20Sopenharmony_ci			mmTPC0_QM_CP_STS,
19608c2ecf20Sopenharmony_ci			mmTPC0_QM_GLBL_STS0);
19618c2ecf20Sopenharmony_ci
19628c2ecf20Sopenharmony_ci	if (rc) {
19638c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 0 QMAN\n");
19648c2ecf20Sopenharmony_ci		retval = -EIO;
19658c2ecf20Sopenharmony_ci	}
19668c2ecf20Sopenharmony_ci
19678c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
19688c2ecf20Sopenharmony_ci			mmTPC0_CMDQ_GLBL_CFG1,
19698c2ecf20Sopenharmony_ci			mmTPC0_CMDQ_CP_STS,
19708c2ecf20Sopenharmony_ci			mmTPC0_CMDQ_GLBL_STS0);
19718c2ecf20Sopenharmony_ci
19728c2ecf20Sopenharmony_ci	if (rc) {
19738c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 0 CMDQ\n");
19748c2ecf20Sopenharmony_ci		retval = -EIO;
19758c2ecf20Sopenharmony_ci	}
19768c2ecf20Sopenharmony_ci
19778c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
19788c2ecf20Sopenharmony_ci			mmTPC1_QM_GLBL_CFG1,
19798c2ecf20Sopenharmony_ci			mmTPC1_QM_CP_STS,
19808c2ecf20Sopenharmony_ci			mmTPC1_QM_GLBL_STS0);
19818c2ecf20Sopenharmony_ci
19828c2ecf20Sopenharmony_ci	if (rc) {
19838c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 1 QMAN\n");
19848c2ecf20Sopenharmony_ci		retval = -EIO;
19858c2ecf20Sopenharmony_ci	}
19868c2ecf20Sopenharmony_ci
19878c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
19888c2ecf20Sopenharmony_ci			mmTPC1_CMDQ_GLBL_CFG1,
19898c2ecf20Sopenharmony_ci			mmTPC1_CMDQ_CP_STS,
19908c2ecf20Sopenharmony_ci			mmTPC1_CMDQ_GLBL_STS0);
19918c2ecf20Sopenharmony_ci
19928c2ecf20Sopenharmony_ci	if (rc) {
19938c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 1 CMDQ\n");
19948c2ecf20Sopenharmony_ci		retval = -EIO;
19958c2ecf20Sopenharmony_ci	}
19968c2ecf20Sopenharmony_ci
19978c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
19988c2ecf20Sopenharmony_ci			mmTPC2_QM_GLBL_CFG1,
19998c2ecf20Sopenharmony_ci			mmTPC2_QM_CP_STS,
20008c2ecf20Sopenharmony_ci			mmTPC2_QM_GLBL_STS0);
20018c2ecf20Sopenharmony_ci
20028c2ecf20Sopenharmony_ci	if (rc) {
20038c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 2 QMAN\n");
20048c2ecf20Sopenharmony_ci		retval = -EIO;
20058c2ecf20Sopenharmony_ci	}
20068c2ecf20Sopenharmony_ci
20078c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
20088c2ecf20Sopenharmony_ci			mmTPC2_CMDQ_GLBL_CFG1,
20098c2ecf20Sopenharmony_ci			mmTPC2_CMDQ_CP_STS,
20108c2ecf20Sopenharmony_ci			mmTPC2_CMDQ_GLBL_STS0);
20118c2ecf20Sopenharmony_ci
20128c2ecf20Sopenharmony_ci	if (rc) {
20138c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 2 CMDQ\n");
20148c2ecf20Sopenharmony_ci		retval = -EIO;
20158c2ecf20Sopenharmony_ci	}
20168c2ecf20Sopenharmony_ci
20178c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
20188c2ecf20Sopenharmony_ci			mmTPC3_QM_GLBL_CFG1,
20198c2ecf20Sopenharmony_ci			mmTPC3_QM_CP_STS,
20208c2ecf20Sopenharmony_ci			mmTPC3_QM_GLBL_STS0);
20218c2ecf20Sopenharmony_ci
20228c2ecf20Sopenharmony_ci	if (rc) {
20238c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 3 QMAN\n");
20248c2ecf20Sopenharmony_ci		retval = -EIO;
20258c2ecf20Sopenharmony_ci	}
20268c2ecf20Sopenharmony_ci
20278c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
20288c2ecf20Sopenharmony_ci			mmTPC3_CMDQ_GLBL_CFG1,
20298c2ecf20Sopenharmony_ci			mmTPC3_CMDQ_CP_STS,
20308c2ecf20Sopenharmony_ci			mmTPC3_CMDQ_GLBL_STS0);
20318c2ecf20Sopenharmony_ci
20328c2ecf20Sopenharmony_ci	if (rc) {
20338c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 3 CMDQ\n");
20348c2ecf20Sopenharmony_ci		retval = -EIO;
20358c2ecf20Sopenharmony_ci	}
20368c2ecf20Sopenharmony_ci
20378c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
20388c2ecf20Sopenharmony_ci			mmTPC4_QM_GLBL_CFG1,
20398c2ecf20Sopenharmony_ci			mmTPC4_QM_CP_STS,
20408c2ecf20Sopenharmony_ci			mmTPC4_QM_GLBL_STS0);
20418c2ecf20Sopenharmony_ci
20428c2ecf20Sopenharmony_ci	if (rc) {
20438c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 4 QMAN\n");
20448c2ecf20Sopenharmony_ci		retval = -EIO;
20458c2ecf20Sopenharmony_ci	}
20468c2ecf20Sopenharmony_ci
20478c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
20488c2ecf20Sopenharmony_ci			mmTPC4_CMDQ_GLBL_CFG1,
20498c2ecf20Sopenharmony_ci			mmTPC4_CMDQ_CP_STS,
20508c2ecf20Sopenharmony_ci			mmTPC4_CMDQ_GLBL_STS0);
20518c2ecf20Sopenharmony_ci
20528c2ecf20Sopenharmony_ci	if (rc) {
20538c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 4 CMDQ\n");
20548c2ecf20Sopenharmony_ci		retval = -EIO;
20558c2ecf20Sopenharmony_ci	}
20568c2ecf20Sopenharmony_ci
20578c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
20588c2ecf20Sopenharmony_ci			mmTPC5_QM_GLBL_CFG1,
20598c2ecf20Sopenharmony_ci			mmTPC5_QM_CP_STS,
20608c2ecf20Sopenharmony_ci			mmTPC5_QM_GLBL_STS0);
20618c2ecf20Sopenharmony_ci
20628c2ecf20Sopenharmony_ci	if (rc) {
20638c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 5 QMAN\n");
20648c2ecf20Sopenharmony_ci		retval = -EIO;
20658c2ecf20Sopenharmony_ci	}
20668c2ecf20Sopenharmony_ci
20678c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
20688c2ecf20Sopenharmony_ci			mmTPC5_CMDQ_GLBL_CFG1,
20698c2ecf20Sopenharmony_ci			mmTPC5_CMDQ_CP_STS,
20708c2ecf20Sopenharmony_ci			mmTPC5_CMDQ_GLBL_STS0);
20718c2ecf20Sopenharmony_ci
20728c2ecf20Sopenharmony_ci	if (rc) {
20738c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 5 CMDQ\n");
20748c2ecf20Sopenharmony_ci		retval = -EIO;
20758c2ecf20Sopenharmony_ci	}
20768c2ecf20Sopenharmony_ci
20778c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
20788c2ecf20Sopenharmony_ci			mmTPC6_QM_GLBL_CFG1,
20798c2ecf20Sopenharmony_ci			mmTPC6_QM_CP_STS,
20808c2ecf20Sopenharmony_ci			mmTPC6_QM_GLBL_STS0);
20818c2ecf20Sopenharmony_ci
20828c2ecf20Sopenharmony_ci	if (rc) {
20838c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 6 QMAN\n");
20848c2ecf20Sopenharmony_ci		retval = -EIO;
20858c2ecf20Sopenharmony_ci	}
20868c2ecf20Sopenharmony_ci
20878c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
20888c2ecf20Sopenharmony_ci			mmTPC6_CMDQ_GLBL_CFG1,
20898c2ecf20Sopenharmony_ci			mmTPC6_CMDQ_CP_STS,
20908c2ecf20Sopenharmony_ci			mmTPC6_CMDQ_GLBL_STS0);
20918c2ecf20Sopenharmony_ci
20928c2ecf20Sopenharmony_ci	if (rc) {
20938c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 6 CMDQ\n");
20948c2ecf20Sopenharmony_ci		retval = -EIO;
20958c2ecf20Sopenharmony_ci	}
20968c2ecf20Sopenharmony_ci
20978c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
20988c2ecf20Sopenharmony_ci			mmTPC7_QM_GLBL_CFG1,
20998c2ecf20Sopenharmony_ci			mmTPC7_QM_CP_STS,
21008c2ecf20Sopenharmony_ci			mmTPC7_QM_GLBL_STS0);
21018c2ecf20Sopenharmony_ci
21028c2ecf20Sopenharmony_ci	if (rc) {
21038c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 7 QMAN\n");
21048c2ecf20Sopenharmony_ci		retval = -EIO;
21058c2ecf20Sopenharmony_ci	}
21068c2ecf20Sopenharmony_ci
21078c2ecf20Sopenharmony_ci	rc = goya_stop_queue(hdev,
21088c2ecf20Sopenharmony_ci			mmTPC7_CMDQ_GLBL_CFG1,
21098c2ecf20Sopenharmony_ci			mmTPC7_CMDQ_CP_STS,
21108c2ecf20Sopenharmony_ci			mmTPC7_CMDQ_GLBL_STS0);
21118c2ecf20Sopenharmony_ci
21128c2ecf20Sopenharmony_ci	if (rc) {
21138c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to stop TPC 7 CMDQ\n");
21148c2ecf20Sopenharmony_ci		retval = -EIO;
21158c2ecf20Sopenharmony_ci	}
21168c2ecf20Sopenharmony_ci
21178c2ecf20Sopenharmony_ci	return retval;
21188c2ecf20Sopenharmony_ci}
21198c2ecf20Sopenharmony_ci
21208c2ecf20Sopenharmony_cistatic void goya_dma_stall(struct hl_device *hdev)
21218c2ecf20Sopenharmony_ci{
21228c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
21238c2ecf20Sopenharmony_ci
21248c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_DMA))
21258c2ecf20Sopenharmony_ci		return;
21268c2ecf20Sopenharmony_ci
21278c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_0_GLBL_CFG1, 1 << DMA_QM_0_GLBL_CFG1_DMA_STOP_SHIFT);
21288c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_1_GLBL_CFG1, 1 << DMA_QM_1_GLBL_CFG1_DMA_STOP_SHIFT);
21298c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_2_GLBL_CFG1, 1 << DMA_QM_2_GLBL_CFG1_DMA_STOP_SHIFT);
21308c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_3_GLBL_CFG1, 1 << DMA_QM_3_GLBL_CFG1_DMA_STOP_SHIFT);
21318c2ecf20Sopenharmony_ci	WREG32(mmDMA_QM_4_GLBL_CFG1, 1 << DMA_QM_4_GLBL_CFG1_DMA_STOP_SHIFT);
21328c2ecf20Sopenharmony_ci}
21338c2ecf20Sopenharmony_ci
21348c2ecf20Sopenharmony_cistatic void goya_tpc_stall(struct hl_device *hdev)
21358c2ecf20Sopenharmony_ci{
21368c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
21378c2ecf20Sopenharmony_ci
21388c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_TPC))
21398c2ecf20Sopenharmony_ci		return;
21408c2ecf20Sopenharmony_ci
21418c2ecf20Sopenharmony_ci	WREG32(mmTPC0_CFG_TPC_STALL, 1 << TPC0_CFG_TPC_STALL_V_SHIFT);
21428c2ecf20Sopenharmony_ci	WREG32(mmTPC1_CFG_TPC_STALL, 1 << TPC1_CFG_TPC_STALL_V_SHIFT);
21438c2ecf20Sopenharmony_ci	WREG32(mmTPC2_CFG_TPC_STALL, 1 << TPC2_CFG_TPC_STALL_V_SHIFT);
21448c2ecf20Sopenharmony_ci	WREG32(mmTPC3_CFG_TPC_STALL, 1 << TPC3_CFG_TPC_STALL_V_SHIFT);
21458c2ecf20Sopenharmony_ci	WREG32(mmTPC4_CFG_TPC_STALL, 1 << TPC4_CFG_TPC_STALL_V_SHIFT);
21468c2ecf20Sopenharmony_ci	WREG32(mmTPC5_CFG_TPC_STALL, 1 << TPC5_CFG_TPC_STALL_V_SHIFT);
21478c2ecf20Sopenharmony_ci	WREG32(mmTPC6_CFG_TPC_STALL, 1 << TPC6_CFG_TPC_STALL_V_SHIFT);
21488c2ecf20Sopenharmony_ci	WREG32(mmTPC7_CFG_TPC_STALL, 1 << TPC7_CFG_TPC_STALL_V_SHIFT);
21498c2ecf20Sopenharmony_ci}
21508c2ecf20Sopenharmony_ci
21518c2ecf20Sopenharmony_cistatic void goya_mme_stall(struct hl_device *hdev)
21528c2ecf20Sopenharmony_ci{
21538c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
21548c2ecf20Sopenharmony_ci
21558c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_MME))
21568c2ecf20Sopenharmony_ci		return;
21578c2ecf20Sopenharmony_ci
21588c2ecf20Sopenharmony_ci	WREG32(mmMME_STALL, 0xFFFFFFFF);
21598c2ecf20Sopenharmony_ci}
21608c2ecf20Sopenharmony_ci
21618c2ecf20Sopenharmony_cistatic int goya_enable_msix(struct hl_device *hdev)
21628c2ecf20Sopenharmony_ci{
21638c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
21648c2ecf20Sopenharmony_ci	int cq_cnt = hdev->asic_prop.completion_queues_count;
21658c2ecf20Sopenharmony_ci	int rc, i, irq_cnt_init, irq;
21668c2ecf20Sopenharmony_ci
21678c2ecf20Sopenharmony_ci	if (goya->hw_cap_initialized & HW_CAP_MSIX)
21688c2ecf20Sopenharmony_ci		return 0;
21698c2ecf20Sopenharmony_ci
21708c2ecf20Sopenharmony_ci	rc = pci_alloc_irq_vectors(hdev->pdev, GOYA_MSIX_ENTRIES,
21718c2ecf20Sopenharmony_ci				GOYA_MSIX_ENTRIES, PCI_IRQ_MSIX);
21728c2ecf20Sopenharmony_ci	if (rc < 0) {
21738c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
21748c2ecf20Sopenharmony_ci			"MSI-X: Failed to enable support -- %d/%d\n",
21758c2ecf20Sopenharmony_ci			GOYA_MSIX_ENTRIES, rc);
21768c2ecf20Sopenharmony_ci		return rc;
21778c2ecf20Sopenharmony_ci	}
21788c2ecf20Sopenharmony_ci
21798c2ecf20Sopenharmony_ci	for (i = 0, irq_cnt_init = 0 ; i < cq_cnt ; i++, irq_cnt_init++) {
21808c2ecf20Sopenharmony_ci		irq = pci_irq_vector(hdev->pdev, i);
21818c2ecf20Sopenharmony_ci		rc = request_irq(irq, hl_irq_handler_cq, 0, goya_irq_name[i],
21828c2ecf20Sopenharmony_ci				&hdev->completion_queue[i]);
21838c2ecf20Sopenharmony_ci		if (rc) {
21848c2ecf20Sopenharmony_ci			dev_err(hdev->dev, "Failed to request IRQ %d", irq);
21858c2ecf20Sopenharmony_ci			goto free_irqs;
21868c2ecf20Sopenharmony_ci		}
21878c2ecf20Sopenharmony_ci	}
21888c2ecf20Sopenharmony_ci
21898c2ecf20Sopenharmony_ci	irq = pci_irq_vector(hdev->pdev, GOYA_EVENT_QUEUE_MSIX_IDX);
21908c2ecf20Sopenharmony_ci
21918c2ecf20Sopenharmony_ci	rc = request_irq(irq, hl_irq_handler_eq, 0,
21928c2ecf20Sopenharmony_ci			goya_irq_name[GOYA_EVENT_QUEUE_MSIX_IDX],
21938c2ecf20Sopenharmony_ci			&hdev->event_queue);
21948c2ecf20Sopenharmony_ci	if (rc) {
21958c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "Failed to request IRQ %d", irq);
21968c2ecf20Sopenharmony_ci		goto free_irqs;
21978c2ecf20Sopenharmony_ci	}
21988c2ecf20Sopenharmony_ci
21998c2ecf20Sopenharmony_ci	goya->hw_cap_initialized |= HW_CAP_MSIX;
22008c2ecf20Sopenharmony_ci	return 0;
22018c2ecf20Sopenharmony_ci
22028c2ecf20Sopenharmony_cifree_irqs:
22038c2ecf20Sopenharmony_ci	for (i = 0 ; i < irq_cnt_init ; i++)
22048c2ecf20Sopenharmony_ci		free_irq(pci_irq_vector(hdev->pdev, i),
22058c2ecf20Sopenharmony_ci			&hdev->completion_queue[i]);
22068c2ecf20Sopenharmony_ci
22078c2ecf20Sopenharmony_ci	pci_free_irq_vectors(hdev->pdev);
22088c2ecf20Sopenharmony_ci	return rc;
22098c2ecf20Sopenharmony_ci}
22108c2ecf20Sopenharmony_ci
22118c2ecf20Sopenharmony_cistatic void goya_sync_irqs(struct hl_device *hdev)
22128c2ecf20Sopenharmony_ci{
22138c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
22148c2ecf20Sopenharmony_ci	int i;
22158c2ecf20Sopenharmony_ci
22168c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_MSIX))
22178c2ecf20Sopenharmony_ci		return;
22188c2ecf20Sopenharmony_ci
22198c2ecf20Sopenharmony_ci	/* Wait for all pending IRQs to be finished */
22208c2ecf20Sopenharmony_ci	for (i = 0 ; i < hdev->asic_prop.completion_queues_count ; i++)
22218c2ecf20Sopenharmony_ci		synchronize_irq(pci_irq_vector(hdev->pdev, i));
22228c2ecf20Sopenharmony_ci
22238c2ecf20Sopenharmony_ci	synchronize_irq(pci_irq_vector(hdev->pdev, GOYA_EVENT_QUEUE_MSIX_IDX));
22248c2ecf20Sopenharmony_ci}
22258c2ecf20Sopenharmony_ci
22268c2ecf20Sopenharmony_cistatic void goya_disable_msix(struct hl_device *hdev)
22278c2ecf20Sopenharmony_ci{
22288c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
22298c2ecf20Sopenharmony_ci	int i, irq;
22308c2ecf20Sopenharmony_ci
22318c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_MSIX))
22328c2ecf20Sopenharmony_ci		return;
22338c2ecf20Sopenharmony_ci
22348c2ecf20Sopenharmony_ci	goya_sync_irqs(hdev);
22358c2ecf20Sopenharmony_ci
22368c2ecf20Sopenharmony_ci	irq = pci_irq_vector(hdev->pdev, GOYA_EVENT_QUEUE_MSIX_IDX);
22378c2ecf20Sopenharmony_ci	free_irq(irq, &hdev->event_queue);
22388c2ecf20Sopenharmony_ci
22398c2ecf20Sopenharmony_ci	for (i = 0 ; i < hdev->asic_prop.completion_queues_count ; i++) {
22408c2ecf20Sopenharmony_ci		irq = pci_irq_vector(hdev->pdev, i);
22418c2ecf20Sopenharmony_ci		free_irq(irq, &hdev->completion_queue[i]);
22428c2ecf20Sopenharmony_ci	}
22438c2ecf20Sopenharmony_ci
22448c2ecf20Sopenharmony_ci	pci_free_irq_vectors(hdev->pdev);
22458c2ecf20Sopenharmony_ci
22468c2ecf20Sopenharmony_ci	goya->hw_cap_initialized &= ~HW_CAP_MSIX;
22478c2ecf20Sopenharmony_ci}
22488c2ecf20Sopenharmony_ci
22498c2ecf20Sopenharmony_cistatic void goya_enable_timestamp(struct hl_device *hdev)
22508c2ecf20Sopenharmony_ci{
22518c2ecf20Sopenharmony_ci	/* Disable the timestamp counter */
22528c2ecf20Sopenharmony_ci	WREG32(mmPSOC_TIMESTAMP_BASE - CFG_BASE, 0);
22538c2ecf20Sopenharmony_ci
22548c2ecf20Sopenharmony_ci	/* Zero the lower/upper parts of the 64-bit counter */
22558c2ecf20Sopenharmony_ci	WREG32(mmPSOC_TIMESTAMP_BASE - CFG_BASE + 0xC, 0);
22568c2ecf20Sopenharmony_ci	WREG32(mmPSOC_TIMESTAMP_BASE - CFG_BASE + 0x8, 0);
22578c2ecf20Sopenharmony_ci
22588c2ecf20Sopenharmony_ci	/* Enable the counter */
22598c2ecf20Sopenharmony_ci	WREG32(mmPSOC_TIMESTAMP_BASE - CFG_BASE, 1);
22608c2ecf20Sopenharmony_ci}
22618c2ecf20Sopenharmony_ci
22628c2ecf20Sopenharmony_cistatic void goya_disable_timestamp(struct hl_device *hdev)
22638c2ecf20Sopenharmony_ci{
22648c2ecf20Sopenharmony_ci	/* Disable the timestamp counter */
22658c2ecf20Sopenharmony_ci	WREG32(mmPSOC_TIMESTAMP_BASE - CFG_BASE, 0);
22668c2ecf20Sopenharmony_ci}
22678c2ecf20Sopenharmony_ci
22688c2ecf20Sopenharmony_cistatic void goya_halt_engines(struct hl_device *hdev, bool hard_reset)
22698c2ecf20Sopenharmony_ci{
22708c2ecf20Sopenharmony_ci	u32 wait_timeout_ms;
22718c2ecf20Sopenharmony_ci
22728c2ecf20Sopenharmony_ci	dev_info(hdev->dev,
22738c2ecf20Sopenharmony_ci		"Halting compute engines and disabling interrupts\n");
22748c2ecf20Sopenharmony_ci
22758c2ecf20Sopenharmony_ci	if (hdev->pldm)
22768c2ecf20Sopenharmony_ci		wait_timeout_ms = GOYA_PLDM_RESET_WAIT_MSEC;
22778c2ecf20Sopenharmony_ci	else
22788c2ecf20Sopenharmony_ci		wait_timeout_ms = GOYA_RESET_WAIT_MSEC;
22798c2ecf20Sopenharmony_ci
22808c2ecf20Sopenharmony_ci	goya_stop_external_queues(hdev);
22818c2ecf20Sopenharmony_ci	goya_stop_internal_queues(hdev);
22828c2ecf20Sopenharmony_ci
22838c2ecf20Sopenharmony_ci	msleep(wait_timeout_ms);
22848c2ecf20Sopenharmony_ci
22858c2ecf20Sopenharmony_ci	goya_dma_stall(hdev);
22868c2ecf20Sopenharmony_ci	goya_tpc_stall(hdev);
22878c2ecf20Sopenharmony_ci	goya_mme_stall(hdev);
22888c2ecf20Sopenharmony_ci
22898c2ecf20Sopenharmony_ci	msleep(wait_timeout_ms);
22908c2ecf20Sopenharmony_ci
22918c2ecf20Sopenharmony_ci	goya_disable_external_queues(hdev);
22928c2ecf20Sopenharmony_ci	goya_disable_internal_queues(hdev);
22938c2ecf20Sopenharmony_ci
22948c2ecf20Sopenharmony_ci	goya_disable_timestamp(hdev);
22958c2ecf20Sopenharmony_ci
22968c2ecf20Sopenharmony_ci	if (hard_reset) {
22978c2ecf20Sopenharmony_ci		goya_disable_msix(hdev);
22988c2ecf20Sopenharmony_ci		goya_mmu_remove_device_cpu_mappings(hdev);
22998c2ecf20Sopenharmony_ci	} else {
23008c2ecf20Sopenharmony_ci		goya_sync_irqs(hdev);
23018c2ecf20Sopenharmony_ci	}
23028c2ecf20Sopenharmony_ci}
23038c2ecf20Sopenharmony_ci
23048c2ecf20Sopenharmony_ci/*
23058c2ecf20Sopenharmony_ci * goya_load_firmware_to_device() - Load LINUX FW code to device.
23068c2ecf20Sopenharmony_ci * @hdev: Pointer to hl_device structure.
23078c2ecf20Sopenharmony_ci *
23088c2ecf20Sopenharmony_ci * Copy LINUX fw code from firmware file to HBM BAR.
23098c2ecf20Sopenharmony_ci *
23108c2ecf20Sopenharmony_ci * Return: 0 on success, non-zero for failure.
23118c2ecf20Sopenharmony_ci */
23128c2ecf20Sopenharmony_cistatic int goya_load_firmware_to_device(struct hl_device *hdev)
23138c2ecf20Sopenharmony_ci{
23148c2ecf20Sopenharmony_ci	void __iomem *dst;
23158c2ecf20Sopenharmony_ci
23168c2ecf20Sopenharmony_ci	dst = hdev->pcie_bar[DDR_BAR_ID] + LINUX_FW_OFFSET;
23178c2ecf20Sopenharmony_ci
23188c2ecf20Sopenharmony_ci	return hl_fw_load_fw_to_device(hdev, GOYA_LINUX_FW_FILE, dst);
23198c2ecf20Sopenharmony_ci}
23208c2ecf20Sopenharmony_ci
23218c2ecf20Sopenharmony_ci/*
23228c2ecf20Sopenharmony_ci * goya_load_boot_fit_to_device() - Load boot fit to device.
23238c2ecf20Sopenharmony_ci * @hdev: Pointer to hl_device structure.
23248c2ecf20Sopenharmony_ci *
23258c2ecf20Sopenharmony_ci * Copy boot fit file to SRAM BAR.
23268c2ecf20Sopenharmony_ci *
23278c2ecf20Sopenharmony_ci * Return: 0 on success, non-zero for failure.
23288c2ecf20Sopenharmony_ci */
23298c2ecf20Sopenharmony_cistatic int goya_load_boot_fit_to_device(struct hl_device *hdev)
23308c2ecf20Sopenharmony_ci{
23318c2ecf20Sopenharmony_ci	void __iomem *dst;
23328c2ecf20Sopenharmony_ci
23338c2ecf20Sopenharmony_ci	dst = hdev->pcie_bar[SRAM_CFG_BAR_ID] + BOOT_FIT_SRAM_OFFSET;
23348c2ecf20Sopenharmony_ci
23358c2ecf20Sopenharmony_ci	return hl_fw_load_fw_to_device(hdev, GOYA_BOOT_FIT_FILE, dst);
23368c2ecf20Sopenharmony_ci}
23378c2ecf20Sopenharmony_ci
23388c2ecf20Sopenharmony_ci/*
23398c2ecf20Sopenharmony_ci * FW component passes an offset from SRAM_BASE_ADDR in SCRATCHPAD_xx.
23408c2ecf20Sopenharmony_ci * The version string should be located by that offset.
23418c2ecf20Sopenharmony_ci */
23428c2ecf20Sopenharmony_cistatic void goya_read_device_fw_version(struct hl_device *hdev,
23438c2ecf20Sopenharmony_ci					enum hl_fw_component fwc)
23448c2ecf20Sopenharmony_ci{
23458c2ecf20Sopenharmony_ci	const char *name;
23468c2ecf20Sopenharmony_ci	u32 ver_off;
23478c2ecf20Sopenharmony_ci	char *dest;
23488c2ecf20Sopenharmony_ci
23498c2ecf20Sopenharmony_ci	switch (fwc) {
23508c2ecf20Sopenharmony_ci	case FW_COMP_UBOOT:
23518c2ecf20Sopenharmony_ci		ver_off = RREG32(mmUBOOT_VER_OFFSET);
23528c2ecf20Sopenharmony_ci		dest = hdev->asic_prop.uboot_ver;
23538c2ecf20Sopenharmony_ci		name = "U-Boot";
23548c2ecf20Sopenharmony_ci		break;
23558c2ecf20Sopenharmony_ci	case FW_COMP_PREBOOT:
23568c2ecf20Sopenharmony_ci		ver_off = RREG32(mmPREBOOT_VER_OFFSET);
23578c2ecf20Sopenharmony_ci		dest = hdev->asic_prop.preboot_ver;
23588c2ecf20Sopenharmony_ci		name = "Preboot";
23598c2ecf20Sopenharmony_ci		break;
23608c2ecf20Sopenharmony_ci	default:
23618c2ecf20Sopenharmony_ci		dev_warn(hdev->dev, "Undefined FW component: %d\n", fwc);
23628c2ecf20Sopenharmony_ci		return;
23638c2ecf20Sopenharmony_ci	}
23648c2ecf20Sopenharmony_ci
23658c2ecf20Sopenharmony_ci	ver_off &= ~((u32)SRAM_BASE_ADDR);
23668c2ecf20Sopenharmony_ci
23678c2ecf20Sopenharmony_ci	if (ver_off < SRAM_SIZE - VERSION_MAX_LEN) {
23688c2ecf20Sopenharmony_ci		memcpy_fromio(dest, hdev->pcie_bar[SRAM_CFG_BAR_ID] + ver_off,
23698c2ecf20Sopenharmony_ci							VERSION_MAX_LEN);
23708c2ecf20Sopenharmony_ci	} else {
23718c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "%s version offset (0x%x) is above SRAM\n",
23728c2ecf20Sopenharmony_ci								name, ver_off);
23738c2ecf20Sopenharmony_ci		strcpy(dest, "unavailable");
23748c2ecf20Sopenharmony_ci	}
23758c2ecf20Sopenharmony_ci}
23768c2ecf20Sopenharmony_ci
23778c2ecf20Sopenharmony_cistatic int goya_init_cpu(struct hl_device *hdev)
23788c2ecf20Sopenharmony_ci{
23798c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
23808c2ecf20Sopenharmony_ci	int rc;
23818c2ecf20Sopenharmony_ci
23828c2ecf20Sopenharmony_ci	if (!hdev->cpu_enable)
23838c2ecf20Sopenharmony_ci		return 0;
23848c2ecf20Sopenharmony_ci
23858c2ecf20Sopenharmony_ci	if (goya->hw_cap_initialized & HW_CAP_CPU)
23868c2ecf20Sopenharmony_ci		return 0;
23878c2ecf20Sopenharmony_ci
23888c2ecf20Sopenharmony_ci	/*
23898c2ecf20Sopenharmony_ci	 * Before pushing u-boot/linux to device, need to set the ddr bar to
23908c2ecf20Sopenharmony_ci	 * base address of dram
23918c2ecf20Sopenharmony_ci	 */
23928c2ecf20Sopenharmony_ci	if (goya_set_ddr_bar_base(hdev, DRAM_PHYS_BASE) == U64_MAX) {
23938c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
23948c2ecf20Sopenharmony_ci			"failed to map DDR bar to DRAM base address\n");
23958c2ecf20Sopenharmony_ci		return -EIO;
23968c2ecf20Sopenharmony_ci	}
23978c2ecf20Sopenharmony_ci
23988c2ecf20Sopenharmony_ci	rc = hl_fw_init_cpu(hdev, mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS,
23998c2ecf20Sopenharmony_ci			mmPSOC_GLOBAL_CONF_UBOOT_MAGIC,
24008c2ecf20Sopenharmony_ci			mmCPU_CMD_STATUS_TO_HOST, mmCPU_BOOT_ERR0,
24018c2ecf20Sopenharmony_ci			false, GOYA_CPU_TIMEOUT_USEC,
24028c2ecf20Sopenharmony_ci			GOYA_BOOT_FIT_REQ_TIMEOUT_USEC);
24038c2ecf20Sopenharmony_ci
24048c2ecf20Sopenharmony_ci	if (rc)
24058c2ecf20Sopenharmony_ci		return rc;
24068c2ecf20Sopenharmony_ci
24078c2ecf20Sopenharmony_ci	goya->hw_cap_initialized |= HW_CAP_CPU;
24088c2ecf20Sopenharmony_ci
24098c2ecf20Sopenharmony_ci	return 0;
24108c2ecf20Sopenharmony_ci}
24118c2ecf20Sopenharmony_ci
24128c2ecf20Sopenharmony_cistatic int goya_mmu_update_asid_hop0_addr(struct hl_device *hdev, u32 asid,
24138c2ecf20Sopenharmony_ci						u64 phys_addr)
24148c2ecf20Sopenharmony_ci{
24158c2ecf20Sopenharmony_ci	u32 status, timeout_usec;
24168c2ecf20Sopenharmony_ci	int rc;
24178c2ecf20Sopenharmony_ci
24188c2ecf20Sopenharmony_ci	if (hdev->pldm)
24198c2ecf20Sopenharmony_ci		timeout_usec = GOYA_PLDM_MMU_TIMEOUT_USEC;
24208c2ecf20Sopenharmony_ci	else
24218c2ecf20Sopenharmony_ci		timeout_usec = MMU_CONFIG_TIMEOUT_USEC;
24228c2ecf20Sopenharmony_ci
24238c2ecf20Sopenharmony_ci	WREG32(MMU_HOP0_PA43_12, phys_addr >> MMU_HOP0_PA43_12_SHIFT);
24248c2ecf20Sopenharmony_ci	WREG32(MMU_HOP0_PA49_44, phys_addr >> MMU_HOP0_PA49_44_SHIFT);
24258c2ecf20Sopenharmony_ci	WREG32(MMU_ASID_BUSY, 0x80000000 | asid);
24268c2ecf20Sopenharmony_ci
24278c2ecf20Sopenharmony_ci	rc = hl_poll_timeout(
24288c2ecf20Sopenharmony_ci		hdev,
24298c2ecf20Sopenharmony_ci		MMU_ASID_BUSY,
24308c2ecf20Sopenharmony_ci		status,
24318c2ecf20Sopenharmony_ci		!(status & 0x80000000),
24328c2ecf20Sopenharmony_ci		1000,
24338c2ecf20Sopenharmony_ci		timeout_usec);
24348c2ecf20Sopenharmony_ci
24358c2ecf20Sopenharmony_ci	if (rc) {
24368c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
24378c2ecf20Sopenharmony_ci			"Timeout during MMU hop0 config of asid %d\n", asid);
24388c2ecf20Sopenharmony_ci		return rc;
24398c2ecf20Sopenharmony_ci	}
24408c2ecf20Sopenharmony_ci
24418c2ecf20Sopenharmony_ci	return 0;
24428c2ecf20Sopenharmony_ci}
24438c2ecf20Sopenharmony_ci
24448c2ecf20Sopenharmony_ciint goya_mmu_init(struct hl_device *hdev)
24458c2ecf20Sopenharmony_ci{
24468c2ecf20Sopenharmony_ci	struct asic_fixed_properties *prop = &hdev->asic_prop;
24478c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
24488c2ecf20Sopenharmony_ci	u64 hop0_addr;
24498c2ecf20Sopenharmony_ci	int rc, i;
24508c2ecf20Sopenharmony_ci
24518c2ecf20Sopenharmony_ci	if (!hdev->mmu_enable)
24528c2ecf20Sopenharmony_ci		return 0;
24538c2ecf20Sopenharmony_ci
24548c2ecf20Sopenharmony_ci	if (goya->hw_cap_initialized & HW_CAP_MMU)
24558c2ecf20Sopenharmony_ci		return 0;
24568c2ecf20Sopenharmony_ci
24578c2ecf20Sopenharmony_ci	hdev->dram_supports_virtual_memory = true;
24588c2ecf20Sopenharmony_ci	hdev->dram_default_page_mapping = true;
24598c2ecf20Sopenharmony_ci
24608c2ecf20Sopenharmony_ci	for (i = 0 ; i < prop->max_asid ; i++) {
24618c2ecf20Sopenharmony_ci		hop0_addr = prop->mmu_pgt_addr +
24628c2ecf20Sopenharmony_ci				(i * prop->mmu_hop_table_size);
24638c2ecf20Sopenharmony_ci
24648c2ecf20Sopenharmony_ci		rc = goya_mmu_update_asid_hop0_addr(hdev, i, hop0_addr);
24658c2ecf20Sopenharmony_ci		if (rc) {
24668c2ecf20Sopenharmony_ci			dev_err(hdev->dev,
24678c2ecf20Sopenharmony_ci				"failed to set hop0 addr for asid %d\n", i);
24688c2ecf20Sopenharmony_ci			goto err;
24698c2ecf20Sopenharmony_ci		}
24708c2ecf20Sopenharmony_ci	}
24718c2ecf20Sopenharmony_ci
24728c2ecf20Sopenharmony_ci	goya->hw_cap_initialized |= HW_CAP_MMU;
24738c2ecf20Sopenharmony_ci
24748c2ecf20Sopenharmony_ci	/* init MMU cache manage page */
24758c2ecf20Sopenharmony_ci	WREG32(mmSTLB_CACHE_INV_BASE_39_8,
24768c2ecf20Sopenharmony_ci				lower_32_bits(MMU_CACHE_MNG_ADDR >> 8));
24778c2ecf20Sopenharmony_ci	WREG32(mmSTLB_CACHE_INV_BASE_49_40, MMU_CACHE_MNG_ADDR >> 40);
24788c2ecf20Sopenharmony_ci
24798c2ecf20Sopenharmony_ci	/* Remove follower feature due to performance bug */
24808c2ecf20Sopenharmony_ci	WREG32_AND(mmSTLB_STLB_FEATURE_EN,
24818c2ecf20Sopenharmony_ci			(~STLB_STLB_FEATURE_EN_FOLLOWER_EN_MASK));
24828c2ecf20Sopenharmony_ci
24838c2ecf20Sopenharmony_ci	hdev->asic_funcs->mmu_invalidate_cache(hdev, true,
24848c2ecf20Sopenharmony_ci					VM_TYPE_USERPTR | VM_TYPE_PHYS_PACK);
24858c2ecf20Sopenharmony_ci
24868c2ecf20Sopenharmony_ci	WREG32(mmMMU_MMU_ENABLE, 1);
24878c2ecf20Sopenharmony_ci	WREG32(mmMMU_SPI_MASK, 0xF);
24888c2ecf20Sopenharmony_ci
24898c2ecf20Sopenharmony_ci	return 0;
24908c2ecf20Sopenharmony_ci
24918c2ecf20Sopenharmony_cierr:
24928c2ecf20Sopenharmony_ci	return rc;
24938c2ecf20Sopenharmony_ci}
24948c2ecf20Sopenharmony_ci
24958c2ecf20Sopenharmony_ci/*
24968c2ecf20Sopenharmony_ci * goya_hw_init - Goya hardware initialization code
24978c2ecf20Sopenharmony_ci *
24988c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
24998c2ecf20Sopenharmony_ci *
25008c2ecf20Sopenharmony_ci * Returns 0 on success
25018c2ecf20Sopenharmony_ci *
25028c2ecf20Sopenharmony_ci */
25038c2ecf20Sopenharmony_cistatic int goya_hw_init(struct hl_device *hdev)
25048c2ecf20Sopenharmony_ci{
25058c2ecf20Sopenharmony_ci	struct asic_fixed_properties *prop = &hdev->asic_prop;
25068c2ecf20Sopenharmony_ci	int rc;
25078c2ecf20Sopenharmony_ci
25088c2ecf20Sopenharmony_ci	dev_info(hdev->dev, "Starting initialization of H/W\n");
25098c2ecf20Sopenharmony_ci
25108c2ecf20Sopenharmony_ci	/* Perform read from the device to make sure device is up */
25118c2ecf20Sopenharmony_ci	RREG32(mmPCIE_DBI_DEVICE_ID_VENDOR_ID_REG);
25128c2ecf20Sopenharmony_ci
25138c2ecf20Sopenharmony_ci	/*
25148c2ecf20Sopenharmony_ci	 * Let's mark in the H/W that we have reached this point. We check
25158c2ecf20Sopenharmony_ci	 * this value in the reset_before_init function to understand whether
25168c2ecf20Sopenharmony_ci	 * we need to reset the chip before doing H/W init. This register is
25178c2ecf20Sopenharmony_ci	 * cleared by the H/W upon H/W reset
25188c2ecf20Sopenharmony_ci	 */
25198c2ecf20Sopenharmony_ci	WREG32(mmHW_STATE, HL_DEVICE_HW_STATE_DIRTY);
25208c2ecf20Sopenharmony_ci
25218c2ecf20Sopenharmony_ci	rc = goya_init_cpu(hdev);
25228c2ecf20Sopenharmony_ci	if (rc) {
25238c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to initialize CPU\n");
25248c2ecf20Sopenharmony_ci		return rc;
25258c2ecf20Sopenharmony_ci	}
25268c2ecf20Sopenharmony_ci
25278c2ecf20Sopenharmony_ci	goya_tpc_mbist_workaround(hdev);
25288c2ecf20Sopenharmony_ci
25298c2ecf20Sopenharmony_ci	goya_init_golden_registers(hdev);
25308c2ecf20Sopenharmony_ci
25318c2ecf20Sopenharmony_ci	/*
25328c2ecf20Sopenharmony_ci	 * After CPU initialization is finished, change DDR bar mapping inside
25338c2ecf20Sopenharmony_ci	 * iATU to point to the start address of the MMU page tables
25348c2ecf20Sopenharmony_ci	 */
25358c2ecf20Sopenharmony_ci	if (goya_set_ddr_bar_base(hdev, (MMU_PAGE_TABLES_ADDR &
25368c2ecf20Sopenharmony_ci			~(prop->dram_pci_bar_size - 0x1ull))) == U64_MAX) {
25378c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
25388c2ecf20Sopenharmony_ci			"failed to map DDR bar to MMU page tables\n");
25398c2ecf20Sopenharmony_ci		return -EIO;
25408c2ecf20Sopenharmony_ci	}
25418c2ecf20Sopenharmony_ci
25428c2ecf20Sopenharmony_ci	rc = goya_mmu_init(hdev);
25438c2ecf20Sopenharmony_ci	if (rc)
25448c2ecf20Sopenharmony_ci		return rc;
25458c2ecf20Sopenharmony_ci
25468c2ecf20Sopenharmony_ci	goya_init_security(hdev);
25478c2ecf20Sopenharmony_ci
25488c2ecf20Sopenharmony_ci	goya_init_dma_qmans(hdev);
25498c2ecf20Sopenharmony_ci
25508c2ecf20Sopenharmony_ci	goya_init_mme_qmans(hdev);
25518c2ecf20Sopenharmony_ci
25528c2ecf20Sopenharmony_ci	goya_init_tpc_qmans(hdev);
25538c2ecf20Sopenharmony_ci
25548c2ecf20Sopenharmony_ci	goya_enable_timestamp(hdev);
25558c2ecf20Sopenharmony_ci
25568c2ecf20Sopenharmony_ci	/* MSI-X must be enabled before CPU queues are initialized */
25578c2ecf20Sopenharmony_ci	rc = goya_enable_msix(hdev);
25588c2ecf20Sopenharmony_ci	if (rc)
25598c2ecf20Sopenharmony_ci		goto disable_queues;
25608c2ecf20Sopenharmony_ci
25618c2ecf20Sopenharmony_ci	/* Perform read from the device to flush all MSI-X configuration */
25628c2ecf20Sopenharmony_ci	RREG32(mmPCIE_DBI_DEVICE_ID_VENDOR_ID_REG);
25638c2ecf20Sopenharmony_ci
25648c2ecf20Sopenharmony_ci	return 0;
25658c2ecf20Sopenharmony_ci
25668c2ecf20Sopenharmony_cidisable_queues:
25678c2ecf20Sopenharmony_ci	goya_disable_internal_queues(hdev);
25688c2ecf20Sopenharmony_ci	goya_disable_external_queues(hdev);
25698c2ecf20Sopenharmony_ci
25708c2ecf20Sopenharmony_ci	return rc;
25718c2ecf20Sopenharmony_ci}
25728c2ecf20Sopenharmony_ci
25738c2ecf20Sopenharmony_ci/*
25748c2ecf20Sopenharmony_ci * goya_hw_fini - Goya hardware tear-down code
25758c2ecf20Sopenharmony_ci *
25768c2ecf20Sopenharmony_ci * @hdev: pointer to hl_device structure
25778c2ecf20Sopenharmony_ci * @hard_reset: should we do hard reset to all engines or just reset the
25788c2ecf20Sopenharmony_ci *              compute/dma engines
25798c2ecf20Sopenharmony_ci */
25808c2ecf20Sopenharmony_cistatic void goya_hw_fini(struct hl_device *hdev, bool hard_reset)
25818c2ecf20Sopenharmony_ci{
25828c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
25838c2ecf20Sopenharmony_ci	u32 reset_timeout_ms, cpu_timeout_ms, status;
25848c2ecf20Sopenharmony_ci
25858c2ecf20Sopenharmony_ci	if (hdev->pldm) {
25868c2ecf20Sopenharmony_ci		reset_timeout_ms = GOYA_PLDM_RESET_TIMEOUT_MSEC;
25878c2ecf20Sopenharmony_ci		cpu_timeout_ms = GOYA_PLDM_RESET_WAIT_MSEC;
25888c2ecf20Sopenharmony_ci	} else {
25898c2ecf20Sopenharmony_ci		reset_timeout_ms = GOYA_RESET_TIMEOUT_MSEC;
25908c2ecf20Sopenharmony_ci		cpu_timeout_ms = GOYA_CPU_RESET_WAIT_MSEC;
25918c2ecf20Sopenharmony_ci	}
25928c2ecf20Sopenharmony_ci
25938c2ecf20Sopenharmony_ci	if (hard_reset) {
25948c2ecf20Sopenharmony_ci		/* I don't know what is the state of the CPU so make sure it is
25958c2ecf20Sopenharmony_ci		 * stopped in any means necessary
25968c2ecf20Sopenharmony_ci		 */
25978c2ecf20Sopenharmony_ci		WREG32(mmPSOC_GLOBAL_CONF_UBOOT_MAGIC, KMD_MSG_GOTO_WFE);
25988c2ecf20Sopenharmony_ci		WREG32(mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR,
25998c2ecf20Sopenharmony_ci			GOYA_ASYNC_EVENT_ID_HALT_MACHINE);
26008c2ecf20Sopenharmony_ci
26018c2ecf20Sopenharmony_ci		msleep(cpu_timeout_ms);
26028c2ecf20Sopenharmony_ci
26038c2ecf20Sopenharmony_ci		goya_set_ddr_bar_base(hdev, DRAM_PHYS_BASE);
26048c2ecf20Sopenharmony_ci		goya_disable_clk_rlx(hdev);
26058c2ecf20Sopenharmony_ci		goya_set_pll_refclk(hdev);
26068c2ecf20Sopenharmony_ci
26078c2ecf20Sopenharmony_ci		WREG32(mmPSOC_GLOBAL_CONF_SW_ALL_RST_CFG, RESET_ALL);
26088c2ecf20Sopenharmony_ci		dev_info(hdev->dev,
26098c2ecf20Sopenharmony_ci			"Issued HARD reset command, going to wait %dms\n",
26108c2ecf20Sopenharmony_ci			reset_timeout_ms);
26118c2ecf20Sopenharmony_ci	} else {
26128c2ecf20Sopenharmony_ci		WREG32(mmPSOC_GLOBAL_CONF_SW_ALL_RST_CFG, DMA_MME_TPC_RESET);
26138c2ecf20Sopenharmony_ci		dev_info(hdev->dev,
26148c2ecf20Sopenharmony_ci			"Issued SOFT reset command, going to wait %dms\n",
26158c2ecf20Sopenharmony_ci			reset_timeout_ms);
26168c2ecf20Sopenharmony_ci	}
26178c2ecf20Sopenharmony_ci
26188c2ecf20Sopenharmony_ci	/*
26198c2ecf20Sopenharmony_ci	 * After hard reset, we can't poll the BTM_FSM register because the PSOC
26208c2ecf20Sopenharmony_ci	 * itself is in reset. In either reset we need to wait until the reset
26218c2ecf20Sopenharmony_ci	 * is deasserted
26228c2ecf20Sopenharmony_ci	 */
26238c2ecf20Sopenharmony_ci	msleep(reset_timeout_ms);
26248c2ecf20Sopenharmony_ci
26258c2ecf20Sopenharmony_ci	status = RREG32(mmPSOC_GLOBAL_CONF_BTM_FSM);
26268c2ecf20Sopenharmony_ci	if (status & PSOC_GLOBAL_CONF_BTM_FSM_STATE_MASK)
26278c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
26288c2ecf20Sopenharmony_ci			"Timeout while waiting for device to reset 0x%x\n",
26298c2ecf20Sopenharmony_ci			status);
26308c2ecf20Sopenharmony_ci
26318c2ecf20Sopenharmony_ci	if (!hard_reset) {
26328c2ecf20Sopenharmony_ci		goya->hw_cap_initialized &= ~(HW_CAP_DMA | HW_CAP_MME |
26338c2ecf20Sopenharmony_ci						HW_CAP_GOLDEN | HW_CAP_TPC);
26348c2ecf20Sopenharmony_ci		WREG32(mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR,
26358c2ecf20Sopenharmony_ci				GOYA_ASYNC_EVENT_ID_SOFT_RESET);
26368c2ecf20Sopenharmony_ci		return;
26378c2ecf20Sopenharmony_ci	}
26388c2ecf20Sopenharmony_ci
26398c2ecf20Sopenharmony_ci	/* Chicken bit to re-initiate boot sequencer flow */
26408c2ecf20Sopenharmony_ci	WREG32(mmPSOC_GLOBAL_CONF_BOOT_SEQ_RE_START,
26418c2ecf20Sopenharmony_ci		1 << PSOC_GLOBAL_CONF_BOOT_SEQ_RE_START_IND_SHIFT);
26428c2ecf20Sopenharmony_ci	/* Move boot manager FSM to pre boot sequencer init state */
26438c2ecf20Sopenharmony_ci	WREG32(mmPSOC_GLOBAL_CONF_SW_BTM_FSM,
26448c2ecf20Sopenharmony_ci			0xA << PSOC_GLOBAL_CONF_SW_BTM_FSM_CTRL_SHIFT);
26458c2ecf20Sopenharmony_ci
26468c2ecf20Sopenharmony_ci	goya->hw_cap_initialized &= ~(HW_CAP_CPU | HW_CAP_CPU_Q |
26478c2ecf20Sopenharmony_ci					HW_CAP_DDR_0 | HW_CAP_DDR_1 |
26488c2ecf20Sopenharmony_ci					HW_CAP_DMA | HW_CAP_MME |
26498c2ecf20Sopenharmony_ci					HW_CAP_MMU | HW_CAP_TPC_MBIST |
26508c2ecf20Sopenharmony_ci					HW_CAP_GOLDEN | HW_CAP_TPC);
26518c2ecf20Sopenharmony_ci	memset(goya->events_stat, 0, sizeof(goya->events_stat));
26528c2ecf20Sopenharmony_ci}
26538c2ecf20Sopenharmony_ci
26548c2ecf20Sopenharmony_ciint goya_suspend(struct hl_device *hdev)
26558c2ecf20Sopenharmony_ci{
26568c2ecf20Sopenharmony_ci	int rc;
26578c2ecf20Sopenharmony_ci
26588c2ecf20Sopenharmony_ci	rc = hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_DISABLE_PCI_ACCESS);
26598c2ecf20Sopenharmony_ci	if (rc)
26608c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "Failed to disable PCI access from CPU\n");
26618c2ecf20Sopenharmony_ci
26628c2ecf20Sopenharmony_ci	return rc;
26638c2ecf20Sopenharmony_ci}
26648c2ecf20Sopenharmony_ci
26658c2ecf20Sopenharmony_ciint goya_resume(struct hl_device *hdev)
26668c2ecf20Sopenharmony_ci{
26678c2ecf20Sopenharmony_ci	return goya_init_iatu(hdev);
26688c2ecf20Sopenharmony_ci}
26698c2ecf20Sopenharmony_ci
26708c2ecf20Sopenharmony_cistatic int goya_cb_mmap(struct hl_device *hdev, struct vm_area_struct *vma,
26718c2ecf20Sopenharmony_ci			void *cpu_addr, dma_addr_t dma_addr, size_t size)
26728c2ecf20Sopenharmony_ci{
26738c2ecf20Sopenharmony_ci	int rc;
26748c2ecf20Sopenharmony_ci
26758c2ecf20Sopenharmony_ci	vma->vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
26768c2ecf20Sopenharmony_ci			VM_DONTCOPY | VM_NORESERVE;
26778c2ecf20Sopenharmony_ci
26788c2ecf20Sopenharmony_ci	rc = dma_mmap_coherent(hdev->dev, vma, cpu_addr,
26798c2ecf20Sopenharmony_ci				(dma_addr - HOST_PHYS_BASE), size);
26808c2ecf20Sopenharmony_ci	if (rc)
26818c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "dma_mmap_coherent error %d", rc);
26828c2ecf20Sopenharmony_ci
26838c2ecf20Sopenharmony_ci	return rc;
26848c2ecf20Sopenharmony_ci}
26858c2ecf20Sopenharmony_ci
26868c2ecf20Sopenharmony_civoid goya_ring_doorbell(struct hl_device *hdev, u32 hw_queue_id, u32 pi)
26878c2ecf20Sopenharmony_ci{
26888c2ecf20Sopenharmony_ci	u32 db_reg_offset, db_value;
26898c2ecf20Sopenharmony_ci
26908c2ecf20Sopenharmony_ci	switch (hw_queue_id) {
26918c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_DMA_0:
26928c2ecf20Sopenharmony_ci		db_reg_offset = mmDMA_QM_0_PQ_PI;
26938c2ecf20Sopenharmony_ci		break;
26948c2ecf20Sopenharmony_ci
26958c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_DMA_1:
26968c2ecf20Sopenharmony_ci		db_reg_offset = mmDMA_QM_1_PQ_PI;
26978c2ecf20Sopenharmony_ci		break;
26988c2ecf20Sopenharmony_ci
26998c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_DMA_2:
27008c2ecf20Sopenharmony_ci		db_reg_offset = mmDMA_QM_2_PQ_PI;
27018c2ecf20Sopenharmony_ci		break;
27028c2ecf20Sopenharmony_ci
27038c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_DMA_3:
27048c2ecf20Sopenharmony_ci		db_reg_offset = mmDMA_QM_3_PQ_PI;
27058c2ecf20Sopenharmony_ci		break;
27068c2ecf20Sopenharmony_ci
27078c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_DMA_4:
27088c2ecf20Sopenharmony_ci		db_reg_offset = mmDMA_QM_4_PQ_PI;
27098c2ecf20Sopenharmony_ci		break;
27108c2ecf20Sopenharmony_ci
27118c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_CPU_PQ:
27128c2ecf20Sopenharmony_ci		db_reg_offset = mmCPU_IF_PF_PQ_PI;
27138c2ecf20Sopenharmony_ci		break;
27148c2ecf20Sopenharmony_ci
27158c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_MME:
27168c2ecf20Sopenharmony_ci		db_reg_offset = mmMME_QM_PQ_PI;
27178c2ecf20Sopenharmony_ci		break;
27188c2ecf20Sopenharmony_ci
27198c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC0:
27208c2ecf20Sopenharmony_ci		db_reg_offset = mmTPC0_QM_PQ_PI;
27218c2ecf20Sopenharmony_ci		break;
27228c2ecf20Sopenharmony_ci
27238c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC1:
27248c2ecf20Sopenharmony_ci		db_reg_offset = mmTPC1_QM_PQ_PI;
27258c2ecf20Sopenharmony_ci		break;
27268c2ecf20Sopenharmony_ci
27278c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC2:
27288c2ecf20Sopenharmony_ci		db_reg_offset = mmTPC2_QM_PQ_PI;
27298c2ecf20Sopenharmony_ci		break;
27308c2ecf20Sopenharmony_ci
27318c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC3:
27328c2ecf20Sopenharmony_ci		db_reg_offset = mmTPC3_QM_PQ_PI;
27338c2ecf20Sopenharmony_ci		break;
27348c2ecf20Sopenharmony_ci
27358c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC4:
27368c2ecf20Sopenharmony_ci		db_reg_offset = mmTPC4_QM_PQ_PI;
27378c2ecf20Sopenharmony_ci		break;
27388c2ecf20Sopenharmony_ci
27398c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC5:
27408c2ecf20Sopenharmony_ci		db_reg_offset = mmTPC5_QM_PQ_PI;
27418c2ecf20Sopenharmony_ci		break;
27428c2ecf20Sopenharmony_ci
27438c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC6:
27448c2ecf20Sopenharmony_ci		db_reg_offset = mmTPC6_QM_PQ_PI;
27458c2ecf20Sopenharmony_ci		break;
27468c2ecf20Sopenharmony_ci
27478c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC7:
27488c2ecf20Sopenharmony_ci		db_reg_offset = mmTPC7_QM_PQ_PI;
27498c2ecf20Sopenharmony_ci		break;
27508c2ecf20Sopenharmony_ci
27518c2ecf20Sopenharmony_ci	default:
27528c2ecf20Sopenharmony_ci		/* Should never get here */
27538c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "H/W queue %d is invalid. Can't set pi\n",
27548c2ecf20Sopenharmony_ci			hw_queue_id);
27558c2ecf20Sopenharmony_ci		return;
27568c2ecf20Sopenharmony_ci	}
27578c2ecf20Sopenharmony_ci
27588c2ecf20Sopenharmony_ci	db_value = pi;
27598c2ecf20Sopenharmony_ci
27608c2ecf20Sopenharmony_ci	/* ring the doorbell */
27618c2ecf20Sopenharmony_ci	WREG32(db_reg_offset, db_value);
27628c2ecf20Sopenharmony_ci
27638c2ecf20Sopenharmony_ci	if (hw_queue_id == GOYA_QUEUE_ID_CPU_PQ)
27648c2ecf20Sopenharmony_ci		WREG32(mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR,
27658c2ecf20Sopenharmony_ci				GOYA_ASYNC_EVENT_ID_PI_UPDATE);
27668c2ecf20Sopenharmony_ci}
27678c2ecf20Sopenharmony_ci
27688c2ecf20Sopenharmony_civoid goya_pqe_write(struct hl_device *hdev, __le64 *pqe, struct hl_bd *bd)
27698c2ecf20Sopenharmony_ci{
27708c2ecf20Sopenharmony_ci	/* The QMANs are on the SRAM so need to copy to IO space */
27718c2ecf20Sopenharmony_ci	memcpy_toio((void __iomem *) pqe, bd, sizeof(struct hl_bd));
27728c2ecf20Sopenharmony_ci}
27738c2ecf20Sopenharmony_ci
27748c2ecf20Sopenharmony_cistatic void *goya_dma_alloc_coherent(struct hl_device *hdev, size_t size,
27758c2ecf20Sopenharmony_ci					dma_addr_t *dma_handle, gfp_t flags)
27768c2ecf20Sopenharmony_ci{
27778c2ecf20Sopenharmony_ci	void *kernel_addr = dma_alloc_coherent(&hdev->pdev->dev, size,
27788c2ecf20Sopenharmony_ci						dma_handle, flags);
27798c2ecf20Sopenharmony_ci
27808c2ecf20Sopenharmony_ci	/* Shift to the device's base physical address of host memory */
27818c2ecf20Sopenharmony_ci	if (kernel_addr)
27828c2ecf20Sopenharmony_ci		*dma_handle += HOST_PHYS_BASE;
27838c2ecf20Sopenharmony_ci
27848c2ecf20Sopenharmony_ci	return kernel_addr;
27858c2ecf20Sopenharmony_ci}
27868c2ecf20Sopenharmony_ci
27878c2ecf20Sopenharmony_cistatic void goya_dma_free_coherent(struct hl_device *hdev, size_t size,
27888c2ecf20Sopenharmony_ci					void *cpu_addr, dma_addr_t dma_handle)
27898c2ecf20Sopenharmony_ci{
27908c2ecf20Sopenharmony_ci	/* Cancel the device's base physical address of host memory */
27918c2ecf20Sopenharmony_ci	dma_addr_t fixed_dma_handle = dma_handle - HOST_PHYS_BASE;
27928c2ecf20Sopenharmony_ci
27938c2ecf20Sopenharmony_ci	dma_free_coherent(&hdev->pdev->dev, size, cpu_addr, fixed_dma_handle);
27948c2ecf20Sopenharmony_ci}
27958c2ecf20Sopenharmony_ci
27968c2ecf20Sopenharmony_civoid *goya_get_int_queue_base(struct hl_device *hdev, u32 queue_id,
27978c2ecf20Sopenharmony_ci				dma_addr_t *dma_handle,	u16 *queue_len)
27988c2ecf20Sopenharmony_ci{
27998c2ecf20Sopenharmony_ci	void *base;
28008c2ecf20Sopenharmony_ci	u32 offset;
28018c2ecf20Sopenharmony_ci
28028c2ecf20Sopenharmony_ci	*dma_handle = hdev->asic_prop.sram_base_address;
28038c2ecf20Sopenharmony_ci
28048c2ecf20Sopenharmony_ci	base = (void *) hdev->pcie_bar[SRAM_CFG_BAR_ID];
28058c2ecf20Sopenharmony_ci
28068c2ecf20Sopenharmony_ci	switch (queue_id) {
28078c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_MME:
28088c2ecf20Sopenharmony_ci		offset = MME_QMAN_BASE_OFFSET;
28098c2ecf20Sopenharmony_ci		*queue_len = MME_QMAN_LENGTH;
28108c2ecf20Sopenharmony_ci		break;
28118c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC0:
28128c2ecf20Sopenharmony_ci		offset = TPC0_QMAN_BASE_OFFSET;
28138c2ecf20Sopenharmony_ci		*queue_len = TPC_QMAN_LENGTH;
28148c2ecf20Sopenharmony_ci		break;
28158c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC1:
28168c2ecf20Sopenharmony_ci		offset = TPC1_QMAN_BASE_OFFSET;
28178c2ecf20Sopenharmony_ci		*queue_len = TPC_QMAN_LENGTH;
28188c2ecf20Sopenharmony_ci		break;
28198c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC2:
28208c2ecf20Sopenharmony_ci		offset = TPC2_QMAN_BASE_OFFSET;
28218c2ecf20Sopenharmony_ci		*queue_len = TPC_QMAN_LENGTH;
28228c2ecf20Sopenharmony_ci		break;
28238c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC3:
28248c2ecf20Sopenharmony_ci		offset = TPC3_QMAN_BASE_OFFSET;
28258c2ecf20Sopenharmony_ci		*queue_len = TPC_QMAN_LENGTH;
28268c2ecf20Sopenharmony_ci		break;
28278c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC4:
28288c2ecf20Sopenharmony_ci		offset = TPC4_QMAN_BASE_OFFSET;
28298c2ecf20Sopenharmony_ci		*queue_len = TPC_QMAN_LENGTH;
28308c2ecf20Sopenharmony_ci		break;
28318c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC5:
28328c2ecf20Sopenharmony_ci		offset = TPC5_QMAN_BASE_OFFSET;
28338c2ecf20Sopenharmony_ci		*queue_len = TPC_QMAN_LENGTH;
28348c2ecf20Sopenharmony_ci		break;
28358c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC6:
28368c2ecf20Sopenharmony_ci		offset = TPC6_QMAN_BASE_OFFSET;
28378c2ecf20Sopenharmony_ci		*queue_len = TPC_QMAN_LENGTH;
28388c2ecf20Sopenharmony_ci		break;
28398c2ecf20Sopenharmony_ci	case GOYA_QUEUE_ID_TPC7:
28408c2ecf20Sopenharmony_ci		offset = TPC7_QMAN_BASE_OFFSET;
28418c2ecf20Sopenharmony_ci		*queue_len = TPC_QMAN_LENGTH;
28428c2ecf20Sopenharmony_ci		break;
28438c2ecf20Sopenharmony_ci	default:
28448c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "Got invalid queue id %d\n", queue_id);
28458c2ecf20Sopenharmony_ci		return NULL;
28468c2ecf20Sopenharmony_ci	}
28478c2ecf20Sopenharmony_ci
28488c2ecf20Sopenharmony_ci	base += offset;
28498c2ecf20Sopenharmony_ci	*dma_handle += offset;
28508c2ecf20Sopenharmony_ci
28518c2ecf20Sopenharmony_ci	return base;
28528c2ecf20Sopenharmony_ci}
28538c2ecf20Sopenharmony_ci
28548c2ecf20Sopenharmony_cistatic int goya_send_job_on_qman0(struct hl_device *hdev, struct hl_cs_job *job)
28558c2ecf20Sopenharmony_ci{
28568c2ecf20Sopenharmony_ci	struct packet_msg_prot *fence_pkt;
28578c2ecf20Sopenharmony_ci	u32 *fence_ptr;
28588c2ecf20Sopenharmony_ci	dma_addr_t fence_dma_addr;
28598c2ecf20Sopenharmony_ci	struct hl_cb *cb;
28608c2ecf20Sopenharmony_ci	u32 tmp, timeout;
28618c2ecf20Sopenharmony_ci	int rc;
28628c2ecf20Sopenharmony_ci
28638c2ecf20Sopenharmony_ci	if (hdev->pldm)
28648c2ecf20Sopenharmony_ci		timeout = GOYA_PLDM_QMAN0_TIMEOUT_USEC;
28658c2ecf20Sopenharmony_ci	else
28668c2ecf20Sopenharmony_ci		timeout = HL_DEVICE_TIMEOUT_USEC;
28678c2ecf20Sopenharmony_ci
28688c2ecf20Sopenharmony_ci	if (!hdev->asic_funcs->is_device_idle(hdev, NULL, NULL)) {
28698c2ecf20Sopenharmony_ci		dev_err_ratelimited(hdev->dev,
28708c2ecf20Sopenharmony_ci			"Can't send driver job on QMAN0 because the device is not idle\n");
28718c2ecf20Sopenharmony_ci		return -EBUSY;
28728c2ecf20Sopenharmony_ci	}
28738c2ecf20Sopenharmony_ci
28748c2ecf20Sopenharmony_ci	fence_ptr = hdev->asic_funcs->asic_dma_pool_zalloc(hdev, 4, GFP_KERNEL,
28758c2ecf20Sopenharmony_ci							&fence_dma_addr);
28768c2ecf20Sopenharmony_ci	if (!fence_ptr) {
28778c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
28788c2ecf20Sopenharmony_ci			"Failed to allocate fence memory for QMAN0\n");
28798c2ecf20Sopenharmony_ci		return -ENOMEM;
28808c2ecf20Sopenharmony_ci	}
28818c2ecf20Sopenharmony_ci
28828c2ecf20Sopenharmony_ci	goya_qman0_set_security(hdev, true);
28838c2ecf20Sopenharmony_ci
28848c2ecf20Sopenharmony_ci	cb = job->patched_cb;
28858c2ecf20Sopenharmony_ci
28868c2ecf20Sopenharmony_ci	fence_pkt = cb->kernel_address +
28878c2ecf20Sopenharmony_ci			job->job_cb_size - sizeof(struct packet_msg_prot);
28888c2ecf20Sopenharmony_ci
28898c2ecf20Sopenharmony_ci	tmp = (PACKET_MSG_PROT << GOYA_PKT_CTL_OPCODE_SHIFT) |
28908c2ecf20Sopenharmony_ci			(1 << GOYA_PKT_CTL_EB_SHIFT) |
28918c2ecf20Sopenharmony_ci			(1 << GOYA_PKT_CTL_MB_SHIFT);
28928c2ecf20Sopenharmony_ci	fence_pkt->ctl = cpu_to_le32(tmp);
28938c2ecf20Sopenharmony_ci	fence_pkt->value = cpu_to_le32(GOYA_QMAN0_FENCE_VAL);
28948c2ecf20Sopenharmony_ci	fence_pkt->addr = cpu_to_le64(fence_dma_addr);
28958c2ecf20Sopenharmony_ci
28968c2ecf20Sopenharmony_ci	rc = hl_hw_queue_send_cb_no_cmpl(hdev, GOYA_QUEUE_ID_DMA_0,
28978c2ecf20Sopenharmony_ci					job->job_cb_size, cb->bus_address);
28988c2ecf20Sopenharmony_ci	if (rc) {
28998c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "Failed to send CB on QMAN0, %d\n", rc);
29008c2ecf20Sopenharmony_ci		goto free_fence_ptr;
29018c2ecf20Sopenharmony_ci	}
29028c2ecf20Sopenharmony_ci
29038c2ecf20Sopenharmony_ci	rc = hl_poll_timeout_memory(hdev, fence_ptr, tmp,
29048c2ecf20Sopenharmony_ci				(tmp == GOYA_QMAN0_FENCE_VAL), 1000,
29058c2ecf20Sopenharmony_ci				timeout, true);
29068c2ecf20Sopenharmony_ci
29078c2ecf20Sopenharmony_ci	hl_hw_queue_inc_ci_kernel(hdev, GOYA_QUEUE_ID_DMA_0);
29088c2ecf20Sopenharmony_ci
29098c2ecf20Sopenharmony_ci	if (rc == -ETIMEDOUT) {
29108c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "QMAN0 Job timeout (0x%x)\n", tmp);
29118c2ecf20Sopenharmony_ci		goto free_fence_ptr;
29128c2ecf20Sopenharmony_ci	}
29138c2ecf20Sopenharmony_ci
29148c2ecf20Sopenharmony_cifree_fence_ptr:
29158c2ecf20Sopenharmony_ci	hdev->asic_funcs->asic_dma_pool_free(hdev, (void *) fence_ptr,
29168c2ecf20Sopenharmony_ci					fence_dma_addr);
29178c2ecf20Sopenharmony_ci
29188c2ecf20Sopenharmony_ci	goya_qman0_set_security(hdev, false);
29198c2ecf20Sopenharmony_ci
29208c2ecf20Sopenharmony_ci	return rc;
29218c2ecf20Sopenharmony_ci}
29228c2ecf20Sopenharmony_ci
29238c2ecf20Sopenharmony_ciint goya_send_cpu_message(struct hl_device *hdev, u32 *msg, u16 len,
29248c2ecf20Sopenharmony_ci				u32 timeout, long *result)
29258c2ecf20Sopenharmony_ci{
29268c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
29278c2ecf20Sopenharmony_ci
29288c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_CPU_Q)) {
29298c2ecf20Sopenharmony_ci		if (result)
29308c2ecf20Sopenharmony_ci			*result = 0;
29318c2ecf20Sopenharmony_ci		return 0;
29328c2ecf20Sopenharmony_ci	}
29338c2ecf20Sopenharmony_ci
29348c2ecf20Sopenharmony_ci	if (!timeout)
29358c2ecf20Sopenharmony_ci		timeout = GOYA_MSG_TO_CPU_TIMEOUT_USEC;
29368c2ecf20Sopenharmony_ci
29378c2ecf20Sopenharmony_ci	return hl_fw_send_cpu_message(hdev, GOYA_QUEUE_ID_CPU_PQ, msg, len,
29388c2ecf20Sopenharmony_ci					timeout, result);
29398c2ecf20Sopenharmony_ci}
29408c2ecf20Sopenharmony_ci
29418c2ecf20Sopenharmony_ciint goya_test_queue(struct hl_device *hdev, u32 hw_queue_id)
29428c2ecf20Sopenharmony_ci{
29438c2ecf20Sopenharmony_ci	struct packet_msg_prot *fence_pkt;
29448c2ecf20Sopenharmony_ci	dma_addr_t pkt_dma_addr;
29458c2ecf20Sopenharmony_ci	u32 fence_val, tmp;
29468c2ecf20Sopenharmony_ci	dma_addr_t fence_dma_addr;
29478c2ecf20Sopenharmony_ci	u32 *fence_ptr;
29488c2ecf20Sopenharmony_ci	int rc;
29498c2ecf20Sopenharmony_ci
29508c2ecf20Sopenharmony_ci	fence_val = GOYA_QMAN0_FENCE_VAL;
29518c2ecf20Sopenharmony_ci
29528c2ecf20Sopenharmony_ci	fence_ptr = hdev->asic_funcs->asic_dma_pool_zalloc(hdev, 4, GFP_KERNEL,
29538c2ecf20Sopenharmony_ci							&fence_dma_addr);
29548c2ecf20Sopenharmony_ci	if (!fence_ptr) {
29558c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
29568c2ecf20Sopenharmony_ci			"Failed to allocate memory for H/W queue %d testing\n",
29578c2ecf20Sopenharmony_ci			hw_queue_id);
29588c2ecf20Sopenharmony_ci		return -ENOMEM;
29598c2ecf20Sopenharmony_ci	}
29608c2ecf20Sopenharmony_ci
29618c2ecf20Sopenharmony_ci	*fence_ptr = 0;
29628c2ecf20Sopenharmony_ci
29638c2ecf20Sopenharmony_ci	fence_pkt = hdev->asic_funcs->asic_dma_pool_zalloc(hdev,
29648c2ecf20Sopenharmony_ci					sizeof(struct packet_msg_prot),
29658c2ecf20Sopenharmony_ci					GFP_KERNEL, &pkt_dma_addr);
29668c2ecf20Sopenharmony_ci	if (!fence_pkt) {
29678c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
29688c2ecf20Sopenharmony_ci			"Failed to allocate packet for H/W queue %d testing\n",
29698c2ecf20Sopenharmony_ci			hw_queue_id);
29708c2ecf20Sopenharmony_ci		rc = -ENOMEM;
29718c2ecf20Sopenharmony_ci		goto free_fence_ptr;
29728c2ecf20Sopenharmony_ci	}
29738c2ecf20Sopenharmony_ci
29748c2ecf20Sopenharmony_ci	tmp = (PACKET_MSG_PROT << GOYA_PKT_CTL_OPCODE_SHIFT) |
29758c2ecf20Sopenharmony_ci			(1 << GOYA_PKT_CTL_EB_SHIFT) |
29768c2ecf20Sopenharmony_ci			(1 << GOYA_PKT_CTL_MB_SHIFT);
29778c2ecf20Sopenharmony_ci	fence_pkt->ctl = cpu_to_le32(tmp);
29788c2ecf20Sopenharmony_ci	fence_pkt->value = cpu_to_le32(fence_val);
29798c2ecf20Sopenharmony_ci	fence_pkt->addr = cpu_to_le64(fence_dma_addr);
29808c2ecf20Sopenharmony_ci
29818c2ecf20Sopenharmony_ci	rc = hl_hw_queue_send_cb_no_cmpl(hdev, hw_queue_id,
29828c2ecf20Sopenharmony_ci					sizeof(struct packet_msg_prot),
29838c2ecf20Sopenharmony_ci					pkt_dma_addr);
29848c2ecf20Sopenharmony_ci	if (rc) {
29858c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
29868c2ecf20Sopenharmony_ci			"Failed to send fence packet to H/W queue %d\n",
29878c2ecf20Sopenharmony_ci			hw_queue_id);
29888c2ecf20Sopenharmony_ci		goto free_pkt;
29898c2ecf20Sopenharmony_ci	}
29908c2ecf20Sopenharmony_ci
29918c2ecf20Sopenharmony_ci	rc = hl_poll_timeout_memory(hdev, fence_ptr, tmp, (tmp == fence_val),
29928c2ecf20Sopenharmony_ci					1000, GOYA_TEST_QUEUE_WAIT_USEC, true);
29938c2ecf20Sopenharmony_ci
29948c2ecf20Sopenharmony_ci	hl_hw_queue_inc_ci_kernel(hdev, hw_queue_id);
29958c2ecf20Sopenharmony_ci
29968c2ecf20Sopenharmony_ci	if (rc == -ETIMEDOUT) {
29978c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
29988c2ecf20Sopenharmony_ci			"H/W queue %d test failed (scratch(0x%08llX) == 0x%08X)\n",
29998c2ecf20Sopenharmony_ci			hw_queue_id, (unsigned long long) fence_dma_addr, tmp);
30008c2ecf20Sopenharmony_ci		rc = -EIO;
30018c2ecf20Sopenharmony_ci	}
30028c2ecf20Sopenharmony_ci
30038c2ecf20Sopenharmony_cifree_pkt:
30048c2ecf20Sopenharmony_ci	hdev->asic_funcs->asic_dma_pool_free(hdev, (void *) fence_pkt,
30058c2ecf20Sopenharmony_ci					pkt_dma_addr);
30068c2ecf20Sopenharmony_cifree_fence_ptr:
30078c2ecf20Sopenharmony_ci	hdev->asic_funcs->asic_dma_pool_free(hdev, (void *) fence_ptr,
30088c2ecf20Sopenharmony_ci					fence_dma_addr);
30098c2ecf20Sopenharmony_ci	return rc;
30108c2ecf20Sopenharmony_ci}
30118c2ecf20Sopenharmony_ci
30128c2ecf20Sopenharmony_ciint goya_test_cpu_queue(struct hl_device *hdev)
30138c2ecf20Sopenharmony_ci{
30148c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
30158c2ecf20Sopenharmony_ci
30168c2ecf20Sopenharmony_ci	/*
30178c2ecf20Sopenharmony_ci	 * check capability here as send_cpu_message() won't update the result
30188c2ecf20Sopenharmony_ci	 * value if no capability
30198c2ecf20Sopenharmony_ci	 */
30208c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_CPU_Q))
30218c2ecf20Sopenharmony_ci		return 0;
30228c2ecf20Sopenharmony_ci
30238c2ecf20Sopenharmony_ci	return hl_fw_test_cpu_queue(hdev);
30248c2ecf20Sopenharmony_ci}
30258c2ecf20Sopenharmony_ci
30268c2ecf20Sopenharmony_ciint goya_test_queues(struct hl_device *hdev)
30278c2ecf20Sopenharmony_ci{
30288c2ecf20Sopenharmony_ci	int i, rc, ret_val = 0;
30298c2ecf20Sopenharmony_ci
30308c2ecf20Sopenharmony_ci	for (i = 0 ; i < NUMBER_OF_EXT_HW_QUEUES ; i++) {
30318c2ecf20Sopenharmony_ci		rc = goya_test_queue(hdev, i);
30328c2ecf20Sopenharmony_ci		if (rc)
30338c2ecf20Sopenharmony_ci			ret_val = -EINVAL;
30348c2ecf20Sopenharmony_ci	}
30358c2ecf20Sopenharmony_ci
30368c2ecf20Sopenharmony_ci	return ret_val;
30378c2ecf20Sopenharmony_ci}
30388c2ecf20Sopenharmony_ci
30398c2ecf20Sopenharmony_cistatic void *goya_dma_pool_zalloc(struct hl_device *hdev, size_t size,
30408c2ecf20Sopenharmony_ci					gfp_t mem_flags, dma_addr_t *dma_handle)
30418c2ecf20Sopenharmony_ci{
30428c2ecf20Sopenharmony_ci	void *kernel_addr;
30438c2ecf20Sopenharmony_ci
30448c2ecf20Sopenharmony_ci	if (size > GOYA_DMA_POOL_BLK_SIZE)
30458c2ecf20Sopenharmony_ci		return NULL;
30468c2ecf20Sopenharmony_ci
30478c2ecf20Sopenharmony_ci	kernel_addr =  dma_pool_zalloc(hdev->dma_pool, mem_flags, dma_handle);
30488c2ecf20Sopenharmony_ci
30498c2ecf20Sopenharmony_ci	/* Shift to the device's base physical address of host memory */
30508c2ecf20Sopenharmony_ci	if (kernel_addr)
30518c2ecf20Sopenharmony_ci		*dma_handle += HOST_PHYS_BASE;
30528c2ecf20Sopenharmony_ci
30538c2ecf20Sopenharmony_ci	return kernel_addr;
30548c2ecf20Sopenharmony_ci}
30558c2ecf20Sopenharmony_ci
30568c2ecf20Sopenharmony_cistatic void goya_dma_pool_free(struct hl_device *hdev, void *vaddr,
30578c2ecf20Sopenharmony_ci				dma_addr_t dma_addr)
30588c2ecf20Sopenharmony_ci{
30598c2ecf20Sopenharmony_ci	/* Cancel the device's base physical address of host memory */
30608c2ecf20Sopenharmony_ci	dma_addr_t fixed_dma_addr = dma_addr - HOST_PHYS_BASE;
30618c2ecf20Sopenharmony_ci
30628c2ecf20Sopenharmony_ci	dma_pool_free(hdev->dma_pool, vaddr, fixed_dma_addr);
30638c2ecf20Sopenharmony_ci}
30648c2ecf20Sopenharmony_ci
30658c2ecf20Sopenharmony_civoid *goya_cpu_accessible_dma_pool_alloc(struct hl_device *hdev, size_t size,
30668c2ecf20Sopenharmony_ci					dma_addr_t *dma_handle)
30678c2ecf20Sopenharmony_ci{
30688c2ecf20Sopenharmony_ci	void *vaddr;
30698c2ecf20Sopenharmony_ci
30708c2ecf20Sopenharmony_ci	vaddr = hl_fw_cpu_accessible_dma_pool_alloc(hdev, size, dma_handle);
30718c2ecf20Sopenharmony_ci	*dma_handle = (*dma_handle) - hdev->cpu_accessible_dma_address +
30728c2ecf20Sopenharmony_ci			VA_CPU_ACCESSIBLE_MEM_ADDR;
30738c2ecf20Sopenharmony_ci
30748c2ecf20Sopenharmony_ci	return vaddr;
30758c2ecf20Sopenharmony_ci}
30768c2ecf20Sopenharmony_ci
30778c2ecf20Sopenharmony_civoid goya_cpu_accessible_dma_pool_free(struct hl_device *hdev, size_t size,
30788c2ecf20Sopenharmony_ci					void *vaddr)
30798c2ecf20Sopenharmony_ci{
30808c2ecf20Sopenharmony_ci	hl_fw_cpu_accessible_dma_pool_free(hdev, size, vaddr);
30818c2ecf20Sopenharmony_ci}
30828c2ecf20Sopenharmony_ci
30838c2ecf20Sopenharmony_cistatic int goya_dma_map_sg(struct hl_device *hdev, struct scatterlist *sgl,
30848c2ecf20Sopenharmony_ci				int nents, enum dma_data_direction dir)
30858c2ecf20Sopenharmony_ci{
30868c2ecf20Sopenharmony_ci	struct scatterlist *sg;
30878c2ecf20Sopenharmony_ci	int i;
30888c2ecf20Sopenharmony_ci
30898c2ecf20Sopenharmony_ci	if (!dma_map_sg(&hdev->pdev->dev, sgl, nents, dir))
30908c2ecf20Sopenharmony_ci		return -ENOMEM;
30918c2ecf20Sopenharmony_ci
30928c2ecf20Sopenharmony_ci	/* Shift to the device's base physical address of host memory */
30938c2ecf20Sopenharmony_ci	for_each_sg(sgl, sg, nents, i)
30948c2ecf20Sopenharmony_ci		sg->dma_address += HOST_PHYS_BASE;
30958c2ecf20Sopenharmony_ci
30968c2ecf20Sopenharmony_ci	return 0;
30978c2ecf20Sopenharmony_ci}
30988c2ecf20Sopenharmony_ci
30998c2ecf20Sopenharmony_cistatic void goya_dma_unmap_sg(struct hl_device *hdev, struct scatterlist *sgl,
31008c2ecf20Sopenharmony_ci				int nents, enum dma_data_direction dir)
31018c2ecf20Sopenharmony_ci{
31028c2ecf20Sopenharmony_ci	struct scatterlist *sg;
31038c2ecf20Sopenharmony_ci	int i;
31048c2ecf20Sopenharmony_ci
31058c2ecf20Sopenharmony_ci	/* Cancel the device's base physical address of host memory */
31068c2ecf20Sopenharmony_ci	for_each_sg(sgl, sg, nents, i)
31078c2ecf20Sopenharmony_ci		sg->dma_address -= HOST_PHYS_BASE;
31088c2ecf20Sopenharmony_ci
31098c2ecf20Sopenharmony_ci	dma_unmap_sg(&hdev->pdev->dev, sgl, nents, dir);
31108c2ecf20Sopenharmony_ci}
31118c2ecf20Sopenharmony_ci
31128c2ecf20Sopenharmony_ciu32 goya_get_dma_desc_list_size(struct hl_device *hdev, struct sg_table *sgt)
31138c2ecf20Sopenharmony_ci{
31148c2ecf20Sopenharmony_ci	struct scatterlist *sg, *sg_next_iter;
31158c2ecf20Sopenharmony_ci	u32 count, dma_desc_cnt;
31168c2ecf20Sopenharmony_ci	u64 len, len_next;
31178c2ecf20Sopenharmony_ci	dma_addr_t addr, addr_next;
31188c2ecf20Sopenharmony_ci
31198c2ecf20Sopenharmony_ci	dma_desc_cnt = 0;
31208c2ecf20Sopenharmony_ci
31218c2ecf20Sopenharmony_ci	for_each_sg(sgt->sgl, sg, sgt->nents, count) {
31228c2ecf20Sopenharmony_ci
31238c2ecf20Sopenharmony_ci		len = sg_dma_len(sg);
31248c2ecf20Sopenharmony_ci		addr = sg_dma_address(sg);
31258c2ecf20Sopenharmony_ci
31268c2ecf20Sopenharmony_ci		if (len == 0)
31278c2ecf20Sopenharmony_ci			break;
31288c2ecf20Sopenharmony_ci
31298c2ecf20Sopenharmony_ci		while ((count + 1) < sgt->nents) {
31308c2ecf20Sopenharmony_ci			sg_next_iter = sg_next(sg);
31318c2ecf20Sopenharmony_ci			len_next = sg_dma_len(sg_next_iter);
31328c2ecf20Sopenharmony_ci			addr_next = sg_dma_address(sg_next_iter);
31338c2ecf20Sopenharmony_ci
31348c2ecf20Sopenharmony_ci			if (len_next == 0)
31358c2ecf20Sopenharmony_ci				break;
31368c2ecf20Sopenharmony_ci
31378c2ecf20Sopenharmony_ci			if ((addr + len == addr_next) &&
31388c2ecf20Sopenharmony_ci				(len + len_next <= DMA_MAX_TRANSFER_SIZE)) {
31398c2ecf20Sopenharmony_ci				len += len_next;
31408c2ecf20Sopenharmony_ci				count++;
31418c2ecf20Sopenharmony_ci				sg = sg_next_iter;
31428c2ecf20Sopenharmony_ci			} else {
31438c2ecf20Sopenharmony_ci				break;
31448c2ecf20Sopenharmony_ci			}
31458c2ecf20Sopenharmony_ci		}
31468c2ecf20Sopenharmony_ci
31478c2ecf20Sopenharmony_ci		dma_desc_cnt++;
31488c2ecf20Sopenharmony_ci	}
31498c2ecf20Sopenharmony_ci
31508c2ecf20Sopenharmony_ci	return dma_desc_cnt * sizeof(struct packet_lin_dma);
31518c2ecf20Sopenharmony_ci}
31528c2ecf20Sopenharmony_ci
31538c2ecf20Sopenharmony_cistatic int goya_pin_memory_before_cs(struct hl_device *hdev,
31548c2ecf20Sopenharmony_ci				struct hl_cs_parser *parser,
31558c2ecf20Sopenharmony_ci				struct packet_lin_dma *user_dma_pkt,
31568c2ecf20Sopenharmony_ci				u64 addr, enum dma_data_direction dir)
31578c2ecf20Sopenharmony_ci{
31588c2ecf20Sopenharmony_ci	struct hl_userptr *userptr;
31598c2ecf20Sopenharmony_ci	int rc;
31608c2ecf20Sopenharmony_ci
31618c2ecf20Sopenharmony_ci	if (hl_userptr_is_pinned(hdev, addr, le32_to_cpu(user_dma_pkt->tsize),
31628c2ecf20Sopenharmony_ci			parser->job_userptr_list, &userptr))
31638c2ecf20Sopenharmony_ci		goto already_pinned;
31648c2ecf20Sopenharmony_ci
31658c2ecf20Sopenharmony_ci	userptr = kzalloc(sizeof(*userptr), GFP_ATOMIC);
31668c2ecf20Sopenharmony_ci	if (!userptr)
31678c2ecf20Sopenharmony_ci		return -ENOMEM;
31688c2ecf20Sopenharmony_ci
31698c2ecf20Sopenharmony_ci	rc = hl_pin_host_memory(hdev, addr, le32_to_cpu(user_dma_pkt->tsize),
31708c2ecf20Sopenharmony_ci				userptr);
31718c2ecf20Sopenharmony_ci	if (rc)
31728c2ecf20Sopenharmony_ci		goto free_userptr;
31738c2ecf20Sopenharmony_ci
31748c2ecf20Sopenharmony_ci	list_add_tail(&userptr->job_node, parser->job_userptr_list);
31758c2ecf20Sopenharmony_ci
31768c2ecf20Sopenharmony_ci	rc = hdev->asic_funcs->asic_dma_map_sg(hdev, userptr->sgt->sgl,
31778c2ecf20Sopenharmony_ci					userptr->sgt->nents, dir);
31788c2ecf20Sopenharmony_ci	if (rc) {
31798c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to map sgt with DMA region\n");
31808c2ecf20Sopenharmony_ci		goto unpin_memory;
31818c2ecf20Sopenharmony_ci	}
31828c2ecf20Sopenharmony_ci
31838c2ecf20Sopenharmony_ci	userptr->dma_mapped = true;
31848c2ecf20Sopenharmony_ci	userptr->dir = dir;
31858c2ecf20Sopenharmony_ci
31868c2ecf20Sopenharmony_cialready_pinned:
31878c2ecf20Sopenharmony_ci	parser->patched_cb_size +=
31888c2ecf20Sopenharmony_ci			goya_get_dma_desc_list_size(hdev, userptr->sgt);
31898c2ecf20Sopenharmony_ci
31908c2ecf20Sopenharmony_ci	return 0;
31918c2ecf20Sopenharmony_ci
31928c2ecf20Sopenharmony_ciunpin_memory:
31938c2ecf20Sopenharmony_ci	list_del(&userptr->job_node);
31948c2ecf20Sopenharmony_ci	hl_unpin_host_memory(hdev, userptr);
31958c2ecf20Sopenharmony_cifree_userptr:
31968c2ecf20Sopenharmony_ci	kfree(userptr);
31978c2ecf20Sopenharmony_ci	return rc;
31988c2ecf20Sopenharmony_ci}
31998c2ecf20Sopenharmony_ci
32008c2ecf20Sopenharmony_cistatic int goya_validate_dma_pkt_host(struct hl_device *hdev,
32018c2ecf20Sopenharmony_ci				struct hl_cs_parser *parser,
32028c2ecf20Sopenharmony_ci				struct packet_lin_dma *user_dma_pkt)
32038c2ecf20Sopenharmony_ci{
32048c2ecf20Sopenharmony_ci	u64 device_memory_addr, addr;
32058c2ecf20Sopenharmony_ci	enum dma_data_direction dir;
32068c2ecf20Sopenharmony_ci	enum goya_dma_direction user_dir;
32078c2ecf20Sopenharmony_ci	bool sram_addr = true;
32088c2ecf20Sopenharmony_ci	bool skip_host_mem_pin = false;
32098c2ecf20Sopenharmony_ci	bool user_memset;
32108c2ecf20Sopenharmony_ci	u32 ctl;
32118c2ecf20Sopenharmony_ci	int rc = 0;
32128c2ecf20Sopenharmony_ci
32138c2ecf20Sopenharmony_ci	ctl = le32_to_cpu(user_dma_pkt->ctl);
32148c2ecf20Sopenharmony_ci
32158c2ecf20Sopenharmony_ci	user_dir = (ctl & GOYA_PKT_LIN_DMA_CTL_DMA_DIR_MASK) >>
32168c2ecf20Sopenharmony_ci			GOYA_PKT_LIN_DMA_CTL_DMA_DIR_SHIFT;
32178c2ecf20Sopenharmony_ci
32188c2ecf20Sopenharmony_ci	user_memset = (ctl & GOYA_PKT_LIN_DMA_CTL_MEMSET_MASK) >>
32198c2ecf20Sopenharmony_ci			GOYA_PKT_LIN_DMA_CTL_MEMSET_SHIFT;
32208c2ecf20Sopenharmony_ci
32218c2ecf20Sopenharmony_ci	switch (user_dir) {
32228c2ecf20Sopenharmony_ci	case DMA_HOST_TO_DRAM:
32238c2ecf20Sopenharmony_ci		dev_dbg(hdev->dev, "DMA direction is HOST --> DRAM\n");
32248c2ecf20Sopenharmony_ci		dir = DMA_TO_DEVICE;
32258c2ecf20Sopenharmony_ci		sram_addr = false;
32268c2ecf20Sopenharmony_ci		addr = le64_to_cpu(user_dma_pkt->src_addr);
32278c2ecf20Sopenharmony_ci		device_memory_addr = le64_to_cpu(user_dma_pkt->dst_addr);
32288c2ecf20Sopenharmony_ci		if (user_memset)
32298c2ecf20Sopenharmony_ci			skip_host_mem_pin = true;
32308c2ecf20Sopenharmony_ci		break;
32318c2ecf20Sopenharmony_ci
32328c2ecf20Sopenharmony_ci	case DMA_DRAM_TO_HOST:
32338c2ecf20Sopenharmony_ci		dev_dbg(hdev->dev, "DMA direction is DRAM --> HOST\n");
32348c2ecf20Sopenharmony_ci		dir = DMA_FROM_DEVICE;
32358c2ecf20Sopenharmony_ci		sram_addr = false;
32368c2ecf20Sopenharmony_ci		addr = le64_to_cpu(user_dma_pkt->dst_addr);
32378c2ecf20Sopenharmony_ci		device_memory_addr = le64_to_cpu(user_dma_pkt->src_addr);
32388c2ecf20Sopenharmony_ci		break;
32398c2ecf20Sopenharmony_ci
32408c2ecf20Sopenharmony_ci	case DMA_HOST_TO_SRAM:
32418c2ecf20Sopenharmony_ci		dev_dbg(hdev->dev, "DMA direction is HOST --> SRAM\n");
32428c2ecf20Sopenharmony_ci		dir = DMA_TO_DEVICE;
32438c2ecf20Sopenharmony_ci		addr = le64_to_cpu(user_dma_pkt->src_addr);
32448c2ecf20Sopenharmony_ci		device_memory_addr = le64_to_cpu(user_dma_pkt->dst_addr);
32458c2ecf20Sopenharmony_ci		if (user_memset)
32468c2ecf20Sopenharmony_ci			skip_host_mem_pin = true;
32478c2ecf20Sopenharmony_ci		break;
32488c2ecf20Sopenharmony_ci
32498c2ecf20Sopenharmony_ci	case DMA_SRAM_TO_HOST:
32508c2ecf20Sopenharmony_ci		dev_dbg(hdev->dev, "DMA direction is SRAM --> HOST\n");
32518c2ecf20Sopenharmony_ci		dir = DMA_FROM_DEVICE;
32528c2ecf20Sopenharmony_ci		addr = le64_to_cpu(user_dma_pkt->dst_addr);
32538c2ecf20Sopenharmony_ci		device_memory_addr = le64_to_cpu(user_dma_pkt->src_addr);
32548c2ecf20Sopenharmony_ci		break;
32558c2ecf20Sopenharmony_ci	default:
32568c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "DMA direction is undefined\n");
32578c2ecf20Sopenharmony_ci		return -EFAULT;
32588c2ecf20Sopenharmony_ci	}
32598c2ecf20Sopenharmony_ci
32608c2ecf20Sopenharmony_ci	if (sram_addr) {
32618c2ecf20Sopenharmony_ci		if (!hl_mem_area_inside_range(device_memory_addr,
32628c2ecf20Sopenharmony_ci				le32_to_cpu(user_dma_pkt->tsize),
32638c2ecf20Sopenharmony_ci				hdev->asic_prop.sram_user_base_address,
32648c2ecf20Sopenharmony_ci				hdev->asic_prop.sram_end_address)) {
32658c2ecf20Sopenharmony_ci
32668c2ecf20Sopenharmony_ci			dev_err(hdev->dev,
32678c2ecf20Sopenharmony_ci				"SRAM address 0x%llx + 0x%x is invalid\n",
32688c2ecf20Sopenharmony_ci				device_memory_addr,
32698c2ecf20Sopenharmony_ci				user_dma_pkt->tsize);
32708c2ecf20Sopenharmony_ci			return -EFAULT;
32718c2ecf20Sopenharmony_ci		}
32728c2ecf20Sopenharmony_ci	} else {
32738c2ecf20Sopenharmony_ci		if (!hl_mem_area_inside_range(device_memory_addr,
32748c2ecf20Sopenharmony_ci				le32_to_cpu(user_dma_pkt->tsize),
32758c2ecf20Sopenharmony_ci				hdev->asic_prop.dram_user_base_address,
32768c2ecf20Sopenharmony_ci				hdev->asic_prop.dram_end_address)) {
32778c2ecf20Sopenharmony_ci
32788c2ecf20Sopenharmony_ci			dev_err(hdev->dev,
32798c2ecf20Sopenharmony_ci				"DRAM address 0x%llx + 0x%x is invalid\n",
32808c2ecf20Sopenharmony_ci				device_memory_addr,
32818c2ecf20Sopenharmony_ci				user_dma_pkt->tsize);
32828c2ecf20Sopenharmony_ci			return -EFAULT;
32838c2ecf20Sopenharmony_ci		}
32848c2ecf20Sopenharmony_ci	}
32858c2ecf20Sopenharmony_ci
32868c2ecf20Sopenharmony_ci	if (skip_host_mem_pin)
32878c2ecf20Sopenharmony_ci		parser->patched_cb_size += sizeof(*user_dma_pkt);
32888c2ecf20Sopenharmony_ci	else {
32898c2ecf20Sopenharmony_ci		if ((dir == DMA_TO_DEVICE) &&
32908c2ecf20Sopenharmony_ci				(parser->hw_queue_id > GOYA_QUEUE_ID_DMA_1)) {
32918c2ecf20Sopenharmony_ci			dev_err(hdev->dev,
32928c2ecf20Sopenharmony_ci				"Can't DMA from host on queue other then 1\n");
32938c2ecf20Sopenharmony_ci			return -EFAULT;
32948c2ecf20Sopenharmony_ci		}
32958c2ecf20Sopenharmony_ci
32968c2ecf20Sopenharmony_ci		rc = goya_pin_memory_before_cs(hdev, parser, user_dma_pkt,
32978c2ecf20Sopenharmony_ci						addr, dir);
32988c2ecf20Sopenharmony_ci	}
32998c2ecf20Sopenharmony_ci
33008c2ecf20Sopenharmony_ci	return rc;
33018c2ecf20Sopenharmony_ci}
33028c2ecf20Sopenharmony_ci
33038c2ecf20Sopenharmony_cistatic int goya_validate_dma_pkt_no_host(struct hl_device *hdev,
33048c2ecf20Sopenharmony_ci				struct hl_cs_parser *parser,
33058c2ecf20Sopenharmony_ci				struct packet_lin_dma *user_dma_pkt)
33068c2ecf20Sopenharmony_ci{
33078c2ecf20Sopenharmony_ci	u64 sram_memory_addr, dram_memory_addr;
33088c2ecf20Sopenharmony_ci	enum goya_dma_direction user_dir;
33098c2ecf20Sopenharmony_ci	u32 ctl;
33108c2ecf20Sopenharmony_ci
33118c2ecf20Sopenharmony_ci	ctl = le32_to_cpu(user_dma_pkt->ctl);
33128c2ecf20Sopenharmony_ci	user_dir = (ctl & GOYA_PKT_LIN_DMA_CTL_DMA_DIR_MASK) >>
33138c2ecf20Sopenharmony_ci			GOYA_PKT_LIN_DMA_CTL_DMA_DIR_SHIFT;
33148c2ecf20Sopenharmony_ci
33158c2ecf20Sopenharmony_ci	if (user_dir == DMA_DRAM_TO_SRAM) {
33168c2ecf20Sopenharmony_ci		dev_dbg(hdev->dev, "DMA direction is DRAM --> SRAM\n");
33178c2ecf20Sopenharmony_ci		dram_memory_addr = le64_to_cpu(user_dma_pkt->src_addr);
33188c2ecf20Sopenharmony_ci		sram_memory_addr = le64_to_cpu(user_dma_pkt->dst_addr);
33198c2ecf20Sopenharmony_ci	} else {
33208c2ecf20Sopenharmony_ci		dev_dbg(hdev->dev, "DMA direction is SRAM --> DRAM\n");
33218c2ecf20Sopenharmony_ci		sram_memory_addr = le64_to_cpu(user_dma_pkt->src_addr);
33228c2ecf20Sopenharmony_ci		dram_memory_addr = le64_to_cpu(user_dma_pkt->dst_addr);
33238c2ecf20Sopenharmony_ci	}
33248c2ecf20Sopenharmony_ci
33258c2ecf20Sopenharmony_ci	if (!hl_mem_area_inside_range(sram_memory_addr,
33268c2ecf20Sopenharmony_ci				le32_to_cpu(user_dma_pkt->tsize),
33278c2ecf20Sopenharmony_ci				hdev->asic_prop.sram_user_base_address,
33288c2ecf20Sopenharmony_ci				hdev->asic_prop.sram_end_address)) {
33298c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "SRAM address 0x%llx + 0x%x is invalid\n",
33308c2ecf20Sopenharmony_ci			sram_memory_addr, user_dma_pkt->tsize);
33318c2ecf20Sopenharmony_ci		return -EFAULT;
33328c2ecf20Sopenharmony_ci	}
33338c2ecf20Sopenharmony_ci
33348c2ecf20Sopenharmony_ci	if (!hl_mem_area_inside_range(dram_memory_addr,
33358c2ecf20Sopenharmony_ci				le32_to_cpu(user_dma_pkt->tsize),
33368c2ecf20Sopenharmony_ci				hdev->asic_prop.dram_user_base_address,
33378c2ecf20Sopenharmony_ci				hdev->asic_prop.dram_end_address)) {
33388c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "DRAM address 0x%llx + 0x%x is invalid\n",
33398c2ecf20Sopenharmony_ci			dram_memory_addr, user_dma_pkt->tsize);
33408c2ecf20Sopenharmony_ci		return -EFAULT;
33418c2ecf20Sopenharmony_ci	}
33428c2ecf20Sopenharmony_ci
33438c2ecf20Sopenharmony_ci	parser->patched_cb_size += sizeof(*user_dma_pkt);
33448c2ecf20Sopenharmony_ci
33458c2ecf20Sopenharmony_ci	return 0;
33468c2ecf20Sopenharmony_ci}
33478c2ecf20Sopenharmony_ci
33488c2ecf20Sopenharmony_cistatic int goya_validate_dma_pkt_no_mmu(struct hl_device *hdev,
33498c2ecf20Sopenharmony_ci				struct hl_cs_parser *parser,
33508c2ecf20Sopenharmony_ci				struct packet_lin_dma *user_dma_pkt)
33518c2ecf20Sopenharmony_ci{
33528c2ecf20Sopenharmony_ci	enum goya_dma_direction user_dir;
33538c2ecf20Sopenharmony_ci	u32 ctl;
33548c2ecf20Sopenharmony_ci	int rc;
33558c2ecf20Sopenharmony_ci
33568c2ecf20Sopenharmony_ci	dev_dbg(hdev->dev, "DMA packet details:\n");
33578c2ecf20Sopenharmony_ci	dev_dbg(hdev->dev, "source == 0x%llx\n",
33588c2ecf20Sopenharmony_ci		le64_to_cpu(user_dma_pkt->src_addr));
33598c2ecf20Sopenharmony_ci	dev_dbg(hdev->dev, "destination == 0x%llx\n",
33608c2ecf20Sopenharmony_ci		le64_to_cpu(user_dma_pkt->dst_addr));
33618c2ecf20Sopenharmony_ci	dev_dbg(hdev->dev, "size == %u\n", le32_to_cpu(user_dma_pkt->tsize));
33628c2ecf20Sopenharmony_ci
33638c2ecf20Sopenharmony_ci	ctl = le32_to_cpu(user_dma_pkt->ctl);
33648c2ecf20Sopenharmony_ci	user_dir = (ctl & GOYA_PKT_LIN_DMA_CTL_DMA_DIR_MASK) >>
33658c2ecf20Sopenharmony_ci			GOYA_PKT_LIN_DMA_CTL_DMA_DIR_SHIFT;
33668c2ecf20Sopenharmony_ci
33678c2ecf20Sopenharmony_ci	/*
33688c2ecf20Sopenharmony_ci	 * Special handling for DMA with size 0. The H/W has a bug where
33698c2ecf20Sopenharmony_ci	 * this can cause the QMAN DMA to get stuck, so block it here.
33708c2ecf20Sopenharmony_ci	 */
33718c2ecf20Sopenharmony_ci	if (user_dma_pkt->tsize == 0) {
33728c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
33738c2ecf20Sopenharmony_ci			"Got DMA with size 0, might reset the device\n");
33748c2ecf20Sopenharmony_ci		return -EINVAL;
33758c2ecf20Sopenharmony_ci	}
33768c2ecf20Sopenharmony_ci
33778c2ecf20Sopenharmony_ci	if ((user_dir == DMA_DRAM_TO_SRAM) || (user_dir == DMA_SRAM_TO_DRAM))
33788c2ecf20Sopenharmony_ci		rc = goya_validate_dma_pkt_no_host(hdev, parser, user_dma_pkt);
33798c2ecf20Sopenharmony_ci	else
33808c2ecf20Sopenharmony_ci		rc = goya_validate_dma_pkt_host(hdev, parser, user_dma_pkt);
33818c2ecf20Sopenharmony_ci
33828c2ecf20Sopenharmony_ci	return rc;
33838c2ecf20Sopenharmony_ci}
33848c2ecf20Sopenharmony_ci
33858c2ecf20Sopenharmony_cistatic int goya_validate_dma_pkt_mmu(struct hl_device *hdev,
33868c2ecf20Sopenharmony_ci				struct hl_cs_parser *parser,
33878c2ecf20Sopenharmony_ci				struct packet_lin_dma *user_dma_pkt)
33888c2ecf20Sopenharmony_ci{
33898c2ecf20Sopenharmony_ci	dev_dbg(hdev->dev, "DMA packet details:\n");
33908c2ecf20Sopenharmony_ci	dev_dbg(hdev->dev, "source == 0x%llx\n",
33918c2ecf20Sopenharmony_ci		le64_to_cpu(user_dma_pkt->src_addr));
33928c2ecf20Sopenharmony_ci	dev_dbg(hdev->dev, "destination == 0x%llx\n",
33938c2ecf20Sopenharmony_ci		le64_to_cpu(user_dma_pkt->dst_addr));
33948c2ecf20Sopenharmony_ci	dev_dbg(hdev->dev, "size == %u\n", le32_to_cpu(user_dma_pkt->tsize));
33958c2ecf20Sopenharmony_ci
33968c2ecf20Sopenharmony_ci	/*
33978c2ecf20Sopenharmony_ci	 * WA for HW-23.
33988c2ecf20Sopenharmony_ci	 * We can't allow user to read from Host using QMANs other than 1.
33998c2ecf20Sopenharmony_ci	 * PMMU and HPMMU addresses are equal, check only one of them.
34008c2ecf20Sopenharmony_ci	 */
34018c2ecf20Sopenharmony_ci	if (parser->hw_queue_id != GOYA_QUEUE_ID_DMA_1 &&
34028c2ecf20Sopenharmony_ci		hl_mem_area_inside_range(le64_to_cpu(user_dma_pkt->src_addr),
34038c2ecf20Sopenharmony_ci				le32_to_cpu(user_dma_pkt->tsize),
34048c2ecf20Sopenharmony_ci				hdev->asic_prop.pmmu.start_addr,
34058c2ecf20Sopenharmony_ci				hdev->asic_prop.pmmu.end_addr)) {
34068c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
34078c2ecf20Sopenharmony_ci			"Can't DMA from host on queue other then 1\n");
34088c2ecf20Sopenharmony_ci		return -EFAULT;
34098c2ecf20Sopenharmony_ci	}
34108c2ecf20Sopenharmony_ci
34118c2ecf20Sopenharmony_ci	if (user_dma_pkt->tsize == 0) {
34128c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
34138c2ecf20Sopenharmony_ci			"Got DMA with size 0, might reset the device\n");
34148c2ecf20Sopenharmony_ci		return -EINVAL;
34158c2ecf20Sopenharmony_ci	}
34168c2ecf20Sopenharmony_ci
34178c2ecf20Sopenharmony_ci	parser->patched_cb_size += sizeof(*user_dma_pkt);
34188c2ecf20Sopenharmony_ci
34198c2ecf20Sopenharmony_ci	return 0;
34208c2ecf20Sopenharmony_ci}
34218c2ecf20Sopenharmony_ci
34228c2ecf20Sopenharmony_cistatic int goya_validate_wreg32(struct hl_device *hdev,
34238c2ecf20Sopenharmony_ci				struct hl_cs_parser *parser,
34248c2ecf20Sopenharmony_ci				struct packet_wreg32 *wreg_pkt)
34258c2ecf20Sopenharmony_ci{
34268c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
34278c2ecf20Sopenharmony_ci	u32 sob_start_addr, sob_end_addr;
34288c2ecf20Sopenharmony_ci	u16 reg_offset;
34298c2ecf20Sopenharmony_ci
34308c2ecf20Sopenharmony_ci	reg_offset = le32_to_cpu(wreg_pkt->ctl) &
34318c2ecf20Sopenharmony_ci			GOYA_PKT_WREG32_CTL_REG_OFFSET_MASK;
34328c2ecf20Sopenharmony_ci
34338c2ecf20Sopenharmony_ci	dev_dbg(hdev->dev, "WREG32 packet details:\n");
34348c2ecf20Sopenharmony_ci	dev_dbg(hdev->dev, "reg_offset == 0x%x\n", reg_offset);
34358c2ecf20Sopenharmony_ci	dev_dbg(hdev->dev, "value      == 0x%x\n",
34368c2ecf20Sopenharmony_ci		le32_to_cpu(wreg_pkt->value));
34378c2ecf20Sopenharmony_ci
34388c2ecf20Sopenharmony_ci	if (reg_offset != (mmDMA_CH_0_WR_COMP_ADDR_LO & 0x1FFF)) {
34398c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "WREG32 packet with illegal address 0x%x\n",
34408c2ecf20Sopenharmony_ci			reg_offset);
34418c2ecf20Sopenharmony_ci		return -EPERM;
34428c2ecf20Sopenharmony_ci	}
34438c2ecf20Sopenharmony_ci
34448c2ecf20Sopenharmony_ci	/*
34458c2ecf20Sopenharmony_ci	 * With MMU, DMA channels are not secured, so it doesn't matter where
34468c2ecf20Sopenharmony_ci	 * the WR COMP will be written to because it will go out with
34478c2ecf20Sopenharmony_ci	 * non-secured property
34488c2ecf20Sopenharmony_ci	 */
34498c2ecf20Sopenharmony_ci	if (goya->hw_cap_initialized & HW_CAP_MMU)
34508c2ecf20Sopenharmony_ci		return 0;
34518c2ecf20Sopenharmony_ci
34528c2ecf20Sopenharmony_ci	sob_start_addr = lower_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_0);
34538c2ecf20Sopenharmony_ci	sob_end_addr = lower_32_bits(CFG_BASE + mmSYNC_MNGR_SOB_OBJ_1023);
34548c2ecf20Sopenharmony_ci
34558c2ecf20Sopenharmony_ci	if ((le32_to_cpu(wreg_pkt->value) < sob_start_addr) ||
34568c2ecf20Sopenharmony_ci			(le32_to_cpu(wreg_pkt->value) > sob_end_addr)) {
34578c2ecf20Sopenharmony_ci
34588c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "WREG32 packet with illegal value 0x%x\n",
34598c2ecf20Sopenharmony_ci			wreg_pkt->value);
34608c2ecf20Sopenharmony_ci		return -EPERM;
34618c2ecf20Sopenharmony_ci	}
34628c2ecf20Sopenharmony_ci
34638c2ecf20Sopenharmony_ci	return 0;
34648c2ecf20Sopenharmony_ci}
34658c2ecf20Sopenharmony_ci
34668c2ecf20Sopenharmony_cistatic int goya_validate_cb(struct hl_device *hdev,
34678c2ecf20Sopenharmony_ci			struct hl_cs_parser *parser, bool is_mmu)
34688c2ecf20Sopenharmony_ci{
34698c2ecf20Sopenharmony_ci	u32 cb_parsed_length = 0;
34708c2ecf20Sopenharmony_ci	int rc = 0;
34718c2ecf20Sopenharmony_ci
34728c2ecf20Sopenharmony_ci	parser->patched_cb_size = 0;
34738c2ecf20Sopenharmony_ci
34748c2ecf20Sopenharmony_ci	/* cb_user_size is more than 0 so loop will always be executed */
34758c2ecf20Sopenharmony_ci	while (cb_parsed_length < parser->user_cb_size) {
34768c2ecf20Sopenharmony_ci		enum packet_id pkt_id;
34778c2ecf20Sopenharmony_ci		u16 pkt_size;
34788c2ecf20Sopenharmony_ci		struct goya_packet *user_pkt;
34798c2ecf20Sopenharmony_ci
34808c2ecf20Sopenharmony_ci		user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
34818c2ecf20Sopenharmony_ci
34828c2ecf20Sopenharmony_ci		pkt_id = (enum packet_id) (
34838c2ecf20Sopenharmony_ci				(le64_to_cpu(user_pkt->header) &
34848c2ecf20Sopenharmony_ci				PACKET_HEADER_PACKET_ID_MASK) >>
34858c2ecf20Sopenharmony_ci					PACKET_HEADER_PACKET_ID_SHIFT);
34868c2ecf20Sopenharmony_ci
34878c2ecf20Sopenharmony_ci		if (!validate_packet_id(pkt_id)) {
34888c2ecf20Sopenharmony_ci			dev_err(hdev->dev, "Invalid packet id %u\n", pkt_id);
34898c2ecf20Sopenharmony_ci			rc = -EINVAL;
34908c2ecf20Sopenharmony_ci			break;
34918c2ecf20Sopenharmony_ci		}
34928c2ecf20Sopenharmony_ci
34938c2ecf20Sopenharmony_ci		pkt_size = goya_packet_sizes[pkt_id];
34948c2ecf20Sopenharmony_ci		cb_parsed_length += pkt_size;
34958c2ecf20Sopenharmony_ci		if (cb_parsed_length > parser->user_cb_size) {
34968c2ecf20Sopenharmony_ci			dev_err(hdev->dev,
34978c2ecf20Sopenharmony_ci				"packet 0x%x is out of CB boundary\n", pkt_id);
34988c2ecf20Sopenharmony_ci			rc = -EINVAL;
34998c2ecf20Sopenharmony_ci			break;
35008c2ecf20Sopenharmony_ci		}
35018c2ecf20Sopenharmony_ci
35028c2ecf20Sopenharmony_ci		switch (pkt_id) {
35038c2ecf20Sopenharmony_ci		case PACKET_WREG_32:
35048c2ecf20Sopenharmony_ci			/*
35058c2ecf20Sopenharmony_ci			 * Although it is validated after copy in patch_cb(),
35068c2ecf20Sopenharmony_ci			 * need to validate here as well because patch_cb() is
35078c2ecf20Sopenharmony_ci			 * not called in MMU path while this function is called
35088c2ecf20Sopenharmony_ci			 */
35098c2ecf20Sopenharmony_ci			rc = goya_validate_wreg32(hdev,
35108c2ecf20Sopenharmony_ci				parser, (struct packet_wreg32 *) user_pkt);
35118c2ecf20Sopenharmony_ci			parser->patched_cb_size += pkt_size;
35128c2ecf20Sopenharmony_ci			break;
35138c2ecf20Sopenharmony_ci
35148c2ecf20Sopenharmony_ci		case PACKET_WREG_BULK:
35158c2ecf20Sopenharmony_ci			dev_err(hdev->dev,
35168c2ecf20Sopenharmony_ci				"User not allowed to use WREG_BULK\n");
35178c2ecf20Sopenharmony_ci			rc = -EPERM;
35188c2ecf20Sopenharmony_ci			break;
35198c2ecf20Sopenharmony_ci
35208c2ecf20Sopenharmony_ci		case PACKET_MSG_PROT:
35218c2ecf20Sopenharmony_ci			dev_err(hdev->dev,
35228c2ecf20Sopenharmony_ci				"User not allowed to use MSG_PROT\n");
35238c2ecf20Sopenharmony_ci			rc = -EPERM;
35248c2ecf20Sopenharmony_ci			break;
35258c2ecf20Sopenharmony_ci
35268c2ecf20Sopenharmony_ci		case PACKET_CP_DMA:
35278c2ecf20Sopenharmony_ci			dev_err(hdev->dev, "User not allowed to use CP_DMA\n");
35288c2ecf20Sopenharmony_ci			rc = -EPERM;
35298c2ecf20Sopenharmony_ci			break;
35308c2ecf20Sopenharmony_ci
35318c2ecf20Sopenharmony_ci		case PACKET_STOP:
35328c2ecf20Sopenharmony_ci			dev_err(hdev->dev, "User not allowed to use STOP\n");
35338c2ecf20Sopenharmony_ci			rc = -EPERM;
35348c2ecf20Sopenharmony_ci			break;
35358c2ecf20Sopenharmony_ci
35368c2ecf20Sopenharmony_ci		case PACKET_LIN_DMA:
35378c2ecf20Sopenharmony_ci			if (is_mmu)
35388c2ecf20Sopenharmony_ci				rc = goya_validate_dma_pkt_mmu(hdev, parser,
35398c2ecf20Sopenharmony_ci					(struct packet_lin_dma *) user_pkt);
35408c2ecf20Sopenharmony_ci			else
35418c2ecf20Sopenharmony_ci				rc = goya_validate_dma_pkt_no_mmu(hdev, parser,
35428c2ecf20Sopenharmony_ci					(struct packet_lin_dma *) user_pkt);
35438c2ecf20Sopenharmony_ci			break;
35448c2ecf20Sopenharmony_ci
35458c2ecf20Sopenharmony_ci		case PACKET_MSG_LONG:
35468c2ecf20Sopenharmony_ci		case PACKET_MSG_SHORT:
35478c2ecf20Sopenharmony_ci		case PACKET_FENCE:
35488c2ecf20Sopenharmony_ci		case PACKET_NOP:
35498c2ecf20Sopenharmony_ci			parser->patched_cb_size += pkt_size;
35508c2ecf20Sopenharmony_ci			break;
35518c2ecf20Sopenharmony_ci
35528c2ecf20Sopenharmony_ci		default:
35538c2ecf20Sopenharmony_ci			dev_err(hdev->dev, "Invalid packet header 0x%x\n",
35548c2ecf20Sopenharmony_ci				pkt_id);
35558c2ecf20Sopenharmony_ci			rc = -EINVAL;
35568c2ecf20Sopenharmony_ci			break;
35578c2ecf20Sopenharmony_ci		}
35588c2ecf20Sopenharmony_ci
35598c2ecf20Sopenharmony_ci		if (rc)
35608c2ecf20Sopenharmony_ci			break;
35618c2ecf20Sopenharmony_ci	}
35628c2ecf20Sopenharmony_ci
35638c2ecf20Sopenharmony_ci	/*
35648c2ecf20Sopenharmony_ci	 * The new CB should have space at the end for two MSG_PROT packets:
35658c2ecf20Sopenharmony_ci	 * 1. A packet that will act as a completion packet
35668c2ecf20Sopenharmony_ci	 * 2. A packet that will generate MSI-X interrupt
35678c2ecf20Sopenharmony_ci	 */
35688c2ecf20Sopenharmony_ci	parser->patched_cb_size += sizeof(struct packet_msg_prot) * 2;
35698c2ecf20Sopenharmony_ci
35708c2ecf20Sopenharmony_ci	return rc;
35718c2ecf20Sopenharmony_ci}
35728c2ecf20Sopenharmony_ci
35738c2ecf20Sopenharmony_cistatic int goya_patch_dma_packet(struct hl_device *hdev,
35748c2ecf20Sopenharmony_ci				struct hl_cs_parser *parser,
35758c2ecf20Sopenharmony_ci				struct packet_lin_dma *user_dma_pkt,
35768c2ecf20Sopenharmony_ci				struct packet_lin_dma *new_dma_pkt,
35778c2ecf20Sopenharmony_ci				u32 *new_dma_pkt_size)
35788c2ecf20Sopenharmony_ci{
35798c2ecf20Sopenharmony_ci	struct hl_userptr *userptr;
35808c2ecf20Sopenharmony_ci	struct scatterlist *sg, *sg_next_iter;
35818c2ecf20Sopenharmony_ci	u32 count, dma_desc_cnt;
35828c2ecf20Sopenharmony_ci	u64 len, len_next;
35838c2ecf20Sopenharmony_ci	dma_addr_t dma_addr, dma_addr_next;
35848c2ecf20Sopenharmony_ci	enum goya_dma_direction user_dir;
35858c2ecf20Sopenharmony_ci	u64 device_memory_addr, addr;
35868c2ecf20Sopenharmony_ci	enum dma_data_direction dir;
35878c2ecf20Sopenharmony_ci	struct sg_table *sgt;
35888c2ecf20Sopenharmony_ci	bool skip_host_mem_pin = false;
35898c2ecf20Sopenharmony_ci	bool user_memset;
35908c2ecf20Sopenharmony_ci	u32 user_rdcomp_mask, user_wrcomp_mask, ctl;
35918c2ecf20Sopenharmony_ci
35928c2ecf20Sopenharmony_ci	ctl = le32_to_cpu(user_dma_pkt->ctl);
35938c2ecf20Sopenharmony_ci
35948c2ecf20Sopenharmony_ci	user_dir = (ctl & GOYA_PKT_LIN_DMA_CTL_DMA_DIR_MASK) >>
35958c2ecf20Sopenharmony_ci			GOYA_PKT_LIN_DMA_CTL_DMA_DIR_SHIFT;
35968c2ecf20Sopenharmony_ci
35978c2ecf20Sopenharmony_ci	user_memset = (ctl & GOYA_PKT_LIN_DMA_CTL_MEMSET_MASK) >>
35988c2ecf20Sopenharmony_ci			GOYA_PKT_LIN_DMA_CTL_MEMSET_SHIFT;
35998c2ecf20Sopenharmony_ci
36008c2ecf20Sopenharmony_ci	if ((user_dir == DMA_DRAM_TO_SRAM) || (user_dir == DMA_SRAM_TO_DRAM) ||
36018c2ecf20Sopenharmony_ci			(user_dma_pkt->tsize == 0)) {
36028c2ecf20Sopenharmony_ci		memcpy(new_dma_pkt, user_dma_pkt, sizeof(*new_dma_pkt));
36038c2ecf20Sopenharmony_ci		*new_dma_pkt_size = sizeof(*new_dma_pkt);
36048c2ecf20Sopenharmony_ci		return 0;
36058c2ecf20Sopenharmony_ci	}
36068c2ecf20Sopenharmony_ci
36078c2ecf20Sopenharmony_ci	if ((user_dir == DMA_HOST_TO_DRAM) || (user_dir == DMA_HOST_TO_SRAM)) {
36088c2ecf20Sopenharmony_ci		addr = le64_to_cpu(user_dma_pkt->src_addr);
36098c2ecf20Sopenharmony_ci		device_memory_addr = le64_to_cpu(user_dma_pkt->dst_addr);
36108c2ecf20Sopenharmony_ci		dir = DMA_TO_DEVICE;
36118c2ecf20Sopenharmony_ci		if (user_memset)
36128c2ecf20Sopenharmony_ci			skip_host_mem_pin = true;
36138c2ecf20Sopenharmony_ci	} else {
36148c2ecf20Sopenharmony_ci		addr = le64_to_cpu(user_dma_pkt->dst_addr);
36158c2ecf20Sopenharmony_ci		device_memory_addr = le64_to_cpu(user_dma_pkt->src_addr);
36168c2ecf20Sopenharmony_ci		dir = DMA_FROM_DEVICE;
36178c2ecf20Sopenharmony_ci	}
36188c2ecf20Sopenharmony_ci
36198c2ecf20Sopenharmony_ci	if ((!skip_host_mem_pin) &&
36208c2ecf20Sopenharmony_ci		(hl_userptr_is_pinned(hdev, addr,
36218c2ecf20Sopenharmony_ci			le32_to_cpu(user_dma_pkt->tsize),
36228c2ecf20Sopenharmony_ci			parser->job_userptr_list, &userptr) == false)) {
36238c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "Userptr 0x%llx + 0x%x NOT mapped\n",
36248c2ecf20Sopenharmony_ci				addr, user_dma_pkt->tsize);
36258c2ecf20Sopenharmony_ci		return -EFAULT;
36268c2ecf20Sopenharmony_ci	}
36278c2ecf20Sopenharmony_ci
36288c2ecf20Sopenharmony_ci	if ((user_memset) && (dir == DMA_TO_DEVICE)) {
36298c2ecf20Sopenharmony_ci		memcpy(new_dma_pkt, user_dma_pkt, sizeof(*user_dma_pkt));
36308c2ecf20Sopenharmony_ci		*new_dma_pkt_size = sizeof(*user_dma_pkt);
36318c2ecf20Sopenharmony_ci		return 0;
36328c2ecf20Sopenharmony_ci	}
36338c2ecf20Sopenharmony_ci
36348c2ecf20Sopenharmony_ci	user_rdcomp_mask = ctl & GOYA_PKT_LIN_DMA_CTL_RDCOMP_MASK;
36358c2ecf20Sopenharmony_ci
36368c2ecf20Sopenharmony_ci	user_wrcomp_mask = ctl & GOYA_PKT_LIN_DMA_CTL_WRCOMP_MASK;
36378c2ecf20Sopenharmony_ci
36388c2ecf20Sopenharmony_ci	sgt = userptr->sgt;
36398c2ecf20Sopenharmony_ci	dma_desc_cnt = 0;
36408c2ecf20Sopenharmony_ci
36418c2ecf20Sopenharmony_ci	for_each_sg(sgt->sgl, sg, sgt->nents, count) {
36428c2ecf20Sopenharmony_ci		len = sg_dma_len(sg);
36438c2ecf20Sopenharmony_ci		dma_addr = sg_dma_address(sg);
36448c2ecf20Sopenharmony_ci
36458c2ecf20Sopenharmony_ci		if (len == 0)
36468c2ecf20Sopenharmony_ci			break;
36478c2ecf20Sopenharmony_ci
36488c2ecf20Sopenharmony_ci		while ((count + 1) < sgt->nents) {
36498c2ecf20Sopenharmony_ci			sg_next_iter = sg_next(sg);
36508c2ecf20Sopenharmony_ci			len_next = sg_dma_len(sg_next_iter);
36518c2ecf20Sopenharmony_ci			dma_addr_next = sg_dma_address(sg_next_iter);
36528c2ecf20Sopenharmony_ci
36538c2ecf20Sopenharmony_ci			if (len_next == 0)
36548c2ecf20Sopenharmony_ci				break;
36558c2ecf20Sopenharmony_ci
36568c2ecf20Sopenharmony_ci			if ((dma_addr + len == dma_addr_next) &&
36578c2ecf20Sopenharmony_ci				(len + len_next <= DMA_MAX_TRANSFER_SIZE)) {
36588c2ecf20Sopenharmony_ci				len += len_next;
36598c2ecf20Sopenharmony_ci				count++;
36608c2ecf20Sopenharmony_ci				sg = sg_next_iter;
36618c2ecf20Sopenharmony_ci			} else {
36628c2ecf20Sopenharmony_ci				break;
36638c2ecf20Sopenharmony_ci			}
36648c2ecf20Sopenharmony_ci		}
36658c2ecf20Sopenharmony_ci
36668c2ecf20Sopenharmony_ci		ctl = le32_to_cpu(user_dma_pkt->ctl);
36678c2ecf20Sopenharmony_ci		if (likely(dma_desc_cnt))
36688c2ecf20Sopenharmony_ci			ctl &= ~GOYA_PKT_CTL_EB_MASK;
36698c2ecf20Sopenharmony_ci		ctl &= ~(GOYA_PKT_LIN_DMA_CTL_RDCOMP_MASK |
36708c2ecf20Sopenharmony_ci				GOYA_PKT_LIN_DMA_CTL_WRCOMP_MASK);
36718c2ecf20Sopenharmony_ci		new_dma_pkt->ctl = cpu_to_le32(ctl);
36728c2ecf20Sopenharmony_ci		new_dma_pkt->tsize = cpu_to_le32((u32) len);
36738c2ecf20Sopenharmony_ci
36748c2ecf20Sopenharmony_ci		if (dir == DMA_TO_DEVICE) {
36758c2ecf20Sopenharmony_ci			new_dma_pkt->src_addr = cpu_to_le64(dma_addr);
36768c2ecf20Sopenharmony_ci			new_dma_pkt->dst_addr = cpu_to_le64(device_memory_addr);
36778c2ecf20Sopenharmony_ci		} else {
36788c2ecf20Sopenharmony_ci			new_dma_pkt->src_addr = cpu_to_le64(device_memory_addr);
36798c2ecf20Sopenharmony_ci			new_dma_pkt->dst_addr = cpu_to_le64(dma_addr);
36808c2ecf20Sopenharmony_ci		}
36818c2ecf20Sopenharmony_ci
36828c2ecf20Sopenharmony_ci		if (!user_memset)
36838c2ecf20Sopenharmony_ci			device_memory_addr += len;
36848c2ecf20Sopenharmony_ci		dma_desc_cnt++;
36858c2ecf20Sopenharmony_ci		new_dma_pkt++;
36868c2ecf20Sopenharmony_ci	}
36878c2ecf20Sopenharmony_ci
36888c2ecf20Sopenharmony_ci	if (!dma_desc_cnt) {
36898c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
36908c2ecf20Sopenharmony_ci			"Error of 0 SG entries when patching DMA packet\n");
36918c2ecf20Sopenharmony_ci		return -EFAULT;
36928c2ecf20Sopenharmony_ci	}
36938c2ecf20Sopenharmony_ci
36948c2ecf20Sopenharmony_ci	/* Fix the last dma packet - rdcomp/wrcomp must be as user set them */
36958c2ecf20Sopenharmony_ci	new_dma_pkt--;
36968c2ecf20Sopenharmony_ci	new_dma_pkt->ctl |= cpu_to_le32(user_rdcomp_mask | user_wrcomp_mask);
36978c2ecf20Sopenharmony_ci
36988c2ecf20Sopenharmony_ci	*new_dma_pkt_size = dma_desc_cnt * sizeof(struct packet_lin_dma);
36998c2ecf20Sopenharmony_ci
37008c2ecf20Sopenharmony_ci	return 0;
37018c2ecf20Sopenharmony_ci}
37028c2ecf20Sopenharmony_ci
37038c2ecf20Sopenharmony_cistatic int goya_patch_cb(struct hl_device *hdev,
37048c2ecf20Sopenharmony_ci				struct hl_cs_parser *parser)
37058c2ecf20Sopenharmony_ci{
37068c2ecf20Sopenharmony_ci	u32 cb_parsed_length = 0;
37078c2ecf20Sopenharmony_ci	u32 cb_patched_cur_length = 0;
37088c2ecf20Sopenharmony_ci	int rc = 0;
37098c2ecf20Sopenharmony_ci
37108c2ecf20Sopenharmony_ci	/* cb_user_size is more than 0 so loop will always be executed */
37118c2ecf20Sopenharmony_ci	while (cb_parsed_length < parser->user_cb_size) {
37128c2ecf20Sopenharmony_ci		enum packet_id pkt_id;
37138c2ecf20Sopenharmony_ci		u16 pkt_size;
37148c2ecf20Sopenharmony_ci		u32 new_pkt_size = 0;
37158c2ecf20Sopenharmony_ci		struct goya_packet *user_pkt, *kernel_pkt;
37168c2ecf20Sopenharmony_ci
37178c2ecf20Sopenharmony_ci		user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
37188c2ecf20Sopenharmony_ci		kernel_pkt = parser->patched_cb->kernel_address +
37198c2ecf20Sopenharmony_ci					cb_patched_cur_length;
37208c2ecf20Sopenharmony_ci
37218c2ecf20Sopenharmony_ci		pkt_id = (enum packet_id) (
37228c2ecf20Sopenharmony_ci				(le64_to_cpu(user_pkt->header) &
37238c2ecf20Sopenharmony_ci				PACKET_HEADER_PACKET_ID_MASK) >>
37248c2ecf20Sopenharmony_ci					PACKET_HEADER_PACKET_ID_SHIFT);
37258c2ecf20Sopenharmony_ci
37268c2ecf20Sopenharmony_ci		if (!validate_packet_id(pkt_id)) {
37278c2ecf20Sopenharmony_ci			dev_err(hdev->dev, "Invalid packet id %u\n", pkt_id);
37288c2ecf20Sopenharmony_ci			rc = -EINVAL;
37298c2ecf20Sopenharmony_ci			break;
37308c2ecf20Sopenharmony_ci		}
37318c2ecf20Sopenharmony_ci
37328c2ecf20Sopenharmony_ci		pkt_size = goya_packet_sizes[pkt_id];
37338c2ecf20Sopenharmony_ci		cb_parsed_length += pkt_size;
37348c2ecf20Sopenharmony_ci		if (cb_parsed_length > parser->user_cb_size) {
37358c2ecf20Sopenharmony_ci			dev_err(hdev->dev,
37368c2ecf20Sopenharmony_ci				"packet 0x%x is out of CB boundary\n", pkt_id);
37378c2ecf20Sopenharmony_ci			rc = -EINVAL;
37388c2ecf20Sopenharmony_ci			break;
37398c2ecf20Sopenharmony_ci		}
37408c2ecf20Sopenharmony_ci
37418c2ecf20Sopenharmony_ci		switch (pkt_id) {
37428c2ecf20Sopenharmony_ci		case PACKET_LIN_DMA:
37438c2ecf20Sopenharmony_ci			rc = goya_patch_dma_packet(hdev, parser,
37448c2ecf20Sopenharmony_ci					(struct packet_lin_dma *) user_pkt,
37458c2ecf20Sopenharmony_ci					(struct packet_lin_dma *) kernel_pkt,
37468c2ecf20Sopenharmony_ci					&new_pkt_size);
37478c2ecf20Sopenharmony_ci			cb_patched_cur_length += new_pkt_size;
37488c2ecf20Sopenharmony_ci			break;
37498c2ecf20Sopenharmony_ci
37508c2ecf20Sopenharmony_ci		case PACKET_WREG_32:
37518c2ecf20Sopenharmony_ci			memcpy(kernel_pkt, user_pkt, pkt_size);
37528c2ecf20Sopenharmony_ci			cb_patched_cur_length += pkt_size;
37538c2ecf20Sopenharmony_ci			rc = goya_validate_wreg32(hdev, parser,
37548c2ecf20Sopenharmony_ci					(struct packet_wreg32 *) kernel_pkt);
37558c2ecf20Sopenharmony_ci			break;
37568c2ecf20Sopenharmony_ci
37578c2ecf20Sopenharmony_ci		case PACKET_WREG_BULK:
37588c2ecf20Sopenharmony_ci			dev_err(hdev->dev,
37598c2ecf20Sopenharmony_ci				"User not allowed to use WREG_BULK\n");
37608c2ecf20Sopenharmony_ci			rc = -EPERM;
37618c2ecf20Sopenharmony_ci			break;
37628c2ecf20Sopenharmony_ci
37638c2ecf20Sopenharmony_ci		case PACKET_MSG_PROT:
37648c2ecf20Sopenharmony_ci			dev_err(hdev->dev,
37658c2ecf20Sopenharmony_ci				"User not allowed to use MSG_PROT\n");
37668c2ecf20Sopenharmony_ci			rc = -EPERM;
37678c2ecf20Sopenharmony_ci			break;
37688c2ecf20Sopenharmony_ci
37698c2ecf20Sopenharmony_ci		case PACKET_CP_DMA:
37708c2ecf20Sopenharmony_ci			dev_err(hdev->dev, "User not allowed to use CP_DMA\n");
37718c2ecf20Sopenharmony_ci			rc = -EPERM;
37728c2ecf20Sopenharmony_ci			break;
37738c2ecf20Sopenharmony_ci
37748c2ecf20Sopenharmony_ci		case PACKET_STOP:
37758c2ecf20Sopenharmony_ci			dev_err(hdev->dev, "User not allowed to use STOP\n");
37768c2ecf20Sopenharmony_ci			rc = -EPERM;
37778c2ecf20Sopenharmony_ci			break;
37788c2ecf20Sopenharmony_ci
37798c2ecf20Sopenharmony_ci		case PACKET_MSG_LONG:
37808c2ecf20Sopenharmony_ci		case PACKET_MSG_SHORT:
37818c2ecf20Sopenharmony_ci		case PACKET_FENCE:
37828c2ecf20Sopenharmony_ci		case PACKET_NOP:
37838c2ecf20Sopenharmony_ci			memcpy(kernel_pkt, user_pkt, pkt_size);
37848c2ecf20Sopenharmony_ci			cb_patched_cur_length += pkt_size;
37858c2ecf20Sopenharmony_ci			break;
37868c2ecf20Sopenharmony_ci
37878c2ecf20Sopenharmony_ci		default:
37888c2ecf20Sopenharmony_ci			dev_err(hdev->dev, "Invalid packet header 0x%x\n",
37898c2ecf20Sopenharmony_ci				pkt_id);
37908c2ecf20Sopenharmony_ci			rc = -EINVAL;
37918c2ecf20Sopenharmony_ci			break;
37928c2ecf20Sopenharmony_ci		}
37938c2ecf20Sopenharmony_ci
37948c2ecf20Sopenharmony_ci		if (rc)
37958c2ecf20Sopenharmony_ci			break;
37968c2ecf20Sopenharmony_ci	}
37978c2ecf20Sopenharmony_ci
37988c2ecf20Sopenharmony_ci	return rc;
37998c2ecf20Sopenharmony_ci}
38008c2ecf20Sopenharmony_ci
38018c2ecf20Sopenharmony_cistatic int goya_parse_cb_mmu(struct hl_device *hdev,
38028c2ecf20Sopenharmony_ci		struct hl_cs_parser *parser)
38038c2ecf20Sopenharmony_ci{
38048c2ecf20Sopenharmony_ci	u64 patched_cb_handle;
38058c2ecf20Sopenharmony_ci	u32 patched_cb_size;
38068c2ecf20Sopenharmony_ci	struct hl_cb *user_cb;
38078c2ecf20Sopenharmony_ci	int rc;
38088c2ecf20Sopenharmony_ci
38098c2ecf20Sopenharmony_ci	/*
38108c2ecf20Sopenharmony_ci	 * The new CB should have space at the end for two MSG_PROT pkt:
38118c2ecf20Sopenharmony_ci	 * 1. A packet that will act as a completion packet
38128c2ecf20Sopenharmony_ci	 * 2. A packet that will generate MSI-X interrupt
38138c2ecf20Sopenharmony_ci	 */
38148c2ecf20Sopenharmony_ci	parser->patched_cb_size = parser->user_cb_size +
38158c2ecf20Sopenharmony_ci			sizeof(struct packet_msg_prot) * 2;
38168c2ecf20Sopenharmony_ci
38178c2ecf20Sopenharmony_ci	rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx,
38188c2ecf20Sopenharmony_ci				parser->patched_cb_size, false, false,
38198c2ecf20Sopenharmony_ci				&patched_cb_handle);
38208c2ecf20Sopenharmony_ci
38218c2ecf20Sopenharmony_ci	if (rc) {
38228c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
38238c2ecf20Sopenharmony_ci			"Failed to allocate patched CB for DMA CS %d\n",
38248c2ecf20Sopenharmony_ci			rc);
38258c2ecf20Sopenharmony_ci		return rc;
38268c2ecf20Sopenharmony_ci	}
38278c2ecf20Sopenharmony_ci
38288c2ecf20Sopenharmony_ci	patched_cb_handle >>= PAGE_SHIFT;
38298c2ecf20Sopenharmony_ci	parser->patched_cb = hl_cb_get(hdev, &hdev->kernel_cb_mgr,
38308c2ecf20Sopenharmony_ci				(u32) patched_cb_handle);
38318c2ecf20Sopenharmony_ci	/* hl_cb_get should never fail here so use kernel WARN */
38328c2ecf20Sopenharmony_ci	WARN(!parser->patched_cb, "DMA CB handle invalid 0x%x\n",
38338c2ecf20Sopenharmony_ci			(u32) patched_cb_handle);
38348c2ecf20Sopenharmony_ci	if (!parser->patched_cb) {
38358c2ecf20Sopenharmony_ci		rc = -EFAULT;
38368c2ecf20Sopenharmony_ci		goto out;
38378c2ecf20Sopenharmony_ci	}
38388c2ecf20Sopenharmony_ci
38398c2ecf20Sopenharmony_ci	/*
38408c2ecf20Sopenharmony_ci	 * The check that parser->user_cb_size <= parser->user_cb->size was done
38418c2ecf20Sopenharmony_ci	 * in validate_queue_index().
38428c2ecf20Sopenharmony_ci	 */
38438c2ecf20Sopenharmony_ci	memcpy(parser->patched_cb->kernel_address,
38448c2ecf20Sopenharmony_ci		parser->user_cb->kernel_address,
38458c2ecf20Sopenharmony_ci		parser->user_cb_size);
38468c2ecf20Sopenharmony_ci
38478c2ecf20Sopenharmony_ci	patched_cb_size = parser->patched_cb_size;
38488c2ecf20Sopenharmony_ci
38498c2ecf20Sopenharmony_ci	/* validate patched CB instead of user CB */
38508c2ecf20Sopenharmony_ci	user_cb = parser->user_cb;
38518c2ecf20Sopenharmony_ci	parser->user_cb = parser->patched_cb;
38528c2ecf20Sopenharmony_ci	rc = goya_validate_cb(hdev, parser, true);
38538c2ecf20Sopenharmony_ci	parser->user_cb = user_cb;
38548c2ecf20Sopenharmony_ci
38558c2ecf20Sopenharmony_ci	if (rc) {
38568c2ecf20Sopenharmony_ci		hl_cb_put(parser->patched_cb);
38578c2ecf20Sopenharmony_ci		goto out;
38588c2ecf20Sopenharmony_ci	}
38598c2ecf20Sopenharmony_ci
38608c2ecf20Sopenharmony_ci	if (patched_cb_size != parser->patched_cb_size) {
38618c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "user CB size mismatch\n");
38628c2ecf20Sopenharmony_ci		hl_cb_put(parser->patched_cb);
38638c2ecf20Sopenharmony_ci		rc = -EINVAL;
38648c2ecf20Sopenharmony_ci		goto out;
38658c2ecf20Sopenharmony_ci	}
38668c2ecf20Sopenharmony_ci
38678c2ecf20Sopenharmony_ciout:
38688c2ecf20Sopenharmony_ci	/*
38698c2ecf20Sopenharmony_ci	 * Always call cb destroy here because we still have 1 reference
38708c2ecf20Sopenharmony_ci	 * to it by calling cb_get earlier. After the job will be completed,
38718c2ecf20Sopenharmony_ci	 * cb_put will release it, but here we want to remove it from the
38728c2ecf20Sopenharmony_ci	 * idr
38738c2ecf20Sopenharmony_ci	 */
38748c2ecf20Sopenharmony_ci	hl_cb_destroy(hdev, &hdev->kernel_cb_mgr,
38758c2ecf20Sopenharmony_ci					patched_cb_handle << PAGE_SHIFT);
38768c2ecf20Sopenharmony_ci
38778c2ecf20Sopenharmony_ci	return rc;
38788c2ecf20Sopenharmony_ci}
38798c2ecf20Sopenharmony_ci
38808c2ecf20Sopenharmony_cistatic int goya_parse_cb_no_mmu(struct hl_device *hdev,
38818c2ecf20Sopenharmony_ci				struct hl_cs_parser *parser)
38828c2ecf20Sopenharmony_ci{
38838c2ecf20Sopenharmony_ci	u64 patched_cb_handle;
38848c2ecf20Sopenharmony_ci	int rc;
38858c2ecf20Sopenharmony_ci
38868c2ecf20Sopenharmony_ci	rc = goya_validate_cb(hdev, parser, false);
38878c2ecf20Sopenharmony_ci
38888c2ecf20Sopenharmony_ci	if (rc)
38898c2ecf20Sopenharmony_ci		goto free_userptr;
38908c2ecf20Sopenharmony_ci
38918c2ecf20Sopenharmony_ci	rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx,
38928c2ecf20Sopenharmony_ci				parser->patched_cb_size, false, false,
38938c2ecf20Sopenharmony_ci				&patched_cb_handle);
38948c2ecf20Sopenharmony_ci	if (rc) {
38958c2ecf20Sopenharmony_ci		dev_err(hdev->dev,
38968c2ecf20Sopenharmony_ci			"Failed to allocate patched CB for DMA CS %d\n", rc);
38978c2ecf20Sopenharmony_ci		goto free_userptr;
38988c2ecf20Sopenharmony_ci	}
38998c2ecf20Sopenharmony_ci
39008c2ecf20Sopenharmony_ci	patched_cb_handle >>= PAGE_SHIFT;
39018c2ecf20Sopenharmony_ci	parser->patched_cb = hl_cb_get(hdev, &hdev->kernel_cb_mgr,
39028c2ecf20Sopenharmony_ci				(u32) patched_cb_handle);
39038c2ecf20Sopenharmony_ci	/* hl_cb_get should never fail here so use kernel WARN */
39048c2ecf20Sopenharmony_ci	WARN(!parser->patched_cb, "DMA CB handle invalid 0x%x\n",
39058c2ecf20Sopenharmony_ci			(u32) patched_cb_handle);
39068c2ecf20Sopenharmony_ci	if (!parser->patched_cb) {
39078c2ecf20Sopenharmony_ci		rc = -EFAULT;
39088c2ecf20Sopenharmony_ci		goto out;
39098c2ecf20Sopenharmony_ci	}
39108c2ecf20Sopenharmony_ci
39118c2ecf20Sopenharmony_ci	rc = goya_patch_cb(hdev, parser);
39128c2ecf20Sopenharmony_ci
39138c2ecf20Sopenharmony_ci	if (rc)
39148c2ecf20Sopenharmony_ci		hl_cb_put(parser->patched_cb);
39158c2ecf20Sopenharmony_ci
39168c2ecf20Sopenharmony_ciout:
39178c2ecf20Sopenharmony_ci	/*
39188c2ecf20Sopenharmony_ci	 * Always call cb destroy here because we still have 1 reference
39198c2ecf20Sopenharmony_ci	 * to it by calling cb_get earlier. After the job will be completed,
39208c2ecf20Sopenharmony_ci	 * cb_put will release it, but here we want to remove it from the
39218c2ecf20Sopenharmony_ci	 * idr
39228c2ecf20Sopenharmony_ci	 */
39238c2ecf20Sopenharmony_ci	hl_cb_destroy(hdev, &hdev->kernel_cb_mgr,
39248c2ecf20Sopenharmony_ci				patched_cb_handle << PAGE_SHIFT);
39258c2ecf20Sopenharmony_ci
39268c2ecf20Sopenharmony_cifree_userptr:
39278c2ecf20Sopenharmony_ci	if (rc)
39288c2ecf20Sopenharmony_ci		hl_userptr_delete_list(hdev, parser->job_userptr_list);
39298c2ecf20Sopenharmony_ci	return rc;
39308c2ecf20Sopenharmony_ci}
39318c2ecf20Sopenharmony_ci
39328c2ecf20Sopenharmony_cistatic int goya_parse_cb_no_ext_queue(struct hl_device *hdev,
39338c2ecf20Sopenharmony_ci					struct hl_cs_parser *parser)
39348c2ecf20Sopenharmony_ci{
39358c2ecf20Sopenharmony_ci	struct asic_fixed_properties *asic_prop = &hdev->asic_prop;
39368c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
39378c2ecf20Sopenharmony_ci
39388c2ecf20Sopenharmony_ci	if (goya->hw_cap_initialized & HW_CAP_MMU)
39398c2ecf20Sopenharmony_ci		return 0;
39408c2ecf20Sopenharmony_ci
39418c2ecf20Sopenharmony_ci	/* For internal queue jobs, just check if CB address is valid */
39428c2ecf20Sopenharmony_ci	if (hl_mem_area_inside_range(
39438c2ecf20Sopenharmony_ci			(u64) (uintptr_t) parser->user_cb,
39448c2ecf20Sopenharmony_ci			parser->user_cb_size,
39458c2ecf20Sopenharmony_ci			asic_prop->sram_user_base_address,
39468c2ecf20Sopenharmony_ci			asic_prop->sram_end_address))
39478c2ecf20Sopenharmony_ci		return 0;
39488c2ecf20Sopenharmony_ci
39498c2ecf20Sopenharmony_ci	if (hl_mem_area_inside_range(
39508c2ecf20Sopenharmony_ci			(u64) (uintptr_t) parser->user_cb,
39518c2ecf20Sopenharmony_ci			parser->user_cb_size,
39528c2ecf20Sopenharmony_ci			asic_prop->dram_user_base_address,
39538c2ecf20Sopenharmony_ci			asic_prop->dram_end_address))
39548c2ecf20Sopenharmony_ci		return 0;
39558c2ecf20Sopenharmony_ci
39568c2ecf20Sopenharmony_ci	dev_err(hdev->dev,
39578c2ecf20Sopenharmony_ci		"Internal CB address 0x%px + 0x%x is not in SRAM nor in DRAM\n",
39588c2ecf20Sopenharmony_ci		parser->user_cb, parser->user_cb_size);
39598c2ecf20Sopenharmony_ci
39608c2ecf20Sopenharmony_ci	return -EFAULT;
39618c2ecf20Sopenharmony_ci}
39628c2ecf20Sopenharmony_ci
39638c2ecf20Sopenharmony_ciint goya_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser)
39648c2ecf20Sopenharmony_ci{
39658c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
39668c2ecf20Sopenharmony_ci
39678c2ecf20Sopenharmony_ci	if (parser->queue_type == QUEUE_TYPE_INT)
39688c2ecf20Sopenharmony_ci		return goya_parse_cb_no_ext_queue(hdev, parser);
39698c2ecf20Sopenharmony_ci
39708c2ecf20Sopenharmony_ci	if (goya->hw_cap_initialized & HW_CAP_MMU)
39718c2ecf20Sopenharmony_ci		return goya_parse_cb_mmu(hdev, parser);
39728c2ecf20Sopenharmony_ci	else
39738c2ecf20Sopenharmony_ci		return goya_parse_cb_no_mmu(hdev, parser);
39748c2ecf20Sopenharmony_ci}
39758c2ecf20Sopenharmony_ci
39768c2ecf20Sopenharmony_civoid goya_add_end_of_cb_packets(struct hl_device *hdev, void *kernel_address,
39778c2ecf20Sopenharmony_ci				u32 len, u64 cq_addr, u32 cq_val, u32 msix_vec,
39788c2ecf20Sopenharmony_ci				bool eb)
39798c2ecf20Sopenharmony_ci{
39808c2ecf20Sopenharmony_ci	struct packet_msg_prot *cq_pkt;
39818c2ecf20Sopenharmony_ci	u32 tmp;
39828c2ecf20Sopenharmony_ci
39838c2ecf20Sopenharmony_ci	cq_pkt = kernel_address + len - (sizeof(struct packet_msg_prot) * 2);
39848c2ecf20Sopenharmony_ci
39858c2ecf20Sopenharmony_ci	tmp = (PACKET_MSG_PROT << GOYA_PKT_CTL_OPCODE_SHIFT) |
39868c2ecf20Sopenharmony_ci			(1 << GOYA_PKT_CTL_EB_SHIFT) |
39878c2ecf20Sopenharmony_ci			(1 << GOYA_PKT_CTL_MB_SHIFT);
39888c2ecf20Sopenharmony_ci	cq_pkt->ctl = cpu_to_le32(tmp);
39898c2ecf20Sopenharmony_ci	cq_pkt->value = cpu_to_le32(cq_val);
39908c2ecf20Sopenharmony_ci	cq_pkt->addr = cpu_to_le64(cq_addr);
39918c2ecf20Sopenharmony_ci
39928c2ecf20Sopenharmony_ci	cq_pkt++;
39938c2ecf20Sopenharmony_ci
39948c2ecf20Sopenharmony_ci	tmp = (PACKET_MSG_PROT << GOYA_PKT_CTL_OPCODE_SHIFT) |
39958c2ecf20Sopenharmony_ci			(1 << GOYA_PKT_CTL_MB_SHIFT);
39968c2ecf20Sopenharmony_ci	cq_pkt->ctl = cpu_to_le32(tmp);
39978c2ecf20Sopenharmony_ci	cq_pkt->value = cpu_to_le32(msix_vec & 0x7FF);
39988c2ecf20Sopenharmony_ci	cq_pkt->addr = cpu_to_le64(CFG_BASE + mmPCIE_DBI_MSIX_DOORBELL_OFF);
39998c2ecf20Sopenharmony_ci}
40008c2ecf20Sopenharmony_ci
40018c2ecf20Sopenharmony_civoid goya_update_eq_ci(struct hl_device *hdev, u32 val)
40028c2ecf20Sopenharmony_ci{
40038c2ecf20Sopenharmony_ci	WREG32(mmCPU_EQ_CI, val);
40048c2ecf20Sopenharmony_ci}
40058c2ecf20Sopenharmony_ci
40068c2ecf20Sopenharmony_civoid goya_restore_phase_topology(struct hl_device *hdev)
40078c2ecf20Sopenharmony_ci{
40088c2ecf20Sopenharmony_ci
40098c2ecf20Sopenharmony_ci}
40108c2ecf20Sopenharmony_ci
40118c2ecf20Sopenharmony_cistatic void goya_clear_sm_regs(struct hl_device *hdev)
40128c2ecf20Sopenharmony_ci{
40138c2ecf20Sopenharmony_ci	int i, num_of_sob_in_longs, num_of_mon_in_longs;
40148c2ecf20Sopenharmony_ci
40158c2ecf20Sopenharmony_ci	num_of_sob_in_longs =
40168c2ecf20Sopenharmony_ci		((mmSYNC_MNGR_SOB_OBJ_1023 - mmSYNC_MNGR_SOB_OBJ_0) + 4);
40178c2ecf20Sopenharmony_ci
40188c2ecf20Sopenharmony_ci	num_of_mon_in_longs =
40198c2ecf20Sopenharmony_ci		((mmSYNC_MNGR_MON_STATUS_255 - mmSYNC_MNGR_MON_STATUS_0) + 4);
40208c2ecf20Sopenharmony_ci
40218c2ecf20Sopenharmony_ci	for (i = 0 ; i < num_of_sob_in_longs ; i += 4)
40228c2ecf20Sopenharmony_ci		WREG32(mmSYNC_MNGR_SOB_OBJ_0 + i, 0);
40238c2ecf20Sopenharmony_ci
40248c2ecf20Sopenharmony_ci	for (i = 0 ; i < num_of_mon_in_longs ; i += 4)
40258c2ecf20Sopenharmony_ci		WREG32(mmSYNC_MNGR_MON_STATUS_0 + i, 0);
40268c2ecf20Sopenharmony_ci
40278c2ecf20Sopenharmony_ci	/* Flush all WREG to prevent race */
40288c2ecf20Sopenharmony_ci	i = RREG32(mmSYNC_MNGR_SOB_OBJ_0);
40298c2ecf20Sopenharmony_ci}
40308c2ecf20Sopenharmony_ci
40318c2ecf20Sopenharmony_ci/*
40328c2ecf20Sopenharmony_ci * goya_debugfs_read32 - read a 32bit value from a given device or a host mapped
40338c2ecf20Sopenharmony_ci *                       address.
40348c2ecf20Sopenharmony_ci *
40358c2ecf20Sopenharmony_ci * @hdev:	pointer to hl_device structure
40368c2ecf20Sopenharmony_ci * @addr:	device or host mapped address
40378c2ecf20Sopenharmony_ci * @val:	returned value
40388c2ecf20Sopenharmony_ci *
40398c2ecf20Sopenharmony_ci * In case of DDR address that is not mapped into the default aperture that
40408c2ecf20Sopenharmony_ci * the DDR bar exposes, the function will configure the iATU so that the DDR
40418c2ecf20Sopenharmony_ci * bar will be positioned at a base address that allows reading from the
40428c2ecf20Sopenharmony_ci * required address. Configuring the iATU during normal operation can
40438c2ecf20Sopenharmony_ci * lead to undefined behavior and therefore, should be done with extreme care
40448c2ecf20Sopenharmony_ci *
40458c2ecf20Sopenharmony_ci */
40468c2ecf20Sopenharmony_cistatic int goya_debugfs_read32(struct hl_device *hdev, u64 addr, u32 *val)
40478c2ecf20Sopenharmony_ci{
40488c2ecf20Sopenharmony_ci	struct asic_fixed_properties *prop = &hdev->asic_prop;
40498c2ecf20Sopenharmony_ci	u64 ddr_bar_addr;
40508c2ecf20Sopenharmony_ci	int rc = 0;
40518c2ecf20Sopenharmony_ci
40528c2ecf20Sopenharmony_ci	if ((addr >= CFG_BASE) && (addr < CFG_BASE + CFG_SIZE)) {
40538c2ecf20Sopenharmony_ci		*val = RREG32(addr - CFG_BASE);
40548c2ecf20Sopenharmony_ci
40558c2ecf20Sopenharmony_ci	} else if ((addr >= SRAM_BASE_ADDR) &&
40568c2ecf20Sopenharmony_ci			(addr < SRAM_BASE_ADDR + SRAM_SIZE)) {
40578c2ecf20Sopenharmony_ci
40588c2ecf20Sopenharmony_ci		*val = readl(hdev->pcie_bar[SRAM_CFG_BAR_ID] +
40598c2ecf20Sopenharmony_ci				(addr - SRAM_BASE_ADDR));
40608c2ecf20Sopenharmony_ci
40618c2ecf20Sopenharmony_ci	} else if (addr < DRAM_PHYS_BASE + hdev->asic_prop.dram_size) {
40628c2ecf20Sopenharmony_ci
40638c2ecf20Sopenharmony_ci		u64 bar_base_addr = DRAM_PHYS_BASE +
40648c2ecf20Sopenharmony_ci				(addr & ~(prop->dram_pci_bar_size - 0x1ull));
40658c2ecf20Sopenharmony_ci
40668c2ecf20Sopenharmony_ci		ddr_bar_addr = goya_set_ddr_bar_base(hdev, bar_base_addr);
40678c2ecf20Sopenharmony_ci		if (ddr_bar_addr != U64_MAX) {
40688c2ecf20Sopenharmony_ci			*val = readl(hdev->pcie_bar[DDR_BAR_ID] +
40698c2ecf20Sopenharmony_ci						(addr - bar_base_addr));
40708c2ecf20Sopenharmony_ci
40718c2ecf20Sopenharmony_ci			ddr_bar_addr = goya_set_ddr_bar_base(hdev,
40728c2ecf20Sopenharmony_ci							ddr_bar_addr);
40738c2ecf20Sopenharmony_ci		}
40748c2ecf20Sopenharmony_ci		if (ddr_bar_addr == U64_MAX)
40758c2ecf20Sopenharmony_ci			rc = -EIO;
40768c2ecf20Sopenharmony_ci
40778c2ecf20Sopenharmony_ci	} else if (addr >= HOST_PHYS_BASE && !iommu_present(&pci_bus_type)) {
40788c2ecf20Sopenharmony_ci		*val = *(u32 *) phys_to_virt(addr - HOST_PHYS_BASE);
40798c2ecf20Sopenharmony_ci
40808c2ecf20Sopenharmony_ci	} else {
40818c2ecf20Sopenharmony_ci		rc = -EFAULT;
40828c2ecf20Sopenharmony_ci	}
40838c2ecf20Sopenharmony_ci
40848c2ecf20Sopenharmony_ci	return rc;
40858c2ecf20Sopenharmony_ci}
40868c2ecf20Sopenharmony_ci
40878c2ecf20Sopenharmony_ci/*
40888c2ecf20Sopenharmony_ci * goya_debugfs_write32 - write a 32bit value to a given device or a host mapped
40898c2ecf20Sopenharmony_ci *                        address.
40908c2ecf20Sopenharmony_ci *
40918c2ecf20Sopenharmony_ci * @hdev:	pointer to hl_device structure
40928c2ecf20Sopenharmony_ci * @addr:	device or host mapped address
40938c2ecf20Sopenharmony_ci * @val:	returned value
40948c2ecf20Sopenharmony_ci *
40958c2ecf20Sopenharmony_ci * In case of DDR address that is not mapped into the default aperture that
40968c2ecf20Sopenharmony_ci * the DDR bar exposes, the function will configure the iATU so that the DDR
40978c2ecf20Sopenharmony_ci * bar will be positioned at a base address that allows writing to the
40988c2ecf20Sopenharmony_ci * required address. Configuring the iATU during normal operation can
40998c2ecf20Sopenharmony_ci * lead to undefined behavior and therefore, should be done with extreme care
41008c2ecf20Sopenharmony_ci *
41018c2ecf20Sopenharmony_ci */
41028c2ecf20Sopenharmony_cistatic int goya_debugfs_write32(struct hl_device *hdev, u64 addr, u32 val)
41038c2ecf20Sopenharmony_ci{
41048c2ecf20Sopenharmony_ci	struct asic_fixed_properties *prop = &hdev->asic_prop;
41058c2ecf20Sopenharmony_ci	u64 ddr_bar_addr;
41068c2ecf20Sopenharmony_ci	int rc = 0;
41078c2ecf20Sopenharmony_ci
41088c2ecf20Sopenharmony_ci	if ((addr >= CFG_BASE) && (addr < CFG_BASE + CFG_SIZE)) {
41098c2ecf20Sopenharmony_ci		WREG32(addr - CFG_BASE, val);
41108c2ecf20Sopenharmony_ci
41118c2ecf20Sopenharmony_ci	} else if ((addr >= SRAM_BASE_ADDR) &&
41128c2ecf20Sopenharmony_ci			(addr < SRAM_BASE_ADDR + SRAM_SIZE)) {
41138c2ecf20Sopenharmony_ci
41148c2ecf20Sopenharmony_ci		writel(val, hdev->pcie_bar[SRAM_CFG_BAR_ID] +
41158c2ecf20Sopenharmony_ci					(addr - SRAM_BASE_ADDR));
41168c2ecf20Sopenharmony_ci
41178c2ecf20Sopenharmony_ci	} else if (addr < DRAM_PHYS_BASE + hdev->asic_prop.dram_size) {
41188c2ecf20Sopenharmony_ci
41198c2ecf20Sopenharmony_ci		u64 bar_base_addr = DRAM_PHYS_BASE +
41208c2ecf20Sopenharmony_ci				(addr & ~(prop->dram_pci_bar_size - 0x1ull));
41218c2ecf20Sopenharmony_ci
41228c2ecf20Sopenharmony_ci		ddr_bar_addr = goya_set_ddr_bar_base(hdev, bar_base_addr);
41238c2ecf20Sopenharmony_ci		if (ddr_bar_addr != U64_MAX) {
41248c2ecf20Sopenharmony_ci			writel(val, hdev->pcie_bar[DDR_BAR_ID] +
41258c2ecf20Sopenharmony_ci						(addr - bar_base_addr));
41268c2ecf20Sopenharmony_ci
41278c2ecf20Sopenharmony_ci			ddr_bar_addr = goya_set_ddr_bar_base(hdev,
41288c2ecf20Sopenharmony_ci							ddr_bar_addr);
41298c2ecf20Sopenharmony_ci		}
41308c2ecf20Sopenharmony_ci		if (ddr_bar_addr == U64_MAX)
41318c2ecf20Sopenharmony_ci			rc = -EIO;
41328c2ecf20Sopenharmony_ci
41338c2ecf20Sopenharmony_ci	} else if (addr >= HOST_PHYS_BASE && !iommu_present(&pci_bus_type)) {
41348c2ecf20Sopenharmony_ci		*(u32 *) phys_to_virt(addr - HOST_PHYS_BASE) = val;
41358c2ecf20Sopenharmony_ci
41368c2ecf20Sopenharmony_ci	} else {
41378c2ecf20Sopenharmony_ci		rc = -EFAULT;
41388c2ecf20Sopenharmony_ci	}
41398c2ecf20Sopenharmony_ci
41408c2ecf20Sopenharmony_ci	return rc;
41418c2ecf20Sopenharmony_ci}
41428c2ecf20Sopenharmony_ci
41438c2ecf20Sopenharmony_cistatic int goya_debugfs_read64(struct hl_device *hdev, u64 addr, u64 *val)
41448c2ecf20Sopenharmony_ci{
41458c2ecf20Sopenharmony_ci	struct asic_fixed_properties *prop = &hdev->asic_prop;
41468c2ecf20Sopenharmony_ci	u64 ddr_bar_addr;
41478c2ecf20Sopenharmony_ci	int rc = 0;
41488c2ecf20Sopenharmony_ci
41498c2ecf20Sopenharmony_ci	if ((addr >= CFG_BASE) && (addr <= CFG_BASE + CFG_SIZE - sizeof(u64))) {
41508c2ecf20Sopenharmony_ci		u32 val_l = RREG32(addr - CFG_BASE);
41518c2ecf20Sopenharmony_ci		u32 val_h = RREG32(addr + sizeof(u32) - CFG_BASE);
41528c2ecf20Sopenharmony_ci
41538c2ecf20Sopenharmony_ci		*val = (((u64) val_h) << 32) | val_l;
41548c2ecf20Sopenharmony_ci
41558c2ecf20Sopenharmony_ci	} else if ((addr >= SRAM_BASE_ADDR) &&
41568c2ecf20Sopenharmony_ci			(addr <= SRAM_BASE_ADDR + SRAM_SIZE - sizeof(u64))) {
41578c2ecf20Sopenharmony_ci
41588c2ecf20Sopenharmony_ci		*val = readq(hdev->pcie_bar[SRAM_CFG_BAR_ID] +
41598c2ecf20Sopenharmony_ci				(addr - SRAM_BASE_ADDR));
41608c2ecf20Sopenharmony_ci
41618c2ecf20Sopenharmony_ci	} else if (addr <=
41628c2ecf20Sopenharmony_ci		   DRAM_PHYS_BASE + hdev->asic_prop.dram_size - sizeof(u64)) {
41638c2ecf20Sopenharmony_ci
41648c2ecf20Sopenharmony_ci		u64 bar_base_addr = DRAM_PHYS_BASE +
41658c2ecf20Sopenharmony_ci				(addr & ~(prop->dram_pci_bar_size - 0x1ull));
41668c2ecf20Sopenharmony_ci
41678c2ecf20Sopenharmony_ci		ddr_bar_addr = goya_set_ddr_bar_base(hdev, bar_base_addr);
41688c2ecf20Sopenharmony_ci		if (ddr_bar_addr != U64_MAX) {
41698c2ecf20Sopenharmony_ci			*val = readq(hdev->pcie_bar[DDR_BAR_ID] +
41708c2ecf20Sopenharmony_ci						(addr - bar_base_addr));
41718c2ecf20Sopenharmony_ci
41728c2ecf20Sopenharmony_ci			ddr_bar_addr = goya_set_ddr_bar_base(hdev,
41738c2ecf20Sopenharmony_ci							ddr_bar_addr);
41748c2ecf20Sopenharmony_ci		}
41758c2ecf20Sopenharmony_ci		if (ddr_bar_addr == U64_MAX)
41768c2ecf20Sopenharmony_ci			rc = -EIO;
41778c2ecf20Sopenharmony_ci
41788c2ecf20Sopenharmony_ci	} else if (addr >= HOST_PHYS_BASE && !iommu_present(&pci_bus_type)) {
41798c2ecf20Sopenharmony_ci		*val = *(u64 *) phys_to_virt(addr - HOST_PHYS_BASE);
41808c2ecf20Sopenharmony_ci
41818c2ecf20Sopenharmony_ci	} else {
41828c2ecf20Sopenharmony_ci		rc = -EFAULT;
41838c2ecf20Sopenharmony_ci	}
41848c2ecf20Sopenharmony_ci
41858c2ecf20Sopenharmony_ci	return rc;
41868c2ecf20Sopenharmony_ci}
41878c2ecf20Sopenharmony_ci
41888c2ecf20Sopenharmony_cistatic int goya_debugfs_write64(struct hl_device *hdev, u64 addr, u64 val)
41898c2ecf20Sopenharmony_ci{
41908c2ecf20Sopenharmony_ci	struct asic_fixed_properties *prop = &hdev->asic_prop;
41918c2ecf20Sopenharmony_ci	u64 ddr_bar_addr;
41928c2ecf20Sopenharmony_ci	int rc = 0;
41938c2ecf20Sopenharmony_ci
41948c2ecf20Sopenharmony_ci	if ((addr >= CFG_BASE) && (addr <= CFG_BASE + CFG_SIZE - sizeof(u64))) {
41958c2ecf20Sopenharmony_ci		WREG32(addr - CFG_BASE, lower_32_bits(val));
41968c2ecf20Sopenharmony_ci		WREG32(addr + sizeof(u32) - CFG_BASE, upper_32_bits(val));
41978c2ecf20Sopenharmony_ci
41988c2ecf20Sopenharmony_ci	} else if ((addr >= SRAM_BASE_ADDR) &&
41998c2ecf20Sopenharmony_ci			(addr <= SRAM_BASE_ADDR + SRAM_SIZE - sizeof(u64))) {
42008c2ecf20Sopenharmony_ci
42018c2ecf20Sopenharmony_ci		writeq(val, hdev->pcie_bar[SRAM_CFG_BAR_ID] +
42028c2ecf20Sopenharmony_ci					(addr - SRAM_BASE_ADDR));
42038c2ecf20Sopenharmony_ci
42048c2ecf20Sopenharmony_ci	} else if (addr <=
42058c2ecf20Sopenharmony_ci		   DRAM_PHYS_BASE + hdev->asic_prop.dram_size - sizeof(u64)) {
42068c2ecf20Sopenharmony_ci
42078c2ecf20Sopenharmony_ci		u64 bar_base_addr = DRAM_PHYS_BASE +
42088c2ecf20Sopenharmony_ci				(addr & ~(prop->dram_pci_bar_size - 0x1ull));
42098c2ecf20Sopenharmony_ci
42108c2ecf20Sopenharmony_ci		ddr_bar_addr = goya_set_ddr_bar_base(hdev, bar_base_addr);
42118c2ecf20Sopenharmony_ci		if (ddr_bar_addr != U64_MAX) {
42128c2ecf20Sopenharmony_ci			writeq(val, hdev->pcie_bar[DDR_BAR_ID] +
42138c2ecf20Sopenharmony_ci						(addr - bar_base_addr));
42148c2ecf20Sopenharmony_ci
42158c2ecf20Sopenharmony_ci			ddr_bar_addr = goya_set_ddr_bar_base(hdev,
42168c2ecf20Sopenharmony_ci							ddr_bar_addr);
42178c2ecf20Sopenharmony_ci		}
42188c2ecf20Sopenharmony_ci		if (ddr_bar_addr == U64_MAX)
42198c2ecf20Sopenharmony_ci			rc = -EIO;
42208c2ecf20Sopenharmony_ci
42218c2ecf20Sopenharmony_ci	} else if (addr >= HOST_PHYS_BASE && !iommu_present(&pci_bus_type)) {
42228c2ecf20Sopenharmony_ci		*(u64 *) phys_to_virt(addr - HOST_PHYS_BASE) = val;
42238c2ecf20Sopenharmony_ci
42248c2ecf20Sopenharmony_ci	} else {
42258c2ecf20Sopenharmony_ci		rc = -EFAULT;
42268c2ecf20Sopenharmony_ci	}
42278c2ecf20Sopenharmony_ci
42288c2ecf20Sopenharmony_ci	return rc;
42298c2ecf20Sopenharmony_ci}
42308c2ecf20Sopenharmony_ci
42318c2ecf20Sopenharmony_cistatic u64 goya_read_pte(struct hl_device *hdev, u64 addr)
42328c2ecf20Sopenharmony_ci{
42338c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
42348c2ecf20Sopenharmony_ci
42358c2ecf20Sopenharmony_ci	if (hdev->hard_reset_pending)
42368c2ecf20Sopenharmony_ci		return U64_MAX;
42378c2ecf20Sopenharmony_ci
42388c2ecf20Sopenharmony_ci	return readq(hdev->pcie_bar[DDR_BAR_ID] +
42398c2ecf20Sopenharmony_ci			(addr - goya->ddr_bar_cur_addr));
42408c2ecf20Sopenharmony_ci}
42418c2ecf20Sopenharmony_ci
42428c2ecf20Sopenharmony_cistatic void goya_write_pte(struct hl_device *hdev, u64 addr, u64 val)
42438c2ecf20Sopenharmony_ci{
42448c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
42458c2ecf20Sopenharmony_ci
42468c2ecf20Sopenharmony_ci	if (hdev->hard_reset_pending)
42478c2ecf20Sopenharmony_ci		return;
42488c2ecf20Sopenharmony_ci
42498c2ecf20Sopenharmony_ci	writeq(val, hdev->pcie_bar[DDR_BAR_ID] +
42508c2ecf20Sopenharmony_ci			(addr - goya->ddr_bar_cur_addr));
42518c2ecf20Sopenharmony_ci}
42528c2ecf20Sopenharmony_ci
42538c2ecf20Sopenharmony_cistatic const char *_goya_get_event_desc(u16 event_type)
42548c2ecf20Sopenharmony_ci{
42558c2ecf20Sopenharmony_ci	switch (event_type) {
42568c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PCIE_IF:
42578c2ecf20Sopenharmony_ci		return "PCIe_if";
42588c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_ECC:
42598c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC1_ECC:
42608c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC2_ECC:
42618c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC3_ECC:
42628c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC4_ECC:
42638c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC5_ECC:
42648c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC6_ECC:
42658c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC7_ECC:
42668c2ecf20Sopenharmony_ci		return "TPC%d_ecc";
42678c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_MME_ECC:
42688c2ecf20Sopenharmony_ci		return "MME_ecc";
42698c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_MME_ECC_EXT:
42708c2ecf20Sopenharmony_ci		return "MME_ecc_ext";
42718c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_MMU_ECC:
42728c2ecf20Sopenharmony_ci		return "MMU_ecc";
42738c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_DMA_MACRO:
42748c2ecf20Sopenharmony_ci		return "DMA_macro";
42758c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_DMA_ECC:
42768c2ecf20Sopenharmony_ci		return "DMA_ecc";
42778c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_CPU_IF_ECC:
42788c2ecf20Sopenharmony_ci		return "CPU_if_ecc";
42798c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PSOC_MEM:
42808c2ecf20Sopenharmony_ci		return "PSOC_mem";
42818c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PSOC_CORESIGHT:
42828c2ecf20Sopenharmony_ci		return "PSOC_coresight";
42838c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_SRAM0 ... GOYA_ASYNC_EVENT_ID_SRAM29:
42848c2ecf20Sopenharmony_ci		return "SRAM%d";
42858c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_GIC500:
42868c2ecf20Sopenharmony_ci		return "GIC500";
42878c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PLL0 ... GOYA_ASYNC_EVENT_ID_PLL6:
42888c2ecf20Sopenharmony_ci		return "PLL%d";
42898c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_AXI_ECC:
42908c2ecf20Sopenharmony_ci		return "AXI_ecc";
42918c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_L2_RAM_ECC:
42928c2ecf20Sopenharmony_ci		return "L2_ram_ecc";
42938c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PSOC_GPIO_05_SW_RESET:
42948c2ecf20Sopenharmony_ci		return "PSOC_gpio_05_sw_reset";
42958c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PSOC_GPIO_10_VRHOT_ICRIT:
42968c2ecf20Sopenharmony_ci		return "PSOC_gpio_10_vrhot_icrit";
42978c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PCIE_DEC:
42988c2ecf20Sopenharmony_ci		return "PCIe_dec";
42998c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_DEC:
43008c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC1_DEC:
43018c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC2_DEC:
43028c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC3_DEC:
43038c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC4_DEC:
43048c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC5_DEC:
43058c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC6_DEC:
43068c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC7_DEC:
43078c2ecf20Sopenharmony_ci		return "TPC%d_dec";
43088c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_MME_WACS:
43098c2ecf20Sopenharmony_ci		return "MME_wacs";
43108c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_MME_WACSD:
43118c2ecf20Sopenharmony_ci		return "MME_wacsd";
43128c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_CPU_AXI_SPLITTER:
43138c2ecf20Sopenharmony_ci		return "CPU_axi_splitter";
43148c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PSOC_AXI_DEC:
43158c2ecf20Sopenharmony_ci		return "PSOC_axi_dec";
43168c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PSOC:
43178c2ecf20Sopenharmony_ci		return "PSOC";
43188c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_KRN_ERR:
43198c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC1_KRN_ERR:
43208c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC2_KRN_ERR:
43218c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC3_KRN_ERR:
43228c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC4_KRN_ERR:
43238c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC5_KRN_ERR:
43248c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC6_KRN_ERR:
43258c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC7_KRN_ERR:
43268c2ecf20Sopenharmony_ci		return "TPC%d_krn_err";
43278c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_CMDQ ... GOYA_ASYNC_EVENT_ID_TPC7_CMDQ:
43288c2ecf20Sopenharmony_ci		return "TPC%d_cq";
43298c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_QM ... GOYA_ASYNC_EVENT_ID_TPC7_QM:
43308c2ecf20Sopenharmony_ci		return "TPC%d_qm";
43318c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_MME_QM:
43328c2ecf20Sopenharmony_ci		return "MME_qm";
43338c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_MME_CMDQ:
43348c2ecf20Sopenharmony_ci		return "MME_cq";
43358c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_DMA0_QM ... GOYA_ASYNC_EVENT_ID_DMA4_QM:
43368c2ecf20Sopenharmony_ci		return "DMA%d_qm";
43378c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_DMA0_CH ... GOYA_ASYNC_EVENT_ID_DMA4_CH:
43388c2ecf20Sopenharmony_ci		return "DMA%d_ch";
43398c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_BMON_SPMU:
43408c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC1_BMON_SPMU:
43418c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC2_BMON_SPMU:
43428c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC3_BMON_SPMU:
43438c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC4_BMON_SPMU:
43448c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC5_BMON_SPMU:
43458c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC6_BMON_SPMU:
43468c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC7_BMON_SPMU:
43478c2ecf20Sopenharmony_ci		return "TPC%d_bmon_spmu";
43488c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_DMA_BM_CH0 ... GOYA_ASYNC_EVENT_ID_DMA_BM_CH4:
43498c2ecf20Sopenharmony_ci		return "DMA_bm_ch%d";
43508c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_FIX_POWER_ENV_S:
43518c2ecf20Sopenharmony_ci		return "POWER_ENV_S";
43528c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_FIX_POWER_ENV_E:
43538c2ecf20Sopenharmony_ci		return "POWER_ENV_E";
43548c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_FIX_THERMAL_ENV_S:
43558c2ecf20Sopenharmony_ci		return "THERMAL_ENV_S";
43568c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_FIX_THERMAL_ENV_E:
43578c2ecf20Sopenharmony_ci		return "THERMAL_ENV_E";
43588c2ecf20Sopenharmony_ci	default:
43598c2ecf20Sopenharmony_ci		return "N/A";
43608c2ecf20Sopenharmony_ci	}
43618c2ecf20Sopenharmony_ci}
43628c2ecf20Sopenharmony_ci
43638c2ecf20Sopenharmony_cistatic void goya_get_event_desc(u16 event_type, char *desc, size_t size)
43648c2ecf20Sopenharmony_ci{
43658c2ecf20Sopenharmony_ci	u8 index;
43668c2ecf20Sopenharmony_ci
43678c2ecf20Sopenharmony_ci	switch (event_type) {
43688c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_ECC:
43698c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC1_ECC:
43708c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC2_ECC:
43718c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC3_ECC:
43728c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC4_ECC:
43738c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC5_ECC:
43748c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC6_ECC:
43758c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC7_ECC:
43768c2ecf20Sopenharmony_ci		index = (event_type - GOYA_ASYNC_EVENT_ID_TPC0_ECC) / 3;
43778c2ecf20Sopenharmony_ci		snprintf(desc, size, _goya_get_event_desc(event_type), index);
43788c2ecf20Sopenharmony_ci		break;
43798c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_SRAM0 ... GOYA_ASYNC_EVENT_ID_SRAM29:
43808c2ecf20Sopenharmony_ci		index = event_type - GOYA_ASYNC_EVENT_ID_SRAM0;
43818c2ecf20Sopenharmony_ci		snprintf(desc, size, _goya_get_event_desc(event_type), index);
43828c2ecf20Sopenharmony_ci		break;
43838c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PLL0 ... GOYA_ASYNC_EVENT_ID_PLL6:
43848c2ecf20Sopenharmony_ci		index = event_type - GOYA_ASYNC_EVENT_ID_PLL0;
43858c2ecf20Sopenharmony_ci		snprintf(desc, size, _goya_get_event_desc(event_type), index);
43868c2ecf20Sopenharmony_ci		break;
43878c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_DEC:
43888c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC1_DEC:
43898c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC2_DEC:
43908c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC3_DEC:
43918c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC4_DEC:
43928c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC5_DEC:
43938c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC6_DEC:
43948c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC7_DEC:
43958c2ecf20Sopenharmony_ci		index = (event_type - GOYA_ASYNC_EVENT_ID_TPC0_DEC) / 3;
43968c2ecf20Sopenharmony_ci		snprintf(desc, size, _goya_get_event_desc(event_type), index);
43978c2ecf20Sopenharmony_ci		break;
43988c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_KRN_ERR:
43998c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC1_KRN_ERR:
44008c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC2_KRN_ERR:
44018c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC3_KRN_ERR:
44028c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC4_KRN_ERR:
44038c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC5_KRN_ERR:
44048c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC6_KRN_ERR:
44058c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC7_KRN_ERR:
44068c2ecf20Sopenharmony_ci		index = (event_type - GOYA_ASYNC_EVENT_ID_TPC0_KRN_ERR) / 10;
44078c2ecf20Sopenharmony_ci		snprintf(desc, size, _goya_get_event_desc(event_type), index);
44088c2ecf20Sopenharmony_ci		break;
44098c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_CMDQ ... GOYA_ASYNC_EVENT_ID_TPC7_CMDQ:
44108c2ecf20Sopenharmony_ci		index = event_type - GOYA_ASYNC_EVENT_ID_TPC0_CMDQ;
44118c2ecf20Sopenharmony_ci		snprintf(desc, size, _goya_get_event_desc(event_type), index);
44128c2ecf20Sopenharmony_ci		break;
44138c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_QM ... GOYA_ASYNC_EVENT_ID_TPC7_QM:
44148c2ecf20Sopenharmony_ci		index = event_type - GOYA_ASYNC_EVENT_ID_TPC0_QM;
44158c2ecf20Sopenharmony_ci		snprintf(desc, size, _goya_get_event_desc(event_type), index);
44168c2ecf20Sopenharmony_ci		break;
44178c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_DMA0_QM ... GOYA_ASYNC_EVENT_ID_DMA4_QM:
44188c2ecf20Sopenharmony_ci		index = event_type - GOYA_ASYNC_EVENT_ID_DMA0_QM;
44198c2ecf20Sopenharmony_ci		snprintf(desc, size, _goya_get_event_desc(event_type), index);
44208c2ecf20Sopenharmony_ci		break;
44218c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_DMA0_CH ... GOYA_ASYNC_EVENT_ID_DMA4_CH:
44228c2ecf20Sopenharmony_ci		index = event_type - GOYA_ASYNC_EVENT_ID_DMA0_CH;
44238c2ecf20Sopenharmony_ci		snprintf(desc, size, _goya_get_event_desc(event_type), index);
44248c2ecf20Sopenharmony_ci		break;
44258c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_BMON_SPMU:
44268c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC1_BMON_SPMU:
44278c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC2_BMON_SPMU:
44288c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC3_BMON_SPMU:
44298c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC4_BMON_SPMU:
44308c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC5_BMON_SPMU:
44318c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC6_BMON_SPMU:
44328c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC7_BMON_SPMU:
44338c2ecf20Sopenharmony_ci		index = (event_type - GOYA_ASYNC_EVENT_ID_TPC0_BMON_SPMU) / 10;
44348c2ecf20Sopenharmony_ci		snprintf(desc, size, _goya_get_event_desc(event_type), index);
44358c2ecf20Sopenharmony_ci		break;
44368c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_DMA_BM_CH0 ... GOYA_ASYNC_EVENT_ID_DMA_BM_CH4:
44378c2ecf20Sopenharmony_ci		index = event_type - GOYA_ASYNC_EVENT_ID_DMA_BM_CH0;
44388c2ecf20Sopenharmony_ci		snprintf(desc, size, _goya_get_event_desc(event_type), index);
44398c2ecf20Sopenharmony_ci		break;
44408c2ecf20Sopenharmony_ci	default:
44418c2ecf20Sopenharmony_ci		snprintf(desc, size, _goya_get_event_desc(event_type));
44428c2ecf20Sopenharmony_ci		break;
44438c2ecf20Sopenharmony_ci	}
44448c2ecf20Sopenharmony_ci}
44458c2ecf20Sopenharmony_ci
44468c2ecf20Sopenharmony_cistatic void goya_print_razwi_info(struct hl_device *hdev)
44478c2ecf20Sopenharmony_ci{
44488c2ecf20Sopenharmony_ci	if (RREG32(mmDMA_MACRO_RAZWI_LBW_WT_VLD)) {
44498c2ecf20Sopenharmony_ci		dev_err_ratelimited(hdev->dev, "Illegal write to LBW\n");
44508c2ecf20Sopenharmony_ci		WREG32(mmDMA_MACRO_RAZWI_LBW_WT_VLD, 0);
44518c2ecf20Sopenharmony_ci	}
44528c2ecf20Sopenharmony_ci
44538c2ecf20Sopenharmony_ci	if (RREG32(mmDMA_MACRO_RAZWI_LBW_RD_VLD)) {
44548c2ecf20Sopenharmony_ci		dev_err_ratelimited(hdev->dev, "Illegal read from LBW\n");
44558c2ecf20Sopenharmony_ci		WREG32(mmDMA_MACRO_RAZWI_LBW_RD_VLD, 0);
44568c2ecf20Sopenharmony_ci	}
44578c2ecf20Sopenharmony_ci
44588c2ecf20Sopenharmony_ci	if (RREG32(mmDMA_MACRO_RAZWI_HBW_WT_VLD)) {
44598c2ecf20Sopenharmony_ci		dev_err_ratelimited(hdev->dev, "Illegal write to HBW\n");
44608c2ecf20Sopenharmony_ci		WREG32(mmDMA_MACRO_RAZWI_HBW_WT_VLD, 0);
44618c2ecf20Sopenharmony_ci	}
44628c2ecf20Sopenharmony_ci
44638c2ecf20Sopenharmony_ci	if (RREG32(mmDMA_MACRO_RAZWI_HBW_RD_VLD)) {
44648c2ecf20Sopenharmony_ci		dev_err_ratelimited(hdev->dev, "Illegal read from HBW\n");
44658c2ecf20Sopenharmony_ci		WREG32(mmDMA_MACRO_RAZWI_HBW_RD_VLD, 0);
44668c2ecf20Sopenharmony_ci	}
44678c2ecf20Sopenharmony_ci}
44688c2ecf20Sopenharmony_ci
44698c2ecf20Sopenharmony_cistatic void goya_print_mmu_error_info(struct hl_device *hdev)
44708c2ecf20Sopenharmony_ci{
44718c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
44728c2ecf20Sopenharmony_ci	u64 addr;
44738c2ecf20Sopenharmony_ci	u32 val;
44748c2ecf20Sopenharmony_ci
44758c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_MMU))
44768c2ecf20Sopenharmony_ci		return;
44778c2ecf20Sopenharmony_ci
44788c2ecf20Sopenharmony_ci	val = RREG32(mmMMU_PAGE_ERROR_CAPTURE);
44798c2ecf20Sopenharmony_ci	if (val & MMU_PAGE_ERROR_CAPTURE_ENTRY_VALID_MASK) {
44808c2ecf20Sopenharmony_ci		addr = val & MMU_PAGE_ERROR_CAPTURE_VA_49_32_MASK;
44818c2ecf20Sopenharmony_ci		addr <<= 32;
44828c2ecf20Sopenharmony_ci		addr |= RREG32(mmMMU_PAGE_ERROR_CAPTURE_VA);
44838c2ecf20Sopenharmony_ci
44848c2ecf20Sopenharmony_ci		dev_err_ratelimited(hdev->dev, "MMU page fault on va 0x%llx\n",
44858c2ecf20Sopenharmony_ci					addr);
44868c2ecf20Sopenharmony_ci
44878c2ecf20Sopenharmony_ci		WREG32(mmMMU_PAGE_ERROR_CAPTURE, 0);
44888c2ecf20Sopenharmony_ci	}
44898c2ecf20Sopenharmony_ci}
44908c2ecf20Sopenharmony_ci
44918c2ecf20Sopenharmony_cistatic void goya_print_irq_info(struct hl_device *hdev, u16 event_type,
44928c2ecf20Sopenharmony_ci				bool razwi)
44938c2ecf20Sopenharmony_ci{
44948c2ecf20Sopenharmony_ci	char desc[20] = "";
44958c2ecf20Sopenharmony_ci
44968c2ecf20Sopenharmony_ci	goya_get_event_desc(event_type, desc, sizeof(desc));
44978c2ecf20Sopenharmony_ci	dev_err_ratelimited(hdev->dev, "Received H/W interrupt %d [\"%s\"]\n",
44988c2ecf20Sopenharmony_ci		event_type, desc);
44998c2ecf20Sopenharmony_ci
45008c2ecf20Sopenharmony_ci	if (razwi) {
45018c2ecf20Sopenharmony_ci		goya_print_razwi_info(hdev);
45028c2ecf20Sopenharmony_ci		goya_print_mmu_error_info(hdev);
45038c2ecf20Sopenharmony_ci	}
45048c2ecf20Sopenharmony_ci}
45058c2ecf20Sopenharmony_ci
45068c2ecf20Sopenharmony_cistatic int goya_unmask_irq_arr(struct hl_device *hdev, u32 *irq_arr,
45078c2ecf20Sopenharmony_ci		size_t irq_arr_size)
45088c2ecf20Sopenharmony_ci{
45098c2ecf20Sopenharmony_ci	struct cpucp_unmask_irq_arr_packet *pkt;
45108c2ecf20Sopenharmony_ci	size_t total_pkt_size;
45118c2ecf20Sopenharmony_ci	long result;
45128c2ecf20Sopenharmony_ci	int rc;
45138c2ecf20Sopenharmony_ci	int irq_num_entries, irq_arr_index;
45148c2ecf20Sopenharmony_ci	__le32 *goya_irq_arr;
45158c2ecf20Sopenharmony_ci
45168c2ecf20Sopenharmony_ci	total_pkt_size = sizeof(struct cpucp_unmask_irq_arr_packet) +
45178c2ecf20Sopenharmony_ci			irq_arr_size;
45188c2ecf20Sopenharmony_ci
45198c2ecf20Sopenharmony_ci	/* data should be aligned to 8 bytes in order to CPU-CP to copy it */
45208c2ecf20Sopenharmony_ci	total_pkt_size = (total_pkt_size + 0x7) & ~0x7;
45218c2ecf20Sopenharmony_ci
45228c2ecf20Sopenharmony_ci	/* total_pkt_size is casted to u16 later on */
45238c2ecf20Sopenharmony_ci	if (total_pkt_size > USHRT_MAX) {
45248c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "too many elements in IRQ array\n");
45258c2ecf20Sopenharmony_ci		return -EINVAL;
45268c2ecf20Sopenharmony_ci	}
45278c2ecf20Sopenharmony_ci
45288c2ecf20Sopenharmony_ci	pkt = kzalloc(total_pkt_size, GFP_KERNEL);
45298c2ecf20Sopenharmony_ci	if (!pkt)
45308c2ecf20Sopenharmony_ci		return -ENOMEM;
45318c2ecf20Sopenharmony_ci
45328c2ecf20Sopenharmony_ci	irq_num_entries = irq_arr_size / sizeof(irq_arr[0]);
45338c2ecf20Sopenharmony_ci	pkt->length = cpu_to_le32(irq_num_entries);
45348c2ecf20Sopenharmony_ci
45358c2ecf20Sopenharmony_ci	/* We must perform any necessary endianness conversation on the irq
45368c2ecf20Sopenharmony_ci	 * array being passed to the goya hardware
45378c2ecf20Sopenharmony_ci	 */
45388c2ecf20Sopenharmony_ci	for (irq_arr_index = 0, goya_irq_arr = (__le32 *) &pkt->irqs;
45398c2ecf20Sopenharmony_ci			irq_arr_index < irq_num_entries ; irq_arr_index++)
45408c2ecf20Sopenharmony_ci		goya_irq_arr[irq_arr_index] =
45418c2ecf20Sopenharmony_ci				cpu_to_le32(irq_arr[irq_arr_index]);
45428c2ecf20Sopenharmony_ci
45438c2ecf20Sopenharmony_ci	pkt->cpucp_pkt.ctl = cpu_to_le32(CPUCP_PACKET_UNMASK_RAZWI_IRQ_ARRAY <<
45448c2ecf20Sopenharmony_ci						CPUCP_PKT_CTL_OPCODE_SHIFT);
45458c2ecf20Sopenharmony_ci
45468c2ecf20Sopenharmony_ci	rc = hdev->asic_funcs->send_cpu_message(hdev, (u32 *) pkt,
45478c2ecf20Sopenharmony_ci						total_pkt_size,	0, &result);
45488c2ecf20Sopenharmony_ci
45498c2ecf20Sopenharmony_ci	if (rc)
45508c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to unmask IRQ array\n");
45518c2ecf20Sopenharmony_ci
45528c2ecf20Sopenharmony_ci	kfree(pkt);
45538c2ecf20Sopenharmony_ci
45548c2ecf20Sopenharmony_ci	return rc;
45558c2ecf20Sopenharmony_ci}
45568c2ecf20Sopenharmony_ci
45578c2ecf20Sopenharmony_cistatic int goya_soft_reset_late_init(struct hl_device *hdev)
45588c2ecf20Sopenharmony_ci{
45598c2ecf20Sopenharmony_ci	/*
45608c2ecf20Sopenharmony_ci	 * Unmask all IRQs since some could have been received
45618c2ecf20Sopenharmony_ci	 * during the soft reset
45628c2ecf20Sopenharmony_ci	 */
45638c2ecf20Sopenharmony_ci	return goya_unmask_irq_arr(hdev, goya_all_events,
45648c2ecf20Sopenharmony_ci					sizeof(goya_all_events));
45658c2ecf20Sopenharmony_ci}
45668c2ecf20Sopenharmony_ci
45678c2ecf20Sopenharmony_cistatic int goya_unmask_irq(struct hl_device *hdev, u16 event_type)
45688c2ecf20Sopenharmony_ci{
45698c2ecf20Sopenharmony_ci	struct cpucp_packet pkt;
45708c2ecf20Sopenharmony_ci	long result;
45718c2ecf20Sopenharmony_ci	int rc;
45728c2ecf20Sopenharmony_ci
45738c2ecf20Sopenharmony_ci	memset(&pkt, 0, sizeof(pkt));
45748c2ecf20Sopenharmony_ci
45758c2ecf20Sopenharmony_ci	pkt.ctl = cpu_to_le32(CPUCP_PACKET_UNMASK_RAZWI_IRQ <<
45768c2ecf20Sopenharmony_ci				CPUCP_PKT_CTL_OPCODE_SHIFT);
45778c2ecf20Sopenharmony_ci	pkt.value = cpu_to_le64(event_type);
45788c2ecf20Sopenharmony_ci
45798c2ecf20Sopenharmony_ci	rc = hdev->asic_funcs->send_cpu_message(hdev, (u32 *) &pkt, sizeof(pkt),
45808c2ecf20Sopenharmony_ci						0, &result);
45818c2ecf20Sopenharmony_ci
45828c2ecf20Sopenharmony_ci	if (rc)
45838c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "failed to unmask RAZWI IRQ %d", event_type);
45848c2ecf20Sopenharmony_ci
45858c2ecf20Sopenharmony_ci	return rc;
45868c2ecf20Sopenharmony_ci}
45878c2ecf20Sopenharmony_ci
45888c2ecf20Sopenharmony_cistatic void goya_print_clk_change_info(struct hl_device *hdev, u16 event_type)
45898c2ecf20Sopenharmony_ci{
45908c2ecf20Sopenharmony_ci	switch (event_type) {
45918c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_FIX_POWER_ENV_S:
45928c2ecf20Sopenharmony_ci		hdev->clk_throttling_reason |= HL_CLK_THROTTLE_POWER;
45938c2ecf20Sopenharmony_ci		dev_info_ratelimited(hdev->dev,
45948c2ecf20Sopenharmony_ci			"Clock throttling due to power consumption\n");
45958c2ecf20Sopenharmony_ci		break;
45968c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_FIX_POWER_ENV_E:
45978c2ecf20Sopenharmony_ci		hdev->clk_throttling_reason &= ~HL_CLK_THROTTLE_POWER;
45988c2ecf20Sopenharmony_ci		dev_info_ratelimited(hdev->dev,
45998c2ecf20Sopenharmony_ci			"Power envelop is safe, back to optimal clock\n");
46008c2ecf20Sopenharmony_ci		break;
46018c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_FIX_THERMAL_ENV_S:
46028c2ecf20Sopenharmony_ci		hdev->clk_throttling_reason |= HL_CLK_THROTTLE_THERMAL;
46038c2ecf20Sopenharmony_ci		dev_info_ratelimited(hdev->dev,
46048c2ecf20Sopenharmony_ci			"Clock throttling due to overheating\n");
46058c2ecf20Sopenharmony_ci		break;
46068c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_FIX_THERMAL_ENV_E:
46078c2ecf20Sopenharmony_ci		hdev->clk_throttling_reason &= ~HL_CLK_THROTTLE_THERMAL;
46088c2ecf20Sopenharmony_ci		dev_info_ratelimited(hdev->dev,
46098c2ecf20Sopenharmony_ci			"Thermal envelop is safe, back to optimal clock\n");
46108c2ecf20Sopenharmony_ci		break;
46118c2ecf20Sopenharmony_ci
46128c2ecf20Sopenharmony_ci	default:
46138c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "Received invalid clock change event %d\n",
46148c2ecf20Sopenharmony_ci			event_type);
46158c2ecf20Sopenharmony_ci		break;
46168c2ecf20Sopenharmony_ci	}
46178c2ecf20Sopenharmony_ci}
46188c2ecf20Sopenharmony_ci
46198c2ecf20Sopenharmony_civoid goya_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entry)
46208c2ecf20Sopenharmony_ci{
46218c2ecf20Sopenharmony_ci	u32 ctl = le32_to_cpu(eq_entry->hdr.ctl);
46228c2ecf20Sopenharmony_ci	u16 event_type = ((ctl & EQ_CTL_EVENT_TYPE_MASK)
46238c2ecf20Sopenharmony_ci				>> EQ_CTL_EVENT_TYPE_SHIFT);
46248c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
46258c2ecf20Sopenharmony_ci
46268c2ecf20Sopenharmony_ci	if (event_type >= GOYA_ASYNC_EVENT_ID_SIZE) {
46278c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "Event type %u exceeds maximum of %u",
46288c2ecf20Sopenharmony_ci				event_type, GOYA_ASYNC_EVENT_ID_SIZE - 1);
46298c2ecf20Sopenharmony_ci		return;
46308c2ecf20Sopenharmony_ci	}
46318c2ecf20Sopenharmony_ci
46328c2ecf20Sopenharmony_ci	goya->events_stat[event_type]++;
46338c2ecf20Sopenharmony_ci	goya->events_stat_aggregate[event_type]++;
46348c2ecf20Sopenharmony_ci
46358c2ecf20Sopenharmony_ci	switch (event_type) {
46368c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PCIE_IF:
46378c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_ECC:
46388c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC1_ECC:
46398c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC2_ECC:
46408c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC3_ECC:
46418c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC4_ECC:
46428c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC5_ECC:
46438c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC6_ECC:
46448c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC7_ECC:
46458c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_MME_ECC:
46468c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_MME_ECC_EXT:
46478c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_MMU_ECC:
46488c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_DMA_MACRO:
46498c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_DMA_ECC:
46508c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_CPU_IF_ECC:
46518c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PSOC_MEM:
46528c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PSOC_CORESIGHT:
46538c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_SRAM0 ... GOYA_ASYNC_EVENT_ID_SRAM29:
46548c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_GIC500:
46558c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PLL0 ... GOYA_ASYNC_EVENT_ID_PLL6:
46568c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_AXI_ECC:
46578c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_L2_RAM_ECC:
46588c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PSOC_GPIO_05_SW_RESET:
46598c2ecf20Sopenharmony_ci		goya_print_irq_info(hdev, event_type, false);
46608c2ecf20Sopenharmony_ci		if (hdev->hard_reset_on_fw_events)
46618c2ecf20Sopenharmony_ci			hl_device_reset(hdev, true, false);
46628c2ecf20Sopenharmony_ci		break;
46638c2ecf20Sopenharmony_ci
46648c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PCIE_DEC:
46658c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_DEC:
46668c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC1_DEC:
46678c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC2_DEC:
46688c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC3_DEC:
46698c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC4_DEC:
46708c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC5_DEC:
46718c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC6_DEC:
46728c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC7_DEC:
46738c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_MME_WACS:
46748c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_MME_WACSD:
46758c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_CPU_AXI_SPLITTER:
46768c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PSOC_AXI_DEC:
46778c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PSOC:
46788c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_KRN_ERR:
46798c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC1_KRN_ERR:
46808c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC2_KRN_ERR:
46818c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC3_KRN_ERR:
46828c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC4_KRN_ERR:
46838c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC5_KRN_ERR:
46848c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC6_KRN_ERR:
46858c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC7_KRN_ERR:
46868c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_CMDQ ... GOYA_ASYNC_EVENT_ID_TPC7_QM:
46878c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_MME_QM:
46888c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_MME_CMDQ:
46898c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_DMA0_QM ... GOYA_ASYNC_EVENT_ID_DMA4_QM:
46908c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_DMA0_CH ... GOYA_ASYNC_EVENT_ID_DMA4_CH:
46918c2ecf20Sopenharmony_ci		goya_print_irq_info(hdev, event_type, true);
46928c2ecf20Sopenharmony_ci		goya_unmask_irq(hdev, event_type);
46938c2ecf20Sopenharmony_ci		break;
46948c2ecf20Sopenharmony_ci
46958c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_PSOC_GPIO_10_VRHOT_ICRIT:
46968c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC0_BMON_SPMU:
46978c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC1_BMON_SPMU:
46988c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC2_BMON_SPMU:
46998c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC3_BMON_SPMU:
47008c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC4_BMON_SPMU:
47018c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC5_BMON_SPMU:
47028c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC6_BMON_SPMU:
47038c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_TPC7_BMON_SPMU:
47048c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_DMA_BM_CH0 ... GOYA_ASYNC_EVENT_ID_DMA_BM_CH4:
47058c2ecf20Sopenharmony_ci		goya_print_irq_info(hdev, event_type, false);
47068c2ecf20Sopenharmony_ci		goya_unmask_irq(hdev, event_type);
47078c2ecf20Sopenharmony_ci		break;
47088c2ecf20Sopenharmony_ci
47098c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_FIX_POWER_ENV_S:
47108c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_FIX_POWER_ENV_E:
47118c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_FIX_THERMAL_ENV_S:
47128c2ecf20Sopenharmony_ci	case GOYA_ASYNC_EVENT_ID_FIX_THERMAL_ENV_E:
47138c2ecf20Sopenharmony_ci		goya_print_clk_change_info(hdev, event_type);
47148c2ecf20Sopenharmony_ci		goya_unmask_irq(hdev, event_type);
47158c2ecf20Sopenharmony_ci		break;
47168c2ecf20Sopenharmony_ci
47178c2ecf20Sopenharmony_ci	default:
47188c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "Received invalid H/W interrupt %d\n",
47198c2ecf20Sopenharmony_ci				event_type);
47208c2ecf20Sopenharmony_ci		break;
47218c2ecf20Sopenharmony_ci	}
47228c2ecf20Sopenharmony_ci}
47238c2ecf20Sopenharmony_ci
47248c2ecf20Sopenharmony_civoid *goya_get_events_stat(struct hl_device *hdev, bool aggregate, u32 *size)
47258c2ecf20Sopenharmony_ci{
47268c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
47278c2ecf20Sopenharmony_ci
47288c2ecf20Sopenharmony_ci	if (aggregate) {
47298c2ecf20Sopenharmony_ci		*size = (u32) sizeof(goya->events_stat_aggregate);
47308c2ecf20Sopenharmony_ci		return goya->events_stat_aggregate;
47318c2ecf20Sopenharmony_ci	}
47328c2ecf20Sopenharmony_ci
47338c2ecf20Sopenharmony_ci	*size = (u32) sizeof(goya->events_stat);
47348c2ecf20Sopenharmony_ci	return goya->events_stat;
47358c2ecf20Sopenharmony_ci}
47368c2ecf20Sopenharmony_ci
47378c2ecf20Sopenharmony_cistatic int goya_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size,
47388c2ecf20Sopenharmony_ci				u64 val, bool is_dram)
47398c2ecf20Sopenharmony_ci{
47408c2ecf20Sopenharmony_ci	struct packet_lin_dma *lin_dma_pkt;
47418c2ecf20Sopenharmony_ci	struct hl_cs_job *job;
47428c2ecf20Sopenharmony_ci	u32 cb_size, ctl;
47438c2ecf20Sopenharmony_ci	struct hl_cb *cb;
47448c2ecf20Sopenharmony_ci	int rc, lin_dma_pkts_cnt;
47458c2ecf20Sopenharmony_ci
47468c2ecf20Sopenharmony_ci	lin_dma_pkts_cnt = DIV_ROUND_UP_ULL(size, SZ_2G);
47478c2ecf20Sopenharmony_ci	cb_size = lin_dma_pkts_cnt * sizeof(struct packet_lin_dma) +
47488c2ecf20Sopenharmony_ci						sizeof(struct packet_msg_prot);
47498c2ecf20Sopenharmony_ci	cb = hl_cb_kernel_create(hdev, cb_size, false);
47508c2ecf20Sopenharmony_ci	if (!cb)
47518c2ecf20Sopenharmony_ci		return -ENOMEM;
47528c2ecf20Sopenharmony_ci
47538c2ecf20Sopenharmony_ci	lin_dma_pkt = cb->kernel_address;
47548c2ecf20Sopenharmony_ci
47558c2ecf20Sopenharmony_ci	do {
47568c2ecf20Sopenharmony_ci		memset(lin_dma_pkt, 0, sizeof(*lin_dma_pkt));
47578c2ecf20Sopenharmony_ci
47588c2ecf20Sopenharmony_ci		ctl = ((PACKET_LIN_DMA << GOYA_PKT_CTL_OPCODE_SHIFT) |
47598c2ecf20Sopenharmony_ci				(1 << GOYA_PKT_LIN_DMA_CTL_MEMSET_SHIFT) |
47608c2ecf20Sopenharmony_ci				(1 << GOYA_PKT_LIN_DMA_CTL_WO_SHIFT) |
47618c2ecf20Sopenharmony_ci				(1 << GOYA_PKT_CTL_RB_SHIFT) |
47628c2ecf20Sopenharmony_ci				(1 << GOYA_PKT_CTL_MB_SHIFT));
47638c2ecf20Sopenharmony_ci		ctl |= (is_dram ? DMA_HOST_TO_DRAM : DMA_HOST_TO_SRAM) <<
47648c2ecf20Sopenharmony_ci				GOYA_PKT_LIN_DMA_CTL_DMA_DIR_SHIFT;
47658c2ecf20Sopenharmony_ci		lin_dma_pkt->ctl = cpu_to_le32(ctl);
47668c2ecf20Sopenharmony_ci
47678c2ecf20Sopenharmony_ci		lin_dma_pkt->src_addr = cpu_to_le64(val);
47688c2ecf20Sopenharmony_ci		lin_dma_pkt->dst_addr = cpu_to_le64(addr);
47698c2ecf20Sopenharmony_ci		if (lin_dma_pkts_cnt > 1)
47708c2ecf20Sopenharmony_ci			lin_dma_pkt->tsize = cpu_to_le32(SZ_2G);
47718c2ecf20Sopenharmony_ci		else
47728c2ecf20Sopenharmony_ci			lin_dma_pkt->tsize = cpu_to_le32(size);
47738c2ecf20Sopenharmony_ci
47748c2ecf20Sopenharmony_ci		size -= SZ_2G;
47758c2ecf20Sopenharmony_ci		addr += SZ_2G;
47768c2ecf20Sopenharmony_ci		lin_dma_pkt++;
47778c2ecf20Sopenharmony_ci	} while (--lin_dma_pkts_cnt);
47788c2ecf20Sopenharmony_ci
47798c2ecf20Sopenharmony_ci	job = hl_cs_allocate_job(hdev, QUEUE_TYPE_EXT, true);
47808c2ecf20Sopenharmony_ci	if (!job) {
47818c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "Failed to allocate a new job\n");
47828c2ecf20Sopenharmony_ci		rc = -ENOMEM;
47838c2ecf20Sopenharmony_ci		goto release_cb;
47848c2ecf20Sopenharmony_ci	}
47858c2ecf20Sopenharmony_ci
47868c2ecf20Sopenharmony_ci	job->id = 0;
47878c2ecf20Sopenharmony_ci	job->user_cb = cb;
47888c2ecf20Sopenharmony_ci	job->user_cb->cs_cnt++;
47898c2ecf20Sopenharmony_ci	job->user_cb_size = cb_size;
47908c2ecf20Sopenharmony_ci	job->hw_queue_id = GOYA_QUEUE_ID_DMA_0;
47918c2ecf20Sopenharmony_ci	job->patched_cb = job->user_cb;
47928c2ecf20Sopenharmony_ci	job->job_cb_size = job->user_cb_size;
47938c2ecf20Sopenharmony_ci
47948c2ecf20Sopenharmony_ci	hl_debugfs_add_job(hdev, job);
47958c2ecf20Sopenharmony_ci
47968c2ecf20Sopenharmony_ci	rc = goya_send_job_on_qman0(hdev, job);
47978c2ecf20Sopenharmony_ci
47988c2ecf20Sopenharmony_ci	hl_debugfs_remove_job(hdev, job);
47998c2ecf20Sopenharmony_ci	kfree(job);
48008c2ecf20Sopenharmony_ci	cb->cs_cnt--;
48018c2ecf20Sopenharmony_ci
48028c2ecf20Sopenharmony_cirelease_cb:
48038c2ecf20Sopenharmony_ci	hl_cb_put(cb);
48048c2ecf20Sopenharmony_ci	hl_cb_destroy(hdev, &hdev->kernel_cb_mgr, cb->id << PAGE_SHIFT);
48058c2ecf20Sopenharmony_ci
48068c2ecf20Sopenharmony_ci	return rc;
48078c2ecf20Sopenharmony_ci}
48088c2ecf20Sopenharmony_ci
48098c2ecf20Sopenharmony_ciint goya_context_switch(struct hl_device *hdev, u32 asid)
48108c2ecf20Sopenharmony_ci{
48118c2ecf20Sopenharmony_ci	struct asic_fixed_properties *prop = &hdev->asic_prop;
48128c2ecf20Sopenharmony_ci	u64 addr = prop->sram_base_address, sob_addr;
48138c2ecf20Sopenharmony_ci	u32 size = hdev->pldm ? 0x10000 : prop->sram_size;
48148c2ecf20Sopenharmony_ci	u64 val = 0x7777777777777777ull;
48158c2ecf20Sopenharmony_ci	int rc, dma_id;
48168c2ecf20Sopenharmony_ci	u32 channel_off = mmDMA_CH_1_WR_COMP_ADDR_LO -
48178c2ecf20Sopenharmony_ci					mmDMA_CH_0_WR_COMP_ADDR_LO;
48188c2ecf20Sopenharmony_ci
48198c2ecf20Sopenharmony_ci	rc = goya_memset_device_memory(hdev, addr, size, val, false);
48208c2ecf20Sopenharmony_ci	if (rc) {
48218c2ecf20Sopenharmony_ci		dev_err(hdev->dev, "Failed to clear SRAM in context switch\n");
48228c2ecf20Sopenharmony_ci		return rc;
48238c2ecf20Sopenharmony_ci	}
48248c2ecf20Sopenharmony_ci
48258c2ecf20Sopenharmony_ci	/* we need to reset registers that the user is allowed to change */
48268c2ecf20Sopenharmony_ci	sob_addr = CFG_BASE + mmSYNC_MNGR_SOB_OBJ_1007;
48278c2ecf20Sopenharmony_ci	WREG32(mmDMA_CH_0_WR_COMP_ADDR_LO, lower_32_bits(sob_addr));
48288c2ecf20Sopenharmony_ci
48298c2ecf20Sopenharmony_ci	for (dma_id = 1 ; dma_id < NUMBER_OF_EXT_HW_QUEUES ; dma_id++) {
48308c2ecf20Sopenharmony_ci		sob_addr = CFG_BASE + mmSYNC_MNGR_SOB_OBJ_1000 +
48318c2ecf20Sopenharmony_ci							(dma_id - 1) * 4;
48328c2ecf20Sopenharmony_ci		WREG32(mmDMA_CH_0_WR_COMP_ADDR_LO + channel_off * dma_id,
48338c2ecf20Sopenharmony_ci						lower_32_bits(sob_addr));
48348c2ecf20Sopenharmony_ci	}
48358c2ecf20Sopenharmony_ci
48368c2ecf20Sopenharmony_ci	WREG32(mmTPC_PLL_CLK_RLX_0, 0x200020);
48378c2ecf20Sopenharmony_ci
48388c2ecf20Sopenharmony_ci	goya_mmu_prepare(hdev, asid);
48398c2ecf20Sopenharmony_ci
48408c2ecf20Sopenharmony_ci	goya_clear_sm_regs(hdev);
48418c2ecf20Sopenharmony_ci
48428c2ecf20Sopenharmony_ci	return 0;
48438c2ecf20Sopenharmony_ci}
48448c2ecf20Sopenharmony_ci
48458c2ecf20Sopenharmony_cistatic int goya_mmu_clear_pgt_range(struct hl_device *hdev)
48468c2ecf20Sopenharmony_ci{
48478c2ecf20Sopenharmony_ci	struct asic_fixed_properties *prop = &hdev->asic_prop;
48488c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
48498c2ecf20Sopenharmony_ci	u64 addr = prop->mmu_pgt_addr;
48508c2ecf20Sopenharmony_ci	u32 size = prop->mmu_pgt_size + MMU_DRAM_DEFAULT_PAGE_SIZE +
48518c2ecf20Sopenharmony_ci			MMU_CACHE_MNG_SIZE;
48528c2ecf20Sopenharmony_ci
48538c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_MMU))
48548c2ecf20Sopenharmony_ci		return 0;
48558c2ecf20Sopenharmony_ci
48568c2ecf20Sopenharmony_ci	return goya_memset_device_memory(hdev, addr, size, 0, true);
48578c2ecf20Sopenharmony_ci}
48588c2ecf20Sopenharmony_ci
48598c2ecf20Sopenharmony_cistatic int goya_mmu_set_dram_default_page(struct hl_device *hdev)
48608c2ecf20Sopenharmony_ci{
48618c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
48628c2ecf20Sopenharmony_ci	u64 addr = hdev->asic_prop.mmu_dram_default_page_addr;
48638c2ecf20Sopenharmony_ci	u32 size = MMU_DRAM_DEFAULT_PAGE_SIZE;
48648c2ecf20Sopenharmony_ci	u64 val = 0x9999999999999999ull;
48658c2ecf20Sopenharmony_ci
48668c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_MMU))
48678c2ecf20Sopenharmony_ci		return 0;
48688c2ecf20Sopenharmony_ci
48698c2ecf20Sopenharmony_ci	return goya_memset_device_memory(hdev, addr, size, val, true);
48708c2ecf20Sopenharmony_ci}
48718c2ecf20Sopenharmony_ci
48728c2ecf20Sopenharmony_cistatic int goya_mmu_add_mappings_for_device_cpu(struct hl_device *hdev)
48738c2ecf20Sopenharmony_ci{
48748c2ecf20Sopenharmony_ci	struct asic_fixed_properties *prop = &hdev->asic_prop;
48758c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
48768c2ecf20Sopenharmony_ci	s64 off, cpu_off;
48778c2ecf20Sopenharmony_ci	int rc;
48788c2ecf20Sopenharmony_ci
48798c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_MMU))
48808c2ecf20Sopenharmony_ci		return 0;
48818c2ecf20Sopenharmony_ci
48828c2ecf20Sopenharmony_ci	for (off = 0 ; off < CPU_FW_IMAGE_SIZE ; off += PAGE_SIZE_2MB) {
48838c2ecf20Sopenharmony_ci		rc = hl_mmu_map(hdev->kernel_ctx, prop->dram_base_address + off,
48848c2ecf20Sopenharmony_ci				prop->dram_base_address + off, PAGE_SIZE_2MB,
48858c2ecf20Sopenharmony_ci				(off + PAGE_SIZE_2MB) == CPU_FW_IMAGE_SIZE);
48868c2ecf20Sopenharmony_ci		if (rc) {
48878c2ecf20Sopenharmony_ci			dev_err(hdev->dev, "Map failed for address 0x%llx\n",
48888c2ecf20Sopenharmony_ci				prop->dram_base_address + off);
48898c2ecf20Sopenharmony_ci			goto unmap;
48908c2ecf20Sopenharmony_ci		}
48918c2ecf20Sopenharmony_ci	}
48928c2ecf20Sopenharmony_ci
48938c2ecf20Sopenharmony_ci	if (!(hdev->cpu_accessible_dma_address & (PAGE_SIZE_2MB - 1))) {
48948c2ecf20Sopenharmony_ci		rc = hl_mmu_map(hdev->kernel_ctx, VA_CPU_ACCESSIBLE_MEM_ADDR,
48958c2ecf20Sopenharmony_ci			hdev->cpu_accessible_dma_address, PAGE_SIZE_2MB, true);
48968c2ecf20Sopenharmony_ci
48978c2ecf20Sopenharmony_ci		if (rc) {
48988c2ecf20Sopenharmony_ci			dev_err(hdev->dev,
48998c2ecf20Sopenharmony_ci				"Map failed for CPU accessible memory\n");
49008c2ecf20Sopenharmony_ci			off -= PAGE_SIZE_2MB;
49018c2ecf20Sopenharmony_ci			goto unmap;
49028c2ecf20Sopenharmony_ci		}
49038c2ecf20Sopenharmony_ci	} else {
49048c2ecf20Sopenharmony_ci		for (cpu_off = 0 ; cpu_off < SZ_2M ; cpu_off += PAGE_SIZE_4KB) {
49058c2ecf20Sopenharmony_ci			rc = hl_mmu_map(hdev->kernel_ctx,
49068c2ecf20Sopenharmony_ci				VA_CPU_ACCESSIBLE_MEM_ADDR + cpu_off,
49078c2ecf20Sopenharmony_ci				hdev->cpu_accessible_dma_address + cpu_off,
49088c2ecf20Sopenharmony_ci				PAGE_SIZE_4KB, true);
49098c2ecf20Sopenharmony_ci			if (rc) {
49108c2ecf20Sopenharmony_ci				dev_err(hdev->dev,
49118c2ecf20Sopenharmony_ci					"Map failed for CPU accessible memory\n");
49128c2ecf20Sopenharmony_ci				cpu_off -= PAGE_SIZE_4KB;
49138c2ecf20Sopenharmony_ci				goto unmap_cpu;
49148c2ecf20Sopenharmony_ci			}
49158c2ecf20Sopenharmony_ci		}
49168c2ecf20Sopenharmony_ci	}
49178c2ecf20Sopenharmony_ci
49188c2ecf20Sopenharmony_ci	goya_mmu_prepare_reg(hdev, mmCPU_IF_ARUSER_OVR, HL_KERNEL_ASID_ID);
49198c2ecf20Sopenharmony_ci	goya_mmu_prepare_reg(hdev, mmCPU_IF_AWUSER_OVR, HL_KERNEL_ASID_ID);
49208c2ecf20Sopenharmony_ci	WREG32(mmCPU_IF_ARUSER_OVR_EN, 0x7FF);
49218c2ecf20Sopenharmony_ci	WREG32(mmCPU_IF_AWUSER_OVR_EN, 0x7FF);
49228c2ecf20Sopenharmony_ci
49238c2ecf20Sopenharmony_ci	/* Make sure configuration is flushed to device */
49248c2ecf20Sopenharmony_ci	RREG32(mmCPU_IF_AWUSER_OVR_EN);
49258c2ecf20Sopenharmony_ci
49268c2ecf20Sopenharmony_ci	goya->device_cpu_mmu_mappings_done = true;
49278c2ecf20Sopenharmony_ci
49288c2ecf20Sopenharmony_ci	return 0;
49298c2ecf20Sopenharmony_ci
49308c2ecf20Sopenharmony_ciunmap_cpu:
49318c2ecf20Sopenharmony_ci	for (; cpu_off >= 0 ; cpu_off -= PAGE_SIZE_4KB)
49328c2ecf20Sopenharmony_ci		if (hl_mmu_unmap(hdev->kernel_ctx,
49338c2ecf20Sopenharmony_ci				VA_CPU_ACCESSIBLE_MEM_ADDR + cpu_off,
49348c2ecf20Sopenharmony_ci				PAGE_SIZE_4KB, true))
49358c2ecf20Sopenharmony_ci			dev_warn_ratelimited(hdev->dev,
49368c2ecf20Sopenharmony_ci				"failed to unmap address 0x%llx\n",
49378c2ecf20Sopenharmony_ci				VA_CPU_ACCESSIBLE_MEM_ADDR + cpu_off);
49388c2ecf20Sopenharmony_ciunmap:
49398c2ecf20Sopenharmony_ci	for (; off >= 0 ; off -= PAGE_SIZE_2MB)
49408c2ecf20Sopenharmony_ci		if (hl_mmu_unmap(hdev->kernel_ctx,
49418c2ecf20Sopenharmony_ci				prop->dram_base_address + off, PAGE_SIZE_2MB,
49428c2ecf20Sopenharmony_ci				true))
49438c2ecf20Sopenharmony_ci			dev_warn_ratelimited(hdev->dev,
49448c2ecf20Sopenharmony_ci				"failed to unmap address 0x%llx\n",
49458c2ecf20Sopenharmony_ci				prop->dram_base_address + off);
49468c2ecf20Sopenharmony_ci
49478c2ecf20Sopenharmony_ci	return rc;
49488c2ecf20Sopenharmony_ci}
49498c2ecf20Sopenharmony_ci
49508c2ecf20Sopenharmony_civoid goya_mmu_remove_device_cpu_mappings(struct hl_device *hdev)
49518c2ecf20Sopenharmony_ci{
49528c2ecf20Sopenharmony_ci	struct asic_fixed_properties *prop = &hdev->asic_prop;
49538c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
49548c2ecf20Sopenharmony_ci	u32 off, cpu_off;
49558c2ecf20Sopenharmony_ci
49568c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_MMU))
49578c2ecf20Sopenharmony_ci		return;
49588c2ecf20Sopenharmony_ci
49598c2ecf20Sopenharmony_ci	if (!goya->device_cpu_mmu_mappings_done)
49608c2ecf20Sopenharmony_ci		return;
49618c2ecf20Sopenharmony_ci
49628c2ecf20Sopenharmony_ci	WREG32(mmCPU_IF_ARUSER_OVR_EN, 0);
49638c2ecf20Sopenharmony_ci	WREG32(mmCPU_IF_AWUSER_OVR_EN, 0);
49648c2ecf20Sopenharmony_ci
49658c2ecf20Sopenharmony_ci	if (!(hdev->cpu_accessible_dma_address & (PAGE_SIZE_2MB - 1))) {
49668c2ecf20Sopenharmony_ci		if (hl_mmu_unmap(hdev->kernel_ctx, VA_CPU_ACCESSIBLE_MEM_ADDR,
49678c2ecf20Sopenharmony_ci				PAGE_SIZE_2MB, true))
49688c2ecf20Sopenharmony_ci			dev_warn(hdev->dev,
49698c2ecf20Sopenharmony_ci				"Failed to unmap CPU accessible memory\n");
49708c2ecf20Sopenharmony_ci	} else {
49718c2ecf20Sopenharmony_ci		for (cpu_off = 0 ; cpu_off < SZ_2M ; cpu_off += PAGE_SIZE_4KB)
49728c2ecf20Sopenharmony_ci			if (hl_mmu_unmap(hdev->kernel_ctx,
49738c2ecf20Sopenharmony_ci					VA_CPU_ACCESSIBLE_MEM_ADDR + cpu_off,
49748c2ecf20Sopenharmony_ci					PAGE_SIZE_4KB,
49758c2ecf20Sopenharmony_ci					(cpu_off + PAGE_SIZE_4KB) >= SZ_2M))
49768c2ecf20Sopenharmony_ci				dev_warn_ratelimited(hdev->dev,
49778c2ecf20Sopenharmony_ci					"failed to unmap address 0x%llx\n",
49788c2ecf20Sopenharmony_ci					VA_CPU_ACCESSIBLE_MEM_ADDR + cpu_off);
49798c2ecf20Sopenharmony_ci	}
49808c2ecf20Sopenharmony_ci
49818c2ecf20Sopenharmony_ci	for (off = 0 ; off < CPU_FW_IMAGE_SIZE ; off += PAGE_SIZE_2MB)
49828c2ecf20Sopenharmony_ci		if (hl_mmu_unmap(hdev->kernel_ctx,
49838c2ecf20Sopenharmony_ci				prop->dram_base_address + off, PAGE_SIZE_2MB,
49848c2ecf20Sopenharmony_ci				(off + PAGE_SIZE_2MB) >= CPU_FW_IMAGE_SIZE))
49858c2ecf20Sopenharmony_ci			dev_warn_ratelimited(hdev->dev,
49868c2ecf20Sopenharmony_ci					"Failed to unmap address 0x%llx\n",
49878c2ecf20Sopenharmony_ci					prop->dram_base_address + off);
49888c2ecf20Sopenharmony_ci
49898c2ecf20Sopenharmony_ci	goya->device_cpu_mmu_mappings_done = false;
49908c2ecf20Sopenharmony_ci}
49918c2ecf20Sopenharmony_ci
49928c2ecf20Sopenharmony_cistatic void goya_mmu_prepare(struct hl_device *hdev, u32 asid)
49938c2ecf20Sopenharmony_ci{
49948c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
49958c2ecf20Sopenharmony_ci	int i;
49968c2ecf20Sopenharmony_ci
49978c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_MMU))
49988c2ecf20Sopenharmony_ci		return;
49998c2ecf20Sopenharmony_ci
50008c2ecf20Sopenharmony_ci	if (asid & ~MME_QM_GLBL_SECURE_PROPS_ASID_MASK) {
50018c2ecf20Sopenharmony_ci		WARN(1, "asid %u is too big\n", asid);
50028c2ecf20Sopenharmony_ci		return;
50038c2ecf20Sopenharmony_ci	}
50048c2ecf20Sopenharmony_ci
50058c2ecf20Sopenharmony_ci	/* zero the MMBP and ASID bits and then set the ASID */
50068c2ecf20Sopenharmony_ci	for (i = 0 ; i < GOYA_MMU_REGS_NUM ; i++)
50078c2ecf20Sopenharmony_ci		goya_mmu_prepare_reg(hdev, goya_mmu_regs[i], asid);
50088c2ecf20Sopenharmony_ci}
50098c2ecf20Sopenharmony_ci
50108c2ecf20Sopenharmony_cistatic int goya_mmu_invalidate_cache(struct hl_device *hdev, bool is_hard,
50118c2ecf20Sopenharmony_ci					u32 flags)
50128c2ecf20Sopenharmony_ci{
50138c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
50148c2ecf20Sopenharmony_ci	u32 status, timeout_usec;
50158c2ecf20Sopenharmony_ci	int rc;
50168c2ecf20Sopenharmony_ci
50178c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_MMU) ||
50188c2ecf20Sopenharmony_ci		hdev->hard_reset_pending)
50198c2ecf20Sopenharmony_ci		return 0;
50208c2ecf20Sopenharmony_ci
50218c2ecf20Sopenharmony_ci	/* no need in L1 only invalidation in Goya */
50228c2ecf20Sopenharmony_ci	if (!is_hard)
50238c2ecf20Sopenharmony_ci		return 0;
50248c2ecf20Sopenharmony_ci
50258c2ecf20Sopenharmony_ci	if (hdev->pldm)
50268c2ecf20Sopenharmony_ci		timeout_usec = GOYA_PLDM_MMU_TIMEOUT_USEC;
50278c2ecf20Sopenharmony_ci	else
50288c2ecf20Sopenharmony_ci		timeout_usec = MMU_CONFIG_TIMEOUT_USEC;
50298c2ecf20Sopenharmony_ci
50308c2ecf20Sopenharmony_ci	mutex_lock(&hdev->mmu_cache_lock);
50318c2ecf20Sopenharmony_ci
50328c2ecf20Sopenharmony_ci	/* L0 & L1 invalidation */
50338c2ecf20Sopenharmony_ci	WREG32(mmSTLB_INV_ALL_START, 1);
50348c2ecf20Sopenharmony_ci
50358c2ecf20Sopenharmony_ci	rc = hl_poll_timeout(
50368c2ecf20Sopenharmony_ci		hdev,
50378c2ecf20Sopenharmony_ci		mmSTLB_INV_ALL_START,
50388c2ecf20Sopenharmony_ci		status,
50398c2ecf20Sopenharmony_ci		!status,
50408c2ecf20Sopenharmony_ci		1000,
50418c2ecf20Sopenharmony_ci		timeout_usec);
50428c2ecf20Sopenharmony_ci
50438c2ecf20Sopenharmony_ci	mutex_unlock(&hdev->mmu_cache_lock);
50448c2ecf20Sopenharmony_ci
50458c2ecf20Sopenharmony_ci	if (rc) {
50468c2ecf20Sopenharmony_ci		dev_err_ratelimited(hdev->dev,
50478c2ecf20Sopenharmony_ci					"MMU cache invalidation timeout\n");
50488c2ecf20Sopenharmony_ci		hl_device_reset(hdev, true, false);
50498c2ecf20Sopenharmony_ci	}
50508c2ecf20Sopenharmony_ci
50518c2ecf20Sopenharmony_ci	return rc;
50528c2ecf20Sopenharmony_ci}
50538c2ecf20Sopenharmony_ci
50548c2ecf20Sopenharmony_cistatic int goya_mmu_invalidate_cache_range(struct hl_device *hdev,
50558c2ecf20Sopenharmony_ci				bool is_hard, u32 asid, u64 va, u64 size)
50568c2ecf20Sopenharmony_ci{
50578c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
50588c2ecf20Sopenharmony_ci	u32 status, timeout_usec, inv_data, pi;
50598c2ecf20Sopenharmony_ci	int rc;
50608c2ecf20Sopenharmony_ci
50618c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_MMU) ||
50628c2ecf20Sopenharmony_ci		hdev->hard_reset_pending)
50638c2ecf20Sopenharmony_ci		return 0;
50648c2ecf20Sopenharmony_ci
50658c2ecf20Sopenharmony_ci	/* no need in L1 only invalidation in Goya */
50668c2ecf20Sopenharmony_ci	if (!is_hard)
50678c2ecf20Sopenharmony_ci		return 0;
50688c2ecf20Sopenharmony_ci
50698c2ecf20Sopenharmony_ci	if (hdev->pldm)
50708c2ecf20Sopenharmony_ci		timeout_usec = GOYA_PLDM_MMU_TIMEOUT_USEC;
50718c2ecf20Sopenharmony_ci	else
50728c2ecf20Sopenharmony_ci		timeout_usec = MMU_CONFIG_TIMEOUT_USEC;
50738c2ecf20Sopenharmony_ci
50748c2ecf20Sopenharmony_ci	mutex_lock(&hdev->mmu_cache_lock);
50758c2ecf20Sopenharmony_ci
50768c2ecf20Sopenharmony_ci	/*
50778c2ecf20Sopenharmony_ci	 * TODO: currently invalidate entire L0 & L1 as in regular hard
50788c2ecf20Sopenharmony_ci	 * invalidation. Need to apply invalidation of specific cache lines with
50798c2ecf20Sopenharmony_ci	 * mask of ASID & VA & size.
50808c2ecf20Sopenharmony_ci	 * Note that L1 with be flushed entirely in any case.
50818c2ecf20Sopenharmony_ci	 */
50828c2ecf20Sopenharmony_ci
50838c2ecf20Sopenharmony_ci	/* L0 & L1 invalidation */
50848c2ecf20Sopenharmony_ci	inv_data = RREG32(mmSTLB_CACHE_INV);
50858c2ecf20Sopenharmony_ci	/* PI is 8 bit */
50868c2ecf20Sopenharmony_ci	pi = ((inv_data & STLB_CACHE_INV_PRODUCER_INDEX_MASK) + 1) & 0xFF;
50878c2ecf20Sopenharmony_ci	WREG32(mmSTLB_CACHE_INV,
50888c2ecf20Sopenharmony_ci			(inv_data & STLB_CACHE_INV_INDEX_MASK_MASK) | pi);
50898c2ecf20Sopenharmony_ci
50908c2ecf20Sopenharmony_ci	rc = hl_poll_timeout(
50918c2ecf20Sopenharmony_ci		hdev,
50928c2ecf20Sopenharmony_ci		mmSTLB_INV_CONSUMER_INDEX,
50938c2ecf20Sopenharmony_ci		status,
50948c2ecf20Sopenharmony_ci		status == pi,
50958c2ecf20Sopenharmony_ci		1000,
50968c2ecf20Sopenharmony_ci		timeout_usec);
50978c2ecf20Sopenharmony_ci
50988c2ecf20Sopenharmony_ci	mutex_unlock(&hdev->mmu_cache_lock);
50998c2ecf20Sopenharmony_ci
51008c2ecf20Sopenharmony_ci	if (rc) {
51018c2ecf20Sopenharmony_ci		dev_err_ratelimited(hdev->dev,
51028c2ecf20Sopenharmony_ci					"MMU cache invalidation timeout\n");
51038c2ecf20Sopenharmony_ci		hl_device_reset(hdev, true, false);
51048c2ecf20Sopenharmony_ci	}
51058c2ecf20Sopenharmony_ci
51068c2ecf20Sopenharmony_ci	return rc;
51078c2ecf20Sopenharmony_ci}
51088c2ecf20Sopenharmony_ci
51098c2ecf20Sopenharmony_ciint goya_send_heartbeat(struct hl_device *hdev)
51108c2ecf20Sopenharmony_ci{
51118c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
51128c2ecf20Sopenharmony_ci
51138c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_CPU_Q))
51148c2ecf20Sopenharmony_ci		return 0;
51158c2ecf20Sopenharmony_ci
51168c2ecf20Sopenharmony_ci	return hl_fw_send_heartbeat(hdev);
51178c2ecf20Sopenharmony_ci}
51188c2ecf20Sopenharmony_ci
51198c2ecf20Sopenharmony_ciint goya_cpucp_info_get(struct hl_device *hdev)
51208c2ecf20Sopenharmony_ci{
51218c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
51228c2ecf20Sopenharmony_ci	struct asic_fixed_properties *prop = &hdev->asic_prop;
51238c2ecf20Sopenharmony_ci	u64 dram_size;
51248c2ecf20Sopenharmony_ci	int rc;
51258c2ecf20Sopenharmony_ci
51268c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_CPU_Q))
51278c2ecf20Sopenharmony_ci		return 0;
51288c2ecf20Sopenharmony_ci
51298c2ecf20Sopenharmony_ci	rc = hl_fw_cpucp_info_get(hdev);
51308c2ecf20Sopenharmony_ci	if (rc)
51318c2ecf20Sopenharmony_ci		return rc;
51328c2ecf20Sopenharmony_ci
51338c2ecf20Sopenharmony_ci	dram_size = le64_to_cpu(prop->cpucp_info.dram_size);
51348c2ecf20Sopenharmony_ci	if (dram_size) {
51358c2ecf20Sopenharmony_ci		if ((!is_power_of_2(dram_size)) ||
51368c2ecf20Sopenharmony_ci				(dram_size < DRAM_PHYS_DEFAULT_SIZE)) {
51378c2ecf20Sopenharmony_ci			dev_err(hdev->dev,
51388c2ecf20Sopenharmony_ci				"F/W reported invalid DRAM size %llu. Trying to use default size\n",
51398c2ecf20Sopenharmony_ci				dram_size);
51408c2ecf20Sopenharmony_ci			dram_size = DRAM_PHYS_DEFAULT_SIZE;
51418c2ecf20Sopenharmony_ci		}
51428c2ecf20Sopenharmony_ci
51438c2ecf20Sopenharmony_ci		prop->dram_size = dram_size;
51448c2ecf20Sopenharmony_ci		prop->dram_end_address = prop->dram_base_address + dram_size;
51458c2ecf20Sopenharmony_ci	}
51468c2ecf20Sopenharmony_ci
51478c2ecf20Sopenharmony_ci	if (!strlen(prop->cpucp_info.card_name))
51488c2ecf20Sopenharmony_ci		strncpy(prop->cpucp_info.card_name, GOYA_DEFAULT_CARD_NAME,
51498c2ecf20Sopenharmony_ci				CARD_NAME_MAX_LEN);
51508c2ecf20Sopenharmony_ci
51518c2ecf20Sopenharmony_ci	return 0;
51528c2ecf20Sopenharmony_ci}
51538c2ecf20Sopenharmony_ci
51548c2ecf20Sopenharmony_cistatic void goya_set_clock_gating(struct hl_device *hdev)
51558c2ecf20Sopenharmony_ci{
51568c2ecf20Sopenharmony_ci	/* clock gating not supported in Goya */
51578c2ecf20Sopenharmony_ci}
51588c2ecf20Sopenharmony_ci
51598c2ecf20Sopenharmony_cistatic void goya_disable_clock_gating(struct hl_device *hdev)
51608c2ecf20Sopenharmony_ci{
51618c2ecf20Sopenharmony_ci	/* clock gating not supported in Goya */
51628c2ecf20Sopenharmony_ci}
51638c2ecf20Sopenharmony_ci
51648c2ecf20Sopenharmony_cistatic bool goya_is_device_idle(struct hl_device *hdev, u64 *mask,
51658c2ecf20Sopenharmony_ci				struct seq_file *s)
51668c2ecf20Sopenharmony_ci{
51678c2ecf20Sopenharmony_ci	const char *fmt = "%-5d%-9s%#-14x%#-16x%#x\n";
51688c2ecf20Sopenharmony_ci	const char *dma_fmt = "%-5d%-9s%#-14x%#x\n";
51698c2ecf20Sopenharmony_ci	u32 qm_glbl_sts0, cmdq_glbl_sts0, dma_core_sts0, tpc_cfg_sts,
51708c2ecf20Sopenharmony_ci		mme_arch_sts;
51718c2ecf20Sopenharmony_ci	bool is_idle = true, is_eng_idle;
51728c2ecf20Sopenharmony_ci	u64 offset;
51738c2ecf20Sopenharmony_ci	int i;
51748c2ecf20Sopenharmony_ci
51758c2ecf20Sopenharmony_ci	if (s)
51768c2ecf20Sopenharmony_ci		seq_puts(s, "\nDMA  is_idle  QM_GLBL_STS0  DMA_CORE_STS0\n"
51778c2ecf20Sopenharmony_ci				"---  -------  ------------  -------------\n");
51788c2ecf20Sopenharmony_ci
51798c2ecf20Sopenharmony_ci	offset = mmDMA_QM_1_GLBL_STS0 - mmDMA_QM_0_GLBL_STS0;
51808c2ecf20Sopenharmony_ci
51818c2ecf20Sopenharmony_ci	for (i = 0 ; i < DMA_MAX_NUM ; i++) {
51828c2ecf20Sopenharmony_ci		qm_glbl_sts0 = RREG32(mmDMA_QM_0_GLBL_STS0 + i * offset);
51838c2ecf20Sopenharmony_ci		dma_core_sts0 = RREG32(mmDMA_CH_0_STS0 + i * offset);
51848c2ecf20Sopenharmony_ci		is_eng_idle = IS_DMA_QM_IDLE(qm_glbl_sts0) &&
51858c2ecf20Sopenharmony_ci				IS_DMA_IDLE(dma_core_sts0);
51868c2ecf20Sopenharmony_ci		is_idle &= is_eng_idle;
51878c2ecf20Sopenharmony_ci
51888c2ecf20Sopenharmony_ci		if (mask)
51898c2ecf20Sopenharmony_ci			*mask |= ((u64) !is_eng_idle) <<
51908c2ecf20Sopenharmony_ci						(GOYA_ENGINE_ID_DMA_0 + i);
51918c2ecf20Sopenharmony_ci		if (s)
51928c2ecf20Sopenharmony_ci			seq_printf(s, dma_fmt, i, is_eng_idle ? "Y" : "N",
51938c2ecf20Sopenharmony_ci					qm_glbl_sts0, dma_core_sts0);
51948c2ecf20Sopenharmony_ci	}
51958c2ecf20Sopenharmony_ci
51968c2ecf20Sopenharmony_ci	if (s)
51978c2ecf20Sopenharmony_ci		seq_puts(s,
51988c2ecf20Sopenharmony_ci			"\nTPC  is_idle  QM_GLBL_STS0  CMDQ_GLBL_STS0  CFG_STATUS\n"
51998c2ecf20Sopenharmony_ci			"---  -------  ------------  --------------  ----------\n");
52008c2ecf20Sopenharmony_ci
52018c2ecf20Sopenharmony_ci	offset = mmTPC1_QM_GLBL_STS0 - mmTPC0_QM_GLBL_STS0;
52028c2ecf20Sopenharmony_ci
52038c2ecf20Sopenharmony_ci	for (i = 0 ; i < TPC_MAX_NUM ; i++) {
52048c2ecf20Sopenharmony_ci		qm_glbl_sts0 = RREG32(mmTPC0_QM_GLBL_STS0 + i * offset);
52058c2ecf20Sopenharmony_ci		cmdq_glbl_sts0 = RREG32(mmTPC0_CMDQ_GLBL_STS0 + i * offset);
52068c2ecf20Sopenharmony_ci		tpc_cfg_sts = RREG32(mmTPC0_CFG_STATUS + i * offset);
52078c2ecf20Sopenharmony_ci		is_eng_idle = IS_TPC_QM_IDLE(qm_glbl_sts0) &&
52088c2ecf20Sopenharmony_ci				IS_TPC_CMDQ_IDLE(cmdq_glbl_sts0) &&
52098c2ecf20Sopenharmony_ci				IS_TPC_IDLE(tpc_cfg_sts);
52108c2ecf20Sopenharmony_ci		is_idle &= is_eng_idle;
52118c2ecf20Sopenharmony_ci
52128c2ecf20Sopenharmony_ci		if (mask)
52138c2ecf20Sopenharmony_ci			*mask |= ((u64) !is_eng_idle) <<
52148c2ecf20Sopenharmony_ci						(GOYA_ENGINE_ID_TPC_0 + i);
52158c2ecf20Sopenharmony_ci		if (s)
52168c2ecf20Sopenharmony_ci			seq_printf(s, fmt, i, is_eng_idle ? "Y" : "N",
52178c2ecf20Sopenharmony_ci				qm_glbl_sts0, cmdq_glbl_sts0, tpc_cfg_sts);
52188c2ecf20Sopenharmony_ci	}
52198c2ecf20Sopenharmony_ci
52208c2ecf20Sopenharmony_ci	if (s)
52218c2ecf20Sopenharmony_ci		seq_puts(s,
52228c2ecf20Sopenharmony_ci			"\nMME  is_idle  QM_GLBL_STS0  CMDQ_GLBL_STS0  ARCH_STATUS\n"
52238c2ecf20Sopenharmony_ci			"---  -------  ------------  --------------  -----------\n");
52248c2ecf20Sopenharmony_ci
52258c2ecf20Sopenharmony_ci	qm_glbl_sts0 = RREG32(mmMME_QM_GLBL_STS0);
52268c2ecf20Sopenharmony_ci	cmdq_glbl_sts0 = RREG32(mmMME_CMDQ_GLBL_STS0);
52278c2ecf20Sopenharmony_ci	mme_arch_sts = RREG32(mmMME_ARCH_STATUS);
52288c2ecf20Sopenharmony_ci	is_eng_idle = IS_MME_QM_IDLE(qm_glbl_sts0) &&
52298c2ecf20Sopenharmony_ci			IS_MME_CMDQ_IDLE(cmdq_glbl_sts0) &&
52308c2ecf20Sopenharmony_ci			IS_MME_IDLE(mme_arch_sts);
52318c2ecf20Sopenharmony_ci	is_idle &= is_eng_idle;
52328c2ecf20Sopenharmony_ci
52338c2ecf20Sopenharmony_ci	if (mask)
52348c2ecf20Sopenharmony_ci		*mask |= ((u64) !is_eng_idle) << GOYA_ENGINE_ID_MME_0;
52358c2ecf20Sopenharmony_ci	if (s) {
52368c2ecf20Sopenharmony_ci		seq_printf(s, fmt, 0, is_eng_idle ? "Y" : "N", qm_glbl_sts0,
52378c2ecf20Sopenharmony_ci				cmdq_glbl_sts0, mme_arch_sts);
52388c2ecf20Sopenharmony_ci		seq_puts(s, "\n");
52398c2ecf20Sopenharmony_ci	}
52408c2ecf20Sopenharmony_ci
52418c2ecf20Sopenharmony_ci	return is_idle;
52428c2ecf20Sopenharmony_ci}
52438c2ecf20Sopenharmony_ci
52448c2ecf20Sopenharmony_cistatic void goya_hw_queues_lock(struct hl_device *hdev)
52458c2ecf20Sopenharmony_ci	__acquires(&goya->hw_queues_lock)
52468c2ecf20Sopenharmony_ci{
52478c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
52488c2ecf20Sopenharmony_ci
52498c2ecf20Sopenharmony_ci	spin_lock(&goya->hw_queues_lock);
52508c2ecf20Sopenharmony_ci}
52518c2ecf20Sopenharmony_ci
52528c2ecf20Sopenharmony_cistatic void goya_hw_queues_unlock(struct hl_device *hdev)
52538c2ecf20Sopenharmony_ci	__releases(&goya->hw_queues_lock)
52548c2ecf20Sopenharmony_ci{
52558c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
52568c2ecf20Sopenharmony_ci
52578c2ecf20Sopenharmony_ci	spin_unlock(&goya->hw_queues_lock);
52588c2ecf20Sopenharmony_ci}
52598c2ecf20Sopenharmony_ci
52608c2ecf20Sopenharmony_cistatic u32 goya_get_pci_id(struct hl_device *hdev)
52618c2ecf20Sopenharmony_ci{
52628c2ecf20Sopenharmony_ci	return hdev->pdev->device;
52638c2ecf20Sopenharmony_ci}
52648c2ecf20Sopenharmony_ci
52658c2ecf20Sopenharmony_cistatic int goya_get_eeprom_data(struct hl_device *hdev, void *data,
52668c2ecf20Sopenharmony_ci				size_t max_size)
52678c2ecf20Sopenharmony_ci{
52688c2ecf20Sopenharmony_ci	struct goya_device *goya = hdev->asic_specific;
52698c2ecf20Sopenharmony_ci
52708c2ecf20Sopenharmony_ci	if (!(goya->hw_cap_initialized & HW_CAP_CPU_Q))
52718c2ecf20Sopenharmony_ci		return 0;
52728c2ecf20Sopenharmony_ci
52738c2ecf20Sopenharmony_ci	return hl_fw_get_eeprom_data(hdev, data, max_size);
52748c2ecf20Sopenharmony_ci}
52758c2ecf20Sopenharmony_ci
52768c2ecf20Sopenharmony_cistatic enum hl_device_hw_state goya_get_hw_state(struct hl_device *hdev)
52778c2ecf20Sopenharmony_ci{
52788c2ecf20Sopenharmony_ci	return RREG32(mmHW_STATE);
52798c2ecf20Sopenharmony_ci}
52808c2ecf20Sopenharmony_ci
52818c2ecf20Sopenharmony_cistatic int goya_ctx_init(struct hl_ctx *ctx)
52828c2ecf20Sopenharmony_ci{
52838c2ecf20Sopenharmony_ci	return 0;
52848c2ecf20Sopenharmony_ci}
52858c2ecf20Sopenharmony_ci
52868c2ecf20Sopenharmony_ciu32 goya_get_queue_id_for_cq(struct hl_device *hdev, u32 cq_idx)
52878c2ecf20Sopenharmony_ci{
52888c2ecf20Sopenharmony_ci	return cq_idx;
52898c2ecf20Sopenharmony_ci}
52908c2ecf20Sopenharmony_ci
52918c2ecf20Sopenharmony_cistatic u32 goya_get_signal_cb_size(struct hl_device *hdev)
52928c2ecf20Sopenharmony_ci{
52938c2ecf20Sopenharmony_ci	return 0;
52948c2ecf20Sopenharmony_ci}
52958c2ecf20Sopenharmony_ci
52968c2ecf20Sopenharmony_cistatic u32 goya_get_wait_cb_size(struct hl_device *hdev)
52978c2ecf20Sopenharmony_ci{
52988c2ecf20Sopenharmony_ci	return 0;
52998c2ecf20Sopenharmony_ci}
53008c2ecf20Sopenharmony_ci
53018c2ecf20Sopenharmony_cistatic void goya_gen_signal_cb(struct hl_device *hdev, void *data, u16 sob_id)
53028c2ecf20Sopenharmony_ci{
53038c2ecf20Sopenharmony_ci
53048c2ecf20Sopenharmony_ci}
53058c2ecf20Sopenharmony_ci
53068c2ecf20Sopenharmony_cistatic void goya_gen_wait_cb(struct hl_device *hdev, void *data, u16 sob_id,
53078c2ecf20Sopenharmony_ci			u16 sob_val, u16 mon_id, u32 q_idx)
53088c2ecf20Sopenharmony_ci{
53098c2ecf20Sopenharmony_ci
53108c2ecf20Sopenharmony_ci}
53118c2ecf20Sopenharmony_ci
53128c2ecf20Sopenharmony_cistatic void goya_reset_sob(struct hl_device *hdev, void *data)
53138c2ecf20Sopenharmony_ci{
53148c2ecf20Sopenharmony_ci
53158c2ecf20Sopenharmony_ci}
53168c2ecf20Sopenharmony_ci
53178c2ecf20Sopenharmony_cistatic void goya_set_dma_mask_from_fw(struct hl_device *hdev)
53188c2ecf20Sopenharmony_ci{
53198c2ecf20Sopenharmony_ci	if (RREG32(mmPSOC_GLOBAL_CONF_NON_RST_FLOPS_0) ==
53208c2ecf20Sopenharmony_ci							HL_POWER9_HOST_MAGIC) {
53218c2ecf20Sopenharmony_ci		dev_dbg(hdev->dev, "Working in 64-bit DMA mode\n");
53228c2ecf20Sopenharmony_ci		hdev->power9_64bit_dma_enable = 1;
53238c2ecf20Sopenharmony_ci		hdev->dma_mask = 64;
53248c2ecf20Sopenharmony_ci	} else {
53258c2ecf20Sopenharmony_ci		dev_dbg(hdev->dev, "Working in 48-bit DMA mode\n");
53268c2ecf20Sopenharmony_ci		hdev->power9_64bit_dma_enable = 0;
53278c2ecf20Sopenharmony_ci		hdev->dma_mask = 48;
53288c2ecf20Sopenharmony_ci	}
53298c2ecf20Sopenharmony_ci}
53308c2ecf20Sopenharmony_ci
53318c2ecf20Sopenharmony_ciu64 goya_get_device_time(struct hl_device *hdev)
53328c2ecf20Sopenharmony_ci{
53338c2ecf20Sopenharmony_ci	u64 device_time = ((u64) RREG32(mmPSOC_TIMESTAMP_CNTCVU)) << 32;
53348c2ecf20Sopenharmony_ci
53358c2ecf20Sopenharmony_ci	return device_time | RREG32(mmPSOC_TIMESTAMP_CNTCVL);
53368c2ecf20Sopenharmony_ci}
53378c2ecf20Sopenharmony_ci
53388c2ecf20Sopenharmony_cistatic const struct hl_asic_funcs goya_funcs = {
53398c2ecf20Sopenharmony_ci	.early_init = goya_early_init,
53408c2ecf20Sopenharmony_ci	.early_fini = goya_early_fini,
53418c2ecf20Sopenharmony_ci	.late_init = goya_late_init,
53428c2ecf20Sopenharmony_ci	.late_fini = goya_late_fini,
53438c2ecf20Sopenharmony_ci	.sw_init = goya_sw_init,
53448c2ecf20Sopenharmony_ci	.sw_fini = goya_sw_fini,
53458c2ecf20Sopenharmony_ci	.hw_init = goya_hw_init,
53468c2ecf20Sopenharmony_ci	.hw_fini = goya_hw_fini,
53478c2ecf20Sopenharmony_ci	.halt_engines = goya_halt_engines,
53488c2ecf20Sopenharmony_ci	.suspend = goya_suspend,
53498c2ecf20Sopenharmony_ci	.resume = goya_resume,
53508c2ecf20Sopenharmony_ci	.cb_mmap = goya_cb_mmap,
53518c2ecf20Sopenharmony_ci	.ring_doorbell = goya_ring_doorbell,
53528c2ecf20Sopenharmony_ci	.pqe_write = goya_pqe_write,
53538c2ecf20Sopenharmony_ci	.asic_dma_alloc_coherent = goya_dma_alloc_coherent,
53548c2ecf20Sopenharmony_ci	.asic_dma_free_coherent = goya_dma_free_coherent,
53558c2ecf20Sopenharmony_ci	.get_int_queue_base = goya_get_int_queue_base,
53568c2ecf20Sopenharmony_ci	.test_queues = goya_test_queues,
53578c2ecf20Sopenharmony_ci	.asic_dma_pool_zalloc = goya_dma_pool_zalloc,
53588c2ecf20Sopenharmony_ci	.asic_dma_pool_free = goya_dma_pool_free,
53598c2ecf20Sopenharmony_ci	.cpu_accessible_dma_pool_alloc = goya_cpu_accessible_dma_pool_alloc,
53608c2ecf20Sopenharmony_ci	.cpu_accessible_dma_pool_free = goya_cpu_accessible_dma_pool_free,
53618c2ecf20Sopenharmony_ci	.hl_dma_unmap_sg = goya_dma_unmap_sg,
53628c2ecf20Sopenharmony_ci	.cs_parser = goya_cs_parser,
53638c2ecf20Sopenharmony_ci	.asic_dma_map_sg = goya_dma_map_sg,
53648c2ecf20Sopenharmony_ci	.get_dma_desc_list_size = goya_get_dma_desc_list_size,
53658c2ecf20Sopenharmony_ci	.add_end_of_cb_packets = goya_add_end_of_cb_packets,
53668c2ecf20Sopenharmony_ci	.update_eq_ci = goya_update_eq_ci,
53678c2ecf20Sopenharmony_ci	.context_switch = goya_context_switch,
53688c2ecf20Sopenharmony_ci	.restore_phase_topology = goya_restore_phase_topology,
53698c2ecf20Sopenharmony_ci	.debugfs_read32 = goya_debugfs_read32,
53708c2ecf20Sopenharmony_ci	.debugfs_write32 = goya_debugfs_write32,
53718c2ecf20Sopenharmony_ci	.debugfs_read64 = goya_debugfs_read64,
53728c2ecf20Sopenharmony_ci	.debugfs_write64 = goya_debugfs_write64,
53738c2ecf20Sopenharmony_ci	.add_device_attr = goya_add_device_attr,
53748c2ecf20Sopenharmony_ci	.handle_eqe = goya_handle_eqe,
53758c2ecf20Sopenharmony_ci	.set_pll_profile = goya_set_pll_profile,
53768c2ecf20Sopenharmony_ci	.get_events_stat = goya_get_events_stat,
53778c2ecf20Sopenharmony_ci	.read_pte = goya_read_pte,
53788c2ecf20Sopenharmony_ci	.write_pte = goya_write_pte,
53798c2ecf20Sopenharmony_ci	.mmu_invalidate_cache = goya_mmu_invalidate_cache,
53808c2ecf20Sopenharmony_ci	.mmu_invalidate_cache_range = goya_mmu_invalidate_cache_range,
53818c2ecf20Sopenharmony_ci	.send_heartbeat = goya_send_heartbeat,
53828c2ecf20Sopenharmony_ci	.set_clock_gating = goya_set_clock_gating,
53838c2ecf20Sopenharmony_ci	.disable_clock_gating = goya_disable_clock_gating,
53848c2ecf20Sopenharmony_ci	.debug_coresight = goya_debug_coresight,
53858c2ecf20Sopenharmony_ci	.is_device_idle = goya_is_device_idle,
53868c2ecf20Sopenharmony_ci	.soft_reset_late_init = goya_soft_reset_late_init,
53878c2ecf20Sopenharmony_ci	.hw_queues_lock = goya_hw_queues_lock,
53888c2ecf20Sopenharmony_ci	.hw_queues_unlock = goya_hw_queues_unlock,
53898c2ecf20Sopenharmony_ci	.get_pci_id = goya_get_pci_id,
53908c2ecf20Sopenharmony_ci	.get_eeprom_data = goya_get_eeprom_data,
53918c2ecf20Sopenharmony_ci	.send_cpu_message = goya_send_cpu_message,
53928c2ecf20Sopenharmony_ci	.get_hw_state = goya_get_hw_state,
53938c2ecf20Sopenharmony_ci	.pci_bars_map = goya_pci_bars_map,
53948c2ecf20Sopenharmony_ci	.init_iatu = goya_init_iatu,
53958c2ecf20Sopenharmony_ci	.rreg = hl_rreg,
53968c2ecf20Sopenharmony_ci	.wreg = hl_wreg,
53978c2ecf20Sopenharmony_ci	.halt_coresight = goya_halt_coresight,
53988c2ecf20Sopenharmony_ci	.ctx_init = goya_ctx_init,
53998c2ecf20Sopenharmony_ci	.get_clk_rate = goya_get_clk_rate,
54008c2ecf20Sopenharmony_ci	.get_queue_id_for_cq = goya_get_queue_id_for_cq,
54018c2ecf20Sopenharmony_ci	.read_device_fw_version = goya_read_device_fw_version,
54028c2ecf20Sopenharmony_ci	.load_firmware_to_device = goya_load_firmware_to_device,
54038c2ecf20Sopenharmony_ci	.load_boot_fit_to_device = goya_load_boot_fit_to_device,
54048c2ecf20Sopenharmony_ci	.get_signal_cb_size = goya_get_signal_cb_size,
54058c2ecf20Sopenharmony_ci	.get_wait_cb_size = goya_get_wait_cb_size,
54068c2ecf20Sopenharmony_ci	.gen_signal_cb = goya_gen_signal_cb,
54078c2ecf20Sopenharmony_ci	.gen_wait_cb = goya_gen_wait_cb,
54088c2ecf20Sopenharmony_ci	.reset_sob = goya_reset_sob,
54098c2ecf20Sopenharmony_ci	.set_dma_mask_from_fw = goya_set_dma_mask_from_fw,
54108c2ecf20Sopenharmony_ci	.get_device_time = goya_get_device_time
54118c2ecf20Sopenharmony_ci};
54128c2ecf20Sopenharmony_ci
54138c2ecf20Sopenharmony_ci/*
54148c2ecf20Sopenharmony_ci * goya_set_asic_funcs - set Goya function pointers
54158c2ecf20Sopenharmony_ci *
54168c2ecf20Sopenharmony_ci * @*hdev: pointer to hl_device structure
54178c2ecf20Sopenharmony_ci *
54188c2ecf20Sopenharmony_ci */
54198c2ecf20Sopenharmony_civoid goya_set_asic_funcs(struct hl_device *hdev)
54208c2ecf20Sopenharmony_ci{
54218c2ecf20Sopenharmony_ci	hdev->asic_funcs = &goya_funcs;
54228c2ecf20Sopenharmony_ci}
5423