public inbox for intel-xe@lists.freedesktop.org
 help / color / mirror / Atom feed
From: "Ghimiray, Himal Prasad" <himal.prasad.ghimiray@intel.com>
To: Matthew Brost <matthew.brost@intel.com>
Cc: <intel-xe@lists.freedesktop.org>,
	<thomas.hellstrom@linux.intel.com>, <stuart.summers@intel.com>,
	<arvind.yadav@intel.com>, <tejas.upadhyay@intel.com>
Subject: Re: [RFC 03/15] drm/xe: Stub out new access_counter layer
Date: Mon, 6 Apr 2026 10:58:15 +0530	[thread overview]
Message-ID: <ed56f36e-bccb-46ef-9ece-1f59309d8e14@intel.com> (raw)
In-Reply-To: <ac7jni3tTviagHP0@gsse-cloud1.jf.intel.com>



On 03-04-2026 03:16, Matthew Brost wrote:
> On Wed, Mar 18, 2026 at 01:14:44PM +0530, Himal Prasad Ghimiray wrote:
>> Add access counter infrastructure with type definitions, header files,
>> and stub implementation. This follows a two-layer producer-consumer
>> architecture similar to the pagefault layer.
>>
>> Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
>> ---
>>   drivers/gpu/drm/xe/Makefile                  |   3 +-
>>   drivers/gpu/drm/xe/xe_access_counter.c       |  55 +++++++++
>>   drivers/gpu/drm/xe/xe_access_counter.h       |  17 +++
>>   drivers/gpu/drm/xe/xe_access_counter_types.h | 123 +++++++++++++++++++
>>   4 files changed, 197 insertions(+), 1 deletion(-)
>>   create mode 100644 drivers/gpu/drm/xe/xe_access_counter.c
>>   create mode 100644 drivers/gpu/drm/xe/xe_access_counter.h
>>   create mode 100644 drivers/gpu/drm/xe/xe_access_counter_types.h
>>
>> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
>> index 3a3f9f22d42a..92d8d6e4a447 100644
>> --- a/drivers/gpu/drm/xe/Makefile
>> +++ b/drivers/gpu/drm/xe/Makefile
>> @@ -32,7 +32,8 @@ $(obj)/generated/%_device_wa_oob.c $(obj)/generated/%_device_wa_oob.h: $(obj)/xe
>>   
>>   # core driver code
>>   
>> -xe-y += xe_bb.o \
>> +xe-y += xe_access_counter.o \
>> +	xe_bb.o \
>>   	xe_bo.o \
>>   	xe_bo_evict.o \
>>   	xe_dep_scheduler.o \
>> diff --git a/drivers/gpu/drm/xe/xe_access_counter.c b/drivers/gpu/drm/xe/xe_access_counter.c
>> new file mode 100644
>> index 000000000000..f3a8a93b5135
>> --- /dev/null
>> +++ b/drivers/gpu/drm/xe/xe_access_counter.c
>> @@ -0,0 +1,55 @@
>> +// SPDX-License-Identifier: MIT
>> +/*
>> + * Copyright © 2026 Intel Corporation
>> + */
>> +
>> +#include <linux/circ_buf.h>
>> +
>> +#include <drm/drm_exec.h>
>> +#include <drm/drm_managed.h>
>> +
>> +#include "xe_access_counter.h"
>> +#include "xe_access_counter_types.h"
>> +#include "xe_device.h"
>> +
>> +/**
>> + * DOC: Xe access counters
>> + *
>> + * Xe access counters are handled in two layers with one-way communication.
>> + * The producer layer interacts with hardware or firmware to receive and parse
>> + * access counter notifications into struct xe_access_counter, then forwards them
>> + * to the consumer. The consumer layer services the notifications (e.g., memory
>> + * migration hints, binding decisions). No acknowledgment is sent back to the
>> + * producer. The consumer uses an access counter queue sized to absorb all potential
>> + * notifications and a multi-threaded worker to process them. Multiple producers
>> + * are supported, with a single shared consumer.
>> + *
>> + * xe_access_counter.c implements the consumer layer.
>> + */
>> +
>> +/**
>> + * xe_access_counter_init - Initialize access counter consumer layer
>> + * @xe: xe device
>> + *
>> + * Return: 0 on success, negative error code on error
>> + */
>> +int xe_access_counter_init(struct xe_device *xe)
>> +{
>> +	/* Stub implementation - to be filled in */
>> +	return 0;
>> +}
>> +
>> +/**
>> + * xe_access_counter_handler - Handle an access counter notification
>> + * @xe: xe device
>> + * @ac: access counter notification
>> + *
>> + * Process an access counter notification from the producer layer.
>> + *
>> + * Return: 0 on success, negative error code on error
>> + */
>> +int xe_access_counter_handler(struct xe_device *xe, struct xe_access_counter *ac)
>> +{
>> +	/* Stub implementation - to be filled in */
>> +	return 0;
>> +}
>> diff --git a/drivers/gpu/drm/xe/xe_access_counter.h b/drivers/gpu/drm/xe/xe_access_counter.h
>> new file mode 100644
>> index 000000000000..b3a331687f13
>> --- /dev/null
>> +++ b/drivers/gpu/drm/xe/xe_access_counter.h
>> @@ -0,0 +1,17 @@
>> +/* SPDX-License-Identifier: MIT */
>> +/*
>> + * Copyright © 2026 Intel Corporation
>> + */
>> +
>> +#ifndef _XE_ACCESS_COUNTER_H_
>> +#define _XE_ACCESS_COUNTER_H_
>> +
>> +struct xe_device;
>> +struct xe_gt;
>> +struct xe_access_counter;
>> +
>> +int xe_access_counter_init(struct xe_device *xe);
>> +
>> +int xe_access_counter_handler(struct xe_device *xe, struct xe_access_counter *ac);
>> +
>> +#endif
>> diff --git a/drivers/gpu/drm/xe/xe_access_counter_types.h b/drivers/gpu/drm/xe/xe_access_counter_types.h
>> new file mode 100644
>> index 000000000000..74b903b9461b
>> --- /dev/null
>> +++ b/drivers/gpu/drm/xe/xe_access_counter_types.h
>> @@ -0,0 +1,123 @@
>> +/* SPDX-License-Identifier: MIT */
>> +/*
>> + * Copyright © 2026 Intel Corporation
>> + */
>> +
>> +#ifndef _XE_ACCESS_COUNTER_TYPES_H_
>> +#define _XE_ACCESS_COUNTER_TYPES_H_
>> +
>> +#include <linux/sizes.h>
>> +#include <linux/types.h>
>> +
>> +struct xe_gt;
>> +struct xe_access_counter;
>> +
>> +/** enum xe_access_counter_type - Xe access counter type */
>> +enum xe_access_counter_type {
>> +	/** @XE_ACCESS_COUNTER_TYPE_TRIGGER */
>> +	XE_ACCESS_COUNTER_TYPE_TRIGGER		= 0,
>> +	/** @XE_ACCESS_COUNTER_TYPE_NOTIFY*/
>> +	XE_ACCESS_COUNTER_TYPE_NOTIFY	= 1,
>> +};
> 
> What’s the difference between the types? Patch 8 handles both of them in
> exactly the same way, which may be correct or fine, but without kernel
> documentation explaining the distinction between the types here, it’s
> hard to reason about it.
> 

Will add kernel doc in next rev.

>> +
>> +/** enum xe_access_counter_granularity - Xe access counter granularity */
>> +enum xe_access_counter_granularity {
>> +	/** @XE_ACCESS_COUNTER_GRANULARITY_128K: 128K granularity */
>> +	XE_ACCESS_COUNTER_GRANULARITY_128K	= 0,
>> +	/** @XE_ACCESS_COUNTER_GRANULARITY_2M: 2M granularity */
>> +	XE_ACCESS_COUNTER_GRANULARITY_2M	= 1,
>> +	/** @XE_ACCESS_COUNTER_GRANULARITY_16M: 16M granularity */
>> +	XE_ACCESS_COUNTER_GRANULARITY_16M	= 2,
>> +	/** @XE_ACCESS_COUNTER_GRANULARITY_64M: 64M granularity */
>> +	XE_ACCESS_COUNTER_GRANULARITY_64M	= 3,
>> +};
>> +
>> +static inline int xe_access_counter_granularity_in_byte(int val)
>> +{
>> +	switch (val) {
>> +	case XE_ACCESS_COUNTER_GRANULARITY_128K:
>> +		return SZ_128K;
>> +	case XE_ACCESS_COUNTER_GRANULARITY_2M:
>> +		return SZ_2M;
>> +	case XE_ACCESS_COUNTER_GRANULARITY_16M:
>> +		return SZ_16M;
>> +	case XE_ACCESS_COUNTER_GRANULARITY_64M:
>> +		return SZ_64M;
>> +	default:
>> +		return 0;
>> +	}
>> +}
> 
> As discussed in [1], I think the granularity handling can be moved into
> the GuC layer, so there’s no need to include public definitions here.
> 
> [1] https://patchwork.freedesktop.org/patch/712600/?series=163429&rev=1#comment_1318525

