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, ¶ms);
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, ¶ms);
71189225ce4SOmer Shpigelman if (rc)
71289225ce4SOmer Shpigelman dev_err(hdev->dev, "halt ETR failed, %d\n", rc);
71389225ce4SOmer Shpigelman }
714