Nico Huber submitted this change.

View Change

Approvals: build bot (Jenkins): Verified Nico Huber: Looks good to me, approved
hwaccess: move x86 port I/O related code into own files

Allow port I/O related code to be compiled independent from memory
mapping functionality. This enables for a better selection of needed
hardware access types.

Change-Id: I372b4a409f036da766c42bc406b596bc41b0f75a
Signed-off-by: Thomas Heijligen <thomas.heijligen@secunet.com>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/60110
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Nico Huber <nico.h@gmx.de>
---
M Makefile
M amd_imc.c
M atahpt.c
M atapromise.c
M atavia.c
M board_enable.c
M chipset_enable.c
M drkaiser.c
M gfxnvidia.c
M hwaccess.c
M hwaccess.h
A hwaccess_x86_io.c
M hwaccess_x86_io.h
M internal.c
M it8212.c
M it85spi.c
M it87spi.c
M meson.build
M nic3com.c
M nicintel.c
M nicintel_eeprom.c
M nicintel_spi.c
M nicnatsemi.c
M nicrealtek.c
M ogp_spi.c
M programmer.h
M rayer_spi.c
M satamv.c
M satasii.c
M tests/hwaccess_x86_io_unittest.h
M wbsio_spi.c
31 files changed, 122 insertions(+), 82 deletions(-)

diff --git a/Makefile b/Makefile
index 9bc9bf8..8de6234 100644
--- a/Makefile
+++ b/Makefile
@@ -804,24 +804,23 @@
FEATURE_CFLAGS += -D'NEED_RAW_ACCESS=1'
PROGRAMMER_OBJS += physmap.o hwaccess.o

-ifeq ($(TARGET_OS), NetBSD)
ifeq ($(ARCH), x86)
+FEATURE_CFLAGS += -D'__FLASHROM_HAVE_OUTB__=1'
+PROGRAMMER_OBJS += hwaccess_x86_io.o
+
+ifeq ($(TARGET_OS), NetBSD)
PCILIBS += -l$(shell uname -p)
endif
-else
ifeq ($(TARGET_OS), OpenBSD)
-ifeq ($(ARCH), x86)
PCILIBS += -l$(shell uname -m)
endif
-else
+endif
+
ifeq ($(TARGET_OS), Darwin)
# DirectHW framework can be found in the DirectHW library.
PCILIBS += -framework IOKit -framework DirectHW
endif
endif
-endif
-
-endif

USE_LIBUSB1 := $(if $(call filter_deps,$(DEPENDS_ON_LIBUSB1)),yes,no)
ifeq ($(USE_LIBUSB1), yes)
diff --git a/amd_imc.c b/amd_imc.c
index f2f0972..4d3715e 100644
--- a/amd_imc.c
+++ b/amd_imc.c
@@ -17,7 +17,7 @@

#include "flash.h"
#include "programmer.h"
-#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "spi.h"
#include "platform/pci.h"

diff --git a/atahpt.c b/atahpt.c
index d2712b8..15bcd61 100644
--- a/atahpt.c
+++ b/atahpt.c
@@ -18,7 +18,7 @@
#include <string.h>
#include "flash.h"
#include "programmer.h"
-#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

#define BIOS_ROM_ADDR 0x90
diff --git a/atapromise.c b/atapromise.c
index 92eba0c..56abc26 100644
--- a/atapromise.c
+++ b/atapromise.c
@@ -19,6 +19,7 @@
#include "flash.h"
#include "programmer.h"
#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

#define MAX_ROM_DECODE (32 * 1024)
diff --git a/atavia.c b/atavia.c
index 6370d91..8109768 100644
--- a/atavia.c
+++ b/atavia.c
@@ -20,7 +20,7 @@
#include <string.h>
#include "flash.h"
#include "programmer.h"
-#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

