xref: /linux/drivers/hwtracing/stm/stm.h (revision 9ea393d8d8377b6da8ee25c6a114ec24c0687c7c)
1*9ea393d8SAlexander 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 
137bd1d409SAlexander Shishkin struct stp_policy;
147bd1d409SAlexander Shishkin struct stp_policy_node;
157bd1d409SAlexander Shishkin 
167bd1d409SAlexander Shishkin struct stp_policy_node *
177bd1d409SAlexander Shishkin stp_policy_node_lookup(struct stm_device *stm, char *s);
187bd1d409SAlexander Shishkin void stp_policy_node_put(struct stp_policy_node *policy_node);
197bd1d409SAlexander Shishkin void stp_policy_unbind(struct stp_policy *policy);
207bd1d409SAlexander Shishkin 
217bd1d409SAlexander Shishkin void stp_policy_node_get_ranges(struct stp_policy_node *policy_node,
227bd1d409SAlexander Shishkin 				unsigned int *mstart, unsigned int *mend,
237bd1d409SAlexander Shishkin 				unsigned int *cstart, unsigned int *cend);
247bd1d409SAlexander Shishkin int stp_configfs_init(void);
257bd1d409SAlexander Shishkin void stp_configfs_exit(void);
267bd1d409SAlexander Shishkin 
277bd1d409SAlexander Shishkin struct stp_master {
287bd1d409SAlexander Shishkin 	unsigned int	nr_free;
297bd1d409SAlexander Shishkin 	unsigned long	chan_map[0];
307bd1d409SAlexander Shishkin };
317bd1d409SAlexander Shishkin 
327bd1d409SAlexander Shishkin struct stm_device {
337bd1d409SAlexander Shishkin 	struct device		dev;
347bd1d409SAlexander Shishkin 	struct module		*owner;
357bd1d409SAlexander Shishkin 	struct stp_policy	*policy;
367bd1d409SAlexander Shishkin 	struct mutex		policy_mutex;
377bd1d409SAlexander Shishkin 	int			major;
387bd1d409SAlexander Shishkin 	unsigned int		sw_nmasters;
397bd1d409SAlexander Shishkin 	struct stm_data		*data;
40c74f7e82SAlexander Shishkin 	struct mutex		link_mutex;
417bd1d409SAlexander Shishkin 	spinlock_t		link_lock;
427bd1d409SAlexander Shishkin 	struct list_head	link_list;
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 
517bd1d409SAlexander Shishkin struct stm_output {
52cde4ad83SAlexander Shishkin 	spinlock_t		lock;
537bd1d409SAlexander Shishkin 	unsigned int		master;
547bd1d409SAlexander Shishkin 	unsigned int		channel;
557bd1d409SAlexander Shishkin 	unsigned int		nr_chans;
567bd1d409SAlexander Shishkin };
577bd1d409SAlexander Shishkin 
587bd1d409SAlexander Shishkin struct stm_file {
597bd1d409SAlexander Shishkin 	struct stm_device	*stm;
607bd1d409SAlexander Shishkin 	struct stp_policy_node	*policy_node;
617bd1d409SAlexander Shishkin 	struct stm_output	output;
627bd1d409SAlexander Shishkin };
637bd1d409SAlexander Shishkin 
647bd1d409SAlexander Shishkin struct stm_device *stm_find_device(const char *name);
657bd1d409SAlexander Shishkin void stm_put_device(struct stm_device *stm);
667bd1d409SAlexander Shishkin 
677bd1d409SAlexander Shishkin struct stm_source_device {
687bd1d409SAlexander Shishkin 	struct device		dev;
697bd1d409SAlexander Shishkin 	struct stm_source_data	*data;
707bd1d409SAlexander Shishkin 	spinlock_t		link_lock;
710df771deSAlexander Shishkin 	struct stm_device __rcu	*link;
727bd1d409SAlexander Shishkin 	struct list_head	link_entry;
737bd1d409SAlexander Shishkin 	/* one output per stm_source device */
747bd1d409SAlexander Shishkin 	struct stp_policy_node	*policy_node;
757bd1d409SAlexander Shishkin 	struct stm_output	output;
767bd1d409SAlexander Shishkin };
777bd1d409SAlexander Shishkin 
787bd1d409SAlexander Shishkin #define to_stm_source_device(_d)				\
797bd1d409SAlexander Shishkin 	container_of((_d), struct stm_source_device, dev)
807bd1d409SAlexander Shishkin 
817bd1d409SAlexander Shishkin #endif /* _STM_STM_H_ */
82