Add the sysfs interface for vcn:
vcn_reset_mask

The interface is read-only and show the resets supported by the IP.
For example, full adapter reset (mode1/mode2/BACO/etc),
soft reset, queue reset, and pipe reset.

V2: the sysfs node returns a text string instead of some flags (Christian)

Signed-off-by: Jesse Zhang <jesse.zh...@amd.com>
Suggested-by:Alex Deucher <alexander.deuc...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 48 +++++++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h |  2 ++
 drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c   |  6 ++++
 drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c   |  4 +++
 drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c   |  5 +++
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c   |  5 +++
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c |  4 +++
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c |  5 +++
 drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c |  6 ++++
 9 files changed, 85 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index 43f44cc201cb..7ae52c7026d3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -1277,3 +1277,51 @@ int amdgpu_vcn_psp_update_sram(struct amdgpu_device 
*adev, int inst_idx,
 
        return psp_execute_ip_fw_load(&adev->psp, &ucode);
 }
+
+static ssize_t amdgpu_get_vcn_reset_mask(struct device *dev,
+                                               struct device_attribute *attr,
+                                               char *buf)
+{
+       struct drm_device *ddev = dev_get_drvdata(dev);
+       struct amdgpu_device *adev = drm_to_adev(ddev);
+       ssize_t size = 0;
+       struct amdgpu_ring *ring = &adev->vcn.inst[0].ring_enc[0];
+
+       if (!adev || !ring)
+               return -ENODEV;
+
+       if (amdgpu_device_should_recover_gpu(adev))
+               size += sysfs_emit_at(buf, size, "full ");
+
+       if (amdgpu_gpu_recovery && unlikely(!adev->debug_disable_soft_recovery)
+                       && !amdgpu_sriov_vf(adev) && ring->funcs->soft_recovery)
+               size += sysfs_emit_at(buf, size, "soft ");
+
+       if (amdgpu_gpu_recovery && ring->funcs->reset)
+               size += sysfs_emit_at(buf, size, "queue ");
+
+       size += sysfs_emit_at(buf, size, "\n");
+       return size;
+}
+
+static DEVICE_ATTR(vcn_reset_mask, 0444,
+                  amdgpu_get_vcn_reset_mask, NULL);
+
+int amdgpu_vcn_sysfs_reset_mask_init(struct amdgpu_device *adev)
+{
+       int r = 0;
+
+       if (adev->vcn.num_vcn_inst) {
+               r = device_create_file(adev->dev, &dev_attr_vcn_reset_mask);
+               if (r)
+                       return r;
+       }
+
+       return r;
+}
+
+void amdgpu_vcn_sysfs_reset_mask_fini(struct amdgpu_device *adev)
+{
+       if (adev->vcn.num_vcn_inst)
+               device_remove_file(adev->dev, &dev_attr_vcn_reset_mask);
+}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
index 2a1f3dbb14d3..d52c3f752c06 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
@@ -518,5 +518,7 @@ int amdgpu_vcn_ras_sw_init(struct amdgpu_device *adev);
 
 int amdgpu_vcn_psp_update_sram(struct amdgpu_device *adev, int inst_idx,
                               enum AMDGPU_UCODE_ID ucode_id);
+int amdgpu_vcn_sysfs_reset_mask_init(struct amdgpu_device *adev);
+void amdgpu_vcn_sysfs_reset_mask_fini(struct amdgpu_device *adev);
 
 #endif
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
index 129c759772c2..5d03d4c0a273 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
@@ -207,6 +207,11 @@ static int vcn_v1_0_sw_init(struct amdgpu_ip_block 
*ip_block)
        } else {
                adev->vcn.ip_dump = ptr;
        }
+
+       r = amdgpu_vcn_sysfs_reset_mask_init(adev);
+       if (r)
+               return r;
+
        return r;
 }
 
@@ -228,6 +233,7 @@ static int vcn_v1_0_sw_fini(struct amdgpu_ip_block 
*ip_block)
 
        jpeg_v1_0_sw_fini(ip_block);
 
