*
*/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#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;
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)
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;
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");
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 */
}
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);
- } else if (r) {
+ } else if (r && r != -EAGAIN) {
fprintf(stderr, "%s: Cannot parse ASIC IDs: %s\n",
__func__, strerror(-r));
}
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;
}