1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __SPARC_OPENPROM_H 3 #define __SPARC_OPENPROM_H 4 5 /* openprom.h: Prom structures and defines for access to the OPENBOOT 6 * prom routines and data areas. 7 * 8 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 9 */ 10 11 12 /* Empirical constants... */ 13 #ifdef CONFIG_SUN3 14 #define KADB_DEBUGGER_BEGVM 0x0fee0000 /* There is no kadb yet but...*/ 15 #define LINUX_OPPROM_BEGVM 0x0fef0000 16 #define LINUX_OPPROM_ENDVM 0x0ff10000 /* I think this is right - tm */ 17 #else 18 #define KADB_DEBUGGER_BEGVM 0xffc00000 /* Where kern debugger is in virt-mem */ 19 #define LINUX_OPPROM_BEGVM 0xffd00000 20 #define LINUX_OPPROM_ENDVM 0xfff00000 21 #define LINUX_OPPROM_MAGIC 0x10010407 22 #endif 23 24 #ifndef __ASSEMBLY__ 25 /* V0 prom device operations. */ 26 struct linux_dev_v0_funcs { 27 int (*v0_devopen)(char *device_str); 28 int (*v0_devclose)(int dev_desc); 29 int (*v0_rdblkdev)(int dev_desc, int num_blks, int blk_st, char *buf); 30 int (*v0_wrblkdev)(int dev_desc, int num_blks, int blk_st, char *buf); 31 int (*v0_wrnetdev)(int dev_desc, int num_bytes, char *buf); 32 int (*v0_rdnetdev)(int dev_desc, int num_bytes, char *buf); 33 int (*v0_rdchardev)(int dev_desc, int num_bytes, int dummy, char *buf); 34 int (*v0_wrchardev)(int dev_desc, int num_bytes, int dummy, char *buf); 35 int (*v0_seekdev)(int dev_desc, long logical_offst, int from); 36 }; 37 38 /* V2 and later prom device operations. */ 39 struct linux_dev_v2_funcs { 40 int (*v2_inst2pkg)(int d); /* Convert ihandle to phandle */ 41 char * (*v2_dumb_mem_alloc)(char *va, unsigned sz); 42 void (*v2_dumb_mem_free)(char *va, unsigned sz); 43 44 /* To map devices into virtual I/O space. */ 45 char * (*v2_dumb_mmap)(char *virta, int which_io, unsigned paddr, unsigned sz); 46 void (*v2_dumb_munmap)(char *virta, unsigned size); 47 48 int (*v2_dev_open)(char *devpath); 49 void (*v2_dev_close)(int d); 50 int (*v2_dev_read)(int d, char *buf, int nbytes); 51 int (*v2_dev_write)(int d, char *buf, int nbytes); 52 int (*v2_dev_seek)(int d, int hi, int lo); 53 54 /* Never issued (multistage load support) */ 55 void (*v2_wheee2)(void); 56 void (*v2_wheee3)(void); 57 }; 58 59 struct linux_mlist_v0 { 60 struct linux_mlist_v0 *theres_more; 61 char *start_adr; 62 unsigned num_bytes; 63 }; 64 65 struct linux_mem_v0 { 66 struct linux_mlist_v0 **v0_totphys; 67 struct linux_mlist_v0 **v0_prommap; 68 struct linux_mlist_v0 **v0_available; /* What we can use */ 69 }; 70 71 /* Arguments sent to the kernel from the boot prompt. */ 72 struct linux_arguments_v0 { 73 char *argv[8]; 74 char args[100]; 75 char boot_dev[2]; 76 int boot_dev_ctrl; 77 int boot_dev_unit; 78 int dev_partition; 79 char *kernel_file_name; 80 void *aieee1; /* XXX */ 81 }; 82 83 /* V2 and up boot things. */ 84 struct linux_bootargs_v2 { 85 char **bootpath; 86 char **bootargs; 87 int *fd_stdin; 88 int *fd_stdout; 89 }; 90 91 #if defined(CONFIG_SUN3) || defined(CONFIG_SUN3X) 92 struct linux_romvec { 93 char *pv_initsp; 94 int (*pv_startmon)(void); 95 96 int *diagberr; 97 98 struct linux_arguments_v0 **pv_v0bootargs; 99 unsigned *pv_sun3mem; 100 101 unsigned char (*pv_getchar)(void); 102 int (*pv_putchar)(int ch); 103 int (*pv_nbgetchar)(void); 104 int (*pv_nbputchar)(int ch); 105 unsigned char *pv_echo; 106 unsigned char *pv_insource; 107 unsigned char *pv_outsink; 108 109 int (*pv_getkey)(void); 110 int (*pv_initgetkey)(void); 111 unsigned int *pv_translation; 112 unsigned char *pv_keybid; 113 int *pv_screen_x; 114 int *pv_screen_y; 115 struct keybuf *pv_keybuf; 116 117 char *pv_monid; 118 119 /* 120 * Frame buffer output and terminal emulation 121 */ 122 123 int (*pv_fbwritechar)(char); 124 int *pv_fbaddr; 125 char **pv_font; 126 int (*pv_fbwritestr)(char); 127 128 void (*pv_reboot)(char *bootstr); 129 130 /* 131 * Line input and parsing 132 */ 133 134 unsigned char *pv_linebuf; 135 unsigned char **pv_lineptr; 136 int *pv_linesize; 137 int (*pv_getline)(void); 138 unsigned char (*pv_getnextchar)(void); 139 unsigned char (*pv_peeknextchar)(void); 140 int *pv_fbthere; 141 int (*pv_getnum)(void); 142 143 void (*pv_printf)(const char *fmt, ...); 144 int (*pv_printhex)(void); 145 146 unsigned char *pv_leds; 147 int (*pv_setleds)(void); 148 149 /* 150 * Non-maskable interrupt (nmi) information 151 */ 152 153 int (*pv_nmiaddr)(void); 154 int (*pv_abortentry)(void); 155 int *pv_nmiclock; 156 157 int *pv_fbtype; 158 159 /* 160 * Assorted other things 161 */ 162 163 unsigned pv_romvers; 164 struct globram *pv_globram; 165 char *pv_kbdzscc; 166 167 int *pv_keyrinit; 168 unsigned char *pv_keyrtick; 169 unsigned *pv_memoryavail; 170 long *pv_resetaddr; 171 long *pv_resetmap; 172 173 void (*pv_halt)(void); 174 unsigned char *pv_memorybitmap; 175 176 #ifdef CONFIG_SUN3 177 void (*pv_setctxt)(int ctxt, char *va, int pmeg); 178 void (*pv_vector_cmd)(void); 179 int dummy1z; 180 int dummy2z; 181 int dummy3z; 182 int dummy4z; 183 #endif 184 }; 185 #else 186 /* The top level PROM vector. */ 187 struct linux_romvec { 188 /* Version numbers. */ 189 unsigned int pv_magic_cookie; 190 unsigned int pv_romvers; 191 unsigned int pv_plugin_revision; 192 unsigned int pv_printrev; 193 194 /* Version 0 memory descriptors. */ 195 struct linux_mem_v0 pv_v0mem; 196 197 /* Node operations. */ 198 struct linux_nodeops *pv_nodeops; 199 200 char **pv_bootstr; 201 struct linux_dev_v0_funcs pv_v0devops; 202 203 char *pv_stdin; 204 char *pv_stdout; 205 #define PROMDEV_KBD 0 /* input from keyboard */ 206 #define PROMDEV_SCREEN 0 /* output to screen */ 207 #define PROMDEV_TTYA 1 /* in/out to ttya */ 208 #define PROMDEV_TTYB 2 /* in/out to ttyb */ 209 210 /* Blocking getchar/putchar. NOT REENTRANT! (grr) */ 211 int (*pv_getchar)(void); 212 void (*pv_putchar)(int ch); 213 214 /* Non-blocking variants. */ 215 int (*pv_nbgetchar)(void); 216 int (*pv_nbputchar)(int ch); 217 218 void (*pv_putstr)(char *str, int len); 219 220 /* Miscellany. */ 221 void (*pv_reboot)(char *bootstr); 222 void (*pv_printf)(__const__ char *fmt, ...); 223 void (*pv_abort)(void); 224 __volatile__ int *pv_ticks; 225 void (*pv_halt)(void); 226 void (**pv_synchook)(void); 227 228 /* Evaluate a forth string, not different proto for V0 and V2->up. */ 229 union { 230 void (*v0_eval)(int len, char *str); 231 void (*v2_eval)(char *str); 232 } pv_fortheval; 233 234 struct linux_arguments_v0 **pv_v0bootargs; 235 236 /* Get ether address. */ 237 unsigned int (*pv_enaddr)(int d, char *enaddr); 238 239 struct linux_bootargs_v2 pv_v2bootargs; 240 struct linux_dev_v2_funcs pv_v2devops; 241 242 int filler[15]; 243 244 /* This one is sun4c/sun4 only. */ 245 void (*pv_setctxt)(int ctxt, char *va, int pmeg); 246 247 /* Prom version 3 Multiprocessor routines. This stuff is crazy. 248 * No joke. Calling these when there is only one cpu probably 249 * crashes the machine, have to test this. :-) 250 */ 251 252 /* v3_cpustart() will start the cpu 'whichcpu' in mmu-context 253 * 'thiscontext' executing at address 'prog_counter' 254 */ 255 int (*v3_cpustart)(unsigned int whichcpu, int ctxtbl_ptr, 256 int thiscontext, char *prog_counter); 257 258 /* v3_cpustop() will cause cpu 'whichcpu' to stop executing 259 * until a resume cpu call is made. 260 */ 261 int (*v3_cpustop)(unsigned int whichcpu); 262 263 /* v3_cpuidle() will idle cpu 'whichcpu' until a stop or 264 * resume cpu call is made. 265 */ 266 int (*v3_cpuidle)(unsigned int whichcpu); 267 268 /* v3_cpuresume() will resume processor 'whichcpu' executing 269 * starting with whatever 'pc' and 'npc' were left at the 270 * last 'idle' or 'stop' call. 271 */ 272 int (*v3_cpuresume)(unsigned int whichcpu); 273 }; 274 #endif 275 276 /* Routines for traversing the prom device tree. */ 277 struct linux_nodeops { 278 int (*no_nextnode)(int node); 279 int (*no_child)(int node); 280 int (*no_proplen)(int node, char *name); 281 int (*no_getprop)(int node, char *name, char *val); 282 int (*no_setprop)(int node, char *name, char *val, int len); 283 char * (*no_nextprop)(int node, char *name); 284 }; 285 286 /* More fun PROM structures for device probing. */ 287 #define PROMREG_MAX 16 288 #define PROMVADDR_MAX 16 289 #define PROMINTR_MAX 15 290 291 struct linux_prom_registers { 292 int which_io; /* is this in OBIO space? */ 293 char *phys_addr; /* The physical address of this register */ 294 int reg_size; /* How many bytes does this register take up? */ 295 }; 296 297 struct linux_prom_irqs { 298 int pri; /* IRQ priority */ 299 int vector; /* This is foobar, what does it do? */ 300 }; 301 302 /* Element of the "ranges" vector */ 303 struct linux_prom_ranges { 304 unsigned int ot_child_space; 305 unsigned int ot_child_base; /* Bus feels this */ 306 unsigned int ot_parent_space; 307 unsigned int ot_parent_base; /* CPU looks from here */ 308 unsigned int or_size; 309 }; 310 311 #endif /* !(__ASSEMBLY__) */ 312 313 #endif /* !(__SPARC_OPENPROM_H) */ 314