Add the general interface to get flip bits for RAS bad page retirement.

Signed-off-by: Tao Zhou <tao.zh...@amd.com>
Reviewed-by: Hawking Zhang <hawking.zh...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c |  4 ++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h | 15 +++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
index 32a8cd64d29a..a5a853894ab0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
@@ -3474,6 +3474,10 @@ int amdgpu_ras_init_badpage_info(struct amdgpu_device 
*adev)
        if (!adev->umc.ras || !adev->umc.ras->convert_ras_err_addr)
                control->ras_num_pa_recs = control->ras_num_recs;
 
+       if (adev->umc.ras &&
+           adev->umc.ras->get_retire_flip_bits)
+               adev->umc.ras->get_retire_flip_bits(adev);
+
        if (control->ras_num_recs) {
                ret = amdgpu_ras_load_bad_pages(adev);
                if (ret)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
index 857693bcd8d4..78a8b8654573 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
@@ -78,6 +78,18 @@
 #define UMC_NPS_SHIFT 40
 #define UMC_NPS_MASK 0xffULL
 
+/* three column bits and one row bit in MCA address flip
+ * in bad page retirement
+ */
+#define RETIRE_FLIP_BITS_NUM 4
+
+struct amdgpu_umc_flip_bits {
+       uint32_t flip_bits_in_pa[RETIRE_FLIP_BITS_NUM];
+       uint32_t flip_row_bit;
+       uint32_t r13_in_pa;
+       uint32_t bit_num;
+};
+
 typedef int (*umc_func)(struct amdgpu_device *adev, uint32_t node_inst,
                        uint32_t umc_inst, uint32_t ch_inst, void *data);
 
@@ -100,6 +112,7 @@ struct amdgpu_umc_ras {
                        bool dump_addr);
        uint32_t (*get_die_id_from_pa)(struct amdgpu_device *adev,
                        uint64_t mca_addr, uint64_t retired_page);
+       void (*get_retire_flip_bits)(struct amdgpu_device *adev);
 };
 
 struct amdgpu_umc_funcs {
@@ -130,6 +143,8 @@ struct amdgpu_umc {
 
        /* active mask for umc node instance */
        unsigned long active_mask;
+
+       struct amdgpu_umc_flip_bits flip_bits;
 };
 
 int amdgpu_umc_ras_sw_init(struct amdgpu_device *adev);
-- 
2.34.1

Reply via email to