From b64aa60f1fd5e6c84ec8ff6ad0baa7afee0d810a Mon Sep 17 00:00:00 2001 From: Andriy Gapon Date: Tue, 28 Oct 2008 22:13:38 +0000 Subject: Allow superiotool to compile and work on FreeBSD. Tested on FreeBSD 7. Signed-off-by: Andriy Gapon Acked-by: Carl-Daniel Hailfinger Acked-by: Uwe Hermann git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3698 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- util/superiotool/ali.c | 6 +++--- util/superiotool/ite.c | 12 ++++++------ util/superiotool/nsc.c | 14 +++++++------- util/superiotool/smsc.c | 6 +++--- util/superiotool/superiotool.c | 30 +++++++++++++++++++++++------- util/superiotool/superiotool.h | 20 ++++++++++++++++++++ util/superiotool/winbond.c | 8 ++++---- 7 files changed, 66 insertions(+), 30 deletions(-) (limited to 'util') diff --git a/util/superiotool/ali.c b/util/superiotool/ali.c index a23ffcc9fc..0bc1e062e3 100644 --- a/util/superiotool/ali.c +++ b/util/superiotool/ali.c @@ -60,13 +60,13 @@ static const struct superio_registers reg_table[] = { static void enter_conf_mode_ali(uint16_t port) { - outb(0x51, port); - outb(0x23, port); + OUTB(0x51, port); + OUTB(0x23, port); } static void exit_conf_mode_ali(uint16_t port) { - outb(0xbb, port); + OUTB(0xbb, port); } void probe_idregs_ali(uint16_t port) diff --git a/util/superiotool/ite.c b/util/superiotool/ite.c index fcb6375227..1cfa317037 100644 --- a/util/superiotool/ite.c +++ b/util/superiotool/ite.c @@ -468,11 +468,11 @@ static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4]) /* Determine Super I/O config port. */ idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2); for (i = 0; i < 4; i++) - outb(init[idx][i], ISA_PNP_ADDR); + OUTB(init[idx][i], ISA_PNP_ADDR); /* Sequentially write the 32 MB PnP init values. */ for (i = 0; i < 32; i++) - outb(initkey_mbpnp[i], port); + OUTB(initkey_mbpnp[i], port); } /** @@ -482,10 +482,10 @@ static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4]) */ static void enter_conf_mode_ite(uint16_t port) { - outb(0x87, port); - outb(0x01, port); - outb(0x55, port); - outb((port == 0x2e) ? 0x55 : 0xaa, port); + OUTB(0x87, port); + OUTB(0x01, port); + OUTB(0x55, port); + OUTB((port == 0x2e) ? 0x55 : 0xaa, port); } static void exit_conf_mode_ite(uint16_t port) diff --git a/util/superiotool/nsc.c b/util/superiotool/nsc.c index f5b2cd48e9..3a3336a6b4 100644 --- a/util/superiotool/nsc.c +++ b/util/superiotool/nsc.c @@ -479,21 +479,21 @@ void probe_idregs_nsc(uint16_t port) probing_for("NSC", "", port); - outb(CHIP_ID_REG, port); - if (inb(port) != CHIP_ID_REG) { + OUTB(CHIP_ID_REG, port); + if (INB(port) != CHIP_ID_REG) { if (verbose) printf(NOTFOUND "port=0x%02x, port+1=0x%02x\n", - inb(port), inb(port + 1)); + INB(port), INB(port + 1)); return; } - id = inb(port + 1); + id = INB(port + 1); - outb(CHIP_REV_REG, port); - if (inb(port) != CHIP_REV_REG) { + OUTB(CHIP_REV_REG, port); + if (INB(port) != CHIP_REV_REG) { printf("Warning: Can't get chip revision. Setting to 0xff.\n"); rev = 0xff; } else { - rev = inb(port + 1); + rev = INB(port + 1); } if (superio_unknown(reg_table, id)) { diff --git a/util/superiotool/smsc.c b/util/superiotool/smsc.c index a45ee45a99..ae141ea815 100644 --- a/util/superiotool/smsc.c +++ b/util/superiotool/smsc.c @@ -608,13 +608,13 @@ static void enter_conf_mode_smsc(uint16_t port) * in the assumption that the extra 0x55 won't hurt the other * Super I/Os. This is verified to be true on (at least) the FDC37N769. */ - outb(0x55, port); - outb(0x55, port); + OUTB(0x55, port); + OUTB(0x55, port); } static void exit_conf_mode_smsc(uint16_t port) { - outb(0xaa, port); + OUTB(0xaa, port); } static void probe_idregs_smsc_helper(uint16_t port, uint8_t idreg, diff --git a/util/superiotool/superiotool.c b/util/superiotool/superiotool.c index 10f225f6dc..1bbe5feec7 100644 --- a/util/superiotool/superiotool.c +++ b/util/superiotool/superiotool.c @@ -23,6 +23,11 @@ #include "superiotool.h" +#if defined(__FreeBSD__) +#include +#include +#endif + /* Command line options. */ int dump = 0, verbose = 0, extra_dump = 0; @@ -31,25 +36,25 @@ int chip_found = 0; uint8_t regval(uint16_t port, uint8_t reg) { - outb(reg, port); - return inb(port + ((port == 0x3bd) ? 2 : 1)); /* 0x3bd is special. */ + OUTB(reg, port); + return INB(port + ((port == 0x3bd) ? 2 : 1)); /* 0x3bd is special. */ } void regwrite(uint16_t port, uint8_t reg, uint8_t val) { - outb(reg, port); - outb(val, port + 1); + OUTB(reg, port); + OUTB(val, port + 1); } void enter_conf_mode_winbond_fintek_ite_8787(uint16_t port) { - outb(0x87, port); - outb(0x87, port); + OUTB(0x87, port); + OUTB(0x87, port); } void exit_conf_mode_winbond_fintek_ite_8787(uint16_t port) { - outb(0xaa, port); /* Fintek, Winbond */ + OUTB(0xaa, port); /* Fintek, Winbond */ regwrite(port, 0x02, 0x02); /* ITE */ } @@ -204,6 +209,9 @@ static void print_version(void) int main(int argc, char *argv[]) { int i, j, opt, option_index; +#if defined(__FreeBSD__) + int io_fd; +#endif static const struct option long_options[] = { {"dump", no_argument, NULL, 'd'}, @@ -247,8 +255,13 @@ int main(int argc, char *argv[]) } } +#if defined(__FreeBSD__) + if ((io_fd = open("/dev/io", O_RDWR)) < 0) { + perror("/dev/io"); +#else if (iopl(3) < 0) { perror("iopl"); +#endif printf("Superiotool must be run as root.\n"); exit(1); } @@ -264,5 +277,8 @@ int main(int argc, char *argv[]) if (!chip_found) printf("No Super I/O found\n"); +#if defined(__FreeBSD__) + close(io_fd); +#endif return 0; } diff --git a/util/superiotool/superiotool.h b/util/superiotool/superiotool.h index 3433cdb4a6..7e0ca0bd9b 100644 --- a/util/superiotool/superiotool.h +++ b/util/superiotool/superiotool.h @@ -28,7 +28,27 @@ #include #include #include +#if defined(__GLIBC__) #include +#endif + +#if defined(__FreeBSD__) +#include +#include +#define OUTB(x, y) do { u_int tmp = (y); outb(tmp, (x)); } while (0) +#define OUTW(x, y) do { u_int tmp = (y); outw(tmp, (x)); } while (0) +#define OUTL(x, y) do { u_int tmp = (y); outl(tmp, (x)); } while (0) +#define INB(x) __extension__ ({ u_int tmp = (x); inb(tmp); }) +#define INW(x) __extension__ ({ u_int tmp = (x); inw(tmp); }) +#define INL(x) __extension__ ({ u_int tmp = (x); inl(tmp); }) +#else +#define OUTB outb +#define OUTW outw +#define OUTL outl +#define INB inb +#define INW inw +#define INL inl +#endif #define USAGE "Usage: superiotool [-d] [-e] [-l] [-V] [-v] [-h]\n\n\ -d | --dump Dump Super I/O register contents\n\ diff --git a/util/superiotool/winbond.c b/util/superiotool/winbond.c index 4e2794470b..91f06063ec 100644 --- a/util/superiotool/winbond.c +++ b/util/superiotool/winbond.c @@ -470,18 +470,18 @@ static const struct superio_registers reg_table[] = { static void enter_conf_mode_winbond_88(uint16_t port) { - outb(0x88, port); + OUTB(0x88, port); } static void enter_conf_mode_winbond_89(uint16_t port) { - outb(0x89, port); + OUTB(0x89, port); } static void enter_conf_mode_winbond_86(uint16_t port) { - outb(0x86, port); - outb(0x86, port); + OUTB(0x86, port); + OUTB(0x86, port); } static void probe_idregs_winbond_helper(const char *init, uint16_t port) -- cgit v1.2.3