Mesa (main): freedreno/all: Introduce fd_dev_id

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Aug 6 19:21:23 UTC 2021


Module: Mesa
Branch: main
Commit: 7806843866a34d6250596ceff670ec4bdaedbcd1
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7806843866a34d6250596ceff670ec4bdaedbcd1

Author: Rob Clark <robdclark at chromium.org>
Date:   Sat Jul 31 13:46:50 2021 -0700

freedreno/all: Introduce fd_dev_id

Move away from using gpu_id as the primary means to identify which
adreno we are running on, as future GPUs (starting with 7c3) stop
providing a gpu_id as a new naming scheme is introduced.

Signed-off-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12159>

---

 src/freedreno/common/freedreno_dev_info.c        | 16 ++++++++++-----
 src/freedreno/common/freedreno_dev_info.h        | 26 ++++++++++++++++++++++--
 src/freedreno/common/freedreno_devices.py        |  2 +-
 src/freedreno/common/freedreno_uuid.c            |  5 +++--
 src/freedreno/common/freedreno_uuid.h            |  4 +++-
 src/freedreno/computerator/a6xx.c                |  4 ++--
 src/freedreno/computerator/main.c                | 20 ++++++++----------
 src/freedreno/computerator/main.h                |  2 +-
 src/freedreno/drm/freedreno_drmif.h              |  1 +
 src/freedreno/drm/freedreno_pipe.c               | 10 +++++++--
 src/freedreno/drm/freedreno_priv.h               |  3 ++-
 src/freedreno/drm/msm_ringbuffer.c               |  2 +-
 src/freedreno/drm/msm_ringbuffer_sp.c            |  4 ++--
 src/freedreno/ds/fd_pps_driver.cc                | 17 ++++++----------
 src/freedreno/ds/fd_pps_driver.h                 |  2 +-
 src/freedreno/ir3/ir3_compiler.c                 | 10 ++++-----
 src/freedreno/ir3/ir3_compiler.h                 |  9 +++++---
 src/freedreno/ir3/ir3_disk_cache.c               |  7 +------
 src/freedreno/ir3/ir3_shader.c                   |  2 +-
 src/freedreno/ir3/tests/delay.c                  |  6 +++++-
 src/freedreno/ir3/tests/disasm.c                 |  4 +++-
 src/freedreno/perfcntrs/fdperf.c                 |  5 ++++-
 src/freedreno/perfcntrs/freedreno_perfcntr.c     | 10 ++++-----
 src/freedreno/perfcntrs/freedreno_perfcntr.h     |  4 +++-
 src/freedreno/vulkan/tu_device.c                 | 12 +++++------
 src/freedreno/vulkan/tu_drm.c                    |  2 +-
 src/freedreno/vulkan/tu_kgsl.c                   |  2 +-
 src/freedreno/vulkan/tu_private.h                |  2 +-
 src/freedreno/vulkan/tu_query.c                  |  6 +++---
 src/gallium/drivers/freedreno/freedreno_screen.c | 16 ++++++++-------
 src/gallium/drivers/freedreno/freedreno_screen.h |  1 +
 src/gallium/drivers/freedreno/gmemtool.c         |  7 +++++--
 src/gallium/drivers/freedreno/ir3/ir3_cmdline.c  |  5 ++++-
 src/gallium/drivers/freedreno/ir3/ir3_gallium.c  |  2 +-
 34 files changed, 140 insertions(+), 90 deletions(-)

diff --git a/src/freedreno/common/freedreno_dev_info.c b/src/freedreno/common/freedreno_dev_info.c
index 3f964aaf695..dc2d01f8d11 100644
--- a/src/freedreno/common/freedreno_dev_info.c
+++ b/src/freedreno/common/freedreno_dev_info.c
@@ -29,18 +29,24 @@
  * Table entry for a single GPU version
  */
 struct fd_dev_rec {
-   uint32_t gpu_id;
+   struct fd_dev_id id;
    const char *name;
    const struct fd_dev_info *info;
 };
 
 #include "freedreno_devices.h"
 
+static bool
+dev_id_compare(const struct fd_dev_id *a, const struct fd_dev_id *b)
+{
+   return a->gpu_id == b->gpu_id;
+}
+
 const struct fd_dev_info *
