1 /* $Id: openprom.h,v 1.20 1997/04/10 06:41:06 davem Exp $ */ 2 #ifndef __SPARC_OPENPROM_H 3 #define __SPARC_OPENPROM_H 5 /* openprom.h: Prom structures and defines for access to the OPENBOOT 6 * prom routines and data areas. 8 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 11 /* Empirical constants... */ 12 #define KADB_DEBUGGER_BEGVM 0xffc00000/* Where kern debugger is in virt-mem */ 13 #define LINUX_OPPROM_BEGVM 0xffd00000 14 #define LINUX_OPPROM_ENDVM 0xfff00000 15 #define LINUX_OPPROM_MAGIC 0x10010407 18 /* V0 prom device operations. */ 19 struct linux_dev_v0_funcs
{ 20 int(*v0_devopen
)(char*device_str
); 21 int(*v0_devclose
)(int dev_desc
); 22 int(*v0_rdblkdev
)(int dev_desc
,int num_blks
,int blk_st
,char*buf
); 23 int(*v0_wrblkdev
)(int dev_desc
,int num_blks
,int blk_st
,char*buf
); 24 int(*v0_wrnetdev
)(int dev_desc
,int num_bytes
,char*buf
); 25 int(*v0_rdnetdev
)(int dev_desc
,int num_bytes
,char*buf
); 26 int(*v0_rdchardev
)(int dev_desc
,int num_bytes
,int dummy
,char*buf
); 27 int(*v0_wrchardev
)(int dev_desc
,int num_bytes
,int dummy
,char*buf
); 28 int(*v0_seekdev
)(int dev_desc
,long logical_offst
,int from
); 31 /* V2 and later prom device operations. */ 32 struct linux_dev_v2_funcs
{ 33 int(*v2_inst2pkg
)(int d
);/* Convert ihandle to phandle */ 34 char* (*v2_dumb_mem_alloc
)(char*va
,unsigned sz
); 35 void(*v2_dumb_mem_free
)(char*va
,unsigned sz
); 37 /* To map devices into virtual I/O space. */ 38 char* (*v2_dumb_mmap
)(char*virta
,int which_io
,unsigned paddr
,unsigned sz
); 39 void(*v2_dumb_munmap
)(char*virta
,unsigned size
); 41 int(*v2_dev_open
)(char*devpath
); 42 void(*v2_dev_close
)(int d
); 43 int(*v2_dev_read
)(int d
,char*buf
,int nbytes
); 44 int(*v2_dev_write
)(int d
,char*buf
,int nbytes
); 45 int(*v2_dev_seek
)(int d
,int hi
,int lo
); 47 /* Never issued (multistage load support) */ 48 void(*v2_wheee2
)(void); 49 void(*v2_wheee3
)(void); 52 struct linux_mlist_v0
{ 53 struct linux_mlist_v0
*theres_more
; 59 struct linux_mlist_v0
**v0_totphys
; 60 struct linux_mlist_v0
**v0_prommap
; 61 struct linux_mlist_v0
**v0_available
;/* What we can use */ 64 /* Arguments sent to the kernel from the boot prompt. */ 65 struct linux_arguments_v0
{ 72 char*kernel_file_name
; 76 /* V2 and up boot things. */ 77 struct linux_bootargs_v2
{ 84 /* The top level PROM vector. */ 86 /* Version numbers. */ 87 unsigned int pv_magic_cookie
; 88 unsigned int pv_romvers
; 89 unsigned int pv_plugin_revision
; 90 unsigned int pv_printrev
; 92 /* Version 0 memory descriptors. */ 93 struct linux_mem_v0 pv_v0mem
; 95 /* Node operations. */ 96 struct linux_nodeops
*pv_nodeops
; 99 struct linux_dev_v0_funcs pv_v0devops
; 103 #define PROMDEV_KBD 0/* input from keyboard */ 104 #define PROMDEV_SCREEN 0/* output to screen */ 105 #define PROMDEV_TTYA 1/* in/out to ttya */ 106 #define PROMDEV_TTYB 2/* in/out to ttyb */ 108 /* Blocking getchar/putchar. NOT REENTRANT! (grr) */ 109 int(*pv_getchar
)(void); 110 void(*pv_putchar
)(int ch
); 112 /* Non-blocking variants. */ 113 int(*pv_nbgetchar
)(void); 114 int(*pv_nbputchar
)(int ch
); 116 void(*pv_putstr
)(char*str
,int len
); 119 void(*pv_reboot
)(char*bootstr
); 120 void(*pv_printf
)(__const__
char*fmt
, ...); 121 void(*pv_abort
)(void); 122 __volatile__
int*pv_ticks
; 123 void(*pv_halt
)(void); 124 void(**pv_synchook
)(void); 126 /* Evaluate a forth string, not different proto for V0 and V2->up. */ 128 void(*v0_eval
)(int len
,char*str
); 129 void(*v2_eval
)(char*str
); 132 struct linux_arguments_v0
**pv_v0bootargs
; 134 /* Get ether address. */ 135 unsigned int(*pv_enaddr
)(int d
,char*enaddr
); 137 struct linux_bootargs_v2 pv_v2bootargs
; 138 struct linux_dev_v2_funcs pv_v2devops
; 142 /* This one is sun4c/sun4 only. */ 143 void(*pv_setctxt
)(int ctxt
,char*va
,int pmeg
); 145 /* Prom version 3 Multiprocessor routines. This stuff is crazy. 146 * No joke. Calling these when there is only one cpu probably 147 * crashes the machine, have to test this. :-) 150 /* v3_cpustart() will start the cpu 'whichcpu' in mmu-context 151 * 'thiscontext' executing at address 'prog_counter' 153 int(*v3_cpustart
)(unsigned int whichcpu
,int ctxtbl_ptr
, 154 int thiscontext
,char*prog_counter
); 156 /* v3_cpustop() will cause cpu 'whichcpu' to stop executing 157 * until a resume cpu call is made. 159 int(*v3_cpustop
)(unsigned int whichcpu
); 161 /* v3_cpuidle() will idle cpu 'whichcpu' until a stop or 162 * resume cpu call is made. 164 int(*v3_cpuidle
)(unsigned int whichcpu
); 166 /* v3_cpuresume() will resume processor 'whichcpu' executing 167 * starting with whatever 'pc' and 'npc' were left at the 168 * last 'idle' or 'stop' call. 170 int(*v3_cpuresume
)(unsigned int whichcpu
); 173 /* Routines for traversing the prom device tree. */ 174 struct linux_nodeops
{ 175 int(*no_nextnode
)(int node
); 176 int(*no_child
)(int node
); 177 int(*no_proplen
)(int node
,char*name
); 178 int(*no_getprop
)(int node
,char*name
,char*val
); 179 int(*no_setprop
)(int node
,char*name
,char*val
,int len
); 180 char* (*no_nextprop
)(int node
,char*name
); 183 /* More fun PROM structures for device probing. */ 184 #define PROMREG_MAX 16 185 #define PROMVADDR_MAX 16 186 #define PROMINTR_MAX 15 188 struct linux_prom_registers
{ 189 unsigned int which_io
;/* is this in OBIO space? */ 190 unsigned int phys_addr
;/* The physical address of this register */ 191 unsigned int reg_size
;/* How many bytes does this register take up? */ 194 struct linux_prom_irqs
{ 195 int pri
;/* IRQ priority */ 196 int vector
;/* This is foobar, what does it do? */ 199 /* Element of the "ranges" vector */ 200 struct linux_prom_ranges
{ 201 unsigned int ot_child_space
; 202 unsigned int ot_child_base
;/* Bus feels this */ 203 unsigned int ot_parent_space
; 204 unsigned int ot_parent_base
;/* CPU looks from here */ 205 unsigned int or_size
; 208 #endif/* !(__ASSEMBLY__) */ 210 #endif/* !(__SPARC_OPENPROM_H) */