May waste a bit of memory, but simplifies the interface
significantly.

v2: convert internal accounting to use 256bit slots

Reviewed-by: Christian König <christian.koe...@amd.com>
Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h        |  4 --
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 77 ++----------------------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c   | 65 +++++++------------------
 3 files changed, 20 insertions(+), 126 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index d492ff7..19ee2a4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1131,10 +1131,6 @@ struct amdgpu_wb {
 
 int amdgpu_wb_get(struct amdgpu_device *adev, u32 *wb);
 void amdgpu_wb_free(struct amdgpu_device *adev, u32 wb);
-int amdgpu_wb_get_64bit(struct amdgpu_device *adev, u32 *wb);
-int amdgpu_wb_get_256bit(struct amdgpu_device *adev, u32 *wb);
-void amdgpu_wb_free_64bit(struct amdgpu_device *adev, u32 wb);
-void amdgpu_wb_free_256bit(struct amdgpu_device *adev, u32 wb);
 
 void amdgpu_get_pcie_info(struct amdgpu_device *adev);
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index fc6f8d5..62afe3c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -504,7 +504,8 @@ static int amdgpu_wb_init(struct amdgpu_device *adev)
        int r;
 
        if (adev->wb.wb_obj == NULL) {
-               r = amdgpu_bo_create_kernel(adev, AMDGPU_MAX_WB * 
sizeof(uint32_t),
+               /* AMDGPU_MAX_WB * sizeof(uint32_t) * 8 = AMDGPU_MAX_WB 256bit 
slots */
+               r = amdgpu_bo_create_kernel(adev, AMDGPU_MAX_WB * 
sizeof(uint32_t) * 8,
                                            PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT,
                                            &adev->wb.wb_obj, 
&adev->wb.gpu_addr,
                                            (void **)&adev->wb.wb);
@@ -535,47 +536,10 @@ static int amdgpu_wb_init(struct amdgpu_device *adev)
 int amdgpu_wb_get(struct amdgpu_device *adev, u32 *wb)
 {
        unsigned long offset = find_first_zero_bit(adev->wb.used, 
adev->wb.num_wb);
-       if (offset < adev->wb.num_wb) {
-               __set_bit(offset, adev->wb.used);
-               *wb = offset;
-               return 0;
-       } else {
-               return -EINVAL;
-       }
-}
 
-/**
- * amdgpu_wb_get_64bit - Allocate a wb entry
- *
- * @adev: amdgpu_device pointer
- * @wb: wb index
- *
- * Allocate a wb slot for use by the driver (all asics).
- * Returns 0 on success or -EINVAL on failure.
- */
-int amdgpu_wb_get_64bit(struct amdgpu_device *adev, u32 *wb)
-{
-       unsigned long offset = bitmap_find_next_zero_area_off(adev->wb.used,
-                               adev->wb.num_wb, 0, 2, 7, 0);
-       if ((offset + 1) < adev->wb.num_wb) {
+       if (offset < adev->wb.num_wb) {
                __set_bit(offset, adev->wb.used);
-               __set_bit(offset + 1, adev->wb.used);
-               *wb = offset;
-               return 0;
-       } else {
-               return -EINVAL;
-       }
-}
-
-int amdgpu_wb_get_256bit(struct amdgpu_device *adev, u32 *wb)
-{
-       int i = 0;
-       unsigned long offset = bitmap_find_next_zero_area_off(adev->wb.used,
-                               adev->wb.num_wb, 0, 8, 63, 0);
-       if ((offset + 7) < adev->wb.num_wb) {
-               for (i = 0; i < 8; i++)
-                       __set_bit(offset + i, adev->wb.used);
-               *wb = offset;
+               *wb = offset * 8; /* convert to dw offset */
                return 0;
        } else {
                return -EINVAL;
@@ -597,39 +561,6 @@ void amdgpu_wb_free(struct amdgpu_device *adev, u32 wb)
 }
 
 /**
- * amdgpu_wb_free_64bit - Free a wb entry
- *
- * @adev: amdgpu_device pointer
- * @wb: wb index
- *
- * Free a wb slot allocated for use by the driver (all asics)
- */
-void amdgpu_wb_free_64bit(struct amdgpu_device *adev, u32 wb)
-{
-       if ((wb + 1) < adev->wb.num_wb) {
-               __clear_bit(wb, adev->wb.used);
-               __clear_bit(wb + 1, adev->wb.used);
-       }
-}
-
-/**
- * amdgpu_wb_free_256bit - Free a wb entry
- *
- * @adev: amdgpu_device pointer
- * @wb: wb index
- *
- * Free a wb slot allocated for use by the driver (all asics)
- */
-void amdgpu_wb_free_256bit(struct amdgpu_device *adev, u32 wb)
-{
-       int i = 0;
-
-       if ((wb + 7) < adev->wb.num_wb)
-               for (i = 0; i < 8; i++)
-                       __clear_bit(wb + i, adev->wb.used);
-}
-
-/**
  * amdgpu_vram_location - try to find VRAM location
  * @adev: amdgpu device structure holding all necessary informations
  * @mc: memory controller structure holding memory informations
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index 3874be8..704475674 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -184,47 +184,22 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct 
amdgpu_ring *ring,
                        return r;
        }
 
-       if (ring->funcs->support_64bit_ptrs) {
-               r = amdgpu_wb_get_64bit(adev, &ring->rptr_offs);
-               if (r) {
-                       dev_err(adev->dev, "(%d) ring rptr_offs wb alloc 
failed\n", r);
-                       return r;
-               }
-
-               r = amdgpu_wb_get_64bit(adev, &ring->wptr_offs);
-               if (r) {
-                       dev_err(adev->dev, "(%d) ring wptr_offs wb alloc 
failed\n", r);
-                       return r;
-               }
-
-       } else {
-               r = amdgpu_wb_get(adev, &ring->rptr_offs);
-               if (r) {
-                       dev_err(adev->dev, "(%d) ring rptr_offs wb alloc 
failed\n", r);
-                       return r;
-               }
-
-               r = amdgpu_wb_get(adev, &ring->wptr_offs);
-               if (r) {
-                       dev_err(adev->dev, "(%d) ring wptr_offs wb alloc 
failed\n", r);
-                       return r;
-               }
-
+       r = amdgpu_wb_get(adev, &ring->rptr_offs);
+       if (r) {
+               dev_err(adev->dev, "(%d) ring rptr_offs wb alloc failed\n", r);
+               return r;
        }
 
-       if (amdgpu_sriov_vf(adev) && ring->funcs->type == AMDGPU_RING_TYPE_GFX) 
{
-               r = amdgpu_wb_get_256bit(adev, &ring->fence_offs);
-               if (r) {
-                       dev_err(adev->dev, "(%d) ring fence_offs wb alloc 
failed\n", r);
-                       return r;
-               }
+       r = amdgpu_wb_get(adev, &ring->wptr_offs);
+       if (r) {
+               dev_err(adev->dev, "(%d) ring wptr_offs wb alloc failed\n", r);
+               return r;
+       }
 
-       } else {
-               r = amdgpu_wb_get(adev, &ring->fence_offs);
-               if (r) {
-                       dev_err(adev->dev, "(%d) ring fence_offs wb alloc 
failed\n", r);
-                       return r;
-               }
+       r = amdgpu_wb_get(adev, &ring->fence_offs);
+       if (r) {
+               dev_err(adev->dev, "(%d) ring fence_offs wb alloc failed\n", r);
+               return r;
        }
 
        r = amdgpu_wb_get(adev, &ring->cond_exe_offs);
@@ -286,19 +261,11 @@ void amdgpu_ring_fini(struct amdgpu_ring *ring)
 {
        ring->ready = false;
 
-       if (ring->funcs->support_64bit_ptrs) {
-               amdgpu_wb_free_64bit(ring->adev, ring->rptr_offs);
-               amdgpu_wb_free_64bit(ring->adev, ring->wptr_offs);
-       } else {
-               amdgpu_wb_free(ring->adev, ring->rptr_offs);
-               amdgpu_wb_free(ring->adev, ring->wptr_offs);
-       }
+       amdgpu_wb_free(ring->adev, ring->rptr_offs);
+       amdgpu_wb_free(ring->adev, ring->wptr_offs);
 
        amdgpu_wb_free(ring->adev, ring->cond_exe_offs);
-       if (amdgpu_sriov_vf(ring->adev) && ring->funcs->type == 
AMDGPU_RING_TYPE_GFX)
-               amdgpu_wb_free_256bit(ring->adev, ring->fence_offs);
-       else
-               amdgpu_wb_free(ring->adev, ring->fence_offs);
+       amdgpu_wb_free(ring->adev, ring->fence_offs);
 
        amdgpu_bo_free_kernel(&ring->ring_obj,
                              &ring->gpu_addr,
-- 
2.5.5

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to