xref: /freebsd/sys/arm/arm/platform_if.m (revision 031beb4e)
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