xref: /linux/tools/perf/arch/powerpc/util/auxtrace.c (revision ec714e371f22f716a04e6ecb2a24988c92b26911)
1*1dbfaf94SAthira Rajeev // SPDX-License-Identifier: GPL-2.0
2*1dbfaf94SAthira Rajeev /*
3*1dbfaf94SAthira Rajeev  * VPA support
4*1dbfaf94SAthira Rajeev  */
5*1dbfaf94SAthira Rajeev 
6*1dbfaf94SAthira Rajeev #include <linux/kernel.h>
7*1dbfaf94SAthira Rajeev #include <linux/types.h>
8*1dbfaf94SAthira Rajeev #include <linux/string.h>
9*1dbfaf94SAthira Rajeev 
10*1dbfaf94SAthira Rajeev #include "../../util/evlist.h"
11*1dbfaf94SAthira Rajeev #include "../../util/debug.h"
12*1dbfaf94SAthira Rajeev #include "../../util/auxtrace.h"
13*1dbfaf94SAthira Rajeev #include "../../util/powerpc-vpadtl.h"
14*1dbfaf94SAthira Rajeev #include "../../util/record.h"
15*1dbfaf94SAthira Rajeev #include <internal/lib.h> // page_size
16*1dbfaf94SAthira Rajeev 
17*1dbfaf94SAthira Rajeev #define KiB(x) ((x) * 1024)
18*1dbfaf94SAthira Rajeev 
19*1dbfaf94SAthira Rajeev static int
powerpc_vpadtl_recording_options(struct auxtrace_record * ar __maybe_unused,struct evlist * evlist __maybe_unused,struct record_opts * opts)20*1dbfaf94SAthira Rajeev powerpc_vpadtl_recording_options(struct auxtrace_record *ar __maybe_unused,
21*1dbfaf94SAthira Rajeev 			struct evlist *evlist __maybe_unused,
22*1dbfaf94SAthira Rajeev 			struct record_opts *opts)
23*1dbfaf94SAthira Rajeev {
24*1dbfaf94SAthira Rajeev 	opts->full_auxtrace = true;
25*1dbfaf94SAthira Rajeev 
26*1dbfaf94SAthira Rajeev 	/*
27*1dbfaf94SAthira Rajeev 	 * Set auxtrace_mmap_pages to minimum
28*1dbfaf94SAthira Rajeev 	 * two pages
29*1dbfaf94SAthira Rajeev 	 */
30*1dbfaf94SAthira Rajeev 	if (!opts->auxtrace_mmap_pages) {
31*1dbfaf94SAthira Rajeev 		opts->auxtrace_mmap_pages = KiB(128) / page_size;
32*1dbfaf94SAthira Rajeev 		if (opts->mmap_pages == UINT_MAX)
33*1dbfaf94SAthira Rajeev 			opts->mmap_pages = KiB(256) / page_size;
34*1dbfaf94SAthira Rajeev 	}
35*1dbfaf94SAthira Rajeev 
36*1dbfaf94SAthira Rajeev 	return 0;
37*1dbfaf94SAthira Rajeev }
38*1dbfaf94SAthira Rajeev 
powerpc_vpadtl_info_priv_size(struct auxtrace_record * itr __maybe_unused,struct evlist * evlist __maybe_unused)39*1dbfaf94SAthira Rajeev static size_t powerpc_vpadtl_info_priv_size(struct auxtrace_record *itr __maybe_unused,
40*1dbfaf94SAthira Rajeev 					struct evlist *evlist __maybe_unused)
41*1dbfaf94SAthira Rajeev {
42*1dbfaf94SAthira Rajeev 	return VPADTL_AUXTRACE_PRIV_SIZE;
43*1dbfaf94SAthira Rajeev }
44*1dbfaf94SAthira Rajeev 
45*1dbfaf94SAthira Rajeev static int
powerpc_vpadtl_info_fill(struct auxtrace_record * itr __maybe_unused,struct perf_session * session __maybe_unused,struct perf_record_auxtrace_info * auxtrace_info,size_t priv_size __maybe_unused)46*1dbfaf94SAthira Rajeev powerpc_vpadtl_info_fill(struct auxtrace_record *itr __maybe_unused,
47*1dbfaf94SAthira Rajeev 		struct perf_session *session __maybe_unused,
48*1dbfaf94SAthira Rajeev 		struct perf_record_auxtrace_info *auxtrace_info,
49*1dbfaf94SAthira Rajeev 		size_t priv_size __maybe_unused)
50*1dbfaf94SAthira Rajeev {
51*1dbfaf94SAthira Rajeev 	auxtrace_info->type = PERF_AUXTRACE_VPA_DTL;
52*1dbfaf94SAthira Rajeev 
53*1dbfaf94SAthira Rajeev 	return 0;
54*1dbfaf94SAthira Rajeev }
55*1dbfaf94SAthira Rajeev 
powerpc_vpadtl_free(struct auxtrace_record * itr)56*1dbfaf94SAthira Rajeev static void powerpc_vpadtl_free(struct auxtrace_record *itr)
57*1dbfaf94SAthira Rajeev {
58*1dbfaf94SAthira Rajeev 	free(itr);
59*1dbfaf94SAthira Rajeev }
60*1dbfaf94SAthira Rajeev 
powerpc_vpadtl_reference(struct auxtrace_record * itr __maybe_unused)61*1dbfaf94SAthira Rajeev static u64 powerpc_vpadtl_reference(struct auxtrace_record *itr __maybe_unused)
62*1dbfaf94SAthira Rajeev {
63*1dbfaf94SAthira Rajeev 	return 0;
64*1dbfaf94SAthira Rajeev }
65*1dbfaf94SAthira Rajeev 
auxtrace_record__init(struct evlist * evlist,int * err)66*1dbfaf94SAthira Rajeev struct auxtrace_record *auxtrace_record__init(struct evlist *evlist,
67*1dbfaf94SAthira Rajeev 						int *err)
68*1dbfaf94SAthira Rajeev {
69*1dbfaf94SAthira Rajeev 	struct auxtrace_record *aux;
70*1dbfaf94SAthira Rajeev 	struct evsel *pos;
71*1dbfaf94SAthira Rajeev 	int found = 0;
72*1dbfaf94SAthira Rajeev 
73*1dbfaf94SAthira Rajeev 	evlist__for_each_entry(evlist, pos) {
74*1dbfaf94SAthira Rajeev 		if (strstarts(pos->name, "vpa_dtl")) {
75*1dbfaf94SAthira Rajeev 			found = 1;
76*1dbfaf94SAthira Rajeev 			pos->needs_auxtrace_mmap = true;
77*1dbfaf94SAthira Rajeev 			break;
78*1dbfaf94SAthira Rajeev 		}
79*1dbfaf94SAthira Rajeev 	}
80*1dbfaf94SAthira Rajeev 
81*1dbfaf94SAthira Rajeev 	if (!found)
82*1dbfaf94SAthira Rajeev 		return NULL;
83*1dbfaf94SAthira Rajeev 
84*1dbfaf94SAthira Rajeev 	/*
85*1dbfaf94SAthira Rajeev 	 * To obtain the auxtrace buffer file descriptor, the auxtrace event
86*1dbfaf94SAthira Rajeev 	 * must come first.
87*1dbfaf94SAthira Rajeev 	 */
88*1dbfaf94SAthira Rajeev 	evlist__to_front(pos->evlist, pos);
89*1dbfaf94SAthira Rajeev 
90*1dbfaf94SAthira Rajeev 	aux = zalloc(sizeof(*aux));
91*1dbfaf94SAthira Rajeev 	if (aux == NULL) {
92*1dbfaf94SAthira Rajeev 		pr_debug("aux record is NULL\n");
93*1dbfaf94SAthira Rajeev 		*err = -ENOMEM;
94*1dbfaf94SAthira Rajeev 		return NULL;
95*1dbfaf94SAthira Rajeev 	}
96*1dbfaf94SAthira Rajeev 
97*1dbfaf94SAthira Rajeev 	aux->recording_options = powerpc_vpadtl_recording_options;
98*1dbfaf94SAthira Rajeev 	aux->info_priv_size = powerpc_vpadtl_info_priv_size;
99*1dbfaf94SAthira Rajeev 	aux->info_fill = powerpc_vpadtl_info_fill;
100*1dbfaf94SAthira Rajeev 	aux->free = powerpc_vpadtl_free;
101*1dbfaf94SAthira Rajeev 	aux->reference = powerpc_vpadtl_reference;
102*1dbfaf94SAthira Rajeev 	return aux;
103*1dbfaf94SAthira Rajeev }
104