Author: gonzo
Date: Mon Apr  2 23:30:21 2018
New Revision: 331894
URL: https://svnweb.freebsd.org/changeset/base/331894

Log:
  MFC r306436-r306437, r306489, r306491
  
  r306436 by manu:
  RPI-B: Add support for MULTIDELAY
  
  100 cycles per us seems accurate enough, at least it's better than the 200 
value
  that was used before.
  
  Reviewed by:  andrew, imp
  Differential Revision:        https://reviews.freebsd.org/D8062
  
  r306437 by manu:
  RPI2: Add support for PLATFORM_SMP so we can later add it to GENERIC.
  
  Reviewed by:  andrew
  Differential Revision:        https://reviews.freebsd.org/D8063
  
  r306489 by manu:
  bcm2835_cpufreq: Only attach driver if we correcly match on the machine
  compatible string.
  
  r306491 by manu:
  RPI2: Add support for MULTIDELAY, this is needed for inclusion into GENERIC.

Added:
  stable/11/sys/arm/broadcom/bcm2835/bcm2836_mp.h
     - copied unchanged from r306437, head/sys/arm/broadcom/bcm2835/bcm2836_mp.h
Modified:
  stable/11/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c
  stable/11/sys/arm/broadcom/bcm2835/bcm2835_machdep.c
  stable/11/sys/arm/broadcom/bcm2835/bcm2835_systimer.c
  stable/11/sys/arm/broadcom/bcm2835/bcm2836_mp.c
  stable/11/sys/arm/conf/RPI-B
  stable/11/sys/arm/conf/RPI2
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c
==============================================================================
--- stable/11/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c        Mon Apr  2 
23:19:07 2018        (r331893)
+++ stable/11/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c        Mon Apr  2 
23:30:21 2018        (r331894)
@@ -44,6 +44,11 @@ __FBSDID("$FreeBSD$");
 #include <machine/cpu.h>
 #include <machine/intr.h>
 
+#include <dev/fdt/fdt_common.h>
+
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+
 #include <arm/broadcom/bcm2835/bcm2835_mbox.h>
 #include <arm/broadcom/bcm2835/bcm2835_mbox_prop.h>
 #include <arm/broadcom/bcm2835/bcm2835_vcbus.h>
@@ -119,6 +124,13 @@ struct bcm2835_cpufreq_softc {
        struct intr_config_hook init_hook;
 };
 
+static struct ofw_compat_data compat_data[] = {
+       { "broadcom,bcm2835-vc",        1 },
+       { "broadcom,bcm2708-vc",        1 },
+       { "brcm,bcm2709",       1 },
+       { NULL, 0 }
+};
+
 static int cpufreq_verbose = 0;
 TUNABLE_INT("hw.bcm2835.cpufreq.verbose", &cpufreq_verbose);
 static int cpufreq_lowest_freq = DEFAULT_LOWEST_FREQ;
