xref: /linux/drivers/hwtracing/stm/stm.h (revision 36ec807b627b4c0a0a382f0ae48eac7187d14b2b)
19ea393d8SAlexander Shishkin /* SPDX-License-Identifier: GPL-2.0 */
27bd1d409SAlexander Shishkin /*
37bd1d409SAlexander Shishkin  * System Trace Module (STM) infrastructure
47bd1d409SAlexander Shishkin  * Copyright (c) 2014, Intel Corporation.
57bd1d409SAlexander Shishkin  *
67bd1d409SAlexander Shishkin  * STM class implements generic infrastructure for  System Trace Module devices
77bd1d409SAlexander Shishkin  * as defined in MIPI STPv2 specification.
87bd1d409SAlexander Shishkin  */
97bd1d409SAlexander Shishkin 
107bd1d409SAlexander Shishkin #ifndef _STM_STM_H_
117bd1d409SAlexander Shishkin #define _STM_STM_H_
127bd1d409SAlexander Shishkin 
13c7fd62bcSAlexander Shishkin #include <linux/configfs.h>
14c7fd62bcSAlexander Shishkin 
157bd1d409SAlexander Shishkin struct stp_policy;
167bd1d409SAlexander Shishkin struct stp_policy_node;
17c7fd62bcSAlexander Shishkin struct stm_protocol_driver;
187bd1d409SAlexander Shishkin 
197bd1d409SAlexander Shishkin int stp_configfs_init(void);
207bd1d409SAlexander Shishkin void stp_configfs_exit(void);
217bd1d409SAlexander Shishkin 
22c7fd62bcSAlexander Shishkin void *stp_policy_node_priv(struct stp_policy_node *pn);
23c7fd62bcSAlexander Shishkin 
247bd1d409SAlexander Shishkin struct stp_master {
257bd1d409SAlexander Shishkin 	unsigned int	nr_free;
26e3563500SGustavo A. R. Silva 	unsigned long	chan_map[];
277bd1d409SAlexander Shishkin };
287bd1d409SAlexander Shishkin 
297bd1d409SAlexander Shishkin struct stm_device {
307bd1d409SAlexander Shishkin 	struct device		dev;
317bd1d409SAlexander Shishkin 	struct module		*owner;
327bd1d409SAlexander Shishkin 	struct stp_policy	*policy;
337bd1d409SAlexander Shishkin 	struct mutex		policy_mutex;
347bd1d409SAlexander Shishkin 	int			major;
357bd1d409SAlexander Shishkin 	unsigned int		sw_nmasters;
367bd1d409SAlexander Shishkin 	struct stm_data		*data;
37c74f7e82SAlexander Shishkin 	struct mutex		link_mutex;
387bd1d409SAlexander Shishkin 	spinlock_t		link_lock;
397bd1d409SAlexander Shishkin 	struct list_head	link_list;
40c7fd62bcSAlexander Shishkin 	/* framing protocol in use */
41c7fd62bcSAlexander Shishkin 	const struct stm_protocol_driver	*pdrv;
42c7fd62bcSAlexander Shishkin 	const struct config_item_type		*pdrv_node_type;
437bd1d409SAlexander Shishkin 	/* master allocation */
447bd1d409SAlexander Shishkin 	spinlock_t		mc_lock;
45e3563500SGustavo A. R. Silva 	struct stp_master	*masters[];
467bd1d409SAlexander Shishkin };
477bd1d409SAlexander Shishkin 
487bd1d409SAlexander Shishkin #define to_stm_device(_d)				\
497bd1d409SAlexander Shishkin 	container_of((_d), struct stm_device, dev)
507bd1d409SAlexander Shishkin 
51c7fd62bcSAlexander Shishkin struct stp_policy_node *
52c7fd62bcSAlexander Shishkin stp_policy_node_lookup(struct stm_device *stm, char *s);
53c7fd62bcSAlexander Shishkin void stp_policy_node_put(struct stp_policy_node *policy_node);
54c7fd62bcSAlexander Shishkin void stp_policy_unbind(struct stp_policy *policy);
55c7fd62bcSAlexander Shishkin 
56c7fd62bcSAlexander Shishkin void stp_policy_node_get_ranges(struct stp_policy_node *policy_node,
57c7fd62bcSAlexander Shishkin 				unsigned int *mstart, unsigned int *mend,
58c7fd62bcSAlexander Shishkin 				unsigned int *cstart, unsigned int *cend);
59c7fd62bcSAlexander Shishkin 
60c7fd62bcSAlexander Shishkin const struct config_item_type *
61c7fd62bcSAlexander Shishkin get_policy_node_type(struct configfs_attribute **attrs);
62c7fd62bcSAlexander Shishkin 
637bd1d409SAlexander Shishkin struct stm_output {
64cde4ad83SAlexander Shishkin 	spinlock_t		lock;
657bd1d409SAlexander Shishkin 	unsigned int		master;
667bd1d409SAlexander Shishkin 	unsigned int		channel;
677bd1d409SAlexander Shishkin 	unsigned int		nr_chans;
68c7fd62bcSAlexander Shishkin 	void			*pdrv_private;
697bd1d409SAlexander Shishkin };
707bd1d409SAlexander Shishkin 
717bd1d409SAlexander Shishkin struct stm_file {
727bd1d409SAlexander Shishkin 	struct stm_device	*stm;
737bd1d409SAlexander Shishkin 	struct stm_output	output;
747bd1d409SAlexander Shishkin };
757bd1d409SAlexander Shishkin 
767bd1d409SAlexander Shishkin struct stm_device *stm_find_device(const char *name);
777bd1d409SAlexander Shishkin void stm_put_device(struct stm_device *stm);
787bd1d409SAlexander Shishkin 
797bd1d409SAlexander Shishkin struct stm_source_device {
807bd1d409SAlexander Shishkin 	struct device		dev;
817bd1d409SAlexander Shishkin 	struct stm_source_data	*data;
827bd1d409SAlexander Shishkin 	spinlock_t		link_lock;
830df771deSAlexander Shishkin 	struct stm_device __rcu	*link;
847bd1d409SAlexander Shishkin 	struct list_head	link_entry;
857bd1d409SAlexander Shishkin 	/* one output per stm_source device */
867bd1d409SAlexander Shishkin 	struct stm_output	output;
877bd1d409SAlexander Shishkin };
887bd1d409SAlexander Shishkin 
897bd1d409SAlexander Shishkin #define to_stm_source_device(_d)				\
907bd1d409SAlexander Shishkin 	container_of((_d), struct stm_source_device, dev)
917bd1d409SAlexander Shishkin 
92c7fd62bcSAlexander Shishkin void *to_pdrv_policy_node(struct config_item *item);
93c7fd62bcSAlexander Shishkin 
94c7fd62bcSAlexander Shishkin struct stm_protocol_driver {
95c7fd62bcSAlexander Shishkin 	struct module	*owner;
96c7fd62bcSAlexander Shishkin 	const char	*name;
97c7fd62bcSAlexander Shishkin 	ssize_t		(*write)(struct stm_data *data,
98c7fd62bcSAlexander Shishkin 				 struct stm_output *output, unsigned int chan,
99*ee27f44eSMikhail Lappo 				 const char *buf, size_t count, struct stm_source_data *source);
100c7fd62bcSAlexander Shishkin 	void		(*policy_node_init)(void *arg);
101c7fd62bcSAlexander Shishkin 	int		(*output_open)(void *priv, struct stm_output *output);
102c7fd62bcSAlexander Shishkin 	void		(*output_close)(struct stm_output *output);
103c7fd62bcSAlexander Shishkin 	ssize_t		priv_sz;
104c7fd62bcSAlexander Shishkin 	struct configfs_attribute	**policy_attr;
105c7fd62bcSAlexander Shishkin };
106c7fd62bcSAlexander Shishkin 
107c7fd62bcSAlexander Shishkin int stm_register_protocol(const struct stm_protocol_driver *pdrv);
108c7fd62bcSAlexander Shishkin void stm_unregister_protocol(const struct stm_protocol_driver *pdrv);
109c7fd62bcSAlexander Shishkin int stm_lookup_protocol(const char *name,
110c7fd62bcSAlexander Shishkin 			const struct stm_protocol_driver **pdrv,
111c7fd62bcSAlexander Shishkin 			const struct config_item_type **type);
112c7fd62bcSAlexander Shishkin void stm_put_protocol(const struct stm_protocol_driver *pdrv);
113d279a380SAlexander Shishkin ssize_t stm_data_write(struct stm_data *data, unsigned int m,
114d279a380SAlexander Shishkin 		       unsigned int c, bool ts_first, const void *buf,
115d279a380SAlexander Shishkin 		       size_t count);
116c7fd62bcSAlexander Shishkin 
1177bd1d409SAlexander Shishkin #endif /* _STM_STM_H_ */
118