xref: /onnv-gate/usr/src/uts/sun4u/sys/envctrl_ue450.h (revision 1341:6d7c4f090a72)
1*1341Sstevel /*
2*1341Sstevel  * CDDL HEADER START
3*1341Sstevel  *
4*1341Sstevel  * The contents of this file are subject to the terms of the
5*1341Sstevel  * Common Development and Distribution License (the "License").
6*1341Sstevel  * You may not use this file except in compliance with the License.
7*1341Sstevel  *
8*1341Sstevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*1341Sstevel  * or http://www.opensolaris.org/os/licensing.
10*1341Sstevel  * See the License for the specific language governing permissions
11*1341Sstevel  * and limitations under the License.
12*1341Sstevel  *
13*1341Sstevel  * When distributing Covered Code, include this CDDL HEADER in each
14*1341Sstevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*1341Sstevel  * If applicable, add the following below this CDDL HEADER, with the
16*1341Sstevel  * fields enclosed by brackets "[]" replaced with your own identifying
17*1341Sstevel  * information: Portions Copyright [yyyy] [name of copyright owner]
18*1341Sstevel  *
19*1341Sstevel  * CDDL HEADER END
20*1341Sstevel  */
21*1341Sstevel 
22*1341Sstevel /*
23*1341Sstevel  * Copyright 1998 Sun Microsystems, Inc.  All rights reserved.
24*1341Sstevel  * Use is subject to license terms.
25*1341Sstevel  */
26*1341Sstevel 
27*1341Sstevel #ifndef	_SYS_ENVCTRL_UE450_H
28*1341Sstevel #define	_SYS_ENVCTRL_UE450_H
29*1341Sstevel 
30*1341Sstevel #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*1341Sstevel 
32*1341Sstevel #ifdef	__cplusplus
33*1341Sstevel extern "C" {
34*1341Sstevel #endif
35*1341Sstevel 
36*1341Sstevel /*
37*1341Sstevel  * envctrl_ue450.h
38*1341Sstevel  *
39*1341Sstevel  * This header file contains environmental control definitions specific
40*1341Sstevel  * to the UltraEnterprise-450 (aka. Ultra-4) platform.
41*1341Sstevel  */
42*1341Sstevel 
43*1341Sstevel #define	OVERTEMP_TIMEOUT_USEC	60 * MICROSEC
44*1341Sstevel #define	BLINK_TIMEOUT_USEC	500 * (MICROSEC / MILLISEC)
45*1341Sstevel 
46*1341Sstevel #define	MAX_TAZ_CONTROLLERS 0x02
47*1341Sstevel #define	ENVCTRL_TAZCPU_STRING	"SUNW,UltraSPARC"
48*1341Sstevel #define	ENVCTRL_TAZBLKBRDCPU_STRING	"SUNW,UltraSPARC-II"
49*1341Sstevel 
50*1341Sstevel /*
51*1341Sstevel  * MACROS
52*1341Sstevel  */
53*1341Sstevel 
54*1341Sstevel #define	S1	&unitp->bus_ctl_regs->s1
55*1341Sstevel #define	S0	&unitp->bus_ctl_regs->s0
56*1341Sstevel 
57*1341Sstevel /*
58*1341Sstevel  * I2c Sensor Types
59*1341Sstevel  */
60*1341Sstevel 
61*1341Sstevel #define	PCD8584		0x00	/* Bus Controller Master */
62*1341Sstevel #define	PCF8591		0x01	/* Temp Sensor 8bit A/D, D/A */
63*1341Sstevel #define	PCF8574		0x02	/* PS, FAN, LED, Fail and Control */
64*1341Sstevel #define	TDA8444T	0x03	/* Fan Speed Control, 8 bit D/A */
65*1341Sstevel #define	PCF8574A	0x04	/* 8574A chip */
66*1341Sstevel #define	PCF8583		0x05	/* PCF8583 clock chip */
67*1341Sstevel 
68*1341Sstevel /*
69*1341Sstevel  * Max number of a particular
70*1341Sstevel  * device on 1 bus.
71*1341Sstevel  */
72*1341Sstevel #define	MAX_DEVS	0x10
73*1341Sstevel #define	I2C_NODEV	0xFF
74*1341Sstevel #define	MIN_FAN_BANKS	0x02
75*1341Sstevel #define	INSTANCE_0	0x00
76*1341Sstevel 
77*1341Sstevel /*
78*1341Sstevel  * Defines for the PCF8583 Clock Calendar Chip
79*1341Sstevel  * We use this chip as a watchdog timer for the fans
80*1341Sstevel  * should the kernel thread controling the fans get
81*1341Sstevel  * wedged. If it does, the alarm wil go off and
82*1341Sstevel  * set the fans to max speed.
83*1341Sstevel  * Valid addresses for this chip are A0, A2.
84*1341Sstevel  * We use the address at A0.
85*1341Sstevel  * To address this chip the format is as folows (write mode)
86*1341Sstevel  * | SLaveaddress |MEMORY LOCATION| DATA|
87*1341Sstevel  * Wgere memory location is the internal location from
88*1341Sstevel  * 0x00 - 0x0F. 0x00 is the CSR and MUST be addressed
89*1341Sstevel  * directly.
90*1341Sstevel  */
91*1341Sstevel 
92*1341Sstevel #define	PCF8583_BASE_ADDR	0xA0
93*1341Sstevel #define	PCF8583_READ_BIT	0x01
94*1341Sstevel 
95*1341Sstevel #define	CLOCK_CSR_REG		0x00
96*1341Sstevel 
97*1341Sstevel #define	ALARM_CTRL_REG		0x07
98*1341Sstevel #define	EGG_TIMER_VAL		0x96
99*1341Sstevel #define	DIAG_MAX_TIMER_VAL	0x00
100*1341Sstevel #define	MAX_CL_VAL		59
101*1341Sstevel #define	MIN_DIAG_TEMPR		0x00
102*1341Sstevel #define	MAX_DIAG_TEMPR		70
103*1341Sstevel #define	MAX_AMB_TEMP		50
104*1341Sstevel #define	MAX_CPU_TEMP		80
105*1341Sstevel #define	MAX_PS_TEMP		100
106*1341Sstevel #define	MAX_PS_ADVAL		0xfd
107*1341Sstevel #define	PS_DEFAULT_VAL		17 /* corresponds to 90 C in lookup table */
108*1341Sstevel #define	PS_TEMP_WARN		95
109*1341Sstevel #define	CPU_AMB_RISE		20 /* cpu runs avg of 20 above amb */
110*1341Sstevel #define	PS_AMB_RISE		30 /* cpu runs avg of 30 above amb */
111*1341Sstevel 
112*1341Sstevel #define	CLOCK_ALARM_REG_A	0x08
113*1341Sstevel #define	CLOCK_ENABLE_TIMER	0xCB
114*1341Sstevel #define	CLOCK_ENABLE_TIMER_S	0xCA
115*1341Sstevel 
116*1341Sstevel #define	CLOCK_DISABLE		0xA0
117*1341Sstevel #define	CLOCK_ENABLE		0x04
118*1341Sstevel 
119*1341Sstevel /* Keyswitch Definitions */
120*1341Sstevel #define	ENVCTRL_FSP_KEYMASK	0xC0
121*1341Sstevel #define	ENVCTRL_FSP_POMASK	0x20
122*1341Sstevel #define	ENVCTRL_FSP_KEYLOCKED	0x00
123*1341Sstevel #define	ENVCTRL_FSP_KEYOFF	0x40
124*1341Sstevel #define	ENVCTRL_FSP_KEYDIAG	0x80
125*1341Sstevel #define	ENVCTRL_FSP_KEYON	0xC0
126*1341Sstevel 
127*1341Sstevel /* Front Status Panel Definitions */
128*1341Sstevel #define	ENVCTRL_FSP_DISK_ERR	0x01
129*1341Sstevel #define	ENVCTRL_FSP_PS_ERR	0x02
130*1341Sstevel #define	ENVCTRL_FSP_TEMP_ERR	0x04
131*1341Sstevel #define	ENVCTRL_FSP_GEN_ERR	0x08
132*1341Sstevel #define	ENVCTRL_FSP_ACTIVE	0x10
133*1341Sstevel #define	ENVCTRL_FSP_POWER	0x20
134*1341Sstevel #define	ENVCTRL_FSP_USRMASK	(ENVCTRL_FSP_DISK_ERR | ENVCTRL_FSP_GEN_ERR)
135*1341Sstevel 
136*1341Sstevel #define	ENVCTRL_ENCL_FSP	0x00
137*1341Sstevel #define	ENVCTRL_ENCL_AMBTEMPR	0x01
138*1341Sstevel #define	ENVCTRL_ENCL_CPUTEMPR	0x02
139*1341Sstevel #define	ENVCTRL_ENCL_BACKPLANE4	0x03
140*1341Sstevel #define	ENVCTRL_ENCL_BACKPLANE8	0x04
141*1341Sstevel 
142*1341Sstevel #define	ENVCTRL_FSP_OFF		0x4F
143*1341Sstevel 
144*1341Sstevel /*
145*1341Sstevel  * configuration registers
146*1341Sstevel  * Register S1 Looks like the following:
147*1341Sstevel  * WRITE MODE ONLY
148*1341Sstevel  *
149*1341Sstevel  * MSB -------------------------------------> LSB
150*1341Sstevel  * ----------------------------------------------
151*1341Sstevel  * | X | ESO | ES1 | ES2 | ENI | STA | STO | ACK |
152*1341Sstevel  * ----------------------------------------------
153*1341Sstevel  * Low order bits
154*1341Sstevel  */
155*1341Sstevel 
156*1341Sstevel #define	CSRS1_ENI	0x08	/* Enable interrupts */
157*1341Sstevel #define	CSRS1_STA	0x04	/* Packet Start */
158*1341Sstevel #define	CSRS1_STO	0x02	/* Packet Stop */
159*1341Sstevel #define	CSRS1_ACK	0x01	/* Packet ACK */
160*1341Sstevel 
161*1341Sstevel /* Hight order bits */
162*1341Sstevel #define	CSRS1_PIN	0x80	/* READ and WRITE mode Enable Serial Output */
163*1341Sstevel #define	CSRS1_ESO	0x40	/* Enable Serial Output */
164*1341Sstevel #define	CSRS1_ES1	0x20
165*1341Sstevel #define	CSRS1_ES2	0x10
166*1341Sstevel 
167*1341Sstevel /*
168*1341Sstevel  * configuration registers
169*1341Sstevel  * Register S1 Looks like the following:
170*1341Sstevel  * READ MODE ONLY
171*1341Sstevel  *
172*1341Sstevel  * MSB -------------------------------------> LSB
173*1341Sstevel  * ----------------------------------------------
174*1341Sstevel  * | PIN | 0 | STS | BER | AD0/LRB | AAS | LAB | BB|
175*1341Sstevel  * ----------------------------------------------
176*1341Sstevel  */
177*1341Sstevel 
178*1341Sstevel #define	CSRS1_STS	0x20	/* For Slave receiv mode stop */
179*1341Sstevel #define	CSRS1_BER	0x10	/* Bus Error */
180*1341Sstevel 
181*1341Sstevel #define	CSRS1_LRB	0x08	/*  Last Received Bit */
182*1341Sstevel #define	CSRS1_AAS	0x04	/*  Addressed as Slave */
183*1341Sstevel #define	CSRS1_LAB	0x02	/*  Lost Arbitration Bit */
184*1341Sstevel #define	CSRS1_BB	0x01	/* Bus Busy */
185*1341Sstevel 
186*1341Sstevel #define	START	CSRS1_PIN | CSRS1_ESO | CSRS1_STA | CSRS1_ACK
187*1341Sstevel #define	STOP	CSRS1_PIN | CSRS1_ESO | CSRS1_STO | CSRS1_ACK
188*1341Sstevel /*
189*1341Sstevel  * A read wants to have an NACK on the bus to stop
190*1341Sstevel  * transmitting data from the slave. If you don't
191*1341Sstevel  * NACK the SDA line will get stuck low. After this you
192*1341Sstevel  * can send the stop with the ack.
193*1341Sstevel  */
194*1341Sstevel #define	NACK	CSRS1_PIN | CSRS1_ESO
195*1341Sstevel 
196*1341Sstevel /*
197*1341Sstevel  * ESO = Enable Serial output
198*1341Sstevel  * ES1 and ES2 have different meanings based upon ES0.
199*1341Sstevel  * The following table explains this association.
200*1341Sstevel  *
201*1341Sstevel  * ES0 = 0 = serial interface off.
202*1341Sstevel  * ---------------------------------------------------------
203*1341Sstevel  * | A0 | ES1 | ES1 | iACK | OPERATION
204*1341Sstevel  * ---------------------------------------------------------
205*1341Sstevel  * | H  |  X  |  X  |  X   | Read/write CSR1 (S1) Status n/a
206*1341Sstevel  * |    |     |     |      |
207*1341Sstevel  * | L  |  0  |  0  |  X   | R/W Own Address S0'
208*1341Sstevel  * |    |     |     |      |
209*1341Sstevel  * | L  |  0  |  1  |  X   | R/W Intr Vector S3
210*1341Sstevel  * |    |     |     |      |
211*1341Sstevel  * | L  |  1  |  0  |  X   | R/W Clock Register S2
212*1341Sstevel  * ---------------------------------------------------------
213*1341Sstevel  *
214*1341Sstevel  * ES0 = 1 = serial interface ON.
215*1341Sstevel  * ---------------------------------------------------------
216*1341Sstevel  * | A0 | ES1 | ES1 | iACK | OPERATION
217*1341Sstevel  * ---------------------------------------------------------
218*1341Sstevel  * | H  |  X  |  X  |  H   | Write Control Register (S1)
219*1341Sstevel  * |    |     |     |      |
220*1341Sstevel  * | H  |  X  |  X  |  H   | Read Status Register (S1)
221*1341Sstevel  * |    |     |     |      |
222*1341Sstevel  * | L  |  X  |  0  |  H   | R/W Data Register (S0)
223*1341Sstevel  * |    |     |     |      |
224*1341Sstevel  * | L  |  X  |  1  |  H   | R/W Interrupt Vector (S3)
225*1341Sstevel  * |    |     |     |      |
226*1341Sstevel  * | X  |  0  |  X  |  L   | R Interrupt Vector (S3) ack cycle
227*1341Sstevel  * |    |     |     |      |
228*1341Sstevel  * | X  |  1  |  X  |  L   | long distance mode
229*1341Sstevel  * ---------------------------------------------------------
230*1341Sstevel  *
231*1341Sstevel  */
232*1341Sstevel 
233*1341Sstevel #ifdef TESTBED
234*1341Sstevel struct envctrl_pcd8584_regs {
235*1341Sstevel 	uchar_t s0;		/* Own Address S0' */
236*1341Sstevel 	uchar_t pad[3];		/* Padding XXX Will go away in FCS */
237*1341Sstevel 	uchar_t s1;		/* Control Status register */
238*1341Sstevel 	uchar_t pad1[3];
239*1341Sstevel 	uchar_t clock_s2;	/* Clock programming register */
240*1341Sstevel };
241*1341Sstevel #else
242*1341Sstevel struct envctrl_pcd8584_regs {
243*1341Sstevel 	uchar_t s0;		/* Own Address S0' */
244*1341Sstevel 	uchar_t s1;		/* Control Status register */
245*1341Sstevel 	uchar_t clock_s2;	/* Clock programming register */
246*1341Sstevel };
247*1341Sstevel #endif
248*1341Sstevel #define	ENVCTRL_BUS_INIT0	0x80
249*1341Sstevel #define	ENVCTRL_BUS_INIT1	0x55
250*1341Sstevel #define	ENVCTRL_BUS_CLOCK0	0xA0
251*1341Sstevel #define	ENVCTRL_BUS_CLOCK1	0x1C
252*1341Sstevel #define	ENVCTRL_BUS_ESI		0xC1
253*1341Sstevel 
254*1341Sstevel 
255*1341Sstevel /*
256*1341Sstevel  * PCF8591 Chip Used for temperature sensors
257*1341Sstevel  *
258*1341Sstevel  * Check with bob to see if singled ended inputs are true
259*1341Sstevel  * for the pcf8591 temp sensors..
260*1341Sstevel  *
261*1341Sstevel  * Addressing Register definition.
262*1341Sstevel  * A0-A2 valid range is 0-7
263*1341Sstevel  *
264*1341Sstevel  *  7    6  5   4    3     2     1      0
265*1341Sstevel  * ------------------------------------------------
266*1341Sstevel  * | 1 | 0 | 0 | 1 | A2 | A1 | A0 | R/W |
267*1341Sstevel  * ------------------------------------------------
268*1341Sstevel  */
269*1341Sstevel 
270*1341Sstevel 
271*1341Sstevel #define	PCF8591_BASE_ADDR	0x90
272*1341Sstevel #define	PCF8501_MAX_DEVS	0x08
273*1341Sstevel 
274*1341Sstevel #define	MAXPS 0x02	/* 0 based array */
275*1341Sstevel 
276*1341Sstevel #define	PSTEMP0		0x00	/* DUMMY PS */
277*1341Sstevel #define	PSTEMP1		0x94
278*1341Sstevel #define	PSTEMP2		0x92
279*1341Sstevel #define	PSTEMP3		0x90
280*1341Sstevel #define	ENVCTRL_CPU_PCF8591_ADDR (PCF8591_BASE_ADDR | PCF8591_DEV7)
281*1341Sstevel 
282*1341Sstevel #define	PCF8591_DEV0	0x00
283*1341Sstevel #define	PCF8591_DEV1	0x02
284*1341Sstevel #define	PCF8591_DEV2	0x04
285*1341Sstevel #define	PCF8591_DEV3	0x06
286*1341Sstevel #define	PCF8591_DEV4	0x08
287*1341Sstevel #define	PCF8591_DEV5	0x0A
288*1341Sstevel #define	PCF8591_DEV6    0x0C
289*1341Sstevel #define	PCF8591_DEV7	0x0E
290*1341Sstevel 
291*1341Sstevel 
292*1341Sstevel /*
293*1341Sstevel  * For the LM75 thermal watchdog chip by TI
294*1341Sstevel  */
295*1341Sstevel 
296*1341Sstevel #define	LM75_BASE_ADDR		0x9A
297*1341Sstevel #define	LM75_READ_BIT		0x01
298*1341Sstevel #define	LM75_CONFIG_ADDR2	0x02
299*1341Sstevel #define	LM75_CONFIG_ADDR4	0x04
300*1341Sstevel #define	LM75_CONFIG_ADDR6	0x06
301*1341Sstevel #define	LM75_CONFIG_ADDR8	0x08
302*1341Sstevel #define	LM75_CONFIG_ADDRA	0x0A
303*1341Sstevel #define	LM75_CONFIG_ADDRC	0x0C
304*1341Sstevel #define	LM75_CONFIG_ADDRE	0x0E
305*1341Sstevel #define	LM75_COMP_MASK		0x100
306*1341Sstevel #define	LM75_COMP_MASK_UPPER	0xFF
307*1341Sstevel 
308*1341Sstevel /*
309*1341Sstevel  * 		CONTROL OF CHIP
310*1341Sstevel  * PCF8591 Temp sensing control register definitions
311*1341Sstevel  *
312*1341Sstevel  *   7      6     5   4  3   2      1   0
313*1341Sstevel  * ---------------------------------------------
314*1341Sstevel  * | 0 | AOE | X | X | 0 | AIF | X | X |
315*1341Sstevel  * ---------------------------------------------
316*1341Sstevel  * AOE = Analog out enable.. not used on out implementation
317*1341Sstevel  * 5 & 4 = Analog Input Programming.. see data sheet for bits..
318*1341Sstevel  *
319*1341Sstevel  * AIF = Auto increment flag
320*1341Sstevel  * bits 1 & 0 are for the Chennel number.
321*1341Sstevel  */
322*1341Sstevel 
323*1341Sstevel #define	PCF8591_ANALOG_OUTPUT_EN	0x40
324*1341Sstevel #define	PCF8591_ANALOG_INPUT_EN		0x00
325*1341Sstevel #define	PCF8591_READ_BIT		0x01
326*1341Sstevel 
327*1341Sstevel 
328*1341Sstevel #define	PCF8591_AUTO_INCR 0x04
329*1341Sstevel #define	PCF8591_OSCILATOR 0x40
330*1341Sstevel 
331*1341Sstevel #define	PCF8591_MAX_PORTS	0x04
332*1341Sstevel 
333*1341Sstevel #define	PCF8591_CH_0	0x00
334*1341Sstevel #define	PCF8591_CH_1	0x01
335*1341Sstevel #define	PCF8591_CH_2	0x02
336*1341Sstevel #define	PCF8591_CH_3	0x03
337*1341Sstevel 
338*1341Sstevel struct envctrl_pcf8591_chip {
339*1341Sstevel 	uchar_t chip_num;		/* valid values are 0-7 */
340*1341Sstevel 	int type;			/* type is PCF8591 */
341*1341Sstevel 	uchar_t	sensor_num;		/* AIN0, AIN1, AIN2 AIN3 */
342*1341Sstevel 	uchar_t	temp_val;		/* value of temp probe */
343*1341Sstevel };
344*1341Sstevel 
345*1341Sstevel 
346*1341Sstevel /*
347*1341Sstevel  * PCF8574 Fan Fail, Power Supply Fail Detector
348*1341Sstevel  * This device is driven by interrupts. Each time it interrupts
349*1341Sstevel  * you must look at the CSR to see which ports caused the interrupt
350*1341Sstevel  * they are indicated by a 1.
351*1341Sstevel  *
352*1341Sstevel  * Address map of this chip
353*1341Sstevel  *
354*1341Sstevel  * -------------------------------------------
355*1341Sstevel  * | 0 | 1 | 1 | 1 | A2 | A1 | A0 | 0 |
356*1341Sstevel  * -------------------------------------------
357*1341Sstevel  *
358*1341Sstevel  */
359*1341Sstevel 
360*1341Sstevel #define	PCF8574A_BASE_ADDR	0x70
361*1341Sstevel #define	PCF8574_BASE_ADDR	0x40
362*1341Sstevel 
363*1341Sstevel #define	PCF8574_READ_BIT	0x01
364*1341Sstevel 
365*1341Sstevel #define	ENVCTRL_PCF8574_DEV0		0x00
366*1341Sstevel #define	ENVCTRL_PCF8574_DEV1		0x02
367*1341Sstevel #define	ENVCTRL_PCF8574_DEV2		0x04
368*1341Sstevel #define	ENVCTRL_PCF8574_DEV3		0x06
369*1341Sstevel #define	ENVCTRL_PCF8574_DEV4		0x08
370*1341Sstevel #define	ENVCTRL_PCF8574_DEV5		0x0A
371*1341Sstevel #define	ENVCTRL_PCF8574_DEV6		0x0C
372*1341Sstevel #define	ENVCTRL_PCF8574_DEV7		0x0E
373*1341Sstevel #define	ENVCTRL_INTR_CHIP	PCF8574_DEV7
374*1341Sstevel 
375*1341Sstevel #define	PS1	PCF8574A_BASE_ADDR | ENVCTRL_PCF8574_DEV3
376*1341Sstevel #define	PS2	PCF8574A_BASE_ADDR | ENVCTRL_PCF8574_DEV2
377*1341Sstevel #define	PS3	PCF8574A_BASE_ADDR | ENVCTRL_PCF8574_DEV1
378*1341Sstevel 
379*1341Sstevel #define	ENVCTRL_PCF8574_PORT0	0x01
380*1341Sstevel #define	ENVCTRL_PCF8574_PORT1	0x02
381*1341Sstevel #define	ENVCTRL_PCF8574_PORT2	0x04
382*1341Sstevel #define	ENVCTRL_PCF8574_PORT3	0x08
383*1341Sstevel #define	ENVCTRL_PCF8574_PORT4	0x10
384*1341Sstevel #define	ENVCTRL_PCF8574_PORT5	0x20
385*1341Sstevel #define	ENVCTRL_PCF8574_PORT6	0x40
386*1341Sstevel #define	ENVCTRL_PCF8574_PORT7	0x80
387*1341Sstevel 
388*1341Sstevel #define	ENVCTRL_DFLOP_INIT0	0x77
389*1341Sstevel #define	ENVCTRL_DFLOP_INIT1	0x7F
390*1341Sstevel 
391*1341Sstevel #define	ENVCTRL_DEVINTR_INTI0	0xF7
392*1341Sstevel #define	ENVCTRL_DEVINTR_INTI1	0xFF
393*1341Sstevel 
394*1341Sstevel #define	CPU_FAN_1		0x01
395*1341Sstevel #define	CPU_FAN_2		0x02
396*1341Sstevel #define	CPU_FAN_3		0x03
397*1341Sstevel 
398*1341Sstevel #define	PS_FAN_1		CPU_FAN_1
399*1341Sstevel #define	PS_FAN_2		CPU_FAN_2
400*1341Sstevel #define	PS_FAN_3		CPU_FAN_3
401*1341Sstevel 
402*1341Sstevel #define	AFB_FAN_1		0x00
403*1341Sstevel 
404*1341Sstevel struct envctrl_pcf8574_chip {
405*1341Sstevel 	uchar_t chip_num;		/* valid values are 0-7 */
406*1341Sstevel 	int type;			/* type is PCF8574 */
407*1341Sstevel 	uint_t	val;
408*1341Sstevel };
409*1341Sstevel 
410*1341Sstevel 
411*1341Sstevel /*
412*1341Sstevel  * TDA8444T chip structure
413*1341Sstevel  * FAN Speed Control
414*1341Sstevel  */
415*1341Sstevel 
416*1341Sstevel /* ADDRESSING */
417*1341Sstevel 
418*1341Sstevel #define	TDA8444T_BASE_ADDR	0x40
419*1341Sstevel 
420*1341Sstevel 
421*1341Sstevel #define	ENVCTRL_TDA8444T_DEV0	0x00
422*1341Sstevel #define	ENVCTRL_TDA8444T_DEV1	0x02
423*1341Sstevel #define	ENVCTRL_TDA8444T_DEV2	0x04
424*1341Sstevel #define	ENVCTRL_TDA8444T_DEV3	0x06
425*1341Sstevel #define	ENVCTRL_TDA8444T_DEV4	0x08
426*1341Sstevel #define	ENVCTRL_TDA8444T_DEV5	0x0A
427*1341Sstevel #define	ENVCTRL_TDA8444T_DEV6	0x0C
428*1341Sstevel #define	ENVCTRL_TDA8444T_DEV7	0x0E
429*1341Sstevel 
430*1341Sstevel #define	ENVCTRL_FAN_ADDR_MIN	ENVCTRL_TDA8444T_DEV0
431*1341Sstevel #define	ENVCTRL_FAN_ADDR_MAX	ENVCTRL_TDA8444T_DEV7
432*1341Sstevel 
433*1341Sstevel /* Control information and port addressing */
434*1341Sstevel 
435*1341Sstevel #define	NO_AUTO_PORT_INCR	0xF0
436*1341Sstevel #define	AUTO_PORT_INCR		0x00
437*1341Sstevel #define	TDA8444T_READ_BIT	0x01
438*1341Sstevel 
439*1341Sstevel #define	ENVCTRL_CPU_FANS	0x00
440*1341Sstevel #define	ENVCTRL_PS_FANS		0x01
441*1341Sstevel #define	ENVCTRL_AFB_FANS	0x02
442*1341Sstevel 
443*1341Sstevel #define	MAX_FAN_SPEED	0x3f
444*1341Sstevel #define	MIN_FAN_VAL	0x00
445*1341Sstevel #define	MAX_FAN_VAL	0x3f
446*1341Sstevel #define	AFB_MAX		0x3f
447*1341Sstevel #define	AFB_MIN		0x1d
448*1341Sstevel 
449*1341Sstevel struct envctrl_tda8444t_chip {
450*1341Sstevel 	uchar_t chip_num;		/* valid values are 0-7 */
451*1341Sstevel 	int type;			/* type is TDA8444T */
452*1341Sstevel 	uchar_t	fan_num;		/* Ao0-Ao7 */
453*1341Sstevel 	uchar_t	val;			/* for fan speed */
454*1341Sstevel };
455*1341Sstevel 
456*1341Sstevel /*
457*1341Sstevel  * This table converts an A/D value from the cpu thermistor to a
458*1341Sstevel  * temperature in degrees C. Usable range is typically 35-135.
459*1341Sstevel  */
460*1341Sstevel 
461*1341Sstevel static short cpu_temps[] = {
462*1341Sstevel 150,	150,	150,	150,	150,	150,	150,	150,	/* 0-7 */
463*1341Sstevel 150,	150,	150,	150,	150,	150,	150,	150,	/* 8-15 */
464*1341Sstevel 150,	150,	150,	150,	150,	150,	150,	150,	/* 16-23 */
465*1341Sstevel 150,	150,	150,	148,	146,	144,	143,	142,	/* 24-31 */
466*1341Sstevel 141,	140,	138,	136,	135,	134,	133,	132,	/* 32-39 */
467*1341Sstevel 131,	130,	129,	128,	127,	126,	125,	124,	/* 40-47 */
468*1341Sstevel 123,	122,	121,	121,	120,	120,	119,	118,	/* 48-55 */
469*1341Sstevel 117,	116,	115,	114,	113,	112,	112,	111,	/* 56-63 */
470*1341Sstevel 111,	110,	110,	110,	109,	109,	108,	107,	/* 64-71 */
471*1341Sstevel 106,	106,	105,	105,	104,	103,	102,	101,	/* 72-79 */
472*1341Sstevel 101,	100,	100,	100,	99,	99,	98,	98,	/* 80-87 */
473*1341Sstevel 97,	97,	96,	96,	95,	95,	94,	94,	/* 88-95 */
474*1341Sstevel 93,	93,	92,	92,	91,	91,	91,	90,	/* 96-103 */
475*1341Sstevel 90,	90,	89,	89,	88,	88,	87,	87,	/* 104-111 */
476*1341Sstevel 86,	86,	85,	85,	84,	84,	83,	83,	/* 112-119 */
477*1341Sstevel 82,	82,	82,	81,	81,	80,	80,	80,	/* 120-127 */
478*1341Sstevel 80,	79,	79,	79,	78,	78,	78,	77,	/* 128-135 */
479*1341Sstevel 77,	77,	76,	76,	76,	75,	75,	75,	/* 136-143 */
480*1341Sstevel 74,	74,	74,	73,	73,	73,	72,	72,	/* 144-151 */
481*1341Sstevel 72,	71,	71,	71,	70,	70,	70,	70,	/* 142-159 */
482*1341Sstevel 69,	69,	69,	68,	68,	68,	68,	67,	/* 160-167 */
483*1341Sstevel 67,	67,	67,	66,	66,	66,	66,	65,	/* 168-175 */
484*1341Sstevel 65,	65,	64,	64,	64,	63,	63,	63,	/* 176-183 */
485*1341Sstevel 62,	62,	62,	61,	61,	61,	61,	60,	/* 184-191 */
486*1341Sstevel 60,	60,	60,	59,	59,	59,	58,	58,	/* 192-199 */
487*1341Sstevel 58,	57,	57,	57,	56,	56,	56,	56,	/* 200-207 */
488*1341Sstevel 55,	55,	55,	55,	54,	54,	54,	53,	/* 208-215 */
489*1341Sstevel 53,	53,	52,	52,	52,	51,	51,	51,	/* 216-223 */
490*1341Sstevel 51,	50,	50,	50,	49,	49,	49,	48,	/* 224-231 */
491*1341Sstevel 48,	48,	47,	47,	47,	46,	46,	46,	/* 232-239 */
492*1341Sstevel 45,	45,	45,	44,	44,	44,	43,	43,	/* 240-247 */
493*1341Sstevel 43,	42,	42,	42,	41,	41,	41,	40,	/* 248-255 */
494*1341Sstevel 40,								/* 256 */
495*1341Sstevel };
496*1341Sstevel 
497*1341Sstevel static short ps_temps[] = {
498*1341Sstevel 160,	155,	154,	150,	130,	125,	120,	115,	/* 0-7 */
499*1341Sstevel 110,	110,	106,	103,	101,	100,	97,	94,	/* 8-15 */
500*1341Sstevel 92,	90,	88,	86,	84,	83,	82,	81,	/* 16-23 */
501*1341Sstevel 80,	79,	78,	77,	76,	74,	72,	71,	/* 24-31 */
502*1341Sstevel 70,	69,	68,	67,	66,	65,	64,	63,	/* 32-39 */
503*1341Sstevel 62,	62,	61,	61,	60,	60,	60,	59,	/* 40-47 */
504*1341Sstevel 59,	58,	58,	57,	56,	56,	55,	55,	/* 48-55 */
505*1341Sstevel 54,	54,	53,	53,	52,	52,	51,	51,	/* 56-63 */
506*1341Sstevel 50,	50,	50,	49,	49,	49,	49,	48,	/* 64-71 */
507*1341Sstevel 48,	48,	48,	47,	47,	47,	47,	46,	/* 72-79 */
508*1341Sstevel 46,	46,	45,	44,	43,	42,	41,	41,	/* 80-87 */
509*1341Sstevel 40,	40,	40,	40,	39,	39,	39,	38,	/* 88-95 */
510*1341Sstevel 38,	38,	37,	37,	36,	36,	36,	35,	/* 96-103 */
511*1341Sstevel 35,	35,	35,	34,	34,	34,	33,	33,	/* 104-111 */
512*1341Sstevel 32,	32,	32,	32,	32,	32,	31,	31,	/* 112-119 */
513*1341Sstevel 31,	31,	31,	30,	30,	30,	29,	29,	/* 120-127 */
514*1341Sstevel 29,	29,	29,	29,	28,	28,	28,	28,	/* 128-135 */
515*1341Sstevel 28,	28,	27,	27,	27,	27,	27,	26,	/* 136-143 */
516*1341Sstevel 26,	26,	26,	26,	26,	26,	26,	26,	/* 144-151 */
517*1341Sstevel 25,	25,	25,	25,	24,	24,	23,	23,	/* 142-159 */
518*1341Sstevel 22,	22,	21,	21,	21,	21,	21,	21,	/* 160-167 */
519*1341Sstevel 20,	20,	20,	20,	19,	19,	19,	19,	/* 168-175 */
520*1341Sstevel 19,	18,	18,	18,	18,	18,	17,	17,	/* 176-183 */
521*1341Sstevel 17,	17,	17,	16,	16,	16,	16,	15,	/* 184-191 */
522*1341Sstevel 15,	15,	15,	15,	15,	14,	14,	14,	/* 192-199 */
523*1341Sstevel 14,	14,	13,	13,	13,	13,	12,	12,	/* 200-207 */
524*1341Sstevel 12,	12,	12,	11,	11,	11,	11,	11,	/* 208-215 */
525*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 216-223 */
526*1341Sstevel 9,	9,	9,	9,	9,	9,	8,	8,	/* 224-231 */
527*1341Sstevel 8,	8,	8,	7,	7,	7,	7,	7,	/* 232-239 */
528*1341Sstevel 7,	6,	6,	6,	6,	6,	6,	6,	/* 240-247 */
529*1341Sstevel 5,	5,	5,	5,	5,	5,	5,	4,	/* 248-255 */
530*1341Sstevel 4,								/* 256 */
531*1341Sstevel };
532*1341Sstevel 
533*1341Sstevel /*
534*1341Sstevel  * This is the lookup table used for P1 and FCS systems to convert a temperature
535*1341Sstevel  * to a fanspeed for the CPU side of the machine.
536*1341Sstevel  */
537*1341Sstevel 
538*1341Sstevel static short acme_cpu_fanspd[] = {
539*1341Sstevel 31,	31,	31,	31,	31,	31,	31,	31,	/* 0-7 */
540*1341Sstevel 31,	31,	31,	31,	31,	31,	31,	31,	/* 8-15 */
541*1341Sstevel 31,	31,	31,	31,	31,	31,	31,	31,	/* 16-23 */
542*1341Sstevel 31,	31,	31,	31,	32,	33,	34,	35,	/* 24-31 */
543*1341Sstevel 36,	37,	38,	39,	40,	42,	43,	45,	/* 32-39 */
544*1341Sstevel 48,	49,	50,	51,	52,	53,	54,	55,	/* 40-47 */
545*1341Sstevel 56,	57,	58,	59,	60,	61,	62,	63,	/* 48-55 */
546*1341Sstevel 63,	63,	63,	63,	63,	63,	63,	63,	/* 56-63 */
547*1341Sstevel 63,	63,	63,	63,	63,	63,	63,	63,	/* 64-71 */
548*1341Sstevel 63,	63,	63,	63,	63,	63,	63,	63,	/* 72-79 */
549*1341Sstevel 63,	63,	63,	63,	63,	63,	63,	63,	/* 80-87 */
550*1341Sstevel 63,	63,	63,	63,	63,	63,	63,	63,	/* 88-95 */
551*1341Sstevel 63,	63,	63,	63,	63,	63,	63,	63,	/* 96-103 */
552*1341Sstevel 63,	63,	63,	63,	63,	63,	63,	63,	/* 104-111 */
553*1341Sstevel };
554*1341Sstevel 
555*1341Sstevel /*
556*1341Sstevel  * This is the lookup table used for P1 and FCS systems to convert a temperature
557*1341Sstevel  * to a fanspeed for the CPU side of the machine.
558*1341Sstevel  */
559*1341Sstevel 
560*1341Sstevel static short acme_ps_fanspd[] = {
561*1341Sstevel 31,	31,	31,	31,	31,	31,	31,	31,	/* 0-7 */
562*1341Sstevel 31,	31,	31,	31,	31,	31,	31,	31,	/* 8-15 */
563*1341Sstevel 31,	31,	31,	31,	31,	31,	31,	31,	/* 16-23 */
564*1341Sstevel 31,	31,	31,	31,	31,	33,	34,	35,	/* 24-31 */
565*1341Sstevel 36,	37,	38,	38,	39,	40,	41,	42,	/* 32-39 */
566*1341Sstevel 43,	45,	46,	47,	48,	48,	48,	48,	/* 40-47 */
567*1341Sstevel 48,	48,	49,	50,	51,	52,	53,	54,	/* 48-55 */
568*1341Sstevel 55,	56,	57,	58,	59,	60,	61,	62,	/* 56-63 */
569*1341Sstevel 63,	63,	63,	63,	63,	63,	63,	63,	/* 64-71 */
570*1341Sstevel 63,	63,	63,	63,	63,	63,	63,	63,	/* 72-79 */
571*1341Sstevel 63,	63,	63,	63,	63,	63,	63,	63,	/* 80-87 */
572*1341Sstevel 63,	63,	63,	63,	63,	63,	63,	63,	/* 88-95 */
573*1341Sstevel 63,	63,	63,	63,	63,	63,	63,	63,	/* 96-103 */
574*1341Sstevel 63,	63,	63,	63,	63,	63,	63,	63,	/* 104-111 */
575*1341Sstevel };
576*1341Sstevel 
577*1341Sstevel static short ps_fans[] = {
578*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 0-7 */
579*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 8-15 */
580*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 16-23 */
581*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 24-31 */
582*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 32-39 */
583*1341Sstevel 11,	12,	13,	14,	15,	16,	17,	18,	/* 24-31 */
584*1341Sstevel 19,	20,	21,	22,	23,	24,	25,	26,	/* 32-39 */
585*1341Sstevel 27,	28,	29,	30,	31,	32,	33,	34,	/* 40-47 */
586*1341Sstevel 35,	36,	37,	38,	39,	40,	41,	42,	/* 48-55 */
587*1341Sstevel 43,	44,	45,	46,	47,	48,	49,	50,	/* 56-63 */
588*1341Sstevel 50,	50,	50,	50,	50,	50,	50,	50,	/* 56-63 */
589*1341Sstevel 13,	12,	11,	10,	10,	10,	10,	10,	/* 64-71 */
590*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
591*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
592*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
593*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
594*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
595*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
596*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
597*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
598*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
599*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
600*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
601*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
602*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
603*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
604*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
605*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
606*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
607*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
608*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
609*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
610*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
611*1341Sstevel 10,	10,	10,	10,	10,	10,	10,	10,	/* 72-79 */
612*1341Sstevel 10,
613*1341Sstevel };
614*1341Sstevel 
615*1341Sstevel /*
616*1341Sstevel  * Get a fan speed setting based upon a temperature value
617*1341Sstevel  * from the above lookup tables.
618*1341Sstevel  * Less than zero ia a special case and greater than 70 is a
619*1341Sstevel  * the operating range of the powersupply. The system operating
620*1341Sstevel  * range is 5 - 40 Degrees C.
621*1341Sstevel  * This may need some tuning.
622*1341Sstevel  * The MAX_CPU_TEMP is set to 80 now, this table is used to set their
623*1341Sstevel  * fans.
624*1341Sstevel  */
625*1341Sstevel static short fan_speed[] = {
626*1341Sstevel 30,	29,	28,	27,	26,	25,	24,	23,	/* 0-7 */
627*1341Sstevel 23,	23,	23,	23,	22,	21,	20,	20,	/* 8-15 */
628*1341Sstevel 20,	20,	20,	20,	20,	20,	20,	20,	/* 16-23 */
629*1341Sstevel 19,	18,	17,	16,	15,	14,	13,	12,	/* 24-31 */
630*1341Sstevel 11,	11,	11,	11,	11,	11,	11,	11,	/* 32-39 */
631*1341Sstevel 11,	11,	11,	10,	10,	10,	9,	8,	/* 40-47 */
632*1341Sstevel 7,	6,	5,	4,	3,	2,	1,	1,	/* 48-55 */
633*1341Sstevel 1,	1,	1,	1,	1,	1,	1,	1,	/* 56-63 */
634*1341Sstevel 1,	1,	1,	1,	1,	1,	1,	1,	/* 64-71 */
635*1341Sstevel 1,	1,	1,	1,	1,	1,	1,	1,	/* 72-79 */
636*1341Sstevel 1,	1,	1,	1,	1,	1,	1,	1,	/* 80-87 */
637*1341Sstevel };
638*1341Sstevel 
639*1341Sstevel 
640*1341Sstevel #if defined(_KERNEL)
641*1341Sstevel 
642*1341Sstevel struct envctrlunit {
643*1341Sstevel 	struct envctrl_pcd8584_regs *bus_ctl_regs;
644*1341Sstevel 	ddi_acc_handle_t ctlr_handle;
645*1341Sstevel 	kmutex_t umutex;			/* lock for this structure */
646*1341Sstevel 	int instance;
647*1341Sstevel 	dev_info_t *dip;			/* device information */
648*1341Sstevel 	struct envctrl_ps ps_kstats[MAX_DEVS];	/* kstats for powersupplies */
649*1341Sstevel 	struct envctrl_fan fan_kstats[MAX_DEVS]; /* kstats for fans */
650*1341Sstevel 	struct envctrl_encl encl_kstats[MAX_DEVS]; /* kstats for enclosure */
651*1341Sstevel 	int cpu_pr_location[ENVCTRL_MAX_CPUS]; /* slot true if cpu present */
652*1341Sstevel 	uint_t num_fans_present;
653*1341Sstevel 	uint_t num_ps_present;
654*1341Sstevel 	uint_t num_encl_present;
655*1341Sstevel 	uint_t num_cpus_present;
656*1341Sstevel 	kstat_t *psksp;
657*1341Sstevel 	kstat_t *fanksp;
658*1341Sstevel 	kstat_t *enclksp;
659*1341Sstevel 	ddi_iblock_cookie_t ic_trap_cookie;	/* interrupt cookie */
660*1341Sstevel 	queue_t		*readq;		/* pointer to readq */
661*1341Sstevel 	queue_t		*writeq;	/* pointer to writeq */
662*1341Sstevel 	mblk_t	*msg;			/* current message block */
663*1341Sstevel 	/*  CPR support */
664*1341Sstevel 	boolean_t suspended;			/* TRUE if driver suspended */
665*1341Sstevel 	boolean_t oflag;			/*  already open */
666*1341Sstevel 	int current_mode;			/* NORMAL or DIAG_MODE */
667*1341Sstevel 	int AFB_present;			/* is the AFB present */
668*1341Sstevel 	timeout_id_t timeout_id;				/* timeout id */
669*1341Sstevel 	timeout_id_t pshotplug_id;			/* ps poll id */
670*1341Sstevel 	int ps_present[MAXPS+1];		/* PS present t/f 0 not used */
671*1341Sstevel 	int num_fans_failed;	/* don't change fan speed if > 0 */
672*1341Sstevel 	int activity_led_blink;
673*1341Sstevel 	int present_led_state; /* is it on or off?? */
674*1341Sstevel 	timeout_id_t blink_timeout_id;
675*1341Sstevel 	int initting; /* 1 is TRUE , 0 is FALSE , used to mask intrs */
676*1341Sstevel 	boolean_t shutdown; /* TRUE = power off in error event */
677*1341Sstevel 
678*1341Sstevel };
679*1341Sstevel 
680*1341Sstevel #endif	/* _KERNEL */
681*1341Sstevel 
682*1341Sstevel #ifdef	__cplusplus
683*1341Sstevel }
684*1341Sstevel #endif
685*1341Sstevel 
686*1341Sstevel #endif	/* _SYS_ENVCTRL_UE450_H */
687