[RFC PATCH 1/2] drm/amdgpu: add wave limit functionality for gfx8,9

Christian König christian.koenig at amd.com
Wed Jan 27 14:59:21 UTC 2021


Am 27.01.21 um 15:56 schrieb Nirmoy Das:
> Wave limiting can be use to load balance high priority
> compute jobs along with gfx jobs. When enabled, this will reserve
> 70% of waves for compute jobs

Can this be changed on the fly? I was always assuming this must be 
something static.

Christian.

>
> Signed-off-by: Nirmoy Das <nirmoy.das at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h |  1 +
>   drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c    | 16 ++++++++++++++++
>   drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c    | 18 ++++++++++++++++++
>   3 files changed, 35 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> index 7112137689db..220eec886f23 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> @@ -197,6 +197,7 @@ struct amdgpu_ring_funcs {
>   	void (*soft_recovery)(struct amdgpu_ring *ring, unsigned vmid);
>   	int (*preempt_ib)(struct amdgpu_ring *ring);
>   	void (*emit_mem_sync)(struct amdgpu_ring *ring);
> +	void (*emit_wave_limit)(struct amdgpu_ring *ring, bool enable);
>   };
>
>   struct amdgpu_ring {
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> index 37639214cbbb..ead2cae3927b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> @@ -6847,6 +6847,21 @@ static void gfx_v8_0_emit_mem_sync_compute(struct amdgpu_ring *ring)
>   	amdgpu_ring_write(ring, 0x0000000A);	/* poll interval */
>   }
>
> +#define mmSPI_WCL_PIPE_PERCENT_GFX_DEFAULT	0x07ffffff
> +static void gfx_v8_0_emit_wave_limit(struct amdgpu_ring *ring, bool enable)
> +{
> +	struct amdgpu_device *adev = ring->adev;
> +	uint32_t val;
> +
> +
> +	/* mmSPI_WCL_PIPE_PERCENT_GFX is a 7 bit multiplier register to limit
> +	 * number of gfx waves. Setting 5 bit will make sure gfx only gets
> +	 * maximum 25% of gpu resources.
> +	 */
> +	val = enable ? 0x1f : mmSPI_WCL_PIPE_PERCENT_GFX_DEFAULT;
> +	gfx_v8_0_ring_emit_wreg(ring, mmSPI_WCL_PIPE_PERCENT_GFX, val);
> +}
> +
>   static const struct amd_ip_funcs gfx_v8_0_ip_funcs = {
>   	.name = "gfx_v8_0",
>   	.early_init = gfx_v8_0_early_init,
> @@ -6944,6 +6959,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = {
>   	.pad_ib = amdgpu_ring_generic_pad_ib,
>   	.emit_wreg = gfx_v8_0_ring_emit_wreg,
>   	.emit_mem_sync = gfx_v8_0_emit_mem_sync_compute,
> +	.emit_wave_limit = gfx_v8_0_emit_wave_limit,
>   };
>
>   static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_kiq = {
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> index a896e3d0fcf8..e94737d82915 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> @@ -52,6 +52,7 @@
>
>   #include "asic_reg/pwr/pwr_10_0_offset.h"
>   #include "asic_reg/pwr/pwr_10_0_sh_mask.h"
> +#include "asic_reg/gc/gc_9_0_default.h"
>
>   #define GFX9_NUM_GFX_RINGS     1
>   #define GFX9_MEC_HPD_SIZE 4096
> @@ -6670,6 +6671,22 @@ static void gfx_v9_0_emit_mem_sync(struct amdgpu_ring *ring)
>   	amdgpu_ring_write(ring, 0x0000000A); /* POLL_INTERVAL */
>   }
>
> +static void gfx_v9_0_emit_wave_limit(struct amdgpu_ring *ring, bool enable)
> +{
> +	struct amdgpu_device *adev = ring->adev;
> +	uint32_t val;
> +
> +
> +	/* mmSPI_WCL_PIPE_PERCENT_GFX is a 7 bit multiplier register to limit
> +	 * number of gfx waves. Setting 5 bit will make sure gfx only gets
> +	 * maximum 25% of gpu resources.
> +	 */
> +	val = enable ? 0x1f : mmSPI_WCL_PIPE_PERCENT_GFX_DEFAULT;
> +	amdgpu_ring_emit_wreg(ring,
> +			      SOC15_REG_OFFSET(GC, 0, mmSPI_WCL_PIPE_PERCENT_GFX),
> +			      val);
> +}
> +
>   static const struct amd_ip_funcs gfx_v9_0_ip_funcs = {
>   	.name = "gfx_v9_0",
>   	.early_init = gfx_v9_0_early_init,
> @@ -6775,6 +6792,7 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = {
>   	.emit_reg_wait = gfx_v9_0_ring_emit_reg_wait,
>   	.emit_reg_write_reg_wait = gfx_v9_0_ring_emit_reg_write_reg_wait,
>   	.emit_mem_sync = gfx_v9_0_emit_mem_sync,
> +	.emit_wave_limit = gfx_v9_0_emit_wave_limit,
>   };
>
>   static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_kiq = {
> --
> 2.30.0
>



More information about the amd-gfx mailing list