Hack around yet another "X restart borkage without nouveau.ko reload" problem.
authorBen Skeggs <darktama@iinet.net.au>
Mon, 13 Nov 2006 17:51:13 +0000 (04:51 +1100)
committerBen Skeggs <darktama@iinet.net.au>
Mon, 13 Nov 2006 17:51:13 +0000 (04:51 +1100)
On X init, PFIFO and PGRAPH are reset to defaults.  This causes the GPU to
loose the configuration done by the drm.  Perhaps a CARD_INIT ioctl a proper
solution to having this problem again in the future..

shared-core/nouveau_drv.h
shared-core/nouveau_fifo.c

index f579026..ac21f65 100644 (file)
@@ -112,6 +112,7 @@ typedef struct drm_nouveau_private {
        drm_local_map_t *mmio;
        drm_local_map_t *fb;
 
+       //TODO: Remove me, I'm bogus :)
        int      cur_fifo;
 
        struct nouveau_object *fb_obj;
@@ -119,6 +120,7 @@ typedef struct drm_nouveau_private {
        int               cmdbuf_ch_size;
        struct mem_block* cmdbuf_alloc;
 
+       int fifo_alloc_count;
        struct nouveau_fifo fifos[NV_MAX_FIFO_NUMBER];
        struct nouveau_object_store objs;
        /* RAMFC and RAMRO offsets */
index cf38964..ef63f08 100644 (file)
@@ -178,7 +178,6 @@ static int nouveau_dma_init(struct drm_device *dev)
        dev_priv->cmdbuf_ch_size = (uint32_t)cb->size / nouveau_fifo_number(dev);
        dev_priv->cmdbuf_alloc = cb;
 
-       nouveau_fifo_init(dev);
        DRM_INFO("DMA command buffer is %dKiB at 0x%08x(%s)\n",
                        (uint32_t)cb->size>>10, (uint32_t)cb->start,
                        config->cmdbuf.location == NOUVEAU_MEM_FB ? "VRAM" : "AGP");
@@ -306,6 +305,9 @@ static int nouveau_fifo_alloc(drm_device_t* dev,drm_nouveau_fifo_alloc_t* init,
                if (ret)
                        return ret;
        }
+       /* Initialise PFIFO regs */
+       if (!dev_priv->fifo_alloc_count)
+               nouveau_fifo_init(dev);
 
        /*
         * Alright, here is the full story
@@ -409,6 +411,7 @@ static int nouveau_fifo_alloc(drm_device_t* dev,drm_nouveau_fifo_alloc_t* init,
 
        /* FIFO has no objects yet */
        dev_priv->fifos[init->channel].objs = NULL;
+       dev_priv->fifo_alloc_count++;
 
        DRM_INFO("%s: initialised FIFO %d\n", __func__, init->channel);
        return 0;
@@ -438,6 +441,8 @@ void nouveau_fifo_free(drm_device_t* dev,int n)
 
        /* reenable the fifo caches */
        NV_WRITE(NV_PFIFO_CACHES, 0x00000001);
+
+       dev_priv->fifo_alloc_count--;
 }
 
 /* cleanups all the fifos from filp */