xref: /illumos-gate/usr/src/cmd/ldmad/ldma.h (revision 82629e30)
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 
78fc256490SJason Beloro /*
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 
8649bfb42bSAlexandre Chartre /*
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