From: Dave Airlie <airlied@redhat.com>
Date: Tue, 1 Mar 2022 06:19:02 +0000 (+1000)
Subject: Merge tag 'amd-drm-next-5.18-2022-02-25' of https://gitlab.freedesktop.org/agd5f... 
X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=38a15ad9488e21cad8f42d3befca20f91e5b2874;p=linux.git

Merge tag 'amd-drm-next-5.18-2022-02-25' of https://gitlab.freedesktop.org/agd5f/linux into drm-next

amd-drm-next-5.18-2022-02-25:

amdgpu:
- Raven2 suspend/resume fix
- SDMA 5.2.6 updates
- VCN 3.1.2 updates
- SMU 13.0.5 updates
- DCN 3.1.5 updates
- Virtual display fixes
- SMU code cleanup
- Harvest fixes
- Expose benchmark tests via debugfs
- Drop no longer relevant gart aperture tests
- More RAS restructuring
- W=1 fixes
- PSR rework
- DP/VGA adapter fixes
- DP MST fixes
- GPUVM eviction fix
- GPU reset debugfs register dumping support
- Misc display fixes
- SR-IOV fix
- Aldebaran mGPU fix
- Add module parameter to disable XGMI for testing

amdkfd:
- IH ring overflow logging fixes
- CRIU fixes
- Misc fixes

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220225183535.5907-1-alexander.deucher@amd.com
---

38a15ad9488e21cad8f42d3befca20f91e5b2874
diff --cc drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 8685784f24a9,d990ebfd2afc..37ff8cf5bbed
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@@ -1101,7 -1094,11 +1094,13 @@@ struct amdgpu_device 
  
  	struct ip_discovery_top         *ip_top;
  
 +	struct amdgpu_reset_domain	*reset_domain;
++
+ 	struct mutex			benchmark_mutex;
+ 
+ 	/* reset dump register */
+ 	uint32_t                        *reset_dump_reg_list;
+ 	int                             num_regs;
  };
  
  static inline struct amdgpu_device *drm_to_adev(struct drm_device *ddev)
