xref: /illumos-gate/usr/src/uts/sun4v/sys/dr_mem.h (revision 48002cedabe0873c8c28f536fff9a176c30fa517)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _DR_MEM_H
28 #define	_DR_MEM_H
29 
30 /*
31  * Memory DR Control Protocol
32  */
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 /*
39  * Memory DR Message Header
40  */
41 typedef struct {
42 	uint32_t	msg_type;	/* message type */
43 	uint32_t	msg_arg;	/* messages argument */
44 	uint64_t	req_num;	/* request number */
45 } dr_mem_hdr_t;
46 
47 /*
48  * Memory command and response messages
49  */
50 
51 #define	DR_MEM_DS_ID		"dr-mem"
52 
53 #define	DR_MEM_CONFIGURE	(0x4d43)	/* 'MC' configure mem */
54 #define	DR_MEM_UNCONFIGURE	(0x4d55)	/* 'MU' unconfigure  mem */
55 #define	DR_MEM_UNCONF_STATUS	(0x4d53)	/* 'MS' get mem unconf status */
56 #define	DR_MEM_UNCONF_CANCEL	(0x4d4e)	/* 'MN' cancel mem unconf */
57 #define	DR_MEM_QUERY		(0x4d51)	/* 'MQ' query mem info */
58 
59 #define	DR_MEM_OK		('o')
60 #define	DR_MEM_ERROR		('e')
61 
62 typedef struct {
63 	uint64_t	addr;		/* mblk base address */
64 	uint64_t	size;		/* mblk size */
65 } dr_mem_blk_t;
66 
67 /*
68  * Response Message
69  */
70 typedef struct {
71 	uint64_t	addr;		/* mblk base address */
72 	uint64_t	size;		/* mblk size */
73 	uint32_t	result;		/* result of the operation */
74 	uint32_t	status;		/* status of the mblk */
75 	uint32_t	string_off;	/* informational string offset */
76 	uint32_t	reserved;	/* padding */
77 } dr_mem_stat_t;
78 
79 typedef struct {
80 	uint64_t	addr;		/* query address */
81 	memquery_t	mq;		/* query results */
82 } dr_mem_query_t;
83 
84 /*
85  * Result Codes
86  */
87 #define	DR_MEM_RES_OK			0x0	/* operation succeeded */
88 #define	DR_MEM_RES_FAILURE		0x1	/* operation failed */
89 #define	DR_MEM_RES_BLOCKED		0x2	/* operation was blocked */
90 #define	DR_MEM_RES_NOT_IN_MD		0x3	/* memory not defined in MD */
91 #define	DR_MEM_RES_ESPAN		0x4	/* memory already in use */
92 #define	DR_MEM_RES_EFAULT		0x5	/* memory access test failed */
93 #define	DR_MEM_RES_ERESOURCE		0x6	/* resource not available */
94 #define	DR_MEM_RES_PERM			0x7	/* permanent pages in span */
95 #define	DR_MEM_RES_EBUSY		0x8	/* memory span busy */
96 #define	DR_MEM_RES_ENOTVIABLE		0x9	/* VM viability test failed */
97 #define	DR_MEM_RES_ENOWORK		0xA	/* no pages to unconfigure */
98 #define	DR_MEM_RES_ECANCELLED		0xB	/* operation cancelled */
99 #define	DR_MEM_RES_EREFUSED		0xC	/* operation refused */
100 #define	DR_MEM_RES_EDUP			0xD	/* memory span duplicate */
101 #define	DR_MEM_RES_EINVAL		0xE	/* invalid argument */
102 
103 /*
104  * Status Codes
105  */
106 #define	DR_MEM_STAT_NOT_PRESENT		0x0	/* mblk ID not in MD */
107 #define	DR_MEM_STAT_UNCONFIGURED	0x1	/* mblk unconfigured */
108 #define	DR_MEM_STAT_CONFIGURED		0x2	/* mblk configured */
109 
110 /*
111  * Macros to access arrays that follow message header
112  */
113 #define	DR_MEM_HDR(h)		((dr_mem_hdr_t *)(h))
114 #define	DR_MEM_CMD_MBLKS(h)	((dr_mem_blk_t *)((DR_MEM_HDR(h)) + 1))
115 #define	DR_MEM_RESP_STATS(h)	((dr_mem_stat_t *)((DR_MEM_HDR(h)) + 1))
116 #define	DR_MEM_RESP_DEL_STAT(h)	((memdelstat_t *)(DR_MEM_HDR(h) + 1))
117 #define	DR_MEM_RESP_QUERY(h)	((dr_mem_query_t *)(DR_MEM_HDR(h) + 1))
118 
119 #ifdef __cplusplus
120 }
121 #endif
122 
123 #endif /* _DR_MEM_H */
124