13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*
23d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
33d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Not a Contribution.
43d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
53d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Copyright (C) 2012 The Android Open Source Project
63d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
73d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Licensed under the Apache License, Version 2.0 (the "License");
83d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * you may not use this file except in compliance with the License.
93d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * You may obtain a copy of the License at
103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      http://www.apache.org/licenses/LICENSE-2.0
123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Unless required by applicable law or agreed to in writing, software
143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * distributed under the License is distributed on an "AS IS" BASIS,
153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * See the License for the specific language governing permissions and
173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * limitations under the License.
183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel */
193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef __QCAMERATRACE_H__
213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define __QCAMERATRACE_H__
223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/Trace.h>
24e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#include "camscope_packet_type.h"
253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifdef QCAMERA_REDEFINE_LOG
273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define CAM_MODULE CAM_HAL_MODULE
283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern "C" {
293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_camera_dbg.h"
303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif
323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#undef ATRACE_CALL
343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#undef ATRACE_NAME
353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#undef ATRACE_BEGIN
363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#undef ATRACE_INT
373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#undef ATRACE_END
383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#undef ATRACE_BEGIN_SNPRINTF
393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#undef KPI_ATRACE_BEGIN
403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#undef KPI_ATRACE_END
413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#undef KPI_ATRACE_INT
423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#undef ATRACE_TAG
433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#undef ATRACE_BEGIN_DBG
443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#undef ATRACE_INT_DBG
453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#undef ATRACE_END_DBG
463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define KPI_ONLY 1
483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define KPI_DBG 2
493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define CAMERA_TRACE_BUF 32
513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ATRACE_TAG ATRACE_TAG_CAMERA
533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel//to enable only KPI logs
553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define KPI_ATRACE_BEGIN(name) ({\
563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelif (gKpiDebugLevel >= KPI_ONLY) { \
573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     atrace_begin(ATRACE_TAG, name); \
583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}\
593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel})
603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define KPI_ATRACE_END() ({\
623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelif (gKpiDebugLevel >= KPI_ONLY) { \
633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     atrace_end(ATRACE_TAG); \
643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}\
653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel})
663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define KPI_ATRACE_INT(name,val) ({\
683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelif (gKpiDebugLevel >= KPI_ONLY) { \
693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     atrace_int(ATRACE_TAG, name, val); \
703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}\
713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel})
723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ATRACE_BEGIN_SNPRINTF(fmt_str, ...) \
753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (gKpiDebugLevel >= KPI_DBG) { \
763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel   char trace_tag[CAMERA_TRACE_BUF]; \
773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel   snprintf(trace_tag, CAMERA_TRACE_BUF, fmt_str, ##__VA_ARGS__); \
783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel   ATRACE_BEGIN(trace_tag); \
793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ATRACE_BEGIN_DBG(name) ({\
823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelif (gKpiDebugLevel >= KPI_DBG) { \
833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     atrace_begin(ATRACE_TAG, name); \
843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}\
853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel})
863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ATRACE_END_DBG() ({\
883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelif (gKpiDebugLevel >= KPI_DBG) { \
893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     atrace_end(ATRACE_TAG); \
903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}\
913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel})
923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ATRACE_INT_DBG(name,val) ({\
943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelif (gKpiDebugLevel >= KPI_DBG) { \
953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     atrace_int(ATRACE_TAG, name, val); \
963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}\
973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel})
983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ATRACE_BEGIN ATRACE_BEGIN_DBG
1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ATRACE_INT ATRACE_INT_DBG
1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ATRACE_END ATRACE_END_DBG
1023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
103e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define CAMSCOPE_MAX_STRING_LENGTH 64
104e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
105e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel/* Initializes CameraScope tool */
106e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelvoid camscope_init(camscope_section_type camscope_section);
107e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
108e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel/* Cleans up CameraScope tool */
109e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelvoid camscope_destroy(camscope_section_type camscope_section);
110e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
111e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel/* Reserves a number of bytes on the memstore flushing to the
112e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel * file system if remaining space is insufficient */
113e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudeluint32_t camscope_reserve(camscope_section_type camscope_section,
114e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                                 uint32_t num_bytes_to_reserve);
115e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
116e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel/* Store the data to the memstore and calculate remaining space */
117e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelvoid camscope_store_data(camscope_section_type camscope_section,
118e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                       void* data, uint32_t size);
119e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
120e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel/* Lock the camscope mutex lock for the given camscope section */
121e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelvoid camscope_mutex_lock(camscope_section_type camscope_section);
122e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
123e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel/* Unlock the camscope mutex lock for the given camscope section */
124e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelvoid camscope_mutex_unlock(camscope_section_type camscope_section);
125e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
126e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define CAMSCOPE_SYSTRACE_TIME_MARKER() { \
127e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    if (kpi_camscope_frame_count != 0) { \
128e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        if (kpi_camscope_flags & CAMSCOPE_ON_FLAG) { \
129e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            struct timeval t_domain; \
130e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            char trace_time_conv[CAMSCOPE_MAX_STRING_LENGTH]; \
131e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            gettimeofday(&t_domain, NULL); \
132e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            snprintf(trace_time_conv, sizeof(trace_time_conv), \
133e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     "_CAMSCOPE_TIME_CONV_:%ld:%ld", t_domain.tv_sec, \
134e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     t_domain.tv_usec); \
135e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            atrace_int(ATRACE_TAG_ALWAYS, trace_time_conv, 0); \
136e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        } \
137e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    } \
138e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel}
139e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
140e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define CAMSCOPE_MASK(mask) { \
141e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    char prop[PROPERTY_VALUE_MAX]; \
142e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    property_get("persist.camera.kpi.camscope", prop, "0"); \
143e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    mask = atoi(prop); \
144e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel}
145e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
146e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define CAMSCOPE_FRAME_COUNT_MASK(mask) { \
147e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    char prop[PROPERTY_VALUE_MAX]; \
148e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    property_get("persist.camera.kpi.camscope_cnt", prop, "0"); \
149e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    mask = atoi(prop); \
150e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel}
151e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
152e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define CAMSCOPE_UPDATE_FLAGS(camscope_section, camscope_prop) { \
153e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    if (kpi_camscope_frame_count != 0) { \
154e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        static uint32_t camscope_frame_counter = 0; \
155e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        if (camscope_frame_counter >= kpi_camscope_frame_count) { \
156e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            uint32_t prev_prop = camscope_prop; \
157e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            CAMSCOPE_MASK(camscope_prop); \
158e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            uint32_t is_prev_prop_on = (prev_prop & CAMSCOPE_ON_FLAG) \
159e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                                        ? 1 : 0; \
160e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            uint32_t is_prop_on = (camscope_prop & CAMSCOPE_ON_FLAG) \
161e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                                   ? 1 : 0; \
162e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            if (is_prev_prop_on ^ is_prop_on) { \
163e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                if (is_prop_on) { \
164e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                    camscope_init(camscope_section); \
165e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                } else { \
166e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                    camscope_destroy(camscope_section); \
167e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                } \
168e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            } \
169e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            CAMSCOPE_SYSTRACE_TIME_MARKER(); \
170e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            camscope_frame_counter = 0; \
171e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        } \
172e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        else { \
173e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            ++camscope_frame_counter; \
174e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        } \
175e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    } \
176e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel}
177e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
178e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define CAMSCOPE_INIT(camscope_section) { \
179e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    CAMSCOPE_FRAME_COUNT_MASK(kpi_camscope_frame_count); \
180e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    if (kpi_camscope_frame_count != 0) { \
181e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        CAMSCOPE_MASK(kpi_camscope_flags); \
182e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        if (kpi_camscope_flags & CAMSCOPE_ON_FLAG) { \
183e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            camscope_init(camscope_section); \
184e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            CAMSCOPE_SYSTRACE_TIME_MARKER(); \
185e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        } \
186e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    } \
187e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel}
188e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
189e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define CAMSCOPE_DESTROY(camscope_section) { \
190e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    if (kpi_camscope_frame_count != 0) { \
191e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        if (kpi_camscope_flags & CAMSCOPE_ON_FLAG) { \
192e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            camscope_destroy(camscope_section); \
193e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        } \
194e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    } \
195e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel}
196e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
197e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define KPI_ATRACE_CAMSCOPE_BEGIN(camscope_name) ({\
198e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelif (camscope_name < CAMSCOPE_EVENT_NAME_SIZE && \
199e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    camscope_name >= 0) { \
200e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    KPI_ATRACE_BEGIN(camscope_atrace_names[camscope_name]); \
201e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel} \
202e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelcamscope_sw_base_log((uint32_t)CAMSCOPE_SECTION_HAL, \
203e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     CAMSCOPE_KPI_MASK, \
204e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     CAMSCOPE_SYNC_BEGIN, \
205e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     camscope_name); \
206e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel})
207e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
208e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define KPI_ATRACE_CAMSCOPE_END(camscope_name) ({\
209e80ad7c01b6fb44006dc55546b700fca34bb00edThierry StrudelKPI_ATRACE_END(); \
210e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelcamscope_sw_base_log((uint32_t)CAMSCOPE_SECTION_HAL, \
211e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     CAMSCOPE_KPI_MASK, \
212e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     CAMSCOPE_SYNC_END, \
213e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     camscope_name); \
214e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel})
215e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
216e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel// This macro only works with counter values that act like begin/end
217e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define KPI_ATRACE_CAMSCOPE_INT(name, camscope_name, counter) ({\
218e80ad7c01b6fb44006dc55546b700fca34bb00edThierry StrudelKPI_ATRACE_INT(name, counter); \
219e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelcamscope_timing_log((uint32_t)CAMSCOPE_SECTION_HAL, \
220e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     CAMSCOPE_KPI_MASK, \
221e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     counter ? CAMSCOPE_ASYNC_BEGIN : CAMSCOPE_ASYNC_END, \
222e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     camscope_name, 0); \
223e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel})
224e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
225e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define ATRACE_CAMSCOPE_BEGIN(camscope_name) ({\
226e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelif (camscope_name < CAMSCOPE_EVENT_NAME_SIZE && \
227e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    camscope_name >= 0) { \
228e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_BEGIN_DBG(camscope_atrace_names[camscope_name]); \
229e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel} \
230e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelcamscope_sw_base_log((uint32_t)CAMSCOPE_SECTION_HAL, \
231e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     CAMSCOPE_KPI_DBG_MASK, \
232e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     CAMSCOPE_SYNC_BEGIN, \
233e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     camscope_name); \
234e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel})
235e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
236e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define ATRACE_CAMSCOPE_END(camscope_name) ({\
237e80ad7c01b6fb44006dc55546b700fca34bb00edThierry StrudelATRACE_END_DBG(); \
238e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelcamscope_sw_base_log(CAMSCOPE_SECTION_HAL, \
239e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     CAMSCOPE_KPI_DBG_MASK, \
240e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     CAMSCOPE_SYNC_END, \
241e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                     camscope_name); \
242e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel})
243e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
244e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define KPI_ATRACE_CAMSCOPE_NAME(camscope_name) qcamera::CamscopeTraceKpi ___tracer(camscope_name)
245e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define ATRACE_CAMSCOPE_NAME(camscope_name) qcamera::CamscopeTraceDbg ___tracer(camscope_name)
246e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define KPI_ATRACE_CAMSCOPE_CALL(camscope_name) KPI_ATRACE_CAMSCOPE_NAME(camscope_name)
247e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel#define ATRACE_CAMSCOPE_CALL(camscope_name) ATRACE_CAMSCOPE_NAME(camscope_name)
248e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define KPI_ATRACE_NAME(name) qcamera::ScopedTraceKpi ___tracer(ATRACE_TAG, name)
2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ATRACE_NAME(name) qcamera::ScopedTraceDbg ___tracer(ATRACE_TAG, name)
2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define KPI_ATRACE_CALL() KPI_ATRACE_NAME(__FUNCTION__)
2523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ATRACE_CALL() ATRACE_NAME(__FUNCTION__)
2533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelnamespace qcamera {
2553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern volatile uint32_t gKpiDebugLevel;
2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelclass ScopedTraceKpi {
2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelpublic:
2583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    inline ScopedTraceKpi(uint64_t tag, const char *name)
2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    : mTag(tag) {
2603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (gKpiDebugLevel >= KPI_ONLY) {
2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            atrace_begin(mTag,name);
2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
2633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    inline ~ScopedTraceKpi() {
2663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (gKpiDebugLevel >= KPI_ONLY) {
2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            atrace_end(mTag);
2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
2693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    private:
2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint64_t mTag;
2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelclass ScopedTraceDbg {
2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelpublic:
2773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    inline ScopedTraceDbg(uint64_t tag, const char *name)
2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    : mTag(tag) {
2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (gKpiDebugLevel >= KPI_DBG) {
2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            atrace_begin(mTag,name);
2813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
2823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    inline ~ScopedTraceDbg() {
2853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (gKpiDebugLevel >= KPI_DBG) {
2863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            atrace_end(mTag);
2873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    private:
2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint64_t mTag;
2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
293e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
294e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelclass CamscopeTraceKpi {
295e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelpublic:
296e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    inline CamscopeTraceKpi(const uint32_t camscope_name)
297e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    : mCamscopeName(camscope_name) {
298e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        KPI_ATRACE_CAMSCOPE_BEGIN(mCamscopeName);
299e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    }
300e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
301e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    inline ~CamscopeTraceKpi() {
302e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        KPI_ATRACE_CAMSCOPE_END(mCamscopeName);
303e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    }
304e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
305e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    private:
306e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        const uint32_t mCamscopeName;
307e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel};
308e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
309e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelclass CamscopeTraceDbg {
310e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudelpublic:
311e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    inline CamscopeTraceDbg(const uint32_t camscope_name)
312e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    : mCamscopeName(camscope_name) {
313e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        ATRACE_CAMSCOPE_BEGIN(mCamscopeName);
314e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    }
315e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
316e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    inline ~CamscopeTraceDbg() {
317e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        ATRACE_CAMSCOPE_END(mCamscopeName);
318e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    }
319e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
320e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    private:
321e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        const uint32_t mCamscopeName;
322e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel};
3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern volatile uint32_t gKpiDebugLevel;
3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif /* __QCAMREATRACE_H__ */
328