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