Merge branch 'kvm-updates/2.6.39' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[pandora-kernel.git] / drivers / gpu / drm / nouveau / nv50_graph.c
index 37e21d2..8675b00 100644 (file)
@@ -95,13 +95,41 @@ nv50_graph_init_regs__nv(struct drm_device *dev)
 }
 
 static void
-nv50_graph_init_regs(struct drm_device *dev)
+nv50_graph_init_zcull(struct drm_device *dev)
 {
+       struct drm_nouveau_private *dev_priv = dev->dev_private;
+       int i;
+
        NV_DEBUG(dev, "\n");
 
-       nv_wr32(dev, NV04_PGRAPH_DEBUG_3,
-                               (1 << 2) /* HW_CONTEXT_SWITCH_ENABLED */);
-       nv_wr32(dev, 0x402ca8, 0x800);
+       switch (dev_priv->chipset & 0xf0) {
+       case 0x50:
+       case 0x80:
+       case 0x90:
+               nv_wr32(dev, 0x402ca8, 0x00000800);
+               break;
+       case 0xa0:
+       default:
+               nv_wr32(dev, 0x402cc0, 0x00000000);
+               if (dev_priv->chipset == 0xa0 ||
+                   dev_priv->chipset == 0xaa ||
+                   dev_priv->chipset == 0xac) {
+                       nv_wr32(dev, 0x402ca8, 0x00000802);
+               } else {
+                       nv_wr32(dev, 0x402cc0, 0x00000000);
+                       nv_wr32(dev, 0x402ca8, 0x00000002);
+               }
+
+               break;
+       }
+
+       /* zero out zcull regions */
+       for (i = 0; i < 8; i++) {
+               nv_wr32(dev, 0x402c20 + (i * 8), 0x00000000);
+               nv_wr32(dev, 0x402c24 + (i * 8), 0x00000000);
+               nv_wr32(dev, 0x402c28 + (i * 8), 0x00000000);
+               nv_wr32(dev, 0x402c2c + (i * 8), 0x00000000);
+       }
 }
 
 static int
@@ -136,6 +164,7 @@ nv50_graph_init_ctxctl(struct drm_device *dev)
        }
        kfree(cp);
 
+       nv_wr32(dev, 0x40008c, 0x00000004); /* HW_CTX_SWITCH_ENABLED */
        nv_wr32(dev, 0x400320, 4);
        nv_wr32(dev, NV40_PGRAPH_CTXCTL_CUR, 0);
        nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_POINTER, 0);
@@ -151,7 +180,7 @@ nv50_graph_init(struct drm_device *dev)
 
        nv50_graph_init_reset(dev);
        nv50_graph_init_regs__nv(dev);
-       nv50_graph_init_regs(dev);
+       nv50_graph_init_zcull(dev);
 
        ret = nv50_graph_init_ctxctl(dev);
        if (ret)
@@ -409,12 +438,7 @@ static int
 nv50_graph_nvsw_mthd_page_flip(struct nouveau_channel *chan,
                               u32 class, u32 mthd, u32 data)
 {
-       struct nouveau_page_flip_state s;
-
-       if (!nouveau_finish_page_flip(chan, &s)) {
-               /* XXX - Do something here */
-       }
-
+       nouveau_finish_page_flip(chan, NULL);
        return 0;
 }
 
@@ -526,11 +550,11 @@ nv86_graph_tlb_flush(struct drm_device *dev)
 
 static struct nouveau_enum nv50_mp_exec_error_names[] =
 {
-       { 3, "STACK_UNDERFLOW" },
-       { 4, "QUADON_ACTIVE" },
-       { 8, "TIMEOUT" },
-       { 0x10, "INVALID_OPCODE" },
-       { 0x40, "BREAKPOINT" },
+       { 3, "STACK_UNDERFLOW", NULL },
+       { 4, "QUADON_ACTIVE", NULL },
+       { 8, "TIMEOUT", NULL },
+       { 0x10, "INVALID_OPCODE", NULL },
+       { 0x40, "BREAKPOINT", NULL },
        {}
 };
 
