aboutsummaryrefslogtreecommitdiff
path: root/external/xscom-utils
diff options
context:
space:
mode:
authorOliver O'Halloran <oohall@gmail.com>2018-09-18 13:05:32 +1000
committerStewart Smith <stewart@linux.ibm.com>2018-09-20 14:30:51 +1000
commit6e524662ff773e86b9caae495454324c733d4f5a (patch)
tree9dd212c449da856157f4d96ec009c6e79a5ff676 /external/xscom-utils
parent57a17c2f300e4a608d46c871912f404b2962a063 (diff)
downloadskiboot-6e524662ff773e86b9caae495454324c733d4f5a.zip
skiboot-6e524662ff773e86b9caae495454324c733d4f5a.tar.gz
skiboot-6e524662ff773e86b9caae495454324c733d4f5a.tar.bz2
xscom-utils: Rework getsram
Allow specifying a file on the command line to read OCC SRAM data into. If no file is specified then we print it to stdout as text. This is a bit inconsistent, but it retains compatibility with the existing tool. Signed-off-by: Oliver O'Halloran <oohall@gmail.com> Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Diffstat (limited to 'external/xscom-utils')
-rw-r--r--external/xscom-utils/getsram.c54
1 files changed, 47 insertions, 7 deletions
diff --git a/external/xscom-utils/getsram.c b/external/xscom-utils/getsram.c
index 65acc19..18c52c7 100644
--- a/external/xscom-utils/getsram.c
+++ b/external/xscom-utils/getsram.c
@@ -26,9 +26,12 @@
static void print_usage(int code)
{
- printf("usage: getsram [-c|--chip chip-id] addr\n");
- printf(" [--occ-channel|n <chan>]\n");
- printf(" getsram -v|--version\n");
+ printf("usage: getsram [opts] addr\n");
+ printf(" -c|--chip <chip-id>\n");
+ printf(" -l|--length <size to read>\n");
+ printf(" -n|--occ-channel <chan>\n");
+ printf(" -f|--file <filename>\n");
+ printf(" -v|--version\n");
exit(code);
}
@@ -36,10 +39,12 @@ extern const char version[];
int main(int argc, char *argv[])
{
- uint64_t val, addr = -1ull;
+ uint64_t val, addr = -1ull, length = 8;
uint32_t def_chip, chip_id = 0xffffffff;
int rc;
int occ_channel = 0;
+ char *filename = NULL;
+ FILE *f = stdout;
while(1) {
static struct option long_opts[] = {
@@ -47,10 +52,12 @@ int main(int argc, char *argv[])
{"occ-channel", required_argument, NULL, 'n'},
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'v'},
+ {"length", required_argument, NULL, 'l'},
+ {"file", required_argument, NULL, 'f'},
};
int c, oidx = 0;
- c = getopt_long(argc, argv, "-c:n:hlv", long_opts, &oidx);
+ c = getopt_long(argc, argv, "-c:n:hl:vf:", long_opts, &oidx);
if (c == EOF)
break;
switch(c) {
@@ -73,6 +80,13 @@ int main(int argc, char *argv[])
case 'v':
printf("xscom utils version %s\n", version);
exit(0);
+ case 'f':
+ filename = optarg;
+ break;
+ case 'l':
+ length = strtoul(optarg, NULL, 0);
+ length = (length + 7) & ~0x7; /* round up to an eight byte interval */
+ break;
default:
exit(1);
}
@@ -91,11 +105,37 @@ int main(int argc, char *argv[])
if (chip_id == 0xffffffff)
chip_id = def_chip;
- rc = sram_read(chip_id, occ_channel, addr, &val);
+ if (filename) {
+ f = fopen(filename, "wb");
+ if (!f) {
+ fprintf(stderr, "unable to open %s for writing\n", filename);
+ exit(1);
+ }
+ }
+
+ rc = 0;
+ while (length) {
+ rc = sram_read(chip_id, occ_channel, addr, &val);
+ if (rc)
+ break;
+
+ if (f) {
+ int i;
+
+ /* make sure we write it out big endian */
+ for (i = 1; i <= 8; i++)
+ fputc((val >> (64 - i * 8)) & 0xff, f);
+ } else {
+ printf("OCC%d: %" PRIx64 "\n", occ_channel, val);
+ }
+
+ length -= 8;
+ addr += 8;
+ }
+
if (rc) {
fprintf(stderr,"Error %d reading XSCOM\n", rc);
exit(1);
}
- printf("OCC%d: %" PRIx64 "\n", occ_channel, val);
return 0;
}