drm/nv10: introduce a new NV_11 card type
authorIlia Mirkin <imirkin@alum.mit.edu>
Thu, 5 Sep 2013 08:45:02 +0000 (04:45 -0400)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 8 Nov 2013 05:37:35 +0000 (15:37 +1000)
NV11/17/1F/18 come after NV10/15/16/1A. In order to facilitate using
numerical comparisons, split up the two sets into different card types.

This change should be a no-op except that the relevant cards will see
NV11 printed instead of NV10 for the family.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/core/engine/device/base.c
drivers/gpu/drm/nouveau/core/include/core/device.h
drivers/gpu/drm/nouveau/core/subdev/bios/pll.c
drivers/gpu/drm/nouveau/dispnv04/hw.c
drivers/gpu/drm/nouveau/nouveau_abi16.c
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nouveau_connector.c

index 1407d80b910cd4816fdb5dff1bcfd7b59052cf70..f8b4fbf5588924c9ed8f1d19c736256567def29d 100644 (file)
@@ -161,7 +161,13 @@ nouveau_devobj_ctor(struct nouveau_object *parent,
                if ((boot0 & 0x0f000000) > 0) {
                        device->chipset = (boot0 & 0xff00000) >> 20;
                        switch (device->chipset & 0xf0) {
-                       case 0x10: device->card_type = NV_10; break;
+                       case 0x10: {
+                               if (0x461 & (1 << (device->chipset & 0xf)))
+                                       device->card_type = NV_10;
+                               else
+                                       device->card_type = NV_11;
+                               break;
+                       }
                        case 0x20: device->card_type = NV_20; break;
                        case 0x30: device->card_type = NV_30; break;
                        case 0x40:
@@ -188,7 +194,8 @@ nouveau_devobj_ctor(struct nouveau_object *parent,
 
                switch (device->card_type) {
                case NV_04: ret = nv04_identify(device); break;
-               case NV_10: ret = nv10_identify(device); break;
+               case NV_10:
+               case NV_11: ret = nv10_identify(device); break;
                case NV_20: ret = nv20_identify(device); break;
                case NV_30: ret = nv30_identify(device); break;
                case NV_40: ret = nv40_identify(device); break;
index 0a1698faeff33a2764b7ce18596ddb3949c3d9a0..40c6dcf6ff632025ecb6945bdd4aac069bd44257 100644 (file)
@@ -72,6 +72,7 @@ struct nouveau_device {
        enum {
                NV_04    = 0x04,
                NV_10    = 0x10,
+               NV_11    = 0x11,
                NV_20    = 0x20,
                NV_30    = 0x30,
                NV_40    = 0x40,
index f835501203e552abb29b68425cb5b0a9b37e6bec..1f76de597d4bf17ea81c683c67a716f824ece15e 100644 (file)
@@ -114,6 +114,7 @@ pll_map(struct nouveau_bios *bios)
        switch (nv_device(bios)->card_type) {
        case NV_04:
        case NV_10:
+       case NV_11:
        case NV_20:
        case NV_30:
                return nv04_pll_mapping;
index f8dee834527fb621c107f9e01d6a7ec546535332..3d51ae9070f8bcd333a856e968fc09918667e4a0 100644 (file)
@@ -740,7 +740,7 @@ nv_load_state_ext(struct drm_device *dev, int head,
        }
        /* NV11 and NV20 stop at 0x52. */
        if (nv_gf4_disp_arch(dev)) {
-               if (nv_device(drm->device)->card_type == NV_10) {
+               if (nv_device(drm->device)->card_type < NV_20) {
                        /* Not waiting for vertical retrace before modifying
                           CRE_53/CRE_54 causes lockups. */
                        nouveau_timer_wait_eq(ptimer, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x8);
index 72055a35f8459aa2aee9e02218ad1c2f01722704..3621e7f23477da53b7af04edc60af11fe6f5d1ee 100644 (file)
@@ -87,6 +87,7 @@ nouveau_abi16_swclass(struct nouveau_drm *drm)
        case NV_04:
                return 0x006e;
        case NV_10:
+       case NV_11:
        case NV_20:
        case NV_30:
        case NV_40:
index c28a5a9ff053cc00f69d73d5cb4e59c135335818..949ab0cbc4aba904c9d692c15c998b19b9589a3c 100644 (file)
@@ -269,7 +269,8 @@ set_placement_range(struct nouveau_bo *nvbo, uint32_t type)
        struct nouveau_fb *pfb = nouveau_fb(drm->device);
        u32 vram_pages = pfb->ram->size >> PAGE_SHIFT;
 
-       if (nv_device(drm->device)->card_type == NV_10 &&
+       if ((nv_device(drm->device)->card_type == NV_10 ||
+            nv_device(drm->device)->card_type == NV_11) &&
            nvbo->tile_mode && (type & TTM_PL_FLAG_VRAM) &&
            nvbo->bo.mem.num_pages < vram_pages / 4) {
                /*
index 1aa682494a18920876ad6f8927cc1c27375a3535..1674882d60d5e842547e420f1baf48a13d534e66 100644 (file)
@@ -215,9 +215,10 @@ nouveau_connector_set_encoder(struct drm_connector *connector,
        } else {
                connector->doublescan_allowed = true;
                if (nv_device(drm->device)->card_type == NV_20 ||
-                  (nv_device(drm->device)->card_type == NV_10 &&
-                   (dev->pdev->device & 0x0ff0) != 0x0100 &&
-                   (dev->pdev->device & 0x0ff0) != 0x0150))
+                   ((nv_device(drm->device)->card_type == NV_10 ||
+                     nv_device(drm->device)->card_type == NV_11) &&
+                    (dev->pdev->device & 0x0ff0) != 0x0100 &&
+                    (dev->pdev->device & 0x0ff0) != 0x0150))
                        /* HW is broken */
                        connector->interlace_allowed = false;
                else