1*418b791dSBob Badour /** 2*418b791dSBob Badour * Copyright (c) 2019, The Linux Foundation. All rights reserved. 3*418b791dSBob Badour * 4*418b791dSBob Badour * Redistribution and use in source and binary forms, with or without 5*418b791dSBob Badour * modification, are permitted provided that the following conditions are 6*418b791dSBob Badour * met: 7*418b791dSBob Badour * * Redistributions of source code must retain the above copyright 8*418b791dSBob Badour * notice, this list of conditions and the following disclaimer. 9*418b791dSBob Badour * * Redistributions in binary form must reproduce the above 10*418b791dSBob Badour * copyright notice, this list of conditions and the following 11*418b791dSBob Badour * disclaimer in the documentation and/or other materials provided 12*418b791dSBob Badour * with the distribution. 13*418b791dSBob Badour * * Neither the name of The Linux Foundation nor the names of its 14*418b791dSBob Badour * contributors may be used to endorse or promote products derived 15*418b791dSBob Badour * from this software without specific prior written permission. 16*418b791dSBob Badour * 17*418b791dSBob Badour * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18*418b791dSBob Badour * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19*418b791dSBob Badour * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20*418b791dSBob Badour * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21*418b791dSBob Badour * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22*418b791dSBob Badour * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23*418b791dSBob Badour * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24*418b791dSBob Badour * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25*418b791dSBob Badour * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26*418b791dSBob Badour * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27*418b791dSBob Badour * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*418b791dSBob Badour */ 29*418b791dSBob Badour 30*418b791dSBob Badour #ifndef _ADSP_PERF_H 31*418b791dSBob Badour #define _ADSP_PERF_H 32*418b791dSBob Badour #include "AEEStdDef.h" 33*418b791dSBob Badour #ifndef __QAIC_HEADER 34*418b791dSBob Badour #define __QAIC_HEADER(ff) ff 35*418b791dSBob Badour #endif //__QAIC_HEADER 36*418b791dSBob Badour 37*418b791dSBob Badour #ifndef __QAIC_HEADER_EXPORT 38*418b791dSBob Badour #define __QAIC_HEADER_EXPORT 39*418b791dSBob Badour #endif // __QAIC_HEADER_EXPORT 40*418b791dSBob Badour 41*418b791dSBob Badour #ifndef __QAIC_HEADER_ATTRIBUTE 42*418b791dSBob Badour #define __QAIC_HEADER_ATTRIBUTE 43*418b791dSBob Badour #endif // __QAIC_HEADER_ATTRIBUTE 44*418b791dSBob Badour 45*418b791dSBob Badour #ifndef __QAIC_IMPL 46*418b791dSBob Badour #define __QAIC_IMPL(ff) ff 47*418b791dSBob Badour #endif //__QAIC_IMPL 48*418b791dSBob Badour 49*418b791dSBob Badour #ifndef __QAIC_IMPL_EXPORT 50*418b791dSBob Badour #define __QAIC_IMPL_EXPORT 51*418b791dSBob Badour #endif // __QAIC_IMPL_EXPORT 52*418b791dSBob Badour 53*418b791dSBob Badour #ifndef __QAIC_IMPL_ATTRIBUTE 54*418b791dSBob Badour #define __QAIC_IMPL_ATTRIBUTE 55*418b791dSBob Badour #endif // __QAIC_IMPL_ATTRIBUTE 56*418b791dSBob Badour #ifdef __cplusplus 57*418b791dSBob Badour extern "C" { 58*418b791dSBob Badour #endif 59*418b791dSBob Badour /** 60*418b791dSBob Badour * Interface for querying the adsp for counter data 61*418b791dSBob Badour * For example, to enable all the perf numbers: 62*418b791dSBob Badour * 63*418b791dSBob Badour * int perf_on(void) { 64*418b791dSBob Badour * int nErr = 0; 65*418b791dSBob Badour * int numKeys = 0, maxLen = 0, ii; 66*418b791dSBob Badour * char keys[512]; 67*418b791dSBob Badour * char* buf = &keys[0]; 68*418b791dSBob Badour * VERIFY(0 == adsp_perf_get_keys(keys, 512, &maxLen, &numKeys)); 69*418b791dSBob Badour * assert(maxLen < 512); 70*418b791dSBob Badour * for(ii = 0; ii < numKeys; ++ii) { 71*418b791dSBob Badour * char* name = buf; 72*418b791dSBob Badour * buf += strlen(name) + 1; 73*418b791dSBob Badour * printf("perf on: %s\n", name); 74*418b791dSBob Badour * VERIFY(0 == adsp_perf_enable(ii)); 75*418b791dSBob Badour * } 76*418b791dSBob Badour * bail: 77*418b791dSBob Badour * return nErr; 78*418b791dSBob Badour * } 79*418b791dSBob Badour * 80*418b791dSBob Badour * To read all the results: 81*418b791dSBob Badour * 82*418b791dSBob Badour * int rpcperf_perf_result(void) { 83*418b791dSBob Badour * int nErr = 0; 84*418b791dSBob Badour * int numKeys, maxLen, ii; 85*418b791dSBob Badour * char keys[512]; 86*418b791dSBob Badour * char* buf = &keys[0]; 87*418b791dSBob Badour * long long usecs[16]; 88*418b791dSBob Badour * VERIFY(0 == adsp_perf_get_keys(keys, 512, &maxLen, &numKeys)); 89*418b791dSBob Badour * printf("perf keys: %d\n", numKeys); 90*418b791dSBob Badour * VERIFY(0 == adsp_perf_get_usecs(usecs, 16)); 91*418b791dSBob Badour * assert(maxLen < 512); 92*418b791dSBob Badour * assert(numKeys < 16); 93*418b791dSBob Badour * for(ii = 0; ii < numKeys; ++ii) { 94*418b791dSBob Badour * char* name = buf; 95*418b791dSBob Badour * buf += strlen(name) + 1; 96*418b791dSBob Badour * printf("perf result: %s %lld\n", name, usecs[ii]); 97*418b791dSBob Badour * } 98*418b791dSBob Badour * bail: 99*418b791dSBob Badour * return nErr; 100*418b791dSBob Badour * } 101*418b791dSBob Badour */ 102*418b791dSBob Badour #define _const_adsp_perf_handle 6 103*418b791dSBob Badour __QAIC_HEADER_EXPORT int __QAIC_HEADER(adsp_perf_enable)(int ix) __QAIC_HEADER_ATTRIBUTE; 104*418b791dSBob Badour __QAIC_HEADER_EXPORT int __QAIC_HEADER(adsp_perf_get_usecs)(int64* dst, int dstLen) __QAIC_HEADER_ATTRIBUTE; 105*418b791dSBob Badour __QAIC_HEADER_EXPORT int __QAIC_HEADER(adsp_perf_get_keys)(char* keys, int keysLen, int* maxLen, int* numKeys) __QAIC_HEADER_ATTRIBUTE; 106*418b791dSBob Badour #ifdef __cplusplus 107*418b791dSBob Badour } 108*418b791dSBob Badour #endif 109*418b791dSBob Badour #endif //_ADSP_PERF_H 110