Merge tag 'x86_misc_for_v6.11_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull misc x86 updates from Borislav Petkov: - Make error checking of AMD SMN accesses more robust in the callers as they're the only ones who can interpret the results properly - The usual cleanups and fixes, left and right * tag 'x86_misc_for_v6.11_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/kmsan: Fix hook for unaligned accesses x86/platform/iosf_mbi: Convert PCIBIOS_* return codes to errnos x86/pci/xen: Fix PCIBIOS_* return code handling x86/pci/intel_mid_pci: Fix PCIBIOS_* return code handling x86/of: Return consistent error type from x86_of_pci_irq_enable() hwmon: (k10temp) Rename _data variable hwmon: (k10temp) Remove unused HAVE_TDIE() macro hwmon: (k10temp) Reduce k10temp_get_ccd_support() parameters hwmon: (k10temp) Define a helper function to read CCD temperature x86/amd_nb: Enhance SMN access error checking hwmon: (k10temp) Check return value of amd_smn_read() EDAC/amd64: Check return value of amd_smn_read() EDAC/amd64: Remove unused register accesses tools/x86/kcpuid: Add missing dir via Makefile x86, arm: Add missing license tag to syscall tables files
This commit is contained in:
+38
-31
@@ -20,7 +20,6 @@ static inline u32 get_umc_reg(struct amd64_pvt *pvt, u32 reg)
|
||||
return reg;
|
||||
|
||||
switch (reg) {
|
||||
case UMCCH_ADDR_CFG: return UMCCH_ADDR_CFG_DDR5;
|
||||
case UMCCH_ADDR_MASK_SEC: return UMCCH_ADDR_MASK_SEC_DDR5;
|
||||
case UMCCH_DIMM_CFG: return UMCCH_DIMM_CFG_DDR5;
|
||||
}
|
||||
@@ -1341,22 +1340,15 @@ static void umc_debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl)
|
||||
static void umc_dump_misc_regs(struct amd64_pvt *pvt)
|
||||
{
|
||||
struct amd64_umc *umc;
|
||||
u32 i, tmp, umc_base;
|
||||
u32 i;
|
||||
|
||||
for_each_umc(i) {
|
||||
umc_base = get_umc_base(i);
|
||||
umc = &pvt->umc[i];
|
||||
|
||||
edac_dbg(1, "UMC%d DIMM cfg: 0x%x\n", i, umc->dimm_cfg);
|
||||
edac_dbg(1, "UMC%d UMC cfg: 0x%x\n", i, umc->umc_cfg);
|
||||
edac_dbg(1, "UMC%d SDP ctrl: 0x%x\n", i, umc->sdp_ctrl);
|
||||
edac_dbg(1, "UMC%d ECC ctrl: 0x%x\n", i, umc->ecc_ctrl);
|
||||
|
||||
amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_ECC_BAD_SYMBOL, &tmp);
|
||||
edac_dbg(1, "UMC%d ECC bad symbol: 0x%x\n", i, tmp);
|
||||
|
||||
amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_UMC_CAP, &tmp);
|
||||
edac_dbg(1, "UMC%d UMC cap: 0x%x\n", i, tmp);
|
||||
edac_dbg(1, "UMC%d UMC cap high: 0x%x\n", i, umc->umc_cap_hi);
|
||||
|
||||
edac_dbg(1, "UMC%d ECC capable: %s, ChipKill ECC capable: %s\n",
|
||||
@@ -1369,14 +1361,6 @@ static void umc_dump_misc_regs(struct amd64_pvt *pvt)
|
||||
edac_dbg(1, "UMC%d x16 DIMMs present: %s\n",
|
||||
i, (umc->dimm_cfg & BIT(7)) ? "yes" : "no");
|
||||
|
||||
if (umc->dram_type == MEM_LRDDR4 || umc->dram_type == MEM_LRDDR5) {
|
||||
amd_smn_read(pvt->mc_node_id,
|
||||
umc_base + get_umc_reg(pvt, UMCCH_ADDR_CFG),
|
||||
&tmp);
|
||||
edac_dbg(1, "UMC%d LRDIMM %dx rank multiply\n",
|
||||
i, 1 << ((tmp >> 4) & 0x3));
|
||||
}
|
||||
|
||||
umc_debug_display_dimm_sizes(pvt, i);
|
||||
}
|
||||
}
|
||||
@@ -1454,6 +1438,7 @@ static void umc_read_base_mask(struct amd64_pvt *pvt)
|
||||
u32 *base, *base_sec;
|
||||
u32 *mask, *mask_sec;
|
||||
int cs, umc;
|
||||
u32 tmp;
|
||||
|
||||
for_each_umc(umc) {
|
||||
umc_base_reg = get_umc_base(umc) + UMCCH_BASE_ADDR;
|
||||
@@ -1466,13 +1451,17 @@ static void umc_read_base_mask(struct amd64_pvt *pvt)
|
||||
base_reg = umc_base_reg + (cs * 4);
|
||||
base_reg_sec = umc_base_reg_sec + (cs * 4);
|
||||
|
||||
if (!amd_smn_read(pvt->mc_node_id, base_reg, base))
|
||||
if (!amd_smn_read(pvt->mc_node_id, base_reg, &tmp)) {
|
||||
*base = tmp;
|
||||
edac_dbg(0, " DCSB%d[%d]=0x%08x reg: 0x%x\n",
|
||||
umc, cs, *base, base_reg);
|
||||
}
|
||||
|
||||
if (!amd_smn_read(pvt->mc_node_id, base_reg_sec, base_sec))
|
||||
if (!amd_smn_read(pvt->mc_node_id, base_reg_sec, &tmp)) {
|
||||
*base_sec = tmp;
|
||||
edac_dbg(0, " DCSB_SEC%d[%d]=0x%08x reg: 0x%x\n",
|
||||
umc, cs, *base_sec, base_reg_sec);
|
||||
}
|
||||
}
|
||||
|
||||
umc_mask_reg = get_umc_base(umc) + UMCCH_ADDR_MASK;
|
||||
@@ -1485,13 +1474,17 @@ static void umc_read_base_mask(struct amd64_pvt *pvt)
|
||||
mask_reg = umc_mask_reg + (cs * 4);
|
||||
mask_reg_sec = umc_mask_reg_sec + (cs * 4);
|
||||
|
||||
if (!amd_smn_read(pvt->mc_node_id, mask_reg, mask))
|
||||
if (!amd_smn_read(pvt->mc_node_id, mask_reg, &tmp)) {
|
||||
*mask = tmp;
|
||||
edac_dbg(0, " DCSM%d[%d]=0x%08x reg: 0x%x\n",
|
||||
umc, cs, *mask, mask_reg);
|
||||
}
|
||||
|
||||
if (!amd_smn_read(pvt->mc_node_id, mask_reg_sec, mask_sec))
|
||||
if (!amd_smn_read(pvt->mc_node_id, mask_reg_sec, &tmp)) {
|
||||
*mask_sec = tmp;
|
||||
edac_dbg(0, " DCSM_SEC%d[%d]=0x%08x reg: 0x%x\n",
|
||||
umc, cs, *mask_sec, mask_reg_sec);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2910,7 +2903,7 @@ static void umc_read_mc_regs(struct amd64_pvt *pvt)
|
||||
{
|
||||
u8 nid = pvt->mc_node_id;
|
||||
struct amd64_umc *umc;
|
||||
u32 i, umc_base;
|
||||
u32 i, tmp, umc_base;
|
||||
|
||||
/* Read registers from each UMC */
|
||||
for_each_umc(i) {
|
||||
@@ -2918,11 +2911,20 @@ static void umc_read_mc_regs(struct amd64_pvt *pvt)
|
||||
umc_base = get_umc_base(i);
|
||||
umc = &pvt->umc[i];
|
||||
|
||||
amd_smn_read(nid, umc_base + get_umc_reg(pvt, UMCCH_DIMM_CFG), &umc->dimm_cfg);
|
||||
amd_smn_read(nid, umc_base + UMCCH_UMC_CFG, &umc->umc_cfg);
|
||||
amd_smn_read(nid, umc_base + UMCCH_SDP_CTRL, &umc->sdp_ctrl);
|
||||
amd_smn_read(nid, umc_base + UMCCH_ECC_CTRL, &umc->ecc_ctrl);
|
||||
amd_smn_read(nid, umc_base + UMCCH_UMC_CAP_HI, &umc->umc_cap_hi);
|
||||
if (!amd_smn_read(nid, umc_base + get_umc_reg(pvt, UMCCH_DIMM_CFG), &tmp))
|
||||
umc->dimm_cfg = tmp;
|
||||
|
||||
if (!amd_smn_read(nid, umc_base + UMCCH_UMC_CFG, &tmp))
|
||||
umc->umc_cfg = tmp;
|
||||
|
||||
if (!amd_smn_read(nid, umc_base + UMCCH_SDP_CTRL, &tmp))
|
||||
umc->sdp_ctrl = tmp;
|
||||
|
||||
if (!amd_smn_read(nid, umc_base + UMCCH_ECC_CTRL, &tmp))
|
||||
umc->ecc_ctrl = tmp;
|
||||
|
||||
if (!amd_smn_read(nid, umc_base + UMCCH_UMC_CAP_HI, &tmp))
|
||||
umc->umc_cap_hi = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3651,16 +3653,21 @@ static void gpu_read_mc_regs(struct amd64_pvt *pvt)
|
||||
{
|
||||
u8 nid = pvt->mc_node_id;
|
||||
struct amd64_umc *umc;
|
||||
u32 i, umc_base;
|
||||
u32 i, tmp, umc_base;
|
||||
|
||||
/* Read registers from each UMC */
|
||||
for_each_umc(i) {
|
||||
umc_base = gpu_get_umc_base(pvt, i, 0);
|
||||
umc = &pvt->umc[i];
|
||||
|
||||
amd_smn_read(nid, umc_base + UMCCH_UMC_CFG, &umc->umc_cfg);
|
||||
amd_smn_read(nid, umc_base + UMCCH_SDP_CTRL, &umc->sdp_ctrl);
|
||||
amd_smn_read(nid, umc_base + UMCCH_ECC_CTRL, &umc->ecc_ctrl);
|
||||
if (!amd_smn_read(nid, umc_base + UMCCH_UMC_CFG, &tmp))
|
||||
umc->umc_cfg = tmp;
|
||||
|
||||
if (!amd_smn_read(nid, umc_base + UMCCH_SDP_CTRL, &tmp))
|
||||
umc->sdp_ctrl = tmp;
|
||||
|
||||
if (!amd_smn_read(nid, umc_base + UMCCH_ECC_CTRL, &tmp))
|
||||
umc->ecc_ctrl = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -256,15 +256,11 @@
|
||||
#define UMCCH_ADDR_MASK 0x20
|
||||
#define UMCCH_ADDR_MASK_SEC 0x28
|
||||
#define UMCCH_ADDR_MASK_SEC_DDR5 0x30
|
||||
#define UMCCH_ADDR_CFG 0x30
|
||||
#define UMCCH_ADDR_CFG_DDR5 0x40
|
||||
#define UMCCH_DIMM_CFG 0x80
|
||||
#define UMCCH_DIMM_CFG_DDR5 0x90
|
||||
#define UMCCH_UMC_CFG 0x100
|
||||
#define UMCCH_SDP_CTRL 0x104
|
||||
#define UMCCH_ECC_CTRL 0x14C
|
||||
#define UMCCH_ECC_BAD_SYMBOL 0xD90
|
||||
#define UMCCH_UMC_CAP 0xDF0
|
||||
#define UMCCH_UMC_CAP_HI 0xDF4
|
||||
|
||||
/* UMC CH bitfields */
|
||||
|
||||
Reference in New Issue
Block a user