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,1996 David S. Miller (davem@caip.rutgers.edu) 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci/* Empirical constants... */ 1262306a36Sopenharmony_ci#define LINUX_OPPROM_MAGIC 0x10010407 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 1562306a36Sopenharmony_ci#include <linux/of.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* V0 prom device operations. */ 1862306a36Sopenharmony_cistruct linux_dev_v0_funcs { 1962306a36Sopenharmony_ci int (*v0_devopen)(char *device_str); 2062306a36Sopenharmony_ci int (*v0_devclose)(int dev_desc); 2162306a36Sopenharmony_ci int (*v0_rdblkdev)(int dev_desc, int num_blks, int blk_st, char *buf); 2262306a36Sopenharmony_ci int (*v0_wrblkdev)(int dev_desc, int num_blks, int blk_st, char *buf); 2362306a36Sopenharmony_ci int (*v0_wrnetdev)(int dev_desc, int num_bytes, char *buf); 2462306a36Sopenharmony_ci int (*v0_rdnetdev)(int dev_desc, int num_bytes, char *buf); 2562306a36Sopenharmony_ci int (*v0_rdchardev)(int dev_desc, int num_bytes, int dummy, char *buf); 2662306a36Sopenharmony_ci int (*v0_wrchardev)(int dev_desc, int num_bytes, int dummy, char *buf); 2762306a36Sopenharmony_ci int (*v0_seekdev)(int dev_desc, long logical_offst, int from); 2862306a36Sopenharmony_ci}; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci/* V2 and later prom device operations. */ 3162306a36Sopenharmony_cistruct linux_dev_v2_funcs { 3262306a36Sopenharmony_ci phandle (*v2_inst2pkg)(int d); /* Convert ihandle to phandle */ 3362306a36Sopenharmony_ci char * (*v2_dumb_mem_alloc)(char *va, unsigned int sz); 3462306a36Sopenharmony_ci void (*v2_dumb_mem_free)(char *va, unsigned int sz); 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci /* To map devices into virtual I/O space. */ 3762306a36Sopenharmony_ci char * (*v2_dumb_mmap)(char *virta, int which_io, unsigned int paddr, unsigned int sz); 3862306a36Sopenharmony_ci void (*v2_dumb_munmap)(char *virta, unsigned int size); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci int (*v2_dev_open)(char *devpath); 4162306a36Sopenharmony_ci void (*v2_dev_close)(int d); 4262306a36Sopenharmony_ci int (*v2_dev_read)(int d, char *buf, int nbytes); 4362306a36Sopenharmony_ci int (*v2_dev_write)(int d, const char *buf, int nbytes); 4462306a36Sopenharmony_ci int (*v2_dev_seek)(int d, int hi, int lo); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci /* Never issued (multistage load support) */ 4762306a36Sopenharmony_ci void (*v2_wheee2)(void); 4862306a36Sopenharmony_ci void (*v2_wheee3)(void); 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistruct linux_mlist_v0 { 5262306a36Sopenharmony_ci struct linux_mlist_v0 *theres_more; 5362306a36Sopenharmony_ci unsigned int start_adr; 5462306a36Sopenharmony_ci unsigned int num_bytes; 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistruct linux_mem_v0 { 5862306a36Sopenharmony_ci struct linux_mlist_v0 **v0_totphys; 5962306a36Sopenharmony_ci struct linux_mlist_v0 **v0_prommap; 6062306a36Sopenharmony_ci struct linux_mlist_v0 **v0_available; /* What we can use */ 6162306a36Sopenharmony_ci}; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci/* Arguments sent to the kernel from the boot prompt. */ 6462306a36Sopenharmony_cistruct linux_arguments_v0 { 6562306a36Sopenharmony_ci char *argv[8]; 6662306a36Sopenharmony_ci char args[100]; 6762306a36Sopenharmony_ci char boot_dev[2]; 6862306a36Sopenharmony_ci int boot_dev_ctrl; 6962306a36Sopenharmony_ci int boot_dev_unit; 7062306a36Sopenharmony_ci int dev_partition; 7162306a36Sopenharmony_ci char *kernel_file_name; 7262306a36Sopenharmony_ci void *aieee1; /* XXX */ 7362306a36Sopenharmony_ci}; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci/* V2 and up boot things. */ 7662306a36Sopenharmony_cistruct linux_bootargs_v2 { 7762306a36Sopenharmony_ci char **bootpath; 7862306a36Sopenharmony_ci char **bootargs; 7962306a36Sopenharmony_ci int *fd_stdin; 8062306a36Sopenharmony_ci int *fd_stdout; 8162306a36Sopenharmony_ci}; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/* The top level PROM vector. */ 8462306a36Sopenharmony_cistruct linux_romvec { 8562306a36Sopenharmony_ci /* Version numbers. */ 8662306a36Sopenharmony_ci unsigned int pv_magic_cookie; 8762306a36Sopenharmony_ci unsigned int pv_romvers; 8862306a36Sopenharmony_ci unsigned int pv_plugin_revision; 8962306a36Sopenharmony_ci unsigned int pv_printrev; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci /* Version 0 memory descriptors. */ 9262306a36Sopenharmony_ci struct linux_mem_v0 pv_v0mem; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci /* Node operations. */ 9562306a36Sopenharmony_ci struct linux_nodeops *pv_nodeops; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci char **pv_bootstr; 9862306a36Sopenharmony_ci struct linux_dev_v0_funcs pv_v0devops; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci char *pv_stdin; 10162306a36Sopenharmony_ci char *pv_stdout; 10262306a36Sopenharmony_ci#define PROMDEV_KBD 0 /* input from keyboard */ 10362306a36Sopenharmony_ci#define PROMDEV_SCREEN 0 /* output to screen */ 10462306a36Sopenharmony_ci#define PROMDEV_TTYA 1 /* in/out to ttya */ 10562306a36Sopenharmony_ci#define PROMDEV_TTYB 2 /* in/out to ttyb */ 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci /* Blocking getchar/putchar. NOT REENTRANT! (grr) */ 10862306a36Sopenharmony_ci int (*pv_getchar)(void); 10962306a36Sopenharmony_ci void (*pv_putchar)(int ch); 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci /* Non-blocking variants. */ 11262306a36Sopenharmony_ci int (*pv_nbgetchar)(void); 11362306a36Sopenharmony_ci int (*pv_nbputchar)(int ch); 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci void (*pv_putstr)(char *str, int len); 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci /* Miscellany. */ 11862306a36Sopenharmony_ci void (*pv_reboot)(char *bootstr); 11962306a36Sopenharmony_ci void (*pv_printf)(__const__ char *fmt, ...); 12062306a36Sopenharmony_ci void (*pv_abort)(void); 12162306a36Sopenharmony_ci __volatile__ int *pv_ticks; 12262306a36Sopenharmony_ci void (*pv_halt)(void); 12362306a36Sopenharmony_ci void (**pv_synchook)(void); 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci /* Evaluate a forth string, not different proto for V0 and V2->up. */ 12662306a36Sopenharmony_ci union { 12762306a36Sopenharmony_ci void (*v0_eval)(int len, char *str); 12862306a36Sopenharmony_ci void (*v2_eval)(char *str); 12962306a36Sopenharmony_ci } pv_fortheval; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci struct linux_arguments_v0 **pv_v0bootargs; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci /* Get ether address. */ 13462306a36Sopenharmony_ci unsigned int (*pv_enaddr)(int d, char *enaddr); 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci struct linux_bootargs_v2 pv_v2bootargs; 13762306a36Sopenharmony_ci struct linux_dev_v2_funcs pv_v2devops; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci int filler[15]; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci /* This one is sun4c/sun4 only. */ 14262306a36Sopenharmony_ci void (*pv_setctxt)(int ctxt, char *va, int pmeg); 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci /* Prom version 3 Multiprocessor routines. This stuff is crazy. 14562306a36Sopenharmony_ci * No joke. Calling these when there is only one cpu probably 14662306a36Sopenharmony_ci * crashes the machine, have to test this. :-) 14762306a36Sopenharmony_ci */ 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci /* v3_cpustart() will start the cpu 'whichcpu' in mmu-context 15062306a36Sopenharmony_ci * 'thiscontext' executing at address 'prog_counter' 15162306a36Sopenharmony_ci */ 15262306a36Sopenharmony_ci int (*v3_cpustart)(unsigned int whichcpu, int ctxtbl_ptr, 15362306a36Sopenharmony_ci int thiscontext, char *prog_counter); 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci /* v3_cpustop() will cause cpu 'whichcpu' to stop executing 15662306a36Sopenharmony_ci * until a resume cpu call is made. 15762306a36Sopenharmony_ci */ 15862306a36Sopenharmony_ci int (*v3_cpustop)(unsigned int whichcpu); 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci /* v3_cpuidle() will idle cpu 'whichcpu' until a stop or 16162306a36Sopenharmony_ci * resume cpu call is made. 16262306a36Sopenharmony_ci */ 16362306a36Sopenharmony_ci int (*v3_cpuidle)(unsigned int whichcpu); 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci /* v3_cpuresume() will resume processor 'whichcpu' executing 16662306a36Sopenharmony_ci * starting with whatever 'pc' and 'npc' were left at the 16762306a36Sopenharmony_ci * last 'idle' or 'stop' call. 16862306a36Sopenharmony_ci */ 16962306a36Sopenharmony_ci int (*v3_cpuresume)(unsigned int whichcpu); 17062306a36Sopenharmony_ci}; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci/* Routines for traversing the prom device tree. */ 17362306a36Sopenharmony_cistruct linux_nodeops { 17462306a36Sopenharmony_ci phandle (*no_nextnode)(phandle node); 17562306a36Sopenharmony_ci phandle (*no_child)(phandle node); 17662306a36Sopenharmony_ci int (*no_proplen)(phandle node, const char *name); 17762306a36Sopenharmony_ci int (*no_getprop)(phandle node, const char *name, char *val); 17862306a36Sopenharmony_ci int (*no_setprop)(phandle node, const char *name, char *val, int len); 17962306a36Sopenharmony_ci char * (*no_nextprop)(phandle node, char *name); 18062306a36Sopenharmony_ci}; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci/* More fun PROM structures for device probing. */ 18362306a36Sopenharmony_ci#if defined(__sparc__) && defined(__arch64__) 18462306a36Sopenharmony_ci#define PROMREG_MAX 24 18562306a36Sopenharmony_ci#define PROMVADDR_MAX 16 18662306a36Sopenharmony_ci#define PROMINTR_MAX 32 18762306a36Sopenharmony_ci#else 18862306a36Sopenharmony_ci#define PROMREG_MAX 16 18962306a36Sopenharmony_ci#define PROMVADDR_MAX 16 19062306a36Sopenharmony_ci#define PROMINTR_MAX 15 19162306a36Sopenharmony_ci#endif 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_cistruct linux_prom_registers { 19462306a36Sopenharmony_ci unsigned int which_io; /* hi part of physical address */ 19562306a36Sopenharmony_ci unsigned int phys_addr; /* The physical address of this register */ 19662306a36Sopenharmony_ci unsigned int reg_size; /* How many bytes does this register take up? */ 19762306a36Sopenharmony_ci}; 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cistruct linux_prom64_registers { 20062306a36Sopenharmony_ci unsigned long phys_addr; 20162306a36Sopenharmony_ci unsigned long reg_size; 20262306a36Sopenharmony_ci}; 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_cistruct linux_prom_irqs { 20562306a36Sopenharmony_ci int pri; /* IRQ priority */ 20662306a36Sopenharmony_ci int vector; /* This is foobar, what does it do? */ 20762306a36Sopenharmony_ci}; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci/* Element of the "ranges" vector */ 21062306a36Sopenharmony_cistruct linux_prom_ranges { 21162306a36Sopenharmony_ci unsigned int ot_child_space; 21262306a36Sopenharmony_ci unsigned int ot_child_base; /* Bus feels this */ 21362306a36Sopenharmony_ci unsigned int ot_parent_space; 21462306a36Sopenharmony_ci unsigned int ot_parent_base; /* CPU looks from here */ 21562306a36Sopenharmony_ci unsigned int or_size; 21662306a36Sopenharmony_ci}; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci/* 21962306a36Sopenharmony_ci * Ranges and reg properties are a bit different for PCI. 22062306a36Sopenharmony_ci */ 22162306a36Sopenharmony_ci#if defined(__sparc__) && defined(__arch64__) 22262306a36Sopenharmony_cistruct linux_prom_pci_registers { 22362306a36Sopenharmony_ci unsigned int phys_hi; 22462306a36Sopenharmony_ci unsigned int phys_mid; 22562306a36Sopenharmony_ci unsigned int phys_lo; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci unsigned int size_hi; 22862306a36Sopenharmony_ci unsigned int size_lo; 22962306a36Sopenharmony_ci}; 23062306a36Sopenharmony_ci#else 23162306a36Sopenharmony_cistruct linux_prom_pci_registers { 23262306a36Sopenharmony_ci /* 23362306a36Sopenharmony_ci * We don't know what information this field contain. 23462306a36Sopenharmony_ci * We guess, PCI device function is in bits 15:8 23562306a36Sopenharmony_ci * So, ... 23662306a36Sopenharmony_ci */ 23762306a36Sopenharmony_ci unsigned int which_io; /* Let it be which_io */ 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci unsigned int phys_hi; 24062306a36Sopenharmony_ci unsigned int phys_lo; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci unsigned int size_hi; 24362306a36Sopenharmony_ci unsigned int size_lo; 24462306a36Sopenharmony_ci}; 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci#endif 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_cistruct linux_prom_pci_ranges { 24962306a36Sopenharmony_ci unsigned int child_phys_hi; /* Only certain bits are encoded here. */ 25062306a36Sopenharmony_ci unsigned int child_phys_mid; 25162306a36Sopenharmony_ci unsigned int child_phys_lo; 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci unsigned int parent_phys_hi; 25462306a36Sopenharmony_ci unsigned int parent_phys_lo; 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci unsigned int size_hi; 25762306a36Sopenharmony_ci unsigned int size_lo; 25862306a36Sopenharmony_ci}; 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_cistruct linux_prom_pci_intmap { 26162306a36Sopenharmony_ci unsigned int phys_hi; 26262306a36Sopenharmony_ci unsigned int phys_mid; 26362306a36Sopenharmony_ci unsigned int phys_lo; 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci unsigned int interrupt; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci int cnode; 26862306a36Sopenharmony_ci unsigned int cinterrupt; 26962306a36Sopenharmony_ci}; 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_cistruct linux_prom_pci_intmask { 27262306a36Sopenharmony_ci unsigned int phys_hi; 27362306a36Sopenharmony_ci unsigned int phys_mid; 27462306a36Sopenharmony_ci unsigned int phys_lo; 27562306a36Sopenharmony_ci unsigned int interrupt; 27662306a36Sopenharmony_ci}; 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci#endif /* !(__ASSEMBLY__) */ 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci#endif /* !(__SPARC_OPENPROM_H) */ 281