1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright 2021 Rockchip Electronics Co. LTD
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun * You may obtain a copy of the License at
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun * limitations under the License.
15*4882a593Smuzhiyun */
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #define MODULE_TAG "mpp_trace"
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #include <fcntl.h>
20*4882a593Smuzhiyun #include <stdarg.h>
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun #include "mpp_common.h"
23*4882a593Smuzhiyun #include "mpp_trace.h"
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun #define ATRACE_MESSAGE_LENGTH 256
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun class MppTraceService
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun private:
30*4882a593Smuzhiyun // avoid any unwanted function
31*4882a593Smuzhiyun MppTraceService();
32*4882a593Smuzhiyun ~MppTraceService();
33*4882a593Smuzhiyun MppTraceService(const MppTraceService &);
34*4882a593Smuzhiyun MppTraceService &operator=(const MppTraceService &);
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun void trace_write(const char *fmt, ...);
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun RK_S32 mTraceFd;
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun public:
get_inst()41*4882a593Smuzhiyun static MppTraceService *get_inst() {
42*4882a593Smuzhiyun static MppTraceService inst;
43*4882a593Smuzhiyun return &inst;
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun void trace_begin(const char* name);
47*4882a593Smuzhiyun void trace_end(const char* name);
48*4882a593Smuzhiyun void trace_async_begin(const char* name, RK_S32 cookie);
49*4882a593Smuzhiyun void trace_async_end(const char* name, RK_S32 cookie);
50*4882a593Smuzhiyun void trace_int32(const char* name, RK_S32 val);
51*4882a593Smuzhiyun void trace_int64(const char* name, RK_S64 val);
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun
MppTraceService()54*4882a593Smuzhiyun MppTraceService::MppTraceService()
55*4882a593Smuzhiyun {
56*4882a593Smuzhiyun static const char *ftrace_paths[] = {
57*4882a593Smuzhiyun "/sys/kernel/debug/tracing/trace_marker",
58*4882a593Smuzhiyun "/debug/tracing/trace_marker",
59*4882a593Smuzhiyun "/debugfs/tracing/trace_marker",
60*4882a593Smuzhiyun };
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun RK_U32 i;
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun for (i = 0; i < MPP_ARRAY_ELEMS(ftrace_paths); i++) {
65*4882a593Smuzhiyun if (!access(ftrace_paths[i], F_OK)) {
66*4882a593Smuzhiyun mTraceFd = open(ftrace_paths[i], O_WRONLY | O_CLOEXEC);
67*4882a593Smuzhiyun if (mTraceFd >= 0)
68*4882a593Smuzhiyun break;
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun
~MppTraceService()73*4882a593Smuzhiyun MppTraceService::~MppTraceService()
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun if (mTraceFd >= 0) {
76*4882a593Smuzhiyun close(mTraceFd);
77*4882a593Smuzhiyun mTraceFd = -1;
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun
trace_write(const char * fmt,...)81*4882a593Smuzhiyun void MppTraceService::trace_write(const char *fmt, ...)
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun char buf[ATRACE_MESSAGE_LENGTH];
84*4882a593Smuzhiyun va_list ap;
85*4882a593Smuzhiyun RK_S32 len;
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun va_start(ap, fmt);
88*4882a593Smuzhiyun len = vsnprintf(buf, sizeof(buf) - 1, fmt, ap);
89*4882a593Smuzhiyun va_end(ap);
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun (void)!write(mTraceFd, buf, len);
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun
trace_begin(const char * name)94*4882a593Smuzhiyun void MppTraceService::trace_begin(const char* name)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun if (mTraceFd < 0)
97*4882a593Smuzhiyun return;
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun trace_write("B|%d|%s", getpid(), name);
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun
trace_end(const char * name)102*4882a593Smuzhiyun void MppTraceService::trace_end(const char* name)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun if (mTraceFd < 0)
105*4882a593Smuzhiyun return;
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun trace_write("E|%d|%s", getpid(), name);
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun
trace_async_begin(const char * name,RK_S32 cookie)110*4882a593Smuzhiyun void MppTraceService::trace_async_begin(const char* name, RK_S32 cookie)
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun if (mTraceFd < 0)
113*4882a593Smuzhiyun return;
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun trace_write("S|%d|%s|%d", getpid(), name, cookie);
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun
trace_async_end(const char * name,RK_S32 cookie)118*4882a593Smuzhiyun void MppTraceService::trace_async_end(const char* name, RK_S32 cookie)
119*4882a593Smuzhiyun {
120*4882a593Smuzhiyun if (mTraceFd < 0)
121*4882a593Smuzhiyun return;
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun trace_write("F|%d|%s|%d", getpid(), name, cookie);
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun
trace_int32(const char * name,RK_S32 value)126*4882a593Smuzhiyun void MppTraceService::trace_int32(const char* name, RK_S32 value)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun if (mTraceFd < 0)
129*4882a593Smuzhiyun return;
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun trace_write("C|%d|%s|%d", getpid(), name, value);
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun
trace_int64(const char * name,RK_S64 value)134*4882a593Smuzhiyun void MppTraceService::trace_int64(const char* name, RK_S64 value)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun if (mTraceFd < 0)
137*4882a593Smuzhiyun return;
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun trace_write("C|%d|%s|%lld", getpid(), name, value);
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun
mpp_trace_begin(const char * name)142*4882a593Smuzhiyun void mpp_trace_begin(const char* name)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun MppTraceService::get_inst()->trace_begin(name);
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun
mpp_trace_end(const char * name)147*4882a593Smuzhiyun void mpp_trace_end(const char* name)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun MppTraceService::get_inst()->trace_end(name);
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun
mpp_trace_async_begin(const char * name,RK_S32 cookie)152*4882a593Smuzhiyun void mpp_trace_async_begin(const char* name, RK_S32 cookie)
153*4882a593Smuzhiyun {
154*4882a593Smuzhiyun MppTraceService::get_inst()->trace_async_begin(name, cookie);
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun
mpp_trace_async_end(const char * name,RK_S32 cookie)157*4882a593Smuzhiyun void mpp_trace_async_end(const char* name, RK_S32 cookie)
158*4882a593Smuzhiyun {
159*4882a593Smuzhiyun MppTraceService::get_inst()->trace_async_end(name, cookie);
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun
mpp_trace_int32(const char * name,RK_S32 value)162*4882a593Smuzhiyun void mpp_trace_int32(const char* name, RK_S32 value)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun MppTraceService::get_inst()->trace_int32(name, value);
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun
mpp_trace_int64(const char * name,RK_S64 value)167*4882a593Smuzhiyun void mpp_trace_int64(const char* name, RK_S64 value)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun MppTraceService::get_inst()->trace_int64(name, value);
170*4882a593Smuzhiyun }
171