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;
|
break;
|
||||||
default:
|
default:
|
||||||
r = amdgpu_discovery_set_ip_blocks(adev);
|
r = amdgpu_discovery_set_ip_blocks(adev);
|
||||||
if (r)
|
if (r) {
|
||||||
|
adev->num_ip_blocks = 0;
|
||||||
return r;
|
return r;
|
||||||
|
}
|
||||||
break;
|
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;
|
i = state == AMD_CG_STATE_GATE ? j : adev->num_ip_blocks - j - 1;
|
||||||
if (!adev->ip_blocks[i].status.late_initialized)
|
if (!adev->ip_blocks[i].status.late_initialized)
|
||||||
continue;
|
continue;
|
||||||
|
if (!adev->ip_blocks[i].version)
|
||||||
|
continue;
|
||||||
/* skip CG for GFX, SDMA on S0ix */
|
/* skip CG for GFX, SDMA on S0ix */
|
||||||
if (adev->in_s0ix &&
|
if (adev->in_s0ix &&
|
||||||
(adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX ||
|
(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;
|
i = state == AMD_PG_STATE_GATE ? j : adev->num_ip_blocks - j - 1;
|
||||||
if (!adev->ip_blocks[i].status.late_initialized)
|
if (!adev->ip_blocks[i].status.late_initialized)
|
||||||
continue;
|
continue;
|
||||||
|
if (!adev->ip_blocks[i].version)
|
||||||
|
continue;
|
||||||
/* skip PG for GFX, SDMA on S0ix */
|
/* skip PG for GFX, SDMA on S0ix */
|
||||||
if (adev->in_s0ix &&
|
if (adev->in_s0ix &&
|
||||||
(adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX ||
|
(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;
|
int i, r;
|
||||||
|
|
||||||
for (i = 0; i < adev->num_ip_blocks; i++) {
|
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)
|
if (!adev->ip_blocks[i].version->funcs->early_fini)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -3570,6 +3578,8 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev)
|
|||||||
if (!adev->ip_blocks[i].status.sw)
|
if (!adev->ip_blocks[i].status.sw)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (!adev->ip_blocks[i].version)
|
||||||
|
continue;
|
||||||
if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
|
if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
|
||||||
amdgpu_ucode_free_bo(adev);
|
amdgpu_ucode_free_bo(adev);
|
||||||
amdgpu_free_static_csa(&adev->virt.csa_obj);
|
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--) {
|
for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
|
||||||
if (!adev->ip_blocks[i].status.late_initialized)
|
if (!adev->ip_blocks[i].status.late_initialized)
|
||||||
continue;
|
continue;
|
||||||
|
if (!adev->ip_blocks[i].version)
|
||||||
|
continue;
|
||||||
if (adev->ip_blocks[i].version->funcs->late_fini)
|
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].version->funcs->late_fini(&adev->ip_blocks[i]);
|
||||||
adev->ip_blocks[i].status.late_initialized = false;
|
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);
|
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||||
|
|
||||||
if (adev == NULL)
|
if (adev == NULL || !adev->num_ip_blocks)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
amdgpu_unregister_gpu_instance(adev);
|
amdgpu_unregister_gpu_instance(adev);
|
||||||
|
|||||||
@@ -368,15 +368,15 @@ struct amdgpu_mode_info {
|
|||||||
|
|
||||||
struct drm_property *plane_ctm_property;
|
struct drm_property *plane_ctm_property;
|
||||||
/**
|
/**
|
||||||
* @shaper_lut_property: Plane property to set pre-blending shaper LUT
|
* @plane_shaper_lut_property: Plane property to set pre-blending
|
||||||
* that converts color content before 3D LUT. If
|
* shaper LUT that converts color content before 3D LUT.
|
||||||
* plane_shaper_tf_property != Identity TF, AMD color module will
|
* If plane_shaper_tf_property != Identity TF, AMD color module will
|
||||||
* combine the user LUT values with pre-defined TF into the LUT
|
* combine the user LUT values with pre-defined TF into the LUT
|
||||||
* parameters to be programmed.
|
* parameters to be programmed.
|
||||||
*/
|
*/
|
||||||
struct drm_property *plane_shaper_lut_property;
|
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).
|
* pre-blending shaper LUT as supported by the driver (read-only).
|
||||||
*/
|
*/
|
||||||
struct drm_property *plane_shaper_lut_size_property;
|
struct drm_property *plane_shaper_lut_size_property;
|
||||||
@@ -400,10 +400,10 @@ struct amdgpu_mode_info {
|
|||||||
*/
|
*/
|
||||||
struct drm_property *plane_lut3d_property;
|
struct drm_property *plane_lut3d_property;
|
||||||
/**
|
/**
|
||||||
* @plane_degamma_lut_size_property: Plane property to define the max
|
* @plane_lut3d_size_property: Plane property to define the max size
|
||||||
* size of 3D LUT as supported by the driver (read-only). The max size
|
* of 3D LUT as supported by the driver (read-only). The max size is
|
||||||
* is the max size of one dimension and, therefore, the max number of
|
* the max size of one dimension and, therefore, the max number of
|
||||||
* entries for 3D LUT array is the 3D LUT size cubed;
|
* entries for 3D LUT array is the 3D LUT size cubed.
|
||||||
*/
|
*/
|
||||||
struct drm_property *plane_lut3d_size_property;
|
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;
|
int i;
|
||||||
struct amdgpu_device *adev = mes->adev;
|
struct amdgpu_device *adev = mes->adev;
|
||||||
union MESAPI_SET_HW_RESOURCES mes_set_hw_res_pkt;
|
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));
|
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 support, other queue will not use the oversubscribe timer.
|
||||||
* handling mode - 0: disabled; 1: basic version; 2: basic+ version
|
* 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;
|
mes_set_hw_res_pkt.unmapped_doorbell_handling = 1;
|
||||||
|
|
||||||
if (amdgpu_mes_log_enable) {
|
if (amdgpu_mes_log_enable) {
|
||||||
|
|||||||
@@ -593,6 +593,7 @@ int pqm_update_queue_properties(struct process_queue_manager *pqm,
|
|||||||
p->queue_size)) {
|
p->queue_size)) {
|
||||||
pr_debug("ring buf 0x%llx size 0x%llx not mapped on GPU\n",
|
pr_debug("ring buf 0x%llx size 0x%llx not mapped on GPU\n",
|
||||||
p->queue_address, p->queue_size);
|
p->queue_address, p->queue_size);
|
||||||
|
amdgpu_bo_unreserve(vm->root.bo);
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,11 @@
|
|||||||
DCCG_SRII(PIXEL_RATE_CNTL, OTG, 0),\
|
DCCG_SRII(PIXEL_RATE_CNTL, OTG, 0),\
|
||||||
DCCG_SRII(PIXEL_RATE_CNTL, OTG, 1),\
|
DCCG_SRII(PIXEL_RATE_CNTL, OTG, 1),\
|
||||||
SR(DISPCLK_FREQ_CHANGE_CNTL),\
|
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() \
|
#define DCCG_REG_LIST_DCN2() \
|
||||||
DCCG_COMMON_REG_LIST_DCN_BASE(),\
|
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;
|
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 = {
|
static const struct dccg_funcs dccg21_funcs = {
|
||||||
.update_dpp_dto = dccg21_update_dpp_dto,
|
.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,
|
.set_fifo_errdet_ovr_en = dccg2_set_fifo_errdet_ovr_en,
|
||||||
.otg_add_pixel = dccg2_otg_add_pixel,
|
.otg_add_pixel = dccg2_otg_add_pixel,
|
||||||
.otg_drop_pixel = dccg2_otg_drop_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 */
|
.refclk_setup = dccg2_refclk_setup, /* Deprecated - for backward compatibility only */
|
||||||
.allow_clock_gating = dccg2_allow_clock_gating,
|
.allow_clock_gating = dccg2_allow_clock_gating,
|
||||||
.enable_memory_low_power = dccg2_enable_memory_low_power,
|
.enable_memory_low_power = dccg2_enable_memory_low_power,
|
||||||
|
|||||||
@@ -34,7 +34,13 @@
|
|||||||
DCCG_SRII(DTO_PARAM, DPPCLK, 1),\
|
DCCG_SRII(DTO_PARAM, DPPCLK, 1),\
|
||||||
DCCG_SRII(DTO_PARAM, DPPCLK, 2),\
|
DCCG_SRII(DTO_PARAM, DPPCLK, 2),\
|
||||||
DCCG_SRII(DTO_PARAM, DPPCLK, 3),\
|
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) \
|
#define DCCG_MASK_SH_LIST_DCN301(mask_sh) \
|
||||||
DCCG_SFI(DPPCLK_DTO_CTRL, DTO_ENABLE, DPPCLK, 0, mask_sh),\
|
DCCG_SFI(DPPCLK_DTO_CTRL, DTO_ENABLE, DPPCLK, 0, mask_sh),\
|
||||||
|
|||||||
@@ -64,9 +64,12 @@
|
|||||||
SR(DSCCLK1_DTO_PARAM),\
|
SR(DSCCLK1_DTO_PARAM),\
|
||||||
SR(DSCCLK2_DTO_PARAM),\
|
SR(DSCCLK2_DTO_PARAM),\
|
||||||
SR(DSCCLK_DTO_CTRL),\
|
SR(DSCCLK_DTO_CTRL),\
|
||||||
|
SR(DCCG_GATE_DISABLE_CNTL),\
|
||||||
SR(DCCG_GATE_DISABLE_CNTL2),\
|
SR(DCCG_GATE_DISABLE_CNTL2),\
|
||||||
SR(DCCG_GATE_DISABLE_CNTL3),\
|
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) \
|
#define DCCG_MASK_SH_LIST_DCN31(mask_sh) \
|
||||||
|
|||||||
@@ -70,11 +70,14 @@
|
|||||||
SR(DSCCLK2_DTO_PARAM),\
|
SR(DSCCLK2_DTO_PARAM),\
|
||||||
SR(DSCCLK3_DTO_PARAM),\
|
SR(DSCCLK3_DTO_PARAM),\
|
||||||
SR(DSCCLK_DTO_CTRL),\
|
SR(DSCCLK_DTO_CTRL),\
|
||||||
|
SR(DCCG_GATE_DISABLE_CNTL),\
|
||||||
SR(DCCG_GATE_DISABLE_CNTL2),\
|
SR(DCCG_GATE_DISABLE_CNTL2),\
|
||||||
SR(DCCG_GATE_DISABLE_CNTL3),\
|
SR(DCCG_GATE_DISABLE_CNTL3),\
|
||||||
SR(HDMISTREAMCLK0_DTO_PARAM),\
|
SR(HDMISTREAMCLK0_DTO_PARAM),\
|
||||||
SR(OTG_PIXEL_RATE_DIV),\
|
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) \
|
#define DCCG_MASK_SH_LIST_DCN314_COMMON(mask_sh) \
|
||||||
DCCG_SFI(DPPCLK_DTO_CTRL, DTO_DB_EN, DPPCLK, 0, 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) |
|
user_od_table->OverDriveTable.FeatureCtrlMask = BIT(PP_OD_FEATURE_GFXCLK_BIT) |
|
||||||
BIT(PP_OD_FEATURE_UCLK_BIT) |
|
BIT(PP_OD_FEATURE_UCLK_BIT) |
|
||||||
BIT(PP_OD_FEATURE_GFX_VF_CURVE_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);
|
res = smu_v13_0_0_upload_overdrive_table(smu, user_od_table);
|
||||||
user_od_table->OverDriveTable.FeatureCtrlMask = 0;
|
user_od_table->OverDriveTable.FeatureCtrlMask = 0;
|
||||||
if (res == 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) |
|
user_od_table->OverDriveTable.FeatureCtrlMask = BIT(PP_OD_FEATURE_GFXCLK_BIT) |
|
||||||
BIT(PP_OD_FEATURE_UCLK_BIT) |
|
BIT(PP_OD_FEATURE_UCLK_BIT) |
|
||||||
BIT(PP_OD_FEATURE_GFX_VF_CURVE_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);
|
res = smu_v13_0_7_upload_overdrive_table(smu, user_od_table);
|
||||||
user_od_table->OverDriveTable.FeatureCtrlMask = 0;
|
user_od_table->OverDriveTable.FeatureCtrlMask = 0;
|
||||||
if (res == 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) |
|
user_od_table->OverDriveTable.FeatureCtrlMask = BIT(PP_OD_FEATURE_GFXCLK_BIT) |
|
||||||
BIT(PP_OD_FEATURE_UCLK_BIT) |
|
BIT(PP_OD_FEATURE_UCLK_BIT) |
|
||||||
BIT(PP_OD_FEATURE_GFX_VF_CURVE_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);
|
res = smu_v14_0_2_upload_overdrive_table(smu, user_od_table);
|
||||||
user_od_table->OverDriveTable.FeatureCtrlMask = 0;
|
user_od_table->OverDriveTable.FeatureCtrlMask = 0;
|
||||||
if (res == 0)
|
if (res == 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user