162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef __SPARC_OPENPROM_H 362306a36Sopenharmony_ci#define __SPARC_OPENPROM_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci/* openprom.h: Prom structures and defines for access to the OPENBOOT 662306a36Sopenharmony_ci * prom routines and data areas. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* Empirical constants... */ 1362306a36Sopenharmony_ci#ifdef CONFIG_SUN3 1462306a36Sopenharmony_ci#define KADB_DEBUGGER_BEGVM 0x0fee0000 /* There is no kadb yet but...*/ 1562306a36Sopenharmony_ci#define LINUX_OPPROM_BEGVM 0x0fef0000 1662306a36Sopenharmony_ci#define LINUX_OPPROM_ENDVM 0x0ff10000 /* I think this is right - tm */ 1762306a36Sopenharmony_ci#else 1862306a36Sopenharmony_ci#define KADB_DEBUGGER_BEGVM 0xffc00000 /* Where kern debugger is in virt-mem */ 1962306a36Sopenharmony_ci#define LINUX_OPPROM_BEGVM 0xffd00000 2062306a36Sopenharmony_ci#define LINUX_OPPROM_ENDVM 0xfff00000 2162306a36Sopenharmony_ci#define LINUX_OPPROM_MAGIC 0x10010407 2262306a36Sopenharmony_ci#endif 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 2562306a36Sopenharmony_ci/* V0 prom device operations. */ 2662306a36Sopenharmony_cistruct linux_dev_v0_funcs { 2762306a36Sopenharmony_ci int (*v0_devopen)(char *device_str); 2862306a36Sopenharmony_ci int (*v0_devclose)(int dev_desc); 2962306a36Sopenharmony_ci int (*v0_rdblkdev)(int dev_desc, int num_blks, int blk_st, char *buf); 3062306a36Sopenharmony_ci int (*v0_wrblkdev)(int dev_desc, int num_blks, int blk_st, char *buf); 3162306a36Sopenharmony_ci int (*v0_wrnetdev)(int dev_desc, int num_bytes, char *buf); 3262306a36Sopenharmony_ci int (*v0_rdnetdev)(int dev_desc, int num_bytes, char *buf); 3362306a36Sopenharmony_ci int (*v0_rdchardev)(int dev_desc, int num_bytes, int dummy, char *buf); 3462306a36Sopenharmony_ci int (*v0_wrchardev)(int dev_desc, int num_bytes, int dummy, char *buf); 3562306a36Sopenharmony_ci int (*v0_seekdev)(int dev_desc, long logical_offst, int from); 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* V2 and later prom device operations. */ 3962306a36Sopenharmony_cistruct linux_dev_v2_funcs { 4062306a36Sopenharmony_ci int (*v2_inst2pkg)(int d); /* Convert ihandle to phandle */ 4162306a36Sopenharmony_ci char * (*v2_dumb_mem_alloc)(char *va, unsigned sz); 4262306a36Sopenharmony_ci void (*v2_dumb_mem_free)(char *va, unsigned sz); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci /* To map devices into virtual I/O space. */ 4562306a36Sopenharmony_ci char * (*v2_dumb_mmap)(char *virta, int which_io, unsigned paddr, unsigned sz); 4662306a36Sopenharmony_ci void (*v2_dumb_munmap)(char *virta, unsigned size); 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci int (*v2_dev_open)(char *devpath); 4962306a36Sopenharmony_ci void (*v2_dev_close)(int d); 5062306a36Sopenharmony_ci int (*v2_dev_read)(int d, char *buf, int nbytes); 5162306a36Sopenharmony_ci int (*v2_dev_write)(int d, char *buf, int nbytes); 5262306a36Sopenharmony_ci int (*v2_dev_seek)(int d, int hi, int lo); 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci /* Never issued (multistage load support) */ 5562306a36Sopenharmony_ci void (*v2_wheee2)(void); 5662306a36Sopenharmony_ci void (*v2_wheee3)(void); 5762306a36Sopenharmony_ci}; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cistruct linux_mlist_v0 { 6062306a36Sopenharmony_ci struct linux_mlist_v0 *theres_more; 6162306a36Sopenharmony_ci char *start_adr; 6262306a36Sopenharmony_ci unsigned num_bytes; 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistruct linux_mem_v0 { 6662306a36Sopenharmony_ci struct linux_mlist_v0 **v0_totphys; 6762306a36Sopenharmony_ci struct linux_mlist_v0 **v0_prommap; 6862306a36Sopenharmony_ci struct linux_mlist_v0 **v0_available; /* What we can use */ 6962306a36Sopenharmony_ci}; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* Arguments sent to the kernel from the boot prompt. */ 7262306a36Sopenharmony_cistruct linux_arguments_v0 { 7362306a36Sopenharmony_ci char *argv[8]; 7462306a36Sopenharmony_ci char args[100]; 7562306a36Sopenharmony_ci char boot_dev[2]; 7662306a36Sopenharmony_ci int boot_dev_ctrl; 7762306a36Sopenharmony_ci int boot_dev_unit; 7862306a36Sopenharmony_ci int dev_partition; 7962306a36Sopenharmony_ci char *kernel_file_name; 8062306a36Sopenharmony_ci void *aieee1; /* XXX */ 8162306a36Sopenharmony_ci}; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/* V2 and up boot things. */ 8462306a36Sopenharmony_cistruct linux_bootargs_v2 { 8562306a36Sopenharmony_ci char **bootpath; 8662306a36Sopenharmony_ci char **bootargs; 8762306a36Sopenharmony_ci int *fd_stdin; 8862306a36Sopenharmony_ci int *fd_stdout; 8962306a36Sopenharmony_ci}; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci#if defined(CONFIG_SUN3) || defined(CONFIG_SUN3X) 9262306a36Sopenharmony_cistruct linux_romvec { 9362306a36Sopenharmony_ci char *pv_initsp; 9462306a36Sopenharmony_ci int (*pv_startmon)(void); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci int *diagberr; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci struct linux_arguments_v0 **pv_v0bootargs; 9962306a36Sopenharmony_ci unsigned *pv_sun3mem; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci unsigned char (*pv_getchar)(void); 10262306a36Sopenharmony_ci int (*pv_putchar)(int ch); 10362306a36Sopenharmony_ci int (*pv_nbgetchar)(void); 10462306a36Sopenharmony_ci int (*pv_nbputchar)(int ch); 10562306a36Sopenharmony_ci unsigned char *pv_echo; 10662306a36Sopenharmony_ci unsigned char *pv_insource; 10762306a36Sopenharmony_ci unsigned char *pv_outsink; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci int (*pv_getkey)(void); 11062306a36Sopenharmony_ci int (*pv_initgetkey)(void); 11162306a36Sopenharmony_ci unsigned int *pv_translation; 11262306a36Sopenharmony_ci unsigned char *pv_keybid; 11362306a36Sopenharmony_ci int *pv_screen_x; 11462306a36Sopenharmony_ci int *pv_screen_y; 11562306a36Sopenharmony_ci struct keybuf *pv_keybuf; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci char *pv_monid; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci /* 12062306a36Sopenharmony_ci * Frame buffer output and terminal emulation 12162306a36Sopenharmony_ci */ 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci int (*pv_fbwritechar)(char); 12462306a36Sopenharmony_ci int *pv_fbaddr; 12562306a36Sopenharmony_ci char **pv_font; 12662306a36Sopenharmony_ci int (*pv_fbwritestr)(char); 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci void (*pv_reboot)(char *bootstr); 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci /* 13162306a36Sopenharmony_ci * Line input and parsing 13262306a36Sopenharmony_ci */ 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci unsigned char *pv_linebuf; 13562306a36Sopenharmony_ci unsigned char **pv_lineptr; 13662306a36Sopenharmony_ci int *pv_linesize; 13762306a36Sopenharmony_ci int (*pv_getline)(void); 13862306a36Sopenharmony_ci unsigned char (*pv_getnextchar)(void); 13962306a36Sopenharmony_ci unsigned char (*pv_peeknextchar)(void); 14062306a36Sopenharmony_ci int *pv_fbthere; 14162306a36Sopenharmony_ci int (*pv_getnum)(void); 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci void (*pv_printf)(const char *fmt, ...); 14462306a36Sopenharmony_ci int (*pv_printhex)(void); 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci unsigned char *pv_leds; 14762306a36Sopenharmony_ci int (*pv_setleds)(void); 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci /* 15062306a36Sopenharmony_ci * Non-maskable interrupt (nmi) information 15162306a36Sopenharmony_ci */ 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci int (*pv_nmiaddr)(void); 15462306a36Sopenharmony_ci int (*pv_abortentry)(void); 15562306a36Sopenharmony_ci int *pv_nmiclock; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci int *pv_fbtype; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci /* 16062306a36Sopenharmony_ci * Assorted other things 16162306a36Sopenharmony_ci */ 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci unsigned pv_romvers; 16462306a36Sopenharmony_ci struct globram *pv_globram; 16562306a36Sopenharmony_ci char *pv_kbdzscc; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci int *pv_keyrinit; 16862306a36Sopenharmony_ci unsigned char *pv_keyrtick; 16962306a36Sopenharmony_ci unsigned *pv_memoryavail; 17062306a36Sopenharmony_ci long *pv_resetaddr; 17162306a36Sopenharmony_ci long *pv_resetmap; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci void (*pv_halt)(void); 17462306a36Sopenharmony_ci unsigned char *pv_memorybitmap; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci#ifdef CONFIG_SUN3 17762306a36Sopenharmony_ci void (*pv_setctxt)(int ctxt, char *va, int pmeg); 17862306a36Sopenharmony_ci void (*pv_vector_cmd)(void); 17962306a36Sopenharmony_ci int dummy1z; 18062306a36Sopenharmony_ci int dummy2z; 18162306a36Sopenharmony_ci int dummy3z; 18262306a36Sopenharmony_ci int dummy4z; 18362306a36Sopenharmony_ci#endif 18462306a36Sopenharmony_ci}; 18562306a36Sopenharmony_ci#else 18662306a36Sopenharmony_ci/* The top level PROM vector. */ 18762306a36Sopenharmony_cistruct linux_romvec { 18862306a36Sopenharmony_ci /* Version numbers. */ 18962306a36Sopenharmony_ci unsigned int pv_magic_cookie; 19062306a36Sopenharmony_ci unsigned int pv_romvers; 19162306a36Sopenharmony_ci unsigned int pv_plugin_revision; 19262306a36Sopenharmony_ci unsigned int pv_printrev; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci /* Version 0 memory descriptors. */ 19562306a36Sopenharmony_ci struct linux_mem_v0 pv_v0mem; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci /* Node operations. */ 19862306a36Sopenharmony_ci struct linux_nodeops *pv_nodeops; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci char **pv_bootstr; 20162306a36Sopenharmony_ci struct linux_dev_v0_funcs pv_v0devops; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci char *pv_stdin; 20462306a36Sopenharmony_ci char *pv_stdout; 20562306a36Sopenharmony_ci#define PROMDEV_KBD 0 /* input from keyboard */ 20662306a36Sopenharmony_ci#define PROMDEV_SCREEN 0 /* output to screen */ 20762306a36Sopenharmony_ci#define PROMDEV_TTYA 1 /* in/out to ttya */ 20862306a36Sopenharmony_ci#define PROMDEV_TTYB 2 /* in/out to ttyb */ 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci /* Blocking getchar/putchar. NOT REENTRANT! (grr) */ 21162306a36Sopenharmony_ci int (*pv_getchar)(void); 21262306a36Sopenharmony_ci void (*pv_putchar)(int ch); 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci /* Non-blocking variants. */ 21562306a36Sopenharmony_ci int (*pv_nbgetchar)(void); 21662306a36Sopenharmony_ci int (*pv_nbputchar)(int ch); 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci void (*pv_putstr)(char *str, int len); 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci /* Miscellany. */ 22162306a36Sopenharmony_ci void (*pv_reboot)(char *bootstr); 22262306a36Sopenharmony_ci void (*pv_printf)(__const__ char *fmt, ...); 22362306a36Sopenharmony_ci void (*pv_abort)(void); 22462306a36Sopenharmony_ci __volatile__ int *pv_ticks; 22562306a36Sopenharmony_ci void (*pv_halt)(void); 22662306a36Sopenharmony_ci void (**pv_synchook)(void); 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci /* Evaluate a forth string, not different proto for V0 and V2->up. */ 22962306a36Sopenharmony_ci union { 23062306a36Sopenharmony_ci void (*v0_eval)(int len, char *str); 23162306a36Sopenharmony_ci void (*v2_eval)(char *str); 23262306a36Sopenharmony_ci } pv_fortheval; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci struct linux_arguments_v0 **pv_v0bootargs; 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci /* Get ether address. */ 23762306a36Sopenharmony_ci unsigned int (*pv_enaddr)(int d, char *enaddr); 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci struct linux_bootargs_v2 pv_v2bootargs; 24062306a36Sopenharmony_ci struct linux_dev_v2_funcs pv_v2devops; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci int filler[15]; 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci /* This one is sun4c/sun4 only. */ 24562306a36Sopenharmony_ci void (*pv_setctxt)(int ctxt, char *va, int pmeg); 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci /* Prom version 3 Multiprocessor routines. This stuff is crazy. 24862306a36Sopenharmony_ci * No joke. Calling these when there is only one cpu probably 24962306a36Sopenharmony_ci * crashes the machine, have to test this. :-) 25062306a36Sopenharmony_ci */ 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci /* v3_cpustart() will start the cpu 'whichcpu' in mmu-context 25362306a36Sopenharmony_ci * 'thiscontext' executing at address 'prog_counter' 25462306a36Sopenharmony_ci */ 25562306a36Sopenharmony_ci int (*v3_cpustart)(unsigned int whichcpu, int ctxtbl_ptr, 25662306a36Sopenharmony_ci int thiscontext, char *prog_counter); 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci /* v3_cpustop() will cause cpu 'whichcpu' to stop executing 25962306a36Sopenharmony_ci * until a resume cpu call is made. 26062306a36Sopenharmony_ci */ 26162306a36Sopenharmony_ci int (*v3_cpustop)(unsigned int whichcpu); 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci /* v3_cpuidle() will idle cpu 'whichcpu' until a stop or 26462306a36Sopenharmony_ci * resume cpu call is made. 26562306a36Sopenharmony_ci */ 26662306a36Sopenharmony_ci int (*v3_cpuidle)(unsigned int whichcpu); 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci /* v3_cpuresume() will resume processor 'whichcpu' executing 26962306a36Sopenharmony_ci * starting with whatever 'pc' and 'npc' were left at the 27062306a36Sopenharmony_ci * last 'idle' or 'stop' call. 27162306a36Sopenharmony_ci */ 27262306a36Sopenharmony_ci int (*v3_cpuresume)(unsigned int whichcpu); 27362306a36Sopenharmony_ci}; 27462306a36Sopenharmony_ci#endif 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci/* Routines for traversing the prom device tree. */ 27762306a36Sopenharmony_cistruct linux_nodeops { 27862306a36Sopenharmony_ci int (*no_nextnode)(int node); 27962306a36Sopenharmony_ci int (*no_child)(int node); 28062306a36Sopenharmony_ci int (*no_proplen)(int node, char *name); 28162306a36Sopenharmony_ci int (*no_getprop)(int node, char *name, char *val); 28262306a36Sopenharmony_ci int (*no_setprop)(int node, char *name, char *val, int len); 28362306a36Sopenharmony_ci char * (*no_nextprop)(int node, char *name); 28462306a36Sopenharmony_ci}; 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci/* More fun PROM structures for device probing. */ 28762306a36Sopenharmony_ci#define PROMREG_MAX 16 28862306a36Sopenharmony_ci#define PROMVADDR_MAX 16 28962306a36Sopenharmony_ci#define PROMINTR_MAX 15 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_cistruct linux_prom_registers { 29262306a36Sopenharmony_ci int which_io; /* is this in OBIO space? */ 29362306a36Sopenharmony_ci char *phys_addr; /* The physical address of this register */ 29462306a36Sopenharmony_ci int reg_size; /* How many bytes does this register take up? */ 29562306a36Sopenharmony_ci}; 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_cistruct linux_prom_irqs { 29862306a36Sopenharmony_ci int pri; /* IRQ priority */ 29962306a36Sopenharmony_ci int vector; /* This is foobar, what does it do? */ 30062306a36Sopenharmony_ci}; 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci/* Element of the "ranges" vector */ 30362306a36Sopenharmony_cistruct linux_prom_ranges { 30462306a36Sopenharmony_ci unsigned int ot_child_space; 30562306a36Sopenharmony_ci unsigned int ot_child_base; /* Bus feels this */ 30662306a36Sopenharmony_ci unsigned int ot_parent_space; 30762306a36Sopenharmony_ci unsigned int ot_parent_base; /* CPU looks from here */ 30862306a36Sopenharmony_ci unsigned int or_size; 30962306a36Sopenharmony_ci}; 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci#endif /* !(__ASSEMBLY__) */ 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci#endif /* !(__SPARC_OPENPROM_H) */ 314