xref: /linux-6.15/include/linux/stm.h (revision 07cf8356)
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