1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (c) 2012, The Linux Foundation. All rights reserved. 4 */ 5 6 #ifndef _LINUX_CORESIGHT_H 7 #define _LINUX_CORESIGHT_H 8 9 #include <linux/device.h> 10 #include <linux/perf_event.h> 11 #include <linux/sched.h> 12 13 /* Peripheral id registers (0xFD0-0xFEC) */ 14 #define CORESIGHT_PERIPHIDR4 0xfd0 15 #define CORESIGHT_PERIPHIDR5 0xfd4 16 #define CORESIGHT_PERIPHIDR6 0xfd8 17 #define CORESIGHT_PERIPHIDR7 0xfdC 18 #define CORESIGHT_PERIPHIDR0 0xfe0 19 #define CORESIGHT_PERIPHIDR1 0xfe4 20 #define CORESIGHT_PERIPHIDR2 0xfe8 21 #define CORESIGHT_PERIPHIDR3 0xfeC 22 /* Component id registers (0xFF0-0xFFC) */ 23 #define CORESIGHT_COMPIDR0 0xff0 24 #define CORESIGHT_COMPIDR1 0xff4 25 #define CORESIGHT_COMPIDR2 0xff8 26 #define CORESIGHT_COMPIDR3 0xffC 27 28 #define ETM_ARCH_V3_3 0x23 29 #define ETM_ARCH_V3_5 0x25 30 #define PFT_ARCH_V1_0 0x30 31 #define PFT_ARCH_V1_1 0x31 32 33 #define CORESIGHT_UNLOCK 0xc5acce55 34 35 extern struct bus_type coresight_bustype; 36 37 enum coresight_dev_type { 38 CORESIGHT_DEV_TYPE_NONE, 39 CORESIGHT_DEV_TYPE_SINK, 40 CORESIGHT_DEV_TYPE_LINK, 41 CORESIGHT_DEV_TYPE_LINKSINK, 42 CORESIGHT_DEV_TYPE_SOURCE, 43 }; 44 45 enum coresight_dev_subtype_sink { 46 CORESIGHT_DEV_SUBTYPE_SINK_NONE, 47 CORESIGHT_DEV_SUBTYPE_SINK_PORT, 48 CORESIGHT_DEV_SUBTYPE_SINK_BUFFER, 49 }; 50 51 enum coresight_dev_subtype_link { 52 CORESIGHT_DEV_SUBTYPE_LINK_NONE, 53 CORESIGHT_DEV_SUBTYPE_LINK_MERG, 54 CORESIGHT_DEV_SUBTYPE_LINK_SPLIT, 55 CORESIGHT_DEV_SUBTYPE_LINK_FIFO, 56 }; 57 58 enum coresight_dev_subtype_source { 59 CORESIGHT_DEV_SUBTYPE_SOURCE_NONE, 60 CORESIGHT_DEV_SUBTYPE_SOURCE_PROC, 61 CORESIGHT_DEV_SUBTYPE_SOURCE_BUS, 62 CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE, 63 }; 64 65 /** 66 * struct coresight_dev_subtype - further characterisation of a type 67 * @sink_subtype: type of sink this component is, as defined 68 by @coresight_dev_subtype_sink. 69 * @link_subtype: type of link this component is, as defined 70 by @coresight_dev_subtype_link. 71 * @source_subtype: type of source this component is, as defined 72 by @coresight_dev_subtype_source. 73 */ 74 struct coresight_dev_subtype { 75 enum coresight_dev_subtype_sink sink_subtype; 76 enum coresight_dev_subtype_link link_subtype; 77 enum coresight_dev_subtype_source source_subtype; 78 }; 79 80 /** 81 * struct coresight_platform_data - data harvested from the DT specification 82 * @cpu: the CPU a source belongs to. Only applicable for ETM/PTMs. 83 * @name: name of the component as shown under sysfs. 84 * @nr_inport: number of input ports for this component. 85 * @outports: list of remote endpoint port number. 86 * @child_names:name of all child components connected to this device. 87 * @child_ports:child component port number the current component is 88 connected to. 89 * @nr_outport: number of output ports for this component. 90 * @clk: The clock this component is associated to. 91 */ 92 struct coresight_platform_data { 93 int cpu; 94 const char *name; 95 int nr_inport; 96 int *outports; 97 const char **child_names; 98 int *child_ports; 99 int nr_outport; 100 struct clk *clk; 101 }; 102 103 /** 104 * struct coresight_desc - description of a component required from drivers 105 * @type: as defined by @coresight_dev_type. 106 * @subtype: as defined by @coresight_dev_subtype. 107 * @ops: generic operations for this component, as defined 108 by @coresight_ops. 109 * @pdata: platform data collected from DT. 110 * @dev: The device entity associated to this component. 111 * @groups: operations specific to this component. These will end up 112 in the component's sysfs sub-directory. 113 */ 114 struct coresight_desc { 115 enum coresight_dev_type type; 116 struct coresight_dev_subtype subtype; 117 const struct coresight_ops *ops; 118 struct coresight_platform_data *pdata; 119 struct device *dev; 120 const struct attribute_group **groups; 121 }; 122 123 /** 124 * struct coresight_connection - representation of a single connection 125 * @outport: a connection's output port number. 126 * @chid_name: remote component's name. 127 * @child_port: remote component's port number @output is connected to. 128 * @child_dev: a @coresight_device representation of the component 129 connected to @outport. 130 */ 131 struct coresight_connection { 132 int outport; 133 const char *child_name; 134 int child_port; 135 struct coresight_device *child_dev; 136 }; 137 138 /** 139 * struct coresight_device - representation of a device as used by the framework 140 * @conns: array of coresight_connections associated to this component. 141 * @nr_inport: number of input port associated to this component. 142 * @nr_outport: number of output port associated to this component. 143 * @type: as defined by @coresight_dev_type. 144 * @subtype: as defined by @coresight_dev_subtype. 145 * @ops: generic operations for this component, as defined 146 by @coresight_ops. 147 * @dev: The device entity associated to this component. 148 * @refcnt: keep track of what is in use. 149 * @orphan: true if the component has connections that haven't been linked. 150 * @enable: 'true' if component is currently part of an active path. 151 * @activated: 'true' only if a _sink_ has been activated. A sink can be 152 activated but not yet enabled. Enabling for a _sink_ 153 happens when a source has been selected for that it. 154 */ 155 struct coresight_device { 156 struct coresight_connection *conns; 157 int nr_inport; 158 int nr_outport; 159 enum coresight_dev_type type; 160 struct coresight_dev_subtype subtype; 161 const struct coresight_ops *ops; 162 struct device dev; 163 atomic_t *refcnt; 164 bool orphan; 165 bool enable; /* true only if configured as part of a path */ 166 bool activated; /* true only if a sink is part of a path */ 167 }; 168 169 #define to_coresight_device(d) container_of(d, struct coresight_device, dev) 170 171 #define source_ops(csdev) csdev->ops->source_ops 172 #define sink_ops(csdev) csdev->ops->sink_ops 173 #define link_ops(csdev) csdev->ops->link_ops 174 175 /** 176 * struct coresight_ops_sink - basic operations for a sink 177 * Operations available for sinks 178 * @enable: enables the sink. 179 * @disable: disables the sink. 180 * @alloc_buffer: initialises perf's ring buffer for trace collection. 181 * @free_buffer: release memory allocated in @get_config. 182 * @set_buffer: initialises buffer mechanic before a trace session. 183 * @reset_buffer: finalises buffer mechanic after a trace session. 184 * @update_buffer: update buffer pointers after a trace session. 185 */ 186 struct coresight_ops_sink { 187 int (*enable)(struct coresight_device *csdev, u32 mode); 188 void (*disable)(struct coresight_device *csdev); 189 void *(*alloc_buffer)(struct coresight_device *csdev, int cpu, 190 void **pages, int nr_pages, bool overwrite); 191 void (*free_buffer)(void *config); 192 int (*set_buffer)(struct coresight_device *csdev, 193 struct perf_output_handle *handle, 194 void *sink_config); 195 unsigned long (*reset_buffer)(struct coresight_device *csdev, 196 struct perf_output_handle *handle, 197 void *sink_config); 198 void (*update_buffer)(struct coresight_device *csdev, 199 struct perf_output_handle *handle, 200 void *sink_config); 201 }; 202 203 /** 204 * struct coresight_ops_link - basic operations for a link 205 * Operations available for links. 206 * @enable: enables flow between iport and oport. 207 * @disable: disables flow between iport and oport. 208 */ 209 struct coresight_ops_link { 210 int (*enable)(struct coresight_device *csdev, int iport, int oport); 211 void (*disable)(struct coresight_device *csdev, int iport, int oport); 212 }; 213 214 /** 215 * struct coresight_ops_source - basic operations for a source 216 * Operations available for sources. 217 * @cpu_id: returns the value of the CPU number this component 218 * is associated to. 219 * @trace_id: returns the value of the component's trace ID as known 220 * to the HW. 221 * @enable: enables tracing for a source. 222 * @disable: disables tracing for a source. 223 */ 224 struct coresight_ops_source { 225 int (*cpu_id)(struct coresight_device *csdev); 226 int (*trace_id)(struct coresight_device *csdev); 227 int (*enable)(struct coresight_device *csdev, 228 struct perf_event *event, u32 mode); 229 void (*disable)(struct coresight_device *csdev, 230 struct perf_event *event); 231 }; 232 233 struct coresight_ops { 234 const struct coresight_ops_sink *sink_ops; 235 const struct coresight_ops_link *link_ops; 236 const struct coresight_ops_source *source_ops; 237 }; 238 239 #ifdef CONFIG_CORESIGHT 240 extern struct coresight_device * 241 coresight_register(struct coresight_desc *desc); 242 extern void coresight_unregister(struct coresight_device *csdev); 243 extern int coresight_enable(struct coresight_device *csdev); 244 extern void coresight_disable(struct coresight_device *csdev); 245 extern int coresight_timeout(void __iomem *addr, u32 offset, 246 int position, int value); 247 #else 248 static inline struct coresight_device * 249 coresight_register(struct coresight_desc *desc) { return NULL; } 250 static inline void coresight_unregister(struct coresight_device *csdev) {} 251 static inline int 252 coresight_enable(struct coresight_device *csdev) { return -ENOSYS; } 253 static inline void coresight_disable(struct coresight_device *csdev) {} 254 static inline int coresight_timeout(void __iomem *addr, u32 offset, 255 int position, int value) { return 1; } 256 #endif 257 258 #ifdef CONFIG_OF 259 extern int of_coresight_get_cpu(const struct device_node *node); 260 extern struct coresight_platform_data * 261 of_get_coresight_platform_data(struct device *dev, 262 const struct device_node *node); 263 #else 264 static inline int of_coresight_get_cpu(const struct device_node *node) 265 { return 0; } 266 static inline struct coresight_platform_data *of_get_coresight_platform_data( 267 struct device *dev, const struct device_node *node) { return NULL; } 268 #endif 269 270 #ifdef CONFIG_PID_NS 271 static inline unsigned long 272 coresight_vpid_to_pid(unsigned long vpid) 273 { 274 struct task_struct *task = NULL; 275 unsigned long pid = 0; 276 277 rcu_read_lock(); 278 task = find_task_by_vpid(vpid); 279 if (task) 280 pid = task_pid_nr(task); 281 rcu_read_unlock(); 282 283 return pid; 284 } 285 #else 286 static inline unsigned long 287 coresight_vpid_to_pid(unsigned long vpid) { return vpid; } 288 #endif 289 290 #endif 291