From: Raag Jadav <raag.jadav@intel.com>
To: Badal Nilawar <badal.nilawar@intel.com>, matthew.d.roper@intel.com
Cc: intel-xe@lists.freedesktop.org, anshuman.gupta@intel.com,
rodrigo.vivi@intel.com, daniele.ceraolospurio@intel.com,
riana.tauro@intel.com, mallesh.koujalagi@intel.com,
aravind.iddamsetty@intel.com, himal.prasad.ghimiray@intel.com,
arvind.yadav@intel.com, syed.abdul.muqthyar.ahmed@intel.com,
nitin.r.gote@intel.com, pravalika.gurram@intel.com
Subject: Re: [PATCH v4 04/12] drm/xe/cper: Construct CPER record for hardware errors
Date: Wed, 14 Oct 2026 12:30:23 +0200 [thread overview]
Message-ID: <as9Zvxl3-Lx4H6En@black.igk.intel.com> (raw)
In-Reply-To: <20261009104602.1075405-18-badal.nilawar@intel.com>
Cc: Matt for platform stuff
On Fri, Oct 09, 2026 at 04:16:07PM +0530, Badal Nilawar wrote:
> Assemble the CPER record header, section descriptor and the Intel
> error section for Intel GPU hardware errors. Emitting the record is
> added in a follow-up patch.
Commit message should describe what _this_ patch does,
not _next_.
> Assisted-by: Copilot:Claude-Opus-5.5
> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com>
> ---
> v4:
> - Split from "drm/xe/cper: Prepare CPER record" (Raag)
> - Use xe->device_uid for FRU ID
> - Add platform IDs for all CRI PCI device IDs
> v2:
> - Encode cper_record_header timestamp in BCD format (sashiko)
> ---
> drivers/gpu/drm/xe/xe_cper.c | 122 +++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_cper_types.h | 53 +++++++++++++
> 2 files changed, 175 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/xe_cper.c b/drivers/gpu/drm/xe/xe_cper.c
> index e7cae449b349..1000c78b41e9 100644
> --- a/drivers/gpu/drm/xe/xe_cper.c
> +++ b/drivers/gpu/drm/xe/xe_cper.c
> @@ -3,10 +3,14 @@
> * Copyright © 2026 Intel Corporation
> */
>
> +#include <linux/bcd.h>
> #include <linux/err.h>
> #include <linux/kernel.h>
> #include <linux/minmax.h>
> #include <linux/pci.h>
> +#include <linux/slab.h>
> +#include <linux/time.h>
> +#include <linux/timekeeping.h>
>
> #include "xe_cper.h"
> #include "xe_cper_types.h"
> @@ -20,6 +24,60 @@ static bool is_hw_sigid(enum xe_sigid sigid)
> return in_range(sigid, INTEL_SIGID_GPU_XE_HARDWARE_START, INTEL_SIGID_BATCH);
> }
>
> +static const struct xe_platform_id_entry xe_platform_ids[] = {
> + /* 0x674C platform/8086:674c */
> + { 0x674C, GUID_INIT(0x9046afe5, 0x9041, 0x5124,
> + 0x86, 0x14, 0x92, 0x55, 0x0d, 0x9e, 0x9d, 0xa6) },
> + /* 0x674D platform/8086:674d */
> + { 0x674D, GUID_INIT(0xf95911b8, 0x6564, 0x5905,
> + 0xa6, 0xa7, 0xb9, 0xbf, 0x54, 0xab, 0x6c, 0x27) },
> + /* 0x674E platform/8086:674e */
> + { 0x674E, GUID_INIT(0xb8d24106, 0x0108, 0x59f1,
> + 0x8f, 0xfc, 0x9f, 0xc4, 0xa9, 0xc9, 0xb7, 0xb0) },
> + /* 0x674F platform/8086:674f */
> + { 0x674F, GUID_INIT(0xdd8dd88e, 0xef2f, 0x59b1,
> + 0x99, 0x15, 0xdb, 0x6f, 0x1d, 0xc9, 0xb4, 0x5d) },
> + /* 0x6750 platform/8086:6750 */
> + { 0x6750, GUID_INIT(0x1dd66c44, 0x87d5, 0x524a,
> + 0xad, 0x6e, 0xfc, 0x18, 0x9d, 0x42, 0x6f, 0x1a) },
> + /* 0x6751 platform/8086:6751 */
> + { 0x6751, GUID_INIT(0x17d0dd04, 0x2fad, 0x5400,
> + 0x99, 0xc8, 0x9b, 0x45, 0x51, 0x3b, 0x67, 0xe3) },
> +};
This is unrelated to cper and shouldn't be here. I'll rely on Matt's
input on how to deal with these.
> +static const guid_t *lookup_platform_id(const struct pci_dev *pdev)
> +{
> + unsigned int i;
> +
> + for (i = 0; i < ARRAY_SIZE(xe_platform_ids); i++)
> + if (xe_platform_ids[i].device_id == pdev->device)
> + return &xe_platform_ids[i].platform_id;
> + return NULL;
> +}
> +
> +static u64 cper_timestamp_now(void)
> +{
> + struct tm tm;
> + u64 ts = 0;
> + u8 *p = (u8 *)&ts;
> + int year;
> +
> + time64_to_tm(ktime_get_real_seconds(), 0, &tm);
> +
> + year = tm.tm_year + 1900;
> +
> + p[0] = bin2bcd(tm.tm_sec);
> + p[1] = bin2bcd(tm.tm_min);
> + p[2] = bin2bcd(tm.tm_hour);
> + p[3] = 0x1; /* precise time */
> + p[4] = bin2bcd(tm.tm_mday);
> + p[5] = bin2bcd(tm.tm_mon + 1);
> + p[6] = bin2bcd(year % 100);
> + p[7] = bin2bcd(year / 100);
> +
> + return ts;
> +}
> +
> static void xe_cper_init_intel_err_hdr(struct xe_device *xe,
> const struct xe_ras_error_class *error_class,
> u64 first_timestamp, u32 sig_id, u32 error_count,
> @@ -57,6 +115,67 @@ static void xe_cper_init_intel_err_hdr(struct xe_device *xe,
> /* TODO: fill fw_id and set XE_CPER_VALID_FW_ID */
> }
>
> +static void xe_cper_record_emit(struct xe_device *xe, u8 severity,
> + const guid_t *notification_type,
> + const struct xe_cper_sec_intel_err_hdr *ihdr,
> + const void *einfo, u32 einfo_len)
> +{
> + struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
> + const guid_t *platform_id = lookup_platform_id(pdev);
Delay the assignments where possible, preferably after kzalloc().
> + u32 total_len = sizeof(struct xe_cper_nonstd_record) + einfo_len;
> + struct cper_section_descriptor *sdesc;
> + struct cper_record_header *rhdr;
> + struct xe_cper_nonstd_record *rec;
Reverse xmas tree order please!
> + rec = kzalloc(total_len, GFP_KERNEL);
> + if (!rec)
> + return;
> +
> + rhdr = &rec->record_hdr;
> + sdesc = &rec->section_desc;
> +
> + /* Assemble the CPER record header (UEFI Appendix N.2.1) */
> + memcpy(rhdr->signature, CPER_SIG_RECORD, CPER_SIG_SIZE);
> + rhdr->revision = CPER_RECORD_REV;
> + rhdr->signature_end = CPER_SIG_END;
> + rhdr->section_count = 1;
> + rhdr->error_severity = severity;
> + rhdr->validation_bits = CPER_VALID_TIMESTAMP;
> + rhdr->record_length = total_len;
> + rhdr->timestamp = cper_timestamp_now();
> + if (platform_id) {
> + rhdr->platform_id = *platform_id;
> + rhdr->validation_bits |= CPER_VALID_PLATFORM_ID;
> + }
> + rhdr->creator_id = INTEL_CPER_CREATOR_XEKMD;
> + rhdr->notification_type = *notification_type;
> + rhdr->record_id = cper_next_record_id();
This looks like a small function that prepares rhdr.
> + /* Assemble the section descriptor (UEFI Appendix N.2.2) */
> + sdesc->section_offset = sizeof(struct cper_record_header) +
> + sizeof(struct cper_section_descriptor);
> + sdesc->section_length = sizeof(struct xe_cper_sec_intel_err_hdr) + einfo_len;
> + sdesc->revision = CPER_SEC_REV;
> + sdesc->validation_bits = 0;
> + sdesc->section_type = INTEL_CPER_SECTION_ACCEL_GENERIC;
> + if (xe->info.has_device_uid) {
> + memcpy(&sdesc->fru_id, &xe->device_uid, sizeof(xe->device_uid));
> + sdesc->validation_bits |= CPER_SEC_VALID_FRU_ID;
> + }
> + sdesc->section_severity = severity;
Ditto for sdesc.
Raag
> + /* Copy the Intel-specific section header */
> + rec->intel_hdr = *ihdr;
> +
> + /* Append optional variable-length error info */
> + if (einfo && einfo_len)
> + memcpy((u8 *)rec + sizeof(*rec), einfo, einfo_len);
> +
> + /* TODO: Emit trace event */
> +
> + kfree(rec);
> +}
> +
> static void xe_cper_emit_hw_err(struct xe_device *xe, int cper_sev, enum xe_sigid sigid,
> const struct xe_ras_error_class *error_class)
> {
> @@ -74,6 +193,9 @@ static void xe_cper_emit_hw_err(struct xe_device *xe, int cper_sev, enum xe_sigi
>
> xe_cper_init_intel_err_hdr(xe, error_class, local_resp.timestamp,
> sigid, local_resp.value, &ihdr);
> +
> + xe_cper_record_emit(xe, cper_sev, &INTEL_CPER_NOTIFY_GPU_ERROR,
> + &ihdr, NULL, 0);
> }
>
> /**
> diff --git a/drivers/gpu/drm/xe/xe_cper_types.h b/drivers/gpu/drm/xe/xe_cper_types.h
> index 74307e7f78a2..7612518c9d47 100644
> --- a/drivers/gpu/drm/xe/xe_cper_types.h
> +++ b/drivers/gpu/drm/xe/xe_cper_types.h
> @@ -6,7 +6,9 @@
> #ifndef _XE_CPER_TYPES_H_
> #define _XE_CPER_TYPES_H_
>
> +#include <linux/cper.h>
> #include <linux/types.h>
> +#include <linux/uuid.h>
>
> /*
> * Validation bits definition for validation_bits in struct
> @@ -20,6 +22,28 @@
> #define XE_CPER_VALID_DRV_VERSION 0x0010
> #define XE_CPER_VALID_FW_ID 0x0020
>
> +/*
> + * Intel CPER GUID Namespace — RFC 9562 UUIDv5 (SHA-1 name-based)
> + *
> + * All values below are generated deterministically by uuid generator.
> + * Do not hand-edit the byte values.
> + */
> +
> +/* Creator IDs */
> +#define INTEL_CPER_CREATOR_XEKMD \
> + GUID_INIT(0x9a42070f, 0xdf9d, 0x555e, \
> + 0xba, 0x02, 0x7c, 0xbc, 0x86, 0x3d, 0x37, 0x1c)
> +
> +/* Notification Types */
> +#define INTEL_CPER_NOTIFY_GPU_ERROR \
> + GUID_INIT(0x4ae12aef, 0x8745, 0x5fc7, \
> + 0xb9, 0x96, 0x71, 0xee, 0xbb, 0x51, 0xf2, 0x23)
> +
> +/* Section Types */
> +#define INTEL_CPER_SECTION_ACCEL_GENERIC \
> + GUID_INIT(0xea9d8f84, 0x4258, 0x5227, \
> + 0x80, 0x28, 0xb9, 0xb1, 0x3e, 0x6d, 0x58, 0xb0)
> +
> #pragma pack(push, 1)
>
> /**
> @@ -67,6 +91,35 @@ struct xe_cper_sec_intel_err_hdr {
> u8 reserved[5];
> };
>
> +/**
> + * struct xe_cper_nonstd_record - Intel GPU CPER record
> + *
> + * Contains the standard CPER record header, section descriptor, and the
> + * Intel error section header.
> + */
> +struct xe_cper_nonstd_record {
> + /** @record_hdr: Standard CPER record header (UEFI Appendix N.2.1) */
> + struct cper_record_header record_hdr;
> + /** @section_desc: CPER section descriptor */
> + struct cper_section_descriptor section_desc;
> + /** @intel_hdr: Intel-specific error section header */
> + struct xe_cper_sec_intel_err_hdr intel_hdr;
> +};
> +
> #pragma pack(pop)
>
> +/**
> + * struct xe_platform_id_entry - Mapping from PCI device ID to CPER platform GUID
> + *
> + * Used to resolve the platform_id field in a CPER section descriptor.
> + * GUIDs are UUIDv5 (RFC 9562, SHA-1) derived from the Intel CPER namespace
> + * with name string "platform/8086:<dev_id_hex_lower>".
> + */
> +struct xe_platform_id_entry {
> + /** @device_id: PCI device ID */
> + u16 device_id;
> + /** @platform_id: Corresponding UUIDv5 platform GUID */
> + guid_t platform_id;
> +};
> +
> #endif
> --
> 2.54.0
>
next prev parent reply other threads:[~2026-10-14 10:30 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-09 10:46 [PATCH v4 00/12] Add CPER logging support for CRI Badal Nilawar
2026-10-09 10:46 ` [PATCH v4 01/12] drm/xe/cper: Add CPER reporting entry point for xe_log Badal Nilawar
2026-10-09 10:43 ` sashiko-bot
2026-10-09 12:17 ` Nilawar, Badal
2026-10-12 6:18 ` Raag Jadav
2026-10-09 10:46 ` [PATCH v4 02/12] drm/xe/cper: Retrieve the error counter record for CPER reporting Badal Nilawar
2026-10-09 10:46 ` sashiko-bot
2026-10-09 12:27 ` Nilawar, Badal
2026-10-12 9:07 ` Raag Jadav
2026-10-09 10:46 ` [PATCH v4 03/12] drm/xe/cper: Initialize Intel-specific error section header Badal Nilawar
2026-10-14 7:27 ` Raag Jadav
2026-10-09 10:46 ` [PATCH v4 04/12] drm/xe/cper: Construct CPER record for hardware errors Badal Nilawar
2026-10-14 10:30 ` Raag Jadav [this message]
2026-10-09 10:46 ` [PATCH v4 05/12] drm/xe/xe_ras: Add support to retrieve info queue data for CRI Badal Nilawar
2026-10-09 10:40 ` sashiko-bot
2026-10-09 12:45 ` Nilawar, Badal
2026-10-14 15:19 ` Raag Jadav
2026-10-09 10:46 ` [PATCH v4 06/12] drm/xe/cper: Prepare Intel CPER error info records Badal Nilawar
2026-10-09 10:41 ` sashiko-bot
2026-10-09 13:07 ` Nilawar, Badal
2026-10-09 10:46 ` [PATCH v4 07/12] drm/xe/cper: Log CPER records for aggregate counter retrieval Badal Nilawar
2026-10-09 10:46 ` [PATCH v4 08/12] drm/xe/cper: Emit cper record to trace buf Badal Nilawar
2026-10-09 10:38 ` sashiko-bot
2026-10-09 10:46 ` [PATCH v4 09/12] drm/xe/xe_ras: Report device memory errors using SIGID Badal Nilawar
2026-10-14 9:05 ` Mallesh, Koujalagi
2026-10-09 10:46 ` [PATCH v4 10/12] drm/xe/xe_ras: Report core compute " Badal Nilawar
2026-10-14 9:28 ` Mallesh, Koujalagi
2026-10-14 9:30 ` Tauro, Riana
2026-10-09 10:46 ` [PATCH v4 11/12] drm/xe/xe_ras: Report soc internal " Badal Nilawar
2026-10-14 9:31 ` Mallesh, Koujalagi
2026-10-09 10:46 ` [PATCH v4 12/12] drm/xe/xe_ras: Report correctable " Badal Nilawar
2026-10-09 10:50 ` sashiko-bot
2026-10-09 10:54 ` ✗ CI.checkpatch: warning for Add CPER logging support for CRI (rev4) Patchwork
2026-10-09 10:56 ` ✓ CI.KUnit: success " Patchwork
2026-10-09 12:03 ` ✗ Xe.CI.BAT: failure " Patchwork
2026-10-09 15:13 ` ✓ Xe.CI.FULL: success " Patchwork
2026-10-12 6:14 ` [PATCH v4 00/12] Add CPER logging support for CRI Raag Jadav
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=as9Zvxl3-Lx4H6En@black.igk.intel.com \
--to=raag.jadav@intel.com \
--cc=anshuman.gupta@intel.com \
--cc=aravind.iddamsetty@intel.com \
--cc=arvind.yadav@intel.com \
--cc=badal.nilawar@intel.com \
--cc=daniele.ceraolospurio@intel.com \
--cc=himal.prasad.ghimiray@intel.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=mallesh.koujalagi@intel.com \
--cc=matthew.d.roper@intel.com \
--cc=nitin.r.gote@intel.com \
--cc=pravalika.gurram@intel.com \
--cc=riana.tauro@intel.com \
--cc=rodrigo.vivi@intel.com \
--cc=syed.abdul.muqthyar.ahmed@intel.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