1*54579826SDavid Howells /* 2*54579826SDavid Howells * 3*54579826SDavid Howells * envctrl.h: Definitions for access to the i2c environment 4*54579826SDavid Howells * monitoring on Ultrasparc systems. 5*54579826SDavid Howells * 6*54579826SDavid Howells * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) 7*54579826SDavid Howells * Copyright (C) 2000 Vinh Truong (vinh.truong@eng.sun.com) 8*54579826SDavid Howells * VT - Add all ioctl commands and environment status definitions 9*54579826SDavid Howells * VT - Add application note 10*54579826SDavid Howells */ 11*54579826SDavid Howells #ifndef _SPARC64_ENVCTRL_H 12*54579826SDavid Howells #define _SPARC64_ENVCTRL_H 1 13*54579826SDavid Howells 14*54579826SDavid Howells #include <linux/ioctl.h> 15*54579826SDavid Howells 16*54579826SDavid Howells /* Application note: 17*54579826SDavid Howells * 18*54579826SDavid Howells * The driver supports 4 operations: open(), close(), ioctl(), read() 19*54579826SDavid Howells * The device name is /dev/envctrl. 20*54579826SDavid Howells * Below is sample usage: 21*54579826SDavid Howells * 22*54579826SDavid Howells * fd = open("/dev/envtrl", O_RDONLY); 23*54579826SDavid Howells * if (ioctl(fd, ENVCTRL_READ_SHUTDOWN_TEMPERATURE, 0) < 0) 24*54579826SDavid Howells * printf("error\n"); 25*54579826SDavid Howells * ret = read(fd, buf, 10); 26*54579826SDavid Howells * close(fd); 27*54579826SDavid Howells * 28*54579826SDavid Howells * Notice in the case of cpu voltage and temperature, the default is 29*54579826SDavid Howells * cpu0. If we need to know the info of cpu1, cpu2, cpu3, we need to 30*54579826SDavid Howells * pass in cpu number in ioctl() last parameter. For example, to 31*54579826SDavid Howells * get the voltage of cpu2: 32*54579826SDavid Howells * 33*54579826SDavid Howells * ioctlbuf[0] = 2; 34*54579826SDavid Howells * if (ioctl(fd, ENVCTRL_READ_CPU_VOLTAGE, ioctlbuf) < 0) 35*54579826SDavid Howells * printf("error\n"); 36*54579826SDavid Howells * ret = read(fd, buf, 10); 37*54579826SDavid Howells * 38*54579826SDavid Howells * All the return values are in ascii. So check read return value 39*54579826SDavid Howells * and do appropriate conversions in your application. 40*54579826SDavid Howells */ 41*54579826SDavid Howells 42*54579826SDavid Howells /* IOCTL commands */ 43*54579826SDavid Howells 44*54579826SDavid Howells /* Note: these commands reflect possible monitor features. 45*54579826SDavid Howells * Some boards choose to support some of the features only. 46*54579826SDavid Howells */ 47*54579826SDavid Howells #define ENVCTRL_RD_CPU_TEMPERATURE _IOR('p', 0x40, int) 48*54579826SDavid Howells #define ENVCTRL_RD_CPU_VOLTAGE _IOR('p', 0x41, int) 49*54579826SDavid Howells #define ENVCTRL_RD_FAN_STATUS _IOR('p', 0x42, int) 50*54579826SDavid Howells #define ENVCTRL_RD_WARNING_TEMPERATURE _IOR('p', 0x43, int) 51*54579826SDavid Howells #define ENVCTRL_RD_SHUTDOWN_TEMPERATURE _IOR('p', 0x44, int) 52*54579826SDavid Howells #define ENVCTRL_RD_VOLTAGE_STATUS _IOR('p', 0x45, int) 53*54579826SDavid Howells #define ENVCTRL_RD_SCSI_TEMPERATURE _IOR('p', 0x46, int) 54*54579826SDavid Howells #define ENVCTRL_RD_ETHERNET_TEMPERATURE _IOR('p', 0x47, int) 55*54579826SDavid Howells #define ENVCTRL_RD_MTHRBD_TEMPERATURE _IOR('p', 0x48, int) 56*54579826SDavid Howells 57*54579826SDavid Howells #define ENVCTRL_RD_GLOBALADDRESS _IOR('p', 0x49, int) 58*54579826SDavid Howells 59*54579826SDavid Howells /* Read return values for a voltage status request. */ 60*54579826SDavid Howells #define ENVCTRL_VOLTAGE_POWERSUPPLY_GOOD 0x01 61*54579826SDavid Howells #define ENVCTRL_VOLTAGE_BAD 0x02 62*54579826SDavid Howells #define ENVCTRL_POWERSUPPLY_BAD 0x03 63*54579826SDavid Howells #define ENVCTRL_VOLTAGE_POWERSUPPLY_BAD 0x04 64*54579826SDavid Howells 65*54579826SDavid Howells /* Read return values for a fan status request. 66*54579826SDavid Howells * A failure match means either the fan fails or 67*54579826SDavid Howells * the fan is not connected. Some boards have optional 68*54579826SDavid Howells * connectors to connect extra fans. 69*54579826SDavid Howells * 70*54579826SDavid Howells * There are maximum 8 monitor fans. Some are cpu fans 71*54579826SDavid Howells * some are system fans. The mask below only indicates 72*54579826SDavid Howells * fan by order number. 73*54579826SDavid Howells * Below is a sample application: 74*54579826SDavid Howells * 75*54579826SDavid Howells * if (ioctl(fd, ENVCTRL_READ_FAN_STATUS, 0) < 0) { 76*54579826SDavid Howells * printf("ioctl fan failed\n"); 77*54579826SDavid Howells * } 78*54579826SDavid Howells * if (read(fd, rslt, 1) <= 0) { 79*54579826SDavid Howells * printf("error or fan not monitored\n"); 80*54579826SDavid Howells * } else { 81*54579826SDavid Howells * if (rslt[0] == ENVCTRL_ALL_FANS_GOOD) { 82*54579826SDavid Howells * printf("all fans good\n"); 83*54579826SDavid Howells * } else if (rslt[0] == ENVCTRL_ALL_FANS_BAD) { 84*54579826SDavid Howells * printf("all fans bad\n"); 85*54579826SDavid Howells * } else { 86*54579826SDavid Howells * if (rslt[0] & ENVCTRL_FAN0_FAILURE_MASK) { 87*54579826SDavid Howells * printf("fan 0 failed or not connected\n"); 88*54579826SDavid Howells * } 89*54579826SDavid Howells * ...... 90*54579826SDavid Howells */ 91*54579826SDavid Howells 92*54579826SDavid Howells #define ENVCTRL_ALL_FANS_GOOD 0x00 93*54579826SDavid Howells #define ENVCTRL_FAN0_FAILURE_MASK 0x01 94*54579826SDavid Howells #define ENVCTRL_FAN1_FAILURE_MASK 0x02 95*54579826SDavid Howells #define ENVCTRL_FAN2_FAILURE_MASK 0x04 96*54579826SDavid Howells #define ENVCTRL_FAN3_FAILURE_MASK 0x08 97*54579826SDavid Howells #define ENVCTRL_FAN4_FAILURE_MASK 0x10 98*54579826SDavid Howells #define ENVCTRL_FAN5_FAILURE_MASK 0x20 99*54579826SDavid Howells #define ENVCTRL_FAN6_FAILURE_MASK 0x40 100*54579826SDavid Howells #define ENVCTRL_FAN7_FAILURE_MASK 0x80 101*54579826SDavid Howells #define ENVCTRL_ALL_FANS_BAD 0xFF 102*54579826SDavid Howells 103*54579826SDavid Howells #endif /* !(_SPARC64_ENVCTRL_H) */ 104