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