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