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