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
parent
5219809a32
commit
f05a2b4cb1
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue