From: "Tauro, Riana" <riana.tauro@intel.com>
To: "Ghimiray, Himal Prasad" <himal.prasad.ghimiray@intel.com>,
<intel-xe@lists.freedesktop.org>
Cc: <anshuman.gupta@intel.com>, <rodrigo.vivi@intel.com>,
<aravind.iddamsetty@linux.intel.com>, <badal.nilawar@intel.com>,
<raag.jadav@intel.com>, <ravi.kishore.koppuravuri@intel.com>,
<mallesh.koujalagi@intel.com>, <soham.purkait@intel.com>,
<tejas.upadhyay@intel.com>
Subject: Re: [PATCH v2 2/6] drm/xe/xe_ras: Add support to query page offline queue and list
Date: Fri, 11 Sep 2026 11:41:52 +0530 [thread overview]
Message-ID: <57ba2a0a-a4eb-4e97-9fea-003cd494c9f2@intel.com> (raw)
In-Reply-To: <8c546a9c-4c59-4345-b430-dba6eb6a2244@intel.com>
On 07-09-2026 23:55, Ghimiray, Himal Prasad wrote:
>
>
> On 07-09-2026 15:17, Riana Tauro wrote:
>> Add support to query page offline list and queue from firmware
>> during module load. The page offline list command retrieves pages that
>> are already offlined by the firmware. The page offline queue command
>> retrieves the pages pending to be offlined by the firmware.
>>
>> Cc: Tejas Upadhyay <tejas.upadhyay@intel.com>
>> Signed-off-by: Riana Tauro <riana.tauro@intel.com>
>> ---
>> v2: rebase
>> store total pages once per response (Sashiko)
>> ---
>> drivers/gpu/drm/xe/xe_ras.c | 105 ++++++++++++++++++
>> drivers/gpu/drm/xe/xe_ras_types.h | 43 +++++++
>> drivers/gpu/drm/xe/xe_sysctrl_mailbox_types.h | 4 +
>> 3 files changed, 152 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_ras.c b/drivers/gpu/drm/xe/xe_ras.c
>> index 94ffd0852938..648e46df831d 100644
>> --- a/drivers/gpu/drm/xe/xe_ras.c
>> +++ b/drivers/gpu/drm/xe/xe_ras.c
>> @@ -326,6 +326,108 @@ static bool ras_counter_is_valid(struct
>> xe_device *xe, struct xe_ras_error_class
>> return true;
>> }
>> +static void get_queued_pages(struct xe_device *xe)
>> +{
>> + struct xe_sysctrl_mailbox_command command = {0};
>> + struct xe_ras_page_offline_queue response = {0};
>> + u32 count = 0, total_pages = 0;
>> + size_t rlen;
>> + int ret, i;
>> +
>> + /* Supported only on platforms with system controller */
>> + if (!xe->info.has_sysctrl)
>> + return;
>
> move to caller, single check helps for both get_queued_pages and
> get_offlined_list.
This is already part of caller. Added here in case there is a re-use.
>
>> +
>> + xe_sysctrl_create_command(&command, XE_SYSCTRL_GROUP_GFSP,
>> + XE_SYSCTRL_CMD_GET_OFFLINE_QUEUE, NULL, 0, &response,
>> + sizeof(response));
>> +
>> + do {
>> + memset(&response, 0, sizeof(response));
>> +
>> + ret = xe_sysctrl_send_command(&xe->sc, &command, &rlen);
>> + if (ret) {
>> + xe_log_err(xe, SYSCTRL, ret, "failed to get page offline
>> queue\n");
>> + return;
>> + }
>> + if (rlen != sizeof(response)) {
>> + xe_log_err(xe, SYSCTRL, -EINVAL,
>> + "unexpected page offline queue response length
>> %zu (expected %zu)\n",
>> + rlen, sizeof(response));
>> + return;
>> + }
>> +
>
> How about helper function for below part avoids code duplication ?
I did try it before sending this. But due to difference in
request/response structures it is not very clean.
And there is max_entries cached in the next patch in offline list.
Thanks
Riana
>
>
>> + for (i = 0; i < response.pages_returned && i <
>> XE_RAS_NUM_PAGES; i++)
>> + handle_page_offline(xe, response.page_addresses[i], true);
>> +
>> + count += response.pages_returned;
>> + if (!response.pages_returned)
>> + break;
>> +
>> + if (!total_pages)
>> + total_pages = response.total_pages;
>> +
>> + if (count > total_pages) {
>> + xe_log_err(xe, SYSCTRL, -EINVAL,
>> + "Pages returned from queue exceed total pages %u,
>> returned %u\n",
>> + total_pages, count);
>> + return;
>> + }
>> + } while (response.additional_data);
>> +}
>> +
>> +static void get_offlined_list(struct xe_device *xe)
>> +{
>> + struct xe_sysctrl_mailbox_command command = {0};
>> + struct xe_ras_offline_list_response response = {0};
>> + struct xe_ras_offline_list_request request = {0};
>> + u32 count = 0, total_pages = 0;
>> + size_t rlen;
>> + int ret, i;
>> +
>> + /* Supported only on platforms with system controller */
>> + if (!xe->info.has_sysctrl)
>> + return;
>> +
>> + xe_sysctrl_create_command(&command, XE_SYSCTRL_GROUP_GFSP,
>> XE_SYSCTRL_CMD_GET_OFFLINE_LIST,
>> + &request, sizeof(request), &response,
>> sizeof(response));
>> +
>> + do {
>> + memset(&response, 0, sizeof(response));
>> + request.index = count;
>> +
>> + ret = xe_sysctrl_send_command(&xe->sc, &command, &rlen);
>> + if (ret) {
>> + xe_log_err(xe, SYSCTRL, ret, "failed to get page offline
>> list\n");
>> + return;
>> + }
>> +
>> + if (rlen != sizeof(response)) {
>> + xe_log_err(xe, SYSCTRL, -EINVAL,
>> + "unexpected page offline list response length %zu
>> (expected %zu)\n",
>> + rlen, sizeof(response));
>> + return;
>> + }
>> +
>> + for (i = 0; i < response.pages_returned && i <
>> XE_RAS_NUM_PAGES; i++)
>> + handle_page_offline(xe, response.page_addresses[i], false);
>> +
>> + count += response.pages_returned;
>> + if (!response.pages_returned)
>> + break;
>> +
>> + if (!total_pages)
>> + total_pages = response.total_pages;
>> +
>> + if (count > total_pages) {
>> + xe_log_err(xe, SYSCTRL, -EINVAL,
>> + "Pages returned from list exceed total pages %u,
>> returned %u\n",
>> + total_pages, count);
>> + return;
>> + }
>> + } while (response.additional_data);
>> +}
>> +
>> static struct pci_dev *find_usp_dev(struct pci_dev *pdev)
>> {
>> struct pci_dev *vsp;
>> @@ -1040,6 +1142,9 @@ void xe_ras_init(struct xe_device *xe)
>> if (IS_ENABLED(CONFIG_PCIEAER))
>> ras_usp_aer_init(xe);
>> + get_queued_pages(xe);
>> + get_offlined_list(xe);
>> +
>> ret = devm_device_add_group(xe->drm.dev, &gpu_health_group);
>> if (ret)
>> xe_err(xe, "Failed to create GPU health sysfs, err=%d\n",
>> ret);
>> diff --git a/drivers/gpu/drm/xe/xe_ras_types.h
>> b/drivers/gpu/drm/xe/xe_ras_types.h
>> index 20c74593ce05..7bfd86c9d135 100644
>> --- a/drivers/gpu/drm/xe/xe_ras_types.h
>> +++ b/drivers/gpu/drm/xe/xe_ras_types.h
>> @@ -10,6 +10,7 @@
>> #define XE_RAS_NUM_COUNTERS 16
>> #define XE_RAS_NUM_ERROR_ARR 3
>> +#define XE_RAS_NUM_PAGES 25
>> /* Error bits in IEH global error status register */
>> #define XE_RAS_SOC_IEH_PUNIT BIT(1)
>> /* Device memory error categories */
>> @@ -330,6 +331,48 @@ struct xe_ras_page_offline_response {
>> u32 reserved;
>> } __packed;
>> +/**
>> + * struct xe_ras_offline_list_request - Request for get offline list
>> command
>> + */
>> +struct xe_ras_offline_list_request {
>> + /** @index: Zero-based index into the offline page list */
>> + u32 index;
>> +} __packed;
>> +
>> +/**
>> + * struct xe_ras_offline_list_response - Response from get offline
>> list command
>> + */
>> +struct xe_ras_offline_list_response {
>> + /** @max_entries: Total no of pages that can be stored in flash */
>> + u32 max_entries;
>> + /** @total_pages: Total number of permanently offlined pages */
>> + u32 total_pages;
>> + /** @pages_returned: Number of pages returned in this response */
>> + u32 pages_returned;
>> + /** @page_addresses: Array of permanently offlined page
>> addresses (4KB aligned) */
>> + u64 page_addresses[XE_RAS_NUM_PAGES];
>> + /** @additional_data: Indicates if more data is available */
>> + u8 additional_data;
>> + /** @reserved: Reserved for future use */
>> + u8 reserved[3];
>> +} __packed;
>> +
>> +/**
>> + * struct xe_ras_page_offline_queue - Response from get offline
>> queue command
>> + */
>> +struct xe_ras_page_offline_queue {
>> + /** @total_pages: Total number of queued pages */
>> + u32 total_pages;
>> + /** @pages_returned: Number of pages returned in this response */
>> + u32 pages_returned;
>> + /** @page_addresses: Array of page addresses (4KB aligned) */
>> + u64 page_addresses[XE_RAS_NUM_PAGES];
>> + /** @additional_data: Indicates if more data is available */
>> + u8 additional_data;
>> + /** @reserved: Reserved for future use */
>> + u8 reserved[3];
>> +} __packed;
>> +
>> /**
>> * struct xe_ras_get_health_request - Request structure for
>> obtaining gpu health
>> */
>> diff --git a/drivers/gpu/drm/xe/xe_sysctrl_mailbox_types.h
>> b/drivers/gpu/drm/xe/xe_sysctrl_mailbox_types.h
>> index 590dd408399c..a96aeb11d061 100644
>> --- a/drivers/gpu/drm/xe/xe_sysctrl_mailbox_types.h
>> +++ b/drivers/gpu/drm/xe/xe_sysctrl_mailbox_types.h
>> @@ -29,6 +29,8 @@ enum xe_sysctrl_group {
>> * @XE_SYSCTRL_CMD_SET_THRESHOLD: Set error threshold
>> * @XE_SYSCTRL_CMD_GET_PENDING_EVENT: Retrieve pending event
>> * @XE_SYSCTRL_CMD_PAGE_OFFLINE: Instruct firmware to
>> offline/decline a page
>> + * @XE_SYSCTRL_CMD_GET_OFFLINE_LIST: Retrieve list of all offlined
>> pages from flash
>> + * @XE_SYSCTRL_CMD_GET_OFFLINE_QUEUE: Retrieve list of offlined
>> queued pages from firmware
>> * @XE_SYSCTRL_CMD_GET_HEALTH: Retrieve gpu health
>> * @XE_SYSCTRL_CMD_SET_HEALTH: Set gpu health
>> */
>> @@ -40,6 +42,8 @@ enum xe_sysctrl_gfsp_cmd {
>> XE_SYSCTRL_CMD_SET_THRESHOLD = 0x06,
>> XE_SYSCTRL_CMD_GET_PENDING_EVENT = 0x07,
>> XE_SYSCTRL_CMD_PAGE_OFFLINE = 0x08,
>> + XE_SYSCTRL_CMD_GET_OFFLINE_LIST = 0x09,
>> + XE_SYSCTRL_CMD_GET_OFFLINE_QUEUE = 0x0A,
>> XE_SYSCTRL_CMD_GET_HEALTH = 0x0B,
>> XE_SYSCTRL_CMD_SET_HEALTH = 0x0C,
>> };
>
next prev parent reply other threads:[~2026-09-11 6:12 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-07 9:47 [PATCH v2 0/6] Add support to handle memory double-bit ecc errors Riana Tauro
2026-09-07 9:47 ` [PATCH v2 1/6] drm/xe/xe_ras: Handle page offline requests for device memory " Riana Tauro
2026-09-07 10:14 ` sashiko-bot
2026-09-07 17:35 ` Ghimiray, Himal Prasad
2026-09-11 6:45 ` Tauro, Riana
2026-09-07 9:47 ` [PATCH v2 2/6] drm/xe/xe_ras: Add support to query page offline queue and list Riana Tauro
2026-09-07 10:00 ` sashiko-bot
2026-09-07 18:25 ` Ghimiray, Himal Prasad
2026-09-11 6:11 ` Tauro, Riana [this message]
2026-09-11 6:39 ` Ghimiray, Himal Prasad
2026-09-07 9:47 ` [PATCH v2 3/6] drm/xe: Separate drm-ras netlink data from device and firmware RAS state Riana Tauro
2026-09-07 19:04 ` Ghimiray, Himal Prasad
2026-09-07 19:21 ` Ghimiray, Himal Prasad
2026-09-09 5:43 ` Tauro, Riana
2026-09-07 9:47 ` [PATCH v2 4/6] drm/xe/xe_ras: Add function to get maximum pages firmware can store Riana Tauro
2026-09-07 19:21 ` Ghimiray, Himal Prasad
2026-09-07 19:24 ` Ghimiray, Himal Prasad
2026-09-09 5:23 ` Tauro, Riana
2026-09-07 9:47 ` [PATCH v2 5/6] drm/xe/xe_ttm_vram: Report max_pages reported by firmware in debugfs Riana Tauro
2026-09-07 19:26 ` Ghimiray, Himal Prasad
2026-09-07 9:47 ` [PATCH v2 6/6] drm/xe/xe_ras: Track offlined pages by firmware to avoid duplicates Riana Tauro
2026-09-07 10:02 ` sashiko-bot
2026-09-07 11:01 ` ✓ CI.KUnit: success for Add support to handle memory double-bit ecc errors (rev2) Patchwork
2026-09-07 11:45 ` ✓ Xe.CI.BAT: " Patchwork
2026-09-07 13:41 ` ✓ Xe.CI.FULL: " 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=57ba2a0a-a4eb-4e97-9fea-003cd494c9f2@intel.com \
--to=riana.tauro@intel.com \
--cc=anshuman.gupta@intel.com \
--cc=aravind.iddamsetty@linux.intel.com \
--cc=badal.nilawar@intel.com \
--cc=himal.prasad.ghimiray@intel.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=mallesh.koujalagi@intel.com \
--cc=raag.jadav@intel.com \
--cc=ravi.kishore.koppuravuri@intel.com \
--cc=rodrigo.vivi@intel.com \
--cc=soham.purkait@intel.com \
--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 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.