83 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * Copyright(C) 2015 Linaro Limited. All rights reserved.4 * Author: Mathieu Poirier <mathieu.poirier@linaro.org>5 */6 7#ifndef _CORESIGHT_ETM_PERF_H8#define _CORESIGHT_ETM_PERF_H9 10#include <linux/percpu-defs.h>11#include "coresight-priv.h"12 13struct coresight_device;14struct cscfg_config_desc;15 16/*17 * In both ETMv3 and v4 the maximum number of address comparator implentable18 * is 8. The actual number is implementation specific and will be checked19 * when filters are applied.20 */21#define ETM_ADDR_CMP_MAX 822 23/**24 * struct etm_filter - single instruction range or start/stop configuration.25 * @start_addr: The address to start tracing on.26 * @stop_addr: The address to stop tracing on.27 * @type: Is this a range or start/stop filter.28 */29struct etm_filter {30 unsigned long start_addr;31 unsigned long stop_addr;32 enum etm_addr_type type;33};34 35/**36 * struct etm_filters - set of filters for a session37 * @etm_filter: All the filters for this session.38 * @nr_filters: Number of filters39 * @ssstatus: Status of the start/stop logic.40 */41struct etm_filters {42 struct etm_filter etm_filter[ETM_ADDR_CMP_MAX];43 unsigned int nr_filters;44 bool ssstatus;45};46 47/**48 * struct etm_event_data - Coresight specifics associated to an event49 * @work: Handle to free allocated memory outside IRQ context.50 * @mask: Hold the CPU(s) this event was set for.51 * @aux_hwid_done: Whether a CPU has emitted the TraceID packet or not.52 * @snk_config: The sink configuration.53 * @cfg_hash: The hash id of any coresight config selected.54 * @path: An array of path, each slot for one CPU.55 */56struct etm_event_data {57 struct work_struct work;58 cpumask_t mask;59 cpumask_t aux_hwid_done;60 void *snk_config;61 u32 cfg_hash;62 struct list_head * __percpu *path;63};64 65int etm_perf_symlink(struct coresight_device *csdev, bool link);66int etm_perf_add_symlink_sink(struct coresight_device *csdev);67void etm_perf_del_symlink_sink(struct coresight_device *csdev);68static inline void *etm_perf_sink_config(struct perf_output_handle *handle)69{70 struct etm_event_data *data = perf_get_aux(handle);71 72 if (data)73 return data->snk_config;74 return NULL;75}76int etm_perf_add_symlink_cscfg(struct device *dev,77 struct cscfg_config_desc *config_desc);78void etm_perf_del_symlink_cscfg(struct cscfg_config_desc *config_desc);79int __init etm_perf_init(void);80void etm_perf_exit(void);81 82#endif83