1bf215546Sopenharmony_ci#ifndef __NVHW_QMD_H__
2bf215546Sopenharmony_ci#define __NVHW_QMD_H__
3bf215546Sopenharmony_ci#include <stdio.h>
4bf215546Sopenharmony_ci#include <stdint.h>
5bf215546Sopenharmony_ci#include "util/u_debug.h"
6bf215546Sopenharmony_ci#include "drf.h"
7bf215546Sopenharmony_ci
8bf215546Sopenharmony_ci#define NVQMD_ENUM_1(X,drf,v0)                                                 \
9bf215546Sopenharmony_ci   [drf##_##v0] = #v0
10bf215546Sopenharmony_ci#define NVQMD_ENUM_2(X,drf,v0,v1)                                              \
11bf215546Sopenharmony_ci   [drf##_##v0] = #v0,                                                         \
12bf215546Sopenharmony_ci   [drf##_##v1] = #v1
13bf215546Sopenharmony_ci#define NVQMD_ENUM_3(X,drf,v0,v1,v2)                                           \
14bf215546Sopenharmony_ci   [drf##_##v0] = #v0,                                                         \
15bf215546Sopenharmony_ci   [drf##_##v1] = #v1,                                                         \
16bf215546Sopenharmony_ci   [drf##_##v2] = #v2
17bf215546Sopenharmony_ci#define NVQMD_ENUM_8(X,drf,v0,v1,v2,v3,v4,v5,v6,v7)                            \
18bf215546Sopenharmony_ci   [drf##_##v0] = #v0,                                                         \
19bf215546Sopenharmony_ci   [drf##_##v1] = #v1,                                                         \
20bf215546Sopenharmony_ci   [drf##_##v2] = #v2,                                                         \
21bf215546Sopenharmony_ci   [drf##_##v3] = #v3,                                                         \
22bf215546Sopenharmony_ci   [drf##_##v4] = #v4,                                                         \
23bf215546Sopenharmony_ci   [drf##_##v5] = #v5,                                                         \
24bf215546Sopenharmony_ci   [drf##_##v6] = #v6,                                                         \
25bf215546Sopenharmony_ci   [drf##_##v7] = #v7
26bf215546Sopenharmony_ci
27bf215546Sopenharmony_ci#define NVQMD_ENUM_(X,_1,_2,_3,_4,_5,_6,_7,_8,_9,IMPL,...) IMPL
28bf215546Sopenharmony_ci#define NVQMD_ENUM(A...) NVQMD_ENUM_(X, ##A, NVQMD_ENUM_8, NVQMD_ENUM_7,       \
29bf215546Sopenharmony_ci                                             NVQMD_ENUM_6, NVQMD_ENUM_5,       \
30bf215546Sopenharmony_ci                                             NVQMD_ENUM_4, NVQMD_ENUM_3,       \
31bf215546Sopenharmony_ci                                             NVQMD_ENUM_2, NVQMD_ENUM_1)(X, ##A)
32bf215546Sopenharmony_ci
33bf215546Sopenharmony_ci#define NVQMD_VAL_N(X,d,r,p,f,o) do {                                          \
34bf215546Sopenharmony_ci   uint32_t val = NVVAL_MW_GET_X((p), d##_##r##_##f);                          \
35bf215546Sopenharmony_ci   debug_printf("   %-36s: "o"\n", #f, val);                                   \
36bf215546Sopenharmony_ci} while(0)
37bf215546Sopenharmony_ci#define NVQMD_VAL_I(X,d,r,p,f,i,o) do {                                        \
38bf215546Sopenharmony_ci   uint32_t val = NVVAL_MW_GET_X((p), d##_##r##_##f(i));                       \
39bf215546Sopenharmony_ci   char name[80];                                                              \
40bf215546Sopenharmony_ci   snprintf(name, sizeof(name), "%s(%d)", #f, i);                              \
41bf215546Sopenharmony_ci   debug_printf("   %-36s: "o"\n", name, val);                                 \
42bf215546Sopenharmony_ci} while(0)
43bf215546Sopenharmony_ci#define NVQMD_VAL_(X,_1,_2,_3,_4,_5,_6,IMPL,...) IMPL
44bf215546Sopenharmony_ci#define NVQMD_VAL(A...) NVQMD_VAL_(X, ##A, NVQMD_VAL_I, NVQMD_VAL_N)(X, ##A)
45bf215546Sopenharmony_ci
46bf215546Sopenharmony_ci#define NVQMD_DEF(d,r,p,f,e...) do {                                           \
47bf215546Sopenharmony_ci   static const char *ev[] = { NVQMD_ENUM(d##_##r##_##f,##e) };                \
48bf215546Sopenharmony_ci   uint32_t val = NVVAL_MW_GET((p), d, r, f);                                  \
49bf215546Sopenharmony_ci   if (val < ARRAY_SIZE(ev) && ev[val])                                        \
50bf215546Sopenharmony_ci      debug_printf("   %-36s: %s\n", #f, ev[val]);                             \
51bf215546Sopenharmony_ci   else                                                                        \
52bf215546Sopenharmony_ci      debug_printf("   %-36s: UNKNOWN 0x%x\n", #f, val);                       \
53bf215546Sopenharmony_ci} while(0)
54bf215546Sopenharmony_ci#define NVQMD_IDX(d,r,p,f,i,e...) do {                                         \
55bf215546Sopenharmony_ci   static const char *ev[] = { NVQMD_ENUM(d##_##r##_##f,##e) };                \
56bf215546Sopenharmony_ci   char name[80];                                                              \
57bf215546Sopenharmony_ci   snprintf(name, sizeof(name), "%s(%d)", #f, i);                              \
58bf215546Sopenharmony_ci   uint32_t val = NVVAL_MW_GET((p), d, r, f, i);                               \
59bf215546Sopenharmony_ci   if (val < ARRAY_SIZE(ev) && ev[val])                                        \
60bf215546Sopenharmony_ci      debug_printf("   %-36s: %s\n", name, ev[val]);                           \
61bf215546Sopenharmony_ci   else                                                                        \
62bf215546Sopenharmony_ci      debug_printf("   %-36s: UNKNOWN 0x%x\n", name, val);                     \
63bf215546Sopenharmony_ci} while(0)
64bf215546Sopenharmony_ci
65bf215546Sopenharmony_civoid NVA0C0QmdDump_V00_06(uint32_t *);
66bf215546Sopenharmony_civoid NVC0C0QmdDump_V02_01(uint32_t *);
67bf215546Sopenharmony_civoid NVC3C0QmdDump_V02_02(uint32_t *);
68bf215546Sopenharmony_ci#endif
69