From: "Ghimiray, Himal Prasad" <himal.prasad.ghimiray@intel.com>
To: "Tauro, Riana" <riana.tauro@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 12:09:24 +0530 [thread overview]
Message-ID: <dec5d189-2c92-4e5f-bf24-4c1d907fcc7b@intel.com> (raw)
In-Reply-To: <57ba2a0a-a4eb-4e97-9fea-003cd494c9f2@intel.com>
On 11-09-2026 11:41, Tauro, Riana wrote:
>
> 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.
>
Look at below code snippet, if it makes sense to use it. Ignore it if
feels overkill.
/**
* struct xe_ras_pages_response - Common page-address response payload
*/
struct xe_ras_page_response {
/** @total_pages: Total number of 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_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;
/** @pages: Permanently offlined page-address payload */
struct xe_ras_pages_response pages;
} __packed;
#define xe_ras_page_offline_queue xe_ras_page_response
static int get_offline_pages(struct xe_device *xe, u32 cmd, bool
offline_pending, void *request, size_t req_size, u32 *req_index,
void *response, size_t resp_size, struct xe_ras_page_response *pages,
const char *print_str)
{
}
static void get_queued_pages(struct xe_device *xe)
{
struct xe_ras_pages_response response = {0};
get_offline_pages(xe, XE_SYSCTRL_CMD_GET_OFFLINE_QUEUE, true,
NULL, 0, NULL,
&response, sizeof(response), &response, "queue");
}
static void get_offlined_list(struct xe_device *xe)
{
struct xe_ras_offline_list_response response = {0};
struct xe_ras_offline_list_request request = {0};
struct xe_ras_state *state = &xe->ras.state;
if (!get_offline_pages(xe, XE_SYSCTRL_CMD_GET_OFFLINE_LIST, false,
&request, sizeof(request), &request.index,
&response, sizeof(response), &response.pages, "list") &&
!state->max_pages)
state->max_pages = response.max_entries;
}
> 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:39 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
2026-09-11 6:39 ` Ghimiray, Himal Prasad [this message]
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=dec5d189-2c92-4e5f-bf24-4c1d907fcc7b@intel.com \
--to=himal.prasad.ghimiray@intel.com \
--cc=anshuman.gupta@intel.com \
--cc=aravind.iddamsetty@linux.intel.com \
--cc=badal.nilawar@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=riana.tauro@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox