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