Skip to content

Commit

Permalink
drm/nouveau: make fifo.create_context() responsible for mapping contr…
Browse files Browse the repository at this point in the history
…ol regs

The regs belong to PFIFO, they're different for pretty much the same
generations we need different PFIFO control for, and NVC0 is going
to be even more different than the rest.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
  • Loading branch information
Ben Skeggs authored and Francisco Jerez committed Dec 8, 2010
1 parent 395a31e commit d908175
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 21 deletions.
22 changes: 1 addition & 21 deletions drivers/gpu/drm/nouveau/nouveau_channel.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ nouveau_channel_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret,
struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
struct nouveau_channel *chan;
unsigned long flags;
int user, ret;
int ret;

/* allocate and lock channel structure */
chan = kzalloc(sizeof(*chan), GFP_KERNEL);
Expand Down Expand Up @@ -160,23 +160,6 @@ nouveau_channel_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret,
}

nouveau_dma_pre_init(chan);

/* Locate channel's user control regs */
if (dev_priv->card_type < NV_40)
user = NV03_USER(chan->id);
else
if (dev_priv->card_type < NV_50)
user = NV40_USER(chan->id);
else
user = NV50_USER(chan->id);

chan->user = ioremap(pci_resource_start(dev->pdev, 0) + user,
PAGE_SIZE);
if (!chan->user) {
NV_ERROR(dev, "ioremap of regs failed.\n");
nouveau_channel_put(&chan);
return -ENOMEM;
}
chan->user_put = 0x40;
chan->user_get = 0x44;

Expand Down Expand Up @@ -356,9 +339,6 @@ nouveau_channel_del(struct kref *ref)
struct nouveau_channel *chan =
container_of(ref, struct nouveau_channel, ref);

if (chan->user)
iounmap(chan->user);

kfree(chan);
}

Expand Down
9 changes: 9 additions & 0 deletions drivers/gpu/drm/nouveau/nv04_fifo.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,11 @@ nv04_fifo_create_context(struct nouveau_channel *chan)
if (ret)
return ret;

chan->user = ioremap(pci_resource_start(dev->pdev, 0) +
NV03_USER(chan->id), PAGE_SIZE);
if (!chan->user)
return -ENOMEM;

spin_lock_irqsave(&dev_priv->context_switch_lock, flags);

/* Setup initial state */
Expand Down Expand Up @@ -173,6 +178,10 @@ nv04_fifo_destroy_context(struct nouveau_channel *chan)
spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);

/* Free the channel resources */
if (chan->user) {
iounmap(chan->user);
chan->user = NULL;
}
nouveau_gpuobj_ref(NULL, &chan->ramfc);
}

Expand Down
5 changes: 5 additions & 0 deletions drivers/gpu/drm/nouveau/nv10_fifo.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@ nv10_fifo_create_context(struct nouveau_channel *chan)
if (ret)
return ret;

chan->user = ioremap(pci_resource_start(dev->pdev, 0) +
NV03_USER(chan->id), PAGE_SIZE);
if (!chan->user)
return -ENOMEM;

/* Fill entries that are seen filled in dumps of nvidia driver just
* after channel's is put into DMA mode
*/
Expand Down
5 changes: 5 additions & 0 deletions drivers/gpu/drm/nouveau/nv40_fifo.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ nv40_fifo_create_context(struct nouveau_channel *chan)
if (ret)
return ret;

chan->user = ioremap(pci_resource_start(dev->pdev, 0) +
NV40_USER(chan->id), PAGE_SIZE);
if (!chan->user)
return -ENOMEM;

spin_lock_irqsave(&dev_priv->context_switch_lock, flags);

nv_wi32(dev, fc + 0, chan->pushbuf_base);
Expand Down
9 changes: 9 additions & 0 deletions drivers/gpu/drm/nouveau/nv50_fifo.c
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,11 @@ nv50_fifo_create_context(struct nouveau_channel *chan)
}
ramfc = chan->ramfc;

chan->user = ioremap(pci_resource_start(dev->pdev, 0) +
NV50_USER(chan->id), PAGE_SIZE);
if (!chan->user)
return -ENOMEM;

spin_lock_irqsave(&dev_priv->context_switch_lock, flags);

nv_wo32(ramfc, 0x48, chan->pushbuf->cinst >> 4);
Expand Down Expand Up @@ -327,6 +332,10 @@ nv50_fifo_destroy_context(struct nouveau_channel *chan)
spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);

/* Free the channel resources */
if (chan->user) {
iounmap(chan->user);
chan->user = NULL;
}
nouveau_gpuobj_ref(NULL, &ramfc);
nouveau_gpuobj_ref(NULL, &chan->cache);
}
Expand Down

0 comments on commit d908175

Please sign in to comment.