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