a11106544f
This implements perf_event support for the Freescale embedded performance monitor, based on the existing perf_event.c that supports server/classic chips. Some limitations: - Performance monitor interrupts are regular EE interrupts, and thus you can't profile places with interrupts disabled. We may want to implement soft IRQ-disabling, with perfmon interrupts exempted and treated as NMIs. - When trying to schedule multiple event groups at once, and using restricted events, situations could arise where scheduling fails even though it would be possible. Consider three groups, each with two events. One group has restricted events, the others don't. The two non-restricted groups are scheduled, then one is removed, which happens to occupy the two counters that can't do restricted events. The remaining non-restricted group will not be moved to the non-restricted-capable counters to make room if the restricted group tries to be scheduled. Signed-off-by: Scott Wood <scottwood@freescale.com> Acked-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
50 lines
1.4 KiB
C
50 lines
1.4 KiB
C
/*
|
|
* Performance event support - Freescale embedded specific definitions.
|
|
*
|
|
* Copyright 2008-2009 Paul Mackerras, IBM Corporation.
|
|
* Copyright 2010 Freescale Semiconductor, Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
|
|
#include <linux/types.h>
|
|
#include <asm/hw_irq.h>
|
|
|
|
#define MAX_HWEVENTS 4
|
|
|
|
/* event flags */
|
|
#define FSL_EMB_EVENT_VALID 1
|
|
#define FSL_EMB_EVENT_RESTRICTED 2
|
|
|
|
/* upper half of event flags is PMLCb */
|
|
#define FSL_EMB_EVENT_THRESHMUL 0x0000070000000000ULL
|
|
#define FSL_EMB_EVENT_THRESH 0x0000003f00000000ULL
|
|
|
|
struct fsl_emb_pmu {
|
|
const char *name;
|
|
int n_counter; /* total number of counters */
|
|
|
|
/*
|
|
* The number of contiguous counters starting at zero that
|
|
* can hold restricted events, or zero if there are no
|
|
* restricted events.
|
|
*
|
|
* This isn't a very flexible method of expressing constraints,
|
|
* but it's very simple and is adequate for existing chips.
|
|
*/
|
|
int n_restricted;
|
|
|
|
/* Returns event flags and PMLCb (FSL_EMB_EVENT_*) */
|
|
u64 (*xlate_event)(u64 event_id);
|
|
|
|
int n_generic;
|
|
int *generic_events;
|
|
int (*cache_events)[PERF_COUNT_HW_CACHE_MAX]
|
|
[PERF_COUNT_HW_CACHE_OP_MAX]
|
|
[PERF_COUNT_HW_CACHE_RESULT_MAX];
|
|
};
|
|
|
|
int register_fsl_emb_pmu(struct fsl_emb_pmu *);
|