summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/arm/include/armv4/arch/io.h8
-rw-r--r--src/arch/arm/include/armv7/arch/io.h8
-rw-r--r--src/arch/arm64/include/armv8/arch/io.h8
-rw-r--r--src/arch/riscv/include/arch/io.h8
-rw-r--r--src/device/Kconfig6
-rw-r--r--src/include/arch-generic/io.h96
6 files changed, 134 insertions, 0 deletions
diff --git a/src/arch/arm/include/armv4/arch/io.h b/src/arch/arm/include/armv4/arch/io.h
new file mode 100644
index 0000000000..b0df7d74cb
--- /dev/null
+++ b/src/arch/arm/include/armv4/arch/io.h
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef __ARCH_IO_H__
+#define __ARCH_IO_H__
+
+#include <arch-generic/io.h>
+
+#endif
diff --git a/src/arch/arm/include/armv7/arch/io.h b/src/arch/arm/include/armv7/arch/io.h
new file mode 100644
index 0000000000..b0df7d74cb
--- /dev/null
+++ b/src/arch/arm/include/armv7/arch/io.h
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef __ARCH_IO_H__
+#define __ARCH_IO_H__
+
+#include <arch-generic/io.h>
+
+#endif
diff --git a/src/arch/arm64/include/armv8/arch/io.h b/src/arch/arm64/include/armv8/arch/io.h
new file mode 100644
index 0000000000..b0df7d74cb
--- /dev/null
+++ b/src/arch/arm64/include/armv8/arch/io.h
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef __ARCH_IO_H__
+#define __ARCH_IO_H__
+
+#include <arch-generic/io.h>
+
+#endif
diff --git a/src/arch/riscv/include/arch/io.h b/src/arch/riscv/include/arch/io.h
new file mode 100644
index 0000000000..b0df7d74cb
--- /dev/null
+++ b/src/arch/riscv/include/arch/io.h
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef __ARCH_IO_H__
+#define __ARCH_IO_H__
+
+#include <arch-generic/io.h>
+
+#endif
diff --git a/src/device/Kconfig b/src/device/Kconfig
index 0fe0a0923f..f1343f8a5f 100644
--- a/src/device/Kconfig
+++ b/src/device/Kconfig
@@ -525,6 +525,12 @@ config PCI
bool
default n
+config PCI_IOBASE
+ hex
+ help
+ The memory address of a memory-mapped translator that lets the
+ CPU communicate with peripheral devices over PCI I/O space.
+
if PCI
config DOMAIN_RESOURCE_32BIT_LIMIT
diff --git a/src/include/arch-generic/io.h b/src/include/arch-generic/io.h
new file mode 100644
index 0000000000..5874fc8425
--- /dev/null
+++ b/src/include/arch-generic/io.h
@@ -0,0 +1,96 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+/*
+ * I/O device access primitives. Simplified based on related U-Boot code,
+ * which is in turn based on early versions from the Linux kernel:
+ *
+ * Copyright (C) 1996-2000 Russell King
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __ARCH_GENERIC_IO_H__
+#define __ARCH_GENERIC_IO_H__
+
+#include <stdint.h>
+#include <stddef.h>
+#include <endian.h>
+#include <arch/mmio.h>
+
+#define __io(a) (void *)(uintptr_t)(CONFIG_PCI_IOBASE + a)
+
+static inline void outb(uint8_t value, uint16_t port)
+{
+ write8(__io(port), value);
+}
+
+static inline void outw(uint16_t value, uint16_t port)
+{
+ write16(__io(port), cpu_to_le16(value));
+}
+
+static inline void outl(uint32_t value, uint16_t port)
+{
+ write32(__io(port), cpu_to_le32(value));
+}
+
+static inline uint8_t inb(uint16_t port)
+{
+ return read8(__io(port));
+}
+
+static inline uint16_t inw(uint16_t port)
+{
+ return le16_to_cpu(read16(__io(port)));
+}
+
+static inline uint32_t inl(uint16_t port)
+{
+ return le32_to_cpu(read32(__io(port)));
+}
+
+static inline void outsb(uint16_t port, const void *addr, unsigned long count)
+{
+ uint8_t *buf = (uint8_t *)addr;
+ while (count--)
+ write8(__io(port), *buf++);
+}
+
+static inline void outsw(uint16_t port, const void *addr, unsigned long count)
+{
+ uint16_t *buf = (uint16_t *)addr;
+ while (count--)
+ write16(__io(port), *buf++);
+}
+
+static inline void outsl(uint16_t port, const void *addr, unsigned long count)
+{
+ uint32_t *buf = (uint32_t *)addr;
+ while (count--)
+ write32(__io(port), *buf++);
+}
+
+static inline void insb(uint16_t port, void *addr, unsigned long count)
+{
+ uint8_t *buf = (uint8_t *)addr;
+ while (count--)
+ *buf++ = read8(__io(port));
+}
+
+static inline void insw(uint16_t port, void *addr, unsigned long count)
+{
+ uint16_t *buf = (uint16_t *)addr;
+ while (count--)
+ *buf++ = read16(__io(port));
+}
+
+static inline void insl(uint16_t port, void *addr, unsigned long count)
+{
+ uint32_t *buf = (uint32_t *)addr;
+ while (count--)
+ *buf++ = read32(__io(port));
+}
+
+#endif