diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c | 125 | 
1 files changed, 27 insertions, 98 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c index 147100c27c2d..66c1a868c0e1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c @@ -21,9 +21,6 @@   *   */ -#include <linux/devcoredump.h> -#include <generated/utsrelease.h> -  #include "amdgpu_reset.h"  #include "aldebaran.h"  #include "sienna_cichlid.h" @@ -36,6 +33,7 @@ int amdgpu_reset_init(struct amdgpu_device *adev)  	switch (amdgpu_ip_version(adev, MP1_HWIP, 0)) {  	case IP_VERSION(13, 0, 2):  	case IP_VERSION(13, 0, 6): +	case IP_VERSION(13, 0, 14):  		ret = aldebaran_reset_init(adev);  		break;  	case IP_VERSION(11, 0, 7): @@ -58,6 +56,7 @@ int amdgpu_reset_fini(struct amdgpu_device *adev)  	switch (amdgpu_ip_version(adev, MP1_HWIP, 0)) {  	case IP_VERSION(13, 0, 2):  	case IP_VERSION(13, 0, 6): +	case IP_VERSION(13, 0, 14):  		ret = aldebaran_reset_fini(adev);  		break;  	case IP_VERSION(11, 0, 7): @@ -162,104 +161,34 @@ void amdgpu_device_unlock_reset_domain(struct amdgpu_reset_domain *reset_domain)  	up_write(&reset_domain->sem);  } -#ifndef CONFIG_DEV_COREDUMP -void amdgpu_coredump(struct amdgpu_device *adev, bool vram_lost, -		     struct amdgpu_reset_context *reset_context) -{ -} -#else -static ssize_t -amdgpu_devcoredump_read(char *buffer, loff_t offset, size_t count, -			void *data, size_t datalen) -{ -	struct drm_printer p; -	struct amdgpu_coredump_info *coredump = data; -	struct drm_print_iterator iter; -	int i; - -	iter.data = buffer; -	iter.offset = 0; -	iter.start = offset; -	iter.remain = count; - -	p = drm_coredump_printer(&iter); - -	drm_printf(&p, "**** AMDGPU Device Coredump ****\n"); -	drm_printf(&p, "version: " AMDGPU_COREDUMP_VERSION "\n"); -	drm_printf(&p, "kernel: " UTS_RELEASE "\n"); -	drm_printf(&p, "module: " KBUILD_MODNAME "\n"); -	drm_printf(&p, "time: %lld.%09ld\n", coredump->reset_time.tv_sec, -			coredump->reset_time.tv_nsec); - -	if (coredump->reset_task_info.pid) -		drm_printf(&p, "process_name: %s PID: %d\n", -			   coredump->reset_task_info.process_name, -			   coredump->reset_task_info.pid); - -	if (coredump->ring) { -		drm_printf(&p, "\nRing timed out details\n"); -		drm_printf(&p, "IP Type: %d Ring Name: %s\n", -			   coredump->ring->funcs->type, -			   coredump->ring->name); -	} - -	if (coredump->reset_vram_lost) -		drm_printf(&p, "VRAM is lost due to GPU reset!\n"); -	if (coredump->adev->reset_info.num_regs) { -		drm_printf(&p, "AMDGPU register dumps:\nOffset:     Value:\n"); - -		for (i = 0; i < coredump->adev->reset_info.num_regs; i++) -			drm_printf(&p, "0x%08x: 0x%08x\n", -				   coredump->adev->reset_info.reset_dump_reg_list[i], -				   coredump->adev->reset_info.reset_dump_reg_value[i]); -	} - -	return count - iter.remain; -} - -static void amdgpu_devcoredump_free(void *data) +void amdgpu_reset_get_desc(struct amdgpu_reset_context *rst_ctxt, char *buf, +			   size_t len)  { -	kfree(data); -} - -void amdgpu_coredump(struct amdgpu_device *adev, bool vram_lost, -		     struct amdgpu_reset_context *reset_context) -{ -	struct amdgpu_coredump_info *coredump; -	struct drm_device *dev = adev_to_drm(adev); -	struct amdgpu_job *job = reset_context->job; -	struct drm_sched_job *s_job; - -	coredump = kzalloc(sizeof(*coredump), GFP_NOWAIT); - -	if (!coredump) { -		DRM_ERROR("%s: failed to allocate memory for coredump\n", __func__); +	if (!buf || !len)  		return; -	} - -	coredump->reset_vram_lost = vram_lost; -	if (reset_context->job && reset_context->job->vm) { -		struct amdgpu_task_info *ti; -		struct amdgpu_vm *vm = reset_context->job->vm; - -		ti = amdgpu_vm_get_task_info_vm(vm); -		if (ti) { -			coredump->reset_task_info = *ti; -			amdgpu_vm_put_task_info(ti); +	switch (rst_ctxt->src) { +	case AMDGPU_RESET_SRC_JOB: +		if (rst_ctxt->job) { +			snprintf(buf, len, "job hang on ring:%s", +				 rst_ctxt->job->base.sched->name); +		} else { +			strscpy(buf, "job hang", len);  		} +		break; +	case AMDGPU_RESET_SRC_RAS: +		strscpy(buf, "RAS error", len); +		break; +	case AMDGPU_RESET_SRC_MES: +		strscpy(buf, "MES hang", len); +		break; +	case AMDGPU_RESET_SRC_HWS: +		strscpy(buf, "HWS hang", len); +		break; +	case AMDGPU_RESET_SRC_USER: +		strscpy(buf, "user trigger", len); +		break; +	default: +		strscpy(buf, "unknown", len);  	} - -	if (job) { -		s_job = &job->base; -		coredump->ring = to_amdgpu_ring(s_job->sched); -	} - -	coredump->adev = adev; - -	ktime_get_ts64(&coredump->reset_time); - -	dev_coredumpm(dev->dev, THIS_MODULE, coredump, 0, GFP_NOWAIT, -		      amdgpu_devcoredump_read, amdgpu_devcoredump_free);  } -#endif |