Use the query interface to simplify code.

Signed-off-by: Tao Zhou <tao.zh...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 31 ++++++++++++-------------
 1 file changed, 15 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
index 3deb716710e6..ae2248340ea4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
@@ -2834,11 +2834,8 @@ static int amdgpu_bad_page_notifier(struct 
notifier_block *nb,
        struct mce *m = (struct mce *)data;
        struct amdgpu_device *adev = NULL;
        uint32_t gpu_id = 0;
-       uint32_t umc_inst = 0;
-       uint32_t ch_inst, channel_index = 0;
+       uint32_t umc_inst = 0, ch_inst = 0;
        struct ras_err_data err_data = {0, 0, 0, NULL};
-       struct eeprom_table_record err_rec;
-       uint64_t retired_page;
 
        /*
         * If the error was generated in UMC_V2, which belongs to GPU UMCs,
@@ -2877,21 +2874,22 @@ static int amdgpu_bad_page_notifier(struct 
notifier_block *nb,
        dev_info(adev->dev, "Uncorrectable error detected in UMC inst: %d, 
chan_idx: %d",
                             umc_inst, ch_inst);
 
+       err_data.err_addr =
+               kcalloc(adev->umc.max_ras_err_cnt_per_query,
+                       sizeof(struct eeprom_table_record), GFP_KERNEL);
+       if(!err_data.err_addr) {
+               dev_warn(adev->dev, "Failed to alloc memory for "
+                               "umc error address record in mca notifier!\n");
+               return NOTIFY_DONE;
+       }
+
        /*
         * Translate UMC channel address to Physical address
         */
-       channel_index =
-               adev->umc.channel_idx_tbl[umc_inst * adev->umc.channel_inst_num
-                                         + ch_inst];
-
-       retired_page = ADDR_OF_8KB_BLOCK(m->addr) |
-                       ADDR_OF_256B_BLOCK(channel_index) |
-                       OFFSET_IN_256B_BLOCK(m->addr);
-
-       memset(&err_rec, 0x0, sizeof(struct eeprom_table_record));
-       err_data.err_addr = &err_rec;
-       amdgpu_umc_fill_error_record(&err_data, m->addr,
-                       retired_page, channel_index, umc_inst);
+       if (adev->umc.ras &&
+           adev->umc.ras->query_error_address_per_channel)
+               adev->umc.ras->query_error_address_per_channel(adev,
+                       &err_data, 0, ch_inst, umc_inst, m->addr);
 
        if (amdgpu_bad_page_threshold != 0) {
                amdgpu_ras_add_bad_pages(adev, err_data.err_addr,
@@ -2899,6 +2897,7 @@ static int amdgpu_bad_page_notifier(struct notifier_block 
*nb,
                amdgpu_ras_save_bad_pages(adev);
        }
 
+       kfree(err_data.err_addr);
        return NOTIFY_OK;
 }
 
-- 
2.35.1

Reply via email to