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/powerpc/powerpc/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: releng/8.4/sys/powerpc/powerpc/platform.c 227713 2011-11-19 13:03:14Z marius $");
   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/kernel.h>
   39 #include <sys/lock.h>
   40 #include <sys/ktr.h>
   41 #include <sys/mutex.h>
   42 #include <sys/systm.h>
   43 #include <sys/sysctl.h>
   44 #include <sys/types.h>
   45 
   46 #include <vm/vm.h>
   47 #include <vm/vm_page.h>
   48 
   49 #include <machine/cpu.h>
   50 #include <machine/platform.h>
   51 #include <machine/platformvar.h>
   52 #include <machine/smp.h>
   53 
   54 #include "platform_if.h"
   55 
   56 static platform_def_t   *plat_def_impl;
   57 static platform_t       plat_obj;
   58 static struct kobj_ops  plat_kernel_kops;
   59 static struct platform_kobj     plat_kernel_obj;
   60 
   61 static char plat_name[64] = "";
   62 SYSCTL_STRING(_hw, OID_AUTO, platform, CTLFLAG_RD | CTLFLAG_TUN,
   63     plat_name, 0, "Platform currently in use");
   64 
   65 void
   66 mem_regions(struct mem_region **phys, int *physsz, struct mem_region **avail,
   67     int *availsz)
   68 {
   69         PLATFORM_MEM_REGIONS(plat_obj, phys, physsz, avail, availsz);
   70 }
   71 
   72 const char *
   73 installed_platform()
   74 {
   75         return (plat_def_impl->name);
   76 }
   77 
   78 u_long
   79 platform_timebase_freq(struct cpuref *cpu)
   80 {
   81         return (PLATFORM_TIMEBASE_FREQ(plat_obj, cpu));
   82 }
   83         
   84 int
   85 platform_smp_first_cpu(struct cpuref *cpu)
   86 {
   87         return (PLATFORM_SMP_FIRST_CPU(plat_obj, cpu));
   88 }
   89 
   90 int
   91 platform_smp_next_cpu(struct cpuref *cpu)
   92 {
   93         return (PLATFORM_SMP_NEXT_CPU(plat_obj, cpu));
   94 }
   95 
   96 int
   97 platform_smp_get_bsp(struct cpuref *cpu)
   98 {
   99         return (PLATFORM_SMP_GET_BSP(plat_obj, cpu));
  100 }
  101 
  102 int
  103 platform_smp_start_cpu(struct pcpu *cpu)
  104 {
  105         return (PLATFORM_SMP_START_CPU(plat_obj, cpu));
  106 }
  107 
  108 /*
  109  * Reset back to firmware.
  110  */
  111 void
  112 cpu_reset()
  113 {
  114         PLATFORM_RESET(plat_obj);
  115 }
  116 
  117 /*
  118  * Platform install routines. Highest priority wins, using the same
  119  * algorithm as bus attachment.
  120  */
  121 SET_DECLARE(platform_set, platform_def_t);
  122 
  123 void
  124 platform_probe_and_attach()
  125 {
  126         platform_def_t  **platpp, *platp;
  127         int             prio, best_prio;
  128 
  129         plat_obj = &plat_kernel_obj;
  130         best_prio = 0;
  131 
  132         /*
  133          * Try to locate the best platform kobj
  134          */
  135         SET_FOREACH(platpp, platform_set) {
  136                 platp = *platpp;
  137 
  138                 /*
  139                  * Take care of compiling the selected class, and
  140                  * then statically initialise the MMU object
  141                  */
  142                 kobj_class_compile_static(platp, &plat_kernel_kops);
  143                 kobj_init_static((kobj_t)plat_obj, platp);
  144 
  145                 prio = PLATFORM_PROBE(plat_obj);
  146 
  147                 /* Check for errors */
  148                 if (prio > 0)
  149                         continue;
  150 
  151                 /*
  152                  * Check if this module was specifically requested through
  153                  * the loader tunable we provide.
  154                  */
  155                 if (strcmp(platp->name,plat_name) == 0) {
  156                         plat_def_impl = platp;
  157                         break;
  158                 }
  159 
  160                 /* Otherwise, see if it is better than our current best */
  161                 if (plat_def_impl == NULL || prio > best_prio) {
  162                         best_prio = prio;
  163                         plat_def_impl = platp;
  164                 }
  165 
  166                 /*
  167                  * We can't free the KOBJ, since it is static. Luckily,
  168                  * this has no ill effects since it gets reset every time.
  169                  */
  170         }
  171 
  172         if (plat_def_impl == NULL)
  173                 panic("No platform module found!");
  174 
  175         /*
  176          * Recompile to make sure we ended with the
  177          * correct one, and then attach.
  178          */
  179 
  180         kobj_class_compile_static(plat_def_impl, &plat_kernel_kops);
  181         kobj_init_static((kobj_t)plat_obj, plat_def_impl);
  182 
  183         strlcpy(plat_name,plat_def_impl->name,sizeof(plat_name));
  184 
  185         PLATFORM_ATTACH(plat_obj);
  186 }
  187 

Cache object: 78ae3684bc85015a3f6ca970cfa9dc76


[ 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.