Linux Audio

Check our new training course

Loading...
v6.9.4
   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
  40enum 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
  49struct 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
  63static 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
  72static 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
  81static 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*/
  93static 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
 191const 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*/
 219static 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
 245const 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
 263static 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
 287const 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*/
 310static 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
 328const 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
 346static 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	total_size = (regs_size * 3 + 4 + 5 + 5) * 4;
 359	total_size = ALIGN(total_size, 256);
 360	shader_offset = total_size;
 361	total_size += ALIGN(shader_size, 256);
 362
 363	/* allocate an indirect buffer to put the commands in */
 364	memset(ib, 0, sizeof(*ib));
 365	r = amdgpu_ib_get(adev, NULL, total_size,
 366					AMDGPU_IB_POOL_DIRECT, ib);
 367	if (r) {
 368		dev_err(adev->dev, "failed to get ib (%d).\n", r);
 369		return r;
 370	}
 371
 372	/* load the compute shaders */
 373	for (i = 0; i < shader_size/sizeof(u32); i++)
 374		ib->ptr[i + (shader_offset / 4)] = shader_ptr[i];
 375
 376	/* init the ib length to 0 */
 377	ib->length_dw = 0;
 378
 379	/* write the register state for the compute dispatch */
 380	for (i = 0; i < regs_size; i++) {
 381		ib->ptr[ib->length_dw++] = PACKET3(PACKET3_SET_SH_REG, 1);
 382		ib->ptr[ib->length_dw++] = SOC15_REG_ENTRY_OFFSET(init_regs[i])
 383								- PACKET3_SET_SH_REG_START;
 384		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	gpu_addr = (ib->gpu_addr + (u64)shader_offset) >> 8;
 389	ib->ptr[ib->length_dw++] = PACKET3(PACKET3_SET_SH_REG, 2);
 390	ib->ptr[ib->length_dw++] = SOC15_REG_OFFSET(GC, 0, regCOMPUTE_PGM_LO)
 391							- PACKET3_SET_SH_REG_START;
 392	ib->ptr[ib->length_dw++] = lower_32_bits(gpu_addr);
 393	ib->ptr[ib->length_dw++] = upper_32_bits(gpu_addr);
 394
 395	/* write the wb buffer address */
 396	ib->ptr[ib->length_dw++] = PACKET3(PACKET3_SET_SH_REG, 3);
 397	ib->ptr[ib->length_dw++] = SOC15_REG_OFFSET(GC, 0, regCOMPUTE_USER_DATA_0)
 398							- PACKET3_SET_SH_REG_START;
 399	ib->ptr[ib->length_dw++] = lower_32_bits(wb_gpu_addr);
 400	ib->ptr[ib->length_dw++] = upper_32_bits(wb_gpu_addr);
 401	ib->ptr[ib->length_dw++] = pattern;
 402
 403	/* write dispatch packet */
 404	ib->ptr[ib->length_dw++] = PACKET3(PACKET3_DISPATCH_DIRECT, 3);
 405	ib->ptr[ib->length_dw++] = compute_dim_x; /* x */
 406	ib->ptr[ib->length_dw++] = 1; /* y */
 407	ib->ptr[ib->length_dw++] = 1; /* z */
 408	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	r = amdgpu_ib_schedule(ring, 1, ib, NULL, fence_ptr);
 413	if (r) {
 414		dev_err(adev->dev, "ib submit failed (%d).\n", r);
 415		amdgpu_ib_free(adev, ib, NULL);
 416	}
 417	return r;
 418}
 419
 420static 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	uint32_t offset = 0;
 424	char *str;
 425	int size;
 426
 427	str = kmalloc(256, GFP_KERNEL);
 428	if (!str)
 429		return;
 430
 431	dev_dbg(adev->dev, "wave assignment:\n");
 432
 433	for (se = 0; se < adev->gfx.config.max_shader_engines; se++) {
 434		for (cu = 0; cu < CU_ID_MAX; cu++) {
 435			memset(str, 0, 256);
 436			size = sprintf(str, "SE[%02d]CU[%02d]: ", se, cu);
 437			for (simd = 0; simd < SIMD_ID_MAX; simd++) {
 438				size += sprintf(str + size, "[");
 439				for (wave = 0; wave < WAVE_ID_MAX; wave++) {
 440					size += sprintf(str + size, "%x", wb_ptr[offset]);
 441					offset++;
 442				}
 443				size += sprintf(str + size, "]  ");
 444			}
 445			dev_dbg(adev->dev, "%s\n", str);
 446		}
 447	}
 448
 449	kfree(str);
 450}
 451
 452static 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	uint32_t loop = 0;
 458	uint32_t wave_cnt;
 459	uint32_t offset;
 460
 461	do {
 462		wave_cnt = 0;
 463		offset = 0;
 464
 465		for (se = 0; se < adev->gfx.config.max_shader_engines; se++)
 466			for (cu = 0; cu < CU_ID_MAX; cu++)
 467				for (simd = 0; simd < SIMD_ID_MAX; simd++)
 468					for (wave = 0; wave < WAVE_ID_MAX; wave++) {
 469						if (((1 << wave) & mask) &&
 470						    (wb_ptr[offset] == pattern))
 471							wave_cnt++;
 472
 473						offset++;
 474					}
 475
 476		if (wave_cnt == num_wave)
 477			return 0;
 478
 479		mdelay(1);
 480	} while (++loop < 2000 && wait);
 481
 482	dev_err(adev->dev, "actual wave num: %d, expected wave num: %d\n",
 483		wave_cnt, num_wave);
 484
 485	gfx_v9_4_2_log_wave_assignment(adev, wb_ptr);
 486
 487	return -EBADSLT;
 488}
 489
 490static int gfx_v9_4_2_do_sgprs_init(struct amdgpu_device *adev)
 491{
 492	int r;
 493	int wb_size = adev->gfx.config.max_shader_engines *
 494			 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	u32 pattern[3] = { 0x1, 0x5, 0xa };
 499
 500	/* bail if the compute ring is not ready */
 501	if (!adev->gfx.compute_ring[0].sched.ready ||
 502		 !adev->gfx.compute_ring[1].sched.ready)
 503		return 0;
 504
 505	/* allocate the write-back buffer from IB */
 506	memset(&wb_ib, 0, sizeof(wb_ib));
 507	r = amdgpu_ib_get(adev, NULL, (1 + wb_size) * sizeof(uint32_t),
 508			  AMDGPU_IB_POOL_DIRECT, &wb_ib);
 509	if (r) {
 510		dev_err(adev->dev, "failed to get ib (%d) for wb\n", r);
 511		return r;
 512	}
 513	memset(wb_ib.ptr, 0, (1 + wb_size) * sizeof(uint32_t));
 514
 515	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	if (r) {
 525		dev_err(adev->dev, "failed to clear first 224 sgprs\n");
 526		goto pro_end;
 527	}
 528
 529	r = gfx_v9_4_2_wait_for_waves_assigned(adev,
 530			&wb_ib.ptr[1], 0b11,
 531			pattern[0],
 532			adev->gfx.cu_info.number * SIMD_ID_MAX * 2,
 533			true);
 534	if (r) {
 535		dev_err(adev->dev, "wave coverage failed when clear first 224 sgprs\n");
 536		wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
 537		goto disp0_failed;
 538	}
 539
 540	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			adev->gfx.cu_info.number * 2,
 548			wb_ib.gpu_addr, pattern[1], &fences[1]);
 549	if (r) {
 550		dev_err(adev->dev, "failed to clear next 576 sgprs\n");
 551		goto disp0_failed;
 552	}
 553
 554	r = gfx_v9_4_2_wait_for_waves_assigned(adev,
 555			&wb_ib.ptr[1], 0b11111100,
 556			pattern[1], adev->gfx.cu_info.number * SIMD_ID_MAX * 6,
 557			true);
 558	if (r) {
 559		dev_err(adev->dev, "wave coverage failed when clear first 576 sgprs\n");
 560		wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
 561		goto disp1_failed;
 562	}
 563
 564	wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
 565
 566	/* wait for the GPU to finish processing the IB */
 567	r = dma_fence_wait(fences[0], false);
 568	if (r) {
 569		dev_err(adev->dev, "timeout to clear first 224 sgprs\n");
 570		goto disp1_failed;
 571	}
 572
 573	r = dma_fence_wait(fences[1], false);
 574	if (r) {
 575		dev_err(adev->dev, "timeout to clear first 576 sgprs\n");
 576		goto disp1_failed;
 577	}
 578
 579	memset(wb_ib.ptr, 0, (1 + wb_size) * sizeof(uint32_t));
 580	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	if (r) {
 590		dev_err(adev->dev, "failed to clear first 256 sgprs\n");
 591		goto disp1_failed;
 592	}
 593
 594	r = gfx_v9_4_2_wait_for_waves_assigned(adev,
 595			&wb_ib.ptr[1], 0b1111,
 596			pattern[2],
 597			adev->gfx.cu_info.number * SIMD_ID_MAX * 4,
 598			true);
 599	if (r) {
 600		dev_err(adev->dev, "wave coverage failed when clear first 256 sgprs\n");
 601		wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
 602		goto disp2_failed;
 603	}
 604
 605	wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
 606
 607	r = dma_fence_wait(fences[2], false);
 608	if (r) {
 609		dev_err(adev->dev, "timeout to clear first 256 sgprs\n");
 610		goto disp2_failed;
 611	}
 612
 613disp2_failed:
 614	amdgpu_ib_free(adev, &disp_ibs[2], NULL);
 615	dma_fence_put(fences[2]);
 616disp1_failed:
 617	amdgpu_ib_free(adev, &disp_ibs[1], NULL);
 618	dma_fence_put(fences[1]);
 619disp0_failed:
 620	amdgpu_ib_free(adev, &disp_ibs[0], NULL);
 621	dma_fence_put(fences[0]);
 622pro_end:
 623	amdgpu_ib_free(adev, &wb_ib, NULL);
 624
 625	if (r)
 626		dev_info(adev->dev, "Init SGPRS Failed\n");
 627	else
 628		dev_info(adev->dev, "Init SGPRS Successfully\n");
 629
 630	return r;
 631}
 632
 633static 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	int wb_size = adev->gfx.config.max_shader_engines *
 638			 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	u32 pattern = 0xa;
 643
 644	/* bail if the compute ring is not ready */
 645	if (!adev->gfx.compute_ring[0].sched.ready)
 646		return 0;
 647
 648	/* allocate the write-back buffer from IB */
 649	memset(&wb_ib, 0, sizeof(wb_ib));
 650	r = amdgpu_ib_get(adev, NULL, (1 + wb_size) * sizeof(uint32_t),
 651			  AMDGPU_IB_POOL_DIRECT, &wb_ib);
 652	if (r) {
 653		dev_err(adev->dev, "failed to get ib (%d) for wb.\n", r);
 654		return r;
 655	}
 656	memset(wb_ib.ptr, 0, (1 + wb_size) * sizeof(uint32_t));
 657
 658	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	if (r) {
 668		dev_err(adev->dev, "failed to clear vgprs\n");
 669		goto pro_end;
 670	}
 671
 672	/* wait for the GPU to finish processing the IB */
 673	r = dma_fence_wait(fence, false);
 674	if (r) {
 675		dev_err(adev->dev, "timeout to clear vgprs\n");
 676		goto disp_failed;
 677	}
 678
 679	r = gfx_v9_4_2_wait_for_waves_assigned(adev,
 680			&wb_ib.ptr[1], 0b1,
 681			pattern,
 682			adev->gfx.cu_info.number * SIMD_ID_MAX,
 683			false);
 684	if (r) {
 685		dev_err(adev->dev, "failed to cover all simds when clearing vgprs\n");
 686		goto disp_failed;
 687	}
 688
 689disp_failed:
 690	amdgpu_ib_free(adev, &disp_ib, NULL);
 691	dma_fence_put(fence);
 692pro_end:
 693	amdgpu_ib_free(adev, &wb_ib, NULL);
 694
 695	if (r)
 696		dev_info(adev->dev, "Init VGPRS Failed\n");
 697	else
 698		dev_info(adev->dev, "Init VGPRS Successfully\n");
 699
 700	return r;
 701}
 702
 703int gfx_v9_4_2_do_edc_gpr_workarounds(struct amdgpu_device *adev)
 704{
 705	/* only support when RAS is enabled */
 706	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	if (amdgpu_in_reset(adev))
 712		return 0;
 713
 714	gfx_v9_4_2_do_sgprs_init(adev);
 715
 716	gfx_v9_4_2_do_vgprs_init(adev);
 717
 718	return 0;
 719}
 720
 721static void gfx_v9_4_2_query_sq_timeout_status(struct amdgpu_device *adev);
 722static void gfx_v9_4_2_reset_sq_timeout_status(struct amdgpu_device *adev);
 723
 724void gfx_v9_4_2_init_golden_registers(struct amdgpu_device *adev,
 725				      uint32_t die_id)
 726{
 727	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	switch (die_id) {
 733	case 0:
 734		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		break;
 738	case 1:
 739		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		break;
 743	default:
 744		dev_warn(adev->dev,
 745			 "invalid die id %d, ignore channel fabricid remap settings\n",
 746			 die_id);
 747		break;
 748	}
 
 
 749}
 750
 751void gfx_v9_4_2_debug_trap_config_init(struct amdgpu_device *adev,
 752				uint32_t first_vmid,
 753				uint32_t last_vmid)
 754{
 755	uint32_t data;
 756	int i;
 757
 758	mutex_lock(&adev->srbm_mutex);
 759
 760	for (i = first_vmid; i < last_vmid; i++) {
 761		data = 0;
 762		soc15_grbm_select(adev, 0, 0, 0, i, 0);
 763		data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, TRAP_EN, 1);
 764		data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_EN, 0);
 765		data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_REPLACE,
 766					0);
 767		WREG32(SOC15_REG_OFFSET(GC, 0, regSPI_GDBG_PER_VMID_CNTL), data);
 768	}
 769
 770	soc15_grbm_select(adev, 0, 0, 0, 0, 0);
 771	mutex_unlock(&adev->srbm_mutex);
 772
 773	WREG32(SOC15_REG_OFFSET(GC, 0, regSPI_GDBG_TRAP_DATA0), 0);
 774	WREG32(SOC15_REG_OFFSET(GC, 0, regSPI_GDBG_TRAP_DATA1), 0);
 775}
 776
 777void gfx_v9_4_2_set_power_brake_sequence(struct amdgpu_device *adev)
 778{
 779	u32 tmp;
 780
 781	gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
 782
 783	tmp = 0;
 784	tmp = REG_SET_FIELD(tmp, GC_THROTTLE_CTRL, PATTERN_MODE, 1);
 785	WREG32_SOC15(GC, 0, regGC_THROTTLE_CTRL, tmp);
 786
 787	tmp = 0;
 788	tmp = REG_SET_FIELD(tmp, GC_THROTTLE_CTRL1, PWRBRK_STALL_EN, 1);
 789	WREG32_SOC15(GC, 0, regGC_THROTTLE_CTRL1, tmp);
 790
 791	WREG32_SOC15(GC, 0, regGC_CAC_IND_INDEX, ixPWRBRK_STALL_PATTERN_CTRL);
 792	tmp = 0;
 793	tmp = REG_SET_FIELD(tmp, PWRBRK_STALL_PATTERN_CTRL, PWRBRK_END_STEP, 0x12);
 794	WREG32_SOC15(GC, 0, regGC_CAC_IND_DATA, tmp);
 795}
 796
 797static const struct soc15_reg_entry gfx_v9_4_2_edc_counter_regs[] = {
 798	/* CPF */
 799	{ SOC15_REG_ENTRY(GC, 0, regCPF_EDC_ROQ_CNT), 0, 1, 1 },
 800	{ SOC15_REG_ENTRY(GC, 0, regCPF_EDC_TAG_CNT), 0, 1, 1 },
 801	/* CPC */
 802	{ SOC15_REG_ENTRY(GC, 0, regCPC_EDC_SCRATCH_CNT), 0, 1, 1 },
 803	{ SOC15_REG_ENTRY(GC, 0, regCPC_EDC_UCODE_CNT), 0, 1, 1 },
 804	{ SOC15_REG_ENTRY(GC, 0, regDC_EDC_STATE_CNT), 0, 1, 1 },
 805	{ SOC15_REG_ENTRY(GC, 0, regDC_EDC_CSINVOC_CNT), 0, 1, 1 },
 806	{ SOC15_REG_ENTRY(GC, 0, regDC_EDC_RESTORE_CNT), 0, 1, 1 },
 807	/* GDS */
 808	{ SOC15_REG_ENTRY(GC, 0, regGDS_EDC_CNT), 0, 1, 1 },
 809	{ SOC15_REG_ENTRY(GC, 0, regGDS_EDC_GRBM_CNT), 0, 1, 1 },
 810	{ SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 1, 1 },
 811	{ SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT), 0, 1, 1 },
 812	{ SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT), 0, 1, 1 },
 813	/* RLC */
 814	{ SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT), 0, 1, 1 },
 815	{ SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2), 0, 1, 1 },
 816	/* SPI */
 817	{ SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT), 0, 8, 1 },
 818	/* SQC */
 819	{ SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT), 0, 8, 7 },
 820	{ SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2), 0, 8, 7 },
 821	{ SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3), 0, 8, 7 },
 822	{ SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3), 0, 8, 7 },
 823	/* SQ */
 824	{ SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT), 0, 8, 14 },
 825	/* TCP */
 826	{ SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW), 0, 8, 14 },
 827	/* TCI */
 828	{ SOC15_REG_ENTRY(GC, 0, regTCI_EDC_CNT), 0, 1, 69 },
 829	/* TCC */
 830	{ SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT), 0, 1, 16 },
 831	{ SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2), 0, 1, 16 },
 832	/* TCA */
 833	{ SOC15_REG_ENTRY(GC, 0, regTCA_EDC_CNT), 0, 1, 2 },
 834	/* TCX */
 835	{ SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT), 0, 1, 2 },
 836	{ SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2), 0, 1, 2 },
 837	/* TD */
 838	{ SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT), 0, 8, 14 },
 839	/* TA */
 840	{ SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT), 0, 8, 14 },
 841	/* GCEA */
 842	{ SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT), 0, 1, 16 },
 843	{ SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2), 0, 1, 16 },
 844	{ SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 1, 16 },
 845};
 846
 847static void gfx_v9_4_2_select_se_sh(struct amdgpu_device *adev, u32 se_num,
 848				  u32 sh_num, u32 instance)
 849{
 850	u32 data;
 851
 852	if (instance == 0xffffffff)
 853		data = REG_SET_FIELD(0, GRBM_GFX_INDEX,
 854				     INSTANCE_BROADCAST_WRITES, 1);
 855	else
 856		data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_INDEX,
 857				     instance);
 858
 859	if (se_num == 0xffffffff)
 860		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_BROADCAST_WRITES,
 861				     1);
 862	else
 863		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num);
 864
 865	if (sh_num == 0xffffffff)
 866		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_BROADCAST_WRITES,
 867				     1);
 868	else
 869		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num);
 870
 871	WREG32_SOC15_RLC_SHADOW_EX(reg, GC, 0, regGRBM_GFX_INDEX, data);
 872}
 873
 874static const struct soc15_ras_field_entry gfx_v9_4_2_ras_fields[] = {
 875	/* CPF */
 876	{ "CPF_ROQ_ME2", SOC15_REG_ENTRY(GC, 0, regCPF_EDC_ROQ_CNT),
 877	  SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, SEC_COUNT_ME2),
 878	  SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, DED_COUNT_ME2) },
 879	{ "CPF_ROQ_ME1", SOC15_REG_ENTRY(GC, 0, regCPF_EDC_ROQ_CNT),
 880	  SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, SEC_COUNT_ME1),
 881	  SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, DED_COUNT_ME1) },
 882	{ "CPF_TCIU_TAG", SOC15_REG_ENTRY(GC, 0, regCPF_EDC_TAG_CNT),
 883	  SOC15_REG_FIELD(CPF_EDC_TAG_CNT, SEC_COUNT),
 884	  SOC15_REG_FIELD(CPF_EDC_TAG_CNT, DED_COUNT) },
 885
 886	/* CPC */
 887	{ "CPC_SCRATCH", SOC15_REG_ENTRY(GC, 0, regCPC_EDC_SCRATCH_CNT),
 888	  SOC15_REG_FIELD(CPC_EDC_SCRATCH_CNT, SEC_COUNT),
 889	  SOC15_REG_FIELD(CPC_EDC_SCRATCH_CNT, DED_COUNT) },
 890	{ "CPC_UCODE", SOC15_REG_ENTRY(GC, 0, regCPC_EDC_UCODE_CNT),
 891	  SOC15_REG_FIELD(CPC_EDC_UCODE_CNT, SEC_COUNT),
 892	  SOC15_REG_FIELD(CPC_EDC_UCODE_CNT, DED_COUNT) },
 893	{ "CPC_DC_STATE_RAM_ME1", SOC15_REG_ENTRY(GC, 0, regDC_EDC_STATE_CNT),
 894	  SOC15_REG_FIELD(DC_EDC_STATE_CNT, SEC_COUNT_ME1),
 895	  SOC15_REG_FIELD(DC_EDC_STATE_CNT, DED_COUNT_ME1) },
 896	{ "CPC_DC_CSINVOC_RAM_ME1",
 897	  SOC15_REG_ENTRY(GC, 0, regDC_EDC_CSINVOC_CNT),
 898	  SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, SEC_COUNT_ME1),
 899	  SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, DED_COUNT_ME1) },
 900	{ "CPC_DC_RESTORE_RAM_ME1",
 901	  SOC15_REG_ENTRY(GC, 0, regDC_EDC_RESTORE_CNT),
 902	  SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, SEC_COUNT_ME1),
 903	  SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, DED_COUNT_ME1) },
 904	{ "CPC_DC_CSINVOC_RAM1_ME1",
 905	  SOC15_REG_ENTRY(GC, 0, regDC_EDC_CSINVOC_CNT),
 906	  SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, SEC_COUNT1_ME1),
 907	  SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, DED_COUNT1_ME1) },
 908	{ "CPC_DC_RESTORE_RAM1_ME1",
 909	  SOC15_REG_ENTRY(GC, 0, regDC_EDC_RESTORE_CNT),
 910	  SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, SEC_COUNT1_ME1),
 911	  SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, DED_COUNT1_ME1) },
 912
 913	/* GDS */
 914	{ "GDS_GRBM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_GRBM_CNT),
 915	  SOC15_REG_FIELD(GDS_EDC_GRBM_CNT, SEC),
 916	  SOC15_REG_FIELD(GDS_EDC_GRBM_CNT, DED) },
 917	{ "GDS_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_CNT),
 918	  SOC15_REG_FIELD(GDS_EDC_CNT, GDS_MEM_SEC),
 919	  SOC15_REG_FIELD(GDS_EDC_CNT, GDS_MEM_DED) },
 920	{ "GDS_PHY_CMD_RAM_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT),
 921	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_CMD_RAM_MEM_SEC),
 922	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_CMD_RAM_MEM_DED) },
 923	{ "GDS_PHY_DATA_RAM_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT),
 924	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_DATA_RAM_MEM_SEC),
 925	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_DATA_RAM_MEM_DED) },
 926	{ "GDS_ME0_CS_PIPE_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT),
 927	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, ME0_CS_PIPE_MEM_SEC),
 928	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, ME0_CS_PIPE_MEM_DED) },
 929	{ "GDS_ME1_PIPE0_PIPE_MEM",
 930	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
 931	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE0_PIPE_MEM_SEC),
 932	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE0_PIPE_MEM_DED) },
 933	{ "GDS_ME1_PIPE1_PIPE_MEM",
 934	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
 935	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE1_PIPE_MEM_SEC),
 936	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE1_PIPE_MEM_DED) },
 937	{ "GDS_ME1_PIPE2_PIPE_MEM",
 938	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
 939	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE2_PIPE_MEM_SEC),
 940	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE2_PIPE_MEM_DED) },
 941	{ "GDS_ME1_PIPE3_PIPE_MEM",
 942	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
 943	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE3_PIPE_MEM_SEC),
 944	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE3_PIPE_MEM_DED) },
 945	{ "GDS_ME0_GFXHP3D_PIX_DED",
 946	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 947	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_GFXHP3D_PIX_DED) },
 948	{ "GDS_ME0_GFXHP3D_VTX_DED",
 949	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 950	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_GFXHP3D_VTX_DED) },
 951	{ "GDS_ME0_CS_DED",
 952	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 953	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_CS_DED) },
 954	{ "GDS_ME0_GFXHP3D_GS_DED",
 955	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 956	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_GFXHP3D_GS_DED) },
 957	{ "GDS_ME1_PIPE0_DED",
 958	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 959	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE0_DED) },
 960	{ "GDS_ME1_PIPE1_DED",
 961	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 962	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE1_DED) },
 963	{ "GDS_ME1_PIPE2_DED",
 964	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 965	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE2_DED) },
 966	{ "GDS_ME1_PIPE3_DED",
 967	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 968	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE3_DED) },
 969	{ "GDS_ME2_PIPE0_DED",
 970	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 971	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE0_DED) },
 972	{ "GDS_ME2_PIPE1_DED",
 973	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 974	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE1_DED) },
 975	{ "GDS_ME2_PIPE2_DED",
 976	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 977	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE2_DED) },
 978	{ "GDS_ME2_PIPE3_DED",
 979	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 980	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE3_DED) },
 981
 982	/* RLC */
 983	{ "RLCG_INSTR_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
 984	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_INSTR_RAM_SEC_COUNT),
 985	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_INSTR_RAM_DED_COUNT) },
 986	{ "RLCG_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
 987	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_SCRATCH_RAM_SEC_COUNT),
 988	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_SCRATCH_RAM_DED_COUNT) },
 989	{ "RLCV_INSTR_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
 990	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_INSTR_RAM_SEC_COUNT),
 991	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_INSTR_RAM_DED_COUNT) },
 992	{ "RLCV_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
 993	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_SCRATCH_RAM_SEC_COUNT),
 994	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_SCRATCH_RAM_DED_COUNT) },
 995	{ "RLC_TCTAG_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
 996	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_TCTAG_RAM_SEC_COUNT),
 997	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_TCTAG_RAM_DED_COUNT) },
 998	{ "RLC_SPM_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
 999	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SPM_SCRATCH_RAM_SEC_COUNT),
