/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef _DR_MEM_H
#define	_DR_MEM_H

/*
 * Memory DR Control Protocol
 */

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Memory DR Message Header
 */
typedef struct {
	uint32_t	msg_type;	/* message type */
	uint32_t	msg_arg;	/* messages argument */
	uint64_t	req_num;	/* request number */
} dr_mem_hdr_t;

/*
 * Memory command and response messages
 */

#define	DR_MEM_DS_ID		"dr-mem"

#define	DR_MEM_CONFIGURE	(0x4d43)	/* 'MC' configure mem */
#define	DR_MEM_UNCONFIGURE	(0x4d55)	/* 'MU' unconfigure  mem */
#define	DR_MEM_UNCONF_STATUS	(0x4d53)	/* 'MS' get mem unconf status */
#define	DR_MEM_UNCONF_CANCEL	(0x4d4e)	/* 'MN' cancel mem unconf */
#define	DR_MEM_QUERY		(0x4d51)	/* 'MQ' query mem info */

#define	DR_MEM_OK		('o')
#define	DR_MEM_ERROR		('e')

typedef struct {
	uint64_t	addr;		/* mblk base address */
	uint64_t	size;		/* mblk size */
} dr_mem_blk_t;

/*
 * Response Message
 */
typedef struct {
	uint64_t	addr;		/* mblk base address */
	uint64_t	size;		/* mblk size */
	uint32_t	result;		/* result of the operation */
	uint32_t	status;		/* status of the mblk */
	uint32_t	string_off;	/* informational string offset */
	uint32_t	reserved;	/* padding */
} dr_mem_stat_t;

typedef struct {
	uint64_t	addr;		/* query address */
	memquery_t	mq;		/* query results */
} dr_mem_query_t;

/*
 * Result Codes
 */
#define	DR_MEM_RES_OK			0x0	/* operation succeeded */
#define	DR_MEM_RES_FAILURE		0x1	/* operation failed */
#define	DR_MEM_RES_BLOCKED		0x2	/* operation was blocked */
#define	DR_MEM_RES_NOT_IN_MD		0x3	/* memory not defined in MD */
#define	DR_MEM_RES_ESPAN		0x4	/* memory already in use */
#define	DR_MEM_RES_EFAULT		0x5	/* memory access test failed */
#define	DR_MEM_RES_ERESOURCE		0x6	/* resource not available */
#define	DR_MEM_RES_PERM			0x7	/* permanent pages in span */
#define	DR_MEM_RES_EBUSY		0x8	/* memory span busy */
#define	DR_MEM_RES_ENOTVIABLE		0x9	/* VM viability test failed */
#define	DR_MEM_RES_ENOWORK		0xA	/* no pages to unconfigure */
#define	DR_MEM_RES_ECANCELLED		0xB	/* operation cancelled */
#define	DR_MEM_RES_EREFUSED		0xC	/* operation refused */
#define	DR_MEM_RES_EDUP			0xD	/* memory span duplicate */
#define	DR_MEM_RES_EINVAL		0xE	/* invalid argument */

/*
 * Sub-Result Codes
 */
#define	DR_MEM_SRES_NONE		0x0	/* no sub-result */
#define	DR_MEM_SRES_OS_SUSPENDED	0x1	/* blocked due to OS suspend */

/*
 * Status Codes
 */
#define	DR_MEM_STAT_NOT_PRESENT		0x0	/* mblk ID not in MD */
#define	DR_MEM_STAT_UNCONFIGURED	0x1	/* mblk unconfigured */
#define	DR_MEM_STAT_CONFIGURED		0x2	/* mblk configured */

/*
 * Macros to access arrays that follow message header
 */
#define	DR_MEM_HDR(h)		((dr_mem_hdr_t *)(h))
#define	DR_MEM_CMD_MBLKS(h)	((dr_mem_blk_t *)((DR_MEM_HDR(h)) + 1))
#define	DR_MEM_RESP_STATS(h)	((dr_mem_stat_t *)((DR_MEM_HDR(h)) + 1))
#define	DR_MEM_RESP_DEL_STAT(h)	((memdelstat_t *)(DR_MEM_HDR(h) + 1))
#define	DR_MEM_RESP_QUERY(h)	((dr_mem_query_t *)(DR_MEM_HDR(h) + 1))

#ifdef __cplusplus
}
#endif

#endif /* _DR_MEM_H */