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>
Original-Reviewed-on: https://review.coreboot.org/c/flashrom/+/60110
Original-Reviewed-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.coreboot.org/c/flashrom-stable/+/72265
Reviewed-by: Nico Huber <nico.h@gmx.de>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/Makefile b/Makefile
index ed85ed4..e5b33cb 100644
--- a/Makefile
+++ b/Makefile
@@ -785,24 +785,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 d995d4d..ce0d667 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 f124eee..02508ff 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 75448e6..c8c19f9 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 6a8ec1f..97df998 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 6f447c2..c4d0eb7 100644
--- a/board_enable.c
+++ b/board_enable.c
@@ -27,6 +27,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 2e9da55..1c3d896 100644
--- a/chipset_enable.c
+++ b/chipset_enable.c
@@ -35,6 +35,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 8d5937c..b22ce55 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 1bf656c..381f861 100644
--- a/gfxnvidia.c
+++ b/gfxnvidia.c
@@ -20,6 +20,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 1c4b66a..8445455 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"
 
 struct pci_dev *pci_dev_find_vendorclass(uint16_t vendor, uint16_t devclass)
diff --git a/it8212.c b/it8212.c
index f7b27cb..346ef19 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/it87spi.c b/it87spi.c
index a81b1c0..1d5dd91 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 dceadc8..a731bcf 100644
--- a/meson.build
+++ b/meson.build
@@ -331,8 +331,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 dde0330..45c3177 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 4327112..1051755 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 c52ed37..e5e95d8 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 66c24a7..c73aa13 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 933d3a9..3e0263c 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 e8616fd..8279739 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 31f7b8d..250cf75 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 d392027..1ab432e 100644
--- a/programmer.h
+++ b/programmer.h
@@ -269,7 +269,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 bool laptop_ok;
diff --git a/rayer_spi.c b/rayer_spi.c
index 465d565..fc22c0a 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 f824d87..2f8e224 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 6ab574a..9dcb38c 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/wbsio_spi.c b/wbsio_spi.c
index dd4bb46..52a8c7d 100644
--- a/wbsio_spi.c
+++ b/wbsio_spi.c
@@ -18,6 +18,7 @@
 #include "chipdrivers.h"
 #include "programmer.h"
 #include "hwaccess.h"
+#include "hwaccess_x86_io.h"
 #include "spi.h"
 
 #define WBSIO_PORT1	0x2e