]> git.sur5r.net Git - u-boot/commitdiff
x86: Add I/O APIC register access routines
authorBin Meng <bmeng.cn@gmail.com>
Tue, 23 Jun 2015 04:18:49 +0000 (12:18 +0800)
committerSimon Glass <sjg@chromium.org>
Wed, 15 Jul 2015 00:03:17 +0000 (18:03 -0600)
I/O APIC registers are addressed indirectly. Add io_apic_read() and
io_apic_write() routines to help register access. Two macros for I/O
APIC ID and version register offset are also added.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Acked-by: Simon Glass <sjg@chromium.org>
arch/x86/cpu/Makefile
arch/x86/cpu/ioapic.c [new file with mode: 0644]
arch/x86/include/asm/ioapic.h

index 48197fb0fa765ad33a2e5521f6f4336b7b7560fc..8a8e63e1d3d1c270ec39aa592a9eaac86eb28df9 100644 (file)
@@ -19,7 +19,7 @@ obj-$(CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE) += ivybridge/
 obj-$(CONFIG_NORTHBRIDGE_INTEL_IVYBRIDGE) += ivybridge/
 obj-$(CONFIG_INTEL_QUARK) += quark/
 obj-$(CONFIG_INTEL_QUEENSBAY) += queensbay/
-obj-y += irq.o lapic.o
+obj-y += irq.o lapic.o ioapic.o
 obj-$(CONFIG_SMP) += mp_init.o
 obj-y += mtrr.o
 obj-$(CONFIG_PCI) += pci.o
diff --git a/arch/x86/cpu/ioapic.c b/arch/x86/cpu/ioapic.c
new file mode 100644 (file)
index 0000000..112a9c6
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/ioapic.h>
+
+u32 io_apic_read(u32 reg)
+{
+       writel(reg, IO_APIC_INDEX);
+       return readl(IO_APIC_DATA);
+}
+
+void io_apic_write(u32 reg, u32 val)
+{
+       writel(reg, IO_APIC_INDEX);
+       writel(val, IO_APIC_DATA);
+}
index f5d69dbf97ee69a72cc7d5afdc7118b8476d2dbc..77c443e9f598101fa9d40957320c8312f29844a2 100644 (file)
 #define IO_APIC_INDEX          (IO_APIC_ADDR + 0x00)
 #define IO_APIC_DATA           (IO_APIC_ADDR + 0x10)
 
+/* Indirect addressed register offset */
+#define IO_APIC_ID             0x00
+#define IO_APIC_VER            0x01
+
+/**
+ * io_apic_read() - Read I/O APIC register
+ *
+ * This routine reads I/O APIC indirect addressed register.
+ *
+ * @reg:       address of indirect addressed register
+ * @return:    register value to read
+ */
+u32 io_apic_read(u32 reg);
+
+/**
+ * io_apic_write() - Write I/O APIC register
+ *
+ * This routine writes I/O APIC indirect addressed register.
+ *
+ * @reg:       address of indirect addressed register
+ * @val:       register value to write
+ */
+void io_apic_write(u32 reg, u32 val);
+
 #endif