diff options
Diffstat (limited to 'include/linux/coresight.h')
| -rw-r--r-- | include/linux/coresight.h | 109 | 
1 files changed, 61 insertions, 48 deletions
diff --git a/include/linux/coresight.h b/include/linux/coresight.h index c265e0468414..46c67a764877 100644 --- a/include/linux/coresight.h +++ b/include/linux/coresight.h @@ -40,6 +40,7 @@ enum coresight_dev_type {  	CORESIGHT_DEV_TYPE_LINK,  	CORESIGHT_DEV_TYPE_LINKSINK,  	CORESIGHT_DEV_TYPE_SOURCE, +	CORESIGHT_DEV_TYPE_HELPER,  };  enum coresight_dev_subtype_sink { @@ -62,19 +63,30 @@ enum coresight_dev_subtype_source {  	CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE,  }; +enum coresight_dev_subtype_helper { +	CORESIGHT_DEV_SUBTYPE_HELPER_NONE, +	CORESIGHT_DEV_SUBTYPE_HELPER_CATU, +}; +  /** - * struct coresight_dev_subtype - further characterisation of a type + * union coresight_dev_subtype - further characterisation of a type   * @sink_subtype:	type of sink this component is, as defined -			by @coresight_dev_subtype_sink. + *			by @coresight_dev_subtype_sink.   * @link_subtype:	type of link this component is, as defined -			by @coresight_dev_subtype_link. + *			by @coresight_dev_subtype_link.   * @source_subtype:	type of source this component is, as defined -			by @coresight_dev_subtype_source. + *			by @coresight_dev_subtype_source. + * @helper_subtype:	type of helper this component is, as defined + *			by @coresight_dev_subtype_helper.   */ -struct coresight_dev_subtype { -	enum coresight_dev_subtype_sink sink_subtype; -	enum coresight_dev_subtype_link link_subtype; +union coresight_dev_subtype { +	/* We have some devices which acts as LINK and SINK */ +	struct { +		enum coresight_dev_subtype_sink sink_subtype; +		enum coresight_dev_subtype_link link_subtype; +	};  	enum coresight_dev_subtype_source source_subtype; +	enum coresight_dev_subtype_helper helper_subtype;  };  /** @@ -82,22 +94,15 @@ struct coresight_dev_subtype {   * @cpu:	the CPU a source belongs to. Only applicable for ETM/PTMs.   * @name:	name of the component as shown under sysfs.   * @nr_inport:	number of input ports for this component. - * @outports:	list of remote endpoint port number. - * @child_names:name of all child components connected to this device. - * @child_ports:child component port number the current component is -		connected  to.   * @nr_outport:	number of output ports for this component. - * @clk:	The clock this component is associated to. + * @conns:	Array of nr_outport connections from this component   */  struct coresight_platform_data {  	int cpu;  	const char *name;  	int nr_inport; -	int *outports; -	const char **child_names; -	int *child_ports;  	int nr_outport; -	struct clk *clk; +	struct coresight_connection *conns;  };  /** @@ -113,7 +118,7 @@ struct coresight_platform_data {   */  struct coresight_desc {  	enum coresight_dev_type type; -	struct coresight_dev_subtype subtype; +	union coresight_dev_subtype subtype;  	const struct coresight_ops *ops;  	struct coresight_platform_data *pdata;  	struct device *dev; @@ -157,7 +162,7 @@ struct coresight_device {  	int nr_inport;  	int nr_outport;  	enum coresight_dev_type type; -	struct coresight_dev_subtype subtype; +	union coresight_dev_subtype subtype;  	const struct coresight_ops *ops;  	struct device dev;  	atomic_t *refcnt; @@ -171,6 +176,7 @@ struct coresight_device {  #define source_ops(csdev)	csdev->ops->source_ops  #define sink_ops(csdev)		csdev->ops->sink_ops  #define link_ops(csdev)		csdev->ops->link_ops +#define helper_ops(csdev)	csdev->ops->helper_ops  /**   * struct coresight_ops_sink - basic operations for a sink @@ -179,23 +185,15 @@ struct coresight_device {   * @disable:		disables the sink.   * @alloc_buffer:	initialises perf's ring buffer for trace collection.   * @free_buffer:	release memory allocated in @get_config. - * @set_buffer:		initialises buffer mechanic before a trace session. - * @reset_buffer:	finalises buffer mechanic after a trace session.   * @update_buffer:	update buffer pointers after a trace session.   */  struct coresight_ops_sink { -	int (*enable)(struct coresight_device *csdev, u32 mode); +	int (*enable)(struct coresight_device *csdev, u32 mode, void *data);  	void (*disable)(struct coresight_device *csdev);  	void *(*alloc_buffer)(struct coresight_device *csdev, int cpu,  			      void **pages, int nr_pages, bool overwrite);  	void (*free_buffer)(void *config); -	int (*set_buffer)(struct coresight_device *csdev, -			  struct perf_output_handle *handle, -			  void *sink_config); -	unsigned long (*reset_buffer)(struct coresight_device *csdev, -				      struct perf_output_handle *handle, -				      void *sink_config); -	void (*update_buffer)(struct coresight_device *csdev, +	unsigned long (*update_buffer)(struct coresight_device *csdev,  			      struct perf_output_handle *handle,  			      void *sink_config);  }; @@ -230,10 +228,25 @@ struct coresight_ops_source {  			struct perf_event *event);  }; +/** + * struct coresight_ops_helper - Operations for a helper device. + * + * All operations could pass in a device specific data, which could + * help the helper device to determine what to do. + * + * @enable	: Enable the device + * @disable	: Disable the device + */ +struct coresight_ops_helper { +	int (*enable)(struct coresight_device *csdev, void *data); +	int (*disable)(struct coresight_device *csdev, void *data); +}; +  struct coresight_ops {  	const struct coresight_ops_sink *sink_ops;  	const struct coresight_ops_link *link_ops;  	const struct coresight_ops_source *source_ops; +	const struct coresight_ops_helper *helper_ops;  };  #ifdef CONFIG_CORESIGHT @@ -244,6 +257,13 @@ extern int coresight_enable(struct coresight_device *csdev);  extern void coresight_disable(struct coresight_device *csdev);  extern int coresight_timeout(void __iomem *addr, u32 offset,  			     int position, int value); + +extern int coresight_claim_device(void __iomem *base); +extern int coresight_claim_device_unlocked(void __iomem *base); + +extern void coresight_disclaim_device(void __iomem *base); +extern void coresight_disclaim_device_unlocked(void __iomem *base); +  #else  static inline struct coresight_device *  coresight_register(struct coresight_desc *desc) { return NULL; } @@ -253,6 +273,19 @@ coresight_enable(struct coresight_device *csdev) { return -ENOSYS; }  static inline void coresight_disable(struct coresight_device *csdev) {}  static inline int coresight_timeout(void __iomem *addr, u32 offset,  				     int position, int value) { return 1; } +static inline int coresight_claim_device_unlocked(void __iomem *base) +{ +	return -EINVAL; +} + +static inline int coresight_claim_device(void __iomem *base) +{ +	return -EINVAL; +} + +static inline void coresight_disclaim_device(void __iomem *base) {} +static inline void coresight_disclaim_device_unlocked(void __iomem *base) {} +  #endif  #ifdef CONFIG_OF @@ -267,24 +300,4 @@ static inline struct coresight_platform_data *of_get_coresight_platform_data(  	struct device *dev, const struct device_node *node) { return NULL; }  #endif -#ifdef CONFIG_PID_NS -static inline unsigned long -coresight_vpid_to_pid(unsigned long vpid) -{ -	struct task_struct *task = NULL; -	unsigned long pid = 0; - -	rcu_read_lock(); -	task = find_task_by_vpid(vpid); -	if (task) -		pid = task_pid_nr(task); -	rcu_read_unlock(); - -	return pid; -} -#else -static inline unsigned long -coresight_vpid_to_pid(unsigned long vpid) { return vpid; } -#endif -  #endif  | 
