]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ACPI: APEI: GHES: Add helper for CPER CXL protocol errors checks
authorFabio M. De Francesco <fabio.m.de.francesco@linux.intel.com>
Wed, 14 Jan 2026 10:14:23 +0000 (11:14 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 14 Jan 2026 16:09:34 +0000 (17:09 +0100)
Move the CPER CXL protocol errors validity check out of
cxl_cper_post_prot_err() to new cxl_cper_sec_prot_err_valid() and limit
the serial number check only to CXL agents that are CXL devices (UEFI
v2.10, Appendix N.2.13).

Export the new symbol for reuse by ELOG.

Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Reviewed-by: Hanjun Guo <guohanjun@huawei.com>
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
Signed-off-by: Fabio M. De Francesco <fabio.m.de.francesco@linux.intel.com>
[ rjw: Subject tweak ]
Link: https://patch.msgid.link/20260114101543.85926-4-fabio.m.de.francesco@linux.intel.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/apei/Makefile
drivers/acpi/apei/ghes.c
drivers/acpi/apei/ghes_helpers.c [new file with mode: 0644]
include/cxl/event.h

index 2c474e6477e12a9023227ca22d9eabdf121b676e..5db61dfb469159a21976d712949f48ea46ca86cd 100644 (file)
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 obj-$(CONFIG_ACPI_APEI)                += apei.o
 obj-$(CONFIG_ACPI_APEI_GHES)   += ghes.o
+obj-$(CONFIG_ACPI_APEI_PCIEAER)        += ghes_helpers.o
 obj-$(CONFIG_ACPI_APEI_EINJ)   += einj.o
 einj-y                         := einj-core.o
 einj-$(CONFIG_ACPI_APEI_EINJ_CXL) += einj-cxl.o
index a2ac282c99cb2a2af6d7dd09c734751e135a74eb..319bbc9317ae10f94a0b6feed006ff4efd7a32b9 100644 (file)
@@ -741,24 +741,8 @@ static void cxl_cper_post_prot_err(struct cxl_cper_sec_prot_err *prot_err,
        struct cxl_cper_prot_err_work_data wd;
        u8 *dvsec_start, *cap_start;
 
-       if (!(prot_err->valid_bits & PROT_ERR_VALID_AGENT_ADDRESS)) {
-               pr_err_ratelimited("CXL CPER invalid agent type\n");
+       if (cxl_cper_sec_prot_err_valid(prot_err))
                return;
-       }
-
-       if (!(prot_err->valid_bits & PROT_ERR_VALID_ERROR_LOG)) {
-               pr_err_ratelimited("CXL CPER invalid protocol error log\n");
-               return;
-       }
-
-       if (prot_err->err_len != sizeof(struct cxl_ras_capability_regs)) {
-               pr_err_ratelimited("CXL CPER invalid RAS Cap size (%u)\n",
-                                  prot_err->err_len);
-               return;
-       }
-
-       if (!(prot_err->valid_bits & PROT_ERR_VALID_SERIAL_NUMBER))
-               pr_warn(FW_WARN "CXL CPER no device serial number\n");
 
        guard(spinlock_irqsave)(&cxl_cper_prot_err_work_lock);
 
diff --git a/drivers/acpi/apei/ghes_helpers.c b/drivers/acpi/apei/ghes_helpers.c
new file mode 100644 (file)
index 0000000..f3d1621
--- /dev/null
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0-only
+// Copyright(c) 2025 Intel Corporation. All rights reserved
+
+#include <linux/printk.h>
+#include <cxl/event.h>
+
+int cxl_cper_sec_prot_err_valid(struct cxl_cper_sec_prot_err *prot_err)
+{
+       if (!(prot_err->valid_bits & PROT_ERR_VALID_AGENT_ADDRESS)) {
+               pr_err_ratelimited("CXL CPER invalid agent type\n");
+               return -EINVAL;
+       }
+
+       if (!(prot_err->valid_bits & PROT_ERR_VALID_ERROR_LOG)) {
+               pr_err_ratelimited("CXL CPER invalid protocol error log\n");
+               return -EINVAL;
+       }
+
+       if (prot_err->err_len != sizeof(struct cxl_ras_capability_regs)) {
+               pr_err_ratelimited("CXL CPER invalid RAS Cap size (%u)\n",
+                                  prot_err->err_len);
+               return -EINVAL;
+       }
+
+       if ((prot_err->agent_type == RCD || prot_err->agent_type == DEVICE ||
+            prot_err->agent_type == LD || prot_err->agent_type == FMLD) &&
+           !(prot_err->valid_bits & PROT_ERR_VALID_SERIAL_NUMBER))
+               pr_warn_ratelimited(FW_WARN
+                                   "CXL CPER no device serial number\n");
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(cxl_cper_sec_prot_err_valid);
index 6fd90f9cc2034fefa4bb8d460cd78937e046e250..4d7d1036ea9cb7e29d3462b3cb07784c444a8a3e 100644 (file)
@@ -320,4 +320,14 @@ static inline int cxl_cper_prot_err_kfifo_get(struct cxl_cper_prot_err_work_data
 }
 #endif
 
+#ifdef CONFIG_ACPI_APEI_PCIEAER
+int cxl_cper_sec_prot_err_valid(struct cxl_cper_sec_prot_err *prot_err);
+#else
+static inline int
+cxl_cper_sec_prot_err_valid(struct cxl_cper_sec_prot_err *prot_err)
+{
+       return -EOPNOTSUPP;
+}
+#endif
+
 #endif /* _LINUX_CXL_EVENT_H */