#define PCI_VENDOR_ID_VIA 0x1106
diff --git a/board_enable.c b/board_enable.c
index 339408a..4ca7101 100644
--- a/board_enable.c
+++ b/board_enable.c
@@ -26,6 +26,7 @@
#include "flash.h"
#include "programmer.h"
#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

#if defined(__i386__) || defined(__x86_64__)
diff --git a/chipset_enable.c b/chipset_enable.c
index 8588443..517918e 100644
--- a/chipset_enable.c
+++ b/chipset_enable.c
@@ -34,6 +34,7 @@
#include "flash.h"
#include "programmer.h"
#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

#define NOT_DONE_YET 1
diff --git a/drkaiser.c b/drkaiser.c
index 34b204e..565a45e 100644
--- a/drkaiser.c
+++ b/drkaiser.c
@@ -18,6 +18,7 @@
#include "flash.h"
#include "programmer.h"
#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

#define PCI_VENDOR_ID_DRKAISER 0x1803
diff --git a/gfxnvidia.c b/gfxnvidia.c
index e85ce68..0d3ef39 100644
--- a/gfxnvidia.c
+++ b/gfxnvidia.c
@@ -19,6 +19,7 @@
#include "flash.h"
#include "programmer.h"
#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

#define PCI_VENDOR_ID_NVIDIA 0x10de
diff --git a/hwaccess.c b/hwaccess.c
index 9bfd8ea..4e8a274 100644
--- a/hwaccess.c
+++ b/hwaccess.c
@@ -25,17 +25,8 @@
#include <fcntl.h>
#endif
#include "flash.h"
-#include "programmer.h"
#include "hwaccess.h"

-#if USE_IOPERM
-#include <sys/io.h>
-#endif
-
-#if (defined (__i386__) || defined (__x86_64__) || defined(__amd64__)) && USE_DEV_IO
-int io_fd;
-#endif
-
/* Prevent reordering and/or merging of reads/writes to hardware.
* Such reordering and/or merging would break device accesses which depend on the exact access order.
*/
@@ -70,59 +61,6 @@
#endif
}

