RE: [PATCH 1/3] drm/amd/ras: move some umc v12 specific functions to ras_umc.c

"Zhang, Hawking" <[email protected]> Mon, 3 Aug 2026 06:30:15 +0000
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <EAYPR12MB99915806398B5BE3A4D52761B6FCD52@EAYPR12MB999158.namprd12.prod.outlook.com>
AMD General

Series is

Reviewed-by: Hawking Zhang <[email protected]>

Regards,
Hawking
-----Original Message-----
From: amd-gfx <[email protected]> On Behalf Of Tao Zhou
Sent: Monday, August 3, 2026 11:38 AM
To: [email protected]
Cc: Zhou1, Tao <[email protected]>
Subject: [PATCH 1/3] drm/amd/ras: move some umc v12 specific functions to r=
as_umc.c

So we can reuse these functions across different ASICs.

Signed-off-by: Tao Zhou <[email protected]>
---
 drivers/gpu/drm/amd/ras/rascore/ras_umc.c     | 101 +++++++++++++--
 drivers/gpu/drm/amd/ras/rascore/ras_umc.h     |  13 +-
 .../gpu/drm/amd/ras/rascore/ras_umc_v12_0.c   | 118 +++---------------
 3 files changed, 119 insertions(+), 113 deletions(-)

diff --git a/drivers/gpu/drm/amd/ras/rascore/ras_umc.c b/drivers/gpu/drm/am=
d/ras/rascore/ras_umc.c
index f59f0b6cad06..b8e3a92ab174 100644
--- a/drivers/gpu/drm/amd/ras/rascore/ras_umc.c
+++ b/drivers/gpu/drm/amd/ras/rascore/ras_umc.c
@@ -82,7 +82,7 @@ static const struct ras_umc_ip_func *ras_umc_get_ip_func(
        return NULL;
 }

