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