-fd_dev_info(uint32_t gpu_id)
+fd_dev_info(const struct fd_dev_id *id)
 {
    for (int i = 0; i < ARRAY_SIZE(fd_dev_recs); i++) {
-      if (gpu_id == fd_dev_recs[i].gpu_id) {
+      if (dev_id_compare(&fd_dev_recs[i].id, id)) {
          return fd_dev_recs[i].info;
       }
    }
@@ -48,10 +54,10 @@ fd_dev_info(uint32_t gpu_id)
 }
 
 const char *
-fd_dev_name(uint32_t gpu_id)
+fd_dev_name(const struct fd_dev_id *id)
 {
    for (int i = 0; i < ARRAY_SIZE(fd_dev_recs); i++) {
-      if (gpu_id == fd_dev_recs[i].gpu_id) {
+      if (dev_id_compare(&fd_dev_recs[i].id, id)) {
          return fd_dev_recs[i].name;
       }
    }
diff --git a/src/freedreno/common/freedreno_dev_info.h b/src/freedreno/common/freedreno_dev_info.h
index 6a01b879791..7d7ed47ca09 100644
--- a/src/freedreno/common/freedreno_dev_info.h
+++ b/src/freedreno/common/freedreno_dev_info.h
@@ -105,6 +105,28 @@ struct fd_dev_info {
    };
 };
 
+struct fd_dev_id {
+   uint32_t gpu_id;
+};
+
+static inline uint32_t
+fd_dev_gpu_id(const struct fd_dev_id *id)
+{
+   return id->gpu_id;
+}
+
+static uint8_t
+fd_dev_gen(const struct fd_dev_id *id)
+{
+   return fd_dev_gpu_id(id) / 100;
+}
+
+static inline bool
+fd_dev_64b(const struct fd_dev_id *id)
+{
+   return fd_dev_gen(id) >= 5;
+}
+
 /* per CCU GMEM amount reserved for depth cache for direct rendering */
 #define A6XX_CCU_DEPTH_SIZE (64 * 1024)
 /* per CCU GMEM amount reserved for color cache used by GMEM resolves
@@ -116,8 +138,8 @@ struct fd_dev_info {
  */
 #define A6XX_CCU_GMEM_COLOR_SIZE (16 * 1024)
 
-const struct fd_dev_info * fd_dev_info(uint32_t gpu_id);
-const char * fd_dev_name(uint32_t gpu_id);
+const struct fd_dev_info * fd_dev_info(const struct fd_dev_id *id);
+const char * fd_dev_name(const struct fd_dev_id *id);
 
 #ifdef __cplusplus
 } /* end of extern "C" */
diff --git a/src/freedreno/common/freedreno_devices.py b/src/freedreno/common/freedreno_devices.py
index 826a6dc3183..c0df32e881e 100644
--- a/src/freedreno/common/freedreno_devices.py
+++ b/src/freedreno/common/freedreno_devices.py
@@ -328,7 +328,7 @@ static const struct fd_dev_info __info${s.info_index(info)} = ${str(info)};
 
 static const struct fd_dev_rec fd_dev_recs[] = {
 %for id, info in s.gpus.items():
-   { ${id.gpu_id}, "${id.name}", &__info${s.info_index(info)} },
+   { {${id.gpu_id}}, "${id.name}", &__info${s.info_index(info)} },
 %endfor
 };
 """
diff --git a/src/freedreno/common/freedreno_uuid.c b/src/freedreno/common/freedreno_uuid.c
index d6d14682714..a2355a84de9 100644
--- a/src/freedreno/common/freedreno_uuid.c
+++ b/src/freedreno/common/freedreno_uuid.c
@@ -21,6 +21,7 @@
  * SOFTWARE.
  */
 
+#include "freedreno_dev_info.h"
 #include "freedreno_uuid.h"
 
 #include <assert.h>
@@ -57,7 +58,7 @@ fd_get_driver_uuid(void *uuid)
 }
 
 void
-fd_get_device_uuid(void *uuid, unsigned gpu_id)
+fd_get_device_uuid(void *uuid, const struct fd_dev_id *id)
 {
    struct mesa_sha1 sha1_ctx;
    _mesa_sha1_init(&sha1_ctx);
@@ -83,7 +84,7 @@ fd_get_device_uuid(void *uuid, unsigned gpu_id)
    static const char *device_name = "freedreno";
    _mesa_sha1_update(&sha1_ctx, device_name, strlen(device_name));
 
-   _mesa_sha1_update(&sha1_ctx, &gpu_id, sizeof(gpu_id));
+   _mesa_sha1_update(&sha1_ctx, id, sizeof(*id));
 
    uint8_t sha1[SHA1_DIGEST_LENGTH];
    _mesa_sha1_final(&sha1_ctx, sha1);
diff --git a/src/freedreno/common/freedreno_uuid.h b/src/freedreno/common/freedreno_uuid.h
index 186708caa29..7e896717053 100644
--- a/src/freedreno/common/freedreno_uuid.h
+++ b/src/freedreno/common/freedreno_uuid.h
@@ -24,7 +24,9 @@
 #ifndef __FREEDRENO_UUID_H__
 #define __FREEDRENO_UUID_H__
 
+struct fd_dev_id;
+
 void fd_get_driver_uuid(void *uuid);
-void fd_get_device_uuid(void *uuid, unsigned gpu_id);
+void fd_get_device_uuid(void *uuid, const struct fd_dev_id *id);
 
 #endif /* __FREEDRENO_UUID_H__ */
diff --git a/src/freedreno/computerator/a6xx.c b/src/freedreno/computerator/a6xx.c
index 4347cd36fe2..0dc103816f7 100644
--- a/src/freedreno/computerator/a6xx.c
+++ b/src/freedreno/computerator/a6xx.c
@@ -484,7 +484,7 @@ a6xx_read_perfcntrs(struct backend *b, uint64_t *results)
 }
 
 struct backend *
-a6xx_init(struct fd_device *dev, uint32_t gpu_id)
+a6xx_init(struct fd_device *dev, const struct fd_dev_id *dev_id)
 {
    struct a6xx_backend *a6xx_backend = calloc(1, sizeof(*a6xx_backend));
 
@@ -496,7 +496,7 @@ a6xx_init(struct fd_device *dev, uint32_t gpu_id)
       .read_perfcntrs = a6xx_read_perfcntrs,
    };
 
-   a6xx_backend->compiler = ir3_compiler_create(dev, gpu_id, false);
+   a6xx_backend->compiler = ir3_compiler_create(dev, dev_id, false);
    a6xx_backend->dev = dev;
 
    a6xx_backend->control_mem =
diff --git a/src/freedreno/computerator/main.c b/src/freedreno/computerator/main.c
index 42f0484f353..7d613fdde0f 100644
--- a/src/freedreno/computerator/main.c
+++ b/src/freedreno/computerator/main.c
@@ -167,14 +167,14 @@ setup_counter(const char *name, struct perfcntr *c)
 }
 
 static struct perfcntr *
-parse_perfcntrs(uint32_t gpu_id, const char *perfcntrstr,
+parse_perfcntrs(const struct fd_dev_id *dev_id, const char *perfcntrstr,
                 unsigned *num_perfcntrs)
 {
    struct perfcntr *counters = NULL;
    char *cnames, *s;
    unsigned cnt = 0;
 
-   groups = fd_perfcntrs(gpu_id, &num_groups);
+   groups = fd_perfcntrs(dev_id, &num_groups);
    enabled_counters = calloc(num_groups, sizeof(enabled_counters[0]));
 
    cnames = strdup(perfcntrstr);
@@ -243,19 +243,17 @@ main(int argc, char **argv)
    struct fd_device *dev = fd_device_new(fd);
    struct fd_pipe *pipe = fd_pipe_new(dev, FD_PIPE_3D);
 
-   uint64_t val;
-   fd_pipe_get_param(pipe, FD_GPU_ID, &val);
-   uint32_t gpu_id = val;
+   const struct fd_dev_id *dev_id = fd_pipe_dev_id(pipe);
 
-   printf("got gpu_id: %u\n", gpu_id);
+   printf("got gpu: %s\n", fd_dev_name(dev_id));
 
    struct backend *backend;
-   switch (gpu_id) {
-   case 600 ... 699:
-      backend = a6xx_init(dev, gpu_id);
+   switch (fd_dev_gen(dev_id)) {
+   case 6:
+      backend = a6xx_init(dev, dev_id);
       break;
    default:
-      err(1, "unsupported gpu: a%u", gpu_id);
+      err(1, "unsupported gpu generation: a%uxx", fd_dev_gen(dev_id));
    }
 
    struct kernel *kernel = backend->assemble(backend, in);
@@ -278,7 +276,7 @@ main(int argc, char **argv)
       if (!backend->set_perfcntrs) {
          err(1, "performance counters not supported");
       }
-      perfcntrs = parse_perfcntrs(gpu_id, perfcntrstr, &num_perfcntrs);
+      perfcntrs = parse_perfcntrs(dev_id, perfcntrstr, &num_perfcntrs);
       backend->set_perfcntrs(backend, perfcntrs, num_perfcntrs);
    }
 
diff --git a/src/freedreno/computerator/main.h b/src/freedreno/computerator/main.h
index dd52bad7ade..62bc5a33438 100644
--- a/src/freedreno/computerator/main.h
+++ b/src/freedreno/computerator/main.h
@@ -80,7 +80,7 @@ struct backend {
       return (struct _to *)f;                                                  \
    }
 
-struct backend *a6xx_init(struct fd_device *dev, uint32_t gpu_id);
+struct backend *a6xx_init(struct fd_device *dev, const struct fd_dev_id *dev_id);
 
 /* for conditionally setting boolean flag(s): */
 #define COND(bool, val) ((bool) ? (val) : 0)
diff --git a/src/freedreno/drm/freedreno_drmif.h b/src/freedreno/drm/freedreno_drmif.h
index d9b645f9cb1..118f6185912 100644
--- a/src/freedreno/drm/freedreno_drmif.h
+++ b/src/freedreno/drm/freedreno_drmif.h
@@ -143,6 +143,7 @@ struct fd_pipe *fd_pipe_ref(struct fd_pipe *pipe);
 struct fd_pipe *fd_pipe_ref_locked(struct fd_pipe *pipe);
 void fd_pipe_del(struct fd_pipe *pipe);
 void fd_pipe_purge(struct fd_pipe *pipe);
+const struct fd_dev_id * fd_pipe_dev_id(struct fd_pipe *pipe);
 int fd_pipe_get_param(struct fd_pipe *pipe, enum fd_param_id param,
                       uint64_t *value);
 int fd_pipe_wait(struct fd_pipe *pipe, const struct fd_fence *fence);
diff --git a/src/freedreno/drm/freedreno_pipe.c b/src/freedreno/drm/freedreno_pipe.c
index 35ddec8e20a..0a5cea9e2dd 100644
--- a/src/freedreno/drm/freedreno_pipe.c
+++ b/src/freedreno/drm/freedreno_pipe.c
@@ -58,7 +58,7 @@ fd_pipe_new2(struct fd_device *dev, enum fd_pipe_id id, uint32_t prio)
    p_atomic_set(&pipe->refcnt, 1);
 
    fd_pipe_get_param(pipe, FD_GPU_ID, &val);
-   pipe->gpu_id = val;
+   pipe->dev_id.gpu_id = val;
 
    pipe->control_mem = fd_bo_new(dev, sizeof(*pipe->control),
                                  0, "pipe-control");
@@ -160,6 +160,12 @@ fd_pipe_get_param(struct fd_pipe *pipe, enum fd_param_id param, uint64_t *value)
    return pipe->funcs->get_param(pipe, param, value);
 }
 
+const struct fd_dev_id *
+fd_pipe_dev_id(struct fd_pipe *pipe)
+{
+   return &pipe->dev_id;
+}
+
 int
 fd_pipe_wait(struct fd_pipe *pipe, const struct fd_fence *fence)
 {
@@ -183,7 +189,7 @@ fd_pipe_emit_fence(struct fd_pipe *pipe, struct fd_ringbuffer *ring)
 {
    uint32_t fence = ++pipe->last_fence;
 
-   if (pipe->gpu_id >= 500) {
+   if (fd_dev_64b(&pipe->dev_id)) {
       OUT_PKT7(ring, CP_EVENT_WRITE, 4);
       OUT_RING(ring, CP_EVENT_WRITE_0_EVENT(CACHE_FLUSH_TS));
       OUT_RELOC(ring, control_ptr(pipe, fence));   /* ADDR_LO/HI */
diff --git a/src/freedreno/drm/freedreno_priv.h b/src/freedreno/drm/freedreno_priv.h
index afc73dc7bda..6e3c610ee00 100644
--- a/src/freedreno/drm/freedreno_priv.h
+++ b/src/freedreno/drm/freedreno_priv.h
@@ -46,6 +46,7 @@
 #include "util/u_debug.h"
 #include "util/u_math.h"
 
+#include "freedreno_dev_info.h"
 #include "freedreno_drmif.h"
 #include "freedreno_ringbuffer.h"
 
@@ -192,7 +193,7 @@ struct fd_pipe_control {
 struct fd_pipe {
    struct fd_device *dev;
    enum fd_pipe_id id;
-   uint32_t gpu_id;
+   struct fd_dev_id dev_id;
 
    /**
     * Note refcnt is *not* atomic, but protected by table_lock, since the
diff --git a/src/freedreno/drm/msm_ringbuffer.c b/src/freedreno/drm/msm_ringbuffer.c
index 239faee2ecb..3520b886e33 100644
--- a/src/freedreno/drm/msm_ringbuffer.c
+++ b/src/freedreno/drm/msm_ringbuffer.c
@@ -512,7 +512,7 @@ msm_ringbuffer_emit_reloc(struct fd_ringbuffer *ring,
 
    ring->cur++;
 
-   if (pipe->gpu_id >= 500) {
+   if (fd_dev_64b(&pipe->dev_id)) {
       APPEND(msm_ring->cmd, relocs,
              (struct drm_msm_gem_submit_reloc){
                 .reloc_idx = reloc_idx,
diff --git a/src/freedreno/drm/msm_ringbuffer_sp.c b/src/freedreno/drm/msm_ringbuffer_sp.c
index 14c75eb846d..3604e3d6473 100644
--- a/src/freedreno/drm/msm_ringbuffer_sp.c
+++ b/src/freedreno/drm/msm_ringbuffer_sp.c
@@ -798,13 +798,13 @@ msm_ringbuffer_sp_init(struct msm_ringbuffer_sp *msm_ring, uint32_t size,
    ring->flags = flags;
 
    if (flags & _FD_RINGBUFFER_OBJECT) {
-      if (msm_ring->u.pipe->gpu_id >= 500) {
+      if (fd_dev_64b(&msm_ring->u.pipe->dev_id)) {
          ring->funcs = &ring_funcs_obj_64;
       } else {
          ring->funcs = &ring_funcs_obj_32;
       }
    } else {
-      if (msm_ring->u.submit->pipe->gpu_id >= 500) {
+      if (fd_dev_64b(&msm_ring->u.submit->pipe->dev_id)) {
          ring->funcs = &ring_funcs_nonobj_64;
       } else {
          ring->funcs = &ring_funcs_nonobj_32;
diff --git a/src/freedreno/ds/fd_pps_driver.cc b/src/freedreno/ds/fd_pps_driver.cc
index 349a7a8ce4e..88697bf6111 100644
--- a/src/freedreno/ds/fd_pps_driver.cc
+++ b/src/freedreno/ds/fd_pps_driver.cc
@@ -134,12 +134,7 @@ FreedrenoDriver::init_perfcnt()
 
    dev = fd_device_new(drm_device.fd);
    pipe = fd_pipe_new(dev, FD_PIPE_3D);
-
-   if (fd_pipe_get_param(pipe, FD_GPU_ID, &val)) {
-      PERFETTO_FATAL("Could not get GPU_ID");
-      return false;
-   }
-   gpu_id = val;
+   dev_id = fd_pipe_dev_id(pipe);
 
    if (fd_pipe_get_param(pipe, FD_MAX_FREQ, &val)) {
       PERFETTO_FATAL("Could not get MAX_FREQ");
@@ -154,7 +149,7 @@ FreedrenoDriver::init_perfcnt()
       has_suspend_count = true;
    }
 
-   perfcntrs = fd_perfcntrs(gpu_id, &num_perfcntrs);
+   perfcntrs = fd_perfcntrs(fd_pipe_dev_id(pipe), &num_perfcntrs);
    if (num_perfcntrs == 0) {
       PERFETTO_FATAL("No hw counters available");
       return false;
@@ -163,12 +158,12 @@ FreedrenoDriver::init_perfcnt()
    assigned_counters.resize(num_perfcntrs);
    assigned_counters.assign(assigned_counters.size(), 0);
 
-   switch (gpu_id) {
-   case 600 ... 699:
+   switch (fd_dev_gen(dev_id)) {
+   case 6:
       setup_a6xx_counters();
       break;
    default:
-      PERFETTO_FATAL("Unsupported GPU: a%03u", gpu_id);
+      PERFETTO_FATAL("Unsupported GPU: a%03u", fd_dev_gpu_id(dev_id));
       return false;
    }
 
@@ -177,7 +172,7 @@ FreedrenoDriver::init_perfcnt()
    for (auto countable : countables)
       countable.resolve();
 
-   info = fd_dev_info(gpu_id);
+   info = fd_dev_info(dev_id);
 
    io = fd_dt_find_io();
    if (!io) {
diff --git a/src/freedreno/ds/fd_pps_driver.h b/src/freedreno/ds/fd_pps_driver.h
index 28144be56c4..8a738e26dbd 100644
--- a/src/freedreno/ds/fd_pps_driver.h
+++ b/src/freedreno/ds/fd_pps_driver.h
@@ -32,7 +32,7 @@ public:
 private:
    struct fd_device *dev;
    struct fd_pipe *pipe;
-   uint32_t gpu_id;
+   const struct fd_dev_id *dev_id;
    uint32_t max_freq;
    uint32_t next_counter_id;
    uint32_t next_countable_id;
diff --git a/src/freedreno/ir3/ir3_compiler.c b/src/freedreno/ir3/ir3_compiler.c
index edcd3052b46..29a59052f99 100644
--- a/src/freedreno/ir3/ir3_compiler.c
+++ b/src/freedreno/ir3/ir3_compiler.c
@@ -69,7 +69,7 @@ ir3_compiler_destroy(struct ir3_compiler *compiler)
 }
 
 struct ir3_compiler *
-ir3_compiler_create(struct fd_device *dev, uint32_t gpu_id,
+ir3_compiler_create(struct fd_device *dev, const struct fd_dev_id *dev_id,
                     bool robust_ubo_access)
 {
    struct ir3_compiler *compiler = rzalloc(NULL, struct ir3_compiler);
@@ -83,8 +83,8 @@ ir3_compiler_create(struct fd_device *dev, uint32_t gpu_id,
    }
 
    compiler->dev = dev;
-   compiler->gpu_id = gpu_id;
-   compiler->gen = gpu_id / 100;
+   compiler->dev_id = dev_id;
+   compiler->gen = fd_dev_gen(dev_id);
    compiler->robust_ubo_access = robust_ubo_access;
 
    /* All known GPU's have 32k local memory (aka shared) */
@@ -124,7 +124,7 @@ ir3_compiler_create(struct fd_device *dev, uint32_t gpu_id,
       compiler->has_pvtmem = true;
 
       compiler->tess_use_shared =
-            fd_dev_info(compiler->gpu_id)->a6xx.tess_use_shared;
+            fd_dev_info(compiler->dev_id)->a6xx.tess_use_shared;
    } else {
       compiler->max_const_pipeline = 512;
       compiler->max_const_geom = 512;
@@ -139,7 +139,7 @@ ir3_compiler_create(struct fd_device *dev, uint32_t gpu_id,
 
    if (compiler->gen >= 6) {
       compiler->reg_size_vec4 =
-            fd_dev_info(compiler->gpu_id)->a6xx.reg_size_vec4;
+            fd_dev_info(compiler->dev_id)->a6xx.reg_size_vec4;
    } else if (compiler->gen >= 4) {
       /* On a4xx-a5xx, using r24.x and above requires using the smallest
        * threadsize.
diff --git a/src/freedreno/ir3/ir3_compiler.h b/src/freedreno/ir3/ir3_compiler.h
index d8e9f0c1205..cf2fe2ad221 100644
--- a/src/freedreno/ir3/ir3_compiler.h
+++ b/src/freedreno/ir3/ir3_compiler.h
@@ -30,6 +30,8 @@
 #include "util/disk_cache.h"
 #include "util/log.h"
 
+#include "freedreno_dev_info.h"
+
 #include "ir3.h"
 
 struct ir3_ra_reg_set;
@@ -37,7 +39,7 @@ struct ir3_shader;
 
 struct ir3_compiler {
    struct fd_device *dev;
-   uint32_t gpu_id;
+   const struct fd_dev_id *dev_id;
    uint8_t gen;
    uint32_t shader_count;
 
@@ -157,7 +159,8 @@ struct ir3_compiler {
 };
 
 void ir3_compiler_destroy(struct ir3_compiler *compiler);
-struct ir3_compiler *ir3_compiler_create(struct fd_device *dev, uint32_t gpu_id,
+struct ir3_compiler *ir3_compiler_create(struct fd_device *dev,
+                                         const struct fd_dev_id *dev_id,
                                          bool robust_ubo_access);
 
 void ir3_disk_cache_init(struct ir3_compiler *compiler);
@@ -175,7 +178,7 @@ int ir3_compile_shader_nir(struct ir3_compiler *compiler,
 static inline unsigned
 ir3_pointer_size(struct ir3_compiler *compiler)
 {
-   return (compiler->gpu_id >= 500) ? 2 : 1;
+   return fd_dev_64b(compiler->dev_id) ? 2 : 1;
 }
 
 enum ir3_shader_debug {
diff --git a/src/freedreno/ir3/ir3_disk_cache.c b/src/freedreno/ir3/ir3_disk_cache.c
index a3b4d010b90..65d40d7a460 100644
--- a/src/freedreno/ir3/ir3_disk_cache.c
+++ b/src/freedreno/ir3/ir3_disk_cache.c
@@ -51,12 +51,7 @@ ir3_disk_cache_init(struct ir3_compiler *compiler)
    if (ir3_shader_debug & IR3_DBG_NOCACHE)
       return;
 
-   /* array length = print length + nul char + 1 extra to verify it's unused */
-   char renderer[7];
-   ASSERTED int len =
-      snprintf(renderer, sizeof(renderer), "FD%03d", compiler->gpu_id);
-   assert(len == sizeof(renderer) - 2);
-
+   const char *renderer = fd_dev_name(compiler->dev_id);
    const struct build_id_note *note =
       build_id_find_nhdr_for_addr(ir3_disk_cache_init);
    assert(note && build_id_length(note) == 20); /* sha1 */
diff --git a/src/freedreno/ir3/ir3_shader.c b/src/freedreno/ir3/ir3_shader.c
index 2f4f33c738a..c6a7986fced 100644
--- a/src/freedreno/ir3/ir3_shader.c
+++ b/src/freedreno/ir3/ir3_shader.c
@@ -697,7 +697,7 @@ ir3_shader_disasm(struct ir3_shader_variant *so, uint32_t *bin, FILE *out)
 
    isa_decode(bin, so->info.sizedwords * 4, out,
               &(struct isa_decode_options){
-                 .gpu_id = ir->compiler->gpu_id,
+                 .gpu_id = fd_dev_gpu_id(ir->compiler->dev_id),
                  .show_errors = true,
                  .branch_labels = true,
               });
diff --git a/src/freedreno/ir3/tests/delay.c b/src/freedreno/ir3/tests/delay.c
index 252fd496db2..018ade53a96 100644
--- a/src/freedreno/ir3/tests/delay.c
+++ b/src/freedreno/ir3/tests/delay.c
@@ -146,7 +146,11 @@ main(int argc, char **argv)
    struct ir3_compiler *c;
    int result = 0;
 
-   c = ir3_compiler_create(NULL, 630, false);
+   struct fd_dev_id dev_id = {
+         .gpu_id = 630,
+   };
+
+   c = ir3_compiler_create(NULL, &dev_id, false);
 
    for (int i = 0; i < ARRAY_SIZE(tests); i++) {
       const struct test *test = &tests[i];
diff --git a/src/freedreno/ir3/tests/disasm.c b/src/freedreno/ir3/tests/disasm.c
index 24f643a98ce..aa376eabeb1 100644
--- a/src/freedreno/ir3/tests/disasm.c
+++ b/src/freedreno/ir3/tests/disasm.c
@@ -376,6 +376,7 @@ main(int argc, char **argv)
    }
 
    struct ir3_compiler *compilers[10] = {};
+   struct fd_dev_id dev_ids[ARRAY_SIZE(compilers)];
 
    for (int i = 0; i < ARRAY_SIZE(tests); i++) {
       const struct test *test = &tests[i];
@@ -417,7 +418,8 @@ main(int argc, char **argv)
 
       unsigned gen = test->gpu_id / 100;
       if (!compilers[gen]) {
-         compilers[gen] = ir3_compiler_create(NULL, test->gpu_id, false);
+         dev_ids[gen].gpu_id = test->gpu_id;
+         compilers[gen] = ir3_compiler_create(NULL, &dev_ids[gen], false);
       }
 
       FILE *fasm =
diff --git a/src/freedreno/perfcntrs/fdperf.c b/src/freedreno/perfcntrs/fdperf.c
index 5a97ab8dfc3..d11c73335e8 100644
--- a/src/freedreno/perfcntrs/fdperf.c
+++ b/src/freedreno/perfcntrs/fdperf.c
@@ -842,7 +842,10 @@ main(int argc, char **argv)
    find_device();
 
    const struct fd_perfcntr_group *groups;
-   groups = fd_perfcntrs((dev.chipid >> 24) * 100, &dev.ngroups);
+   struct fd_dev_id dev_id = {
+         .gpu_id = (dev.chipid >> 24) * 100,
+   };
+   groups = fd_perfcntrs(&dev_id, &dev.ngroups);
    if (!groups) {
       errx(1, "no perfcntr support");
    }
diff --git a/src/freedreno/perfcntrs/freedreno_perfcntr.c b/src/freedreno/perfcntrs/freedreno_perfcntr.c
index e3a88070461..494aaa770de 100644
--- a/src/freedreno/perfcntrs/freedreno_perfcntr.c
+++ b/src/freedreno/perfcntrs/freedreno_perfcntr.c
@@ -38,16 +38,16 @@ extern const struct fd_perfcntr_group a6xx_perfcntr_groups[];
 extern const unsigned a6xx_num_perfcntr_groups;
 
 const struct fd_perfcntr_group *
-fd_perfcntrs(unsigned gpu_id, unsigned *count)
+fd_perfcntrs(const struct fd_dev_id *id, unsigned *count)
 {
-   switch (gpu_id) {
-   case 200 ... 299:
+   switch (fd_dev_gen(id)) {
+   case 2:
       *count = a2xx_num_perfcntr_groups;
       return a2xx_perfcntr_groups;
-   case 500 ... 599:
+   case 5:
       *count = a5xx_num_perfcntr_groups;
       return a5xx_perfcntr_groups;
-   case 600 ... 699:
+   case 6:
       *count = a6xx_num_perfcntr_groups;
       return a6xx_perfcntr_groups;
    default:
diff --git a/src/freedreno/perfcntrs/freedreno_perfcntr.h b/src/freedreno/perfcntrs/freedreno_perfcntr.h
index 86c2be9bda9..7fe8fd4eb54 100644
--- a/src/freedreno/perfcntrs/freedreno_perfcntr.h
+++ b/src/freedreno/perfcntrs/freedreno_perfcntr.h
@@ -29,6 +29,8 @@
 
 #include "util/macros.h"
 
+#include "freedreno_dev_info.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -95,7 +97,7 @@ struct fd_perfcntr_group {
    const struct fd_perfcntr_countable *countables;
 };
 
-const struct fd_perfcntr_group *fd_perfcntrs(unsigned gpu_id, unsigned *count);
+const struct fd_perfcntr_group *fd_perfcntrs(const struct fd_dev_id *id, unsigned *count);
 
 #define COUNTER(_sel, _lo, _hi) {                                              \
       .select_reg = REG(_sel), .counter_reg_lo = REG(_lo),                     \
diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c
index b7119ca8f2e..1c174a553cb 100644
--- a/src/freedreno/vulkan/tu_device.c
+++ b/src/freedreno/vulkan/tu_device.c
@@ -193,15 +193,15 @@ tu_physical_device_init(struct tu_physical_device *device,
 {
    VkResult result = VK_SUCCESS;
 
-   device->name = fd_dev_name(device->gpu_id);
+   device->name = fd_dev_name(&device->dev_id);
 
-   const struct fd_dev_info *info = fd_dev_info(device->gpu_id);
+   const struct fd_dev_info *info = fd_dev_info(&device->dev_id);
    if (!info) {
       result = vk_startup_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
                                  "device %s is unsupported", device->name);
       return result;
    }
-   switch (device->gpu_id / 100) {
+   switch (fd_dev_gen(&device->dev_id)) {
    case 6:
       device->info = info;
       device->ccu_offset_bypass = device->info->num_ccu * A6XX_CCU_DEPTH_SIZE;
@@ -213,7 +213,7 @@ tu_physical_device_init(struct tu_physical_device *device,
                                  "device %s is unsupported", device->name);
       return result;
    }
-   if (tu_device_get_cache_uuid(device->gpu_id, device->cache_uuid)) {
+   if (tu_device_get_cache_uuid(fd_dev_gpu_id(&device->dev_id), device->cache_uuid)) {
       result = vk_startup_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
                                  "cannot generate UUID");
       return result;
@@ -229,7 +229,7 @@ tu_physical_device_init(struct tu_physical_device *device,
    vk_warn_non_conformant_implementation("tu");
 
    fd_get_driver_uuid(device->driver_uuid);
-   fd_get_device_uuid(device->device_uuid, device->gpu_id);
+   fd_get_device_uuid(device->device_uuid, &device->dev_id);
 
    struct vk_device_extension_table supported_extensions;
    get_device_extensions(device, &supported_extensions);
@@ -1328,7 +1328,7 @@ tu_CreateDevice(VkPhysicalDevice physicalDevice,
       }
    }
 
-   device->compiler = ir3_compiler_create(NULL, physical_device->gpu_id,
+   device->compiler = ir3_compiler_create(NULL, &physical_device->dev_id,
                                           robust_buffer_access2);
    if (!device->compiler) {
       result = vk_startup_errorf(physical_device->instance,
diff --git a/src/freedreno/vulkan/tu_drm.c b/src/freedreno/vulkan/tu_drm.c
index 7a166cff047..36d8fd34a33 100644
--- a/src/freedreno/vulkan/tu_drm.c
+++ b/src/freedreno/vulkan/tu_drm.c
@@ -445,7 +445,7 @@ tu_drm_device_init(struct tu_physical_device *device,
    device->master_fd = master_fd;
    device->local_fd = fd;
 
-   if (tu_drm_get_gpu_id(device, &device->gpu_id)) {
+   if (tu_drm_get_gpu_id(device, &device->dev_id.gpu_id)) {
       result = vk_startup_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
                                  "could not get GPU ID");
       goto fail;
diff --git a/src/freedreno/vulkan/tu_kgsl.c b/src/freedreno/vulkan/tu_kgsl.c
index ea65c66525f..49651cdec9f 100644
--- a/src/freedreno/vulkan/tu_kgsl.c
+++ b/src/freedreno/vulkan/tu_kgsl.c
@@ -239,7 +239,7 @@ tu_enumerate_devices(struct tu_instance *instance)
    device->master_fd = -1;
    device->local_fd = fd;
 
-   device->gpu_id =
+   device->dev_id.gpu_id =
       ((info.chip_id >> 24) & 0xff) * 100 +
       ((info.chip_id >> 16) & 0xff) * 10 +
       ((info.chip_id >>  8) & 0xff);
diff --git a/src/freedreno/vulkan/tu_private.h b/src/freedreno/vulkan/tu_private.h
index 5400072c859..9c867c916ff 100644
--- a/src/freedreno/vulkan/tu_private.h
+++ b/src/freedreno/vulkan/tu_private.h
@@ -204,12 +204,12 @@ struct tu_physical_device
    int local_fd;
    int master_fd;
 
-   unsigned gpu_id;
    uint32_t gmem_size;
    uint64_t gmem_base;
    uint32_t ccu_offset_gmem;
    uint32_t ccu_offset_bypass;
 
+   struct fd_dev_id dev_id;
    const struct fd_dev_info *info;
 
    int msm_major_version;
diff --git a/src/freedreno/vulkan/tu_query.c b/src/freedreno/vulkan/tu_query.c
index b87b172f656..11be8f9dcf3 100644
--- a/src/freedreno/vulkan/tu_query.c
+++ b/src/freedreno/vulkan/tu_query.c
@@ -268,7 +268,7 @@ tu_CreateQueryPool(VkDevice _device,
       return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
 
    if (pCreateInfo->queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
-      pool->perf_group = fd_perfcntrs(device->physical_device->gpu_id,
+      pool->perf_group = fd_perfcntrs(&device->physical_device->dev_id,
                                       &pool->perf_group_count);
 
       pool->counter_index_count = perf_query_info->counterIndexCount;
@@ -1422,7 +1422,7 @@ tu_EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
    uint32_t desc_count = *pCounterCount;
    uint32_t group_count;
    const struct fd_perfcntr_group *group =
-         fd_perfcntrs(phydev->gpu_id, &group_count);
+         fd_perfcntrs(&phydev->dev_id, &group_count);
 
    VK_OUTARRAY_MAKE(out, pCounters, pCounterCount);
    VK_OUTARRAY_MAKE(out_desc, pCounterDescriptions, &desc_count);
@@ -1470,7 +1470,7 @@ tu_GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
    uint32_t group_count = 0;
    uint32_t gid = 0, cid = 0, n_passes;
    const struct fd_perfcntr_group *group =
-         fd_perfcntrs(phydev->gpu_id, &group_count);
+         fd_perfcntrs(&phydev->dev_id, &group_count);
 
    uint32_t counters_requested[group_count];
    memset(counters_requested, 0x0, sizeof(counters_requested));
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
index 00fd10b6d28..5b31c771750 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -108,7 +108,7 @@ bool fd_binning_enabled = true;
 static const char *
 fd_screen_get_name(struct pipe_screen *pscreen)
 {
-   return fd_dev_name(fd_screen(pscreen)->gpu_id);
+   return fd_dev_name(fd_screen(pscreen)->dev_id);
 }
 
 static const char *
@@ -914,7 +914,7 @@ fd_screen_get_device_uuid(struct pipe_screen *pscreen, char *uuid)
 {
    struct fd_screen *screen = fd_screen(pscreen);
 
-   fd_get_device_uuid(uuid, screen->gpu_id);
+   fd_get_device_uuid(uuid, screen->dev_id);
 }
 
 static void
@@ -978,6 +978,8 @@ fd_screen_create(struct fd_device *dev, struct renderonly *ro,
          screen->has_timestamp = true;
    }
 
+   screen->dev_id = fd_pipe_dev_id(screen->pipe);
+
    if (fd_pipe_get_param(screen->pipe, FD_GPU_ID, &val)) {
       DBG("could not get gpu-id");
       goto fail;
@@ -995,7 +997,7 @@ fd_screen_create(struct fd_device *dev, struct renderonly *ro,
             ((core & 0xff) << 24);
    }
    screen->chip_id = val;
-   screen->gen = screen->chip_id >> 24;
+   screen->gen = fd_dev_gen(screen->dev_id);
 
    if (fd_pipe_get_param(screen->pipe, FD_NR_RINGS, &val)) {
       DBG("could not get # of rings");
@@ -1012,18 +1014,18 @@ fd_screen_create(struct fd_device *dev, struct renderonly *ro,
 
    /* parse driconf configuration now for device specific overrides: */
    driParseConfigFiles(config->options, config->options_info, 0, "msm",
-                       NULL, fd_dev_name(screen->gpu_id), NULL, 0, NULL, 0);
+                       NULL, fd_dev_name(screen->dev_id), NULL, 0, NULL, 0);
 
    struct sysinfo si;
    sysinfo(&si);
    screen->ram_size = si.totalram;
 
    DBG("Pipe Info:");
-   DBG(" GPU-id:          %d", screen->gpu_id);
+   DBG(" GPU-id:          %s", fd_dev_name(screen->dev_id));
    DBG(" Chip-id:         0x%08x", screen->chip_id);
    DBG(" GMEM size:       0x%08x", screen->gmemsize_bytes);
 
-   const struct fd_dev_info *info = fd_dev_info(screen->gpu_id);
+   const struct fd_dev_info *info = fd_dev_info(screen->dev_id);
    if (!info) {
       mesa_loge("unsupported GPU: a%03d", screen->gpu_id);
       goto fail;
@@ -1071,7 +1073,7 @@ fd_screen_create(struct fd_device *dev, struct renderonly *ro,
 
    if (FD_DBG(PERFC)) {
       screen->perfcntr_groups =
-         fd_perfcntrs(screen->gpu_id, &screen->num_perfcntr_groups);
+         fd_perfcntrs(screen->dev_id, &screen->num_perfcntr_groups);
    }
 
    /* NOTE: don't enable if we have too old of a kernel to support
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.h b/src/gallium/drivers/freedreno/freedreno_screen.h
index d024ae95a2d..b3431a8f428 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.h
+++ b/src/gallium/drivers/freedreno/freedreno_screen.h
@@ -81,6 +81,7 @@ struct fd_screen {
    uint64_t gmem_base;
    uint32_t gmemsize_bytes;
 
+   const struct fd_dev_id *dev_id;
    uint8_t gen;      /* GPU (major) generation */
    uint32_t gpu_id;  /* 220, 305, etc */
    uint32_t chip_id; /* coreid:8 majorrev:8 minorrev:8 patch:8 */
diff --git a/src/gallium/drivers/freedreno/gmemtool.c b/src/gallium/drivers/freedreno/gmemtool.c
index a6b1d0b7c25..bb9ab7f41a6 100644
--- a/src/gallium/drivers/freedreno/gmemtool.c
+++ b/src/gallium/drivers/freedreno/gmemtool.c
@@ -159,15 +159,18 @@ main(int argc, char **argv)
       usage();
    }
 
+   struct fd_dev_id dev_id = {
+         .gpu_id = gpu_info->gpu_id,
+   };
    /* Setup a fake screen with enough GMEM related configuration
     * to make gmem_stateobj_init() happy:
     */
    struct fd_screen screen = {
-      .gpu_id = gpu_info->gpu_id,
+      .dev_id = &dev_id,
       .gmemsize_bytes = gpu_info->gmemsize_bytes,
    };
 
-   screen.info = fd_dev_info(gpu_info->gpu_id);
+   screen.info = fd_dev_info(&dev_id);
 
    /* And finally run thru all the GMEM keys: */
    for (int i = 0; i < ARRAY_SIZE(keys); i++) {
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c b/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c
index f713e2cb431..3a33f1535ec 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c
@@ -362,7 +362,10 @@ main(int argc, char **argv)
 
    nir_shader *nir;
 
-   compiler = ir3_compiler_create(NULL, gpu_id, false);
+   struct fd_dev_id dev_id = {
+         .gpu_id = gpu_id,
+   };
+   compiler = ir3_compiler_create(NULL, &dev_id, false);
 
    if (from_tgsi) {
       struct tgsi_token toks[65536];
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_gallium.c b/src/gallium/drivers/freedreno/ir3/ir3_gallium.c
index 32d2d725c16..d3674c24a87 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_gallium.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_gallium.c
@@ -515,7 +515,7 @@ ir3_screen_init(struct pipe_screen *pscreen)
 {
    struct fd_screen *screen = fd_screen(pscreen);
 
-   screen->compiler = ir3_compiler_create(screen->dev, screen->gpu_id, false);
+   screen->compiler = ir3_compiler_create(screen->dev, screen->dev_id, false);
 
    /* TODO do we want to limit things to # of fast cores, or just limit
     * based on total # of both big and little cores.  The little cores



More information about the mesa-commit mailing list