@@ -1244,6 +1256,16 @@ bcm2835_cpufreq_init(void *arg)
 static void
 bcm2835_cpufreq_identify(driver_t *driver, device_t parent)
 {
+       const struct ofw_compat_data *compat;
+       phandle_t root;
+
+       root = OF_finddevice("/");
+       for (compat = compat_data; compat->ocd_str != NULL; compat++)
+               if (fdt_is_compatible(root, compat->ocd_str))
+                       break;
+
+       if (compat->ocd_data == 0)
+               return;
 
        DPRINTF("driver=%p, parent=%p\n", driver, parent);
        if (device_find_child(parent, "bcm2835_cpufreq", -1) != NULL)

Modified: stable/11/sys/arm/broadcom/bcm2835/bcm2835_machdep.c
==============================================================================
--- stable/11/sys/arm/broadcom/bcm2835/bcm2835_machdep.c        Mon Apr  2 
23:19:07 2018        (r331893)
+++ stable/11/sys/arm/broadcom/bcm2835/bcm2835_machdep.c        Mon Apr  2 
23:30:21 2018        (r331894)
@@ -58,6 +58,7 @@ __FBSDID("$FreeBSD$");
 #include <dev/fdt/fdt_common.h>
 
 #include <arm/broadcom/bcm2835/bcm2835_wdog.h>
+#include <arm/broadcom/bcm2835/bcm2836_mp.h>
 
 #include "platform_if.h"
 
@@ -131,7 +132,7 @@ static platform_method_t bcm2835_methods[] = {
 
        PLATFORMMETHOD_END,
 };
-FDT_PLATFORM_DEF(bcm2835, "bcm2835", 0, "raspberrypi,model-b", 0);
+FDT_PLATFORM_DEF(bcm2835, "bcm2835", 0, "raspberrypi,model-b", 100);
 #endif
 
 #ifdef SOC_BCM2836
@@ -141,7 +142,12 @@ static platform_method_t bcm2836_methods[] = {
        PLATFORMMETHOD(platform_late_init,      bcm2835_late_init),
        PLATFORMMETHOD(platform_cpu_reset,      bcm2835_cpu_reset),
 
+#ifdef SMP
+       PLATFORMMETHOD(platform_mp_start_ap,    bcm2836_mp_start_ap),
+       PLATFORMMETHOD(platform_mp_setmaxid,    bcm2836_mp_setmaxid),
+#endif
+
        PLATFORMMETHOD_END,
 };
-FDT_PLATFORM_DEF(bcm2836, "bcm2836", 0, "brcm,bcm2709", 0);
+FDT_PLATFORM_DEF(bcm2836, "bcm2836", 0, "brcm,bcm2709", 100);
 #endif

Modified: stable/11/sys/arm/broadcom/bcm2835/bcm2835_systimer.c
==============================================================================
--- stable/11/sys/arm/broadcom/bcm2835/bcm2835_systimer.c       Mon Apr  2 
23:19:07 2018        (r331893)
+++ stable/11/sys/arm/broadcom/bcm2835/bcm2835_systimer.c       Mon Apr  2 
23:30:21 2018        (r331894)
@@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$");
 #include <machine/bus.h>
 #include <machine/cpu.h>
 #include <machine/intr.h>
+#include <machine/machdep.h>
 
 #include <dev/fdt/fdt_common.h>
 #include <dev/ofw/openfirm.h>
@@ -101,6 +102,8 @@ static struct bcm_systimer_softc *bcm_systimer_sc = NU
 
 static unsigned bcm_systimer_tc_get_timecount(struct timecounter *);
 
+static delay_func bcm_systimer_delay;
+
 static struct timecounter bcm_systimer_tc = {
        .tc_name           = DEFAULT_TIMER_NAME,
        .tc_get_timecount  = bcm_systimer_tc_get_timecount,
@@ -113,6 +116,9 @@ static struct timecounter bcm_systimer_tc = {
 static unsigned
 bcm_systimer_tc_get_timecount(struct timecounter *tc)
 {
+       if (bcm_systimer_sc == NULL)
+               return (0);
+
        return bcm_systimer_tc_read_4(SYSTIMER_CLO);
 }
 
@@ -147,7 +153,7 @@ restart:
                intr_restore(s);
 
                return (0);
-       } 
+       }
 
        return (EINVAL);
 }
@@ -167,7 +173,7 @@ bcm_systimer_intr(void *arg)
        struct systimer *st = (struct systimer *)arg;
        uint32_t cs;
 
-       cs = bcm_systimer_tc_read_4(SYSTIMER_CS);
+       cs = bcm_systimer_tc_read_4(SYSTIMER_CS);
        if ((cs & (1 << st->index)) == 0)
                return (FILTER_STRAY);
 
@@ -254,6 +260,9 @@ bcm_systimer_attach(device_t dev)
 
        bcm_systimer_sc = sc;
 
+       if (device_get_unit(dev) == 0)
+               arm_set_delay(bcm_systimer_delay, sc);
+
        bcm_systimer_tc.tc_frequency = DEFAULT_FREQUENCY;
        tc_init(&bcm_systimer_tc);
 
@@ -276,19 +285,14 @@ static devclass_t bcm_systimer_devclass;
 
 DRIVER_MODULE(bcm_systimer, simplebus, bcm_systimer_driver, 
bcm_systimer_devclass, 0, 0);
 