Makes sense, will move it to guc_layer, probably xe_access_counter_type 
can also be moved to guc layer.

> 
>> +
>> +/**
>> + * struct xe_access_counter - Xe access counter
>> + *
>> + * Generic access counter structure for communication between producer and consumer.
>> + * Carefully sized to be 64 bytes. Upon a device access counter notification, the
>> + * producer populates this structure, and the consumer copies it into the access
>> + * counter queue for deferred handling.
>> + */
>> +struct xe_access_counter {
>> +	/**
>> +	 * @gt: GT of access counter
>> +	 */
>> +	struct xe_gt *gt;
>> +	/**
>> +	 * @consumer: State for the software handling the access counter.
>> +	 * Populated by the producer and may be modified by the consumer to
>> +	 * communicate information back to the producer upon acknowledgment.
>> +	 */
>> +	struct {
>> +		/** @consumer.va_range_base: base virtual address of range */
>> +		u64 va_range_base;
>> +		/** @consumer.sub_granularity: sub-granularity */
>> +		u32 sub_granularity;
>> +		/**
>> +		 * @consumer.counter_type: counter type, u8 rather than enum to
>> +		 * keep size compact
>> +		 */
>> +		u8 counter_type;
>> +		/**
>> +		 * @consumer.granularity: access granularity, u8 rather than enum
>> +		 * to keep size compact
>> +		 */
>> +		u8 granularity;
>> +		/** @consumer.reserved: reserved bits for alignment */
>> +		u8 reserved[2];
>> +		/** @consumer: Platform-specific fields */
>> +		union {
>> +			/** @consumer.xe3: Xe3-specific fields */
>> +			struct {
>> +				/** @consumer.xe3.asid: address space ID */
>> +				u32 asid;
>> +				/** @consumer.xe3.engine_class: engine class */
>> +				u8 engine_class;
>> +				/** @consumer.xe3.engine_instance: engine instance */
>> +				u8 engine_instance;
>> +				/** @consumer.xe3.vfid: VFID */
>> +				u8 vfid;
>> +				/** @consumer.xe3.reserved: reserved bits */
>> +				u8 reserved;
>> +			} xe3;
>> +		};
> 
> Can we drop the xe3 prefix here to keep this interface generic across
> platforms?
Yes we can drop xe3 prefix, but we need differentiatior since interface 
will be HW dependent.

> 
> Also, a question: xe3 implies these are only valid on xe3+, so do access
> counters not work on prior platforms?


  For example, without a valid ASID,
> the common layer can’t find a VMA.
  Will explore this.
> 
>> +	} consumer;
>> +	/**
>> +	 * @producer: State for the producer (i.e., HW/FW interface). Populated
>> +	 * by the producer and should not be modified—or even inspected—by the
>> +	 * consumer, except for calling operations.
>> +	 */
>> +	struct {
>> +		/** @producer.private: private pointer */
>> +		void *private;
>> +#define XE_ACCESS_COUNTER_PRODUCER_MSG_LEN_DW	4
>> +		/**
>> +		 * @producer.msg: access counter message, used by producer in
>> +		 * acknowledgment to formulate response to HW/FW interface.
>> +		 * Included in the access counter message because the producer
>> +		 * typically receives the notification in a context where memory
>> +		 * cannot be allocated (e.g., atomic context or the reclaim path).
>> +		 */
>> +		u32 msg[XE_ACCESS_COUNTER_PRODUCER_MSG_LEN_DW];
>> +	} producer;
> 
> As discussed in [1], unless we have plans to ACK access counters in the
> near future, I would just drop this.

The ACK is not available rightnow, I left it for future usecases, will 
remove it.

> 
> Matt
> 
>> +};
>> +
>> +#endif
>> -- 
>> 2.34.1
>>


  reply	other threads:[~2026-04-06  5:28 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-18  7:44 [RFC 00/15] drm/xe: Access counter consumer layer Himal Prasad Ghimiray
2026-03-18  7:34 ` ✗ CI.checkpatch: warning for " Patchwork
2026-03-18  7:35 ` ✗ CI.KUnit: failure " Patchwork
2026-03-18  7:44 ` [RFC 01/15] drm/xe: Add xe_usm_queue generic USM circular buffer Himal Prasad Ghimiray
2026-04-01 21:28   ` Matthew Brost
2026-04-06  4:46     ` Ghimiray, Himal Prasad
2026-03-18  7:44 ` [RFC 02/15] drm/xe/pagefault: Use xe_usm_queue helpers Himal Prasad Ghimiray
2026-03-18  7:44 ` [RFC 03/15] drm/xe: Stub out new access_counter layer Himal Prasad Ghimiray
2026-04-02 21:46   ` Matthew Brost
2026-04-06  5:28     ` Ghimiray, Himal Prasad [this message]
2026-03-18  7:44 ` [RFC 04/15] drm/xe: Implement xe_access_counter_init Himal Prasad Ghimiray
2026-03-18  7:44 ` [RFC 05/15] drm/xe: Implement xe_access_counter_handler Himal Prasad Ghimiray
2026-04-03  2:06   ` Matthew Brost
2026-03-18  7:44 ` [RFC 06/15] drm/xe: Extract xe_vma_lock_and_validate helper Himal Prasad Ghimiray
2026-04-01 22:03   ` Matthew Brost
2026-03-18  7:44 ` [RFC 07/15] drm/xe: Move ASID to FAULT VM lookup to xe_device Himal Prasad Ghimiray
2026-04-02 21:50   ` Matthew Brost
2026-04-07  6:41     ` Ghimiray, Himal Prasad
2026-03-18  7:44 ` [RFC 08/15] drm/xe: Implement xe_access_counter_queue_work Himal Prasad Ghimiray
2026-04-01 21:10   ` Matthew Brost
2026-04-01 22:01     ` Matthew Brost
2026-04-01 22:11   ` Matthew Brost
2026-04-02 22:06   ` Matthew Brost
2026-03-18  7:44 ` [RFC 09/15] drm/xe/trace: Add xe_vma_acc trace event for access counter notifications Himal Prasad Ghimiray
2026-04-03  1:01   ` Matthew Brost
2026-03-18  7:44 ` [RFC 10/15] drm/xe/svm: Handle svm ranges on access ctr trigger Himal Prasad Ghimiray
2026-04-03  0:25   ` Matthew Brost
2026-03-18  7:44 ` [RFC 11/15] drm/xe: Add xe_guc_access_counter layer Himal Prasad Ghimiray
2026-04-02 21:27   ` Matthew Brost
2026-03-18  7:44 ` [RFC 12/15] drm/xe/uapi: Add access counter parameter extension for exec queue Himal Prasad Ghimiray
2026-03-24 14:25   ` Francois Dugast
2026-04-01 14:46     ` Matthew Brost
2026-04-01 16:36       ` Ghimiray, Himal Prasad
2026-03-18  7:44 ` [RFC 13/15] drm/xe/lrc: Pass exec_queue to xe_lrc_create for access counter params Himal Prasad Ghimiray
2026-03-18  7:44 ` [RFC 14/15] drm/xe/vm: Add xe_vma_supports_access_ctr() helper Himal Prasad Ghimiray
2026-03-18  7:44 ` [RFC 15/15] drm/xe/pt: Set NC PTE bit for VMAs ineligible for access counting Himal Prasad Ghimiray
2026-04-03  0:09   ` Matthew Brost

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=ed56f36e-bccb-46ef-9ece-1f59309d8e14@intel.com \
    --to=himal.prasad.ghimiray@intel.com \
    --cc=arvind.yadav@intel.com \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=matthew.brost@intel.com \
    --cc=stuart.summers@intel.com \
    --cc=tejas.upadhyay@intel.com \
    --cc=thomas.hellstrom@linux.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