[PATCH libdrm 3/3] amdgpu: Only remember the device's marketing name

Alex Deucher alexdeucher at gmail.com
Mon Dec 4 19:41:41 UTC 2017


On Fri, Dec 1, 2017 at 11:56 AM, Michel Dänzer <michel at daenzer.net> wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> There's no point in keeping around the full table of marketing names,
> when amdgpu_get_marketing_name only ever returns the device's marketing
> name.
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>

Series is:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  amdgpu/Android.mk        |  3 +-
>  amdgpu/Makefile.am       |  5 +--
>  amdgpu/amdgpu_asic_id.c  | 88 ++++++++++++------------------------------------
>  amdgpu/amdgpu_device.c   | 23 ++-----------
>  amdgpu/amdgpu_internal.h | 11 ++----
>  5 files changed, 28 insertions(+), 102 deletions(-)
>
> diff --git a/amdgpu/Android.mk b/amdgpu/Android.mk
> index ce273019..1f028d0b 100644
> --- a/amdgpu/Android.mk
> +++ b/amdgpu/Android.mk
> @@ -11,8 +11,7 @@ LOCAL_SHARED_LIBRARIES := libdrm
>  LOCAL_SRC_FILES := $(LIBDRM_AMDGPU_FILES)
>
>  LOCAL_CFLAGS := \
> -       -DAMDGPU_ASIC_ID_TABLE=\"/vendor/etc/hwdata/amdgpu.ids\" \
> -       -DAMDGPU_ASIC_ID_TABLE_NUM_ENTRIES=$(shell egrep -ci '^[0-9a-f]{4},.*[0-9a-f]+,' $(LIBDRM_TOP)/data/amdgpu.ids)
> +       -DAMDGPU_ASIC_ID_TABLE=\"/vendor/etc/hwdata/amdgpu.ids\"
>
>  LOCAL_REQUIRED_MODULES := amdgpu.ids
>
> diff --git a/amdgpu/Makefile.am b/amdgpu/Makefile.am
> index 66f6f676..a1b0d05c 100644
> --- a/amdgpu/Makefile.am
> +++ b/amdgpu/Makefile.am
> @@ -31,10 +31,7 @@ AM_CFLAGS = \
>         -I$(top_srcdir)/include/drm
>
>  libdrmdatadir = @libdrmdatadir@
> -ASIC_ID_TABLE_NUM_ENTRIES := $(shell egrep -ci '^[0-9a-f]{4},.*[0-9a-f]+,' \
> -       $(top_srcdir)/data/amdgpu.ids)
> -AM_CPPFLAGS = -DAMDGPU_ASIC_ID_TABLE=\"${libdrmdatadir}/amdgpu.ids\" \
> -       -DAMDGPU_ASIC_ID_TABLE_NUM_ENTRIES=$(ASIC_ID_TABLE_NUM_ENTRIES)
> +AM_CPPFLAGS = -DAMDGPU_ASIC_ID_TABLE=\"${libdrmdatadir}/amdgpu.ids\"
>
>  libdrm_amdgpu_la_LTLIBRARIES = libdrm_amdgpu.la
>  libdrm_amdgpu_ladir = $(libdir)
> diff --git a/amdgpu/amdgpu_asic_id.c b/amdgpu/amdgpu_asic_id.c
> index 0b5f2962..0c8925e5 100644
> --- a/amdgpu/amdgpu_asic_id.c
> +++ b/amdgpu/amdgpu_asic_id.c
> @@ -38,11 +38,13 @@
>  #include "amdgpu_drm.h"
>  #include "amdgpu_internal.h"
>
> -static int parse_one_line(const char *line, struct amdgpu_asic_id *id)
> +static int parse_one_line(struct amdgpu_device *dev, const char *line)
>  {
>         char *buf, *saveptr;
>         char *s_did;
> +       uint32_t did;
>         char *s_rid;
> +       uint32_t rid;
>         char *s_name;
>         char *endptr;
>         int r = -EINVAL;
> @@ -60,19 +62,29 @@ static int parse_one_line(const char *line, struct amdgpu_asic_id *id)
>         if (!s_did)
>                 goto out;
>
> -       id->did = strtol(s_did, &endptr, 16);
> +       did = strtol(s_did, &endptr, 16);
>         if (*endptr)
>                 goto out;
>
> +       if (did != dev->info.asic_id) {
> +               r = -EAGAIN;
> +               goto out;
> +       }
> +
>         /* revision id */
>         s_rid = strtok_r(NULL, ",", &saveptr);
>         if (!s_rid)
>                 goto out;
>
> -       id->rid = strtol(s_rid, &endptr, 16);
> +       rid = strtol(s_rid, &endptr, 16);
>         if (*endptr)
>                 goto out;
>
> +       if (rid != dev->info.pci_rev_id) {
> +               r = -EAGAIN;
> +               goto out;
> +       }
> +
>         /* marketing name */
>         s_name = strtok_r(NULL, ",", &saveptr);
>         if (!s_name)
> @@ -84,8 +96,8 @@ static int parse_one_line(const char *line, struct amdgpu_asic_id *id)
>         if (strlen(s_name) == 0)
>                 goto out;
>
> -       id->marketing_name = strdup(s_name);
> -       if (id->marketing_name)
> +       dev->marketing_name = strdup(s_name);
> +       if (dev->marketing_name)
>                 r = 0;
>         else
>                 r = -ENOMEM;
> @@ -96,17 +108,13 @@ out:
>         return r;
>  }
>
> -void amdgpu_parse_asic_ids(struct amdgpu_asic_id **p_asic_id_table)
> +void amdgpu_parse_asic_ids(struct amdgpu_device *dev)
>  {
> -       struct amdgpu_asic_id *asic_id_table;
> -       struct amdgpu_asic_id *id;
>         FILE *fp;
>         char *line = NULL;
>         size_t len = 0;
>         ssize_t n;
>         int line_num = 1;
> -       size_t table_size = 0;
> -       size_t table_max_size = AMDGPU_ASIC_ID_TABLE_NUM_ENTRIES;
>         int r = 0;
>
>         fp = fopen(AMDGPU_ASIC_ID_TABLE, "r");
> @@ -116,13 +124,6 @@ void amdgpu_parse_asic_ids(struct amdgpu_asic_id **p_asic_id_table)
>                 return;
>         }
>
> -       asic_id_table = calloc(table_max_size + 1,
> -                              sizeof(struct amdgpu_asic_id));
> -       if (!asic_id_table) {
> -               r = -ENOMEM;
> -               goto close;
> -       }
> -
>         /* 1st valid line is file version */
>         while ((n = getline(&line, &len, fp)) != -1) {
>                 /* trim trailing newline */
> @@ -140,52 +141,17 @@ void amdgpu_parse_asic_ids(struct amdgpu_asic_id **p_asic_id_table)
>         }
>
>         while ((n = getline(&line, &len, fp)) != -1) {
> -               if (table_size > table_max_size) {
> -                       /* double table size */
> -                       table_max_size *= 2;
> -                       id = realloc(asic_id_table, (table_max_size + 1) *
> -                                    sizeof(struct amdgpu_asic_id));
> -                       if (!id) {
> -                               r = -ENOMEM;
> -                               goto free;
> -                       }
> -                        asic_id_table = id;
> -               }
> -
> -               id = asic_id_table + table_size;
> -
>                 /* trim trailing newline */
>                 if (line[n - 1] == '\n')
>                         line[n - 1] = '\0';
>
> -               r = parse_one_line(line, id);
> -               if (r) {
> -                       if (r == -EAGAIN) {
> -                               line_num++;
> -                               continue;
> -                       }
> -                       goto free;
> -               }
> +               r = parse_one_line(dev, line);
> +               if (r != -EAGAIN)
> +                       break;
>
>                 line_num++;
> -               table_size++;
>         }
>
> -       if (table_size != table_max_size) {
> -               id = realloc(asic_id_table, (table_size + 1) *
> -                            sizeof(struct amdgpu_asic_id));
> -               if (!id) {
> -                       r = -ENOMEM;
> -                       goto free;
> -               }
> -               asic_id_table = id;
> -        }
> -
> -       /* end of table */
> -       id = asic_id_table + table_size;
> -       memset(id, 0, sizeof(struct amdgpu_asic_id));
> -
> -free:
>         if (r == -EINVAL) {
>                 fprintf(stderr, "Invalid format: %s: line %d: %s\n",
>                         AMDGPU_ASIC_ID_TABLE, line_num, line);
> @@ -195,17 +161,5 @@ free:
>         }
>
>         free(line);
> -
> -       if (r && asic_id_table) {
> -               while (table_size--) {
> -                       id = asic_id_table + table_size;
> -                       free(id->marketing_name);
> -               }
> -               free(asic_id_table);
> -               asic_id_table = NULL;
> -       }
> -close:
>         fclose(fp);
> -
> -       *p_asic_id_table = asic_id_table;
>  }
> diff --git a/amdgpu/amdgpu_device.c b/amdgpu/amdgpu_device.c
> index e7aaf4fc..eb4b2745 100644
> --- a/amdgpu/amdgpu_device.c
> +++ b/amdgpu/amdgpu_device.c
> @@ -130,7 +130,6 @@ static int amdgpu_get_auth(int fd, int *auth)
>
>  static void amdgpu_device_free_internal(amdgpu_device_handle dev)
>  {
> -       const struct amdgpu_asic_id *id;
>         amdgpu_vamgr_deinit(&dev->vamgr_32);
>         amdgpu_vamgr_deinit(&dev->vamgr);
>         util_hash_table_destroy(dev->bo_flink_names);
> @@ -140,12 +139,7 @@ static void amdgpu_device_free_internal(amdgpu_device_handle dev)
>         close(dev->fd);
>         if ((dev->flink_fd >= 0) && (dev->fd != dev->flink_fd))
>                 close(dev->flink_fd);
> -       if (dev->asic_ids) {
> -               for (id = dev->asic_ids; id->did; id++)
> -                       free(id->marketing_name);
> -
> -               free(dev->asic_ids);
> -       }
> +       free(dev->marketing_name);
>         free(dev);
>  }
>
> @@ -280,7 +274,7 @@ int amdgpu_device_initialize(int fd,
>         amdgpu_vamgr_init(&dev->vamgr, start, max,
>                           dev->dev_info.virtual_address_alignment);
>
> -       amdgpu_parse_asic_ids(&dev->asic_ids);
> +       amdgpu_parse_asic_ids(dev);
>
>         *major_version = dev->major_version;
>         *minor_version = dev->minor_version;
> @@ -306,16 +300,5 @@ int amdgpu_device_deinitialize(amdgpu_device_handle dev)
>
>  const char *amdgpu_get_marketing_name(amdgpu_device_handle dev)
>  {
> -       const struct amdgpu_asic_id *id;
> -
> -       if (!dev->asic_ids)
> -               return NULL;
> -
> -       for (id = dev->asic_ids; id->did; id++) {
> -               if ((id->did == dev->info.asic_id) &&
> -                   (id->rid == dev->info.pci_rev_id))
> -                       return id->marketing_name;
> -       }
> -
> -       return NULL;
> +       return dev->marketing_name;
>  }
> diff --git a/amdgpu/amdgpu_internal.h b/amdgpu/amdgpu_internal.h
> index 1aff7f8e..3e044f11 100644
> --- a/amdgpu/amdgpu_internal.h
> +++ b/amdgpu/amdgpu_internal.h
> @@ -69,12 +69,6 @@ struct amdgpu_va {
>         struct amdgpu_bo_va_mgr *vamgr;
>  };
>
> -struct amdgpu_asic_id {
> -       uint32_t did;
> -       uint32_t rid;
> -       char *marketing_name;
> -};
> -
>  struct amdgpu_device {
>         atomic_t refcount;
>         int fd;
> @@ -82,8 +76,7 @@ struct amdgpu_device {
>         unsigned major_version;
>         unsigned minor_version;
>
> -       /** Lookup table of asic device id, revision id and marketing name */
> -       struct amdgpu_asic_id *asic_ids;
> +       char *marketing_name;
>         /** List of buffer handles. Protected by bo_table_mutex. */
>         struct util_hash_table *bo_handles;
>         /** List of buffer GEM flink names. Protected by bo_table_mutex. */
> @@ -148,7 +141,7 @@ drm_private void amdgpu_vamgr_init(struct amdgpu_bo_va_mgr *mgr, uint64_t start,
>
>  drm_private void amdgpu_vamgr_deinit(struct amdgpu_bo_va_mgr *mgr);
>
> -drm_private void amdgpu_parse_asic_ids(struct amdgpu_asic_id **asic_ids);
> +drm_private void amdgpu_parse_asic_ids(struct amdgpu_device *dev);
>
>  drm_private int amdgpu_query_gpu_info_init(amdgpu_device_handle dev);
>
> --
> 2.15.0
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list