summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Skeggs <skeggsb@gmail.com>2007-11-14 05:36:20 +1100
committerBen Skeggs <skeggsb@gmail.com>2007-11-14 05:36:20 +1100
commit2d7eb4434f50ab190b530a7ef23e4a361092a33d (patch)
tree650efda8c3318991469888cc7078cd3c197ac8f3
parent7e4bb6099a492b90374565aa574ba65f19ae2ab2 (diff)
nouveau: Also wait until CACHE1 gets emptied.
-rw-r--r--shared-core/nouveau_fifo.c8
-rw-r--r--shared-core/nouveau_reg.h1
2 files changed, 8 insertions, 1 deletions
diff --git a/shared-core/nouveau_fifo.c b/shared-core/nouveau_fifo.c
index 3c993f3e..d00f1938 100644
--- a/shared-core/nouveau_fifo.c
+++ b/shared-core/nouveau_fifo.c
@@ -419,7 +419,9 @@ void nouveau_fifo_free(struct nouveau_channel *chan)
/* Give the channel a chance to idle, wait 2s (hopefully) */
t_start = engine->timer.read(dev);
- while (NV_READ(chan->get) != NV_READ(chan->put)) {
+ while (NV_READ(chan->get) != NV_READ(chan->put) ||
+ NV_READ(NV03_PFIFO_CACHE1_GET) !=
+ NV_READ(NV03_PFIFO_CACHE1_PUT)) {
if (engine->timer.read(dev) - t_start > 2000000000ULL) {
DRM_ERROR("Failed to idle channel %d before destroy."
"Prepare for strangeness..\n", chan->id);
@@ -427,6 +429,10 @@ void nouveau_fifo_free(struct nouveau_channel *chan)
}
}
+ /*XXX: Maybe should wait for PGRAPH to finish with the stuff it fetched
+ * from CACHE1 too?
+ */
+
/* disable the fifo caches */
NV_WRITE(NV03_PFIFO_CACHES, 0x00000000);
NV_WRITE(NV04_PFIFO_CACHE1_DMA_PUSH, NV_READ(NV04_PFIFO_CACHE1_DMA_PUSH)&(~0x1));
diff --git a/shared-core/nouveau_reg.h b/shared-core/nouveau_reg.h
index bc71e5f8..7ac02f4a 100644
--- a/shared-core/nouveau_reg.h
+++ b/shared-core/nouveau_reg.h
@@ -435,6 +435,7 @@
#define NV03_PFIFO_CACHE1_PUSH1_CHID_MASK 0x0000000f
#define NV10_PFIFO_CACHE1_PUSH1_CHID_MASK 0x0000001f
#define NV50_PFIFO_CACHE1_PUSH1_CHID_MASK 0x0000007f
+#define NV03_PFIFO_CACHE1_PUT 0x00003210
#define NV04_PFIFO_CACHE1_DMA_PUSH 0x00003220
#define NV04_PFIFO_CACHE1_DMA_FETCH 0x00003224
# define NV_PFIFO_CACHE1_DMA_FETCH_TRIG_8_BYTES 0x00000000