This exposes a accumulated GPU active time per client via the
fdinfo infrastructure.

Signed-off-by: Lucas Stach <l.st...@pengutronix.de>
---
v2:
- new patch
---
 drivers/gpu/drm/etnaviv/etnaviv_drv.c | 32 ++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c 
b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
index 6500f3999c5f..f42b982f9a16 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
@@ -24,6 +24,7 @@
 #include "etnaviv_gem.h"
 #include "etnaviv_mmu.h"
 #include "etnaviv_perfmon.h"
+#include "common.xml.h"
 
 /*
  * DRM operations:
@@ -488,7 +489,36 @@ static const struct drm_ioctl_desc etnaviv_ioctls[] = {
        ETNA_IOCTL(PM_QUERY_SIG, pm_query_sig, DRM_RENDER_ALLOW),
 };
 
-DEFINE_DRM_GEM_FOPS(fops);
+static void etnaviv_fop_show_fdinfo(struct seq_file *m, struct file *f)
+{
+       struct drm_file *file = f->private_data;
+       struct drm_device *dev = file->minor->dev;
+       struct etnaviv_drm_private *priv = dev->dev_private;
+       struct etnaviv_file_private *ctx = file->driver_priv;
+
+       /*
+        * For a description of the text output format used here, see
+        * Documentation/gpu/drm-usage-stats.rst.
+        */
+       seq_printf(m, "drm-driver:\t%s\n", dev->driver->name);
+       seq_printf(m, "drm-client-id:\t%u\n", ctx->id);
+
+       for (int i = 0; i < ETNA_MAX_PIPES; i++) {
+               struct etnaviv_gpu *gpu = priv->gpu[i];
+
+               if (!gpu)
+                       continue;
+
+               seq_printf(m, "drm-engine-pipe%d:\t%llu ns\n", i,
+                       drm_sched_entity_time_spent(&ctx->sched_entity[i]));
+       }
+}
+
+static const struct file_operations fops = {
+       .owner = THIS_MODULE,
+       DRM_GEM_FOPS,
+       .show_fdinfo = etnaviv_fop_show_fdinfo,
+};
 
 static const struct drm_driver etnaviv_drm_driver = {
        .driver_features    = DRIVER_GEM | DRIVER_RENDER,
-- 
2.39.2

Reply via email to