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