to introduce the SPM (Stream Performance Monitor) manager subsystem as a new compilation unit (amdgpu_spm.c / amdgpu_spm.h) and integrate it into the per-XCP profiler manager lifecycle.
struct amdgpu_spm_mgr is defined in amdgpu_spm.h, currently holding only a drm_file pointer (the owning file handle). It is embedded as a member of a union inside struct amdgpu_profiler_xcp_mgr, alongside future profiler subsystems (e.g. PCS). The SPM manager lifecycle is tied to the profiler XCP manager: - amdgpu_spm_mgr_init() is called from amdgpu_profiler_mgr_init() when a new XCP profiler context is first created (i.e. the first open on that XCP partition). It calls the internal amdgpu_spm_init_device() stub (TODO: device-level SPM hardware initialization). - amdgpu_spm_mgr_fini() is called from amdgpu_profiler_mgr_release() (the kref release callback) when the last file handle referencing this XCP profiler context is closed. If an active file handle is recorded in spm_mgr->file, it triggers amdgpu_spm_release_device(), which calls the internal amdgpu_spm_release() stub (TODO: SPM hardware teardown and resource cleanup). A helper macro prof_mgr_to_adev() is added to amdgpu_profiler.h to retrieve the parent amdgpu_device from an amdgpu_profiler_mgr pointer via container_of(). Signed-off-by: James Zhu <[email protected]> --- drivers/gpu/drm/amd/amdgpu/Makefile | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_profiler.c | 3 + drivers/gpu/drm/amd/amdgpu/amdgpu_profiler.h | 9 +++ drivers/gpu/drm/amd/amdgpu/amdgpu_spm.c | 62 ++++++++++++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_spm.h | 34 +++++++++++ 5 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_spm.c create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_spm.h diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile index 74abc061cd4d..e97a9a066308 100644 --- a/drivers/gpu/drm/amd/amdgpu/Makefile +++ b/drivers/gpu/drm/amd/amdgpu/Makefile @@ -68,7 +68,7 @@ amdgpu-y += amdgpu_device.o amdgpu_doorbell_mgr.o amdgpu_kms.o \ amdgpu_eeprom.o amdgpu_mca.o amdgpu_psp_ta.o amdgpu_lsdma.o \ amdgpu_ring_mux.o amdgpu_xcp.o amdgpu_seq64.o amdgpu_aca.o amdgpu_dev_coredump.o \ amdgpu_cper.o amdgpu_userq_fence.o amdgpu_eviction_fence.o amdgpu_ip.o amdgpu_cwsr.o \ - amdgpu_profiler.o + amdgpu_profiler.o amdgpu_spm.o amdgpu-$(CONFIG_PROC_FS) += amdgpu_fdinfo.o diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_profiler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_profiler.c index bed43ea8bcc3..d462d99dc8bb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_profiler.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_profiler.c @@ -82,6 +82,7 @@ int amdgpu_profiler_mgr_init( mutex_init(&prof_xcp_mgr->mutex); prof_xcp_mgr->xcp_id = fpriv->xcp_id; + amdgpu_spm_mgr_init(&prof_xcp_mgr->spm_mgr); prof_xcp_mgr->is_init = true; mutex_unlock(&prof_mgr->mutex); @@ -93,6 +94,8 @@ static void amdgpu_profiler_mgr_release(struct kref *ref) struct amdgpu_profiler_xcp_mgr *prof_xcp_mgr = container_of(ref, struct amdgpu_profiler_xcp_mgr, ref); + amdgpu_spm_mgr_fini(&prof_xcp_mgr->spm_mgr); + mutex_destroy(&prof_xcp_mgr->mutex); prof_xcp_mgr->is_init = false; } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_profiler.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_profiler.h index 779cfe19fda2..ea62a4dee364 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_profiler.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_profiler.h @@ -25,15 +25,24 @@ #ifndef AMDGPU_PROFILER_H_ #define AMDGPU_PROFILER_H_ +#include "amdgpu_spm.h" + #define AMDGPU_XCP_ID(x) (x == AMDGPU_XCP_NO_PARTITION ? 0 : x) #define fpriv_to_prof_mgr(fpriv) (&(fpriv)->userq_mgr.adev->prof_mgr) #define fpriv_to_adev(fpriv) ((fpriv)->userq_mgr.adev) +#define prof_mgr_to_adev(x) \ + container_of(x, struct amdgpu_device, prof_mgr) + struct amdgpu_profiler_xcp_mgr { struct mutex mutex; uint32_t xcp_id; bool is_init; struct kref ref; + + union { + struct amdgpu_spm_mgr spm_mgr; + }; }; struct amdgpu_profiler_mgr { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_spm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_spm.c new file mode 100644 index 000000000000..27f4ed1aa1e0 --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_spm.c @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: GPL-2.0 OR MIT +/* + * 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 "amdgpu.h" + +/* + * SPM revision change log + * + * 0.1 - Initial revision + */ + +static int amdgpu_spm_release(struct amdgpu_spm_mgr *spm_mgr, struct drm_file *filp); + +static void amdgpu_spm_init_device(struct amdgpu_spm_mgr *spm_mgr) +{ + /* TODO */ +} + +static void amdgpu_spm_release_device(struct amdgpu_spm_mgr *spm_mgr, struct drm_file *filp) +{ + amdgpu_spm_release(spm_mgr, filp); +} + +static int amdgpu_spm_release(struct amdgpu_spm_mgr *spm_mgr, struct drm_file *filp) +{ + /* TODO */ + return 0; +} + +int amdgpu_spm_mgr_init(struct amdgpu_spm_mgr *spm_mgr) +{ + amdgpu_spm_init_device(spm_mgr); + return 0; +} + +void amdgpu_spm_mgr_fini(struct amdgpu_spm_mgr *spm_mgr) +{ + if (spm_mgr->file) { + amdgpu_spm_release_device(spm_mgr, spm_mgr->file); + spm_mgr->file = NULL; + } +} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_spm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_spm.h new file mode 100644 index 000000000000..06b4f6dba41b --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_spm.h @@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: GPL-2.0 OR MIT */ +/* + * 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. + */ + +#ifndef AMDGPU_SPM_H_ +#define AMDGPU_SPM_H_ + +struct amdgpu_spm_mgr { + struct drm_file *file; +}; + +int amdgpu_spm_mgr_init(struct amdgpu_spm_mgr *spm_mgr); +void amdgpu_spm_mgr_fini(struct amdgpu_spm_mgr *spm_mgr); + +#endif -- 2.34.1
