Commit 70205869 authored by Fabio M. De Francesco's avatar Fabio M. De Francesco Committed by Rafael J. Wysocki
Browse files

ACPI: APEI: GHES: Add helper for CPER CXL protocol errors checks



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: default avatarDave Jiang <dave.jiang@intel.com>
Reviewed-by: default avatarHanjun Guo <guohanjun@huawei.com>
Reviewed-by: default avatarJonathan Cameron <jonathan.cameron@huawei.com>
Signed-off-by: default avatarFabio 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: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent e778ffef
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
# 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
+1 −17
Original line number Diff line number Diff line
@@ -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);

+33 −0
Original line number Diff line number Diff line
// 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);
+10 −0
Original line number Diff line number Diff line
@@ -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 */