168 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 | |
| /*
 | |
|  *
 | |
|  * (C) COPYRIGHT 2015-2023 ARM Limited. All rights reserved.
 | |
|  *
 | |
|  * This program is free software and is provided to you under the terms of the
 | |
|  * GNU General Public License version 2 as published by the Free Software
 | |
|  * Foundation, and any use by you of this program is subject to the terms
 | |
|  * of such GNU license.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 | |
|  * GNU General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with this program; if not, you can access it online at
 | |
|  * http://www.gnu.org/licenses/gpl-2.0.html.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #if !defined(_KBASE_TLSTREAM_H)
 | |
| #define _KBASE_TLSTREAM_H
 | |
| 
 | |
| #include <linux/spinlock.h>
 | |
| #include <linux/atomic.h>
 | |
| #include <linux/wait.h>
 | |
| 
 | |
| /* The maximum size of a single packet used by timeline. */
 | |
| #define PACKET_SIZE 4096 /* bytes */
 | |
| 
 | |
| /* The number of packets used by one timeline stream. */
 | |
| #define PACKET_COUNT 128
 | |
| 
 | |
| /* The maximum expected length of string in tracepoint descriptor. */
 | |
| #define STRLEN_MAX 64 /* bytes */
 | |
| 
 | |
| /**
 | |
|  * struct kbase_tlstream - timeline stream structure
 | |
|  * @lock:              Message order lock
 | |
|  * @buffer:            Array of buffers
 | |
|  * @buffer.size:       Number of bytes in buffer
 | |
|  * @buffer.data:       Buffer's data
 | |
|  * @wbi:               Write buffer index
 | |
|  * @rbi:               Read buffer index
 | |
|  * @numbered:          If non-zero stream's packets are sequentially numbered
 | |
|  * @autoflush_counter: Counter tracking stream's autoflush state
 | |
|  * @ready_read:        Pointer to a wait queue, which is signaled when
 | |
|  *                     timeline messages are ready for collection.
 | |
|  * @bytes_generated:   Number of bytes generated by tracepoint messages
 | |
|  *
 | |
|  * This structure holds information needed to construct proper packets in the
 | |
|  * timeline stream.
 | |
|  *
 | |
|  * Each message in the sequence must bear a timestamp that is
 | |
|  * greater than the previous message in the same stream. For this reason
 | |
|  * a lock is held throughout the process of message creation.
 | |
|  *
 | |
|  * Each stream contains a set of buffers. Each buffer will hold one MIPE
 | |
|  * packet. In case there is no free space required to store the incoming
 | |
|  * message the oldest buffer is discarded. Each packet in timeline body
 | |
|  * stream has a sequence number embedded, this value must increment
 | |
|  * monotonically and is used by the packets receiver to discover these
 | |
|  * buffer overflows.
 | |
|  *
 | |
|  * The autoflush counter is set to a negative number when there is no data
 | |
|  * pending for flush and it is set to zero on every update of the buffer. The
 | |
|  * autoflush timer will increment the counter by one on every expiry. If there
 | |
|  * is no activity on the buffer for two consecutive timer expiries, the stream
 | |
|  * buffer will be flushed.
 | |
|  */
 | |
| struct kbase_tlstream {
 | |
| 	spinlock_t lock;
 | |
| 
 | |
| 	struct {
 | |
| 		atomic_t size;
 | |
| 		char data[PACKET_SIZE];
 | |
| 	} buffer[PACKET_COUNT];
 | |
| 
 | |
| 	atomic_t wbi;
 | |
| 	atomic_t rbi;
 | |
| 
 | |
| 	int numbered;
 | |
| 	atomic_t autoflush_counter;
 | |
| 	wait_queue_head_t *ready_read;
 | |
| #if MALI_UNIT_TEST
 | |
| 	atomic_t bytes_generated;
 | |
| #endif
 | |
| };
 | |
| 
 | |
| /* Types of streams generated by timeline. */
 | |
| enum tl_stream_type {
 | |
| 	TL_STREAM_TYPE_FIRST,
 | |
| 	TL_STREAM_TYPE_OBJ_SUMMARY = TL_STREAM_TYPE_FIRST,
 | |
| 	TL_STREAM_TYPE_OBJ,
 | |
| 	TL_STREAM_TYPE_AUX,
 | |
| #if MALI_USE_CSF
 | |
| 	TL_STREAM_TYPE_CSFFW,
 | |
| #endif
 | |
| 	TL_STREAM_TYPE_COUNT
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * kbase_tlstream_init - initialize timeline stream
 | |
|  * @stream:      Pointer to the stream structure
 | |
|  * @stream_type: Stream type
 | |
|  * @ready_read:  Pointer to a wait queue to signal when
 | |
|  *               timeline messages are ready for collection.
 | |
|  */
 | |
| void kbase_tlstream_init(struct kbase_tlstream *stream, enum tl_stream_type stream_type,
 | |
| 			 wait_queue_head_t *ready_read);
 | |
| 
 | |
| /**
 | |
|  * kbase_tlstream_term - terminate timeline stream
 | |
|  * @stream: Pointer to the stream structure
 | |
|  */
 | |
| void kbase_tlstream_term(struct kbase_tlstream *stream);
 | |
| 
 | |
| /**
 | |
|  * kbase_tlstream_reset - reset stream
 | |
|  * @stream:    Pointer to the stream structure
 | |
|  *
 | |
|  * Function discards all pending messages and resets packet counters.
 | |
|  */
 | |
| void kbase_tlstream_reset(struct kbase_tlstream *stream);
 | |
| 
 | |
| /**
 | |
|  * kbase_tlstream_msgbuf_acquire - lock selected stream and reserve a buffer
 | |
|  * @stream:      Pointer to the stream structure
 | |
|  * @msg_size:    Message size
 | |
|  * @flags:       Pointer to store flags passed back on stream release
 | |
|  *
 | |
|  * Lock the stream and reserve the number of bytes requested
 | |
|  * in msg_size for the user.
 | |
|  *
 | |
|  * Return: pointer to the buffer where a message can be stored
 | |
|  *
 | |
|  * Warning: The stream must be released with kbase_tlstream_msgbuf_release().
 | |
|  *          Only atomic operations are allowed while the stream is locked
 | |
|  *          (i.e. do not use any operation that may sleep).
 | |
|  */
 | |
| char *kbase_tlstream_msgbuf_acquire(struct kbase_tlstream *stream, size_t msg_size,
 | |
| 				    unsigned long *flags) __acquires(&stream->lock);
 | |
| 
 | |
| /**
 | |
|  * kbase_tlstream_msgbuf_release - unlock selected stream
 | |
|  * @stream:    Pointer to the stream structure
 | |
|  * @flags:     Value obtained during stream acquire
 | |
|  *
 | |
|  * Release the stream that has been previously
 | |
|  * locked with a call to kbase_tlstream_msgbuf_acquire().
 | |
|  */
 | |
| void kbase_tlstream_msgbuf_release(struct kbase_tlstream *stream, unsigned long flags)
 | |
| 	__releases(&stream->lock);
 | |
| 
 | |
| /**
 | |
|  * kbase_tlstream_flush_stream - flush stream
 | |
|  * @stream:     Pointer to the stream structure
 | |
|  *
 | |
|  * Flush pending data in the timeline stream.
 | |
|  *
 | |
|  * Return: Number of bytes available flushed and available to be read
 | |
|  *
 | |
|  */
 | |
| size_t kbase_tlstream_flush_stream(struct kbase_tlstream *stream);
 | |
| 
 | |
| #endif /* _KBASE_TLSTREAM_H */
 |