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