amdgpu: Only remember the device's marketing name

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.

Acked-by: Slava Abramov <slava.abramov@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
main
Michel Dänzer 2017-11-30 18:52:06 +01:00 committed by Michel Dänzer
parent 5219809a32
commit f05a2b4cb1
5 changed files with 28 additions and 102 deletions

View File

@ -11,8 +11,7 @@ LOCAL_SHARED_LIBRARIES := libdrm
LOCAL_SRC_FILES := $(LIBDRM_AMDGPU_FILES) LOCAL_SRC_FILES := $(LIBDRM_AMDGPU_FILES)
LOCAL_CFLAGS := \ LOCAL_CFLAGS := \
-DAMDGPU_ASIC_ID_TABLE=\"/vendor/etc/hwdata/amdgpu.ids\" \ -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)
LOCAL_REQUIRED_MODULES := amdgpu.ids LOCAL_REQUIRED_MODULES := amdgpu.ids

View File

@ -31,10 +31,7 @@ AM_CFLAGS = \
-I$(top_srcdir)/include/drm -I$(top_srcdir)/include/drm
libdrmdatadir = @libdrmdatadir@ libdrmdatadir = @libdrmdatadir@
ASIC_ID_TABLE_NUM_ENTRIES := $(shell egrep -ci '^[0-9a-f]{4},.*[0-9a-f]+,' \ AM_CPPFLAGS = -DAMDGPU_ASIC_ID_TABLE=\"${libdrmdatadir}/amdgpu.ids\"
$(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)
libdrm_amdgpu_la_LTLIBRARIES = libdrm_amdgpu.la libdrm_amdgpu_la_LTLIBRARIES = libdrm_amdgpu.la
libdrm_amdgpu_ladir = $(libdir) libdrm_amdgpu_ladir = $(libdir)

View File

@ -38,11 +38,13 @@
#include "amdgpu_drm.h" #include "amdgpu_drm.h"
#include "amdgpu_internal.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 *buf, *saveptr;
char *s_did; char *s_did;
uint32_t did;
char *s_rid; char *s_rid;
uint32_t rid;
char *s_name; char *s_name;
char *endptr; char *endptr;
int r = -EINVAL; int r = -EINVAL;
@ -60,19 +62,29 @@ static int parse_one_line(const char *line, struct amdgpu_asic_id *id)
if (!s_did) if (!s_did)
goto out; goto out;
id->did = strtol(s_did, &endptr, 16); did = strtol(s_did, &endptr, 16);
if (*endptr) if (*endptr)
goto out; goto out;
if (did != dev->info.asic_id) {
r = -EAGAIN;
goto out;
}
/* revision id */ /* revision id */
s_rid = strtok_r(NULL, ",", &saveptr); s_rid = strtok_r(NULL, ",", &saveptr);
if (!s_rid) if (!s_rid)
goto out; goto out;
id->rid = strtol(s_rid, &endptr, 16); rid = strtol(s_rid, &endptr, 16);
if (*endptr) if (*endptr)
goto out; goto out;
if (rid != dev->info.pci_rev_id) {
r = -EAGAIN;
goto out;
}
/* marketing name */ /* marketing name */
s_name = strtok_r(NULL, ",", &saveptr); s_name = strtok_r(NULL, ",", &saveptr);
if (!s_name) 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) if (strlen(s_name) == 0)
goto out; goto out;
id->marketing_name = strdup(s_name); dev->marketing_name = strdup(s_name);
if (id->marketing_name) if (dev->marketing_name)
r = 0; r = 0;
else else
r = -ENOMEM; r = -ENOMEM;
@ -96,17 +108,13 @@ out:
return r; 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; FILE *fp;
char *line = NULL; char *line = NULL;
size_t len = 0; size_t len = 0;
ssize_t n; ssize_t n;
int line_num = 1; int line_num = 1;
size_t table_size = 0;
size_t table_max_size = AMDGPU_ASIC_ID_TABLE_NUM_ENTRIES;
int r = 0; int r = 0;
fp = fopen(AMDGPU_ASIC_ID_TABLE, "r"); 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; 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 */ /* 1st valid line is file version */
while ((n = getline(&line, &len, fp)) != -1) { while ((n = getline(&line, &len, fp)) != -1) {
/* trim trailing newline */ /* 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) { 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 */ /* trim trailing newline */
if (line[n - 1] == '\n') if (line[n - 1] == '\n')
line[n - 1] = '\0'; line[n - 1] = '\0';
r = parse_one_line(line, id); r = parse_one_line(dev, line);
if (r) { if (r != -EAGAIN)
if (r == -EAGAIN) { break;
line_num++;
continue;
}
goto free;
}
line_num++; 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) { if (r == -EINVAL) {
fprintf(stderr, "Invalid format: %s: line %d: %s\n", fprintf(stderr, "Invalid format: %s: line %d: %s\n",
AMDGPU_ASIC_ID_TABLE, line_num, line); AMDGPU_ASIC_ID_TABLE, line_num, line);
@ -195,17 +161,5 @@ free:
} }
free(line); 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); fclose(fp);
*p_asic_id_table = asic_id_table;
} }

