Merge tag 'v3.10.103' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / gpu / drm / radeon / radeon_atombios.c
index dea6f63c9724af9b493fb5693f9e3f406edcb0fb..f4b9b1c0cae81d9ff837f2922508d9eedce89dcd 100644 (file)
@@ -452,7 +452,9 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
        }
 
        /* Fujitsu D3003-S2 board lists DVI-I as DVI-D and VGA */
-       if (((dev->pdev->device == 0x9802) || (dev->pdev->device == 0x9806)) &&
+       if (((dev->pdev->device == 0x9802) ||
+            (dev->pdev->device == 0x9805) ||
+            (dev->pdev->device == 0x9806)) &&
            (dev->pdev->subsystem_vendor == 0x1734) &&
            (dev->pdev->subsystem_device == 0x11bd)) {
                if (*connector_type == DRM_MODE_CONNECTOR_VGA) {
@@ -463,7 +465,6 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
                }
        }
 
-
        return true;
 }
 
@@ -715,13 +716,16 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
                                                                (ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *)
                                                                (ctx->bios + data_offset +
                                                                 le16_to_cpu(router_obj->asObjects[k].usSrcDstTableOffset));
+                                                       u8 *num_dst_objs = (u8 *)
+                                                               ((u8 *)router_src_dst_table + 1 +
+                                                                (router_src_dst_table->ucNumberOfSrc * 2));
+                                                       u16 *dst_objs = (u16 *)(num_dst_objs + 1);
                                                        int enum_id;
 
                                                        router.router_id = router_obj_id;
-                                                       for (enum_id = 0; enum_id < router_src_dst_table->ucNumberOfDst;
-                                                            enum_id++) {
+                                                       for (enum_id = 0; enum_id < (*num_dst_objs); enum_id++) {
                                                                if (le16_to_cpu(path->usConnObjectId) ==
-                                                                   le16_to_cpu(router_src_dst_table->usDstObjectID[enum_id]))
+                                                                   le16_to_cpu(dst_objs[enum_id]))
                                                                        break;
                                                        }
 
@@ -1140,7 +1144,7 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
                    le16_to_cpu(firmware_info->info.usReferenceClock);
                p1pll->reference_div = 0;
 
-               if (crev < 2)
+               if ((frev < 2) && (crev < 2))
                        p1pll->pll_out_min =
                                le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Output);
                else
@@ -1149,7 +1153,7 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
                p1pll->pll_out_max =
                    le32_to_cpu(firmware_info->info.ulMaxPixelClockPLL_Output);
 
-               if (crev >= 4) {
+               if (((frev < 2) && (crev >= 4)) || (frev >= 2)) {
                        p1pll->lcd_pll_out_min =
                                le16_to_cpu(firmware_info->info_14.usLcdMinPixelClockPLL_Output) * 100;
                        if (p1pll->lcd_pll_out_min == 0)
@@ -1651,7 +1655,9 @@ struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
                                                                kfree(edid);
                                                }
                                        }
-                                       record += sizeof(ATOM_FAKE_EDID_PATCH_RECORD);
+                                       record += fake_edid_record->ucFakeEDIDLength ?
+                                               fake_edid_record->ucFakeEDIDLength + 2 :
+                                               sizeof(ATOM_FAKE_EDID_PATCH_RECORD);
                                        break;
                                case LCD_PANEL_RESOLUTION_RECORD_TYPE:
                                        panel_res_record = (ATOM_PANEL_RESOLUTION_PATCH_RECORD *)record;
@@ -1903,7 +1909,7 @@ static const char *thermal_controller_names[] = {
        "adm1032",
        "adm1030",
        "max6649",
-       "lm64",
+       "lm63", /* lm64 */
        "f75375",
        "asc7xxx",
 };
@@ -1914,7 +1920,7 @@ static const char *pp_lib_thermal_controller_names[] = {
        "adm1032",
        "adm1030",
        "max6649",
-       "lm64",
+       "lm63", /* lm64 */
        "f75375",
        "RV6xx",
        "RV770",
@@ -2921,6 +2927,10 @@ void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
        /* tell the bios not to handle mode switching */
        bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH;
 
+       /* clear the vbios dpms state */
+       if (ASIC_IS_DCE4(rdev))
+               bios_2_scratch &= ~ATOM_S2_DEVICE_DPMS_STATE;
+
        if (rdev->family >= CHIP_R600) {
                WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
                WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);