mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-21 23:16:50 +08:00
Merge tag 'amd-drm-fixes-7.0-2026-03-12' of https://gitlab.freedesktop.org/agd5f/linux into drm-fixes
amd-drm-fixes-7.0-2026-03-12: amdgpu: - SMU13 fix - SMU14 fix - Fixes for bringup hw testing - Kerneldoc fix - GC12 idle power fix for compute workloads - DCCG fixes amdkfd: - Fix missing BO unreserve in an error path Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexander.deucher@amd.com> Link: https://patch.msgid.link/20260312180351.3874990-1-alexander.deucher@amd.com
This commit is contained in:
@@ -2690,8 +2690,10 @@ static int amdgpu_device_ip_early_init(struct amdgpu_device *adev)
|
||||
break;
|
||||
default:
|
||||
r = amdgpu_discovery_set_ip_blocks(adev);
|
||||
if (r)
|
||||
if (r) {
|
||||
adev->num_ip_blocks = 0;
|
||||
return r;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -3247,6 +3249,8 @@ int amdgpu_device_set_cg_state(struct amdgpu_device *adev,
|
||||
i = state == AMD_CG_STATE_GATE ? j : adev->num_ip_blocks - j - 1;
|
||||
if (!adev->ip_blocks[i].status.late_initialized)
|
||||
continue;
|
||||
if (!adev->ip_blocks[i].version)
|
||||
continue;
|
||||
/* skip CG for GFX, SDMA on S0ix */
|
||||
if (adev->in_s0ix &&
|
||||
(adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX ||
|
||||
@@ -3286,6 +3290,8 @@ int amdgpu_device_set_pg_state(struct amdgpu_device *adev,
|
||||
i = state == AMD_PG_STATE_GATE ? j : adev->num_ip_blocks - j - 1;
|
||||
if (!adev->ip_blocks[i].status.late_initialized)
|
||||
continue;
|
||||
if (!adev->ip_blocks[i].version)
|
||||
continue;
|
||||
/* skip PG for GFX, SDMA on S0ix */
|
||||
if (adev->in_s0ix &&
|
||||
(adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX ||
|
||||
@@ -3493,6 +3499,8 @@ static int amdgpu_device_ip_fini_early(struct amdgpu_device *adev)
|
||||
int i, r;
|
||||
|
||||
for (i = 0; i < adev->num_ip_blocks; i++) {
|
||||
if (!adev->ip_blocks[i].version)
|
||||
continue;
|
||||
if (!adev->ip_blocks[i].version->funcs->early_fini)
|
||||
continue;
|
||||
|
||||
@@ -3570,6 +3578,8 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev)
|
||||
if (!adev->ip_blocks[i].status.sw)
|
||||
continue;
|
||||
|
||||
if (!adev->ip_blocks[i].version)
|
||||
continue;
|
||||
if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
|
||||
amdgpu_ucode_free_bo(adev);
|
||||
amdgpu_free_static_csa(&adev->virt.csa_obj);
|
||||
@@ -3596,6 +3606,8 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev)
|
||||
for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
|
||||
if (!adev->ip_blocks[i].status.late_initialized)
|
||||
continue;
|
||||
if (!adev->ip_blocks[i].version)
|
||||
continue;
|
||||
if (adev->ip_blocks[i].version->funcs->late_fini)
|
||||
adev->ip_blocks[i].version->funcs->late_fini(&adev->ip_blocks[i]);
|
||||
adev->ip_blocks[i].status.late_initialized = false;
|
||||
|
||||
@@ -83,7 +83,7 @@ void amdgpu_driver_unload_kms(struct drm_device *dev)
|
||||
{
|
||||
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||
|
||||
if (adev == NULL)
|
||||
if (adev == NULL || !adev->num_ip_blocks)
|
||||
return;
|
||||
|
||||
amdgpu_unregister_gpu_instance(adev);
|
||||
|
||||
@@ -368,15 +368,15 @@ struct amdgpu_mode_info {
|
||||
|
||||
struct drm_property *plane_ctm_property;
|
||||
/**
|
||||
* @shaper_lut_property: Plane property to set pre-blending shaper LUT
|
||||
* that converts color content before 3D LUT. If
|
||||
* plane_shaper_tf_property != Identity TF, AMD color module will
|
||||
* @plane_shaper_lut_property: Plane property to set pre-blending
|
||||
* shaper LUT that converts color content before 3D LUT.
|
||||
* If plane_shaper_tf_property != Identity TF, AMD color module will
|
||||
* combine the user LUT values with pre-defined TF into the LUT
|
||||
* parameters to be programmed.
|
||||
*/
|
||||
struct drm_property *plane_shaper_lut_property;
|
||||
/**
|
||||
* @shaper_lut_size_property: Plane property for the size of
|
||||
* @plane_shaper_lut_size_property: Plane property for the size of
|
||||
* pre-blending shaper LUT as supported by the driver (read-only).
|
||||
*/
|
||||
struct drm_property *plane_shaper_lut_size_property;
|
||||
@@ -400,10 +400,10 @@ struct amdgpu_mode_info {
|
||||
*/
|
||||
struct drm_property *plane_lut3d_property;
|
||||
/**
|
||||
* @plane_degamma_lut_size_property: Plane property to define the max
|
||||
* size of 3D LUT as supported by the driver (read-only). The max size
|
||||
* is the max size of one dimension and, therefore, the max number of
|
||||
* entries for 3D LUT array is the 3D LUT size cubed;
|
||||
* @plane_lut3d_size_property: Plane property to define the max size
|
||||
* of 3D LUT as supported by the driver (read-only). The max size is
|
||||
* the max size of one dimension and, therefore, the max number of
|
||||
* entries for 3D LUT array is the 3D LUT size cubed.
|
||||
*/
|
||||
struct drm_property *plane_lut3d_size_property;
|
||||
/**
|
||||
|
||||
@@ -731,6 +731,9 @@ static int mes_v12_0_set_hw_resources(struct amdgpu_mes *mes, int pipe)
|
||||
int i;
|
||||
struct amdgpu_device *adev = mes->adev;
|
||||
union MESAPI_SET_HW_RESOURCES mes_set_hw_res_pkt;
|
||||
uint32_t mes_rev = (pipe == AMDGPU_MES_SCHED_PIPE) ?
|
||||
(mes->sched_version & AMDGPU_MES_VERSION_MASK) :
|
||||
(mes->kiq_version & AMDGPU_MES_VERSION_MASK);
|
||||
|
||||
memset(&mes_set_hw_res_pkt, 0, sizeof(mes_set_hw_res_pkt));
|
||||
|
||||
@@ -785,7 +788,7 @@ static int mes_v12_0_set_hw_resources(struct amdgpu_mes *mes, int pipe)
|
||||
* handling support, other queue will not use the oversubscribe timer.
|
||||
* handling mode - 0: disabled; 1: basic version; 2: basic+ version
|
||||
*/
|
||||
mes_set_hw_res_pkt.oversubscription_timer = 50;
|
||||
mes_set_hw_res_pkt.oversubscription_timer = mes_rev < 0x8b ? 0 : 50;
|
||||
mes_set_hw_res_pkt.unmapped_doorbell_handling = 1;
|
||||
|
||||
if (amdgpu_mes_log_enable) {
|
||||
|
||||
@@ -593,6 +593,7 @@ int pqm_update_queue_properties(struct process_queue_manager *pqm,
|
||||
p->queue_size)) {
|
||||
pr_debug("ring buf 0x%llx size 0x%llx not mapped on GPU\n",
|
||||
p->queue_address, p->queue_size);
|
||||
amdgpu_bo_unreserve(vm->root.bo);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,11 @@
|
||||
DCCG_SRII(PIXEL_RATE_CNTL, OTG, 0),\
|
||||
DCCG_SRII(PIXEL_RATE_CNTL, OTG, 1),\
|
||||
SR(DISPCLK_FREQ_CHANGE_CNTL),\
|
||||
SR(DC_MEM_GLOBAL_PWR_REQ_CNTL)
|
||||
SR(DC_MEM_GLOBAL_PWR_REQ_CNTL),\
|
||||
SR(MICROSECOND_TIME_BASE_DIV),\
|
||||
SR(MILLISECOND_TIME_BASE_DIV),\
|
||||
SR(DCCG_GATE_DISABLE_CNTL),\
|
||||
SR(DCCG_GATE_DISABLE_CNTL2)
|
||||
|
||||
#define DCCG_REG_LIST_DCN2() \
|
||||
DCCG_COMMON_REG_LIST_DCN_BASE(),\
|
||||
|
||||
@@ -96,6 +96,25 @@ static void dccg21_update_dpp_dto(struct dccg *dccg, int dpp_inst, int req_dppcl
|
||||
dccg->pipe_dppclk_khz[dpp_inst] = req_dppclk;
|
||||
}
|
||||
|
||||
/*
|
||||
* On DCN21 S0i3 resume, BIOS programs MICROSECOND_TIME_BASE_DIV to
|
||||
* 0x00120464 as a marker that golden init has already been done.
|
||||
* dcn21_s0i3_golden_init_wa() reads this marker later in bios_golden_init()
|
||||
* to decide whether to skip golden init.
|
||||
*
|
||||
* dccg2_init() unconditionally overwrites MICROSECOND_TIME_BASE_DIV to
|
||||
* 0x00120264, destroying the marker before it can be read.
|
||||
*
|
||||
* Guard the call: if the S0i3 marker is present, skip dccg2_init() so the
|
||||
* WA can function correctly. bios_golden_init() will handle init in that case.
|
||||
*/
|
||||
static void dccg21_init(struct dccg *dccg)
|
||||
{
|
||||
if (dccg2_is_s0i3_golden_init_wa_done(dccg))
|
||||
return;
|
||||
|
||||
dccg2_init(dccg);
|
||||
}
|
||||
|
||||
static const struct dccg_funcs dccg21_funcs = {
|
||||
.update_dpp_dto = dccg21_update_dpp_dto,
|
||||
@@ -103,7 +122,7 @@ static const struct dccg_funcs dccg21_funcs = {
|
||||
.set_fifo_errdet_ovr_en = dccg2_set_fifo_errdet_ovr_en,
|
||||
.otg_add_pixel = dccg2_otg_add_pixel,
|
||||
.otg_drop_pixel = dccg2_otg_drop_pixel,
|
||||
.dccg_init = dccg2_init,
|
||||
.dccg_init = dccg21_init,
|
||||
.refclk_setup = dccg2_refclk_setup, /* Deprecated - for backward compatibility only */
|
||||
.allow_clock_gating = dccg2_allow_clock_gating,
|
||||
.enable_memory_low_power = dccg2_enable_memory_low_power,
|
||||
|
||||
@@ -34,7 +34,13 @@
|
||||
DCCG_SRII(DTO_PARAM, DPPCLK, 1),\
|
||||
DCCG_SRII(DTO_PARAM, DPPCLK, 2),\
|
||||
DCCG_SRII(DTO_PARAM, DPPCLK, 3),\
|
||||
SR(REFCLK_CNTL)
|
||||
SR(REFCLK_CNTL),\
|
||||
SR(DISPCLK_FREQ_CHANGE_CNTL),\
|
||||
SR(DC_MEM_GLOBAL_PWR_REQ_CNTL),\
|
||||
SR(MICROSECOND_TIME_BASE_DIV),\
|
||||
SR(MILLISECOND_TIME_BASE_DIV),\
|
||||
SR(DCCG_GATE_DISABLE_CNTL),\
|
||||
SR(DCCG_GATE_DISABLE_CNTL2)
|
||||
|
||||
#define DCCG_MASK_SH_LIST_DCN301(mask_sh) \
|
||||
DCCG_SFI(DPPCLK_DTO_CTRL, DTO_ENABLE, DPPCLK, 0, mask_sh),\
|
||||
|
||||
@@ -64,9 +64,12 @@
|
||||
SR(DSCCLK1_DTO_PARAM),\
|
||||
SR(DSCCLK2_DTO_PARAM),\
|
||||
SR(DSCCLK_DTO_CTRL),\
|
||||
SR(DCCG_GATE_DISABLE_CNTL),\
|
||||
SR(DCCG_GATE_DISABLE_CNTL2),\
|
||||
SR(DCCG_GATE_DISABLE_CNTL3),\
|
||||
SR(HDMISTREAMCLK0_DTO_PARAM)
|
||||
SR(HDMISTREAMCLK0_DTO_PARAM),\
|
||||
SR(DC_MEM_GLOBAL_PWR_REQ_CNTL),\
|
||||
SR(MICROSECOND_TIME_BASE_DIV)
|
||||
|
||||
|
||||
#define DCCG_MASK_SH_LIST_DCN31(mask_sh) \
|
||||
|
||||
@@ -70,11 +70,14 @@
|
||||
SR(DSCCLK2_DTO_PARAM),\
|
||||
SR(DSCCLK3_DTO_PARAM),\
|
||||
SR(DSCCLK_DTO_CTRL),\
|
||||
SR(DCCG_GATE_DISABLE_CNTL),\
|
||||
SR(DCCG_GATE_DISABLE_CNTL2),\
|
||||
SR(DCCG_GATE_DISABLE_CNTL3),\
|
||||
SR(HDMISTREAMCLK0_DTO_PARAM),\
|
||||
SR(OTG_PIXEL_RATE_DIV),\
|
||||
SR(DTBCLK_P_CNTL)
|
||||
SR(DTBCLK_P_CNTL),\
|
||||
SR(DC_MEM_GLOBAL_PWR_REQ_CNTL),\
|
||||
SR(MICROSECOND_TIME_BASE_DIV)
|
||||
|
||||
#define DCCG_MASK_SH_LIST_DCN314_COMMON(mask_sh) \
|
||||
DCCG_SFI(DPPCLK_DTO_CTRL, DTO_DB_EN, DPPCLK, 0, mask_sh),\
|
||||
|
||||
@@ -2222,7 +2222,8 @@ static int smu_v13_0_0_restore_user_od_settings(struct smu_context *smu)
|
||||
user_od_table->OverDriveTable.FeatureCtrlMask = BIT(PP_OD_FEATURE_GFXCLK_BIT) |
|
||||
BIT(PP_OD_FEATURE_UCLK_BIT) |
|
||||
BIT(PP_OD_FEATURE_GFX_VF_CURVE_BIT) |
|
||||
BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
|
||||
BIT(PP_OD_FEATURE_FAN_CURVE_BIT) |
|
||||
BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
|
||||
res = smu_v13_0_0_upload_overdrive_table(smu, user_od_table);
|
||||
user_od_table->OverDriveTable.FeatureCtrlMask = 0;
|
||||
if (res == 0)
|
||||
|
||||
@@ -2224,7 +2224,8 @@ static int smu_v13_0_7_restore_user_od_settings(struct smu_context *smu)
|
||||
user_od_table->OverDriveTable.FeatureCtrlMask = BIT(PP_OD_FEATURE_GFXCLK_BIT) |
|
||||
BIT(PP_OD_FEATURE_UCLK_BIT) |
|
||||
BIT(PP_OD_FEATURE_GFX_VF_CURVE_BIT) |
|
||||
BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
|
||||
BIT(PP_OD_FEATURE_FAN_CURVE_BIT) |
|
||||
BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
|
||||
res = smu_v13_0_7_upload_overdrive_table(smu, user_od_table);
|
||||
user_od_table->OverDriveTable.FeatureCtrlMask = 0;
|
||||
if (res == 0)
|
||||
|
||||
@@ -2311,7 +2311,8 @@ static int smu_v14_0_2_restore_user_od_settings(struct smu_context *smu)
|
||||
user_od_table->OverDriveTable.FeatureCtrlMask = BIT(PP_OD_FEATURE_GFXCLK_BIT) |
|
||||
BIT(PP_OD_FEATURE_UCLK_BIT) |
|
||||
BIT(PP_OD_FEATURE_GFX_VF_CURVE_BIT) |
|
||||
BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
|
||||
BIT(PP_OD_FEATURE_FAN_CURVE_BIT) |
|
||||
BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
|
||||
res = smu_v14_0_2_upload_overdrive_table(smu, user_od_table);
|
||||
user_od_table->OverDriveTable.FeatureCtrlMask = 0;
|
||||
if (res == 0)
|
||||
|
||||
Reference in New Issue
Block a user