xref: /aosp_15_r20/external/mesa3d/src/freedreno/decode/rnnutil.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
2*61046927SAndroid Build Coastguard Worker 
3*61046927SAndroid Build Coastguard Worker /*
4*61046927SAndroid Build Coastguard Worker  * Copyright © 2014 Rob Clark <[email protected]>
5*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
6*61046927SAndroid Build Coastguard Worker  *
7*61046927SAndroid Build Coastguard Worker  * Authors:
8*61046927SAndroid Build Coastguard Worker  *    Rob Clark <[email protected]>
9*61046927SAndroid Build Coastguard Worker  */
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #include <assert.h>
12*61046927SAndroid Build Coastguard Worker #include <err.h>
13*61046927SAndroid Build Coastguard Worker #include <stdint.h>
14*61046927SAndroid Build Coastguard Worker #include <stdio.h>
15*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
16*61046927SAndroid Build Coastguard Worker #include <string.h>
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker #include "rnnutil.h"
19*61046927SAndroid Build Coastguard Worker 
20*61046927SAndroid Build Coastguard Worker static struct rnndomain *
finddom(struct rnn * rnn,uint32_t regbase)21*61046927SAndroid Build Coastguard Worker finddom(struct rnn *rnn, uint32_t regbase)
22*61046927SAndroid Build Coastguard Worker {
23*61046927SAndroid Build Coastguard Worker    if (rnndec_checkaddr(rnn->vc, rnn->dom[0], regbase, 0))
24*61046927SAndroid Build Coastguard Worker       return rnn->dom[0];
25*61046927SAndroid Build Coastguard Worker    return rnn->dom[1];
26*61046927SAndroid Build Coastguard Worker }
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker void
_rnn_init(struct rnn * rnn,int nocolor)29*61046927SAndroid Build Coastguard Worker _rnn_init(struct rnn *rnn, int nocolor)
30*61046927SAndroid Build Coastguard Worker {
31*61046927SAndroid Build Coastguard Worker    rnn_init();
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker    rnn->db = rnn_newdb();
34*61046927SAndroid Build Coastguard Worker    rnn->vc_nocolor = rnndec_newcontext(rnn->db);
35*61046927SAndroid Build Coastguard Worker    rnn->vc_nocolor->colors = &envy_null_colors;
36*61046927SAndroid Build Coastguard Worker    if (nocolor) {
37*61046927SAndroid Build Coastguard Worker       rnn->vc = rnn->vc_nocolor;
38*61046927SAndroid Build Coastguard Worker    } else {
39*61046927SAndroid Build Coastguard Worker       rnn->vc = rnndec_newcontext(rnn->db);
40*61046927SAndroid Build Coastguard Worker       rnn->vc->colors = &envy_def_colors;
41*61046927SAndroid Build Coastguard Worker    }
42*61046927SAndroid Build Coastguard Worker }
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker struct rnn *
rnn_new(int nocolor)45*61046927SAndroid Build Coastguard Worker rnn_new(int nocolor)
46*61046927SAndroid Build Coastguard Worker {
47*61046927SAndroid Build Coastguard Worker    struct rnn *rnn = calloc(sizeof(*rnn), 1);
48*61046927SAndroid Build Coastguard Worker 
49*61046927SAndroid Build Coastguard Worker    if (!rnn)
50*61046927SAndroid Build Coastguard Worker       return NULL;
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker    _rnn_init(rnn, nocolor);
53*61046927SAndroid Build Coastguard Worker 
54*61046927SAndroid Build Coastguard Worker    return rnn;
55*61046927SAndroid Build Coastguard Worker }
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker static void
init(struct rnn * rnn,char * file,char * domain,char * variant)58*61046927SAndroid Build Coastguard Worker init(struct rnn *rnn, char *file, char *domain, char *variant)
59*61046927SAndroid Build Coastguard Worker {
60*61046927SAndroid Build Coastguard Worker    /* prepare rnn stuff for lookup */
61*61046927SAndroid Build Coastguard Worker    rnn_parsefile(rnn->db, file);
62*61046927SAndroid Build Coastguard Worker    rnn_prepdb(rnn->db);
63*61046927SAndroid Build Coastguard Worker    rnn->dom[0] = rnn_finddomain(rnn->db, domain);
64*61046927SAndroid Build Coastguard Worker    if ((strcmp(domain, "A2XX") == 0) || (strcmp(domain, "A3XX") == 0)) {
65*61046927SAndroid Build Coastguard Worker       rnn->dom[1] = rnn_finddomain(rnn->db, "AXXX");
66*61046927SAndroid Build Coastguard Worker    } else {
67*61046927SAndroid Build Coastguard Worker       rnn->dom[1] = rnn->dom[0];
68*61046927SAndroid Build Coastguard Worker    }
69*61046927SAndroid Build Coastguard Worker    if (!rnn->dom[0] && rnn->dom[1]) {
70*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "Could not find domain %s in %s\n", domain, file);
71*61046927SAndroid Build Coastguard Worker    }
72*61046927SAndroid Build Coastguard Worker    rnn->variant = variant;
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker    rnndec_varadd(rnn->vc, "chip", variant);
75*61046927SAndroid Build Coastguard Worker    if (rnn->vc != rnn->vc_nocolor)
76*61046927SAndroid Build Coastguard Worker       rnndec_varadd(rnn->vc_nocolor, "chip", variant);
77*61046927SAndroid Build Coastguard Worker    if (rnn->db->estatus)
78*61046927SAndroid Build Coastguard Worker       errx(rnn->db->estatus, "failed to parse register database");
79*61046927SAndroid Build Coastguard Worker }
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker void
rnn_load_file(struct rnn * rnn,char * file,char * domain)82*61046927SAndroid Build Coastguard Worker rnn_load_file(struct rnn *rnn, char *file, char *domain)
83*61046927SAndroid Build Coastguard Worker {
84*61046927SAndroid Build Coastguard Worker    init(rnn, file, domain, domain);
85*61046927SAndroid Build Coastguard Worker }
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker void
rnn_load(struct rnn * rnn,const char * gpuname)88*61046927SAndroid Build Coastguard Worker rnn_load(struct rnn *rnn, const char *gpuname)
89*61046927SAndroid Build Coastguard Worker {
90*61046927SAndroid Build Coastguard Worker    if (strstr(gpuname, "a2")) {
91*61046927SAndroid Build Coastguard Worker       init(rnn, "adreno/a2xx.xml", "A2XX", "A2XX");
92*61046927SAndroid Build Coastguard Worker    } else if (strstr(gpuname, "a3")) {
93*61046927SAndroid Build Coastguard Worker       init(rnn, "adreno/a3xx.xml", "A3XX", "A3XX");
94*61046927SAndroid Build Coastguard Worker    } else if (strstr(gpuname, "a4")) {
95*61046927SAndroid Build Coastguard Worker       init(rnn, "adreno/a4xx.xml", "A4XX", "A4XX");
96*61046927SAndroid Build Coastguard Worker    } else if (strstr(gpuname, "a5")) {
97*61046927SAndroid Build Coastguard Worker       init(rnn, "adreno/a5xx.xml", "A5XX", "A5XX");
98*61046927SAndroid Build Coastguard Worker    } else if (strstr(gpuname, "a6")) {
99*61046927SAndroid Build Coastguard Worker       init(rnn, "adreno/a6xx.xml", "A6XX", "A6XX");
100*61046927SAndroid Build Coastguard Worker    } else if (strstr(gpuname, "a7")) {
101*61046927SAndroid Build Coastguard Worker       init(rnn, "adreno/a6xx.xml", "A6XX", "A7XX");
102*61046927SAndroid Build Coastguard Worker    }
103*61046927SAndroid Build Coastguard Worker }
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker uint32_t
rnn_regbase(struct rnn * rnn,const char * name)106*61046927SAndroid Build Coastguard Worker rnn_regbase(struct rnn *rnn, const char *name)
107*61046927SAndroid Build Coastguard Worker {
108*61046927SAndroid Build Coastguard Worker    uint32_t regbase = rnndec_decodereg(rnn->vc_nocolor, rnn->dom[0], name);
109*61046927SAndroid Build Coastguard Worker    if (!regbase)
110*61046927SAndroid Build Coastguard Worker       regbase = rnndec_decodereg(rnn->vc_nocolor, rnn->dom[1], name);
111*61046927SAndroid Build Coastguard Worker    return regbase;
112*61046927SAndroid Build Coastguard Worker }
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker const char *
rnn_regname(struct rnn * rnn,uint32_t regbase,int color)115*61046927SAndroid Build Coastguard Worker rnn_regname(struct rnn *rnn, uint32_t regbase, int color)
116*61046927SAndroid Build Coastguard Worker {
117*61046927SAndroid Build Coastguard Worker    static char buf[128];
118*61046927SAndroid Build Coastguard Worker    struct rnndecaddrinfo *info;
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker    info = rnndec_decodeaddr(color ? rnn->vc : rnn->vc_nocolor,
121*61046927SAndroid Build Coastguard Worker                             finddom(rnn, regbase), regbase, 0);
122*61046927SAndroid Build Coastguard Worker    if (info) {
123*61046927SAndroid Build Coastguard Worker       strcpy(buf, info->name);
124*61046927SAndroid Build Coastguard Worker       free(info->name);
125*61046927SAndroid Build Coastguard Worker       free(info);
126*61046927SAndroid Build Coastguard Worker       return buf;
127*61046927SAndroid Build Coastguard Worker    }
128*61046927SAndroid Build Coastguard Worker    return NULL;
129*61046927SAndroid Build Coastguard Worker }
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker /* call rnn_reginfo_free() to free the result */
132*61046927SAndroid Build Coastguard Worker struct rnndecaddrinfo *
rnn_reginfo(struct rnn * rnn,uint32_t regbase)133*61046927SAndroid Build Coastguard Worker rnn_reginfo(struct rnn *rnn, uint32_t regbase)
134*61046927SAndroid Build Coastguard Worker {
135*61046927SAndroid Build Coastguard Worker    return rnndec_decodeaddr(rnn->vc, finddom(rnn, regbase), regbase, 0);
136*61046927SAndroid Build Coastguard Worker }
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker void
rnn_reginfo_free(struct rnndecaddrinfo * info)139*61046927SAndroid Build Coastguard Worker rnn_reginfo_free(struct rnndecaddrinfo *info)
140*61046927SAndroid Build Coastguard Worker {
141*61046927SAndroid Build Coastguard Worker    if (!info)
142*61046927SAndroid Build Coastguard Worker       return;
143*61046927SAndroid Build Coastguard Worker    free(info->name);
144*61046927SAndroid Build Coastguard Worker    free(info);
145*61046927SAndroid Build Coastguard Worker }
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker const char *
rnn_enumname(struct rnn * rnn,const char * name,uint32_t val)148*61046927SAndroid Build Coastguard Worker rnn_enumname(struct rnn *rnn, const char *name, uint32_t val)
149*61046927SAndroid Build Coastguard Worker {
150*61046927SAndroid Build Coastguard Worker    return rnndec_decode_enum(rnn->vc, name, val);
151*61046927SAndroid Build Coastguard Worker }
152*61046927SAndroid Build Coastguard Worker 
153*61046927SAndroid Build Coastguard Worker static struct rnndelem *
regelem(struct rnndomain * domain,const char * name)154*61046927SAndroid Build Coastguard Worker regelem(struct rnndomain *domain, const char *name)
155*61046927SAndroid Build Coastguard Worker {
156*61046927SAndroid Build Coastguard Worker    int i;
157*61046927SAndroid Build Coastguard Worker    for (i = 0; i < domain->subelemsnum; i++) {
158*61046927SAndroid Build Coastguard Worker       struct rnndelem *elem = domain->subelems[i];
159*61046927SAndroid Build Coastguard Worker       if (!strcmp(elem->name, name))
160*61046927SAndroid Build Coastguard Worker          return elem;
161*61046927SAndroid Build Coastguard Worker    }
162*61046927SAndroid Build Coastguard Worker    return NULL;
163*61046927SAndroid Build Coastguard Worker }
164*61046927SAndroid Build Coastguard Worker 
165*61046927SAndroid Build Coastguard Worker /* Lookup rnndelem by name: */
166*61046927SAndroid Build Coastguard Worker struct rnndelem *
rnn_regelem(struct rnn * rnn,const char * name)167*61046927SAndroid Build Coastguard Worker rnn_regelem(struct rnn *rnn, const char *name)
168*61046927SAndroid Build Coastguard Worker {
169*61046927SAndroid Build Coastguard Worker    struct rnndelem *elem = regelem(rnn->dom[0], name);
170*61046927SAndroid Build Coastguard Worker    if (elem)
171*61046927SAndroid Build Coastguard Worker       return elem;
172*61046927SAndroid Build Coastguard Worker    return regelem(rnn->dom[1], name);
173*61046927SAndroid Build Coastguard Worker }
174*61046927SAndroid Build Coastguard Worker 
175*61046927SAndroid Build Coastguard Worker static struct rnndelem *
regoff(struct rnndomain * domain,uint32_t offset)176*61046927SAndroid Build Coastguard Worker regoff(struct rnndomain *domain, uint32_t offset)
177*61046927SAndroid Build Coastguard Worker {
178*61046927SAndroid Build Coastguard Worker    int i;
179*61046927SAndroid Build Coastguard Worker    for (i = 0; i < domain->subelemsnum; i++) {
180*61046927SAndroid Build Coastguard Worker       struct rnndelem *elem = domain->subelems[i];
181*61046927SAndroid Build Coastguard Worker       if (elem->offset == offset)
182*61046927SAndroid Build Coastguard Worker          return elem;
183*61046927SAndroid Build Coastguard Worker    }
184*61046927SAndroid Build Coastguard Worker    return NULL;
185*61046927SAndroid Build Coastguard Worker }
186*61046927SAndroid Build Coastguard Worker 
187*61046927SAndroid Build Coastguard Worker /* Lookup rnndelem by offset: */
188*61046927SAndroid Build Coastguard Worker struct rnndelem *
rnn_regoff(struct rnn * rnn,uint32_t offset)189*61046927SAndroid Build Coastguard Worker rnn_regoff(struct rnn *rnn, uint32_t offset)
190*61046927SAndroid Build Coastguard Worker {
191*61046927SAndroid Build Coastguard Worker    struct rnndelem *elem = regoff(rnn->dom[0], offset);
192*61046927SAndroid Build Coastguard Worker    if (elem)
193*61046927SAndroid Build Coastguard Worker       return elem;
194*61046927SAndroid Build Coastguard Worker    return regoff(rnn->dom[1], offset);
195*61046927SAndroid Build Coastguard Worker }
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker enum rnnttype
rnn_decodelem(struct rnn * rnn,struct rnntypeinfo * info,uint64_t regval,union rnndecval * val)198*61046927SAndroid Build Coastguard Worker rnn_decodelem(struct rnn *rnn, struct rnntypeinfo *info, uint64_t regval,
199*61046927SAndroid Build Coastguard Worker               union rnndecval *val)
200*61046927SAndroid Build Coastguard Worker {
201*61046927SAndroid Build Coastguard Worker    val->u = regval;
202*61046927SAndroid Build Coastguard Worker    switch (info->type) {
203*61046927SAndroid Build Coastguard Worker    case RNN_TTYPE_INLINE_ENUM:
204*61046927SAndroid Build Coastguard Worker    case RNN_TTYPE_ENUM:
205*61046927SAndroid Build Coastguard Worker    case RNN_TTYPE_HEX:
206*61046927SAndroid Build Coastguard Worker    case RNN_TTYPE_INT:
207*61046927SAndroid Build Coastguard Worker    case RNN_TTYPE_UINT:
208*61046927SAndroid Build Coastguard Worker    case RNN_TTYPE_FLOAT:
209*61046927SAndroid Build Coastguard Worker    case RNN_TTYPE_BOOLEAN:
210*61046927SAndroid Build Coastguard Worker       return info->type;
211*61046927SAndroid Build Coastguard Worker    case RNN_TTYPE_FIXED:
212*61046927SAndroid Build Coastguard Worker    case RNN_TTYPE_UFIXED:
213*61046927SAndroid Build Coastguard Worker       /* TODO */
214*61046927SAndroid Build Coastguard Worker    default:
215*61046927SAndroid Build Coastguard Worker       return RNN_TTYPE_INVALID;
216*61046927SAndroid Build Coastguard Worker    }
217*61046927SAndroid Build Coastguard Worker }
218