boot.c revision 1.1
11.1Sjmcneill/* $NetBSD: boot.c,v 1.1 2025/11/16 20:11:47 jmcneill Exp $ */ 21.1Sjmcneill 31.1Sjmcneill/*- 41.1Sjmcneill * Copyright (c) 2025 Jared McNeill <jmcneill@invisible.ca> 51.1Sjmcneill * All rights reserved. 61.1Sjmcneill * 71.1Sjmcneill * Redistribution and use in source and binary forms, with or without 81.1Sjmcneill * modification, are permitted provided that the following conditions 91.1Sjmcneill * are met: 101.1Sjmcneill * 1. Redistributions of source code must retain the above copyright 111.1Sjmcneill * notice, this list of conditions and the following disclaimer. 121.1Sjmcneill * 2. Redistributions in binary form must reproduce the above copyright 131.1Sjmcneill * notice, this list of conditions and the following disclaimer in the 141.1Sjmcneill * documentation and/or other materials provided with the distribution. 151.1Sjmcneill * 161.1Sjmcneill * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 171.1Sjmcneill * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 181.1Sjmcneill * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 191.1Sjmcneill * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 201.1Sjmcneill * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 211.1Sjmcneill * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 221.1Sjmcneill * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 231.1Sjmcneill * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 241.1Sjmcneill * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 251.1Sjmcneill * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 261.1Sjmcneill * SUCH DAMAGE. 271.1Sjmcneill */ 281.1Sjmcneill 291.1Sjmcneill#include <lib/libsa/stand.h> 301.1Sjmcneill#include <lib/libsa/loadfile.h> 311.1Sjmcneill 321.1Sjmcneill#include <powerpc/include/psl.h> 331.1Sjmcneill#include <powerpc/include/spr.h> 341.1Sjmcneill 351.1Sjmcneill#include "cache.h" 361.1Sjmcneill#include "console.h" 371.1Sjmcneill#include "gpio.h" 381.1Sjmcneill#include "miniipc.h" 391.1Sjmcneill#include "sdmmc.h" 401.1Sjmcneill#include "timer.h" 411.1Sjmcneill 421.1Sjmcneillstatic const char * const names[] = { 431.1Sjmcneill "netbsd", "netbsd.gz", 441.1Sjmcneill "onetbsd", "onetbsd.gz", 451.1Sjmcneill "netbsd.old", "onetbsd.old.gz", 461.1Sjmcneill}; 471.1Sjmcneill#define NUMNAMES __arraycount(names) 481.1Sjmcneill 491.1Sjmcneillstatic int exec_netbsd(const char *); 501.1Sjmcneill 511.1Sjmcneillint 521.1Sjmcneillmain(void) 531.1Sjmcneill{ 541.1Sjmcneill extern uint8_t edata[], end[]; 551.1Sjmcneill int curname; 561.1Sjmcneill 571.1Sjmcneill memset(&edata, 0, end - edata); /* clear BSS */ 581.1Sjmcneill 591.1Sjmcneill console_init(); 601.1Sjmcneill 611.1Sjmcneill gpio_set(GPIO_SLOT_LED); 621.1Sjmcneill 631.1Sjmcneill if (!miniipc_probe()) { 641.1Sjmcneill panic("MINI IPC not found!"); 651.1Sjmcneill } 661.1Sjmcneill 671.1Sjmcneill sdmmc_init(); 681.1Sjmcneill 691.1Sjmcneill for (curname = 0; curname < NUMNAMES; curname++) { 701.1Sjmcneill printf("booting %s ", names[curname]); 711.1Sjmcneill exec_netbsd(names[curname]); 721.1Sjmcneill } 731.1Sjmcneill 741.1Sjmcneill panic("No bootable kernel found"); 751.1Sjmcneill 761.1Sjmcneill return 0; 771.1Sjmcneill} 781.1Sjmcneill 791.1Sjmcneillstatic int 801.1Sjmcneillexec_netbsd(const char *fname) 811.1Sjmcneill{ 821.1Sjmcneill u_long marks[MARK_MAX]; 831.1Sjmcneill void (*entry)(void); 841.1Sjmcneill int fd; 851.1Sjmcneill 861.1Sjmcneill memset(marks, 0, sizeof(marks)); 871.1Sjmcneill fd = loadfile(fname, marks, LOAD_KERNEL); 881.1Sjmcneill if (fd == -1) { 891.1Sjmcneill return -1; 901.1Sjmcneill } 911.1Sjmcneill 921.1Sjmcneill gpio_clear(GPIO_SLOT_LED); 931.1Sjmcneill 941.1Sjmcneill entry = (void *)marks[MARK_ENTRY]; 951.1Sjmcneill cache_dcbf((void *)marks[MARK_START], 961.1Sjmcneill marks[MARK_END] - marks[MARK_START]); 971.1Sjmcneill cache_icbi((void *)marks[MARK_START], 981.1Sjmcneill marks[MARK_END] - marks[MARK_START]); 991.1Sjmcneill 1001.1Sjmcneill entry(); 1011.1Sjmcneill panic("Unexpected return from kernel"); 1021.1Sjmcneill} 1031.1Sjmcneill 1041.1Sjmcneill__dead void 1051.1Sjmcneill_rtt(void) 1061.1Sjmcneill{ 1071.1Sjmcneill int led = 0; 1081.1Sjmcneill for (;;) { 1091.1Sjmcneill if (led) { 1101.1Sjmcneill gpio_set(GPIO_SLOT_LED); 1111.1Sjmcneill } else { 1121.1Sjmcneill gpio_clear(GPIO_SLOT_LED); 1131.1Sjmcneill } 1141.1Sjmcneill timer_udelay(1000000); 1151.1Sjmcneill led ^= 1; 1161.1Sjmcneill } 1171.1Sjmcneill} 118