]>
Commit | Line | Data |
---|---|---|
a86ec89e GI |
1 | /* |
2 | * nvmecmds.h | |
3 | * | |
4 | * Home page of code is: http://www.smartmontools.org | |
5 | * | |
ff28b140 | 6 | * Copyright (C) 2016-18 Christian Franke |
a86ec89e GI |
7 | * |
8 | * Original code from <linux/nvme.h>: | |
9 | * Copyright (C) 2011-2014 Intel Corporation | |
10 | * | |
ff28b140 | 11 | * SPDX-License-Identifier: GPL-2.0-or-later |
a86ec89e GI |
12 | */ |
13 | ||
14 | #ifndef NVMECMDS_H | |
15 | #define NVMECMDS_H | |
16 | ||
ff28b140 | 17 | #define NVMECMDS_H_CVSID "$Id: nvmecmds.h 4842 2018-12-02 16:07:26Z chrfranke $" |
a86ec89e | 18 | |
ff28b140 | 19 | #include <stdint.h> |
a86ec89e | 20 | |
ff28b140 | 21 | // The code below was originally imported from <linux/nvme.h> include file from |
a86ec89e GI |
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 { | |
26 | ||
27 | //////////////////////////////////////////////////////////////////////////// | |
28 | // BEGIN: From <linux/nvme.h> | |
a86ec89e GI |
29 | |
30 | struct nvme_error_log_page { | |
31 | uint64_t error_count; | |
32 | unsigned short sqid; | |
33 | unsigned short cmdid; | |
34 | unsigned short status_field; | |
35 | unsigned short parm_error_location; | |
36 | uint64_t lba; | |
37 | unsigned int nsid; | |
38 | unsigned char vs; | |
39 | unsigned char resv[35]; | |
40 | }; | |
41 | ||
42 | struct nvme_id_power_state { | |
43 | unsigned short max_power; // centiwatts | |
44 | unsigned char rsvd2; | |
45 | unsigned char flags; | |
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; | |
54 | unsigned char rsvd19; | |
55 | unsigned short active_power; | |
56 | unsigned char active_work_scale; | |
57 | unsigned char rsvd23[9]; | |
58 | }; | |
59 | ||
60 | struct nvme_id_ctrl { | |
61 | unsigned short vid; | |
62 | unsigned short ssvid; | |
63 | char sn[20]; | |
64 | char mn[40]; | |
65 | char fr[8]; | |
66 | unsigned char rab; | |
67 | unsigned char ieee[3]; | |
68 | unsigned char cmic; | |
69 | unsigned char mdts; | |
70 | unsigned short cntlid; | |
71 | unsigned int ver; | |
72 | unsigned int rtd3r; | |
73 | unsigned int rtd3e; | |
74 | unsigned int oaes; | |
f9e10201 JD |
75 | unsigned int ctratt; |
76 | unsigned char rsvd100[156]; | |
a86ec89e GI |
77 | unsigned short oacs; |
78 | unsigned char acl; | |
79 | unsigned char aerl; | |
80 | unsigned char frmw; | |
81 | unsigned char lpa; | |
82 | unsigned char elpe; | |
83 | unsigned char npss; | |
84 | unsigned char avscc; | |
85 | unsigned char apsta; | |
86 | unsigned short wctemp; | |
87 | unsigned short cctemp; | |
88 | unsigned short mtfa; | |
89 | unsigned int hmpre; | |
90 | unsigned int hmmin; | |
91 | unsigned char tnvmcap[16]; | |
92 | unsigned char unvmcap[16]; | |
93 | unsigned int rpmbs; | |
f9e10201 JD |
94 | unsigned short edstt; |
95 | unsigned char dsto; | |
96 | unsigned char fwug; | |
97 | unsigned short kas; | |
98 | unsigned short hctma; | |
99 | unsigned short mntmt; | |
100 | unsigned short mxtmt; | |
101 | unsigned int sanicap; | |
102 | unsigned char rsvd332[180]; | |
a86ec89e GI |
103 | unsigned char sqes; |
104 | unsigned char cqes; | |
f9e10201 | 105 | unsigned short maxcmd; |
a86ec89e GI |
106 | unsigned int nn; |
107 | unsigned short oncs; | |
108 | unsigned short fuses; | |
109 | unsigned char fna; | |
110 | unsigned char vwc; | |
111 | unsigned short awun; | |
112 | unsigned short awupf; | |
113 | unsigned char nvscc; | |
114 | unsigned char rsvd531; | |
115 | unsigned short acwu; | |
116 | unsigned char rsvd534[2]; | |
117 | unsigned int sgls; | |
f9e10201 JD |
118 | unsigned char rsvd540[228]; |
119 | char subnqn[256]; | |
120 | unsigned char rsvd1024[768]; | |
121 | unsigned int ioccsz; | |
122 | unsigned int iorcsz; | |
123 | unsigned short icdoff; | |
124 | unsigned char ctrattr; | |
125 | unsigned char msdbd; | |
126 | unsigned char rsvd1804[244]; | |
a86ec89e GI |
127 | struct nvme_id_power_state psd[32]; |
128 | unsigned char vs[1024]; | |
129 | }; | |
130 | ||
131 | struct nvme_lbaf { | |
132 | unsigned short ms; | |
133 | unsigned char ds; | |
134 | unsigned char rp; | |
135 | }; | |
136 | ||
137 | struct nvme_id_ns { | |
138 | uint64_t nsze; | |
139 | uint64_t ncap; | |
140 | uint64_t nuse; | |
141 | unsigned char nsfeat; | |
142 | unsigned char nlbaf; | |
143 | unsigned char flbas; | |
144 | unsigned char mc; | |
145 | unsigned char dpc; | |
146 | unsigned char dps; | |
147 | unsigned char nmic; | |
148 | unsigned char rescap; | |
149 | unsigned char fpi; | |
150 | unsigned char rsvd33; | |
151 | unsigned short nawun; | |
152 | unsigned short nawupf; | |
153 | unsigned short nacwu; | |
154 | unsigned short nabsn; | |
155 | unsigned short nabo; | |
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]; | |
165 | }; | |
166 | ||
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]; | |
f9e10201 JD |
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]; | |
a86ec89e GI |
192 | }; |
193 | ||
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, | |
212 | }; | |
213 | ||
214 | // END: From <linux/nvme.h> | |
215 | //////////////////////////////////////////////////////////////////////////// | |
216 | ||
217 | } // namespace smartmontools | |
218 | ||
219 | class nvme_device; | |
220 | ||
221 | // Print NVMe debug messages? | |
222 | extern unsigned char nvme_debugmode; | |
223 | ||
224 | // Read NVMe Identify Controller data structure. | |
225 | bool nvme_read_id_ctrl(nvme_device * device, smartmontools::nvme_id_ctrl & id_ctrl); | |
226 | ||
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); | |
229 | ||
230 | // Read NVMe log page with identifier LID. | |
ff28b140 TL |
231 | bool nvme_read_log_page(nvme_device * device, unsigned char lid, void * data, |
232 | unsigned size, bool broadcast_nsid); | |
a86ec89e GI |
233 | |
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); | |
237 | ||
238 | // Read NVMe SMART/Health Information log. | |
239 | bool nvme_read_smart_log(nvme_device * device, smartmontools::nvme_smart_log & smart_log); | |
240 | ||
241 | #endif // NVMECMDS_H |