xref: /openbsd-src/sys/arch/hppa/include/pdc.h (revision 36fd90dcf1acf2ddb4ef5dbabe5313b3a8d46ee2)
1*36fd90dcSjsg /*	$OpenBSD: pdc.h,v 1.37 2021/03/11 11:16:57 jsg Exp $	*/
29c0b8818Smickey 
39c0b8818Smickey /*
49c0b8818Smickey  * Copyright (c) 1990 mt Xinu, Inc.  All rights reserved.
59c0b8818Smickey  * Copyright (c) 1990,1991,1992,1994 University of Utah.  All rights reserved.
69c0b8818Smickey  *
79c0b8818Smickey  * Permission to use, copy, modify and distribute this software is hereby
89c0b8818Smickey  * granted provided that (1) source code retains these copyright, permission,
99c0b8818Smickey  * and disclaimer notices, and (2) redistributions including binaries
109c0b8818Smickey  * reproduce the notices in supporting documentation, and (3) all advertising
119c0b8818Smickey  * materials mentioning features or use of this software display the following
129c0b8818Smickey  * acknowledgement: ``This product includes software developed by the
139c0b8818Smickey  * Computer Systems Laboratory at the University of Utah.''
149c0b8818Smickey  *
159c0b8818Smickey  * Copyright (c) 1990 mt Xinu, Inc.
169c0b8818Smickey  * This file may be freely distributed in any form as long as
179c0b8818Smickey  * this copyright notice is included.
189c0b8818Smickey  * MTXINU, THE UNIVERSITY OF UTAH, AND CSL PROVIDE THIS SOFTWARE ``AS
199c0b8818Smickey  * IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
209c0b8818Smickey  * WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND
219c0b8818Smickey  * FITNESS FOR A PARTICULAR PURPOSE.
229c0b8818Smickey  *
239c0b8818Smickey  * CSL requests users of this software to return to csl-dist@cs.utah.edu any
249c0b8818Smickey  * improvements that they make and grant CSL redistribution rights.
259c0b8818Smickey  *
269c0b8818Smickey  *	Utah $Hdr: pdc.h 1.12 94/12/14$
27b79994e1Smickey  *	Author: Jeff Forys (CSS), Dave Slattengren (mtXinu)
289c0b8818Smickey  */
299c0b8818Smickey 
30cddff70fSmickey #ifndef	_MACHINE_PDC_H_
31cddff70fSmickey #define _MACHINE_PDC_H_
329c0b8818Smickey 
339c0b8818Smickey /*
349c0b8818Smickey  * Definitions for interaction with "Processor Dependent Code",
359c0b8818Smickey  * which is a set of ROM routines used to provide information to the OS.
369c0b8818Smickey  * Also includes definitions for the layout of "Page Zero" memory when
379c0b8818Smickey  * boot code is invoked.
389c0b8818Smickey  *
399c0b8818Smickey  * Glossary:
409c0b8818Smickey  *	PDC:	Processor Dependent Code (ROM or copy of ROM).
419c0b8818Smickey  *	IODC:	I/O Dependent Code (module-type dependent code).
429c0b8818Smickey  *	IPL:	Boot program (loaded into memory from boot device).
439c0b8818Smickey  *	HPA:	Hard Physical Address (hardwired address).
449c0b8818Smickey  *	SPA:	Soft Physical Address (reconfigurable address).
45c325d8d3Smickey  *
46c325d8d3Smickey  *
47c325d8d3Smickey  *
48c325d8d3Smickey  *
49c325d8d3Smickey  * Definitions for talking to IODC (I/O Dependent Code).
50c325d8d3Smickey  *
51c325d8d3Smickey  * The PDC is used to load I/O Dependent Code from a particular module.
52c325d8d3Smickey  * I/O Dependent Code is module-type dependent software which provides
53c325d8d3Smickey  * a uniform way to identify, initialize, and access a module (and in
54c325d8d3Smickey  * some cases, their devices).
559c0b8818Smickey  */
569c0b8818Smickey 
579c0b8818Smickey /*
589c0b8818Smickey  * Our Initial Memory Module is laid out as follows.
599c0b8818Smickey  *
609c0b8818Smickey  *	0x000		+--------------------+
619c0b8818Smickey  *			| Page Zero (iomod.h)|
629c0b8818Smickey  *	0x800		+--------------------+
639c0b8818Smickey  *			|                    |
649c0b8818Smickey  *			|                    |
659c0b8818Smickey  *			|        PDC         |
669c0b8818Smickey  *			|                    |
679c0b8818Smickey  *			|                    |
689c0b8818Smickey  *	MEM_FREE	+--------------------+
699c0b8818Smickey  *			|                    |
709c0b8818Smickey  *			|    Console IODC    |
719c0b8818Smickey  *			|                    |
722706414aSmickey  *	MEM_FREE+64k	+--------------------+
739c0b8818Smickey  *			|                    |
749c0b8818Smickey  *			|  Boot Device IODC  |
759c0b8818Smickey  *			|                    |
769c0b8818Smickey  *	IPL_START	+--------------------+
779c0b8818Smickey  *			|                    |
789c0b8818Smickey  *			| IPL Code or Kernel |
799c0b8818Smickey  *			|                    |
809c0b8818Smickey  *			+--------------------+
819c0b8818Smickey  *
829c0b8818Smickey  * Restrictions:
839c0b8818Smickey  *	MEM_FREE (pagezero.mem_free) can be no greater than 32K.
849c0b8818Smickey  *	The PDC may use up to MEM_FREE + 32K (for Console & Boot IODC).
859c0b8818Smickey  *	IPL_START must be less than or equal to 64K.
869c0b8818Smickey  *
879c0b8818Smickey  * The IPL (boot) Code is immediately relocated to RELOC (check
88c325d8d3Smickey  * "../stand/Makefile") to make way for the Kernel.
899c0b8818Smickey  */
909c0b8818Smickey 
912706414aSmickey #define	IODC_MAXSIZE	(16 * 4 * 1024)	/* maximum size of IODC */
9249ee3cc5Smickey #define	IODC_MINIOSIZ	64		/* minimum buffer size for IODC call */
9349ee3cc5Smickey #define	IODC_MAXIOSIZ	(64 * 1024)	/* maximum buffer size for IODC call */
94d64e9ed6Smickey #define	IODC_IOSIZ	(16 * 1024)
959c0b8818Smickey 
96fee2a480Sderaadt #define	PDC_ALIGNMENT	__attribute__ ((__aligned__(64)))
97184e2458Sderaadt #define	PDC_STACKSIZE	(4 * PAGE_SIZE)
989c0b8818Smickey 
999c0b8818Smickey /*
100c325d8d3Smickey  * The PDC Entry Points and their arguments...
1019c0b8818Smickey  */
1029c0b8818Smickey 
1039c0b8818Smickey #define	PDC_POW_FAIL	1	/* prepare for power failure */
1049c0b8818Smickey #define PDC_POW_FAIL_DFLT	0
1059c0b8818Smickey 
1069c0b8818Smickey #define	PDC_CHASSIS	2	/* update chassis display (see below) */
1079c0b8818Smickey #define	PDC_CHASSIS_DISP	0	/* update display */
1089c0b8818Smickey #define	PDC_CHASSIS_WARN	1	/* return warnings */
1099c0b8818Smickey #define	PDC_CHASSIS_ALL		2	/* update display & return warnings */
1109b92c7dfSkettenis #define	PDC_CHASSIS_INFO	128	/* return led/lcd info */
1119c0b8818Smickey 
1129c0b8818Smickey #define	PDC_PIM		3	/* access Processor Internal Memory */
1139c0b8818Smickey #define	PDC_PIM_HPMC		0	/* read High Pri Mach Chk data */
1149c0b8818Smickey #define	PDC_PIM_SIZE		1	/* return size */
1159c0b8818Smickey #define	PDC_PIM_LPMC		2	/* read Low Pri Mach Chk data */
1169c0b8818Smickey #define	PDC_PIM_SBD		3	/* read soft boot data */
1179c0b8818Smickey #define	PDC_PIM_TOC		4	/* read TOC data (used to use HPMC) */
1189c0b8818Smickey 
1199c0b8818Smickey #define	PDC_MODEL	4	/* processor model number info */
1209c0b8818Smickey #define	PDC_MODEL_INFO		0	/* processor model number info */
1219c0b8818Smickey #define	PDC_MODEL_BOOTID	1	/* set BOOT_ID of processor */
1229c0b8818Smickey #define	PDC_MODEL_COMP		2	/* return component version numbers */
1239c0b8818Smickey #define	PDC_MODEL_MODEL		3	/* return system model information */
1249c0b8818Smickey #define	PDC_MODEL_ENSPEC	4	/* enable product-specific instrs */
1259c0b8818Smickey #define	PDC_MODEL_DISPEC	5	/* disable product-specific instrs */
12649ee3cc5Smickey #define	PDC_MODEL_CPUID		6	/* return CPU versions */
127*36fd90dcSjsg #define	PDC_MODEL_CPBALITIES	7	/* return capabilities */
12831aa52bdSmickey #define	PDC_MODEL_GETBOOTOPTS	8	/* return boot test options */
12931aa52bdSmickey #define	PDC_MODEL_SETBOOTOPTS	9	/* set boot test options */
1309c0b8818Smickey 
1319c0b8818Smickey #define	PDC_CACHE	5	/* return cache and TLB params */
13241f0735cSmickey #define	PDC_CACHE_DFLT		0	/* return parameters */
13341f0735cSmickey #define	PDC_CACHE_SETCS		1	/* set coherence state */
13441f0735cSmickey #define	PDC_CACHE_GETSPIDB	2	/* get space-id bits */
1359c0b8818Smickey 
1369c0b8818Smickey #define	PDC_HPA		6	/* return HPA of processor */
1379c0b8818Smickey #define	PDC_HPA_DFLT		0
13849ee3cc5Smickey #define	PDC_HPA_MODULES		1
1399c0b8818Smickey 
1409c0b8818Smickey #define	PDC_COPROC	7	/* return co-processor configuration */
1419c0b8818Smickey #define	PDC_COPROC_DFLT		0
1429c0b8818Smickey 
1439c0b8818Smickey #define	PDC_IODC	8	/* talk to IODC */
1449c0b8818Smickey #define	PDC_IODC_READ		0	/* read IODC entry point */
145c325d8d3Smickey #define		IODC_DATA	0	/* get first 16 bytes from mod IODC */
146c325d8d3Smickey #define		IODC_INIT	3	/* initialize (see options below) */
147c325d8d3Smickey #define		IODC_INIT_FIRST	2	/* find first device on module */
148c325d8d3Smickey #define		IODC_INIT_NEXT	3	/* find subsequent devices on module */
149c325d8d3Smickey #define		IODC_INIT_ALL	4	/* initialize module and device */
150c325d8d3Smickey #define		IODC_INIT_DEV	5	/* initialize device */
151c325d8d3Smickey #define		IODC_INIT_MOD	6	/* initialize module */
152c325d8d3Smickey #define		IODC_INIT_MSG	9	/* return error message(s) */
153c325d8d3Smickey #define		IODC_INIT_STR	20	/* find device w/ spec in string */
154c325d8d3Smickey #define		IODC_IO		4	/* perform I/O (see options below) */
155c325d8d3Smickey #define		IODC_IO_READ	0	/* read from boot device */
156c325d8d3Smickey #define		IODC_IO_WRITE	1	/* write to boot device */
157c325d8d3Smickey #define		IODC_IO_CONSIN	2	/* read from console */
158c325d8d3Smickey #define		IODC_IO_CONSOUT	3	/* write to conosle */
159c325d8d3Smickey #define		IODC_IO_CLOSE	4	/* close device */
160c325d8d3Smickey #define		IODC_IO_MSG	9	/* return error message(s) */
161c325d8d3Smickey #define		IODC_SPA	5	/* get extended SPA information */
162c325d8d3Smickey #define		IODC_SPA_DFLT	0	/* return SPA information */
163c325d8d3Smickey #define		IODC_TEST	8	/* perform self tests */
164c325d8d3Smickey #define		IODC_TEST_INFO	0	/* return test information */
165c325d8d3Smickey #define		IODC_TEST_STEP	1	/* execute a particular test */
166c325d8d3Smickey #define		IODC_TEST_TEST	2	/* describe a test section */
167c325d8d3Smickey #define		IODC_TEST_MSG	9	/* return error message(s) */
1689c0b8818Smickey #define	PDC_IODC_NINIT		2	/* non-destructive init */
1699c0b8818Smickey #define	PDC_IODC_DINIT		3	/* destructive init */
1709c0b8818Smickey #define	PDC_IODC_MEMERR		4	/* check for memory errors */
171c325d8d3Smickey #define	PDC_IODC_IMEMMASTER	5	/* interlieved memory master ID */
1729c0b8818Smickey 
1739c0b8818Smickey #define	PDC_TOD		9	/* access time-of-day clock */
1749c0b8818Smickey #define	PDC_TOD_READ		0	/* read TOD clock */
1759c0b8818Smickey #define	PDC_TOD_WRITE		1	/* write TOD clock */
1769c0b8818Smickey #define	PDC_TOD_ITIMER		2	/* calibrate Interval Timer (CR16) */
1779c0b8818Smickey 
1789c0b8818Smickey #define	PDC_STABLE	10	/* access Stable Storage (SS) */
1799c0b8818Smickey #define	PDC_STABLE_READ		0	/* read SS */
1809c0b8818Smickey #define	PDC_STABLE_WRITE	1	/* write SS */
1819c0b8818Smickey #define	PDC_STABLE_SIZE		2	/* return size of SS */
1829c0b8818Smickey #define	PDC_STABLE_VRFY		3	/* verify contents of SS */
1839c0b8818Smickey #define	PDC_STABLE_INIT		4	/* initialize SS */
1849c0b8818Smickey 
1859c0b8818Smickey #define	PDC_NVM		11	/* access Non-Volatile Memory (NVM) */
1869c0b8818Smickey #define	PDC_NVM_READ		0	/* read NVM */
1879c0b8818Smickey #define	PDC_NVM_WRITE		1	/* write NVM */
1889c0b8818Smickey #define	PDC_NVM_SIZE		2	/* return size of NVM */
1899c0b8818Smickey #define	PDC_NVM_VRFY		3	/* verify contents of NVM */
1909c0b8818Smickey #define	PDC_NVM_INIT		4	/* initialize NVM */
1919c0b8818Smickey 
1929c0b8818Smickey #define	PDC_ADD_VALID	12	/* check address for validity */
1939c0b8818Smickey #define	PDC_ADD_VALID_DFLT	0
1949c0b8818Smickey 
1959c0b8818Smickey #define	PDC_BUS_BAD	13	/* verify Error Detection Circuitry (EDC) */
1969c0b8818Smickey #define	PDC_BUS_BAD_DLFT	0
1979c0b8818Smickey 
1989c0b8818Smickey #define	PDC_DEBUG	14	/* return address of PDC debugger */
1999c0b8818Smickey #define	PDC_DEBUG_DFLT		0
2009c0b8818Smickey 
2019c0b8818Smickey #define	PDC_INSTR	15	/* return instr that invokes PDCE_CHECK */
2029c0b8818Smickey #define	PDC_INSTR_DFLT		0
2039c0b8818Smickey 
2049c0b8818Smickey #define	PDC_PROC	16	/* stop currently executing processor */
20531aa52bdSmickey #define	PDC_PROC_STOP		0
20631aa52bdSmickey #define	PDC_PROC_RENDEZVOUS	1
2079c0b8818Smickey 
2089c0b8818Smickey #define	PDC_CONF	17	/* (de)configure a module */
2099c0b8818Smickey #define	PDC_CONF_DECONF		0	/* deconfigure module */
2109c0b8818Smickey #define	PDC_CONF_RECONF		1	/* reconfigure module */
211*36fd90dcSjsg #define	PDC_CONF_INFO		2	/* get config information */
2129c0b8818Smickey 
2139c0b8818Smickey #define PDC_BLOCK_TLB	18	/* Manage Block TLB entries (BTLB) */
2149c0b8818Smickey #define PDC_BTLB_DEFAULT	0	/* Return BTLB configuration info  */
2159c0b8818Smickey #define PDC_BTLB_INSERT		1	/* Insert a BTLB entry */
2169c0b8818Smickey #define PDC_BTLB_PURGE		2	/* Purge a BTLB entry */
2179c0b8818Smickey #define PDC_BTLB_PURGE_ALL	3	/* Purge all BTLB entries */
2189c0b8818Smickey 
2199c0b8818Smickey #define PDC_TLB		19	/* Manage Hardware TLB handling */
2209c0b8818Smickey #define PDC_TLB_INFO		0	/* Return HW-TLB configuration info  */
2219c0b8818Smickey #define PDC_TLB_CONFIG		1	/* Set HW-TLB pdir base and size */
2229c0b8818Smickey 
2239c0b8818Smickey #define PDC_TLB_CURRPDE		1	/* cr28 points to current pde on miss */
2249c0b8818Smickey #define PDC_TLB_RESERVD		3	/* reserved */
2259c0b8818Smickey #define PDC_TLB_NEXTPDE		5	/* cr28 points to next pde on miss */
2269c0b8818Smickey #define PDC_TLB_WORD3		7	/* cr28 is word 3 of 16 byte pde */
2279c0b8818Smickey 
22849ee3cc5Smickey #define	PDC_PSW		21	/* manage default values of configurable psw bits */
22949ee3cc5Smickey #define	PDC_PSW_GETMASK		0	/* get mask */
23049ee3cc5Smickey #define	PDC_PSW_DEFAULTS	1	/* get default bits values */
23149ee3cc5Smickey #define	PDC_PSW_SETDEFAULTS	2	/* set default bits values */
23249ee3cc5Smickey 
2332706414aSmickey #define	PDC_SYSMAP	22	/* map system modules */
2342706414aSmickey #define	PDC_SYSMAP_FIND		0	/* find module by index */
235797a06ecSmickey #define	PDC_SYSMAP_ADDR		1	/* fetch list of addresses */
236797a06ecSmickey #define	PDC_SYSMAP_HPA		2	/* get hpa from devpath */
2372706414aSmickey 
238c325d8d3Smickey #define	PDC_SOFT_POWER	23	/* support for soft power switch */
239c325d8d3Smickey #define	PDC_SOFT_POWER_INFO	0	/* get info about soft power switch */
240c325d8d3Smickey #define	PDC_SOFT_POWER_ENABLE	1	/* enable/disable soft power switch */
241c325d8d3Smickey 
2426d6f4087Smickey #define	PDC_PAT_CELL	64	/* cell operations */
2436d6f4087Smickey #define	PDC_PAT_CELL_GETID	0	/* get cell id number */
2446d6f4087Smickey #define	PDC_PAT_CELL_GETINFO	1	/* get cell info */
2456d6f4087Smickey #define	PDC_PAT_CELL_MODULE	2	/* get module info */
2466d6f4087Smickey #define		PDC_PAT_IOVIEW	0
2476d6f4087Smickey #define		PDC_PAT_PAVIEW	1
2486d6f4087Smickey 
2496d6f4087Smickey #define	PDC_PAT_CHASSIS	65	/* chassis log ops */
2506d6f4087Smickey #define	PDC_PAT_CHASSIS_WRITE	0
2516d6f4087Smickey #define	PDC_PAT_CHASSIS_READ	1
2526d6f4087Smickey 
2536d6f4087Smickey #define	PDC_PAT_CPU	67
2546d6f4087Smickey 
2556d6f4087Smickey #define	PDC_PAT_EVENT	68
2566d6f4087Smickey 
2576d6f4087Smickey #define	PDC_PAT_HPMC	70
2586d6f4087Smickey 
2599fd363f1Smickey #define	PDC_PAT_IO	71	/* online services for IO modules */
2609fd363f1Smickey #define	PDC_PAT_IO_GET_PCI_RTSZ	15
2619fd363f1Smickey #define	PDC_PAT_IO_GET_PCI_RT	16
2629fd363f1Smickey 
2636d6f4087Smickey #define	PDC_PAT_MEM	72
2646d6f4087Smickey 
2656d6f4087Smickey #define	PDC_PAT_NVRAM	73
2666d6f4087Smickey 
2676d6f4087Smickey #define	PDC_PAT_PROTDOM	74
2686d6f4087Smickey 
2699c0b8818Smickey #define	PDC_MEMMAP	128	/* hp700: return page information */
2709c0b8818Smickey #define	PDC_MEMMAP_HPA		0	/* map module # to HPA */
2719c0b8818Smickey 
272c325d8d3Smickey #define	PDC_EEPROM	129	/* Hversion dependent */
273c325d8d3Smickey #define	PDC_EEPROM_READ_WORD	0
274c325d8d3Smickey #define	PDC_EEPROM_WRITE_WORD	1
275c325d8d3Smickey #define	PDC_EEPROM_READ_BYTE	2
276c325d8d3Smickey #define	PDC_EEPROM_WRITE_BYTE	3
277c325d8d3Smickey 
27875bc4546Skettenis #define	PDC_IO		135
27975bc4546Skettenis #define	PDC_IO_READ_AND_CLEAR_ERRORS	0
28075bc4546Skettenis #define	PDC_IO_RESET			1
28175bc4546Skettenis #define	PDC_IO_RESET_DEVICES		2
28275bc4546Skettenis 
2835231817eSkettenis #define	PDC_BROADCAST_RESET	136
2845231817eSkettenis #define	PDC_DO_RESET		0
2855231817eSkettenis #define	PDC_DO_FIRM_TEST_RESET	1
2865231817eSkettenis #define	PDC_BR_RECONFIGURATION	2
2875231817eSkettenis 
288c325d8d3Smickey #define	PDC_LAN_STATION_ID	138	/* Hversion dependent mechanism for */
289c325d8d3Smickey #define	PDC_LAN_STATION_ID_READ	0	/* getting the lan station address  */
290c325d8d3Smickey 
2919fd363f1Smickey #define	PDC_PCI_INDEX	147	/* PCI rt access */
2929fd363f1Smickey #define	PDC_PCI_GET_INT_TBL_SZ	13
2939fd363f1Smickey #define	PDC_PCI_GET_INT_TBL	14
2949fd363f1Smickey 
295c325d8d3Smickey #define	PDC_ERR_OK		0	/* operation complete */
296c325d8d3Smickey #define	PDC_ERR_WARNING		3	/* OK, but warning */
297c325d8d3Smickey #define	PDC_ERR_NOPROC		-1	/* no such procedure */
298c325d8d3Smickey #define	PDC_ERR_NOPT		-2	/* no such option */
299c325d8d3Smickey #define	PDC_ERR_COMPL		-3	/* unable to complete w/o error */
300c325d8d3Smickey #define	PDC_ERR_EOD		-9	/* end of device list */
301c325d8d3Smickey #define	PDC_ERR_INVAL		-10	/* invalid argument */
302c325d8d3Smickey #define	PDC_ERR_PFAIL		-12	/* aborted by powerfail */
3039c0b8818Smickey 
3045e254c8eSmickey #if !defined(_LOCORE)
3055e254c8eSmickey 
3065e254c8eSmickey struct iomod;
3075e254c8eSmickey 
308c4071fd1Smillert typedef int (*pdcio_t)(int, int, ...);
3096d6f4087Smickey typedef int (*iodcio_t)(u_int, int, ...);
3109c0b8818Smickey 
3119c0b8818Smickey /*
3129c0b8818Smickey  * Commonly used PDC calls and the structures they return.
3139c0b8818Smickey  */
3149c0b8818Smickey 
31531aa52bdSmickey /*
31631aa52bdSmickey  * Device path specifications used by PDC.
31731aa52bdSmickey  */
31831aa52bdSmickey struct device_path {
31931aa52bdSmickey 	u_char	dp_flags;	/* see bit definitions below */
32031aa52bdSmickey 	char	dp_bc[6];	/* Bus Converter routing info to a specific */
32131aa52bdSmickey 				/* I/O adaptor (< 0 means none, > 63 resvd) */
32231aa52bdSmickey 	u_char	dp_mod;		/* fixed field of specified module */
32331aa52bdSmickey 	int	dp_layers[6];	/* device-specific info (ctlr #, unit # ...) */
3249c0b8818Smickey };
3259c0b8818Smickey 
3269c0b8818Smickey struct pdc_model {	/* PDC_MODEL */
3279c0b8818Smickey 	u_int	hvers;		/* hardware version */
32849ee3cc5Smickey 	u_int	rev : 4;	/* zero for all native processors */
32949ee3cc5Smickey 	u_int	model : 20;	/* 4 for all native processors */
33049ee3cc5Smickey 	u_int	sh : 1;		/* shadow registers are present */
33149ee3cc5Smickey 	u_int	reserved : 2;	/* reserved */
33249ee3cc5Smickey 	u_int	mc : 1;		/* module category (A - 0, B - 1) */
33349ee3cc5Smickey 	u_int	reserved1 : 2;	/* reserved */
33449ee3cc5Smickey 	u_int	pa_lvl : 2;	/* PA-RISC level */
3359c0b8818Smickey 	u_int	hw_id;		/* unique processor hardware identifier */
3369c0b8818Smickey 	u_int	boot_id;	/* same as hw_id */
3379c0b8818Smickey 	u_int	sw_id;		/* software security and licensing */
338cddff70fSmickey 	u_int	sw_cap;		/* OS capabilities of processor */
3399c0b8818Smickey 	u_int	arch_rev;	/* architecture revision */
3409c0b8818Smickey 	u_int	pot_key;	/* potential key */
3419c0b8818Smickey 	u_int	curr_key;	/* current key */
3429c0b8818Smickey 	int	filler1;
343cddff70fSmickey 	u_int	filler2[22];
3449c0b8818Smickey };
3459c0b8818Smickey 
34631aa52bdSmickey struct pdc_cpuid {	/* PDC_MODEL_CPUID */
34749ee3cc5Smickey 	u_int	reserved : 20;
34849ee3cc5Smickey 	u_int	version  :  7;	/* CPU version */
34949ee3cc5Smickey 	u_int	revision :  5;	/* CPU revision */
35049ee3cc5Smickey 	u_int	filler[31];
35149ee3cc5Smickey };
35249ee3cc5Smickey 
35331aa52bdSmickey struct pdc_getbootopts {	/* PDC_MODEL_GETBOOTOPTS */
35431aa52bdSmickey 	u_int	cur_test;	/* current enabled tests */
35531aa52bdSmickey 	u_int	sup_test;	/* supported tests */
35631aa52bdSmickey 	u_int	def_test;	/* default enabled tests */
35731aa52bdSmickey 	u_int	filler[29];
35831aa52bdSmickey };
35931aa52bdSmickey 
3609c0b8818Smickey struct cache_cf {	/* PDC_CACHE (for "struct pdc_cache") */
36131aa52bdSmickey 	u_int	cc_alias: 4,	/* virtual address aliasing boundary */
3629c0b8818Smickey 		cc_block: 4,	/* used to determine most efficient stride */
3639c0b8818Smickey 		cc_line	: 3,	/* max data written by store (16-byte mults) */
3649c0b8818Smickey 		cc_resv1: 2,	/* (reserved) */
3659c0b8818Smickey 		cc_wt	: 1,	/* D-cache: write-to = 0, write-through = 1 */
3669c0b8818Smickey 		cc_sh	: 2,	/* separate I and D = 0, shared I and D = 1 */
3679c0b8818Smickey 		cc_cst  : 3,	/* D-cache: incoherent = 0, coherent = 1 */
368ffbbb3dbSmickey 		cc_resv2:11,	/* (reserved) */
369ffbbb3dbSmickey 		cc_hvers: 2;	/* H-VERSION dependent */
3709c0b8818Smickey };
3719c0b8818Smickey 
3729c0b8818Smickey struct tlb_cf {		/* PDC_CACHE (for "struct pdc_cache") */
3739c0b8818Smickey 	u_int	tc_resv1:12,	/* (reserved) */
3749c0b8818Smickey 		tc_sh	: 2,	/* separate I and D = 0, shared I and D = 1 */
3759c0b8818Smickey 		tc_hvers: 1,	/* H-VERSION dependent */
3769c0b8818Smickey 		tc_page : 1,	/* 2K page size = 0, 4k page size = 1 */
3779c0b8818Smickey 		tc_cst  : 3,	/* incoherent = 0, coherent = 1 */
3789c0b8818Smickey 		tc_resv2: 5,	/* (reserved) */
3799c0b8818Smickey 		tc_assoc: 8;	/* associativity of TLB */
3809c0b8818Smickey };
3819c0b8818Smickey 
3829c0b8818Smickey struct pdc_cache {	/* PDC_CACHE */
3839c0b8818Smickey /* Instruction cache */
3849c0b8818Smickey 	u_int	ic_size;	/* size of I-cache (in bytes) */
3859c0b8818Smickey 	struct cache_cf ic_conf;/* cache configuration (see above) */
3869c0b8818Smickey 	u_int	ic_base;	/* start addr of I-cache (for FICE flush) */
3879c0b8818Smickey 	u_int	ic_stride;	/* addr incr per i_count iteration (flush) */
3889c0b8818Smickey 	u_int	ic_count;	/* number of i_loop iterations (flush) */
3899c0b8818Smickey 	u_int	ic_loop;	/* number of FICE's per addr stride (flush) */
3909c0b8818Smickey /* Data cache */
3919c0b8818Smickey 	u_int	dc_size;	/* size of D-cache (in bytes) */
3929c0b8818Smickey 	struct cache_cf dc_conf;/* cache configuration (see above) */
3939c0b8818Smickey 	u_int	dc_base;	/* start addr of D-cache (for FDCE flush) */
3949c0b8818Smickey 	u_int	dc_stride;	/* addr incr per d_count iteration (flush) */
3959c0b8818Smickey 	u_int	dc_count;	/* number of d_loop iterations (flush) */
3969c0b8818Smickey 	u_int	dc_loop;	/* number of FDCE's per addr stride (flush) */
3979c0b8818Smickey /* Instruction TLB */
3989c0b8818Smickey 	u_int	it_size;	/* number of entries in I-TLB */
3999c0b8818Smickey 	struct tlb_cf it_conf;	/* I-TLB configuration (see above) */
4009c0b8818Smickey 	u_int	it_sp_base;	/* start space of I-TLB (for PITLBE flush) */
4019c0b8818Smickey 	u_int	it_sp_stride;	/* space incr per sp_count iteration (flush) */
4029c0b8818Smickey 	u_int	it_sp_count;	/* number of off_count iterations (flush) */
4039c0b8818Smickey 	u_int	it_off_base;	/* start offset of I-TLB (for PITLBE flush) */
4049c0b8818Smickey 	u_int	it_off_stride;	/* offset incr per off_count iteration (flush)*/
4059c0b8818Smickey 	u_int	it_off_count;	/* number of it_loop iterations/space (flush) */
4069c0b8818Smickey 	u_int	it_loop;	/* number of PITLBE's per off_stride (flush) */
4079c0b8818Smickey /* Data TLB */
4089c0b8818Smickey 	u_int	dt_size;	/* number of entries in D-TLB */
4099c0b8818Smickey 	struct tlb_cf dt_conf;	/* D-TLB configuration (see above) */
4109c0b8818Smickey 	u_int	dt_sp_base;	/* start space of D-TLB (for PDTLBE flush) */
4119c0b8818Smickey 	u_int	dt_sp_stride;	/* space incr per sp_count iteration (flush) */
4129c0b8818Smickey 	u_int	dt_sp_count;	/* number of off_count iterations (flush) */
4139c0b8818Smickey 	u_int	dt_off_base;	/* start offset of D-TLB (for PDTLBE flush) */
4149c0b8818Smickey 	u_int	dt_off_stride;	/* offset incr per off_count iteration (flush)*/
4159c0b8818Smickey 	u_int	dt_off_count;	/* number of dt_loop iterations/space (flush) */
4169c0b8818Smickey 	u_int	dt_loop;	/* number of PDTLBE's per off_stride (flush) */
417cddff70fSmickey 	u_int	filler[2];
4189c0b8818Smickey };
4199c0b8818Smickey 
420d7e0e986Smickey struct pdc_spidb {	/* PDC_CACHE, PDC_CACHE_GETSPIDB */
421d7e0e986Smickey 	u_int	spidR1   : 4;
422d7e0e986Smickey 	u_int	spidbits : 12;
423d7e0e986Smickey 	u_int	spidR2   : 16;
424d7e0e986Smickey 	u_int	filler[31];
425d7e0e986Smickey };
426d7e0e986Smickey 
42741f0735cSmickey struct pdc_cst {
42841f0735cSmickey 	u_int	cstR1  : 16;
42941f0735cSmickey 	u_int	cst    :  3;
43041f0735cSmickey 	u_int	cstR2  : 13;
43141f0735cSmickey };
43241f0735cSmickey 
433d7e0e986Smickey struct pdc_coherence {	/* PDC_CACHE, PDC_CACHE_SETCS */
43441f0735cSmickey 	struct pdc_cst	ia;
43541f0735cSmickey #define	ia_cst ia.cst
43641f0735cSmickey 	struct pdc_cst	da;
43741f0735cSmickey #define	da_cst da.cst
43841f0735cSmickey 	struct pdc_cst	ita;
43941f0735cSmickey #define	ita_cst ita.cst
44041f0735cSmickey 	struct pdc_cst	dta;
44141f0735cSmickey #define	dta_cst dta.cst
44241f0735cSmickey 	u_int	filler[28];
44341f0735cSmickey };
44441f0735cSmickey 
4459c0b8818Smickey struct pdc_hpa {	/* PDC_HPA */
4466d6f4087Smickey 	u_int	hpa;	/* HPA of processor */
4479c0b8818Smickey 	int	filler1;
448cddff70fSmickey 	u_int	filler2[30];
4499c0b8818Smickey };
4509c0b8818Smickey 
4519c0b8818Smickey struct pdc_coproc {	/* PDC_COPROC */
4529c0b8818Smickey 	u_int	ccr_enable;	/* same format as CCR (CR 10) */
453cddff70fSmickey 	u_int	ccr_present;	/* which co-proc's are present (bitset) */
454c7c57f00Smickey 	u_int	pad[15];
455c7c57f00Smickey 	u_int	fpu_revision;
456a89ddb47Smickey 	u_int	fpu_model;
457c7c57f00Smickey 	u_int	filler2[13];
4589c0b8818Smickey };
4599c0b8818Smickey 
4609c0b8818Smickey struct pdc_tod {	/* PDC_TOD, PDC_TOD_READ */
4619c0b8818Smickey 	u_int	sec;		/* elapsed time since 00:00:00 GMT, 1/1/70 */
4629c0b8818Smickey 	u_int	usec;		/* accurate to microseconds */
463cddff70fSmickey 	u_int	filler2[30];
4649c0b8818Smickey };
4659c0b8818Smickey 
46631aa52bdSmickey struct pdc_itimer {	/* PDC_TOD_ITIMER */
46731aa52bdSmickey 	u_int	calib0;		/* double giving itmr freq */
46831aa52bdSmickey 	u_int	calib1;
46931aa52bdSmickey 	u_int	tod_acc;	/* TOD accuracy in 1e-9 part */
47031aa52bdSmickey 	u_int	cr_acc;		/* itmr accuracy in 1e-9 parts */
47131aa52bdSmickey 	u_int	filler[28];
47231aa52bdSmickey };
47331aa52bdSmickey 
47431aa52bdSmickey struct pdc_nvm {	/* PDC_NVM */
47531aa52bdSmickey 	u_int	hv[9];		/* 0x00: HV dependent */
47631aa52bdSmickey 	struct device_path bootpath;	/* 0x24: boot path */
47731aa52bdSmickey 	u_int	isl_ver;	/* 0x44: ISL revision */
47831aa52bdSmickey 	u_int	timestamp;	/* 0x48: timestamp */
47931aa52bdSmickey 	u_int	lif_ue[12];	/* 0x4c: LIF utility entries */
48031aa52bdSmickey 	u_int	eptr;		/* 0x7c: entry pointer */
48131aa52bdSmickey 	u_int	os_panic[32];	/* 0x80: OS panic info */
48231aa52bdSmickey };
48331aa52bdSmickey 
4849c0b8818Smickey struct pdc_instr {	/* PDC_INSTR */
4859c0b8818Smickey 	u_int	instr;		/* instruction that invokes PDC mchk entry pt */
4869c0b8818Smickey 	int	filler1;
487cddff70fSmickey 	u_int	filler2[30];
4889c0b8818Smickey };
4899c0b8818Smickey 
4909c0b8818Smickey struct pdc_iodc_read {	/* PDC_IODC, PDC_IODC_READ */
4919c0b8818Smickey 	int	size;		/* number of bytes in selected entry point */
4929c0b8818Smickey 	int	filler1;
493cddff70fSmickey 	u_int	filler2[30];
4949c0b8818Smickey };
4959c0b8818Smickey 
4969c0b8818Smickey struct pdc_iodc_minit {	/* PDC_IODC, PDC_IODC_NINIT or PDC_IODC_DINIT */
4979c0b8818Smickey 	u_int	stat;		/* HPA.io_status style error returns */
4989c0b8818Smickey 	u_int	max_spa;	/* size of SPA (in bytes) > max_mem+map_mem */
4999c0b8818Smickey 	u_int	max_mem;	/* size of "implemented" memory (in bytes) */
500af18ceffSjmc 	u_int	map_mem;	/* size of "mappable-only" memory (in bytes) */
501cddff70fSmickey 	u_int	filler[28];
5029c0b8818Smickey };
5039c0b8818Smickey 
5049c0b8818Smickey struct btlb_info {		/* for "struct pdc_btlb" (PDC_BTLB) */
5059c0b8818Smickey 	u_int	resv0: 8,	/* (reserved) */
5069c0b8818Smickey 		num_i: 8,	/* Number of instruction slots */
5079c0b8818Smickey 		num_d: 8,	/* Number of data slots */
5089c0b8818Smickey 		num_c: 8;	/* Number of combined slots */
5099c0b8818Smickey };
5109c0b8818Smickey 
5119c0b8818Smickey struct pdc_btlb {	/* PDC_BLOCK_TLB */
5129c0b8818Smickey 	u_int	min_size;	/* Min size in pages */
5139c0b8818Smickey 	u_int	max_size;	/* Max size in pages */
5149c0b8818Smickey 	struct btlb_info finfo;	/* Fixed range info */
5159c0b8818Smickey 	struct btlb_info vinfo; /* Variable range info */
5169c0b8818Smickey 	u_int	filler[28];
5179c0b8818Smickey };
5189c0b8818Smickey 
5199c0b8818Smickey struct pdc_hwtlb {	/* PDC_TLB */
5209c0b8818Smickey 	u_int	min_size;	/* What do these mean? */
5219c0b8818Smickey 	u_int	max_size;
5229c0b8818Smickey 	u_int	filler[30];
5239c0b8818Smickey };
5249c0b8818Smickey 
5250c7cde72Smickey struct pdc_power_info {		/* PDC_SOFT_POWER_INFO */
5260c7cde72Smickey 	u_int	addr;		/* power register address */
5270c7cde72Smickey 	u_int	filler[30];
5280c7cde72Smickey };
5290c7cde72Smickey 
5302706414aSmickey struct pdc_sysmap_find {	/* PDC_SYSMAP_FIND */
5312706414aSmickey 	u_int	hpa;
5322706414aSmickey 	u_int	size;		/* pages */
5332706414aSmickey 	u_int	naddrs;
5342706414aSmickey 	u_int	filler[29];
5352706414aSmickey };
5362706414aSmickey 
5372706414aSmickey struct pdc_sysmap_addrs {	/* PDC_SYSMAP_ADDR */
5382706414aSmickey 	u_int	hpa;
5392706414aSmickey 	u_int	size;		/* pages */
5402706414aSmickey 	u_int	filler[30];
5412706414aSmickey };
5422706414aSmickey 
543797a06ecSmickey struct pdc_sysmap_hpa {		/* PDC_SYSMAP_HPA */
544797a06ecSmickey 	u_int	hpa;
545797a06ecSmickey 	u_int	size;
546797a06ecSmickey 	u_int	naddrs;
547797a06ecSmickey 	u_int	mod;
548797a06ecSmickey 	u_int	filler[28];
549797a06ecSmickey };
550797a06ecSmickey 
5516d6f4087Smickey struct pdc_pat_cell_id {	/* PDC_PAT_CELL_GETID */
5526d6f4087Smickey 	u_long	id;		/* cell id */
5536d6f4087Smickey 	u_long	loc;		/* cell location */
5546d6f4087Smickey 	u_long	filler[14];
5556d6f4087Smickey };
5566d6f4087Smickey 
5576d6f4087Smickey struct pdc_pat_cell_module {	/* PDC_PAT_CELL_MODULE */
5586d6f4087Smickey 	u_long	chpa;		/* config space HPA */
5596d6f4087Smickey 	u_long	info;		/* module info */
5606d6f4087Smickey #define	PDC_PAT_CELL_MODTYPE(t)	(((t) >> 56) & 0xff)
5616d6f4087Smickey #define	PDC_PAT_CELL_MODDVI(t)	(((t) >> 48) & 0xff)
5626d6f4087Smickey #define	PDC_PAT_CELL_MODIOC(t)	(((t) >> 40) & 0xff)
5636d6f4087Smickey #define	PDC_PAT_CELL_MODSIZE(t)	(((t) & 0xffffff) << PAGE_SHIFT)
5646d6f4087Smickey 	u_long	loc;		/* module location */
5656d6f4087Smickey 	struct device_path dp;	/* module path */
5666d6f4087Smickey 	u_long	pad[508];	/* cell module gedoens */
5676d6f4087Smickey };
5686d6f4087Smickey 
5699fd363f1Smickey struct pdc_pat_io_num {	/* PDC_PAT_IO */
5709fd363f1Smickey 	u_int	num;
5719fd363f1Smickey 	u_int	filler[31];
5729fd363f1Smickey };
5739fd363f1Smickey 
574bae729d6Smickey struct pdc_pat_pci_rt {	/* PDC_PAT_IO_GET_PCI_RT */
575bae729d6Smickey 	u_int8_t	type;		/* 0x8b */
576bae729d6Smickey 	u_int8_t	len;
577bae729d6Smickey 	u_int8_t	itype;		/* 0 -- vectored int */
578bae729d6Smickey 	u_int8_t	trigger;	/* polarity/level */
579bae729d6Smickey 	u_int8_t	pin;		/* PCI pin number */
580bae729d6Smickey 	u_int8_t	bus;
581bae729d6Smickey 	u_int8_t	seg;		/* reserved */
582bae729d6Smickey 	u_int8_t	line;
583bae729d6Smickey 	u_int64_t	addr;		/* io sapic address */
584bae729d6Smickey };
585bae729d6Smickey 
5869c0b8818Smickey struct pdc_memmap {	/* PDC_MEMMAP */
5879c0b8818Smickey 	u_int	hpa;		/* HPA for module */
5889c0b8818Smickey 	u_int	morepages;	/* additional IO pages */
589cddff70fSmickey 	u_int	filler[30];
5909c0b8818Smickey };
5919c0b8818Smickey 
59267a4eabcSmickey struct pdc_lan_station_id {	/* PDC_LAN_STATION_ID */
59367a4eabcSmickey 	u_int8_t addr[6];
59467a4eabcSmickey 	u_int8_t filler1[2];
59567a4eabcSmickey 	u_int	filler2[30];
59667a4eabcSmickey };
59767a4eabcSmickey 
5989c0b8818Smickey /*
5999c0b8818Smickey  * The PDC_CHASSIS is a strange bird.  The format for updating the display
6009c0b8818Smickey  * is as follows:
6019c0b8818Smickey  *
6029c0b8818Smickey  *	0     11 12      14    15   16    19 20    23 24    27 28    31
6039c0b8818Smickey  *	+-------+----------+-------+--------+--------+--------+--------+
6049c0b8818Smickey  *	|   R   | OS State | Blank |  Hex1  |  Hex2  |  Hex3  |  Hex4  |
6059c0b8818Smickey  *	+-------+----------+-------+--------+--------+--------+--------+
6069c0b8818Smickey  *
6079c0b8818Smickey  * Unfortunately, someone forgot to tell the hardware designers that
6089c0b8818Smickey  * there was supposed to be a hex display somewhere.  The result is,
6099c0b8818Smickey  * you can only toggle 5 LED's and the fault light.
6109c0b8818Smickey  *
6119c0b8818Smickey  * Interesting values for Hex1-Hex4 and the resulting LED displays:
6129c0b8818Smickey  *
6139c0b8818Smickey  *	FnFF			CnFF:
6149c0b8818Smickey  *	 0	- - - - -		Counts in binary from 0x0 - 0xF
6159c0b8818Smickey  *	 2	o - - - -		for corresponding values of `n'.
6169c0b8818Smickey  *	 4	o o - - -
6179c0b8818Smickey  *	 6	o o o - -
6189c0b8818Smickey  *	 8	o o o o -
6199c0b8818Smickey  *	 A	o o o o o
6209c0b8818Smickey  *
6219c0b8818Smickey  * If the "Blank" bit is set, the display should be made blank.
6229c0b8818Smickey  * The values for "OS State" are defined below.
6239c0b8818Smickey  */
6249c0b8818Smickey 
6259c0b8818Smickey #define	PDC_CHASSIS_BAR	0xF0FF	/* create a bar graph with LEDs */
6269c0b8818Smickey #define	PDC_CHASSIS_CNT	0xC0FF	/* count with LEDs */
6279c0b8818Smickey 
6289c0b8818Smickey #define	PDC_OSTAT(os)	(((os) & 0x7) << 17)
6299c0b8818Smickey #define	PDC_OSTAT_OFF	0x0	/* all off */
6309c0b8818Smickey #define	PDC_OSTAT_FAULT	0x1	/* the red LED of death */
6319c0b8818Smickey #define	PDC_OSTAT_TEST	0x2	/* self test */
6329c0b8818Smickey #define	PDC_OSTAT_BOOT	0x3	/* boot program running */
6339c0b8818Smickey #define	PDC_OSTAT_SHUT	0x4	/* shutdown in progress */
6349c0b8818Smickey #define	PDC_OSTAT_WARN	0x5	/* battery dying, etc */
6359c0b8818Smickey #define	PDC_OSTAT_RUN	0x6	/* OS running */
6369c0b8818Smickey #define	PDC_OSTAT_ON	0x7	/* all on */
6379c0b8818Smickey 
6389b92c7dfSkettenis struct pdc_chassis_info {
6399b92c7dfSkettenis 	u_int	size;
6409b92c7dfSkettenis 	u_int	max_size;
6419b92c7dfSkettenis 	u_int	filler[30];
6429b92c7dfSkettenis };
6439b92c7dfSkettenis 
6449b92c7dfSkettenis struct pdc_chassis_lcd {
6459b92c7dfSkettenis 	u_int	model : 16,
6469b92c7dfSkettenis 		width : 16;
6479b92c7dfSkettenis 	u_int	cmd_addr;
6489b92c7dfSkettenis 	u_int	data_addr;
6499b92c7dfSkettenis 	u_int	delay;
6509b92c7dfSkettenis 	u_int8_t line[2];
6519b92c7dfSkettenis 	u_int8_t enabled;
6529b92c7dfSkettenis 	u_int8_t heartbeat[3];
6539b92c7dfSkettenis 	u_int8_t disk[3];
6549b92c7dfSkettenis 	u_int	filler[25];
6559b92c7dfSkettenis };
6569b92c7dfSkettenis 
6579c0b8818Smickey /* dp_flags */
65859dac803Smickey #define	PZF_AUTOBOOT	0x80	/* These two are PDC flags for how to locate */
65959dac803Smickey #define	PZF_AUTOSEARCH	0x40	/*	the "boot device" */
66059dac803Smickey #define	PZF_TIMER	0x0f	/* power of 2 # secs "boot timer" (0 == dflt) */
66159dac803Smickey #define	PZF_BITS	"\020\010autoboot\07autosearch"
6629c0b8818Smickey 
6634c76c0d7Smiod /* macros to decode serial parameters out of dp_layers */
6644c76c0d7Smiod #define	PZL_BITS(l)	(((l) & 0x03) + 5)
6654c76c0d7Smiod #define	PZL_PARITY(l)	(((l) & 0x18) >> 3)
6664c76c0d7Smiod #define	PZL_SPEED(l)	(((l) & 0x3c0) >> 6)
6674c76c0d7Smiod #define	PZL_ENCODE(bits, parity, speed) \
6684c76c0d7Smiod 	(((bits) - 5) & 0x03) | (((parity) & 0x3) << 3) | \
66951622cc7Smiod 	(((speed) & 0x0f) << 6)
6704c76c0d7Smiod 
6719c0b8818Smickey /*
6729c0b8818Smickey  * A processors Stable Storage is accessed through the PDC.  There are
6739c0b8818Smickey  * at least 96 bytes of stable storage (the device path information may
6749c0b8818Smickey  * or may not exist).  However, as far as I know, processors provide at
6759c0b8818Smickey  * least 192 bytes of stable storage.
6769c0b8818Smickey  */
6779c0b8818Smickey struct stable_storage {
6789c0b8818Smickey 	struct device_path ss_pri_boot;	/* (see above) */
6799c0b8818Smickey 	char	ss_filenames[32];
6809c0b8818Smickey 	u_short	ss_os_version;	/* 0 == none, 1 == HP-UX, 2 == MPE-XL */
6819c0b8818Smickey 	char	ss_os[22];	/* OS-dependant information */
6829c0b8818Smickey 	char	ss_pdc[7];	/* reserved */
6839c0b8818Smickey 	char	ss_fast_size;	/* how much memory to test.  0xf == all, or */
6849c0b8818Smickey 				/*	else it's (256KB << ss_fast_size) */
6859c0b8818Smickey 	struct device_path ss_console;
6869c0b8818Smickey 	struct device_path ss_alt_boot;
6879c0b8818Smickey 	struct device_path ss_keyboard;
6889c0b8818Smickey };
6899c0b8818Smickey 
6909c0b8818Smickey /*
6919c0b8818Smickey  * Recoverable error indications provided to boot code by the PDC.
6929c0b8818Smickey  * Any non-zero value indicates error.
6939c0b8818Smickey  */
6949c0b8818Smickey struct boot_err {
6959c0b8818Smickey 	u_int	be_resv : 10,	/* (reserved) */
6969c0b8818Smickey 		be_fixed : 6,	/* module that produced error */
6979c0b8818Smickey 		be_chas : 16;	/* error code (interpret as 4 hex digits) */
6989c0b8818Smickey };
6999c0b8818Smickey 
70049ee3cc5Smickey #define	HPBE_HBOOT_CORRECTABLE	0	/* hard-boot corrctable error */
70149ee3cc5Smickey #define	HPBE_HBOOT_UNCORRECTBL	1	/* hard-boot uncorrectable error */
70249ee3cc5Smickey #define	HPBE_SBOOT_CORRECTABLE	2	/* soft-boot correctable error */
70349ee3cc5Smickey #define	HPBE_SBOOT_UNCORRECTBL	3	/* soft-boot uncorrectable error */
70449ee3cc5Smickey #define	HPBE_ETEST_MODUNUSABLE	4	/* ENTRY_TEST err: module's unusable */
70549ee3cc5Smickey #define	HPBE_ETEST_MODDEGRADED	5	/* ENTRY_TEST err: module in degraded mode */
70649ee3cc5Smickey 
7079c0b8818Smickey 
7089c0b8818Smickey /*
7099c0b8818Smickey  * The PDC uses the following structure to completely define an I/O
7109c0b8818Smickey  * module and the interface to its IODC.
7119c0b8818Smickey  */
712c325d8d3Smickey typedef
7139c0b8818Smickey struct pz_device {
7149c0b8818Smickey 	struct device_path pz_dp;
7159c0b8818Smickey #define	pz_flags	pz_dp.dp_flags
7169c0b8818Smickey #define	pz_bc		pz_dp.dp_bc
7179c0b8818Smickey #define	pz_mod		pz_dp.dp_mod
7189c0b8818Smickey #define	pz_layers	pz_dp.dp_layers
7196d6f4087Smickey 	u_int	pz_hpa;	/* HPA base address of device */
7206d6f4087Smickey 	u_int	pz_spa;		/* SPA base address (zero if no SPA exists) */
7216d6f4087Smickey 	u_int	pz_iodc_io;	/* entry point of device's driver routines */
7229c0b8818Smickey 	short	pz_resv;	/* (reserved) */
7239c0b8818Smickey 	u_short	pz_class;	/* (see below) */
724c325d8d3Smickey } pz_device_t;
7259c0b8818Smickey 
7269c0b8818Smickey /* pz_class */
7279c0b8818Smickey #define	PCL_NULL	0	/* illegal */
7289c0b8818Smickey #define	PCL_RANDOM	1	/* random access (disk) */
7299c0b8818Smickey #define	PCL_SEQU	2	/* sequential access (tape) */
7309c0b8818Smickey #define	PCL_DUPLEX	7	/* full-duplex point-to-point (RS-232, Net) */
7319c0b8818Smickey #define	PCL_KEYBD	8	/* half-duplex input (HIL Keyboard) */
7329c0b8818Smickey #define	PCL_DISPL	9	/* half-duplex ouptput (display) */
733150a2c64Smickey #define	PCL_FC		10	/* fibre channel access media */
734c325d8d3Smickey #define	PCL_CLASS_MASK	0xf	/* XXX class mask */
735c325d8d3Smickey #define	PCL_NET_MASK	0x1000	/* mask for bootp/tftp device */
736c325d8d3Smickey 
737c325d8d3Smickey /*
738c325d8d3Smickey  * The following structure defines what a particular IODC returns when
739c325d8d3Smickey  * given the IODC_DATA argument.
740c325d8d3Smickey  */
741c325d8d3Smickey struct iodc_data {
742c325d8d3Smickey 	u_int	iodc_model: 8,		/* hardware model number */
743c325d8d3Smickey 		iodc_revision:8,	/* software revision */
744c325d8d3Smickey 		iodc_spa_io: 1,		/* 0:memory, 1:device */
745c325d8d3Smickey 		iodc_spa_pack:1,	/* 1:packed multiplexor */
746c325d8d3Smickey 		iodc_spa_enb:1,		/* 1:has an spa */
747c325d8d3Smickey 		iodc_spa_shift:5,	/* power of two # bytes in SPA space */
748c325d8d3Smickey 		iodc_more: 1,		/* iodc_data is: 0:8-byte, 1:16-byte */
749cddff70fSmickey 		iodc_word: 1,		/* iodc_data is: 0:byte, 1:word */
750c325d8d3Smickey 		iodc_pf: 1,		/* 1:supports powerfail */
751c325d8d3Smickey 		iodc_type: 5;		/* see below */
752c325d8d3Smickey 	u_int	iodc_sv_rev: 4,		/* software version revision number */
753c325d8d3Smickey 		iodc_sv_model:20,	/* software interface model # */
754c325d8d3Smickey 		iodc_sv_opt: 8;		/* type-specific options */
755c325d8d3Smickey 	u_char	iodc_rev;		/* revision number of IODC code */
756c325d8d3Smickey 	u_char	iodc_dep;		/* module-dependent information */
757c325d8d3Smickey 	u_char	iodc_rsv[2];		/* reserved */
758c325d8d3Smickey 	u_short	iodc_cksum;		/* 16-bit checksum of whole IODC */
759c325d8d3Smickey 	u_short	iodc_length;		/* number of entry points in IODC */
760c325d8d3Smickey 		/* IODC entry points follow... */
761c325d8d3Smickey };
7629c0b8818Smickey 
7635e254c8eSmickey extern pdcio_t pdc;
7649c0b8818Smickey 
7650a473651Smickey #ifdef _KERNEL
7660a473651Smickey struct consdev;
7670a473651Smickey 
768c325d8d3Smickey extern int kernelmapped;
769c325d8d3Smickey 
770c4071fd1Smillert void pdc_init(void);
771c4071fd1Smillert int pdc_call(iodcio_t, int, ...);
772c325d8d3Smickey 
773c4071fd1Smillert void pdccnprobe(struct consdev *);
774c4071fd1Smillert void pdccninit(struct consdev *);
775c4071fd1Smillert int pdccngetc(dev_t);
776c4071fd1Smillert void pdccnputc(dev_t, int);
777c4071fd1Smillert void pdccnpollc(dev_t, int);
7780a473651Smickey #endif
7790a473651Smickey 
7805e254c8eSmickey #endif	/* !(_LOCORE) */
7819c0b8818Smickey 
782cddff70fSmickey #endif	/* _MACHINE_PDC_H_ */
783