1/* ********************************************************************* 2 * Broadcom Common Firmware Environment (CFE) 3 * 4 * Physical Memory (arena) manager File: sb1250_arena.c 5 * 6 * This module describes the physical memory available to the 7 * firmware. 8 * 9 * Author: Mitch Lichtenberg (mpl@broadcom.com) 10 * 11 ********************************************************************* 12 * 13 * Copyright 2000,2001,2002,2003 14 * Broadcom Corporation. All rights reserved. 15 * 16 * This software is furnished under license and may be used and 17 * copied only in accordance with the following terms and 18 * conditions. Subject to these conditions, you may download, 19 * copy, install, use, modify and distribute modified or unmodified 20 * copies of this software in source and/or binary form. No title 21 * or ownership is transferred hereby. 22 * 23 * 1) Any source code used, modified or distributed must reproduce 24 * and retain this copyright notice and list of conditions 25 * as they appear in the source file. 26 * 27 * 2) No right is granted to use any trade name, trademark, or 28 * logo of Broadcom Corporation. The "Broadcom Corporation" 29 * name may not be used to endorse or promote products derived 30 * from this software without the prior written permission of 31 * Broadcom Corporation. 32 * 33 * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR 34 * IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED 35 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 36 * PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT 37 * SHALL BROADCOM BE LIABLE FOR ANY DAMAGES WHATSOEVER, AND IN 38 * PARTICULAR, BROADCOM SHALL NOT BE LIABLE FOR DIRECT, INDIRECT, 39 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 40 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 41 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 42 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 43 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 44 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF 45 * THE POSSIBILITY OF SUCH DAMAGE. 46 ********************************************************************* */ 47 48#include "lib_types.h" 49#include "lib_string.h" 50#include "lib_queue.h" 51#include "lib_malloc.h" 52#include "lib_printf.h" 53#include "lib_arena.h" 54 55#include "cfe_error.h" 56 57#include "cfe.h" 58#include "cfe_mem.h" 59 60#include "initdata.h" 61 62#define _NOPROTOS_ 63#include "cfe_boot.h" 64#undef _NOPROTOS_ 65 66#include "cpu_config.h" 67 68#include "addrspace.h" 69 70/* ********************************************************************* 71 * Constants 72 ********************************************************************* */ 73 74 75#define MEG (1024*1024) 76#define KB 1024 77#define PAGESIZE 4096 78#define CFE_BOOTAREA_SIZE (256*KB) 79#define CFE_BOOTAREA_ADDR 0x20000000 80 81 82/* ********************************************************************* 83 * Globals 84 ********************************************************************* */ 85 86extern arena_t cfe_arena; 87uint64_t *cfe_pagetable = NULL; 88 89extern void CPUCFG_PAGETBLINIT(uint64_t *ptaddr,unsigned int ptstart); 90 91void cfe_bootarea_init(void); 92extern void _setcontext(int64_t); 93 94 95/* ********************************************************************* 96 * CFE_BOOTAREA_INIT() 97 * 98 * Initialize the page table and map our boot program area. 99 * 100 * Input parameters: 101 * nothing 102 * 103 * Return value: 104 * nothing 105 ********************************************************************* */ 106 107void cfe_bootarea_init(void) 108{ 109 unsigned char *pte; 110 int64_t pte_int; 111 unsigned int addr = 16*MEG; 112 unsigned int topmem; 113 unsigned int topcfe; 114 unsigned int botcfe; 115 unsigned int beforecfe; 116 unsigned int aftercfe; 117 118 /* 119 * Calculate the location where the boot area will 120 * live. It lives either above or below the 121 * firmware, depending on where there's more space. 122 */ 123 124 /* 125 * The firmware will always be loaded in the first 126 * 256M. Calculate the top of that region. The bottom 127 * of that region is always the beginning of our 128 * data segment. 129 */ 130 if (mem_totalsize > (uint64_t)(256*1024)) { 131 topmem = 256*MEG; 132 } 133 else { 134 topmem = (unsigned int) (mem_totalsize << 10); 135 } 136 botcfe = (unsigned int) K1_TO_PHYS(mem_bottomofmem); 137 topcfe = (unsigned int) K1_TO_PHYS(mem_topofmem); 138 139 beforecfe = botcfe; 140 aftercfe = topmem-topcfe; 141 142 if (beforecfe > aftercfe) { 143 botcfe -= (PAGESIZE-1); 144 botcfe &= ~(PAGESIZE-1); /* round down to page boundary */ 145 addr = botcfe - CFE_BOOTAREA_SIZE; /* this is the address */ 146 } 147 else { 148 topcfe += (PAGESIZE-1); /* round *up* to a page address */ 149 topcfe &= ~(PAGESIZE-1); 150 addr = topcfe; 151 } 152 153 mem_bootarea_start = addr; 154 mem_bootarea_size = CFE_BOOTAREA_SIZE; 155 156 /* 157 * Allocate the page table 158 */ 159 160 pte = KMALLOC(1024,1024); 161 162#ifdef __long64 163 pte_int = (int64_t) pte; 164#else 165 pte_int = (int64_t) ((int) pte); 166#endif 167 168 /* 169 * Set the CP0 CONTEXT register to point at the page table 170 */ 171 172 pte_int <<= 13; 173 cfe_pagetable = (uint64_t *) pte; 174 175 _setcontext(pte_int); 176 177 178 /* 179 * Initialize page table entries 180 */ 181 182 CPUCFG_PAGETBLINIT(cfe_pagetable,addr); 183 184 185} 186 187