diff options
Diffstat (limited to 'arch/sparc/include/asm/prom.h')
| -rw-r--r-- | arch/sparc/include/asm/prom.h | 297 | 
1 files changed, 297 insertions, 0 deletions
| diff --git a/arch/sparc/include/asm/prom.h b/arch/sparc/include/asm/prom.h new file mode 100644 index 000000000..d55cc863d --- /dev/null +++ b/arch/sparc/include/asm/prom.h @@ -0,0 +1,297 @@ +/* OpenProm defines mainly taken from linux kernel header files + * + * openprom.h:  Prom structures and defines for access to the OPENBOOT + *              prom routines and data areas. + * + * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) + * Copyright (C) 2007 Daniel Hellstrom (daniel@gaisler.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + */ + +#ifndef __SPARC_OPENPROM_H__ +#define __SPARC_OPENPROM_H__ + +/* Empirical constants... */ +#define	LINUX_OPPROM_MAGIC      0x10010407 + +#ifndef __ASSEMBLY__ +/* V0 prom device operations. */ +struct linux_dev_v0_funcs { +	int (*v0_devopen) (char *device_str); +	int (*v0_devclose) (int dev_desc); +	int (*v0_rdblkdev) (int dev_desc, int num_blks, int blk_st, char *buf); +	int (*v0_wrblkdev) (int dev_desc, int num_blks, int blk_st, char *buf); +	int (*v0_wrnetdev) (int dev_desc, int num_bytes, char *buf); +	int (*v0_rdnetdev) (int dev_desc, int num_bytes, char *buf); +	int (*v0_rdchardev) (int dev_desc, int num_bytes, int dummy, char *buf); +	int (*v0_wrchardev) (int dev_desc, int num_bytes, int dummy, char *buf); +	int (*v0_seekdev) (int dev_desc, long logical_offst, int from); +}; + +/* V2 and later prom device operations. */ +struct linux_dev_v2_funcs { +	int (*v2_inst2pkg) (int d);	/* Convert ihandle to phandle */ +	char *(*v2_dumb_mem_alloc) (char *va, unsigned sz); +	void (*v2_dumb_mem_free) (char *va, unsigned sz); + +	/* To map devices into virtual I/O space. */ +	char *(*v2_dumb_mmap) (char *virta, int which_io, unsigned paddr, +			       unsigned sz); +	void (*v2_dumb_munmap) (char *virta, unsigned size); + +	int (*v2_dev_open) (char *devpath); +	void (*v2_dev_close) (int d); +	int (*v2_dev_read) (int d, char *buf, int nbytes); +	int (*v2_dev_write) (int d, char *buf, int nbytes); +	int (*v2_dev_seek) (int d, int hi, int lo); + +	/* Never issued (multistage load support) */ +	void (*v2_wheee2) (void); +	void (*v2_wheee3) (void); +}; + +struct linux_mlist_v0 { +	struct linux_mlist_v0 *theres_more; +	char *start_adr; +	unsigned num_bytes; +}; + +struct linux_mem_v0 { +	struct linux_mlist_v0 **v0_totphys; +	struct linux_mlist_v0 **v0_prommap; +	struct linux_mlist_v0 **v0_available;	/* What we can use */ +}; + +/* Arguments sent to the kernel from the boot prompt. */ +struct linux_arguments_v0 { +	char *argv[8]; +	char args[100]; +	char boot_dev[2]; +	int boot_dev_ctrl; +	int boot_dev_unit; +	int dev_partition; +	char *kernel_file_name; +	void *aieee1;		/* XXX */ +}; + +/* V2 and up boot things. */ +struct linux_bootargs_v2 { +	char **bootpath; +	char **bootargs; +	int *fd_stdin; +	int *fd_stdout; +}; + +/* The top level PROM vector. */ +struct linux_romvec { +	/* Version numbers. */ +	unsigned int pv_magic_cookie; +	unsigned int pv_romvers; +	unsigned int pv_plugin_revision; +	unsigned int pv_printrev; + +	/* Version 0 memory descriptors. */ +	struct linux_mem_v0 pv_v0mem; + +	/* Node operations. */ +	struct linux_nodeops *pv_nodeops; + +	char **pv_bootstr; +	struct linux_dev_v0_funcs pv_v0devops; + +	char *pv_stdin; +	char *pv_stdout; +#define	PROMDEV_KBD	0	/* input from keyboard */ +#define	PROMDEV_SCREEN	0	/* output to screen */ +#define	PROMDEV_TTYA	1	/* in/out to ttya */ +#define	PROMDEV_TTYB	2	/* in/out to ttyb */ + +	/* Blocking getchar/putchar.  NOT REENTRANT! (grr) */ +	int (*pv_getchar) (void); +	void (*pv_putchar) (int ch); + +	/* Non-blocking variants. */ +	int (*pv_nbgetchar) (void); +	int (*pv_nbputchar) (int ch); + +	void (*pv_putstr) (char *str, int len); + +	/* Miscellany. */ +	void (*pv_reboot) (char *bootstr); +	void (*pv_printf) (__const__ char *fmt, ...); +	void (*pv_abort) (void); +	__volatile__ int *pv_ticks; +	void (*pv_halt) (void); +	void (**pv_synchook) (void); + +	/* Evaluate a forth string, not different proto for V0 and V2->up. */ +	union { +		void (*v0_eval) (int len, char *str); +		void (*v2_eval) (char *str); +	} pv_fortheval; + +	struct linux_arguments_v0 **pv_v0bootargs; + +	/* Get ether address. */ +	unsigned int (*pv_enaddr) (int d, char *enaddr); + +	struct linux_bootargs_v2 pv_v2bootargs; +	struct linux_dev_v2_funcs pv_v2devops; + +	int filler[15]; + +	/* This one is sun4c/sun4 only. */ +	void (*pv_setctxt) (int ctxt, char *va, int pmeg); + +	/* Prom version 3 Multiprocessor routines. This stuff is crazy. +	 * No joke. Calling these when there is only one cpu probably +	 * crashes the machine, have to test this. :-) +	 */ + +	/* v3_cpustart() will start the cpu 'whichcpu' in mmu-context +	 * 'thiscontext' executing at address 'prog_counter' +	 */ +	int (*v3_cpustart) (unsigned int whichcpu, int ctxtbl_ptr, +			    int thiscontext, char *prog_counter); + +	/* v3_cpustop() will cause cpu 'whichcpu' to stop executing +	 * until a resume cpu call is made. +	 */ +	int (*v3_cpustop) (unsigned int whichcpu); + +	/* v3_cpuidle() will idle cpu 'whichcpu' until a stop or +	 * resume cpu call is made. +	 */ +	int (*v3_cpuidle) (unsigned int whichcpu); + +	/* v3_cpuresume() will resume processor 'whichcpu' executing +	 * starting with whatever 'pc' and 'npc' were left at the +	 * last 'idle' or 'stop' call. +	 */ +	int (*v3_cpuresume) (unsigned int whichcpu); +}; + +/* Routines for traversing the prom device tree. */ +struct linux_nodeops { +	int (*no_nextnode) (int node); +	int (*no_child) (int node); +	int (*no_proplen) (int node, char *name); +	int (*no_getprop) (int node, char *name, char *val); +	int (*no_setprop) (int node, char *name, char *val, int len); +	char *(*no_nextprop) (int node, char *name); +}; + +/* More fun PROM structures for device probing. */ +#define PROMREG_MAX     16 +#define PROMVADDR_MAX   16 +#define PROMINTR_MAX    15 + +struct linux_prom_registers { +	unsigned int which_io;	/* is this in OBIO space? */ +	unsigned int phys_addr;	/* The physical address of this register */ +	unsigned int reg_size;	/* How many bytes does this register take up? */ +}; + +struct linux_prom_irqs { +	int pri;		/* IRQ priority */ +	int vector;		/* This is foobar, what does it do? */ +}; + +/* Element of the "ranges" vector */ +struct linux_prom_ranges { +	unsigned int ot_child_space; +	unsigned int ot_child_base;	/* Bus feels this */ +	unsigned int ot_parent_space; +	unsigned int ot_parent_base;	/* CPU looks from here */ +	unsigned int or_size; +}; + +/* Ranges and reg properties are a bit different for PCI. */ +struct linux_prom_pci_registers { +	/* +	 * We don't know what information this field contain. +	 * We guess, PCI device function is in bits 15:8 +	 * So, ... +	 */ +	unsigned int which_io;	/* Let it be which_io */ + +	unsigned int phys_hi; +	unsigned int phys_lo; + +	unsigned int size_hi; +	unsigned int size_lo; +}; + +struct linux_prom_pci_ranges { +	unsigned int child_phys_hi;	/* Only certain bits are encoded here. */ +	unsigned int child_phys_mid; +	unsigned int child_phys_lo; + +	unsigned int parent_phys_hi; +	unsigned int parent_phys_lo; + +	unsigned int size_hi; +	unsigned int size_lo; +}; + +struct linux_prom_pci_assigned_addresses { +	unsigned int which_io; + +	unsigned int phys_hi; +	unsigned int phys_lo; + +	unsigned int size_hi; +	unsigned int size_lo; +}; + +struct linux_prom_ebus_ranges { +	unsigned int child_phys_hi; +	unsigned int child_phys_lo; + +	unsigned int parent_phys_hi; +	unsigned int parent_phys_mid; +	unsigned int parent_phys_lo; + +	unsigned int size; +}; + +/* Offset into the EEPROM where the id PROM is located on the 4c */ +#define IDPROM_OFFSET  0x7d8 + +/* On sun4m; physical. */ +/* MicroSPARC(-II) does not decode 31rd bit, but it works. */ +#define IDPROM_OFFSET_M  0xfd8 + +struct idprom { +	unsigned char id_format;	/* Format identifier (always 0x01) */ +	unsigned char id_machtype;	/* Machine type */ +	unsigned char id_ethaddr[6];	/* Hardware ethernet address */ +	long id_date;		/* Date of manufacture */ +	unsigned int id_sernum:24;	/* Unique serial number */ +	unsigned char id_cksum;	/* Checksum - xor of the data bytes */ +	unsigned char reserved[16]; +}; + +extern struct idprom *idprom; +extern void idprom_init(void); + +#define IDPROM_SIZE  (sizeof(struct idprom)) + +#endif				/* !(__ASSEMBLY__) */ + +#endif |