diff options
author | Ben Skeggs <skeggsb@gmail.com> | 2007-08-08 12:28:20 +1000 |
---|---|---|
committer | Ben Skeggs <skeggsb@gmail.com> | 2007-08-08 12:28:20 +1000 |
commit | 096a2a556016c609ad0200ea4592ceb42a347a1d (patch) | |
tree | ecdac17a96f9dcdae0d05d241c1865bf5a14b975 /src/nv_dma.c | |
parent | 94da101b675916aeaf751df28bea4af67b2bb175 (diff) | |
parent | 9cb4c95a4fbf38fcb8249e765ff71b2e24912244 (diff) | |
download | xorg-driver-xf86-video-nouveau-randr-1.2.tar.gz |
Merge branch 'upstream-master' into upstream-randr-1.2randr-1.2
Conflicts:
src/nv_dma.c
src/nv_dma.h
src/nv_exa.c
Diffstat (limited to 'src/nv_dma.c')
-rw-r--r-- | src/nv_dma.c | 76 |
1 files changed, 51 insertions, 25 deletions
diff --git a/src/nv_dma.c b/src/nv_dma.c index cacfbc1..d65f802 100644 --- a/src/nv_dma.c +++ b/src/nv_dma.c @@ -16,6 +16,45 @@ void NVDmaKickoffCallback(NVPtr pNv) pNv->DMAKickoffCallback = NULL; } +static uint32_t subchannels[8]; + +void NVDmaStart(NVPtr pNv, uint32_t object, uint32_t tag, int size) +{ + int subchannel=-1; + int i; + /* XXX FIXME */ + ScrnInfoPtr pScrn = xf86Screens[0]; + + /* look for a subchannel already bound to that object */ + for(i=0;i<8;i++) + { + if (subchannels[i]==object) + { + subchannel=i; + break; + } + } + + /* add 2 for the potential subchannel binding */ + if((pNv)->dmaFree <= (size + 2)) + NVDmaWait(pScrn, size + 2); + + if (subchannel==-1) + { + /* bind the object */ + subchannel=rand()%8; + subchannels[subchannel]=object; + NVDEBUG("Bind object %x on subchannel %d\n", (object), (subchannel)); + NVDmaNext(pNv, (1<<18) | (subchannel<<13)); + NVDmaNext(pNv,object); + pNv->dmaFree -= (2); + } + NVDEBUG("NVDmaStart: subc=%d, cmd=%x, num=%d\n", (subchannel), (tag), (size)); + NVDmaNext(pNv, ((size) << 18) | ((subchannel) << 13) | (tag)); + pNv->dmaFree -= ((size) + 1); +} + + /* There is a HW race condition with videoram command buffers. * You can't jump to the location of your put offset. We write put * at the jump offset + SKIPS dwords with noop padding in between @@ -92,7 +131,7 @@ void NVSync(ScrnInfoPtr pScrn) { NVPtr pNv = NVPTR(pScrn); int t_start, timeout = 2000; - int subc; + int grobj; if(pNv->NoAccel) return; @@ -110,11 +149,11 @@ void NVSync(ScrnInfoPtr pScrn) } /* Wait for channel to go completely idle */ - subc = (pNv->Architecture >= NV_ARCH_50) ? NvSub2D : NvSubImageBlit; + grobj = (pNv->Architecture >= NV_ARCH_50) ? Nv2D : NvImageBlit; NVNotifierReset(pScrn, pNv->Notifier0); - NVDmaStart(pNv, subc, 0x104, 1); + NVDmaStart(pNv, grobj, 0x104, 1); NVDmaNext (pNv, 0); - NVDmaStart(pNv, subc, 0x100, 1); + NVDmaStart(pNv, grobj, 0x100, 1); NVDmaNext (pNv, 0); NVDmaKickoff(pNv); if (!NVNotifierWaitStatus(pScrn, pNv->Notifier0, 0, timeout)) @@ -146,26 +185,13 @@ void NVResetGraphics(ScrnInfoPtr pScrn) pNv->dmaFree -= SKIPS; #endif - NVAccelCommonInit(pScrn); + for(i=0;i<8;i++) + subchannels[i]=0; if (pNv->Architecture >= NV_ARCH_50) return; - /* EXA + XAA + Xv */ - NVDmaSetObjectOnSubchannel(pNv, NvSubContextSurfaces, NvContextSurfaces); - NVDmaSetObjectOnSubchannel(pNv, NvSubRectangle , NvRectangle ); - NVDmaSetObjectOnSubchannel(pNv, NvSubScaledImage , NvScaledImage ); - /* EXA + XAA */ - NVDmaSetObjectOnSubchannel(pNv, NvSubRop , NvRop ); - NVDmaSetObjectOnSubchannel(pNv, NvSubImagePattern, NvImagePattern ); - NVDmaSetObjectOnSubchannel(pNv, NvSubImageBlit , NvImageBlit ); - if (pNv->useEXA) { - if (pNv->GARTScratch) - NVDmaSetObjectOnSubchannel(pNv, NvSubMemFormat, NvMemFormat); - } else if (!pNv->useEXA) { - NVDmaSetObjectOnSubchannel(pNv, NvSubClipRectangle, NvClipRectangle); - NVDmaSetObjectOnSubchannel(pNv, NvSubSolidLine, NvSolidLine); - } + NVAccelCommonInit(pScrn); switch(pNv->CurrentLayout.depth) { case 24: @@ -189,20 +215,20 @@ void NVResetGraphics(ScrnInfoPtr pScrn) break; } - NVDmaStart(pNv, NvSubContextSurfaces, SURFACE_FORMAT, 4); + NVDmaStart(pNv, NvContextSurfaces, SURFACE_FORMAT, 4); NVDmaNext (pNv, surfaceFormat); NVDmaNext (pNv, pitch | (pitch << 16)); NVDmaNext (pNv, (uint32_t)pNv->FB->offset); NVDmaNext (pNv, (uint32_t)pNv->FB->offset); - NVDmaStart(pNv, NvSubImagePattern, PATTERN_FORMAT, 1); + NVDmaStart(pNv, NvImagePattern, PATTERN_FORMAT, 1); NVDmaNext (pNv, patternFormat); - NVDmaStart(pNv, NvSubRectangle, RECT_FORMAT, 1); + NVDmaStart(pNv, NvRectangle, RECT_FORMAT, 1); NVDmaNext (pNv, rectFormat); if (!pNv->useEXA) { - NVDmaStart(pNv, NvSubSolidLine, LINE_FORMAT, 1); + NVDmaStart(pNv, NvSolidLine, LINE_FORMAT, 1); NVDmaNext (pNv, lineFormat); } @@ -268,7 +294,7 @@ Bool NVInitDma(ScrnInfoPtr pScrn) pNv->fifo.fb_ctxdma_handle = NvDmaFB; pNv->fifo.tt_ctxdma_handle = NvDmaTT; - ret = drmCommandWriteRead(pNv->drm_fd, DRM_NOUVEAU_FIFO_ALLOC, + ret = drmCommandWriteRead(pNv->drm_fd, DRM_NOUVEAU_CHANNEL_ALLOC, &pNv->fifo, sizeof(pNv->fifo)); if (ret) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, |