127521ff8SAndrew Turner#- 227521ff8SAndrew Turner# Copyright (c) 2009 Nathan Whitehorn 327521ff8SAndrew Turner# All rights reserved. 427521ff8SAndrew Turner# 527521ff8SAndrew Turner# Redistribution and use in source and binary forms, with or without 627521ff8SAndrew Turner# modification, are permitted provided that the following conditions 727521ff8SAndrew Turner# are met: 827521ff8SAndrew Turner# 1. Redistributions of source code must retain the above copyright 927521ff8SAndrew Turner# notice, this list of conditions and the following disclaimer. 1027521ff8SAndrew Turner# 2. Redistributions in binary form must reproduce the above copyright 1127521ff8SAndrew Turner# notice, this list of conditions and the following disclaimer in the 1227521ff8SAndrew Turner# documentation and/or other materials provided with the distribution. 1327521ff8SAndrew Turner# 1427521ff8SAndrew Turner# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1527521ff8SAndrew Turner# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1627521ff8SAndrew Turner# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1727521ff8SAndrew Turner# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1827521ff8SAndrew Turner# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1927521ff8SAndrew Turner# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2027521ff8SAndrew Turner# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2127521ff8SAndrew Turner# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2227521ff8SAndrew Turner# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2327521ff8SAndrew Turner# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2427521ff8SAndrew Turner# SUCH DAMAGE. 2527521ff8SAndrew Turner# 2627521ff8SAndrew Turner# 2727521ff8SAndrew Turner 2827521ff8SAndrew Turner#include <sys/param.h> 296c925b9cSAndrew Turner#include <sys/systm.h> 306c925b9cSAndrew Turner#include <sys/devmap.h> 3127521ff8SAndrew Turner#include <sys/lock.h> 3227521ff8SAndrew Turner#include <sys/mutex.h> 3327521ff8SAndrew Turner#include <sys/smp.h> 3427521ff8SAndrew Turner 3527521ff8SAndrew Turner#include <machine/machdep.h> 3627521ff8SAndrew Turner#include <machine/platform.h> 3727521ff8SAndrew Turner#include <machine/platformvar.h> 3827521ff8SAndrew Turner#include <machine/smp.h> 3927521ff8SAndrew Turner#include <machine/vmparam.h> 4027521ff8SAndrew Turner 4127521ff8SAndrew Turner/** 4227521ff8SAndrew Turner * @defgroup PLATFORM platform - KObj methods for ARM platform 4327521ff8SAndrew Turner * implementations 4427521ff8SAndrew Turner * @brief A set of methods required by all platform implementations. 4527521ff8SAndrew Turner * These are used to bring up secondary CPUs, supply the physical memory 4627521ff8SAndrew Turner * map, etc. 4727521ff8SAndrew Turner *@{ 4827521ff8SAndrew Turner */ 4927521ff8SAndrew Turner 5027521ff8SAndrew TurnerINTERFACE platform; 5127521ff8SAndrew Turner 5227521ff8SAndrew Turner# 5327521ff8SAndrew Turner# Default implementations 5427521ff8SAndrew Turner# 5527521ff8SAndrew TurnerCODE { 5627521ff8SAndrew Turner static void platform_null_attach(platform_t plat) 5727521ff8SAndrew Turner { 5827521ff8SAndrew Turner return; 5927521ff8SAndrew Turner } 60a19c0b37SAndrew Turner 616c925b9cSAndrew Turner static vm_offset_t platform_default_lastaddr(platform_t plat) 626c925b9cSAndrew Turner { 636c925b9cSAndrew Turner return (devmap_lastaddr()); 646c925b9cSAndrew Turner } 656c925b9cSAndrew Turner 66a19c0b37SAndrew Turner static void platform_default_mp_setmaxid(platform_t plat) 67a19c0b37SAndrew Turner { 68a19c0b37SAndrew Turner mp_ncpus = 1; 69a19c0b37SAndrew Turner mp_maxid = 0; 70a19c0b37SAndrew Turner } 7127521ff8SAndrew Turner}; 7227521ff8SAndrew Turner 7327521ff8SAndrew Turner/** 7427521ff8SAndrew Turner * @brief Probe for whether we are on this platform, returning the standard 7527521ff8SAndrew Turner * newbus probe codes. If we have Open Firmware or a flattened device tree, 7627521ff8SAndrew Turner * it is guaranteed to be available at this point. 7727521ff8SAndrew Turner */ 7827521ff8SAndrew TurnerMETHOD int probe { 7927521ff8SAndrew Turner platform_t _plat; 8027521ff8SAndrew Turner}; 8127521ff8SAndrew Turner 8227521ff8SAndrew Turner/** 8327521ff8SAndrew Turner * @brief Attach this platform module. This happens before the MMU is online, 8427521ff8SAndrew Turner * so the platform module can install its own high-priority MMU module at 8527521ff8SAndrew Turner * this point. 8627521ff8SAndrew Turner */ 8727521ff8SAndrew TurnerMETHOD int attach { 8827521ff8SAndrew Turner platform_t _plat; 8927521ff8SAndrew Turner} DEFAULT platform_null_attach; 9027521ff8SAndrew Turner 9127521ff8SAndrew Turner/** 9227521ff8SAndrew Turner * @brief Called as one of the last steps of early virtual memory 9327521ff8SAndrew Turner * initialization, shortly before the new page tables are installed. 9427521ff8SAndrew Turner */ 9527521ff8SAndrew TurnerMETHOD int devmap_init { 9627521ff8SAndrew Turner platform_t _plat; 9727521ff8SAndrew Turner}; 9827521ff8SAndrew Turner 9927521ff8SAndrew Turner/** 10027521ff8SAndrew Turner * @brief Called after devmap_init(), and must return the address of the 10127521ff8SAndrew Turner * first byte of unusable KVA space. This allows a platform to carve out 10227521ff8SAndrew Turner * of the top of the KVA space whatever reserves it needs for things like 10327521ff8SAndrew Turner * static device mapping, and this is called to get the value before 10427521ff8SAndrew Turner * calling pmap_bootstrap() which uses the value to size the available KVA. 10527521ff8SAndrew Turner */ 10627521ff8SAndrew TurnerMETHOD vm_offset_t lastaddr { 10727521ff8SAndrew Turner platform_t _plat; 1086c925b9cSAndrew Turner} DEFAULT platform_default_lastaddr; 10927521ff8SAndrew Turner 11027521ff8SAndrew Turner/** 11127521ff8SAndrew Turner * @brief Called after the static device mappings are established and just 11227521ff8SAndrew Turner * before cninit(). The intention is that the routine can do any hardware 11327521ff8SAndrew Turner * setup (such as gpio or pinmux) necessary to make the console functional. 11427521ff8SAndrew Turner */ 11527521ff8SAndrew TurnerMETHOD void gpio_init { 11627521ff8SAndrew Turner platform_t _plat; 11727521ff8SAndrew Turner}; 11827521ff8SAndrew Turner 11927521ff8SAndrew Turner/** 12027521ff8SAndrew Turner * @brief Called just after cninit(). This is the first of the init 12127521ff8SAndrew Turner * routines that can use printf() and expect the output to appear on 12227521ff8SAndrew Turner * a standard console. 12327521ff8SAndrew Turner */ 12427521ff8SAndrew TurnerMETHOD void late_init { 12527521ff8SAndrew Turner platform_t _plat; 12627521ff8SAndrew Turner}; 12727521ff8SAndrew Turner 128a19c0b37SAndrew Turner/** 129a19c0b37SAndrew Turner * @brief Called by cpu_mp_setmaxid() to set mp_maxid and mp_ncpus. 130a19c0b37SAndrew Turner */ 131a19c0b37SAndrew TurnerMETHOD void mp_setmaxid { 132a19c0b37SAndrew Turner platform_t _plat; 133a19c0b37SAndrew Turner} DEFAULT platform_default_mp_setmaxid; 134a19c0b37SAndrew Turner 135a19c0b37SAndrew Turner/** 136a19c0b37SAndrew Turner * @brief Called by cpu_mp_start to start the secondary processors. 137a19c0b37SAndrew Turner */ 138a19c0b37SAndrew TurnerMETHOD void mp_start_ap { 139a19c0b37SAndrew Turner platform_t _plat; 140a19c0b37SAndrew Turner}; 1410dbb8873SAndrew Turner 1420dbb8873SAndrew Turner/** 1430dbb8873SAndrew Turner * @brief Called by cpu_reset to reboot. 1440dbb8873SAndrew Turner */ 1450dbb8873SAndrew TurnerMETHOD void cpu_reset { 1460dbb8873SAndrew Turner platform_t _plat; 1470dbb8873SAndrew Turner}; 148