mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-17 16:14:25 +08:00
Merge tag 'amd-drm-fixes-5.6-2020-02-19' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
amd-drm-fixes-5.6-2020-02-19: amdgpu: - HDCP fixes - xclk fix for raven - GFXOFF fixes Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexdeucher@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200219173954.3847-1-alexander.deucher@amd.com
This commit is contained in:
commit
99edb18b86
@ -1013,6 +1013,30 @@ static int psp_dtm_initialize(struct psp_context *psp)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int psp_dtm_unload(struct psp_context *psp)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
struct psp_gfx_cmd_resp *cmd;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: bypass the unloading in sriov for now
|
||||||
|
*/
|
||||||
|
if (amdgpu_sriov_vf(psp->adev))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
|
||||||
|
if (!cmd)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
psp_prep_ta_unload_cmd_buf(cmd, psp->dtm_context.session_id);
|
||||||
|
|
||||||
|
ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
|
||||||
|
|
||||||
|
kfree(cmd);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int psp_dtm_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
|
int psp_dtm_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -1037,7 +1061,7 @@ static int psp_dtm_terminate(struct psp_context *psp)
|
|||||||
if (!psp->dtm_context.dtm_initialized)
|
if (!psp->dtm_context.dtm_initialized)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ret = psp_hdcp_unload(psp);
|
ret = psp_dtm_unload(psp);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -3923,11 +3923,13 @@ static uint64_t gfx_v10_0_get_gpu_clock_counter(struct amdgpu_device *adev)
|
|||||||
{
|
{
|
||||||
uint64_t clock;
|
uint64_t clock;
|
||||||
|
|
||||||
|
amdgpu_gfx_off_ctrl(adev, false);
|
||||||
mutex_lock(&adev->gfx.gpu_clock_mutex);
|
mutex_lock(&adev->gfx.gpu_clock_mutex);
|
||||||
WREG32_SOC15(GC, 0, mmRLC_CAPTURE_GPU_CLOCK_COUNT, 1);
|
WREG32_SOC15(GC, 0, mmRLC_CAPTURE_GPU_CLOCK_COUNT, 1);
|
||||||
clock = (uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_LSB) |
|
clock = (uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_LSB) |
|
||||||
((uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
|
((uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
|
||||||
mutex_unlock(&adev->gfx.gpu_clock_mutex);
|
mutex_unlock(&adev->gfx.gpu_clock_mutex);
|
||||||
|
amdgpu_gfx_off_ctrl(adev, true);
|
||||||
return clock;
|
return clock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1193,6 +1193,14 @@ static bool gfx_v9_0_should_disable_gfxoff(struct pci_dev *pdev)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool is_raven_kicker(struct amdgpu_device *adev)
|
||||||
|
{
|
||||||
|
if (adev->pm.fw_version >= 0x41e2b)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static void gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device *adev)
|
static void gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
if (gfx_v9_0_should_disable_gfxoff(adev->pdev))
|
if (gfx_v9_0_should_disable_gfxoff(adev->pdev))
|
||||||
@ -1205,9 +1213,8 @@ static void gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device *adev)
|
|||||||
break;
|
break;
|
||||||
case CHIP_RAVEN:
|
case CHIP_RAVEN:
|
||||||
if (!(adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) &&
|
if (!(adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) &&
|
||||||
((adev->gfx.rlc_fw_version != 106 &&
|
((!is_raven_kicker(adev) &&
|
||||||
adev->gfx.rlc_fw_version < 531) ||
|
adev->gfx.rlc_fw_version < 531) ||
|
||||||
(adev->gfx.rlc_fw_version == 53815) ||
|
|
||||||
(adev->gfx.rlc_feature_version < 1) ||
|
(adev->gfx.rlc_feature_version < 1) ||
|
||||||
!adev->gfx.rlc.is_rlc_v2_1))
|
!adev->gfx.rlc.is_rlc_v2_1))
|
||||||
adev->pm.pp_feature &= ~PP_GFXOFF_MASK;
|
adev->pm.pp_feature &= ~PP_GFXOFF_MASK;
|
||||||
@ -3959,6 +3966,7 @@ static uint64_t gfx_v9_0_get_gpu_clock_counter(struct amdgpu_device *adev)
|
|||||||
{
|
{
|
||||||
uint64_t clock;
|
uint64_t clock;
|
||||||
|
|
||||||
|
amdgpu_gfx_off_ctrl(adev, false);
|
||||||
mutex_lock(&adev->gfx.gpu_clock_mutex);
|
mutex_lock(&adev->gfx.gpu_clock_mutex);
|
||||||
if (adev->asic_type == CHIP_VEGA10 && amdgpu_sriov_runtime(adev)) {
|
if (adev->asic_type == CHIP_VEGA10 && amdgpu_sriov_runtime(adev)) {
|
||||||
uint32_t tmp, lsb, msb, i = 0;
|
uint32_t tmp, lsb, msb, i = 0;
|
||||||
@ -3977,6 +3985,7 @@ static uint64_t gfx_v9_0_get_gpu_clock_counter(struct amdgpu_device *adev)
|
|||||||
((uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
|
((uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
|
||||||
}
|
}
|
||||||
mutex_unlock(&adev->gfx.gpu_clock_mutex);
|
mutex_unlock(&adev->gfx.gpu_clock_mutex);
|
||||||
|
amdgpu_gfx_off_ctrl(adev, true);
|
||||||
return clock;
|
return clock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,7 +272,12 @@ static u32 soc15_get_config_memsize(struct amdgpu_device *adev)
|
|||||||
|
|
||||||
static u32 soc15_get_xclk(struct amdgpu_device *adev)
|
static u32 soc15_get_xclk(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
return adev->clock.spll.reference_freq;
|
u32 reference_clock = adev->clock.spll.reference_freq;
|
||||||
|
|
||||||
|
if (adev->asic_type == CHIP_RAVEN)
|
||||||
|
return reference_clock / 4;
|
||||||
|
|
||||||
|
return reference_clock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1911,7 +1911,7 @@ static void handle_hpd_irq(void *param)
|
|||||||
mutex_lock(&aconnector->hpd_lock);
|
mutex_lock(&aconnector->hpd_lock);
|
||||||
|
|
||||||
#ifdef CONFIG_DRM_AMD_DC_HDCP
|
#ifdef CONFIG_DRM_AMD_DC_HDCP
|
||||||
if (adev->asic_type >= CHIP_RAVEN)
|
if (adev->dm.hdcp_workqueue)
|
||||||
hdcp_reset_display(adev->dm.hdcp_workqueue, aconnector->dc_link->link_index);
|
hdcp_reset_display(adev->dm.hdcp_workqueue, aconnector->dc_link->link_index);
|
||||||
#endif
|
#endif
|
||||||
if (aconnector->fake_enable)
|
if (aconnector->fake_enable)
|
||||||
@ -2088,8 +2088,10 @@ static void handle_hpd_rx_irq(void *param)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_DRM_AMD_DC_HDCP
|
#ifdef CONFIG_DRM_AMD_DC_HDCP
|
||||||
if (hpd_irq_data.bytes.device_service_irq.bits.CP_IRQ)
|
if (hpd_irq_data.bytes.device_service_irq.bits.CP_IRQ) {
|
||||||
|
if (adev->dm.hdcp_workqueue)
|
||||||
hdcp_handle_cpirq(adev->dm.hdcp_workqueue, aconnector->base.index);
|
hdcp_handle_cpirq(adev->dm.hdcp_workqueue, aconnector->base.index);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if ((dc_link->cur_link_settings.lane_count != LANE_COUNT_UNKNOWN) ||
|
if ((dc_link->cur_link_settings.lane_count != LANE_COUNT_UNKNOWN) ||
|
||||||
(dc_link->type == dc_connection_mst_branch))
|
(dc_link->type == dc_connection_mst_branch))
|
||||||
@ -5702,7 +5704,7 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
|
|||||||
drm_connector_attach_vrr_capable_property(
|
drm_connector_attach_vrr_capable_property(
|
||||||
&aconnector->base);
|
&aconnector->base);
|
||||||
#ifdef CONFIG_DRM_AMD_DC_HDCP
|
#ifdef CONFIG_DRM_AMD_DC_HDCP
|
||||||
if (adev->asic_type >= CHIP_RAVEN)
|
if (adev->dm.hdcp_workqueue)
|
||||||
drm_connector_attach_content_protection_property(&aconnector->base, true);
|
drm_connector_attach_content_protection_property(&aconnector->base, true);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -46,8 +46,8 @@ static inline enum mod_hdcp_status check_hdcp2_capable(struct mod_hdcp *hdcp)
|
|||||||
enum mod_hdcp_status status;
|
enum mod_hdcp_status status;
|
||||||
|
|
||||||
if (is_dp_hdcp(hdcp))
|
if (is_dp_hdcp(hdcp))
|
||||||
status = (hdcp->auth.msg.hdcp2.rxcaps_dp[2] & HDCP_2_2_RX_CAPS_VERSION_VAL) &&
|
status = (hdcp->auth.msg.hdcp2.rxcaps_dp[0] == HDCP_2_2_RX_CAPS_VERSION_VAL) &&
|
||||||
HDCP_2_2_DP_HDCP_CAPABLE(hdcp->auth.msg.hdcp2.rxcaps_dp[0]) ?
|
HDCP_2_2_DP_HDCP_CAPABLE(hdcp->auth.msg.hdcp2.rxcaps_dp[2]) ?
|
||||||
MOD_HDCP_STATUS_SUCCESS :
|
MOD_HDCP_STATUS_SUCCESS :
|
||||||
MOD_HDCP_STATUS_HDCP2_NOT_CAPABLE;
|
MOD_HDCP_STATUS_HDCP2_NOT_CAPABLE;
|
||||||
else
|
else
|
||||||
|
@ -898,6 +898,9 @@ int smu_v11_0_system_features_control(struct smu_context *smu,
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
bitmap_zero(feature->enabled, feature->feature_num);
|
||||||
|
bitmap_zero(feature->supported, feature->feature_num);
|
||||||
|
|
||||||
if (en) {
|
if (en) {
|
||||||
ret = smu_feature_get_enabled_mask(smu, feature_mask, 2);
|
ret = smu_feature_get_enabled_mask(smu, feature_mask, 2);
|
||||||
if (ret)
|
if (ret)
|
||||||
@ -907,9 +910,6 @@ int smu_v11_0_system_features_control(struct smu_context *smu,
|
|||||||
feature->feature_num);
|
feature->feature_num);
|
||||||
bitmap_copy(feature->supported, (unsigned long *)&feature_mask,
|
bitmap_copy(feature->supported, (unsigned long *)&feature_mask,
|
||||||
feature->feature_num);
|
feature->feature_num);
|
||||||
} else {
|
|
||||||
bitmap_zero(feature->enabled, feature->feature_num);
|
|
||||||
bitmap_zero(feature->supported, feature->feature_num);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
Loading…
Reference in New Issue
Block a user