-void
-DELAY(int usec)
+static void
+bcm_systimer_delay(int usec, void *arg)
 {
+       struct bcm_systimer_softc *sc;
        int32_t counts;
        uint32_t first, last;
 
-       if (bcm_systimer_sc == NULL) {
-               for (; usec > 0; usec--)
-                       for (counts = 200; counts > 0; counts--)
-                               /* Prevent gcc from optimizing  out the loop */
-                               cpufunc_nullop();
-               return;
-       }
+       sc = (struct bcm_systimer_softc *) arg;
 
        /* Get the number of times to count */
        counts = usec * (bcm_systimer_tc.tc_frequency / 1000000) + 1;

Modified: stable/11/sys/arm/broadcom/bcm2835/bcm2836_mp.c
==============================================================================
--- stable/11/sys/arm/broadcom/bcm2835/bcm2836_mp.c     Mon Apr  2 23:19:07 
2018        (r331893)
+++ stable/11/sys/arm/broadcom/bcm2835/bcm2836_mp.c     Mon Apr  2 23:30:21 
2018        (r331894)
@@ -45,7 +45,10 @@ __FBSDID("$FreeBSD$");
 #include <machine/bus.h>
 #include <machine/fdt.h>
 #include <machine/intr.h>
+#include <machine/platformvar.h>
 
+#include <arm/broadcom/bcm2835/bcm2836_mp.h>
+
 #ifdef DEBUG
 #define        DPRINTF(fmt, ...) do {                  \
        printf("%s:%u: ", __func__, __LINE__);  \
@@ -77,7 +80,7 @@ static bus_space_handle_t bs_periph;
        bus_space_write_4(fdtbus_bs_tag, bs_periph, (addr), (val))
 
 void
-platform_mp_setmaxid(void)
+bcm2836_mp_setmaxid(platform_t plat)
 {
 
        DPRINTF("platform_mp_setmaxid\n");
@@ -90,7 +93,7 @@ platform_mp_setmaxid(void)
 }
 
 void
-platform_mp_start_ap(void)
+bcm2836_mp_start_ap(platform_t plat)
 {
        uint32_t val;
        int i, retry;

Copied: stable/11/sys/arm/broadcom/bcm2835/bcm2836_mp.h (from r306437, 
head/sys/arm/broadcom/bcm2835/bcm2836_mp.h)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ stable/11/sys/arm/broadcom/bcm2835/bcm2836_mp.h     Mon Apr  2 23:30:21 
2018        (r331894, copy of r306437, 
head/sys/arm/broadcom/bcm2835/bcm2836_mp.h)
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (C) 2016 Emmanuel Vadot <m...@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _BCM2836_MP_H_
+#define        _BCM2836_MP_H_
+
+void   bcm2836_mp_setmaxid(platform_t plat);
+void   bcm2836_mp_start_ap(platform_t plat);
+
+#endif /* _BCM2836_MP_H_ */

Modified: stable/11/sys/arm/conf/RPI-B
==============================================================================
--- stable/11/sys/arm/conf/RPI-B        Mon Apr  2 23:19:07 2018        
(r331893)
+++ stable/11/sys/arm/conf/RPI-B        Mon Apr  2 23:30:21 2018        
(r331894)
@@ -28,6 +28,7 @@ options       INTRNG
 
 options        SCHED_4BSD              # 4BSD scheduler
 options        PLATFORM
+options        MULTIDELAY
 
 # NFS root from boopt/dhcp
 #options       BOOTP

Modified: stable/11/sys/arm/conf/RPI2
==============================================================================
--- stable/11/sys/arm/conf/RPI2 Mon Apr  2 23:19:07 2018        (r331893)
+++ stable/11/sys/arm/conf/RPI2 Mon Apr  2 23:30:21 2018        (r331894)
@@ -29,6 +29,8 @@ options       INTRNG
 options        SCHED_ULE               # ULE scheduler
 options        SMP                     # Enable multiple cores
 options        PLATFORM
+options        PLATFORM_SMP
+options        MULTIDELAY
 
 # NFS root from boopt/dhcp
 #options       BOOTP
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to