xref: /linux/drivers/accel/habanalabs/goya/goya_coresight.c (revision a23e1966932464e1c5226cb9ac4ce1d5fc10ba22)
1315bc055SOmer Shpigelman // SPDX-License-Identifier: GPL-2.0
2315bc055SOmer Shpigelman 
3315bc055SOmer Shpigelman /*
4315bc055SOmer Shpigelman  * Copyright 2016-2019 HabanaLabs, Ltd.
5315bc055SOmer Shpigelman  * All Rights Reserved.
6315bc055SOmer Shpigelman  */
7315bc055SOmer Shpigelman 
8315bc055SOmer Shpigelman #include "goyaP.h"
97b16a155SGreg Kroah-Hartman #include "../include/goya/goya_coresight.h"
107b16a155SGreg Kroah-Hartman #include "../include/goya/asic_reg/goya_regs.h"
117b16a155SGreg Kroah-Hartman #include "../include/goya/asic_reg/goya_masks.h"
128ba2876dSOmer Shpigelman 
137d25cae7SOded Gabbay #include <uapi/drm/habanalabs_accel.h>
148ba2876dSOmer Shpigelman 
158ba2876dSOmer Shpigelman #define GOYA_PLDM_CORESIGHT_TIMEOUT_USEC	(CORESIGHT_TIMEOUT_USEC * 100)
168ba2876dSOmer Shpigelman 
179b50f539SOmer Shpigelman #define SPMU_SECTION_SIZE		DMA_CH_0_CS_SPMU_MAX_OFFSET
189b50f539SOmer Shpigelman #define SPMU_EVENT_TYPES_OFFSET		0x400
199b50f539SOmer Shpigelman #define SPMU_MAX_COUNTERS		6
209b50f539SOmer Shpigelman 
218ba2876dSOmer Shpigelman static u64 debug_stm_regs[GOYA_STM_LAST + 1] = {
228ba2876dSOmer Shpigelman 	[GOYA_STM_CPU]		= mmCPU_STM_BASE,
238ba2876dSOmer Shpigelman 	[GOYA_STM_DMA_CH_0_CS]	= mmDMA_CH_0_CS_STM_BASE,
248ba2876dSOmer Shpigelman 	[GOYA_STM_DMA_CH_1_CS]	= mmDMA_CH_1_CS_STM_BASE,
258ba2876dSOmer Shpigelman 	[GOYA_STM_DMA_CH_2_CS]	= mmDMA_CH_2_CS_STM_BASE,
268ba2876dSOmer Shpigelman 	[GOYA_STM_DMA_CH_3_CS]	= mmDMA_CH_3_CS_STM_BASE,
278ba2876dSOmer Shpigelman 	[GOYA_STM_DMA_CH_4_CS]	= mmDMA_CH_4_CS_STM_BASE,
288ba2876dSOmer Shpigelman 	[GOYA_STM_DMA_MACRO_CS]	= mmDMA_MACRO_CS_STM_BASE,
298ba2876dSOmer Shpigelman 	[GOYA_STM_MME1_SBA]	= mmMME1_SBA_STM_BASE,
308ba2876dSOmer Shpigelman 	[GOYA_STM_MME3_SBB]	= mmMME3_SBB_STM_BASE,
318ba2876dSOmer Shpigelman 	[GOYA_STM_MME4_WACS2]	= mmMME4_WACS2_STM_BASE,
328ba2876dSOmer Shpigelman 	[GOYA_STM_MME4_WACS]	= mmMME4_WACS_STM_BASE,
338ba2876dSOmer Shpigelman 	[GOYA_STM_MMU_CS]	= mmMMU_CS_STM_BASE,
348ba2876dSOmer Shpigelman 	[GOYA_STM_PCIE]		= mmPCIE_STM_BASE,
358ba2876dSOmer Shpigelman 	[GOYA_STM_PSOC]		= mmPSOC_STM_BASE,
368ba2876dSOmer Shpigelman 	[GOYA_STM_TPC0_EML]	= mmTPC0_EML_STM_BASE,
378ba2876dSOmer Shpigelman 	[GOYA_STM_TPC1_EML]	= mmTPC1_EML_STM_BASE,
388ba2876dSOmer Shpigelman 	[GOYA_STM_TPC2_EML]	= mmTPC2_EML_STM_BASE,
398ba2876dSOmer Shpigelman 	[GOYA_STM_TPC3_EML]	= mmTPC3_EML_STM_BASE,
408ba2876dSOmer Shpigelman 	[GOYA_STM_TPC4_EML]	= mmTPC4_EML_STM_BASE,
418ba2876dSOmer Shpigelman 	[GOYA_STM_TPC5_EML]	= mmTPC5_EML_STM_BASE,
428ba2876dSOmer Shpigelman 	[GOYA_STM_TPC6_EML]	= mmTPC6_EML_STM_BASE,
438ba2876dSOmer Shpigelman 	[GOYA_STM_TPC7_EML]	= mmTPC7_EML_STM_BASE
448ba2876dSOmer Shpigelman };
458ba2876dSOmer Shpigelman 
468ba2876dSOmer Shpigelman static u64 debug_etf_regs[GOYA_ETF_LAST + 1] = {
478ba2876dSOmer Shpigelman 	[GOYA_ETF_CPU_0]	= mmCPU_ETF_0_BASE,
488ba2876dSOmer Shpigelman 	[GOYA_ETF_CPU_1]	= mmCPU_ETF_1_BASE,
498ba2876dSOmer Shpigelman 	[GOYA_ETF_CPU_TRACE]	= mmCPU_ETF_TRACE_BASE,
508ba2876dSOmer Shpigelman 	[GOYA_ETF_DMA_CH_0_CS]	= mmDMA_CH_0_CS_ETF_BASE,
518ba2876dSOmer Shpigelman 	[GOYA_ETF_DMA_CH_1_CS]	= mmDMA_CH_1_CS_ETF_BASE,
528ba2876dSOmer Shpigelman 	[GOYA_ETF_DMA_CH_2_CS]	= mmDMA_CH_2_CS_ETF_BASE,
538ba2876dSOmer Shpigelman 	[GOYA_ETF_DMA_CH_3_CS]	= mmDMA_CH_3_CS_ETF_BASE,
548ba2876dSOmer Shpigelman 	[GOYA_ETF_DMA_CH_4_CS]	= mmDMA_CH_4_CS_ETF_BASE,
558ba2876dSOmer Shpigelman 	[GOYA_ETF_DMA_MACRO_CS]	= mmDMA_MACRO_CS_ETF_BASE,
568ba2876dSOmer Shpigelman 	[GOYA_ETF_MME1_SBA]	= mmMME1_SBA_ETF_BASE,
578ba2876dSOmer Shpigelman 	[GOYA_ETF_MME3_SBB]	= mmMME3_SBB_ETF_BASE,
588ba2876dSOmer Shpigelman 	[GOYA_ETF_MME4_WACS2]	= mmMME4_WACS2_ETF_BASE,
598ba2876dSOmer Shpigelman 	[GOYA_ETF_MME4_WACS]	= mmMME4_WACS_ETF_BASE,
608ba2876dSOmer Shpigelman 	[GOYA_ETF_MMU_CS]	= mmMMU_CS_ETF_BASE,
618ba2876dSOmer Shpigelman 	[GOYA_ETF_PCIE]		= mmPCIE_ETF_BASE,
628ba2876dSOmer Shpigelman 	[GOYA_ETF_PSOC]		= mmPSOC_ETF_BASE,
638ba2876dSOmer Shpigelman 	[GOYA_ETF_TPC0_EML]	= mmTPC0_EML_ETF_BASE,
648ba2876dSOmer Shpigelman 	[GOYA_ETF_TPC1_EML]	= mmTPC1_EML_ETF_BASE,
658ba2876dSOmer Shpigelman 	[GOYA_ETF_TPC2_EML]	= mmTPC2_EML_ETF_BASE,
668ba2876dSOmer Shpigelman 	[GOYA_ETF_TPC3_EML]	= mmTPC3_EML_ETF_BASE,
678ba2876dSOmer Shpigelman 	[GOYA_ETF_TPC4_EML]	= mmTPC4_EML_ETF_BASE,
688ba2876dSOmer Shpigelman 	[GOYA_ETF_TPC5_EML]	= mmTPC5_EML_ETF_BASE,
698ba2876dSOmer Shpigelman 	[GOYA_ETF_TPC6_EML]	= mmTPC6_EML_ETF_BASE,
708ba2876dSOmer Shpigelman 	[GOYA_ETF_TPC7_EML]	= mmTPC7_EML_ETF_BASE
718ba2876dSOmer Shpigelman };
728ba2876dSOmer Shpigelman 
738ba2876dSOmer Shpigelman static u64 debug_funnel_regs[GOYA_FUNNEL_LAST + 1] = {
748ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_CPU]		= mmCPU_FUNNEL_BASE,
758ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_DMA_CH_6_1]	= mmDMA_CH_FUNNEL_6_1_BASE,
768ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_DMA_MACRO_3_1]	= mmDMA_MACRO_FUNNEL_3_1_BASE,
778ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_MME0_RTR]		= mmMME0_RTR_FUNNEL_BASE,
788ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_MME1_RTR]		= mmMME1_RTR_FUNNEL_BASE,
798ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_MME2_RTR]		= mmMME2_RTR_FUNNEL_BASE,
808ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_MME3_RTR]		= mmMME3_RTR_FUNNEL_BASE,
818ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_MME4_RTR]		= mmMME4_RTR_FUNNEL_BASE,
828ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_MME5_RTR]		= mmMME5_RTR_FUNNEL_BASE,
838ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_PCIE]		= mmPCIE_FUNNEL_BASE,
848ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_PSOC]		= mmPSOC_FUNNEL_BASE,
858ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_TPC0_EML]		= mmTPC0_EML_FUNNEL_BASE,
868ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_TPC1_EML]		= mmTPC1_EML_FUNNEL_BASE,
878ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_TPC1_RTR]		= mmTPC1_RTR_FUNNEL_BASE,
888ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_TPC2_EML]		= mmTPC2_EML_FUNNEL_BASE,
898ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_TPC2_RTR]		= mmTPC2_RTR_FUNNEL_BASE,
908ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_TPC3_EML]		= mmTPC3_EML_FUNNEL_BASE,
918ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_TPC3_RTR]		= mmTPC3_RTR_FUNNEL_BASE,
928ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_TPC4_EML]		= mmTPC4_EML_FUNNEL_BASE,
938ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_TPC4_RTR]		= mmTPC4_RTR_FUNNEL_BASE,
948ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_TPC5_EML]		= mmTPC5_EML_FUNNEL_BASE,
958ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_TPC5_RTR]		= mmTPC5_RTR_FUNNEL_BASE,
968ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_TPC6_EML]		= mmTPC6_EML_FUNNEL_BASE,
978ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_TPC6_RTR]		= mmTPC6_RTR_FUNNEL_BASE,
988ba2876dSOmer Shpigelman 	[GOYA_FUNNEL_TPC7_EML]		= mmTPC7_EML_FUNNEL_BASE
998ba2876dSOmer Shpigelman };
1008ba2876dSOmer Shpigelman 
1018ba2876dSOmer Shpigelman static u64 debug_bmon_regs[GOYA_BMON_LAST + 1] = {
1028ba2876dSOmer Shpigelman 	[GOYA_BMON_CPU_RD]		= mmCPU_RD_BMON_BASE,
1038ba2876dSOmer Shpigelman 	[GOYA_BMON_CPU_WR]		= mmCPU_WR_BMON_BASE,
1048ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_CH_0_0]		= mmDMA_CH_0_BMON_0_BASE,
1058ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_CH_0_1]		= mmDMA_CH_0_BMON_1_BASE,
1068ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_CH_1_0]		= mmDMA_CH_1_BMON_0_BASE,
1078ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_CH_1_1]		= mmDMA_CH_1_BMON_1_BASE,
1088ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_CH_2_0]		= mmDMA_CH_2_BMON_0_BASE,
1098ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_CH_2_1]		= mmDMA_CH_2_BMON_1_BASE,
1108ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_CH_3_0]		= mmDMA_CH_3_BMON_0_BASE,
1118ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_CH_3_1]		= mmDMA_CH_3_BMON_1_BASE,
1128ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_CH_4_0]		= mmDMA_CH_4_BMON_0_BASE,
1138ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_CH_4_1]		= mmDMA_CH_4_BMON_1_BASE,
1148ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_MACRO_0]		= mmDMA_MACRO_BMON_0_BASE,
1158ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_MACRO_1]		= mmDMA_MACRO_BMON_1_BASE,
1168ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_MACRO_2]		= mmDMA_MACRO_BMON_2_BASE,
1178ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_MACRO_3]		= mmDMA_MACRO_BMON_3_BASE,
1188ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_MACRO_4]		= mmDMA_MACRO_BMON_4_BASE,
1198ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_MACRO_5]		= mmDMA_MACRO_BMON_5_BASE,
1208ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_MACRO_6]		= mmDMA_MACRO_BMON_6_BASE,
1218ba2876dSOmer Shpigelman 	[GOYA_BMON_DMA_MACRO_7]		= mmDMA_MACRO_BMON_7_BASE,
1228ba2876dSOmer Shpigelman 	[GOYA_BMON_MME1_SBA_0]		= mmMME1_SBA_BMON0_BASE,
1238ba2876dSOmer Shpigelman 	[GOYA_BMON_MME1_SBA_1]		= mmMME1_SBA_BMON1_BASE,
1248ba2876dSOmer Shpigelman 	[GOYA_BMON_MME3_SBB_0]		= mmMME3_SBB_BMON0_BASE,
1258ba2876dSOmer Shpigelman 	[GOYA_BMON_MME3_SBB_1]		= mmMME3_SBB_BMON1_BASE,
1268ba2876dSOmer Shpigelman 	[GOYA_BMON_MME4_WACS2_0]	= mmMME4_WACS2_BMON0_BASE,
1278ba2876dSOmer Shpigelman 	[GOYA_BMON_MME4_WACS2_1]	= mmMME4_WACS2_BMON1_BASE,
1288ba2876dSOmer Shpigelman 	[GOYA_BMON_MME4_WACS2_2]	= mmMME4_WACS2_BMON2_BASE,
1298ba2876dSOmer Shpigelman 	[GOYA_BMON_MME4_WACS_0]		= mmMME4_WACS_BMON0_BASE,
1308ba2876dSOmer Shpigelman 	[GOYA_BMON_MME4_WACS_1]		= mmMME4_WACS_BMON1_BASE,
1318ba2876dSOmer Shpigelman 	[GOYA_BMON_MME4_WACS_2]		= mmMME4_WACS_BMON2_BASE,
1328ba2876dSOmer Shpigelman 	[GOYA_BMON_MME4_WACS_3]		= mmMME4_WACS_BMON3_BASE,
1338ba2876dSOmer Shpigelman 	[GOYA_BMON_MME4_WACS_4]		= mmMME4_WACS_BMON4_BASE,
1348ba2876dSOmer Shpigelman 	[GOYA_BMON_MME4_WACS_5]		= mmMME4_WACS_BMON5_BASE,
1358ba2876dSOmer Shpigelman 	[GOYA_BMON_MME4_WACS_6]		= mmMME4_WACS_BMON6_BASE,
1368ba2876dSOmer Shpigelman 	[GOYA_BMON_MMU_0]		= mmMMU_BMON_0_BASE,
1378ba2876dSOmer Shpigelman 	[GOYA_BMON_MMU_1]		= mmMMU_BMON_1_BASE,
1388ba2876dSOmer Shpigelman 	[GOYA_BMON_PCIE_MSTR_RD]	= mmPCIE_BMON_MSTR_RD_BASE,
1398ba2876dSOmer Shpigelman 	[GOYA_BMON_PCIE_MSTR_WR]	= mmPCIE_BMON_MSTR_WR_BASE,
1408ba2876dSOmer Shpigelman 	[GOYA_BMON_PCIE_SLV_RD]		= mmPCIE_BMON_SLV_RD_BASE,
1418ba2876dSOmer Shpigelman 	[GOYA_BMON_PCIE_SLV_WR]		= mmPCIE_BMON_SLV_WR_BASE,
1428ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC0_EML_0]		= mmTPC0_EML_BUSMON_0_BASE,
1438ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC0_EML_1]		= mmTPC0_EML_BUSMON_1_BASE,
1448ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC0_EML_2]		= mmTPC0_EML_BUSMON_2_BASE,
1458ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC0_EML_3]		= mmTPC0_EML_BUSMON_3_BASE,
1468ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC1_EML_0]		= mmTPC1_EML_BUSMON_0_BASE,
1478ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC1_EML_1]		= mmTPC1_EML_BUSMON_1_BASE,
1488ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC1_EML_2]		= mmTPC1_EML_BUSMON_2_BASE,
1498ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC1_EML_3]		= mmTPC1_EML_BUSMON_3_BASE,
1508ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC2_EML_0]		= mmTPC2_EML_BUSMON_0_BASE,
1518ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC2_EML_1]		= mmTPC2_EML_BUSMON_1_BASE,
1528ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC2_EML_2]		= mmTPC2_EML_BUSMON_2_BASE,
1538ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC2_EML_3]		= mmTPC2_EML_BUSMON_3_BASE,
1548ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC3_EML_0]		= mmTPC3_EML_BUSMON_0_BASE,
1558ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC3_EML_1]		= mmTPC3_EML_BUSMON_1_BASE,
1568ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC3_EML_2]		= mmTPC3_EML_BUSMON_2_BASE,
1578ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC3_EML_3]		= mmTPC3_EML_BUSMON_3_BASE,
1588ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC4_EML_0]		= mmTPC4_EML_BUSMON_0_BASE,
1598ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC4_EML_1]		= mmTPC4_EML_BUSMON_1_BASE,
1608ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC4_EML_2]		= mmTPC4_EML_BUSMON_2_BASE,
1618ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC4_EML_3]		= mmTPC4_EML_BUSMON_3_BASE,
1628ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC5_EML_0]		= mmTPC5_EML_BUSMON_0_BASE,
1638ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC5_EML_1]		= mmTPC5_EML_BUSMON_1_BASE,
1648ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC5_EML_2]		= mmTPC5_EML_BUSMON_2_BASE,
1658ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC5_EML_3]		= mmTPC5_EML_BUSMON_3_BASE,
1668ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC6_EML_0]		= mmTPC6_EML_BUSMON_0_BASE,
1678ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC6_EML_1]		= mmTPC6_EML_BUSMON_1_BASE,
1688ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC6_EML_2]		= mmTPC6_EML_BUSMON_2_BASE,
1698ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC6_EML_3]		= mmTPC6_EML_BUSMON_3_BASE,
1708ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC7_EML_0]		= mmTPC7_EML_BUSMON_0_BASE,
1718ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC7_EML_1]		= mmTPC7_EML_BUSMON_1_BASE,
1728ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC7_EML_2]		= mmTPC7_EML_BUSMON_2_BASE,
1738ba2876dSOmer Shpigelman 	[GOYA_BMON_TPC7_EML_3]		= mmTPC7_EML_BUSMON_3_BASE
1748ba2876dSOmer Shpigelman };
1758ba2876dSOmer Shpigelman 
1768ba2876dSOmer Shpigelman static u64 debug_spmu_regs[GOYA_SPMU_LAST + 1] = {
1778ba2876dSOmer Shpigelman 	[GOYA_SPMU_DMA_CH_0_CS]		= mmDMA_CH_0_CS_SPMU_BASE,
1788ba2876dSOmer Shpigelman 	[GOYA_SPMU_DMA_CH_1_CS]		= mmDMA_CH_1_CS_SPMU_BASE,
1798ba2876dSOmer Shpigelman 	[GOYA_SPMU_DMA_CH_2_CS]		= mmDMA_CH_2_CS_SPMU_BASE,
1808ba2876dSOmer Shpigelman 	[GOYA_SPMU_DMA_CH_3_CS]		= mmDMA_CH_3_CS_SPMU_BASE,
1818ba2876dSOmer Shpigelman 	[GOYA_SPMU_DMA_CH_4_CS]		= mmDMA_CH_4_CS_SPMU_BASE,
1828ba2876dSOmer Shpigelman 	[GOYA_SPMU_DMA_MACRO_CS]	= mmDMA_MACRO_CS_SPMU_BASE,
1838ba2876dSOmer Shpigelman 	[GOYA_SPMU_MME1_SBA]		= mmMME1_SBA_SPMU_BASE,
1848ba2876dSOmer Shpigelman 	[GOYA_SPMU_MME3_SBB]		= mmMME3_SBB_SPMU_BASE,
1858ba2876dSOmer Shpigelman 	[GOYA_SPMU_MME4_WACS2]		= mmMME4_WACS2_SPMU_BASE,
1868ba2876dSOmer Shpigelman 	[GOYA_SPMU_MME4_WACS]		= mmMME4_WACS_SPMU_BASE,
1878ba2876dSOmer Shpigelman 	[GOYA_SPMU_MMU_CS]		= mmMMU_CS_SPMU_BASE,
1888ba2876dSOmer Shpigelman 	[GOYA_SPMU_PCIE]		= mmPCIE_SPMU_BASE,
1898ba2876dSOmer Shpigelman 	[GOYA_SPMU_TPC0_EML]		= mmTPC0_EML_SPMU_BASE,
1908ba2876dSOmer Shpigelman 	[GOYA_SPMU_TPC1_EML]		= mmTPC1_EML_SPMU_BASE,
1918ba2876dSOmer Shpigelman 	[GOYA_SPMU_TPC2_EML]		= mmTPC2_EML_SPMU_BASE,
1928ba2876dSOmer Shpigelman 	[GOYA_SPMU_TPC3_EML]		= mmTPC3_EML_SPMU_BASE,
1938ba2876dSOmer Shpigelman 	[GOYA_SPMU_TPC4_EML]		= mmTPC4_EML_SPMU_BASE,
1948ba2876dSOmer Shpigelman 	[GOYA_SPMU_TPC5_EML]		= mmTPC5_EML_SPMU_BASE,
1958ba2876dSOmer Shpigelman 	[GOYA_SPMU_TPC6_EML]		= mmTPC6_EML_SPMU_BASE,
1968ba2876dSOmer Shpigelman 	[GOYA_SPMU_TPC7_EML]		= mmTPC7_EML_SPMU_BASE
1978ba2876dSOmer Shpigelman };
1988ba2876dSOmer Shpigelman 
goya_coresight_timeout(struct hl_device * hdev,u64 addr,int position,bool up)1998ba2876dSOmer Shpigelman static int goya_coresight_timeout(struct hl_device *hdev, u64 addr,
2008ba2876dSOmer Shpigelman 		int position, bool up)
2018ba2876dSOmer Shpigelman {
2028ba2876dSOmer Shpigelman 	int rc;
2038ba2876dSOmer Shpigelman 	u32 val, timeout_usec;
2048ba2876dSOmer Shpigelman 
2058ba2876dSOmer Shpigelman 	if (hdev->pldm)
2068ba2876dSOmer Shpigelman 		timeout_usec = GOYA_PLDM_CORESIGHT_TIMEOUT_USEC;
2078ba2876dSOmer Shpigelman 	else
2088ba2876dSOmer Shpigelman 		timeout_usec = CORESIGHT_TIMEOUT_USEC;
2098ba2876dSOmer Shpigelman 
2108ba2876dSOmer Shpigelman 	rc = hl_poll_timeout(
2118ba2876dSOmer Shpigelman 		hdev,
2128ba2876dSOmer Shpigelman 		addr,
2138ba2876dSOmer Shpigelman 		val,
2148ba2876dSOmer Shpigelman 		up ? val & BIT(position) : !(val & BIT(position)),
2158ba2876dSOmer Shpigelman 		1000,
2168ba2876dSOmer Shpigelman 		timeout_usec);
2178ba2876dSOmer Shpigelman 
2188ba2876dSOmer Shpigelman 	if (rc) {
2198ba2876dSOmer Shpigelman 		dev_err(hdev->dev,
2208ba2876dSOmer Shpigelman 			"Timeout while waiting for coresight, addr: 0x%llx, position: %d, up: %d\n",
2218ba2876dSOmer Shpigelman 				addr, position, up);
2228ba2876dSOmer Shpigelman 		return -EFAULT;
2238ba2876dSOmer Shpigelman 	}
2248ba2876dSOmer Shpigelman 
2258ba2876dSOmer Shpigelman 	return 0;
2268ba2876dSOmer Shpigelman }
2278ba2876dSOmer Shpigelman 
goya_config_stm(struct hl_device * hdev,struct hl_debug_params * params)2288ba2876dSOmer Shpigelman static int goya_config_stm(struct hl_device *hdev,
2298ba2876dSOmer Shpigelman 		struct hl_debug_params *params)
2308ba2876dSOmer Shpigelman {
2318ba2876dSOmer Shpigelman 	struct hl_debug_params_stm *input;
2329b50f539SOmer Shpigelman 	u64 base_reg;
233e8edded6SAdam Aharon 	u32 frequency;
2348ba2876dSOmer Shpigelman 	int rc;
2358ba2876dSOmer Shpigelman 
2369b50f539SOmer Shpigelman 	if (params->reg_idx >= ARRAY_SIZE(debug_stm_regs)) {
2379b50f539SOmer Shpigelman 		dev_err(hdev->dev, "Invalid register index in STM\n");
2389b50f539SOmer Shpigelman 		return -EINVAL;
2399b50f539SOmer Shpigelman 	}
2409b50f539SOmer Shpigelman 
2419b50f539SOmer Shpigelman 	base_reg = debug_stm_regs[params->reg_idx] - CFG_BASE;
2429b50f539SOmer Shpigelman 
2438ba2876dSOmer Shpigelman 	WREG32(base_reg + 0xFB0, CORESIGHT_UNLOCK);
2448ba2876dSOmer Shpigelman 
2458ba2876dSOmer Shpigelman 	if (params->enable) {
2468ba2876dSOmer Shpigelman 		input = params->input;
2478ba2876dSOmer Shpigelman 
2488ba2876dSOmer Shpigelman 		if (!input)
2498ba2876dSOmer Shpigelman 			return -EINVAL;
2508ba2876dSOmer Shpigelman 
2518ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE80, 0x80004);
2528ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xD64, 7);
2538ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xD60, 0);
2548ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xD00, lower_32_bits(input->he_mask));
2558ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xD20, lower_32_bits(input->sp_mask));
2568ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xD60, 1);
2578ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xD00, upper_32_bits(input->he_mask));
2588ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xD20, upper_32_bits(input->sp_mask));
2598ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE70, 0x10);
2608ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE60, 0);
2618ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE64, 0x420000);
2628ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE00, 0xFFFFFFFF);
2638ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE20, 0xFFFFFFFF);
2648ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xEF4, input->id);
2658ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xDF4, 0x80);
266e8edded6SAdam Aharon 		frequency = hdev->asic_prop.psoc_timestamp_frequency;
267e8edded6SAdam Aharon 		if (frequency == 0)
268e8edded6SAdam Aharon 			frequency = input->frequency;
269e8edded6SAdam Aharon 		WREG32(base_reg + 0xE8C, frequency);
2708ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE90, 0x7FF);
271aa9dd58bSAdam Aharon 		WREG32(base_reg + 0xE80, 0x27 | (input->id << 16));
2728ba2876dSOmer Shpigelman 	} else {
2738ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE80, 4);
2748ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xD64, 0);
2758ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xD60, 1);
2768ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xD00, 0);
2778ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xD20, 0);
2788ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xD60, 0);
2798ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE20, 0);
2808ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE00, 0);
2818ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xDF4, 0x80);
2828ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE70, 0);
2838ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE60, 0);
2848ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE64, 0);
2858ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE8C, 0);
2868ba2876dSOmer Shpigelman 
2878ba2876dSOmer Shpigelman 		rc = goya_coresight_timeout(hdev, base_reg + 0xE80, 23, false);
2888ba2876dSOmer Shpigelman 		if (rc) {
2898ba2876dSOmer Shpigelman 			dev_err(hdev->dev,
2908ba2876dSOmer Shpigelman 				"Failed to disable STM on timeout, error %d\n",
2918ba2876dSOmer Shpigelman 				rc);
2928ba2876dSOmer Shpigelman 			return rc;
2938ba2876dSOmer Shpigelman 		}
2948ba2876dSOmer Shpigelman 
2958ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE80, 4);
2968ba2876dSOmer Shpigelman 	}
2978ba2876dSOmer Shpigelman 
2988ba2876dSOmer Shpigelman 	return 0;
2998ba2876dSOmer Shpigelman }
3008ba2876dSOmer Shpigelman 
goya_config_etf(struct hl_device * hdev,struct hl_debug_params * params)3018ba2876dSOmer Shpigelman static int goya_config_etf(struct hl_device *hdev,
3028ba2876dSOmer Shpigelman 		struct hl_debug_params *params)
3038ba2876dSOmer Shpigelman {
3048ba2876dSOmer Shpigelman 	struct hl_debug_params_etf *input;
3059b50f539SOmer Shpigelman 	u64 base_reg;
3068ba2876dSOmer Shpigelman 	u32 val;
3078ba2876dSOmer Shpigelman 	int rc;
3088ba2876dSOmer Shpigelman 
3099b50f539SOmer Shpigelman 	if (params->reg_idx >= ARRAY_SIZE(debug_etf_regs)) {
3109b50f539SOmer Shpigelman 		dev_err(hdev->dev, "Invalid register index in ETF\n");
3119b50f539SOmer Shpigelman 		return -EINVAL;
3129b50f539SOmer Shpigelman 	}
3139b50f539SOmer Shpigelman 
3149b50f539SOmer Shpigelman 	base_reg = debug_etf_regs[params->reg_idx] - CFG_BASE;
3159b50f539SOmer Shpigelman 
3168ba2876dSOmer Shpigelman 	WREG32(base_reg + 0xFB0, CORESIGHT_UNLOCK);
3178ba2876dSOmer Shpigelman 
318428f6882SBenjamin Dotan 	val = RREG32(base_reg + 0x20);
319428f6882SBenjamin Dotan 
320428f6882SBenjamin Dotan 	if ((!params->enable && val == 0x0) || (params->enable && val != 0x0))
321428f6882SBenjamin Dotan 		return 0;
322428f6882SBenjamin Dotan 
3238ba2876dSOmer Shpigelman 	val = RREG32(base_reg + 0x304);
3248ba2876dSOmer Shpigelman 	val |= 0x1000;
3258ba2876dSOmer Shpigelman 	WREG32(base_reg + 0x304, val);
3268ba2876dSOmer Shpigelman 	val |= 0x40;
3278ba2876dSOmer Shpigelman 	WREG32(base_reg + 0x304, val);
3288ba2876dSOmer Shpigelman 
3298ba2876dSOmer Shpigelman 	rc = goya_coresight_timeout(hdev, base_reg + 0x304, 6, false);
3308ba2876dSOmer Shpigelman 	if (rc) {
3318ba2876dSOmer Shpigelman 		dev_err(hdev->dev,
3328ba2876dSOmer Shpigelman 			"Failed to %s ETF on timeout, error %d\n",
3338ba2876dSOmer Shpigelman 				params->enable ? "enable" : "disable", rc);
3348ba2876dSOmer Shpigelman 		return rc;
3358ba2876dSOmer Shpigelman 	}
3368ba2876dSOmer Shpigelman 
3378ba2876dSOmer Shpigelman 	rc = goya_coresight_timeout(hdev, base_reg + 0xC, 2, true);
3388ba2876dSOmer Shpigelman 	if (rc) {
3398ba2876dSOmer Shpigelman 		dev_err(hdev->dev,
3408ba2876dSOmer Shpigelman 			"Failed to %s ETF on timeout, error %d\n",
3418ba2876dSOmer Shpigelman 				params->enable ? "enable" : "disable", rc);
3428ba2876dSOmer Shpigelman 		return rc;
3438ba2876dSOmer Shpigelman 	}
3448ba2876dSOmer Shpigelman 
3458ba2876dSOmer Shpigelman 	WREG32(base_reg + 0x20, 0);
3468ba2876dSOmer Shpigelman 
3478ba2876dSOmer Shpigelman 	if (params->enable) {
3488ba2876dSOmer Shpigelman 		input = params->input;
3498ba2876dSOmer Shpigelman 
3508ba2876dSOmer Shpigelman 		if (!input)
3518ba2876dSOmer Shpigelman 			return -EINVAL;
3528ba2876dSOmer Shpigelman 
3538ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x34, 0x3FFC);
3548ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x28, input->sink_mode);
3558ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x304, 0x4001);
3568ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x308, 0xA);
3578ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x20, 1);
3588ba2876dSOmer Shpigelman 	} else {
3598ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x34, 0);
3608ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x28, 0);
3618ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x304, 0);
3628ba2876dSOmer Shpigelman 	}
3638ba2876dSOmer Shpigelman 
3648ba2876dSOmer Shpigelman 	return 0;
3658ba2876dSOmer Shpigelman }
3668ba2876dSOmer Shpigelman 
goya_etr_validate_address(struct hl_device * hdev,u64 addr,u64 size)3678ba2876dSOmer Shpigelman static int goya_etr_validate_address(struct hl_device *hdev, u64 addr,
36836545279SOfir Bitton 		u64 size)
3698ba2876dSOmer Shpigelman {
3708ba2876dSOmer Shpigelman 	struct asic_fixed_properties *prop = &hdev->asic_prop;
3718ba2876dSOmer Shpigelman 	u64 range_start, range_end;
3728ba2876dSOmer Shpigelman 
37336545279SOfir Bitton 	if (addr > (addr + size)) {
37436545279SOfir Bitton 		dev_err(hdev->dev,
37536545279SOfir Bitton 			"ETR buffer size %llu overflow\n", size);
37636545279SOfir Bitton 		return false;
37736545279SOfir Bitton 	}
37836545279SOfir Bitton 
37964a7e295SOmer Shpigelman 	range_start = prop->dmmu.start_addr;
38064a7e295SOmer Shpigelman 	range_end = prop->dmmu.end_addr;
3818ba2876dSOmer Shpigelman 
3828ba2876dSOmer Shpigelman 	return hl_mem_area_inside_range(addr, size, range_start, range_end);
3838ba2876dSOmer Shpigelman }
3848ba2876dSOmer Shpigelman 
goya_config_etr(struct hl_device * hdev,struct hl_debug_params * params)3858ba2876dSOmer Shpigelman static int goya_config_etr(struct hl_device *hdev,
3868ba2876dSOmer Shpigelman 		struct hl_debug_params *params)
3878ba2876dSOmer Shpigelman {
3888ba2876dSOmer Shpigelman 	struct hl_debug_params_etr *input;
3898ba2876dSOmer Shpigelman 	u32 val;
3908ba2876dSOmer Shpigelman 	int rc;
3918ba2876dSOmer Shpigelman 
392e1a84d56SOded Gabbay 	WREG32(mmPSOC_ETR_LAR, CORESIGHT_UNLOCK);
3938ba2876dSOmer Shpigelman 
394428f6882SBenjamin Dotan 	val = RREG32(mmPSOC_ETR_CTL);
395428f6882SBenjamin Dotan 
396428f6882SBenjamin Dotan 	if ((!params->enable && val == 0x0) || (params->enable && val != 0x0))
397428f6882SBenjamin Dotan 		return 0;
398428f6882SBenjamin Dotan 
399e1a84d56SOded Gabbay 	val = RREG32(mmPSOC_ETR_FFCR);
4008ba2876dSOmer Shpigelman 	val |= 0x1000;
401e1a84d56SOded Gabbay 	WREG32(mmPSOC_ETR_FFCR, val);
4028ba2876dSOmer Shpigelman 	val |= 0x40;
403e1a84d56SOded Gabbay 	WREG32(mmPSOC_ETR_FFCR, val);
4048ba2876dSOmer Shpigelman 
405e1a84d56SOded Gabbay 	rc = goya_coresight_timeout(hdev, mmPSOC_ETR_FFCR, 6, false);
4068ba2876dSOmer Shpigelman 	if (rc) {
4078ba2876dSOmer Shpigelman 		dev_err(hdev->dev, "Failed to %s ETR on timeout, error %d\n",
4088ba2876dSOmer Shpigelman 				params->enable ? "enable" : "disable", rc);
4098ba2876dSOmer Shpigelman 		return rc;
4108ba2876dSOmer Shpigelman 	}
4118ba2876dSOmer Shpigelman 
412e1a84d56SOded Gabbay 	rc = goya_coresight_timeout(hdev, mmPSOC_ETR_STS, 2, true);
4138ba2876dSOmer Shpigelman 	if (rc) {
4148ba2876dSOmer Shpigelman 		dev_err(hdev->dev, "Failed to %s ETR on timeout, error %d\n",
4158ba2876dSOmer Shpigelman 				params->enable ? "enable" : "disable", rc);
4168ba2876dSOmer Shpigelman 		return rc;
4178ba2876dSOmer Shpigelman 	}
4188ba2876dSOmer Shpigelman 
419e1a84d56SOded Gabbay 	WREG32(mmPSOC_ETR_CTL, 0);
4208ba2876dSOmer Shpigelman 
4218ba2876dSOmer Shpigelman 	if (params->enable) {
4228ba2876dSOmer Shpigelman 		input = params->input;
4238ba2876dSOmer Shpigelman 
4248ba2876dSOmer Shpigelman 		if (!input)
4258ba2876dSOmer Shpigelman 			return -EINVAL;
4268ba2876dSOmer Shpigelman 
4278ba2876dSOmer Shpigelman 		if (input->buffer_size == 0) {
4288ba2876dSOmer Shpigelman 			dev_err(hdev->dev,
4298ba2876dSOmer Shpigelman 				"ETR buffer size should be bigger than 0\n");
4308ba2876dSOmer Shpigelman 			return -EINVAL;
4318ba2876dSOmer Shpigelman 		}
4328ba2876dSOmer Shpigelman 
4338ba2876dSOmer Shpigelman 		if (!goya_etr_validate_address(hdev,
4348ba2876dSOmer Shpigelman 				input->buffer_address, input->buffer_size)) {
4358ba2876dSOmer Shpigelman 			dev_err(hdev->dev, "buffer address is not valid\n");
4368ba2876dSOmer Shpigelman 			return -EINVAL;
4378ba2876dSOmer Shpigelman 		}
4388ba2876dSOmer Shpigelman 
439e1a84d56SOded Gabbay 		WREG32(mmPSOC_ETR_BUFWM, 0x3FFC);
440e1a84d56SOded Gabbay 		WREG32(mmPSOC_ETR_RSZ, input->buffer_size);
441e1a84d56SOded Gabbay 		WREG32(mmPSOC_ETR_MODE, input->sink_mode);
4424cb4508cSOhad Sharabi 		if (!hdev->asic_prop.fw_security_enabled) {
443663a301dSOhad Sharabi 			/* make ETR not privileged */
444663a301dSOhad Sharabi 			val = FIELD_PREP(PSOC_ETR_AXICTL_PROTCTRLBIT0_MASK, 0);
445663a301dSOhad Sharabi 			/* make ETR non-secured (inverted logic) */
446663a301dSOhad Sharabi 			val |= FIELD_PREP(PSOC_ETR_AXICTL_PROTCTRLBIT1_MASK, 1);
447663a301dSOhad Sharabi 			/* burst size 8 */
448663a301dSOhad Sharabi 			val |= FIELD_PREP(PSOC_ETR_AXICTL_WRBURSTLEN_MASK, 7);
449663a301dSOhad Sharabi 			WREG32(mmPSOC_ETR_AXICTL, val);
450663a301dSOhad Sharabi 		}
451e1a84d56SOded Gabbay 		WREG32(mmPSOC_ETR_DBALO,
4528ba2876dSOmer Shpigelman 				lower_32_bits(input->buffer_address));
453e1a84d56SOded Gabbay 		WREG32(mmPSOC_ETR_DBAHI,
4548ba2876dSOmer Shpigelman 				upper_32_bits(input->buffer_address));
455e1a84d56SOded Gabbay 		WREG32(mmPSOC_ETR_FFCR, 3);
456e1a84d56SOded Gabbay 		WREG32(mmPSOC_ETR_PSCR, 0xA);
457e1a84d56SOded Gabbay 		WREG32(mmPSOC_ETR_CTL, 1);
4588ba2876dSOmer Shpigelman 	} else {
459e1a84d56SOded Gabbay 		WREG32(mmPSOC_ETR_BUFWM, 0);
460e1a84d56SOded Gabbay 		WREG32(mmPSOC_ETR_RSZ, 0x400);
461e1a84d56SOded Gabbay 		WREG32(mmPSOC_ETR_DBALO, 0);
462e1a84d56SOded Gabbay 		WREG32(mmPSOC_ETR_DBAHI, 0);
463e1a84d56SOded Gabbay 		WREG32(mmPSOC_ETR_PSCR, 0);
464e1a84d56SOded Gabbay 		WREG32(mmPSOC_ETR_MODE, 0);
465e1a84d56SOded Gabbay 		WREG32(mmPSOC_ETR_FFCR, 0);
4668ba2876dSOmer Shpigelman 
4671f65105fSTomer Tayar 		if (params->output_size >= sizeof(u64)) {
4681f65105fSTomer Tayar 			u32 rwp, rwphi;
4691f65105fSTomer Tayar 
4701f65105fSTomer Tayar 			/*
4711f65105fSTomer Tayar 			 * The trace buffer address is 40 bits wide. The end of
4721f65105fSTomer Tayar 			 * the buffer is set in the RWP register (lower 32
4731f65105fSTomer Tayar 			 * bits), and in the RWPHI register (upper 8 bits).
4741f65105fSTomer Tayar 			 */
475e1a84d56SOded Gabbay 			rwp = RREG32(mmPSOC_ETR_RWP);
476e1a84d56SOded Gabbay 			rwphi = RREG32(mmPSOC_ETR_RWPHI) & 0xff;
4771f65105fSTomer Tayar 			*(u64 *) params->output = ((u64) rwphi << 32) | rwp;
4781f65105fSTomer Tayar 		}
4798ba2876dSOmer Shpigelman 	}
4808ba2876dSOmer Shpigelman 
4818ba2876dSOmer Shpigelman 	return 0;
4828ba2876dSOmer Shpigelman }
4838ba2876dSOmer Shpigelman 
goya_config_funnel(struct hl_device * hdev,struct hl_debug_params * params)4848ba2876dSOmer Shpigelman static int goya_config_funnel(struct hl_device *hdev,
4858ba2876dSOmer Shpigelman 		struct hl_debug_params *params)
4868ba2876dSOmer Shpigelman {
4879b50f539SOmer Shpigelman 	u64 base_reg;
4888ba2876dSOmer Shpigelman 
4899b50f539SOmer Shpigelman 	if (params->reg_idx >= ARRAY_SIZE(debug_funnel_regs)) {
4909b50f539SOmer Shpigelman 		dev_err(hdev->dev, "Invalid register index in FUNNEL\n");
4919b50f539SOmer Shpigelman 		return -EINVAL;
4929b50f539SOmer Shpigelman 	}
4939b50f539SOmer Shpigelman 
4949b50f539SOmer Shpigelman 	base_reg = debug_funnel_regs[params->reg_idx] - CFG_BASE;
4959b50f539SOmer Shpigelman 
4969b50f539SOmer Shpigelman 	WREG32(base_reg + 0xFB0, CORESIGHT_UNLOCK);
4979b50f539SOmer Shpigelman 
4989b50f539SOmer Shpigelman 	WREG32(base_reg, params->enable ? 0x33F : 0);
4998ba2876dSOmer Shpigelman 
5008ba2876dSOmer Shpigelman 	return 0;
5018ba2876dSOmer Shpigelman }
5028ba2876dSOmer Shpigelman 
goya_config_bmon(struct hl_device * hdev,struct hl_debug_params * params)5038ba2876dSOmer Shpigelman static int goya_config_bmon(struct hl_device *hdev,
5048ba2876dSOmer Shpigelman 		struct hl_debug_params *params)
5058ba2876dSOmer Shpigelman {
5068ba2876dSOmer Shpigelman 	struct hl_debug_params_bmon *input;
5079b50f539SOmer Shpigelman 	u64 base_reg;
5088ba2876dSOmer Shpigelman 	u32 pcie_base = 0;
5098ba2876dSOmer Shpigelman 
5109b50f539SOmer Shpigelman 	if (params->reg_idx >= ARRAY_SIZE(debug_bmon_regs)) {
5119b50f539SOmer Shpigelman 		dev_err(hdev->dev, "Invalid register index in BMON\n");
5129b50f539SOmer Shpigelman 		return -EINVAL;
5139b50f539SOmer Shpigelman 	}
5149b50f539SOmer Shpigelman 
5159b50f539SOmer Shpigelman 	base_reg = debug_bmon_regs[params->reg_idx] - CFG_BASE;
5169b50f539SOmer Shpigelman 
5178ba2876dSOmer Shpigelman 	WREG32(base_reg + 0x104, 1);
5188ba2876dSOmer Shpigelman 
5198ba2876dSOmer Shpigelman 	if (params->enable) {
5208ba2876dSOmer Shpigelman 		input = params->input;
5218ba2876dSOmer Shpigelman 
5228ba2876dSOmer Shpigelman 		if (!input)
5238ba2876dSOmer Shpigelman 			return -EINVAL;
5248ba2876dSOmer Shpigelman 
525d691171dSOded Gabbay 		WREG32(base_reg + 0x200, lower_32_bits(input->start_addr0));
526d691171dSOded Gabbay 		WREG32(base_reg + 0x204, upper_32_bits(input->start_addr0));
527d691171dSOded Gabbay 		WREG32(base_reg + 0x208, lower_32_bits(input->addr_mask0));
528d691171dSOded Gabbay 		WREG32(base_reg + 0x20C, upper_32_bits(input->addr_mask0));
529d691171dSOded Gabbay 		WREG32(base_reg + 0x240, lower_32_bits(input->start_addr1));
530d691171dSOded Gabbay 		WREG32(base_reg + 0x244, upper_32_bits(input->start_addr1));
531d691171dSOded Gabbay 		WREG32(base_reg + 0x248, lower_32_bits(input->addr_mask1));
532d691171dSOded Gabbay 		WREG32(base_reg + 0x24C, upper_32_bits(input->addr_mask1));
5338ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x224, 0);
5348ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x234, 0);
5358ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x30C, input->bw_win);
5368ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x308, input->win_capture);
5378ba2876dSOmer Shpigelman 
5388ba2876dSOmer Shpigelman 		/* PCIE IF BMON bug WA */
5398ba2876dSOmer Shpigelman 		if (params->reg_idx != GOYA_BMON_PCIE_MSTR_RD &&
5408ba2876dSOmer Shpigelman 				params->reg_idx != GOYA_BMON_PCIE_MSTR_WR &&
5418ba2876dSOmer Shpigelman 				params->reg_idx != GOYA_BMON_PCIE_SLV_RD &&
5428ba2876dSOmer Shpigelman 				params->reg_idx != GOYA_BMON_PCIE_SLV_WR)
5438ba2876dSOmer Shpigelman 			pcie_base = 0xA000000;
5448ba2876dSOmer Shpigelman 
5458ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x700, pcie_base | 0xB00 | (input->id << 12));
5468ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x708, pcie_base | 0xA00 | (input->id << 12));
5478ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x70C, pcie_base | 0xC00 | (input->id << 12));
5488ba2876dSOmer Shpigelman 
5498ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x100, 0x11);
5508ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x304, 0x1);
5518ba2876dSOmer Shpigelman 	} else {
552d691171dSOded Gabbay 		WREG32(base_reg + 0x200, 0);
553d691171dSOded Gabbay 		WREG32(base_reg + 0x204, 0);
5548ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x208, 0xFFFFFFFF);
5558ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x20C, 0xFFFFFFFF);
556d691171dSOded Gabbay 		WREG32(base_reg + 0x240, 0);
557d691171dSOded Gabbay 		WREG32(base_reg + 0x244, 0);
5588ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x248, 0xFFFFFFFF);
5598ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x24C, 0xFFFFFFFF);
5608ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x224, 0xFFFFFFFF);
5618ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x234, 0x1070F);
5628ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x30C, 0);
5638ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x308, 0xFFFF);
5648ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x700, 0xA000B00);
5658ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x708, 0xA000A00);
5668ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x70C, 0xA000C00);
5678ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x100, 1);
5688ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x304, 0);
5698ba2876dSOmer Shpigelman 		WREG32(base_reg + 0x104, 0);
5708ba2876dSOmer Shpigelman 	}
5718ba2876dSOmer Shpigelman 
5728ba2876dSOmer Shpigelman 	return 0;
5738ba2876dSOmer Shpigelman }
5748ba2876dSOmer Shpigelman 
goya_config_spmu(struct hl_device * hdev,struct hl_debug_params * params)5758ba2876dSOmer Shpigelman static int goya_config_spmu(struct hl_device *hdev,
5768ba2876dSOmer Shpigelman 		struct hl_debug_params *params)
5778ba2876dSOmer Shpigelman {
5789b50f539SOmer Shpigelman 	u64 base_reg;
5798ba2876dSOmer Shpigelman 	u64 *output;
5808ba2876dSOmer Shpigelman 	u32 output_arr_len;
5818ba2876dSOmer Shpigelman 	u32 events_num;
5828ba2876dSOmer Shpigelman 	u32 overflow_idx;
5838ba2876dSOmer Shpigelman 	u32 cycle_cnt_idx;
5848ba2876dSOmer Shpigelman 	int i;
5858ba2876dSOmer Shpigelman 
5869b50f539SOmer Shpigelman 	if (params->reg_idx >= ARRAY_SIZE(debug_spmu_regs)) {
5879b50f539SOmer Shpigelman 		dev_err(hdev->dev, "Invalid register index in SPMU\n");
5889b50f539SOmer Shpigelman 		return -EINVAL;
5899b50f539SOmer Shpigelman 	}
5909b50f539SOmer Shpigelman 
5919b50f539SOmer Shpigelman 	base_reg = debug_spmu_regs[params->reg_idx] - CFG_BASE;
5929b50f539SOmer Shpigelman 
5938ba2876dSOmer Shpigelman 	if (params->enable) {
5945ae8b6b7SColin Ian King 		struct hl_debug_params_spmu *input = params->input;
5958ba2876dSOmer Shpigelman 
5968ba2876dSOmer Shpigelman 		if (!input)
5978ba2876dSOmer Shpigelman 			return -EINVAL;
5988ba2876dSOmer Shpigelman 
5998ba2876dSOmer Shpigelman 		if (input->event_types_num < 3) {
6008ba2876dSOmer Shpigelman 			dev_err(hdev->dev,
6019b50f539SOmer Shpigelman 				"not enough event types values for SPMU enable\n");
6029b50f539SOmer Shpigelman 			return -EINVAL;
6039b50f539SOmer Shpigelman 		}
6049b50f539SOmer Shpigelman 
6059b50f539SOmer Shpigelman 		if (input->event_types_num > SPMU_MAX_COUNTERS) {
6069b50f539SOmer Shpigelman 			dev_err(hdev->dev,
6079b50f539SOmer Shpigelman 				"too many event types values for SPMU enable\n");
6088ba2876dSOmer Shpigelman 			return -EINVAL;
6098ba2876dSOmer Shpigelman 		}
6108ba2876dSOmer Shpigelman 
6118ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE04, 0x41013046);
6128ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE04, 0x41013040);
6138ba2876dSOmer Shpigelman 
6148ba2876dSOmer Shpigelman 		for (i = 0 ; i < input->event_types_num ; i++)
6159b50f539SOmer Shpigelman 			WREG32(base_reg + SPMU_EVENT_TYPES_OFFSET + i * 4,
6169b50f539SOmer Shpigelman 				input->event_types[i]);
6178ba2876dSOmer Shpigelman 
6188ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE04, 0x41013041);
6198ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xC00, 0x8000003F);
6208ba2876dSOmer Shpigelman 	} else {
6218ba2876dSOmer Shpigelman 		output = params->output;
6228ba2876dSOmer Shpigelman 		output_arr_len = params->output_size / 8;
6238ba2876dSOmer Shpigelman 		events_num = output_arr_len - 2;
6248ba2876dSOmer Shpigelman 		overflow_idx = output_arr_len - 2;
6258ba2876dSOmer Shpigelman 		cycle_cnt_idx = output_arr_len - 1;
6268ba2876dSOmer Shpigelman 
6278ba2876dSOmer Shpigelman 		if (!output)
6288ba2876dSOmer Shpigelman 			return -EINVAL;
6298ba2876dSOmer Shpigelman 
6308ba2876dSOmer Shpigelman 		if (output_arr_len < 3) {
6318ba2876dSOmer Shpigelman 			dev_err(hdev->dev,
6328ba2876dSOmer Shpigelman 				"not enough values for SPMU disable\n");
6338ba2876dSOmer Shpigelman 			return -EINVAL;
6348ba2876dSOmer Shpigelman 		}
6358ba2876dSOmer Shpigelman 
6369b50f539SOmer Shpigelman 		if (events_num > SPMU_MAX_COUNTERS) {
6379b50f539SOmer Shpigelman 			dev_err(hdev->dev,
6389b50f539SOmer Shpigelman 				"too many events values for SPMU disable\n");
6399b50f539SOmer Shpigelman 			return -EINVAL;
6409b50f539SOmer Shpigelman 		}
6419b50f539SOmer Shpigelman 
6428ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xE04, 0x41013040);
6438ba2876dSOmer Shpigelman 
6448ba2876dSOmer Shpigelman 		for (i = 0 ; i < events_num ; i++)
6458ba2876dSOmer Shpigelman 			output[i] = RREG32(base_reg + i * 8);
6468ba2876dSOmer Shpigelman 
6478ba2876dSOmer Shpigelman 		output[overflow_idx] = RREG32(base_reg + 0xCC0);
6488ba2876dSOmer Shpigelman 
6498ba2876dSOmer Shpigelman 		output[cycle_cnt_idx] = RREG32(base_reg + 0xFC);
6508ba2876dSOmer Shpigelman 		output[cycle_cnt_idx] <<= 32;
6518ba2876dSOmer Shpigelman 		output[cycle_cnt_idx] |= RREG32(base_reg + 0xF8);
6528ba2876dSOmer Shpigelman 
6538ba2876dSOmer Shpigelman 		WREG32(base_reg + 0xCC0, 0);
6548ba2876dSOmer Shpigelman 	}
6558ba2876dSOmer Shpigelman 
6568ba2876dSOmer Shpigelman 	return 0;
6578ba2876dSOmer Shpigelman }
6588ba2876dSOmer Shpigelman 
goya_debug_coresight(struct hl_device * hdev,struct hl_ctx * ctx,void * data)6596798676fSOded Gabbay int goya_debug_coresight(struct hl_device *hdev, struct hl_ctx *ctx, void *data)
660315bc055SOmer Shpigelman {
6618ba2876dSOmer Shpigelman 	struct hl_debug_params *params = data;
662413cf576STomer Tayar 	int rc = 0;
6638ba2876dSOmer Shpigelman 
6648ba2876dSOmer Shpigelman 	switch (params->op) {
6658ba2876dSOmer Shpigelman 	case HL_DEBUG_OP_STM:
6668ba2876dSOmer Shpigelman 		rc = goya_config_stm(hdev, params);
6678ba2876dSOmer Shpigelman 		break;
6688ba2876dSOmer Shpigelman 	case HL_DEBUG_OP_ETF:
6698ba2876dSOmer Shpigelman 		rc = goya_config_etf(hdev, params);
6708ba2876dSOmer Shpigelman 		break;
6718ba2876dSOmer Shpigelman 	case HL_DEBUG_OP_ETR:
6728ba2876dSOmer Shpigelman 		rc = goya_config_etr(hdev, params);
6738ba2876dSOmer Shpigelman 		break;
6748ba2876dSOmer Shpigelman 	case HL_DEBUG_OP_FUNNEL:
6758ba2876dSOmer Shpigelman 		rc = goya_config_funnel(hdev, params);
6768ba2876dSOmer Shpigelman 		break;
6778ba2876dSOmer Shpigelman 	case HL_DEBUG_OP_BMON:
6788ba2876dSOmer Shpigelman 		rc = goya_config_bmon(hdev, params);
6798ba2876dSOmer Shpigelman 		break;
6808ba2876dSOmer Shpigelman 	case HL_DEBUG_OP_SPMU:
6818ba2876dSOmer Shpigelman 		rc = goya_config_spmu(hdev, params);
6828ba2876dSOmer Shpigelman 		break;
6838ba2876dSOmer Shpigelman 	case HL_DEBUG_OP_TIMESTAMP:
684413cf576STomer Tayar 		/* Do nothing as this opcode is deprecated */
6858ba2876dSOmer Shpigelman 		break;
6868ba2876dSOmer Shpigelman 
6878ba2876dSOmer Shpigelman 	default:
6888ba2876dSOmer Shpigelman 		dev_err(hdev->dev, "Unknown coresight id %d\n", params->op);
6898ba2876dSOmer Shpigelman 		return -EINVAL;
6908ba2876dSOmer Shpigelman 	}
6918ba2876dSOmer Shpigelman 
6928ba2876dSOmer Shpigelman 	/* Perform read from the device to flush all configuration */
69367db05ceSLee Jones 	RREG32(mmPCIE_DBI_DEVICE_ID_VENDOR_ID_REG);
6948ba2876dSOmer Shpigelman 
6958ba2876dSOmer Shpigelman 	return rc;
696315bc055SOmer Shpigelman }
69789225ce4SOmer Shpigelman 
goya_halt_coresight(struct hl_device * hdev,struct hl_ctx * ctx)6986798676fSOded Gabbay void goya_halt_coresight(struct hl_device *hdev, struct hl_ctx *ctx)
69989225ce4SOmer Shpigelman {
70089225ce4SOmer Shpigelman 	struct hl_debug_params params = {};
70189225ce4SOmer Shpigelman 	int i, rc;
70289225ce4SOmer Shpigelman 
70389225ce4SOmer Shpigelman 	for (i = GOYA_ETF_FIRST ; i <= GOYA_ETF_LAST ; i++) {
70489225ce4SOmer Shpigelman 		params.reg_idx = i;
70589225ce4SOmer Shpigelman 		rc = goya_config_etf(hdev, &params);
70689225ce4SOmer Shpigelman 		if (rc)
70789225ce4SOmer Shpigelman 			dev_err(hdev->dev, "halt ETF failed, %d/%d\n", rc, i);
70889225ce4SOmer Shpigelman 	}
70989225ce4SOmer Shpigelman 
71089225ce4SOmer Shpigelman 	rc = goya_config_etr(hdev, &params);
71189225ce4SOmer Shpigelman 	if (rc)
71289225ce4SOmer Shpigelman 		dev_err(hdev->dev, "halt ETR failed, %d\n", rc);
71389225ce4SOmer Shpigelman }
714