diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
25 files changed, 122 insertions, 92 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c index fad3b91f74f5..d39cff4a1fe3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c @@ -156,16 +156,16 @@ static uint32_t get_sdma_rlc_reg_offset(struct amdgpu_device *adev,  				mmSDMA0_RLC0_RB_CNTL) - mmSDMA0_RLC0_RB_CNTL;  		break;  	case 1: -		sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA1, 0, +		sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA0, 0,  				mmSDMA1_RLC0_RB_CNTL) - mmSDMA0_RLC0_RB_CNTL;  		break;  	case 2: -		sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA2, 0, -				mmSDMA2_RLC0_RB_CNTL) - mmSDMA2_RLC0_RB_CNTL; +		sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA0, 0, +				mmSDMA2_RLC0_RB_CNTL) - mmSDMA0_RLC0_RB_CNTL;  		break;  	case 3: -		sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA3, 0, -				mmSDMA3_RLC0_RB_CNTL) - mmSDMA2_RLC0_RB_CNTL; +		sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA0, 0, +				mmSDMA3_RLC0_RB_CNTL) - mmSDMA0_RLC0_RB_CNTL;  		break;  	} @@ -450,7 +450,7 @@ static int hqd_sdma_dump_v10_3(struct kgd_dev *kgd,  			engine_id, queue_id);  	uint32_t i = 0, reg;  #undef HQD_N_REGS -#define HQD_N_REGS (19+6+7+10) +#define HQD_N_REGS (19+6+7+12)  	*dump = kmalloc(HQD_N_REGS*2*sizeof(uint32_t), GFP_KERNEL);  	if (*dump == NULL) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c index 0350205c4897..6819fe5612d9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c @@ -337,7 +337,6 @@ static int amdgpu_ctx_query2(struct amdgpu_device *adev,  {  	struct amdgpu_ctx *ctx;  	struct amdgpu_ctx_mgr *mgr; -	unsigned long ras_counter;  	if (!fpriv)  		return -EINVAL; @@ -362,21 +361,6 @@ static int amdgpu_ctx_query2(struct amdgpu_device *adev,  	if (atomic_read(&ctx->guilty))  		out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_GUILTY; -	/*query ue count*/ -	ras_counter = amdgpu_ras_query_error_count(adev, false); -	/*ras counter is monotonic increasing*/ -	if (ras_counter != ctx->ras_counter_ue) { -		out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_RAS_UE; -		ctx->ras_counter_ue = ras_counter; -	} - -	/*query ce count*/ -	ras_counter = amdgpu_ras_query_error_count(adev, true); -	if (ras_counter != ctx->ras_counter_ce) { -		out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_RAS_CE; -		ctx->ras_counter_ce = ras_counter; -	} -  	mutex_unlock(&mgr->lock);  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 8b2a37bf2adf..57ec108b5972 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -3118,7 +3118,9 @@ bool amdgpu_device_asic_has_dc_support(enum amd_asic_type asic_type)   */  bool amdgpu_device_has_dc_support(struct amdgpu_device *adev)  { -	if (amdgpu_sriov_vf(adev) || adev->enable_virtual_display) +	if (amdgpu_sriov_vf(adev) ||  +	    adev->enable_virtual_display || +	    (adev->harvest_ip_mask & AMD_HARVEST_IP_DMU_MASK))  		return false;  	return amdgpu_device_asic_has_dc_support(adev->asic_type); @@ -4479,7 +4481,6 @@ out:  			r = amdgpu_ib_ring_tests(tmp_adev);  			if (r) {  				dev_err(tmp_adev->dev, "ib ring test failed (%d).\n", r); -				r = amdgpu_device_ip_suspend(tmp_adev);  				need_full_reset = true;  				r = -EAGAIN;  				goto end; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index 8a1fb8b6606e..2a4cd7d377bf 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c @@ -1047,17 +1047,18 @@ int amdgpu_display_gem_fb_init(struct drm_device *dev,  	rfb->base.obj[0] = obj;  	drm_helper_mode_fill_fb_struct(dev, &rfb->base, mode_cmd); -	ret = drm_framebuffer_init(dev, &rfb->base, &amdgpu_fb_funcs); + +	ret = amdgpu_display_framebuffer_init(dev, rfb, mode_cmd, obj);  	if (ret)  		goto err; -	ret = amdgpu_display_framebuffer_init(dev, rfb, mode_cmd, obj); +	ret = drm_framebuffer_init(dev, &rfb->base, &amdgpu_fb_funcs);  	if (ret)  		goto err;  	return 0;  err: -	drm_err(dev, "Failed to init gem fb: %d\n", ret); +	drm_dbg_kms(dev, "Failed to init gem fb: %d\n", ret);  	rfb->base.obj[0] = NULL;  	return ret;  } @@ -1071,9 +1072,6 @@ int amdgpu_display_gem_fb_verify_and_init(  	rfb->base.obj[0] = obj;  	drm_helper_mode_fill_fb_struct(dev, &rfb->base, mode_cmd); -	ret = drm_framebuffer_init(dev, &rfb->base, &amdgpu_fb_funcs); -	if (ret) -		goto err;  	/* Verify that the modifier is supported. */  	if (!drm_any_plane_has_format(dev, mode_cmd->pixel_format,  				      mode_cmd->modifier[0])) { @@ -1092,9 +1090,13 @@ int amdgpu_display_gem_fb_verify_and_init(  	if (ret)  		goto err; +	ret = drm_framebuffer_init(dev, &rfb->base, &amdgpu_fb_funcs); +	if (ret) +		goto err; +  	return 0;  err: -	drm_err(dev, "Failed to verify and init gem fb: %d\n", ret); +	drm_dbg_kms(dev, "Failed to verify and init gem fb: %d\n", ret);  	rfb->base.obj[0] = NULL;  	return ret;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c index baa980a477d9..37ec59365080 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c @@ -214,9 +214,21 @@ static int amdgpu_dma_buf_pin(struct dma_buf_attachment *attach)  {  	struct drm_gem_object *obj = attach->dmabuf->priv;  	struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); +	int r;  	/* pin buffer into GTT */ -	return amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT); +	r = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT); +	if (r) +		return r; + +	if (bo->tbo.moving) { +		r = dma_fence_wait(bo->tbo.moving, true); +		if (r) { +			amdgpu_bo_unpin(bo); +			return r; +		} +	} +	return 0;  }  /** diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c index 4f10c4529840..09b048647523 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c @@ -288,10 +288,13 @@ out:  static int amdgpu_fbdev_destroy(struct drm_device *dev, struct amdgpu_fbdev *rfbdev)  {  	struct amdgpu_framebuffer *rfb = &rfbdev->rfb; +	int i;  	drm_fb_helper_unregister_fbi(&rfbdev->helper);  	if (rfb->base.obj[0]) { +		for (i = 0; i < rfb->base.format->num_planes; i++) +			drm_gem_object_put(rfb->base.obj[0]);  		amdgpufb_destroy_pinned_object(rfb->base.obj[0]);  		rfb->base.obj[0] = NULL;  		drm_framebuffer_unregister_private(&rfb->base); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c index 8f4a8f8d8146..39b6c6bfab45 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c @@ -101,7 +101,8 @@ static int amdgpu_fru_read_eeprom(struct amdgpu_device *adev, uint32_t addrptr,  int amdgpu_fru_get_product_info(struct amdgpu_device *adev)  {  	unsigned char buff[34]; -	int addrptr = 0, size = 0; +	int addrptr, size; +	int len;  	if (!is_fru_eeprom_supported(adev))  		return 0; @@ -109,7 +110,7 @@ int amdgpu_fru_get_product_info(struct amdgpu_device *adev)  	/* If algo exists, it means that the i2c_adapter's initialized */  	if (!adev->pm.smu_i2c.algo) {  		DRM_WARN("Cannot access FRU, EEPROM accessor not initialized"); -		return 0; +		return -ENODEV;  	}  	/* There's a lot of repetition here. This is due to the FRU having @@ -128,7 +129,7 @@ int amdgpu_fru_get_product_info(struct amdgpu_device *adev)  	size = amdgpu_fru_read_eeprom(adev, addrptr, buff);  	if (size < 1) {  		DRM_ERROR("Failed to read FRU Manufacturer, ret:%d", size); -		return size; +		return -EINVAL;  	}  	/* Increment the addrptr by the size of the field, and 1 due to the @@ -138,43 +139,45 @@ int amdgpu_fru_get_product_info(struct amdgpu_device *adev)  	size = amdgpu_fru_read_eeprom(adev, addrptr, buff);  	if (size < 1) {  		DRM_ERROR("Failed to read FRU product name, ret:%d", size); -		return size; +		return -EINVAL;  	} +	len = size;  	/* Product name should only be 32 characters. Any more,  	 * and something could be wrong. Cap it at 32 to be safe  	 */ -	if (size > 32) { +	if (len >= sizeof(adev->product_name)) {  		DRM_WARN("FRU Product Number is larger than 32 characters. This is likely a mistake"); -		size = 32; +		len = sizeof(adev->product_name) - 1;  	}  	/* Start at 2 due to buff using fields 0 and 1 for the address */ -	memcpy(adev->product_name, &buff[2], size); -	adev->product_name[size] = '\0'; +	memcpy(adev->product_name, &buff[2], len); +	adev->product_name[len] = '\0';  	addrptr += size + 1;  	size = amdgpu_fru_read_eeprom(adev, addrptr, buff);  	if (size < 1) {  		DRM_ERROR("Failed to read FRU product number, ret:%d", size); -		return size; +		return -EINVAL;  	} +	len = size;  	/* Product number should only be 16 characters. Any more,  	 * and something could be wrong. Cap it at 16 to be safe  	 */ -	if (size > 16) { +	if (len >= sizeof(adev->product_number)) {  		DRM_WARN("FRU Product Number is larger than 16 characters. This is likely a mistake"); -		size = 16; +		len = sizeof(adev->product_number) - 1;  	} -	memcpy(adev->product_number, &buff[2], size); -	adev->product_number[size] = '\0'; +	memcpy(adev->product_number, &buff[2], len); +	adev->product_number[len] = '\0';  	addrptr += size + 1;  	size = amdgpu_fru_read_eeprom(adev, addrptr, buff);  	if (size < 1) {  		DRM_ERROR("Failed to read FRU product version, ret:%d", size); -		return size; +		return -EINVAL;  	}  	addrptr += size + 1; @@ -182,18 +185,19 @@ int amdgpu_fru_get_product_info(struct amdgpu_device *adev)  	if (size < 1) {  		DRM_ERROR("Failed to read FRU serial number, ret:%d", size); -		return size; +		return -EINVAL;  	} +	len = size;  	/* Serial number should only be 16 characters. Any more,  	 * and something could be wrong. Cap it at 16 to be safe  	 */ -	if (size > 16) { +	if (len >= sizeof(adev->serial)) {  		DRM_WARN("FRU Serial Number is larger than 16 characters. This is likely a mistake"); -		size = 16; +		len = sizeof(adev->serial) - 1;  	} -	memcpy(adev->serial, &buff[2], size); -	adev->serial[size] = '\0'; +	memcpy(adev->serial, &buff[2], len); +	adev->serial[len] = '\0';  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 1345f7eba011..f9434bc2f9b2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -100,7 +100,7 @@ static void amdgpu_bo_destroy(struct ttm_buffer_object *tbo)  		kfree(ubo->metadata);  	} -	kfree(bo); +	kvfree(bo);  }  /** @@ -552,7 +552,7 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,  	BUG_ON(bp->bo_ptr_size < sizeof(struct amdgpu_bo));  	*bo_ptr = NULL; -	bo = kzalloc(bp->bo_ptr_size, GFP_KERNEL); +	bo = kvzalloc(bp->bo_ptr_size, GFP_KERNEL);  	if (bo == NULL)  		return -ENOMEM;  	drm_gem_private_object_init(adev_to_drm(adev), &bo->tbo.base, size); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h index 46a5328e00e0..60aa99a39a74 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h @@ -76,6 +76,7 @@ struct psp_ring  	uint64_t			ring_mem_mc_addr;  	void				*ring_mem_handle;  	uint32_t			ring_size; +	uint32_t			ring_wptr;  };  /* More registers may will be supported */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 3bef0432cac2..d5cbc51c5eaa 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -225,7 +225,7 @@ static int amdgpu_ttm_map_buffer(struct ttm_buffer_object *bo,  	*addr += mm_cur->start & ~PAGE_MASK;  	num_dw = ALIGN(adev->mman.buffer_funcs->copy_num_dw, 8); -	num_bytes = num_pages * 8; +	num_bytes = num_pages * 8 * AMDGPU_GPU_PAGES_IN_CPU_PAGE;  	r = amdgpu_job_alloc_with_ib(adev, num_dw * 4 + num_bytes,  				     AMDGPU_IB_POOL_DELAYED, &job); @@ -1210,6 +1210,7 @@ static void amdgpu_ttm_tt_unpopulate(struct ttm_device *bdev,  	if (gtt && gtt->userptr) {  		amdgpu_ttm_tt_set_user_pages(ttm, NULL);  		kfree(ttm->sg); +		ttm->sg = NULL;  		ttm->page_flags &= ~TTM_PAGE_FLAG_SG;  		return;  	} diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c index 2408ed4c7d84..0597aeb5f0e8 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c @@ -173,6 +173,9 @@  #define mmGC_THROTTLE_CTRL_Sienna_Cichlid              0x2030  #define mmGC_THROTTLE_CTRL_Sienna_Cichlid_BASE_IDX     0 +#define mmRLC_SPARE_INT_0_Sienna_Cichlid               0x4ca5 +#define mmRLC_SPARE_INT_0_Sienna_Cichlid_BASE_IDX      1 +  #define GFX_RLCG_GC_WRITE_OLD	(0x8 << 28)  #define GFX_RLCG_GC_WRITE	(0x0 << 28)  #define GFX_RLCG_GC_READ	(0x1 << 28) @@ -1395,9 +1398,10 @@ static const struct soc15_reg_golden golden_settings_gc_10_1_2[] =  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG, 0xffffffff, 0x20000000),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xffffffff, 0x00000420),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG3, 0xffffffff, 0x00000200), -	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG4, 0xffffffff, 0x04800000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG4, 0xffffffff, 0x04900000),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DFSM_TILES_IN_FLIGHT, 0x0000ffff, 0x0000003f),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_LAST_OF_BURST_CONFIG, 0xffffffff, 0x03860204), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0x0c1800ff, 0x00000044),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGCR_GENERAL_CNTL, 0x1ff0ffff, 0x00000500),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGE_PRIV_CONTROL, 0x00007fff, 0x000001fe),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL1_PIPE_STEER, 0xffffffff, 0xe4e4e4e4), @@ -1415,12 +1419,13 @@ static const struct soc15_reg_golden golden_settings_gc_10_1_2[] =  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_2, 0x00000820, 0x00000820),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRMI_SPARE, 0xffffffff, 0xffff3101), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_CONFIG_CNTL_1, 0x001f0000, 0x00070104),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_ALU_CLK_CTRL, 0xffffffff, 0xffffffff),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_ARB_CONFIG, 0x00000133, 0x00000130),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_LDS_CLK_CTRL, 0xffffffff, 0xffffffff),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfff7ffff, 0x01030000),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CNTL, 0xffdf80ff, 0x479c0010), -	SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0xffffffff, 0x00800000) +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0xffffffff, 0x00c00000)  };  static bool gfx_v10_is_rlcg_rw(struct amdgpu_device *adev, u32 offset, uint32_t *flag, bool write) @@ -1478,8 +1483,15 @@ static u32 gfx_v10_rlcg_rw(struct amdgpu_device *adev, u32 offset, u32 v, uint32  		       (adev->reg_offset[GC_HWIP][0][mmSCRATCH_REG0_BASE_IDX] + mmSCRATCH_REG2) * 4;  	scratch_reg3 = adev->rmmio +  		       (adev->reg_offset[GC_HWIP][0][mmSCRATCH_REG1_BASE_IDX] + mmSCRATCH_REG3) * 4; -	spare_int = adev->rmmio + -		    (adev->reg_offset[GC_HWIP][0][mmRLC_SPARE_INT_BASE_IDX] + mmRLC_SPARE_INT) * 4; + +	if (adev->asic_type >= CHIP_SIENNA_CICHLID) { +		spare_int = adev->rmmio + +			    (adev->reg_offset[GC_HWIP][0][mmRLC_SPARE_INT_0_Sienna_Cichlid_BASE_IDX] +			     + mmRLC_SPARE_INT_0_Sienna_Cichlid) * 4; +	} else { +		spare_int = adev->rmmio + +			    (adev->reg_offset[GC_HWIP][0][mmRLC_SPARE_INT_BASE_IDX] + mmRLC_SPARE_INT) * 4; +	}  	grbm_cntl = adev->reg_offset[GC_HWIP][0][mmGRBM_GFX_CNTL_BASE_IDX] + mmGRBM_GFX_CNTL;  	grbm_idx = adev->reg_offset[GC_HWIP][0][mmGRBM_GFX_INDEX_BASE_IDX] + mmGRBM_GFX_INDEX; @@ -7347,9 +7359,15 @@ static int gfx_v10_0_hw_fini(void *handle)  	if (amdgpu_sriov_vf(adev)) {  		gfx_v10_0_cp_gfx_enable(adev, false);  		/* Program KIQ position of RLC_CP_SCHEDULERS during destroy */ -		tmp = RREG32_SOC15(GC, 0, mmRLC_CP_SCHEDULERS); -		tmp &= 0xffffff00; -		WREG32_SOC15(GC, 0, mmRLC_CP_SCHEDULERS, tmp); +		if (adev->asic_type >= CHIP_SIENNA_CICHLID) { +			tmp = RREG32_SOC15(GC, 0, mmRLC_CP_SCHEDULERS_Sienna_Cichlid); +			tmp &= 0xffffff00; +			WREG32_SOC15(GC, 0, mmRLC_CP_SCHEDULERS_Sienna_Cichlid, tmp); +		} else { +			tmp = RREG32_SOC15(GC, 0, mmRLC_CP_SCHEDULERS); +			tmp &= 0xffffff00; +			WREG32_SOC15(GC, 0, mmRLC_CP_SCHEDULERS, tmp); +		}  		return 0;  	} diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index a078a38c2cee..516467e962b7 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c @@ -4943,7 +4943,7 @@ static void gfx_v9_0_update_3d_clock_gating(struct amdgpu_device *adev,  	amdgpu_gfx_rlc_enter_safe_mode(adev);  	/* Enable 3D CGCG/CGLS */ -	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGCG)) { +	if (enable) {  		/* write cmd to clear cgcg/cgls ov */  		def = data = RREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE);  		/* unset CGCG override */ @@ -4955,8 +4955,12 @@ static void gfx_v9_0_update_3d_clock_gating(struct amdgpu_device *adev,  		/* enable 3Dcgcg FSM(0x0000363f) */  		def = RREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D); -		data = (0x36 << RLC_CGCG_CGLS_CTRL_3D__CGCG_GFX_IDLE_THRESHOLD__SHIFT) | -			RLC_CGCG_CGLS_CTRL_3D__CGCG_EN_MASK; +		if (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGCG) +			data = (0x36 << RLC_CGCG_CGLS_CTRL_3D__CGCG_GFX_IDLE_THRESHOLD__SHIFT) | +				RLC_CGCG_CGLS_CTRL_3D__CGCG_EN_MASK; +		else +			data = 0x0 << RLC_CGCG_CGLS_CTRL_3D__CGCG_GFX_IDLE_THRESHOLD__SHIFT; +  		if (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGLS)  			data |= (0x000F << RLC_CGCG_CGLS_CTRL_3D__CGLS_REP_COMPANSAT_DELAY__SHIFT) |  				RLC_CGCG_CGLS_CTRL_3D__CGLS_EN_MASK; diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c index de5abceced0d..85967a5570cb 100644 --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c @@ -172,6 +172,8 @@ static int jpeg_v2_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	cancel_delayed_work_sync(&adev->vcn.idle_work); +  	if (adev->jpeg.cur_state != AMD_PG_STATE_GATE &&  	      RREG32_SOC15(JPEG, 0, mmUVD_JRBC_STATUS))  		jpeg_v2_0_set_powergating_state(adev, AMD_PG_STATE_GATE); diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c index 83531997aeba..46096ad7f0d9 100644 --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c @@ -187,19 +187,17 @@ static int jpeg_v2_5_hw_init(void *handle)  static int jpeg_v2_5_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	struct amdgpu_ring *ring;  	int i; +	cancel_delayed_work_sync(&adev->vcn.idle_work); +  	for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) {  		if (adev->jpeg.harvest_config & (1 << i))  			continue; -		ring = &adev->jpeg.inst[i].ring_dec;  		if (adev->jpeg.cur_state != AMD_PG_STATE_GATE &&  		      RREG32_SOC15(JPEG, i, mmUVD_JRBC_STATUS))  			jpeg_v2_5_set_powergating_state(adev, AMD_PG_STATE_GATE); - -		ring->sched.ready = false;  	}  	return 0; diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c index de5dfcfb3859..bd77794315bc 100644 --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c @@ -159,15 +159,13 @@ static int jpeg_v3_0_hw_init(void *handle)  static int jpeg_v3_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	struct amdgpu_ring *ring; -	ring = &adev->jpeg.inst->ring_dec; +	cancel_delayed_work_sync(&adev->vcn.idle_work); +  	if (adev->jpeg.cur_state != AMD_PG_STATE_GATE &&  	      RREG32_SOC15(JPEG, 0, mmUVD_JRBC_STATUS))  		jpeg_v3_0_set_powergating_state(adev, AMD_PG_STATE_GATE); -	ring->sched.ready = false; -  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c index 589410c32d09..02bba1f3c42e 100644 --- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c @@ -720,7 +720,7 @@ static uint32_t psp_v11_0_ring_get_wptr(struct psp_context *psp)  	struct amdgpu_device *adev = psp->adev;  	if (amdgpu_sriov_vf(adev)) -		data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102); +		data = psp->km_ring.ring_wptr;  	else  		data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67); @@ -734,6 +734,7 @@ static void psp_v11_0_ring_set_wptr(struct psp_context *psp, uint32_t value)  	if (amdgpu_sriov_vf(adev)) {  		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, value);  		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, GFX_CTRL_CMD_ID_CONSUME_CMD); +		psp->km_ring.ring_wptr = value;  	} else  		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, value);  } diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c index f2e725f72d2f..908664a5774b 100644 --- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c +++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c @@ -379,7 +379,7 @@ static uint32_t psp_v3_1_ring_get_wptr(struct psp_context *psp)  	struct amdgpu_device *adev = psp->adev;  	if (amdgpu_sriov_vf(adev)) -		data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102); +		data = psp->km_ring.ring_wptr;  	else  		data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67);  	return data; @@ -394,6 +394,7 @@ static void psp_v3_1_ring_set_wptr(struct psp_context *psp, uint32_t value)  		/* send interrupt to PSP for SRIOV ring write pointer update */  		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101,  			GFX_CTRL_CMD_ID_CONSUME_CMD); +		psp->km_ring.ring_wptr = value;  	} else  		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, value);  } diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c index 920fc6d4a127..8859133ce37e 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c @@ -123,6 +123,10 @@ static const struct soc15_reg_golden golden_settings_sdma_nv14[] = {  static const struct soc15_reg_golden golden_settings_sdma_nv12[] = {  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_RLC3_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_GB_ADDR_CONFIG, 0x001877ff, 0x00000044), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_GB_ADDR_CONFIG_READ, 0x001877ff, 0x00000044), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_GB_ADDR_CONFIG, 0x001877ff, 0x00000044), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_GB_ADDR_CONFIG_READ, 0x001877ff, 0x00000044),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_RLC3_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000),  }; diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c index b1ad9e52b234..240596b25fe4 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c @@ -497,11 +497,6 @@ static void sdma_v5_2_gfx_stop(struct amdgpu_device *adev)  		ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 0);  		WREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL), ib_cntl);  	} - -	sdma0->sched.ready = false; -	sdma1->sched.ready = false; -	sdma2->sched.ready = false; -	sdma3->sched.ready = false;  }  /** diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index 8e1b9a40839f..e65c286f93a6 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c @@ -302,6 +302,7 @@ static int soc15_query_video_codecs(struct amdgpu_device *adev, bool encode,  			*codecs = &rv_video_codecs_decode;  		return 0;  	case CHIP_ARCTURUS: +	case CHIP_ALDEBARAN:  	case CHIP_RENOIR:  		if (encode)  			*codecs = &vega_video_codecs_encode; @@ -1392,7 +1393,6 @@ static int soc15_common_early_init(void *handle)  			adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |  				AMD_CG_SUPPORT_GFX_MGLS |  				AMD_CG_SUPPORT_GFX_CP_LS | -				AMD_CG_SUPPORT_GFX_3D_CGCG |  				AMD_CG_SUPPORT_GFX_3D_CGLS |  				AMD_CG_SUPPORT_GFX_CGCG |  				AMD_CG_SUPPORT_GFX_CGLS | @@ -1412,7 +1412,6 @@ static int soc15_common_early_init(void *handle)  				AMD_CG_SUPPORT_GFX_MGLS |  				AMD_CG_SUPPORT_GFX_RLC_LS |  				AMD_CG_SUPPORT_GFX_CP_LS | -				AMD_CG_SUPPORT_GFX_3D_CGCG |  				AMD_CG_SUPPORT_GFX_3D_CGLS |  				AMD_CG_SUPPORT_GFX_CGCG |  				AMD_CG_SUPPORT_GFX_CGLS | diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c index 2bab9c77952f..cf3803f8f075 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c @@ -357,6 +357,7 @@ static int uvd_v6_0_enc_ring_test_ib(struct amdgpu_ring *ring, long timeout)  error:  	dma_fence_put(fence); +	amdgpu_bo_unpin(bo);  	amdgpu_bo_unreserve(bo);  	amdgpu_bo_unref(&bo);  	return r; diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c index 0c1beefa3e49..27b1ced145d2 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c @@ -231,9 +231,13 @@ static int vcn_v1_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	cancel_delayed_work_sync(&adev->vcn.idle_work); +  	if ((adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) || -		RREG32_SOC15(VCN, 0, mmUVD_STATUS)) +		(adev->vcn.cur_state != AMD_PG_STATE_GATE && +		 RREG32_SOC15(VCN, 0, mmUVD_STATUS))) {  		vcn_v1_0_set_powergating_state(adev, AMD_PG_STATE_GATE); +	}  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c index 116b9643d5ba..8af567c546db 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c @@ -262,6 +262,8 @@ static int vcn_v2_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	cancel_delayed_work_sync(&adev->vcn.idle_work); +  	if ((adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) ||  	    (adev->vcn.cur_state != AMD_PG_STATE_GATE &&  	      RREG32_SOC15(VCN, 0, mmUVD_STATUS))) diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c index 948813d7caa0..888b17d84691 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c @@ -321,6 +321,8 @@ static int vcn_v2_5_hw_fini(void *handle)  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;  	int i; +	cancel_delayed_work_sync(&adev->vcn.idle_work); +  	for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {  		if (adev->vcn.harvest_config & (1 << i))  			continue; diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c index cf165ab5dd26..3b23de996db2 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c @@ -372,15 +372,14 @@ done:  static int vcn_v3_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	struct amdgpu_ring *ring; -	int i, j; +	int i; + +	cancel_delayed_work_sync(&adev->vcn.idle_work);  	for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {  		if (adev->vcn.harvest_config & (1 << i))  			continue; -		ring = &adev->vcn.inst[i].ring_dec; -  		if (!amdgpu_sriov_vf(adev)) {  			if ((adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) ||  					(adev->vcn.cur_state != AMD_PG_STATE_GATE && @@ -388,12 +387,6 @@ static int vcn_v3_0_hw_fini(void *handle)  				vcn_v3_0_set_powergating_state(adev, AMD_PG_STATE_GATE);  			}  		} -		ring->sched.ready = false; - -		for (j = 0; j < adev->vcn.num_enc_rings; ++j) { -			ring = &adev->vcn.inst[i].ring_enc[j]; -			ring->sched.ready = false; -		}  	}  	return 0; | 
