Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch Simplify MCT; just enable it and then attach an ARM...



details:   https://anonhg.NetBSD.org/src/rev/ab84f2e144f4
branches:  trunk
changeset: 354316:ab84f2e144f4
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Sun Jun 11 16:21:41 2017 +0000

description:
Simplify MCT; just enable it and then attach an ARMv7 generic timer.

diffstat:

 sys/arch/arm/samsung/exynos_platform.c |    8 +-
 sys/arch/arm/samsung/files.exynos      |    6 +-
 sys/arch/arm/samsung/mct.c             |  181 ++++----------------------------
 sys/arch/evbarm/conf/EXYNOS            |    3 +-
 4 files changed, 32 insertions(+), 166 deletions(-)

diffs (truncated from 308 to 300 lines):

diff -r f82bb6e5ef6e -r ab84f2e144f4 sys/arch/arm/samsung/exynos_platform.c
--- a/sys/arch/arm/samsung/exynos_platform.c    Sun Jun 11 16:19:27 2017 +0000
+++ b/sys/arch/arm/samsung/exynos_platform.c    Sun Jun 11 16:21:41 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: exynos_platform.c,v 1.4 2017/06/11 01:15:11 jmcneill Exp $ */
+/* $NetBSD: exynos_platform.c,v 1.5 2017/06/11 16:21:41 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -33,7 +33,7 @@
 #include "ukbd.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: exynos_platform.c,v 1.4 2017/06/11 01:15:11 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: exynos_platform.c,v 1.5 2017/06/11 16:21:41 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -132,9 +132,7 @@
 static void
 exynos_platform_delay(u_int us)
 {
-       extern void mct_delay(u_int);
-
-       mct_delay(us);
+       gtmr_delay(us);
 }
 
 static u_int
diff -r f82bb6e5ef6e -r ab84f2e144f4 sys/arch/arm/samsung/files.exynos
--- a/sys/arch/arm/samsung/files.exynos Sun Jun 11 16:19:27 2017 +0000
+++ b/sys/arch/arm/samsung/files.exynos Sun Jun 11 16:21:41 2017 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: files.exynos,v 1.22 2017/06/10 15:13:18 jmcneill Exp $
+#      $NetBSD: files.exynos,v 1.23 2017/06/11 16:21:41 jmcneill Exp $
 #
 # Configuration info for Samsung Exynos SoC ARM Peripherals
 #
@@ -61,12 +61,12 @@
 file   arch/arm/samsung/exynos_sysmmu.c        exynos_sysmmu
 
 # real time clock
-device  exyortc : ftdbus
+device  exyortc : fdtbus
 attach  exyortc at fdt with exynos_rtc
 file    arch/arm/samsung/exynos_rtc.c          exynos_rtc
 
 # Multi Core timer
-device mct : ftdbus
+device mct { } : fdtbus, mpcorebus
 attach mct at fdt with exyo_mct
 file   arch/arm/samsung/mct.c          exyo_mct
 
diff -r f82bb6e5ef6e -r ab84f2e144f4 sys/arch/arm/samsung/mct.c
--- a/sys/arch/arm/samsung/mct.c        Sun Jun 11 16:19:27 2017 +0000
+++ b/sys/arch/arm/samsung/mct.c        Sun Jun 11 16:21:41 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: mct.c,v 1.11 2017/06/11 01:09:44 jmcneill Exp $        */
+/*     $NetBSD: mct.c,v 1.12 2017/06/11 16:21:41 jmcneill Exp $        */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: mct.c,v 1.11 2017/06/11 01:09:44 jmcneill Exp $");
+__KERNEL_RCSID(1, "$NetBSD: mct.c,v 1.12 2017/06/11 16:21:41 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -50,35 +50,24 @@
 #include <arm/samsung/mct_reg.h>
 #include <arm/samsung/mct_var.h>
 
+#include <arm/cortex/gtmr_intr.h>
+#include <arm/cortex/mpcore_var.h>
+#include <arm/cortex/gtmr_var.h>
+
 #include <dev/fdt/fdtvar.h>
+#include <arm/fdt/arm_fdtvar.h>
 
 static int  mct_match(device_t, cfdata_t, void *);
 static void mct_attach(device_t, device_t, void *);
 
-static int clockhandler(void *);
-static u_int mct_get_timecount(struct timecounter *);
-
 CFATTACH_DECL_NEW(exyo_mct, 0, mct_match, mct_attach, NULL, NULL);
 
-
-static struct timecounter mct_timecounter = {
-       .tc_get_timecount = mct_get_timecount,
-       .tc_poll_pps = 0,
-       .tc_counter_mask = ~0u,
-       .tc_frequency = 0,              /* set by cpu_initclocks() */
-       .tc_name = NULL,                /* set by cpu_initclocks() */
-       .tc_quality = 500,              /* why 500? */
-       .tc_priv = &mct_sc,
-       .tc_next = NULL,
-};
-
 static inline uint32_t
 mct_read_global(struct mct_softc *sc, bus_size_t o)
 {
        return bus_space_read_4(sc->sc_bst, sc->sc_bsh, o);
 }
 
-
 static inline void
 mct_write_global(struct mct_softc *sc, bus_size_t o, uint32_t v)
 {
@@ -128,6 +117,12 @@
        panic("MCT hangs after writing %#x at %#x", v, (uint32_t) o);
 }
 
+static void
+mct_fdt_cpu_hatch(void *priv, struct cpu_info *ci)
+{
+       gtmr_init_cpu_clock(ci);
+}
+
 static int
 mct_match(device_t parent, cfdata_t cf, void *aux)
 {
@@ -138,7 +133,6 @@
        return of_match_compatible(faa->faa_phandle, compatible);
 }
 
-
 static void
 mct_attach(device_t parent, device_t self, void *aux)
 {
@@ -168,145 +162,18 @@
        aprint_naive("\n");
        aprint_normal(": Exynos SoC multi core timer (64 bits)\n");
 
-       evcnt_attach_dynamic(&sc->sc_ev_missing_ticks, EVCNT_TYPE_MISC, NULL,
-               device_xname(self), "missing interrupts");
-
-       for (int i = 0; i < 12; i++)
-               fdtbus_intr_establish(faa->faa_phandle, i, 0, 0,
-                                     clockhandler, 0);
-}
-
-static inline uint64_t
-mct_gettime(struct mct_softc *sc)
-{
-       uint32_t lo, hi;
-       do {
-               hi = mct_read_global(sc, MCT_G_CNT_U);
-               lo = mct_read_global(sc, MCT_G_CNT_L);
-       } while (hi != mct_read_global(sc, MCT_G_CNT_U));
-       return ((uint64_t) hi << 32) | lo;
-}
-
-static u_int
-mct_get_timecount(struct timecounter *tc)
-{
-       struct mct_softc *sc = tc->tc_priv;
-
-       return (u_int)mct_gettime(sc);
-}
-
-void
-mct_delay(u_int us)
-{
-       struct mct_softc *sc = &mct_sc;
-
-       if (sc->sc_bsh == (bus_space_handle_t)0)
-               return;
-
-       int64_t mct_ticks = ((uint64_t)us * sc->sc_freq) / 1000000;
-       uint64_t ticks_prev = mct_gettime(sc);
-       while (mct_ticks > 0) {
-               uint64_t ticks_cur = mct_gettime(sc);
-               mct_ticks -= (ticks_cur - ticks_prev);
-               ticks_prev = ticks_cur;
-       }
-}
-
-/* interrupt handler */
-static int
-clockhandler(void *arg)
-{
-       struct clockframe * const cf = arg;
-       struct mct_softc * const sc = &mct_sc;
-       const uint64_t now = mct_gettime(sc);
-       int64_t delta = now - sc->sc_lastintr;
-       int64_t periods = delta / sc->sc_autoinc;
-
-       KASSERT(delta >= 0);
-       KASSERT(periods >= 0);
-
-       /* ack the interrupt */
-       mct_write_global(sc, MCT_G_INT_CSTAT, G_INT_CSTAT_CLEAR);
-
-       /* check if we missed clock interrupts */
-       if (periods > 1)
-               sc->sc_ev_missing_ticks.ev_count += periods - 1;
-
-       sc->sc_lastintr = now;
-       hardclock(cf);
-
-       /* handled */
-       return 1;
-}
+       /* Start the timer */
+       uint32_t tcon = mct_read_global(sc, MCT_G_TCON);
+       tcon |= G_TCON_START;
+       mct_write_global(sc, MCT_G_TCON, tcon);
 
-void
-mct_init_cpu_clock(struct cpu_info *ci)
-{
-       struct mct_softc * const sc = &mct_sc;
-       uint64_t now = mct_gettime(sc);
-       uint64_t then;
-       uint32_t tcon;
-
-       KASSERT(ci == curcpu());
-
-       sc->sc_lastintr = now;
-
-       /* get current config */
-       tcon = mct_read_global(sc, MCT_G_TCON);
-
-       /* setup auto increment */
-       mct_write_global(sc, MCT_G_COMP0_ADD_INCR, sc->sc_autoinc);
-
-       /* (re)setup comparator */
-       then = now + sc->sc_autoinc;
-       mct_write_global(sc, MCT_G_COMP0_L, (uint32_t) then);
-       mct_write_global(sc, MCT_G_COMP0_U, (uint32_t) (then >> 32));
-       tcon |= G_TCON_COMP0_AUTOINC;
-       tcon |= G_TCON_COMP0_ENABLE;
-
-       /* start timer */
-       tcon |= G_TCON_START;
-
-       /* enable interrupt */
-       mct_write_global(sc, MCT_G_INT_ENB, G_INT_ENB_ENABLE);
-
-       /* update config, starting the thing */
-       mct_write_global(sc, MCT_G_TCON, tcon);
-}
+       /* Attach ARMv7 generic timer */
+       struct mpcore_attach_args mpcaa = {
+               .mpcaa_name = "armgtmr",
+               .mpcaa_irq = IRQ_GTMR_PPI_VTIMER
+       };
 
-void
-cpu_initclocks(void)
-{
-       struct mct_softc * const sc = &mct_sc;
-
-       sc->sc_autoinc = sc->sc_freq / hz;
-       mct_init_cpu_clock(curcpu());
-
-       mct_timecounter.tc_name = device_xname(sc->sc_dev);
-       mct_timecounter.tc_frequency = sc->sc_freq;
-
-       tc_init(&mct_timecounter);
-
-#if 0
-       {
-               uint64_t then, now;
+       config_found(self, &mpcaa, NULL);
 
-               printf("testing timer\n");
-               for (int i = 0; i < 200; i++) {
-                       printf("cstat %d\n", mct_read_global(sc, MCT_G_INT_CSTAT));
-                       then = mct_get_timecount(&mct_timecounter);
-                       do {
-                               now = mct_get_timecount(&mct_timecounter);
-                       } while (now == then);
-                       printf("\tgot %"PRIu64"\n", now);
-                       for (int j = 0; j < 90000; j++);
-               }
-               printf("passed\n");
-       }
-#endif
+       arm_fdt_cpu_hatch_register(self, mct_fdt_cpu_hatch);
 }
-
-void
-setstatclockrate(int newhz)
-{
-}
diff -r f82bb6e5ef6e -r ab84f2e144f4 sys/arch/evbarm/conf/EXYNOS
--- a/sys/arch/evbarm/conf/EXYNOS       Sun Jun 11 16:19:27 2017 +0000
+++ b/sys/arch/evbarm/conf/EXYNOS       Sun Jun 11 16:21:41 2017 +0000
@@ -1,5 +1,5 @@
 #
-#      $NetBSD: EXYNOS,v 1.16 2017/06/11 11:04:20 jmcneill Exp $
+#      $NetBSD: EXYNOS,v 1.17 2017/06/11 16:21:41 jmcneill Exp $
 #
 #      Samsung Exynos SoC kernel
 #



Home | Main Index | Thread Index | Old Index