summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Cain <cjcain@us.ibm.com>2018-11-12 17:24:40 -0600
committerChristopher J. Cain <cjcain@us.ibm.com>2018-11-16 09:01:38 -0600
commit1904821d627918e9b50658df255ffdb199868e3e (patch)
treed1a8ae9f6f22f124e5b29fd12296d9bab4e99028
parent6e52f56bd2ccf099ccc540b60bd481c692b8591b (diff)
downloadtalos-occ-1904821d627918e9b50658df255ffdb199868e3e.tar.gz
talos-occ-1904821d627918e9b50658df255ffdb199868e3e.zip
Updates to wofparser tool
Bug fixes and add option to account for unpacked structure on older drivers Change-Id: I0cdb5bdaae4bdc5a2fbeb9ff67f5569765a394f0 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/68681 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Martha Broyles <mbroyles@us.ibm.com> Reviewed-by: William A. Bryan <wilbryan@us.ibm.com> Reviewed-by: Christopher J. Cain <cjcain@us.ibm.com>
-rw-r--r--src/tools/ffdcparser/parser_common.h2
-rw-r--r--src/tools/ffdcparser/wofparser.c47
2 files changed, 45 insertions, 4 deletions
diff --git a/src/tools/ffdcparser/parser_common.h b/src/tools/ffdcparser/parser_common.h
index b6e4bf0..9a202da 100644
--- a/src/tools/ffdcparser/parser_common.h
+++ b/src/tools/ffdcparser/parser_common.h
@@ -246,7 +246,7 @@ uint64_t get_uint64(FILE* i_fhndl)
byte = fgetc(i_fhndl);
if(EOF != byte)
{
- ret |= (byte << (i*8));
+ ret |= ((uint64_t)byte << (i*8));
}
}
diff --git a/src/tools/ffdcparser/wofparser.c b/src/tools/ffdcparser/wofparser.c
index 7da974a..b6dcc9d 100644
--- a/src/tools/ffdcparser/wofparser.c
+++ b/src/tools/ffdcparser/wofparser.c
@@ -60,9 +60,15 @@ void dump_wof_data(wof_data_t * data)
printf("nest_freq_mhz: %d\n", data->nest_freq_mhz);
printf("wof_tables_mhz: %d\n", data->nom_freq_mhz);
printf("rdp_capacity: %d\n", data->rdp_capacity);
- printf("wof_tbls_src_tag: 0x%X\n", data->wof_tbls_src_tag);
- printf("package_name_hi: 0x%08x\n", data->package_name_hi);
- printf("package_name_lo: 0x%08x\n", data->package_name_lo);
+ printf("wof_tbls_src_tag: 0x%016llX \"", data->wof_tbls_src_tag);
+ unsigned char *c = (unsigned char *)&data->wof_tbls_src_tag;
+ for( i = 0; i < 8; i++) printf("%c", c[7-i]); printf("\"\n");
+ printf("package_name_hi: 0x%016llX \"", data->package_name_hi);
+ c = (unsigned char *)&data->package_name_hi;
+ for( i = 0; i < 8; i++) printf("%c", c[7-i]); printf("\"\n");
+ printf("package_name_lo: 0x%016llx \"", data->package_name_lo);
+ c = (unsigned char *)&data->package_name_lo;
+ for( i = 0; i < 8; i++) printf("%c", c[7-i]); printf("\"\n");
printf("vdd_step_from_start: %d\n", data->vdd_step_from_start);
printf("vdn_step_from_start: %d\n", data->vdn_step_from_start);
printf("quad_step_from_start: %d\n", data->quad_step_from_start);
@@ -190,11 +196,27 @@ void dump_wof_data(wof_data_t * data)
printf("avgtemp_vdn[%d]: %d\n",i, data->avgtemp_vdn[i]);
}
+
+#define skip_if_unpacked(bytes) \
+ if (!packed) \
+ { \
+ unsigned int i; \
+ for(i = 0; i < bytes; i++ ) \
+ { \
+ unsigned char c = fgetc(wof_file); \
+ if (c != 0x00) \
+ printf("skip_if_unpacked: WARNING removing non-zero padding byte: 0x%02X\n", c); \
+ /*printf("PACKING: ignoring 0x%02X\n", c);*/ \
+ } \
+ }
+
+
int main(int argc, char** argv)
{
FILE* wof_file = NULL;
wof_data_t data = {0};
uint32_t i = 0;
+ unsigned int packed = 1;
// Verify a file was passed as an argument
if(argc < 2)
@@ -211,6 +233,11 @@ int main(int argc, char** argv)
return -1;
}
}
+ if (argc>2)
+ {
+ fprintf(stderr, "Additional parameter found: ASSUMING UNPACKED STRUCTURE...\n");
+ packed = 0;
+ }
// Get file size
fseek(wof_file, 0, SEEK_END);
@@ -227,6 +254,7 @@ int main(int argc, char** argv)
// Populate struct from file data
data.wof_disabled = get_uint32(wof_file);
data.version = fgetc(wof_file);
+ skip_if_unpacked(1);
data.vfrt_block_size= get_uint16(wof_file);
data.vfrt_blck_hdr_sz = get_uint16(wof_file);
data.vfrt_data_size = get_uint16(wof_file);
@@ -250,17 +278,20 @@ int main(int argc, char** argv)
data.nest_freq_mhz = get_uint16(wof_file);
data.nom_freq_mhz = get_uint16(wof_file);
data.rdp_capacity = get_uint16(wof_file);
+ skip_if_unpacked(2);
data.wof_tbls_src_tag = get_uint64(wof_file);
data.package_name_hi = get_uint64(wof_file);
data.package_name_lo = get_uint64(wof_file);
data.vdd_step_from_start = get_uint16(wof_file);
data.vdn_step_from_start = get_uint16(wof_file);
data.quad_step_from_start = fgetc(wof_file);
+ skip_if_unpacked(3);
for(i = 0; i < MAXIMUM_QUADS; i++)
data.v_core_100uV[i] = get_uint32(wof_file);
data.core_pwr_on = get_uint32(wof_file);
for(i = 0; i < MAXIMUM_QUADS; i++)
data.cores_on_per_quad[i] = fgetc(wof_file);
+ skip_if_unpacked(2);
data.voltvddsense_sensor = get_uint32(wof_file);
for(i = 0; i < MAX_NUM_CORES; i++)
data.tempprocthrmc[i] = get_uint16(wof_file);
@@ -275,6 +306,7 @@ int main(int argc, char** argv)
for(i = 0; i < MAXIMUM_QUADS; i++)
data.quad_v_idx[i] = fgetc(wof_file);
data.quad_ivrm_states = fgetc(wof_file);
+ skip_if_unpacked(3);
data.idc_vdd = get_uint32(wof_file);
data.idc_vdn = get_uint32(wof_file);
data.idc_quad = get_uint32(wof_file);
@@ -285,6 +317,7 @@ int main(int argc, char** argv)
data.f_ratio = get_uint16(wof_file);
data.v_clip = get_uint16(wof_file);
data.f_clip_ps = fgetc(wof_file);
+ skip_if_unpacked(1);
data.f_clip_freq = get_uint32(wof_file);
data.ceff_tdp_vdd = get_uint32(wof_file);
data.ceff_vdd = get_uint32(wof_file);
@@ -293,6 +326,7 @@ int main(int argc, char** argv)
data.ceff_vdn = get_uint32(wof_file);
data.ceff_ratio_vdn = get_uint32(wof_file);
data.chip_volt_idx = fgetc(wof_file);
+ skip_if_unpacked(3);
data.all_cores_off_iso = get_uint32(wof_file);
data.all_good_caches_on_iso = get_uint32(wof_file);
data.all_caches_off_iso = get_uint32(wof_file);
@@ -305,6 +339,7 @@ int main(int argc, char** argv)
data.req_active_quad_update = fgetc(wof_file);
data.prev_req_active_quads = fgetc(wof_file);
data.num_active_quads = fgetc(wof_file);
+ skip_if_unpacked(1);
data.curr_ping_pong_buf = get_uint32(wof_file);
data.next_ping_pong_buf = get_uint32(wof_file);
data.curr_vfrt_main_mem_addr = get_uint32(wof_file);
@@ -312,24 +347,29 @@ int main(int argc, char** argv)
data.vfrt_tbls_main_mem_addr = get_uint32(wof_file);
data.vfrt_tbls_len = get_uint32(wof_file);
data.wof_init_state = fgetc(wof_file);
+ skip_if_unpacked(3);
data.quad_state_0_addr = get_uint32(wof_file);
data.quad_state_1_addr = get_uint32(wof_file);
data.pgpe_wof_state_addr = get_uint32(wof_file);
data.req_active_quads_addr = get_uint32(wof_file);
data.core_leakage_percent = get_uint16(wof_file);
+ skip_if_unpacked(2);
data.pstate_tbl_sram_addr = get_uint32(wof_file);
data.gpe_req_rc = get_uint32(wof_file);
data.control_ipc_rc = get_uint32(wof_file);
data.vfrt_callback_error = fgetc(wof_file);
data.pgpe_wof_off = fgetc(wof_file);
data.pgpe_wof_disabled = fgetc(wof_file);
+ skip_if_unpacked(1);
data.vfrt_mm_offset = get_uint32(wof_file);
data.wof_vfrt_req_rc = fgetc(wof_file);
+ skip_if_unpacked(3);
data.c_ratio_vdd_volt = get_uint32(wof_file);
data.c_ratio_vdd_freq = get_uint32(wof_file);
data.c_ratio_vdn_volt = get_uint32(wof_file);
data.c_ratio_vdn_freq = get_uint32(wof_file);
data.vfrt_state = fgetc(wof_file);
+ skip_if_unpacked(3);
data.all_cores_off_before = get_uint32(wof_file);
data.good_quads_per_sort = fgetc(wof_file);
data.good_normal_cores_per_sort = fgetc(wof_file);
@@ -338,6 +378,7 @@ int main(int argc, char** argv)
data.good_normal_cores[i] = fgetc(wof_file);
for(i = 0; i < MAXIMUM_QUADS; i++)
data.good_caches[i] = fgetc(wof_file);
+ skip_if_unpacked(1);
for(i = 0; i < CORE_IDDQ_MEASUREMENTS; i++)
data.allGoodCoresCachesOn[i] = get_uint16(wof_file);
for(i = 0; i < CORE_IDDQ_MEASUREMENTS; i++)
OpenPOWER on IntegriCloud