root/tools/power/cpupower/utils/powercap-info.c
// SPDX-License-Identifier: GPL-2.0-only
/*
 *  (C) 2016 SUSE Software Solutions GmbH
 *           Thomas Renninger <trenn@suse.de>
 */

#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

#include <getopt.h>

#include "powercap.h"
#include "helpers/helpers.h"

int powercap_show_all;

static struct option info_opts[] = {
        { "all",                no_argument,             NULL,   'a'},
        { },
};

static int powercap_print_one_zone(struct powercap_zone *zone)
{
        int mode, i, ret = 0;
        char pr_prefix[1024] = "";

        for (i = 0; i < zone->tree_depth && i < POWERCAP_MAX_TREE_DEPTH; i++)
                strcat(pr_prefix, "\t");

        printf("%sZone: %s", pr_prefix, zone->name);
        ret = powercap_zone_get_enabled(zone, &mode);
        if (ret < 0)
                return ret;
        printf(" (%s)\n", mode ? "enabled" : "disabled");

        if (zone->has_power_uw)
                printf(_("%sPower can be monitored in micro Watts\n"),
                       pr_prefix);

        if (zone->has_energy_uj)
                printf(_("%sPower can be monitored in micro Jules\n"),
                       pr_prefix);

        printf("\n");

        if (ret != 0)
                return ret;
        return ret;
}

static int powercap_show(void)
{
        struct powercap_zone *root_zone;
        char line[MAX_LINE_LEN] = "";
        int ret, val;

        ret = powercap_get_driver(line, MAX_LINE_LEN);
        if (ret < 0) {
                printf(_("No powercapping driver loaded\n"));
                return ret;
        }

        printf("Driver: %s\n", line);
        ret = powercap_get_enabled(&val);
        if (ret < 0)
                return ret;
        if (!val) {
                printf(_("Powercapping is disabled\n"));
                return -1;
        }

        printf(_("Powercap domain hierarchy:\n\n"));
        root_zone = powercap_init_zones();

        if (root_zone == NULL) {
                printf(_("No powercap info found\n"));
                return 1;
        }

        powercap_walk_zones(root_zone, powercap_print_one_zone);

        return 0;
}

int cmd_cap_set(int argc, char **argv)
{
        return 0;
};
int cmd_cap_info(int argc, char **argv)
{
        int ret = 0, cont = 1;

        do {
                ret = getopt_long(argc, argv, "a", info_opts, NULL);
                switch (ret) {
                case '?':
                        cont = 0;
                        break;
                case -1:
                        cont = 0;
                        break;
                case 'a':
                        powercap_show_all = 1;
                        break;
                default:
                        fprintf(stderr, _("invalid or unknown argument\n"));
                        return EXIT_FAILURE;
                }
        } while (cont);

        powercap_show();
        return 0;
}