xref: /rockchip-linux_mpp/osal/mpp_trace.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #define MODULE_TAG "mpp_trace"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <fcntl.h>
9*437bfbebSnyanmisaka #include <stdarg.h>
10*437bfbebSnyanmisaka 
11*437bfbebSnyanmisaka #include "mpp_log.h"
12*437bfbebSnyanmisaka #include "mpp_mem.h"
13*437bfbebSnyanmisaka #include "mpp_common.h"
14*437bfbebSnyanmisaka #include "mpp_singleton.h"
15*437bfbebSnyanmisaka 
16*437bfbebSnyanmisaka #include "mpp_trace.h"
17*437bfbebSnyanmisaka 
18*437bfbebSnyanmisaka #define ATRACE_MESSAGE_LENGTH 256
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #define get_srv_trace() \
21*437bfbebSnyanmisaka     ({ \
22*437bfbebSnyanmisaka         MppTraceSrv *__tmp; \
23*437bfbebSnyanmisaka         if (!srv_trace) { \
24*437bfbebSnyanmisaka             mpp_trace_srv_init(); \
25*437bfbebSnyanmisaka         } \
26*437bfbebSnyanmisaka         if (srv_trace) { \
27*437bfbebSnyanmisaka             __tmp = srv_trace; \
28*437bfbebSnyanmisaka         } else { \
29*437bfbebSnyanmisaka             mpp_err("mpp trace srv not init at %s : %s\n", __FUNCTION__); \
30*437bfbebSnyanmisaka             __tmp = NULL; \
31*437bfbebSnyanmisaka         } \
32*437bfbebSnyanmisaka         __tmp; \
33*437bfbebSnyanmisaka     })
34*437bfbebSnyanmisaka 
35*437bfbebSnyanmisaka typedef struct  MppTraceSrv_t {
36*437bfbebSnyanmisaka     const char  *name;
37*437bfbebSnyanmisaka     rk_s32      fd;
38*437bfbebSnyanmisaka } MppTraceSrv;
39*437bfbebSnyanmisaka 
40*437bfbebSnyanmisaka static MppTraceSrv *srv_trace = NULL;
41*437bfbebSnyanmisaka 
mpp_trace_srv_init()42*437bfbebSnyanmisaka static void mpp_trace_srv_init()
43*437bfbebSnyanmisaka {
44*437bfbebSnyanmisaka     static const char *ftrace_paths[] = {
45*437bfbebSnyanmisaka         "/sys/kernel/debug/tracing/trace_marker",
46*437bfbebSnyanmisaka         "/debug/tracing/trace_marker",
47*437bfbebSnyanmisaka         "/debugfs/tracing/trace_marker",
48*437bfbebSnyanmisaka     };
49*437bfbebSnyanmisaka     MppTraceSrv *srv = srv_trace;
50*437bfbebSnyanmisaka     rk_u32 i;
51*437bfbebSnyanmisaka 
52*437bfbebSnyanmisaka     if (srv)
53*437bfbebSnyanmisaka         return;
54*437bfbebSnyanmisaka 
55*437bfbebSnyanmisaka     srv = mpp_calloc(MppTraceSrv, 1);
56*437bfbebSnyanmisaka     if (!srv) {
57*437bfbebSnyanmisaka         mpp_err_f("failed to allocate trace service\n");
58*437bfbebSnyanmisaka         return;
59*437bfbebSnyanmisaka     }
60*437bfbebSnyanmisaka 
61*437bfbebSnyanmisaka     srv_trace = srv;
62*437bfbebSnyanmisaka     srv->fd = -1;
63*437bfbebSnyanmisaka 
64*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(ftrace_paths); i++) {
65*437bfbebSnyanmisaka         if (!access(ftrace_paths[i], F_OK)) {
66*437bfbebSnyanmisaka             rk_s32 fd = open(ftrace_paths[i], O_WRONLY | O_CLOEXEC);
67*437bfbebSnyanmisaka 
68*437bfbebSnyanmisaka             if (fd >= 0) {
69*437bfbebSnyanmisaka                 srv->fd = fd;
70*437bfbebSnyanmisaka                 srv->name = ftrace_paths[i];
71*437bfbebSnyanmisaka                 break;
72*437bfbebSnyanmisaka             }
73*437bfbebSnyanmisaka         }
74*437bfbebSnyanmisaka     }
75*437bfbebSnyanmisaka }
76*437bfbebSnyanmisaka 
mpp_trace_srv_deinit()77*437bfbebSnyanmisaka static void mpp_trace_srv_deinit()
78*437bfbebSnyanmisaka {
79*437bfbebSnyanmisaka     MppTraceSrv *srv = srv_trace;
80*437bfbebSnyanmisaka 
81*437bfbebSnyanmisaka     if (srv) {
82*437bfbebSnyanmisaka         if (srv->fd >= 0) {
83*437bfbebSnyanmisaka             close(srv->fd);
84*437bfbebSnyanmisaka             srv->fd = -1;
85*437bfbebSnyanmisaka         }
86*437bfbebSnyanmisaka         mpp_free(srv);
87*437bfbebSnyanmisaka     }
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka     srv_trace = NULL;
90*437bfbebSnyanmisaka }
91*437bfbebSnyanmisaka 
mpp_trace_write(rk_s32 fd,const char * fmt,...)92*437bfbebSnyanmisaka static void mpp_trace_write(rk_s32 fd, const char *fmt, ...)
93*437bfbebSnyanmisaka {
94*437bfbebSnyanmisaka     char buf[ATRACE_MESSAGE_LENGTH];
95*437bfbebSnyanmisaka     va_list ap;
96*437bfbebSnyanmisaka     rk_s32 len;
97*437bfbebSnyanmisaka 
98*437bfbebSnyanmisaka     va_start(ap, fmt);
99*437bfbebSnyanmisaka     len = vsnprintf(buf, sizeof(buf) - 1, fmt, ap);
100*437bfbebSnyanmisaka     va_end(ap);
101*437bfbebSnyanmisaka 
102*437bfbebSnyanmisaka     (void)!write(fd, buf, len);
103*437bfbebSnyanmisaka }
104*437bfbebSnyanmisaka 
mpp_trace_begin(const char * name)105*437bfbebSnyanmisaka void mpp_trace_begin(const char* name)
106*437bfbebSnyanmisaka {
107*437bfbebSnyanmisaka     MppTraceSrv *srv = get_srv_trace();
108*437bfbebSnyanmisaka 
109*437bfbebSnyanmisaka     if (srv && srv->fd >= 0)
110*437bfbebSnyanmisaka         mpp_trace_write(srv->fd, "B|%d|%s", getpid(), name);
111*437bfbebSnyanmisaka }
112*437bfbebSnyanmisaka 
mpp_trace_end(const char * name)113*437bfbebSnyanmisaka void mpp_trace_end(const char* name)
114*437bfbebSnyanmisaka {
115*437bfbebSnyanmisaka     MppTraceSrv *srv = get_srv_trace();
116*437bfbebSnyanmisaka 
117*437bfbebSnyanmisaka     if (srv && srv->fd >= 0)
118*437bfbebSnyanmisaka         mpp_trace_write(srv->fd, "E|%d|%s", getpid(), name);
119*437bfbebSnyanmisaka }
120*437bfbebSnyanmisaka 
mpp_trace_async_begin(const char * name,rk_s32 cookie)121*437bfbebSnyanmisaka void mpp_trace_async_begin(const char* name, rk_s32 cookie)
122*437bfbebSnyanmisaka {
123*437bfbebSnyanmisaka     MppTraceSrv *srv = get_srv_trace();
124*437bfbebSnyanmisaka 
125*437bfbebSnyanmisaka     if (srv && srv->fd >= 0)
126*437bfbebSnyanmisaka         mpp_trace_write(srv->fd, "S|%d|%s|%d", getpid(), name, cookie);
127*437bfbebSnyanmisaka }
128*437bfbebSnyanmisaka 
mpp_trace_async_end(const char * name,rk_s32 cookie)129*437bfbebSnyanmisaka void mpp_trace_async_end(const char* name, rk_s32 cookie)
130*437bfbebSnyanmisaka {
131*437bfbebSnyanmisaka     MppTraceSrv *srv = get_srv_trace();
132*437bfbebSnyanmisaka 
133*437bfbebSnyanmisaka     if (srv && srv->fd >= 0)
134*437bfbebSnyanmisaka         mpp_trace_write(srv->fd, "F|%d|%s|%d", getpid(), name, cookie);
135*437bfbebSnyanmisaka }
136*437bfbebSnyanmisaka 
mpp_trace_int32(const char * name,rk_s32 value)137*437bfbebSnyanmisaka void mpp_trace_int32(const char* name, rk_s32 value)
138*437bfbebSnyanmisaka {
139*437bfbebSnyanmisaka     MppTraceSrv *srv = get_srv_trace();
140*437bfbebSnyanmisaka 
141*437bfbebSnyanmisaka     if (srv && srv->fd >= 0)
142*437bfbebSnyanmisaka         mpp_trace_write(srv->fd, "C|%d|%s|%d", getpid(), name, value);
143*437bfbebSnyanmisaka }
144*437bfbebSnyanmisaka 
mpp_trace_int64(const char * name,RK_S64 value)145*437bfbebSnyanmisaka void mpp_trace_int64(const char* name, RK_S64 value)
146*437bfbebSnyanmisaka {
147*437bfbebSnyanmisaka     MppTraceSrv *srv = get_srv_trace();
148*437bfbebSnyanmisaka 
149*437bfbebSnyanmisaka     if (srv && srv->fd >= 0)
150*437bfbebSnyanmisaka         mpp_trace_write(srv->fd, "C|%d|%s|%lld", getpid(), name, value);
151*437bfbebSnyanmisaka }
152*437bfbebSnyanmisaka 
153*437bfbebSnyanmisaka MPP_SINGLETON(MPP_SGLN_TRACE, mpp_trace, mpp_trace_srv_init, mpp_trace_srv_deinit)
154