-#if (defined (__i386__) || defined (__x86_64__) || defined(__amd64__)) && !(defined(__DJGPP__) || defined(__LIBPAYLOAD__))
-static int release_io_perms(void *p)
-{
-#if defined (__sun)
- sysi86(SI86V86, V86SC_IOPL, 0);
-#elif USE_DEV_IO
- close(io_fd);
-#elif USE_IOPERM
- ioperm(0, 65536, 0);
-#elif USE_IOPL
- iopl(0);
-#endif
- return 0;
-}
-
-/* Get I/O permissions with automatic permission release on shutdown. */
-int rget_io_perms(void)
-{
- #if defined (__sun)
- if (sysi86(SI86V86, V86SC_IOPL, PS_IOPL) != 0) {
-#elif USE_DEV_IO
- if ((io_fd = open("/dev/io", O_RDWR)) < 0) {
-#elif USE_IOPERM
- if (ioperm(0, 65536, 1) != 0) {
-#elif USE_IOPL
- if (iopl(3) != 0) {
-#endif
- msg_perr("ERROR: Could not get I/O privileges (%s).\n", strerror(errno));
- msg_perr("You need to be root.\n");
-#if defined (__OpenBSD__)
- msg_perr("If you are root already please set securelevel=-1 in /etc/rc.securelevel and\n"
- "reboot, or reboot into single user mode.\n");
-#elif defined(__NetBSD__)
- msg_perr("If you are root already please reboot into single user mode or make sure\n"
- "that your kernel configuration has the option INSECURE enabled.\n");
-#endif
- return 1;
- } else {
- register_shutdown(release_io_perms, NULL);
- }
- return 0;
-}
-
-#else
-
-/* DJGPP and libpayload environments have full PCI port I/O permissions by default. */
-/* PCI port I/O support is unimplemented on PPC/MIPS and unavailable on ARM. */
-int rget_io_perms(void)
-{
- return 0;
-}
-#endif
-
void mmio_writeb(uint8_t val, void *addr)
{
*(volatile uint8_t *) addr = val;
diff --git a/hwaccess.h b/hwaccess.h
index e5edcfa..5b7b079 100644
--- a/hwaccess.h
+++ b/hwaccess.h
@@ -124,8 +124,6 @@

#if NEED_RAW_ACCESS == 1 && (defined (__i386__) || defined (__x86_64__) || defined(__amd64__))

-#include "hwaccess_x86_io.h"
-
#if !(defined(__MACH__) && defined(__APPLE__)) && !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__) && !defined(__DragonFly__) && !defined(__LIBPAYLOAD__)
typedef struct { uint32_t hi, lo; } msr_t;
msr_t rdmsr(int addr);
diff --git a/hwaccess_x86_io.c b/hwaccess_x86_io.c
new file mode 100644
index 0000000..3152bfe
--- /dev/null
+++ b/hwaccess_x86_io.c
@@ -0,0 +1,87 @@
+/*
+ * This file is part of the flashrom project.
+ *
+ * Copyright (C) 2009,2010 Carl-Daniel Hailfinger
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <errno.h>
+#include <string.h>
+#if !defined (__DJGPP__) && !defined(__LIBPAYLOAD__)
+/* No file access needed/possible to get hardware access permissions. */
+#include <unistd.h>
+#include <fcntl.h>
+#endif
+
+#include "hwaccess_x86_io.h"
+#include "flash.h"
+
+#if USE_IOPERM
+#include <sys/io.h>
+#endif
+
+#if USE_DEV_IO
+int io_fd;
+#endif
+
+#if !(defined(__DJGPP__) || defined(__LIBPAYLOAD__))
+static int release_io_perms(void *p)
+{
+#if defined (__sun)
+ sysi86(SI86V86, V86SC_IOPL, 0);
+#elif USE_DEV_IO
+ close(io_fd);
+#elif USE_IOPERM
+ ioperm(0, 65536, 0);
+#elif USE_IOPL
+ iopl(0);
+#endif
+ return 0;
+}
+
+/* Get I/O permissions with automatic permission release on shutdown. */
+int rget_io_perms(void)
+{
+ #if defined (__sun)
+ if (sysi86(SI86V86, V86SC_IOPL, PS_IOPL) != 0) {
+#elif USE_DEV_IO
+ if ((io_fd = open("/dev/io", O_RDWR)) < 0) {
+#elif USE_IOPERM
+ if (ioperm(0, 65536, 1) != 0) {
+#elif USE_IOPL
+ if (iopl(3) != 0) {
+#endif
+ msg_perr("ERROR: Could not get I/O privileges (%s).\n", strerror(errno));
+ msg_perr("You need to be root.\n");
+#if defined (__OpenBSD__)
+ msg_perr("If you are root already please set securelevel=-1 in /etc/rc.securelevel and\n"
+ "reboot, or reboot into single user mode.\n");
+#elif defined(__NetBSD__)
+ msg_perr("If you are root already please reboot into single user mode or make sure\n"
+ "that your kernel configuration has the option INSECURE enabled.\n");
+#endif
+ return 1;
+ } else {
+ register_shutdown(release_io_perms, NULL);
+ }
+ return 0;
+}
+
+#else
+
+/* DJGPP and libpayload environments have full PCI port I/O permissions by default. */
+/* PCI port I/O support is unimplemented on PPC/MIPS and unavailable on ARM. */
+int rget_io_perms(void)
+{
+ return 0;
+}
+#endif
diff --git a/hwaccess_x86_io.h b/hwaccess_x86_io.h
index 63692b8..0d16fdd 100644
--- a/hwaccess_x86_io.h
+++ b/hwaccess_x86_io.h
@@ -29,8 +29,6 @@
#include <sys/io.h>
#endif

-#define __FLASHROM_HAVE_OUTB__ 1
-
/* for iopl and outb under Solaris */
#if defined (__sun)
#include <sys/sysi86.h>
@@ -38,6 +36,8 @@
#include <asm/sunddi.h>
#endif

+int rget_io_perms(void);
+
/* Clarification about OUTB/OUTW/OUTL argument order:
* OUT[BWL](val, port)
*/
diff --git a/internal.c b/internal.c
index 4a8e27b..7de1d6a 100644
--- a/internal.c
+++ b/internal.c
@@ -20,6 +20,7 @@
#include "flash.h"
#include "programmer.h"
#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

int is_laptop = 0;
diff --git a/it8212.c b/it8212.c
index 60997f7..80da2b1 100644
--- a/it8212.c
+++ b/it8212.c
@@ -18,6 +18,7 @@
#include "flash.h"
#include "programmer.h"
#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

static uint8_t *it8212_bar = NULL;
diff --git a/it85spi.c b/it85spi.c
index 17e4e10..574e03a 100644
--- a/it85spi.c
+++ b/it85spi.c
@@ -26,7 +26,7 @@
#include "flash.h"
#include "spi.h"
#include "programmer.h"
-#include "hwaccess.h"
+#include "hwaccess_x86_io.h"

#define MAX_TIMEOUT 100000
#define MAX_TRY 5
diff --git a/it87spi.c b/it87spi.c
index 5f6fb65..0944915 100644
--- a/it87spi.c
+++ b/it87spi.c
@@ -26,6 +26,7 @@
#include "chipdrivers.h"
#include "programmer.h"
#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "spi.h"

#define ITE_SUPERIO_PORT1 0x2e
diff --git a/meson.build b/meson.build
index 85f40ba..5cbcac2 100644
--- a/meson.build
+++ b/meson.build
@@ -347,8 +347,10 @@
# raw memory, MSR or PCI port I/O access
if need_raw_access
srcs += 'hwaccess.c'
+ srcs += 'hwaccess_x86_io.c'
srcs += 'physmap.c'
cargs += '-DNEED_RAW_ACCESS=1'
+ cargs += '-D__FLASHROM_HAVE_OUTB__=1'
endif

# raw serial IO
diff --git a/nic3com.c b/nic3com.c
index f7d2a97..3ef607d 100644
--- a/nic3com.c
+++ b/nic3com.c
@@ -17,7 +17,7 @@
#include <stdlib.h>
#include "flash.h"
#include "programmer.h"
-#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

#define BIOS_ROM_ADDR 0x04
diff --git a/nicintel.c b/nicintel.c
index 1730ca4..7f4eb24 100644
--- a/nicintel.c
+++ b/nicintel.c
@@ -19,6 +19,7 @@
#include "flash.h"
#include "programmer.h"
#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

static uint8_t *nicintel_bar;
diff --git a/nicintel_eeprom.c b/nicintel_eeprom.c
index ab75343..fc2ef40 100644
--- a/nicintel_eeprom.c
+++ b/nicintel_eeprom.c
@@ -35,6 +35,7 @@
#include "spi.h"
#include "programmer.h"
#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

#define PCI_VENDOR_ID_INTEL 0x8086
diff --git a/nicintel_spi.c b/nicintel_spi.c
index f1ed129..25a6651 100644
--- a/nicintel_spi.c
+++ b/nicintel_spi.c
@@ -35,6 +35,7 @@
#include "flash.h"
#include "programmer.h"
#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

#define PCI_VENDOR_ID_INTEL 0x8086
diff --git a/nicnatsemi.c b/nicnatsemi.c
index 9dd3915..bac6502 100644
--- a/nicnatsemi.c
+++ b/nicnatsemi.c
@@ -17,7 +17,7 @@
#include <stdlib.h>
#include "flash.h"
#include "programmer.h"
-#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

#define PCI_VENDOR_ID_NATSEMI 0x100b
diff --git a/nicrealtek.c b/nicrealtek.c
index 0bf60fd..71f9aaf 100644
--- a/nicrealtek.c
+++ b/nicrealtek.c
@@ -17,7 +17,7 @@
#include <stdlib.h>
#include "flash.h"
#include "programmer.h"
-#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

#define PCI_VENDOR_ID_REALTEK 0x10ec
diff --git a/ogp_spi.c b/ogp_spi.c
index 105f468..4a4934e 100644
--- a/ogp_spi.c
+++ b/ogp_spi.c
@@ -19,6 +19,7 @@
#include "flash.h"
#include "programmer.h"
#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

#define PCI_VENDOR_ID_OGP 0x1227
diff --git a/programmer.h b/programmer.h
index b4f04e7..b8b5bbc 100644
--- a/programmer.h
+++ b/programmer.h
@@ -271,7 +271,6 @@
struct pci_dev *pci_card_find(uint16_t vendor, uint16_t device,
uint16_t card_vendor, uint16_t card_device);
#endif
-int rget_io_perms(void);
#if CONFIG_INTERNAL == 1
extern int is_laptop;
extern int laptop_ok;
diff --git a/rayer_spi.c b/rayer_spi.c
index e65eb78..6cf918a 100644
--- a/rayer_spi.c
+++ b/rayer_spi.c
@@ -28,7 +28,7 @@
#include <string.h>
#include "flash.h"
#include "programmer.h"
-#include "hwaccess.h"
+#include "hwaccess_x86_io.h"

/* We have two sets of pins, out and in. The numbers for both sets are
* independent and are bitshift values, not real pin numbers.
diff --git a/satamv.c b/satamv.c
index b69350f..8543f53 100644
--- a/satamv.c
+++ b/satamv.c
@@ -20,6 +20,7 @@
#include "flash.h"
#include "programmer.h"
#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

static uint8_t *mv_bar;
diff --git a/satasii.c b/satasii.c
index d015f7f..2f220d1 100644
--- a/satasii.c
+++ b/satasii.c
@@ -18,6 +18,7 @@

#include "programmer.h"
#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "platform/pci.h"

#define PCI_VENDOR_ID_SII 0x1095
diff --git a/tests/hwaccess_x86_io_unittest.h b/tests/hwaccess_x86_io_unittest.h
index 2a4cd5f..14f3caa 100644
--- a/tests/hwaccess_x86_io_unittest.h
+++ b/tests/hwaccess_x86_io_unittest.h
@@ -39,6 +39,8 @@

#include <stdint.h>

+int rget_io_perms(void);
+
/*
* Dummy implementation of iopl from sys/io.h.
* sys/io.h by itself is platform-specific, so instead of including
diff --git a/wbsio_spi.c b/wbsio_spi.c
index 60b725f..805abf7 100644
--- a/wbsio_spi.c
+++ b/wbsio_spi.c
@@ -20,6 +20,7 @@
#include "chipdrivers.h"
#include "programmer.h"
#include "hwaccess.h"
+#include "hwaccess_x86_io.h"
#include "spi.h"

#define WBSIO_PORT1 0x2e

6 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one.

To view, visit change 60110. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: flashrom
Gerrit-Branch: master
Gerrit-Change-Id: I372b4a409f036da766c42bc406b596bc41b0f75a
Gerrit-Change-Number: 60110
Gerrit-PatchSet: 8
Gerrit-Owner: Thomas Heijligen <src@posteo.de>
Gerrit-Reviewer: Anastasia Klimchuk <aklm@chromium.org>
Gerrit-Reviewer: Angel Pons <th3fanbus@gmail.com>
Gerrit-Reviewer: Nico Huber <nico.h@gmx.de>
Gerrit-Reviewer: build bot (Jenkins) <no-reply@coreboot.org>
Gerrit-CC: Paul Menzel <paulepanter@mailbox.org>
Gerrit-MessageType: merged