root/dev/acpi/acpivar.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: acpivar.h,v 1.36 2007/05/31 17:49:16 gwk Exp $        */
    2 /*
    3  * Copyright (c) 2005 Thorsten Lockert <tholo@sigmasoft.com>
    4  *
    5  * Permission to use, copy, modify, and distribute this software for any
    6  * purpose with or without fee is hereby granted, provided that the above
    7  * copyright notice and this permission notice appear in all copies.
    8  *
    9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   16  */
   17 
   18 #ifndef _DEV_ACPI_ACPIVAR_H_
   19 #define _DEV_ACPI_ACPIVAR_H_
   20 
   21 #include <sys/timeout.h>
   22 #include <sys/rwlock.h>
   23 
   24 /* #define ACPI_DEBUG */
   25 #ifdef ACPI_DEBUG
   26 extern int acpi_debug;
   27 #define dprintf(x...)     do { if (acpi_debug) printf(x); } while (0)
   28 #define dnprintf(n,x...)  do { if (acpi_debug > (n)) printf(x); } while (0)
   29 #else
   30 #define dprintf(x...)
   31 #define dnprintf(n,x...)
   32 #endif
   33 
   34 extern int acpi_hasprocfvs;
   35 
   36 struct klist;
   37 struct acpiec_softc;
   38 
   39 struct acpi_attach_args {
   40         char            *aaa_name;
   41         bus_space_tag_t  aaa_iot;
   42         bus_space_tag_t  aaa_memt;
   43         void            *aaa_table;
   44         paddr_t          aaa_pbase; /* Physical base address of ACPI tables */
   45         struct aml_node *aaa_node;
   46         const char      *aaa_dev;
   47 };
   48 
   49 struct acpi_mem_map {
   50         vaddr_t          baseva;
   51         u_int8_t        *va;
   52         size_t           vsize;
   53         paddr_t          pa;
   54 };
   55 
   56 struct acpi_q {
   57         SIMPLEQ_ENTRY(acpi_q)    q_next;
   58         void                    *q_table;
   59         u_int8_t                 q_data[0];
   60 };
   61 
   62 typedef SIMPLEQ_HEAD(, acpi_q) acpi_qhead_t;
   63 
   64 #define ACPIREG_PM1A_STS    0x00
   65 #define ACPIREG_PM1A_EN     0x01
   66 #define ACPIREG_PM1A_CNT    0x02
   67 #define ACPIREG_PM1B_STS    0x03
   68 #define ACPIREG_PM1B_EN     0x04
   69 #define ACPIREG_PM1B_CNT    0x05
   70 #define ACPIREG_PM2_CNT     0x06
   71 #define ACPIREG_PM_TMR      0x07
   72 #define ACPIREG_GPE0_STS    0x08
   73 #define ACPIREG_GPE0_EN     0x09
   74 #define ACPIREG_GPE1_STS    0x0A
   75 #define ACPIREG_GPE1_EN     0x0B
   76 #define ACPIREG_SMICMD      0x0C
   77 #define ACPIREG_MAXREG      0x0D
   78 
   79 /* Special registers */
   80 #define ACPIREG_PM1_STS     0x0E
   81 #define ACPIREG_PM1_EN      0x0F
   82 #define ACPIREG_PM1_CNT     0x10
   83 #define ACPIREG_GPE_STS     0x11
   84 #define ACPIREG_GPE_EN      0x12
   85 
   86 struct acpi_parsestate
   87 {
   88         u_int8_t           *start;
   89         u_int8_t           *end;
   90         u_int8_t           *pos;
   91 };
   92 
   93 struct acpi_reg_map {
   94         bus_space_handle_t  ioh;
   95         int                 addr;
   96         int                 size;
   97         const char         *name;
   98 };
   99 
  100 struct acpi_thread {
  101         struct acpi_softc   *sc;
  102         volatile int        running;
  103 };
  104 
  105 struct acpi_mutex {
  106         struct rwlock           amt_lock;
  107 #define ACPI_MTX_MAXNAME        5
  108         char                    amt_name[ACPI_MTX_MAXNAME + 3]; /* only 4 used */
  109         int                     amt_ref_count;
  110         int                     amt_timeout;
  111         int                     amt_synclevel;
  112 };
  113 
  114 struct gpe_block {
  115         int  (*handler)(struct acpi_softc *, int, void *);
  116         void *arg;
  117         int   active;
  118 };
  119 
  120 struct acpi_ac {
  121         struct acpiac_softc     *aac_softc;
  122         SLIST_ENTRY(acpi_ac)    aac_link;
  123 };
  124 
  125 SLIST_HEAD(acpi_ac_head, acpi_ac);
  126 
  127 struct acpi_bat {
  128         struct acpibat_softc    *aba_softc;
  129         SLIST_ENTRY(acpi_bat)   aba_link;
  130 };
  131 
  132 SLIST_HEAD(acpi_bat_head, acpi_bat);
  133 
  134 struct acpi_softc {
  135         struct device           sc_dev;
  136 
  137         bus_space_tag_t         sc_iot;
  138         bus_space_tag_t         sc_memt;
  139 #if 0
  140         bus_space_tag_t         sc_pcit;
  141         bus_space_tag_t         sc_smbust;
  142 #endif
  143 
  144         /*
  145          * First-level ACPI tables
  146          */
  147         struct acpi_fadt        *sc_fadt;
  148         acpi_qhead_t            sc_tables;
  149 
  150         /*
  151          * Second-level information from FADT
  152          */
  153         struct acpi_facs        *sc_facs;       /* Shared with firmware! */
  154 
  155         struct klist            *sc_note;
  156         struct acpi_reg_map     sc_pmregs[ACPIREG_MAXREG];
  157         bus_space_handle_t      sc_ioh_pm1a_evt;
  158 
  159         void                    *sc_interrupt;
  160 #ifdef __HAVE_GENERIC_SOFT_INTERRUPTS
  161         void                    *sc_softih;
  162 #else
  163         struct timeout          sc_timeout;
  164 #endif
  165 
  166         int                     sc_powerbtn;
  167         int                     sc_sleepbtn;
  168 
  169         struct {
  170                 int slp_typa;
  171                 int slp_typb;
  172         }                       sc_sleeptype[6];
  173         int                     sc_maxgpe;
  174         int                     sc_lastgpe;
  175 
  176         struct gpe_block       *gpe_table;
  177 
  178         int                     sc_wakeup;
  179         u_int32_t               sc_gpe_sts;
  180         u_int32_t               sc_gpe_en;
  181         struct acpi_thread      *sc_thread;
  182 
  183         struct aml_node         *sc_tts;
  184         struct aml_node         *sc_pts;
  185         struct aml_node         *sc_bfs;
  186         struct aml_node         *sc_gts;
  187         struct aml_node         *sc_wak;
  188         int                     sc_state;
  189         struct acpiec_softc     *sc_ec;         /* XXX assume single EC */
  190 
  191         struct acpi_ac_head     sc_ac;
  192         struct acpi_bat_head    sc_bat;
  193 
  194         struct timeout          sc_dev_timeout;
  195         int                     sc_poll;
  196 };
  197 
  198 #define GPE_NONE  0x00
  199 #define GPE_LEVEL 0x01
  200 #define GPE_EDGE  0x02
  201 
  202 struct acpi_table {
  203         int     offset;
  204         size_t  size;
  205         void    *table;
  206 };
  207 
  208 #define ACPI_IOC_GETFACS        _IOR('A', 0, struct acpi_facs)
  209 #define ACPI_IOC_GETTABLE       _IOWR('A', 1, struct acpi_table)
  210 #define ACPI_IOC_SETSLEEPSTATE  _IOW('A', 2, int)
  211 
  212 #define ACPI_EV_PWRBTN          0x0001  /* Power button was pushed */
  213 #define ACPI_EV_SLPBTN          0x0002  /* Sleep button was pushed */
  214 
  215 #define ACPI_EVENT_MASK         0x0003
  216 
  217 #define ACPI_EVENT_COMPOSE(t,i) (((i) & 0x7fff) << 16 | ((t) & ACPI_EVENT_MASK))
  218 #define ACPI_EVENT_TYPE(e)      ((e) & ACPI_EVENT_MASK)
  219 #define ACPI_EVENT_INDEX(e)     ((e) >> 16)
  220 
  221 #if defined(_KERNEL)
  222 struct   acpi_gas;
  223 int      acpi_map_address(struct acpi_softc *, struct acpi_gas *, bus_addr_t, bus_size_t,
  224                           bus_space_handle_t *, bus_space_tag_t *);
  225 
  226 int      acpi_map(paddr_t, size_t, struct acpi_mem_map *);
  227 void     acpi_unmap(struct acpi_mem_map *);
  228 int      acpi_probe(struct device *, struct cfdata *, struct acpi_attach_args *);
  229 u_int    acpi_checksum(const void *, size_t);
  230 void     acpi_attach_machdep(struct acpi_softc *);
  231 int      acpi_interrupt(void *);
  232 void     acpi_enter_sleep_state(struct acpi_softc *, int);
  233 void     acpi_powerdown(void);
  234 void     acpi_resume(struct acpi_softc *);
  235 
  236 #define ACPI_IOREAD 0
  237 #define ACPI_IOWRITE 1
  238 
  239 void acpi_delay(struct acpi_softc *, int64_t);
  240 int acpi_gasio(struct acpi_softc *, int, int, uint64_t, int, int, void *);
  241 
  242 int     acpi_set_gpehandler(struct acpi_softc *, int, int (*)(struct acpi_softc *, int, void *), void *, const char *);
  243 void    acpi_enable_gpe(struct acpi_softc *, u_int32_t);
  244 
  245 int     acpiec_intr(struct acpiec_softc *);
  246 void    acpiec_read(struct acpiec_softc *, u_int8_t, int, u_int8_t *);
  247 void    acpiec_write(struct acpiec_softc *, u_int8_t, int, u_int8_t *);
  248 void    acpiec_handle_events(struct acpiec_softc *);
  249 
  250 int     acpi_read_pmreg(struct acpi_softc *, int, int);
  251 void    acpi_write_pmreg(struct acpi_softc *, int, int, int);
  252 
  253 void    acpi_poll(void *);
  254 
  255 #endif
  256 
  257 #endif  /* !_DEV_ACPI_ACPIVAR_H_ */

/* [<][>][^][v][top][bottom][index][help] */