xref: /linux/drivers/hwtracing/stm/stm.h (revision 7bd1d4093c2fa37d1ecab05da3c9d48ea2af2264)
1*7bd1d409SAlexander Shishkin /*
2*7bd1d409SAlexander Shishkin  * System Trace Module (STM) infrastructure
3*7bd1d409SAlexander Shishkin  * Copyright (c) 2014, Intel Corporation.
4*7bd1d409SAlexander Shishkin  *
5*7bd1d409SAlexander Shishkin  * This program is free software; you can redistribute it and/or modify it
6*7bd1d409SAlexander Shishkin  * under the terms and conditions of the GNU General Public License,
7*7bd1d409SAlexander Shishkin  * version 2, as published by the Free Software Foundation.
8*7bd1d409SAlexander Shishkin  *
9*7bd1d409SAlexander Shishkin  * This program is distributed in the hope it will be useful, but WITHOUT
10*7bd1d409SAlexander Shishkin  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*7bd1d409SAlexander Shishkin  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12*7bd1d409SAlexander Shishkin  * more details.
13*7bd1d409SAlexander Shishkin  *
14*7bd1d409SAlexander Shishkin  * STM class implements generic infrastructure for  System Trace Module devices
15*7bd1d409SAlexander Shishkin  * as defined in MIPI STPv2 specification.
16*7bd1d409SAlexander Shishkin  */
17*7bd1d409SAlexander Shishkin 
18*7bd1d409SAlexander Shishkin #ifndef _STM_STM_H_
19*7bd1d409SAlexander Shishkin #define _STM_STM_H_
20*7bd1d409SAlexander Shishkin 
21*7bd1d409SAlexander Shishkin struct stp_policy;
22*7bd1d409SAlexander Shishkin struct stp_policy_node;
23*7bd1d409SAlexander Shishkin 
24*7bd1d409SAlexander Shishkin struct stp_policy_node *
25*7bd1d409SAlexander Shishkin stp_policy_node_lookup(struct stm_device *stm, char *s);
26*7bd1d409SAlexander Shishkin void stp_policy_node_put(struct stp_policy_node *policy_node);
27*7bd1d409SAlexander Shishkin void stp_policy_unbind(struct stp_policy *policy);
28*7bd1d409SAlexander Shishkin 
29*7bd1d409SAlexander Shishkin void stp_policy_node_get_ranges(struct stp_policy_node *policy_node,
30*7bd1d409SAlexander Shishkin 				unsigned int *mstart, unsigned int *mend,
31*7bd1d409SAlexander Shishkin 				unsigned int *cstart, unsigned int *cend);
32*7bd1d409SAlexander Shishkin int stp_configfs_init(void);
33*7bd1d409SAlexander Shishkin void stp_configfs_exit(void);
34*7bd1d409SAlexander Shishkin 
35*7bd1d409SAlexander Shishkin struct stp_master {
36*7bd1d409SAlexander Shishkin 	unsigned int	nr_free;
37*7bd1d409SAlexander Shishkin 	unsigned long	chan_map[0];
38*7bd1d409SAlexander Shishkin };
39*7bd1d409SAlexander Shishkin 
40*7bd1d409SAlexander Shishkin struct stm_device {
41*7bd1d409SAlexander Shishkin 	struct device		dev;
42*7bd1d409SAlexander Shishkin 	struct module		*owner;
43*7bd1d409SAlexander Shishkin 	struct stp_policy	*policy;
44*7bd1d409SAlexander Shishkin 	struct mutex		policy_mutex;
45*7bd1d409SAlexander Shishkin 	int			major;
46*7bd1d409SAlexander Shishkin 	unsigned int		sw_nmasters;
47*7bd1d409SAlexander Shishkin 	struct stm_data		*data;
48*7bd1d409SAlexander Shishkin 	spinlock_t		link_lock;
49*7bd1d409SAlexander Shishkin 	struct list_head	link_list;
50*7bd1d409SAlexander Shishkin 	/* master allocation */
51*7bd1d409SAlexander Shishkin 	spinlock_t		mc_lock;
52*7bd1d409SAlexander Shishkin 	struct stp_master	*masters[0];
53*7bd1d409SAlexander Shishkin };
54*7bd1d409SAlexander Shishkin 
55*7bd1d409SAlexander Shishkin #define to_stm_device(_d)				\
56*7bd1d409SAlexander Shishkin 	container_of((_d), struct stm_device, dev)
57*7bd1d409SAlexander Shishkin 
58*7bd1d409SAlexander Shishkin struct stm_output {
59*7bd1d409SAlexander Shishkin 	unsigned int		master;
60*7bd1d409SAlexander Shishkin 	unsigned int		channel;
61*7bd1d409SAlexander Shishkin 	unsigned int		nr_chans;
62*7bd1d409SAlexander Shishkin };
63*7bd1d409SAlexander Shishkin 
64*7bd1d409SAlexander Shishkin struct stm_file {
65*7bd1d409SAlexander Shishkin 	struct stm_device	*stm;
66*7bd1d409SAlexander Shishkin 	struct stp_policy_node	*policy_node;
67*7bd1d409SAlexander Shishkin 	struct stm_output	output;
68*7bd1d409SAlexander Shishkin };
69*7bd1d409SAlexander Shishkin 
70*7bd1d409SAlexander Shishkin struct stm_device *stm_find_device(const char *name);
71*7bd1d409SAlexander Shishkin void stm_put_device(struct stm_device *stm);
72*7bd1d409SAlexander Shishkin 
73*7bd1d409SAlexander Shishkin struct stm_source_device {
74*7bd1d409SAlexander Shishkin 	struct device		dev;
75*7bd1d409SAlexander Shishkin 	struct stm_source_data	*data;
76*7bd1d409SAlexander Shishkin 	spinlock_t		link_lock;
77*7bd1d409SAlexander Shishkin 	struct stm_device	*link;
78*7bd1d409SAlexander Shishkin 	struct list_head	link_entry;
79*7bd1d409SAlexander Shishkin 	/* one output per stm_source device */
80*7bd1d409SAlexander Shishkin 	struct stp_policy_node	*policy_node;
81*7bd1d409SAlexander Shishkin 	struct stm_output	output;
82*7bd1d409SAlexander Shishkin };
83*7bd1d409SAlexander Shishkin 
84*7bd1d409SAlexander Shishkin #define to_stm_source_device(_d)				\
85*7bd1d409SAlexander Shishkin 	container_of((_d), struct stm_source_device, dev)
86*7bd1d409SAlexander Shishkin 
87*7bd1d409SAlexander Shishkin #endif /* _STM_STM_H_ */
88