@@ -558,47 +582,47 @@ static struct nouveau_bitfield nv50_graph_trap_ccache[] = {
 
 /* There must be a *lot* of these. Will take some time to gather them up. */
 struct nouveau_enum nv50_data_error_names[] = {
-       { 0x00000003, "INVALID_QUERY_OR_TEXTURE" },
-       { 0x00000004, "INVALID_VALUE" },
-       { 0x00000005, "INVALID_ENUM" },
-       { 0x00000008, "INVALID_OBJECT" },
-       { 0x00000009, "READ_ONLY_OBJECT" },
-       { 0x0000000a, "SUPERVISOR_OBJECT" },
-       { 0x0000000b, "INVALID_ADDRESS_ALIGNMENT" },
-       { 0x0000000c, "INVALID_BITFIELD" },
-       { 0x0000000d, "BEGIN_END_ACTIVE" },
-       { 0x0000000e, "SEMANTIC_COLOR_BACK_OVER_LIMIT" },
-       { 0x0000000f, "VIEWPORT_ID_NEEDS_GP" },
-       { 0x00000010, "RT_DOUBLE_BIND" },
-       { 0x00000011, "RT_TYPES_MISMATCH" },
-       { 0x00000012, "RT_LINEAR_WITH_ZETA" },
-       { 0x00000015, "FP_TOO_FEW_REGS" },
-       { 0x00000016, "ZETA_FORMAT_CSAA_MISMATCH" },
-       { 0x00000017, "RT_LINEAR_WITH_MSAA" },
-       { 0x00000018, "FP_INTERPOLANT_START_OVER_LIMIT" },
-       { 0x00000019, "SEMANTIC_LAYER_OVER_LIMIT" },
-       { 0x0000001a, "RT_INVALID_ALIGNMENT" },
-       { 0x0000001b, "SAMPLER_OVER_LIMIT" },
-       { 0x0000001c, "TEXTURE_OVER_LIMIT" },
-       { 0x0000001e, "GP_TOO_MANY_OUTPUTS" },
-       { 0x0000001f, "RT_BPP128_WITH_MS8" },
-       { 0x00000021, "Z_OUT_OF_BOUNDS" },
-       { 0x00000023, "XY_OUT_OF_BOUNDS" },
-       { 0x00000027, "CP_MORE_PARAMS_THAN_SHARED" },
-       { 0x00000028, "CP_NO_REG_SPACE_STRIPED" },
-       { 0x00000029, "CP_NO_REG_SPACE_PACKED" },
-       { 0x0000002a, "CP_NOT_ENOUGH_WARPS" },
-       { 0x0000002b, "CP_BLOCK_SIZE_MISMATCH" },
-       { 0x0000002c, "CP_NOT_ENOUGH_LOCAL_WARPS" },
-       { 0x0000002d, "CP_NOT_ENOUGH_STACK_WARPS" },
-       { 0x0000002e, "CP_NO_BLOCKDIM_LATCH" },
-       { 0x00000031, "ENG2D_FORMAT_MISMATCH" },
-       { 0x0000003f, "PRIMITIVE_ID_NEEDS_GP" },
-       { 0x00000044, "SEMANTIC_VIEWPORT_OVER_LIMIT" },
-       { 0x00000045, "SEMANTIC_COLOR_FRONT_OVER_LIMIT" },
-       { 0x00000046, "LAYER_ID_NEEDS_GP" },
-       { 0x00000047, "SEMANTIC_CLIP_OVER_LIMIT" },
-       { 0x00000048, "SEMANTIC_PTSZ_OVER_LIMIT" },
+       { 0x00000003, "INVALID_QUERY_OR_TEXTURE", NULL },
+       { 0x00000004, "INVALID_VALUE", NULL },
+       { 0x00000005, "INVALID_ENUM", NULL },
+       { 0x00000008, "INVALID_OBJECT", NULL },
+       { 0x00000009, "READ_ONLY_OBJECT", NULL },
+       { 0x0000000a, "SUPERVISOR_OBJECT", NULL },
+       { 0x0000000b, "INVALID_ADDRESS_ALIGNMENT", NULL },
+       { 0x0000000c, "INVALID_BITFIELD", NULL },
+       { 0x0000000d, "BEGIN_END_ACTIVE", NULL },
+       { 0x0000000e, "SEMANTIC_COLOR_BACK_OVER_LIMIT", NULL },
+       { 0x0000000f, "VIEWPORT_ID_NEEDS_GP", NULL },
+       { 0x00000010, "RT_DOUBLE_BIND", NULL },
+       { 0x00000011, "RT_TYPES_MISMATCH", NULL },
+       { 0x00000012, "RT_LINEAR_WITH_ZETA", NULL },
+       { 0x00000015, "FP_TOO_FEW_REGS", NULL },
+       { 0x00000016, "ZETA_FORMAT_CSAA_MISMATCH", NULL },
+       { 0x00000017, "RT_LINEAR_WITH_MSAA", NULL },
+       { 0x00000018, "FP_INTERPOLANT_START_OVER_LIMIT", NULL },
+       { 0x00000019, "SEMANTIC_LAYER_OVER_LIMIT", NULL },
+       { 0x0000001a, "RT_INVALID_ALIGNMENT", NULL },
+       { 0x0000001b, "SAMPLER_OVER_LIMIT", NULL },
+       { 0x0000001c, "TEXTURE_OVER_LIMIT", NULL },
+       { 0x0000001e, "GP_TOO_MANY_OUTPUTS", NULL },
+       { 0x0000001f, "RT_BPP128_WITH_MS8", NULL },
+       { 0x00000021, "Z_OUT_OF_BOUNDS", NULL },
+       { 0x00000023, "XY_OUT_OF_BOUNDS", NULL },
+       { 0x00000027, "CP_MORE_PARAMS_THAN_SHARED", NULL },
+       { 0x00000028, "CP_NO_REG_SPACE_STRIPED", NULL },
+       { 0x00000029, "CP_NO_REG_SPACE_PACKED", NULL },
+       { 0x0000002a, "CP_NOT_ENOUGH_WARPS", NULL },
+       { 0x0000002b, "CP_BLOCK_SIZE_MISMATCH", NULL },
+       { 0x0000002c, "CP_NOT_ENOUGH_LOCAL_WARPS", NULL },
+       { 0x0000002d, "CP_NOT_ENOUGH_STACK_WARPS", NULL },
+       { 0x0000002e, "CP_NO_BLOCKDIM_LATCH", NULL },
+       { 0x00000031, "ENG2D_FORMAT_MISMATCH", NULL },
+       { 0x0000003f, "PRIMITIVE_ID_NEEDS_GP", NULL },
+       { 0x00000044, "SEMANTIC_VIEWPORT_OVER_LIMIT", NULL },
+       { 0x00000045, "SEMANTIC_COLOR_FRONT_OVER_LIMIT", NULL },
+       { 0x00000046, "LAYER_ID_NEEDS_GP", NULL },
+       { 0x00000047, "SEMANTIC_CLIP_OVER_LIMIT", NULL },
+       { 0x00000048, "SEMANTIC_PTSZ_OVER_LIMIT", NULL },
        {}
 };
 
@@ -678,7 +702,6 @@ nv50_pgraph_tp_trap(struct drm_device *dev, int type, uint32_t ustatus_old,
                tps++;
                switch (type) {
                case 6: /* texture error... unknown for now */
-                       nv50_fb_vm_trap(dev, display, name);
                        if (display) {
                                NV_ERROR(dev, "magic set %d:\n", i);
                                for (r = ustatus_addr + 4; r <= ustatus_addr + 0x10; r += 4)
@@ -701,7 +724,6 @@ nv50_pgraph_tp_trap(struct drm_device *dev, int type, uint32_t ustatus_old,
                        uint32_t e1c = nv_rd32(dev, ustatus_addr + 0x14);
                        uint32_t e20 = nv_rd32(dev, ustatus_addr + 0x18);
                        uint32_t e24 = nv_rd32(dev, ustatus_addr + 0x1c);
-                       nv50_fb_vm_trap(dev, display, name);
                        /* 2d engine destination */
                        if (ustatus & 0x00000010) {
                                if (display) {
@@ -912,10 +934,10 @@ nv50_pgraph_trap_handler(struct drm_device *dev, u32 display, u64 inst, u32 chid
                        printk("\n");
                        NV_INFO(dev, "PGRAPH - TRAP_CCACHE %08x %08x %08x %08x"
                                     " %08x %08x %08x\n",
-                               nv_rd32(dev, 0x405800), nv_rd32(dev, 0x405804),
-                               nv_rd32(dev, 0x405808), nv_rd32(dev, 0x40580c),
-                               nv_rd32(dev, 0x405810), nv_rd32(dev, 0x405814),
-                               nv_rd32(dev, 0x40581c));
+                               nv_rd32(dev, 0x405000), nv_rd32(dev, 0x405004),
+                               nv_rd32(dev, 0x405008), nv_rd32(dev, 0x40500c),
+                               nv_rd32(dev, 0x405010), nv_rd32(dev, 0x405014),
+                               nv_rd32(dev, 0x40501c));
 
                }
 
@@ -1044,6 +1066,7 @@ nv50_graph_isr(struct drm_device *dev)
                        NV_INFO(dev, "PGRAPH - ch %d (0x%010llx) subc %d "
                                     "class 0x%04x mthd 0x%04x data 0x%08x\n",
                                chid, inst, subc, class, mthd, data);
+                       nv50_fb_vm_trap(dev, 1);
                }
        }