<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<p style="font-family:Arial;font-size:10pt;color:#0078D7;margin:15pt;" align="Left">
[AMD Official Use Only - Internal Distribution Only]<br>
</p>
<br>
<div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div>
<div id="appendonsend"></div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> Alex Deucher <alexdeucher@gmail.com><br>
<b>Sent:</b> Tuesday, March 17, 2020 3:03 PM<br>
<b>To:</b> Lin, Amber <Amber.Lin@amd.com><br>
<b>Cc:</b> amd-gfx list <amd-gfx@lists.freedesktop.org><br>
<b>Subject:</b> Re: [PATCH] drm/amdkfd: Provide SMI events watch</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt">
<div class="PlainText">On Tue, Mar 17, 2020 at 1:57 PM Amber Lin <Amber.Lin@amd.com> wrote:<br>
><br>
> When the compute is malfunctioning or performance drops, the system admin<br>
> will use SMI (System Management Interface) tool to monitor/diagnostic what<br>
> went wrong. This patch provides an event watch interface for the user<br>
> space to register events they are interested. After the event is<br>
> registered, the user can use annoymous file descriptor's pull function<br>
> with wait-time specified to wait for the event to happen. Once the event<br>
> happens, the user can use read() to retrieve information related to the<br>
> event.<br>
><br>
> VM fault event is done in this patch.<br>
><br>
> Signed-off-by: Amber Lin <Amber.Lin@amd.com><br>
<br>
Can you provide a link to the userspace tools that make use of this interface?<br>
<br>
Thanks,<br>
<br>
Alex<br>
=====</div>
<div class="PlainText">Hi Alex,</div>
<div class="PlainText"><span><br>
</span><span></span><span>https://github.com/RadeonOpenCompute/rocm_smi_lib will use this interface. Those functions will be added to this library:<br>
</span>
<div><br>
</div>
<div>/* Get a handler for watching events */<br>
</div>
<div>rsmi_status_t rsmi_event_init(rsmi_event_handle_t *handle);<br>
</div>
<div>/* Register events for the device using the handler from init */<br>
</div>
<div>rsmi_status_t rsmi_event_register(uint32_t dv_ind, uint32_t events,<br>
</div>
<div>                                rsmi_event_handle_t *handle);<br>
</div>
<div>/* Wait for events. If one of the events happens, a success is returned with<br>
</div>
<div> * with details in data.<br>
</div>
<div> */<br>
</div>
<div>rsmi_status_t rsmi_event_wait(rsmi_event_handle_t handle, uint32_t timeout_ms,<br>
</div>
<div>                                rsmi_event_data_t *data);<br>
</div>
<div>/* Stop watching events */<br>
</div>
<div>rsmi_status_t rsmi_event_free(rsmi_event_handle_t handle);<br>
</div>
<div><br>
</div>
<span></span>Regards,</div>
<div class="PlainText">Amber</div>
<div class="PlainText"><br>
> ---<br>
>  drivers/gpu/drm/amd/amdkfd/Makefile              |   3 +-<br>
>  drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c |   2 +<br>
>  drivers/gpu/drm/amd/amdkfd/kfd_chardev.c         |  38 ++++++<br>
>  drivers/gpu/drm/amd/amdkfd/kfd_device.c          |   1 +<br>
>  drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c  |   2 +<br>
>  drivers/gpu/drm/amd/amdkfd/kfd_priv.h            |  10 ++<br>
>  drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c      | 143 +++++++++++++++++++++++<br>
>  drivers/gpu/drm/amd/amdkfd/kfd_smi_events.h      |  41 +++++++<br>
>  include/uapi/linux/kfd_ioctl.h                   |  27 ++++-<br>
>  9 files changed, 265 insertions(+), 2 deletions(-)<br>
>  create mode 100644 drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c<br>
>  create mode 100644 drivers/gpu/drm/amd/amdkfd/kfd_smi_events.h<br>
><br>
> diff --git a/drivers/gpu/drm/amd/amdkfd/Makefile b/drivers/gpu/drm/amd/amdkfd/Makefile<br>
> index 6147462..cc98b4a 100644<br>
> --- a/drivers/gpu/drm/amd/amdkfd/Makefile<br>
> +++ b/drivers/gpu/drm/amd/amdkfd/Makefile<br>
> @@ -53,7 +53,8 @@ AMDKFD_FILES  := $(AMDKFD_PATH)/kfd_module.o \<br>
>                 $(AMDKFD_PATH)/kfd_int_process_v9.o \<br>
>                 $(AMDKFD_PATH)/kfd_dbgdev.o \<br>
>                 $(AMDKFD_PATH)/kfd_dbgmgr.o \<br>
> -               $(AMDKFD_PATH)/kfd_crat.o<br>
> +               $(AMDKFD_PATH)/kfd_crat.o \<br>
> +               $(AMDKFD_PATH)/kfd_smi_events.o<br>
><br>
>  ifneq ($(CONFIG_AMD_IOMMU_V2),)<br>
>  AMDKFD_FILES += $(AMDKFD_PATH)/kfd_iommu.o<br>
> diff --git a/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c b/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c<br>
> index 9f59ba9..24b4717 100644<br>
> --- a/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c<br>
> +++ b/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c<br>
> @@ -24,6 +24,7 @@<br>
>  #include "kfd_events.h"<br>
>  #include "cik_int.h"<br>
>  #include "amdgpu_amdkfd.h"<br>
> +#include "kfd_smi_events.h"<br>
><br>
>  static bool cik_event_interrupt_isr(struct kfd_dev *dev,<br>
>                                         const uint32_t *ih_ring_entry,<br>
> @@ -107,6 +108,7 @@ static void cik_event_interrupt_wq(struct kfd_dev *dev,<br>
>                 ihre->source_id == CIK_INTSRC_GFX_MEM_PROT_FAULT) {<br>
>                 struct kfd_vm_fault_info info;<br>
><br>
> +               kfd_smi_event_update_vmfault(dev, pasid);<br>
>                 kfd_process_vm_fault(dev->dqm, pasid);<br>
><br>
>                 memset(&info, 0, sizeof(info));<br>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c<br>
> index f8fa03a..8e92956 100644<br>
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c<br>
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c<br>
> @@ -39,6 +39,7 @@<br>
>  #include "kfd_device_queue_manager.h"<br>
>  #include "kfd_dbgmgr.h"<br>
>  #include "amdgpu_amdkfd.h"<br>
> +#include "kfd_smi_events.h"<br>
><br>
>  static long kfd_ioctl(struct file *, unsigned int, unsigned long);<br>
>  static int kfd_open(struct inode *, struct file *);<br>
> @@ -1243,6 +1244,40 @@ static int kfd_ioctl_acquire_vm(struct file *filep, struct kfd_process *p,<br>
>         return ret;<br>
>  }<br>
><br>
> +/* Handle requests for watching SMI events */<br>
> +static int kfd_ioctl_smi_events(struct file *filep,<br>
> +                               struct kfd_process *p, void *data)<br>
> +{<br>
> +       struct kfd_ioctl_smi_events_args *args = data;<br>
> +       struct kfd_dev *dev;<br>
> +       int ret = 0;<br>
> +<br>
> +       dev = kfd_device_by_id(args->gpu_id);<br>
> +       if (!dev)<br>
> +               return -EINVAL;<br>
> +<br>
> +       switch (args->op) {<br>
> +       case KFD_SMI_EVENTS_REGISTER:<br>
> +               ret = kfd_smi_event_register(dev, args->events);<br>
> +               if (ret >= 0) {<br>
> +                       /* When the registration is successful, it returns the<br>
> +                        * annoymous inode. Pass it to the user in data1<br>
> +                        */<br>
> +                       args->data1 = ret;<br>
> +                       ret = 0;<br>
> +               }<br>
> +               break;<br>
> +       case KFD_SMI_EVENTS_UNREGISTER:<br>
> +               kfd_smi_event_unregister(dev, args->events);<br>
> +               break;<br>
> +       default:<br>
> +               ret = -EINVAL;<br>
> +               break;<br>
> +       }<br>
> +<br>
> +       return ret;<br>
> +}<br>
> +<br>
>  bool kfd_dev_is_large_bar(struct kfd_dev *dev)<br>
>  {<br>
>         struct kfd_local_mem_info mem_info;<br>
> @@ -1827,6 +1862,9 @@ static const struct amdkfd_ioctl_desc amdkfd_ioctls[] = {<br>
><br>
>         AMDKFD_IOCTL_DEF(AMDKFD_IOC_ALLOC_QUEUE_GWS,<br>
>                         kfd_ioctl_alloc_queue_gws, 0),<br>
> +<br>
> +       AMDKFD_IOCTL_DEF(AMDKFD_IOC_SMI_EVENTS,<br>
> +                       kfd_ioctl_smi_events, 0),<br>
>  };<br>
><br>
>  #define AMDKFD_CORE_IOCTL_COUNT        ARRAY_SIZE(amdkfd_ioctls)<br>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c<br>
> index 7866cd06..450368c 100644<br>
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c<br>
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c<br>
> @@ -532,6 +532,7 @@ struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd,<br>
>         kfd->device_info = device_info;<br>
>         kfd->pdev = pdev;<br>
>         kfd->init_complete = false;<br>
> +       kfd->smi_events.events = 0;<br>
>         kfd->kfd2kgd = f2g;<br>
>         atomic_set(&kfd->compute_profile, 0);<br>
><br>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c<br>
> index e05d75e..151e83e 100644<br>
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c<br>
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c<br>
> @@ -24,6 +24,7 @@<br>
>  #include "kfd_events.h"<br>
>  #include "soc15_int.h"<br>
>  #include "kfd_device_queue_manager.h"<br>
> +#include "kfd_smi_events.h"<br>
><br>
>  static bool event_interrupt_isr_v9(struct kfd_dev *dev,<br>
>                                         const uint32_t *ih_ring_entry,<br>
> @@ -117,6 +118,7 @@ static void event_interrupt_wq_v9(struct kfd_dev *dev,<br>
>                 info.prot_read  = ring_id & 0x10;<br>
>                 info.prot_write = ring_id & 0x20;<br>
><br>
> +               kfd_smi_event_update_vmfault(dev, pasid);<br>
>                 kfd_process_vm_fault(dev->dqm, pasid);<br>
>                 kfd_signal_vm_fault_event(dev, pasid, &info);<br>
>         }<br>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h<br>
> index 43b888b..fdb51de 100644<br>
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h<br>
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h<br>
> @@ -223,6 +223,13 @@ struct kfd_vmid_info {<br>
>         uint32_t vmid_num_kfd;<br>
>  };<br>
><br>
> +struct kfd_smi_events {<br>
> +       uint64_t events;<br>
> +       struct kfifo fifo;<br>
> +       wait_queue_head_t wait_queue;<br>
> +       uint32_t max_events;<br>
> +};<br>
> +<br>
>  struct kfd_dev {<br>
>         struct kgd_dev *kgd;<br>
><br>
> @@ -309,6 +316,9 @@ struct kfd_dev {<br>
><br>
>         /* Global GWS resource shared b/t processes*/<br>
>         void *gws;<br>
> +<br>
> +       /* if this device is in SMI events watch */<br>
> +       struct kfd_smi_events smi_events;<br>
>  };<br>
><br>
>  enum kfd_mempool {<br>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c<br>
> new file mode 100644<br>
> index 0000000..ba9d036<br>
> --- /dev/null<br>
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c<br>
> @@ -0,0 +1,143 @@<br>
> +/*<br>
> + * Copyright 2020 Advanced Micro Devices, Inc.<br>
> + *<br>
> + * Permission is hereby granted, free of charge, to any person obtaining a<br>
> + * copy of this software and associated documentation files (the "Software"),<br>
> + * to deal in the Software without restriction, including without limitation<br>
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
> + * and/or sell copies of the Software, and to permit persons to whom the<br>
> + * Software is furnished to do so, subject to the following conditions:<br>
> + *<br>
> + * The above copyright notice and this permission notice shall be included in<br>
> + * all copies or substantial portions of the Software.<br>
> + *<br>
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR<br>
> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,<br>
> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR<br>
> + * OTHER DEALINGS IN THE SOFTWARE.<br>
> + */<br>
> +<br>
> +#include <linux/poll.h><br>
> +#include <linux/wait.h><br>
> +#include <linux/anon_inodes.h><br>
> +#include <uapi/linux/kfd_ioctl.h><br>
> +#include "amdgpu_vm.h"<br>
> +#include "kfd_priv.h"<br>
> +#include "kfd_smi_events.h"<br>
> +<br>
> +static DEFINE_MUTEX(kfd_smi_mutex);<br>
> +<br>
> +struct mutex *kfd_get_smi_mutex(void)<br>
> +{<br>
> +       return &kfd_smi_mutex;<br>
> +}<br>
> +<br>
> +static __poll_t kfd_smi_ev_poll(struct file *, struct poll_table_struct *);<br>
> +static ssize_t kfd_smi_ev_read(struct file *, char __user *, size_t, loff_t *);<br>
> +static int kfd_smi_ev_release(struct inode *, struct file *);<br>
> +<br>
> +static const char kfd_smi_name[] = "kfd_smi_ev";<br>
> +<br>
> +static const struct file_operations kfd_smi_ev_fops = {<br>
> +       .owner = THIS_MODULE,<br>
> +       .poll = kfd_smi_ev_poll,<br>
> +       .read = kfd_smi_ev_read,<br>
> +       .release = kfd_smi_ev_release<br>
> +};<br>
> +<br>
> +static __poll_t kfd_smi_ev_poll(struct file *filep,<br>
> +                               struct poll_table_struct *wait)<br>
> +{<br>
> +       struct kfd_dev *dev = filep->private_data;<br>
> +       struct kfd_smi_events *ev = &dev->smi_events;<br>
> +<br>
> +       __poll_t mask = 0;<br>
> +<br>
> +       poll_wait(filep, &ev->wait_queue, wait);<br>
> +       mask |= !kfifo_is_empty(&ev->fifo) ? POLLIN | POLLRDNORM : mask;<br>
> +<br>
> +       return mask;<br>
> +}<br>
> +<br>
> +static ssize_t kfd_smi_ev_read(struct file *filep, char __user *user,<br>
> +                              size_t size, loff_t *offset)<br>
> +{<br>
> +       int ret, copied = 0;<br>
> +       struct kfd_dev *dev = filep->private_data;<br>
> +<br>
> +       ret = kfifo_to_user(&dev->smi_events.fifo, user, size, &copied);<br>
> +       if (ret || !copied) {<br>
> +               pr_debug("kfd smi-events: Fail to read fd (%i) (%i)\n",<br>
> +                               ret, copied);<br>
> +               return ret ? ret : -EAGAIN;<br>
> +       }<br>
> +<br>
> +       return copied;<br>
> +}<br>
> +<br>
> +static int kfd_smi_ev_release(struct inode *inode, struct file *filep)<br>
> +{<br>
> +       struct kfd_dev *dev = filep->private_data;<br>
> +<br>
> +       kfifo_free(&dev->smi_events.fifo);<br>
> +       return 0;<br>
> +}<br>
> +<br>
> +void kfd_smi_event_update_vmfault(struct kfd_dev *kdev, uint16_t pasid)<br>
> +{<br>
> +       struct kfd_smi_vmfault_fifo fifo_out;<br>
> +       struct amdgpu_device *adev = (struct amdgpu_device *)kdev->kgd;<br>
> +       struct amdgpu_task_info task_info;<br>
> +<br>
> +       if (!kdev->smi_events.events)<br>
> +               return;<br>
> +<br>
> +       if (!(kdev->smi_events.events & KFD_SMI_EV_VMFAULT))<br>
> +               return;<br>
> +<br>
> +       memset(&task_info, 0, sizeof(struct amdgpu_task_info));<br>
> +       amdgpu_vm_get_task_info(adev, pasid, &task_info);<br>
> +<br>
> +       fifo_out.group = 0;<br>
> +       fifo_out.event = KFD_SMI_EV_VMFAULT;<br>
> +       fifo_out.gpu_id = kdev->id;<br>
> +       fifo_out.pid = task_info.pid;<br>
> +       strcpy(fifo_out.task_name, task_info.task_name);<br>
> +       kfifo_in(&kdev->smi_events.fifo, &fifo_out, sizeof(fifo_out));<br>
> +       wake_up_all(&kdev->smi_events.wait_queue);<br>
> +}<br>
> +<br>
> +void kfd_smi_event_unregister(struct kfd_dev *dev, uint64_t events)<br>
> +{<br>
> +       mutex_lock(kfd_get_smi_mutex());<br>
> +       dev->smi_events.events &= ~events;<br>
> +       mutex_unlock(kfd_get_smi_mutex());<br>
> +}<br>
> +<br>
> +int kfd_smi_event_register(struct kfd_dev *dev, uint64_t events)<br>
> +{<br>
> +       int ret;<br>
> +<br>
> +       mutex_lock(kfd_get_smi_mutex());<br>
> +       dev->smi_events.events |= events;<br>
> +       mutex_unlock(kfd_get_smi_mutex());<br>
> +<br>
> +       /* We use the lower 32 bits for now. Each bit represents one event. If<br>
> +        * featured events are increased to more than 32, we'll use the upper<br>
> +        * bits as groups so the total number of events can be up to 32*32.<br>
> +        */<br>
> +       dev->smi_events.max_events = 32;<br>
> +       ret = kfifo_alloc(&dev->smi_events.fifo, dev->smi_events.max_events,<br>
> +                        GFP_KERNEL);<br>
> +       if (ret) {<br>
> +               pr_err("fail to allocate kfifo\n");<br>
> +               return ret;<br>
> +       }<br>
> +       init_waitqueue_head(&dev->smi_events.wait_queue);<br>
> +<br>
> +       return anon_inode_getfd(kfd_smi_name, &kfd_smi_ev_fops,<br>
> +                               (void *)dev, 0);<br>
> +}<br>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.h b/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.h<br>
> new file mode 100644<br>
> index 0000000..2e320d3<br>
> --- /dev/null<br>
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.h<br>
> @@ -0,0 +1,41 @@<br>
> +/*<br>
> + * Copyright 2020 Advanced Micro Devices, Inc.<br>
> + *<br>
> + * Permission is hereby granted, free of charge, to any person obtaining a<br>
> + * copy of this software and associated documentation files (the "Software"),<br>
> + * to deal in the Software without restriction, including without limitation<br>
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
> + * and/or sell copies of the Software, and to permit persons to whom the<br>
> + * Software is furnished to do so, subject to the following conditions:<br>
> + *<br>
> + * The above copyright notice and this permission notice shall be included in<br>
> + * all copies or substantial portions of the Software.<br>
> + *<br>
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR<br>
> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,<br>
> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR<br>
> + * OTHER DEALINGS IN THE SOFTWARE.<br>
> + */<br>
> +<br>
> +#ifndef KFD_SMI_EVENTS_H_INCLUDED<br>
> +#define KFD_SMI_EVENTS_H_INCLUDED<br>
> +<br>
> +int kfd_smi_event_register(struct kfd_dev *dev, uint64_t events);<br>
> +void kfd_smi_event_unregister(struct kfd_dev *dev, uint64_t events);<br>
> +void kfd_smi_event_update_vmfault(struct kfd_dev *dev, uint16_t pasid);<br>
> +<br>
> +/* All FIFO must start with "uint32_t group" and "uint32_t event" so the user<br>
> + * can read the first 8 bytes to determine the next read length.<br>
> + */<br>
> +struct kfd_smi_vmfault_fifo {<br>
> +       uint32_t group;<br>
> +       uint32_t event;<br>
> +       unsigned int gpu_id;<br>
> +       pid_t pid;<br>
> +       char task_name[TASK_COMM_LEN];<br>
> +};<br>
> +<br>
> +#endif<br>
> diff --git a/include/uapi/linux/kfd_ioctl.h b/include/uapi/linux/kfd_ioctl.h<br>
> index 4f66764..6ce7c69 100644<br>
> --- a/include/uapi/linux/kfd_ioctl.h<br>
> +++ b/include/uapi/linux/kfd_ioctl.h<br>
> @@ -442,6 +442,28 @@ struct kfd_ioctl_import_dmabuf_args {<br>
>         __u32 dmabuf_fd;        /* to KFD */<br>
>  };<br>
><br>
> +/*<br>
> + * KFD SMI(System Management Interface) events<br>
> + */<br>
> +enum kfd_smi_events_op {<br>
> +       KFD_SMI_EVENTS_REGISTER = 1,<br>
> +       KFD_SMI_EVENTS_UNREGISTER<br>
> +};<br>
> +<br>
> +/* Event ID (mask) */<br>
> +#define KFD_SMI_EV_VMFAULT     0x00000001<br>
> +<br>
> +struct kfd_ioctl_smi_events_args {<br>
> +       __u32 op;       /* to KFD */<br>
> +       /* upper 32 bits: group. lower 32 bits: event IDs */<br>
> +       __u64 events;   /* to KFD */<br>
> +       __u32 gpu_id;   /* to KFD */<br>
> +       pid_t pid;      /* to KFD */<br>
> +       __u32 data1;    /* from KFD */<br>
> +       __u32 data2;<br>
> +       __u32 data3;<br>
> +};<br>
> +<br>
>  /* Register offset inside the remapped mmio page<br>
>   */<br>
>  enum kfd_mmio_remap {<br>
> @@ -546,7 +568,10 @@ enum kfd_mmio_remap {<br>
>  #define AMDKFD_IOC_ALLOC_QUEUE_GWS             \<br>
>                 AMDKFD_IOWR(0x1E, struct kfd_ioctl_alloc_queue_gws_args)<br>
><br>
> +#define AMDKFD_IOC_SMI_EVENTS                  \<br>
> +               AMDKFD_IOWR(0x1F, struct kfd_ioctl_smi_events_args)<br>
> +<br>
>  #define AMDKFD_COMMAND_START           0x01<br>
> -#define AMDKFD_COMMAND_END             0x1F<br>
> +#define AMDKFD_COMMAND_END             0x20<br>
><br>
>  #endif<br>
> --<br>
> 2.7.4<br>
><br>
> _______________________________________________<br>
> amd-gfx mailing list<br>
> amd-gfx@lists.freedesktop.org<br>
> <a href="https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Famd-gfx&amp;data=02%7C01%7CAmber.Lin%40amd.com%7C2f64059b66554d40898208d7caa5e374%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637200686149934820&amp;sdata=vBpnnq1xhSxEMjEWffwSLVIcSymSemDQTiEoYXj5lEE%3D&amp;reserved=0">
https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Famd-gfx&amp;data=02%7C01%7CAmber.Lin%40amd.com%7C2f64059b66554d40898208d7caa5e374%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637200686149934820&amp;sdata=vBpnnq1xhSxEMjEWffwSLVIcSymSemDQTiEoYXj5lEE%3D&amp;reserved=0</a><br>
</div>
</span></font></div>
</div>
</div>
</body>
</html>