[PATCH 00/13] drm/msm: Add PERFCNTR_CONFIG ioctl

Rob Clark posted 13 patches 1 month, 3 weeks ago
There is a newer version of this series
drivers/gpu/drm/msm/Makefile                  |   19 +-
drivers/gpu/drm/msm/adreno/a2xx_gpu.c         |    7 -
drivers/gpu/drm/msm/adreno/a3xx_gpu.c         |   16 -
drivers/gpu/drm/msm/adreno/a4xx_gpu.c         |    3 -
drivers/gpu/drm/msm/adreno/a5xx_gpu.c         |   16 +-
drivers/gpu/drm/msm/adreno/a6xx_gmu.c         |    8 +-
drivers/gpu/drm/msm/adreno/a6xx_gpu.c         |  142 +-
drivers/gpu/drm/msm/adreno/a6xx_gpu.h         |    2 +
drivers/gpu/drm/msm/adreno/a6xx_preempt.c     |    2 +-
drivers/gpu/drm/msm/adreno/a8xx_gpu.c         |   32 +-
drivers/gpu/drm/msm/adreno/a8xx_preempt.c     |    2 +-
drivers/gpu/drm/msm/adreno/adreno_device.c    |    8 +-
drivers/gpu/drm/msm/adreno/adreno_gpu.c       |    7 +-
drivers/gpu/drm/msm/msm_debugfs.c             |    6 -
drivers/gpu/drm/msm/msm_drv.c                 |    2 +-
drivers/gpu/drm/msm/msm_drv.h                 |   13 +-
drivers/gpu/drm/msm/msm_gpu.c                 |  119 +-
drivers/gpu/drm/msm/msm_gpu.h                 |  105 +-
drivers/gpu/drm/msm/msm_perf.c                |  235 --
drivers/gpu/drm/msm/msm_perfcntr.c            |  609 +++++
drivers/gpu/drm/msm/msm_perfcntr.h            |  152 ++
drivers/gpu/drm/msm/msm_submitqueue.c         |    1 +
drivers/gpu/drm/msm/registers/adreno/a3xx.xml |    8 +-
drivers/gpu/drm/msm/registers/adreno/a5xx.xml |  141 +-
drivers/gpu/drm/msm/registers/adreno/a6xx.xml | 1300 ++++++-----
.../msm/registers/adreno/a6xx_descriptors.xml |   71 +-
.../drm/msm/registers/adreno/a6xx_enums.xml   |    3 +
.../msm/registers/adreno/a6xx_perfcntrs.json  |  105 +
.../msm/registers/adreno/a7xx_perfcntrs.json  |  228 ++
.../msm/registers/adreno/a8xx_descriptors.xml |   96 +-
.../msm/registers/adreno/a8xx_perfcntrs.json  |  240 ++
.../msm/registers/adreno/a8xx_perfcntrs.xml   | 1929 +++++++++++++++
.../msm/registers/adreno/adreno_common.xml    |   42 +
.../drm/msm/registers/adreno/adreno_pm4.xml   |   50 +-
drivers/gpu/drm/msm/registers/gen_header.py   | 2079 +++++++++--------
include/uapi/drm/msm_drm.h                    |   41 +
36 files changed, 5634 insertions(+), 2205 deletions(-)
delete mode 100644 drivers/gpu/drm/msm/msm_perf.c
create mode 100644 drivers/gpu/drm/msm/msm_perfcntr.c
create mode 100644 drivers/gpu/drm/msm/msm_perfcntr.h
create mode 100644 drivers/gpu/drm/msm/registers/adreno/a6xx_perfcntrs.json
create mode 100644 drivers/gpu/drm/msm/registers/adreno/a7xx_perfcntrs.json
create mode 100644 drivers/gpu/drm/msm/registers/adreno/a8xx_perfcntrs.json
create mode 100644 drivers/gpu/drm/msm/registers/adreno/a8xx_perfcntrs.xml
[PATCH 00/13] drm/msm: Add PERFCNTR_CONFIG ioctl
Posted by Rob Clark 1 month, 3 weeks ago
Add a new PERFCNTR_CONFIG ioctl, serving two functions:

