drm/nouveau/kms/nv50-: determine MST support from DP Info Table
authorBen Skeggs <bskeggs@redhat.com>
Tue, 8 May 2018 10:39:47 +0000 (20:39 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 18 May 2018 05:01:29 +0000 (15:01 +1000)
GV100 doesn't support MST, use the information provided in VBIOS tables to
detect its presence instead.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/dispnv50/disp.c
drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/dp.h
drivers/gpu/drm/nouveau/nvkm/subdev/bios/dp.c

index 006562f7f23e724722226280799c401a1f80c2ee..eaa63b43282bf70b70ed7588b9ffa747b09315c0 100644 (file)
@@ -52,6 +52,8 @@
 #include "nouveau_fence.h"
 #include "nouveau_fbcon.h"
 
+#include <subdev/bios/dp.h>
+
 /******************************************************************************
  * Atomic state
  *****************************************************************************/
@@ -1383,9 +1385,12 @@ nv50_sor_create(struct drm_connector *connector, struct dcb_output *dcbe)
 {
        struct nouveau_connector *nv_connector = nouveau_connector(connector);
        struct nouveau_drm *drm = nouveau_drm(connector->dev);
+       struct nvkm_bios *bios = nvxx_bios(&drm->client.device);
        struct nvkm_i2c *i2c = nvxx_i2c(&drm->client.device);
        struct nouveau_encoder *nv_encoder;
        struct drm_encoder *encoder;
+       u8 ver, hdr, cnt, len;
+       u32 data;
        int type, ret;
 
        switch (dcbe->type) {
@@ -1429,8 +1434,8 @@ nv50_sor_create(struct drm_connector *connector, struct dcb_output *dcbe)
                        nv_encoder->aux = aux;
                }
 
-               /*TODO: Use DP Info Table to check for support. */
-               if (disp->disp->object.oclass >= GF110_DISP) {
+               if ((data = nvbios_dp_table(bios, &ver, &hdr, &cnt, &len)) &&
+                   ver >= 0x40 && (nvbios_rd08(bios, data + 0x08) & 0x04)) {
                        ret = nv50_mstm_new(nv_encoder, &nv_connector->aux, 16,
                                            nv_connector->base.base.id,
                                            &nv_encoder->dp.mstm);
index df34b41838d60090d85e2fdf1aecc976abffb288..512e25a41803b0be1b55f93baacb103da3c7e332 100644 (file)
@@ -1,6 +1,10 @@
 /* SPDX-License-Identifier: GPL-2.0 */
 #ifndef __NVBIOS_DP_H__
 #define __NVBIOS_DP_H__
+
+u16
+nvbios_dp_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len);
+
 struct nvbios_dpout {
        u16 type;
        u16 mask;
index 7c7efa4ea0d0edb391a27db2c6e99179799070f1..3133b28f849c7df94f957ed71b72bf55720564bc 100644 (file)
@@ -25,7 +25,7 @@
 #include <subdev/bios/bit.h>
 #include <subdev/bios/dp.h>
 
-static u16
+u16
 nvbios_dp_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
 {
        struct bit_entry d;