From: Ira Weiny <ira.weiny@intel.com>
To: Dan Williams <dan.j.williams@intel.com>,
Jonathan Cameron <jonathan.cameron@huawei.com>,
Smita Koralahalli <Smita.KoralahalliChannabasappa@amd.com>,
Shiju Jose <shiju.jose@huawei.com>
Cc: Dan Carpenter <dan.carpenter@linaro.org>,
Yazen Ghannam <yazen.ghannam@amd.com>,
Davidlohr Bueso <dave@stgolabs.net>,
Dave Jiang <dave.jiang@intel.com>,
Alison Schofield <alison.schofield@intel.com>,
Vishal Verma <vishal.l.verma@intel.com>,
Ard Biesheuvel <ardb@kernel.org>,
linux-efi@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-cxl@vger.kernel.org, Ira Weiny <ira.weiny@intel.com>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Tony Luck <tony.luck@intel.com>, Borislav Petkov <bp@alien8.de>
Subject: [PATCH 4/4] ras/events: Trace CXL CPER events even without the CXL stack loaded
Date: Wed, 28 Feb 2024 23:13:19 -0800 [thread overview]
Message-ID: <20240228-cxl-cper3-v1-4-6aa3f1343c6c@intel.com> (raw)
In-Reply-To: <20240228-cxl-cper3-v1-0-6aa3f1343c6c@intel.com>
If CXL is solely managed by firmware (including HDM configuration and
event processing via firmware first) it is possible to run the system
without the CXL software loaded. In this case no CXL callback will be
loaded and CXL CPER errors will not be processed at all.
In this case memory device and region (HPA) information is missing but
omitting the error completely is not friendly for such a user. Some
device information is available in the generic event which could prove
useful to a user.
Utilize the local work item to trace a generic CXL CPER event.
Duplicate the pattern of decoding the CXL event header to aid in adding
future trace points if needed. This was an easy lift from the CXL trace
points. But stop at header decoding only because this is an unlikely
configuration for the system. Further decoding can be obtained with
user space tools or added later if needed.
Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Borislav Petkov <bp@alien8.de>
Suggested-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
---
drivers/acpi/apei/ghes.c | 5 ++-
include/ras/ras_event.h | 90 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 94 insertions(+), 1 deletion(-)
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
index f433f4eae888..9ac323cbf195 100644
--- a/drivers/acpi/apei/ghes.c
+++ b/drivers/acpi/apei/ghes.c
@@ -729,7 +729,10 @@ static void cxl_cper_local_fn(struct work_struct *work)
while (kfifo_out_spinlocked(&cxl_cper_fifo, &wd, 1,
&cxl_cper_read_lock)) {
- /* drop msg */
+ struct cxl_cper_event_rec *rec = &wd.rec;
+ union cxl_event *evt = &rec->event;
+
+ trace_cper_cxl_gen_event(rec, &evt->generic);
}
}
static DECLARE_WORK(cxl_local_work, cxl_cper_local_fn);
diff --git a/include/ras/ras_event.h b/include/ras/ras_event.h
index cbd3ddd7c33d..319faf552b65 100644
--- a/include/ras/ras_event.h
+++ b/include/ras/ras_event.h
@@ -422,6 +422,96 @@ TRACE_EVENT(memory_failure_event,
)
);
#endif /* CONFIG_MEMORY_FAILURE */
+
+#include <linux/cxl-event.h>
+#include <asm-generic/unaligned.h>
+
+/*
+ * Common Event Record Format
+ * CXL 3.0 section 8.2.9.2.1; Table 8-42
+ */
+#define CXL_EVENT_RECORD_FLAG_PERMANENT BIT(2)
+#define CXL_EVENT_RECORD_FLAG_MAINT_NEEDED BIT(3)
+#define CXL_EVENT_RECORD_FLAG_PERF_DEGRADED BIT(4)
+#define CXL_EVENT_RECORD_FLAG_HW_REPLACE BIT(5)
+#define show_hdr_flags(flags) __print_flags(flags, " | ", \
+ { CXL_EVENT_RECORD_FLAG_PERMANENT, "PERMANENT_CONDITION" }, \
+ { CXL_EVENT_RECORD_FLAG_MAINT_NEEDED, "MAINTENANCE_NEEDED" }, \
+ { CXL_EVENT_RECORD_FLAG_PERF_DEGRADED, "PERFORMANCE_DEGRADED" }, \
+ { CXL_EVENT_RECORD_FLAG_HW_REPLACE, "HARDWARE_REPLACEMENT_NEEDED" } \
+)
+
+/*
+ * Define macros for the common header of each CPER CXL event.
+ *
+ * Tracepoints using these macros must do 3 things:
+ *
+ * 1) Add CPER_CXL_EVT_TP_entry to TP_STRUCT__entry
+ * 2) Use CPER_CXL_EVT_TP_fast_assign within TP_fast_assign;
+ * pass the serial number and CXL event header
+ * 3) Use CPER_CXL_EVT_TP_printk() instead of TP_printk()
+ *
+ * See the generic_event tracepoint as an example.
+ */
+#define CPER_CXL_EVT_TP_entry \
+ __field(u16, segment) \
+ __field(u8, bus) \
+ __field(u8, device) \
+ __field(u8, func) \
+ __field(u64, serial) \
+ __field(u32, hdr_flags) \
+ __field(u16, hdr_handle) \
+ __field(u16, hdr_related_handle) \
+ __field(u64, hdr_timestamp) \
+ __field(u8, hdr_length) \
+ __field(u8, hdr_maint_op_class)
+
+#define CPER_CXL_EVT_TP_fast_assign(cper_rec, evt_hdr) \
+ __entry->segment = cper_rec->hdr.device_id.segment_num; \
+ __entry->bus = cper_rec->hdr.device_id.bus_num; \
+ __entry->device = cper_rec->hdr.device_id.device_num; \
+ __entry->func = cper_rec->hdr.device_id.func_num; \
+ __entry->serial = (((u64)cper_rec->hdr.dev_serial_num.upper_dw) << 32) |\
+ cper_rec->hdr.dev_serial_num.lower_dw; \
+ __entry->hdr_length = (evt_hdr).length; \
+ __entry->hdr_flags = get_unaligned_le24((evt_hdr).flags); \
+ __entry->hdr_handle = le16_to_cpu((evt_hdr).handle); \
+ __entry->hdr_related_handle = le16_to_cpu((evt_hdr).related_handle); \
+ __entry->hdr_timestamp = le64_to_cpu((evt_hdr).timestamp); \
+ __entry->hdr_maint_op_class = (evt_hdr).maint_op_class
+
+#define CPER_CXL_EVT_TP_printk(fmt, ...) \
+ TP_printk("device=%04x:%02x:%02x.%02x serial=%lld : time=%llu " \
+ "len=%d flags='%s' handle=%x related_handle=%x " \
+ "maint_op_class=%u : " fmt, \
+ __entry->segment, __entry->bus, __entry->device, __entry->func, \
+ __entry->serial, \
+ __entry->hdr_timestamp, __entry->hdr_length, \
+ show_hdr_flags(__entry->hdr_flags), __entry->hdr_handle, \
+ __entry->hdr_related_handle, __entry->hdr_maint_op_class, \
+ ##__VA_ARGS__)
+
+TRACE_EVENT(cper_cxl_gen_event,
+
+ TP_PROTO(struct cxl_cper_event_rec *cper_rec,
+ struct cxl_event_generic *gen_rec),
+
+ TP_ARGS(cper_rec, gen_rec),
+
+ TP_STRUCT__entry(
+ CPER_CXL_EVT_TP_entry
+ __array(u8, data, CXL_EVENT_RECORD_DATA_LENGTH)
+ ),
+
+ TP_fast_assign(
+ CPER_CXL_EVT_TP_fast_assign(cper_rec, gen_rec->hdr);
+ memcpy(__entry->data, gen_rec->data, CXL_EVENT_RECORD_DATA_LENGTH);
+ ),
+
+ CPER_CXL_EVT_TP_printk("%s",
+ __print_hex(__entry->data, CXL_EVENT_RECORD_DATA_LENGTH))
+);
+
#endif /* _TRACE_HW_EVENT_MC_H */
/* This part must be outside protection */
--
2.43.0
next prev parent reply other threads:[~2024-02-29 7:13 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-29 7:13 [PATCH 0/4] efi/cxl-cper: Report CXL CPER events through tracing Ira Weiny
2024-02-29 7:13 ` [PATCH 1/4] cxl/event: Add missing include files Ira Weiny
2024-03-01 20:19 ` Dan Williams
2024-03-01 21:53 ` Ira Weiny
2024-02-29 7:13 ` [PATCH 2/4] acpi/ghes: Process CXL Component Events Ira Weiny
2024-03-01 20:51 ` Dan Williams
2024-03-01 22:05 ` Ira Weiny
2024-02-29 7:13 ` [PATCH 3/4] cxl/pci: Register for and process CPER events Ira Weiny
2024-03-01 21:49 ` Dan Williams
2024-02-29 7:13 ` Ira Weiny [this message]
2024-03-01 21:59 ` [PATCH 4/4] ras/events: Trace CXL CPER events even without the CXL stack loaded Dan Williams
2024-03-01 22:19 ` Ira Weiny
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240228-cxl-cper3-v1-4-6aa3f1343c6c@intel.com \
--to=ira.weiny@intel.com \
--cc=Smita.KoralahalliChannabasappa@amd.com \
--cc=alison.schofield@intel.com \
--cc=ardb@kernel.org \
--cc=bp@alien8.de \
--cc=dan.carpenter@linaro.org \
--cc=dan.j.williams@intel.com \
--cc=dave.jiang@intel.com \
--cc=dave@stgolabs.net \
--cc=jonathan.cameron@huawei.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=shiju.jose@huawei.com \
--cc=tony.luck@intel.com \
--cc=vishal.l.verma@intel.com \
--cc=yazen.ghannam@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox