]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/gpu/drm/radeon/radeon_atombios.c
drm/radeon/dpm/atom: fix broken gcc harder
[mirror_ubuntu-artful-kernel.git] / drivers / gpu / drm / radeon / radeon_atombios.c
index b1777d10d0b5e1cdca7d8f20d4b05903b76cf7f4..e3f3e8841789a5c7a0234f73fb089dc0cf204687 100644 (file)
@@ -2441,6 +2441,10 @@ static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev,
        case ATOM_VIRTUAL_VOLTAGE_ID1:
        case ATOM_VIRTUAL_VOLTAGE_ID2:
        case ATOM_VIRTUAL_VOLTAGE_ID3:
+       case ATOM_VIRTUAL_VOLTAGE_ID4:
+       case ATOM_VIRTUAL_VOLTAGE_ID5:
+       case ATOM_VIRTUAL_VOLTAGE_ID6:
+       case ATOM_VIRTUAL_VOLTAGE_ID7:
                if (radeon_atom_get_max_vddc(rdev, VOLTAGE_TYPE_VDDC,
                                             rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage,
                                             &vddc) == 0)
@@ -3509,7 +3513,6 @@ int radeon_atom_get_memory_info(struct radeon_device *rdev,
        u8 frev, crev, i;
        u16 data_offset, size;
        union vram_info *vram_info;
-       u8 *p;
 
        memset(mem_info, 0, sizeof(struct atom_memory_info));
 
@@ -3525,13 +3528,12 @@ int radeon_atom_get_memory_info(struct radeon_device *rdev,
                                if (module_index < vram_info->v1_3.ucNumOfVRAMModule) {
                                        ATOM_VRAM_MODULE_V3 *vram_module =
                                                (ATOM_VRAM_MODULE_V3 *)vram_info->v1_3.aVramInfo;
-                                       p = (u8 *)vram_info->v1_3.aVramInfo;
 
                                        for (i = 0; i < module_index; i++) {
-                                               vram_module = (ATOM_VRAM_MODULE_V3 *)p;
                                                if (le16_to_cpu(vram_module->usSize) == 0)
                                                        return -EINVAL;
-                                               p += le16_to_cpu(vram_module->usSize);
+                                               vram_module = (ATOM_VRAM_MODULE_V3 *)
+                                                       ((u8 *)vram_module + le16_to_cpu(vram_module->usSize));
                                        }
                                        mem_info->mem_vendor = vram_module->asMemory.ucMemoryVenderID & 0xf;
                                        mem_info->mem_type = vram_module->asMemory.ucMemoryType & 0xf0;
@@ -3543,13 +3545,12 @@ int radeon_atom_get_memory_info(struct radeon_device *rdev,
                                if (module_index < vram_info->v1_4.ucNumOfVRAMModule) {
                                        ATOM_VRAM_MODULE_V4 *vram_module =
                                                (ATOM_VRAM_MODULE_V4 *)vram_info->v1_4.aVramInfo;
-                                       p = (u8 *)vram_info->v1_4.aVramInfo;
 
                                        for (i = 0; i < module_index; i++) {
-                                               vram_module = (ATOM_VRAM_MODULE_V4 *)p;
                                                if (le16_to_cpu(vram_module->usModuleSize) == 0)
                                                        return -EINVAL;
-                                               p += le16_to_cpu(vram_module->usModuleSize);
+                                               vram_module = (ATOM_VRAM_MODULE_V4 *)
+                                                       ((u8 *)vram_module + le16_to_cpu(vram_module->usModuleSize));
                                        }
                                        mem_info->mem_vendor = vram_module->ucMemoryVenderID & 0xf;
                                        mem_info->mem_type = vram_module->ucMemoryType & 0xf0;
@@ -3568,13 +3569,12 @@ int radeon_atom_get_memory_info(struct radeon_device *rdev,
                                if (module_index < vram_info->v2_1.ucNumOfVRAMModule) {
                                        ATOM_VRAM_MODULE_V7 *vram_module =
                                                (ATOM_VRAM_MODULE_V7 *)vram_info->v2_1.aVramInfo;
-                                       p = (u8 *)vram_info->v2_1.aVramInfo;
 
                                        for (i = 0; i < module_index; i++) {
-                                               vram_module = (ATOM_VRAM_MODULE_V7 *)p;
                                                if (le16_to_cpu(vram_module->usModuleSize) == 0)
                                                        return -EINVAL;
-                                               p += le16_to_cpu(vram_module->usModuleSize);
+                                               vram_module = (ATOM_VRAM_MODULE_V7 *)
+                                                       ((u8 *)vram_module + le16_to_cpu(vram_module->usModuleSize));
                                        }
                                        mem_info->mem_vendor = vram_module->ucMemoryVenderID & 0xf;
                                        mem_info->mem_type = vram_module->ucMemoryType & 0xf0;
@@ -3624,21 +3624,19 @@ int radeon_atom_get_mclk_range_table(struct radeon_device *rdev,
                                if (module_index < vram_info->v1_4.ucNumOfVRAMModule) {
                                        ATOM_VRAM_MODULE_V4 *vram_module =
                                                (ATOM_VRAM_MODULE_V4 *)vram_info->v1_4.aVramInfo;
-                                       ATOM_MEMORY_TIMING_FORMAT *format;
-                                       p = (u8 *)vram_info->v1_4.aVramInfo;
 
                                        for (i = 0; i < module_index; i++) {
-                                               vram_module = (ATOM_VRAM_MODULE_V4 *)p;
                                                if (le16_to_cpu(vram_module->usModuleSize) == 0)
                                                        return -EINVAL;
-                                               p += le16_to_cpu(vram_module->usModuleSize);
+                                               vram_module = (ATOM_VRAM_MODULE_V4 *)
+                                                       ((u8 *)vram_module + le16_to_cpu(vram_module->usModuleSize));
                                        }
                                        mclk_range_table->num_entries = (u8)
-                                               ((vram_module->usModuleSize - offsetof(ATOM_VRAM_MODULE_V4, asMemTiming)) /
+                                               ((le16_to_cpu(vram_module->usModuleSize) - offsetof(ATOM_VRAM_MODULE_V4, asMemTiming)) /
                                                 mem_timing_size);
-                                       p = (u8 *)vram_module->asMemTiming;
+                                       p = (u8 *)&vram_module->asMemTiming[0];
                                        for (i = 0; i < mclk_range_table->num_entries; i++) {
-                                               format = (ATOM_MEMORY_TIMING_FORMAT *)p;
+                                               ATOM_MEMORY_TIMING_FORMAT *format = (ATOM_MEMORY_TIMING_FORMAT *)p;
                                                mclk_range_table->mclk[i] = le32_to_cpu(format->ulClkRange);
                                                p += mem_timing_size;
                                        }
@@ -3701,17 +3699,21 @@ int radeon_atom_init_mc_reg_table(struct radeon_device *rdev,
                                                (ATOM_MEMORY_SETTING_DATA_BLOCK *)
                                                ((u8 *)reg_block + (2 * sizeof(u16)) +
                                                 le16_to_cpu(reg_block->usRegIndexTblSize));
+                                       ATOM_INIT_REG_INDEX_FORMAT *format = &reg_block->asRegIndexBuf[0];
                                        num_entries = (u8)((le16_to_cpu(reg_block->usRegIndexTblSize)) /
                                                           sizeof(ATOM_INIT_REG_INDEX_FORMAT)) - 1;
                                        if (num_entries > VBIOS_MC_REGISTER_ARRAY_SIZE)
                                                return -EINVAL;
-                                       while (!(reg_block->asRegIndexBuf[i].ucPreRegDataLength & ACCESS_PLACEHOLDER) &&
-                                             (i < num_entries)) {
+                                       while (i < num_entries) {
+                                               if (format->ucPreRegDataLength & ACCESS_PLACEHOLDER)
+                                                       break;
                                                reg_table->mc_reg_address[i].s1 =
-                                                       (u16)(le16_to_cpu(reg_block->asRegIndexBuf[i].usRegIndex));
+                                                       (u16)(le16_to_cpu(format->usRegIndex));
                                                reg_table->mc_reg_address[i].pre_reg_data =
-                                                       (u8)(reg_block->asRegIndexBuf[i].ucPreRegDataLength);
+                                                       (u8)(format->ucPreRegDataLength);
                                                i++;
+                                               format = (ATOM_INIT_REG_INDEX_FORMAT *)
+                                                       ((u8 *)format + sizeof(ATOM_INIT_REG_INDEX_FORMAT));
                                        }
                                        reg_table->last = i;
                                        while ((*(u32 *)reg_data != END_OF_REG_DATA_BLOCK) &&