<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 19-10-2023 22:34, Welty, Brian
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:d1db0afd-0979-40c1-918e-955a7d658c0c@intel.com">
      <br>
      <br>
      On 10/19/2023 6:25 AM, Himal Prasad Ghimiray wrote:
      <br>
      <blockquote type="cite">Send uevent incase of nonfatal errors
        reported by gsc.
        <br>
        <br>
        TODO: Since XE_RESET_FAILED_UEVENT and XE_GSC_HW_HEALTH_UEVENT
        <br>
        both pass DEVICE_STATUS=NEEDS_RESET. Use same Uevent to
        determine
        <br>
        the RESET_REQUIRED and pass reasons for reset required as
        additional
        <br>
        info.
        <br>
        <br>
        v2
        <br>
        - No need to provide tile info in uevent because error is
        <br>
        accepted only in tile0. (Aravind)
        <br>
        <br>
        v3
        <br>
        - Use pci node to send uevent.
        <br>
        - Pass RESET_REASON for uevent.
        <br>
      </blockquote>
      <br>
      Can we go a step farther as Aravind was saying and just have one
      single uevent?  Or maybe you have one uevent now, but can still
      consolidate a bit more.
      <br>
      So replace XE_GSC_HW_HEALTH_UEVENT and XE_RESET_FAILED_UEVENT with
      one uevent, defined in uapi header with:
      <br>
      <br>
      #define XE_RESET_REQUIRED_UEVENT        "RESET_REQUIRED"
      <br>
      #define XE_RESET_REQUIRED_UEVENT_REASON_CSC   
      "REASON=CSC_HW_ERROR"
      <br>
      #define XE_RESET_REQUIRED_UEVENT_REASON_GT   
      "REASON=GT_RESET_FAILED"
      <br>
    </blockquote>
    <p>Hi Brian,</p>
    <p>While implementing XE_RESET_FAILED_UEVENT, the recommendation was
      to use <span><span class="ui-provider ec bav baw bax bay baz bba bbb bbc bbd bbe bbf bbg bbh bbi bbj bbk bbl bbm bbn bbo bbp bbq bbr bbs bbt bbu bbv bbw bbx bby bbz bca bcb bcc" dir="ltr"><br>
        </span></span></p>
    <p><span><span class="ui-provider ec bav baw bax bay baz bba bbb bbc bbd bbe bbf bbg bbh bbi bbj bbk bbl bbm bbn bbo bbp bbq bbr bbs bbt bbu bbv bbw bbx bby bbz bca bcb bcc" dir="ltr">"DEVICE_STATUS=NEEDS_RESET" instead of  </span></span>"RESET_REQUIRED.</p>
    <p>Will be proceeding with:</p>
    <p>#define XE_RESET_REQUIRED_UEVENT        "<span><span class="ui-provider ec bav baw bax bay baz bba bbb bbc bbd bbe bbf bbg bbh bbi bbj bbk bbl bbm bbn bbo bbp bbq bbr bbs bbt bbu bbv bbw bbx bby bbz bca bcb bcc" dir="ltr">DEVICE_STATUS=NEEDS_RESET</span></span>"
      <br>
      #define XE_RESET_REQUIRED_UEVENT_REASON_CSC   
      "REASON=CSC_HW_ERROR"
      <br>
      #define XE_RESET_REQUIRED_UEVENT_REASON_GT   
      "REASON=GT_RESET_FAILED" <br>
    </p>
    <p>Thanks for the review comments, will be updating it in next
      patch.<br>
    </p>
    <p>BR<br>
      Himal <br>
    </p>
    <blockquote type="cite" cite="mid:d1db0afd-0979-40c1-918e-955a7d658c0c@intel.com">
      <br>
      Would above work?
      <br>
      -Brian
      <br>
      <br>
      <br>
      <blockquote type="cite">
        <br>
        Cc: Aravind Iddamsetty
        <a class="moz-txt-link-rfc2396E" href="mailto:aravind.iddamsetty@linux.intel.com"><aravind.iddamsetty@linux.intel.com></a>
        <br>
        Cc: Brian Welty <a class="moz-txt-link-rfc2396E" href="mailto:brian.welty@intel.com"><brian.welty@intel.com></a>
        <br>
        Signed-off-by: Himal Prasad Ghimiray
        <a class="moz-txt-link-rfc2396E" href="mailto:himal.prasad.ghimiray@intel.com"><himal.prasad.ghimiray@intel.com></a>
        <br>
        ---
        <br>
          drivers/gpu/drm/xe/xe_device_types.h |  3 +++
        <br>
          drivers/gpu/drm/xe/xe_hw_error.c     | 17 +++++++++++++++++
        <br>
          drivers/gpu/drm/xe/xe_hw_error.h     |  3 ++-
        <br>
          drivers/gpu/drm/xe/xe_irq.c          |  4 ++++
        <br>
          include/uapi/drm/xe_drm.h            |  9 +++++++++
        <br>
          5 files changed, 35 insertions(+), 1 deletion(-)
        <br>
        <br>
        diff --git a/drivers/gpu/drm/xe/xe_device_types.h
        b/drivers/gpu/drm/xe/xe_device_types.h
        <br>
        index 3b371e0f6168..bc7b545ce37b 100644
        <br>
        --- a/drivers/gpu/drm/xe/xe_device_types.h
        <br>
        +++ b/drivers/gpu/drm/xe/xe_device_types.h
        <br>
        @@ -196,6 +196,9 @@ struct xe_tile {
        <br>
              struct tile_hw_errors {
        <br>
                  struct xarray hw_error;
        <br>
              } errors;
        <br>
        +
        <br>
        +    /** @gsc_hw_err_work: worker for uevent to report GSC HW
        errors */
        <br>
        +    struct work_struct gsc_hw_err_work;
        <br>
          };
        <br>
            /**
        <br>
        diff --git a/drivers/gpu/drm/xe/xe_hw_error.c
        b/drivers/gpu/drm/xe/xe_hw_error.c
        <br>
        index 84533ef6a51e..644e63d4d717 100644
        <br>
        --- a/drivers/gpu/drm/xe/xe_hw_error.c
        <br>
        +++ b/drivers/gpu/drm/xe/xe_hw_error.c
        <br>
        @@ -3,6 +3,8 @@
        <br>
           * Copyright © 2023 Intel Corporation
        <br>
           */
        <br>
          +#include <drm/xe_drm.h>
        <br>
        +
        <br>
          #include "xe_hw_error.h"
        <br>
            #include "regs/xe_regs.h"
        <br>
        @@ -378,6 +380,20 @@ xe_gt_hw_error_handler(struct xe_gt *gt,
        const enum hardware_error hw_err)
        <br>
                  xe_gt_hw_error_log_vector_reg(gt, hw_err);
        <br>
          }
        <br>
          +void xe_gsc_hw_error_work(struct work_struct *work)
        <br>
        +{
        <br>
        +    struct xe_tile *tile = container_of(work, typeof(*tile),
        gsc_hw_err_work);
        <br>
        +    struct pci_dev *pdev =
        to_pci_dev(tile_to_xe(tile)->drm.dev);
        <br>
        +    char *csc_hw_error_event[3];
        <br>
        +
        <br>
        +    csc_hw_error_event[0] = XE_GSC_HW_HEALTH_UEVENT "=1";
        <br>
        +    csc_hw_error_event[1] = "RESET_REASON=CSC_HW_ERROR";
        <br>
        +    csc_hw_error_event[2] = NULL;
        <br>
        +
        <br>
        +    kobject_uevent_env(&pdev->dev.kobj, KOBJ_CHANGE,
        <br>
        +               csc_hw_error_event);
        <br>
        +}
        <br>
        +
        <br>
          static void
        <br>
          xe_gsc_hw_error_handler(struct xe_tile *tile, const enum
        hardware_error hw_err)
        <br>
          {
        <br>
        @@ -435,6 +451,7 @@ xe_gsc_hw_error_handler(struct xe_tile
        *tile, const enum hardware_error hw_err)
        <br>
                      drm_err_ratelimited(&tile_to_xe(tile)->drm,
        HW_ERR
        <br>
                                  "Tile0 reported GSC %s %s error,
        bit[%d] is set\n",
        <br>
                                  name, hw_err_str, errbit);
        <br>
        +            schedule_work(&tile->gsc_hw_err_work);
        <br>
                  }
        <br>
                  if (indx != XE_HW_ERR_TILE_UNSPEC)
        <br>
                     
        xe_update_hw_error_cnt(&tile_to_xe(tile)->drm,
        <br>
        diff --git a/drivers/gpu/drm/xe/xe_hw_error.h
        b/drivers/gpu/drm/xe/xe_hw_error.h
        <br>
        index 997747b6b603..3c02fbd3b256 100644
        <br>
        --- a/drivers/gpu/drm/xe/xe_hw_error.h
        <br>
        +++ b/drivers/gpu/drm/xe/xe_hw_error.h
        <br>
        @@ -7,6 +7,7 @@
        <br>
            #include <linux/stddef.h>
        <br>
          #include <linux/types.h>
        <br>
        +#include <linux/workqueue.h>
        <br>
            #define XE_RAS_REG_SIZE 32
        <br>
          @@ -106,5 +107,5 @@ struct xe_tile;
        <br>
          void xe_hw_error_irq_handler(struct xe_tile *tile, const u32
        master_ctl);
        <br>
          void xe_assign_hw_err_regs(struct xe_device *xe);
        <br>
          void xe_process_hw_errors(struct xe_device *xe);
        <br>
        -
        <br>
        +void xe_gsc_hw_error_work(struct work_struct *work);
        <br>
          #endif
        <br>
        diff --git a/drivers/gpu/drm/xe/xe_irq.c
        b/drivers/gpu/drm/xe/xe_irq.c
        <br>
        index 8365a4cb0c45..bc0f01a2abc1 100644
        <br>
        --- a/drivers/gpu/drm/xe/xe_irq.c
        <br>
        +++ b/drivers/gpu/drm/xe/xe_irq.c
        <br>
        @@ -614,6 +614,10 @@ int xe_irq_install(struct xe_device *xe)
        <br>
              irq_handler_t irq_handler;
        <br>
              int err, irq;
        <br>
          +    struct xe_tile *tile = xe_device_get_root_tile(xe);
        <br>
        +
        <br>
        +    INIT_WORK(&tile->gsc_hw_err_work,
        xe_gsc_hw_error_work);
        <br>
        +
        <br>
              irq_handler = xe_irq_handler(xe);
        <br>
              if (!irq_handler) {
        <br>
                  drm_err(&xe->drm, "No supported interrupt
        handler");
        <br>
        diff --git a/include/uapi/drm/xe_drm.h
        b/include/uapi/drm/xe_drm.h
        <br>
        index 24bf8f0f52e8..4e5e57bc9f69 100644
        <br>
        --- a/include/uapi/drm/xe_drm.h
        <br>
        +++ b/include/uapi/drm/xe_drm.h
        <br>
        @@ -16,6 +16,15 @@ extern "C" {
        <br>
           * subject to backwards-compatibility constraints.
        <br>
           */
        <br>
          +/**
        <br>
        + * DOC: uevent generated by xe on it's pci node.
        <br>
        + *
        <br>
        + * XE_GSC_HW_HEALTH_UEVENT - Event is generated when GSC
        reports HW
        <br>
        + * errors. The value supplied with the event is always
        "NEEDS_RESET"
        <br>
        + * Additional information supplied is
        "RESET_REASON=CSC_HW_ERROR".
        <br>
        + */
        <br>
        +#define XE_GSC_HW_HEALTH_UEVENT "DEVICE_STATUS"
        <br>
        +
        <br>
          /**
        <br>
           * DOC: uevent generated by xe on it's pci node.
        <br>
           *
        <br>
      </blockquote>
    </blockquote>
  </body>
</html>