Commit f2464458 authored by David E. Box's avatar David E. Box Committed by Hans de Goede

tools/arch/x86/intel_sdsi: Add current meter support

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: default avatarDavid E. Box <david.e.box@linux.intel.com>
Reviewed-by: default avatarKuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://lore.kernel.org/r/20240411025856.2782476-10-david.e.box@linux.intel.comSigned-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 53310fe9
...@@ -185,6 +185,7 @@ struct sdsi_dev { ...@@ -185,6 +185,7 @@ struct sdsi_dev {
enum command { enum command {
CMD_SOCKET_INFO, CMD_SOCKET_INFO,
CMD_METER_CERT, CMD_METER_CERT,
CMD_METER_CURRENT_CERT,
CMD_STATE_CERT, CMD_STATE_CERT,
CMD_PROV_AKC, CMD_PROV_AKC,
CMD_PROV_CAP, CMD_PROV_CAP,
...@@ -333,13 +334,14 @@ static void get_feature(uint32_t encoding, char feature[5]) ...@@ -333,13 +334,14 @@ static void get_feature(uint32_t encoding, char feature[5])
feature[0] = name[3]; 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}; char buf[METER_CERT_MAX_SIZE] = {0};
struct bundle_encoding_counter *bec; struct bundle_encoding_counter *bec;
struct meter_certificate *mc; struct meter_certificate *mc;
uint32_t count = 0; uint32_t count = 0;
FILE *cert_ptr; FILE *cert_ptr;
char *cert_fname;
int ret, size; int ret, size;
char name[FEAT_LEN]; char name[FEAT_LEN];
...@@ -349,7 +351,6 @@ static int sdsi_meter_cert_show(struct sdsi_dev *s) ...@@ -349,7 +351,6 @@ static int sdsi_meter_cert_show(struct sdsi_dev *s)
if (!s->regs.en_features.sdsi) { if (!s->regs.en_features.sdsi) {
fprintf(stderr, "SDSi feature is present but not enabled.\n"); fprintf(stderr, "SDSi feature is present but not enabled.\n");
fprintf(stderr, " Unable to read meter certificate\n");
return -1; return -1;
} }
...@@ -364,15 +365,17 @@ static int sdsi_meter_cert_show(struct sdsi_dev *s) ...@@ -364,15 +365,17 @@ static int sdsi_meter_cert_show(struct sdsi_dev *s)
return ret; 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) { if (!cert_ptr) {
perror("Could not open 'meter_certificate' file"); fprintf(stderr, "Could not open '%s' file: %s", cert_fname, strerror(errno));
return -1; return -1;
} }
size = fread(buf, 1, sizeof(buf), cert_ptr); size = fread(buf, 1, sizeof(buf), cert_ptr);
if (!size) { if (!size) {
fprintf(stderr, "Could not read 'meter_certificate' file\n"); fprintf(stderr, "Could not read '%s' file\n", cert_fname);
fclose(cert_ptr); fclose(cert_ptr);
return -1; return -1;
} }
...@@ -738,7 +741,7 @@ static void sdsi_free_dev(struct sdsi_dev *s) ...@@ -738,7 +741,7 @@ static void sdsi_free_dev(struct sdsi_dev *s)
static void usage(char *prog) 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) static void show_help(void)
...@@ -747,8 +750,9 @@ 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", "-l, --list", "list available On Demand devices");
printf(" %-18s\t%s\n", "-d, --devno DEVNO", "On Demand device number"); 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", "-i, --info", "show socket information");
printf(" %-18s\t%s\n", "-s, --state", "show state certificate"); printf(" %-18s\t%s\n", "-s, --state", "show state certificate data");
printf(" %-18s\t%s\n", "-m, --meter", "show meter certificate"); 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", "-a, --akc FILE", "provision socket with AKC FILE");
printf(" %-18s\t%s\n", "-c, --cap FILE>", "provision socket with CAP FILE"); printf(" %-18s\t%s\n", "-c, --cap FILE>", "provision socket with CAP FILE");
} }
...@@ -764,21 +768,22 @@ int main(int argc, char *argv[]) ...@@ -764,21 +768,22 @@ int main(int argc, char *argv[])
int option_index = 0; int option_index = 0;
static struct option long_options[] = { static struct option long_options[] = {
{"akc", required_argument, 0, 'a'}, {"akc", required_argument, 0, 'a'},
{"cap", required_argument, 0, 'c'}, {"cap", required_argument, 0, 'c'},
{"devno", required_argument, 0, 'd'}, {"devno", required_argument, 0, 'd'},
{"help", no_argument, 0, 'h'}, {"help", no_argument, 0, 'h'},
{"info", no_argument, 0, 'i'}, {"info", no_argument, 0, 'i'},
{"list", no_argument, 0, 'l'}, {"list", no_argument, 0, 'l'},
{"meter", no_argument, 0, 'm'}, {"meter", no_argument, 0, 'm'},
{"state", no_argument, 0, 's'}, {"meter_current", no_argument, 0, 'C'},
{0, 0, 0, 0 } {"state", no_argument, 0, 's'},
{0, 0, 0, 0 }
}; };
progname = argv[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) { &option_index)) != -1) {
switch (opt) { switch (opt) {
case 'd': case 'd':
...@@ -794,6 +799,9 @@ int main(int argc, char *argv[]) ...@@ -794,6 +799,9 @@ int main(int argc, char *argv[])
case 'm': case 'm':
command = CMD_METER_CERT; command = CMD_METER_CERT;
break; break;
case 'C':
command = CMD_METER_CURRENT_CERT;
break;
case 's': case 's':
command = CMD_STATE_CERT; command = CMD_STATE_CERT;
break; break;
...@@ -832,7 +840,10 @@ int main(int argc, char *argv[]) ...@@ -832,7 +840,10 @@ int main(int argc, char *argv[])
ret = sdsi_read_reg(s); ret = sdsi_read_reg(s);
break; break;
case CMD_METER_CERT: 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; break;
case CMD_STATE_CERT: case CMD_STATE_CERT:
ret = sdsi_state_cert_show(s); ret = sdsi_state_cert_show(s);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment