Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: "Kumar G, Naresh" <naresh.kumar.g@intel.com>
To: "Upadhyay, Tejas" <tejas.upadhyay@intel.com>,
	"intel-xe@lists.freedesktop.org" <intel-xe@lists.freedesktop.org>
Cc: "Ghimiray, Himal Prasad" <himal.prasad.ghimiray@intel.com>,
	"Yadav, Arvind" <arvind.yadav@intel.com>
Subject: Re: [PATCH v3 1/7] drm/xe/devcoredump: Capture GT fuse registers in devcoredump
Date: Thu, 8 Oct 2026 19:27:45 +0530	[thread overview]
Message-ID: <cf7950e1-3f34-478e-a239-e2cd71f2ee63@intel.com> (raw)
In-Reply-To: <DS0PR11MB871883C996488A6420860C6281942@DS0PR11MB8718.namprd11.prod.outlook.com>

Hi Tejas,

On 10/7/2026 7:21 PM, Upadhyay, Tejas wrote:
>
>> -----Original Message-----
>> From: Kumar G, Naresh <naresh.kumar.g@intel.com>
>> Sent: 03 September 2026 19:48
>> To: intel-xe@lists.freedesktop.org
>> Cc: Ghimiray, Himal Prasad <himal.prasad.ghimiray@intel.com>; Yadav, Arvind
>> <arvind.yadav@intel.com>; Upadhyay, Tejas <tejas.upadhyay@intel.com>;
>> Kumar G, Naresh <naresh.kumar.g@intel.com>
>> Subject: [PATCH v3 1/7] drm/xe/devcoredump: Capture GT fuse registers in
>> devcoredump
>>
>> Capture fuse-related GT register state in the Xe devcoredump to preserve
>> additional hardware configuration information for postmortem debugging.
>>
>> Add generic register snapshot storage and helpers for capturing, printing, and
>> freeing MMIO register dumps. Use them to record both primary GT and media
>> GT fuse register state during devcoredump snapshot collection and print the
>> captured values in the coredump output.
>>
>> Also add the required GT register definitions for RPM and mirror copy-enable
>> state used by the new dump paths.
>>
>> v2:(Sashiko)
>> - Fix GT/media fuse snapshot capture to use the correct GT context.
>> - Add non-fault GT force wake for cross-GT register capture.
>> - Skip reading registers when SR-IOV VF.
>> - Skip media GT capture when media GT is absent.
>> - Add RPM snapshot print/free handling explicitly.
>> - Add POWERGATE_ENABLE register to get render awake status
>>
>> v3:(Sashiko)
>> - Check RENDER_POWERGATE_ENABLE of POWERGATE_ENABLE register
>> - Replace "render is not awake" message with "render powergating
>>    appears not enabled"
>>
>> Signed-off-by: Nareshkumar Gollakoti <naresh.kumar.g@intel.com>
>> ---
>>   drivers/gpu/drm/xe/regs/xe_gt_regs.h      |   4 +
>>   drivers/gpu/drm/xe/xe_devcoredump.c       | 255
>> ++++++++++++++++++++++
>>   drivers/gpu/drm/xe/xe_devcoredump_types.h |  39 ++++
>>   drivers/gpu/drm/xe/xe_device.h            |   5 +
>>   4 files changed, 303 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/regs/xe_gt_regs.h
>> b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
>> index 48c515d91882..19f0a65cc3d2 100644
>> --- a/drivers/gpu/drm/xe/regs/xe_gt_regs.h
>> +++ b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
>> @@ -22,6 +22,8 @@
>>   #define   MTL_CC_MASK
>> 	REG_GENMASK(12, 9)
>>   #define   MTL_CRST					0xf
>>
>> +#define RPM_GCD
>> 	XE_REG(0xc98)
>> +
>>   /* RPM unit config (Gen8+) */
>>   #define RPM_CONFIG0
>> 	XE_REG(0xd00)
>>   #define   RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_MASK
>> 	REG_GENMASK(5, 3)
>> @@ -274,6 +276,8 @@
>>   #define SERVICE_COPY_ENABLE			XE_REG(0x9170)
>>   #define   FUSE_SERVICE_COPY_ENABLE_MASK		REG_GENMASK(7, 0)
>>
>> +#define COPY_ENABLE_GTFS_GCD			XE_REG(0x9174)
>> +
>>   #define GDRST					XE_REG(0x941c)
>>   #define   GRDOM_GUC				REG_BIT(3)
>>   #define   GRDOM_FULL				REG_BIT(0)
>> diff --git a/drivers/gpu/drm/xe/xe_devcoredump.c
>> b/drivers/gpu/drm/xe/xe_devcoredump.c
>> index 5f2b90b18f97..fe38bb2296be 100644
>> --- a/drivers/gpu/drm/xe/xe_devcoredump.c
>> +++ b/drivers/gpu/drm/xe/xe_devcoredump.c
>> @@ -25,6 +25,8 @@
>>   #include "xe_pm.h"
>>   #include "xe_sched_job.h"
>>   #include "xe_vm.h"
>> +#include "xe_mmio.h"
>> +#include "regs/xe_gt_regs.h"
>>
>>   /**
>>    * DOC: Xe device coredump
>> @@ -69,6 +71,233 @@
>>   /* 1 hour timeout */
>>   #define XE_COREDUMP_TIMEOUT_JIFFIES (60 * 60 * HZ)
>>
>> +/**
>> + * struct xe_reg_desc - Register descriptor struct to make reg list
>> + *
>> + * This struct is used as descriptor containting reg address and name
>> + * of the register to dump its value during coredump for debug purpose.
>> + */
>> +struct xe_reg_desc {
>> +	/** @reg: The register */
>> +	struct xe_reg reg;
>> +	/** @name: Name of the register */
>> +	const char *name;
>> +};
>> +
>> +#define XE_REG_DESC(_reg, _name)	{ .reg = (_reg), .name = (_name) }
>> +
>> +static const struct xe_reg_desc xe3p_gt_fuse_reglist[] = {
>> +	XE_REG_DESC(XELP_GT_GEOMETRY_DSS_ENABLE,
>> "GT_GEOMETRY_DSS_ENABLE"),
>> +	XE_REG_DESC(XEHP_GT_COMPUTE_DSS_ENABLE,
>> "GT_COMPUTE_DSS_ENABLE"),
>> +	XE_REG_DESC(XELP_EU_ENABLE, "EU_ENABLE"),
>> +	XE_REG_DESC(MIRROR_FUSE1, "MIRROR_FUSE1"),
>> +	XE_REG_DESC(GT_VEBOX_VDBOX_DISABLE,
>> "GT_VEBOX_VDBOX_DISABLE"),
>> +	XE_REG_DESC(SERVICE_COPY_ENABLE, "SERVICE_COPY_ENABLE"),
>> +	XE_REG_DESC(COPY_ENABLE_GTFS_GCD,
>> "COPY_ENABLE_GTFS_GCD"),
>> +	XE_REG_DESC(XE2_GT_GEOMETRY_DSS_1, "GT_GEOMETRY_DSS_1"),
>> +	XE_REG_DESC(XE2_GT_GEOMETRY_DSS_2, "GT_GEOMETRY_DSS_2"),
>> +	XE_REG_DESC(XE2_GT_COMPUTE_DSS_2, "GT_COMPUTE_DSS_2"),
>> +	XE_REG_DESC(XEHPC_GT_COMPUTE_DSS_ENABLE_EXT,
>> "GT_COMPUTE_DSS_ENABLE_EXT"),
>> +	XE_REG_DESC(XE3P_XPC_GT_GEOMETRY_DSS_3,
>> "GT_GEOMETRY_DSS_3"),
>> +	XE_REG_DESC(XE3P_XPC_GT_COMPUTE_DSS_3,
>> "GT_COMPUTE_DSS_3"), };
>> +
>> +static const struct xe_reg_desc xe3p_media_gt_fuse_reglist[] = {
>> +	XE_REG_DESC(SERVICE_COPY_ENABLE, "SERVICE_COPY_ENABLE"),
>> +	XE_REG_DESC(COPY_ENABLE_GTFS_GCD,
>> "COPY_ENABLE_GTFS_GCD"), };
>> +
>> +static const struct xe_reg_desc xe3p_gt_rpm_reglist[] = {
>> +	XE_REG_DESC(RPM_GCD, "RPM_GCD"),
>> +	XE_REG_DESC(POWERGATE_ENABLE, "POWERGATE_ENABLE"), };
>> +
>> +static const struct xe_reg_desc xe3p_media_gt_rpm_reglist[] = {
>> +	XE_REG_DESC(RPM_GCD, "RPM_GCD"),
>> +};
>> +
>> +/**
>> + * struct xe_reg_desc_list - Struct for register descriptor list
>> + *
>> + * This struct is used to reference the corresponding reglist of
>> + * various component
>> + */
>> +struct xe_reg_desc_list {
>> +	/** @regs: Pointer to an array of register descriptors. */
>> +	const struct xe_reg_desc *regs;
>> +	/** @num_regs: refernce for num regs in reg descriptor*/
>> +	u32 num_regs;
>> +};
>> +
>> +/**
>> + * struct xe_gt_regset - Struct for register descriptor list for GT
>> + *
>> + * This struct is used to reference the corresponding reglist of
>> + * GT and media GT
>> + */
>> +struct xe_gt_regset {
>> +	struct xe_reg_desc_list gt[XE_MAX_GT_PER_TILE + 1]; };
>> +
>> +static const struct xe_gt_regset xe_fuse_regset = {
>> +	.gt[XE_GT_TYPE_MAIN] = {
>> +		.regs = xe3p_gt_fuse_reglist,
>> +		.num_regs = ARRAY_SIZE(xe3p_gt_fuse_reglist),
>> +	},
>> +	.gt[XE_GT_TYPE_MEDIA] = {
>> +		.regs = xe3p_media_gt_fuse_reglist,
>> +		.num_regs = ARRAY_SIZE(xe3p_media_gt_fuse_reglist),
>> +	},
>> +};
>> +
>> +static const struct xe_gt_regset xe_rpm_regset = {
>> +	.gt[XE_GT_TYPE_MAIN] = {
>> +		.regs = xe3p_gt_rpm_reglist,
>> +		.num_regs = ARRAY_SIZE(xe3p_gt_rpm_reglist),
>> +	},
>> +	.gt[XE_GT_TYPE_MEDIA] = {
>> +		.regs = xe3p_media_gt_rpm_reglist,
>> +		.num_regs = ARRAY_SIZE(xe3p_media_gt_rpm_reglist),
>> +	},
>> +};
>> +
>> +#define XE_GT_REG_LIST(_type, _gt_type) \
>> +	(&xe_##_type##_regset.gt[XE_GT_TYPE_##_gt_type])
>> +
>> +static void
>> +xe_capture_reg_desc_list(struct xe_gt *gt,
>> +			 struct xe_reg_dump_snapshot *dst,
>> +			 const struct xe_reg_desc *src,
>> +			 u32 count)
>> +{
>> +	u32 i;
>> +
>> +	for (i = 0; i < count; i++) {
>> +		dst[i].reg = src[i].reg;
>> +		dst[i].value = xe_mmio_read32(&gt->mmio, src[i].reg);
>> +		dst[i].name = src[i].name;
>> +	}
>> +}
>> +
>> +static struct xe_dbg_reg_snapshot *
>> +xe_dbg_reg_snapshot_capture(struct xe_gt *gt,
>> +			    const struct xe_reg_desc_list *reglist) {
>> +	struct xe_dbg_reg_snapshot *snap;
>> +
>> +	if (!gt || !xe_dbg_reg_snapshot_is_supported(gt_to_xe(gt)))
>> +		return NULL;
>> +
>> +	if (IS_SRIOV_VF(gt_to_xe(gt)))
>> +		return NULL;
>> +
>> +	if (!reglist->regs || !reglist->num_regs)
>> +		return NULL;
>> +
>> +	snap = kzalloc(struct_size(snap, regs, reglist->num_regs),
>> GFP_ATOMIC);
>> +	if (!snap)
>> +		return NULL;
>> +
>> +	snap->num_regs = reglist->num_regs;
>> +
>> +	xe_capture_reg_desc_list(gt, snap->regs, reglist->regs,
>> +reglist->num_regs);
>> +
>> +	return snap;
>> +}
>> +
>> +static void xe_dbg_reg_snapshot_print(struct drm_printer *p,
>> +				      const struct xe_dbg_reg_snapshot *snap) {
>> +	u32 i;
>> +
>> +	if (!snap)
>> +		return;
>> +
>> +	for (i = 0; i < snap->num_regs; i++)
>> +		drm_printf(p, " %s [0x%x] = 0x%08x\n",
>> +			   snap->regs[i].name,
>> +			   snap->regs[i].reg.addr,
>> +			   snap->regs[i].value);
>> +}
>> +
>> +static void xe_dbg_reg_snapshot_free(struct xe_dbg_reg_snapshot *snap)
>> +{
>> +	kfree(snap);
>> +}
>> +
>> +static void xe_gt_rpm_snapshot_print(struct drm_printer *p,
>> +				     const struct xe_dbg_reg_snapshot *snap) {
>> +	xe_dbg_reg_snapshot_print(p, snap);
>> +
>> +	if (snap && snap->num_regs >= 2 &&
>> +	    !(snap->regs[1].value & RENDER_POWERGATE_ENABLE))
>> +		drm_puts(p, "render powergating appears not enabled\n"); }
>> +
> Can you think on following thing first. It looks like too many structs and apis :
>
> Struct side: one array instead of two separate named structs. Something like below?
> enum xe_dbg_regset_type {
>      XE_DBG_REGSET_FUSE,
>      XE_DBG_REGSET_RPM,
>      XE_DBG_REGSET_MAX,
> };
>
> static const struct xe_gt_regset xe_dbg_regsets[XE_DBG_REGSET_MAX] = {
>      [XE_DBG_REGSET_FUSE] = {
>          .gt[XE_GT_TYPE_MAIN]  = { xe3p_gt_fuse_reglist, ARRAY_SIZE(xe3p_gt_fuse_reglist) },
>          .gt[XE_GT_TYPE_MEDIA] = { xe3p_media_gt_fuse_reglist, ARRAY_SIZE(xe3p_media_gt_fuse_reglist) },
>      },
>      [XE_DBG_REGSET_RPM] = {
>          .gt[XE_GT_TYPE_MAIN]  = { xe3p_gt_rpm_reglist, ARRAY_SIZE(xe3p_gt_rpm_reglist) },
>          .gt[XE_GT_TYPE_MEDIA] = { xe3p_media_gt_rpm_reglist, ARRAY_SIZE(xe3p_media_gt_rpm_reglist) },
>      },
> };
>
> Capture side: one function instead of four.
> static struct xe_dbg_reg_snapshot *
> xe_dbg_gt_snapshot_capture(struct xe_gt *fault_gt, enum xe_dbg_regset_type type,
>                 enum xe_gt_type gt_type)
> {
>      struct xe_gt *target_gt;
>
>      if (!fault_gt || !fault_gt->tile)
>          return NULL;
>
>      target_gt = gt_type == XE_GT_TYPE_MEDIA ? fault_gt->tile->media_gt
>                           : fault_gt->tile->primary_gt;
>      if (!target_gt)
>          return NULL;
>
>      return xe_dbg_reg_snapshot_capture_target(fault_gt, target_gt,
>                            &xe_dbg_regsets[type].gt[gt_type]);
> }
>
> And then,
> ss->gt_fuse      = xe_dbg_gt_snapshot_capture(q->gt, XE_DBG_REGSET_FUSE, XE_GT_TYPE_MAIN);
> ss->media_fuse   = xe_dbg_gt_snapshot_capture(q->gt, XE_DBG_REGSET_FUSE, XE_GT_TYPE_MEDIA);
> ss->gt_rpm       = xe_dbg_gt_snapshot_capture(q->gt, XE_DBG_REGSET_RPM,  XE_GT_TYPE_MAIN);
> ss->media_gt_rpm = xe_dbg_gt_snapshot_capture(q->gt, XE_DBG_REGSET_RPM,  XE_GT_TYPE_MEDIA);
>
> Also please think something storage side also if possible to optimize.
Let me check on that
>> +static struct xe_dbg_reg_snapshot *
>> +xe_dbg_reg_snapshot_capture_target(struct xe_gt *fault_gt,
>> +				   struct xe_gt *target_gt,
>> +				   const struct xe_reg_desc_list *reglist) {
>> +	if (!fault_gt || !target_gt)
>> +		return NULL;
>> +
>> +	if (target_gt != fault_gt) {
>> +		CLASS(xe_force_wake, fw_ref)(gt_to_fw(target_gt),
>> +					     XE_FORCEWAKE_ALL);
>> +		if (!xe_force_wake_ref_has_domain(fw_ref.domains,
>> XE_FORCEWAKE_ALL))
>> +			return NULL;
>> +
>> +		return xe_dbg_reg_snapshot_capture(target_gt, reglist);
>> +	}
>> +
>> +	return xe_dbg_reg_snapshot_capture(target_gt, reglist); }
>> +
>> +static struct xe_dbg_reg_snapshot *
>> +xe_gt_fuse_snapshot_capture(struct xe_gt *gt) {
>> +	if (!gt || !gt->tile || !gt->tile->primary_gt)
>> +		return NULL;
>> +
>> +	return xe_dbg_reg_snapshot_capture_target(gt,
>> +						  gt->tile->primary_gt,
>> +						  XE_GT_REG_LIST(fuse,
>> MAIN));
>> +}
>> +
>> +static struct xe_dbg_reg_snapshot *
>> +xe_media_gt_fuse_snapshot_capture(struct xe_gt *gt) {
>> +	if (!gt || !gt->tile || !gt->tile->media_gt)
>> +		return NULL;
>> +
>> +	return xe_dbg_reg_snapshot_capture_target(gt,
>> +						  gt->tile->media_gt,
>> +						  XE_GT_REG_LIST(fuse,
>> MEDIA));
>> +}
>> +
>> +static struct xe_dbg_reg_snapshot *xe_gt_rpm_snapshot_capture(struct
>> +xe_gt *gt) {
>> +	if (!gt || !gt->tile || !gt->tile->primary_gt)
>> +		return NULL;
>> +
>> +	return xe_dbg_reg_snapshot_capture_target(gt,
>> +						  gt->tile->primary_gt,
>> +						  XE_GT_REG_LIST(rpm,
>> MAIN));
>> +}
>> +
>> +static struct xe_dbg_reg_snapshot *
>> +xe_media_gt_rpm_snapshot_capture(struct xe_gt *gt) {
>> +	if (!gt || !gt->tile || !gt->tile->media_gt)
>> +		return NULL;
>> +
>> +	return xe_dbg_reg_snapshot_capture_target(gt,
>> +						  gt->tile->media_gt,
>> +						  XE_GT_REG_LIST(rpm,
>> MEDIA));
>> +}
>> +
>>   static struct xe_device *coredump_to_xe(const struct xe_devcoredump
>> *coredump)  {
>>   	return container_of(coredump, struct xe_device, devcoredump); @@
>> -114,6 +343,15 @@ static ssize_t __xe_devcoredump_read(char *buffer,
>> ssize_t count,
>>   	drm_printf(&p, "\n**** GT #%d ****\n", ss->gt->info.id);
>>   	drm_printf(&p, "\tTile: %d\n", ss->gt->tile->id);
>>
>> +	drm_printf(&p, "\n**** GT Fuse Register Dump ****\n");
>> +	xe_dbg_reg_snapshot_print(&p, ss->gt_fuse);
>> +	drm_printf(&p, "\n**** Media GT Fuse Register Dump ****\n");
>> +	xe_dbg_reg_snapshot_print(&p, ss->media_fuse);
>> +	drm_printf(&p, "\n**** GT RPM Register Dump ****\n");
>> +	xe_gt_rpm_snapshot_print(&p, ss->gt_rpm);
>> +	drm_printf(&p, "\n**** Media GT RPM Register Dump ****\n");
>> +	xe_dbg_reg_snapshot_print(&p, ss->media_gt_rpm);
>> +
>>   	drm_puts(&p, "\n**** GuC Log ****\n");
>>   	xe_guc_log_snapshot_print(ss->guc.log, &p);
>>   	drm_puts(&p, "\n**** GuC CT ****\n");
>> @@ -149,6 +387,18 @@ static void xe_devcoredump_snapshot_free(struct
>> xe_devcoredump_snapshot *ss)
>>   	xe_guc_ct_snapshot_free(ss->guc.ct);
>>   	ss->guc.ct = NULL;
>>
>> +	xe_dbg_reg_snapshot_free(ss->gt_fuse);
>> +	ss->gt_fuse = NULL;
>> +
>> +	xe_dbg_reg_snapshot_free(ss->media_fuse);
>> +	ss->media_fuse = NULL;
>> +
>> +	xe_dbg_reg_snapshot_free(ss->gt_rpm);
>> +	ss->gt_rpm = NULL;
>> +
>> +	xe_dbg_reg_snapshot_free(ss->media_gt_rpm);
>> +	ss->media_gt_rpm = NULL;
>> +
>>   	if (!IS_ERR_OR_NULL(ss->gt))
>>   		xe_guc_capture_put_matched_nodes(&ss->gt->uc.guc);
>>   	ss->matched_node = NULL;
>> @@ -349,6 +599,11 @@ static void devcoredump_snapshot(struct
>> xe_devcoredump *coredump,
>>
>>   	cookie = dma_fence_begin_signalling();
>>
>> +	ss->gt_fuse = xe_gt_fuse_snapshot_capture(q->gt);
>> +	ss->media_fuse = xe_media_gt_fuse_snapshot_capture(q->gt);
>> +	ss->gt_rpm = xe_gt_rpm_snapshot_capture(q->gt);
>> +	ss->media_gt_rpm = xe_media_gt_rpm_snapshot_capture(q->gt);
>> +
>>   	ss->guc.log = xe_guc_log_snapshot_capture(&guc->log, true);
>>   	ss->guc.ct = xe_guc_ct_snapshot_capture(&guc->ct);
>>   	ss->ge = xe_guc_exec_queue_snapshot_capture(q);
>> diff --git a/drivers/gpu/drm/xe/xe_devcoredump_types.h
>> b/drivers/gpu/drm/xe/xe_devcoredump_types.h
>> index a174385a6d83..75f317a5fe36 100644
>> --- a/drivers/gpu/drm/xe/xe_devcoredump_types.h
>> +++ b/drivers/gpu/drm/xe/xe_devcoredump_types.h
>> @@ -14,6 +14,35 @@
>>   struct xe_device;
>>   struct xe_gt;
>>
>> +/**
>> + * struct xe_reg_dump_snapshot - dump register snapshot
>> + *
>> + * This struct is used as generic reg dump snapshot in the format of
>> + * register, its value and its name for human readable format.
>> + */
>> +struct xe_reg_dump_snapshot {
>> +	/** @reg: xe register structure*/
>> +	struct xe_reg reg;
>> +	/** @value: Value of the register*/
>> +	u32 value;
>> +	/** @name: Name of the register */
>> +	const char *name;
>> +};
>> +
>> +/**
>> + * struct xe_dbg_reg_snapshot - Register snapshot
>> + *
>> + * This struct contains the register values captured at the time of the crash.
>> + * It is used to store the register values in a human-readable format
>> +for
>> + * debugging purposes.
>> + */
>> +struct xe_dbg_reg_snapshot {
>> +	/** @num_regs: Number of registers needed for capture. */
>> +	u32 num_regs;
>> +	/** @regs: Pointer to an array of register dump snapshot. */
>> +	struct xe_reg_dump_snapshot regs[];
>> +};
>> +
>>   /**
>>    * struct xe_devcoredump_snapshot - Crash snapshot
>>    *
>> @@ -35,6 +64,16 @@ struct xe_devcoredump_snapshot {
>>
>>   	/** @gt: Affected GT, used by forcewake for delayed capture */
>>   	struct xe_gt *gt;
>> +
>> +	/** @gt_fuse: Fuse snapshot */
>> +	struct xe_dbg_reg_snapshot *gt_fuse;
>> +	/** @media_fuse: Media Fuse snapshot */
>> +	struct xe_dbg_reg_snapshot *media_fuse;
>> +	/** @gt_rpm: GT RPM snapshot */
>> +	struct xe_dbg_reg_snapshot *gt_rpm;
>> +	/** @media_gt_rpm: Media GT RPM snapshot */
>> +	struct xe_dbg_reg_snapshot *media_gt_rpm;
>> +
>>   	/** @work: Workqueue for deferred capture outside of signaling
>> context */
>>   	struct work_struct work;
>>
>> diff --git a/drivers/gpu/drm/xe/xe_device.h
>> b/drivers/gpu/drm/xe/xe_device.h index 6c4cfaebc44a..e05951b6988b
>> 100644
>> --- a/drivers/gpu/drm/xe/xe_device.h
>> +++ b/drivers/gpu/drm/xe/xe_device.h
>> @@ -260,6 +260,11 @@ static inline bool
>> xe_debug_page_size_mode_is_mixed(struct xe_device *xe)  }  #endif
>>
>> +static inline bool xe_dbg_reg_snapshot_is_supported(struct xe_device
>> +*xe) {
>> +	return (GRAPHICS_VER(xe) >= 35);
> Since when these dbg registers got introduced, this almost starts from NVL-S based on your check.

I see only some/few of the register are xe3p based and as this captured 
started for supporting for CRI .so thought have capture from the

graphics version >=35?

Thanks,

Naresh

>
> Tejas
>> +}
>> +
>>   void xe_device_set_wedged_method(struct xe_device *xe, unsigned long
>> method);  void xe_device_declare_wedged(struct xe_device *xe);  int
>> xe_device_validate_wedged_mode(struct xe_device *xe, unsigned int mode);
>> --
>> 2.43.0

  reply	other threads:[~2026-10-08 13:57 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-03 14:18 [PATCH v3 0/7] drm/xe: Capture additional HW register state in devcoredump Nareshkumar Gollakoti
2026-09-03 14:18 ` [PATCH v3 1/7] drm/xe/devcoredump: Capture GT fuse registers " Nareshkumar Gollakoti
2026-09-03 14:32   ` sashiko-bot
2026-10-07 13:51   ` Upadhyay, Tejas
2026-10-08 13:57     ` Kumar G, Naresh [this message]
2026-09-03 14:18 ` [PATCH v3 2/7] drm/xe/devcoredump: Add GuC register snapshot to devcoredump Nareshkumar Gollakoti
2026-09-03 14:18 ` [PATCH v3 3/7] drm/xe/guc: Print register addresses in capture snapshot output Nareshkumar Gollakoti
2026-09-03 14:18 ` [PATCH v3 4/7] drm/xe: dump GAM page fault report registers in devcoredump Nareshkumar Gollakoti
2026-09-03 14:18 ` [PATCH v3 5/7] drm/xe/guc: add TDL, SLICE gfx registers to capture list Nareshkumar Gollakoti
2026-09-03 14:18 ` [PATCH v3 6/7] drm/xe: capture L3 node status registers in devcoredump Nareshkumar Gollakoti
2026-09-03 14:18 ` [PATCH v3 7/7] drm/xe/guc: capture additional engine state registers Nareshkumar Gollakoti
2026-09-03 14:33   ` sashiko-bot
2026-09-03 14:54 ` ✗ CI.checkpatch: warning for drm/xe: Capture additional HW register state in devcoredump (rev3) Patchwork
2026-09-03 14:56 ` ✓ CI.KUnit: success " Patchwork
2026-09-03 15:39 ` ✓ Xe.CI.BAT: " Patchwork
2026-09-04  2:01 ` ✗ Xe.CI.FULL: failure " Patchwork

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=cf7950e1-3f34-478e-a239-e2cd71f2ee63@intel.com \
    --to=naresh.kumar.g@intel.com \
    --cc=arvind.yadav@intel.com \
    --cc=himal.prasad.ghimiray@intel.com \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=tejas.upadhyay@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