110480SAlexandre.Chartre@Sun.COM /* 210480SAlexandre.Chartre@Sun.COM * CDDL HEADER START 310480SAlexandre.Chartre@Sun.COM * 410480SAlexandre.Chartre@Sun.COM * The contents of this file are subject to the terms of the 510480SAlexandre.Chartre@Sun.COM * Common Development and Distribution License (the "License"). 610480SAlexandre.Chartre@Sun.COM * You may not use this file except in compliance with the License. 710480SAlexandre.Chartre@Sun.COM * 810480SAlexandre.Chartre@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 910480SAlexandre.Chartre@Sun.COM * or http://www.opensolaris.org/os/licensing. 1010480SAlexandre.Chartre@Sun.COM * See the License for the specific language governing permissions 1110480SAlexandre.Chartre@Sun.COM * and limitations under the License. 1210480SAlexandre.Chartre@Sun.COM * 1310480SAlexandre.Chartre@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 1410480SAlexandre.Chartre@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1510480SAlexandre.Chartre@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 1610480SAlexandre.Chartre@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 1710480SAlexandre.Chartre@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 1810480SAlexandre.Chartre@Sun.COM * 1910480SAlexandre.Chartre@Sun.COM * CDDL HEADER END 2010480SAlexandre.Chartre@Sun.COM */ 2110480SAlexandre.Chartre@Sun.COM 2210480SAlexandre.Chartre@Sun.COM /* 2311596SJason.Beloro@Sun.COM * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 2410480SAlexandre.Chartre@Sun.COM * Use is subject to license terms. 2510480SAlexandre.Chartre@Sun.COM */ 2610480SAlexandre.Chartre@Sun.COM 2710480SAlexandre.Chartre@Sun.COM #ifndef _LDMA_H 2810480SAlexandre.Chartre@Sun.COM #define _LDMA_H 2910480SAlexandre.Chartre@Sun.COM 3011029SAlexandre.Chartre@Sun.COM #include <libds.h> 3111029SAlexandre.Chartre@Sun.COM #include <sys/sysmacros.h> 3211029SAlexandre.Chartre@Sun.COM #include <sys/types.h> 3311029SAlexandre.Chartre@Sun.COM 3410480SAlexandre.Chartre@Sun.COM #ifdef __cplusplus 3510480SAlexandre.Chartre@Sun.COM extern "C" { 3610480SAlexandre.Chartre@Sun.COM #endif 3710480SAlexandre.Chartre@Sun.COM 3810480SAlexandre.Chartre@Sun.COM /* 3910480SAlexandre.Chartre@Sun.COM * The following definitions are part of the LDoms Agent specification. 4010480SAlexandre.Chartre@Sun.COM */ 4110480SAlexandre.Chartre@Sun.COM 4210480SAlexandre.Chartre@Sun.COM /* reply message types */ 4310480SAlexandre.Chartre@Sun.COM #define LDMA_MSG_RESULT 0x8000 /* result message */ 4410480SAlexandre.Chartre@Sun.COM #define LDMA_MSG_ERROR 0x8001 /* error message */ 4510480SAlexandre.Chartre@Sun.COM 4610480SAlexandre.Chartre@Sun.COM /* error codes for error messages */ 4710480SAlexandre.Chartre@Sun.COM #define LDMA_MSGERR_FAIL 0x0000 /* request has failed */ 4810480SAlexandre.Chartre@Sun.COM #define LDMA_MSGERR_INVALID 0x8001 /* request is invalid */ 4910480SAlexandre.Chartre@Sun.COM #define LDMA_MSGERR_NOTSUP 0x8002 /* request is not supported */ 5010480SAlexandre.Chartre@Sun.COM #define LDMA_MSGERR_DENY 0x8003 /* request is denied */ 5110480SAlexandre.Chartre@Sun.COM 5210480SAlexandre.Chartre@Sun.COM /* 5310480SAlexandre.Chartre@Sun.COM * LDoms Device Agent 5410480SAlexandre.Chartre@Sun.COM */ 5510480SAlexandre.Chartre@Sun.COM #define LDMA_NAME_DEVICE "agent-device" 5610480SAlexandre.Chartre@Sun.COM 5710480SAlexandre.Chartre@Sun.COM #define LDMA_MSGDEV_VALIDATE_PATH 0x01 /* validate path */ 5810480SAlexandre.Chartre@Sun.COM #define LDMA_MSGDEV_VALIDATE_NIC 0x02 /* validate network interface */ 5910480SAlexandre.Chartre@Sun.COM 6010480SAlexandre.Chartre@Sun.COM #define LDMA_DEVPATH_EXIST 0x01 /* path is accessible */ 6110480SAlexandre.Chartre@Sun.COM #define LDMA_DEVPATH_OPENRW 0x02 /* path can be opened rw */ 6210480SAlexandre.Chartre@Sun.COM #define LDMA_DEVPATH_OPENRO 0x04 /* path can be opened ro */ 6310480SAlexandre.Chartre@Sun.COM 6410480SAlexandre.Chartre@Sun.COM #define LDMA_DEVPATH_TYPE_UNKNOWN 0x00 /* path points to unknown */ 6510480SAlexandre.Chartre@Sun.COM #define LDMA_DEVPATH_TYPE_FILE 0x01 /* path points to a file */ 6610480SAlexandre.Chartre@Sun.COM #define LDMA_DEVPATH_TYPE_DEVICE 0x02 /* path points to a device */ 6710480SAlexandre.Chartre@Sun.COM 6810480SAlexandre.Chartre@Sun.COM #define LDMA_DEVNIC_EXIST 0x01 /* nic is accessible */ 6910480SAlexandre.Chartre@Sun.COM 7010480SAlexandre.Chartre@Sun.COM /* 7110480SAlexandre.Chartre@Sun.COM * LDoms System Agent 7210480SAlexandre.Chartre@Sun.COM */ 7310480SAlexandre.Chartre@Sun.COM #define LDMA_NAME_SYSTEM "agent-system" 7410480SAlexandre.Chartre@Sun.COM 7510480SAlexandre.Chartre@Sun.COM #define LDMA_MSGSYS_GET_SYSINFO 0x01 /* get system info request */ 76*11833SMichael.Christensen@Sun.COM #define LDMA_MSGSYS_GET_CHASSISNO 0x02 /* get chassis sno request */ 7710480SAlexandre.Chartre@Sun.COM 7810480SAlexandre.Chartre@Sun.COM /* 7911596SJason.Beloro@Sun.COM * LDoms Direct IO Agent 8011596SJason.Beloro@Sun.COM */ 8111596SJason.Beloro@Sun.COM #define LDMA_NAME_DIO "agent-dio" 8211596SJason.Beloro@Sun.COM 8311596SJason.Beloro@Sun.COM #define MSGDIO_PCIDEV_INFO 0x1 /* pci device info request */ 8411596SJason.Beloro@Sun.COM 8511596SJason.Beloro@Sun.COM 8611596SJason.Beloro@Sun.COM /* 8710480SAlexandre.Chartre@Sun.COM * Size of the header of an agent message. This is the minimal size that 8810480SAlexandre.Chartre@Sun.COM * a message can have. 8910480SAlexandre.Chartre@Sun.COM */ 9010480SAlexandre.Chartre@Sun.COM #define LDMA_MESSAGE_HEADER_SIZE (sizeof (ldma_message_header_t)) 9110480SAlexandre.Chartre@Sun.COM 9210480SAlexandre.Chartre@Sun.COM /* 9310480SAlexandre.Chartre@Sun.COM * Macro to compute the size of a message with a msg_data of size dlen. 9410480SAlexandre.Chartre@Sun.COM * The size of the msg_data field must be a multiple of 8-bytes so dlen 9510480SAlexandre.Chartre@Sun.COM * is roundup to an 8-bytes multiple. 9610480SAlexandre.Chartre@Sun.COM */ 9710480SAlexandre.Chartre@Sun.COM #define LDMA_MESSAGE_SIZE(dlen) (LDMA_MESSAGE_HEADER_SIZE + P2ROUNDUP(dlen, 8)) 9810480SAlexandre.Chartre@Sun.COM 9910480SAlexandre.Chartre@Sun.COM /* 10010480SAlexandre.Chartre@Sun.COM * Macro to compute the size of the msg_data field from the size of the message. 10110480SAlexandre.Chartre@Sun.COM */ 10210480SAlexandre.Chartre@Sun.COM #define LDMA_MESSAGE_DLEN(msgsize) ((msgsize) - LDMA_MESSAGE_HEADER_SIZE) 10310480SAlexandre.Chartre@Sun.COM 10410480SAlexandre.Chartre@Sun.COM /* 10510480SAlexandre.Chartre@Sun.COM * Handy macros for using the message and header structures. 10610480SAlexandre.Chartre@Sun.COM */ 10710480SAlexandre.Chartre@Sun.COM #define LDMA_HDR2MSG(hdr) ((ldma_message_t *)(hdr)) 10810480SAlexandre.Chartre@Sun.COM #define LDMA_HDR2DATA(hdr) (LDMA_HDR2MSG(hdr)->msg_data) 10910480SAlexandre.Chartre@Sun.COM #define LDMA_MSG2HDR(msg) ((ldma_message_header_t *)(msg)) 11010480SAlexandre.Chartre@Sun.COM 11110480SAlexandre.Chartre@Sun.COM /* agent message header structure */ 11210480SAlexandre.Chartre@Sun.COM typedef struct ldma_message_header { 11310480SAlexandre.Chartre@Sun.COM uint64_t msg_num; /* message number */ 11410480SAlexandre.Chartre@Sun.COM uint32_t msg_type; /* message type */ 11510480SAlexandre.Chartre@Sun.COM uint32_t msg_info; /* message info */ 11610480SAlexandre.Chartre@Sun.COM } ldma_message_header_t; 11710480SAlexandre.Chartre@Sun.COM 11810480SAlexandre.Chartre@Sun.COM /* agent message structure */ 11910480SAlexandre.Chartre@Sun.COM typedef struct ldma_message { 12010480SAlexandre.Chartre@Sun.COM ldma_message_header_t msg_hdr; /* message header */ 12110480SAlexandre.Chartre@Sun.COM char msg_data[1]; /* message data */ 12210480SAlexandre.Chartre@Sun.COM } ldma_message_t; 12310480SAlexandre.Chartre@Sun.COM 12410480SAlexandre.Chartre@Sun.COM /* 12510480SAlexandre.Chartre@Sun.COM * Additional structures and definition for the implementation. 12610480SAlexandre.Chartre@Sun.COM */ 12710480SAlexandre.Chartre@Sun.COM typedef enum ldma_request_status_t { 12810480SAlexandre.Chartre@Sun.COM LDMA_REQ_COMPLETED, /* request was completed */ 12910480SAlexandre.Chartre@Sun.COM LDMA_REQ_FAILED, /* request has failed */ 13010480SAlexandre.Chartre@Sun.COM LDMA_REQ_INVALID, /* request is invalid */ 13110480SAlexandre.Chartre@Sun.COM LDMA_REQ_NOTSUP, /* request is not supported */ 13210480SAlexandre.Chartre@Sun.COM LDMA_REQ_DENIED /* request was denied */ 13310480SAlexandre.Chartre@Sun.COM } ldma_request_status_t; 13410480SAlexandre.Chartre@Sun.COM 13510480SAlexandre.Chartre@Sun.COM typedef ldma_request_status_t (ldm_msg_func_t)(ds_ver_t *, 13610480SAlexandre.Chartre@Sun.COM ldma_message_header_t *, size_t, ldma_message_header_t **, size_t *); 13710480SAlexandre.Chartre@Sun.COM 138*11833SMichael.Christensen@Sun.COM /* 139*11833SMichael.Christensen@Sun.COM * The domain service framework only allows connexion of a domain with 140*11833SMichael.Christensen@Sun.COM * the control domain. So agents not running in the control domain can 141*11833SMichael.Christensen@Sun.COM * only receive requests from the control domain. But, agents running 142*11833SMichael.Christensen@Sun.COM * on the control can receive requests from any domain. 143*11833SMichael.Christensen@Sun.COM * 144*11833SMichael.Christensen@Sun.COM * For agents running in the control domain, the LDMA_MSGFLG_ACCESS_* 145*11833SMichael.Christensen@Sun.COM * flags control whether messages sent by domains different from the 146*11833SMichael.Christensen@Sun.COM * control domain should be processed or not. 147*11833SMichael.Christensen@Sun.COM * 148*11833SMichael.Christensen@Sun.COM * If a message handler is defined with LDMA_MSGFLG_ACCESS_CONTROL then 149*11833SMichael.Christensen@Sun.COM * only messages sent by the control domain should be processed. Otherwise 150*11833SMichael.Christensen@Sun.COM * if a message handler is defined with LDMA_MSGFLG_ACCESS_ANY then messages 151*11833SMichael.Christensen@Sun.COM * sent by any domain can be processed. 152*11833SMichael.Christensen@Sun.COM */ 153*11833SMichael.Christensen@Sun.COM #define LDMA_MSGFLG_ACCESS_CONTROL 0x00 154*11833SMichael.Christensen@Sun.COM #define LDMA_MSGFLG_ACCESS_ANY 0x01 155*11833SMichael.Christensen@Sun.COM 15610480SAlexandre.Chartre@Sun.COM typedef struct ldma_msg_handler { 15710480SAlexandre.Chartre@Sun.COM uint32_t msg_type; /* message type */ 158*11833SMichael.Christensen@Sun.COM uint32_t msg_flags; /* message flags */ 15910480SAlexandre.Chartre@Sun.COM ldm_msg_func_t *msg_handler; /* message handler */ 16010480SAlexandre.Chartre@Sun.COM } ldma_msg_handler_t; 16110480SAlexandre.Chartre@Sun.COM 16210480SAlexandre.Chartre@Sun.COM typedef struct ldma_agent_info { 16310480SAlexandre.Chartre@Sun.COM char *name; /* agent name */ 16410480SAlexandre.Chartre@Sun.COM ds_ver_t *vers; /* supported versions */ 16510480SAlexandre.Chartre@Sun.COM int nvers; /* number of versions */ 16610480SAlexandre.Chartre@Sun.COM ldma_msg_handler_t *handlers; /* message handlers */ 16710480SAlexandre.Chartre@Sun.COM int nhandlers; /* number of handlers */ 16810480SAlexandre.Chartre@Sun.COM } ldma_agent_info_t; 16910480SAlexandre.Chartre@Sun.COM 17010480SAlexandre.Chartre@Sun.COM /* 17110480SAlexandre.Chartre@Sun.COM * Helper functions for the daemon and agents. 17210480SAlexandre.Chartre@Sun.COM */ 17310480SAlexandre.Chartre@Sun.COM 17410480SAlexandre.Chartre@Sun.COM /* function to allocate a result message */ 17510480SAlexandre.Chartre@Sun.COM ldma_message_header_t *ldma_alloc_result_msg(ldma_message_header_t *, size_t); 17610480SAlexandre.Chartre@Sun.COM 17710480SAlexandre.Chartre@Sun.COM /* functions to log messages */ 17810480SAlexandre.Chartre@Sun.COM void ldma_err(char *module, char *fmt, ...); 17910480SAlexandre.Chartre@Sun.COM void ldma_info(char *module, char *fmt, ...); 18010480SAlexandre.Chartre@Sun.COM void ldma_dbg(char *module, char *fmt, ...); 18110480SAlexandre.Chartre@Sun.COM 18210480SAlexandre.Chartre@Sun.COM /* 18310480SAlexandre.Chartre@Sun.COM * Macros to log messages. Each module/file using these macros should define 18410480SAlexandre.Chartre@Sun.COM * LDMA_MODULE as the name under which messages are logged. For a given agent, 18510480SAlexandre.Chartre@Sun.COM * LDMA_MODULE should be set to the name of the agent. 18610480SAlexandre.Chartre@Sun.COM */ 18710480SAlexandre.Chartre@Sun.COM #define LDMA_ERR(...) ldma_err(LDMA_MODULE, __VA_ARGS__) 18810480SAlexandre.Chartre@Sun.COM #define LDMA_INFO(...) ldma_info(LDMA_MODULE, __VA_ARGS__) 18910480SAlexandre.Chartre@Sun.COM #define LDMA_DBG(...) ldma_dbg(LDMA_MODULE, __VA_ARGS__) 19010480SAlexandre.Chartre@Sun.COM 19110480SAlexandre.Chartre@Sun.COM #ifdef __cplusplus 19210480SAlexandre.Chartre@Sun.COM } 19310480SAlexandre.Chartre@Sun.COM #endif 19410480SAlexandre.Chartre@Sun.COM 19510480SAlexandre.Chartre@Sun.COM #endif /* _LDMA_H */ 196