diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 29 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 24 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 16 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h | 16 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/nv.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/soc15.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vi.c | 2 | 
13 files changed, 84 insertions, 41 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 2992a49ad4a5..8ac1581a6b53 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -945,6 +945,7 @@ struct amdgpu_device {  	/* s3/s4 mask */  	bool                            in_suspend; +	bool				in_hibernate;  	/* record last mm index being written through WREG32*/  	unsigned long last_mm_index; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index 9dff792c9290..6a5b91d23fd9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -1343,7 +1343,7 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(  	}  	/* Free the BO*/ -	amdgpu_bo_unref(&mem->bo); +	drm_gem_object_put_unlocked(&mem->bo->tbo.base);  	mutex_destroy(&mem->lock);  	kfree(mem); @@ -1688,7 +1688,8 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,  		| KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE  		| KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE; -	(*mem)->bo = amdgpu_bo_ref(bo); +	drm_gem_object_get(&bo->tbo.base); +	(*mem)->bo = bo;  	(*mem)->va = va;  	(*mem)->domain = (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ?  		AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 559dc24ef436..affde2de2a0d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -2008,8 +2008,24 @@ static void amdgpu_device_fill_reset_magic(struct amdgpu_device *adev)   */  static bool amdgpu_device_check_vram_lost(struct amdgpu_device *adev)  { -	return !!memcmp(adev->gart.ptr, adev->reset_magic, -			AMDGPU_RESET_MAGIC_NUM); +	if (memcmp(adev->gart.ptr, adev->reset_magic, +			AMDGPU_RESET_MAGIC_NUM)) +		return true; + +	if (!adev->in_gpu_reset) +		return false; + +	/* +	 * For all ASICs with baco/mode1 reset, the VRAM is +	 * always assumed to be lost. +	 */ +	switch (amdgpu_asic_reset_method(adev)) { +	case AMD_RESET_METHOD_BACO: +	case AMD_RESET_METHOD_MODE1: +		return true; +	default: +		return false; +	}  }  /** @@ -2340,6 +2356,8 @@ static int amdgpu_device_ip_suspend_phase1(struct amdgpu_device *adev)  {  	int i, r; +	amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE); +	amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE);  	for (i = adev->num_ip_blocks - 1; i >= 0; i--) {  		if (!adev->ip_blocks[i].status.valid) @@ -3354,15 +3372,12 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)  		}  	} -	amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE); -	amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE); - -	amdgpu_amdkfd_suspend(adev, !fbcon); -  	amdgpu_ras_suspend(adev);  	r = amdgpu_device_ip_suspend_phase1(adev); +	amdgpu_amdkfd_suspend(adev, !fbcon); +  	/* evict vram memory */  	amdgpu_bo_evict_vram(adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 8ea86ffdea0d..a735d79a717b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -85,9 +85,10 @@   * - 3.34.0 - Non-DC can flip correctly between buffers with different pitches   * - 3.35.0 - Add drm_amdgpu_info_device::tcc_disabled_mask   * - 3.36.0 - Allow reading more status registers on si/cik + * - 3.37.0 - L2 is invalidated before SDMA IBs, needed for correctness   */  #define KMS_DRIVER_MAJOR	3 -#define KMS_DRIVER_MINOR	36 +#define KMS_DRIVER_MINOR	37  #define KMS_DRIVER_PATCHLEVEL	0  int amdgpu_vram_limit = 0; @@ -1180,7 +1181,9 @@ static int amdgpu_pmops_freeze(struct device *dev)  	struct amdgpu_device *adev = drm_dev->dev_private;  	int r; +	adev->in_hibernate = true;  	r = amdgpu_device_suspend(drm_dev, true); +	adev->in_hibernate = false;  	if (r)  		return r;  	return amdgpu_asic_reset(adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c index 9ae7b61f696a..25ddb482466a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c @@ -133,8 +133,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,  	u32 cpp;  	u64 flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |  			       AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS     | -			       AMDGPU_GEM_CREATE_VRAM_CLEARED 	     | -			       AMDGPU_GEM_CREATE_CPU_GTT_USWC; +			       AMDGPU_GEM_CREATE_VRAM_CLEARED;  	info = drm_get_format_info(adev->ddev, mode_cmd);  	cpp = info->cpp[0]; diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c b/drivers/gpu/drm/amd/amdgpu/cik.c index 006f21ef7ddf..62635e58e45e 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik.c +++ b/drivers/gpu/drm/amd/amdgpu/cik.c @@ -1358,8 +1358,6 @@ static int cik_asic_reset(struct amdgpu_device *adev)  	int r;  	if (cik_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) { -		if (!adev->in_suspend) -			amdgpu_inc_vram_lost(adev);  		r = amdgpu_dpm_baco_reset(adev);  	} else {  		r = cik_asic_pci_config_reset(adev); diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c index d78059fd2c72..0e0daf0021b6 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c @@ -279,7 +279,7 @@ static const struct soc15_reg_golden golden_settings_gc_10_1_2_nv12[] =  #define DEFAULT_SH_MEM_CONFIG \  	((SH_MEM_ADDRESS_MODE_64 << SH_MEM_CONFIG__ADDRESS_MODE__SHIFT) | \ -	 (SH_MEM_ALIGNMENT_MODE_DWORD << SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT) | \ +	 (SH_MEM_ALIGNMENT_MODE_UNALIGNED << SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT) | \  	 (SH_MEM_RETRY_MODE_ALL << SH_MEM_CONFIG__RETRY_MODE__SHIFT) | \  	 (3 << SH_MEM_CONFIG__INITIAL_INST_PREFETCH__SHIFT)) @@ -4273,7 +4273,7 @@ static int gfx_v10_0_update_gfx_clock_gating(struct amdgpu_device *adev,  		/* ===  CGCG /CGLS for GFX 3D Only === */  		gfx_v10_0_update_3d_clock_gating(adev, enable);  		/* ===  MGCG + MGLS === */ -		/* gfx_v10_0_update_medium_grain_clock_gating(adev, enable); */ +		gfx_v10_0_update_medium_grain_clock_gating(adev, enable);  	}  	if (adev->cg_flags & @@ -4353,11 +4353,7 @@ static int gfx_v10_0_set_powergating_state(void *handle,  	switch (adev->asic_type) {  	case CHIP_NAVI10:  	case CHIP_NAVI14: -		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; @@ -4918,6 +4914,19 @@ static void gfx_v10_0_ring_emit_reg_write_reg_wait(struct amdgpu_ring *ring,  							   ref, mask);  } +static void gfx_v10_0_ring_soft_recovery(struct amdgpu_ring *ring, +					 unsigned vmid) +{ +	struct amdgpu_device *adev = ring->adev; +	uint32_t value = 0; + +	value = REG_SET_FIELD(value, SQ_CMD, CMD, 0x03); +	value = REG_SET_FIELD(value, SQ_CMD, MODE, 0x01); +	value = REG_SET_FIELD(value, SQ_CMD, CHECK_VMID, 1); +	value = REG_SET_FIELD(value, SQ_CMD, VM_ID, vmid); +	WREG32_SOC15(GC, 0, mmSQ_CMD, value); +} +  static void  gfx_v10_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev,  				      uint32_t me, uint32_t pipe, @@ -5309,6 +5318,7 @@ static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_gfx = {  	.emit_wreg = gfx_v10_0_ring_emit_wreg,  	.emit_reg_wait = gfx_v10_0_ring_emit_reg_wait,  	.emit_reg_write_reg_wait = gfx_v10_0_ring_emit_reg_write_reg_wait, +	.soft_recovery = gfx_v10_0_ring_soft_recovery,  };  static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_compute = { diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index e6b113ed2f40..d2d9dce68c2f 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c @@ -1234,6 +1234,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 },  }; @@ -5023,10 +5027,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 +5053,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; diff --git a/drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h b/drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h index 074a9a09c0a7..a5b60c9a2418 100644 --- a/drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h +++ b/drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h @@ -73,6 +73,22 @@  #define SDMA_OP_AQL_COPY  0  #define SDMA_OP_AQL_BARRIER_OR  0 +#define SDMA_GCR_RANGE_IS_PA		(1 << 18) +#define SDMA_GCR_SEQ(x)			(((x) & 0x3) << 16) +#define SDMA_GCR_GL2_WB			(1 << 15) +#define SDMA_GCR_GL2_INV		(1 << 14) +#define SDMA_GCR_GL2_DISCARD		(1 << 13) +#define SDMA_GCR_GL2_RANGE(x)		(((x) & 0x3) << 11) +#define SDMA_GCR_GL2_US			(1 << 10) +#define SDMA_GCR_GL1_INV		(1 << 9) +#define SDMA_GCR_GLV_INV		(1 << 8) +#define SDMA_GCR_GLK_INV		(1 << 7) +#define SDMA_GCR_GLK_WB			(1 << 6) +#define SDMA_GCR_GLM_INV		(1 << 5) +#define SDMA_GCR_GLM_WB			(1 << 4) +#define SDMA_GCR_GL1_RANGE(x)		(((x) & 0x3) << 2) +#define SDMA_GCR_GLI_INV(x)		(((x) & 0x3) << 0) +  /*define for op field*/  #define SDMA_PKT_HEADER_op_offset 0  #define SDMA_PKT_HEADER_op_mask   0x000000FF diff --git a/drivers/gpu/drm/amd/amdgpu/nv.c b/drivers/gpu/drm/amd/amdgpu/nv.c index 033cbbca2072..52318b03c424 100644 --- a/drivers/gpu/drm/amd/amdgpu/nv.c +++ b/drivers/gpu/drm/amd/amdgpu/nv.c @@ -351,8 +351,6 @@ static int nv_asic_reset(struct amdgpu_device *adev)  	struct smu_context *smu = &adev->smu;  	if (nv_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) { -		if (!adev->in_suspend) -			amdgpu_inc_vram_lost(adev);  		ret = smu_baco_enter(smu);  		if (ret)  			return ret; @@ -360,8 +358,6 @@ static int nv_asic_reset(struct amdgpu_device *adev)  		if (ret)  			return ret;  	} else { -		if (!adev->in_suspend) -			amdgpu_inc_vram_lost(adev);  		ret = nv_asic_mode1_reset(adev);  	} diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c index ebfd2cdf4e65..d2840c2f6286 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c @@ -382,6 +382,18 @@ static void sdma_v5_0_ring_emit_ib(struct amdgpu_ring *ring,  	unsigned vmid = AMDGPU_JOB_GET_VMID(job);  	uint64_t csa_mc_addr = amdgpu_sdma_get_csa_mc_addr(ring, vmid); +	/* Invalidate L2, because if we don't do it, we might get stale cache +	 * lines from previous IBs. +	 */ +	amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_GCR_REQ)); +	amdgpu_ring_write(ring, 0); +	amdgpu_ring_write(ring, (SDMA_GCR_GL2_INV | +				 SDMA_GCR_GL2_WB | +				 SDMA_GCR_GLM_INV | +				 SDMA_GCR_GLM_WB) << 16); +	amdgpu_ring_write(ring, 0xffffff80); +	amdgpu_ring_write(ring, 0xffff); +  	/* An IB packet must end on a 8 DW boundary--the next dword  	 * must be on a 8-dword boundary. Our IB packet below is 6  	 * dwords long, thus add x number of NOPs, such that, in @@ -1595,7 +1607,7 @@ static const struct amdgpu_ring_funcs sdma_v5_0_ring_funcs = {  		SOC15_FLUSH_GPU_TLB_NUM_WREG * 3 +  		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 6 * 2 +  		10 + 10 + 10, /* sdma_v5_0_ring_emit_fence x3 for user fence, vm fence */ -	.emit_ib_size = 7 + 6, /* sdma_v5_0_ring_emit_ib */ +	.emit_ib_size = 5 + 7 + 6, /* sdma_v5_0_ring_emit_ib */  	.emit_ib = sdma_v5_0_ring_emit_ib,  	.emit_fence = sdma_v5_0_ring_emit_fence,  	.emit_pipeline_sync = sdma_v5_0_ring_emit_pipeline_sync, diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index a40499d51c93..d42a8d8a0dea 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c @@ -569,14 +569,10 @@ static int soc15_asic_reset(struct amdgpu_device *adev)  	switch (soc15_asic_reset_method(adev)) {  		case AMD_RESET_METHOD_BACO: -			if (!adev->in_suspend) -				amdgpu_inc_vram_lost(adev);  			return soc15_asic_baco_reset(adev);  		case AMD_RESET_METHOD_MODE2:  			return amdgpu_dpm_mode2_reset(adev);  		default: -			if (!adev->in_suspend) -				amdgpu_inc_vram_lost(adev);  			return soc15_asic_mode1_reset(adev);  	}  } diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c index 78b35901643b..3ce10e05d0d6 100644 --- a/drivers/gpu/drm/amd/amdgpu/vi.c +++ b/drivers/gpu/drm/amd/amdgpu/vi.c @@ -765,8 +765,6 @@ static int vi_asic_reset(struct amdgpu_device *adev)  	int r;  	if (vi_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) { -		if (!adev->in_suspend) -			amdgpu_inc_vram_lost(adev);  		r = amdgpu_dpm_baco_reset(adev);  	} else {  		r = vi_asic_pci_config_reset(adev); |