drm/nouveau/dp: support version 4.0 of DP table
authorBen Skeggs <bskeggs@redhat.com>
Sun, 11 Mar 2012 06:08:05 +0000 (16:08 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 22 Mar 2012 14:21:18 +0000 (00:21 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_bios.c
drivers/gpu/drm/nouveau/nouveau_dp.c
drivers/gpu/drm/nouveau/nvd0_display.c

index 8dbeeea..637afe7 100644 (file)
@@ -1144,7 +1144,8 @@ init_dp_condition(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
                break;
        case 1:
        case 2:
-               if (!(entry[5] & cond))
+               if ((table[0]  < 0x40 && !(entry[5] & cond)) ||
+                   (table[0] == 0x40 && !(entry[4] & cond)))
                        iexec->execute = false;
                break;
        case 5:
index 302b2f7..d996134 100644 (file)
@@ -188,6 +188,7 @@ nouveau_dp_bios_data(struct drm_device *dev, struct dcb_entry *dcb, u8 **entry)
        case 0x20:
        case 0x21:
        case 0x30:
+       case 0x40:
                break;
        default:
                NV_ERROR(dev, "displayport table 0x%02x unknown\n", table[0]);
@@ -366,6 +367,10 @@ dp_set_downspread(struct drm_device *dev, struct dp_state *dp, bool enable)
                if (table[0] >= 0x20 && table[0] <= 0x30) {
                        if (enable) script = ROM16(entry[12]);
                        else        script = ROM16(entry[14]);
+               } else
+               if (table[0] == 0x40) {
+                       if (enable) script = ROM16(entry[11]);
+                       else        script = ROM16(entry[13]);
                }
        }
 
@@ -380,6 +385,9 @@ dp_link_train_init(struct drm_device *dev, struct dp_state *dp)
        if (table) {
                if (table[0] >= 0x20 && table[0] <= 0x30)
                        script = ROM16(entry[6]);
+               else
+               if (table[0] == 0x40)
+                       script = ROM16(entry[5]);
        }
 
        nouveau_bios_run_init_table(dev, script, dp->dcb, dp->crtc);
@@ -393,6 +401,9 @@ dp_link_train_fini(struct drm_device *dev, struct dp_state *dp)
        if (table) {
                if (table[0] >= 0x20 && table[0] <= 0x30)
                        script = ROM16(entry[8]);
+               else
+               if (table[0] == 0x40)
+                       script = ROM16(entry[7]);
        }
 
        nouveau_bios_run_init_table(dev, script, dp->dcb, dp->crtc);
index d69642d..0247250 100644 (file)
@@ -1226,6 +1226,11 @@ nvd0_sor_dp_train_adj(struct drm_device *dev, struct dcb_entry *dcb,
                if (table[0] == 0x30) {
                        config  = entry + table[4];
                        config += table[5] * preem;
+               } else
+               if (table[0] == 0x40) {
+                       config  = table + table[1];
+                       config += table[2] * table[3];
+                       config += table[6] * preem;
                }
        }
 
@@ -1258,6 +1263,7 @@ nvd0_sor_dp_link_set(struct drm_device *dev, struct dcb_entry *dcb, int crtc,
        table = nouveau_dp_bios_data(dev, dcb, &entry);
        if (table) {
                if      (table[0] == 0x30) entry = ROMPTR(dev, entry[10]);
+               else if (table[0] == 0x40) entry = ROMPTR(dev, entry[9]);
                else                       entry = NULL;
 
                while (entry) {