LCOV - code coverage report
Current view: top level - drivers/gpu/drm/amd/amdgpu - gfx_v9_4_2.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 460 0.0 %
Date: 2022-12-09 01:23:36 Functions: 0 29 0.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright 2020 Advanced Micro Devices, Inc.
       3             :  *
       4             :  * Permission is hereby granted, free of charge, to any person obtaining a
       5             :  * copy of this software and associated documentation files (the "Software"),
       6             :  * to deal in the Software without restriction, including without limitation
       7             :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
       8             :  * and/or sell copies of the Software, and to permit persons to whom the
       9             :  * Software is furnished to do so, subject to the following conditions:
      10             :  *
      11             :  * The above copyright notice and this permission notice shall be included in
      12             :  * all copies or substantial portions of the Software.
      13             :  *
      14             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      15             :  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      16             :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
      17             :  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
      18             :  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
      19             :  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
      20             :  * OTHER DEALINGS IN THE SOFTWARE.
      21             :  *
      22             :  */
      23             : #include "amdgpu.h"
      24             : #include "soc15.h"
      25             : #include "soc15d.h"
      26             : 
      27             : #include "gc/gc_9_4_2_offset.h"
      28             : #include "gc/gc_9_4_2_sh_mask.h"
      29             : #include "gfx_v9_0.h"
      30             : 
      31             : #include "gfx_v9_4_2.h"
      32             : #include "amdgpu_ras.h"
      33             : #include "amdgpu_gfx.h"
      34             : 
      35             : #define SE_ID_MAX 8
      36             : #define CU_ID_MAX 16
      37             : #define SIMD_ID_MAX 4
      38             : #define WAVE_ID_MAX 10
      39             : 
      40             : enum gfx_v9_4_2_utc_type {
      41             :         VML2_MEM,
      42             :         VML2_WALKER_MEM,
      43             :         UTCL2_MEM,
      44             :         ATC_L2_CACHE_2M,
      45             :         ATC_L2_CACHE_32K,
      46             :         ATC_L2_CACHE_4K
      47             : };
      48             : 
      49             : struct gfx_v9_4_2_utc_block {
      50             :         enum gfx_v9_4_2_utc_type type;
      51             :         uint32_t num_banks;
      52             :         uint32_t num_ways;
      53             :         uint32_t num_mem_blocks;
      54             :         struct soc15_reg idx_reg;
      55             :         struct soc15_reg data_reg;
      56             :         uint32_t sec_count_mask;
      57             :         uint32_t sec_count_shift;
      58             :         uint32_t ded_count_mask;
      59             :         uint32_t ded_count_shift;
      60             :         uint32_t clear;
      61             : };
      62             : 
      63             : static const struct soc15_reg_golden golden_settings_gc_9_4_2_alde_die_0[] = {
      64             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_0, 0x3fffffff, 0x141dc920),
      65             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_1, 0x3fffffff, 0x3b458b93),
      66             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_2, 0x3fffffff, 0x1a4f5583),
      67             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_3, 0x3fffffff, 0x317717f6),
      68             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_4, 0x3fffffff, 0x107cc1e6),
      69             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_5, 0x3ff, 0x351),
      70             : };
      71             : 
      72             : static const struct soc15_reg_golden golden_settings_gc_9_4_2_alde_die_1[] = {
      73             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_0, 0x3fffffff, 0x2591aa38),
      74             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_1, 0x3fffffff, 0xac9e88b),
      75             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_2, 0x3fffffff, 0x2bc3369b),
      76             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_3, 0x3fffffff, 0xfb74ee),
      77             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_4, 0x3fffffff, 0x21f0a2fe),
      78             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_5, 0x3ff, 0x49),
      79             : };
      80             : 
      81             : static const struct soc15_reg_golden golden_settings_gc_9_4_2_alde[] = {
      82             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regGB_ADDR_CONFIG, 0xffff77ff, 0x2a114042),
      83             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regTA_CNTL_AUX, 0xfffffeef, 0x10b0000),
      84             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_UTCL1_CNTL1, 0xffffffff, 0x30800400),
      85             :         SOC15_REG_GOLDEN_VALUE(GC, 0, regTCI_CNTL_3, 0xff, 0x20),
      86             : };
      87             : 
      88             : /*
      89             :  * This shader is used to clear VGPRS and LDS, and also write the input
      90             :  * pattern into the write back buffer, which will be used by driver to
      91             :  * check whether all SIMDs have been covered.
      92             : */
      93             : static const u32 vgpr_init_compute_shader_aldebaran[] = {
      94             :         0xb8840904, 0xb8851a04, 0xb8861344, 0xb8831804, 0x9208ff06, 0x00000280,
      95             :         0x9209a805, 0x920a8a04, 0x81080908, 0x81080a08, 0x81080308, 0x8e078208,
      96             :         0x81078407, 0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8a0000, 0xd3d94000,
      97             :         0x18000080, 0xd3d94001, 0x18000080, 0xd3d94002, 0x18000080, 0xd3d94003,
      98             :         0x18000080, 0xd3d94004, 0x18000080, 0xd3d94005, 0x18000080, 0xd3d94006,
      99             :         0x18000080, 0xd3d94007, 0x18000080, 0xd3d94008, 0x18000080, 0xd3d94009,
     100             :         0x18000080, 0xd3d9400a, 0x18000080, 0xd3d9400b, 0x18000080, 0xd3d9400c,
     101             :         0x18000080, 0xd3d9400d, 0x18000080, 0xd3d9400e, 0x18000080, 0xd3d9400f,
     102             :         0x18000080, 0xd3d94010, 0x18000080, 0xd3d94011, 0x18000080, 0xd3d94012,
     103             :         0x18000080, 0xd3d94013, 0x18000080, 0xd3d94014, 0x18000080, 0xd3d94015,
     104             :         0x18000080, 0xd3d94016, 0x18000080, 0xd3d94017, 0x18000080, 0xd3d94018,
     105             :         0x18000080, 0xd3d94019, 0x18000080, 0xd3d9401a, 0x18000080, 0xd3d9401b,
     106             :         0x18000080, 0xd3d9401c, 0x18000080, 0xd3d9401d, 0x18000080, 0xd3d9401e,
     107             :         0x18000080, 0xd3d9401f, 0x18000080, 0xd3d94020, 0x18000080, 0xd3d94021,
     108             :         0x18000080, 0xd3d94022, 0x18000080, 0xd3d94023, 0x18000080, 0xd3d94024,
     109             :         0x18000080, 0xd3d94025, 0x18000080, 0xd3d94026, 0x18000080, 0xd3d94027,
     110             :         0x18000080, 0xd3d94028, 0x18000080, 0xd3d94029, 0x18000080, 0xd3d9402a,
     111             :         0x18000080, 0xd3d9402b, 0x18000080, 0xd3d9402c, 0x18000080, 0xd3d9402d,
     112             :         0x18000080, 0xd3d9402e, 0x18000080, 0xd3d9402f, 0x18000080, 0xd3d94030,
     113             :         0x18000080, 0xd3d94031, 0x18000080, 0xd3d94032, 0x18000080, 0xd3d94033,
     114             :         0x18000080, 0xd3d94034, 0x18000080, 0xd3d94035, 0x18000080, 0xd3d94036,
     115             :         0x18000080, 0xd3d94037, 0x18000080, 0xd3d94038, 0x18000080, 0xd3d94039,
     116             :         0x18000080, 0xd3d9403a, 0x18000080, 0xd3d9403b, 0x18000080, 0xd3d9403c,
     117             :         0x18000080, 0xd3d9403d, 0x18000080, 0xd3d9403e, 0x18000080, 0xd3d9403f,
     118             :         0x18000080, 0xd3d94040, 0x18000080, 0xd3d94041, 0x18000080, 0xd3d94042,
     119             :         0x18000080, 0xd3d94043, 0x18000080, 0xd3d94044, 0x18000080, 0xd3d94045,
     120             :         0x18000080, 0xd3d94046, 0x18000080, 0xd3d94047, 0x18000080, 0xd3d94048,
     121             :         0x18000080, 0xd3d94049, 0x18000080, 0xd3d9404a, 0x18000080, 0xd3d9404b,
     122             :         0x18000080, 0xd3d9404c, 0x18000080, 0xd3d9404d, 0x18000080, 0xd3d9404e,
     123             :         0x18000080, 0xd3d9404f, 0x18000080, 0xd3d94050, 0x18000080, 0xd3d94051,
     124             :         0x18000080, 0xd3d94052, 0x18000080, 0xd3d94053, 0x18000080, 0xd3d94054,
     125             :         0x18000080, 0xd3d94055, 0x18000080, 0xd3d94056, 0x18000080, 0xd3d94057,
     126             :         0x18000080, 0xd3d94058, 0x18000080, 0xd3d94059, 0x18000080, 0xd3d9405a,
     127             :         0x18000080, 0xd3d9405b, 0x18000080, 0xd3d9405c, 0x18000080, 0xd3d9405d,
     128             :         0x18000080, 0xd3d9405e, 0x18000080, 0xd3d9405f, 0x18000080, 0xd3d94060,
     129             :         0x18000080, 0xd3d94061, 0x18000080, 0xd3d94062, 0x18000080, 0xd3d94063,
     130             :         0x18000080, 0xd3d94064, 0x18000080, 0xd3d94065, 0x18000080, 0xd3d94066,
     131             :         0x18000080, 0xd3d94067, 0x18000080, 0xd3d94068, 0x18000080, 0xd3d94069,
     132             :         0x18000080, 0xd3d9406a, 0x18000080, 0xd3d9406b, 0x18000080, 0xd3d9406c,
     133             :         0x18000080, 0xd3d9406d, 0x18000080, 0xd3d9406e, 0x18000080, 0xd3d9406f,
     134             :         0x18000080, 0xd3d94070, 0x18000080, 0xd3d94071, 0x18000080, 0xd3d94072,
     135             :         0x18000080, 0xd3d94073, 0x18000080, 0xd3d94074, 0x18000080, 0xd3d94075,
     136             :         0x18000080, 0xd3d94076, 0x18000080, 0xd3d94077, 0x18000080, 0xd3d94078,
     137             :         0x18000080, 0xd3d94079, 0x18000080, 0xd3d9407a, 0x18000080, 0xd3d9407b,
     138             :         0x18000080, 0xd3d9407c, 0x18000080, 0xd3d9407d, 0x18000080, 0xd3d9407e,
     139             :         0x18000080, 0xd3d9407f, 0x18000080, 0xd3d94080, 0x18000080, 0xd3d94081,
     140             :         0x18000080, 0xd3d94082, 0x18000080, 0xd3d94083, 0x18000080, 0xd3d94084,
     141             :         0x18000080, 0xd3d94085, 0x18000080, 0xd3d94086, 0x18000080, 0xd3d94087,
     142             :         0x18000080, 0xd3d94088, 0x18000080, 0xd3d94089, 0x18000080, 0xd3d9408a,
     143             :         0x18000080, 0xd3d9408b, 0x18000080, 0xd3d9408c, 0x18000080, 0xd3d9408d,
     144             :         0x18000080, 0xd3d9408e, 0x18000080, 0xd3d9408f, 0x18000080, 0xd3d94090,
     145             :         0x18000080, 0xd3d94091, 0x18000080, 0xd3d94092, 0x18000080, 0xd3d94093,
     146             :         0x18000080, 0xd3d94094, 0x18000080, 0xd3d94095, 0x18000080, 0xd3d94096,
     147             :         0x18000080, 0xd3d94097, 0x18000080, 0xd3d94098, 0x18000080, 0xd3d94099,
     148             :         0x18000080, 0xd3d9409a, 0x18000080, 0xd3d9409b, 0x18000080, 0xd3d9409c,
     149             :         0x18000080, 0xd3d9409d, 0x18000080, 0xd3d9409e, 0x18000080, 0xd3d9409f,
     150             :         0x18000080, 0xd3d940a0, 0x18000080, 0xd3d940a1, 0x18000080, 0xd3d940a2,
     151             :         0x18000080, 0xd3d940a3, 0x18000080, 0xd3d940a4, 0x18000080, 0xd3d940a5,
     152             :         0x18000080, 0xd3d940a6, 0x18000080, 0xd3d940a7, 0x18000080, 0xd3d940a8,
     153             :         0x18000080, 0xd3d940a9, 0x18000080, 0xd3d940aa, 0x18000080, 0xd3d940ab,
     154             :         0x18000080, 0xd3d940ac, 0x18000080, 0xd3d940ad, 0x18000080, 0xd3d940ae,
     155             :         0x18000080, 0xd3d940af, 0x18000080, 0xd3d940b0, 0x18000080, 0xd3d940b1,
     156             :         0x18000080, 0xd3d940b2, 0x18000080, 0xd3d940b3, 0x18000080, 0xd3d940b4,
     157             :         0x18000080, 0xd3d940b5, 0x18000080, 0xd3d940b6, 0x18000080, 0xd3d940b7,
     158             :         0x18000080, 0xd3d940b8, 0x18000080, 0xd3d940b9, 0x18000080, 0xd3d940ba,
     159             :         0x18000080, 0xd3d940bb, 0x18000080, 0xd3d940bc, 0x18000080, 0xd3d940bd,
     160             :         0x18000080, 0xd3d940be, 0x18000080, 0xd3d940bf, 0x18000080, 0xd3d940c0,
     161             :         0x18000080, 0xd3d940c1, 0x18000080, 0xd3d940c2, 0x18000080, 0xd3d940c3,
     162             :         0x18000080, 0xd3d940c4, 0x18000080, 0xd3d940c5, 0x18000080, 0xd3d940c6,
     163             :         0x18000080, 0xd3d940c7, 0x18000080, 0xd3d940c8, 0x18000080, 0xd3d940c9,
     164             :         0x18000080, 0xd3d940ca, 0x18000080, 0xd3d940cb, 0x18000080, 0xd3d940cc,
     165             :         0x18000080, 0xd3d940cd, 0x18000080, 0xd3d940ce, 0x18000080, 0xd3d940cf,
     166             :         0x18000080, 0xd3d940d0, 0x18000080, 0xd3d940d1, 0x18000080, 0xd3d940d2,
     167             :         0x18000080, 0xd3d940d3, 0x18000080, 0xd3d940d4, 0x18000080, 0xd3d940d5,
     168             :         0x18000080, 0xd3d940d6, 0x18000080, 0xd3d940d7, 0x18000080, 0xd3d940d8,
     169             :         0x18000080, 0xd3d940d9, 0x18000080, 0xd3d940da, 0x18000080, 0xd3d940db,
     170             :         0x18000080, 0xd3d940dc, 0x18000080, 0xd3d940dd, 0x18000080, 0xd3d940de,
     171             :         0x18000080, 0xd3d940df, 0x18000080, 0xd3d940e0, 0x18000080, 0xd3d940e1,
     172             :         0x18000080, 0xd3d940e2, 0x18000080, 0xd3d940e3, 0x18000080, 0xd3d940e4,
     173             :         0x18000080, 0xd3d940e5, 0x18000080, 0xd3d940e6, 0x18000080, 0xd3d940e7,
     174             :         0x18000080, 0xd3d940e8, 0x18000080, 0xd3d940e9, 0x18000080, 0xd3d940ea,
     175             :         0x18000080, 0xd3d940eb, 0x18000080, 0xd3d940ec, 0x18000080, 0xd3d940ed,
     176             :         0x18000080, 0xd3d940ee, 0x18000080, 0xd3d940ef, 0x18000080, 0xd3d940f0,
     177             :         0x18000080, 0xd3d940f1, 0x18000080, 0xd3d940f2, 0x18000080, 0xd3d940f3,
     178             :         0x18000080, 0xd3d940f4, 0x18000080, 0xd3d940f5, 0x18000080, 0xd3d940f6,
     179             :         0x18000080, 0xd3d940f7, 0x18000080, 0xd3d940f8, 0x18000080, 0xd3d940f9,
     180             :         0x18000080, 0xd3d940fa, 0x18000080, 0xd3d940fb, 0x18000080, 0xd3d940fc,
     181             :         0x18000080, 0xd3d940fd, 0x18000080, 0xd3d940fe, 0x18000080, 0xd3d940ff,
     182             :         0x18000080, 0xb07c0000, 0xbe8a00ff, 0x000000f8, 0xbf11080a, 0x7e000280,
     183             :         0x7e020280, 0x7e040280, 0x7e060280, 0x7e080280, 0x7e0a0280, 0x7e0c0280,
     184             :         0x7e0e0280, 0x808a880a, 0xbe80320a, 0xbf84fff5, 0xbf9c0000, 0xd28c0001,
     185             :         0x0001007f, 0xd28d0001, 0x0002027e, 0x10020288, 0xbe8b0004, 0xb78b4000,
     186             :         0xd1196a01, 0x00001701, 0xbe8a0087, 0xbefc00c1, 0xd89c4000, 0x00020201,
     187             :         0xd89cc080, 0x00040401, 0x320202ff, 0x00000800, 0x808a810a, 0xbf84fff8,
     188             :         0xbf810000,
     189             : };
     190             : 
     191             : const struct soc15_reg_entry vgpr_init_regs_aldebaran[] = {
     192             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
     193             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_X), 0x40 },
     194             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Y), 4 },
     195             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Z), 1 },
     196             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC1), 0xbf },
     197             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC2), 0x400006 },  /* 64KB LDS */
     198             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC3), 0x3F }, /*  63 - accum-offset = 256 */
     199             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE0), 0xffffffff },
     200             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE1), 0xffffffff },
     201             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE2), 0xffffffff },
     202             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE3), 0xffffffff },
     203             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE4), 0xffffffff },
     204             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE5), 0xffffffff },
     205             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE6), 0xffffffff },
     206             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE7), 0xffffffff },
     207             : };
     208             : 
     209             : /*
     210             :  * The below shaders are used to clear SGPRS, and also write the input
     211             :  * pattern into the write back buffer. The first two dispatch should be
     212             :  * scheduled simultaneously which make sure that all SGPRS could be
     213             :  * allocated, so the dispatch 1 need check write back buffer before scheduled,
     214             :  * make sure that waves of dispatch 0 are all dispacthed to all simds
     215             :  * balanced. both dispatch 0 and dispatch 1 should be halted until all waves
     216             :  * are dispatched, and then driver write a pattern to the shared memory to make
     217             :  * all waves continue.
     218             : */
     219             : static const u32 sgpr112_init_compute_shader_aldebaran[] = {
     220             :         0xb8840904, 0xb8851a04, 0xb8861344, 0xb8831804, 0x9208ff06, 0x00000280,
     221             :         0x9209a805, 0x920a8a04, 0x81080908, 0x81080a08, 0x81080308, 0x8e078208,
     222             :         0x81078407, 0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8e003f, 0xc0030200,
     223             :         0x00000000, 0xbf8c0000, 0xbf06ff08, 0xdeadbeaf, 0xbf84fff9, 0x81028102,
     224             :         0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8a0000, 0xbefc0080, 0xbeea0080,
     225             :         0xbeeb0080, 0xbf00f280, 0xbee60080, 0xbee70080, 0xbee80080, 0xbee90080,
     226             :         0xbefe0080, 0xbeff0080, 0xbe880080, 0xbe890080, 0xbe8a0080, 0xbe8b0080,
     227             :         0xbe8c0080, 0xbe8d0080, 0xbe8e0080, 0xbe8f0080, 0xbe900080, 0xbe910080,
     228             :         0xbe920080, 0xbe930080, 0xbe940080, 0xbe950080, 0xbe960080, 0xbe970080,
     229             :         0xbe980080, 0xbe990080, 0xbe9a0080, 0xbe9b0080, 0xbe9c0080, 0xbe9d0080,
     230             :         0xbe9e0080, 0xbe9f0080, 0xbea00080, 0xbea10080, 0xbea20080, 0xbea30080,
     231             :         0xbea40080, 0xbea50080, 0xbea60080, 0xbea70080, 0xbea80080, 0xbea90080,
     232             :         0xbeaa0080, 0xbeab0080, 0xbeac0080, 0xbead0080, 0xbeae0080, 0xbeaf0080,
     233             :         0xbeb00080, 0xbeb10080, 0xbeb20080, 0xbeb30080, 0xbeb40080, 0xbeb50080,
     234             :         0xbeb60080, 0xbeb70080, 0xbeb80080, 0xbeb90080, 0xbeba0080, 0xbebb0080,
     235             :         0xbebc0080, 0xbebd0080, 0xbebe0080, 0xbebf0080, 0xbec00080, 0xbec10080,
     236             :         0xbec20080, 0xbec30080, 0xbec40080, 0xbec50080, 0xbec60080, 0xbec70080,
     237             :         0xbec80080, 0xbec90080, 0xbeca0080, 0xbecb0080, 0xbecc0080, 0xbecd0080,
     238             :         0xbece0080, 0xbecf0080, 0xbed00080, 0xbed10080, 0xbed20080, 0xbed30080,
     239             :         0xbed40080, 0xbed50080, 0xbed60080, 0xbed70080, 0xbed80080, 0xbed90080,
     240             :         0xbeda0080, 0xbedb0080, 0xbedc0080, 0xbedd0080, 0xbede0080, 0xbedf0080,
     241             :         0xbee00080, 0xbee10080, 0xbee20080, 0xbee30080, 0xbee40080, 0xbee50080,
     242             :         0xbf810000
     243             : };
     244             : 
     245             : const struct soc15_reg_entry sgpr112_init_regs_aldebaran[] = {
     246             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
     247             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_X), 0x40 },
     248             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Y), 8 },
     249             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Z), 1 },
     250             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC1), 0x340 },
     251             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC2), 0x6 },
     252             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC3), 0x0 },
     253             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE0), 0xffffffff },
     254             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE1), 0xffffffff },
     255             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE2), 0xffffffff },
     256             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE3), 0xffffffff },
     257             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE4), 0xffffffff },
     258             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE5), 0xffffffff },
     259             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE6), 0xffffffff },
     260             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE7), 0xffffffff },
     261             : };
     262             : 
     263             : static const u32 sgpr96_init_compute_shader_aldebaran[] = {
     264             :         0xb8840904, 0xb8851a04, 0xb8861344, 0xb8831804, 0x9208ff06, 0x00000280,
     265             :         0x9209a805, 0x920a8a04, 0x81080908, 0x81080a08, 0x81080308, 0x8e078208,
     266             :         0x81078407, 0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8e003f, 0xc0030200,
     267             :         0x00000000, 0xbf8c0000, 0xbf06ff08, 0xdeadbeaf, 0xbf84fff9, 0x81028102,
     268             :         0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8a0000, 0xbefc0080, 0xbeea0080,
     269             :         0xbeeb0080, 0xbf00f280, 0xbee60080, 0xbee70080, 0xbee80080, 0xbee90080,
     270             :         0xbefe0080, 0xbeff0080, 0xbe880080, 0xbe890080, 0xbe8a0080, 0xbe8b0080,
     271             :         0xbe8c0080, 0xbe8d0080, 0xbe8e0080, 0xbe8f0080, 0xbe900080, 0xbe910080,
     272             :         0xbe920080, 0xbe930080, 0xbe940080, 0xbe950080, 0xbe960080, 0xbe970080,
     273             :         0xbe980080, 0xbe990080, 0xbe9a0080, 0xbe9b0080, 0xbe9c0080, 0xbe9d0080,
     274             :         0xbe9e0080, 0xbe9f0080, 0xbea00080, 0xbea10080, 0xbea20080, 0xbea30080,
     275             :         0xbea40080, 0xbea50080, 0xbea60080, 0xbea70080, 0xbea80080, 0xbea90080,
     276             :         0xbeaa0080, 0xbeab0080, 0xbeac0080, 0xbead0080, 0xbeae0080, 0xbeaf0080,
     277             :         0xbeb00080, 0xbeb10080, 0xbeb20080, 0xbeb30080, 0xbeb40080, 0xbeb50080,
     278             :         0xbeb60080, 0xbeb70080, 0xbeb80080, 0xbeb90080, 0xbeba0080, 0xbebb0080,
     279             :         0xbebc0080, 0xbebd0080, 0xbebe0080, 0xbebf0080, 0xbec00080, 0xbec10080,
     280             :         0xbec20080, 0xbec30080, 0xbec40080, 0xbec50080, 0xbec60080, 0xbec70080,
     281             :         0xbec80080, 0xbec90080, 0xbeca0080, 0xbecb0080, 0xbecc0080, 0xbecd0080,
     282             :         0xbece0080, 0xbecf0080, 0xbed00080, 0xbed10080, 0xbed20080, 0xbed30080,
     283             :         0xbed40080, 0xbed50080, 0xbed60080, 0xbed70080, 0xbed80080, 0xbed90080,
     284             :         0xbf810000,
     285             : };
     286             : 
     287             : const struct soc15_reg_entry sgpr96_init_regs_aldebaran[] = {
     288             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
     289             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_X), 0x40 },
     290             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Y), 0xc },
     291             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Z), 1 },
     292             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC1), 0x2c0 },
     293             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC2), 0x6 },
     294             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC3), 0x0 },
     295             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE0), 0xffffffff },
     296             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE1), 0xffffffff },
     297             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE2), 0xffffffff },
     298             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE3), 0xffffffff },
     299             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE4), 0xffffffff },
     300             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE5), 0xffffffff },
     301             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE6), 0xffffffff },
     302             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE7), 0xffffffff },
     303             : };
     304             : 
     305             : /*
     306             :  * This shader is used to clear the uninitiated sgprs after the above
     307             :  * two dispatches, because of hardware feature, dispath 0 couldn't clear
     308             :  * top hole sgprs. Therefore need 4 waves per SIMD to cover these sgprs
     309             : */
     310             : static const u32 sgpr64_init_compute_shader_aldebaran[] = {
     311             :         0xb8840904, 0xb8851a04, 0xb8861344, 0xb8831804, 0x9208ff06, 0x00000280,
     312             :         0x9209a805, 0x920a8a04, 0x81080908, 0x81080a08, 0x81080308, 0x8e078208,
     313             :         0x81078407, 0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8e003f, 0xc0030200,
     314             :         0x00000000, 0xbf8c0000, 0xbf06ff08, 0xdeadbeaf, 0xbf84fff9, 0x81028102,
     315             :         0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8a0000, 0xbefc0080, 0xbeea0080,
     316             :         0xbeeb0080, 0xbf00f280, 0xbee60080, 0xbee70080, 0xbee80080, 0xbee90080,
     317             :         0xbefe0080, 0xbeff0080, 0xbe880080, 0xbe890080, 0xbe8a0080, 0xbe8b0080,
     318             :         0xbe8c0080, 0xbe8d0080, 0xbe8e0080, 0xbe8f0080, 0xbe900080, 0xbe910080,
     319             :         0xbe920080, 0xbe930080, 0xbe940080, 0xbe950080, 0xbe960080, 0xbe970080,
     320             :         0xbe980080, 0xbe990080, 0xbe9a0080, 0xbe9b0080, 0xbe9c0080, 0xbe9d0080,
     321             :         0xbe9e0080, 0xbe9f0080, 0xbea00080, 0xbea10080, 0xbea20080, 0xbea30080,
     322             :         0xbea40080, 0xbea50080, 0xbea60080, 0xbea70080, 0xbea80080, 0xbea90080,
     323             :         0xbeaa0080, 0xbeab0080, 0xbeac0080, 0xbead0080, 0xbeae0080, 0xbeaf0080,
     324             :         0xbeb00080, 0xbeb10080, 0xbeb20080, 0xbeb30080, 0xbeb40080, 0xbeb50080,
     325             :         0xbeb60080, 0xbeb70080, 0xbeb80080, 0xbeb90080, 0xbf810000,
     326             : };
     327             : 
     328             : const struct soc15_reg_entry sgpr64_init_regs_aldebaran[] = {
     329             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
     330             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_X), 0x40 },
     331             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Y), 0x10 },
     332             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Z), 1 },
     333             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC1), 0x1c0 },
     334             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC2), 0x6 },
     335             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC3), 0x0 },
     336             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE0), 0xffffffff },
     337             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE1), 0xffffffff },
     338             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE2), 0xffffffff },
     339             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE3), 0xffffffff },
     340             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE4), 0xffffffff },
     341             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE5), 0xffffffff },
     342             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE6), 0xffffffff },
     343             :         { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE7), 0xffffffff },
     344             : };
     345             : 
     346           0 : static int gfx_v9_4_2_run_shader(struct amdgpu_device *adev,
     347             :                                  struct amdgpu_ring *ring,
     348             :                                  struct amdgpu_ib *ib,
     349             :                                  const u32 *shader_ptr, u32 shader_size,
     350             :                                  const struct soc15_reg_entry *init_regs, u32 regs_size,
     351             :                                  u32 compute_dim_x, u64 wb_gpu_addr, u32 pattern,
     352             :                                  struct dma_fence **fence_ptr)
     353             : {
     354             :         int r, i;
     355             :         uint32_t total_size, shader_offset;
     356             :         u64 gpu_addr;
     357             : 
     358           0 :         total_size = (regs_size * 3 + 4 + 5 + 5) * 4;
     359           0 :         total_size = ALIGN(total_size, 256);
     360           0 :         shader_offset = total_size;
     361           0 :         total_size += ALIGN(shader_size, 256);
     362             : 
     363             :         /* allocate an indirect buffer to put the commands in */
     364           0 :         memset(ib, 0, sizeof(*ib));
     365           0 :         r = amdgpu_ib_get(adev, NULL, total_size,
     366             :                                         AMDGPU_IB_POOL_DIRECT, ib);
     367           0 :         if (r) {
     368           0 :                 dev_err(adev->dev, "failed to get ib (%d).\n", r);
     369           0 :                 return r;
     370             :         }
     371             : 
     372             :         /* load the compute shaders */
     373           0 :         for (i = 0; i < shader_size/sizeof(u32); i++)
     374           0 :                 ib->ptr[i + (shader_offset / 4)] = shader_ptr[i];
     375             : 
     376             :         /* init the ib length to 0 */
     377           0 :         ib->length_dw = 0;
     378             : 
     379             :         /* write the register state for the compute dispatch */
     380           0 :         for (i = 0; i < regs_size; i++) {
     381           0 :                 ib->ptr[ib->length_dw++] = PACKET3(PACKET3_SET_SH_REG, 1);
     382           0 :                 ib->ptr[ib->length_dw++] = SOC15_REG_ENTRY_OFFSET(init_regs[i])
     383           0 :                                                                 - PACKET3_SET_SH_REG_START;
     384           0 :                 ib->ptr[ib->length_dw++] = init_regs[i].reg_value;
     385             :         }
     386             : 
     387             :         /* write the shader start address: mmCOMPUTE_PGM_LO, mmCOMPUTE_PGM_HI */
     388           0 :         gpu_addr = (ib->gpu_addr + (u64)shader_offset) >> 8;
     389           0 :         ib->ptr[ib->length_dw++] = PACKET3(PACKET3_SET_SH_REG, 2);
     390           0 :         ib->ptr[ib->length_dw++] = SOC15_REG_OFFSET(GC, 0, regCOMPUTE_PGM_LO)
     391           0 :                                                         - PACKET3_SET_SH_REG_START;
     392           0 :         ib->ptr[ib->length_dw++] = lower_32_bits(gpu_addr);
     393           0 :         ib->ptr[ib->length_dw++] = upper_32_bits(gpu_addr);
     394             : 
     395             :         /* write the wb buffer address */
     396           0 :         ib->ptr[ib->length_dw++] = PACKET3(PACKET3_SET_SH_REG, 3);
     397           0 :         ib->ptr[ib->length_dw++] = SOC15_REG_OFFSET(GC, 0, regCOMPUTE_USER_DATA_0)
     398           0 :                                                         - PACKET3_SET_SH_REG_START;
     399           0 :         ib->ptr[ib->length_dw++] = lower_32_bits(wb_gpu_addr);
     400           0 :         ib->ptr[ib->length_dw++] = upper_32_bits(wb_gpu_addr);
     401           0 :         ib->ptr[ib->length_dw++] = pattern;
     402             : 
     403             :         /* write dispatch packet */
     404           0 :         ib->ptr[ib->length_dw++] = PACKET3(PACKET3_DISPATCH_DIRECT, 3);
     405           0 :         ib->ptr[ib->length_dw++] = compute_dim_x; /* x */
     406           0 :         ib->ptr[ib->length_dw++] = 1; /* y */
     407           0 :         ib->ptr[ib->length_dw++] = 1; /* z */
     408           0 :         ib->ptr[ib->length_dw++] =
     409             :                 REG_SET_FIELD(0, COMPUTE_DISPATCH_INITIATOR, COMPUTE_SHADER_EN, 1);
     410             : 
     411             :         /* shedule the ib on the ring */
     412           0 :         r = amdgpu_ib_schedule(ring, 1, ib, NULL, fence_ptr);
     413           0 :         if (r) {
     414           0 :                 dev_err(adev->dev, "ib submit failed (%d).\n", r);
     415           0 :                 amdgpu_ib_free(adev, ib, NULL);
     416             :         }
     417             :         return r;
     418             : }
     419             : 
     420           0 : static void gfx_v9_4_2_log_wave_assignment(struct amdgpu_device *adev, uint32_t *wb_ptr)
     421             : {
     422             :         uint32_t se, cu, simd, wave;
     423           0 :         uint32_t offset = 0;
     424             :         char *str;
     425             :         int size;
     426             : 
     427           0 :         str = kmalloc(256, GFP_KERNEL);
     428           0 :         if (!str)
     429             :                 return;
     430             : 
     431             :         dev_dbg(adev->dev, "wave assignment:\n");
     432             : 
     433           0 :         for (se = 0; se < adev->gfx.config.max_shader_engines; se++) {
     434           0 :                 for (cu = 0; cu < CU_ID_MAX; cu++) {
     435           0 :                         memset(str, 0, 256);
     436           0 :                         size = sprintf(str, "SE[%02d]CU[%02d]: ", se, cu);
     437           0 :                         for (simd = 0; simd < SIMD_ID_MAX; simd++) {
     438           0 :                                 size += sprintf(str + size, "[");
     439           0 :                                 for (wave = 0; wave < WAVE_ID_MAX; wave++) {
     440           0 :                                         size += sprintf(str + size, "%x", wb_ptr[offset]);
     441           0 :                                         offset++;
     442             :                                 }
     443           0 :                                 size += sprintf(str + size, "]  ");
     444             :                         }
     445             :                         dev_dbg(adev->dev, "%s\n", str);
     446             :                 }
     447             :         }
     448             : 
     449           0 :         kfree(str);
     450             : }
     451             : 
     452           0 : static int gfx_v9_4_2_wait_for_waves_assigned(struct amdgpu_device *adev,
     453             :                                               uint32_t *wb_ptr, uint32_t mask,
     454             :                                               uint32_t pattern, uint32_t num_wave, bool wait)
     455             : {
     456             :         uint32_t se, cu, simd, wave;
     457           0 :         uint32_t loop = 0;
     458             :         uint32_t wave_cnt;
     459             :         uint32_t offset;
     460             : 
     461             :         do {
     462           0 :                 wave_cnt = 0;
     463           0 :                 offset = 0;
     464             : 
     465           0 :                 for (se = 0; se < adev->gfx.config.max_shader_engines; se++)
     466           0 :                         for (cu = 0; cu < CU_ID_MAX; cu++)
     467           0 :                                 for (simd = 0; simd < SIMD_ID_MAX; simd++)
     468           0 :                                         for (wave = 0; wave < WAVE_ID_MAX; wave++) {
     469           0 :                                                 if (((1 << wave) & mask) &&
     470           0 :                                                     (wb_ptr[offset] == pattern))
     471           0 :                                                         wave_cnt++;
     472             : 
     473           0 :                                                 offset++;
     474             :                                         }
     475             : 
     476           0 :                 if (wave_cnt == num_wave)
     477             :                         return 0;
     478             : 
     479           0 :                 mdelay(1);
     480           0 :         } while (++loop < 2000 && wait);
     481             : 
     482           0 :         dev_err(adev->dev, "actual wave num: %d, expected wave num: %d\n",
     483             :                 wave_cnt, num_wave);
     484             : 
     485           0 :         gfx_v9_4_2_log_wave_assignment(adev, wb_ptr);
     486             : 
     487           0 :         return -EBADSLT;
     488             : }
     489             : 
     490           0 : static int gfx_v9_4_2_do_sgprs_init(struct amdgpu_device *adev)
     491             : {
     492             :         int r;
     493           0 :         int wb_size = adev->gfx.config.max_shader_engines *
     494           0 :                          CU_ID_MAX * SIMD_ID_MAX * WAVE_ID_MAX;
     495             :         struct amdgpu_ib wb_ib;
     496             :         struct amdgpu_ib disp_ibs[3];
     497             :         struct dma_fence *fences[3];
     498           0 :         u32 pattern[3] = { 0x1, 0x5, 0xa };
     499             : 
     500             :         /* bail if the compute ring is not ready */
     501           0 :         if (!adev->gfx.compute_ring[0].sched.ready ||
     502           0 :                  !adev->gfx.compute_ring[1].sched.ready)
     503             :                 return 0;
     504             : 
     505             :         /* allocate the write-back buffer from IB */
     506           0 :         memset(&wb_ib, 0, sizeof(wb_ib));
     507           0 :         r = amdgpu_ib_get(adev, NULL, (1 + wb_size) * sizeof(uint32_t),
     508             :                           AMDGPU_IB_POOL_DIRECT, &wb_ib);
     509           0 :         if (r) {
     510           0 :                 dev_err(adev->dev, "failed to get ib (%d) for wb\n", r);
     511           0 :                 return r;
     512             :         }
     513           0 :         memset(wb_ib.ptr, 0, (1 + wb_size) * sizeof(uint32_t));
     514             : 
     515           0 :         r = gfx_v9_4_2_run_shader(adev,
     516             :                         &adev->gfx.compute_ring[0],
     517             :                         &disp_ibs[0],
     518             :                         sgpr112_init_compute_shader_aldebaran,
     519             :                         sizeof(sgpr112_init_compute_shader_aldebaran),
     520             :                         sgpr112_init_regs_aldebaran,
     521             :                         ARRAY_SIZE(sgpr112_init_regs_aldebaran),
     522             :                         adev->gfx.cu_info.number,
     523             :                         wb_ib.gpu_addr, pattern[0], &fences[0]);
     524           0 :         if (r) {
     525           0 :                 dev_err(adev->dev, "failed to clear first 224 sgprs\n");
     526           0 :                 goto pro_end;
     527             :         }
     528             : 
     529           0 :         r = gfx_v9_4_2_wait_for_waves_assigned(adev,
     530           0 :                         &wb_ib.ptr[1], 0b11,
     531             :                         pattern[0],
     532           0 :                         adev->gfx.cu_info.number * SIMD_ID_MAX * 2,
     533             :                         true);
     534           0 :         if (r) {
     535           0 :                 dev_err(adev->dev, "wave coverage failed when clear first 224 sgprs\n");
     536           0 :                 wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
     537           0 :                 goto disp0_failed;
     538             :         }
     539             : 
     540           0 :         r = gfx_v9_4_2_run_shader(adev,
     541             :                         &adev->gfx.compute_ring[1],
     542             :                         &disp_ibs[1],
     543             :                         sgpr96_init_compute_shader_aldebaran,
     544             :                         sizeof(sgpr96_init_compute_shader_aldebaran),
     545             :                         sgpr96_init_regs_aldebaran,
     546             :                         ARRAY_SIZE(sgpr96_init_regs_aldebaran),
     547           0 :                         adev->gfx.cu_info.number * 2,
     548             :                         wb_ib.gpu_addr, pattern[1], &fences[1]);
     549           0 :         if (r) {
     550           0 :                 dev_err(adev->dev, "failed to clear next 576 sgprs\n");
     551           0 :                 goto disp0_failed;
     552             :         }
     553             : 
     554           0 :         r = gfx_v9_4_2_wait_for_waves_assigned(adev,
     555           0 :                         &wb_ib.ptr[1], 0b11111100,
     556           0 :                         pattern[1], adev->gfx.cu_info.number * SIMD_ID_MAX * 6,
     557             :                         true);
     558           0 :         if (r) {
     559           0 :                 dev_err(adev->dev, "wave coverage failed when clear first 576 sgprs\n");
     560           0 :                 wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
     561           0 :                 goto disp1_failed;
     562             :         }
     563             : 
     564           0 :         wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
     565             : 
     566             :         /* wait for the GPU to finish processing the IB */
     567           0 :         r = dma_fence_wait(fences[0], false);
     568           0 :         if (r) {
     569           0 :                 dev_err(adev->dev, "timeout to clear first 224 sgprs\n");
     570           0 :                 goto disp1_failed;
     571             :         }
     572             : 
     573           0 :         r = dma_fence_wait(fences[1], false);
     574           0 :         if (r) {
     575           0 :                 dev_err(adev->dev, "timeout to clear first 576 sgprs\n");
     576           0 :                 goto disp1_failed;
     577             :         }
     578             : 
     579           0 :         memset(wb_ib.ptr, 0, (1 + wb_size) * sizeof(uint32_t));
     580           0 :         r = gfx_v9_4_2_run_shader(adev,
     581             :                         &adev->gfx.compute_ring[0],
     582             :                         &disp_ibs[2],
     583             :                         sgpr64_init_compute_shader_aldebaran,
     584             :                         sizeof(sgpr64_init_compute_shader_aldebaran),
     585             :                         sgpr64_init_regs_aldebaran,
     586             :                         ARRAY_SIZE(sgpr64_init_regs_aldebaran),
     587             :                         adev->gfx.cu_info.number,
     588             :                         wb_ib.gpu_addr, pattern[2], &fences[2]);
     589           0 :         if (r) {
     590           0 :                 dev_err(adev->dev, "failed to clear first 256 sgprs\n");
     591           0 :                 goto disp1_failed;
     592             :         }
     593             : 
     594           0 :         r = gfx_v9_4_2_wait_for_waves_assigned(adev,
     595           0 :                         &wb_ib.ptr[1], 0b1111,
     596             :                         pattern[2],
     597           0 :                         adev->gfx.cu_info.number * SIMD_ID_MAX * 4,
     598             :                         true);
     599           0 :         if (r) {
     600           0 :                 dev_err(adev->dev, "wave coverage failed when clear first 256 sgprs\n");
     601           0 :                 wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
     602           0 :                 goto disp2_failed;
     603             :         }
     604             : 
     605           0 :         wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
     606             : 
     607           0 :         r = dma_fence_wait(fences[2], false);
     608           0 :         if (r) {
     609           0 :                 dev_err(adev->dev, "timeout to clear first 256 sgprs\n");
     610           0 :                 goto disp2_failed;
     611             :         }
     612             : 
     613             : disp2_failed:
     614           0 :         amdgpu_ib_free(adev, &disp_ibs[2], NULL);
     615           0 :         dma_fence_put(fences[2]);
     616             : disp1_failed:
     617           0 :         amdgpu_ib_free(adev, &disp_ibs[1], NULL);
     618           0 :         dma_fence_put(fences[1]);
     619             : disp0_failed:
     620           0 :         amdgpu_ib_free(adev, &disp_ibs[0], NULL);
     621           0 :         dma_fence_put(fences[0]);
     622             : pro_end:
     623           0 :         amdgpu_ib_free(adev, &wb_ib, NULL);
     624             : 
     625           0 :         if (r)
     626           0 :                 dev_info(adev->dev, "Init SGPRS Failed\n");
     627             :         else
     628           0 :                 dev_info(adev->dev, "Init SGPRS Successfully\n");
     629             : 
     630             :         return r;
     631             : }
     632             : 
     633           0 : static int gfx_v9_4_2_do_vgprs_init(struct amdgpu_device *adev)
     634             : {
     635             :         int r;
     636             :         /* CU_ID: 0~15, SIMD_ID: 0~3, WAVE_ID: 0 ~ 9 */
     637           0 :         int wb_size = adev->gfx.config.max_shader_engines *
     638           0 :                          CU_ID_MAX * SIMD_ID_MAX * WAVE_ID_MAX;
     639             :         struct amdgpu_ib wb_ib;
     640             :         struct amdgpu_ib disp_ib;
     641             :         struct dma_fence *fence;
     642           0 :         u32 pattern = 0xa;
     643             : 
     644             :         /* bail if the compute ring is not ready */
     645           0 :         if (!adev->gfx.compute_ring[0].sched.ready)
     646             :                 return 0;
     647             : 
     648             :         /* allocate the write-back buffer from IB */
     649           0 :         memset(&wb_ib, 0, sizeof(wb_ib));
     650           0 :         r = amdgpu_ib_get(adev, NULL, (1 + wb_size) * sizeof(uint32_t),
     651             :                           AMDGPU_IB_POOL_DIRECT, &wb_ib);
     652           0 :         if (r) {
     653           0 :                 dev_err(adev->dev, "failed to get ib (%d) for wb.\n", r);
     654           0 :                 return r;
     655             :         }
     656           0 :         memset(wb_ib.ptr, 0, (1 + wb_size) * sizeof(uint32_t));
     657             : 
     658           0 :         r = gfx_v9_4_2_run_shader(adev,
     659             :                         &adev->gfx.compute_ring[0],
     660             :                         &disp_ib,
     661             :                         vgpr_init_compute_shader_aldebaran,
     662             :                         sizeof(vgpr_init_compute_shader_aldebaran),
     663             :                         vgpr_init_regs_aldebaran,
     664             :                         ARRAY_SIZE(vgpr_init_regs_aldebaran),
     665             :                         adev->gfx.cu_info.number,
     666             :                         wb_ib.gpu_addr, pattern, &fence);
     667           0 :         if (r) {
     668           0 :                 dev_err(adev->dev, "failed to clear vgprs\n");
     669           0 :                 goto pro_end;
     670             :         }
     671             : 
     672             :         /* wait for the GPU to finish processing the IB */
     673           0 :         r = dma_fence_wait(fence, false);
     674           0 :         if (r) {
     675           0 :                 dev_err(adev->dev, "timeout to clear vgprs\n");
     676           0 :                 goto disp_failed;
     677             :         }
     678             : 
     679           0 :         r = gfx_v9_4_2_wait_for_waves_assigned(adev,
     680           0 :                         &wb_ib.ptr[1], 0b1,
     681             :                         pattern,
     682           0 :                         adev->gfx.cu_info.number * SIMD_ID_MAX,
     683             :                         false);
     684           0 :         if (r) {
     685           0 :                 dev_err(adev->dev, "failed to cover all simds when clearing vgprs\n");
     686           0 :                 goto disp_failed;
     687             :         }
     688             : 
     689             : disp_failed:
     690           0 :         amdgpu_ib_free(adev, &disp_ib, NULL);
     691           0 :         dma_fence_put(fence);
     692             : pro_end:
     693           0 :         amdgpu_ib_free(adev, &wb_ib, NULL);
     694             : 
     695           0 :         if (r)
     696           0 :                 dev_info(adev->dev, "Init VGPRS Failed\n");
     697             :         else
     698           0 :                 dev_info(adev->dev, "Init VGPRS Successfully\n");
     699             : 
     700             :         return r;
     701             : }
     702             : 
     703           0 : int gfx_v9_4_2_do_edc_gpr_workarounds(struct amdgpu_device *adev)
     704             : {
     705             :         /* only support when RAS is enabled */
     706           0 :         if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
     707             :                 return 0;
     708             : 
     709             :         /* Workaround for ALDEBARAN, skip GPRs init in GPU reset.
     710             :            Will remove it once GPRs init algorithm works for all CU settings. */
     711           0 :         if (amdgpu_in_reset(adev))
     712             :                 return 0;
     713             : 
     714           0 :         gfx_v9_4_2_do_sgprs_init(adev);
     715             : 
     716           0 :         gfx_v9_4_2_do_vgprs_init(adev);
     717             : 
     718           0 :         return 0;
     719             : }
     720             : 
     721             : static void gfx_v9_4_2_query_sq_timeout_status(struct amdgpu_device *adev);
     722             : static void gfx_v9_4_2_reset_sq_timeout_status(struct amdgpu_device *adev);
     723             : 
     724           0 : void gfx_v9_4_2_init_golden_registers(struct amdgpu_device *adev,
     725             :                                       uint32_t die_id)
     726             : {
     727           0 :         soc15_program_register_sequence(adev,
     728             :                                         golden_settings_gc_9_4_2_alde,
     729             :                                         ARRAY_SIZE(golden_settings_gc_9_4_2_alde));
     730             : 
     731             :         /* apply golden settings per die */
     732           0 :         switch (die_id) {
     733             :         case 0:
     734           0 :                 soc15_program_register_sequence(adev,
     735             :                                 golden_settings_gc_9_4_2_alde_die_0,
     736             :                                 ARRAY_SIZE(golden_settings_gc_9_4_2_alde_die_0));
     737           0 :                 break;
     738             :         case 1:
     739           0 :                 soc15_program_register_sequence(adev,
     740             :                                 golden_settings_gc_9_4_2_alde_die_1,
     741             :                                 ARRAY_SIZE(golden_settings_gc_9_4_2_alde_die_1));
     742           0 :                 break;
     743             :         default:
     744           0 :                 dev_warn(adev->dev,
     745             :                          "invalid die id %d, ignore channel fabricid remap settings\n",
     746             :                          die_id);
     747           0 :                 break;
     748             :         }
     749             : 
     750           0 :         return;
     751             : }
     752             : 
     753           0 : void gfx_v9_4_2_debug_trap_config_init(struct amdgpu_device *adev,
     754             :                                 uint32_t first_vmid,
     755             :                                 uint32_t last_vmid)
     756             : {
     757             :         uint32_t data;
     758             :         int i;
     759             : 
     760           0 :         mutex_lock(&adev->srbm_mutex);
     761             : 
     762           0 :         for (i = first_vmid; i < last_vmid; i++) {
     763           0 :                 data = 0;
     764           0 :                 soc15_grbm_select(adev, 0, 0, 0, i);
     765           0 :                 data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, TRAP_EN, 1);
     766           0 :                 data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_EN, 0);
     767           0 :                 data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_REPLACE,
     768             :                                         0);
     769           0 :                 WREG32(SOC15_REG_OFFSET(GC, 0, regSPI_GDBG_PER_VMID_CNTL), data);
     770             :         }
     771             : 
     772           0 :         soc15_grbm_select(adev, 0, 0, 0, 0);
     773           0 :         mutex_unlock(&adev->srbm_mutex);
     774           0 : }
     775             : 
     776           0 : void gfx_v9_4_2_set_power_brake_sequence(struct amdgpu_device *adev)
     777             : {
     778             :         u32 tmp;
     779             : 
     780           0 :         gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
     781             : 
     782           0 :         tmp = 0;
     783           0 :         tmp = REG_SET_FIELD(tmp, GC_THROTTLE_CTRL, PATTERN_MODE, 1);
     784           0 :         WREG32_SOC15(GC, 0, regGC_THROTTLE_CTRL, tmp);
     785             : 
     786           0 :         tmp = 0;
     787           0 :         tmp = REG_SET_FIELD(tmp, GC_THROTTLE_CTRL1, PWRBRK_STALL_EN, 1);
     788           0 :         WREG32_SOC15(GC, 0, regGC_THROTTLE_CTRL1, tmp);
     789             : 
     790           0 :         WREG32_SOC15(GC, 0, regGC_CAC_IND_INDEX, ixPWRBRK_STALL_PATTERN_CTRL);
     791           0 :         tmp = 0;
     792           0 :         tmp = REG_SET_FIELD(tmp, PWRBRK_STALL_PATTERN_CTRL, PWRBRK_END_STEP, 0x12);
     793           0 :         WREG32_SOC15(GC, 0, regGC_CAC_IND_DATA, tmp);
     794           0 : }
     795             : 
     796             : static const struct soc15_reg_entry gfx_v9_4_2_edc_counter_regs[] = {
     797             :         /* CPF */
     798             :         { SOC15_REG_ENTRY(GC, 0, regCPF_EDC_ROQ_CNT), 0, 1, 1 },
     799             :         { SOC15_REG_ENTRY(GC, 0, regCPF_EDC_TAG_CNT), 0, 1, 1 },
     800             :         /* CPC */
     801             :         { SOC15_REG_ENTRY(GC, 0, regCPC_EDC_SCRATCH_CNT), 0, 1, 1 },
     802             :         { SOC15_REG_ENTRY(GC, 0, regCPC_EDC_UCODE_CNT), 0, 1, 1 },
     803             :         { SOC15_REG_ENTRY(GC, 0, regDC_EDC_STATE_CNT), 0, 1, 1 },
     804             :         { SOC15_REG_ENTRY(GC, 0, regDC_EDC_CSINVOC_CNT), 0, 1, 1 },
     805             :         { SOC15_REG_ENTRY(GC, 0, regDC_EDC_RESTORE_CNT), 0, 1, 1 },
     806             :         /* GDS */
     807             :         { SOC15_REG_ENTRY(GC, 0, regGDS_EDC_CNT), 0, 1, 1 },
     808             :         { SOC15_REG_ENTRY(GC, 0, regGDS_EDC_GRBM_CNT), 0, 1, 1 },
     809             :         { SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 1, 1 },
     810             :         { SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT), 0, 1, 1 },
     811             :         { SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT), 0, 1, 1 },
     812             :         /* RLC */
     813             :         { SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT), 0, 1, 1 },
     814             :         { SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2), 0, 1, 1 },
     815             :         /* SPI */
     816             :         { SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT), 0, 8, 1 },
     817             :         /* SQC */
     818             :         { SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT), 0, 8, 7 },
     819             :         { SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2), 0, 8, 7 },
     820             :         { SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3), 0, 8, 7 },
     821             :         { SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3), 0, 8, 7 },
     822             :         /* SQ */
     823             :         { SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT), 0, 8, 14 },
     824             :         /* TCP */
     825             :         { SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW), 0, 8, 14 },
     826             :         /* TCI */
     827             :         { SOC15_REG_ENTRY(GC, 0, regTCI_EDC_CNT), 0, 1, 69 },
     828             :         /* TCC */
     829             :         { SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT), 0, 1, 16 },
     830             :         { SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2), 0, 1, 16 },
     831             :         /* TCA */
     832             :         { SOC15_REG_ENTRY(GC, 0, regTCA_EDC_CNT), 0, 1, 2 },
     833             :         /* TCX */
     834             :         { SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT), 0, 1, 2 },
     835             :         { SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2), 0, 1, 2 },
     836             :         /* TD */
     837             :         { SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT), 0, 8, 14 },
     838             :         /* TA */
     839             :         { SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT), 0, 8, 14 },
     840             :         /* GCEA */
     841             :         { SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT), 0, 1, 16 },
     842             :         { SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2), 0, 1, 16 },
     843             :         { SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 1, 16 },
     844             : };
     845             : 
     846           0 : static void gfx_v9_4_2_select_se_sh(struct amdgpu_device *adev, u32 se_num,
     847             :                                   u32 sh_num, u32 instance)
     848             : {
     849             :         u32 data;
     850             : 
     851           0 :         if (instance == 0xffffffff)
     852             :                 data = REG_SET_FIELD(0, GRBM_GFX_INDEX,
     853             :                                      INSTANCE_BROADCAST_WRITES, 1);
     854             :         else
     855           0 :                 data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_INDEX,
     856             :                                      instance);
     857             : 
     858           0 :         if (se_num == 0xffffffff)
     859           0 :                 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_BROADCAST_WRITES,
     860             :                                      1);
     861             :         else
     862           0 :                 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num);
     863             : 
     864           0 :         if (sh_num == 0xffffffff)
     865           0 :                 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_BROADCAST_WRITES,
     866             :                                      1);
     867             :         else
     868           0 :                 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num);
     869             : 
     870           0 :         WREG32_SOC15_RLC_SHADOW_EX(reg, GC, 0, regGRBM_GFX_INDEX, data);
     871           0 : }
     872             : 
     873             : static const struct soc15_ras_field_entry gfx_v9_4_2_ras_fields[] = {
     874             :         /* CPF */
     875             :         { "CPF_ROQ_ME2", SOC15_REG_ENTRY(GC, 0, regCPF_EDC_ROQ_CNT),
     876             :           SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, SEC_COUNT_ME2),
     877             :           SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, DED_COUNT_ME2) },
     878             :         { "CPF_ROQ_ME1", SOC15_REG_ENTRY(GC, 0, regCPF_EDC_ROQ_CNT),
     879             :           SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, SEC_COUNT_ME1),
     880             :           SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, DED_COUNT_ME1) },
     881             :         { "CPF_TCIU_TAG", SOC15_REG_ENTRY(GC, 0, regCPF_EDC_TAG_CNT),
     882             :           SOC15_REG_FIELD(CPF_EDC_TAG_CNT, SEC_COUNT),
     883             :           SOC15_REG_FIELD(CPF_EDC_TAG_CNT, DED_COUNT) },
     884             : 
     885             :         /* CPC */
     886             :         { "CPC_SCRATCH", SOC15_REG_ENTRY(GC, 0, regCPC_EDC_SCRATCH_CNT),
     887             :           SOC15_REG_FIELD(CPC_EDC_SCRATCH_CNT, SEC_COUNT),
     888             :           SOC15_REG_FIELD(CPC_EDC_SCRATCH_CNT, DED_COUNT) },
     889             :         { "CPC_UCODE", SOC15_REG_ENTRY(GC, 0, regCPC_EDC_UCODE_CNT),
     890             :           SOC15_REG_FIELD(CPC_EDC_UCODE_CNT, SEC_COUNT),
     891             :           SOC15_REG_FIELD(CPC_EDC_UCODE_CNT, DED_COUNT) },
     892             :         { "CPC_DC_STATE_RAM_ME1", SOC15_REG_ENTRY(GC, 0, regDC_EDC_STATE_CNT),
     893             :           SOC15_REG_FIELD(DC_EDC_STATE_CNT, SEC_COUNT_ME1),
     894             :           SOC15_REG_FIELD(DC_EDC_STATE_CNT, DED_COUNT_ME1) },
     895             :         { "CPC_DC_CSINVOC_RAM_ME1",
     896             :           SOC15_REG_ENTRY(GC, 0, regDC_EDC_CSINVOC_CNT),
     897             :           SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, SEC_COUNT_ME1),
     898             :           SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, DED_COUNT_ME1) },
     899             :         { "CPC_DC_RESTORE_RAM_ME1",
     900             :           SOC15_REG_ENTRY(GC, 0, regDC_EDC_RESTORE_CNT),
     901             :           SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, SEC_COUNT_ME1),
     902             :           SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, DED_COUNT_ME1) },
     903             :         { "CPC_DC_CSINVOC_RAM1_ME1",
     904             :           SOC15_REG_ENTRY(GC, 0, regDC_EDC_CSINVOC_CNT),
     905             :           SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, SEC_COUNT1_ME1),
     906             :           SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, DED_COUNT1_ME1) },
     907             :         { "CPC_DC_RESTORE_RAM1_ME1",
     908             :           SOC15_REG_ENTRY(GC, 0, regDC_EDC_RESTORE_CNT),
     909             :           SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, SEC_COUNT1_ME1),
     910             :           SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, DED_COUNT1_ME1) },
     911             : 
     912             :         /* GDS */
     913             :         { "GDS_GRBM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_GRBM_CNT),
     914             :           SOC15_REG_FIELD(GDS_EDC_GRBM_CNT, SEC),
     915             :           SOC15_REG_FIELD(GDS_EDC_GRBM_CNT, DED) },
     916             :         { "GDS_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_CNT),
     917             :           SOC15_REG_FIELD(GDS_EDC_CNT, GDS_MEM_SEC),
     918             :           SOC15_REG_FIELD(GDS_EDC_CNT, GDS_MEM_DED) },
     919             :         { "GDS_PHY_CMD_RAM_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT),
     920             :           SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_CMD_RAM_MEM_SEC),
     921             :           SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_CMD_RAM_MEM_DED) },
     922             :         { "GDS_PHY_DATA_RAM_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT),
     923             :           SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_DATA_RAM_MEM_SEC),
     924             :           SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_DATA_RAM_MEM_DED) },
     925             :         { "GDS_ME0_CS_PIPE_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT),
     926             :           SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, ME0_CS_PIPE_MEM_SEC),
     927             :           SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, ME0_CS_PIPE_MEM_DED) },
     928             :         { "GDS_ME1_PIPE0_PIPE_MEM",
     929             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
     930             :           SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE0_PIPE_MEM_SEC),
     931             :           SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE0_PIPE_MEM_DED) },
     932             :         { "GDS_ME1_PIPE1_PIPE_MEM",
     933             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
     934             :           SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE1_PIPE_MEM_SEC),
     935             :           SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE1_PIPE_MEM_DED) },
     936             :         { "GDS_ME1_PIPE2_PIPE_MEM",
     937             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
     938             :           SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE2_PIPE_MEM_SEC),
     939             :           SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE2_PIPE_MEM_DED) },
     940             :         { "GDS_ME1_PIPE3_PIPE_MEM",
     941             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
     942             :           SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE3_PIPE_MEM_SEC),
     943             :           SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE3_PIPE_MEM_DED) },
     944             :         { "GDS_ME0_GFXHP3D_PIX_DED",
     945             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
     946             :           SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_GFXHP3D_PIX_DED) },
     947             :         { "GDS_ME0_GFXHP3D_VTX_DED",
     948             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
     949             :           SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_GFXHP3D_VTX_DED) },
     950             :         { "GDS_ME0_CS_DED",
     951             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
     952             :           SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_CS_DED) },
     953             :         { "GDS_ME0_GFXHP3D_GS_DED",
     954             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
     955             :           SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_GFXHP3D_GS_DED) },
     956             :         { "GDS_ME1_PIPE0_DED",
     957             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
     958             :           SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE0_DED) },
     959             :         { "GDS_ME1_PIPE1_DED",
     960             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
     961             :           SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE1_DED) },
     962             :         { "GDS_ME1_PIPE2_DED",
     963             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
     964             :           SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE2_DED) },
     965             :         { "GDS_ME1_PIPE3_DED",
     966             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
     967             :           SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE3_DED) },
     968             :         { "GDS_ME2_PIPE0_DED",
     969             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
     970             :           SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE0_DED) },
     971             :         { "GDS_ME2_PIPE1_DED",
     972             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
     973             :           SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE1_DED) },
     974             :         { "GDS_ME2_PIPE2_DED",
     975             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
     976             :           SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE2_DED) },
     977             :         { "GDS_ME2_PIPE3_DED",
     978             :           SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
     979             :           SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE3_DED) },
     980             : 
     981             :         /* RLC */
     982             :         { "RLCG_INSTR_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
     983             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_INSTR_RAM_SEC_COUNT),
     984             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_INSTR_RAM_DED_COUNT) },
     985             :         { "RLCG_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
     986             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_SCRATCH_RAM_SEC_COUNT),
     987             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_SCRATCH_RAM_DED_COUNT) },
     988             :         { "RLCV_INSTR_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
     989             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_INSTR_RAM_SEC_COUNT),
     990             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_INSTR_RAM_DED_COUNT) },
     991             :         { "RLCV_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
     992             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_SCRATCH_RAM_SEC_COUNT),
     993             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_SCRATCH_RAM_DED_COUNT) },
     994             :         { "RLC_TCTAG_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
     995             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLC_TCTAG_RAM_SEC_COUNT),
     996             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLC_TCTAG_RAM_DED_COUNT) },
     997             :         { "RLC_SPM_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
     998             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SPM_SCRATCH_RAM_SEC_COUNT),
     999             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SPM_SCRATCH_RAM_DED_COUNT) },
    1000             :         { "RLC_SRM_DATA_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
    1001             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_DATA_RAM_SEC_COUNT),
    1002             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_DATA_RAM_DED_COUNT) },
    1003             :         { "RLC_SRM_ADDR_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
    1004             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_ADDR_RAM_SEC_COUNT),
    1005             :           SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_ADDR_RAM_DED_COUNT) },
    1006             :         { "RLC_SPM_SE0_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
    1007             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE0_SCRATCH_RAM_SEC_COUNT),
    1008             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE0_SCRATCH_RAM_DED_COUNT) },
    1009             :         { "RLC_SPM_SE1_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
    1010             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE1_SCRATCH_RAM_SEC_COUNT),
    1011             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE1_SCRATCH_RAM_DED_COUNT) },
    1012             :         { "RLC_SPM_SE2_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
    1013             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE2_SCRATCH_RAM_SEC_COUNT),
    1014             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE2_SCRATCH_RAM_DED_COUNT) },
    1015             :         { "RLC_SPM_SE3_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
    1016             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE3_SCRATCH_RAM_SEC_COUNT),
    1017             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE3_SCRATCH_RAM_DED_COUNT) },
    1018             :         { "RLC_SPM_SE4_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
    1019             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE4_SCRATCH_RAM_SEC_COUNT),
    1020             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE4_SCRATCH_RAM_DED_COUNT) },
    1021             :         { "RLC_SPM_SE5_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
    1022             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE5_SCRATCH_RAM_SEC_COUNT),
    1023             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE5_SCRATCH_RAM_DED_COUNT) },
    1024             :         { "RLC_SPM_SE6_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
    1025             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE6_SCRATCH_RAM_SEC_COUNT),
    1026             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE6_SCRATCH_RAM_DED_COUNT) },
    1027             :         { "RLC_SPM_SE7_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
    1028             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE7_SCRATCH_RAM_SEC_COUNT),
    1029             :           SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE7_SCRATCH_RAM_DED_COUNT) },
    1030             : 
    1031             :         /* SPI */
    1032             :         { "SPI_SR_MEM", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
    1033             :           SOC15_REG_FIELD(SPI_EDC_CNT, SPI_SR_MEM_SEC_COUNT),
    1034             :           SOC15_REG_FIELD(SPI_EDC_CNT, SPI_SR_MEM_DED_COUNT) },
    1035             :         { "SPI_GDS_EXPREQ", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
    1036             :           SOC15_REG_FIELD(SPI_EDC_CNT, SPI_GDS_EXPREQ_SEC_COUNT),
    1037             :           SOC15_REG_FIELD(SPI_EDC_CNT, SPI_GDS_EXPREQ_DED_COUNT) },
    1038             :         { "SPI_WB_GRANT_30", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
    1039             :           SOC15_REG_FIELD(SPI_EDC_CNT, SPI_WB_GRANT_30_SEC_COUNT),
    1040             :           SOC15_REG_FIELD(SPI_EDC_CNT, SPI_WB_GRANT_30_DED_COUNT) },
    1041             :         { "SPI_LIFE_CNT", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
    1042             :           SOC15_REG_FIELD(SPI_EDC_CNT, SPI_LIFE_CNT_SEC_COUNT),
    1043             :           SOC15_REG_FIELD(SPI_EDC_CNT, SPI_LIFE_CNT_DED_COUNT) },
    1044             : 
    1045             :         /* SQC - regSQC_EDC_CNT */
    1046             :         { "SQC_DATA_CU0_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
    1047             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_WRITE_DATA_BUF_SEC_COUNT),
    1048             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_WRITE_DATA_BUF_DED_COUNT) },
    1049             :         { "SQC_DATA_CU0_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
    1050             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_UTCL1_LFIFO_SEC_COUNT),
    1051             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_UTCL1_LFIFO_DED_COUNT) },
    1052             :         { "SQC_DATA_CU1_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
    1053             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_WRITE_DATA_BUF_SEC_COUNT),
    1054             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_WRITE_DATA_BUF_DED_COUNT) },
    1055             :         { "SQC_DATA_CU1_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
    1056             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_UTCL1_LFIFO_SEC_COUNT),
    1057             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_UTCL1_LFIFO_DED_COUNT) },
    1058             :         { "SQC_DATA_CU2_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
    1059             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_WRITE_DATA_BUF_SEC_COUNT),
    1060             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_WRITE_DATA_BUF_DED_COUNT) },
    1061             :         { "SQC_DATA_CU2_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
    1062             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_UTCL1_LFIFO_SEC_COUNT),
    1063             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_UTCL1_LFIFO_DED_COUNT) },
    1064             :         { "SQC_DATA_CU3_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
    1065             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_WRITE_DATA_BUF_SEC_COUNT),
    1066             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_WRITE_DATA_BUF_DED_COUNT) },
    1067             :         { "SQC_DATA_CU3_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
    1068             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_UTCL1_LFIFO_SEC_COUNT),
    1069             :           SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_UTCL1_LFIFO_DED_COUNT) },
    1070             : 
    1071             :         /* SQC - regSQC_EDC_CNT2 */
    1072             :         { "SQC_INST_BANKA_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
    1073             :           SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_TAG_RAM_SEC_COUNT),
    1074             :           SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_TAG_RAM_DED_COUNT) },
    1075             :         { "SQC_INST_BANKA_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
    1076             :           SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_BANK_RAM_SEC_COUNT),
    1077             :           SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_BANK_RAM_DED_COUNT) },
    1078             :         { "SQC_DATA_BANKA_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
    1079             :           SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_TAG_RAM_SEC_COUNT),
    1080             :           SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_TAG_RAM_DED_COUNT) },
    1081             :         { "SQC_DATA_BANKA_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
    1082             :           SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_BANK_RAM_SEC_COUNT),
    1083             :           SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_BANK_RAM_DED_COUNT) },
    1084             :         { "SQC_INST_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
    1085             :           SOC15_REG_FIELD(SQC_EDC_CNT2, INST_UTCL1_LFIFO_SEC_COUNT),
    1086             :           SOC15_REG_FIELD(SQC_EDC_CNT2, INST_UTCL1_LFIFO_DED_COUNT) },
    1087             :         { "SQC_DATA_BANKA_DIRTY_BIT_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
    1088             :           SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_DIRTY_BIT_RAM_SEC_COUNT),
    1089             :           SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_DIRTY_BIT_RAM_DED_COUNT) },
    1090             : 
    1091             :         /* SQC - regSQC_EDC_CNT3 */
    1092             :         { "SQC_INST_BANKB_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
    1093             :           SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_TAG_RAM_SEC_COUNT),
    1094             :           SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_TAG_RAM_DED_COUNT) },
    1095             :         { "SQC_INST_BANKB_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
    1096             :           SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_BANK_RAM_SEC_COUNT),
    1097             :           SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_BANK_RAM_DED_COUNT) },
    1098             :         { "SQC_DATA_BANKB_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
    1099             :           SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_TAG_RAM_SEC_COUNT),
    1100             :           SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_TAG_RAM_DED_COUNT) },
    1101             :         { "SQC_DATA_BANKB_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
    1102             :           SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_BANK_RAM_SEC_COUNT),
    1103             :           SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_BANK_RAM_DED_COUNT) },
    1104             :         { "SQC_DATA_BANKB_DIRTY_BIT_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
    1105             :           SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_DIRTY_BIT_RAM_SEC_COUNT),
    1106             :           SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_DIRTY_BIT_RAM_DED_COUNT) },
    1107             : 
    1108             :         /* SQC - regSQC_EDC_PARITY_CNT3 */
    1109             :         { "SQC_INST_BANKA_UTCL1_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
    1110             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_UTCL1_MISS_FIFO_SEC_COUNT),
    1111             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_UTCL1_MISS_FIFO_DED_COUNT) },
    1112             :         { "SQC_INST_BANKA_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
    1113             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_MISS_FIFO_SEC_COUNT),
    1114             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_MISS_FIFO_DED_COUNT) },
    1115             :         { "SQC_DATA_BANKA_HIT_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
    1116             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_HIT_FIFO_SEC_COUNT),
    1117             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_HIT_FIFO_DED_COUNT) },
    1118             :         { "SQC_DATA_BANKA_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
    1119             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_MISS_FIFO_SEC_COUNT),
    1120             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_MISS_FIFO_DED_COUNT) },
    1121             :         { "SQC_INST_BANKB_UTCL1_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
    1122             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_UTCL1_MISS_FIFO_SEC_COUNT),
    1123             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_UTCL1_MISS_FIFO_DED_COUNT) },
    1124             :         { "SQC_INST_BANKB_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
    1125             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_MISS_FIFO_SEC_COUNT),
    1126             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_MISS_FIFO_DED_COUNT) },
    1127             :         { "SQC_DATA_BANKB_HIT_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
    1128             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_HIT_FIFO_SEC_COUNT),
    1129             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_HIT_FIFO_DED_COUNT) },
    1130             :         { "SQC_DATA_BANKB_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
    1131             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_MISS_FIFO_SEC_COUNT),
    1132             :           SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_MISS_FIFO_DED_COUNT) },
    1133             : 
    1134             :         /* SQ */
    1135             :         { "SQ_LDS_D", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
    1136             :           SOC15_REG_FIELD(SQ_EDC_CNT, LDS_D_SEC_COUNT),
    1137             :           SOC15_REG_FIELD(SQ_EDC_CNT, LDS_D_DED_COUNT) },
    1138             :         { "SQ_LDS_I", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
    1139             :           SOC15_REG_FIELD(SQ_EDC_CNT, LDS_I_SEC_COUNT),
    1140             :           SOC15_REG_FIELD(SQ_EDC_CNT, LDS_I_DED_COUNT) },
    1141             :         { "SQ_SGPR", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
    1142             :           SOC15_REG_FIELD(SQ_EDC_CNT, SGPR_SEC_COUNT),
    1143             :           SOC15_REG_FIELD(SQ_EDC_CNT, SGPR_DED_COUNT) },
    1144             :         { "SQ_VGPR0", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
    1145             :           SOC15_REG_FIELD(SQ_EDC_CNT, VGPR0_SEC_COUNT),
    1146             :           SOC15_REG_FIELD(SQ_EDC_CNT, VGPR0_DED_COUNT) },
    1147             :         { "SQ_VGPR1", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
    1148             :           SOC15_REG_FIELD(SQ_EDC_CNT, VGPR1_SEC_COUNT),
    1149             :           SOC15_REG_FIELD(SQ_EDC_CNT, VGPR1_DED_COUNT) },
    1150             :         { "SQ_VGPR2", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
    1151             :           SOC15_REG_FIELD(SQ_EDC_CNT, VGPR2_SEC_COUNT),
    1152             :           SOC15_REG_FIELD(SQ_EDC_CNT, VGPR2_DED_COUNT) },
    1153             :         { "SQ_VGPR3", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
    1154             :           SOC15_REG_FIELD(SQ_EDC_CNT, VGPR3_SEC_COUNT),
    1155             :           SOC15_REG_FIELD(SQ_EDC_CNT, VGPR3_DED_COUNT) },
    1156             : 
    1157             :         /* TCP */
    1158             :         { "TCP_CACHE_RAM", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
    1159             :           SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CACHE_RAM_SEC_COUNT),
    1160             :           SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CACHE_RAM_DED_COUNT) },
    1161             :         { "TCP_LFIFO_RAM", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
    1162             :           SOC15_REG_FIELD(TCP_EDC_CNT_NEW, LFIFO_RAM_SEC_COUNT),
    1163             :           SOC15_REG_FIELD(TCP_EDC_CNT_NEW, LFIFO_RAM_DED_COUNT) },
    1164             :         { "TCP_CMD_FIFO", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
    1165             :           SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CMD_FIFO_SEC_COUNT),
    1166             :           SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CMD_FIFO_DED_COUNT) },
    1167             :         { "TCP_VM_FIFO", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
    1168             :           SOC15_REG_FIELD(TCP_EDC_CNT_NEW, VM_FIFO_SEC_COUNT),
    1169             :           SOC15_REG_FIELD(TCP_EDC_CNT_NEW, VM_FIFO_DED_COUNT) },
    1170             :         { "TCP_DB_RAM", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
    1171             :           SOC15_REG_FIELD(TCP_EDC_CNT_NEW, DB_RAM_SEC_COUNT),
    1172             :           SOC15_REG_FIELD(TCP_EDC_CNT_NEW, DB_RAM_DED_COUNT) },
    1173             :         { "TCP_UTCL1_LFIFO0", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
    1174             :           SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO0_SEC_COUNT),
    1175             :           SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO0_DED_COUNT) },
    1176             :         { "TCP_UTCL1_LFIFO1", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
    1177             :           SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO1_SEC_COUNT),
    1178             :           SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO1_DED_COUNT) },
    1179             : 
    1180             :         /* TCI */
    1181             :         { "TCI_WRITE_RAM", SOC15_REG_ENTRY(GC, 0, regTCI_EDC_CNT),
    1182             :           SOC15_REG_FIELD(TCI_EDC_CNT, WRITE_RAM_SEC_COUNT),
    1183             :           SOC15_REG_FIELD(TCI_EDC_CNT, WRITE_RAM_DED_COUNT) },
    1184             : 
    1185             :         /* TCC */
    1186             :         { "TCC_CACHE_DATA", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
    1187             :           SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DATA_SEC_COUNT),
    1188             :           SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DATA_DED_COUNT) },
    1189             :         { "TCC_CACHE_DIRTY", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
    1190             :           SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DIRTY_SEC_COUNT),
    1191             :           SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DIRTY_DED_COUNT) },
    1192             :         { "TCC_HIGH_RATE_TAG", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
    1193             :           SOC15_REG_FIELD(TCC_EDC_CNT, HIGH_RATE_TAG_SEC_COUNT),
    1194             :           SOC15_REG_FIELD(TCC_EDC_CNT, HIGH_RATE_TAG_DED_COUNT) },
    1195             :         { "TCC_LOW_RATE_TAG", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
    1196             :           SOC15_REG_FIELD(TCC_EDC_CNT, LOW_RATE_TAG_SEC_COUNT),
    1197             :           SOC15_REG_FIELD(TCC_EDC_CNT, LOW_RATE_TAG_DED_COUNT) },
    1198             :         { "TCC_SRC_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
    1199             :           SOC15_REG_FIELD(TCC_EDC_CNT, SRC_FIFO_SEC_COUNT),
    1200             :           SOC15_REG_FIELD(TCC_EDC_CNT, SRC_FIFO_DED_COUNT) },
    1201             :         { "TCC_LATENCY_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
    1202             :           SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_SEC_COUNT),
    1203             :           SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_DED_COUNT) },
    1204             :         { "TCC_LATENCY_FIFO_NEXT_RAM", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
    1205             :           SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_NEXT_RAM_SEC_COUNT),
    1206             :           SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_NEXT_RAM_DED_COUNT) },
    1207             :         { "TCC_CACHE_TAG_PROBE_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
    1208             :           SOC15_REG_FIELD(TCC_EDC_CNT2, CACHE_TAG_PROBE_FIFO_SEC_COUNT),
    1209             :           SOC15_REG_FIELD(TCC_EDC_CNT2, CACHE_TAG_PROBE_FIFO_DED_COUNT) },
    1210             :         { "TCC_UC_ATOMIC_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
    1211             :           SOC15_REG_FIELD(TCC_EDC_CNT2, UC_ATOMIC_FIFO_SEC_COUNT),
    1212             :           SOC15_REG_FIELD(TCC_EDC_CNT2, UC_ATOMIC_FIFO_DED_COUNT) },
    1213             :         { "TCC_WRITE_CACHE_READ", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
    1214             :           SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_CACHE_READ_SEC_COUNT),
    1215             :           SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_CACHE_READ_DED_COUNT) },
    1216             :         { "TCC_RETURN_CONTROL", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
    1217             :           SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_CONTROL_SEC_COUNT),
    1218             :           SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_CONTROL_DED_COUNT) },
    1219             :         { "TCC_IN_USE_TRANSFER", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
    1220             :           SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_TRANSFER_SEC_COUNT),
    1221             :           SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_TRANSFER_DED_COUNT) },
    1222             :         { "TCC_IN_USE_DEC", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
    1223             :           SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_DEC_SEC_COUNT),
    1224             :           SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_DEC_DED_COUNT) },
    1225             :         { "TCC_WRITE_RETURN", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
    1226             :           SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_RETURN_SEC_COUNT),
    1227             :           SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_RETURN_DED_COUNT) },
    1228             :         { "TCC_RETURN_DATA", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
    1229             :           SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_DATA_SEC_COUNT),
    1230             :           SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_DATA_DED_COUNT) },
    1231             : 
    1232             :         /* TCA */
    1233             :         { "TCA_HOLE_FIFO", SOC15_REG_ENTRY(GC, 0, regTCA_EDC_CNT),
    1234             :           SOC15_REG_FIELD(TCA_EDC_CNT, HOLE_FIFO_SEC_COUNT),
    1235             :           SOC15_REG_FIELD(TCA_EDC_CNT, HOLE_FIFO_DED_COUNT) },
    1236             :         { "TCA_REQ_FIFO", SOC15_REG_ENTRY(GC, 0, regTCA_EDC_CNT),
    1237             :           SOC15_REG_FIELD(TCA_EDC_CNT, REQ_FIFO_SEC_COUNT),
    1238             :           SOC15_REG_FIELD(TCA_EDC_CNT, REQ_FIFO_DED_COUNT) },
    1239             : 
    1240             :         /* TCX */
    1241             :         { "TCX_GROUP0", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
    1242             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP0_SEC_COUNT),
    1243             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP0_DED_COUNT) },
    1244             :         { "TCX_GROUP1", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
    1245             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP1_SEC_COUNT),
    1246             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP1_DED_COUNT) },
    1247             :         { "TCX_GROUP2", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
    1248             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP2_SEC_COUNT),
    1249             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP2_DED_COUNT) },
    1250             :         { "TCX_GROUP3", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
    1251             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP3_SEC_COUNT),
    1252             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP3_DED_COUNT) },
    1253             :         { "TCX_GROUP4", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
    1254             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP4_SEC_COUNT),
    1255             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP4_DED_COUNT) },
    1256             :         { "TCX_GROUP5", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
    1257             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP5_SED_COUNT), 0, 0 },
    1258             :         { "TCX_GROUP6", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
    1259             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP6_SED_COUNT), 0, 0 },
    1260             :         { "TCX_GROUP7", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
    1261             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP7_SED_COUNT), 0, 0 },
    1262             :         { "TCX_GROUP8", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
    1263             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP8_SED_COUNT), 0, 0 },
    1264             :         { "TCX_GROUP9", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
    1265             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP9_SED_COUNT), 0, 0 },
    1266             :         { "TCX_GROUP10", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
    1267             :           SOC15_REG_FIELD(TCX_EDC_CNT, GROUP10_SED_COUNT), 0, 0 },
    1268             :         { "TCX_GROUP11", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
    1269             :           SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP11_SED_COUNT), 0, 0 },
    1270             :         { "TCX_GROUP12", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
    1271             :           SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP12_SED_COUNT), 0, 0 },
    1272             :         { "TCX_GROUP13", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
    1273             :           SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP13_SED_COUNT), 0, 0 },
    1274             :         { "TCX_GROUP14", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
    1275             :           SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP14_SED_COUNT), 0, 0 },
    1276             : 
    1277             :         /* TD */
    1278             :         { "TD_SS_FIFO_LO", SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT),
    1279             :           SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_LO_SEC_COUNT),
    1280             :           SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_LO_DED_COUNT) },
    1281             :         { "TD_SS_FIFO_HI", SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT),
    1282             :           SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_HI_SEC_COUNT),
    1283             :           SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_HI_DED_COUNT) },
    1284             :         { "TD_CS_FIFO", SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT),
    1285             :           SOC15_REG_FIELD(TD_EDC_CNT, CS_FIFO_SEC_COUNT),
    1286             :           SOC15_REG_FIELD(TD_EDC_CNT, CS_FIFO_DED_COUNT) },
    1287             : 
    1288             :         /* TA */
    1289             :         { "TA_FS_DFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
    1290             :           SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_DFIFO_SEC_COUNT),
    1291             :           SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_DFIFO_DED_COUNT) },
    1292             :         { "TA_FS_AFIFO_LO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
    1293             :           SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_LO_SEC_COUNT),
    1294             :           SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_LO_DED_COUNT) },
    1295             :         { "TA_FL_LFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
    1296             :           SOC15_REG_FIELD(TA_EDC_CNT, TA_FL_LFIFO_SEC_COUNT),
    1297             :           SOC15_REG_FIELD(TA_EDC_CNT, TA_FL_LFIFO_DED_COUNT) },
    1298             :         { "TA_FX_LFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
    1299             :           SOC15_REG_FIELD(TA_EDC_CNT, TA_FX_LFIFO_SEC_COUNT),
    1300             :           SOC15_REG_FIELD(TA_EDC_CNT, TA_FX_LFIFO_DED_COUNT) },
    1301             :         { "TA_FS_CFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
    1302             :           SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_CFIFO_SEC_COUNT),
    1303             :           SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_CFIFO_DED_COUNT) },
    1304             :         { "TA_FS_AFIFO_HI", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
    1305             :           SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_HI_SEC_COUNT),
    1306             :           SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_HI_DED_COUNT) },
    1307             : 
    1308             :         /* EA - regGCEA_EDC_CNT */
    1309             :         { "EA_DRAMRD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
    1310             :           SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_CMDMEM_SEC_COUNT),
    1311             :           SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_CMDMEM_DED_COUNT) },
    1312             :         { "EA_DRAMWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
    1313             :           SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_CMDMEM_SEC_COUNT),
    1314             :           SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_CMDMEM_DED_COUNT) },
    1315             :         { "EA_DRAMWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
    1316             :           SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_DATAMEM_SEC_COUNT),
    1317             :           SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_DATAMEM_DED_COUNT) },
    1318             :         { "EA_RRET_TAGMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
    1319             :           SOC15_REG_FIELD(GCEA_EDC_CNT, RRET_TAGMEM_SEC_COUNT),
    1320             :           SOC15_REG_FIELD(GCEA_EDC_CNT, RRET_TAGMEM_DED_COUNT) },
    1321             :         { "EA_WRET_TAGMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
    1322             :           SOC15_REG_FIELD(GCEA_EDC_CNT, WRET_TAGMEM_SEC_COUNT),
    1323             :           SOC15_REG_FIELD(GCEA_EDC_CNT, WRET_TAGMEM_DED_COUNT) },
    1324             :         { "EA_IOWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
    1325             :           SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_DATAMEM_SEC_COUNT),
    1326             :           SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_DATAMEM_DED_COUNT) },
    1327             :         { "EA_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
    1328             :           SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_PAGEMEM_SED_COUNT), 0, 0 },
    1329             :         { "EA_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
    1330             :           SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_PAGEMEM_SED_COUNT), 0, 0 },
    1331             :         { "EA_IORD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
    1332             :           SOC15_REG_FIELD(GCEA_EDC_CNT, IORD_CMDMEM_SED_COUNT), 0, 0 },
    1333             :         { "EA_IOWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
    1334             :           SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_CMDMEM_SED_COUNT), 0, 0 },
    1335             : 
    1336             :         /* EA - regGCEA_EDC_CNT2 */
    1337             :         { "EA_GMIRD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
    1338             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_CMDMEM_SEC_COUNT),
    1339             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_CMDMEM_DED_COUNT) },
    1340             :         { "EA_GMIWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
    1341             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_CMDMEM_SEC_COUNT),
    1342             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_CMDMEM_DED_COUNT) },
    1343             :         { "EA_GMIWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
    1344             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_DATAMEM_SEC_COUNT),
    1345             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_DATAMEM_DED_COUNT) },
    1346             :         { "EA_GMIRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
    1347             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_PAGEMEM_SED_COUNT), 0, 0 },
    1348             :         { "EA_GMIWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
    1349             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_PAGEMEM_SED_COUNT), 0, 0 },
    1350             :         { "EA_MAM_D0MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
    1351             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D0MEM_SED_COUNT),
    1352             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D0MEM_DED_COUNT) },
    1353             :         { "EA_MAM_D1MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
    1354             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D1MEM_SED_COUNT),
    1355             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D1MEM_DED_COUNT) },
    1356             :         { "EA_MAM_D2MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
    1357             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D2MEM_SED_COUNT),
    1358             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D2MEM_DED_COUNT) },
    1359             :         { "EA_MAM_D3MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
    1360             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D3MEM_SED_COUNT),
    1361             :           SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D3MEM_DED_COUNT) },
    1362             : 
    1363             :         /* EA - regGCEA_EDC_CNT3 */
    1364             :         { "EA_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
    1365             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, DRAMRD_PAGEMEM_DED_COUNT) },
    1366             :         { "EA_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
    1367             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, DRAMWR_PAGEMEM_DED_COUNT) },
    1368             :         { "EA_IORD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
    1369             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, IORD_CMDMEM_DED_COUNT) },
    1370             :         { "EA_IOWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
    1371             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, IOWR_CMDMEM_DED_COUNT) },
    1372             :         { "EA_GMIRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
    1373             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, GMIRD_PAGEMEM_DED_COUNT) },
    1374             :         { "EA_GMIWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
    1375             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, GMIWR_PAGEMEM_DED_COUNT) },
    1376             :         { "EA_MAM_A0MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
    1377             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A0MEM_SEC_COUNT),
    1378             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A0MEM_DED_COUNT) },
    1379             :         { "EA_MAM_A1MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
    1380             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A1MEM_SEC_COUNT),
    1381             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A1MEM_DED_COUNT) },
    1382             :         { "EA_MAM_A2MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
    1383             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A2MEM_SEC_COUNT),
    1384             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A2MEM_DED_COUNT) },
    1385             :         { "EA_MAM_A3MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
    1386             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A3MEM_SEC_COUNT),
    1387             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A3MEM_DED_COUNT) },
    1388             :         { "EA_MAM_AFMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
    1389             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_AFMEM_SEC_COUNT),
    1390             :           SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_AFMEM_DED_COUNT) },
    1391             : };
    1392             : 
    1393             : static const char * const vml2_walker_mems[] = {
    1394             :         "UTC_VML2_CACHE_PDE0_MEM0",
    1395             :         "UTC_VML2_CACHE_PDE0_MEM1",
    1396             :         "UTC_VML2_CACHE_PDE1_MEM0",
    1397             :         "UTC_VML2_CACHE_PDE1_MEM1",
    1398             :         "UTC_VML2_CACHE_PDE2_MEM0",
    1399             :         "UTC_VML2_CACHE_PDE2_MEM1",
    1400             :         "UTC_VML2_RDIF_ARADDRS",
    1401             :         "UTC_VML2_RDIF_LOG_FIFO",
    1402             :         "UTC_VML2_QUEUE_REQ",
    1403             :         "UTC_VML2_QUEUE_RET",
    1404             : };
    1405             : 
    1406             : static struct gfx_v9_4_2_utc_block gfx_v9_4_2_utc_blocks[] = {
    1407             :         { VML2_MEM, 8, 2, 2,
    1408             :           { SOC15_REG_ENTRY(GC, 0, regVML2_MEM_ECC_INDEX) },
    1409             :           { SOC15_REG_ENTRY(GC, 0, regVML2_MEM_ECC_CNTL) },
    1410             :           SOC15_REG_FIELD(VML2_MEM_ECC_CNTL, SEC_COUNT),
    1411             :           SOC15_REG_FIELD(VML2_MEM_ECC_CNTL, DED_COUNT),
    1412             :           REG_SET_FIELD(0, VML2_MEM_ECC_CNTL, WRITE_COUNTERS, 1) },
    1413             :         { VML2_WALKER_MEM, ARRAY_SIZE(vml2_walker_mems), 1, 1,
    1414             :           { SOC15_REG_ENTRY(GC, 0, regVML2_WALKER_MEM_ECC_INDEX) },
    1415             :           { SOC15_REG_ENTRY(GC, 0, regVML2_WALKER_MEM_ECC_CNTL) },
    1416             :           SOC15_REG_FIELD(VML2_WALKER_MEM_ECC_CNTL, SEC_COUNT),
    1417             :           SOC15_REG_FIELD(VML2_WALKER_MEM_ECC_CNTL, DED_COUNT),
    1418             :           REG_SET_FIELD(0, VML2_WALKER_MEM_ECC_CNTL, WRITE_COUNTERS, 1) },
    1419             :         { UTCL2_MEM, 18, 1, 2,
    1420             :           { SOC15_REG_ENTRY(GC, 0, regUTCL2_MEM_ECC_INDEX) },
    1421             :           { SOC15_REG_ENTRY(GC, 0, regUTCL2_MEM_ECC_CNTL) },
    1422             :           SOC15_REG_FIELD(UTCL2_MEM_ECC_CNTL, SEC_COUNT),
    1423             :           SOC15_REG_FIELD(UTCL2_MEM_ECC_CNTL, DED_COUNT),
    1424             :           REG_SET_FIELD(0, UTCL2_MEM_ECC_CNTL, WRITE_COUNTERS, 1) },
    1425             :         { ATC_L2_CACHE_2M, 8, 2, 1,
    1426             :           { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_2M_DSM_INDEX) },
    1427             :           { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_2M_DSM_CNTL) },
    1428             :           SOC15_REG_FIELD(ATC_L2_CACHE_2M_DSM_CNTL, SEC_COUNT),
    1429             :           SOC15_REG_FIELD(ATC_L2_CACHE_2M_DSM_CNTL, DED_COUNT),
    1430             :           REG_SET_FIELD(0, ATC_L2_CACHE_2M_DSM_CNTL, WRITE_COUNTERS, 1) },
    1431             :         { ATC_L2_CACHE_32K, 8, 2, 2,
    1432             :           { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_32K_DSM_INDEX) },
    1433             :           { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_32K_DSM_CNTL) },
    1434             :           SOC15_REG_FIELD(ATC_L2_CACHE_32K_DSM_CNTL, SEC_COUNT),
    1435             :           SOC15_REG_FIELD(ATC_L2_CACHE_32K_DSM_CNTL, DED_COUNT),
    1436             :           REG_SET_FIELD(0, ATC_L2_CACHE_32K_DSM_CNTL, WRITE_COUNTERS, 1) },
    1437             :         { ATC_L2_CACHE_4K, 8, 2, 8,
    1438             :           { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_4K_DSM_INDEX) },
    1439             :           { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_4K_DSM_CNTL) },
    1440             :           SOC15_REG_FIELD(ATC_L2_CACHE_4K_DSM_CNTL, SEC_COUNT),
    1441             :           SOC15_REG_FIELD(ATC_L2_CACHE_4K_DSM_CNTL, DED_COUNT),
    1442             :           REG_SET_FIELD(0, ATC_L2_CACHE_4K_DSM_CNTL, WRITE_COUNTERS, 1) },
    1443             : };
    1444             : 
    1445             : static const struct soc15_reg_entry gfx_v9_4_2_ea_err_status_regs = {
    1446             :         SOC15_REG_ENTRY(GC, 0, regGCEA_ERR_STATUS), 0, 1, 16
    1447             : };
    1448             : 
    1449           0 : static int gfx_v9_4_2_get_reg_error_count(struct amdgpu_device *adev,
    1450             :                                           const struct soc15_reg_entry *reg,
    1451             :                                           uint32_t se_id, uint32_t inst_id,
    1452             :                                           uint32_t value, uint32_t *sec_count,
    1453             :                                           uint32_t *ded_count)
    1454             : {
    1455             :         uint32_t i;
    1456             :         uint32_t sec_cnt, ded_cnt;
    1457             : 
    1458           0 :         for (i = 0; i < ARRAY_SIZE(gfx_v9_4_2_ras_fields); i++) {
    1459           0 :                 if (gfx_v9_4_2_ras_fields[i].reg_offset != reg->reg_offset ||
    1460           0 :                     gfx_v9_4_2_ras_fields[i].seg != reg->seg ||
    1461           0 :                     gfx_v9_4_2_ras_fields[i].inst != reg->inst)
    1462           0 :                         continue;
    1463             : 
    1464           0 :                 sec_cnt = SOC15_RAS_REG_FIELD_VAL(
    1465             :                         value, gfx_v9_4_2_ras_fields[i], sec);
    1466           0 :                 if (sec_cnt) {
    1467           0 :                         dev_info(adev->dev,
    1468             :                                  "GFX SubBlock %s, Instance[%d][%d], SEC %d\n",
    1469             :                                  gfx_v9_4_2_ras_fields[i].name, se_id, inst_id,
    1470             :                                  sec_cnt);
    1471           0 :                         *sec_count += sec_cnt;
    1472             :                 }
    1473             : 
    1474           0 :                 ded_cnt = SOC15_RAS_REG_FIELD_VAL(
    1475             :                         value, gfx_v9_4_2_ras_fields[i], ded);
    1476           0 :                 if (ded_cnt) {
    1477           0 :                         dev_info(adev->dev,
    1478             :                                  "GFX SubBlock %s, Instance[%d][%d], DED %d\n",
    1479             :                                  gfx_v9_4_2_ras_fields[i].name, se_id, inst_id,
    1480             :                                  ded_cnt);
    1481           0 :                         *ded_count += ded_cnt;
    1482             :                 }
    1483             :         }
    1484             : 
    1485           0 :         return 0;
    1486             : }
    1487             : 
    1488           0 : static int gfx_v9_4_2_query_sram_edc_count(struct amdgpu_device *adev,
    1489             :                                 uint32_t *sec_count, uint32_t *ded_count)
    1490             : {
    1491             :         uint32_t i, j, k, data;
    1492           0 :         uint32_t sec_cnt = 0, ded_cnt = 0;
    1493             : 
    1494           0 :         if (sec_count && ded_count) {
    1495           0 :                 *sec_count = 0;
    1496           0 :                 *ded_count = 0;
    1497             :         }
    1498             : 
    1499           0 :         mutex_lock(&adev->grbm_idx_mutex);
    1500             : 
    1501           0 :         for (i = 0; i < ARRAY_SIZE(gfx_v9_4_2_edc_counter_regs); i++) {
    1502           0 :                 for (j = 0; j < gfx_v9_4_2_edc_counter_regs[i].se_num; j++) {
    1503           0 :                         for (k = 0; k < gfx_v9_4_2_edc_counter_regs[i].instance;
    1504           0 :                              k++) {
    1505           0 :                                 gfx_v9_4_2_select_se_sh(adev, j, 0, k);
    1506             : 
    1507             :                                 /* if sec/ded_count is null, just clear counter */
    1508           0 :                                 if (!sec_count || !ded_count) {
    1509           0 :                                         WREG32(SOC15_REG_ENTRY_OFFSET(
    1510             :                                                 gfx_v9_4_2_edc_counter_regs[i]), 0);
    1511           0 :                                         continue;
    1512             :                                 }
    1513             : 
    1514           0 :                                 data = RREG32(SOC15_REG_ENTRY_OFFSET(
    1515             :                                         gfx_v9_4_2_edc_counter_regs[i]));
    1516             : 
    1517           0 :                                 if (!data)
    1518           0 :                                         continue;
    1519             : 
    1520           0 :                                 gfx_v9_4_2_get_reg_error_count(adev,
    1521             :                                         &gfx_v9_4_2_edc_counter_regs[i],
    1522             :                                         j, k, data, &sec_cnt, &ded_cnt);
    1523             : 
    1524             :                                 /* clear counter after read */
    1525           0 :                                 WREG32(SOC15_REG_ENTRY_OFFSET(
    1526             :                                         gfx_v9_4_2_edc_counter_regs[i]), 0);
    1527             :                         }
    1528             :                 }
    1529             :         }
    1530             : 
    1531           0 :         if (sec_count && ded_count) {
    1532           0 :                 *sec_count += sec_cnt;
    1533           0 :                 *ded_count += ded_cnt;
    1534             :         }
    1535             : 
    1536           0 :         gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
    1537           0 :         mutex_unlock(&adev->grbm_idx_mutex);
    1538             : 
    1539           0 :         return 0;
    1540             : }
    1541             : 
    1542           0 : static void gfx_v9_4_2_log_utc_edc_count(struct amdgpu_device *adev,
    1543             :                                          struct gfx_v9_4_2_utc_block *blk,
    1544             :                                          uint32_t instance, uint32_t sec_cnt,
    1545             :                                          uint32_t ded_cnt)
    1546             : {
    1547             :         uint32_t bank, way, mem;
    1548             :         static const char *vml2_way_str[] = { "BIGK", "4K" };
    1549             :         static const char *utcl2_rounter_str[] = { "VMC", "APT" };
    1550             : 
    1551           0 :         mem = instance % blk->num_mem_blocks;
    1552           0 :         way = (instance / blk->num_mem_blocks) % blk->num_ways;
    1553           0 :         bank = instance / (blk->num_mem_blocks * blk->num_ways);
    1554             : 
    1555           0 :         switch (blk->type) {
    1556             :         case VML2_MEM:
    1557           0 :                 dev_info(
    1558             :                         adev->dev,
    1559             :                         "GFX SubBlock UTC_VML2_BANK_CACHE_%d_%s_MEM%d, SED %d, DED %d\n",
    1560             :                         bank, vml2_way_str[way], mem, sec_cnt, ded_cnt);
    1561             :                 break;
    1562             :         case VML2_WALKER_MEM:
    1563           0 :                 dev_info(adev->dev, "GFX SubBlock %s, SED %d, DED %d\n",
    1564             :                          vml2_walker_mems[bank], sec_cnt, ded_cnt);
    1565             :                 break;
    1566             :         case UTCL2_MEM:
    1567           0 :                 dev_info(
    1568             :                         adev->dev,
    1569             :                         "GFX SubBlock UTCL2_ROUTER_IFIF%d_GROUP0_%s, SED %d, DED %d\n",
    1570             :                         bank, utcl2_rounter_str[mem], sec_cnt, ded_cnt);
    1571             :                 break;
    1572             :         case ATC_L2_CACHE_2M:
    1573           0 :                 dev_info(
    1574             :                         adev->dev,
    1575             :                         "GFX SubBlock UTC_ATCL2_CACHE_2M_BANK%d_WAY%d_MEM, SED %d, DED %d\n",
    1576             :                         bank, way, sec_cnt, ded_cnt);
    1577             :                 break;
    1578             :         case ATC_L2_CACHE_32K:
    1579           0 :                 dev_info(
    1580             :                         adev->dev,
    1581             :                         "GFX SubBlock UTC_ATCL2_CACHE_32K_BANK%d_WAY%d_MEM%d, SED %d, DED %d\n",
    1582             :                         bank, way, mem, sec_cnt, ded_cnt);
    1583             :                 break;
    1584             :         case ATC_L2_CACHE_4K:
    1585           0 :                 dev_info(
    1586             :                         adev->dev,
    1587             :                         "GFX SubBlock UTC_ATCL2_CACHE_4K_BANK%d_WAY%d_MEM%d, SED %d, DED %d\n",
    1588             :                         bank, way, mem, sec_cnt, ded_cnt);
    1589             :                 break;
    1590             :         }
    1591           0 : }
    1592             : 
    1593           0 : static int gfx_v9_4_2_query_utc_edc_count(struct amdgpu_device *adev,
    1594             :                                           uint32_t *sec_count,
    1595             :                                           uint32_t *ded_count)
    1596             : {
    1597             :         uint32_t i, j, data;
    1598             :         uint32_t sec_cnt, ded_cnt;
    1599             :         uint32_t num_instances;
    1600             :         struct gfx_v9_4_2_utc_block *blk;
    1601             : 
    1602           0 :         if (sec_count && ded_count) {
    1603           0 :                 *sec_count = 0;
    1604           0 :                 *ded_count = 0;
    1605             :         }
    1606             : 
    1607           0 :         for (i = 0; i < ARRAY_SIZE(gfx_v9_4_2_utc_blocks); i++) {
    1608           0 :                 blk = &gfx_v9_4_2_utc_blocks[i];
    1609           0 :                 num_instances =
    1610           0 :                         blk->num_banks * blk->num_ways * blk->num_mem_blocks;
    1611           0 :                 for (j = 0; j < num_instances; j++) {
    1612           0 :                         WREG32(SOC15_REG_ENTRY_OFFSET(blk->idx_reg), j);
    1613             : 
    1614             :                         /* if sec/ded_count is NULL, just clear counter */
    1615           0 :                         if (!sec_count || !ded_count) {
    1616           0 :                                 WREG32(SOC15_REG_ENTRY_OFFSET(blk->data_reg),
    1617             :                                        blk->clear);
    1618           0 :                                 continue;
    1619             :                         }
    1620             : 
    1621           0 :                         data = RREG32(SOC15_REG_ENTRY_OFFSET(blk->data_reg));
    1622           0 :                         if (!data)
    1623           0 :                                 continue;
    1624             : 
    1625           0 :                         sec_cnt = SOC15_RAS_REG_FIELD_VAL(data, *blk, sec);
    1626           0 :                         *sec_count += sec_cnt;
    1627           0 :                         ded_cnt = SOC15_RAS_REG_FIELD_VAL(data, *blk, ded);
    1628           0 :                         *ded_count += ded_cnt;
    1629             : 
    1630             :                         /* clear counter after read */
    1631           0 :                         WREG32(SOC15_REG_ENTRY_OFFSET(blk->data_reg),
    1632             :                                blk->clear);
    1633             : 
    1634             :                         /* print the edc count */
    1635           0 :                         if (sec_cnt || ded_cnt)
    1636           0 :                                 gfx_v9_4_2_log_utc_edc_count(adev, blk, j, sec_cnt,
    1637             :                                                              ded_cnt);
    1638             :                 }
    1639             :         }
    1640             : 
    1641           0 :         return 0;
    1642             : }
    1643             : 
    1644           0 : static void gfx_v9_4_2_query_ras_error_count(struct amdgpu_device *adev,
    1645             :                                             void *ras_error_status)
    1646             : {
    1647           0 :         struct ras_err_data *err_data = (struct ras_err_data *)ras_error_status;
    1648           0 :         uint32_t sec_count = 0, ded_count = 0;
    1649             : 
    1650           0 :         if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
    1651           0 :                 return;
    1652             : 
    1653           0 :         err_data->ue_count = 0;
    1654           0 :         err_data->ce_count = 0;
    1655             : 
    1656           0 :         gfx_v9_4_2_query_sram_edc_count(adev, &sec_count, &ded_count);
    1657           0 :         err_data->ce_count += sec_count;
    1658           0 :         err_data->ue_count += ded_count;
    1659             : 
    1660           0 :         gfx_v9_4_2_query_utc_edc_count(adev, &sec_count, &ded_count);
    1661           0 :         err_data->ce_count += sec_count;
    1662           0 :         err_data->ue_count += ded_count;
    1663             : 
    1664             : }
    1665             : 
    1666           0 : static void gfx_v9_4_2_reset_utc_err_status(struct amdgpu_device *adev)
    1667             : {
    1668           0 :         WREG32_SOC15(GC, 0, regUTCL2_MEM_ECC_STATUS, 0x3);
    1669           0 :         WREG32_SOC15(GC, 0, regVML2_MEM_ECC_STATUS, 0x3);
    1670           0 :         WREG32_SOC15(GC, 0, regVML2_WALKER_MEM_ECC_STATUS, 0x3);
    1671           0 : }
    1672             : 
    1673           0 : static void gfx_v9_4_2_reset_ea_err_status(struct amdgpu_device *adev)
    1674             : {
    1675             :         uint32_t i, j;
    1676             :         uint32_t value;
    1677             : 
    1678           0 :         mutex_lock(&adev->grbm_idx_mutex);
    1679           0 :         for (i = 0; i < gfx_v9_4_2_ea_err_status_regs.se_num; i++) {
    1680           0 :                 for (j = 0; j < gfx_v9_4_2_ea_err_status_regs.instance;
    1681           0 :                      j++) {
    1682           0 :                         gfx_v9_4_2_select_se_sh(adev, i, 0, j);
    1683           0 :                         value = RREG32(SOC15_REG_ENTRY_OFFSET(
    1684             :                                 gfx_v9_4_2_ea_err_status_regs));
    1685           0 :                         value = REG_SET_FIELD(value, GCEA_ERR_STATUS, CLEAR_ERROR_STATUS, 0x1);
    1686           0 :                         WREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_4_2_ea_err_status_regs), value);
    1687             :                 }
    1688             :         }
    1689           0 :         gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
    1690           0 :         mutex_unlock(&adev->grbm_idx_mutex);
    1691           0 : }
    1692             : 
    1693           0 : static void gfx_v9_4_2_reset_ras_error_count(struct amdgpu_device *adev)
    1694             : {
    1695           0 :         if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
    1696             :                 return;
    1697             : 
    1698           0 :         gfx_v9_4_2_query_sram_edc_count(adev, NULL, NULL);
    1699           0 :         gfx_v9_4_2_query_utc_edc_count(adev, NULL, NULL);
    1700             : }
    1701             : 
    1702           0 : static int gfx_v9_4_2_ras_error_inject(struct amdgpu_device *adev, void *inject_if)
    1703             : {
    1704           0 :         struct ras_inject_if *info = (struct ras_inject_if *)inject_if;
    1705             :         int ret;
    1706           0 :         struct ta_ras_trigger_error_input block_info = { 0 };
    1707             : 
    1708           0 :         if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
    1709             :                 return -EINVAL;
    1710             : 
    1711           0 :         block_info.block_id = amdgpu_ras_block_to_ta(info->head.block);
    1712           0 :         block_info.sub_block_index = info->head.sub_block_index;
    1713           0 :         block_info.inject_error_type = amdgpu_ras_error_to_ta(info->head.type);
    1714           0 :         block_info.address = info->address;
    1715           0 :         block_info.value = info->value;
    1716             : 
    1717           0 :         mutex_lock(&adev->grbm_idx_mutex);
    1718           0 :         ret = psp_ras_trigger_error(&adev->psp, &block_info);
    1719           0 :         mutex_unlock(&adev->grbm_idx_mutex);
    1720             : 
    1721           0 :         return ret;
    1722             : }
    1723             : 
    1724           0 : static void gfx_v9_4_2_query_ea_err_status(struct amdgpu_device *adev)
    1725             : {
    1726             :         uint32_t i, j;
    1727             :         uint32_t reg_value;
    1728             : 
    1729           0 :         mutex_lock(&adev->grbm_idx_mutex);
    1730             : 
    1731           0 :         for (i = 0; i < gfx_v9_4_2_ea_err_status_regs.se_num; i++) {
    1732           0 :                 for (j = 0; j < gfx_v9_4_2_ea_err_status_regs.instance;
    1733           0 :                      j++) {
    1734           0 :                         gfx_v9_4_2_select_se_sh(adev, i, 0, j);
    1735           0 :                         reg_value = RREG32(SOC15_REG_ENTRY_OFFSET(
    1736             :                                 gfx_v9_4_2_ea_err_status_regs));
    1737             : 
    1738           0 :                         if (REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_RDRSP_STATUS) ||
    1739           0 :                             REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_WRRSP_STATUS) ||
    1740             :                             REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_RDRSP_DATAPARITY_ERROR)) {
    1741           0 :                                 dev_warn(adev->dev, "GCEA err detected at instance: %d, status: 0x%x!\n",
    1742             :                                                 j, reg_value);
    1743             :                         }
    1744             :                         /* clear after read */
    1745           0 :                         reg_value = REG_SET_FIELD(reg_value, GCEA_ERR_STATUS,
    1746             :                                                   CLEAR_ERROR_STATUS, 0x1);
    1747           0 :                         WREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_4_2_ea_err_status_regs), reg_value);
    1748             :                 }
    1749             :         }
    1750             : 
    1751           0 :         gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
    1752           0 :         mutex_unlock(&adev->grbm_idx_mutex);
    1753           0 : }
    1754             : 
    1755           0 : static void gfx_v9_4_2_query_utc_err_status(struct amdgpu_device *adev)
    1756             : {
    1757             :         uint32_t data;
    1758             : 
    1759           0 :         data = RREG32_SOC15(GC, 0, regUTCL2_MEM_ECC_STATUS);
    1760           0 :         if (data) {
    1761           0 :                 dev_warn(adev->dev, "GFX UTCL2 Mem Ecc Status: 0x%x!\n", data);
    1762           0 :                 WREG32_SOC15(GC, 0, regUTCL2_MEM_ECC_STATUS, 0x3);
    1763             :         }
    1764             : 
    1765           0 :         data = RREG32_SOC15(GC, 0, regVML2_MEM_ECC_STATUS);
    1766           0 :         if (data) {
    1767           0 :                 dev_warn(adev->dev, "GFX VML2 Mem Ecc Status: 0x%x!\n", data);
    1768           0 :                 WREG32_SOC15(GC, 0, regVML2_MEM_ECC_STATUS, 0x3);
    1769             :         }
    1770             : 
    1771           0 :         data = RREG32_SOC15(GC, 0, regVML2_WALKER_MEM_ECC_STATUS);
    1772           0 :         if (data) {
    1773           0 :                 dev_warn(adev->dev, "GFX VML2 Walker Mem Ecc Status: 0x%x!\n", data);
    1774           0 :                 WREG32_SOC15(GC, 0, regVML2_WALKER_MEM_ECC_STATUS, 0x3);
    1775             :         }
    1776           0 : }
    1777             : 
    1778           0 : static void gfx_v9_4_2_query_ras_error_status(struct amdgpu_device *adev)
    1779             : {
    1780           0 :         if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
    1781             :                 return;
    1782             : 
    1783           0 :         gfx_v9_4_2_query_ea_err_status(adev);
    1784           0 :         gfx_v9_4_2_query_utc_err_status(adev);
    1785           0 :         gfx_v9_4_2_query_sq_timeout_status(adev);
    1786             : }
    1787             : 
    1788           0 : static void gfx_v9_4_2_reset_ras_error_status(struct amdgpu_device *adev)
    1789             : {
    1790           0 :         if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
    1791             :                 return;
    1792             : 
    1793           0 :         gfx_v9_4_2_reset_utc_err_status(adev);
    1794           0 :         gfx_v9_4_2_reset_ea_err_status(adev);
    1795           0 :         gfx_v9_4_2_reset_sq_timeout_status(adev);
    1796             : }
    1797             : 
    1798           0 : static void gfx_v9_4_2_enable_watchdog_timer(struct amdgpu_device *adev)
    1799             : {
    1800             :         uint32_t i;
    1801             :         uint32_t data;
    1802             : 
    1803           0 :         data = REG_SET_FIELD(0, SQ_TIMEOUT_CONFIG, TIMEOUT_FATAL_DISABLE,
    1804             :                              amdgpu_watchdog_timer.timeout_fatal_disable ? 1 :
    1805             :                                                                            0);
    1806             : 
    1807           0 :         if (amdgpu_watchdog_timer.timeout_fatal_disable &&
    1808           0 :             (amdgpu_watchdog_timer.period < 1 ||
    1809             :              amdgpu_watchdog_timer.period > 0x23)) {
    1810           0 :                 dev_warn(adev->dev, "Watchdog period range is 1 to 0x23\n");
    1811           0 :                 amdgpu_watchdog_timer.period = 0x23;
    1812             :         }
    1813           0 :         data = REG_SET_FIELD(data, SQ_TIMEOUT_CONFIG, PERIOD_SEL,
    1814             :                              amdgpu_watchdog_timer.period);
    1815             : 
    1816           0 :         mutex_lock(&adev->grbm_idx_mutex);
    1817           0 :         for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
    1818           0 :                 gfx_v9_4_2_select_se_sh(adev, i, 0xffffffff, 0xffffffff);
    1819           0 :                 WREG32_SOC15(GC, 0, regSQ_TIMEOUT_CONFIG, data);
    1820             :         }
    1821           0 :         gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
    1822           0 :         mutex_unlock(&adev->grbm_idx_mutex);
    1823           0 : }
    1824             : 
    1825           0 : static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address)
    1826             : {
    1827           0 :         WREG32_SOC15_RLC_EX(reg, GC, 0, regSQ_IND_INDEX,
    1828             :                 (wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |
    1829             :                 (simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |
    1830             :                 (address << SQ_IND_INDEX__INDEX__SHIFT) |
    1831             :                 (SQ_IND_INDEX__FORCE_READ_MASK));
    1832           0 :         return RREG32_SOC15(GC, 0, regSQ_IND_DATA);
    1833             : }
    1834             : 
    1835           0 : static void gfx_v9_4_2_log_cu_timeout_status(struct amdgpu_device *adev,
    1836             :                                         uint32_t status)
    1837             : {
    1838           0 :         struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info;
    1839             :         uint32_t i, simd, wave;
    1840             :         uint32_t wave_status;
    1841             :         uint32_t wave_pc_lo, wave_pc_hi;
    1842             :         uint32_t wave_exec_lo, wave_exec_hi;
    1843             :         uint32_t wave_inst_dw0, wave_inst_dw1;
    1844             :         uint32_t wave_ib_sts;
    1845             : 
    1846           0 :         for (i = 0; i < 32; i++) {
    1847           0 :                 if (!((i << 1) & status))
    1848           0 :                         continue;
    1849             : 
    1850           0 :                 simd = i / cu_info->max_waves_per_simd;
    1851           0 :                 wave = i % cu_info->max_waves_per_simd;
    1852             : 
    1853           0 :                 wave_status = wave_read_ind(adev, simd, wave, ixSQ_WAVE_STATUS);
    1854           0 :                 wave_pc_lo = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_LO);
    1855           0 :                 wave_pc_hi = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_HI);
    1856           0 :                 wave_exec_lo =
    1857             :                         wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_LO);
    1858           0 :                 wave_exec_hi =
    1859             :                         wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_HI);
    1860           0 :                 wave_inst_dw0 =
    1861             :                         wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW0);
    1862           0 :                 wave_inst_dw1 =
    1863             :                         wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW1);
    1864           0 :                 wave_ib_sts = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_STS);
    1865             : 
    1866           0 :                 dev_info(
    1867             :                         adev->dev,
    1868             :                         "\t SIMD %d, Wave %d: status 0x%x, pc 0x%llx, exec 0x%llx, inst 0x%llx, ib_sts 0x%x\n",
    1869             :                         simd, wave, wave_status,
    1870             :                         ((uint64_t)wave_pc_hi << 32 | wave_pc_lo),
    1871             :                         ((uint64_t)wave_exec_hi << 32 | wave_exec_lo),
    1872             :                         ((uint64_t)wave_inst_dw1 << 32 | wave_inst_dw0),
    1873             :                         wave_ib_sts);
    1874             :         }
    1875           0 : }
    1876             : 
    1877           0 : static void gfx_v9_4_2_query_sq_timeout_status(struct amdgpu_device *adev)
    1878             : {
    1879             :         uint32_t se_idx, sh_idx, cu_idx;
    1880             :         uint32_t status;
    1881             : 
    1882           0 :         mutex_lock(&adev->grbm_idx_mutex);
    1883           0 :         for (se_idx = 0; se_idx < adev->gfx.config.max_shader_engines;
    1884           0 :              se_idx++) {
    1885           0 :                 for (sh_idx = 0; sh_idx < adev->gfx.config.max_sh_per_se;
    1886           0 :                      sh_idx++) {
    1887           0 :                         for (cu_idx = 0;
    1888           0 :                              cu_idx < adev->gfx.config.max_cu_per_sh;
    1889           0 :                              cu_idx++) {
    1890           0 :                                 gfx_v9_4_2_select_se_sh(adev, se_idx, sh_idx,
    1891             :                                                         cu_idx);
    1892           0 :                                 status = RREG32_SOC15(GC, 0,
    1893             :                                                       regSQ_TIMEOUT_STATUS);
    1894           0 :                                 if (status != 0) {
    1895           0 :                                         dev_info(
    1896             :                                                 adev->dev,
    1897             :                                                 "GFX Watchdog Timeout: SE %d, SH %d, CU %d\n",
    1898             :                                                 se_idx, sh_idx, cu_idx);
    1899           0 :                                         gfx_v9_4_2_log_cu_timeout_status(
    1900             :                                                 adev, status);
    1901             :                                 }
    1902             :                                 /* clear old status */
    1903           0 :                                 WREG32_SOC15(GC, 0, regSQ_TIMEOUT_STATUS, 0);
    1904             :                         }
    1905             :                 }
    1906             :         }
    1907           0 :         gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
    1908           0 :         mutex_unlock(&adev->grbm_idx_mutex);
    1909           0 : }
    1910             : 
    1911           0 : static void gfx_v9_4_2_reset_sq_timeout_status(struct amdgpu_device *adev)
    1912             : {
    1913             :         uint32_t se_idx, sh_idx, cu_idx;
    1914             : 
    1915           0 :         mutex_lock(&adev->grbm_idx_mutex);
    1916           0 :         for (se_idx = 0; se_idx < adev->gfx.config.max_shader_engines;
    1917           0 :              se_idx++) {
    1918           0 :                 for (sh_idx = 0; sh_idx < adev->gfx.config.max_sh_per_se;
    1919           0 :                      sh_idx++) {
    1920           0 :                         for (cu_idx = 0;
    1921           0 :                              cu_idx < adev->gfx.config.max_cu_per_sh;
    1922           0 :                              cu_idx++) {
    1923           0 :                                 gfx_v9_4_2_select_se_sh(adev, se_idx, sh_idx,
    1924             :                                                         cu_idx);
    1925           0 :                                 WREG32_SOC15(GC, 0, regSQ_TIMEOUT_STATUS, 0);
    1926             :                         }
    1927             :                 }
    1928             :         }
    1929           0 :         gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
    1930           0 :         mutex_unlock(&adev->grbm_idx_mutex);
    1931           0 : }
    1932             : 
    1933           0 : static bool gfx_v9_4_2_query_uctl2_poison_status(struct amdgpu_device *adev)
    1934             : {
    1935           0 :         u32 status = 0;
    1936             :         struct amdgpu_vmhub *hub;
    1937             : 
    1938           0 :         hub = &adev->vmhub[AMDGPU_GFXHUB_0];
    1939           0 :         status = RREG32(hub->vm_l2_pro_fault_status);
    1940             :         /* reset page fault status */
    1941           0 :         WREG32_P(hub->vm_l2_pro_fault_cntl, 1, ~1);
    1942             : 
    1943           0 :         return REG_GET_FIELD(status, VM_L2_PROTECTION_FAULT_STATUS, FED);
    1944             : }
    1945             : 
    1946             : struct amdgpu_ras_block_hw_ops  gfx_v9_4_2_ras_ops = {
    1947             :                 .ras_error_inject = &gfx_v9_4_2_ras_error_inject,
    1948             :                 .query_ras_error_count = &gfx_v9_4_2_query_ras_error_count,
    1949             :                 .reset_ras_error_count = &gfx_v9_4_2_reset_ras_error_count,
    1950             :                 .query_ras_error_status = &gfx_v9_4_2_query_ras_error_status,
    1951             :                 .reset_ras_error_status = &gfx_v9_4_2_reset_ras_error_status,
    1952             : };
    1953             : 
    1954             : struct amdgpu_gfx_ras gfx_v9_4_2_ras = {
    1955             :         .ras_block = {
    1956             :                 .hw_ops = &gfx_v9_4_2_ras_ops,
    1957             :         },
    1958             :         .enable_watchdog_timer = &gfx_v9_4_2_enable_watchdog_timer,
    1959             :         .query_utcl2_poison_status = gfx_v9_4_2_query_uctl2_poison_status,
    1960             : };

Generated by: LCOV version 1.14