Skip to content

Commit f61d9de

Browse files
committed
Merge pull-request openvelinux#43 -- 'velinux-kernel-intel/6.6-velinux-edac-fix-gnr' into intel-6.6-velinux
This PR is to fix EDAC driver for Intel GNR platform on 6.6-velinux kernel. Upstream commits from v6.13: a36667037a0c0e36c59407f8ae636295390239a5 EDAC/{skx_common,i10nm}: Fix incorrect far-memory error source indicator 2397f795735219caa9c2fe61e7bcdd0652e670d3 EDAC/skx_common: Differentiate memory error sources Upstream commit from v6.11: 8b93582 EDAC/{skx_common,skx,i10nm}: Move the common debug code to skx_common Upstream commit from v6.11 already merged: 123b158 EDAC, i10nm: make skx_common.o a separate module Test Built and run the kernel successfully. EDAC Test is PASS on GNR platform. Conflicts: drivers/edac/skx_common.c drivers/edac/skx_common.h [jz: stable already merged part of the commits]
2 parents 31ef446 + ca04853 commit f61d9de

File tree

4 files changed

+59
-100
lines changed

4 files changed

+59
-100
lines changed

drivers/edac/i10nm_base.c

Lines changed: 2 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,54 +1017,6 @@ static struct notifier_block i10nm_mce_dec = {
10171017
.priority = MCE_PRIO_EDAC,
10181018
};
10191019

