1#![allow(dead_code)]
2
3use modular_bitfield::prelude::*;
4
5use crate::ds::{Microseconds, Minutes, OneHundredMilliseconds};
6
7#[derive(Clone, Debug)]
8#[repr(C)]
9pub struct IdentifyControllerDataStructure {
10 pub vendor: u16,
11 pub subsystem_vendor_id: u16,
12 pub serial_number: [u8; 20],
13 pub model_number: [u8; 40],
14 pub firmware_revision: u64,
15 pub reccommended_arbitration_burst: u8,
16 pub ieee_oui_identifier: [u8; 3],
17 pub multipath_io_and_namespace_sharing_caps: MultipathIONamespaceSharingCaps,
18 pub max_data_transfer_size: u8,
19 pub controller_id: u16,
20 pub version: u32,
21 pub rtd3_resume_latency: Microseconds,
22 pub rtd3_entry_latency: Microseconds,
23 pub optional_async_events_supported: OptionalAsyncEventsSupported,
24 pub controller_attributes: ControllerAttributes,
25 pub read_recovery_levels_supported: ReadRecoveryLevelsSupported,
26 pub res0: [u8; 9],
27 pub controller_type: ControllerType,
28 pub fru_globally_unique_identifier: u128,
29 pub command_retry_delay_time_1: OneHundredMilliseconds,
30 pub command_retry_delay_time_2: OneHundredMilliseconds,
31 pub command_retry_delay_time_3: OneHundredMilliseconds,
32 pub res1: [u8; 106],
33 pub res2: [u8; 13],
34 pub nvm_subsystem_report: NvmSubsystemReport,
35 pub vpd_write_cycle_info: VPDWriteCycleInfo,
36 pub management_endpoint_capabilities: ManagementEndpointCapabilities,
37 pub optional_admin_command_support: OptionalAdminCommandSupport,
38 pub abort_command_limit: u8,
39 pub async_event_request_limit: u8,
40 pub firmware_updates: FirmwareUpdates,
41 pub log_page_attributes: LogPageAttributes,
42 pub error_log_page_entries: u8,
43 pub nr_power_states_support: u8,
44 pub admin_vendor_specific_command_config: u8,
45 pub autonomous_power_state_transition_attributes: u8,
46 pub warning_composite_temp_threshold: u16,
47 pub critical_composite_temp_threshold: u16,
48 pub max_time_for_firmware_activation: OneHundredMilliseconds,
49 pub host_memory_buffer_preferred_size: u32,
50 pub host_memory_buffer_minimum_size: [u16; 2],
51 pub total_nvm_capacity: [u32; 4],
52 pub unallocated_nvm_capacity: [u32; 4],
53 pub replay_protected_memory_block_support: ReplayProtectedMemoryBlockSupport,
54 pub extended_device_self_test_time: Minutes,
55 pub device_self_test_options: u8,
56 pub firmware_upgrade_granularity: u8,
57 pub keep_alive_support: OneHundredMilliseconds,
58 pub host_controlled_thermal_management_attributes: u16,
59 pub min_thermal_management_temp: u16,
60 pub max_thermal_management_temp: u16,
61 pub sanitize_capabilities: SanitizeCapabilities,
62 pub host_memory_buffer_min_desc_entry_size: u32,
63 pub host_memory_buffer_max_desc_entries: u16,
64 pub nvm_set_ident_maximum: u16,
65 pub endurance_group_ident_maximum: u16,
66 pub res3: [u8; 170],
67 pub sub_queue_entry_size: u8,
68 pub com_queue_entry_size: u8,
69 pub max_outstanding_cmds: u16,
70 pub number_of_namespaces: u32,
71 pub optional_cmd_support: u16,
72 pub fused_operation_support: u16,
73 pub format_nvm_attributes: u8,
74 pub volatile_write_cache: u8,
75 pub atomic_write_unit_normal: u16,
76 pub atomic_write_unit_pfail: u16,
77 pub _unsupported: [u8; 6],
78 pub sgl_support: SglSupport,
79 _res_todo: [u8; 3556],
80}
81
82impl Default for IdentifyControllerDataStructure {
83 fn default() -> Self {
84 Self {
85 vendor: Default::default(),
86 subsystem_vendor_id: Default::default(),
87 serial_number: Default::default(),
88 model_number: [0; 40],
89 firmware_revision: Default::default(),
90 reccommended_arbitration_burst: Default::default(),
91 ieee_oui_identifier: Default::default(),
92 multipath_io_and_namespace_sharing_caps: Default::default(),
93 max_data_transfer_size: Default::default(),
94 controller_id: Default::default(),
95 version: Default::default(),
96 rtd3_resume_latency: Default::default(),
97 rtd3_entry_latency: Default::default(),
98 optional_async_events_supported: Default::default(),
99 controller_attributes: Default::default(),
100 read_recovery_levels_supported: Default::default(),
101 res0: Default::default(),
102 controller_type: ControllerType::IOController,
103 fru_globally_unique_identifier: Default::default(),
104 command_retry_delay_time_1: Default::default(),
105 command_retry_delay_time_2: Default::default(),
106 command_retry_delay_time_3: Default::default(),
107 res1: [0; 106],
108 res2: Default::default(),
109 nvm_subsystem_report: Default::default(),
110 vpd_write_cycle_info: Default::default(),
111 management_endpoint_capabilities: Default::default(),
112 optional_admin_command_support: Default::default(),
113 abort_command_limit: Default::default(),
114 async_event_request_limit: Default::default(),
115 firmware_updates: Default::default(),
116 log_page_attributes: Default::default(),
117 error_log_page_entries: Default::default(),
118 nr_power_states_support: Default::default(),
119 admin_vendor_specific_command_config: Default::default(),
120 autonomous_power_state_transition_attributes: Default::default(),
121 warning_composite_temp_threshold: Default::default(),
122 critical_composite_temp_threshold: Default::default(),
123 max_time_for_firmware_activation: Default::default(),
124 host_memory_buffer_preferred_size: Default::default(),
125 host_memory_buffer_minimum_size: Default::default(),
126 total_nvm_capacity: Default::default(),
127 unallocated_nvm_capacity: Default::default(),
128 replay_protected_memory_block_support: Default::default(),
129 extended_device_self_test_time: Default::default(),
130 device_self_test_options: Default::default(),
131 firmware_upgrade_granularity: Default::default(),
132 keep_alive_support: Default::default(),
133 host_controlled_thermal_management_attributes: Default::default(),
134 min_thermal_management_temp: Default::default(),
135 max_thermal_management_temp: Default::default(),
136 sanitize_capabilities: Default::default(),
137 host_memory_buffer_min_desc_entry_size: Default::default(),
138 host_memory_buffer_max_desc_entries: Default::default(),
139 nvm_set_ident_maximum: Default::default(),
140 endurance_group_ident_maximum: Default::default(),
141 res3: [0; 170],
142 sub_queue_entry_size: Default::default(),
143 com_queue_entry_size: Default::default(),
144 max_outstanding_cmds: Default::default(),
145 number_of_namespaces: Default::default(),
146 optional_cmd_support: Default::default(),
147 fused_operation_support: Default::default(),
148 format_nvm_attributes: Default::default(),
149 volatile_write_cache: Default::default(),
150 atomic_write_unit_normal: Default::default(),
151 atomic_write_unit_pfail: Default::default(),
152 _unsupported: Default::default(),
153 sgl_support: Default::default(),
154 _res_todo: [0; 3556],
155 }
156 }
157}
158
159#[cfg(not(target_arch = "aarch64"))]
160const _SIZE_CHECKER: [u8; 0x1000] = [0; std::mem::size_of::<IdentifyControllerDataStructure>()];
161
162#[bitfield(bits = 8)]
163#[derive(Default, Clone, Debug)]
164pub struct MultipathIONamespaceSharingCaps {
165 #[skip(setters)]
166 pub nvm_sub_multiple: B1,
167 #[skip(setters)]
168 pub nvm_sub_two_or_more: B1,
169 #[skip(setters)]
170 pub sriov_controller: B1,
171 #[skip(setters)]
172 pub asym_namespace_access_reporting: B1,
173 #[skip]
174 res: B4,
175}
176
177#[bitfield(bits = 32)]
178#[derive(Default, Clone, Debug)]
179pub struct OptionalAsyncEventsSupported {
180 #[skip]
181 res: B8,
182 #[skip(setters)]
183 pub namespace_attribute_notices: B1,
184 #[skip(setters)]
185 pub firmware_activation_notices: B1,
186 #[skip]
187 res1: B1,
188 #[skip(setters)]
189 pub asym_namespace_access_change: B1,
190 #[skip(setters)]
191 pub predictable_latency_event_aggregate_log: B1,
192 #[skip(setters)]
193 pub lba_status_info_alert: B1,
194 #[skip(setters)]
195 pub endurance_group_event_aggregate_log: B1,
196 #[skip(setters)]
197 pub normal_nvm_subsystem_shutdown: B1,
198 #[skip]
199 res2: B11,
200 #[skip(setters)]
201 pub zone_desc_changed_notices: B1,
202 #[skip]
203 res3: B3,
204 #[skip(setters)]
205 pub discovery_log_page_change: B1,
206}
207
208#[bitfield(bits = 32)]
209#[derive(Default, Clone, Debug)]
210#[repr(C)]
211pub struct SglSupport {
212 #[skip]
213 res: B11,
214 #[skip(setters)]
215 pub sgl_address_offset_supported: B1,
216 #[skip(setters)]
217 pub mptr_sgl_desc_support: B1,
218 #[skip(setters)]
219 pub lldtl: B1,
220 #[skip(setters)]
221 pub mba: B1,
222 #[skip(setters)]
223 pub sbbds: B1,
224 #[skip(setters)]
225 pub sdt: B8,
226 #[skip]
227 pub res2: B5,
228 #[skip(setters)]
229 pub keyed_datablock_support: B1,
230 #[skip(setters)]
231 pub sgl_support: SglSupportType,
232}
233
234#[derive(BitfieldSpecifier, Clone, Debug)]
235#[bits = 2]
236pub enum SglSupportType {
237 Unsupported,
238 SupportedUnaligned,
239 SupportedAligned,
240 Reserved,
241}
242
243#[bitfield(bits = 32)]
244#[derive(Default, Clone, Debug)]
245#[repr(C)]
246pub struct ControllerAttributes {
247 #[skip(setters)]
248 pub host_id: B1,
249 #[skip(setters)]
250 pub non_op_power_state_permissive_mode: B1,
251 #[skip(setters)]
252 pub nvm_sets: B1,
253 #[skip(setters)]
254 pub read_recovery_levels: B1,
255 #[skip(setters)]
256 pub endurance_groups: B1,
257 #[skip(setters)]
258 pub predictable_latency_mode: B1,
259 #[skip(setters)]
260 pub traffic_based_keep_alive: B1,
261 #[skip(setters)]
262 pub namespace_granularity: B1,
263 #[skip(setters)]
264 pub sq_associations: B1,
265 #[skip(setters)]
266 pub uuid_list: B1,
267 #[skip(setters)]
268 pub multi_domain_subsystem: B1,
269 #[skip(setters)]
270 pub fixed_domain_capacity_management: B1,
271 #[skip(setters)]
272 pub variable_capacity_management: B1,
273 #[skip(setters)]
274 pub delete_endurance_group: B1,
275 #[skip(setters)]
276 pub delete_nvm_set: B1,
277 #[skip(setters)]
278 pub extended_lba_formats_supported: B1,
279 #[skip]
280 res: B16,
281}
282
283#[derive(Default, Clone, Debug)]
284pub struct ReadRecoveryLevelsSupported(u16);
285
286#[derive(Clone, Debug)]
287#[repr(u8)]
288pub enum ControllerType {
289 NotReported,
290 IOController,
291 DiscoveryController,
292 AdministrativeController,
293}
294
295#[bitfield(bits = 8)]
296#[derive(Default, Clone, Debug)]
297pub struct NvmSubsystemReport {
298 #[skip(setters)]
299 pub nvme_storage_device: B1,
300 #[skip(setters)]
301 pub nvme_enclosure: B1,
302 #[skip]
303 res: B6,
304}
305
306#[bitfield(bits = 8)]
307#[derive(Default, Clone, Debug)]
308pub struct VPDWriteCycleInfo {
309 #[skip(setters)]
310 pub write_cycles_remaining: B7,
311 #[skip(setters)]
312 pub valid: B1,
313}
314
315#[bitfield(bits = 8)]
316#[derive(Default, Clone, Debug)]
317pub struct ManagementEndpointCapabilities {
318 #[skip]
319 pub res: B6,
320 #[skip(setters)]
321 pub pcie_management_endpoint: B1,
322 #[skip(setters)]
323 pub smbus_port_management_endpoint: B1,
324}
325
326#[bitfield(bits = 16)]
327#[derive(Default, Clone, Debug)]
328pub struct OptionalAdminCommandSupport {
329 #[skip(setters)]
330 pub security_send_and_recv: B1,
331 #[skip(setters)]
332 pub format_nvm: B1,
333 #[skip(setters)]
334 pub firmware_download_and_commit: B1,
335 #[skip(setters)]
336 pub namespace_management: B1,
337 #[skip(setters)]
338 pub device_self_test: B1,
339 #[skip(setters)]
340 pub directives: B1,
341 #[skip(setters)]
342 pub nvme_mi_send_and_recv: B1,
343 #[skip(setters)]
344 pub virtualization_management: B1,
345 #[skip(setters)]
346 pub doorbell_buffer_config: B1,
347 #[skip(setters)]
348 pub get_lba_status: B1,
349 #[skip(setters)]
350 pub command_and_feature_lockdown: B1,
351 #[skip]
352 res: B5,
353}
354
355#[bitfield(bits = 8)]
356#[derive(Default, Clone, Debug)]
357pub struct FirmwareUpdates {
358 #[skip(setters)]
359 pub first_firmware_slot_readonly: B1,
360 #[skip(setters)]
361 pub number_of_firmware_slots: B3,
362 #[skip(setters)]
363 pub firmware_activation_without_reset: B1,
364 #[skip(setters)]
365 pub support_multiple_update_detection: B1,
366 #[skip]
367 res: B2,
368}
369
370#[bitfield(bits = 8)]
371#[derive(Default, Clone, Debug)]
372pub struct LogPageAttributes {
373 #[skip(setters)]
374 pub per_namespace_smart_log: B1,
375 #[skip(setters)]
376 pub commands_supported_and_effects: B1,
377 #[skip(setters)]
378 pub get_log_page: B1,
379 #[skip(setters)]
380 pub telemetry_host_initiated: B1,
381 #[skip(setters)]
382 pub persistent_event_log: B1,
383 #[skip(setters)]
384 pub supported_effects_features_and_nvme_mi: B1,
385 #[skip(setters)]
386 pub data_area_4: B1,
387 #[skip]
388 res: B1,
389}
390
391#[bitfield(bits = 32)]
392#[derive(Default, Clone, Debug)]
393pub struct ReplayProtectedMemoryBlockSupport {
394 #[skip(setters)]
395 pub nr_rpmb_units: B3,
396 #[skip(setters)]
397 pub auth_method: AuthMethod,
398 #[skip]
399 res: B10,
400 #[skip(setters)]
401 pub total_size: B8,
402 #[skip(setters)]
403 pub access_size: B8,
404}
405
406#[derive(BitfieldSpecifier, Clone, Debug)]
407#[bits = 3]
408pub enum AuthMethod {
409 HmacSha256,
410}
411
412#[bitfield(bits = 32)]
413#[derive(Default, Clone, Debug)]
414pub struct SanitizeCapabilities {
415 #[skip(setters)]
416 pub crypto_erase: B1,
417 #[skip(setters)]
418 pub block_erase: B1,
419 #[skip(setters)]
420 pub overwrite: B1,
421 #[skip]
422 res: B26,
423 #[skip(setters)]
424 pub no_dealloc_inhibited: B1,
425 #[skip(setters)]
426 pub no_dealloc_mods_media: B2,
427}