tools/arch/x86/intel_sdsi: Add current meter support
authorDavid E. Box <david.e.box@linux.intel.com>
Thu, 11 Apr 2024 02:58:56 +0000 (19:58 -0700)
committerHans de Goede <hdegoede@redhat.com>
Mon, 29 Apr 2024 08:52:02 +0000 (10:52 +0200)
Add support to read the 'meter_current' file. The display is the same as
the 'meter_certificate', but will show the current snapshot of the
counters.

Signed-off-by: David E. Box <david.e.box@linux.intel.com>
Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://lore.kernel.org/r/20240411025856.2782476-10-david.e.box@linux.intel.com
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
tools/arch/x86/intel_sdsi/intel_sdsi.c

index 301213370740ac56f1074bc3eb2e330c783bce7f..766a5d26f53480c9f7b6f23a1ade593f988f795b 100644 (file)
@@ -185,6 +185,7 @@ struct sdsi_dev {
 enum command {
        CMD_SOCKET_INFO,
        CMD_METER_CERT,
+       CMD_METER_CURRENT_CERT,
        CMD_STATE_CERT,
        CMD_PROV_AKC,
        CMD_PROV_CAP,
@@ -333,13 +334,14 @@ static void get_feature(uint32_t encoding, char feature[5])
        feature[0] = name[3];
 }
 
-static int sdsi_meter_cert_show(struct sdsi_dev *s)
+static int sdsi_meter_cert_show(struct sdsi_dev *s, bool show_current)
 {
        char buf[METER_CERT_MAX_SIZE] = {0};
        struct bundle_encoding_counter *bec;
        struct meter_certificate *mc;
        uint32_t count = 0;
        FILE *cert_ptr;
+       char *cert_fname;
        int ret, size;
        char name[FEAT_LEN];
 
@@ -349,7 +351,6 @@ static int sdsi_meter_cert_show(struct sdsi_dev *s)
 
        if (!s->regs.en_features.sdsi) {
                fprintf(stderr, "SDSi feature is present but not enabled.\n");
-               fprintf(stderr, " Unable to read meter certificate\n");
                return -1;
        }
 
@@ -364,15 +365,17 @@ static int sdsi_meter_cert_show(struct sdsi_dev *s)
                return ret;
        }
 
-       cert_ptr = fopen("meter_certificate", "r");
+       cert_fname = show_current ? "meter_current" : "meter_certificate";
+       cert_ptr = fopen(cert_fname, "r");
+
        if (!cert_ptr) {
-               perror("Could not open 'meter_certificate' file");
+               fprintf(stderr, "Could not open '%s' file: %s", cert_fname, strerror(errno));
                return -1;
        }
 
        size = fread(buf, 1, sizeof(buf), cert_ptr);
        if (!size) {
-               fprintf(stderr, "Could not read 'meter_certificate' file\n");
+               fprintf(stderr, "Could not read '%s' file\n", cert_fname);
                fclose(cert_ptr);
                return -1;
        }
@@ -738,7 +741,7 @@ static void sdsi_free_dev(struct sdsi_dev *s)
 
 static void usage(char *prog)
 {
-       printf("Usage: %s [-l] [-d DEVNO [-i] [-s] [-m] [-a FILE] [-c FILE]]\n", prog);
+       printf("Usage: %s [-l] [-d DEVNO [-i] [-s] [-m | -C] [-a FILE] [-c FILE]\n", prog);
 }
 
 static void show_help(void)
@@ -747,8 +750,9 @@ static void show_help(void)
        printf("  %-18s\t%s\n", "-l, --list",           "list available On Demand devices");
        printf("  %-18s\t%s\n", "-d, --devno DEVNO",    "On Demand device number");
        printf("  %-18s\t%s\n", "-i, --info",           "show socket information");
-       printf("  %-18s\t%s\n", "-s, --state",          "show state certificate");
-       printf("  %-18s\t%s\n", "-m, --meter",          "show meter certificate");
+       printf("  %-18s\t%s\n", "-s, --state",          "show state certificate data");
+       printf("  %-18s\t%s\n", "-m, --meter",          "show meter certificate data");
+       printf("  %-18s\t%s\n", "-C, --meter_current",  "show live unattested meter data");
        printf("  %-18s\t%s\n", "-a, --akc FILE",       "provision socket with AKC FILE");
        printf("  %-18s\t%s\n", "-c, --cap FILE>",      "provision socket with CAP FILE");
 }
@@ -764,21 +768,22 @@ int main(int argc, char *argv[])
        int option_index = 0;
 
        static struct option long_options[] = {
-               {"akc",         required_argument,      0, 'a'},
-               {"cap",         required_argument,      0, 'c'},
-               {"devno",       required_argument,      0, 'd'},
-               {"help",        no_argument,            0, 'h'},
-               {"info",        no_argument,            0, 'i'},
-               {"list",        no_argument,            0, 'l'},
-               {"meter",       no_argument,            0, 'm'},
-               {"state",       no_argument,            0, 's'},
-               {0,             0,                      0, 0 }
+               {"akc",                 required_argument,      0, 'a'},
+               {"cap",                 required_argument,      0, 'c'},
+               {"devno",               required_argument,      0, 'd'},
+               {"help",                no_argument,            0, 'h'},
+               {"info",                no_argument,            0, 'i'},
+               {"list",                no_argument,            0, 'l'},
+               {"meter",               no_argument,            0, 'm'},
+               {"meter_current",       no_argument,            0, 'C'},
+               {"state",               no_argument,            0, 's'},
+               {0,                     0,                      0, 0 }
        };
 
 
        progname = argv[0];
 
-       while ((opt = getopt_long_only(argc, argv, "+a:c:d:hilms", long_options,
+       while ((opt = getopt_long_only(argc, argv, "+a:c:d:hilmCs", long_options,
                        &option_index)) != -1) {
                switch (opt) {
                case 'd':
@@ -794,6 +799,9 @@ int main(int argc, char *argv[])
                case 'm':
                        command = CMD_METER_CERT;
                        break;
+               case 'C':
+                       command = CMD_METER_CURRENT_CERT;
+                       break;
                case 's':
                        command = CMD_STATE_CERT;
                        break;
@@ -832,7 +840,10 @@ int main(int argc, char *argv[])
                        ret = sdsi_read_reg(s);
                        break;
                case CMD_METER_CERT:
-                       ret = sdsi_meter_cert_show(s);
+                       ret = sdsi_meter_cert_show(s, false);
+                       break;
+               case CMD_METER_CURRENT_CERT:
+                       ret = sdsi_meter_cert_show(s, true);
                        break;
                case CMD_STATE_CERT:
                        ret = sdsi_state_cert_show(s);