3 * (C) COPYRIGHT 2015-2016 ARM Limited. All rights reserved.
5 * This program is free software and is provided to you under the terms of the
6 * GNU General Public License version 2 as published by the Free Software
7 * Foundation, and any use by you of this program is subject to the terms
10 * A copy of the licence is included with the program, and can also be obtained
11 * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
12 * Boston, MA 02110-1301, USA.
18 #include <linux/anon_inodes.h>
19 #include <linux/atomic.h>
20 #include <linux/file.h>
21 #include <linux/mutex.h>
22 #include <linux/poll.h>
23 #include <linux/spinlock.h>
24 #include <linux/string.h>
25 #include <linux/stringify.h>
26 #include <linux/timer.h>
27 #include <linux/wait.h>
29 #include <mali_kbase.h>
30 #include <mali_kbase_jm.h>
31 #include <mali_kbase_tlstream.h>
33 /*****************************************************************************/
35 /* The version of swtrace protocol used in timeline stream. */
36 #define SWTRACE_VERSION 3
38 /* The maximum expected length of string in tracepoint descriptor. */
39 #define STRLEN_MAX 64 /* bytes */
41 /* The number of nanoseconds in a second. */
42 #define NSECS_IN_SEC 1000000000ull /* ns */
44 /* The period of autoflush checker execution in milliseconds. */
45 #define AUTOFLUSH_INTERVAL 1000 /* ms */
47 /* The maximum size of a single packet used by timeline. */
48 #define PACKET_SIZE 4096 /* bytes */
50 /* The number of packets used by one timeline stream. */
51 #define PACKET_COUNT 16
53 /* The number of bytes reserved for packet header.
54 * These value must be defined according to MIPE documentation. */
55 #define PACKET_HEADER_SIZE 8 /* bytes */
57 /* The number of bytes reserved for packet sequence number.
58 * These value must be defined according to MIPE documentation. */
59 #define PACKET_NUMBER_SIZE 4 /* bytes */
61 /* Packet header - first word.
62 * These values must be defined according to MIPE documentation. */
63 #define PACKET_STREAMID_POS 0
64 #define PACKET_STREAMID_LEN 8
65 #define PACKET_RSVD1_POS (PACKET_STREAMID_POS + PACKET_STREAMID_LEN)
66 #define PACKET_RSVD1_LEN 8
67 #define PACKET_TYPE_POS (PACKET_RSVD1_POS + PACKET_RSVD1_LEN)
68 #define PACKET_TYPE_LEN 3
69 #define PACKET_CLASS_POS (PACKET_TYPE_POS + PACKET_TYPE_LEN)
70 #define PACKET_CLASS_LEN 7
71 #define PACKET_FAMILY_POS (PACKET_CLASS_POS + PACKET_CLASS_LEN)
72 #define PACKET_FAMILY_LEN 6
74 /* Packet header - second word
75 * These values must be defined according to MIPE documentation. */
76 #define PACKET_LENGTH_POS 0
77 #define PACKET_LENGTH_LEN 24
78 #define PACKET_SEQBIT_POS (PACKET_LENGTH_POS + PACKET_LENGTH_LEN)
79 #define PACKET_SEQBIT_LEN 1
80 #define PACKET_RSVD2_POS (PACKET_SEQBIT_POS + PACKET_SEQBIT_LEN)
81 #define PACKET_RSVD2_LEN 7
83 /* Types of streams generated by timeline.
84 * Order is significant! Header streams must precede respective body streams. */
86 TL_STREAM_TYPE_OBJ_HEADER,
87 TL_STREAM_TYPE_OBJ_SUMMARY,
89 TL_STREAM_TYPE_AUX_HEADER,
95 /* Timeline packet family ids.
96 * Values are significant! Check MIPE documentation. */
97 enum tl_packet_family {
98 TL_PACKET_FAMILY_CTRL = 0, /* control packets */
99 TL_PACKET_FAMILY_TL = 1, /* timeline packets */
101 TL_PACKET_FAMILY_COUNT
104 /* Packet classes used in timeline streams.
105 * Values are significant! Check MIPE documentation. */
106 enum tl_packet_class {
107 TL_PACKET_CLASS_OBJ = 0, /* timeline objects packet */
108 TL_PACKET_CLASS_AUX = 1, /* auxiliary events packet */
111 /* Packet types used in timeline streams.
112 * Values are significant! Check MIPE documentation. */
113 enum tl_packet_type {
114 TL_PACKET_TYPE_HEADER = 0, /* stream's header/directory */
115 TL_PACKET_TYPE_BODY = 1, /* stream's body */
116 TL_PACKET_TYPE_SUMMARY = 2, /* stream's summary */
119 /* Message ids of trace events that are recorded in the timeline stream. */
121 /* Timeline object events. */
129 KBASE_TL_LIFELINK_LPU_GPU,
130 KBASE_TL_LIFELINK_AS_GPU,
131 KBASE_TL_RET_CTX_LPU,
132 KBASE_TL_RET_ATOM_CTX,
133 KBASE_TL_RET_ATOM_LPU,
134 KBASE_TL_NRET_CTX_LPU,
135 KBASE_TL_NRET_ATOM_CTX,
136 KBASE_TL_NRET_ATOM_LPU,
138 KBASE_TL_NRET_AS_CTX,
139 KBASE_TL_RET_ATOM_AS,
140 KBASE_TL_NRET_ATOM_AS,
141 KBASE_TL_DEP_ATOM_ATOM,
142 KBASE_TL_NDEP_ATOM_ATOM,
143 KBASE_TL_RDEP_ATOM_ATOM,
144 KBASE_TL_ATTRIB_ATOM_CONFIG,
145 KBASE_TL_ATTRIB_ATOM_PRIORITY,
146 KBASE_TL_ATTRIB_ATOM_STATE,
147 KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE,
148 KBASE_TL_ATTRIB_AS_CONFIG,
149 KBASE_TL_EVENT_LPU_SOFTSTOP,
150 KBASE_TL_EVENT_ATOM_SOFTSTOP_EX,
151 KBASE_TL_EVENT_ATOM_SOFTSTOP_ISSUE,
153 /* Job dump specific events. */
154 KBASE_JD_GPU_SOFT_RESET
157 /* Message ids of trace events that are recorded in the auxiliary stream. */
161 KBASE_AUX_PAGESALLOC,
162 KBASE_AUX_DEVFREQ_TARGET
165 /*****************************************************************************/
168 * struct tl_stream - timeline stream structure
169 * @lock: message order lock
170 * @buffer: array of buffers
171 * @wbi: write buffer index
172 * @rbi: read buffer index
173 * @numbered: if non-zero stream's packets are sequentially numbered
174 * @autoflush_counter: counter tracking stream's autoflush state
176 * This structure holds information needed to construct proper packets in the
177 * timeline stream. Each message in sequence must bear timestamp that is greater
178 * to one in previous message in the same stream. For this reason lock is held
179 * throughout the process of message creation. Each stream contains set of
180 * buffers. Each buffer will hold one MIPE packet. In case there is no free
181 * space required to store incoming message the oldest buffer is discarded.
182 * Each packet in timeline body stream has sequence number embedded (this value
183 * must increment monotonically and is used by packets receiver to discover
185 * Autoflush counter is set to negative number when there is no data pending
186 * for flush and it is set to zero on every update of the buffer. Autoflush
187 * timer will increment the counter by one on every expiry. In case there will
188 * be no activity on the buffer during two consecutive timer expiries, stream
189 * buffer will be flushed.
195 atomic_t size; /* number of bytes in buffer */
196 char data[PACKET_SIZE]; /* buffer's data */
197 } buffer[PACKET_COUNT];
203 atomic_t autoflush_counter;
207 * struct tp_desc - tracepoint message descriptor structure
208 * @id: tracepoint ID identifying message in stream
209 * @id_str: human readable version of tracepoint ID
210 * @name: tracepoint description
211 * @arg_types: tracepoint's arguments types declaration
212 * @arg_names: comma separated list of tracepoint's arguments names
218 const char *arg_types;
219 const char *arg_names;
222 /*****************************************************************************/
224 /* Configuration of timeline streams generated by kernel.
225 * Kernel emit only streams containing either timeline object events or
226 * auxiliary events. All streams have stream id value of 1 (as opposed to user
227 * space streams that have value of 0). */
228 static const struct {
229 enum tl_packet_family pkt_family;
230 enum tl_packet_class pkt_class;
231 enum tl_packet_type pkt_type;
232 unsigned int stream_id;
233 } tl_stream_cfg[TL_STREAM_TYPE_COUNT] = {
234 {TL_PACKET_FAMILY_TL, TL_PACKET_CLASS_OBJ, TL_PACKET_TYPE_HEADER, 1},
235 {TL_PACKET_FAMILY_TL, TL_PACKET_CLASS_OBJ, TL_PACKET_TYPE_SUMMARY, 1},
236 {TL_PACKET_FAMILY_TL, TL_PACKET_CLASS_OBJ, TL_PACKET_TYPE_BODY, 1},
237 {TL_PACKET_FAMILY_TL, TL_PACKET_CLASS_AUX, TL_PACKET_TYPE_HEADER, 1},
238 {TL_PACKET_FAMILY_TL, TL_PACKET_CLASS_AUX, TL_PACKET_TYPE_BODY, 1}
241 /* The timeline streams generated by kernel. */
242 static struct tl_stream *tl_stream[TL_STREAM_TYPE_COUNT];
244 /* Autoflush timer. */
245 static struct timer_list autoflush_timer;
247 /* If non-zero autoflush timer is active. */
248 static atomic_t autoflush_timer_active;
250 /* Reader lock. Only one reader is allowed to have access to the timeline
251 * streams at any given time. */
252 static DEFINE_MUTEX(tl_reader_lock);
254 /* Timeline stream event queue. */
255 static DECLARE_WAIT_QUEUE_HEAD(tl_event_queue);
257 /* The timeline stream file operations functions. */
258 static ssize_t kbasep_tlstream_read(
263 static unsigned int kbasep_tlstream_poll(struct file *filp, poll_table *wait);
264 static int kbasep_tlstream_release(struct inode *inode, struct file *filp);
266 /* The timeline stream file operations structure. */
267 static const struct file_operations kbasep_tlstream_fops = {
268 .release = kbasep_tlstream_release,
269 .read = kbasep_tlstream_read,
270 .poll = kbasep_tlstream_poll,
273 /* Descriptors of timeline messages transmitted in object events stream. */
274 static const struct tp_desc tp_desc_obj[] = {
277 __stringify(KBASE_TL_NEW_CTX),
278 "object ctx is created",
284 __stringify(KBASE_TL_NEW_GPU),
285 "object gpu is created",
287 "gpu,gpu_id,core_count"
291 __stringify(KBASE_TL_NEW_LPU),
292 "object lpu is created",
298 __stringify(KBASE_TL_NEW_ATOM),
299 "object atom is created",
305 __stringify(KBASE_TL_NEW_AS),
306 "address space object is created",
308 "address_space,as_nr"
312 __stringify(KBASE_TL_DEL_CTX),
313 "context is destroyed",
319 __stringify(KBASE_TL_DEL_ATOM),
325 KBASE_TL_LIFELINK_LPU_GPU,
326 __stringify(KBASE_TL_LIFELINK_LPU_GPU),
327 "lpu is deleted with gpu",
332 KBASE_TL_LIFELINK_AS_GPU,
333 __stringify(KBASE_TL_LIFELINK_AS_GPU),
334 "address space is deleted with gpu",
339 KBASE_TL_RET_CTX_LPU,
340 __stringify(KBASE_TL_RET_CTX_LPU),
341 "context is retained by lpu",
346 KBASE_TL_RET_ATOM_CTX,
347 __stringify(KBASE_TL_RET_ATOM_CTX),
348 "atom is retained by context",
353 KBASE_TL_RET_ATOM_LPU,
354 __stringify(KBASE_TL_RET_ATOM_LPU),
355 "atom is retained by lpu",
357 "atom,lpu,attrib_match_list"
360 KBASE_TL_NRET_CTX_LPU,
361 __stringify(KBASE_TL_NRET_CTX_LPU),
362 "context is released by lpu",
367 KBASE_TL_NRET_ATOM_CTX,
368 __stringify(KBASE_TL_NRET_ATOM_CTX),
369 "atom is released by context",
374 KBASE_TL_NRET_ATOM_LPU,
375 __stringify(KBASE_TL_NRET_ATOM_LPU),
376 "atom is released by lpu",
382 __stringify(KBASE_TL_RET_AS_CTX),
383 "address space is retained by context",
388 KBASE_TL_NRET_AS_CTX,
389 __stringify(KBASE_TL_NRET_AS_CTX),
390 "address space is released by context",
395 KBASE_TL_RET_ATOM_AS,
396 __stringify(KBASE_TL_RET_ATOM_AS),
397 "atom is retained by address space",
402 KBASE_TL_NRET_ATOM_AS,
403 __stringify(KBASE_TL_NRET_ATOM_AS),
404 "atom is released by address space",
409 KBASE_TL_DEP_ATOM_ATOM,
410 __stringify(KBASE_TL_DEP_ATOM_ATOM),
411 "atom2 depends on atom1",
416 KBASE_TL_NDEP_ATOM_ATOM,
417 __stringify(KBASE_TL_NDEP_ATOM_ATOM),
418 "atom2 no longer depends on atom1",
423 KBASE_TL_RDEP_ATOM_ATOM,
424 __stringify(KBASE_TL_RDEP_ATOM_ATOM),
425 "resolved dependecy of atom2 depending on atom1",
430 KBASE_TL_ATTRIB_ATOM_CONFIG,
431 __stringify(KBASE_TL_ATTRIB_ATOM_CONFIG),
432 "atom job slot attributes",
434 "atom,descriptor,affinity,config"
437 KBASE_TL_ATTRIB_ATOM_PRIORITY,
438 __stringify(KBASE_TL_ATTRIB_ATOM_PRIORITY),
444 KBASE_TL_ATTRIB_ATOM_STATE,
445 __stringify(KBASE_TL_ATTRIB_ATOM_STATE),
451 KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE,
452 __stringify(KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE),
453 "atom caused priority change",
458 KBASE_TL_ATTRIB_AS_CONFIG,
459 __stringify(KBASE_TL_ATTRIB_AS_CONFIG),
460 "address space attributes",
462 "address_space,transtab,memattr,transcfg"
465 KBASE_TL_EVENT_LPU_SOFTSTOP,
466 __stringify(KBASE_TL_EVENT_LPU_SOFTSTOP),
467 "softstop event on given lpu",
472 KBASE_TL_EVENT_ATOM_SOFTSTOP_EX,
473 __stringify(KBASE_TL_EVENT_ATOM_SOFTSTOP_EX),
479 KBASE_TL_EVENT_ATOM_SOFTSTOP_ISSUE,
480 __stringify(KBASE_TL_EVENT_SOFTSTOP_ISSUE),
481 "atom softstop issued",
486 KBASE_JD_GPU_SOFT_RESET,
487 __stringify(KBASE_JD_GPU_SOFT_RESET),
494 /* Descriptors of timeline messages transmitted in auxiliary events stream. */
495 static const struct tp_desc tp_desc_aux[] = {
498 __stringify(KBASE_AUX_PM_STATE),
501 "core_type,core_state_bitset"
505 __stringify(KBASE_AUX_PAGEFAULT),
508 "ctx_nr,page_cnt_change"
511 KBASE_AUX_PAGESALLOC,
512 __stringify(KBASE_AUX_PAGESALLOC),
513 "Total alloc pages change",
518 KBASE_AUX_DEVFREQ_TARGET,
519 __stringify(KBASE_AUX_DEVFREQ_TARGET),
520 "New device frequency target",
527 /* Number of bytes read by user. */
528 static atomic_t tlstream_bytes_collected = {0};
530 /* Number of bytes generated by tracepoint messages. */
531 static atomic_t tlstream_bytes_generated = {0};
532 #endif /* MALI_UNIT_TEST */
534 /*****************************************************************************/
536 /* Indicator of whether the timeline stream file descriptor is used. */
537 atomic_t kbase_tlstream_enabled = {0};
539 /*****************************************************************************/
542 * kbasep_tlstream_get_timestamp - return timestamp
544 * Function returns timestamp value based on raw monotonic timer. Value will
545 * wrap around zero in case of overflow.
546 * Return: timestamp value
548 static u64 kbasep_tlstream_get_timestamp(void)
553 getrawmonotonic(&ts);
554 timestamp = (u64)ts.tv_sec * NSECS_IN_SEC + ts.tv_nsec;
559 * kbasep_tlstream_write_bytes - write data to message buffer
560 * @buffer: buffer where data will be written
561 * @pos: position in the buffer where to place data
562 * @bytes: pointer to buffer holding data
563 * @len: length of data to be written
565 * Return: updated position in the buffer
567 static size_t kbasep_tlstream_write_bytes(
573 KBASE_DEBUG_ASSERT(buffer);
574 KBASE_DEBUG_ASSERT(bytes);
576 memcpy(&buffer[pos], bytes, len);
582 * kbasep_tlstream_write_string - write string to message buffer
583 * @buffer: buffer where data will be written
584 * @pos: position in the buffer where to place data
585 * @string: pointer to buffer holding the source string
586 * @max_write_size: number of bytes that can be stored in buffer
588 * Return: updated position in the buffer
590 static size_t kbasep_tlstream_write_string(
594 size_t max_write_size)
598 KBASE_DEBUG_ASSERT(buffer);
599 KBASE_DEBUG_ASSERT(string);
600 /* Timeline string consists of at least string length and nul
602 KBASE_DEBUG_ASSERT(max_write_size >= sizeof(string_len) + sizeof(char));
603 max_write_size -= sizeof(string_len);
605 string_len = strlcpy(
606 &buffer[pos + sizeof(string_len)],
609 string_len += sizeof(char);
611 /* Make sure that the source string fit into the buffer. */
612 KBASE_DEBUG_ASSERT(string_len <= max_write_size);
614 /* Update string length. */
615 memcpy(&buffer[pos], &string_len, sizeof(string_len));
617 return pos + sizeof(string_len) + string_len;
621 * kbasep_tlstream_write_timestamp - write timestamp to message buffer
622 * @buffer: buffer where data will be written
623 * @pos: position in the buffer where to place data
625 * Return: updated position in the buffer
627 static size_t kbasep_tlstream_write_timestamp(void *buffer, size_t pos)
629 u64 timestamp = kbasep_tlstream_get_timestamp();
631 return kbasep_tlstream_write_bytes(
633 ×tamp, sizeof(timestamp));
637 * kbasep_tlstream_put_bits - put bits in a word
638 * @word: pointer to the words being modified
639 * @value: value that shall be written to given position
640 * @bitpos: position where value shall be written (in bits)
641 * @bitlen: length of value (in bits)
643 static void kbasep_tlstream_put_bits(
649 const u32 mask = ((1 << bitlen) - 1) << bitpos;
651 KBASE_DEBUG_ASSERT(word);
652 KBASE_DEBUG_ASSERT((0 != bitlen) && (32 >= bitlen));
653 KBASE_DEBUG_ASSERT((bitpos + bitlen) <= 32);
656 *word |= ((value << bitpos) & mask);
660 * kbasep_tlstream_packet_header_setup - setup the packet header
661 * @buffer: pointer to the buffer
662 * @pkt_family: packet's family
663 * @pkt_type: packet's type
664 * @pkt_class: packet's class
665 * @stream_id: stream id
666 * @numbered: non-zero if this stream is numbered
668 * Function sets up immutable part of packet header in the given buffer.
670 static void kbasep_tlstream_packet_header_setup(
672 enum tl_packet_family pkt_family,
673 enum tl_packet_class pkt_class,
674 enum tl_packet_type pkt_type,
675 unsigned int stream_id,
681 KBASE_DEBUG_ASSERT(buffer);
682 KBASE_DEBUG_ASSERT(pkt_family == TL_PACKET_FAMILY_TL);
684 (pkt_type == TL_PACKET_TYPE_HEADER) ||
685 (pkt_type == TL_PACKET_TYPE_SUMMARY) ||
686 (pkt_type == TL_PACKET_TYPE_BODY));
688 (pkt_class == TL_PACKET_CLASS_OBJ) ||
689 (pkt_class == TL_PACKET_CLASS_AUX));
691 kbasep_tlstream_put_bits(
693 PACKET_FAMILY_POS, PACKET_FAMILY_LEN);
694 kbasep_tlstream_put_bits(
696 PACKET_CLASS_POS, PACKET_CLASS_LEN);
697 kbasep_tlstream_put_bits(
699 PACKET_TYPE_POS, PACKET_TYPE_LEN);
700 kbasep_tlstream_put_bits(
702 PACKET_STREAMID_POS, PACKET_STREAMID_LEN);
705 kbasep_tlstream_put_bits(
707 PACKET_SEQBIT_POS, PACKET_SEQBIT_LEN);
709 memcpy(&buffer[0], &word0, sizeof(word0));
710 memcpy(&buffer[sizeof(word0)], &word1, sizeof(word1));
714 * kbasep_tlstream_packet_header_update - update the packet header
715 * @buffer: pointer to the buffer
716 * @data_size: amount of data carried in this packet
718 * Function updates mutable part of packet header in the given buffer.
719 * Note that value of data_size must not including size of the header.
721 static void kbasep_tlstream_packet_header_update(
728 KBASE_DEBUG_ASSERT(buffer);
731 memcpy(&word1, &buffer[sizeof(word0)], sizeof(word1));
733 kbasep_tlstream_put_bits(
735 PACKET_LENGTH_POS, PACKET_LENGTH_LEN);
737 memcpy(&buffer[sizeof(word0)], &word1, sizeof(word1));
741 * kbasep_tlstream_packet_number_update - update the packet number
742 * @buffer: pointer to the buffer
743 * @counter: value of packet counter for this packet's stream
745 * Function updates packet number embedded within the packet placed in the
748 static void kbasep_tlstream_packet_number_update(char *buffer, u32 counter)
750 KBASE_DEBUG_ASSERT(buffer);
752 memcpy(&buffer[PACKET_HEADER_SIZE], &counter, sizeof(counter));
756 * kbasep_timeline_stream_reset - reset stream
757 * @stream: pointer to the stream structure
759 * Function discards all pending messages and resets packet counters.
761 static void kbasep_timeline_stream_reset(struct tl_stream *stream)
765 for (i = 0; i < PACKET_COUNT; i++) {
766 if (stream->numbered)
768 &stream->buffer[i].size,
772 atomic_set(&stream->buffer[i].size, PACKET_HEADER_SIZE);
775 atomic_set(&stream->wbi, 0);
776 atomic_set(&stream->rbi, 0);
780 * kbasep_timeline_stream_init - initialize timeline stream
781 * @stream: pointer to the stream structure
782 * @stream_type: stream type
784 static void kbasep_timeline_stream_init(
785 struct tl_stream *stream,
786 enum tl_stream_type stream_type)
790 KBASE_DEBUG_ASSERT(stream);
791 KBASE_DEBUG_ASSERT(TL_STREAM_TYPE_COUNT > stream_type);
793 spin_lock_init(&stream->lock);
795 /* All packets carrying tracepoints shall be numbered. */
796 if (TL_PACKET_TYPE_BODY == tl_stream_cfg[stream_type].pkt_type)
797 stream->numbered = 1;
799 stream->numbered = 0;
801 for (i = 0; i < PACKET_COUNT; i++)
802 kbasep_tlstream_packet_header_setup(
803 stream->buffer[i].data,
804 tl_stream_cfg[stream_type].pkt_family,
805 tl_stream_cfg[stream_type].pkt_class,
806 tl_stream_cfg[stream_type].pkt_type,
807 tl_stream_cfg[stream_type].stream_id,
810 kbasep_timeline_stream_reset(tl_stream[stream_type]);
814 * kbasep_timeline_stream_term - terminate timeline stream
815 * @stream: pointer to the stream structure
817 static void kbasep_timeline_stream_term(struct tl_stream *stream)
819 KBASE_DEBUG_ASSERT(stream);
823 * kbasep_tlstream_msgbuf_submit - submit packet to the user space
824 * @stream: pointer to the stream structure
825 * @wb_idx_raw: write buffer index
826 * @wb_size: length of data stored in current buffer
828 * Function updates currently written buffer with packet header. Then write
829 * index is incremented and buffer is handled to user space. Parameters
830 * of new buffer are returned using provided arguments.
832 * Return: length of data in new buffer
834 * Warning: User must update the stream structure with returned value.
836 static size_t kbasep_tlstream_msgbuf_submit(
837 struct tl_stream *stream,
838 unsigned int wb_idx_raw,
839 unsigned int wb_size)
841 unsigned int rb_idx_raw = atomic_read(&stream->rbi);
842 unsigned int wb_idx = wb_idx_raw % PACKET_COUNT;
844 /* Set stream as flushed. */
845 atomic_set(&stream->autoflush_counter, -1);
847 kbasep_tlstream_packet_header_update(
848 stream->buffer[wb_idx].data,
849 wb_size - PACKET_HEADER_SIZE);
851 if (stream->numbered)
852 kbasep_tlstream_packet_number_update(
853 stream->buffer[wb_idx].data,
856 /* Increasing write buffer index will expose this packet to the reader.
857 * As stream->lock is not taken on reader side we must make sure memory
858 * is updated correctly before this will happen. */
861 atomic_set(&stream->wbi, wb_idx_raw);
863 /* Inform user that packets are ready for reading. */
864 wake_up_interruptible(&tl_event_queue);
866 /* Detect and mark overflow in this stream. */
867 if (PACKET_COUNT == wb_idx_raw - rb_idx_raw) {
868 /* Reader side depends on this increment to correctly handle
869 * overflows. The value shall be updated only if it was not
870 * modified by the reader. The data holding buffer will not be
871 * updated before stream->lock is released, however size of the
872 * buffer will. Make sure this increment is globally visible
873 * before information about selected write buffer size. */
874 atomic_cmpxchg(&stream->rbi, rb_idx_raw, rb_idx_raw + 1);
877 wb_size = PACKET_HEADER_SIZE;
878 if (stream->numbered)
879 wb_size += PACKET_NUMBER_SIZE;
885 * kbasep_tlstream_msgbuf_acquire - lock selected stream and reserves buffer
886 * @stream_type: type of the stream that shall be locked
887 * @msg_size: message size
888 * @flags: pointer to store flags passed back on stream release
890 * Function will lock the stream and reserve the number of bytes requested
891 * in msg_size for the user.
893 * Return: pointer to the buffer where message can be stored
895 * Warning: Stream must be released with kbasep_tlstream_msgbuf_release().
896 * Only atomic operations are allowed while stream is locked
897 * (i.e. do not use any operation that may sleep).
899 static char *kbasep_tlstream_msgbuf_acquire(
900 enum tl_stream_type stream_type,
902 unsigned long *flags) __acquires(&stream->lock)
904 struct tl_stream *stream;
905 unsigned int wb_idx_raw;
909 KBASE_DEBUG_ASSERT(TL_STREAM_TYPE_COUNT > stream_type);
911 PACKET_SIZE - PACKET_HEADER_SIZE - PACKET_NUMBER_SIZE >=
914 stream = tl_stream[stream_type];
916 spin_lock_irqsave(&stream->lock, *flags);
918 wb_idx_raw = atomic_read(&stream->wbi);
919 wb_idx = wb_idx_raw % PACKET_COUNT;
920 wb_size = atomic_read(&stream->buffer[wb_idx].size);
922 /* Select next buffer if data will not fit into current one. */
923 if (PACKET_SIZE < wb_size + msg_size) {
924 wb_size = kbasep_tlstream_msgbuf_submit(
925 stream, wb_idx_raw, wb_size);
926 wb_idx = (wb_idx_raw + 1) % PACKET_COUNT;
929 /* Reserve space in selected buffer. */
930 atomic_set(&stream->buffer[wb_idx].size, wb_size + msg_size);
933 atomic_add(msg_size, &tlstream_bytes_generated);
934 #endif /* MALI_UNIT_TEST */
936 return &stream->buffer[wb_idx].data[wb_size];
940 * kbasep_tlstream_msgbuf_release - unlock selected stream
941 * @stream_type: type of the stream that shall be locked
942 * @flags: value obtained during stream acquire
944 * Function releases stream that has been previously locked with a call to
945 * kbasep_tlstream_msgbuf_acquire().
947 static void kbasep_tlstream_msgbuf_release(
948 enum tl_stream_type stream_type,
949 unsigned long flags) __releases(&stream->lock)
951 struct tl_stream *stream;
953 KBASE_DEBUG_ASSERT(TL_STREAM_TYPE_COUNT > stream_type);
955 stream = tl_stream[stream_type];
957 /* Mark stream as containing unflushed data. */
958 atomic_set(&stream->autoflush_counter, 0);
960 spin_unlock_irqrestore(&stream->lock, flags);
963 /*****************************************************************************/
966 * kbasep_tlstream_flush_stream - flush stream
967 * @stype: type of stream to be flushed
969 * Flush pending data in timeline stream.
971 static void kbasep_tlstream_flush_stream(enum tl_stream_type stype)
973 struct tl_stream *stream = tl_stream[stype];
975 unsigned int wb_idx_raw;
978 size_t min_size = PACKET_HEADER_SIZE;
980 if (stream->numbered)
981 min_size += PACKET_NUMBER_SIZE;
983 spin_lock_irqsave(&stream->lock, flags);
985 wb_idx_raw = atomic_read(&stream->wbi);
986 wb_idx = wb_idx_raw % PACKET_COUNT;
987 wb_size = atomic_read(&stream->buffer[wb_idx].size);
989 if (wb_size > min_size) {
990 wb_size = kbasep_tlstream_msgbuf_submit(
991 stream, wb_idx_raw, wb_size);
992 wb_idx = (wb_idx_raw + 1) % PACKET_COUNT;
993 atomic_set(&stream->buffer[wb_idx].size, wb_size);
995 spin_unlock_irqrestore(&stream->lock, flags);
999 * kbasep_tlstream_autoflush_timer_callback - autoflush timer callback
1002 * Timer is executed periodically to check if any of the stream contains
1003 * buffer ready to be submitted to user space.
1005 static void kbasep_tlstream_autoflush_timer_callback(unsigned long data)
1007 enum tl_stream_type stype;
1012 for (stype = 0; stype < TL_STREAM_TYPE_COUNT; stype++) {
1013 struct tl_stream *stream = tl_stream[stype];
1014 unsigned long flags;
1015 unsigned int wb_idx_raw;
1016 unsigned int wb_idx;
1018 size_t min_size = PACKET_HEADER_SIZE;
1020 int af_cnt = atomic_read(&stream->autoflush_counter);
1022 /* Check if stream contain unflushed data. */
1026 /* Check if stream should be flushed now. */
1027 if (af_cnt != atomic_cmpxchg(
1028 &stream->autoflush_counter,
1035 /* Autoflush this stream. */
1036 if (stream->numbered)
1037 min_size += PACKET_NUMBER_SIZE;
1039 spin_lock_irqsave(&stream->lock, flags);
1041 wb_idx_raw = atomic_read(&stream->wbi);
1042 wb_idx = wb_idx_raw % PACKET_COUNT;
1043 wb_size = atomic_read(&stream->buffer[wb_idx].size);
1045 if (wb_size > min_size) {
1046 wb_size = kbasep_tlstream_msgbuf_submit(
1047 stream, wb_idx_raw, wb_size);
1048 wb_idx = (wb_idx_raw + 1) % PACKET_COUNT;
1049 atomic_set(&stream->buffer[wb_idx].size,
1052 spin_unlock_irqrestore(&stream->lock, flags);
1055 if (atomic_read(&autoflush_timer_active))
1058 jiffies + msecs_to_jiffies(AUTOFLUSH_INTERVAL));
1063 * kbasep_tlstream_packet_pending - check timeline streams for pending packets
1064 * @stype: pointer to variable where stream type will be placed
1065 * @rb_idx_raw: pointer to variable where read buffer index will be placed
1067 * Function checks all streams for pending packets. It will stop as soon as
1068 * packet ready to be submitted to user space is detected. Variables under
1069 * pointers, passed as the parameters to this function will be updated with
1070 * values pointing to right stream and buffer.
1072 * Return: non-zero if any of timeline streams has at last one packet ready
1074 static int kbasep_tlstream_packet_pending(
1075 enum tl_stream_type *stype,
1076 unsigned int *rb_idx_raw)
1080 KBASE_DEBUG_ASSERT(stype);
1081 KBASE_DEBUG_ASSERT(rb_idx_raw);
1085 (*stype < TL_STREAM_TYPE_COUNT) && !pending;
1087 if (NULL != tl_stream[*stype]) {
1088 *rb_idx_raw = atomic_read(&tl_stream[*stype]->rbi);
1089 /* Read buffer index may be updated by writer in case of
1090 * overflow. Read and write buffer indexes must be
1091 * loaded in correct order. */
1093 if (atomic_read(&tl_stream[*stype]->wbi) != *rb_idx_raw)
1103 * kbasep_tlstream_read - copy data from streams to buffer provided by user
1104 * @filp: pointer to file structure (unused)
1105 * @buffer: pointer to the buffer provided by user
1106 * @size: maximum amount of data that can be stored in the buffer
1107 * @f_pos: pointer to file offset (unused)
1109 * Return: number of bytes stored in the buffer
1111 static ssize_t kbasep_tlstream_read(
1113 char __user *buffer,
1117 ssize_t copy_len = 0;
1119 KBASE_DEBUG_ASSERT(filp);
1120 KBASE_DEBUG_ASSERT(f_pos);
1125 if ((0 > *f_pos) || (PACKET_SIZE > size))
1128 mutex_lock(&tl_reader_lock);
1130 while (copy_len < size) {
1131 enum tl_stream_type stype;
1132 unsigned int rb_idx_raw = 0;
1133 unsigned int rb_idx;
1136 /* If we don't have any data yet, wait for packet to be
1137 * submitted. If we already read some packets and there is no
1138 * packet pending return back to user. */
1140 if (!kbasep_tlstream_packet_pending(
1145 if (wait_event_interruptible(
1147 kbasep_tlstream_packet_pending(
1150 copy_len = -ERESTARTSYS;
1155 /* Check if this packet fits into the user buffer.
1156 * If so copy its content. */
1157 rb_idx = rb_idx_raw % PACKET_COUNT;
1158 rb_size = atomic_read(&tl_stream[stype]->buffer[rb_idx].size);
1159 if (rb_size > size - copy_len)
1163 tl_stream[stype]->buffer[rb_idx].data,
1169 /* If the rbi still points to the packet we just processed
1170 * then there was no overflow so we add the copied size to
1171 * copy_len and move rbi on to the next packet
1174 if (atomic_read(&tl_stream[stype]->rbi) == rb_idx_raw) {
1175 copy_len += rb_size;
1176 atomic_inc(&tl_stream[stype]->rbi);
1179 atomic_add(rb_size, &tlstream_bytes_collected);
1180 #endif /* MALI_UNIT_TEST */
1184 mutex_unlock(&tl_reader_lock);
1190 * kbasep_tlstream_poll - poll timeline stream for packets
1191 * @filp: pointer to file structure
1192 * @wait: pointer to poll table
1193 * Return: POLLIN if data can be read without blocking, otherwise zero
1195 static unsigned int kbasep_tlstream_poll(struct file *filp, poll_table *wait)
1197 enum tl_stream_type stream_type;
1198 unsigned int rb_idx;
1200 KBASE_DEBUG_ASSERT(filp);
1201 KBASE_DEBUG_ASSERT(wait);
1203 poll_wait(filp, &tl_event_queue, wait);
1204 if (kbasep_tlstream_packet_pending(&stream_type, &rb_idx))
1210 * kbasep_tlstream_release - release timeline stream descriptor
1211 * @inode: pointer to inode structure
1212 * @filp: pointer to file structure
1214 * Return always return zero
1216 static int kbasep_tlstream_release(struct inode *inode, struct file *filp)
1218 KBASE_DEBUG_ASSERT(inode);
1219 KBASE_DEBUG_ASSERT(filp);
1223 /* Stop autoflush timer before releasing access to streams. */
1224 atomic_set(&autoflush_timer_active, 0);
1225 del_timer_sync(&autoflush_timer);
1227 atomic_set(&kbase_tlstream_enabled, 0);
1232 * kbasep_tlstream_timeline_header - prepare timeline header stream packet
1233 * @stream_type: type of the stream that will carry header data
1234 * @tp_desc: pointer to array with tracepoint descriptors
1235 * @tp_count: number of descriptors in the given array
1237 * Functions fills in information about tracepoints stored in body stream
1238 * associated with this header stream.
1240 static void kbasep_tlstream_timeline_header(
1241 enum tl_stream_type stream_type,
1242 const struct tp_desc *tp_desc,
1245 const u8 tv = SWTRACE_VERSION; /* protocol version */
1246 const u8 ps = sizeof(void *); /* pointer size */
1247 size_t msg_size = sizeof(tv) + sizeof(ps) + sizeof(tp_count);
1250 unsigned long flags;
1253 KBASE_DEBUG_ASSERT(TL_STREAM_TYPE_COUNT > stream_type);
1254 KBASE_DEBUG_ASSERT(tp_desc);
1256 /* Calculate the size of the timeline message. */
1257 for (i = 0; i < tp_count; i++) {
1258 msg_size += sizeof(tp_desc[i].id);
1260 strnlen(tp_desc[i].id_str, STRLEN_MAX) +
1261 sizeof(char) + sizeof(u32);
1263 strnlen(tp_desc[i].name, STRLEN_MAX) +
1264 sizeof(char) + sizeof(u32);
1266 strnlen(tp_desc[i].arg_types, STRLEN_MAX) +
1267 sizeof(char) + sizeof(u32);
1269 strnlen(tp_desc[i].arg_names, STRLEN_MAX) +
1270 sizeof(char) + sizeof(u32);
1273 KBASE_DEBUG_ASSERT(PACKET_SIZE - PACKET_HEADER_SIZE >= msg_size);
1275 buffer = kbasep_tlstream_msgbuf_acquire(stream_type, msg_size, &flags);
1276 KBASE_DEBUG_ASSERT(buffer);
1278 pos = kbasep_tlstream_write_bytes(buffer, pos, &tv, sizeof(tv));
1279 pos = kbasep_tlstream_write_bytes(buffer, pos, &ps, sizeof(ps));
1280 pos = kbasep_tlstream_write_bytes(
1281 buffer, pos, &tp_count, sizeof(tp_count));
1283 for (i = 0; i < tp_count; i++) {
1284 pos = kbasep_tlstream_write_bytes(
1286 &tp_desc[i].id, sizeof(tp_desc[i].id));
1287 pos = kbasep_tlstream_write_string(
1289 tp_desc[i].id_str, msg_size - pos);
1290 pos = kbasep_tlstream_write_string(
1292 tp_desc[i].name, msg_size - pos);
1293 pos = kbasep_tlstream_write_string(
1295 tp_desc[i].arg_types, msg_size - pos);
1296 pos = kbasep_tlstream_write_string(
1298 tp_desc[i].arg_names, msg_size - pos);
1301 KBASE_DEBUG_ASSERT(msg_size == pos);
1303 kbasep_tlstream_msgbuf_release(stream_type, flags);
1305 /* We don't expect any more data to be read in this stream.
1306 * As header stream must be read before its associated body stream,
1307 * make this packet visible to the user straightaway. */
1308 kbasep_tlstream_flush_stream(stream_type);
1311 /*****************************************************************************/
1313 int kbase_tlstream_init(void)
1315 enum tl_stream_type i;
1317 /* Prepare stream structures. */
1318 for (i = 0; i < TL_STREAM_TYPE_COUNT; i++) {
1319 tl_stream[i] = kmalloc(sizeof(**tl_stream), GFP_KERNEL);
1322 kbasep_timeline_stream_init(tl_stream[i], i);
1324 if (TL_STREAM_TYPE_COUNT > i) {
1325 for (; i > 0; i--) {
1326 kbasep_timeline_stream_term(tl_stream[i - 1]);
1327 kfree(tl_stream[i - 1]);
1332 /* Initialize autoflush timer. */
1333 atomic_set(&autoflush_timer_active, 0);
1334 setup_timer(&autoflush_timer,
1335 kbasep_tlstream_autoflush_timer_callback,
1341 void kbase_tlstream_term(void)
1343 enum tl_stream_type i;
1345 for (i = 0; i < TL_STREAM_TYPE_COUNT; i++) {
1346 kbasep_timeline_stream_term(tl_stream[i]);
1347 kfree(tl_stream[i]);
1351 int kbase_tlstream_acquire(struct kbase_context *kctx, int *fd, u32 flags)
1353 u32 tlstream_enabled = TLSTREAM_ENABLED | flags;
1355 if (0 == atomic_cmpxchg(&kbase_tlstream_enabled, 0, tlstream_enabled)) {
1358 *fd = anon_inode_getfd(
1360 &kbasep_tlstream_fops,
1362 O_RDONLY | O_CLOEXEC);
1364 atomic_set(&kbase_tlstream_enabled, 0);
1368 /* Reset and initialize header streams. */
1369 kbasep_timeline_stream_reset(
1370 tl_stream[TL_STREAM_TYPE_OBJ_HEADER]);
1371 kbasep_timeline_stream_reset(
1372 tl_stream[TL_STREAM_TYPE_OBJ_SUMMARY]);
1373 kbasep_timeline_stream_reset(
1374 tl_stream[TL_STREAM_TYPE_AUX_HEADER]);
1375 kbasep_tlstream_timeline_header(
1376 TL_STREAM_TYPE_OBJ_HEADER,
1378 ARRAY_SIZE(tp_desc_obj));
1379 kbasep_tlstream_timeline_header(
1380 TL_STREAM_TYPE_AUX_HEADER,
1382 ARRAY_SIZE(tp_desc_aux));
1384 /* Start autoflush timer. */
1385 atomic_set(&autoflush_timer_active, 1);
1388 jiffies + msecs_to_jiffies(AUTOFLUSH_INTERVAL));
1398 void kbase_tlstream_flush_streams(void)
1400 enum tl_stream_type stype;
1402 for (stype = 0; stype < TL_STREAM_TYPE_COUNT; stype++)
1403 kbasep_tlstream_flush_stream(stype);
1406 void kbase_tlstream_reset_body_streams(void)
1408 kbasep_timeline_stream_reset(
1409 tl_stream[TL_STREAM_TYPE_OBJ]);
1410 kbasep_timeline_stream_reset(
1411 tl_stream[TL_STREAM_TYPE_AUX]);
1415 void kbase_tlstream_stats(u32 *bytes_collected, u32 *bytes_generated)
1417 KBASE_DEBUG_ASSERT(bytes_collected);
1418 KBASE_DEBUG_ASSERT(bytes_generated);
1419 *bytes_collected = atomic_read(&tlstream_bytes_collected);
1420 *bytes_generated = atomic_read(&tlstream_bytes_generated);
1422 #endif /* MALI_UNIT_TEST */
1424 /*****************************************************************************/
1426 void __kbase_tlstream_tl_summary_new_ctx(void *context, u32 nr, u32 tgid)
1428 const u32 msg_id = KBASE_TL_NEW_CTX;
1429 const size_t msg_size =
1430 sizeof(msg_id) + sizeof(u64) + sizeof(context) + sizeof(nr) +
1432 unsigned long flags;
1436 buffer = kbasep_tlstream_msgbuf_acquire(
1437 TL_STREAM_TYPE_OBJ_SUMMARY,
1439 KBASE_DEBUG_ASSERT(buffer);
1441 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1442 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1443 pos = kbasep_tlstream_write_bytes(
1444 buffer, pos, &context, sizeof(context));
1445 pos = kbasep_tlstream_write_bytes(
1446 buffer, pos, &nr, sizeof(nr));
1447 pos = kbasep_tlstream_write_bytes(
1448 buffer, pos, &tgid, sizeof(tgid));
1450 KBASE_DEBUG_ASSERT(msg_size == pos);
1452 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
1455 void __kbase_tlstream_tl_summary_new_gpu(void *gpu, u32 id, u32 core_count)
1457 const u32 msg_id = KBASE_TL_NEW_GPU;
1458 const size_t msg_size =
1459 sizeof(msg_id) + sizeof(u64) + sizeof(gpu) + sizeof(id) +
1461 unsigned long flags;
1465 buffer = kbasep_tlstream_msgbuf_acquire(
1466 TL_STREAM_TYPE_OBJ_SUMMARY,
1468 KBASE_DEBUG_ASSERT(buffer);
1470 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1471 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1472 pos = kbasep_tlstream_write_bytes(
1473 buffer, pos, &gpu, sizeof(gpu));
1474 pos = kbasep_tlstream_write_bytes(
1475 buffer, pos, &id, sizeof(id));
1476 pos = kbasep_tlstream_write_bytes(
1477 buffer, pos, &core_count, sizeof(core_count));
1478 KBASE_DEBUG_ASSERT(msg_size == pos);
1480 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
1483 void __kbase_tlstream_tl_summary_new_lpu(void *lpu, u32 nr, u32 fn)
1485 const u32 msg_id = KBASE_TL_NEW_LPU;
1486 const size_t msg_size =
1487 sizeof(msg_id) + sizeof(u64) + sizeof(lpu) + sizeof(nr) +
1489 unsigned long flags;
1493 buffer = kbasep_tlstream_msgbuf_acquire(
1494 TL_STREAM_TYPE_OBJ_SUMMARY,
1496 KBASE_DEBUG_ASSERT(buffer);
1498 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1499 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1500 pos = kbasep_tlstream_write_bytes(
1501 buffer, pos, &lpu, sizeof(lpu));
1502 pos = kbasep_tlstream_write_bytes(
1503 buffer, pos, &nr, sizeof(nr));
1504 pos = kbasep_tlstream_write_bytes(
1505 buffer, pos, &fn, sizeof(fn));
1506 KBASE_DEBUG_ASSERT(msg_size == pos);
1508 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
1511 void __kbase_tlstream_tl_summary_lifelink_lpu_gpu(void *lpu, void *gpu)
1513 const u32 msg_id = KBASE_TL_LIFELINK_LPU_GPU;
1514 const size_t msg_size =
1515 sizeof(msg_id) + sizeof(u64) + sizeof(lpu) + sizeof(gpu);
1516 unsigned long flags;
1520 buffer = kbasep_tlstream_msgbuf_acquire(
1521 TL_STREAM_TYPE_OBJ_SUMMARY,
1523 KBASE_DEBUG_ASSERT(buffer);
1525 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1526 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1527 pos = kbasep_tlstream_write_bytes(
1528 buffer, pos, &lpu, sizeof(lpu));
1529 pos = kbasep_tlstream_write_bytes(
1530 buffer, pos, &gpu, sizeof(gpu));
1531 KBASE_DEBUG_ASSERT(msg_size == pos);
1533 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
1536 void __kbase_tlstream_tl_summary_new_as(void *as, u32 nr)
1538 const u32 msg_id = KBASE_TL_NEW_AS;
1539 const size_t msg_size =
1540 sizeof(msg_id) + sizeof(u64) + sizeof(as) + sizeof(nr);
1541 unsigned long flags;
1545 buffer = kbasep_tlstream_msgbuf_acquire(
1546 TL_STREAM_TYPE_OBJ_SUMMARY,
1548 KBASE_DEBUG_ASSERT(buffer);
1550 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1551 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1552 pos = kbasep_tlstream_write_bytes(
1553 buffer, pos, &as, sizeof(as));
1554 pos = kbasep_tlstream_write_bytes(
1555 buffer, pos, &nr, sizeof(nr));
1556 KBASE_DEBUG_ASSERT(msg_size == pos);
1558 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
1561 void __kbase_tlstream_tl_summary_lifelink_as_gpu(void *as, void *gpu)
1563 const u32 msg_id = KBASE_TL_LIFELINK_AS_GPU;
1564 const size_t msg_size =
1565 sizeof(msg_id) + sizeof(u64) + sizeof(as) + sizeof(gpu);
1566 unsigned long flags;
1570 buffer = kbasep_tlstream_msgbuf_acquire(
1571 TL_STREAM_TYPE_OBJ_SUMMARY,
1573 KBASE_DEBUG_ASSERT(buffer);
1575 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1576 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1577 pos = kbasep_tlstream_write_bytes(
1578 buffer, pos, &as, sizeof(as));
1579 pos = kbasep_tlstream_write_bytes(
1580 buffer, pos, &gpu, sizeof(gpu));
1581 KBASE_DEBUG_ASSERT(msg_size == pos);
1583 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
1586 /*****************************************************************************/
1588 void __kbase_tlstream_tl_new_ctx(void *context, u32 nr, u32 tgid)
1590 const u32 msg_id = KBASE_TL_NEW_CTX;
1591 const size_t msg_size =
1592 sizeof(msg_id) + sizeof(u64) + sizeof(context) + sizeof(nr) +
1594 unsigned long flags;
1598 buffer = kbasep_tlstream_msgbuf_acquire(
1601 KBASE_DEBUG_ASSERT(buffer);
1603 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1604 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1605 pos = kbasep_tlstream_write_bytes(
1606 buffer, pos, &context, sizeof(context));
1607 pos = kbasep_tlstream_write_bytes(
1608 buffer, pos, &nr, sizeof(nr));
1609 pos = kbasep_tlstream_write_bytes(
1610 buffer, pos, &tgid, sizeof(tgid));
1611 KBASE_DEBUG_ASSERT(msg_size == pos);
1613 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1616 void __kbase_tlstream_tl_new_atom(void *atom, u32 nr)
1618 const u32 msg_id = KBASE_TL_NEW_ATOM;
1619 const size_t msg_size = sizeof(msg_id) + sizeof(u64) + sizeof(atom) +
1621 unsigned long flags;
1625 buffer = kbasep_tlstream_msgbuf_acquire(
1628 KBASE_DEBUG_ASSERT(buffer);
1630 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1631 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1632 pos = kbasep_tlstream_write_bytes(
1633 buffer, pos, &atom, sizeof(atom));
1634 pos = kbasep_tlstream_write_bytes(
1635 buffer, pos, &nr, sizeof(nr));
1636 KBASE_DEBUG_ASSERT(msg_size == pos);
1638 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1641 void __kbase_tlstream_tl_del_ctx(void *context)
1643 const u32 msg_id = KBASE_TL_DEL_CTX;
1644 const size_t msg_size =
1645 sizeof(msg_id) + sizeof(u64) + sizeof(context);
1646 unsigned long flags;
1650 buffer = kbasep_tlstream_msgbuf_acquire(
1653 KBASE_DEBUG_ASSERT(buffer);
1655 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1656 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1657 pos = kbasep_tlstream_write_bytes(
1658 buffer, pos, &context, sizeof(context));
1659 KBASE_DEBUG_ASSERT(msg_size == pos);
1661 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1664 void __kbase_tlstream_tl_del_atom(void *atom)
1666 const u32 msg_id = KBASE_TL_DEL_ATOM;
1667 const size_t msg_size =
1668 sizeof(msg_id) + sizeof(u64) + sizeof(atom);
1669 unsigned long flags;
1673 buffer = kbasep_tlstream_msgbuf_acquire(
1676 KBASE_DEBUG_ASSERT(buffer);
1678 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1679 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1680 pos = kbasep_tlstream_write_bytes(
1681 buffer, pos, &atom, sizeof(atom));
1682 KBASE_DEBUG_ASSERT(msg_size == pos);
1684 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1687 void __kbase_tlstream_tl_ret_ctx_lpu(void *context, void *lpu)
1689 const u32 msg_id = KBASE_TL_RET_CTX_LPU;
1690 const size_t msg_size =
1691 sizeof(msg_id) + sizeof(u64) + sizeof(context) + sizeof(lpu);
1692 unsigned long flags;
1696 buffer = kbasep_tlstream_msgbuf_acquire(
1699 KBASE_DEBUG_ASSERT(buffer);
1701 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1702 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1703 pos = kbasep_tlstream_write_bytes(
1704 buffer, pos, &context, sizeof(context));
1705 pos = kbasep_tlstream_write_bytes(
1706 buffer, pos, &lpu, sizeof(lpu));
1707 KBASE_DEBUG_ASSERT(msg_size == pos);
1709 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1712 void __kbase_tlstream_tl_ret_atom_ctx(void *atom, void *context)
1714 const u32 msg_id = KBASE_TL_RET_ATOM_CTX;
1715 const size_t msg_size =
1716 sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(context);
1717 unsigned long flags;
1721 buffer = kbasep_tlstream_msgbuf_acquire(
1724 KBASE_DEBUG_ASSERT(buffer);
1726 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1727 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1728 pos = kbasep_tlstream_write_bytes(
1729 buffer, pos, &atom, sizeof(atom));
1730 pos = kbasep_tlstream_write_bytes(
1731 buffer, pos, &context, sizeof(context));
1732 KBASE_DEBUG_ASSERT(msg_size == pos);
1734 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1737 void __kbase_tlstream_tl_ret_atom_lpu(
1738 void *atom, void *lpu, const char *attrib_match_list)
1740 const u32 msg_id = KBASE_TL_RET_ATOM_LPU;
1741 const size_t msg_s0 = sizeof(u32) + sizeof(char) +
1742 strnlen(attrib_match_list, STRLEN_MAX);
1743 const size_t msg_size =
1744 sizeof(msg_id) + sizeof(u64) +
1745 sizeof(atom) + sizeof(lpu) + msg_s0;
1746 unsigned long flags;
1750 buffer = kbasep_tlstream_msgbuf_acquire(
1753 KBASE_DEBUG_ASSERT(buffer);
1755 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1756 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1757 pos = kbasep_tlstream_write_bytes(
1758 buffer, pos, &atom, sizeof(atom));
1759 pos = kbasep_tlstream_write_bytes(
1760 buffer, pos, &lpu, sizeof(lpu));
1761 pos = kbasep_tlstream_write_string(
1762 buffer, pos, attrib_match_list, msg_s0);
1763 KBASE_DEBUG_ASSERT(msg_size == pos);
1765 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1768 void __kbase_tlstream_tl_nret_ctx_lpu(void *context, void *lpu)
1770 const u32 msg_id = KBASE_TL_NRET_CTX_LPU;
1771 const size_t msg_size =
1772 sizeof(msg_id) + sizeof(u64) + sizeof(context) + sizeof(lpu);
1773 unsigned long flags;
1777 buffer = kbasep_tlstream_msgbuf_acquire(
1780 KBASE_DEBUG_ASSERT(buffer);
1782 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1783 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1784 pos = kbasep_tlstream_write_bytes(
1785 buffer, pos, &context, sizeof(context));
1786 pos = kbasep_tlstream_write_bytes(
1787 buffer, pos, &lpu, sizeof(lpu));
1788 KBASE_DEBUG_ASSERT(msg_size == pos);
1790 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1793 void __kbase_tlstream_tl_nret_atom_ctx(void *atom, void *context)
1795 const u32 msg_id = KBASE_TL_NRET_ATOM_CTX;
1796 const size_t msg_size =
1797 sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(context);
1798 unsigned long flags;
1802 buffer = kbasep_tlstream_msgbuf_acquire(
1805 KBASE_DEBUG_ASSERT(buffer);
1807 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1808 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1809 pos = kbasep_tlstream_write_bytes(
1810 buffer, pos, &atom, sizeof(atom));
1811 pos = kbasep_tlstream_write_bytes(
1812 buffer, pos, &context, sizeof(context));
1813 KBASE_DEBUG_ASSERT(msg_size == pos);
1815 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1818 void __kbase_tlstream_tl_dep_atom_atom(void *atom1, void *atom2)
1820 const u32 msg_id = KBASE_TL_DEP_ATOM_ATOM;
1821 const size_t msg_size =
1822 sizeof(msg_id) + sizeof(u64) + sizeof(atom1) + sizeof(atom2);
1823 unsigned long flags;
1827 buffer = kbasep_tlstream_msgbuf_acquire(
1830 KBASE_DEBUG_ASSERT(buffer);
1832 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1833 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1834 pos = kbasep_tlstream_write_bytes(
1835 buffer, pos, &atom1, sizeof(atom1));
1836 pos = kbasep_tlstream_write_bytes(
1837 buffer, pos, &atom2, sizeof(atom2));
1838 KBASE_DEBUG_ASSERT(msg_size == pos);
1840 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1843 void __kbase_tlstream_tl_ndep_atom_atom(void *atom1, void *atom2)
1845 const u32 msg_id = KBASE_TL_NDEP_ATOM_ATOM;
1846 const size_t msg_size =
1847 sizeof(msg_id) + sizeof(u64) + sizeof(atom1) + sizeof(atom2);
1848 unsigned long flags;
1852 buffer = kbasep_tlstream_msgbuf_acquire(
1855 KBASE_DEBUG_ASSERT(buffer);
1857 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1858 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1859 pos = kbasep_tlstream_write_bytes(
1860 buffer, pos, &atom1, sizeof(atom1));
1861 pos = kbasep_tlstream_write_bytes(
1862 buffer, pos, &atom2, sizeof(atom2));
1863 KBASE_DEBUG_ASSERT(msg_size == pos);
1865 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1868 void __kbase_tlstream_tl_rdep_atom_atom(void *atom1, void *atom2)
1870 const u32 msg_id = KBASE_TL_RDEP_ATOM_ATOM;
1871 const size_t msg_size =
1872 sizeof(msg_id) + sizeof(u64) + sizeof(atom1) + sizeof(atom2);
1873 unsigned long flags;
1877 buffer = kbasep_tlstream_msgbuf_acquire(
1880 KBASE_DEBUG_ASSERT(buffer);
1882 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1883 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1884 pos = kbasep_tlstream_write_bytes(
1885 buffer, pos, &atom1, sizeof(atom1));
1886 pos = kbasep_tlstream_write_bytes(
1887 buffer, pos, &atom2, sizeof(atom2));
1888 KBASE_DEBUG_ASSERT(msg_size == pos);
1890 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1893 void __kbase_tlstream_tl_nret_atom_lpu(void *atom, void *lpu)
1895 const u32 msg_id = KBASE_TL_NRET_ATOM_LPU;
1896 const size_t msg_size =
1897 sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(lpu);
1898 unsigned long flags;
1902 buffer = kbasep_tlstream_msgbuf_acquire(
1905 KBASE_DEBUG_ASSERT(buffer);
1907 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1908 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1909 pos = kbasep_tlstream_write_bytes(
1910 buffer, pos, &atom, sizeof(atom));
1911 pos = kbasep_tlstream_write_bytes(
1912 buffer, pos, &lpu, sizeof(lpu));
1913 KBASE_DEBUG_ASSERT(msg_size == pos);
1915 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1918 void __kbase_tlstream_tl_ret_as_ctx(void *as, void *ctx)
1920 const u32 msg_id = KBASE_TL_RET_AS_CTX;
1921 const size_t msg_size =
1922 sizeof(msg_id) + sizeof(u64) + sizeof(as) + sizeof(ctx);
1923 unsigned long flags;
1927 buffer = kbasep_tlstream_msgbuf_acquire(
1930 KBASE_DEBUG_ASSERT(buffer);
1932 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1933 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1934 pos = kbasep_tlstream_write_bytes(
1935 buffer, pos, &as, sizeof(as));
1936 pos = kbasep_tlstream_write_bytes(
1937 buffer, pos, &ctx, sizeof(ctx));
1938 KBASE_DEBUG_ASSERT(msg_size == pos);
1940 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1943 void __kbase_tlstream_tl_nret_as_ctx(void *as, void *ctx)
1945 const u32 msg_id = KBASE_TL_NRET_AS_CTX;
1946 const size_t msg_size =
1947 sizeof(msg_id) + sizeof(u64) + sizeof(as) + sizeof(ctx);
1948 unsigned long flags;
1952 buffer = kbasep_tlstream_msgbuf_acquire(
1955 KBASE_DEBUG_ASSERT(buffer);
1957 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1958 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1959 pos = kbasep_tlstream_write_bytes(
1960 buffer, pos, &as, sizeof(as));
1961 pos = kbasep_tlstream_write_bytes(
1962 buffer, pos, &ctx, sizeof(ctx));
1963 KBASE_DEBUG_ASSERT(msg_size == pos);
1965 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1968 void __kbase_tlstream_tl_ret_atom_as(void *atom, void *as)
1970 const u32 msg_id = KBASE_TL_RET_ATOM_AS;
1971 const size_t msg_size =
1972 sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(as);
1973 unsigned long flags;
1977 buffer = kbasep_tlstream_msgbuf_acquire(
1980 KBASE_DEBUG_ASSERT(buffer);
1982 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1983 pos = kbasep_tlstream_write_timestamp(buffer, pos);
1984 pos = kbasep_tlstream_write_bytes(
1985 buffer, pos, &atom, sizeof(atom));
1986 pos = kbasep_tlstream_write_bytes(
1987 buffer, pos, &as, sizeof(as));
1988 KBASE_DEBUG_ASSERT(msg_size == pos);
1990 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1993 void __kbase_tlstream_tl_nret_atom_as(void *atom, void *as)
1995 const u32 msg_id = KBASE_TL_NRET_ATOM_AS;
1996 const size_t msg_size =
1997 sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(as);
1998 unsigned long flags;
2002 buffer = kbasep_tlstream_msgbuf_acquire(
2005 KBASE_DEBUG_ASSERT(buffer);
2007 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2008 pos = kbasep_tlstream_write_timestamp(buffer, pos);
2009 pos = kbasep_tlstream_write_bytes(
2010 buffer, pos, &atom, sizeof(atom));
2011 pos = kbasep_tlstream_write_bytes(
2012 buffer, pos, &as, sizeof(as));
2013 KBASE_DEBUG_ASSERT(msg_size == pos);
2015 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2018 void __kbase_tlstream_tl_attrib_atom_config(
2019 void *atom, u64 jd, u64 affinity, u32 config)
2021 const u32 msg_id = KBASE_TL_ATTRIB_ATOM_CONFIG;
2022 const size_t msg_size =
2023 sizeof(msg_id) + sizeof(u64) + sizeof(atom) +
2024 sizeof(jd) + sizeof(affinity) + sizeof(config);
2025 unsigned long flags;
2029 buffer = kbasep_tlstream_msgbuf_acquire(
2032 KBASE_DEBUG_ASSERT(buffer);
2034 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2035 pos = kbasep_tlstream_write_timestamp(buffer, pos);
2036 pos = kbasep_tlstream_write_bytes(
2037 buffer, pos, &atom, sizeof(atom));
2038 pos = kbasep_tlstream_write_bytes(
2039 buffer, pos, &jd, sizeof(jd));
2040 pos = kbasep_tlstream_write_bytes(
2041 buffer, pos, &affinity, sizeof(affinity));
2042 pos = kbasep_tlstream_write_bytes(
2043 buffer, pos, &config, sizeof(config));
2044 KBASE_DEBUG_ASSERT(msg_size == pos);
2046 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2049 void __kbase_tlstream_tl_attrib_atom_priority(void *atom, u32 prio)
2051 const u32 msg_id = KBASE_TL_ATTRIB_ATOM_PRIORITY;
2052 const size_t msg_size =
2053 sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(prio);
2054 unsigned long flags;
2058 buffer = kbasep_tlstream_msgbuf_acquire(
2061 KBASE_DEBUG_ASSERT(buffer);
2063 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2064 pos = kbasep_tlstream_write_timestamp(buffer, pos);
2065 pos = kbasep_tlstream_write_bytes(
2066 buffer, pos, &atom, sizeof(atom));
2067 pos = kbasep_tlstream_write_bytes(
2068 buffer, pos, &prio, sizeof(prio));
2069 KBASE_DEBUG_ASSERT(msg_size == pos);
2071 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2074 void __kbase_tlstream_tl_attrib_atom_state(void *atom, u32 state)
2076 const u32 msg_id = KBASE_TL_ATTRIB_ATOM_STATE;
2077 const size_t msg_size =
2078 sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(state);
2079 unsigned long flags;
2083 buffer = kbasep_tlstream_msgbuf_acquire(
2086 KBASE_DEBUG_ASSERT(buffer);
2088 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2089 pos = kbasep_tlstream_write_timestamp(buffer, pos);
2090 pos = kbasep_tlstream_write_bytes(
2091 buffer, pos, &atom, sizeof(atom));
2092 pos = kbasep_tlstream_write_bytes(
2093 buffer, pos, &state, sizeof(state));
2094 KBASE_DEBUG_ASSERT(msg_size == pos);
2096 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2099 void __kbase_tlstream_tl_attrib_atom_priority_change(void *atom)
2101 const u32 msg_id = KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE;
2102 const size_t msg_size =
2103 sizeof(msg_id) + sizeof(u64) + sizeof(atom);
2104 unsigned long flags;
2108 buffer = kbasep_tlstream_msgbuf_acquire(
2111 KBASE_DEBUG_ASSERT(buffer);
2113 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2114 pos = kbasep_tlstream_write_timestamp(buffer, pos);
2115 pos = kbasep_tlstream_write_bytes(
2116 buffer, pos, &atom, sizeof(atom));
2117 KBASE_DEBUG_ASSERT(msg_size == pos);
2119 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2122 void __kbase_tlstream_tl_attrib_as_config(
2123 void *as, u64 transtab, u64 memattr, u64 transcfg)
2125 const u32 msg_id = KBASE_TL_ATTRIB_AS_CONFIG;
2126 const size_t msg_size =
2127 sizeof(msg_id) + sizeof(u64) + sizeof(as) +
2128 sizeof(transtab) + sizeof(memattr) + sizeof(transcfg);
2129 unsigned long flags;
2133 buffer = kbasep_tlstream_msgbuf_acquire(
2136 KBASE_DEBUG_ASSERT(buffer);
2138 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2139 pos = kbasep_tlstream_write_timestamp(buffer, pos);
2140 pos = kbasep_tlstream_write_bytes(
2141 buffer, pos, &as, sizeof(as));
2142 pos = kbasep_tlstream_write_bytes(
2143 buffer, pos, &transtab, sizeof(transtab));
2144 pos = kbasep_tlstream_write_bytes(
2145 buffer, pos, &memattr, sizeof(memattr));
2146 pos = kbasep_tlstream_write_bytes(
2147 buffer, pos, &transcfg, sizeof(transcfg));
2148 KBASE_DEBUG_ASSERT(msg_size == pos);
2150 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2153 void __kbase_tlstream_tl_event_lpu_softstop(void *lpu)
2155 const u32 msg_id = KBASE_TL_EVENT_LPU_SOFTSTOP;
2156 const size_t msg_size =
2157 sizeof(msg_id) + sizeof(u64) + sizeof(lpu);
2158 unsigned long flags;
2162 buffer = kbasep_tlstream_msgbuf_acquire(
2165 KBASE_DEBUG_ASSERT(buffer);
2167 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2168 pos = kbasep_tlstream_write_timestamp(buffer, pos);
2169 pos = kbasep_tlstream_write_bytes(
2170 buffer, pos, &lpu, sizeof(lpu));
2171 KBASE_DEBUG_ASSERT(msg_size == pos);
2173 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2176 void __kbase_tlstream_tl_event_atom_softstop_ex(void *atom)
2178 const u32 msg_id = KBASE_TL_EVENT_ATOM_SOFTSTOP_EX;
2179 const size_t msg_size =
2180 sizeof(msg_id) + sizeof(u64) + sizeof(atom);
2181 unsigned long flags;
2185 buffer = kbasep_tlstream_msgbuf_acquire(
2188 KBASE_DEBUG_ASSERT(buffer);
2190 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2191 pos = kbasep_tlstream_write_timestamp(buffer, pos);
2192 pos = kbasep_tlstream_write_bytes(
2193 buffer, pos, &atom, sizeof(atom));
2194 KBASE_DEBUG_ASSERT(msg_size == pos);
2196 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2199 void __kbase_tlstream_tl_event_atom_softstop_issue(void *atom)
2201 const u32 msg_id = KBASE_TL_EVENT_ATOM_SOFTSTOP_ISSUE;
2202 const size_t msg_size =
2203 sizeof(msg_id) + sizeof(u64) + sizeof(atom);
2204 unsigned long flags;
2208 buffer = kbasep_tlstream_msgbuf_acquire(
2211 KBASE_DEBUG_ASSERT(buffer);
2213 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2214 pos = kbasep_tlstream_write_timestamp(buffer, pos);
2215 pos = kbasep_tlstream_write_bytes(
2216 buffer, pos, &atom, sizeof(atom));
2217 KBASE_DEBUG_ASSERT(msg_size == pos);
2219 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2222 void __kbase_tlstream_jd_gpu_soft_reset(void *gpu)
2224 const u32 msg_id = KBASE_JD_GPU_SOFT_RESET;
2225 const size_t msg_size =
2226 sizeof(msg_id) + sizeof(u64) + sizeof(gpu);
2227 unsigned long flags;
2231 buffer = kbasep_tlstream_msgbuf_acquire(
2234 KBASE_DEBUG_ASSERT(buffer);
2236 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2237 pos = kbasep_tlstream_write_timestamp(buffer, pos);
2238 pos = kbasep_tlstream_write_bytes(
2239 buffer, pos, &gpu, sizeof(gpu));
2240 KBASE_DEBUG_ASSERT(msg_size == pos);
2242 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2245 /*****************************************************************************/
2247 void __kbase_tlstream_aux_pm_state(u32 core_type, u64 state)
2249 const u32 msg_id = KBASE_AUX_PM_STATE;
2250 const size_t msg_size =
2251 sizeof(msg_id) + sizeof(u64) + sizeof(core_type) +
2253 unsigned long flags;
2257 buffer = kbasep_tlstream_msgbuf_acquire(
2260 KBASE_DEBUG_ASSERT(buffer);
2262 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2263 pos = kbasep_tlstream_write_timestamp(buffer, pos);
2264 pos = kbasep_tlstream_write_bytes(
2265 buffer, pos, &core_type, sizeof(core_type));
2266 pos = kbasep_tlstream_write_bytes(buffer, pos, &state, sizeof(state));
2267 KBASE_DEBUG_ASSERT(msg_size == pos);
2269 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
2272 void __kbase_tlstream_aux_pagefault(u32 ctx_nr, u64 page_count_change)
2274 const u32 msg_id = KBASE_AUX_PAGEFAULT;
2275 const size_t msg_size =
2276 sizeof(msg_id) + sizeof(u64) + sizeof(ctx_nr) +
2277 sizeof(page_count_change);
2278 unsigned long flags;
2282 buffer = kbasep_tlstream_msgbuf_acquire(
2283 TL_STREAM_TYPE_AUX, msg_size, &flags);
2284 KBASE_DEBUG_ASSERT(buffer);
2286 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2287 pos = kbasep_tlstream_write_timestamp(buffer, pos);
2288 pos = kbasep_tlstream_write_bytes(buffer, pos, &ctx_nr, sizeof(ctx_nr));
2289 pos = kbasep_tlstream_write_bytes(
2291 &page_count_change, sizeof(page_count_change));
2292 KBASE_DEBUG_ASSERT(msg_size == pos);
2294 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
2297 void __kbase_tlstream_aux_pagesalloc(u32 ctx_nr, u64 page_count)
2299 const u32 msg_id = KBASE_AUX_PAGESALLOC;
2300 const size_t msg_size =
2301 sizeof(msg_id) + sizeof(u64) + sizeof(ctx_nr) +
2303 unsigned long flags;
2307 buffer = kbasep_tlstream_msgbuf_acquire(
2308 TL_STREAM_TYPE_AUX, msg_size, &flags);
2309 KBASE_DEBUG_ASSERT(buffer);
2311 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2312 pos = kbasep_tlstream_write_timestamp(buffer, pos);
2313 pos = kbasep_tlstream_write_bytes(buffer, pos, &ctx_nr, sizeof(ctx_nr));
2314 pos = kbasep_tlstream_write_bytes(
2315 buffer, pos, &page_count, sizeof(page_count));
2316 KBASE_DEBUG_ASSERT(msg_size == pos);
2318 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
2321 void __kbase_tlstream_aux_devfreq_target(u64 target_freq)
2323 const u32 msg_id = KBASE_AUX_DEVFREQ_TARGET;
2324 const size_t msg_size =
2325 sizeof(msg_id) + sizeof(u64) + sizeof(target_freq);
2326 unsigned long flags;
2330 buffer = kbasep_tlstream_msgbuf_acquire(
2331 TL_STREAM_TYPE_AUX, msg_size, &flags);
2332 KBASE_DEBUG_ASSERT(buffer);
2334 pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2335 pos = kbasep_tlstream_write_timestamp(buffer, pos);
2336 pos = kbasep_tlstream_write_bytes(
2337 buffer, pos, &target_freq, sizeof(target_freq));
2338 KBASE_DEBUG_ASSERT(msg_size == pos);
2340 kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);