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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.