1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 /*
  26  * Copyright (c) 2010, Intel Corporation.
  27  * All rights reserved.
  28  */
  29 
  30 #ifndef _SYS_DRMACH_ACPI_H
  31 #define _SYS_DRMACH_ACPI_H
  32 #include <sys/types.h>
  33 #include <sys/cmn_err.h>
  34 #include <sys/param.h>
  35 #include <sys/sunddi.h>
  36 #include <sys/acpi/acpi.h>
  37 #include <sys/acpica.h>
  38 #include <sys/acpidev.h>
  39 #include <sys/drmach.h>
  40 
  41 #ifdef __cplusplus
  42 extern "C" {
  43 #endif
  44 
  45 #ifdef  _KERNEL
  46 
  47 /* Use ACPI handle as DRMACH handle on x86 systems. */
  48 #define DRMACH_HANDLE           ACPI_HANDLE
  49 
  50 /* Macros to deal with object type. */
  51 #define DRMACH_OBJ(id)          ((drmach_common_t *)id)
  52 
  53 #define DRMACH_NULL_ID(id)      ((id) == 0)
  54 
  55 #define DRMACH_IS_BOARD_ID(id)  \
  56         ((id != 0) && (DRMACH_OBJ(id)->isa == (void *)drmach_board_new))
  57 
  58 #define DRMACH_IS_CPU_ID(id)    \
  59         ((id != 0) && (DRMACH_OBJ(id)->isa == (void *)drmach_cpu_new))
  60 
  61 #define DRMACH_IS_MEM_ID(id)    \
  62         ((id != 0) && (DRMACH_OBJ(id)->isa == (void *)drmach_mem_new))
  63 
  64 #define DRMACH_IS_IO_ID(id)     \
  65         ((id != 0) && (DRMACH_OBJ(id)->isa == (void *)drmach_io_new))
  66 
  67 #define DRMACH_IS_DEVICE_ID(id)                                 \
  68         ((id != 0) &&                                           \
  69         (DRMACH_OBJ(id)->isa == (void *)drmach_cpu_new ||    \
  70             DRMACH_OBJ(id)->isa == (void *)drmach_mem_new || \
  71             DRMACH_OBJ(id)->isa == (void *)drmach_io_new))
  72 
  73 #define DRMACH_IS_ID(id)                                        \
  74         ((id != 0) &&                                           \
  75         (DRMACH_OBJ(id)->isa == (void *)drmach_board_new ||  \
  76             DRMACH_OBJ(id)->isa == (void *)drmach_cpu_new || \
  77             DRMACH_OBJ(id)->isa == (void *)drmach_mem_new || \
  78             DRMACH_OBJ(id)->isa == (void *)drmach_io_new))
  79 
  80 #define DRMACH_INTERNAL_ERROR() \
  81         drerr_new(1, EX86_INTERNAL, drmach_ie_fmt, __LINE__)
  82 
  83 #ifdef DEBUG
  84 extern int drmach_debug;
  85 
  86 #define DRMACH_PR               if (drmach_debug) printf
  87 #else
  88 #define DRMACH_PR               _NOTE(CONSTANTCONDITION) if (0) printf
  89 #endif /* DEBUG */
  90 
  91 typedef struct {
  92         struct drmach_node      *node;
  93         void                    *data;
  94         void                    *func;
  95 } drmach_node_walk_args_t;
  96 
  97 typedef struct drmach_node {
  98         void            *here;
  99 
 100         DRMACH_HANDLE   (*get_dnode)(struct drmach_node *node);
 101         dev_info_t      *(*getdip)(struct drmach_node *node);
 102         int             (*getproplen)(struct drmach_node *node, char *name,
 103                                 int *len);
 104         int             (*getprop)(struct drmach_node *node, char *name,
 105                                 void *buf, int len);
 106         int             (*walk)(struct drmach_node *node, void *data,
 107                                 int (*cb)(drmach_node_walk_args_t *args));
 108 } drmach_node_t;
 109 
 110 typedef struct {
 111         int              min_index;
 112         int              max_index;
 113         int              arr_sz;
 114         drmachid_t      *arr;
 115 } drmach_array_t;
 116 
 117 typedef struct {
 118         void            *isa;
 119 
 120         void            (*dispose)(drmachid_t);
 121         sbd_error_t     *(*release)(drmachid_t);
 122         sbd_error_t     *(*status)(drmachid_t, drmach_status_t *);
 123 
 124         char             name[MAXNAMELEN];
 125 } drmach_common_t;
 126 
 127 typedef struct {
 128         drmach_common_t  cm;
 129         uint_t           bnum;
 130         int              assigned;
 131         int              powered;
 132         int              connected;
 133         int              cond;
 134         drmach_node_t   *tree;
 135         drmach_array_t  *devices;
 136         int              boot_board;    /* if board exists on bootup */
 137 } drmach_board_t;
 138 
 139 typedef struct {
 140         drmach_common_t  cm;
 141         drmach_board_t  *bp;
 142         int              unum;
 143         uint_t           portid;
 144         int              busy;
 145         int              powered;
 146         const char      *type;
 147         drmach_node_t   *node;
 148 } drmach_device_t;
 149 
 150 typedef struct drmach_cpu {
 151         drmach_device_t  dev;
 152         processorid_t    cpuid;
 153         uint32_t         apicid;
 154 } drmach_cpu_t;
 155 
 156 typedef struct drmach_mem {
 157         drmach_device_t dev;
 158         uint64_t        mem_alignment;
 159         uint64_t        slice_base;
 160         uint64_t        slice_top;
 161         uint64_t        slice_size;
 162         uint64_t        base_pa;        /* lowest installed memory base */
 163         uint64_t        nbytes;         /* size of installed memory */
 164         struct memlist *memlist;
 165 } drmach_mem_t;
 166 
 167 typedef struct drmach_io {
 168         drmach_device_t  dev;
 169 } drmach_io_t;
 170 
 171 typedef struct drmach_domain_info {
 172         uint64_t        floating;
 173         int             allow_dr;
 174 } drmach_domain_info_t;
 175 
 176 typedef struct {
 177         drmach_board_t  *obj;
 178         int              ndevs;
 179         void            *a;
 180         sbd_error_t     *(*found)(void *a, const char *, int, drmachid_t);
 181         sbd_error_t     *err;
 182 } drmach_board_cb_data_t;
 183 
 184 extern drmach_domain_info_t drmach_domain;
 185 
 186 extern drmach_board_t   *drmach_board_new(uint_t, int);
 187 extern sbd_error_t      *drmach_device_new(drmach_node_t *,
 188                                 drmach_board_t *, int, drmachid_t *);
 189 extern sbd_error_t      *drmach_cpu_new(drmach_device_t *, drmachid_t *);
 190 extern sbd_error_t      *drmach_mem_new(drmach_device_t *, drmachid_t *);
 191 extern sbd_error_t      *drmach_io_new(drmach_device_t *, drmachid_t *);
 192 
 193 #endif  /* _KERNEL */
 194 
 195 #ifdef __cplusplus
 196 }
 197 #endif
 198 
 199 #endif  /* _SYS_DRMACH_ACPI_H */