xref: /onnv-gate/usr/src/lib/fm/libldom/sparc/ldmsvcs_utils.h (revision 7850:168d612bb1e8)
12072Svn83148 /*
22072Svn83148  * CDDL HEADER START
32072Svn83148  *
42072Svn83148  * The contents of this file are subject to the terms of the
52072Svn83148  * Common Development and Distribution License (the "License").
62072Svn83148  * You may not use this file except in compliance with the License.
72072Svn83148  *
82072Svn83148  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
92072Svn83148  * or http://www.opensolaris.org/os/licensing.
102072Svn83148  * See the License for the specific language governing permissions
112072Svn83148  * and limitations under the License.
122072Svn83148  *
132072Svn83148  * When distributing Covered Code, include this CDDL HEADER in each
142072Svn83148  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
152072Svn83148  * If applicable, add the following below this CDDL HEADER, with the
162072Svn83148  * fields enclosed by brackets "[]" replaced with your own identifying
172072Svn83148  * information: Portions Copyright [yyyy] [name of copyright owner]
182072Svn83148  *
192072Svn83148  * CDDL HEADER END
202072Svn83148  */
212072Svn83148 /*
226111Scy152378  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
232072Svn83148  * Use is subject to license terms.
242072Svn83148  */
252072Svn83148 
262072Svn83148 #ifndef	_LDMSVCS_UTILS_H
272072Svn83148 #define	_LDMSVCS_UTILS_H
282072Svn83148 
292072Svn83148 #include <stdlib.h>
302072Svn83148 #include <sys/types.h>
312072Svn83148 #include <sys/ldc.h>
322072Svn83148 #include <sys/vldc.h>
332072Svn83148 #include <sys/ds.h>
342072Svn83148 #include <sys/ds_impl.h>
352072Svn83148 
362072Svn83148 #ifdef	__cplusplus
372072Svn83148 extern "C" {
382072Svn83148 #endif
392072Svn83148 
402072Svn83148 /*
412072Svn83148  * Service Information
422072Svn83148  */
432072Svn83148 typedef struct fds_svc {
442072Svn83148 	ds_svc_hdl_t hdl;	/* handle assigned by DS */
452072Svn83148 	ds_svc_state_t state;	/* current service state */
462072Svn83148 	ds_ver_t ver;		/* svc protocol version in use */
472072Svn83148 	char *name;
482072Svn83148 } fds_svc_t;
492072Svn83148 
502072Svn83148 /*
512072Svn83148  * table of registered services
522072Svn83148  */
532072Svn83148 typedef struct fds_reg_svcs {
542072Svn83148 	pthread_mutex_t mt;
552072Svn83148 	pthread_cond_t cv;
562072Svn83148 	fds_svc_t **tbl;		/* the table itself */
572072Svn83148 	uint_t nsvcs;		/* current number of items */
582072Svn83148 } fds_reg_svcs_t;
592072Svn83148 
602072Svn83148 
612072Svn83148 typedef enum {
622072Svn83148 	CHANNEL_UNINITIALIZED,	/* status of channel unknown */
632072Svn83148 	CHANNEL_CLOSED,		/* port structure not in use */
642072Svn83148 	CHANNEL_OPEN,		/* open but not initialized/reset */
652072Svn83148 	CHANNEL_READY,		/* init/reset done */
662072Svn83148 	CHANNEL_UNUSABLE,	/* cannot be used (possibly busy) */
672072Svn83148 	CHANNEL_EXIT		/* normal exit */
682072Svn83148 } fds_chan_state_t;
692072Svn83148 
702072Svn83148 typedef struct fds_channel {
712072Svn83148 	int fd;			/* FD for this channel */
722072Svn83148 	fds_chan_state_t state; /* state of the port */
732072Svn83148 	ds_ver_t ver;		/* DS protocol version in use */
742072Svn83148 } fds_channel_t;
752072Svn83148 
762072Svn83148 
772072Svn83148 /*
782072Svn83148  * FMA services
792072Svn83148  */
80*7850SVuong.Nguyen@Sun.COM 
81*7850SVuong.Nguyen@Sun.COM #define	LDM_DS_NAME_CPU		"fma-phys-cpu-service"
82*7850SVuong.Nguyen@Sun.COM #define	LDM_DS_NAME_MEM		"fma-phys-mem-service"
83*7850SVuong.Nguyen@Sun.COM #define	LDM_DS_NAME_PRI		"fma-pri-service"
84*7850SVuong.Nguyen@Sun.COM #define	LDM_DS_NAME_IOD		"fma-io-domain-service"
85*7850SVuong.Nguyen@Sun.COM 
862072Svn83148 typedef struct {
872072Svn83148 	uint64_t req_num;
882072Svn83148 } fma_req_pri_t;
892072Svn83148 
902072Svn83148 /*
912072Svn83148  * definition of fma_pri_resp_t is not shown here.  for more details,
922072Svn83148  * see ldmsvcs_utils.c:ldmsvcs_get_core_md().
932072Svn83148  */
942072Svn83148 
952072Svn83148 #define	FMA_CPU_REQ_STATUS	0
962072Svn83148 #define	FMA_CPU_REQ_OFFLINE	1
972072Svn83148 #define	FMA_CPU_REQ_ONLINE	2
982072Svn83148 
992072Svn83148 #define	FMA_CPU_RESP_OK		0
1002072Svn83148 #define	FMA_CPU_RESP_FAILURE	1
1012072Svn83148 
1022072Svn83148 #define	FMA_CPU_STAT_ONLINE	0
1032072Svn83148 #define	FMA_CPU_STAT_OFFLINE	1
1042072Svn83148 #define	FMA_CPU_STAT_ILLEGAL	2
1052072Svn83148 
1062072Svn83148 typedef struct {
1072072Svn83148 	uint64_t req_num;
1082072Svn83148 	uint32_t msg_type;
1092072Svn83148 	uint32_t cpu_id;
1102072Svn83148 } fma_cpu_service_req_t;
1112072Svn83148 
1122072Svn83148 typedef struct {
1132072Svn83148 	uint64_t req_num;
1142072Svn83148 	uint32_t result;
1152072Svn83148 	uint32_t status;
1162072Svn83148 } fma_cpu_resp_t;
1172072Svn83148 
1182072Svn83148 #define	FMA_MEM_REQ_STATUS	0
1192072Svn83148 #define	FMA_MEM_REQ_RETIRE	1
1202072Svn83148 #define	FMA_MEM_REQ_RESURRECT	2
1212072Svn83148 
1222072Svn83148 #define	FMA_MEM_RESP_OK		0
1232072Svn83148 #define	FMA_MEM_RESP_FAILURE	1
1242072Svn83148 
1252072Svn83148 #define	FMA_MEM_STAT_NOTRETIRED	0
1262072Svn83148 #define	FMA_MEM_STAT_RETIRED	1
1272072Svn83148 #define	FMA_MEM_STAT_ILLEGAL	2
1282072Svn83148 
1292072Svn83148 typedef struct {
1302072Svn83148 	uint64_t req_num;
1312072Svn83148 	uint32_t msg_type;
1322072Svn83148 	uint32_t _resvd;
1332072Svn83148 	uint64_t real_addr;
1342072Svn83148 	uint64_t length;
1352072Svn83148 } fma_mem_service_req_t;
1362072Svn83148 
1372072Svn83148 typedef struct {
1382072Svn83148 	uint64_t req_num;
1392072Svn83148 	uint32_t result;
1402072Svn83148 	uint32_t status;
1412072Svn83148 	uint64_t res_addr;
1422072Svn83148 	uint64_t res_length;
1432072Svn83148 } fma_mem_resp_t;
1442072Svn83148 
1452072Svn83148 
146*7850SVuong.Nguyen@Sun.COM #define	FMA_IO_RESP_OK		0
147*7850SVuong.Nguyen@Sun.COM #define	FMA_IO_RESP_FAILURE	1
148*7850SVuong.Nguyen@Sun.COM #define	FMA_IO_RESP_ILLEGAL	2
149*7850SVuong.Nguyen@Sun.COM #define	FMA_IO_RESP_UNASSIGNED	3
150*7850SVuong.Nguyen@Sun.COM 
151*7850SVuong.Nguyen@Sun.COM typedef struct {
152*7850SVuong.Nguyen@Sun.COM 	uint64_t req_num;
153*7850SVuong.Nguyen@Sun.COM 	uint32_t msg_type;
154*7850SVuong.Nguyen@Sun.COM 	uint32_t reserved;
155*7850SVuong.Nguyen@Sun.COM 	uint64_t rsrc_address;
156*7850SVuong.Nguyen@Sun.COM } fma_io_req_t;
157*7850SVuong.Nguyen@Sun.COM 
158*7850SVuong.Nguyen@Sun.COM typedef struct {
159*7850SVuong.Nguyen@Sun.COM 	uint64_t req_num;
160*7850SVuong.Nguyen@Sun.COM 	uint32_t result;
161*7850SVuong.Nguyen@Sun.COM 	uint32_t reserved;
162*7850SVuong.Nguyen@Sun.COM 	uint64_t virt_rsrc_address;
163*7850SVuong.Nguyen@Sun.COM 	uint64_t domain_id;
164*7850SVuong.Nguyen@Sun.COM } fma_io_resp_t;
165*7850SVuong.Nguyen@Sun.COM 
166*7850SVuong.Nguyen@Sun.COM 
1672072Svn83148 struct ldom_hdl {
1682072Svn83148 	void *(*allocp)(size_t size);
1692072Svn83148 	void (*freep)(void *addr, size_t size);
1702072Svn83148 	struct ldmsvcs_info *lsinfo;
1712072Svn83148 };
1722072Svn83148 
1734358Srb144127 /*
1744358Srb144127  * in the default case of ldmd (the LDOM manager daemon/service)
1754358Srb144127  * not installed/running, set short timeouts for contacting ldmd,
1764358Srb144127  * so that higher levels in the software stack (ex: diagnosis engines)
1774358Srb144127  * are not excessively delayed by ldmd's absence. both timeouts are tunable
1784358Srb144127  * via SMF properties in ldmd's service manifest, and expected to be set
1794358Srb144127  * thusly to appropriate values when ldmd is installed.
1804358Srb144127  *
1814358Srb144127  * timeouts are in seconds. init is the initial timeout; running is
1824358Srb144127  * for subsequent timeouts.
1834358Srb144127  */
1844358Srb144127 #define	LDM_INIT_WAIT_TIME	2
1854358Srb144127 #define	LDM_RUNNING_WAIT_TIME	2
1864358Srb144127 
1874358Srb144127 #define	LDM_SVC_NM		"svc:/ldoms/ldmd:default"
1884358Srb144127 #define	LDM_PROP_GROUP_NM	"fmd_config"
1894358Srb144127 
1904358Srb144127 #define	LDM_INIT_TO_PROP_NM	"fmd_to_ldmd_init_timeout"
1914358Srb144127 #define	LDM_RUNNING_TO_PROP_NM	"fmd_to_ldmd_running_timeout"
1922072Svn83148 
1932072Svn83148 extern int ldmsvcs_check_channel(void);
1942072Svn83148 
1952072Svn83148 extern void ldmsvcs_init(struct ldom_hdl *lhp);
1962072Svn83148 
1972072Svn83148 extern void ldmsvcs_fini(struct ldom_hdl *lhp);
1982072Svn83148 
1992072Svn83148 extern ssize_t ldmsvcs_get_core_md(struct ldom_hdl *lhp, uint64_t **buf);
2002072Svn83148 
2012072Svn83148 extern int ldmsvcs_cpu_req_status(struct ldom_hdl *lhp, uint32_t cpuid);
2022072Svn83148 
2032072Svn83148 extern int ldmsvcs_mem_req_status(struct ldom_hdl *lhp, uint64_t pa);
2042072Svn83148 
2052072Svn83148 extern int ldmsvcs_cpu_req_offline(struct ldom_hdl *lhp, uint32_t cpuid);
2062072Svn83148 
2072072Svn83148 extern int ldmsvcs_mem_req_retire(struct ldom_hdl *lhp, uint64_t pa);
2082072Svn83148 
2096111Scy152378 extern int ldmsvcs_cpu_req_online(struct ldom_hdl *lhp, uint32_t cpuid);
2106111Scy152378 
2116111Scy152378 extern int ldmsvcs_mem_req_unretire(struct ldom_hdl *lhp, uint64_t pa);
2126111Scy152378 
213*7850SVuong.Nguyen@Sun.COM extern int ldmsvcs_io_req_id(struct ldom_hdl *lhp, uint64_t addr, uint_t type,
214*7850SVuong.Nguyen@Sun.COM     uint64_t *virt_addr, char *name, int name_len, uint64_t *did);
215*7850SVuong.Nguyen@Sun.COM 
2162072Svn83148 #ifdef	__cplusplus
2172072Svn83148 }
2182072Svn83148 #endif
2192072Svn83148 
2202072Svn83148 #endif	/* _LDMSVCS_UTILS_H */
221