drm/radeon: gcc fixes for ci dpm
authorAlex Deucher <alexander.deucher@amd.com>
Tue, 20 Aug 2013 23:08:22 +0000 (19:08 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 30 Aug 2013 20:31:22 +0000 (16:31 -0400)
Newer versions of gcc seem to wander off into the
weeds when dealing with variable sizes arrays in
structs.  Rather than indexing the arrays, use
pointer arithmetic.

See bugs:
https://bugs.freedesktop.org/show_bug.cgi?id=66932
https://bugs.freedesktop.org/show_bug.cgi?id=66972
https://bugs.freedesktop.org/show_bug.cgi?id=66945

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/radeon/ci_dpm.c

index 7a6068968b70c0658000781c227b9ad50135f06d..dd2a07c44c3a562606acf38ba7aae0d42b3dac7b 100644 (file)
@@ -4931,6 +4931,7 @@ static int ci_parse_power_table(struct radeon_device *rdev)
        rdev->pm.dpm.backbias_response_time = le16_to_cpu(power_info->pplib.usBackbiasTime);
        rdev->pm.dpm.voltage_response_time = le16_to_cpu(power_info->pplib.usVoltageTime);
        for (i = 0; i < state_array->ucNumEntries; i++) {
+               u8 *idx;
                power_state = (union pplib_power_state *)power_state_offset;
                non_clock_array_index = power_state->v2.nonClockInfoIndex;
                non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
@@ -4947,14 +4948,16 @@ static int ci_parse_power_table(struct radeon_device *rdev)
                                              non_clock_info,
                                              non_clock_info_array->ucEntrySize);
                k = 0;
+               idx = (u8 *)&power_state->v2.clockInfoIndex[0];
                for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
-                       clock_array_index = power_state->v2.clockInfoIndex[j];
+                       clock_array_index = idx[j];
                        if (clock_array_index >= clock_info_array->ucNumEntries)
                                continue;
                        if (k >= CISLANDS_MAX_HARDWARE_POWERLEVELS)
                                break;
                        clock_info = (union pplib_clock_info *)
-                               &clock_info_array->clockInfo[clock_array_index * clock_info_array->ucEntrySize];
+                               ((u8 *)&clock_info_array->clockInfo[0] +
+                                (clock_array_index * clock_info_array->ucEntrySize));
                        ci_parse_pplib_clock_info(rdev,
                                                  &rdev->pm.dpm.ps[i], k,
                                                  clock_info);