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