aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/kv_dpm.c
diff options
context:
space:
mode:
authorDan Carpenter <dan.carpenter@oracle.com>2013-09-04 05:31:36 -0400
committerAlex Deucher <alexander.deucher@amd.com>2013-09-11 11:44:27 -0400
commit8c5c6fad61f9540a977e5731a8ae3bd8ba9083cb (patch)
treebadcd9d2600c330c1ca93238511175106c116c53 /drivers/gpu/drm/radeon/kv_dpm.c
parent41cd0b3b78d83ae87ee71cca2de5498f93816763 (diff)
drm/radeon: signedness bug in kv_dpm.c
The problem here is that "unsigned i" is always greater than or equal to zero. These loops mostly have a second check for "(i == 0)" so only the last two are actually buggy. The rest is just cleanup. Bug 1: kv_force_dpm_highest() doesn't have an "(i == 0)" check so it's a potential forever loop. Bug 2: In kv_get_sleep_divider_id_from_clock() there is a typo and the test is reversed "<=" vs ">" so we never enter the loop. That means normally we return KV_MAX_DEEPSLEEP_DIVIDER_ID (5). The return value from here is saved in ->DeepSleepDivId and I wasn't able to determine how that is used. This is a static checker fix and I have not tested it. Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/kv_dpm.c')
-rw-r--r--drivers/gpu/drm/radeon/kv_dpm.c32
1 files changed, 13 insertions, 19 deletions
diff --git a/drivers/gpu/drm/radeon/kv_dpm.c b/drivers/gpu/drm/radeon/kv_dpm.c
index ecd60809db4e..c499dafd28fa 100644
--- a/drivers/gpu/drm/radeon/kv_dpm.c
+++ b/drivers/gpu/drm/radeon/kv_dpm.c
@@ -667,9 +667,8 @@ static int kv_program_bootup_state(struct radeon_device *rdev)
667 &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk; 667 &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
668 668
669 if (table && table->count) { 669 if (table && table->count) {
670 for (i = pi->graphics_dpm_level_count - 1; i >= 0; i--) { 670 for (i = pi->graphics_dpm_level_count - 1; i > 0; i--) {
671 if ((table->entries[i].clk == pi->boot_pl.sclk) || 671 if (table->entries[i].clk == pi->boot_pl.sclk)
672 (i == 0))
673 break; 672 break;
674 } 673 }
675 674
@@ -682,9 +681,8 @@ static int kv_program_bootup_state(struct radeon_device *rdev)
682 if (table->num_max_dpm_entries == 0) 681 if (table->num_max_dpm_entries == 0)
683 return -EINVAL; 682 return -EINVAL;
684 683
685 for (i = pi->graphics_dpm_level_count - 1; i >= 0; i--) { 684 for (i = pi->graphics_dpm_level_count - 1; i > 0; i--) {
686 if ((table->entries[i].sclk_frequency == pi->boot_pl.sclk) || 685 if (table->entries[i].sclk_frequency == pi->boot_pl.sclk)
687 (i == 0))
688 break; 686 break;
689 } 687 }
690 688
@@ -1588,13 +1586,11 @@ static void kv_set_valid_clock_range(struct radeon_device *rdev,
1588 } 1586 }
1589 } 1587 }
1590 1588
1591 for (i = pi->graphics_dpm_level_count - 1; i >= 0; i--) { 1589 for (i = pi->graphics_dpm_level_count - 1; i > 0; i--) {
1592 if ((table->entries[i].clk <= new_ps->levels[new_ps->num_levels -1].sclk) || 1590 if (table->entries[i].clk <= new_ps->levels[new_ps->num_levels - 1].sclk)
1593 (i == 0)) {
1594 pi->highest_valid = i;
1595 break; 1591 break;
1596 }
1597 } 1592 }
1593 pi->highest_valid = i;
1598 1594
1599 if (pi->lowest_valid > pi->highest_valid) { 1595 if (pi->lowest_valid > pi->highest_valid) {
1600 if ((new_ps->levels[0].sclk - table->entries[pi->highest_valid].clk) > 1596 if ((new_ps->levels[0].sclk - table->entries[pi->highest_valid].clk) >
@@ -1615,14 +1611,12 @@ static void kv_set_valid_clock_range(struct radeon_device *rdev,
1615 } 1611 }
1616 } 1612 }
1617 1613
1618 for (i = pi->graphics_dpm_level_count - 1; i >= 0; i--) { 1614 for (i = pi->graphics_dpm_level_count - 1; i > 0; i--) {
1619 if (table->entries[i].sclk_frequency <= 1615 if (table->entries[i].sclk_frequency <=
1620 new_ps->levels[new_ps->num_levels - 1].sclk || 1616 new_ps->levels[new_ps->num_levels - 1].sclk)
1621 i == 0) {
1622 pi->highest_valid = i;
1623 break; 1617 break;
1624 }
1625 } 1618 }
1619 pi->highest_valid = i;
1626 1620
1627 if (pi->lowest_valid > pi->highest_valid) { 1621 if (pi->lowest_valid > pi->highest_valid) {
1628 if ((new_ps->levels[0].sclk - 1622 if ((new_ps->levels[0].sclk -
@@ -1871,7 +1865,7 @@ static int kv_force_dpm_highest(struct radeon_device *rdev)
1871 if (ret) 1865 if (ret)
1872 return ret; 1866 return ret;
1873 1867
1874 for (i = SMU7_MAX_LEVELS_GRAPHICS - 1; i >= 0; i--) { 1868 for (i = SMU7_MAX_LEVELS_GRAPHICS - 1; i > 0; i--) {
1875 if (enable_mask & (1 << i)) 1869 if (enable_mask & (1 << i))
1876 break; 1870 break;
1877 } 1871 }
@@ -1911,9 +1905,9 @@ static u8 kv_get_sleep_divider_id_from_clock(struct radeon_device *rdev,
1911 if (!pi->caps_sclk_ds) 1905 if (!pi->caps_sclk_ds)
1912 return 0; 1906 return 0;
1913 1907
1914 for (i = KV_MAX_DEEPSLEEP_DIVIDER_ID; i <= 0; i--) { 1908 for (i = KV_MAX_DEEPSLEEP_DIVIDER_ID; i > 0; i--) {
1915 temp = sclk / sumo_get_sleep_divider_from_id(i); 1909 temp = sclk / sumo_get_sleep_divider_from_id(i);
1916 if ((temp >= min) || (i == 0)) 1910 if (temp >= min)
1917 break; 1911 break;
1918 } 1912 }
1919 1913