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>