+       amdgpu_vcn_sysfs_reset_mask_fini(adev);
        r = amdgpu_vcn_sw_fini(adev);
 
        kfree(adev->vcn.ip_dump);
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
index 19bbd49f760e..6a7a55bc96bc 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
@@ -231,6 +231,9 @@ static int vcn_v2_0_sw_init(struct amdgpu_ip_block 
*ip_block)
                adev->vcn.ip_dump = ptr;
        }
 
+       r = amdgpu_vcn_sysfs_reset_mask_init(adev);
+       if (r)
+               return r;
        return 0;
 }
 
@@ -258,6 +261,7 @@ static int vcn_v2_0_sw_fini(struct amdgpu_ip_block 
*ip_block)
        if (r)
                return r;
 
+       amdgpu_vcn_sysfs_reset_mask_fini(adev);
        r = amdgpu_vcn_sw_fini(adev);
 
        kfree(adev->vcn.ip_dump);
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
index 13632c22d2f9..7c5838060bae 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
@@ -293,6 +293,10 @@ static int vcn_v3_0_sw_init(struct amdgpu_ip_block 
*ip_block)
                adev->vcn.ip_dump = ptr;
        }
 
+       r = amdgpu_vcn_sysfs_reset_mask_init(adev);
+       if (r)
+               return r;
+
        return 0;
 }
 
@@ -329,6 +333,7 @@ static int vcn_v3_0_sw_fini(struct amdgpu_ip_block 
*ip_block)
        if (r)
                return r;
 
+       amdgpu_vcn_sysfs_reset_mask_fini(adev);
        r = amdgpu_vcn_sw_fini(adev);
 
        kfree(adev->vcn.ip_dump);
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
index e7b7a8150ea7..b2fd59c55804 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
@@ -247,6 +247,10 @@ static int vcn_v4_0_sw_init(struct amdgpu_ip_block 
*ip_block)
                adev->vcn.ip_dump = ptr;
        }
 
+       r = amdgpu_vcn_sysfs_reset_mask_init(adev);
+       if (r)
+               return r;
+
        return 0;
 }
 
@@ -284,6 +288,7 @@ static int vcn_v4_0_sw_fini(struct amdgpu_ip_block 
*ip_block)
        if (r)
                return r;
 
+       amdgpu_vcn_sysfs_reset_mask_fini(adev);
        r = amdgpu_vcn_sw_fini(adev);
 
        kfree(adev->vcn.ip_dump);
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
index 6dcae398b2dc..d99787f4dce1 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
@@ -206,6 +206,9 @@ static int vcn_v4_0_3_sw_init(struct amdgpu_ip_block 
*ip_block)
                adev->vcn.ip_dump = ptr;
        }
 
+       r = amdgpu_vcn_sysfs_reset_mask_init(adev);
+       if (r)
+               return r;
        return 0;
 }
 
@@ -239,6 +242,7 @@ static int vcn_v4_0_3_sw_fini(struct amdgpu_ip_block 
*ip_block)
        if (r)
                return r;
 
+       amdgpu_vcn_sysfs_reset_mask_fini(adev);
        r = amdgpu_vcn_sw_fini(adev);
 
        kfree(adev->vcn.ip_dump);
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
index edb9cd8390b6..dc73d3d927e0 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
@@ -214,6 +214,11 @@ static int vcn_v4_0_5_sw_init(struct amdgpu_ip_block 
*ip_block)
        } else {
                adev->vcn.ip_dump = ptr;
        }
+
+       r = amdgpu_vcn_sysfs_reset_mask_init(adev);
+       if (r)
+               return r;
+
        return 0;
 }
 
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
index 89bf29fa6f8d..b1d8c31de764 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
@@ -181,6 +181,11 @@ static int vcn_v5_0_0_sw_init(struct amdgpu_ip_block 
*ip_block)
        } else {
                adev->vcn.ip_dump = ptr;
        }
+
+       r = amdgpu_vcn_sysfs_reset_mask_init(adev);
+       if (r)
+               return r;
+
        return 0;
 }
 
@@ -215,6 +220,7 @@ static int vcn_v5_0_0_sw_fini(struct amdgpu_ip_block 
*ip_block)
        if (r)
                return r;
 
+       amdgpu_vcn_sysfs_reset_mask_fini(adev);
        r = amdgpu_vcn_sw_fini(adev);
 
        kfree(adev->vcn.ip_dump);
-- 
2.25.1

Reply via email to