On Wed, Feb 11, 2026 at 11:45 AM James Zhu <[email protected]> wrote: > > Hi Alex, > > Thanks! Answer in line. > > Best Regards! > > James Zhu > > On 2026-02-11 10:26, Alex Deucher wrote: > > On Thu, Jan 22, 2026 at 10:22 AM James Zhu <[email protected]> wrote: > >> to support PMC, PCSampling, SPM etc. > >> > >> Signed-off-by: James Zhu <[email protected]> > >> --- > >> amdgpu/amdgpu.h | 8 +++++++ > >> amdgpu/amdgpu_profiler.c | 46 ++++++++++++++++++++++++++++++++++++++++ > >> amdgpu/meson.build | 2 +- > >> include/drm/amdgpu_drm.h | 19 +++++++++++++++++ > >> 4 files changed, 74 insertions(+), 1 deletion(-) > >> create mode 100644 amdgpu/amdgpu_profiler.c > >> > >> diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h > >> index 39b61539..87eec030 100644 > >> --- a/amdgpu/amdgpu.h > >> +++ b/amdgpu/amdgpu.h > >> @@ -2072,6 +2072,14 @@ int amdgpu_userq_signal(amdgpu_device_handle dev, > >> int amdgpu_userq_wait(amdgpu_device_handle dev, > >> struct drm_amdgpu_userq_wait *wait_data); > >> > >> +/** > >> + * Acquire profiler version > >> + * \param dev - \c [in] device handle > >> + * > >> + * \return 0 on success otherwise POSIX Error code > >> + */ > >> +int amdgpu_profiler_version(amdgpu_device_handle dev); > >> + > >> #ifdef __cplusplus > >> } > >> #endif > >> diff --git a/amdgpu/amdgpu_profiler.c b/amdgpu/amdgpu_profiler.c > >> new file mode 100644 > >> index 00000000..8d4dffe4 > >> --- /dev/null > >> +++ b/amdgpu/amdgpu_profiler.c > >> @@ -0,0 +1,46 @@ > >> +/* > >> + * Copyright 2026 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 <string.h> > >> +#include <errno.h> > >> +#include "xf86drm.h" > >> +#include "amdgpu_drm.h" > >> +#include "amdgpu_internal.h" > >> + > >> +drm_public int > >> +amdgpu_profiler_version(amdgpu_device_handle dev) > >> +{ > >> + int ret; > >> + struct drm_amdgpu_profiler_args user_arg; > >> + > >> + if (!dev) > >> + return -EINVAL; > >> + > >> + memset(&user_arg, 0, sizeof(user_arg)); > >> + user_arg.op = AMDGPU_PROFILER_VERSION; > >> + > >> + ret = drmCommandWriteRead(dev->fd, DRM_AMDGPU_PROFILER, > >> + &user_arg, sizeof(user_arg)); > >> + > >> + return ret; > >> +} > >> diff --git a/amdgpu/meson.build b/amdgpu/meson.build > >> index 3962d32c..d781f2e9 100644 > >> --- a/amdgpu/meson.build > >> +++ b/amdgpu/meson.build > >> @@ -27,7 +27,7 @@ libdrm_amdgpu = library( > >> files( > >> 'amdgpu_asic_id.c', 'amdgpu_bo.c', 'amdgpu_cs.c', > >> 'amdgpu_device.c', > >> 'amdgpu_gpu_info.c', 'amdgpu_vamgr.c', 'amdgpu_vm.c', > >> 'handle_table.c', > >> - 'amdgpu_userq.c', > >> + 'amdgpu_userq.c', 'amdgpu_profiler.c', > >> ), > >> config_file, > >> ], > >> diff --git a/include/drm/amdgpu_drm.h b/include/drm/amdgpu_drm.h > >> index 947bf261..107d2b69 100644 > >> --- a/include/drm/amdgpu_drm.h > >> +++ b/include/drm/amdgpu_drm.h > >> @@ -57,6 +57,7 @@ extern "C" { > >> #define DRM_AMDGPU_USERQ 0x16 > >> #define DRM_AMDGPU_USERQ_SIGNAL 0x17 > >> #define DRM_AMDGPU_USERQ_WAIT 0x18 > >> +#define DRM_AMDGPU_PROFILER 0x20 > >> > >> #define DRM_IOCTL_AMDGPU_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + > >> DRM_AMDGPU_GEM_CREATE, union drm_amdgpu_gem_create) > >> #define DRM_IOCTL_AMDGPU_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + > >> DRM_AMDGPU_GEM_MMAP, union drm_amdgpu_gem_mmap) > >> @@ -77,6 +78,7 @@ extern "C" { > >> #define DRM_IOCTL_AMDGPU_USERQ DRM_IOWR(DRM_COMMAND_BASE + > >> DRM_AMDGPU_USERQ, union drm_amdgpu_userq) > >> #define DRM_IOCTL_AMDGPU_USERQ_SIGNAL DRM_IOWR(DRM_COMMAND_BASE + > >> DRM_AMDGPU_USERQ_SIGNAL, struct drm_amdgpu_userq_signal) > >> #define DRM_IOCTL_AMDGPU_USERQ_WAIT DRM_IOWR(DRM_COMMAND_BASE + > >> DRM_AMDGPU_USERQ_WAIT, struct drm_amdgpu_userq_wait) > >> +#define DRM_IOCTL_AMDGPU_PROFILER DRM_IOWR(DRM_COMMAND_BASE + > >> DRM_AMDGPU_PROFILER, struct drm_amdgpu_profiler_args) > >> > >> /** > >> * DOC: memory domains > >> @@ -1616,6 +1618,23 @@ struct drm_amdgpu_info_gpuvm_fault { > >> #define AMDGPU_FAMILY_GC_11_5_0 150 /* GC 11.5.0 > >> */ > >> #define AMDGPU_FAMILY_GC_12_0_0 152 /* GC 12.0.0 > >> */ > >> > >> +/* > >> + * Supported Profiler Operations > >> + */ > >> +enum drm_amdgpu_profiler_ops { > >> + AMDGPU_PROFILER_VERSION = 0, > >> +}; > >> + > >> +struct drm_amdgpu_profiler_args { > >> + __u32 op; /* amdgpu_profiler_op */ > >> + union { > >> + __u32 version; /* AMDGPU_PROFILER_VERSION_NUM > >> + * lower 16 bit: minor > >> + * higher 16 bit: major > >> + */ > >> + }; > >> +}; > > I think this seems fine. I think we'd need to see what the other > > opcodes would look like. What is the version query used for? Can you > > provide an example of how the profiler would use this interface for > > actually profiling a job? > > [JZ] Profiler team requests this to track some profiler internal changes to > > conduct profiler version control. > > The op will include PMC, PC Sampling and SPM so far.
That makes sense, but I don't think there is much to review here until we know what those interfaces will look like. Also note that even if the kernel driver supports a newer interface, it needs to continue to support older interface versions for backwards compatibility. Alex > > > > > Alex > > > >> + > >> #if defined(__cplusplus) > >> } > >> #endif > >> -- > >> 2.34.1 > >>
