xref: /linux/drivers/hwtracing/stm/stm.h (revision c7fd62bc69d0224877a49383e606f0fe52cba741)
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 
13*c7fd62bcSAlexander Shishkin #include <linux/configfs.h>
14*c7fd62bcSAlexander Shishkin 
157bd1d409SAlexander Shishkin struct stp_policy;
167bd1d409SAlexander Shishkin struct stp_policy_node;
17*c7fd62bcSAlexander Shishkin struct stm_protocol_driver;
187bd1d409SAlexander Shishkin 
197bd1d409SAlexander Shishkin int stp_configfs_init(void);
207bd1d409SAlexander Shishkin void stp_configfs_exit(void);
217bd1d409SAlexander Shishkin 
22*c7fd62bcSAlexander Shishkin void *stp_policy_node_priv(struct stp_policy_node *pn);
23*c7fd62bcSAlexander Shishkin 
247bd1d409SAlexander Shishkin struct stp_master {
257bd1d409SAlexander Shishkin 	unsigned int	nr_free;
267bd1d409SAlexander Shishkin 	unsigned long	chan_map[0];
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;
40*c7fd62bcSAlexander Shishkin 	/* framing protocol in use */
41*c7fd62bcSAlexander Shishkin 	const struct stm_protocol_driver	*pdrv;
42*c7fd62bcSAlexander Shishkin 	const struct config_item_type		*pdrv_node_type;
437bd1d409SAlexander Shishkin 	/* master allocation */
447bd1d409SAlexander Shishkin 	spinlock_t		mc_lock;
457bd1d409SAlexander Shishkin 	struct stp_master	*masters[0];
467bd1d409SAlexander Shishkin };
477bd1d409SAlexander Shishkin 
487bd1d409SAlexander Shishkin #define to_stm_device(_d)				\
497bd1d409SAlexander Shishkin 	container_of((_d), struct stm_device, dev)
507bd1d409SAlexander Shishkin 
51*c7fd62bcSAlexander Shishkin struct stp_policy_node *
52*c7fd62bcSAlexander Shishkin stp_policy_node_lookup(struct stm_device *stm, char *s);
53*c7fd62bcSAlexander Shishkin void stp_policy_node_put(struct stp_policy_node *policy_node);
54*c7fd62bcSAlexander Shishkin void stp_policy_unbind(struct stp_policy *policy);
55*c7fd62bcSAlexander Shishkin 
56*c7fd62bcSAlexander Shishkin void stp_policy_node_get_ranges(struct stp_policy_node *policy_node,
57*c7fd62bcSAlexander Shishkin 				unsigned int *mstart, unsigned int *mend,
58*c7fd62bcSAlexander Shishkin 				unsigned int *cstart, unsigned int *cend);
59*c7fd62bcSAlexander Shishkin 
60*c7fd62bcSAlexander Shishkin const struct config_item_type *
61*c7fd62bcSAlexander Shishkin get_policy_node_type(struct configfs_attribute **attrs);
62*c7fd62bcSAlexander 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;
68*c7fd62bcSAlexander 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 
92*c7fd62bcSAlexander Shishkin void *to_pdrv_policy_node(struct config_item *item);
93*c7fd62bcSAlexander Shishkin 
94*c7fd62bcSAlexander Shishkin struct stm_protocol_driver {
95*c7fd62bcSAlexander Shishkin 	struct module	*owner;
96*c7fd62bcSAlexander Shishkin 	const char	*name;
97*c7fd62bcSAlexander Shishkin 	ssize_t		(*write)(struct stm_data *data,
98*c7fd62bcSAlexander Shishkin 				 struct stm_output *output, unsigned int chan,
99*c7fd62bcSAlexander Shishkin 				 const char *buf, size_t count);
100*c7fd62bcSAlexander Shishkin 	void		(*policy_node_init)(void *arg);
101*c7fd62bcSAlexander Shishkin 	int		(*output_open)(void *priv, struct stm_output *output);
102*c7fd62bcSAlexander Shishkin 	void		(*output_close)(struct stm_output *output);
103*c7fd62bcSAlexander Shishkin 	ssize_t		priv_sz;
104*c7fd62bcSAlexander Shishkin 	struct configfs_attribute	**policy_attr;
105*c7fd62bcSAlexander Shishkin };
106*c7fd62bcSAlexander Shishkin 
107*c7fd62bcSAlexander Shishkin int stm_register_protocol(const struct stm_protocol_driver *pdrv);
108*c7fd62bcSAlexander Shishkin void stm_unregister_protocol(const struct stm_protocol_driver *pdrv);
109*c7fd62bcSAlexander Shishkin int stm_lookup_protocol(const char *name,
110*c7fd62bcSAlexander Shishkin 			const struct stm_protocol_driver **pdrv,
111*c7fd62bcSAlexander Shishkin 			const struct config_item_type **type);
112*c7fd62bcSAlexander Shishkin void stm_put_protocol(const struct stm_protocol_driver *pdrv);
113*c7fd62bcSAlexander Shishkin 
1147bd1d409SAlexander Shishkin #endif /* _STM_STM_H_ */
115