]> git.proxmox.com Git - mirror_smartmontools-debian.git/blob - nvmecmds.h
3e8f62f84789379ef3f2500f9fa1d265ac82b2c2
[mirror_smartmontools-debian.git] / nvmecmds.h
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
24 #define NVMECMDS_H_CVSID "$Id: nvmecmds.h 4488 2017-09-25 11:54:15Z samm2 $"
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;
95 unsigned int ctratt;
96 unsigned char rsvd100[156];
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;
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];
123 unsigned char sqes;
124 unsigned char cqes;
125 unsigned short maxcmd;
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;
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];
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];
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];
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