drm/amdgpu: simplify allocation of scratch regs
authorNils Wallménius <nils.wallmenius@gmail.com>
Mon, 16 Jan 2017 20:56:48 +0000 (21:56 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 27 Jan 2017 16:13:32 +0000 (11:13 -0500)
The scratch regs are sequential so there's no need to keep
them in an array, we can just return the index of the first
free register + the base register. Also change the array
of bools for keeping track of the free regs to a bitfield.

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Nils Wallménius <nils.wallmenius@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c

index ffeda245f38ba24927e5a1bc59b958aa91664c77..953148058bdbaf8a7fce506cade4e5535caec822 100644 (file)
@@ -794,8 +794,7 @@ struct amdgpu_kiq {
 struct amdgpu_scratch {
        unsigned                num_reg;
        uint32_t                reg_base;
-       bool                    free[32];
-       uint32_t                reg[32];
+       uint32_t                free_mask;
 };
 
 /*
index 01a42b6a69a4bb8b3b1653e57bf28da6cb5911e1..19943356cca778331220de2ccd5819caf471230c 100644 (file)
@@ -42,12 +42,12 @@ int amdgpu_gfx_scratch_get(struct amdgpu_device *adev, uint32_t *reg)
 {
        int i;
 
-       for (i = 0; i < adev->gfx.scratch.num_reg; i++) {
-               if (adev->gfx.scratch.free[i]) {
-                       adev->gfx.scratch.free[i] = false;
-                       *reg = adev->gfx.scratch.reg[i];
-                       return 0;
-               }
+       i = ffs(adev->gfx.scratch.free_mask);
+       if (i != 0 && i <= adev->gfx.scratch.num_reg) {
+               i--;
+               adev->gfx.scratch.free_mask &= ~(1u << i);
+               *reg = adev->gfx.scratch.reg_base + i;
+               return 0;
        }
        return -EINVAL;
 }
@@ -62,14 +62,7 @@ int amdgpu_gfx_scratch_get(struct amdgpu_device *adev, uint32_t *reg)
  */
 void amdgpu_gfx_scratch_free(struct amdgpu_device *adev, uint32_t reg)
 {
-       int i;
-
-       for (i = 0; i < adev->gfx.scratch.num_reg; i++) {
-               if (adev->gfx.scratch.reg[i] == reg) {
-                       adev->gfx.scratch.free[i] = true;
-                       return;
-               }
-       }
+       adev->gfx.scratch.free_mask |= 1u << (reg - adev->gfx.scratch.reg_base);
 }
 
 /**
index b323f5ef64d217813683722ec4cd25282e9185ea..e0132436c76f7d69094a38935d9f580013e9321b 100644 (file)
@@ -1794,14 +1794,9 @@ static void gfx_v6_0_gpu_init(struct amdgpu_device *adev)
 
 static void gfx_v6_0_scratch_init(struct amdgpu_device *adev)
 {
-       int i;
-
        adev->gfx.scratch.num_reg = 7;
        adev->gfx.scratch.reg_base = mmSCRATCH_REG0;
-       for (i = 0; i < adev->gfx.scratch.num_reg; i++) {
-               adev->gfx.scratch.free[i] = true;
-               adev->gfx.scratch.reg[i] = adev->gfx.scratch.reg_base + i;
-       }
+       adev->gfx.scratch.free_mask = (1u << adev->gfx.scratch.num_reg) - 1;
 }
 
 static int gfx_v6_0_ring_test_ring(struct amdgpu_ring *ring)
index c4e14015ec5bece8aee8560d71c4e98d4ba4f9dd..cfed6db69b930f8456b4a1eb17ba7c8dc4f78a7f 100644 (file)
@@ -2003,14 +2003,9 @@ static void gfx_v7_0_gpu_init(struct amdgpu_device *adev)
  */
 static void gfx_v7_0_scratch_init(struct amdgpu_device *adev)
 {
-       int i;
-
        adev->gfx.scratch.num_reg = 7;
        adev->gfx.scratch.reg_base = mmSCRATCH_REG0;
-       for (i = 0; i < adev->gfx.scratch.num_reg; i++) {
-               adev->gfx.scratch.free[i] = true;
-               adev->gfx.scratch.reg[i] = adev->gfx.scratch.reg_base + i;
-       }
+       adev->gfx.scratch.free_mask = (1u << adev->gfx.scratch.num_reg) - 1;
 }
 
 /**
index c8c45ba952c825d3afb835867f6096b522e12d17..69543d4eef343aa7d80c178d5e957b4bb8235410 100644 (file)
@@ -749,14 +749,9 @@ static void gfx_v8_0_init_golden_registers(struct amdgpu_device *adev)
 
 static void gfx_v8_0_scratch_init(struct amdgpu_device *adev)
 {
-       int i;
-
        adev->gfx.scratch.num_reg = 7;
        adev->gfx.scratch.reg_base = mmSCRATCH_REG0;
-       for (i = 0; i < adev->gfx.scratch.num_reg; i++) {
-               adev->gfx.scratch.free[i] = true;
-               adev->gfx.scratch.reg[i] = adev->gfx.scratch.reg_base + i;
-       }
+       adev->gfx.scratch.free_mask = (1u << adev->gfx.scratch.num_reg) - 1;
 }
 
 static int gfx_v8_0_ring_test_ring(struct amdgpu_ring *ring)