xref: /illumos-gate/usr/src/uts/sun4u/sys/opl_module.h (revision d4660949aa62dd6a963f4913b7120b383cf473c4)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef _SYS_OPL_MODULE_H
27 #define	_SYS_OPL_MODULE_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #include <sys/async.h>
32 
33 #ifdef	__cplusplus
34 extern "C" {
35 #endif
36 
37 #ifdef _KERNEL
38 
39 /*
40  * Sets trap table entry ttentry by overwriting eight instructions from ttlabel.
41  */
42 #define	OPL_SET_TRAP(ttentry, ttlabel)					\
43 		bcopy((const void *)&ttlabel, &ttentry, 32);		\
44 		flush_instr_mem((caddr_t)&ttentry, 32);
45 
46 /*
47  * The same thing as above, but to patch 7 instructions.
48  */
49 #define	OPL_PATCH_28(ttentry, ttlabel)					\
50 		bcopy((const void *)&ttlabel, &ttentry, 28);		\
51 		flush_instr_mem((caddr_t)&ttentry, 28);
52 
53 /*
54  * Define for max size of "reason" string in panic flows.  Since this is on
55  * the stack, we want to keep it as small as is reasonable.
56  */
57 #define	MAX_REASON_STRING	40
58 
59 /*
60  * These error types are specific to Olympus and are used internally for the
61  * opl fault structure flt_type field.
62  */
63 #define	OPL_CPU_SYNC_UE		1
64 #define	OPL_CPU_SYNC_OTHERS	2
65 #define	OPL_CPU_URGENT		3
66 #define	OPL_CPU_INV_SFSR	4
67 #define	OPL_CPU_INV_UGESR	5
68 
69 #ifndef _ASM
70 
71 /*
72  * Define Olympus family (SPARC64-VI) specific asynchronous error structure
73  */
74 typedef struct olympus_async_flt {
75 	struct async_flt cmn_asyncflt;  /* common - see sun4u/sys/async.h */
76 	ushort_t flt_type;		/* types of faults - cpu specific */
77 	uint64_t flt_bit;		/* fault bit for this log msg */
78 	ushort_t flt_eid_mod;		/* module ID (type of hardware) */
79 	ushort_t flt_eid_sid;		/* source ID */
80 } opl_async_flt_t;
81 
82 /*
83  * Error type table struct.
84  */
85 typedef struct ecc_type_to_info {
86 	uint64_t	ec_afsr_bit;	/* SFSR bit of error */
87 	char		*ec_reason;	/* Short error description */
88 	uint_t		ec_flags;	/* Trap type error should be seen at */
89 	int		ec_flt_type;	/* Used for error logging */
90 	char		*ec_desc;	/* Long error description */
91 	uint64_t	ec_err_payload;	/* FM ereport payload information */
92 	char		*ec_err_class;	/* FM ereport class */
93 } ecc_type_to_info_t;
94 
95 /*
96  * Redefine fault status bit field definitions taken from
97  * "async.h". Reused reserved Ultrasparc3 specific fault status
98  * bits here since they are by definition mutually exclusive
99  * w.r.t. OPL
100  */
101 #define	OPL_ECC_ISYNC_TRAP	0x0100
102 #define	OPL_ECC_DSYNC_TRAP	0x0200
103 #define	OPL_ECC_SYNC_TRAP	(OPL_ECC_ISYNC_TRAP|OPL_ECC_DSYNC_TRAP)
104 #define	OPL_ECC_URGENT_TRAP	0x0400
105 
106 #define	TRAP_TYPE_URGENT	0x40
107 
108 /*
109  * Since all the files share a bunch of routines between each other
110  * we will put all the "extern" definitions in this header file so that we
111  * don't have to repeat it all in every file.
112  */
113 
114 /*
115  * functions that are defined in the OPL,SPARC64-VI cpu module:
116  */
117 extern void shipit(int, int);
118 extern void cpu_page_retire(opl_async_flt_t *opl_flt);
119 extern void cpu_init_trap(void);
120 extern void cpu_error_ecache_flush(void);
121 extern void flush_ecache(uint64_t physaddr, size_t ecachesize, size_t linesize);
122 extern void stick_adj(int64_t skew);
123 extern void stick_timestamp(int64_t *ts);
124 extern void hwblkpagecopy(const void *src, void *dst);
125 extern void opl_error_setup(uint64_t);
126 extern void opl_mpg_enable(void);
127 extern int  cpu_queue_events(opl_async_flt_t *, char *, uint64_t);
128 extern void ras_cntr_reset(void *);
129 
130 /*
131  * variables and structures that are defined outside the FJSV,SPARC64-VI
132  * cpu module:
133  */
134 extern uint64_t xc_tick_limit;
135 extern uint64_t xc_tick_jump_limit;
136 
137 /*
138  * Labels used for the trap_table patching
139  */
140 extern uint32_t tt0_iae;
141 extern uint32_t tt1_iae;
142 extern uint32_t tt0_dae;
143 extern uint32_t tt1_dae;
144 extern uint32_t tt0_asdat;
145 extern uint32_t tt1_asdat;
146 
147 extern uint32_t tt0_flushw;
148 extern uint32_t opl_cleanw_patch;
149 
150 extern void opl_serr_instr(void);
151 extern void opl_ugerr_instr(void);
152 
153 extern void opl_ta3_instr(void);
154 extern void opl_ta4_instr(void);
155 
156 /*
157  * D$ and I$ global parameters.
158  */
159 extern int dcache_size;
160 extern int dcache_linesize;
161 extern int icache_size;
162 extern int icache_linesize;
163 
164 #endif /* _ASM */
165 
166 #endif /* _KERNEL */
167 
168 #ifdef	__cplusplus
169 }
170 #endif
171 
172 #endif	/* _SYS_OPL_MODULE_H */
173