Home | History | Annotate | Line # | Download | only in emips
      1 /*	$NetBSD: promcall.c,v 1.3 2011/06/12 13:40:14 tsutsui Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1988 University of Utah.
      5  * Copyright (c) 1992, 1993
      6  *	The Regents of the University of California.  All rights reserved.
      7  *
      8  * This code is derived from software contributed to Berkeley by
      9  * the Systems Programming Group of the University of Utah Computer
     10  * Science Department and Ralph Campbell.
     11  *
     12  * Redistribution and use in source and binary forms, with or without
     13  * modification, are permitted provided that the following conditions
     14  * are met:
     15  * 1. Redistributions of source code must retain the above copyright
     16  *    notice, this list of conditions and the following disclaimer.
     17  * 2. Redistributions in binary form must reproduce the above copyright
     18  *    notice, this list of conditions and the following disclaimer in the
     19  *    documentation and/or other materials provided with the distribution.
     20  * 3. Neither the name of the University nor the names of its contributors
     21  *    may be used to endorse or promote products derived from this software
     22  *    without specific prior written permission.
     23  *
     24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     34  * SUCH DAMAGE.
     35  *
     36  * from: Utah Hdr: cons.c 1.1 90/07/09
     37  *
     38  *	@(#)cons.c	8.2 (Berkeley) 1/11/94
     39  */
     40 
     41 #include <sys/cdefs.h>
     42 __KERNEL_RCSID(0, "$NetBSD: promcall.c,v 1.3 2011/06/12 13:40:14 tsutsui Exp $");
     43 
     44 #include <sys/param.h>
     45 #include <sys/device.h>
     46 #include <sys/reboot.h>
     47 #include <sys/systm.h>
     48 
     49 #include <dev/cons.h>
     50 
     51 #include <mips/cpuregs.h>
     52 #include <emips/stand/common/prom_iface.h>
     53 #include <emips/emips/machdep.h>
     54 
     55 static int  romgetc(dev_t);
     56 static void romputc(dev_t, int);
     57 static void *nope(void);
     58 static int  nogetchar(void);
     59 static void noprintf(const char *, ...);
     60 static int  nogetsysid(void);
     61 static void nohalt(int *, int);
     62 
     63 /*
     64  * Callback vector. We keep this fall-back copy jic the bootloader is broken.
     65  */
     66 static void *nope(void)
     67 {
     68 
     69 	return NULL;
     70 }
     71 
     72 static int  nogetchar(void)
     73 {
     74 
     75 	return -1;
     76 }
     77 
     78 static void noprintf(const char *fmt, ...)
     79 {
     80 }
     81 
     82 static int  nogetsysid(void)
     83 {
     84 
     85 	/* say its an eMIPS, ML board */
     86 	return MAKESYSID(1, 1, XS_ML40x, MIPS_eMIPS);
     87 }
     88 
     89 static void nohalt(int *unused, int howto)
     90 {
     91 
     92 	while (1);	/* fool gcc */
     93 	/*NOTREACHED*/
     94 }
     95 
     96 const struct callback callvec = {
     97 	nope,
     98 	nope,
     99 	nope,
    100 	nope,
    101 	nope,
    102 	nope,
    103 	nope,
    104 	nope,
    105 	nope,
    106 	nogetchar,
    107 	nope,
    108 	nope,
    109 	noprintf,
    110 	nope,
    111 	nope,
    112 	nope,
    113 	nope,
    114 	nope,
    115 	nope,
    116 	nope,
    117 	nope,
    118 	nope,
    119 	nope,
    120 	nope,
    121 	nope,
    122 	nope,
    123 	nope,
    124 	nope,
    125 	nope,
    126 	nope,
    127 	nope,
    128 	nope,
    129 	nogetsysid,
    130 	nope,
    131 	nope,
    132 	nope,
    133 	nope,
    134 	nope,
    135 	nope,
    136 	nohalt
    137 };
    138 
    139 const   struct callback *callv = &callvec;
    140 
    141 /*
    142  * Default consdev, for errors or warnings before
    143  * consinit runs: use the PROM.
    144  */
    145 struct consdev promcd = {
    146 	NULL,		/* probe */
    147 	NULL,		/* init */
    148 	romgetc,	/* getc */
    149 	romputc,	/* putc */
    150 	nullcnpollc,	/* pollc */
    151 	NULL,		/* bell */
    152 	makedev(0, 0),
    153 	CN_DEAD,
    154 };
    155 
    156 /*
    157  * Get character from PROM console.
    158  */
    159 static int
    160 romgetc(dev_t dev)
    161 {
    162 	int chr, s;
    163 
    164 	s  = splhigh();
    165 	chr = (*callv->_getchar)();
    166 	splx(s);
    167 	return chr;
    168 }
    169 
    170 /*
    171  * Print a character on PROM console.
    172  */
    173 static void
    174 romputc(dev_t dev, int c)
    175 {
    176 	int s;
    177 
    178 	s = splhigh();
    179 	(*callv->_printf)("%c", c);
    180 	splx(s);
    181 }
    182 
    183 /*
    184  * Get 32bit system type:
    185  *	cputype,		u_int8_t [3]
    186  *	systype,		u_int8_t [2]
    187  *	firmware revision,	u_int8_t [1]
    188  *	hardware revision.	u_int8_t [0]
    189  */
    190 int
    191 prom_systype(void)
    192 {
    193 
    194 	return (*callv->_getsysid)();
    195 }
    196 
    197 /*
    198  * Halt/reboot machine.
    199  */
    200 void __attribute__((__noreturn__))
    201 prom_halt(int howto)
    202 {
    203 
    204 	(*callv->_halt)((int *)0, howto);
    205 	while(1) ;	/* fool gcc */
    206 	/*NOTREACHED*/
    207 }
    208