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 */