]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
EDAC: Check for GHES preference in the chipset-specific EDAC drivers
authorJia He <justin.he@arm.com>
Mon, 10 Oct 2022 02:35:57 +0000 (02:35 +0000)
committerBorislav Petkov <bp@suse.de>
Fri, 21 Oct 2022 20:09:54 +0000 (22:09 +0200)
Call ghes_get_devices() to check whether ghes_edac should be used on the
platform where it is preferred over the corresponding chipset-specific
EDAC driver.

Unlike the existing edac_get_owner() check, the ghes_get_devices() check
works independent to the module_init ordering.

  [ bp: Massage. ]

Suggested-by: Toshi Kani <toshi.kani@hpe.com>
Signed-off-by: Jia He <justin.he@arm.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lore.kernel.org/r/20221010023559.69655-6-justin.he@arm.com
drivers/edac/amd64_edac.c
drivers/edac/armada_xp_edac.c
drivers/edac/edac_module.h
drivers/edac/i10nm_base.c
drivers/edac/igen6_edac.c
drivers/edac/layerscape_edac.c
drivers/edac/pnd2_edac.c
drivers/edac/sb_edac.c
drivers/edac/skx_base.c
drivers/edac/thunderx_edac.c
drivers/edac/xgene_edac.c

index 2f854feeeb237af1059bcd4ab8b541ce0c25e4a9..e3318e5575a34be50506240206cd146881501feb 100644 (file)
@@ -4329,6 +4329,9 @@ static int __init amd64_edac_init(void)
        int err = -ENODEV;
        int i;
 
+       if (ghes_get_devices())
+               return -EBUSY;
+
        owner = edac_get_owner();
        if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
                return -EBUSY;
index 038abbb83f4bce8f37b49f2f20e94bc690aa45da..c4bd2fb9c46ba2d2afade8c264f8f71ca0c135a5 100644 (file)
@@ -599,6 +599,9 @@ static int __init armada_xp_edac_init(void)
 {
        int res;
 
+       if (ghes_get_devices())
+               return -EBUSY;
+
        /* only polling is supported */
        edac_op_state = EDAC_OPSTATE_POLL;
 
index 50ed9f2425bb5274a61d33901dac6c5541d7bbf0..763c076d96f21d368931e9d6cc68e10ab0a29ea3 100644 (file)
@@ -11,6 +11,7 @@
 #ifndef        __EDAC_MODULE_H__
 #define        __EDAC_MODULE_H__
 
+#include <acpi/ghes.h>
 #include "edac_mc.h"
 #include "edac_pci.h"
 #include "edac_device.h"
index a22ea053f8e1cdbd92d507128258edc450fcb409..ba77c79d234d103bd424346685f243dc22fd906e 100644 (file)
@@ -756,6 +756,9 @@ static int __init i10nm_init(void)
 
        edac_dbg(2, "\n");
 
+       if (ghes_get_devices())
+               return -EBUSY;
+
        owner = edac_get_owner();
        if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
                return -EBUSY;
index a07bbfd075d06bd47b96df78596c554308e1cfd9..d33c666221f99caa644cb38b05253c02cdf2ef98 100644 (file)
@@ -1271,6 +1271,9 @@ static int __init igen6_init(void)
 
        edac_dbg(2, "\n");
 
+       if (ghes_get_devices())
+               return -EBUSY;
+
        owner = edac_get_owner();
        if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
                return -ENODEV;
index 94cac7686a56d46ed46b30f915f42d7d8029513a..35ceaca578e1506b28146607e90bdaea3f8de658 100644 (file)
@@ -38,6 +38,9 @@ static int __init fsl_ddr_mc_init(void)
 {
        int res;
 
+       if (ghes_get_devices())
+               return -EBUSY;
+
        /* make sure error reporting method is sane */
        switch (edac_op_state) {
        case EDAC_OPSTATE_POLL:
index a20b299f1202345d35c0ca2f2424a4d6c944931c..2b306f2cc60585e4879e64205856dc1dbeecbe97 100644 (file)
@@ -1528,6 +1528,9 @@ static int __init pnd2_init(void)
 
        edac_dbg(2, "\n");
 
+       if (ghes_get_devices())
+               return -EBUSY;
+
        owner = edac_get_owner();
        if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
                return -EBUSY;
index 8e39370fdb5cd6a84469e8032a50442676ef103c..0c779a0326b628fc9b07d63fe0991ce5ca8bddcf 100644 (file)
@@ -3634,6 +3634,9 @@ static int __init sbridge_init(void)
 
        edac_dbg(2, "\n");
 
+       if (ghes_get_devices())
+               return -EBUSY;
+
        owner = edac_get_owner();
        if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
                return -EBUSY;
index 7e2762f62eec1e49ce7310bd2070e3420503ff4b..9397abb42c4980d20eb20589a9279b52ce2b999c 100644 (file)
@@ -653,6 +653,9 @@ static int __init skx_init(void)
 
        edac_dbg(2, "\n");
 
+       if (ghes_get_devices())
+               return -EBUSY;
+
        owner = edac_get_owner();
        if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
                return -EBUSY;
index f13674081cb6b2fc6761f36957e7b8ac0c50906b..0bcd9f02c84a482a54b7b2cb445c3fb18b796459 100644 (file)
@@ -2114,6 +2114,9 @@ static int __init thunderx_edac_init(void)
 {
        int rc = 0;
 
+       if (ghes_get_devices())
+               return -EBUSY;
+
        rc = pci_register_driver(&thunderx_lmc_driver);
        if (rc)
                return rc;
index 54081403db4fd20352202e77161704f725e3b434..c52b9dd9154c1d7d5b761a45ceee8aa9ecd66dba 100644 (file)
@@ -2004,6 +2004,9 @@ static int __init xgene_edac_init(void)
 {
        int rc;
 
+       if (ghes_get_devices())
+               return -EBUSY;
+
        /* Make sure error reporting method is sane */
        switch (edac_op_state) {
        case EDAC_OPSTATE_POLL: