1#- 2# Copyright (c) 2009 Nathan Whitehorn 3# All rights reserved. 4# 5# Redistribution and use in source and binary forms, with or without 6# modification, are permitted provided that the following conditions 7# are met: 8# 1. Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# 2. Redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution. 13# 14# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24# SUCH DAMAGE. 25# 26# $FreeBSD$ 27# 28 29#include <sys/param.h> 30#include <sys/lock.h> 31#include <sys/mutex.h> 32#include <sys/systm.h> 33#include <sys/smp.h> 34 35#include <machine/platform.h> 36#include <machine/platformvar.h> 37#include <machine/smp.h> 38#include <machine/vmparam.h> 39 40/** 41 * @defgroup PLATFORM platform - KObj methods for PowerPC platform 42 * implementations 43 * @brief A set of methods required by all platform implementations. 44 * These are used to bring up secondary CPUs, supply the physical memory 45 * map, etc. 46 *@{ 47 */ 48 49INTERFACE platform; 50 51# 52# Default implementations 53# 54CODE { 55 static void platform_null_attach(platform_t plat) 56 { 57 return; 58 } 59 static int platform_null_smp_first_cpu(platform_t plat, 60 struct cpuref *cpuref) 61 { 62 cpuref->cr_hwref = -1; 63 cpuref->cr_cpuid = 0; 64 return (0); 65 } 66 static int platform_null_smp_next_cpu(platform_t plat, 67 struct cpuref *_cpuref) 68 { 69 return (ENOENT); 70 } 71 static struct cpu_group *platform_null_smp_topo(platform_t plat) 72 { 73#ifdef SMP 74 return (smp_topo_none()); 75#else 76 return (NULL); 77#endif 78 } 79 static vm_offset_t platform_null_real_maxaddr(platform_t plat) 80 { 81 return (VM_MAX_ADDRESS); 82 } 83}; 84 85/** 86 * @brief Probe for whether we are on this platform, returning the standard 87 * newbus probe codes. If we have Open Firmware or a flattened device tree, 88 * it is guaranteed to be available at this point. 89 */ 90METHOD int probe { 91 platform_t _plat; 92}; 93 94 95/** 96 * @brief Attach this platform module. This happens before the MMU is online, 97 * so the platform module can install its own high-priority MMU module at 98 * this point. 99 */ 100METHOD int attach { 101 platform_t _plat; 102} DEFAULT platform_null_attach; 103 104 105/** 106 * @brief Return the system's physical memory map. 107 * 108 * It shall provide the total and the available regions of RAM. 109 * The available regions need not take the kernel into account. 110 * 111 * @param _memp Array of physical memory chunks 112 * @param _memsz Number of physical memory chunks 113 * @param _availp Array of available physical memory chunks 114 * @param _availsz Number of available physical memory chunks 115 */ 116 117METHOD void mem_regions { 118 platform_t _plat; 119 struct mem_region **_memp; 120 int *_memsz; 121 struct mem_region **_availp; 122 int *_availsz; 123}; 124 125/** 126 * @brief Return the maximum address accessible in real mode 127 * (for use with hypervisors) 128 */ 129METHOD vm_offset_t real_maxaddr { 130 platform_t _plat; 131} DEFAULT platform_null_real_maxaddr; 132 133 134/** 135 * @brief Get the CPU's timebase frequency, in ticks per second. 136 * 137 * @param _cpu CPU whose timebase to query 138 */ 139 140METHOD u_long timebase_freq { 141 platform_t _plat; 142 struct cpuref *_cpu; 143}; 144 145# SMP bits 146 147/** 148 * @brief Fill the first CPU's cpuref 149 * 150 * @param _cpuref CPU 151 */ 152METHOD int smp_first_cpu { 153 platform_t _plat; 154 struct cpuref *_cpuref; 155} DEFAULT platform_null_smp_first_cpu; 156 157/** 158 * @brief Fill the next CPU's cpuref 159 * 160 * @param _cpuref CPU 161 */ 162METHOD int smp_next_cpu { 163 platform_t _plat; 164 struct cpuref *_cpuref; 165} DEFAULT platform_null_smp_next_cpu; 166 167/** 168 * @brief Find the boot processor 169 * 170 * @param _cpuref CPU 171 */ 172METHOD int smp_get_bsp { 173 platform_t _plat; 174 struct cpuref *_cpuref; 175} DEFAULT platform_null_smp_first_cpu; 176 177/** 178 * @brief Start a CPU 179 * 180 * @param _cpuref CPU 181 */ 182METHOD int smp_start_cpu { 183 platform_t _plat; 184 struct pcpu *_cpu; 185}; 186 187/** 188 * @brief Return SMP topology 189 */ 190METHOD cpu_group_t smp_topo { 191 platform_t _plat; 192} DEFAULT platform_null_smp_topo; 193 194/** 195 * @brief Reset system 196 */ 197METHOD void reset { 198 platform_t _plat; 199}; 200 201