#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)
{
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 */
}
}
-#define RING_SKIPS 8
-
#define READ_GET() ((NV_READ(dchan->chan->get) - \
dchan->chan->pushbuf_base) >> 2)
#define WRITE_PUT(val) do { \
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;
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