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
42extern "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
84extern 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
91typedef struct {
92	struct drmach_node	*node;
93	void			*data;
94	void			*func;
95} drmach_node_walk_args_t;
96
97typedef 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
110typedef struct {
111	int		 min_index;
112	int		 max_index;
113	int		 arr_sz;
114	drmachid_t	*arr;
115} drmach_array_t;
116
117typedef 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
127typedef 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
139typedef 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
150typedef struct drmach_cpu {
151	drmach_device_t  dev;
152	processorid_t    cpuid;
153	uint32_t	 apicid;
154} drmach_cpu_t;
155
156typedef 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
167typedef struct drmach_io {
168	drmach_device_t  dev;
169} drmach_io_t;
170
171typedef struct drmach_domain_info {
172	uint64_t	floating;
173	int		allow_dr;
174} drmach_domain_info_t;
175
176typedef 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
184extern drmach_domain_info_t drmach_domain;
185
186extern drmach_board_t	*drmach_board_new(uint_t, int);
187extern sbd_error_t	*drmach_device_new(drmach_node_t *,
188				drmach_board_t *, int, drmachid_t *);
189extern sbd_error_t	*drmach_cpu_new(drmach_device_t *, drmachid_t *);
190extern sbd_error_t	*drmach_mem_new(drmach_device_t *, drmachid_t *);
191extern 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 */
200