1 1.6 dsl /* $NetBSD: vr41xx.c,v 1.6 2009/03/14 14:46:00 dsl Exp $ */ 2 1.3 takemura 3 1.3 takemura /*- 4 1.3 takemura * Copyright (c) 1999 Shin Takemura. 5 1.3 takemura * All rights reserved. 6 1.3 takemura * 7 1.3 takemura * This software is part of the PocketBSD. 8 1.3 takemura * 9 1.3 takemura * Redistribution and use in source and binary forms, with or without 10 1.3 takemura * modification, are permitted provided that the following conditions 11 1.3 takemura * are met: 12 1.3 takemura * 1. Redistributions of source code must retain the above copyright 13 1.3 takemura * notice, this list of conditions and the following disclaimer. 14 1.3 takemura * 2. Redistributions in binary form must reproduce the above copyright 15 1.3 takemura * notice, this list of conditions and the following disclaimer in the 16 1.3 takemura * documentation and/or other materials provided with the distribution. 17 1.3 takemura * 3. All advertising materials mentioning features or use of this software 18 1.3 takemura * must display the following acknowledgement: 19 1.3 takemura * This product includes software developed by the PocketBSD project 20 1.3 takemura * and its contributors. 21 1.3 takemura * 4. Neither the name of the project nor the names of its contributors 22 1.3 takemura * may be used to endorse or promote products derived from this software 23 1.3 takemura * without specific prior written permission. 24 1.3 takemura * 25 1.3 takemura * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26 1.3 takemura * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 1.3 takemura * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 1.3 takemura * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29 1.3 takemura * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30 1.3 takemura * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 1.3 takemura * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 1.3 takemura * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 1.3 takemura * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 1.3 takemura * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 1.3 takemura * SUCH DAMAGE. 36 1.3 takemura * 37 1.3 takemura */ 38 1.3 takemura #include <pbsdboot.h> 39 1.3 takemura 40 1.3 takemura extern void vr41xx_asm_code(); 41 1.3 takemura extern void vr41xx_asm_code_end(); 42 1.6 dsl void vr41xx_asm_code_holder(void); 43 1.3 takemura 44 1.3 takemura void 45 1.3 takemura vr41xx_init(SYSTEM_INFO *info) 46 1.3 takemura { 47 1.3 takemura /* 1KByte page */ 48 1.3 takemura system_info.si_pagesize = info->dwPageSize; 49 1.3 takemura /* DRAM Bank 0/1 physical addr range */ 50 1.3 takemura system_info.si_dramstart = 0x80000000; 51 1.3 takemura system_info.si_drammaxsize = 0x08000000; 52 1.3 takemura /* Pointer for bootstrap code */ 53 1.3 takemura system_info.si_asmcode = (unsigned char*)vr41xx_asm_code; 54 1.3 takemura system_info.si_asmcodelen = (unsigned char*)vr41xx_asm_code_end 55 1.3 takemura - system_info.si_asmcode; 56 1.3 takemura system_info.si_boot = mips_boot; 57 1.3 takemura system_info.si_intrvec = 0; 58 1.3 takemura } 59 1.3 takemura 60 1.3 takemura void 61 1.3 takemura vr41xx_asm_code_holder() 62 1.3 takemura { 63 1.3 takemura /* 64 1.3 takemura * void 65 1.3 takemura * startprog(register struct map_s *map) 66 1.3 takemura * { 67 1.3 takemura * register unsigned char *addr; 68 1.3 takemura * register unsigned char *p; 69 1.3 takemura * register int i; 70 1.3 takemura * 71 1.3 takemura * addr = map->base; 72 1.3 takemura * i = 0; 73 1.3 takemura * while (p = map->leaf[i / map->leafsize][i % map->leafsize]) { 74 1.3 takemura * register unsigned char *pe = p + map->pagesize; 75 1.3 takemura * while (p < pe) { 76 1.3 takemura * *addr++ = *p++; 77 1.3 takemura * } 78 1.3 takemura * i++; 79 1.3 takemura * } 80 1.3 takemura * } 81 1.3 takemura * 82 1.3 takemura * register assignment: 83 1.3 takemura * struct map_s *map a0 84 1.3 takemura * unsigned char *addr a1 85 1.3 takemura * unsigned char *p a2 86 1.3 takemura * unsigned char *pe a3 87 1.3 takemura * int i t0 88 1.3 takemura * 89 1.3 takemura * struct map_s { 90 1.5 christos * void *entry; +0 91 1.5 christos * void *base; +4 92 1.3 takemura * int pagesize; +8 93 1.3 takemura * int leafsize; +12 94 1.3 takemura * int nleaves; +16 95 1.5 christos * void *arg0; +20 96 1.3 takemura 97 1.5 christos * void *arg1; +24 98 1.3 takemura 99 1.5 christos * void *arg2; +28 100 1.3 takemura 101 1.5 christos * void *arg3; +32 102 1.3 takemura 103 1.5 christos * void **leaf[32]; +36 104 1.3 takemura * 105 1.3 takemura */ 106 1.3 takemura __asm( 107 1.3 takemura " .set noreorder; " 108 1.3 takemura " .globl vr41xx_asm_code;" 109 1.3 takemura "vr41xx_asm_code:" 110 1.3 takemura " lui a0, 0x0000; " 111 1.3 takemura " ori a0, 0x0000; " 112 1.3 takemura 113 1.3 takemura /* addr = map->base; */ 114 1.3 takemura "lw a1, 4(a0);" 115 1.3 takemura 116 1.3 takemura /* i = 0; */ 117 1.3 takemura "ori t0, zero, 0;" 118 1.3 takemura 119 1.3 takemura " loop_start:" 120 1.3 takemura 121 1.3 takemura /* while (p = map->leaf[i / map->leafsize][i % map->leafsize]) { */ 122 1.3 takemura /* t1 = map->leafsize */ 123 1.3 takemura "lw t1, 12(a0);" 124 1.3 takemura 125 1.3 takemura /* lo = i / map->leafsize, hi = i % map->leafsize */ 126 1.3 takemura "addu t3, zero, t0;" 127 1.3 takemura "div t3, t1;" 128 1.3 takemura /* t2 = map->leaf */ 129 1.3 takemura "addiu t2, a0, 36;" 130 1.3 takemura /* t3 = i / map->leafsize */ 131 1.3 takemura "nop;" 132 1.3 takemura "mflo t3;" 133 1.3 takemura /* t2 = map->leaf[i / map->leafsize] */ 134 1.3 takemura "sll t3, t3, 2;" 135 1.3 takemura "addu t2, t2, t3;" 136 1.3 takemura "lw t2, 0(t2);" 137 1.3 takemura /* t3 = i % map->leafsize */ 138 1.3 takemura "mfhi t3;" 139 1.3 takemura 140 1.3 takemura /* p = map->leaf[i / map->leafsize][i % map->leafsize] */ 141 1.3 takemura "sll t3, t3, 2;" 142 1.3 takemura "addu t2, t2, t3;" 143 1.3 takemura "lw a2, 0(t2);" 144 1.3 takemura 145 1.3 takemura /* if (p == NULL) { */ 146 1.3 takemura /* break; */ 147 1.3 takemura /* } */ 148 1.3 takemura "beq a2, zero, loop_end;" 149 1.3 takemura "nop;" 150 1.3 takemura 151 1.3 takemura /* register unsigned char *pe = p + map->pagesize; */ 152 1.3 takemura "lw t1, 8(a0);" 153 1.3 takemura "add a3, a2, t1;" 154 1.3 takemura 155 1.3 takemura /* while (p < pe) { */ 156 1.3 takemura "loop_start2:" 157 1.3 takemura "sltu t1, a2, a3;" 158 1.3 takemura "beq zero,t1,loop_end2;" 159 1.3 takemura "nop;" 160 1.3 takemura 161 1.3 takemura /* *addr++ = *p++; */ 162 1.3 takemura "lw t1, 0(a2);" 163 1.3 takemura "sw t1, 0(a1);" 164 1.3 takemura "addi a2, a2, 4;" 165 1.3 takemura "addi a1, a1, 4;" 166 1.3 takemura 167 1.3 takemura /* } */ 168 1.3 takemura "beq zero, zero, loop_start2;" 169 1.3 takemura "nop;" 170 1.3 takemura 171 1.3 takemura /* i++; */ 172 1.3 takemura "loop_end2:" 173 1.3 takemura "addi t0, t0, 1;" 174 1.3 takemura "beq zero, zero, loop_start;" 175 1.3 takemura "nop;" 176 1.3 takemura 177 1.3 takemura " loop_end:" 178 1.3 takemura ); 179 1.3 takemura 180 1.3 takemura /* 181 1.3 takemura * flush instruction cache 182 1.3 takemura */ 183 1.3 takemura __asm( 184 1.3 takemura " li t0, 0x80000000;" 185 1.3 takemura " addu t1, t0, 1024*128;" 186 1.3 takemura " subu t1, t1, 128;" 187 1.3 takemura "1:" 188 1.3 takemura " cache 0, 0(t0);" 189 1.3 takemura " cache 0, 16(t0);" 190 1.3 takemura " cache 0, 32(t0);" 191 1.3 takemura " cache 0, 48(t0);" 192 1.3 takemura " cache 0, 64(t0);" 193 1.3 takemura " cache 0, 80(t0);" 194 1.3 takemura " cache 0, 96(t0);" 195 1.3 takemura " cache 0, 112(t0);" 196 1.3 takemura " bne t0, t1, 1b;" 197 1.3 takemura " addu t0, t0, 128;" 198 1.3 takemura ); 199 1.3 takemura 200 1.3 takemura /* 201 1.3 takemura * flush data cache 202 1.3 takemura */ 203 1.3 takemura __asm( 204 1.3 takemura " li t0, 0x80000000;" 205 1.3 takemura " addu t1, t0, 1024*128;" 206 1.3 takemura " subu t1, t1, 128;" 207 1.3 takemura "1:" 208 1.3 takemura " cache 1, 0(t0);" 209 1.3 takemura " cache 1, 16(t0);" 210 1.3 takemura " cache 1, 32(t0);" 211 1.3 takemura " cache 1, 48(t0);" 212 1.3 takemura " cache 1, 64(t0);" 213 1.3 takemura " cache 1, 80(t0);" 214 1.3 takemura " cache 1, 96(t0);" 215 1.3 takemura " cache 1, 112(t0);" 216 1.3 takemura " bne t0, t1, 1b;" 217 1.3 takemura " addu t0, t0, 128;" 218 1.3 takemura ); 219 1.3 takemura 220 1.3 takemura __asm( 221 1.3 takemura " lw t0, 0(a0);" /* entry addr */ 222 1.3 takemura " lw a1, 24(a0);" /* arg1 */ 223 1.3 takemura " lw a2, 28(a0);" /* arg2 */ 224 1.3 takemura " lw a3, 32(a0);" /* arg3 */ 225 1.3 takemura " lw a0, 20(a0);" /* arg0 */ 226 1.3 takemura " jr t0;" 227 1.3 takemura " nop;" 228 1.3 takemura 229 1.3 takemura " .globl vr41xx_asm_code_end;" 230 1.3 takemura "vr41xx_asm_code_end: nop;" 231 1.3 takemura " .set reorder; " 232 1.3 takemura ); 233 1.3 takemura } 234