Annotation of sys/arch/hppa/include/pdc.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: pdc.h,v 1.35 2007/07/15 20:03:48 kettenis Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 1990 mt Xinu, Inc. All rights reserved.
! 5: * Copyright (c) 1990,1991,1992,1994 University of Utah. All rights reserved.
! 6: *
! 7: * Permission to use, copy, modify and distribute this software is hereby
! 8: * granted provided that (1) source code retains these copyright, permission,
! 9: * and disclaimer notices, and (2) redistributions including binaries
! 10: * reproduce the notices in supporting documentation, and (3) all advertising
! 11: * materials mentioning features or use of this software display the following
! 12: * acknowledgement: ``This product includes software developed by the
! 13: * Computer Systems Laboratory at the University of Utah.''
! 14: *
! 15: * Copyright (c) 1990 mt Xinu, Inc.
! 16: * This file may be freely distributed in any form as long as
! 17: * this copyright notice is included.
! 18: * MTXINU, THE UNIVERSITY OF UTAH, AND CSL PROVIDE THIS SOFTWARE ``AS
! 19: * IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
! 20: * WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND
! 21: * FITNESS FOR A PARTICULAR PURPOSE.
! 22: *
! 23: * CSL requests users of this software to return to csl-dist@cs.utah.edu any
! 24: * improvements that they make and grant CSL redistribution rights.
! 25: *
! 26: * Utah $Hdr: pdc.h 1.12 94/12/14$
! 27: * Author: Jeff Forys (CSS), Dave Slattengren (mtXinu)
! 28: */
! 29:
! 30: #ifndef _MACHINE_PDC_H_
! 31: #define _MACHINE_PDC_H_
! 32:
! 33: /*
! 34: * Definitions for interaction with "Processor Dependent Code",
! 35: * which is a set of ROM routines used to provide information to the OS.
! 36: * Also includes definitions for the layout of "Page Zero" memory when
! 37: * boot code is invoked.
! 38: *
! 39: * Glossary:
! 40: * PDC: Processor Dependent Code (ROM or copy of ROM).
! 41: * IODC: I/O Dependent Code (module-type dependent code).
! 42: * IPL: Boot program (loaded into memory from boot device).
! 43: * HPA: Hard Physical Address (hardwired address).
! 44: * SPA: Soft Physical Address (reconfigurable address).
! 45: *
! 46: *
! 47: *
! 48: *
! 49: * Definitions for talking to IODC (I/O Dependent Code).
! 50: *
! 51: * The PDC is used to load I/O Dependent Code from a particular module.
! 52: * I/O Dependent Code is module-type dependent software which provides
! 53: * a uniform way to identify, initialize, and access a module (and in
! 54: * some cases, their devices).
! 55: */
! 56:
! 57: /*
! 58: * Our Initial Memory Module is laid out as follows.
! 59: *
! 60: * 0x000 +--------------------+
! 61: * | Page Zero (iomod.h)|
! 62: * 0x800 +--------------------+
! 63: * | |
! 64: * | |
! 65: * | PDC |
! 66: * | |
! 67: * | |
! 68: * MEM_FREE +--------------------+
! 69: * | |
! 70: * | Console IODC |
! 71: * | |
! 72: * MEM_FREE+64k +--------------------+
! 73: * | |
! 74: * | Boot Device IODC |
! 75: * | |
! 76: * IPL_START +--------------------+
! 77: * | |
! 78: * | IPL Code or Kernel |
! 79: * | |
! 80: * +--------------------+
! 81: *
! 82: * Restrictions:
! 83: * MEM_FREE (pagezero.mem_free) can be no greater than 32K.
! 84: * The PDC may use up to MEM_FREE + 32K (for Console & Boot IODC).
! 85: * IPL_START must be less than or equal to 64K.
! 86: *
! 87: * The IPL (boot) Code is immediately relocated to RELOC (check
! 88: * "../stand/Makefile") to make way for the Kernel.
! 89: */
! 90:
! 91: #define IODC_MAXSIZE (16 * 4 * 1024) /* maximum size of IODC */
! 92: #define IODC_MINIOSIZ 64 /* minimum buffer size for IODC call */
! 93: #define IODC_MAXIOSIZ (64 * 1024) /* maximum buffer size for IODC call */
! 94: #define IODC_IOSIZ (16 * 1024)
! 95:
! 96: #define PDC_ALIGNMENT __attribute__ ((__aligned__(64)))
! 97: #define PDC_STACKSIZE (4*NBPG)
! 98:
! 99: /*
! 100: * The PDC Entry Points and their arguments...
! 101: */
! 102:
! 103: #define PDC_POW_FAIL 1 /* prepare for power failure */
! 104: #define PDC_POW_FAIL_DFLT 0
! 105:
! 106: #define PDC_CHASSIS 2 /* update chassis display (see below) */
! 107: #define PDC_CHASSIS_DISP 0 /* update display */
! 108: #define PDC_CHASSIS_WARN 1 /* return warnings */
! 109: #define PDC_CHASSIS_ALL 2 /* update display & return warnings */
! 110: #define PDC_CHASSIS_INFO 128 /* return led/lcd info */
! 111:
! 112: #define PDC_PIM 3 /* access Processor Internal Memory */
! 113: #define PDC_PIM_HPMC 0 /* read High Pri Mach Chk data */
! 114: #define PDC_PIM_SIZE 1 /* return size */
! 115: #define PDC_PIM_LPMC 2 /* read Low Pri Mach Chk data */
! 116: #define PDC_PIM_SBD 3 /* read soft boot data */
! 117: #define PDC_PIM_TOC 4 /* read TOC data (used to use HPMC) */
! 118:
! 119: #define PDC_MODEL 4 /* processor model number info */
! 120: #define PDC_MODEL_INFO 0 /* processor model number info */
! 121: #define PDC_MODEL_BOOTID 1 /* set BOOT_ID of processor */
! 122: #define PDC_MODEL_COMP 2 /* return component version numbers */
! 123: #define PDC_MODEL_MODEL 3 /* return system model information */
! 124: #define PDC_MODEL_ENSPEC 4 /* enable product-specific instrs */
! 125: #define PDC_MODEL_DISPEC 5 /* disable product-specific instrs */
! 126: #define PDC_MODEL_CPUID 6 /* return CPU versions */
! 127: #define PDC_MODEL_CPBALITIES 7 /* return capabilites */
! 128: #define PDC_MODEL_GETBOOTOPTS 8 /* return boot test options */
! 129: #define PDC_MODEL_SETBOOTOPTS 9 /* set boot test options */
! 130:
! 131: #define PDC_CACHE 5 /* return cache and TLB params */
! 132: #define PDC_CACHE_DFLT 0 /* return parameters */
! 133: #define PDC_CACHE_SETCS 1 /* set coherence state */
! 134: #define PDC_CACHE_GETSPIDB 2 /* get space-id bits */
! 135:
! 136: #define PDC_HPA 6 /* return HPA of processor */
! 137: #define PDC_HPA_DFLT 0
! 138: #define PDC_HPA_MODULES 1
! 139:
! 140: #define PDC_COPROC 7 /* return co-processor configuration */
! 141: #define PDC_COPROC_DFLT 0
! 142:
! 143: #define PDC_IODC 8 /* talk to IODC */
! 144: #define PDC_IODC_READ 0 /* read IODC entry point */
! 145: #define IODC_DATA 0 /* get first 16 bytes from mod IODC */
! 146: #define IODC_INIT 3 /* initialize (see options below) */
! 147: #define IODC_INIT_FIRST 2 /* find first device on module */
! 148: #define IODC_INIT_NEXT 3 /* find subsequent devices on module */
! 149: #define IODC_INIT_ALL 4 /* initialize module and device */
! 150: #define IODC_INIT_DEV 5 /* initialize device */
! 151: #define IODC_INIT_MOD 6 /* initialize module */
! 152: #define IODC_INIT_MSG 9 /* return error message(s) */
! 153: #define IODC_INIT_STR 20 /* find device w/ spec in string */
! 154: #define IODC_IO 4 /* perform I/O (see options below) */
! 155: #define IODC_IO_READ 0 /* read from boot device */
! 156: #define IODC_IO_WRITE 1 /* write to boot device */
! 157: #define IODC_IO_CONSIN 2 /* read from console */
! 158: #define IODC_IO_CONSOUT 3 /* write to conosle */
! 159: #define IODC_IO_CLOSE 4 /* close device */
! 160: #define IODC_IO_MSG 9 /* return error message(s) */
! 161: #define IODC_SPA 5 /* get extended SPA information */
! 162: #define IODC_SPA_DFLT 0 /* return SPA information */
! 163: #define IODC_TEST 8 /* perform self tests */
! 164: #define IODC_TEST_INFO 0 /* return test information */
! 165: #define IODC_TEST_STEP 1 /* execute a particular test */
! 166: #define IODC_TEST_TEST 2 /* describe a test section */
! 167: #define IODC_TEST_MSG 9 /* return error message(s) */
! 168: #define PDC_IODC_NINIT 2 /* non-destructive init */
! 169: #define PDC_IODC_DINIT 3 /* destructive init */
! 170: #define PDC_IODC_MEMERR 4 /* check for memory errors */
! 171: #define PDC_IODC_IMEMMASTER 5 /* interlieved memory master ID */
! 172:
! 173: #define PDC_TOD 9 /* access time-of-day clock */
! 174: #define PDC_TOD_READ 0 /* read TOD clock */
! 175: #define PDC_TOD_WRITE 1 /* write TOD clock */
! 176: #define PDC_TOD_ITIMER 2 /* calibrate Interval Timer (CR16) */
! 177:
! 178: #define PDC_STABLE 10 /* access Stable Storage (SS) */
! 179: #define PDC_STABLE_READ 0 /* read SS */
! 180: #define PDC_STABLE_WRITE 1 /* write SS */
! 181: #define PDC_STABLE_SIZE 2 /* return size of SS */
! 182: #define PDC_STABLE_VRFY 3 /* verify contents of SS */
! 183: #define PDC_STABLE_INIT 4 /* initialize SS */
! 184:
! 185: #define PDC_NVM 11 /* access Non-Volatile Memory (NVM) */
! 186: #define PDC_NVM_READ 0 /* read NVM */
! 187: #define PDC_NVM_WRITE 1 /* write NVM */
! 188: #define PDC_NVM_SIZE 2 /* return size of NVM */
! 189: #define PDC_NVM_VRFY 3 /* verify contents of NVM */
! 190: #define PDC_NVM_INIT 4 /* initialize NVM */
! 191:
! 192: #define PDC_ADD_VALID 12 /* check address for validity */
! 193: #define PDC_ADD_VALID_DFLT 0
! 194:
! 195: #define PDC_BUS_BAD 13 /* verify Error Detection Circuitry (EDC) */
! 196: #define PDC_BUS_BAD_DLFT 0
! 197:
! 198: #define PDC_DEBUG 14 /* return address of PDC debugger */
! 199: #define PDC_DEBUG_DFLT 0
! 200:
! 201: #define PDC_INSTR 15 /* return instr that invokes PDCE_CHECK */
! 202: #define PDC_INSTR_DFLT 0
! 203:
! 204: #define PDC_PROC 16 /* stop currently executing processor */
! 205: #define PDC_PROC_STOP 0
! 206: #define PDC_PROC_RENDEZVOUS 1
! 207:
! 208: #define PDC_CONF 17 /* (de)configure a module */
! 209: #define PDC_CONF_DECONF 0 /* deconfigure module */
! 210: #define PDC_CONF_RECONF 1 /* reconfigure module */
! 211: #define PDC_CONF_INFO 2 /* get config informaion */
! 212:
! 213: #define PDC_BLOCK_TLB 18 /* Manage Block TLB entries (BTLB) */
! 214: #define PDC_BTLB_DEFAULT 0 /* Return BTLB configuration info */
! 215: #define PDC_BTLB_INSERT 1 /* Insert a BTLB entry */
! 216: #define PDC_BTLB_PURGE 2 /* Purge a BTLB entry */
! 217: #define PDC_BTLB_PURGE_ALL 3 /* Purge all BTLB entries */
! 218:
! 219: #define PDC_TLB 19 /* Manage Hardware TLB handling */
! 220: #define PDC_TLB_INFO 0 /* Return HW-TLB configuration info */
! 221: #define PDC_TLB_CONFIG 1 /* Set HW-TLB pdir base and size */
! 222:
! 223: #define PDC_TLB_CURRPDE 1 /* cr28 points to current pde on miss */
! 224: #define PDC_TLB_RESERVD 3 /* reserved */
! 225: #define PDC_TLB_NEXTPDE 5 /* cr28 points to next pde on miss */
! 226: #define PDC_TLB_WORD3 7 /* cr28 is word 3 of 16 byte pde */
! 227:
! 228: #define PDC_PSW 21 /* manage default values of configurable psw bits */
! 229: #define PDC_PSW_GETMASK 0 /* get mask */
! 230: #define PDC_PSW_DEFAULTS 1 /* get default bits values */
! 231: #define PDC_PSW_SETDEFAULTS 2 /* set default bits values */
! 232:
! 233: #define PDC_SYSMAP 22 /* map system modules */
! 234: #define PDC_SYSMAP_FIND 0 /* find module by index */
! 235: #define PDC_SYSMAP_ADDR 1 /* fetch list of addresses */
! 236: #define PDC_SYSMAP_HPA 2 /* get hpa from devpath */
! 237:
! 238: #define PDC_SOFT_POWER 23 /* support for soft power switch */
! 239: #define PDC_SOFT_POWER_INFO 0 /* get info about soft power switch */
! 240: #define PDC_SOFT_POWER_ENABLE 1 /* enable/disable soft power switch */
! 241:
! 242: #define PDC_PAT_CELL 64 /* cell operations */
! 243: #define PDC_PAT_CELL_GETID 0 /* get cell id number */
! 244: #define PDC_PAT_CELL_GETINFO 1 /* get cell info */
! 245: #define PDC_PAT_CELL_MODULE 2 /* get module info */
! 246: #define PDC_PAT_IOVIEW 0
! 247: #define PDC_PAT_PAVIEW 1
! 248:
! 249: #define PDC_PAT_CHASSIS 65 /* chassis log ops */
! 250: #define PDC_PAT_CHASSIS_WRITE 0
! 251: #define PDC_PAT_CHASSIS_READ 1
! 252:
! 253: #define PDC_PAT_CPU 67
! 254:
! 255: #define PDC_PAT_EVENT 68
! 256:
! 257: #define PDC_PAT_HPMC 70
! 258:
! 259: #define PDC_PAT_IO 71 /* online services for IO modules */
! 260: #define PDC_PAT_IO_GET_PCI_RTSZ 15
! 261: #define PDC_PAT_IO_GET_PCI_RT 16
! 262:
! 263: #define PDC_PAT_MEM 72
! 264:
! 265: #define PDC_PAT_NVRAM 73
! 266:
! 267: #define PDC_PAT_PROTDOM 74
! 268:
! 269: #define PDC_MEMMAP 128 /* hp700: return page information */
! 270: #define PDC_MEMMAP_HPA 0 /* map module # to HPA */
! 271:
! 272: #define PDC_EEPROM 129 /* Hversion dependent */
! 273: #define PDC_EEPROM_READ_WORD 0
! 274: #define PDC_EEPROM_WRITE_WORD 1
! 275: #define PDC_EEPROM_READ_BYTE 2
! 276: #define PDC_EEPROM_WRITE_BYTE 3
! 277:
! 278: #define PDC_IO 135
! 279: #define PDC_IO_READ_AND_CLEAR_ERRORS 0
! 280: #define PDC_IO_RESET 1
! 281: #define PDC_IO_RESET_DEVICES 2
! 282:
! 283: #define PDC_BROADCAST_RESET 136
! 284: #define PDC_DO_RESET 0
! 285: #define PDC_DO_FIRM_TEST_RESET 1
! 286: #define PDC_BR_RECONFIGURATION 2
! 287:
! 288: #define PDC_LAN_STATION_ID 138 /* Hversion dependent mechanism for */
! 289: #define PDC_LAN_STATION_ID_READ 0 /* getting the lan station address */
! 290:
! 291: #define PDC_PCI_INDEX 147 /* PCI rt access */
! 292: #define PDC_PCI_GET_INT_TBL_SZ 13
! 293: #define PDC_PCI_GET_INT_TBL 14
! 294:
! 295: #define PDC_ERR_OK 0 /* operation complete */
! 296: #define PDC_ERR_WARNING 3 /* OK, but warning */
! 297: #define PDC_ERR_NOPROC -1 /* no such procedure */
! 298: #define PDC_ERR_NOPT -2 /* no such option */
! 299: #define PDC_ERR_COMPL -3 /* unable to complete w/o error */
! 300: #define PDC_ERR_EOD -9 /* end of device list */
! 301: #define PDC_ERR_INVAL -10 /* invalid argument */
! 302: #define PDC_ERR_PFAIL -12 /* aborted by powerfail */
! 303:
! 304: #if !defined(_LOCORE)
! 305:
! 306: struct iomod;
! 307:
! 308: typedef int (*pdcio_t)(int, int, ...);
! 309: typedef int (*iodcio_t)(u_int, int, ...);
! 310:
! 311: /*
! 312: * Commonly used PDC calls and the structures they return.
! 313: */
! 314:
! 315: /*
! 316: * Device path specifications used by PDC.
! 317: */
! 318: struct device_path {
! 319: u_char dp_flags; /* see bit definitions below */
! 320: char dp_bc[6]; /* Bus Converter routing info to a specific */
! 321: /* I/O adaptor (< 0 means none, > 63 resvd) */
! 322: u_char dp_mod; /* fixed field of specified module */
! 323: int dp_layers[6]; /* device-specific info (ctlr #, unit # ...) */
! 324: };
! 325:
! 326: struct pdc_model { /* PDC_MODEL */
! 327: u_int hvers; /* hardware version */
! 328: u_int rev : 4; /* zero for all native processors */
! 329: u_int model : 20; /* 4 for all native processors */
! 330: u_int sh : 1; /* shadow registers are present */
! 331: u_int reserved : 2; /* reserved */
! 332: u_int mc : 1; /* module category (A - 0, B - 1) */
! 333: u_int reserved1 : 2; /* reserved */
! 334: u_int pa_lvl : 2; /* PA-RISC level */
! 335: u_int hw_id; /* unique processor hardware identifier */
! 336: u_int boot_id; /* same as hw_id */
! 337: u_int sw_id; /* software security and licensing */
! 338: u_int sw_cap; /* OS capabilities of processor */
! 339: u_int arch_rev; /* architecture revision */
! 340: u_int pot_key; /* potential key */
! 341: u_int curr_key; /* current key */
! 342: int filler1;
! 343: u_int filler2[22];
! 344: };
! 345:
! 346: struct pdc_cpuid { /* PDC_MODEL_CPUID */
! 347: u_int reserved : 20;
! 348: u_int version : 7; /* CPU version */
! 349: u_int revision : 5; /* CPU revision */
! 350: u_int filler[31];
! 351: };
! 352:
! 353: struct pdc_getbootopts { /* PDC_MODEL_GETBOOTOPTS */
! 354: u_int cur_test; /* current enabled tests */
! 355: u_int sup_test; /* supported tests */
! 356: u_int def_test; /* default enabled tests */
! 357: u_int filler[29];
! 358: };
! 359:
! 360: struct cache_cf { /* PDC_CACHE (for "struct pdc_cache") */
! 361: u_int cc_alias: 4, /* virtual address aliasing boundary */
! 362: cc_block: 4, /* used to determine most efficient stride */
! 363: cc_line : 3, /* max data written by store (16-byte mults) */
! 364: cc_resv1: 2, /* (reserved) */
! 365: cc_wt : 1, /* D-cache: write-to = 0, write-through = 1 */
! 366: cc_sh : 2, /* separate I and D = 0, shared I and D = 1 */
! 367: cc_cst : 3, /* D-cache: incoherent = 0, coherent = 1 */
! 368: cc_resv2:11, /* (reserved) */
! 369: cc_hvers: 2; /* H-VERSION dependent */
! 370: };
! 371:
! 372: struct tlb_cf { /* PDC_CACHE (for "struct pdc_cache") */
! 373: u_int tc_resv1:12, /* (reserved) */
! 374: tc_sh : 2, /* separate I and D = 0, shared I and D = 1 */
! 375: tc_hvers: 1, /* H-VERSION dependent */
! 376: tc_page : 1, /* 2K page size = 0, 4k page size = 1 */
! 377: tc_cst : 3, /* incoherent = 0, coherent = 1 */
! 378: tc_resv2: 5, /* (reserved) */
! 379: tc_assoc: 8; /* associativity of TLB */
! 380: };
! 381:
! 382: struct pdc_cache { /* PDC_CACHE */
! 383: /* Instruction cache */
! 384: u_int ic_size; /* size of I-cache (in bytes) */
! 385: struct cache_cf ic_conf;/* cache configuration (see above) */
! 386: u_int ic_base; /* start addr of I-cache (for FICE flush) */
! 387: u_int ic_stride; /* addr incr per i_count iteration (flush) */
! 388: u_int ic_count; /* number of i_loop iterations (flush) */
! 389: u_int ic_loop; /* number of FICE's per addr stride (flush) */
! 390: /* Data cache */
! 391: u_int dc_size; /* size of D-cache (in bytes) */
! 392: struct cache_cf dc_conf;/* cache configuration (see above) */
! 393: u_int dc_base; /* start addr of D-cache (for FDCE flush) */
! 394: u_int dc_stride; /* addr incr per d_count iteration (flush) */
! 395: u_int dc_count; /* number of d_loop iterations (flush) */
! 396: u_int dc_loop; /* number of FDCE's per addr stride (flush) */
! 397: /* Instruction TLB */
! 398: u_int it_size; /* number of entries in I-TLB */
! 399: struct tlb_cf it_conf; /* I-TLB configuration (see above) */
! 400: u_int it_sp_base; /* start space of I-TLB (for PITLBE flush) */
! 401: u_int it_sp_stride; /* space incr per sp_count iteration (flush) */
! 402: u_int it_sp_count; /* number of off_count iterations (flush) */
! 403: u_int it_off_base; /* start offset of I-TLB (for PITLBE flush) */
! 404: u_int it_off_stride; /* offset incr per off_count iteration (flush)*/
! 405: u_int it_off_count; /* number of it_loop iterations/space (flush) */
! 406: u_int it_loop; /* number of PITLBE's per off_stride (flush) */
! 407: /* Data TLB */
! 408: u_int dt_size; /* number of entries in D-TLB */
! 409: struct tlb_cf dt_conf; /* D-TLB configuration (see above) */
! 410: u_int dt_sp_base; /* start space of D-TLB (for PDTLBE flush) */
! 411: u_int dt_sp_stride; /* space incr per sp_count iteration (flush) */
! 412: u_int dt_sp_count; /* number of off_count iterations (flush) */
! 413: u_int dt_off_base; /* start offset of D-TLB (for PDTLBE flush) */
! 414: u_int dt_off_stride; /* offset incr per off_count iteration (flush)*/
! 415: u_int dt_off_count; /* number of dt_loop iterations/space (flush) */
! 416: u_int dt_loop; /* number of PDTLBE's per off_stride (flush) */
! 417: u_int filler[2];
! 418: };
! 419:
! 420: struct pdc_spidb { /* PDC_CACHE, PDC_CACHE_GETSPIDB */
! 421: u_int spidR1 : 4;
! 422: u_int spidbits : 12;
! 423: u_int spidR2 : 16;
! 424: u_int filler[31];
! 425: };
! 426:
! 427: struct pdc_cst {
! 428: u_int cstR1 : 16;
! 429: u_int cst : 3;
! 430: u_int cstR2 : 13;
! 431: };
! 432:
! 433: struct pdc_coherence { /* PDC_CACHE, PDC_CACHE_SETCS */
! 434: struct pdc_cst ia;
! 435: #define ia_cst ia.cst
! 436: struct pdc_cst da;
! 437: #define da_cst da.cst
! 438: struct pdc_cst ita;
! 439: #define ita_cst ita.cst
! 440: struct pdc_cst dta;
! 441: #define dta_cst dta.cst
! 442: u_int filler[28];
! 443: };
! 444:
! 445: struct pdc_hpa { /* PDC_HPA */
! 446: u_int hpa; /* HPA of processor */
! 447: int filler1;
! 448: u_int filler2[30];
! 449: };
! 450:
! 451: struct pdc_coproc { /* PDC_COPROC */
! 452: u_int ccr_enable; /* same format as CCR (CR 10) */
! 453: u_int ccr_present; /* which co-proc's are present (bitset) */
! 454: u_int pad[15];
! 455: u_int fpu_revision;
! 456: u_int fpu_model;
! 457: u_int filler2[13];
! 458: };
! 459:
! 460: struct pdc_tod { /* PDC_TOD, PDC_TOD_READ */
! 461: u_int sec; /* elapsed time since 00:00:00 GMT, 1/1/70 */
! 462: u_int usec; /* accurate to microseconds */
! 463: u_int filler2[30];
! 464: };
! 465:
! 466: struct pdc_itimer { /* PDC_TOD_ITIMER */
! 467: u_int calib0; /* double giving itmr freq */
! 468: u_int calib1;
! 469: u_int tod_acc; /* TOD accuracy in 1e-9 part */
! 470: u_int cr_acc; /* itmr accuracy in 1e-9 parts */
! 471: u_int filler[28];
! 472: };
! 473:
! 474: struct pdc_nvm { /* PDC_NVM */
! 475: u_int hv[9]; /* 0x00: HV dependent */
! 476: struct device_path bootpath; /* 0x24: boot path */
! 477: u_int isl_ver; /* 0x44: ISL revision */
! 478: u_int timestamp; /* 0x48: timestamp */
! 479: u_int lif_ue[12]; /* 0x4c: LIF utility entries */
! 480: u_int eptr; /* 0x7c: entry pointer */
! 481: u_int os_panic[32]; /* 0x80: OS panic info */
! 482: };
! 483:
! 484: struct pdc_instr { /* PDC_INSTR */
! 485: u_int instr; /* instruction that invokes PDC mchk entry pt */
! 486: int filler1;
! 487: u_int filler2[30];
! 488: };
! 489:
! 490: struct pdc_iodc_read { /* PDC_IODC, PDC_IODC_READ */
! 491: int size; /* number of bytes in selected entry point */
! 492: int filler1;
! 493: u_int filler2[30];
! 494: };
! 495:
! 496: struct pdc_iodc_minit { /* PDC_IODC, PDC_IODC_NINIT or PDC_IODC_DINIT */
! 497: u_int stat; /* HPA.io_status style error returns */
! 498: u_int max_spa; /* size of SPA (in bytes) > max_mem+map_mem */
! 499: u_int max_mem; /* size of "implemented" memory (in bytes) */
! 500: u_int map_mem; /* size of "mappable-only" memory (in bytes) */
! 501: u_int filler[28];
! 502: };
! 503:
! 504: struct btlb_info { /* for "struct pdc_btlb" (PDC_BTLB) */
! 505: u_int resv0: 8, /* (reserved) */
! 506: num_i: 8, /* Number of instruction slots */
! 507: num_d: 8, /* Number of data slots */
! 508: num_c: 8; /* Number of combined slots */
! 509: };
! 510:
! 511: struct pdc_btlb { /* PDC_BLOCK_TLB */
! 512: u_int min_size; /* Min size in pages */
! 513: u_int max_size; /* Max size in pages */
! 514: struct btlb_info finfo; /* Fixed range info */
! 515: struct btlb_info vinfo; /* Variable range info */
! 516: u_int filler[28];
! 517: };
! 518:
! 519: struct pdc_hwtlb { /* PDC_TLB */
! 520: u_int min_size; /* What do these mean? */
! 521: u_int max_size;
! 522: u_int filler[30];
! 523: };
! 524:
! 525: struct pdc_power_info { /* PDC_SOFT_POWER_INFO */
! 526: u_int addr; /* power register address */
! 527: u_int filler[30];
! 528: };
! 529:
! 530: struct pdc_sysmap_find { /* PDC_SYSMAP_FIND */
! 531: u_int hpa;
! 532: u_int size; /* pages */
! 533: u_int naddrs;
! 534: u_int filler[29];
! 535: };
! 536:
! 537: struct pdc_sysmap_addrs { /* PDC_SYSMAP_ADDR */
! 538: u_int hpa;
! 539: u_int size; /* pages */
! 540: u_int filler[30];
! 541: };
! 542:
! 543: struct pdc_sysmap_hpa { /* PDC_SYSMAP_HPA */
! 544: u_int hpa;
! 545: u_int size;
! 546: u_int naddrs;
! 547: u_int mod;
! 548: u_int filler[28];
! 549: };
! 550:
! 551: struct pdc_pat_cell_id { /* PDC_PAT_CELL_GETID */
! 552: u_long id; /* cell id */
! 553: u_long loc; /* cell location */
! 554: u_long filler[14];
! 555: };
! 556:
! 557: struct pdc_pat_cell_module { /* PDC_PAT_CELL_MODULE */
! 558: u_long chpa; /* config space HPA */
! 559: u_long info; /* module info */
! 560: #define PDC_PAT_CELL_MODTYPE(t) (((t) >> 56) & 0xff)
! 561: #define PDC_PAT_CELL_MODDVI(t) (((t) >> 48) & 0xff)
! 562: #define PDC_PAT_CELL_MODIOC(t) (((t) >> 40) & 0xff)
! 563: #define PDC_PAT_CELL_MODSIZE(t) (((t) & 0xffffff) << PAGE_SHIFT)
! 564: u_long loc; /* module location */
! 565: struct device_path dp; /* module path */
! 566: u_long pad[508]; /* cell module gedoens */
! 567: };
! 568:
! 569: struct pdc_pat_io_num { /* PDC_PAT_IO */
! 570: u_int num;
! 571: u_int filler[31];
! 572: };
! 573:
! 574: struct pdc_pat_pci_rt { /* PDC_PAT_IO_GET_PCI_RT */
! 575: u_int8_t type; /* 0x8b */
! 576: u_int8_t len;
! 577: u_int8_t itype; /* 0 -- vectored int */
! 578: u_int8_t trigger; /* polarity/level */
! 579: u_int8_t pin; /* PCI pin number */
! 580: u_int8_t bus;
! 581: u_int8_t seg; /* reserved */
! 582: u_int8_t line;
! 583: u_int64_t addr; /* io sapic address */
! 584: };
! 585:
! 586: struct pdc_memmap { /* PDC_MEMMAP */
! 587: u_int hpa; /* HPA for module */
! 588: u_int morepages; /* additional IO pages */
! 589: u_int filler[30];
! 590: };
! 591:
! 592: struct pdc_lan_station_id { /* PDC_LAN_STATION_ID */
! 593: u_int8_t addr[6];
! 594: u_int8_t filler1[2];
! 595: u_int filler2[30];
! 596: };
! 597:
! 598: /*
! 599: * The PDC_CHASSIS is a strange bird. The format for updating the display
! 600: * is as follows:
! 601: *
! 602: * 0 11 12 14 15 16 19 20 23 24 27 28 31
! 603: * +-------+----------+-------+--------+--------+--------+--------+
! 604: * | R | OS State | Blank | Hex1 | Hex2 | Hex3 | Hex4 |
! 605: * +-------+----------+-------+--------+--------+--------+--------+
! 606: *
! 607: * Unfortunately, someone forgot to tell the hardware designers that
! 608: * there was supposed to be a hex display somewhere. The result is,
! 609: * you can only toggle 5 LED's and the fault light.
! 610: *
! 611: * Interesting values for Hex1-Hex4 and the resulting LED displays:
! 612: *
! 613: * FnFF CnFF:
! 614: * 0 - - - - - Counts in binary from 0x0 - 0xF
! 615: * 2 o - - - - for corresponding values of `n'.
! 616: * 4 o o - - -
! 617: * 6 o o o - -
! 618: * 8 o o o o -
! 619: * A o o o o o
! 620: *
! 621: * If the "Blank" bit is set, the display should be made blank.
! 622: * The values for "OS State" are defined below.
! 623: */
! 624:
! 625: #define PDC_CHASSIS_BAR 0xF0FF /* create a bar graph with LEDs */
! 626: #define PDC_CHASSIS_CNT 0xC0FF /* count with LEDs */
! 627:
! 628: #define PDC_OSTAT(os) (((os) & 0x7) << 17)
! 629: #define PDC_OSTAT_OFF 0x0 /* all off */
! 630: #define PDC_OSTAT_FAULT 0x1 /* the red LED of death */
! 631: #define PDC_OSTAT_TEST 0x2 /* self test */
! 632: #define PDC_OSTAT_BOOT 0x3 /* boot program running */
! 633: #define PDC_OSTAT_SHUT 0x4 /* shutdown in progress */
! 634: #define PDC_OSTAT_WARN 0x5 /* battery dying, etc */
! 635: #define PDC_OSTAT_RUN 0x6 /* OS running */
! 636: #define PDC_OSTAT_ON 0x7 /* all on */
! 637:
! 638: struct pdc_chassis_info {
! 639: u_int size;
! 640: u_int max_size;
! 641: u_int filler[30];
! 642: };
! 643:
! 644: struct pdc_chassis_lcd {
! 645: u_int model : 16,
! 646: width : 16;
! 647: u_int cmd_addr;
! 648: u_int data_addr;
! 649: u_int delay;
! 650: u_int8_t line[2];
! 651: u_int8_t enabled;
! 652: u_int8_t heartbeat[3];
! 653: u_int8_t disk[3];
! 654: u_int filler[25];
! 655: };
! 656:
! 657: /* dp_flags */
! 658: #define PZF_AUTOBOOT 0x80 /* These two are PDC flags for how to locate */
! 659: #define PZF_AUTOSEARCH 0x40 /* the "boot device" */
! 660: #define PZF_TIMER 0x0f /* power of 2 # secs "boot timer" (0 == dflt) */
! 661: #define PZF_BITS "\020\010autoboot\07autosearch"
! 662:
! 663: /* macros to decode serial parameters out of dp_layers */
! 664: #define PZL_BITS(l) (((l) & 0x03) + 5)
! 665: #define PZL_PARITY(l) (((l) & 0x18) >> 3)
! 666: #define PZL_SPEED(l) (((l) & 0x3c0) >> 6)
! 667: #define PZL_ENCODE(bits, parity, speed) \
! 668: (((bits) - 5) & 0x03) | (((parity) & 0x3) << 3) | \
! 669: (((speed) & 0x0f) << 6)
! 670:
! 671: /*
! 672: * A processors Stable Storage is accessed through the PDC. There are
! 673: * at least 96 bytes of stable storage (the device path information may
! 674: * or may not exist). However, as far as I know, processors provide at
! 675: * least 192 bytes of stable storage.
! 676: */
! 677: struct stable_storage {
! 678: struct device_path ss_pri_boot; /* (see above) */
! 679: char ss_filenames[32];
! 680: u_short ss_os_version; /* 0 == none, 1 == HP-UX, 2 == MPE-XL */
! 681: char ss_os[22]; /* OS-dependant information */
! 682: char ss_pdc[7]; /* reserved */
! 683: char ss_fast_size; /* how much memory to test. 0xf == all, or */
! 684: /* else it's (256KB << ss_fast_size) */
! 685: struct device_path ss_console;
! 686: struct device_path ss_alt_boot;
! 687: struct device_path ss_keyboard;
! 688: };
! 689:
! 690: /*
! 691: * Recoverable error indications provided to boot code by the PDC.
! 692: * Any non-zero value indicates error.
! 693: */
! 694: struct boot_err {
! 695: u_int be_resv : 10, /* (reserved) */
! 696: be_fixed : 6, /* module that produced error */
! 697: be_chas : 16; /* error code (interpret as 4 hex digits) */
! 698: };
! 699:
! 700: #define HPBE_HBOOT_CORRECTABLE 0 /* hard-boot corrctable error */
! 701: #define HPBE_HBOOT_UNCORRECTBL 1 /* hard-boot uncorrectable error */
! 702: #define HPBE_SBOOT_CORRECTABLE 2 /* soft-boot correctable error */
! 703: #define HPBE_SBOOT_UNCORRECTBL 3 /* soft-boot uncorrectable error */
! 704: #define HPBE_ETEST_MODUNUSABLE 4 /* ENTRY_TEST err: module's unusable */
! 705: #define HPBE_ETEST_MODDEGRADED 5 /* ENTRY_TEST err: module in degraded mode */
! 706:
! 707:
! 708: /*
! 709: * The PDC uses the following structure to completely define an I/O
! 710: * module and the interface to its IODC.
! 711: */
! 712: typedef
! 713: struct pz_device {
! 714: struct device_path pz_dp;
! 715: #define pz_flags pz_dp.dp_flags
! 716: #define pz_bc pz_dp.dp_bc
! 717: #define pz_mod pz_dp.dp_mod
! 718: #define pz_layers pz_dp.dp_layers
! 719: u_int pz_hpa; /* HPA base address of device */
! 720: u_int pz_spa; /* SPA base address (zero if no SPA exists) */
! 721: u_int pz_iodc_io; /* entry point of device's driver routines */
! 722: short pz_resv; /* (reserved) */
! 723: u_short pz_class; /* (see below) */
! 724: } pz_device_t;
! 725:
! 726: /* pz_class */
! 727: #define PCL_NULL 0 /* illegal */
! 728: #define PCL_RANDOM 1 /* random access (disk) */
! 729: #define PCL_SEQU 2 /* sequential access (tape) */
! 730: #define PCL_DUPLEX 7 /* full-duplex point-to-point (RS-232, Net) */
! 731: #define PCL_KEYBD 8 /* half-duplex input (HIL Keyboard) */
! 732: #define PCL_DISPL 9 /* half-duplex ouptput (display) */
! 733: #define PCL_FC 10 /* fibre channel access media */
! 734: #define PCL_CLASS_MASK 0xf /* XXX class mask */
! 735: #define PCL_NET_MASK 0x1000 /* mask for bootp/tftp device */
! 736:
! 737: /*
! 738: * The following structure defines what a particular IODC returns when
! 739: * given the IODC_DATA argument.
! 740: */
! 741: struct iodc_data {
! 742: u_int iodc_model: 8, /* hardware model number */
! 743: iodc_revision:8, /* software revision */
! 744: iodc_spa_io: 1, /* 0:memory, 1:device */
! 745: iodc_spa_pack:1, /* 1:packed multiplexor */
! 746: iodc_spa_enb:1, /* 1:has an spa */
! 747: iodc_spa_shift:5, /* power of two # bytes in SPA space */
! 748: iodc_more: 1, /* iodc_data is: 0:8-byte, 1:16-byte */
! 749: iodc_word: 1, /* iodc_data is: 0:byte, 1:word */
! 750: iodc_pf: 1, /* 1:supports powerfail */
! 751: iodc_type: 5; /* see below */
! 752: u_int iodc_sv_rev: 4, /* software version revision number */
! 753: iodc_sv_model:20, /* software interface model # */
! 754: iodc_sv_opt: 8; /* type-specific options */
! 755: u_char iodc_rev; /* revision number of IODC code */
! 756: u_char iodc_dep; /* module-dependent information */
! 757: u_char iodc_rsv[2]; /* reserved */
! 758: u_short iodc_cksum; /* 16-bit checksum of whole IODC */
! 759: u_short iodc_length; /* number of entry points in IODC */
! 760: /* IODC entry points follow... */
! 761: };
! 762:
! 763: extern pdcio_t pdc;
! 764:
! 765: #ifdef _KERNEL
! 766: struct consdev;
! 767:
! 768: extern int kernelmapped;
! 769:
! 770: void pdc_init(void);
! 771: int pdc_call(iodcio_t, int, ...);
! 772:
! 773: void pdccnprobe(struct consdev *);
! 774: void pdccninit(struct consdev *);
! 775: int pdccngetc(dev_t);
! 776: void pdccnputc(dev_t, int);
! 777: void pdccnpollc(dev_t, int);
! 778: #endif
! 779:
! 780: #endif /* !(_LOCORE) */
! 781:
! 782: #endif /* _MACHINE_PDC_H_ */
CVSweb