Hack around yet another "X restart borkage without nouveau.ko reload" problem.

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..
main
Ben Skeggs 2006-11-14 04:51:13 +11:00
parent f7affda35b
commit 9ef4bbc66c
2 changed files with 8 additions and 1 deletions

View File

@ -112,6 +112,7 @@ typedef struct drm_nouveau_private {
drm_local_map_t *mmio; drm_local_map_t *mmio;
drm_local_map_t *fb; drm_local_map_t *fb;
//TODO: Remove me, I'm bogus :)
int cur_fifo; int cur_fifo;
struct nouveau_object *fb_obj; struct nouveau_object *fb_obj;
@ -119,6 +120,7 @@ typedef struct drm_nouveau_private {
int cmdbuf_ch_size; int cmdbuf_ch_size;
struct mem_block* cmdbuf_alloc; struct mem_block* cmdbuf_alloc;
int fifo_alloc_count;
struct nouveau_fifo fifos[NV_MAX_FIFO_NUMBER]; struct nouveau_fifo fifos[NV_MAX_FIFO_NUMBER];
struct nouveau_object_store objs; struct nouveau_object_store objs;
/* RAMFC and RAMRO offsets */ /* RAMFC and RAMRO offsets */

View 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_ch_size = (uint32_t)cb->size / nouveau_fifo_number(dev);
dev_priv->cmdbuf_alloc = cb; dev_priv->cmdbuf_alloc = cb;
nouveau_fifo_init(dev);
DRM_INFO("DMA command buffer is %dKiB at 0x%08x(%s)\n", DRM_INFO("DMA command buffer is %dKiB at 0x%08x(%s)\n",
(uint32_t)cb->size>>10, (uint32_t)cb->start, (uint32_t)cb->size>>10, (uint32_t)cb->start,
config->cmdbuf.location == NOUVEAU_MEM_FB ? "VRAM" : "AGP"); 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) if (ret)
return ret; return ret;
} }
/* Initialise PFIFO regs */
if (!dev_priv->fifo_alloc_count)
nouveau_fifo_init(dev);
/* /*
* Alright, here is the full story * 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 */ /* FIFO has no objects yet */
dev_priv->fifos[init->channel].objs = NULL; dev_priv->fifos[init->channel].objs = NULL;
dev_priv->fifo_alloc_count++;
DRM_INFO("%s: initialised FIFO %d\n", __func__, init->channel); DRM_INFO("%s: initialised FIFO %d\n", __func__, init->channel);
return 0; return 0;
@ -438,6 +441,8 @@ void nouveau_fifo_free(drm_device_t* dev,int n)
/* reenable the fifo caches */ /* reenable the fifo caches */
NV_WRITE(NV_PFIFO_CACHES, 0x00000001); NV_WRITE(NV_PFIFO_CACHES, 0x00000001);
dev_priv->fifo_alloc_count--;
} }
/* cleanups all the fifos from filp */ /* cleanups all the fifos from filp */