1 /* $OpenBSD: acpidev.h,v 1.44 2018/06/29 17:39:18 kettenis Exp $ */ 2 /* 3 * Copyright (c) 2005 Marco Peereboom <marco@openbsd.org> 4 * Copyright (c) 2005 Thorsten Lockert <tholo@sigmasoft.com> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #ifndef __DEV_ACPI_ACPIDEV_H__ 20 #define __DEV_ACPI_ACPIDEV_H__ 21 22 #include <sys/sensors.h> 23 #include <sys/rwlock.h> 24 #include <dev/acpi/acpireg.h> 25 #include <dev/acpi/smbus.h> 26 27 #define DEVNAME(s) ((s)->sc_dev.dv_xname) 28 29 #define ACPIDEV_NOPOLL 0 30 #define ACPIDEV_POLL 1 31 32 /* 33 * _BIF (Battery InFormation) 34 * Arguments: none 35 * Results : package _BIF (Battery InFormation) 36 * Package { 37 * // ASCIIZ is ASCII character string terminated with a 0x00. 38 * Power Unit //DWORD 39 * Design Capacity //DWORD 40 * Last Full Charge Capacity //DWORD 41 * Battery Technology //DWORD 42 * Design Voltage //DWORD 43 * Design Capacity of Warning //DWORD 44 * Design Capacity of Low //DWORD 45 * Battery Capacity Granularity 1 //DWORD 46 * Battery Capacity Granularity 2 //DWORD 47 * Model Number //ASCIIZ 48 * Serial Number //ASCIIZ 49 * Battery Type //ASCIIZ 50 * OEM Information //ASCIIZ 51 * } 52 * 53 * _BIX (Battery Information Extended) 54 * Arguments: none 55 * Results : package _BIX (Battery Information Extended) 56 * Package { 57 * // ASCIIZ is ASCII character string terminated with a 0x00. 58 * Revision //Integer 59 * Power Unit //DWORD 60 * Design Capacity //DWORD 61 * Last Full Charge Capacity //DWORD 62 * Battery Technology //DWORD 63 * Design Voltage //DWORD 64 * Design Capacity of Warning //DWORD 65 * Design Capacity of Low //DWORD 66 * Cycle Count //DWORD 67 * Measurement Accuracy //DWORD 68 * Max Sampling Time //DWORD 69 * Min Sampling Time //DWORD 70 * Max Averaging Interval //DWORD 71 * Min Averaging Interval //DWORD 72 * Battery Capacity Granularity 1 //DWORD 73 * Battery Capacity Granularity 2 //DWORD 74 * Model Number //ASCIIZ 75 * Serial Number //ASCIIZ 76 * Battery Type //ASCIIZ 77 * OEM Information //ASCIIZ 78 * } 79 */ 80 struct acpibat_bix { 81 uint8_t bix_revision; 82 uint32_t bix_power_unit; 83 #define BIX_POWER_MW 0x00 84 #define BIX_POWER_MA 0x01 85 uint32_t bix_capacity; 86 #define BIX_UNKNOWN 0xffffffff 87 uint32_t bix_last_capacity; 88 uint32_t bix_technology; 89 #define BIX_TECH_PRIMARY 0x00 90 #define BIX_TECH_SECONDARY 0x01 91 uint32_t bix_voltage; 92 uint32_t bix_warning; 93 uint32_t bix_low; 94 uint32_t bix_cycle_count; 95 uint32_t bix_accuracy; 96 uint32_t bix_max_sample; 97 uint32_t bix_min_sample; 98 uint32_t bix_max_avg; 99 uint32_t bix_min_avg; 100 uint32_t bix_cap_granu1; 101 uint32_t bix_cap_granu2; 102 char bix_model[20]; 103 char bix_serial[20]; 104 char bix_type[20]; 105 char bix_oem[20]; 106 }; 107 108 /* 109 * _OSC Definition for Control Method Battery 110 * Arguments: none 111 * Results : DWORD flags 112 */ 113 #define CMB_OSC_UUID "f18fc78b-0f15-4978-b793-53f833a1d35b" 114 #define CMB_OSC_GRANULARITY 0x01 115 #define CMB_OSC_WAKE_ON_LOW 0x02 116 117 /* 118 * _BST (Battery STatus) 119 * Arguments: none 120 * Results : package _BST (Battery STatus) 121 * Package { 122 * Battery State //DWORD 123 * Battery Present Rate //DWORD 124 * Battery Remaining Capacity //DWORD 125 * Battery Present Voltage //DWORD 126 * } 127 * 128 * Per the spec section 10.2.2.3 129 * Remaining Battery Percentage[%] = (Battery Remaining Capacity [=0 ~ 100] / 130 * Last Full Charged Capacity[=100]) * 100 131 * 132 * Remaining Battery Life [h] = Battery Remaining Capacity [mAh/mWh] / 133 * Battery Present Rate [=0xFFFFFFFF] = unknown 134 */ 135 struct acpibat_bst { 136 uint32_t bst_state; 137 #define BST_DISCHARGE 0x01 138 #define BST_CHARGE 0x02 139 #define BST_CRITICAL 0x04 140 uint32_t bst_rate; 141 #define BST_UNKNOWN 0xffffffff 142 uint32_t bst_capacity; 143 uint32_t bst_voltage; 144 }; 145 146 /* 147 * _BTP (Battery Trip Point) 148 * Arguments: DWORD level 149 * Results : none 150 */ 151 #define BTP_CLEAR_TRIP_POINT 0x00 152 153 /* 154 * _BTM (Battery TiMe) 155 * Arguments: DWORD rate of discharge 156 * Results : DWORD time in seconds or error/unknown 157 */ 158 #define BTM_CURRENT_RATE 0x00 159 160 #define BTM_RATE_TOO_LARGE 0x00 161 #define BTM_CRITICAL 0x00 162 #define BTM_UNKNOWN 0xffffffff 163 164 /* 165 * _BMD (Battery Maintenance Data) 166 * Arguments: none 167 * Results : package _BMD (Battery Maintenance Data) 168 * Package { 169 * Status Flags //DWORD 170 * Capability Flags //DWORD 171 * Recalibrate Count //DWORD 172 * Quick Recalibrate Time //DWORD 173 * Slow Recalibrate Time //DWORD 174 * } 175 */ 176 struct acpibat_bmd { 177 uint32_t bmd_status; 178 #define BMD_AML_CALIBRATE_CYCLE 0x01 179 #define BMD_CHARGING_DISABLED 0x02 180 #define BMD_DISCHARGE_WHILE_AC 0x04 181 #define BMD_RECALIBRATE_BAT 0x08 182 #define BMD_GOTO_STANDBY_SPEED 0x10 183 uint32_t bmd_capability; 184 #define BMD_CB_AML_CALIBRATION 0x01 185 #define BMD_CB_DISABLE_CHARGER 0x02 186 #define BMD_CB_DISCH_WHILE_AC 0x04 187 #define BMD_CB_AFFECT_ALL_BATT 0x08 188 #define BMD_CB_FULL_CHRG_FIRST 0x10 189 uint32_t bmd_recalibrate_count; 190 #define BMD_ONLY_CALIB_IF_ST3 0x00 /* only recal when status bit 3 set */ 191 uint32_t bmd_quick_recalibrate_time; 192 #define BMD_UNKNOWN 0xffffffff 193 uint32_t bmd_slow_recalibrate_time; 194 }; 195 196 /* 197 * _BMC (Battery Maintenance Control) 198 * Arguments: DWORD flags 199 * Results : none 200 */ 201 #define BMC_AML_CALIBRATE 0x01 202 #define BMC_DISABLE_CHARGING 0x02 203 #define BMC_ALLOW_AC_DISCHARGE 0x04 204 205 /* AC device */ 206 /* 207 * _PSR (Power Source) 208 * Arguments: none 209 * Results : DWORD status 210 */ 211 #define PSR_OFFLINE 0x00 212 #define PSR_ONLINE 0x01 213 214 /* 215 * _PCL (Power Consumer List) 216 * Arguments: none 217 * Results : LIST of Power Class pointers 218 */ 219 220 /* hpet device */ 221 #define HPET_REG_SIZE 1024 222 223 #define HPET_CAPABILITIES 0x000 224 #define HPET_CONFIGURATION 0x010 225 #define HPET_INTERRUPT_STATUS 0x020 226 #define HPET_MAIN_COUNTER 0x0F0 227 #define HPET_TIMER0_CONFIG 0x100 228 #define HPET_TIMER0_COMPARE 0x108 229 #define HPET_TIMER0_INTERRUPT 0x110 230 #define HPET_TIMER1_CONFIG ((0x20 * 1) + HPET_TIMER0_CONFIG) 231 #define HPET_TIMER1_COMPARE ((0x20 * 1) + HPET_TIMER0_COMPARE) 232 #define HPET_TIMER1_INTERRUPT ((0x20 * 1) + HPET_TIMER0_INTERRUPT) 233 #define HPET_TIMER2_CONFIG ((0x20 * 2) + HPET_TIMER0_CONFIG) 234 #define HPET_TIMER2_COMPARE ((0x20 * 2) + HPET_TIMER0_COMPARE) 235 #define HPET_TIMER2_INTERRUPT ((0x20 * 2) + HPET_TIMER0_INTERRUPT) 236 237 /* Max period is 10^8 fs (100 ns) == 0x5F5E100 as per the HPET SDM */ 238 #define HPET_MAX_PERIOD 0x5F5E100 239 240 #define STA_PRESENT (1L << 0) 241 #define STA_ENABLED (1L << 1) 242 #define STA_SHOW_UI (1L << 2) 243 #define STA_DEV_OK (1L << 3) 244 #define STA_BATTERY (1L << 4) 245 246 /* 247 * _PSS (Performance Supported States) 248 * Arguments: none 249 * Results : package _PSS (Performance Supported States) 250 * Package { 251 * CoreFreq //DWORD 252 * Power //DWORD 253 * TransitionLatency //DWORD 254 * BusMasterLatency //DWORD 255 * Control //DWORD 256 * Status //DWORD 257 * } 258 */ 259 struct acpicpu_pss { 260 uint32_t pss_core_freq; 261 uint32_t pss_power; 262 uint32_t pss_trans_latency; 263 uint32_t pss_bus_latency; 264 uint32_t pss_ctrl; 265 uint32_t pss_status; 266 }; 267 268 int acpicpu_fetch_pss(struct acpicpu_pss **); 269 void acpicpu_set_notify(void (*)(struct acpicpu_pss *, int)); 270 /* 271 * XXX this is returned in a buffer and is not a "natural" type. 272 * 273 * GRD (Generic Register Descriptor ) 274 * 275 */ 276 struct acpi_grd { 277 uint8_t grd_descriptor; 278 uint16_t grd_length; 279 struct acpi_gas grd_gas; 280 } __packed; 281 282 /* 283 * _PCT (Performance Control ) 284 * Arguments: none 285 * Results : package _PCT (Performance Control) 286 * Package { 287 * Perf_Ctrl_register //Register 288 * Perf_Status_register //Register 289 * } 290 */ 291 struct acpicpu_pct { 292 struct acpi_grd pct_ctrl; 293 struct acpi_grd pct_status; 294 }; 295 296 /* softc for fake apm devices */ 297 struct acpiac_softc { 298 struct device sc_dev; 299 300 struct acpi_softc *sc_acpi; 301 struct aml_node *sc_devnode; 302 303 int sc_ac_stat; 304 305 struct ksensor sc_sens[1]; 306 struct ksensordev sc_sensdev; 307 }; 308 309 struct acpibat_softc { 310 struct device sc_dev; 311 312 struct acpi_softc *sc_acpi; 313 struct aml_node *sc_devnode; 314 315 struct acpibat_bix sc_bix; 316 int sc_use_bif; 317 struct acpibat_bst sc_bst; 318 volatile int sc_bat_present; 319 320 struct ksensor sc_sens[10]; 321 struct ksensordev sc_sensdev; 322 }; 323 324 TAILQ_HEAD(aml_nodelisth, aml_nodelist); 325 326 struct acpidock_softc { 327 struct device sc_dev; 328 329 struct acpi_softc *sc_acpi; 330 struct aml_node *sc_devnode; 331 332 struct aml_nodelisth sc_deps_h; 333 struct aml_nodelist *sc_deps; 334 335 struct ksensor sc_sens; 336 struct ksensordev sc_sensdev; 337 338 int sc_docked; 339 int sc_sta; 340 341 #define ACPIDOCK_STATUS_UNKNOWN -1 342 #define ACPIDOCK_STATUS_UNDOCKED 0 343 #define ACPIDOCK_STATUS_DOCKED 1 344 }; 345 346 #define ACPIDOCK_EVENT_INSERT 0 347 #define ACPIDOCK_EVENT_DEVCHECK 1 348 #define ACPIDOCK_EVENT_EJECT 3 349 350 #define ACPIEC_MAX_EVENTS 256 351 352 struct acpiec_event { 353 struct aml_node *event; 354 }; 355 356 struct acpiec_softc { 357 struct device sc_dev; 358 359 int sc_ecbusy; 360 361 /* command/status register */ 362 bus_size_t sc_ec_sc; 363 bus_space_tag_t sc_cmd_bt; 364 bus_space_handle_t sc_cmd_bh; 365 366 /* data register */ 367 bus_size_t sc_ec_data; 368 bus_space_tag_t sc_data_bt; 369 bus_space_handle_t sc_data_bh; 370 371 struct acpi_softc *sc_acpi; 372 struct aml_node *sc_devnode; 373 uint32_t sc_gpe; 374 struct acpiec_event sc_events[ACPIEC_MAX_EVENTS]; 375 int sc_gotsci; 376 int sc_glk; 377 int sc_cantburst; 378 }; 379 380 void acpibtn_disable_psw(void); 381 void acpibtn_enable_psw(void); 382 int acpibtn_numopenlids(void); 383 384 struct acpisbs_battery { 385 uint16_t mode; /* bit flags */ 386 int units; 387 #define ACPISBS_UNITS_MW 0 388 #define ACPISBS_UNITS_MA 1 389 uint16_t at_rate; /* mAh or mWh */ 390 uint16_t temperature; /* 0.1 degK */ 391 uint16_t voltage; /* mV */ 392 uint16_t current; /* mA */ 393 uint16_t avg_current; /* mA */ 394 uint16_t rel_charge; /* percent of last_capacity */ 395 uint16_t abs_charge; /* percent of design_capacity */ 396 uint16_t capacity; /* mAh */ 397 uint16_t full_capacity; /* mAh, when fully charged */ 398 uint16_t run_time; /* minutes */ 399 uint16_t avg_empty_time; /* minutes */ 400 uint16_t avg_full_time; /* minutes until full */ 401 uint16_t charge_current; /* mA */ 402 uint16_t charge_voltage; /* mV */ 403 uint16_t status; /* bit flags */ 404 uint16_t cycle_count; /* cycles */ 405 uint16_t design_capacity; /* mAh */ 406 uint16_t design_voltage; /* mV */ 407 uint16_t spec; /* formatted */ 408 uint16_t manufacture_date; /* formatted */ 409 uint16_t serial; /* number */ 410 411 #define ACPISBS_VALUE_UNKNOWN 65535 412 413 char manufacturer[SMBUS_DATA_SIZE]; 414 char device_name[SMBUS_DATA_SIZE]; 415 char device_chemistry[SMBUS_DATA_SIZE]; 416 char oem_data[SMBUS_DATA_SIZE]; 417 }; 418 419 struct acpisbs_softc { 420 struct device sc_dev; 421 422 struct acpi_softc *sc_acpi; 423 struct aml_node *sc_devnode; 424 struct acpiec_softc *sc_ec; 425 uint8_t sc_ec_base; 426 427 struct acpisbs_battery sc_battery; 428 int sc_batteries_present; 429 430 struct ksensor *sc_sensors; 431 struct ksensordev sc_sensordev; 432 struct sensor_task *sc_sensor_task; 433 struct timeval sc_lastpoll; 434 }; 435 436 #endif /* __DEV_ACPI_ACPIDEV_H__ */ 437