Lines Matching +full:timebase +full:- +full:frequency
1 // SPDX-License-Identifier: GPL-2.0
15 #include "powerpc-vpadtl.h"
36 u64 timebase; member
89 * is invoked with -D
103 len = len - (len % dtl_entry_size); in powerpc_vpadtl_dump()
110 if (dtl->timebase != 0) { in powerpc_vpadtl_dump()
114 dispatch_reasons[dtl->dispatch_reason], in powerpc_vpadtl_dump()
115 preempt_reasons[dtl->preempt_reason], in powerpc_vpadtl_dump()
116 be32_to_cpu(dtl->enqueue_to_dispatch_time), in powerpc_vpadtl_dump()
117 be32_to_cpu(dtl->ready_to_enqueue_time), in powerpc_vpadtl_dump()
118 be32_to_cpu(dtl->waiting_to_ready_time)); in powerpc_vpadtl_dump()
123 boot_tb->boot_tb, boot_tb->tb_freq); in powerpc_vpadtl_dump()
128 len -= pkt_len; in powerpc_vpadtl_dump()
134 struct powerpc_vpadtl_entry *record = vpaq->dtl; in powerpc_vpadtl_timestamp()
141 * Formula used to get timestamp that can be co-related with in powerpc_vpadtl_timestamp()
143 * ((timbase from DTL entry - boot time) / frequency) * 1000000000 in powerpc_vpadtl_timestamp()
145 if (record->timebase) { in powerpc_vpadtl_timestamp()
146 boot_tb = vpaq->boot_tb; in powerpc_vpadtl_timestamp()
147 boot_freq = vpaq->tb_freq; in powerpc_vpadtl_timestamp()
148 diff = be64_to_cpu(record->timebase) - boot_tb; in powerpc_vpadtl_timestamp()
160 return container_of(session->auxtrace, struct powerpc_vpadtl, auxtrace); in session_to_vpa()
172 * - sample ip is picked from srr0 field of powerpc_vpadtl_entry
173 * - sample cpu is logical cpu.
174 * - cpumode is set to PERF_RECORD_MISC_KERNEL
175 * - Additionally save the details in raw_data of sample. This
177 * when called from builtin-script
185 sample.ip = be64_to_cpu(record->srr0); in powerpc_vpadtl_sample()
188 sample.id = vpa->sample_id; in powerpc_vpadtl_sample()
200 if (perf_session__deliver_synth_event(vpa->session, &event, &sample)) { in powerpc_vpadtl_sample()
202 return -1; in powerpc_vpadtl_sample()
210 struct auxtrace_buffer *buffer = vpaq->buffer; in powerpc_vpadtl_get_buffer()
211 struct auxtrace_queues *queues = &vpaq->vpa->queues; in powerpc_vpadtl_get_buffer()
214 queue = &queues->queue_array[vpaq->queue_nr]; in powerpc_vpadtl_get_buffer()
220 vpaq->buffer = buffer; in powerpc_vpadtl_get_buffer()
221 vpaq->size = buffer->size; in powerpc_vpadtl_get_buffer()
224 if (!buffer->data) { in powerpc_vpadtl_get_buffer()
226 int fd = perf_data__fd(vpaq->vpa->session->data); in powerpc_vpadtl_get_buffer()
228 buffer->data = auxtrace_buffer__get_data(buffer, fd); in powerpc_vpadtl_get_buffer()
229 if (!buffer->data) in powerpc_vpadtl_get_buffer()
230 return -ENOMEM; in powerpc_vpadtl_get_buffer()
233 vpaq->buf_len = buffer->size; in powerpc_vpadtl_get_buffer()
235 if (buffer->size % dtl_entry_size) in powerpc_vpadtl_get_buffer()
236 vpaq->buf_len = buffer->size - (buffer->size % dtl_entry_size); in powerpc_vpadtl_get_buffer()
238 if (vpaq->tb_buffer != buffer->buffer_nr) { in powerpc_vpadtl_get_buffer()
239 vpaq->pkt_len = 0; in powerpc_vpadtl_get_buffer()
240 vpaq->tb_buffer = 0; in powerpc_vpadtl_get_buffer()
247 * The first entry in the queue for VPA DTL PMU has the boot timebase,
248 * frequency details which are needed to get timestamp which is required to
263 boottb = (struct boottb_freq *)vpaq->buffer->data; in powerpc_vpadtl_decode()
264 if (boottb->timebase == 0) { in powerpc_vpadtl_decode()
265 vpaq->boot_tb = boottb->boot_tb; in powerpc_vpadtl_decode()
266 vpaq->tb_freq = boottb->tb_freq; in powerpc_vpadtl_decode()
267 vpaq->pkt_len += dtl_entry_size; in powerpc_vpadtl_decode()
270 buf = vpaq->buffer->data; in powerpc_vpadtl_decode()
271 buf += vpaq->pkt_len; in powerpc_vpadtl_decode()
272 vpaq->dtl = (struct powerpc_vpadtl_entry *)buf; in powerpc_vpadtl_decode()
274 vpaq->tb_buffer = vpaq->buffer->buffer_nr; in powerpc_vpadtl_decode()
275 vpaq->buffer = NULL; in powerpc_vpadtl_decode()
276 vpaq->buf_len = 0; in powerpc_vpadtl_decode()
286 if (!vpaq->buf_len || vpaq->pkt_len == vpaq->size) { in powerpc_vpadtl_decode_all()
292 if (vpaq->buffer) { in powerpc_vpadtl_decode_all()
293 buf = vpaq->buffer->data; in powerpc_vpadtl_decode_all()
294 buf += vpaq->pkt_len; in powerpc_vpadtl_decode_all()
295 vpaq->dtl = (struct powerpc_vpadtl_entry *)buf; in powerpc_vpadtl_decode_all()
296 if ((long long)be64_to_cpu(vpaq->dtl->timebase) <= 0) { in powerpc_vpadtl_decode_all()
297 if (vpaq->pkt_len != dtl_entry_size && vpaq->buf_len) { in powerpc_vpadtl_decode_all()
298 vpaq->pkt_len += dtl_entry_size; in powerpc_vpadtl_decode_all()
299 vpaq->buf_len -= dtl_entry_size; in powerpc_vpadtl_decode_all()
301 return -1; in powerpc_vpadtl_decode_all()
303 vpaq->pkt_len += dtl_entry_size; in powerpc_vpadtl_decode_all()
304 vpaq->buf_len -= dtl_entry_size; in powerpc_vpadtl_decode_all()
314 struct powerpc_vpadtl *vpa = vpaq->vpa; in powerpc_vpadtl_run_decoder()
333 record = vpaq->dtl; in powerpc_vpadtl_run_decoder()
338 if (vpaq_timestamp > vpaq->timestamp) in powerpc_vpadtl_run_decoder()
339 vpaq->timestamp = vpaq_timestamp; in powerpc_vpadtl_run_decoder()
346 if (vpaq->timestamp >= *timestamp) { in powerpc_vpadtl_run_decoder()
347 *timestamp = vpaq->timestamp; in powerpc_vpadtl_run_decoder()
348 vpaq->pkt_len -= dtl_entry_size; in powerpc_vpadtl_run_decoder()
349 vpaq->buf_len += dtl_entry_size; in powerpc_vpadtl_run_decoder()
353 ret = powerpc_vpadtl_sample(record, vpa, vpaq_timestamp, vpaq->cpu); in powerpc_vpadtl_run_decoder()
379 if (!vpa->heap.heap_cnt) in powerpc_vpadtl_process_queues()
382 if (vpa->heap.heap_array[0].ordinal >= timestamp) in powerpc_vpadtl_process_queues()
385 queue_nr = vpa->heap.heap_array[0].queue_nr; in powerpc_vpadtl_process_queues()
386 queue = &vpa->queues.queue_array[queue_nr]; in powerpc_vpadtl_process_queues()
387 vpaq = queue->priv; in powerpc_vpadtl_process_queues()
389 auxtrace_heap__pop(&vpa->heap); in powerpc_vpadtl_process_queues()
391 if (vpa->heap.heap_cnt) { in powerpc_vpadtl_process_queues()
392 ts = vpa->heap.heap_array[0].ordinal + 1; in powerpc_vpadtl_process_queues()
401 auxtrace_heap__add(&vpa->heap, queue_nr, ts); in powerpc_vpadtl_process_queues()
406 ret = auxtrace_heap__add(&vpa->heap, queue_nr, ts); in powerpc_vpadtl_process_queues()
410 vpaq->on_heap = false; in powerpc_vpadtl_process_queues()
425 vpaq->vpa = vpa; in powerpc_vpadtl__alloc_queue()
426 vpaq->queue_nr = queue_nr; in powerpc_vpadtl__alloc_queue()
450 struct powerpc_vpadtl_queue *vpaq = queue->priv; in powerpc_vpadtl__setup_queue()
452 if (list_empty(&queue->head) || vpaq) in powerpc_vpadtl__setup_queue()
457 return -ENOMEM; in powerpc_vpadtl__setup_queue()
459 queue->priv = vpaq; in powerpc_vpadtl__setup_queue()
461 if (queue->cpu != -1) in powerpc_vpadtl__setup_queue()
462 vpaq->cpu = queue->cpu; in powerpc_vpadtl__setup_queue()
464 if (!vpaq->on_heap) { in powerpc_vpadtl__setup_queue()
474 vpaq->timestamp = powerpc_vpadtl_timestamp(vpaq); in powerpc_vpadtl__setup_queue()
476 ret = auxtrace_heap__add(&vpa->heap, queue_nr, vpaq->timestamp); in powerpc_vpadtl__setup_queue()
479 vpaq->on_heap = true; in powerpc_vpadtl__setup_queue()
490 for (i = 0; i < vpa->queues.nr_queues; i++) { in powerpc_vpadtl__setup_queues()
491 ret = powerpc_vpadtl__setup_queue(vpa, &vpa->queues.queue_array[i], i); in powerpc_vpadtl__setup_queues()
501 if (vpa->queues.new_data) { in powerpc_vpadtl__update_queues()
502 vpa->queues.new_data = false; in powerpc_vpadtl__update_queues()
520 if (!tool->ordered_events) { in powerpc_vpadtl_process_event()
522 return -EINVAL; in powerpc_vpadtl_process_event()
525 if (sample->time) { in powerpc_vpadtl_process_event()
530 err = powerpc_vpadtl_process_queues(vpa, sample->time); in powerpc_vpadtl_process_event()
545 int fd = perf_data__fd(session->data); in powerpc_vpadtl_process_auxtrace_event()
552 if (perf_data__is_pipe(session->data)) { in powerpc_vpadtl_process_auxtrace_event()
556 if (data_offset == -1) in powerpc_vpadtl_process_auxtrace_event()
557 return -errno; in powerpc_vpadtl_process_auxtrace_event()
560 err = auxtrace_queues__add_event(&vpa->queues, session, event, in powerpc_vpadtl_process_auxtrace_event()
568 powerpc_vpadtl_dump_event(vpa, buffer->data, buffer->size); in powerpc_vpadtl_process_auxtrace_event()
584 struct auxtrace_queues *queues = &vpa->queues; in powerpc_vpadtl_free_events()
586 for (unsigned int i = 0; i < queues->nr_queues; i++) in powerpc_vpadtl_free_events()
587 zfree(&queues->queue_array[i].priv); in powerpc_vpadtl_free_events()
596 auxtrace_heap__free(&vpa->heap); in powerpc_vpadtl_free()
598 session->auxtrace = NULL; in powerpc_vpadtl_free()
620 if (evsel->core.id && evsel->core.id[0] == id) { in set_event_name()
621 if (evsel->name) in set_event_name()
622 zfree(&evsel->name); in set_event_name()
623 evsel->name = strdup(name); in set_event_name()
632 struct evlist *evlist = session->evlist; in powerpc_vpadtl_synth_events()
640 if (strstarts(evsel->name, "vpa_dtl")) { in powerpc_vpadtl_synth_events()
653 attr.sample_type = evsel->core.attr.sample_type; in powerpc_vpadtl_synth_events()
654 attr.sample_id_all = evsel->core.attr.sample_id_all; in powerpc_vpadtl_synth_events()
659 id = evsel->core.id[0] + 1000000000; in powerpc_vpadtl_synth_events()
667 vpa->sample_id = id; in powerpc_vpadtl_synth_events()
668 set_event_name(evlist, id, "vpa-dtl"); in powerpc_vpadtl_synth_events()
683 struct perf_record_auxtrace_info *auxtrace_info = &event->auxtrace_info; in powerpc_vpadtl_process_auxtrace_info()
688 if (auxtrace_info->header.size < sizeof(struct perf_record_auxtrace_info) + in powerpc_vpadtl_process_auxtrace_info()
690 return -EINVAL; in powerpc_vpadtl_process_auxtrace_info()
694 return -ENOMEM; in powerpc_vpadtl_process_auxtrace_info()
696 err = auxtrace_queues__init(&vpa->queues); in powerpc_vpadtl_process_auxtrace_info()
700 vpa->session = session; in powerpc_vpadtl_process_auxtrace_info()
701 vpa->machine = &session->machines.host; /* No kvm support */ in powerpc_vpadtl_process_auxtrace_info()
702 vpa->auxtrace_type = auxtrace_info->type; in powerpc_vpadtl_process_auxtrace_info()
703 vpa->pmu_type = auxtrace_info->priv[POWERPC_VPADTL_TYPE]; in powerpc_vpadtl_process_auxtrace_info()
705 vpa->auxtrace.process_event = powerpc_vpadtl_process_event; in powerpc_vpadtl_process_auxtrace_info()
706 vpa->auxtrace.process_auxtrace_event = powerpc_vpadtl_process_auxtrace_event; in powerpc_vpadtl_process_auxtrace_info()
707 vpa->auxtrace.flush_events = powerpc_vpadtl_flush; in powerpc_vpadtl_process_auxtrace_info()
708 vpa->auxtrace.free_events = powerpc_vpadtl_free_events; in powerpc_vpadtl_process_auxtrace_info()
709 vpa->auxtrace.free = powerpc_vpadtl_free; in powerpc_vpadtl_process_auxtrace_info()
710 session->auxtrace = &vpa->auxtrace; in powerpc_vpadtl_process_auxtrace_info()
712 powerpc_vpadtl_print_info(&auxtrace_info->priv[0]); in powerpc_vpadtl_process_auxtrace_info()
721 err = auxtrace_queues__process_index(&vpa->queues, session); in powerpc_vpadtl_process_auxtrace_info()
728 auxtrace_queues__free(&vpa->queues); in powerpc_vpadtl_process_auxtrace_info()
729 session->auxtrace = NULL; in powerpc_vpadtl_process_auxtrace_info()