1000	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SPM_SCRATCH_RAM_DED_COUNT) },
1001	{ "RLC_SRM_DATA_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
1002	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_DATA_RAM_SEC_COUNT),
1003	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_DATA_RAM_DED_COUNT) },
1004	{ "RLC_SRM_ADDR_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
1005	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_ADDR_RAM_SEC_COUNT),
1006	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_ADDR_RAM_DED_COUNT) },
1007	{ "RLC_SPM_SE0_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1008	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE0_SCRATCH_RAM_SEC_COUNT),
1009	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE0_SCRATCH_RAM_DED_COUNT) },
1010	{ "RLC_SPM_SE1_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1011	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE1_SCRATCH_RAM_SEC_COUNT),
1012	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE1_SCRATCH_RAM_DED_COUNT) },
1013	{ "RLC_SPM_SE2_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1014	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE2_SCRATCH_RAM_SEC_COUNT),
1015	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE2_SCRATCH_RAM_DED_COUNT) },
1016	{ "RLC_SPM_SE3_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1017	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE3_SCRATCH_RAM_SEC_COUNT),
1018	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE3_SCRATCH_RAM_DED_COUNT) },
1019	{ "RLC_SPM_SE4_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1020	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE4_SCRATCH_RAM_SEC_COUNT),
1021	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE4_SCRATCH_RAM_DED_COUNT) },
1022	{ "RLC_SPM_SE5_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1023	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE5_SCRATCH_RAM_SEC_COUNT),
1024	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE5_SCRATCH_RAM_DED_COUNT) },
1025	{ "RLC_SPM_SE6_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1026	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE6_SCRATCH_RAM_SEC_COUNT),
1027	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE6_SCRATCH_RAM_DED_COUNT) },
1028	{ "RLC_SPM_SE7_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1029	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE7_SCRATCH_RAM_SEC_COUNT),
1030	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE7_SCRATCH_RAM_DED_COUNT) },
1031
1032	/* SPI */
1033	{ "SPI_SR_MEM", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
1034	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_SR_MEM_SEC_COUNT),
1035	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_SR_MEM_DED_COUNT) },
1036	{ "SPI_GDS_EXPREQ", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
1037	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_GDS_EXPREQ_SEC_COUNT),
1038	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_GDS_EXPREQ_DED_COUNT) },
1039	{ "SPI_WB_GRANT_30", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
1040	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_WB_GRANT_30_SEC_COUNT),
1041	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_WB_GRANT_30_DED_COUNT) },
1042	{ "SPI_LIFE_CNT", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
1043	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_LIFE_CNT_SEC_COUNT),
1044	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_LIFE_CNT_DED_COUNT) },
1045
1046	/* SQC - regSQC_EDC_CNT */
1047	{ "SQC_DATA_CU0_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1048	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_WRITE_DATA_BUF_SEC_COUNT),
1049	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_WRITE_DATA_BUF_DED_COUNT) },
1050	{ "SQC_DATA_CU0_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1051	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_UTCL1_LFIFO_SEC_COUNT),
1052	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_UTCL1_LFIFO_DED_COUNT) },
1053	{ "SQC_DATA_CU1_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1054	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_WRITE_DATA_BUF_SEC_COUNT),
1055	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_WRITE_DATA_BUF_DED_COUNT) },
1056	{ "SQC_DATA_CU1_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1057	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_UTCL1_LFIFO_SEC_COUNT),
1058	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_UTCL1_LFIFO_DED_COUNT) },
1059	{ "SQC_DATA_CU2_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1060	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_WRITE_DATA_BUF_SEC_COUNT),
1061	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_WRITE_DATA_BUF_DED_COUNT) },
1062	{ "SQC_DATA_CU2_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1063	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_UTCL1_LFIFO_SEC_COUNT),
1064	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_UTCL1_LFIFO_DED_COUNT) },
1065	{ "SQC_DATA_CU3_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1066	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_WRITE_DATA_BUF_SEC_COUNT),
1067	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_WRITE_DATA_BUF_DED_COUNT) },
1068	{ "SQC_DATA_CU3_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1069	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_UTCL1_LFIFO_SEC_COUNT),
1070	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_UTCL1_LFIFO_DED_COUNT) },
1071
1072	/* SQC - regSQC_EDC_CNT2 */
1073	{ "SQC_INST_BANKA_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1074	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_TAG_RAM_SEC_COUNT),
1075	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_TAG_RAM_DED_COUNT) },
1076	{ "SQC_INST_BANKA_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1077	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_BANK_RAM_SEC_COUNT),
1078	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_BANK_RAM_DED_COUNT) },
1079	{ "SQC_DATA_BANKA_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1080	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_TAG_RAM_SEC_COUNT),
1081	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_TAG_RAM_DED_COUNT) },
1082	{ "SQC_DATA_BANKA_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1083	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_BANK_RAM_SEC_COUNT),
1084	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_BANK_RAM_DED_COUNT) },
1085	{ "SQC_INST_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1086	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_UTCL1_LFIFO_SEC_COUNT),
1087	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_UTCL1_LFIFO_DED_COUNT) },
1088	{ "SQC_DATA_BANKA_DIRTY_BIT_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1089	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_DIRTY_BIT_RAM_SEC_COUNT),
1090	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_DIRTY_BIT_RAM_DED_COUNT) },
1091
1092	/* SQC - regSQC_EDC_CNT3 */
1093	{ "SQC_INST_BANKB_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
1094	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_TAG_RAM_SEC_COUNT),
1095	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_TAG_RAM_DED_COUNT) },
1096	{ "SQC_INST_BANKB_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
1097	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_BANK_RAM_SEC_COUNT),
1098	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_BANK_RAM_DED_COUNT) },
1099	{ "SQC_DATA_BANKB_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
1100	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_TAG_RAM_SEC_COUNT),
1101	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_TAG_RAM_DED_COUNT) },
1102	{ "SQC_DATA_BANKB_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
1103	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_BANK_RAM_SEC_COUNT),
1104	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_BANK_RAM_DED_COUNT) },
1105	{ "SQC_DATA_BANKB_DIRTY_BIT_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
1106	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_DIRTY_BIT_RAM_SEC_COUNT),
1107	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_DIRTY_BIT_RAM_DED_COUNT) },
1108
1109	/* SQC - regSQC_EDC_PARITY_CNT3 */
1110	{ "SQC_INST_BANKA_UTCL1_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1111	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_UTCL1_MISS_FIFO_SEC_COUNT),
1112	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_UTCL1_MISS_FIFO_DED_COUNT) },
1113	{ "SQC_INST_BANKA_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1114	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_MISS_FIFO_SEC_COUNT),
1115	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_MISS_FIFO_DED_COUNT) },
1116	{ "SQC_DATA_BANKA_HIT_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1117	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_HIT_FIFO_SEC_COUNT),
1118	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_HIT_FIFO_DED_COUNT) },
1119	{ "SQC_DATA_BANKA_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1120	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_MISS_FIFO_SEC_COUNT),
1121	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_MISS_FIFO_DED_COUNT) },
1122	{ "SQC_INST_BANKB_UTCL1_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1123	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_UTCL1_MISS_FIFO_SEC_COUNT),
1124	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_UTCL1_MISS_FIFO_DED_COUNT) },
1125	{ "SQC_INST_BANKB_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1126	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_MISS_FIFO_SEC_COUNT),
1127	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_MISS_FIFO_DED_COUNT) },
1128	{ "SQC_DATA_BANKB_HIT_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1129	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_HIT_FIFO_SEC_COUNT),
1130	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_HIT_FIFO_DED_COUNT) },
1131	{ "SQC_DATA_BANKB_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1132	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_MISS_FIFO_SEC_COUNT),
1133	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_MISS_FIFO_DED_COUNT) },
1134
1135	/* SQ */
1136	{ "SQ_LDS_D", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1137	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_D_SEC_COUNT),
1138	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_D_DED_COUNT) },
1139	{ "SQ_LDS_I", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1140	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_I_SEC_COUNT),
1141	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_I_DED_COUNT) },
1142	{ "SQ_SGPR", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1143	  SOC15_REG_FIELD(SQ_EDC_CNT, SGPR_SEC_COUNT),
1144	  SOC15_REG_FIELD(SQ_EDC_CNT, SGPR_DED_COUNT) },
1145	{ "SQ_VGPR0", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1146	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR0_SEC_COUNT),
1147	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR0_DED_COUNT) },
1148	{ "SQ_VGPR1", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1149	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR1_SEC_COUNT),
1150	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR1_DED_COUNT) },
1151	{ "SQ_VGPR2", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1152	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR2_SEC_COUNT),
1153	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR2_DED_COUNT) },
1154	{ "SQ_VGPR3", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1155	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR3_SEC_COUNT),
1156	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR3_DED_COUNT) },
1157
1158	/* TCP */
1159	{ "TCP_CACHE_RAM", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1160	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CACHE_RAM_SEC_COUNT),
1161	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CACHE_RAM_DED_COUNT) },
1162	{ "TCP_LFIFO_RAM", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1163	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, LFIFO_RAM_SEC_COUNT),
1164	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, LFIFO_RAM_DED_COUNT) },
1165	{ "TCP_CMD_FIFO", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1166	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CMD_FIFO_SEC_COUNT),
1167	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CMD_FIFO_DED_COUNT) },
1168	{ "TCP_VM_FIFO", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1169	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, VM_FIFO_SEC_COUNT),
1170	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, VM_FIFO_DED_COUNT) },
1171	{ "TCP_DB_RAM", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1172	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, DB_RAM_SEC_COUNT),
1173	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, DB_RAM_DED_COUNT) },
1174	{ "TCP_UTCL1_LFIFO0", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1175	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO0_SEC_COUNT),
1176	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO0_DED_COUNT) },
1177	{ "TCP_UTCL1_LFIFO1", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1178	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO1_SEC_COUNT),
1179	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO1_DED_COUNT) },
1180
1181	/* TCI */
1182	{ "TCI_WRITE_RAM", SOC15_REG_ENTRY(GC, 0, regTCI_EDC_CNT),
1183	  SOC15_REG_FIELD(TCI_EDC_CNT, WRITE_RAM_SEC_COUNT),
1184	  SOC15_REG_FIELD(TCI_EDC_CNT, WRITE_RAM_DED_COUNT) },
1185
1186	/* TCC */
1187	{ "TCC_CACHE_DATA", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1188	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DATA_SEC_COUNT),
1189	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DATA_DED_COUNT) },
1190	{ "TCC_CACHE_DIRTY", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1191	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DIRTY_SEC_COUNT),
1192	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DIRTY_DED_COUNT) },
1193	{ "TCC_HIGH_RATE_TAG", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1194	  SOC15_REG_FIELD(TCC_EDC_CNT, HIGH_RATE_TAG_SEC_COUNT),
1195	  SOC15_REG_FIELD(TCC_EDC_CNT, HIGH_RATE_TAG_DED_COUNT) },
1196	{ "TCC_LOW_RATE_TAG", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1197	  SOC15_REG_FIELD(TCC_EDC_CNT, LOW_RATE_TAG_SEC_COUNT),
1198	  SOC15_REG_FIELD(TCC_EDC_CNT, LOW_RATE_TAG_DED_COUNT) },
1199	{ "TCC_SRC_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1200	  SOC15_REG_FIELD(TCC_EDC_CNT, SRC_FIFO_SEC_COUNT),
1201	  SOC15_REG_FIELD(TCC_EDC_CNT, SRC_FIFO_DED_COUNT) },
1202	{ "TCC_LATENCY_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1203	  SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_SEC_COUNT),
1204	  SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_DED_COUNT) },
1205	{ "TCC_LATENCY_FIFO_NEXT_RAM", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1206	  SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_NEXT_RAM_SEC_COUNT),
1207	  SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_NEXT_RAM_DED_COUNT) },
1208	{ "TCC_CACHE_TAG_PROBE_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1209	  SOC15_REG_FIELD(TCC_EDC_CNT2, CACHE_TAG_PROBE_FIFO_SEC_COUNT),
1210	  SOC15_REG_FIELD(TCC_EDC_CNT2, CACHE_TAG_PROBE_FIFO_DED_COUNT) },
1211	{ "TCC_UC_ATOMIC_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1212	  SOC15_REG_FIELD(TCC_EDC_CNT2, UC_ATOMIC_FIFO_SEC_COUNT),
1213	  SOC15_REG_FIELD(TCC_EDC_CNT2, UC_ATOMIC_FIFO_DED_COUNT) },
1214	{ "TCC_WRITE_CACHE_READ", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1215	  SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_CACHE_READ_SEC_COUNT),
1216	  SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_CACHE_READ_DED_COUNT) },
1217	{ "TCC_RETURN_CONTROL", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1218	  SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_CONTROL_SEC_COUNT),
1219	  SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_CONTROL_DED_COUNT) },
1220	{ "TCC_IN_USE_TRANSFER", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1221	  SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_TRANSFER_SEC_COUNT),
1222	  SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_TRANSFER_DED_COUNT) },
1223	{ "TCC_IN_USE_DEC", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1224	  SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_DEC_SEC_COUNT),
1225	  SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_DEC_DED_COUNT) },
1226	{ "TCC_WRITE_RETURN", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1227	  SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_RETURN_SEC_COUNT),
1228	  SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_RETURN_DED_COUNT) },
1229	{ "TCC_RETURN_DATA", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1230	  SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_DATA_SEC_COUNT),
1231	  SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_DATA_DED_COUNT) },
1232
1233	/* TCA */
1234	{ "TCA_HOLE_FIFO", SOC15_REG_ENTRY(GC, 0, regTCA_EDC_CNT),
1235	  SOC15_REG_FIELD(TCA_EDC_CNT, HOLE_FIFO_SEC_COUNT),
1236	  SOC15_REG_FIELD(TCA_EDC_CNT, HOLE_FIFO_DED_COUNT) },
1237	{ "TCA_REQ_FIFO", SOC15_REG_ENTRY(GC, 0, regTCA_EDC_CNT),
1238	  SOC15_REG_FIELD(TCA_EDC_CNT, REQ_FIFO_SEC_COUNT),
1239	  SOC15_REG_FIELD(TCA_EDC_CNT, REQ_FIFO_DED_COUNT) },
1240
1241	/* TCX */
1242	{ "TCX_GROUP0", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1243	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP0_SEC_COUNT),
1244	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP0_DED_COUNT) },
1245	{ "TCX_GROUP1", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1246	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP1_SEC_COUNT),
1247	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP1_DED_COUNT) },
1248	{ "TCX_GROUP2", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1249	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP2_SEC_COUNT),
1250	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP2_DED_COUNT) },
1251	{ "TCX_GROUP3", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1252	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP3_SEC_COUNT),
1253	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP3_DED_COUNT) },
1254	{ "TCX_GROUP4", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1255	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP4_SEC_COUNT),
1256	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP4_DED_COUNT) },
1257	{ "TCX_GROUP5", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1258	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP5_SED_COUNT), 0, 0 },
1259	{ "TCX_GROUP6", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1260	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP6_SED_COUNT), 0, 0 },
1261	{ "TCX_GROUP7", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1262	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP7_SED_COUNT), 0, 0 },
1263	{ "TCX_GROUP8", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1264	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP8_SED_COUNT), 0, 0 },
1265	{ "TCX_GROUP9", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1266	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP9_SED_COUNT), 0, 0 },
1267	{ "TCX_GROUP10", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1268	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP10_SED_COUNT), 0, 0 },
1269	{ "TCX_GROUP11", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
1270	  SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP11_SED_COUNT), 0, 0 },
1271	{ "TCX_GROUP12", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
1272	  SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP12_SED_COUNT), 0, 0 },
1273	{ "TCX_GROUP13", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
1274	  SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP13_SED_COUNT), 0, 0 },
1275	{ "TCX_GROUP14", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
1276	  SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP14_SED_COUNT), 0, 0 },
1277
1278	/* TD */
1279	{ "TD_SS_FIFO_LO", SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT),
1280	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_LO_SEC_COUNT),
1281	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_LO_DED_COUNT) },
1282	{ "TD_SS_FIFO_HI", SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT),
1283	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_HI_SEC_COUNT),
1284	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_HI_DED_COUNT) },
1285	{ "TD_CS_FIFO", SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT),
1286	  SOC15_REG_FIELD(TD_EDC_CNT, CS_FIFO_SEC_COUNT),
1287	  SOC15_REG_FIELD(TD_EDC_CNT, CS_FIFO_DED_COUNT) },
1288
1289	/* TA */
1290	{ "TA_FS_DFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1291	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_DFIFO_SEC_COUNT),
1292	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_DFIFO_DED_COUNT) },
1293	{ "TA_FS_AFIFO_LO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1294	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_LO_SEC_COUNT),
1295	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_LO_DED_COUNT) },
1296	{ "TA_FL_LFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1297	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FL_LFIFO_SEC_COUNT),
1298	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FL_LFIFO_DED_COUNT) },
1299	{ "TA_FX_LFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1300	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FX_LFIFO_SEC_COUNT),
1301	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FX_LFIFO_DED_COUNT) },
1302	{ "TA_FS_CFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1303	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_CFIFO_SEC_COUNT),
1304	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_CFIFO_DED_COUNT) },
1305	{ "TA_FS_AFIFO_HI", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1306	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_HI_SEC_COUNT),
1307	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_HI_DED_COUNT) },
1308
1309	/* EA - regGCEA_EDC_CNT */
1310	{ "EA_DRAMRD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1311	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_CMDMEM_SEC_COUNT),
1312	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_CMDMEM_DED_COUNT) },
1313	{ "EA_DRAMWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1314	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_CMDMEM_SEC_COUNT),
1315	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_CMDMEM_DED_COUNT) },
1316	{ "EA_DRAMWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1317	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_DATAMEM_SEC_COUNT),
1318	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_DATAMEM_DED_COUNT) },
1319	{ "EA_RRET_TAGMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1320	  SOC15_REG_FIELD(GCEA_EDC_CNT, RRET_TAGMEM_SEC_COUNT),
1321	  SOC15_REG_FIELD(GCEA_EDC_CNT, RRET_TAGMEM_DED_COUNT) },
1322	{ "EA_WRET_TAGMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1323	  SOC15_REG_FIELD(GCEA_EDC_CNT, WRET_TAGMEM_SEC_COUNT),
1324	  SOC15_REG_FIELD(GCEA_EDC_CNT, WRET_TAGMEM_DED_COUNT) },
1325	{ "EA_IOWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1326	  SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_DATAMEM_SEC_COUNT),
1327	  SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_DATAMEM_DED_COUNT) },
1328	{ "EA_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1329	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_PAGEMEM_SED_COUNT), 0, 0 },
1330	{ "EA_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1331	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_PAGEMEM_SED_COUNT), 0, 0 },
1332	{ "EA_IORD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1333	  SOC15_REG_FIELD(GCEA_EDC_CNT, IORD_CMDMEM_SED_COUNT), 0, 0 },
1334	{ "EA_IOWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1335	  SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_CMDMEM_SED_COUNT), 0, 0 },
1336
1337	/* EA - regGCEA_EDC_CNT2 */
1338	{ "EA_GMIRD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1339	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_CMDMEM_SEC_COUNT),
1340	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_CMDMEM_DED_COUNT) },
1341	{ "EA_GMIWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1342	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_CMDMEM_SEC_COUNT),
1343	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_CMDMEM_DED_COUNT) },
1344	{ "EA_GMIWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1345	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_DATAMEM_SEC_COUNT),
1346	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_DATAMEM_DED_COUNT) },
1347	{ "EA_GMIRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1348	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_PAGEMEM_SED_COUNT), 0, 0 },
1349	{ "EA_GMIWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1350	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_PAGEMEM_SED_COUNT), 0, 0 },
1351	{ "EA_MAM_D0MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1352	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D0MEM_SED_COUNT),
1353	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D0MEM_DED_COUNT) },
1354	{ "EA_MAM_D1MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1355	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D1MEM_SED_COUNT),
1356	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D1MEM_DED_COUNT) },
1357	{ "EA_MAM_D2MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1358	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D2MEM_SED_COUNT),
1359	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D2MEM_DED_COUNT) },
1360	{ "EA_MAM_D3MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1361	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D3MEM_SED_COUNT),
1362	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D3MEM_DED_COUNT) },
1363
1364	/* EA - regGCEA_EDC_CNT3 */
1365	{ "EA_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1366	  SOC15_REG_FIELD(GCEA_EDC_CNT3, DRAMRD_PAGEMEM_DED_COUNT) },
1367	{ "EA_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1368	  SOC15_REG_FIELD(GCEA_EDC_CNT3, DRAMWR_PAGEMEM_DED_COUNT) },
1369	{ "EA_IORD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1370	  SOC15_REG_FIELD(GCEA_EDC_CNT3, IORD_CMDMEM_DED_COUNT) },
1371	{ "EA_IOWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1372	  SOC15_REG_FIELD(GCEA_EDC_CNT3, IOWR_CMDMEM_DED_COUNT) },
1373	{ "EA_GMIRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1374	  SOC15_REG_FIELD(GCEA_EDC_CNT3, GMIRD_PAGEMEM_DED_COUNT) },
1375	{ "EA_GMIWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1376	  SOC15_REG_FIELD(GCEA_EDC_CNT3, GMIWR_PAGEMEM_DED_COUNT) },
1377	{ "EA_MAM_A0MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
1378	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A0MEM_SEC_COUNT),
1379	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A0MEM_DED_COUNT) },
1380	{ "EA_MAM_A1MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
1381	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A1MEM_SEC_COUNT),
1382	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A1MEM_DED_COUNT) },
1383	{ "EA_MAM_A2MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
1384	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A2MEM_SEC_COUNT),
1385	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A2MEM_DED_COUNT) },
1386	{ "EA_MAM_A3MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
1387	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A3MEM_SEC_COUNT),
1388	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A3MEM_DED_COUNT) },
1389	{ "EA_MAM_AFMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
1390	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_AFMEM_SEC_COUNT),
1391	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_AFMEM_DED_COUNT) },
1392};
1393
1394static const char * const vml2_walker_mems[] = {
1395	"UTC_VML2_CACHE_PDE0_MEM0",
1396	"UTC_VML2_CACHE_PDE0_MEM1",
1397	"UTC_VML2_CACHE_PDE1_MEM0",
1398	"UTC_VML2_CACHE_PDE1_MEM1",
1399	"UTC_VML2_CACHE_PDE2_MEM0",
1400	"UTC_VML2_CACHE_PDE2_MEM1",
1401	"UTC_VML2_RDIF_ARADDRS",
1402	"UTC_VML2_RDIF_LOG_FIFO",
1403	"UTC_VML2_QUEUE_REQ",
1404	"UTC_VML2_QUEUE_RET",
1405};
1406
1407static struct gfx_v9_4_2_utc_block gfx_v9_4_2_utc_blocks[] = {
1408	{ VML2_MEM, 8, 2, 2,
1409	  { SOC15_REG_ENTRY(GC, 0, regVML2_MEM_ECC_INDEX) },
1410	  { SOC15_REG_ENTRY(GC, 0, regVML2_MEM_ECC_CNTL) },
1411	  SOC15_REG_FIELD(VML2_MEM_ECC_CNTL, SEC_COUNT),
1412	  SOC15_REG_FIELD(VML2_MEM_ECC_CNTL, DED_COUNT),
1413	  REG_SET_FIELD(0, VML2_MEM_ECC_CNTL, WRITE_COUNTERS, 1) },
1414	{ VML2_WALKER_MEM, ARRAY_SIZE(vml2_walker_mems), 1, 1,
1415	  { SOC15_REG_ENTRY(GC, 0, regVML2_WALKER_MEM_ECC_INDEX) },
1416	  { SOC15_REG_ENTRY(GC, 0, regVML2_WALKER_MEM_ECC_CNTL) },
1417	  SOC15_REG_FIELD(VML2_WALKER_MEM_ECC_CNTL, SEC_COUNT),
1418	  SOC15_REG_FIELD(VML2_WALKER_MEM_ECC_CNTL, DED_COUNT),
1419	  REG_SET_FIELD(0, VML2_WALKER_MEM_ECC_CNTL, WRITE_COUNTERS, 1) },
1420	{ UTCL2_MEM, 18, 1, 2,
1421	  { SOC15_REG_ENTRY(GC, 0, regUTCL2_MEM_ECC_INDEX) },
1422	  { SOC15_REG_ENTRY(GC, 0, regUTCL2_MEM_ECC_CNTL) },
1423	  SOC15_REG_FIELD(UTCL2_MEM_ECC_CNTL, SEC_COUNT),
1424	  SOC15_REG_FIELD(UTCL2_MEM_ECC_CNTL, DED_COUNT),
1425	  REG_SET_FIELD(0, UTCL2_MEM_ECC_CNTL, WRITE_COUNTERS, 1) },
1426	{ ATC_L2_CACHE_2M, 8, 2, 1,
1427	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_2M_DSM_INDEX) },
1428	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_2M_DSM_CNTL) },
1429	  SOC15_REG_FIELD(ATC_L2_CACHE_2M_DSM_CNTL, SEC_COUNT),
1430	  SOC15_REG_FIELD(ATC_L2_CACHE_2M_DSM_CNTL, DED_COUNT),
1431	  REG_SET_FIELD(0, ATC_L2_CACHE_2M_DSM_CNTL, WRITE_COUNTERS, 1) },
1432	{ ATC_L2_CACHE_32K, 8, 2, 2,
1433	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_32K_DSM_INDEX) },
1434	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_32K_DSM_CNTL) },
1435	  SOC15_REG_FIELD(ATC_L2_CACHE_32K_DSM_CNTL, SEC_COUNT),
1436	  SOC15_REG_FIELD(ATC_L2_CACHE_32K_DSM_CNTL, DED_COUNT),
1437	  REG_SET_FIELD(0, ATC_L2_CACHE_32K_DSM_CNTL, WRITE_COUNTERS, 1) },
1438	{ ATC_L2_CACHE_4K, 8, 2, 8,
1439	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_4K_DSM_INDEX) },
1440	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_4K_DSM_CNTL) },
1441	  SOC15_REG_FIELD(ATC_L2_CACHE_4K_DSM_CNTL, SEC_COUNT),
1442	  SOC15_REG_FIELD(ATC_L2_CACHE_4K_DSM_CNTL, DED_COUNT),
1443	  REG_SET_FIELD(0, ATC_L2_CACHE_4K_DSM_CNTL, WRITE_COUNTERS, 1) },
1444};
1445
1446static const struct soc15_reg_entry gfx_v9_4_2_ea_err_status_regs = {
1447	SOC15_REG_ENTRY(GC, 0, regGCEA_ERR_STATUS), 0, 1, 16
1448};
1449
1450static int gfx_v9_4_2_get_reg_error_count(struct amdgpu_device *adev,
1451					  const struct soc15_reg_entry *reg,
1452					  uint32_t se_id, uint32_t inst_id,
1453					  uint32_t value, uint32_t *sec_count,
1454					  uint32_t *ded_count)
1455{
1456	uint32_t i;
1457	uint32_t sec_cnt, ded_cnt;
1458
1459	for (i = 0; i < ARRAY_SIZE(gfx_v9_4_2_ras_fields); i++) {
1460		if (gfx_v9_4_2_ras_fields[i].reg_offset != reg->reg_offset ||
1461		    gfx_v9_4_2_ras_fields[i].seg != reg->seg ||
1462		    gfx_v9_4_2_ras_fields[i].inst != reg->inst)
1463			continue;
1464
1465		sec_cnt = SOC15_RAS_REG_FIELD_VAL(
1466			value, gfx_v9_4_2_ras_fields[i], sec);
1467		if (sec_cnt) {
1468			dev_info(adev->dev,
1469				 "GFX SubBlock %s, Instance[%d][%d], SEC %d\n",
1470				 gfx_v9_4_2_ras_fields[i].name, se_id, inst_id,
1471				 sec_cnt);
1472			*sec_count += sec_cnt;
1473		}
1474
1475		ded_cnt = SOC15_RAS_REG_FIELD_VAL(
1476			value, gfx_v9_4_2_ras_fields[i], ded);
1477		if (ded_cnt) {
1478			dev_info(adev->dev,
1479				 "GFX SubBlock %s, Instance[%d][%d], DED %d\n",
1480				 gfx_v9_4_2_ras_fields[i].name, se_id, inst_id,
1481				 ded_cnt);
1482			*ded_count += ded_cnt;
1483		}
1484	}
1485
1486	return 0;
1487}
1488
1489static int gfx_v9_4_2_query_sram_edc_count(struct amdgpu_device *adev,
1490				uint32_t *sec_count, uint32_t *ded_count)
1491{
1492	uint32_t i, j, k, data;
1493	uint32_t sec_cnt = 0, ded_cnt = 0;
1494
1495	if (sec_count && ded_count) {
1496		*sec_count = 0;
1497		*ded_count = 0;
1498	}
1499
1500	mutex_lock(&adev->grbm_idx_mutex);
1501
1502	for (i = 0; i < ARRAY_SIZE(gfx_v9_4_2_edc_counter_regs); i++) {
1503		for (j = 0; j < gfx_v9_4_2_edc_counter_regs[i].se_num; j++) {
1504			for (k = 0; k < gfx_v9_4_2_edc_counter_regs[i].instance;
1505			     k++) {
1506				gfx_v9_4_2_select_se_sh(adev, j, 0, k);
1507
1508				/* if sec/ded_count is null, just clear counter */
1509				if (!sec_count || !ded_count) {
1510					WREG32(SOC15_REG_ENTRY_OFFSET(
1511						gfx_v9_4_2_edc_counter_regs[i]), 0);
1512					continue;
1513				}
1514
1515				data = RREG32(SOC15_REG_ENTRY_OFFSET(
1516					gfx_v9_4_2_edc_counter_regs[i]));
1517
1518				if (!data)
1519					continue;
1520
1521				gfx_v9_4_2_get_reg_error_count(adev,
1522					&gfx_v9_4_2_edc_counter_regs[i],
1523					j, k, data, &sec_cnt, &ded_cnt);
1524
1525				/* clear counter after read */
1526				WREG32(SOC15_REG_ENTRY_OFFSET(
1527					gfx_v9_4_2_edc_counter_regs[i]), 0);
1528			}
1529		}
1530	}
1531
1532	if (sec_count && ded_count) {
1533		*sec_count += sec_cnt;
1534		*ded_count += ded_cnt;
1535	}
1536
1537	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1538	mutex_unlock(&adev->grbm_idx_mutex);
1539
1540	return 0;
1541}
1542
1543static void gfx_v9_4_2_log_utc_edc_count(struct amdgpu_device *adev,
1544					 struct gfx_v9_4_2_utc_block *blk,
1545					 uint32_t instance, uint32_t sec_cnt,
1546					 uint32_t ded_cnt)
1547{
1548	uint32_t bank, way, mem;
1549	static const char * const vml2_way_str[] = { "BIGK", "4K" };
1550	static const char * const utcl2_rounter_str[] = { "VMC", "APT" };
1551
1552	mem = instance % blk->num_mem_blocks;
1553	way = (instance / blk->num_mem_blocks) % blk->num_ways;
1554	bank = instance / (blk->num_mem_blocks * blk->num_ways);
1555
1556	switch (blk->type) {
1557	case VML2_MEM:
1558		dev_info(
1559			adev->dev,
1560			"GFX SubBlock UTC_VML2_BANK_CACHE_%d_%s_MEM%d, SED %d, DED %d\n",
1561			bank, vml2_way_str[way], mem, sec_cnt, ded_cnt);
1562		break;
1563	case VML2_WALKER_MEM:
1564		dev_info(adev->dev, "GFX SubBlock %s, SED %d, DED %d\n",
1565			 vml2_walker_mems[bank], sec_cnt, ded_cnt);
1566		break;
1567	case UTCL2_MEM:
1568		dev_info(
1569			adev->dev,
1570			"GFX SubBlock UTCL2_ROUTER_IFIF%d_GROUP0_%s, SED %d, DED %d\n",
1571			bank, utcl2_rounter_str[mem], sec_cnt, ded_cnt);
1572		break;
1573	case ATC_L2_CACHE_2M:
1574		dev_info(
1575			adev->dev,
1576			"GFX SubBlock UTC_ATCL2_CACHE_2M_BANK%d_WAY%d_MEM, SED %d, DED %d\n",
1577			bank, way, sec_cnt, ded_cnt);
1578		break;
1579	case ATC_L2_CACHE_32K:
1580		dev_info(
1581			adev->dev,
1582			"GFX SubBlock UTC_ATCL2_CACHE_32K_BANK%d_WAY%d_MEM%d, SED %d, DED %d\n",
1583			bank, way, mem, sec_cnt, ded_cnt);
1584		break;
1585	case ATC_L2_CACHE_4K:
1586		dev_info(
1587			adev->dev,
1588			"GFX SubBlock UTC_ATCL2_CACHE_4K_BANK%d_WAY%d_MEM%d, SED %d, DED %d\n",
1589			bank, way, mem, sec_cnt, ded_cnt);
1590		break;
1591	}
1592}
1593
1594static int gfx_v9_4_2_query_utc_edc_count(struct amdgpu_device *adev,
1595					  uint32_t *sec_count,
1596					  uint32_t *ded_count)
1597{
1598	uint32_t i, j, data;
1599	uint32_t sec_cnt, ded_cnt;
1600	uint32_t num_instances;
1601	struct gfx_v9_4_2_utc_block *blk;
1602
1603	if (sec_count && ded_count) {
1604		*sec_count = 0;
1605		*ded_count = 0;
1606	}
1607
1608	for (i = 0; i < ARRAY_SIZE(gfx_v9_4_2_utc_blocks); i++) {
1609		blk = &gfx_v9_4_2_utc_blocks[i];
1610		num_instances =
1611			blk->num_banks * blk->num_ways * blk->num_mem_blocks;
1612		for (j = 0; j < num_instances; j++) {
1613			WREG32(SOC15_REG_ENTRY_OFFSET(blk->idx_reg), j);
1614
1615			/* if sec/ded_count is NULL, just clear counter */
1616			if (!sec_count || !ded_count) {
1617				WREG32(SOC15_REG_ENTRY_OFFSET(blk->data_reg),
1618				       blk->clear);
1619				continue;
1620			}
1621
1622			data = RREG32(SOC15_REG_ENTRY_OFFSET(blk->data_reg));
1623			if (!data)
1624				continue;
1625
1626			sec_cnt = SOC15_RAS_REG_FIELD_VAL(data, *blk, sec);
1627			*sec_count += sec_cnt;
1628			ded_cnt = SOC15_RAS_REG_FIELD_VAL(data, *blk, ded);
1629			*ded_count += ded_cnt;
1630
1631			/* clear counter after read */
1632			WREG32(SOC15_REG_ENTRY_OFFSET(blk->data_reg),
1633			       blk->clear);
1634
1635			/* print the edc count */
1636			if (sec_cnt || ded_cnt)
1637				gfx_v9_4_2_log_utc_edc_count(adev, blk, j, sec_cnt,
1638							     ded_cnt);
1639		}
1640	}
1641
1642	return 0;
1643}
1644
1645static void gfx_v9_4_2_query_ras_error_count(struct amdgpu_device *adev,
1646					    void *ras_error_status)
1647{
1648	struct ras_err_data *err_data = (struct ras_err_data *)ras_error_status;
1649	uint32_t sec_count = 0, ded_count = 0;
1650
1651	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
1652		return;
1653
1654	err_data->ue_count = 0;
1655	err_data->ce_count = 0;
1656
1657	gfx_v9_4_2_query_sram_edc_count(adev, &sec_count, &ded_count);
1658	err_data->ce_count += sec_count;
1659	err_data->ue_count += ded_count;
1660
1661	gfx_v9_4_2_query_utc_edc_count(adev, &sec_count, &ded_count);
1662	err_data->ce_count += sec_count;
1663	err_data->ue_count += ded_count;
1664
 
1665}
1666
1667static void gfx_v9_4_2_reset_utc_err_status(struct amdgpu_device *adev)
1668{
1669	WREG32_SOC15(GC, 0, regUTCL2_MEM_ECC_STATUS, 0x3);
1670	WREG32_SOC15(GC, 0, regVML2_MEM_ECC_STATUS, 0x3);
1671	WREG32_SOC15(GC, 0, regVML2_WALKER_MEM_ECC_STATUS, 0x3);
1672}
1673
1674static void gfx_v9_4_2_reset_ea_err_status(struct amdgpu_device *adev)
1675{
1676	uint32_t i, j;
1677	uint32_t value;
1678
1679	mutex_lock(&adev->grbm_idx_mutex);
1680	for (i = 0; i < gfx_v9_4_2_ea_err_status_regs.se_num; i++) {
1681		for (j = 0; j < gfx_v9_4_2_ea_err_status_regs.instance;
1682		     j++) {
1683			gfx_v9_4_2_select_se_sh(adev, i, 0, j);
1684			value = RREG32(SOC15_REG_ENTRY_OFFSET(
1685				gfx_v9_4_2_ea_err_status_regs));
1686			value = REG_SET_FIELD(value, GCEA_ERR_STATUS, CLEAR_ERROR_STATUS, 0x1);
1687			WREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_4_2_ea_err_status_regs), value);
1688		}
1689	}
1690	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1691	mutex_unlock(&adev->grbm_idx_mutex);
1692}
1693
1694static void gfx_v9_4_2_reset_ras_error_count(struct amdgpu_device *adev)
1695{
1696	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
1697		return;
1698
1699	gfx_v9_4_2_query_sram_edc_count(adev, NULL, NULL);
1700	gfx_v9_4_2_query_utc_edc_count(adev, NULL, NULL);
1701}
1702
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1703static void gfx_v9_4_2_query_ea_err_status(struct amdgpu_device *adev)
1704{
1705	uint32_t i, j;
1706	uint32_t reg_value;
1707
1708	mutex_lock(&adev->grbm_idx_mutex);
1709
1710	for (i = 0; i < gfx_v9_4_2_ea_err_status_regs.se_num; i++) {
1711		for (j = 0; j < gfx_v9_4_2_ea_err_status_regs.instance;
1712		     j++) {
1713			gfx_v9_4_2_select_se_sh(adev, i, 0, j);
1714			reg_value = RREG32(SOC15_REG_ENTRY_OFFSET(
1715				gfx_v9_4_2_ea_err_status_regs));
1716
1717			if (REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_RDRSP_STATUS) ||
1718			    REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_WRRSP_STATUS) ||
1719			    REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_RDRSP_DATAPARITY_ERROR)) {
1720				dev_warn(adev->dev, "GCEA err detected at instance: %d, status: 0x%x!\n",
1721						j, reg_value);
1722			}
1723			/* clear after read */
1724			reg_value = REG_SET_FIELD(reg_value, GCEA_ERR_STATUS,
1725						  CLEAR_ERROR_STATUS, 0x1);
1726			WREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_4_2_ea_err_status_regs), reg_value);
1727		}
1728	}
1729
1730	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1731	mutex_unlock(&adev->grbm_idx_mutex);
1732}
1733
1734static void gfx_v9_4_2_query_utc_err_status(struct amdgpu_device *adev)
1735{
1736	uint32_t data;
1737
1738	data = RREG32_SOC15(GC, 0, regUTCL2_MEM_ECC_STATUS);
1739	if (data) {
1740		dev_warn(adev->dev, "GFX UTCL2 Mem Ecc Status: 0x%x!\n", data);
1741		WREG32_SOC15(GC, 0, regUTCL2_MEM_ECC_STATUS, 0x3);
1742	}
1743
1744	data = RREG32_SOC15(GC, 0, regVML2_MEM_ECC_STATUS);
1745	if (data) {
1746		dev_warn(adev->dev, "GFX VML2 Mem Ecc Status: 0x%x!\n", data);
1747		WREG32_SOC15(GC, 0, regVML2_MEM_ECC_STATUS, 0x3);
1748	}
1749
1750	data = RREG32_SOC15(GC, 0, regVML2_WALKER_MEM_ECC_STATUS);
1751	if (data) {
1752		dev_warn(adev->dev, "GFX VML2 Walker Mem Ecc Status: 0x%x!\n", data);
1753		WREG32_SOC15(GC, 0, regVML2_WALKER_MEM_ECC_STATUS, 0x3);
1754	}
1755}
1756
1757static void gfx_v9_4_2_query_ras_error_status(struct amdgpu_device *adev)
1758{
1759	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
1760		return;
1761
1762	gfx_v9_4_2_query_ea_err_status(adev);
1763	gfx_v9_4_2_query_utc_err_status(adev);
1764	gfx_v9_4_2_query_sq_timeout_status(adev);
1765}
1766
1767static void gfx_v9_4_2_reset_ras_error_status(struct amdgpu_device *adev)
1768{
1769	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
1770		return;
1771
1772	gfx_v9_4_2_reset_utc_err_status(adev);
1773	gfx_v9_4_2_reset_ea_err_status(adev);
1774	gfx_v9_4_2_reset_sq_timeout_status(adev);
1775}
1776
1777static void gfx_v9_4_2_enable_watchdog_timer(struct amdgpu_device *adev)
1778{
1779	uint32_t i;
1780	uint32_t data;
1781
1782	data = REG_SET_FIELD(0, SQ_TIMEOUT_CONFIG, TIMEOUT_FATAL_DISABLE,
1783			     amdgpu_watchdog_timer.timeout_fatal_disable ? 1 :
1784									   0);
1785
1786	if (amdgpu_watchdog_timer.timeout_fatal_disable &&
1787	    (amdgpu_watchdog_timer.period < 1 ||
1788	     amdgpu_watchdog_timer.period > 0x23)) {
1789		dev_warn(adev->dev, "Watchdog period range is 1 to 0x23\n");
1790		amdgpu_watchdog_timer.period = 0x23;
1791	}
1792	data = REG_SET_FIELD(data, SQ_TIMEOUT_CONFIG, PERIOD_SEL,
1793			     amdgpu_watchdog_timer.period);
1794
1795	mutex_lock(&adev->grbm_idx_mutex);
1796	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
1797		gfx_v9_4_2_select_se_sh(adev, i, 0xffffffff, 0xffffffff);
1798		WREG32_SOC15(GC, 0, regSQ_TIMEOUT_CONFIG, data);
1799	}
1800	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1801	mutex_unlock(&adev->grbm_idx_mutex);
1802}
1803
1804static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address)
1805{
1806	WREG32_SOC15_RLC_EX(reg, GC, 0, regSQ_IND_INDEX,
1807		(wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |
1808		(simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |
1809		(address << SQ_IND_INDEX__INDEX__SHIFT) |
1810		(SQ_IND_INDEX__FORCE_READ_MASK));
1811	return RREG32_SOC15(GC, 0, regSQ_IND_DATA);
1812}
1813
1814static void gfx_v9_4_2_log_cu_timeout_status(struct amdgpu_device *adev,
1815					uint32_t status)
1816{
1817	struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info;
1818	uint32_t i, simd, wave;
1819	uint32_t wave_status;
1820	uint32_t wave_pc_lo, wave_pc_hi;
1821	uint32_t wave_exec_lo, wave_exec_hi;
1822	uint32_t wave_inst_dw0, wave_inst_dw1;
1823	uint32_t wave_ib_sts;
1824
1825	for (i = 0; i < 32; i++) {
1826		if (!((i << 1) & status))
1827			continue;
1828
1829		simd = i / cu_info->max_waves_per_simd;
1830		wave = i % cu_info->max_waves_per_simd;
1831
1832		wave_status = wave_read_ind(adev, simd, wave, ixSQ_WAVE_STATUS);
1833		wave_pc_lo = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_LO);
1834		wave_pc_hi = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_HI);
1835		wave_exec_lo =
1836			wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_LO);
1837		wave_exec_hi =
1838			wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_HI);
1839		wave_inst_dw0 =
1840			wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW0);
1841		wave_inst_dw1 =
1842			wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW1);
1843		wave_ib_sts = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_STS);
1844
1845		dev_info(
1846			adev->dev,
1847			"\t SIMD %d, Wave %d: status 0x%x, pc 0x%llx, exec 0x%llx, inst 0x%llx, ib_sts 0x%x\n",
1848			simd, wave, wave_status,
1849			((uint64_t)wave_pc_hi << 32 | wave_pc_lo),
1850			((uint64_t)wave_exec_hi << 32 | wave_exec_lo),
1851			((uint64_t)wave_inst_dw1 << 32 | wave_inst_dw0),
1852			wave_ib_sts);
1853	}
1854}
1855
1856static void gfx_v9_4_2_query_sq_timeout_status(struct amdgpu_device *adev)
1857{
1858	uint32_t se_idx, sh_idx, cu_idx;
1859	uint32_t status;
1860
1861	mutex_lock(&adev->grbm_idx_mutex);
1862	for (se_idx = 0; se_idx < adev->gfx.config.max_shader_engines;
1863	     se_idx++) {
1864		for (sh_idx = 0; sh_idx < adev->gfx.config.max_sh_per_se;
1865		     sh_idx++) {
1866			for (cu_idx = 0;
1867			     cu_idx < adev->gfx.config.max_cu_per_sh;
1868			     cu_idx++) {
1869				gfx_v9_4_2_select_se_sh(adev, se_idx, sh_idx,
1870							cu_idx);
1871				status = RREG32_SOC15(GC, 0,
1872						      regSQ_TIMEOUT_STATUS);
1873				if (status != 0) {
1874					dev_info(
1875						adev->dev,
1876						"GFX Watchdog Timeout: SE %d, SH %d, CU %d\n",
1877						se_idx, sh_idx, cu_idx);
1878					gfx_v9_4_2_log_cu_timeout_status(
1879						adev, status);
1880				}
1881				/* clear old status */
1882				WREG32_SOC15(GC, 0, regSQ_TIMEOUT_STATUS, 0);
1883			}
1884		}
1885	}
1886	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1887	mutex_unlock(&adev->grbm_idx_mutex);
1888}
1889
1890static void gfx_v9_4_2_reset_sq_timeout_status(struct amdgpu_device *adev)
1891{
1892	uint32_t se_idx, sh_idx, cu_idx;
1893
1894	mutex_lock(&adev->grbm_idx_mutex);
1895	for (se_idx = 0; se_idx < adev->gfx.config.max_shader_engines;
1896	     se_idx++) {
1897		for (sh_idx = 0; sh_idx < adev->gfx.config.max_sh_per_se;
1898		     sh_idx++) {
1899			for (cu_idx = 0;
1900			     cu_idx < adev->gfx.config.max_cu_per_sh;
1901			     cu_idx++) {
1902				gfx_v9_4_2_select_se_sh(adev, se_idx, sh_idx,
1903							cu_idx);
1904				WREG32_SOC15(GC, 0, regSQ_TIMEOUT_STATUS, 0);
1905			}
1906		}
1907	}
1908	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1909	mutex_unlock(&adev->grbm_idx_mutex);
1910}
1911
1912static bool gfx_v9_4_2_query_uctl2_poison_status(struct amdgpu_device *adev)
1913{
1914	u32 status = 0;
1915	struct amdgpu_vmhub *hub;
1916
1917	hub = &adev->vmhub[AMDGPU_GFXHUB(0)];
1918	status = RREG32(hub->vm_l2_pro_fault_status);
1919	/* reset page fault status */
1920	WREG32_P(hub->vm_l2_pro_fault_cntl, 1, ~1);
1921
1922	return REG_GET_FIELD(status, VM_L2_PROTECTION_FAULT_STATUS, FED);
1923}
1924
1925struct amdgpu_ras_block_hw_ops  gfx_v9_4_2_ras_ops = {
1926		.query_ras_error_count = &gfx_v9_4_2_query_ras_error_count,
1927		.reset_ras_error_count = &gfx_v9_4_2_reset_ras_error_count,
1928		.query_ras_error_status = &gfx_v9_4_2_query_ras_error_status,
1929		.reset_ras_error_status = &gfx_v9_4_2_reset_ras_error_status,
1930};
1931
1932struct amdgpu_gfx_ras gfx_v9_4_2_ras = {
1933	.ras_block = {
1934		.hw_ops = &gfx_v9_4_2_ras_ops,
1935	},
1936	.enable_watchdog_timer = &gfx_v9_4_2_enable_watchdog_timer,
1937	.query_utcl2_poison_status = gfx_v9_4_2_query_uctl2_poison_status,
1938};
v5.14.15
   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
  40enum 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
  49struct 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
  63static 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
  72static 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
  81static 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*/
  93static 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
 191const 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*/
 219static 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
 245const 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
 263static 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
 287const 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*/
 310static 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
 328const 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
 346static 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	total_size = (regs_size * 3 + 4 + 5 + 5) * 4;
 359	total_size = ALIGN(total_size, 256);
 360	shader_offset = total_size;
 361	total_size += ALIGN(shader_size, 256);
 362
 363	/* allocate an indirect buffer to put the commands in */
 364	memset(ib, 0, sizeof(*ib));
 365	r = amdgpu_ib_get(adev, NULL, total_size,
 366					AMDGPU_IB_POOL_DIRECT, ib);
 367	if (r) {
 368		dev_err(adev->dev, "failed to get ib (%d).\n", r);
 369		return r;
 370	}
 371
 372	/* load the compute shaders */
 373	for (i = 0; i < shader_size/sizeof(u32); i++)
 374		ib->ptr[i + (shader_offset / 4)] = shader_ptr[i];
 375
 376	/* init the ib length to 0 */
 377	ib->length_dw = 0;
 378
 379	/* write the register state for the compute dispatch */
 380	for (i = 0; i < regs_size; i++) {
 381		ib->ptr[ib->length_dw++] = PACKET3(PACKET3_SET_SH_REG, 1);
 382		ib->ptr[ib->length_dw++] = SOC15_REG_ENTRY_OFFSET(init_regs[i])
 383								- PACKET3_SET_SH_REG_START;
 384		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	gpu_addr = (ib->gpu_addr + (u64)shader_offset) >> 8;
 389	ib->ptr[ib->length_dw++] = PACKET3(PACKET3_SET_SH_REG, 2);
 390	ib->ptr[ib->length_dw++] = SOC15_REG_OFFSET(GC, 0, regCOMPUTE_PGM_LO)
 391							- PACKET3_SET_SH_REG_START;
 392	ib->ptr[ib->length_dw++] = lower_32_bits(gpu_addr);
 393	ib->ptr[ib->length_dw++] = upper_32_bits(gpu_addr);
 394
 395	/* write the wb buffer address */
 396	ib->ptr[ib->length_dw++] = PACKET3(PACKET3_SET_SH_REG, 3);
 397	ib->ptr[ib->length_dw++] = SOC15_REG_OFFSET(GC, 0, regCOMPUTE_USER_DATA_0)
 398							- PACKET3_SET_SH_REG_START;
 399	ib->ptr[ib->length_dw++] = lower_32_bits(wb_gpu_addr);
 400	ib->ptr[ib->length_dw++] = upper_32_bits(wb_gpu_addr);
 401	ib->ptr[ib->length_dw++] = pattern;
 402
 403	/* write dispatch packet */
 404	ib->ptr[ib->length_dw++] = PACKET3(PACKET3_DISPATCH_DIRECT, 3);
 405	ib->ptr[ib->length_dw++] = compute_dim_x; /* x */
 406	ib->ptr[ib->length_dw++] = 1; /* y */
 407	ib->ptr[ib->length_dw++] = 1; /* z */
 408	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	r = amdgpu_ib_schedule(ring, 1, ib, NULL, fence_ptr);
 413	if (r) {
 414		dev_err(adev->dev, "ib submit failed (%d).\n", r);
 415		amdgpu_ib_free(adev, ib, NULL);
 416	}
 417	return r;
 418}
 419
 420static 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	uint32_t offset = 0;
 424	char *str;
 425	int size;
 426
 427	str = kmalloc(256, GFP_KERNEL);
 428	if (!str)
 429		return;
 430
 431	dev_dbg(adev->dev, "wave assignment:\n");
 432
 433	for (se = 0; se < adev->gfx.config.max_shader_engines; se++) {
 434		for (cu = 0; cu < CU_ID_MAX; cu++) {
 435			memset(str, 0, 256);
 436			size = sprintf(str, "SE[%02d]CU[%02d]: ", se, cu);
 437			for (simd = 0; simd < SIMD_ID_MAX; simd++) {
 438				size += sprintf(str + size, "[");
 439				for (wave = 0; wave < WAVE_ID_MAX; wave++) {
 440					size += sprintf(str + size, "%x", wb_ptr[offset]);
 441					offset++;
 442				}
 443				size += sprintf(str + size, "]  ");
 444			}
 445			dev_dbg(adev->dev, "%s\n", str);
 446		}
 447	}
 448
 449	kfree(str);
 450}
 451
 452static 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	uint32_t loop = 0;
 458	uint32_t wave_cnt;
 459	uint32_t offset;
 460
 461	do {
 462		wave_cnt = 0;
 463		offset = 0;
 464
 465		for (se = 0; se < adev->gfx.config.max_shader_engines; se++)
 466			for (cu = 0; cu < CU_ID_MAX; cu++)
 467				for (simd = 0; simd < SIMD_ID_MAX; simd++)
 468					for (wave = 0; wave < WAVE_ID_MAX; wave++) {
 469						if (((1 << wave) & mask) &&
 470						    (wb_ptr[offset] == pattern))
 471							wave_cnt++;
 472
 473						offset++;
 474					}
 475
 476		if (wave_cnt == num_wave)
 477			return 0;
 478
 479		mdelay(1);
 480	} while (++loop < 2000 && wait);
 481
 482	dev_err(adev->dev, "actual wave num: %d, expected wave num: %d\n",
 483		wave_cnt, num_wave);
 484
 485	gfx_v9_4_2_log_wave_assignment(adev, wb_ptr);
 486
 487	return -EBADSLT;
 488}
 489
 490static int gfx_v9_4_2_do_sgprs_init(struct amdgpu_device *adev)
 491{
 492	int r;
 493	int wb_size = adev->gfx.config.max_shader_engines *
 494			 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	u32 pattern[3] = { 0x1, 0x5, 0xa };
 499
 500	/* bail if the compute ring is not ready */
 501	if (!adev->gfx.compute_ring[0].sched.ready ||
 502		 !adev->gfx.compute_ring[1].sched.ready)
 503		return 0;
 504
 505	/* allocate the write-back buffer from IB */
 506	memset(&wb_ib, 0, sizeof(wb_ib));
 507	r = amdgpu_ib_get(adev, NULL, (1 + wb_size) * sizeof(uint32_t),
 508			  AMDGPU_IB_POOL_DIRECT, &wb_ib);
 509	if (r) {
 510		dev_err(adev->dev, "failed to get ib (%d) for wb\n", r);
 511		return r;
 512	}
 513	memset(wb_ib.ptr, 0, (1 + wb_size) * sizeof(uint32_t));
 514
 515	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	if (r) {
 525		dev_err(adev->dev, "failed to clear first 224 sgprs\n");
 526		goto pro_end;
 527	}
 528
 529	r = gfx_v9_4_2_wait_for_waves_assigned(adev,
 530			&wb_ib.ptr[1], 0b11,
 531			pattern[0],
 532			adev->gfx.cu_info.number * SIMD_ID_MAX * 2,
 533			true);
 534	if (r) {
 535		dev_err(adev->dev, "wave coverage failed when clear first 224 sgprs\n");
 536		wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
 537		goto disp0_failed;
 538	}
 539
 540	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			adev->gfx.cu_info.number * 2,
 548			wb_ib.gpu_addr, pattern[1], &fences[1]);
 549	if (r) {
 550		dev_err(adev->dev, "failed to clear next 576 sgprs\n");
 551		goto disp0_failed;
 552	}
 553
 554	r = gfx_v9_4_2_wait_for_waves_assigned(adev,
 555			&wb_ib.ptr[1], 0b11111100,
 556			pattern[1], adev->gfx.cu_info.number * SIMD_ID_MAX * 6,
 557			true);
 558	if (r) {
 559		dev_err(adev->dev, "wave coverage failed when clear first 576 sgprs\n");
 560		wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
 561		goto disp1_failed;
 562	}
 563
 564	wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
 565
 566	/* wait for the GPU to finish processing the IB */
 567	r = dma_fence_wait(fences[0], false);
 568	if (r) {
 569		dev_err(adev->dev, "timeout to clear first 224 sgprs\n");
 570		goto disp1_failed;
 571	}
 572
 573	r = dma_fence_wait(fences[1], false);
 574	if (r) {
 575		dev_err(adev->dev, "timeout to clear first 576 sgprs\n");
 576		goto disp1_failed;
 577	}
 578
 579	memset(wb_ib.ptr, 0, (1 + wb_size) * sizeof(uint32_t));
 580	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	if (r) {
 590		dev_err(adev->dev, "failed to clear first 256 sgprs\n");
 591		goto disp1_failed;
 592	}
 593
 594	r = gfx_v9_4_2_wait_for_waves_assigned(adev,
 595			&wb_ib.ptr[1], 0b1111,
 596			pattern[2],
 597			adev->gfx.cu_info.number * SIMD_ID_MAX * 4,
 598			true);
 599	if (r) {
 600		dev_err(adev->dev, "wave coverage failed when clear first 256 sgprs\n");
 601		wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
 602		goto disp2_failed;
 603	}
 604
 605	wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
 606
 607	r = dma_fence_wait(fences[2], false);
 608	if (r) {
 609		dev_err(adev->dev, "timeout to clear first 256 sgprs\n");
 610		goto disp2_failed;
 611	}
 612
 613disp2_failed:
 614	amdgpu_ib_free(adev, &disp_ibs[2], NULL);
 615	dma_fence_put(fences[2]);
 616disp1_failed:
 617	amdgpu_ib_free(adev, &disp_ibs[1], NULL);
 618	dma_fence_put(fences[1]);
 619disp0_failed:
 620	amdgpu_ib_free(adev, &disp_ibs[0], NULL);
 621	dma_fence_put(fences[0]);
 622pro_end:
 623	amdgpu_ib_free(adev, &wb_ib, NULL);
 624
 625	if (r)
 626		dev_info(adev->dev, "Init SGPRS Failed\n");
 627	else
 628		dev_info(adev->dev, "Init SGPRS Successfully\n");
 629
 630	return r;
 631}
 632
 633static 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	int wb_size = adev->gfx.config.max_shader_engines *
 638			 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	u32 pattern = 0xa;
 643
 644	/* bail if the compute ring is not ready */
 645	if (!adev->gfx.compute_ring[0].sched.ready)
 646		return 0;
 647
 648	/* allocate the write-back buffer from IB */
 649	memset(&wb_ib, 0, sizeof(wb_ib));
 650	r = amdgpu_ib_get(adev, NULL, (1 + wb_size) * sizeof(uint32_t),
 651			  AMDGPU_IB_POOL_DIRECT, &wb_ib);
 652	if (r) {
 653		dev_err(adev->dev, "failed to get ib (%d) for wb.\n", r);
 654		return r;
 655	}
 656	memset(wb_ib.ptr, 0, (1 + wb_size) * sizeof(uint32_t));
 657
 658	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	if (r) {
 668		dev_err(adev->dev, "failed to clear vgprs\n");
 669		goto pro_end;
 670	}
 671
 672	/* wait for the GPU to finish processing the IB */
 673	r = dma_fence_wait(fence, false);
 674	if (r) {
 675		dev_err(adev->dev, "timeout to clear vgprs\n");
 676		goto disp_failed;
 677	}
 678
 679	r = gfx_v9_4_2_wait_for_waves_assigned(adev,
 680			&wb_ib.ptr[1], 0b1,
 681			pattern,
 682			adev->gfx.cu_info.number * SIMD_ID_MAX,
 683			false);
 684	if (r) {
 685		dev_err(adev->dev, "failed to cover all simds when clearing vgprs\n");
 686		goto disp_failed;
 687	}
 688
 689disp_failed:
 690	amdgpu_ib_free(adev, &disp_ib, NULL);
 691	dma_fence_put(fence);
 692pro_end:
 693	amdgpu_ib_free(adev, &wb_ib, NULL);
 694
 695	if (r)
 696		dev_info(adev->dev, "Init VGPRS Failed\n");
 697	else
 698		dev_info(adev->dev, "Init VGPRS Successfully\n");
 699
 700	return r;
 701}
 702
 703int gfx_v9_4_2_do_edc_gpr_workarounds(struct amdgpu_device *adev)
 704{
 705	/* only support when RAS is enabled */
 706	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
 707		return 0;
 708
 
 
 
 
 
 709	gfx_v9_4_2_do_sgprs_init(adev);
 710
 711	gfx_v9_4_2_do_vgprs_init(adev);
 712
 713	return 0;
 714}
 715
 716static void gfx_v9_4_2_query_sq_timeout_status(struct amdgpu_device *adev);
 717static void gfx_v9_4_2_reset_sq_timeout_status(struct amdgpu_device *adev);
 718
 719void gfx_v9_4_2_init_golden_registers(struct amdgpu_device *adev,
 720				      uint32_t die_id)
 721{
 722	soc15_program_register_sequence(adev,
 723					golden_settings_gc_9_4_2_alde,
 724					ARRAY_SIZE(golden_settings_gc_9_4_2_alde));
 725
 726	/* apply golden settings per die */
 727	switch (die_id) {
 728	case 0:
 729		soc15_program_register_sequence(adev,
 730				golden_settings_gc_9_4_2_alde_die_0,
 731				ARRAY_SIZE(golden_settings_gc_9_4_2_alde_die_0));
 732		break;
 733	case 1:
 734		soc15_program_register_sequence(adev,
 735				golden_settings_gc_9_4_2_alde_die_1,
 736				ARRAY_SIZE(golden_settings_gc_9_4_2_alde_die_1));
 737		break;
 738	default:
 739		dev_warn(adev->dev,
 740			 "invalid die id %d, ignore channel fabricid remap settings\n",
 741			 die_id);
 742		break;
 743	}
 744
 745	return;
 746}
 747
 748void gfx_v9_4_2_debug_trap_config_init(struct amdgpu_device *adev,
 749				uint32_t first_vmid,
 750				uint32_t last_vmid)
 751{
 752	uint32_t data;
 753	int i;
 754
 755	mutex_lock(&adev->srbm_mutex);
 756
 757	for (i = first_vmid; i < last_vmid; i++) {
 758		data = 0;
 759		soc15_grbm_select(adev, 0, 0, 0, i);
 760		data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, TRAP_EN, 1);
 761		data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_EN, 0);
 762		data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_REPLACE,
 763					0);
 764		WREG32(SOC15_REG_OFFSET(GC, 0, regSPI_GDBG_PER_VMID_CNTL), data);
 765	}
 766
 767	soc15_grbm_select(adev, 0, 0, 0, 0);
 768	mutex_unlock(&adev->srbm_mutex);
 
 
 
 769}
 770
 771void gfx_v9_4_2_set_power_brake_sequence(struct amdgpu_device *adev)
 772{
 773	u32 tmp;
 774
 775	gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
 776
 777	tmp = 0;
 778	tmp = REG_SET_FIELD(tmp, GC_THROTTLE_CTRL, PATTERN_MODE, 1);
 779	WREG32_SOC15(GC, 0, regGC_THROTTLE_CTRL, tmp);
 780
 781	tmp = 0;
 782	tmp = REG_SET_FIELD(tmp, GC_THROTTLE_CTRL1, PWRBRK_STALL_EN, 1);
 783	WREG32_SOC15(GC, 0, regGC_THROTTLE_CTRL1, tmp);
 784
 785	WREG32_SOC15(GC, 0, regGC_CAC_IND_INDEX, ixPWRBRK_STALL_PATTERN_CTRL);
 786	tmp = 0;
 787	tmp = REG_SET_FIELD(tmp, PWRBRK_STALL_PATTERN_CTRL, PWRBRK_END_STEP, 0x12);
 788	WREG32_SOC15(GC, 0, regGC_CAC_IND_DATA, tmp);
 789}
 790
 791static const struct soc15_reg_entry gfx_v9_4_2_edc_counter_regs[] = {
 792	/* CPF */
 793	{ SOC15_REG_ENTRY(GC, 0, regCPF_EDC_ROQ_CNT), 0, 1, 1 },
 794	{ SOC15_REG_ENTRY(GC, 0, regCPF_EDC_TAG_CNT), 0, 1, 1 },
 795	/* CPC */
 796	{ SOC15_REG_ENTRY(GC, 0, regCPC_EDC_SCRATCH_CNT), 0, 1, 1 },
 797	{ SOC15_REG_ENTRY(GC, 0, regCPC_EDC_UCODE_CNT), 0, 1, 1 },
 798	{ SOC15_REG_ENTRY(GC, 0, regDC_EDC_STATE_CNT), 0, 1, 1 },
 799	{ SOC15_REG_ENTRY(GC, 0, regDC_EDC_CSINVOC_CNT), 0, 1, 1 },
 800	{ SOC15_REG_ENTRY(GC, 0, regDC_EDC_RESTORE_CNT), 0, 1, 1 },
 801	/* GDS */
 802	{ SOC15_REG_ENTRY(GC, 0, regGDS_EDC_CNT), 0, 1, 1 },
 803	{ SOC15_REG_ENTRY(GC, 0, regGDS_EDC_GRBM_CNT), 0, 1, 1 },
 804	{ SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 1, 1 },
 805	{ SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT), 0, 1, 1 },
 806	{ SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT), 0, 1, 1 },
 807	/* RLC */
 808	{ SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT), 0, 1, 1 },
 809	{ SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2), 0, 1, 1 },
 810	/* SPI */
 811	{ SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT), 0, 8, 1 },
 812	/* SQC */
 813	{ SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT), 0, 8, 7 },
 814	{ SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2), 0, 8, 7 },
 815	{ SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3), 0, 8, 7 },
 816	{ SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3), 0, 8, 7 },
 817	/* SQ */
 818	{ SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT), 0, 8, 14 },
 819	/* TCP */
 820	{ SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW), 0, 8, 14 },
 821	/* TCI */
 822	{ SOC15_REG_ENTRY(GC, 0, regTCI_EDC_CNT), 0, 1, 69 },
 823	/* TCC */
 824	{ SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT), 0, 1, 16 },
 825	{ SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2), 0, 1, 16 },
 826	/* TCA */
 827	{ SOC15_REG_ENTRY(GC, 0, regTCA_EDC_CNT), 0, 1, 2 },
 828	/* TCX */
 829	{ SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT), 0, 1, 2 },
 830	{ SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2), 0, 1, 2 },
 831	/* TD */
 832	{ SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT), 0, 8, 14 },
 833	/* TA */
 834	{ SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT), 0, 8, 14 },
 835	/* GCEA */
 836	{ SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT), 0, 1, 16 },
 837	{ SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2), 0, 1, 16 },
 838	{ SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 1, 16 },
 839};
 840
 841static void gfx_v9_4_2_select_se_sh(struct amdgpu_device *adev, u32 se_num,
 842				  u32 sh_num, u32 instance)
 843{
 844	u32 data;
 845
 846	if (instance == 0xffffffff)
 847		data = REG_SET_FIELD(0, GRBM_GFX_INDEX,
 848				     INSTANCE_BROADCAST_WRITES, 1);
 849	else
 850		data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_INDEX,
 851				     instance);
 852
 853	if (se_num == 0xffffffff)
 854		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_BROADCAST_WRITES,
 855				     1);
 856	else
 857		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num);
 858
 859	if (sh_num == 0xffffffff)
 860		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_BROADCAST_WRITES,
 861				     1);
 862	else
 863		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num);
 864
 865	WREG32_SOC15_RLC_SHADOW_EX(reg, GC, 0, regGRBM_GFX_INDEX, data);
 866}
 867
 868static const struct soc15_ras_field_entry gfx_v9_4_2_ras_fields[] = {
 869	/* CPF */
 870	{ "CPF_ROQ_ME2", SOC15_REG_ENTRY(GC, 0, regCPF_EDC_ROQ_CNT),
 871	  SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, SEC_COUNT_ME2),
 872	  SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, DED_COUNT_ME2) },
 873	{ "CPF_ROQ_ME1", SOC15_REG_ENTRY(GC, 0, regCPF_EDC_ROQ_CNT),
 874	  SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, SEC_COUNT_ME1),
 875	  SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, DED_COUNT_ME1) },
 876	{ "CPF_TCIU_TAG", SOC15_REG_ENTRY(GC, 0, regCPF_EDC_TAG_CNT),
 877	  SOC15_REG_FIELD(CPF_EDC_TAG_CNT, SEC_COUNT),
 878	  SOC15_REG_FIELD(CPF_EDC_TAG_CNT, DED_COUNT) },
 879
 880	/* CPC */
 881	{ "CPC_SCRATCH", SOC15_REG_ENTRY(GC, 0, regCPC_EDC_SCRATCH_CNT),
 882	  SOC15_REG_FIELD(CPC_EDC_SCRATCH_CNT, SEC_COUNT),
 883	  SOC15_REG_FIELD(CPC_EDC_SCRATCH_CNT, DED_COUNT) },
 884	{ "CPC_UCODE", SOC15_REG_ENTRY(GC, 0, regCPC_EDC_UCODE_CNT),
 885	  SOC15_REG_FIELD(CPC_EDC_UCODE_CNT, SEC_COUNT),
 886	  SOC15_REG_FIELD(CPC_EDC_UCODE_CNT, DED_COUNT) },
 887	{ "CPC_DC_STATE_RAM_ME1", SOC15_REG_ENTRY(GC, 0, regDC_EDC_STATE_CNT),
 888	  SOC15_REG_FIELD(DC_EDC_STATE_CNT, SEC_COUNT_ME1),
 889	  SOC15_REG_FIELD(DC_EDC_STATE_CNT, DED_COUNT_ME1) },
 890	{ "CPC_DC_CSINVOC_RAM_ME1",
 891	  SOC15_REG_ENTRY(GC, 0, regDC_EDC_CSINVOC_CNT),
 892	  SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, SEC_COUNT_ME1),
 893	  SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, DED_COUNT_ME1) },
 894	{ "CPC_DC_RESTORE_RAM_ME1",
 895	  SOC15_REG_ENTRY(GC, 0, regDC_EDC_RESTORE_CNT),
 896	  SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, SEC_COUNT_ME1),
 897	  SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, DED_COUNT_ME1) },
 898	{ "CPC_DC_CSINVOC_RAM1_ME1",
 899	  SOC15_REG_ENTRY(GC, 0, regDC_EDC_CSINVOC_CNT),
 900	  SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, SEC_COUNT1_ME1),
 901	  SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, DED_COUNT1_ME1) },
 902	{ "CPC_DC_RESTORE_RAM1_ME1",
 903	  SOC15_REG_ENTRY(GC, 0, regDC_EDC_RESTORE_CNT),
 904	  SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, SEC_COUNT1_ME1),
 905	  SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, DED_COUNT1_ME1) },
 906
 907	/* GDS */
 908	{ "GDS_GRBM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_GRBM_CNT),
 909	  SOC15_REG_FIELD(GDS_EDC_GRBM_CNT, SEC),
 910	  SOC15_REG_FIELD(GDS_EDC_GRBM_CNT, DED) },
 911	{ "GDS_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_CNT),
 912	  SOC15_REG_FIELD(GDS_EDC_CNT, GDS_MEM_SEC),
 913	  SOC15_REG_FIELD(GDS_EDC_CNT, GDS_MEM_DED) },
 914	{ "GDS_PHY_CMD_RAM_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT),
 915	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_CMD_RAM_MEM_SEC),
 916	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_CMD_RAM_MEM_DED) },
 917	{ "GDS_PHY_DATA_RAM_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT),
 918	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_DATA_RAM_MEM_SEC),
 919	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_DATA_RAM_MEM_DED) },
 920	{ "GDS_ME0_CS_PIPE_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT),
 921	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, ME0_CS_PIPE_MEM_SEC),
 922	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, ME0_CS_PIPE_MEM_DED) },
 923	{ "GDS_ME1_PIPE0_PIPE_MEM",
 924	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
 925	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE0_PIPE_MEM_SEC),
 926	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE0_PIPE_MEM_DED) },
 927	{ "GDS_ME1_PIPE1_PIPE_MEM",
 928	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
 929	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE1_PIPE_MEM_SEC),
 930	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE1_PIPE_MEM_DED) },
 931	{ "GDS_ME1_PIPE2_PIPE_MEM",
 932	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
 933	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE2_PIPE_MEM_SEC),
 934	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE2_PIPE_MEM_DED) },
 935	{ "GDS_ME1_PIPE3_PIPE_MEM",
 936	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
 937	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE3_PIPE_MEM_SEC),
 938	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE3_PIPE_MEM_DED) },
 939	{ "GDS_ME0_GFXHP3D_PIX_DED",
 940	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 941	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_GFXHP3D_PIX_DED) },
 942	{ "GDS_ME0_GFXHP3D_VTX_DED",
 943	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 944	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_GFXHP3D_VTX_DED) },
 945	{ "GDS_ME0_CS_DED",
 946	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 947	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_CS_DED) },
 948	{ "GDS_ME0_GFXHP3D_GS_DED",
 949	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 950	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_GFXHP3D_GS_DED) },
 951	{ "GDS_ME1_PIPE0_DED",
 952	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 953	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE0_DED) },
 954	{ "GDS_ME1_PIPE1_DED",
 955	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 956	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE1_DED) },
 957	{ "GDS_ME1_PIPE2_DED",
 958	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 959	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE2_DED) },
 960	{ "GDS_ME1_PIPE3_DED",
 961	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 962	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE3_DED) },
 963	{ "GDS_ME2_PIPE0_DED",
 964	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 965	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE0_DED) },
 966	{ "GDS_ME2_PIPE1_DED",
 967	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 968	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE1_DED) },
 969	{ "GDS_ME2_PIPE2_DED",
 970	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 971	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE2_DED) },
 972	{ "GDS_ME2_PIPE3_DED",
 973	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
 974	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE3_DED) },
 975
 976	/* RLC */
 977	{ "RLCG_INSTR_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
 978	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_INSTR_RAM_SEC_COUNT),
 979	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_INSTR_RAM_DED_COUNT) },
 980	{ "RLCG_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
 981	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_SCRATCH_RAM_SEC_COUNT),
 982	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_SCRATCH_RAM_DED_COUNT) },
 983	{ "RLCV_INSTR_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
 984	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_INSTR_RAM_SEC_COUNT),
 985	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_INSTR_RAM_DED_COUNT) },
 986	{ "RLCV_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
 987	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_SCRATCH_RAM_SEC_COUNT),
 988	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_SCRATCH_RAM_DED_COUNT) },
 989	{ "RLC_TCTAG_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
 990	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_TCTAG_RAM_SEC_COUNT),
 991	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_TCTAG_RAM_DED_COUNT) },
 992	{ "RLC_SPM_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
 993	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SPM_SCRATCH_RAM_SEC_COUNT),
 994	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SPM_SCRATCH_RAM_DED_COUNT) },
 995	{ "RLC_SRM_DATA_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
 996	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_DATA_RAM_SEC_COUNT),
 997	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_DATA_RAM_DED_COUNT) },
 998	{ "RLC_SRM_ADDR_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
 999	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_ADDR_RAM_SEC_COUNT),
