From: Dave Airlie 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-Tag: core-urgent-2022-04-03~84^2~11 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=38a15ad9488e21cad8f42d3befca20f91e5b2874;p=users%2Fdwmw2%2Flinux.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 From: Alex Deucher 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 8685784f24a92,d990ebfd2afc8..37ff8cf5bbede --- 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 ae0c832376088,9eb9b440bd438..426b63e4f1f6c --- 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 ca8e76771ea17,6113ddc765a74..ca854626a1082 --- 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 0e8c5e6b2a5b8,77f9d94743a16..777210811311e --- 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");