1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun * (C) COPYRIGHT 2015-2017 ARM Limited. All rights reserved.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * This program is free software and is provided to you under the terms of the
6*4882a593Smuzhiyun * GNU General Public License version 2 as published by the Free Software
7*4882a593Smuzhiyun * Foundation, and any use by you of this program is subject to the terms
8*4882a593Smuzhiyun * of such GNU licence.
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * A copy of the licence is included with the program, and can also be obtained
11*4882a593Smuzhiyun * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
12*4882a593Smuzhiyun * Boston, MA 02110-1301, USA.
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun */
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #include <linux/anon_inodes.h>
19*4882a593Smuzhiyun #include <linux/atomic.h>
20*4882a593Smuzhiyun #include <linux/file.h>
21*4882a593Smuzhiyun #include <linux/mutex.h>
22*4882a593Smuzhiyun #include <linux/poll.h>
23*4882a593Smuzhiyun #include <linux/spinlock.h>
24*4882a593Smuzhiyun #include <linux/string.h>
25*4882a593Smuzhiyun #include <linux/stringify.h>
26*4882a593Smuzhiyun #include <linux/timer.h>
27*4882a593Smuzhiyun #include <linux/wait.h>
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun #include <mali_kbase.h>
30*4882a593Smuzhiyun #include <mali_kbase_jm.h>
31*4882a593Smuzhiyun #include <mali_kbase_tlstream.h>
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun /*****************************************************************************/
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun /* The version of swtrace protocol used in timeline stream. */
36*4882a593Smuzhiyun #define SWTRACE_VERSION 3
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun /* The maximum expected length of string in tracepoint descriptor. */
39*4882a593Smuzhiyun #define STRLEN_MAX 64 /* bytes */
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun /* The number of nanoseconds in a second. */
42*4882a593Smuzhiyun #define NSECS_IN_SEC 1000000000ull /* ns */
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun /* The period of autoflush checker execution in milliseconds. */
45*4882a593Smuzhiyun #define AUTOFLUSH_INTERVAL 1000 /* ms */
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun /* The maximum size of a single packet used by timeline. */
48*4882a593Smuzhiyun #define PACKET_SIZE 4096 /* bytes */
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun /* The number of packets used by one timeline stream. */
51*4882a593Smuzhiyun #define PACKET_COUNT 16
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun /* The number of bytes reserved for packet header.
54*4882a593Smuzhiyun * These value must be defined according to MIPE documentation. */
55*4882a593Smuzhiyun #define PACKET_HEADER_SIZE 8 /* bytes */
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun /* The number of bytes reserved for packet sequence number.
58*4882a593Smuzhiyun * These value must be defined according to MIPE documentation. */
59*4882a593Smuzhiyun #define PACKET_NUMBER_SIZE 4 /* bytes */
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun /* Packet header - first word.
62*4882a593Smuzhiyun * These values must be defined according to MIPE documentation. */
63*4882a593Smuzhiyun #define PACKET_STREAMID_POS 0
64*4882a593Smuzhiyun #define PACKET_STREAMID_LEN 8
65*4882a593Smuzhiyun #define PACKET_RSVD1_POS (PACKET_STREAMID_POS + PACKET_STREAMID_LEN)
66*4882a593Smuzhiyun #define PACKET_RSVD1_LEN 8
67*4882a593Smuzhiyun #define PACKET_TYPE_POS (PACKET_RSVD1_POS + PACKET_RSVD1_LEN)
68*4882a593Smuzhiyun #define PACKET_TYPE_LEN 3
69*4882a593Smuzhiyun #define PACKET_CLASS_POS (PACKET_TYPE_POS + PACKET_TYPE_LEN)
70*4882a593Smuzhiyun #define PACKET_CLASS_LEN 7
71*4882a593Smuzhiyun #define PACKET_FAMILY_POS (PACKET_CLASS_POS + PACKET_CLASS_LEN)
72*4882a593Smuzhiyun #define PACKET_FAMILY_LEN 6
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun /* Packet header - second word
75*4882a593Smuzhiyun * These values must be defined according to MIPE documentation. */
76*4882a593Smuzhiyun #define PACKET_LENGTH_POS 0
77*4882a593Smuzhiyun #define PACKET_LENGTH_LEN 24
78*4882a593Smuzhiyun #define PACKET_SEQBIT_POS (PACKET_LENGTH_POS + PACKET_LENGTH_LEN)
79*4882a593Smuzhiyun #define PACKET_SEQBIT_LEN 1
80*4882a593Smuzhiyun #define PACKET_RSVD2_POS (PACKET_SEQBIT_POS + PACKET_SEQBIT_LEN)
81*4882a593Smuzhiyun #define PACKET_RSVD2_LEN 7
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun /* Types of streams generated by timeline.
84*4882a593Smuzhiyun * Order is significant! Header streams must precede respective body streams. */
85*4882a593Smuzhiyun enum tl_stream_type {
86*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ_HEADER,
87*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ_SUMMARY,
88*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
89*4882a593Smuzhiyun TL_STREAM_TYPE_AUX_HEADER,
90*4882a593Smuzhiyun TL_STREAM_TYPE_AUX,
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun TL_STREAM_TYPE_COUNT
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun /* Timeline packet family ids.
96*4882a593Smuzhiyun * Values are significant! Check MIPE documentation. */
97*4882a593Smuzhiyun enum tl_packet_family {
98*4882a593Smuzhiyun TL_PACKET_FAMILY_CTRL = 0, /* control packets */
99*4882a593Smuzhiyun TL_PACKET_FAMILY_TL = 1, /* timeline packets */
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun TL_PACKET_FAMILY_COUNT
102*4882a593Smuzhiyun };
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun /* Packet classes used in timeline streams.
105*4882a593Smuzhiyun * Values are significant! Check MIPE documentation. */
106*4882a593Smuzhiyun enum tl_packet_class {
107*4882a593Smuzhiyun TL_PACKET_CLASS_OBJ = 0, /* timeline objects packet */
108*4882a593Smuzhiyun TL_PACKET_CLASS_AUX = 1, /* auxiliary events packet */
109*4882a593Smuzhiyun };
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun /* Packet types used in timeline streams.
112*4882a593Smuzhiyun * Values are significant! Check MIPE documentation. */
113*4882a593Smuzhiyun enum tl_packet_type {
114*4882a593Smuzhiyun TL_PACKET_TYPE_HEADER = 0, /* stream's header/directory */
115*4882a593Smuzhiyun TL_PACKET_TYPE_BODY = 1, /* stream's body */
116*4882a593Smuzhiyun TL_PACKET_TYPE_SUMMARY = 2, /* stream's summary */
117*4882a593Smuzhiyun };
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun /* Message ids of trace events that are recorded in the timeline stream. */
120*4882a593Smuzhiyun enum tl_msg_id_obj {
121*4882a593Smuzhiyun /* Timeline object events. */
122*4882a593Smuzhiyun KBASE_TL_NEW_CTX,
123*4882a593Smuzhiyun KBASE_TL_NEW_GPU,
124*4882a593Smuzhiyun KBASE_TL_NEW_LPU,
125*4882a593Smuzhiyun KBASE_TL_NEW_ATOM,
126*4882a593Smuzhiyun KBASE_TL_NEW_AS,
127*4882a593Smuzhiyun KBASE_TL_DEL_CTX,
128*4882a593Smuzhiyun KBASE_TL_DEL_ATOM,
129*4882a593Smuzhiyun KBASE_TL_LIFELINK_LPU_GPU,
130*4882a593Smuzhiyun KBASE_TL_LIFELINK_AS_GPU,
131*4882a593Smuzhiyun KBASE_TL_RET_CTX_LPU,
132*4882a593Smuzhiyun KBASE_TL_RET_ATOM_CTX,
133*4882a593Smuzhiyun KBASE_TL_RET_ATOM_LPU,
134*4882a593Smuzhiyun KBASE_TL_NRET_CTX_LPU,
135*4882a593Smuzhiyun KBASE_TL_NRET_ATOM_CTX,
136*4882a593Smuzhiyun KBASE_TL_NRET_ATOM_LPU,
137*4882a593Smuzhiyun KBASE_TL_RET_AS_CTX,
138*4882a593Smuzhiyun KBASE_TL_NRET_AS_CTX,
139*4882a593Smuzhiyun KBASE_TL_RET_ATOM_AS,
140*4882a593Smuzhiyun KBASE_TL_NRET_ATOM_AS,
141*4882a593Smuzhiyun KBASE_TL_DEP_ATOM_ATOM,
142*4882a593Smuzhiyun KBASE_TL_NDEP_ATOM_ATOM,
143*4882a593Smuzhiyun KBASE_TL_RDEP_ATOM_ATOM,
144*4882a593Smuzhiyun KBASE_TL_ATTRIB_ATOM_CONFIG,
145*4882a593Smuzhiyun KBASE_TL_ATTRIB_ATOM_PRIORITY,
146*4882a593Smuzhiyun KBASE_TL_ATTRIB_ATOM_STATE,
147*4882a593Smuzhiyun KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE,
148*4882a593Smuzhiyun KBASE_TL_ATTRIB_ATOM_JIT,
149*4882a593Smuzhiyun KBASE_TL_ATTRIB_AS_CONFIG,
150*4882a593Smuzhiyun KBASE_TL_EVENT_LPU_SOFTSTOP,
151*4882a593Smuzhiyun KBASE_TL_EVENT_ATOM_SOFTSTOP_EX,
152*4882a593Smuzhiyun KBASE_TL_EVENT_ATOM_SOFTSTOP_ISSUE,
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun /* Job dump specific events. */
155*4882a593Smuzhiyun KBASE_JD_GPU_SOFT_RESET
156*4882a593Smuzhiyun };
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun /* Message ids of trace events that are recorded in the auxiliary stream. */
159*4882a593Smuzhiyun enum tl_msg_id_aux {
160*4882a593Smuzhiyun KBASE_AUX_PM_STATE,
161*4882a593Smuzhiyun KBASE_AUX_PAGEFAULT,
162*4882a593Smuzhiyun KBASE_AUX_PAGESALLOC,
163*4882a593Smuzhiyun KBASE_AUX_DEVFREQ_TARGET,
164*4882a593Smuzhiyun KBASE_AUX_PROTECTED_ENTER_START,
165*4882a593Smuzhiyun KBASE_AUX_PROTECTED_ENTER_END,
166*4882a593Smuzhiyun KBASE_AUX_PROTECTED_LEAVE_START,
167*4882a593Smuzhiyun KBASE_AUX_PROTECTED_LEAVE_END
168*4882a593Smuzhiyun };
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun /*****************************************************************************/
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun /**
173*4882a593Smuzhiyun * struct tl_stream - timeline stream structure
174*4882a593Smuzhiyun * @lock: message order lock
175*4882a593Smuzhiyun * @buffer: array of buffers
176*4882a593Smuzhiyun * @wbi: write buffer index
177*4882a593Smuzhiyun * @rbi: read buffer index
178*4882a593Smuzhiyun * @numbered: if non-zero stream's packets are sequentially numbered
179*4882a593Smuzhiyun * @autoflush_counter: counter tracking stream's autoflush state
180*4882a593Smuzhiyun *
181*4882a593Smuzhiyun * This structure holds information needed to construct proper packets in the
182*4882a593Smuzhiyun * timeline stream. Each message in sequence must bear timestamp that is greater
183*4882a593Smuzhiyun * to one in previous message in the same stream. For this reason lock is held
184*4882a593Smuzhiyun * throughout the process of message creation. Each stream contains set of
185*4882a593Smuzhiyun * buffers. Each buffer will hold one MIPE packet. In case there is no free
186*4882a593Smuzhiyun * space required to store incoming message the oldest buffer is discarded.
187*4882a593Smuzhiyun * Each packet in timeline body stream has sequence number embedded (this value
188*4882a593Smuzhiyun * must increment monotonically and is used by packets receiver to discover
189*4882a593Smuzhiyun * buffer overflows.
190*4882a593Smuzhiyun * Autoflush counter is set to negative number when there is no data pending
191*4882a593Smuzhiyun * for flush and it is set to zero on every update of the buffer. Autoflush
192*4882a593Smuzhiyun * timer will increment the counter by one on every expiry. In case there will
193*4882a593Smuzhiyun * be no activity on the buffer during two consecutive timer expiries, stream
194*4882a593Smuzhiyun * buffer will be flushed.
195*4882a593Smuzhiyun */
196*4882a593Smuzhiyun struct tl_stream {
197*4882a593Smuzhiyun spinlock_t lock;
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun struct {
200*4882a593Smuzhiyun atomic_t size; /* number of bytes in buffer */
201*4882a593Smuzhiyun char data[PACKET_SIZE]; /* buffer's data */
202*4882a593Smuzhiyun } buffer[PACKET_COUNT];
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun atomic_t wbi;
205*4882a593Smuzhiyun atomic_t rbi;
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun int numbered;
208*4882a593Smuzhiyun atomic_t autoflush_counter;
209*4882a593Smuzhiyun };
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun /**
212*4882a593Smuzhiyun * struct tp_desc - tracepoint message descriptor structure
213*4882a593Smuzhiyun * @id: tracepoint ID identifying message in stream
214*4882a593Smuzhiyun * @id_str: human readable version of tracepoint ID
215*4882a593Smuzhiyun * @name: tracepoint description
216*4882a593Smuzhiyun * @arg_types: tracepoint's arguments types declaration
217*4882a593Smuzhiyun * @arg_names: comma separated list of tracepoint's arguments names
218*4882a593Smuzhiyun */
219*4882a593Smuzhiyun struct tp_desc {
220*4882a593Smuzhiyun u32 id;
221*4882a593Smuzhiyun const char *id_str;
222*4882a593Smuzhiyun const char *name;
223*4882a593Smuzhiyun const char *arg_types;
224*4882a593Smuzhiyun const char *arg_names;
225*4882a593Smuzhiyun };
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun /*****************************************************************************/
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun /* Configuration of timeline streams generated by kernel.
230*4882a593Smuzhiyun * Kernel emit only streams containing either timeline object events or
231*4882a593Smuzhiyun * auxiliary events. All streams have stream id value of 1 (as opposed to user
232*4882a593Smuzhiyun * space streams that have value of 0). */
233*4882a593Smuzhiyun static const struct {
234*4882a593Smuzhiyun enum tl_packet_family pkt_family;
235*4882a593Smuzhiyun enum tl_packet_class pkt_class;
236*4882a593Smuzhiyun enum tl_packet_type pkt_type;
237*4882a593Smuzhiyun unsigned int stream_id;
238*4882a593Smuzhiyun } tl_stream_cfg[TL_STREAM_TYPE_COUNT] = {
239*4882a593Smuzhiyun {TL_PACKET_FAMILY_TL, TL_PACKET_CLASS_OBJ, TL_PACKET_TYPE_HEADER, 1},
240*4882a593Smuzhiyun {TL_PACKET_FAMILY_TL, TL_PACKET_CLASS_OBJ, TL_PACKET_TYPE_SUMMARY, 1},
241*4882a593Smuzhiyun {TL_PACKET_FAMILY_TL, TL_PACKET_CLASS_OBJ, TL_PACKET_TYPE_BODY, 1},
242*4882a593Smuzhiyun {TL_PACKET_FAMILY_TL, TL_PACKET_CLASS_AUX, TL_PACKET_TYPE_HEADER, 1},
243*4882a593Smuzhiyun {TL_PACKET_FAMILY_TL, TL_PACKET_CLASS_AUX, TL_PACKET_TYPE_BODY, 1}
244*4882a593Smuzhiyun };
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun /* The timeline streams generated by kernel. */
247*4882a593Smuzhiyun static struct tl_stream *tl_stream[TL_STREAM_TYPE_COUNT];
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun /* Autoflush timer. */
250*4882a593Smuzhiyun static struct timer_list autoflush_timer;
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun /* If non-zero autoflush timer is active. */
253*4882a593Smuzhiyun static atomic_t autoflush_timer_active;
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun /* Reader lock. Only one reader is allowed to have access to the timeline
256*4882a593Smuzhiyun * streams at any given time. */
257*4882a593Smuzhiyun static DEFINE_MUTEX(tl_reader_lock);
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun /* Timeline stream event queue. */
260*4882a593Smuzhiyun static DECLARE_WAIT_QUEUE_HEAD(tl_event_queue);
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun /* The timeline stream file operations functions. */
263*4882a593Smuzhiyun static ssize_t kbasep_tlstream_read(
264*4882a593Smuzhiyun struct file *filp,
265*4882a593Smuzhiyun char __user *buffer,
266*4882a593Smuzhiyun size_t size,
267*4882a593Smuzhiyun loff_t *f_pos);
268*4882a593Smuzhiyun static unsigned int kbasep_tlstream_poll(struct file *filp, poll_table *wait);
269*4882a593Smuzhiyun static int kbasep_tlstream_release(struct inode *inode, struct file *filp);
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun /* The timeline stream file operations structure. */
272*4882a593Smuzhiyun static const struct file_operations kbasep_tlstream_fops = {
273*4882a593Smuzhiyun .release = kbasep_tlstream_release,
274*4882a593Smuzhiyun .read = kbasep_tlstream_read,
275*4882a593Smuzhiyun .poll = kbasep_tlstream_poll,
276*4882a593Smuzhiyun };
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun /* Descriptors of timeline messages transmitted in object events stream. */
279*4882a593Smuzhiyun static const struct tp_desc tp_desc_obj[] = {
280*4882a593Smuzhiyun {
281*4882a593Smuzhiyun KBASE_TL_NEW_CTX,
282*4882a593Smuzhiyun __stringify(KBASE_TL_NEW_CTX),
283*4882a593Smuzhiyun "object ctx is created",
284*4882a593Smuzhiyun "@pII",
285*4882a593Smuzhiyun "ctx,ctx_nr,tgid"
286*4882a593Smuzhiyun },
287*4882a593Smuzhiyun {
288*4882a593Smuzhiyun KBASE_TL_NEW_GPU,
289*4882a593Smuzhiyun __stringify(KBASE_TL_NEW_GPU),
290*4882a593Smuzhiyun "object gpu is created",
291*4882a593Smuzhiyun "@pII",
292*4882a593Smuzhiyun "gpu,gpu_id,core_count"
293*4882a593Smuzhiyun },
294*4882a593Smuzhiyun {
295*4882a593Smuzhiyun KBASE_TL_NEW_LPU,
296*4882a593Smuzhiyun __stringify(KBASE_TL_NEW_LPU),
297*4882a593Smuzhiyun "object lpu is created",
298*4882a593Smuzhiyun "@pII",
299*4882a593Smuzhiyun "lpu,lpu_nr,lpu_fn"
300*4882a593Smuzhiyun },
301*4882a593Smuzhiyun {
302*4882a593Smuzhiyun KBASE_TL_NEW_ATOM,
303*4882a593Smuzhiyun __stringify(KBASE_TL_NEW_ATOM),
304*4882a593Smuzhiyun "object atom is created",
305*4882a593Smuzhiyun "@pI",
306*4882a593Smuzhiyun "atom,atom_nr"
307*4882a593Smuzhiyun },
308*4882a593Smuzhiyun {
309*4882a593Smuzhiyun KBASE_TL_NEW_AS,
310*4882a593Smuzhiyun __stringify(KBASE_TL_NEW_AS),
311*4882a593Smuzhiyun "address space object is created",
312*4882a593Smuzhiyun "@pI",
313*4882a593Smuzhiyun "address_space,as_nr"
314*4882a593Smuzhiyun },
315*4882a593Smuzhiyun {
316*4882a593Smuzhiyun KBASE_TL_DEL_CTX,
317*4882a593Smuzhiyun __stringify(KBASE_TL_DEL_CTX),
318*4882a593Smuzhiyun "context is destroyed",
319*4882a593Smuzhiyun "@p",
320*4882a593Smuzhiyun "ctx"
321*4882a593Smuzhiyun },
322*4882a593Smuzhiyun {
323*4882a593Smuzhiyun KBASE_TL_DEL_ATOM,
324*4882a593Smuzhiyun __stringify(KBASE_TL_DEL_ATOM),
325*4882a593Smuzhiyun "atom is destroyed",
326*4882a593Smuzhiyun "@p",
327*4882a593Smuzhiyun "atom"
328*4882a593Smuzhiyun },
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun KBASE_TL_LIFELINK_LPU_GPU,
331*4882a593Smuzhiyun __stringify(KBASE_TL_LIFELINK_LPU_GPU),
332*4882a593Smuzhiyun "lpu is deleted with gpu",
333*4882a593Smuzhiyun "@pp",
334*4882a593Smuzhiyun "lpu,gpu"
335*4882a593Smuzhiyun },
336*4882a593Smuzhiyun {
337*4882a593Smuzhiyun KBASE_TL_LIFELINK_AS_GPU,
338*4882a593Smuzhiyun __stringify(KBASE_TL_LIFELINK_AS_GPU),
339*4882a593Smuzhiyun "address space is deleted with gpu",
340*4882a593Smuzhiyun "@pp",
341*4882a593Smuzhiyun "address_space,gpu"
342*4882a593Smuzhiyun },
343*4882a593Smuzhiyun {
344*4882a593Smuzhiyun KBASE_TL_RET_CTX_LPU,
345*4882a593Smuzhiyun __stringify(KBASE_TL_RET_CTX_LPU),
346*4882a593Smuzhiyun "context is retained by lpu",
347*4882a593Smuzhiyun "@pp",
348*4882a593Smuzhiyun "ctx,lpu"
349*4882a593Smuzhiyun },
350*4882a593Smuzhiyun {
351*4882a593Smuzhiyun KBASE_TL_RET_ATOM_CTX,
352*4882a593Smuzhiyun __stringify(KBASE_TL_RET_ATOM_CTX),
353*4882a593Smuzhiyun "atom is retained by context",
354*4882a593Smuzhiyun "@pp",
355*4882a593Smuzhiyun "atom,ctx"
356*4882a593Smuzhiyun },
357*4882a593Smuzhiyun {
358*4882a593Smuzhiyun KBASE_TL_RET_ATOM_LPU,
359*4882a593Smuzhiyun __stringify(KBASE_TL_RET_ATOM_LPU),
360*4882a593Smuzhiyun "atom is retained by lpu",
361*4882a593Smuzhiyun "@pps",
362*4882a593Smuzhiyun "atom,lpu,attrib_match_list"
363*4882a593Smuzhiyun },
364*4882a593Smuzhiyun {
365*4882a593Smuzhiyun KBASE_TL_NRET_CTX_LPU,
366*4882a593Smuzhiyun __stringify(KBASE_TL_NRET_CTX_LPU),
367*4882a593Smuzhiyun "context is released by lpu",
368*4882a593Smuzhiyun "@pp",
369*4882a593Smuzhiyun "ctx,lpu"
370*4882a593Smuzhiyun },
371*4882a593Smuzhiyun {
372*4882a593Smuzhiyun KBASE_TL_NRET_ATOM_CTX,
373*4882a593Smuzhiyun __stringify(KBASE_TL_NRET_ATOM_CTX),
374*4882a593Smuzhiyun "atom is released by context",
375*4882a593Smuzhiyun "@pp",
376*4882a593Smuzhiyun "atom,ctx"
377*4882a593Smuzhiyun },
378*4882a593Smuzhiyun {
379*4882a593Smuzhiyun KBASE_TL_NRET_ATOM_LPU,
380*4882a593Smuzhiyun __stringify(KBASE_TL_NRET_ATOM_LPU),
381*4882a593Smuzhiyun "atom is released by lpu",
382*4882a593Smuzhiyun "@pp",
383*4882a593Smuzhiyun "atom,lpu"
384*4882a593Smuzhiyun },
385*4882a593Smuzhiyun {
386*4882a593Smuzhiyun KBASE_TL_RET_AS_CTX,
387*4882a593Smuzhiyun __stringify(KBASE_TL_RET_AS_CTX),
388*4882a593Smuzhiyun "address space is retained by context",
389*4882a593Smuzhiyun "@pp",
390*4882a593Smuzhiyun "address_space,ctx"
391*4882a593Smuzhiyun },
392*4882a593Smuzhiyun {
393*4882a593Smuzhiyun KBASE_TL_NRET_AS_CTX,
394*4882a593Smuzhiyun __stringify(KBASE_TL_NRET_AS_CTX),
395*4882a593Smuzhiyun "address space is released by context",
396*4882a593Smuzhiyun "@pp",
397*4882a593Smuzhiyun "address_space,ctx"
398*4882a593Smuzhiyun },
399*4882a593Smuzhiyun {
400*4882a593Smuzhiyun KBASE_TL_RET_ATOM_AS,
401*4882a593Smuzhiyun __stringify(KBASE_TL_RET_ATOM_AS),
402*4882a593Smuzhiyun "atom is retained by address space",
403*4882a593Smuzhiyun "@pp",
404*4882a593Smuzhiyun "atom,address_space"
405*4882a593Smuzhiyun },
406*4882a593Smuzhiyun {
407*4882a593Smuzhiyun KBASE_TL_NRET_ATOM_AS,
408*4882a593Smuzhiyun __stringify(KBASE_TL_NRET_ATOM_AS),
409*4882a593Smuzhiyun "atom is released by address space",
410*4882a593Smuzhiyun "@pp",
411*4882a593Smuzhiyun "atom,address_space"
412*4882a593Smuzhiyun },
413*4882a593Smuzhiyun {
414*4882a593Smuzhiyun KBASE_TL_DEP_ATOM_ATOM,
415*4882a593Smuzhiyun __stringify(KBASE_TL_DEP_ATOM_ATOM),
416*4882a593Smuzhiyun "atom2 depends on atom1",
417*4882a593Smuzhiyun "@pp",
418*4882a593Smuzhiyun "atom1,atom2"
419*4882a593Smuzhiyun },
420*4882a593Smuzhiyun {
421*4882a593Smuzhiyun KBASE_TL_NDEP_ATOM_ATOM,
422*4882a593Smuzhiyun __stringify(KBASE_TL_NDEP_ATOM_ATOM),
423*4882a593Smuzhiyun "atom2 no longer depends on atom1",
424*4882a593Smuzhiyun "@pp",
425*4882a593Smuzhiyun "atom1,atom2"
426*4882a593Smuzhiyun },
427*4882a593Smuzhiyun {
428*4882a593Smuzhiyun KBASE_TL_RDEP_ATOM_ATOM,
429*4882a593Smuzhiyun __stringify(KBASE_TL_RDEP_ATOM_ATOM),
430*4882a593Smuzhiyun "resolved dependecy of atom2 depending on atom1",
431*4882a593Smuzhiyun "@pp",
432*4882a593Smuzhiyun "atom1,atom2"
433*4882a593Smuzhiyun },
434*4882a593Smuzhiyun {
435*4882a593Smuzhiyun KBASE_TL_ATTRIB_ATOM_CONFIG,
436*4882a593Smuzhiyun __stringify(KBASE_TL_ATTRIB_ATOM_CONFIG),
437*4882a593Smuzhiyun "atom job slot attributes",
438*4882a593Smuzhiyun "@pLLI",
439*4882a593Smuzhiyun "atom,descriptor,affinity,config"
440*4882a593Smuzhiyun },
441*4882a593Smuzhiyun {
442*4882a593Smuzhiyun KBASE_TL_ATTRIB_ATOM_PRIORITY,
443*4882a593Smuzhiyun __stringify(KBASE_TL_ATTRIB_ATOM_PRIORITY),
444*4882a593Smuzhiyun "atom priority",
445*4882a593Smuzhiyun "@pI",
446*4882a593Smuzhiyun "atom,prio"
447*4882a593Smuzhiyun },
448*4882a593Smuzhiyun {
449*4882a593Smuzhiyun KBASE_TL_ATTRIB_ATOM_STATE,
450*4882a593Smuzhiyun __stringify(KBASE_TL_ATTRIB_ATOM_STATE),
451*4882a593Smuzhiyun "atom state",
452*4882a593Smuzhiyun "@pI",
453*4882a593Smuzhiyun "atom,state"
454*4882a593Smuzhiyun },
455*4882a593Smuzhiyun {
456*4882a593Smuzhiyun KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE,
457*4882a593Smuzhiyun __stringify(KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE),
458*4882a593Smuzhiyun "atom caused priority change",
459*4882a593Smuzhiyun "@p",
460*4882a593Smuzhiyun "atom"
461*4882a593Smuzhiyun },
462*4882a593Smuzhiyun {
463*4882a593Smuzhiyun KBASE_TL_ATTRIB_ATOM_JIT,
464*4882a593Smuzhiyun __stringify(KBASE_TL_ATTRIB_ATOM_JIT),
465*4882a593Smuzhiyun "jit done for atom",
466*4882a593Smuzhiyun "@pLL",
467*4882a593Smuzhiyun "atom,edit_addr,new_addr"
468*4882a593Smuzhiyun },
469*4882a593Smuzhiyun {
470*4882a593Smuzhiyun KBASE_TL_ATTRIB_AS_CONFIG,
471*4882a593Smuzhiyun __stringify(KBASE_TL_ATTRIB_AS_CONFIG),
472*4882a593Smuzhiyun "address space attributes",
473*4882a593Smuzhiyun "@pLLL",
474*4882a593Smuzhiyun "address_space,transtab,memattr,transcfg"
475*4882a593Smuzhiyun },
476*4882a593Smuzhiyun {
477*4882a593Smuzhiyun KBASE_TL_EVENT_LPU_SOFTSTOP,
478*4882a593Smuzhiyun __stringify(KBASE_TL_EVENT_LPU_SOFTSTOP),
479*4882a593Smuzhiyun "softstop event on given lpu",
480*4882a593Smuzhiyun "@p",
481*4882a593Smuzhiyun "lpu"
482*4882a593Smuzhiyun },
483*4882a593Smuzhiyun {
484*4882a593Smuzhiyun KBASE_TL_EVENT_ATOM_SOFTSTOP_EX,
485*4882a593Smuzhiyun __stringify(KBASE_TL_EVENT_ATOM_SOFTSTOP_EX),
486*4882a593Smuzhiyun "atom softstopped",
487*4882a593Smuzhiyun "@p",
488*4882a593Smuzhiyun "atom"
489*4882a593Smuzhiyun },
490*4882a593Smuzhiyun {
491*4882a593Smuzhiyun KBASE_TL_EVENT_ATOM_SOFTSTOP_ISSUE,
492*4882a593Smuzhiyun __stringify(KBASE_TL_EVENT_SOFTSTOP_ISSUE),
493*4882a593Smuzhiyun "atom softstop issued",
494*4882a593Smuzhiyun "@p",
495*4882a593Smuzhiyun "atom"
496*4882a593Smuzhiyun },
497*4882a593Smuzhiyun {
498*4882a593Smuzhiyun KBASE_JD_GPU_SOFT_RESET,
499*4882a593Smuzhiyun __stringify(KBASE_JD_GPU_SOFT_RESET),
500*4882a593Smuzhiyun "gpu soft reset",
501*4882a593Smuzhiyun "@p",
502*4882a593Smuzhiyun "gpu"
503*4882a593Smuzhiyun },
504*4882a593Smuzhiyun };
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun /* Descriptors of timeline messages transmitted in auxiliary events stream. */
507*4882a593Smuzhiyun static const struct tp_desc tp_desc_aux[] = {
508*4882a593Smuzhiyun {
509*4882a593Smuzhiyun KBASE_AUX_PM_STATE,
510*4882a593Smuzhiyun __stringify(KBASE_AUX_PM_STATE),
511*4882a593Smuzhiyun "PM state",
512*4882a593Smuzhiyun "@IL",
513*4882a593Smuzhiyun "core_type,core_state_bitset"
514*4882a593Smuzhiyun },
515*4882a593Smuzhiyun {
516*4882a593Smuzhiyun KBASE_AUX_PAGEFAULT,
517*4882a593Smuzhiyun __stringify(KBASE_AUX_PAGEFAULT),
518*4882a593Smuzhiyun "Page fault",
519*4882a593Smuzhiyun "@IL",
520*4882a593Smuzhiyun "ctx_nr,page_cnt_change"
521*4882a593Smuzhiyun },
522*4882a593Smuzhiyun {
523*4882a593Smuzhiyun KBASE_AUX_PAGESALLOC,
524*4882a593Smuzhiyun __stringify(KBASE_AUX_PAGESALLOC),
525*4882a593Smuzhiyun "Total alloc pages change",
526*4882a593Smuzhiyun "@IL",
527*4882a593Smuzhiyun "ctx_nr,page_cnt"
528*4882a593Smuzhiyun },
529*4882a593Smuzhiyun {
530*4882a593Smuzhiyun KBASE_AUX_DEVFREQ_TARGET,
531*4882a593Smuzhiyun __stringify(KBASE_AUX_DEVFREQ_TARGET),
532*4882a593Smuzhiyun "New device frequency target",
533*4882a593Smuzhiyun "@L",
534*4882a593Smuzhiyun "target_freq"
535*4882a593Smuzhiyun },
536*4882a593Smuzhiyun {
537*4882a593Smuzhiyun KBASE_AUX_PROTECTED_ENTER_START,
538*4882a593Smuzhiyun __stringify(KBASE_AUX_PROTECTED_ENTER_START),
539*4882a593Smuzhiyun "enter protected mode start",
540*4882a593Smuzhiyun "@p",
541*4882a593Smuzhiyun "gpu"
542*4882a593Smuzhiyun },
543*4882a593Smuzhiyun {
544*4882a593Smuzhiyun KBASE_AUX_PROTECTED_ENTER_END,
545*4882a593Smuzhiyun __stringify(KBASE_AUX_PROTECTED_ENTER_END),
546*4882a593Smuzhiyun "enter protected mode end",
547*4882a593Smuzhiyun "@p",
548*4882a593Smuzhiyun "gpu"
549*4882a593Smuzhiyun },
550*4882a593Smuzhiyun {
551*4882a593Smuzhiyun KBASE_AUX_PROTECTED_LEAVE_START,
552*4882a593Smuzhiyun __stringify(KBASE_AUX_PROTECTED_LEAVE_START),
553*4882a593Smuzhiyun "leave protected mode start",
554*4882a593Smuzhiyun "@p",
555*4882a593Smuzhiyun "gpu"
556*4882a593Smuzhiyun },
557*4882a593Smuzhiyun {
558*4882a593Smuzhiyun KBASE_AUX_PROTECTED_LEAVE_END,
559*4882a593Smuzhiyun __stringify(KBASE_AUX_PROTECTED_LEAVE_END),
560*4882a593Smuzhiyun "leave protected mode end",
561*4882a593Smuzhiyun "@p",
562*4882a593Smuzhiyun "gpu"
563*4882a593Smuzhiyun }
564*4882a593Smuzhiyun };
565*4882a593Smuzhiyun
566*4882a593Smuzhiyun #if MALI_UNIT_TEST
567*4882a593Smuzhiyun /* Number of bytes read by user. */
568*4882a593Smuzhiyun static atomic_t tlstream_bytes_collected = {0};
569*4882a593Smuzhiyun
570*4882a593Smuzhiyun /* Number of bytes generated by tracepoint messages. */
571*4882a593Smuzhiyun static atomic_t tlstream_bytes_generated = {0};
572*4882a593Smuzhiyun #endif /* MALI_UNIT_TEST */
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun /*****************************************************************************/
575*4882a593Smuzhiyun
576*4882a593Smuzhiyun /* Indicator of whether the timeline stream file descriptor is used. */
577*4882a593Smuzhiyun atomic_t kbase_tlstream_enabled = {0};
578*4882a593Smuzhiyun
579*4882a593Smuzhiyun /*****************************************************************************/
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun /**
582*4882a593Smuzhiyun * kbasep_tlstream_get_timestamp - return timestamp
583*4882a593Smuzhiyun *
584*4882a593Smuzhiyun * Function returns timestamp value based on raw monotonic timer. Value will
585*4882a593Smuzhiyun * wrap around zero in case of overflow.
586*4882a593Smuzhiyun * Return: timestamp value
587*4882a593Smuzhiyun */
kbasep_tlstream_get_timestamp(void)588*4882a593Smuzhiyun static u64 kbasep_tlstream_get_timestamp(void)
589*4882a593Smuzhiyun {
590*4882a593Smuzhiyun struct timespec64 ts;
591*4882a593Smuzhiyun u64 timestamp;
592*4882a593Smuzhiyun
593*4882a593Smuzhiyun ktime_get_raw_ts64(&ts);
594*4882a593Smuzhiyun timestamp = (u64)ts.tv_sec * NSECS_IN_SEC + ts.tv_nsec;
595*4882a593Smuzhiyun return timestamp;
596*4882a593Smuzhiyun }
597*4882a593Smuzhiyun
598*4882a593Smuzhiyun /**
599*4882a593Smuzhiyun * kbasep_tlstream_write_bytes - write data to message buffer
600*4882a593Smuzhiyun * @buffer: buffer where data will be written
601*4882a593Smuzhiyun * @pos: position in the buffer where to place data
602*4882a593Smuzhiyun * @bytes: pointer to buffer holding data
603*4882a593Smuzhiyun * @len: length of data to be written
604*4882a593Smuzhiyun *
605*4882a593Smuzhiyun * Return: updated position in the buffer
606*4882a593Smuzhiyun */
kbasep_tlstream_write_bytes(char * buffer,size_t pos,const void * bytes,size_t len)607*4882a593Smuzhiyun static size_t kbasep_tlstream_write_bytes(
608*4882a593Smuzhiyun char *buffer,
609*4882a593Smuzhiyun size_t pos,
610*4882a593Smuzhiyun const void *bytes,
611*4882a593Smuzhiyun size_t len)
612*4882a593Smuzhiyun {
613*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
614*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(bytes);
615*4882a593Smuzhiyun
616*4882a593Smuzhiyun memcpy(&buffer[pos], bytes, len);
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun return pos + len;
619*4882a593Smuzhiyun }
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun /**
622*4882a593Smuzhiyun * kbasep_tlstream_write_string - write string to message buffer
623*4882a593Smuzhiyun * @buffer: buffer where data will be written
624*4882a593Smuzhiyun * @pos: position in the buffer where to place data
625*4882a593Smuzhiyun * @string: pointer to buffer holding the source string
626*4882a593Smuzhiyun * @max_write_size: number of bytes that can be stored in buffer
627*4882a593Smuzhiyun *
628*4882a593Smuzhiyun * Return: updated position in the buffer
629*4882a593Smuzhiyun */
kbasep_tlstream_write_string(char * buffer,size_t pos,const char * string,size_t max_write_size)630*4882a593Smuzhiyun static size_t kbasep_tlstream_write_string(
631*4882a593Smuzhiyun char *buffer,
632*4882a593Smuzhiyun size_t pos,
633*4882a593Smuzhiyun const char *string,
634*4882a593Smuzhiyun size_t max_write_size)
635*4882a593Smuzhiyun {
636*4882a593Smuzhiyun u32 string_len;
637*4882a593Smuzhiyun
638*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
639*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(string);
640*4882a593Smuzhiyun /* Timeline string consists of at least string length and nul
641*4882a593Smuzhiyun * terminator. */
642*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(max_write_size >= sizeof(string_len) + sizeof(char));
643*4882a593Smuzhiyun max_write_size -= sizeof(string_len);
644*4882a593Smuzhiyun
645*4882a593Smuzhiyun string_len = strlcpy(
646*4882a593Smuzhiyun &buffer[pos + sizeof(string_len)],
647*4882a593Smuzhiyun string,
648*4882a593Smuzhiyun max_write_size);
649*4882a593Smuzhiyun string_len += sizeof(char);
650*4882a593Smuzhiyun
651*4882a593Smuzhiyun /* Make sure that the source string fit into the buffer. */
652*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(string_len <= max_write_size);
653*4882a593Smuzhiyun
654*4882a593Smuzhiyun /* Update string length. */
655*4882a593Smuzhiyun memcpy(&buffer[pos], &string_len, sizeof(string_len));
656*4882a593Smuzhiyun
657*4882a593Smuzhiyun return pos + sizeof(string_len) + string_len;
658*4882a593Smuzhiyun }
659*4882a593Smuzhiyun
660*4882a593Smuzhiyun /**
661*4882a593Smuzhiyun * kbasep_tlstream_write_timestamp - write timestamp to message buffer
662*4882a593Smuzhiyun * @buffer: buffer where data will be written
663*4882a593Smuzhiyun * @pos: position in the buffer where to place data
664*4882a593Smuzhiyun *
665*4882a593Smuzhiyun * Return: updated position in the buffer
666*4882a593Smuzhiyun */
kbasep_tlstream_write_timestamp(void * buffer,size_t pos)667*4882a593Smuzhiyun static size_t kbasep_tlstream_write_timestamp(void *buffer, size_t pos)
668*4882a593Smuzhiyun {
669*4882a593Smuzhiyun u64 timestamp = kbasep_tlstream_get_timestamp();
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun return kbasep_tlstream_write_bytes(
672*4882a593Smuzhiyun buffer, pos,
673*4882a593Smuzhiyun ×tamp, sizeof(timestamp));
674*4882a593Smuzhiyun }
675*4882a593Smuzhiyun
676*4882a593Smuzhiyun /**
677*4882a593Smuzhiyun * kbasep_tlstream_put_bits - put bits in a word
678*4882a593Smuzhiyun * @word: pointer to the words being modified
679*4882a593Smuzhiyun * @value: value that shall be written to given position
680*4882a593Smuzhiyun * @bitpos: position where value shall be written (in bits)
681*4882a593Smuzhiyun * @bitlen: length of value (in bits)
682*4882a593Smuzhiyun */
kbasep_tlstream_put_bits(u32 * word,u32 value,unsigned int bitpos,unsigned int bitlen)683*4882a593Smuzhiyun static void kbasep_tlstream_put_bits(
684*4882a593Smuzhiyun u32 *word,
685*4882a593Smuzhiyun u32 value,
686*4882a593Smuzhiyun unsigned int bitpos,
687*4882a593Smuzhiyun unsigned int bitlen)
688*4882a593Smuzhiyun {
689*4882a593Smuzhiyun const u32 mask = ((1 << bitlen) - 1) << bitpos;
690*4882a593Smuzhiyun
691*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(word);
692*4882a593Smuzhiyun KBASE_DEBUG_ASSERT((0 != bitlen) && (32 >= bitlen));
693*4882a593Smuzhiyun KBASE_DEBUG_ASSERT((bitpos + bitlen) <= 32);
694*4882a593Smuzhiyun
695*4882a593Smuzhiyun *word &= ~mask;
696*4882a593Smuzhiyun *word |= ((value << bitpos) & mask);
697*4882a593Smuzhiyun }
698*4882a593Smuzhiyun
699*4882a593Smuzhiyun /**
700*4882a593Smuzhiyun * kbasep_tlstream_packet_header_setup - setup the packet header
701*4882a593Smuzhiyun * @buffer: pointer to the buffer
702*4882a593Smuzhiyun * @pkt_family: packet's family
703*4882a593Smuzhiyun * @pkt_type: packet's type
704*4882a593Smuzhiyun * @pkt_class: packet's class
705*4882a593Smuzhiyun * @stream_id: stream id
706*4882a593Smuzhiyun * @numbered: non-zero if this stream is numbered
707*4882a593Smuzhiyun *
708*4882a593Smuzhiyun * Function sets up immutable part of packet header in the given buffer.
709*4882a593Smuzhiyun */
kbasep_tlstream_packet_header_setup(char * buffer,enum tl_packet_family pkt_family,enum tl_packet_class pkt_class,enum tl_packet_type pkt_type,unsigned int stream_id,int numbered)710*4882a593Smuzhiyun static void kbasep_tlstream_packet_header_setup(
711*4882a593Smuzhiyun char *buffer,
712*4882a593Smuzhiyun enum tl_packet_family pkt_family,
713*4882a593Smuzhiyun enum tl_packet_class pkt_class,
714*4882a593Smuzhiyun enum tl_packet_type pkt_type,
715*4882a593Smuzhiyun unsigned int stream_id,
716*4882a593Smuzhiyun int numbered)
717*4882a593Smuzhiyun {
718*4882a593Smuzhiyun u32 word0 = 0;
719*4882a593Smuzhiyun u32 word1 = 0;
720*4882a593Smuzhiyun
721*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
722*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(pkt_family == TL_PACKET_FAMILY_TL);
723*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(
724*4882a593Smuzhiyun (pkt_type == TL_PACKET_TYPE_HEADER) ||
725*4882a593Smuzhiyun (pkt_type == TL_PACKET_TYPE_SUMMARY) ||
726*4882a593Smuzhiyun (pkt_type == TL_PACKET_TYPE_BODY));
727*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(
728*4882a593Smuzhiyun (pkt_class == TL_PACKET_CLASS_OBJ) ||
729*4882a593Smuzhiyun (pkt_class == TL_PACKET_CLASS_AUX));
730*4882a593Smuzhiyun
731*4882a593Smuzhiyun kbasep_tlstream_put_bits(
732*4882a593Smuzhiyun &word0, pkt_family,
733*4882a593Smuzhiyun PACKET_FAMILY_POS, PACKET_FAMILY_LEN);
734*4882a593Smuzhiyun kbasep_tlstream_put_bits(
735*4882a593Smuzhiyun &word0, pkt_class,
736*4882a593Smuzhiyun PACKET_CLASS_POS, PACKET_CLASS_LEN);
737*4882a593Smuzhiyun kbasep_tlstream_put_bits(
738*4882a593Smuzhiyun &word0, pkt_type,
739*4882a593Smuzhiyun PACKET_TYPE_POS, PACKET_TYPE_LEN);
740*4882a593Smuzhiyun kbasep_tlstream_put_bits(
741*4882a593Smuzhiyun &word0, stream_id,
742*4882a593Smuzhiyun PACKET_STREAMID_POS, PACKET_STREAMID_LEN);
743*4882a593Smuzhiyun
744*4882a593Smuzhiyun if (numbered)
745*4882a593Smuzhiyun kbasep_tlstream_put_bits(
746*4882a593Smuzhiyun &word1, 1,
747*4882a593Smuzhiyun PACKET_SEQBIT_POS, PACKET_SEQBIT_LEN);
748*4882a593Smuzhiyun
749*4882a593Smuzhiyun memcpy(&buffer[0], &word0, sizeof(word0));
750*4882a593Smuzhiyun memcpy(&buffer[sizeof(word0)], &word1, sizeof(word1));
751*4882a593Smuzhiyun }
752*4882a593Smuzhiyun
753*4882a593Smuzhiyun /**
754*4882a593Smuzhiyun * kbasep_tlstream_packet_header_update - update the packet header
755*4882a593Smuzhiyun * @buffer: pointer to the buffer
756*4882a593Smuzhiyun * @data_size: amount of data carried in this packet
757*4882a593Smuzhiyun *
758*4882a593Smuzhiyun * Function updates mutable part of packet header in the given buffer.
759*4882a593Smuzhiyun * Note that value of data_size must not including size of the header.
760*4882a593Smuzhiyun */
kbasep_tlstream_packet_header_update(char * buffer,size_t data_size)761*4882a593Smuzhiyun static void kbasep_tlstream_packet_header_update(
762*4882a593Smuzhiyun char *buffer,
763*4882a593Smuzhiyun size_t data_size)
764*4882a593Smuzhiyun {
765*4882a593Smuzhiyun u32 word0;
766*4882a593Smuzhiyun u32 word1;
767*4882a593Smuzhiyun
768*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
769*4882a593Smuzhiyun CSTD_UNUSED(word0);
770*4882a593Smuzhiyun
771*4882a593Smuzhiyun memcpy(&word1, &buffer[sizeof(word0)], sizeof(word1));
772*4882a593Smuzhiyun
773*4882a593Smuzhiyun kbasep_tlstream_put_bits(
774*4882a593Smuzhiyun &word1, data_size,
775*4882a593Smuzhiyun PACKET_LENGTH_POS, PACKET_LENGTH_LEN);
776*4882a593Smuzhiyun
777*4882a593Smuzhiyun memcpy(&buffer[sizeof(word0)], &word1, sizeof(word1));
778*4882a593Smuzhiyun }
779*4882a593Smuzhiyun
780*4882a593Smuzhiyun /**
781*4882a593Smuzhiyun * kbasep_tlstream_packet_number_update - update the packet number
782*4882a593Smuzhiyun * @buffer: pointer to the buffer
783*4882a593Smuzhiyun * @counter: value of packet counter for this packet's stream
784*4882a593Smuzhiyun *
785*4882a593Smuzhiyun * Function updates packet number embedded within the packet placed in the
786*4882a593Smuzhiyun * given buffer.
787*4882a593Smuzhiyun */
kbasep_tlstream_packet_number_update(char * buffer,u32 counter)788*4882a593Smuzhiyun static void kbasep_tlstream_packet_number_update(char *buffer, u32 counter)
789*4882a593Smuzhiyun {
790*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
791*4882a593Smuzhiyun
792*4882a593Smuzhiyun memcpy(&buffer[PACKET_HEADER_SIZE], &counter, sizeof(counter));
793*4882a593Smuzhiyun }
794*4882a593Smuzhiyun
795*4882a593Smuzhiyun /**
796*4882a593Smuzhiyun * kbasep_timeline_stream_reset - reset stream
797*4882a593Smuzhiyun * @stream: pointer to the stream structure
798*4882a593Smuzhiyun *
799*4882a593Smuzhiyun * Function discards all pending messages and resets packet counters.
800*4882a593Smuzhiyun */
kbasep_timeline_stream_reset(struct tl_stream * stream)801*4882a593Smuzhiyun static void kbasep_timeline_stream_reset(struct tl_stream *stream)
802*4882a593Smuzhiyun {
803*4882a593Smuzhiyun unsigned int i;
804*4882a593Smuzhiyun
805*4882a593Smuzhiyun for (i = 0; i < PACKET_COUNT; i++) {
806*4882a593Smuzhiyun if (stream->numbered)
807*4882a593Smuzhiyun atomic_set(
808*4882a593Smuzhiyun &stream->buffer[i].size,
809*4882a593Smuzhiyun PACKET_HEADER_SIZE +
810*4882a593Smuzhiyun PACKET_NUMBER_SIZE);
811*4882a593Smuzhiyun else
812*4882a593Smuzhiyun atomic_set(&stream->buffer[i].size, PACKET_HEADER_SIZE);
813*4882a593Smuzhiyun }
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun atomic_set(&stream->wbi, 0);
816*4882a593Smuzhiyun atomic_set(&stream->rbi, 0);
817*4882a593Smuzhiyun }
818*4882a593Smuzhiyun
819*4882a593Smuzhiyun /**
820*4882a593Smuzhiyun * kbasep_timeline_stream_init - initialize timeline stream
821*4882a593Smuzhiyun * @stream: pointer to the stream structure
822*4882a593Smuzhiyun * @stream_type: stream type
823*4882a593Smuzhiyun */
kbasep_timeline_stream_init(struct tl_stream * stream,enum tl_stream_type stream_type)824*4882a593Smuzhiyun static void kbasep_timeline_stream_init(
825*4882a593Smuzhiyun struct tl_stream *stream,
826*4882a593Smuzhiyun enum tl_stream_type stream_type)
827*4882a593Smuzhiyun {
828*4882a593Smuzhiyun unsigned int i;
829*4882a593Smuzhiyun
830*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(stream);
831*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(TL_STREAM_TYPE_COUNT > stream_type);
832*4882a593Smuzhiyun
833*4882a593Smuzhiyun spin_lock_init(&stream->lock);
834*4882a593Smuzhiyun
835*4882a593Smuzhiyun /* All packets carrying tracepoints shall be numbered. */
836*4882a593Smuzhiyun if (TL_PACKET_TYPE_BODY == tl_stream_cfg[stream_type].pkt_type)
837*4882a593Smuzhiyun stream->numbered = 1;
838*4882a593Smuzhiyun else
839*4882a593Smuzhiyun stream->numbered = 0;
840*4882a593Smuzhiyun
841*4882a593Smuzhiyun for (i = 0; i < PACKET_COUNT; i++)
842*4882a593Smuzhiyun kbasep_tlstream_packet_header_setup(
843*4882a593Smuzhiyun stream->buffer[i].data,
844*4882a593Smuzhiyun tl_stream_cfg[stream_type].pkt_family,
845*4882a593Smuzhiyun tl_stream_cfg[stream_type].pkt_class,
846*4882a593Smuzhiyun tl_stream_cfg[stream_type].pkt_type,
847*4882a593Smuzhiyun tl_stream_cfg[stream_type].stream_id,
848*4882a593Smuzhiyun stream->numbered);
849*4882a593Smuzhiyun
850*4882a593Smuzhiyun kbasep_timeline_stream_reset(tl_stream[stream_type]);
851*4882a593Smuzhiyun }
852*4882a593Smuzhiyun
853*4882a593Smuzhiyun /**
854*4882a593Smuzhiyun * kbasep_timeline_stream_term - terminate timeline stream
855*4882a593Smuzhiyun * @stream: pointer to the stream structure
856*4882a593Smuzhiyun */
kbasep_timeline_stream_term(struct tl_stream * stream)857*4882a593Smuzhiyun static void kbasep_timeline_stream_term(struct tl_stream *stream)
858*4882a593Smuzhiyun {
859*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(stream);
860*4882a593Smuzhiyun }
861*4882a593Smuzhiyun
862*4882a593Smuzhiyun /**
863*4882a593Smuzhiyun * kbasep_tlstream_msgbuf_submit - submit packet to the user space
864*4882a593Smuzhiyun * @stream: pointer to the stream structure
865*4882a593Smuzhiyun * @wb_idx_raw: write buffer index
866*4882a593Smuzhiyun * @wb_size: length of data stored in current buffer
867*4882a593Smuzhiyun *
868*4882a593Smuzhiyun * Function updates currently written buffer with packet header. Then write
869*4882a593Smuzhiyun * index is incremented and buffer is handled to user space. Parameters
870*4882a593Smuzhiyun * of new buffer are returned using provided arguments.
871*4882a593Smuzhiyun *
872*4882a593Smuzhiyun * Return: length of data in new buffer
873*4882a593Smuzhiyun *
874*4882a593Smuzhiyun * Warning: User must update the stream structure with returned value.
875*4882a593Smuzhiyun */
kbasep_tlstream_msgbuf_submit(struct tl_stream * stream,unsigned int wb_idx_raw,unsigned int wb_size)876*4882a593Smuzhiyun static size_t kbasep_tlstream_msgbuf_submit(
877*4882a593Smuzhiyun struct tl_stream *stream,
878*4882a593Smuzhiyun unsigned int wb_idx_raw,
879*4882a593Smuzhiyun unsigned int wb_size)
880*4882a593Smuzhiyun {
881*4882a593Smuzhiyun unsigned int rb_idx_raw = atomic_read(&stream->rbi);
882*4882a593Smuzhiyun unsigned int wb_idx = wb_idx_raw % PACKET_COUNT;
883*4882a593Smuzhiyun
884*4882a593Smuzhiyun /* Set stream as flushed. */
885*4882a593Smuzhiyun atomic_set(&stream->autoflush_counter, -1);
886*4882a593Smuzhiyun
887*4882a593Smuzhiyun kbasep_tlstream_packet_header_update(
888*4882a593Smuzhiyun stream->buffer[wb_idx].data,
889*4882a593Smuzhiyun wb_size - PACKET_HEADER_SIZE);
890*4882a593Smuzhiyun
891*4882a593Smuzhiyun if (stream->numbered)
892*4882a593Smuzhiyun kbasep_tlstream_packet_number_update(
893*4882a593Smuzhiyun stream->buffer[wb_idx].data,
894*4882a593Smuzhiyun wb_idx_raw);
895*4882a593Smuzhiyun
896*4882a593Smuzhiyun /* Increasing write buffer index will expose this packet to the reader.
897*4882a593Smuzhiyun * As stream->lock is not taken on reader side we must make sure memory
898*4882a593Smuzhiyun * is updated correctly before this will happen. */
899*4882a593Smuzhiyun smp_wmb();
900*4882a593Smuzhiyun wb_idx_raw++;
901*4882a593Smuzhiyun atomic_set(&stream->wbi, wb_idx_raw);
902*4882a593Smuzhiyun
903*4882a593Smuzhiyun /* Inform user that packets are ready for reading. */
904*4882a593Smuzhiyun wake_up_interruptible(&tl_event_queue);
905*4882a593Smuzhiyun
906*4882a593Smuzhiyun /* Detect and mark overflow in this stream. */
907*4882a593Smuzhiyun if (PACKET_COUNT == wb_idx_raw - rb_idx_raw) {
908*4882a593Smuzhiyun /* Reader side depends on this increment to correctly handle
909*4882a593Smuzhiyun * overflows. The value shall be updated only if it was not
910*4882a593Smuzhiyun * modified by the reader. The data holding buffer will not be
911*4882a593Smuzhiyun * updated before stream->lock is released, however size of the
912*4882a593Smuzhiyun * buffer will. Make sure this increment is globally visible
913*4882a593Smuzhiyun * before information about selected write buffer size. */
914*4882a593Smuzhiyun atomic_cmpxchg(&stream->rbi, rb_idx_raw, rb_idx_raw + 1);
915*4882a593Smuzhiyun }
916*4882a593Smuzhiyun
917*4882a593Smuzhiyun wb_size = PACKET_HEADER_SIZE;
918*4882a593Smuzhiyun if (stream->numbered)
919*4882a593Smuzhiyun wb_size += PACKET_NUMBER_SIZE;
920*4882a593Smuzhiyun
921*4882a593Smuzhiyun return wb_size;
922*4882a593Smuzhiyun }
923*4882a593Smuzhiyun
924*4882a593Smuzhiyun /**
925*4882a593Smuzhiyun * kbasep_tlstream_msgbuf_acquire - lock selected stream and reserves buffer
926*4882a593Smuzhiyun * @stream_type: type of the stream that shall be locked
927*4882a593Smuzhiyun * @msg_size: message size
928*4882a593Smuzhiyun * @flags: pointer to store flags passed back on stream release
929*4882a593Smuzhiyun *
930*4882a593Smuzhiyun * Function will lock the stream and reserve the number of bytes requested
931*4882a593Smuzhiyun * in msg_size for the user.
932*4882a593Smuzhiyun *
933*4882a593Smuzhiyun * Return: pointer to the buffer where message can be stored
934*4882a593Smuzhiyun *
935*4882a593Smuzhiyun * Warning: Stream must be released with kbasep_tlstream_msgbuf_release().
936*4882a593Smuzhiyun * Only atomic operations are allowed while stream is locked
937*4882a593Smuzhiyun * (i.e. do not use any operation that may sleep).
938*4882a593Smuzhiyun */
kbasep_tlstream_msgbuf_acquire(enum tl_stream_type stream_type,size_t msg_size,unsigned long * flags)939*4882a593Smuzhiyun static char *kbasep_tlstream_msgbuf_acquire(
940*4882a593Smuzhiyun enum tl_stream_type stream_type,
941*4882a593Smuzhiyun size_t msg_size,
942*4882a593Smuzhiyun unsigned long *flags) __acquires(&stream->lock)
943*4882a593Smuzhiyun {
944*4882a593Smuzhiyun struct tl_stream *stream;
945*4882a593Smuzhiyun unsigned int wb_idx_raw;
946*4882a593Smuzhiyun unsigned int wb_idx;
947*4882a593Smuzhiyun size_t wb_size;
948*4882a593Smuzhiyun
949*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(TL_STREAM_TYPE_COUNT > stream_type);
950*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(
951*4882a593Smuzhiyun PACKET_SIZE - PACKET_HEADER_SIZE - PACKET_NUMBER_SIZE >=
952*4882a593Smuzhiyun msg_size);
953*4882a593Smuzhiyun
954*4882a593Smuzhiyun stream = tl_stream[stream_type];
955*4882a593Smuzhiyun
956*4882a593Smuzhiyun spin_lock_irqsave(&stream->lock, *flags);
957*4882a593Smuzhiyun
958*4882a593Smuzhiyun wb_idx_raw = atomic_read(&stream->wbi);
959*4882a593Smuzhiyun wb_idx = wb_idx_raw % PACKET_COUNT;
960*4882a593Smuzhiyun wb_size = atomic_read(&stream->buffer[wb_idx].size);
961*4882a593Smuzhiyun
962*4882a593Smuzhiyun /* Select next buffer if data will not fit into current one. */
963*4882a593Smuzhiyun if (PACKET_SIZE < wb_size + msg_size) {
964*4882a593Smuzhiyun wb_size = kbasep_tlstream_msgbuf_submit(
965*4882a593Smuzhiyun stream, wb_idx_raw, wb_size);
966*4882a593Smuzhiyun wb_idx = (wb_idx_raw + 1) % PACKET_COUNT;
967*4882a593Smuzhiyun }
968*4882a593Smuzhiyun
969*4882a593Smuzhiyun /* Reserve space in selected buffer. */
970*4882a593Smuzhiyun atomic_set(&stream->buffer[wb_idx].size, wb_size + msg_size);
971*4882a593Smuzhiyun
972*4882a593Smuzhiyun #if MALI_UNIT_TEST
973*4882a593Smuzhiyun atomic_add(msg_size, &tlstream_bytes_generated);
974*4882a593Smuzhiyun #endif /* MALI_UNIT_TEST */
975*4882a593Smuzhiyun
976*4882a593Smuzhiyun return &stream->buffer[wb_idx].data[wb_size];
977*4882a593Smuzhiyun }
978*4882a593Smuzhiyun
979*4882a593Smuzhiyun /**
980*4882a593Smuzhiyun * kbasep_tlstream_msgbuf_release - unlock selected stream
981*4882a593Smuzhiyun * @stream_type: type of the stream that shall be locked
982*4882a593Smuzhiyun * @flags: value obtained during stream acquire
983*4882a593Smuzhiyun *
984*4882a593Smuzhiyun * Function releases stream that has been previously locked with a call to
985*4882a593Smuzhiyun * kbasep_tlstream_msgbuf_acquire().
986*4882a593Smuzhiyun */
kbasep_tlstream_msgbuf_release(enum tl_stream_type stream_type,unsigned long flags)987*4882a593Smuzhiyun static void kbasep_tlstream_msgbuf_release(
988*4882a593Smuzhiyun enum tl_stream_type stream_type,
989*4882a593Smuzhiyun unsigned long flags) __releases(&stream->lock)
990*4882a593Smuzhiyun {
991*4882a593Smuzhiyun struct tl_stream *stream;
992*4882a593Smuzhiyun
993*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(TL_STREAM_TYPE_COUNT > stream_type);
994*4882a593Smuzhiyun
995*4882a593Smuzhiyun stream = tl_stream[stream_type];
996*4882a593Smuzhiyun
997*4882a593Smuzhiyun /* Mark stream as containing unflushed data. */
998*4882a593Smuzhiyun atomic_set(&stream->autoflush_counter, 0);
999*4882a593Smuzhiyun
1000*4882a593Smuzhiyun spin_unlock_irqrestore(&stream->lock, flags);
1001*4882a593Smuzhiyun }
1002*4882a593Smuzhiyun
1003*4882a593Smuzhiyun /*****************************************************************************/
1004*4882a593Smuzhiyun
1005*4882a593Smuzhiyun /**
1006*4882a593Smuzhiyun * kbasep_tlstream_flush_stream - flush stream
1007*4882a593Smuzhiyun * @stype: type of stream to be flushed
1008*4882a593Smuzhiyun *
1009*4882a593Smuzhiyun * Flush pending data in timeline stream.
1010*4882a593Smuzhiyun */
kbasep_tlstream_flush_stream(enum tl_stream_type stype)1011*4882a593Smuzhiyun static void kbasep_tlstream_flush_stream(enum tl_stream_type stype)
1012*4882a593Smuzhiyun {
1013*4882a593Smuzhiyun struct tl_stream *stream = tl_stream[stype];
1014*4882a593Smuzhiyun unsigned long flags;
1015*4882a593Smuzhiyun unsigned int wb_idx_raw;
1016*4882a593Smuzhiyun unsigned int wb_idx;
1017*4882a593Smuzhiyun size_t wb_size;
1018*4882a593Smuzhiyun size_t min_size = PACKET_HEADER_SIZE;
1019*4882a593Smuzhiyun
1020*4882a593Smuzhiyun if (stream->numbered)
1021*4882a593Smuzhiyun min_size += PACKET_NUMBER_SIZE;
1022*4882a593Smuzhiyun
1023*4882a593Smuzhiyun spin_lock_irqsave(&stream->lock, flags);
1024*4882a593Smuzhiyun
1025*4882a593Smuzhiyun wb_idx_raw = atomic_read(&stream->wbi);
1026*4882a593Smuzhiyun wb_idx = wb_idx_raw % PACKET_COUNT;
1027*4882a593Smuzhiyun wb_size = atomic_read(&stream->buffer[wb_idx].size);
1028*4882a593Smuzhiyun
1029*4882a593Smuzhiyun if (wb_size > min_size) {
1030*4882a593Smuzhiyun wb_size = kbasep_tlstream_msgbuf_submit(
1031*4882a593Smuzhiyun stream, wb_idx_raw, wb_size);
1032*4882a593Smuzhiyun wb_idx = (wb_idx_raw + 1) % PACKET_COUNT;
1033*4882a593Smuzhiyun atomic_set(&stream->buffer[wb_idx].size, wb_size);
1034*4882a593Smuzhiyun }
1035*4882a593Smuzhiyun spin_unlock_irqrestore(&stream->lock, flags);
1036*4882a593Smuzhiyun }
1037*4882a593Smuzhiyun
1038*4882a593Smuzhiyun /**
1039*4882a593Smuzhiyun * kbasep_tlstream_autoflush_timer_callback - autoflush timer callback
1040*4882a593Smuzhiyun * @data: unused
1041*4882a593Smuzhiyun *
1042*4882a593Smuzhiyun * Timer is executed periodically to check if any of the stream contains
1043*4882a593Smuzhiyun * buffer ready to be submitted to user space.
1044*4882a593Smuzhiyun */
kbasep_tlstream_autoflush_timer_callback(struct timer_list * t)1045*4882a593Smuzhiyun static void kbasep_tlstream_autoflush_timer_callback(struct timer_list *t)
1046*4882a593Smuzhiyun {
1047*4882a593Smuzhiyun enum tl_stream_type stype;
1048*4882a593Smuzhiyun int rcode;
1049*4882a593Smuzhiyun
1050*4882a593Smuzhiyun CSTD_UNUSED(t);
1051*4882a593Smuzhiyun
1052*4882a593Smuzhiyun for (stype = 0; stype < TL_STREAM_TYPE_COUNT; stype++) {
1053*4882a593Smuzhiyun struct tl_stream *stream = tl_stream[stype];
1054*4882a593Smuzhiyun unsigned long flags;
1055*4882a593Smuzhiyun unsigned int wb_idx_raw;
1056*4882a593Smuzhiyun unsigned int wb_idx;
1057*4882a593Smuzhiyun size_t wb_size;
1058*4882a593Smuzhiyun size_t min_size = PACKET_HEADER_SIZE;
1059*4882a593Smuzhiyun
1060*4882a593Smuzhiyun int af_cnt = atomic_read(&stream->autoflush_counter);
1061*4882a593Smuzhiyun
1062*4882a593Smuzhiyun /* Check if stream contain unflushed data. */
1063*4882a593Smuzhiyun if (0 > af_cnt)
1064*4882a593Smuzhiyun continue;
1065*4882a593Smuzhiyun
1066*4882a593Smuzhiyun /* Check if stream should be flushed now. */
1067*4882a593Smuzhiyun if (af_cnt != atomic_cmpxchg(
1068*4882a593Smuzhiyun &stream->autoflush_counter,
1069*4882a593Smuzhiyun af_cnt,
1070*4882a593Smuzhiyun af_cnt + 1))
1071*4882a593Smuzhiyun continue;
1072*4882a593Smuzhiyun if (!af_cnt)
1073*4882a593Smuzhiyun continue;
1074*4882a593Smuzhiyun
1075*4882a593Smuzhiyun /* Autoflush this stream. */
1076*4882a593Smuzhiyun if (stream->numbered)
1077*4882a593Smuzhiyun min_size += PACKET_NUMBER_SIZE;
1078*4882a593Smuzhiyun
1079*4882a593Smuzhiyun spin_lock_irqsave(&stream->lock, flags);
1080*4882a593Smuzhiyun
1081*4882a593Smuzhiyun wb_idx_raw = atomic_read(&stream->wbi);
1082*4882a593Smuzhiyun wb_idx = wb_idx_raw % PACKET_COUNT;
1083*4882a593Smuzhiyun wb_size = atomic_read(&stream->buffer[wb_idx].size);
1084*4882a593Smuzhiyun
1085*4882a593Smuzhiyun if (wb_size > min_size) {
1086*4882a593Smuzhiyun wb_size = kbasep_tlstream_msgbuf_submit(
1087*4882a593Smuzhiyun stream, wb_idx_raw, wb_size);
1088*4882a593Smuzhiyun wb_idx = (wb_idx_raw + 1) % PACKET_COUNT;
1089*4882a593Smuzhiyun atomic_set(&stream->buffer[wb_idx].size,
1090*4882a593Smuzhiyun wb_size);
1091*4882a593Smuzhiyun }
1092*4882a593Smuzhiyun spin_unlock_irqrestore(&stream->lock, flags);
1093*4882a593Smuzhiyun }
1094*4882a593Smuzhiyun
1095*4882a593Smuzhiyun if (atomic_read(&autoflush_timer_active))
1096*4882a593Smuzhiyun rcode = mod_timer(
1097*4882a593Smuzhiyun &autoflush_timer,
1098*4882a593Smuzhiyun jiffies + msecs_to_jiffies(AUTOFLUSH_INTERVAL));
1099*4882a593Smuzhiyun CSTD_UNUSED(rcode);
1100*4882a593Smuzhiyun }
1101*4882a593Smuzhiyun
1102*4882a593Smuzhiyun /**
1103*4882a593Smuzhiyun * kbasep_tlstream_packet_pending - check timeline streams for pending packets
1104*4882a593Smuzhiyun * @stype: pointer to variable where stream type will be placed
1105*4882a593Smuzhiyun * @rb_idx_raw: pointer to variable where read buffer index will be placed
1106*4882a593Smuzhiyun *
1107*4882a593Smuzhiyun * Function checks all streams for pending packets. It will stop as soon as
1108*4882a593Smuzhiyun * packet ready to be submitted to user space is detected. Variables under
1109*4882a593Smuzhiyun * pointers, passed as the parameters to this function will be updated with
1110*4882a593Smuzhiyun * values pointing to right stream and buffer.
1111*4882a593Smuzhiyun *
1112*4882a593Smuzhiyun * Return: non-zero if any of timeline streams has at last one packet ready
1113*4882a593Smuzhiyun */
kbasep_tlstream_packet_pending(enum tl_stream_type * stype,unsigned int * rb_idx_raw)1114*4882a593Smuzhiyun static int kbasep_tlstream_packet_pending(
1115*4882a593Smuzhiyun enum tl_stream_type *stype,
1116*4882a593Smuzhiyun unsigned int *rb_idx_raw)
1117*4882a593Smuzhiyun {
1118*4882a593Smuzhiyun int pending = 0;
1119*4882a593Smuzhiyun
1120*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(stype);
1121*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(rb_idx_raw);
1122*4882a593Smuzhiyun
1123*4882a593Smuzhiyun for (
1124*4882a593Smuzhiyun *stype = 0;
1125*4882a593Smuzhiyun (*stype < TL_STREAM_TYPE_COUNT) && !pending;
1126*4882a593Smuzhiyun (*stype)++) {
1127*4882a593Smuzhiyun if (NULL != tl_stream[*stype]) {
1128*4882a593Smuzhiyun *rb_idx_raw = atomic_read(&tl_stream[*stype]->rbi);
1129*4882a593Smuzhiyun /* Read buffer index may be updated by writer in case of
1130*4882a593Smuzhiyun * overflow. Read and write buffer indexes must be
1131*4882a593Smuzhiyun * loaded in correct order. */
1132*4882a593Smuzhiyun smp_rmb();
1133*4882a593Smuzhiyun if (atomic_read(&tl_stream[*stype]->wbi) != *rb_idx_raw)
1134*4882a593Smuzhiyun pending = 1;
1135*4882a593Smuzhiyun }
1136*4882a593Smuzhiyun }
1137*4882a593Smuzhiyun (*stype)--;
1138*4882a593Smuzhiyun
1139*4882a593Smuzhiyun return pending;
1140*4882a593Smuzhiyun }
1141*4882a593Smuzhiyun
1142*4882a593Smuzhiyun /**
1143*4882a593Smuzhiyun * kbasep_tlstream_read - copy data from streams to buffer provided by user
1144*4882a593Smuzhiyun * @filp: pointer to file structure (unused)
1145*4882a593Smuzhiyun * @buffer: pointer to the buffer provided by user
1146*4882a593Smuzhiyun * @size: maximum amount of data that can be stored in the buffer
1147*4882a593Smuzhiyun * @f_pos: pointer to file offset (unused)
1148*4882a593Smuzhiyun *
1149*4882a593Smuzhiyun * Return: number of bytes stored in the buffer
1150*4882a593Smuzhiyun */
kbasep_tlstream_read(struct file * filp,char __user * buffer,size_t size,loff_t * f_pos)1151*4882a593Smuzhiyun static ssize_t kbasep_tlstream_read(
1152*4882a593Smuzhiyun struct file *filp,
1153*4882a593Smuzhiyun char __user *buffer,
1154*4882a593Smuzhiyun size_t size,
1155*4882a593Smuzhiyun loff_t *f_pos)
1156*4882a593Smuzhiyun {
1157*4882a593Smuzhiyun ssize_t copy_len = 0;
1158*4882a593Smuzhiyun
1159*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(filp);
1160*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(f_pos);
1161*4882a593Smuzhiyun
1162*4882a593Smuzhiyun if (!buffer)
1163*4882a593Smuzhiyun return -EINVAL;
1164*4882a593Smuzhiyun
1165*4882a593Smuzhiyun if ((0 > *f_pos) || (PACKET_SIZE > size))
1166*4882a593Smuzhiyun return -EINVAL;
1167*4882a593Smuzhiyun
1168*4882a593Smuzhiyun mutex_lock(&tl_reader_lock);
1169*4882a593Smuzhiyun
1170*4882a593Smuzhiyun while (copy_len < size) {
1171*4882a593Smuzhiyun enum tl_stream_type stype;
1172*4882a593Smuzhiyun unsigned int rb_idx_raw = 0;
1173*4882a593Smuzhiyun unsigned int rb_idx;
1174*4882a593Smuzhiyun size_t rb_size;
1175*4882a593Smuzhiyun
1176*4882a593Smuzhiyun /* If we don't have any data yet, wait for packet to be
1177*4882a593Smuzhiyun * submitted. If we already read some packets and there is no
1178*4882a593Smuzhiyun * packet pending return back to user. */
1179*4882a593Smuzhiyun if (0 < copy_len) {
1180*4882a593Smuzhiyun if (!kbasep_tlstream_packet_pending(
1181*4882a593Smuzhiyun &stype,
1182*4882a593Smuzhiyun &rb_idx_raw))
1183*4882a593Smuzhiyun break;
1184*4882a593Smuzhiyun } else {
1185*4882a593Smuzhiyun if (wait_event_interruptible(
1186*4882a593Smuzhiyun tl_event_queue,
1187*4882a593Smuzhiyun kbasep_tlstream_packet_pending(
1188*4882a593Smuzhiyun &stype,
1189*4882a593Smuzhiyun &rb_idx_raw))) {
1190*4882a593Smuzhiyun copy_len = -ERESTARTSYS;
1191*4882a593Smuzhiyun break;
1192*4882a593Smuzhiyun }
1193*4882a593Smuzhiyun }
1194*4882a593Smuzhiyun
1195*4882a593Smuzhiyun /* Check if this packet fits into the user buffer.
1196*4882a593Smuzhiyun * If so copy its content. */
1197*4882a593Smuzhiyun rb_idx = rb_idx_raw % PACKET_COUNT;
1198*4882a593Smuzhiyun rb_size = atomic_read(&tl_stream[stype]->buffer[rb_idx].size);
1199*4882a593Smuzhiyun if (rb_size > size - copy_len)
1200*4882a593Smuzhiyun break;
1201*4882a593Smuzhiyun if (copy_to_user(
1202*4882a593Smuzhiyun &buffer[copy_len],
1203*4882a593Smuzhiyun tl_stream[stype]->buffer[rb_idx].data,
1204*4882a593Smuzhiyun rb_size)) {
1205*4882a593Smuzhiyun copy_len = -EFAULT;
1206*4882a593Smuzhiyun break;
1207*4882a593Smuzhiyun }
1208*4882a593Smuzhiyun
1209*4882a593Smuzhiyun /* If the rbi still points to the packet we just processed
1210*4882a593Smuzhiyun * then there was no overflow so we add the copied size to
1211*4882a593Smuzhiyun * copy_len and move rbi on to the next packet
1212*4882a593Smuzhiyun */
1213*4882a593Smuzhiyun smp_rmb();
1214*4882a593Smuzhiyun if (atomic_read(&tl_stream[stype]->rbi) == rb_idx_raw) {
1215*4882a593Smuzhiyun copy_len += rb_size;
1216*4882a593Smuzhiyun atomic_inc(&tl_stream[stype]->rbi);
1217*4882a593Smuzhiyun
1218*4882a593Smuzhiyun #if MALI_UNIT_TEST
1219*4882a593Smuzhiyun atomic_add(rb_size, &tlstream_bytes_collected);
1220*4882a593Smuzhiyun #endif /* MALI_UNIT_TEST */
1221*4882a593Smuzhiyun }
1222*4882a593Smuzhiyun }
1223*4882a593Smuzhiyun
1224*4882a593Smuzhiyun mutex_unlock(&tl_reader_lock);
1225*4882a593Smuzhiyun
1226*4882a593Smuzhiyun return copy_len;
1227*4882a593Smuzhiyun }
1228*4882a593Smuzhiyun
1229*4882a593Smuzhiyun /**
1230*4882a593Smuzhiyun * kbasep_tlstream_poll - poll timeline stream for packets
1231*4882a593Smuzhiyun * @filp: pointer to file structure
1232*4882a593Smuzhiyun * @wait: pointer to poll table
1233*4882a593Smuzhiyun * Return: POLLIN if data can be read without blocking, otherwise zero
1234*4882a593Smuzhiyun */
kbasep_tlstream_poll(struct file * filp,poll_table * wait)1235*4882a593Smuzhiyun static unsigned int kbasep_tlstream_poll(struct file *filp, poll_table *wait)
1236*4882a593Smuzhiyun {
1237*4882a593Smuzhiyun enum tl_stream_type stream_type;
1238*4882a593Smuzhiyun unsigned int rb_idx;
1239*4882a593Smuzhiyun
1240*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(filp);
1241*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(wait);
1242*4882a593Smuzhiyun
1243*4882a593Smuzhiyun poll_wait(filp, &tl_event_queue, wait);
1244*4882a593Smuzhiyun if (kbasep_tlstream_packet_pending(&stream_type, &rb_idx))
1245*4882a593Smuzhiyun return POLLIN;
1246*4882a593Smuzhiyun return 0;
1247*4882a593Smuzhiyun }
1248*4882a593Smuzhiyun
1249*4882a593Smuzhiyun /**
1250*4882a593Smuzhiyun * kbasep_tlstream_release - release timeline stream descriptor
1251*4882a593Smuzhiyun * @inode: pointer to inode structure
1252*4882a593Smuzhiyun * @filp: pointer to file structure
1253*4882a593Smuzhiyun *
1254*4882a593Smuzhiyun * Return always return zero
1255*4882a593Smuzhiyun */
kbasep_tlstream_release(struct inode * inode,struct file * filp)1256*4882a593Smuzhiyun static int kbasep_tlstream_release(struct inode *inode, struct file *filp)
1257*4882a593Smuzhiyun {
1258*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(inode);
1259*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(filp);
1260*4882a593Smuzhiyun CSTD_UNUSED(inode);
1261*4882a593Smuzhiyun CSTD_UNUSED(filp);
1262*4882a593Smuzhiyun
1263*4882a593Smuzhiyun /* Stop autoflush timer before releasing access to streams. */
1264*4882a593Smuzhiyun atomic_set(&autoflush_timer_active, 0);
1265*4882a593Smuzhiyun del_timer_sync(&autoflush_timer);
1266*4882a593Smuzhiyun
1267*4882a593Smuzhiyun atomic_set(&kbase_tlstream_enabled, 0);
1268*4882a593Smuzhiyun return 0;
1269*4882a593Smuzhiyun }
1270*4882a593Smuzhiyun
1271*4882a593Smuzhiyun /**
1272*4882a593Smuzhiyun * kbasep_tlstream_timeline_header - prepare timeline header stream packet
1273*4882a593Smuzhiyun * @stream_type: type of the stream that will carry header data
1274*4882a593Smuzhiyun * @tp_desc: pointer to array with tracepoint descriptors
1275*4882a593Smuzhiyun * @tp_count: number of descriptors in the given array
1276*4882a593Smuzhiyun *
1277*4882a593Smuzhiyun * Functions fills in information about tracepoints stored in body stream
1278*4882a593Smuzhiyun * associated with this header stream.
1279*4882a593Smuzhiyun */
kbasep_tlstream_timeline_header(enum tl_stream_type stream_type,const struct tp_desc * tp_desc,u32 tp_count)1280*4882a593Smuzhiyun static void kbasep_tlstream_timeline_header(
1281*4882a593Smuzhiyun enum tl_stream_type stream_type,
1282*4882a593Smuzhiyun const struct tp_desc *tp_desc,
1283*4882a593Smuzhiyun u32 tp_count)
1284*4882a593Smuzhiyun {
1285*4882a593Smuzhiyun const u8 tv = SWTRACE_VERSION; /* protocol version */
1286*4882a593Smuzhiyun const u8 ps = sizeof(void *); /* pointer size */
1287*4882a593Smuzhiyun size_t msg_size = sizeof(tv) + sizeof(ps) + sizeof(tp_count);
1288*4882a593Smuzhiyun char *buffer;
1289*4882a593Smuzhiyun size_t pos = 0;
1290*4882a593Smuzhiyun unsigned long flags;
1291*4882a593Smuzhiyun unsigned int i;
1292*4882a593Smuzhiyun
1293*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(TL_STREAM_TYPE_COUNT > stream_type);
1294*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(tp_desc);
1295*4882a593Smuzhiyun
1296*4882a593Smuzhiyun /* Calculate the size of the timeline message. */
1297*4882a593Smuzhiyun for (i = 0; i < tp_count; i++) {
1298*4882a593Smuzhiyun msg_size += sizeof(tp_desc[i].id);
1299*4882a593Smuzhiyun msg_size +=
1300*4882a593Smuzhiyun strnlen(tp_desc[i].id_str, STRLEN_MAX) +
1301*4882a593Smuzhiyun sizeof(char) + sizeof(u32);
1302*4882a593Smuzhiyun msg_size +=
1303*4882a593Smuzhiyun strnlen(tp_desc[i].name, STRLEN_MAX) +
1304*4882a593Smuzhiyun sizeof(char) + sizeof(u32);
1305*4882a593Smuzhiyun msg_size +=
1306*4882a593Smuzhiyun strnlen(tp_desc[i].arg_types, STRLEN_MAX) +
1307*4882a593Smuzhiyun sizeof(char) + sizeof(u32);
1308*4882a593Smuzhiyun msg_size +=
1309*4882a593Smuzhiyun strnlen(tp_desc[i].arg_names, STRLEN_MAX) +
1310*4882a593Smuzhiyun sizeof(char) + sizeof(u32);
1311*4882a593Smuzhiyun }
1312*4882a593Smuzhiyun
1313*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(PACKET_SIZE - PACKET_HEADER_SIZE >= msg_size);
1314*4882a593Smuzhiyun
1315*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(stream_type, msg_size, &flags);
1316*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1317*4882a593Smuzhiyun
1318*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &tv, sizeof(tv));
1319*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &ps, sizeof(ps));
1320*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1321*4882a593Smuzhiyun buffer, pos, &tp_count, sizeof(tp_count));
1322*4882a593Smuzhiyun
1323*4882a593Smuzhiyun for (i = 0; i < tp_count; i++) {
1324*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1325*4882a593Smuzhiyun buffer, pos,
1326*4882a593Smuzhiyun &tp_desc[i].id, sizeof(tp_desc[i].id));
1327*4882a593Smuzhiyun pos = kbasep_tlstream_write_string(
1328*4882a593Smuzhiyun buffer, pos,
1329*4882a593Smuzhiyun tp_desc[i].id_str, msg_size - pos);
1330*4882a593Smuzhiyun pos = kbasep_tlstream_write_string(
1331*4882a593Smuzhiyun buffer, pos,
1332*4882a593Smuzhiyun tp_desc[i].name, msg_size - pos);
1333*4882a593Smuzhiyun pos = kbasep_tlstream_write_string(
1334*4882a593Smuzhiyun buffer, pos,
1335*4882a593Smuzhiyun tp_desc[i].arg_types, msg_size - pos);
1336*4882a593Smuzhiyun pos = kbasep_tlstream_write_string(
1337*4882a593Smuzhiyun buffer, pos,
1338*4882a593Smuzhiyun tp_desc[i].arg_names, msg_size - pos);
1339*4882a593Smuzhiyun }
1340*4882a593Smuzhiyun
1341*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1342*4882a593Smuzhiyun
1343*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(stream_type, flags);
1344*4882a593Smuzhiyun
1345*4882a593Smuzhiyun /* We don't expect any more data to be read in this stream.
1346*4882a593Smuzhiyun * As header stream must be read before its associated body stream,
1347*4882a593Smuzhiyun * make this packet visible to the user straightaway. */
1348*4882a593Smuzhiyun kbasep_tlstream_flush_stream(stream_type);
1349*4882a593Smuzhiyun }
1350*4882a593Smuzhiyun
1351*4882a593Smuzhiyun /*****************************************************************************/
1352*4882a593Smuzhiyun
kbase_tlstream_init(void)1353*4882a593Smuzhiyun int kbase_tlstream_init(void)
1354*4882a593Smuzhiyun {
1355*4882a593Smuzhiyun enum tl_stream_type i;
1356*4882a593Smuzhiyun
1357*4882a593Smuzhiyun /* Prepare stream structures. */
1358*4882a593Smuzhiyun for (i = 0; i < TL_STREAM_TYPE_COUNT; i++) {
1359*4882a593Smuzhiyun tl_stream[i] = kmalloc(sizeof(**tl_stream), GFP_KERNEL);
1360*4882a593Smuzhiyun if (!tl_stream[i])
1361*4882a593Smuzhiyun break;
1362*4882a593Smuzhiyun kbasep_timeline_stream_init(tl_stream[i], i);
1363*4882a593Smuzhiyun }
1364*4882a593Smuzhiyun if (TL_STREAM_TYPE_COUNT > i) {
1365*4882a593Smuzhiyun for (; i > 0; i--) {
1366*4882a593Smuzhiyun kbasep_timeline_stream_term(tl_stream[i - 1]);
1367*4882a593Smuzhiyun kfree(tl_stream[i - 1]);
1368*4882a593Smuzhiyun }
1369*4882a593Smuzhiyun return -ENOMEM;
1370*4882a593Smuzhiyun }
1371*4882a593Smuzhiyun
1372*4882a593Smuzhiyun /* Initialize autoflush timer. */
1373*4882a593Smuzhiyun atomic_set(&autoflush_timer_active, 0);
1374*4882a593Smuzhiyun timer_setup(&autoflush_timer,
1375*4882a593Smuzhiyun kbasep_tlstream_autoflush_timer_callback,
1376*4882a593Smuzhiyun 0);
1377*4882a593Smuzhiyun
1378*4882a593Smuzhiyun return 0;
1379*4882a593Smuzhiyun }
1380*4882a593Smuzhiyun
kbase_tlstream_term(void)1381*4882a593Smuzhiyun void kbase_tlstream_term(void)
1382*4882a593Smuzhiyun {
1383*4882a593Smuzhiyun enum tl_stream_type i;
1384*4882a593Smuzhiyun
1385*4882a593Smuzhiyun for (i = 0; i < TL_STREAM_TYPE_COUNT; i++) {
1386*4882a593Smuzhiyun kbasep_timeline_stream_term(tl_stream[i]);
1387*4882a593Smuzhiyun kfree(tl_stream[i]);
1388*4882a593Smuzhiyun }
1389*4882a593Smuzhiyun }
1390*4882a593Smuzhiyun
kbase_create_timeline_objects(struct kbase_context * kctx)1391*4882a593Smuzhiyun static void kbase_create_timeline_objects(struct kbase_context *kctx)
1392*4882a593Smuzhiyun {
1393*4882a593Smuzhiyun struct kbase_device *kbdev = kctx->kbdev;
1394*4882a593Smuzhiyun unsigned int lpu_id;
1395*4882a593Smuzhiyun unsigned int as_nr;
1396*4882a593Smuzhiyun struct kbasep_kctx_list_element *element;
1397*4882a593Smuzhiyun
1398*4882a593Smuzhiyun /* Create LPU objects. */
1399*4882a593Smuzhiyun for (lpu_id = 0; lpu_id < kbdev->gpu_props.num_job_slots; lpu_id++) {
1400*4882a593Smuzhiyun u32 *lpu =
1401*4882a593Smuzhiyun &kbdev->gpu_props.props.raw_props.js_features[lpu_id];
1402*4882a593Smuzhiyun KBASE_TLSTREAM_TL_SUMMARY_NEW_LPU(lpu, lpu_id, *lpu);
1403*4882a593Smuzhiyun }
1404*4882a593Smuzhiyun
1405*4882a593Smuzhiyun /* Create Address Space objects. */
1406*4882a593Smuzhiyun for (as_nr = 0; as_nr < kbdev->nr_hw_address_spaces; as_nr++)
1407*4882a593Smuzhiyun KBASE_TLSTREAM_TL_SUMMARY_NEW_AS(&kbdev->as[as_nr], as_nr);
1408*4882a593Smuzhiyun
1409*4882a593Smuzhiyun /* Create GPU object and make it retain all LPUs and address spaces. */
1410*4882a593Smuzhiyun KBASE_TLSTREAM_TL_SUMMARY_NEW_GPU(
1411*4882a593Smuzhiyun kbdev,
1412*4882a593Smuzhiyun kbdev->gpu_props.props.raw_props.gpu_id,
1413*4882a593Smuzhiyun kbdev->gpu_props.num_cores);
1414*4882a593Smuzhiyun
1415*4882a593Smuzhiyun for (lpu_id = 0; lpu_id < kbdev->gpu_props.num_job_slots; lpu_id++) {
1416*4882a593Smuzhiyun void *lpu =
1417*4882a593Smuzhiyun &kbdev->gpu_props.props.raw_props.js_features[lpu_id];
1418*4882a593Smuzhiyun KBASE_TLSTREAM_TL_SUMMARY_LIFELINK_LPU_GPU(lpu, kbdev);
1419*4882a593Smuzhiyun }
1420*4882a593Smuzhiyun for (as_nr = 0; as_nr < kbdev->nr_hw_address_spaces; as_nr++)
1421*4882a593Smuzhiyun KBASE_TLSTREAM_TL_SUMMARY_LIFELINK_AS_GPU(
1422*4882a593Smuzhiyun &kbdev->as[as_nr],
1423*4882a593Smuzhiyun kbdev);
1424*4882a593Smuzhiyun
1425*4882a593Smuzhiyun /* Create object for each known context. */
1426*4882a593Smuzhiyun mutex_lock(&kbdev->kctx_list_lock);
1427*4882a593Smuzhiyun list_for_each_entry(element, &kbdev->kctx_list, link) {
1428*4882a593Smuzhiyun KBASE_TLSTREAM_TL_SUMMARY_NEW_CTX(
1429*4882a593Smuzhiyun element->kctx,
1430*4882a593Smuzhiyun (u32)(element->kctx->id),
1431*4882a593Smuzhiyun (u32)(element->kctx->tgid));
1432*4882a593Smuzhiyun }
1433*4882a593Smuzhiyun /* Before releasing the lock, reset body stream buffers.
1434*4882a593Smuzhiyun * This will prevent context creation message to be directed to both
1435*4882a593Smuzhiyun * summary and body stream.
1436*4882a593Smuzhiyun */
1437*4882a593Smuzhiyun kbase_tlstream_reset_body_streams();
1438*4882a593Smuzhiyun mutex_unlock(&kbdev->kctx_list_lock);
1439*4882a593Smuzhiyun /* Static object are placed into summary packet that needs to be
1440*4882a593Smuzhiyun * transmitted first. Flush all streams to make it available to
1441*4882a593Smuzhiyun * user space.
1442*4882a593Smuzhiyun */
1443*4882a593Smuzhiyun kbase_tlstream_flush_streams();
1444*4882a593Smuzhiyun }
1445*4882a593Smuzhiyun
kbase_tlstream_acquire(struct kbase_context * kctx,u32 flags)1446*4882a593Smuzhiyun int kbase_tlstream_acquire(struct kbase_context *kctx, u32 flags)
1447*4882a593Smuzhiyun {
1448*4882a593Smuzhiyun int ret;
1449*4882a593Smuzhiyun u32 tlstream_enabled = TLSTREAM_ENABLED | flags;
1450*4882a593Smuzhiyun
1451*4882a593Smuzhiyun if (0 == atomic_cmpxchg(&kbase_tlstream_enabled, 0, tlstream_enabled)) {
1452*4882a593Smuzhiyun int rcode;
1453*4882a593Smuzhiyun
1454*4882a593Smuzhiyun ret = anon_inode_getfd(
1455*4882a593Smuzhiyun "[mali_tlstream]",
1456*4882a593Smuzhiyun &kbasep_tlstream_fops,
1457*4882a593Smuzhiyun kctx,
1458*4882a593Smuzhiyun O_RDONLY | O_CLOEXEC);
1459*4882a593Smuzhiyun if (ret < 0) {
1460*4882a593Smuzhiyun atomic_set(&kbase_tlstream_enabled, 0);
1461*4882a593Smuzhiyun return ret;
1462*4882a593Smuzhiyun }
1463*4882a593Smuzhiyun
1464*4882a593Smuzhiyun /* Reset and initialize header streams. */
1465*4882a593Smuzhiyun kbasep_timeline_stream_reset(
1466*4882a593Smuzhiyun tl_stream[TL_STREAM_TYPE_OBJ_HEADER]);
1467*4882a593Smuzhiyun kbasep_timeline_stream_reset(
1468*4882a593Smuzhiyun tl_stream[TL_STREAM_TYPE_OBJ_SUMMARY]);
1469*4882a593Smuzhiyun kbasep_timeline_stream_reset(
1470*4882a593Smuzhiyun tl_stream[TL_STREAM_TYPE_AUX_HEADER]);
1471*4882a593Smuzhiyun kbasep_tlstream_timeline_header(
1472*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ_HEADER,
1473*4882a593Smuzhiyun tp_desc_obj,
1474*4882a593Smuzhiyun ARRAY_SIZE(tp_desc_obj));
1475*4882a593Smuzhiyun kbasep_tlstream_timeline_header(
1476*4882a593Smuzhiyun TL_STREAM_TYPE_AUX_HEADER,
1477*4882a593Smuzhiyun tp_desc_aux,
1478*4882a593Smuzhiyun ARRAY_SIZE(tp_desc_aux));
1479*4882a593Smuzhiyun
1480*4882a593Smuzhiyun /* Start autoflush timer. */
1481*4882a593Smuzhiyun atomic_set(&autoflush_timer_active, 1);
1482*4882a593Smuzhiyun rcode = mod_timer(
1483*4882a593Smuzhiyun &autoflush_timer,
1484*4882a593Smuzhiyun jiffies + msecs_to_jiffies(AUTOFLUSH_INTERVAL));
1485*4882a593Smuzhiyun CSTD_UNUSED(rcode);
1486*4882a593Smuzhiyun
1487*4882a593Smuzhiyun /* If job dumping is enabled, readjust the software event's
1488*4882a593Smuzhiyun * timeout as the default value of 3 seconds is often
1489*4882a593Smuzhiyun * insufficient. */
1490*4882a593Smuzhiyun if (flags & BASE_TLSTREAM_JOB_DUMPING_ENABLED) {
1491*4882a593Smuzhiyun dev_info(kctx->kbdev->dev,
1492*4882a593Smuzhiyun "Job dumping is enabled, readjusting the software event's timeout\n");
1493*4882a593Smuzhiyun atomic_set(&kctx->kbdev->js_data.soft_job_timeout_ms,
1494*4882a593Smuzhiyun 1800000);
1495*4882a593Smuzhiyun }
1496*4882a593Smuzhiyun
1497*4882a593Smuzhiyun /* Summary stream was cleared during acquire.
1498*4882a593Smuzhiyun * Create static timeline objects that will be
1499*4882a593Smuzhiyun * read by client.
1500*4882a593Smuzhiyun */
1501*4882a593Smuzhiyun kbase_create_timeline_objects(kctx);
1502*4882a593Smuzhiyun
1503*4882a593Smuzhiyun } else {
1504*4882a593Smuzhiyun ret = -EBUSY;
1505*4882a593Smuzhiyun }
1506*4882a593Smuzhiyun
1507*4882a593Smuzhiyun return ret;
1508*4882a593Smuzhiyun }
1509*4882a593Smuzhiyun
kbase_tlstream_flush_streams(void)1510*4882a593Smuzhiyun void kbase_tlstream_flush_streams(void)
1511*4882a593Smuzhiyun {
1512*4882a593Smuzhiyun enum tl_stream_type stype;
1513*4882a593Smuzhiyun
1514*4882a593Smuzhiyun for (stype = 0; stype < TL_STREAM_TYPE_COUNT; stype++)
1515*4882a593Smuzhiyun kbasep_tlstream_flush_stream(stype);
1516*4882a593Smuzhiyun }
1517*4882a593Smuzhiyun
kbase_tlstream_reset_body_streams(void)1518*4882a593Smuzhiyun void kbase_tlstream_reset_body_streams(void)
1519*4882a593Smuzhiyun {
1520*4882a593Smuzhiyun kbasep_timeline_stream_reset(
1521*4882a593Smuzhiyun tl_stream[TL_STREAM_TYPE_OBJ]);
1522*4882a593Smuzhiyun kbasep_timeline_stream_reset(
1523*4882a593Smuzhiyun tl_stream[TL_STREAM_TYPE_AUX]);
1524*4882a593Smuzhiyun }
1525*4882a593Smuzhiyun
1526*4882a593Smuzhiyun #if MALI_UNIT_TEST
kbase_tlstream_stats(u32 * bytes_collected,u32 * bytes_generated)1527*4882a593Smuzhiyun void kbase_tlstream_stats(u32 *bytes_collected, u32 *bytes_generated)
1528*4882a593Smuzhiyun {
1529*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(bytes_collected);
1530*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(bytes_generated);
1531*4882a593Smuzhiyun *bytes_collected = atomic_read(&tlstream_bytes_collected);
1532*4882a593Smuzhiyun *bytes_generated = atomic_read(&tlstream_bytes_generated);
1533*4882a593Smuzhiyun }
1534*4882a593Smuzhiyun #endif /* MALI_UNIT_TEST */
1535*4882a593Smuzhiyun
1536*4882a593Smuzhiyun /*****************************************************************************/
1537*4882a593Smuzhiyun
__kbase_tlstream_tl_summary_new_ctx(void * context,u32 nr,u32 tgid)1538*4882a593Smuzhiyun void __kbase_tlstream_tl_summary_new_ctx(void *context, u32 nr, u32 tgid)
1539*4882a593Smuzhiyun {
1540*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_NEW_CTX;
1541*4882a593Smuzhiyun const size_t msg_size =
1542*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(context) + sizeof(nr) +
1543*4882a593Smuzhiyun sizeof(tgid);
1544*4882a593Smuzhiyun unsigned long flags;
1545*4882a593Smuzhiyun char *buffer;
1546*4882a593Smuzhiyun size_t pos = 0;
1547*4882a593Smuzhiyun
1548*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1549*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ_SUMMARY,
1550*4882a593Smuzhiyun msg_size, &flags);
1551*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1552*4882a593Smuzhiyun
1553*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1554*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1555*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1556*4882a593Smuzhiyun buffer, pos, &context, sizeof(context));
1557*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1558*4882a593Smuzhiyun buffer, pos, &nr, sizeof(nr));
1559*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1560*4882a593Smuzhiyun buffer, pos, &tgid, sizeof(tgid));
1561*4882a593Smuzhiyun
1562*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1563*4882a593Smuzhiyun
1564*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
1565*4882a593Smuzhiyun }
1566*4882a593Smuzhiyun
__kbase_tlstream_tl_summary_new_gpu(void * gpu,u32 id,u32 core_count)1567*4882a593Smuzhiyun void __kbase_tlstream_tl_summary_new_gpu(void *gpu, u32 id, u32 core_count)
1568*4882a593Smuzhiyun {
1569*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_NEW_GPU;
1570*4882a593Smuzhiyun const size_t msg_size =
1571*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(gpu) + sizeof(id) +
1572*4882a593Smuzhiyun sizeof(core_count);
1573*4882a593Smuzhiyun unsigned long flags;
1574*4882a593Smuzhiyun char *buffer;
1575*4882a593Smuzhiyun size_t pos = 0;
1576*4882a593Smuzhiyun
1577*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1578*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ_SUMMARY,
1579*4882a593Smuzhiyun msg_size, &flags);
1580*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1581*4882a593Smuzhiyun
1582*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1583*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1584*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1585*4882a593Smuzhiyun buffer, pos, &gpu, sizeof(gpu));
1586*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1587*4882a593Smuzhiyun buffer, pos, &id, sizeof(id));
1588*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1589*4882a593Smuzhiyun buffer, pos, &core_count, sizeof(core_count));
1590*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1591*4882a593Smuzhiyun
1592*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
1593*4882a593Smuzhiyun }
1594*4882a593Smuzhiyun
__kbase_tlstream_tl_summary_new_lpu(void * lpu,u32 nr,u32 fn)1595*4882a593Smuzhiyun void __kbase_tlstream_tl_summary_new_lpu(void *lpu, u32 nr, u32 fn)
1596*4882a593Smuzhiyun {
1597*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_NEW_LPU;
1598*4882a593Smuzhiyun const size_t msg_size =
1599*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(lpu) + sizeof(nr) +
1600*4882a593Smuzhiyun sizeof(fn);
1601*4882a593Smuzhiyun unsigned long flags;
1602*4882a593Smuzhiyun char *buffer;
1603*4882a593Smuzhiyun size_t pos = 0;
1604*4882a593Smuzhiyun
1605*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1606*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ_SUMMARY,
1607*4882a593Smuzhiyun msg_size, &flags);
1608*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1609*4882a593Smuzhiyun
1610*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1611*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1612*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1613*4882a593Smuzhiyun buffer, pos, &lpu, sizeof(lpu));
1614*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1615*4882a593Smuzhiyun buffer, pos, &nr, sizeof(nr));
1616*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1617*4882a593Smuzhiyun buffer, pos, &fn, sizeof(fn));
1618*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1619*4882a593Smuzhiyun
1620*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
1621*4882a593Smuzhiyun }
1622*4882a593Smuzhiyun
__kbase_tlstream_tl_summary_lifelink_lpu_gpu(void * lpu,void * gpu)1623*4882a593Smuzhiyun void __kbase_tlstream_tl_summary_lifelink_lpu_gpu(void *lpu, void *gpu)
1624*4882a593Smuzhiyun {
1625*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_LIFELINK_LPU_GPU;
1626*4882a593Smuzhiyun const size_t msg_size =
1627*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(lpu) + sizeof(gpu);
1628*4882a593Smuzhiyun unsigned long flags;
1629*4882a593Smuzhiyun char *buffer;
1630*4882a593Smuzhiyun size_t pos = 0;
1631*4882a593Smuzhiyun
1632*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1633*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ_SUMMARY,
1634*4882a593Smuzhiyun msg_size, &flags);
1635*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1636*4882a593Smuzhiyun
1637*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1638*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1639*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1640*4882a593Smuzhiyun buffer, pos, &lpu, sizeof(lpu));
1641*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1642*4882a593Smuzhiyun buffer, pos, &gpu, sizeof(gpu));
1643*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1644*4882a593Smuzhiyun
1645*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
1646*4882a593Smuzhiyun }
1647*4882a593Smuzhiyun
__kbase_tlstream_tl_summary_new_as(void * as,u32 nr)1648*4882a593Smuzhiyun void __kbase_tlstream_tl_summary_new_as(void *as, u32 nr)
1649*4882a593Smuzhiyun {
1650*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_NEW_AS;
1651*4882a593Smuzhiyun const size_t msg_size =
1652*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(as) + sizeof(nr);
1653*4882a593Smuzhiyun unsigned long flags;
1654*4882a593Smuzhiyun char *buffer;
1655*4882a593Smuzhiyun size_t pos = 0;
1656*4882a593Smuzhiyun
1657*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1658*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ_SUMMARY,
1659*4882a593Smuzhiyun msg_size, &flags);
1660*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1661*4882a593Smuzhiyun
1662*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1663*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1664*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1665*4882a593Smuzhiyun buffer, pos, &as, sizeof(as));
1666*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1667*4882a593Smuzhiyun buffer, pos, &nr, sizeof(nr));
1668*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1669*4882a593Smuzhiyun
1670*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
1671*4882a593Smuzhiyun }
1672*4882a593Smuzhiyun
__kbase_tlstream_tl_summary_lifelink_as_gpu(void * as,void * gpu)1673*4882a593Smuzhiyun void __kbase_tlstream_tl_summary_lifelink_as_gpu(void *as, void *gpu)
1674*4882a593Smuzhiyun {
1675*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_LIFELINK_AS_GPU;
1676*4882a593Smuzhiyun const size_t msg_size =
1677*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(as) + sizeof(gpu);
1678*4882a593Smuzhiyun unsigned long flags;
1679*4882a593Smuzhiyun char *buffer;
1680*4882a593Smuzhiyun size_t pos = 0;
1681*4882a593Smuzhiyun
1682*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1683*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ_SUMMARY,
1684*4882a593Smuzhiyun msg_size, &flags);
1685*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1686*4882a593Smuzhiyun
1687*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1688*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1689*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1690*4882a593Smuzhiyun buffer, pos, &as, sizeof(as));
1691*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1692*4882a593Smuzhiyun buffer, pos, &gpu, sizeof(gpu));
1693*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1694*4882a593Smuzhiyun
1695*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
1696*4882a593Smuzhiyun }
1697*4882a593Smuzhiyun
1698*4882a593Smuzhiyun /*****************************************************************************/
1699*4882a593Smuzhiyun
__kbase_tlstream_tl_new_ctx(void * context,u32 nr,u32 tgid)1700*4882a593Smuzhiyun void __kbase_tlstream_tl_new_ctx(void *context, u32 nr, u32 tgid)
1701*4882a593Smuzhiyun {
1702*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_NEW_CTX;
1703*4882a593Smuzhiyun const size_t msg_size =
1704*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(context) + sizeof(nr) +
1705*4882a593Smuzhiyun sizeof(tgid);
1706*4882a593Smuzhiyun unsigned long flags;
1707*4882a593Smuzhiyun char *buffer;
1708*4882a593Smuzhiyun size_t pos = 0;
1709*4882a593Smuzhiyun
1710*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1711*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
1712*4882a593Smuzhiyun msg_size, &flags);
1713*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1714*4882a593Smuzhiyun
1715*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1716*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1717*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1718*4882a593Smuzhiyun buffer, pos, &context, sizeof(context));
1719*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1720*4882a593Smuzhiyun buffer, pos, &nr, sizeof(nr));
1721*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1722*4882a593Smuzhiyun buffer, pos, &tgid, sizeof(tgid));
1723*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1724*4882a593Smuzhiyun
1725*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1726*4882a593Smuzhiyun }
1727*4882a593Smuzhiyun
__kbase_tlstream_tl_new_atom(void * atom,u32 nr)1728*4882a593Smuzhiyun void __kbase_tlstream_tl_new_atom(void *atom, u32 nr)
1729*4882a593Smuzhiyun {
1730*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_NEW_ATOM;
1731*4882a593Smuzhiyun const size_t msg_size = sizeof(msg_id) + sizeof(u64) + sizeof(atom) +
1732*4882a593Smuzhiyun sizeof(nr);
1733*4882a593Smuzhiyun unsigned long flags;
1734*4882a593Smuzhiyun char *buffer;
1735*4882a593Smuzhiyun size_t pos = 0;
1736*4882a593Smuzhiyun
1737*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1738*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
1739*4882a593Smuzhiyun msg_size, &flags);
1740*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1741*4882a593Smuzhiyun
1742*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1743*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1744*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1745*4882a593Smuzhiyun buffer, pos, &atom, sizeof(atom));
1746*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1747*4882a593Smuzhiyun buffer, pos, &nr, sizeof(nr));
1748*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1749*4882a593Smuzhiyun
1750*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1751*4882a593Smuzhiyun }
1752*4882a593Smuzhiyun
__kbase_tlstream_tl_del_ctx(void * context)1753*4882a593Smuzhiyun void __kbase_tlstream_tl_del_ctx(void *context)
1754*4882a593Smuzhiyun {
1755*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_DEL_CTX;
1756*4882a593Smuzhiyun const size_t msg_size =
1757*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(context);
1758*4882a593Smuzhiyun unsigned long flags;
1759*4882a593Smuzhiyun char *buffer;
1760*4882a593Smuzhiyun size_t pos = 0;
1761*4882a593Smuzhiyun
1762*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1763*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
1764*4882a593Smuzhiyun msg_size, &flags);
1765*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1766*4882a593Smuzhiyun
1767*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1768*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1769*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1770*4882a593Smuzhiyun buffer, pos, &context, sizeof(context));
1771*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1772*4882a593Smuzhiyun
1773*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1774*4882a593Smuzhiyun }
1775*4882a593Smuzhiyun
__kbase_tlstream_tl_del_atom(void * atom)1776*4882a593Smuzhiyun void __kbase_tlstream_tl_del_atom(void *atom)
1777*4882a593Smuzhiyun {
1778*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_DEL_ATOM;
1779*4882a593Smuzhiyun const size_t msg_size =
1780*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom);
1781*4882a593Smuzhiyun unsigned long flags;
1782*4882a593Smuzhiyun char *buffer;
1783*4882a593Smuzhiyun size_t pos = 0;
1784*4882a593Smuzhiyun
1785*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1786*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
1787*4882a593Smuzhiyun msg_size, &flags);
1788*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1789*4882a593Smuzhiyun
1790*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1791*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1792*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1793*4882a593Smuzhiyun buffer, pos, &atom, sizeof(atom));
1794*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1795*4882a593Smuzhiyun
1796*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1797*4882a593Smuzhiyun }
1798*4882a593Smuzhiyun
__kbase_tlstream_tl_ret_ctx_lpu(void * context,void * lpu)1799*4882a593Smuzhiyun void __kbase_tlstream_tl_ret_ctx_lpu(void *context, void *lpu)
1800*4882a593Smuzhiyun {
1801*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_RET_CTX_LPU;
1802*4882a593Smuzhiyun const size_t msg_size =
1803*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(context) + sizeof(lpu);
1804*4882a593Smuzhiyun unsigned long flags;
1805*4882a593Smuzhiyun char *buffer;
1806*4882a593Smuzhiyun size_t pos = 0;
1807*4882a593Smuzhiyun
1808*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1809*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
1810*4882a593Smuzhiyun msg_size, &flags);
1811*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1812*4882a593Smuzhiyun
1813*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1814*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1815*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1816*4882a593Smuzhiyun buffer, pos, &context, sizeof(context));
1817*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1818*4882a593Smuzhiyun buffer, pos, &lpu, sizeof(lpu));
1819*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1820*4882a593Smuzhiyun
1821*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1822*4882a593Smuzhiyun }
1823*4882a593Smuzhiyun
__kbase_tlstream_tl_ret_atom_ctx(void * atom,void * context)1824*4882a593Smuzhiyun void __kbase_tlstream_tl_ret_atom_ctx(void *atom, void *context)
1825*4882a593Smuzhiyun {
1826*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_RET_ATOM_CTX;
1827*4882a593Smuzhiyun const size_t msg_size =
1828*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(context);
1829*4882a593Smuzhiyun unsigned long flags;
1830*4882a593Smuzhiyun char *buffer;
1831*4882a593Smuzhiyun size_t pos = 0;
1832*4882a593Smuzhiyun
1833*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1834*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
1835*4882a593Smuzhiyun msg_size, &flags);
1836*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1837*4882a593Smuzhiyun
1838*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1839*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1840*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1841*4882a593Smuzhiyun buffer, pos, &atom, sizeof(atom));
1842*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1843*4882a593Smuzhiyun buffer, pos, &context, sizeof(context));
1844*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1845*4882a593Smuzhiyun
1846*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1847*4882a593Smuzhiyun }
1848*4882a593Smuzhiyun
__kbase_tlstream_tl_ret_atom_lpu(void * atom,void * lpu,const char * attrib_match_list)1849*4882a593Smuzhiyun void __kbase_tlstream_tl_ret_atom_lpu(
1850*4882a593Smuzhiyun void *atom, void *lpu, const char *attrib_match_list)
1851*4882a593Smuzhiyun {
1852*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_RET_ATOM_LPU;
1853*4882a593Smuzhiyun const size_t msg_s0 = sizeof(u32) + sizeof(char) +
1854*4882a593Smuzhiyun strnlen(attrib_match_list, STRLEN_MAX);
1855*4882a593Smuzhiyun const size_t msg_size =
1856*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) +
1857*4882a593Smuzhiyun sizeof(atom) + sizeof(lpu) + msg_s0;
1858*4882a593Smuzhiyun unsigned long flags;
1859*4882a593Smuzhiyun char *buffer;
1860*4882a593Smuzhiyun size_t pos = 0;
1861*4882a593Smuzhiyun
1862*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1863*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
1864*4882a593Smuzhiyun msg_size, &flags);
1865*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1866*4882a593Smuzhiyun
1867*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1868*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1869*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1870*4882a593Smuzhiyun buffer, pos, &atom, sizeof(atom));
1871*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1872*4882a593Smuzhiyun buffer, pos, &lpu, sizeof(lpu));
1873*4882a593Smuzhiyun pos = kbasep_tlstream_write_string(
1874*4882a593Smuzhiyun buffer, pos, attrib_match_list, msg_s0);
1875*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1876*4882a593Smuzhiyun
1877*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1878*4882a593Smuzhiyun }
1879*4882a593Smuzhiyun
__kbase_tlstream_tl_nret_ctx_lpu(void * context,void * lpu)1880*4882a593Smuzhiyun void __kbase_tlstream_tl_nret_ctx_lpu(void *context, void *lpu)
1881*4882a593Smuzhiyun {
1882*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_NRET_CTX_LPU;
1883*4882a593Smuzhiyun const size_t msg_size =
1884*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(context) + sizeof(lpu);
1885*4882a593Smuzhiyun unsigned long flags;
1886*4882a593Smuzhiyun char *buffer;
1887*4882a593Smuzhiyun size_t pos = 0;
1888*4882a593Smuzhiyun
1889*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1890*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
1891*4882a593Smuzhiyun msg_size, &flags);
1892*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1893*4882a593Smuzhiyun
1894*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1895*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1896*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1897*4882a593Smuzhiyun buffer, pos, &context, sizeof(context));
1898*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1899*4882a593Smuzhiyun buffer, pos, &lpu, sizeof(lpu));
1900*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1901*4882a593Smuzhiyun
1902*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1903*4882a593Smuzhiyun }
1904*4882a593Smuzhiyun
__kbase_tlstream_tl_nret_atom_ctx(void * atom,void * context)1905*4882a593Smuzhiyun void __kbase_tlstream_tl_nret_atom_ctx(void *atom, void *context)
1906*4882a593Smuzhiyun {
1907*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_NRET_ATOM_CTX;
1908*4882a593Smuzhiyun const size_t msg_size =
1909*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(context);
1910*4882a593Smuzhiyun unsigned long flags;
1911*4882a593Smuzhiyun char *buffer;
1912*4882a593Smuzhiyun size_t pos = 0;
1913*4882a593Smuzhiyun
1914*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1915*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
1916*4882a593Smuzhiyun msg_size, &flags);
1917*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1918*4882a593Smuzhiyun
1919*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1920*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1921*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1922*4882a593Smuzhiyun buffer, pos, &atom, sizeof(atom));
1923*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1924*4882a593Smuzhiyun buffer, pos, &context, sizeof(context));
1925*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1926*4882a593Smuzhiyun
1927*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1928*4882a593Smuzhiyun }
1929*4882a593Smuzhiyun
__kbase_tlstream_tl_dep_atom_atom(void * atom1,void * atom2)1930*4882a593Smuzhiyun void __kbase_tlstream_tl_dep_atom_atom(void *atom1, void *atom2)
1931*4882a593Smuzhiyun {
1932*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_DEP_ATOM_ATOM;
1933*4882a593Smuzhiyun const size_t msg_size =
1934*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom1) + sizeof(atom2);
1935*4882a593Smuzhiyun unsigned long flags;
1936*4882a593Smuzhiyun char *buffer;
1937*4882a593Smuzhiyun size_t pos = 0;
1938*4882a593Smuzhiyun
1939*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1940*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
1941*4882a593Smuzhiyun msg_size, &flags);
1942*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1943*4882a593Smuzhiyun
1944*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1945*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1946*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1947*4882a593Smuzhiyun buffer, pos, &atom1, sizeof(atom1));
1948*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1949*4882a593Smuzhiyun buffer, pos, &atom2, sizeof(atom2));
1950*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1951*4882a593Smuzhiyun
1952*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1953*4882a593Smuzhiyun }
1954*4882a593Smuzhiyun
__kbase_tlstream_tl_ndep_atom_atom(void * atom1,void * atom2)1955*4882a593Smuzhiyun void __kbase_tlstream_tl_ndep_atom_atom(void *atom1, void *atom2)
1956*4882a593Smuzhiyun {
1957*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_NDEP_ATOM_ATOM;
1958*4882a593Smuzhiyun const size_t msg_size =
1959*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom1) + sizeof(atom2);
1960*4882a593Smuzhiyun unsigned long flags;
1961*4882a593Smuzhiyun char *buffer;
1962*4882a593Smuzhiyun size_t pos = 0;
1963*4882a593Smuzhiyun
1964*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1965*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
1966*4882a593Smuzhiyun msg_size, &flags);
1967*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1968*4882a593Smuzhiyun
1969*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1970*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1971*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1972*4882a593Smuzhiyun buffer, pos, &atom1, sizeof(atom1));
1973*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1974*4882a593Smuzhiyun buffer, pos, &atom2, sizeof(atom2));
1975*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
1976*4882a593Smuzhiyun
1977*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
1978*4882a593Smuzhiyun }
1979*4882a593Smuzhiyun
__kbase_tlstream_tl_rdep_atom_atom(void * atom1,void * atom2)1980*4882a593Smuzhiyun void __kbase_tlstream_tl_rdep_atom_atom(void *atom1, void *atom2)
1981*4882a593Smuzhiyun {
1982*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_RDEP_ATOM_ATOM;
1983*4882a593Smuzhiyun const size_t msg_size =
1984*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom1) + sizeof(atom2);
1985*4882a593Smuzhiyun unsigned long flags;
1986*4882a593Smuzhiyun char *buffer;
1987*4882a593Smuzhiyun size_t pos = 0;
1988*4882a593Smuzhiyun
1989*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
1990*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
1991*4882a593Smuzhiyun msg_size, &flags);
1992*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
1993*4882a593Smuzhiyun
1994*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
1995*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
1996*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1997*4882a593Smuzhiyun buffer, pos, &atom1, sizeof(atom1));
1998*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
1999*4882a593Smuzhiyun buffer, pos, &atom2, sizeof(atom2));
2000*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2001*4882a593Smuzhiyun
2002*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2003*4882a593Smuzhiyun }
2004*4882a593Smuzhiyun
__kbase_tlstream_tl_nret_atom_lpu(void * atom,void * lpu)2005*4882a593Smuzhiyun void __kbase_tlstream_tl_nret_atom_lpu(void *atom, void *lpu)
2006*4882a593Smuzhiyun {
2007*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_NRET_ATOM_LPU;
2008*4882a593Smuzhiyun const size_t msg_size =
2009*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(lpu);
2010*4882a593Smuzhiyun unsigned long flags;
2011*4882a593Smuzhiyun char *buffer;
2012*4882a593Smuzhiyun size_t pos = 0;
2013*4882a593Smuzhiyun
2014*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2015*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
2016*4882a593Smuzhiyun msg_size, &flags);
2017*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2018*4882a593Smuzhiyun
2019*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2020*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2021*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2022*4882a593Smuzhiyun buffer, pos, &atom, sizeof(atom));
2023*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2024*4882a593Smuzhiyun buffer, pos, &lpu, sizeof(lpu));
2025*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2026*4882a593Smuzhiyun
2027*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2028*4882a593Smuzhiyun }
2029*4882a593Smuzhiyun
__kbase_tlstream_tl_ret_as_ctx(void * as,void * ctx)2030*4882a593Smuzhiyun void __kbase_tlstream_tl_ret_as_ctx(void *as, void *ctx)
2031*4882a593Smuzhiyun {
2032*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_RET_AS_CTX;
2033*4882a593Smuzhiyun const size_t msg_size =
2034*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(as) + sizeof(ctx);
2035*4882a593Smuzhiyun unsigned long flags;
2036*4882a593Smuzhiyun char *buffer;
2037*4882a593Smuzhiyun size_t pos = 0;
2038*4882a593Smuzhiyun
2039*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2040*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
2041*4882a593Smuzhiyun msg_size, &flags);
2042*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2043*4882a593Smuzhiyun
2044*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2045*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2046*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2047*4882a593Smuzhiyun buffer, pos, &as, sizeof(as));
2048*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2049*4882a593Smuzhiyun buffer, pos, &ctx, sizeof(ctx));
2050*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2051*4882a593Smuzhiyun
2052*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2053*4882a593Smuzhiyun }
2054*4882a593Smuzhiyun
__kbase_tlstream_tl_nret_as_ctx(void * as,void * ctx)2055*4882a593Smuzhiyun void __kbase_tlstream_tl_nret_as_ctx(void *as, void *ctx)
2056*4882a593Smuzhiyun {
2057*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_NRET_AS_CTX;
2058*4882a593Smuzhiyun const size_t msg_size =
2059*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(as) + sizeof(ctx);
2060*4882a593Smuzhiyun unsigned long flags;
2061*4882a593Smuzhiyun char *buffer;
2062*4882a593Smuzhiyun size_t pos = 0;
2063*4882a593Smuzhiyun
2064*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2065*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
2066*4882a593Smuzhiyun msg_size, &flags);
2067*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2068*4882a593Smuzhiyun
2069*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2070*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2071*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2072*4882a593Smuzhiyun buffer, pos, &as, sizeof(as));
2073*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2074*4882a593Smuzhiyun buffer, pos, &ctx, sizeof(ctx));
2075*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2076*4882a593Smuzhiyun
2077*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2078*4882a593Smuzhiyun }
2079*4882a593Smuzhiyun
__kbase_tlstream_tl_ret_atom_as(void * atom,void * as)2080*4882a593Smuzhiyun void __kbase_tlstream_tl_ret_atom_as(void *atom, void *as)
2081*4882a593Smuzhiyun {
2082*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_RET_ATOM_AS;
2083*4882a593Smuzhiyun const size_t msg_size =
2084*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(as);
2085*4882a593Smuzhiyun unsigned long flags;
2086*4882a593Smuzhiyun char *buffer;
2087*4882a593Smuzhiyun size_t pos = 0;
2088*4882a593Smuzhiyun
2089*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2090*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
2091*4882a593Smuzhiyun msg_size, &flags);
2092*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2093*4882a593Smuzhiyun
2094*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2095*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2096*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2097*4882a593Smuzhiyun buffer, pos, &atom, sizeof(atom));
2098*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2099*4882a593Smuzhiyun buffer, pos, &as, sizeof(as));
2100*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2101*4882a593Smuzhiyun
2102*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2103*4882a593Smuzhiyun }
2104*4882a593Smuzhiyun
__kbase_tlstream_tl_nret_atom_as(void * atom,void * as)2105*4882a593Smuzhiyun void __kbase_tlstream_tl_nret_atom_as(void *atom, void *as)
2106*4882a593Smuzhiyun {
2107*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_NRET_ATOM_AS;
2108*4882a593Smuzhiyun const size_t msg_size =
2109*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(as);
2110*4882a593Smuzhiyun unsigned long flags;
2111*4882a593Smuzhiyun char *buffer;
2112*4882a593Smuzhiyun size_t pos = 0;
2113*4882a593Smuzhiyun
2114*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2115*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
2116*4882a593Smuzhiyun msg_size, &flags);
2117*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2118*4882a593Smuzhiyun
2119*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2120*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2121*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2122*4882a593Smuzhiyun buffer, pos, &atom, sizeof(atom));
2123*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2124*4882a593Smuzhiyun buffer, pos, &as, sizeof(as));
2125*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2126*4882a593Smuzhiyun
2127*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2128*4882a593Smuzhiyun }
2129*4882a593Smuzhiyun
__kbase_tlstream_tl_attrib_atom_config(void * atom,u64 jd,u64 affinity,u32 config)2130*4882a593Smuzhiyun void __kbase_tlstream_tl_attrib_atom_config(
2131*4882a593Smuzhiyun void *atom, u64 jd, u64 affinity, u32 config)
2132*4882a593Smuzhiyun {
2133*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_ATTRIB_ATOM_CONFIG;
2134*4882a593Smuzhiyun const size_t msg_size =
2135*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom) +
2136*4882a593Smuzhiyun sizeof(jd) + sizeof(affinity) + sizeof(config);
2137*4882a593Smuzhiyun unsigned long flags;
2138*4882a593Smuzhiyun char *buffer;
2139*4882a593Smuzhiyun size_t pos = 0;
2140*4882a593Smuzhiyun
2141*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2142*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
2143*4882a593Smuzhiyun msg_size, &flags);
2144*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2145*4882a593Smuzhiyun
2146*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2147*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2148*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2149*4882a593Smuzhiyun buffer, pos, &atom, sizeof(atom));
2150*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2151*4882a593Smuzhiyun buffer, pos, &jd, sizeof(jd));
2152*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2153*4882a593Smuzhiyun buffer, pos, &affinity, sizeof(affinity));
2154*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2155*4882a593Smuzhiyun buffer, pos, &config, sizeof(config));
2156*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2157*4882a593Smuzhiyun
2158*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2159*4882a593Smuzhiyun }
2160*4882a593Smuzhiyun
__kbase_tlstream_tl_attrib_atom_priority(void * atom,u32 prio)2161*4882a593Smuzhiyun void __kbase_tlstream_tl_attrib_atom_priority(void *atom, u32 prio)
2162*4882a593Smuzhiyun {
2163*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_ATTRIB_ATOM_PRIORITY;
2164*4882a593Smuzhiyun const size_t msg_size =
2165*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(prio);
2166*4882a593Smuzhiyun unsigned long flags;
2167*4882a593Smuzhiyun char *buffer;
2168*4882a593Smuzhiyun size_t pos = 0;
2169*4882a593Smuzhiyun
2170*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2171*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
2172*4882a593Smuzhiyun msg_size, &flags);
2173*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2174*4882a593Smuzhiyun
2175*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2176*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2177*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2178*4882a593Smuzhiyun buffer, pos, &atom, sizeof(atom));
2179*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2180*4882a593Smuzhiyun buffer, pos, &prio, sizeof(prio));
2181*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2182*4882a593Smuzhiyun
2183*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2184*4882a593Smuzhiyun }
2185*4882a593Smuzhiyun
__kbase_tlstream_tl_attrib_atom_state(void * atom,u32 state)2186*4882a593Smuzhiyun void __kbase_tlstream_tl_attrib_atom_state(void *atom, u32 state)
2187*4882a593Smuzhiyun {
2188*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_ATTRIB_ATOM_STATE;
2189*4882a593Smuzhiyun const size_t msg_size =
2190*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(state);
2191*4882a593Smuzhiyun unsigned long flags;
2192*4882a593Smuzhiyun char *buffer;
2193*4882a593Smuzhiyun size_t pos = 0;
2194*4882a593Smuzhiyun
2195*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2196*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
2197*4882a593Smuzhiyun msg_size, &flags);
2198*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2199*4882a593Smuzhiyun
2200*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2201*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2202*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2203*4882a593Smuzhiyun buffer, pos, &atom, sizeof(atom));
2204*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2205*4882a593Smuzhiyun buffer, pos, &state, sizeof(state));
2206*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2207*4882a593Smuzhiyun
2208*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2209*4882a593Smuzhiyun }
2210*4882a593Smuzhiyun
__kbase_tlstream_tl_attrib_atom_priority_change(void * atom)2211*4882a593Smuzhiyun void __kbase_tlstream_tl_attrib_atom_priority_change(void *atom)
2212*4882a593Smuzhiyun {
2213*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE;
2214*4882a593Smuzhiyun const size_t msg_size =
2215*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom);
2216*4882a593Smuzhiyun unsigned long flags;
2217*4882a593Smuzhiyun char *buffer;
2218*4882a593Smuzhiyun size_t pos = 0;
2219*4882a593Smuzhiyun
2220*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2221*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
2222*4882a593Smuzhiyun msg_size, &flags);
2223*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2224*4882a593Smuzhiyun
2225*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2226*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2227*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2228*4882a593Smuzhiyun buffer, pos, &atom, sizeof(atom));
2229*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2230*4882a593Smuzhiyun
2231*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2232*4882a593Smuzhiyun }
2233*4882a593Smuzhiyun
__kbase_tlstream_tl_attrib_atom_jit(void * atom,u64 edit_addr,u64 new_addr)2234*4882a593Smuzhiyun void __kbase_tlstream_tl_attrib_atom_jit(
2235*4882a593Smuzhiyun void *atom, u64 edit_addr, u64 new_addr)
2236*4882a593Smuzhiyun {
2237*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_ATTRIB_ATOM_JIT;
2238*4882a593Smuzhiyun const size_t msg_size =
2239*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom)
2240*4882a593Smuzhiyun + sizeof(edit_addr) + sizeof(new_addr);
2241*4882a593Smuzhiyun unsigned long flags;
2242*4882a593Smuzhiyun char *buffer;
2243*4882a593Smuzhiyun size_t pos = 0;
2244*4882a593Smuzhiyun
2245*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2246*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
2247*4882a593Smuzhiyun msg_size, &flags);
2248*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2249*4882a593Smuzhiyun
2250*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2251*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2252*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2253*4882a593Smuzhiyun buffer, pos, &atom, sizeof(atom));
2254*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2255*4882a593Smuzhiyun buffer, pos, &edit_addr, sizeof(edit_addr));
2256*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2257*4882a593Smuzhiyun buffer, pos, &new_addr, sizeof(new_addr));
2258*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2259*4882a593Smuzhiyun
2260*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2261*4882a593Smuzhiyun }
2262*4882a593Smuzhiyun
__kbase_tlstream_tl_attrib_as_config(void * as,u64 transtab,u64 memattr,u64 transcfg)2263*4882a593Smuzhiyun void __kbase_tlstream_tl_attrib_as_config(
2264*4882a593Smuzhiyun void *as, u64 transtab, u64 memattr, u64 transcfg)
2265*4882a593Smuzhiyun {
2266*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_ATTRIB_AS_CONFIG;
2267*4882a593Smuzhiyun const size_t msg_size =
2268*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(as) +
2269*4882a593Smuzhiyun sizeof(transtab) + sizeof(memattr) + sizeof(transcfg);
2270*4882a593Smuzhiyun unsigned long flags;
2271*4882a593Smuzhiyun char *buffer;
2272*4882a593Smuzhiyun size_t pos = 0;
2273*4882a593Smuzhiyun
2274*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2275*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
2276*4882a593Smuzhiyun msg_size, &flags);
2277*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2278*4882a593Smuzhiyun
2279*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2280*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2281*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2282*4882a593Smuzhiyun buffer, pos, &as, sizeof(as));
2283*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2284*4882a593Smuzhiyun buffer, pos, &transtab, sizeof(transtab));
2285*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2286*4882a593Smuzhiyun buffer, pos, &memattr, sizeof(memattr));
2287*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2288*4882a593Smuzhiyun buffer, pos, &transcfg, sizeof(transcfg));
2289*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2290*4882a593Smuzhiyun
2291*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2292*4882a593Smuzhiyun }
2293*4882a593Smuzhiyun
__kbase_tlstream_tl_event_lpu_softstop(void * lpu)2294*4882a593Smuzhiyun void __kbase_tlstream_tl_event_lpu_softstop(void *lpu)
2295*4882a593Smuzhiyun {
2296*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_EVENT_LPU_SOFTSTOP;
2297*4882a593Smuzhiyun const size_t msg_size =
2298*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(lpu);
2299*4882a593Smuzhiyun unsigned long flags;
2300*4882a593Smuzhiyun char *buffer;
2301*4882a593Smuzhiyun size_t pos = 0;
2302*4882a593Smuzhiyun
2303*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2304*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
2305*4882a593Smuzhiyun msg_size, &flags);
2306*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2307*4882a593Smuzhiyun
2308*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2309*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2310*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2311*4882a593Smuzhiyun buffer, pos, &lpu, sizeof(lpu));
2312*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2313*4882a593Smuzhiyun
2314*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2315*4882a593Smuzhiyun }
2316*4882a593Smuzhiyun
__kbase_tlstream_tl_event_atom_softstop_ex(void * atom)2317*4882a593Smuzhiyun void __kbase_tlstream_tl_event_atom_softstop_ex(void *atom)
2318*4882a593Smuzhiyun {
2319*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_EVENT_ATOM_SOFTSTOP_EX;
2320*4882a593Smuzhiyun const size_t msg_size =
2321*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom);
2322*4882a593Smuzhiyun unsigned long flags;
2323*4882a593Smuzhiyun char *buffer;
2324*4882a593Smuzhiyun size_t pos = 0;
2325*4882a593Smuzhiyun
2326*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2327*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
2328*4882a593Smuzhiyun msg_size, &flags);
2329*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2330*4882a593Smuzhiyun
2331*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2332*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2333*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2334*4882a593Smuzhiyun buffer, pos, &atom, sizeof(atom));
2335*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2336*4882a593Smuzhiyun
2337*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2338*4882a593Smuzhiyun }
2339*4882a593Smuzhiyun
__kbase_tlstream_tl_event_atom_softstop_issue(void * atom)2340*4882a593Smuzhiyun void __kbase_tlstream_tl_event_atom_softstop_issue(void *atom)
2341*4882a593Smuzhiyun {
2342*4882a593Smuzhiyun const u32 msg_id = KBASE_TL_EVENT_ATOM_SOFTSTOP_ISSUE;
2343*4882a593Smuzhiyun const size_t msg_size =
2344*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(atom);
2345*4882a593Smuzhiyun unsigned long flags;
2346*4882a593Smuzhiyun char *buffer;
2347*4882a593Smuzhiyun size_t pos = 0;
2348*4882a593Smuzhiyun
2349*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2350*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
2351*4882a593Smuzhiyun msg_size, &flags);
2352*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2353*4882a593Smuzhiyun
2354*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2355*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2356*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2357*4882a593Smuzhiyun buffer, pos, &atom, sizeof(atom));
2358*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2359*4882a593Smuzhiyun
2360*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2361*4882a593Smuzhiyun }
2362*4882a593Smuzhiyun
__kbase_tlstream_jd_gpu_soft_reset(void * gpu)2363*4882a593Smuzhiyun void __kbase_tlstream_jd_gpu_soft_reset(void *gpu)
2364*4882a593Smuzhiyun {
2365*4882a593Smuzhiyun const u32 msg_id = KBASE_JD_GPU_SOFT_RESET;
2366*4882a593Smuzhiyun const size_t msg_size =
2367*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(gpu);
2368*4882a593Smuzhiyun unsigned long flags;
2369*4882a593Smuzhiyun char *buffer;
2370*4882a593Smuzhiyun size_t pos = 0;
2371*4882a593Smuzhiyun
2372*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2373*4882a593Smuzhiyun TL_STREAM_TYPE_OBJ,
2374*4882a593Smuzhiyun msg_size, &flags);
2375*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2376*4882a593Smuzhiyun
2377*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2378*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2379*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2380*4882a593Smuzhiyun buffer, pos, &gpu, sizeof(gpu));
2381*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2382*4882a593Smuzhiyun
2383*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
2384*4882a593Smuzhiyun }
2385*4882a593Smuzhiyun
2386*4882a593Smuzhiyun /*****************************************************************************/
2387*4882a593Smuzhiyun
__kbase_tlstream_aux_pm_state(u32 core_type,u64 state)2388*4882a593Smuzhiyun void __kbase_tlstream_aux_pm_state(u32 core_type, u64 state)
2389*4882a593Smuzhiyun {
2390*4882a593Smuzhiyun const u32 msg_id = KBASE_AUX_PM_STATE;
2391*4882a593Smuzhiyun const size_t msg_size =
2392*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(core_type) +
2393*4882a593Smuzhiyun sizeof(state);
2394*4882a593Smuzhiyun unsigned long flags;
2395*4882a593Smuzhiyun char *buffer;
2396*4882a593Smuzhiyun size_t pos = 0;
2397*4882a593Smuzhiyun
2398*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2399*4882a593Smuzhiyun TL_STREAM_TYPE_AUX,
2400*4882a593Smuzhiyun msg_size, &flags);
2401*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2402*4882a593Smuzhiyun
2403*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2404*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2405*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2406*4882a593Smuzhiyun buffer, pos, &core_type, sizeof(core_type));
2407*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &state, sizeof(state));
2408*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2409*4882a593Smuzhiyun
2410*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
2411*4882a593Smuzhiyun }
2412*4882a593Smuzhiyun
__kbase_tlstream_aux_pagefault(u32 ctx_nr,u64 page_count_change)2413*4882a593Smuzhiyun void __kbase_tlstream_aux_pagefault(u32 ctx_nr, u64 page_count_change)
2414*4882a593Smuzhiyun {
2415*4882a593Smuzhiyun const u32 msg_id = KBASE_AUX_PAGEFAULT;
2416*4882a593Smuzhiyun const size_t msg_size =
2417*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(ctx_nr) +
2418*4882a593Smuzhiyun sizeof(page_count_change);
2419*4882a593Smuzhiyun unsigned long flags;
2420*4882a593Smuzhiyun char *buffer;
2421*4882a593Smuzhiyun size_t pos = 0;
2422*4882a593Smuzhiyun
2423*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2424*4882a593Smuzhiyun TL_STREAM_TYPE_AUX, msg_size, &flags);
2425*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2426*4882a593Smuzhiyun
2427*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2428*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2429*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &ctx_nr, sizeof(ctx_nr));
2430*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2431*4882a593Smuzhiyun buffer, pos,
2432*4882a593Smuzhiyun &page_count_change, sizeof(page_count_change));
2433*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2434*4882a593Smuzhiyun
2435*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
2436*4882a593Smuzhiyun }
2437*4882a593Smuzhiyun
__kbase_tlstream_aux_pagesalloc(u32 ctx_nr,u64 page_count)2438*4882a593Smuzhiyun void __kbase_tlstream_aux_pagesalloc(u32 ctx_nr, u64 page_count)
2439*4882a593Smuzhiyun {
2440*4882a593Smuzhiyun const u32 msg_id = KBASE_AUX_PAGESALLOC;
2441*4882a593Smuzhiyun const size_t msg_size =
2442*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(ctx_nr) +
2443*4882a593Smuzhiyun sizeof(page_count);
2444*4882a593Smuzhiyun unsigned long flags;
2445*4882a593Smuzhiyun char *buffer;
2446*4882a593Smuzhiyun size_t pos = 0;
2447*4882a593Smuzhiyun
2448*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2449*4882a593Smuzhiyun TL_STREAM_TYPE_AUX, msg_size, &flags);
2450*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2451*4882a593Smuzhiyun
2452*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2453*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2454*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &ctx_nr, sizeof(ctx_nr));
2455*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2456*4882a593Smuzhiyun buffer, pos, &page_count, sizeof(page_count));
2457*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2458*4882a593Smuzhiyun
2459*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
2460*4882a593Smuzhiyun }
2461*4882a593Smuzhiyun
__kbase_tlstream_aux_devfreq_target(u64 target_freq)2462*4882a593Smuzhiyun void __kbase_tlstream_aux_devfreq_target(u64 target_freq)
2463*4882a593Smuzhiyun {
2464*4882a593Smuzhiyun const u32 msg_id = KBASE_AUX_DEVFREQ_TARGET;
2465*4882a593Smuzhiyun const size_t msg_size =
2466*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(target_freq);
2467*4882a593Smuzhiyun unsigned long flags;
2468*4882a593Smuzhiyun char *buffer;
2469*4882a593Smuzhiyun size_t pos = 0;
2470*4882a593Smuzhiyun
2471*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2472*4882a593Smuzhiyun TL_STREAM_TYPE_AUX, msg_size, &flags);
2473*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2474*4882a593Smuzhiyun
2475*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2476*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2477*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2478*4882a593Smuzhiyun buffer, pos, &target_freq, sizeof(target_freq));
2479*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2480*4882a593Smuzhiyun
2481*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
2482*4882a593Smuzhiyun }
2483*4882a593Smuzhiyun
__kbase_tlstream_aux_protected_enter_start(void * gpu)2484*4882a593Smuzhiyun void __kbase_tlstream_aux_protected_enter_start(void *gpu)
2485*4882a593Smuzhiyun {
2486*4882a593Smuzhiyun const u32 msg_id = KBASE_AUX_PROTECTED_ENTER_START;
2487*4882a593Smuzhiyun const size_t msg_size =
2488*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(gpu);
2489*4882a593Smuzhiyun unsigned long flags;
2490*4882a593Smuzhiyun char *buffer;
2491*4882a593Smuzhiyun size_t pos = 0;
2492*4882a593Smuzhiyun
2493*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2494*4882a593Smuzhiyun TL_STREAM_TYPE_AUX,
2495*4882a593Smuzhiyun msg_size, &flags);
2496*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2497*4882a593Smuzhiyun
2498*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2499*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2500*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2501*4882a593Smuzhiyun buffer, pos, &gpu, sizeof(gpu));
2502*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2503*4882a593Smuzhiyun
2504*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
2505*4882a593Smuzhiyun }
__kbase_tlstream_aux_protected_enter_end(void * gpu)2506*4882a593Smuzhiyun void __kbase_tlstream_aux_protected_enter_end(void *gpu)
2507*4882a593Smuzhiyun {
2508*4882a593Smuzhiyun const u32 msg_id = KBASE_AUX_PROTECTED_ENTER_END;
2509*4882a593Smuzhiyun const size_t msg_size =
2510*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(gpu);
2511*4882a593Smuzhiyun unsigned long flags;
2512*4882a593Smuzhiyun char *buffer;
2513*4882a593Smuzhiyun size_t pos = 0;
2514*4882a593Smuzhiyun
2515*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2516*4882a593Smuzhiyun TL_STREAM_TYPE_AUX,
2517*4882a593Smuzhiyun msg_size, &flags);
2518*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2519*4882a593Smuzhiyun
2520*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2521*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2522*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2523*4882a593Smuzhiyun buffer, pos, &gpu, sizeof(gpu));
2524*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2525*4882a593Smuzhiyun
2526*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
2527*4882a593Smuzhiyun }
2528*4882a593Smuzhiyun
__kbase_tlstream_aux_protected_leave_start(void * gpu)2529*4882a593Smuzhiyun void __kbase_tlstream_aux_protected_leave_start(void *gpu)
2530*4882a593Smuzhiyun {
2531*4882a593Smuzhiyun const u32 msg_id = KBASE_AUX_PROTECTED_LEAVE_START;
2532*4882a593Smuzhiyun const size_t msg_size =
2533*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(gpu);
2534*4882a593Smuzhiyun unsigned long flags;
2535*4882a593Smuzhiyun char *buffer;
2536*4882a593Smuzhiyun size_t pos = 0;
2537*4882a593Smuzhiyun
2538*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2539*4882a593Smuzhiyun TL_STREAM_TYPE_AUX,
2540*4882a593Smuzhiyun msg_size, &flags);
2541*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2542*4882a593Smuzhiyun
2543*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2544*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2545*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2546*4882a593Smuzhiyun buffer, pos, &gpu, sizeof(gpu));
2547*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2548*4882a593Smuzhiyun
2549*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
2550*4882a593Smuzhiyun }
__kbase_tlstream_aux_protected_leave_end(void * gpu)2551*4882a593Smuzhiyun void __kbase_tlstream_aux_protected_leave_end(void *gpu)
2552*4882a593Smuzhiyun {
2553*4882a593Smuzhiyun const u32 msg_id = KBASE_AUX_PROTECTED_LEAVE_END;
2554*4882a593Smuzhiyun const size_t msg_size =
2555*4882a593Smuzhiyun sizeof(msg_id) + sizeof(u64) + sizeof(gpu);
2556*4882a593Smuzhiyun unsigned long flags;
2557*4882a593Smuzhiyun char *buffer;
2558*4882a593Smuzhiyun size_t pos = 0;
2559*4882a593Smuzhiyun
2560*4882a593Smuzhiyun buffer = kbasep_tlstream_msgbuf_acquire(
2561*4882a593Smuzhiyun TL_STREAM_TYPE_AUX,
2562*4882a593Smuzhiyun msg_size, &flags);
2563*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(buffer);
2564*4882a593Smuzhiyun
2565*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
2566*4882a593Smuzhiyun pos = kbasep_tlstream_write_timestamp(buffer, pos);
2567*4882a593Smuzhiyun pos = kbasep_tlstream_write_bytes(
2568*4882a593Smuzhiyun buffer, pos, &gpu, sizeof(gpu));
2569*4882a593Smuzhiyun KBASE_DEBUG_ASSERT(msg_size == pos);
2570*4882a593Smuzhiyun
2571*4882a593Smuzhiyun kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
2572*4882a593Smuzhiyun }
2573