19ea393d8SAlexander Shishkin // SPDX-License-Identifier: GPL-2.0 27bd1d409SAlexander Shishkin /* 37bd1d409SAlexander Shishkin * System Trace Module (STM) infrastructure apis 47bd1d409SAlexander Shishkin * Copyright (C) 2014 Intel Corporation. 57bd1d409SAlexander Shishkin */ 67bd1d409SAlexander Shishkin 77bd1d409SAlexander Shishkin #ifndef _STM_H_ 87bd1d409SAlexander Shishkin #define _STM_H_ 97bd1d409SAlexander Shishkin 107bd1d409SAlexander Shishkin #include <linux/device.h> 117bd1d409SAlexander Shishkin 127bd1d409SAlexander Shishkin /** 137bd1d409SAlexander Shishkin * enum stp_packet_type - STP packets that an STM driver sends 147bd1d409SAlexander Shishkin */ 157bd1d409SAlexander Shishkin enum stp_packet_type { 167bd1d409SAlexander Shishkin STP_PACKET_DATA = 0, 177bd1d409SAlexander Shishkin STP_PACKET_FLAG, 187bd1d409SAlexander Shishkin STP_PACKET_USER, 197bd1d409SAlexander Shishkin STP_PACKET_MERR, 207bd1d409SAlexander Shishkin STP_PACKET_GERR, 217bd1d409SAlexander Shishkin STP_PACKET_TRIG, 227bd1d409SAlexander Shishkin STP_PACKET_XSYNC, 237bd1d409SAlexander Shishkin }; 247bd1d409SAlexander Shishkin 257bd1d409SAlexander Shishkin /** 267bd1d409SAlexander Shishkin * enum stp_packet_flags - STP packet modifiers 277bd1d409SAlexander Shishkin */ 287bd1d409SAlexander Shishkin enum stp_packet_flags { 297bd1d409SAlexander Shishkin STP_PACKET_MARKED = 0x1, 307bd1d409SAlexander Shishkin STP_PACKET_TIMESTAMPED = 0x2, 317bd1d409SAlexander Shishkin }; 327bd1d409SAlexander Shishkin 33*07cf8356SMikhail Lappo /** 34*07cf8356SMikhail Lappo * enum stm_source_type - STM source driver 35*07cf8356SMikhail Lappo * @STM_USER: any STM trace source 36*07cf8356SMikhail Lappo * @STM_FTRACE: ftrace STM source 37*07cf8356SMikhail Lappo */ 38*07cf8356SMikhail Lappo enum stm_source_type { 39*07cf8356SMikhail Lappo STM_USER, 40*07cf8356SMikhail Lappo STM_FTRACE, 41*07cf8356SMikhail Lappo }; 42*07cf8356SMikhail Lappo 437bd1d409SAlexander Shishkin struct stp_policy; 447bd1d409SAlexander Shishkin 457bd1d409SAlexander Shishkin struct stm_device; 467bd1d409SAlexander Shishkin 477bd1d409SAlexander Shishkin /** 487bd1d409SAlexander Shishkin * struct stm_data - STM device description and callbacks 497bd1d409SAlexander Shishkin * @name: device name 507bd1d409SAlexander Shishkin * @stm: internal structure, only used by stm class code 517bd1d409SAlexander Shishkin * @sw_start: first STP master available to software 527bd1d409SAlexander Shishkin * @sw_end: last STP master available to software 537bd1d409SAlexander Shishkin * @sw_nchannels: number of STP channels per master 547bd1d409SAlexander Shishkin * @sw_mmiosz: size of one channel's IO space, for mmap, optional 558e996a28SAlexander Shishkin * @hw_override: masters in the STP stream will not match the ones 568e996a28SAlexander Shishkin * assigned by software, but are up to the STM hardware 577bd1d409SAlexander Shishkin * @packet: callback that sends an STP packet 587bd1d409SAlexander Shishkin * @mmio_addr: mmap callback, optional 597bd1d409SAlexander Shishkin * @link: called when a new stm_source gets linked to us, optional 607bd1d409SAlexander Shishkin * @unlink: likewise for unlinking, again optional 617bd1d409SAlexander Shishkin * @set_options: set device-specific options on a channel 627bd1d409SAlexander Shishkin * 637bd1d409SAlexander Shishkin * Fill out this structure before calling stm_register_device() to create 647bd1d409SAlexander Shishkin * an STM device and stm_unregister_device() to destroy it. It will also be 657bd1d409SAlexander Shishkin * passed back to @packet(), @mmio_addr(), @link(), @unlink() and @set_options() 667bd1d409SAlexander Shishkin * callbacks. 677bd1d409SAlexander Shishkin * 687bd1d409SAlexander Shishkin * Normally, an STM device will have a range of masters available to software 697bd1d409SAlexander Shishkin * and the rest being statically assigned to various hardware trace sources. 70d0b371e5SRandy Dunlap * The former is defined by the range [@sw_start..@sw_end] of the device 717bd1d409SAlexander Shishkin * description. That is, the lowest master that can be allocated to software 727bd1d409SAlexander Shishkin * writers is @sw_start and data from this writer will appear is @sw_start 737bd1d409SAlexander Shishkin * master in the STP stream. 74f8560a9bSAlexander Shishkin * 75f8560a9bSAlexander Shishkin * The @packet callback should adhere to the following rules: 76f8560a9bSAlexander Shishkin * 1) it must return the number of bytes it consumed from the payload; 77f8560a9bSAlexander Shishkin * 2) therefore, if it sent a packet that does not have payload (like FLAG), 78f8560a9bSAlexander Shishkin * it must return zero; 79f8560a9bSAlexander Shishkin * 3) if it does not support the requested packet type/flag combination, 80f8560a9bSAlexander Shishkin * it must return -ENOTSUPP. 81cc842407SAlexander Shishkin * 82cc842407SAlexander Shishkin * The @unlink callback is called when there are no more active writers so 83cc842407SAlexander Shishkin * that the master/channel can be quiesced. 847bd1d409SAlexander Shishkin */ 857bd1d409SAlexander Shishkin struct stm_data { 867bd1d409SAlexander Shishkin const char *name; 877bd1d409SAlexander Shishkin struct stm_device *stm; 887bd1d409SAlexander Shishkin unsigned int sw_start; 897bd1d409SAlexander Shishkin unsigned int sw_end; 907bd1d409SAlexander Shishkin unsigned int sw_nchannels; 917bd1d409SAlexander Shishkin unsigned int sw_mmiosz; 928e996a28SAlexander Shishkin unsigned int hw_override; 937bd1d409SAlexander Shishkin ssize_t (*packet)(struct stm_data *, unsigned int, 947bd1d409SAlexander Shishkin unsigned int, unsigned int, 957bd1d409SAlexander Shishkin unsigned int, unsigned int, 967bd1d409SAlexander Shishkin const unsigned char *); 977bd1d409SAlexander Shishkin phys_addr_t (*mmio_addr)(struct stm_data *, unsigned int, 987bd1d409SAlexander Shishkin unsigned int, unsigned int); 997bd1d409SAlexander Shishkin int (*link)(struct stm_data *, unsigned int, 1007bd1d409SAlexander Shishkin unsigned int); 1017bd1d409SAlexander Shishkin void (*unlink)(struct stm_data *, unsigned int, 1027bd1d409SAlexander Shishkin unsigned int); 1037bd1d409SAlexander Shishkin long (*set_options)(struct stm_data *, unsigned int, 1047bd1d409SAlexander Shishkin unsigned int, unsigned int, 1057bd1d409SAlexander Shishkin unsigned long); 1067bd1d409SAlexander Shishkin }; 1077bd1d409SAlexander Shishkin 1087bd1d409SAlexander Shishkin int stm_register_device(struct device *parent, struct stm_data *stm_data, 1097bd1d409SAlexander Shishkin struct module *owner); 1107bd1d409SAlexander Shishkin void stm_unregister_device(struct stm_data *stm_data); 1117bd1d409SAlexander Shishkin 1127bd1d409SAlexander Shishkin struct stm_source_device; 1137bd1d409SAlexander Shishkin 1147bd1d409SAlexander Shishkin /** 1157bd1d409SAlexander Shishkin * struct stm_source_data - STM source device description and callbacks 1167bd1d409SAlexander Shishkin * @name: device name, will be used for policy lookup 1177bd1d409SAlexander Shishkin * @src: internal structure, only used by stm class code 1187bd1d409SAlexander Shishkin * @nr_chans: number of channels to allocate 119*07cf8356SMikhail Lappo * @type: type of STM source driver represented by stm_source_type 1207bd1d409SAlexander Shishkin * @link: called when this source gets linked to an STM device 1217bd1d409SAlexander Shishkin * @unlink: called when this source is about to get unlinked from its STM 1227bd1d409SAlexander Shishkin * 1237bd1d409SAlexander Shishkin * Fill in this structure before calling stm_source_register_device() to 1247bd1d409SAlexander Shishkin * register a source device. Also pass it to unregister and write calls. 1257bd1d409SAlexander Shishkin */ 1267bd1d409SAlexander Shishkin struct stm_source_data { 1277bd1d409SAlexander Shishkin const char *name; 1287bd1d409SAlexander Shishkin struct stm_source_device *src; 1297bd1d409SAlexander Shishkin unsigned int percpu; 1307bd1d409SAlexander Shishkin unsigned int nr_chans; 131*07cf8356SMikhail Lappo unsigned int type; 1327bd1d409SAlexander Shishkin int (*link)(struct stm_source_data *data); 1337bd1d409SAlexander Shishkin void (*unlink)(struct stm_source_data *data); 1347bd1d409SAlexander Shishkin }; 1357bd1d409SAlexander Shishkin 1367bd1d409SAlexander Shishkin int stm_source_register_device(struct device *parent, 1377bd1d409SAlexander Shishkin struct stm_source_data *data); 1387bd1d409SAlexander Shishkin void stm_source_unregister_device(struct stm_source_data *data); 1397bd1d409SAlexander Shishkin 1409dfed80dSChunyan Zhang int notrace stm_source_write(struct stm_source_data *data, unsigned int chan, 1417bd1d409SAlexander Shishkin const char *buf, size_t count); 1427bd1d409SAlexander Shishkin 1437bd1d409SAlexander Shishkin #endif /* _STM_H_ */ 144