-int ras_umc_psp_convert_ma_to_pa(struct ras_core_context *ras_core,
+int ras_umc_psp_ma2pa(struct ras_core_context *ras_core,
                struct umc_mca_addr *in, struct umc_phy_addr *out,
                uint32_t nps)
 {
@@ -307,6 +307,83 @@ int ras_umc_log_bad_bank(struct ras_core_context *ras_=
core, struct ras_bank_ecc
        return ret;
 }

+int ras_umc_ma2pa(struct ras_core_context *ras_core,
+       struct umc_mca_addr *addr_in, struct umc_phy_addr *addr_out,
+       uint32_t nps)
+{
+       struct ras_umc *ras_umc =3D &ras_core->ras_umc;
+       int ret;
+
+       if (ras_psp_check_supported_cmd(ras_core, RAS_TA_CMD_ID__QUERY_ADDR=
ESS))
+               ret =3D ras_umc_psp_ma2pa(ras_core, addr_in, addr_out, nps)=
;
+       else
+               ret =3D ras_umc->ip_func->ma2pa(ras_core, addr_in,
+                               addr_out, nps);
+
+       return ret;
+}
+
+static int ras_umc_eeprom_rec2nps_addr(struct ras_core_context *ras_core,
+       struct eeprom_umc_record *record, uint64_t *pa, uint32_t nps) {
+       struct device_system_info dev_info =3D {0};
+       struct umc_mca_addr addr_in;
+       struct umc_phy_addr addr_out;
+       int ret;
+
+       memset(&addr_in, 0, sizeof(addr_in));
+       memset(&addr_out, 0, sizeof(addr_out));
+
+       ras_core_get_device_system_info(ras_core, &dev_info);
+
+       addr_in.err_addr =3D record->address;
+       addr_in.ch_inst =3D record->mem_channel;
+       addr_in.umc_inst =3D record->mcumc_id;
+       addr_in.node_inst =3D UMC_INV_AID_NODE;
+       addr_in.socket_id =3D dev_info.socket_id;
+
+       ret =3D ras_umc_ma2pa(ras_core, &addr_in, &addr_out, nps);
+       if (ret)
+               return ret;
+
+       *pa =3D ras_core->ras_umc.ip_func->nps_pa_to_row_pa(ras_core,
+addr_out.pa, nps, false);
+
+       return 0;
+}
+
+static int ras_umc_eeprom_rec2nps_rec(struct ras_core_context *ras_core,
+       struct eeprom_umc_record *record, uint32_t nps) {
+       uint64_t ch_idx_v2, pa =3D 0;
+       uint32_t save_nps;
+       int ret =3D 0;
+
+       save_nps =3D EEPROM_RECORD_UMC_NPS_MODE(record);
+       /* eeprom v2 has no stored nps, always convert if the flag is set *=
/
+       ch_idx_v2 =3D record->retired_row_pfn & UMC_CHANNEL_IDX_V2;
+
+       if (save_nps || ch_idx_v2) {
+               if ((nps =3D=3D save_nps) && !ras_fw_eeprom_supported(ras_c=
ore)) {
+                       record->cur_nps_retired_row_pfn =3D
+                               EEPROM_RECORD_UMC_ADDR_PFN(record);
+               } else {
+                       ret =3D ras_umc_eeprom_rec2nps_addr(ras_core, recor=
d, &pa, nps);
+                       if (!ret)
+                               record->cur_nps_retired_row_pfn =3D RAS_ADD=
R_TO_PFN(pa);
+               }
+       } else {
+               /* old eeprom data format, the scope of channel index is
+                * limited to umc instance
+                */
+               /* TODO */
+               ret =3D -EOPNOTSUPP;
+       }
+
+       record->cur_nps =3D nps;
+
+       return ret;
+}
+
 static int ras_umc_get_new_records(struct ras_core_context *ras_core,
                        struct eeprom_umc_record *records, u32 num)  { @@ -=
343,12 +420,11 @@ static bool ras_umc_check_retired_record(struct ras_core_=
context *ras_core,

        if (from_eeprom) {
                nps =3D ras_umc->umc_err_data.umc_nps_mode;
-               if (ras_umc->ip_func && ras_umc->ip_func->eeprom_record_to_=
nps_record) {
-                       ret =3D ras_umc->ip_func->eeprom_record_to_nps_reco=
rd(ras_core, record, nps);
-                       if (ret)
-                               RAS_DEV_WARN_RATELIMITED(ras_core->dev,
-                                       "Failed to adjust eeprom record, re=
t:%d", ret);
-               }
+               ret =3D ras_umc_eeprom_rec2nps_rec(ras_core, record, nps);
+               if (ret)
+                       RAS_DEV_WARN_RATELIMITED(ras_core->dev,
+                               "Failed to adjust eeprom record, ret:%d", r=
et);
+
                return false;
        }

@@ -805,3 +881,14 @@ int ras_umc_translate_soc_pa_and_bank(struct ras_core_=
context *ras_core,

        return ret;
 }
+
+bool ras_umc_bit_wise_xor(uint32_t val) {
+       bool result =3D 0;
+       int i;
+
+       for (i =3D 0; i < 32; i++)
+               result =3D result ^ ((val >> i) & 0x1);
+
+       return result;
+}
diff --git a/drivers/gpu/drm/amd/ras/rascore/ras_umc.h b/drivers/gpu/drm/am=
d/ras/rascore/ras_umc.h
index 3d902b0d663a..9d32ac344316 100644
--- a/drivers/gpu/drm/amd/ras/rascore/ras_umc.h
+++ b/drivers/gpu/drm/amd/ras/rascore/ras_umc.h
@@ -119,8 +119,6 @@ struct umc_bank_addr {  struct ras_umc_ip_func {
        int (*bank_to_eeprom_record)(struct ras_core_context *ras_core,
                        struct ras_bank_ecc *bank, struct eeprom_umc_record=
 *record);
-       int (*eeprom_record_to_nps_record)(struct ras_core_context *ras_cor=
e,
-                       struct eeprom_umc_record *record, uint32_t nps);
        int (*eeprom_record_to_nps_pages)(struct ras_core_context *ras_core=
,
                        struct eeprom_umc_record *record, uint32_t nps,
                        uint64_t *pfns, uint32_t num);
@@ -130,6 +128,11 @@ struct ras_umc_ip_func {
                        uint64_t soc_pa, struct umc_bank_addr *bank_addr);
        void (*mca_ipid_parse)(struct ras_core_context *ras_core, uint64_t =
ipid,
                        uint32_t *did, uint32_t *ch, uint32_t *umc_inst, ui=
nt32_t *sid);
+       int (*ma2pa)(struct ras_core_context *ras_core,
+               struct umc_mca_addr *addr_in, struct umc_phy_addr *addr_out=
,
+               uint32_t nps);
+       uint64_t (*nps_pa_to_row_pa)(struct ras_core_context *ras_core,
+               uint64_t pa, enum umc_memory_partition_mode nps, bool zero_=
pfn_ok);
 };

 struct eeprom_store_record {
@@ -184,7 +187,7 @@ int ras_umc_sw_init(struct ras_core_context *ras);  int=
 ras_umc_sw_fini(struct ras_core_context *ras);  int ras_umc_hw_init(struct=
 ras_core_context *ras);  int ras_umc_hw_fini(struct ras_core_context *ras)=
; -int ras_umc_psp_convert_ma_to_pa(struct ras_core_context *ras_core,
+int ras_umc_psp_ma2pa(struct ras_core_context *ras_core,
                struct umc_mca_addr *in, struct umc_phy_addr *out,
                uint32_t nps);
 int ras_umc_handle_bad_pages(struct ras_core_context *ras_core, void *data=
); @@ -207,4 +210,8 @@ int ras_umc_translate_soc_pa_and_bank(struct ras_cor=
e_context *ras_core,  int ras_umc_convert_record_to_nps_pages(struct ras_co=
re_context *ras_core,
                struct eeprom_umc_record *record, uint32_t nps,
                uint64_t *page_pfn, uint32_t max_pages);
+bool ras_umc_bit_wise_xor(uint32_t val); int ras_umc_ma2pa(struct
+ras_core_context *ras_core,
+       struct umc_mca_addr *addr_in, struct umc_phy_addr *addr_out,
+       uint32_t nps);
 #endif
diff --git a/drivers/gpu/drm/amd/ras/rascore/ras_umc_v12_0.c b/drivers/gpu/=
drm/amd/ras/rascore/ras_umc_v12_0.c
index 6bf30dee8d17..73eb1dba16ec 100644
--- a/drivers/gpu/drm/amd/ras/rascore/ras_umc_v12_0.c
+++ b/drivers/gpu/drm/amd/ras/rascore/ras_umc_v12_0.c
@@ -48,17 +48,6 @@ static const uint32_t umc_v12_0_ma2na_mapping[] =3D {
        24, 7,  29, 30,
 };

-static bool umc_v12_0_bit_wise_xor(uint32_t val) -{
-       bool result =3D 0;
-       int i;
-
-       for (i =3D 0; i < 32; i++)
-               result =3D result ^ ((val >> i) & 0x1);
-
-       return result;
-}
-
 static void __get_nps_pa_flip_bits(struct ras_core_context *ras_core,
                        enum umc_memory_partition_mode nps,
                        struct umc_flip_bits *flip_bits)
@@ -159,7 +148,7 @@ static void __get_nps_pa_flip_bits(struct ras_core_cont=
ext *ras_core,
        }
 }

-static uint64_t  convert_nps_pa_to_row_pa(struct ras_core_context *ras_cor=
e,
+static uint64_t  umc_v12_0_nps_pa_to_row_pa(struct ras_core_context
+*ras_core,
                uint64_t pa, enum umc_memory_partition_mode nps, bool zero_=
pfn_ok)  {
        struct umc_flip_bits flip_bits =3D {0};
@@ -193,7 +182,7 @@ static int lookup_bad_pages_in_a_row(struct ras_core_co=
ntext *ras_core,

        __get_nps_pa_flip_bits(ras_core, nps, &flip_bits);

-       row_pa =3D convert_nps_pa_to_row_pa(ras_core, retired_addr, nps, tr=
ue);
+       row_pa =3D umc_v12_0_nps_pa_to_row_pa(ras_core, retired_addr, nps,
+true);

        err_addr =3D record->address;
        /* get column bit 0 and 1 in mca address */ @@ -240,7 +229,7 @@ sta=
tic int lookup_bad_pages_in_a_row(struct ras_core_context *ras_core,
        return idx;
 }

-static int umc_v12_convert_ma_to_pa(struct ras_core_context *ras_core,
+static int umc_v12_ma2pa(struct ras_core_context *ras_core,
                        struct umc_mca_addr *addr_in, struct umc_phy_addr *=
addr_out,
                        uint32_t nps)
 {
@@ -277,20 +266,20 @@ static int umc_v12_convert_ma_to_pa(struct ras_core_c=
ontext *ras_core,
        /* apply bank hash algorithm */
        bank0 =3D
                bank_hash0 ^ (UMC_V12_0_XOR_EN0 &
-               (umc_v12_0_bit_wise_xor(col & UMC_V12_0_COL_XOR0) ^
-               (umc_v12_0_bit_wise_xor(row & UMC_V12_0_ROW_XOR0))));
+               (ras_umc_bit_wise_xor(col & UMC_V12_0_COL_XOR0) ^
+               (ras_umc_bit_wise_xor(row & UMC_V12_0_ROW_XOR0))));
        bank1 =3D
                bank_hash1 ^ (UMC_V12_0_XOR_EN1 &
-               (umc_v12_0_bit_wise_xor(col & UMC_V12_0_COL_XOR1) ^
-               (umc_v12_0_bit_wise_xor(row & UMC_V12_0_ROW_XOR1))));
+               (ras_umc_bit_wise_xor(col & UMC_V12_0_COL_XOR1) ^
+               (ras_umc_bit_wise_xor(row & UMC_V12_0_ROW_XOR1))));
        bank2 =3D
                bank_hash2 ^ (UMC_V12_0_XOR_EN2 &
-               (umc_v12_0_bit_wise_xor(col & UMC_V12_0_COL_XOR2) ^
-               (umc_v12_0_bit_wise_xor(row & UMC_V12_0_ROW_XOR2))));
+               (ras_umc_bit_wise_xor(col & UMC_V12_0_COL_XOR2) ^
+               (ras_umc_bit_wise_xor(row & UMC_V12_0_ROW_XOR2))));
        bank3 =3D
                bank_hash3 ^ (UMC_V12_0_XOR_EN3 &
-               (umc_v12_0_bit_wise_xor(col & UMC_V12_0_COL_XOR3) ^
-               (umc_v12_0_bit_wise_xor(row & UMC_V12_0_ROW_XOR3))));
+               (ras_umc_bit_wise_xor(col & UMC_V12_0_COL_XOR3) ^
+               (ras_umc_bit_wise_xor(row & UMC_V12_0_ROW_XOR3))));

        bank =3D bank0 | (bank1 << 1) | (bank2 << 2) | (bank3 << 3);
        err_addr &=3D ~0x3c0ULL;
@@ -360,22 +349,6 @@ static int umc_v12_convert_ma_to_pa(struct ras_core_co=
ntext *ras_core,
        return 0;
 }

-static int convert_ma_to_pa(struct ras_core_context *ras_core,
-                       struct umc_mca_addr *addr_in, struct umc_phy_addr *=
addr_out,
-                       uint32_t nps)
-{
-       int ret;
-
-       if (ras_psp_check_supported_cmd(ras_core, RAS_TA_CMD_ID__QUERY_ADDR=
ESS))
-               ret =3D ras_umc_psp_convert_ma_to_pa(ras_core,
-                               addr_in, addr_out, nps);
-       else
-               ret =3D umc_v12_convert_ma_to_pa(ras_core,
-                               addr_in, addr_out, nps);
-
-       return ret;
-}
-
 static int convert_bank_to_nps_addr(struct ras_core_context *ras_core,
                        struct ras_bank_ecc *bank, struct umc_phy_addr *pa_=
addr, uint32_t nps)  { @@ -392,10 +365,10 @@ static int convert_bank_to_nps=
_addr(struct ras_core_context *ras_core,
        addr_in.node_inst =3D ACA_IPID_2_DIE_ID(bank->ipid);
        addr_in.socket_id =3D ACA_IPID_2_SOCKET_ID(bank->ipid);

-       ret =3D convert_ma_to_pa(ras_core, &addr_in, &addr_out, nps);
+       ret =3D ras_umc_ma2pa(ras_core, &addr_in, &addr_out, nps);
        if (!ret) {
                pa_addr->pa =3D
-                       convert_nps_pa_to_row_pa(ras_core, addr_out.pa, nps=
, false);
+                       umc_v12_0_nps_pa_to_row_pa(ras_core, addr_out.pa, n=
ps, false);
                pa_addr->channel_idx =3D addr_out.channel_idx;
                pa_addr->bank =3D addr_out.bank;
        }
@@ -429,68 +402,6 @@ static int umc_v12_0_bank_to_eeprom_record(struct ras_=
core_context *ras_core,
        return 0;
 }

-static int convert_eeprom_record_to_nps_addr(struct ras_core_context *ras_=
core,
-                       struct eeprom_umc_record *record, uint64_t *pa, uin=
t32_t nps)
-{
-       struct device_system_info dev_info =3D {0};
-       struct umc_mca_addr addr_in;
-       struct umc_phy_addr addr_out;
-       int ret;
-
-       memset(&addr_in, 0, sizeof(addr_in));
-       memset(&addr_out, 0, sizeof(addr_out));
-
-       ras_core_get_device_system_info(ras_core, &dev_info);
-
-       addr_in.err_addr =3D record->address;
-       addr_in.ch_inst =3D record->mem_channel;
-       addr_in.umc_inst =3D record->mcumc_id;
-       addr_in.node_inst =3D UMC_INV_AID_NODE;
-       addr_in.socket_id =3D dev_info.socket_id;
-
-       ret =3D convert_ma_to_pa(ras_core, &addr_in, &addr_out, nps);
-       if (ret)
-               return ret;
-
-       *pa =3D convert_nps_pa_to_row_pa(ras_core, addr_out.pa, nps, false)=
;
-
-       return 0;
-}
-
-static int umc_v12_0_eeprom_record_to_nps_record(struct ras_core_context *=
ras_core,
-                               struct eeprom_umc_record *record, uint32_t =
nps)
-{
-       uint64_t ch_idx_v2, pa =3D 0;
-       uint32_t save_nps;
-       int ret =3D 0;
-
-       save_nps =3D EEPROM_RECORD_UMC_NPS_MODE(record);
-       /* eeprom v2 has no stored nps, always convert if the flag is set *=
/
-       ch_idx_v2 =3D record->retired_row_pfn & UMC_CHANNEL_IDX_V2;
-
-       if (save_nps || ch_idx_v2) {
-               if ((nps =3D=3D save_nps) && !ras_fw_eeprom_supported(ras_c=
ore)) {
-                       record->cur_nps_retired_row_pfn =3D
-                               EEPROM_RECORD_UMC_ADDR_PFN(record);
-               } else {
-                       ret =3D convert_eeprom_record_to_nps_addr(ras_core,
-                               record, &pa, nps);
-                       if (!ret)
-                               record->cur_nps_retired_row_pfn =3D RAS_ADD=
R_TO_PFN(pa);
-               }
-       } else {
-               /* old eeprom data format, the scope of channel index is
-                * limited to umc instance
-                */
-               /* TODO */
-               ret =3D -EOPNOTSUPP;
-       }
-
-       record->cur_nps =3D nps;
-
-       return ret;
-}
-
 static int umc_v12_0_eeprom_record_to_nps_pages(struct ras_core_context *r=
as_core,
                        struct eeprom_umc_record *record, uint32_t nps,
                        uint64_t *pfns, uint32_t num)
@@ -580,10 +491,11 @@ static void umc_v12_0_mca_ipid_parse(struct ras_core_=
context *ras_core, uint64_t

 const struct ras_umc_ip_func ras_umc_func_v12_0 =3D {
        .bank_to_eeprom_record =3D umc_v12_0_bank_to_eeprom_record,
-       .eeprom_record_to_nps_record =3D umc_v12_0_eeprom_record_to_nps_rec=
ord,
        .eeprom_record_to_nps_pages =3D umc_v12_0_eeprom_record_to_nps_page=
s,
        .bank_to_soc_pa =3D umc_12_0_bank_to_soc_pa,
        .soc_pa_to_bank =3D umc_12_0_soc_pa_to_bank,
        .mca_ipid_parse =3D umc_v12_0_mca_ipid_parse,
+       .ma2pa =3D umc_v12_ma2pa,
+       .nps_pa_to_row_pa =3D umc_v12_0_nps_pa_to_row_pa,
 };

--
2.34.1