PANKOVs restructure
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 */
--- EOF ---