xref: /openbmc/linux/drivers/hwtracing/coresight/coresight-etm-perf.h (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
1ad0dfdfdSMathieu Poirier /* SPDX-License-Identifier: GPL-2.0 */
20bcbf2e3SMathieu Poirier /*
30bcbf2e3SMathieu Poirier  * Copyright(C) 2015 Linaro Limited. All rights reserved.
40bcbf2e3SMathieu Poirier  * Author: Mathieu Poirier <mathieu.poirier@linaro.org>
50bcbf2e3SMathieu Poirier  */
60bcbf2e3SMathieu Poirier 
70bcbf2e3SMathieu Poirier #ifndef _CORESIGHT_ETM_PERF_H
80bcbf2e3SMathieu Poirier #define _CORESIGHT_ETM_PERF_H
90bcbf2e3SMathieu Poirier 
10d25054eeSSuzuki K Poulose #include <linux/percpu-defs.h>
11ca878b14SMathieu Poirier #include "coresight-priv.h"
12ca878b14SMathieu Poirier 
130bcbf2e3SMathieu Poirier struct coresight_device;
1494d2bac5SMike Leach struct cscfg_config_desc;
150bcbf2e3SMathieu Poirier 
16ca878b14SMathieu Poirier /*
17ca878b14SMathieu Poirier  * In both ETMv3 and v4 the maximum number of address comparator implentable
18ca878b14SMathieu Poirier  * is 8.  The actual number is implementation specific and will be checked
19ca878b14SMathieu Poirier  * when filters are applied.
20ca878b14SMathieu Poirier  */
21ca878b14SMathieu Poirier #define ETM_ADDR_CMP_MAX	8
22ca878b14SMathieu Poirier 
23ca878b14SMathieu Poirier /**
24ca878b14SMathieu Poirier  * struct etm_filter - single instruction range or start/stop configuration.
25ca878b14SMathieu Poirier  * @start_addr:	The address to start tracing on.
26ca878b14SMathieu Poirier  * @stop_addr:	The address to stop tracing on.
27ca878b14SMathieu Poirier  * @type:	Is this a range or start/stop filter.
28ca878b14SMathieu Poirier  */
29ca878b14SMathieu Poirier struct etm_filter {
30ca878b14SMathieu Poirier 	unsigned long start_addr;
31ca878b14SMathieu Poirier 	unsigned long stop_addr;
32ca878b14SMathieu Poirier 	enum etm_addr_type type;
33ca878b14SMathieu Poirier };
34ca878b14SMathieu Poirier 
35ca878b14SMathieu Poirier /**
36ca878b14SMathieu Poirier  * struct etm_filters - set of filters for a session
37ca878b14SMathieu Poirier  * @etm_filter:	All the filters for this session.
38ca878b14SMathieu Poirier  * @nr_filters:	Number of filters
39ca878b14SMathieu Poirier  * @ssstatus:	Status of the start/stop logic.
40ca878b14SMathieu Poirier  */
41ca878b14SMathieu Poirier struct etm_filters {
42ca878b14SMathieu Poirier 	struct etm_filter	etm_filter[ETM_ADDR_CMP_MAX];
43ca878b14SMathieu Poirier 	unsigned int		nr_filters;
44ca878b14SMathieu Poirier 	bool			ssstatus;
45ca878b14SMathieu Poirier };
46ca878b14SMathieu Poirier 
47d25054eeSSuzuki K Poulose /**
48d25054eeSSuzuki K Poulose  * struct etm_event_data - Coresight specifics associated to an event
49d25054eeSSuzuki K Poulose  * @work:		Handle to free allocated memory outside IRQ context.
50d25054eeSSuzuki K Poulose  * @mask:		Hold the CPU(s) this event was set for.
51*a646ca09SSuzuki K Poulose  * @aux_hwid_done:	Whether a CPU has emitted the TraceID packet or not.
52d25054eeSSuzuki K Poulose  * @snk_config:		The sink configuration.
53a0114b47SMike Leach  * @cfg_hash:		The hash id of any coresight config selected.
54d25054eeSSuzuki K Poulose  * @path:		An array of path, each slot for one CPU.
55d25054eeSSuzuki K Poulose  */
56d25054eeSSuzuki K Poulose struct etm_event_data {
57d25054eeSSuzuki K Poulose 	struct work_struct work;
58d25054eeSSuzuki K Poulose 	cpumask_t mask;
59*a646ca09SSuzuki K Poulose 	cpumask_t aux_hwid_done;
60d25054eeSSuzuki K Poulose 	void *snk_config;
61a0114b47SMike Leach 	u32 cfg_hash;
62d25054eeSSuzuki K Poulose 	struct list_head * __percpu *path;
63d25054eeSSuzuki K Poulose };
64ca878b14SMathieu Poirier 
65b8127113SKim Phillips #if IS_ENABLED(CONFIG_CORESIGHT)
660bcbf2e3SMathieu Poirier int etm_perf_symlink(struct coresight_device *csdev, bool link);
67bb8e370bSMathieu Poirier int etm_perf_add_symlink_sink(struct coresight_device *csdev);
68bb8e370bSMathieu Poirier void etm_perf_del_symlink_sink(struct coresight_device *csdev);
etm_perf_sink_config(struct perf_output_handle * handle)69d25054eeSSuzuki K Poulose static inline void *etm_perf_sink_config(struct perf_output_handle *handle)
70d25054eeSSuzuki K Poulose {
71d25054eeSSuzuki K Poulose 	struct etm_event_data *data = perf_get_aux(handle);
720bcbf2e3SMathieu Poirier 
73d25054eeSSuzuki K Poulose 	if (data)
74d25054eeSSuzuki K Poulose 		return data->snk_config;
75d25054eeSSuzuki K Poulose 	return NULL;
76d25054eeSSuzuki K Poulose }
7794d2bac5SMike Leach int etm_perf_add_symlink_cscfg(struct device *dev,
7894d2bac5SMike Leach 			       struct cscfg_config_desc *config_desc);
7994d2bac5SMike Leach void etm_perf_del_symlink_cscfg(struct cscfg_config_desc *config_desc);
800bcbf2e3SMathieu Poirier #else
etm_perf_symlink(struct coresight_device * csdev,bool link)810bcbf2e3SMathieu Poirier static inline int etm_perf_symlink(struct coresight_device *csdev, bool link)
820bcbf2e3SMathieu Poirier { return -EINVAL; }
etm_perf_add_symlink_sink(struct coresight_device * csdev)83bb8e370bSMathieu Poirier int etm_perf_add_symlink_sink(struct coresight_device *csdev)
84bb8e370bSMathieu Poirier { return -EINVAL; }
etm_perf_del_symlink_sink(struct coresight_device * csdev)85bb8e370bSMathieu Poirier void etm_perf_del_symlink_sink(struct coresight_device *csdev) {}
etm_perf_sink_config(struct perf_output_handle * handle)86d25054eeSSuzuki K Poulose static inline void *etm_perf_sink_config(struct perf_output_handle *handle)
87d25054eeSSuzuki K Poulose {
88d25054eeSSuzuki K Poulose 	return NULL;
89d25054eeSSuzuki K Poulose }
etm_perf_add_symlink_cscfg(struct device * dev,struct cscfg_config_desc * config_desc)9094d2bac5SMike Leach int etm_perf_add_symlink_cscfg(struct device *dev,
9194d2bac5SMike Leach 			       struct cscfg_config_desc *config_desc)
9294d2bac5SMike Leach { return -EINVAL; }
etm_perf_del_symlink_cscfg(struct cscfg_config_desc * config_desc)9394d2bac5SMike Leach void etm_perf_del_symlink_cscfg(struct cscfg_config_desc *config_desc) {}
94d25054eeSSuzuki K Poulose 
950bcbf2e3SMathieu Poirier #endif /* CONFIG_CORESIGHT */
960bcbf2e3SMathieu Poirier 
978e264c52STingwei Zhang int __init etm_perf_init(void);
9885e2414cSMike Leach void etm_perf_exit(void);
998e264c52STingwei Zhang 
1000bcbf2e3SMathieu Poirier #endif
101