49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * CDDL HEADER START
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * The contents of this file are subject to the terms of the
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Common Development and Distribution License (the "License").
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * You may not use this file except in compliance with the License.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * or http://www.opensolaris.org/os/licensing.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * See the License for the specific language governing permissions
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * and limitations under the License.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * When distributing Covered Code, include this CDDL HEADER in each
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * If applicable, add the following below this CDDL HEADER, with the
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * fields enclosed by brackets "[]" replaced with your own identifying
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * information: Portions Copyright [yyyy] [name of copyright owner]
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * CDDL HEADER END
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Use is subject to license terms.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#ifndef _LDMA_H
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define _LDMA_H
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <libds.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <sys/sysmacros.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <sys/types.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
6b8303caf3c5c70ae1c1d362bf6de0c55eb622bbAlexandre Chartre#ifdef __cplusplus
6b8303caf3c5c70ae1c1d362bf6de0c55eb622bbAlexandre Chartreextern "C" {
6b8303caf3c5c70ae1c1d362bf6de0c55eb622bbAlexandre Chartre#endif
6b8303caf3c5c70ae1c1d362bf6de0c55eb622bbAlexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * The following definitions are part of the LDoms Agent specification.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/* reply message types */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MSG_RESULT 0x8000 /* result message */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MSG_ERROR 0x8001 /* error message */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/* error codes for error messages */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MSGERR_FAIL 0x0000 /* request has failed */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MSGERR_INVALID 0x8001 /* request is invalid */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MSGERR_NOTSUP 0x8002 /* request is not supported */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MSGERR_DENY 0x8003 /* request is denied */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * LDoms Device Agent
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_NAME_DEVICE "agent-device"
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MSGDEV_VALIDATE_PATH 0x01 /* validate path */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MSGDEV_VALIDATE_NIC 0x02 /* validate network interface */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_DEVPATH_EXIST 0x01 /* path is accessible */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_DEVPATH_OPENRW 0x02 /* path can be opened rw */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_DEVPATH_OPENRO 0x04 /* path can be opened ro */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_DEVPATH_TYPE_UNKNOWN 0x00 /* path points to unknown */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_DEVPATH_TYPE_FILE 0x01 /* path points to a file */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_DEVPATH_TYPE_DEVICE 0x02 /* path points to a device */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_DEVNIC_EXIST 0x01 /* nic is accessible */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * LDoms System Agent
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_NAME_SYSTEM "agent-system"
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MSGSYS_GET_SYSINFO 0x01 /* get system info request */
82629e3015252bf18319ba3815c773df23e21436Mike Christensen#define LDMA_MSGSYS_GET_CHASSISNO 0x02 /* get chassis sno request */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro/*
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * LDoms Direct IO Agent
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro#define LDMA_NAME_DIO "agent-dio"
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro#define MSGDIO_PCIDEV_INFO 0x1 /* pci device info request */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Size of the header of an agent message. This is the minimal size that
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * a message can have.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MESSAGE_HEADER_SIZE (sizeof (ldma_message_header_t))
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Macro to compute the size of a message with a msg_data of size dlen.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * The size of the msg_data field must be a multiple of 8-bytes so dlen
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * is roundup to an 8-bytes multiple.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MESSAGE_SIZE(dlen) (LDMA_MESSAGE_HEADER_SIZE + P2ROUNDUP(dlen, 8))
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Macro to compute the size of the msg_data field from the size of the message.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MESSAGE_DLEN(msgsize) ((msgsize) - LDMA_MESSAGE_HEADER_SIZE)
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Handy macros for using the message and header structures.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_HDR2MSG(hdr) ((ldma_message_t *)(hdr))
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_HDR2DATA(hdr) (LDMA_HDR2MSG(hdr)->msg_data)
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MSG2HDR(msg) ((ldma_message_header_t *)(msg))
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/* agent message header structure */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartretypedef struct ldma_message_header {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre uint64_t msg_num; /* message number */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre uint32_t msg_type; /* message type */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre uint32_t msg_info; /* message info */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre} ldma_message_header_t;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/* agent message structure */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartretypedef struct ldma_message {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre ldma_message_header_t msg_hdr; /* message header */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre char msg_data[1]; /* message data */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre} ldma_message_t;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Additional structures and definition for the implementation.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartretypedef enum ldma_request_status_t {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_REQ_COMPLETED, /* request was completed */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_REQ_FAILED, /* request has failed */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_REQ_INVALID, /* request is invalid */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_REQ_NOTSUP, /* request is not supported */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_REQ_DENIED /* request was denied */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre} ldma_request_status_t;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartretypedef ldma_request_status_t (ldm_msg_func_t)(ds_ver_t *,
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre ldma_message_header_t *, size_t, ldma_message_header_t **, size_t *);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
82629e3015252bf18319ba3815c773df23e21436Mike Christensen/*
82629e3015252bf18319ba3815c773df23e21436Mike Christensen * The domain service framework only allows connexion of a domain with
82629e3015252bf18319ba3815c773df23e21436Mike Christensen * the control domain. So agents not running in the control domain can
82629e3015252bf18319ba3815c773df23e21436Mike Christensen * only receive requests from the control domain. But, agents running
82629e3015252bf18319ba3815c773df23e21436Mike Christensen * on the control can receive requests from any domain.
82629e3015252bf18319ba3815c773df23e21436Mike Christensen *
82629e3015252bf18319ba3815c773df23e21436Mike Christensen * For agents running in the control domain, the LDMA_MSGFLG_ACCESS_*
82629e3015252bf18319ba3815c773df23e21436Mike Christensen * flags control whether messages sent by domains different from the
82629e3015252bf18319ba3815c773df23e21436Mike Christensen * control domain should be processed or not.
82629e3015252bf18319ba3815c773df23e21436Mike Christensen *
82629e3015252bf18319ba3815c773df23e21436Mike Christensen * If a message handler is defined with LDMA_MSGFLG_ACCESS_CONTROL then
82629e3015252bf18319ba3815c773df23e21436Mike Christensen * only messages sent by the control domain should be processed. Otherwise
82629e3015252bf18319ba3815c773df23e21436Mike Christensen * if a message handler is defined with LDMA_MSGFLG_ACCESS_ANY then messages
82629e3015252bf18319ba3815c773df23e21436Mike Christensen * sent by any domain can be processed.
82629e3015252bf18319ba3815c773df23e21436Mike Christensen */
82629e3015252bf18319ba3815c773df23e21436Mike Christensen#define LDMA_MSGFLG_ACCESS_CONTROL 0x00
82629e3015252bf18319ba3815c773df23e21436Mike Christensen#define LDMA_MSGFLG_ACCESS_ANY 0x01
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartretypedef struct ldma_msg_handler {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre uint32_t msg_type; /* message type */
82629e3015252bf18319ba3815c773df23e21436Mike Christensen uint32_t msg_flags; /* message flags */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre ldm_msg_func_t *msg_handler; /* message handler */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre} ldma_msg_handler_t;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartretypedef struct ldma_agent_info {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre char *name; /* agent name */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre ds_ver_t *vers; /* supported versions */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre int nvers; /* number of versions */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre ldma_msg_handler_t *handlers; /* message handlers */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre int nhandlers; /* number of handlers */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre} ldma_agent_info_t;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Helper functions for the daemon and agents.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/* function to allocate a result message */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartreldma_message_header_t *ldma_alloc_result_msg(ldma_message_header_t *, size_t);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/* functions to log messages */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrevoid ldma_err(char *module, char *fmt, ...);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrevoid ldma_info(char *module, char *fmt, ...);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrevoid ldma_dbg(char *module, char *fmt, ...);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Macros to log messages. Each module/file using these macros should define
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * LDMA_MODULE as the name under which messages are logged. For a given agent,
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * LDMA_MODULE should be set to the name of the agent.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_ERR(...) ldma_err(LDMA_MODULE, __VA_ARGS__)
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_INFO(...) ldma_info(LDMA_MODULE, __VA_ARGS__)
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_DBG(...) ldma_dbg(LDMA_MODULE, __VA_ARGS__)
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#ifdef __cplusplus
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre}
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#endif
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#endif /* _LDMA_H */