1 1.27 thorpej /* $NetBSD: promlib.h,v 1.27 2022/01/22 11:49:16 thorpej Exp $ */ 2 1.1 pk 3 1.1 pk /*- 4 1.1 pk * Copyright (c) 1999 The NetBSD Foundation, Inc. 5 1.1 pk * All rights reserved. 6 1.1 pk * 7 1.1 pk * This code is derived from software contributed to The NetBSD Foundation 8 1.1 pk * by Paul Kranenburg. 9 1.1 pk * 10 1.1 pk * Redistribution and use in source and binary forms, with or without 11 1.1 pk * modification, are permitted provided that the following conditions 12 1.1 pk * are met: 13 1.1 pk * 1. Redistributions of source code must retain the above copyright 14 1.1 pk * notice, this list of conditions and the following disclaimer. 15 1.1 pk * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 pk * notice, this list of conditions and the following disclaimer in the 17 1.1 pk * documentation and/or other materials provided with the distribution. 18 1.1 pk * 19 1.1 pk * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 pk * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 pk * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 pk * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 pk * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 pk * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 pk * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 pk * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 pk * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 pk * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 pk * POSSIBILITY OF SUCH DAMAGE. 30 1.1 pk */ 31 1.1 pk 32 1.1 pk /* 33 1.1 pk * OPENPROM functions. These are here mainly to hide the OPENPROM interface 34 1.1 pk * from the rest of the kernel. 35 1.1 pk */ 36 1.1 pk 37 1.1 pk #ifndef _SPARC_PROMLIB_H_ 38 1.1 pk #define _SPARC_PROMLIB_H_ 39 1.9 martin 40 1.10 martin #ifdef _KERNEL_OPT 41 1.9 martin #include "opt_multiprocessor.h" 42 1.10 martin #endif 43 1.1 pk 44 1.26 thorpej #include <sys/device.h> /* for devhandle_t */ 45 1.26 thorpej 46 1.8 pk #include <machine/idprom.h> 47 1.1 pk #include <machine/bsd_openprom.h> 48 1.8 pk #include <machine/openfirm.h> 49 1.1 pk 50 1.1 pk /* 51 1.1 pk * A set of methods to access the firmware. 52 1.1 pk * We use this to support various versions of Open Boot Prom 53 1.1 pk * or Open Firmware implementations. 54 1.1 pk */ 55 1.1 pk struct promops { 56 1.1 pk int po_version; /* PROM version number */ 57 1.1 pk #define PROM_OLDMON 0 58 1.1 pk #define PROM_OBP_V0 1 59 1.1 pk #define PROM_OBP_V2 2 60 1.1 pk #define PROM_OBP_V3 3 61 1.1 pk #define PROM_OPENFIRM 4 62 1.1 pk int po_revision; /* revision level */ 63 1.1 pk int po_stdin; /* stdio handles */ 64 1.1 pk int po_stdout; /* */ 65 1.1 pk void *po_bootcookie; 66 1.1 pk 67 1.1 pk /* Access to boot arguments */ 68 1.20 christos const char *(*po_bootpath)(void); 69 1.20 christos const char *(*po_bootfile)(void); 70 1.20 christos const char *(*po_bootargs)(void); 71 1.1 pk 72 1.1 pk /* I/O functions */ 73 1.15 pk int (*po_getchar)(void); 74 1.15 pk int (*po_peekchar)(void); 75 1.15 pk void (*po_putchar)(int); 76 1.20 christos void (*po_putstr)(const char *, int); 77 1.20 christos int (*po_open)(const char *); 78 1.15 pk void (*po_close)(int); 79 1.15 pk int (*po_read)(int, void *, int); 80 1.20 christos int (*po_write)(int, const void *, int); 81 1.15 pk int (*po_seek)(int, u_quad_t); 82 1.1 pk 83 1.15 pk int (*po_instance_to_package)(int); 84 1.1 pk 85 1.1 pk /* Misc functions (common in OBP 0,2,3) */ 86 1.15 pk void (*po_halt)(void) __attribute__((__noreturn__)); 87 1.20 christos void (*po_reboot)(const char *) __attribute__((__noreturn__)); 88 1.15 pk void (*po_abort)(void); 89 1.20 christos void (*po_interpret)(const char *); 90 1.15 pk void (*po_setcallback)(void (*)(void)); 91 1.15 pk int (*po_ticks)(void); 92 1.1 pk void *po_tickdata; 93 1.1 pk 94 1.1 pk /* sun4/sun4c only */ 95 1.22 christos void (*po_setcontext)(int ctxt, void *va, int pmeg); 96 1.1 pk 97 1.1 pk /* MP functions (OBP v3 only) */ 98 1.22 christos int (*po_cpustart)(int, struct openprom_addr *, int, void *); 99 1.15 pk int (*po_cpustop)(int); 100 1.15 pk int (*po_cpuidle)(int); 101 1.15 pk int (*po_cpuresume)(int); 102 1.1 pk 103 1.1 pk /* Device node traversal (OBP v0, v2, v3; but not sun4) */ 104 1.15 pk int (*po_firstchild)(int); 105 1.15 pk int (*po_nextsibling)(int); 106 1.1 pk 107 1.1 pk /* Device node properties */ 108 1.20 christos int (*po_getproplen)(int, const char *); 109 1.20 christos int (*po_getprop)(int, const char *, void *, int); 110 1.20 christos int (*po_setprop)(int, const char *, const void *, int); 111 1.20 christos char *(*po_nextprop)(int, const char *); 112 1.1 pk 113 1.20 christos int (*po_finddevice)(const char *); 114 1.1 pk 115 1.26 thorpej /* devhandle_t interface */ 116 1.27 thorpej devhandle_t (*po_node_to_devhandle)(devhandle_t, int); 117 1.26 thorpej int (*po_devhandle_to_node)(devhandle_t); 118 1.1 pk }; 119 1.1 pk 120 1.1 pk extern struct promops promops; 121 1.6 pk 122 1.6 pk /* 123 1.6 pk * Memory description array. 124 1.7 pk * Same as version 2 rom meminfo property. 125 1.6 pk */ 126 1.6 pk struct memarr { 127 1.18 pk long zero; 128 1.18 pk u_long addr; 129 1.18 pk u_long len; 130 1.6 pk }; 131 1.20 christos int prom_makememarr(struct memarr *, int, int); 132 1.6 pk #define MEMARR_AVAILPHYS 0 133 1.6 pk #define MEMARR_TOTALPHYS 1 134 1.6 pk 135 1.8 pk struct idprom *prom_getidprom(void); 136 1.12 pk void prom_getether(int, u_char *); 137 1.24 martin bool prom_get_node_ether(int, u_char*); 138 1.20 christos const char *prom_pa_location(u_int, u_int); 139 1.1 pk 140 1.15 pk void prom_init(void); /* To setup promops */ 141 1.1 pk 142 1.1 pk /* Utility routines */ 143 1.20 christos int prom_getprop(int, const char *, size_t, int *, void *); 144 1.20 christos int prom_getpropint(int, const char *, int); 145 1.25 palle uint64_t prom_getpropuint64(int, const char *, uint64_t); 146 1.20 christos char *prom_getpropstring(int, const char *); 147 1.20 christos char *prom_getpropstringA(int, const char *, char *, size_t); 148 1.15 pk void prom_printf(const char *, ...); 149 1.15 pk 150 1.15 pk int prom_findroot(void); 151 1.15 pk int prom_findnode(int, const char *); 152 1.15 pk int prom_search(int, const char *); 153 1.20 christos int prom_opennode(const char *); 154 1.15 pk int prom_node_has_property(int, const char *); 155 1.15 pk int prom_getoptionsnode(void); 156 1.20 christos int prom_getoption(const char *, char *, int); 157 1.1 pk 158 1.1 pk #define findroot() prom_findroot() 159 1.1 pk #define findnode(node,name) prom_findnode(node,name) 160 1.1 pk #define opennode(name) prom_opennode(name) 161 1.1 pk #define node_has_property(node,prop) prom_node_has_property(node,prop) 162 1.1 pk 163 1.15 pk void prom_halt(void) __attribute__((__noreturn__)); 164 1.15 pk void prom_boot(char *) __attribute__((__noreturn__)); 165 1.1 pk 166 1.5 pk #if defined(MULTIPROCESSOR) 167 1.5 pk #define callrom() do { \ 168 1.5 pk mp_pause_cpus(); \ 169 1.5 pk prom_abort(); \ 170 1.5 pk mp_resume_cpus(); \ 171 1.5 pk } while (0) 172 1.5 pk #else 173 1.5 pk #define callrom() prom_abort() 174 1.5 pk #endif 175 1.1 pk 176 1.1 pk #define prom_version() (promops.po_version) 177 1.1 pk #define prom_revision() (promops.po_revision) 178 1.1 pk #define prom_stdin() (promops.po_stdin) 179 1.1 pk #define prom_stdout() (promops.po_stdout) 180 1.1 pk #define _prom_halt() ((*promops.po_halt)(/*void*/)) 181 1.1 pk #define _prom_boot(a) ((*promops.po_reboot)(a)) 182 1.1 pk #define prom_abort() ((*promops.po_abort)(/*void*/)) 183 1.1 pk #define prom_interpret(a) ((*promops.po_interpret)(a)) 184 1.1 pk #define prom_setcallback(f) ((*promops.po_setcallback)(f)) 185 1.1 pk #define prom_setcontext(c,a,p) ((*promops.po_setcontext)(c,a,p)) 186 1.1 pk #define prom_getbootpath() ((*promops.po_bootpath)(/*void*/)) 187 1.1 pk #define prom_getbootfile() ((*promops.po_bootfile)(/*void*/)) 188 1.1 pk #define prom_getbootargs() ((*promops.po_bootargs)(/*void*/)) 189 1.1 pk #define prom_ticks() ((*promops.po_ticks)(/*void*/)) 190 1.1 pk 191 1.1 pk 192 1.1 pk #define prom_open(name) ((*promops.po_open)(name)) 193 1.1 pk #define prom_close(fd) ((*promops.po_close)(fd)) 194 1.1 pk #define prom_instance_to_package(fd) \ 195 1.1 pk ((*promops.po_instance_to_package)(fd)) 196 1.1 pk #define prom_read(fd,b,n) ((*promops.po_read)(fd,b,n)) 197 1.1 pk #define prom_write(fd,b,n) ((*promops.po_write)(fd,b,n)) 198 1.1 pk #define prom_seek(fd,o) ((*promops.po_seek)(fd,o)) 199 1.1 pk #define prom_getchar() ((*promops.po_getchar)(/*void*/)) 200 1.1 pk #define prom_peekchar() ((*promops.po_peekchar)(/*void*/)) 201 1.1 pk #define prom_putchar(c) ((*promops.po_putchar)(c)) 202 1.1 pk #define prom_putstr(b,n) ((*promops.po_putstr)(b,n)) 203 1.1 pk 204 1.1 pk /* Node traversal */ 205 1.1 pk #define prom_firstchild(node) ((*promops.po_firstchild)(node)) 206 1.1 pk #define prom_nextsibling(node) ((*promops.po_nextsibling)(node)) 207 1.1 pk #define prom_proplen(node,name) ((*promops.po_getproplen)(node, name)) 208 1.1 pk #define _prom_getprop(node, name, buf, len) \ 209 1.1 pk ((*promops.po_getprop)(node, name, buf, len)) 210 1.1 pk #define prom_setprop(node, name, value, len) \ 211 1.1 pk ((*promops.po_setprop)(node, name, value, len)) 212 1.1 pk #define prom_nextprop(node,name) ((*promops.po_nextprop)(node, name)) 213 1.1 pk #define prom_finddevice(name) ((*promops.po_finddevice)(name)) 214 1.1 pk 215 1.1 pk #define firstchild(node) prom_firstchild(node) 216 1.1 pk #define nextsibling(node) prom_nextsibling(node) 217 1.16 pk #define prom_getproplen(node,name) prom_proplen(node, name) 218 1.1 pk 219 1.26 thorpej /* devhandle_t interface */ 220 1.27 thorpej #define prom_node_to_devhandle(s, n) ((*promops.po_node_to_devhandle)((s), (n))) 221 1.27 thorpej #define prom_devhandle_to_node(dh) ((*promops.po_devhandle_to_node)(dh)) 222 1.1 pk 223 1.1 pk /* MP stuff - not currently used */ 224 1.1 pk #define prom_cpustart(m,a,c,pc) ((*promops.po_cpustart)(m,a,c,pc)) 225 1.1 pk #define prom_cpustop(m) ((*promops.po_cpustop)(m)) 226 1.1 pk #define prom_cpuidle(m) ((*promops.po_cpuidle)(m)) 227 1.1 pk #define prom_cpuresume(m) ((*promops.po_cpuresume)(m)) 228 1.1 pk 229 1.1 pk extern void *romp; /* PROM-supplied argument (see locore) */ 230 1.1 pk 231 1.26 thorpej #ifdef _KERNEL 232 1.26 thorpej #define OBP_DEVICE_CALL_REGISTER(_n_, _c_) \ 233 1.26 thorpej DEVICE_CALL_REGISTER(obp_device_calls, _n_, _c_) 234 1.26 thorpej #endif /* _KERNEL */ 235 1.26 thorpej 236 1.1 pk #endif /* _SPARC_PROMLIB_H_ */ 237