Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 13 Aug 2014 12:35:31 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r269930 - in projects/arm64/sys: arm/arm arm64/arm64 conf
Message-ID:  <201408131235.s7DCZVOg006761@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Wed Aug 13 12:35:30 2014
New Revision: 269930
URL: http://svnweb.freebsd.org/changeset/base/269930

Log:
  Get the generic timer working on ARMv8. More work is needed to allow
  the driver to be used on both 32 and 64 bit platforms.

Modified:
  projects/arm64/sys/arm/arm/generic_timer.c
  projects/arm64/sys/arm64/arm64/clock.c
  projects/arm64/sys/arm64/arm64/machdep.c
  projects/arm64/sys/conf/files.arm64

Modified: projects/arm64/sys/arm/arm/generic_timer.c
==============================================================================
--- projects/arm64/sys/arm/arm/generic_timer.c	Wed Aug 13 12:35:11 2014	(r269929)
+++ projects/arm64/sys/arm/arm/generic_timer.c	Wed Aug 13 12:35:30 2014	(r269930)
@@ -57,7 +57,7 @@ __FBSDID("$FreeBSD$");
 #include <dev/ofw/ofw_bus_subr.h>
 
 #include <machine/bus.h>
-#include <machine/fdt.h>
+//#include <machine/fdt.h>
 
 #define	GT_CTRL_ENABLE		(1 << 0)
 #define	GT_CTRL_INT_MASK	(1 << 1)
@@ -106,29 +106,20 @@ get_freq(void)
 {
 	uint32_t val;
 
-	__asm volatile("mrc p15, 0, %0, c14, c0, 0" : "=r" (val));
+	//__asm volatile("mrc p15, 0, %0, c14, c0, 0" : "=r" (val));
+	__asm volatile("mrs %x0, cntfrq_el0" : "=r" (val));
 
 	return (val);
 }
 
-static inline int
-set_freq(uint32_t val)
-{
-
-	__asm volatile("mcr p15, 0, %[val], c14, c0, 0" : :
-	    [val] "r" (val));
-	isb();
-
-	return (val);
-}
-
-
 static inline long
 get_cntpct(void)
 {
 	uint64_t val;
 
-	__asm volatile("mrrc p15, 0, %Q0, %R0, c14" : "=r" (val));
+	//__asm volatile("mrrc p15, 0, %Q0, %R0, c14" : "=r" (val));
+	isb();
+	__asm volatile("mrs %0, cntvct_el0" : "=r" (val));
 
 	return (val);
 }
@@ -137,8 +128,9 @@ static inline int
 set_ctrl(uint32_t val)
 {
 
-	__asm volatile("mcr p15, 0, %[val], c14, c2, 1" : :
-	    [val] "r" (val));
+	//__asm volatile("mcr p15, 0, %[val], c14, c2, 1" : :
+	//    [val] "r" (val));
+	__asm volatile("msr cntv_ctl_el0, %x0" : : "r" (val));
 	isb();
 
 	return (0);
@@ -148,8 +140,9 @@ static inline int
 set_tval(uint32_t val)
 {
 
-	__asm volatile("mcr p15, 0, %[val], c14, c2, 0" : :
-	    [val] "r" (val));
+	//__asm volatile("mcr p15, 0, %[val], c14, c2, 0" : :
+	//    [val] "r" (val));
+	__asm volatile("msr cntv_tval_el0, %x0" : : "r" (val));
 	isb();
 
 	return (0);
@@ -160,17 +153,8 @@ get_ctrl(void)
 {
 	uint32_t val;
 
-	__asm volatile("mrc p15, 0, %0, c14, c2, 1" : "=r" (val));
-
-	return (val);
-}
-
-static inline int
-get_tval(void)
-{
-	uint32_t val;
-
-	__asm volatile("mrc p15, 0, %0, c14, c2, 0" : "=r" (val));
+	//__asm volatile("mrc p15, 0, %0, c14, c2, 1" : "=r" (val));
+	__asm volatile("mrs %x0, cntv_ctl_el0" : "=r" (val));
 
 	return (val);
 }
@@ -180,13 +164,18 @@ disable_user_access(void)
 {
 	uint32_t cntkctl;
 
-	__asm volatile("mrc p15, 0, %0, c14, c1, 0" : "=r" (cntkctl));
+	//__asm volatile("mrc p15, 0, %0, c14, c1, 0" : "=r" (cntkctl));
+	__asm volatile("mrs %x0, cntkctl_el1" : "=r" (cntkctl));
 	cntkctl &= ~(GT_CNTKCTL_PL0PTEN | GT_CNTKCTL_PL0VTEN |
-	    GT_CNTKCTL_EVNTEN | GT_CNTKCTL_PL0VCTEN | GT_CNTKCTL_PL0PCTEN);
-	__asm volatile("mcr p15, 0, %0, c14, c1, 0" : : "r" (cntkctl));
+	    GT_CNTKCTL_EVNTEN | GT_CNTKCTL_PL0VCTEN | GT_CNTKCTL_PL0PCTEN |
+	    0xf << 4);
+	cntkctl |= GT_CNTKCTL_EVNTEN | 0 << 4;
+	//__asm volatile("mcr p15, 0, %0, c14, c1, 0" : : "r" (cntkctl));
+	__asm volatile("msr cntkctl_el1, %x0" :: "r" (cntkctl));
 	isb();
 }
 
+
 static unsigned
 arm_tmr_get_timecount(struct timecounter *tc)
 {
@@ -213,7 +202,6 @@ arm_tmr_start(struct eventtimer *et, sbi
 	}
 
 	return (EINVAL);
-
 }
 
 static int
@@ -254,10 +242,15 @@ arm_tmr_probe(device_t dev)
 	if (!ofw_bus_status_okay(dev))
 		return (ENXIO);
 
-	if (!ofw_bus_is_compatible(dev, "arm,armv7-timer"))
+	if (!ofw_bus_is_compatible(dev, "arm,armv7-timer") &&
+	    !ofw_bus_is_compatible(dev, "arm,armv8-timer"))
 		return (ENXIO);
 
+#if 0
 	device_set_desc(dev, "ARMv7 Generic Timer");
+#else
+	device_set_desc(dev, "ARMv8 Generic Timer");
+#endif
 	return (BUS_PROBE_DEFAULT);
 }
 
