diff options
author | Robert Mustacchi <rm@fingolfin.org> | 2020-10-07 12:00:39 -0700 |
---|---|---|
committer | Robert Mustacchi <rm@fingolfin.org> | 2020-10-21 14:05:11 -0700 |
commit | 549e0fd315406a4a97f9043f44860eed39a715da (patch) | |
tree | 7e8177502e3db10815f9c9d7eff2102000a2eb8e /usr/src/cmd/amdzen/udf.c | |
parent | becd642c1e97d1674cef9e3dccb159c20c6992ae (diff) | |
download | illumos-gate-549e0fd315406a4a97f9043f44860eed39a715da.tar.gz |
13213 Want development driver for accessing AMD DF
Reviewed by: Patrick Mooney <pmooney@pfmooney.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr/src/cmd/amdzen/udf.c')
-rw-r--r-- | usr/src/cmd/amdzen/udf.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/usr/src/cmd/amdzen/udf.c b/usr/src/cmd/amdzen/udf.c new file mode 100644 index 0000000000..604e0b4802 --- /dev/null +++ b/usr/src/cmd/amdzen/udf.c @@ -0,0 +1,118 @@ +/* + * This file and its contents are supplied under the terms of the + * Common Development and Distribution License ("CDDL"), version 1.0. + * You may only use this file in accordance with the terms of version + * 1.0 of the CDDL. + * + * A full copy of the text of the CDDL should have accompanied this + * source. A copy of the CDDL is also available via the Internet at + * http://www.illumos.org/license/CDDL. + */ + +/* + * Copyright 2020 Oxide Computer Company + */ + +/* + * Facilitate access to the AMD Zen data fabric + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <err.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <errno.h> +#include <strings.h> +#include <zen_udf.h> + +static void +udf_readone(int fd, uint8_t inst, uint8_t func, uint16_t reg, boolean_t do64) +{ + int ret; + zen_udf_io_t zui; + + bzero(&zui, sizeof (zui)); + zui.zui_inst = inst; + zui.zui_func = func; + zui.zui_reg = reg; + + ret = ioctl(fd, do64 ? ZEN_UDF_READ64 : ZEN_UDF_READ32, &zui); + if (ret != 0) { + err(EXIT_FAILURE, "failed to issue read ioctl"); + } + + (void) printf("ifr %x/%x/%x: 0x%" PRIx64 "\n", + inst, func, reg, zui.zui_data); +} + +int +main(int argc, char *argv[]) +{ + int c, fd; + const char *device = NULL; + const char *funcstr = NULL; + const char *inststr = NULL; + const char *regstr = NULL; + uint8_t func, inst; + uint16_t reg; + unsigned long lval; + char *eptr; + boolean_t do64 = B_FALSE; + + while ((c = getopt(argc, argv, "d:f:i:r:l")) != -1) { + switch (c) { + case 'd': + device = optarg; + break; + case 'f': + funcstr = optarg; + break; + case 'i': + inststr = optarg; + break; + case 'l': + do64 = B_TRUE; + break; + case 'r': + regstr = optarg; + break; + } + } + + if (device == NULL || funcstr == NULL || inststr == NULL || + regstr == NULL) { + warnx("missing required arguments"); + (void) fprintf(stderr, "Usage: udf [-l] -d device -f func -i " + "inst -r reg\n"); + } + + errno = 0; + lval = strtoul(funcstr, &eptr, 0); + if (errno != 0 || lval > UINT8_MAX || *eptr != '\0') { + errx(EXIT_FAILURE, "failed to parse -f: %s", funcstr); + } + func = (uint8_t)lval; + + lval = strtoul(inststr, &eptr, 0); + if (errno != 0 || lval > UINT8_MAX || *eptr != '\0') { + errx(EXIT_FAILURE, "failed to parse -i: %s", inststr); + } + inst = (uint8_t)lval; + + lval = strtoul(regstr, &eptr, 0); + if (errno != 0 || lval > UINT16_MAX || *eptr != '\0') { + errx(EXIT_FAILURE, "failed to parse -r: %s", regstr); + } + reg = (uint16_t)lval; + + if ((fd = open(device, O_RDONLY)) < 0) { + err(EXIT_FAILURE, "failed to open %s", device); + } + + udf_readone(fd, inst, func, reg, do64); + (void) close(fd); + return (0); +} |