diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2022-10-10 08:30:23 +0300 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2022-10-10 08:30:23 +0300 | 
| commit | 5f8f8574c7f5585b09a9623f0f13462e4eb67b4d (patch) | |
| tree | 8f1d5e88bf9604a9e39fbcce0e37b3d8cee451bb /drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | |
| parent | e62563db857f81d75c5726a35bc0180bed6d1540 (diff) | |
| parent | fe5b6aaef72a0f7daa06e7960e0bee45c2984e41 (diff) | |
| download | linux-5f8f8574c7f5585b09a9623f0f13462e4eb67b4d.tar.xz | |
Merge branch 'next' into for-linus
Prepare input updates for 6.1 merge window.
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 163 | 
1 files changed, 96 insertions, 67 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c index eedb12f6b8a3..e2eec985adb3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c @@ -383,12 +383,8 @@ static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,  		value = RREG32_PCIE(*pos);  		r = put_user(value, (uint32_t *)buf); -		if (r) { -			pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); -			pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -			amdgpu_virt_disable_access_debugfs(adev); -			return r; -		} +		if (r) +			goto out;  		result += 4;  		buf += 4; @@ -396,11 +392,12 @@ static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,  		size -= 4;  	} +	r = result; +out:  	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);  	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -  	amdgpu_virt_disable_access_debugfs(adev); -	return result; +	return r;  }  /** @@ -441,12 +438,8 @@ static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user  		uint32_t value;  		r = get_user(value, (uint32_t *)buf); -		if (r) { -			pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); -			pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -			amdgpu_virt_disable_access_debugfs(adev); -			return r; -		} +		if (r) +			goto out;  		WREG32_PCIE(*pos, value); @@ -456,11 +449,12 @@ static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user  		size -= 4;  	} +	r = result; +out:  	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);  	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -  	amdgpu_virt_disable_access_debugfs(adev); -	return result; +	return r;  }  /** @@ -502,12 +496,8 @@ static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,  		value = RREG32_DIDT(*pos >> 2);  		r = put_user(value, (uint32_t *)buf); -		if (r) { -			pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); -			pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -			amdgpu_virt_disable_access_debugfs(adev); -			return r; -		} +		if (r) +			goto out;  		result += 4;  		buf += 4; @@ -515,11 +505,12 @@ static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,  		size -= 4;  	} +	r = result; +out:  	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);  	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -  	amdgpu_virt_disable_access_debugfs(adev); -	return result; +	return r;  }  /** @@ -560,12 +551,8 @@ static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user  		uint32_t value;  		r = get_user(value, (uint32_t *)buf); -		if (r) { -			pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); -			pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -			amdgpu_virt_disable_access_debugfs(adev); -			return r; -		} +		if (r) +			goto out;  		WREG32_DIDT(*pos >> 2, value); @@ -575,11 +562,12 @@ static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user  		size -= 4;  	} +	r = result; +out:  	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);  	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -  	amdgpu_virt_disable_access_debugfs(adev); -	return result; +	return r;  }  /** @@ -621,12 +609,8 @@ static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,  		value = RREG32_SMC(*pos);  		r = put_user(value, (uint32_t *)buf); -		if (r) { -			pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); -			pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -			amdgpu_virt_disable_access_debugfs(adev); -			return r; -		} +		if (r) +			goto out;  		result += 4;  		buf += 4; @@ -634,11 +618,12 @@ static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,  		size -= 4;  	} +	r = result; +out:  	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);  	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -  	amdgpu_virt_disable_access_debugfs(adev); -	return result; +	return r;  }  /** @@ -679,12 +664,8 @@ static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *  		uint32_t value;  		r = get_user(value, (uint32_t *)buf); -		if (r) { -			pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); -			pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -			amdgpu_virt_disable_access_debugfs(adev); -			return r; -		} +		if (r) +			goto out;  		WREG32_SMC(*pos, value); @@ -694,11 +675,12 @@ static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *  		size -= 4;  	} +	r = result; +out:  	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);  	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -  	amdgpu_virt_disable_access_debugfs(adev); -	return result; +	return r;  }  /** @@ -1090,11 +1072,8 @@ static ssize_t amdgpu_debugfs_gfxoff_write(struct file *f, const char __user *bu  		uint32_t value;  		r = get_user(value, (uint32_t *)buf); -		if (r) { -			pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); -			pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -			return r; -		} +		if (r) +			goto out;  		amdgpu_gfx_off_ctrl(adev, value ? true : false); @@ -1104,10 +1083,12 @@ static ssize_t amdgpu_debugfs_gfxoff_write(struct file *f, const char __user *bu  		size -= 4;  	} +	r = result; +out:  	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);  	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -	return result; +	return r;  } @@ -1136,21 +1117,52 @@ static ssize_t amdgpu_debugfs_gfxoff_read(struct file *f, char __user *buf,  	}  	while (size) { -		uint32_t value; +		u32 value = adev->gfx.gfx_off_state; + +		r = put_user(value, (u32 *)buf); +		if (r) +			goto out; + +		result += 4; +		buf += 4; +		*pos += 4; +		size -= 4; +	} + +	r = result; +out: +	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); +	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); + +	return r; +} + +static ssize_t amdgpu_debugfs_gfxoff_status_read(struct file *f, char __user *buf, +						 size_t size, loff_t *pos) +{ +	struct amdgpu_device *adev = file_inode(f)->i_private; +	ssize_t result = 0; +	int r; + +	if (size & 0x3 || *pos & 0x3) +		return -EINVAL; + +	r = pm_runtime_get_sync(adev_to_drm(adev)->dev); +	if (r < 0) { +		pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); +		return r; +	} + +	while (size) { +		u32 value;  		r = amdgpu_get_gfx_off_status(adev, &value); -		if (r) { -			pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); -			pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -			return r; -		} +		if (r) +			goto out; -		r = put_user(value, (uint32_t *)buf); -		if (r) { -			pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); -			pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -			return r; -		} +		r = put_user(value, (u32 *)buf); +		if (r) +			goto out;  		result += 4;  		buf += 4; @@ -1158,10 +1170,12 @@ static ssize_t amdgpu_debugfs_gfxoff_read(struct file *f, char __user *buf,  		size -= 4;  	} +	r = result; +out:  	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);  	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); -	return result; +	return r;  }  static const struct file_operations amdgpu_debugfs_regs2_fops = { @@ -1229,6 +1243,12 @@ static const struct file_operations amdgpu_debugfs_gfxoff_fops = {  	.llseek = default_llseek  }; +static const struct file_operations amdgpu_debugfs_gfxoff_status_fops = { +	.owner = THIS_MODULE, +	.read = amdgpu_debugfs_gfxoff_status_read, +	.llseek = default_llseek +}; +  static const struct file_operations *debugfs_regs[] = {  	&amdgpu_debugfs_regs_fops,  	&amdgpu_debugfs_regs2_fops, @@ -1240,6 +1260,7 @@ static const struct file_operations *debugfs_regs[] = {  	&amdgpu_debugfs_wave_fops,  	&amdgpu_debugfs_gpr_fops,  	&amdgpu_debugfs_gfxoff_fops, +	&amdgpu_debugfs_gfxoff_status_fops,  };  static const char *debugfs_regs_names[] = { @@ -1253,6 +1274,7 @@ static const char *debugfs_regs_names[] = {  	"amdgpu_wave",  	"amdgpu_gpr",  	"amdgpu_gfxoff", +	"amdgpu_gfxoff_status",  };  /** @@ -1709,17 +1731,24 @@ static ssize_t amdgpu_reset_dump_register_list_write(struct file *f,  		i++;  	} while (len < size); +	new = kmalloc_array(i, sizeof(uint32_t), GFP_KERNEL); +	if (!new) { +		ret = -ENOMEM; +		goto error_free; +	}  	ret = down_write_killable(&adev->reset_domain->sem);  	if (ret)  		goto error_free;  	swap(adev->reset_dump_reg_list, tmp); +	swap(adev->reset_dump_reg_value, new);  	adev->num_regs = i;  	up_write(&adev->reset_domain->sem);  	ret = size;  error_free:  	kfree(tmp); +	kfree(new);  	return ret;  }  | 
