diff options
Diffstat (limited to 'drivers/gpu/drm/amd')
34 files changed, 192 insertions, 113 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; diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 389eff96fcf6..652cc1a0e450 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -925,7 +925,8 @@ static int dm_dmub_hw_init(struct amdgpu_device *adev)  		abm->dmcu_is_running = dmcu->funcs->is_dmcu_initialized(dmcu);  	} -	adev->dm.dc->ctx->dmub_srv = dc_dmub_srv_create(adev->dm.dc, dmub_srv); +	if (!adev->dm.dc->ctx->dmub_srv) +		adev->dm.dc->ctx->dmub_srv = dc_dmub_srv_create(adev->dm.dc, dmub_srv);  	if (!adev->dm.dc->ctx->dmub_srv) {  		DRM_ERROR("Couldn't allocate DC DMUB server!\n");  		return -ENOMEM; @@ -1954,7 +1955,6 @@ static int dm_suspend(void *handle)  	amdgpu_dm_irq_suspend(adev); -  	dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D3);  	return 0; @@ -5500,7 +5500,8 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,  	struct drm_display_mode saved_mode;  	struct drm_display_mode *freesync_mode = NULL;  	bool native_mode_found = false; -	bool recalculate_timing = dm_state ? (dm_state->scaling != RMX_OFF) : false; +	bool recalculate_timing = false; +	bool scale = dm_state ? (dm_state->scaling != RMX_OFF) : false;  	int mode_refresh;  	int preferred_refresh = 0;  #if defined(CONFIG_DRM_AMD_DC_DCN) @@ -5563,7 +5564,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,  		 */  		DRM_DEBUG_DRIVER("No preferred mode found\n");  	} else { -		recalculate_timing |= amdgpu_freesync_vid_mode && +		recalculate_timing = amdgpu_freesync_vid_mode &&  				 is_freesync_video_mode(&mode, aconnector);  		if (recalculate_timing) {  			freesync_mode = get_highest_refresh_rate_mode(aconnector, false); @@ -5571,11 +5572,10 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,  			mode = *freesync_mode;  		} else {  			decide_crtc_timing_for_drm_display_mode( -				&mode, preferred_mode, -				dm_state ? (dm_state->scaling != RMX_OFF) : false); -		} +				&mode, preferred_mode, scale); -		preferred_refresh = drm_mode_vrefresh(preferred_mode); +			preferred_refresh = drm_mode_vrefresh(preferred_mode); +		}  	}  	if (recalculate_timing) @@ -5587,7 +5587,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,  	* If scaling is enabled and refresh rate didn't change  	* we copy the vic and polarities of the old timings  	*/ -	if (!recalculate_timing || mode_refresh != preferred_refresh) +	if (!scale || mode_refresh != preferred_refresh)  		fill_stream_properties_from_drm_display_mode(  			stream, &mode, &aconnector->base, con_state, NULL,  			requested_bpc); @@ -9854,7 +9854,7 @@ static int dm_check_crtc_cursor(struct drm_atomic_state *state,  	if (cursor_scale_w != primary_scale_w ||  	    cursor_scale_h != primary_scale_h) { -		DRM_DEBUG_ATOMIC("Cursor plane scaling doesn't match primary plane\n"); +		drm_dbg_atomic(crtc->dev, "Cursor plane scaling doesn't match primary plane\n");  		return -EINVAL;  	} @@ -9891,7 +9891,7 @@ static int validate_overlay(struct drm_atomic_state *state)  	int i;  	struct drm_plane *plane;  	struct drm_plane_state *old_plane_state, *new_plane_state; -	struct drm_plane_state *primary_state, *overlay_state = NULL; +	struct drm_plane_state *primary_state, *cursor_state, *overlay_state = NULL;  	/* Check if primary plane is contained inside overlay */  	for_each_oldnew_plane_in_state_reverse(state, plane, old_plane_state, new_plane_state, i) { @@ -9921,6 +9921,14 @@ static int validate_overlay(struct drm_atomic_state *state)  	if (!primary_state->crtc)  		return 0; +	/* check if cursor plane is enabled */ +	cursor_state = drm_atomic_get_plane_state(state, overlay_state->crtc->cursor); +	if (IS_ERR(cursor_state)) +		return PTR_ERR(cursor_state); + +	if (drm_atomic_plane_disabling(plane->state, cursor_state)) +		return 0; +  	/* Perform the bounds check to ensure the overlay plane covers the primary */  	if (primary_state->crtc_x < overlay_state->crtc_x ||  	    primary_state->crtc_y < overlay_state->crtc_y || diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c index f4374d83662a..c1f5474c205a 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c @@ -1076,6 +1076,24 @@ static bool dc_link_detect_helper(struct dc_link *link,  			    dc_is_dvi_signal(link->connector_signal)) {  				if (prev_sink)  					dc_sink_release(prev_sink); +				link_disconnect_sink(link); + +				return false; +			} +			/* +			 * Abort detection for DP connectors if we have +			 * no EDID and connector is active converter +			 * as there are no display downstream +			 * +			 */ +			if (dc_is_dp_sst_signal(link->connector_signal) && +				(link->dpcd_caps.dongle_type == +						DISPLAY_DONGLE_DP_VGA_CONVERTER || +				link->dpcd_caps.dongle_type == +						DISPLAY_DONGLE_DP_DVI_CONVERTER)) { +				if (prev_sink) +					dc_sink_release(prev_sink); +				link_disconnect_sink(link);  				return false;  			} diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c index 527e56c353cb..8357aa3c41d5 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c @@ -3236,7 +3236,7 @@ static noinline bool dcn20_validate_bandwidth_fp(struct dc *dc,  	voltage_supported = dcn20_validate_bandwidth_internal(dc, context, false);  	dummy_pstate_supported = context->bw_ctx.bw.dcn.clk.p_state_change_support; -	if (voltage_supported && dummy_pstate_supported) { +	if (voltage_supported && (dummy_pstate_supported || !(context->stream_count))) {  		context->bw_ctx.bw.dcn.clk.p_state_change_support = false;  		goto restore_dml_state;  	} diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c index 4a5fa23d8e7b..5fcc2e64305d 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c @@ -826,10 +826,11 @@ static const struct dc_plane_cap plane_cap = {  			.fp16 = 16000  	}, +	/* 6:1 downscaling ratio: 1000/6 = 166.666 */  	.max_downscale_factor = { -			.argb8888 = 600, -			.nv12 = 600, -			.fp16 = 600 +			.argb8888 = 167, +			.nv12 = 167, +			.fp16 = 167  	}  }; diff --git a/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c b/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c index 5b54b7fc5105..472696f949ac 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c @@ -843,10 +843,11 @@ static const struct dc_plane_cap plane_cap = {  			.fp16 = 16000  	}, +	/* 6:1 downscaling ratio: 1000/6 = 166.666 */  	.max_downscale_factor = { -			.argb8888 = 600, -			.nv12 = 600, -			.fp16 = 600 +			.argb8888 = 167, +			.nv12 = 167, +			.fp16 = 167   	},  	64,  	64 diff --git a/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c b/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c index fc2dea243d1b..a33f0365329b 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c @@ -284,10 +284,11 @@ static const struct dc_plane_cap plane_cap = {  				.nv12 = 16000,  				.fp16 = 16000  		}, +		/* 6:1 downscaling ratio: 1000/6 = 166.666 */  		.max_downscale_factor = { -				.argb8888 = 600, -				.nv12 = 600, -				.fp16 = 600 +				.argb8888 = 167, +				.nv12 = 167, +				.fp16 = 167  		},  		16,  		16 diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c index f5fe540cd536..27cf22716793 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c @@ -810,6 +810,7 @@ static int smu10_dpm_force_dpm_level(struct pp_hwmgr *hwmgr,  		break;  	case AMD_DPM_FORCED_LEVEL_MANUAL:  		data->fine_grain_enabled = 1; +		break;  	case AMD_DPM_FORCED_LEVEL_PROFILE_EXIT:  	default:  		break; diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c index ac13042672ea..0eaf86b5e698 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c @@ -2925,6 +2925,8 @@ static ssize_t navi1x_get_gpu_metrics(struct smu_context *smu,  static int navi10_enable_mgpu_fan_boost(struct smu_context *smu)  { +	struct smu_table_context *table_context = &smu->smu_table; +	PPTable_t *smc_pptable = table_context->driver_pptable;  	struct amdgpu_device *adev = smu->adev;  	uint32_t param = 0; @@ -2932,6 +2934,13 @@ static int navi10_enable_mgpu_fan_boost(struct smu_context *smu)  	if (adev->asic_type == CHIP_NAVI12)  		return 0; +	/* +	 * Skip the MGpuFanBoost setting for those ASICs +	 * which do not support it +	 */ +	if (!smc_pptable->MGpuFanBoostLimitRpm) +		return 0; +  	/* Workaround for WS SKU */  	if (adev->pdev->device == 0x7312 &&  	    adev->pdev->revision == 0) diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c index d2fd44b903ca..b124a5e40dd6 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c @@ -3027,6 +3027,16 @@ static ssize_t sienna_cichlid_get_gpu_metrics(struct smu_context *smu,  static int sienna_cichlid_enable_mgpu_fan_boost(struct smu_context *smu)  { +	struct smu_table_context *table_context = &smu->smu_table; +	PPTable_t *smc_pptable = table_context->driver_pptable; + +	/* +	 * Skip the MGpuFanBoost setting for those ASICs +	 * which do not support it +	 */ +	if (!smc_pptable->MGpuFanBoostLimitRpm) +		return 0; +  	return smu_cmn_send_smc_msg_with_param(smu,  					       SMU_MSG_SetMGpuFanBoostLimitRpm,  					       0, | 
