nouveau: drm interface changes
authorBen Skeggs <skeggsb@gmail.com>
Wed, 28 Feb 2007 04:31:28 +0000 (15:31 +1100)
committerBen Skeggs <skeggsb@gmail.com>
Wed, 28 Feb 2007 04:31:28 +0000 (15:31 +1100)
src/mesa/drivers/dri/nouveau/nouveau_context.c
src/mesa/drivers/dri/nouveau/nouveau_context.h
src/mesa/drivers/dri/nouveau/nouveau_object.c
src/mesa/drivers/dri/nouveau/nouveau_object.h
src/mesa/drivers/dri/nouveau/nouveau_screen.c
src/mesa/drivers/dri/nouveau/nouveau_sync.c

index f811dc1b72e4a15bf7dcc4b67c15f828fefa4914..aec7b19771af4f177ea38225df3248a582e55382 100644 (file)
@@ -141,9 +141,15 @@ GLboolean nouveauCreateContext( const __GLcontextModes *glVisual,
        if (!nouveauDRMGetParam(nmesa, NOUVEAU_GETPARAM_FB_PHYSICAL,
                                &nmesa->vram_phys))
           return GL_FALSE;
+       if (!nouveauDRMGetParam(nmesa, NOUVEAU_GETPARAM_FB_SIZE,
+                               &nmesa->vram_size))
+          return GL_FALSE;
        if (!nouveauDRMGetParam(nmesa, NOUVEAU_GETPARAM_AGP_PHYSICAL,
                                &nmesa->agp_phys))
           return GL_FALSE;
+       if (!nouveauDRMGetParam(nmesa, NOUVEAU_GETPARAM_AGP_SIZE,
+                               &nmesa->agp_size))
+          return GL_FALSE;
        if (!nouveauFifoInit(nmesa))
           return GL_FALSE;
        nouveauObjectInit(nmesa);
index f61fcbb48c0aa714a6c0590f1107827393f9314d..f79a8675f44a3a43f195dc1b1fdca57b99d070c9 100644 (file)
@@ -100,7 +100,9 @@ typedef struct nouveau_context {
 
        /* Physical addresses of AGP/VRAM apertures */
        uint64_t vram_phys;
+       uint64_t vram_size;
        uint64_t agp_phys;
+       uint64_t agp_size;
 
        /* Channel synchronisation */
        nouveau_notifier *syncNotifier;
index 302009c8b170dba96ce5faba195d9538fd00f76e..468b18e6d9056d76eddec46e0541df2b24c72640 100644 (file)
@@ -4,17 +4,14 @@
 #include "nouveau_reg.h"
 
 
-GLboolean nouveauCreateContextObject(nouveauContextPtr nmesa, int handle, int class, uint32_t flags, uint32_t dma_in, uint32_t dma_out, uint32_t dma_notifier)
+GLboolean nouveauCreateContextObject(nouveauContextPtr nmesa,
+                                    uint32_t handle, int class)
 {
        drm_nouveau_object_init_t cto;
        int ret;
 
        cto.handle = handle;
        cto.class  = class;
-       cto.flags  = flags;
-       cto.dma0= dma_in;
-       cto.dma1= dma_out;
-       cto.dma_notifier = dma_notifier;
        ret = drmCommandWrite(nmesa->driFd, DRM_NOUVEAU_OBJECT_INIT, &cto, sizeof(cto));
 
        return ret == 0;
@@ -22,6 +19,7 @@ GLboolean nouveauCreateContextObject(nouveauContextPtr nmesa, int handle, int cl
 
 GLboolean nouveauCreateDmaObject(nouveauContextPtr nmesa,
                                 uint32_t handle,
+                                int      class,
                                 uint32_t offset,
                                 uint32_t size,
                                 int      target,
@@ -30,6 +28,7 @@ GLboolean nouveauCreateDmaObject(nouveauContextPtr nmesa,
        drm_nouveau_dma_object_init_t dma;
        int ret;
 
+       dma.class  = class;
        dma.handle = handle;
        dma.target = target;
        dma.access = access;
@@ -40,6 +39,27 @@ GLboolean nouveauCreateDmaObject(nouveauContextPtr nmesa,
        return ret == 0;
 }
 
+GLboolean nouveauCreateDmaObjectFromMem(nouveauContextPtr nmesa,
+                                       uint32_t handle, int class,
+                                       nouveau_mem *mem,
+                                       int access)
+{
+       uint32_t offset = mem->offset;
+       int target = mem->type & (NOUVEAU_MEM_FB | NOUVEAU_MEM_AGP);
+
+       if (!target)
+               return GL_FALSE;
+
+       if (target & NOUVEAU_MEM_FB)
+               offset -= nmesa->vram_phys;
+       else if (target & NOUVEAU_MEM_AGP)
+               offset -= nmesa->agp_phys;
+
+       return nouveauCreateDmaObject(nmesa, handle, class,
+                                     offset, mem->size,
+                                     target, access);
+}
+
 void nouveauObjectOnSubchannel(nouveauContextPtr nmesa, int subchannel, int handle)
 {
        BEGIN_RING_SIZE(subchannel, 0, 1);
@@ -53,31 +73,25 @@ void nouveauObjectInit(nouveauContextPtr nmesa)
 #endif
 
 /* We need to know vram size.. and AGP size (and even if the card is AGP..) */
-       nouveauCreateDmaObject( nmesa, NvDmaFB,
-                               0, (256*1024*1024),
-                               0 /*NV_DMA_TARGET_FB*/, 0 /*NV_DMA_ACCESS_RW*/);
-       nouveauCreateDmaObject( nmesa, NvDmaAGP,
-                               nmesa->agp_phys, (128*1024*1024),
-                               3 /* AGP */, 0 /* RW */);
-
-       nouveauCreateContextObject(nmesa, Nv3D, nmesa->screen->card->class_3d,
-                                  0, 0, 0, 0);
+       nouveauCreateDmaObject( nmesa, NvDmaFB, NV_DMA_IN_MEMORY,
+                               0, nmesa->vram_size,
+                               NOUVEAU_MEM_FB,
+                               NOUVEAU_MEM_ACCESS_RW);
+       nouveauCreateDmaObject( nmesa, NvDmaAGP, NV_DMA_IN_MEMORY,
+                               0, nmesa->agp_size,
+                               NOUVEAU_MEM_AGP,
+                               NOUVEAU_MEM_ACCESS_RW);
+
+       nouveauCreateContextObject(nmesa, Nv3D, nmesa->screen->card->class_3d);
        if (nmesa->screen->card->type>=NV_10) {
-               nouveauCreateContextObject(nmesa, NvCtxSurf2D, NV10_CONTEXT_SURFACES_2D,
-                                  0, 0, 0, 0);
-               nouveauCreateContextObject(nmesa, NvImageBlit, NV10_IMAGE_BLIT,
-                                  NV_DMA_CONTEXT_FLAGS_PATCH_SRCCOPY, 0, 0, 0);
+               nouveauCreateContextObject(nmesa, NvCtxSurf2D, NV10_CONTEXT_SURFACES_2D);
+               nouveauCreateContextObject(nmesa, NvImageBlit, NV10_IMAGE_BLIT);
        } else {
-               nouveauCreateContextObject(nmesa, NvCtxSurf2D, NV04_CONTEXT_SURFACES_2D,
-                                  0, 0, 0, 0);
-               nouveauCreateContextObject(nmesa, NvCtxSurf3D, NV04_CONTEXT_SURFACES_3D,
-                                  0, 0, 0, 0);
-               nouveauCreateContextObject(nmesa, NvImageBlit, NV_IMAGE_BLIT,
-                                  NV_DMA_CONTEXT_FLAGS_PATCH_SRCCOPY, 0, 0, 0);
+               nouveauCreateContextObject(nmesa, NvCtxSurf2D, NV04_CONTEXT_SURFACES_2D);
+               nouveauCreateContextObject(nmesa, NvCtxSurf3D, NV04_CONTEXT_SURFACES_3D);
+               nouveauCreateContextObject(nmesa, NvImageBlit, NV_IMAGE_BLIT);
        }
-       nouveauCreateContextObject(nmesa, NvMemFormat,
-                                  NV_MEMORY_TO_MEMORY_FORMAT,
-                                  0, 0, 0, 0);
+       nouveauCreateContextObject(nmesa, NvMemFormat, NV_MEMORY_TO_MEMORY_FORMAT);
 
 #ifdef ALLOW_MULTI_SUBCHANNEL
        nouveauObjectOnSubchannel(nmesa, NvSubCtxSurf2D, NvCtxSurf2D);
index daad281029f3210ef5d011e35599e87a106133fa..0be9b4309c6d535c37520aab65d7f3c940c7a292 100644 (file)
@@ -30,15 +30,18 @@ enum DMASubchannel {
 extern void nouveauObjectOnSubchannel(nouveauContextPtr nmesa, int subchannel, int handle);
 
 extern GLboolean nouveauCreateContextObject(nouveauContextPtr nmesa,
-                                           int handle, int class,
-                                           uint32_t flags,
-                                           uint32_t dma_in,
-                                           uint32_t dma_out,
-                                           uint32_t dma_notifier);
+                                           uint32_t handle, int class);
 extern GLboolean nouveauCreateDmaObject(nouveauContextPtr nmesa,
                                        uint32_t handle,
+                                       int      class,
                                        uint32_t offset,
                                        uint32_t size,
                                        int      target,
                                        int      access);
+extern GLboolean nouveauCreateDmaObjectFromMem(nouveauContextPtr nmesa,
+                                              uint32_t     handle,
+                                              int          class,
+                                              nouveau_mem *mem,
+                                              int          access);
+
 #endif
index 881b20149f0011f7dbcbe6d18132ce671f2c4382..24e77750f937f74eb074c700906b92d63ec7c84b 100644 (file)
@@ -327,8 +327,10 @@ void * __driCreateNewScreen_20050727( __DRInativeDisplay *dpy, int scrn, __DRIsc
        __DRIscreenPrivate *psp;
        static const __DRIversion ddx_expected = { 1, 2, 0 };
        static const __DRIversion dri_expected = { 4, 0, 0 };
-       static const __DRIversion drm_expected = { 0, 0, 3 };
-
+       static const __DRIversion drm_expected = { 0, 0, NOUVEAU_DRM_HEADER_PATCHLEVEL };
+#if NOUVEAU_DRM_HEADER_PATCHLEVEL != 4
+#error nouveau_drm.h version doesn't match expected version
+#endif
        dri_interface = interface;
 
        if (!driCheckDriDdxDrmVersions2("nouveau",
index c47ff3a985d619ddda0cf7f0c456a266d3896c04..428b19b46eac13fe22daae103daf7e6f821740cd 100644 (file)
@@ -58,10 +58,9 @@ nouveau_notifier_new(GLcontext *ctx, GLuint handle, GLuint count)
                return NULL;
        }
 
-       if (!nouveauCreateDmaObject(nmesa, handle, notifier->mem->offset,
-                                                  notifier->mem->size,
-                                                  0 /* NV_DMA_TARGET_FB */,
-                                                  0 /* NV_DMA_ACCESS_RW */)) {
+       if (!nouveauCreateDmaObjectFromMem(nmesa, handle, NV_DMA_IN_MEMORY,
+                                          notifier->mem,
+                                          NOUVEAU_MEM_ACCESS_RW)) {
                nouveau_mem_free(ctx, notifier->mem);
                FREE(notifier);
                return NULL;