hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/gpu/drm/radeon/ci_dpm.c
....@@ -5541,6 +5541,7 @@
55415541 u8 frev, crev;
55425542 u8 *power_state_offset;
55435543 struct ci_ps *ps;
5544
+ int ret;
55445545
55455546 if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
55465547 &frev, &crev, &data_offset))
....@@ -5570,11 +5571,15 @@
55705571 non_clock_array_index = power_state->v2.nonClockInfoIndex;
55715572 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
55725573 &non_clock_info_array->nonClockInfo[non_clock_array_index];
5573
- if (!rdev->pm.power_state[i].clock_info)
5574
- return -EINVAL;
5574
+ if (!rdev->pm.power_state[i].clock_info) {
5575
+ ret = -EINVAL;
5576
+ goto err_free_ps;
5577
+ }
55755578 ps = kzalloc(sizeof(struct ci_ps), GFP_KERNEL);
5576
- if (ps == NULL)
5577
- return -ENOMEM;
5579
+ if (ps == NULL) {
5580
+ ret = -ENOMEM;
5581
+ goto err_free_ps;
5582
+ }
55785583 rdev->pm.dpm.ps[i].ps_priv = ps;
55795584 ci_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i],
55805585 non_clock_info,
....@@ -5614,6 +5619,12 @@
56145619 }
56155620
56165621 return 0;
5622
+
5623
+err_free_ps:
5624
+ for (i = 0; i < rdev->pm.dpm.num_ps; i++)
5625
+ kfree(rdev->pm.dpm.ps[i].ps_priv);
5626
+ kfree(rdev->pm.dpm.ps);
5627
+ return ret;
56175628 }
56185629
56195630 static int ci_get_vbios_boot_values(struct radeon_device *rdev,
....@@ -5702,25 +5713,26 @@
57025713
57035714 ret = ci_get_vbios_boot_values(rdev, &pi->vbios_boot_state);
57045715 if (ret) {
5705
- ci_dpm_fini(rdev);
5716
+ kfree(rdev->pm.dpm.priv);
57065717 return ret;
57075718 }
57085719
57095720 ret = r600_get_platform_caps(rdev);
57105721 if (ret) {
5711
- ci_dpm_fini(rdev);
5722
+ kfree(rdev->pm.dpm.priv);
57125723 return ret;
57135724 }
57145725
57155726 ret = r600_parse_extended_power_table(rdev);
57165727 if (ret) {
5717
- ci_dpm_fini(rdev);
5728
+ kfree(rdev->pm.dpm.priv);
57185729 return ret;
57195730 }
57205731
57215732 ret = ci_parse_power_table(rdev);
57225733 if (ret) {
5723
- ci_dpm_fini(rdev);
5734
+ kfree(rdev->pm.dpm.priv);
5735
+ r600_free_extended_power_table(rdev);
57245736 return ret;
57255737 }
57265738