1*02cdf4d2Sdsl /* $NetBSD: prom.h,v 1.12 2009/03/14 14:46:02 dsl Exp $ */ 29ac68bcbSwdk 39ac68bcbSwdk /* 49ac68bcbSwdk * Copyright (c) 2000 The NetBSD Foundation, Inc. 59ac68bcbSwdk * All rights reserved. 69ac68bcbSwdk * 79ac68bcbSwdk * This code is derived from software contributed to The NetBSD Foundation 89ac68bcbSwdk * by Wayne Knowles 99ac68bcbSwdk * 109ac68bcbSwdk * Redistribution and use in source and binary forms, with or without 119ac68bcbSwdk * modification, are permitted provided that the following conditions 129ac68bcbSwdk * are met: 139ac68bcbSwdk * 1. Redistributions of source code must retain the above copyright 149ac68bcbSwdk * notice, this list of conditions and the following disclaimer. 159ac68bcbSwdk * 2. Redistributions in binary form must reproduce the above copyright 169ac68bcbSwdk * notice, this list of conditions and the following disclaimer in the 179ac68bcbSwdk * documentation and/or other materials provided with the distribution. 189ac68bcbSwdk * 199ac68bcbSwdk * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 209ac68bcbSwdk * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 219ac68bcbSwdk * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 229ac68bcbSwdk * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 239ac68bcbSwdk * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 249ac68bcbSwdk * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 259ac68bcbSwdk * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 269ac68bcbSwdk * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 279ac68bcbSwdk * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 289ac68bcbSwdk * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 299ac68bcbSwdk * POSSIBILITY OF SUCH DAMAGE. 309ac68bcbSwdk */ 319ac68bcbSwdk 329ac68bcbSwdk /* 339ac68bcbSwdk * Entry points into PROM firmware functions for MIPS machines 349ac68bcbSwdk */ 359ac68bcbSwdk 367980486eSwdk #ifndef _MIPSCO_PROM_H 377980486eSwdk #define _MIPSCO_PROM_H 387980486eSwdk 397980486eSwdk #ifndef _LOCORE 407980486eSwdk #include <sys/types.h> 417980486eSwdk #include <sys/cdefs.h> 429ac68bcbSwdk 439ac68bcbSwdk struct mips_prom { 449ac68bcbSwdk 459ac68bcbSwdk /* 469ac68bcbSwdk * transferred to on hardware reset, configures MIPS boards, 479ac68bcbSwdk * runs diags, check for appropriate auto boot action in 489ac68bcbSwdk * "bootmode" environment variable and performs that action. 499ac68bcbSwdk */ 50*02cdf4d2Sdsl void (*prom_reset)(void) __attribute__((__noreturn__)); 519ac68bcbSwdk 529ac68bcbSwdk /* 531f4ad37fSperry * called to use prom to boot new image. After the booted 549ac68bcbSwdk * program returns control can either be returned to the 559ac68bcbSwdk * original caller of the exec routine or to the prom monitor. 569ac68bcbSwdk * (to return to the original caller, the new program must 579ac68bcbSwdk * not destroy any text, data, or stack of the parent. the 589ac68bcbSwdk * new programs stack continues on the parents stack. 599ac68bcbSwdk */ 60*02cdf4d2Sdsl int (*prom_exec)(void); 619ac68bcbSwdk 629ac68bcbSwdk /* re-enter the prom command parser, do not reset prom state */ 63*02cdf4d2Sdsl void (*prom_restart)(void) __attribute__((__noreturn__)); 649ac68bcbSwdk 659ac68bcbSwdk /* reinitialize prom state and re-enter the prom command parser */ 66*02cdf4d2Sdsl void (*prom_reinit)(void) __attribute__((__noreturn__)); 679ac68bcbSwdk 689ac68bcbSwdk /* reboot machine using current bootmode setting. No diags */ 69*02cdf4d2Sdsl void (*prom_reboot)(void) __attribute__((__noreturn__)); 709ac68bcbSwdk 719ac68bcbSwdk /* perform an autoboot sequence, no configuration or diags run */ 72*02cdf4d2Sdsl void (*prom_autoboot)(void) __attribute__((__noreturn__)); 739ac68bcbSwdk 749ac68bcbSwdk /* 759ac68bcbSwdk * these routines access prom "saio" routines, and may be used 769ac68bcbSwdk * by standalone programs that would like to use prom io 779ac68bcbSwdk */ 78*02cdf4d2Sdsl int (*prom_open)(char *, int, ...); 79*02cdf4d2Sdsl int (*prom_read)(int, void *, int); 80*02cdf4d2Sdsl int (*prom_write)(int, void *, int); 81*02cdf4d2Sdsl int (*prom_ioctl)(int, long, ...); 82*02cdf4d2Sdsl int (*prom_close)(int); 83*02cdf4d2Sdsl int (*prom_getchar)(void); 84*02cdf4d2Sdsl int (*prom_putchar)(int c); 85*02cdf4d2Sdsl void (*prom_showchar)(int c); 86*02cdf4d2Sdsl char * (*prom_gets)(char *s); 87*02cdf4d2Sdsl void (*prom_puts)(const char *); 88*02cdf4d2Sdsl int (*prom_printf)(const char *, ...); 899ac68bcbSwdk 909ac68bcbSwdk /* prom protocol entry points */ 91*02cdf4d2Sdsl void (*prom_initproto)(void); /* ??? */ 92*02cdf4d2Sdsl void (*prom_protoenable)(void); /* ??? */ 93*02cdf4d2Sdsl void (*prom_protodisable)(void); /* ??? */ 94*02cdf4d2Sdsl void (*prom_getpkt)(void); /* ??? */ 95*02cdf4d2Sdsl void (*prom_putpkt)(void); /* ??? */ 969ac68bcbSwdk 979ac68bcbSwdk /* 98d20841bbSwiz * read-modify-write routine use special CPU board circuitry to 999ac68bcbSwdk * accomplish vme bus r-m-w cycles. 1009ac68bcbSwdk */ 101*02cdf4d2Sdsl void (*prom_orw_rmw)(void); 102*02cdf4d2Sdsl void (*prom_orh_rmw)(void); 103*02cdf4d2Sdsl void (*prom_orb_rmw)(void); 104*02cdf4d2Sdsl void (*prom_andw_rmw)(void); 105*02cdf4d2Sdsl void (*prom_andh_rmw)(void); 106*02cdf4d2Sdsl void (*prom_andb_rmw)(void); 1079ac68bcbSwdk 1089ac68bcbSwdk /* 1099ac68bcbSwdk * cache control entry points 1109ac68bcbSwdk * flushcache is called without arguments and invalidates entire 1119ac68bcbSwdk * contents of both i and d caches 1129ac68bcbSwdk * clearcache is called with a base address and length (where 1139ac68bcbSwdk * address is either K0, K1, or physical) and clears both 1149ac68bcbSwdk * i and d cache for entries that alias to specified address 1159ac68bcbSwdk * range. 1169ac68bcbSwdk */ 117*02cdf4d2Sdsl void (*prom_flushcache)(void); 118*02cdf4d2Sdsl void (*prom_clearcache)(void *, size_t); 1199ac68bcbSwdk 1209ac68bcbSwdk /* 1219ac68bcbSwdk * Libc compatible functions 1229ac68bcbSwdk */ 123*02cdf4d2Sdsl void (*prom_setjmp)(void); 124*02cdf4d2Sdsl void (*prom_longjmp)(void); 125*02cdf4d2Sdsl void (*prom_bevutlb)(void); 126*02cdf4d2Sdsl char * (*prom_getenv)(const char *name); 127*02cdf4d2Sdsl int (*prom_setenv)(char *name, char *val); 128*02cdf4d2Sdsl int (*prom_atob)(char *s); 129*02cdf4d2Sdsl int (*prom_strcmp)(char *s1, char *s2); 130*02cdf4d2Sdsl int (*prom_strlen)(char *s); 131*02cdf4d2Sdsl char * (*prom_strcpy)(char *s1, char *s2); 132*02cdf4d2Sdsl char * (*prom_strcat)(char *s1, char *s2); 1339ac68bcbSwdk 1349ac68bcbSwdk /* 1359ac68bcbSwdk * command parser entry points 1369ac68bcbSwdk */ 137*02cdf4d2Sdsl void (*prom_parser)(void); /* ??? */ 138*02cdf4d2Sdsl void (*prom_range)(void); /* ??? */ 139*02cdf4d2Sdsl void (*prom_argvize)(void); /* ??? */ 140*02cdf4d2Sdsl void (*prom_help)(void); 1419ac68bcbSwdk 1429ac68bcbSwdk /* 1439ac68bcbSwdk * prom commands 1449ac68bcbSwdk */ 145*02cdf4d2Sdsl void (*prom_dumpcmd)(void); 146*02cdf4d2Sdsl void (*prom_setenvcmd)(void); 147*02cdf4d2Sdsl void (*prom_unsetenvcmd)(void); 148*02cdf4d2Sdsl void (*prom_bevexcept)(void); 149*02cdf4d2Sdsl void (*prom_enablecmd)(void); 150*02cdf4d2Sdsl void (*prom_disablecmd)(void); 1519ac68bcbSwdk 1529ac68bcbSwdk /* 1539ac68bcbSwdk * clear existing fault handlers 1549ac68bcbSwdk * used by clients that link to prom on situations where client has 1559ac68bcbSwdk * interrupted out of prom code and wish to reenter without being 1569ac68bcbSwdk * tripped up by any pending prom timers set earlier. 1579ac68bcbSwdk */ 158*02cdf4d2Sdsl void (*prom_clearnofault)(void); 1599ac68bcbSwdk 160*02cdf4d2Sdsl void (*prom_notimpl)(void); 1619ac68bcbSwdk 1629ac68bcbSwdk /* 1639ac68bcbSwdk * PROM_NVGET, PROM_NVSET will get/set information in the NVRAM. 1649ac68bcbSwdk * Both of these routines take indexes as opposed to addresses 1659ac68bcbSwdk * to guarantee portability between various platforms 1669ac68bcbSwdk */ 167*02cdf4d2Sdsl int (*prom_nvget)(int); 168*02cdf4d2Sdsl void (*prom_nvset)(void); 1699ac68bcbSwdk }; 1709ac68bcbSwdk 1719ac68bcbSwdk extern struct mips_prom *callv; 1729ac68bcbSwdk 173*02cdf4d2Sdsl extern void prom_init(void); 1747980486eSwdk 1757980486eSwdk #endif /* _LOCORE */ 1767980486eSwdk 1779ac68bcbSwdk /* 1789ac68bcbSwdk * Macro to help call a prom function 1799ac68bcbSwdk */ 1809ac68bcbSwdk #define MIPS_PROM(func) (callv->prom_##func) 1819ac68bcbSwdk 1829ac68bcbSwdk /* 1837980486eSwdk * Return the address for a given prom function number 1847980486eSwdk */ 1857980486eSwdk #define MIPS_PROM_ENTRY(x) (0xbfc00000+((x)*8)) 1869ac68bcbSwdk 1877980486eSwdk /* 1887980486eSwdk * MIPS PROM firmware functions: 1897980486eSwdk * 1907980486eSwdk * MIPS_PROM_RESET Run diags, check bootmode, reinit. 1917980486eSwdk * MIPS_PROM_EXEC Load new program image. 1927980486eSwdk * MIPS_PROM_RESTART Re-enter monitor command loop. 1937980486eSwdk * MIPS_PROM_REINIT Re-init monitor, then cmd loop. 1947980486eSwdk * MIPS_PROM_REBOOT Check bootmode, no config. 1957980486eSwdk * MIPS_PROM_AUTOBOOT Autoboot the system. 1967980486eSwdk * 1977980486eSwdk * The following routines access PROM saio routines and may be used by 1987980486eSwdk * standalone programs that would like to use PROM I/O: 1997980486eSwdk * 2007980486eSwdk * MIPS_PROM_OPEN Open a file. 2017980486eSwdk * MIPS_PROM_READ Read from a file. 2027980486eSwdk * MIPS_PROM_WRITE Write to a file. 2037980486eSwdk * MIPS_PROM_IOCTL Ioctl on a file. 2047980486eSwdk * MIPS_PROM_CLOSE Close a file. 2057980486eSwdk * MIPS_PROM_GETCHAR Read character from console. 2067980486eSwdk * MIPS_PROM_PUTCHAR Put character on console. 2077980486eSwdk * MIPS_PROM_SHOWCHAR Show a char visibly. 2087980486eSwdk * MIPS_PROM_GETS gets with editing. 2097980486eSwdk * MIPS_PROM_PUTS Put string to console. 2107980486eSwdk * MIPS_PROM_PRINTF Kernel style printf to console. 2117980486eSwdk * 2127980486eSwdk * PROM protocol entry points: 2137980486eSwdk * 2147980486eSwdk * MIPS_PROM_INITPROTO Initialize protocol. 2157980486eSwdk * MIPS_PROM_PROTOENABLE Enable protocol mode. 2167980486eSwdk * MIPS_PROM_PROTODISABLE Disable protocol mode. 2177980486eSwdk * MIPS_PROM_GETPKT Get protocol packet. 2187980486eSwdk * MIPS_PROM_PUTPKT Put protocol packet. 2197980486eSwdk * 2207980486eSwdk * Atomic Read-Modify-Write functions 2217980486eSwdk * 2227980486eSwdk * MIPS_PROM_RMW_OR32 r-m-w OR word. 2237980486eSwdk * MIPS_PROM_RMW_OR16 r-m-w OR halfword. 2247980486eSwdk * MIPS_PROM_RMW_OR8 r-m-w OR or byte. 2257980486eSwdk * MIPS_PROM_RMW_AND32 r-m-w AND word. 2267980486eSwdk * MIPS_PROM_RMW_AND16 r-m-w AND halfword. 2277980486eSwdk * MIPS_PROM_RMW_AND8 r-m-w AND byte. 2287980486eSwdk * 2297980486eSwdk * MIPS_PROM_FLUSHCACHE Flush entire cache (). 2307980486eSwdk * MIPS_PROM_CLEARCACHE Clear I & D cache in range (addr, len). 2317980486eSwdk * MIPS_PROM_SETJMP Save registers in a buffer. 2327980486eSwdk * MIPS_PROM_LONGJMP Get register back from buffer. 2337980486eSwdk * MIPS_PROM_BEVUTLB utlbmiss boot exception vector 2347980486eSwdk * MIPS_PROM_GETENV Gets a string from system environment. 2357980486eSwdk * MIPS_PROM_SETENV Sets a string in system environment. 2367980486eSwdk * MIPS_PROM_ATOB Converts ascii string to number. 2377980486eSwdk * MIPS_PROM_STRCMP Compares strings (strcmp). 2387980486eSwdk * MIPS_PROM_STRLEN Length of string (strlen). 2397980486eSwdk * MIPS_PROM_STRCPY Copies string (strcpy). 2407980486eSwdk * MIPS_PROM_STRCAT Appends string (strcat). 2417980486eSwdk * MIPS_PROM_PARSER Command parser. 2427980486eSwdk * MIPS_PROM_RANGE Address range parser 2437980486eSwdk * MIPS_PROM_ARGVIZE Parses string to argc,argv. 2447980486eSwdk * MIPS_PROM_HELP Help on prom commands. 2457980486eSwdk * MIPS_PROM_DUMP Dump memory command. 2467980486eSwdk * MIPS_PROM_SETENVCMD Setenv command. 2477980486eSwdk * MIPS_PROM_UNSETENVCMD Unsetenv command. 2487980486eSwdk * MIPS_PROM_PRINTENV Print environment command. 2497980486eSwdk * MIPS_PROM_BEVEXCEPT General boot exception vector 2507980486eSwdk * MIPS_PROM_ENABLE Performs prom enable command. 2517980486eSwdk * MIPS_PROM_DISABLE Performs prom disable command. 2527980486eSwdk * MIPS_PROM_CLEARNOFAULT Clear existing fault handlers. 2537980486eSwdk * MIPS_PROM_NOTIMPL Guaranteed to be not implemented 2547980486eSwdk * MIPS_PROM_NVGET Read bytes from NVRAM 2557980486eSwdk * MIPS_PROM_NVSET Write bytes to NVRAM 2567980486eSwdk */ 2577980486eSwdk 2587980486eSwdk #define MIPS_PROM_RESET MIPS_PROM_ENTRY(0) 2597980486eSwdk #define MIPS_PROM_EXEC MIPS_PROM_ENTRY(1) 2607980486eSwdk #define MIPS_PROM_RESTART MIPS_PROM_ENTRY(2) 2617980486eSwdk #define MIPS_PROM_REINIT MIPS_PROM_ENTRY(3) 2627980486eSwdk #define MIPS_PROM_REBOOT MIPS_PROM_ENTRY(4) 2637980486eSwdk #define MIPS_PROM_AUTOBOOT MIPS_PROM_ENTRY(5) 2647980486eSwdk #define MIPS_PROM_OPEN MIPS_PROM_ENTRY(6) 2657980486eSwdk #define MIPS_PROM_READ MIPS_PROM_ENTRY(7) 2667980486eSwdk #define MIPS_PROM_WRITE MIPS_PROM_ENTRY(8) 2677980486eSwdk #define MIPS_PROM_IOCTL MIPS_PROM_ENTRY(9) 2687980486eSwdk #define MIPS_PROM_CLOSE MIPS_PROM_ENTRY(10) 2697980486eSwdk #define MIPS_PROM_GETCHAR MIPS_PROM_ENTRY(11) 2707980486eSwdk #define MIPS_PROM_PUTCHAR MIPS_PROM_ENTRY(12) 2717980486eSwdk #define MIPS_PROM_SHOWCHAR MIPS_PROM_ENTRY(13) 2727980486eSwdk #define MIPS_PROM_GETS MIPS_PROM_ENTRY(14) 2737980486eSwdk #define MIPS_PROM_PUTS MIPS_PROM_ENTRY(15) 2747980486eSwdk #define MIPS_PROM_PRINTF MIPS_PROM_ENTRY(16) 2757980486eSwdk #define MIPS_PROM_INITPROTO MIPS_PROM_ENTRY(17) 2767980486eSwdk #define MIPS_PROM_PROTOENABLE MIPS_PROM_ENTRY(18) 2777980486eSwdk #define MIPS_PROM_PROTODISABLE MIPS_PROM_ENTRY(19) 2787980486eSwdk #define MIPS_PROM_GETPKT MIPS_PROM_ENTRY(20) 2797980486eSwdk #define MIPS_PROM_PUTPKT MIPS_PROM_ENTRY(21) 2807980486eSwdk #define MIPS_PROM_ORW_RMW MIPS_PROM_ENTRY(22) 2817980486eSwdk #define MIPS_PROM_ORH_RMW MIPS_PROM_ENTRY(23) 2827980486eSwdk #define MIPS_PROM_ORB_RMW MIPS_PROM_ENTRY(24) 2837980486eSwdk #define MIPS_PROM_ANDW_RMW MIPS_PROM_ENTRY(25) 2847980486eSwdk #define MIPS_PROM_ANDH_RMW MIPS_PROM_ENTRY(26) 2857980486eSwdk #define MIPS_PROM_ANDB_RMW MIPS_PROM_ENTRY(27) 2867980486eSwdk #define MIPS_PROM_FLUSHCACHE MIPS_PROM_ENTRY(28) 2877980486eSwdk #define MIPS_PROM_CLEARCACHE MIPS_PROM_ENTRY(29) 2887980486eSwdk #define MIPS_PROM_SETJMP MIPS_PROM_ENTRY(30) 2897980486eSwdk #define MIPS_PROM_LONGJMP MIPS_PROM_ENTRY(31) 2907980486eSwdk #define MIPS_PROM_BEVUTLB MIPS_PROM_ENTRY(32) 2917980486eSwdk #define MIPS_PROM_GETENV MIPS_PROM_ENTRY(33) 2927980486eSwdk #define MIPS_PROM_SETENV MIPS_PROM_ENTRY(34) 2937980486eSwdk #define MIPS_PROM_ATOB MIPS_PROM_ENTRY(35) 2947980486eSwdk #define MIPS_PROM_STRCMP MIPS_PROM_ENTRY(36) 2957980486eSwdk #define MIPS_PROM_STRLEN MIPS_PROM_ENTRY(37) 2967980486eSwdk #define MIPS_PROM_STRCPY MIPS_PROM_ENTRY(38) 2977980486eSwdk #define MIPS_PROM_STRCAT MIPS_PROM_ENTRY(39) 2987980486eSwdk #define MIPS_PROM_PARSER MIPS_PROM_ENTRY(40) 2997980486eSwdk #define MIPS_PROM_RANGE MIPS_PROM_ENTRY(41) 3007980486eSwdk #define MIPS_PROM_ARGVIZE MIPS_PROM_ENTRY(42) 3017980486eSwdk #define MIPS_PROM_HELP MIPS_PROM_ENTRY(43) 3027980486eSwdk #define MIPS_PROM_DUMP MIPS_PROM_ENTRY(44) 3037980486eSwdk #define MIPS_PROM_SETENVCMD MIPS_PROM_ENTRY(45) 3047980486eSwdk #define MIPS_PROM_UNSETENVCMD MIPS_PROM_ENTRY(46) 3057980486eSwdk #define MIPS_PROM_PRINTENV MIPS_PROM_ENTRY(47) 3067980486eSwdk #define MIPS_PROM_BEVEXCEPT MIPS_PROM_ENTRY(48) 3077980486eSwdk #define MIPS_PROM_ENABLE MIPS_PROM_ENTRY(49) 3087980486eSwdk #define MIPS_PROM_DISABLE MIPS_PROM_ENTRY(50) 3097980486eSwdk #define MIPS_PROM_CLEARNOFAULT MIPS_PROM_ENTRY(51) 3107980486eSwdk #define MIPS_PROM_NOTIMPLEMENT MIPS_PROM_ENTRY(52) 3117980486eSwdk #define MIPS_PROM_NVGET MIPS_PROM_ENTRY(53) 3127980486eSwdk #define MIPS_PROM_NVSET MIPS_PROM_ENTRY(54) 3137980486eSwdk 3148bbe289fSwdk #if defined(_KERNEL) && !defined(__ASSEMBLER__) 315bd338a51Smatt extern void prom_init (void); 316bd338a51Smatt extern int prom_getconsole (void); 317bd338a51Smatt #endif 318bd338a51Smatt 3197980486eSwdk #endif /* ! _MIPSCO_PROM_H */ 320