1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef __SPARC_OPENPROM_H 3*4882a593Smuzhiyun #define __SPARC_OPENPROM_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* openprom.h: Prom structures and defines for access to the OPENBOOT 6*4882a593Smuzhiyun * prom routines and data areas. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Copyright (C) 1995,1996 David S. Miller (davem@caip.rutgers.edu) 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /* Empirical constants... */ 12*4882a593Smuzhiyun #define LINUX_OPPROM_MAGIC 0x10010407 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 15*4882a593Smuzhiyun #include <linux/of.h> 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* V0 prom device operations. */ 18*4882a593Smuzhiyun struct linux_dev_v0_funcs { 19*4882a593Smuzhiyun int (*v0_devopen)(char *device_str); 20*4882a593Smuzhiyun int (*v0_devclose)(int dev_desc); 21*4882a593Smuzhiyun int (*v0_rdblkdev)(int dev_desc, int num_blks, int blk_st, char *buf); 22*4882a593Smuzhiyun int (*v0_wrblkdev)(int dev_desc, int num_blks, int blk_st, char *buf); 23*4882a593Smuzhiyun int (*v0_wrnetdev)(int dev_desc, int num_bytes, char *buf); 24*4882a593Smuzhiyun int (*v0_rdnetdev)(int dev_desc, int num_bytes, char *buf); 25*4882a593Smuzhiyun int (*v0_rdchardev)(int dev_desc, int num_bytes, int dummy, char *buf); 26*4882a593Smuzhiyun int (*v0_wrchardev)(int dev_desc, int num_bytes, int dummy, char *buf); 27*4882a593Smuzhiyun int (*v0_seekdev)(int dev_desc, long logical_offst, int from); 28*4882a593Smuzhiyun }; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* V2 and later prom device operations. */ 31*4882a593Smuzhiyun struct linux_dev_v2_funcs { 32*4882a593Smuzhiyun phandle (*v2_inst2pkg)(int d); /* Convert ihandle to phandle */ 33*4882a593Smuzhiyun char * (*v2_dumb_mem_alloc)(char *va, unsigned int sz); 34*4882a593Smuzhiyun void (*v2_dumb_mem_free)(char *va, unsigned int sz); 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* To map devices into virtual I/O space. */ 37*4882a593Smuzhiyun char * (*v2_dumb_mmap)(char *virta, int which_io, unsigned int paddr, unsigned int sz); 38*4882a593Smuzhiyun void (*v2_dumb_munmap)(char *virta, unsigned int size); 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun int (*v2_dev_open)(char *devpath); 41*4882a593Smuzhiyun void (*v2_dev_close)(int d); 42*4882a593Smuzhiyun int (*v2_dev_read)(int d, char *buf, int nbytes); 43*4882a593Smuzhiyun int (*v2_dev_write)(int d, const char *buf, int nbytes); 44*4882a593Smuzhiyun int (*v2_dev_seek)(int d, int hi, int lo); 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun /* Never issued (multistage load support) */ 47*4882a593Smuzhiyun void (*v2_wheee2)(void); 48*4882a593Smuzhiyun void (*v2_wheee3)(void); 49*4882a593Smuzhiyun }; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun struct linux_mlist_v0 { 52*4882a593Smuzhiyun struct linux_mlist_v0 *theres_more; 53*4882a593Smuzhiyun unsigned int start_adr; 54*4882a593Smuzhiyun unsigned int num_bytes; 55*4882a593Smuzhiyun }; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun struct linux_mem_v0 { 58*4882a593Smuzhiyun struct linux_mlist_v0 **v0_totphys; 59*4882a593Smuzhiyun struct linux_mlist_v0 **v0_prommap; 60*4882a593Smuzhiyun struct linux_mlist_v0 **v0_available; /* What we can use */ 61*4882a593Smuzhiyun }; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* Arguments sent to the kernel from the boot prompt. */ 64*4882a593Smuzhiyun struct linux_arguments_v0 { 65*4882a593Smuzhiyun char *argv[8]; 66*4882a593Smuzhiyun char args[100]; 67*4882a593Smuzhiyun char boot_dev[2]; 68*4882a593Smuzhiyun int boot_dev_ctrl; 69*4882a593Smuzhiyun int boot_dev_unit; 70*4882a593Smuzhiyun int dev_partition; 71*4882a593Smuzhiyun char *kernel_file_name; 72*4882a593Smuzhiyun void *aieee1; /* XXX */ 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* V2 and up boot things. */ 76*4882a593Smuzhiyun struct linux_bootargs_v2 { 77*4882a593Smuzhiyun char **bootpath; 78*4882a593Smuzhiyun char **bootargs; 79*4882a593Smuzhiyun int *fd_stdin; 80*4882a593Smuzhiyun int *fd_stdout; 81*4882a593Smuzhiyun }; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun /* The top level PROM vector. */ 84*4882a593Smuzhiyun struct linux_romvec { 85*4882a593Smuzhiyun /* Version numbers. */ 86*4882a593Smuzhiyun unsigned int pv_magic_cookie; 87*4882a593Smuzhiyun unsigned int pv_romvers; 88*4882a593Smuzhiyun unsigned int pv_plugin_revision; 89*4882a593Smuzhiyun unsigned int pv_printrev; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* Version 0 memory descriptors. */ 92*4882a593Smuzhiyun struct linux_mem_v0 pv_v0mem; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /* Node operations. */ 95*4882a593Smuzhiyun struct linux_nodeops *pv_nodeops; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun char **pv_bootstr; 98*4882a593Smuzhiyun struct linux_dev_v0_funcs pv_v0devops; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun char *pv_stdin; 101*4882a593Smuzhiyun char *pv_stdout; 102*4882a593Smuzhiyun #define PROMDEV_KBD 0 /* input from keyboard */ 103*4882a593Smuzhiyun #define PROMDEV_SCREEN 0 /* output to screen */ 104*4882a593Smuzhiyun #define PROMDEV_TTYA 1 /* in/out to ttya */ 105*4882a593Smuzhiyun #define PROMDEV_TTYB 2 /* in/out to ttyb */ 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun /* Blocking getchar/putchar. NOT REENTRANT! (grr) */ 108*4882a593Smuzhiyun int (*pv_getchar)(void); 109*4882a593Smuzhiyun void (*pv_putchar)(int ch); 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun /* Non-blocking variants. */ 112*4882a593Smuzhiyun int (*pv_nbgetchar)(void); 113*4882a593Smuzhiyun int (*pv_nbputchar)(int ch); 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun void (*pv_putstr)(char *str, int len); 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /* Miscellany. */ 118*4882a593Smuzhiyun void (*pv_reboot)(char *bootstr); 119*4882a593Smuzhiyun void (*pv_printf)(__const__ char *fmt, ...); 120*4882a593Smuzhiyun void (*pv_abort)(void); 121*4882a593Smuzhiyun __volatile__ int *pv_ticks; 122*4882a593Smuzhiyun void (*pv_halt)(void); 123*4882a593Smuzhiyun void (**pv_synchook)(void); 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* Evaluate a forth string, not different proto for V0 and V2->up. */ 126*4882a593Smuzhiyun union { 127*4882a593Smuzhiyun void (*v0_eval)(int len, char *str); 128*4882a593Smuzhiyun void (*v2_eval)(char *str); 129*4882a593Smuzhiyun } pv_fortheval; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun struct linux_arguments_v0 **pv_v0bootargs; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun /* Get ether address. */ 134*4882a593Smuzhiyun unsigned int (*pv_enaddr)(int d, char *enaddr); 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun struct linux_bootargs_v2 pv_v2bootargs; 137*4882a593Smuzhiyun struct linux_dev_v2_funcs pv_v2devops; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun int filler[15]; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun /* This one is sun4c/sun4 only. */ 142*4882a593Smuzhiyun void (*pv_setctxt)(int ctxt, char *va, int pmeg); 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun /* Prom version 3 Multiprocessor routines. This stuff is crazy. 145*4882a593Smuzhiyun * No joke. Calling these when there is only one cpu probably 146*4882a593Smuzhiyun * crashes the machine, have to test this. :-) 147*4882a593Smuzhiyun */ 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /* v3_cpustart() will start the cpu 'whichcpu' in mmu-context 150*4882a593Smuzhiyun * 'thiscontext' executing at address 'prog_counter' 151*4882a593Smuzhiyun */ 152*4882a593Smuzhiyun int (*v3_cpustart)(unsigned int whichcpu, int ctxtbl_ptr, 153*4882a593Smuzhiyun int thiscontext, char *prog_counter); 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun /* v3_cpustop() will cause cpu 'whichcpu' to stop executing 156*4882a593Smuzhiyun * until a resume cpu call is made. 157*4882a593Smuzhiyun */ 158*4882a593Smuzhiyun int (*v3_cpustop)(unsigned int whichcpu); 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* v3_cpuidle() will idle cpu 'whichcpu' until a stop or 161*4882a593Smuzhiyun * resume cpu call is made. 162*4882a593Smuzhiyun */ 163*4882a593Smuzhiyun int (*v3_cpuidle)(unsigned int whichcpu); 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun /* v3_cpuresume() will resume processor 'whichcpu' executing 166*4882a593Smuzhiyun * starting with whatever 'pc' and 'npc' were left at the 167*4882a593Smuzhiyun * last 'idle' or 'stop' call. 168*4882a593Smuzhiyun */ 169*4882a593Smuzhiyun int (*v3_cpuresume)(unsigned int whichcpu); 170*4882a593Smuzhiyun }; 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /* Routines for traversing the prom device tree. */ 173*4882a593Smuzhiyun struct linux_nodeops { 174*4882a593Smuzhiyun phandle (*no_nextnode)(phandle node); 175*4882a593Smuzhiyun phandle (*no_child)(phandle node); 176*4882a593Smuzhiyun int (*no_proplen)(phandle node, const char *name); 177*4882a593Smuzhiyun int (*no_getprop)(phandle node, const char *name, char *val); 178*4882a593Smuzhiyun int (*no_setprop)(phandle node, const char *name, char *val, int len); 179*4882a593Smuzhiyun char * (*no_nextprop)(phandle node, char *name); 180*4882a593Smuzhiyun }; 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun /* More fun PROM structures for device probing. */ 183*4882a593Smuzhiyun #if defined(__sparc__) && defined(__arch64__) 184*4882a593Smuzhiyun #define PROMREG_MAX 24 185*4882a593Smuzhiyun #define PROMVADDR_MAX 16 186*4882a593Smuzhiyun #define PROMINTR_MAX 32 187*4882a593Smuzhiyun #else 188*4882a593Smuzhiyun #define PROMREG_MAX 16 189*4882a593Smuzhiyun #define PROMVADDR_MAX 16 190*4882a593Smuzhiyun #define PROMINTR_MAX 15 191*4882a593Smuzhiyun #endif 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun struct linux_prom_registers { 194*4882a593Smuzhiyun unsigned int which_io; /* hi part of physical address */ 195*4882a593Smuzhiyun unsigned int phys_addr; /* The physical address of this register */ 196*4882a593Smuzhiyun unsigned int reg_size; /* How many bytes does this register take up? */ 197*4882a593Smuzhiyun }; 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun struct linux_prom64_registers { 200*4882a593Smuzhiyun unsigned long phys_addr; 201*4882a593Smuzhiyun unsigned long reg_size; 202*4882a593Smuzhiyun }; 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun struct linux_prom_irqs { 205*4882a593Smuzhiyun int pri; /* IRQ priority */ 206*4882a593Smuzhiyun int vector; /* This is foobar, what does it do? */ 207*4882a593Smuzhiyun }; 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun /* Element of the "ranges" vector */ 210*4882a593Smuzhiyun struct linux_prom_ranges { 211*4882a593Smuzhiyun unsigned int ot_child_space; 212*4882a593Smuzhiyun unsigned int ot_child_base; /* Bus feels this */ 213*4882a593Smuzhiyun unsigned int ot_parent_space; 214*4882a593Smuzhiyun unsigned int ot_parent_base; /* CPU looks from here */ 215*4882a593Smuzhiyun unsigned int or_size; 216*4882a593Smuzhiyun }; 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun /* 219*4882a593Smuzhiyun * Ranges and reg properties are a bit different for PCI. 220*4882a593Smuzhiyun */ 221*4882a593Smuzhiyun #if defined(__sparc__) && defined(__arch64__) 222*4882a593Smuzhiyun struct linux_prom_pci_registers { 223*4882a593Smuzhiyun unsigned int phys_hi; 224*4882a593Smuzhiyun unsigned int phys_mid; 225*4882a593Smuzhiyun unsigned int phys_lo; 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun unsigned int size_hi; 228*4882a593Smuzhiyun unsigned int size_lo; 229*4882a593Smuzhiyun }; 230*4882a593Smuzhiyun #else 231*4882a593Smuzhiyun struct linux_prom_pci_registers { 232*4882a593Smuzhiyun /* 233*4882a593Smuzhiyun * We don't know what information this field contain. 234*4882a593Smuzhiyun * We guess, PCI device function is in bits 15:8 235*4882a593Smuzhiyun * So, ... 236*4882a593Smuzhiyun */ 237*4882a593Smuzhiyun unsigned int which_io; /* Let it be which_io */ 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun unsigned int phys_hi; 240*4882a593Smuzhiyun unsigned int phys_lo; 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun unsigned int size_hi; 243*4882a593Smuzhiyun unsigned int size_lo; 244*4882a593Smuzhiyun }; 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun #endif 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun struct linux_prom_pci_ranges { 249*4882a593Smuzhiyun unsigned int child_phys_hi; /* Only certain bits are encoded here. */ 250*4882a593Smuzhiyun unsigned int child_phys_mid; 251*4882a593Smuzhiyun unsigned int child_phys_lo; 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun unsigned int parent_phys_hi; 254*4882a593Smuzhiyun unsigned int parent_phys_lo; 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun unsigned int size_hi; 257*4882a593Smuzhiyun unsigned int size_lo; 258*4882a593Smuzhiyun }; 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun struct linux_prom_pci_intmap { 261*4882a593Smuzhiyun unsigned int phys_hi; 262*4882a593Smuzhiyun unsigned int phys_mid; 263*4882a593Smuzhiyun unsigned int phys_lo; 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun unsigned int interrupt; 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun int cnode; 268*4882a593Smuzhiyun unsigned int cinterrupt; 269*4882a593Smuzhiyun }; 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun struct linux_prom_pci_intmask { 272*4882a593Smuzhiyun unsigned int phys_hi; 273*4882a593Smuzhiyun unsigned int phys_mid; 274*4882a593Smuzhiyun unsigned int phys_lo; 275*4882a593Smuzhiyun unsigned int interrupt; 276*4882a593Smuzhiyun }; 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun #endif /* !(__ASSEMBLY__) */ 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun #endif /* !(__SPARC_OPENPROM_H) */ 281