1. Global counter collection (restricted to perfmon_capable()) using the
   MSM_PERFCNTR_STREAM flag.  Global counter sampling is, global, across
   contexts.  Only a single global counter stream is allowed at a time.
2. Reserve counters for local counter collection.  Local counter
   collection is local to a cmdstream (GEM_SUBMIT), and as such is
   allowed in all processes without additional privileges.

The kernel enforces that counters assigned for global counter collection
do not conflict with counters reserved for local counter collection, and
visa versa.  Since local counter collection is scoped to a single cmd-
stream, multiple UMD processes can overlap in their reserved counters.
But cannot conflict with global counter usage.

In the case of local counter collection, the UMD is still responsible
for programming the corresponding SELect registers, and sampling the
counter values, from it's cmdstream.  But by performing the reservation
step, the UMD protects itself from the kernel trying to use the same
SEL/counter regs for global counter collection.

For global counter collection, the kernel programs SEL regs, and sets up
a timer for counter sampling.  Userspace reads out the sampled values
from the returned perfcntr stream fd.  Releasing the global perfcntr
stream is simply a matter of close()ing the fd.

Since the counter sampling is done in the kernel, this prepares us for
not having to disable IFPC while global counter sampling is active.  But
wiring this up will come in a later patch.

The mesa side of this is at:
https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40522

Rob Clark (13):
  drm/msm: Remove obsolete perf infrastructure
  drm/msm/adreno: Sync registers from mesa
  drm/msm/registers: Sync gen_header.py from mesa
  drm/msm/registers: Add perfcntr json
  drm/msm: Allow CAP_PERFMON for setting SYSPROF
  drm/msm: Add a6xx+ perfcntr tables
  drm/msm: Add sysprof accessors
  drm/msm/a6xx: Add yield & flush helper
  drm/msm: Add per-context perfcntr state
  drm/msm: Add basic perfcntr infrastructure
  drm/msm/a6xx+: Add support to configure perfcntrs
  drm/msm/a8xx: Add perfcntr flush sequence
  drm/msm: Add PERFCNTR_CONFIG ioctl

 drivers/gpu/drm/msm/Makefile                  |   19 +-
 drivers/gpu/drm/msm/adreno/a2xx_gpu.c         |    7 -
 drivers/gpu/drm/msm/adreno/a3xx_gpu.c         |   16 -
 drivers/gpu/drm/msm/adreno/a4xx_gpu.c         |    3 -
 drivers/gpu/drm/msm/adreno/a5xx_gpu.c         |   16 +-
 drivers/gpu/drm/msm/adreno/a6xx_gmu.c         |    8 +-
 drivers/gpu/drm/msm/adreno/a6xx_gpu.c         |  142 +-
 drivers/gpu/drm/msm/adreno/a6xx_gpu.h         |    2 +
 drivers/gpu/drm/msm/adreno/a6xx_preempt.c     |    2 +-
 drivers/gpu/drm/msm/adreno/a8xx_gpu.c         |   32 +-
 drivers/gpu/drm/msm/adreno/a8xx_preempt.c     |    2 +-
 drivers/gpu/drm/msm/adreno/adreno_device.c    |    8 +-
 drivers/gpu/drm/msm/adreno/adreno_gpu.c       |    7 +-
 drivers/gpu/drm/msm/msm_debugfs.c             |    6 -
 drivers/gpu/drm/msm/msm_drv.c                 |    2 +-
 drivers/gpu/drm/msm/msm_drv.h                 |   13 +-
 drivers/gpu/drm/msm/msm_gpu.c                 |  119 +-
 drivers/gpu/drm/msm/msm_gpu.h                 |  105 +-
 drivers/gpu/drm/msm/msm_perf.c                |  235 --
 drivers/gpu/drm/msm/msm_perfcntr.c            |  609 +++++
 drivers/gpu/drm/msm/msm_perfcntr.h            |  152 ++
 drivers/gpu/drm/msm/msm_submitqueue.c         |    1 +
 drivers/gpu/drm/msm/registers/adreno/a3xx.xml |    8 +-
 drivers/gpu/drm/msm/registers/adreno/a5xx.xml |  141 +-
 drivers/gpu/drm/msm/registers/adreno/a6xx.xml | 1300 ++++++-----
 .../msm/registers/adreno/a6xx_descriptors.xml |   71 +-
 .../drm/msm/registers/adreno/a6xx_enums.xml   |    3 +
 .../msm/registers/adreno/a6xx_perfcntrs.json  |  105 +
 .../msm/registers/adreno/a7xx_perfcntrs.json  |  228 ++
 .../msm/registers/adreno/a8xx_descriptors.xml |   96 +-
 .../msm/registers/adreno/a8xx_perfcntrs.json  |  240 ++
 .../msm/registers/adreno/a8xx_perfcntrs.xml   | 1929 +++++++++++++++
 .../msm/registers/adreno/adreno_common.xml    |   42 +
 .../drm/msm/registers/adreno/adreno_pm4.xml   |   50 +-
 drivers/gpu/drm/msm/registers/gen_header.py   | 2079 +++++++++--------
 include/uapi/drm/msm_drm.h                    |   41 +
 36 files changed, 5634 insertions(+), 2205 deletions(-)
 delete mode 100644 drivers/gpu/drm/msm/msm_perf.c
 create mode 100644 drivers/gpu/drm/msm/msm_perfcntr.c
 create mode 100644 drivers/gpu/drm/msm/msm_perfcntr.h
 create mode 100644 drivers/gpu/drm/msm/registers/adreno/a6xx_perfcntrs.json
 create mode 100644 drivers/gpu/drm/msm/registers/adreno/a7xx_perfcntrs.json
 create mode 100644 drivers/gpu/drm/msm/registers/adreno/a8xx_perfcntrs.json
 create mode 100644 drivers/gpu/drm/msm/registers/adreno/a8xx_perfcntrs.xml

