#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
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];
};
#define CMB_OSC_UUID "f18fc78b-0f15-4978-b793-53f833a1d35b"
#define CMB_OSC_GRANULARITY 0x01
#define CMB_OSC_WAKE_ON_LOW 0x02
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;
};
#define BTP_CLEAR_TRIP_POINT 0x00
#define BTM_CURRENT_RATE 0x00
#define BTM_RATE_TOO_LARGE 0x00
#define BTM_CRITICAL 0x00
#define BTM_UNKNOWN 0xffffffff
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
uint32_t bmd_quick_recalibrate_time;
#define BMD_UNKNOWN 0xffffffff
uint32_t bmd_slow_recalibrate_time;
};
#define BMC_AML_CALIBRATE 0x01
#define BMC_DISABLE_CHARGING 0x02
#define BMC_ALLOW_AC_DISCHARGE 0x04
#define PSR_OFFLINE 0x00
#define PSR_ONLINE 0x01
#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)
#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)
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));
struct acpi_grd {
uint8_t grd_descriptor;
uint16_t grd_length;
struct acpi_gas grd_gas;
} __packed;
struct acpicpu_pct {
struct acpi_grd pct_ctrl;
struct acpi_grd pct_status;
};
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;
bus_size_t sc_ec_sc;
bus_space_tag_t sc_cmd_bt;
bus_space_handle_t sc_cmd_bh;
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;
int units;
#define ACPISBS_UNITS_MW 0
#define ACPISBS_UNITS_MA 1
uint16_t at_rate;
uint16_t temperature;
uint16_t voltage;
uint16_t current;
uint16_t avg_current;
uint16_t rel_charge;
uint16_t abs_charge;
uint16_t capacity;
uint16_t full_capacity;
uint16_t run_time;
uint16_t avg_empty_time;
uint16_t avg_full_time;
uint16_t charge_current;
uint16_t charge_voltage;
uint16_t status;
uint16_t cycle_count;
uint16_t design_capacity;
uint16_t design_voltage;
uint16_t spec;
uint16_t manufacture_date;
uint16_t serial;
#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