149bfb42bSAlexandre Chartre /* 249bfb42bSAlexandre Chartre * CDDL HEADER START 349bfb42bSAlexandre Chartre * 449bfb42bSAlexandre Chartre * The contents of this file are subject to the terms of the 549bfb42bSAlexandre Chartre * Common Development and Distribution License (the "License"). 649bfb42bSAlexandre Chartre * You may not use this file except in compliance with the License. 749bfb42bSAlexandre Chartre * 849bfb42bSAlexandre Chartre * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 949bfb42bSAlexandre Chartre * or http://www.opensolaris.org/os/licensing. 1049bfb42bSAlexandre Chartre * See the License for the specific language governing permissions 1149bfb42bSAlexandre Chartre * and limitations under the License. 1249bfb42bSAlexandre Chartre * 1349bfb42bSAlexandre Chartre * When distributing Covered Code, include this CDDL HEADER in each 1449bfb42bSAlexandre Chartre * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1549bfb42bSAlexandre Chartre * If applicable, add the following below this CDDL HEADER, with the 1649bfb42bSAlexandre Chartre * fields enclosed by brackets "[]" replaced with your own identifying 1749bfb42bSAlexandre Chartre * information: Portions Copyright [yyyy] [name of copyright owner] 1849bfb42bSAlexandre Chartre * 1949bfb42bSAlexandre Chartre * CDDL HEADER END 2049bfb42bSAlexandre Chartre */ 2149bfb42bSAlexandre Chartre 2249bfb42bSAlexandre Chartre /* 23fc256490SJason Beloro * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 2449bfb42bSAlexandre Chartre * Use is subject to license terms. 2549bfb42bSAlexandre Chartre */ 2649bfb42bSAlexandre Chartre 2749bfb42bSAlexandre Chartre #ifndef _LDMA_H 2849bfb42bSAlexandre Chartre #define _LDMA_H 2949bfb42bSAlexandre Chartre 3049bfb42bSAlexandre Chartre #include <libds.h> 3149bfb42bSAlexandre Chartre #include <sys/sysmacros.h> 3249bfb42bSAlexandre Chartre #include <sys/types.h> 3349bfb42bSAlexandre Chartre 346b8303caSAlexandre Chartre #ifdef __cplusplus 356b8303caSAlexandre Chartre extern "C" { 366b8303caSAlexandre Chartre #endif 376b8303caSAlexandre Chartre 3849bfb42bSAlexandre Chartre /* 3949bfb42bSAlexandre Chartre * The following definitions are part of the LDoms Agent specification. 4049bfb42bSAlexandre Chartre */ 4149bfb42bSAlexandre Chartre 4249bfb42bSAlexandre Chartre /* reply message types */ 4349bfb42bSAlexandre Chartre #define LDMA_MSG_RESULT 0x8000 /* result message */ 4449bfb42bSAlexandre Chartre #define LDMA_MSG_ERROR 0x8001 /* error message */ 4549bfb42bSAlexandre Chartre 4649bfb42bSAlexandre Chartre /* error codes for error messages */ 4749bfb42bSAlexandre Chartre #define LDMA_MSGERR_FAIL 0x0000 /* request has failed */ 4849bfb42bSAlexandre Chartre #define LDMA_MSGERR_INVALID 0x8001 /* request is invalid */ 4949bfb42bSAlexandre Chartre #define LDMA_MSGERR_NOTSUP 0x8002 /* request is not supported */ 5049bfb42bSAlexandre Chartre #define LDMA_MSGERR_DENY 0x8003 /* request is denied */ 5149bfb42bSAlexandre Chartre 5249bfb42bSAlexandre Chartre /* 5349bfb42bSAlexandre Chartre * LDoms Device Agent 5449bfb42bSAlexandre Chartre */ 5549bfb42bSAlexandre Chartre #define LDMA_NAME_DEVICE "agent-device" 5649bfb42bSAlexandre Chartre 5749bfb42bSAlexandre Chartre #define LDMA_MSGDEV_VALIDATE_PATH 0x01 /* validate path */ 5849bfb42bSAlexandre Chartre #define LDMA_MSGDEV_VALIDATE_NIC 0x02 /* validate network interface */ 5949bfb42bSAlexandre Chartre 6049bfb42bSAlexandre Chartre #define LDMA_DEVPATH_EXIST 0x01 /* path is accessible */ 6149bfb42bSAlexandre Chartre #define LDMA_DEVPATH_OPENRW 0x02 /* path can be opened rw */ 6249bfb42bSAlexandre Chartre #define LDMA_DEVPATH_OPENRO 0x04 /* path can be opened ro */ 6349bfb42bSAlexandre Chartre 6449bfb42bSAlexandre Chartre #define LDMA_DEVPATH_TYPE_UNKNOWN 0x00 /* path points to unknown */ 6549bfb42bSAlexandre Chartre #define LDMA_DEVPATH_TYPE_FILE 0x01 /* path points to a file */ 6649bfb42bSAlexandre Chartre #define LDMA_DEVPATH_TYPE_DEVICE 0x02 /* path points to a device */ 6749bfb42bSAlexandre Chartre 6849bfb42bSAlexandre Chartre #define LDMA_DEVNIC_EXIST 0x01 /* nic is accessible */ 6949bfb42bSAlexandre Chartre 7049bfb42bSAlexandre Chartre /* 7149bfb42bSAlexandre Chartre * LDoms System Agent 7249bfb42bSAlexandre Chartre */ 7349bfb42bSAlexandre Chartre #define LDMA_NAME_SYSTEM "agent-system" 7449bfb42bSAlexandre Chartre 7549bfb42bSAlexandre Chartre #define LDMA_MSGSYS_GET_SYSINFO 0x01 /* get system info request */ 76*82629e30SMike Christensen #define LDMA_MSGSYS_GET_CHASSISNO 0x02 /* get chassis sno request */ 7749bfb42bSAlexandre Chartre 7849bfb42bSAlexandre Chartre /* 79fc256490SJason Beloro * LDoms Direct IO Agent 80fc256490SJason Beloro */ 81fc256490SJason Beloro #define LDMA_NAME_DIO "agent-dio" 82fc256490SJason Beloro 83fc256490SJason Beloro #define MSGDIO_PCIDEV_INFO 0x1 /* pci device info request */ 84fc256490SJason Beloro 85fc256490SJason Beloro 86fc256490SJason Beloro /* 8749bfb42bSAlexandre Chartre * Size of the header of an agent message. This is the minimal size that 8849bfb42bSAlexandre Chartre * a message can have. 8949bfb42bSAlexandre Chartre */ 9049bfb42bSAlexandre Chartre #define LDMA_MESSAGE_HEADER_SIZE (sizeof (ldma_message_header_t)) 9149bfb42bSAlexandre Chartre 9249bfb42bSAlexandre Chartre /* 9349bfb42bSAlexandre Chartre * Macro to compute the size of a message with a msg_data of size dlen. 9449bfb42bSAlexandre Chartre * The size of the msg_data field must be a multiple of 8-bytes so dlen 9549bfb42bSAlexandre Chartre * is roundup to an 8-bytes multiple. 9649bfb42bSAlexandre Chartre */ 9749bfb42bSAlexandre Chartre #define LDMA_MESSAGE_SIZE(dlen) (LDMA_MESSAGE_HEADER_SIZE + P2ROUNDUP(dlen, 8)) 9849bfb42bSAlexandre Chartre 9949bfb42bSAlexandre Chartre /* 10049bfb42bSAlexandre Chartre * Macro to compute the size of the msg_data field from the size of the message. 10149bfb42bSAlexandre Chartre */ 10249bfb42bSAlexandre Chartre #define LDMA_MESSAGE_DLEN(msgsize) ((msgsize) - LDMA_MESSAGE_HEADER_SIZE) 10349bfb42bSAlexandre Chartre 10449bfb42bSAlexandre Chartre /* 10549bfb42bSAlexandre Chartre * Handy macros for using the message and header structures. 10649bfb42bSAlexandre Chartre */ 10749bfb42bSAlexandre Chartre #define LDMA_HDR2MSG(hdr) ((ldma_message_t *)(hdr)) 10849bfb42bSAlexandre Chartre #define LDMA_HDR2DATA(hdr) (LDMA_HDR2MSG(hdr)->msg_data) 10949bfb42bSAlexandre Chartre #define LDMA_MSG2HDR(msg) ((ldma_message_header_t *)(msg)) 11049bfb42bSAlexandre Chartre 11149bfb42bSAlexandre Chartre /* agent message header structure */ 11249bfb42bSAlexandre Chartre typedef struct ldma_message_header { 11349bfb42bSAlexandre Chartre uint64_t msg_num; /* message number */ 11449bfb42bSAlexandre Chartre uint32_t msg_type; /* message type */ 11549bfb42bSAlexandre Chartre uint32_t msg_info; /* message info */ 11649bfb42bSAlexandre Chartre } ldma_message_header_t; 11749bfb42bSAlexandre Chartre 11849bfb42bSAlexandre Chartre /* agent message structure */ 11949bfb42bSAlexandre Chartre typedef struct ldma_message { 12049bfb42bSAlexandre Chartre ldma_message_header_t msg_hdr; /* message header */ 12149bfb42bSAlexandre Chartre char msg_data[1]; /* message data */ 12249bfb42bSAlexandre Chartre } ldma_message_t; 12349bfb42bSAlexandre Chartre 12449bfb42bSAlexandre Chartre /* 12549bfb42bSAlexandre Chartre * Additional structures and definition for the implementation. 12649bfb42bSAlexandre Chartre */ 12749bfb42bSAlexandre Chartre typedef enum ldma_request_status_t { 12849bfb42bSAlexandre Chartre LDMA_REQ_COMPLETED, /* request was completed */ 12949bfb42bSAlexandre Chartre LDMA_REQ_FAILED, /* request has failed */ 13049bfb42bSAlexandre Chartre LDMA_REQ_INVALID, /* request is invalid */ 13149bfb42bSAlexandre Chartre LDMA_REQ_NOTSUP, /* request is not supported */ 13249bfb42bSAlexandre Chartre LDMA_REQ_DENIED /* request was denied */ 13349bfb42bSAlexandre Chartre } ldma_request_status_t; 13449bfb42bSAlexandre Chartre 13549bfb42bSAlexandre Chartre typedef ldma_request_status_t (ldm_msg_func_t)(ds_ver_t *, 13649bfb42bSAlexandre Chartre ldma_message_header_t *, size_t, ldma_message_header_t **, size_t *); 13749bfb42bSAlexandre Chartre 138*82629e30SMike Christensen /* 139*82629e30SMike Christensen * The domain service framework only allows connexion of a domain with 140*82629e30SMike Christensen * the control domain. So agents not running in the control domain can 141*82629e30SMike Christensen * only receive requests from the control domain. But, agents running 142*82629e30SMike Christensen * on the control can receive requests from any domain. 143*82629e30SMike Christensen * 144*82629e30SMike Christensen * For agents running in the control domain, the LDMA_MSGFLG_ACCESS_* 145*82629e30SMike Christensen * flags control whether messages sent by domains different from the 146*82629e30SMike Christensen * control domain should be processed or not. 147*82629e30SMike Christensen * 148*82629e30SMike Christensen * If a message handler is defined with LDMA_MSGFLG_ACCESS_CONTROL then 149*82629e30SMike Christensen * only messages sent by the control domain should be processed. Otherwise 150*82629e30SMike Christensen * if a message handler is defined with LDMA_MSGFLG_ACCESS_ANY then messages 151*82629e30SMike Christensen * sent by any domain can be processed. 152*82629e30SMike Christensen */ 153*82629e30SMike Christensen #define LDMA_MSGFLG_ACCESS_CONTROL 0x00 154*82629e30SMike Christensen #define LDMA_MSGFLG_ACCESS_ANY 0x01 155*82629e30SMike Christensen 15649bfb42bSAlexandre Chartre typedef struct ldma_msg_handler { 15749bfb42bSAlexandre Chartre uint32_t msg_type; /* message type */ 158*82629e30SMike Christensen uint32_t msg_flags; /* message flags */ 15949bfb42bSAlexandre Chartre ldm_msg_func_t *msg_handler; /* message handler */ 16049bfb42bSAlexandre Chartre } ldma_msg_handler_t; 16149bfb42bSAlexandre Chartre 16249bfb42bSAlexandre Chartre typedef struct ldma_agent_info { 16349bfb42bSAlexandre Chartre char *name; /* agent name */ 16449bfb42bSAlexandre Chartre ds_ver_t *vers; /* supported versions */ 16549bfb42bSAlexandre Chartre int nvers; /* number of versions */ 16649bfb42bSAlexandre Chartre ldma_msg_handler_t *handlers; /* message handlers */ 16749bfb42bSAlexandre Chartre int nhandlers; /* number of handlers */ 16849bfb42bSAlexandre Chartre } ldma_agent_info_t; 16949bfb42bSAlexandre Chartre 17049bfb42bSAlexandre Chartre /* 17149bfb42bSAlexandre Chartre * Helper functions for the daemon and agents. 17249bfb42bSAlexandre Chartre */ 17349bfb42bSAlexandre Chartre 17449bfb42bSAlexandre Chartre /* function to allocate a result message */ 17549bfb42bSAlexandre Chartre ldma_message_header_t *ldma_alloc_result_msg(ldma_message_header_t *, size_t); 17649bfb42bSAlexandre Chartre 17749bfb42bSAlexandre Chartre /* functions to log messages */ 17849bfb42bSAlexandre Chartre void ldma_err(char *module, char *fmt, ...); 17949bfb42bSAlexandre Chartre void ldma_info(char *module, char *fmt, ...); 18049bfb42bSAlexandre Chartre void ldma_dbg(char *module, char *fmt, ...); 18149bfb42bSAlexandre Chartre 18249bfb42bSAlexandre Chartre /* 18349bfb42bSAlexandre Chartre * Macros to log messages. Each module/file using these macros should define 18449bfb42bSAlexandre Chartre * LDMA_MODULE as the name under which messages are logged. For a given agent, 18549bfb42bSAlexandre Chartre * LDMA_MODULE should be set to the name of the agent. 18649bfb42bSAlexandre Chartre */ 18749bfb42bSAlexandre Chartre #define LDMA_ERR(...) ldma_err(LDMA_MODULE, __VA_ARGS__) 18849bfb42bSAlexandre Chartre #define LDMA_INFO(...) ldma_info(LDMA_MODULE, __VA_ARGS__) 18949bfb42bSAlexandre Chartre #define LDMA_DBG(...) ldma_dbg(LDMA_MODULE, __VA_ARGS__) 19049bfb42bSAlexandre Chartre 19149bfb42bSAlexandre Chartre #ifdef __cplusplus 19249bfb42bSAlexandre Chartre } 19349bfb42bSAlexandre Chartre #endif 19449bfb42bSAlexandre Chartre 19549bfb42bSAlexandre Chartre #endif /* _LDMA_H */ 196