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

Annotation of sys/arch/hppa/include/iomod.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: iomod.h,v 1.17 2005/04/07 00:21:51 mickey Exp $       */
                      2:
                      3: /*
                      4:  * Copyright (c) 2000-2004 Michael Shalayeff
                      5:  * All rights reserved.
                      6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  * 2. Redistributions in binary form must reproduce the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer in the
                     14:  *    documentation and/or other materials provided with the distribution.
                     15:  *
                     16:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     17:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     18:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     19:  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
                     20:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
                     21:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
                     22:  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     23:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     24:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
                     25:  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
                     26:  * THE POSSIBILITY OF SUCH DAMAGE.
                     27:  */
                     28: /*
                     29:  * Copyright (c) 1990 mt Xinu, Inc.  All rights reserved.
                     30:  * Copyright (c) 1990,1991,1992,1994 University of Utah.  All rights reserved.
                     31:  *
                     32:  * Permission to use, copy, modify and distribute this software is hereby
                     33:  * granted provided that (1) source code retains these copyright, permission,
                     34:  * and disclaimer notices, and (2) redistributions including binaries
                     35:  * reproduce the notices in supporting documentation, and (3) all advertising
                     36:  * materials mentioning features or use of this software display the following
                     37:  * acknowledgement: ``This product includes software developed by the
                     38:  * Computer Systems Laboratory at the University of Utah.''
                     39:  *
                     40:  * Copyright (c) 1990 mt Xinu, Inc.
                     41:  * This file may be freely distributed in any form as long as
                     42:  * this copyright notice is included.
                     43:  * MTXINU, THE UNIVERSITY OF UTAH, AND CSL PROVIDE THIS SOFTWARE ``AS
                     44:  * IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
                     45:  * WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND
                     46:  * FITNESS FOR A PARTICULAR PURPOSE.
                     47:  *
                     48:  * CSL requests users of this software to return to csl-dist@cs.utah.edu any
                     49:  * improvements that they make and grant CSL redistribution rights.
                     50:  *
                     51:  *     Utah $Hdr: iomod.h 1.6 94/12/14$
                     52:  *     Author: Jeff Forys (CSS), Dave Slattengren (mtXinu)
                     53:  */
                     54:
                     55: #ifndef        _MACHINE_IOMOD_H_
                     56: #define        _MACHINE_IOMOD_H_
                     57:
                     58: #include <machine/pdc.h>
                     59:
                     60: /*
                     61:  * Structures and definitions for I/O Modules on HP-PA (9000/800).
                     62:  *
                     63:  * Memory layout:
                     64:  *
                     65:  *     0x00000000      +---------------------------------+
                     66:  *                     |           Page Zero             |
                     67:  *     0x00000800      + - - - - - - - - - - - - - - - - +
                     68:  *                     |                                 |
                     69:  *                     |                                 |
                     70:  *                     |      Memory Address Space       |
                     71:  *                     |                                 |
                     72:  *                     |                                 |
                     73:  *     0xEF000000      +---------------------------------+
                     74:  *                     |                                 |
                     75:  *                     |        PDC Address Space        |
                     76:  *                     |                                 |
                     77:  *     0xF1000000      +---------------------------------+
                     78:  *                     |                                 |
                     79:  *                     |                                 |
                     80:  *                     |        I/O Address Space        |
                     81:  *                     |                                 |
                     82:  *                     |                                 |
                     83:  *     0xFFF80000      + - - - - - - - - - - - - - - - - +
                     84:  *                     |  Fixed Physical Address Space   |
                     85:  *     0xFFFC0000      + - - - - - - - - - - - - - - - - +
                     86:  *                     |  Local Broadcast Address Space  |
                     87:  *     0xFFFE0000      + - - - - - - - - - - - - - - - - +
                     88:  *                     | Global Broadcast Address Space  |
                     89:  *     0xFFFFFFFF      +---------------------------------+
                     90:  *
                     91:  * "Memory Address Space" is used by memory modules,
                     92:  *   "Page Zero" is described below.
                     93:  * "PDC Address Space" is used by Processor-Dependent Code.
                     94:  * "I/O Address Space" is used by I/O modules (and is not cached),
                     95:  *   "Fixed Physical" is used by modules on the central bus,
                     96:  *   "Local Broadcast" is used to reach all modules on the same bus, and
                     97:  *   "Global Broadcast" is used to reach all modules (thru bus converters).
                     98:  *
                     99:  * SPA space (see below) ranges from 0xF1000000 thru 0xFFFC0000.
                    100:  */
                    101:
                    102: #define        PDC_LOW         0xEF000000      /* define some ranges */
                    103: #define        PDC_HIGH        0xF1000000
                    104: #define        FPA_LOW         0xFFF80000
                    105: #define        FPA_HIGH        0xFFFC0000
                    106: #define        SPA_LOW         0xF1000000
                    107: #define        SPA_HIGH        0xFFFC0000
                    108: #define        SGC_LOW         0xF4000000
                    109: #define        SGC_HIGH        0xFA000000
                    110:
                    111: #define        FPA_IOMOD       ((FPA_HIGH-FPA_LOW)/sizeof(struct iomod))
                    112: #define        MAXMODBUS       ((int)(FPA_IOMOD))      /* maximum modules/bus */
                    113:
                    114: /* size of HPA space for any device */
                    115: #define        IOMOD_HPASIZE   0x1000
                    116:
                    117: /* ASP prom offset for an lan stattion id */
                    118: #define        ASP_PROM        (0xf0810000)
                    119:
                    120: /* offset to the device-specific registers,
                    121:  * basically sizeof(struct iomod) (see later)
                    122:  */
                    123: #define        IOMOD_DEVOFFSET 0x800
                    124:
                    125: #if !defined(_LOCORE)
                    126:
                    127: /*
                    128:  * The first 2K of Soft Physical Address space on the Initial Memory Module
                    129:  * is aptly called "page zero".  The following structure defines the format
                    130:  * of page zero.  Individual members of this structure should be accessed
                    131:  * as "PAGE0->member".
                    132:  */
                    133:
                    134: #define        PAGE0   ((struct pagezero *)0)  /* can't get any lower than this! */
                    135:
                    136: struct pagezero {
                    137:        /* [0x000] Initialize Vectors */
                    138:        int     ivec_special;           /* must be zero */
                    139:        u_int   ivec_mempf;             /* powerfail recovery software */
                    140:        u_int   ivec_toc;               /* exec'd after Transfer Of Control */
                    141:        u_int   ivec_toclen;            /* bytes of ivec_toc code */
                    142:        u_int   ivec_rendz;             /* exec'd after Rendezvous Signal */
                    143:        u_int   ivec_mempflen;          /* bytes of ivec_mempf code */
                    144:        u_int   ivec_resv[2];           /* (reserved) */
                    145:        u_int   ivec_mbz;               /* must be zero */
                    146:        u_int   ivec_resv2[7];          /* (reserved) */
                    147:
                    148:        /* [0x040] Processor Dependent */
                    149:        union   {
                    150:                u_int   pd_Resv1[112];  /* (reserved) processor dependent */
                    151:                struct  {               /* Viper-specific data */
                    152:                        u_int   v_Resv1[39];
                    153:                        u_int   v_Ctrlcpy;      /* copy of Viper `vi_control' */
                    154:                        u_int   v_Resv2[72];
                    155:                } pd_Viper;
                    156:        } pz_Pdep;
                    157:
                    158:        /* [0x200] IODC Data Area Descriptors
                    159:                   use PDC_ALLOC to allocate these memory regions */
                    160:        u_int   iodc_cons_base;         /* */
                    161:        u_int   iodc_cons_size;         /* */
                    162:        u_int   iodc_kbrd_base;         /* */
                    163:        u_int   iodc_kbrd_size;         /* */
                    164:        u_int   iodc_boot_base;         /* */
                    165:        u_int   iodc_boot_size;         /* */
                    166:
                    167:        /* [0x218] */
                    168:        u_int   resv1[0x41];
                    169:
                    170:        /* [0x31C] Capability Flags */
                    171:        u_int   cap_flags;              /* system capabitlities */
                    172: #define        HPPA_CAP_WIDESCSI       0x00000001
                    173:
                    174:        /* [0x320] Keyboard Extensions */
                    175:        u_int   kbrd_ext[2];
                    176:
                    177:        /* [0x328] Boot Device Extensions */
                    178:        u_int   boot_ext[2];
                    179:
                    180:        /* [0x330] Console/Display Extensions */
                    181:        u_int   cons_ext[2];
                    182:
                    183:        /* [0x338] Initial Memory Module Extensions */
                    184:        u_int   imm_ext[2];
                    185:
                    186:        /* [0x340] Memory Configuration */
                    187:        u_int   memc_cont_l;            /* memc_cont low part */
                    188:        u_int   memc_phsize_l;          /* memc_phsize low part */
                    189:        u_int   memc_adsize_l;          /* memc_adsize low part */
                    190:        u_int   memc_resv;              /* (reserved) */
                    191:        u_int   memc_cont;              /* bytes of contiguous valid memory */
                    192:        u_int   memc_phsize;            /* bytes of valid physical memory */
                    193:        u_int   memc_adsize;            /* bytes of SPA space used by PDC */
                    194:        u_int   memc_hpa_h;             /* HPA of CPU (high) */
                    195:
                    196:        /* [0x360] Miscellaneous */
                    197:        struct boot_err mem_be[8];      /* boot errors (see above) */
                    198:        u_int   mem_free;               /* first free phys. memory location */
                    199:        u_int   mem_hpa;                /* HPA of CPU */
                    200:        u_int   mem_pdc;                /* PDC entry point */
                    201:        u_int   mem_10msec;             /* # of Interval Timer ticks in 10msec*/
                    202:
                    203:        /* [0x390] Initial Memory Module */
                    204:        u_int   imm_hpa;                /* HPA of Initial Memory module */
                    205:        u_int   imm_soft_boot;          /* 0 == hard boot, 1 == soft boot */
                    206:        u_int   imm_spa_size;           /* bytes of SPA in IMM */
                    207:        u_int   imm_max_mem;            /* bytes of mem in IMM (<= spa_size) */
                    208:
                    209:        /* [0x3A0] Boot Console/Display, Device, and Keyboard */
                    210:        struct pz_device mem_cons;      /* description of console device */
                    211:        struct pz_device mem_boot;      /* description of boot device */
                    212:        struct pz_device mem_kbd;       /* description of keyboard device */
                    213:
                    214:        /* [0x430] Reserved */
                    215:        u_int   resv2[116];             /* (reserved) */
                    216:
                    217:        /* [0x600] Processor Dependent */
                    218:        u_int   pd_resv2[128];          /* (reserved) processor dependent */
                    219: };
                    220: #define        v_ctrlcpy       pz_Pdep.pd_Viper.v_Ctrlcpy
                    221:
                    222:
                    223: /*
                    224:  * Every module has 4K-bytes of address space associated with it.
                    225:  * A Hard Physical Address (HPA) can be broken down as follows.
                    226:  *
                    227:  * Since this is an I/O space, the high 4 bits are always 1's.
                    228:  *
                    229:  * The "flex" address specifies which bus a module is on; there are
                    230:  * 256K-bytes of HPA space for each bus, however only values from
                    231:  * 64 - 1022 are valid for the "flex" field (1022 designates the
                    232:  * central bus).  The "flex" addr is set at bus configuration time.
                    233:  *
                    234:  * The "fixed" address specifies a particular module on the same
                    235:  * bus (i.e. among modules with the same "flex" address).  This
                    236:  * value can also be found in "device_path.dp_mod" in "pdc.h".
                    237:  *
                    238:  * A modules HPA space consists of 2 pages; the "up" bit specifies
                    239:  * which of these pages is being addressed.  In general, the lower
                    240:  * page is privileged and the upper page it module-type dependent.
                    241:  *
                    242:  */
                    243:
                    244: struct hpa {
                    245:        u_int   hpa_ones: 4,    /* must be 1's; this is an I/O space addr */
                    246:                hpa_flex:10,    /* bus address for this module */
                    247:                hpa_fixed:6,    /* location of module on bus */
                    248:                hpa_up  : 1,    /* 1 == upper page, 0 == lower page */
                    249:                hpa_set : 5,    /* register set */
                    250:                hpa_reg : 4,    /* register number within a register set */
                    251:                hpa_zeros:2;    /* must be 0's; addrs are word aligned */
                    252: };
                    253:
                    254:
                    255: /*
                    256:  * Certain modules require additional memory (i.e. more than that
                    257:  * provided by the HPA space).  A Soft Physical Address (SPA) can be
                    258:  * broken down as follows, on a module-type specific basis (either
                    259:  * Memory SPA or I/O SPA).
                    260:  *
                    261:  * SPA space must be a power of 2, and aligned accordingly.  The IODC
                    262:  * provides all information needed by software to configure SPA space
                    263:  * for a particular module.
                    264:  */
                    265:
                    266: struct memspa {
                    267:        u_int   spa_page:21,    /* page of memory */
                    268:                spa_off :11;    /* offset into memory page */
                    269: };
                    270:
                    271: struct iospa {
                    272:        u_int   spa_ones: 4,    /* must be 1's; this is an I/O space addr */
                    273:                spa_iopg:17,    /* page in I/O address space */
                    274:                spa_set : 5,    /* register set */
                    275:                spa_reg : 4,    /* register number within a register set */
                    276:                spa_mode: 2;    /* aligned according to bus transaction mode */
                    277: };
                    278:
                    279:
                    280: /*
                    281:  * It is possible to send a command to all modules on a particular bus
                    282:  * (local broadcast), or all modules (global broadcast).  A Broadcast
                    283:  * Physical Address (BPA) can be broken down as follows.
                    284:  *
                    285:  * Read and Clear transactions are not allowed in BPA space.  All pages
                    286:  * in BPA space are privileged.
                    287:  */
                    288:
                    289: struct bpa {
                    290:        u_int   bpa_ones:14,    /* must be 1's; this is in BPA space */
                    291:                bpa_gbl : 1,    /* 0 == local, 1 == global broadcast */
                    292:                bpa_page: 6,    /* page in local/global BPA space */
                    293:                bpa_set : 5,    /* register set */
                    294:                bpa_reg : 4,    /* register number within a register set */
                    295:                bpa_zeros:2;    /* must be 0's; addrs are word aligned */
                    296: };
                    297:
                    298:
                    299: /*
                    300:  * All I/O and Memory modules have 4K-bytes of HPA space associated with
                    301:  * it (described above), however not all modules implement every register.
                    302:  * The first 2K-bytes of registers are "privileged".
                    303:  *
                    304:  * (WO) == Write Only, (RO) == Read Only
                    305:  */
                    306:
                    307: struct iomod {
                    308: /* SRS (Supervisor Register Set) */
                    309:        u_int   io_eir;         /* (WO) interrupt CPU; set bits in EIR CR */
                    310:        u_int   io_eim;         /* (WO) External Interrupt Message address */
                    311:        u_int   io_dc_rw;       /* write address of IODC to read IODC data */
                    312:        u_int   io_ii_rw;       /* read/clear external intrpt msg (bit-26) */
                    313:        u_int   io_dma_link;    /* pointer to "next quad" in DMA chain */
                    314:        u_int   io_dma_command; /* (RO) chain command to exec on "next quad" */
                    315:        u_int   io_dma_address; /* (RO) start of DMA */
                    316:        u_int   io_dma_count;   /* (RO) number of bytes remaining to xfer */
                    317:        u_int   io_flex;        /* (WO) HPA flex addr, LSB: bus master flag */
                    318:        u_int   io_spa;         /* (WO) SPA space; 0-20:addr, 24-31:iodc_spa */
                    319:        u_int   resv1[2];       /* (reserved) */
                    320:        u_int   io_command;     /* (WO) module commands (see below) */
                    321:        u_int   io_status;      /* (RO) error returns (see below) */
                    322:        u_int   io_control;     /* memory err logging (bit-9), bc forwarding */
                    323:        u_int   io_test;        /* (RO) self-test information */
                    324: /* ARS (Auxiliary Register Set) */
                    325:        u_int   io_err_sadd;    /* (RO) slave bus error or memory error addr */
                    326:        u_int   chain_addr;     /* start address of chain RAM */
                    327:        u_int   sub_mask_clr;   /* ignore intrpts on sub-channel (bitmask) */
                    328:        u_int   sub_mask_set;   /* service intrpts on sub-channel (bitmask) */
                    329:        u_int   diagnostic;     /* diagnostic use (reserved) */
                    330:        u_int   resv2[2];       /* (reserved) */
                    331:        u_int   nmi_address;    /* address to send data to when NMI detected */
                    332:        u_int   nmi_data;       /* NMI data to be sent */
                    333:        u_int   resv3[3];       /* (reserved) */
                    334:        u_int   io_mem_low;     /* bottom of memory address range */
                    335:        u_int   io_mem_high;    /* top of memory address range */
                    336:        u_int   io_io_low;      /* bottom of I/O HPA address Range */
                    337:        u_int   io_io_high;     /* top of I/O HPA address Range */
                    338:
                    339:        u_int   priv_trs[160];  /* TRSes (Type-dependent Reg Sets) */
                    340:
                    341:        u_int   priv_hvrs[320]; /* HVRSes (HVERSION-dependent Register Sets) */
                    342:
                    343:        u_int   hvrs[512];      /* HVRSes (HVERSION-dependent Register Sets) */
                    344: };
                    345: #endif /* !_LOCORE */
                    346:
                    347: /* primarily for a "reboot" and "_rtt" routines */
                    348: #define        iomod_command   (4*12)
                    349:
                    350: /* io_flex */
                    351: #define        DMA_ENABLE      0x1     /* flex register enable DMA bit */
                    352:
                    353: /* io_spa */
                    354: #define        IOSPA(spa,iodc_data)    \
                    355:        ((volatile caddr_t)             \
                    356:         (spa | iodc_data.iodc_spa_shift | iodc_data.iodc_spa_enb << 5 | \
                    357:          iodc_data.iodc_spa_pack << 6 | iodc_data.iodc_spa_io << 7))
                    358:
                    359: /* io_command */
                    360: #define        CMD_STOP        0       /* halt any I/O, enable diagnostic access */
                    361: #define        CMD_FLUSH       1       /* abort DMA */
                    362: #define        CMD_CHAIN       2       /* initiate DMA */
                    363: #define        CMD_CLEAR       3       /* clear errors */
                    364: #define        CMD_RESET       5       /* reset any module */
                    365:
                    366: /* io_status */
                    367: #define        IO_ERR_MEM_SL   0x10000 /* SPA space lost or corrupted */
                    368: #define        IO_ERR_MEM_SE   0x00200 /* severity: minor */
                    369: #define        IO_ERR_MEM_HE   0x00100 /* severity: affects invalid parts */
                    370: #define        IO_ERR_MEM_FE   0x00080 /* severity: bad */
                    371: #define        IO_ERR_MEM_RY   0x00040 /* IO_COMMAND register ready for command */
                    372: #define        IO_ERR_DMA_DG   0x00010 /* module in diagnostic mode */
                    373: #define        IO_ERR_DMA_PW   0x00004 /* Power Failing */
                    374: #define        IO_ERR_DMA_PL   0x00002 /* Power Lost */
                    375: #define        IO_ERR_VAL(x)    (((x) >> 10) & 0x3f)
                    376: #define        IO_ERR_DEPEND    0      /* unspecified error */
                    377: #define        IO_ERR_SPA       1      /* (module-type specific) */
                    378: #define        IO_ERR_INTERNAL  2      /* (module-type specific) */
                    379: #define        IO_ERR_MODE      3      /* invlaid mode or address space mapping */
                    380: #define        IO_ERR_ERROR_M   4      /* bus error (master detect) */
                    381: #define        IO_ERR_DPARITY_S 5      /* data parity (slave detect) */
                    382: #define        IO_ERR_PROTO_M   6      /* protocol error (master detect) */
                    383: #define        IO_ERR_ADDRESS   7      /* no slave acknowledgement in transaction */
                    384: #define        IO_ERR_MORE      8      /* device transferred more data than expected */
                    385: #define        IO_ERR_LESS      9      /* device transferred less data than expected */
                    386: #define        IO_ERR_SAPARITY 10      /* slave addrss phase parity */
                    387: #define        IO_ERR_MAPARITY 11      /* master address phase parity */
                    388: #define        IO_ERR_MDPARITY 12      /* mode phase parity */
                    389: #define        IO_ERR_STPARITY 13      /* status phase parity */
                    390: #define        IO_ERR_CMD      14      /* unimplemented I/O Command */
                    391: #define        IO_ERR_BUS      15      /* generic bus error */
                    392: #define        IO_ERR_CORR     24      /* correctable memory error */
                    393: #define        IO_ERR_UNCORR   25      /* uncorrectable memory error */
                    394: #define        IO_ERR_MAP      26      /* equivalent to IO_ERR_CORR */
                    395: #define        IO_ERR_LINK     28      /* Bus Converter "link" (connection) error */
                    396: #define        IO_ERR_CCMD     32      /* Illegal DMA command */
                    397: #define        IO_ERR_ERROR_S  52      /* bus error (slave detect) */
                    398: #define        IO_ERR_DPARITY_M 53     /* data parity (master detect) */
                    399: #define        IO_ERR_PROTOCOL 54      /* protocol error (slave detect) */
                    400: #define        IO_ERR_SELFTEST 58      /* (module-type specific) */
                    401: #define        IO_ERR_BUSY     59      /* slave was busy too often or too long */
                    402: #define        IO_ERR_RETRY    60      /* "busied" transaction not retried soon enuf */
                    403: #define        IO_ERR_ACCESS   61      /* illegal register access */
                    404: #define        IO_ERR_IMPROP   62      /* "improper" data written */
                    405: #define        IO_ERR_UNKNOWN  63
                    406:
                    407: /* io_control (memory) */
                    408: #define        IO_CTL_MEMINIT  0x0     /* prevent some bus errors during memory init */
                    409: #define        IO_CTL_MEMOKAY  0x100   /* enable all bus error logging */
                    410:
                    411: /* io_spa */
                    412: #define        SPA_ENABLE      0x20    /* io_spa register enable spa bit */
                    413:
                    414: #endif /* _MACHINE_IOMOD_H_ */

CVSweb