DF-3651 / fix.diff
--- a/sys/dev/drm/radeon/ci_dpm.c +++ b/sys/dev/drm/radeon/ci_dpm.c @@ -324,6 +324,9 @@ static int ci_populate_tdc_limit(struct radeon_device *rdev) u16 tdc_limit; + if (!rdev->pm.dpm.dyn_state.cac_tdp_table) + return -EINVAL; tdc_limit = rdev->pm.dpm.dyn_state.cac_tdp_table->tdc * 256; pi->smc_powertune_table.TDC_VDDC_PkgLimit = cpu_to_be16(tdc_limit); @@ -406,6 +409,9 @@ static int ci_populate_bapm_vddc_base_leakage_sidd(struct radeon_device *rdev) struct radeon_cac_tdp_table *cac_tdp_table = rdev->pm.dpm.dyn_state.cac_tdp_table; + if (!cac_tdp_table) + return -EINVAL; + hi_sidd = cac_tdp_table->high_cac_leakage / 100 * 256; lo_sidd = cac_tdp_table->low_cac_leakage / 100 * 256; @@ -423,6 +429,9 @@ static int ci_populate_bapm_parameters_in_dpm_table(struct radeon_device *rdev) int i, j, k; const u16 *def1; const u16 *def2; + if (!cac_tdp_table) + return -EINVAL; + dpm_table->DefaultTdp = cac_tdp_table->tdp * 256; @@ -660,6 +669,9 @@ static int ci_enable_power_containment(struct radeon_device *rdev, bool enable) } else { struct radeon_cac_tdp_table *cac_tdp_table = rdev->pm.dpm.dyn_state.cac_tdp_table; + if (!cac_tdp_table) { + ret = -EINVAL; + break; + } u32 default_pwr_limit = (u32)(cac_tdp_table->maximum_power_delivery_limit * 256); @@ -734,6 +746,9 @@ static int ci_power_control_set_level(struct radeon_device *rdev) int ret = 0; bool adjust_polarity = false; /* ??? */ + if (!cac_tdp_table) + return -EINVAL; + if (pi->caps_power_containment) { |