fhc.h revision 1341:6d7c4f090a72
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27#ifndef _SYS_FHC_H 28#define _SYS_FHC_H 29 30#pragma ident "%Z%%M% %I% %E% SMI" 31 32#ifdef __cplusplus 33extern "C" { 34#endif 35 36#include <sys/types32.h> 37#include <sys/dditypes.h> 38 39/* useful debugging stuff */ 40#define FHC_ATTACH_DEBUG 0x1 41#define FHC_INTERRUPT_DEBUG 0x2 42#define FHC_REGISTERS_DEBUG 0x4 43#define FHC_CTLOPS_DEBUG 0x8 44 45#define FHC_BOARDS 0 46#define FHC_CLOCKS 1 47 48/* 49 * OBP supplies us with 6 register sets for the FHC. The code for the fhc 50 * driver relies on these register sets being presented by the PROM in the 51 * order specified below. If this changes, the following comments must be 52 * revised and the code in fhc_init() must be changed to reflect these 53 * revisions. 54 * 55 * They are: 56 * 0 FHC internal registers 57 * 1 IGR Interrupt Group Number 58 * 2 FanFail IMR, ISMR 59 * 3 System IMR, ISMR 60 * 4 UART IMR, ISMR 61 * 5 TOD IMR, ISMR 62 */ 63 64/* 65 * The offsets are defined as offsets from the base of the OBP register 66 * set which the register belongs to. 67 */ 68 69/* Register set 0 */ 70#define FHC_OFF_ID 0x0 /* FHC ID register */ 71#define FHC_OFF_RCTRL 0x10 /* FHC Reset Control and Status */ 72#define FHC_OFF_CTRL 0x20 /* FHC Control and Status */ 73#define FHC_OFF_BSR 0x30 /* FHC Board Status Register */ 74#define FHC_OFF_JTAG_CTRL 0xF0 /* JTAG Control Register */ 75#define FHC_OFF_JTAG_CMD 0x100 /* JTAG Comamnd Register */ 76 77/* Register sets 2-5, the ISMR offset is the same */ 78#define FHC_OFF_ISMR 0x10 /* FHC Interrupt State Machine */ 79 80/* Bit field defines for FHC Control and Status Register */ 81#define FHC_CENTERDIS 0x00100000 82 83/* NOTE: this bit is only used by firmware and must always be cleared by OS */ 84#define FHC_CSR_SYNC 0x00010000 85#define FHC_MOD_OFF 0x00008000 86#define FHC_ACDC_OFF 0x00004000 87#define FHC_FHC_OFF 0x00002000 88#define FHC_EPDA_OFF 0x00001000 89#define FHC_EPDB_OFF 0x00000800 90#define FHC_PS_OFF 0x00000400 91#define FHC_NOT_BRD_PRES 0x00000200 92#define FHC_LED_LEFT 0x00000040 93#define FHC_LED_MID 0x00000020 94#define FHC_LED_RIGHT 0x00000010 95 96/* Bit field defines for FHC Reset Control and Status Register */ 97#define FHC_POR 0x80000000 98#define FHC_SOFT_POR 0x40000000 99#define FHC_SOFT_XIR 0x20000000 100 101/* Bit field defines for the JTAG control register. */ 102#define JTAG_MASTER_EN 0x80000000 103#define JTAG_MASTER_NPRES 0x40000000 104 105 106/* Macros for decoding UPA speed pins from the Board Status Register */ 107#define CPU_0_PINS(bsr) (((bsr) >> 10) & 0x7) 108#define CPU_1_PINS(bsr) (((bsr) >> 7) & 0x7) 109 110#define CID_REV_MASK 0x0fffffff 111#define ULTRAI_COMPID 0x0002502f 112#define ULTRAII_COMPID 0x0003602f 113 114/* Macro for extracting the "plus" bit from the Board Status Register */ 115#define ISPLUSBRD(bsr) (((bsr) & 1) == 0) 116 117/* Macros for physical access */ 118#define FHC_OFFSET 0xf8000000ull 119#define FHC_REGOFF 0x800000ull 120#define FHC_OFF_IGN 0x2000ull 121#define FHC_OFF_SIM 0x6000ull 122#define FHC_OFF_SSM 0x6010ull 123#define FHC_OFF_UIM 0x8000ull 124#define FHC_OFF_USM 0x8010ull 125#define FHC_CTRL(board) (FHC_BOARD_BASE(2*(board)) + FHC_OFFSET + \ 126 FHC_REGOFF + FHC_OFF_CTRL) 127#define FHC_JTAG_CTRL(board) (FHC_BOARD_BASE(2*(board)) + FHC_OFFSET + \ 128 FHC_REGOFF + FHC_OFF_JTAG_CTRL) 129#define FHC_IGN(board) (FHC_BOARD_BASE(2*(board)) + FHC_OFFSET + \ 130 FHC_REGOFF + FHC_OFF_IGN) 131#define FHC_SIM(board) (FHC_BOARD_BASE(2*(board)) + FHC_OFFSET + \ 132 FHC_REGOFF + FHC_OFF_SIM) 133#define FHC_SSM(board) (FHC_BOARD_BASE(2*(board)) + FHC_OFFSET + \ 134 FHC_REGOFF + FHC_OFF_SSM) 135#define FHC_UIM(board) (FHC_BOARD_BASE(2*(board)) + FHC_OFFSET + \ 136 FHC_REGOFF + FHC_OFF_UIM) 137#define FHC_USM(board) (FHC_BOARD_BASE(2*(board)) + FHC_OFFSET + \ 138 FHC_REGOFF + FHC_OFF_USM) 139 140/* 141 * the foolowing defines are used for trans phy-addr to board number 142 */ 143#define BOARD_PHYADDR_SHIFT 24 144#define CLOCKBOARD_PHYADDR_BITS 0x1fff8 145#define IO_BOARD_NUMBER_SHIFT 10 146#define IO_BOARD_NUMBER_MASK 0xf 147 148/* 149 * The following defines are used by the fhc driver to determine the 150 * difference between IO and CPU type boards. This will be replaced 151 * later by JTAG scan to determine board type. 152 */ 153 154/* XXX */ 155#define FHC_UPADATA64A 0x40000 156#define FHC_UPADATA64B 0x20000 157/* XXX */ 158 159/* Bit field defines for Board Status Register */ 160#define FHC_DIAG_MODE 0x40 161 162/* Bit field defines for the FHC Board Status Register when on a disk board */ 163#define FHC_FANFAIL 0x00000040 164#define FHC_SCSI_VDD_OK 0x00000001 165 166/* Size of temperature recording array */ 167#define MAX_TEMP_HISTORY 16 168 169/* Maximum number of boards in system */ 170#define MAX_BOARDS 16 171 172/* Maximum number of Board Power Supplies. */ 173#define MAX_PS_COUNT 8 174 175/* Use predefined strings to name the kstats from this driver. */ 176#define FHC_KSTAT_NAME "fhc" 177#define CSR_KSTAT_NAMED "csr" 178#define BSR_KSTAT_NAMED "bsr" 179 180/* 181 * The following defines are for the AC chip, but are needed to be global, 182 * so have been put in the fhc header file. 183 */ 184 185/* 186 * Most Sunfire ASICs have the chip rev encoded into bits 31-28 of the 187 * component ID register. 188 */ 189#define CHIP_REV(c) ((c) >> 28) 190 191#ifndef _ASM 192 193/* Use predefined strings to name the kstats from this driver. */ 194 195/* Bit field defines for Interrupt Mapping registers */ 196#define IMR_VALID ((uint_t)1 << INR_EN_SHIFT) /* Mondo valid bit */ 197 198/* Bit defines for Interrupt State Machine Register */ 199#define INT_PENDING 3 /* state of the interrupt dispatch */ 200 201struct intr_regs { 202 volatile uint_t *mapping_reg; 203 volatile uint_t *clear_reg; 204 uint_t mapping_reg_cache; /* cache current value for CPR */ 205}; 206 207#define BD_IVINTR_SHFT 0x7 208 209/* 210 * Convert the Board Number field in the FHC Board Status Register to 211 * a board number. The field in the register is bits 0,3-1 of the board 212 * number. Therefore a macro is necessary to extract the board number. 213 */ 214#define FHC_BSR_TO_BD(bsr) ((((bsr) >> 16) & 0x1) | \ 215 (((bsr) >> 12) & 0xE)) 216 217#define FHC_INO(ino) ((ino) & 0x7) 218#define FHC_CPU2BOARD(cpuid) ((cpuid) >> 1) 219#define FHC_CPU_IS_A(cpuid) (!((cpuid) & 1)) 220#define FHC_CPU_IS_B(cpuid) ((cpuid) & 1) 221#define FHC_BOARD2CPU_A(board) ((board) << 1) 222#define FHC_BOARD2CPU_B(board) (((board) << 1) + 1) 223#define FHC_PS2BOARD(ps) ((((ps) & 0x6) << 1) | ((ps) & 0x1)) 224#define FHC_BOARD2PS(board) ((((board) & 0xc) >> 1) | ((board) & 0x1)) 225#define FHC_OTHER_CPU_ID(cpuid) ((cpuid) ^ 1) 226 227/* this base address is assumed to never map to real memory */ 228#define FHC_BASE_NOMEM (1ull << 40) 229#define FHC_MAX_ECACHE_SIZE (16 * 1024 * 1024) 230 231#define FHC_BOARD_0 0x1c000000000ull 232#define FHC_BOARD_SPAN 0x200000000ull 233#define FHC_DTAG_OFFSET 0xfa000000ull 234#define FHC_BOARD_BASE(cpuid) (FHC_BOARD_0 + (cpuid) * FHC_BOARD_SPAN) 235#define FHC_DTAG_BASE(cpuid) (FHC_BOARD_BASE(cpuid) + FHC_DTAG_OFFSET) 236#define FHC_DTAG_LOW 0x300000000ull 237#define FHC_DTAG_HIGH 0x3ull 238#define FHC_DTAG_SIZE (16 * 1024 * 1024) 239#define FHC_DTAG_SKIP 64 240 241/* 242 * Each Sunfire CPU Board has 32Kbytes of SRAM on the FireHose Bus. 243 * 244 * The SRAM is allocated as follows: 245 * 246 * 0x1ff.f020.0000 - 0x1ff.f020.5fff scratch/stacks 247 * 0x1ff.f020.6000 - 0x1ff.f020.67ff reset info (2K bytes) 248 * 0x1ff.f020.6800 - 0x1ff.f020.6fff POST private (2K bytes) 249 * 0x1ff.f020.7000 - 0x1ff.f020.77ff OS private (2K bytes) 250 * 0x1ff.f020.7800 - 0x1ff.f020.7fff OBP private (2K bytes) 251 */ 252#define FHC_LOCAL_SRAM_BASE 0x1fff0200000ull 253#define FHC_GLOBAL_SRAM_BASE 0x1c0f8200000ull 254#define FHC_CPU2GLOBAL_SRAM(mid) \ 255 (FHC_GLOBAL_SRAM_BASE + (mid) * 0x200000000ull) 256 257#define FHC_SRAM_OS_BASE 0x7000 258#define FHC_LOCAL_OS_PAGEBASE ((FHC_LOCAL_SRAM_BASE + FHC_SRAM_OS_BASE) & \ 259 MMU_PAGEMASK) 260#define FHC_SRAM_OS_OFFSET ((FHC_LOCAL_SRAM_BASE + FHC_SRAM_OS_BASE) & \ 261 MMU_PAGEOFFSET) 262 263#define FHC_SHUTDOWN_WAIT_MSEC 1000 264 265#define FHC_MAX_INO 4 266 267#define FHC_SYS_INO 0x0 268#define FHC_UART_INO 0x1 269#define FHC_TOD_INO 0x2 270#define FHC_FANFAIL_INO 0x3 271 272/* 273 * Defines for the kstats created for passing temperature values and 274 * history out to user level programs. All temperatures passed out 275 * will be in degrees Centigrade, corrected for the board type the 276 * temperature was read from. Since each Board type has a different 277 * response curve for the A/D convertor, the temperatures are all 278 * calibrated inside the kernel. 279 */ 280 281#define OVERTEMP_KSTAT_NAME "temperature" 282 283/* 284 * This kstat is used for manually overriding temperatures. 285 */ 286 287#define TEMP_OVERRIDE_KSTAT_NAME "temperature override" 288 289/* 290 * Time averaging based method of recording temperature history. 291 * Higher level temperature arrays are composed of temperature averages 292 * of the array one level below. When the lower array completes a 293 * set of data, the data is averaged and placed into the higher 294 * level array. Then the lower level array is overwritten until 295 * it is once again complete, where the process repeats. 296 * 297 * This method gives a user a fine grained view of the last minute, 298 * and larger grained views of the temperature as one goes back in 299 * time. 300 * 301 * The time units for the longer samples are based on the value 302 * of the OVERTEMP_TIMEOUT_SEC and the number of elements in each 303 * of the arrays between level 1 and the higher level. 304 */ 305 306#define OVERTEMP_TIMEOUT_SEC 2 307 308/* definition of the clock board index */ 309#define CLOCK_BOARD_INDEX 16 310 311#define L1_SZ 30 /* # of OVERTEMP_TIMEOUT_SEC samples */ 312#define L2_SZ 15 /* size of array for level 2 samples */ 313#define L3_SZ 12 /* size of array for level 3 samples */ 314#define L4_SZ 4 /* size of array for level 4 samples */ 315#define L5_SZ 2 /* size of array for level 5 samples */ 316 317/* 318 * Macros for determining when to do the temperature averaging of arrays. 319 */ 320#define L2_INDEX(i) ((i) / L1_SZ) 321#define L2_REM(i) ((i) % L1_SZ) 322#define L3_INDEX(i) ((i) / (L1_SZ * L2_SZ)) 323#define L3_REM(i) ((i) % (L1_SZ * L2_SZ)) 324#define L4_INDEX(i) ((i) / (L1_SZ * L2_SZ * L3_SZ)) 325#define L4_REM(i) ((i) % (L1_SZ * L2_SZ * L3_SZ)) 326#define L5_INDEX(i) ((i) / (L1_SZ * L2_SZ * L3_SZ * L4_SZ)) 327#define L5_REM(i) ((i) % (L1_SZ * L2_SZ * L3_SZ * L4_SZ)) 328 329/* 330 * define for an illegal temperature. This temperature will never be seen 331 * in a real system, so it is used as an illegal value in the various 332 * functions processing the temperature data structure. 333 */ 334#define NA_TEMP 0x7FFF 335 336/* 337 * State variable for board temperature. Each board has its own 338 * temperature state. State transitions from OK -> bad direction 339 * happen instantaneously, but use a counter in the opposite 340 * direction, so that noise in the A/D counters does not cause 341 * a large number of messages to appear. 342 */ 343enum temp_state { TEMP_OK = 0, /* normal board temperature */ 344 TEMP_WARN = 1, /* start warning operator */ 345 TEMP_DANGER = 2 }; /* get ready to shutdown */ 346 347/* 348 * Number of temperature poll counts to wait before printing that the 349 * system has cooled down. 350 */ 351#define TEMP_STATE_TIMEOUT_SEC 20 352#define TEMP_STATE_COUNT ((TEMP_STATE_TIMEOUT_SEC) / \ 353 (OVERTEMP_TIMEOUT_SEC)) 354 355/* 356 * Number of poll counts that a system temperature must be at or above danger 357 * temperature before system is halted and powers down. 358 */ 359#define SHUTDOWN_TIMEOUT_SEC 20 360#define SHUTDOWN_COUNT ((SHUTDOWN_TIMEOUT_SEC) / \ 361 (OVERTEMP_TIMEOUT_SEC)) 362 363/* 364 * State variable for temperature trend. Each state represents the 365 * current temperature trend for a given device. 366 */ 367enum temp_trend { TREND_UNKNOWN = 0, /* Unknown temperature trend */ 368 TREND_RAPID_FALL = 1, /* Rapidly falling temp. */ 369 TREND_FALL = 2, /* Falling temperature */ 370 TREND_STABLE = 3, /* Stable temperature */ 371 TREND_RISE = 4, /* Rising temperature */ 372 TREND_RAPID_RISE = 5, /* Rapidly rising temperature */ 373 TREND_NOISY = 6 }; /* Unknown trend (noisy) */ 374 375/* Thresholds for temperature trend */ 376#define NOISE_THRESH 2 377#define RAPID_RISE_THRESH 4 378#define RAPID_FALL_THRESH 4 379 380/* 381 * Main structure for passing the calibrated and time averaged temperature 382 * values to user processes. This structure is copied out via the kstat 383 * mechanism. 384 */ 385#define TEMP_KSTAT_VERSION 3 /* version of temp_stats structure */ 386struct temp_stats { 387 uint_t index; /* index of current temperature */ 388 short l1[L1_SZ]; /* OVERTEMP_TIMEOUT_SEC samples */ 389 short l2[L2_SZ]; /* level 2 samples */ 390 short l3[L3_SZ]; /* level 3 samples */ 391 short l4[L4_SZ]; /* level 4 samples */ 392 short l5[L5_SZ]; /* level 5 samples */ 393 short max; /* maximum temperature recorded */ 394 short min; /* minimum temperature recorded */ 395 enum temp_state state; /* state of board temperature */ 396 int temp_cnt; /* counter for state changes */ 397 int shutdown_cnt; /* counter for overtemp shutdown */ 398 int version; /* version of this structure */ 399 enum temp_trend trend; /* temperature trend for board */ 400 short override; /* override temperature for testing */ 401}; 402 403/* The variable fhc_cpu_warning_temp_threshold is initialized to this value. */ 404#define FHC_CPU_WARNING_TEMP_THRESHOLD 45 405 406/* 407 * Fault list management. 408 * 409 * The following defines and enum definitions have been created to support 410 * the fault list (struct ft_list). These defines must match with the 411 * fault string table in fhc.c. If any faults are added, they must be 412 * added at the end of this list, and the table must be modified 413 * accordingly. 414 */ 415enum ft_type { 416 FT_CORE_PS = 0, /* Core power supply */ 417 FT_OVERTEMP, /* Temperature */ 418 FT_AC_PWR, /* AC power Supply */ 419 FT_PPS, /* Peripheral Power Supply */ 420 FT_CLK_33, /* System 3.3 Volt Power */ 421 FT_CLK_50, /* System 5.0 Volt Power */ 422 FT_V5_P, /* Peripheral 5V Power */ 423 FT_V12_P, /* Peripheral 12V Power */ 424 FT_V5_AUX, /* Auxiliary 5V Power */ 425 FT_V5_P_PCH, /* Peripheral 5V Precharge */ 426 FT_V12_P_PCH, /* Peripheral 12V Precharge */ 427 FT_V3_PCH, /* System 3V Precharge */ 428 FT_V5_PCH, /* System 5V Precharge */ 429 FT_PPS_FAN, /* Peripheral Power Supply Fan */ 430 FT_RACK_EXH, /* Rack Exhaust Fan */ 431 FT_DSK_FAN, /* 4 (or 5) Slot Disk Fan */ 432 FT_AC_FAN, /* AC Box Fan */ 433 FT_KEYSW_FAN, /* Key Switch Fan */ 434 FT_INSUFFICIENT_POWER, /* System has insufficient power */ 435 FT_PROM, /* fault inherited from PROM */ 436 FT_HOT_PLUG, /* hot plug unavailable */ 437 FT_TODFAULT /* tod error detection */ 438}; 439 440enum ft_class { 441 FT_BOARD, 442 FT_SYSTEM 443}; 444 445/* 446 * This extern allows other drivers to use the ft_str_table if they 447 * have fhc specified as a depends_on driver. 448 */ 449extern char *ft_str_table[]; 450 451/* Maximum length of string table entries */ 452#define MAX_FT_DESC 64 453 454#define FT_LIST_KSTAT_NAME "fault_list" 455 456/* 457 * The fault list structure is a structure for holding information on 458 * kernel detected faults. The fault list structures are linked into 459 * a list and the list is protected by the ftlist_mutex. There are 460 * also several routines for manipulating the fault list. 461 */ 462struct ft_list { 463 int32_t unit; /* unit number of faulting device */ 464 enum ft_type type; /* type of faulting device */ 465 int32_t pad; /* padding to replace old next pointer */ 466 enum ft_class fclass; /* System or board class fault */ 467 time32_t create_time; /* Time stamp at fault detection */ 468 char msg[MAX_FT_DESC]; /* fault string */ 469}; 470 471/* 472 * Allow binary compatibility between ILP32 and LP64 by 473 * eliminating the next pointer and making ft_list a fixed size. 474 * The structure name "ft_list" remains unchanged for 475 * source compatibility of kstat applications. 476 */ 477struct ft_link_list { 478 struct ft_list f; 479 struct ft_link_list *next; 480}; 481 482/* 483 * Board list management. 484 * 485 * Enumerated types for defining type of system and clock 486 * boards. It is used by both the kernel and user programs. 487 */ 488enum board_type { 489 UNINIT_BOARD = 0, /* Uninitialized board type */ 490 UNKNOWN_BOARD, /* Unknown board type */ 491 CPU_BOARD, /* System board CPU(s) */ 492 MEM_BOARD, /* System board no CPUs */ 493 IO_2SBUS_BOARD, /* 2 SBus & SOC IO Board */ 494 IO_SBUS_FFB_BOARD, /* SBus & FFB SOC IO Board */ 495 IO_PCI_BOARD, /* PCI IO Board */ 496 DISK_BOARD, /* Disk Drive Board */ 497 CLOCK_BOARD, /* System Clock board */ 498 IO_2SBUS_SOCPLUS_BOARD, /* 2 SBus & SOC+ IO board */ 499 IO_SBUS_FFB_SOCPLUS_BOARD /* SBus&FFB&SOC+ board */ 500}; 501 502/* 503 * Defined strings for comparing with OBP board-type property. If OBP ever 504 * changes the board-type properties, these string defines must be changed 505 * as well. 506 */ 507#define CPU_BD_NAME "cpu" 508#define MEM_BD_NAME "mem" 509#define IO_2SBUS_BD_NAME "dual-sbus" 510#define IO_SBUS_FFB_BD_NAME "upa-sbus" 511#define IO_PCI_BD_NAME "dual-pci" 512#define DISK_BD_NAME "disk" 513#define IO_2SBUS_SOCPLUS_BD_NAME "dual-sbus-soc+" 514#define IO_SBUS_FFB_SOCPLUS_BD_NAME "upa-sbus-soc+" 515 516/* 517 * The following structures and union are needed because the bd_info 518 * structure describes all types of system boards. 519 * XXX - We cannot determine Spitfire rev from JTAG scan, so it is 520 * left blank for now. Future implementations might fill in this info. 521 */ 522struct cpu_info { 523 int cpu_rev; /* CPU revision */ 524 int cpu_speed; /* rated speed of CPU in MHz */ 525 int cpu_compid; /* CPU component ID */ 526 int sdb0_compid; /* SDB component ID */ 527 int sdb1_compid; /* SDB component ID */ 528 int ec_compid; /* Ecache RAM ID, needed for cache size */ 529 int cache_size; /* Cache size in bytes */ 530 int cpu_sram_mode; /* module's sram mode */ 531 int cpu_detected; /* Something on the CPU JTAG ring. */ 532}; 533 534struct io1_info { 535 int sio0_compid; /* Sysio component ID */ 536 int sio1_compid; /* Sysio component ID */ 537 int hme_compid; /* several revs in existence */ 538 int soc_compid; /* SOC */ 539}; 540 541struct io1plus_info { 542 int sio0_compid; /* Sysio component ID */ 543 int sio1_compid; /* Sysio component ID */ 544 int hme_compid; /* several revs in existence */ 545 int socplus_compid; /* SOC+ */ 546}; 547 548/* Defines for the FFB size field */ 549#define FFB_FAILED -1 550#define FFB_NOT_FOUND 0 551#define FFB_SINGLE 1 552#define FFB_DOUBLE 2 553 554struct io2_info { 555 int fbc_compid; /* FBC component ID */ 556 int ffb_size; /* not present, single or dbl buffered */ 557 int sio1_compid; /* Sysio component ID */ 558 int hme_compid; /* several revs in existence */ 559 int soc_compid; /* SOC component ID */ 560}; 561 562struct io2plus_info { 563 int fbc_compid; /* FBC component ID */ 564 int ffb_size; /* not present, single or dbl buffered */ 565 int sio1_compid; /* Sysio component ID */ 566 int hme_compid; /* several revs in existence */ 567 int socplus_compid; /* or SOC+ component ID */ 568}; 569 570struct io3_info { 571 int psyo0_compid; /* Psycho+ component ID */ 572 int psyo1_compid; /* Psycho+ component ID */ 573 int cheo_compid; /* Cheerio component ID */ 574}; 575 576struct dsk_info { 577 int disk_pres[2]; 578 int disk_id[2]; 579}; 580 581union bd_un { 582 struct cpu_info cpu[2]; 583 struct io1_info io1; 584 struct io2_info io2; 585 struct io3_info io3; 586 struct dsk_info dsk; 587 struct io1plus_info io1plus; 588 struct io2plus_info io2plus; 589}; 590 591/* 592 * board_state and bd_info are maintained for backward 593 * compatibility with prtdiag and others user programs that may rely 594 * on them. 595 */ 596enum board_state { 597 UNKNOWN_STATE = 0, /* Unknown board */ 598 ACTIVE_STATE, /* active and working */ 599 HOTPLUG_STATE, /* Hot plugged board */ 600 LOWPOWER_STATE, /* Powered down board */ 601 DISABLED_STATE, /* Board disabled by PROM */ 602 FAILED_STATE /* Board failed by POST */ 603}; 604 605struct bd_info { 606 enum board_type type; /* Type of board */ 607 enum board_state state; /* current state of this board */ 608 int board; /* board number */ 609 int fhc_compid; /* fhc component id */ 610 int ac_compid; /* ac component id */ 611 char prom_rev[64]; /* best guess as to what is needed */ 612 union bd_un bd; 613}; 614 615/* 616 * Config admin interface. 617 * 618 * Receptacle states. 619 */ 620typedef enum { 621 SYSC_CFGA_RSTATE_EMPTY = 0, /* Empty state */ 622 SYSC_CFGA_RSTATE_DISCONNECTED, /* DISCONNECTED state */ 623 SYSC_CFGA_RSTATE_CONNECTED /* CONNECTED state */ 624} sysc_cfga_rstate_t; 625 626/* 627 * Occupant states. 628 */ 629typedef enum { 630 SYSC_CFGA_OSTATE_UNCONFIGURED = 0, /* UNCONFIGURED state */ 631 SYSC_CFGA_OSTATE_CONFIGURED /* CONFIGURED state */ 632} sysc_cfga_ostate_t; 633 634/* 635 * Receptacle/Occupant condition. 636 */ 637typedef enum { 638 SYSC_CFGA_COND_UNKNOWN = 0, /* Unknown condition */ 639 SYSC_CFGA_COND_OK, /* Condition OK */ 640 SYSC_CFGA_COND_FAILING, /* Failing */ 641 SYSC_CFGA_COND_FAILED, /* Failed */ 642 SYSC_CFGA_COND_UNUSABLE /* Unusable */ 643} sysc_cfga_cond_t; 644 645/* 646 * Error definitions for CFGADM platform library 647 */ 648typedef enum { 649 SYSC_ERR_DEFAULT = 0, /* generic errors */ 650 SYSC_ERR_INTRANS, /* hardware in transition */ 651 SYSC_ERR_UTHREAD, /* can't stop user thread */ 652 SYSC_ERR_KTHREAD, /* can't stop kernel thread */ 653 SYSC_ERR_SUSPEND, /* can't suspend a device */ 654 SYSC_ERR_RESUME, /* can't resume a device */ 655 SYSC_ERR_POWER, /* not enough power for slot */ 656 SYSC_ERR_COOLING, /* not enough cooling for slot */ 657 SYSC_ERR_PRECHARGE, /* not enough precharge for slot */ 658 SYSC_ERR_HOTPLUG, /* Hot Plug Unavailable */ 659 SYSC_ERR_HW_COMPAT, /* incompatible hardware found during dr */ 660 SYSC_ERR_NON_DR_PROM, /* prom not support Dynamic Reconfiguration */ 661 SYSC_ERR_CORE_RESOURCE, /* core resource cannot be removed */ 662 SYSC_ERR_PROM, /* error encountered in OBP/POST */ 663 SYSC_ERR_DR_INIT, /* error encountered in sysc_dr_init op */ 664 SYSC_ERR_NDI_ATTACH, /* error encountered in NDI attach operations */ 665 SYSC_ERR_NDI_DETACH, /* error encountered in NDI detach operations */ 666 SYSC_ERR_RSTATE, /* wrong receptacle state */ 667 SYSC_ERR_OSTATE, /* wrong occupant state */ 668 SYSC_ERR_COND /* invalid condition */ 669} sysc_err_t; 670 671/* 672 * Config admin structure. 673 */ 674typedef struct sysc_cfga_stat { 675 /* generic representation of the attachment point below */ 676 sysc_cfga_rstate_t rstate; /* current receptacle state */ 677 sysc_cfga_ostate_t ostate; /* current occupant state */ 678 sysc_cfga_cond_t condition; /* current board condition */ 679 time32_t last_change; /* last state/condition change */ 680 uint_t in_transition:1; /* board is in_transition */ 681 682 /* platform specific below */ 683 enum board_type type; /* Type of board */ 684 int board; /* board number */ 685 int fhc_compid; /* fhc component id */ 686 int ac_compid; /* ac component id */ 687 char prom_rev[64]; /* best guess as to what is needed */ 688 union bd_un bd; 689 uint_t no_detach:1; /* board is non_detachable */ 690 uint_t plus_board:1; /* board is 98 MHz capable */ 691} sysc_cfga_stat_t; 692 693/* 694 * Config admin command structure for SYSC_CFGA ioctls. 695 */ 696typedef struct sysc_cfga_cmd { 697 uint_t force:1; /* force this state transition */ 698 uint_t test:1; /* Need to test hardware */ 699 int arg; /* generic data for test */ 700 sysc_err_t errtype; /* error code returned */ 701 char *outputstr; /* output returned from ioctl */ 702} sysc_cfga_cmd_t; 703 704typedef struct sysc_cfga_cmd32 { 705 uint_t force:1; /* force this state transition */ 706 uint_t test:1; /* Need to test hardware */ 707 int arg; /* generic data for test */ 708 sysc_err_t errtype; /* error code returned */ 709 caddr32_t outputstr; /* output returned from ioctl */ 710} sysc_cfga_cmd32_t; 711 712typedef struct sysc_cfga_pkt { 713 sysc_cfga_cmd_t cmd_cfga; 714 char *errbuf; /* internal error buffer */ 715} sysc_cfga_pkt_t; 716 717/* 718 * Sysctrl DR sequencer interface. 719 */ 720typedef struct sysc_dr_handle { 721 dev_info_t **dip_list; /* list of top dips for board */ 722 int dip_list_len; /* length devinfo list */ 723 int flags; /* dr specific flags */ 724 int error; /* dr operation error */ 725 char *errstr; /* dr config/unfig error message */ 726} sysc_dr_handle_t; 727 728#define SYSC_DR_MAX_NODE 32 729#define SYSC_DR_FHC 0x1 /* connect phase init (fhc) */ 730#define SYSC_DR_DEVS 0x2 /* config phase init (devices) */ 731#define SYSC_DR_FORCE 0x4 /* force detach */ 732#define SYSC_DR_REMOVE 0x8 /* remove dev_info */ 733 734#define SYSC_DR_HANDLE_FHC 0x0 735#define SYSC_DR_HANDLE_DEVS 0x1 736 737/* 738 * Sysctrl event interface. 739 */ 740typedef enum sysc_evt { 741 SYSC_EVT_BD_EMPTY = 0, 742 SYSC_EVT_BD_PRESENT, 743 SYSC_EVT_BD_DISABLED, 744 SYSC_EVT_BD_FAILED, 745 SYSC_EVT_BD_OVERTEMP, 746 SYSC_EVT_BD_TEMP_OK, 747 SYSC_EVT_BD_PS_CHANGE, 748 SYSC_EVT_BD_INS_FAILED, 749 SYSC_EVT_BD_INSERTED, 750 SYSC_EVT_BD_REMOVED, 751 SYSC_EVT_BD_HP_DISABLED, 752 SYSC_EVT_BD_CORE_RESOURCE_DISCONNECT 753} sysc_evt_t; 754 755/* 756 * sysctrl audit message events 757 */ 758typedef enum sysc_audit_evt { 759 SYSC_AUDIT_RSTATE_EMPTY = 0, 760 SYSC_AUDIT_RSTATE_CONNECT, 761 SYSC_AUDIT_RSTATE_DISCONNECT, 762 SYSC_AUDIT_RSTATE_SUCCEEDED, 763 SYSC_AUDIT_RSTATE_EMPTY_FAILED, 764 SYSC_AUDIT_RSTATE_CONNECT_FAILED, 765 SYSC_AUDIT_RSTATE_DISCONNECT_FAILED, 766 SYSC_AUDIT_OSTATE_CONFIGURE, 767 SYSC_AUDIT_OSTATE_UNCONFIGURE, 768 SYSC_AUDIT_OSTATE_SUCCEEDED, 769 SYSC_AUDIT_OSTATE_CONFIGURE_FAILED, 770 SYSC_AUDIT_OSTATE_UNCONFIGURE_FAILED 771} sysc_audit_evt_t; 772 773typedef struct { 774 void (*update)(void *, sysc_cfga_stat_t *, sysc_evt_t); 775 void *soft; 776} sysc_evt_handle_t; 777 778void fhc_bd_sc_register(void f(void *, sysc_cfga_stat_t *, sysc_evt_t), void *); 779 780/* 781 * The board list structure is the central storage for the kernel's 782 * knowledge of normally booted and hotplugged boards. 783 */ 784typedef struct bd_list { 785 struct fhc_soft_state *softsp; /* handle for DDI soft state */ 786 sysc_cfga_stat_t sc; /* board info */ 787 sysc_dr_handle_t sh[2]; /* sysctrl dr interface */ 788 void *dev_softsp; /* opaque pointer to device state */ 789 void *ac_softsp; /* opaque pointer to our AC */ 790 struct kstat *ksp; /* pointer used in kstat destroy */ 791 int fault; /* failure on this board? */ 792 int flags; /* board state flags */ 793} fhc_bd_t; 794 795/* 796 * Fhc_bd.c holds 2 resizable arrays of boards. First for clock 797 * boards under central and second for normally booted and 798 * hotplugged boards. 799 */ 800typedef struct resizable_bd_list { 801 fhc_bd_t **boards; 802 int size; 803 int last; 804 int sorted; 805} fhc_bd_resizable_t; 806 807#define BDF_VALID 0x1 /* board entry valid */ 808#define BDF_DETACH 0x2 /* board detachable */ 809#define BDF_DISABLED 0x4 /* board disabled */ 810 811#define SYSC_OUTPUT_LEN MAXPATHLEN /* output str len */ 812 813/* 814 * Board list management interface. 815 */ 816int fhc_max_boards(void); 817void fhc_bdlist_init(void); 818void fhc_bdlist_fini(void); 819void fhc_bdlist_prime(int, int, int); 820fhc_bd_t *fhc_bdlist_lock(int); 821void fhc_bdlist_unlock(void); 822 823void fhc_bd_init(struct fhc_soft_state *, int, enum board_type); 824fhc_bd_t *fhc_bd(int); 825fhc_bd_t *fhc_bd_clock(void); 826fhc_bd_t *fhc_bd_first(void); 827fhc_bd_t *fhc_bd_next(fhc_bd_t *); 828enum board_type fhc_bd_type(int); 829char *fhc_bd_typestr(enum board_type); 830int fhc_bd_valid(int); 831int fhc_bd_detachable(int); 832 833int fhc_bd_insert_scan(void); 834int fhc_bd_remove_scan(void); 835int fhc_bd_test(int, sysc_cfga_pkt_t *); 836int fhc_bd_test_set_cond(int, sysc_cfga_pkt_t *); 837void fhc_bd_update(int, sysc_evt_t); 838void fhc_bd_env_set(int, void *); 839 840int fhc_bdlist_locked(void); 841int fhc_bd_busy(int); 842int fhc_bd_is_jtag_master(int); 843int fhc_bd_is_plus(int); 844 845#if defined(_KERNEL) 846 847/* 848 * In order to indicate that we are in an environmental chamber, or 849 * oven, the test people will set the 'mfg-mode' property in the 850 * options node to 'chamber'. Therefore we have the following define. 851 */ 852#define CHAMBER_VALUE "chamber" 853 854/* 855 * zs design for fhc has two zs' interrupting on same interrupt mondo 856 * This requires us to poll for zs and zs alone. The poll list has been 857 * defined as a fixed size for simplicity. 858 */ 859#define MAX_ZS_CNT 2 860 861/* FHC Interrupt routine wrapper structure */ 862struct fhc_wrapper_arg { 863 struct fhc_soft_state *softsp; 864 volatile uint_t *clear_reg; 865 volatile uint_t *mapping_reg; 866 dev_info_t *child; 867 uint32_t inum; 868 uint_t (*funcp)(caddr_t, caddr_t); 869 caddr_t arg1; 870 caddr_t arg2; 871}; 872 873/* 874 * The JTAG master command structure. It contains the address of the 875 * the JTAG controller on this system board. The controller can only 876 * be used if this FHC holds the JTAG master signal. This is checked 877 * by reading the JTAG control register on this FHC. 878 */ 879struct jt_mstr { 880 volatile uint_t *jtag_cmd; 881 int is_master; 882 kmutex_t lock; 883}; 884 885/* Functions exported to manage the fault list */ 886void reg_fault(int, enum ft_type, enum ft_class); 887void clear_fault(int, enum ft_type, enum ft_class); 888int process_fault_list(void); 889void create_ft_kstats(int); 890 891/* memloc's are protected under the bdlist lock */ 892struct fhc_memloc { 893 struct fhc_memloc *next; 894 int board; /* reference our board element */ 895 uint_t pa; /* base PA of this segment (in MB) */ 896 uint_t size; /* size of this segment (in MB) */ 897}; 898 899/* Functions used to manage memory 'segments' */ 900#define FHC_MEMLOC_SHIFT 20 901#define FHC_MEMLOC_MAX (0x10000000000ull >> FHC_MEMLOC_SHIFT) 902void fhc_add_memloc(int board, uint64_t pa, uint_t size); 903void fhc_del_memloc(int board); 904uint64_t fhc_find_memloc_gap(uint_t size); 905void fhc_program_memory(int board, uint64_t base); 906 907/* Structures used in the driver to manage the hardware */ 908struct fhc_soft_state { 909 dev_info_t *dip; /* dev info of myself */ 910 struct bd_list *list; /* pointer to board list entry */ 911 int is_central; /* A central space instance of FHC */ 912 volatile uint_t *id; /* FHC ID register */ 913 volatile uint_t *rctrl; /* FHC Reset Control and Status */ 914 volatile uint_t *bsr; /* FHC Board Status register */ 915 volatile uint_t *jtag_ctrl; /* JTAG Control register */ 916 volatile uint_t *igr; /* Interrupt Group Number */ 917 struct intr_regs intr_regs[FHC_MAX_INO]; 918 struct fhc_wrapper_arg poll_list[MAX_ZS_CNT]; 919 struct fhc_wrapper_arg *intr_list[FHC_MAX_INO]; 920 kmutex_t poll_list_lock; 921 uchar_t spurious_zs_cntr; /* Spurious counter for zs devices */ 922 kmutex_t pokefault_mutex; 923 int pokefault; 924 925 /* this lock protects the following data */ 926 /* ! non interrupt use only ! */ 927 kmutex_t ctrl_lock; /* lock for access to FHC CSR */ 928 volatile uint_t *ctrl; /* FHC Control and Status */ 929 930 /* The JTAG master structure has internal locking */ 931 struct jt_mstr jt_master; 932 933 /* the pointer to the kstat is stored for deletion upon detach */ 934 kstat_t *fhc_ksp; 935}; 936 937/* 938 * Function shared with child drivers which require fhc 939 * support. They gain access to this function through the use of the 940 * _depends_on variable. 941 */ 942enum board_type get_board_type(int board); 943void update_temp(dev_info_t *pdip, struct temp_stats *envstat, uchar_t value); 944enum temp_trend temp_trend(struct temp_stats *); 945void fhc_reboot(void); 946int overtemp_kstat_update(kstat_t *ksp, int rw); 947int temp_override_kstat_update(kstat_t *ksp, int rw); 948void init_temp_arrays(struct temp_stats *envstat); 949void update_board_leds(fhc_bd_t *, uint_t, uint_t); 950struct jt_mstr *jtag_master_lock(void); 951void jtag_master_unlock(struct jt_mstr *); 952extern int fhc_board_poweroffcpus(int board, char *errbuf, int cpu_flags); 953 954 955/* FHC interrupt specification */ 956struct fhcintrspec { 957 uint_t mondo; 958 uint_t pil; 959 dev_info_t *child; 960 struct fhc_wrapper_arg *handler_arg; 961}; 962 963/* kstat structure used by fhc to pass data to user programs. */ 964struct fhc_kstat { 965 struct kstat_named csr; /* FHC Control and Status Register */ 966 struct kstat_named bsr; /* FHC Board Status Register */ 967}; 968 969#endif /* _KERNEL */ 970 971#endif /* _ASM */ 972 973#ifdef __cplusplus 974} 975#endif 976 977#endif /* _SYS_FHC_H */ 978