Skip to content

Commit

Permalink
drm/nouveau: allow gpuobj vinst to be a virtual address when necessary
Browse files Browse the repository at this point in the history
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
  • Loading branch information
Ben Skeggs committed Dec 8, 2010
1 parent b571fe2 commit 34cf01b
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
1 change: 1 addition & 0 deletions drivers/gpu/drm/nouveau/nouveau_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ enum nouveau_flags {
#define NVOBJ_FLAG_DONT_MAP (1 << 0)
#define NVOBJ_FLAG_ZERO_ALLOC (1 << 1)
#define NVOBJ_FLAG_ZERO_FREE (1 << 2)
#define NVOBJ_FLAG_VM (1 << 3)

#define NVOBJ_CINST_GLOBAL 0xdeadbeef

Expand Down
25 changes: 23 additions & 2 deletions drivers/gpu/drm/nouveau/nv50_instmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,7 @@ nv50_instmem_resume(struct drm_device *dev)

struct nv50_gpuobj_node {
struct nouveau_vram *vram;
struct nouveau_vma chan_vma;
u32 align;
};

Expand All @@ -310,6 +311,7 @@ int
nv50_instmem_get(struct nouveau_gpuobj *gpuobj, u32 size, u32 align)
{
struct drm_device *dev = gpuobj->dev;
struct drm_nouveau_private *dev_priv = dev->dev_private;
struct nv50_gpuobj_node *node = NULL;
int ret;

Expand All @@ -328,8 +330,23 @@ nv50_instmem_get(struct nouveau_gpuobj *gpuobj, u32 size, u32 align)
}

gpuobj->vinst = node->vram->offset;
gpuobj->size = size;
gpuobj->node = node;

if (gpuobj->flags & NVOBJ_FLAG_VM) {
ret = nouveau_vm_get(dev_priv->chan_vm, size, 12,
NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS,
&node->chan_vma);
if (ret) {
nv50_vram_del(dev, &node->vram);
kfree(node);
return ret;
}

nouveau_vm_map(&node->chan_vma, node->vram);
gpuobj->vinst = node->chan_vma.offset;
}

gpuobj->size = size;
gpuobj->node = node;
return 0;
}

Expand All @@ -342,6 +359,10 @@ nv50_instmem_put(struct nouveau_gpuobj *gpuobj)
node = gpuobj->node;
gpuobj->node = NULL;

if (node->chan_vma.node) {
nouveau_vm_unmap(&node->chan_vma);
nouveau_vm_put(&node->chan_vma);
}
nv50_vram_del(dev, &node->vram);
kfree(node);
}
Expand Down

0 comments on commit 34cf01b

Please sign in to comment.