blob: 926aa7752cb7a27a7119d52cb8c7411b4a113b2a [file] [log] [blame]
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <getopt.h>
#include <stdbool.h>
#include <limits.h>
#include <string.h>
#include <inttypes.h>
#include <linux/mfd/adnc/iaxxx-module.h>
#define LOG_TAG "ia_get_pwr_stats"
#include <log/log.h>
#define GETOPT_HELP_CHAR (CHAR_MIN - 2)
#define DEV_NODE "/dev/iaxxx-module-celldrv"
struct ia_pwr_mgr {
FILE *dev_node;
};
static struct option const long_options[] =
{
{"cumulative count", no_argument, NULL, 'c'},
{"help", no_argument, NULL, GETOPT_HELP_CHAR},
{NULL, 0, NULL, 0}
};
void usage() {
fputs("\
USAGE -\n\
-------\n\
1) get_pwr_stats -c\n\
\n\
get pwr stats with all cumulative counters for each\n\
mpll and apll clock freq values\n\
", stdout);
fputs("\n\
OPTIONS - \n\
---------\n\
-c get pwr stats for each mpll and apll clk values.\n\
", stdout);
exit(EXIT_FAILURE);
}
int main(int argc, char *argv[]) {
struct ia_pwr_mgr * pwr = NULL;
struct iaxxx_pwr_stats pwr_stats_count;
char use_case;
int getchr;
int i = 0;
int err = 0;
if (argc <= 1) {
usage();
}
while ((getchr = getopt_long (argc, argv, "c", long_options, NULL)) != -1) {
switch (getchr) {
case 'c':
use_case = 'c';
break;
case GETOPT_HELP_CHAR:
default:
usage();
break;
}
}
pwr = (struct ia_pwr_mgr*) malloc(sizeof(struct ia_pwr_mgr));
if (NULL == pwr) {
ALOGE("ERROR Failed to allocated memory for ia_pwr_mgr");
fprintf(stderr, "ERROR Failed to allocated memory for ia_pwr_mgr");
return -ENOMEM;
}
if((pwr->dev_node = fopen(DEV_NODE, "r")) == NULL) {
ALOGE("%s: ERROR file %s open for write error: %s\n",
__func__, DEV_NODE, strerror(errno));
err = -EBADFD;
fprintf(stderr, "%s: ERROR file %s open for write error: %s\n", __func__, DEV_NODE, strerror(errno));
goto out;
}
if ('c' == use_case) {
err = ioctl(fileno(pwr->dev_node), IAXXX_POWER_STATS_COUNT, &pwr_stats_count);
if (0 != err) {
ALOGE("ERROR: POWER STATS COUNT failed %d(%s)", errno, strerror(errno));
fprintf(stderr, "ERROR: POWER STATS COUNT failed %d(%s)", errno, strerror(errno));
goto out;
}
for (i = 0; i < NUM_MPLL_CLK_FREQ; i++){
ALOGI("mpll_cumulative_cnts (%d) counter value: %"PRIu64"\n", i, pwr_stats_count.mpll_cumulative_cnts[i]);
fprintf(stdout, "mpll_cumulative_cnts (%d) counter value: %"PRIu64"\n", i, pwr_stats_count.mpll_cumulative_cnts[i]);
}
for (i = 0; i < NUM_APLL_CLK_FREQ; i++){
ALOGI("apll_cumulative_cnts (%d) counter value: %"PRIu64"\n", i, pwr_stats_count.apll_cumulative_cnts[i]);
fprintf(stdout, "apll_cumulative_cnts (%d) counter value: %"PRIu64"\n", i, pwr_stats_count.apll_cumulative_cnts[i]);
}
for (i = 0; i < NUM_MPLL_CLK_FREQ; i++){
ALOGI("mpllCumulativeDur (%d) Duration value: %" PRIu64 "\n", i, pwr_stats_count.mpllCumulativeDur[i]);
fprintf(stdout, "mpllCumulativeDur (%d) Duration value %" PRIu64 "\n", i, pwr_stats_count.mpllCumulativeDur[i]);
}
for (i = 0; i < NUM_MPLL_CLK_FREQ; i++){
ALOGI("mpllTimeStamp (%d) Last time stamp value : %" PRIu64 "\n", i, pwr_stats_count.mpllTimeStamp[i]);
fprintf(stdout, "mpllTimeStamp (%d) Last time stamp value : %"PRIu64"\n", i, pwr_stats_count.mpllTimeStamp[i]);
}
ALOGI("sleepModeTimeStamp, Last time stamp value for Sleep : %" PRIu64 "\n", pwr_stats_count.sleepModeTimeStamp);
fprintf(stdout, "sleepModeTimeStamp, Last time stamp value for Sleep : %" PRIu64"\n", pwr_stats_count.sleepModeTimeStamp);
ALOGI("sleepModeCumulativeDur, Total cumulative sleep duration : %"PRIu64"\n", pwr_stats_count.sleepModeCumulativeDur);
fprintf(stdout, "sleepModeCumulativeDur, Total cumulative sleep duration : %"PRIu64"\n", pwr_stats_count.sleepModeCumulativeDur);
ALOGI("POWER STATS COUNT success\n");
fprintf(stdout, "POWER STATS COUNT success\n");
}
out:
if (pwr) {
if (pwr->dev_node) {
fclose(pwr->dev_node);
}
free(pwr);
pwr = NULL;
}
return err;
}