OSDN Git Service

drm/nouveau/disp/gf119-: avoid creating non-existent heads
authorIlia Mirkin <imirkin@alum.mit.edu>
Mon, 3 Jul 2017 17:06:26 +0000 (13:06 -0400)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 22 Aug 2017 08:04:22 +0000 (18:04 +1000)
We assume that each board has 4 heads for GF119+. However this is not
necessarily true - in the case of a GP108 board, the register indicated
that there were only 2.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101601
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nv50_display.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/headgf119.c

index f7b4326..1449a2c 100644 (file)
@@ -4451,11 +4451,13 @@ nv50_display_create(struct drm_device *dev)
 
        /* create crtc objects to represent the hw heads */
        if (disp->disp->oclass >= GF110_DISP)
-               crtcs = nvif_rd32(&device->object, 0x022448);
+               crtcs = nvif_rd32(&device->object, 0x612004) & 0xf;
        else
-               crtcs = 2;
+               crtcs = 0x3;
 
-       for (i = 0; i < crtcs; i++) {
+       for (i = 0; i < fls(crtcs); i++) {
+               if (!(crtcs & (1 << i)))
+                       continue;
                ret = nv50_head_create(dev, i);
                if (ret)
                        goto out;
index b335527..9fd7ae3 100644 (file)
@@ -92,5 +92,8 @@ gf119_head = {
 int
 gf119_head_new(struct nvkm_disp *disp, int id)
 {
+       struct nvkm_device *device = disp->engine.subdev.device;
+       if (!(nvkm_rd32(device, 0x612004) & (0x00000001 << id)))
+               return 0;
        return nvkm_head_new_(&gf119_head, disp, id);
 }