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