[PATCH] drm/amdgpu/si: implement get/set pcie_lanes asic callback

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Am 30.03.2018 um 20:37 schrieb Alex Deucher:
> Required for dpm setup on some asics. Fixes a NULL dereference
> on asics that require it.
>
> Bug: https://bugs.freedesktop.org/show_bug.cgi?id=102553
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> Cc: stable at vger.kernel.org

Acked-by: Christian König <christian.koenig at amd.com>

> ---
>   drivers/gpu/drm/amd/amdgpu/si.c | 67 +++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 67 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/si.c b/drivers/gpu/drm/amd/amdgpu/si.c
> index 775cacfe9917..c364ef94cc36 100644
> --- a/drivers/gpu/drm/amd/amdgpu/si.c
> +++ b/drivers/gpu/drm/amd/amdgpu/si.c
> @@ -1258,6 +1258,71 @@ static bool si_need_full_reset(struct amdgpu_device *adev)
>   	return true;
>   }
>   
> +static int si_get_pcie_lanes(struct amdgpu_device *adev)
> +{
> +	u32 link_width_cntl;
> +
> +	if (adev->flags & AMD_IS_APU)
> +		return 0;
> +
> +	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
> +
> +	switch ((link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT) {
> +	case LC_LINK_WIDTH_X1:
> +		return 1;
> +	case LC_LINK_WIDTH_X2:
> +		return 2;
> +	case LC_LINK_WIDTH_X4:
> +		return 4;
> +	case LC_LINK_WIDTH_X8:
> +		return 8;
> +	case LC_LINK_WIDTH_X0:
> +	case LC_LINK_WIDTH_X16:
> +	default:
> +		return 16;
> +	}
> +}
> +
> +static void si_set_pcie_lanes(struct amdgpu_device *adev, int lanes)
> +{
> +	u32 link_width_cntl, mask;
> +
> +	if (adev->flags & AMD_IS_APU)
> +		return;
> +
> +	switch (lanes) {
> +	case 0:
> +		mask = LC_LINK_WIDTH_X0;
> +		break;
> +	case 1:
> +		mask = LC_LINK_WIDTH_X1;
> +		break;
> +	case 2:
> +		mask = LC_LINK_WIDTH_X2;
> +		break;
> +	case 4:
> +		mask = LC_LINK_WIDTH_X4;
> +		break;
> +	case 8:
> +		mask = LC_LINK_WIDTH_X8;
> +		break;
> +	case 16:
> +		mask = LC_LINK_WIDTH_X16;
> +		break;
> +	default:
> +		DRM_ERROR("invalid pcie lane request: %d\n", lanes);
> +		return;
> +	}
> +
> +	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
> +	link_width_cntl &= ~LC_LINK_WIDTH_MASK;
> +	link_width_cntl |= mask << LC_LINK_WIDTH_SHIFT;
> +	link_width_cntl |= (LC_RECONFIG_NOW |
> +			    LC_RECONFIG_ARC_MISSING_ESCAPE);
> +
> +	WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
> +}
> +
>   static const struct amdgpu_asic_funcs si_asic_funcs =
>   {
>   	.read_disabled_bios = &si_read_disabled_bios,
> @@ -1268,6 +1333,8 @@ static const struct amdgpu_asic_funcs si_asic_funcs =
>   	.get_xclk = &si_get_xclk,
>   	.set_uvd_clocks = &si_set_uvd_clocks,
>   	.set_vce_clocks = NULL,
> +	.get_pcie_lanes = &si_get_pcie_lanes,
> +	.set_pcie_lanes = &si_set_pcie_lanes,
>   	.get_config_memsize = &si_get_config_memsize,
>   	.flush_hdp = &si_flush_hdp,
>   	.invalidate_hdp = &si_invalidate_hdp,



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux