brintos

brintos / linux-shallow public Read only

0
0
Text · 160.5 KiB · c100845 Raw
5085 lines · c
1/*2 * Copyright 2022 Advanced Micro Devices, Inc.3 *4 * Permission is hereby granted, free of charge, to any person obtaining a5 * copy of this software and associated documentation files (the "Software"),6 * to deal in the Software without restriction, including without limitation7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,8 * and/or sell copies of the Software, and to permit persons to whom the9 * Software is furnished to do so, subject to the following conditions:10 *11 * The above copyright notice and this permission notice shall be included in12 * all copies or substantial portions of the Software.13 *14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR20 * OTHER DEALINGS IN THE SOFTWARE.21 *22 */23#include <linux/firmware.h>24 25#include "amdgpu.h"26#include "amdgpu_gfx.h"27#include "soc15.h"28#include "soc15d.h"29#include "soc15_common.h"30#include "vega10_enum.h"31 32#include "v9_structs.h"33 34#include "ivsrcid/gfx/irqsrcs_gfx_9_0.h"35 36#include "gc/gc_9_4_3_offset.h"37#include "gc/gc_9_4_3_sh_mask.h"38 39#include "gfx_v9_4_3.h"40#include "gfx_v9_4_3_cleaner_shader.h"41#include "amdgpu_xcp.h"42#include "amdgpu_aca.h"43 44MODULE_FIRMWARE("amdgpu/gc_9_4_3_mec.bin");45MODULE_FIRMWARE("amdgpu/gc_9_4_4_mec.bin");46MODULE_FIRMWARE("amdgpu/gc_9_4_3_rlc.bin");47MODULE_FIRMWARE("amdgpu/gc_9_4_4_rlc.bin");48 49#define GFX9_MEC_HPD_SIZE 409650#define RLCG_UCODE_LOADING_START_ADDRESS 0x00002000L51 52#define GOLDEN_GB_ADDR_CONFIG 0x2a11404253#define CP_HQD_PERSISTENT_STATE_DEFAULT 0xbe0530154 55#define mmSMNAID_XCD0_MCA_SMU 0x36430400	/* SMN AID XCD0 */56#define mmSMNAID_XCD1_MCA_SMU 0x38430400	/* SMN AID XCD1 */57#define mmSMNXCD_XCD0_MCA_SMU 0x40430400	/* SMN XCD XCD0 */58 59#define XCC_REG_RANGE_0_LOW  0x2000     /* XCC gfxdec0 lower Bound */60#define XCC_REG_RANGE_0_HIGH 0x3400     /* XCC gfxdec0 upper Bound */61#define XCC_REG_RANGE_1_LOW  0xA000     /* XCC gfxdec1 lower Bound */62#define XCC_REG_RANGE_1_HIGH 0x10000    /* XCC gfxdec1 upper Bound */63 64#define NORMALIZE_XCC_REG_OFFSET(offset) \65	(offset & 0xFFFF)66 67static const struct amdgpu_hwip_reg_entry gc_reg_list_9_4_3[] = {68	SOC15_REG_ENTRY_STR(GC, 0, regGRBM_STATUS),69	SOC15_REG_ENTRY_STR(GC, 0, regGRBM_STATUS2),70	SOC15_REG_ENTRY_STR(GC, 0, regCP_STALLED_STAT1),71	SOC15_REG_ENTRY_STR(GC, 0, regCP_STALLED_STAT2),72	SOC15_REG_ENTRY_STR(GC, 0, regCP_CPC_STALLED_STAT1),73	SOC15_REG_ENTRY_STR(GC, 0, regCP_CPF_STALLED_STAT1),74	SOC15_REG_ENTRY_STR(GC, 0, regCP_BUSY_STAT),75	SOC15_REG_ENTRY_STR(GC, 0, regCP_CPC_BUSY_STAT),76	SOC15_REG_ENTRY_STR(GC, 0, regCP_CPF_BUSY_STAT),77	SOC15_REG_ENTRY_STR(GC, 0, regCP_CPF_STATUS),78	SOC15_REG_ENTRY_STR(GC, 0, regCP_GFX_ERROR),79	SOC15_REG_ENTRY_STR(GC, 0, regCPF_UTCL1_STATUS),80	SOC15_REG_ENTRY_STR(GC, 0, regCPC_UTCL1_STATUS),81	SOC15_REG_ENTRY_STR(GC, 0, regCPG_UTCL1_STATUS),82	SOC15_REG_ENTRY_STR(GC, 0, regGDS_PROTECTION_FAULT),83	SOC15_REG_ENTRY_STR(GC, 0, regGDS_VM_PROTECTION_FAULT),84	SOC15_REG_ENTRY_STR(GC, 0, regRLC_UTCL1_STATUS),85	SOC15_REG_ENTRY_STR(GC, 0, regRMI_UTCL1_STATUS),86	SOC15_REG_ENTRY_STR(GC, 0, regSQC_DCACHE_UTCL1_STATUS),87	SOC15_REG_ENTRY_STR(GC, 0, regSQC_ICACHE_UTCL1_STATUS),88	SOC15_REG_ENTRY_STR(GC, 0, regSQ_UTCL1_STATUS),89	SOC15_REG_ENTRY_STR(GC, 0, regTCP_UTCL1_STATUS),90	SOC15_REG_ENTRY_STR(GC, 0, regWD_UTCL1_STATUS),91	SOC15_REG_ENTRY_STR(GC, 0, regVM_L2_PROTECTION_FAULT_CNTL),92	SOC15_REG_ENTRY_STR(GC, 0, regVM_L2_PROTECTION_FAULT_STATUS),93	SOC15_REG_ENTRY_STR(GC, 0, regCP_DEBUG),94	SOC15_REG_ENTRY_STR(GC, 0, regCP_MEC_CNTL),95	SOC15_REG_ENTRY_STR(GC, 0, regCP_MEC1_INSTR_PNTR),96	SOC15_REG_ENTRY_STR(GC, 0, regCP_MEC2_INSTR_PNTR),97	SOC15_REG_ENTRY_STR(GC, 0, regCP_CPC_STATUS),98	SOC15_REG_ENTRY_STR(GC, 0, regRLC_STAT),99	SOC15_REG_ENTRY_STR(GC, 0, regRLC_SMU_COMMAND),100	SOC15_REG_ENTRY_STR(GC, 0, regRLC_SMU_MESSAGE),101	SOC15_REG_ENTRY_STR(GC, 0, regRLC_SMU_ARGUMENT_1),102	SOC15_REG_ENTRY_STR(GC, 0, regRLC_SMU_ARGUMENT_2),103	SOC15_REG_ENTRY_STR(GC, 0, regSMU_RLC_RESPONSE),104	SOC15_REG_ENTRY_STR(GC, 0, regRLC_SAFE_MODE),105	SOC15_REG_ENTRY_STR(GC, 0, regRLC_SMU_SAFE_MODE),106	SOC15_REG_ENTRY_STR(GC, 0, regRLC_INT_STAT),107	SOC15_REG_ENTRY_STR(GC, 0, regRLC_GPM_GENERAL_6),108	/* cp header registers */109	SOC15_REG_ENTRY_STR(GC, 0, regCP_MEC_ME1_HEADER_DUMP),110	SOC15_REG_ENTRY_STR(GC, 0, regCP_MEC_ME2_HEADER_DUMP),111	/* SE status registers */112	SOC15_REG_ENTRY_STR(GC, 0, regGRBM_STATUS_SE0),113	SOC15_REG_ENTRY_STR(GC, 0, regGRBM_STATUS_SE1),114	SOC15_REG_ENTRY_STR(GC, 0, regGRBM_STATUS_SE2),115	SOC15_REG_ENTRY_STR(GC, 0, regGRBM_STATUS_SE3)116};117 118static const struct amdgpu_hwip_reg_entry gc_cp_reg_list_9_4_3[] = {119	/* compute queue registers */120	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_VMID),121	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_ACTIVE),122	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_PERSISTENT_STATE),123	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_PIPE_PRIORITY),124	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_QUEUE_PRIORITY),125	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_QUANTUM),126	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_PQ_BASE),127	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_PQ_BASE_HI),128	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_PQ_RPTR),129	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_PQ_WPTR_POLL_ADDR),130	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_PQ_WPTR_POLL_ADDR_HI),131	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_PQ_DOORBELL_CONTROL),132	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_PQ_CONTROL),133	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_IB_BASE_ADDR),134	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_IB_BASE_ADDR_HI),135	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_IB_RPTR),136	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_IB_CONTROL),137	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_DEQUEUE_REQUEST),138	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_EOP_BASE_ADDR),139	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_EOP_BASE_ADDR_HI),140	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_EOP_CONTROL),141	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_EOP_RPTR),142	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_EOP_WPTR),143	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_EOP_EVENTS),144	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_CTX_SAVE_BASE_ADDR_LO),145	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_CTX_SAVE_BASE_ADDR_HI),146	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_CTX_SAVE_CONTROL),147	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_CNTL_STACK_OFFSET),148	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_CNTL_STACK_SIZE),149	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_WG_STATE_OFFSET),150	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_CTX_SAVE_SIZE),151	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_GDS_RESOURCE_STATE),152	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_ERROR),153	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_EOP_WPTR_MEM),154	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_PQ_WPTR_LO),155	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_PQ_WPTR_HI),156	SOC15_REG_ENTRY_STR(GC, 0, regCP_HQD_GFX_STATUS),157};158 159struct amdgpu_gfx_ras gfx_v9_4_3_ras;160 161static void gfx_v9_4_3_set_ring_funcs(struct amdgpu_device *adev);162static void gfx_v9_4_3_set_irq_funcs(struct amdgpu_device *adev);163static void gfx_v9_4_3_set_gds_init(struct amdgpu_device *adev);164static void gfx_v9_4_3_set_rlc_funcs(struct amdgpu_device *adev);165static int gfx_v9_4_3_get_cu_info(struct amdgpu_device *adev,166				struct amdgpu_cu_info *cu_info);167static void gfx_v9_4_3_xcc_set_safe_mode(struct amdgpu_device *adev, int xcc_id);168static void gfx_v9_4_3_xcc_unset_safe_mode(struct amdgpu_device *adev, int xcc_id);169 170static void gfx_v9_4_3_kiq_set_resources(struct amdgpu_ring *kiq_ring,171				uint64_t queue_mask)172{173	struct amdgpu_device *adev = kiq_ring->adev;174	u64 shader_mc_addr;175 176	/* Cleaner shader MC address */177	shader_mc_addr = adev->gfx.cleaner_shader_gpu_addr >> 8;178 179	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_SET_RESOURCES, 6));180	amdgpu_ring_write(kiq_ring,181		PACKET3_SET_RESOURCES_VMID_MASK(0) |182		/* vmid_mask:0* queue_type:0 (KIQ) */183		PACKET3_SET_RESOURCES_QUEUE_TYPE(0));184	amdgpu_ring_write(kiq_ring,185			lower_32_bits(queue_mask));	/* queue mask lo */186	amdgpu_ring_write(kiq_ring,187			upper_32_bits(queue_mask));	/* queue mask hi */188	amdgpu_ring_write(kiq_ring, lower_32_bits(shader_mc_addr)); /* cleaner shader addr lo */189	amdgpu_ring_write(kiq_ring, upper_32_bits(shader_mc_addr)); /* cleaner shader addr hi */190	amdgpu_ring_write(kiq_ring, 0);	/* oac mask */191	amdgpu_ring_write(kiq_ring, 0);	/* gds heap base:0, gds heap size:0 */192}193 194static void gfx_v9_4_3_kiq_map_queues(struct amdgpu_ring *kiq_ring,195				 struct amdgpu_ring *ring)196{197	struct amdgpu_device *adev = kiq_ring->adev;198	uint64_t mqd_addr = amdgpu_bo_gpu_offset(ring->mqd_obj);199	uint64_t wptr_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4);200	uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0;201 202	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_MAP_QUEUES, 5));203	/* Q_sel:0, vmid:0, vidmem: 1, engine:0, num_Q:1*/204	amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */205			 PACKET3_MAP_QUEUES_QUEUE_SEL(0) | /* Queue_Sel */206			 PACKET3_MAP_QUEUES_VMID(0) | /* VMID */207			 PACKET3_MAP_QUEUES_QUEUE(ring->queue) |208			 PACKET3_MAP_QUEUES_PIPE(ring->pipe) |209			 PACKET3_MAP_QUEUES_ME((ring->me == 1 ? 0 : 1)) |210			 /*queue_type: normal compute queue */211			 PACKET3_MAP_QUEUES_QUEUE_TYPE(0) |212			 /* alloc format: all_on_one_pipe */213			 PACKET3_MAP_QUEUES_ALLOC_FORMAT(0) |214			 PACKET3_MAP_QUEUES_ENGINE_SEL(eng_sel) |215			 /* num_queues: must be 1 */216			 PACKET3_MAP_QUEUES_NUM_QUEUES(1));217	amdgpu_ring_write(kiq_ring,218			PACKET3_MAP_QUEUES_DOORBELL_OFFSET(ring->doorbell_index));219	amdgpu_ring_write(kiq_ring, lower_32_bits(mqd_addr));220	amdgpu_ring_write(kiq_ring, upper_32_bits(mqd_addr));221	amdgpu_ring_write(kiq_ring, lower_32_bits(wptr_addr));222	amdgpu_ring_write(kiq_ring, upper_32_bits(wptr_addr));223}224 225static void gfx_v9_4_3_kiq_unmap_queues(struct amdgpu_ring *kiq_ring,226				   struct amdgpu_ring *ring,227				   enum amdgpu_unmap_queues_action action,228				   u64 gpu_addr, u64 seq)229{230	uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0;231 232	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_UNMAP_QUEUES, 4));233	amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */234			  PACKET3_UNMAP_QUEUES_ACTION(action) |235			  PACKET3_UNMAP_QUEUES_QUEUE_SEL(0) |236			  PACKET3_UNMAP_QUEUES_ENGINE_SEL(eng_sel) |237			  PACKET3_UNMAP_QUEUES_NUM_QUEUES(1));238	amdgpu_ring_write(kiq_ring,239			PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0(ring->doorbell_index));240 241	if (action == PREEMPT_QUEUES_NO_UNMAP) {242		amdgpu_ring_write(kiq_ring, lower_32_bits(gpu_addr));243		amdgpu_ring_write(kiq_ring, upper_32_bits(gpu_addr));244		amdgpu_ring_write(kiq_ring, seq);245	} else {246		amdgpu_ring_write(kiq_ring, 0);247		amdgpu_ring_write(kiq_ring, 0);248		amdgpu_ring_write(kiq_ring, 0);249	}250}251 252static void gfx_v9_4_3_kiq_query_status(struct amdgpu_ring *kiq_ring,253				   struct amdgpu_ring *ring,254				   u64 addr,255				   u64 seq)256{257	uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0;258 259	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_QUERY_STATUS, 5));260	amdgpu_ring_write(kiq_ring,261			  PACKET3_QUERY_STATUS_CONTEXT_ID(0) |262			  PACKET3_QUERY_STATUS_INTERRUPT_SEL(0) |263			  PACKET3_QUERY_STATUS_COMMAND(2));264	/* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */265	amdgpu_ring_write(kiq_ring,266			PACKET3_QUERY_STATUS_DOORBELL_OFFSET(ring->doorbell_index) |267			PACKET3_QUERY_STATUS_ENG_SEL(eng_sel));268	amdgpu_ring_write(kiq_ring, lower_32_bits(addr));269	amdgpu_ring_write(kiq_ring, upper_32_bits(addr));270	amdgpu_ring_write(kiq_ring, lower_32_bits(seq));271	amdgpu_ring_write(kiq_ring, upper_32_bits(seq));272}273 274static void gfx_v9_4_3_kiq_invalidate_tlbs(struct amdgpu_ring *kiq_ring,275				uint16_t pasid, uint32_t flush_type,276				bool all_hub)277{278	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_INVALIDATE_TLBS, 0));279	amdgpu_ring_write(kiq_ring,280			PACKET3_INVALIDATE_TLBS_DST_SEL(1) |281			PACKET3_INVALIDATE_TLBS_ALL_HUB(all_hub) |282			PACKET3_INVALIDATE_TLBS_PASID(pasid) |283			PACKET3_INVALIDATE_TLBS_FLUSH_TYPE(flush_type));284}285 286static void gfx_v9_4_3_kiq_reset_hw_queue(struct amdgpu_ring *kiq_ring, uint32_t queue_type,287					  uint32_t me_id, uint32_t pipe_id, uint32_t queue_id,288					  uint32_t xcc_id, uint32_t vmid)289{290	struct amdgpu_device *adev = kiq_ring->adev;291	unsigned i;292 293	/* enter save mode */294	amdgpu_gfx_rlc_enter_safe_mode(adev, xcc_id);295	mutex_lock(&adev->srbm_mutex);296	soc15_grbm_select(adev, me_id, pipe_id, queue_id, 0, xcc_id);297 298	if (queue_type == AMDGPU_RING_TYPE_COMPUTE) {299		WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_DEQUEUE_REQUEST, 0x2);300		WREG32_SOC15(GC, GET_INST(GC, xcc_id), regSPI_COMPUTE_QUEUE_RESET, 0x1);301		/* wait till dequeue take effects */302		for (i = 0; i < adev->usec_timeout; i++) {303			if (!(RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_ACTIVE) & 1))304				break;305			udelay(1);306		}307		if (i >= adev->usec_timeout)308			dev_err(adev->dev, "fail to wait on hqd deactive\n");309	} else {310		dev_err(adev->dev, "reset queue_type(%d) not supported\n\n", queue_type);311	}312 313	soc15_grbm_select(adev, 0, 0, 0, 0, 0);314	mutex_unlock(&adev->srbm_mutex);315	/* exit safe mode */316	amdgpu_gfx_rlc_exit_safe_mode(adev, xcc_id);317}318 319static const struct kiq_pm4_funcs gfx_v9_4_3_kiq_pm4_funcs = {320	.kiq_set_resources = gfx_v9_4_3_kiq_set_resources,321	.kiq_map_queues = gfx_v9_4_3_kiq_map_queues,322	.kiq_unmap_queues = gfx_v9_4_3_kiq_unmap_queues,323	.kiq_query_status = gfx_v9_4_3_kiq_query_status,324	.kiq_invalidate_tlbs = gfx_v9_4_3_kiq_invalidate_tlbs,325	.kiq_reset_hw_queue = gfx_v9_4_3_kiq_reset_hw_queue,326	.set_resources_size = 8,327	.map_queues_size = 7,328	.unmap_queues_size = 6,329	.query_status_size = 7,330	.invalidate_tlbs_size = 2,331};332 333static void gfx_v9_4_3_set_kiq_pm4_funcs(struct amdgpu_device *adev)334{335	int i, num_xcc;336 337	num_xcc = NUM_XCC(adev->gfx.xcc_mask);338	for (i = 0; i < num_xcc; i++)339		adev->gfx.kiq[i].pmf = &gfx_v9_4_3_kiq_pm4_funcs;340}341 342static void gfx_v9_4_3_init_golden_registers(struct amdgpu_device *adev)343{344	int i, num_xcc, dev_inst;345 346	num_xcc = NUM_XCC(adev->gfx.xcc_mask);347	for (i = 0; i < num_xcc; i++) {348		dev_inst = GET_INST(GC, i);349 350		WREG32_SOC15(GC, dev_inst, regGB_ADDR_CONFIG,351			     GOLDEN_GB_ADDR_CONFIG);352		/* Golden settings applied by driver for ASIC with rev_id 0 */353		if (adev->rev_id == 0) {354			WREG32_FIELD15_PREREG(GC, dev_inst, TCP_UTCL1_CNTL1,355					      REDUCE_FIFO_DEPTH_BY_2, 2);356		} else {357			WREG32_FIELD15_PREREG(GC, dev_inst, TCP_UTCL1_CNTL2,358						SPARE, 0x1);359		}360	}361}362 363static uint32_t gfx_v9_4_3_normalize_xcc_reg_offset(uint32_t reg)364{365	uint32_t normalized_reg = NORMALIZE_XCC_REG_OFFSET(reg);366 367	/* If it is an XCC reg, normalize the reg to keep368	   lower 16 bits in local xcc */369 370	if (((normalized_reg >= XCC_REG_RANGE_0_LOW) && (normalized_reg < XCC_REG_RANGE_0_HIGH)) ||371		((normalized_reg >= XCC_REG_RANGE_1_LOW) && (normalized_reg < XCC_REG_RANGE_1_HIGH)))372		return normalized_reg;373	else374		return reg;375}376 377static void gfx_v9_4_3_write_data_to_reg(struct amdgpu_ring *ring, int eng_sel,378				       bool wc, uint32_t reg, uint32_t val)379{380	reg = gfx_v9_4_3_normalize_xcc_reg_offset(reg);381	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));382	amdgpu_ring_write(ring, WRITE_DATA_ENGINE_SEL(eng_sel) |383				WRITE_DATA_DST_SEL(0) |384				(wc ? WR_CONFIRM : 0));385	amdgpu_ring_write(ring, reg);386	amdgpu_ring_write(ring, 0);387	amdgpu_ring_write(ring, val);388}389 390static void gfx_v9_4_3_wait_reg_mem(struct amdgpu_ring *ring, int eng_sel,391				  int mem_space, int opt, uint32_t addr0,392				  uint32_t addr1, uint32_t ref, uint32_t mask,393				  uint32_t inv)394{395	/* Only do the normalization on regspace */396	if (mem_space == 0) {397		addr0 = gfx_v9_4_3_normalize_xcc_reg_offset(addr0);398		addr1 = gfx_v9_4_3_normalize_xcc_reg_offset(addr1);399	}400 401	amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));402	amdgpu_ring_write(ring,403				 /* memory (1) or register (0) */404				 (WAIT_REG_MEM_MEM_SPACE(mem_space) |405				 WAIT_REG_MEM_OPERATION(opt) | /* wait */406				 WAIT_REG_MEM_FUNCTION(3) |  /* equal */407				 WAIT_REG_MEM_ENGINE(eng_sel)));408 409	if (mem_space)410		BUG_ON(addr0 & 0x3); /* Dword align */411	amdgpu_ring_write(ring, addr0);412	amdgpu_ring_write(ring, addr1);413	amdgpu_ring_write(ring, ref);414	amdgpu_ring_write(ring, mask);415	amdgpu_ring_write(ring, inv); /* poll interval */416}417 418static int gfx_v9_4_3_ring_test_ring(struct amdgpu_ring *ring)419{420	uint32_t scratch_reg0_offset, xcc_offset;421	struct amdgpu_device *adev = ring->adev;422	uint32_t tmp = 0;423	unsigned i;424	int r;425 426	/* Use register offset which is local to XCC in the packet */427	xcc_offset = SOC15_REG_OFFSET(GC, 0, regSCRATCH_REG0);428	scratch_reg0_offset = SOC15_REG_OFFSET(GC, GET_INST(GC, ring->xcc_id), regSCRATCH_REG0);429	WREG32(scratch_reg0_offset, 0xCAFEDEAD);430	tmp = RREG32(scratch_reg0_offset);431 432	r = amdgpu_ring_alloc(ring, 3);433	if (r)434		return r;435 436	amdgpu_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));437	amdgpu_ring_write(ring, xcc_offset - PACKET3_SET_UCONFIG_REG_START);438	amdgpu_ring_write(ring, 0xDEADBEEF);439	amdgpu_ring_commit(ring);440 441	for (i = 0; i < adev->usec_timeout; i++) {442		tmp = RREG32(scratch_reg0_offset);443		if (tmp == 0xDEADBEEF)444			break;445		udelay(1);446	}447 448	if (i >= adev->usec_timeout)449		r = -ETIMEDOUT;450	return r;451}452 453static int gfx_v9_4_3_ring_test_ib(struct amdgpu_ring *ring, long timeout)454{455	struct amdgpu_device *adev = ring->adev;456	struct amdgpu_ib ib;457	struct dma_fence *f = NULL;458 459	unsigned index;460	uint64_t gpu_addr;461	uint32_t tmp;462	long r;463 464	r = amdgpu_device_wb_get(adev, &index);465	if (r)466		return r;467 468	gpu_addr = adev->wb.gpu_addr + (index * 4);469	adev->wb.wb[index] = cpu_to_le32(0xCAFEDEAD);470	memset(&ib, 0, sizeof(ib));471 472	r = amdgpu_ib_get(adev, NULL, 20, AMDGPU_IB_POOL_DIRECT, &ib);473	if (r)474		goto err1;475 476	ib.ptr[0] = PACKET3(PACKET3_WRITE_DATA, 3);477	ib.ptr[1] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM;478	ib.ptr[2] = lower_32_bits(gpu_addr);479	ib.ptr[3] = upper_32_bits(gpu_addr);480	ib.ptr[4] = 0xDEADBEEF;481	ib.length_dw = 5;482 483	r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);484	if (r)485		goto err2;486 487	r = dma_fence_wait_timeout(f, false, timeout);488	if (r == 0) {489		r = -ETIMEDOUT;490		goto err2;491	} else if (r < 0) {492		goto err2;493	}494 495	tmp = adev->wb.wb[index];496	if (tmp == 0xDEADBEEF)497		r = 0;498	else499		r = -EINVAL;500 501err2:502	amdgpu_ib_free(adev, &ib, NULL);503	dma_fence_put(f);504err1:505	amdgpu_device_wb_free(adev, index);506	return r;507}508 509 510/* This value might differs per partition */511static uint64_t gfx_v9_4_3_get_gpu_clock_counter(struct amdgpu_device *adev)512{513	uint64_t clock;514 515	mutex_lock(&adev->gfx.gpu_clock_mutex);516	WREG32_SOC15(GC, GET_INST(GC, 0), regRLC_CAPTURE_GPU_CLOCK_COUNT, 1);517	clock = (uint64_t)RREG32_SOC15(GC, GET_INST(GC, 0), regRLC_GPU_CLOCK_COUNT_LSB) |518		((uint64_t)RREG32_SOC15(GC, GET_INST(GC, 0), regRLC_GPU_CLOCK_COUNT_MSB) << 32ULL);519	mutex_unlock(&adev->gfx.gpu_clock_mutex);520 521	return clock;522}523 524static void gfx_v9_4_3_free_microcode(struct amdgpu_device *adev)525{526	amdgpu_ucode_release(&adev->gfx.pfp_fw);527	amdgpu_ucode_release(&adev->gfx.me_fw);528	amdgpu_ucode_release(&adev->gfx.ce_fw);529	amdgpu_ucode_release(&adev->gfx.rlc_fw);530	amdgpu_ucode_release(&adev->gfx.mec_fw);531	amdgpu_ucode_release(&adev->gfx.mec2_fw);532 533	kfree(adev->gfx.rlc.register_list_format);534}535 536static int gfx_v9_4_3_init_rlc_microcode(struct amdgpu_device *adev,537					  const char *chip_name)538{539	int err;540	const struct rlc_firmware_header_v2_0 *rlc_hdr;541	uint16_t version_major;542	uint16_t version_minor;543 544 545	err = amdgpu_ucode_request(adev, &adev->gfx.rlc_fw,546				   "amdgpu/%s_rlc.bin", chip_name);547	if (err)548		goto out;549	rlc_hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data;550 551	version_major = le16_to_cpu(rlc_hdr->header.header_version_major);552	version_minor = le16_to_cpu(rlc_hdr->header.header_version_minor);553	err = amdgpu_gfx_rlc_init_microcode(adev, version_major, version_minor);554out:555	if (err)556		amdgpu_ucode_release(&adev->gfx.rlc_fw);557 558	return err;559}560 561static bool gfx_v9_4_3_should_disable_gfxoff(struct pci_dev *pdev)562{563	return true;564}565 566static void gfx_v9_4_3_check_if_need_gfxoff(struct amdgpu_device *adev)567{568	if (gfx_v9_4_3_should_disable_gfxoff(adev->pdev))569		adev->pm.pp_feature &= ~PP_GFXOFF_MASK;570}571 572static int gfx_v9_4_3_init_cp_compute_microcode(struct amdgpu_device *adev,573					  const char *chip_name)574{575	int err;576 577	err = amdgpu_ucode_request(adev, &adev->gfx.mec_fw,578				   "amdgpu/%s_mec.bin", chip_name);579	if (err)580		goto out;581	amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC1);582	amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC1_JT);583 584	adev->gfx.mec2_fw_version = adev->gfx.mec_fw_version;585	adev->gfx.mec2_feature_version = adev->gfx.mec_feature_version;586 587	gfx_v9_4_3_check_if_need_gfxoff(adev);588 589out:590	if (err)591		amdgpu_ucode_release(&adev->gfx.mec_fw);592	return err;593}594 595static int gfx_v9_4_3_init_microcode(struct amdgpu_device *adev)596{597	char ucode_prefix[15];598	int r;599 600	amdgpu_ucode_ip_version_decode(adev, GC_HWIP, ucode_prefix, sizeof(ucode_prefix));601 602	r = gfx_v9_4_3_init_rlc_microcode(adev, ucode_prefix);603	if (r)604		return r;605 606	r = gfx_v9_4_3_init_cp_compute_microcode(adev, ucode_prefix);607	if (r)608		return r;609 610	return r;611}612 613static void gfx_v9_4_3_mec_fini(struct amdgpu_device *adev)614{615	amdgpu_bo_free_kernel(&adev->gfx.mec.hpd_eop_obj, NULL, NULL);616	amdgpu_bo_free_kernel(&adev->gfx.mec.mec_fw_obj, NULL, NULL);617}618 619static int gfx_v9_4_3_mec_init(struct amdgpu_device *adev)620{621	int r, i, num_xcc;622	u32 *hpd;623	const __le32 *fw_data;624	unsigned fw_size;625	u32 *fw;626	size_t mec_hpd_size;627 628	const struct gfx_firmware_header_v1_0 *mec_hdr;629 630	num_xcc = NUM_XCC(adev->gfx.xcc_mask);631	for (i = 0; i < num_xcc; i++)632		bitmap_zero(adev->gfx.mec_bitmap[i].queue_bitmap,633			AMDGPU_MAX_COMPUTE_QUEUES);634 635	/* take ownership of the relevant compute queues */636	amdgpu_gfx_compute_queue_acquire(adev);637	mec_hpd_size =638		adev->gfx.num_compute_rings * num_xcc * GFX9_MEC_HPD_SIZE;639	if (mec_hpd_size) {640		r = amdgpu_bo_create_reserved(adev, mec_hpd_size, PAGE_SIZE,641					      AMDGPU_GEM_DOMAIN_VRAM |642					      AMDGPU_GEM_DOMAIN_GTT,643					      &adev->gfx.mec.hpd_eop_obj,644					      &adev->gfx.mec.hpd_eop_gpu_addr,645					      (void **)&hpd);646		if (r) {647			dev_warn(adev->dev, "(%d) create HDP EOP bo failed\n", r);648			gfx_v9_4_3_mec_fini(adev);649			return r;650		}651 652		if (amdgpu_emu_mode == 1) {653			for (i = 0; i < mec_hpd_size / 4; i++) {654				memset((void *)(hpd + i), 0, 4);655				if (i % 50 == 0)656					msleep(1);657			}658		} else {659			memset(hpd, 0, mec_hpd_size);660		}661 662		amdgpu_bo_kunmap(adev->gfx.mec.hpd_eop_obj);663		amdgpu_bo_unreserve(adev->gfx.mec.hpd_eop_obj);664	}665 666	mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;667 668	fw_data = (const __le32 *)669		(adev->gfx.mec_fw->data +670		 le32_to_cpu(mec_hdr->header.ucode_array_offset_bytes));671	fw_size = le32_to_cpu(mec_hdr->header.ucode_size_bytes);672 673	r = amdgpu_bo_create_reserved(adev, mec_hdr->header.ucode_size_bytes,674				      PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT,675				      &adev->gfx.mec.mec_fw_obj,676				      &adev->gfx.mec.mec_fw_gpu_addr,677				      (void **)&fw);678	if (r) {679		dev_warn(adev->dev, "(%d) create mec firmware bo failed\n", r);680		gfx_v9_4_3_mec_fini(adev);681		return r;682	}683 684	memcpy(fw, fw_data, fw_size);685 686	amdgpu_bo_kunmap(adev->gfx.mec.mec_fw_obj);687	amdgpu_bo_unreserve(adev->gfx.mec.mec_fw_obj);688 689	return 0;690}691 692static void gfx_v9_4_3_xcc_select_se_sh(struct amdgpu_device *adev, u32 se_num,693					u32 sh_num, u32 instance, int xcc_id)694{695	u32 data;696 697	if (instance == 0xffffffff)698		data = REG_SET_FIELD(0, GRBM_GFX_INDEX,699				     INSTANCE_BROADCAST_WRITES, 1);700	else701		data = REG_SET_FIELD(0, GRBM_GFX_INDEX,702				     INSTANCE_INDEX, instance);703 704	if (se_num == 0xffffffff)705		data = REG_SET_FIELD(data, GRBM_GFX_INDEX,706				     SE_BROADCAST_WRITES, 1);707	else708		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num);709 710	if (sh_num == 0xffffffff)711		data = REG_SET_FIELD(data, GRBM_GFX_INDEX,712				     SH_BROADCAST_WRITES, 1);713	else714		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num);715 716	WREG32_SOC15_RLC_SHADOW_EX(reg, GC, GET_INST(GC, xcc_id), regGRBM_GFX_INDEX, data);717}718 719static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd, uint32_t wave, uint32_t address)720{721	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regSQ_IND_INDEX,722		(wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |723		(simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |724		(address << SQ_IND_INDEX__INDEX__SHIFT) |725		(SQ_IND_INDEX__FORCE_READ_MASK));726	return RREG32_SOC15(GC, GET_INST(GC, xcc_id), regSQ_IND_DATA);727}728 729static void wave_read_regs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,730			   uint32_t wave, uint32_t thread,731			   uint32_t regno, uint32_t num, uint32_t *out)732{733	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regSQ_IND_INDEX,734		(wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |735		(simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |736		(regno << SQ_IND_INDEX__INDEX__SHIFT) |737		(thread << SQ_IND_INDEX__THREAD_ID__SHIFT) |738		(SQ_IND_INDEX__FORCE_READ_MASK) |739		(SQ_IND_INDEX__AUTO_INCR_MASK));740	while (num--)741		*(out++) = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regSQ_IND_DATA);742}743 744static void gfx_v9_4_3_read_wave_data(struct amdgpu_device *adev,745				      uint32_t xcc_id, uint32_t simd, uint32_t wave,746				      uint32_t *dst, int *no_fields)747{748	/* type 1 wave data */749	dst[(*no_fields)++] = 1;750	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_STATUS);751	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_PC_LO);752	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_PC_HI);753	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_EXEC_LO);754	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_EXEC_HI);755	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_HW_ID);756	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_INST_DW0);757	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_INST_DW1);758	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_GPR_ALLOC);759	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_LDS_ALLOC);760	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_TRAPSTS);761	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_IB_STS);762	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_IB_DBG0);763	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_M0);764	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_MODE);765}766 767static void gfx_v9_4_3_read_wave_sgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,768				       uint32_t wave, uint32_t start,769				       uint32_t size, uint32_t *dst)770{771	wave_read_regs(adev, xcc_id, simd, wave, 0,772		       start + SQIND_WAVE_SGPRS_OFFSET, size, dst);773}774 775static void gfx_v9_4_3_read_wave_vgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,776				       uint32_t wave, uint32_t thread,777				       uint32_t start, uint32_t size,778				       uint32_t *dst)779{780	wave_read_regs(adev, xcc_id, simd, wave, thread,781		       start + SQIND_WAVE_VGPRS_OFFSET, size, dst);782}783 784static void gfx_v9_4_3_select_me_pipe_q(struct amdgpu_device *adev,785					u32 me, u32 pipe, u32 q, u32 vm, u32 xcc_id)786{787	soc15_grbm_select(adev, me, pipe, q, vm, GET_INST(GC, xcc_id));788}789 790static int gfx_v9_4_3_get_xccs_per_xcp(struct amdgpu_device *adev)791{792	u32 xcp_ctl;793 794	/* Value is expected to be the same on all, fetch from first instance */795	xcp_ctl = RREG32_SOC15(GC, GET_INST(GC, 0), regCP_HYP_XCP_CTL);796 797	return REG_GET_FIELD(xcp_ctl, CP_HYP_XCP_CTL, NUM_XCC_IN_XCP);798}799 800static int gfx_v9_4_3_switch_compute_partition(struct amdgpu_device *adev,801						int num_xccs_per_xcp)802{803	int ret, i, num_xcc;804	u32 tmp = 0;805 806	if (adev->psp.funcs) {807		ret = psp_spatial_partition(&adev->psp,808					    NUM_XCC(adev->gfx.xcc_mask) /809						    num_xccs_per_xcp);810		if (ret)811			return ret;812	} else {813		num_xcc = NUM_XCC(adev->gfx.xcc_mask);814 815		for (i = 0; i < num_xcc; i++) {816			tmp = REG_SET_FIELD(tmp, CP_HYP_XCP_CTL, NUM_XCC_IN_XCP,817					    num_xccs_per_xcp);818			tmp = REG_SET_FIELD(tmp, CP_HYP_XCP_CTL, VIRTUAL_XCC_ID,819					    i % num_xccs_per_xcp);820			WREG32_SOC15(GC, GET_INST(GC, i), regCP_HYP_XCP_CTL,821				     tmp);822		}823		ret = 0;824	}825 826	adev->gfx.num_xcc_per_xcp = num_xccs_per_xcp;827 828	return ret;829}830 831static int gfx_v9_4_3_ih_to_xcc_inst(struct amdgpu_device *adev, int ih_node)832{833	int xcc;834 835	xcc = hweight8(adev->gfx.xcc_mask & GENMASK(ih_node / 2, 0));836	if (!xcc) {837		dev_err(adev->dev, "Couldn't find xcc mapping from IH node");838		return -EINVAL;839	}840 841	return xcc - 1;842}843 844static const struct amdgpu_gfx_funcs gfx_v9_4_3_gfx_funcs = {845	.get_gpu_clock_counter = &gfx_v9_4_3_get_gpu_clock_counter,846	.select_se_sh = &gfx_v9_4_3_xcc_select_se_sh,847	.read_wave_data = &gfx_v9_4_3_read_wave_data,848	.read_wave_sgprs = &gfx_v9_4_3_read_wave_sgprs,849	.read_wave_vgprs = &gfx_v9_4_3_read_wave_vgprs,850	.select_me_pipe_q = &gfx_v9_4_3_select_me_pipe_q,851	.switch_partition_mode = &gfx_v9_4_3_switch_compute_partition,852	.ih_node_to_logical_xcc = &gfx_v9_4_3_ih_to_xcc_inst,853	.get_xccs_per_xcp = &gfx_v9_4_3_get_xccs_per_xcp,854};855 856static int gfx_v9_4_3_aca_bank_parser(struct aca_handle *handle,857				      struct aca_bank *bank, enum aca_smu_type type,858				      void *data)859{860	struct aca_bank_info info;861	u64 misc0;862	u32 instlo;863	int ret;864 865	ret = aca_bank_info_decode(bank, &info);866	if (ret)867		return ret;868 869	/* NOTE: overwrite info.die_id with xcd id for gfx */870	instlo = ACA_REG__IPID__INSTANCEIDLO(bank->regs[ACA_REG_IDX_IPID]);871	instlo &= GENMASK(31, 1);872	info.die_id = instlo == mmSMNAID_XCD0_MCA_SMU ? 0 : 1;873 874	misc0 = bank->regs[ACA_REG_IDX_MISC0];875 876	switch (type) {877	case ACA_SMU_TYPE_UE:878		ret = aca_error_cache_log_bank_error(handle, &info,879						     ACA_ERROR_TYPE_UE, 1ULL);880		break;881	case ACA_SMU_TYPE_CE:882		ret = aca_error_cache_log_bank_error(handle, &info,883						     ACA_ERROR_TYPE_CE, ACA_REG__MISC0__ERRCNT(misc0));884		break;885	default:886		return -EINVAL;887	}888 889	return ret;890}891 892static bool gfx_v9_4_3_aca_bank_is_valid(struct aca_handle *handle, struct aca_bank *bank,893					 enum aca_smu_type type, void *data)894{895	u32 instlo;896 897	instlo = ACA_REG__IPID__INSTANCEIDLO(bank->regs[ACA_REG_IDX_IPID]);898	instlo &= GENMASK(31, 1);899	switch (instlo) {900	case mmSMNAID_XCD0_MCA_SMU:901	case mmSMNAID_XCD1_MCA_SMU:902	case mmSMNXCD_XCD0_MCA_SMU:903		return true;904	default:905		break;906	}907 908	return false;909}910 911static const struct aca_bank_ops gfx_v9_4_3_aca_bank_ops = {912	.aca_bank_parser = gfx_v9_4_3_aca_bank_parser,913	.aca_bank_is_valid = gfx_v9_4_3_aca_bank_is_valid,914};915 916static const struct aca_info gfx_v9_4_3_aca_info = {917	.hwip = ACA_HWIP_TYPE_SMU,918	.mask = ACA_ERROR_UE_MASK | ACA_ERROR_CE_MASK,919	.bank_ops = &gfx_v9_4_3_aca_bank_ops,920};921 922static int gfx_v9_4_3_gpu_early_init(struct amdgpu_device *adev)923{924	u32 gb_addr_config;925 926	adev->gfx.funcs = &gfx_v9_4_3_gfx_funcs;927	adev->gfx.ras = &gfx_v9_4_3_ras;928 929	switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {930	case IP_VERSION(9, 4, 3):931	case IP_VERSION(9, 4, 4):932		adev->gfx.config.max_hw_contexts = 8;933		adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;934		adev->gfx.config.sc_prim_fifo_size_backend = 0x100;935		adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;936		adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0;937		gb_addr_config = RREG32_SOC15(GC, GET_INST(GC, 0), regGB_ADDR_CONFIG);938		break;939	default:940		BUG();941		break;942	}943 944	adev->gfx.config.gb_addr_config = gb_addr_config;945 946	adev->gfx.config.gb_addr_config_fields.num_pipes = 1 <<947			REG_GET_FIELD(948					adev->gfx.config.gb_addr_config,949					GB_ADDR_CONFIG,950					NUM_PIPES);951 952	adev->gfx.config.max_tile_pipes =953		adev->gfx.config.gb_addr_config_fields.num_pipes;954 955	adev->gfx.config.gb_addr_config_fields.num_banks = 1 <<956			REG_GET_FIELD(957					adev->gfx.config.gb_addr_config,958					GB_ADDR_CONFIG,959					NUM_BANKS);960	adev->gfx.config.gb_addr_config_fields.max_compress_frags = 1 <<961			REG_GET_FIELD(962					adev->gfx.config.gb_addr_config,963					GB_ADDR_CONFIG,964					MAX_COMPRESSED_FRAGS);965	adev->gfx.config.gb_addr_config_fields.num_rb_per_se = 1 <<966			REG_GET_FIELD(967					adev->gfx.config.gb_addr_config,968					GB_ADDR_CONFIG,969					NUM_RB_PER_SE);970	adev->gfx.config.gb_addr_config_fields.num_se = 1 <<971			REG_GET_FIELD(972					adev->gfx.config.gb_addr_config,973					GB_ADDR_CONFIG,974					NUM_SHADER_ENGINES);975	adev->gfx.config.gb_addr_config_fields.pipe_interleave_size = 1 << (8 +976			REG_GET_FIELD(977					adev->gfx.config.gb_addr_config,978					GB_ADDR_CONFIG,979					PIPE_INTERLEAVE_SIZE));980 981	return 0;982}983 984static int gfx_v9_4_3_compute_ring_init(struct amdgpu_device *adev, int ring_id,985				        int xcc_id, int mec, int pipe, int queue)986{987	unsigned irq_type;988	struct amdgpu_ring *ring = &adev->gfx.compute_ring[ring_id];989	unsigned int hw_prio;990	uint32_t xcc_doorbell_start;991 992	ring = &adev->gfx.compute_ring[xcc_id * adev->gfx.num_compute_rings +993				       ring_id];994 995	/* mec0 is me1 */996	ring->xcc_id = xcc_id;997	ring->me = mec + 1;998	ring->pipe = pipe;999	ring->queue = queue;1000 1001	ring->ring_obj = NULL;1002	ring->use_doorbell = true;1003	xcc_doorbell_start = adev->doorbell_index.mec_ring0 +1004			     xcc_id * adev->doorbell_index.xcc_doorbell_range;1005	ring->doorbell_index = (xcc_doorbell_start + ring_id) << 1;1006	ring->eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr +1007			     (ring_id + xcc_id * adev->gfx.num_compute_rings) *1008				     GFX9_MEC_HPD_SIZE;1009	ring->vm_hub = AMDGPU_GFXHUB(xcc_id);1010	sprintf(ring->name, "comp_%d.%d.%d.%d",1011			ring->xcc_id, ring->me, ring->pipe, ring->queue);1012 1013	irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP1014		+ ((ring->me - 1) * adev->gfx.mec.num_pipe_per_mec)1015		+ ring->pipe;1016	hw_prio = amdgpu_gfx_is_high_priority_compute_queue(adev, ring) ?1017			AMDGPU_GFX_PIPE_PRIO_HIGH : AMDGPU_GFX_PIPE_PRIO_NORMAL;1018	/* type-2 packets are deprecated on MEC, use type-3 instead */1019	return amdgpu_ring_init(adev, ring, 1024, &adev->gfx.eop_irq, irq_type,1020				hw_prio, NULL);1021}1022 1023static void gfx_v9_4_3_alloc_ip_dump(struct amdgpu_device *adev)1024{1025	uint32_t reg_count = ARRAY_SIZE(gc_reg_list_9_4_3);1026	uint32_t *ptr, num_xcc, inst;1027 1028	num_xcc = NUM_XCC(adev->gfx.xcc_mask);1029 1030	ptr = kcalloc(reg_count * num_xcc, sizeof(uint32_t), GFP_KERNEL);1031	if (!ptr) {1032		DRM_ERROR("Failed to allocate memory for GFX IP Dump\n");1033		adev->gfx.ip_dump_core = NULL;1034	} else {1035		adev->gfx.ip_dump_core = ptr;1036	}1037 1038	/* Allocate memory for compute queue registers for all the instances */1039	reg_count = ARRAY_SIZE(gc_cp_reg_list_9_4_3);1040	inst = adev->gfx.mec.num_mec * adev->gfx.mec.num_pipe_per_mec *1041		adev->gfx.mec.num_queue_per_pipe;1042 1043	ptr = kcalloc(reg_count * inst * num_xcc, sizeof(uint32_t), GFP_KERNEL);1044	if (!ptr) {1045		DRM_ERROR("Failed to allocate memory for Compute Queues IP Dump\n");1046		adev->gfx.ip_dump_compute_queues = NULL;1047	} else {1048		adev->gfx.ip_dump_compute_queues = ptr;1049	}1050}1051 1052static int gfx_v9_4_3_sw_init(void *handle)1053{1054	int i, j, k, r, ring_id, xcc_id, num_xcc;1055	struct amdgpu_device *adev = (struct amdgpu_device *)handle;1056 1057	switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {1058	case IP_VERSION(9, 4, 3):1059	case IP_VERSION(9, 4, 4):1060		adev->gfx.cleaner_shader_ptr = gfx_9_4_3_cleaner_shader_hex;1061		adev->gfx.cleaner_shader_size = sizeof(gfx_9_4_3_cleaner_shader_hex);1062		if (adev->gfx.mec_fw_version >= 153) {1063			adev->gfx.enable_cleaner_shader = true;1064			r = amdgpu_gfx_cleaner_shader_sw_init(adev, adev->gfx.cleaner_shader_size);1065			if (r) {1066				adev->gfx.enable_cleaner_shader = false;1067				dev_err(adev->dev, "Failed to initialize cleaner shader\n");1068			}1069		}1070		break;1071	default:1072		adev->gfx.enable_cleaner_shader = false;1073		break;1074	}1075 1076	adev->gfx.mec.num_mec = 2;1077	adev->gfx.mec.num_pipe_per_mec = 4;1078	adev->gfx.mec.num_queue_per_pipe = 8;1079 1080	num_xcc = NUM_XCC(adev->gfx.xcc_mask);1081 1082	/* EOP Event */1083	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_EOP_INTERRUPT, &adev->gfx.eop_irq);1084	if (r)1085		return r;1086 1087	/* Bad opcode Event */1088	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP,1089			      GFX_9_0__SRCID__CP_BAD_OPCODE_ERROR,1090			      &adev->gfx.bad_op_irq);1091	if (r)1092		return r;1093 1094	/* Privileged reg */1095	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_PRIV_REG_FAULT,1096			      &adev->gfx.priv_reg_irq);1097	if (r)1098		return r;1099 1100	/* Privileged inst */1101	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_PRIV_INSTR_FAULT,1102			      &adev->gfx.priv_inst_irq);1103	if (r)1104		return r;1105 1106	adev->gfx.gfx_current_status = AMDGPU_GFX_NORMAL_MODE;1107 1108	r = adev->gfx.rlc.funcs->init(adev);1109	if (r) {1110		DRM_ERROR("Failed to init rlc BOs!\n");1111		return r;1112	}1113 1114	r = gfx_v9_4_3_mec_init(adev);1115	if (r) {1116		DRM_ERROR("Failed to init MEC BOs!\n");1117		return r;1118	}1119 1120	/* set up the compute queues - allocate horizontally across pipes */1121	for (xcc_id = 0; xcc_id < num_xcc; xcc_id++) {1122		ring_id = 0;1123		for (i = 0; i < adev->gfx.mec.num_mec; ++i) {1124			for (j = 0; j < adev->gfx.mec.num_queue_per_pipe; j++) {1125				for (k = 0; k < adev->gfx.mec.num_pipe_per_mec;1126				     k++) {1127					if (!amdgpu_gfx_is_mec_queue_enabled(1128							adev, xcc_id, i, k, j))1129						continue;1130 1131					r = gfx_v9_4_3_compute_ring_init(adev,1132								       ring_id,1133								       xcc_id,1134								       i, k, j);1135					if (r)1136						return r;1137 1138					ring_id++;1139				}1140			}1141		}1142 1143		r = amdgpu_gfx_kiq_init(adev, GFX9_MEC_HPD_SIZE, xcc_id);1144		if (r) {1145			DRM_ERROR("Failed to init KIQ BOs!\n");1146			return r;1147		}1148 1149		r = amdgpu_gfx_kiq_init_ring(adev, xcc_id);1150		if (r)1151			return r;1152 1153		/* create MQD for all compute queues as wel as KIQ for SRIOV case */1154		r = amdgpu_gfx_mqd_sw_init(adev,1155				sizeof(struct v9_mqd_allocation), xcc_id);1156		if (r)1157			return r;1158	}1159 1160	r = gfx_v9_4_3_gpu_early_init(adev);1161	if (r)1162		return r;1163 1164	r = amdgpu_gfx_ras_sw_init(adev);1165	if (r)1166		return r;1167 1168 1169	if (!amdgpu_sriov_vf(adev)) {1170		r = amdgpu_gfx_sysfs_init(adev);1171		if (r)1172			return r;1173	}1174 1175	gfx_v9_4_3_alloc_ip_dump(adev);1176 1177	r = amdgpu_gfx_sysfs_isolation_shader_init(adev);1178	if (r)1179		return r;1180 1181	return 0;1182}1183 1184static int gfx_v9_4_3_sw_fini(void *handle)1185{1186	int i, num_xcc;1187	struct amdgpu_device *adev = (struct amdgpu_device *)handle;1188 1189	num_xcc = NUM_XCC(adev->gfx.xcc_mask);1190	for (i = 0; i < adev->gfx.num_compute_rings * num_xcc; i++)1191		amdgpu_ring_fini(&adev->gfx.compute_ring[i]);1192 1193	for (i = 0; i < num_xcc; i++) {1194		amdgpu_gfx_mqd_sw_fini(adev, i);1195		amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq[i].ring);1196		amdgpu_gfx_kiq_fini(adev, i);1197	}1198 1199	amdgpu_gfx_cleaner_shader_sw_fini(adev);1200 1201	gfx_v9_4_3_mec_fini(adev);1202	amdgpu_bo_unref(&adev->gfx.rlc.clear_state_obj);1203	gfx_v9_4_3_free_microcode(adev);1204	if (!amdgpu_sriov_vf(adev))1205		amdgpu_gfx_sysfs_fini(adev);1206	amdgpu_gfx_sysfs_isolation_shader_fini(adev);1207 1208	kfree(adev->gfx.ip_dump_core);1209	kfree(adev->gfx.ip_dump_compute_queues);1210 1211	return 0;1212}1213 1214#define DEFAULT_SH_MEM_BASES	(0x6000)1215static void gfx_v9_4_3_xcc_init_compute_vmid(struct amdgpu_device *adev,1216					     int xcc_id)1217{1218	int i;1219	uint32_t sh_mem_config;1220	uint32_t sh_mem_bases;1221	uint32_t data;1222 1223	/*1224	 * Configure apertures:1225	 * LDS:         0x60000000'00000000 - 0x60000001'00000000 (4GB)1226	 * Scratch:     0x60000001'00000000 - 0x60000002'00000000 (4GB)1227	 * GPUVM:       0x60010000'00000000 - 0x60020000'00000000 (1TB)1228	 */1229	sh_mem_bases = DEFAULT_SH_MEM_BASES | (DEFAULT_SH_MEM_BASES << 16);1230 1231	sh_mem_config = SH_MEM_ADDRESS_MODE_64 |1232			SH_MEM_ALIGNMENT_MODE_UNALIGNED <<1233			SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT;1234 1235	mutex_lock(&adev->srbm_mutex);1236	for (i = adev->vm_manager.first_kfd_vmid; i < AMDGPU_NUM_VMID; i++) {1237		soc15_grbm_select(adev, 0, 0, 0, i, GET_INST(GC, xcc_id));1238		/* CP and shaders */1239		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regSH_MEM_CONFIG, sh_mem_config);1240		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regSH_MEM_BASES, sh_mem_bases);1241 1242		/* Enable trap for each kfd vmid. */1243		data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regSPI_GDBG_PER_VMID_CNTL);1244		data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, TRAP_EN, 1);1245		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regSPI_GDBG_PER_VMID_CNTL, data);1246	}1247	soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, xcc_id));1248	mutex_unlock(&adev->srbm_mutex);1249 1250	/* Initialize all compute VMIDs to have no GDS, GWS, or OA1251	   acccess. These should be enabled by FW for target VMIDs. */1252	for (i = adev->vm_manager.first_kfd_vmid; i < AMDGPU_NUM_VMID; i++) {1253		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_VMID0_BASE, 2 * i, 0);1254		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_VMID0_SIZE, 2 * i, 0);1255		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_GWS_VMID0, i, 0);1256		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_OA_VMID0, i, 0);1257	}1258}1259 1260static void gfx_v9_4_3_xcc_init_gds_vmid(struct amdgpu_device *adev, int xcc_id)1261{1262	int vmid;1263 1264	/*1265	 * Initialize all compute and user-gfx VMIDs to have no GDS, GWS, or OA1266	 * access. Compute VMIDs should be enabled by FW for target VMIDs,1267	 * the driver can enable them for graphics. VMID0 should maintain1268	 * access so that HWS firmware can save/restore entries.1269	 */1270	for (vmid = 1; vmid < AMDGPU_NUM_VMID; vmid++) {1271		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_VMID0_BASE, 2 * vmid, 0);1272		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_VMID0_SIZE, 2 * vmid, 0);1273		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_GWS_VMID0, vmid, 0);1274		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_OA_VMID0, vmid, 0);1275	}1276}1277 1278static void gfx_v9_4_3_xcc_constants_init(struct amdgpu_device *adev,1279					  int xcc_id)1280{1281	u32 tmp;1282	int i;1283 1284	/* XXX SH_MEM regs */1285	/* where to put LDS, scratch, GPUVM in FSA64 space */1286	mutex_lock(&adev->srbm_mutex);1287	for (i = 0; i < adev->vm_manager.id_mgr[AMDGPU_GFXHUB(0)].num_ids; i++) {1288		soc15_grbm_select(adev, 0, 0, 0, i, GET_INST(GC, xcc_id));1289		/* CP and shaders */1290		if (i == 0) {1291			tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE,1292					    SH_MEM_ALIGNMENT_MODE_UNALIGNED);1293			tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, RETRY_DISABLE,1294					    !!adev->gmc.noretry);1295			WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id),1296					 regSH_MEM_CONFIG, tmp);1297			WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id),1298					 regSH_MEM_BASES, 0);1299		} else {1300			tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE,1301					    SH_MEM_ALIGNMENT_MODE_UNALIGNED);1302			tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, RETRY_DISABLE,1303					    !!adev->gmc.noretry);1304			WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id),1305					 regSH_MEM_CONFIG, tmp);1306			tmp = REG_SET_FIELD(0, SH_MEM_BASES, PRIVATE_BASE,1307					    (adev->gmc.private_aperture_start >>1308					     48));1309			tmp = REG_SET_FIELD(tmp, SH_MEM_BASES, SHARED_BASE,1310					    (adev->gmc.shared_aperture_start >>1311					     48));1312			WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id),1313					 regSH_MEM_BASES, tmp);1314		}1315	}1316	soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, 0));1317 1318	mutex_unlock(&adev->srbm_mutex);1319 1320	gfx_v9_4_3_xcc_init_compute_vmid(adev, xcc_id);1321	gfx_v9_4_3_xcc_init_gds_vmid(adev, xcc_id);1322}1323 1324static void gfx_v9_4_3_constants_init(struct amdgpu_device *adev)1325{1326	int i, num_xcc;1327 1328	num_xcc = NUM_XCC(adev->gfx.xcc_mask);1329 1330	gfx_v9_4_3_get_cu_info(adev, &adev->gfx.cu_info);1331	adev->gfx.config.db_debug2 =1332		RREG32_SOC15(GC, GET_INST(GC, 0), regDB_DEBUG2);1333 1334	for (i = 0; i < num_xcc; i++)1335		gfx_v9_4_3_xcc_constants_init(adev, i);1336}1337 1338static void1339gfx_v9_4_3_xcc_enable_save_restore_machine(struct amdgpu_device *adev,1340					   int xcc_id)1341{1342	WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), RLC_SRM_CNTL, SRM_ENABLE, 1);1343}1344 1345static void gfx_v9_4_3_xcc_init_pg(struct amdgpu_device *adev, int xcc_id)1346{1347	/*1348	 * Rlc save restore list is workable since v2_1.1349	 * And it's needed by gfxoff feature.1350	 */1351	if (adev->gfx.rlc.is_rlc_v2_1)1352		gfx_v9_4_3_xcc_enable_save_restore_machine(adev, xcc_id);1353}1354 1355static void gfx_v9_4_3_xcc_disable_gpa_mode(struct amdgpu_device *adev, int xcc_id)1356{1357	uint32_t data;1358 1359	data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCPC_PSP_DEBUG);1360	data |= CPC_PSP_DEBUG__UTCL2IUGPAOVERRIDE_MASK;1361	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCPC_PSP_DEBUG, data);1362}1363 1364static bool gfx_v9_4_3_is_rlc_enabled(struct amdgpu_device *adev)1365{1366	uint32_t rlc_setting;1367 1368	/* if RLC is not enabled, do nothing */1369	rlc_setting = RREG32_SOC15(GC, GET_INST(GC, 0), regRLC_CNTL);1370	if (!(rlc_setting & RLC_CNTL__RLC_ENABLE_F32_MASK))1371		return false;1372 1373	return true;1374}1375 1376static void gfx_v9_4_3_xcc_set_safe_mode(struct amdgpu_device *adev, int xcc_id)1377{1378	uint32_t data;1379	unsigned i;1380 1381	data = RLC_SAFE_MODE__CMD_MASK;1382	data |= (1 << RLC_SAFE_MODE__MESSAGE__SHIFT);1383	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_SAFE_MODE, data);1384 1385	/* wait for RLC_SAFE_MODE */1386	for (i = 0; i < adev->usec_timeout; i++) {1387		if (!REG_GET_FIELD(RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_SAFE_MODE), RLC_SAFE_MODE, CMD))1388			break;1389		udelay(1);1390	}1391}1392 1393static void gfx_v9_4_3_xcc_unset_safe_mode(struct amdgpu_device *adev,1394					   int xcc_id)1395{1396	uint32_t data;1397 1398	data = RLC_SAFE_MODE__CMD_MASK;1399	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_SAFE_MODE, data);1400}1401 1402static void gfx_v9_4_3_init_rlcg_reg_access_ctrl(struct amdgpu_device *adev)1403{1404	int xcc_id, num_xcc;1405	struct amdgpu_rlcg_reg_access_ctrl *reg_access_ctrl;1406 1407	num_xcc = NUM_XCC(adev->gfx.xcc_mask);1408	for (xcc_id = 0; xcc_id < num_xcc; xcc_id++) {1409		reg_access_ctrl = &adev->gfx.rlc.reg_access_ctrl[GET_INST(GC, xcc_id)];1410		reg_access_ctrl->scratch_reg0 = SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regSCRATCH_REG0);1411		reg_access_ctrl->scratch_reg1 = SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regSCRATCH_REG1);1412		reg_access_ctrl->scratch_reg2 = SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regSCRATCH_REG2);1413		reg_access_ctrl->scratch_reg3 = SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regSCRATCH_REG3);1414		reg_access_ctrl->grbm_cntl = SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regGRBM_GFX_CNTL);1415		reg_access_ctrl->grbm_idx = SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regGRBM_GFX_INDEX);1416		reg_access_ctrl->spare_int = SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regRLC_SPARE_INT);1417	}1418	adev->gfx.rlc.rlcg_reg_access_supported = true;1419}1420 1421static int gfx_v9_4_3_rlc_init(struct amdgpu_device *adev)1422{1423	/* init spm vmid with 0xf */1424	if (adev->gfx.rlc.funcs->update_spm_vmid)1425		adev->gfx.rlc.funcs->update_spm_vmid(adev, NULL, 0xf);1426 1427	return 0;1428}1429 1430static void gfx_v9_4_3_xcc_wait_for_rlc_serdes(struct amdgpu_device *adev,1431					       int xcc_id)1432{1433	u32 i, j, k;1434	u32 mask;1435 1436	mutex_lock(&adev->grbm_idx_mutex);1437	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {1438		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {1439			gfx_v9_4_3_xcc_select_se_sh(adev, i, j, 0xffffffff,1440						    xcc_id);1441			for (k = 0; k < adev->usec_timeout; k++) {1442				if (RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_SERDES_CU_MASTER_BUSY) == 0)1443					break;1444				udelay(1);1445			}1446			if (k == adev->usec_timeout) {1447				gfx_v9_4_3_xcc_select_se_sh(adev, 0xffffffff,1448							    0xffffffff,1449							    0xffffffff, xcc_id);1450				mutex_unlock(&adev->grbm_idx_mutex);1451				DRM_INFO("Timeout wait for RLC serdes %u,%u\n",1452					 i, j);1453				return;1454			}1455		}1456	}1457	gfx_v9_4_3_xcc_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff,1458				    xcc_id);1459	mutex_unlock(&adev->grbm_idx_mutex);1460 1461	mask = RLC_SERDES_NONCU_MASTER_BUSY__SE_MASTER_BUSY_MASK |1462		RLC_SERDES_NONCU_MASTER_BUSY__GC_MASTER_BUSY_MASK |1463		RLC_SERDES_NONCU_MASTER_BUSY__TC0_MASTER_BUSY_MASK |1464		RLC_SERDES_NONCU_MASTER_BUSY__TC1_MASTER_BUSY_MASK;1465	for (k = 0; k < adev->usec_timeout; k++) {1466		if ((RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_SERDES_NONCU_MASTER_BUSY) & mask) == 0)1467			break;1468		udelay(1);1469	}1470}1471 1472static void gfx_v9_4_3_xcc_enable_gui_idle_interrupt(struct amdgpu_device *adev,1473						     bool enable, int xcc_id)1474{1475	u32 tmp;1476 1477	/* These interrupts should be enabled to drive DS clock */1478 1479	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_INT_CNTL_RING0);1480 1481	tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, CNTX_BUSY_INT_ENABLE, enable ? 1 : 0);1482	tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, CNTX_EMPTY_INT_ENABLE, enable ? 1 : 0);1483	tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, CMP_BUSY_INT_ENABLE, enable ? 1 : 0);1484 1485	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_INT_CNTL_RING0, tmp);1486}1487 1488static void gfx_v9_4_3_xcc_rlc_stop(struct amdgpu_device *adev, int xcc_id)1489{1490	WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), RLC_CNTL,1491			      RLC_ENABLE_F32, 0);1492	gfx_v9_4_3_xcc_enable_gui_idle_interrupt(adev, false, xcc_id);1493	gfx_v9_4_3_xcc_wait_for_rlc_serdes(adev, xcc_id);1494}1495 1496static void gfx_v9_4_3_rlc_stop(struct amdgpu_device *adev)1497{1498	int i, num_xcc;1499 1500	num_xcc = NUM_XCC(adev->gfx.xcc_mask);1501	for (i = 0; i < num_xcc; i++)1502		gfx_v9_4_3_xcc_rlc_stop(adev, i);1503}1504 1505static void gfx_v9_4_3_xcc_rlc_reset(struct amdgpu_device *adev, int xcc_id)1506{1507	WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), GRBM_SOFT_RESET,1508			      SOFT_RESET_RLC, 1);1509	udelay(50);1510	WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), GRBM_SOFT_RESET,1511			      SOFT_RESET_RLC, 0);1512	udelay(50);1513}1514 1515static void gfx_v9_4_3_rlc_reset(struct amdgpu_device *adev)1516{1517	int i, num_xcc;1518 1519	num_xcc = NUM_XCC(adev->gfx.xcc_mask);1520	for (i = 0; i < num_xcc; i++)1521		gfx_v9_4_3_xcc_rlc_reset(adev, i);1522}1523 1524static void gfx_v9_4_3_xcc_rlc_start(struct amdgpu_device *adev, int xcc_id)1525{1526	WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), RLC_CNTL,1527			      RLC_ENABLE_F32, 1);1528	udelay(50);1529 1530	/* carrizo do enable cp interrupt after cp inited */1531	if (!(adev->flags & AMD_IS_APU)) {1532		gfx_v9_4_3_xcc_enable_gui_idle_interrupt(adev, true, xcc_id);1533		udelay(50);1534	}1535}1536 1537static void gfx_v9_4_3_rlc_start(struct amdgpu_device *adev)1538{1539#ifdef AMDGPU_RLC_DEBUG_RETRY1540	u32 rlc_ucode_ver;1541#endif1542	int i, num_xcc;1543 1544	num_xcc = NUM_XCC(adev->gfx.xcc_mask);1545	for (i = 0; i < num_xcc; i++) {1546		gfx_v9_4_3_xcc_rlc_start(adev, i);1547#ifdef AMDGPU_RLC_DEBUG_RETRY1548		/* RLC_GPM_GENERAL_6 : RLC Ucode version */1549		rlc_ucode_ver = RREG32_SOC15(GC, GET_INST(GC, i), regRLC_GPM_GENERAL_6);1550		if (rlc_ucode_ver == 0x108) {1551			dev_info(adev->dev,1552				 "Using rlc debug ucode. regRLC_GPM_GENERAL_6 ==0x08%x / fw_ver == %i \n",1553				 rlc_ucode_ver, adev->gfx.rlc_fw_version);1554			/* RLC_GPM_TIMER_INT_3 : Timer interval in RefCLK cycles,1555			 * default is 0x9C4 to create a 100us interval */1556			WREG32_SOC15(GC, GET_INST(GC, i), regRLC_GPM_TIMER_INT_3, 0x9C4);1557			/* RLC_GPM_GENERAL_12 : Minimum gap between wptr and rptr1558			 * to disable the page fault retry interrupts, default is1559			 * 0x100 (256) */1560			WREG32_SOC15(GC, GET_INST(GC, i), regRLC_GPM_GENERAL_12, 0x100);1561		}1562#endif1563	}1564}1565 1566static int gfx_v9_4_3_xcc_rlc_load_microcode(struct amdgpu_device *adev,1567					     int xcc_id)1568{1569	const struct rlc_firmware_header_v2_0 *hdr;1570	const __le32 *fw_data;1571	unsigned i, fw_size;1572 1573	if (!adev->gfx.rlc_fw)1574		return -EINVAL;1575 1576	hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data;1577	amdgpu_ucode_print_rlc_hdr(&hdr->header);1578 1579	fw_data = (const __le32 *)(adev->gfx.rlc_fw->data +1580			   le32_to_cpu(hdr->header.ucode_array_offset_bytes));1581	fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;1582 1583	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_GPM_UCODE_ADDR,1584			RLCG_UCODE_LOADING_START_ADDRESS);1585	for (i = 0; i < fw_size; i++) {1586		if (amdgpu_emu_mode == 1 && i % 100 == 0) {1587			dev_info(adev->dev, "Write RLC ucode data %u DWs\n", i);1588			msleep(1);1589		}1590		WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++));1591	}1592	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_GPM_UCODE_ADDR, adev->gfx.rlc_fw_version);1593 1594	return 0;1595}1596 1597static int gfx_v9_4_3_xcc_rlc_resume(struct amdgpu_device *adev, int xcc_id)1598{1599	int r;1600 1601	if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {1602		gfx_v9_4_3_xcc_rlc_stop(adev, xcc_id);1603		/* legacy rlc firmware loading */1604		r = gfx_v9_4_3_xcc_rlc_load_microcode(adev, xcc_id);1605		if (r)1606			return r;1607		gfx_v9_4_3_xcc_rlc_start(adev, xcc_id);1608	}1609 1610	amdgpu_gfx_rlc_enter_safe_mode(adev, xcc_id);1611	/* disable CG */1612	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGCG_CGLS_CTRL, 0);1613	gfx_v9_4_3_xcc_init_pg(adev, xcc_id);1614	amdgpu_gfx_rlc_exit_safe_mode(adev, xcc_id);1615 1616	return 0;1617}1618 1619static int gfx_v9_4_3_rlc_resume(struct amdgpu_device *adev)1620{1621	int r, i, num_xcc;1622 1623	if (amdgpu_sriov_vf(adev))1624		return 0;1625 1626	num_xcc = NUM_XCC(adev->gfx.xcc_mask);1627	for (i = 0; i < num_xcc; i++) {1628		r = gfx_v9_4_3_xcc_rlc_resume(adev, i);1629		if (r)1630			return r;1631	}1632 1633	return 0;1634}1635 1636static void gfx_v9_4_3_update_spm_vmid(struct amdgpu_device *adev, struct amdgpu_ring *ring,1637				       unsigned vmid)1638{1639	u32 reg, pre_data, data;1640 1641	reg = SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regRLC_SPM_MC_CNTL);1642	if (amdgpu_sriov_is_pp_one_vf(adev) && !amdgpu_sriov_runtime(adev))1643		pre_data = RREG32_NO_KIQ(reg);1644	else1645		pre_data = RREG32(reg);1646 1647	data =	pre_data & (~RLC_SPM_MC_CNTL__RLC_SPM_VMID_MASK);1648	data |= (vmid & RLC_SPM_MC_CNTL__RLC_SPM_VMID_MASK) << RLC_SPM_MC_CNTL__RLC_SPM_VMID__SHIFT;1649 1650	if (pre_data != data) {1651		if (amdgpu_sriov_is_pp_one_vf(adev) && !amdgpu_sriov_runtime(adev)) {1652			WREG32_SOC15_NO_KIQ(GC, GET_INST(GC, 0), regRLC_SPM_MC_CNTL, data);1653		} else1654			WREG32_SOC15(GC, GET_INST(GC, 0), regRLC_SPM_MC_CNTL, data);1655	}1656}1657 1658static const struct soc15_reg_rlcg rlcg_access_gc_9_4_3[] = {1659	{SOC15_REG_ENTRY(GC, 0, regGRBM_GFX_INDEX)},1660	{SOC15_REG_ENTRY(GC, 0, regSQ_IND_INDEX)},1661};1662 1663static bool gfx_v9_4_3_check_rlcg_range(struct amdgpu_device *adev,1664					uint32_t offset,1665					struct soc15_reg_rlcg *entries, int arr_size)1666{1667	int i, inst;1668	uint32_t reg;1669 1670	if (!entries)1671		return false;1672 1673	for (i = 0; i < arr_size; i++) {1674		const struct soc15_reg_rlcg *entry;1675 1676		entry = &entries[i];1677		inst = adev->ip_map.logical_to_dev_inst ?1678			       adev->ip_map.logical_to_dev_inst(1679				       adev, entry->hwip, entry->instance) :1680			       entry->instance;1681		reg = adev->reg_offset[entry->hwip][inst][entry->segment] +1682		      entry->reg;1683		if (offset == reg)1684			return true;1685	}1686 1687	return false;1688}1689 1690static bool gfx_v9_4_3_is_rlcg_access_range(struct amdgpu_device *adev, u32 offset)1691{1692	return gfx_v9_4_3_check_rlcg_range(adev, offset,1693					(void *)rlcg_access_gc_9_4_3,1694					ARRAY_SIZE(rlcg_access_gc_9_4_3));1695}1696 1697static void gfx_v9_4_3_xcc_cp_compute_enable(struct amdgpu_device *adev,1698					     bool enable, int xcc_id)1699{1700	if (enable) {1701		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_MEC_CNTL, 0);1702	} else {1703		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_MEC_CNTL,1704			(CP_MEC_CNTL__MEC_INVALIDATE_ICACHE_MASK |1705			 CP_MEC_CNTL__MEC_ME1_PIPE0_RESET_MASK |1706			 CP_MEC_CNTL__MEC_ME1_PIPE1_RESET_MASK |1707			 CP_MEC_CNTL__MEC_ME1_PIPE2_RESET_MASK |1708			 CP_MEC_CNTL__MEC_ME1_PIPE3_RESET_MASK |1709			 CP_MEC_CNTL__MEC_ME2_PIPE0_RESET_MASK |1710			 CP_MEC_CNTL__MEC_ME2_PIPE1_RESET_MASK |1711			 CP_MEC_CNTL__MEC_ME1_HALT_MASK |1712			 CP_MEC_CNTL__MEC_ME2_HALT_MASK));1713		adev->gfx.kiq[xcc_id].ring.sched.ready = false;1714	}1715	udelay(50);1716}1717 1718static int gfx_v9_4_3_xcc_cp_compute_load_microcode(struct amdgpu_device *adev,1719						    int xcc_id)1720{1721	const struct gfx_firmware_header_v1_0 *mec_hdr;1722	const __le32 *fw_data;1723	unsigned i;1724	u32 tmp;1725	u32 mec_ucode_addr_offset;1726	u32 mec_ucode_data_offset;1727 1728	if (!adev->gfx.mec_fw)1729		return -EINVAL;1730 1731	gfx_v9_4_3_xcc_cp_compute_enable(adev, false, xcc_id);1732 1733	mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;1734	amdgpu_ucode_print_gfx_hdr(&mec_hdr->header);1735 1736	fw_data = (const __le32 *)1737		(adev->gfx.mec_fw->data +1738		 le32_to_cpu(mec_hdr->header.ucode_array_offset_bytes));1739	tmp = 0;1740	tmp = REG_SET_FIELD(tmp, CP_CPC_IC_BASE_CNTL, VMID, 0);1741	tmp = REG_SET_FIELD(tmp, CP_CPC_IC_BASE_CNTL, CACHE_POLICY, 0);1742	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_CPC_IC_BASE_CNTL, tmp);1743 1744	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_CPC_IC_BASE_LO,1745		adev->gfx.mec.mec_fw_gpu_addr & 0xFFFFF000);1746	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_CPC_IC_BASE_HI,1747		upper_32_bits(adev->gfx.mec.mec_fw_gpu_addr));1748 1749	mec_ucode_addr_offset =1750		SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_MEC_ME1_UCODE_ADDR);1751	mec_ucode_data_offset =1752		SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_MEC_ME1_UCODE_DATA);1753 1754	/* MEC1 */1755	WREG32(mec_ucode_addr_offset, mec_hdr->jt_offset);1756	for (i = 0; i < mec_hdr->jt_size; i++)1757		WREG32(mec_ucode_data_offset,1758		       le32_to_cpup(fw_data + mec_hdr->jt_offset + i));1759 1760	WREG32(mec_ucode_addr_offset, adev->gfx.mec_fw_version);1761	/* Todo : Loading MEC2 firmware is only necessary if MEC2 should run different microcode than MEC1. */1762 1763	return 0;1764}1765 1766/* KIQ functions */1767static void gfx_v9_4_3_xcc_kiq_setting(struct amdgpu_ring *ring, int xcc_id)1768{1769	uint32_t tmp;1770	struct amdgpu_device *adev = ring->adev;1771 1772	/* tell RLC which is KIQ queue */1773	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CP_SCHEDULERS);1774	tmp &= 0xffffff00;1775	tmp |= (ring->me << 5) | (ring->pipe << 3) | (ring->queue);1776	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regRLC_CP_SCHEDULERS, tmp);1777	tmp |= 0x80;1778	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regRLC_CP_SCHEDULERS, tmp);1779}1780 1781static void gfx_v9_4_3_mqd_set_priority(struct amdgpu_ring *ring, struct v9_mqd *mqd)1782{1783	struct amdgpu_device *adev = ring->adev;1784 1785	if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) {1786		if (amdgpu_gfx_is_high_priority_compute_queue(adev, ring)) {1787			mqd->cp_hqd_pipe_priority = AMDGPU_GFX_PIPE_PRIO_HIGH;1788			mqd->cp_hqd_queue_priority =1789				AMDGPU_GFX_QUEUE_PRIORITY_MAXIMUM;1790		}1791	}1792}1793 1794static int gfx_v9_4_3_xcc_mqd_init(struct amdgpu_ring *ring, int xcc_id)1795{1796	struct amdgpu_device *adev = ring->adev;1797	struct v9_mqd *mqd = ring->mqd_ptr;1798	uint64_t hqd_gpu_addr, wb_gpu_addr, eop_base_addr;1799	uint32_t tmp;1800 1801	mqd->header = 0xC0310800;1802	mqd->compute_pipelinestat_enable = 0x00000001;1803	mqd->compute_static_thread_mgmt_se0 = 0xffffffff;1804	mqd->compute_static_thread_mgmt_se1 = 0xffffffff;1805	mqd->compute_static_thread_mgmt_se2 = 0xffffffff;1806	mqd->compute_static_thread_mgmt_se3 = 0xffffffff;1807	mqd->compute_misc_reserved = 0x00000003;1808 1809	mqd->dynamic_cu_mask_addr_lo =1810		lower_32_bits(ring->mqd_gpu_addr1811			      + offsetof(struct v9_mqd_allocation, dynamic_cu_mask));1812	mqd->dynamic_cu_mask_addr_hi =1813		upper_32_bits(ring->mqd_gpu_addr1814			      + offsetof(struct v9_mqd_allocation, dynamic_cu_mask));1815 1816	eop_base_addr = ring->eop_gpu_addr >> 8;1817	mqd->cp_hqd_eop_base_addr_lo = eop_base_addr;1818	mqd->cp_hqd_eop_base_addr_hi = upper_32_bits(eop_base_addr);1819 1820	/* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */1821	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_EOP_CONTROL);1822	tmp = REG_SET_FIELD(tmp, CP_HQD_EOP_CONTROL, EOP_SIZE,1823			(order_base_2(GFX9_MEC_HPD_SIZE / 4) - 1));1824 1825	mqd->cp_hqd_eop_control = tmp;1826 1827	/* enable doorbell? */1828	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_DOORBELL_CONTROL);1829 1830	if (ring->use_doorbell) {1831		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,1832				    DOORBELL_OFFSET, ring->doorbell_index);1833		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,1834				    DOORBELL_EN, 1);1835		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,1836				    DOORBELL_SOURCE, 0);1837		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,1838				    DOORBELL_HIT, 0);1839		if (amdgpu_sriov_vf(adev))1840			tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,1841					    DOORBELL_MODE, 1);1842	} else {1843		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,1844					 DOORBELL_EN, 0);1845	}1846 1847	mqd->cp_hqd_pq_doorbell_control = tmp;1848 1849	/* disable the queue if it's active */1850	ring->wptr = 0;1851	mqd->cp_hqd_dequeue_request = 0;1852	mqd->cp_hqd_pq_rptr = 0;1853	mqd->cp_hqd_pq_wptr_lo = 0;1854	mqd->cp_hqd_pq_wptr_hi = 0;1855 1856	/* set the pointer to the MQD */1857	mqd->cp_mqd_base_addr_lo = ring->mqd_gpu_addr & 0xfffffffc;1858	mqd->cp_mqd_base_addr_hi = upper_32_bits(ring->mqd_gpu_addr);1859 1860	/* set MQD vmid to 0 */1861	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_MQD_CONTROL);1862	tmp = REG_SET_FIELD(tmp, CP_MQD_CONTROL, VMID, 0);1863	mqd->cp_mqd_control = tmp;1864 1865	/* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */1866	hqd_gpu_addr = ring->gpu_addr >> 8;1867	mqd->cp_hqd_pq_base_lo = hqd_gpu_addr;1868	mqd->cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr);1869 1870	/* set up the HQD, this is similar to CP_RB0_CNTL */1871	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_CONTROL);1872	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, QUEUE_SIZE,1873			    (order_base_2(ring->ring_size / 4) - 1));1874	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, RPTR_BLOCK_SIZE,1875			((order_base_2(AMDGPU_GPU_PAGE_SIZE / 4) - 1) << 8));1876#ifdef __BIG_ENDIAN1877	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, ENDIAN_SWAP, 1);1878#endif1879	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, UNORD_DISPATCH, 0);1880	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, ROQ_PQ_IB_FLIP, 0);1881	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, PRIV_STATE, 1);1882	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, KMD_QUEUE, 1);1883	mqd->cp_hqd_pq_control = tmp;1884 1885	/* set the wb address whether it's enabled or not */1886	wb_gpu_addr = adev->wb.gpu_addr + (ring->rptr_offs * 4);1887	mqd->cp_hqd_pq_rptr_report_addr_lo = wb_gpu_addr & 0xfffffffc;1888	mqd->cp_hqd_pq_rptr_report_addr_hi =1889		upper_32_bits(wb_gpu_addr) & 0xffff;1890 1891	/* only used if CP_PQ_WPTR_POLL_CNTL.CP_PQ_WPTR_POLL_CNTL__EN_MASK=1 */1892	wb_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4);1893	mqd->cp_hqd_pq_wptr_poll_addr_lo = wb_gpu_addr & 0xfffffffc;1894	mqd->cp_hqd_pq_wptr_poll_addr_hi = upper_32_bits(wb_gpu_addr) & 0xffff;1895 1896	/* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */1897	ring->wptr = 0;1898	mqd->cp_hqd_pq_rptr = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_RPTR);1899 1900	/* set the vmid for the queue */1901	mqd->cp_hqd_vmid = 0;1902 1903	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_PERSISTENT_STATE);1904	tmp = REG_SET_FIELD(tmp, CP_HQD_PERSISTENT_STATE, PRELOAD_SIZE, 0x53);1905	mqd->cp_hqd_persistent_state = tmp;1906 1907	/* set MIN_IB_AVAIL_SIZE */1908	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_IB_CONTROL);1909	tmp = REG_SET_FIELD(tmp, CP_HQD_IB_CONTROL, MIN_IB_AVAIL_SIZE, 3);1910	mqd->cp_hqd_ib_control = tmp;1911 1912	/* set static priority for a queue/ring */1913	gfx_v9_4_3_mqd_set_priority(ring, mqd);1914	mqd->cp_hqd_quantum = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_QUANTUM);1915 1916	/* map_queues packet doesn't need activate the queue,1917	 * so only kiq need set this field.1918	 */1919	if (ring->funcs->type == AMDGPU_RING_TYPE_KIQ)1920		mqd->cp_hqd_active = 1;1921 1922	return 0;1923}1924 1925static int gfx_v9_4_3_xcc_kiq_init_register(struct amdgpu_ring *ring,1926					    int xcc_id)1927{1928	struct amdgpu_device *adev = ring->adev;1929	struct v9_mqd *mqd = ring->mqd_ptr;1930	int j;1931 1932	/* disable wptr polling */1933	WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), CP_PQ_WPTR_POLL_CNTL, EN, 0);1934 1935	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_EOP_BASE_ADDR,1936	       mqd->cp_hqd_eop_base_addr_lo);1937	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_EOP_BASE_ADDR_HI,1938	       mqd->cp_hqd_eop_base_addr_hi);1939 1940	/* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */1941	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_EOP_CONTROL,1942	       mqd->cp_hqd_eop_control);1943 1944	/* enable doorbell? */1945	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_DOORBELL_CONTROL,1946	       mqd->cp_hqd_pq_doorbell_control);1947 1948	/* disable the queue if it's active */1949	if (RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_ACTIVE) & 1) {1950		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_DEQUEUE_REQUEST, 1);1951		for (j = 0; j < adev->usec_timeout; j++) {1952			if (!(RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_ACTIVE) & 1))1953				break;1954			udelay(1);1955		}1956		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_DEQUEUE_REQUEST,1957		       mqd->cp_hqd_dequeue_request);1958		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_RPTR,1959		       mqd->cp_hqd_pq_rptr);1960		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_LO,1961		       mqd->cp_hqd_pq_wptr_lo);1962		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_HI,1963		       mqd->cp_hqd_pq_wptr_hi);1964	}1965 1966	/* set the pointer to the MQD */1967	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_MQD_BASE_ADDR,1968	       mqd->cp_mqd_base_addr_lo);1969	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_MQD_BASE_ADDR_HI,1970	       mqd->cp_mqd_base_addr_hi);1971 1972	/* set MQD vmid to 0 */1973	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_MQD_CONTROL,1974	       mqd->cp_mqd_control);1975 1976	/* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */1977	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_BASE,1978	       mqd->cp_hqd_pq_base_lo);1979	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_BASE_HI,1980	       mqd->cp_hqd_pq_base_hi);1981 1982	/* set up the HQD, this is similar to CP_RB0_CNTL */1983	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_CONTROL,1984	       mqd->cp_hqd_pq_control);1985 1986	/* set the wb address whether it's enabled or not */1987	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_RPTR_REPORT_ADDR,1988				mqd->cp_hqd_pq_rptr_report_addr_lo);1989	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_RPTR_REPORT_ADDR_HI,1990				mqd->cp_hqd_pq_rptr_report_addr_hi);1991 1992	/* only used if CP_PQ_WPTR_POLL_CNTL.CP_PQ_WPTR_POLL_CNTL__EN_MASK=1 */1993	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_POLL_ADDR,1994	       mqd->cp_hqd_pq_wptr_poll_addr_lo);1995	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_POLL_ADDR_HI,1996	       mqd->cp_hqd_pq_wptr_poll_addr_hi);1997 1998	/* enable the doorbell if requested */1999	if (ring->use_doorbell) {2000		WREG32_SOC15(2001			GC, GET_INST(GC, xcc_id),2002			regCP_MEC_DOORBELL_RANGE_LOWER,2003			((adev->doorbell_index.kiq +2004			  xcc_id * adev->doorbell_index.xcc_doorbell_range) *2005			 2) << 2);2006		WREG32_SOC15(2007			GC, GET_INST(GC, xcc_id),2008			regCP_MEC_DOORBELL_RANGE_UPPER,2009			((adev->doorbell_index.userqueue_end +2010			  xcc_id * adev->doorbell_index.xcc_doorbell_range) *2011			 2) << 2);2012	}2013 2014	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_DOORBELL_CONTROL,2015	       mqd->cp_hqd_pq_doorbell_control);2016 2017	/* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */2018	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_LO,2019	       mqd->cp_hqd_pq_wptr_lo);2020	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_HI,2021	       mqd->cp_hqd_pq_wptr_hi);2022 2023	/* set the vmid for the queue */2024	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_VMID, mqd->cp_hqd_vmid);2025 2026	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PERSISTENT_STATE,2027	       mqd->cp_hqd_persistent_state);2028 2029	/* activate the queue */2030	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_ACTIVE,2031	       mqd->cp_hqd_active);2032 2033	if (ring->use_doorbell)2034		WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), CP_PQ_STATUS, DOORBELL_ENABLE, 1);2035 2036	return 0;2037}2038 2039static int gfx_v9_4_3_xcc_q_fini_register(struct amdgpu_ring *ring,2040					    int xcc_id)2041{2042	struct amdgpu_device *adev = ring->adev;2043	int j;2044 2045	/* disable the queue if it's active */2046	if (RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_ACTIVE) & 1) {2047 2048		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_DEQUEUE_REQUEST, 1);2049 2050		for (j = 0; j < adev->usec_timeout; j++) {2051			if (!(RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_ACTIVE) & 1))2052				break;2053			udelay(1);2054		}2055 2056		if (j == AMDGPU_MAX_USEC_TIMEOUT) {2057			DRM_DEBUG("%s dequeue request failed.\n", ring->name);2058 2059			/* Manual disable if dequeue request times out */2060			WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_ACTIVE, 0);2061		}2062 2063		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_DEQUEUE_REQUEST,2064		      0);2065	}2066 2067	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_IQ_TIMER, 0);2068	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_IB_CONTROL, 0);2069	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PERSISTENT_STATE, CP_HQD_PERSISTENT_STATE_DEFAULT);2070	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_DOORBELL_CONTROL, 0x40000000);2071	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_DOORBELL_CONTROL, 0);2072	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_RPTR, 0);2073	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_HI, 0);2074	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_LO, 0);2075 2076	return 0;2077}2078 2079static int gfx_v9_4_3_xcc_kiq_init_queue(struct amdgpu_ring *ring, int xcc_id)2080{2081	struct amdgpu_device *adev = ring->adev;2082	struct v9_mqd *mqd = ring->mqd_ptr;2083	struct v9_mqd *tmp_mqd;2084 2085	gfx_v9_4_3_xcc_kiq_setting(ring, xcc_id);2086 2087	/* GPU could be in bad state during probe, driver trigger the reset2088	 * after load the SMU, in this case , the mqd is not be initialized.2089	 * driver need to re-init the mqd.2090	 * check mqd->cp_hqd_pq_control since this value should not be 02091	 */2092	tmp_mqd = (struct v9_mqd *)adev->gfx.kiq[xcc_id].mqd_backup;2093	if (amdgpu_in_reset(adev) && tmp_mqd->cp_hqd_pq_control) {2094		/* for GPU_RESET case , reset MQD to a clean status */2095		if (adev->gfx.kiq[xcc_id].mqd_backup)2096			memcpy(mqd, adev->gfx.kiq[xcc_id].mqd_backup, sizeof(struct v9_mqd_allocation));2097 2098		/* reset ring buffer */2099		ring->wptr = 0;2100		amdgpu_ring_clear_ring(ring);2101		mutex_lock(&adev->srbm_mutex);2102		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0, GET_INST(GC, xcc_id));2103		gfx_v9_4_3_xcc_kiq_init_register(ring, xcc_id);2104		soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, xcc_id));2105		mutex_unlock(&adev->srbm_mutex);2106	} else {2107		memset((void *)mqd, 0, sizeof(struct v9_mqd_allocation));2108		((struct v9_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF;2109		((struct v9_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF;2110		mutex_lock(&adev->srbm_mutex);2111		if (amdgpu_sriov_vf(adev) && adev->in_suspend)2112			amdgpu_ring_clear_ring(ring);2113		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0, GET_INST(GC, xcc_id));2114		gfx_v9_4_3_xcc_mqd_init(ring, xcc_id);2115		gfx_v9_4_3_xcc_kiq_init_register(ring, xcc_id);2116		soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, xcc_id));2117		mutex_unlock(&adev->srbm_mutex);2118 2119		if (adev->gfx.kiq[xcc_id].mqd_backup)2120			memcpy(adev->gfx.kiq[xcc_id].mqd_backup, mqd, sizeof(struct v9_mqd_allocation));2121	}2122 2123	return 0;2124}2125 2126static int gfx_v9_4_3_xcc_kcq_init_queue(struct amdgpu_ring *ring, int xcc_id, bool restore)2127{2128	struct amdgpu_device *adev = ring->adev;2129	struct v9_mqd *mqd = ring->mqd_ptr;2130	int mqd_idx = ring - &adev->gfx.compute_ring[0];2131	struct v9_mqd *tmp_mqd;2132 2133	/* Same as above kiq init, driver need to re-init the mqd if mqd->cp_hqd_pq_control2134	 * is not be initialized before2135	 */2136	tmp_mqd = (struct v9_mqd *)adev->gfx.mec.mqd_backup[mqd_idx];2137 2138	if (!restore && (!tmp_mqd->cp_hqd_pq_control ||2139	    (!amdgpu_in_reset(adev) && !adev->in_suspend))) {2140		memset((void *)mqd, 0, sizeof(struct v9_mqd_allocation));2141		((struct v9_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF;2142		((struct v9_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF;2143		mutex_lock(&adev->srbm_mutex);2144		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0, GET_INST(GC, xcc_id));2145		gfx_v9_4_3_xcc_mqd_init(ring, xcc_id);2146		soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, xcc_id));2147		mutex_unlock(&adev->srbm_mutex);2148 2149		if (adev->gfx.mec.mqd_backup[mqd_idx])2150			memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct v9_mqd_allocation));2151	} else {2152		/* restore MQD to a clean status */2153		if (adev->gfx.mec.mqd_backup[mqd_idx])2154			memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct v9_mqd_allocation));2155		/* reset ring buffer */2156		ring->wptr = 0;2157		atomic64_set((atomic64_t *)&adev->wb.wb[ring->wptr_offs], 0);2158		amdgpu_ring_clear_ring(ring);2159	}2160 2161	return 0;2162}2163 2164static int gfx_v9_4_3_xcc_kcq_fini_register(struct amdgpu_device *adev, int xcc_id)2165{2166	struct amdgpu_ring *ring;2167	int j;2168 2169	for (j = 0; j < adev->gfx.num_compute_rings; j++) {2170		ring = &adev->gfx.compute_ring[j +  xcc_id * adev->gfx.num_compute_rings];2171		if (!amdgpu_in_reset(adev) && !adev->in_suspend) {2172			mutex_lock(&adev->srbm_mutex);2173			soc15_grbm_select(adev, ring->me,2174					ring->pipe,2175					ring->queue, 0, GET_INST(GC, xcc_id));2176			gfx_v9_4_3_xcc_q_fini_register(ring, xcc_id);2177			soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, xcc_id));2178			mutex_unlock(&adev->srbm_mutex);2179		}2180	}2181 2182	return 0;2183}2184 2185static int gfx_v9_4_3_xcc_kiq_resume(struct amdgpu_device *adev, int xcc_id)2186{2187	struct amdgpu_ring *ring;2188	int r;2189 2190	ring = &adev->gfx.kiq[xcc_id].ring;2191 2192	r = amdgpu_bo_reserve(ring->mqd_obj, false);2193	if (unlikely(r != 0))2194		return r;2195 2196	r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);2197	if (unlikely(r != 0)) {2198		amdgpu_bo_unreserve(ring->mqd_obj);2199		return r;2200	}2201 2202	gfx_v9_4_3_xcc_kiq_init_queue(ring, xcc_id);2203	amdgpu_bo_kunmap(ring->mqd_obj);2204	ring->mqd_ptr = NULL;2205	amdgpu_bo_unreserve(ring->mqd_obj);2206	return 0;2207}2208 2209static int gfx_v9_4_3_xcc_kcq_resume(struct amdgpu_device *adev, int xcc_id)2210{2211	struct amdgpu_ring *ring = NULL;2212	int r = 0, i;2213 2214	gfx_v9_4_3_xcc_cp_compute_enable(adev, true, xcc_id);2215 2216	for (i = 0; i < adev->gfx.num_compute_rings; i++) {2217		ring = &adev->gfx.compute_ring[i + xcc_id * adev->gfx.num_compute_rings];2218 2219		r = amdgpu_bo_reserve(ring->mqd_obj, false);2220		if (unlikely(r != 0))2221			goto done;2222		r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);2223		if (!r) {2224			r = gfx_v9_4_3_xcc_kcq_init_queue(ring, xcc_id, false);2225			amdgpu_bo_kunmap(ring->mqd_obj);2226			ring->mqd_ptr = NULL;2227		}2228		amdgpu_bo_unreserve(ring->mqd_obj);2229		if (r)2230			goto done;2231	}2232 2233	r = amdgpu_gfx_enable_kcq(adev, xcc_id);2234done:2235	return r;2236}2237 2238static int gfx_v9_4_3_xcc_cp_resume(struct amdgpu_device *adev, int xcc_id)2239{2240	struct amdgpu_ring *ring;2241	int r, j;2242 2243	gfx_v9_4_3_xcc_enable_gui_idle_interrupt(adev, false, xcc_id);2244 2245	if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {2246		gfx_v9_4_3_xcc_disable_gpa_mode(adev, xcc_id);2247 2248		r = gfx_v9_4_3_xcc_cp_compute_load_microcode(adev, xcc_id);2249		if (r)2250			return r;2251	} else {2252		gfx_v9_4_3_xcc_cp_compute_enable(adev, false, xcc_id);2253	}2254 2255	r = gfx_v9_4_3_xcc_kiq_resume(adev, xcc_id);2256	if (r)2257		return r;2258 2259	r = gfx_v9_4_3_xcc_kcq_resume(adev, xcc_id);2260	if (r)2261		return r;2262 2263	for (j = 0; j < adev->gfx.num_compute_rings; j++) {2264		ring = &adev->gfx.compute_ring2265				[j + xcc_id * adev->gfx.num_compute_rings];2266		r = amdgpu_ring_test_helper(ring);2267		if (r)2268			return r;2269	}2270 2271	gfx_v9_4_3_xcc_enable_gui_idle_interrupt(adev, true, xcc_id);2272 2273	return 0;2274}2275 2276static int gfx_v9_4_3_cp_resume(struct amdgpu_device *adev)2277{2278	int r = 0, i, num_xcc, num_xcp, num_xcc_per_xcp;2279 2280	num_xcc = NUM_XCC(adev->gfx.xcc_mask);2281	if (amdgpu_sriov_vf(adev)) {2282		enum amdgpu_gfx_partition mode;2283 2284		mode = amdgpu_xcp_query_partition_mode(adev->xcp_mgr,2285						       AMDGPU_XCP_FL_NONE);2286		if (mode == AMDGPU_UNKNOWN_COMPUTE_PARTITION_MODE)2287			return -EINVAL;2288		num_xcc_per_xcp = gfx_v9_4_3_get_xccs_per_xcp(adev);2289		adev->gfx.num_xcc_per_xcp = num_xcc_per_xcp;2290		num_xcp = num_xcc / num_xcc_per_xcp;2291		r = amdgpu_xcp_init(adev->xcp_mgr, num_xcp, mode);2292 2293	} else {2294		if (amdgpu_xcp_query_partition_mode(adev->xcp_mgr,2295						    AMDGPU_XCP_FL_NONE) ==2296		    AMDGPU_UNKNOWN_COMPUTE_PARTITION_MODE)2297			r = amdgpu_xcp_switch_partition_mode(2298				adev->xcp_mgr, amdgpu_user_partt_mode);2299	}2300	if (r)2301		return r;2302 2303	for (i = 0; i < num_xcc; i++) {2304		r = gfx_v9_4_3_xcc_cp_resume(adev, i);2305		if (r)2306			return r;2307	}2308 2309	return 0;2310}2311 2312static void gfx_v9_4_3_xcc_fini(struct amdgpu_device *adev, int xcc_id)2313{2314	if (amdgpu_gfx_disable_kcq(adev, xcc_id))2315		DRM_ERROR("XCD %d KCQ disable failed\n", xcc_id);2316 2317	if (amdgpu_sriov_vf(adev)) {2318		/* must disable polling for SRIOV when hw finished, otherwise2319		 * CPC engine may still keep fetching WB address which is already2320		 * invalid after sw finished and trigger DMAR reading error in2321		 * hypervisor side.2322		 */2323		WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), CP_PQ_WPTR_POLL_CNTL, EN, 0);2324		return;2325	}2326 2327	/* Use deinitialize sequence from CAIL when unbinding device2328	 * from driver, otherwise KIQ is hanging when binding back2329	 */2330	if (!amdgpu_in_reset(adev) && !adev->in_suspend) {2331		mutex_lock(&adev->srbm_mutex);2332		soc15_grbm_select(adev, adev->gfx.kiq[xcc_id].ring.me,2333				  adev->gfx.kiq[xcc_id].ring.pipe,2334				  adev->gfx.kiq[xcc_id].ring.queue, 0,2335				  GET_INST(GC, xcc_id));2336		gfx_v9_4_3_xcc_q_fini_register(&adev->gfx.kiq[xcc_id].ring,2337						 xcc_id);2338		soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, xcc_id));2339		mutex_unlock(&adev->srbm_mutex);2340	}2341 2342	gfx_v9_4_3_xcc_kcq_fini_register(adev, xcc_id);2343	gfx_v9_4_3_xcc_cp_compute_enable(adev, false, xcc_id);2344}2345 2346static int gfx_v9_4_3_hw_init(void *handle)2347{2348	int r;2349	struct amdgpu_device *adev = (struct amdgpu_device *)handle;2350 2351	amdgpu_gfx_cleaner_shader_init(adev, adev->gfx.cleaner_shader_size,2352				       adev->gfx.cleaner_shader_ptr);2353 2354	if (!amdgpu_sriov_vf(adev))2355		gfx_v9_4_3_init_golden_registers(adev);2356 2357	gfx_v9_4_3_constants_init(adev);2358 2359	r = adev->gfx.rlc.funcs->resume(adev);2360	if (r)2361		return r;2362 2363	r = gfx_v9_4_3_cp_resume(adev);2364	if (r)2365		return r;2366 2367	return r;2368}2369 2370static int gfx_v9_4_3_hw_fini(void *handle)2371{2372	struct amdgpu_device *adev = (struct amdgpu_device *)handle;2373	int i, num_xcc;2374 2375	amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0);2376	amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0);2377	amdgpu_irq_put(adev, &adev->gfx.bad_op_irq, 0);2378 2379	num_xcc = NUM_XCC(adev->gfx.xcc_mask);2380	for (i = 0; i < num_xcc; i++) {2381		gfx_v9_4_3_xcc_fini(adev, i);2382	}2383 2384	return 0;2385}2386 2387static int gfx_v9_4_3_suspend(void *handle)2388{2389	return gfx_v9_4_3_hw_fini(handle);2390}2391 2392static int gfx_v9_4_3_resume(void *handle)2393{2394	return gfx_v9_4_3_hw_init(handle);2395}2396 2397static bool gfx_v9_4_3_is_idle(void *handle)2398{2399	struct amdgpu_device *adev = (struct amdgpu_device *)handle;2400	int i, num_xcc;2401 2402	num_xcc = NUM_XCC(adev->gfx.xcc_mask);2403	for (i = 0; i < num_xcc; i++) {2404		if (REG_GET_FIELD(RREG32_SOC15(GC, GET_INST(GC, i), regGRBM_STATUS),2405					GRBM_STATUS, GUI_ACTIVE))2406			return false;2407	}2408	return true;2409}2410 2411static int gfx_v9_4_3_wait_for_idle(void *handle)2412{2413	unsigned i;2414	struct amdgpu_device *adev = (struct amdgpu_device *)handle;2415 2416	for (i = 0; i < adev->usec_timeout; i++) {2417		if (gfx_v9_4_3_is_idle(handle))2418			return 0;2419		udelay(1);2420	}2421	return -ETIMEDOUT;2422}2423 2424static int gfx_v9_4_3_soft_reset(void *handle)2425{2426	u32 grbm_soft_reset = 0;2427	u32 tmp;2428	struct amdgpu_device *adev = (struct amdgpu_device *)handle;2429 2430	/* GRBM_STATUS */2431	tmp = RREG32_SOC15(GC, GET_INST(GC, 0), regGRBM_STATUS);2432	if (tmp & (GRBM_STATUS__PA_BUSY_MASK | GRBM_STATUS__SC_BUSY_MASK |2433		   GRBM_STATUS__BCI_BUSY_MASK | GRBM_STATUS__SX_BUSY_MASK |2434		   GRBM_STATUS__TA_BUSY_MASK | GRBM_STATUS__VGT_BUSY_MASK |2435		   GRBM_STATUS__DB_BUSY_MASK | GRBM_STATUS__CB_BUSY_MASK |2436		   GRBM_STATUS__GDS_BUSY_MASK | GRBM_STATUS__SPI_BUSY_MASK |2437		   GRBM_STATUS__IA_BUSY_MASK | GRBM_STATUS__IA_BUSY_NO_DMA_MASK)) {2438		grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,2439						GRBM_SOFT_RESET, SOFT_RESET_CP, 1);2440		grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,2441						GRBM_SOFT_RESET, SOFT_RESET_GFX, 1);2442	}2443 2444	if (tmp & (GRBM_STATUS__CP_BUSY_MASK | GRBM_STATUS__CP_COHERENCY_BUSY_MASK)) {2445		grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,2446						GRBM_SOFT_RESET, SOFT_RESET_CP, 1);2447	}2448 2449	/* GRBM_STATUS2 */2450	tmp = RREG32_SOC15(GC, GET_INST(GC, 0), regGRBM_STATUS2);2451	if (REG_GET_FIELD(tmp, GRBM_STATUS2, RLC_BUSY))2452		grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,2453						GRBM_SOFT_RESET, SOFT_RESET_RLC, 1);2454 2455 2456	if (grbm_soft_reset) {2457		/* stop the rlc */2458		adev->gfx.rlc.funcs->stop(adev);2459 2460		/* Disable MEC parsing/prefetching */2461		gfx_v9_4_3_xcc_cp_compute_enable(adev, false, 0);2462 2463		if (grbm_soft_reset) {2464			tmp = RREG32_SOC15(GC, GET_INST(GC, 0), regGRBM_SOFT_RESET);2465			tmp |= grbm_soft_reset;2466			dev_info(adev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);2467			WREG32_SOC15(GC, GET_INST(GC, 0), regGRBM_SOFT_RESET, tmp);2468			tmp = RREG32_SOC15(GC, GET_INST(GC, 0), regGRBM_SOFT_RESET);2469 2470			udelay(50);2471 2472			tmp &= ~grbm_soft_reset;2473			WREG32_SOC15(GC, GET_INST(GC, 0), regGRBM_SOFT_RESET, tmp);2474			tmp = RREG32_SOC15(GC, GET_INST(GC, 0), regGRBM_SOFT_RESET);2475		}2476 2477		/* Wait a little for things to settle down */2478		udelay(50);2479	}2480	return 0;2481}2482 2483static void gfx_v9_4_3_ring_emit_gds_switch(struct amdgpu_ring *ring,2484					  uint32_t vmid,2485					  uint32_t gds_base, uint32_t gds_size,2486					  uint32_t gws_base, uint32_t gws_size,2487					  uint32_t oa_base, uint32_t oa_size)2488{2489	struct amdgpu_device *adev = ring->adev;2490 2491	/* GDS Base */2492	gfx_v9_4_3_write_data_to_reg(ring, 0, false,2493				   SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regGDS_VMID0_BASE) + 2 * vmid,2494				   gds_base);2495 2496	/* GDS Size */2497	gfx_v9_4_3_write_data_to_reg(ring, 0, false,2498				   SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regGDS_VMID0_SIZE) + 2 * vmid,2499				   gds_size);2500 2501	/* GWS */2502	gfx_v9_4_3_write_data_to_reg(ring, 0, false,2503				   SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regGDS_GWS_VMID0) + vmid,2504				   gws_size << GDS_GWS_VMID0__SIZE__SHIFT | gws_base);2505 2506	/* OA */2507	gfx_v9_4_3_write_data_to_reg(ring, 0, false,2508				   SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regGDS_OA_VMID0) + vmid,2509				   (1 << (oa_size + oa_base)) - (1 << oa_base));2510}2511 2512static int gfx_v9_4_3_early_init(void *handle)2513{2514	struct amdgpu_device *adev = (struct amdgpu_device *)handle;2515 2516	adev->gfx.num_compute_rings = min(amdgpu_gfx_get_num_kcq(adev),2517					  AMDGPU_MAX_COMPUTE_RINGS);2518	gfx_v9_4_3_set_kiq_pm4_funcs(adev);2519	gfx_v9_4_3_set_ring_funcs(adev);2520	gfx_v9_4_3_set_irq_funcs(adev);2521	gfx_v9_4_3_set_gds_init(adev);2522	gfx_v9_4_3_set_rlc_funcs(adev);2523 2524	/* init rlcg reg access ctrl */2525	gfx_v9_4_3_init_rlcg_reg_access_ctrl(adev);2526 2527	return gfx_v9_4_3_init_microcode(adev);2528}2529 2530static int gfx_v9_4_3_late_init(void *handle)2531{2532	struct amdgpu_device *adev = (struct amdgpu_device *)handle;2533	int r;2534 2535	r = amdgpu_irq_get(adev, &adev->gfx.priv_reg_irq, 0);2536	if (r)2537		return r;2538 2539	r = amdgpu_irq_get(adev, &adev->gfx.priv_inst_irq, 0);2540	if (r)2541		return r;2542 2543	r = amdgpu_irq_get(adev, &adev->gfx.bad_op_irq, 0);2544	if (r)2545		return r;2546 2547	if (adev->gfx.ras &&2548	    adev->gfx.ras->enable_watchdog_timer)2549		adev->gfx.ras->enable_watchdog_timer(adev);2550 2551	return 0;2552}2553 2554static void gfx_v9_4_3_xcc_update_sram_fgcg(struct amdgpu_device *adev,2555					    bool enable, int xcc_id)2556{2557	uint32_t def, data;2558 2559	if (!(adev->cg_flags & AMD_CG_SUPPORT_GFX_FGCG))2560		return;2561 2562	def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id),2563				  regRLC_CGTT_MGCG_OVERRIDE);2564 2565	if (enable)2566		data &= ~RLC_CGTT_MGCG_OVERRIDE__GFXIP_FGCG_OVERRIDE_MASK;2567	else2568		data |= RLC_CGTT_MGCG_OVERRIDE__GFXIP_FGCG_OVERRIDE_MASK;2569 2570	if (def != data)2571		WREG32_SOC15(GC, GET_INST(GC, xcc_id),2572			     regRLC_CGTT_MGCG_OVERRIDE, data);2573 2574}2575 2576static void gfx_v9_4_3_xcc_update_repeater_fgcg(struct amdgpu_device *adev,2577						bool enable, int xcc_id)2578{2579	uint32_t def, data;2580 2581	if (!(adev->cg_flags & AMD_CG_SUPPORT_REPEATER_FGCG))2582		return;2583 2584	def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id),2585				  regRLC_CGTT_MGCG_OVERRIDE);2586 2587	if (enable)2588		data &= ~RLC_CGTT_MGCG_OVERRIDE__GFXIP_REP_FGCG_OVERRIDE_MASK;2589	else2590		data |= RLC_CGTT_MGCG_OVERRIDE__GFXIP_REP_FGCG_OVERRIDE_MASK;2591 2592	if (def != data)2593		WREG32_SOC15(GC, GET_INST(GC, xcc_id),2594			     regRLC_CGTT_MGCG_OVERRIDE, data);2595}2596 2597static void2598gfx_v9_4_3_xcc_update_medium_grain_clock_gating(struct amdgpu_device *adev,2599						bool enable, int xcc_id)2600{2601	uint32_t data, def;2602 2603	/* It is disabled by HW by default */2604	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) {2605		/* 1 - RLC_CGTT_MGCG_OVERRIDE */2606		def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGTT_MGCG_OVERRIDE);2607 2608		data &= ~(RLC_CGTT_MGCG_OVERRIDE__GRBM_CGTT_SCLK_OVERRIDE_MASK |2609			  RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK |2610			  RLC_CGTT_MGCG_OVERRIDE__RLC_CGTT_SCLK_OVERRIDE_MASK |2611			  RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGLS_OVERRIDE_MASK);2612 2613		if (def != data)2614			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGTT_MGCG_OVERRIDE, data);2615 2616		/* MGLS is a global flag to control all MGLS in GFX */2617		if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) {2618			/* 2 - RLC memory Light sleep */2619			if (adev->cg_flags & AMD_CG_SUPPORT_GFX_RLC_LS) {2620				def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_MEM_SLP_CNTL);2621				data |= RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK;2622				if (def != data)2623					WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_MEM_SLP_CNTL, data);2624			}2625			/* 3 - CP memory Light sleep */2626			if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CP_LS) {2627				def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_MEM_SLP_CNTL);2628				data |= CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK;2629				if (def != data)2630					WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_MEM_SLP_CNTL, data);2631			}2632		}2633	} else {2634		/* 1 - MGCG_OVERRIDE */2635		def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGTT_MGCG_OVERRIDE);2636 2637		data |= (RLC_CGTT_MGCG_OVERRIDE__RLC_CGTT_SCLK_OVERRIDE_MASK |2638			 RLC_CGTT_MGCG_OVERRIDE__GRBM_CGTT_SCLK_OVERRIDE_MASK |2639			 RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK |2640			 RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGLS_OVERRIDE_MASK);2641 2642		if (def != data)2643			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGTT_MGCG_OVERRIDE, data);2644 2645		/* 2 - disable MGLS in RLC */2646		data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_MEM_SLP_CNTL);2647		if (data & RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK) {2648			data &= ~RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK;2649			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_MEM_SLP_CNTL, data);2650		}2651 2652		/* 3 - disable MGLS in CP */2653		data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_MEM_SLP_CNTL);2654		if (data & CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK) {2655			data &= ~CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK;2656			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_MEM_SLP_CNTL, data);2657		}2658	}2659 2660}2661 2662static void2663gfx_v9_4_3_xcc_update_coarse_grain_clock_gating(struct amdgpu_device *adev,2664						bool enable, int xcc_id)2665{2666	uint32_t def, data;2667 2668	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) {2669 2670		def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGTT_MGCG_OVERRIDE);2671		/* unset CGCG override */2672		data &= ~RLC_CGTT_MGCG_OVERRIDE__GFXIP_CGCG_OVERRIDE_MASK;2673		if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS)2674			data &= ~RLC_CGTT_MGCG_OVERRIDE__GFXIP_CGLS_OVERRIDE_MASK;2675		else2676			data |= RLC_CGTT_MGCG_OVERRIDE__GFXIP_CGLS_OVERRIDE_MASK;2677		/* update CGCG and CGLS override bits */2678		if (def != data)2679			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGTT_MGCG_OVERRIDE, data);2680 2681		/* CGCG Hysteresis: 400us */2682		def = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGCG_CGLS_CTRL);2683 2684		data = (0x27102685			<< RLC_CGCG_CGLS_CTRL__CGCG_GFX_IDLE_THRESHOLD__SHIFT) |2686		       RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK;2687		if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS)2688			data |= (0x000F << RLC_CGCG_CGLS_CTRL__CGLS_REP_COMPANSAT_DELAY__SHIFT) |2689				RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK;2690		if (def != data)2691			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGCG_CGLS_CTRL, data);2692 2693		/* set IDLE_POLL_COUNT(0x33450100)*/2694		def = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_RB_WPTR_POLL_CNTL);2695		data = (0x0100 << CP_RB_WPTR_POLL_CNTL__POLL_FREQUENCY__SHIFT) |2696			(0x3345 << CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT__SHIFT);2697		if (def != data)2698			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_RB_WPTR_POLL_CNTL, data);2699	} else {2700		def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGCG_CGLS_CTRL);2701		/* reset CGCG/CGLS bits */2702		data &= ~(RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK | RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK);2703		/* disable cgcg and cgls in FSM */2704		if (def != data)2705			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGCG_CGLS_CTRL, data);2706	}2707 2708}2709 2710static int gfx_v9_4_3_xcc_update_gfx_clock_gating(struct amdgpu_device *adev,2711						  bool enable, int xcc_id)2712{2713	amdgpu_gfx_rlc_enter_safe_mode(adev, xcc_id);2714 2715	if (enable) {2716		/* FGCG */2717		gfx_v9_4_3_xcc_update_sram_fgcg(adev, enable, xcc_id);2718		gfx_v9_4_3_xcc_update_repeater_fgcg(adev, enable, xcc_id);2719 2720		/* CGCG/CGLS should be enabled after MGCG/MGLS2721		 * ===  MGCG + MGLS ===2722		 */2723		gfx_v9_4_3_xcc_update_medium_grain_clock_gating(adev, enable,2724								xcc_id);2725		/* ===  CGCG + CGLS === */2726		gfx_v9_4_3_xcc_update_coarse_grain_clock_gating(adev, enable,2727								xcc_id);2728	} else {2729		/* CGCG/CGLS should be disabled before MGCG/MGLS2730		 * ===  CGCG + CGLS ===2731		 */2732		gfx_v9_4_3_xcc_update_coarse_grain_clock_gating(adev, enable,2733								xcc_id);2734		/* ===  MGCG + MGLS === */2735		gfx_v9_4_3_xcc_update_medium_grain_clock_gating(adev, enable,2736								xcc_id);2737 2738		/* FGCG */2739		gfx_v9_4_3_xcc_update_sram_fgcg(adev, enable, xcc_id);2740		gfx_v9_4_3_xcc_update_repeater_fgcg(adev, enable, xcc_id);2741	}2742 2743	amdgpu_gfx_rlc_exit_safe_mode(adev, xcc_id);2744 2745	return 0;2746}2747 2748static const struct amdgpu_rlc_funcs gfx_v9_4_3_rlc_funcs = {2749	.is_rlc_enabled = gfx_v9_4_3_is_rlc_enabled,2750	.set_safe_mode = gfx_v9_4_3_xcc_set_safe_mode,2751	.unset_safe_mode = gfx_v9_4_3_xcc_unset_safe_mode,2752	.init = gfx_v9_4_3_rlc_init,2753	.resume = gfx_v9_4_3_rlc_resume,2754	.stop = gfx_v9_4_3_rlc_stop,2755	.reset = gfx_v9_4_3_rlc_reset,2756	.start = gfx_v9_4_3_rlc_start,2757	.update_spm_vmid = gfx_v9_4_3_update_spm_vmid,2758	.is_rlcg_access_range = gfx_v9_4_3_is_rlcg_access_range,2759};2760 2761static int gfx_v9_4_3_set_powergating_state(void *handle,2762					  enum amd_powergating_state state)2763{2764	return 0;2765}2766 2767static int gfx_v9_4_3_set_clockgating_state(void *handle,2768					  enum amd_clockgating_state state)2769{2770	struct amdgpu_device *adev = (struct amdgpu_device *)handle;2771	int i, num_xcc;2772 2773	if (amdgpu_sriov_vf(adev))2774		return 0;2775 2776	num_xcc = NUM_XCC(adev->gfx.xcc_mask);2777	switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {2778	case IP_VERSION(9, 4, 3):2779	case IP_VERSION(9, 4, 4):2780		for (i = 0; i < num_xcc; i++)2781			gfx_v9_4_3_xcc_update_gfx_clock_gating(2782				adev, state == AMD_CG_STATE_GATE, i);2783		break;2784	default:2785		break;2786	}2787	return 0;2788}2789 2790static void gfx_v9_4_3_get_clockgating_state(void *handle, u64 *flags)2791{2792	struct amdgpu_device *adev = (struct amdgpu_device *)handle;2793	int data;2794 2795	if (amdgpu_sriov_vf(adev))2796		*flags = 0;2797 2798	/* AMD_CG_SUPPORT_GFX_MGCG */2799	data = RREG32_KIQ(SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regRLC_CGTT_MGCG_OVERRIDE));2800	if (!(data & RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK))2801		*flags |= AMD_CG_SUPPORT_GFX_MGCG;2802 2803	/* AMD_CG_SUPPORT_GFX_CGCG */2804	data = RREG32_KIQ(SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regRLC_CGCG_CGLS_CTRL));2805	if (data & RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK)2806		*flags |= AMD_CG_SUPPORT_GFX_CGCG;2807 2808	/* AMD_CG_SUPPORT_GFX_CGLS */2809	if (data & RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK)2810		*flags |= AMD_CG_SUPPORT_GFX_CGLS;2811 2812	/* AMD_CG_SUPPORT_GFX_RLC_LS */2813	data = RREG32_KIQ(SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regRLC_MEM_SLP_CNTL));2814	if (data & RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK)2815		*flags |= AMD_CG_SUPPORT_GFX_RLC_LS | AMD_CG_SUPPORT_GFX_MGLS;2816 2817	/* AMD_CG_SUPPORT_GFX_CP_LS */2818	data = RREG32_KIQ(SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regCP_MEM_SLP_CNTL));2819	if (data & CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK)2820		*flags |= AMD_CG_SUPPORT_GFX_CP_LS | AMD_CG_SUPPORT_GFX_MGLS;2821}2822 2823static void gfx_v9_4_3_ring_emit_hdp_flush(struct amdgpu_ring *ring)2824{2825	struct amdgpu_device *adev = ring->adev;2826	u32 ref_and_mask, reg_mem_engine;2827	const struct nbio_hdp_flush_reg *nbio_hf_reg = adev->nbio.hdp_flush_reg;2828 2829	if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) {2830		switch (ring->me) {2831		case 1:2832			ref_and_mask = nbio_hf_reg->ref_and_mask_cp2 << ring->pipe;2833			break;2834		case 2:2835			ref_and_mask = nbio_hf_reg->ref_and_mask_cp6 << ring->pipe;2836			break;2837		default:2838			return;2839		}2840		reg_mem_engine = 0;2841	} else {2842		ref_and_mask = nbio_hf_reg->ref_and_mask_cp0;2843		reg_mem_engine = 1; /* pfp */2844	}2845 2846	gfx_v9_4_3_wait_reg_mem(ring, reg_mem_engine, 0, 1,2847			      adev->nbio.funcs->get_hdp_flush_req_offset(adev),2848			      adev->nbio.funcs->get_hdp_flush_done_offset(adev),2849			      ref_and_mask, ref_and_mask, 0x20);2850}2851 2852static void gfx_v9_4_3_ring_emit_ib_compute(struct amdgpu_ring *ring,2853					  struct amdgpu_job *job,2854					  struct amdgpu_ib *ib,2855					  uint32_t flags)2856{2857	unsigned vmid = AMDGPU_JOB_GET_VMID(job);2858	u32 control = INDIRECT_BUFFER_VALID | ib->length_dw | (vmid << 24);2859 2860	/* Currently, there is a high possibility to get wave ID mismatch2861	 * between ME and GDS, leading to a hw deadlock, because ME generates2862	 * different wave IDs than the GDS expects. This situation happens2863	 * randomly when at least 5 compute pipes use GDS ordered append.2864	 * The wave IDs generated by ME are also wrong after suspend/resume.2865	 * Those are probably bugs somewhere else in the kernel driver.2866	 *2867	 * Writing GDS_COMPUTE_MAX_WAVE_ID resets wave ID counters in ME and2868	 * GDS to 0 for this ring (me/pipe).2869	 */2870	if (ib->flags & AMDGPU_IB_FLAG_RESET_GDS_MAX_WAVE_ID) {2871		amdgpu_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));2872		amdgpu_ring_write(ring, regGDS_COMPUTE_MAX_WAVE_ID);2873		amdgpu_ring_write(ring, ring->adev->gds.gds_compute_max_wave_id);2874	}2875 2876	amdgpu_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));2877	BUG_ON(ib->gpu_addr & 0x3); /* Dword align */2878	amdgpu_ring_write(ring,2879#ifdef __BIG_ENDIAN2880				(2 << 0) |2881#endif2882				lower_32_bits(ib->gpu_addr));2883	amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr));2884	amdgpu_ring_write(ring, control);2885}2886 2887static void gfx_v9_4_3_ring_emit_fence(struct amdgpu_ring *ring, u64 addr,2888				     u64 seq, unsigned flags)2889{2890	bool write64bit = flags & AMDGPU_FENCE_FLAG_64BIT;2891	bool int_sel = flags & AMDGPU_FENCE_FLAG_INT;2892	bool writeback = flags & AMDGPU_FENCE_FLAG_TC_WB_ONLY;2893 2894	/* RELEASE_MEM - flush caches, send int */2895	amdgpu_ring_write(ring, PACKET3(PACKET3_RELEASE_MEM, 6));2896	amdgpu_ring_write(ring, ((writeback ? (EOP_TC_WB_ACTION_EN |2897					       EOP_TC_NC_ACTION_EN) :2898					      (EOP_TCL1_ACTION_EN |2899					       EOP_TC_ACTION_EN |2900					       EOP_TC_WB_ACTION_EN |2901					       EOP_TC_MD_ACTION_EN)) |2902				 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |2903				 EVENT_INDEX(5)));2904	amdgpu_ring_write(ring, DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0));2905 2906	/*2907	 * the address should be Qword aligned if 64bit write, Dword2908	 * aligned if only send 32bit data low (discard data high)2909	 */2910	if (write64bit)2911		BUG_ON(addr & 0x7);2912	else2913		BUG_ON(addr & 0x3);2914	amdgpu_ring_write(ring, lower_32_bits(addr));2915	amdgpu_ring_write(ring, upper_32_bits(addr));2916	amdgpu_ring_write(ring, lower_32_bits(seq));2917	amdgpu_ring_write(ring, upper_32_bits(seq));2918	amdgpu_ring_write(ring, 0);2919}2920 2921static void gfx_v9_4_3_ring_emit_pipeline_sync(struct amdgpu_ring *ring)2922{2923	int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX);2924	uint32_t seq = ring->fence_drv.sync_seq;2925	uint64_t addr = ring->fence_drv.gpu_addr;2926 2927	gfx_v9_4_3_wait_reg_mem(ring, usepfp, 1, 0,2928			      lower_32_bits(addr), upper_32_bits(addr),2929			      seq, 0xffffffff, 4);2930}2931 2932static void gfx_v9_4_3_ring_emit_vm_flush(struct amdgpu_ring *ring,2933					unsigned vmid, uint64_t pd_addr)2934{2935	amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr);2936}2937 2938static u64 gfx_v9_4_3_ring_get_rptr_compute(struct amdgpu_ring *ring)2939{2940	return ring->adev->wb.wb[ring->rptr_offs]; /* gfx9 hardware is 32bit rptr */2941}2942 2943static u64 gfx_v9_4_3_ring_get_wptr_compute(struct amdgpu_ring *ring)2944{2945	u64 wptr;2946 2947	/* XXX check if swapping is necessary on BE */2948	if (ring->use_doorbell)2949		wptr = atomic64_read((atomic64_t *)&ring->adev->wb.wb[ring->wptr_offs]);2950	else2951		BUG();2952	return wptr;2953}2954 2955static void gfx_v9_4_3_ring_set_wptr_compute(struct amdgpu_ring *ring)2956{2957	struct amdgpu_device *adev = ring->adev;2958 2959	/* XXX check if swapping is necessary on BE */2960	if (ring->use_doorbell) {2961		atomic64_set((atomic64_t *)&adev->wb.wb[ring->wptr_offs], ring->wptr);2962		WDOORBELL64(ring->doorbell_index, ring->wptr);2963	} else {2964		BUG(); /* only DOORBELL method supported on gfx9 now */2965	}2966}2967 2968static void gfx_v9_4_3_ring_emit_fence_kiq(struct amdgpu_ring *ring, u64 addr,2969					 u64 seq, unsigned int flags)2970{2971	struct amdgpu_device *adev = ring->adev;2972 2973	/* we only allocate 32bit for each seq wb address */2974	BUG_ON(flags & AMDGPU_FENCE_FLAG_64BIT);2975 2976	/* write fence seq to the "addr" */2977	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));2978	amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |2979				 WRITE_DATA_DST_SEL(5) | WR_CONFIRM));2980	amdgpu_ring_write(ring, lower_32_bits(addr));2981	amdgpu_ring_write(ring, upper_32_bits(addr));2982	amdgpu_ring_write(ring, lower_32_bits(seq));2983 2984	if (flags & AMDGPU_FENCE_FLAG_INT) {2985		/* set register to trigger INT */2986		amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));2987		amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |2988					 WRITE_DATA_DST_SEL(0) | WR_CONFIRM));2989		amdgpu_ring_write(ring, SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regCPC_INT_STATUS));2990		amdgpu_ring_write(ring, 0);2991		amdgpu_ring_write(ring, 0x20000000); /* src_id is 178 */2992	}2993}2994 2995static void gfx_v9_4_3_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg,2996				    uint32_t reg_val_offs)2997{2998	struct amdgpu_device *adev = ring->adev;2999 3000	reg = gfx_v9_4_3_normalize_xcc_reg_offset(reg);3001 3002	amdgpu_ring_write(ring, PACKET3(PACKET3_COPY_DATA, 4));3003	amdgpu_ring_write(ring, 0 |	/* src: register*/3004				(5 << 8) |	/* dst: memory */3005				(1 << 20));	/* write confirm */3006	amdgpu_ring_write(ring, reg);3007	amdgpu_ring_write(ring, 0);3008	amdgpu_ring_write(ring, lower_32_bits(adev->wb.gpu_addr +3009				reg_val_offs * 4));3010	amdgpu_ring_write(ring, upper_32_bits(adev->wb.gpu_addr +3011				reg_val_offs * 4));3012}3013 3014static void gfx_v9_4_3_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg,3015				    uint32_t val)3016{3017	uint32_t cmd = 0;3018 3019	reg = gfx_v9_4_3_normalize_xcc_reg_offset(reg);3020 3021	switch (ring->funcs->type) {3022	case AMDGPU_RING_TYPE_GFX:3023		cmd = WRITE_DATA_ENGINE_SEL(1) | WR_CONFIRM;3024		break;3025	case AMDGPU_RING_TYPE_KIQ:3026		cmd = (1 << 16); /* no inc addr */3027		break;3028	default:3029		cmd = WR_CONFIRM;3030		break;3031	}3032	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));3033	amdgpu_ring_write(ring, cmd);3034	amdgpu_ring_write(ring, reg);3035	amdgpu_ring_write(ring, 0);3036	amdgpu_ring_write(ring, val);3037}3038 3039static void gfx_v9_4_3_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg,3040					uint32_t val, uint32_t mask)3041{3042	gfx_v9_4_3_wait_reg_mem(ring, 0, 0, 0, reg, 0, val, mask, 0x20);3043}3044 3045static void gfx_v9_4_3_ring_emit_reg_write_reg_wait(struct amdgpu_ring *ring,3046						  uint32_t reg0, uint32_t reg1,3047						  uint32_t ref, uint32_t mask)3048{3049	amdgpu_ring_emit_reg_write_reg_wait_helper(ring, reg0, reg1,3050						   ref, mask);3051}3052 3053static void gfx_v9_4_3_ring_soft_recovery(struct amdgpu_ring *ring,3054					  unsigned vmid)3055{3056	struct amdgpu_device *adev = ring->adev;3057	uint32_t value = 0;3058 3059	if (!adev->debug_exp_resets)3060		return;3061 3062	value = REG_SET_FIELD(value, SQ_CMD, CMD, 0x03);3063	value = REG_SET_FIELD(value, SQ_CMD, MODE, 0x01);3064	value = REG_SET_FIELD(value, SQ_CMD, CHECK_VMID, 1);3065	value = REG_SET_FIELD(value, SQ_CMD, VM_ID, vmid);3066	amdgpu_gfx_rlc_enter_safe_mode(adev, ring->xcc_id);3067	WREG32_SOC15(GC, GET_INST(GC, ring->xcc_id), regSQ_CMD, value);3068	amdgpu_gfx_rlc_exit_safe_mode(adev, ring->xcc_id);3069}3070 3071static void gfx_v9_4_3_xcc_set_compute_eop_interrupt_state(3072	struct amdgpu_device *adev, int me, int pipe,3073	enum amdgpu_interrupt_state state, int xcc_id)3074{3075	u32 mec_int_cntl, mec_int_cntl_reg;3076 3077	/*3078	 * amdgpu controls only the first MEC. That's why this function only3079	 * handles the setting of interrupts for this specific MEC. All other3080	 * pipes' interrupts are set by amdkfd.3081	 */3082 3083	if (me == 1) {3084		switch (pipe) {3085		case 0:3086			mec_int_cntl_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_ME1_PIPE0_INT_CNTL);3087			break;3088		case 1:3089			mec_int_cntl_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_ME1_PIPE1_INT_CNTL);3090			break;3091		case 2:3092			mec_int_cntl_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_ME1_PIPE2_INT_CNTL);3093			break;3094		case 3:3095			mec_int_cntl_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_ME1_PIPE3_INT_CNTL);3096			break;3097		default:3098			DRM_DEBUG("invalid pipe %d\n", pipe);3099			return;3100		}3101	} else {3102		DRM_DEBUG("invalid me %d\n", me);3103		return;3104	}3105 3106	switch (state) {3107	case AMDGPU_IRQ_STATE_DISABLE:3108		mec_int_cntl = RREG32_XCC(mec_int_cntl_reg, xcc_id);3109		mec_int_cntl = REG_SET_FIELD(mec_int_cntl, CP_ME1_PIPE0_INT_CNTL,3110					     TIME_STAMP_INT_ENABLE, 0);3111		WREG32_XCC(mec_int_cntl_reg, mec_int_cntl, xcc_id);3112		break;3113	case AMDGPU_IRQ_STATE_ENABLE:3114		mec_int_cntl = RREG32_XCC(mec_int_cntl_reg, xcc_id);3115		mec_int_cntl = REG_SET_FIELD(mec_int_cntl, CP_ME1_PIPE0_INT_CNTL,3116					     TIME_STAMP_INT_ENABLE, 1);3117		WREG32_XCC(mec_int_cntl_reg, mec_int_cntl, xcc_id);3118		break;3119	default:3120		break;3121	}3122}3123 3124static u32 gfx_v9_4_3_get_cpc_int_cntl(struct amdgpu_device *adev,3125				     int xcc_id, int me, int pipe)3126{3127	/*3128	 * amdgpu controls only the first MEC. That's why this function only3129	 * handles the setting of interrupts for this specific MEC. All other3130	 * pipes' interrupts are set by amdkfd.3131	 */3132	if (me != 1)3133		return 0;3134 3135	switch (pipe) {3136	case 0:3137		return SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_ME1_PIPE0_INT_CNTL);3138	case 1:3139		return SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_ME1_PIPE1_INT_CNTL);3140	case 2:3141		return SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_ME1_PIPE2_INT_CNTL);3142	case 3:3143		return SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_ME1_PIPE3_INT_CNTL);3144	default:3145		return 0;3146	}3147}3148 3149static int gfx_v9_4_3_set_priv_reg_fault_state(struct amdgpu_device *adev,3150					     struct amdgpu_irq_src *source,3151					     unsigned type,3152					     enum amdgpu_interrupt_state state)3153{3154	u32 mec_int_cntl_reg, mec_int_cntl;3155	int i, j, k, num_xcc;3156 3157	num_xcc = NUM_XCC(adev->gfx.xcc_mask);3158	switch (state) {3159	case AMDGPU_IRQ_STATE_DISABLE:3160	case AMDGPU_IRQ_STATE_ENABLE:3161		for (i = 0; i < num_xcc; i++) {3162			WREG32_FIELD15_PREREG(GC, GET_INST(GC, i), CP_INT_CNTL_RING0,3163					      PRIV_REG_INT_ENABLE,3164					      state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0);3165			for (j = 0; j < adev->gfx.mec.num_mec; j++) {3166				for (k = 0; k < adev->gfx.mec.num_pipe_per_mec; k++) {3167					/* MECs start at 1 */3168					mec_int_cntl_reg = gfx_v9_4_3_get_cpc_int_cntl(adev, i, j + 1, k);3169 3170					if (mec_int_cntl_reg) {3171						mec_int_cntl = RREG32_XCC(mec_int_cntl_reg, i);3172						mec_int_cntl = REG_SET_FIELD(mec_int_cntl, CP_ME1_PIPE0_INT_CNTL,3173									     PRIV_REG_INT_ENABLE,3174									     state == AMDGPU_IRQ_STATE_ENABLE ?3175									     1 : 0);3176						WREG32_XCC(mec_int_cntl_reg, mec_int_cntl, i);3177					}3178				}3179			}3180		}3181		break;3182	default:3183		break;3184	}3185 3186	return 0;3187}3188 3189static int gfx_v9_4_3_set_bad_op_fault_state(struct amdgpu_device *adev,3190					     struct amdgpu_irq_src *source,3191					     unsigned type,3192					     enum amdgpu_interrupt_state state)3193{3194	u32 mec_int_cntl_reg, mec_int_cntl;3195	int i, j, k, num_xcc;3196 3197	num_xcc = NUM_XCC(adev->gfx.xcc_mask);3198	switch (state) {3199	case AMDGPU_IRQ_STATE_DISABLE:3200	case AMDGPU_IRQ_STATE_ENABLE:3201		for (i = 0; i < num_xcc; i++) {3202			WREG32_FIELD15_PREREG(GC, GET_INST(GC, i), CP_INT_CNTL_RING0,3203					      OPCODE_ERROR_INT_ENABLE,3204					      state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0);3205			for (j = 0; j < adev->gfx.mec.num_mec; j++) {3206				for (k = 0; k < adev->gfx.mec.num_pipe_per_mec; k++) {3207					/* MECs start at 1 */3208					mec_int_cntl_reg = gfx_v9_4_3_get_cpc_int_cntl(adev, i, j + 1, k);3209 3210					if (mec_int_cntl_reg) {3211						mec_int_cntl = RREG32_XCC(mec_int_cntl_reg, i);3212						mec_int_cntl = REG_SET_FIELD(mec_int_cntl, CP_ME1_PIPE0_INT_CNTL,3213									     OPCODE_ERROR_INT_ENABLE,3214									     state == AMDGPU_IRQ_STATE_ENABLE ?3215									     1 : 0);3216						WREG32_XCC(mec_int_cntl_reg, mec_int_cntl, i);3217					}3218				}3219			}3220		}3221		break;3222	default:3223		break;3224	}3225 3226	return 0;3227}3228 3229static int gfx_v9_4_3_set_priv_inst_fault_state(struct amdgpu_device *adev,3230					      struct amdgpu_irq_src *source,3231					      unsigned type,3232					      enum amdgpu_interrupt_state state)3233{3234	int i, num_xcc;3235 3236	num_xcc = NUM_XCC(adev->gfx.xcc_mask);3237	switch (state) {3238	case AMDGPU_IRQ_STATE_DISABLE:3239	case AMDGPU_IRQ_STATE_ENABLE:3240		for (i = 0; i < num_xcc; i++)3241			WREG32_FIELD15_PREREG(GC, GET_INST(GC, i), CP_INT_CNTL_RING0,3242				PRIV_INSTR_INT_ENABLE,3243				state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0);3244		break;3245	default:3246		break;3247	}3248 3249	return 0;3250}3251 3252static int gfx_v9_4_3_set_eop_interrupt_state(struct amdgpu_device *adev,3253					    struct amdgpu_irq_src *src,3254					    unsigned type,3255					    enum amdgpu_interrupt_state state)3256{3257	int i, num_xcc;3258 3259	num_xcc = NUM_XCC(adev->gfx.xcc_mask);3260	for (i = 0; i < num_xcc; i++) {3261		switch (type) {3262		case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP:3263			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state(3264				adev, 1, 0, state, i);3265			break;3266		case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE1_EOP:3267			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state(3268				adev, 1, 1, state, i);3269			break;3270		case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE2_EOP:3271			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state(3272				adev, 1, 2, state, i);3273			break;3274		case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE3_EOP:3275			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state(3276				adev, 1, 3, state, i);3277			break;3278		case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE0_EOP:3279			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state(3280				adev, 2, 0, state, i);3281			break;3282		case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE1_EOP:3283			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state(3284				adev, 2, 1, state, i);3285			break;3286		case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE2_EOP:3287			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state(3288				adev, 2, 2, state, i);3289			break;3290		case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE3_EOP:3291			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state(3292				adev, 2, 3, state, i);3293			break;3294		default:3295			break;3296		}3297	}3298 3299	return 0;3300}3301 3302static int gfx_v9_4_3_eop_irq(struct amdgpu_device *adev,3303			    struct amdgpu_irq_src *source,3304			    struct amdgpu_iv_entry *entry)3305{3306	int i, xcc_id;3307	u8 me_id, pipe_id, queue_id;3308	struct amdgpu_ring *ring;3309 3310	DRM_DEBUG("IH: CP EOP\n");3311	me_id = (entry->ring_id & 0x0c) >> 2;3312	pipe_id = (entry->ring_id & 0x03) >> 0;3313	queue_id = (entry->ring_id & 0x70) >> 4;3314 3315	xcc_id = gfx_v9_4_3_ih_to_xcc_inst(adev, entry->node_id);3316 3317	if (xcc_id == -EINVAL)3318		return -EINVAL;3319 3320	switch (me_id) {3321	case 0:3322	case 1:3323	case 2:3324		for (i = 0; i < adev->gfx.num_compute_rings; i++) {3325			ring = &adev->gfx.compute_ring3326					[i +3327					 xcc_id * adev->gfx.num_compute_rings];3328			/* Per-queue interrupt is supported for MEC starting from VI.3329			  * The interrupt can only be enabled/disabled per pipe instead of per queue.3330			  */3331 3332			if ((ring->me == me_id) && (ring->pipe == pipe_id) && (ring->queue == queue_id))3333				amdgpu_fence_process(ring);3334		}3335		break;3336	}3337	return 0;3338}3339 3340static void gfx_v9_4_3_fault(struct amdgpu_device *adev,3341			   struct amdgpu_iv_entry *entry)3342{3343	u8 me_id, pipe_id, queue_id;3344	struct amdgpu_ring *ring;3345	int i, xcc_id;3346 3347	me_id = (entry->ring_id & 0x0c) >> 2;3348	pipe_id = (entry->ring_id & 0x03) >> 0;3349	queue_id = (entry->ring_id & 0x70) >> 4;3350 3351	xcc_id = gfx_v9_4_3_ih_to_xcc_inst(adev, entry->node_id);3352 3353	if (xcc_id == -EINVAL)3354		return;3355 3356	switch (me_id) {3357	case 0:3358	case 1:3359	case 2:3360		for (i = 0; i < adev->gfx.num_compute_rings; i++) {3361			ring = &adev->gfx.compute_ring3362					[i +3363					 xcc_id * adev->gfx.num_compute_rings];3364			if (ring->me == me_id && ring->pipe == pipe_id &&3365			    ring->queue == queue_id)3366				drm_sched_fault(&ring->sched);3367		}3368		break;3369	}3370}3371 3372static int gfx_v9_4_3_priv_reg_irq(struct amdgpu_device *adev,3373				 struct amdgpu_irq_src *source,3374				 struct amdgpu_iv_entry *entry)3375{3376	DRM_ERROR("Illegal register access in command stream\n");3377	gfx_v9_4_3_fault(adev, entry);3378	return 0;3379}3380 3381static int gfx_v9_4_3_bad_op_irq(struct amdgpu_device *adev,3382				 struct amdgpu_irq_src *source,3383				 struct amdgpu_iv_entry *entry)3384{3385	DRM_ERROR("Illegal opcode in command stream\n");3386	gfx_v9_4_3_fault(adev, entry);3387	return 0;3388}3389 3390static int gfx_v9_4_3_priv_inst_irq(struct amdgpu_device *adev,3391				  struct amdgpu_irq_src *source,3392				  struct amdgpu_iv_entry *entry)3393{3394	DRM_ERROR("Illegal instruction in command stream\n");3395	gfx_v9_4_3_fault(adev, entry);3396	return 0;3397}3398 3399static void gfx_v9_4_3_emit_mem_sync(struct amdgpu_ring *ring)3400{3401	const unsigned int cp_coher_cntl =3402			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_ICACHE_ACTION_ENA(1) |3403			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_KCACHE_ACTION_ENA(1) |3404			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_ACTION_ENA(1) |3405			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TCL1_ACTION_ENA(1) |3406			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_WB_ACTION_ENA(1);3407 3408	/* ACQUIRE_MEM -make one or more surfaces valid for use by the subsequent operations */3409	amdgpu_ring_write(ring, PACKET3(PACKET3_ACQUIRE_MEM, 5));3410	amdgpu_ring_write(ring, cp_coher_cntl); /* CP_COHER_CNTL */3411	amdgpu_ring_write(ring, 0xffffffff);  /* CP_COHER_SIZE */3412	amdgpu_ring_write(ring, 0xffffff);  /* CP_COHER_SIZE_HI */3413	amdgpu_ring_write(ring, 0); /* CP_COHER_BASE */3414	amdgpu_ring_write(ring, 0);  /* CP_COHER_BASE_HI */3415	amdgpu_ring_write(ring, 0x0000000A); /* POLL_INTERVAL */3416}3417 3418static void gfx_v9_4_3_emit_wave_limit_cs(struct amdgpu_ring *ring,3419					uint32_t pipe, bool enable)3420{3421	struct amdgpu_device *adev = ring->adev;3422	uint32_t val;3423	uint32_t wcl_cs_reg;3424 3425	/* regSPI_WCL_PIPE_PERCENT_CS[0-7]_DEFAULT values are same */3426	val = enable ? 0x1 : 0x7f;3427 3428	switch (pipe) {3429	case 0:3430		wcl_cs_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regSPI_WCL_PIPE_PERCENT_CS0);3431		break;3432	case 1:3433		wcl_cs_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regSPI_WCL_PIPE_PERCENT_CS1);3434		break;3435	case 2:3436		wcl_cs_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regSPI_WCL_PIPE_PERCENT_CS2);3437		break;3438	case 3:3439		wcl_cs_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regSPI_WCL_PIPE_PERCENT_CS3);3440		break;3441	default:3442		DRM_DEBUG("invalid pipe %d\n", pipe);3443		return;3444	}3445 3446	amdgpu_ring_emit_wreg(ring, wcl_cs_reg, val);3447 3448}3449static void gfx_v9_4_3_emit_wave_limit(struct amdgpu_ring *ring, bool enable)3450{3451	struct amdgpu_device *adev = ring->adev;3452	uint32_t val;3453	int i;3454 3455	/* regSPI_WCL_PIPE_PERCENT_GFX is 7 bit multiplier register to limit3456	 * number of gfx waves. Setting 5 bit will make sure gfx only gets3457	 * around 25% of gpu resources.3458	 */3459	val = enable ? 0x1f : 0x07ffffff;3460	amdgpu_ring_emit_wreg(ring,3461			      SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regSPI_WCL_PIPE_PERCENT_GFX),3462			      val);3463 3464	/* Restrict waves for normal/low priority compute queues as well3465	 * to get best QoS for high priority compute jobs.3466	 *3467	 * amdgpu controls only 1st ME(0-3 CS pipes).3468	 */3469	for (i = 0; i < adev->gfx.mec.num_pipe_per_mec; i++) {3470		if (i != ring->pipe)3471			gfx_v9_4_3_emit_wave_limit_cs(ring, i, enable);3472 3473	}3474}3475 3476static int gfx_v9_4_3_unmap_done(struct amdgpu_device *adev, uint32_t me,3477				uint32_t pipe, uint32_t queue,3478				uint32_t xcc_id)3479{3480	int i, r;3481	/* make sure dequeue is complete*/3482	gfx_v9_4_3_xcc_set_safe_mode(adev, xcc_id);3483	mutex_lock(&adev->srbm_mutex);3484	soc15_grbm_select(adev, me, pipe, queue, 0, GET_INST(GC, xcc_id));3485	for (i = 0; i < adev->usec_timeout; i++) {3486		if (!(RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_ACTIVE) & 1))3487			break;3488		udelay(1);3489	}3490	if (i >= adev->usec_timeout)3491		r = -ETIMEDOUT;3492	else3493		r = 0;3494	soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, xcc_id));3495	mutex_unlock(&adev->srbm_mutex);3496	gfx_v9_4_3_xcc_unset_safe_mode(adev, xcc_id);3497 3498	return r;3499 3500}3501 3502static bool gfx_v9_4_3_pipe_reset_support(struct amdgpu_device *adev)3503{3504	/*TODO: Need check gfx9.4.4 mec fw whether supports pipe reset as well.*/3505	if (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3) &&3506			adev->gfx.mec_fw_version >= 0x0000009b)3507		return true;3508	else3509		dev_warn_once(adev->dev, "Please use the latest MEC version to see whether support pipe reset\n");3510 3511	return false;3512}3513 3514static int gfx_v9_4_3_reset_hw_pipe(struct amdgpu_ring *ring)3515{3516	struct amdgpu_device *adev = ring->adev;3517	uint32_t reset_pipe, clean_pipe;3518	int r;3519 3520	if (!gfx_v9_4_3_pipe_reset_support(adev))3521		return -EINVAL;3522 3523	gfx_v9_4_3_xcc_set_safe_mode(adev, ring->xcc_id);3524	mutex_lock(&adev->srbm_mutex);3525 3526	reset_pipe = RREG32_SOC15(GC, GET_INST(GC, ring->xcc_id), regCP_MEC_CNTL);3527	clean_pipe = reset_pipe;3528 3529	if (ring->me == 1) {3530		switch (ring->pipe) {3531		case 0:3532			reset_pipe = REG_SET_FIELD(reset_pipe, CP_MEC_CNTL,3533						   MEC_ME1_PIPE0_RESET, 1);3534			break;3535		case 1:3536			reset_pipe = REG_SET_FIELD(reset_pipe, CP_MEC_CNTL,3537						   MEC_ME1_PIPE1_RESET, 1);3538			break;3539		case 2:3540			reset_pipe = REG_SET_FIELD(reset_pipe, CP_MEC_CNTL,3541						   MEC_ME1_PIPE2_RESET, 1);3542			break;3543		case 3:3544			reset_pipe = REG_SET_FIELD(reset_pipe, CP_MEC_CNTL,3545						   MEC_ME1_PIPE3_RESET, 1);3546			break;3547		default:3548			break;3549		}3550	} else {3551		if (ring->pipe)3552			reset_pipe = REG_SET_FIELD(reset_pipe, CP_MEC_CNTL,3553						   MEC_ME2_PIPE1_RESET, 1);3554		else3555			reset_pipe = REG_SET_FIELD(reset_pipe, CP_MEC_CNTL,3556						   MEC_ME2_PIPE0_RESET, 1);3557	}3558 3559	WREG32_SOC15(GC, GET_INST(GC, ring->xcc_id), regCP_MEC_CNTL, reset_pipe);3560	WREG32_SOC15(GC, GET_INST(GC, ring->xcc_id), regCP_MEC_CNTL, clean_pipe);3561	mutex_unlock(&adev->srbm_mutex);3562	gfx_v9_4_3_xcc_unset_safe_mode(adev, ring->xcc_id);3563 3564	r = gfx_v9_4_3_unmap_done(adev, ring->me, ring->pipe, ring->queue, ring->xcc_id);3565	return r;3566}3567 3568static int gfx_v9_4_3_reset_kcq(struct amdgpu_ring *ring,3569				unsigned int vmid)3570{3571	struct amdgpu_device *adev = ring->adev;3572	struct amdgpu_kiq *kiq = &adev->gfx.kiq[ring->xcc_id];3573	struct amdgpu_ring *kiq_ring = &kiq->ring;3574	unsigned long flags;3575	int r;3576 3577	if (!adev->debug_exp_resets)3578		return -EINVAL;3579 3580	if (amdgpu_sriov_vf(adev))3581		return -EINVAL;3582 3583	if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)3584		return -EINVAL;3585 3586	spin_lock_irqsave(&kiq->ring_lock, flags);3587 3588	if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size)) {3589		spin_unlock_irqrestore(&kiq->ring_lock, flags);3590		return -ENOMEM;3591	}3592 3593	kiq->pmf->kiq_unmap_queues(kiq_ring, ring, RESET_QUEUES,3594				   0, 0);3595	amdgpu_ring_commit(kiq_ring);3596 3597	spin_unlock_irqrestore(&kiq->ring_lock, flags);3598 3599	r = amdgpu_ring_test_ring(kiq_ring);3600	if (r) {3601		dev_err(adev->dev, "kiq ring test failed after ring: %s queue reset\n",3602				ring->name);3603		goto pipe_reset;3604	}3605 3606	r = gfx_v9_4_3_unmap_done(adev, ring->me, ring->pipe, ring->queue, ring->xcc_id);3607	if (r)3608		dev_err(adev->dev, "fail to wait on hqd deactive and will try pipe reset\n");3609 3610pipe_reset:3611	if(r) {3612		r = gfx_v9_4_3_reset_hw_pipe(ring);3613		dev_info(adev->dev, "ring: %s pipe reset :%s\n", ring->name,3614				r ? "failed" : "successfully");3615		if (r)3616			return r;3617	}3618 3619	r = amdgpu_bo_reserve(ring->mqd_obj, false);3620	if (unlikely(r != 0)){3621		dev_err(adev->dev, "fail to resv mqd_obj\n");3622		return r;3623	}3624	r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);3625	if (!r) {3626		r = gfx_v9_4_3_xcc_kcq_init_queue(ring, ring->xcc_id, true);3627		amdgpu_bo_kunmap(ring->mqd_obj);3628		ring->mqd_ptr = NULL;3629	}3630	amdgpu_bo_unreserve(ring->mqd_obj);3631	if (r) {3632		dev_err(adev->dev, "fail to unresv mqd_obj\n");3633		return r;3634	}3635	spin_lock_irqsave(&kiq->ring_lock, flags);3636	r = amdgpu_ring_alloc(kiq_ring, kiq->pmf->map_queues_size);3637	if (r) {3638		spin_unlock_irqrestore(&kiq->ring_lock, flags);3639		return -ENOMEM;3640	}3641	kiq->pmf->kiq_map_queues(kiq_ring, ring);3642	amdgpu_ring_commit(kiq_ring);3643	spin_unlock_irqrestore(&kiq->ring_lock, flags);3644 3645	r = amdgpu_ring_test_ring(kiq_ring);3646	if (r) {3647		dev_err(adev->dev, "fail to remap queue\n");3648		return r;3649	}3650	return amdgpu_ring_test_ring(ring);3651}3652 3653enum amdgpu_gfx_cp_ras_mem_id {3654	AMDGPU_GFX_CP_MEM1 = 1,3655	AMDGPU_GFX_CP_MEM2,3656	AMDGPU_GFX_CP_MEM3,3657	AMDGPU_GFX_CP_MEM4,3658	AMDGPU_GFX_CP_MEM5,3659};3660 3661enum amdgpu_gfx_gcea_ras_mem_id {3662	AMDGPU_GFX_GCEA_IOWR_CMDMEM = 4,3663	AMDGPU_GFX_GCEA_IORD_CMDMEM,3664	AMDGPU_GFX_GCEA_GMIWR_CMDMEM,3665	AMDGPU_GFX_GCEA_GMIRD_CMDMEM,3666	AMDGPU_GFX_GCEA_DRAMWR_CMDMEM,3667	AMDGPU_GFX_GCEA_DRAMRD_CMDMEM,3668	AMDGPU_GFX_GCEA_MAM_DMEM0,3669	AMDGPU_GFX_GCEA_MAM_DMEM1,3670	AMDGPU_GFX_GCEA_MAM_DMEM2,3671	AMDGPU_GFX_GCEA_MAM_DMEM3,3672	AMDGPU_GFX_GCEA_MAM_AMEM0,3673	AMDGPU_GFX_GCEA_MAM_AMEM1,3674	AMDGPU_GFX_GCEA_MAM_AMEM2,3675	AMDGPU_GFX_GCEA_MAM_AMEM3,3676	AMDGPU_GFX_GCEA_MAM_AFLUSH_BUFFER,3677	AMDGPU_GFX_GCEA_WRET_TAGMEM,3678	AMDGPU_GFX_GCEA_RRET_TAGMEM,3679	AMDGPU_GFX_GCEA_IOWR_DATAMEM,3680	AMDGPU_GFX_GCEA_GMIWR_DATAMEM,3681	AMDGPU_GFX_GCEA_DRAM_DATAMEM,3682};3683 3684enum amdgpu_gfx_gc_cane_ras_mem_id {3685	AMDGPU_GFX_GC_CANE_MEM0 = 0,3686};3687 3688enum amdgpu_gfx_gcutcl2_ras_mem_id {3689	AMDGPU_GFX_GCUTCL2_MEM2P512X95 = 160,3690};3691 3692enum amdgpu_gfx_gds_ras_mem_id {3693	AMDGPU_GFX_GDS_MEM0 = 0,3694};3695 3696enum amdgpu_gfx_lds_ras_mem_id {3697	AMDGPU_GFX_LDS_BANK0 = 0,3698	AMDGPU_GFX_LDS_BANK1,3699	AMDGPU_GFX_LDS_BANK2,3700	AMDGPU_GFX_LDS_BANK3,3701	AMDGPU_GFX_LDS_BANK4,3702	AMDGPU_GFX_LDS_BANK5,3703	AMDGPU_GFX_LDS_BANK6,3704	AMDGPU_GFX_LDS_BANK7,3705	AMDGPU_GFX_LDS_BANK8,3706	AMDGPU_GFX_LDS_BANK9,3707	AMDGPU_GFX_LDS_BANK10,3708	AMDGPU_GFX_LDS_BANK11,3709	AMDGPU_GFX_LDS_BANK12,3710	AMDGPU_GFX_LDS_BANK13,3711	AMDGPU_GFX_LDS_BANK14,3712	AMDGPU_GFX_LDS_BANK15,3713	AMDGPU_GFX_LDS_BANK16,3714	AMDGPU_GFX_LDS_BANK17,3715	AMDGPU_GFX_LDS_BANK18,3716	AMDGPU_GFX_LDS_BANK19,3717	AMDGPU_GFX_LDS_BANK20,3718	AMDGPU_GFX_LDS_BANK21,3719	AMDGPU_GFX_LDS_BANK22,3720	AMDGPU_GFX_LDS_BANK23,3721	AMDGPU_GFX_LDS_BANK24,3722	AMDGPU_GFX_LDS_BANK25,3723	AMDGPU_GFX_LDS_BANK26,3724	AMDGPU_GFX_LDS_BANK27,3725	AMDGPU_GFX_LDS_BANK28,3726	AMDGPU_GFX_LDS_BANK29,3727	AMDGPU_GFX_LDS_BANK30,3728	AMDGPU_GFX_LDS_BANK31,3729	AMDGPU_GFX_LDS_SP_BUFFER_A,3730	AMDGPU_GFX_LDS_SP_BUFFER_B,3731};3732 3733enum amdgpu_gfx_rlc_ras_mem_id {3734	AMDGPU_GFX_RLC_GPMF32 = 1,3735	AMDGPU_GFX_RLC_RLCVF32,3736	AMDGPU_GFX_RLC_SCRATCH,3737	AMDGPU_GFX_RLC_SRM_ARAM,3738	AMDGPU_GFX_RLC_SRM_DRAM,3739	AMDGPU_GFX_RLC_TCTAG,3740	AMDGPU_GFX_RLC_SPM_SE,3741	AMDGPU_GFX_RLC_SPM_GRBMT,3742};3743 3744enum amdgpu_gfx_sp_ras_mem_id {3745	AMDGPU_GFX_SP_SIMDID0 = 0,3746};3747 3748enum amdgpu_gfx_spi_ras_mem_id {3749	AMDGPU_GFX_SPI_MEM0 = 0,3750	AMDGPU_GFX_SPI_MEM1,3751	AMDGPU_GFX_SPI_MEM2,3752	AMDGPU_GFX_SPI_MEM3,3753};3754 3755enum amdgpu_gfx_sqc_ras_mem_id {3756	AMDGPU_GFX_SQC_INST_CACHE_A = 100,3757	AMDGPU_GFX_SQC_INST_CACHE_B = 101,3758	AMDGPU_GFX_SQC_INST_CACHE_TAG_A = 102,3759	AMDGPU_GFX_SQC_INST_CACHE_TAG_B = 103,3760	AMDGPU_GFX_SQC_INST_CACHE_MISS_FIFO_A = 104,3761	AMDGPU_GFX_SQC_INST_CACHE_MISS_FIFO_B = 105,3762	AMDGPU_GFX_SQC_INST_CACHE_GATCL1_MISS_FIFO_A = 106,3763	AMDGPU_GFX_SQC_INST_CACHE_GATCL1_MISS_FIFO_B = 107,3764	AMDGPU_GFX_SQC_DATA_CACHE_A = 200,3765	AMDGPU_GFX_SQC_DATA_CACHE_B = 201,3766	AMDGPU_GFX_SQC_DATA_CACHE_TAG_A = 202,3767	AMDGPU_GFX_SQC_DATA_CACHE_TAG_B = 203,3768	AMDGPU_GFX_SQC_DATA_CACHE_MISS_FIFO_A = 204,3769	AMDGPU_GFX_SQC_DATA_CACHE_MISS_FIFO_B = 205,3770	AMDGPU_GFX_SQC_DATA_CACHE_HIT_FIFO_A = 206,3771	AMDGPU_GFX_SQC_DATA_CACHE_HIT_FIFO_B = 207,3772	AMDGPU_GFX_SQC_DIRTY_BIT_A = 208,3773	AMDGPU_GFX_SQC_DIRTY_BIT_B = 209,3774	AMDGPU_GFX_SQC_WRITE_DATA_BUFFER_CU0 = 210,3775	AMDGPU_GFX_SQC_WRITE_DATA_BUFFER_CU1 = 211,3776	AMDGPU_GFX_SQC_UTCL1_MISS_LFIFO_DATA_CACHE_A = 212,3777	AMDGPU_GFX_SQC_UTCL1_MISS_LFIFO_DATA_CACHE_B = 213,3778	AMDGPU_GFX_SQC_UTCL1_MISS_LFIFO_INST_CACHE = 108,3779};3780 3781enum amdgpu_gfx_sq_ras_mem_id {3782	AMDGPU_GFX_SQ_SGPR_MEM0 = 0,3783	AMDGPU_GFX_SQ_SGPR_MEM1,3784	AMDGPU_GFX_SQ_SGPR_MEM2,3785	AMDGPU_GFX_SQ_SGPR_MEM3,3786};3787 3788enum amdgpu_gfx_ta_ras_mem_id {3789	AMDGPU_GFX_TA_FS_AFIFO_RAM_LO = 1,3790	AMDGPU_GFX_TA_FS_AFIFO_RAM_HI,3791	AMDGPU_GFX_TA_FS_CFIFO_RAM,3792	AMDGPU_GFX_TA_FSX_LFIFO,3793	AMDGPU_GFX_TA_FS_DFIFO_RAM,3794};3795 3796enum amdgpu_gfx_tcc_ras_mem_id {3797	AMDGPU_GFX_TCC_MEM1 = 1,3798};3799 3800enum amdgpu_gfx_tca_ras_mem_id {3801	AMDGPU_GFX_TCA_MEM1 = 1,3802};3803 3804enum amdgpu_gfx_tci_ras_mem_id {3805	AMDGPU_GFX_TCIW_MEM = 1,3806};3807 3808enum amdgpu_gfx_tcp_ras_mem_id {3809	AMDGPU_GFX_TCP_LFIFO0 = 1,3810	AMDGPU_GFX_TCP_SET0BANK0_RAM,3811	AMDGPU_GFX_TCP_SET0BANK1_RAM,3812	AMDGPU_GFX_TCP_SET0BANK2_RAM,3813	AMDGPU_GFX_TCP_SET0BANK3_RAM,3814	AMDGPU_GFX_TCP_SET1BANK0_RAM,3815	AMDGPU_GFX_TCP_SET1BANK1_RAM,3816	AMDGPU_GFX_TCP_SET1BANK2_RAM,3817	AMDGPU_GFX_TCP_SET1BANK3_RAM,3818	AMDGPU_GFX_TCP_SET2BANK0_RAM,3819	AMDGPU_GFX_TCP_SET2BANK1_RAM,3820	AMDGPU_GFX_TCP_SET2BANK2_RAM,3821	AMDGPU_GFX_TCP_SET2BANK3_RAM,3822	AMDGPU_GFX_TCP_SET3BANK0_RAM,3823	AMDGPU_GFX_TCP_SET3BANK1_RAM,3824	AMDGPU_GFX_TCP_SET3BANK2_RAM,3825	AMDGPU_GFX_TCP_SET3BANK3_RAM,3826	AMDGPU_GFX_TCP_VM_FIFO,3827	AMDGPU_GFX_TCP_DB_TAGRAM0,3828	AMDGPU_GFX_TCP_DB_TAGRAM1,3829	AMDGPU_GFX_TCP_DB_TAGRAM2,3830	AMDGPU_GFX_TCP_DB_TAGRAM3,3831	AMDGPU_GFX_TCP_UTCL1_LFIFO_PROBE0,3832	AMDGPU_GFX_TCP_UTCL1_LFIFO_PROBE1,3833	AMDGPU_GFX_TCP_CMD_FIFO,3834};3835 3836enum amdgpu_gfx_td_ras_mem_id {3837	AMDGPU_GFX_TD_UTD_CS_FIFO_MEM = 1,3838	AMDGPU_GFX_TD_UTD_SS_FIFO_LO_MEM,3839	AMDGPU_GFX_TD_UTD_SS_FIFO_HI_MEM,3840};3841 3842enum amdgpu_gfx_tcx_ras_mem_id {3843	AMDGPU_GFX_TCX_FIFOD0 = 0,3844	AMDGPU_GFX_TCX_FIFOD1,3845	AMDGPU_GFX_TCX_FIFOD2,3846	AMDGPU_GFX_TCX_FIFOD3,3847	AMDGPU_GFX_TCX_FIFOD4,3848	AMDGPU_GFX_TCX_FIFOD5,3849	AMDGPU_GFX_TCX_FIFOD6,3850	AMDGPU_GFX_TCX_FIFOD7,3851	AMDGPU_GFX_TCX_FIFOB0,3852	AMDGPU_GFX_TCX_FIFOB1,3853	AMDGPU_GFX_TCX_FIFOB2,3854	AMDGPU_GFX_TCX_FIFOB3,3855	AMDGPU_GFX_TCX_FIFOB4,3856	AMDGPU_GFX_TCX_FIFOB5,3857	AMDGPU_GFX_TCX_FIFOB6,3858	AMDGPU_GFX_TCX_FIFOB7,3859	AMDGPU_GFX_TCX_FIFOA0,3860	AMDGPU_GFX_TCX_FIFOA1,3861	AMDGPU_GFX_TCX_FIFOA2,3862	AMDGPU_GFX_TCX_FIFOA3,3863	AMDGPU_GFX_TCX_FIFOA4,3864	AMDGPU_GFX_TCX_FIFOA5,3865	AMDGPU_GFX_TCX_FIFOA6,3866	AMDGPU_GFX_TCX_FIFOA7,3867	AMDGPU_GFX_TCX_CFIFO0,3868	AMDGPU_GFX_TCX_CFIFO1,3869	AMDGPU_GFX_TCX_CFIFO2,3870	AMDGPU_GFX_TCX_CFIFO3,3871	AMDGPU_GFX_TCX_CFIFO4,3872	AMDGPU_GFX_TCX_CFIFO5,3873	AMDGPU_GFX_TCX_CFIFO6,3874	AMDGPU_GFX_TCX_CFIFO7,3875	AMDGPU_GFX_TCX_FIFO_ACKB0,3876	AMDGPU_GFX_TCX_FIFO_ACKB1,3877	AMDGPU_GFX_TCX_FIFO_ACKB2,3878	AMDGPU_GFX_TCX_FIFO_ACKB3,3879	AMDGPU_GFX_TCX_FIFO_ACKB4,3880	AMDGPU_GFX_TCX_FIFO_ACKB5,3881	AMDGPU_GFX_TCX_FIFO_ACKB6,3882	AMDGPU_GFX_TCX_FIFO_ACKB7,3883	AMDGPU_GFX_TCX_FIFO_ACKD0,3884	AMDGPU_GFX_TCX_FIFO_ACKD1,3885	AMDGPU_GFX_TCX_FIFO_ACKD2,3886	AMDGPU_GFX_TCX_FIFO_ACKD3,3887	AMDGPU_GFX_TCX_FIFO_ACKD4,3888	AMDGPU_GFX_TCX_FIFO_ACKD5,3889	AMDGPU_GFX_TCX_FIFO_ACKD6,3890	AMDGPU_GFX_TCX_FIFO_ACKD7,3891	AMDGPU_GFX_TCX_DST_FIFOA0,3892	AMDGPU_GFX_TCX_DST_FIFOA1,3893	AMDGPU_GFX_TCX_DST_FIFOA2,3894	AMDGPU_GFX_TCX_DST_FIFOA3,3895	AMDGPU_GFX_TCX_DST_FIFOA4,3896	AMDGPU_GFX_TCX_DST_FIFOA5,3897	AMDGPU_GFX_TCX_DST_FIFOA6,3898	AMDGPU_GFX_TCX_DST_FIFOA7,3899	AMDGPU_GFX_TCX_DST_FIFOB0,3900	AMDGPU_GFX_TCX_DST_FIFOB1,3901	AMDGPU_GFX_TCX_DST_FIFOB2,3902	AMDGPU_GFX_TCX_DST_FIFOB3,3903	AMDGPU_GFX_TCX_DST_FIFOB4,3904	AMDGPU_GFX_TCX_DST_FIFOB5,3905	AMDGPU_GFX_TCX_DST_FIFOB6,3906	AMDGPU_GFX_TCX_DST_FIFOB7,3907	AMDGPU_GFX_TCX_DST_FIFOD0,3908	AMDGPU_GFX_TCX_DST_FIFOD1,3909	AMDGPU_GFX_TCX_DST_FIFOD2,3910	AMDGPU_GFX_TCX_DST_FIFOD3,3911	AMDGPU_GFX_TCX_DST_FIFOD4,3912	AMDGPU_GFX_TCX_DST_FIFOD5,3913	AMDGPU_GFX_TCX_DST_FIFOD6,3914	AMDGPU_GFX_TCX_DST_FIFOD7,3915	AMDGPU_GFX_TCX_DST_FIFO_ACKB0,3916	AMDGPU_GFX_TCX_DST_FIFO_ACKB1,3917	AMDGPU_GFX_TCX_DST_FIFO_ACKB2,3918	AMDGPU_GFX_TCX_DST_FIFO_ACKB3,3919	AMDGPU_GFX_TCX_DST_FIFO_ACKB4,3920	AMDGPU_GFX_TCX_DST_FIFO_ACKB5,3921	AMDGPU_GFX_TCX_DST_FIFO_ACKB6,3922	AMDGPU_GFX_TCX_DST_FIFO_ACKB7,3923	AMDGPU_GFX_TCX_DST_FIFO_ACKD0,3924	AMDGPU_GFX_TCX_DST_FIFO_ACKD1,3925	AMDGPU_GFX_TCX_DST_FIFO_ACKD2,3926	AMDGPU_GFX_TCX_DST_FIFO_ACKD3,3927	AMDGPU_GFX_TCX_DST_FIFO_ACKD4,3928	AMDGPU_GFX_TCX_DST_FIFO_ACKD5,3929	AMDGPU_GFX_TCX_DST_FIFO_ACKD6,3930	AMDGPU_GFX_TCX_DST_FIFO_ACKD7,3931};3932 3933enum amdgpu_gfx_atc_l2_ras_mem_id {3934	AMDGPU_GFX_ATC_L2_MEM0 = 0,3935};3936 3937enum amdgpu_gfx_utcl2_ras_mem_id {3938	AMDGPU_GFX_UTCL2_MEM0 = 0,3939};3940 3941enum amdgpu_gfx_vml2_ras_mem_id {3942	AMDGPU_GFX_VML2_MEM0 = 0,3943};3944 3945enum amdgpu_gfx_vml2_walker_ras_mem_id {3946	AMDGPU_GFX_VML2_WALKER_MEM0 = 0,3947};3948 3949static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_cp_mem_list[] = {3950	{AMDGPU_GFX_CP_MEM1, "CP_MEM1"},3951	{AMDGPU_GFX_CP_MEM2, "CP_MEM2"},3952	{AMDGPU_GFX_CP_MEM3, "CP_MEM3"},3953	{AMDGPU_GFX_CP_MEM4, "CP_MEM4"},3954	{AMDGPU_GFX_CP_MEM5, "CP_MEM5"},3955};3956 3957static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_gcea_mem_list[] = {3958	{AMDGPU_GFX_GCEA_IOWR_CMDMEM, "GCEA_IOWR_CMDMEM"},3959	{AMDGPU_GFX_GCEA_IORD_CMDMEM, "GCEA_IORD_CMDMEM"},3960	{AMDGPU_GFX_GCEA_GMIWR_CMDMEM, "GCEA_GMIWR_CMDMEM"},3961	{AMDGPU_GFX_GCEA_GMIRD_CMDMEM, "GCEA_GMIRD_CMDMEM"},3962	{AMDGPU_GFX_GCEA_DRAMWR_CMDMEM, "GCEA_DRAMWR_CMDMEM"},3963	{AMDGPU_GFX_GCEA_DRAMRD_CMDMEM, "GCEA_DRAMRD_CMDMEM"},3964	{AMDGPU_GFX_GCEA_MAM_DMEM0, "GCEA_MAM_DMEM0"},3965	{AMDGPU_GFX_GCEA_MAM_DMEM1, "GCEA_MAM_DMEM1"},3966	{AMDGPU_GFX_GCEA_MAM_DMEM2, "GCEA_MAM_DMEM2"},3967	{AMDGPU_GFX_GCEA_MAM_DMEM3, "GCEA_MAM_DMEM3"},3968	{AMDGPU_GFX_GCEA_MAM_AMEM0, "GCEA_MAM_AMEM0"},3969	{AMDGPU_GFX_GCEA_MAM_AMEM1, "GCEA_MAM_AMEM1"},3970	{AMDGPU_GFX_GCEA_MAM_AMEM2, "GCEA_MAM_AMEM2"},3971	{AMDGPU_GFX_GCEA_MAM_AMEM3, "GCEA_MAM_AMEM3"},3972	{AMDGPU_GFX_GCEA_MAM_AFLUSH_BUFFER, "GCEA_MAM_AFLUSH_BUFFER"},3973	{AMDGPU_GFX_GCEA_WRET_TAGMEM, "GCEA_WRET_TAGMEM"},3974	{AMDGPU_GFX_GCEA_RRET_TAGMEM, "GCEA_RRET_TAGMEM"},3975	{AMDGPU_GFX_GCEA_IOWR_DATAMEM, "GCEA_IOWR_DATAMEM"},3976	{AMDGPU_GFX_GCEA_GMIWR_DATAMEM, "GCEA_GMIWR_DATAMEM"},3977	{AMDGPU_GFX_GCEA_DRAM_DATAMEM, "GCEA_DRAM_DATAMEM"},3978};3979 3980static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_gc_cane_mem_list[] = {3981	{AMDGPU_GFX_GC_CANE_MEM0, "GC_CANE_MEM0"},3982};3983 3984static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_gcutcl2_mem_list[] = {3985	{AMDGPU_GFX_GCUTCL2_MEM2P512X95, "GCUTCL2_MEM2P512X95"},3986};3987 3988static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_gds_mem_list[] = {3989	{AMDGPU_GFX_GDS_MEM0, "GDS_MEM"},3990};3991 3992static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_lds_mem_list[] = {3993	{AMDGPU_GFX_LDS_BANK0, "LDS_BANK0"},3994	{AMDGPU_GFX_LDS_BANK1, "LDS_BANK1"},3995	{AMDGPU_GFX_LDS_BANK2, "LDS_BANK2"},3996	{AMDGPU_GFX_LDS_BANK3, "LDS_BANK3"},3997	{AMDGPU_GFX_LDS_BANK4, "LDS_BANK4"},3998	{AMDGPU_GFX_LDS_BANK5, "LDS_BANK5"},3999	{AMDGPU_GFX_LDS_BANK6, "LDS_BANK6"},4000	{AMDGPU_GFX_LDS_BANK7, "LDS_BANK7"},4001	{AMDGPU_GFX_LDS_BANK8, "LDS_BANK8"},4002	{AMDGPU_GFX_LDS_BANK9, "LDS_BANK9"},4003	{AMDGPU_GFX_LDS_BANK10, "LDS_BANK10"},4004	{AMDGPU_GFX_LDS_BANK11, "LDS_BANK11"},4005	{AMDGPU_GFX_LDS_BANK12, "LDS_BANK12"},4006	{AMDGPU_GFX_LDS_BANK13, "LDS_BANK13"},4007	{AMDGPU_GFX_LDS_BANK14, "LDS_BANK14"},4008	{AMDGPU_GFX_LDS_BANK15, "LDS_BANK15"},4009	{AMDGPU_GFX_LDS_BANK16, "LDS_BANK16"},4010	{AMDGPU_GFX_LDS_BANK17, "LDS_BANK17"},4011	{AMDGPU_GFX_LDS_BANK18, "LDS_BANK18"},4012	{AMDGPU_GFX_LDS_BANK19, "LDS_BANK19"},4013	{AMDGPU_GFX_LDS_BANK20, "LDS_BANK20"},4014	{AMDGPU_GFX_LDS_BANK21, "LDS_BANK21"},4015	{AMDGPU_GFX_LDS_BANK22, "LDS_BANK22"},4016	{AMDGPU_GFX_LDS_BANK23, "LDS_BANK23"},4017	{AMDGPU_GFX_LDS_BANK24, "LDS_BANK24"},4018	{AMDGPU_GFX_LDS_BANK25, "LDS_BANK25"},4019	{AMDGPU_GFX_LDS_BANK26, "LDS_BANK26"},4020	{AMDGPU_GFX_LDS_BANK27, "LDS_BANK27"},4021	{AMDGPU_GFX_LDS_BANK28, "LDS_BANK28"},4022	{AMDGPU_GFX_LDS_BANK29, "LDS_BANK29"},4023	{AMDGPU_GFX_LDS_BANK30, "LDS_BANK30"},4024	{AMDGPU_GFX_LDS_BANK31, "LDS_BANK31"},4025	{AMDGPU_GFX_LDS_SP_BUFFER_A, "LDS_SP_BUFFER_A"},4026	{AMDGPU_GFX_LDS_SP_BUFFER_B, "LDS_SP_BUFFER_B"},4027};4028 4029static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_rlc_mem_list[] = {4030	{AMDGPU_GFX_RLC_GPMF32, "RLC_GPMF32"},4031	{AMDGPU_GFX_RLC_RLCVF32, "RLC_RLCVF32"},4032	{AMDGPU_GFX_RLC_SCRATCH, "RLC_SCRATCH"},4033	{AMDGPU_GFX_RLC_SRM_ARAM, "RLC_SRM_ARAM"},4034	{AMDGPU_GFX_RLC_SRM_DRAM, "RLC_SRM_DRAM"},4035	{AMDGPU_GFX_RLC_TCTAG, "RLC_TCTAG"},4036	{AMDGPU_GFX_RLC_SPM_SE, "RLC_SPM_SE"},4037	{AMDGPU_GFX_RLC_SPM_GRBMT, "RLC_SPM_GRBMT"},4038};4039 4040static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_sp_mem_list[] = {4041	{AMDGPU_GFX_SP_SIMDID0, "SP_SIMDID0"},4042};4043 4044static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_spi_mem_list[] = {4045	{AMDGPU_GFX_SPI_MEM0, "SPI_MEM0"},4046	{AMDGPU_GFX_SPI_MEM1, "SPI_MEM1"},4047	{AMDGPU_GFX_SPI_MEM2, "SPI_MEM2"},4048	{AMDGPU_GFX_SPI_MEM3, "SPI_MEM3"},4049};4050 4051static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_sqc_mem_list[] = {4052	{AMDGPU_GFX_SQC_INST_CACHE_A, "SQC_INST_CACHE_A"},4053	{AMDGPU_GFX_SQC_INST_CACHE_B, "SQC_INST_CACHE_B"},4054	{AMDGPU_GFX_SQC_INST_CACHE_TAG_A, "SQC_INST_CACHE_TAG_A"},4055	{AMDGPU_GFX_SQC_INST_CACHE_TAG_B, "SQC_INST_CACHE_TAG_B"},4056	{AMDGPU_GFX_SQC_INST_CACHE_MISS_FIFO_A, "SQC_INST_CACHE_MISS_FIFO_A"},4057	{AMDGPU_GFX_SQC_INST_CACHE_MISS_FIFO_B, "SQC_INST_CACHE_MISS_FIFO_B"},4058	{AMDGPU_GFX_SQC_INST_CACHE_GATCL1_MISS_FIFO_A, "SQC_INST_CACHE_GATCL1_MISS_FIFO_A"},4059	{AMDGPU_GFX_SQC_INST_CACHE_GATCL1_MISS_FIFO_B, "SQC_INST_CACHE_GATCL1_MISS_FIFO_B"},4060	{AMDGPU_GFX_SQC_DATA_CACHE_A, "SQC_DATA_CACHE_A"},4061	{AMDGPU_GFX_SQC_DATA_CACHE_B, "SQC_DATA_CACHE_B"},4062	{AMDGPU_GFX_SQC_DATA_CACHE_TAG_A, "SQC_DATA_CACHE_TAG_A"},4063	{AMDGPU_GFX_SQC_DATA_CACHE_TAG_B, "SQC_DATA_CACHE_TAG_B"},4064	{AMDGPU_GFX_SQC_DATA_CACHE_MISS_FIFO_A, "SQC_DATA_CACHE_MISS_FIFO_A"},4065	{AMDGPU_GFX_SQC_DATA_CACHE_MISS_FIFO_B, "SQC_DATA_CACHE_MISS_FIFO_B"},4066	{AMDGPU_GFX_SQC_DATA_CACHE_HIT_FIFO_A, "SQC_DATA_CACHE_HIT_FIFO_A"},4067	{AMDGPU_GFX_SQC_DATA_CACHE_HIT_FIFO_B, "SQC_DATA_CACHE_HIT_FIFO_B"},4068	{AMDGPU_GFX_SQC_DIRTY_BIT_A, "SQC_DIRTY_BIT_A"},4069	{AMDGPU_GFX_SQC_DIRTY_BIT_B, "SQC_DIRTY_BIT_B"},4070	{AMDGPU_GFX_SQC_WRITE_DATA_BUFFER_CU0, "SQC_WRITE_DATA_BUFFER_CU0"},4071	{AMDGPU_GFX_SQC_WRITE_DATA_BUFFER_CU1, "SQC_WRITE_DATA_BUFFER_CU1"},4072	{AMDGPU_GFX_SQC_UTCL1_MISS_LFIFO_DATA_CACHE_A, "SQC_UTCL1_MISS_LFIFO_DATA_CACHE_A"},4073	{AMDGPU_GFX_SQC_UTCL1_MISS_LFIFO_DATA_CACHE_B, "SQC_UTCL1_MISS_LFIFO_DATA_CACHE_B"},4074	{AMDGPU_GFX_SQC_UTCL1_MISS_LFIFO_INST_CACHE, "SQC_UTCL1_MISS_LFIFO_INST_CACHE"},4075};4076 4077static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_sq_mem_list[] = {4078	{AMDGPU_GFX_SQ_SGPR_MEM0, "SQ_SGPR_MEM0"},4079	{AMDGPU_GFX_SQ_SGPR_MEM1, "SQ_SGPR_MEM1"},4080	{AMDGPU_GFX_SQ_SGPR_MEM2, "SQ_SGPR_MEM2"},4081	{AMDGPU_GFX_SQ_SGPR_MEM3, "SQ_SGPR_MEM3"},4082};4083 4084static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_ta_mem_list[] = {4085	{AMDGPU_GFX_TA_FS_AFIFO_RAM_LO, "TA_FS_AFIFO_RAM_LO"},4086	{AMDGPU_GFX_TA_FS_AFIFO_RAM_HI, "TA_FS_AFIFO_RAM_HI"},4087	{AMDGPU_GFX_TA_FS_CFIFO_RAM, "TA_FS_CFIFO_RAM"},4088	{AMDGPU_GFX_TA_FSX_LFIFO, "TA_FSX_LFIFO"},4089	{AMDGPU_GFX_TA_FS_DFIFO_RAM, "TA_FS_DFIFO_RAM"},4090};4091 4092static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_tcc_mem_list[] = {4093	{AMDGPU_GFX_TCC_MEM1, "TCC_MEM1"},4094};4095 4096static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_tca_mem_list[] = {4097	{AMDGPU_GFX_TCA_MEM1, "TCA_MEM1"},4098};4099 4100static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_tci_mem_list[] = {4101	{AMDGPU_GFX_TCIW_MEM, "TCIW_MEM"},4102};4103 4104static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_tcp_mem_list[] = {4105	{AMDGPU_GFX_TCP_LFIFO0, "TCP_LFIFO0"},4106	{AMDGPU_GFX_TCP_SET0BANK0_RAM, "TCP_SET0BANK0_RAM"},4107	{AMDGPU_GFX_TCP_SET0BANK1_RAM, "TCP_SET0BANK1_RAM"},4108	{AMDGPU_GFX_TCP_SET0BANK2_RAM, "TCP_SET0BANK2_RAM"},4109	{AMDGPU_GFX_TCP_SET0BANK3_RAM, "TCP_SET0BANK3_RAM"},4110	{AMDGPU_GFX_TCP_SET1BANK0_RAM, "TCP_SET1BANK0_RAM"},4111	{AMDGPU_GFX_TCP_SET1BANK1_RAM, "TCP_SET1BANK1_RAM"},4112	{AMDGPU_GFX_TCP_SET1BANK2_RAM, "TCP_SET1BANK2_RAM"},4113	{AMDGPU_GFX_TCP_SET1BANK3_RAM, "TCP_SET1BANK3_RAM"},4114	{AMDGPU_GFX_TCP_SET2BANK0_RAM, "TCP_SET2BANK0_RAM"},4115	{AMDGPU_GFX_TCP_SET2BANK1_RAM, "TCP_SET2BANK1_RAM"},4116	{AMDGPU_GFX_TCP_SET2BANK2_RAM, "TCP_SET2BANK2_RAM"},4117	{AMDGPU_GFX_TCP_SET2BANK3_RAM, "TCP_SET2BANK3_RAM"},4118	{AMDGPU_GFX_TCP_SET3BANK0_RAM, "TCP_SET3BANK0_RAM"},4119	{AMDGPU_GFX_TCP_SET3BANK1_RAM, "TCP_SET3BANK1_RAM"},4120	{AMDGPU_GFX_TCP_SET3BANK2_RAM, "TCP_SET3BANK2_RAM"},4121	{AMDGPU_GFX_TCP_SET3BANK3_RAM, "TCP_SET3BANK3_RAM"},4122	{AMDGPU_GFX_TCP_VM_FIFO, "TCP_VM_FIFO"},4123	{AMDGPU_GFX_TCP_DB_TAGRAM0, "TCP_DB_TAGRAM0"},4124	{AMDGPU_GFX_TCP_DB_TAGRAM1, "TCP_DB_TAGRAM1"},4125	{AMDGPU_GFX_TCP_DB_TAGRAM2, "TCP_DB_TAGRAM2"},4126	{AMDGPU_GFX_TCP_DB_TAGRAM3, "TCP_DB_TAGRAM3"},4127	{AMDGPU_GFX_TCP_UTCL1_LFIFO_PROBE0, "TCP_UTCL1_LFIFO_PROBE0"},4128	{AMDGPU_GFX_TCP_UTCL1_LFIFO_PROBE1, "TCP_UTCL1_LFIFO_PROBE1"},4129	{AMDGPU_GFX_TCP_CMD_FIFO, "TCP_CMD_FIFO"},4130};4131 4132static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_td_mem_list[] = {4133	{AMDGPU_GFX_TD_UTD_CS_FIFO_MEM, "TD_UTD_CS_FIFO_MEM"},4134	{AMDGPU_GFX_TD_UTD_SS_FIFO_LO_MEM, "TD_UTD_SS_FIFO_LO_MEM"},4135	{AMDGPU_GFX_TD_UTD_SS_FIFO_HI_MEM, "TD_UTD_SS_FIFO_HI_MEM"},4136};4137 4138static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_tcx_mem_list[] = {4139	{AMDGPU_GFX_TCX_FIFOD0, "TCX_FIFOD0"},4140	{AMDGPU_GFX_TCX_FIFOD1, "TCX_FIFOD1"},4141	{AMDGPU_GFX_TCX_FIFOD2, "TCX_FIFOD2"},4142	{AMDGPU_GFX_TCX_FIFOD3, "TCX_FIFOD3"},4143	{AMDGPU_GFX_TCX_FIFOD4, "TCX_FIFOD4"},4144	{AMDGPU_GFX_TCX_FIFOD5, "TCX_FIFOD5"},4145	{AMDGPU_GFX_TCX_FIFOD6, "TCX_FIFOD6"},4146	{AMDGPU_GFX_TCX_FIFOD7, "TCX_FIFOD7"},4147	{AMDGPU_GFX_TCX_FIFOB0, "TCX_FIFOB0"},4148	{AMDGPU_GFX_TCX_FIFOB1, "TCX_FIFOB1"},4149	{AMDGPU_GFX_TCX_FIFOB2, "TCX_FIFOB2"},4150	{AMDGPU_GFX_TCX_FIFOB3, "TCX_FIFOB3"},4151	{AMDGPU_GFX_TCX_FIFOB4, "TCX_FIFOB4"},4152	{AMDGPU_GFX_TCX_FIFOB5, "TCX_FIFOB5"},4153	{AMDGPU_GFX_TCX_FIFOB6, "TCX_FIFOB6"},4154	{AMDGPU_GFX_TCX_FIFOB7, "TCX_FIFOB7"},4155	{AMDGPU_GFX_TCX_FIFOA0, "TCX_FIFOA0"},4156	{AMDGPU_GFX_TCX_FIFOA1, "TCX_FIFOA1"},4157	{AMDGPU_GFX_TCX_FIFOA2, "TCX_FIFOA2"},4158	{AMDGPU_GFX_TCX_FIFOA3, "TCX_FIFOA3"},4159	{AMDGPU_GFX_TCX_FIFOA4, "TCX_FIFOA4"},4160	{AMDGPU_GFX_TCX_FIFOA5, "TCX_FIFOA5"},4161	{AMDGPU_GFX_TCX_FIFOA6, "TCX_FIFOA6"},4162	{AMDGPU_GFX_TCX_FIFOA7, "TCX_FIFOA7"},4163	{AMDGPU_GFX_TCX_CFIFO0, "TCX_CFIFO0"},4164	{AMDGPU_GFX_TCX_CFIFO1, "TCX_CFIFO1"},4165	{AMDGPU_GFX_TCX_CFIFO2, "TCX_CFIFO2"},4166	{AMDGPU_GFX_TCX_CFIFO3, "TCX_CFIFO3"},4167	{AMDGPU_GFX_TCX_CFIFO4, "TCX_CFIFO4"},4168	{AMDGPU_GFX_TCX_CFIFO5, "TCX_CFIFO5"},4169	{AMDGPU_GFX_TCX_CFIFO6, "TCX_CFIFO6"},4170	{AMDGPU_GFX_TCX_CFIFO7, "TCX_CFIFO7"},4171	{AMDGPU_GFX_TCX_FIFO_ACKB0, "TCX_FIFO_ACKB0"},4172	{AMDGPU_GFX_TCX_FIFO_ACKB1, "TCX_FIFO_ACKB1"},4173	{AMDGPU_GFX_TCX_FIFO_ACKB2, "TCX_FIFO_ACKB2"},4174	{AMDGPU_GFX_TCX_FIFO_ACKB3, "TCX_FIFO_ACKB3"},4175	{AMDGPU_GFX_TCX_FIFO_ACKB4, "TCX_FIFO_ACKB4"},4176	{AMDGPU_GFX_TCX_FIFO_ACKB5, "TCX_FIFO_ACKB5"},4177	{AMDGPU_GFX_TCX_FIFO_ACKB6, "TCX_FIFO_ACKB6"},4178	{AMDGPU_GFX_TCX_FIFO_ACKB7, "TCX_FIFO_ACKB7"},4179	{AMDGPU_GFX_TCX_FIFO_ACKD0, "TCX_FIFO_ACKD0"},4180	{AMDGPU_GFX_TCX_FIFO_ACKD1, "TCX_FIFO_ACKD1"},4181	{AMDGPU_GFX_TCX_FIFO_ACKD2, "TCX_FIFO_ACKD2"},4182	{AMDGPU_GFX_TCX_FIFO_ACKD3, "TCX_FIFO_ACKD3"},4183	{AMDGPU_GFX_TCX_FIFO_ACKD4, "TCX_FIFO_ACKD4"},4184	{AMDGPU_GFX_TCX_FIFO_ACKD5, "TCX_FIFO_ACKD5"},4185	{AMDGPU_GFX_TCX_FIFO_ACKD6, "TCX_FIFO_ACKD6"},4186	{AMDGPU_GFX_TCX_FIFO_ACKD7, "TCX_FIFO_ACKD7"},4187	{AMDGPU_GFX_TCX_DST_FIFOA0, "TCX_DST_FIFOA0"},4188	{AMDGPU_GFX_TCX_DST_FIFOA1, "TCX_DST_FIFOA1"},4189	{AMDGPU_GFX_TCX_DST_FIFOA2, "TCX_DST_FIFOA2"},4190	{AMDGPU_GFX_TCX_DST_FIFOA3, "TCX_DST_FIFOA3"},4191	{AMDGPU_GFX_TCX_DST_FIFOA4, "TCX_DST_FIFOA4"},4192	{AMDGPU_GFX_TCX_DST_FIFOA5, "TCX_DST_FIFOA5"},4193	{AMDGPU_GFX_TCX_DST_FIFOA6, "TCX_DST_FIFOA6"},4194	{AMDGPU_GFX_TCX_DST_FIFOA7, "TCX_DST_FIFOA7"},4195	{AMDGPU_GFX_TCX_DST_FIFOB0, "TCX_DST_FIFOB0"},4196	{AMDGPU_GFX_TCX_DST_FIFOB1, "TCX_DST_FIFOB1"},4197	{AMDGPU_GFX_TCX_DST_FIFOB2, "TCX_DST_FIFOB2"},4198	{AMDGPU_GFX_TCX_DST_FIFOB3, "TCX_DST_FIFOB3"},4199	{AMDGPU_GFX_TCX_DST_FIFOB4, "TCX_DST_FIFOB4"},4200	{AMDGPU_GFX_TCX_DST_FIFOB5, "TCX_DST_FIFOB5"},4201	{AMDGPU_GFX_TCX_DST_FIFOB6, "TCX_DST_FIFOB6"},4202	{AMDGPU_GFX_TCX_DST_FIFOB7, "TCX_DST_FIFOB7"},4203	{AMDGPU_GFX_TCX_DST_FIFOD0, "TCX_DST_FIFOD0"},4204	{AMDGPU_GFX_TCX_DST_FIFOD1, "TCX_DST_FIFOD1"},4205	{AMDGPU_GFX_TCX_DST_FIFOD2, "TCX_DST_FIFOD2"},4206	{AMDGPU_GFX_TCX_DST_FIFOD3, "TCX_DST_FIFOD3"},4207	{AMDGPU_GFX_TCX_DST_FIFOD4, "TCX_DST_FIFOD4"},4208	{AMDGPU_GFX_TCX_DST_FIFOD5, "TCX_DST_FIFOD5"},4209	{AMDGPU_GFX_TCX_DST_FIFOD6, "TCX_DST_FIFOD6"},4210	{AMDGPU_GFX_TCX_DST_FIFOD7, "TCX_DST_FIFOD7"},4211	{AMDGPU_GFX_TCX_DST_FIFO_ACKB0, "TCX_DST_FIFO_ACKB0"},4212	{AMDGPU_GFX_TCX_DST_FIFO_ACKB1, "TCX_DST_FIFO_ACKB1"},4213	{AMDGPU_GFX_TCX_DST_FIFO_ACKB2, "TCX_DST_FIFO_ACKB2"},4214	{AMDGPU_GFX_TCX_DST_FIFO_ACKB3, "TCX_DST_FIFO_ACKB3"},4215	{AMDGPU_GFX_TCX_DST_FIFO_ACKB4, "TCX_DST_FIFO_ACKB4"},4216	{AMDGPU_GFX_TCX_DST_FIFO_ACKB5, "TCX_DST_FIFO_ACKB5"},4217	{AMDGPU_GFX_TCX_DST_FIFO_ACKB6, "TCX_DST_FIFO_ACKB6"},4218	{AMDGPU_GFX_TCX_DST_FIFO_ACKB7, "TCX_DST_FIFO_ACKB7"},4219	{AMDGPU_GFX_TCX_DST_FIFO_ACKD0, "TCX_DST_FIFO_ACKD0"},4220	{AMDGPU_GFX_TCX_DST_FIFO_ACKD1, "TCX_DST_FIFO_ACKD1"},4221	{AMDGPU_GFX_TCX_DST_FIFO_ACKD2, "TCX_DST_FIFO_ACKD2"},4222	{AMDGPU_GFX_TCX_DST_FIFO_ACKD3, "TCX_DST_FIFO_ACKD3"},4223	{AMDGPU_GFX_TCX_DST_FIFO_ACKD4, "TCX_DST_FIFO_ACKD4"},4224	{AMDGPU_GFX_TCX_DST_FIFO_ACKD5, "TCX_DST_FIFO_ACKD5"},4225	{AMDGPU_GFX_TCX_DST_FIFO_ACKD6, "TCX_DST_FIFO_ACKD6"},4226	{AMDGPU_GFX_TCX_DST_FIFO_ACKD7, "TCX_DST_FIFO_ACKD7"},4227};4228 4229static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_atc_l2_mem_list[] = {4230	{AMDGPU_GFX_ATC_L2_MEM, "ATC_L2_MEM"},4231};4232 4233static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_utcl2_mem_list[] = {4234	{AMDGPU_GFX_UTCL2_MEM, "UTCL2_MEM"},4235};4236 4237static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_vml2_mem_list[] = {4238	{AMDGPU_GFX_VML2_MEM, "VML2_MEM"},4239};4240 4241static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_vml2_walker_mem_list[] = {4242	{AMDGPU_GFX_VML2_WALKER_MEM, "VML2_WALKER_MEM"},4243};4244 4245static const struct amdgpu_gfx_ras_mem_id_entry gfx_v9_4_3_ras_mem_list_array[AMDGPU_GFX_MEM_TYPE_NUM] = {4246	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_cp_mem_list)4247	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_gcea_mem_list)4248	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_gc_cane_mem_list)4249	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_gcutcl2_mem_list)4250	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_gds_mem_list)4251	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_lds_mem_list)4252	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_rlc_mem_list)4253	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_sp_mem_list)4254	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_spi_mem_list)4255	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_sqc_mem_list)4256	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_sq_mem_list)4257	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_ta_mem_list)4258	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_tcc_mem_list)4259	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_tca_mem_list)4260	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_tci_mem_list)4261	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_tcp_mem_list)4262	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_td_mem_list)4263	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_tcx_mem_list)4264	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_atc_l2_mem_list)4265	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_utcl2_mem_list)4266	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_vml2_mem_list)4267	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_vml2_walker_mem_list)4268};4269 4270static const struct amdgpu_gfx_ras_reg_entry gfx_v9_4_3_ce_reg_list[] = {4271	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regRLC_CE_ERR_STATUS_LOW, regRLC_CE_ERR_STATUS_HIGH),4272	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "RLC"},4273	    AMDGPU_GFX_RLC_MEM, 1},4274	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regCPC_CE_ERR_STATUS_LO, regCPC_CE_ERR_STATUS_HI),4275	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CPC"},4276	    AMDGPU_GFX_CP_MEM, 1},4277	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regCPF_CE_ERR_STATUS_LO, regCPF_CE_ERR_STATUS_HI),4278	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CPF"},4279	    AMDGPU_GFX_CP_MEM, 1},4280	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regCPG_CE_ERR_STATUS_LO, regCPG_CE_ERR_STATUS_HI),4281	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CPG"},4282	    AMDGPU_GFX_CP_MEM, 1},4283	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regGDS_CE_ERR_STATUS_LO, regGDS_CE_ERR_STATUS_HI),4284	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "GDS"},4285	    AMDGPU_GFX_GDS_MEM, 1},4286	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regGC_CANE_CE_ERR_STATUS_LO, regGC_CANE_CE_ERR_STATUS_HI),4287	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CANE"},4288	    AMDGPU_GFX_GC_CANE_MEM, 1},4289	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSPI_CE_ERR_STATUS_LO, regSPI_CE_ERR_STATUS_HI),4290	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SPI"},4291	    AMDGPU_GFX_SPI_MEM, 1},4292	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSP0_CE_ERR_STATUS_LO, regSP0_CE_ERR_STATUS_HI),4293	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SP0"},4294	    AMDGPU_GFX_SP_MEM, 4},4295	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSP1_CE_ERR_STATUS_LO, regSP1_CE_ERR_STATUS_HI),4296	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SP1"},4297	    AMDGPU_GFX_SP_MEM, 4},4298	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSQ_CE_ERR_STATUS_LO, regSQ_CE_ERR_STATUS_HI),4299	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SQ"},4300	    AMDGPU_GFX_SQ_MEM, 4},4301	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSQC_CE_EDC_LO, regSQC_CE_EDC_HI),4302	    5, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SQC"},4303	    AMDGPU_GFX_SQC_MEM, 4},4304	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCX_CE_ERR_STATUS_LO, regTCX_CE_ERR_STATUS_HI),4305	    2, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCX"},4306	    AMDGPU_GFX_TCX_MEM, 1},4307	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCC_CE_ERR_STATUS_LO, regTCC_CE_ERR_STATUS_HI),4308	    16, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCC"},4309	    AMDGPU_GFX_TCC_MEM, 1},4310	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTA_CE_EDC_LO, regTA_CE_EDC_HI),4311	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TA"},4312	    AMDGPU_GFX_TA_MEM, 4},4313	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCI_CE_EDC_LO_REG, regTCI_CE_EDC_HI_REG),4314	    27, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCI"},4315	    AMDGPU_GFX_TCI_MEM, 1},4316	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCP_CE_EDC_LO_REG, regTCP_CE_EDC_HI_REG),4317	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCP"},4318	    AMDGPU_GFX_TCP_MEM, 4},4319	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTD_CE_EDC_LO, regTD_CE_EDC_HI),4320	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TD"},4321	    AMDGPU_GFX_TD_MEM, 4},4322	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regGCEA_CE_ERR_STATUS_LO, regGCEA_CE_ERR_STATUS_HI),4323	    16, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "GCEA"},4324	    AMDGPU_GFX_GCEA_MEM, 1},4325	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regLDS_CE_ERR_STATUS_LO, regLDS_CE_ERR_STATUS_HI),4326	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "LDS"},4327	    AMDGPU_GFX_LDS_MEM, 4},4328};4329 4330static const struct amdgpu_gfx_ras_reg_entry gfx_v9_4_3_ue_reg_list[] = {4331	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regRLC_UE_ERR_STATUS_LOW, regRLC_UE_ERR_STATUS_HIGH),4332	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "RLC"},4333	    AMDGPU_GFX_RLC_MEM, 1},4334	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regCPC_UE_ERR_STATUS_LO, regCPC_UE_ERR_STATUS_HI),4335	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CPC"},4336	    AMDGPU_GFX_CP_MEM, 1},4337	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regCPF_UE_ERR_STATUS_LO, regCPF_UE_ERR_STATUS_HI),4338	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CPF"},4339	    AMDGPU_GFX_CP_MEM, 1},4340	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regCPG_UE_ERR_STATUS_LO, regCPG_UE_ERR_STATUS_HI),4341	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CPG"},4342	    AMDGPU_GFX_CP_MEM, 1},4343	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regGDS_UE_ERR_STATUS_LO, regGDS_UE_ERR_STATUS_HI),4344	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "GDS"},4345	    AMDGPU_GFX_GDS_MEM, 1},4346	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regGC_CANE_UE_ERR_STATUS_LO, regGC_CANE_UE_ERR_STATUS_HI),4347	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CANE"},4348	    AMDGPU_GFX_GC_CANE_MEM, 1},4349	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSPI_UE_ERR_STATUS_LO, regSPI_UE_ERR_STATUS_HI),4350	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SPI"},4351	    AMDGPU_GFX_SPI_MEM, 1},4352	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSP0_UE_ERR_STATUS_LO, regSP0_UE_ERR_STATUS_HI),4353	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SP0"},4354	    AMDGPU_GFX_SP_MEM, 4},4355	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSP1_UE_ERR_STATUS_LO, regSP1_UE_ERR_STATUS_HI),4356	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SP1"},4357	    AMDGPU_GFX_SP_MEM, 4},4358	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSQ_UE_ERR_STATUS_LO, regSQ_UE_ERR_STATUS_HI),4359	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SQ"},4360	    AMDGPU_GFX_SQ_MEM, 4},4361	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSQC_UE_EDC_LO, regSQC_UE_EDC_HI),4362	    5, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SQC"},4363	    AMDGPU_GFX_SQC_MEM, 4},4364	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCX_UE_ERR_STATUS_LO, regTCX_UE_ERR_STATUS_HI),4365	    2, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCX"},4366	    AMDGPU_GFX_TCX_MEM, 1},4367	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCC_UE_ERR_STATUS_LO, regTCC_UE_ERR_STATUS_HI),4368	    16, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCC"},4369	    AMDGPU_GFX_TCC_MEM, 1},4370	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTA_UE_EDC_LO, regTA_UE_EDC_HI),4371	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TA"},4372	    AMDGPU_GFX_TA_MEM, 4},4373	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCI_UE_EDC_LO_REG, regTCI_UE_EDC_HI_REG),4374	    27, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCI"},4375	    AMDGPU_GFX_TCI_MEM, 1},4376	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCP_UE_EDC_LO_REG, regTCP_UE_EDC_HI_REG),4377	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCP"},4378	    AMDGPU_GFX_TCP_MEM, 4},4379	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTD_UE_EDC_LO, regTD_UE_EDC_HI),4380	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TD"},4381	    AMDGPU_GFX_TD_MEM, 4},4382	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCA_UE_ERR_STATUS_LO, regTCA_UE_ERR_STATUS_HI),4383	    2, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCA"},4384	    AMDGPU_GFX_TCA_MEM, 1},4385	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regGCEA_UE_ERR_STATUS_LO, regGCEA_UE_ERR_STATUS_HI),4386	    16, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "GCEA"},4387	    AMDGPU_GFX_GCEA_MEM, 1},4388	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regLDS_UE_ERR_STATUS_LO, regLDS_UE_ERR_STATUS_HI),4389	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "LDS"},4390	    AMDGPU_GFX_LDS_MEM, 4},4391};4392 4393static void gfx_v9_4_3_inst_query_ras_err_count(struct amdgpu_device *adev,4394					void *ras_error_status, int xcc_id)4395{4396	struct ras_err_data *err_data = (struct ras_err_data *)ras_error_status;4397	unsigned long ce_count = 0, ue_count = 0;4398	uint32_t i, j, k;4399 4400	/* NOTE: convert xcc_id to physical XCD ID (XCD0 or XCD1) */4401	struct amdgpu_smuio_mcm_config_info mcm_info = {4402		.socket_id = adev->smuio.funcs->get_socket_id(adev),4403		.die_id = xcc_id & 0x01 ? 1 : 0,4404	};4405 4406	mutex_lock(&adev->grbm_idx_mutex);4407 4408	for (i = 0; i < ARRAY_SIZE(gfx_v9_4_3_ce_reg_list); i++) {4409		for (j = 0; j < gfx_v9_4_3_ce_reg_list[i].se_num; j++) {4410			for (k = 0; k < gfx_v9_4_3_ce_reg_list[i].reg_entry.reg_inst; k++) {4411				/* no need to select if instance number is 1 */4412				if (gfx_v9_4_3_ce_reg_list[i].se_num > 1 ||4413				    gfx_v9_4_3_ce_reg_list[i].reg_entry.reg_inst > 1)4414					gfx_v9_4_3_xcc_select_se_sh(adev, j, 0, k, xcc_id);4415 4416				amdgpu_ras_inst_query_ras_error_count(adev,4417					&(gfx_v9_4_3_ce_reg_list[i].reg_entry),4418					1,4419					gfx_v9_4_3_ras_mem_list_array[gfx_v9_4_3_ce_reg_list[i].mem_id_type].mem_id_ent,4420					gfx_v9_4_3_ras_mem_list_array[gfx_v9_4_3_ce_reg_list[i].mem_id_type].size,4421					GET_INST(GC, xcc_id),4422					AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE,4423					&ce_count);4424 4425				amdgpu_ras_inst_query_ras_error_count(adev,4426					&(gfx_v9_4_3_ue_reg_list[i].reg_entry),4427					1,4428					gfx_v9_4_3_ras_mem_list_array[gfx_v9_4_3_ue_reg_list[i].mem_id_type].mem_id_ent,4429					gfx_v9_4_3_ras_mem_list_array[gfx_v9_4_3_ue_reg_list[i].mem_id_type].size,4430					GET_INST(GC, xcc_id),4431					AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE,4432					&ue_count);4433			}4434		}4435	}4436 4437	/* handle extra register entries of UE */4438	for (; i < ARRAY_SIZE(gfx_v9_4_3_ue_reg_list); i++) {4439		for (j = 0; j < gfx_v9_4_3_ue_reg_list[i].se_num; j++) {4440			for (k = 0; k < gfx_v9_4_3_ue_reg_list[i].reg_entry.reg_inst; k++) {4441				/* no need to select if instance number is 1 */4442				if (gfx_v9_4_3_ue_reg_list[i].se_num > 1 ||4443					gfx_v9_4_3_ue_reg_list[i].reg_entry.reg_inst > 1)4444					gfx_v9_4_3_xcc_select_se_sh(adev, j, 0, k, xcc_id);4445 4446				amdgpu_ras_inst_query_ras_error_count(adev,4447					&(gfx_v9_4_3_ue_reg_list[i].reg_entry),4448					1,4449					gfx_v9_4_3_ras_mem_list_array[gfx_v9_4_3_ue_reg_list[i].mem_id_type].mem_id_ent,4450					gfx_v9_4_3_ras_mem_list_array[gfx_v9_4_3_ue_reg_list[i].mem_id_type].size,4451					GET_INST(GC, xcc_id),4452					AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE,4453					&ue_count);4454			}4455		}4456	}4457 4458	gfx_v9_4_3_xcc_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff,4459			xcc_id);4460	mutex_unlock(&adev->grbm_idx_mutex);4461 4462	/* the caller should make sure initialize value of4463	 * err_data->ue_count and err_data->ce_count4464	 */4465	amdgpu_ras_error_statistic_ue_count(err_data, &mcm_info, ue_count);4466	amdgpu_ras_error_statistic_ce_count(err_data, &mcm_info, ce_count);4467}4468 4469static void gfx_v9_4_3_inst_reset_ras_err_count(struct amdgpu_device *adev,4470					void *ras_error_status, int xcc_id)4471{4472	uint32_t i, j, k;4473 4474	mutex_lock(&adev->grbm_idx_mutex);4475 4476	for (i = 0; i < ARRAY_SIZE(gfx_v9_4_3_ce_reg_list); i++) {4477		for (j = 0; j < gfx_v9_4_3_ce_reg_list[i].se_num; j++) {4478			for (k = 0; k < gfx_v9_4_3_ce_reg_list[i].reg_entry.reg_inst; k++) {4479				/* no need to select if instance number is 1 */4480				if (gfx_v9_4_3_ce_reg_list[i].se_num > 1 ||4481				    gfx_v9_4_3_ce_reg_list[i].reg_entry.reg_inst > 1)4482					gfx_v9_4_3_xcc_select_se_sh(adev, j, 0, k, xcc_id);4483 4484				amdgpu_ras_inst_reset_ras_error_count(adev,4485					&(gfx_v9_4_3_ce_reg_list[i].reg_entry),4486					1,4487					GET_INST(GC, xcc_id));4488 4489				amdgpu_ras_inst_reset_ras_error_count(adev,4490					&(gfx_v9_4_3_ue_reg_list[i].reg_entry),4491					1,4492					GET_INST(GC, xcc_id));4493			}4494		}4495	}4496 4497	/* handle extra register entries of UE */4498	for (; i < ARRAY_SIZE(gfx_v9_4_3_ue_reg_list); i++) {4499		for (j = 0; j < gfx_v9_4_3_ue_reg_list[i].se_num; j++) {4500			for (k = 0; k < gfx_v9_4_3_ue_reg_list[i].reg_entry.reg_inst; k++) {4501				/* no need to select if instance number is 1 */4502				if (gfx_v9_4_3_ue_reg_list[i].se_num > 1 ||4503					gfx_v9_4_3_ue_reg_list[i].reg_entry.reg_inst > 1)4504					gfx_v9_4_3_xcc_select_se_sh(adev, j, 0, k, xcc_id);4505 4506				amdgpu_ras_inst_reset_ras_error_count(adev,4507					&(gfx_v9_4_3_ue_reg_list[i].reg_entry),4508					1,4509					GET_INST(GC, xcc_id));4510			}4511		}4512	}4513 4514	gfx_v9_4_3_xcc_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff,4515			xcc_id);4516	mutex_unlock(&adev->grbm_idx_mutex);4517}4518 4519static void gfx_v9_4_3_inst_enable_watchdog_timer(struct amdgpu_device *adev,4520					void *ras_error_status, int xcc_id)4521{4522	uint32_t i;4523	uint32_t data;4524 4525	if (amdgpu_sriov_vf(adev))4526		return;4527 4528	data = RREG32_SOC15(GC, GET_INST(GC, 0), regSQ_TIMEOUT_CONFIG);4529	data = REG_SET_FIELD(data, SQ_TIMEOUT_CONFIG, TIMEOUT_FATAL_DISABLE,4530			     amdgpu_watchdog_timer.timeout_fatal_disable ? 1 : 0);4531 4532	if (amdgpu_watchdog_timer.timeout_fatal_disable &&4533	    (amdgpu_watchdog_timer.period < 1 ||4534	     amdgpu_watchdog_timer.period > 0x23)) {4535		dev_warn(adev->dev, "Watchdog period range is 1 to 0x23\n");4536		amdgpu_watchdog_timer.period = 0x23;4537	}4538	data = REG_SET_FIELD(data, SQ_TIMEOUT_CONFIG, PERIOD_SEL,4539			     amdgpu_watchdog_timer.period);4540 4541	mutex_lock(&adev->grbm_idx_mutex);4542	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {4543		gfx_v9_4_3_xcc_select_se_sh(adev, i, 0xffffffff, 0xffffffff, xcc_id);4544		WREG32_SOC15(GC, GET_INST(GC, xcc_id), regSQ_TIMEOUT_CONFIG, data);4545	}4546	gfx_v9_4_3_xcc_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff,4547			xcc_id);4548	mutex_unlock(&adev->grbm_idx_mutex);4549}4550 4551static void gfx_v9_4_3_query_ras_error_count(struct amdgpu_device *adev,4552					void *ras_error_status)4553{4554	amdgpu_gfx_ras_error_func(adev, ras_error_status,4555			gfx_v9_4_3_inst_query_ras_err_count);4556}4557 4558static void gfx_v9_4_3_reset_ras_error_count(struct amdgpu_device *adev)4559{4560	amdgpu_gfx_ras_error_func(adev, NULL, gfx_v9_4_3_inst_reset_ras_err_count);4561}4562 4563static void gfx_v9_4_3_enable_watchdog_timer(struct amdgpu_device *adev)4564{4565	amdgpu_gfx_ras_error_func(adev, NULL, gfx_v9_4_3_inst_enable_watchdog_timer);4566}4567 4568static void gfx_v9_4_3_ring_insert_nop(struct amdgpu_ring *ring, uint32_t num_nop)4569{4570	int i;4571 4572	/* Header itself is a NOP packet */4573	if (num_nop == 1) {4574		amdgpu_ring_write(ring, ring->funcs->nop);4575		return;4576	}4577 4578	/* Max HW optimization till 0x3ffe, followed by remaining one NOP at a time*/4579	amdgpu_ring_write(ring, PACKET3(PACKET3_NOP, min(num_nop - 2, 0x3ffe)));4580 4581	/* Header is at index 0, followed by num_nops - 1 NOP packet's */4582	for (i = 1; i < num_nop; i++)4583		amdgpu_ring_write(ring, ring->funcs->nop);4584}4585 4586static void gfx_v9_4_3_ip_print(void *handle, struct drm_printer *p)4587{4588	struct amdgpu_device *adev = (struct amdgpu_device *)handle;4589	uint32_t i, j, k;4590	uint32_t xcc_id, xcc_offset, inst_offset;4591	uint32_t num_xcc, reg, num_inst;4592	uint32_t reg_count = ARRAY_SIZE(gc_reg_list_9_4_3);4593 4594	if (!adev->gfx.ip_dump_core)4595		return;4596 4597	num_xcc = NUM_XCC(adev->gfx.xcc_mask);4598	drm_printf(p, "Number of Instances:%d\n", num_xcc);4599	for (xcc_id = 0; xcc_id < num_xcc; xcc_id++) {4600		xcc_offset = xcc_id * reg_count;4601		drm_printf(p, "\nInstance id:%d\n", xcc_id);4602		for (i = 0; i < reg_count; i++)4603			drm_printf(p, "%-50s \t 0x%08x\n",4604				   gc_reg_list_9_4_3[i].reg_name,4605				   adev->gfx.ip_dump_core[xcc_offset + i]);4606	}4607 4608	/* print compute queue registers for all instances */4609	if (!adev->gfx.ip_dump_compute_queues)4610		return;4611 4612	num_inst = adev->gfx.mec.num_mec * adev->gfx.mec.num_pipe_per_mec *4613		adev->gfx.mec.num_queue_per_pipe;4614 4615	reg_count = ARRAY_SIZE(gc_cp_reg_list_9_4_3);4616	drm_printf(p, "\nnum_xcc: %d num_mec: %d num_pipe: %d num_queue: %d\n",4617		   num_xcc,4618		   adev->gfx.mec.num_mec,4619		   adev->gfx.mec.num_pipe_per_mec,4620		   adev->gfx.mec.num_queue_per_pipe);4621 4622	for (xcc_id = 0; xcc_id < num_xcc; xcc_id++) {4623		xcc_offset = xcc_id * reg_count * num_inst;4624		inst_offset = 0;4625		for (i = 0; i < adev->gfx.mec.num_mec; i++) {4626			for (j = 0; j < adev->gfx.mec.num_pipe_per_mec; j++) {4627				for (k = 0; k < adev->gfx.mec.num_queue_per_pipe; k++) {4628					drm_printf(p,4629						   "\nxcc:%d mec:%d, pipe:%d, queue:%d\n",4630						    xcc_id, i, j, k);4631					for (reg = 0; reg < reg_count; reg++) {4632						drm_printf(p,4633							   "%-50s \t 0x%08x\n",4634							   gc_cp_reg_list_9_4_3[reg].reg_name,4635							   adev->gfx.ip_dump_compute_queues4636								[xcc_offset + inst_offset +4637								reg]);4638					}4639					inst_offset += reg_count;4640				}4641			}4642		}4643	}4644}4645 4646static void gfx_v9_4_3_ip_dump(void *handle)4647{4648	struct amdgpu_device *adev = (struct amdgpu_device *)handle;4649	uint32_t i, j, k;4650	uint32_t num_xcc, reg, num_inst;4651	uint32_t xcc_id, xcc_offset, inst_offset;4652	uint32_t reg_count = ARRAY_SIZE(gc_reg_list_9_4_3);4653 4654	if (!adev->gfx.ip_dump_core)4655		return;4656 4657	num_xcc = NUM_XCC(adev->gfx.xcc_mask);4658 4659	amdgpu_gfx_off_ctrl(adev, false);4660	for (xcc_id = 0; xcc_id < num_xcc; xcc_id++) {4661		xcc_offset = xcc_id * reg_count;4662		for (i = 0; i < reg_count; i++)4663			adev->gfx.ip_dump_core[xcc_offset + i] =4664				RREG32(SOC15_REG_ENTRY_OFFSET_INST(gc_reg_list_9_4_3[i],4665								   GET_INST(GC, xcc_id)));4666	}4667	amdgpu_gfx_off_ctrl(adev, true);4668 4669	/* dump compute queue registers for all instances */4670	if (!adev->gfx.ip_dump_compute_queues)4671		return;4672 4673	num_inst = adev->gfx.mec.num_mec * adev->gfx.mec.num_pipe_per_mec *4674		adev->gfx.mec.num_queue_per_pipe;4675	reg_count = ARRAY_SIZE(gc_cp_reg_list_9_4_3);4676	amdgpu_gfx_off_ctrl(adev, false);4677	mutex_lock(&adev->srbm_mutex);4678	for (xcc_id = 0; xcc_id < num_xcc; xcc_id++) {4679		xcc_offset = xcc_id * reg_count * num_inst;4680		inst_offset = 0;4681		for (i = 0; i < adev->gfx.mec.num_mec; i++) {4682			for (j = 0; j < adev->gfx.mec.num_pipe_per_mec; j++) {4683				for (k = 0; k < adev->gfx.mec.num_queue_per_pipe; k++) {4684					/* ME0 is for GFX so start from 1 for CP */4685					soc15_grbm_select(adev, 1 + i, j, k, 0,4686							  GET_INST(GC, xcc_id));4687 4688					for (reg = 0; reg < reg_count; reg++) {4689						adev->gfx.ip_dump_compute_queues4690							[xcc_offset +4691							 inst_offset + reg] =4692							RREG32(SOC15_REG_ENTRY_OFFSET_INST(4693								gc_cp_reg_list_9_4_3[reg],4694								GET_INST(GC, xcc_id)));4695					}4696					inst_offset += reg_count;4697				}4698			}4699		}4700	}4701	soc15_grbm_select(adev, 0, 0, 0, 0, 0);4702	mutex_unlock(&adev->srbm_mutex);4703	amdgpu_gfx_off_ctrl(adev, true);4704}4705 4706static void gfx_v9_4_3_ring_emit_cleaner_shader(struct amdgpu_ring *ring)4707{4708	/* Emit the cleaner shader */4709	amdgpu_ring_write(ring, PACKET3(PACKET3_RUN_CLEANER_SHADER, 0));4710	amdgpu_ring_write(ring, 0);  /* RESERVED field, programmed to zero */4711}4712 4713static const struct amd_ip_funcs gfx_v9_4_3_ip_funcs = {4714	.name = "gfx_v9_4_3",4715	.early_init = gfx_v9_4_3_early_init,4716	.late_init = gfx_v9_4_3_late_init,4717	.sw_init = gfx_v9_4_3_sw_init,4718	.sw_fini = gfx_v9_4_3_sw_fini,4719	.hw_init = gfx_v9_4_3_hw_init,4720	.hw_fini = gfx_v9_4_3_hw_fini,4721	.suspend = gfx_v9_4_3_suspend,4722	.resume = gfx_v9_4_3_resume,4723	.is_idle = gfx_v9_4_3_is_idle,4724	.wait_for_idle = gfx_v9_4_3_wait_for_idle,4725	.soft_reset = gfx_v9_4_3_soft_reset,4726	.set_clockgating_state = gfx_v9_4_3_set_clockgating_state,4727	.set_powergating_state = gfx_v9_4_3_set_powergating_state,4728	.get_clockgating_state = gfx_v9_4_3_get_clockgating_state,4729	.dump_ip_state = gfx_v9_4_3_ip_dump,4730	.print_ip_state = gfx_v9_4_3_ip_print,4731};4732 4733static const struct amdgpu_ring_funcs gfx_v9_4_3_ring_funcs_compute = {4734	.type = AMDGPU_RING_TYPE_COMPUTE,4735	.align_mask = 0xff,4736	.nop = PACKET3(PACKET3_NOP, 0x3FFF),4737	.support_64bit_ptrs = true,4738	.get_rptr = gfx_v9_4_3_ring_get_rptr_compute,4739	.get_wptr = gfx_v9_4_3_ring_get_wptr_compute,4740	.set_wptr = gfx_v9_4_3_ring_set_wptr_compute,4741	.emit_frame_size =4742		20 + /* gfx_v9_4_3_ring_emit_gds_switch */4743		7 + /* gfx_v9_4_3_ring_emit_hdp_flush */4744		5 + /* hdp invalidate */4745		7 + /* gfx_v9_4_3_ring_emit_pipeline_sync */4746		SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +4747		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 +4748		2 + /* gfx_v9_4_3_ring_emit_vm_flush */4749		8 + 8 + 8 + /* gfx_v9_4_3_ring_emit_fence x3 for user fence, vm fence */4750		7 + /* gfx_v9_4_3_emit_mem_sync */4751		5 + /* gfx_v9_4_3_emit_wave_limit for updating regSPI_WCL_PIPE_PERCENT_GFX register */4752		15 + /* for updating 3 regSPI_WCL_PIPE_PERCENT_CS registers */4753		2, /* gfx_v9_4_3_ring_emit_cleaner_shader */4754	.emit_ib_size =	7, /* gfx_v9_4_3_ring_emit_ib_compute */4755	.emit_ib = gfx_v9_4_3_ring_emit_ib_compute,4756	.emit_fence = gfx_v9_4_3_ring_emit_fence,4757	.emit_pipeline_sync = gfx_v9_4_3_ring_emit_pipeline_sync,4758	.emit_vm_flush = gfx_v9_4_3_ring_emit_vm_flush,4759	.emit_gds_switch = gfx_v9_4_3_ring_emit_gds_switch,4760	.emit_hdp_flush = gfx_v9_4_3_ring_emit_hdp_flush,4761	.test_ring = gfx_v9_4_3_ring_test_ring,4762	.test_ib = gfx_v9_4_3_ring_test_ib,4763	.insert_nop = gfx_v9_4_3_ring_insert_nop,4764	.pad_ib = amdgpu_ring_generic_pad_ib,4765	.emit_wreg = gfx_v9_4_3_ring_emit_wreg,4766	.emit_reg_wait = gfx_v9_4_3_ring_emit_reg_wait,4767	.emit_reg_write_reg_wait = gfx_v9_4_3_ring_emit_reg_write_reg_wait,4768	.soft_recovery = gfx_v9_4_3_ring_soft_recovery,4769	.emit_mem_sync = gfx_v9_4_3_emit_mem_sync,4770	.emit_wave_limit = gfx_v9_4_3_emit_wave_limit,4771	.reset = gfx_v9_4_3_reset_kcq,4772	.emit_cleaner_shader = gfx_v9_4_3_ring_emit_cleaner_shader,4773	.begin_use = amdgpu_gfx_enforce_isolation_ring_begin_use,4774	.end_use = amdgpu_gfx_enforce_isolation_ring_end_use,4775};4776 4777static const struct amdgpu_ring_funcs gfx_v9_4_3_ring_funcs_kiq = {4778	.type = AMDGPU_RING_TYPE_KIQ,4779	.align_mask = 0xff,4780	.nop = PACKET3(PACKET3_NOP, 0x3FFF),4781	.support_64bit_ptrs = true,4782	.get_rptr = gfx_v9_4_3_ring_get_rptr_compute,4783	.get_wptr = gfx_v9_4_3_ring_get_wptr_compute,4784	.set_wptr = gfx_v9_4_3_ring_set_wptr_compute,4785	.emit_frame_size =4786		20 + /* gfx_v9_4_3_ring_emit_gds_switch */4787		7 + /* gfx_v9_4_3_ring_emit_hdp_flush */4788		5 + /* hdp invalidate */4789		7 + /* gfx_v9_4_3_ring_emit_pipeline_sync */4790		SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +4791		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 +4792		2 + /* gfx_v9_4_3_ring_emit_vm_flush */4793		8 + 8 + 8, /* gfx_v9_4_3_ring_emit_fence_kiq x3 for user fence, vm fence */4794	.emit_ib_size =	7, /* gfx_v9_4_3_ring_emit_ib_compute */4795	.emit_fence = gfx_v9_4_3_ring_emit_fence_kiq,4796	.test_ring = gfx_v9_4_3_ring_test_ring,4797	.insert_nop = amdgpu_ring_insert_nop,4798	.pad_ib = amdgpu_ring_generic_pad_ib,4799	.emit_rreg = gfx_v9_4_3_ring_emit_rreg,4800	.emit_wreg = gfx_v9_4_3_ring_emit_wreg,4801	.emit_reg_wait = gfx_v9_4_3_ring_emit_reg_wait,4802	.emit_reg_write_reg_wait = gfx_v9_4_3_ring_emit_reg_write_reg_wait,4803};4804 4805static void gfx_v9_4_3_set_ring_funcs(struct amdgpu_device *adev)4806{4807	int i, j, num_xcc;4808 4809	num_xcc = NUM_XCC(adev->gfx.xcc_mask);4810	for (i = 0; i < num_xcc; i++) {4811		adev->gfx.kiq[i].ring.funcs = &gfx_v9_4_3_ring_funcs_kiq;4812 4813		for (j = 0; j < adev->gfx.num_compute_rings; j++)4814			adev->gfx.compute_ring[j + i * adev->gfx.num_compute_rings].funcs4815					= &gfx_v9_4_3_ring_funcs_compute;4816	}4817}4818 4819static const struct amdgpu_irq_src_funcs gfx_v9_4_3_eop_irq_funcs = {4820	.set = gfx_v9_4_3_set_eop_interrupt_state,4821	.process = gfx_v9_4_3_eop_irq,4822};4823 4824static const struct amdgpu_irq_src_funcs gfx_v9_4_3_priv_reg_irq_funcs = {4825	.set = gfx_v9_4_3_set_priv_reg_fault_state,4826	.process = gfx_v9_4_3_priv_reg_irq,4827};4828 4829static const struct amdgpu_irq_src_funcs gfx_v9_4_3_bad_op_irq_funcs = {4830	.set = gfx_v9_4_3_set_bad_op_fault_state,4831	.process = gfx_v9_4_3_bad_op_irq,4832};4833 4834static const struct amdgpu_irq_src_funcs gfx_v9_4_3_priv_inst_irq_funcs = {4835	.set = gfx_v9_4_3_set_priv_inst_fault_state,4836	.process = gfx_v9_4_3_priv_inst_irq,4837};4838 4839static void gfx_v9_4_3_set_irq_funcs(struct amdgpu_device *adev)4840{4841	adev->gfx.eop_irq.num_types = AMDGPU_CP_IRQ_LAST;4842	adev->gfx.eop_irq.funcs = &gfx_v9_4_3_eop_irq_funcs;4843 4844	adev->gfx.priv_reg_irq.num_types = 1;4845	adev->gfx.priv_reg_irq.funcs = &gfx_v9_4_3_priv_reg_irq_funcs;4846 4847	adev->gfx.bad_op_irq.num_types = 1;4848	adev->gfx.bad_op_irq.funcs = &gfx_v9_4_3_bad_op_irq_funcs;4849 4850	adev->gfx.priv_inst_irq.num_types = 1;4851	adev->gfx.priv_inst_irq.funcs = &gfx_v9_4_3_priv_inst_irq_funcs;4852}4853 4854static void gfx_v9_4_3_set_rlc_funcs(struct amdgpu_device *adev)4855{4856	adev->gfx.rlc.funcs = &gfx_v9_4_3_rlc_funcs;4857}4858 4859 4860static void gfx_v9_4_3_set_gds_init(struct amdgpu_device *adev)4861{4862	/* init asci gds info */4863	switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {4864	case IP_VERSION(9, 4, 3):4865	case IP_VERSION(9, 4, 4):4866		/* 9.4.3 removed all the GDS internal memory,4867		 * only support GWS opcode in kernel, like barrier4868		 * semaphore.etc */4869		adev->gds.gds_size = 0;4870		break;4871	default:4872		adev->gds.gds_size = 0x10000;4873		break;4874	}4875 4876	switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {4877	case IP_VERSION(9, 4, 3):4878	case IP_VERSION(9, 4, 4):4879		/* deprecated for 9.4.3, no usage at all */4880		adev->gds.gds_compute_max_wave_id = 0;4881		break;4882	default:4883		/* this really depends on the chip */4884		adev->gds.gds_compute_max_wave_id = 0x7ff;4885		break;4886	}4887 4888	adev->gds.gws_size = 64;4889	adev->gds.oa_size = 16;4890}4891 4892static void gfx_v9_4_3_set_user_cu_inactive_bitmap(struct amdgpu_device *adev,4893						 u32 bitmap, int xcc_id)4894{4895	u32 data;4896 4897	if (!bitmap)4898		return;4899 4900	data = bitmap << GC_USER_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT;4901	data &= GC_USER_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK;4902 4903	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regGC_USER_SHADER_ARRAY_CONFIG, data);4904}4905 4906static u32 gfx_v9_4_3_get_cu_active_bitmap(struct amdgpu_device *adev, int xcc_id)4907{4908	u32 data, mask;4909 4910	data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCC_GC_SHADER_ARRAY_CONFIG);4911	data |= RREG32_SOC15(GC, GET_INST(GC, xcc_id), regGC_USER_SHADER_ARRAY_CONFIG);4912 4913	data &= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK;4914	data >>= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT;4915 4916	mask = amdgpu_gfx_create_bitmask(adev->gfx.config.max_cu_per_sh);4917 4918	return (~data) & mask;4919}4920 4921static int gfx_v9_4_3_get_cu_info(struct amdgpu_device *adev,4922				 struct amdgpu_cu_info *cu_info)4923{4924	int i, j, k, prev_counter, counter, xcc_id, active_cu_number = 0;4925	u32 mask, bitmap, ao_bitmap, ao_cu_mask = 0, tmp;4926	unsigned disable_masks[4 * 4];4927	bool is_symmetric_cus;4928 4929	if (!adev || !cu_info)4930		return -EINVAL;4931 4932	/*4933	 * 16 comes from bitmap array size 4*4, and it can cover all gfx9 ASICs4934	 */4935	if (adev->gfx.config.max_shader_engines *4936		adev->gfx.config.max_sh_per_se > 16)4937		return -EINVAL;4938 4939	amdgpu_gfx_parse_disable_cu(disable_masks,4940				    adev->gfx.config.max_shader_engines,4941				    adev->gfx.config.max_sh_per_se);4942 4943	mutex_lock(&adev->grbm_idx_mutex);4944	for (xcc_id = 0; xcc_id < NUM_XCC(adev->gfx.xcc_mask); xcc_id++) {4945		is_symmetric_cus = true;4946		for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {4947			for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {4948				mask = 1;4949				ao_bitmap = 0;4950				counter = 0;4951				gfx_v9_4_3_xcc_select_se_sh(adev, i, j, 0xffffffff, xcc_id);4952				gfx_v9_4_3_set_user_cu_inactive_bitmap(4953					adev,4954					disable_masks[i * adev->gfx.config.max_sh_per_se + j],4955					xcc_id);4956				bitmap = gfx_v9_4_3_get_cu_active_bitmap(adev, xcc_id);4957 4958				cu_info->bitmap[xcc_id][i][j] = bitmap;4959 4960				for (k = 0; k < adev->gfx.config.max_cu_per_sh; k++) {4961					if (bitmap & mask) {4962						if (counter < adev->gfx.config.max_cu_per_sh)4963							ao_bitmap |= mask;4964						counter++;4965					}4966					mask <<= 1;4967				}4968				active_cu_number += counter;4969				if (i < 2 && j < 2)4970					ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8));4971				cu_info->ao_cu_bitmap[i][j] = ao_bitmap;4972			}4973			if (i && is_symmetric_cus && prev_counter != counter)4974				is_symmetric_cus = false;4975			prev_counter = counter;4976		}4977		if (is_symmetric_cus) {4978			tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_CPC_DEBUG);4979			tmp = REG_SET_FIELD(tmp, CP_CPC_DEBUG, CPC_HARVESTING_RELAUNCH_DISABLE, 1);4980			tmp = REG_SET_FIELD(tmp, CP_CPC_DEBUG, CPC_HARVESTING_DISPATCH_DISABLE, 1);4981			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_CPC_DEBUG, tmp);4982		}4983		gfx_v9_4_3_xcc_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff,4984					    xcc_id);4985	}4986	mutex_unlock(&adev->grbm_idx_mutex);4987 4988	cu_info->number = active_cu_number;4989	cu_info->ao_cu_mask = ao_cu_mask;4990	cu_info->simd_per_cu = NUM_SIMD_PER_CU;4991 4992	return 0;4993}4994 4995const struct amdgpu_ip_block_version gfx_v9_4_3_ip_block = {4996	.type = AMD_IP_BLOCK_TYPE_GFX,4997	.major = 9,4998	.minor = 4,4999	.rev = 3,5000	.funcs = &gfx_v9_4_3_ip_funcs,5001};5002 5003static int gfx_v9_4_3_xcp_resume(void *handle, uint32_t inst_mask)5004{5005	struct amdgpu_device *adev = (struct amdgpu_device *)handle;5006	uint32_t tmp_mask;5007	int i, r;5008 5009	/* TODO : Initialize golden regs */5010	/* gfx_v9_4_3_init_golden_registers(adev); */5011 5012	tmp_mask = inst_mask;5013	for_each_inst(i, tmp_mask)5014		gfx_v9_4_3_xcc_constants_init(adev, i);5015 5016	if (!amdgpu_sriov_vf(adev)) {5017		tmp_mask = inst_mask;5018		for_each_inst(i, tmp_mask) {5019			r = gfx_v9_4_3_xcc_rlc_resume(adev, i);5020			if (r)5021				return r;5022		}5023	}5024 5025	tmp_mask = inst_mask;5026	for_each_inst(i, tmp_mask) {5027		r = gfx_v9_4_3_xcc_cp_resume(adev, i);5028		if (r)5029			return r;5030	}5031 5032	return 0;5033}5034 5035static int gfx_v9_4_3_xcp_suspend(void *handle, uint32_t inst_mask)5036{5037	struct amdgpu_device *adev = (struct amdgpu_device *)handle;5038	int i;5039 5040	for_each_inst(i, inst_mask)5041		gfx_v9_4_3_xcc_fini(adev, i);5042 5043	return 0;5044}5045 5046struct amdgpu_xcp_ip_funcs gfx_v9_4_3_xcp_funcs = {5047	.suspend = &gfx_v9_4_3_xcp_suspend,5048	.resume = &gfx_v9_4_3_xcp_resume5049};5050 5051struct amdgpu_ras_block_hw_ops  gfx_v9_4_3_ras_ops = {5052	.query_ras_error_count = &gfx_v9_4_3_query_ras_error_count,5053	.reset_ras_error_count = &gfx_v9_4_3_reset_ras_error_count,5054};5055 5056static int gfx_v9_4_3_ras_late_init(struct amdgpu_device *adev, struct ras_common_if *ras_block)5057{5058	int r;5059 5060	r = amdgpu_ras_block_late_init(adev, ras_block);5061	if (r)5062		return r;5063 5064	r = amdgpu_ras_bind_aca(adev, AMDGPU_RAS_BLOCK__GFX,5065				&gfx_v9_4_3_aca_info,5066				NULL);5067	if (r)5068		goto late_fini;5069 5070	return 0;5071 5072late_fini:5073	amdgpu_ras_block_late_fini(adev, ras_block);5074 5075	return r;5076}5077 5078struct amdgpu_gfx_ras gfx_v9_4_3_ras = {5079	.ras_block = {5080		.hw_ops = &gfx_v9_4_3_ras_ops,5081		.ras_late_init = &gfx_v9_4_3_ras_late_init,5082	},5083	.enable_watchdog_timer = &gfx_v9_4_3_enable_watchdog_timer,5084};5085