1*4882a593Smuzhiyun #ifndef _LINUX_APM_H 2*4882a593Smuzhiyun #define _LINUX_APM_H 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun /* 5*4882a593Smuzhiyun * Include file for the interface to an APM BIOS 6*4882a593Smuzhiyun * Copyright 1994-2001 Stephen Rothwell (sfr@canb.auug.org.au) 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/types.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun typedef unsigned short apm_event_t; 14*4882a593Smuzhiyun typedef unsigned short apm_eventinfo_t; 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun struct apm_bios_info { 17*4882a593Smuzhiyun __u16 version; 18*4882a593Smuzhiyun __u16 cseg; 19*4882a593Smuzhiyun __u32 offset; 20*4882a593Smuzhiyun __u16 cseg_16; 21*4882a593Smuzhiyun __u16 dseg; 22*4882a593Smuzhiyun __u16 flags; 23*4882a593Smuzhiyun __u16 cseg_len; 24*4882a593Smuzhiyun __u16 cseg_16_len; 25*4882a593Smuzhiyun __u16 dseg_len; 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #ifdef __KERNEL__ 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #define APM_CS (GDT_ENTRY_APMBIOS_BASE * 8) 31*4882a593Smuzhiyun #define APM_CS_16 (APM_CS + 8) 32*4882a593Smuzhiyun #define APM_DS (APM_CS_16 + 8) 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* Results of APM Installation Check */ 35*4882a593Smuzhiyun #define APM_16_BIT_SUPPORT 0x0001 36*4882a593Smuzhiyun #define APM_32_BIT_SUPPORT 0x0002 37*4882a593Smuzhiyun #define APM_IDLE_SLOWS_CLOCK 0x0004 38*4882a593Smuzhiyun #define APM_BIOS_DISABLED 0x0008 39*4882a593Smuzhiyun #define APM_BIOS_DISENGAGED 0x0010 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* 42*4882a593Smuzhiyun * Data for APM that is persistent across module unload/load 43*4882a593Smuzhiyun */ 44*4882a593Smuzhiyun struct apm_info { 45*4882a593Smuzhiyun struct apm_bios_info bios; 46*4882a593Smuzhiyun unsigned short connection_version; 47*4882a593Smuzhiyun int get_power_status_broken; 48*4882a593Smuzhiyun int get_power_status_swabinminutes; 49*4882a593Smuzhiyun int allow_ints; 50*4882a593Smuzhiyun int forbid_idle; 51*4882a593Smuzhiyun int realmode_power_off; 52*4882a593Smuzhiyun int disabled; 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun /* 56*4882a593Smuzhiyun * The APM function codes 57*4882a593Smuzhiyun */ 58*4882a593Smuzhiyun #define APM_FUNC_INST_CHECK 0x5300 59*4882a593Smuzhiyun #define APM_FUNC_REAL_CONN 0x5301 60*4882a593Smuzhiyun #define APM_FUNC_16BIT_CONN 0x5302 61*4882a593Smuzhiyun #define APM_FUNC_32BIT_CONN 0x5303 62*4882a593Smuzhiyun #define APM_FUNC_DISCONN 0x5304 63*4882a593Smuzhiyun #define APM_FUNC_IDLE 0x5305 64*4882a593Smuzhiyun #define APM_FUNC_BUSY 0x5306 65*4882a593Smuzhiyun #define APM_FUNC_SET_STATE 0x5307 66*4882a593Smuzhiyun #define APM_FUNC_ENABLE_PM 0x5308 67*4882a593Smuzhiyun #define APM_FUNC_RESTORE_BIOS 0x5309 68*4882a593Smuzhiyun #define APM_FUNC_GET_STATUS 0x530a 69*4882a593Smuzhiyun #define APM_FUNC_GET_EVENT 0x530b 70*4882a593Smuzhiyun #define APM_FUNC_GET_STATE 0x530c 71*4882a593Smuzhiyun #define APM_FUNC_ENABLE_DEV_PM 0x530d 72*4882a593Smuzhiyun #define APM_FUNC_VERSION 0x530e 73*4882a593Smuzhiyun #define APM_FUNC_ENGAGE_PM 0x530f 74*4882a593Smuzhiyun #define APM_FUNC_GET_CAP 0x5310 75*4882a593Smuzhiyun #define APM_FUNC_RESUME_TIMER 0x5311 76*4882a593Smuzhiyun #define APM_FUNC_RESUME_ON_RING 0x5312 77*4882a593Smuzhiyun #define APM_FUNC_TIMER 0x5313 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* 80*4882a593Smuzhiyun * Function code for APM_FUNC_RESUME_TIMER 81*4882a593Smuzhiyun */ 82*4882a593Smuzhiyun #define APM_FUNC_DISABLE_TIMER 0 83*4882a593Smuzhiyun #define APM_FUNC_GET_TIMER 1 84*4882a593Smuzhiyun #define APM_FUNC_SET_TIMER 2 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* 87*4882a593Smuzhiyun * Function code for APM_FUNC_RESUME_ON_RING 88*4882a593Smuzhiyun */ 89*4882a593Smuzhiyun #define APM_FUNC_DISABLE_RING 0 90*4882a593Smuzhiyun #define APM_FUNC_ENABLE_RING 1 91*4882a593Smuzhiyun #define APM_FUNC_GET_RING 2 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /* 94*4882a593Smuzhiyun * Function code for APM_FUNC_TIMER_STATUS 95*4882a593Smuzhiyun */ 96*4882a593Smuzhiyun #define APM_FUNC_TIMER_DISABLE 0 97*4882a593Smuzhiyun #define APM_FUNC_TIMER_ENABLE 1 98*4882a593Smuzhiyun #define APM_FUNC_TIMER_GET 2 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /* 101*4882a593Smuzhiyun * in arch/i386/kernel/setup.c 102*4882a593Smuzhiyun */ 103*4882a593Smuzhiyun extern struct apm_info apm_info; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun #endif /* __KERNEL__ */ 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun /* 108*4882a593Smuzhiyun * Power states 109*4882a593Smuzhiyun */ 110*4882a593Smuzhiyun #define APM_STATE_READY 0x0000 111*4882a593Smuzhiyun #define APM_STATE_STANDBY 0x0001 112*4882a593Smuzhiyun #define APM_STATE_SUSPEND 0x0002 113*4882a593Smuzhiyun #define APM_STATE_OFF 0x0003 114*4882a593Smuzhiyun #define APM_STATE_BUSY 0x0004 115*4882a593Smuzhiyun #define APM_STATE_REJECT 0x0005 116*4882a593Smuzhiyun #define APM_STATE_OEM_SYS 0x0020 117*4882a593Smuzhiyun #define APM_STATE_OEM_DEV 0x0040 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun #define APM_STATE_DISABLE 0x0000 120*4882a593Smuzhiyun #define APM_STATE_ENABLE 0x0001 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun #define APM_STATE_DISENGAGE 0x0000 123*4882a593Smuzhiyun #define APM_STATE_ENGAGE 0x0001 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* 126*4882a593Smuzhiyun * Events (results of Get PM Event) 127*4882a593Smuzhiyun */ 128*4882a593Smuzhiyun #define APM_SYS_STANDBY 0x0001 129*4882a593Smuzhiyun #define APM_SYS_SUSPEND 0x0002 130*4882a593Smuzhiyun #define APM_NORMAL_RESUME 0x0003 131*4882a593Smuzhiyun #define APM_CRITICAL_RESUME 0x0004 132*4882a593Smuzhiyun #define APM_LOW_BATTERY 0x0005 133*4882a593Smuzhiyun #define APM_POWER_STATUS_CHANGE 0x0006 134*4882a593Smuzhiyun #define APM_UPDATE_TIME 0x0007 135*4882a593Smuzhiyun #define APM_CRITICAL_SUSPEND 0x0008 136*4882a593Smuzhiyun #define APM_USER_STANDBY 0x0009 137*4882a593Smuzhiyun #define APM_USER_SUSPEND 0x000a 138*4882a593Smuzhiyun #define APM_STANDBY_RESUME 0x000b 139*4882a593Smuzhiyun #define APM_CAPABILITY_CHANGE 0x000c 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun /* 142*4882a593Smuzhiyun * Error codes 143*4882a593Smuzhiyun */ 144*4882a593Smuzhiyun #define APM_SUCCESS 0x00 145*4882a593Smuzhiyun #define APM_DISABLED 0x01 146*4882a593Smuzhiyun #define APM_CONNECTED 0x02 147*4882a593Smuzhiyun #define APM_NOT_CONNECTED 0x03 148*4882a593Smuzhiyun #define APM_16_CONNECTED 0x05 149*4882a593Smuzhiyun #define APM_16_UNSUPPORTED 0x06 150*4882a593Smuzhiyun #define APM_32_CONNECTED 0x07 151*4882a593Smuzhiyun #define APM_32_UNSUPPORTED 0x08 152*4882a593Smuzhiyun #define APM_BAD_DEVICE 0x09 153*4882a593Smuzhiyun #define APM_BAD_PARAM 0x0a 154*4882a593Smuzhiyun #define APM_NOT_ENGAGED 0x0b 155*4882a593Smuzhiyun #define APM_BAD_FUNCTION 0x0c 156*4882a593Smuzhiyun #define APM_RESUME_DISABLED 0x0d 157*4882a593Smuzhiyun #define APM_NO_ERROR 0x53 158*4882a593Smuzhiyun #define APM_BAD_STATE 0x60 159*4882a593Smuzhiyun #define APM_NO_EVENTS 0x80 160*4882a593Smuzhiyun #define APM_NOT_PRESENT 0x86 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun /* 163*4882a593Smuzhiyun * APM Device IDs 164*4882a593Smuzhiyun */ 165*4882a593Smuzhiyun #define APM_DEVICE_BIOS 0x0000 166*4882a593Smuzhiyun #define APM_DEVICE_ALL 0x0001 167*4882a593Smuzhiyun #define APM_DEVICE_DISPLAY 0x0100 168*4882a593Smuzhiyun #define APM_DEVICE_STORAGE 0x0200 169*4882a593Smuzhiyun #define APM_DEVICE_PARALLEL 0x0300 170*4882a593Smuzhiyun #define APM_DEVICE_SERIAL 0x0400 171*4882a593Smuzhiyun #define APM_DEVICE_NETWORK 0x0500 172*4882a593Smuzhiyun #define APM_DEVICE_PCMCIA 0x0600 173*4882a593Smuzhiyun #define APM_DEVICE_BATTERY 0x8000 174*4882a593Smuzhiyun #define APM_DEVICE_OEM 0xe000 175*4882a593Smuzhiyun #define APM_DEVICE_OLD_ALL 0xffff 176*4882a593Smuzhiyun #define APM_DEVICE_CLASS 0x00ff 177*4882a593Smuzhiyun #define APM_DEVICE_MASK 0xff00 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun #ifdef __KERNEL__ 180*4882a593Smuzhiyun /* 181*4882a593Smuzhiyun * This is the "All Devices" ID communicated to the BIOS 182*4882a593Smuzhiyun */ 183*4882a593Smuzhiyun #define APM_DEVICE_BALL ((apm_info.connection_version > 0x0100) ? \ 184*4882a593Smuzhiyun APM_DEVICE_ALL : APM_DEVICE_OLD_ALL) 185*4882a593Smuzhiyun #endif 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun /* 188*4882a593Smuzhiyun * Battery status 189*4882a593Smuzhiyun */ 190*4882a593Smuzhiyun #define APM_MAX_BATTERIES 2 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun /* 193*4882a593Smuzhiyun * APM defined capability bit flags 194*4882a593Smuzhiyun */ 195*4882a593Smuzhiyun #define APM_CAP_GLOBAL_STANDBY 0x0001 196*4882a593Smuzhiyun #define APM_CAP_GLOBAL_SUSPEND 0x0002 197*4882a593Smuzhiyun #define APM_CAP_RESUME_STANDBY_TIMER 0x0004 /* Timer resume from standby */ 198*4882a593Smuzhiyun #define APM_CAP_RESUME_SUSPEND_TIMER 0x0008 /* Timer resume from suspend */ 199*4882a593Smuzhiyun #define APM_CAP_RESUME_STANDBY_RING 0x0010 /* Resume on Ring fr standby */ 200*4882a593Smuzhiyun #define APM_CAP_RESUME_SUSPEND_RING 0x0020 /* Resume on Ring fr suspend */ 201*4882a593Smuzhiyun #define APM_CAP_RESUME_STANDBY_PCMCIA 0x0040 /* Resume on PCMCIA Ring */ 202*4882a593Smuzhiyun #define APM_CAP_RESUME_SUSPEND_PCMCIA 0x0080 /* Resume on PCMCIA Ring */ 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun /* 205*4882a593Smuzhiyun * ioctl operations 206*4882a593Smuzhiyun */ 207*4882a593Smuzhiyun #include <linux/ioctl.h> 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun #define APM_IOC_STANDBY _IO('A', 1) 210*4882a593Smuzhiyun #define APM_IOC_SUSPEND _IO('A', 2) 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun #endif /* LINUX_APM_H */ 213