aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2012-10-07 22:58:23 -0400
committerBen Skeggs <bskeggs@redhat.com>2012-11-28 18:56:38 -0500
commit6c1689a08cf54e58c19eb565528a293f36f731be (patch)
tree53ecbfa8324e13c7a7af4373d2914cf5c90c9d15
parentf86770aaaa9a4d9cc68c8a9adc351ab7f47e6345 (diff)
drm/nouveau/dmaobj: move parent class check to bind() method
Otherwise when nvc0- gains a bind() method (disp needs it), the fifo engine will attempt to create a dma object for the push buffer, which is unnecessary on fermi. The only sane place to put these checks is in the bind method itself, and have it unconditionally called from wherever it might be needed. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/dmaobj/base.c18
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/dmaobj/nv04.c12
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/dmaobj/nv50.c12
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/fifo/base.c8
-rw-r--r--drivers/gpu/drm/nouveau/core/include/engine/dmaobj.h8
5 files changed, 41 insertions, 17 deletions
diff --git a/drivers/gpu/drm/nouveau/core/engine/dmaobj/base.c b/drivers/gpu/drm/nouveau/core/engine/dmaobj/base.c
index 9ca90613306..325b79dd619 100644
--- a/drivers/gpu/drm/nouveau/core/engine/dmaobj/base.c
+++ b/drivers/gpu/drm/nouveau/core/engine/dmaobj/base.c
@@ -88,21 +88,15 @@ nouveau_dmaobj_ctor(struct nouveau_object *parent,
88 88
89 switch (nv_mclass(parent)) { 89 switch (nv_mclass(parent)) {
90 case NV_DEVICE_CLASS: 90 case NV_DEVICE_CLASS:
91 /* delayed, or no, binding */
91 break; 92 break;
92 case NV03_CHANNEL_DMA_CLASS: 93 default:
93 case NV10_CHANNEL_DMA_CLASS:
94 case NV17_CHANNEL_DMA_CLASS:
95 case NV40_CHANNEL_DMA_CLASS:
96 case NV50_CHANNEL_DMA_CLASS:
97 case NV84_CHANNEL_DMA_CLASS:
98 case NV50_CHANNEL_IND_CLASS:
99 case NV84_CHANNEL_IND_CLASS:
100 ret = dmaeng->bind(dmaeng, *pobject, dmaobj, &gpuobj); 94 ret = dmaeng->bind(dmaeng, *pobject, dmaobj, &gpuobj);
101 nouveau_object_ref(NULL, pobject); 95 if (ret == 0) {
102 *pobject = nv_object(gpuobj); 96 nouveau_object_ref(NULL, pobject);
97 *pobject = nv_object(gpuobj);
98 }
103 break; 99 break;
104 default:
105 return -EINVAL;
106 } 100 }
107 101
108 return ret; 102 return ret;
diff --git a/drivers/gpu/drm/nouveau/core/engine/dmaobj/nv04.c b/drivers/gpu/drm/nouveau/core/engine/dmaobj/nv04.c
index 89238732766..027d8217c0f 100644
--- a/drivers/gpu/drm/nouveau/core/engine/dmaobj/nv04.c
+++ b/drivers/gpu/drm/nouveau/core/engine/dmaobj/nv04.c
@@ -49,6 +49,18 @@ nv04_dmaobj_bind(struct nouveau_dmaeng *dmaeng,
49 u32 length = dmaobj->limit - dmaobj->start; 49 u32 length = dmaobj->limit - dmaobj->start;
50 int ret; 50 int ret;
51 51
52 if (!nv_iclass(parent, NV_ENGCTX_CLASS)) {
53 switch (nv_mclass(parent->parent)) {
54 case NV03_CHANNEL_DMA_CLASS:
55 case NV10_CHANNEL_DMA_CLASS:
56 case NV17_CHANNEL_DMA_CLASS:
57 case NV40_CHANNEL_DMA_CLASS:
58 break;
59 default:
60 return -EINVAL;
61 }
62 }
63
52 if (dmaobj->target == NV_MEM_TARGET_VM) { 64 if (dmaobj->target == NV_MEM_TARGET_VM) {
53 if (nv_object(vmm)->oclass == &nv04_vmmgr_oclass) { 65 if (nv_object(vmm)->oclass == &nv04_vmmgr_oclass) {
54 struct nouveau_gpuobj *pgt = vmm->vm->pgt[0].obj[0]; 66 struct nouveau_gpuobj *pgt = vmm->vm->pgt[0].obj[0];
diff --git a/drivers/gpu/drm/nouveau/core/engine/dmaobj/nv50.c b/drivers/gpu/drm/nouveau/core/engine/dmaobj/nv50.c
index 58876f53b3a..3dab016b6fe 100644
--- a/drivers/gpu/drm/nouveau/core/engine/dmaobj/nv50.c
+++ b/drivers/gpu/drm/nouveau/core/engine/dmaobj/nv50.c
@@ -41,6 +41,18 @@ nv50_dmaobj_bind(struct nouveau_dmaeng *dmaeng,
41 u32 flags = nv_mclass(dmaobj); 41 u32 flags = nv_mclass(dmaobj);
42 int ret; 42 int ret;
43 43
44 if (!nv_iclass(parent, NV_ENGCTX_CLASS)) {
45 switch (nv_mclass(parent->parent)) {
46 case NV50_CHANNEL_DMA_CLASS:
47 case NV84_CHANNEL_DMA_CLASS:
48 case NV50_CHANNEL_IND_CLASS:
49 case NV84_CHANNEL_IND_CLASS:
50 break;
51 default:
52 return -EINVAL;
53 }
54 }
55
44 switch (dmaobj->target) { 56 switch (dmaobj->target) {
45 case NV_MEM_TARGET_VM: 57 case NV_MEM_TARGET_VM:
46 flags |= 0x00000000; 58 flags |= 0x00000000;
diff --git a/drivers/gpu/drm/nouveau/core/engine/fifo/base.c b/drivers/gpu/drm/nouveau/core/engine/fifo/base.c
index 0d45e845a8f..ca4050c6ea5 100644
--- a/drivers/gpu/drm/nouveau/core/engine/fifo/base.c
+++ b/drivers/gpu/drm/nouveau/core/engine/fifo/base.c
@@ -24,6 +24,7 @@
24 24
25#include <core/object.h> 25#include <core/object.h>
26#include <core/handle.h> 26#include <core/handle.h>
27#include <core/class.h>
27 28
28#include <engine/dmaobj.h> 29#include <engine/dmaobj.h>
29#include <engine/fifo.h> 30#include <engine/fifo.h>
@@ -56,15 +57,16 @@ nouveau_fifo_channel_create_(struct nouveau_object *parent,
56 57
57 dmaeng = (void *)chan->pushdma->base.engine; 58 dmaeng = (void *)chan->pushdma->base.engine;
58 switch (chan->pushdma->base.oclass->handle) { 59 switch (chan->pushdma->base.oclass->handle) {
59 case 0x0002: 60 case NV_DMA_FROM_MEMORY_CLASS:
60 case 0x003d: 61 case NV_DMA_IN_MEMORY_CLASS:
61 break; 62 break;
62 default: 63 default:
63 return -EINVAL; 64 return -EINVAL;
64 } 65 }
65 66
66 if (dmaeng->bind) { 67 if (dmaeng->bind) {
67 ret = dmaeng->bind(dmaeng, parent, chan->pushdma, &chan->pushgpu); 68 ret = dmaeng->bind(dmaeng, parent, chan->pushdma,
69 &chan->pushgpu);
68 if (ret) 70 if (ret)
69 return ret; 71 return ret;
70 } 72 }
diff --git a/drivers/gpu/drm/nouveau/core/include/engine/dmaobj.h b/drivers/gpu/drm/nouveau/core/include/engine/dmaobj.h
index f61d1a8f5c1..a0b102680d8 100644
--- a/drivers/gpu/drm/nouveau/core/include/engine/dmaobj.h
+++ b/drivers/gpu/drm/nouveau/core/include/engine/dmaobj.h
@@ -16,8 +16,12 @@ struct nouveau_dmaobj {
16 16
17struct nouveau_dmaeng { 17struct nouveau_dmaeng {
18 struct nouveau_engine base; 18 struct nouveau_engine base;
19 int (*bind)(struct nouveau_dmaeng *, struct nouveau_object *parent, 19
20 struct nouveau_dmaobj *, struct nouveau_gpuobj **); 20 /* creates a "physical" dma object from a struct nouveau_dmaobj */
21 int (*bind)(struct nouveau_dmaeng *dmaeng,
22 struct nouveau_object *parent,
23 struct nouveau_dmaobj *dmaobj,
24 struct nouveau_gpuobj **);
21}; 25};
22 26
23#define nouveau_dmaeng_create(p,e,c,d) \ 27#define nouveau_dmaeng_create(p,e,c,d) \