mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 10:01:39 -05:00
Merge tag 'amd-drm-fixes-6.19-2025-12-17' of https://gitlab.freedesktop.org/agd5f/linux into drm-fixes
amd-drm-fixes-6.19-2025-12-17: amdgpu: - Fix no_console_suspend handling - DCN 3.5.x seamless boot fixes - DP audio fix - Fix race in GPU recovery - SMU 14 OD fix amdkfd: - Event fix Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexander.deucher@amd.com> Link: https://patch.msgid.link/20251217171821.2033671-1-alexander.deucher@amd.com
This commit is contained in:
@@ -6613,6 +6613,8 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
|
||||
struct amdgpu_hive_info *hive = NULL;
|
||||
int r = 0;
|
||||
bool need_emergency_restart = false;
|
||||
/* save the pasid here as the job may be freed before the end of the reset */
|
||||
int pasid = job ? job->pasid : -EINVAL;
|
||||
|
||||
/*
|
||||
* If it reaches here because of hang/timeout and a RAS error is
|
||||
@@ -6713,8 +6715,12 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
|
||||
if (!r) {
|
||||
struct amdgpu_task_info *ti = NULL;
|
||||
|
||||
if (job)
|
||||
ti = amdgpu_vm_get_task_info_pasid(adev, job->pasid);
|
||||
/*
|
||||
* The job may already be freed at this point via the sched tdr workqueue so
|
||||
* use the cached pasid.
|
||||
*/
|
||||
if (pasid >= 0)
|
||||
ti = amdgpu_vm_get_task_info_pasid(adev, pasid);
|
||||
|
||||
drm_dev_wedged_event(adev_to_drm(adev), DRM_WEDGE_RECOVERY_NONE,
|
||||
ti ? &ti->task : NULL);
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <drm/drm_vblank.h>
|
||||
|
||||
#include <linux/cc_platform.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/dynamic_debug.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mmu_notifier.h>
|
||||
@@ -2704,7 +2705,9 @@ static int amdgpu_pmops_thaw(struct device *dev)
|
||||
struct drm_device *drm_dev = dev_get_drvdata(dev);
|
||||
|
||||
/* do not resume device if it's normal hibernation */
|
||||
if (!pm_hibernate_is_recovering() && !pm_hibernation_mode_is_suspend())
|
||||
if (console_suspend_enabled &&
|
||||
!pm_hibernate_is_recovering() &&
|
||||
!pm_hibernation_mode_is_suspend())
|
||||
return 0;
|
||||
|
||||
return amdgpu_device_resume(drm_dev, true);
|
||||
|
||||
@@ -312,7 +312,7 @@ void kfd_smi_event_queue_restore(struct kfd_node *node, pid_t pid)
|
||||
{
|
||||
kfd_smi_event_add(pid, node, KFD_SMI_EVENT_QUEUE_RESTORE,
|
||||
KFD_EVENT_FMT_QUEUE_RESTORE(ktime_get_boottime_ns(), pid,
|
||||
node->id, 0));
|
||||
node->id, '0'));
|
||||
}
|
||||
|
||||
void kfd_smi_event_queue_restore_rescheduled(struct mm_struct *mm)
|
||||
|
||||
@@ -1118,13 +1118,13 @@ void dce110_enable_audio_stream(struct pipe_ctx *pipe_ctx)
|
||||
if (dc->current_state->res_ctx.pipe_ctx[i].stream_res.audio != NULL)
|
||||
num_audio++;
|
||||
}
|
||||
if (num_audio >= 1 && clk_mgr->funcs->enable_pme_wa) {
|
||||
/*wake AZ from D3 first before access az endpoint*/
|
||||
clk_mgr->funcs->enable_pme_wa(clk_mgr);
|
||||
}
|
||||
|
||||
pipe_ctx->stream_res.audio->funcs->az_enable(pipe_ctx->stream_res.audio);
|
||||
|
||||
if (num_audio >= 1 && clk_mgr->funcs->enable_pme_wa)
|
||||
/*this is the first audio. apply the PME w/a in order to wake AZ from D3*/
|
||||
clk_mgr->funcs->enable_pme_wa(clk_mgr);
|
||||
|
||||
link_hwss->enable_audio_packet(pipe_ctx);
|
||||
|
||||
if (pipe_ctx->stream_res.audio)
|
||||
|
||||
@@ -203,12 +203,12 @@ enum dcn35_clk_src_array_id {
|
||||
NBIO_BASE_INNER(seg)
|
||||
|
||||
#define NBIO_SR(reg_name)\
|
||||
REG_STRUCT.reg_name = NBIO_BASE(regBIF_BX2_ ## reg_name ## _BASE_IDX) + \
|
||||
regBIF_BX2_ ## reg_name
|
||||
REG_STRUCT.reg_name = NBIO_BASE(regBIF_BX1_ ## reg_name ## _BASE_IDX) + \
|
||||
regBIF_BX1_ ## reg_name
|
||||
|
||||
#define NBIO_SR_ARR(reg_name, id)\
|
||||
REG_STRUCT[id].reg_name = NBIO_BASE(regBIF_BX2_ ## reg_name ## _BASE_IDX) + \
|
||||
regBIF_BX2_ ## reg_name
|
||||
REG_STRUCT[id].reg_name = NBIO_BASE(regBIF_BX1_ ## reg_name ## _BASE_IDX) + \
|
||||
regBIF_BX1_ ## reg_name
|
||||
|
||||
#define bios_regs_init() \
|
||||
( \
|
||||
|
||||
@@ -183,12 +183,12 @@ enum dcn351_clk_src_array_id {
|
||||
NBIO_BASE_INNER(seg)
|
||||
|
||||
#define NBIO_SR(reg_name)\
|
||||
REG_STRUCT.reg_name = NBIO_BASE(regBIF_BX2_ ## reg_name ## _BASE_IDX) + \
|
||||
regBIF_BX2_ ## reg_name
|
||||
REG_STRUCT.reg_name = NBIO_BASE(regBIF_BX1_ ## reg_name ## _BASE_IDX) + \
|
||||
regBIF_BX1_ ## reg_name
|
||||
|
||||
#define NBIO_SR_ARR(reg_name, id)\
|
||||
REG_STRUCT[id].reg_name = NBIO_BASE(regBIF_BX2_ ## reg_name ## _BASE_IDX) + \
|
||||
regBIF_BX2_ ## reg_name
|
||||
REG_STRUCT[id].reg_name = NBIO_BASE(regBIF_BX1_ ## reg_name ## _BASE_IDX) + \
|
||||
regBIF_BX1_ ## reg_name
|
||||
|
||||
#define bios_regs_init() \
|
||||
( \
|
||||
|
||||
@@ -1939,6 +1939,11 @@ int smu_v14_0_od_edit_dpm_table(struct smu_context *smu,
|
||||
dev_err(smu->adev->dev, "Set soft max sclk failed!");
|
||||
return ret;
|
||||
}
|
||||
if (smu->gfx_actual_hard_min_freq != smu->gfx_default_hard_min_freq ||
|
||||
smu->gfx_actual_soft_max_freq != smu->gfx_default_soft_max_freq)
|
||||
smu->user_dpm_profile.user_od = true;
|
||||
else
|
||||
smu->user_dpm_profile.user_od = false;
|
||||
break;
|
||||
default:
|
||||
return -ENOSYS;
|
||||
|
||||
@@ -1514,9 +1514,10 @@ static int smu_v14_0_1_set_fine_grain_gfx_freq_parameters(struct smu_context *sm
|
||||
|
||||
smu->gfx_default_hard_min_freq = clk_table->MinGfxClk;
|
||||
smu->gfx_default_soft_max_freq = clk_table->MaxGfxClk;
|
||||
smu->gfx_actual_hard_min_freq = 0;
|
||||
smu->gfx_actual_soft_max_freq = 0;
|
||||
|
||||
if (smu->gfx_actual_hard_min_freq == 0)
|
||||
smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq;
|
||||
if (smu->gfx_actual_soft_max_freq == 0)
|
||||
smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1526,8 +1527,10 @@ static int smu_v14_0_0_set_fine_grain_gfx_freq_parameters(struct smu_context *sm
|
||||
|
||||
smu->gfx_default_hard_min_freq = clk_table->MinGfxClk;
|
||||
smu->gfx_default_soft_max_freq = clk_table->MaxGfxClk;
|
||||
smu->gfx_actual_hard_min_freq = 0;
|
||||
smu->gfx_actual_soft_max_freq = 0;
|
||||
if (smu->gfx_actual_hard_min_freq == 0)
|
||||
smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq;
|
||||
if (smu->gfx_actual_soft_max_freq == 0)
|
||||
smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1665,6 +1668,29 @@ static int smu_v14_0_common_set_mall_enable(struct smu_context *smu)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int smu_v14_0_0_restore_user_od_settings(struct smu_context *smu)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetHardMinGfxClk,
|
||||
smu->gfx_actual_hard_min_freq,
|
||||
NULL);
|
||||
if (ret) {
|
||||
dev_err(smu->adev->dev, "Failed to restore hard min sclk!\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetSoftMaxGfxClk,
|
||||
smu->gfx_actual_soft_max_freq,
|
||||
NULL);
|
||||
if (ret) {
|
||||
dev_err(smu->adev->dev, "Failed to restore soft max sclk!\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct pptable_funcs smu_v14_0_0_ppt_funcs = {
|
||||
.check_fw_status = smu_v14_0_check_fw_status,
|
||||
.check_fw_version = smu_v14_0_check_fw_version,
|
||||
@@ -1688,6 +1714,7 @@ static const struct pptable_funcs smu_v14_0_0_ppt_funcs = {
|
||||
.mode2_reset = smu_v14_0_0_mode2_reset,
|
||||
.get_dpm_ultimate_freq = smu_v14_0_common_get_dpm_ultimate_freq,
|
||||
.set_soft_freq_limited_range = smu_v14_0_0_set_soft_freq_limited_range,
|
||||
.restore_user_od_settings = smu_v14_0_0_restore_user_od_settings,
|
||||
.od_edit_dpm_table = smu_v14_0_od_edit_dpm_table,
|
||||
.print_clk_levels = smu_v14_0_0_print_clk_levels,
|
||||
.force_clk_levels = smu_v14_0_0_force_clk_levels,
|
||||
|
||||
Reference in New Issue
Block a user