-- 
2.53.0
Re: [PATCH 00/13] drm/msm: Add PERFCNTR_CONFIG ioctl
Posted by Dmitry Baryshkov 1 month, 3 weeks ago
On Mon, Apr 20, 2026 at 03:25:22PM -0700, Rob Clark wrote:
> Add a new PERFCNTR_CONFIG ioctl, serving two functions:
> 
> 1. Global counter collection (restricted to perfmon_capable()) using the
>    MSM_PERFCNTR_STREAM flag.  Global counter sampling is, global, across
>    contexts.  Only a single global counter stream is allowed at a time.
> 2. Reserve counters for local counter collection.  Local counter
>    collection is local to a cmdstream (GEM_SUBMIT), and as such is
>    allowed in all processes without additional privileges.
> 
> The kernel enforces that counters assigned for global counter collection
> do not conflict with counters reserved for local counter collection, and
> visa versa.  Since local counter collection is scoped to a single cmd-
> stream, multiple UMD processes can overlap in their reserved counters.
> But cannot conflict with global counter usage.
> 
> In the case of local counter collection, the UMD is still responsible
> for programming the corresponding SELect registers, and sampling the
> counter values, from it's cmdstream.  But by performing the reservation
> step, the UMD protects itself from the kernel trying to use the same
> SEL/counter regs for global counter collection.
> 
> For global counter collection, the kernel programs SEL regs, and sets up
> a timer for counter sampling.  Userspace reads out the sampled values
> from the returned perfcntr stream fd.  Releasing the global perfcntr
> stream is simply a matter of close()ing the fd.
> 
> Since the counter sampling is done in the kernel, this prepares us for
> not having to disable IFPC while global counter sampling is active.  But
> wiring this up will come in a later patch.
> 
> The mesa side of this is at:
> https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40522
> 
> Rob Clark (13):
>   drm/msm: Remove obsolete perf infrastructure
>   drm/msm/adreno: Sync registers from mesa
>   drm/msm/registers: Sync gen_header.py from mesa
>   drm/msm/registers: Add perfcntr json
>   drm/msm: Allow CAP_PERFMON for setting SYSPROF
>   drm/msm: Add a6xx+ perfcntr tables
>   drm/msm: Add sysprof accessors
>   drm/msm/a6xx: Add yield & flush helper
>   drm/msm: Add per-context perfcntr state
>   drm/msm: Add basic perfcntr infrastructure
>   drm/msm/a6xx+: Add support to configure perfcntrs
>   drm/msm/a8xx: Add perfcntr flush sequence
>   drm/msm: Add PERFCNTR_CONFIG ioctl
> 
The series doesn't apply to linux-next. Please switch to b4 and use b4
--edit-deps to specify dependencies.

