xref: /titanic_51/usr/src/uts/sun4u/sunfire/sys/sysctrl.h (revision 29949e866e40b95795203f3ee46f44a197c946e4)
1*29949e86Sstevel /*
2*29949e86Sstevel  * CDDL HEADER START
3*29949e86Sstevel  *
4*29949e86Sstevel  * The contents of this file are subject to the terms of the
5*29949e86Sstevel  * Common Development and Distribution License (the "License").
6*29949e86Sstevel  * You may not use this file except in compliance with the License.
7*29949e86Sstevel  *
8*29949e86Sstevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*29949e86Sstevel  * or http://www.opensolaris.org/os/licensing.
10*29949e86Sstevel  * See the License for the specific language governing permissions
11*29949e86Sstevel  * and limitations under the License.
12*29949e86Sstevel  *
13*29949e86Sstevel  * When distributing Covered Code, include this CDDL HEADER in each
14*29949e86Sstevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*29949e86Sstevel  * If applicable, add the following below this CDDL HEADER, with the
16*29949e86Sstevel  * fields enclosed by brackets "[]" replaced with your own identifying
17*29949e86Sstevel  * information: Portions Copyright [yyyy] [name of copyright owner]
18*29949e86Sstevel  *
19*29949e86Sstevel  * CDDL HEADER END
20*29949e86Sstevel  */
21*29949e86Sstevel 
22*29949e86Sstevel /*
23*29949e86Sstevel  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24*29949e86Sstevel  * Use is subject to license terms.
25*29949e86Sstevel  */
26*29949e86Sstevel 
27*29949e86Sstevel #ifndef	_SYS_SYSCTRL_H
28*29949e86Sstevel #define	_SYS_SYSCTRL_H
29*29949e86Sstevel 
30*29949e86Sstevel #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*29949e86Sstevel 
32*29949e86Sstevel #ifdef	__cplusplus
33*29949e86Sstevel extern "C" {
34*29949e86Sstevel #endif
35*29949e86Sstevel 
36*29949e86Sstevel #ifndef	TRUE
37*29949e86Sstevel #define	TRUE (1)
38*29949e86Sstevel #endif
39*29949e86Sstevel #ifndef	FALSE
40*29949e86Sstevel #define	FALSE (0)
41*29949e86Sstevel #endif
42*29949e86Sstevel 
43*29949e86Sstevel /*
44*29949e86Sstevel  * Debugging macros
45*29949e86Sstevel  *
46*29949e86Sstevel  * The DPRINTF macro can be used by setting the sysc_debug_print_level to the
47*29949e86Sstevel  * appropriate debugging level.  The debug levels are defined in each source
48*29949e86Sstevel  * file where this header file is included.  The scoping of sysc_debug_info,
49*29949e86Sstevel  * and sysc_debug_print_level is to the file which included the header file.
50*29949e86Sstevel  * If multiple levels need to be output, the values can be 'ored'
51*29949e86Sstevel  * together into sysc_debug_print_level.  If sysc_debug_print_line's bit 1 is
52*29949e86Sstevel  * set, the line number of the debugging statement is printed out. If it has
53*29949e86Sstevel  * bit 2 set, the macro will drop into either the debugger or the OBP PROM.
54*29949e86Sstevel  */
55*29949e86Sstevel 
56*29949e86Sstevel #ifdef  DEBUG
57*29949e86Sstevel 
58*29949e86Sstevel #define	SYSCTRL_ATTACH_DEBUG	0x1
59*29949e86Sstevel #define	SYSCTRL_INTERRUPT_DEBUG	0x2
60*29949e86Sstevel #define	SYSCTRL_REGISTERS_DEBUG	0x4
61*29949e86Sstevel #define	SYSC_DEBUG		SYSCTRL_ATTACH_DEBUG
62*29949e86Sstevel 
63*29949e86Sstevel #include <sys/promif.h>
64*29949e86Sstevel extern void debug_enter(char *);
65*29949e86Sstevel 
66*29949e86Sstevel extern int sysc_debug_info;
67*29949e86Sstevel extern int sysc_debug_print_level;
68*29949e86Sstevel 
69*29949e86Sstevel #define	PRINT_LINE_NUMBER	0x1
70*29949e86Sstevel #define	ENTER_MON		0x2
71*29949e86Sstevel 
72*29949e86Sstevel #define	_PRINTF prom_printf	/* For logging to the console */
73*29949e86Sstevel 
74*29949e86Sstevel #define	DPRINTF(print_flag, args)			\
75*29949e86Sstevel 	if (sysc_debug_print_level & (print_flag) && sysc_debug_info & \
76*29949e86Sstevel 	    PRINT_LINE_NUMBER) \
77*29949e86Sstevel 		_PRINTF("%s line %d:\n", __FILE__, __LINE__);	\
78*29949e86Sstevel 	if (sysc_debug_print_level & (print_flag)) {	\
79*29949e86Sstevel 		_PRINTF args;				\
80*29949e86Sstevel 	if (sysc_debug_info & ENTER_MON)			\
81*29949e86Sstevel 		debug_enter("");				\
82*29949e86Sstevel 	}
83*29949e86Sstevel 
84*29949e86Sstevel #else
85*29949e86Sstevel #define	DPRINTF(print_flag, args)
86*29949e86Sstevel #endif /* DEBUG */
87*29949e86Sstevel 
88*29949e86Sstevel /*
89*29949e86Sstevel  * OBP supplies us with 3 register sets for the clock-board node. The code for
90*29949e86Sstevel  * the syctrl driver relies on these register sets being presented by the
91*29949e86Sstevel  * PROM in the order specified below. If this changes, the following comments
92*29949e86Sstevel  * must be revised and the code in sysctrl_attach() must be changed to reflect
93*29949e86Sstevel  * these revisions.
94*29949e86Sstevel  *
95*29949e86Sstevel  * They are:
96*29949e86Sstevel  * 	0	Clock frequency registers
97*29949e86Sstevel  *	1	Misc registers
98*29949e86Sstevel  *	2       Clock version register
99*29949e86Sstevel  */
100*29949e86Sstevel 
101*29949e86Sstevel /*
102*29949e86Sstevel  * The offsets are defined as offsets in bytes from the base of the OBP
103*29949e86Sstevel  * register to which the register belongs to.
104*29949e86Sstevel  */
105*29949e86Sstevel 
106*29949e86Sstevel /* Register set 0 */
107*29949e86Sstevel #define	SYS_OFF_CLK_FREQ2	0x2	/* offset of clock register 2 */
108*29949e86Sstevel 
109*29949e86Sstevel /* Important bits for Clock Frequency register 2 */
110*29949e86Sstevel #define	RCONS_UART_EN	0x80	/* Remote console reset enabled */
111*29949e86Sstevel #define	GEN_RESET_EN	0x40	/* Enable reset on freq change */
112*29949e86Sstevel #define	TOD_RESET_EN	0x20	/* Enable reset from TOD watchdog */
113*29949e86Sstevel #define	CLOCK_FREQ_8	0x01	/* Frequency bit 8 */
114*29949e86Sstevel #define	CLOCK_DIV_0	0x02	/* Cpu module divisor bit 0 */
115*29949e86Sstevel #define	CLOCK_RANGE	0x0c	/* Bits 3:2 control the clock range */
116*29949e86Sstevel #define	CLOCK_DIV_1	0x10	/* Cpu module divisor bit 1 */
117*29949e86Sstevel 
118*29949e86Sstevel /* Register set 1 */
119*29949e86Sstevel #define	SYS_OFF_CTRL	0x0	/* Offset of System Control register */
120*29949e86Sstevel #define	SYS_OFF_STAT1	0x10	/* Offset of System Status1 register */
121*29949e86Sstevel #define	SYS_OFF_STAT2	0x20	/* Offset of System Status2 register */
122*29949e86Sstevel #define	SYS_OFF_PSSTAT	0x30	/* Offset of Power Supply Status */
123*29949e86Sstevel #define	SYS_OFF_PSPRES	0x40	/* Offset of Power Supply Presence */
124*29949e86Sstevel #define	SYS_OFF_TEMP	0x50	/* Offset of temperature register */
125*29949e86Sstevel #define	SYS_OFF_DIAG	0x60	/* Offset of interrupt diag register */
126*29949e86Sstevel #define	SYS_OFF_PPPSR	0x70	/* Offset of second Power Supply Status */
127*29949e86Sstevel #define	SYS_STATUS1_PADDR	0x1fff8906010 /* physical address for physio */
128*29949e86Sstevel 
129*29949e86Sstevel /* Register set 2 (not present on old vintage clock boards) */
130*29949e86Sstevel #define	CLK_VERSION_REG	0x0	/* Offset of clock version register */
131*29949e86Sstevel #define	CLK_VERSION_REG_PADDR 0x1fff890c000 /* physical address for physio */
132*29949e86Sstevel 
133*29949e86Sstevel /* Important bits for the board version register */
134*29949e86Sstevel #define	OLD_CLK_GEN	0x1
135*29949e86Sstevel #define	OLD_CLK_DIV	0x2
136*29949e86Sstevel 
137*29949e86Sstevel #define	RMT_CONS_OFFSET	0x4004	/* Offset of Remote Console UART */
138*29949e86Sstevel #define	RMT_CONS_LEN	0x8	/* Size of Remote Console UART */
139*29949e86Sstevel 
140*29949e86Sstevel /* Bit field defines for System Control register */
141*29949e86Sstevel #define	SYS_PPS_FAN_FAIL_EN	0x80	/* PPS Fan Fail Interrupt Enable */
142*29949e86Sstevel #define	SYS_PS_FAIL_EN		0x40	/* PS DC Fail Interrupt Enable */
143*29949e86Sstevel #define	SYS_AC_PWR_FAIL_EN	0x20	/* AC Power Fail Interrupt Enable */
144*29949e86Sstevel #define	SYS_SBRD_PRES_EN	0x10	/* Board Insertion Interrupt En */
145*29949e86Sstevel #define	SYS_PWR_OFF		0x08	/* Bit to turn system power */
146*29949e86Sstevel #define	SYS_LED_LEFT		0x04	/* System Left LED. Reverse Logic */
147*29949e86Sstevel #define	SYS_LED_MID		0x02	/* System Middle LED */
148*29949e86Sstevel #define	SYS_LED_RIGHT		0x01	/* System Right LED */
149*29949e86Sstevel 
150*29949e86Sstevel /* Bit field defines for System Status1 register */
151*29949e86Sstevel #define	SYS_SLOTS		0xC0	/* system type slot field */
152*29949e86Sstevel #define	SYS_NOT_SECURE		0x20	/* ==0 Keyswitch in secure pos. */
153*29949e86Sstevel #define	SYS_NOT_P_FAN_PRES	0x10	/* ==0 PPS cooling tray present */
154*29949e86Sstevel #define	SYS_NOT_BRD_PRES	0x08	/* ==0 When board inserted */
155*29949e86Sstevel #define	SYS_NOT_PPS0_PRES	0x04	/* ==0 If PPS0 present */
156*29949e86Sstevel #define	SYS_TOD_NOT_RST		0x02	/* ==0 if TOD reset occurred */
157*29949e86Sstevel #define	SYS_GEN_NOT_RST		0x01	/* ==0 if clock freq reset occured */
158*29949e86Sstevel 
159*29949e86Sstevel /* Macros to determine system type from System Status1 register */
160*29949e86Sstevel #define	SYS_TYPE(x)		((x) & SYS_SLOTS)
161*29949e86Sstevel #define	SYS_16_SLOT		0x40
162*29949e86Sstevel #define	SYS_8_SLOT		0xC0
163*29949e86Sstevel #define	SYS_4_SLOT		0x80
164*29949e86Sstevel #define	SYS_TESTBED		0x00
165*29949e86Sstevel 
166*29949e86Sstevel /* Bit field defines for Clock Version Register */
167*29949e86Sstevel #define	SYS_SLOTS2		0x80	/* system type slot2 mask */
168*29949e86Sstevel #define	SYS_PLUS_SYSTEM		0x00	/* bit 7 is low for plus system */
169*29949e86Sstevel 
170*29949e86Sstevel /* Macros to determine frequency capability from clock version register */
171*29949e86Sstevel #define	SYS_TYPE2(x)		((x) & SYS_SLOTS2)
172*29949e86Sstevel #define	ISPLUSSYS(reg)		((reg != 0) && \
173*29949e86Sstevel 					(SYS_TYPE2(*reg) == SYS_PLUS_SYSTEM))
174*29949e86Sstevel 
175*29949e86Sstevel /* Macros to determine system type based on number of physical slots */
176*29949e86Sstevel #define	IS4SLOT(n)		((n) == 4)
177*29949e86Sstevel #define	IS5SLOT(n)		((n) == 5)
178*29949e86Sstevel #define	IS8SLOT(n)		((n) == 8)
179*29949e86Sstevel #define	IS16SLOT(n)		((n) == 16)
180*29949e86Sstevel #define	ISTESTBED(n)		((n) == 0)
181*29949e86Sstevel 
182*29949e86Sstevel /* Bit field defines for System Status2 register */
183*29949e86Sstevel #define	SYS_RMTE_NOT_RST	0x80	/* Remote Console reset occurred */
184*29949e86Sstevel #define	SYS_PPS0_OK		0x40	/* ==1 PPS0 OK */
185*29949e86Sstevel #define	SYS_CLK_33_OK		0x20	/* 3.3V OK on clock board */
186*29949e86Sstevel #define	SYS_CLK_50_OK		0x10	/* 5.0V OK on clock board */
187*29949e86Sstevel #define	SYS_AC_FAIL		0x08	/* System lost AC Power source */
188*29949e86Sstevel #define	SYS_RACK_FANFAIL	0x04	/* Peripheral Rack fan status */
189*29949e86Sstevel #define	SYS_AC_FAN_OK		0x02	/* Status of 4 AC box fans */
190*29949e86Sstevel #define	SYS_KEYSW_FAN_OK	0x01	/* Status of keyswitch fan */
191*29949e86Sstevel 
192*29949e86Sstevel /* Bit field defines for Power Supply Presence register */
193*29949e86Sstevel #define	SYS_NOT_PPS1_PRES	0x80	/* ==0 if PPS1 present in 4slot */
194*29949e86Sstevel 
195*29949e86Sstevel /* Bit field defines for Precharge and Peripheral Power Status register */
196*29949e86Sstevel #define	SYS_NOT_CURRENT_S	0x80	/* Current share backplane */
197*29949e86Sstevel #define	SYS_PPPSR_BITS		0x7f	/* bulk test bit mask */
198*29949e86Sstevel #define	SYS_V5_P_OK		0x40	/* ==1 peripheral 5v ok */
199*29949e86Sstevel #define	SYS_V12_P_OK		0x20	/* ==1 peripheral 12v ok */
200*29949e86Sstevel #define	SYS_V5_AUX_OK		0x10	/* ==1 auxiliary 5v ok */
201*29949e86Sstevel #define	SYS_V5_P_PCH_OK		0x08	/* ==1 peripheral 5v precharge ok */
202*29949e86Sstevel #define	SYS_V12_P_PCH_OK	0x04	/* ==1 peripheral 12v precharge ok */
203*29949e86Sstevel #define	SYS_V3_PCH_OK		0x02	/* ==1 system 3.3v precharge ok */
204*29949e86Sstevel #define	SYS_V5_PCH_OK		0x01	/* ==1 system 5.0v precharge ok */
205*29949e86Sstevel 
206*29949e86Sstevel #ifndef _ASM
207*29949e86Sstevel 
208*29949e86Sstevel #define	SYSCTRL_KSTAT_NAME	"sysctrl"
209*29949e86Sstevel #define	CSR_KSTAT_NAMED		"csr"
210*29949e86Sstevel #define	STAT1_KSTAT_NAMED	"status1"
211*29949e86Sstevel #define	STAT2_KSTAT_NAMED	"status2"
212*29949e86Sstevel #define	CLK_FREQ2_KSTAT_NAMED	"clk_freq2"
213*29949e86Sstevel #define	FAN_KSTAT_NAMED		"fan_status"
214*29949e86Sstevel #define	KEY_KSTAT_NAMED		"key_status"
215*29949e86Sstevel #define	POWER_KSTAT_NAMED	"power_status"
216*29949e86Sstevel #define	BDLIST_KSTAT_NAME	"bd_list"
217*29949e86Sstevel #define	CLK_VER_KSTAT_NAME	"clk_ver"
218*29949e86Sstevel 
219*29949e86Sstevel /*
220*29949e86Sstevel  * The Power Supply shadow kstat is too large to fit in a kstat_named
221*29949e86Sstevel  * struct, so it has been changed to be a raw kstat.
222*29949e86Sstevel  */
223*29949e86Sstevel #define	PSSHAD_KSTAT_NAME	"ps_shadow"
224*29949e86Sstevel 
225*29949e86Sstevel /* States of a power supply DC voltage. */
226*29949e86Sstevel enum e_state { PS_BOOT = 0, PS_OUT, PS_UNKNOWN, PS_OK, PS_FAIL };
227*29949e86Sstevel enum e_pres_state { PRES_UNKNOWN = 0, PRES_IN, PRES_OUT };
228*29949e86Sstevel 
229*29949e86Sstevel /*
230*29949e86Sstevel  * several power supplies are managed -- 8 core power supplies,
231*29949e86Sstevel  * up to two pps, a couple of clock board powers and a register worth
232*29949e86Sstevel  * of precharges.
233*29949e86Sstevel  */
234*29949e86Sstevel #define	SYS_PS_COUNT 19
235*29949e86Sstevel /* core PS 0 thru 7 are index 0 thru 7 */
236*29949e86Sstevel #define	SYS_PPS0_INDEX		8
237*29949e86Sstevel #define	SYS_CLK_33_INDEX	9
238*29949e86Sstevel #define	SYS_CLK_50_INDEX	10
239*29949e86Sstevel #define	SYS_V5_P_INDEX		11
240*29949e86Sstevel #define	SYS_V12_P_INDEX		12
241*29949e86Sstevel #define	SYS_V5_AUX_INDEX	13
242*29949e86Sstevel #define	SYS_V5_P_PCH_INDEX	14
243*29949e86Sstevel #define	SYS_V12_P_PCH_INDEX	15
244*29949e86Sstevel #define	SYS_V3_PCH_INDEX	16
245*29949e86Sstevel #define	SYS_V5_PCH_INDEX	17
246*29949e86Sstevel #define	SYS_P_FAN_INDEX		18	/* the peripheral fan assy */
247*29949e86Sstevel 
248*29949e86Sstevel /* fan timeout structures */
249*29949e86Sstevel enum pps_fan_type { RACK = 0, AC = 1, KEYSW = 2 };
250*29949e86Sstevel #define	SYS_PPS_FAN_COUNT	3
251*29949e86Sstevel 
252*29949e86Sstevel /*
253*29949e86Sstevel  * States of the secure key switch position.
254*29949e86Sstevel  */
255*29949e86Sstevel enum keyswitch_state { KEY_BOOT = 0, KEY_SECURE, KEY_NOT_SECURE };
256*29949e86Sstevel 
257*29949e86Sstevel /* Redundant power states */
258*29949e86Sstevel enum power_state { BOOT = 0, BELOW_MINIMUM, MINIMUM, REDUNDANT };
259*29949e86Sstevel 
260*29949e86Sstevel /*
261*29949e86Sstevel  * minor device mask
262*29949e86Sstevel  * B	- bottom 4 bits (16 slots) are for the slot/receptacle id
263*29949e86Sstevel  * I	- next 4 bits are for the instance number
264*29949e86Sstevel  * X	- rest are not used
265*29949e86Sstevel  *
266*29949e86Sstevel  * Upper                  Lower
267*29949e86Sstevel  * XXXXX...............IIIIBBBB
268*29949e86Sstevel  *
269*29949e86Sstevel  * Example:
270*29949e86Sstevel  * device at instance 0 and slot 8, minor device number 0x8 = decimal 8
271*29949e86Sstevel  * device at instance 1 and slot 10, minor device number 0x1A = decimal 26
272*29949e86Sstevel  */
273*29949e86Sstevel #define	SYSC_SLOT_MASK		0x0F
274*29949e86Sstevel #define	SYSC_INSTANCE_MASK	0xF0
275*29949e86Sstevel #define	SYSC_INSTANCE_SHIFT	4
276*29949e86Sstevel 
277*29949e86Sstevel /* Macro definitions */
278*29949e86Sstevel #define	HOTPLUG_DISABLED_PROPERTY "hotplug-disabled"
279*29949e86Sstevel #define	GETSLOT(unit)		(getminor(unit) & SYSC_SLOT_MASK)
280*29949e86Sstevel #define	GETINSTANCE(unit) \
281*29949e86Sstevel 	((getminor(unit) & SYSC_INSTANCE_MASK) >> SYSC_INSTANCE_SHIFT)
282*29949e86Sstevel #define	PUTINSTANCE(inst) \
283*29949e86Sstevel 	(((inst) << SYSC_INSTANCE_SHIFT) & SYSC_INSTANCE_MASK)
284*29949e86Sstevel #define	GETSOFTC(i) \
285*29949e86Sstevel 	((struct sysctrl_soft_state *)ddi_get_soft_state(sysctrlp, getminor(i)))
286*29949e86Sstevel 
287*29949e86Sstevel /*
288*29949e86Sstevel  * Definition of sysctrl ioctls.
289*29949e86Sstevel  */
290*29949e86Sstevel #define	SYSC_IOC		('H'<<8)
291*29949e86Sstevel 
292*29949e86Sstevel #define	SYSC_CFGA_CMD_GETSTATUS		(SYSC_IOC|68)
293*29949e86Sstevel #define	SYSC_CFGA_CMD_EJECT		(SYSC_IOC|69)
294*29949e86Sstevel #define	SYSC_CFGA_CMD_INSERT		(SYSC_IOC|70)
295*29949e86Sstevel #define	SYSC_CFGA_CMD_CONNECT		(SYSC_IOC|71)
296*29949e86Sstevel #define	SYSC_CFGA_CMD_DISCONNECT	(SYSC_IOC|72)
297*29949e86Sstevel #define	SYSC_CFGA_CMD_UNCONFIGURE	(SYSC_IOC|73)
298*29949e86Sstevel #define	SYSC_CFGA_CMD_CONFIGURE		(SYSC_IOC|74)
299*29949e86Sstevel #define	SYSC_CFGA_CMD_TEST		(SYSC_IOC|75)
300*29949e86Sstevel #define	SYSC_CFGA_CMD_TEST_SET_COND	(SYSC_IOC|76)
301*29949e86Sstevel #define	SYSC_CFGA_CMD_QUIESCE_TEST	(SYSC_IOC|77)
302*29949e86Sstevel 
303*29949e86Sstevel #if defined(_KERNEL)
304*29949e86Sstevel 
305*29949e86Sstevel #define	SPUR_TIMEOUT_USEC			(1 * MICROSEC)
306*29949e86Sstevel #define	SPUR_LONG_TIMEOUT_USEC			(5 * MICROSEC)
307*29949e86Sstevel #define	AC_TIMEOUT_USEC				(1 * MICROSEC)
308*29949e86Sstevel #define	PS_FAIL_TIMEOUT_USEC			(500 * (MICROSEC / MILLISEC))
309*29949e86Sstevel #define	PPS_FAN_TIMEOUT_USEC			(1 * MICROSEC)
310*29949e86Sstevel 
311*29949e86Sstevel #define	BRD_INSERT_DELAY_USEC			(500 * (MICROSEC / MILLISEC))
312*29949e86Sstevel #define	BRD_INSERT_RETRY_USEC			(5 * MICROSEC)
313*29949e86Sstevel #define	BRD_REMOVE_TIMEOUT_USEC			(2 * MICROSEC)
314*29949e86Sstevel #define	BLINK_LED_TIMEOUT_USEC			(300 * (MICROSEC / MILLISEC))
315*29949e86Sstevel #define	KEYSWITCH_TIMEOUT_USEC			(1 * MICROSEC)
316*29949e86Sstevel 
317*29949e86Sstevel #define	PS_INSUFFICIENT_COUNTDOWN_SEC		30
318*29949e86Sstevel 
319*29949e86Sstevel /*
320*29949e86Sstevel  * how many ticks to wait to register the state change
321*29949e86Sstevel  * NOTE: ticks are measured in PS_FAIL_TIMEOUT_USEC clicks
322*29949e86Sstevel  */
323*29949e86Sstevel #define	PS_PRES_CHANGE_TICKS	1
324*29949e86Sstevel #define	PS_FROM_BOOT_TICKS	1
325*29949e86Sstevel #define	PS_FROM_UNKNOWN_TICKS	10
326*29949e86Sstevel #define	PS_POWER_COUNTDOWN_TICKS 60
327*29949e86Sstevel 
328*29949e86Sstevel /* Note: this timeout needs to be longer than FAN_OK_TIMEOUT_USEC */
329*29949e86Sstevel #define	PS_P_FAN_FROM_UNKNOWN_TICKS 15
330*29949e86Sstevel 
331*29949e86Sstevel #define	PS_FROM_OK_TICKS	1
332*29949e86Sstevel #define	PS_PCH_FROM_OK_TICKS	3
333*29949e86Sstevel #define	PS_FROM_FAIL_TICKS	4
334*29949e86Sstevel 
335*29949e86Sstevel /* NOTE: these ticks are measured in PPS_FAN_TIMEOUT_USEC clicks */
336*29949e86Sstevel #define	PPS_FROM_FAIL_TICKS	7
337*29949e86Sstevel 
338*29949e86Sstevel /*
339*29949e86Sstevel  * how many spurious interrupts to take during a SPUR_LONG_TIMEOUT_USEC
340*29949e86Sstevel  * before complaining
341*29949e86Sstevel  */
342*29949e86Sstevel #define	MAX_SPUR_COUNT		2
343*29949e86Sstevel 
344*29949e86Sstevel /*
345*29949e86Sstevel  * Global driver structure which defines the presence and status of
346*29949e86Sstevel  * all board power supplies.
347*29949e86Sstevel  */
348*29949e86Sstevel struct ps_state {
349*29949e86Sstevel 	int pctr;			/* tick counter for presense deglitch */
350*29949e86Sstevel 	int dcctr;			/* tick counter for dc ok deglitch */
351*29949e86Sstevel 	enum e_pres_state pshadow;	/* presense shadow state */
352*29949e86Sstevel 	enum e_state dcshadow;		/* dc ok shadow state */
353*29949e86Sstevel };
354*29949e86Sstevel 
355*29949e86Sstevel /*
356*29949e86Sstevel  * for sysctrl_thread_wakeup()
357*29949e86Sstevel  */
358*29949e86Sstevel #define	OVERTEMP_POLL	1
359*29949e86Sstevel #define	KEYSWITCH_POLL	2
360*29949e86Sstevel 
361*29949e86Sstevel /*
362*29949e86Sstevel  * Structures used in the driver to manage the hardware
363*29949e86Sstevel  * XXX will need to add a nodeid
364*29949e86Sstevel  */
365*29949e86Sstevel struct sysctrl_soft_state {
366*29949e86Sstevel 	dev_info_t *dip;		/* dev info of myself */
367*29949e86Sstevel 	dev_info_t *pdip;		/* dev info of parent */
368*29949e86Sstevel 	struct sysctrl_soft_state *next;
369*29949e86Sstevel 	int mondo;			/* INO for this type of interrupt */
370*29949e86Sstevel 	uchar_t nslots;			/* slots in this system (0-16) */
371*29949e86Sstevel 
372*29949e86Sstevel 	pnode_t options_nodeid;		/* for nvram powerfail-time */
373*29949e86Sstevel 
374*29949e86Sstevel 	ddi_iblock_cookie_t iblock;	/* High level interrupt cookie */
375*29949e86Sstevel 	ddi_idevice_cookie_t idevice;	/* TODO - Do we need this? */
376*29949e86Sstevel 	ddi_softintr_t spur_id;		/* when we get a spurious int... */
377*29949e86Sstevel 	ddi_iblock_cookie_t spur_int_c;	/* spur int cookie */
378*29949e86Sstevel 	ddi_softintr_t spur_high_id;	/* when we reenable disabled ints */
379*29949e86Sstevel 	ddi_softintr_t spur_long_to_id;	/* long timeout softint */
380*29949e86Sstevel 	ddi_softintr_t ac_fail_id;	/* ac fail softintr id */
381*29949e86Sstevel 	ddi_softintr_t ac_fail_high_id;	/* ac fail re-enable softintr id */
382*29949e86Sstevel 	ddi_softintr_t ps_fail_int_id;	/* ps fail from intr softintr id */
383*29949e86Sstevel 	ddi_iblock_cookie_t ps_fail_c;	/* ps fail softintr cookie */
384*29949e86Sstevel 	ddi_softintr_t ps_fail_poll_id;	/* ps fail from polling softintr */
385*29949e86Sstevel 	ddi_softintr_t pps_fan_id;	/* pps fan fail softintr id */
386*29949e86Sstevel 	ddi_softintr_t pps_fan_high_id;	/* pps fan re-enable softintr id */
387*29949e86Sstevel 	ddi_softintr_t sbrd_pres_id;	/* sbrd softintr id */
388*29949e86Sstevel 	ddi_softintr_t sbrd_gone_id;	/* sbrd removed softintr id */
389*29949e86Sstevel 	ddi_softintr_t blink_led_id;	/* led blinker softint */
390*29949e86Sstevel 	ddi_iblock_cookie_t sys_led_c;	/* mutex cookie for sys LED lock */
391*29949e86Sstevel 
392*29949e86Sstevel 	volatile uchar_t *clk_freq1;	/* Clock frequency reg. 1 */
393*29949e86Sstevel 	volatile uchar_t *clk_freq2;	/* Clock frequency reg. 2 */
394*29949e86Sstevel 	volatile uchar_t *status1;	/* System Status1 register */
395*29949e86Sstevel 	volatile uchar_t *status2;	/* System Status2 register */
396*29949e86Sstevel 	volatile uchar_t *ps_stat;	/* Power Supply Status register */
397*29949e86Sstevel 	volatile uchar_t *ps_pres;	/* Power Supply Presence register */
398*29949e86Sstevel 	volatile uchar_t *pppsr;	/* 2nd Power Supply Status register */
399*29949e86Sstevel 	volatile uchar_t *temp_reg;	/* VA of temperature register */
400*29949e86Sstevel 	volatile uchar_t *rcons_ctl;	/* VA of Remote console UART */
401*29949e86Sstevel 	volatile uchar_t *clk_ver;	/* clock version register */
402*29949e86Sstevel 
403*29949e86Sstevel 	/* This mutex protects the following data */
404*29949e86Sstevel 	/* NOTE: *csr should only be accessed from interrupt level */
405*29949e86Sstevel 	kmutex_t csr_mutex;		/* locking for csr enable bits */
406*29949e86Sstevel 	volatile uchar_t *csr;		/* System Control Register */
407*29949e86Sstevel 	uchar_t pps_fan_saved;		/* cached pps fanfail state */
408*29949e86Sstevel 	uchar_t saved_en_state;		/* spurious int cache */
409*29949e86Sstevel 	int spur_count;			/* count multiple spurious ints */
410*29949e86Sstevel 
411*29949e86Sstevel 	/* This mutex protects the following data */
412*29949e86Sstevel 	kmutex_t spur_int_lock;		/* lock spurious interrupt data */
413*29949e86Sstevel 	timeout_id_t spur_timeout_id;	/* quiet the int timeout id */
414*29949e86Sstevel 	timeout_id_t spur_long_timeout_id; /* spurious long timeout interval */
415*29949e86Sstevel 
416*29949e86Sstevel 	/* This mutex protects the following data */
417*29949e86Sstevel 	kmutex_t ps_fail_lock;		/* low level lock */
418*29949e86Sstevel 	struct ps_state ps_stats[SYS_PS_COUNT]; /* state struct for all ps */
419*29949e86Sstevel 	enum power_state power_state;	/* redundant power state */
420*29949e86Sstevel 	int power_countdown;		/* clicks until reboot */
421*29949e86Sstevel 
422*29949e86Sstevel 	/* This mutex protects the following data */
423*29949e86Sstevel 	kmutex_t sys_led_lock;		/* low level lock */
424*29949e86Sstevel 	int sys_led;			/* on (TRUE) or off (FALSE) */
425*29949e86Sstevel 	int sys_fault;			/* on (TRUE) or off (FALSE) */
426*29949e86Sstevel 
427*29949e86Sstevel 	/* various elements protected by their inherent access patterns */
428*29949e86Sstevel 	int pps_fan_external_state;	/* external state of the pps fans */
429*29949e86Sstevel 	int pps_fan_state_count[SYS_PPS_FAN_COUNT]; /* fan state counter */
430*29949e86Sstevel 	struct temp_stats tempstat;	/* in memory storage of temperature */
431*29949e86Sstevel 	enum keyswitch_state key_shadow; /* external state of the key switch */
432*29949e86Sstevel 
433*29949e86Sstevel 	int enable_rcons_atboot;	/* enable remote console at boot */
434*29949e86Sstevel };
435*29949e86Sstevel 
436*29949e86Sstevel /*
437*29949e86Sstevel  * Kstat structures used to contain data which is requested by user
438*29949e86Sstevel  * programs.
439*29949e86Sstevel  */
440*29949e86Sstevel struct sysctrl_kstat {
441*29949e86Sstevel 	struct kstat_named	csr;		/* system control register */
442*29949e86Sstevel 	struct kstat_named	status1;	/* system status 1 */
443*29949e86Sstevel 	struct kstat_named	status2;	/* system status 2 */
444*29949e86Sstevel 	struct kstat_named	clk_freq2;	/* Clock register 2 */
445*29949e86Sstevel 	struct kstat_named	fan_status;	/* shadow status 2 for fans */
446*29949e86Sstevel 	struct kstat_named	key_status;	/* shadow status for key */
447*29949e86Sstevel 	struct kstat_named	power_state;	/* redundant power status */
448*29949e86Sstevel 	struct kstat_named	clk_ver;	/* clock version register */
449*29949e86Sstevel };
450*29949e86Sstevel 
451*29949e86Sstevel #define	SYSC_ERR_SET(pkt, err)	(pkt)->cmd_cfga.errtype = (err)
452*29949e86Sstevel 
453*29949e86Sstevel /*
454*29949e86Sstevel  * Function prototype
455*29949e86Sstevel  */
456*29949e86Sstevel int sysc_policy_disconnect(struct sysctrl_soft_state *,
457*29949e86Sstevel 				sysc_cfga_pkt_t *, sysc_cfga_stat_t *);
458*29949e86Sstevel int sysc_policy_connect(struct sysctrl_soft_state *,
459*29949e86Sstevel 				sysc_cfga_pkt_t *, sysc_cfga_stat_t *);
460*29949e86Sstevel int sysc_policy_unconfigure(struct sysctrl_soft_state *,
461*29949e86Sstevel 				sysc_cfga_pkt_t *, sysc_cfga_stat_t *);
462*29949e86Sstevel int sysc_policy_configure(struct sysctrl_soft_state *,
463*29949e86Sstevel 				sysc_cfga_pkt_t *, sysc_cfga_stat_t *);
464*29949e86Sstevel 
465*29949e86Sstevel void sysc_policy_update(void *softsp, sysc_cfga_stat_t *sc, sysc_evt_t event);
466*29949e86Sstevel 
467*29949e86Sstevel extern void		sysctrl_suspend_prepare(void);
468*29949e86Sstevel extern int		sysctrl_suspend(sysc_cfga_pkt_t *);
469*29949e86Sstevel extern void		sysctrl_resume(sysc_cfga_pkt_t *);
470*29949e86Sstevel 
471*29949e86Sstevel #endif /* _KERNEL */
472*29949e86Sstevel #endif /* _ASM */
473*29949e86Sstevel 
474*29949e86Sstevel #ifdef	__cplusplus
475*29949e86Sstevel }
476*29949e86Sstevel #endif
477*29949e86Sstevel 
478*29949e86Sstevel #endif	/* _SYS_SYSCTRL_H */
479