<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Series is:</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Reviewed-by: Alex Deucher <alexander.deucher@amd.com><br>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> amd-gfx <amd-gfx-bounces@lists.freedesktop.org> on behalf of Russell, Kent <Kent.Russell@amd.com><br>
<b>Sent:</b> Wednesday, May 1, 2019 8:01 AM<br>
<b>To:</b> amd-gfx@lists.freedesktop.org<br>
<b>Cc:</b> Russell, Kent<br>
<b>Subject:</b> [PATCH 2/2] drm/amdgpu: Add PCIe replay count sysfs file</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">[CAUTION: External Email]<br>
<br>
Add a sysfs file for reporting the number of PCIe replays (NAKs). This<br>
returns the sum of NAKs received and NAKs generated<br>
<br>
Change-Id: I135d5964ea13309754f80519c84a4eb3d360aab6<br>
Signed-off-by: Kent Russell <kent.russell@amd.com><br>
---<br>
 drivers/gpu/drm/amd/amdgpu/amdgpu.h        |  3 +++<br>
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 29 ++++++++++++++++++++++<br>
 drivers/gpu/drm/amd/amdgpu/cik.c           | 13 ++++++++++<br>
 drivers/gpu/drm/amd/amdgpu/si.c            | 13 ++++++++++<br>
 drivers/gpu/drm/amd/amdgpu/soc15.c         | 14 +++++++++++<br>
 drivers/gpu/drm/amd/amdgpu/vi.c            | 13 ++++++++++<br>
 6 files changed, 85 insertions(+)<br>
<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h<br>
index 50b2a4f5a4de..686e7ee29912 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h<br>
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h<br>
@@ -558,6 +558,8 @@ struct amdgpu_asic_funcs {<br>
                               uint64_t *count1);<br>
        /* do we need to reset the asic at init time (e.g., kexec) */<br>
        bool (*need_reset_on_init)(struct amdgpu_device *adev);<br>
+       /* PCIe replay counter */<br>
+       uint64_t (*get_pcie_replay_count)(struct amdgpu_device *adev);<br>
 };<br>
<br>
 /*<br>
@@ -1080,6 +1082,7 @@ int emu_soc_asic_init(struct amdgpu_device *adev);<br>
 #define amdgpu_asic_init_doorbell_index(adev) (adev)->asic_funcs->init_doorbell_index((adev))<br>
 #define amdgpu_asic_get_pcie_usage(adev, cnt0, cnt1) ((adev)->asic_funcs->get_pcie_usage((adev), (cnt0), (cnt1)))<br>
 #define amdgpu_asic_need_reset_on_init(adev) (adev)->asic_funcs->need_reset_on_init((adev))<br>
+#define amdgpu_asic_get_pcie_replay_count(adev) ((adev)->asic_funcs->get_pcie_replay_count((adev)))<br>
<br>
 /* Common functions */<br>
 bool amdgpu_device_should_recover_gpu(struct amdgpu_device *adev);<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<br>
index 4edbe2029fb1..3f1c6b2d3d87 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<br>
@@ -97,6 +97,28 @@ static const char *amdgpu_asic_name[] = {<br>
        "LAST",<br>
 };<br>
<br>
+/**<br>
+ * DOC: pcie_replay_count<br>
+ *<br>
+ * The amdgpu driver provides a sysfs API for reporting the total number<br>
+ * of PCIe replays (NAKs)<br>
+ * The file pcie_replay_count is used for this and returns the total<br>
+ * number of replays as a sum of the NAKs generated and NAKs received<br>
+ */<br>
+<br>
+static ssize_t amdgpu_device_get_pcie_replay_count(struct device *dev,<br>
+               struct device_attribute *attr, char *buf)<br>
+{<br>
+       struct drm_device *ddev = dev_get_drvdata(dev);<br>
+       struct amdgpu_device *adev = ddev->dev_private;<br>
+       uint64_t cnt = amdgpu_asic_get_pcie_replay_count(adev);<br>
+<br>
+       return snprintf(buf, PAGE_SIZE, "%llu\n", cnt);<br>
+}<br>
+<br>
+static DEVICE_ATTR(pcie_replay_count, S_IRUGO,<br>
+               amdgpu_device_get_pcie_replay_count, NULL);<br>
+<br>
 static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev);<br>