View File

@ -130,7 +130,6 @@ static int amdgpu_get_auth(int fd, int *auth)
static void amdgpu_device_free_internal(amdgpu_device_handle dev) 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_32);
amdgpu_vamgr_deinit(&dev->vamgr); amdgpu_vamgr_deinit(&dev->vamgr);
util_hash_table_destroy(dev->bo_flink_names); 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); close(dev->fd);
if ((dev->flink_fd >= 0) && (dev->fd != dev->flink_fd)) if ((dev->flink_fd >= 0) && (dev->fd != dev->flink_fd))
close(dev->flink_fd); close(dev->flink_fd);
if (dev->asic_ids) { free(dev->marketing_name);
for (id = dev->asic_ids; id->did; id++)
free(id->marketing_name);
free(dev->asic_ids);
}
free(dev); free(dev);
} }
@ -280,7 +274,7 @@ int amdgpu_device_initialize(int fd,
amdgpu_vamgr_init(&dev->vamgr, start, max, amdgpu_vamgr_init(&dev->vamgr, start, max,
dev->dev_info.virtual_address_alignment); dev->dev_info.virtual_address_alignment);
amdgpu_parse_asic_ids(&dev->asic_ids); amdgpu_parse_asic_ids(dev);
*major_version = dev->major_version; *major_version = dev->major_version;
*minor_version = dev->minor_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 char *amdgpu_get_marketing_name(amdgpu_device_handle dev)
{ {
const struct amdgpu_asic_id *id; return dev->marketing_name;
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;
} }

View File

@ -69,12 +69,6 @@ struct amdgpu_va {
struct amdgpu_bo_va_mgr *vamgr; struct amdgpu_bo_va_mgr *vamgr;
}; };
struct amdgpu_asic_id {
uint32_t did;
uint32_t rid;
char *marketing_name;
};
struct amdgpu_device { struct amdgpu_device {
atomic_t refcount; atomic_t refcount;
int fd; int fd;
@ -82,8 +76,7 @@ struct amdgpu_device {
unsigned major_version; unsigned major_version;
unsigned minor_version; unsigned minor_version;
/** Lookup table of asic device id, revision id and marketing name */ char *marketing_name;
struct amdgpu_asic_id *asic_ids;
/** List of buffer handles. Protected by bo_table_mutex. */ /** List of buffer handles. Protected by bo_table_mutex. */
struct util_hash_table *bo_handles; struct util_hash_table *bo_handles;
/** List of buffer GEM flink names. Protected by bo_table_mutex. */ /** 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_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); drm_private int amdgpu_query_gpu_info_init(amdgpu_device_handle dev);