-- 
With best wishes
Dmitry
Re: [PATCH 00/13] drm/msm: Add PERFCNTR_CONFIG ioctl
Posted by Rob Clark 1 month, 3 weeks ago
On Tue, Apr 21, 2026 at 6:54 PM Dmitry Baryshkov
<dmitry.baryshkov@oss.qualcomm.com> wrote:
>
> On Mon, Apr 20, 2026 at 03:25:22PM -0700, Rob Clark wrote:
> > Add a new PERFCNTR_CONFIG ioctl, serving two functions:
> >
> > 1. Global counter collection (restricted to perfmon_capable()) using the
> >    MSM_PERFCNTR_STREAM flag.  Global counter sampling is, global, across
> >    contexts.  Only a single global counter stream is allowed at a time.
> > 2. Reserve counters for local counter collection.  Local counter
> >    collection is local to a cmdstream (GEM_SUBMIT), and as such is
> >    allowed in all processes without additional privileges.
> >
> > The kernel enforces that counters assigned for global counter collection
> > do not conflict with counters reserved for local counter collection, and
> > visa versa.  Since local counter collection is scoped to a single cmd-
> > stream, multiple UMD processes can overlap in their reserved counters.
> > But cannot conflict with global counter usage.
> >
> > In the case of local counter collection, the UMD is still responsible
> > for programming the corresponding SELect registers, and sampling the
> > counter values, from it's cmdstream.  But by performing the reservation
> > step, the UMD protects itself from the kernel trying to use the same
> > SEL/counter regs for global counter collection.
> >
> > For global counter collection, the kernel programs SEL regs, and sets up
> > a timer for counter sampling.  Userspace reads out the sampled values
> > from the returned perfcntr stream fd.  Releasing the global perfcntr
> > stream is simply a matter of close()ing the fd.
> >
> > Since the counter sampling is done in the kernel, this prepares us for
> > not having to disable IFPC while global counter sampling is active.  But
> > wiring this up will come in a later patch.
> >
> > The mesa side of this is at:
> > https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40522
> >
> > Rob Clark (13):
> >   drm/msm: Remove obsolete perf infrastructure
> >   drm/msm/adreno: Sync registers from mesa
> >   drm/msm/registers: Sync gen_header.py from mesa
> >   drm/msm/registers: Add perfcntr json
> >   drm/msm: Allow CAP_PERFMON for setting SYSPROF
> >   drm/msm: Add a6xx+ perfcntr tables
> >   drm/msm: Add sysprof accessors
> >   drm/msm/a6xx: Add yield & flush helper
> >   drm/msm: Add per-context perfcntr state
> >   drm/msm: Add basic perfcntr infrastructure
> >   drm/msm/a6xx+: Add support to configure perfcntrs
> >   drm/msm/a8xx: Add perfcntr flush sequence
> >   drm/msm: Add PERFCNTR_CONFIG ioctl
> >
> The series doesn't apply to linux-next. Please switch to b4 and use b4
> --edit-deps to specify dependencies.

fwiw 20260411150312.257937-1-robin.clark@oss.qualcomm.com is the thing
missing from linux-next

BR,
-R