1*0dec4042Scherry /* $NetBSD: prep_machdep.c,v 1.11 2016/12/22 14:47:58 cherry Exp $ */ 2d974db0aSgarbled 3d974db0aSgarbled /*- 4d974db0aSgarbled * Copyright (c) 2007 The NetBSD Foundation, Inc. 5d974db0aSgarbled * All rights reserved. 6d974db0aSgarbled * 7d974db0aSgarbled * This code is derived from software contributed to The NetBSD Foundation 8d974db0aSgarbled * by Tim Rightnour 9d974db0aSgarbled * 10d974db0aSgarbled * Redistribution and use in source and binary forms, with or without 11d974db0aSgarbled * modification, are permitted provided that the following conditions 12d974db0aSgarbled * are met: 13d974db0aSgarbled * 1. Redistributions of source code must retain the above copyright 14d974db0aSgarbled * notice, this list of conditions and the following disclaimer. 15d974db0aSgarbled * 2. Redistributions in binary form must reproduce the above copyright 16d974db0aSgarbled * notice, this list of conditions and the following disclaimer in the 17d974db0aSgarbled * documentation and/or other materials provided with the distribution. 18d974db0aSgarbled * 19d974db0aSgarbled * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20d974db0aSgarbled * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21d974db0aSgarbled * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22d974db0aSgarbled * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23d974db0aSgarbled * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24d974db0aSgarbled * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25d974db0aSgarbled * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26d974db0aSgarbled * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27d974db0aSgarbled * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28d974db0aSgarbled * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29d974db0aSgarbled * POSSIBILITY OF SUCH DAMAGE. 30d974db0aSgarbled */ 31d974db0aSgarbled 32d974db0aSgarbled /* 33d974db0aSgarbled * This is a set of general routines that most PReP-similar machines have 34d974db0aSgarbled * in common. Machines that use these routines do not have to be fully 35d974db0aSgarbled * PReP compliant, the only requirement is that they use a PReP memory map. 36d974db0aSgarbled * IE, io at 0x80000000 and mem at 0xc0000000. 37d974db0aSgarbled */ 38d974db0aSgarbled 39d974db0aSgarbled #include <sys/cdefs.h> 40*0dec4042Scherry __KERNEL_RCSID(0, "$NetBSD: prep_machdep.c,v 1.11 2016/12/22 14:47:58 cherry Exp $"); 410cc72e51Sapb 420cc72e51Sapb #include "opt_modular.h" 43d974db0aSgarbled 44d974db0aSgarbled #include <sys/param.h> 45d974db0aSgarbled #include <sys/extent.h> 46d974db0aSgarbled #include <sys/kernel.h> 47d974db0aSgarbled #include <sys/reboot.h> 48d974db0aSgarbled #include <sys/ksyms.h> 49d974db0aSgarbled 50d974db0aSgarbled #include <uvm/uvm_extern.h> 51d974db0aSgarbled #include <machine/powerpc.h> 52fe6db6ffSdyoung #include <sys/bus.h> 53d974db0aSgarbled #include <machine/pmap.h> 54d974db0aSgarbled #include <powerpc/oea/bat.h> 55d974db0aSgarbled 56d974db0aSgarbled #include "opt_ddb.h" 57d974db0aSgarbled #ifdef DDB 58d974db0aSgarbled #include <machine/db_machdep.h> 59d974db0aSgarbled #include <ddb/db_extern.h> 60d974db0aSgarbled #endif 61d974db0aSgarbled 62d974db0aSgarbled #include "ksyms.h" 63d974db0aSgarbled 640efea177Sad #if NKSYMS || defined(DDB) || defined(MODULAR) 65d974db0aSgarbled extern void *endsym, *startsym; 66d974db0aSgarbled #endif 67d974db0aSgarbled extern struct mem_region physmemr[2], availmemr[2]; 68d974db0aSgarbled 69d974db0aSgarbled struct powerpc_bus_space prep_io_space_tag = { 70d974db0aSgarbled .pbs_flags = _BUS_SPACE_LITTLE_ENDIAN|_BUS_SPACE_IO_TYPE, 71d974db0aSgarbled .pbs_offset = PREP_BUS_SPACE_IO, 72d974db0aSgarbled .pbs_base = 0x00000000, 73d974db0aSgarbled .pbs_limit = PREP_PHYS_SIZE_IO, 74d974db0aSgarbled }; 75d974db0aSgarbled 76d974db0aSgarbled struct powerpc_bus_space genppc_isa_io_space_tag = { 77d974db0aSgarbled .pbs_flags = _BUS_SPACE_LITTLE_ENDIAN|_BUS_SPACE_IO_TYPE, 78d974db0aSgarbled .pbs_offset = PREP_BUS_SPACE_IO, 79d974db0aSgarbled .pbs_base = 0x00000000, 80d974db0aSgarbled .pbs_limit = PREP_ISA_SIZE_IO, 81d974db0aSgarbled }; 82d974db0aSgarbled 83d974db0aSgarbled struct powerpc_bus_space prep_mem_space_tag = { 84d974db0aSgarbled .pbs_flags = _BUS_SPACE_LITTLE_ENDIAN|_BUS_SPACE_MEM_TYPE, 85d974db0aSgarbled .pbs_offset = PREP_BUS_SPACE_MEM, 86d974db0aSgarbled .pbs_base = 0x00000000, 87d974db0aSgarbled .pbs_limit = PREP_PHYS_SIZE_MEM, 88d974db0aSgarbled }; 89d974db0aSgarbled 90d974db0aSgarbled struct powerpc_bus_space genppc_isa_mem_space_tag = { 91d974db0aSgarbled .pbs_flags = _BUS_SPACE_LITTLE_ENDIAN|_BUS_SPACE_MEM_TYPE, 92d974db0aSgarbled .pbs_offset = PREP_BUS_SPACE_MEM, 93d974db0aSgarbled .pbs_base = 0x00000000, 94d974db0aSgarbled .pbs_limit = PREP_ISA_SIZE_MEM, 95d974db0aSgarbled }; 96d974db0aSgarbled 97d974db0aSgarbled static char ex_storage[2][EXTENT_FIXED_STORAGE_SIZE(8)] 98d974db0aSgarbled __attribute__((aligned(8))); 99d974db0aSgarbled 100d974db0aSgarbled void 101d974db0aSgarbled prep_bus_space_init(void) 102d974db0aSgarbled { 103d974db0aSgarbled int error; 104d974db0aSgarbled 105d974db0aSgarbled error = bus_space_init(&prep_io_space_tag, "ioport", 106d974db0aSgarbled ex_storage[0], sizeof(ex_storage[0])); 107d974db0aSgarbled if (error) 108d974db0aSgarbled panic("prep_bus_space_init: can't init io tag"); 109d974db0aSgarbled 110d974db0aSgarbled error = extent_alloc_region(prep_io_space_tag.pbs_extent, 111d974db0aSgarbled PREP_PHYS_RESVD_START_IO, PREP_PHYS_RESVD_SIZE_IO, EX_NOWAIT); 112d974db0aSgarbled if (error) 113d974db0aSgarbled panic("prep_bus_space_init: can't block out reserved I/O" 114d974db0aSgarbled " space 0x10000-0x7fffff: error=%d", error); 115d974db0aSgarbled 116d974db0aSgarbled error = bus_space_init(&prep_mem_space_tag, "iomem", 117d974db0aSgarbled ex_storage[1], sizeof(ex_storage[1])); 118d974db0aSgarbled if (error) 119d974db0aSgarbled panic("prep_bus_space_init: can't init mem tag"); 120d974db0aSgarbled 121d974db0aSgarbled genppc_isa_io_space_tag.pbs_extent = prep_io_space_tag.pbs_extent; 122d974db0aSgarbled error = bus_space_init(&genppc_isa_io_space_tag, "isa-ioport", NULL, 0); if (error) 123d974db0aSgarbled panic("prep_bus_space_init: can't init isa io tag"); 124d974db0aSgarbled 125d974db0aSgarbled genppc_isa_mem_space_tag.pbs_extent = prep_mem_space_tag.pbs_extent; 126d974db0aSgarbled error = bus_space_init(&genppc_isa_mem_space_tag, "isa-iomem", NULL, 0); 127d974db0aSgarbled if (error) 128d974db0aSgarbled panic("prep_bus_space_init: can't init isa mem tag"); 129d974db0aSgarbled } 130d974db0aSgarbled 131d974db0aSgarbled /* 132d974db0aSgarbled * just a few calls used in initppc() all in one place so everything gets 133d974db0aSgarbled * done the same across the ports 134d974db0aSgarbled */ 135d974db0aSgarbled 136d974db0aSgarbled void 137d974db0aSgarbled prep_initppc(u_long startkernel, u_long endkernel, u_int args) 138d974db0aSgarbled { 139d974db0aSgarbled 140d974db0aSgarbled /* 141d974db0aSgarbled * Now setup fixed bat registers 142d974db0aSgarbled * We setup the memory BAT, the IO space BAT, and a special 143d974db0aSgarbled * BAT for certain machines that have rs6k style PCI bridges 144d974db0aSgarbled * (only on port-prep) 145d974db0aSgarbled */ 146d974db0aSgarbled oea_batinit( 147d974db0aSgarbled PREP_BUS_SPACE_MEM, BAT_BL_256M, 148d974db0aSgarbled PREP_BUS_SPACE_IO, BAT_BL_256M, 14974e97967Skiyohara #if defined(bebox) 150726fda23Skiyohara 0x7ffff000, BAT_BL_8M, /* BeBox Mainboard Registers (4KB) */ 15174e97967Skiyohara #elif defined(prep) 152d974db0aSgarbled 0xbf800000, BAT_BL_8M, 153d974db0aSgarbled #endif 154d974db0aSgarbled 0); 155d974db0aSgarbled 156d974db0aSgarbled /* Install vectors and interrupt handler. */ 157d974db0aSgarbled oea_init(NULL); 158d974db0aSgarbled 159d974db0aSgarbled /* Initialize bus_space. */ 160d974db0aSgarbled prep_bus_space_init(); 161d974db0aSgarbled 162d974db0aSgarbled /* Initialize the console asap. */ 163d974db0aSgarbled consinit(); 164d974db0aSgarbled 165d974db0aSgarbled /* Set the page size */ 166*0dec4042Scherry uvm_md_init(); 167d974db0aSgarbled 168d974db0aSgarbled /* Initialize pmap module */ 169d974db0aSgarbled pmap_bootstrap(startkernel, endkernel); 170d974db0aSgarbled 1710efea177Sad #if NKSYMS || defined(DDB) || defined(MODULAR) 172719a906eSmartin ksyms_addsyms_elf((int)((u_long)endsym - (u_long)startsym), startsym, endsym); 173d974db0aSgarbled #endif 174d974db0aSgarbled 175d974db0aSgarbled #ifdef DDB 176d974db0aSgarbled boothowto = args; 177d974db0aSgarbled if (boothowto & RB_KDB) 178d974db0aSgarbled Debugger(); 179d974db0aSgarbled #endif 180d974db0aSgarbled } 181d974db0aSgarbled 182d974db0aSgarbled void 183d974db0aSgarbled mem_regions(struct mem_region **mem, struct mem_region **avail) 184d974db0aSgarbled { 185d974db0aSgarbled 186d974db0aSgarbled *mem = physmemr; 187d974db0aSgarbled *avail = availmemr; 188d974db0aSgarbled } 189