drm/amdgpu: add get_retire_flip_bits for UMC
authorTao Zhou <tao.zhou1@amd.com>
Thu, 10 Apr 2025 11:29:57 +0000 (19:29 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 13 May 2025 13:32:01 +0000 (09:32 -0400)
Add the general interface to get flip bits for RAS bad page retirement.

Signed-off-by: Tao Zhou <tao.zhou1@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h

index babc3c9cad65a4c8f059b59b2e057f850a9737a7..cf794cf7e262986f372ec4b9ce79f3e541a6940a 100644 (file)
@@ -3473,6 +3473,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)
index 857693bcd8d476fc7736bf2b4559135c110f7611..78a8b8654573b2db4af7c18d1d16b6d613368bdf 100644 (file)
 #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);