4 * Home page of code is: http://www.smartmontools.org
6 * Copyright (C) 2016-18 Christian Franke
8 * Original code from <linux/nvme.h>:
9 * Copyright (C) 2011-2014 Intel Corporation
11 * SPDX-License-Identifier: GPL-2.0-or-later
17 #define NVMECMDS_H_CVSID "$Id: nvmecmds.h 4842 2018-12-02 16:07:26Z chrfranke $"
21 // The code below was originally imported from <linux/nvme.h> include file from
22 // Linux kernel sources. Types from <linux/types.h> were replaced.
23 // Symbol names are unchanged but placed in a namespace to allow inclusion
24 // of the original <linux/nvme.h>.
25 namespace smartmontools
{
27 ////////////////////////////////////////////////////////////////////////////
28 // BEGIN: From <linux/nvme.h>
30 struct nvme_error_log_page
{
34 unsigned short status_field
;
35 unsigned short parm_error_location
;
39 unsigned char resv
[35];
42 struct nvme_id_power_state
{
43 unsigned short max_power
; // centiwatts
46 unsigned int entry_lat
; // microseconds
47 unsigned int exit_lat
; // microseconds
48 unsigned char read_tput
;
49 unsigned char read_lat
;
50 unsigned char write_tput
;
51 unsigned char write_lat
;
52 unsigned short idle_power
;
53 unsigned char idle_scale
;
55 unsigned short active_power
;
56 unsigned char active_work_scale
;
57 unsigned char rsvd23
[9];
67 unsigned char ieee
[3];
70 unsigned short cntlid
;
76 unsigned char rsvd100
[156];
86 unsigned short wctemp
;
87 unsigned short cctemp
;
91 unsigned char tnvmcap
[16];
92 unsigned char unvmcap
[16];
100 unsigned short mxtmt
;
101 unsigned int sanicap
;
102 unsigned char rsvd332
[180];
105 unsigned short maxcmd
;
108 unsigned short fuses
;
112 unsigned short awupf
;
114 unsigned char rsvd531
;
116 unsigned char rsvd534
[2];
118 unsigned char rsvd540
[228];
120 unsigned char rsvd1024
[768];
123 unsigned short icdoff
;
124 unsigned char ctrattr
;
126 unsigned char rsvd1804
[244];
127 struct nvme_id_power_state psd
[32];
128 unsigned char vs
[1024];
141 unsigned char nsfeat
;
148 unsigned char rescap
;
150 unsigned char rsvd33
;
151 unsigned short nawun
;
152 unsigned short nawupf
;
153 unsigned short nacwu
;
154 unsigned short nabsn
;
156 unsigned short nabspf
;
157 unsigned char rsvd46
[2];
158 unsigned char nvmcap
[16];
159 unsigned char rsvd64
[40];
160 unsigned char nguid
[16];
161 unsigned char eui64
[8];
162 struct nvme_lbaf lbaf
[16];
163 unsigned char rsvd192
[192];
164 unsigned char vs
[3712];
167 struct nvme_smart_log
{
168 unsigned char critical_warning
;
169 unsigned char temperature
[2];
170 unsigned char avail_spare
;
171 unsigned char spare_thresh
;
172 unsigned char percent_used
;
173 unsigned char rsvd6
[26];
174 unsigned char data_units_read
[16];
175 unsigned char data_units_written
[16];
176 unsigned char host_reads
[16];
177 unsigned char host_writes
[16];
178 unsigned char ctrl_busy_time
[16];
179 unsigned char power_cycles
[16];
180 unsigned char power_on_hours
[16];
181 unsigned char unsafe_shutdowns
[16];
182 unsigned char media_errors
[16];
183 unsigned char num_err_log_entries
[16];
184 unsigned int warning_temp_time
;
185 unsigned int critical_comp_time
;
186 unsigned short temp_sensor
[8];
187 unsigned int thm_temp1_trans_count
;
188 unsigned int thm_temp2_trans_count
;
189 unsigned int thm_temp1_total_time
;
190 unsigned int thm_temp2_total_time
;
191 unsigned char rsvd232
[280];
194 enum nvme_admin_opcode
{
195 //nvme_admin_delete_sq = 0x00,
196 //nvme_admin_create_sq = 0x01,
197 nvme_admin_get_log_page
= 0x02,
198 //nvme_admin_delete_cq = 0x04,
199 //nvme_admin_create_cq = 0x05,
200 nvme_admin_identify
= 0x06,
201 //nvme_admin_abort_cmd = 0x08,
202 //nvme_admin_set_features = 0x09,
203 //nvme_admin_get_features = 0x0a,
204 //nvme_admin_async_event = 0x0c,
205 //nvme_admin_ns_mgmt = 0x0d,
206 //nvme_admin_activate_fw = 0x10,
207 //nvme_admin_download_fw = 0x11,
208 //nvme_admin_ns_attach = 0x15,
209 //nvme_admin_format_nvm = 0x80,
210 //nvme_admin_security_send = 0x81,
211 //nvme_admin_security_recv = 0x82,
214 // END: From <linux/nvme.h>
215 ////////////////////////////////////////////////////////////////////////////
217 } // namespace smartmontools
221 // Print NVMe debug messages?
222 extern unsigned char nvme_debugmode
;
224 // Read NVMe Identify Controller data structure.
225 bool nvme_read_id_ctrl(nvme_device
* device
, smartmontools::nvme_id_ctrl
& id_ctrl
);
227 // Read NVMe Identify Namespace data structure for namespace NSID.
228 bool nvme_read_id_ns(nvme_device
* device
, unsigned nsid
, smartmontools::nvme_id_ns
& id_ns
);
230 // Read NVMe log page with identifier LID.
231 bool nvme_read_log_page(nvme_device
* device
, unsigned char lid
, void * data
,
232 unsigned size
, bool broadcast_nsid
);
234 // Read NVMe Error Information Log.
235 bool nvme_read_error_log(nvme_device
* device
, smartmontools::nvme_error_log_page
* error_log
,
236 unsigned num_entries
);
238 // Read NVMe SMART/Health Information log.
239 bool nvme_read_smart_log(nvme_device
* device
, smartmontools::nvme_smart_log
& smart_log
);