src/sys/dev/acpi/acpidev.h
2024-08-08 20:49:23 +00:00

437 lines
11 KiB
C

/* $OpenBSD: acpidev.h,v 1.45 2024/08/06 17:38:56 kettenis Exp $ */
/*
* Copyright (c) 2005 Marco Peereboom <marco@openbsd.org>
* Copyright (c) 2005 Thorsten Lockert <tholo@sigmasoft.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef __DEV_ACPI_ACPIDEV_H__
#define __DEV_ACPI_ACPIDEV_H__
#include <sys/sensors.h>
#include <sys/rwlock.h>
#include <dev/acpi/acpireg.h>
#include <dev/acpi/smbus.h>
#define DEVNAME(s) ((s)->sc_dev.dv_xname)
#define ACPIDEV_NOPOLL 0x0000
#define ACPIDEV_POLL 0x0001
#define ACPIDEV_WAKEUP 0x0002
/*
* _BIF (Battery InFormation)
* Arguments: none
* Results : package _BIF (Battery InFormation)
* Package {
* // ASCIIZ is ASCII character string terminated with a 0x00.
* Power Unit //DWORD
* Design Capacity //DWORD
* Last Full Charge Capacity //DWORD
* Battery Technology //DWORD
* Design Voltage //DWORD
* Design Capacity of Warning //DWORD
* Design Capacity of Low //DWORD
* Battery Capacity Granularity 1 //DWORD
* Battery Capacity Granularity 2 //DWORD
* Model Number //ASCIIZ
* Serial Number //ASCIIZ
* Battery Type //ASCIIZ
* OEM Information //ASCIIZ
* }
*
* _BIX (Battery Information Extended)
* Arguments: none
* Results : package _BIX (Battery Information Extended)
* Package {
* // ASCIIZ is ASCII character string terminated with a 0x00.
* Revision //Integer
* Power Unit //DWORD
* Design Capacity //DWORD
* Last Full Charge Capacity //DWORD
* Battery Technology //DWORD
* Design Voltage //DWORD
* Design Capacity of Warning //DWORD
* Design Capacity of Low //DWORD
* Cycle Count //DWORD
* Measurement Accuracy //DWORD
* Max Sampling Time //DWORD
* Min Sampling Time //DWORD
* Max Averaging Interval //DWORD
* Min Averaging Interval //DWORD
* Battery Capacity Granularity 1 //DWORD
* Battery Capacity Granularity 2 //DWORD
* Model Number //ASCIIZ
* Serial Number //ASCIIZ
* Battery Type //ASCIIZ
* OEM Information //ASCIIZ
* }
*/
struct acpibat_bix {
uint8_t bix_revision;
uint32_t bix_power_unit;
#define BIX_POWER_MW 0x00
#define BIX_POWER_MA 0x01
uint32_t bix_capacity;
#define BIX_UNKNOWN 0xffffffff
uint32_t bix_last_capacity;
uint32_t bix_technology;
#define BIX_TECH_PRIMARY 0x00
#define BIX_TECH_SECONDARY 0x01
uint32_t bix_voltage;
uint32_t bix_warning;
uint32_t bix_low;
uint32_t bix_cycle_count;
uint32_t bix_accuracy;
uint32_t bix_max_sample;
uint32_t bix_min_sample;
uint32_t bix_max_avg;
uint32_t bix_min_avg;
uint32_t bix_cap_granu1;
uint32_t bix_cap_granu2;
char bix_model[20];
char bix_serial[20];
char bix_type[20];
char bix_oem[20];
};
/*
* _OSC Definition for Control Method Battery
* Arguments: none
* Results : DWORD flags
*/
#define CMB_OSC_UUID "f18fc78b-0f15-4978-b793-53f833a1d35b"
#define CMB_OSC_GRANULARITY 0x01
#define CMB_OSC_WAKE_ON_LOW 0x02
/*
* _BST (Battery STatus)
* Arguments: none
* Results : package _BST (Battery STatus)
* Package {
* Battery State //DWORD
* Battery Present Rate //DWORD
* Battery Remaining Capacity //DWORD
* Battery Present Voltage //DWORD
* }
*
* Per the spec section 10.2.2.3
* Remaining Battery Percentage[%] = (Battery Remaining Capacity [=0 ~ 100] /
* Last Full Charged Capacity[=100]) * 100
*
* Remaining Battery Life [h] = Battery Remaining Capacity [mAh/mWh] /
* Battery Present Rate [=0xFFFFFFFF] = unknown
*/
struct acpibat_bst {
uint32_t bst_state;
#define BST_DISCHARGE 0x01
#define BST_CHARGE 0x02
#define BST_CRITICAL 0x04
uint32_t bst_rate;
#define BST_UNKNOWN 0xffffffff
uint32_t bst_capacity;
uint32_t bst_voltage;
};
/*
* _BTP (Battery Trip Point)
* Arguments: DWORD level
* Results : none
*/
#define BTP_CLEAR_TRIP_POINT 0x00
/*
* _BTM (Battery TiMe)
* Arguments: DWORD rate of discharge
* Results : DWORD time in seconds or error/unknown
*/
#define BTM_CURRENT_RATE 0x00
#define BTM_RATE_TOO_LARGE 0x00
#define BTM_CRITICAL 0x00
#define BTM_UNKNOWN 0xffffffff
/*
* _BMD (Battery Maintenance Data)
* Arguments: none
* Results : package _BMD (Battery Maintenance Data)
* Package {
* Status Flags //DWORD
* Capability Flags //DWORD
* Recalibrate Count //DWORD
* Quick Recalibrate Time //DWORD
* Slow Recalibrate Time //DWORD
* }
*/
struct acpibat_bmd {
uint32_t bmd_status;
#define BMD_AML_CALIBRATE_CYCLE 0x01
#define BMD_CHARGING_DISABLED 0x02
#define BMD_DISCHARGE_WHILE_AC 0x04
#define BMD_RECALIBRATE_BAT 0x08
#define BMD_GOTO_STANDBY_SPEED 0x10
uint32_t bmd_capability;
#define BMD_CB_AML_CALIBRATION 0x01
#define BMD_CB_DISABLE_CHARGER 0x02
#define BMD_CB_DISCH_WHILE_AC 0x04
#define BMD_CB_AFFECT_ALL_BATT 0x08
#define BMD_CB_FULL_CHRG_FIRST 0x10
uint32_t bmd_recalibrate_count;
#define BMD_ONLY_CALIB_IF_ST3 0x00 /* only recal when status bit 3 set */
uint32_t bmd_quick_recalibrate_time;
#define BMD_UNKNOWN 0xffffffff
uint32_t bmd_slow_recalibrate_time;
};
/*
* _BMC (Battery Maintenance Control)
* Arguments: DWORD flags
* Results : none
*/
#define BMC_AML_CALIBRATE 0x01
#define BMC_DISABLE_CHARGING 0x02
#define BMC_ALLOW_AC_DISCHARGE 0x04
/* AC device */
/*
* _PSR (Power Source)
* Arguments: none
* Results : DWORD status
*/
#define PSR_OFFLINE 0x00
#define PSR_ONLINE 0x01
/*
* _PCL (Power Consumer List)
* Arguments: none
* Results : LIST of Power Class pointers
*/
/* hpet device */
#define HPET_REG_SIZE 1024
#define HPET_CAPABILITIES 0x000
#define HPET_CONFIGURATION 0x010
#define HPET_INTERRUPT_STATUS 0x020
#define HPET_MAIN_COUNTER 0x0F0
#define HPET_TIMER0_CONFIG 0x100
#define HPET_TIMER0_COMPARE 0x108
#define HPET_TIMER0_INTERRUPT 0x110
#define HPET_TIMER1_CONFIG ((0x20 * 1) + HPET_TIMER0_CONFIG)
#define HPET_TIMER1_COMPARE ((0x20 * 1) + HPET_TIMER0_COMPARE)
#define HPET_TIMER1_INTERRUPT ((0x20 * 1) + HPET_TIMER0_INTERRUPT)
#define HPET_TIMER2_CONFIG ((0x20 * 2) + HPET_TIMER0_CONFIG)
#define HPET_TIMER2_COMPARE ((0x20 * 2) + HPET_TIMER0_COMPARE)
#define HPET_TIMER2_INTERRUPT ((0x20 * 2) + HPET_TIMER0_INTERRUPT)
/* Max period is 10^8 fs (100 ns) == 0x5F5E100 as per the HPET SDM */
#define HPET_MAX_PERIOD 0x5F5E100
#define STA_PRESENT (1L << 0)
#define STA_ENABLED (1L << 1)
#define STA_SHOW_UI (1L << 2)
#define STA_DEV_OK (1L << 3)
#define STA_BATTERY (1L << 4)
/*
* _PSS (Performance Supported States)
* Arguments: none
* Results : package _PSS (Performance Supported States)
* Package {
* CoreFreq //DWORD
* Power //DWORD
* TransitionLatency //DWORD
* BusMasterLatency //DWORD
* Control //DWORD
* Status //DWORD
* }
*/
struct acpicpu_pss {
uint32_t pss_core_freq;
uint32_t pss_power;
uint32_t pss_trans_latency;
uint32_t pss_bus_latency;
uint32_t pss_ctrl;
uint32_t pss_status;
};
int acpicpu_fetch_pss(struct acpicpu_pss **);
void acpicpu_set_notify(void (*)(struct acpicpu_pss *, int));
/*
* XXX this is returned in a buffer and is not a "natural" type.
*
* GRD (Generic Register Descriptor )
*
*/
struct acpi_grd {
uint8_t grd_descriptor;
uint16_t grd_length;
struct acpi_gas grd_gas;
} __packed;
/*
* _PCT (Performance Control )
* Arguments: none
* Results : package _PCT (Performance Control)
* Package {
* Perf_Ctrl_register //Register
* Perf_Status_register //Register
* }
*/
struct acpicpu_pct {
struct acpi_grd pct_ctrl;
struct acpi_grd pct_status;
};
/* softc for fake apm devices */
struct acpiac_softc {
struct device sc_dev;
struct acpi_softc *sc_acpi;
struct aml_node *sc_devnode;
int sc_ac_stat;
struct ksensor sc_sens[1];
struct ksensordev sc_sensdev;
};
struct acpibat_softc {
struct device sc_dev;
struct acpi_softc *sc_acpi;
struct aml_node *sc_devnode;
struct acpibat_bix sc_bix;
int sc_use_bif;
struct acpibat_bst sc_bst;
volatile int sc_bat_present;
struct ksensor sc_sens[10];
struct ksensordev sc_sensdev;
};
TAILQ_HEAD(aml_nodelisth, aml_nodelist);
struct acpidock_softc {
struct device sc_dev;
struct acpi_softc *sc_acpi;
struct aml_node *sc_devnode;
struct aml_nodelisth sc_deps_h;
struct aml_nodelist *sc_deps;
struct ksensor sc_sens;
struct ksensordev sc_sensdev;
int sc_docked;
int sc_sta;
#define ACPIDOCK_STATUS_UNKNOWN -1
#define ACPIDOCK_STATUS_UNDOCKED 0
#define ACPIDOCK_STATUS_DOCKED 1
};
#define ACPIDOCK_EVENT_INSERT 0
#define ACPIDOCK_EVENT_DEVCHECK 1
#define ACPIDOCK_EVENT_EJECT 3
#define ACPIEC_MAX_EVENTS 256
struct acpiec_event {
struct aml_node *event;
};
struct acpiec_softc {
struct device sc_dev;
int sc_ecbusy;
/* command/status register */
bus_size_t sc_ec_sc;
bus_space_tag_t sc_cmd_bt;
bus_space_handle_t sc_cmd_bh;
/* data register */
bus_size_t sc_ec_data;
bus_space_tag_t sc_data_bt;
bus_space_handle_t sc_data_bh;
struct acpi_softc *sc_acpi;
struct aml_node *sc_devnode;
uint32_t sc_gpe;
struct acpiec_event sc_events[ACPIEC_MAX_EVENTS];
int sc_gotsci;
int sc_glk;
int sc_cantburst;
};
void acpibtn_disable_psw(void);
void acpibtn_enable_psw(void);
int acpibtn_numopenlids(void);
struct acpisbs_battery {
uint16_t mode; /* bit flags */
int units;
#define ACPISBS_UNITS_MW 0
#define ACPISBS_UNITS_MA 1
uint16_t at_rate; /* mAh or mWh */
uint16_t temperature; /* 0.1 degK */
uint16_t voltage; /* mV */
uint16_t current; /* mA */
uint16_t avg_current; /* mA */
uint16_t rel_charge; /* percent of last_capacity */
uint16_t abs_charge; /* percent of design_capacity */
uint16_t capacity; /* mAh */
uint16_t full_capacity; /* mAh, when fully charged */
uint16_t run_time; /* minutes */
uint16_t avg_empty_time; /* minutes */
uint16_t avg_full_time; /* minutes until full */
uint16_t charge_current; /* mA */
uint16_t charge_voltage; /* mV */
uint16_t status; /* bit flags */
uint16_t cycle_count; /* cycles */
uint16_t design_capacity; /* mAh */
uint16_t design_voltage; /* mV */
uint16_t spec; /* formatted */
uint16_t manufacture_date; /* formatted */
uint16_t serial; /* number */
#define ACPISBS_VALUE_UNKNOWN 65535
char manufacturer[SMBUS_DATA_SIZE];
char device_name[SMBUS_DATA_SIZE];
char device_chemistry[SMBUS_DATA_SIZE];
char oem_data[SMBUS_DATA_SIZE];
};
struct acpisbs_softc {
struct device sc_dev;
struct acpi_softc *sc_acpi;
struct aml_node *sc_devnode;
struct acpiec_softc *sc_ec;
uint8_t sc_ec_base;
struct acpisbs_battery sc_battery;
int sc_batteries_present;
struct ksensor *sc_sensors;
struct ksensordev sc_sensordev;
struct sensor_task *sc_sensor_task;
struct timeval sc_lastpoll;
};
#endif /* __DEV_ACPI_ACPIDEV_H__ */