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
parent
f7affda35b
commit
9ef4bbc66c
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue