]>
Commit | Line | Data |
---|---|---|
a86ec89e GI |
1 | /* |
2 | * nvmecmds.h | |
3 | * | |
4 | * Home page of code is: http://www.smartmontools.org | |
5 | * | |
6 | * Copyright (C) 2016 Christian Franke | |
7 | * | |
8 | * Original code from <linux/nvme.h>: | |
9 | * Copyright (C) 2011-2014 Intel Corporation | |
10 | * | |
11 | * This program is free software; you can redistribute it and/or modify | |
12 | * it under the terms of the GNU General Public License as published by | |
13 | * the Free Software Foundation; either version 2, or (at your option) | |
14 | * any later version. | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License | |
17 | * (for example COPYING); If not, see <http://www.gnu.org/licenses/>. | |
18 | * | |
19 | */ | |
20 | ||
21 | #ifndef NVMECMDS_H | |
22 | #define NVMECMDS_H | |
23 | ||
f9e10201 | 24 | #define NVMECMDS_H_CVSID "$Id: nvmecmds.h 4488 2017-09-25 11:54:15Z samm2 $" |
a86ec89e GI |
25 | |
26 | #include "int64.h" | |
27 | ||
28 | // The code below was orginally imported from <linux/nvme.h> include file from | |
29 | // Linux kernel sources. Types from <linux/types.h> were replaced. | |
30 | // Symbol names are unchanged but placed in a namespace to allow inclusion | |
31 | // of the original <linux/nvme.h>. | |
32 | namespace smartmontools { | |
33 | ||
34 | //////////////////////////////////////////////////////////////////////////// | |
35 | // BEGIN: From <linux/nvme.h> | |
36 | /* | |
37 | * Definitions for the NVM Express interface | |
38 | * Copyright (c) 2011-2014, Intel Corporation. | |
39 | * | |
40 | * This program is free software; you can redistribute it and/or modify it | |
41 | * under the terms and conditions of the GNU General Public License, | |
42 | * version 2, as published by the Free Software Foundation. | |
43 | * | |
44 | * This program is distributed in the hope it will be useful, but WITHOUT | |
45 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
46 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
47 | * more details. | |
48 | */ | |
49 | ||
50 | struct nvme_error_log_page { | |
51 | uint64_t error_count; | |
52 | unsigned short sqid; | |
53 | unsigned short cmdid; | |
54 | unsigned short status_field; | |
55 | unsigned short parm_error_location; | |
56 | uint64_t lba; | |
57 | unsigned int nsid; | |
58 | unsigned char vs; | |
59 | unsigned char resv[35]; | |
60 | }; | |
61 | ||
62 | struct nvme_id_power_state { | |
63 | unsigned short max_power; // centiwatts | |
64 | unsigned char rsvd2; | |
65 | unsigned char flags; | |
66 | unsigned int entry_lat; // microseconds | |
67 | unsigned int exit_lat; // microseconds | |
68 | unsigned char read_tput; | |
69 | unsigned char read_lat; | |
70 | unsigned char write_tput; | |
71 | unsigned char write_lat; | |
72 | unsigned short idle_power; | |
73 | unsigned char idle_scale; | |
74 | unsigned char rsvd19; | |
75 | unsigned short active_power; | |
76 | unsigned char active_work_scale; | |
77 | unsigned char rsvd23[9]; | |
78 | }; | |
79 | ||
80 | struct nvme_id_ctrl { | |
81 | unsigned short vid; | |
82 | unsigned short ssvid; | |
83 | char sn[20]; | |
84 | char mn[40]; | |
85 | char fr[8]; | |
86 | unsigned char rab; | |
87 | unsigned char ieee[3]; | |
88 | unsigned char cmic; | |
89 | unsigned char mdts; | |
90 | unsigned short cntlid; | |
91 | unsigned int ver; | |
92 | unsigned int rtd3r; | |
93 | unsigned int rtd3e; | |
94 | unsigned int oaes; | |
f9e10201 JD |
95 | unsigned int ctratt; |
96 | unsigned char rsvd100[156]; | |
a86ec89e GI |
97 | unsigned short oacs; |
98 | unsigned char acl; | |
99 | unsigned char aerl; | |
100 | unsigned char frmw; | |
101 | unsigned char lpa; | |
102 | unsigned char elpe; | |
103 | unsigned char npss; | |
104 | unsigned char avscc; | |
105 | unsigned char apsta; | |
106 | unsigned short wctemp; | |
107 | unsigned short cctemp; | |
108 | unsigned short mtfa; | |
109 | unsigned int hmpre; | |
110 | unsigned int hmmin; | |
111 | unsigned char tnvmcap[16]; | |
112 | unsigned char unvmcap[16]; | |
113 | unsigned int rpmbs; | |
f9e10201 JD |
114 | unsigned short edstt; |
115 | unsigned char dsto; | |
116 | unsigned char fwug; | |
117 | unsigned short kas; | |
118 | unsigned short hctma; | |
119 | unsigned short mntmt; | |
120 | unsigned short mxtmt; | |
121 | unsigned int sanicap; | |
122 | unsigned char rsvd332[180]; | |
a86ec89e GI |
123 | unsigned char sqes; |
124 | unsigned char cqes; | |
f9e10201 | 125 | unsigned short maxcmd; |
a86ec89e GI |
126 | unsigned int nn; |
127 | unsigned short oncs; | |
128 | unsigned short fuses; | |
129 | unsigned char fna; | |
130 | unsigned char vwc; | |
131 | unsigned short awun; | |
132 | unsigned short awupf; | |
133 | unsigned char nvscc; | |
134 | unsigned char rsvd531; | |
135 | unsigned short acwu; | |
136 | unsigned char rsvd534[2]; | |
137 | unsigned int sgls; | |
f9e10201 JD |
138 | unsigned char rsvd540[228]; |
139 | char subnqn[256]; | |
140 | unsigned char rsvd1024[768]; | |
141 | unsigned int ioccsz; | |
142 | unsigned int iorcsz; | |
143 | unsigned short icdoff; | |
144 | unsigned char ctrattr; | |
145 | unsigned char msdbd; | |
146 | unsigned char rsvd1804[244]; | |
a86ec89e GI |
147 | struct nvme_id_power_state psd[32]; |
148 | unsigned char vs[1024]; | |
149 | }; | |
150 | ||
151 | struct nvme_lbaf { | |
152 | unsigned short ms; | |
153 | unsigned char ds; | |
154 | unsigned char rp; | |
155 | }; | |
156 | ||
157 | struct nvme_id_ns { | |
158 | uint64_t nsze; | |
159 | uint64_t ncap; | |
160 | uint64_t nuse; | |
161 | unsigned char nsfeat; | |
162 | unsigned char nlbaf; | |
163 | unsigned char flbas; | |
164 | unsigned char mc; | |
165 | unsigned char dpc; | |
166 | unsigned char dps; | |
167 | unsigned char nmic; | |
168 | unsigned char rescap; | |
169 | unsigned char fpi; | |
170 | unsigned char rsvd33; | |
171 | unsigned short nawun; | |
172 | unsigned short nawupf; | |
173 | unsigned short nacwu; | |
174 | unsigned short nabsn; | |
175 | unsigned short nabo; | |
176 | unsigned short nabspf; | |
177 | unsigned char rsvd46[2]; | |
178 | unsigned char nvmcap[16]; | |
179 | unsigned char rsvd64[40]; | |
180 | unsigned char nguid[16]; | |
181 | unsigned char eui64[8]; | |
182 | struct nvme_lbaf lbaf[16]; | |
183 | unsigned char rsvd192[192]; | |
184 | unsigned char vs[3712]; | |
185 | }; | |
186 | ||
187 | struct nvme_smart_log { | |
188 | unsigned char critical_warning; | |
189 | unsigned char temperature[2]; | |
190 | unsigned char avail_spare; | |
191 | unsigned char spare_thresh; | |
192 | unsigned char percent_used; | |
193 | unsigned char rsvd6[26]; | |
194 | unsigned char data_units_read[16]; | |
195 | unsigned char data_units_written[16]; | |
196 | unsigned char host_reads[16]; | |
197 | unsigned char host_writes[16]; | |
198 | unsigned char ctrl_busy_time[16]; | |
199 | unsigned char power_cycles[16]; | |
200 | unsigned char power_on_hours[16]; | |
201 | unsigned char unsafe_shutdowns[16]; | |
202 | unsigned char media_errors[16]; | |
203 | unsigned char num_err_log_entries[16]; | |
204 | unsigned int warning_temp_time; | |
205 | unsigned int critical_comp_time; | |
206 | unsigned short temp_sensor[8]; | |
f9e10201 JD |
207 | unsigned int thm_temp1_trans_count; |
208 | unsigned int thm_temp2_trans_count; | |
209 | unsigned int thm_temp1_total_time; | |
210 | unsigned int thm_temp2_total_time; | |
211 | unsigned char rsvd232[280]; | |
a86ec89e GI |
212 | }; |
213 | ||
214 | enum nvme_admin_opcode { | |
215 | //nvme_admin_delete_sq = 0x00, | |
216 | //nvme_admin_create_sq = 0x01, | |
217 | nvme_admin_get_log_page = 0x02, | |
218 | //nvme_admin_delete_cq = 0x04, | |
219 | //nvme_admin_create_cq = 0x05, | |
220 | nvme_admin_identify = 0x06, | |
221 | //nvme_admin_abort_cmd = 0x08, | |
222 | //nvme_admin_set_features = 0x09, | |
223 | //nvme_admin_get_features = 0x0a, | |
224 | //nvme_admin_async_event = 0x0c, | |
225 | //nvme_admin_ns_mgmt = 0x0d, | |
226 | //nvme_admin_activate_fw = 0x10, | |
227 | //nvme_admin_download_fw = 0x11, | |
228 | //nvme_admin_ns_attach = 0x15, | |
229 | //nvme_admin_format_nvm = 0x80, | |
230 | //nvme_admin_security_send = 0x81, | |
231 | //nvme_admin_security_recv = 0x82, | |
232 | }; | |
233 | ||
234 | // END: From <linux/nvme.h> | |
235 | //////////////////////////////////////////////////////////////////////////// | |
236 | ||
237 | } // namespace smartmontools | |
238 | ||
239 | class nvme_device; | |
240 | ||
241 | // Print NVMe debug messages? | |
242 | extern unsigned char nvme_debugmode; | |
243 | ||
244 | // Read NVMe Identify Controller data structure. | |
245 | bool nvme_read_id_ctrl(nvme_device * device, smartmontools::nvme_id_ctrl & id_ctrl); | |
246 | ||
247 | // Read NVMe Identify Namespace data structure for namespace NSID. | |
248 | bool nvme_read_id_ns(nvme_device * device, unsigned nsid, smartmontools::nvme_id_ns & id_ns); | |
249 | ||
250 | // Read NVMe log page with identifier LID. | |
251 | bool nvme_read_log_page(nvme_device * device, unsigned char lid, void * data, unsigned size); | |
252 | ||
253 | // Read NVMe Error Information Log. | |
254 | bool nvme_read_error_log(nvme_device * device, smartmontools::nvme_error_log_page * error_log, | |
255 | unsigned num_entries); | |
256 | ||
257 | // Read NVMe SMART/Health Information log. | |
258 | bool nvme_read_smart_log(nvme_device * device, smartmontools::nvme_smart_log & smart_log); | |
259 | ||
260 | #endif // NVMECMDS_H |