1000	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_ADDR_RAM_DED_COUNT) },
1001	{ "RLC_SPM_SE0_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1002	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE0_SCRATCH_RAM_SEC_COUNT),
1003	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE0_SCRATCH_RAM_DED_COUNT) },
1004	{ "RLC_SPM_SE1_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1005	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE1_SCRATCH_RAM_SEC_COUNT),
1006	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE1_SCRATCH_RAM_DED_COUNT) },
1007	{ "RLC_SPM_SE2_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1008	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE2_SCRATCH_RAM_SEC_COUNT),
1009	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE2_SCRATCH_RAM_DED_COUNT) },
1010	{ "RLC_SPM_SE3_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1011	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE3_SCRATCH_RAM_SEC_COUNT),
1012	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE3_SCRATCH_RAM_DED_COUNT) },
1013	{ "RLC_SPM_SE4_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1014	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE4_SCRATCH_RAM_SEC_COUNT),
1015	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE4_SCRATCH_RAM_DED_COUNT) },
1016	{ "RLC_SPM_SE5_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1017	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE5_SCRATCH_RAM_SEC_COUNT),
1018	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE5_SCRATCH_RAM_DED_COUNT) },
1019	{ "RLC_SPM_SE6_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1020	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE6_SCRATCH_RAM_SEC_COUNT),
1021	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE6_SCRATCH_RAM_DED_COUNT) },
1022	{ "RLC_SPM_SE7_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1023	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE7_SCRATCH_RAM_SEC_COUNT),
1024	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE7_SCRATCH_RAM_DED_COUNT) },
1025
1026	/* SPI */
1027	{ "SPI_SR_MEM", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
1028	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_SR_MEM_SEC_COUNT),
1029	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_SR_MEM_DED_COUNT) },
1030	{ "SPI_GDS_EXPREQ", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
1031	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_GDS_EXPREQ_SEC_COUNT),
1032	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_GDS_EXPREQ_DED_COUNT) },
1033	{ "SPI_WB_GRANT_30", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
1034	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_WB_GRANT_30_SEC_COUNT),
1035	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_WB_GRANT_30_DED_COUNT) },
1036	{ "SPI_LIFE_CNT", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
1037	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_LIFE_CNT_SEC_COUNT),
1038	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_LIFE_CNT_DED_COUNT) },
1039
1040	/* SQC - regSQC_EDC_CNT */
1041	{ "SQC_DATA_CU0_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1042	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_WRITE_DATA_BUF_SEC_COUNT),
1043	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_WRITE_DATA_BUF_DED_COUNT) },
1044	{ "SQC_DATA_CU0_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1045	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_UTCL1_LFIFO_SEC_COUNT),
1046	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_UTCL1_LFIFO_DED_COUNT) },
1047	{ "SQC_DATA_CU1_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1048	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_WRITE_DATA_BUF_SEC_COUNT),
1049	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_WRITE_DATA_BUF_DED_COUNT) },
1050	{ "SQC_DATA_CU1_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1051	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_UTCL1_LFIFO_SEC_COUNT),
1052	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_UTCL1_LFIFO_DED_COUNT) },
1053	{ "SQC_DATA_CU2_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1054	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_WRITE_DATA_BUF_SEC_COUNT),
1055	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_WRITE_DATA_BUF_DED_COUNT) },
1056	{ "SQC_DATA_CU2_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1057	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_UTCL1_LFIFO_SEC_COUNT),
1058	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_UTCL1_LFIFO_DED_COUNT) },
1059	{ "SQC_DATA_CU3_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1060	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_WRITE_DATA_BUF_SEC_COUNT),
1061	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_WRITE_DATA_BUF_DED_COUNT) },
1062	{ "SQC_DATA_CU3_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1063	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_UTCL1_LFIFO_SEC_COUNT),
1064	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_UTCL1_LFIFO_DED_COUNT) },
1065
1066	/* SQC - regSQC_EDC_CNT2 */
1067	{ "SQC_INST_BANKA_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1068	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_TAG_RAM_SEC_COUNT),
1069	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_TAG_RAM_DED_COUNT) },
1070	{ "SQC_INST_BANKA_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1071	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_BANK_RAM_SEC_COUNT),
1072	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_BANK_RAM_DED_COUNT) },
1073	{ "SQC_DATA_BANKA_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1074	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_TAG_RAM_SEC_COUNT),
1075	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_TAG_RAM_DED_COUNT) },
1076	{ "SQC_DATA_BANKA_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1077	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_BANK_RAM_SEC_COUNT),
1078	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_BANK_RAM_DED_COUNT) },
1079	{ "SQC_INST_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1080	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_UTCL1_LFIFO_SEC_COUNT),
1081	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_UTCL1_LFIFO_DED_COUNT) },
1082	{ "SQC_DATA_BANKA_DIRTY_BIT_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1083	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_DIRTY_BIT_RAM_SEC_COUNT),
1084	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_DIRTY_BIT_RAM_DED_COUNT) },
1085
1086	/* SQC - regSQC_EDC_CNT3 */
1087	{ "SQC_INST_BANKB_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
1088	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_TAG_RAM_SEC_COUNT),
1089	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_TAG_RAM_DED_COUNT) },
1090	{ "SQC_INST_BANKB_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
1091	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_BANK_RAM_SEC_COUNT),
1092	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_BANK_RAM_DED_COUNT) },
1093	{ "SQC_DATA_BANKB_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
1094	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_TAG_RAM_SEC_COUNT),
1095	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_TAG_RAM_DED_COUNT) },
1096	{ "SQC_DATA_BANKB_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
1097	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_BANK_RAM_SEC_COUNT),
1098	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_BANK_RAM_DED_COUNT) },
1099	{ "SQC_DATA_BANKB_DIRTY_BIT_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
1100	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_DIRTY_BIT_RAM_SEC_COUNT),
1101	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_DIRTY_BIT_RAM_DED_COUNT) },
1102
1103	/* SQC - regSQC_EDC_PARITY_CNT3 */
1104	{ "SQC_INST_BANKA_UTCL1_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1105	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_UTCL1_MISS_FIFO_SEC_COUNT),
1106	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_UTCL1_MISS_FIFO_DED_COUNT) },
1107	{ "SQC_INST_BANKA_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1108	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_MISS_FIFO_SEC_COUNT),
1109	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_MISS_FIFO_DED_COUNT) },
1110	{ "SQC_DATA_BANKA_HIT_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1111	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_HIT_FIFO_SEC_COUNT),
1112	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_HIT_FIFO_DED_COUNT) },
1113	{ "SQC_DATA_BANKA_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1114	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_MISS_FIFO_SEC_COUNT),
1115	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_MISS_FIFO_DED_COUNT) },
1116	{ "SQC_INST_BANKB_UTCL1_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1117	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_UTCL1_MISS_FIFO_SEC_COUNT),
1118	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_UTCL1_MISS_FIFO_DED_COUNT) },
1119	{ "SQC_INST_BANKB_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1120	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_MISS_FIFO_SEC_COUNT),
1121	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_MISS_FIFO_DED_COUNT) },
1122	{ "SQC_DATA_BANKB_HIT_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1123	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_HIT_FIFO_SEC_COUNT),
1124	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_HIT_FIFO_DED_COUNT) },
1125	{ "SQC_DATA_BANKB_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1126	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_MISS_FIFO_SEC_COUNT),
1127	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_MISS_FIFO_DED_COUNT) },
1128
1129	/* SQ */
1130	{ "SQ_LDS_D", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1131	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_D_SEC_COUNT),
1132	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_D_DED_COUNT) },
1133	{ "SQ_LDS_I", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1134	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_I_SEC_COUNT),
1135	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_I_DED_COUNT) },
1136	{ "SQ_SGPR", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1137	  SOC15_REG_FIELD(SQ_EDC_CNT, SGPR_SEC_COUNT),
1138	  SOC15_REG_FIELD(SQ_EDC_CNT, SGPR_DED_COUNT) },
1139	{ "SQ_VGPR0", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1140	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR0_SEC_COUNT),
1141	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR0_DED_COUNT) },
1142	{ "SQ_VGPR1", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1143	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR1_SEC_COUNT),
1144	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR1_DED_COUNT) },
1145	{ "SQ_VGPR2", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1146	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR2_SEC_COUNT),
1147	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR2_DED_COUNT) },
1148	{ "SQ_VGPR3", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1149	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR3_SEC_COUNT),
1150	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR3_DED_COUNT) },
1151
1152	/* TCP */
1153	{ "TCP_CACHE_RAM", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1154	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CACHE_RAM_SEC_COUNT),
1155	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CACHE_RAM_DED_COUNT) },
1156	{ "TCP_LFIFO_RAM", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1157	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, LFIFO_RAM_SEC_COUNT),
1158	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, LFIFO_RAM_DED_COUNT) },
1159	{ "TCP_CMD_FIFO", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1160	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CMD_FIFO_SEC_COUNT),
1161	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CMD_FIFO_DED_COUNT) },
1162	{ "TCP_VM_FIFO", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1163	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, VM_FIFO_SEC_COUNT),
1164	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, VM_FIFO_DED_COUNT) },
1165	{ "TCP_DB_RAM", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1166	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, DB_RAM_SEC_COUNT),
1167	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, DB_RAM_DED_COUNT) },
1168	{ "TCP_UTCL1_LFIFO0", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1169	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO0_SEC_COUNT),
1170	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO0_DED_COUNT) },
1171	{ "TCP_UTCL1_LFIFO1", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1172	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO1_SEC_COUNT),
1173	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO1_DED_COUNT) },
1174
1175	/* TCI */
1176	{ "TCI_WRITE_RAM", SOC15_REG_ENTRY(GC, 0, regTCI_EDC_CNT),
1177	  SOC15_REG_FIELD(TCI_EDC_CNT, WRITE_RAM_SEC_COUNT),
1178	  SOC15_REG_FIELD(TCI_EDC_CNT, WRITE_RAM_DED_COUNT) },
1179
1180	/* TCC */
1181	{ "TCC_CACHE_DATA", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1182	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DATA_SEC_COUNT),
1183	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DATA_DED_COUNT) },
1184	{ "TCC_CACHE_DIRTY", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1185	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DIRTY_SEC_COUNT),
1186	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DIRTY_DED_COUNT) },
1187	{ "TCC_HIGH_RATE_TAG", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1188	  SOC15_REG_FIELD(TCC_EDC_CNT, HIGH_RATE_TAG_SEC_COUNT),
1189	  SOC15_REG_FIELD(TCC_EDC_CNT, HIGH_RATE_TAG_DED_COUNT) },
1190	{ "TCC_LOW_RATE_TAG", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1191	  SOC15_REG_FIELD(TCC_EDC_CNT, LOW_RATE_TAG_SEC_COUNT),
1192	  SOC15_REG_FIELD(TCC_EDC_CNT, LOW_RATE_TAG_DED_COUNT) },
1193	{ "TCC_SRC_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1194	  SOC15_REG_FIELD(TCC_EDC_CNT, SRC_FIFO_SEC_COUNT),
1195	  SOC15_REG_FIELD(TCC_EDC_CNT, SRC_FIFO_DED_COUNT) },
1196	{ "TCC_LATENCY_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1197	  SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_SEC_COUNT),
1198	  SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_DED_COUNT) },
1199	{ "TCC_LATENCY_FIFO_NEXT_RAM", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1200	  SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_NEXT_RAM_SEC_COUNT),
1201	  SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_NEXT_RAM_DED_COUNT) },
1202	{ "TCC_CACHE_TAG_PROBE_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1203	  SOC15_REG_FIELD(TCC_EDC_CNT2, CACHE_TAG_PROBE_FIFO_SEC_COUNT),
1204	  SOC15_REG_FIELD(TCC_EDC_CNT2, CACHE_TAG_PROBE_FIFO_DED_COUNT) },
1205	{ "TCC_UC_ATOMIC_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1206	  SOC15_REG_FIELD(TCC_EDC_CNT2, UC_ATOMIC_FIFO_SEC_COUNT),
1207	  SOC15_REG_FIELD(TCC_EDC_CNT2, UC_ATOMIC_FIFO_DED_COUNT) },
1208	{ "TCC_WRITE_CACHE_READ", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1209	  SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_CACHE_READ_SEC_COUNT),
1210	  SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_CACHE_READ_DED_COUNT) },
1211	{ "TCC_RETURN_CONTROL", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1212	  SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_CONTROL_SEC_COUNT),
1213	  SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_CONTROL_DED_COUNT) },
1214	{ "TCC_IN_USE_TRANSFER", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1215	  SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_TRANSFER_SEC_COUNT),
1216	  SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_TRANSFER_DED_COUNT) },
1217	{ "TCC_IN_USE_DEC", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1218	  SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_DEC_SEC_COUNT),
1219	  SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_DEC_DED_COUNT) },
1220	{ "TCC_WRITE_RETURN", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1221	  SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_RETURN_SEC_COUNT),
1222	  SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_RETURN_DED_COUNT) },
1223	{ "TCC_RETURN_DATA", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1224	  SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_DATA_SEC_COUNT),
1225	  SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_DATA_DED_COUNT) },
1226
1227	/* TCA */
1228	{ "TCA_HOLE_FIFO", SOC15_REG_ENTRY(GC, 0, regTCA_EDC_CNT),
1229	  SOC15_REG_FIELD(TCA_EDC_CNT, HOLE_FIFO_SEC_COUNT),
1230	  SOC15_REG_FIELD(TCA_EDC_CNT, HOLE_FIFO_DED_COUNT) },
1231	{ "TCA_REQ_FIFO", SOC15_REG_ENTRY(GC, 0, regTCA_EDC_CNT),
1232	  SOC15_REG_FIELD(TCA_EDC_CNT, REQ_FIFO_SEC_COUNT),
1233	  SOC15_REG_FIELD(TCA_EDC_CNT, REQ_FIFO_DED_COUNT) },
1234
1235	/* TCX */
1236	{ "TCX_GROUP0", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1237	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP0_SEC_COUNT),
1238	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP0_DED_COUNT) },
1239	{ "TCX_GROUP1", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1240	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP1_SEC_COUNT),
1241	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP1_DED_COUNT) },
1242	{ "TCX_GROUP2", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1243	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP2_SEC_COUNT),
1244	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP2_DED_COUNT) },
1245	{ "TCX_GROUP3", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1246	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP3_SEC_COUNT),
1247	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP3_DED_COUNT) },
1248	{ "TCX_GROUP4", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1249	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP4_SEC_COUNT),
1250	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP4_DED_COUNT) },
1251	{ "TCX_GROUP5", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1252	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP5_SED_COUNT), 0, 0 },
1253	{ "TCX_GROUP6", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1254	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP6_SED_COUNT), 0, 0 },
1255	{ "TCX_GROUP7", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1256	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP7_SED_COUNT), 0, 0 },
1257	{ "TCX_GROUP8", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1258	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP8_SED_COUNT), 0, 0 },
1259	{ "TCX_GROUP9", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1260	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP9_SED_COUNT), 0, 0 },
1261	{ "TCX_GROUP10", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1262	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP10_SED_COUNT), 0, 0 },
1263	{ "TCX_GROUP11", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
1264	  SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP11_SED_COUNT), 0, 0 },
1265	{ "TCX_GROUP12", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
1266	  SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP12_SED_COUNT), 0, 0 },
1267	{ "TCX_GROUP13", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
1268	  SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP13_SED_COUNT), 0, 0 },
1269	{ "TCX_GROUP14", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
1270	  SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP14_SED_COUNT), 0, 0 },
1271
1272	/* TD */
1273	{ "TD_SS_FIFO_LO", SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT),
1274	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_LO_SEC_COUNT),
1275	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_LO_DED_COUNT) },
1276	{ "TD_SS_FIFO_HI", SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT),
1277	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_HI_SEC_COUNT),
1278	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_HI_DED_COUNT) },
1279	{ "TD_CS_FIFO", SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT),
1280	  SOC15_REG_FIELD(TD_EDC_CNT, CS_FIFO_SEC_COUNT),
1281	  SOC15_REG_FIELD(TD_EDC_CNT, CS_FIFO_DED_COUNT) },
1282
1283	/* TA */
1284	{ "TA_FS_DFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1285	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_DFIFO_SEC_COUNT),
1286	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_DFIFO_DED_COUNT) },
1287	{ "TA_FS_AFIFO_LO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1288	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_LO_SEC_COUNT),
1289	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_LO_DED_COUNT) },
1290	{ "TA_FL_LFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1291	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FL_LFIFO_SEC_COUNT),
1292	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FL_LFIFO_DED_COUNT) },
1293	{ "TA_FX_LFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1294	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FX_LFIFO_SEC_COUNT),
1295	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FX_LFIFO_DED_COUNT) },
1296	{ "TA_FS_CFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1297	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_CFIFO_SEC_COUNT),
1298	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_CFIFO_DED_COUNT) },
1299	{ "TA_FS_AFIFO_HI", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1300	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_HI_SEC_COUNT),
1301	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_HI_DED_COUNT) },
1302
1303	/* EA - regGCEA_EDC_CNT */
1304	{ "EA_DRAMRD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1305	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_CMDMEM_SEC_COUNT),
1306	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_CMDMEM_DED_COUNT) },
1307	{ "EA_DRAMWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1308	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_CMDMEM_SEC_COUNT),
1309	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_CMDMEM_DED_COUNT) },
1310	{ "EA_DRAMWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1311	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_DATAMEM_SEC_COUNT),
1312	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_DATAMEM_DED_COUNT) },
1313	{ "EA_RRET_TAGMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1314	  SOC15_REG_FIELD(GCEA_EDC_CNT, RRET_TAGMEM_SEC_COUNT),
1315	  SOC15_REG_FIELD(GCEA_EDC_CNT, RRET_TAGMEM_DED_COUNT) },
1316	{ "EA_WRET_TAGMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1317	  SOC15_REG_FIELD(GCEA_EDC_CNT, WRET_TAGMEM_SEC_COUNT),
1318	  SOC15_REG_FIELD(GCEA_EDC_CNT, WRET_TAGMEM_DED_COUNT) },
1319	{ "EA_IOWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1320	  SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_DATAMEM_SEC_COUNT),
1321	  SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_DATAMEM_DED_COUNT) },
1322	{ "EA_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1323	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_PAGEMEM_SED_COUNT), 0, 0 },
1324	{ "EA_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1325	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_PAGEMEM_SED_COUNT), 0, 0 },
1326	{ "EA_IORD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1327	  SOC15_REG_FIELD(GCEA_EDC_CNT, IORD_CMDMEM_SED_COUNT), 0, 0 },
1328	{ "EA_IOWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1329	  SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_CMDMEM_SED_COUNT), 0, 0 },
1330
1331	/* EA - regGCEA_EDC_CNT2 */
1332	{ "EA_GMIRD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1333	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_CMDMEM_SEC_COUNT),
1334	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_CMDMEM_DED_COUNT) },
1335	{ "EA_GMIWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1336	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_CMDMEM_SEC_COUNT),
1337	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_CMDMEM_DED_COUNT) },
1338	{ "EA_GMIWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1339	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_DATAMEM_SEC_COUNT),
1340	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_DATAMEM_DED_COUNT) },
1341	{ "EA_GMIRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1342	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_PAGEMEM_SED_COUNT), 0, 0 },
1343	{ "EA_GMIWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1344	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_PAGEMEM_SED_COUNT), 0, 0 },
1345	{ "EA_MAM_D0MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1346	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D0MEM_SED_COUNT),
1347	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D0MEM_DED_COUNT) },
1348	{ "EA_MAM_D1MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1349	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D1MEM_SED_COUNT),
1350	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D1MEM_DED_COUNT) },
1351	{ "EA_MAM_D2MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1352	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D2MEM_SED_COUNT),
1353	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D2MEM_DED_COUNT) },
1354	{ "EA_MAM_D3MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1355	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D3MEM_SED_COUNT),
1356	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D3MEM_DED_COUNT) },
1357
1358	/* EA - regGCEA_EDC_CNT3 */
1359	{ "EA_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1360	  SOC15_REG_FIELD(GCEA_EDC_CNT3, DRAMRD_PAGEMEM_DED_COUNT) },
1361	{ "EA_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1362	  SOC15_REG_FIELD(GCEA_EDC_CNT3, DRAMWR_PAGEMEM_DED_COUNT) },
1363	{ "EA_IORD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1364	  SOC15_REG_FIELD(GCEA_EDC_CNT3, IORD_CMDMEM_DED_COUNT) },
1365	{ "EA_IOWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1366	  SOC15_REG_FIELD(GCEA_EDC_CNT3, IOWR_CMDMEM_DED_COUNT) },
1367	{ "EA_GMIRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1368	  SOC15_REG_FIELD(GCEA_EDC_CNT3, GMIRD_PAGEMEM_DED_COUNT) },
1369	{ "EA_GMIWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1370	  SOC15_REG_FIELD(GCEA_EDC_CNT3, GMIWR_PAGEMEM_DED_COUNT) },
1371	{ "EA_MAM_A0MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
1372	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A0MEM_SEC_COUNT),
1373	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A0MEM_DED_COUNT) },
1374	{ "EA_MAM_A1MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
1375	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A1MEM_SEC_COUNT),
1376	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A1MEM_DED_COUNT) },
1377	{ "EA_MAM_A2MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
1378	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A2MEM_SEC_COUNT),
1379	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A2MEM_DED_COUNT) },
1380	{ "EA_MAM_A3MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
1381	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A3MEM_SEC_COUNT),
1382	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A3MEM_DED_COUNT) },
1383	{ "EA_MAM_AFMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
1384	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_AFMEM_SEC_COUNT),
1385	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_AFMEM_DED_COUNT) },
1386};
1387
1388static const char * const vml2_walker_mems[] = {
1389	"UTC_VML2_CACHE_PDE0_MEM0",
1390	"UTC_VML2_CACHE_PDE0_MEM1",
1391	"UTC_VML2_CACHE_PDE1_MEM0",
1392	"UTC_VML2_CACHE_PDE1_MEM1",
1393	"UTC_VML2_CACHE_PDE2_MEM0",
1394	"UTC_VML2_CACHE_PDE2_MEM1",
1395	"UTC_VML2_RDIF_ARADDRS",
1396	"UTC_VML2_RDIF_LOG_FIFO",
1397	"UTC_VML2_QUEUE_REQ",
1398	"UTC_VML2_QUEUE_RET",
1399};
1400
1401static struct gfx_v9_4_2_utc_block gfx_v9_4_2_utc_blocks[] = {
1402	{ VML2_MEM, 8, 2, 2,
1403	  { SOC15_REG_ENTRY(GC, 0, regVML2_MEM_ECC_INDEX) },
1404	  { SOC15_REG_ENTRY(GC, 0, regVML2_MEM_ECC_CNTL) },
1405	  SOC15_REG_FIELD(VML2_MEM_ECC_CNTL, SEC_COUNT),
1406	  SOC15_REG_FIELD(VML2_MEM_ECC_CNTL, DED_COUNT),
1407	  REG_SET_FIELD(0, VML2_MEM_ECC_CNTL, WRITE_COUNTERS, 1) },
1408	{ VML2_WALKER_MEM, ARRAY_SIZE(vml2_walker_mems), 1, 1,
1409	  { SOC15_REG_ENTRY(GC, 0, regVML2_WALKER_MEM_ECC_INDEX) },
1410	  { SOC15_REG_ENTRY(GC, 0, regVML2_WALKER_MEM_ECC_CNTL) },
1411	  SOC15_REG_FIELD(VML2_WALKER_MEM_ECC_CNTL, SEC_COUNT),
1412	  SOC15_REG_FIELD(VML2_WALKER_MEM_ECC_CNTL, DED_COUNT),
1413	  REG_SET_FIELD(0, VML2_WALKER_MEM_ECC_CNTL, WRITE_COUNTERS, 1) },
1414	{ UTCL2_MEM, 18, 1, 2,
1415	  { SOC15_REG_ENTRY(GC, 0, regUTCL2_MEM_ECC_INDEX) },
1416	  { SOC15_REG_ENTRY(GC, 0, regUTCL2_MEM_ECC_CNTL) },
1417	  SOC15_REG_FIELD(UTCL2_MEM_ECC_CNTL, SEC_COUNT),
1418	  SOC15_REG_FIELD(UTCL2_MEM_ECC_CNTL, DED_COUNT),
1419	  REG_SET_FIELD(0, UTCL2_MEM_ECC_CNTL, WRITE_COUNTERS, 1) },
1420	{ ATC_L2_CACHE_2M, 8, 2, 1,
1421	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_2M_DSM_INDEX) },
1422	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_2M_DSM_CNTL) },
1423	  SOC15_REG_FIELD(ATC_L2_CACHE_2M_DSM_CNTL, SEC_COUNT),
1424	  SOC15_REG_FIELD(ATC_L2_CACHE_2M_DSM_CNTL, DED_COUNT),
1425	  REG_SET_FIELD(0, ATC_L2_CACHE_2M_DSM_CNTL, WRITE_COUNTERS, 1) },
1426	{ ATC_L2_CACHE_32K, 8, 2, 2,
1427	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_32K_DSM_INDEX) },
1428	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_32K_DSM_CNTL) },
1429	  SOC15_REG_FIELD(ATC_L2_CACHE_32K_DSM_CNTL, SEC_COUNT),
1430	  SOC15_REG_FIELD(ATC_L2_CACHE_32K_DSM_CNTL, DED_COUNT),
1431	  REG_SET_FIELD(0, ATC_L2_CACHE_32K_DSM_CNTL, WRITE_COUNTERS, 1) },
1432	{ ATC_L2_CACHE_4K, 8, 2, 8,
1433	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_4K_DSM_INDEX) },
1434	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_4K_DSM_CNTL) },
1435	  SOC15_REG_FIELD(ATC_L2_CACHE_4K_DSM_CNTL, SEC_COUNT),
1436	  SOC15_REG_FIELD(ATC_L2_CACHE_4K_DSM_CNTL, DED_COUNT),
1437	  REG_SET_FIELD(0, ATC_L2_CACHE_4K_DSM_CNTL, WRITE_COUNTERS, 1) },
1438};
1439
1440static const struct soc15_reg_entry gfx_v9_4_2_ea_err_status_regs = {
1441	SOC15_REG_ENTRY(GC, 0, regGCEA_ERR_STATUS), 0, 1, 16
1442};
1443
1444static int gfx_v9_4_2_get_reg_error_count(struct amdgpu_device *adev,
1445					  const struct soc15_reg_entry *reg,
1446					  uint32_t se_id, uint32_t inst_id,
1447					  uint32_t value, uint32_t *sec_count,
1448					  uint32_t *ded_count)
1449{
1450	uint32_t i;
1451	uint32_t sec_cnt, ded_cnt;
1452
1453	for (i = 0; i < ARRAY_SIZE(gfx_v9_4_2_ras_fields); i++) {
1454		if (gfx_v9_4_2_ras_fields[i].reg_offset != reg->reg_offset ||
1455		    gfx_v9_4_2_ras_fields[i].seg != reg->seg ||
1456		    gfx_v9_4_2_ras_fields[i].inst != reg->inst)
1457			continue;
1458
1459		sec_cnt = SOC15_RAS_REG_FIELD_VAL(
1460			value, gfx_v9_4_2_ras_fields[i], sec);
1461		if (sec_cnt) {
1462			dev_info(adev->dev,
1463				 "GFX SubBlock %s, Instance[%d][%d], SEC %d\n",
1464				 gfx_v9_4_2_ras_fields[i].name, se_id, inst_id,
1465				 sec_cnt);
1466			*sec_count += sec_cnt;
1467		}
1468
1469		ded_cnt = SOC15_RAS_REG_FIELD_VAL(
1470			value, gfx_v9_4_2_ras_fields[i], ded);
1471		if (ded_cnt) {
1472			dev_info(adev->dev,
1473				 "GFX SubBlock %s, Instance[%d][%d], DED %d\n",
1474				 gfx_v9_4_2_ras_fields[i].name, se_id, inst_id,
1475				 ded_cnt);
1476			*ded_count += ded_cnt;
1477		}
1478	}
1479
1480	return 0;
1481}
1482
1483static int gfx_v9_4_2_query_sram_edc_count(struct amdgpu_device *adev,
1484				uint32_t *sec_count, uint32_t *ded_count)
1485{
1486	uint32_t i, j, k, data;
1487	uint32_t sec_cnt = 0, ded_cnt = 0;
1488
1489	if (sec_count && ded_count) {
1490		*sec_count = 0;
1491		*ded_count = 0;
1492	}
1493
1494	mutex_lock(&adev->grbm_idx_mutex);
1495
1496	for (i = 0; i < ARRAY_SIZE(gfx_v9_4_2_edc_counter_regs); i++) {
1497		for (j = 0; j < gfx_v9_4_2_edc_counter_regs[i].se_num; j++) {
1498			for (k = 0; k < gfx_v9_4_2_edc_counter_regs[i].instance;
1499			     k++) {
1500				gfx_v9_4_2_select_se_sh(adev, j, 0, k);
1501
1502				/* if sec/ded_count is null, just clear counter */
1503				if (!sec_count || !ded_count) {
1504					WREG32(SOC15_REG_ENTRY_OFFSET(
1505						gfx_v9_4_2_edc_counter_regs[i]), 0);
1506					continue;
1507				}
1508
1509				data = RREG32(SOC15_REG_ENTRY_OFFSET(
1510					gfx_v9_4_2_edc_counter_regs[i]));
1511
1512				if (!data)
1513					continue;
1514
1515				gfx_v9_4_2_get_reg_error_count(adev,
1516					&gfx_v9_4_2_edc_counter_regs[i],
1517					j, k, data, &sec_cnt, &ded_cnt);
1518
1519				/* clear counter after read */
1520				WREG32(SOC15_REG_ENTRY_OFFSET(
1521					gfx_v9_4_2_edc_counter_regs[i]), 0);
1522			}
1523		}
1524	}
1525
1526	if (sec_count && ded_count) {
1527		*sec_count += sec_cnt;
1528		*ded_count += ded_cnt;
1529	}
1530
1531	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1532	mutex_unlock(&adev->grbm_idx_mutex);
1533
1534	return 0;
1535}
1536
1537static void gfx_v9_4_2_log_utc_edc_count(struct amdgpu_device *adev,
1538					 struct gfx_v9_4_2_utc_block *blk,
1539					 uint32_t instance, uint32_t sec_cnt,
1540					 uint32_t ded_cnt)
1541{
1542	uint32_t bank, way, mem;
1543	static const char *vml2_way_str[] = { "BIGK", "4K" };
1544	static const char *utcl2_rounter_str[] = { "VMC", "APT" };
1545
1546	mem = instance % blk->num_mem_blocks;
1547	way = (instance / blk->num_mem_blocks) % blk->num_ways;
1548	bank = instance / (blk->num_mem_blocks * blk->num_ways);
1549
1550	switch (blk->type) {
1551	case VML2_MEM:
1552		dev_info(
1553			adev->dev,
1554			"GFX SubBlock UTC_VML2_BANK_CACHE_%d_%s_MEM%d, SED %d, DED %d\n",
1555			bank, vml2_way_str[way], mem, sec_cnt, ded_cnt);
1556		break;
1557	case VML2_WALKER_MEM:
1558		dev_info(adev->dev, "GFX SubBlock %s, SED %d, DED %d\n",
1559			 vml2_walker_mems[bank], sec_cnt, ded_cnt);
1560		break;
1561	case UTCL2_MEM:
1562		dev_info(
1563			adev->dev,
1564			"GFX SubBlock UTCL2_ROUTER_IFIF%d_GROUP0_%s, SED %d, DED %d\n",
1565			bank, utcl2_rounter_str[mem], sec_cnt, ded_cnt);
1566		break;
1567	case ATC_L2_CACHE_2M:
1568		dev_info(
1569			adev->dev,
1570			"GFX SubBlock UTC_ATCL2_CACHE_2M_BANK%d_WAY%d_MEM, SED %d, DED %d\n",
1571			bank, way, sec_cnt, ded_cnt);
1572		break;
1573	case ATC_L2_CACHE_32K:
1574		dev_info(
1575			adev->dev,
1576			"GFX SubBlock UTC_ATCL2_CACHE_32K_BANK%d_WAY%d_MEM%d, SED %d, DED %d\n",
1577			bank, way, mem, sec_cnt, ded_cnt);
1578		break;
1579	case ATC_L2_CACHE_4K:
1580		dev_info(
1581			adev->dev,
1582			"GFX SubBlock UTC_ATCL2_CACHE_4K_BANK%d_WAY%d_MEM%d, SED %d, DED %d\n",
1583			bank, way, mem, sec_cnt, ded_cnt);
1584		break;
1585	}
1586}
1587
1588static int gfx_v9_4_2_query_utc_edc_count(struct amdgpu_device *adev,
1589					  uint32_t *sec_count,
1590					  uint32_t *ded_count)
1591{
1592	uint32_t i, j, data;
1593	uint32_t sec_cnt, ded_cnt;
1594	uint32_t num_instances;
1595	struct gfx_v9_4_2_utc_block *blk;
1596
1597	if (sec_count && ded_count) {
1598		*sec_count = 0;
1599		*ded_count = 0;
1600	}
1601
1602	for (i = 0; i < ARRAY_SIZE(gfx_v9_4_2_utc_blocks); i++) {
1603		blk = &gfx_v9_4_2_utc_blocks[i];
1604		num_instances =
1605			blk->num_banks * blk->num_ways * blk->num_mem_blocks;
1606		for (j = 0; j < num_instances; j++) {
1607			WREG32(SOC15_REG_ENTRY_OFFSET(blk->idx_reg), j);
1608
1609			/* if sec/ded_count is NULL, just clear counter */
1610			if (!sec_count || !ded_count) {
1611				WREG32(SOC15_REG_ENTRY_OFFSET(blk->data_reg),
1612				       blk->clear);
1613				continue;
1614			}
1615
1616			data = RREG32(SOC15_REG_ENTRY_OFFSET(blk->data_reg));
1617			if (!data)
1618				continue;
1619
1620			sec_cnt = SOC15_RAS_REG_FIELD_VAL(data, *blk, sec);
1621			*sec_count += sec_cnt;
1622			ded_cnt = SOC15_RAS_REG_FIELD_VAL(data, *blk, ded);
1623			*ded_count += ded_cnt;
1624
1625			/* clear counter after read */
1626			WREG32(SOC15_REG_ENTRY_OFFSET(blk->data_reg),
1627			       blk->clear);
1628
1629			/* print the edc count */
1630			if (sec_cnt || ded_cnt)
1631				gfx_v9_4_2_log_utc_edc_count(adev, blk, j, sec_cnt,
1632							     ded_cnt);
1633		}
1634	}
1635
1636	return 0;
1637}
1638
1639static int gfx_v9_4_2_query_ras_error_count(struct amdgpu_device *adev,
1640					    void *ras_error_status)
1641{
1642	struct ras_err_data *err_data = (struct ras_err_data *)ras_error_status;
1643	uint32_t sec_count = 0, ded_count = 0;
1644
1645	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
1646		return -EINVAL;
1647
1648	err_data->ue_count = 0;
1649	err_data->ce_count = 0;
1650
1651	gfx_v9_4_2_query_sram_edc_count(adev, &sec_count, &ded_count);
1652	err_data->ce_count += sec_count;
1653	err_data->ue_count += ded_count;
1654
1655	gfx_v9_4_2_query_utc_edc_count(adev, &sec_count, &ded_count);
1656	err_data->ce_count += sec_count;
1657	err_data->ue_count += ded_count;
1658
1659	return 0;
1660}
1661
1662static void gfx_v9_4_2_reset_utc_err_status(struct amdgpu_device *adev)
1663{
1664	WREG32_SOC15(GC, 0, regUTCL2_MEM_ECC_STATUS, 0x3);
1665	WREG32_SOC15(GC, 0, regVML2_MEM_ECC_STATUS, 0x3);
1666	WREG32_SOC15(GC, 0, regVML2_WALKER_MEM_ECC_STATUS, 0x3);
1667}
1668
1669static void gfx_v9_4_2_reset_ea_err_status(struct amdgpu_device *adev)
1670{
1671	uint32_t i, j;
1672	uint32_t value;
1673
1674	mutex_lock(&adev->grbm_idx_mutex);
1675	for (i = 0; i < gfx_v9_4_2_ea_err_status_regs.se_num; i++) {
1676		for (j = 0; j < gfx_v9_4_2_ea_err_status_regs.instance;
1677		     j++) {
1678			gfx_v9_4_2_select_se_sh(adev, i, 0, j);
1679			value = RREG32(SOC15_REG_ENTRY_OFFSET(
1680				gfx_v9_4_2_ea_err_status_regs));
1681			value = REG_SET_FIELD(value, GCEA_ERR_STATUS, CLEAR_ERROR_STATUS, 0x1);
1682			WREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_4_2_ea_err_status_regs), value);
1683		}
1684	}
1685	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1686	mutex_unlock(&adev->grbm_idx_mutex);
1687}
1688
1689static void gfx_v9_4_2_reset_ras_error_count(struct amdgpu_device *adev)
1690{
1691	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
1692		return;
1693
1694	gfx_v9_4_2_query_sram_edc_count(adev, NULL, NULL);
1695	gfx_v9_4_2_query_utc_edc_count(adev, NULL, NULL);
1696}
1697
1698static int gfx_v9_4_2_ras_error_inject(struct amdgpu_device *adev, void *inject_if)
1699{
1700	struct ras_inject_if *info = (struct ras_inject_if *)inject_if;
1701	int ret;
1702	struct ta_ras_trigger_error_input block_info = { 0 };
1703
1704	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
1705		return -EINVAL;
1706
1707	block_info.block_id = amdgpu_ras_block_to_ta(info->head.block);
1708	block_info.sub_block_index = info->head.sub_block_index;
1709	block_info.inject_error_type = amdgpu_ras_error_to_ta(info->head.type);
1710	block_info.address = info->address;
1711	block_info.value = info->value;
1712
1713	mutex_lock(&adev->grbm_idx_mutex);
1714	ret = psp_ras_trigger_error(&adev->psp, &block_info);
1715	mutex_unlock(&adev->grbm_idx_mutex);
1716
1717	return ret;
1718}
1719
1720static void gfx_v9_4_2_query_ea_err_status(struct amdgpu_device *adev)
1721{
1722	uint32_t i, j;
1723	uint32_t reg_value;
1724
1725	mutex_lock(&adev->grbm_idx_mutex);
1726
1727	for (i = 0; i < gfx_v9_4_2_ea_err_status_regs.se_num; i++) {
1728		for (j = 0; j < gfx_v9_4_2_ea_err_status_regs.instance;
1729		     j++) {
1730			gfx_v9_4_2_select_se_sh(adev, i, 0, j);
1731			reg_value = RREG32(SOC15_REG_ENTRY_OFFSET(
1732				gfx_v9_4_2_ea_err_status_regs));
1733
1734			if (REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_RDRSP_STATUS) ||
1735			    REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_WRRSP_STATUS) ||
1736			    REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_RDRSP_DATAPARITY_ERROR)) {
1737				dev_warn(adev->dev, "GCEA err detected at instance: %d, status: 0x%x!\n",
1738						j, reg_value);
1739			}
1740			/* clear after read */
1741			reg_value = REG_SET_FIELD(reg_value, GCEA_ERR_STATUS,
1742						  CLEAR_ERROR_STATUS, 0x1);
1743			WREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_4_2_ea_err_status_regs), reg_value);
1744		}
1745	}
1746
1747	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1748	mutex_unlock(&adev->grbm_idx_mutex);
1749}
1750
1751static void gfx_v9_4_2_query_utc_err_status(struct amdgpu_device *adev)
1752{
1753	uint32_t data;
1754
1755	data = RREG32_SOC15(GC, 0, regUTCL2_MEM_ECC_STATUS);
1756	if (data) {
1757		dev_warn(adev->dev, "GFX UTCL2 Mem Ecc Status: 0x%x!\n", data);
1758		WREG32_SOC15(GC, 0, regUTCL2_MEM_ECC_STATUS, 0x3);
1759	}
1760
1761	data = RREG32_SOC15(GC, 0, regVML2_MEM_ECC_STATUS);
1762	if (data) {
1763		dev_warn(adev->dev, "GFX VML2 Mem Ecc Status: 0x%x!\n", data);
1764		WREG32_SOC15(GC, 0, regVML2_MEM_ECC_STATUS, 0x3);
1765	}
1766
1767	data = RREG32_SOC15(GC, 0, regVML2_WALKER_MEM_ECC_STATUS);
1768	if (data) {
1769		dev_warn(adev->dev, "GFX VML2 Walker Mem Ecc Status: 0x%x!\n", data);
1770		WREG32_SOC15(GC, 0, regVML2_WALKER_MEM_ECC_STATUS, 0x3);
1771	}
1772}
1773
1774static void gfx_v9_4_2_query_ras_error_status(struct amdgpu_device *adev)
1775{
1776	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
1777		return;
1778
1779	gfx_v9_4_2_query_ea_err_status(adev);
1780	gfx_v9_4_2_query_utc_err_status(adev);
1781	gfx_v9_4_2_query_sq_timeout_status(adev);
1782}
1783
1784static void gfx_v9_4_2_reset_ras_error_status(struct amdgpu_device *adev)
1785{
1786	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
1787		return;
1788
1789	gfx_v9_4_2_reset_utc_err_status(adev);
1790	gfx_v9_4_2_reset_ea_err_status(adev);
1791	gfx_v9_4_2_reset_sq_timeout_status(adev);
1792}
1793
1794static void gfx_v9_4_2_enable_watchdog_timer(struct amdgpu_device *adev)
1795{
1796	uint32_t i;
1797	uint32_t data;
1798
1799	data = REG_SET_FIELD(0, SQ_TIMEOUT_CONFIG, TIMEOUT_FATAL_DISABLE,
1800			     amdgpu_watchdog_timer.timeout_fatal_disable ? 1 :
1801									   0);
1802
1803	if (amdgpu_watchdog_timer.timeout_fatal_disable &&
1804	    (amdgpu_watchdog_timer.period < 1 ||
1805	     amdgpu_watchdog_timer.period > 0x23)) {
1806		dev_warn(adev->dev, "Watchdog period range is 1 to 0x23\n");
1807		amdgpu_watchdog_timer.period = 0x23;
1808	}
1809	data = REG_SET_FIELD(data, SQ_TIMEOUT_CONFIG, PERIOD_SEL,
1810			     amdgpu_watchdog_timer.period);
1811
1812	mutex_lock(&adev->grbm_idx_mutex);
1813	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
1814		gfx_v9_4_2_select_se_sh(adev, i, 0xffffffff, 0xffffffff);
1815		WREG32_SOC15(GC, 0, regSQ_TIMEOUT_CONFIG, data);
1816	}
1817	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1818	mutex_unlock(&adev->grbm_idx_mutex);
1819}
1820
1821static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address)
1822{
1823	WREG32_SOC15_RLC_EX(reg, GC, 0, regSQ_IND_INDEX,
1824		(wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |
1825		(simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |
1826		(address << SQ_IND_INDEX__INDEX__SHIFT) |
1827		(SQ_IND_INDEX__FORCE_READ_MASK));
1828	return RREG32_SOC15(GC, 0, regSQ_IND_DATA);
1829}
1830
1831static void gfx_v9_4_2_log_cu_timeout_status(struct amdgpu_device *adev,
1832					uint32_t status)
1833{
1834	struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info;
1835	uint32_t i, simd, wave;
1836	uint32_t wave_status;
1837	uint32_t wave_pc_lo, wave_pc_hi;
1838	uint32_t wave_exec_lo, wave_exec_hi;
1839	uint32_t wave_inst_dw0, wave_inst_dw1;
1840	uint32_t wave_ib_sts;
1841
1842	for (i = 0; i < 32; i++) {
1843		if (!((i << 1) & status))
1844			continue;
1845
1846		simd = i / cu_info->max_waves_per_simd;
1847		wave = i % cu_info->max_waves_per_simd;
1848
1849		wave_status = wave_read_ind(adev, simd, wave, ixSQ_WAVE_STATUS);
1850		wave_pc_lo = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_LO);
1851		wave_pc_hi = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_HI);
1852		wave_exec_lo =
1853			wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_LO);
1854		wave_exec_hi =
1855			wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_HI);
1856		wave_inst_dw0 =
1857			wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW0);
1858		wave_inst_dw1 =
1859			wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW1);
1860		wave_ib_sts = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_STS);
1861
1862		dev_info(
1863			adev->dev,
1864			"\t SIMD %d, Wave %d: status 0x%x, pc 0x%llx, exec 0x%llx, inst 0x%llx, ib_sts 0x%x\n",
1865			simd, wave, wave_status,
1866			((uint64_t)wave_pc_hi << 32 | wave_pc_lo),
1867			((uint64_t)wave_exec_hi << 32 | wave_exec_lo),
1868			((uint64_t)wave_inst_dw1 << 32 | wave_inst_dw0),
1869			wave_ib_sts);
1870	}
1871}
1872
1873static void gfx_v9_4_2_query_sq_timeout_status(struct amdgpu_device *adev)
1874{
1875	uint32_t se_idx, sh_idx, cu_idx;
1876	uint32_t status;
1877
1878	mutex_lock(&adev->grbm_idx_mutex);
1879	for (se_idx = 0; se_idx < adev->gfx.config.max_shader_engines;
1880	     se_idx++) {
1881		for (sh_idx = 0; sh_idx < adev->gfx.config.max_sh_per_se;
1882		     sh_idx++) {
1883			for (cu_idx = 0;
1884			     cu_idx < adev->gfx.config.max_cu_per_sh;
1885			     cu_idx++) {
1886				gfx_v9_4_2_select_se_sh(adev, se_idx, sh_idx,
1887							cu_idx);
1888				status = RREG32_SOC15(GC, 0,
1889						      regSQ_TIMEOUT_STATUS);
1890				if (status != 0) {
1891					dev_info(
1892						adev->dev,
1893						"GFX Watchdog Timeout: SE %d, SH %d, CU %d\n",
1894						se_idx, sh_idx, cu_idx);
1895					gfx_v9_4_2_log_cu_timeout_status(
1896						adev, status);
1897				}
1898				/* clear old status */
1899				WREG32_SOC15(GC, 0, regSQ_TIMEOUT_STATUS, 0);
1900			}
1901		}
1902	}
1903	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1904	mutex_unlock(&adev->grbm_idx_mutex);
1905}
1906
1907static void gfx_v9_4_2_reset_sq_timeout_status(struct amdgpu_device *adev)
1908{
1909	uint32_t se_idx, sh_idx, cu_idx;
1910
1911	mutex_lock(&adev->grbm_idx_mutex);
1912	for (se_idx = 0; se_idx < adev->gfx.config.max_shader_engines;
1913	     se_idx++) {
1914		for (sh_idx = 0; sh_idx < adev->gfx.config.max_sh_per_se;
1915		     sh_idx++) {
1916			for (cu_idx = 0;
1917			     cu_idx < adev->gfx.config.max_cu_per_sh;
1918			     cu_idx++) {
1919				gfx_v9_4_2_select_se_sh(adev, se_idx, sh_idx,
1920							cu_idx);
1921				WREG32_SOC15(GC, 0, regSQ_TIMEOUT_STATUS, 0);
1922			}
1923		}
1924	}
1925	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1926	mutex_unlock(&adev->grbm_idx_mutex);
1927}
1928
1929const struct amdgpu_gfx_ras_funcs gfx_v9_4_2_ras_funcs = {
1930	.ras_late_init = amdgpu_gfx_ras_late_init,
1931	.ras_fini = amdgpu_gfx_ras_fini,
1932	.ras_error_inject = &gfx_v9_4_2_ras_error_inject,
1933	.query_ras_error_count = &gfx_v9_4_2_query_ras_error_count,
1934	.reset_ras_error_count = &gfx_v9_4_2_reset_ras_error_count,
1935	.query_ras_error_status = &gfx_v9_4_2_query_ras_error_status,
1936	.reset_ras_error_status = &gfx_v9_4_2_reset_ras_error_status,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1937	.enable_watchdog_timer = &gfx_v9_4_2_enable_watchdog_timer,
 
1938};