diff options
| author | Tom St Denis <tom.stdenis@amd.com> | 2016-12-05 11:39:19 -0500 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2016-12-08 14:12:17 -0500 | 
| commit | c5a60ce81b4962d35a6bbb328fb234d33254cfb7 (patch) | |
| tree | 4fdb880c0467c68e9aee75febc93a066928ecd19 /drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |
| parent | 40ee5888faecf4ea5423dbe94c862d03c3e7e12c (diff) | |
drm/amd/amdgpu: Add debugfs support for reading GPRs (v2)
Implemented for SGPRs for GFX v8 initially.
(v2) cleanup minor whitespace and remove sanity check and
     addressing is in dwords not bytes
Signed-off-by: Tom St Denis <tom.stdenis@amd.com>
Acked-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 25 | 
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index e90e541581e2..6324f67bdb1f 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c @@ -5184,6 +5184,21 @@ static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_  	return RREG32(mmSQ_IND_DATA);  } +static void wave_read_regs(struct amdgpu_device *adev, uint32_t simd, +			   uint32_t wave, uint32_t thread, +			   uint32_t regno, uint32_t num, uint32_t *out) +{ +	WREG32(mmSQ_IND_INDEX, +		(wave << SQ_IND_INDEX__WAVE_ID__SHIFT) | +		(simd << SQ_IND_INDEX__SIMD_ID__SHIFT) | +		(regno << SQ_IND_INDEX__INDEX__SHIFT) | +		(thread << SQ_IND_INDEX__THREAD_ID__SHIFT) | +		(SQ_IND_INDEX__FORCE_READ_MASK) | +		(SQ_IND_INDEX__AUTO_INCR_MASK)); +	while (num--) +		*(out++) = RREG32(mmSQ_IND_DATA); +} +  static void gfx_v8_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields)  {  	/* type 0 wave data */ @@ -5208,11 +5223,21 @@ static void gfx_v8_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, u  	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_M0);  } +static void gfx_v8_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd, +				     uint32_t wave, uint32_t start, +				     uint32_t size, uint32_t *dst) +{ +	wave_read_regs( +		adev, simd, wave, 0, +		start + SQIND_WAVE_SGPRS_OFFSET, size, dst); +} +  static const struct amdgpu_gfx_funcs gfx_v8_0_gfx_funcs = {  	.get_gpu_clock_counter = &gfx_v8_0_get_gpu_clock_counter,  	.select_se_sh = &gfx_v8_0_select_se_sh,  	.read_wave_data = &gfx_v8_0_read_wave_data, +	.read_wave_sgprs = &gfx_v8_0_read_wave_sgprs,  };  static int gfx_v8_0_early_init(void *handle)  | 
