xref: /onnv-gate/usr/src/cmd/ldmad/ldma.h (revision 11833:3b3fe296598b)
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