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