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, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright (c) 1999-2000 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27#ifndef _RCM_MODULE_H
28#define	_RCM_MODULE_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32#ifdef	__cplusplus
33extern "C" {
34#endif
35
36#include <librcm.h>
37
38/*
39 * Each RCM module is required to define
40 *
41 * struct rcm_mod_ops *rcm_mod_init();
42 * const char *rcm_mod_info();
43 * int rcm_mod_fini();
44 *
45 * The rcm_mod_init() is always invoked when the module is loaded. It should
46 * return an rcm_mod_ops vector.
47 *
48 * Once the module is loaded, the regis() entry point is
49 * called to allow the module to inform the framework all the
50 * events and devices it cares about.
51 *
52 * If at any point of time, the module has no outstanding registration
53 * against any device, the module will be unloaded. The rcm_mod_fini()
54 * entry point, if defined, is always invoked before module unloading.
55 */
56
57
58/*
59 * ops vector:
60 * The ops version must have a valid version number and all function fields
61 * must be non-NULL. Non-conforming RCM modules are rejected.
62 *
63 * Valid ops versions are defined below.
64 */
65
66#define	RCM_MOD_OPS_V1		1
67#define	RCM_MOD_OPS_V2		2
68#define	RCM_MOD_OPS_VERSION	RCM_MOD_OPS_V2
69
70struct rcm_mod_ops {
71	int	version;
72	int	(*rcmop_register)(rcm_handle_t *);
73	int	(*rcmop_unregister)(rcm_handle_t *);
74	int	(*rcmop_get_info)(rcm_handle_t *, char *, id_t, uint_t,
75			char **, char **, nvlist_t *, rcm_info_t **);
76	int	(*rcmop_request_suspend)(rcm_handle_t *, char *, id_t,
77			timespec_t *, uint_t, char **, rcm_info_t **);
78	int	(*rcmop_notify_resume)(rcm_handle_t *, char *, id_t, uint_t,
79			char **, rcm_info_t **);
80	int	(*rcmop_request_offline)(rcm_handle_t *, char *, id_t, uint_t,
81			char **, rcm_info_t **);
82	int	(*rcmop_notify_online)(rcm_handle_t *, char *, id_t, uint_t,
83			char **, rcm_info_t **);
84	int	(*rcmop_notify_remove)(rcm_handle_t *, char *, id_t, uint_t,
85			char **, rcm_info_t **);
86	/*
87	 * Fields for version 2 and beyond
88	 */
89	int	(*rcmop_request_capacity_change)(rcm_handle_t *, char *, id_t,
90			uint_t, nvlist_t *, char **, rcm_info_t **);
91	int	(*rcmop_notify_capacity_change)(rcm_handle_t *, char *, id_t,
92			uint_t, nvlist_t *, char **, rcm_info_t **);
93	int	(*rcmop_notify_event)(rcm_handle_t *, char *, id_t, uint_t,
94			char **, nvlist_t *, rcm_info_t **);
95};
96
97/*
98 * Version 1 struct for compatibility
99 */
100struct rcm_mod_ops_v1 {
101	int	version;
102	int	(*rcmop_register)(rcm_handle_t *);
103	int	(*rcmop_unregister)(rcm_handle_t *);
104	int	(*rcmop_get_info)(rcm_handle_t *, char *, id_t, uint_t, char **,
105			rcm_info_t **);
106	int	(*rcmop_request_suspend)(rcm_handle_t *, char *, id_t,
107			timespec_t *, uint_t, char **, rcm_info_t **);
108	int	(*rcmop_notify_resume)(rcm_handle_t *, char *, id_t, uint_t,
109			char **, rcm_info_t **);
110	int	(*rcmop_request_offline)(rcm_handle_t *, char *, id_t, uint_t,
111			char **, rcm_info_t **);
112	int	(*rcmop_notify_online)(rcm_handle_t *, char *, id_t, uint_t,
113			char **, rcm_info_t **);
114	int	(*rcmop_notify_remove)(rcm_handle_t *, char *, id_t, uint_t,
115			char **, rcm_info_t **);
116};
117
118/*
119 * RCM modules should use rcm_log_message() instead of syslog().
120 * This allows the daemon to control the amount of message to be
121 * printed and to redirect output to screen for debugging purposes.
122 */
123
124/* message levels for rcm_log_message */
125
126#define	RCM_ERROR	0	/* error message */
127#define	RCM_WARNING	1
128#define	RCM_NOTICE	2
129#define	RCM_INFO	3
130				/* 4 is not used for now */
131#define	RCM_DEBUG	5	/* debug message */
132#define	RCM_TRACE1	6	/* tracing message */
133#define	RCM_TRACE2	7
134#define	RCM_TRACE3	8
135#define	RCM_TRACE4	9
136
137extern void rcm_log_message(int, char *, ...);
138
139#ifdef	__cplusplus
140}
141#endif
142
143#endif /* _RCM_MODULE_H */
144