1020-
#ifdef CONFIG_EDAC_DEBUG
1021-
/*
1022-
* Debug feature.
1023-
* Exercise the address decode logic by writing an address to
1024-
* /sys/kernel/debug/edac/i10nm_test/addr.
1025-
*/
1026-
static struct dentry *i10nm_test;
1027-
1028-
static int debugfs_u64_set(void *data, u64 val)
1029-
{
1030-
struct mce m;
1031-
1032-
pr_warn_once("Fake error to 0x%llx injected via debugfs\n", val);
1033-
1034-
memset(&m, 0, sizeof(m));
1035-
/* ADDRV + MemRd + Unknown channel */
1036-
m.status = MCI_STATUS_ADDRV + 0x90;
1037-
/* One corrected error */
1038-
m.status |= BIT_ULL(MCI_STATUS_CEC_SHIFT);
1039-
m.addr = val;
1040-
skx_mce_check_error(NULL, 0, &m);
1041-
1042-
return 0;
1043-
}
1044-
DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
1045-
1046-
static void setup_i10nm_debug(void)
1047-
{
1048-
i10nm_test = edac_debugfs_create_dir("i10nm_test");
1049-
if (!i10nm_test)
1050-
return;
1051-
1052-
if (!edac_debugfs_create_file("addr", 0200, i10nm_test,
1053-
NULL, &fops_u64_wo)) {
1054-
debugfs_remove(i10nm_test);
1055-
i10nm_test = NULL;
1056-
}
1057-
}
1058-
1059-
static void teardown_i10nm_debug(void)
1060-
{
1061-
debugfs_remove_recursive(i10nm_test);
1062-
}
1063-
#else
1064-
static inline void setup_i10nm_debug(void) {}
1065-
static inline void teardown_i10nm_debug(void) {}
1066-
#endif /*CONFIG_EDAC_DEBUG*/
1067-
10681020
static int __init i10nm_init(void)
10691021
{
10701022
u8 mc = 0, src_id = 0, node_id = 0;
@@ -1164,7 +1116,7 @@ static int __init i10nm_init(void)
11641116

11651117
opstate_init();
11661118
mce_register_decode_chain(&i10nm_mce_dec);
1167-
setup_i10nm_debug();
1119+
skx_setup_debug("i10nm_test");
11681120

11691121
if (retry_rd_err_log && res_cfg->offsets_scrub && res_cfg->offsets_demand) {
11701122
skx_set_decode(i10nm_mc_decode, show_retry_rd_err_log);
@@ -1192,7 +1144,7 @@ static void __exit i10nm_exit(void)
11921144
enable_retry_rd_err_log(false);
11931145
}
11941146

1195-
teardown_i10nm_debug();
1147+
skx_teardown_debug();
11961148
mce_unregister_decode_chain(&i10nm_mce_dec);
11971149
skx_adxl_put();
11981150
skx_remove();

drivers/edac/skx_base.c

Lines changed: 2 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -587,54 +587,6 @@ static struct notifier_block skx_mce_dec = {
587587
.priority = MCE_PRIO_EDAC,
588588
};
589589

590-
#ifdef CONFIG_EDAC_DEBUG
591-
/*
592-
* Debug feature.
593-
* Exercise the address decode logic by writing an address to
594-
* /sys/kernel/debug/edac/skx_test/addr.
595-
*/
596-
static struct dentry *skx_test;
597-
598-
static int debugfs_u64_set(void *data, u64 val)
599-
{
600-
struct mce m;
601-
602-
pr_warn_once("Fake error to 0x%llx injected via debugfs\n", val);
603-
604-
memset(&m, 0, sizeof(m));
605-
/* ADDRV + MemRd + Unknown channel */
606-
m.status = MCI_STATUS_ADDRV + 0x90;
607-
/* One corrected error */
608-
m.status |= BIT_ULL(MCI_STATUS_CEC_SHIFT);
609-
m.addr = val;
610-
skx_mce_check_error(NULL, 0, &m);
611-
612-
return 0;
613-
}
614-
DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
615-
616-
static void setup_skx_debug(void)
617-
{
618-
skx_test = edac_debugfs_create_dir("skx_test");
619-
if (!skx_test)
620-
return;
621-
622-
if (!edac_debugfs_create_file("addr", 0200, skx_test,
623-
NULL, &fops_u64_wo)) {
624-
debugfs_remove(skx_test);
625-
skx_test = NULL;
626-
}
627-
}
628-
629-
static void teardown_skx_debug(void)
630-
{
631-
debugfs_remove_recursive(skx_test);
632-
}
633-
#else
634-
static inline void setup_skx_debug(void) {}
635-
static inline void teardown_skx_debug(void) {}
636-
#endif /*CONFIG_EDAC_DEBUG*/
637-
638590
/*
639591
* skx_init:
640592
* make sure we are running on the correct cpu model
@@ -728,7 +680,7 @@ static int __init skx_init(void)
728680
/* Ensure that the OPSTATE is set correctly for POLL or NMI */
729681
opstate_init();
730682

731-
setup_skx_debug();
683+
skx_setup_debug("skx_test");
732684

733685
mce_register_decode_chain(&skx_mce_dec);
734686

@@ -742,7 +694,7 @@ static void __exit skx_exit(void)
742694
{
743695
edac_dbg(2, "\n");
744696
mce_unregister_decode_chain(&skx_mce_dec);
745-
teardown_skx_debug();
697+
skx_teardown_debug();
746698
if (nvdimm_count)
747699
skx_adxl_put();
748700
skx_remove();

drivers/edac/skx_common.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,53 @@ void skx_remove(void)
794794
}
795795
EXPORT_SYMBOL_GPL(skx_remove);
796796

797+
#ifdef CONFIG_EDAC_DEBUG
798+
/*
799+
* Debug feature.
800+
* Exercise the address decode logic by writing an address to
801+
* /sys/kernel/debug/edac/{skx,i10nm}_test/addr.
802+
*/
803+
static struct dentry *skx_test;
804+
805+
static int debugfs_u64_set(void *data, u64 val)
806+
{
807+
struct mce m;
808+
809+
pr_warn_once("Fake error to 0x%llx injected via debugfs\n", val);
810+
811+
memset(&m, 0, sizeof(m));
812+
/* ADDRV + MemRd + Unknown channel */
813+
m.status = MCI_STATUS_ADDRV + 0x90;
814+
/* One corrected error */
815+
m.status |= BIT_ULL(MCI_STATUS_CEC_SHIFT);
816+
m.addr = val;
817+
skx_mce_check_error(NULL, 0, &m);
818+
819+
return 0;
820+
}
821+
DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
822+
823+
void skx_setup_debug(const char *name)
824+
{
825+
skx_test = edac_debugfs_create_dir(name);
826+
if (!skx_test)
827+
return;
828+
829+
if (!edac_debugfs_create_file("addr", 0200, skx_test,
830+
NULL, &fops_u64_wo)) {
831+
debugfs_remove(skx_test);
832+
skx_test = NULL;
833+
}
834+
}
835+
EXPORT_SYMBOL_GPL(skx_setup_debug);
836+
837+
void skx_teardown_debug(void)
838+
{
839+
debugfs_remove_recursive(skx_test);
840+
}
841+
EXPORT_SYMBOL_GPL(skx_teardown_debug);
842+
#endif /*CONFIG_EDAC_DEBUG*/
843+
797844
MODULE_LICENSE("GPL v2");
798845
MODULE_AUTHOR("Tony Luck");
799846
MODULE_DESCRIPTION("MC Driver for Intel server processors");

drivers/edac/skx_common.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,4 +284,12 @@ int skx_mce_check_error(struct notifier_block *nb, unsigned long val,
284284

285285
void skx_remove(void);
286286

287+
#ifdef CONFIG_EDAC_DEBUG
288+
void skx_setup_debug(const char *name);
289+
void skx_teardown_debug(void);
290+
#else
291+
static inline void skx_setup_debug(const char *name) {}
292+
static inline void skx_teardown_debug(void) {}
293+
#endif
294+
287295
#endif /* _SKX_COMM_EDAC_H */

0 commit comments

Comments
 (0)