OSDN Git Service

drm/nouveau: switch over to the new pin interface
authorChristian König <christian.koenig@amd.com>
Mon, 21 Sep 2020 13:37:12 +0000 (15:37 +0200)
committerChristian König <christian.koenig@amd.com>
Thu, 24 Sep 2020 14:16:50 +0000 (16:16 +0200)
Stop using TTM_PL_FLAG_NO_EVICT.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Huang Rui <ray.huang@amd.com>
Link: https://patchwork.freedesktop.org/patch/391606/?series=81973&rev=1
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nouveau_bo.h
drivers/gpu/drm/nouveau/nouveau_chan.c

index a74bf1e..8d51cfc 100644 (file)
@@ -139,7 +139,7 @@ nouveau_bo_del_ttm(struct ttm_buffer_object *bo)
        struct drm_device *dev = drm->dev;
        struct nouveau_bo *nvbo = nouveau_bo(bo);
 
-       WARN_ON(nvbo->pin_refcnt > 0);
+       WARN_ON(nvbo->bo.pin_count > 0);
        nouveau_bo_del_io_reserve_lru(bo);
        nv10_bo_put_tile_region(dev, nvbo->tile, NULL);
 
@@ -417,9 +417,8 @@ nouveau_bo_placement_set(struct nouveau_bo *nvbo, uint32_t domain,
 {
        struct nouveau_drm *drm = nouveau_bdev(nvbo->bo.bdev);
        struct ttm_placement *pl = &nvbo->placement;
-       uint32_t flags = (nvbo->force_coherent ? TTM_PL_FLAG_UNCACHED :
-                                                TTM_PL_MASK_CACHING) |
-                        (nvbo->pin_refcnt ? TTM_PL_FLAG_NO_EVICT : 0);
+       uint32_t flags = nvbo->force_coherent ? TTM_PL_FLAG_UNCACHED :
+                                               TTM_PL_MASK_CACHING;
 
        pl->placement = nvbo->placements;
        set_placement_list(drm, nvbo->placements, &pl->num_placement,
@@ -453,7 +452,7 @@ nouveau_bo_pin(struct nouveau_bo *nvbo, uint32_t domain, bool contig)
                }
        }
 
-       if (nvbo->pin_refcnt) {
+       if (nvbo->bo.pin_count) {
                bool error = evict;
 
                switch (bo->mem.mem_type) {
@@ -472,7 +471,7 @@ nouveau_bo_pin(struct nouveau_bo *nvbo, uint32_t domain, bool contig)
                                 bo->mem.mem_type, domain);
                        ret = -EBUSY;
                }
-               nvbo->pin_refcnt++;
+               ttm_bo_pin(&nvbo->bo);
                goto out;
        }
 
@@ -483,18 +482,12 @@ nouveau_bo_pin(struct nouveau_bo *nvbo, uint32_t domain, bool contig)
                        goto out;
        }
 
-       nvbo->pin_refcnt++;
        nouveau_bo_placement_set(nvbo, domain, 0);
-
-       /* drop pin_refcnt temporarily, so we don't trip the assertion
-        * in nouveau_bo_move() that makes sure we're not trying to
-        * move a pinned buffer
-        */
-       nvbo->pin_refcnt--;
        ret = nouveau_bo_validate(nvbo, false, false);
        if (ret)
                goto out;
-       nvbo->pin_refcnt++;
+
+       ttm_bo_pin(&nvbo->bo);
 
        switch (bo->mem.mem_type) {
        case TTM_PL_VRAM:
@@ -519,30 +512,14 @@ nouveau_bo_unpin(struct nouveau_bo *nvbo)
 {
        struct nouveau_drm *drm = nouveau_bdev(nvbo->bo.bdev);
        struct ttm_buffer_object *bo = &nvbo->bo;
-       int ret, ref;
+       int ret;
 
        ret = ttm_bo_reserve(bo, false, false, NULL);
        if (ret)
                return ret;
 
-       ref = --nvbo->pin_refcnt;
-       WARN_ON_ONCE(ref < 0);
-       if (ref)
-               goto out;
-
-       switch (bo->mem.mem_type) {
-       case TTM_PL_VRAM:
-               nouveau_bo_placement_set(nvbo, NOUVEAU_GEM_DOMAIN_VRAM, 0);
-               break;
-       case TTM_PL_TT:
-               nouveau_bo_placement_set(nvbo, NOUVEAU_GEM_DOMAIN_GART, 0);
-               break;
-       default:
-               break;
-       }
-
-       ret = nouveau_bo_validate(nvbo, false, false);
-       if (ret == 0) {
+       ttm_bo_unpin(&nvbo->bo);
+       if (!nvbo->bo.pin_count) {
                switch (bo->mem.mem_type) {
                case TTM_PL_VRAM:
                        drm->gem.vram_available += bo->mem.size;
@@ -555,9 +532,8 @@ nouveau_bo_unpin(struct nouveau_bo *nvbo)
                }
        }
 
-out:
        ttm_bo_unreserve(bo);
-       return ret;
+       return 0;
 }
 
 int
@@ -1066,7 +1042,7 @@ nouveau_bo_move(struct ttm_buffer_object *bo, bool evict,
        if (ret)
                return ret;
 
-       if (nvbo->pin_refcnt)
+       if (nvbo->bo.pin_count)
                NV_WARN(drm, "Moving pinned object %p!\n", nvbo);
 
        if (drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA) {
index 2a23c82..ff68ded 100644 (file)
@@ -40,9 +40,6 @@ struct nouveau_bo {
 
        struct nouveau_drm_tile *tile;
 
-       /* protect by the ttm reservation lock */
-       int pin_refcnt;
-
        struct ttm_bo_kmap_obj dma_buf_vmap;
 };
 
index 8f09960..5d191e5 100644 (file)
@@ -107,7 +107,7 @@ nouveau_channel_del(struct nouveau_channel **pchan)
                nvif_object_dtor(&chan->push.ctxdma);
                nouveau_vma_del(&chan->push.vma);
                nouveau_bo_unmap(chan->push.buffer);
-               if (chan->push.buffer && chan->push.buffer->pin_refcnt)
+               if (chan->push.buffer && chan->push.buffer->bo.pin_count)
                        nouveau_bo_unpin(chan->push.buffer);
                nouveau_bo_ref(NULL, &chan->push.buffer);
                kfree(chan);