diff --cc drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
index ae0c83237608,9eb9b440bd43..426b63e4f1f6
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
@@@ -1619,6 -1638,86 +1640,86 @@@ DEFINE_DEBUGFS_ATTRIBUTE(fops_ib_preemp
  DEFINE_DEBUGFS_ATTRIBUTE(fops_sclk_set, NULL,
  			amdgpu_debugfs_sclk_set, "%llu\n");
  
+ static ssize_t amdgpu_reset_dump_register_list_read(struct file *f,
+ 				char __user *buf, size_t size, loff_t *pos)
+ {
+ 	struct amdgpu_device *adev = (struct amdgpu_device *)file_inode(f)->i_private;
+ 	char reg_offset[12];
+ 	int i, ret, len = 0;
+ 
+ 	if (*pos)
+ 		return 0;
+ 
+ 	memset(reg_offset, 0, 12);
 -	ret = down_read_killable(&adev->reset_sem);
++	ret = down_read_killable(&adev->reset_domain->sem);
+ 	if (ret)
+ 		return ret;
+ 
+ 	for (i = 0; i < adev->num_regs; i++) {
+ 		sprintf(reg_offset, "0x%x\n", adev->reset_dump_reg_list[i]);
 -		up_read(&adev->reset_sem);
++		up_read(&adev->reset_domain->sem);
+ 		if (copy_to_user(buf + len, reg_offset, strlen(reg_offset)))
+ 			return -EFAULT;
+ 
+ 		len += strlen(reg_offset);
 -		ret = down_read_killable(&adev->reset_sem);
++		ret = down_read_killable(&adev->reset_domain->sem);
+ 		if (ret)
+ 			return ret;
+ 	}
+ 
 -	up_read(&adev->reset_sem);
++	up_read(&adev->reset_domain->sem);
+ 	*pos += len;
+ 
+ 	return len;
+ }
+ 
+ static ssize_t amdgpu_reset_dump_register_list_write(struct file *f,
+ 			const char __user *buf, size_t size, loff_t *pos)
+ {
+ 	struct amdgpu_device *adev = (struct amdgpu_device *)file_inode(f)->i_private;
+ 	char reg_offset[11];
+ 	uint32_t *tmp;
+ 	int ret, i = 0, len = 0;
+ 
+ 	do {
+ 		memset(reg_offset, 0, 11);
+ 		if (copy_from_user(reg_offset, buf + len,
+ 					min(10, ((int)size-len)))) {
+ 			ret = -EFAULT;
+ 			goto error_free;
+ 		}
+ 
+ 		tmp = krealloc_array(tmp, i + 1, sizeof(uint32_t), GFP_KERNEL);
+ 		if (sscanf(reg_offset, "%X %n", &tmp[i], &ret) != 1) {
+ 			ret = -EINVAL;
+ 			goto error_free;
+ 		}
+ 
+ 		len += ret;
+ 		i++;
+ 	} while (len < size);
+ 
 -	ret = down_write_killable(&adev->reset_sem);
++	ret = down_write_killable(&adev->reset_domain->sem);
+ 	if (ret)
+ 		goto error_free;
+ 
+ 	swap(adev->reset_dump_reg_list, tmp);
+ 	adev->num_regs = i;
 -	up_write(&adev->reset_sem);
++	up_write(&adev->reset_domain->sem);
+ 	ret = size;
+ 
+ error_free:
+ 	kfree(tmp);
+ 	return ret;
+ }
+ 
+ static const struct file_operations amdgpu_reset_dump_register_list = {
+ 	.owner = THIS_MODULE,
+ 	.read = amdgpu_reset_dump_register_list_read,
+ 	.write = amdgpu_reset_dump_register_list_write,
+ 	.llseek = default_llseek
+ };
+ 
  int amdgpu_debugfs_init(struct amdgpu_device *adev)
  {
  	struct dentry *root = adev_to_drm(adev)->primary->debugfs_root;
diff --cc drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index ca8e76771ea1,6113ddc765a7..ca854626a108
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@@ -4723,6 -4643,22 +4716,22 @@@ int amdgpu_device_pre_asic_reset(struc
  	return r;
  }
  
+ static int amdgpu_reset_reg_dumps(struct amdgpu_device *adev)
+ {
+ 	uint32_t reg_value;
+ 	int i;
+ 
 -	lockdep_assert_held(&adev->reset_sem);
++	lockdep_assert_held(&adev->reset_domain->sem);
+ 	dump_stack();
+ 
+ 	for (i = 0; i < adev->num_regs; i++) {
+ 		reg_value = RREG32(adev->reset_dump_reg_list[i]);
+ 		trace_amdgpu_reset_reg_dumps(adev->reset_dump_reg_list[i], reg_value);
+ 	}
+ 
+ 	return 0;
+ }
+ 
  int amdgpu_do_asic_reset(struct list_head *device_list_handle,
  			 struct amdgpu_reset_context *reset_context)
  {
diff --cc drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
index 0e8c5e6b2a5b,77f9d94743a1..777210811311
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
@@@ -853,12 -857,12 +853,12 @@@ static int psr_capability_show(struct s
  	if (!(link->connector_signal & SIGNAL_TYPE_EDP))
  		return -ENODEV;
  
- 	seq_printf(m, "Sink support: %s", str_yes_no(link->dpcd_caps.psr_caps.psr_version != 0));
- 	if (link->dpcd_caps.psr_caps.psr_version)
- 		seq_printf(m, " [0x%02x]", link->dpcd_caps.psr_caps.psr_version);
 -	seq_printf(m, "Sink support: %s", yesno(link->dpcd_caps.psr_info.psr_version != 0));
++	seq_printf(m, "Sink support: %s", str_yes_no(link->dpcd_caps.psr_info.psr_version != 0));
+ 	if (link->dpcd_caps.psr_info.psr_version)
+ 		seq_printf(m, " [0x%02x]", link->dpcd_caps.psr_info.psr_version);
  	seq_puts(m, "\n");
  
 -	seq_printf(m, "Driver support: %s", yesno(link->psr_settings.psr_feature_enabled));
 +	seq_printf(m, "Driver support: %s", str_yes_no(link->psr_settings.psr_feature_enabled));
  	if (link->psr_settings.psr_version)
  		seq_printf(m, " [0x%02x]", link->psr_settings.psr_version);
  	seq_puts(m, "\n");