162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci#include <linux/types.h> 362306a36Sopenharmony_ci#include <linux/string.h> 462306a36Sopenharmony_ci#include <linux/zalloc.h> 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include "../../../util/event.h" 762306a36Sopenharmony_ci#include "../../../util/synthetic-events.h" 862306a36Sopenharmony_ci#include "../../../util/machine.h" 962306a36Sopenharmony_ci#include "../../../util/tool.h" 1062306a36Sopenharmony_ci#include "../../../util/map.h" 1162306a36Sopenharmony_ci#include "../../../util/debug.h" 1262306a36Sopenharmony_ci#include "../../../util/sample.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_civoid arch_perf_parse_sample_weight(struct perf_sample *data, 1562306a36Sopenharmony_ci const __u64 *array, u64 type) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci union perf_sample_weight weight; 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci weight.full = *array; 2062306a36Sopenharmony_ci if (type & PERF_SAMPLE_WEIGHT) 2162306a36Sopenharmony_ci data->weight = weight.full; 2262306a36Sopenharmony_ci else { 2362306a36Sopenharmony_ci data->weight = weight.var1_dw; 2462306a36Sopenharmony_ci data->ins_lat = weight.var2_w; 2562306a36Sopenharmony_ci data->p_stage_cyc = weight.var3_w; 2662306a36Sopenharmony_ci } 2762306a36Sopenharmony_ci} 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_civoid arch_perf_synthesize_sample_weight(const struct perf_sample *data, 3062306a36Sopenharmony_ci __u64 *array, u64 type) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci *array = data->weight; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci if (type & PERF_SAMPLE_WEIGHT_STRUCT) { 3562306a36Sopenharmony_ci *array &= 0xffffffff; 3662306a36Sopenharmony_ci *array |= ((u64)data->ins_lat << 32); 3762306a36Sopenharmony_ci } 3862306a36Sopenharmony_ci} 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ciconst char *arch_perf_header_entry(const char *se_header) 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci if (!strcmp(se_header, "Local INSTR Latency")) 4362306a36Sopenharmony_ci return "Finish Cyc"; 4462306a36Sopenharmony_ci else if (!strcmp(se_header, "INSTR Latency")) 4562306a36Sopenharmony_ci return "Global Finish_cyc"; 4662306a36Sopenharmony_ci else if (!strcmp(se_header, "Local Pipeline Stage Cycle")) 4762306a36Sopenharmony_ci return "Dispatch Cyc"; 4862306a36Sopenharmony_ci else if (!strcmp(se_header, "Pipeline Stage Cycle")) 4962306a36Sopenharmony_ci return "Global Dispatch_cyc"; 5062306a36Sopenharmony_ci return se_header; 5162306a36Sopenharmony_ci} 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ciint arch_support_sort_key(const char *sort_key) 5462306a36Sopenharmony_ci{ 5562306a36Sopenharmony_ci if (!strcmp(sort_key, "p_stage_cyc")) 5662306a36Sopenharmony_ci return 1; 5762306a36Sopenharmony_ci if (!strcmp(sort_key, "local_p_stage_cyc")) 5862306a36Sopenharmony_ci return 1; 5962306a36Sopenharmony_ci return 0; 6062306a36Sopenharmony_ci} 61