drm/radeon/kms: add primary dac adj values table
authorAlex Deucher <alexdeucher@gmail.com>
Tue, 29 Dec 2009 17:09:17 +0000 (12:09 -0500)
committerDave Airlie <airlied@redhat.com>
Wed, 6 Jan 2010 01:31:55 +0000 (11:31 +1000)
Look up primary dac adj values from the table if
there is no bios or bios dac table to reference.

The lookup table may need to be adjusted for certain
families.

Should fix kernel bug 14945.

Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/radeon_combios.c

index fd94dbca33ac99724dd1c34cab8c0590e5943586..58f342659cc741870660172971224654e6a4bb07 100644 (file)
@@ -595,6 +595,34 @@ bool radeon_combios_get_clock_info(struct drm_device *dev)
        return false;
 }
 
+static const uint32_t default_primarydac_adj[CHIP_LAST] = {
+       0x00000808,             /* r100  */
+       0x00000808,             /* rv100 */
+       0x00000808,             /* rs100 */
+       0x00000808,             /* rv200 */
+       0x00000808,             /* rs200 */
+       0x00000808,             /* r200  */
+       0x00000808,             /* rv250 */
+       0x00000000,             /* rs300 */
+       0x00000808,             /* rv280 */
+       0x00000808,             /* r300  */
+       0x00000808,             /* r350  */
+       0x00000808,             /* rv350 */
+       0x00000808,             /* rv380 */
+       0x00000808,             /* r420  */
+       0x00000808,             /* r423  */
+       0x00000808,             /* rv410 */
+       0x00000000,             /* rs400 */
+       0x00000000,             /* rs480 */
+};
+
+static void radeon_legacy_get_primary_dac_info_from_table(struct radeon_device *rdev,
+                                                         struct radeon_encoder_primary_dac *p_dac)
+{
+       p_dac->ps2_pdac_adj = default_primarydac_adj[rdev->family];
+       return;
+}
+
 struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct
                                                                       radeon_encoder
                                                                       *encoder)
@@ -604,20 +632,20 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct
        uint16_t dac_info;
        uint8_t rev, bg, dac;
        struct radeon_encoder_primary_dac *p_dac = NULL;
+       int found = 0;
 
-       if (rdev->bios == NULL)
+       p_dac = kzalloc(sizeof(struct radeon_encoder_primary_dac),
+                       GFP_KERNEL);
+
+       if (!p_dac)
                return NULL;
 
+       if (rdev->bios == NULL)
+               goto out;
+
        /* check CRT table */
        dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE);
        if (dac_info) {
-               p_dac =
-                   kzalloc(sizeof(struct radeon_encoder_primary_dac),
-                           GFP_KERNEL);
-
-               if (!p_dac)
-                       return NULL;
-
                rev = RBIOS8(dac_info) & 0x3;
                if (rev < 2) {
                        bg = RBIOS8(dac_info + 0x2) & 0xf;
@@ -628,9 +656,13 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct
                        dac = RBIOS8(dac_info + 0x3) & 0xf;
                        p_dac->ps2_pdac_adj = (bg << 8) | (dac);
                }
-
+               found = 1;
        }
 
+out:
+       if (!found) /* fallback to defaults */
+               radeon_legacy_get_primary_dac_info_from_table(rdev, p_dac);
+
        return p_dac;
 }