@@ -300,7 +293,7 @@ arm_tmr_attach(device_t dev)
 	arm_tmr_sc = sc;
 
 	/* Setup secure and non-secure IRQs handler */
-	for (i = 0; i < 2; i++) {
+	for (i = 0; i < 4; i++) {
 		error = bus_setup_intr(dev, sc->res[i], INTR_TYPE_CLK,
 		    arm_tmr_intr, NULL, sc, &sc->ihl[i]);
 		if (error) {
@@ -345,6 +338,8 @@ static devclass_t arm_tmr_devclass;
 
 EARLY_DRIVER_MODULE(timer, simplebus, arm_tmr_driver, arm_tmr_devclass, 0, 0,
     BUS_PASS_TIMER + BUS_PASS_ORDER_MIDDLE);
+EARLY_DRIVER_MODULE(timer, ofwbus, arm_tmr_driver, arm_tmr_devclass, 0, 0,
+    BUS_PASS_TIMER + BUS_PASS_ORDER_MIDDLE);
 
 void
 DELAY(int usec)
@@ -360,10 +355,10 @@ DELAY(int usec)
 		for (; usec > 0; usec--)
 			for (counts = 200; counts > 0; counts--)
 				/*
-				 * Prevent gcc from optimizing
+				 * Prevent the compiler from optimizing
 				 * out the loop
 				 */
-				cpufunc_nullop();
+				__asm __volatile("nop" ::: "memory");
 		return;
 	}
 
@@ -389,3 +384,4 @@ DELAY(int usec)
 		first = last;
 	}
 }
+

Modified: projects/arm64/sys/arm64/arm64/clock.c
==============================================================================
--- projects/arm64/sys/arm64/arm64/clock.c	Wed Aug 13 12:35:11 2014	(r269929)
+++ projects/arm64/sys/arm64/arm64/clock.c	Wed Aug 13 12:35:30 2014	(r269930)
@@ -35,5 +35,5 @@ void
 cpu_initclocks(void)
 {
 
-	printf("cpu_initclocks\n");
+	cpu_initclocks_bsp();
 }

Modified: projects/arm64/sys/arm64/arm64/machdep.c
==============================================================================
--- projects/arm64/sys/arm64/arm64/machdep.c	Wed Aug 13 12:35:11 2014	(r269929)
+++ projects/arm64/sys/arm64/arm64/machdep.c	Wed Aug 13 12:35:30 2014	(r269930)
@@ -147,13 +147,6 @@ set_dbregs(struct thread *td, struct dbr
 	panic("set_dbregs");
 }
 
-void
-DELAY(int delay)
-{
-
-	/* TODO: Implement... */
-}
-
 int
 ptrace_set_pc(struct thread *td, u_long addr)
 {

Modified: projects/arm64/sys/conf/files.arm64
==============================================================================
--- projects/arm64/sys/conf/files.arm64	Wed Aug 13 12:35:11 2014	(r269929)
+++ projects/arm64/sys/conf/files.arm64	Wed Aug 13 12:35:30 2014	(r269930)
@@ -1,5 +1,6 @@
 
 arm/arm/devmap.c		standard
+arm/arm/generic_timer.c		standard
 arm/arm/gic.c			standard
 arm64/arm64/autoconf.c		standard
 arm64/arm64/bcopy.c		standard



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201408131235.s7DCZVOg006761>