Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
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,
>>>   };
>>


  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