summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaarten Maathuis <madman2003@gmail.com>2008-02-22 13:35:13 +0100
committerMaarten Maathuis <madman2003@gmail.com>2008-02-22 19:28:54 +0100
commit7e5f9c8bd33c503fef9bea20b955a5a48e255621 (patch)
tree12dfd34aa0e95581c8d104b24148e32b1aba7be9
parentb7086e6ae5632ad3c0f7c54ffd641519959d84a6 (diff)
nouveau: A single define of dma skips is more than enough.
-rw-r--r--shared-core/nouveau_dma.c29
-rw-r--r--shared-core/nouveau_drm.h6
2 files changed, 17 insertions, 18 deletions
diff --git a/shared-core/nouveau_dma.c b/shared-core/nouveau_dma.c
index dff786d4..e519dc4e 100644
--- a/shared-core/nouveau_dma.c
+++ b/shared-core/nouveau_dma.c
@@ -29,11 +29,6 @@
#include "nouveau_drv.h"
#include "nouveau_dma.h"
-/* FIXME : should go into a nouveau_drm.h define ?
- * (it's shared between DRI & DDX & DRM)
- */
-#define SKIPS 8
-
int
nouveau_dma_channel_init(struct drm_device *dev)
{
@@ -76,10 +71,10 @@ nouveau_dma_channel_init(struct drm_device *dev)
dchan->cur = dchan->put;
dchan->free = dchan->max - dchan->cur;
- /* Insert NOPS for SKIPS */
- dchan->free -= SKIPS;
- dchan->push_free = SKIPS;
- for (i=0; i<SKIPS; i++)
+ /* Insert NOPS for NOUVEAU_DMA_SKIPS */
+ dchan->free -= NOUVEAU_DMA_SKIPS;
+ dchan->push_free = NOUVEAU_DMA_SKIPS;
+ for (i=0; i < NOUVEAU_DMA_SKIPS; i++)
OUT_RING(0);
/* NV_MEMORY_TO_MEMORY_FORMAT requires a notifier */
@@ -131,8 +126,6 @@ nouveau_dma_channel_takedown(struct drm_device *dev)
}
}
-#define RING_SKIPS 8
-
#define READ_GET() ((NV_READ(dchan->chan->get) - \
dchan->chan->pushbuf_base) >> 2)
#define WRITE_PUT(val) do { \
@@ -156,19 +149,19 @@ nouveau_dma_wait(struct drm_device *dev, int size)
if (dchan->free < size) {
dchan->push_free = 1;
OUT_RING(0x20000000|dchan->chan->pushbuf_base);
- if (get <= RING_SKIPS) {
+ if (get <= NOUVEAU_DMA_SKIPS) {
/*corner case - will be idle*/
- if (dchan->put <= RING_SKIPS)
- WRITE_PUT(RING_SKIPS + 1);
+ if (dchan->put <= NOUVEAU_DMA_SKIPS)
+ WRITE_PUT(NOUVEAU_DMA_SKIPS + 1);
do {
get = READ_GET();
- } while (get <= RING_SKIPS);
+ } while (get <= NOUVEAU_DMA_SKIPS);
}
- WRITE_PUT(RING_SKIPS);
- dchan->cur = dchan->put = RING_SKIPS;
- dchan->free = get - (RING_SKIPS + 1);
+ WRITE_PUT(NOUVEAU_DMA_SKIPS);
+ dchan->cur = dchan->put = NOUVEAU_DMA_SKIPS;
+ dchan->free = get - (NOUVEAU_DMA_SKIPS + 1);
}
} else {
dchan->free = get - dchan->cur - 1;
diff --git a/shared-core/nouveau_drm.h b/shared-core/nouveau_drm.h
index 3bf40089..5f07fcbc 100644
--- a/shared-core/nouveau_drm.h
+++ b/shared-core/nouveau_drm.h
@@ -70,6 +70,12 @@ struct drm_nouveau_gpuobj_free {
uint32_t handle;
};
+/* This is needed to avoid a race condition.
+ * Otherwise you may be writing in the fetch area.
+ * Is this large enough, as it's only 32 bytes, and the maximum fetch size is 256 bytes?
+ */
+#define NOUVEAU_DMA_SKIPS 8
+
#define NOUVEAU_MEM_FB 0x00000001
#define NOUVEAU_MEM_AGP 0x00000002
#define NOUVEAU_MEM_FB_ACCEPTABLE 0x00000004