<br>
 /**<br>
@@ -2721,6 +2743,12 @@ int amdgpu_device_init(struct amdgpu_device *adev,<br>
        /* must succeed. */<br>
        amdgpu_ras_post_init(adev);<br>
<br>
+       r = device_create_file(adev->dev, &dev_attr_pcie_replay_count);<br>
+       if (r) {<br>
+               dev_err(adev->dev, "Could not create pcie_replay_count");<br>
+               return r;<br>
+       }<br>
+<br>
        return 0;<br>
<br>
 failed:<br>
@@ -2784,6 +2812,7 @@ void amdgpu_device_fini(struct amdgpu_device *adev)<br>
        adev->rmmio = NULL;<br>
        amdgpu_device_doorbell_fini(adev);<br>
        amdgpu_debugfs_regs_cleanup(adev);<br>
+       device_remove_file(adev->dev, &dev_attr_pcie_replay_count);<br>
 }<br>
<br>
<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c b/drivers/gpu/drm/amd/amdgpu/cik.c<br>
index 07c1f239e9c3..3a4f20766a39 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/cik.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/cik.c<br>
@@ -1804,6 +1804,18 @@ static bool cik_need_reset_on_init(struct amdgpu_device *adev)<br>
        return false;<br>
 }<br>
<br>
+static uint64_t cik_get_pcie_replay_count(struct amdgpu_device *adev)<br>
+{<br>
+       uint64_t nak_r, nak_g;<br>
+<br>
+       /* Get the number of NAKs received and generated */<br>
+       nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);<br>
+       nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);<br>
+<br>
+       /* Add the total number of NAKs, i.e the number of replays */<br>
+       return (nak_r + nak_g);<br>
+}<br>
+<br>
 static const struct amdgpu_asic_funcs cik_asic_funcs =<br>
 {<br>
        .read_disabled_bios = &cik_read_disabled_bios,<br>
@@ -1821,6 +1833,7 @@ static const struct amdgpu_asic_funcs cik_asic_funcs =<br>
        .init_doorbell_index = &legacy_doorbell_index_init,<br>
        .get_pcie_usage = &cik_get_pcie_usage,<br>
        .need_reset_on_init = &cik_need_reset_on_init,<br>
+       .get_pcie_replay_count = &cik_get_pcie_replay_count,<br>
 };<br>
<br>
 static int cik_common_early_init(void *handle)<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/si.c b/drivers/gpu/drm/amd/amdgpu/si.c<br>
index 9d8df68893b9..4ff930a47e10 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/si.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/si.c<br>
@@ -1375,6 +1375,18 @@ static void si_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,<br>
        *count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);<br>
 }<br>
<br>
+static uint64_t si_get_pcie_replay_count(struct amdgpu_device *adev)<br>
+{<br>
+       uint64_t nak_r, nak_g;<br>
+<br>
+       /* Get the number of NAKs received and generated */<br>
+       nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);<br>
+       nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);<br>
+<br>
+       /* Add the total number of NAKs, i.e the number of replays */<br>
+       return (nak_r + nak_g);<br>
+}<br>
+<br>
 static const struct amdgpu_asic_funcs si_asic_funcs =<br>
 {<br>
        .read_disabled_bios = &si_read_disabled_bios,<br>
@@ -1393,6 +1405,7 @@ static const struct amdgpu_asic_funcs si_asic_funcs =<br>
        .need_full_reset = &si_need_full_reset,<br>
        .get_pcie_usage = &si_get_pcie_usage,<br>
        .need_reset_on_init = &si_need_reset_on_init,<br>
+       .get_pcie_replay_count = &si_get_pcie_replay_count,<br>
 };<br>
