Add basic pgraph context for nv10.
It only fake a context switch : pgraph state are not save/restored.main
parent
4fe2858f53
commit
9d167f1f4b
|
@ -89,6 +89,9 @@ struct nouveau_fifo
|
||||||
struct mem_block *ramin_grctx;
|
struct mem_block *ramin_grctx;
|
||||||
/* objects belonging to this fifo */
|
/* objects belonging to this fifo */
|
||||||
struct nouveau_object *objs;
|
struct nouveau_object *objs;
|
||||||
|
|
||||||
|
/* XXX move this in PGRAPH struct */
|
||||||
|
uint32_t pgraph_ctx_user;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nouveau_config {
|
struct nouveau_config {
|
||||||
|
|
|
@ -488,6 +488,7 @@ static int nouveau_fifo_alloc(drm_device_t* dev,drm_nouveau_fifo_alloc_t* init,
|
||||||
init->channel = i;
|
init->channel = i;
|
||||||
init->put_base = 0;
|
init->put_base = 0;
|
||||||
dev_priv->cur_fifo = init->channel;
|
dev_priv->cur_fifo = init->channel;
|
||||||
|
dev_priv->fifos[i].pgraph_ctx_user = i << 24;
|
||||||
|
|
||||||
nouveau_wait_for_idle(dev);
|
nouveau_wait_for_idle(dev);
|
||||||
|
|
||||||
|
|
|
@ -240,21 +240,32 @@ static void nouveau_nv04_context_switch(drm_device_t *dev)
|
||||||
static void nouveau_nv10_context_switch(drm_device_t *dev)
|
static void nouveau_nv10_context_switch(drm_device_t *dev)
|
||||||
{
|
{
|
||||||
drm_nouveau_private_t *dev_priv = dev->dev_private;
|
drm_nouveau_private_t *dev_priv = dev->dev_private;
|
||||||
int channel;
|
int channel, channel_old;
|
||||||
|
|
||||||
channel=NV_READ(NV_PFIFO_CACH1_PSH1)&(nouveau_fifo_number(dev)-1);
|
channel=NV_READ(NV_PFIFO_CACH1_PSH1)&(nouveau_fifo_number(dev)-1);
|
||||||
/* 2-channel commute */
|
channel_old = (NV_READ(NV_PGRAPH_CTX_USER) >> 24) & (nouveau_fifo_number(dev)-1);
|
||||||
// if (channel==0)
|
|
||||||
// channel=1;
|
|
||||||
// else
|
|
||||||
// channel=0;
|
|
||||||
// dev_priv->cur_fifo=channel;
|
|
||||||
|
|
||||||
// NV_WRITE(NV_PGRAPH_CTX_CONTROL, 0x10000100);
|
DRM_INFO("NV: PGRAPH context switch interrupt channel %x -> %x\n",channel_old, channel);
|
||||||
NV_WRITE(NV_PGRAPH_CTX_USER, NV_READ(NV_PGRAPH_CTX_USER)|0x1F000000);
|
|
||||||
// NV_WRITE(NV_PGRAPH_FFINTFC_ST2, NV_READ(NV_PGRAPH_FFINTFC_ST2)&0xCFFFFFFF);
|
NV_WRITE(NV_PGRAPH_FIFO,0x0);
|
||||||
/* touch PGRAPH_CTX_SWITCH* here ? */
|
NV_WRITE(NV_PFIFO_CACH1_PUL0, 0x00000000);
|
||||||
NV_WRITE(NV_PGRAPH_CTX_CONTROL, 0x10000100);
|
NV_WRITE(NV_PFIFO_CACH1_PUL1, 0x00000000);
|
||||||
|
NV_WRITE(NV_PFIFO_CACHES, 0x00000000);
|
||||||
|
|
||||||
|
dev_priv->fifos[channel_old].pgraph_ctx_user = NV_READ(NV_PGRAPH_CTX_USER);
|
||||||
|
//XXX save PGRAPH context
|
||||||
|
NV_WRITE(NV_PGRAPH_CTX_CONTROL, 0x10000000);
|
||||||
|
NV_WRITE(NV_PGRAPH_CTX_USER, dev_priv->fifos[channel].pgraph_ctx_user);
|
||||||
|
//XXX restore PGRAPH context
|
||||||
|
printk("ctx_user %x %x\n", dev_priv->fifos[channel_old].pgraph_ctx_user, dev_priv->fifos[channel].pgraph_ctx_user);
|
||||||
|
|
||||||
|
NV_WRITE(NV_PGRAPH_FFINTFC_ST2, NV_READ(NV_PGRAPH_FFINTFC_ST2)&0xCFFFFFFF);
|
||||||
|
NV_WRITE(NV_PGRAPH_CTX_CONTROL, 0x10010100);
|
||||||
|
|
||||||
|
NV_WRITE(NV_PFIFO_CACH1_PUL0, 0x00000001);
|
||||||
|
NV_WRITE(NV_PFIFO_CACH1_PUL1, 0x00000001);
|
||||||
|
NV_WRITE(NV_PFIFO_CACHES, 0x00000001);
|
||||||
|
NV_WRITE(NV_PGRAPH_FIFO,0x1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nouveau_pgraph_irq_handler(drm_device_t *dev)
|
static void nouveau_pgraph_irq_handler(drm_device_t *dev)
|
||||||
|
|
Loading…
Reference in New Issue