Am 16.01.2017 um 21:56 schrieb Nils Wallménius: > 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. > > Signed-off-by: Nils Wallménius <nils.wallmenius at gmail.com> Reviewed-by: Christian König <christian.koenig at amd.com>. > --- > drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 +-- > drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 21 +++++++-------------- > drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c | 7 +------ > drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 7 +------ > drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 7 +------ > 5 files changed, 11 insertions(+), 34 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > index ffeda245..9531480 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > @@ -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; > }; > > /* > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c > index 01a42b6..1994335 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c > @@ -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); > } > > /** > diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c > index b323f5e..e013243 100644 > --- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c > @@ -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) > diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c > index c4e1401..cfed6db 100644 > --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c > @@ -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; > } > > /** > diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c > index c8c45ba..69543d4 100644 > --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c > @@ -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)