aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien Grall <julien.grall@linaro.org>2013-04-28 19:48:29 +0100
committerIan Campbell <ian.campbell@citrix.com>2013-05-13 12:00:00 +0100
commitaf99b3476642b67918c959c68f879201582de001 (patch)
treeb007784e40a28a77bcdfb1bca1e30a2741e58bdf
parent3c186690bb6c8e7da7a24f83c8d8c884b1ba46a2 (diff)
downloadxen-af99b3476642b67918c959c68f879201582de001.tar.gz
xen-af99b3476642b67918c959c68f879201582de001.tar.bz2
xen-af99b3476642b67918c959c68f879201582de001.zip
xen/arm: Add versatile express platform
This platform contains nearly nothing specific except the reset function. Signed-off-by: Julien Grall <julien.grall@linaro.org> Acked-by: Ian Campbell <ian.campbell@citrix.com>
-rw-r--r--xen/arch/arm/platforms/vexpress.c40
-rw-r--r--xen/arch/arm/shutdown.c14
-rw-r--r--xen/include/asm-arm/config.h3
-rw-r--r--xen/include/asm-arm/platforms/vexpress.h3
4 files changed, 43 insertions, 17 deletions
diff --git a/xen/arch/arm/platforms/vexpress.c b/xen/arch/arm/platforms/vexpress.c
index fd4ce740da..8fc30c4d48 100644
--- a/xen/arch/arm/platforms/vexpress.c
+++ b/xen/arch/arm/platforms/vexpress.c
@@ -18,7 +18,9 @@
*/
#include <asm/platforms/vexpress.h>
+#include <asm/platform.h>
#include <xen/mm.h>
+#include <xen/vmap.h>
#define DCC_SHIFT 26
#define FUNCTION_SHIFT 20
@@ -91,6 +93,44 @@ out:
}
/*
+ * TODO: Get base address from the device tree
+ * See arm,vexpress-reset node
+ */
+static void vexpress_reset(void)
+{
+ void __iomem *sp810;
+
+ /* Use the SP810 system controller to force a reset */
+ sp810 = ioremap_nocache(SP810_ADDRESS, PAGE_SIZE);
+
+ if ( !sp810 )
+ {
+ dprintk(XENLOG_ERR, "Unable to map SP810\n");
+ return;
+ }
+
+ /* switch to slow mode */
+ iowritel(sp810, 0x3);
+ dsb(); isb();
+ /* writing any value to SCSYSSTAT reg will reset the system */
+ iowritel(sp810 + 4, 0x1);
+ dsb(); isb();
+
+ iounmap(sp810);
+}
+
+static const char const *vexpress_dt_compat[] __initdata =
+{
+ "arm,vexpress",
+ NULL
+};
+
+PLATFORM_START(vexpress, "VERSATILE EXPRESS")
+ .compatible = vexpress_dt_compat,
+ .reset = vexpress_reset,
+PLATFORM_END
+
+/*
* Local variables:
* mode: C
* c-file-style: "BSD"
diff --git a/xen/arch/arm/shutdown.c b/xen/arch/arm/shutdown.c
index 0903842f77..767cc12ad4 100644
--- a/xen/arch/arm/shutdown.c
+++ b/xen/arch/arm/shutdown.c
@@ -3,25 +3,11 @@
#include <xen/cpu.h>
#include <xen/delay.h>
#include <xen/lib.h>
-#include <xen/mm.h>
#include <xen/smp.h>
#include <asm/platform.h>
static void raw_machine_reset(void)
{
- /* XXX get this from device tree */
-#ifdef SP810_ADDRESS
- /* Use the SP810 system controller to force a reset */
- volatile uint32_t *sp810;
- set_fixmap(FIXMAP_MISC, SP810_ADDRESS >> PAGE_SHIFT, DEV_SHARED);
- sp810 = ((uint32_t *)
- (FIXMAP_ADDR(FIXMAP_MISC) + (SP810_ADDRESS & ~PAGE_MASK)));
- sp810[0] = 0x3; /* switch to slow mode */
- dsb(); isb();
- sp810[1] = 0x1; /* writing any value to SCSYSSTAT reg will reset system */
- dsb(); isb();
- clear_fixmap(FIXMAP_MISC);
-#endif
platform_reset();
}
diff --git a/xen/include/asm-arm/config.h b/xen/include/asm-arm/config.h
index 8ed72f5188..75992027ff 100644
--- a/xen/include/asm-arm/config.h
+++ b/xen/include/asm-arm/config.h
@@ -149,9 +149,6 @@ extern unsigned long frametable_virt_end;
#define GIC_CR_OFFSET 0x2000
#define GIC_HR_OFFSET 0x4000 /* Guess work http://lists.infradead.org/pipermail/linux-arm-kernel/2011-September/064219.html */
#define GIC_VR_OFFSET 0x6000 /* Virtual Machine CPU interface) */
-/* Board-specific: base address of system controller */
-#define SP810_ADDRESS 0x1C020000
-
#endif /* __ARM_CONFIG_H__ */
/*
diff --git a/xen/include/asm-arm/platforms/vexpress.h b/xen/include/asm-arm/platforms/vexpress.h
index 67f8fef8db..5cf3aba6f2 100644
--- a/xen/include/asm-arm/platforms/vexpress.h
+++ b/xen/include/asm-arm/platforms/vexpress.h
@@ -23,6 +23,9 @@
#define V2M_SYS_CFG_OSC4 4
#define V2M_SYS_CFG_OSC5 5
+/* Board-specific: base address of system controller */
+#define SP810_ADDRESS 0x1C020000
+
#ifndef __ASSEMBLY__
#include <xen/inttypes.h>