@@ -15,6 +15,21 @@ static struct msr __percpu *msrs;
1515
1616static struct amd64_family_type * fam_type ;
1717
18+ static inline u32 get_umc_reg (u32 reg )
19+ {
20+ if (!fam_type -> flags .zn_regs_v2 )
21+ return reg ;
22+
23+ switch (reg ) {
24+ case UMCCH_ADDR_CFG : return UMCCH_ADDR_CFG_DDR5 ;
25+ case UMCCH_ADDR_MASK_SEC : return UMCCH_ADDR_MASK_SEC_DDR5 ;
26+ case UMCCH_DIMM_CFG : return UMCCH_DIMM_CFG_DDR5 ;
27+ }
28+
29+ WARN_ONCE (1 , "%s: unknown register 0x%x" , __func__ , reg );
30+ return 0 ;
31+ }
32+
1833/* Per-node stuff */
1934static struct ecc_settings * * ecc_stngs ;
2035
@@ -1429,8 +1444,10 @@ static void __dump_misc_regs_df(struct amd64_pvt *pvt)
14291444 edac_dbg (1 , "UMC%d x16 DIMMs present: %s\n" ,
14301445 i , (umc -> dimm_cfg & BIT (7 )) ? "yes" : "no" );
14311446
1432- if (pvt -> dram_type == MEM_LRDDR4 ) {
1433- amd_smn_read (pvt -> mc_node_id , umc_base + UMCCH_ADDR_CFG , & tmp );
1447+ if (umc -> dram_type == MEM_LRDDR4 || umc -> dram_type == MEM_LRDDR5 ) {
1448+ amd_smn_read (pvt -> mc_node_id ,
1449+ umc_base + get_umc_reg (UMCCH_ADDR_CFG ),
1450+ & tmp );
14341451 edac_dbg (1 , "UMC%d LRDIMM %dx rank multiply\n" ,
14351452 i , 1 << ((tmp >> 4 ) & 0x3 ));
14361453 }
@@ -1505,7 +1522,7 @@ static void prep_chip_selects(struct amd64_pvt *pvt)
15051522
15061523 for_each_umc (umc ) {
15071524 pvt -> csels [umc ].b_cnt = 4 ;
1508- pvt -> csels [umc ].m_cnt = 2 ;
1525+ pvt -> csels [umc ].m_cnt = fam_type -> flags . zn_regs_v2 ? 4 : 2 ;
15091526 }
15101527
15111528 } else {
@@ -1545,7 +1562,7 @@ static void read_umc_base_mask(struct amd64_pvt *pvt)
15451562 }
15461563
15471564 umc_mask_reg = get_umc_base (umc ) + UMCCH_ADDR_MASK ;
1548- umc_mask_reg_sec = get_umc_base (umc ) + UMCCH_ADDR_MASK_SEC ;
1565+ umc_mask_reg_sec = get_umc_base (umc ) + get_umc_reg ( UMCCH_ADDR_MASK_SEC ) ;
15491566
15501567 for_each_chip_select_mask (cs , umc , pvt ) {
15511568 mask = & pvt -> csels [umc ].csmasks [cs ];
@@ -1616,19 +1633,49 @@ static void read_dct_base_mask(struct amd64_pvt *pvt)
16161633 }
16171634}
16181635
1636+ static void determine_memory_type_df (struct amd64_pvt * pvt )
1637+ {
1638+ struct amd64_umc * umc ;
1639+ u32 i ;
1640+
1641+ for_each_umc (i ) {
1642+ umc = & pvt -> umc [i ];
1643+
1644+ if (!(umc -> sdp_ctrl & UMC_SDP_INIT )) {
1645+ umc -> dram_type = MEM_EMPTY ;
1646+ continue ;
1647+ }
1648+
1649+ /*
1650+ * Check if the system supports the "DDR Type" field in UMC Config
1651+ * and has DDR5 DIMMs in use.
1652+ */
1653+ if (fam_type -> flags .zn_regs_v2 && ((umc -> umc_cfg & GENMASK (2 , 0 )) == 0x1 )) {
1654+ if (umc -> dimm_cfg & BIT (5 ))
1655+ umc -> dram_type = MEM_LRDDR5 ;
1656+ else if (umc -> dimm_cfg & BIT (4 ))
1657+ umc -> dram_type = MEM_RDDR5 ;
1658+ else
1659+ umc -> dram_type = MEM_DDR5 ;
1660+ } else {
1661+ if (umc -> dimm_cfg & BIT (5 ))
1662+ umc -> dram_type = MEM_LRDDR4 ;
1663+ else if (umc -> dimm_cfg & BIT (4 ))
1664+ umc -> dram_type = MEM_RDDR4 ;
1665+ else
1666+ umc -> dram_type = MEM_DDR4 ;
1667+ }
1668+
1669+ edac_dbg (1 , " UMC%d DIMM type: %s\n" , i , edac_mem_types [umc -> dram_type ]);
1670+ }
1671+ }
1672+
16191673static void determine_memory_type (struct amd64_pvt * pvt )
16201674{
16211675 u32 dram_ctrl , dcsm ;
16221676
1623- if (pvt -> umc ) {
1624- if ((pvt -> umc [0 ].dimm_cfg | pvt -> umc [1 ].dimm_cfg ) & BIT (5 ))
1625- pvt -> dram_type = MEM_LRDDR4 ;
1626- else if ((pvt -> umc [0 ].dimm_cfg | pvt -> umc [1 ].dimm_cfg ) & BIT (4 ))
1627- pvt -> dram_type = MEM_RDDR4 ;
1628- else
1629- pvt -> dram_type = MEM_DDR4 ;
1630- return ;
1631- }
1677+ if (pvt -> umc )
1678+ return determine_memory_type_df (pvt );
16321679
16331680 switch (pvt -> fam ) {
16341681 case 0xf :
@@ -2149,6 +2196,7 @@ static int f17_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc,
21492196{
21502197 u32 addr_mask_orig , addr_mask_deinterleaved ;
21512198 u32 msb , weight , num_zero_bits ;
2199+ int cs_mask_nr = csrow_nr ;
21522200 int dimm , size = 0 ;
21532201
21542202 /* No Chip Selects are enabled. */
@@ -2164,17 +2212,33 @@ static int f17_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc,
21642212 return size ;
21652213
21662214 /*
2167- * There is one mask per DIMM, and two Chip Selects per DIMM.
2168- * CS0 and CS1 -> DIMM0
2169- * CS2 and CS3 -> DIMM1
2215+ * Family 17h introduced systems with one mask per DIMM,
2216+ * and two Chip Selects per DIMM.
2217+ *
2218+ * CS0 and CS1 -> MASK0 / DIMM0
2219+ * CS2 and CS3 -> MASK1 / DIMM1
2220+ *
2221+ * Family 19h Model 10h introduced systems with one mask per Chip Select,
2222+ * and two Chip Selects per DIMM.
2223+ *
2224+ * CS0 -> MASK0 -> DIMM0
2225+ * CS1 -> MASK1 -> DIMM0
2226+ * CS2 -> MASK2 -> DIMM1
2227+ * CS3 -> MASK3 -> DIMM1
2228+ *
2229+ * Keep the mask number equal to the Chip Select number for newer systems,
2230+ * and shift the mask number for older systems.
21702231 */
21712232 dimm = csrow_nr >> 1 ;
21722233
2234+ if (!fam_type -> flags .zn_regs_v2 )
2235+ cs_mask_nr >>= 1 ;
2236+
21732237 /* Asymmetric dual-rank DIMM support. */
21742238 if ((csrow_nr & 1 ) && (cs_mode & CS_ODD_SECONDARY ))
2175- addr_mask_orig = pvt -> csels [umc ].csmasks_sec [dimm ];
2239+ addr_mask_orig = pvt -> csels [umc ].csmasks_sec [cs_mask_nr ];
21762240 else
2177- addr_mask_orig = pvt -> csels [umc ].csmasks [dimm ];
2241+ addr_mask_orig = pvt -> csels [umc ].csmasks [cs_mask_nr ];
21782242
21792243 /*
21802244 * The number of zero bits in the mask is equal to the number of bits
@@ -2930,6 +2994,7 @@ static struct amd64_family_type family_types[] = {
29302994 .f0_id = PCI_DEVICE_ID_AMD_19H_M10H_DF_F0 ,
29312995 .f6_id = PCI_DEVICE_ID_AMD_19H_M10H_DF_F6 ,
29322996 .max_mcs = 12 ,
2997+ .flags .zn_regs_v2 = 1 ,
29332998 .ops = {
29342999 .early_channel_count = f17_early_channel_count ,
29353000 .dbam_to_cs = f17_addr_mask_to_cs_size ,
@@ -3368,7 +3433,7 @@ static void __read_mc_regs_df(struct amd64_pvt *pvt)
33683433 umc_base = get_umc_base (i );
33693434 umc = & pvt -> umc [i ];
33703435
3371- amd_smn_read (nid , umc_base + UMCCH_DIMM_CFG , & umc -> dimm_cfg );
3436+ amd_smn_read (nid , umc_base + get_umc_reg ( UMCCH_DIMM_CFG ) , & umc -> dimm_cfg );
33723437 amd_smn_read (nid , umc_base + UMCCH_UMC_CFG , & umc -> umc_cfg );
33733438 amd_smn_read (nid , umc_base + UMCCH_SDP_CTRL , & umc -> sdp_ctrl );
33743439 amd_smn_read (nid , umc_base + UMCCH_ECC_CTRL , & umc -> ecc_ctrl );
@@ -3452,7 +3517,9 @@ static void read_mc_regs(struct amd64_pvt *pvt)
34523517 read_dct_base_mask (pvt );
34533518
34543519 determine_memory_type (pvt );
3455- edac_dbg (1 , " DIMM type: %s\n" , edac_mem_types [pvt -> dram_type ]);
3520+
3521+ if (!pvt -> umc )
3522+ edac_dbg (1 , " DIMM type: %s\n" , edac_mem_types [pvt -> dram_type ]);
34563523
34573524 determine_ecc_sym_sz (pvt );
34583525}
@@ -3548,7 +3615,7 @@ static int init_csrows_df(struct mem_ctl_info *mci)
35483615 pvt -> mc_node_id , cs );
35493616
35503617 dimm -> nr_pages = get_csrow_nr_pages (pvt , umc , cs );
3551- dimm -> mtype = pvt -> dram_type ;
3618+ dimm -> mtype = pvt -> umc [ umc ]. dram_type ;
35523619 dimm -> edac_mode = edac_mode ;
35533620 dimm -> dtype = dev_type ;
35543621 dimm -> grain = 64 ;
0 commit comments