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