Home | History | Annotate | Line # | Download | only in include
ctlreg.h revision 1.1.1.1
      1 /*	$NetBSD: ctlreg.h,v 1.1.1.1 1998/06/20 04:58:51 eeh Exp $ */
      2 
      3 /*
      4  * Copyright (c) 1996
      5  *	The President and Fellows of Harvard College. All rights reserved.
      6  * Copyright (c) 1992, 1993
      7  *	The Regents of the University of California.  All rights reserved.
      8  *
      9  * This software was developed by the Computer Systems Engineering group
     10  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
     11  * contributed to Berkeley.
     12  *
     13  * All advertising materials mentioning features or use of this software
     14  * must display the following acknowledgement:
     15  *	This product includes software developed by Harvard University.
     16  *	This product includes software developed by the University of
     17  *	California, Lawrence Berkeley Laboratory.
     18  *
     19  * Redistribution and use in source and binary forms, with or without
     20  * modification, are permitted provided that the following conditions
     21  * are met:
     22  * 1. Redistributions of source code must retain the above copyright
     23  *    notice, this list of conditions and the following disclaimer.
     24  * 2. Redistributions in binary form must reproduce the above copyright
     25  *    notice, this list of conditions and the following disclaimer in the
     26  *    documentation and/or other materials provided with the distribution.
     27  * 3. All advertising materials mentioning features or use of this software
     28  *    must display the following acknowledgement:
     29  *	This product includes software developed by the University of
     30  *	California, Berkeley and its contributors.
     31  * 4. Neither the name of the University nor the names of its contributors
     32  *    may be used to endorse or promote products derived from this software
     33  *    without specific prior written permission.
     34  *
     35  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     36  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     37  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     38  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     39  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     40  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     41  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     42  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     43  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     44  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     45  * SUCH DAMAGE.
     46  *
     47  *	@(#)ctlreg.h	8.1 (Berkeley) 6/11/93
     48  */
     49 
     50 /*
     51  * Sun4u support by Eduardo Horvath
     52  * Changes Copyright (c) 1996 Eduardo Horvath
     53  * All rights reserved.
     54  */
     55 
     56 /*
     57  * Sun 4u control registers. (includes address space definitions
     58  * and some registers in control space).
     59  */
     60 
     61 /*
     62  * The Alternate address spaces.
     63  *
     64  * 0x00-0x7f are privileged
     65  * 0x80-0xff can be used by users
     66  */
     67 
     68 #define ASI_LITTLE	0x08		/* This bit should make an ASI little endian */
     69 
     70 #define ASI_NUCLEUS			0x04	/* [4u] kernel address space */
     71 #define ASI_NUCLEUS_LITTLE		0x0c	/* [4u] kernel address space, little endian */
     72 
     73 #define ASI_AS_IF_USER_PRIMARY		0x10	/* [4u] primary user address space */
     74 #define ASI_AS_IF_USER_SECONDARY	0x11	/* [4u] secondary user address space */
     75 
     76 #define ASI_PHYS_CACHED			0x14	/* [4u] MMU bypass to main memory */
     77 #define ASI_PHYS_NON_CACHED		0x15	/* [4u] MMU bypass to I/O location */
     78 
     79 #define ASI_AS_IF_USER_PRIMARY_LITTLE	0x18	/* [4u] primary user address space, little endian  */
     80 #define ASI_AS_IF_USER_SECONDARY_LITTIE	0x19	/* [4u] secondary user address space, little endian  */
     81 
     82 #define ASI_PHYS_CACHED_LITTLE		0x1c	/* [4u] MMU bypass to main memory, little endian */
     83 #define ASI_PHYS_NON_CACHED_LITTLE	0x1d	/* [4u] MMU bypass to I/O location, little endian */
     84 
     85 #define ASI_NUCLEUS_QUAD_LDD		0x24	/* [4u] use w/LDDA to load 128-bit item */
     86 #define ASI_NUCLEUS_QUAD_LDD_LITTLE	0x2c	/* [4u] use w/LDDA to load 128-bit item, little endian */
     87 
     88 #define ASI_FLUSH_D_PAGE_PRIMARY	0x38	/* [4u] flush D-cache page using primary context */
     89 #define ASI_FLUSH_D_PAGE_SECONDARY	0x39	/* [4u] flush D-cache page using secondary context */
     90 #define ASI_FLUSH_D_CTX_PRIMARY		0x3a	/* [4u] flush D-cache context using primary context */
     91 #define ASI_FLUSH_D_CTX_SECONDARY	0x3b	/* [4u] flush D-cache context using secondary context */
     92 #define ASI_DCACHE_DATA			0x46	/* [4u] diagnostic access to D-cache data RAM */
     93 #define ASI_DCACHE_TAG			0x47	/* [4u] diagnostic access to D-cache tag RAM */
     94 
     95 #define ASI_INTR_DISPATCH_STATUS	0x48	/* [4u] interrupt dispatch status register */
     96 #define ASI_INTR_RECEIVE		0x49	/* [4u] interrupt receive status register */
     97 #define ASI_MID_REG			0x4a	/* [4u] hardware config and MID */
     98 #define ASI_ERROR_EN_REG		0x4b	/* [4u] asynchronous error enables */
     99 #define ASI_AFSR			0x4c	/* [4u] asynchronous fault status register */
    100 #define ASI_AFAR			0x4d	/* [4u] asynchronous fault address register */
    101 
    102 #define ASI_ICACHE_DATA			0x66	/* [4u] diagnostic access to D-cache data RAM */
    103 #define ASI_ICACHE_TAG			0x67	/* [4u] diagnostic access to D-cache tag RAM */
    104 #define ASI_FLUSH_I_PAGE_PRIMARY	0x68	/* [4u] flush D-cache page using primary context */
    105 #define ASI_FLUSH_I_PAGE_SECONDARY	0x69	/* [4u] flush D-cache page using secondary context */
    106 #define ASI_FLUSH_I_CTX_PRIMARY		0x6a	/* [4u] flush D-cache context using primary context */
    107 #define ASI_FLUSH_I_CTX_SECONDARY	0x6b	/* [4u] flush D-cache context using secondary context */
    108 
    109 #define ASI_BLOCK_AS_IF_USER_PRIMARY	0x70	/* [4u] primary user address space, block loads/stores */
    110 #define ASI_BLOCK_AS_IF_USER_SECONDARY	0x71	/* [4u] secondary user address space, block loads/stores */
    111 
    112 #define ASI_ECACHE_DIAG			0x76	/* [4u] diag access to E-cache tag and data */
    113 #define ASI_DATAPATH_ERR_REG_WRITE	0x77	/* [4u] ASI is reused */
    114 
    115 #define ASI_BLOCK_AS_IF_USER_PRIMARY_LITTLE	0x78	/* [4u] primary user address space, block loads/stores */
    116 #define ASI_BLOCK_AS_IF_USER_SECONDARY_LITTLE	0x79	/* [4u] secondary user address space, block loads/stores */
    117 
    118 #define ASI_INTERRUPT_RECEIVE_DATA	0x7f	/* [4u] interrupt receive data registers {0,1,2} */
    119 #define ASI_DATAPATH_ERR_REG_READ	0x7f	/* [4u] read access to datapath error registers (ASI reused) */
    120 
    121 #define ASI_PRIMARY			0x80	/* [4u] primary address space */
    122 #define ASI_SECONDARY			0x81	/* [4u] secondary address space */
    123 #define ASI_PRIMARY_NO_FAULT		0x82	/* [4u] primary address space, no fault */
    124 #define ASI_SECONDARY_NO_FAULT		0x83	/* [4u] secondary address space, no fault */
    125 
    126 #define ASI_PRIMARY_LITTLE		0x88	/* [4u] primary address space, little endian */
    127 #define ASI_SECONDARY_LITTLE		0x89	/* [4u] secondary address space, little endian */
    128 #define ASI_PRIMARY_NO_FAULT_LITTLE	0x8a	/* [4u] primary address space, no fault, little endian */
    129 #define ASI_SECONDARY_NO_FAULT_LITTLE	0x8b	/* [4u] secondary address space, no fault, little endian */
    130 
    131 #define ASI_PST8_PRIMARY		0xc0	/* [VIS] Eight 8-bit partial store, primary */
    132 #define ASI_PST8_SECONDARY		0xc1	/* [VIS] Eight 8-bit partial store, secondary */
    133 #define ASI_PST16_PRIMARY		0xc2	/* [VIS] Four 16-bit partial store, primary */
    134 #define ASI_PST16_SECONDARY		0xc3	/* [VIS] Fout 16-bit partial store, secondary */
    135 #define ASI_PST32_PRIMARY		0xc4	/* [VIS] Two 32-bit partial store, primary */
    136 #define ASI_PST32_SECONDARY		0xc5	/* [VIS] Two 32-bit partial store, secondary */
    137 
    138 #define ASI_PST8_PRIMARY_LITTLE		0xc8	/* [VIS] Eight 8-bit partial store, primary, little endian */
    139 #define ASI_PST8_SECONDARY_LITTLE	0xc9	/* [VIS] Eight 8-bit partial store, secondary, little endian */
    140 #define ASI_PST16_PRIMARY_LITTLE	0xca	/* [VIS] Four 16-bit partial store, primary, little endian */
    141 #define ASI_PST16_SECONDARY_LITTLE	0xcb	/* [VIS] Fout 16-bit partial store, secondary, little endian */
    142 #define ASI_PST32_PRIMARY_LITTLE	0xcc	/* [VIS] Two 32-bit partial store, primary, little endian */
    143 #define ASI_PST32_SECONDARY_LITTLE	0xcd	/* [VIS] Two 32-bit partial store, secondary, little endian */
    144 
    145 #define ASI_FL8_PRIMARY			0xd0	/* [VIS] One 8-bit load/store floating, primary */
    146 #define ASI_FL8_SECONDARY		0xd1	/* [VIS] One 8-bit load/store floating, secondary */
    147 #define ASI_FL16_PRIMARY		0xd2	/* [VIS] One 16-bit load/store floating, primary */
    148 #define ASI_FL16_SECONDARY		0xd3	/* [VIS] One 16-bit load/store floating, secondary */
    149 
    150 #define ASI_FL8_PRIMARY_LITTLE		0xd8	/* [VIS] One 8-bit load/store floating, primary, little endian */
    151 #define ASI_FL8_SECONDARY_LITTLE	0xd9	/* [VIS] One 8-bit load/store floating, secondary, little endian */
    152 #define ASI_FL16_PRIMARY_LITTLE		0xda	/* [VIS] One 16-bit load/store floating, primary, little endian */
    153 #define ASI_FL16_SECONDARY_LITTLE	0xdb	/* [VIS] One 16-bit load/store floating, secondary, little endian */
    154 
    155 #define ASI_BLOCK_COMMIT_PRIMARY	0xe0	/* [4u] block store with commit, primary */
    156 #define ASI_BLOCK_COMMIT_SECONDARY	0xe1	/* [4u] block store with commit, secondary */
    157 #define ASI_BLOCK_PRIMARY		0xf0	/* [4u] block load/store, primary */
    158 #define ASI_BLOCK_SECONDARY		0xf1	/* [4u] block load/store, secondary */
    159 #define ASI_BLOCK_PRIMARY_LITTLE	0xf8	/* [4u] block load/store, primary, little endian */
    160 #define ASI_BLOCK_SECONDARY_LITTLE	0xf9	/* [4u] block load/store, secondary, little endian */
    161 
    162 
    163 /*
    164  * These are the shorter names used by Solaris
    165  */
    166 
    167 #define ASI_N		ASI_NUCLEUS
    168 #define ASI_NL		ASI_NUCLEUS_LITTLE
    169 #define ASI_AIUP	ASI_AS_IF_USER_PRIMARY
    170 #define ASI_AIUS	ASI_AS_IF_USER_SECONDARY
    171 #define ASI_AIUPL	ASI_AS_IF_USER_PRIMARY_LITTLE
    172 #define ASI_AIUSL	ASI_AS_IF_USER_SECONDARY_LITTLE
    173 #define ASI_P		ASI_PRIMARY
    174 #define ASI_S		ASI_SECONDARY
    175 #define ASI_PNF		ASI_PRIMARY_NO_FAULT
    176 #define ASI_SNF		ASI_SECONDARY_NO_FAULT
    177 #define ASI_PL		ASI_PRIMARY_LITTLE
    178 #define ASI_SL		ASI_SECONDARY_LITTLE
    179 #define ASI_PNFL	ASI_PRIMARY_NO_FAULT_LITTLE
    180 #define ASI_SNFL	ASI_SECONDARY_NO_FAULT_LITTLE
    181 #define ASI_BLK_AIUP	ASI_BLOCK_AS_IF_USER_PRIMARY
    182 #define ASI_BLK_AIUPL	ASI_BLOCK_AS_IF_USER_PRIMARY_LITTLE
    183 #define ASI_BLK_AIUS	ASI_BLOCK_AS_IF_USER_SECONDARY
    184 #define ASI_BLK_AIUSL	ASI_BLOCK_AS_IF_USER_SECONDARY_LITTLE
    185 #define ASI_BLK_COMMIT_P		ASI_BLOCK_COMMIT_PRIMARY
    186 #define ASI_BLK_COMMIT_PRIMARY		ASI_BLOCK_COMMIT_PRIMARY
    187 #define ASI_BLK_COMMIT_S		ASI_BLOCK_COMMIT_SECONDARY
    188 #define ASI_BLK_COMMIT_SECONDARY	ASI_BLOCK_COMMIT_SECONDARY
    189 #define ASI_BLK_P			ASI_BLOCK_PRIMARY
    190 #define ASI_BLK_PL			ASI_BLOCK_PRIMARY_LITTLE
    191 #define ASI_BLK_S			ASI_BLOCK_SECONDARY
    192 #define ASI_BLK_SL			ASI_BLOCK_SECONDARY_LITTLE
    193 
    194 /*
    195  * The following are 4u control registers
    196  */
    197 
    198 /*
    199  * [4u] MMU and Cache Control Register (MCCR)
    200  * use ASI = 0x45
    201  */
    202 #define ASI_MCCR	0x45
    203 #define MCCR		0x00
    204 
    205 /* MCCR Bits and their meanings */
    206 #define MCCR_DMMU_EN	0x08
    207 #define MCCR_IMMU_EN	0x04
    208 #define MCCR_DCACHE_EN	0x02
    209 #define MCCR_ICACHE_EN	0x01
    210 
    211 
    212 /*
    213  * MMU control registers
    214  */
    215 
    216 /* Choose an MMU */
    217 #define ASI_DMMU		0x58
    218 #define ASI_IMMU		0x50
    219 
    220 /* Other assorted MMU ASIs */
    221 #define ASI_IMMU_8KPTR		0x51
    222 #define ASI_IMMU_64KPTR		0x52
    223 #define ASI_IMMU_DATA_IN	0x54
    224 #define ASI_IMMU_TLB_DATA	0x55
    225 #define ASI_IMMU_TLB_TAG	0x56
    226 #define ASI_DMMU_8KPTR		0x59
    227 #define ASI_DMMU_64KPTR		0x5a
    228 #define ASI_DMMU_DATA_IN	0x5c
    229 #define ASI_DMMU_TLB_DATA	0x5d
    230 #define ASI_DMMU_TLB_TAG	0x5e
    231 
    232 /*
    233  * The following are the control registers
    234  * They work on both MMUs unless noted.
    235  *
    236  * Register contents are defined later on individual registers.
    237  */
    238 #define TSB_TAG_TARGET		0x0
    239 #define TLB_DATA_IN		0x0
    240 #define CTX_PRIMARY		0x08	/* primary context -- DMMU only */
    241 #define CTX_SECONDARY		0x10	/* secondary context -- DMMU only */
    242 #define SFSR			0x18
    243 #define SFAR			0x20	/* fault address -- DMMU only */
    244 #define TSB			0x28
    245 #define TLB_TAG_ACCESS		0x30
    246 #define VIRTUAL_WATCHPOINT	0x38
    247 #define PHYSICAL_WATCHPOINT	0x40
    248 
    249 /* Tag Target bits */
    250 #define TAG_TARGET_VA_MASK	0x03ffffffffffffffffLL
    251 #define TAG_TARGET_VA(x)	(((x)<<22)&TAG_TARGET_VA_MASK)
    252 #define TAG_TARGET_CONTEXT(x)	((x)>>48)
    253 #define TAG_TARGET(c,v)		((((uint64_t)c)<<48)|(((uint64_t)v)&TAG_TARGET_VA_MASK))
    254 
    255 /* SFSR bits for both D_SFSR and I_SFSR */
    256 #define SFSR_ASI(x)		((x)>>16)
    257 #define SFSR_FT_VA_OOR_2	0x02000 /* IMMU: jumpl or return to unsupportd VA */
    258 #define SFSR_FT_VA_OOR_1	0x01000 /* fault at unsupported VA */
    259 #define SFSR_FT_NFO		0x00800	/* DMMU: Access to page marked NFO */
    260 #define SFSR_ILL_ASI		0x00400	/* DMMU: Illegal (unsupported) ASI */
    261 #define SFSR_FT_IO_ATOMIC	0x00200	/* DMMU: Atomic access to noncacheable page */
    262 #define SFSR_FT_ILL_NF		0x00100	/* DMMU: NF load or flush to page marked E (has side effects) */
    263 #define SFSR_FT_PRIV		0x00080	/* Privilege violation */
    264 #define SFSR_FT_E		0x00040	/* DMUU: value of E bit associated address */
    265 #define SFSR_CTXT(x)		(((x)>>4)&0x3)
    266 #define SFSR_CTXT_IS_PRIM(x)	(SFSR_CTXT(x)==0x00)
    267 #define SFSR_CTXT_IS_SECOND(x)	(SFSR_CTXT(x)==0x01)
    268 #define SFSR_CTXT_IS_NUCLEUS(x)	(SFSR_CTXT(x)==0x02)
    269 #define SFSR_PRIV		0x00008	/* value of PSTATE.PRIV for faulting access */
    270 #define SFSR_W			0x00004 /* DMMU: attempted write */
    271 #define SFSR_OW			0x00002 /* Overwrite; prev vault was still valid */
    272 #define SFSR_FV			0x00001	/* Fault is valid */
    273 #define SFSR_FT	(SFSR_FT_VA_OOR_2|SFSR_FT_VA_OOR_1|SFSR_FT_NFO|SFSR_ILL_ASI|SFSR_FT_IO_ATOMIC|SFSR_FT_ILL_NF|SFSR_FT_PRIV)
    274 
    275 #define SFSR_BITS "\40\16VAT\15VAD\14NFO\13ASI\12A\11NF\10PRIV\7E\6NUCLEUS\5SECONDCTX\4PRIV\3W\2OW\1FV"
    276 /*
    277  * Here's the spitfire TSB control register bits.
    278  *
    279  * Each TSB entry is 16-bytes wide.  The TSB must be size aligned
    280  */
    281 #define TSB_SIZE_512		0x0	/* 8kB, etc. */
    282 #define TSB_SIZE_1K		0x01
    283 #define TSB_SIZE_2K		0x02
    284 #define TSB_SIZE_4K		0x03
    285 #define	TSB_SIZE_8K		0x04
    286 #define TSB_SIZE_16K		0x05
    287 #define TSB_SIZE_32K		0x06
    288 #define TSB_SIZE_64K		0x07
    289 #define TSB_SPLIT		0x1000
    290 #define TSB_BASE		0xffffffffffffe000
    291 
    292 /*  TLB Tag Access bits */
    293 #define TLB_TAG_ACCESS_VA	0xffffffffffffe000
    294 #define TLB_TAG_ACCESS_CTX	0x0000000000001fff
    295 
    296 /*
    297  * TLB demap registers.  TTEs are defined in v9pte.h
    298  *
    299  * Use the address space to select between IMMU and DMMU.
    300  * The address of the register selects which context register
    301  * to read the ASI from.
    302  *
    303  * The data stored in the register is interpreted as the VA to
    304  * use.  The DEMAP_CTX_<> registers ignore the address and demap the
    305  * entire ASI.
    306  *
    307  */
    308 #define ASI_IMMU_DEMAP			0x57	/* [4u] IMMU TLB demap */
    309 #define ASI_DMMU_DEMAP			0x5f	/* [4u] IMMU TLB demap */
    310 
    311 #define DEMAP_PAGE_NUCLEUS		((0x02)<<4)	/* Demap page from kernel AS */
    312 #define DEMAP_PAGE_PRIMARY		((0x00)<<4)	/* Demap a page from primary CTXT */
    313 #define DEMAP_PAGE_SECONDARY		((0x01)<<4)	/* Demap page from secondary CTXT (DMMU only) */
    314 #define DEMAP_CTX_NUCLEUS		((0x06)<<4)	/* Demap all of kernel CTXT */
    315 #define DEMAP_CTX_PRIMARY		((0x04)<<4)	/* Demap all of primary CTXT */
    316 #define DEMAP_CTX_SECONDARY		((0x05)<<4)	/* Demap all of secondary CTXT */
    317 
    318 /*
    319  * Interrupt registers.  This really gets hairy.
    320  */
    321 
    322 /* IRSR -- Interrupt Receive Status Ragister */
    323 #define ASI_IRSR	0x49
    324 #define IRSR		0x00
    325 #define IRSR_BUSY	0x010
    326 #define IRSR_MID(x)	(x&0xf)
    327 
    328 /* IRDR -- Interrupt Receive Data Registers */
    329 #define ASI_IRDR	0x7f
    330 #define IRDR_0H		0x40
    331 #define IRDR_0L		0x48	/* unimplemented */
    332 #define IRDR_1H		0x50
    333 #define IRDR_1L		0x58	/* unimplemented */
    334 #define IRDR_2H		0x60
    335 #define IRDR_2L		0x68	/* unimplemented */
    336 #define IRDR_3H		0x70	/* unimplemented */
    337 #define IRDR_3L		0x78	/* unimplemented */
    338 
    339 /* SOFTINT ASRs */
    340 #define SET_SOFTINT	%asr20	/* Sets these bits */
    341 #define CLEAR_SOFTINT	%asr21	/* Clears these bits */
    342 #define SOFTINT		%asr22	/* Reads the register */
    343 
    344 #define	TICK_INT	0x01	/* level-14 clock tick */
    345 #define SOFTINT1	(0x1<<1)
    346 #define SOFTINT2	(0x1<<2)
    347 #define SOFTINT3	(0x1<<3)
    348 #define SOFTINT4	(0x1<<4)
    349 #define SOFTINT5	(0x1<<5)
    350 #define SOFTINT6	(0x1<<6)
    351 #define SOFTINT7	(0x1<<7)
    352 #define SOFTINT8	(0x1<<8)
    353 #define SOFTINT9	(0x1<<9)
    354 #define SOFTINT10	(0x1<<10)
    355 #define SOFTINT11	(0x1<<11)
    356 #define SOFTINT12	(0x1<<12)
    357 #define SOFTINT13	(0x1<<13)
    358 #define SOFTINT14	(0x1<<14)
    359 #define SOFTINT15	(0x1<<15)
    360 
    361 /* Interrupt Dispatch -- usually reserved for cross-calls */
    362 #define ASR_IDSR	0x48 /* Interrupt dispatch status reg */
    363 #define IDSR		0x00
    364 #define IDSR_NACK	0x02
    365 #define IDSR_BUSY	0x01
    366 
    367 #define ASI_INTERRUPT_DISPATCH		0x77	/* [4u] spitfire interrupt dispatch regs */
    368 #define IDCR(x)		(((x)<<14)&0x70)	/* Store anything to this address to dispatch crosscall to CPU (x) */
    369 #define IDDR_0H		0x40			/* Store data to send in these regs */
    370 #define IDDR_0L		0x48	/* unimplemented */
    371 #define IDDR_1H		0x50
    372 #define IDDR_1L		0x58	/* unimplemented */
    373 #define IDDR_2H		0x60
    374 #define IDDR_2L		0x68	/* unimplemented */
    375 #define IDDR_3H		0x70	/* unimplemented */
    376 #define IDDR_3L		0x78	/* unimplemented */
    377 
    378 /*
    379  * Error registers
    380  */
    381 
    382 /* Since we won't try to fix async errs, we don't care about the bits in the regs */
    383 #define ASI_AFAR	0x4d	/* Asynchronous fault address register */
    384 #define AFAR		0x00
    385 #define ASI_AFSR	0x4c	/* Asynchronous fault status register */
    386 #define AFSR		0x00
    387 
    388 #define ASI_P_EER	0x4b	/* Error enable register */
    389 #define P_EER		0x00
    390 #define P_EER_ISAPEN	0x04	/* Enable fatal on ISAP */
    391 #define P_EER_NCEEN	0x02	/* Enable trap on uncorrectable errs */
    392 #define P_EER_CEEN	0x01	/* Enable trap on correctable errs */
    393 
    394 #define ASI_DATAPATH_READ	0x7f /* Read the regs */
    395 #define ASI_DATAPATH_WRITE	0x77 /* Write to the regs */
    396 #define P_DPER_0	0x00	/* Datapath err reg 0 */
    397 #define P_DPER_1	0x18	/* Datapath err reg 1 */
    398 #define P_DCR_0		0x20	/* Datapath control reg 0 */
    399 #define P_DCR_1		0x38	/* Datapath control reg 0 */
    400 
    401 #if 0
    402 /*
    403  * [4/4c] Registers in the control space (ASI_CONTROL).
    404  */
    405 #define	AC_IDPROM	0x00000000	/* [4] ID PROM */
    406 #define	AC_CONTEXT	0x30000000	/* [4/4c] context register (byte) */
    407 #define	AC_SYSENABLE	0x40000000	/* [4/4c] system enable register (byte) */
    408 #define	AC_DVMA_ENABLE	0x50000000	/* [4] enable user dvma */
    409 #define	AC_BUS_ERR	0x60000000	/* [4] bus error register */
    410 #define	AC_SYNC_ERR	0x60000000	/* [4c] sync (memory) error reg */
    411 #define	AC_SYNC_VA	0x60000004	/* [4c] sync error virtual addr */
    412 #define	AC_ASYNC_ERR	0x60000008	/* [4c] async error reg */
    413 #define	AC_ASYNC_VA	0x6000000c	/* [4c] async error virtual addr */
    414 #define	AC_DIAG_REG	0x70000000	/* [4] diagnostic reg */
    415 #define	AC_CACHETAGS	0x80000000	/* [4/4c?] cache tag base address */
    416 #define	AC_CACHEDATA	0x90000000	/* [4] cached data [sun4/400?] */
    417 #define	AC_DVMA_MAP	0xd0000000	/* [4] user dvma map entries */
    418 #define AC_VMEINTVEC	0xe0000000	/* [4] vme interrupt vector */
    419 #define	AC_SERIAL	0xf0000000	/* [4/4c] special serial port sneakiness */
    420 	/* AC_SERIAL is not used in the kernel (it is for the PROM) */
    421 
    422 /* XXX: does not belong here */
    423 #define	ME_REG_IERR	0x80		/* memory err ctrl reg error intr pending bit */
    424 
    425 /*
    426  * [4/4c]
    427  * Bits in sync error register.  Reading the register clears these;
    428  * otherwise they accumulate.  The error(s) occurred at the virtual
    429  * address stored in the sync error address register, and may have
    430  * been due to, e.g., what would usually be called a page fault.
    431  * Worse, the bits accumulate during instruction prefetch, so
    432  * various bits can be on that should be off.
    433  */
    434 #define	SER_WRITE	0x8000		/* error occurred during write */
    435 #define	SER_INVAL	0x80		/* PTE had PG_V off */
    436 #define	SER_PROT	0x40		/* operation violated PTE prot */
    437 #define	SER_TIMEOUT	0x20		/* bus timeout (non-existent mem) */
    438 #define	SER_SBUSERR	0x10		/* S-Bus bus error */
    439 #define	SER_MEMERR	0x08		/* memory ecc/parity error */
    440 #define	SER_SZERR	0x02		/* [4/vme?] size error, whatever that is */
    441 #define	SER_WATCHDOG	0x01		/* watchdog reset (never see this) */
    442 
    443 #define	SER_BITS \
    444 "\20\20WRITE\10INVAL\7PROT\6TIMEOUT\5SBUSERR\4MEMERR\2SZERR\1WATCHDOG"
    445 
    446 /*
    447  * [4/4c]
    448  * Bits in async error register (errors from DVMA or Sun-4 cache
    449  * writeback).  The corresponding bit is also set in the sync error reg.
    450  *
    451  * A writeback invalid error means there is a bug in the PTE manager.
    452  *
    453  * The word is that the async error register does not work right.
    454  */
    455 #define	AER_WBINVAL	0x80		/* writeback found PTE without PG_V */
    456 #define	AER_TIMEOUT	0x20		/* bus timeout */
    457 #define	AER_DVMAERR	0x10		/* bus error during DVMA */
    458 
    459 #define	AER_BITS	"\20\10WBINVAL\6TIMEOUT\5DVMAERR"
    460 
    461 /*
    462  * [4/4c] Bits in system enable register.
    463  */
    464 #define	SYSEN_DVMA	0x20		/* Enable dvma */
    465 #define	SYSEN_CACHE	0x10		/* Enable cache */
    466 #define	SYSEN_IOCACHE	0x40		/* Enable IO cache */
    467 #define	SYSEN_VIDEO	0x08		/* Enable on-board video */
    468 #define	SYSEN_RESET	0x04		/* Reset the hardware */
    469 #define	SYSEN_RESETVME	0x02		/* Reset the VME bus */
    470 
    471 
    472 /*
    473  * [4m] Bits in ASI_CONTROL? space, sun4m only.
    474  */
    475 #define MXCC_ENABLE_ADDR	0x1c00a00	/* Enable register for MXCC */
    476 #define MXCC_ENABLE_BIT		0x4		/* Enable bit for MXCC */
    477 
    478 /*
    479  * Bits in ASI_SRMMUFP space.
    480  *	Bits 8-11 determine the type of flush/probe.
    481  *	Address bits 12-31 hold the page frame.
    482  */
    483 #define ASI_SRMMUFP_L3	(0<<8)	/* probe L3	| flush L3 PTE */
    484 #define ASI_SRMMUFP_L2	(1<<8)	/* probe L2	| flush L2/L3 PTE/PTD's */
    485 #define ASI_SRMMUFP_L1	(2<<8)	/* probe L1	| flush L1/L2/L3 PTE/PTD's*/
    486 #define ASI_SRMMUFP_L0	(3<<8)	/* probe L0	| flush L0/L1/L2/L3 PTE/PTD's */
    487 #define ASI_SRMMUFP_LN	(4<<8)	/* probe all	| flush all levels */
    488 
    489 /*
    490  * [4m] Registers and bits in the SPARC Reference MMU (ASI_SRMMU).
    491  */
    492 #define SRMMU_PCR	0x00000000	/* Processor control register */
    493 #define SRMMU_CXTPTR	0x00000100	/* Context table pointer register */
    494 #define SRMMU_CXR	0x00000200	/* Context register */
    495 #define SRMMU_SFSTAT	0x00000300	/* Synchronous fault status reg */
    496 #define SRMMU_SFADDR	0x00000400	/* Synchronous fault address reg */
    497 #define SRMMU_AFSTAT	0x00000500	/* Asynchronous fault status reg (HS) */
    498 #define SRMMU_AFADDR	0x00000600	/* Asynchronous fault address reg (HS)*/
    499 #define SRMMU_TLBCTRL	0x00001000	/* TLB replacement control reg */
    500 
    501 /* [4m] Bits in SRMMU control register */
    502 #define SRMMU_PCR_ME	0x00000001	/* MMU Enable */
    503 #define SRMMU_PCR_NF	0x00000002	/* Fault inhibit bit */
    504 #define SRMMU_PCR_PSO	0x00000080	/* Partial Store Ordering enable */
    505 #define SRMMU_PCR_CE	0x00000100	/* HS: Cache enable bit (HyperSPARC) */
    506 #define SRMMU_PCR_DCE	0x00000100	/* SS: Data cache enable bit */
    507 #define SRMMU_PCR_ICE	0x00000200	/* SS: SuperSPARC instr. cache enable */
    508 #define SRMMU_PCR_CM	0x00000400	/* HS: Cache mode: 1 == write-back */
    509 #define SRMMU_PCR_SB	0x00000400	/* SS: Store buffer enable bit */
    510 #define	SRMMU_PCR_MR	0x00000800	/* HS: Memory reflection: 1 == on */
    511 #define SRMMU_PCR_MB	0x00000800	/* SS: MBus mode: 0=MXCC, 1=no MXCC */
    512 #define SRMMU_PCR_CS	0x00001000	/* HS: cache size: 1==256k, 0==128k */
    513 #define SRMMU_PCR_PE	0x00001000	/* SS: Enable memory parity checking */
    514 #define SRMMU_PCR_C	0x00002000	/* HS: enable cache when MMU off */
    515 #define SRMMU_PCR_SSBM	0x00002000	/* SS: 1 iff booting */
    516 #define SRMMU_PCR_HSBM	0x00004000	/* HS: 1 iff booting */
    517 #define SRMMU_PCR_SSSE	0x00004000	/* SS: Coherent bus snoop enable */
    518 #define SRMMU_PCR_AC	0x00008000	/* SS: 1=cache non-MMU accesses */
    519 #define	SRMMU_PCR_TC	0x00010000	/* SS: 1=cache table walks */
    520 #define SRMMU_PCR_MID	0x00078000	/* HS: MBus module ID MID<3:0> */
    521 #define SRMMU_PCR_WBE	0x00080000	/* HS: Write buffer enable */
    522 #define SRMMU_PCR_HSSE	0x00100000	/* HS: Coherent bus snoop enable */
    523 #define SRMMU_PCR_CWR	0x00200000	/* HS: Cache wrap enable */
    524 #define SRMMU_PCR_VER	0x0f000000	/* Version of MMU implementation */
    525 #define SRMMU_PCR_IMPL	0xf0000000	/* Implementation number of MMU */
    526 
    527 #ifdef notyet
    528 #define SRMMU_PCR_INITIAL (SRMMU_PCR_ME | SRMMU_PCR_TC)
    529 #endif
    530 
    531 /* [4m] Bits in the Synchronous Fault Status Register */
    532 #define SFSR_EM		0x00020000	/* Error mode watchdog reset occurred */
    533 #define SFSR_CS		0x00010000	/* Control Space error */
    534 #define SFSR_PERR	0x00006000	/* Parity error code */
    535 #define SFSR_SB		0x00008000	/* SS: Store Buffer Error */
    536 #define SFSR_P		0x00004000	/* SS: Parity error */
    537 #define SFSR_UC		0x00001000	/* Uncorrectable error */
    538 #define SFSR_TO		0x00000800	/* S-Bus timeout */
    539 #define SFSR_BE		0x00000400	/* S-Bus bus error */
    540 #define SFSR_LVL	0x00000300	/* Pagetable level causing the fault */
    541 #define SFSR_AT		0x000000e0	/* Access type */
    542 #define SFSR_FT		0x0000001c	/* Fault type */
    543 #define SFSR_FAV	0x00000002	/* Fault Address is valid */
    544 #define SFSR_OW		0x00000001	/* Overwritten with new fault */
    545 
    546 #define	SFSR_BITS \
    547 "\20\21CSERR\17PARITY\16SYSERR\15UNCORR\14TIMEOUT\13BUSERR\2FAV\1OW"
    548 
    549 /* [4m] Synchronous Fault Types */
    550 #define SFSR_FT_NONE		(0 << 2) 	/* no fault */
    551 #define SFSR_FT_INVADDR		(1 << 2)	/* invalid address fault */
    552 #define SFSR_FT_PROTERR		(2 << 2)	/* protection fault */
    553 #define SFSR_FT_PRIVERR		(3 << 2)	/* privelege violation */
    554 #define SFSR_FT_TRANSERR	(4 << 2)	/* translation fault */
    555 #define SFSR_FT_BUSERR		(5 << 2)	/* access bus error */
    556 #define SFSR_FT_INTERR		(6 << 2)	/* internal error */
    557 #define SFSR_FT_RESERVED	(7 << 2)	/* reserved */
    558 
    559 /* [4m] Synchronous Fault Access Types */
    560 #define SFSR_AT_LDUDATA		(0 << 5)     	/* Load user data */
    561 #define SFSR_AT_LDSDATA		(1 << 5)	/* Load supervisor data */
    562 #define SFSR_AT_LDUTEXT		(2 << 5)	/* Load user text */
    563 #define SFSR_AT_LDSTEXT		(3 << 5)	/* Load supervisor text */
    564 #define SFSR_AT_STUDATA		(4 << 5)	/* Store user data */
    565 #define SFSR_AT_STSDATA		(5 << 5) 	/* Store supervisor data */
    566 #define SFSR_AT_STUTEXT		(6 << 5)	/* Store user text */
    567 #define SFSR_AT_STSTEXT		(7 << 5)	/* Store supervisor text */
    568 #define SFSR_AT_SUPERVISOR	(1 << 5)	/* Set iff supervisor */
    569 #define SFSR_AT_TEXT		(2 << 5)	/* Set iff text */
    570 #define SFSR_AT_STORE		(4 << 5)	/* Set iff store */
    571 
    572 /* [4m] Synchronous Fault PT Levels */
    573 #define SFSR_LVL_0		(0 << 8)	/* Context table entry */
    574 #define SFSR_LVL_1		(1 << 8)	/* Region table entry */
    575 #define SFSR_LVL_2		(2 << 8)	/* Segment table entry */
    576 #define SFSR_LVL_3		(3 << 8)	/* Page table entry */
    577 
    578 /* [4m] Asynchronous Fault Status Register bits */
    579 #define AFSR_AFO	0x00000001	/* Async. fault occurred */
    580 #define AFSR_AFA	0x000000f0	/* Bits <35:32> of faulting phys addr */
    581 #define AFSR_AFA_RSHIFT	4		/* Shift to get AFA to bit 0 */
    582 #define AFSR_AFA_LSHIFT	28		/* Shift to get AFA to bit 32 */
    583 #define AFSR_BE		0x00000400	/* Bus error */
    584 #define AFSR_TO		0x00000800	/* Bus timeout */
    585 #define AFSR_UC		0x00001000	/* Uncorrectable error */
    586 #define AFSR_SE		0x00002000	/* System error */
    587 
    588 #define	AFSR_BITS	"\20\16SYSERR\15UNCORR\14TIMEOUT\13BUSERR\1AFO"
    589 
    590 /* [4m] TLB Replacement Control Register bits */
    591 #define TLBC_DISABLE	0x00000020	/* Disable replacement counter */
    592 #define TLBC_RCNTMASK	0x0000001f	/* Replacement counter (0-31) */
    593 #endif
    594