GNU Linux-libre 4.19.314-gnu1
[releases.git] / drivers / hwtracing / stm / stm.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * System Trace Module (STM) infrastructure
4  * Copyright (c) 2014, Intel Corporation.
5  *
6  * STM class implements generic infrastructure for  System Trace Module devices
7  * as defined in MIPI STPv2 specification.
8  */
9
10 #ifndef _STM_STM_H_
11 #define _STM_STM_H_
12
13 struct stp_policy;
14 struct stp_policy_node;
15
16 struct stp_policy_node *
17 stp_policy_node_lookup(struct stm_device *stm, char *s);
18 void stp_policy_node_put(struct stp_policy_node *policy_node);
19 void stp_policy_unbind(struct stp_policy *policy);
20
21 void stp_policy_node_get_ranges(struct stp_policy_node *policy_node,
22                                 unsigned int *mstart, unsigned int *mend,
23                                 unsigned int *cstart, unsigned int *cend);
24 int stp_configfs_init(void);
25 void stp_configfs_exit(void);
26
27 struct stp_master {
28         unsigned int    nr_free;
29         unsigned long   chan_map[0];
30 };
31
32 struct stm_device {
33         struct device           dev;
34         struct module           *owner;
35         struct stp_policy       *policy;
36         struct mutex            policy_mutex;
37         int                     major;
38         unsigned int            sw_nmasters;
39         struct stm_data         *data;
40         struct mutex            link_mutex;
41         spinlock_t              link_lock;
42         struct list_head        link_list;
43         /* master allocation */
44         spinlock_t              mc_lock;
45         struct stp_master       *masters[0];
46 };
47
48 #define to_stm_device(_d)                               \
49         container_of((_d), struct stm_device, dev)
50
51 struct stm_output {
52         spinlock_t              lock;
53         unsigned int            master;
54         unsigned int            channel;
55         unsigned int            nr_chans;
56 };
57
58 struct stm_file {
59         struct stm_device       *stm;
60         struct stp_policy_node  *policy_node;
61         struct stm_output       output;
62 };
63
64 struct stm_device *stm_find_device(const char *name);
65 void stm_put_device(struct stm_device *stm);
66
67 struct stm_source_device {
68         struct device           dev;
69         struct stm_source_data  *data;
70         spinlock_t              link_lock;
71         struct stm_device __rcu *link;
72         struct list_head        link_entry;
73         /* one output per stm_source device */
74         struct stp_policy_node  *policy_node;
75         struct stm_output       output;
76 };
77
78 #define to_stm_source_device(_d)                                \
79         container_of((_d), struct stm_source_device, dev)
80
81 #endif /* _STM_STM_H_ */