-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmnvme_spec.h
183 lines (156 loc) · 2.75 KB
/
mnvme_spec.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#pragma once
#define BYTES_PER_WORD 4
#define PAGE_SIZE_IN_WORD 1024
#define SPECIAL_VALUE "ohs"
enum MVNME_KVS_OPS {
MNVME_SPEC_KV_OPC_STORE = 0x81,
MNVME_SPEC_KV_OPC_RETRIEVE = 0x90,
MNVME_SPEC_KV_OPC_DELETE = 0xA1,
MNVME_SPEC_KV_OPC_EXIST = 0xB3,
MNVME_SPEC_KV_OPC_LIST = 0x85,
};
struct nvme_common_command {
__u8 opcode;
__u8 flags; //fused op : 2, reserved : 4, psdt : 2
__u16 command_id;
__le32 nsid;
__le32 cdw2[2];
__le64 metadata;
__le64 prp1;
union {
struct{
__u32 metadata_len;
__u32 data_len;
};
struct{
__le64 prp2;
};
};
__le32 cdw10[6];
};
struct nvme_kv_store_command {
/* cdw 0*/
__u8 opcode;
__u8 flags;
__u16 command_id;
/* cdw 1*/
__le32 nsid;
/* cdw 2-3*/
__u64 rsvd;
/* cdw 4*/
__le32 offset;
/* cdw 5*/
__u32 rsvd2;
/* cdw 6-9*/
__le64 prp1;
union {
struct{
__u32 metadata_len;
__u32 data_len;
};
struct{
__le64 prp2;
};
};
/* cdw 10 */
__le32 value_len; /* size in word */
/*cdw 11 */
__u8 key_len; /* 0 ~ 255 (keylen - 1) */
__u8 option;
__u8 invalid_byte : 2;
__u8 rsvd3 : 6;
__u8 rsvd4;
char key[16];
};
struct nvme_kv_append_command {
__u8 opcode;
__u8 flags;
__u16 command_id;
__le32 nsid;
__u64 rsvd;
__le32 offset;
__u32 rsvd2;
/* cdw 6-9*/
__le64 prp1;
union {
struct{
__u32 metadata_len;
__u32 data_len;
};
struct{
__le64 prp2;
};
};
__le32 value_len; /* size in word */
__u8 key_len; /* 0 ~ 255 (keylen - 1) */
__u8 option;
__u8 invalid_byte : 2;
__u8 rsvd3 : 6;
__u8 rsvd4;
char key[16];
};
struct nvme_kv_retrieve_command {
__u8 opcode;
__u8 flags;
__u16 command_id;
__le32 nsid;
__u64 rsvd;
__le32 offset;
__u32 rsvd2;
/* cdw 6-9*/
__le64 prp1;
union {
struct{
__u32 metadata_len;
__u32 data_len;
};
struct{
__le64 prp2;
};
};
__le32 value_len; /* size in word */
__u8 key_len; /* 0 ~ 255 (keylen - 1) */
__u8 option;
__u16 rsvd3;
char key[16];
};
struct nvme_kv_delete_command {
__u8 opcode;
__u8 flags;
__u16 command_id;
__le32 nsid;
__u64 rsvd;
__le32 offset;
__u32 rsvd2;
__u64 rsvd3[2];
__le32 value_len; /* size in word */
__u8 key_len; /* 0 ~ 255 (keylen - 1) */
__u8 option;
__u16 rsvd4;
char key[16];
};
struct nvme_kv_exist_command {
__u8 opcode;
__u8 flags;
__u16 command_id;
__le32 nsid;
__u64 rsvd;
__le32 offset;
__u32 rsvd2;
__u64 rsvd3[2];
__le32 value_len; /* size in word */
__u8 key_len; /* 0 ~ 255 (keylen - 1) */
__u8 option;
__u16 rsvd4;
char key[16];
};
struct nvme_kv_command {
union {
struct nvme_common_command common;
struct nvme_kv_store_command kv_store;
struct nvme_kv_retrieve_command kv_retrieve;
struct nvme_kv_delete_command kv_delete;
struct nvme_kv_append_command kv_append;
struct nvme_kv_exist_command kv_exist;
};
};