From: Dave Airlie <airl...@redhat.com>

Acked-by: Christian König <christian.koe...@amd.com>
Reviewed-by: Ben Skeggs <bske...@redhat.com>
Signed-off-by: Dave Airlie <airl...@redhat.com>
---
 drivers/gpu/drm/nouveau/nouveau_bo.c    | 44 ++++++++++++++++++++
 drivers/gpu/drm/nouveau/nouveau_sgdma.c | 54 ++++++-------------------
 drivers/gpu/drm/nouveau/nouveau_ttm.h   |  3 ++
 3 files changed, 59 insertions(+), 42 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c 
b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 091f80fbbd7c..f6cac6eec687 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -668,6 +668,33 @@ nouveau_ttm_tt_create(struct ttm_buffer_object *bo, 
uint32_t page_flags)
        return nouveau_sgdma_create_ttm(bo, page_flags);
 }
 
+static int
+nouveau_ttm_tt_bind(struct ttm_bo_device *bdev, struct ttm_tt *ttm,
+                   struct ttm_resource *reg)
+{
+#if IS_ENABLED(CONFIG_AGP)
+       struct nouveau_drm *drm = nouveau_bdev(bdev);
+
+       if (drm->agp.bridge)
+               return ttm_agp_bind(bdev, ttm, reg);
+#endif
+       return nouveau_sgdma_bind(bdev, ttm, reg);
+}
+
+static void
+nouveau_ttm_tt_unbind(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
+{
+#if IS_ENABLED(CONFIG_AGP)
+       struct nouveau_drm *drm = nouveau_bdev(bdev);
+
+       if (drm->agp.bridge) {
+               ttm_agp_unbind(bdev, ttm);
+               return;
+       }
+#endif
+       nouveau_sgdma_unbind(bdev, ttm);
+}
+
 static void
 nouveau_bo_evict_flags(struct ttm_buffer_object *bo, struct ttm_placement *pl)
 {
@@ -1285,6 +1312,20 @@ nouveau_ttm_tt_unpopulate(struct ttm_bo_device *bdev,
        ttm_unmap_and_unpopulate_pages(dev, ttm_dma);
 }
 
+static void
+nouveau_ttm_tt_destroy(struct ttm_bo_device *bdev,
+                      struct ttm_tt *ttm)
+{
+#if IS_ENABLED(CONFIG_AGP)
+       struct nouveau_drm *drm = nouveau_bdev(bdev);
+       if (drm->agp.bridge) {
+               ttm_agp_destroy(bdev, ttm);
+               return;
+       }
+#endif
+       nouveau_sgdma_destroy(bdev, ttm);
+}
+
 void
 nouveau_bo_fence(struct nouveau_bo *nvbo, struct nouveau_fence *fence, bool 
exclusive)
 {
@@ -1300,6 +1341,9 @@ struct ttm_bo_driver nouveau_bo_driver = {
        .ttm_tt_create = &nouveau_ttm_tt_create,
        .ttm_tt_populate = &nouveau_ttm_tt_populate,
        .ttm_tt_unpopulate = &nouveau_ttm_tt_unpopulate,
+       .ttm_tt_bind = &nouveau_ttm_tt_bind,
+       .ttm_tt_unbind = &nouveau_ttm_tt_unbind,
+       .ttm_tt_destroy = &nouveau_ttm_tt_destroy,
        .eviction_valuable = ttm_bo_eviction_valuable,
        .evict_flags = nouveau_bo_evict_flags,
        .move_notify = nouveau_bo_move_ntfy,
diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c 
b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
index 6000c650b105..05e542254e1f 100644
--- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c
+++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
@@ -14,7 +14,7 @@ struct nouveau_sgdma_be {
        struct nouveau_mem *mem;
 };
 
-static void
+void
 nouveau_sgdma_destroy(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
 {
        struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;
@@ -25,10 +25,11 @@ nouveau_sgdma_destroy(struct ttm_bo_device *bdev, struct 
ttm_tt *ttm)
        }
 }
 
-static int
-nv04_sgdma_bind(struct ttm_bo_device *bdev, struct ttm_tt *ttm, struct 
ttm_resource *reg)
+int
+nouveau_sgdma_bind(struct ttm_bo_device *bdev, struct ttm_tt *ttm, struct 
ttm_resource *reg)
 {
        struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;
+       struct nouveau_drm *drm = nouveau_bdev(bdev);
        struct nouveau_mem *mem = nouveau_mem(reg);
        int ret;
 
@@ -36,65 +37,34 @@ nv04_sgdma_bind(struct ttm_bo_device *bdev, struct ttm_tt 
*ttm, struct ttm_resou
        if (ret)
                return ret;
 
-       ret = nouveau_mem_map(mem, &mem->cli->vmm.vmm, &mem->vma[0]);
-       if (ret) {
-               nouveau_mem_fini(mem);
-               return ret;
+       if (drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA) {
+               ret = nouveau_mem_map(mem, &mem->cli->vmm.vmm, &mem->vma[0]);
+               if (ret) {
+                       nouveau_mem_fini(mem);
+                       return ret;
+               }
        }
 
        nvbe->mem = mem;
        return 0;
 }
 
-static void
-nv04_sgdma_unbind(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
+void
+nouveau_sgdma_unbind(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
 {
        struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;
        nouveau_mem_fini(nvbe->mem);
 }
 
-static struct ttm_backend_func nv04_sgdma_backend = {
-       .bind                   = nv04_sgdma_bind,
-       .unbind                 = nv04_sgdma_unbind,
-       .destroy                = nouveau_sgdma_destroy
-};
-
-static int
-nv50_sgdma_bind(struct ttm_bo_device *bdev, struct ttm_tt *ttm, struct 
ttm_resource *reg)
-{
-       struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;
-       struct nouveau_mem *mem = nouveau_mem(reg);
-       int ret;
-
-       ret = nouveau_mem_host(reg, &nvbe->ttm);
-       if (ret)
-               return ret;
-
-       nvbe->mem = mem;
-       return 0;
-}
-
-static struct ttm_backend_func nv50_sgdma_backend = {
-       .bind                   = nv50_sgdma_bind,
-       .unbind                 = nv04_sgdma_unbind,
-       .destroy                = nouveau_sgdma_destroy
-};
-
 struct ttm_tt *
 nouveau_sgdma_create_ttm(struct ttm_buffer_object *bo, uint32_t page_flags)
 {
-       struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
        struct nouveau_sgdma_be *nvbe;
 
        nvbe = kzalloc(sizeof(*nvbe), GFP_KERNEL);
        if (!nvbe)
                return NULL;
 
-       if (drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA)
-               nvbe->ttm.ttm.func = &nv04_sgdma_backend;
-       else
-               nvbe->ttm.ttm.func = &nv50_sgdma_backend;
-
        if (ttm_dma_tt_init(&nvbe->ttm, bo, page_flags)) {
                kfree(nvbe);
                return NULL;
diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.h 
b/drivers/gpu/drm/nouveau/nouveau_ttm.h
index eaf25461cd91..69552049bb96 100644
--- a/drivers/gpu/drm/nouveau/nouveau_ttm.h
+++ b/drivers/gpu/drm/nouveau/nouveau_ttm.h
@@ -22,4 +22,7 @@ int  nouveau_ttm_mmap(struct file *, struct vm_area_struct *);
 int  nouveau_ttm_global_init(struct nouveau_drm *);
 void nouveau_ttm_global_release(struct nouveau_drm *);
 
+int nouveau_sgdma_bind(struct ttm_bo_device *bdev, struct ttm_tt *ttm, struct 
ttm_resource *reg);
+void nouveau_sgdma_unbind(struct ttm_bo_device *bdev, struct ttm_tt *ttm);
+void nouveau_sgdma_destroy(struct ttm_bo_device *bdev, struct ttm_tt *ttm);
 #endif
-- 
2.27.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to