#ifndef _SYS_ENVCTRL_UE450_H
#define _SYS_ENVCTRL_UE450_H
#pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus
extern "C" {
#endif
#define OVERTEMP_TIMEOUT_USEC 60 * MICROSEC
#define BLINK_TIMEOUT_USEC 500 * (MICROSEC / MILLISEC)
#define MAX_TAZ_CONTROLLERS 0x02
#define ENVCTRL_TAZCPU_STRING "SUNW,UltraSPARC"
#define ENVCTRL_TAZBLKBRDCPU_STRING "SUNW,UltraSPARC-II"
#define S1 &unitp->bus_ctl_regs->s1
#define S0 &unitp->bus_ctl_regs->s0
#define PCD8584 0x00
#define PCF8591 0x01
#define PCF8574 0x02
#define TDA8444T 0x03
#define PCF8574A 0x04
#define PCF8583 0x05
#define MAX_DEVS 0x10
#define I2C_NODEV 0xFF
#define MIN_FAN_BANKS 0x02
#define INSTANCE_0 0x00
#define PCF8583_BASE_ADDR 0xA0
#define PCF8583_READ_BIT 0x01
#define CLOCK_CSR_REG 0x00
#define ALARM_CTRL_REG 0x07
#define EGG_TIMER_VAL 0x96
#define DIAG_MAX_TIMER_VAL 0x00
#define MAX_CL_VAL 59
#define MIN_DIAG_TEMPR 0x00
#define MAX_DIAG_TEMPR 70
#define MAX_AMB_TEMP 50
#define MAX_CPU_TEMP 80
#define MAX_PS_TEMP 100
#define MAX_PS_ADVAL 0xfd
#define PS_DEFAULT_VAL 17
#define PS_TEMP_WARN 95
#define CPU_AMB_RISE 20
#define PS_AMB_RISE 30
#define CLOCK_ALARM_REG_A 0x08
#define CLOCK_ENABLE_TIMER 0xCB
#define CLOCK_ENABLE_TIMER_S 0xCA
#define CLOCK_DISABLE 0xA0
#define CLOCK_ENABLE 0x04
#define ENVCTRL_FSP_KEYMASK 0xC0
#define ENVCTRL_FSP_POMASK 0x20
#define ENVCTRL_FSP_KEYLOCKED 0x00
#define ENVCTRL_FSP_KEYOFF 0x40
#define ENVCTRL_FSP_KEYDIAG 0x80
#define ENVCTRL_FSP_KEYON 0xC0
#define ENVCTRL_FSP_DISK_ERR 0x01
#define ENVCTRL_FSP_PS_ERR 0x02
#define ENVCTRL_FSP_TEMP_ERR 0x04
#define ENVCTRL_FSP_GEN_ERR 0x08
#define ENVCTRL_FSP_ACTIVE 0x10
#define ENVCTRL_FSP_POWER 0x20
#define ENVCTRL_FSP_USRMASK (ENVCTRL_FSP_DISK_ERR | ENVCTRL_FSP_GEN_ERR)
#define ENVCTRL_ENCL_FSP 0x00
#define ENVCTRL_ENCL_AMBTEMPR 0x01
#define ENVCTRL_ENCL_CPUTEMPR 0x02
#define ENVCTRL_ENCL_BACKPLANE4 0x03
#define ENVCTRL_ENCL_BACKPLANE8 0x04
#define ENVCTRL_FSP_OFF 0x4F
#define CSRS1_ENI 0x08
#define CSRS1_STA 0x04
#define CSRS1_STO 0x02
#define CSRS1_ACK 0x01
#define CSRS1_PIN 0x80
#define CSRS1_ESO 0x40
#define CSRS1_ES1 0x20
#define CSRS1_ES2 0x10
#define CSRS1_STS 0x20
#define CSRS1_BER 0x10
#define CSRS1_LRB 0x08
#define CSRS1_AAS 0x04
#define CSRS1_LAB 0x02
#define CSRS1_BB 0x01
#define START CSRS1_PIN | CSRS1_ESO | CSRS1_STA | CSRS1_ACK
#define STOP CSRS1_PIN | CSRS1_ESO | CSRS1_STO | CSRS1_ACK
#define NACK CSRS1_PIN | CSRS1_ESO
#ifdef TESTBED
struct envctrl_pcd8584_regs {
uchar_t s0;
uchar_t pad[3];
uchar_t s1;
uchar_t pad1[3];
uchar_t clock_s2;
};
#else
struct envctrl_pcd8584_regs {
uchar_t s0;
uchar_t s1;
uchar_t clock_s2;
};
#endif
#define ENVCTRL_BUS_INIT0 0x80
#define ENVCTRL_BUS_INIT1 0x55
#define ENVCTRL_BUS_CLOCK0 0xA0
#define ENVCTRL_BUS_CLOCK1 0x1C
#define ENVCTRL_BUS_ESI 0xC1
#define PCF8591_BASE_ADDR 0x90
#define PCF8501_MAX_DEVS 0x08
#define MAXPS 0x02
#define PSTEMP0 0x00
#define PSTEMP1 0x94
#define PSTEMP2 0x92
#define PSTEMP3 0x90
#define ENVCTRL_CPU_PCF8591_ADDR (PCF8591_BASE_ADDR | PCF8591_DEV7)
#define PCF8591_DEV0 0x00
#define PCF8591_DEV1 0x02
#define PCF8591_DEV2 0x04
#define PCF8591_DEV3 0x06
#define PCF8591_DEV4 0x08
#define PCF8591_DEV5 0x0A
#define PCF8591_DEV6 0x0C
#define PCF8591_DEV7 0x0E
#define LM75_BASE_ADDR 0x9A
#define LM75_READ_BIT 0x01
#define LM75_CONFIG_ADDR2 0x02
#define LM75_CONFIG_ADDR4 0x04
#define LM75_CONFIG_ADDR6 0x06
#define LM75_CONFIG_ADDR8 0x08
#define LM75_CONFIG_ADDRA 0x0A
#define LM75_CONFIG_ADDRC 0x0C
#define LM75_CONFIG_ADDRE 0x0E
#define LM75_COMP_MASK 0x100
#define LM75_COMP_MASK_UPPER 0xFF
#define PCF8591_ANALOG_OUTPUT_EN 0x40
#define PCF8591_ANALOG_INPUT_EN 0x00
#define PCF8591_READ_BIT 0x01
#define PCF8591_AUTO_INCR 0x04
#define PCF8591_OSCILATOR 0x40
#define PCF8591_MAX_PORTS 0x04
#define PCF8591_CH_0 0x00
#define PCF8591_CH_1 0x01
#define PCF8591_CH_2 0x02
#define PCF8591_CH_3 0x03
struct envctrl_pcf8591_chip {
uchar_t chip_num;
int type;
uchar_t sensor_num;
uchar_t temp_val;
};
#define PCF8574A_BASE_ADDR 0x70
#define PCF8574_BASE_ADDR 0x40
#define PCF8574_READ_BIT 0x01
#define ENVCTRL_PCF8574_DEV0 0x00
#define ENVCTRL_PCF8574_DEV1 0x02
#define ENVCTRL_PCF8574_DEV2 0x04
#define ENVCTRL_PCF8574_DEV3 0x06
#define ENVCTRL_PCF8574_DEV4 0x08
#define ENVCTRL_PCF8574_DEV5 0x0A
#define ENVCTRL_PCF8574_DEV6 0x0C
#define ENVCTRL_PCF8574_DEV7 0x0E
#define ENVCTRL_INTR_CHIP PCF8574_DEV7
#define PS1 PCF8574A_BASE_ADDR | ENVCTRL_PCF8574_DEV3
#define PS2 PCF8574A_BASE_ADDR | ENVCTRL_PCF8574_DEV2
#define PS3 PCF8574A_BASE_ADDR | ENVCTRL_PCF8574_DEV1
#define ENVCTRL_PCF8574_PORT0 0x01
#define ENVCTRL_PCF8574_PORT1 0x02
#define ENVCTRL_PCF8574_PORT2 0x04
#define ENVCTRL_PCF8574_PORT3 0x08
#define ENVCTRL_PCF8574_PORT4 0x10
#define ENVCTRL_PCF8574_PORT5 0x20
#define ENVCTRL_PCF8574_PORT6 0x40
#define ENVCTRL_PCF8574_PORT7 0x80
#define ENVCTRL_DFLOP_INIT0 0x77
#define ENVCTRL_DFLOP_INIT1 0x7F
#define ENVCTRL_DEVINTR_INTI0 0xF7
#define ENVCTRL_DEVINTR_INTI1 0xFF
#define CPU_FAN_1 0x01
#define CPU_FAN_2 0x02
#define CPU_FAN_3 0x03
#define PS_FAN_1 CPU_FAN_1
#define PS_FAN_2 CPU_FAN_2
#define PS_FAN_3 CPU_FAN_3
#define AFB_FAN_1 0x00
struct envctrl_pcf8574_chip {
uchar_t chip_num;
int type;
uint_t val;
};
#define TDA8444T_BASE_ADDR 0x40
#define ENVCTRL_TDA8444T_DEV0 0x00
#define ENVCTRL_TDA8444T_DEV1 0x02
#define ENVCTRL_TDA8444T_DEV2 0x04
#define ENVCTRL_TDA8444T_DEV3 0x06
#define ENVCTRL_TDA8444T_DEV4 0x08
#define ENVCTRL_TDA8444T_DEV5 0x0A
#define ENVCTRL_TDA8444T_DEV6 0x0C
#define ENVCTRL_TDA8444T_DEV7 0x0E
#define ENVCTRL_FAN_ADDR_MIN ENVCTRL_TDA8444T_DEV0
#define ENVCTRL_FAN_ADDR_MAX ENVCTRL_TDA8444T_DEV7
#define NO_AUTO_PORT_INCR 0xF0
#define AUTO_PORT_INCR 0x00
#define TDA8444T_READ_BIT 0x01
#define ENVCTRL_CPU_FANS 0x00
#define ENVCTRL_PS_FANS 0x01
#define ENVCTRL_AFB_FANS 0x02
#define MAX_FAN_SPEED 0x3f
#define MIN_FAN_VAL 0x00
#define MAX_FAN_VAL 0x3f
#define AFB_MAX 0x3f
#define AFB_MIN 0x1d
struct envctrl_tda8444t_chip {
uchar_t chip_num;
int type;
uchar_t fan_num;
uchar_t val;
};
static short cpu_temps[] = {
150, 150, 150, 150, 150, 150, 150, 150,
150, 150, 150, 150, 150, 150, 150, 150,
150, 150, 150, 150, 150, 150, 150, 150,
150, 150, 150, 148, 146, 144, 143, 142,
141, 140, 138, 136, 135, 134, 133, 132,
131, 130, 129, 128, 127, 126, 125, 124,
123, 122, 121, 121, 120, 120, 119, 118,
117, 116, 115, 114, 113, 112, 112, 111,
111, 110, 110, 110, 109, 109, 108, 107,
106, 106, 105, 105, 104, 103, 102, 101,
101, 100, 100, 100, 99, 99, 98, 98,
97, 97, 96, 96, 95, 95, 94, 94,
93, 93, 92, 92, 91, 91, 91, 90,
90, 90, 89, 89, 88, 88, 87, 87,
86, 86, 85, 85, 84, 84, 83, 83,
82, 82, 82, 81, 81, 80, 80, 80,
80, 79, 79, 79, 78, 78, 78, 77,
77, 77, 76, 76, 76, 75, 75, 75,
74, 74, 74, 73, 73, 73, 72, 72,
72, 71, 71, 71, 70, 70, 70, 70,
69, 69, 69, 68, 68, 68, 68, 67,
67, 67, 67, 66, 66, 66, 66, 65,
65, 65, 64, 64, 64, 63, 63, 63,
62, 62, 62, 61, 61, 61, 61, 60,
60, 60, 60, 59, 59, 59, 58, 58,
58, 57, 57, 57, 56, 56, 56, 56,
55, 55, 55, 55, 54, 54, 54, 53,
53, 53, 52, 52, 52, 51, 51, 51,
51, 50, 50, 50, 49, 49, 49, 48,
48, 48, 47, 47, 47, 46, 46, 46,
45, 45, 45, 44, 44, 44, 43, 43,
43, 42, 42, 42, 41, 41, 41, 40,
40,
};
static short ps_temps[] = {
160, 155, 154, 150, 130, 125, 120, 115,
110, 110, 106, 103, 101, 100, 97, 94,
92, 90, 88, 86, 84, 83, 82, 81,
80, 79, 78, 77, 76, 74, 72, 71,
70, 69, 68, 67, 66, 65, 64, 63,
62, 62, 61, 61, 60, 60, 60, 59,
59, 58, 58, 57, 56, 56, 55, 55,
54, 54, 53, 53, 52, 52, 51, 51,
50, 50, 50, 49, 49, 49, 49, 48,
48, 48, 48, 47, 47, 47, 47, 46,
46, 46, 45, 44, 43, 42, 41, 41,
40, 40, 40, 40, 39, 39, 39, 38,
38, 38, 37, 37, 36, 36, 36, 35,
35, 35, 35, 34, 34, 34, 33, 33,
32, 32, 32, 32, 32, 32, 31, 31,
31, 31, 31, 30, 30, 30, 29, 29,
29, 29, 29, 29, 28, 28, 28, 28,
28, 28, 27, 27, 27, 27, 27, 26,
26, 26, 26, 26, 26, 26, 26, 26,
25, 25, 25, 25, 24, 24, 23, 23,
22, 22, 21, 21, 21, 21, 21, 21,
20, 20, 20, 20, 19, 19, 19, 19,
19, 18, 18, 18, 18, 18, 17, 17,
17, 17, 17, 16, 16, 16, 16, 15,
15, 15, 15, 15, 15, 14, 14, 14,
14, 14, 13, 13, 13, 13, 12, 12,
12, 12, 12, 11, 11, 11, 11, 11,
10, 10, 10, 10, 10, 10, 10, 10,
9, 9, 9, 9, 9, 9, 8, 8,
8, 8, 8, 7, 7, 7, 7, 7,
7, 6, 6, 6, 6, 6, 6, 6,
5, 5, 5, 5, 5, 5, 5, 4,
4,
};
static short acme_cpu_fanspd[] = {
31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 42, 43, 45,
48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63,
63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63,
};
static short acme_ps_fanspd[] = {
31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 31, 33, 34, 35,
36, 37, 38, 38, 39, 40, 41, 42,
43, 45, 46, 47, 48, 48, 48, 48,
48, 48, 49, 50, 51, 52, 53, 54,
55, 56, 57, 58, 59, 60, 61, 62,
63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63,
};
static short ps_fans[] = {
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
11, 12, 13, 14, 15, 16, 17, 18,
19, 20, 21, 22, 23, 24, 25, 26,
27, 28, 29, 30, 31, 32, 33, 34,
35, 36, 37, 38, 39, 40, 41, 42,
43, 44, 45, 46, 47, 48, 49, 50,
50, 50, 50, 50, 50, 50, 50, 50,
13, 12, 11, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10,
10,
};
static short fan_speed[] = {
30, 29, 28, 27, 26, 25, 24, 23,
23, 23, 23, 23, 22, 21, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20,
19, 18, 17, 16, 15, 14, 13, 12,
11, 11, 11, 11, 11, 11, 11, 11,
11, 11, 11, 10, 10, 10, 9, 8,
7, 6, 5, 4, 3, 2, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
};
#if defined(_KERNEL)
struct envctrlunit {
struct envctrl_pcd8584_regs *bus_ctl_regs;
ddi_acc_handle_t ctlr_handle;
kmutex_t umutex;
int instance;
dev_info_t *dip;
struct envctrl_ps ps_kstats[MAX_DEVS];
struct envctrl_fan fan_kstats[MAX_DEVS];
struct envctrl_encl encl_kstats[MAX_DEVS];
int cpu_pr_location[ENVCTRL_MAX_CPUS];
uint_t num_fans_present;
uint_t num_ps_present;
uint_t num_encl_present;
uint_t num_cpus_present;
kstat_t *psksp;
kstat_t *fanksp;
kstat_t *enclksp;
ddi_iblock_cookie_t ic_trap_cookie;
queue_t *readq;
queue_t *writeq;
mblk_t *msg;
boolean_t suspended;
boolean_t oflag;
int current_mode;
int AFB_present;
timeout_id_t timeout_id;
timeout_id_t pshotplug_id;
int ps_present[MAXPS+1];
int num_fans_failed;
int activity_led_blink;
int present_led_state;
timeout_id_t blink_timeout_id;
int initting;
boolean_t shutdown;
};
#endif
#ifdef __cplusplus
}
#endif
#endif