xref: /linux/drivers/hwtracing/stm/stm.h (revision cde4ad8368840e414ecf67db258fe1dabaa5fd2e)
17bd1d409SAlexander Shishkin /*
27bd1d409SAlexander Shishkin  * System Trace Module (STM) infrastructure
37bd1d409SAlexander Shishkin  * Copyright (c) 2014, Intel Corporation.
47bd1d409SAlexander Shishkin  *
57bd1d409SAlexander Shishkin  * This program is free software; you can redistribute it and/or modify it
67bd1d409SAlexander Shishkin  * under the terms and conditions of the GNU General Public License,
77bd1d409SAlexander Shishkin  * version 2, as published by the Free Software Foundation.
87bd1d409SAlexander Shishkin  *
97bd1d409SAlexander Shishkin  * This program is distributed in the hope it will be useful, but WITHOUT
107bd1d409SAlexander Shishkin  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
117bd1d409SAlexander Shishkin  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
127bd1d409SAlexander Shishkin  * more details.
137bd1d409SAlexander Shishkin  *
147bd1d409SAlexander Shishkin  * STM class implements generic infrastructure for  System Trace Module devices
157bd1d409SAlexander Shishkin  * as defined in MIPI STPv2 specification.
167bd1d409SAlexander Shishkin  */
177bd1d409SAlexander Shishkin 
187bd1d409SAlexander Shishkin #ifndef _STM_STM_H_
197bd1d409SAlexander Shishkin #define _STM_STM_H_
207bd1d409SAlexander Shishkin 
217bd1d409SAlexander Shishkin struct stp_policy;
227bd1d409SAlexander Shishkin struct stp_policy_node;
237bd1d409SAlexander Shishkin 
247bd1d409SAlexander Shishkin struct stp_policy_node *
257bd1d409SAlexander Shishkin stp_policy_node_lookup(struct stm_device *stm, char *s);
267bd1d409SAlexander Shishkin void stp_policy_node_put(struct stp_policy_node *policy_node);
277bd1d409SAlexander Shishkin void stp_policy_unbind(struct stp_policy *policy);
287bd1d409SAlexander Shishkin 
297bd1d409SAlexander Shishkin void stp_policy_node_get_ranges(struct stp_policy_node *policy_node,
307bd1d409SAlexander Shishkin 				unsigned int *mstart, unsigned int *mend,
317bd1d409SAlexander Shishkin 				unsigned int *cstart, unsigned int *cend);
327bd1d409SAlexander Shishkin int stp_configfs_init(void);
337bd1d409SAlexander Shishkin void stp_configfs_exit(void);
347bd1d409SAlexander Shishkin 
357bd1d409SAlexander Shishkin struct stp_master {
367bd1d409SAlexander Shishkin 	unsigned int	nr_free;
377bd1d409SAlexander Shishkin 	unsigned long	chan_map[0];
387bd1d409SAlexander Shishkin };
397bd1d409SAlexander Shishkin 
407bd1d409SAlexander Shishkin struct stm_device {
417bd1d409SAlexander Shishkin 	struct device		dev;
427bd1d409SAlexander Shishkin 	struct module		*owner;
437bd1d409SAlexander Shishkin 	struct stp_policy	*policy;
447bd1d409SAlexander Shishkin 	struct mutex		policy_mutex;
457bd1d409SAlexander Shishkin 	int			major;
467bd1d409SAlexander Shishkin 	unsigned int		sw_nmasters;
477bd1d409SAlexander Shishkin 	struct stm_data		*data;
48c74f7e82SAlexander Shishkin 	struct mutex		link_mutex;
497bd1d409SAlexander Shishkin 	spinlock_t		link_lock;
507bd1d409SAlexander Shishkin 	struct list_head	link_list;
517bd1d409SAlexander Shishkin 	/* master allocation */
527bd1d409SAlexander Shishkin 	spinlock_t		mc_lock;
537bd1d409SAlexander Shishkin 	struct stp_master	*masters[0];
547bd1d409SAlexander Shishkin };
557bd1d409SAlexander Shishkin 
567bd1d409SAlexander Shishkin #define to_stm_device(_d)				\
577bd1d409SAlexander Shishkin 	container_of((_d), struct stm_device, dev)
587bd1d409SAlexander Shishkin 
597bd1d409SAlexander Shishkin struct stm_output {
60*cde4ad83SAlexander Shishkin 	spinlock_t		lock;
617bd1d409SAlexander Shishkin 	unsigned int		master;
627bd1d409SAlexander Shishkin 	unsigned int		channel;
637bd1d409SAlexander Shishkin 	unsigned int		nr_chans;
647bd1d409SAlexander Shishkin };
657bd1d409SAlexander Shishkin 
667bd1d409SAlexander Shishkin struct stm_file {
677bd1d409SAlexander Shishkin 	struct stm_device	*stm;
687bd1d409SAlexander Shishkin 	struct stp_policy_node	*policy_node;
697bd1d409SAlexander Shishkin 	struct stm_output	output;
707bd1d409SAlexander Shishkin };
717bd1d409SAlexander Shishkin 
727bd1d409SAlexander Shishkin struct stm_device *stm_find_device(const char *name);
737bd1d409SAlexander Shishkin void stm_put_device(struct stm_device *stm);
747bd1d409SAlexander Shishkin 
757bd1d409SAlexander Shishkin struct stm_source_device {
767bd1d409SAlexander Shishkin 	struct device		dev;
777bd1d409SAlexander Shishkin 	struct stm_source_data	*data;
787bd1d409SAlexander Shishkin 	spinlock_t		link_lock;
790df771deSAlexander Shishkin 	struct stm_device __rcu	*link;
807bd1d409SAlexander Shishkin 	struct list_head	link_entry;
817bd1d409SAlexander Shishkin 	/* one output per stm_source device */
827bd1d409SAlexander Shishkin 	struct stp_policy_node	*policy_node;
837bd1d409SAlexander Shishkin 	struct stm_output	output;
847bd1d409SAlexander Shishkin };
857bd1d409SAlexander Shishkin 
867bd1d409SAlexander Shishkin #define to_stm_source_device(_d)				\
877bd1d409SAlexander Shishkin 	container_of((_d), struct stm_source_device, dev)
887bd1d409SAlexander Shishkin 
897bd1d409SAlexander Shishkin #endif /* _STM_STM_H_ */
90