[PATCH] drm/amdgpu: simplify allocation of scratch regs
Alex Deucher
alexdeucher at gmail.com
Tue Jan 17 19:50:02 UTC 2017
On Tue, Jan 17, 2017 at 5:18 AM, Christian König
<deathsimple at vodafone.de> wrote:
> 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>.
Applied. thanks!
Alex
>
>
>> ---
>> 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)
>
>
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list