1 /* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
4 * Copyright (C) 2014 Rob Clark <robclark@freedesktop.org>
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice (including the next
14 * paragraph) shall be included in all copies or substantial portions of the
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 * Rob Clark <robclark@freedesktop.org>
38 static struct rnndomain
*finddom(struct rnn
*rnn
, uint32_t regbase
)
40 if (rnndec_checkaddr(rnn
->vc
, rnn
->dom
[0], regbase
, 0))
45 void _rnn_init(struct rnn
*rnn
, int nocolor
)
49 rnn
->db
= rnn_newdb();
50 rnn
->vc_nocolor
= rnndec_newcontext(rnn
->db
);
51 rnn
->vc_nocolor
->colors
= &envy_null_colors
;
53 rnn
->vc
= rnn
->vc_nocolor
;
55 rnn
->vc
= rnndec_newcontext(rnn
->db
);
56 rnn
->vc
->colors
= &envy_def_colors
;
60 struct rnn
*rnn_new(int nocolor
)
62 struct rnn
*rnn
= calloc(sizeof(*rnn
), 1);
67 _rnn_init(rnn
, nocolor
);
72 static void init(struct rnn
*rnn
, char *file
, char *domain
)
74 /* prepare rnn stuff for lookup */
75 rnn_parsefile(rnn
->db
, file
);
77 rnn
->dom
[0] = rnn_finddomain(rnn
->db
, domain
);
78 if ((strcmp(domain
, "A2XX") == 0) || (strcmp(domain
, "A3XX") == 0)) {
79 rnn
->dom
[1] = rnn_finddomain(rnn
->db
, "AXXX");
81 rnn
->dom
[1] = rnn
->dom
[0];
83 if (!rnn
->dom
[0] && rnn
->dom
[1]) {
84 fprintf(stderr
, "Could not find domain %s in %s\n", domain
, file
);
86 rnn
->variant
= domain
;
88 rnndec_varadd(rnn
->vc
, "chip", domain
);
89 if (rnn
->vc
!= rnn
->vc_nocolor
)
90 rnndec_varadd(rnn
->vc_nocolor
, "chip", domain
);
92 errx(rnn
->db
->estatus
, "failed to parse register database");
95 void rnn_load_file(struct rnn
*rnn
, char *file
, char *domain
)
97 init(rnn
, file
, domain
);
100 void rnn_load(struct rnn
*rnn
, const char *gpuname
)
102 if (strstr(gpuname
, "a2")) {
103 init(rnn
, "adreno/a2xx.xml", "A2XX");
104 } else if (strstr(gpuname
, "a3")) {
105 init(rnn
, "adreno/a3xx.xml", "A3XX");
106 } else if (strstr(gpuname
, "a4")) {
107 init(rnn
, "adreno/a4xx.xml", "A4XX");
108 } else if (strstr(gpuname
, "a5")) {
109 init(rnn
, "adreno/a5xx.xml", "A5XX");
110 } else if (strstr(gpuname
, "a6")) {
111 init(rnn
, "adreno/a6xx.xml", "A6XX");
115 uint32_t rnn_regbase(struct rnn
*rnn
, const char *name
)
117 uint32_t regbase
= rnndec_decodereg(rnn
->vc_nocolor
, rnn
->dom
[0], name
);
119 regbase
= rnndec_decodereg(rnn
->vc_nocolor
, rnn
->dom
[1], name
);
123 const char *rnn_regname(struct rnn
*rnn
, uint32_t regbase
, int color
)
125 static char buf
[128];
126 struct rnndecaddrinfo
*info
;
128 info
= rnndec_decodeaddr(color
? rnn
->vc
: rnn
->vc_nocolor
,
129 finddom(rnn
, regbase
), regbase
, 0);
131 strcpy(buf
, info
->name
);
139 struct rnndecaddrinfo
*rnn_reginfo(struct rnn
*rnn
, uint32_t regbase
)
141 return rnndec_decodeaddr(rnn
->vc
, finddom(rnn
, regbase
), regbase
, 0);
144 const char *rnn_enumname(struct rnn
*rnn
, const char *name
, uint32_t val
)
146 struct rnndeccontext
*ctx
= rnn
->vc
;
147 struct rnnenum
*en
= rnn_findenum(ctx
->db
, name
);
150 for (i
= 0; i
< en
->valsnum
; i
++) {
151 struct rnnvalue
*eval
= en
->vals
[i
];
152 if (eval
->valvalid
&& eval
->value
== val
&&
153 rnndec_varmatch(ctx
, &eval
->varinfo
)) {
154 return en
->vals
[i
]->name
;
161 static struct rnndelem
*regelem(struct rnndomain
*domain
, const char *name
)
164 for (i
= 0; i
< domain
->subelemsnum
; i
++) {
165 struct rnndelem
*elem
= domain
->subelems
[i
];
166 if (!strcmp(elem
->name
, name
))
172 /* Lookup rnndelem by name: */
173 struct rnndelem
*rnn_regelem(struct rnn
*rnn
, const char *name
)
175 struct rnndelem
*elem
= regelem(rnn
->dom
[0], name
);
178 return regelem(rnn
->dom
[1], name
);
181 static struct rnndelem
*regoff(struct rnndomain
*domain
, uint32_t offset
)
184 for (i
= 0; i
< domain
->subelemsnum
; i
++) {
185 struct rnndelem
*elem
= domain
->subelems
[i
];
186 if (elem
->offset
== offset
)
192 /* Lookup rnndelem by offset: */
193 struct rnndelem
*rnn_regoff(struct rnn
*rnn
, uint32_t offset
)
195 struct rnndelem
*elem
= regoff(rnn
->dom
[0], offset
);
198 return regoff(rnn
->dom
[1], offset
);
201 enum rnnttype
rnn_decodelem(struct rnn
*rnn
, struct rnntypeinfo
*info
,
202 uint32_t regval
, union rnndecval
*val
)
205 switch (info
->type
) {
206 case RNN_TTYPE_INLINE_ENUM
:
211 case RNN_TTYPE_FLOAT
:
212 case RNN_TTYPE_BOOLEAN
:
214 case RNN_TTYPE_FIXED
:
215 case RNN_TTYPE_UFIXED
:
218 return RNN_TTYPE_INVALID
;