Commit 5a142824 authored by Tao Zhou's avatar Tao Zhou Committed by Alex Deucher
Browse files

drm/amdgpu: read CPER ring via debugfs



We read CPER data from read pointer to write pointer without changing
the pointers.

Signed-off-by: default avatarTao Zhou <tao.zhou1@amd.com>
Reviewed-by: default avatarHawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 4d614ce8
Loading
Loading
Loading
Loading
+36 −11
Original line number Diff line number Diff line
@@ -500,6 +500,7 @@ static ssize_t amdgpu_debugfs_ring_read(struct file *f, char __user *buf,
{
	struct amdgpu_ring *ring = file_inode(f)->i_private;
	uint32_t value, result, early[3];
	uint64_t p;
	loff_t i;
	int r;

@@ -523,6 +524,7 @@ static ssize_t amdgpu_debugfs_ring_read(struct file *f, char __user *buf,
		}
	}

	if (ring->funcs->type != AMDGPU_RING_TYPE_CPER) {
		while (size) {
			if (*pos >= (ring->ring_size + 12))
				return result;
@@ -536,6 +538,29 @@ static ssize_t amdgpu_debugfs_ring_read(struct file *f, char __user *buf,
			size -= 4;
			*pos += 4;
		}
	} else {
		p = early[0];
		if (early[0] <= early[1])
			size = (early[1] - early[0]);
		else
			size = ring->ring_size - (early[0] - early[1]);

		while (size) {
			if (p == early[1])
				return result;

			value = ring->ring[p];
			r = put_user(value, (uint32_t *)buf);
			if (r)
				return r;

			buf += 4;
			result += 4;
			size--;
			p++;
			p &= ring->ptr_mask;
		}
	}

	return result;
}