<br>
 static uint32_t si_get_rev_id(struct amdgpu_device *adev)<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c<br>
index 78bd00a0142f..78b27c03b8c2 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/soc15.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/soc15.c<br>
@@ -745,6 +745,18 @@ static bool soc15_need_reset_on_init(struct amdgpu_device *adev)<br>
        return false;<br>
 }<br>
<br>
+static uint64_t soc15_get_pcie_replay_count(struct amdgpu_device *adev)<br>
+{<br>
+       uint64_t nak_r, nak_g;<br>
+<br>
+       /* Get the number of NAKs received and generated */<br>
+       nak_r = RREG32_PCIE(smnPCIE_RX_NUM_NAK);<br>
+       nak_g = RREG32_PCIE(smnPCIE_RX_NUM_NAK_GENERATED);<br>
+<br>
+       /* Add the total number of NAKs, i.e the number of replays */<br>
+       return (nak_r + nak_g);<br>
+}<br>
+<br>
 static const struct amdgpu_asic_funcs soc15_asic_funcs =<br>
 {<br>
        .read_disabled_bios = &soc15_read_disabled_bios,<br>
@@ -762,6 +774,7 @@ static const struct amdgpu_asic_funcs soc15_asic_funcs =<br>
        .init_doorbell_index = &vega10_doorbell_index_init,<br>
        .get_pcie_usage = &soc15_get_pcie_usage,<br>
        .need_reset_on_init = &soc15_need_reset_on_init,<br>
+       .get_pcie_replay_count = &soc15_get_pcie_replay_count,<br>
 };<br>
<br>
 static const struct amdgpu_asic_funcs vega20_asic_funcs =<br>
@@ -781,6 +794,7 @@ static const struct amdgpu_asic_funcs vega20_asic_funcs =<br>
        .init_doorbell_index = &vega20_doorbell_index_init,<br>
        .get_pcie_usage = &soc15_get_pcie_usage,<br>
        .need_reset_on_init = &soc15_need_reset_on_init,<br>
+       .get_pcie_replay_count = &soc15_get_pcie_replay_count,<br>
 };<br>
<br>
 static int soc15_common_early_init(void *handle)<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c<br>
index 5e5b42a0744a..b8adf3808de2 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/vi.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/vi.c<br>
@@ -987,6 +987,18 @@ static void vi_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,<br>
        *count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);<br>
 }<br>
<br>
+static uint64_t vi_get_pcie_replay_count(struct amdgpu_device *adev)<br>
+{<br>
+       uint64_t nak_r, nak_g;<br>
+<br>
+       /* Get the number of NAKs received and generated */<br>
+       nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);<br>
+       nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);<br>
+<br>
+       /* Add the total number of NAKs, i.e the number of replays */<br>
+       return (nak_r + nak_g);<br>
+}<br>
+<br>
 static bool vi_need_reset_on_init(struct amdgpu_device *adev)<br>
 {<br>
        u32 clock_cntl, pc;<br>
@@ -1021,6 +1033,7 @@ static const struct amdgpu_asic_funcs vi_asic_funcs =<br>
        .init_doorbell_index = &legacy_doorbell_index_init,<br>
        .get_pcie_usage = &vi_get_pcie_usage,<br>
        .need_reset_on_init = &vi_need_reset_on_init,<br>
+       .get_pcie_replay_count = &vi_get_pcie_replay_count,<br>
 };<br>
<br>
 #define CZ_REV_BRISTOL(rev)     \<br>
--<br>
2.17.1<br>
<br>
_______________________________________________<br>
amd-gfx mailing list<br>
amd-gfx@lists.freedesktop.org<br>
<a href="https://lists.freedesktop.org/mailman/listinfo/amd-gfx">https://lists.freedesktop.org/mailman/listinfo/amd-gfx</a><br>
</div>
</span></font></div>
</body>
</html>