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