nvme/ds/identify/
controller.rs

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}