freedreno/decode: Add enum value decoding

Signed-off-by: Rob Clark <rob.clark@oss.qualcomm.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36426>
This commit is contained in:
Rob Clark 2025-07-24 15:43:33 -07:00 committed by Marge Bot
parent c8f9990733
commit d8840db682
6 changed files with 27 additions and 0 deletions

View file

@ -817,6 +817,12 @@ regbase(const char *name)
return rnn_regbase(rnn, name);
}
int
enumval(const char *enumname, const char *enumval)
{
return rnn_enumval(rnn, enumname, enumval);
}
static int
endswith(uint32_t regbase, const char *suffix)
{

View file

@ -102,6 +102,7 @@ bool regacc_push(struct regacc *regacc, uint32_t regbase, uint32_t dword);
void printl(int lvl, const char *fmt, ...);
const char *pktname(unsigned opc);
uint32_t regbase(const char *name);
int enumval(const char *enumname, const char *enumval);
const char *regname(uint32_t regbase, int color);
bool reg_written(uint32_t regbase);
uint32_t reg_lastval(uint32_t regbase);

View file

@ -150,6 +150,12 @@ rnn_enumname(struct rnn *rnn, const char *name, uint32_t val)
return rnndec_decode_enum(rnn->vc, name, val);
}
int
rnn_enumval(struct rnn *rnn, const char *enumname, const char *enumval)
{
return rnndec_decode_enum_value(rnn->vc, enumname, enumval);
}
static struct rnndelem *
regelem(struct rnndomain *domain, const char *name)
{

View file

@ -39,6 +39,7 @@ const char *rnn_regname(struct rnn *rnn, uint32_t regbase, int color);
struct rnndecaddrinfo *rnn_reginfo(struct rnn *rnn, uint32_t regbase);
void rnn_reginfo_free(struct rnndecaddrinfo *info);
const char *rnn_enumname(struct rnn *rnn, const char *name, uint32_t val);
int rnn_enumval(struct rnn *rnn, const char *enumname, const char *enumval);
struct rnndelem *rnn_regelem(struct rnn *rnn, const char *name);
struct rnndelem *rnn_regoff(struct rnn *rnn, uint32_t offset);

View file

@ -125,6 +125,18 @@ const char *rnndec_decode_enum(struct rnndeccontext *ctx, const char *enumname,
return NULL;
}
int rnndec_decode_enum_value(struct rnndeccontext *ctx, const char *enumname, const char *enumval)
{
struct rnnenum *en = rnn_findenum (ctx->db, enumname);
if (en) {
for (int i = 0; i < en->valsnum; i++)
if (rnndec_varmatch(ctx, &en->vals[i]->varinfo) &&
en->vals[i]->valvalid && !strcmp(en->vals[i]->name, enumval))
return en->vals[i]->value;
}
return -1;
}
/* The name UNK%u is used as a placeholder for bitfields that exist but
* have an unknown function.
*/

View file

@ -33,6 +33,7 @@ struct rnndeccontext *rnndec_newcontext(struct rnndb *db);
int rnndec_varadd(struct rnndeccontext *ctx, char *varset, const char *variant);
int rnndec_varmatch(struct rnndeccontext *ctx, struct rnnvarinfo *vi);
const char *rnndec_decode_enum(struct rnndeccontext *ctx, const char *enumname, uint64_t enumval);
int rnndec_decode_enum_value(struct rnndeccontext *ctx, const char *enumname, const char *enumval);
char *rnndec_decodeval(struct rnndeccontext *ctx, struct rnntypeinfo *ti, uint64_t value);
int rnndec_checkaddr(struct rnndeccontext *ctx, struct rnndomain *domain, uint64_t addr, int write);
struct rnndecaddrinfo *rnndec_decodeaddr(struct rnndeccontext *ctx, struct rnndomain *domain, uint64_t addr, int write);