0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 #include "amdgpu.h"
0024 #include "soc15.h"
0025 #include "soc15d.h"
0026
0027 #include "gc/gc_9_4_2_offset.h"
0028 #include "gc/gc_9_4_2_sh_mask.h"
0029 #include "gfx_v9_0.h"
0030
0031 #include "gfx_v9_4_2.h"
0032 #include "amdgpu_ras.h"
0033 #include "amdgpu_gfx.h"
0034
0035 #define SE_ID_MAX 8
0036 #define CU_ID_MAX 16
0037 #define SIMD_ID_MAX 4
0038 #define WAVE_ID_MAX 10
0039
0040 enum gfx_v9_4_2_utc_type {
0041 VML2_MEM,
0042 VML2_WALKER_MEM,
0043 UTCL2_MEM,
0044 ATC_L2_CACHE_2M,
0045 ATC_L2_CACHE_32K,
0046 ATC_L2_CACHE_4K
0047 };
0048
0049 struct gfx_v9_4_2_utc_block {
0050 enum gfx_v9_4_2_utc_type type;
0051 uint32_t num_banks;
0052 uint32_t num_ways;
0053 uint32_t num_mem_blocks;
0054 struct soc15_reg idx_reg;
0055 struct soc15_reg data_reg;
0056 uint32_t sec_count_mask;
0057 uint32_t sec_count_shift;
0058 uint32_t ded_count_mask;
0059 uint32_t ded_count_shift;
0060 uint32_t clear;
0061 };
0062
0063 static const struct soc15_reg_golden golden_settings_gc_9_4_2_alde_die_0[] = {
0064 SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_0, 0x3fffffff, 0x141dc920),
0065 SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_1, 0x3fffffff, 0x3b458b93),
0066 SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_2, 0x3fffffff, 0x1a4f5583),
0067 SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_3, 0x3fffffff, 0x317717f6),
0068 SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_4, 0x3fffffff, 0x107cc1e6),
0069 SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_5, 0x3ff, 0x351),
0070 };
0071
0072 static const struct soc15_reg_golden golden_settings_gc_9_4_2_alde_die_1[] = {
0073 SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_0, 0x3fffffff, 0x2591aa38),
0074 SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_1, 0x3fffffff, 0xac9e88b),
0075 SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_2, 0x3fffffff, 0x2bc3369b),
0076 SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_3, 0x3fffffff, 0xfb74ee),
0077 SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_4, 0x3fffffff, 0x21f0a2fe),
0078 SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_5, 0x3ff, 0x49),
0079 };
0080
0081 static const struct soc15_reg_golden golden_settings_gc_9_4_2_alde[] = {
0082 SOC15_REG_GOLDEN_VALUE(GC, 0, regGB_ADDR_CONFIG, 0xffff77ff, 0x2a114042),
0083 SOC15_REG_GOLDEN_VALUE(GC, 0, regTA_CNTL_AUX, 0xfffffeef, 0x10b0000),
0084 SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_UTCL1_CNTL1, 0xffffffff, 0x30800400),
0085 SOC15_REG_GOLDEN_VALUE(GC, 0, regTCI_CNTL_3, 0xff, 0x20),
0086 };
0087
0088
0089
0090
0091
0092
0093 static const u32 vgpr_init_compute_shader_aldebaran[] = {
0094 0xb8840904, 0xb8851a04, 0xb8861344, 0xb8831804, 0x9208ff06, 0x00000280,
0095 0x9209a805, 0x920a8a04, 0x81080908, 0x81080a08, 0x81080308, 0x8e078208,
0096 0x81078407, 0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8a0000, 0xd3d94000,
0097 0x18000080, 0xd3d94001, 0x18000080, 0xd3d94002, 0x18000080, 0xd3d94003,
0098 0x18000080, 0xd3d94004, 0x18000080, 0xd3d94005, 0x18000080, 0xd3d94006,
0099 0x18000080, 0xd3d94007, 0x18000080, 0xd3d94008, 0x18000080, 0xd3d94009,
0100 0x18000080, 0xd3d9400a, 0x18000080, 0xd3d9400b, 0x18000080, 0xd3d9400c,
0101 0x18000080, 0xd3d9400d, 0x18000080, 0xd3d9400e, 0x18000080, 0xd3d9400f,
0102 0x18000080, 0xd3d94010, 0x18000080, 0xd3d94011, 0x18000080, 0xd3d94012,
0103 0x18000080, 0xd3d94013, 0x18000080, 0xd3d94014, 0x18000080, 0xd3d94015,
0104 0x18000080, 0xd3d94016, 0x18000080, 0xd3d94017, 0x18000080, 0xd3d94018,
0105 0x18000080, 0xd3d94019, 0x18000080, 0xd3d9401a, 0x18000080, 0xd3d9401b,
0106 0x18000080, 0xd3d9401c, 0x18000080, 0xd3d9401d, 0x18000080, 0xd3d9401e,
0107 0x18000080, 0xd3d9401f, 0x18000080, 0xd3d94020, 0x18000080, 0xd3d94021,
0108 0x18000080, 0xd3d94022, 0x18000080, 0xd3d94023, 0x18000080, 0xd3d94024,
0109 0x18000080, 0xd3d94025, 0x18000080, 0xd3d94026, 0x18000080, 0xd3d94027,
0110 0x18000080, 0xd3d94028, 0x18000080, 0xd3d94029, 0x18000080, 0xd3d9402a,
0111 0x18000080, 0xd3d9402b, 0x18000080, 0xd3d9402c, 0x18000080, 0xd3d9402d,
0112 0x18000080, 0xd3d9402e, 0x18000080, 0xd3d9402f, 0x18000080, 0xd3d94030,
0113 0x18000080, 0xd3d94031, 0x18000080, 0xd3d94032, 0x18000080, 0xd3d94033,
0114 0x18000080, 0xd3d94034, 0x18000080, 0xd3d94035, 0x18000080, 0xd3d94036,
0115 0x18000080, 0xd3d94037, 0x18000080, 0xd3d94038, 0x18000080, 0xd3d94039,
0116 0x18000080, 0xd3d9403a, 0x18000080, 0xd3d9403b, 0x18000080, 0xd3d9403c,
0117 0x18000080, 0xd3d9403d, 0x18000080, 0xd3d9403e, 0x18000080, 0xd3d9403f,
0118 0x18000080, 0xd3d94040, 0x18000080, 0xd3d94041, 0x18000080, 0xd3d94042,
0119 0x18000080, 0xd3d94043, 0x18000080, 0xd3d94044, 0x18000080, 0xd3d94045,
0120 0x18000080, 0xd3d94046, 0x18000080, 0xd3d94047, 0x18000080, 0xd3d94048,
0121 0x18000080, 0xd3d94049, 0x18000080, 0xd3d9404a, 0x18000080, 0xd3d9404b,
0122 0x18000080, 0xd3d9404c, 0x18000080, 0xd3d9404d, 0x18000080, 0xd3d9404e,
0123 0x18000080, 0xd3d9404f, 0x18000080, 0xd3d94050, 0x18000080, 0xd3d94051,
0124 0x18000080, 0xd3d94052, 0x18000080, 0xd3d94053, 0x18000080, 0xd3d94054,
0125 0x18000080, 0xd3d94055, 0x18000080, 0xd3d94056, 0x18000080, 0xd3d94057,
0126 0x18000080, 0xd3d94058, 0x18000080, 0xd3d94059, 0x18000080, 0xd3d9405a,
0127 0x18000080, 0xd3d9405b, 0x18000080, 0xd3d9405c, 0x18000080, 0xd3d9405d,
0128 0x18000080, 0xd3d9405e, 0x18000080, 0xd3d9405f, 0x18000080, 0xd3d94060,
0129 0x18000080, 0xd3d94061, 0x18000080, 0xd3d94062, 0x18000080, 0xd3d94063,
0130 0x18000080, 0xd3d94064, 0x18000080, 0xd3d94065, 0x18000080, 0xd3d94066,
0131 0x18000080, 0xd3d94067, 0x18000080, 0xd3d94068, 0x18000080, 0xd3d94069,
0132 0x18000080, 0xd3d9406a, 0x18000080, 0xd3d9406b, 0x18000080, 0xd3d9406c,
0133 0x18000080, 0xd3d9406d, 0x18000080, 0xd3d9406e, 0x18000080, 0xd3d9406f,
0134 0x18000080, 0xd3d94070, 0x18000080, 0xd3d94071, 0x18000080, 0xd3d94072,
0135 0x18000080, 0xd3d94073, 0x18000080, 0xd3d94074, 0x18000080, 0xd3d94075,
0136 0x18000080, 0xd3d94076, 0x18000080, 0xd3d94077, 0x18000080, 0xd3d94078,
0137 0x18000080, 0xd3d94079, 0x18000080, 0xd3d9407a, 0x18000080, 0xd3d9407b,
0138 0x18000080, 0xd3d9407c, 0x18000080, 0xd3d9407d, 0x18000080, 0xd3d9407e,
0139 0x18000080, 0xd3d9407f, 0x18000080, 0xd3d94080, 0x18000080, 0xd3d94081,
0140 0x18000080, 0xd3d94082, 0x18000080, 0xd3d94083, 0x18000080, 0xd3d94084,
0141 0x18000080, 0xd3d94085, 0x18000080, 0xd3d94086, 0x18000080, 0xd3d94087,
0142 0x18000080, 0xd3d94088, 0x18000080, 0xd3d94089, 0x18000080, 0xd3d9408a,
0143 0x18000080, 0xd3d9408b, 0x18000080, 0xd3d9408c, 0x18000080, 0xd3d9408d,
0144 0x18000080, 0xd3d9408e, 0x18000080, 0xd3d9408f, 0x18000080, 0xd3d94090,
0145 0x18000080, 0xd3d94091, 0x18000080, 0xd3d94092, 0x18000080, 0xd3d94093,
0146 0x18000080, 0xd3d94094, 0x18000080, 0xd3d94095, 0x18000080, 0xd3d94096,
0147 0x18000080, 0xd3d94097, 0x18000080, 0xd3d94098, 0x18000080, 0xd3d94099,
0148 0x18000080, 0xd3d9409a, 0x18000080, 0xd3d9409b, 0x18000080, 0xd3d9409c,
0149 0x18000080, 0xd3d9409d, 0x18000080, 0xd3d9409e, 0x18000080, 0xd3d9409f,
0150 0x18000080, 0xd3d940a0, 0x18000080, 0xd3d940a1, 0x18000080, 0xd3d940a2,
0151 0x18000080, 0xd3d940a3, 0x18000080, 0xd3d940a4, 0x18000080, 0xd3d940a5,
0152 0x18000080, 0xd3d940a6, 0x18000080, 0xd3d940a7, 0x18000080, 0xd3d940a8,
0153 0x18000080, 0xd3d940a9, 0x18000080, 0xd3d940aa, 0x18000080, 0xd3d940ab,
0154 0x18000080, 0xd3d940ac, 0x18000080, 0xd3d940ad, 0x18000080, 0xd3d940ae,
0155 0x18000080, 0xd3d940af, 0x18000080, 0xd3d940b0, 0x18000080, 0xd3d940b1,
0156 0x18000080, 0xd3d940b2, 0x18000080, 0xd3d940b3, 0x18000080, 0xd3d940b4,
0157 0x18000080, 0xd3d940b5, 0x18000080, 0xd3d940b6, 0x18000080, 0xd3d940b7,
0158 0x18000080, 0xd3d940b8, 0x18000080, 0xd3d940b9, 0x18000080, 0xd3d940ba,
0159 0x18000080, 0xd3d940bb, 0x18000080, 0xd3d940bc, 0x18000080, 0xd3d940bd,
0160 0x18000080, 0xd3d940be, 0x18000080, 0xd3d940bf, 0x18000080, 0xd3d940c0,
0161 0x18000080, 0xd3d940c1, 0x18000080, 0xd3d940c2, 0x18000080, 0xd3d940c3,
0162 0x18000080, 0xd3d940c4, 0x18000080, 0xd3d940c5, 0x18000080, 0xd3d940c6,
0163 0x18000080, 0xd3d940c7, 0x18000080, 0xd3d940c8, 0x18000080, 0xd3d940c9,
0164 0x18000080, 0xd3d940ca, 0x18000080, 0xd3d940cb, 0x18000080, 0xd3d940cc,
0165 0x18000080, 0xd3d940cd, 0x18000080, 0xd3d940ce, 0x18000080, 0xd3d940cf,
0166 0x18000080, 0xd3d940d0, 0x18000080, 0xd3d940d1, 0x18000080, 0xd3d940d2,
0167 0x18000080, 0xd3d940d3, 0x18000080, 0xd3d940d4, 0x18000080, 0xd3d940d5,
0168 0x18000080, 0xd3d940d6, 0x18000080, 0xd3d940d7, 0x18000080, 0xd3d940d8,
0169 0x18000080, 0xd3d940d9, 0x18000080, 0xd3d940da, 0x18000080, 0xd3d940db,
0170 0x18000080, 0xd3d940dc, 0x18000080, 0xd3d940dd, 0x18000080, 0xd3d940de,
0171 0x18000080, 0xd3d940df, 0x18000080, 0xd3d940e0, 0x18000080, 0xd3d940e1,
0172 0x18000080, 0xd3d940e2, 0x18000080, 0xd3d940e3, 0x18000080, 0xd3d940e4,
0173 0x18000080, 0xd3d940e5, 0x18000080, 0xd3d940e6, 0x18000080, 0xd3d940e7,
0174 0x18000080, 0xd3d940e8, 0x18000080, 0xd3d940e9, 0x18000080, 0xd3d940ea,
0175 0x18000080, 0xd3d940eb, 0x18000080, 0xd3d940ec, 0x18000080, 0xd3d940ed,
0176 0x18000080, 0xd3d940ee, 0x18000080, 0xd3d940ef, 0x18000080, 0xd3d940f0,
0177 0x18000080, 0xd3d940f1, 0x18000080, 0xd3d940f2, 0x18000080, 0xd3d940f3,
0178 0x18000080, 0xd3d940f4, 0x18000080, 0xd3d940f5, 0x18000080, 0xd3d940f6,
0179 0x18000080, 0xd3d940f7, 0x18000080, 0xd3d940f8, 0x18000080, 0xd3d940f9,
0180 0x18000080, 0xd3d940fa, 0x18000080, 0xd3d940fb, 0x18000080, 0xd3d940fc,
0181 0x18000080, 0xd3d940fd, 0x18000080, 0xd3d940fe, 0x18000080, 0xd3d940ff,
0182 0x18000080, 0xb07c0000, 0xbe8a00ff, 0x000000f8, 0xbf11080a, 0x7e000280,
0183 0x7e020280, 0x7e040280, 0x7e060280, 0x7e080280, 0x7e0a0280, 0x7e0c0280,
0184 0x7e0e0280, 0x808a880a, 0xbe80320a, 0xbf84fff5, 0xbf9c0000, 0xd28c0001,
0185 0x0001007f, 0xd28d0001, 0x0002027e, 0x10020288, 0xbe8b0004, 0xb78b4000,
0186 0xd1196a01, 0x00001701, 0xbe8a0087, 0xbefc00c1, 0xd89c4000, 0x00020201,
0187 0xd89cc080, 0x00040401, 0x320202ff, 0x00000800, 0x808a810a, 0xbf84fff8,
0188 0xbf810000,
0189 };
0190
0191 const struct soc15_reg_entry vgpr_init_regs_aldebaran[] = {
0192 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
0193 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_X), 0x40 },
0194 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Y), 4 },
0195 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Z), 1 },
0196 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC1), 0xbf },
0197 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC2), 0x400006 },
0198 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC3), 0x3F },
0199 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE0), 0xffffffff },
0200 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE1), 0xffffffff },
0201 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE2), 0xffffffff },
0202 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE3), 0xffffffff },
0203 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE4), 0xffffffff },
0204 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE5), 0xffffffff },
0205 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE6), 0xffffffff },
0206 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE7), 0xffffffff },
0207 };
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219 static const u32 sgpr112_init_compute_shader_aldebaran[] = {
0220 0xb8840904, 0xb8851a04, 0xb8861344, 0xb8831804, 0x9208ff06, 0x00000280,
0221 0x9209a805, 0x920a8a04, 0x81080908, 0x81080a08, 0x81080308, 0x8e078208,
0222 0x81078407, 0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8e003f, 0xc0030200,
0223 0x00000000, 0xbf8c0000, 0xbf06ff08, 0xdeadbeaf, 0xbf84fff9, 0x81028102,
0224 0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8a0000, 0xbefc0080, 0xbeea0080,
0225 0xbeeb0080, 0xbf00f280, 0xbee60080, 0xbee70080, 0xbee80080, 0xbee90080,
0226 0xbefe0080, 0xbeff0080, 0xbe880080, 0xbe890080, 0xbe8a0080, 0xbe8b0080,
0227 0xbe8c0080, 0xbe8d0080, 0xbe8e0080, 0xbe8f0080, 0xbe900080, 0xbe910080,
0228 0xbe920080, 0xbe930080, 0xbe940080, 0xbe950080, 0xbe960080, 0xbe970080,
0229 0xbe980080, 0xbe990080, 0xbe9a0080, 0xbe9b0080, 0xbe9c0080, 0xbe9d0080,
0230 0xbe9e0080, 0xbe9f0080, 0xbea00080, 0xbea10080, 0xbea20080, 0xbea30080,
0231 0xbea40080, 0xbea50080, 0xbea60080, 0xbea70080, 0xbea80080, 0xbea90080,
0232 0xbeaa0080, 0xbeab0080, 0xbeac0080, 0xbead0080, 0xbeae0080, 0xbeaf0080,
0233 0xbeb00080, 0xbeb10080, 0xbeb20080, 0xbeb30080, 0xbeb40080, 0xbeb50080,
0234 0xbeb60080, 0xbeb70080, 0xbeb80080, 0xbeb90080, 0xbeba0080, 0xbebb0080,
0235 0xbebc0080, 0xbebd0080, 0xbebe0080, 0xbebf0080, 0xbec00080, 0xbec10080,
0236 0xbec20080, 0xbec30080, 0xbec40080, 0xbec50080, 0xbec60080, 0xbec70080,
0237 0xbec80080, 0xbec90080, 0xbeca0080, 0xbecb0080, 0xbecc0080, 0xbecd0080,
0238 0xbece0080, 0xbecf0080, 0xbed00080, 0xbed10080, 0xbed20080, 0xbed30080,
0239 0xbed40080, 0xbed50080, 0xbed60080, 0xbed70080, 0xbed80080, 0xbed90080,
0240 0xbeda0080, 0xbedb0080, 0xbedc0080, 0xbedd0080, 0xbede0080, 0xbedf0080,
0241 0xbee00080, 0xbee10080, 0xbee20080, 0xbee30080, 0xbee40080, 0xbee50080,
0242 0xbf810000
0243 };
0244
0245 const struct soc15_reg_entry sgpr112_init_regs_aldebaran[] = {
0246 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
0247 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_X), 0x40 },
0248 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Y), 8 },
0249 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Z), 1 },
0250 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC1), 0x340 },
0251 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC2), 0x6 },
0252 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC3), 0x0 },
0253 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE0), 0xffffffff },
0254 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE1), 0xffffffff },
0255 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE2), 0xffffffff },
0256 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE3), 0xffffffff },
0257 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE4), 0xffffffff },
0258 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE5), 0xffffffff },
0259 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE6), 0xffffffff },
0260 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE7), 0xffffffff },
0261 };
0262
0263 static const u32 sgpr96_init_compute_shader_aldebaran[] = {
0264 0xb8840904, 0xb8851a04, 0xb8861344, 0xb8831804, 0x9208ff06, 0x00000280,
0265 0x9209a805, 0x920a8a04, 0x81080908, 0x81080a08, 0x81080308, 0x8e078208,
0266 0x81078407, 0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8e003f, 0xc0030200,
0267 0x00000000, 0xbf8c0000, 0xbf06ff08, 0xdeadbeaf, 0xbf84fff9, 0x81028102,
0268 0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8a0000, 0xbefc0080, 0xbeea0080,
0269 0xbeeb0080, 0xbf00f280, 0xbee60080, 0xbee70080, 0xbee80080, 0xbee90080,
0270 0xbefe0080, 0xbeff0080, 0xbe880080, 0xbe890080, 0xbe8a0080, 0xbe8b0080,
0271 0xbe8c0080, 0xbe8d0080, 0xbe8e0080, 0xbe8f0080, 0xbe900080, 0xbe910080,
0272 0xbe920080, 0xbe930080, 0xbe940080, 0xbe950080, 0xbe960080, 0xbe970080,
0273 0xbe980080, 0xbe990080, 0xbe9a0080, 0xbe9b0080, 0xbe9c0080, 0xbe9d0080,
0274 0xbe9e0080, 0xbe9f0080, 0xbea00080, 0xbea10080, 0xbea20080, 0xbea30080,
0275 0xbea40080, 0xbea50080, 0xbea60080, 0xbea70080, 0xbea80080, 0xbea90080,
0276 0xbeaa0080, 0xbeab0080, 0xbeac0080, 0xbead0080, 0xbeae0080, 0xbeaf0080,
0277 0xbeb00080, 0xbeb10080, 0xbeb20080, 0xbeb30080, 0xbeb40080, 0xbeb50080,
0278 0xbeb60080, 0xbeb70080, 0xbeb80080, 0xbeb90080, 0xbeba0080, 0xbebb0080,
0279 0xbebc0080, 0xbebd0080, 0xbebe0080, 0xbebf0080, 0xbec00080, 0xbec10080,
0280 0xbec20080, 0xbec30080, 0xbec40080, 0xbec50080, 0xbec60080, 0xbec70080,
0281 0xbec80080, 0xbec90080, 0xbeca0080, 0xbecb0080, 0xbecc0080, 0xbecd0080,
0282 0xbece0080, 0xbecf0080, 0xbed00080, 0xbed10080, 0xbed20080, 0xbed30080,
0283 0xbed40080, 0xbed50080, 0xbed60080, 0xbed70080, 0xbed80080, 0xbed90080,
0284 0xbf810000,
0285 };
0286
0287 const struct soc15_reg_entry sgpr96_init_regs_aldebaran[] = {
0288 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
0289 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_X), 0x40 },
0290 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Y), 0xc },
0291 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Z), 1 },
0292 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC1), 0x2c0 },
0293 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC2), 0x6 },
0294 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC3), 0x0 },
0295 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE0), 0xffffffff },
0296 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE1), 0xffffffff },
0297 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE2), 0xffffffff },
0298 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE3), 0xffffffff },
0299 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE4), 0xffffffff },
0300 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE5), 0xffffffff },
0301 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE6), 0xffffffff },
0302 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE7), 0xffffffff },
0303 };
0304
0305
0306
0307
0308
0309
0310 static const u32 sgpr64_init_compute_shader_aldebaran[] = {
0311 0xb8840904, 0xb8851a04, 0xb8861344, 0xb8831804, 0x9208ff06, 0x00000280,
0312 0x9209a805, 0x920a8a04, 0x81080908, 0x81080a08, 0x81080308, 0x8e078208,
0313 0x81078407, 0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8e003f, 0xc0030200,
0314 0x00000000, 0xbf8c0000, 0xbf06ff08, 0xdeadbeaf, 0xbf84fff9, 0x81028102,
0315 0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8a0000, 0xbefc0080, 0xbeea0080,
0316 0xbeeb0080, 0xbf00f280, 0xbee60080, 0xbee70080, 0xbee80080, 0xbee90080,
0317 0xbefe0080, 0xbeff0080, 0xbe880080, 0xbe890080, 0xbe8a0080, 0xbe8b0080,
0318 0xbe8c0080, 0xbe8d0080, 0xbe8e0080, 0xbe8f0080, 0xbe900080, 0xbe910080,
0319 0xbe920080, 0xbe930080, 0xbe940080, 0xbe950080, 0xbe960080, 0xbe970080,
0320 0xbe980080, 0xbe990080, 0xbe9a0080, 0xbe9b0080, 0xbe9c0080, 0xbe9d0080,
0321 0xbe9e0080, 0xbe9f0080, 0xbea00080, 0xbea10080, 0xbea20080, 0xbea30080,
0322 0xbea40080, 0xbea50080, 0xbea60080, 0xbea70080, 0xbea80080, 0xbea90080,
0323 0xbeaa0080, 0xbeab0080, 0xbeac0080, 0xbead0080, 0xbeae0080, 0xbeaf0080,
0324 0xbeb00080, 0xbeb10080, 0xbeb20080, 0xbeb30080, 0xbeb40080, 0xbeb50080,
0325 0xbeb60080, 0xbeb70080, 0xbeb80080, 0xbeb90080, 0xbf810000,
0326 };
0327
0328 const struct soc15_reg_entry sgpr64_init_regs_aldebaran[] = {
0329 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
0330 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_X), 0x40 },
0331 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Y), 0x10 },
0332 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Z), 1 },
0333 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC1), 0x1c0 },
0334 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC2), 0x6 },
0335 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC3), 0x0 },
0336 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE0), 0xffffffff },
0337 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE1), 0xffffffff },
0338 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE2), 0xffffffff },
0339 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE3), 0xffffffff },
0340 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE4), 0xffffffff },
0341 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE5), 0xffffffff },
0342 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE6), 0xffffffff },
0343 { SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE7), 0xffffffff },
0344 };
0345
0346 static int gfx_v9_4_2_run_shader(struct amdgpu_device *adev,
0347 struct amdgpu_ring *ring,
0348 struct amdgpu_ib *ib,
0349 const u32 *shader_ptr, u32 shader_size,
0350 const struct soc15_reg_entry *init_regs, u32 regs_size,
0351 u32 compute_dim_x, u64 wb_gpu_addr, u32 pattern,
0352 struct dma_fence **fence_ptr)
0353 {
0354 int r, i;
0355 uint32_t total_size, shader_offset;
0356 u64 gpu_addr;
0357
0358 total_size = (regs_size * 3 + 4 + 5 + 5) * 4;
0359 total_size = ALIGN(total_size, 256);
0360 shader_offset = total_size;
0361 total_size += ALIGN(shader_size, 256);
0362
0363
0364 memset(ib, 0, sizeof(*ib));
0365 r = amdgpu_ib_get(adev, NULL, total_size,
0366 AMDGPU_IB_POOL_DIRECT, ib);
0367 if (r) {
0368 dev_err(adev->dev, "failed to get ib (%d).\n", r);
0369 return r;
0370 }
0371
0372
0373 for (i = 0; i < shader_size/sizeof(u32); i++)
0374 ib->ptr[i + (shader_offset / 4)] = shader_ptr[i];
0375
0376
0377 ib->length_dw = 0;
0378
0379
0380 for (i = 0; i < regs_size; i++) {
0381 ib->ptr[ib->length_dw++] = PACKET3(PACKET3_SET_SH_REG, 1);
0382 ib->ptr[ib->length_dw++] = SOC15_REG_ENTRY_OFFSET(init_regs[i])
0383 - PACKET3_SET_SH_REG_START;
0384 ib->ptr[ib->length_dw++] = init_regs[i].reg_value;
0385 }
0386
0387
0388 gpu_addr = (ib->gpu_addr + (u64)shader_offset) >> 8;
0389 ib->ptr[ib->length_dw++] = PACKET3(PACKET3_SET_SH_REG, 2);
0390 ib->ptr[ib->length_dw++] = SOC15_REG_OFFSET(GC, 0, regCOMPUTE_PGM_LO)
0391 - PACKET3_SET_SH_REG_START;
0392 ib->ptr[ib->length_dw++] = lower_32_bits(gpu_addr);
0393 ib->ptr[ib->length_dw++] = upper_32_bits(gpu_addr);
0394
0395
0396 ib->ptr[ib->length_dw++] = PACKET3(PACKET3_SET_SH_REG, 3);
0397 ib->ptr[ib->length_dw++] = SOC15_REG_OFFSET(GC, 0, regCOMPUTE_USER_DATA_0)
0398 - PACKET3_SET_SH_REG_START;
0399 ib->ptr[ib->length_dw++] = lower_32_bits(wb_gpu_addr);
0400 ib->ptr[ib->length_dw++] = upper_32_bits(wb_gpu_addr);
0401 ib->ptr[ib->length_dw++] = pattern;
0402
0403
0404 ib->ptr[ib->length_dw++] = PACKET3(PACKET3_DISPATCH_DIRECT, 3);
0405 ib->ptr[ib->length_dw++] = compute_dim_x;
0406 ib->ptr[ib->length_dw++] = 1;
0407 ib->ptr[ib->length_dw++] = 1;
0408 ib->ptr[ib->length_dw++] =
0409 REG_SET_FIELD(0, COMPUTE_DISPATCH_INITIATOR, COMPUTE_SHADER_EN, 1);
0410
0411
0412 r = amdgpu_ib_schedule(ring, 1, ib, NULL, fence_ptr);
0413 if (r) {
0414 dev_err(adev->dev, "ib submit failed (%d).\n", r);
0415 amdgpu_ib_free(adev, ib, NULL);
0416 }
0417 return r;
0418 }
0419
0420 static void gfx_v9_4_2_log_wave_assignment(struct amdgpu_device *adev, uint32_t *wb_ptr)
0421 {
0422 uint32_t se, cu, simd, wave;
0423 uint32_t offset = 0;
0424 char *str;
0425 int size;
0426
0427 str = kmalloc(256, GFP_KERNEL);
0428 if (!str)
0429 return;
0430
0431 dev_dbg(adev->dev, "wave assignment:\n");
0432
0433 for (se = 0; se < adev->gfx.config.max_shader_engines; se++) {
0434 for (cu = 0; cu < CU_ID_MAX; cu++) {
0435 memset(str, 0, 256);
0436 size = sprintf(str, "SE[%02d]CU[%02d]: ", se, cu);
0437 for (simd = 0; simd < SIMD_ID_MAX; simd++) {
0438 size += sprintf(str + size, "[");
0439 for (wave = 0; wave < WAVE_ID_MAX; wave++) {
0440 size += sprintf(str + size, "%x", wb_ptr[offset]);
0441 offset++;
0442 }
0443 size += sprintf(str + size, "] ");
0444 }
0445 dev_dbg(adev->dev, "%s\n", str);
0446 }
0447 }
0448
0449 kfree(str);
0450 }
0451
0452 static int gfx_v9_4_2_wait_for_waves_assigned(struct amdgpu_device *adev,
0453 uint32_t *wb_ptr, uint32_t mask,
0454 uint32_t pattern, uint32_t num_wave, bool wait)
0455 {
0456 uint32_t se, cu, simd, wave;
0457 uint32_t loop = 0;
0458 uint32_t wave_cnt;
0459 uint32_t offset;
0460
0461 do {
0462 wave_cnt = 0;
0463 offset = 0;
0464
0465 for (se = 0; se < adev->gfx.config.max_shader_engines; se++)
0466 for (cu = 0; cu < CU_ID_MAX; cu++)
0467 for (simd = 0; simd < SIMD_ID_MAX; simd++)
0468 for (wave = 0; wave < WAVE_ID_MAX; wave++) {
0469 if (((1 << wave) & mask) &&
0470 (wb_ptr[offset] == pattern))
0471 wave_cnt++;
0472
0473 offset++;
0474 }
0475
0476 if (wave_cnt == num_wave)
0477 return 0;
0478
0479 mdelay(1);
0480 } while (++loop < 2000 && wait);
0481
0482 dev_err(adev->dev, "actual wave num: %d, expected wave num: %d\n",
0483 wave_cnt, num_wave);
0484
0485 gfx_v9_4_2_log_wave_assignment(adev, wb_ptr);
0486
0487 return -EBADSLT;
0488 }
0489
0490 static int gfx_v9_4_2_do_sgprs_init(struct amdgpu_device *adev)
0491 {
0492 int r;
0493 int wb_size = adev->gfx.config.max_shader_engines *
0494 CU_ID_MAX * SIMD_ID_MAX * WAVE_ID_MAX;
0495 struct amdgpu_ib wb_ib;
0496 struct amdgpu_ib disp_ibs[3];
0497 struct dma_fence *fences[3];
0498 u32 pattern[3] = { 0x1, 0x5, 0xa };
0499
0500
0501 if (!adev->gfx.compute_ring[0].sched.ready ||
0502 !adev->gfx.compute_ring[1].sched.ready)
0503 return 0;
0504
0505
0506 memset(&wb_ib, 0, sizeof(wb_ib));
0507 r = amdgpu_ib_get(adev, NULL, (1 + wb_size) * sizeof(uint32_t),
0508 AMDGPU_IB_POOL_DIRECT, &wb_ib);
0509 if (r) {
0510 dev_err(adev->dev, "failed to get ib (%d) for wb\n", r);
0511 return r;
0512 }
0513 memset(wb_ib.ptr, 0, (1 + wb_size) * sizeof(uint32_t));
0514
0515 r = gfx_v9_4_2_run_shader(adev,
0516 &adev->gfx.compute_ring[0],
0517 &disp_ibs[0],
0518 sgpr112_init_compute_shader_aldebaran,
0519 sizeof(sgpr112_init_compute_shader_aldebaran),
0520 sgpr112_init_regs_aldebaran,
0521 ARRAY_SIZE(sgpr112_init_regs_aldebaran),
0522 adev->gfx.cu_info.number,
0523 wb_ib.gpu_addr, pattern[0], &fences[0]);
0524 if (r) {
0525 dev_err(adev->dev, "failed to clear first 224 sgprs\n");
0526 goto pro_end;
0527 }
0528
0529 r = gfx_v9_4_2_wait_for_waves_assigned(adev,
0530 &wb_ib.ptr[1], 0b11,
0531 pattern[0],
0532 adev->gfx.cu_info.number * SIMD_ID_MAX * 2,
0533 true);
0534 if (r) {
0535 dev_err(adev->dev, "wave coverage failed when clear first 224 sgprs\n");
0536 wb_ib.ptr[0] = 0xdeadbeaf;
0537 goto disp0_failed;
0538 }
0539
0540 r = gfx_v9_4_2_run_shader(adev,
0541 &adev->gfx.compute_ring[1],
0542 &disp_ibs[1],
0543 sgpr96_init_compute_shader_aldebaran,
0544 sizeof(sgpr96_init_compute_shader_aldebaran),
0545 sgpr96_init_regs_aldebaran,
0546 ARRAY_SIZE(sgpr96_init_regs_aldebaran),
0547 adev->gfx.cu_info.number * 2,
0548 wb_ib.gpu_addr, pattern[1], &fences[1]);
0549 if (r) {
0550 dev_err(adev->dev, "failed to clear next 576 sgprs\n");
0551 goto disp0_failed;
0552 }
0553
0554 r = gfx_v9_4_2_wait_for_waves_assigned(adev,
0555 &wb_ib.ptr[1], 0b11111100,
0556 pattern[1], adev->gfx.cu_info.number * SIMD_ID_MAX * 6,
0557 true);
0558 if (r) {
0559 dev_err(adev->dev, "wave coverage failed when clear first 576 sgprs\n");
0560 wb_ib.ptr[0] = 0xdeadbeaf;
0561 goto disp1_failed;
0562 }
0563
0564 wb_ib.ptr[0] = 0xdeadbeaf;
0565
0566
0567 r = dma_fence_wait(fences[0], false);
0568 if (r) {
0569 dev_err(adev->dev, "timeout to clear first 224 sgprs\n");
0570 goto disp1_failed;
0571 }
0572
0573 r = dma_fence_wait(fences[1], false);
0574 if (r) {
0575 dev_err(adev->dev, "timeout to clear first 576 sgprs\n");
0576 goto disp1_failed;
0577 }
0578
0579 memset(wb_ib.ptr, 0, (1 + wb_size) * sizeof(uint32_t));
0580 r = gfx_v9_4_2_run_shader(adev,
0581 &adev->gfx.compute_ring[0],
0582 &disp_ibs[2],
0583 sgpr64_init_compute_shader_aldebaran,
0584 sizeof(sgpr64_init_compute_shader_aldebaran),
0585 sgpr64_init_regs_aldebaran,
0586 ARRAY_SIZE(sgpr64_init_regs_aldebaran),
0587 adev->gfx.cu_info.number,
0588 wb_ib.gpu_addr, pattern[2], &fences[2]);
0589 if (r) {
0590 dev_err(adev->dev, "failed to clear first 256 sgprs\n");
0591 goto disp1_failed;
0592 }
0593
0594 r = gfx_v9_4_2_wait_for_waves_assigned(adev,
0595 &wb_ib.ptr[1], 0b1111,
0596 pattern[2],
0597 adev->gfx.cu_info.number * SIMD_ID_MAX * 4,
0598 true);
0599 if (r) {
0600 dev_err(adev->dev, "wave coverage failed when clear first 256 sgprs\n");
0601 wb_ib.ptr[0] = 0xdeadbeaf;
0602 goto disp2_failed;
0603 }
0604
0605 wb_ib.ptr[0] = 0xdeadbeaf;
0606
0607 r = dma_fence_wait(fences[2], false);
0608 if (r) {
0609 dev_err(adev->dev, "timeout to clear first 256 sgprs\n");
0610 goto disp2_failed;
0611 }
0612
0613 disp2_failed:
0614 amdgpu_ib_free(adev, &disp_ibs[2], NULL);
0615 dma_fence_put(fences[2]);
0616 disp1_failed:
0617 amdgpu_ib_free(adev, &disp_ibs[1], NULL);
0618 dma_fence_put(fences[1]);
0619 disp0_failed:
0620 amdgpu_ib_free(adev, &disp_ibs[0], NULL);
0621 dma_fence_put(fences[0]);
0622 pro_end:
0623 amdgpu_ib_free(adev, &wb_ib, NULL);
0624
0625 if (r)
0626 dev_info(adev->dev, "Init SGPRS Failed\n");
0627 else
0628 dev_info(adev->dev, "Init SGPRS Successfully\n");
0629
0630 return r;
0631 }
0632
0633 static int gfx_v9_4_2_do_vgprs_init(struct amdgpu_device *adev)
0634 {
0635 int r;
0636
0637 int wb_size = adev->gfx.config.max_shader_engines *
0638 CU_ID_MAX * SIMD_ID_MAX * WAVE_ID_MAX;
0639 struct amdgpu_ib wb_ib;
0640 struct amdgpu_ib disp_ib;
0641 struct dma_fence *fence;
0642 u32 pattern = 0xa;
0643
0644
0645 if (!adev->gfx.compute_ring[0].sched.ready)
0646 return 0;
0647
0648
0649 memset(&wb_ib, 0, sizeof(wb_ib));
0650 r = amdgpu_ib_get(adev, NULL, (1 + wb_size) * sizeof(uint32_t),
0651 AMDGPU_IB_POOL_DIRECT, &wb_ib);
0652 if (r) {
0653 dev_err(adev->dev, "failed to get ib (%d) for wb.\n", r);
0654 return r;
0655 }
0656 memset(wb_ib.ptr, 0, (1 + wb_size) * sizeof(uint32_t));
0657
0658 r = gfx_v9_4_2_run_shader(adev,
0659 &adev->gfx.compute_ring[0],
0660 &disp_ib,
0661 vgpr_init_compute_shader_aldebaran,
0662 sizeof(vgpr_init_compute_shader_aldebaran),
0663 vgpr_init_regs_aldebaran,
0664 ARRAY_SIZE(vgpr_init_regs_aldebaran),
0665 adev->gfx.cu_info.number,
0666 wb_ib.gpu_addr, pattern, &fence);
0667 if (r) {
0668 dev_err(adev->dev, "failed to clear vgprs\n");
0669 goto pro_end;
0670 }
0671
0672
0673 r = dma_fence_wait(fence, false);
0674 if (r) {
0675 dev_err(adev->dev, "timeout to clear vgprs\n");
0676 goto disp_failed;
0677 }
0678
0679 r = gfx_v9_4_2_wait_for_waves_assigned(adev,
0680 &wb_ib.ptr[1], 0b1,
0681 pattern,
0682 adev->gfx.cu_info.number * SIMD_ID_MAX,
0683 false);
0684 if (r) {
0685 dev_err(adev->dev, "failed to cover all simds when clearing vgprs\n");
0686 goto disp_failed;
0687 }
0688
0689 disp_failed:
0690 amdgpu_ib_free(adev, &disp_ib, NULL);
0691 dma_fence_put(fence);
0692 pro_end:
0693 amdgpu_ib_free(adev, &wb_ib, NULL);
0694
0695 if (r)
0696 dev_info(adev->dev, "Init VGPRS Failed\n");
0697 else
0698 dev_info(adev->dev, "Init VGPRS Successfully\n");
0699
0700 return r;
0701 }
0702
0703 int gfx_v9_4_2_do_edc_gpr_workarounds(struct amdgpu_device *adev)
0704 {
0705
0706 if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
0707 return 0;
0708
0709
0710
0711 if (amdgpu_in_reset(adev))
0712 return 0;
0713
0714 gfx_v9_4_2_do_sgprs_init(adev);
0715
0716 gfx_v9_4_2_do_vgprs_init(adev);
0717
0718 return 0;
0719 }
0720
0721 static void gfx_v9_4_2_query_sq_timeout_status(struct amdgpu_device *adev);
0722 static void gfx_v9_4_2_reset_sq_timeout_status(struct amdgpu_device *adev);
0723
0724 void gfx_v9_4_2_init_golden_registers(struct amdgpu_device *adev,
0725 uint32_t die_id)
0726 {
0727 soc15_program_register_sequence(adev,
0728 golden_settings_gc_9_4_2_alde,
0729 ARRAY_SIZE(golden_settings_gc_9_4_2_alde));
0730
0731
0732 switch (die_id) {
0733 case 0:
0734 soc15_program_register_sequence(adev,
0735 golden_settings_gc_9_4_2_alde_die_0,
0736 ARRAY_SIZE(golden_settings_gc_9_4_2_alde_die_0));
0737 break;
0738 case 1:
0739 soc15_program_register_sequence(adev,
0740 golden_settings_gc_9_4_2_alde_die_1,
0741 ARRAY_SIZE(golden_settings_gc_9_4_2_alde_die_1));
0742 break;
0743 default:
0744 dev_warn(adev->dev,
0745 "invalid die id %d, ignore channel fabricid remap settings\n",
0746 die_id);
0747 break;
0748 }
0749
0750 return;
0751 }
0752
0753 void gfx_v9_4_2_debug_trap_config_init(struct amdgpu_device *adev,
0754 uint32_t first_vmid,
0755 uint32_t last_vmid)
0756 {
0757 uint32_t data;
0758 int i;
0759
0760 mutex_lock(&adev->srbm_mutex);
0761
0762 for (i = first_vmid; i < last_vmid; i++) {
0763 data = 0;
0764 soc15_grbm_select(adev, 0, 0, 0, i);
0765 data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, TRAP_EN, 1);
0766 data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_EN, 0);
0767 data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_REPLACE,
0768 0);
0769 WREG32(SOC15_REG_OFFSET(GC, 0, regSPI_GDBG_PER_VMID_CNTL), data);
0770 }
0771
0772 soc15_grbm_select(adev, 0, 0, 0, 0);
0773 mutex_unlock(&adev->srbm_mutex);
0774 }
0775
0776 void gfx_v9_4_2_set_power_brake_sequence(struct amdgpu_device *adev)
0777 {
0778 u32 tmp;
0779
0780 gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
0781
0782 tmp = 0;
0783 tmp = REG_SET_FIELD(tmp, GC_THROTTLE_CTRL, PATTERN_MODE, 1);
0784 WREG32_SOC15(GC, 0, regGC_THROTTLE_CTRL, tmp);
0785
0786 tmp = 0;
0787 tmp = REG_SET_FIELD(tmp, GC_THROTTLE_CTRL1, PWRBRK_STALL_EN, 1);
0788 WREG32_SOC15(GC, 0, regGC_THROTTLE_CTRL1, tmp);
0789
0790 WREG32_SOC15(GC, 0, regGC_CAC_IND_INDEX, ixPWRBRK_STALL_PATTERN_CTRL);
0791 tmp = 0;
0792 tmp = REG_SET_FIELD(tmp, PWRBRK_STALL_PATTERN_CTRL, PWRBRK_END_STEP, 0x12);
0793 WREG32_SOC15(GC, 0, regGC_CAC_IND_DATA, tmp);
0794 }
0795
0796 static const struct soc15_reg_entry gfx_v9_4_2_edc_counter_regs[] = {
0797
0798 { SOC15_REG_ENTRY(GC, 0, regCPF_EDC_ROQ_CNT), 0, 1, 1 },
0799 { SOC15_REG_ENTRY(GC, 0, regCPF_EDC_TAG_CNT), 0, 1, 1 },
0800
0801 { SOC15_REG_ENTRY(GC, 0, regCPC_EDC_SCRATCH_CNT), 0, 1, 1 },
0802 { SOC15_REG_ENTRY(GC, 0, regCPC_EDC_UCODE_CNT), 0, 1, 1 },
0803 { SOC15_REG_ENTRY(GC, 0, regDC_EDC_STATE_CNT), 0, 1, 1 },
0804 { SOC15_REG_ENTRY(GC, 0, regDC_EDC_CSINVOC_CNT), 0, 1, 1 },
0805 { SOC15_REG_ENTRY(GC, 0, regDC_EDC_RESTORE_CNT), 0, 1, 1 },
0806
0807 { SOC15_REG_ENTRY(GC, 0, regGDS_EDC_CNT), 0, 1, 1 },
0808 { SOC15_REG_ENTRY(GC, 0, regGDS_EDC_GRBM_CNT), 0, 1, 1 },
0809 { SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 1, 1 },
0810 { SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT), 0, 1, 1 },
0811 { SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT), 0, 1, 1 },
0812
0813 { SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT), 0, 1, 1 },
0814 { SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2), 0, 1, 1 },
0815
0816 { SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT), 0, 8, 1 },
0817
0818 { SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT), 0, 8, 7 },
0819 { SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2), 0, 8, 7 },
0820 { SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3), 0, 8, 7 },
0821 { SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3), 0, 8, 7 },
0822
0823 { SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT), 0, 8, 14 },
0824
0825 { SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW), 0, 8, 14 },
0826
0827 { SOC15_REG_ENTRY(GC, 0, regTCI_EDC_CNT), 0, 1, 69 },
0828
0829 { SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT), 0, 1, 16 },
0830 { SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2), 0, 1, 16 },
0831
0832 { SOC15_REG_ENTRY(GC, 0, regTCA_EDC_CNT), 0, 1, 2 },
0833
0834 { SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT), 0, 1, 2 },
0835 { SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2), 0, 1, 2 },
0836
0837 { SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT), 0, 8, 14 },
0838
0839 { SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT), 0, 8, 14 },
0840
0841 { SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT), 0, 1, 16 },
0842 { SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2), 0, 1, 16 },
0843 { SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 1, 16 },
0844 };
0845
0846 static void gfx_v9_4_2_select_se_sh(struct amdgpu_device *adev, u32 se_num,
0847 u32 sh_num, u32 instance)
0848 {
0849 u32 data;
0850
0851 if (instance == 0xffffffff)
0852 data = REG_SET_FIELD(0, GRBM_GFX_INDEX,
0853 INSTANCE_BROADCAST_WRITES, 1);
0854 else
0855 data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_INDEX,
0856 instance);
0857
0858 if (se_num == 0xffffffff)
0859 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_BROADCAST_WRITES,
0860 1);
0861 else
0862 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num);
0863
0864 if (sh_num == 0xffffffff)
0865 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_BROADCAST_WRITES,
0866 1);
0867 else
0868 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num);
0869
0870 WREG32_SOC15_RLC_SHADOW_EX(reg, GC, 0, regGRBM_GFX_INDEX, data);
0871 }
0872
0873 static const struct soc15_ras_field_entry gfx_v9_4_2_ras_fields[] = {
0874
0875 { "CPF_ROQ_ME2", SOC15_REG_ENTRY(GC, 0, regCPF_EDC_ROQ_CNT),
0876 SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, SEC_COUNT_ME2),
0877 SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, DED_COUNT_ME2) },
0878 { "CPF_ROQ_ME1", SOC15_REG_ENTRY(GC, 0, regCPF_EDC_ROQ_CNT),
0879 SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, SEC_COUNT_ME1),
0880 SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, DED_COUNT_ME1) },
0881 { "CPF_TCIU_TAG", SOC15_REG_ENTRY(GC, 0, regCPF_EDC_TAG_CNT),
0882 SOC15_REG_FIELD(CPF_EDC_TAG_CNT, SEC_COUNT),
0883 SOC15_REG_FIELD(CPF_EDC_TAG_CNT, DED_COUNT) },
0884
0885
0886 { "CPC_SCRATCH", SOC15_REG_ENTRY(GC, 0, regCPC_EDC_SCRATCH_CNT),
0887 SOC15_REG_FIELD(CPC_EDC_SCRATCH_CNT, SEC_COUNT),
0888 SOC15_REG_FIELD(CPC_EDC_SCRATCH_CNT, DED_COUNT) },
0889 { "CPC_UCODE", SOC15_REG_ENTRY(GC, 0, regCPC_EDC_UCODE_CNT),
0890 SOC15_REG_FIELD(CPC_EDC_UCODE_CNT, SEC_COUNT),
0891 SOC15_REG_FIELD(CPC_EDC_UCODE_CNT, DED_COUNT) },
0892 { "CPC_DC_STATE_RAM_ME1", SOC15_REG_ENTRY(GC, 0, regDC_EDC_STATE_CNT),
0893 SOC15_REG_FIELD(DC_EDC_STATE_CNT, SEC_COUNT_ME1),
0894 SOC15_REG_FIELD(DC_EDC_STATE_CNT, DED_COUNT_ME1) },
0895 { "CPC_DC_CSINVOC_RAM_ME1",
0896 SOC15_REG_ENTRY(GC, 0, regDC_EDC_CSINVOC_CNT),
0897 SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, SEC_COUNT_ME1),
0898 SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, DED_COUNT_ME1) },
0899 { "CPC_DC_RESTORE_RAM_ME1",
0900 SOC15_REG_ENTRY(GC, 0, regDC_EDC_RESTORE_CNT),
0901 SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, SEC_COUNT_ME1),
0902 SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, DED_COUNT_ME1) },
0903 { "CPC_DC_CSINVOC_RAM1_ME1",
0904 SOC15_REG_ENTRY(GC, 0, regDC_EDC_CSINVOC_CNT),
0905 SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, SEC_COUNT1_ME1),
0906 SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, DED_COUNT1_ME1) },
0907 { "CPC_DC_RESTORE_RAM1_ME1",
0908 SOC15_REG_ENTRY(GC, 0, regDC_EDC_RESTORE_CNT),
0909 SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, SEC_COUNT1_ME1),
0910 SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, DED_COUNT1_ME1) },
0911
0912
0913 { "GDS_GRBM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_GRBM_CNT),
0914 SOC15_REG_FIELD(GDS_EDC_GRBM_CNT, SEC),
0915 SOC15_REG_FIELD(GDS_EDC_GRBM_CNT, DED) },
0916 { "GDS_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_CNT),
0917 SOC15_REG_FIELD(GDS_EDC_CNT, GDS_MEM_SEC),
0918 SOC15_REG_FIELD(GDS_EDC_CNT, GDS_MEM_DED) },
0919 { "GDS_PHY_CMD_RAM_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT),
0920 SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_CMD_RAM_MEM_SEC),
0921 SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_CMD_RAM_MEM_DED) },
0922 { "GDS_PHY_DATA_RAM_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT),
0923 SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_DATA_RAM_MEM_SEC),
0924 SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_DATA_RAM_MEM_DED) },
0925 { "GDS_ME0_CS_PIPE_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT),
0926 SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, ME0_CS_PIPE_MEM_SEC),
0927 SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, ME0_CS_PIPE_MEM_DED) },
0928 { "GDS_ME1_PIPE0_PIPE_MEM",
0929 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
0930 SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE0_PIPE_MEM_SEC),
0931 SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE0_PIPE_MEM_DED) },
0932 { "GDS_ME1_PIPE1_PIPE_MEM",
0933 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
0934 SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE1_PIPE_MEM_SEC),
0935 SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE1_PIPE_MEM_DED) },
0936 { "GDS_ME1_PIPE2_PIPE_MEM",
0937 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
0938 SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE2_PIPE_MEM_SEC),
0939 SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE2_PIPE_MEM_DED) },
0940 { "GDS_ME1_PIPE3_PIPE_MEM",
0941 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
0942 SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE3_PIPE_MEM_SEC),
0943 SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE3_PIPE_MEM_DED) },
0944 { "GDS_ME0_GFXHP3D_PIX_DED",
0945 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
0946 SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_GFXHP3D_PIX_DED) },
0947 { "GDS_ME0_GFXHP3D_VTX_DED",
0948 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
0949 SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_GFXHP3D_VTX_DED) },
0950 { "GDS_ME0_CS_DED",
0951 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
0952 SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_CS_DED) },
0953 { "GDS_ME0_GFXHP3D_GS_DED",
0954 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
0955 SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_GFXHP3D_GS_DED) },
0956 { "GDS_ME1_PIPE0_DED",
0957 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
0958 SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE0_DED) },
0959 { "GDS_ME1_PIPE1_DED",
0960 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
0961 SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE1_DED) },
0962 { "GDS_ME1_PIPE2_DED",
0963 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
0964 SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE2_DED) },
0965 { "GDS_ME1_PIPE3_DED",
0966 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
0967 SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE3_DED) },
0968 { "GDS_ME2_PIPE0_DED",
0969 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
0970 SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE0_DED) },
0971 { "GDS_ME2_PIPE1_DED",
0972 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
0973 SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE1_DED) },
0974 { "GDS_ME2_PIPE2_DED",
0975 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
0976 SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE2_DED) },
0977 { "GDS_ME2_PIPE3_DED",
0978 SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
0979 SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE3_DED) },
0980
0981
0982 { "RLCG_INSTR_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
0983 SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_INSTR_RAM_SEC_COUNT),
0984 SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_INSTR_RAM_DED_COUNT) },
0985 { "RLCG_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
0986 SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_SCRATCH_RAM_SEC_COUNT),
0987 SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_SCRATCH_RAM_DED_COUNT) },
0988 { "RLCV_INSTR_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
0989 SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_INSTR_RAM_SEC_COUNT),
0990 SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_INSTR_RAM_DED_COUNT) },
0991 { "RLCV_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
0992 SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_SCRATCH_RAM_SEC_COUNT),
0993 SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_SCRATCH_RAM_DED_COUNT) },
0994 { "RLC_TCTAG_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
0995 SOC15_REG_FIELD(RLC_EDC_CNT, RLC_TCTAG_RAM_SEC_COUNT),
0996 SOC15_REG_FIELD(RLC_EDC_CNT, RLC_TCTAG_RAM_DED_COUNT) },
0997 { "RLC_SPM_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
0998 SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SPM_SCRATCH_RAM_SEC_COUNT),
0999 SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SPM_SCRATCH_RAM_DED_COUNT) },
1000 { "RLC_SRM_DATA_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
1001 SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_DATA_RAM_SEC_COUNT),
1002 SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_DATA_RAM_DED_COUNT) },
1003 { "RLC_SRM_ADDR_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
1004 SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_ADDR_RAM_SEC_COUNT),
1005 SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_ADDR_RAM_DED_COUNT) },
1006 { "RLC_SPM_SE0_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1007 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE0_SCRATCH_RAM_SEC_COUNT),
1008 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE0_SCRATCH_RAM_DED_COUNT) },
1009 { "RLC_SPM_SE1_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1010 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE1_SCRATCH_RAM_SEC_COUNT),
1011 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE1_SCRATCH_RAM_DED_COUNT) },
1012 { "RLC_SPM_SE2_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1013 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE2_SCRATCH_RAM_SEC_COUNT),
1014 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE2_SCRATCH_RAM_DED_COUNT) },
1015 { "RLC_SPM_SE3_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1016 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE3_SCRATCH_RAM_SEC_COUNT),
1017 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE3_SCRATCH_RAM_DED_COUNT) },
1018 { "RLC_SPM_SE4_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1019 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE4_SCRATCH_RAM_SEC_COUNT),
1020 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE4_SCRATCH_RAM_DED_COUNT) },
1021 { "RLC_SPM_SE5_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1022 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE5_SCRATCH_RAM_SEC_COUNT),
1023 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE5_SCRATCH_RAM_DED_COUNT) },
1024 { "RLC_SPM_SE6_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1025 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE6_SCRATCH_RAM_SEC_COUNT),
1026 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE6_SCRATCH_RAM_DED_COUNT) },
1027 { "RLC_SPM_SE7_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
1028 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE7_SCRATCH_RAM_SEC_COUNT),
1029 SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE7_SCRATCH_RAM_DED_COUNT) },
1030
1031
1032 { "SPI_SR_MEM", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
1033 SOC15_REG_FIELD(SPI_EDC_CNT, SPI_SR_MEM_SEC_COUNT),
1034 SOC15_REG_FIELD(SPI_EDC_CNT, SPI_SR_MEM_DED_COUNT) },
1035 { "SPI_GDS_EXPREQ", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
1036 SOC15_REG_FIELD(SPI_EDC_CNT, SPI_GDS_EXPREQ_SEC_COUNT),
1037 SOC15_REG_FIELD(SPI_EDC_CNT, SPI_GDS_EXPREQ_DED_COUNT) },
1038 { "SPI_WB_GRANT_30", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
1039 SOC15_REG_FIELD(SPI_EDC_CNT, SPI_WB_GRANT_30_SEC_COUNT),
1040 SOC15_REG_FIELD(SPI_EDC_CNT, SPI_WB_GRANT_30_DED_COUNT) },
1041 { "SPI_LIFE_CNT", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
1042 SOC15_REG_FIELD(SPI_EDC_CNT, SPI_LIFE_CNT_SEC_COUNT),
1043 SOC15_REG_FIELD(SPI_EDC_CNT, SPI_LIFE_CNT_DED_COUNT) },
1044
1045
1046 { "SQC_DATA_CU0_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1047 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_WRITE_DATA_BUF_SEC_COUNT),
1048 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_WRITE_DATA_BUF_DED_COUNT) },
1049 { "SQC_DATA_CU0_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1050 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_UTCL1_LFIFO_SEC_COUNT),
1051 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_UTCL1_LFIFO_DED_COUNT) },
1052 { "SQC_DATA_CU1_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1053 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_WRITE_DATA_BUF_SEC_COUNT),
1054 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_WRITE_DATA_BUF_DED_COUNT) },
1055 { "SQC_DATA_CU1_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1056 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_UTCL1_LFIFO_SEC_COUNT),
1057 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_UTCL1_LFIFO_DED_COUNT) },
1058 { "SQC_DATA_CU2_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1059 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_WRITE_DATA_BUF_SEC_COUNT),
1060 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_WRITE_DATA_BUF_DED_COUNT) },
1061 { "SQC_DATA_CU2_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1062 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_UTCL1_LFIFO_SEC_COUNT),
1063 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_UTCL1_LFIFO_DED_COUNT) },
1064 { "SQC_DATA_CU3_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1065 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_WRITE_DATA_BUF_SEC_COUNT),
1066 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_WRITE_DATA_BUF_DED_COUNT) },
1067 { "SQC_DATA_CU3_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
1068 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_UTCL1_LFIFO_SEC_COUNT),
1069 SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_UTCL1_LFIFO_DED_COUNT) },
1070
1071
1072 { "SQC_INST_BANKA_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1073 SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_TAG_RAM_SEC_COUNT),
1074 SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_TAG_RAM_DED_COUNT) },
1075 { "SQC_INST_BANKA_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1076 SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_BANK_RAM_SEC_COUNT),
1077 SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_BANK_RAM_DED_COUNT) },
1078 { "SQC_DATA_BANKA_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1079 SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_TAG_RAM_SEC_COUNT),
1080 SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_TAG_RAM_DED_COUNT) },
1081 { "SQC_DATA_BANKA_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1082 SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_BANK_RAM_SEC_COUNT),
1083 SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_BANK_RAM_DED_COUNT) },
1084 { "SQC_INST_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1085 SOC15_REG_FIELD(SQC_EDC_CNT2, INST_UTCL1_LFIFO_SEC_COUNT),
1086 SOC15_REG_FIELD(SQC_EDC_CNT2, INST_UTCL1_LFIFO_DED_COUNT) },
1087 { "SQC_DATA_BANKA_DIRTY_BIT_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
1088 SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_DIRTY_BIT_RAM_SEC_COUNT),
1089 SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_DIRTY_BIT_RAM_DED_COUNT) },
1090
1091
1092 { "SQC_INST_BANKB_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
1093 SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_TAG_RAM_SEC_COUNT),
1094 SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_TAG_RAM_DED_COUNT) },
1095 { "SQC_INST_BANKB_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
1096 SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_BANK_RAM_SEC_COUNT),
1097 SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_BANK_RAM_DED_COUNT) },
1098 { "SQC_DATA_BANKB_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
1099 SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_TAG_RAM_SEC_COUNT),
1100 SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_TAG_RAM_DED_COUNT) },
1101 { "SQC_DATA_BANKB_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
1102 SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_BANK_RAM_SEC_COUNT),
1103 SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_BANK_RAM_DED_COUNT) },
1104 { "SQC_DATA_BANKB_DIRTY_BIT_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
1105 SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_DIRTY_BIT_RAM_SEC_COUNT),
1106 SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_DIRTY_BIT_RAM_DED_COUNT) },
1107
1108
1109 { "SQC_INST_BANKA_UTCL1_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1110 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_UTCL1_MISS_FIFO_SEC_COUNT),
1111 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_UTCL1_MISS_FIFO_DED_COUNT) },
1112 { "SQC_INST_BANKA_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1113 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_MISS_FIFO_SEC_COUNT),
1114 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_MISS_FIFO_DED_COUNT) },
1115 { "SQC_DATA_BANKA_HIT_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1116 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_HIT_FIFO_SEC_COUNT),
1117 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_HIT_FIFO_DED_COUNT) },
1118 { "SQC_DATA_BANKA_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1119 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_MISS_FIFO_SEC_COUNT),
1120 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_MISS_FIFO_DED_COUNT) },
1121 { "SQC_INST_BANKB_UTCL1_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1122 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_UTCL1_MISS_FIFO_SEC_COUNT),
1123 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_UTCL1_MISS_FIFO_DED_COUNT) },
1124 { "SQC_INST_BANKB_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1125 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_MISS_FIFO_SEC_COUNT),
1126 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_MISS_FIFO_DED_COUNT) },
1127 { "SQC_DATA_BANKB_HIT_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1128 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_HIT_FIFO_SEC_COUNT),
1129 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_HIT_FIFO_DED_COUNT) },
1130 { "SQC_DATA_BANKB_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
1131 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_MISS_FIFO_SEC_COUNT),
1132 SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_MISS_FIFO_DED_COUNT) },
1133
1134
1135 { "SQ_LDS_D", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1136 SOC15_REG_FIELD(SQ_EDC_CNT, LDS_D_SEC_COUNT),
1137 SOC15_REG_FIELD(SQ_EDC_CNT, LDS_D_DED_COUNT) },
1138 { "SQ_LDS_I", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1139 SOC15_REG_FIELD(SQ_EDC_CNT, LDS_I_SEC_COUNT),
1140 SOC15_REG_FIELD(SQ_EDC_CNT, LDS_I_DED_COUNT) },
1141 { "SQ_SGPR", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1142 SOC15_REG_FIELD(SQ_EDC_CNT, SGPR_SEC_COUNT),
1143 SOC15_REG_FIELD(SQ_EDC_CNT, SGPR_DED_COUNT) },
1144 { "SQ_VGPR0", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1145 SOC15_REG_FIELD(SQ_EDC_CNT, VGPR0_SEC_COUNT),
1146 SOC15_REG_FIELD(SQ_EDC_CNT, VGPR0_DED_COUNT) },
1147 { "SQ_VGPR1", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1148 SOC15_REG_FIELD(SQ_EDC_CNT, VGPR1_SEC_COUNT),
1149 SOC15_REG_FIELD(SQ_EDC_CNT, VGPR1_DED_COUNT) },
1150 { "SQ_VGPR2", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1151 SOC15_REG_FIELD(SQ_EDC_CNT, VGPR2_SEC_COUNT),
1152 SOC15_REG_FIELD(SQ_EDC_CNT, VGPR2_DED_COUNT) },
1153 { "SQ_VGPR3", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
1154 SOC15_REG_FIELD(SQ_EDC_CNT, VGPR3_SEC_COUNT),
1155 SOC15_REG_FIELD(SQ_EDC_CNT, VGPR3_DED_COUNT) },
1156
1157
1158 { "TCP_CACHE_RAM", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1159 SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CACHE_RAM_SEC_COUNT),
1160 SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CACHE_RAM_DED_COUNT) },
1161 { "TCP_LFIFO_RAM", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1162 SOC15_REG_FIELD(TCP_EDC_CNT_NEW, LFIFO_RAM_SEC_COUNT),
1163 SOC15_REG_FIELD(TCP_EDC_CNT_NEW, LFIFO_RAM_DED_COUNT) },
1164 { "TCP_CMD_FIFO", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1165 SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CMD_FIFO_SEC_COUNT),
1166 SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CMD_FIFO_DED_COUNT) },
1167 { "TCP_VM_FIFO", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1168 SOC15_REG_FIELD(TCP_EDC_CNT_NEW, VM_FIFO_SEC_COUNT),
1169 SOC15_REG_FIELD(TCP_EDC_CNT_NEW, VM_FIFO_DED_COUNT) },
1170 { "TCP_DB_RAM", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1171 SOC15_REG_FIELD(TCP_EDC_CNT_NEW, DB_RAM_SEC_COUNT),
1172 SOC15_REG_FIELD(TCP_EDC_CNT_NEW, DB_RAM_DED_COUNT) },
1173 { "TCP_UTCL1_LFIFO0", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1174 SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO0_SEC_COUNT),
1175 SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO0_DED_COUNT) },
1176 { "TCP_UTCL1_LFIFO1", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
1177 SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO1_SEC_COUNT),
1178 SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO1_DED_COUNT) },
1179
1180
1181 { "TCI_WRITE_RAM", SOC15_REG_ENTRY(GC, 0, regTCI_EDC_CNT),
1182 SOC15_REG_FIELD(TCI_EDC_CNT, WRITE_RAM_SEC_COUNT),
1183 SOC15_REG_FIELD(TCI_EDC_CNT, WRITE_RAM_DED_COUNT) },
1184
1185
1186 { "TCC_CACHE_DATA", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1187 SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DATA_SEC_COUNT),
1188 SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DATA_DED_COUNT) },
1189 { "TCC_CACHE_DIRTY", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1190 SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DIRTY_SEC_COUNT),
1191 SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DIRTY_DED_COUNT) },
1192 { "TCC_HIGH_RATE_TAG", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1193 SOC15_REG_FIELD(TCC_EDC_CNT, HIGH_RATE_TAG_SEC_COUNT),
1194 SOC15_REG_FIELD(TCC_EDC_CNT, HIGH_RATE_TAG_DED_COUNT) },
1195 { "TCC_LOW_RATE_TAG", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1196 SOC15_REG_FIELD(TCC_EDC_CNT, LOW_RATE_TAG_SEC_COUNT),
1197 SOC15_REG_FIELD(TCC_EDC_CNT, LOW_RATE_TAG_DED_COUNT) },
1198 { "TCC_SRC_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1199 SOC15_REG_FIELD(TCC_EDC_CNT, SRC_FIFO_SEC_COUNT),
1200 SOC15_REG_FIELD(TCC_EDC_CNT, SRC_FIFO_DED_COUNT) },
1201 { "TCC_LATENCY_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1202 SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_SEC_COUNT),
1203 SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_DED_COUNT) },
1204 { "TCC_LATENCY_FIFO_NEXT_RAM", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
1205 SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_NEXT_RAM_SEC_COUNT),
1206 SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_NEXT_RAM_DED_COUNT) },
1207 { "TCC_CACHE_TAG_PROBE_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1208 SOC15_REG_FIELD(TCC_EDC_CNT2, CACHE_TAG_PROBE_FIFO_SEC_COUNT),
1209 SOC15_REG_FIELD(TCC_EDC_CNT2, CACHE_TAG_PROBE_FIFO_DED_COUNT) },
1210 { "TCC_UC_ATOMIC_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1211 SOC15_REG_FIELD(TCC_EDC_CNT2, UC_ATOMIC_FIFO_SEC_COUNT),
1212 SOC15_REG_FIELD(TCC_EDC_CNT2, UC_ATOMIC_FIFO_DED_COUNT) },
1213 { "TCC_WRITE_CACHE_READ", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1214 SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_CACHE_READ_SEC_COUNT),
1215 SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_CACHE_READ_DED_COUNT) },
1216 { "TCC_RETURN_CONTROL", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1217 SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_CONTROL_SEC_COUNT),
1218 SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_CONTROL_DED_COUNT) },
1219 { "TCC_IN_USE_TRANSFER", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1220 SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_TRANSFER_SEC_COUNT),
1221 SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_TRANSFER_DED_COUNT) },
1222 { "TCC_IN_USE_DEC", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1223 SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_DEC_SEC_COUNT),
1224 SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_DEC_DED_COUNT) },
1225 { "TCC_WRITE_RETURN", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1226 SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_RETURN_SEC_COUNT),
1227 SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_RETURN_DED_COUNT) },
1228 { "TCC_RETURN_DATA", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
1229 SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_DATA_SEC_COUNT),
1230 SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_DATA_DED_COUNT) },
1231
1232
1233 { "TCA_HOLE_FIFO", SOC15_REG_ENTRY(GC, 0, regTCA_EDC_CNT),
1234 SOC15_REG_FIELD(TCA_EDC_CNT, HOLE_FIFO_SEC_COUNT),
1235 SOC15_REG_FIELD(TCA_EDC_CNT, HOLE_FIFO_DED_COUNT) },
1236 { "TCA_REQ_FIFO", SOC15_REG_ENTRY(GC, 0, regTCA_EDC_CNT),
1237 SOC15_REG_FIELD(TCA_EDC_CNT, REQ_FIFO_SEC_COUNT),
1238 SOC15_REG_FIELD(TCA_EDC_CNT, REQ_FIFO_DED_COUNT) },
1239
1240
1241 { "TCX_GROUP0", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1242 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP0_SEC_COUNT),
1243 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP0_DED_COUNT) },
1244 { "TCX_GROUP1", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1245 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP1_SEC_COUNT),
1246 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP1_DED_COUNT) },
1247 { "TCX_GROUP2", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1248 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP2_SEC_COUNT),
1249 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP2_DED_COUNT) },
1250 { "TCX_GROUP3", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1251 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP3_SEC_COUNT),
1252 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP3_DED_COUNT) },
1253 { "TCX_GROUP4", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1254 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP4_SEC_COUNT),
1255 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP4_DED_COUNT) },
1256 { "TCX_GROUP5", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1257 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP5_SED_COUNT), 0, 0 },
1258 { "TCX_GROUP6", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1259 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP6_SED_COUNT), 0, 0 },
1260 { "TCX_GROUP7", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1261 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP7_SED_COUNT), 0, 0 },
1262 { "TCX_GROUP8", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1263 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP8_SED_COUNT), 0, 0 },
1264 { "TCX_GROUP9", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1265 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP9_SED_COUNT), 0, 0 },
1266 { "TCX_GROUP10", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
1267 SOC15_REG_FIELD(TCX_EDC_CNT, GROUP10_SED_COUNT), 0, 0 },
1268 { "TCX_GROUP11", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
1269 SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP11_SED_COUNT), 0, 0 },
1270 { "TCX_GROUP12", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
1271 SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP12_SED_COUNT), 0, 0 },
1272 { "TCX_GROUP13", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
1273 SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP13_SED_COUNT), 0, 0 },
1274 { "TCX_GROUP14", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
1275 SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP14_SED_COUNT), 0, 0 },
1276
1277
1278 { "TD_SS_FIFO_LO", SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT),
1279 SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_LO_SEC_COUNT),
1280 SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_LO_DED_COUNT) },
1281 { "TD_SS_FIFO_HI", SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT),
1282 SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_HI_SEC_COUNT),
1283 SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_HI_DED_COUNT) },
1284 { "TD_CS_FIFO", SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT),
1285 SOC15_REG_FIELD(TD_EDC_CNT, CS_FIFO_SEC_COUNT),
1286 SOC15_REG_FIELD(TD_EDC_CNT, CS_FIFO_DED_COUNT) },
1287
1288
1289 { "TA_FS_DFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1290 SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_DFIFO_SEC_COUNT),
1291 SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_DFIFO_DED_COUNT) },
1292 { "TA_FS_AFIFO_LO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1293 SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_LO_SEC_COUNT),
1294 SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_LO_DED_COUNT) },
1295 { "TA_FL_LFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1296 SOC15_REG_FIELD(TA_EDC_CNT, TA_FL_LFIFO_SEC_COUNT),
1297 SOC15_REG_FIELD(TA_EDC_CNT, TA_FL_LFIFO_DED_COUNT) },
1298 { "TA_FX_LFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1299 SOC15_REG_FIELD(TA_EDC_CNT, TA_FX_LFIFO_SEC_COUNT),
1300 SOC15_REG_FIELD(TA_EDC_CNT, TA_FX_LFIFO_DED_COUNT) },
1301 { "TA_FS_CFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1302 SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_CFIFO_SEC_COUNT),
1303 SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_CFIFO_DED_COUNT) },
1304 { "TA_FS_AFIFO_HI", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
1305 SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_HI_SEC_COUNT),
1306 SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_HI_DED_COUNT) },
1307
1308
1309 { "EA_DRAMRD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1310 SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_CMDMEM_SEC_COUNT),
1311 SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_CMDMEM_DED_COUNT) },
1312 { "EA_DRAMWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1313 SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_CMDMEM_SEC_COUNT),
1314 SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_CMDMEM_DED_COUNT) },
1315 { "EA_DRAMWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1316 SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_DATAMEM_SEC_COUNT),
1317 SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_DATAMEM_DED_COUNT) },
1318 { "EA_RRET_TAGMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1319 SOC15_REG_FIELD(GCEA_EDC_CNT, RRET_TAGMEM_SEC_COUNT),
1320 SOC15_REG_FIELD(GCEA_EDC_CNT, RRET_TAGMEM_DED_COUNT) },
1321 { "EA_WRET_TAGMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1322 SOC15_REG_FIELD(GCEA_EDC_CNT, WRET_TAGMEM_SEC_COUNT),
1323 SOC15_REG_FIELD(GCEA_EDC_CNT, WRET_TAGMEM_DED_COUNT) },
1324 { "EA_IOWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1325 SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_DATAMEM_SEC_COUNT),
1326 SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_DATAMEM_DED_COUNT) },
1327 { "EA_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1328 SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_PAGEMEM_SED_COUNT), 0, 0 },
1329 { "EA_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1330 SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_PAGEMEM_SED_COUNT), 0, 0 },
1331 { "EA_IORD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1332 SOC15_REG_FIELD(GCEA_EDC_CNT, IORD_CMDMEM_SED_COUNT), 0, 0 },
1333 { "EA_IOWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
1334 SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_CMDMEM_SED_COUNT), 0, 0 },
1335
1336
1337 { "EA_GMIRD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1338 SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_CMDMEM_SEC_COUNT),
1339 SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_CMDMEM_DED_COUNT) },
1340 { "EA_GMIWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1341 SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_CMDMEM_SEC_COUNT),
1342 SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_CMDMEM_DED_COUNT) },
1343 { "EA_GMIWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1344 SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_DATAMEM_SEC_COUNT),
1345 SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_DATAMEM_DED_COUNT) },
1346 { "EA_GMIRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1347 SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_PAGEMEM_SED_COUNT), 0, 0 },
1348 { "EA_GMIWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1349 SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_PAGEMEM_SED_COUNT), 0, 0 },
1350 { "EA_MAM_D0MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1351 SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D0MEM_SED_COUNT),
1352 SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D0MEM_DED_COUNT) },
1353 { "EA_MAM_D1MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1354 SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D1MEM_SED_COUNT),
1355 SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D1MEM_DED_COUNT) },
1356 { "EA_MAM_D2MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1357 SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D2MEM_SED_COUNT),
1358 SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D2MEM_DED_COUNT) },
1359 { "EA_MAM_D3MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
1360 SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D3MEM_SED_COUNT),
1361 SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D3MEM_DED_COUNT) },
1362
1363
1364 { "EA_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1365 SOC15_REG_FIELD(GCEA_EDC_CNT3, DRAMRD_PAGEMEM_DED_COUNT) },
1366 { "EA_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1367 SOC15_REG_FIELD(GCEA_EDC_CNT3, DRAMWR_PAGEMEM_DED_COUNT) },
1368 { "EA_IORD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1369 SOC15_REG_FIELD(GCEA_EDC_CNT3, IORD_CMDMEM_DED_COUNT) },
1370 { "EA_IOWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1371 SOC15_REG_FIELD(GCEA_EDC_CNT3, IOWR_CMDMEM_DED_COUNT) },
1372 { "EA_GMIRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1373 SOC15_REG_FIELD(GCEA_EDC_CNT3, GMIRD_PAGEMEM_DED_COUNT) },
1374 { "EA_GMIWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
1375 SOC15_REG_FIELD(GCEA_EDC_CNT3, GMIWR_PAGEMEM_DED_COUNT) },
1376 { "EA_MAM_A0MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
1377 SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A0MEM_SEC_COUNT),
1378 SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A0MEM_DED_COUNT) },
1379 { "EA_MAM_A1MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
1380 SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A1MEM_SEC_COUNT),
1381 SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A1MEM_DED_COUNT) },
1382 { "EA_MAM_A2MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
1383 SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A2MEM_SEC_COUNT),
1384 SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A2MEM_DED_COUNT) },
1385 { "EA_MAM_A3MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
1386 SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A3MEM_SEC_COUNT),
1387 SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A3MEM_DED_COUNT) },
1388 { "EA_MAM_AFMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
1389 SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_AFMEM_SEC_COUNT),
1390 SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_AFMEM_DED_COUNT) },
1391 };
1392
1393 static const char * const vml2_walker_mems[] = {
1394 "UTC_VML2_CACHE_PDE0_MEM0",
1395 "UTC_VML2_CACHE_PDE0_MEM1",
1396 "UTC_VML2_CACHE_PDE1_MEM0",
1397 "UTC_VML2_CACHE_PDE1_MEM1",
1398 "UTC_VML2_CACHE_PDE2_MEM0",
1399 "UTC_VML2_CACHE_PDE2_MEM1",
1400 "UTC_VML2_RDIF_ARADDRS",
1401 "UTC_VML2_RDIF_LOG_FIFO",
1402 "UTC_VML2_QUEUE_REQ",
1403 "UTC_VML2_QUEUE_RET",
1404 };
1405
1406 static struct gfx_v9_4_2_utc_block gfx_v9_4_2_utc_blocks[] = {
1407 { VML2_MEM, 8, 2, 2,
1408 { SOC15_REG_ENTRY(GC, 0, regVML2_MEM_ECC_INDEX) },
1409 { SOC15_REG_ENTRY(GC, 0, regVML2_MEM_ECC_CNTL) },
1410 SOC15_REG_FIELD(VML2_MEM_ECC_CNTL, SEC_COUNT),
1411 SOC15_REG_FIELD(VML2_MEM_ECC_CNTL, DED_COUNT),
1412 REG_SET_FIELD(0, VML2_MEM_ECC_CNTL, WRITE_COUNTERS, 1) },
1413 { VML2_WALKER_MEM, ARRAY_SIZE(vml2_walker_mems), 1, 1,
1414 { SOC15_REG_ENTRY(GC, 0, regVML2_WALKER_MEM_ECC_INDEX) },
1415 { SOC15_REG_ENTRY(GC, 0, regVML2_WALKER_MEM_ECC_CNTL) },
1416 SOC15_REG_FIELD(VML2_WALKER_MEM_ECC_CNTL, SEC_COUNT),
1417 SOC15_REG_FIELD(VML2_WALKER_MEM_ECC_CNTL, DED_COUNT),
1418 REG_SET_FIELD(0, VML2_WALKER_MEM_ECC_CNTL, WRITE_COUNTERS, 1) },
1419 { UTCL2_MEM, 18, 1, 2,
1420 { SOC15_REG_ENTRY(GC, 0, regUTCL2_MEM_ECC_INDEX) },
1421 { SOC15_REG_ENTRY(GC, 0, regUTCL2_MEM_ECC_CNTL) },
1422 SOC15_REG_FIELD(UTCL2_MEM_ECC_CNTL, SEC_COUNT),
1423 SOC15_REG_FIELD(UTCL2_MEM_ECC_CNTL, DED_COUNT),
1424 REG_SET_FIELD(0, UTCL2_MEM_ECC_CNTL, WRITE_COUNTERS, 1) },
1425 { ATC_L2_CACHE_2M, 8, 2, 1,
1426 { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_2M_DSM_INDEX) },
1427 { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_2M_DSM_CNTL) },
1428 SOC15_REG_FIELD(ATC_L2_CACHE_2M_DSM_CNTL, SEC_COUNT),
1429 SOC15_REG_FIELD(ATC_L2_CACHE_2M_DSM_CNTL, DED_COUNT),
1430 REG_SET_FIELD(0, ATC_L2_CACHE_2M_DSM_CNTL, WRITE_COUNTERS, 1) },
1431 { ATC_L2_CACHE_32K, 8, 2, 2,
1432 { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_32K_DSM_INDEX) },
1433 { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_32K_DSM_CNTL) },
1434 SOC15_REG_FIELD(ATC_L2_CACHE_32K_DSM_CNTL, SEC_COUNT),
1435 SOC15_REG_FIELD(ATC_L2_CACHE_32K_DSM_CNTL, DED_COUNT),
1436 REG_SET_FIELD(0, ATC_L2_CACHE_32K_DSM_CNTL, WRITE_COUNTERS, 1) },
1437 { ATC_L2_CACHE_4K, 8, 2, 8,
1438 { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_4K_DSM_INDEX) },
1439 { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_4K_DSM_CNTL) },
1440 SOC15_REG_FIELD(ATC_L2_CACHE_4K_DSM_CNTL, SEC_COUNT),
1441 SOC15_REG_FIELD(ATC_L2_CACHE_4K_DSM_CNTL, DED_COUNT),
1442 REG_SET_FIELD(0, ATC_L2_CACHE_4K_DSM_CNTL, WRITE_COUNTERS, 1) },
1443 };
1444
1445 static const struct soc15_reg_entry gfx_v9_4_2_ea_err_status_regs = {
1446 SOC15_REG_ENTRY(GC, 0, regGCEA_ERR_STATUS), 0, 1, 16
1447 };
1448
1449 static int gfx_v9_4_2_get_reg_error_count(struct amdgpu_device *adev,
1450 const struct soc15_reg_entry *reg,
1451 uint32_t se_id, uint32_t inst_id,
1452 uint32_t value, uint32_t *sec_count,
1453 uint32_t *ded_count)
1454 {
1455 uint32_t i;
1456 uint32_t sec_cnt, ded_cnt;
1457
1458 for (i = 0; i < ARRAY_SIZE(gfx_v9_4_2_ras_fields); i++) {
1459 if (gfx_v9_4_2_ras_fields[i].reg_offset != reg->reg_offset ||
1460 gfx_v9_4_2_ras_fields[i].seg != reg->seg ||
1461 gfx_v9_4_2_ras_fields[i].inst != reg->inst)
1462 continue;
1463
1464 sec_cnt = SOC15_RAS_REG_FIELD_VAL(
1465 value, gfx_v9_4_2_ras_fields[i], sec);
1466 if (sec_cnt) {
1467 dev_info(adev->dev,
1468 "GFX SubBlock %s, Instance[%d][%d], SEC %d\n",
1469 gfx_v9_4_2_ras_fields[i].name, se_id, inst_id,
1470 sec_cnt);
1471 *sec_count += sec_cnt;
1472 }
1473
1474 ded_cnt = SOC15_RAS_REG_FIELD_VAL(
1475 value, gfx_v9_4_2_ras_fields[i], ded);
1476 if (ded_cnt) {
1477 dev_info(adev->dev,
1478 "GFX SubBlock %s, Instance[%d][%d], DED %d\n",
1479 gfx_v9_4_2_ras_fields[i].name, se_id, inst_id,
1480 ded_cnt);
1481 *ded_count += ded_cnt;
1482 }
1483 }
1484
1485 return 0;
1486 }
1487
1488 static int gfx_v9_4_2_query_sram_edc_count(struct amdgpu_device *adev,
1489 uint32_t *sec_count, uint32_t *ded_count)
1490 {
1491 uint32_t i, j, k, data;
1492 uint32_t sec_cnt = 0, ded_cnt = 0;
1493
1494 if (sec_count && ded_count) {
1495 *sec_count = 0;
1496 *ded_count = 0;
1497 }
1498
1499 mutex_lock(&adev->grbm_idx_mutex);
1500
1501 for (i = 0; i < ARRAY_SIZE(gfx_v9_4_2_edc_counter_regs); i++) {
1502 for (j = 0; j < gfx_v9_4_2_edc_counter_regs[i].se_num; j++) {
1503 for (k = 0; k < gfx_v9_4_2_edc_counter_regs[i].instance;
1504 k++) {
1505 gfx_v9_4_2_select_se_sh(adev, j, 0, k);
1506
1507
1508 if (!sec_count || !ded_count) {
1509 WREG32(SOC15_REG_ENTRY_OFFSET(
1510 gfx_v9_4_2_edc_counter_regs[i]), 0);
1511 continue;
1512 }
1513
1514 data = RREG32(SOC15_REG_ENTRY_OFFSET(
1515 gfx_v9_4_2_edc_counter_regs[i]));
1516
1517 if (!data)
1518 continue;
1519
1520 gfx_v9_4_2_get_reg_error_count(adev,
1521 &gfx_v9_4_2_edc_counter_regs[i],
1522 j, k, data, &sec_cnt, &ded_cnt);
1523
1524
1525 WREG32(SOC15_REG_ENTRY_OFFSET(
1526 gfx_v9_4_2_edc_counter_regs[i]), 0);
1527 }
1528 }
1529 }
1530
1531 if (sec_count && ded_count) {
1532 *sec_count += sec_cnt;
1533 *ded_count += ded_cnt;
1534 }
1535
1536 gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1537 mutex_unlock(&adev->grbm_idx_mutex);
1538
1539 return 0;
1540 }
1541
1542 static void gfx_v9_4_2_log_utc_edc_count(struct amdgpu_device *adev,
1543 struct gfx_v9_4_2_utc_block *blk,
1544 uint32_t instance, uint32_t sec_cnt,
1545 uint32_t ded_cnt)
1546 {
1547 uint32_t bank, way, mem;
1548 static const char *vml2_way_str[] = { "BIGK", "4K" };
1549 static const char *utcl2_rounter_str[] = { "VMC", "APT" };
1550
1551 mem = instance % blk->num_mem_blocks;
1552 way = (instance / blk->num_mem_blocks) % blk->num_ways;
1553 bank = instance / (blk->num_mem_blocks * blk->num_ways);
1554
1555 switch (blk->type) {
1556 case VML2_MEM:
1557 dev_info(
1558 adev->dev,
1559 "GFX SubBlock UTC_VML2_BANK_CACHE_%d_%s_MEM%d, SED %d, DED %d\n",
1560 bank, vml2_way_str[way], mem, sec_cnt, ded_cnt);
1561 break;
1562 case VML2_WALKER_MEM:
1563 dev_info(adev->dev, "GFX SubBlock %s, SED %d, DED %d\n",
1564 vml2_walker_mems[bank], sec_cnt, ded_cnt);
1565 break;
1566 case UTCL2_MEM:
1567 dev_info(
1568 adev->dev,
1569 "GFX SubBlock UTCL2_ROUTER_IFIF%d_GROUP0_%s, SED %d, DED %d\n",
1570 bank, utcl2_rounter_str[mem], sec_cnt, ded_cnt);
1571 break;
1572 case ATC_L2_CACHE_2M:
1573 dev_info(
1574 adev->dev,
1575 "GFX SubBlock UTC_ATCL2_CACHE_2M_BANK%d_WAY%d_MEM, SED %d, DED %d\n",
1576 bank, way, sec_cnt, ded_cnt);
1577 break;
1578 case ATC_L2_CACHE_32K:
1579 dev_info(
1580 adev->dev,
1581 "GFX SubBlock UTC_ATCL2_CACHE_32K_BANK%d_WAY%d_MEM%d, SED %d, DED %d\n",
1582 bank, way, mem, sec_cnt, ded_cnt);
1583 break;
1584 case ATC_L2_CACHE_4K:
1585 dev_info(
1586 adev->dev,
1587 "GFX SubBlock UTC_ATCL2_CACHE_4K_BANK%d_WAY%d_MEM%d, SED %d, DED %d\n",
1588 bank, way, mem, sec_cnt, ded_cnt);
1589 break;
1590 }
1591 }
1592
1593 static int gfx_v9_4_2_query_utc_edc_count(struct amdgpu_device *adev,
1594 uint32_t *sec_count,
1595 uint32_t *ded_count)
1596 {
1597 uint32_t i, j, data;
1598 uint32_t sec_cnt, ded_cnt;
1599 uint32_t num_instances;
1600 struct gfx_v9_4_2_utc_block *blk;
1601
1602 if (sec_count && ded_count) {
1603 *sec_count = 0;
1604 *ded_count = 0;
1605 }
1606
1607 for (i = 0; i < ARRAY_SIZE(gfx_v9_4_2_utc_blocks); i++) {
1608 blk = &gfx_v9_4_2_utc_blocks[i];
1609 num_instances =
1610 blk->num_banks * blk->num_ways * blk->num_mem_blocks;
1611 for (j = 0; j < num_instances; j++) {
1612 WREG32(SOC15_REG_ENTRY_OFFSET(blk->idx_reg), j);
1613
1614
1615 if (!sec_count || !ded_count) {
1616 WREG32(SOC15_REG_ENTRY_OFFSET(blk->data_reg),
1617 blk->clear);
1618 continue;
1619 }
1620
1621 data = RREG32(SOC15_REG_ENTRY_OFFSET(blk->data_reg));
1622 if (!data)
1623 continue;
1624
1625 sec_cnt = SOC15_RAS_REG_FIELD_VAL(data, *blk, sec);
1626 *sec_count += sec_cnt;
1627 ded_cnt = SOC15_RAS_REG_FIELD_VAL(data, *blk, ded);
1628 *ded_count += ded_cnt;
1629
1630
1631 WREG32(SOC15_REG_ENTRY_OFFSET(blk->data_reg),
1632 blk->clear);
1633
1634
1635 if (sec_cnt || ded_cnt)
1636 gfx_v9_4_2_log_utc_edc_count(adev, blk, j, sec_cnt,
1637 ded_cnt);
1638 }
1639 }
1640
1641 return 0;
1642 }
1643
1644 static void gfx_v9_4_2_query_ras_error_count(struct amdgpu_device *adev,
1645 void *ras_error_status)
1646 {
1647 struct ras_err_data *err_data = (struct ras_err_data *)ras_error_status;
1648 uint32_t sec_count = 0, ded_count = 0;
1649
1650 if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
1651 return;
1652
1653 err_data->ue_count = 0;
1654 err_data->ce_count = 0;
1655
1656 gfx_v9_4_2_query_sram_edc_count(adev, &sec_count, &ded_count);
1657 err_data->ce_count += sec_count;
1658 err_data->ue_count += ded_count;
1659
1660 gfx_v9_4_2_query_utc_edc_count(adev, &sec_count, &ded_count);
1661 err_data->ce_count += sec_count;
1662 err_data->ue_count += ded_count;
1663
1664 }
1665
1666 static void gfx_v9_4_2_reset_utc_err_status(struct amdgpu_device *adev)
1667 {
1668 WREG32_SOC15(GC, 0, regUTCL2_MEM_ECC_STATUS, 0x3);
1669 WREG32_SOC15(GC, 0, regVML2_MEM_ECC_STATUS, 0x3);
1670 WREG32_SOC15(GC, 0, regVML2_WALKER_MEM_ECC_STATUS, 0x3);
1671 }
1672
1673 static void gfx_v9_4_2_reset_ea_err_status(struct amdgpu_device *adev)
1674 {
1675 uint32_t i, j;
1676 uint32_t value;
1677
1678 mutex_lock(&adev->grbm_idx_mutex);
1679 for (i = 0; i < gfx_v9_4_2_ea_err_status_regs.se_num; i++) {
1680 for (j = 0; j < gfx_v9_4_2_ea_err_status_regs.instance;
1681 j++) {
1682 gfx_v9_4_2_select_se_sh(adev, i, 0, j);
1683 value = RREG32(SOC15_REG_ENTRY_OFFSET(
1684 gfx_v9_4_2_ea_err_status_regs));
1685 value = REG_SET_FIELD(value, GCEA_ERR_STATUS, CLEAR_ERROR_STATUS, 0x1);
1686 WREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_4_2_ea_err_status_regs), value);
1687 }
1688 }
1689 gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1690 mutex_unlock(&adev->grbm_idx_mutex);
1691 }
1692
1693 static void gfx_v9_4_2_reset_ras_error_count(struct amdgpu_device *adev)
1694 {
1695 if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
1696 return;
1697
1698 gfx_v9_4_2_query_sram_edc_count(adev, NULL, NULL);
1699 gfx_v9_4_2_query_utc_edc_count(adev, NULL, NULL);
1700 }
1701
1702 static int gfx_v9_4_2_ras_error_inject(struct amdgpu_device *adev, void *inject_if)
1703 {
1704 struct ras_inject_if *info = (struct ras_inject_if *)inject_if;
1705 int ret;
1706 struct ta_ras_trigger_error_input block_info = { 0 };
1707
1708 if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
1709 return -EINVAL;
1710
1711 block_info.block_id = amdgpu_ras_block_to_ta(info->head.block);
1712 block_info.sub_block_index = info->head.sub_block_index;
1713 block_info.inject_error_type = amdgpu_ras_error_to_ta(info->head.type);
1714 block_info.address = info->address;
1715 block_info.value = info->value;
1716
1717 mutex_lock(&adev->grbm_idx_mutex);
1718 ret = psp_ras_trigger_error(&adev->psp, &block_info);
1719 mutex_unlock(&adev->grbm_idx_mutex);
1720
1721 return ret;
1722 }
1723
1724 static void gfx_v9_4_2_query_ea_err_status(struct amdgpu_device *adev)
1725 {
1726 uint32_t i, j;
1727 uint32_t reg_value;
1728
1729 mutex_lock(&adev->grbm_idx_mutex);
1730
1731 for (i = 0; i < gfx_v9_4_2_ea_err_status_regs.se_num; i++) {
1732 for (j = 0; j < gfx_v9_4_2_ea_err_status_regs.instance;
1733 j++) {
1734 gfx_v9_4_2_select_se_sh(adev, i, 0, j);
1735 reg_value = RREG32(SOC15_REG_ENTRY_OFFSET(
1736 gfx_v9_4_2_ea_err_status_regs));
1737
1738 if (REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_RDRSP_STATUS) ||
1739 REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_WRRSP_STATUS) ||
1740 REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_RDRSP_DATAPARITY_ERROR)) {
1741 dev_warn(adev->dev, "GCEA err detected at instance: %d, status: 0x%x!\n",
1742 j, reg_value);
1743 }
1744
1745 reg_value = REG_SET_FIELD(reg_value, GCEA_ERR_STATUS,
1746 CLEAR_ERROR_STATUS, 0x1);
1747 WREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_4_2_ea_err_status_regs), reg_value);
1748 }
1749 }
1750
1751 gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1752 mutex_unlock(&adev->grbm_idx_mutex);
1753 }
1754
1755 static void gfx_v9_4_2_query_utc_err_status(struct amdgpu_device *adev)
1756 {
1757 uint32_t data;
1758
1759 data = RREG32_SOC15(GC, 0, regUTCL2_MEM_ECC_STATUS);
1760 if (data) {
1761 dev_warn(adev->dev, "GFX UTCL2 Mem Ecc Status: 0x%x!\n", data);
1762 WREG32_SOC15(GC, 0, regUTCL2_MEM_ECC_STATUS, 0x3);
1763 }
1764
1765 data = RREG32_SOC15(GC, 0, regVML2_MEM_ECC_STATUS);
1766 if (data) {
1767 dev_warn(adev->dev, "GFX VML2 Mem Ecc Status: 0x%x!\n", data);
1768 WREG32_SOC15(GC, 0, regVML2_MEM_ECC_STATUS, 0x3);
1769 }
1770
1771 data = RREG32_SOC15(GC, 0, regVML2_WALKER_MEM_ECC_STATUS);
1772 if (data) {
1773 dev_warn(adev->dev, "GFX VML2 Walker Mem Ecc Status: 0x%x!\n", data);
1774 WREG32_SOC15(GC, 0, regVML2_WALKER_MEM_ECC_STATUS, 0x3);
1775 }
1776 }
1777
1778 static void gfx_v9_4_2_query_ras_error_status(struct amdgpu_device *adev)
1779 {
1780 if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
1781 return;
1782
1783 gfx_v9_4_2_query_ea_err_status(adev);
1784 gfx_v9_4_2_query_utc_err_status(adev);
1785 gfx_v9_4_2_query_sq_timeout_status(adev);
1786 }
1787
1788 static void gfx_v9_4_2_reset_ras_error_status(struct amdgpu_device *adev)
1789 {
1790 if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
1791 return;
1792
1793 gfx_v9_4_2_reset_utc_err_status(adev);
1794 gfx_v9_4_2_reset_ea_err_status(adev);
1795 gfx_v9_4_2_reset_sq_timeout_status(adev);
1796 }
1797
1798 static void gfx_v9_4_2_enable_watchdog_timer(struct amdgpu_device *adev)
1799 {
1800 uint32_t i;
1801 uint32_t data;
1802
1803 data = REG_SET_FIELD(0, SQ_TIMEOUT_CONFIG, TIMEOUT_FATAL_DISABLE,
1804 amdgpu_watchdog_timer.timeout_fatal_disable ? 1 :
1805 0);
1806
1807 if (amdgpu_watchdog_timer.timeout_fatal_disable &&
1808 (amdgpu_watchdog_timer.period < 1 ||
1809 amdgpu_watchdog_timer.period > 0x23)) {
1810 dev_warn(adev->dev, "Watchdog period range is 1 to 0x23\n");
1811 amdgpu_watchdog_timer.period = 0x23;
1812 }
1813 data = REG_SET_FIELD(data, SQ_TIMEOUT_CONFIG, PERIOD_SEL,
1814 amdgpu_watchdog_timer.period);
1815
1816 mutex_lock(&adev->grbm_idx_mutex);
1817 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
1818 gfx_v9_4_2_select_se_sh(adev, i, 0xffffffff, 0xffffffff);
1819 WREG32_SOC15(GC, 0, regSQ_TIMEOUT_CONFIG, data);
1820 }
1821 gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1822 mutex_unlock(&adev->grbm_idx_mutex);
1823 }
1824
1825 static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address)
1826 {
1827 WREG32_SOC15_RLC_EX(reg, GC, 0, regSQ_IND_INDEX,
1828 (wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |
1829 (simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |
1830 (address << SQ_IND_INDEX__INDEX__SHIFT) |
1831 (SQ_IND_INDEX__FORCE_READ_MASK));
1832 return RREG32_SOC15(GC, 0, regSQ_IND_DATA);
1833 }
1834
1835 static void gfx_v9_4_2_log_cu_timeout_status(struct amdgpu_device *adev,
1836 uint32_t status)
1837 {
1838 struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info;
1839 uint32_t i, simd, wave;
1840 uint32_t wave_status;
1841 uint32_t wave_pc_lo, wave_pc_hi;
1842 uint32_t wave_exec_lo, wave_exec_hi;
1843 uint32_t wave_inst_dw0, wave_inst_dw1;
1844 uint32_t wave_ib_sts;
1845
1846 for (i = 0; i < 32; i++) {
1847 if (!((i << 1) & status))
1848 continue;
1849
1850 simd = i / cu_info->max_waves_per_simd;
1851 wave = i % cu_info->max_waves_per_simd;
1852
1853 wave_status = wave_read_ind(adev, simd, wave, ixSQ_WAVE_STATUS);
1854 wave_pc_lo = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_LO);
1855 wave_pc_hi = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_HI);
1856 wave_exec_lo =
1857 wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_LO);
1858 wave_exec_hi =
1859 wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_HI);
1860 wave_inst_dw0 =
1861 wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW0);
1862 wave_inst_dw1 =
1863 wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW1);
1864 wave_ib_sts = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_STS);
1865
1866 dev_info(
1867 adev->dev,
1868 "\t SIMD %d, Wave %d: status 0x%x, pc 0x%llx, exec 0x%llx, inst 0x%llx, ib_sts 0x%x\n",
1869 simd, wave, wave_status,
1870 ((uint64_t)wave_pc_hi << 32 | wave_pc_lo),
1871 ((uint64_t)wave_exec_hi << 32 | wave_exec_lo),
1872 ((uint64_t)wave_inst_dw1 << 32 | wave_inst_dw0),
1873 wave_ib_sts);
1874 }
1875 }
1876
1877 static void gfx_v9_4_2_query_sq_timeout_status(struct amdgpu_device *adev)
1878 {
1879 uint32_t se_idx, sh_idx, cu_idx;
1880 uint32_t status;
1881
1882 mutex_lock(&adev->grbm_idx_mutex);
1883 for (se_idx = 0; se_idx < adev->gfx.config.max_shader_engines;
1884 se_idx++) {
1885 for (sh_idx = 0; sh_idx < adev->gfx.config.max_sh_per_se;
1886 sh_idx++) {
1887 for (cu_idx = 0;
1888 cu_idx < adev->gfx.config.max_cu_per_sh;
1889 cu_idx++) {
1890 gfx_v9_4_2_select_se_sh(adev, se_idx, sh_idx,
1891 cu_idx);
1892 status = RREG32_SOC15(GC, 0,
1893 regSQ_TIMEOUT_STATUS);
1894 if (status != 0) {
1895 dev_info(
1896 adev->dev,
1897 "GFX Watchdog Timeout: SE %d, SH %d, CU %d\n",
1898 se_idx, sh_idx, cu_idx);
1899 gfx_v9_4_2_log_cu_timeout_status(
1900 adev, status);
1901 }
1902
1903 WREG32_SOC15(GC, 0, regSQ_TIMEOUT_STATUS, 0);
1904 }
1905 }
1906 }
1907 gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1908 mutex_unlock(&adev->grbm_idx_mutex);
1909 }
1910
1911 static void gfx_v9_4_2_reset_sq_timeout_status(struct amdgpu_device *adev)
1912 {
1913 uint32_t se_idx, sh_idx, cu_idx;
1914
1915 mutex_lock(&adev->grbm_idx_mutex);
1916 for (se_idx = 0; se_idx < adev->gfx.config.max_shader_engines;
1917 se_idx++) {
1918 for (sh_idx = 0; sh_idx < adev->gfx.config.max_sh_per_se;
1919 sh_idx++) {
1920 for (cu_idx = 0;
1921 cu_idx < adev->gfx.config.max_cu_per_sh;
1922 cu_idx++) {
1923 gfx_v9_4_2_select_se_sh(adev, se_idx, sh_idx,
1924 cu_idx);
1925 WREG32_SOC15(GC, 0, regSQ_TIMEOUT_STATUS, 0);
1926 }
1927 }
1928 }
1929 gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1930 mutex_unlock(&adev->grbm_idx_mutex);
1931 }
1932
1933 static bool gfx_v9_4_2_query_uctl2_poison_status(struct amdgpu_device *adev)
1934 {
1935 u32 status = 0;
1936 struct amdgpu_vmhub *hub;
1937
1938 hub = &adev->vmhub[AMDGPU_GFXHUB_0];
1939 status = RREG32(hub->vm_l2_pro_fault_status);
1940
1941 WREG32_P(hub->vm_l2_pro_fault_cntl, 1, ~1);
1942
1943 return REG_GET_FIELD(status, VM_L2_PROTECTION_FAULT_STATUS, FED);
1944 }
1945
1946 struct amdgpu_ras_block_hw_ops gfx_v9_4_2_ras_ops = {
1947 .ras_error_inject = &gfx_v9_4_2_ras_error_inject,
1948 .query_ras_error_count = &gfx_v9_4_2_query_ras_error_count,
1949 .reset_ras_error_count = &gfx_v9_4_2_reset_ras_error_count,
1950 .query_ras_error_status = &gfx_v9_4_2_query_ras_error_status,
1951 .reset_ras_error_status = &gfx_v9_4_2_reset_ras_error_status,
1952 };
1953
1954 struct amdgpu_gfx_ras gfx_v9_4_2_ras = {
1955 .ras_block = {
1956 .hw_ops = &gfx_v9_4_2_ras_ops,
1957 },
1958 .enable_watchdog_timer = &gfx_v9_4_2_enable_watchdog_timer,
1959 .query_utcl2_poison_status = gfx_v9_4_2_query_uctl2_poison_status,
1960 };