xref: /illumos-gate/usr/src/uts/sun4u/sys/opl_module.h (revision 78a2e113edb6fe0a0382b403b55d92e8f0bba78f)
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 2009 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 #include <sys/async.h>
30 
31 #ifdef	__cplusplus
32 extern "C" {
33 #endif
34 
35 #ifdef _KERNEL
36 
37 /*
38  * Sets trap table entry ttentry by overwriting eight instructions from ttlabel.
39  */
40 #define	OPL_SET_TRAP(ttentry, ttlabel)					\
41 		bcopy((const void *)&ttlabel, &ttentry, 32);		\
42 		flush_instr_mem((caddr_t)&ttentry, 32);
43 
44 /*
45  * The same thing as above, but to patch 7 instructions.
46  */
47 #define	OPL_PATCH_28(ttentry, ttlabel)					\
48 		bcopy((const void *)&ttlabel, &ttentry, 28);		\
49 		flush_instr_mem((caddr_t)&ttentry, 28);
50 
51 /*
52  * Define for max size of "reason" string in panic flows.  Since this is on
53  * the stack, we want to keep it as small as is reasonable.
54  */
55 #define	MAX_REASON_STRING	40
56 
57 /*
58  * These error types are specific to Olympus and are used internally for the
59  * opl fault structure flt_type field.
60  */
61 #define	OPL_CPU_SYNC_UE		1
62 #define	OPL_CPU_SYNC_OTHERS	2
63 #define	OPL_CPU_URGENT		3
64 #define	OPL_CPU_INV_SFSR	4
65 #define	OPL_CPU_INV_UGESR	5
66 
67 #ifndef _ASM
68 
69 /*
70  * Define Olympus family (SPARC64-VI) specific asynchronous error structure
71  */
72 typedef struct olympus_async_flt {
73 	struct async_flt cmn_asyncflt;  /* common - see sun4u/sys/async.h */
74 	ushort_t flt_type;		/* types of faults - cpu specific */
75 	uint64_t flt_bit;		/* fault bit for this log msg */
76 	ushort_t flt_eid_mod;		/* module ID (type of hardware) */
77 	ushort_t flt_eid_sid;		/* source ID */
78 } opl_async_flt_t;
79 
80 /*
81  * Error type table struct.
82  */
83 typedef struct ecc_type_to_info {
84 	uint64_t	ec_afsr_bit;	/* SFSR bit of error */
85 	char		*ec_reason;	/* Short error description */
86 	uint_t		ec_flags;	/* Trap type error should be seen at */
87 	int		ec_flt_type;	/* Used for error logging */
88 	char		*ec_desc;	/* Long error description */
89 	uint64_t	ec_err_payload;	/* FM ereport payload information */
90 	char		*ec_err_class;	/* FM ereport class */
91 } ecc_type_to_info_t;
92 
93 /*
94  * Redefine fault status bit field definitions taken from
95  * "async.h". Reused reserved Ultrasparc3 specific fault status
96  * bits here since they are by definition mutually exclusive
97  * w.r.t. OPL
98  */
99 #define	OPL_ECC_ISYNC_TRAP	0x0100
100 #define	OPL_ECC_DSYNC_TRAP	0x0200
101 #define	OPL_ECC_SYNC_TRAP	(OPL_ECC_ISYNC_TRAP|OPL_ECC_DSYNC_TRAP)
102 #define	OPL_ECC_URGENT_TRAP	0x0400
103 
104 #define	TRAP_TYPE_URGENT	0x40
105 
106 /*
107  * Since all the files share a bunch of routines between each other
108  * we will put all the "extern" definitions in this header file so that we
109  * don't have to repeat it all in every file.
110  */
111 
112 /*
113  * functions that are defined in the OPL,SPARC64-VI cpu module:
114  */
115 extern void shipit(int, int);
116 extern void cpu_page_retire(opl_async_flt_t *opl_flt);
117 extern void cpu_init_trap(void);
118 extern void cpu_error_ecache_flush(void);
119 extern void flush_ecache(uint64_t physaddr, size_t ecachesize, size_t linesize);
120 extern void stick_adj(int64_t skew);
121 extern void stick_timestamp(int64_t *ts);
122 extern void hwblkpagecopy(const void *src, void *dst);
123 extern void opl_error_setup(uint64_t);
124 extern int  cpu_queue_events(opl_async_flt_t *, char *, uint64_t);
125 extern void ras_cntr_reset(void *);
126 
127 /*
128  * variables and structures that are defined outside the FJSV,SPARC64-VI
129  * cpu module:
130  */
131 extern uint64_t xc_tick_limit;
132 extern uint64_t xc_tick_jump_limit;
133 
134 /*
135  * Labels used for the trap_table patching
136  */
137 extern uint32_t tt0_iae;
138 extern uint32_t tt1_iae;
139 extern uint32_t tt0_dae;
140 extern uint32_t tt1_dae;
141 extern uint32_t tt0_asdat;
142 extern uint32_t tt1_asdat;
143 
144 extern uint32_t tt0_flushw;
145 extern uint32_t opl_cleanw_patch;
146 
147 extern void opl_serr_instr(void);
148 extern void opl_ugerr_instr(void);
149 
150 extern void opl_ta3_instr(void);
151 extern void opl_ta4_instr(void);
152 
153 /*
154  * D$ and I$ global parameters.
155  */
156 extern int dcache_size;
157 extern int dcache_linesize;
158 extern int icache_size;
159 extern int icache_linesize;
160 
161 #endif /* _ASM */
162 
163 #endif /* _KERNEL */
164 
165 #ifdef	__cplusplus
166 }
167 #endif
168 
169 #endif	/* _SYS_OPL_MODULE_H */
170