xref: /openbsd/sys/dev/pci/drm/amd/amdgpu/gfx_v9_4_2.c (revision f005ef32)
15ca02815Sjsg /*
25ca02815Sjsg  * Copyright 2020 Advanced Micro Devices, Inc.
35ca02815Sjsg  *
45ca02815Sjsg  * Permission is hereby granted, free of charge, to any person obtaining a
55ca02815Sjsg  * copy of this software and associated documentation files (the "Software"),
65ca02815Sjsg  * to deal in the Software without restriction, including without limitation
75ca02815Sjsg  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
85ca02815Sjsg  * and/or sell copies of the Software, and to permit persons to whom the
95ca02815Sjsg  * Software is furnished to do so, subject to the following conditions:
105ca02815Sjsg  *
115ca02815Sjsg  * The above copyright notice and this permission notice shall be included in
125ca02815Sjsg  * all copies or substantial portions of the Software.
135ca02815Sjsg  *
145ca02815Sjsg  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
155ca02815Sjsg  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
165ca02815Sjsg  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
175ca02815Sjsg  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
185ca02815Sjsg  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
195ca02815Sjsg  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
205ca02815Sjsg  * OTHER DEALINGS IN THE SOFTWARE.
215ca02815Sjsg  *
225ca02815Sjsg  */
235ca02815Sjsg #include "amdgpu.h"
245ca02815Sjsg #include "soc15.h"
255ca02815Sjsg #include "soc15d.h"
265ca02815Sjsg 
275ca02815Sjsg #include "gc/gc_9_4_2_offset.h"
285ca02815Sjsg #include "gc/gc_9_4_2_sh_mask.h"
295ca02815Sjsg #include "gfx_v9_0.h"
305ca02815Sjsg 
315ca02815Sjsg #include "gfx_v9_4_2.h"
325ca02815Sjsg #include "amdgpu_ras.h"
335ca02815Sjsg #include "amdgpu_gfx.h"
345ca02815Sjsg 
355ca02815Sjsg #define SE_ID_MAX 8
365ca02815Sjsg #define CU_ID_MAX 16
375ca02815Sjsg #define SIMD_ID_MAX 4
385ca02815Sjsg #define WAVE_ID_MAX 10
395ca02815Sjsg 
405ca02815Sjsg enum gfx_v9_4_2_utc_type {
415ca02815Sjsg 	VML2_MEM,
425ca02815Sjsg 	VML2_WALKER_MEM,
435ca02815Sjsg 	UTCL2_MEM,
445ca02815Sjsg 	ATC_L2_CACHE_2M,
455ca02815Sjsg 	ATC_L2_CACHE_32K,
465ca02815Sjsg 	ATC_L2_CACHE_4K
475ca02815Sjsg };
485ca02815Sjsg 
495ca02815Sjsg struct gfx_v9_4_2_utc_block {
505ca02815Sjsg 	enum gfx_v9_4_2_utc_type type;
515ca02815Sjsg 	uint32_t num_banks;
525ca02815Sjsg 	uint32_t num_ways;
535ca02815Sjsg 	uint32_t num_mem_blocks;
545ca02815Sjsg 	struct soc15_reg idx_reg;
555ca02815Sjsg 	struct soc15_reg data_reg;
565ca02815Sjsg 	uint32_t sec_count_mask;
575ca02815Sjsg 	uint32_t sec_count_shift;
585ca02815Sjsg 	uint32_t ded_count_mask;
595ca02815Sjsg 	uint32_t ded_count_shift;
605ca02815Sjsg 	uint32_t clear;
615ca02815Sjsg };
625ca02815Sjsg 
635ca02815Sjsg static const struct soc15_reg_golden golden_settings_gc_9_4_2_alde_die_0[] = {
645ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_0, 0x3fffffff, 0x141dc920),
655ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_1, 0x3fffffff, 0x3b458b93),
665ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_2, 0x3fffffff, 0x1a4f5583),
675ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_3, 0x3fffffff, 0x317717f6),
685ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_4, 0x3fffffff, 0x107cc1e6),
695ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_5, 0x3ff, 0x351),
705ca02815Sjsg };
715ca02815Sjsg 
725ca02815Sjsg static const struct soc15_reg_golden golden_settings_gc_9_4_2_alde_die_1[] = {
735ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_0, 0x3fffffff, 0x2591aa38),
745ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_1, 0x3fffffff, 0xac9e88b),
755ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_2, 0x3fffffff, 0x2bc3369b),
765ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_3, 0x3fffffff, 0xfb74ee),
775ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_4, 0x3fffffff, 0x21f0a2fe),
785ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CHAN_STEER_5, 0x3ff, 0x49),
795ca02815Sjsg };
805ca02815Sjsg 
815ca02815Sjsg static const struct soc15_reg_golden golden_settings_gc_9_4_2_alde[] = {
825ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regGB_ADDR_CONFIG, 0xffff77ff, 0x2a114042),
835ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regTA_CNTL_AUX, 0xfffffeef, 0x10b0000),
845ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_UTCL1_CNTL1, 0xffffffff, 0x30800400),
855ca02815Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, regTCI_CNTL_3, 0xff, 0x20),
865ca02815Sjsg };
875ca02815Sjsg 
885ca02815Sjsg /*
895ca02815Sjsg  * This shader is used to clear VGPRS and LDS, and also write the input
905ca02815Sjsg  * pattern into the write back buffer, which will be used by driver to
915ca02815Sjsg  * check whether all SIMDs have been covered.
925ca02815Sjsg */
935ca02815Sjsg static const u32 vgpr_init_compute_shader_aldebaran[] = {
945ca02815Sjsg 	0xb8840904, 0xb8851a04, 0xb8861344, 0xb8831804, 0x9208ff06, 0x00000280,
955ca02815Sjsg 	0x9209a805, 0x920a8a04, 0x81080908, 0x81080a08, 0x81080308, 0x8e078208,
965ca02815Sjsg 	0x81078407, 0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8a0000, 0xd3d94000,
975ca02815Sjsg 	0x18000080, 0xd3d94001, 0x18000080, 0xd3d94002, 0x18000080, 0xd3d94003,
985ca02815Sjsg 	0x18000080, 0xd3d94004, 0x18000080, 0xd3d94005, 0x18000080, 0xd3d94006,
995ca02815Sjsg 	0x18000080, 0xd3d94007, 0x18000080, 0xd3d94008, 0x18000080, 0xd3d94009,
1005ca02815Sjsg 	0x18000080, 0xd3d9400a, 0x18000080, 0xd3d9400b, 0x18000080, 0xd3d9400c,
1015ca02815Sjsg 	0x18000080, 0xd3d9400d, 0x18000080, 0xd3d9400e, 0x18000080, 0xd3d9400f,
1025ca02815Sjsg 	0x18000080, 0xd3d94010, 0x18000080, 0xd3d94011, 0x18000080, 0xd3d94012,
1035ca02815Sjsg 	0x18000080, 0xd3d94013, 0x18000080, 0xd3d94014, 0x18000080, 0xd3d94015,
1045ca02815Sjsg 	0x18000080, 0xd3d94016, 0x18000080, 0xd3d94017, 0x18000080, 0xd3d94018,
1055ca02815Sjsg 	0x18000080, 0xd3d94019, 0x18000080, 0xd3d9401a, 0x18000080, 0xd3d9401b,
1065ca02815Sjsg 	0x18000080, 0xd3d9401c, 0x18000080, 0xd3d9401d, 0x18000080, 0xd3d9401e,
1075ca02815Sjsg 	0x18000080, 0xd3d9401f, 0x18000080, 0xd3d94020, 0x18000080, 0xd3d94021,
1085ca02815Sjsg 	0x18000080, 0xd3d94022, 0x18000080, 0xd3d94023, 0x18000080, 0xd3d94024,
1095ca02815Sjsg 	0x18000080, 0xd3d94025, 0x18000080, 0xd3d94026, 0x18000080, 0xd3d94027,
1105ca02815Sjsg 	0x18000080, 0xd3d94028, 0x18000080, 0xd3d94029, 0x18000080, 0xd3d9402a,
1115ca02815Sjsg 	0x18000080, 0xd3d9402b, 0x18000080, 0xd3d9402c, 0x18000080, 0xd3d9402d,
1125ca02815Sjsg 	0x18000080, 0xd3d9402e, 0x18000080, 0xd3d9402f, 0x18000080, 0xd3d94030,
1135ca02815Sjsg 	0x18000080, 0xd3d94031, 0x18000080, 0xd3d94032, 0x18000080, 0xd3d94033,
1145ca02815Sjsg 	0x18000080, 0xd3d94034, 0x18000080, 0xd3d94035, 0x18000080, 0xd3d94036,
1155ca02815Sjsg 	0x18000080, 0xd3d94037, 0x18000080, 0xd3d94038, 0x18000080, 0xd3d94039,
1165ca02815Sjsg 	0x18000080, 0xd3d9403a, 0x18000080, 0xd3d9403b, 0x18000080, 0xd3d9403c,
1175ca02815Sjsg 	0x18000080, 0xd3d9403d, 0x18000080, 0xd3d9403e, 0x18000080, 0xd3d9403f,
1185ca02815Sjsg 	0x18000080, 0xd3d94040, 0x18000080, 0xd3d94041, 0x18000080, 0xd3d94042,
1195ca02815Sjsg 	0x18000080, 0xd3d94043, 0x18000080, 0xd3d94044, 0x18000080, 0xd3d94045,
1205ca02815Sjsg 	0x18000080, 0xd3d94046, 0x18000080, 0xd3d94047, 0x18000080, 0xd3d94048,
1215ca02815Sjsg 	0x18000080, 0xd3d94049, 0x18000080, 0xd3d9404a, 0x18000080, 0xd3d9404b,
1225ca02815Sjsg 	0x18000080, 0xd3d9404c, 0x18000080, 0xd3d9404d, 0x18000080, 0xd3d9404e,
1235ca02815Sjsg 	0x18000080, 0xd3d9404f, 0x18000080, 0xd3d94050, 0x18000080, 0xd3d94051,
1245ca02815Sjsg 	0x18000080, 0xd3d94052, 0x18000080, 0xd3d94053, 0x18000080, 0xd3d94054,
1255ca02815Sjsg 	0x18000080, 0xd3d94055, 0x18000080, 0xd3d94056, 0x18000080, 0xd3d94057,
1265ca02815Sjsg 	0x18000080, 0xd3d94058, 0x18000080, 0xd3d94059, 0x18000080, 0xd3d9405a,
1275ca02815Sjsg 	0x18000080, 0xd3d9405b, 0x18000080, 0xd3d9405c, 0x18000080, 0xd3d9405d,
1285ca02815Sjsg 	0x18000080, 0xd3d9405e, 0x18000080, 0xd3d9405f, 0x18000080, 0xd3d94060,
1295ca02815Sjsg 	0x18000080, 0xd3d94061, 0x18000080, 0xd3d94062, 0x18000080, 0xd3d94063,
1305ca02815Sjsg 	0x18000080, 0xd3d94064, 0x18000080, 0xd3d94065, 0x18000080, 0xd3d94066,
1315ca02815Sjsg 	0x18000080, 0xd3d94067, 0x18000080, 0xd3d94068, 0x18000080, 0xd3d94069,
1325ca02815Sjsg 	0x18000080, 0xd3d9406a, 0x18000080, 0xd3d9406b, 0x18000080, 0xd3d9406c,
1335ca02815Sjsg 	0x18000080, 0xd3d9406d, 0x18000080, 0xd3d9406e, 0x18000080, 0xd3d9406f,
1345ca02815Sjsg 	0x18000080, 0xd3d94070, 0x18000080, 0xd3d94071, 0x18000080, 0xd3d94072,
1355ca02815Sjsg 	0x18000080, 0xd3d94073, 0x18000080, 0xd3d94074, 0x18000080, 0xd3d94075,
1365ca02815Sjsg 	0x18000080, 0xd3d94076, 0x18000080, 0xd3d94077, 0x18000080, 0xd3d94078,
1375ca02815Sjsg 	0x18000080, 0xd3d94079, 0x18000080, 0xd3d9407a, 0x18000080, 0xd3d9407b,
1385ca02815Sjsg 	0x18000080, 0xd3d9407c, 0x18000080, 0xd3d9407d, 0x18000080, 0xd3d9407e,
1395ca02815Sjsg 	0x18000080, 0xd3d9407f, 0x18000080, 0xd3d94080, 0x18000080, 0xd3d94081,
1405ca02815Sjsg 	0x18000080, 0xd3d94082, 0x18000080, 0xd3d94083, 0x18000080, 0xd3d94084,
1415ca02815Sjsg 	0x18000080, 0xd3d94085, 0x18000080, 0xd3d94086, 0x18000080, 0xd3d94087,
1425ca02815Sjsg 	0x18000080, 0xd3d94088, 0x18000080, 0xd3d94089, 0x18000080, 0xd3d9408a,
1435ca02815Sjsg 	0x18000080, 0xd3d9408b, 0x18000080, 0xd3d9408c, 0x18000080, 0xd3d9408d,
1445ca02815Sjsg 	0x18000080, 0xd3d9408e, 0x18000080, 0xd3d9408f, 0x18000080, 0xd3d94090,
1455ca02815Sjsg 	0x18000080, 0xd3d94091, 0x18000080, 0xd3d94092, 0x18000080, 0xd3d94093,
1465ca02815Sjsg 	0x18000080, 0xd3d94094, 0x18000080, 0xd3d94095, 0x18000080, 0xd3d94096,
1475ca02815Sjsg 	0x18000080, 0xd3d94097, 0x18000080, 0xd3d94098, 0x18000080, 0xd3d94099,
1485ca02815Sjsg 	0x18000080, 0xd3d9409a, 0x18000080, 0xd3d9409b, 0x18000080, 0xd3d9409c,
1495ca02815Sjsg 	0x18000080, 0xd3d9409d, 0x18000080, 0xd3d9409e, 0x18000080, 0xd3d9409f,
1505ca02815Sjsg 	0x18000080, 0xd3d940a0, 0x18000080, 0xd3d940a1, 0x18000080, 0xd3d940a2,
1515ca02815Sjsg 	0x18000080, 0xd3d940a3, 0x18000080, 0xd3d940a4, 0x18000080, 0xd3d940a5,
1525ca02815Sjsg 	0x18000080, 0xd3d940a6, 0x18000080, 0xd3d940a7, 0x18000080, 0xd3d940a8,
1535ca02815Sjsg 	0x18000080, 0xd3d940a9, 0x18000080, 0xd3d940aa, 0x18000080, 0xd3d940ab,
1545ca02815Sjsg 	0x18000080, 0xd3d940ac, 0x18000080, 0xd3d940ad, 0x18000080, 0xd3d940ae,
1555ca02815Sjsg 	0x18000080, 0xd3d940af, 0x18000080, 0xd3d940b0, 0x18000080, 0xd3d940b1,
1565ca02815Sjsg 	0x18000080, 0xd3d940b2, 0x18000080, 0xd3d940b3, 0x18000080, 0xd3d940b4,
1575ca02815Sjsg 	0x18000080, 0xd3d940b5, 0x18000080, 0xd3d940b6, 0x18000080, 0xd3d940b7,
1585ca02815Sjsg 	0x18000080, 0xd3d940b8, 0x18000080, 0xd3d940b9, 0x18000080, 0xd3d940ba,
1595ca02815Sjsg 	0x18000080, 0xd3d940bb, 0x18000080, 0xd3d940bc, 0x18000080, 0xd3d940bd,
1605ca02815Sjsg 	0x18000080, 0xd3d940be, 0x18000080, 0xd3d940bf, 0x18000080, 0xd3d940c0,
1615ca02815Sjsg 	0x18000080, 0xd3d940c1, 0x18000080, 0xd3d940c2, 0x18000080, 0xd3d940c3,
1625ca02815Sjsg 	0x18000080, 0xd3d940c4, 0x18000080, 0xd3d940c5, 0x18000080, 0xd3d940c6,
1635ca02815Sjsg 	0x18000080, 0xd3d940c7, 0x18000080, 0xd3d940c8, 0x18000080, 0xd3d940c9,
1645ca02815Sjsg 	0x18000080, 0xd3d940ca, 0x18000080, 0xd3d940cb, 0x18000080, 0xd3d940cc,
1655ca02815Sjsg 	0x18000080, 0xd3d940cd, 0x18000080, 0xd3d940ce, 0x18000080, 0xd3d940cf,
1665ca02815Sjsg 	0x18000080, 0xd3d940d0, 0x18000080, 0xd3d940d1, 0x18000080, 0xd3d940d2,
1675ca02815Sjsg 	0x18000080, 0xd3d940d3, 0x18000080, 0xd3d940d4, 0x18000080, 0xd3d940d5,
1685ca02815Sjsg 	0x18000080, 0xd3d940d6, 0x18000080, 0xd3d940d7, 0x18000080, 0xd3d940d8,
1695ca02815Sjsg 	0x18000080, 0xd3d940d9, 0x18000080, 0xd3d940da, 0x18000080, 0xd3d940db,
1705ca02815Sjsg 	0x18000080, 0xd3d940dc, 0x18000080, 0xd3d940dd, 0x18000080, 0xd3d940de,
1715ca02815Sjsg 	0x18000080, 0xd3d940df, 0x18000080, 0xd3d940e0, 0x18000080, 0xd3d940e1,
1725ca02815Sjsg 	0x18000080, 0xd3d940e2, 0x18000080, 0xd3d940e3, 0x18000080, 0xd3d940e4,
1735ca02815Sjsg 	0x18000080, 0xd3d940e5, 0x18000080, 0xd3d940e6, 0x18000080, 0xd3d940e7,
1745ca02815Sjsg 	0x18000080, 0xd3d940e8, 0x18000080, 0xd3d940e9, 0x18000080, 0xd3d940ea,
1755ca02815Sjsg 	0x18000080, 0xd3d940eb, 0x18000080, 0xd3d940ec, 0x18000080, 0xd3d940ed,
1765ca02815Sjsg 	0x18000080, 0xd3d940ee, 0x18000080, 0xd3d940ef, 0x18000080, 0xd3d940f0,
1775ca02815Sjsg 	0x18000080, 0xd3d940f1, 0x18000080, 0xd3d940f2, 0x18000080, 0xd3d940f3,
1785ca02815Sjsg 	0x18000080, 0xd3d940f4, 0x18000080, 0xd3d940f5, 0x18000080, 0xd3d940f6,
1795ca02815Sjsg 	0x18000080, 0xd3d940f7, 0x18000080, 0xd3d940f8, 0x18000080, 0xd3d940f9,
1805ca02815Sjsg 	0x18000080, 0xd3d940fa, 0x18000080, 0xd3d940fb, 0x18000080, 0xd3d940fc,
1815ca02815Sjsg 	0x18000080, 0xd3d940fd, 0x18000080, 0xd3d940fe, 0x18000080, 0xd3d940ff,
1825ca02815Sjsg 	0x18000080, 0xb07c0000, 0xbe8a00ff, 0x000000f8, 0xbf11080a, 0x7e000280,
1835ca02815Sjsg 	0x7e020280, 0x7e040280, 0x7e060280, 0x7e080280, 0x7e0a0280, 0x7e0c0280,
1845ca02815Sjsg 	0x7e0e0280, 0x808a880a, 0xbe80320a, 0xbf84fff5, 0xbf9c0000, 0xd28c0001,
1855ca02815Sjsg 	0x0001007f, 0xd28d0001, 0x0002027e, 0x10020288, 0xbe8b0004, 0xb78b4000,
1865ca02815Sjsg 	0xd1196a01, 0x00001701, 0xbe8a0087, 0xbefc00c1, 0xd89c4000, 0x00020201,
1875ca02815Sjsg 	0xd89cc080, 0x00040401, 0x320202ff, 0x00000800, 0x808a810a, 0xbf84fff8,
1885ca02815Sjsg 	0xbf810000,
1895ca02815Sjsg };
1905ca02815Sjsg 
1915ca02815Sjsg const struct soc15_reg_entry vgpr_init_regs_aldebaran[] = {
1925ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
1935ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_X), 0x40 },
1945ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Y), 4 },
1955ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Z), 1 },
1965ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC1), 0xbf },
1975ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC2), 0x400006 },  /* 64KB LDS */
1985ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC3), 0x3F }, /*  63 - accum-offset = 256 */
1995ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE0), 0xffffffff },
2005ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE1), 0xffffffff },
2015ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE2), 0xffffffff },
2025ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE3), 0xffffffff },
2035ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE4), 0xffffffff },
2045ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE5), 0xffffffff },
2055ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE6), 0xffffffff },
2065ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE7), 0xffffffff },
2075ca02815Sjsg };
2085ca02815Sjsg 
2095ca02815Sjsg /*
2105ca02815Sjsg  * The below shaders are used to clear SGPRS, and also write the input
2115ca02815Sjsg  * pattern into the write back buffer. The first two dispatch should be
2125ca02815Sjsg  * scheduled simultaneously which make sure that all SGPRS could be
2135ca02815Sjsg  * allocated, so the dispatch 1 need check write back buffer before scheduled,
2145ca02815Sjsg  * make sure that waves of dispatch 0 are all dispacthed to all simds
2155ca02815Sjsg  * balanced. both dispatch 0 and dispatch 1 should be halted until all waves
2165ca02815Sjsg  * are dispatched, and then driver write a pattern to the shared memory to make
2175ca02815Sjsg  * all waves continue.
2185ca02815Sjsg */
2195ca02815Sjsg static const u32 sgpr112_init_compute_shader_aldebaran[] = {
2205ca02815Sjsg 	0xb8840904, 0xb8851a04, 0xb8861344, 0xb8831804, 0x9208ff06, 0x00000280,
2215ca02815Sjsg 	0x9209a805, 0x920a8a04, 0x81080908, 0x81080a08, 0x81080308, 0x8e078208,
2225ca02815Sjsg 	0x81078407, 0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8e003f, 0xc0030200,
2235ca02815Sjsg 	0x00000000, 0xbf8c0000, 0xbf06ff08, 0xdeadbeaf, 0xbf84fff9, 0x81028102,
2245ca02815Sjsg 	0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8a0000, 0xbefc0080, 0xbeea0080,
2255ca02815Sjsg 	0xbeeb0080, 0xbf00f280, 0xbee60080, 0xbee70080, 0xbee80080, 0xbee90080,
2265ca02815Sjsg 	0xbefe0080, 0xbeff0080, 0xbe880080, 0xbe890080, 0xbe8a0080, 0xbe8b0080,
2275ca02815Sjsg 	0xbe8c0080, 0xbe8d0080, 0xbe8e0080, 0xbe8f0080, 0xbe900080, 0xbe910080,
2285ca02815Sjsg 	0xbe920080, 0xbe930080, 0xbe940080, 0xbe950080, 0xbe960080, 0xbe970080,
2295ca02815Sjsg 	0xbe980080, 0xbe990080, 0xbe9a0080, 0xbe9b0080, 0xbe9c0080, 0xbe9d0080,
2305ca02815Sjsg 	0xbe9e0080, 0xbe9f0080, 0xbea00080, 0xbea10080, 0xbea20080, 0xbea30080,
2315ca02815Sjsg 	0xbea40080, 0xbea50080, 0xbea60080, 0xbea70080, 0xbea80080, 0xbea90080,
2325ca02815Sjsg 	0xbeaa0080, 0xbeab0080, 0xbeac0080, 0xbead0080, 0xbeae0080, 0xbeaf0080,
2335ca02815Sjsg 	0xbeb00080, 0xbeb10080, 0xbeb20080, 0xbeb30080, 0xbeb40080, 0xbeb50080,
2345ca02815Sjsg 	0xbeb60080, 0xbeb70080, 0xbeb80080, 0xbeb90080, 0xbeba0080, 0xbebb0080,
2355ca02815Sjsg 	0xbebc0080, 0xbebd0080, 0xbebe0080, 0xbebf0080, 0xbec00080, 0xbec10080,
2365ca02815Sjsg 	0xbec20080, 0xbec30080, 0xbec40080, 0xbec50080, 0xbec60080, 0xbec70080,
2375ca02815Sjsg 	0xbec80080, 0xbec90080, 0xbeca0080, 0xbecb0080, 0xbecc0080, 0xbecd0080,
2385ca02815Sjsg 	0xbece0080, 0xbecf0080, 0xbed00080, 0xbed10080, 0xbed20080, 0xbed30080,
2395ca02815Sjsg 	0xbed40080, 0xbed50080, 0xbed60080, 0xbed70080, 0xbed80080, 0xbed90080,
2405ca02815Sjsg 	0xbeda0080, 0xbedb0080, 0xbedc0080, 0xbedd0080, 0xbede0080, 0xbedf0080,
2415ca02815Sjsg 	0xbee00080, 0xbee10080, 0xbee20080, 0xbee30080, 0xbee40080, 0xbee50080,
2425ca02815Sjsg 	0xbf810000
2435ca02815Sjsg };
2445ca02815Sjsg 
2455ca02815Sjsg const struct soc15_reg_entry sgpr112_init_regs_aldebaran[] = {
2465ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
2475ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_X), 0x40 },
2485ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Y), 8 },
2495ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Z), 1 },
2505ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC1), 0x340 },
2515ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC2), 0x6 },
2525ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC3), 0x0 },
2535ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE0), 0xffffffff },
2545ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE1), 0xffffffff },
2555ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE2), 0xffffffff },
2565ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE3), 0xffffffff },
2575ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE4), 0xffffffff },
2585ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE5), 0xffffffff },
2595ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE6), 0xffffffff },
2605ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE7), 0xffffffff },
2615ca02815Sjsg };
2625ca02815Sjsg 
2635ca02815Sjsg static const u32 sgpr96_init_compute_shader_aldebaran[] = {
2645ca02815Sjsg 	0xb8840904, 0xb8851a04, 0xb8861344, 0xb8831804, 0x9208ff06, 0x00000280,
2655ca02815Sjsg 	0x9209a805, 0x920a8a04, 0x81080908, 0x81080a08, 0x81080308, 0x8e078208,
2665ca02815Sjsg 	0x81078407, 0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8e003f, 0xc0030200,
2675ca02815Sjsg 	0x00000000, 0xbf8c0000, 0xbf06ff08, 0xdeadbeaf, 0xbf84fff9, 0x81028102,
2685ca02815Sjsg 	0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8a0000, 0xbefc0080, 0xbeea0080,
2695ca02815Sjsg 	0xbeeb0080, 0xbf00f280, 0xbee60080, 0xbee70080, 0xbee80080, 0xbee90080,
2705ca02815Sjsg 	0xbefe0080, 0xbeff0080, 0xbe880080, 0xbe890080, 0xbe8a0080, 0xbe8b0080,
2715ca02815Sjsg 	0xbe8c0080, 0xbe8d0080, 0xbe8e0080, 0xbe8f0080, 0xbe900080, 0xbe910080,
2725ca02815Sjsg 	0xbe920080, 0xbe930080, 0xbe940080, 0xbe950080, 0xbe960080, 0xbe970080,
2735ca02815Sjsg 	0xbe980080, 0xbe990080, 0xbe9a0080, 0xbe9b0080, 0xbe9c0080, 0xbe9d0080,
2745ca02815Sjsg 	0xbe9e0080, 0xbe9f0080, 0xbea00080, 0xbea10080, 0xbea20080, 0xbea30080,
2755ca02815Sjsg 	0xbea40080, 0xbea50080, 0xbea60080, 0xbea70080, 0xbea80080, 0xbea90080,
2765ca02815Sjsg 	0xbeaa0080, 0xbeab0080, 0xbeac0080, 0xbead0080, 0xbeae0080, 0xbeaf0080,
2775ca02815Sjsg 	0xbeb00080, 0xbeb10080, 0xbeb20080, 0xbeb30080, 0xbeb40080, 0xbeb50080,
2785ca02815Sjsg 	0xbeb60080, 0xbeb70080, 0xbeb80080, 0xbeb90080, 0xbeba0080, 0xbebb0080,
2795ca02815Sjsg 	0xbebc0080, 0xbebd0080, 0xbebe0080, 0xbebf0080, 0xbec00080, 0xbec10080,
2805ca02815Sjsg 	0xbec20080, 0xbec30080, 0xbec40080, 0xbec50080, 0xbec60080, 0xbec70080,
2815ca02815Sjsg 	0xbec80080, 0xbec90080, 0xbeca0080, 0xbecb0080, 0xbecc0080, 0xbecd0080,
2825ca02815Sjsg 	0xbece0080, 0xbecf0080, 0xbed00080, 0xbed10080, 0xbed20080, 0xbed30080,
2835ca02815Sjsg 	0xbed40080, 0xbed50080, 0xbed60080, 0xbed70080, 0xbed80080, 0xbed90080,
2845ca02815Sjsg 	0xbf810000,
2855ca02815Sjsg };
2865ca02815Sjsg 
2875ca02815Sjsg const struct soc15_reg_entry sgpr96_init_regs_aldebaran[] = {
2885ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
2895ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_X), 0x40 },
2905ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Y), 0xc },
2915ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Z), 1 },
2925ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC1), 0x2c0 },
2935ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC2), 0x6 },
2945ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC3), 0x0 },
2955ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE0), 0xffffffff },
2965ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE1), 0xffffffff },
2975ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE2), 0xffffffff },
2985ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE3), 0xffffffff },
2995ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE4), 0xffffffff },
3005ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE5), 0xffffffff },
3015ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE6), 0xffffffff },
3025ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE7), 0xffffffff },
3035ca02815Sjsg };
3045ca02815Sjsg 
3055ca02815Sjsg /*
3065ca02815Sjsg  * This shader is used to clear the uninitiated sgprs after the above
3075ca02815Sjsg  * two dispatches, because of hardware feature, dispath 0 couldn't clear
3085ca02815Sjsg  * top hole sgprs. Therefore need 4 waves per SIMD to cover these sgprs
3095ca02815Sjsg */
3105ca02815Sjsg static const u32 sgpr64_init_compute_shader_aldebaran[] = {
3115ca02815Sjsg 	0xb8840904, 0xb8851a04, 0xb8861344, 0xb8831804, 0x9208ff06, 0x00000280,
3125ca02815Sjsg 	0x9209a805, 0x920a8a04, 0x81080908, 0x81080a08, 0x81080308, 0x8e078208,
3135ca02815Sjsg 	0x81078407, 0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8e003f, 0xc0030200,
3145ca02815Sjsg 	0x00000000, 0xbf8c0000, 0xbf06ff08, 0xdeadbeaf, 0xbf84fff9, 0x81028102,
3155ca02815Sjsg 	0xc0410080, 0x00000007, 0xbf8c0000, 0xbf8a0000, 0xbefc0080, 0xbeea0080,
3165ca02815Sjsg 	0xbeeb0080, 0xbf00f280, 0xbee60080, 0xbee70080, 0xbee80080, 0xbee90080,
3175ca02815Sjsg 	0xbefe0080, 0xbeff0080, 0xbe880080, 0xbe890080, 0xbe8a0080, 0xbe8b0080,
3185ca02815Sjsg 	0xbe8c0080, 0xbe8d0080, 0xbe8e0080, 0xbe8f0080, 0xbe900080, 0xbe910080,
3195ca02815Sjsg 	0xbe920080, 0xbe930080, 0xbe940080, 0xbe950080, 0xbe960080, 0xbe970080,
3205ca02815Sjsg 	0xbe980080, 0xbe990080, 0xbe9a0080, 0xbe9b0080, 0xbe9c0080, 0xbe9d0080,
3215ca02815Sjsg 	0xbe9e0080, 0xbe9f0080, 0xbea00080, 0xbea10080, 0xbea20080, 0xbea30080,
3225ca02815Sjsg 	0xbea40080, 0xbea50080, 0xbea60080, 0xbea70080, 0xbea80080, 0xbea90080,
3235ca02815Sjsg 	0xbeaa0080, 0xbeab0080, 0xbeac0080, 0xbead0080, 0xbeae0080, 0xbeaf0080,
3245ca02815Sjsg 	0xbeb00080, 0xbeb10080, 0xbeb20080, 0xbeb30080, 0xbeb40080, 0xbeb50080,
3255ca02815Sjsg 	0xbeb60080, 0xbeb70080, 0xbeb80080, 0xbeb90080, 0xbf810000,
3265ca02815Sjsg };
3275ca02815Sjsg 
3285ca02815Sjsg const struct soc15_reg_entry sgpr64_init_regs_aldebaran[] = {
3295ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
3305ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_X), 0x40 },
3315ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Y), 0x10 },
3325ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_NUM_THREAD_Z), 1 },
3335ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC1), 0x1c0 },
3345ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC2), 0x6 },
3355ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_PGM_RSRC3), 0x0 },
3365ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE0), 0xffffffff },
3375ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE1), 0xffffffff },
3385ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE2), 0xffffffff },
3395ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE3), 0xffffffff },
3405ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE4), 0xffffffff },
3415ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE5), 0xffffffff },
3425ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE6), 0xffffffff },
3435ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCOMPUTE_STATIC_THREAD_MGMT_SE7), 0xffffffff },
3445ca02815Sjsg };
3455ca02815Sjsg 
gfx_v9_4_2_run_shader(struct amdgpu_device * adev,struct amdgpu_ring * ring,struct amdgpu_ib * ib,const u32 * shader_ptr,u32 shader_size,const struct soc15_reg_entry * init_regs,u32 regs_size,u32 compute_dim_x,u64 wb_gpu_addr,u32 pattern,struct dma_fence ** fence_ptr)3465ca02815Sjsg static int gfx_v9_4_2_run_shader(struct amdgpu_device *adev,
3475ca02815Sjsg 				 struct amdgpu_ring *ring,
3485ca02815Sjsg 				 struct amdgpu_ib *ib,
3495ca02815Sjsg 				 const u32 *shader_ptr, u32 shader_size,
3505ca02815Sjsg 				 const struct soc15_reg_entry *init_regs, u32 regs_size,
3515ca02815Sjsg 				 u32 compute_dim_x, u64 wb_gpu_addr, u32 pattern,
3525ca02815Sjsg 				 struct dma_fence **fence_ptr)
3535ca02815Sjsg {
3545ca02815Sjsg 	int r, i;
3555ca02815Sjsg 	uint32_t total_size, shader_offset;
3565ca02815Sjsg 	u64 gpu_addr;
3575ca02815Sjsg 
3585ca02815Sjsg 	total_size = (regs_size * 3 + 4 + 5 + 5) * 4;
359*f005ef32Sjsg 	total_size = ALIGN(total_size, 256);
3605ca02815Sjsg 	shader_offset = total_size;
361*f005ef32Sjsg 	total_size += ALIGN(shader_size, 256);
3625ca02815Sjsg 
3635ca02815Sjsg 	/* allocate an indirect buffer to put the commands in */
3645ca02815Sjsg 	memset(ib, 0, sizeof(*ib));
3655ca02815Sjsg 	r = amdgpu_ib_get(adev, NULL, total_size,
3665ca02815Sjsg 					AMDGPU_IB_POOL_DIRECT, ib);
3675ca02815Sjsg 	if (r) {
3685ca02815Sjsg 		dev_err(adev->dev, "failed to get ib (%d).\n", r);
3695ca02815Sjsg 		return r;
3705ca02815Sjsg 	}
3715ca02815Sjsg 
3725ca02815Sjsg 	/* load the compute shaders */
3735ca02815Sjsg 	for (i = 0; i < shader_size/sizeof(u32); i++)
3745ca02815Sjsg 		ib->ptr[i + (shader_offset / 4)] = shader_ptr[i];
3755ca02815Sjsg 
3765ca02815Sjsg 	/* init the ib length to 0 */
3775ca02815Sjsg 	ib->length_dw = 0;
3785ca02815Sjsg 
3795ca02815Sjsg 	/* write the register state for the compute dispatch */
3805ca02815Sjsg 	for (i = 0; i < regs_size; i++) {
3815ca02815Sjsg 		ib->ptr[ib->length_dw++] = PACKET3(PACKET3_SET_SH_REG, 1);
3825ca02815Sjsg 		ib->ptr[ib->length_dw++] = SOC15_REG_ENTRY_OFFSET(init_regs[i])
3835ca02815Sjsg 								- PACKET3_SET_SH_REG_START;
3845ca02815Sjsg 		ib->ptr[ib->length_dw++] = init_regs[i].reg_value;
3855ca02815Sjsg 	}
3865ca02815Sjsg 
3875ca02815Sjsg 	/* write the shader start address: mmCOMPUTE_PGM_LO, mmCOMPUTE_PGM_HI */
3885ca02815Sjsg 	gpu_addr = (ib->gpu_addr + (u64)shader_offset) >> 8;
3895ca02815Sjsg 	ib->ptr[ib->length_dw++] = PACKET3(PACKET3_SET_SH_REG, 2);
3905ca02815Sjsg 	ib->ptr[ib->length_dw++] = SOC15_REG_OFFSET(GC, 0, regCOMPUTE_PGM_LO)
3915ca02815Sjsg 							- PACKET3_SET_SH_REG_START;
3925ca02815Sjsg 	ib->ptr[ib->length_dw++] = lower_32_bits(gpu_addr);
3935ca02815Sjsg 	ib->ptr[ib->length_dw++] = upper_32_bits(gpu_addr);
3945ca02815Sjsg 
3955ca02815Sjsg 	/* write the wb buffer address */
3965ca02815Sjsg 	ib->ptr[ib->length_dw++] = PACKET3(PACKET3_SET_SH_REG, 3);
3975ca02815Sjsg 	ib->ptr[ib->length_dw++] = SOC15_REG_OFFSET(GC, 0, regCOMPUTE_USER_DATA_0)
3985ca02815Sjsg 							- PACKET3_SET_SH_REG_START;
3995ca02815Sjsg 	ib->ptr[ib->length_dw++] = lower_32_bits(wb_gpu_addr);
4005ca02815Sjsg 	ib->ptr[ib->length_dw++] = upper_32_bits(wb_gpu_addr);
4015ca02815Sjsg 	ib->ptr[ib->length_dw++] = pattern;
4025ca02815Sjsg 
4035ca02815Sjsg 	/* write dispatch packet */
4045ca02815Sjsg 	ib->ptr[ib->length_dw++] = PACKET3(PACKET3_DISPATCH_DIRECT, 3);
4055ca02815Sjsg 	ib->ptr[ib->length_dw++] = compute_dim_x; /* x */
4065ca02815Sjsg 	ib->ptr[ib->length_dw++] = 1; /* y */
4075ca02815Sjsg 	ib->ptr[ib->length_dw++] = 1; /* z */
4085ca02815Sjsg 	ib->ptr[ib->length_dw++] =
4095ca02815Sjsg 		REG_SET_FIELD(0, COMPUTE_DISPATCH_INITIATOR, COMPUTE_SHADER_EN, 1);
4105ca02815Sjsg 
4115ca02815Sjsg 	/* shedule the ib on the ring */
4125ca02815Sjsg 	r = amdgpu_ib_schedule(ring, 1, ib, NULL, fence_ptr);
4135ca02815Sjsg 	if (r) {
4145ca02815Sjsg 		dev_err(adev->dev, "ib submit failed (%d).\n", r);
4155ca02815Sjsg 		amdgpu_ib_free(adev, ib, NULL);
4165ca02815Sjsg 	}
4175ca02815Sjsg 	return r;
4185ca02815Sjsg }
4195ca02815Sjsg 
gfx_v9_4_2_log_wave_assignment(struct amdgpu_device * adev,uint32_t * wb_ptr)4205ca02815Sjsg static void gfx_v9_4_2_log_wave_assignment(struct amdgpu_device *adev, uint32_t *wb_ptr)
4215ca02815Sjsg {
4225ca02815Sjsg 	uint32_t se, cu, simd, wave;
4235ca02815Sjsg 	uint32_t offset = 0;
4245ca02815Sjsg 	char *str;
4255ca02815Sjsg 	int size;
4265ca02815Sjsg 
4275ca02815Sjsg 	str = kmalloc(256, GFP_KERNEL);
4285ca02815Sjsg 	if (!str)
4295ca02815Sjsg 		return;
4305ca02815Sjsg 
4315ca02815Sjsg 	dev_dbg(adev->dev, "wave assignment:\n");
4325ca02815Sjsg 
4335ca02815Sjsg 	for (se = 0; se < adev->gfx.config.max_shader_engines; se++) {
4345ca02815Sjsg 		for (cu = 0; cu < CU_ID_MAX; cu++) {
4355ca02815Sjsg 			memset(str, 0, 256);
4365ca02815Sjsg 			size = snprintf(str, 256, "SE[%02d]CU[%02d]: ", se, cu);
4375ca02815Sjsg 			for (simd = 0; simd < SIMD_ID_MAX; simd++) {
4385ca02815Sjsg 				size += snprintf(str + size, 256 - size, "[");
4395ca02815Sjsg 				for (wave = 0; wave < WAVE_ID_MAX; wave++) {
4405ca02815Sjsg 					size += snprintf(str + size, 256 - size, "%x", wb_ptr[offset]);
4415ca02815Sjsg 					offset++;
4425ca02815Sjsg 				}
4435ca02815Sjsg 				size += snprintf(str + size, 256 - size, "]  ");
4445ca02815Sjsg 			}
4455ca02815Sjsg 			dev_dbg(adev->dev, "%s\n", str);
4465ca02815Sjsg 		}
4475ca02815Sjsg 	}
4485ca02815Sjsg 
4495ca02815Sjsg 	kfree(str);
4505ca02815Sjsg }
4515ca02815Sjsg 
gfx_v9_4_2_wait_for_waves_assigned(struct amdgpu_device * adev,uint32_t * wb_ptr,uint32_t mask,uint32_t pattern,uint32_t num_wave,bool wait)4525ca02815Sjsg static int gfx_v9_4_2_wait_for_waves_assigned(struct amdgpu_device *adev,
4535ca02815Sjsg 					      uint32_t *wb_ptr, uint32_t mask,
4545ca02815Sjsg 					      uint32_t pattern, uint32_t num_wave, bool wait)
4555ca02815Sjsg {
4565ca02815Sjsg 	uint32_t se, cu, simd, wave;
4575ca02815Sjsg 	uint32_t loop = 0;
4585ca02815Sjsg 	uint32_t wave_cnt;
4595ca02815Sjsg 	uint32_t offset;
4605ca02815Sjsg 
4615ca02815Sjsg 	do {
4625ca02815Sjsg 		wave_cnt = 0;
4635ca02815Sjsg 		offset = 0;
4645ca02815Sjsg 
4655ca02815Sjsg 		for (se = 0; se < adev->gfx.config.max_shader_engines; se++)
4665ca02815Sjsg 			for (cu = 0; cu < CU_ID_MAX; cu++)
4675ca02815Sjsg 				for (simd = 0; simd < SIMD_ID_MAX; simd++)
4685ca02815Sjsg 					for (wave = 0; wave < WAVE_ID_MAX; wave++) {
4695ca02815Sjsg 						if (((1 << wave) & mask) &&
4705ca02815Sjsg 						    (wb_ptr[offset] == pattern))
4715ca02815Sjsg 							wave_cnt++;
4725ca02815Sjsg 
4735ca02815Sjsg 						offset++;
4745ca02815Sjsg 					}
4755ca02815Sjsg 
4765ca02815Sjsg 		if (wave_cnt == num_wave)
4775ca02815Sjsg 			return 0;
4785ca02815Sjsg 
4795ca02815Sjsg 		mdelay(1);
4805ca02815Sjsg 	} while (++loop < 2000 && wait);
4815ca02815Sjsg 
4825ca02815Sjsg 	dev_err(adev->dev, "actual wave num: %d, expected wave num: %d\n",
4835ca02815Sjsg 		wave_cnt, num_wave);
4845ca02815Sjsg 
4855ca02815Sjsg 	gfx_v9_4_2_log_wave_assignment(adev, wb_ptr);
4865ca02815Sjsg 
4875ca02815Sjsg 	return -EBADSLT;
4885ca02815Sjsg }
4895ca02815Sjsg 
gfx_v9_4_2_do_sgprs_init(struct amdgpu_device * adev)4905ca02815Sjsg static int gfx_v9_4_2_do_sgprs_init(struct amdgpu_device *adev)
4915ca02815Sjsg {
4925ca02815Sjsg 	int r;
4935ca02815Sjsg 	int wb_size = adev->gfx.config.max_shader_engines *
4945ca02815Sjsg 			 CU_ID_MAX * SIMD_ID_MAX * WAVE_ID_MAX;
4955ca02815Sjsg 	struct amdgpu_ib wb_ib;
4965ca02815Sjsg 	struct amdgpu_ib disp_ibs[3];
4975ca02815Sjsg 	struct dma_fence *fences[3];
4985ca02815Sjsg 	u32 pattern[3] = { 0x1, 0x5, 0xa };
4995ca02815Sjsg 
5005ca02815Sjsg 	/* bail if the compute ring is not ready */
5015ca02815Sjsg 	if (!adev->gfx.compute_ring[0].sched.ready ||
5025ca02815Sjsg 		 !adev->gfx.compute_ring[1].sched.ready)
5035ca02815Sjsg 		return 0;
5045ca02815Sjsg 
5055ca02815Sjsg 	/* allocate the write-back buffer from IB */
5065ca02815Sjsg 	memset(&wb_ib, 0, sizeof(wb_ib));
5075ca02815Sjsg 	r = amdgpu_ib_get(adev, NULL, (1 + wb_size) * sizeof(uint32_t),
5085ca02815Sjsg 			  AMDGPU_IB_POOL_DIRECT, &wb_ib);
5095ca02815Sjsg 	if (r) {
5105ca02815Sjsg 		dev_err(adev->dev, "failed to get ib (%d) for wb\n", r);
5115ca02815Sjsg 		return r;
5125ca02815Sjsg 	}
5135ca02815Sjsg 	memset(wb_ib.ptr, 0, (1 + wb_size) * sizeof(uint32_t));
5145ca02815Sjsg 
5155ca02815Sjsg 	r = gfx_v9_4_2_run_shader(adev,
5165ca02815Sjsg 			&adev->gfx.compute_ring[0],
5175ca02815Sjsg 			&disp_ibs[0],
5185ca02815Sjsg 			sgpr112_init_compute_shader_aldebaran,
5195ca02815Sjsg 			sizeof(sgpr112_init_compute_shader_aldebaran),
5205ca02815Sjsg 			sgpr112_init_regs_aldebaran,
5215ca02815Sjsg 			ARRAY_SIZE(sgpr112_init_regs_aldebaran),
5225ca02815Sjsg 			adev->gfx.cu_info.number,
5235ca02815Sjsg 			wb_ib.gpu_addr, pattern[0], &fences[0]);
5245ca02815Sjsg 	if (r) {
5255ca02815Sjsg 		dev_err(adev->dev, "failed to clear first 224 sgprs\n");
5265ca02815Sjsg 		goto pro_end;
5275ca02815Sjsg 	}
5285ca02815Sjsg 
5295ca02815Sjsg 	r = gfx_v9_4_2_wait_for_waves_assigned(adev,
5305ca02815Sjsg 			&wb_ib.ptr[1], 0b11,
5315ca02815Sjsg 			pattern[0],
5325ca02815Sjsg 			adev->gfx.cu_info.number * SIMD_ID_MAX * 2,
5335ca02815Sjsg 			true);
5345ca02815Sjsg 	if (r) {
5355ca02815Sjsg 		dev_err(adev->dev, "wave coverage failed when clear first 224 sgprs\n");
5365ca02815Sjsg 		wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
5375ca02815Sjsg 		goto disp0_failed;
5385ca02815Sjsg 	}
5395ca02815Sjsg 
5405ca02815Sjsg 	r = gfx_v9_4_2_run_shader(adev,
5415ca02815Sjsg 			&adev->gfx.compute_ring[1],
5425ca02815Sjsg 			&disp_ibs[1],
5435ca02815Sjsg 			sgpr96_init_compute_shader_aldebaran,
5445ca02815Sjsg 			sizeof(sgpr96_init_compute_shader_aldebaran),
5455ca02815Sjsg 			sgpr96_init_regs_aldebaran,
5465ca02815Sjsg 			ARRAY_SIZE(sgpr96_init_regs_aldebaran),
5475ca02815Sjsg 			adev->gfx.cu_info.number * 2,
5485ca02815Sjsg 			wb_ib.gpu_addr, pattern[1], &fences[1]);
5495ca02815Sjsg 	if (r) {
5505ca02815Sjsg 		dev_err(adev->dev, "failed to clear next 576 sgprs\n");
5515ca02815Sjsg 		goto disp0_failed;
5525ca02815Sjsg 	}
5535ca02815Sjsg 
5545ca02815Sjsg 	r = gfx_v9_4_2_wait_for_waves_assigned(adev,
5555ca02815Sjsg 			&wb_ib.ptr[1], 0b11111100,
5565ca02815Sjsg 			pattern[1], adev->gfx.cu_info.number * SIMD_ID_MAX * 6,
5575ca02815Sjsg 			true);
5585ca02815Sjsg 	if (r) {
5595ca02815Sjsg 		dev_err(adev->dev, "wave coverage failed when clear first 576 sgprs\n");
5605ca02815Sjsg 		wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
5615ca02815Sjsg 		goto disp1_failed;
5625ca02815Sjsg 	}
5635ca02815Sjsg 
5645ca02815Sjsg 	wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
5655ca02815Sjsg 
5665ca02815Sjsg 	/* wait for the GPU to finish processing the IB */
5675ca02815Sjsg 	r = dma_fence_wait(fences[0], false);
5685ca02815Sjsg 	if (r) {
5695ca02815Sjsg 		dev_err(adev->dev, "timeout to clear first 224 sgprs\n");
5705ca02815Sjsg 		goto disp1_failed;
5715ca02815Sjsg 	}
5725ca02815Sjsg 
5735ca02815Sjsg 	r = dma_fence_wait(fences[1], false);
5745ca02815Sjsg 	if (r) {
5755ca02815Sjsg 		dev_err(adev->dev, "timeout to clear first 576 sgprs\n");
5765ca02815Sjsg 		goto disp1_failed;
5775ca02815Sjsg 	}
5785ca02815Sjsg 
5795ca02815Sjsg 	memset(wb_ib.ptr, 0, (1 + wb_size) * sizeof(uint32_t));
5805ca02815Sjsg 	r = gfx_v9_4_2_run_shader(adev,
5815ca02815Sjsg 			&adev->gfx.compute_ring[0],
5825ca02815Sjsg 			&disp_ibs[2],
5835ca02815Sjsg 			sgpr64_init_compute_shader_aldebaran,
5845ca02815Sjsg 			sizeof(sgpr64_init_compute_shader_aldebaran),
5855ca02815Sjsg 			sgpr64_init_regs_aldebaran,
5865ca02815Sjsg 			ARRAY_SIZE(sgpr64_init_regs_aldebaran),
5875ca02815Sjsg 			adev->gfx.cu_info.number,
5885ca02815Sjsg 			wb_ib.gpu_addr, pattern[2], &fences[2]);
5895ca02815Sjsg 	if (r) {
5905ca02815Sjsg 		dev_err(adev->dev, "failed to clear first 256 sgprs\n");
5915ca02815Sjsg 		goto disp1_failed;
5925ca02815Sjsg 	}
5935ca02815Sjsg 
5945ca02815Sjsg 	r = gfx_v9_4_2_wait_for_waves_assigned(adev,
5955ca02815Sjsg 			&wb_ib.ptr[1], 0b1111,
5965ca02815Sjsg 			pattern[2],
5975ca02815Sjsg 			adev->gfx.cu_info.number * SIMD_ID_MAX * 4,
5985ca02815Sjsg 			true);
5995ca02815Sjsg 	if (r) {
6005ca02815Sjsg 		dev_err(adev->dev, "wave coverage failed when clear first 256 sgprs\n");
6015ca02815Sjsg 		wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
6025ca02815Sjsg 		goto disp2_failed;
6035ca02815Sjsg 	}
6045ca02815Sjsg 
6055ca02815Sjsg 	wb_ib.ptr[0] = 0xdeadbeaf; /* stop waves */
6065ca02815Sjsg 
6075ca02815Sjsg 	r = dma_fence_wait(fences[2], false);
6085ca02815Sjsg 	if (r) {
6095ca02815Sjsg 		dev_err(adev->dev, "timeout to clear first 256 sgprs\n");
6105ca02815Sjsg 		goto disp2_failed;
6115ca02815Sjsg 	}
6125ca02815Sjsg 
6135ca02815Sjsg disp2_failed:
6145ca02815Sjsg 	amdgpu_ib_free(adev, &disp_ibs[2], NULL);
6155ca02815Sjsg 	dma_fence_put(fences[2]);
6165ca02815Sjsg disp1_failed:
6175ca02815Sjsg 	amdgpu_ib_free(adev, &disp_ibs[1], NULL);
6185ca02815Sjsg 	dma_fence_put(fences[1]);
6195ca02815Sjsg disp0_failed:
6205ca02815Sjsg 	amdgpu_ib_free(adev, &disp_ibs[0], NULL);
6215ca02815Sjsg 	dma_fence_put(fences[0]);
6225ca02815Sjsg pro_end:
6235ca02815Sjsg 	amdgpu_ib_free(adev, &wb_ib, NULL);
6245ca02815Sjsg 
6255ca02815Sjsg 	if (r)
6265ca02815Sjsg 		dev_info(adev->dev, "Init SGPRS Failed\n");
6275ca02815Sjsg 	else
6285ca02815Sjsg 		dev_info(adev->dev, "Init SGPRS Successfully\n");
6295ca02815Sjsg 
6305ca02815Sjsg 	return r;
6315ca02815Sjsg }
6325ca02815Sjsg 
gfx_v9_4_2_do_vgprs_init(struct amdgpu_device * adev)6335ca02815Sjsg static int gfx_v9_4_2_do_vgprs_init(struct amdgpu_device *adev)
6345ca02815Sjsg {
6355ca02815Sjsg 	int r;
6365ca02815Sjsg 	/* CU_ID: 0~15, SIMD_ID: 0~3, WAVE_ID: 0 ~ 9 */
6375ca02815Sjsg 	int wb_size = adev->gfx.config.max_shader_engines *
6385ca02815Sjsg 			 CU_ID_MAX * SIMD_ID_MAX * WAVE_ID_MAX;
6395ca02815Sjsg 	struct amdgpu_ib wb_ib;
6405ca02815Sjsg 	struct amdgpu_ib disp_ib;
6415ca02815Sjsg 	struct dma_fence *fence;
6425ca02815Sjsg 	u32 pattern = 0xa;
6435ca02815Sjsg 
6445ca02815Sjsg 	/* bail if the compute ring is not ready */
6455ca02815Sjsg 	if (!adev->gfx.compute_ring[0].sched.ready)
6465ca02815Sjsg 		return 0;
6475ca02815Sjsg 
6485ca02815Sjsg 	/* allocate the write-back buffer from IB */
6495ca02815Sjsg 	memset(&wb_ib, 0, sizeof(wb_ib));
6505ca02815Sjsg 	r = amdgpu_ib_get(adev, NULL, (1 + wb_size) * sizeof(uint32_t),
6515ca02815Sjsg 			  AMDGPU_IB_POOL_DIRECT, &wb_ib);
6525ca02815Sjsg 	if (r) {
6535ca02815Sjsg 		dev_err(adev->dev, "failed to get ib (%d) for wb.\n", r);
6545ca02815Sjsg 		return r;
6555ca02815Sjsg 	}
6565ca02815Sjsg 	memset(wb_ib.ptr, 0, (1 + wb_size) * sizeof(uint32_t));
6575ca02815Sjsg 
6585ca02815Sjsg 	r = gfx_v9_4_2_run_shader(adev,
6595ca02815Sjsg 			&adev->gfx.compute_ring[0],
6605ca02815Sjsg 			&disp_ib,
6615ca02815Sjsg 			vgpr_init_compute_shader_aldebaran,
6625ca02815Sjsg 			sizeof(vgpr_init_compute_shader_aldebaran),
6635ca02815Sjsg 			vgpr_init_regs_aldebaran,
6645ca02815Sjsg 			ARRAY_SIZE(vgpr_init_regs_aldebaran),
6655ca02815Sjsg 			adev->gfx.cu_info.number,
6665ca02815Sjsg 			wb_ib.gpu_addr, pattern, &fence);
6675ca02815Sjsg 	if (r) {
6685ca02815Sjsg 		dev_err(adev->dev, "failed to clear vgprs\n");
6695ca02815Sjsg 		goto pro_end;
6705ca02815Sjsg 	}
6715ca02815Sjsg 
6725ca02815Sjsg 	/* wait for the GPU to finish processing the IB */
6735ca02815Sjsg 	r = dma_fence_wait(fence, false);
6745ca02815Sjsg 	if (r) {
6755ca02815Sjsg 		dev_err(adev->dev, "timeout to clear vgprs\n");
6765ca02815Sjsg 		goto disp_failed;
6775ca02815Sjsg 	}
6785ca02815Sjsg 
6795ca02815Sjsg 	r = gfx_v9_4_2_wait_for_waves_assigned(adev,
6805ca02815Sjsg 			&wb_ib.ptr[1], 0b1,
6815ca02815Sjsg 			pattern,
6825ca02815Sjsg 			adev->gfx.cu_info.number * SIMD_ID_MAX,
6835ca02815Sjsg 			false);
6845ca02815Sjsg 	if (r) {
6855ca02815Sjsg 		dev_err(adev->dev, "failed to cover all simds when clearing vgprs\n");
6865ca02815Sjsg 		goto disp_failed;
6875ca02815Sjsg 	}
6885ca02815Sjsg 
6895ca02815Sjsg disp_failed:
6905ca02815Sjsg 	amdgpu_ib_free(adev, &disp_ib, NULL);
6915ca02815Sjsg 	dma_fence_put(fence);
6925ca02815Sjsg pro_end:
6935ca02815Sjsg 	amdgpu_ib_free(adev, &wb_ib, NULL);
6945ca02815Sjsg 
6955ca02815Sjsg 	if (r)
6965ca02815Sjsg 		dev_info(adev->dev, "Init VGPRS Failed\n");
6975ca02815Sjsg 	else
6985ca02815Sjsg 		dev_info(adev->dev, "Init VGPRS Successfully\n");
6995ca02815Sjsg 
7005ca02815Sjsg 	return r;
7015ca02815Sjsg }
7025ca02815Sjsg 
gfx_v9_4_2_do_edc_gpr_workarounds(struct amdgpu_device * adev)7035ca02815Sjsg int gfx_v9_4_2_do_edc_gpr_workarounds(struct amdgpu_device *adev)
7045ca02815Sjsg {
7055ca02815Sjsg 	/* only support when RAS is enabled */
7065ca02815Sjsg 	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
7075ca02815Sjsg 		return 0;
7085ca02815Sjsg 
7091bb76ff1Sjsg 	/* Workaround for ALDEBARAN, skip GPRs init in GPU reset.
7101bb76ff1Sjsg 	   Will remove it once GPRs init algorithm works for all CU settings. */
7111bb76ff1Sjsg 	if (amdgpu_in_reset(adev))
7121bb76ff1Sjsg 		return 0;
7131bb76ff1Sjsg 
7145ca02815Sjsg 	gfx_v9_4_2_do_sgprs_init(adev);
7155ca02815Sjsg 
7165ca02815Sjsg 	gfx_v9_4_2_do_vgprs_init(adev);
7175ca02815Sjsg 
7185ca02815Sjsg 	return 0;
7195ca02815Sjsg }
7205ca02815Sjsg 
7215ca02815Sjsg static void gfx_v9_4_2_query_sq_timeout_status(struct amdgpu_device *adev);
7225ca02815Sjsg static void gfx_v9_4_2_reset_sq_timeout_status(struct amdgpu_device *adev);
7235ca02815Sjsg 
gfx_v9_4_2_init_golden_registers(struct amdgpu_device * adev,uint32_t die_id)7245ca02815Sjsg void gfx_v9_4_2_init_golden_registers(struct amdgpu_device *adev,
7255ca02815Sjsg 				      uint32_t die_id)
7265ca02815Sjsg {
7275ca02815Sjsg 	soc15_program_register_sequence(adev,
7285ca02815Sjsg 					golden_settings_gc_9_4_2_alde,
7295ca02815Sjsg 					ARRAY_SIZE(golden_settings_gc_9_4_2_alde));
7305ca02815Sjsg 
7315ca02815Sjsg 	/* apply golden settings per die */
7325ca02815Sjsg 	switch (die_id) {
7335ca02815Sjsg 	case 0:
7345ca02815Sjsg 		soc15_program_register_sequence(adev,
7355ca02815Sjsg 				golden_settings_gc_9_4_2_alde_die_0,
7365ca02815Sjsg 				ARRAY_SIZE(golden_settings_gc_9_4_2_alde_die_0));
7375ca02815Sjsg 		break;
7385ca02815Sjsg 	case 1:
7395ca02815Sjsg 		soc15_program_register_sequence(adev,
7405ca02815Sjsg 				golden_settings_gc_9_4_2_alde_die_1,
7415ca02815Sjsg 				ARRAY_SIZE(golden_settings_gc_9_4_2_alde_die_1));
7425ca02815Sjsg 		break;
7435ca02815Sjsg 	default:
7445ca02815Sjsg 		dev_warn(adev->dev,
7455ca02815Sjsg 			 "invalid die id %d, ignore channel fabricid remap settings\n",
7465ca02815Sjsg 			 die_id);
7475ca02815Sjsg 		break;
7485ca02815Sjsg 	}
7495ca02815Sjsg 
7505ca02815Sjsg 	return;
7515ca02815Sjsg }
7525ca02815Sjsg 
gfx_v9_4_2_debug_trap_config_init(struct amdgpu_device * adev,uint32_t first_vmid,uint32_t last_vmid)7535ca02815Sjsg void gfx_v9_4_2_debug_trap_config_init(struct amdgpu_device *adev,
7545ca02815Sjsg 				uint32_t first_vmid,
7555ca02815Sjsg 				uint32_t last_vmid)
7565ca02815Sjsg {
7575ca02815Sjsg 	uint32_t data;
7585ca02815Sjsg 	int i;
7595ca02815Sjsg 
7605ca02815Sjsg 	mutex_lock(&adev->srbm_mutex);
7615ca02815Sjsg 
7625ca02815Sjsg 	for (i = first_vmid; i < last_vmid; i++) {
7635ca02815Sjsg 		data = 0;
764*f005ef32Sjsg 		soc15_grbm_select(adev, 0, 0, 0, i, 0);
7655ca02815Sjsg 		data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, TRAP_EN, 1);
7665ca02815Sjsg 		data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_EN, 0);
7675ca02815Sjsg 		data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_REPLACE,
7685ca02815Sjsg 					0);
7695ca02815Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, regSPI_GDBG_PER_VMID_CNTL), data);
7705ca02815Sjsg 	}
7715ca02815Sjsg 
772*f005ef32Sjsg 	soc15_grbm_select(adev, 0, 0, 0, 0, 0);
7735ca02815Sjsg 	mutex_unlock(&adev->srbm_mutex);
774*f005ef32Sjsg 
775*f005ef32Sjsg 	WREG32(SOC15_REG_OFFSET(GC, 0, regSPI_GDBG_TRAP_DATA0), 0);
776*f005ef32Sjsg 	WREG32(SOC15_REG_OFFSET(GC, 0, regSPI_GDBG_TRAP_DATA1), 0);
7775ca02815Sjsg }
7785ca02815Sjsg 
gfx_v9_4_2_set_power_brake_sequence(struct amdgpu_device * adev)7795ca02815Sjsg void gfx_v9_4_2_set_power_brake_sequence(struct amdgpu_device *adev)
7805ca02815Sjsg {
7815ca02815Sjsg 	u32 tmp;
7825ca02815Sjsg 
783*f005ef32Sjsg 	gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
7845ca02815Sjsg 
7855ca02815Sjsg 	tmp = 0;
7865ca02815Sjsg 	tmp = REG_SET_FIELD(tmp, GC_THROTTLE_CTRL, PATTERN_MODE, 1);
7875ca02815Sjsg 	WREG32_SOC15(GC, 0, regGC_THROTTLE_CTRL, tmp);
7885ca02815Sjsg 
7895ca02815Sjsg 	tmp = 0;
7905ca02815Sjsg 	tmp = REG_SET_FIELD(tmp, GC_THROTTLE_CTRL1, PWRBRK_STALL_EN, 1);
7915ca02815Sjsg 	WREG32_SOC15(GC, 0, regGC_THROTTLE_CTRL1, tmp);
7925ca02815Sjsg 
7935ca02815Sjsg 	WREG32_SOC15(GC, 0, regGC_CAC_IND_INDEX, ixPWRBRK_STALL_PATTERN_CTRL);
7945ca02815Sjsg 	tmp = 0;
7955ca02815Sjsg 	tmp = REG_SET_FIELD(tmp, PWRBRK_STALL_PATTERN_CTRL, PWRBRK_END_STEP, 0x12);
7965ca02815Sjsg 	WREG32_SOC15(GC, 0, regGC_CAC_IND_DATA, tmp);
7975ca02815Sjsg }
7985ca02815Sjsg 
7995ca02815Sjsg static const struct soc15_reg_entry gfx_v9_4_2_edc_counter_regs[] = {
8005ca02815Sjsg 	/* CPF */
8015ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCPF_EDC_ROQ_CNT), 0, 1, 1 },
8025ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCPF_EDC_TAG_CNT), 0, 1, 1 },
8035ca02815Sjsg 	/* CPC */
8045ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCPC_EDC_SCRATCH_CNT), 0, 1, 1 },
8055ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regCPC_EDC_UCODE_CNT), 0, 1, 1 },
8065ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regDC_EDC_STATE_CNT), 0, 1, 1 },
8075ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regDC_EDC_CSINVOC_CNT), 0, 1, 1 },
8085ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regDC_EDC_RESTORE_CNT), 0, 1, 1 },
8095ca02815Sjsg 	/* GDS */
8105ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regGDS_EDC_CNT), 0, 1, 1 },
8115ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regGDS_EDC_GRBM_CNT), 0, 1, 1 },
8125ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 1, 1 },
8135ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT), 0, 1, 1 },
8145ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT), 0, 1, 1 },
8155ca02815Sjsg 	/* RLC */
8165ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT), 0, 1, 1 },
8175ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2), 0, 1, 1 },
8185ca02815Sjsg 	/* SPI */
8195ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT), 0, 8, 1 },
8205ca02815Sjsg 	/* SQC */
8215ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT), 0, 8, 7 },
8225ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2), 0, 8, 7 },
8235ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3), 0, 8, 7 },
8245ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3), 0, 8, 7 },
8255ca02815Sjsg 	/* SQ */
8265ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT), 0, 8, 14 },
8275ca02815Sjsg 	/* TCP */
8285ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW), 0, 8, 14 },
8295ca02815Sjsg 	/* TCI */
8305ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regTCI_EDC_CNT), 0, 1, 69 },
8315ca02815Sjsg 	/* TCC */
8325ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT), 0, 1, 16 },
8335ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2), 0, 1, 16 },
8345ca02815Sjsg 	/* TCA */
8355ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regTCA_EDC_CNT), 0, 1, 2 },
8365ca02815Sjsg 	/* TCX */
8375ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT), 0, 1, 2 },
8385ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2), 0, 1, 2 },
8395ca02815Sjsg 	/* TD */
8405ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT), 0, 8, 14 },
8415ca02815Sjsg 	/* TA */
8425ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT), 0, 8, 14 },
8435ca02815Sjsg 	/* GCEA */
8445ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT), 0, 1, 16 },
8455ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2), 0, 1, 16 },
8465ca02815Sjsg 	{ SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 1, 16 },
8475ca02815Sjsg };
8485ca02815Sjsg 
gfx_v9_4_2_select_se_sh(struct amdgpu_device * adev,u32 se_num,u32 sh_num,u32 instance)8495ca02815Sjsg static void gfx_v9_4_2_select_se_sh(struct amdgpu_device *adev, u32 se_num,
8505ca02815Sjsg 				  u32 sh_num, u32 instance)
8515ca02815Sjsg {
8525ca02815Sjsg 	u32 data;
8535ca02815Sjsg 
8545ca02815Sjsg 	if (instance == 0xffffffff)
8555ca02815Sjsg 		data = REG_SET_FIELD(0, GRBM_GFX_INDEX,
8565ca02815Sjsg 				     INSTANCE_BROADCAST_WRITES, 1);
8575ca02815Sjsg 	else
8585ca02815Sjsg 		data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_INDEX,
8595ca02815Sjsg 				     instance);
8605ca02815Sjsg 
8615ca02815Sjsg 	if (se_num == 0xffffffff)
8625ca02815Sjsg 		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_BROADCAST_WRITES,
8635ca02815Sjsg 				     1);
8645ca02815Sjsg 	else
8655ca02815Sjsg 		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num);
8665ca02815Sjsg 
8675ca02815Sjsg 	if (sh_num == 0xffffffff)
8685ca02815Sjsg 		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_BROADCAST_WRITES,
8695ca02815Sjsg 				     1);
8705ca02815Sjsg 	else
8715ca02815Sjsg 		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num);
8725ca02815Sjsg 
8735ca02815Sjsg 	WREG32_SOC15_RLC_SHADOW_EX(reg, GC, 0, regGRBM_GFX_INDEX, data);
8745ca02815Sjsg }
8755ca02815Sjsg 
8765ca02815Sjsg static const struct soc15_ras_field_entry gfx_v9_4_2_ras_fields[] = {
8775ca02815Sjsg 	/* CPF */
8785ca02815Sjsg 	{ "CPF_ROQ_ME2", SOC15_REG_ENTRY(GC, 0, regCPF_EDC_ROQ_CNT),
8795ca02815Sjsg 	  SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, SEC_COUNT_ME2),
8805ca02815Sjsg 	  SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, DED_COUNT_ME2) },
8815ca02815Sjsg 	{ "CPF_ROQ_ME1", SOC15_REG_ENTRY(GC, 0, regCPF_EDC_ROQ_CNT),
8825ca02815Sjsg 	  SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, SEC_COUNT_ME1),
8835ca02815Sjsg 	  SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, DED_COUNT_ME1) },
8845ca02815Sjsg 	{ "CPF_TCIU_TAG", SOC15_REG_ENTRY(GC, 0, regCPF_EDC_TAG_CNT),
8855ca02815Sjsg 	  SOC15_REG_FIELD(CPF_EDC_TAG_CNT, SEC_COUNT),
8865ca02815Sjsg 	  SOC15_REG_FIELD(CPF_EDC_TAG_CNT, DED_COUNT) },
8875ca02815Sjsg 
8885ca02815Sjsg 	/* CPC */
8895ca02815Sjsg 	{ "CPC_SCRATCH", SOC15_REG_ENTRY(GC, 0, regCPC_EDC_SCRATCH_CNT),
8905ca02815Sjsg 	  SOC15_REG_FIELD(CPC_EDC_SCRATCH_CNT, SEC_COUNT),
8915ca02815Sjsg 	  SOC15_REG_FIELD(CPC_EDC_SCRATCH_CNT, DED_COUNT) },
8925ca02815Sjsg 	{ "CPC_UCODE", SOC15_REG_ENTRY(GC, 0, regCPC_EDC_UCODE_CNT),
8935ca02815Sjsg 	  SOC15_REG_FIELD(CPC_EDC_UCODE_CNT, SEC_COUNT),
8945ca02815Sjsg 	  SOC15_REG_FIELD(CPC_EDC_UCODE_CNT, DED_COUNT) },
8955ca02815Sjsg 	{ "CPC_DC_STATE_RAM_ME1", SOC15_REG_ENTRY(GC, 0, regDC_EDC_STATE_CNT),
8965ca02815Sjsg 	  SOC15_REG_FIELD(DC_EDC_STATE_CNT, SEC_COUNT_ME1),
8975ca02815Sjsg 	  SOC15_REG_FIELD(DC_EDC_STATE_CNT, DED_COUNT_ME1) },
8985ca02815Sjsg 	{ "CPC_DC_CSINVOC_RAM_ME1",
8995ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regDC_EDC_CSINVOC_CNT),
9005ca02815Sjsg 	  SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, SEC_COUNT_ME1),
9015ca02815Sjsg 	  SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, DED_COUNT_ME1) },
9025ca02815Sjsg 	{ "CPC_DC_RESTORE_RAM_ME1",
9035ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regDC_EDC_RESTORE_CNT),
9045ca02815Sjsg 	  SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, SEC_COUNT_ME1),
9055ca02815Sjsg 	  SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, DED_COUNT_ME1) },
9065ca02815Sjsg 	{ "CPC_DC_CSINVOC_RAM1_ME1",
9075ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regDC_EDC_CSINVOC_CNT),
9085ca02815Sjsg 	  SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, SEC_COUNT1_ME1),
9095ca02815Sjsg 	  SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, DED_COUNT1_ME1) },
9105ca02815Sjsg 	{ "CPC_DC_RESTORE_RAM1_ME1",
9115ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regDC_EDC_RESTORE_CNT),
9125ca02815Sjsg 	  SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, SEC_COUNT1_ME1),
9135ca02815Sjsg 	  SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, DED_COUNT1_ME1) },
9145ca02815Sjsg 
9155ca02815Sjsg 	/* GDS */
9165ca02815Sjsg 	{ "GDS_GRBM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_GRBM_CNT),
9175ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_GRBM_CNT, SEC),
9185ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_GRBM_CNT, DED) },
9195ca02815Sjsg 	{ "GDS_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_CNT),
9205ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_CNT, GDS_MEM_SEC),
9215ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_CNT, GDS_MEM_DED) },
9225ca02815Sjsg 	{ "GDS_PHY_CMD_RAM_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT),
9235ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_CMD_RAM_MEM_SEC),
9245ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_CMD_RAM_MEM_DED) },
9255ca02815Sjsg 	{ "GDS_PHY_DATA_RAM_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT),
9265ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_DATA_RAM_MEM_SEC),
9275ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_DATA_RAM_MEM_DED) },
9285ca02815Sjsg 	{ "GDS_ME0_CS_PIPE_MEM", SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PHY_CNT),
9295ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, ME0_CS_PIPE_MEM_SEC),
9305ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, ME0_CS_PIPE_MEM_DED) },
9315ca02815Sjsg 	{ "GDS_ME1_PIPE0_PIPE_MEM",
9325ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
9335ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE0_PIPE_MEM_SEC),
9345ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE0_PIPE_MEM_DED) },
9355ca02815Sjsg 	{ "GDS_ME1_PIPE1_PIPE_MEM",
9365ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
9375ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE1_PIPE_MEM_SEC),
9385ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE1_PIPE_MEM_DED) },
9395ca02815Sjsg 	{ "GDS_ME1_PIPE2_PIPE_MEM",
9405ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
9415ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE2_PIPE_MEM_SEC),
9425ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE2_PIPE_MEM_DED) },
9435ca02815Sjsg 	{ "GDS_ME1_PIPE3_PIPE_MEM",
9445ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_PIPE_CNT),
9455ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE3_PIPE_MEM_SEC),
9465ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE3_PIPE_MEM_DED) },
9475ca02815Sjsg 	{ "GDS_ME0_GFXHP3D_PIX_DED",
9485ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
9495ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_GFXHP3D_PIX_DED) },
9505ca02815Sjsg 	{ "GDS_ME0_GFXHP3D_VTX_DED",
9515ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
9525ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_GFXHP3D_VTX_DED) },
9535ca02815Sjsg 	{ "GDS_ME0_CS_DED",
9545ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
9555ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_CS_DED) },
9565ca02815Sjsg 	{ "GDS_ME0_GFXHP3D_GS_DED",
9575ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
9585ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME0_GFXHP3D_GS_DED) },
9595ca02815Sjsg 	{ "GDS_ME1_PIPE0_DED",
9605ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
9615ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE0_DED) },
9625ca02815Sjsg 	{ "GDS_ME1_PIPE1_DED",
9635ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
9645ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE1_DED) },
9655ca02815Sjsg 	{ "GDS_ME1_PIPE2_DED",
9665ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
9675ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE2_DED) },
9685ca02815Sjsg 	{ "GDS_ME1_PIPE3_DED",
9695ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
9705ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME1_PIPE3_DED) },
9715ca02815Sjsg 	{ "GDS_ME2_PIPE0_DED",
9725ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
9735ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE0_DED) },
9745ca02815Sjsg 	{ "GDS_ME2_PIPE1_DED",
9755ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
9765ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE1_DED) },
9775ca02815Sjsg 	{ "GDS_ME2_PIPE2_DED",
9785ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
9795ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE2_DED) },
9805ca02815Sjsg 	{ "GDS_ME2_PIPE3_DED",
9815ca02815Sjsg 	  SOC15_REG_ENTRY(GC, 0, regGDS_EDC_OA_DED), 0, 0,
9825ca02815Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_DED, ME2_PIPE3_DED) },
9835ca02815Sjsg 
9845ca02815Sjsg 	/* RLC */
9855ca02815Sjsg 	{ "RLCG_INSTR_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
9865ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_INSTR_RAM_SEC_COUNT),
9875ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_INSTR_RAM_DED_COUNT) },
9885ca02815Sjsg 	{ "RLCG_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
9895ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_SCRATCH_RAM_SEC_COUNT),
9905ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCG_SCRATCH_RAM_DED_COUNT) },
9915ca02815Sjsg 	{ "RLCV_INSTR_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
9925ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_INSTR_RAM_SEC_COUNT),
9935ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_INSTR_RAM_DED_COUNT) },
9945ca02815Sjsg 	{ "RLCV_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
9955ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_SCRATCH_RAM_SEC_COUNT),
9965ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLCV_SCRATCH_RAM_DED_COUNT) },
9975ca02815Sjsg 	{ "RLC_TCTAG_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
9985ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_TCTAG_RAM_SEC_COUNT),
9995ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_TCTAG_RAM_DED_COUNT) },
10005ca02815Sjsg 	{ "RLC_SPM_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
10015ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SPM_SCRATCH_RAM_SEC_COUNT),
10025ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SPM_SCRATCH_RAM_DED_COUNT) },
10035ca02815Sjsg 	{ "RLC_SRM_DATA_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
10045ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_DATA_RAM_SEC_COUNT),
10055ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_DATA_RAM_DED_COUNT) },
10065ca02815Sjsg 	{ "RLC_SRM_ADDR_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT),
10075ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_ADDR_RAM_SEC_COUNT),
10085ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT, RLC_SRM_ADDR_RAM_DED_COUNT) },
10095ca02815Sjsg 	{ "RLC_SPM_SE0_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
10105ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE0_SCRATCH_RAM_SEC_COUNT),
10115ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE0_SCRATCH_RAM_DED_COUNT) },
10125ca02815Sjsg 	{ "RLC_SPM_SE1_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
10135ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE1_SCRATCH_RAM_SEC_COUNT),
10145ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE1_SCRATCH_RAM_DED_COUNT) },
10155ca02815Sjsg 	{ "RLC_SPM_SE2_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
10165ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE2_SCRATCH_RAM_SEC_COUNT),
10175ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE2_SCRATCH_RAM_DED_COUNT) },
10185ca02815Sjsg 	{ "RLC_SPM_SE3_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
10195ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE3_SCRATCH_RAM_SEC_COUNT),
10205ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE3_SCRATCH_RAM_DED_COUNT) },
10215ca02815Sjsg 	{ "RLC_SPM_SE4_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
10225ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE4_SCRATCH_RAM_SEC_COUNT),
10235ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE4_SCRATCH_RAM_DED_COUNT) },
10245ca02815Sjsg 	{ "RLC_SPM_SE5_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
10255ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE5_SCRATCH_RAM_SEC_COUNT),
10265ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE5_SCRATCH_RAM_DED_COUNT) },
10275ca02815Sjsg 	{ "RLC_SPM_SE6_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
10285ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE6_SCRATCH_RAM_SEC_COUNT),
10295ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE6_SCRATCH_RAM_DED_COUNT) },
10305ca02815Sjsg 	{ "RLC_SPM_SE7_SCRATCH_RAM", SOC15_REG_ENTRY(GC, 0, regRLC_EDC_CNT2),
10315ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE7_SCRATCH_RAM_SEC_COUNT),
10325ca02815Sjsg 	  SOC15_REG_FIELD(RLC_EDC_CNT2, RLC_SPM_SE7_SCRATCH_RAM_DED_COUNT) },
10335ca02815Sjsg 
10345ca02815Sjsg 	/* SPI */
10355ca02815Sjsg 	{ "SPI_SR_MEM", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
10365ca02815Sjsg 	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_SR_MEM_SEC_COUNT),
10375ca02815Sjsg 	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_SR_MEM_DED_COUNT) },
10385ca02815Sjsg 	{ "SPI_GDS_EXPREQ", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
10395ca02815Sjsg 	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_GDS_EXPREQ_SEC_COUNT),
10405ca02815Sjsg 	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_GDS_EXPREQ_DED_COUNT) },
10415ca02815Sjsg 	{ "SPI_WB_GRANT_30", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
10425ca02815Sjsg 	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_WB_GRANT_30_SEC_COUNT),
10435ca02815Sjsg 	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_WB_GRANT_30_DED_COUNT) },
10445ca02815Sjsg 	{ "SPI_LIFE_CNT", SOC15_REG_ENTRY(GC, 0, regSPI_EDC_CNT),
10455ca02815Sjsg 	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_LIFE_CNT_SEC_COUNT),
10465ca02815Sjsg 	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_LIFE_CNT_DED_COUNT) },
10475ca02815Sjsg 
10485ca02815Sjsg 	/* SQC - regSQC_EDC_CNT */
10495ca02815Sjsg 	{ "SQC_DATA_CU0_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
10505ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_WRITE_DATA_BUF_SEC_COUNT),
10515ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_WRITE_DATA_BUF_DED_COUNT) },
10525ca02815Sjsg 	{ "SQC_DATA_CU0_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
10535ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_UTCL1_LFIFO_SEC_COUNT),
10545ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_UTCL1_LFIFO_DED_COUNT) },
10555ca02815Sjsg 	{ "SQC_DATA_CU1_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
10565ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_WRITE_DATA_BUF_SEC_COUNT),
10575ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_WRITE_DATA_BUF_DED_COUNT) },
10585ca02815Sjsg 	{ "SQC_DATA_CU1_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
10595ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_UTCL1_LFIFO_SEC_COUNT),
10605ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_UTCL1_LFIFO_DED_COUNT) },
10615ca02815Sjsg 	{ "SQC_DATA_CU2_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
10625ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_WRITE_DATA_BUF_SEC_COUNT),
10635ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_WRITE_DATA_BUF_DED_COUNT) },
10645ca02815Sjsg 	{ "SQC_DATA_CU2_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
10655ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_UTCL1_LFIFO_SEC_COUNT),
10665ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_UTCL1_LFIFO_DED_COUNT) },
10675ca02815Sjsg 	{ "SQC_DATA_CU3_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
10685ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_WRITE_DATA_BUF_SEC_COUNT),
10695ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_WRITE_DATA_BUF_DED_COUNT) },
10705ca02815Sjsg 	{ "SQC_DATA_CU3_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT),
10715ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_UTCL1_LFIFO_SEC_COUNT),
10725ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU3_UTCL1_LFIFO_DED_COUNT) },
10735ca02815Sjsg 
10745ca02815Sjsg 	/* SQC - regSQC_EDC_CNT2 */
10755ca02815Sjsg 	{ "SQC_INST_BANKA_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
10765ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_TAG_RAM_SEC_COUNT),
10775ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_TAG_RAM_DED_COUNT) },
10785ca02815Sjsg 	{ "SQC_INST_BANKA_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
10795ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_BANK_RAM_SEC_COUNT),
10805ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_BANK_RAM_DED_COUNT) },
10815ca02815Sjsg 	{ "SQC_DATA_BANKA_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
10825ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_TAG_RAM_SEC_COUNT),
10835ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_TAG_RAM_DED_COUNT) },
10845ca02815Sjsg 	{ "SQC_DATA_BANKA_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
10855ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_BANK_RAM_SEC_COUNT),
10865ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_BANK_RAM_DED_COUNT) },
10875ca02815Sjsg 	{ "SQC_INST_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
10885ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_UTCL1_LFIFO_SEC_COUNT),
10895ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_UTCL1_LFIFO_DED_COUNT) },
10905ca02815Sjsg 	{ "SQC_DATA_BANKA_DIRTY_BIT_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT2),
10915ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_DIRTY_BIT_RAM_SEC_COUNT),
10925ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_DIRTY_BIT_RAM_DED_COUNT) },
10935ca02815Sjsg 
10945ca02815Sjsg 	/* SQC - regSQC_EDC_CNT3 */
10955ca02815Sjsg 	{ "SQC_INST_BANKB_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
10965ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_TAG_RAM_SEC_COUNT),
10975ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_TAG_RAM_DED_COUNT) },
10985ca02815Sjsg 	{ "SQC_INST_BANKB_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
10995ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_BANK_RAM_SEC_COUNT),
11005ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_BANK_RAM_DED_COUNT) },
11015ca02815Sjsg 	{ "SQC_DATA_BANKB_TAG_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
11025ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_TAG_RAM_SEC_COUNT),
11035ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_TAG_RAM_DED_COUNT) },
11045ca02815Sjsg 	{ "SQC_DATA_BANKB_BANK_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
11055ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_BANK_RAM_SEC_COUNT),
11065ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_BANK_RAM_DED_COUNT) },
11075ca02815Sjsg 	{ "SQC_DATA_BANKB_DIRTY_BIT_RAM", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_CNT3),
11085ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_DIRTY_BIT_RAM_SEC_COUNT),
11095ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_DIRTY_BIT_RAM_DED_COUNT) },
11105ca02815Sjsg 
11115ca02815Sjsg 	/* SQC - regSQC_EDC_PARITY_CNT3 */
11125ca02815Sjsg 	{ "SQC_INST_BANKA_UTCL1_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
11135ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_UTCL1_MISS_FIFO_SEC_COUNT),
11145ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_UTCL1_MISS_FIFO_DED_COUNT) },
11155ca02815Sjsg 	{ "SQC_INST_BANKA_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
11165ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_MISS_FIFO_SEC_COUNT),
11175ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKA_MISS_FIFO_DED_COUNT) },
11185ca02815Sjsg 	{ "SQC_DATA_BANKA_HIT_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
11195ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_HIT_FIFO_SEC_COUNT),
11205ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_HIT_FIFO_DED_COUNT) },
11215ca02815Sjsg 	{ "SQC_DATA_BANKA_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
11225ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_MISS_FIFO_SEC_COUNT),
11235ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKA_MISS_FIFO_DED_COUNT) },
11245ca02815Sjsg 	{ "SQC_INST_BANKB_UTCL1_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
11255ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_UTCL1_MISS_FIFO_SEC_COUNT),
11265ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_UTCL1_MISS_FIFO_DED_COUNT) },
11275ca02815Sjsg 	{ "SQC_INST_BANKB_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
11285ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_MISS_FIFO_SEC_COUNT),
11295ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, INST_BANKB_MISS_FIFO_DED_COUNT) },
11305ca02815Sjsg 	{ "SQC_DATA_BANKB_HIT_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
11315ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_HIT_FIFO_SEC_COUNT),
11325ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_HIT_FIFO_DED_COUNT) },
11335ca02815Sjsg 	{ "SQC_DATA_BANKB_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, regSQC_EDC_PARITY_CNT3),
11345ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_MISS_FIFO_SEC_COUNT),
11355ca02815Sjsg 	  SOC15_REG_FIELD(SQC_EDC_PARITY_CNT3, DATA_BANKB_MISS_FIFO_DED_COUNT) },
11365ca02815Sjsg 
11375ca02815Sjsg 	/* SQ */
11385ca02815Sjsg 	{ "SQ_LDS_D", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
11395ca02815Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_D_SEC_COUNT),
11405ca02815Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_D_DED_COUNT) },
11415ca02815Sjsg 	{ "SQ_LDS_I", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
11425ca02815Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_I_SEC_COUNT),
11435ca02815Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_I_DED_COUNT) },
11445ca02815Sjsg 	{ "SQ_SGPR", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
11455ca02815Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, SGPR_SEC_COUNT),
11465ca02815Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, SGPR_DED_COUNT) },
11475ca02815Sjsg 	{ "SQ_VGPR0", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
11485ca02815Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR0_SEC_COUNT),
11495ca02815Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR0_DED_COUNT) },
11505ca02815Sjsg 	{ "SQ_VGPR1", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
11515ca02815Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR1_SEC_COUNT),
11525ca02815Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR1_DED_COUNT) },
11535ca02815Sjsg 	{ "SQ_VGPR2", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
11545ca02815Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR2_SEC_COUNT),
11555ca02815Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR2_DED_COUNT) },
11565ca02815Sjsg 	{ "SQ_VGPR3", SOC15_REG_ENTRY(GC, 0, regSQ_EDC_CNT),
11575ca02815Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR3_SEC_COUNT),
11585ca02815Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR3_DED_COUNT) },
11595ca02815Sjsg 
11605ca02815Sjsg 	/* TCP */
11615ca02815Sjsg 	{ "TCP_CACHE_RAM", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
11625ca02815Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CACHE_RAM_SEC_COUNT),
11635ca02815Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CACHE_RAM_DED_COUNT) },
11645ca02815Sjsg 	{ "TCP_LFIFO_RAM", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
11655ca02815Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, LFIFO_RAM_SEC_COUNT),
11665ca02815Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, LFIFO_RAM_DED_COUNT) },
11675ca02815Sjsg 	{ "TCP_CMD_FIFO", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
11685ca02815Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CMD_FIFO_SEC_COUNT),
11695ca02815Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CMD_FIFO_DED_COUNT) },
11705ca02815Sjsg 	{ "TCP_VM_FIFO", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
11715ca02815Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, VM_FIFO_SEC_COUNT),
11725ca02815Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, VM_FIFO_DED_COUNT) },
11735ca02815Sjsg 	{ "TCP_DB_RAM", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
11745ca02815Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, DB_RAM_SEC_COUNT),
11755ca02815Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, DB_RAM_DED_COUNT) },
11765ca02815Sjsg 	{ "TCP_UTCL1_LFIFO0", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
11775ca02815Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO0_SEC_COUNT),
11785ca02815Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO0_DED_COUNT) },
11795ca02815Sjsg 	{ "TCP_UTCL1_LFIFO1", SOC15_REG_ENTRY(GC, 0, regTCP_EDC_CNT_NEW),
11805ca02815Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO1_SEC_COUNT),
11815ca02815Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO1_DED_COUNT) },
11825ca02815Sjsg 
11835ca02815Sjsg 	/* TCI */
11845ca02815Sjsg 	{ "TCI_WRITE_RAM", SOC15_REG_ENTRY(GC, 0, regTCI_EDC_CNT),
11855ca02815Sjsg 	  SOC15_REG_FIELD(TCI_EDC_CNT, WRITE_RAM_SEC_COUNT),
11865ca02815Sjsg 	  SOC15_REG_FIELD(TCI_EDC_CNT, WRITE_RAM_DED_COUNT) },
11875ca02815Sjsg 
11885ca02815Sjsg 	/* TCC */
11895ca02815Sjsg 	{ "TCC_CACHE_DATA", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
11905ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DATA_SEC_COUNT),
11915ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DATA_DED_COUNT) },
11925ca02815Sjsg 	{ "TCC_CACHE_DIRTY", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
11935ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DIRTY_SEC_COUNT),
11945ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DIRTY_DED_COUNT) },
11955ca02815Sjsg 	{ "TCC_HIGH_RATE_TAG", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
11965ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, HIGH_RATE_TAG_SEC_COUNT),
11975ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, HIGH_RATE_TAG_DED_COUNT) },
11985ca02815Sjsg 	{ "TCC_LOW_RATE_TAG", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
11995ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, LOW_RATE_TAG_SEC_COUNT),
12005ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, LOW_RATE_TAG_DED_COUNT) },
12015ca02815Sjsg 	{ "TCC_SRC_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
12025ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, SRC_FIFO_SEC_COUNT),
12035ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, SRC_FIFO_DED_COUNT) },
12045ca02815Sjsg 	{ "TCC_LATENCY_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
12055ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_SEC_COUNT),
12065ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_DED_COUNT) },
12075ca02815Sjsg 	{ "TCC_LATENCY_FIFO_NEXT_RAM", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT),
12085ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_NEXT_RAM_SEC_COUNT),
12095ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_NEXT_RAM_DED_COUNT) },
12105ca02815Sjsg 	{ "TCC_CACHE_TAG_PROBE_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
12115ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, CACHE_TAG_PROBE_FIFO_SEC_COUNT),
12125ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, CACHE_TAG_PROBE_FIFO_DED_COUNT) },
12135ca02815Sjsg 	{ "TCC_UC_ATOMIC_FIFO", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
12145ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, UC_ATOMIC_FIFO_SEC_COUNT),
12155ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, UC_ATOMIC_FIFO_DED_COUNT) },
12165ca02815Sjsg 	{ "TCC_WRITE_CACHE_READ", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
12175ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_CACHE_READ_SEC_COUNT),
12185ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_CACHE_READ_DED_COUNT) },
12195ca02815Sjsg 	{ "TCC_RETURN_CONTROL", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
12205ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_CONTROL_SEC_COUNT),
12215ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_CONTROL_DED_COUNT) },
12225ca02815Sjsg 	{ "TCC_IN_USE_TRANSFER", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
12235ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_TRANSFER_SEC_COUNT),
12245ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_TRANSFER_DED_COUNT) },
12255ca02815Sjsg 	{ "TCC_IN_USE_DEC", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
12265ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_DEC_SEC_COUNT),
12275ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, IN_USE_DEC_DED_COUNT) },
12285ca02815Sjsg 	{ "TCC_WRITE_RETURN", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
12295ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_RETURN_SEC_COUNT),
12305ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_RETURN_DED_COUNT) },
12315ca02815Sjsg 	{ "TCC_RETURN_DATA", SOC15_REG_ENTRY(GC, 0, regTCC_EDC_CNT2),
12325ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_DATA_SEC_COUNT),
12335ca02815Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, RETURN_DATA_DED_COUNT) },
12345ca02815Sjsg 
12355ca02815Sjsg 	/* TCA */
12365ca02815Sjsg 	{ "TCA_HOLE_FIFO", SOC15_REG_ENTRY(GC, 0, regTCA_EDC_CNT),
12375ca02815Sjsg 	  SOC15_REG_FIELD(TCA_EDC_CNT, HOLE_FIFO_SEC_COUNT),
12385ca02815Sjsg 	  SOC15_REG_FIELD(TCA_EDC_CNT, HOLE_FIFO_DED_COUNT) },
12395ca02815Sjsg 	{ "TCA_REQ_FIFO", SOC15_REG_ENTRY(GC, 0, regTCA_EDC_CNT),
12405ca02815Sjsg 	  SOC15_REG_FIELD(TCA_EDC_CNT, REQ_FIFO_SEC_COUNT),
12415ca02815Sjsg 	  SOC15_REG_FIELD(TCA_EDC_CNT, REQ_FIFO_DED_COUNT) },
12425ca02815Sjsg 
12435ca02815Sjsg 	/* TCX */
12445ca02815Sjsg 	{ "TCX_GROUP0", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
12455ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP0_SEC_COUNT),
12465ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP0_DED_COUNT) },
12475ca02815Sjsg 	{ "TCX_GROUP1", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
12485ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP1_SEC_COUNT),
12495ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP1_DED_COUNT) },
12505ca02815Sjsg 	{ "TCX_GROUP2", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
12515ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP2_SEC_COUNT),
12525ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP2_DED_COUNT) },
12535ca02815Sjsg 	{ "TCX_GROUP3", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
12545ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP3_SEC_COUNT),
12555ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP3_DED_COUNT) },
12565ca02815Sjsg 	{ "TCX_GROUP4", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
12575ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP4_SEC_COUNT),
12585ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP4_DED_COUNT) },
12595ca02815Sjsg 	{ "TCX_GROUP5", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
12605ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP5_SED_COUNT), 0, 0 },
12615ca02815Sjsg 	{ "TCX_GROUP6", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
12625ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP6_SED_COUNT), 0, 0 },
12635ca02815Sjsg 	{ "TCX_GROUP7", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
12645ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP7_SED_COUNT), 0, 0 },
12655ca02815Sjsg 	{ "TCX_GROUP8", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
12665ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP8_SED_COUNT), 0, 0 },
12675ca02815Sjsg 	{ "TCX_GROUP9", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
12685ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP9_SED_COUNT), 0, 0 },
12695ca02815Sjsg 	{ "TCX_GROUP10", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT),
12705ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT, GROUP10_SED_COUNT), 0, 0 },
12715ca02815Sjsg 	{ "TCX_GROUP11", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
12725ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP11_SED_COUNT), 0, 0 },
12735ca02815Sjsg 	{ "TCX_GROUP12", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
12745ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP12_SED_COUNT), 0, 0 },
12755ca02815Sjsg 	{ "TCX_GROUP13", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
12765ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP13_SED_COUNT), 0, 0 },
12775ca02815Sjsg 	{ "TCX_GROUP14", SOC15_REG_ENTRY(GC, 0, regTCX_EDC_CNT2),
12785ca02815Sjsg 	  SOC15_REG_FIELD(TCX_EDC_CNT2, GROUP14_SED_COUNT), 0, 0 },
12795ca02815Sjsg 
12805ca02815Sjsg 	/* TD */
12815ca02815Sjsg 	{ "TD_SS_FIFO_LO", SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT),
12825ca02815Sjsg 	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_LO_SEC_COUNT),
12835ca02815Sjsg 	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_LO_DED_COUNT) },
12845ca02815Sjsg 	{ "TD_SS_FIFO_HI", SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT),
12855ca02815Sjsg 	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_HI_SEC_COUNT),
12865ca02815Sjsg 	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_HI_DED_COUNT) },
12875ca02815Sjsg 	{ "TD_CS_FIFO", SOC15_REG_ENTRY(GC, 0, regTD_EDC_CNT),
12885ca02815Sjsg 	  SOC15_REG_FIELD(TD_EDC_CNT, CS_FIFO_SEC_COUNT),
12895ca02815Sjsg 	  SOC15_REG_FIELD(TD_EDC_CNT, CS_FIFO_DED_COUNT) },
12905ca02815Sjsg 
12915ca02815Sjsg 	/* TA */
12925ca02815Sjsg 	{ "TA_FS_DFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
12935ca02815Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_DFIFO_SEC_COUNT),
12945ca02815Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_DFIFO_DED_COUNT) },
12955ca02815Sjsg 	{ "TA_FS_AFIFO_LO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
12965ca02815Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_LO_SEC_COUNT),
12975ca02815Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_LO_DED_COUNT) },
12985ca02815Sjsg 	{ "TA_FL_LFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
12995ca02815Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FL_LFIFO_SEC_COUNT),
13005ca02815Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FL_LFIFO_DED_COUNT) },
13015ca02815Sjsg 	{ "TA_FX_LFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
13025ca02815Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FX_LFIFO_SEC_COUNT),
13035ca02815Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FX_LFIFO_DED_COUNT) },
13045ca02815Sjsg 	{ "TA_FS_CFIFO", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
13055ca02815Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_CFIFO_SEC_COUNT),
13065ca02815Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_CFIFO_DED_COUNT) },
13075ca02815Sjsg 	{ "TA_FS_AFIFO_HI", SOC15_REG_ENTRY(GC, 0, regTA_EDC_CNT),
13085ca02815Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_HI_SEC_COUNT),
13095ca02815Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_HI_DED_COUNT) },
13105ca02815Sjsg 
13115ca02815Sjsg 	/* EA - regGCEA_EDC_CNT */
13125ca02815Sjsg 	{ "EA_DRAMRD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
13135ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_CMDMEM_SEC_COUNT),
13145ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_CMDMEM_DED_COUNT) },
13155ca02815Sjsg 	{ "EA_DRAMWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
13165ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_CMDMEM_SEC_COUNT),
13175ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_CMDMEM_DED_COUNT) },
13185ca02815Sjsg 	{ "EA_DRAMWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
13195ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_DATAMEM_SEC_COUNT),
13205ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_DATAMEM_DED_COUNT) },
13215ca02815Sjsg 	{ "EA_RRET_TAGMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
13225ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, RRET_TAGMEM_SEC_COUNT),
13235ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, RRET_TAGMEM_DED_COUNT) },
13245ca02815Sjsg 	{ "EA_WRET_TAGMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
13255ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, WRET_TAGMEM_SEC_COUNT),
13265ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, WRET_TAGMEM_DED_COUNT) },
13275ca02815Sjsg 	{ "EA_IOWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
13285ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_DATAMEM_SEC_COUNT),
13295ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_DATAMEM_DED_COUNT) },
13305ca02815Sjsg 	{ "EA_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
13315ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_PAGEMEM_SED_COUNT), 0, 0 },
13325ca02815Sjsg 	{ "EA_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
13335ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_PAGEMEM_SED_COUNT), 0, 0 },
13345ca02815Sjsg 	{ "EA_IORD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
13355ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, IORD_CMDMEM_SED_COUNT), 0, 0 },
13365ca02815Sjsg 	{ "EA_IOWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT),
13375ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_CMDMEM_SED_COUNT), 0, 0 },
13385ca02815Sjsg 
13395ca02815Sjsg 	/* EA - regGCEA_EDC_CNT2 */
13405ca02815Sjsg 	{ "EA_GMIRD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
13415ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_CMDMEM_SEC_COUNT),
13425ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_CMDMEM_DED_COUNT) },
13435ca02815Sjsg 	{ "EA_GMIWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
13445ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_CMDMEM_SEC_COUNT),
13455ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_CMDMEM_DED_COUNT) },
13465ca02815Sjsg 	{ "EA_GMIWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
13475ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_DATAMEM_SEC_COUNT),
13485ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_DATAMEM_DED_COUNT) },
13495ca02815Sjsg 	{ "EA_GMIRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
13505ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_PAGEMEM_SED_COUNT), 0, 0 },
13515ca02815Sjsg 	{ "EA_GMIWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
13525ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_PAGEMEM_SED_COUNT), 0, 0 },
13535ca02815Sjsg 	{ "EA_MAM_D0MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
13545ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D0MEM_SED_COUNT),
13555ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D0MEM_DED_COUNT) },
13565ca02815Sjsg 	{ "EA_MAM_D1MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
13575ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D1MEM_SED_COUNT),
13585ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D1MEM_DED_COUNT) },
13595ca02815Sjsg 	{ "EA_MAM_D2MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
13605ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D2MEM_SED_COUNT),
13615ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D2MEM_DED_COUNT) },
13625ca02815Sjsg 	{ "EA_MAM_D3MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT2),
13635ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D3MEM_SED_COUNT),
13645ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D3MEM_DED_COUNT) },
13655ca02815Sjsg 
13665ca02815Sjsg 	/* EA - regGCEA_EDC_CNT3 */
13675ca02815Sjsg 	{ "EA_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
13685ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, DRAMRD_PAGEMEM_DED_COUNT) },
13695ca02815Sjsg 	{ "EA_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
13705ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, DRAMWR_PAGEMEM_DED_COUNT) },
13715ca02815Sjsg 	{ "EA_IORD_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
13725ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, IORD_CMDMEM_DED_COUNT) },
13735ca02815Sjsg 	{ "EA_IOWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
13745ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, IOWR_CMDMEM_DED_COUNT) },
13755ca02815Sjsg 	{ "EA_GMIRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
13765ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, GMIRD_PAGEMEM_DED_COUNT) },
13775ca02815Sjsg 	{ "EA_GMIWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3), 0, 0,
13785ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, GMIWR_PAGEMEM_DED_COUNT) },
13795ca02815Sjsg 	{ "EA_MAM_A0MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
13805ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A0MEM_SEC_COUNT),
13815ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A0MEM_DED_COUNT) },
13825ca02815Sjsg 	{ "EA_MAM_A1MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
13835ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A1MEM_SEC_COUNT),
13845ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A1MEM_DED_COUNT) },
13855ca02815Sjsg 	{ "EA_MAM_A2MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
13865ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A2MEM_SEC_COUNT),
13875ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A2MEM_DED_COUNT) },
13885ca02815Sjsg 	{ "EA_MAM_A3MEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
13895ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A3MEM_SEC_COUNT),
13905ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_A3MEM_DED_COUNT) },
13915ca02815Sjsg 	{ "EA_MAM_AFMEM", SOC15_REG_ENTRY(GC, 0, regGCEA_EDC_CNT3),
13925ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_AFMEM_SEC_COUNT),
13935ca02815Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT3, MAM_AFMEM_DED_COUNT) },
13945ca02815Sjsg };
13955ca02815Sjsg 
13965ca02815Sjsg static const char * const vml2_walker_mems[] = {
13975ca02815Sjsg 	"UTC_VML2_CACHE_PDE0_MEM0",
13985ca02815Sjsg 	"UTC_VML2_CACHE_PDE0_MEM1",
13995ca02815Sjsg 	"UTC_VML2_CACHE_PDE1_MEM0",
14005ca02815Sjsg 	"UTC_VML2_CACHE_PDE1_MEM1",
14015ca02815Sjsg 	"UTC_VML2_CACHE_PDE2_MEM0",
14025ca02815Sjsg 	"UTC_VML2_CACHE_PDE2_MEM1",
14035ca02815Sjsg 	"UTC_VML2_RDIF_ARADDRS",
14045ca02815Sjsg 	"UTC_VML2_RDIF_LOG_FIFO",
14055ca02815Sjsg 	"UTC_VML2_QUEUE_REQ",
14065ca02815Sjsg 	"UTC_VML2_QUEUE_RET",
14075ca02815Sjsg };
14085ca02815Sjsg 
14095ca02815Sjsg static struct gfx_v9_4_2_utc_block gfx_v9_4_2_utc_blocks[] = {
14105ca02815Sjsg 	{ VML2_MEM, 8, 2, 2,
14115ca02815Sjsg 	  { SOC15_REG_ENTRY(GC, 0, regVML2_MEM_ECC_INDEX) },
14125ca02815Sjsg 	  { SOC15_REG_ENTRY(GC, 0, regVML2_MEM_ECC_CNTL) },
14135ca02815Sjsg 	  SOC15_REG_FIELD(VML2_MEM_ECC_CNTL, SEC_COUNT),
14145ca02815Sjsg 	  SOC15_REG_FIELD(VML2_MEM_ECC_CNTL, DED_COUNT),
14155ca02815Sjsg 	  REG_SET_FIELD(0, VML2_MEM_ECC_CNTL, WRITE_COUNTERS, 1) },
14165ca02815Sjsg 	{ VML2_WALKER_MEM, ARRAY_SIZE(vml2_walker_mems), 1, 1,
14175ca02815Sjsg 	  { SOC15_REG_ENTRY(GC, 0, regVML2_WALKER_MEM_ECC_INDEX) },
14185ca02815Sjsg 	  { SOC15_REG_ENTRY(GC, 0, regVML2_WALKER_MEM_ECC_CNTL) },
14195ca02815Sjsg 	  SOC15_REG_FIELD(VML2_WALKER_MEM_ECC_CNTL, SEC_COUNT),
14205ca02815Sjsg 	  SOC15_REG_FIELD(VML2_WALKER_MEM_ECC_CNTL, DED_COUNT),
14215ca02815Sjsg 	  REG_SET_FIELD(0, VML2_WALKER_MEM_ECC_CNTL, WRITE_COUNTERS, 1) },
14225ca02815Sjsg 	{ UTCL2_MEM, 18, 1, 2,
14235ca02815Sjsg 	  { SOC15_REG_ENTRY(GC, 0, regUTCL2_MEM_ECC_INDEX) },
14245ca02815Sjsg 	  { SOC15_REG_ENTRY(GC, 0, regUTCL2_MEM_ECC_CNTL) },
14255ca02815Sjsg 	  SOC15_REG_FIELD(UTCL2_MEM_ECC_CNTL, SEC_COUNT),
14265ca02815Sjsg 	  SOC15_REG_FIELD(UTCL2_MEM_ECC_CNTL, DED_COUNT),
14275ca02815Sjsg 	  REG_SET_FIELD(0, UTCL2_MEM_ECC_CNTL, WRITE_COUNTERS, 1) },
14285ca02815Sjsg 	{ ATC_L2_CACHE_2M, 8, 2, 1,
14295ca02815Sjsg 	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_2M_DSM_INDEX) },
14305ca02815Sjsg 	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_2M_DSM_CNTL) },
14315ca02815Sjsg 	  SOC15_REG_FIELD(ATC_L2_CACHE_2M_DSM_CNTL, SEC_COUNT),
14325ca02815Sjsg 	  SOC15_REG_FIELD(ATC_L2_CACHE_2M_DSM_CNTL, DED_COUNT),
14335ca02815Sjsg 	  REG_SET_FIELD(0, ATC_L2_CACHE_2M_DSM_CNTL, WRITE_COUNTERS, 1) },
14345ca02815Sjsg 	{ ATC_L2_CACHE_32K, 8, 2, 2,
14355ca02815Sjsg 	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_32K_DSM_INDEX) },
14365ca02815Sjsg 	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_32K_DSM_CNTL) },
14375ca02815Sjsg 	  SOC15_REG_FIELD(ATC_L2_CACHE_32K_DSM_CNTL, SEC_COUNT),
14385ca02815Sjsg 	  SOC15_REG_FIELD(ATC_L2_CACHE_32K_DSM_CNTL, DED_COUNT),
14395ca02815Sjsg 	  REG_SET_FIELD(0, ATC_L2_CACHE_32K_DSM_CNTL, WRITE_COUNTERS, 1) },
14405ca02815Sjsg 	{ ATC_L2_CACHE_4K, 8, 2, 8,
14415ca02815Sjsg 	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_4K_DSM_INDEX) },
14425ca02815Sjsg 	  { SOC15_REG_ENTRY(GC, 0, regATC_L2_CACHE_4K_DSM_CNTL) },
14435ca02815Sjsg 	  SOC15_REG_FIELD(ATC_L2_CACHE_4K_DSM_CNTL, SEC_COUNT),
14445ca02815Sjsg 	  SOC15_REG_FIELD(ATC_L2_CACHE_4K_DSM_CNTL, DED_COUNT),
14455ca02815Sjsg 	  REG_SET_FIELD(0, ATC_L2_CACHE_4K_DSM_CNTL, WRITE_COUNTERS, 1) },
14465ca02815Sjsg };
14475ca02815Sjsg 
14485ca02815Sjsg static const struct soc15_reg_entry gfx_v9_4_2_ea_err_status_regs = {
14495ca02815Sjsg 	SOC15_REG_ENTRY(GC, 0, regGCEA_ERR_STATUS), 0, 1, 16
14505ca02815Sjsg };
14515ca02815Sjsg 
gfx_v9_4_2_get_reg_error_count(struct amdgpu_device * adev,const struct soc15_reg_entry * reg,uint32_t se_id,uint32_t inst_id,uint32_t value,uint32_t * sec_count,uint32_t * ded_count)14525ca02815Sjsg static int gfx_v9_4_2_get_reg_error_count(struct amdgpu_device *adev,
14535ca02815Sjsg 					  const struct soc15_reg_entry *reg,
14545ca02815Sjsg 					  uint32_t se_id, uint32_t inst_id,
14555ca02815Sjsg 					  uint32_t value, uint32_t *sec_count,
14565ca02815Sjsg 					  uint32_t *ded_count)
14575ca02815Sjsg {
14585ca02815Sjsg 	uint32_t i;
14595ca02815Sjsg 	uint32_t sec_cnt, ded_cnt;
14605ca02815Sjsg 
14615ca02815Sjsg 	for (i = 0; i < ARRAY_SIZE(gfx_v9_4_2_ras_fields); i++) {
14625ca02815Sjsg 		if (gfx_v9_4_2_ras_fields[i].reg_offset != reg->reg_offset ||
14635ca02815Sjsg 		    gfx_v9_4_2_ras_fields[i].seg != reg->seg ||
14645ca02815Sjsg 		    gfx_v9_4_2_ras_fields[i].inst != reg->inst)
14655ca02815Sjsg 			continue;
14665ca02815Sjsg 
14675ca02815Sjsg 		sec_cnt = SOC15_RAS_REG_FIELD_VAL(
14685ca02815Sjsg 			value, gfx_v9_4_2_ras_fields[i], sec);
14695ca02815Sjsg 		if (sec_cnt) {
14705ca02815Sjsg 			dev_info(adev->dev,
14715ca02815Sjsg 				 "GFX SubBlock %s, Instance[%d][%d], SEC %d\n",
14725ca02815Sjsg 				 gfx_v9_4_2_ras_fields[i].name, se_id, inst_id,
14735ca02815Sjsg 				 sec_cnt);
14745ca02815Sjsg 			*sec_count += sec_cnt;
14755ca02815Sjsg 		}
14765ca02815Sjsg 
14775ca02815Sjsg 		ded_cnt = SOC15_RAS_REG_FIELD_VAL(
14785ca02815Sjsg 			value, gfx_v9_4_2_ras_fields[i], ded);
14795ca02815Sjsg 		if (ded_cnt) {
14805ca02815Sjsg 			dev_info(adev->dev,
14815ca02815Sjsg 				 "GFX SubBlock %s, Instance[%d][%d], DED %d\n",
14825ca02815Sjsg 				 gfx_v9_4_2_ras_fields[i].name, se_id, inst_id,
14835ca02815Sjsg 				 ded_cnt);
14845ca02815Sjsg 			*ded_count += ded_cnt;
14855ca02815Sjsg 		}
14865ca02815Sjsg 	}
14875ca02815Sjsg 
14885ca02815Sjsg 	return 0;
14895ca02815Sjsg }
14905ca02815Sjsg 
gfx_v9_4_2_query_sram_edc_count(struct amdgpu_device * adev,uint32_t * sec_count,uint32_t * ded_count)14915ca02815Sjsg static int gfx_v9_4_2_query_sram_edc_count(struct amdgpu_device *adev,
14925ca02815Sjsg 				uint32_t *sec_count, uint32_t *ded_count)
14935ca02815Sjsg {
14945ca02815Sjsg 	uint32_t i, j, k, data;
14955ca02815Sjsg 	uint32_t sec_cnt = 0, ded_cnt = 0;
14965ca02815Sjsg 
14975ca02815Sjsg 	if (sec_count && ded_count) {
14985ca02815Sjsg 		*sec_count = 0;
14995ca02815Sjsg 		*ded_count = 0;
15005ca02815Sjsg 	}
15015ca02815Sjsg 
15025ca02815Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
15035ca02815Sjsg 
15045ca02815Sjsg 	for (i = 0; i < ARRAY_SIZE(gfx_v9_4_2_edc_counter_regs); i++) {
15055ca02815Sjsg 		for (j = 0; j < gfx_v9_4_2_edc_counter_regs[i].se_num; j++) {
15065ca02815Sjsg 			for (k = 0; k < gfx_v9_4_2_edc_counter_regs[i].instance;
15075ca02815Sjsg 			     k++) {
15085ca02815Sjsg 				gfx_v9_4_2_select_se_sh(adev, j, 0, k);
15095ca02815Sjsg 
15105ca02815Sjsg 				/* if sec/ded_count is null, just clear counter */
15115ca02815Sjsg 				if (!sec_count || !ded_count) {
15125ca02815Sjsg 					WREG32(SOC15_REG_ENTRY_OFFSET(
15135ca02815Sjsg 						gfx_v9_4_2_edc_counter_regs[i]), 0);
15145ca02815Sjsg 					continue;
15155ca02815Sjsg 				}
15165ca02815Sjsg 
15175ca02815Sjsg 				data = RREG32(SOC15_REG_ENTRY_OFFSET(
15185ca02815Sjsg 					gfx_v9_4_2_edc_counter_regs[i]));
15195ca02815Sjsg 
15205ca02815Sjsg 				if (!data)
15215ca02815Sjsg 					continue;
15225ca02815Sjsg 
15235ca02815Sjsg 				gfx_v9_4_2_get_reg_error_count(adev,
15245ca02815Sjsg 					&gfx_v9_4_2_edc_counter_regs[i],
15255ca02815Sjsg 					j, k, data, &sec_cnt, &ded_cnt);
15265ca02815Sjsg 
15275ca02815Sjsg 				/* clear counter after read */
15285ca02815Sjsg 				WREG32(SOC15_REG_ENTRY_OFFSET(
15295ca02815Sjsg 					gfx_v9_4_2_edc_counter_regs[i]), 0);
15305ca02815Sjsg 			}
15315ca02815Sjsg 		}
15325ca02815Sjsg 	}
15335ca02815Sjsg 
15345ca02815Sjsg 	if (sec_count && ded_count) {
15355ca02815Sjsg 		*sec_count += sec_cnt;
15365ca02815Sjsg 		*ded_count += ded_cnt;
15375ca02815Sjsg 	}
15385ca02815Sjsg 
15395ca02815Sjsg 	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
15405ca02815Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
15415ca02815Sjsg 
15425ca02815Sjsg 	return 0;
15435ca02815Sjsg }
15445ca02815Sjsg 
gfx_v9_4_2_log_utc_edc_count(struct amdgpu_device * adev,struct gfx_v9_4_2_utc_block * blk,uint32_t instance,uint32_t sec_cnt,uint32_t ded_cnt)15455ca02815Sjsg static void gfx_v9_4_2_log_utc_edc_count(struct amdgpu_device *adev,
15465ca02815Sjsg 					 struct gfx_v9_4_2_utc_block *blk,
15475ca02815Sjsg 					 uint32_t instance, uint32_t sec_cnt,
15485ca02815Sjsg 					 uint32_t ded_cnt)
15495ca02815Sjsg {
15505ca02815Sjsg 	uint32_t bank, way, mem;
15515ca02815Sjsg 	static const char *vml2_way_str[] = { "BIGK", "4K" };
15525ca02815Sjsg 	static const char *utcl2_rounter_str[] = { "VMC", "APT" };
15535ca02815Sjsg 
15545ca02815Sjsg 	mem = instance % blk->num_mem_blocks;
15555ca02815Sjsg 	way = (instance / blk->num_mem_blocks) % blk->num_ways;
15565ca02815Sjsg 	bank = instance / (blk->num_mem_blocks * blk->num_ways);
15575ca02815Sjsg 
15585ca02815Sjsg 	switch (blk->type) {
15595ca02815Sjsg 	case VML2_MEM:
15605ca02815Sjsg 		dev_info(
15615ca02815Sjsg 			adev->dev,
15625ca02815Sjsg 			"GFX SubBlock UTC_VML2_BANK_CACHE_%d_%s_MEM%d, SED %d, DED %d\n",
15635ca02815Sjsg 			bank, vml2_way_str[way], mem, sec_cnt, ded_cnt);
15645ca02815Sjsg 		break;
15655ca02815Sjsg 	case VML2_WALKER_MEM:
15665ca02815Sjsg 		dev_info(adev->dev, "GFX SubBlock %s, SED %d, DED %d\n",
15675ca02815Sjsg 			 vml2_walker_mems[bank], sec_cnt, ded_cnt);
15685ca02815Sjsg 		break;
15695ca02815Sjsg 	case UTCL2_MEM:
15705ca02815Sjsg 		dev_info(
15715ca02815Sjsg 			adev->dev,
15725ca02815Sjsg 			"GFX SubBlock UTCL2_ROUTER_IFIF%d_GROUP0_%s, SED %d, DED %d\n",
15735ca02815Sjsg 			bank, utcl2_rounter_str[mem], sec_cnt, ded_cnt);
15745ca02815Sjsg 		break;
15755ca02815Sjsg 	case ATC_L2_CACHE_2M:
15765ca02815Sjsg 		dev_info(
15775ca02815Sjsg 			adev->dev,
15785ca02815Sjsg 			"GFX SubBlock UTC_ATCL2_CACHE_2M_BANK%d_WAY%d_MEM, SED %d, DED %d\n",
15795ca02815Sjsg 			bank, way, sec_cnt, ded_cnt);
15805ca02815Sjsg 		break;
15815ca02815Sjsg 	case ATC_L2_CACHE_32K:
15825ca02815Sjsg 		dev_info(
15835ca02815Sjsg 			adev->dev,
15845ca02815Sjsg 			"GFX SubBlock UTC_ATCL2_CACHE_32K_BANK%d_WAY%d_MEM%d, SED %d, DED %d\n",
15855ca02815Sjsg 			bank, way, mem, sec_cnt, ded_cnt);
15865ca02815Sjsg 		break;
15875ca02815Sjsg 	case ATC_L2_CACHE_4K:
15885ca02815Sjsg 		dev_info(
15895ca02815Sjsg 			adev->dev,
15905ca02815Sjsg 			"GFX SubBlock UTC_ATCL2_CACHE_4K_BANK%d_WAY%d_MEM%d, SED %d, DED %d\n",
15915ca02815Sjsg 			bank, way, mem, sec_cnt, ded_cnt);
15925ca02815Sjsg 		break;
15935ca02815Sjsg 	}
15945ca02815Sjsg }
15955ca02815Sjsg 
gfx_v9_4_2_query_utc_edc_count(struct amdgpu_device * adev,uint32_t * sec_count,uint32_t * ded_count)15965ca02815Sjsg static int gfx_v9_4_2_query_utc_edc_count(struct amdgpu_device *adev,
15975ca02815Sjsg 					  uint32_t *sec_count,
15985ca02815Sjsg 					  uint32_t *ded_count)
15995ca02815Sjsg {
16005ca02815Sjsg 	uint32_t i, j, data;
16015ca02815Sjsg 	uint32_t sec_cnt, ded_cnt;
16025ca02815Sjsg 	uint32_t num_instances;
16035ca02815Sjsg 	struct gfx_v9_4_2_utc_block *blk;
16045ca02815Sjsg 
16055ca02815Sjsg 	if (sec_count && ded_count) {
16065ca02815Sjsg 		*sec_count = 0;
16075ca02815Sjsg 		*ded_count = 0;
16085ca02815Sjsg 	}
16095ca02815Sjsg 
16105ca02815Sjsg 	for (i = 0; i < ARRAY_SIZE(gfx_v9_4_2_utc_blocks); i++) {
16115ca02815Sjsg 		blk = &gfx_v9_4_2_utc_blocks[i];
16125ca02815Sjsg 		num_instances =
16135ca02815Sjsg 			blk->num_banks * blk->num_ways * blk->num_mem_blocks;
16145ca02815Sjsg 		for (j = 0; j < num_instances; j++) {
16155ca02815Sjsg 			WREG32(SOC15_REG_ENTRY_OFFSET(blk->idx_reg), j);
16165ca02815Sjsg 
16175ca02815Sjsg 			/* if sec/ded_count is NULL, just clear counter */
16185ca02815Sjsg 			if (!sec_count || !ded_count) {
16195ca02815Sjsg 				WREG32(SOC15_REG_ENTRY_OFFSET(blk->data_reg),
16205ca02815Sjsg 				       blk->clear);
16215ca02815Sjsg 				continue;
16225ca02815Sjsg 			}
16235ca02815Sjsg 
16245ca02815Sjsg 			data = RREG32(SOC15_REG_ENTRY_OFFSET(blk->data_reg));
16255ca02815Sjsg 			if (!data)
16265ca02815Sjsg 				continue;
16275ca02815Sjsg 
16285ca02815Sjsg 			sec_cnt = SOC15_RAS_REG_FIELD_VAL(data, *blk, sec);
16295ca02815Sjsg 			*sec_count += sec_cnt;
16305ca02815Sjsg 			ded_cnt = SOC15_RAS_REG_FIELD_VAL(data, *blk, ded);
16315ca02815Sjsg 			*ded_count += ded_cnt;
16325ca02815Sjsg 
16335ca02815Sjsg 			/* clear counter after read */
16345ca02815Sjsg 			WREG32(SOC15_REG_ENTRY_OFFSET(blk->data_reg),
16355ca02815Sjsg 			       blk->clear);
16365ca02815Sjsg 
16375ca02815Sjsg 			/* print the edc count */
16385ca02815Sjsg 			if (sec_cnt || ded_cnt)
16395ca02815Sjsg 				gfx_v9_4_2_log_utc_edc_count(adev, blk, j, sec_cnt,
16405ca02815Sjsg 							     ded_cnt);
16415ca02815Sjsg 		}
16425ca02815Sjsg 	}
16435ca02815Sjsg 
16445ca02815Sjsg 	return 0;
16455ca02815Sjsg }
16465ca02815Sjsg 
gfx_v9_4_2_query_ras_error_count(struct amdgpu_device * adev,void * ras_error_status)16471bb76ff1Sjsg static void gfx_v9_4_2_query_ras_error_count(struct amdgpu_device *adev,
16485ca02815Sjsg 					    void *ras_error_status)
16495ca02815Sjsg {
16505ca02815Sjsg 	struct ras_err_data *err_data = (struct ras_err_data *)ras_error_status;
16515ca02815Sjsg 	uint32_t sec_count = 0, ded_count = 0;
16525ca02815Sjsg 
16535ca02815Sjsg 	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
16541bb76ff1Sjsg 		return;
16555ca02815Sjsg 
16565ca02815Sjsg 	err_data->ue_count = 0;
16575ca02815Sjsg 	err_data->ce_count = 0;
16585ca02815Sjsg 
16595ca02815Sjsg 	gfx_v9_4_2_query_sram_edc_count(adev, &sec_count, &ded_count);
16605ca02815Sjsg 	err_data->ce_count += sec_count;
16615ca02815Sjsg 	err_data->ue_count += ded_count;
16625ca02815Sjsg 
16635ca02815Sjsg 	gfx_v9_4_2_query_utc_edc_count(adev, &sec_count, &ded_count);
16645ca02815Sjsg 	err_data->ce_count += sec_count;
16655ca02815Sjsg 	err_data->ue_count += ded_count;
16665ca02815Sjsg 
16675ca02815Sjsg }
16685ca02815Sjsg 
gfx_v9_4_2_reset_utc_err_status(struct amdgpu_device * adev)16695ca02815Sjsg static void gfx_v9_4_2_reset_utc_err_status(struct amdgpu_device *adev)
16705ca02815Sjsg {
16715ca02815Sjsg 	WREG32_SOC15(GC, 0, regUTCL2_MEM_ECC_STATUS, 0x3);
16725ca02815Sjsg 	WREG32_SOC15(GC, 0, regVML2_MEM_ECC_STATUS, 0x3);
16735ca02815Sjsg 	WREG32_SOC15(GC, 0, regVML2_WALKER_MEM_ECC_STATUS, 0x3);
16745ca02815Sjsg }
16755ca02815Sjsg 
gfx_v9_4_2_reset_ea_err_status(struct amdgpu_device * adev)16765ca02815Sjsg static void gfx_v9_4_2_reset_ea_err_status(struct amdgpu_device *adev)
16775ca02815Sjsg {
16785ca02815Sjsg 	uint32_t i, j;
16795ca02815Sjsg 	uint32_t value;
16805ca02815Sjsg 
16815ca02815Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
16825ca02815Sjsg 	for (i = 0; i < gfx_v9_4_2_ea_err_status_regs.se_num; i++) {
16835ca02815Sjsg 		for (j = 0; j < gfx_v9_4_2_ea_err_status_regs.instance;
16845ca02815Sjsg 		     j++) {
16855ca02815Sjsg 			gfx_v9_4_2_select_se_sh(adev, i, 0, j);
16865ca02815Sjsg 			value = RREG32(SOC15_REG_ENTRY_OFFSET(
16875ca02815Sjsg 				gfx_v9_4_2_ea_err_status_regs));
16885ca02815Sjsg 			value = REG_SET_FIELD(value, GCEA_ERR_STATUS, CLEAR_ERROR_STATUS, 0x1);
16895ca02815Sjsg 			WREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_4_2_ea_err_status_regs), value);
16905ca02815Sjsg 		}
16915ca02815Sjsg 	}
16925ca02815Sjsg 	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
16935ca02815Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
16945ca02815Sjsg }
16955ca02815Sjsg 
gfx_v9_4_2_reset_ras_error_count(struct amdgpu_device * adev)16965ca02815Sjsg static void gfx_v9_4_2_reset_ras_error_count(struct amdgpu_device *adev)
16975ca02815Sjsg {
16985ca02815Sjsg 	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
16995ca02815Sjsg 		return;
17005ca02815Sjsg 
17015ca02815Sjsg 	gfx_v9_4_2_query_sram_edc_count(adev, NULL, NULL);
17025ca02815Sjsg 	gfx_v9_4_2_query_utc_edc_count(adev, NULL, NULL);
17035ca02815Sjsg }
17045ca02815Sjsg 
gfx_v9_4_2_query_ea_err_status(struct amdgpu_device * adev)17055ca02815Sjsg static void gfx_v9_4_2_query_ea_err_status(struct amdgpu_device *adev)
17065ca02815Sjsg {
17075ca02815Sjsg 	uint32_t i, j;
17085ca02815Sjsg 	uint32_t reg_value;
17095ca02815Sjsg 
17105ca02815Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
17115ca02815Sjsg 
17125ca02815Sjsg 	for (i = 0; i < gfx_v9_4_2_ea_err_status_regs.se_num; i++) {
17135ca02815Sjsg 		for (j = 0; j < gfx_v9_4_2_ea_err_status_regs.instance;
17145ca02815Sjsg 		     j++) {
17155ca02815Sjsg 			gfx_v9_4_2_select_se_sh(adev, i, 0, j);
17165ca02815Sjsg 			reg_value = RREG32(SOC15_REG_ENTRY_OFFSET(
17175ca02815Sjsg 				gfx_v9_4_2_ea_err_status_regs));
17185ca02815Sjsg 
17195ca02815Sjsg 			if (REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_RDRSP_STATUS) ||
17205ca02815Sjsg 			    REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_WRRSP_STATUS) ||
17215ca02815Sjsg 			    REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_RDRSP_DATAPARITY_ERROR)) {
17225ca02815Sjsg 				dev_warn(adev->dev, "GCEA err detected at instance: %d, status: 0x%x!\n",
17235ca02815Sjsg 						j, reg_value);
17245ca02815Sjsg 			}
17255ca02815Sjsg 			/* clear after read */
17265ca02815Sjsg 			reg_value = REG_SET_FIELD(reg_value, GCEA_ERR_STATUS,
17275ca02815Sjsg 						  CLEAR_ERROR_STATUS, 0x1);
17285ca02815Sjsg 			WREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_4_2_ea_err_status_regs), reg_value);
17295ca02815Sjsg 		}
17305ca02815Sjsg 	}
17315ca02815Sjsg 
17325ca02815Sjsg 	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
17335ca02815Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
17345ca02815Sjsg }
17355ca02815Sjsg 
gfx_v9_4_2_query_utc_err_status(struct amdgpu_device * adev)17365ca02815Sjsg static void gfx_v9_4_2_query_utc_err_status(struct amdgpu_device *adev)
17375ca02815Sjsg {
17385ca02815Sjsg 	uint32_t data;
17395ca02815Sjsg 
17405ca02815Sjsg 	data = RREG32_SOC15(GC, 0, regUTCL2_MEM_ECC_STATUS);
17415ca02815Sjsg 	if (data) {
17425ca02815Sjsg 		dev_warn(adev->dev, "GFX UTCL2 Mem Ecc Status: 0x%x!\n", data);
17435ca02815Sjsg 		WREG32_SOC15(GC, 0, regUTCL2_MEM_ECC_STATUS, 0x3);
17445ca02815Sjsg 	}
17455ca02815Sjsg 
17465ca02815Sjsg 	data = RREG32_SOC15(GC, 0, regVML2_MEM_ECC_STATUS);
17475ca02815Sjsg 	if (data) {
17485ca02815Sjsg 		dev_warn(adev->dev, "GFX VML2 Mem Ecc Status: 0x%x!\n", data);
17495ca02815Sjsg 		WREG32_SOC15(GC, 0, regVML2_MEM_ECC_STATUS, 0x3);
17505ca02815Sjsg 	}
17515ca02815Sjsg 
17525ca02815Sjsg 	data = RREG32_SOC15(GC, 0, regVML2_WALKER_MEM_ECC_STATUS);
17535ca02815Sjsg 	if (data) {
17545ca02815Sjsg 		dev_warn(adev->dev, "GFX VML2 Walker Mem Ecc Status: 0x%x!\n", data);
17555ca02815Sjsg 		WREG32_SOC15(GC, 0, regVML2_WALKER_MEM_ECC_STATUS, 0x3);
17565ca02815Sjsg 	}
17575ca02815Sjsg }
17585ca02815Sjsg 
gfx_v9_4_2_query_ras_error_status(struct amdgpu_device * adev)17595ca02815Sjsg static void gfx_v9_4_2_query_ras_error_status(struct amdgpu_device *adev)
17605ca02815Sjsg {
17615ca02815Sjsg 	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
17625ca02815Sjsg 		return;
17635ca02815Sjsg 
17645ca02815Sjsg 	gfx_v9_4_2_query_ea_err_status(adev);
17655ca02815Sjsg 	gfx_v9_4_2_query_utc_err_status(adev);
17665ca02815Sjsg 	gfx_v9_4_2_query_sq_timeout_status(adev);
17675ca02815Sjsg }
17685ca02815Sjsg 
gfx_v9_4_2_reset_ras_error_status(struct amdgpu_device * adev)17695ca02815Sjsg static void gfx_v9_4_2_reset_ras_error_status(struct amdgpu_device *adev)
17705ca02815Sjsg {
17715ca02815Sjsg 	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
17725ca02815Sjsg 		return;
17735ca02815Sjsg 
17745ca02815Sjsg 	gfx_v9_4_2_reset_utc_err_status(adev);
17755ca02815Sjsg 	gfx_v9_4_2_reset_ea_err_status(adev);
17765ca02815Sjsg 	gfx_v9_4_2_reset_sq_timeout_status(adev);
17775ca02815Sjsg }
17785ca02815Sjsg 
gfx_v9_4_2_enable_watchdog_timer(struct amdgpu_device * adev)17795ca02815Sjsg static void gfx_v9_4_2_enable_watchdog_timer(struct amdgpu_device *adev)
17805ca02815Sjsg {
17815ca02815Sjsg 	uint32_t i;
17825ca02815Sjsg 	uint32_t data;
17835ca02815Sjsg 
17845ca02815Sjsg 	data = REG_SET_FIELD(0, SQ_TIMEOUT_CONFIG, TIMEOUT_FATAL_DISABLE,
17855ca02815Sjsg 			     amdgpu_watchdog_timer.timeout_fatal_disable ? 1 :
17865ca02815Sjsg 									   0);
17875ca02815Sjsg 
17885ca02815Sjsg 	if (amdgpu_watchdog_timer.timeout_fatal_disable &&
17895ca02815Sjsg 	    (amdgpu_watchdog_timer.period < 1 ||
17905ca02815Sjsg 	     amdgpu_watchdog_timer.period > 0x23)) {
17915ca02815Sjsg 		dev_warn(adev->dev, "Watchdog period range is 1 to 0x23\n");
17925ca02815Sjsg 		amdgpu_watchdog_timer.period = 0x23;
17935ca02815Sjsg 	}
17945ca02815Sjsg 	data = REG_SET_FIELD(data, SQ_TIMEOUT_CONFIG, PERIOD_SEL,
17955ca02815Sjsg 			     amdgpu_watchdog_timer.period);
17965ca02815Sjsg 
17975ca02815Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
17985ca02815Sjsg 	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
17995ca02815Sjsg 		gfx_v9_4_2_select_se_sh(adev, i, 0xffffffff, 0xffffffff);
18005ca02815Sjsg 		WREG32_SOC15(GC, 0, regSQ_TIMEOUT_CONFIG, data);
18015ca02815Sjsg 	}
18025ca02815Sjsg 	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
18035ca02815Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
18045ca02815Sjsg }
18055ca02815Sjsg 
wave_read_ind(struct amdgpu_device * adev,uint32_t simd,uint32_t wave,uint32_t address)18065ca02815Sjsg static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address)
18075ca02815Sjsg {
18085ca02815Sjsg 	WREG32_SOC15_RLC_EX(reg, GC, 0, regSQ_IND_INDEX,
18095ca02815Sjsg 		(wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |
18105ca02815Sjsg 		(simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |
18115ca02815Sjsg 		(address << SQ_IND_INDEX__INDEX__SHIFT) |
18125ca02815Sjsg 		(SQ_IND_INDEX__FORCE_READ_MASK));
18135ca02815Sjsg 	return RREG32_SOC15(GC, 0, regSQ_IND_DATA);
18145ca02815Sjsg }
18155ca02815Sjsg 
gfx_v9_4_2_log_cu_timeout_status(struct amdgpu_device * adev,uint32_t status)18165ca02815Sjsg static void gfx_v9_4_2_log_cu_timeout_status(struct amdgpu_device *adev,
18175ca02815Sjsg 					uint32_t status)
18185ca02815Sjsg {
18195ca02815Sjsg 	struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info;
18205ca02815Sjsg 	uint32_t i, simd, wave;
18215ca02815Sjsg 	uint32_t wave_status;
18225ca02815Sjsg 	uint32_t wave_pc_lo, wave_pc_hi;
18235ca02815Sjsg 	uint32_t wave_exec_lo, wave_exec_hi;
18245ca02815Sjsg 	uint32_t wave_inst_dw0, wave_inst_dw1;
18255ca02815Sjsg 	uint32_t wave_ib_sts;
18265ca02815Sjsg 
18275ca02815Sjsg 	for (i = 0; i < 32; i++) {
18285ca02815Sjsg 		if (!((i << 1) & status))
18295ca02815Sjsg 			continue;
18305ca02815Sjsg 
18315ca02815Sjsg 		simd = i / cu_info->max_waves_per_simd;
18325ca02815Sjsg 		wave = i % cu_info->max_waves_per_simd;
18335ca02815Sjsg 
18345ca02815Sjsg 		wave_status = wave_read_ind(adev, simd, wave, ixSQ_WAVE_STATUS);
18355ca02815Sjsg 		wave_pc_lo = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_LO);
18365ca02815Sjsg 		wave_pc_hi = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_HI);
18375ca02815Sjsg 		wave_exec_lo =
18385ca02815Sjsg 			wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_LO);
18395ca02815Sjsg 		wave_exec_hi =
18405ca02815Sjsg 			wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_HI);
18415ca02815Sjsg 		wave_inst_dw0 =
18425ca02815Sjsg 			wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW0);
18435ca02815Sjsg 		wave_inst_dw1 =
18445ca02815Sjsg 			wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW1);
18455ca02815Sjsg 		wave_ib_sts = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_STS);
18465ca02815Sjsg 
18475ca02815Sjsg 		dev_info(
18485ca02815Sjsg 			adev->dev,
18495ca02815Sjsg 			"\t SIMD %d, Wave %d: status 0x%x, pc 0x%llx, exec 0x%llx, inst 0x%llx, ib_sts 0x%x\n",
18505ca02815Sjsg 			simd, wave, wave_status,
18515ca02815Sjsg 			((uint64_t)wave_pc_hi << 32 | wave_pc_lo),
18525ca02815Sjsg 			((uint64_t)wave_exec_hi << 32 | wave_exec_lo),
18535ca02815Sjsg 			((uint64_t)wave_inst_dw1 << 32 | wave_inst_dw0),
18545ca02815Sjsg 			wave_ib_sts);
18555ca02815Sjsg 	}
18565ca02815Sjsg }
18575ca02815Sjsg 
gfx_v9_4_2_query_sq_timeout_status(struct amdgpu_device * adev)18585ca02815Sjsg static void gfx_v9_4_2_query_sq_timeout_status(struct amdgpu_device *adev)
18595ca02815Sjsg {
18605ca02815Sjsg 	uint32_t se_idx, sh_idx, cu_idx;
18615ca02815Sjsg 	uint32_t status;
18625ca02815Sjsg 
18635ca02815Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
18645ca02815Sjsg 	for (se_idx = 0; se_idx < adev->gfx.config.max_shader_engines;
18655ca02815Sjsg 	     se_idx++) {
18665ca02815Sjsg 		for (sh_idx = 0; sh_idx < adev->gfx.config.max_sh_per_se;
18675ca02815Sjsg 		     sh_idx++) {
18685ca02815Sjsg 			for (cu_idx = 0;
18695ca02815Sjsg 			     cu_idx < adev->gfx.config.max_cu_per_sh;
18705ca02815Sjsg 			     cu_idx++) {
18715ca02815Sjsg 				gfx_v9_4_2_select_se_sh(adev, se_idx, sh_idx,
18725ca02815Sjsg 							cu_idx);
18735ca02815Sjsg 				status = RREG32_SOC15(GC, 0,
18745ca02815Sjsg 						      regSQ_TIMEOUT_STATUS);
18755ca02815Sjsg 				if (status != 0) {
18765ca02815Sjsg 					dev_info(
18775ca02815Sjsg 						adev->dev,
18785ca02815Sjsg 						"GFX Watchdog Timeout: SE %d, SH %d, CU %d\n",
18795ca02815Sjsg 						se_idx, sh_idx, cu_idx);
18805ca02815Sjsg 					gfx_v9_4_2_log_cu_timeout_status(
18815ca02815Sjsg 						adev, status);
18825ca02815Sjsg 				}
18835ca02815Sjsg 				/* clear old status */
18845ca02815Sjsg 				WREG32_SOC15(GC, 0, regSQ_TIMEOUT_STATUS, 0);
18855ca02815Sjsg 			}
18865ca02815Sjsg 		}
18875ca02815Sjsg 	}
18885ca02815Sjsg 	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
18895ca02815Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
18905ca02815Sjsg }
18915ca02815Sjsg 
gfx_v9_4_2_reset_sq_timeout_status(struct amdgpu_device * adev)18925ca02815Sjsg static void gfx_v9_4_2_reset_sq_timeout_status(struct amdgpu_device *adev)
18935ca02815Sjsg {
18945ca02815Sjsg 	uint32_t se_idx, sh_idx, cu_idx;
18955ca02815Sjsg 
18965ca02815Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
18975ca02815Sjsg 	for (se_idx = 0; se_idx < adev->gfx.config.max_shader_engines;
18985ca02815Sjsg 	     se_idx++) {
18995ca02815Sjsg 		for (sh_idx = 0; sh_idx < adev->gfx.config.max_sh_per_se;
19005ca02815Sjsg 		     sh_idx++) {
19015ca02815Sjsg 			for (cu_idx = 0;
19025ca02815Sjsg 			     cu_idx < adev->gfx.config.max_cu_per_sh;
19035ca02815Sjsg 			     cu_idx++) {
19045ca02815Sjsg 				gfx_v9_4_2_select_se_sh(adev, se_idx, sh_idx,
19055ca02815Sjsg 							cu_idx);
19065ca02815Sjsg 				WREG32_SOC15(GC, 0, regSQ_TIMEOUT_STATUS, 0);
19075ca02815Sjsg 			}
19085ca02815Sjsg 		}
19095ca02815Sjsg 	}
19105ca02815Sjsg 	gfx_v9_4_2_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
19115ca02815Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
19125ca02815Sjsg }
19135ca02815Sjsg 
gfx_v9_4_2_query_uctl2_poison_status(struct amdgpu_device * adev)19141bb76ff1Sjsg static bool gfx_v9_4_2_query_uctl2_poison_status(struct amdgpu_device *adev)
19151bb76ff1Sjsg {
19161bb76ff1Sjsg 	u32 status = 0;
19171bb76ff1Sjsg 	struct amdgpu_vmhub *hub;
19181bb76ff1Sjsg 
1919*f005ef32Sjsg 	hub = &adev->vmhub[AMDGPU_GFXHUB(0)];
19201bb76ff1Sjsg 	status = RREG32(hub->vm_l2_pro_fault_status);
19211bb76ff1Sjsg 	/* reset page fault status */
19221bb76ff1Sjsg 	WREG32_P(hub->vm_l2_pro_fault_cntl, 1, ~1);
19231bb76ff1Sjsg 
19241bb76ff1Sjsg 	return REG_GET_FIELD(status, VM_L2_PROTECTION_FAULT_STATUS, FED);
19251bb76ff1Sjsg }
19261bb76ff1Sjsg 
19271bb76ff1Sjsg struct amdgpu_ras_block_hw_ops  gfx_v9_4_2_ras_ops = {
19285ca02815Sjsg 		.query_ras_error_count = &gfx_v9_4_2_query_ras_error_count,
19295ca02815Sjsg 		.reset_ras_error_count = &gfx_v9_4_2_reset_ras_error_count,
19305ca02815Sjsg 		.query_ras_error_status = &gfx_v9_4_2_query_ras_error_status,
19315ca02815Sjsg 		.reset_ras_error_status = &gfx_v9_4_2_reset_ras_error_status,
19321bb76ff1Sjsg };
19331bb76ff1Sjsg 
19341bb76ff1Sjsg struct amdgpu_gfx_ras gfx_v9_4_2_ras = {
19351bb76ff1Sjsg 	.ras_block = {
19361bb76ff1Sjsg 		.hw_ops = &gfx_v9_4_2_ras_ops,
19371bb76ff1Sjsg 	},
19385ca02815Sjsg 	.enable_watchdog_timer = &gfx_v9_4_2_enable_watchdog_timer,
19391bb76ff1Sjsg 	.query_utcl2_poison_status = gfx_v9_4_2_query_uctl2_poison_status,
19405ca02815Sjsg };
1941