root/drivers/misc/habanalabs/goya/goya_coresight.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. goya_coresight_timeout
  2. goya_config_stm
  3. goya_config_etf
  4. goya_etr_validate_address
  5. goya_config_etr
  6. goya_config_funnel
  7. goya_config_bmon
  8. goya_config_spmu
  9. goya_debug_coresight
  10. goya_halt_coresight

   1 // SPDX-License-Identifier: GPL-2.0
   2 
   3 /*
   4  * Copyright 2016-2019 HabanaLabs, Ltd.
   5  * All Rights Reserved.
   6  */
   7 
   8 #include "goyaP.h"
   9 #include "include/goya/goya_coresight.h"
  10 #include "include/goya/asic_reg/goya_regs.h"
  11 
  12 #include <uapi/misc/habanalabs.h>
  13 
  14 #include <linux/coresight.h>
  15 
  16 #define GOYA_PLDM_CORESIGHT_TIMEOUT_USEC        (CORESIGHT_TIMEOUT_USEC * 100)
  17 
  18 #define SPMU_SECTION_SIZE               DMA_CH_0_CS_SPMU_MAX_OFFSET
  19 #define SPMU_EVENT_TYPES_OFFSET         0x400
  20 #define SPMU_MAX_COUNTERS               6
  21 
  22 static u64 debug_stm_regs[GOYA_STM_LAST + 1] = {
  23         [GOYA_STM_CPU]          = mmCPU_STM_BASE,
  24         [GOYA_STM_DMA_CH_0_CS]  = mmDMA_CH_0_CS_STM_BASE,
  25         [GOYA_STM_DMA_CH_1_CS]  = mmDMA_CH_1_CS_STM_BASE,
  26         [GOYA_STM_DMA_CH_2_CS]  = mmDMA_CH_2_CS_STM_BASE,
  27         [GOYA_STM_DMA_CH_3_CS]  = mmDMA_CH_3_CS_STM_BASE,
  28         [GOYA_STM_DMA_CH_4_CS]  = mmDMA_CH_4_CS_STM_BASE,
  29         [GOYA_STM_DMA_MACRO_CS] = mmDMA_MACRO_CS_STM_BASE,
  30         [GOYA_STM_MME1_SBA]     = mmMME1_SBA_STM_BASE,
  31         [GOYA_STM_MME3_SBB]     = mmMME3_SBB_STM_BASE,
  32         [GOYA_STM_MME4_WACS2]   = mmMME4_WACS2_STM_BASE,
  33         [GOYA_STM_MME4_WACS]    = mmMME4_WACS_STM_BASE,
  34         [GOYA_STM_MMU_CS]       = mmMMU_CS_STM_BASE,
  35         [GOYA_STM_PCIE]         = mmPCIE_STM_BASE,
  36         [GOYA_STM_PSOC]         = mmPSOC_STM_BASE,
  37         [GOYA_STM_TPC0_EML]     = mmTPC0_EML_STM_BASE,
  38         [GOYA_STM_TPC1_EML]     = mmTPC1_EML_STM_BASE,
  39         [GOYA_STM_TPC2_EML]     = mmTPC2_EML_STM_BASE,
  40         [GOYA_STM_TPC3_EML]     = mmTPC3_EML_STM_BASE,
  41         [GOYA_STM_TPC4_EML]     = mmTPC4_EML_STM_BASE,
  42         [GOYA_STM_TPC5_EML]     = mmTPC5_EML_STM_BASE,
  43         [GOYA_STM_TPC6_EML]     = mmTPC6_EML_STM_BASE,
  44         [GOYA_STM_TPC7_EML]     = mmTPC7_EML_STM_BASE
  45 };
  46 
  47 static u64 debug_etf_regs[GOYA_ETF_LAST + 1] = {
  48         [GOYA_ETF_CPU_0]        = mmCPU_ETF_0_BASE,
  49         [GOYA_ETF_CPU_1]        = mmCPU_ETF_1_BASE,
  50         [GOYA_ETF_CPU_TRACE]    = mmCPU_ETF_TRACE_BASE,
  51         [GOYA_ETF_DMA_CH_0_CS]  = mmDMA_CH_0_CS_ETF_BASE,
  52         [GOYA_ETF_DMA_CH_1_CS]  = mmDMA_CH_1_CS_ETF_BASE,
  53         [GOYA_ETF_DMA_CH_2_CS]  = mmDMA_CH_2_CS_ETF_BASE,
  54         [GOYA_ETF_DMA_CH_3_CS]  = mmDMA_CH_3_CS_ETF_BASE,
  55         [GOYA_ETF_DMA_CH_4_CS]  = mmDMA_CH_4_CS_ETF_BASE,
  56         [GOYA_ETF_DMA_MACRO_CS] = mmDMA_MACRO_CS_ETF_BASE,
  57         [GOYA_ETF_MME1_SBA]     = mmMME1_SBA_ETF_BASE,
  58         [GOYA_ETF_MME3_SBB]     = mmMME3_SBB_ETF_BASE,
  59         [GOYA_ETF_MME4_WACS2]   = mmMME4_WACS2_ETF_BASE,
  60         [GOYA_ETF_MME4_WACS]    = mmMME4_WACS_ETF_BASE,
  61         [GOYA_ETF_MMU_CS]       = mmMMU_CS_ETF_BASE,
  62         [GOYA_ETF_PCIE]         = mmPCIE_ETF_BASE,
  63         [GOYA_ETF_PSOC]         = mmPSOC_ETF_BASE,
  64         [GOYA_ETF_TPC0_EML]     = mmTPC0_EML_ETF_BASE,
  65         [GOYA_ETF_TPC1_EML]     = mmTPC1_EML_ETF_BASE,
  66         [GOYA_ETF_TPC2_EML]     = mmTPC2_EML_ETF_BASE,
  67         [GOYA_ETF_TPC3_EML]     = mmTPC3_EML_ETF_BASE,
  68         [GOYA_ETF_TPC4_EML]     = mmTPC4_EML_ETF_BASE,
  69         [GOYA_ETF_TPC5_EML]     = mmTPC5_EML_ETF_BASE,
  70         [GOYA_ETF_TPC6_EML]     = mmTPC6_EML_ETF_BASE,
  71         [GOYA_ETF_TPC7_EML]     = mmTPC7_EML_ETF_BASE
  72 };
  73 
  74 static u64 debug_funnel_regs[GOYA_FUNNEL_LAST + 1] = {
  75         [GOYA_FUNNEL_CPU]               = mmCPU_FUNNEL_BASE,
  76         [GOYA_FUNNEL_DMA_CH_6_1]        = mmDMA_CH_FUNNEL_6_1_BASE,
  77         [GOYA_FUNNEL_DMA_MACRO_3_1]     = mmDMA_MACRO_FUNNEL_3_1_BASE,
  78         [GOYA_FUNNEL_MME0_RTR]          = mmMME0_RTR_FUNNEL_BASE,
  79         [GOYA_FUNNEL_MME1_RTR]          = mmMME1_RTR_FUNNEL_BASE,
  80         [GOYA_FUNNEL_MME2_RTR]          = mmMME2_RTR_FUNNEL_BASE,
  81         [GOYA_FUNNEL_MME3_RTR]          = mmMME3_RTR_FUNNEL_BASE,
  82         [GOYA_FUNNEL_MME4_RTR]          = mmMME4_RTR_FUNNEL_BASE,
  83         [GOYA_FUNNEL_MME5_RTR]          = mmMME5_RTR_FUNNEL_BASE,
  84         [GOYA_FUNNEL_PCIE]              = mmPCIE_FUNNEL_BASE,
  85         [GOYA_FUNNEL_PSOC]              = mmPSOC_FUNNEL_BASE,
  86         [GOYA_FUNNEL_TPC0_EML]          = mmTPC0_EML_FUNNEL_BASE,
  87         [GOYA_FUNNEL_TPC1_EML]          = mmTPC1_EML_FUNNEL_BASE,
  88         [GOYA_FUNNEL_TPC1_RTR]          = mmTPC1_RTR_FUNNEL_BASE,
  89         [GOYA_FUNNEL_TPC2_EML]          = mmTPC2_EML_FUNNEL_BASE,
  90         [GOYA_FUNNEL_TPC2_RTR]          = mmTPC2_RTR_FUNNEL_BASE,
  91         [GOYA_FUNNEL_TPC3_EML]          = mmTPC3_EML_FUNNEL_BASE,
  92         [GOYA_FUNNEL_TPC3_RTR]          = mmTPC3_RTR_FUNNEL_BASE,
  93         [GOYA_FUNNEL_TPC4_EML]          = mmTPC4_EML_FUNNEL_BASE,
  94         [GOYA_FUNNEL_TPC4_RTR]          = mmTPC4_RTR_FUNNEL_BASE,
  95         [GOYA_FUNNEL_TPC5_EML]          = mmTPC5_EML_FUNNEL_BASE,
  96         [GOYA_FUNNEL_TPC5_RTR]          = mmTPC5_RTR_FUNNEL_BASE,
  97         [GOYA_FUNNEL_TPC6_EML]          = mmTPC6_EML_FUNNEL_BASE,
  98         [GOYA_FUNNEL_TPC6_RTR]          = mmTPC6_RTR_FUNNEL_BASE,
  99         [GOYA_FUNNEL_TPC7_EML]          = mmTPC7_EML_FUNNEL_BASE
 100 };
 101 
 102 static u64 debug_bmon_regs[GOYA_BMON_LAST + 1] = {
 103         [GOYA_BMON_CPU_RD]              = mmCPU_RD_BMON_BASE,
 104         [GOYA_BMON_CPU_WR]              = mmCPU_WR_BMON_BASE,
 105         [GOYA_BMON_DMA_CH_0_0]          = mmDMA_CH_0_BMON_0_BASE,
 106         [GOYA_BMON_DMA_CH_0_1]          = mmDMA_CH_0_BMON_1_BASE,
 107         [GOYA_BMON_DMA_CH_1_0]          = mmDMA_CH_1_BMON_0_BASE,
 108         [GOYA_BMON_DMA_CH_1_1]          = mmDMA_CH_1_BMON_1_BASE,
 109         [GOYA_BMON_DMA_CH_2_0]          = mmDMA_CH_2_BMON_0_BASE,
 110         [GOYA_BMON_DMA_CH_2_1]          = mmDMA_CH_2_BMON_1_BASE,
 111         [GOYA_BMON_DMA_CH_3_0]          = mmDMA_CH_3_BMON_0_BASE,
 112         [GOYA_BMON_DMA_CH_3_1]          = mmDMA_CH_3_BMON_1_BASE,
 113         [GOYA_BMON_DMA_CH_4_0]          = mmDMA_CH_4_BMON_0_BASE,
 114         [GOYA_BMON_DMA_CH_4_1]          = mmDMA_CH_4_BMON_1_BASE,
 115         [GOYA_BMON_DMA_MACRO_0]         = mmDMA_MACRO_BMON_0_BASE,
 116         [GOYA_BMON_DMA_MACRO_1]         = mmDMA_MACRO_BMON_1_BASE,
 117         [GOYA_BMON_DMA_MACRO_2]         = mmDMA_MACRO_BMON_2_BASE,
 118         [GOYA_BMON_DMA_MACRO_3]         = mmDMA_MACRO_BMON_3_BASE,
 119         [GOYA_BMON_DMA_MACRO_4]         = mmDMA_MACRO_BMON_4_BASE,
 120         [GOYA_BMON_DMA_MACRO_5]         = mmDMA_MACRO_BMON_5_BASE,
 121         [GOYA_BMON_DMA_MACRO_6]         = mmDMA_MACRO_BMON_6_BASE,
 122         [GOYA_BMON_DMA_MACRO_7]         = mmDMA_MACRO_BMON_7_BASE,
 123         [GOYA_BMON_MME1_SBA_0]          = mmMME1_SBA_BMON0_BASE,
 124         [GOYA_BMON_MME1_SBA_1]          = mmMME1_SBA_BMON1_BASE,
 125         [GOYA_BMON_MME3_SBB_0]          = mmMME3_SBB_BMON0_BASE,
 126         [GOYA_BMON_MME3_SBB_1]          = mmMME3_SBB_BMON1_BASE,
 127         [GOYA_BMON_MME4_WACS2_0]        = mmMME4_WACS2_BMON0_BASE,
 128         [GOYA_BMON_MME4_WACS2_1]        = mmMME4_WACS2_BMON1_BASE,
 129         [GOYA_BMON_MME4_WACS2_2]        = mmMME4_WACS2_BMON2_BASE,
 130         [GOYA_BMON_MME4_WACS_0]         = mmMME4_WACS_BMON0_BASE,
 131         [GOYA_BMON_MME4_WACS_1]         = mmMME4_WACS_BMON1_BASE,
 132         [GOYA_BMON_MME4_WACS_2]         = mmMME4_WACS_BMON2_BASE,
 133         [GOYA_BMON_MME4_WACS_3]         = mmMME4_WACS_BMON3_BASE,
 134         [GOYA_BMON_MME4_WACS_4]         = mmMME4_WACS_BMON4_BASE,
 135         [GOYA_BMON_MME4_WACS_5]         = mmMME4_WACS_BMON5_BASE,
 136         [GOYA_BMON_MME4_WACS_6]         = mmMME4_WACS_BMON6_BASE,
 137         [GOYA_BMON_MMU_0]               = mmMMU_BMON_0_BASE,
 138         [GOYA_BMON_MMU_1]               = mmMMU_BMON_1_BASE,
 139         [GOYA_BMON_PCIE_MSTR_RD]        = mmPCIE_BMON_MSTR_RD_BASE,
 140         [GOYA_BMON_PCIE_MSTR_WR]        = mmPCIE_BMON_MSTR_WR_BASE,
 141         [GOYA_BMON_PCIE_SLV_RD]         = mmPCIE_BMON_SLV_RD_BASE,
 142         [GOYA_BMON_PCIE_SLV_WR]         = mmPCIE_BMON_SLV_WR_BASE,
 143         [GOYA_BMON_TPC0_EML_0]          = mmTPC0_EML_BUSMON_0_BASE,
 144         [GOYA_BMON_TPC0_EML_1]          = mmTPC0_EML_BUSMON_1_BASE,
 145         [GOYA_BMON_TPC0_EML_2]          = mmTPC0_EML_BUSMON_2_BASE,
 146         [GOYA_BMON_TPC0_EML_3]          = mmTPC0_EML_BUSMON_3_BASE,
 147         [GOYA_BMON_TPC1_EML_0]          = mmTPC1_EML_BUSMON_0_BASE,
 148         [GOYA_BMON_TPC1_EML_1]          = mmTPC1_EML_BUSMON_1_BASE,
 149         [GOYA_BMON_TPC1_EML_2]          = mmTPC1_EML_BUSMON_2_BASE,
 150         [GOYA_BMON_TPC1_EML_3]          = mmTPC1_EML_BUSMON_3_BASE,
 151         [GOYA_BMON_TPC2_EML_0]          = mmTPC2_EML_BUSMON_0_BASE,
 152         [GOYA_BMON_TPC2_EML_1]          = mmTPC2_EML_BUSMON_1_BASE,
 153         [GOYA_BMON_TPC2_EML_2]          = mmTPC2_EML_BUSMON_2_BASE,
 154         [GOYA_BMON_TPC2_EML_3]          = mmTPC2_EML_BUSMON_3_BASE,
 155         [GOYA_BMON_TPC3_EML_0]          = mmTPC3_EML_BUSMON_0_BASE,
 156         [GOYA_BMON_TPC3_EML_1]          = mmTPC3_EML_BUSMON_1_BASE,
 157         [GOYA_BMON_TPC3_EML_2]          = mmTPC3_EML_BUSMON_2_BASE,
 158         [GOYA_BMON_TPC3_EML_3]          = mmTPC3_EML_BUSMON_3_BASE,
 159         [GOYA_BMON_TPC4_EML_0]          = mmTPC4_EML_BUSMON_0_BASE,
 160         [GOYA_BMON_TPC4_EML_1]          = mmTPC4_EML_BUSMON_1_BASE,
 161         [GOYA_BMON_TPC4_EML_2]          = mmTPC4_EML_BUSMON_2_BASE,
 162         [GOYA_BMON_TPC4_EML_3]          = mmTPC4_EML_BUSMON_3_BASE,
 163         [GOYA_BMON_TPC5_EML_0]          = mmTPC5_EML_BUSMON_0_BASE,
 164         [GOYA_BMON_TPC5_EML_1]          = mmTPC5_EML_BUSMON_1_BASE,
 165         [GOYA_BMON_TPC5_EML_2]          = mmTPC5_EML_BUSMON_2_BASE,
 166         [GOYA_BMON_TPC5_EML_3]          = mmTPC5_EML_BUSMON_3_BASE,
 167         [GOYA_BMON_TPC6_EML_0]          = mmTPC6_EML_BUSMON_0_BASE,
 168         [GOYA_BMON_TPC6_EML_1]          = mmTPC6_EML_BUSMON_1_BASE,
 169         [GOYA_BMON_TPC6_EML_2]          = mmTPC6_EML_BUSMON_2_BASE,
 170         [GOYA_BMON_TPC6_EML_3]          = mmTPC6_EML_BUSMON_3_BASE,
 171         [GOYA_BMON_TPC7_EML_0]          = mmTPC7_EML_BUSMON_0_BASE,
 172         [GOYA_BMON_TPC7_EML_1]          = mmTPC7_EML_BUSMON_1_BASE,
 173         [GOYA_BMON_TPC7_EML_2]          = mmTPC7_EML_BUSMON_2_BASE,
 174         [GOYA_BMON_TPC7_EML_3]          = mmTPC7_EML_BUSMON_3_BASE
 175 };
 176 
 177 static u64 debug_spmu_regs[GOYA_SPMU_LAST + 1] = {
 178         [GOYA_SPMU_DMA_CH_0_CS]         = mmDMA_CH_0_CS_SPMU_BASE,
 179         [GOYA_SPMU_DMA_CH_1_CS]         = mmDMA_CH_1_CS_SPMU_BASE,
 180         [GOYA_SPMU_DMA_CH_2_CS]         = mmDMA_CH_2_CS_SPMU_BASE,
 181         [GOYA_SPMU_DMA_CH_3_CS]         = mmDMA_CH_3_CS_SPMU_BASE,
 182         [GOYA_SPMU_DMA_CH_4_CS]         = mmDMA_CH_4_CS_SPMU_BASE,
 183         [GOYA_SPMU_DMA_MACRO_CS]        = mmDMA_MACRO_CS_SPMU_BASE,
 184         [GOYA_SPMU_MME1_SBA]            = mmMME1_SBA_SPMU_BASE,
 185         [GOYA_SPMU_MME3_SBB]            = mmMME3_SBB_SPMU_BASE,
 186         [GOYA_SPMU_MME4_WACS2]          = mmMME4_WACS2_SPMU_BASE,
 187         [GOYA_SPMU_MME4_WACS]           = mmMME4_WACS_SPMU_BASE,
 188         [GOYA_SPMU_MMU_CS]              = mmMMU_CS_SPMU_BASE,
 189         [GOYA_SPMU_PCIE]                = mmPCIE_SPMU_BASE,
 190         [GOYA_SPMU_TPC0_EML]            = mmTPC0_EML_SPMU_BASE,
 191         [GOYA_SPMU_TPC1_EML]            = mmTPC1_EML_SPMU_BASE,
 192         [GOYA_SPMU_TPC2_EML]            = mmTPC2_EML_SPMU_BASE,
 193         [GOYA_SPMU_TPC3_EML]            = mmTPC3_EML_SPMU_BASE,
 194         [GOYA_SPMU_TPC4_EML]            = mmTPC4_EML_SPMU_BASE,
 195         [GOYA_SPMU_TPC5_EML]            = mmTPC5_EML_SPMU_BASE,
 196         [GOYA_SPMU_TPC6_EML]            = mmTPC6_EML_SPMU_BASE,
 197         [GOYA_SPMU_TPC7_EML]            = mmTPC7_EML_SPMU_BASE
 198 };
 199 
 200 static int goya_coresight_timeout(struct hl_device *hdev, u64 addr,
 201                 int position, bool up)
 202 {
 203         int rc;
 204         u32 val, timeout_usec;
 205 
 206         if (hdev->pldm)
 207                 timeout_usec = GOYA_PLDM_CORESIGHT_TIMEOUT_USEC;
 208         else
 209                 timeout_usec = CORESIGHT_TIMEOUT_USEC;
 210 
 211         rc = hl_poll_timeout(
 212                 hdev,
 213                 addr,
 214                 val,
 215                 up ? val & BIT(position) : !(val & BIT(position)),
 216                 1000,
 217                 timeout_usec);
 218 
 219         if (rc) {
 220                 dev_err(hdev->dev,
 221                         "Timeout while waiting for coresight, addr: 0x%llx, position: %d, up: %d\n",
 222                                 addr, position, up);
 223                 return -EFAULT;
 224         }
 225 
 226         return 0;
 227 }
 228 
 229 static int goya_config_stm(struct hl_device *hdev,
 230                 struct hl_debug_params *params)
 231 {
 232         struct hl_debug_params_stm *input;
 233         u64 base_reg;
 234         int rc;
 235 
 236         if (params->reg_idx >= ARRAY_SIZE(debug_stm_regs)) {
 237                 dev_err(hdev->dev, "Invalid register index in STM\n");
 238                 return -EINVAL;
 239         }
 240 
 241         base_reg = debug_stm_regs[params->reg_idx] - CFG_BASE;
 242 
 243         WREG32(base_reg + 0xFB0, CORESIGHT_UNLOCK);
 244 
 245         if (params->enable) {
 246                 input = params->input;
 247 
 248                 if (!input)
 249                         return -EINVAL;
 250 
 251                 WREG32(base_reg + 0xE80, 0x80004);
 252                 WREG32(base_reg + 0xD64, 7);
 253                 WREG32(base_reg + 0xD60, 0);
 254                 WREG32(base_reg + 0xD00, lower_32_bits(input->he_mask));
 255                 WREG32(base_reg + 0xD20, lower_32_bits(input->sp_mask));
 256                 WREG32(base_reg + 0xD60, 1);
 257                 WREG32(base_reg + 0xD00, upper_32_bits(input->he_mask));
 258                 WREG32(base_reg + 0xD20, upper_32_bits(input->sp_mask));
 259                 WREG32(base_reg + 0xE70, 0x10);
 260                 WREG32(base_reg + 0xE60, 0);
 261                 WREG32(base_reg + 0xE64, 0x420000);
 262                 WREG32(base_reg + 0xE00, 0xFFFFFFFF);
 263                 WREG32(base_reg + 0xE20, 0xFFFFFFFF);
 264                 WREG32(base_reg + 0xEF4, input->id);
 265                 WREG32(base_reg + 0xDF4, 0x80);
 266                 WREG32(base_reg + 0xE8C, input->frequency);
 267                 WREG32(base_reg + 0xE90, 0x7FF);
 268                 WREG32(base_reg + 0xE80, 0x7 | (input->id << 16));
 269         } else {
 270                 WREG32(base_reg + 0xE80, 4);
 271                 WREG32(base_reg + 0xD64, 0);
 272                 WREG32(base_reg + 0xD60, 1);
 273                 WREG32(base_reg + 0xD00, 0);
 274                 WREG32(base_reg + 0xD20, 0);
 275                 WREG32(base_reg + 0xD60, 0);
 276                 WREG32(base_reg + 0xE20, 0);
 277                 WREG32(base_reg + 0xE00, 0);
 278                 WREG32(base_reg + 0xDF4, 0x80);
 279                 WREG32(base_reg + 0xE70, 0);
 280                 WREG32(base_reg + 0xE60, 0);
 281                 WREG32(base_reg + 0xE64, 0);
 282                 WREG32(base_reg + 0xE8C, 0);
 283 
 284                 rc = goya_coresight_timeout(hdev, base_reg + 0xE80, 23, false);
 285                 if (rc) {
 286                         dev_err(hdev->dev,
 287                                 "Failed to disable STM on timeout, error %d\n",
 288                                 rc);
 289                         return rc;
 290                 }
 291 
 292                 WREG32(base_reg + 0xE80, 4);
 293         }
 294 
 295         return 0;
 296 }
 297 
 298 static int goya_config_etf(struct hl_device *hdev,
 299                 struct hl_debug_params *params)
 300 {
 301         struct hl_debug_params_etf *input;
 302         u64 base_reg;
 303         u32 val;
 304         int rc;
 305 
 306         if (params->reg_idx >= ARRAY_SIZE(debug_etf_regs)) {
 307                 dev_err(hdev->dev, "Invalid register index in ETF\n");
 308                 return -EINVAL;
 309         }
 310 
 311         base_reg = debug_etf_regs[params->reg_idx] - CFG_BASE;
 312 
 313         WREG32(base_reg + 0xFB0, CORESIGHT_UNLOCK);
 314 
 315         val = RREG32(base_reg + 0x304);
 316         val |= 0x1000;
 317         WREG32(base_reg + 0x304, val);
 318         val |= 0x40;
 319         WREG32(base_reg + 0x304, val);
 320 
 321         rc = goya_coresight_timeout(hdev, base_reg + 0x304, 6, false);
 322         if (rc) {
 323                 dev_err(hdev->dev,
 324                         "Failed to %s ETF on timeout, error %d\n",
 325                                 params->enable ? "enable" : "disable", rc);
 326                 return rc;
 327         }
 328 
 329         rc = goya_coresight_timeout(hdev, base_reg + 0xC, 2, true);
 330         if (rc) {
 331                 dev_err(hdev->dev,
 332                         "Failed to %s ETF on timeout, error %d\n",
 333                                 params->enable ? "enable" : "disable", rc);
 334                 return rc;
 335         }
 336 
 337         WREG32(base_reg + 0x20, 0);
 338 
 339         if (params->enable) {
 340                 input = params->input;
 341 
 342                 if (!input)
 343                         return -EINVAL;
 344 
 345                 WREG32(base_reg + 0x34, 0x3FFC);
 346                 WREG32(base_reg + 0x28, input->sink_mode);
 347                 WREG32(base_reg + 0x304, 0x4001);
 348                 WREG32(base_reg + 0x308, 0xA);
 349                 WREG32(base_reg + 0x20, 1);
 350         } else {
 351                 WREG32(base_reg + 0x34, 0);
 352                 WREG32(base_reg + 0x28, 0);
 353                 WREG32(base_reg + 0x304, 0);
 354         }
 355 
 356         return 0;
 357 }
 358 
 359 static int goya_etr_validate_address(struct hl_device *hdev, u64 addr,
 360                 u32 size)
 361 {
 362         struct asic_fixed_properties *prop = &hdev->asic_prop;
 363         u64 range_start, range_end;
 364 
 365         if (hdev->mmu_enable) {
 366                 range_start = prop->va_space_dram_start_address;
 367                 range_end = prop->va_space_dram_end_address;
 368         } else {
 369                 range_start = prop->dram_user_base_address;
 370                 range_end = prop->dram_end_address;
 371         }
 372 
 373         return hl_mem_area_inside_range(addr, size, range_start, range_end);
 374 }
 375 
 376 static int goya_config_etr(struct hl_device *hdev,
 377                 struct hl_debug_params *params)
 378 {
 379         struct hl_debug_params_etr *input;
 380         u64 base_reg = mmPSOC_ETR_BASE - CFG_BASE;
 381         u32 val;
 382         int rc;
 383 
 384         WREG32(base_reg + 0xFB0, CORESIGHT_UNLOCK);
 385 
 386         val = RREG32(base_reg + 0x304);
 387         val |= 0x1000;
 388         WREG32(base_reg + 0x304, val);
 389         val |= 0x40;
 390         WREG32(base_reg + 0x304, val);
 391 
 392         rc = goya_coresight_timeout(hdev, base_reg + 0x304, 6, false);
 393         if (rc) {
 394                 dev_err(hdev->dev, "Failed to %s ETR on timeout, error %d\n",
 395                                 params->enable ? "enable" : "disable", rc);
 396                 return rc;
 397         }
 398 
 399         rc = goya_coresight_timeout(hdev, base_reg + 0xC, 2, true);
 400         if (rc) {
 401                 dev_err(hdev->dev, "Failed to %s ETR on timeout, error %d\n",
 402                                 params->enable ? "enable" : "disable", rc);
 403                 return rc;
 404         }
 405 
 406         WREG32(base_reg + 0x20, 0);
 407 
 408         if (params->enable) {
 409                 input = params->input;
 410 
 411                 if (!input)
 412                         return -EINVAL;
 413 
 414                 if (input->buffer_size == 0) {
 415                         dev_err(hdev->dev,
 416                                 "ETR buffer size should be bigger than 0\n");
 417                         return -EINVAL;
 418                 }
 419 
 420                 if (!goya_etr_validate_address(hdev,
 421                                 input->buffer_address, input->buffer_size)) {
 422                         dev_err(hdev->dev, "buffer address is not valid\n");
 423                         return -EINVAL;
 424                 }
 425 
 426                 WREG32(base_reg + 0x34, 0x3FFC);
 427                 WREG32(base_reg + 0x4, input->buffer_size);
 428                 WREG32(base_reg + 0x28, input->sink_mode);
 429                 WREG32(base_reg + 0x110, 0x700);
 430                 WREG32(base_reg + 0x118,
 431                                 lower_32_bits(input->buffer_address));
 432                 WREG32(base_reg + 0x11C,
 433                                 upper_32_bits(input->buffer_address));
 434                 WREG32(base_reg + 0x304, 3);
 435                 WREG32(base_reg + 0x308, 0xA);
 436                 WREG32(base_reg + 0x20, 1);
 437         } else {
 438                 WREG32(base_reg + 0x34, 0);
 439                 WREG32(base_reg + 0x4, 0x400);
 440                 WREG32(base_reg + 0x118, 0);
 441                 WREG32(base_reg + 0x11C, 0);
 442                 WREG32(base_reg + 0x308, 0);
 443                 WREG32(base_reg + 0x28, 0);
 444                 WREG32(base_reg + 0x304, 0);
 445 
 446                 if (params->output_size >= sizeof(u64)) {
 447                         u32 rwp, rwphi;
 448 
 449                         /*
 450                          * The trace buffer address is 40 bits wide. The end of
 451                          * the buffer is set in the RWP register (lower 32
 452                          * bits), and in the RWPHI register (upper 8 bits).
 453                          */
 454                         rwp = RREG32(base_reg + 0x18);
 455                         rwphi = RREG32(base_reg + 0x3c) & 0xff;
 456                         *(u64 *) params->output = ((u64) rwphi << 32) | rwp;
 457                 }
 458         }
 459 
 460         return 0;
 461 }
 462 
 463 static int goya_config_funnel(struct hl_device *hdev,
 464                 struct hl_debug_params *params)
 465 {
 466         u64 base_reg;
 467 
 468         if (params->reg_idx >= ARRAY_SIZE(debug_funnel_regs)) {
 469                 dev_err(hdev->dev, "Invalid register index in FUNNEL\n");
 470                 return -EINVAL;
 471         }
 472 
 473         base_reg = debug_funnel_regs[params->reg_idx] - CFG_BASE;
 474 
 475         WREG32(base_reg + 0xFB0, CORESIGHT_UNLOCK);
 476 
 477         WREG32(base_reg, params->enable ? 0x33F : 0);
 478 
 479         return 0;
 480 }
 481 
 482 static int goya_config_bmon(struct hl_device *hdev,
 483                 struct hl_debug_params *params)
 484 {
 485         struct hl_debug_params_bmon *input;
 486         u64 base_reg;
 487         u32 pcie_base = 0;
 488 
 489         if (params->reg_idx >= ARRAY_SIZE(debug_bmon_regs)) {
 490                 dev_err(hdev->dev, "Invalid register index in BMON\n");
 491                 return -EINVAL;
 492         }
 493 
 494         base_reg = debug_bmon_regs[params->reg_idx] - CFG_BASE;
 495 
 496         WREG32(base_reg + 0x104, 1);
 497 
 498         if (params->enable) {
 499                 input = params->input;
 500 
 501                 if (!input)
 502                         return -EINVAL;
 503 
 504                 WREG32(base_reg + 0x200, lower_32_bits(input->start_addr0));
 505                 WREG32(base_reg + 0x204, upper_32_bits(input->start_addr0));
 506                 WREG32(base_reg + 0x208, lower_32_bits(input->addr_mask0));
 507                 WREG32(base_reg + 0x20C, upper_32_bits(input->addr_mask0));
 508                 WREG32(base_reg + 0x240, lower_32_bits(input->start_addr1));
 509                 WREG32(base_reg + 0x244, upper_32_bits(input->start_addr1));
 510                 WREG32(base_reg + 0x248, lower_32_bits(input->addr_mask1));
 511                 WREG32(base_reg + 0x24C, upper_32_bits(input->addr_mask1));
 512                 WREG32(base_reg + 0x224, 0);
 513                 WREG32(base_reg + 0x234, 0);
 514                 WREG32(base_reg + 0x30C, input->bw_win);
 515                 WREG32(base_reg + 0x308, input->win_capture);
 516 
 517                 /* PCIE IF BMON bug WA */
 518                 if (params->reg_idx != GOYA_BMON_PCIE_MSTR_RD &&
 519                                 params->reg_idx != GOYA_BMON_PCIE_MSTR_WR &&
 520                                 params->reg_idx != GOYA_BMON_PCIE_SLV_RD &&
 521                                 params->reg_idx != GOYA_BMON_PCIE_SLV_WR)
 522                         pcie_base = 0xA000000;
 523 
 524                 WREG32(base_reg + 0x700, pcie_base | 0xB00 | (input->id << 12));
 525                 WREG32(base_reg + 0x708, pcie_base | 0xA00 | (input->id << 12));
 526                 WREG32(base_reg + 0x70C, pcie_base | 0xC00 | (input->id << 12));
 527 
 528                 WREG32(base_reg + 0x100, 0x11);
 529                 WREG32(base_reg + 0x304, 0x1);
 530         } else {
 531                 WREG32(base_reg + 0x200, 0);
 532                 WREG32(base_reg + 0x204, 0);
 533                 WREG32(base_reg + 0x208, 0xFFFFFFFF);
 534                 WREG32(base_reg + 0x20C, 0xFFFFFFFF);
 535                 WREG32(base_reg + 0x240, 0);
 536                 WREG32(base_reg + 0x244, 0);
 537                 WREG32(base_reg + 0x248, 0xFFFFFFFF);
 538                 WREG32(base_reg + 0x24C, 0xFFFFFFFF);
 539                 WREG32(base_reg + 0x224, 0xFFFFFFFF);
 540                 WREG32(base_reg + 0x234, 0x1070F);
 541                 WREG32(base_reg + 0x30C, 0);
 542                 WREG32(base_reg + 0x308, 0xFFFF);
 543                 WREG32(base_reg + 0x700, 0xA000B00);
 544                 WREG32(base_reg + 0x708, 0xA000A00);
 545                 WREG32(base_reg + 0x70C, 0xA000C00);
 546                 WREG32(base_reg + 0x100, 1);
 547                 WREG32(base_reg + 0x304, 0);
 548                 WREG32(base_reg + 0x104, 0);
 549         }
 550 
 551         return 0;
 552 }
 553 
 554 static int goya_config_spmu(struct hl_device *hdev,
 555                 struct hl_debug_params *params)
 556 {
 557         u64 base_reg;
 558         struct hl_debug_params_spmu *input = params->input;
 559         u64 *output;
 560         u32 output_arr_len;
 561         u32 events_num;
 562         u32 overflow_idx;
 563         u32 cycle_cnt_idx;
 564         int i;
 565 
 566         if (params->reg_idx >= ARRAY_SIZE(debug_spmu_regs)) {
 567                 dev_err(hdev->dev, "Invalid register index in SPMU\n");
 568                 return -EINVAL;
 569         }
 570 
 571         base_reg = debug_spmu_regs[params->reg_idx] - CFG_BASE;
 572 
 573         if (params->enable) {
 574                 input = params->input;
 575 
 576                 if (!input)
 577                         return -EINVAL;
 578 
 579                 if (input->event_types_num < 3) {
 580                         dev_err(hdev->dev,
 581                                 "not enough event types values for SPMU enable\n");
 582                         return -EINVAL;
 583                 }
 584 
 585                 if (input->event_types_num > SPMU_MAX_COUNTERS) {
 586                         dev_err(hdev->dev,
 587                                 "too many event types values for SPMU enable\n");
 588                         return -EINVAL;
 589                 }
 590 
 591                 WREG32(base_reg + 0xE04, 0x41013046);
 592                 WREG32(base_reg + 0xE04, 0x41013040);
 593 
 594                 for (i = 0 ; i < input->event_types_num ; i++)
 595                         WREG32(base_reg + SPMU_EVENT_TYPES_OFFSET + i * 4,
 596                                 input->event_types[i]);
 597 
 598                 WREG32(base_reg + 0xE04, 0x41013041);
 599                 WREG32(base_reg + 0xC00, 0x8000003F);
 600         } else {
 601                 output = params->output;
 602                 output_arr_len = params->output_size / 8;
 603                 events_num = output_arr_len - 2;
 604                 overflow_idx = output_arr_len - 2;
 605                 cycle_cnt_idx = output_arr_len - 1;
 606 
 607                 if (!output)
 608                         return -EINVAL;
 609 
 610                 if (output_arr_len < 3) {
 611                         dev_err(hdev->dev,
 612                                 "not enough values for SPMU disable\n");
 613                         return -EINVAL;
 614                 }
 615 
 616                 if (events_num > SPMU_MAX_COUNTERS) {
 617                         dev_err(hdev->dev,
 618                                 "too many events values for SPMU disable\n");
 619                         return -EINVAL;
 620                 }
 621 
 622                 WREG32(base_reg + 0xE04, 0x41013040);
 623 
 624                 for (i = 0 ; i < events_num ; i++)
 625                         output[i] = RREG32(base_reg + i * 8);
 626 
 627                 output[overflow_idx] = RREG32(base_reg + 0xCC0);
 628 
 629                 output[cycle_cnt_idx] = RREG32(base_reg + 0xFC);
 630                 output[cycle_cnt_idx] <<= 32;
 631                 output[cycle_cnt_idx] |= RREG32(base_reg + 0xF8);
 632 
 633                 WREG32(base_reg + 0xCC0, 0);
 634         }
 635 
 636         return 0;
 637 }
 638 
 639 int goya_debug_coresight(struct hl_device *hdev, void *data)
 640 {
 641         struct hl_debug_params *params = data;
 642         u32 val;
 643         int rc = 0;
 644 
 645         switch (params->op) {
 646         case HL_DEBUG_OP_STM:
 647                 rc = goya_config_stm(hdev, params);
 648                 break;
 649         case HL_DEBUG_OP_ETF:
 650                 rc = goya_config_etf(hdev, params);
 651                 break;
 652         case HL_DEBUG_OP_ETR:
 653                 rc = goya_config_etr(hdev, params);
 654                 break;
 655         case HL_DEBUG_OP_FUNNEL:
 656                 rc = goya_config_funnel(hdev, params);
 657                 break;
 658         case HL_DEBUG_OP_BMON:
 659                 rc = goya_config_bmon(hdev, params);
 660                 break;
 661         case HL_DEBUG_OP_SPMU:
 662                 rc = goya_config_spmu(hdev, params);
 663                 break;
 664         case HL_DEBUG_OP_TIMESTAMP:
 665                 /* Do nothing as this opcode is deprecated */
 666                 break;
 667 
 668         default:
 669                 dev_err(hdev->dev, "Unknown coresight id %d\n", params->op);
 670                 return -EINVAL;
 671         }
 672 
 673         /* Perform read from the device to flush all configuration */
 674         val = RREG32(mmPCIE_DBI_DEVICE_ID_VENDOR_ID_REG);
 675 
 676         return rc;
 677 }
 678 
 679 void goya_halt_coresight(struct hl_device *hdev)
 680 {
 681         struct hl_debug_params params = {};
 682         int i, rc;
 683 
 684         for (i = GOYA_ETF_FIRST ; i <= GOYA_ETF_LAST ; i++) {
 685                 params.reg_idx = i;
 686                 rc = goya_config_etf(hdev, &params);
 687                 if (rc)
 688                         dev_err(hdev->dev, "halt ETF failed, %d/%d\n", rc, i);
 689         }
 690 
 691         rc = goya_config_etr(hdev, &params);
 692         if (rc)
 693                 dev_err(hdev->dev, "halt ETR failed, %d\n", rc);
 694 }

/* [<][>][^][v][top][bottom][index][help] */