Skip to content

Commit 212b536

Browse files
lgdacunhigaw
authored andcommitted
plugins/solidigm: Enabled Telemetry side trace items parsing.
Replaced single raw side trace payload array with side trace entry list Signed-off-by: Leonardo da Cunha <[email protected]>
1 parent a333a9e commit 212b536

6 files changed

Lines changed: 518 additions & 4 deletions

File tree

plugins/solidigm/solidigm-telemetry/config.c

Lines changed: 103 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,20 @@
88
#include <stdio.h>
99
#include <string.h>
1010
#include <stdbool.h>
11-
#include <json.h>
1211
#include <stdint.h>
1312
#include "config.h"
1413

14+
#define NOT_FOUND "NOT_FOUND"
15+
1516
// max 16 bit unsigned integer number 65535
1617
#define MAX_16BIT_NUM_AS_STRING_SIZE 6
1718

1819
#define OBJ_NAME_PREFIX "UID_"
1920
#define NLOG_OBJ_PREFIX OBJ_NAME_PREFIX "NLOG_"
2021

21-
static bool config_get_by_version(const struct json_object *obj, int version_major,
22-
int version_minor, struct json_object **value)
22+
static bool config_get_by_version(const struct json_object *obj,
23+
int version_major, int version_minor,
24+
struct json_object **value)
2325
{
2426
char str_key[MAX_16BIT_NUM_AS_STRING_SIZE];
2527
char str_subkey[MAX_16BIT_NUM_AS_STRING_SIZE];
@@ -58,6 +60,7 @@ bool sldm_config_get_struct_by_key_version(const struct json_object *config, cha
5860
struct json_object **value)
5961
{
6062
struct json_object *token = NULL;
63+
6164
if (!json_object_object_get_ex(config, key, &token))
6265
return false;
6366
if (!config_get_by_version(token, version_major, version_minor, value))
@@ -90,7 +93,7 @@ const char *solidigm_config_get_nlog_obj_name(const struct json_object *config,
9093
if (!json_object_object_get_ex(nlog_names, hex_header, &obj_name))
9194
return NULL;
9295
name = json_object_get_string(obj_name);
93-
if ((!name) || (strncmp(NLOG_OBJ_PREFIX, name, strlen(NLOG_OBJ_PREFIX))))
96+
if (!name || strncmp(NLOG_OBJ_PREFIX, name, strlen(NLOG_OBJ_PREFIX)))
9497
return NULL;
9598

9699
return &name[strlen(OBJ_NAME_PREFIX)];
@@ -103,3 +106,99 @@ struct json_object *solidigm_config_get_nlog_formats(const struct json_object *c
103106
json_object_object_get_ex(config, "NLOG_FORMATS", &nlog_formats);
104107
return nlog_formats;
105108
}
109+
110+
/* Enum value lookup helper functions */
111+
static const char *find_enum_value_in_member_list(
112+
struct json_object *enum_member_list,
113+
uint64_t value)
114+
{
115+
if (!json_object_is_type(enum_member_list, json_type_array))
116+
return UNKNOWN_ENUM_VALUE;
117+
118+
int enum_array_len = json_object_array_length(enum_member_list);
119+
120+
for (int j = 0; j < enum_array_len; j++) {
121+
struct json_object *enum_item =
122+
json_object_array_get_idx(enum_member_list, j);
123+
124+
if (!enum_item)
125+
continue;
126+
127+
json_object_object_foreach(enum_item, key, val) {
128+
(void)key; /* Suppress unused variable warning */
129+
if (json_object_get_uint64(val) == value)
130+
return key;
131+
}
132+
}
133+
return UNKNOWN_ENUM_VALUE;
134+
}
135+
136+
static bool is_target_enum_field(struct json_object *member,
137+
const char *enum_field_name)
138+
{
139+
struct json_object *name_obj, *enum_obj;
140+
141+
if (!json_object_object_get_ex(member, "name", &name_obj) ||
142+
!json_object_object_get_ex(member, "enum", &enum_obj))
143+
return false;
144+
145+
const char *name = json_object_get_string(name_obj);
146+
int is_enum = json_object_get_int(enum_obj);
147+
148+
return (strcmp(name, enum_field_name) == 0 && is_enum == 1);
149+
}
150+
151+
static const char *search_enum_in_member(struct json_object *member,
152+
const char *enum_field_name,
153+
uint64_t value)
154+
{
155+
if (!is_target_enum_field(member, enum_field_name))
156+
return NOT_FOUND;
157+
158+
/* Found the enum field, look for the value in its memberList */
159+
struct json_object *enum_member_list;
160+
161+
if (!json_object_object_get_ex(member, "memberList", &enum_member_list))
162+
return UNKNOWN_ENUM_VALUE;
163+
164+
return find_enum_value_in_member_list(enum_member_list, value);
165+
}
166+
167+
const char *sldm_get_enum_label_by_value(struct json_object *struct_def,
168+
const char *enum_field_name,
169+
uint64_t value)
170+
{
171+
struct json_object *member_list;
172+
173+
if (!json_object_object_get_ex(struct_def, "memberList", &member_list))
174+
return UNKNOWN_ENUM_VALUE;
175+
176+
if (!json_object_is_type(member_list, json_type_array))
177+
return UNKNOWN_ENUM_VALUE;
178+
179+
int array_len = json_object_array_length(member_list);
180+
181+
for (int i = 0; i < array_len; i++) {
182+
struct json_object *member =
183+
json_object_array_get_idx(member_list, i);
184+
185+
if (!member)
186+
continue;
187+
188+
/* Try to find enum in this member */
189+
const char *result = search_enum_in_member(member,
190+
enum_field_name,
191+
value);
192+
193+
if (strcmp(result, NOT_FOUND) != 0)
194+
return result; /* Found it or determined it's unknown */
195+
196+
/* If this member has nested members, search recursively */
197+
result = sldm_get_enum_label_by_value(member, enum_field_name,
198+
value);
199+
if (strcmp(result, UNKNOWN_ENUM_VALUE) != 0)
200+
return result;
201+
}
202+
203+
return UNKNOWN_ENUM_VALUE;
204+
}

plugins/solidigm/solidigm-telemetry/config.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "util/json.h"
99

1010
#define STR_HEX32_SIZE sizeof("0x00000000")
11+
#define UNKNOWN_ENUM_VALUE "UNKNOWN_ENUM_VALUE"
1112

1213
bool sldm_config_get_struct_by_key_version(const struct json_object *config, char *key,
1314
int version_major, int version_minor,
@@ -19,4 +20,7 @@ bool solidigm_config_get_struct_by_token_version(const struct json_object *obj,
1920

2021
const char *solidigm_config_get_nlog_obj_name(const struct json_object *config, uint32_t token);
2122
struct json_object *solidigm_config_get_nlog_formats(const struct json_object *config);
23+
const char *sldm_get_enum_label_by_value(struct json_object *struct_def,
24+
const char *enum_field_name,
25+
uint64_t value);
2226

plugins/solidigm/solidigm-telemetry/data-area.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "config.h"
1313
#include "nlog.h"
1414
#include "skht.h"
15+
#include "side-trace.h"
1516
#include <ctype.h>
1617

1718
#define SIGNED_int_PREFIX "int"
@@ -579,6 +580,40 @@ static void telemetry_log_data_area_toc_parse(const struct telemetry_log *tl,
579580
toc->items[i].ContentSizeBytes - header_offset,
580581
parsed_struct, toc_item);
581582
}
583+
584+
// Check if this is a side trace object
585+
struct json_object *obj_name = NULL;
586+
587+
if (json_object_object_get_ex(toc_item, "objName", &obj_name)) {
588+
const char *obj_name_str =
589+
json_object_get_string(obj_name);
590+
591+
if (obj_name_str &&
592+
(strstr(obj_name_str, "sideTrace") ||
593+
strstr(obj_name_str, "SideTrace") ||
594+
strstr(obj_name_str, "SIDETRACE"))) {
595+
/* This is a side trace object, parse it when
596+
* configuration is available. We want to
597+
* replace array member fwSideTrace by parsed
598+
* entries.
599+
*/
600+
struct json_object *first_dic = NULL;
601+
602+
json_object_object_foreach(parsed_struct, key,
603+
val) {
604+
(void)key;
605+
if (json_object_is_type(val,
606+
json_type_object)) {
607+
first_dic = val;
608+
break;
609+
}
610+
}
611+
sldm_parse_side_trace(tl, object_file_offset,
612+
toc->items[i]
613+
.ContentSizeBytes,
614+
first_dic, toc_item);
615+
}
616+
}
582617
}
583618
}
584619

plugins/solidigm/solidigm-telemetry/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ plugin_sources += [
88
'plugins/solidigm/solidigm-telemetry/skht.c',
99
'plugins/solidigm/solidigm-telemetry/debug-info.c',
1010
'plugins/solidigm/solidigm-telemetry/uart-log.c',
11+
'plugins/solidigm/solidigm-telemetry/side-trace.c',
1112
]

0 commit comments

Comments
 (0)