platform_if.m revision 262675
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: stable/10/sys/powerpc/powerpc/platform_if.m 262675 2014-03-02 02:35:46Z jhibbits $ 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 static void platform_null_smp_ap_init(platform_t plat) 84 { 85 return; 86 } 87}; 88 89/** 90 * @brief Probe for whether we are on this platform, returning the standard 91 * newbus probe codes. If we have Open Firmware or a flattened device tree, 92 * it is guaranteed to be available at this point. 93 */ 94METHOD int probe { 95 platform_t _plat; 96}; 97 98 99/** 100 * @brief Attach this platform module. This happens before the MMU is online, 101 * so the platform module can install its own high-priority MMU module at 102 * this point. 103 */ 104METHOD int attach { 105 platform_t _plat; 106} DEFAULT platform_null_attach; 107 108 109/** 110 * @brief Return the system's physical memory map. 111 * 112 * It shall provide the total and the available regions of RAM. 113 * The available regions need not take the kernel into account. 114 * 115 * @param _memp Array of physical memory chunks 116 * @param _memsz Number of physical memory chunks 117 * @param _availp Array of available physical memory chunks 118 * @param _availsz Number of available physical memory chunks 119 */ 120 121METHOD void mem_regions { 122 platform_t _plat; 123 struct mem_region **_memp; 124 int *_memsz; 125 struct mem_region **_availp; 126 int *_availsz; 127}; 128 129/** 130 * @brief Return the maximum address accessible in real mode 131 * (for use with hypervisors) 132 */ 133METHOD vm_offset_t real_maxaddr { 134 platform_t _plat; 135} DEFAULT platform_null_real_maxaddr; 136 137 138/** 139 * @brief Get the CPU's timebase frequency, in ticks per second. 140 * 141 * @param _cpu CPU whose timebase to query 142 */ 143 144METHOD u_long timebase_freq { 145 platform_t _plat; 146 struct cpuref *_cpu; 147}; 148 149# SMP bits 150 151/** 152 * @brief Fill the first CPU's cpuref 153 * 154 * @param _cpuref CPU 155 */ 156METHOD int smp_first_cpu { 157 platform_t _plat; 158 struct cpuref *_cpuref; 159} DEFAULT platform_null_smp_first_cpu; 160 161/** 162 * @brief Fill the next CPU's cpuref 163 * 164 * @param _cpuref CPU 165 */ 166METHOD int smp_next_cpu { 167 platform_t _plat; 168 struct cpuref *_cpuref; 169} DEFAULT platform_null_smp_next_cpu; 170 171/** 172 * @brief Find the boot processor 173 * 174 * @param _cpuref CPU 175 */ 176METHOD int smp_get_bsp { 177 platform_t _plat; 178 struct cpuref *_cpuref; 179} DEFAULT platform_null_smp_first_cpu; 180 181/** 182 * @brief Start a CPU 183 * 184 * @param _cpuref CPU 185 */ 186METHOD int smp_start_cpu { 187 platform_t _plat; 188 struct pcpu *_cpu; 189}; 190 191/** 192 * @brief Start a CPU 193 * 194 */ 195METHOD void smp_ap_init { 196 platform_t _plat; 197} DEFAULT platform_null_smp_ap_init; 198 199/** 200 * @brief Return SMP topology 201 */ 202METHOD cpu_group_t smp_topo { 203 platform_t _plat; 204} DEFAULT platform_null_smp_topo; 205 206/** 207 * @brief Reset system 208 */ 209METHOD void reset { 210 platform_t _plat; 211}; 212 213/** 214 * @brief Suspend the CPU 215 */ 216METHOD void sleep { 217 platform_t _plat; 218}; 219 220