[BACK]Return to pdc.h CVS log [TXT][DIR] Up to [local] / sys / arch / hppa / include

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