diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2012-09-26 18:56:24 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2012-10-02 23:13:17 -0400 |
commit | 002d0c735c1bd8bffd3786ad5aadb205a76878fa (patch) | |
tree | e66e49d08d303cf7287de35347e4ce94d33d0083 | |
parent | e5f186c4f9812eccbc291da6dfe8b15da546f961 (diff) |
drm/nv41/vm: fix and enable use of "real" pciegart
Hopefully fixed the tlb flush timeout issue. Was able to observe this
condition occur occasionally, and it appears the binary driver doesn't
wait on the old condition either..
Should give 39-bit DMA addressing on the relevant chipsets.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r-- | drivers/gpu/drm/nouveau/core/subdev/device/nv40.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/subdev/vm/nv41.c | 9 |
2 files changed, 14 insertions, 7 deletions
diff --git a/drivers/gpu/drm/nouveau/core/subdev/device/nv40.c b/drivers/gpu/drm/nouveau/core/subdev/device/nv40.c index 18de4c5b202f..42deadca0f0a 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/device/nv40.c +++ b/drivers/gpu/drm/nouveau/core/subdev/device/nv40.c | |||
@@ -78,7 +78,7 @@ nv40_identify(struct nouveau_device *device) | |||
78 | device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; | 78 | device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; |
79 | device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass; | 79 | device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass; |
80 | device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; | 80 | device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; |
81 | device->oclass[NVDEV_SUBDEV_VM ] = &nv04_vmmgr_oclass; | 81 | device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass; |
82 | device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; | 82 | device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; |
83 | device->oclass[NVDEV_ENGINE_FIFO ] = &nv40_fifo_oclass; | 83 | device->oclass[NVDEV_ENGINE_FIFO ] = &nv40_fifo_oclass; |
84 | device->oclass[NVDEV_ENGINE_SW ] = &nv10_software_oclass; | 84 | device->oclass[NVDEV_ENGINE_SW ] = &nv10_software_oclass; |
@@ -98,7 +98,7 @@ nv40_identify(struct nouveau_device *device) | |||
98 | device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; | 98 | device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; |
99 | device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass; | 99 | device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass; |
100 | device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; | 100 | device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; |
101 | device->oclass[NVDEV_SUBDEV_VM ] = &nv04_vmmgr_oclass; | 101 | device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass; |
102 | device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; | 102 | device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; |
103 | device->oclass[NVDEV_ENGINE_FIFO ] = &nv40_fifo_oclass; | 103 | device->oclass[NVDEV_ENGINE_FIFO ] = &nv40_fifo_oclass; |
104 | device->oclass[NVDEV_ENGINE_SW ] = &nv10_software_oclass; | 104 | device->oclass[NVDEV_ENGINE_SW ] = &nv10_software_oclass; |
@@ -118,7 +118,7 @@ nv40_identify(struct nouveau_device *device) | |||
118 | device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; | 118 | device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; |
119 | device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass; | 119 | device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass; |
120 | device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; | 120 | device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; |
121 | device->oclass[NVDEV_SUBDEV_VM ] = &nv04_vmmgr_oclass; | 121 | device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass; |
122 | device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; | 122 | device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; |
123 | device->oclass[NVDEV_ENGINE_FIFO ] = &nv40_fifo_oclass; | 123 | device->oclass[NVDEV_ENGINE_FIFO ] = &nv40_fifo_oclass; |
124 | device->oclass[NVDEV_ENGINE_SW ] = &nv10_software_oclass; | 124 | device->oclass[NVDEV_ENGINE_SW ] = &nv10_software_oclass; |
@@ -158,7 +158,7 @@ nv40_identify(struct nouveau_device *device) | |||
158 | device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; | 158 | device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; |
159 | device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass; | 159 | device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass; |
160 | device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; | 160 | device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; |
161 | device->oclass[NVDEV_SUBDEV_VM ] = &nv04_vmmgr_oclass; | 161 | device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass; |
162 | device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; | 162 | device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; |
163 | device->oclass[NVDEV_ENGINE_FIFO ] = &nv40_fifo_oclass; | 163 | device->oclass[NVDEV_ENGINE_FIFO ] = &nv40_fifo_oclass; |
164 | device->oclass[NVDEV_ENGINE_SW ] = &nv10_software_oclass; | 164 | device->oclass[NVDEV_ENGINE_SW ] = &nv10_software_oclass; |
@@ -178,7 +178,7 @@ nv40_identify(struct nouveau_device *device) | |||
178 | device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; | 178 | device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; |
179 | device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass; | 179 | device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass; |
180 | device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; | 180 | device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; |
181 | device->oclass[NVDEV_SUBDEV_VM ] = &nv04_vmmgr_oclass; | 181 | device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass; |
182 | device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; | 182 | device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; |
183 | device->oclass[NVDEV_ENGINE_FIFO ] = &nv40_fifo_oclass; | 183 | device->oclass[NVDEV_ENGINE_FIFO ] = &nv40_fifo_oclass; |
184 | device->oclass[NVDEV_ENGINE_SW ] = &nv10_software_oclass; | 184 | device->oclass[NVDEV_ENGINE_SW ] = &nv10_software_oclass; |
@@ -198,7 +198,7 @@ nv40_identify(struct nouveau_device *device) | |||
198 | device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; | 198 | device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; |
199 | device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass; | 199 | device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass; |
200 | device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; | 200 | device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv40_instmem_oclass; |
201 | device->oclass[NVDEV_SUBDEV_VM ] = &nv04_vmmgr_oclass; | 201 | device->oclass[NVDEV_SUBDEV_VM ] = &nv41_vmmgr_oclass; |
202 | device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; | 202 | device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nv04_dmaeng_oclass; |
203 | device->oclass[NVDEV_ENGINE_FIFO ] = &nv40_fifo_oclass; | 203 | device->oclass[NVDEV_ENGINE_FIFO ] = &nv40_fifo_oclass; |
204 | device->oclass[NVDEV_ENGINE_SW ] = &nv10_software_oclass; | 204 | device->oclass[NVDEV_ENGINE_SW ] = &nv10_software_oclass; |
diff --git a/drivers/gpu/drm/nouveau/core/subdev/vm/nv41.c b/drivers/gpu/drm/nouveau/core/subdev/vm/nv41.c index c5486e4bffa6..0203e1e12caa 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/vm/nv41.c +++ b/drivers/gpu/drm/nouveau/core/subdev/vm/nv41.c | |||
@@ -23,6 +23,7 @@ | |||
23 | */ | 23 | */ |
24 | 24 | ||
25 | #include <core/gpuobj.h> | 25 | #include <core/gpuobj.h> |
26 | #include <core/option.h> | ||
26 | 27 | ||
27 | #include <subdev/timer.h> | 28 | #include <subdev/timer.h> |
28 | #include <subdev/vm.h> | 29 | #include <subdev/vm.h> |
@@ -70,7 +71,7 @@ nv41_vm_flush(struct nouveau_vm *vm) | |||
70 | 71 | ||
71 | mutex_lock(&nv_subdev(priv)->mutex); | 72 | mutex_lock(&nv_subdev(priv)->mutex); |
72 | nv_wr32(priv, 0x100810, 0x00000022); | 73 | nv_wr32(priv, 0x100810, 0x00000022); |
73 | if (!nv_wait(priv, 0x100810, 0x00000100, 0x00000100)) { | 74 | if (!nv_wait(priv, 0x100810, 0x00000020, 0x00000020)) { |
74 | nv_warn(priv, "flush timeout, 0x%08x\n", | 75 | nv_warn(priv, "flush timeout, 0x%08x\n", |
75 | nv_rd32(priv, 0x100810)); | 76 | nv_rd32(priv, 0x100810)); |
76 | } | 77 | } |
@@ -87,9 +88,15 @@ nv41_vmmgr_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
87 | struct nouveau_oclass *oclass, void *data, u32 size, | 88 | struct nouveau_oclass *oclass, void *data, u32 size, |
88 | struct nouveau_object **pobject) | 89 | struct nouveau_object **pobject) |
89 | { | 90 | { |
91 | struct nouveau_device *device = nv_device(parent); | ||
90 | struct nv04_vmmgr_priv *priv; | 92 | struct nv04_vmmgr_priv *priv; |
91 | int ret; | 93 | int ret; |
92 | 94 | ||
95 | if (!nouveau_boolopt(device->cfgopt, "NvPCIE", true)) { | ||
96 | return nouveau_object_ctor(parent, engine, &nv04_vmmgr_oclass, | ||
97 | data, size, pobject); | ||
98 | } | ||
99 | |||
93 | ret = nouveau_vmmgr_create(parent, engine, oclass, "PCIEGART", | 100 | ret = nouveau_vmmgr_create(parent, engine, oclass, "PCIEGART", |
94 | "pciegart", &priv); | 101 | "pciegart", &priv); |
95 | *pobject = nv_object(priv); | 102 | *pobject = nv_object(priv); |