diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 211 | 
1 files changed, 127 insertions, 84 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index e6b113ed2f40..711e9dd19705 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c @@ -50,18 +50,14 @@  #include "gfx_v9_4.h" +#include "asic_reg/pwr/pwr_10_0_offset.h" +#include "asic_reg/pwr/pwr_10_0_sh_mask.h" +  #define GFX9_NUM_GFX_RINGS     1  #define GFX9_MEC_HPD_SIZE 4096  #define RLCG_UCODE_LOADING_START_ADDRESS 0x00002000L  #define RLC_SAVE_RESTORE_ADDR_STARTING_OFFSET 0x00000000L -#define mmPWR_MISC_CNTL_STATUS					0x0183 -#define mmPWR_MISC_CNTL_STATUS_BASE_IDX				0 -#define PWR_MISC_CNTL_STATUS__PWR_GFX_RLC_CGPG_EN__SHIFT	0x0 -#define PWR_MISC_CNTL_STATUS__PWR_GFXOFF_STATUS__SHIFT		0x1 -#define PWR_MISC_CNTL_STATUS__PWR_GFX_RLC_CGPG_EN_MASK		0x00000001L -#define PWR_MISC_CNTL_STATUS__PWR_GFXOFF_STATUS_MASK		0x00000006L -  #define mmGCEA_PROBE_MAP                        0x070c  #define mmGCEA_PROBE_MAP_BASE_IDX               0 @@ -511,8 +507,8 @@ static const struct soc15_reg_golden golden_settings_gc_9_0[] =  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSH_MEM_CONFIG, 0x00001000, 0x00001000),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_CU_0, 0x0007ffff, 0x00000800),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_CU_1, 0x0007ffff, 0x00000800), -	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_0, 0x01ffffff, 0x0000ff87), -	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_1, 0x01ffffff, 0x0000ff8f), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_0, 0x01ffffff, 0x00ffff87), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_1, 0x01ffffff, 0x00ffff8f),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQC_CONFIG, 0x03000000, 0x020a2000),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfffffeef, 0x010b0000),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x4a2c0e68), @@ -963,7 +959,7 @@ static void gfx_v9_0_init_golden_registers(struct amdgpu_device *adev)  	case CHIP_RAVEN:  		soc15_program_register_sequence(adev, golden_settings_gc_9_1,  						ARRAY_SIZE(golden_settings_gc_9_1)); -		if (adev->rev_id >= 8) +		if (adev->apu_flags & AMD_APU_IS_RAVEN2)  			soc15_program_register_sequence(adev,  							golden_settings_gc_9_1_rv2,  							ARRAY_SIZE(golden_settings_gc_9_1_rv2)); @@ -1082,7 +1078,8 @@ static int gfx_v9_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	gpu_addr = adev->wb.gpu_addr + (index * 4);  	adev->wb.wb[index] = cpu_to_le32(0xCAFEDEAD);  	memset(&ib, 0, sizeof(ib)); -	r = amdgpu_ib_get(adev, NULL, 16, &ib); +	r = amdgpu_ib_get(adev, NULL, 16, +					AMDGPU_IB_POOL_DIRECT, &ib);  	if (r)  		goto err1; @@ -1234,6 +1231,10 @@ struct amdgpu_gfxoff_quirk {  static const struct amdgpu_gfxoff_quirk amdgpu_gfxoff_quirk_list[] = {  	/* https://bugzilla.kernel.org/show_bug.cgi?id=204689 */  	{ 0x1002, 0x15dd, 0x1002, 0x15dd, 0xc8 }, +	/* https://bugzilla.kernel.org/show_bug.cgi?id=207171 */ +	{ 0x1002, 0x15dd, 0x103c, 0x83e7, 0xd3 }, +	/* GFXOFF is unstable on C6 parts with a VBIOS 113-RAVEN-114 */ +	{ 0x1002, 0x15dd, 0x1002, 0x15dd, 0xc6 },  	{ 0, 0, 0, 0, 0 },  }; @@ -1273,7 +1274,8 @@ static void gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device *adev)  	case CHIP_VEGA20:  		break;  	case CHIP_RAVEN: -		if (!(adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) && +		if (!((adev->apu_flags & AMD_APU_IS_RAVEN2) || +		      (adev->apu_flags & AMD_APU_IS_PICASSO)) &&  		    ((!is_raven_kicker(adev) &&  		      adev->gfx.rlc_fw_version < 531) ||  		     (adev->gfx.rlc_feature_version < 1) || @@ -1616,9 +1618,9 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)  		chip_name = "vega20";  		break;  	case CHIP_RAVEN: -		if (adev->rev_id >= 8) +		if (adev->apu_flags & AMD_APU_IS_RAVEN2)  			chip_name = "raven2"; -		else if (adev->pdev->device == 0x15d8) +		else if (adev->apu_flags & AMD_APU_IS_PICASSO)  			chip_name = "picasso";  		else  			chip_name = "raven"; @@ -2118,7 +2120,7 @@ static int gfx_v9_0_gpu_early_init(struct amdgpu_device *adev)  		adev->gfx.config.sc_prim_fifo_size_backend = 0x100;  		adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;  		adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0; -		if (adev->rev_id >= 8) +		if (adev->apu_flags & AMD_APU_IS_RAVEN2)  			gb_addr_config = RAVEN2_GB_ADDR_CONFIG_GOLDEN;  		else  			gb_addr_config = RAVEN_GB_ADDR_CONFIG_GOLDEN; @@ -2195,6 +2197,7 @@ static int gfx_v9_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,  	int r;  	unsigned irq_type;  	struct amdgpu_ring *ring = &adev->gfx.compute_ring[ring_id]; +	unsigned int hw_prio;  	ring = &adev->gfx.compute_ring[ring_id]; @@ -2213,10 +2216,11 @@ static int gfx_v9_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,  	irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP  		+ ((ring->me - 1) * adev->gfx.mec.num_pipe_per_mec)  		+ ring->pipe; - +	hw_prio = amdgpu_gfx_is_high_priority_compute_queue(adev, ring->queue) ? +			AMDGPU_GFX_PIPE_PRIO_HIGH : AMDGPU_GFX_PIPE_PRIO_NORMAL;  	/* type-2 packets are deprecated on MEC, use type-3 instead */  	r = amdgpu_ring_init(adev, ring, 1024, -			     &adev->gfx.eop_irq, irq_type); +			     &adev->gfx.eop_irq, irq_type, hw_prio);  	if (r)  		return r; @@ -2310,7 +2314,9 @@ static int gfx_v9_0_sw_init(void *handle)  		ring->use_doorbell = true;  		ring->doorbell_index = adev->doorbell_index.gfx_ring0 << 1;  		r = amdgpu_ring_init(adev, ring, 1024, -				     &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP); +				     &adev->gfx.eop_irq, +				     AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} @@ -2528,7 +2534,7 @@ static void gfx_v9_0_init_sq_config(struct amdgpu_device *adev)  		break;  	default:  		break; -	}; +	}  }  static void gfx_v9_0_constants_init(struct amdgpu_device *adev) @@ -2963,8 +2969,7 @@ static void gfx_v9_0_init_pg(struct amdgpu_device *adev)  	 */  	if (adev->gfx.rlc.is_rlc_v2_1) {  		if (adev->asic_type == CHIP_VEGA12 || -		    (adev->asic_type == CHIP_RAVEN && -		     adev->rev_id >= 8)) +		    (adev->apu_flags & AMD_APU_IS_RAVEN2))  			gfx_v9_1_init_rlc_save_restore_list(adev);  		gfx_v9_0_enable_save_restore_machine(adev);  	} @@ -3100,16 +3105,11 @@ static int gfx_v9_0_rlc_resume(struct amdgpu_device *adev)  static void gfx_v9_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)  { -	int i;  	u32 tmp = RREG32_SOC15(GC, 0, mmCP_ME_CNTL);  	tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, ME_HALT, enable ? 0 : 1);  	tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, enable ? 0 : 1);  	tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, enable ? 0 : 1); -	if (!enable) { -		for (i = 0; i < adev->gfx.num_gfx_rings; i++) -			adev->gfx.gfx_ring[i].sched.ready = false; -	}  	WREG32_SOC15_RLC(GC, 0, mmCP_ME_CNTL, tmp);  	udelay(50);  } @@ -3305,15 +3305,11 @@ static int gfx_v9_0_cp_gfx_resume(struct amdgpu_device *adev)  static void gfx_v9_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)  { -	int i; -  	if (enable) {  		WREG32_SOC15_RLC(GC, 0, mmCP_MEC_CNTL, 0);  	} else {  		WREG32_SOC15_RLC(GC, 0, mmCP_MEC_CNTL,  			(CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK)); -		for (i = 0; i < adev->gfx.num_compute_rings; i++) -			adev->gfx.compute_ring[i].sched.ready = false;  		adev->gfx.kiq.ring.sched.ready = false;  	}  	udelay(50); @@ -3383,11 +3379,8 @@ static void gfx_v9_0_mqd_set_priority(struct amdgpu_ring *ring, struct v9_mqd *m  	if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) {  		if (amdgpu_gfx_is_high_priority_compute_queue(adev, ring->queue)) {  			mqd->cp_hqd_pipe_priority = AMDGPU_GFX_PIPE_PRIO_HIGH; -			ring->has_high_prio = true;  			mqd->cp_hqd_queue_priority =  				AMDGPU_GFX_QUEUE_PRIORITY_MAXIMUM; -		} else { -			ring->has_high_prio = false;  		}  	}  } @@ -4054,13 +4047,18 @@ static uint64_t gfx_v9_0_kiq_read_clock(struct amdgpu_device *adev)  {  	signed long r, cnt = 0;  	unsigned long flags; -	uint32_t seq; +	uint32_t seq, reg_val_offs = 0; +	uint64_t value = 0;  	struct amdgpu_kiq *kiq = &adev->gfx.kiq;  	struct amdgpu_ring *ring = &kiq->ring;  	BUG_ON(!ring->funcs->emit_rreg);  	spin_lock_irqsave(&kiq->ring_lock, flags); +	if (amdgpu_device_wb_get(adev, ®_val_offs)) { +		pr_err("critical bug! too many kiq readers\n"); +		goto failed_unlock; +	}  	amdgpu_ring_alloc(ring, 32);  	amdgpu_ring_write(ring, PACKET3(PACKET3_COPY_DATA, 4));  	amdgpu_ring_write(ring, 9 |	/* src: register*/ @@ -4070,10 +4068,13 @@ static uint64_t gfx_v9_0_kiq_read_clock(struct amdgpu_device *adev)  	amdgpu_ring_write(ring, 0);  	amdgpu_ring_write(ring, 0);  	amdgpu_ring_write(ring, lower_32_bits(adev->wb.gpu_addr + -				kiq->reg_val_offs * 4)); +				reg_val_offs * 4));  	amdgpu_ring_write(ring, upper_32_bits(adev->wb.gpu_addr + -				kiq->reg_val_offs * 4)); -	amdgpu_fence_emit_polling(ring, &seq); +				reg_val_offs * 4)); +	r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT); +	if (r) +		goto failed_undo; +  	amdgpu_ring_commit(ring);  	spin_unlock_irqrestore(&kiq->ring_lock, flags); @@ -4099,10 +4100,19 @@ static uint64_t gfx_v9_0_kiq_read_clock(struct amdgpu_device *adev)  	if (cnt > MAX_KIQ_REG_TRY)  		goto failed_kiq_read; -	return (uint64_t)adev->wb.wb[kiq->reg_val_offs] | -		(uint64_t)adev->wb.wb[kiq->reg_val_offs + 1 ] << 32ULL; +	mb(); +	value = (uint64_t)adev->wb.wb[reg_val_offs] | +		(uint64_t)adev->wb.wb[reg_val_offs + 1 ] << 32ULL; +	amdgpu_device_wb_free(adev, reg_val_offs); +	return value; +failed_undo: +	amdgpu_ring_undo(ring); +failed_unlock: +	spin_unlock_irqrestore(&kiq->ring_lock, flags);  failed_kiq_read: +	if (reg_val_offs) +		amdgpu_device_wb_free(adev, reg_val_offs);  	pr_err("failed to read gpu clock\n");  	return ~0;  } @@ -4487,7 +4497,8 @@ static int gfx_v9_0_do_edc_gpr_workarounds(struct amdgpu_device *adev)  	/* allocate an indirect buffer to put the commands in */  	memset(&ib, 0, sizeof(ib)); -	r = amdgpu_ib_get(adev, NULL, total_size, &ib); +	r = amdgpu_ib_get(adev, NULL, total_size, +					AMDGPU_IB_POOL_DIRECT, &ib);  	if (r) {  		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);  		return r; @@ -4958,14 +4969,21 @@ static int gfx_v9_0_update_gfx_clock_gating(struct amdgpu_device *adev,  static void gfx_v9_0_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid)  { -	u32 data; +	u32 reg, data; -	data = RREG32_SOC15(GC, 0, mmRLC_SPM_MC_CNTL); +	reg = SOC15_REG_OFFSET(GC, 0, mmRLC_SPM_MC_CNTL); +	if (amdgpu_sriov_is_pp_one_vf(adev)) +		data = RREG32_NO_KIQ(reg); +	else +		data = RREG32(reg);  	data &= ~RLC_SPM_MC_CNTL__RLC_SPM_VMID_MASK;  	data |= (vmid & RLC_SPM_MC_CNTL__RLC_SPM_VMID_MASK) << RLC_SPM_MC_CNTL__RLC_SPM_VMID__SHIFT; -	WREG32_SOC15(GC, 0, mmRLC_SPM_MC_CNTL, data); +	if (amdgpu_sriov_is_pp_one_vf(adev)) +		WREG32_SOC15_NO_KIQ(GC, 0, mmRLC_SPM_MC_CNTL, data); +	else +		WREG32_SOC15(GC, 0, mmRLC_SPM_MC_CNTL, data);  }  static bool gfx_v9_0_check_rlcg_range(struct amdgpu_device *adev, @@ -5023,10 +5041,9 @@ static int gfx_v9_0_set_powergating_state(void *handle,  	switch (adev->asic_type) {  	case CHIP_RAVEN:  	case CHIP_RENOIR: -		if (!enable) { +		if (!enable)  			amdgpu_gfx_off_ctrl(adev, false); -			cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work); -		} +  		if (adev->pg_flags & AMD_PG_SUPPORT_RLC_SMU_HS) {  			gfx_v9_0_enable_sck_slow_down_on_power_up(adev, true);  			gfx_v9_0_enable_sck_slow_down_on_power_down(adev, true); @@ -5050,12 +5067,7 @@ static int gfx_v9_0_set_powergating_state(void *handle,  			amdgpu_gfx_off_ctrl(adev, true);  		break;  	case CHIP_VEGA12: -		if (!enable) { -			amdgpu_gfx_off_ctrl(adev, false); -			cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work); -		} else { -			amdgpu_gfx_off_ctrl(adev, true); -		} +		amdgpu_gfx_off_ctrl(adev, enable);  		break;  	default:  		break; @@ -5426,10 +5438,13 @@ static void gfx_v9_0_ring_emit_de_meta(struct amdgpu_ring *ring)  	amdgpu_ring_write_multiple(ring, (void *)&de_payload, sizeof(de_payload) >> 2);  } -static void gfx_v9_0_ring_emit_tmz(struct amdgpu_ring *ring, bool start) +static void gfx_v9_0_ring_emit_frame_cntl(struct amdgpu_ring *ring, bool start, +				   bool secure)  { +	uint32_t v = secure ? FRAME_TMZ : 0; +  	amdgpu_ring_write(ring, PACKET3(PACKET3_FRAME_CONTROL, 0)); -	amdgpu_ring_write(ring, FRAME_CMD(start ? 0 : 1)); /* frame_end */ +	amdgpu_ring_write(ring, v | FRAME_CMD(start ? 0 : 1));  }  static void gfx_v9_ring_emit_cntxcntl(struct amdgpu_ring *ring, uint32_t flags) @@ -5439,8 +5454,6 @@ static void gfx_v9_ring_emit_cntxcntl(struct amdgpu_ring *ring, uint32_t flags)  	if (amdgpu_sriov_vf(ring->adev))  		gfx_v9_0_ring_emit_ce_meta(ring); -	gfx_v9_0_ring_emit_tmz(ring, true); -  	dw2 |= 0x80000000; /* set load_enable otherwise this package is just NOPs */  	if (flags & AMDGPU_HAVE_CTX_SWITCH) {  		/* set load_global_config & load_global_uconfig */ @@ -5491,10 +5504,10 @@ static void gfx_v9_0_ring_emit_patch_cond_exec(struct amdgpu_ring *ring, unsigne  		ring->ring[offset] = (ring->ring_size>>2) - offset + cur;  } -static void gfx_v9_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg) +static void gfx_v9_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg, +				    uint32_t reg_val_offs)  {  	struct amdgpu_device *adev = ring->adev; -	struct amdgpu_kiq *kiq = &adev->gfx.kiq;  	amdgpu_ring_write(ring, PACKET3(PACKET3_COPY_DATA, 4));  	amdgpu_ring_write(ring, 0 |	/* src: register*/ @@ -5503,9 +5516,9 @@ static void gfx_v9_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg)  	amdgpu_ring_write(ring, reg);  	amdgpu_ring_write(ring, 0);  	amdgpu_ring_write(ring, lower_32_bits(adev->wb.gpu_addr + -				kiq->reg_val_offs * 4)); +				reg_val_offs * 4));  	amdgpu_ring_write(ring, upper_32_bits(adev->wb.gpu_addr + -				kiq->reg_val_offs * 4)); +				reg_val_offs * 4));  }  static void gfx_v9_0_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, @@ -6406,15 +6419,15 @@ static int gfx_v9_0_query_utc_edc_status(struct amdgpu_device *adev,  		sec_count = REG_GET_FIELD(data, VM_L2_MEM_ECC_CNT, SEC_COUNT);  		if (sec_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, SEC %d\n", i, -				 vml2_mems[i], sec_count); +			dev_info(adev->dev, "Instance[%d]: SubBlock %s, " +				"SEC %d\n", i, vml2_mems[i], sec_count);  			err_data->ce_count += sec_count;  		}  		ded_count = REG_GET_FIELD(data, VM_L2_MEM_ECC_CNT, DED_COUNT);  		if (ded_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, DED %d\n", i, -				 vml2_mems[i], ded_count); +			dev_info(adev->dev, "Instance[%d]: SubBlock %s, " +				"DED %d\n", i, vml2_mems[i], ded_count);  			err_data->ue_count += ded_count;  		}  	} @@ -6426,16 +6439,16 @@ static int gfx_v9_0_query_utc_edc_status(struct amdgpu_device *adev,  		sec_count = REG_GET_FIELD(data, VM_L2_WALKER_MEM_ECC_CNT,  						SEC_COUNT);  		if (sec_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, SEC %d\n", i, -				 vml2_walker_mems[i], sec_count); +			dev_info(adev->dev, "Instance[%d]: SubBlock %s, " +				"SEC %d\n", i, vml2_walker_mems[i], sec_count);  			err_data->ce_count += sec_count;  		}  		ded_count = REG_GET_FIELD(data, VM_L2_WALKER_MEM_ECC_CNT,  						DED_COUNT);  		if (ded_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, DED %d\n", i, -				 vml2_walker_mems[i], ded_count); +			dev_info(adev->dev, "Instance[%d]: SubBlock %s, " +				"DED %d\n", i, vml2_walker_mems[i], ded_count);  			err_data->ue_count += ded_count;  		}  	} @@ -6446,8 +6459,9 @@ static int gfx_v9_0_query_utc_edc_status(struct amdgpu_device *adev,  		sec_count = (data & 0x00006000L) >> 0xd;  		if (sec_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, SEC %d\n", i, -				 atc_l2_cache_2m_mems[i], sec_count); +			dev_info(adev->dev, "Instance[%d]: SubBlock %s, " +				"SEC %d\n", i, atc_l2_cache_2m_mems[i], +				sec_count);  			err_data->ce_count += sec_count;  		}  	} @@ -6458,15 +6472,17 @@ static int gfx_v9_0_query_utc_edc_status(struct amdgpu_device *adev,  		sec_count = (data & 0x00006000L) >> 0xd;  		if (sec_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, SEC %d\n", i, -				 atc_l2_cache_4k_mems[i], sec_count); +			dev_info(adev->dev, "Instance[%d]: SubBlock %s, " +				"SEC %d\n", i, atc_l2_cache_4k_mems[i], +				sec_count);  			err_data->ce_count += sec_count;  		}  		ded_count = (data & 0x00018000L) >> 0xf;  		if (ded_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, DED %d\n", i, -				 atc_l2_cache_4k_mems[i], ded_count); +			dev_info(adev->dev, "Instance[%d]: SubBlock %s, " +				"DED %d\n", i, atc_l2_cache_4k_mems[i], +				ded_count);  			err_data->ue_count += ded_count;  		}  	} @@ -6479,7 +6495,8 @@ static int gfx_v9_0_query_utc_edc_status(struct amdgpu_device *adev,  	return 0;  } -static int gfx_v9_0_ras_error_count(const struct soc15_reg_entry *reg, +static int gfx_v9_0_ras_error_count(struct amdgpu_device *adev, +	const struct soc15_reg_entry *reg,  	uint32_t se_id, uint32_t inst_id, uint32_t value,  	uint32_t *sec_count, uint32_t *ded_count)  { @@ -6496,7 +6513,8 @@ static int gfx_v9_0_ras_error_count(const struct soc15_reg_entry *reg,  				gfx_v9_0_ras_fields[i].sec_count_mask) >>  				gfx_v9_0_ras_fields[i].sec_count_shift;  		if (sec_cnt) { -			DRM_INFO("GFX SubBlock %s, Instance[%d][%d], SEC %d\n", +			dev_info(adev->dev, "GFX SubBlock %s, " +				"Instance[%d][%d], SEC %d\n",  				gfx_v9_0_ras_fields[i].name,  				se_id, inst_id,  				sec_cnt); @@ -6507,7 +6525,8 @@ static int gfx_v9_0_ras_error_count(const struct soc15_reg_entry *reg,  				gfx_v9_0_ras_fields[i].ded_count_mask) >>  				gfx_v9_0_ras_fields[i].ded_count_shift;  		if (ded_cnt) { -			DRM_INFO("GFX SubBlock %s, Instance[%d][%d], DED %d\n", +			dev_info(adev->dev, "GFX SubBlock %s, " +				"Instance[%d][%d], DED %d\n",  				gfx_v9_0_ras_fields[i].name,  				se_id, inst_id,  				ded_cnt); @@ -6596,9 +6615,10 @@ static int gfx_v9_0_query_ras_error_count(struct amdgpu_device *adev,  				reg_value =  					RREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_0_edc_counter_regs[i]));  				if (reg_value) -					gfx_v9_0_ras_error_count(&gfx_v9_0_edc_counter_regs[i], -							j, k, reg_value, -							&sec_count, &ded_count); +					gfx_v9_0_ras_error_count(adev, +						&gfx_v9_0_edc_counter_regs[i], +						j, k, reg_value, +						&sec_count, &ded_count);  			}  		}  	} @@ -6614,6 +6634,25 @@ static int gfx_v9_0_query_ras_error_count(struct amdgpu_device *adev,  	return 0;  } +static void gfx_v9_0_emit_mem_sync(struct amdgpu_ring *ring) +{ +	const unsigned int cp_coher_cntl = +			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_ICACHE_ACTION_ENA(1) | +			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_KCACHE_ACTION_ENA(1) | +			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_ACTION_ENA(1) | +			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TCL1_ACTION_ENA(1) | +			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_WB_ACTION_ENA(1); + +	/* ACQUIRE_MEM -make one or more surfaces valid for use by the subsequent operations */ +	amdgpu_ring_write(ring, PACKET3(PACKET3_ACQUIRE_MEM, 5)); +	amdgpu_ring_write(ring, cp_coher_cntl); /* CP_COHER_CNTL */ +	amdgpu_ring_write(ring, 0xffffffff);  /* CP_COHER_SIZE */ +	amdgpu_ring_write(ring, 0xffffff);  /* CP_COHER_SIZE_HI */ +	amdgpu_ring_write(ring, 0); /* CP_COHER_BASE */ +	amdgpu_ring_write(ring, 0);  /* CP_COHER_BASE_HI */ +	amdgpu_ring_write(ring, 0x0000000A); /* POLL_INTERVAL */ +} +  static const struct amd_ip_funcs gfx_v9_0_ip_funcs = {  	.name = "gfx_v9_0",  	.early_init = gfx_v9_0_early_init, @@ -6660,7 +6699,8 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_gfx = {  		3 + /* CNTX_CTRL */  		5 + /* HDP_INVL */  		8 + 8 + /* FENCE x2 */ -		2, /* SWITCH_BUFFER */ +		2 + /* SWITCH_BUFFER */ +		7, /* gfx_v9_0_emit_mem_sync */  	.emit_ib_size =	4, /* gfx_v9_0_ring_emit_ib_gfx */  	.emit_ib = gfx_v9_0_ring_emit_ib_gfx,  	.emit_fence = gfx_v9_0_ring_emit_fence, @@ -6676,11 +6716,12 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_gfx = {  	.emit_cntxcntl = gfx_v9_ring_emit_cntxcntl,  	.init_cond_exec = gfx_v9_0_ring_emit_init_cond_exec,  	.patch_cond_exec = gfx_v9_0_ring_emit_patch_cond_exec, -	.emit_tmz = gfx_v9_0_ring_emit_tmz, +	.emit_frame_cntl = gfx_v9_0_ring_emit_frame_cntl,  	.emit_wreg = gfx_v9_0_ring_emit_wreg,  	.emit_reg_wait = gfx_v9_0_ring_emit_reg_wait,  	.emit_reg_write_reg_wait = gfx_v9_0_ring_emit_reg_write_reg_wait,  	.soft_recovery = gfx_v9_0_ring_soft_recovery, +	.emit_mem_sync = gfx_v9_0_emit_mem_sync,  };  static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = { @@ -6700,7 +6741,8 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = {  		SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +  		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 +  		2 + /* gfx_v9_0_ring_emit_vm_flush */ -		8 + 8 + 8, /* gfx_v9_0_ring_emit_fence x3 for user fence, vm fence */ +		8 + 8 + 8 + /* gfx_v9_0_ring_emit_fence x3 for user fence, vm fence */ +		7, /* gfx_v9_0_emit_mem_sync */  	.emit_ib_size =	7, /* gfx_v9_0_ring_emit_ib_compute */  	.emit_ib = gfx_v9_0_ring_emit_ib_compute,  	.emit_fence = gfx_v9_0_ring_emit_fence, @@ -6715,6 +6757,7 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = {  	.emit_wreg = gfx_v9_0_ring_emit_wreg,  	.emit_reg_wait = gfx_v9_0_ring_emit_reg_wait,  	.emit_reg_write_reg_wait = gfx_v9_0_ring_emit_reg_write_reg_wait, +	.emit_mem_sync = gfx_v9_0_emit_mem_sync,  };  static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_kiq = { @@ -6838,7 +6881,7 @@ static void gfx_v9_0_set_gds_init(struct amdgpu_device *adev)  		adev->gds.gds_compute_max_wave_id = 0x27f;  		break;  	case CHIP_RAVEN: -		if (adev->rev_id >= 0x8) +		if (adev->apu_flags & AMD_APU_IS_RAVEN2)  			adev->gds.gds_compute_max_wave_id = 0x77; /* raven2 */  		else  			adev->gds.gds_compute_max_wave_id = 0x15f; /* raven1 */  |