The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/arm/arm/platform.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2005 Peter Grehan
    3  * Copyright (c) 2009 Nathan Whitehorn
    4  * All rights reserved.
    5  *
    6  * Redistribution and use in source and binary forms, with or without
    7  * modification, are permitted provided that the following conditions
    8  * are met:
    9  * 1. Redistributions of source code must retain the above copyright
   10  *    notice, this list of conditions and the following disclaimer.
   11  * 2. Redistributions in binary form must reproduce the above copyright
   12  *    notice, this list of conditions and the following disclaimer in the
   13  *    documentation and/or other materials provided with the distribution.
   14  *
   15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   25  * SUCH DAMAGE.
   26  *
   27  */
   28 
   29 #include <sys/cdefs.h>
   30 __FBSDID("$FreeBSD$");
   31 
   32 /*
   33  * Dispatch platform calls to the appropriate platform implementation
   34  * through a previously registered kernel object.
   35  */
   36 
   37 #include <sys/param.h>
   38 #include <sys/bus.h>
   39 #include <sys/kernel.h>
   40 #include <sys/lock.h>
   41 #include <sys/ktr.h>
   42 #include <sys/mutex.h>
   43 #include <sys/rman.h>
   44 #include <sys/systm.h>
   45 #include <sys/smp.h>
   46 #include <sys/sysctl.h>
   47 #include <sys/types.h>
   48 
   49 #include <vm/vm.h>
   50 #include <vm/vm_page.h>
   51 
   52 #include <machine/bus_dma.h>
   53 #include <machine/cpu.h>
   54 #include <machine/intr.h>
   55 #include <machine/machdep.h>
   56 #include <machine/md_var.h>
   57 #include <machine/platform.h>
   58 #include <machine/platformvar.h>
   59 #include <machine/smp.h>
   60 
   61 #include "platform_if.h"
   62 
   63 static platform_def_t   *plat_def_impl;
   64 static platform_t       plat_obj;
   65 static struct kobj_ops  plat_kernel_kops;
   66 static struct platform_kobj     plat_kernel_obj;
   67 
   68 static char plat_name[64];
   69 SYSCTL_STRING(_hw, OID_AUTO, platform, CTLFLAG_RDTUN | CTLFLAG_NOFETCH, plat_name, 0,
   70     "Platform currently in use");
   71 
   72 /*
   73  * Platform install routines. Highest priority wins, using the same
   74  * algorithm as bus attachment.
   75  */
   76 SET_DECLARE(platform_set, platform_def_t);
   77 
   78 static delay_func platform_delay;
   79 
   80 platform_t
   81 platform_obj(void)
   82 {
   83 
   84         return (plat_obj);
   85 }
   86 
   87 void
   88 platform_probe_and_attach(void)
   89 {
   90         platform_def_t  **platpp, *platp;
   91         int             prio, best_prio;
   92 
   93         plat_obj = &plat_kernel_obj;
   94         best_prio = 0;
   95 
   96         /*
   97          * We are unable to use TUNABLE_STR as the read will happen
   98          * well after this function has returned.
   99          */
  100         TUNABLE_STR_FETCH("hw.platform", plat_name, sizeof(plat_name));
  101 
  102         /*
  103          * Try to locate the best platform kobj
  104          */
  105         SET_FOREACH(platpp, platform_set) {
  106                 platp = *platpp;
  107 
  108                 /*
  109                  * Take care of compiling the selected class, and
  110                  * then statically initialise the MMU object
  111                  */
  112                 kobj_class_compile_static((kobj_class_t)platp,
  113                     &plat_kernel_kops);
  114                 kobj_init_static((kobj_t)plat_obj, (kobj_class_t)platp);
  115 
  116                 plat_obj->cls = platp;
  117 
  118                 prio = PLATFORM_PROBE(plat_obj);
  119 
  120                 /* Check for errors */
  121                 if (prio > 0)
  122                         continue;
  123 
  124                 /*
  125                  * Check if this module was specifically requested through
  126                  * the loader tunable we provide.
  127                  */
  128                 if (strcmp(platp->name,plat_name) == 0) {
  129                         plat_def_impl = platp;
  130                         break;
  131                 }
  132 
  133                 /* Otherwise, see if it is better than our current best */
  134                 if (plat_def_impl == NULL || prio > best_prio) {
  135                         best_prio = prio;
  136                         plat_def_impl = platp;
  137                 }
  138 
  139                 /*
  140                  * We can't free the KOBJ, since it is static. Reset the ops
  141                  * member of this class so that we can come back later.
  142                  */
  143                 platp->ops = NULL;
  144         }
  145 
  146         if (plat_def_impl == NULL)
  147                 panic("No platform module found!");
  148 
  149         /*
  150          * Recompile to make sure we ended with the
  151          * correct one, and then attach.
  152          */
  153 
  154         kobj_class_compile_static((kobj_class_t)plat_def_impl,
  155             &plat_kernel_kops);
  156         kobj_init_static((kobj_t)plat_obj, (kobj_class_t)plat_def_impl);
  157 
  158         strlcpy(plat_name, plat_def_impl->name, sizeof(plat_name));
  159 
  160         /* Set a default delay function */
  161         arm_set_delay(platform_delay, NULL);
  162 
  163         PLATFORM_ATTACH(plat_obj);
  164 }
  165 
  166 int
  167 platform_devmap_init(void)
  168 {
  169 
  170         return PLATFORM_DEVMAP_INIT(plat_obj);
  171 }
  172 
  173 vm_offset_t
  174 platform_lastaddr(void)
  175 {
  176 
  177         return PLATFORM_LASTADDR(plat_obj);
  178 }
  179 
  180 void
  181 platform_gpio_init(void)
  182 {
  183 
  184         PLATFORM_GPIO_INIT(plat_obj);
  185 }
  186 
  187 void
  188 platform_late_init(void)
  189 {
  190 
  191         PLATFORM_LATE_INIT(plat_obj);
  192 }
  193 
  194 void
  195 cpu_reset(void)
  196 {
  197 
  198         PLATFORM_CPU_RESET(plat_obj);
  199 
  200         printf("cpu_reset failed");
  201 
  202         intr_disable();
  203         while(1) {
  204                 cpu_sleep(0);
  205         }
  206 }
  207 
  208 static void
  209 platform_delay(int usec, void *arg __unused)
  210 {
  211         int counts;
  212 
  213         for (; usec > 0; usec--)
  214                 for (counts = plat_obj->cls->delay_count; counts > 0; counts--)
  215                         /*
  216                          * Prevent the compiler from optimizing
  217                          * out the loop
  218                          */
  219                         cpufunc_nullop();
  220 }
  221 
  222 #if defined(SMP)
  223 void
  224 platform_mp_setmaxid(void)
  225 {
  226         int ncpu;
  227 
  228         PLATFORM_MP_SETMAXID(plat_obj);
  229 
  230         if (TUNABLE_INT_FETCH("hw.ncpu", &ncpu)) {
  231                 if (ncpu >= 1 && ncpu <= mp_ncpus) {
  232                         mp_ncpus = ncpu;
  233                         mp_maxid = ncpu - 1;
  234                 }
  235         }
  236 }
  237 
  238 void
  239 platform_mp_start_ap(void)
  240 {
  241 
  242         PLATFORM_MP_START_AP(plat_obj);
  243 }
  244 #endif

Cache object: 411855bba53d32de5c80c5f529f94d58


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.