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