⬢ DragonFlyBSD Kernel Audit
DF-3651 / fix.diff
← back to finding ↓ download raw
--- 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) {