diff options
| author | Ben Skeggs <bskeggs@redhat.com> | 2012-07-13 03:05:35 -0400 |
|---|---|---|
| committer | Ben Skeggs <bskeggs@redhat.com> | 2012-10-02 23:12:51 -0400 |
| commit | 18c9b959fd8ea6f3602efbedad788f53e305e6f1 (patch) | |
| tree | fdbc2c4dfb79fc0793fa6946882bc6aa9b0ed2c3 /drivers/gpu/drm | |
| parent | 9da226f698c01b268b9172050df4150f269a7613 (diff) | |
drm/nouveau/gpuobj: create wrapper functions for mapping gpuobj into vm/bar
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm')
| -rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_drv.h | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_gpuobj.c | 31 |
4 files changed, 44 insertions, 10 deletions
diff --git a/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c b/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c index 8f0e63e62996..f60221d9235d 100644 --- a/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c +++ b/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c | |||
| @@ -422,7 +422,7 @@ nvc0_fifo_destroy(struct drm_device *dev, int engine) | |||
| 422 | struct nvc0_fifo_priv *priv = nv_engine(dev, NVOBJ_ENGINE_FIFO); | 422 | struct nvc0_fifo_priv *priv = nv_engine(dev, NVOBJ_ENGINE_FIFO); |
| 423 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 423 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 424 | 424 | ||
| 425 | nouveau_vm_put(&priv->user.bar); | 425 | nouveau_gpuobj_unmap(&priv->user.bar); |
| 426 | nouveau_gpuobj_ref(NULL, &priv->user.mem); | 426 | nouveau_gpuobj_ref(NULL, &priv->user.mem); |
| 427 | 427 | ||
| 428 | nouveau_gpuobj_ref(NULL, &priv->playlist[1]); | 428 | nouveau_gpuobj_ref(NULL, &priv->playlist[1]); |
| @@ -464,13 +464,11 @@ nvc0_fifo_create(struct drm_device *dev) | |||
| 464 | if (ret) | 464 | if (ret) |
| 465 | goto error; | 465 | goto error; |
| 466 | 466 | ||
| 467 | ret = nouveau_vm_get(dev_priv->bar1_vm, priv->user.mem->size, | 467 | ret = nouveau_gpuobj_map_bar(priv->user.mem, NV_MEM_ACCESS_RW, |
| 468 | 12, NV_MEM_ACCESS_RW, &priv->user.bar); | 468 | &priv->user.bar); |
| 469 | if (ret) | 469 | if (ret) |
| 470 | goto error; | 470 | goto error; |
| 471 | 471 | ||
| 472 | nouveau_vm_map(&priv->user.bar, *(struct nouveau_mem **)priv->user.mem->node); | ||
| 473 | |||
| 474 | nouveau_irq_register(dev, 8, nvc0_fifo_isr); | 472 | nouveau_irq_register(dev, 8, nvc0_fifo_isr); |
| 475 | error: | 473 | error: |
| 476 | if (ret) | 474 | if (ret) |
diff --git a/drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c b/drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c index 829959fac149..1c06bde1bccf 100644 --- a/drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c +++ b/drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c | |||
| @@ -402,7 +402,7 @@ nve0_fifo_destroy(struct drm_device *dev, int engine) | |||
| 402 | struct nve0_fifo_priv *priv = nv_engine(dev, engine); | 402 | struct nve0_fifo_priv *priv = nv_engine(dev, engine); |
| 403 | int i; | 403 | int i; |
| 404 | 404 | ||
| 405 | nouveau_vm_put(&priv->user.bar); | 405 | nouveau_gpuobj_unmap(&priv->user.bar); |
| 406 | nouveau_gpuobj_ref(NULL, &priv->user.mem); | 406 | nouveau_gpuobj_ref(NULL, &priv->user.mem); |
| 407 | 407 | ||
| 408 | for (i = 0; i < NVE0_FIFO_ENGINE_NUM; i++) { | 408 | for (i = 0; i < NVE0_FIFO_ENGINE_NUM; i++) { |
| @@ -438,13 +438,11 @@ nve0_fifo_create(struct drm_device *dev) | |||
| 438 | if (ret) | 438 | if (ret) |
| 439 | goto error; | 439 | goto error; |
| 440 | 440 | ||
| 441 | ret = nouveau_vm_get(dev_priv->bar1_vm, priv->user.mem->size, | 441 | ret = nouveau_gpuobj_map_bar(priv->user.mem, NV_MEM_ACCESS_RW, |
| 442 | 12, NV_MEM_ACCESS_RW, &priv->user.bar); | 442 | &priv->user.bar); |
| 443 | if (ret) | 443 | if (ret) |
| 444 | goto error; | 444 | goto error; |
| 445 | 445 | ||
| 446 | nouveau_vm_map(&priv->user.bar, *(struct nouveau_mem **)priv->user.mem->node); | ||
| 447 | |||
| 448 | nouveau_irq_register(dev, 8, nve0_fifo_isr); | 446 | nouveau_irq_register(dev, 8, nve0_fifo_isr); |
| 449 | error: | 447 | error: |
| 450 | if (ret) | 448 | if (ret) |
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h index bfca468cbd1b..8ec8ca6ef16f 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.h +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h | |||
| @@ -879,6 +879,13 @@ extern void nv50_gpuobj_dma_init(struct nouveau_gpuobj *, u32 offset, | |||
| 879 | int class, u64 base, u64 size, int target, | 879 | int class, u64 base, u64 size, int target, |
| 880 | int access, u32 type, u32 comp); | 880 | int access, u32 type, u32 comp); |
| 881 | 881 | ||
| 882 | |||
| 883 | int nouveau_gpuobj_map_vm(struct nouveau_gpuobj *gpuobj, u32 flags, | ||
| 884 | struct nouveau_vm *vm, struct nouveau_vma *vma); | ||
| 885 | int nouveau_gpuobj_map_bar(struct nouveau_gpuobj *gpuobj, u32 flags, | ||
| 886 | struct nouveau_vma *vma); | ||
| 887 | void nouveau_gpuobj_unmap(struct nouveau_vma *vma); | ||
| 888 | |||
| 882 | /* nouveau_irq.c */ | 889 | /* nouveau_irq.c */ |
| 883 | extern int nouveau_irq_init(struct drm_device *); | 890 | extern int nouveau_irq_init(struct drm_device *); |
| 884 | extern void nouveau_irq_fini(struct drm_device *); | 891 | extern void nouveau_irq_fini(struct drm_device *); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_gpuobj.c b/drivers/gpu/drm/nouveau/nouveau_gpuobj.c index 69c6a2ec4a0d..4f8020d565a5 100644 --- a/drivers/gpu/drm/nouveau/nouveau_gpuobj.c +++ b/drivers/gpu/drm/nouveau/nouveau_gpuobj.c | |||
| @@ -806,3 +806,34 @@ nv_wo32(struct nouveau_gpuobj *gpuobj, u32 offset, u32 val) | |||
| 806 | 806 | ||
| 807 | nv_wi32(dev, gpuobj->pinst + offset, val); | 807 | nv_wi32(dev, gpuobj->pinst + offset, val); |
| 808 | } | 808 | } |
| 809 | |||
| 810 | int | ||
| 811 | nouveau_gpuobj_map_vm(struct nouveau_gpuobj *gpuobj, u32 flags, | ||
| 812 | struct nouveau_vm *vm, struct nouveau_vma *vma) | ||
| 813 | { | ||
| 814 | struct nouveau_mem **mem = gpuobj->node; | ||
| 815 | struct nouveau_mem *node = *mem; | ||
| 816 | int ret; | ||
| 817 | |||
| 818 | ret = nouveau_vm_get(vm, node->size << 12, 12, flags, vma); | ||
| 819 | if (ret) | ||
| 820 | return ret; | ||
| 821 | |||
| 822 | nouveau_vm_map(vma, node); | ||
| 823 | return 0; | ||
| 824 | } | ||
| 825 | |||
| 826 | int | ||
| 827 | nouveau_gpuobj_map_bar(struct nouveau_gpuobj *gpuobj, u32 flags, | ||
| 828 | struct nouveau_vma *vma) | ||
| 829 | { | ||
| 830 | struct drm_nouveau_private *dev_priv = gpuobj->dev->dev_private; | ||
| 831 | return nouveau_gpuobj_map_vm(gpuobj, flags, dev_priv->bar1_vm, vma); | ||
| 832 | } | ||
| 833 | |||
| 834 | void | ||
| 835 | nouveau_gpuobj_unmap(struct nouveau_vma *vma) | ||
| 836 | { | ||
| 837 | nouveau_vm_unmap(vma); | ||
| 838 | nouveau_vm_put(vma); | ||
| 839 | } | ||
