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 13*c7fd62bcSAlexander Shishkin #include <linux/configfs.h> 14*c7fd62bcSAlexander Shishkin 157bd1d409SAlexander Shishkin struct stp_policy; 167bd1d409SAlexander Shishkin struct stp_policy_node; 17*c7fd62bcSAlexander Shishkin struct stm_protocol_driver; 187bd1d409SAlexander Shishkin 197bd1d409SAlexander Shishkin int stp_configfs_init(void); 207bd1d409SAlexander Shishkin void stp_configfs_exit(void); 217bd1d409SAlexander Shishkin 22*c7fd62bcSAlexander Shishkin void *stp_policy_node_priv(struct stp_policy_node *pn); 23*c7fd62bcSAlexander Shishkin 247bd1d409SAlexander Shishkin struct stp_master { 257bd1d409SAlexander Shishkin unsigned int nr_free; 267bd1d409SAlexander Shishkin unsigned long chan_map[0]; 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; 40*c7fd62bcSAlexander Shishkin /* framing protocol in use */ 41*c7fd62bcSAlexander Shishkin const struct stm_protocol_driver *pdrv; 42*c7fd62bcSAlexander Shishkin const struct config_item_type *pdrv_node_type; 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 51*c7fd62bcSAlexander Shishkin struct stp_policy_node * 52*c7fd62bcSAlexander Shishkin stp_policy_node_lookup(struct stm_device *stm, char *s); 53*c7fd62bcSAlexander Shishkin void stp_policy_node_put(struct stp_policy_node *policy_node); 54*c7fd62bcSAlexander Shishkin void stp_policy_unbind(struct stp_policy *policy); 55*c7fd62bcSAlexander Shishkin 56*c7fd62bcSAlexander Shishkin void stp_policy_node_get_ranges(struct stp_policy_node *policy_node, 57*c7fd62bcSAlexander Shishkin unsigned int *mstart, unsigned int *mend, 58*c7fd62bcSAlexander Shishkin unsigned int *cstart, unsigned int *cend); 59*c7fd62bcSAlexander Shishkin 60*c7fd62bcSAlexander Shishkin const struct config_item_type * 61*c7fd62bcSAlexander Shishkin get_policy_node_type(struct configfs_attribute **attrs); 62*c7fd62bcSAlexander 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; 68*c7fd62bcSAlexander 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 92*c7fd62bcSAlexander Shishkin void *to_pdrv_policy_node(struct config_item *item); 93*c7fd62bcSAlexander Shishkin 94*c7fd62bcSAlexander Shishkin struct stm_protocol_driver { 95*c7fd62bcSAlexander Shishkin struct module *owner; 96*c7fd62bcSAlexander Shishkin const char *name; 97*c7fd62bcSAlexander Shishkin ssize_t (*write)(struct stm_data *data, 98*c7fd62bcSAlexander Shishkin struct stm_output *output, unsigned int chan, 99*c7fd62bcSAlexander Shishkin const char *buf, size_t count); 100*c7fd62bcSAlexander Shishkin void (*policy_node_init)(void *arg); 101*c7fd62bcSAlexander Shishkin int (*output_open)(void *priv, struct stm_output *output); 102*c7fd62bcSAlexander Shishkin void (*output_close)(struct stm_output *output); 103*c7fd62bcSAlexander Shishkin ssize_t priv_sz; 104*c7fd62bcSAlexander Shishkin struct configfs_attribute **policy_attr; 105*c7fd62bcSAlexander Shishkin }; 106*c7fd62bcSAlexander Shishkin 107*c7fd62bcSAlexander Shishkin int stm_register_protocol(const struct stm_protocol_driver *pdrv); 108*c7fd62bcSAlexander Shishkin void stm_unregister_protocol(const struct stm_protocol_driver *pdrv); 109*c7fd62bcSAlexander Shishkin int stm_lookup_protocol(const char *name, 110*c7fd62bcSAlexander Shishkin const struct stm_protocol_driver **pdrv, 111*c7fd62bcSAlexander Shishkin const struct config_item_type **type); 112*c7fd62bcSAlexander Shishkin void stm_put_protocol(const struct stm_protocol_driver *pdrv); 113*c7fd62bcSAlexander Shishkin 1147bd1d409SAlexander Shishkin #endif /* _STM_STM_H_ */ 115