xref: /aosp_15_r20/external/libdrm/amdgpu/amdgpu_asic_id.c (revision 7688df22e49036ff52a766b7101da3a49edadb8c)
1*7688df22SAndroid Build Coastguard Worker /*
2*7688df22SAndroid Build Coastguard Worker  * Copyright © 2017 Advanced Micro Devices, Inc.
3*7688df22SAndroid Build Coastguard Worker  * All Rights Reserved.
4*7688df22SAndroid Build Coastguard Worker  *
5*7688df22SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
6*7688df22SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
7*7688df22SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
8*7688df22SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*7688df22SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
10*7688df22SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
11*7688df22SAndroid Build Coastguard Worker  *
12*7688df22SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included in
13*7688df22SAndroid Build Coastguard Worker  * all copies or substantial portions of the Software.
14*7688df22SAndroid Build Coastguard Worker  *
15*7688df22SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*7688df22SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*7688df22SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*7688df22SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19*7688df22SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20*7688df22SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21*7688df22SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
22*7688df22SAndroid Build Coastguard Worker  *
23*7688df22SAndroid Build Coastguard Worker  */
24*7688df22SAndroid Build Coastguard Worker 
25*7688df22SAndroid Build Coastguard Worker #include <ctype.h>
26*7688df22SAndroid Build Coastguard Worker #include <stdio.h>
27*7688df22SAndroid Build Coastguard Worker #include <stdlib.h>
28*7688df22SAndroid Build Coastguard Worker #include <stdint.h>
29*7688df22SAndroid Build Coastguard Worker #include <string.h>
30*7688df22SAndroid Build Coastguard Worker #include <unistd.h>
31*7688df22SAndroid Build Coastguard Worker #include <errno.h>
32*7688df22SAndroid Build Coastguard Worker 
33*7688df22SAndroid Build Coastguard Worker #include "xf86drm.h"
34*7688df22SAndroid Build Coastguard Worker #include "amdgpu_drm.h"
35*7688df22SAndroid Build Coastguard Worker #include "amdgpu_internal.h"
36*7688df22SAndroid Build Coastguard Worker 
parse_one_line(struct amdgpu_device * dev,const char * line)37*7688df22SAndroid Build Coastguard Worker static int parse_one_line(struct amdgpu_device *dev, const char *line)
38*7688df22SAndroid Build Coastguard Worker {
39*7688df22SAndroid Build Coastguard Worker 	char *buf, *saveptr;
40*7688df22SAndroid Build Coastguard Worker 	char *s_did;
41*7688df22SAndroid Build Coastguard Worker 	uint32_t did;
42*7688df22SAndroid Build Coastguard Worker 	char *s_rid;
43*7688df22SAndroid Build Coastguard Worker 	uint32_t rid;
44*7688df22SAndroid Build Coastguard Worker 	char *s_name;
45*7688df22SAndroid Build Coastguard Worker 	char *endptr;
46*7688df22SAndroid Build Coastguard Worker 	int r = -EINVAL;
47*7688df22SAndroid Build Coastguard Worker 
48*7688df22SAndroid Build Coastguard Worker 	/* ignore empty line and commented line */
49*7688df22SAndroid Build Coastguard Worker 	if (strlen(line) == 0 || line[0] == '#')
50*7688df22SAndroid Build Coastguard Worker 		return -EAGAIN;
51*7688df22SAndroid Build Coastguard Worker 
52*7688df22SAndroid Build Coastguard Worker 	buf = strdup(line);
53*7688df22SAndroid Build Coastguard Worker 	if (!buf)
54*7688df22SAndroid Build Coastguard Worker 		return -ENOMEM;
55*7688df22SAndroid Build Coastguard Worker 
56*7688df22SAndroid Build Coastguard Worker 	/* device id */
57*7688df22SAndroid Build Coastguard Worker 	s_did = strtok_r(buf, ",", &saveptr);
58*7688df22SAndroid Build Coastguard Worker 	if (!s_did)
59*7688df22SAndroid Build Coastguard Worker 		goto out;
60*7688df22SAndroid Build Coastguard Worker 
61*7688df22SAndroid Build Coastguard Worker 	did = strtol(s_did, &endptr, 16);
62*7688df22SAndroid Build Coastguard Worker 	if (*endptr)
63*7688df22SAndroid Build Coastguard Worker 		goto out;
64*7688df22SAndroid Build Coastguard Worker 
65*7688df22SAndroid Build Coastguard Worker 	if (did != dev->info.asic_id) {
66*7688df22SAndroid Build Coastguard Worker 		r = -EAGAIN;
67*7688df22SAndroid Build Coastguard Worker 		goto out;
68*7688df22SAndroid Build Coastguard Worker 	}
69*7688df22SAndroid Build Coastguard Worker 
70*7688df22SAndroid Build Coastguard Worker 	/* revision id */
71*7688df22SAndroid Build Coastguard Worker 	s_rid = strtok_r(NULL, ",", &saveptr);
72*7688df22SAndroid Build Coastguard Worker 	if (!s_rid)
73*7688df22SAndroid Build Coastguard Worker 		goto out;
74*7688df22SAndroid Build Coastguard Worker 
75*7688df22SAndroid Build Coastguard Worker 	rid = strtol(s_rid, &endptr, 16);
76*7688df22SAndroid Build Coastguard Worker 	if (*endptr)
77*7688df22SAndroid Build Coastguard Worker 		goto out;
78*7688df22SAndroid Build Coastguard Worker 
79*7688df22SAndroid Build Coastguard Worker 	if (rid != dev->info.pci_rev_id) {
80*7688df22SAndroid Build Coastguard Worker 		r = -EAGAIN;
81*7688df22SAndroid Build Coastguard Worker 		goto out;
82*7688df22SAndroid Build Coastguard Worker 	}
83*7688df22SAndroid Build Coastguard Worker 
84*7688df22SAndroid Build Coastguard Worker 	/* marketing name */
85*7688df22SAndroid Build Coastguard Worker 	s_name = strtok_r(NULL, ",", &saveptr);
86*7688df22SAndroid Build Coastguard Worker 	if (!s_name)
87*7688df22SAndroid Build Coastguard Worker 		goto out;
88*7688df22SAndroid Build Coastguard Worker 
89*7688df22SAndroid Build Coastguard Worker 	/* trim leading whitespaces or tabs */
90*7688df22SAndroid Build Coastguard Worker 	while (isblank(*s_name))
91*7688df22SAndroid Build Coastguard Worker 		s_name++;
92*7688df22SAndroid Build Coastguard Worker 	if (strlen(s_name) == 0)
93*7688df22SAndroid Build Coastguard Worker 		goto out;
94*7688df22SAndroid Build Coastguard Worker 
95*7688df22SAndroid Build Coastguard Worker 	dev->marketing_name = strdup(s_name);
96*7688df22SAndroid Build Coastguard Worker 	if (dev->marketing_name)
97*7688df22SAndroid Build Coastguard Worker 		r = 0;
98*7688df22SAndroid Build Coastguard Worker 	else
99*7688df22SAndroid Build Coastguard Worker 		r = -ENOMEM;
100*7688df22SAndroid Build Coastguard Worker 
101*7688df22SAndroid Build Coastguard Worker out:
102*7688df22SAndroid Build Coastguard Worker 	free(buf);
103*7688df22SAndroid Build Coastguard Worker 
104*7688df22SAndroid Build Coastguard Worker 	return r;
105*7688df22SAndroid Build Coastguard Worker }
106*7688df22SAndroid Build Coastguard Worker 
amdgpu_parse_asic_ids(struct amdgpu_device * dev)107*7688df22SAndroid Build Coastguard Worker void amdgpu_parse_asic_ids(struct amdgpu_device *dev)
108*7688df22SAndroid Build Coastguard Worker {
109*7688df22SAndroid Build Coastguard Worker 	FILE *fp;
110*7688df22SAndroid Build Coastguard Worker 	char *line = NULL;
111*7688df22SAndroid Build Coastguard Worker 	size_t len = 0;
112*7688df22SAndroid Build Coastguard Worker 	ssize_t n;
113*7688df22SAndroid Build Coastguard Worker 	int line_num = 1;
114*7688df22SAndroid Build Coastguard Worker 	int r = 0;
115*7688df22SAndroid Build Coastguard Worker 
116*7688df22SAndroid Build Coastguard Worker 	fp = fopen(AMDGPU_ASIC_ID_TABLE, "r");
117*7688df22SAndroid Build Coastguard Worker 	if (!fp) {
118*7688df22SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: %s\n", AMDGPU_ASIC_ID_TABLE,
119*7688df22SAndroid Build Coastguard Worker 			strerror(errno));
120*7688df22SAndroid Build Coastguard Worker 		return;
121*7688df22SAndroid Build Coastguard Worker 	}
122*7688df22SAndroid Build Coastguard Worker 
123*7688df22SAndroid Build Coastguard Worker 	/* 1st valid line is file version */
124*7688df22SAndroid Build Coastguard Worker 	while ((n = getline(&line, &len, fp)) != -1) {
125*7688df22SAndroid Build Coastguard Worker 		/* trim trailing newline */
126*7688df22SAndroid Build Coastguard Worker 		if (line[n - 1] == '\n')
127*7688df22SAndroid Build Coastguard Worker 			line[n - 1] = '\0';
128*7688df22SAndroid Build Coastguard Worker 
129*7688df22SAndroid Build Coastguard Worker 		/* ignore empty line and commented line */
130*7688df22SAndroid Build Coastguard Worker 		if (strlen(line) == 0 || line[0] == '#') {
131*7688df22SAndroid Build Coastguard Worker 			line_num++;
132*7688df22SAndroid Build Coastguard Worker 			continue;
133*7688df22SAndroid Build Coastguard Worker 		}
134*7688df22SAndroid Build Coastguard Worker 
135*7688df22SAndroid Build Coastguard Worker 		drmMsg("%s version: %s\n", AMDGPU_ASIC_ID_TABLE, line);
136*7688df22SAndroid Build Coastguard Worker 		break;
137*7688df22SAndroid Build Coastguard Worker 	}
138*7688df22SAndroid Build Coastguard Worker 
139*7688df22SAndroid Build Coastguard Worker 	while ((n = getline(&line, &len, fp)) != -1) {
140*7688df22SAndroid Build Coastguard Worker 		/* trim trailing newline */
141*7688df22SAndroid Build Coastguard Worker 		if (line[n - 1] == '\n')
142*7688df22SAndroid Build Coastguard Worker 			line[n - 1] = '\0';
143*7688df22SAndroid Build Coastguard Worker 
144*7688df22SAndroid Build Coastguard Worker 		r = parse_one_line(dev, line);
145*7688df22SAndroid Build Coastguard Worker 		if (r != -EAGAIN)
146*7688df22SAndroid Build Coastguard Worker 			break;
147*7688df22SAndroid Build Coastguard Worker 
148*7688df22SAndroid Build Coastguard Worker 		line_num++;
149*7688df22SAndroid Build Coastguard Worker 	}
150*7688df22SAndroid Build Coastguard Worker 
151*7688df22SAndroid Build Coastguard Worker 	if (r == -EINVAL) {
152*7688df22SAndroid Build Coastguard Worker 		fprintf(stderr, "Invalid format: %s: line %d: %s\n",
153*7688df22SAndroid Build Coastguard Worker 			AMDGPU_ASIC_ID_TABLE, line_num, line);
154*7688df22SAndroid Build Coastguard Worker 	} else if (r && r != -EAGAIN) {
155*7688df22SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Cannot parse ASIC IDs: %s\n",
156*7688df22SAndroid Build Coastguard Worker 			__func__, strerror(-r));
157*7688df22SAndroid Build Coastguard Worker 	}
158*7688df22SAndroid Build Coastguard Worker 
159*7688df22SAndroid Build Coastguard Worker 	free(line);
160*7688df22SAndroid Build Coastguard Worker 	fclose(fp);
161*7688df22SAndroid Build Coastguard Worker }
162