summaryrefslogtreecommitdiffstats
path: root/doc
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-29 04:40:20 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-29 04:40:20 +0000
commit2dba2525fb35dcfc79aad5bdf6c92e790d69635c (patch)
treeac8ac7d3960922094733bac6d9a5300da7171c56 /doc
parentInitial commit. (diff)
downloadlibnvme-2dba2525fb35dcfc79aad5bdf6c92e790d69635c.tar.xz
libnvme-2dba2525fb35dcfc79aad5bdf6c92e790d69635c.zip
Adding upstream version 1.3.upstream/1.3upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'doc')
-rw-r--r--doc/api.rst.in18
-rw-r--r--doc/conf.py32
-rw-r--r--doc/conf.py.in32
-rw-r--r--doc/config-schema.json172
-rw-r--r--doc/config-schema.json.in172
-rw-r--r--doc/index.rst23
-rw-r--r--doc/index.rst.in23
-rw-r--r--doc/installation.rst.in55
-rwxr-xr-xdoc/kernel-doc2523
-rw-r--r--doc/kernel-doc-check10
-rwxr-xr-xdoc/list-man-pages.sh16
-rwxr-xr-xdoc/list-pre-compiled.sh5
-rw-r--r--doc/man/nvme_admin_opcode.2216
-rw-r--r--doc/man/nvme_admin_passthru.271
-rw-r--r--doc/man/nvme_admin_passthru64.271
-rw-r--r--doc/man/nvme_ae_info_css_nvm.225
-rw-r--r--doc/man/nvme_ae_info_error.242
-rw-r--r--doc/man/nvme_ae_info_notice.254
-rw-r--r--doc/man/nvme_ae_info_smart.224
-rw-r--r--doc/man/nvme_ae_type.236
-rw-r--r--doc/man/nvme_aggregate_endurance_group_event.219
-rw-r--r--doc/man/nvme_aggregate_predictable_lat_event.219
-rw-r--r--doc/man/nvme_ana_group_desc.235
-rw-r--r--doc/man/nvme_ana_log.227
-rw-r--r--doc/man/nvme_ana_state.236
-rw-r--r--doc/man/nvme_apst_entry.230
-rw-r--r--doc/man/nvme_boot_partition.232
-rw-r--r--doc/man/nvme_capacity_config_desc.233
-rw-r--r--doc/man/nvme_capacity_mgmt.212
-rw-r--r--doc/man/nvme_change_ns_event.263
-rw-r--r--doc/man/nvme_channel_config_desc.224
-rw-r--r--doc/man/nvme_cmb_size.211
-rw-r--r--doc/man/nvme_cmd_effects.248
-rw-r--r--doc/man/nvme_cmd_effects_log.223
-rw-r--r--doc/man/nvme_cmd_format_mset.220
-rw-r--r--doc/man/nvme_cmd_format_pi.230
-rw-r--r--doc/man/nvme_cmd_format_pil.220
-rw-r--r--doc/man/nvme_cmd_format_ses.233
-rw-r--r--doc/man/nvme_cmd_get_log_lid.2180
-rw-r--r--doc/man/nvme_cmd_get_log_telemetry_host_lsp.218
-rw-r--r--doc/man/nvme_compare.212
-rw-r--r--doc/man/nvme_connect_err.2114
-rw-r--r--doc/man/nvme_constants.2199
-rw-r--r--doc/man/nvme_copy.212
-rw-r--r--doc/man/nvme_copy_range.240
-rw-r--r--doc/man/nvme_copy_range_f1.240
-rw-r--r--doc/man/nvme_create_ctrl.231
-rw-r--r--doc/man/nvme_create_root.214
-rw-r--r--doc/man/nvme_csi.224
-rw-r--r--doc/man/nvme_ctrl_first_ns.211
-rw-r--r--doc/man/nvme_ctrl_first_path.211
-rw-r--r--doc/man/nvme_ctrl_for_each_ns.212
-rw-r--r--doc/man/nvme_ctrl_for_each_ns_safe.215
-rw-r--r--doc/man/nvme_ctrl_for_each_path.212
-rw-r--r--doc/man/nvme_ctrl_for_each_path_safe.215
-rw-r--r--doc/man/nvme_ctrl_get_address.212
-rw-r--r--doc/man/nvme_ctrl_get_config.211
-rw-r--r--doc/man/nvme_ctrl_get_dhchap_host_key.211
-rw-r--r--doc/man/nvme_ctrl_get_dhchap_key.211
-rw-r--r--doc/man/nvme_ctrl_get_fd.211
-rw-r--r--doc/man/nvme_ctrl_get_firmware.211
-rw-r--r--doc/man/nvme_ctrl_get_host_iface.211
-rw-r--r--doc/man/nvme_ctrl_get_host_traddr.211
-rw-r--r--doc/man/nvme_ctrl_get_model.211
-rw-r--r--doc/man/nvme_ctrl_get_name.211
-rw-r--r--doc/man/nvme_ctrl_get_numa_node.211
-rw-r--r--doc/man/nvme_ctrl_get_queue_count.211
-rw-r--r--doc/man/nvme_ctrl_get_serial.211
-rw-r--r--doc/man/nvme_ctrl_get_sqsize.211
-rw-r--r--doc/man/nvme_ctrl_get_state.211
-rw-r--r--doc/man/nvme_ctrl_get_subsysnqn.211
-rw-r--r--doc/man/nvme_ctrl_get_subsystem.211
-rw-r--r--doc/man/nvme_ctrl_get_sysfs_dir.211
-rw-r--r--doc/man/nvme_ctrl_get_traddr.211
-rw-r--r--doc/man/nvme_ctrl_get_transport.211
-rw-r--r--doc/man/nvme_ctrl_get_trsvcid.211
-rw-r--r--doc/man/nvme_ctrl_identify.217
-rw-r--r--doc/man/nvme_ctrl_is_discovered.211
-rw-r--r--doc/man/nvme_ctrl_is_discovery_ctrl.214
-rw-r--r--doc/man/nvme_ctrl_is_persistent.211
-rw-r--r--doc/man/nvme_ctrl_is_unique_discovery_ctrl.211
-rw-r--r--doc/man/nvme_ctrl_list.219
-rw-r--r--doc/man/nvme_ctrl_metadata_type.2108
-rw-r--r--doc/man/nvme_ctrl_next_ns.214
-rw-r--r--doc/man/nvme_ctrl_next_path.214
-rw-r--r--doc/man/nvme_ctrl_reset.213
-rw-r--r--doc/man/nvme_ctrl_set_dhchap_host_key.212
-rw-r--r--doc/man/nvme_ctrl_set_dhchap_key.212
-rw-r--r--doc/man/nvme_ctrl_set_discovered.214
-rw-r--r--doc/man/nvme_ctrl_set_discovery_ctrl.215
-rw-r--r--doc/man/nvme_ctrl_set_persistent.214
-rw-r--r--doc/man/nvme_ctrl_set_unique_discovery_ctrl.215
-rw-r--r--doc/man/nvme_ctrls_filter.211
-rw-r--r--doc/man/nvme_data_tfr.230
-rw-r--r--doc/man/nvme_default_host.214
-rw-r--r--doc/man/nvme_dev_self_test.223
-rw-r--r--doc/man/nvme_directive_dtype.218
-rw-r--r--doc/man/nvme_directive_receive_doper.226
-rw-r--r--doc/man/nvme_directive_recv.212
-rw-r--r--doc/man/nvme_directive_recv_identify_parameters.218
-rw-r--r--doc/man/nvme_directive_recv_stream_allocate.221
-rw-r--r--doc/man/nvme_directive_recv_stream_parameters.218
-rw-r--r--doc/man/nvme_directive_recv_stream_status.221
-rw-r--r--doc/man/nvme_directive_send.218
-rw-r--r--doc/man/nvme_directive_send_doper.221
-rw-r--r--doc/man/nvme_directive_send_id_endir.224
-rw-r--r--doc/man/nvme_directive_send_identify_endir.216
-rw-r--r--doc/man/nvme_directive_send_stream_release_identifier.218
-rw-r--r--doc/man/nvme_directive_send_stream_release_resource.215
-rw-r--r--doc/man/nvme_directive_types.218
-rw-r--r--doc/man/nvme_disconnect_ctrl.213
-rw-r--r--doc/man/nvme_dsm.218
-rw-r--r--doc/man/nvme_dsm_attributes.224
-rw-r--r--doc/man/nvme_dsm_range.223
-rw-r--r--doc/man/nvme_dst_stc.230
-rw-r--r--doc/man/nvme_dump_config.214
-rw-r--r--doc/man/nvme_dump_tree.214
-rw-r--r--doc/man/nvme_eg_critical_warning_flags.226
-rw-r--r--doc/man/nvme_eg_event_aggregate_log.219
-rw-r--r--doc/man/nvme_end_grp_chan_desc.220
-rw-r--r--doc/man/nvme_end_grp_config_desc.247
-rw-r--r--doc/man/nvme_endurance_group_log.271
-rw-r--r--doc/man/nvme_errno_to_string.211
-rw-r--r--doc/man/nvme_error_log_page.2109
-rw-r--r--doc/man/nvme_fabrics_config.275
-rw-r--r--doc/man/nvme_fctype.242
-rw-r--r--doc/man/nvme_fdp_config_desc.255
-rw-r--r--doc/man/nvme_fdp_config_fdpa.242
-rw-r--r--doc/man/nvme_fdp_config_log.235
-rw-r--r--doc/man/nvme_fdp_event.251
-rw-r--r--doc/man/nvme_fdp_event_flags.224
-rw-r--r--doc/man/nvme_fdp_event_realloc.231
-rw-r--r--doc/man/nvme_fdp_event_realloc_flags.212
-rw-r--r--doc/man/nvme_fdp_event_type.242
-rw-r--r--doc/man/nvme_fdp_events_log.223
-rw-r--r--doc/man/nvme_fdp_reclaim_unit_handle_status.221
-rw-r--r--doc/man/nvme_fdp_reclaim_unit_handle_update.221
-rw-r--r--doc/man/nvme_fdp_ruh_desc.219
-rw-r--r--doc/man/nvme_fdp_ruh_status.223
-rw-r--r--doc/man/nvme_fdp_ruh_status_desc.231
-rw-r--r--doc/man/nvme_fdp_ruh_type.218
-rw-r--r--doc/man/nvme_fdp_ruha.230
-rw-r--r--doc/man/nvme_fdp_ruhu_desc.219
-rw-r--r--doc/man/nvme_fdp_ruhu_log.223
-rw-r--r--doc/man/nvme_fdp_stats_log.227
-rw-r--r--doc/man/nvme_fdp_supported_event_attributes.218
-rw-r--r--doc/man/nvme_fdp_supported_event_desc.219
-rw-r--r--doc/man/nvme_feat.2526
-rw-r--r--doc/man/nvme_feat_auto_pst.215
-rw-r--r--doc/man/nvme_feat_fdp_events_cdw11.223
-rw-r--r--doc/man/nvme_feat_host_behavior.219
-rw-r--r--doc/man/nvme_feat_nswpcfg_state.230
-rw-r--r--doc/man/nvme_feat_plm_window_select.218
-rw-r--r--doc/man/nvme_feat_resv_notify_flags.224
-rw-r--r--doc/man/nvme_feat_tmpthresh_thsel.218
-rw-r--r--doc/man/nvme_features_async_event_config_flags.276
-rw-r--r--doc/man/nvme_features_id.2222
-rw-r--r--doc/man/nvme_fid_supported_effects.290
-rw-r--r--doc/man/nvme_fid_supported_effects_log.215
-rw-r--r--doc/man/nvme_firmware_slot.227
-rw-r--r--doc/man/nvme_first_host.211
-rw-r--r--doc/man/nvme_first_subsystem.211
-rw-r--r--doc/man/nvme_flush.218
-rw-r--r--doc/man/nvme_for_each_host.212
-rw-r--r--doc/man/nvme_for_each_host_safe.215
-rw-r--r--doc/man/nvme_for_each_subsystem.212
-rw-r--r--doc/man/nvme_for_each_subsystem_safe.215
-rw-r--r--doc/man/nvme_format_nvm.217
-rw-r--r--doc/man/nvme_format_nvm_compln_event.231
-rw-r--r--doc/man/nvme_format_nvm_start_event.227
-rw-r--r--doc/man/nvme_free_ctrl.29
-rw-r--r--doc/man/nvme_free_host.29
-rw-r--r--doc/man/nvme_free_ns.29
-rw-r--r--doc/man/nvme_free_subsystem.211
-rw-r--r--doc/man/nvme_free_tree.211
-rw-r--r--doc/man/nvme_fw_commit.216
-rw-r--r--doc/man/nvme_fw_commit_ca.259
-rw-r--r--doc/man/nvme_fw_commit_event.239
-rw-r--r--doc/man/nvme_fw_download.225
-rw-r--r--doc/man/nvme_fw_download_seq.224
-rw-r--r--doc/man/nvme_gen_dhchap_key.224
-rw-r--r--doc/man/nvme_get_ana_log_len.215
-rw-r--r--doc/man/nvme_get_attr.215
-rw-r--r--doc/man/nvme_get_ctrl_attr.215
-rw-r--r--doc/man/nvme_get_ctrl_telemetry.227
-rw-r--r--doc/man/nvme_get_directive_receive_length.218
-rw-r--r--doc/man/nvme_get_discovery_args.235
-rw-r--r--doc/man/nvme_get_feature_length.219
-rw-r--r--doc/man/nvme_get_feature_length2.224
-rw-r--r--doc/man/nvme_get_features.212
-rw-r--r--doc/man/nvme_get_features_arbitration.218
-rw-r--r--doc/man/nvme_get_features_async_event.218
-rw-r--r--doc/man/nvme_get_features_auto_pst.220
-rw-r--r--doc/man/nvme_get_features_data.227
-rw-r--r--doc/man/nvme_get_features_endurance_event_cfg.221
-rw-r--r--doc/man/nvme_get_features_err_recovery.218
-rw-r--r--doc/man/nvme_get_features_hctm.218
-rw-r--r--doc/man/nvme_get_features_host_behavior.221
-rw-r--r--doc/man/nvme_get_features_host_id.224
-rw-r--r--doc/man/nvme_get_features_host_mem_buf.218
-rw-r--r--doc/man/nvme_get_features_iocs_profile.218
-rw-r--r--doc/man/nvme_get_features_irq_coalesce.218
-rw-r--r--doc/man/nvme_get_features_irq_config.220
-rw-r--r--doc/man/nvme_get_features_kato.218
-rw-r--r--doc/man/nvme_get_features_lba_range.221
-rw-r--r--doc/man/nvme_get_features_lba_sts_interval.218
-rw-r--r--doc/man/nvme_get_features_nopsc.218
-rw-r--r--doc/man/nvme_get_features_num_queues.218
-rw-r--r--doc/man/nvme_get_features_plm_config.223
-rw-r--r--doc/man/nvme_get_features_plm_window.221
-rw-r--r--doc/man/nvme_get_features_power_mgmt.218
-rw-r--r--doc/man/nvme_get_features_resv_mask.218
-rw-r--r--doc/man/nvme_get_features_resv_persist.218
-rw-r--r--doc/man/nvme_get_features_rrl.218
-rw-r--r--doc/man/nvme_get_features_sanitize.218
-rw-r--r--doc/man/nvme_get_features_sel.230
-rw-r--r--doc/man/nvme_get_features_simple.221
-rw-r--r--doc/man/nvme_get_features_sw_progress.218
-rw-r--r--doc/man/nvme_get_features_temp_thresh.218
-rw-r--r--doc/man/nvme_get_features_timestamp.218
-rw-r--r--doc/man/nvme_get_features_volatile_wc.218
-rw-r--r--doc/man/nvme_get_features_write_atomic.218
-rw-r--r--doc/man/nvme_get_features_write_protect.221
-rw-r--r--doc/man/nvme_get_host_telemetry.224
-rw-r--r--doc/man/nvme_get_lba_status.215
-rw-r--r--doc/man/nvme_get_lba_status_log.218
-rw-r--r--doc/man/nvme_get_log.212
-rw-r--r--doc/man/nvme_get_log_ana.233
-rw-r--r--doc/man/nvme_get_log_ana_groups.223
-rw-r--r--doc/man/nvme_get_log_boot_partition.225
-rw-r--r--doc/man/nvme_get_log_changed_ns_list.222
-rw-r--r--doc/man/nvme_get_log_cmd_effects.221
-rw-r--r--doc/man/nvme_get_log_create_telemetry_host.215
-rw-r--r--doc/man/nvme_get_log_device_self_test.219
-rw-r--r--doc/man/nvme_get_log_discovery.227
-rw-r--r--doc/man/nvme_get_log_endurance_group.225
-rw-r--r--doc/man/nvme_get_log_endurance_grp_evt.224
-rw-r--r--doc/man/nvme_get_log_error.225
-rw-r--r--doc/man/nvme_get_log_fdp_configurations.221
-rw-r--r--doc/man/nvme_get_log_fdp_events.224
-rw-r--r--doc/man/nvme_get_log_fdp_stats.221
-rw-r--r--doc/man/nvme_get_log_fid_supported_effects.218
-rw-r--r--doc/man/nvme_get_log_fw_slot.222
-rw-r--r--doc/man/nvme_get_log_lba_status.224
-rw-r--r--doc/man/nvme_get_log_media_unit_stat.218
-rw-r--r--doc/man/nvme_get_log_mi_cmd_supported_effects.218
-rw-r--r--doc/man/nvme_get_log_page.218
-rw-r--r--doc/man/nvme_get_log_persistent_event.221
-rw-r--r--doc/man/nvme_get_log_predictable_lat_event.224
-rw-r--r--doc/man/nvme_get_log_predictable_lat_nvmset.218
-rw-r--r--doc/man/nvme_get_log_reclaim_unit_handle_usage.221
-rw-r--r--doc/man/nvme_get_log_reservation.218
-rw-r--r--doc/man/nvme_get_log_sanitize.221
-rw-r--r--doc/man/nvme_get_log_smart.228
-rw-r--r--doc/man/nvme_get_log_support_cap_config_list.218
-rw-r--r--doc/man/nvme_get_log_supported_log_pages.218
-rw-r--r--doc/man/nvme_get_log_telemetry_ctrl.227
-rw-r--r--doc/man/nvme_get_log_telemetry_host.224
-rw-r--r--doc/man/nvme_get_log_zns_changed_zones.223
-rw-r--r--doc/man/nvme_get_logical_block_size.218
-rw-r--r--doc/man/nvme_get_new_host_telemetry.224
-rw-r--r--doc/man/nvme_get_ns_attr.215
-rw-r--r--doc/man/nvme_get_nsid.219
-rw-r--r--doc/man/nvme_get_path_attr.215
-rw-r--r--doc/man/nvme_get_property.215
-rw-r--r--doc/man/nvme_get_subsys_attr.215
-rw-r--r--doc/man/nvme_hmac_alg.230
-rw-r--r--doc/man/nvme_host_behavior_support.212
-rw-r--r--doc/man/nvme_host_get_dhchap_key.211
-rw-r--r--doc/man/nvme_host_get_hostid.211
-rw-r--r--doc/man/nvme_host_get_hostnqn.211
-rw-r--r--doc/man/nvme_host_get_hostsymname.212
-rw-r--r--doc/man/nvme_host_get_root.211
-rw-r--r--doc/man/nvme_host_is_pdc_enabled.216
-rw-r--r--doc/man/nvme_host_mem_buf_attrs.231
-rw-r--r--doc/man/nvme_host_metadata.233
-rw-r--r--doc/man/nvme_host_set_dhchap_key.212
-rw-r--r--doc/man/nvme_host_set_hostsymname.212
-rw-r--r--doc/man/nvme_host_set_pdc_enabled.216
-rw-r--r--doc/man/nvme_id_ctrl.2505
-rw-r--r--doc/man/nvme_id_ctrl_anacap.259
-rw-r--r--doc/man/nvme_id_ctrl_apsta.213
-rw-r--r--doc/man/nvme_id_ctrl_avscc.214
-rw-r--r--doc/man/nvme_id_ctrl_cmic.243
-rw-r--r--doc/man/nvme_id_ctrl_cntrltype.224
-rw-r--r--doc/man/nvme_id_ctrl_cqes.220
-rw-r--r--doc/man/nvme_id_ctrl_ctratt.2110
-rw-r--r--doc/man/nvme_id_ctrl_dctype.224
-rw-r--r--doc/man/nvme_id_ctrl_dsto.213
-rw-r--r--doc/man/nvme_id_ctrl_fcatt.214
-rw-r--r--doc/man/nvme_id_ctrl_fna.248
-rw-r--r--doc/man/nvme_id_ctrl_frmw.234
-rw-r--r--doc/man/nvme_id_ctrl_fuses.213
-rw-r--r--doc/man/nvme_id_ctrl_hctm.215
-rw-r--r--doc/man/nvme_id_ctrl_lpa.265
-rw-r--r--doc/man/nvme_id_ctrl_mec.220
-rw-r--r--doc/man/nvme_id_ctrl_nvm.239
-rw-r--r--doc/man/nvme_id_ctrl_nvmsr.222
-rw-r--r--doc/man/nvme_id_ctrl_nvscc.213
-rw-r--r--doc/man/nvme_id_ctrl_nwpc.235
-rw-r--r--doc/man/nvme_id_ctrl_oacs.284
-rw-r--r--doc/man/nvme_id_ctrl_oaes.262
-rw-r--r--doc/man/nvme_id_ctrl_ofcs.214
-rw-r--r--doc/man/nvme_id_ctrl_oncs.272
-rw-r--r--doc/man/nvme_id_ctrl_rpmbs.230
-rw-r--r--doc/man/nvme_id_ctrl_sanicap.244
-rw-r--r--doc/man/nvme_id_ctrl_sgls.246
-rw-r--r--doc/man/nvme_id_ctrl_sqes.220
-rw-r--r--doc/man/nvme_id_ctrl_vwc.222
-rw-r--r--doc/man/nvme_id_ctrl_vwci.228
-rw-r--r--doc/man/nvme_id_directives.223
-rw-r--r--doc/man/nvme_id_domain_attr.235
-rw-r--r--doc/man/nvme_id_domain_list.223
-rw-r--r--doc/man/nvme_id_endurance_group_list.219
-rw-r--r--doc/man/nvme_id_independent_id_ns.256
-rw-r--r--doc/man/nvme_id_iocs.215
-rw-r--r--doc/man/nvme_id_ns.2237
-rw-r--r--doc/man/nvme_id_ns_attr.214
-rw-r--r--doc/man/nvme_id_ns_dlfeat.250
-rw-r--r--doc/man/nvme_id_ns_dpc.243
-rw-r--r--doc/man/nvme_id_ns_dps.244
-rw-r--r--doc/man/nvme_id_ns_flbas.235
-rw-r--r--doc/man/nvme_id_ns_granularity_desc.219
-rw-r--r--doc/man/nvme_id_ns_granularity_list.231
-rw-r--r--doc/man/nvme_id_ns_mc.221
-rw-r--r--doc/man/nvme_id_ns_nmic.213
-rw-r--r--doc/man/nvme_id_ns_rescap.262
-rw-r--r--doc/man/nvme_id_nsfeat.250
-rw-r--r--doc/man/nvme_id_nvmset_list.223
-rw-r--r--doc/man/nvme_id_psd.295
-rw-r--r--doc/man/nvme_id_uuid.226
-rw-r--r--doc/man/nvme_id_uuid_list.219
-rw-r--r--doc/man/nvme_id_uuid_list_entry.223
-rw-r--r--doc/man/nvme_identify.215
-rw-r--r--doc/man/nvme_identify_active_ns_list.224
-rw-r--r--doc/man/nvme_identify_active_ns_list_csi.228
-rw-r--r--doc/man/nvme_identify_allocated_ns.218
-rw-r--r--doc/man/nvme_identify_allocated_ns_list.224
-rw-r--r--doc/man/nvme_identify_allocated_ns_list_csi.228
-rw-r--r--doc/man/nvme_identify_cns.2163
-rw-r--r--doc/man/nvme_identify_ctrl.219
-rw-r--r--doc/man/nvme_identify_ctrl_csi.222
-rw-r--r--doc/man/nvme_identify_ctrl_list.224
-rw-r--r--doc/man/nvme_identify_domain_list.225
-rw-r--r--doc/man/nvme_identify_endurance_group_list.218
-rw-r--r--doc/man/nvme_identify_independent_identify_ns.222
-rw-r--r--doc/man/nvme_identify_iocs.221
-rw-r--r--doc/man/nvme_identify_iocs_ns_csi_user_data_format.228
-rw-r--r--doc/man/nvme_identify_ns.229
-rw-r--r--doc/man/nvme_identify_ns_csi.227
-rw-r--r--doc/man/nvme_identify_ns_csi_user_data_format.227
-rw-r--r--doc/man/nvme_identify_ns_descs.226
-rw-r--r--doc/man/nvme_identify_ns_granularity.222
-rw-r--r--doc/man/nvme_identify_nsid_ctrl_list.227
-rw-r--r--doc/man/nvme_identify_nvmset_list.225
-rw-r--r--doc/man/nvme_identify_primary_ctrl.220
-rw-r--r--doc/man/nvme_identify_secondary_ctrl_list.229
-rw-r--r--doc/man/nvme_identify_uuid.220
-rw-r--r--doc/man/nvme_init_copy_range.227
-rw-r--r--doc/man/nvme_init_copy_range_f1.227
-rw-r--r--doc/man/nvme_init_ctrl.217
-rw-r--r--doc/man/nvme_init_ctrl_list.218
-rw-r--r--doc/man/nvme_init_dsm_range.227
-rw-r--r--doc/man/nvme_init_logging.220
-rw-r--r--doc/man/nvme_io.215
-rw-r--r--doc/man/nvme_io_control_flags.266
-rw-r--r--doc/man/nvme_io_dsm_flags.296
-rw-r--r--doc/man/nvme_io_mgmt_recv.212
-rw-r--r--doc/man/nvme_io_mgmt_recv_mo.212
-rw-r--r--doc/man/nvme_io_mgmt_send.212
-rw-r--r--doc/man/nvme_io_mgmt_send_mo.212
-rw-r--r--doc/man/nvme_io_opcode.2114
-rw-r--r--doc/man/nvme_io_passthru.271
-rw-r--r--doc/man/nvme_io_passthru64.271
-rw-r--r--doc/man/nvme_is_64bit_reg.216
-rw-r--r--doc/man/nvme_lba_range_type.215
-rw-r--r--doc/man/nvme_lba_range_type_entry.239
-rw-r--r--doc/man/nvme_lba_rd.223
-rw-r--r--doc/man/nvme_lba_status.227
-rw-r--r--doc/man/nvme_lba_status_atype.219
-rw-r--r--doc/man/nvme_lba_status_desc.231
-rw-r--r--doc/man/nvme_lba_status_log.235
-rw-r--r--doc/man/nvme_lbaf.225
-rw-r--r--doc/man/nvme_lbaf_rp.237
-rw-r--r--doc/man/nvme_lbart.248
-rw-r--r--doc/man/nvme_lbas_ns_element.231
-rw-r--r--doc/man/nvme_lockdown.212
-rw-r--r--doc/man/nvme_log_ana_lsp.216
-rw-r--r--doc/man/nvme_lookup_ctrl.235
-rw-r--r--doc/man/nvme_lookup_host.220
-rw-r--r--doc/man/nvme_lookup_subsystem.220
-rw-r--r--doc/man/nvme_media_unit_config_desc.223
-rw-r--r--doc/man/nvme_media_unit_stat_desc.247
-rw-r--r--doc/man/nvme_media_unit_stat_log.231
-rw-r--r--doc/man/nvme_metadata_element_desc.227
-rw-r--r--doc/man/nvme_mi_admin_admin_passthru.274
-rw-r--r--doc/man/nvme_mi_admin_format_nvm.218
-rw-r--r--doc/man/nvme_mi_admin_fw_commit.216
-rw-r--r--doc/man/nvme_mi_admin_fw_download.227
-rw-r--r--doc/man/nvme_mi_admin_get_features_data.230
-rw-r--r--doc/man/nvme_mi_admin_get_log.225
-rw-r--r--doc/man/nvme_mi_admin_get_log_ana.233
-rw-r--r--doc/man/nvme_mi_admin_get_log_ana_groups.223
-rw-r--r--doc/man/nvme_mi_admin_get_log_boot_partition.225
-rw-r--r--doc/man/nvme_mi_admin_get_log_changed_ns_list.222
-rw-r--r--doc/man/nvme_mi_admin_get_log_cmd_effects.221
-rw-r--r--doc/man/nvme_mi_admin_get_log_create_telemetry_host.215
-rw-r--r--doc/man/nvme_mi_admin_get_log_device_self_test.219
-rw-r--r--doc/man/nvme_mi_admin_get_log_discovery.227
-rw-r--r--doc/man/nvme_mi_admin_get_log_endurance_group.225
-rw-r--r--doc/man/nvme_mi_admin_get_log_endurance_grp_evt.224
-rw-r--r--doc/man/nvme_mi_admin_get_log_error.225
-rw-r--r--doc/man/nvme_mi_admin_get_log_fid_supported_effects.218
-rw-r--r--doc/man/nvme_mi_admin_get_log_fw_slot.222
-rw-r--r--doc/man/nvme_mi_admin_get_log_lba_status.224
-rw-r--r--doc/man/nvme_mi_admin_get_log_media_unit_stat.218
-rw-r--r--doc/man/nvme_mi_admin_get_log_mi_cmd_supported_effects.218
-rw-r--r--doc/man/nvme_mi_admin_get_log_persistent_event.221
-rw-r--r--doc/man/nvme_mi_admin_get_log_predictable_lat_event.224
-rw-r--r--doc/man/nvme_mi_admin_get_log_predictable_lat_nvmset.218
-rw-r--r--doc/man/nvme_mi_admin_get_log_reservation.218
-rw-r--r--doc/man/nvme_mi_admin_get_log_sanitize.221
-rw-r--r--doc/man/nvme_mi_admin_get_log_simple.224
-rw-r--r--doc/man/nvme_mi_admin_get_log_smart.228
-rw-r--r--doc/man/nvme_mi_admin_get_log_support_cap_config_list.218
-rw-r--r--doc/man/nvme_mi_admin_get_log_supported_log_pages.218
-rw-r--r--doc/man/nvme_mi_admin_get_log_telemetry_ctrl.227
-rw-r--r--doc/man/nvme_mi_admin_get_log_telemetry_host.224
-rw-r--r--doc/man/nvme_mi_admin_get_log_zns_changed_zones.223
-rw-r--r--doc/man/nvme_mi_admin_get_nsid_log.232
-rw-r--r--doc/man/nvme_mi_admin_identify.224
-rw-r--r--doc/man/nvme_mi_admin_identify_active_ns_list.228
-rw-r--r--doc/man/nvme_mi_admin_identify_allocated_ns.221
-rw-r--r--doc/man/nvme_mi_admin_identify_allocated_ns_list.228
-rw-r--r--doc/man/nvme_mi_admin_identify_cns_nsid.230
-rw-r--r--doc/man/nvme_mi_admin_identify_ctrl.224
-rw-r--r--doc/man/nvme_mi_admin_identify_ctrl_list.227
-rw-r--r--doc/man/nvme_mi_admin_identify_ns.221
-rw-r--r--doc/man/nvme_mi_admin_identify_ns_descs.221
-rw-r--r--doc/man/nvme_mi_admin_identify_nsid_ctrl_list.230
-rw-r--r--doc/man/nvme_mi_admin_identify_partial.237
-rw-r--r--doc/man/nvme_mi_admin_identify_primary_ctrl.226
-rw-r--r--doc/man/nvme_mi_admin_identify_secondary_ctrl_list.230
-rw-r--r--doc/man/nvme_mi_admin_ns_attach.215
-rw-r--r--doc/man/nvme_mi_admin_ns_attach_ctrls.218
-rw-r--r--doc/man/nvme_mi_admin_ns_detach_ctrls.218
-rw-r--r--doc/man/nvme_mi_admin_req_hdr.272
-rw-r--r--doc/man/nvme_mi_admin_resp_hdr.234
-rw-r--r--doc/man/nvme_mi_admin_sanitize_nvm.225
-rw-r--r--doc/man/nvme_mi_admin_security_recv.225
-rw-r--r--doc/man/nvme_mi_admin_security_send.225
-rw-r--r--doc/man/nvme_mi_admin_xfer.242
-rw-r--r--doc/man/nvme_mi_ccs.278
-rw-r--r--doc/man/nvme_mi_close.29
-rw-r--r--doc/man/nvme_mi_close_ctrl.29
-rw-r--r--doc/man/nvme_mi_cmd_supported_effects.284
-rw-r--r--doc/man/nvme_mi_cmd_supported_effects_log.219
-rw-r--r--doc/man/nvme_mi_config_id.231
-rw-r--r--doc/man/nvme_mi_config_smbus_freq.227
-rw-r--r--doc/man/nvme_mi_create_root.220
-rw-r--r--doc/man/nvme_mi_csts.248
-rw-r--r--doc/man/nvme_mi_ctrl_health_status.239
-rw-r--r--doc/man/nvme_mi_cwarn.236
-rw-r--r--doc/man/nvme_mi_dtyp.245
-rw-r--r--doc/man/nvme_mi_elem.248
-rw-r--r--doc/man/nvme_mi_free_root.29
-rw-r--r--doc/man/nvme_mi_init_ctrl.220
-rw-r--r--doc/man/nvme_mi_message_type.233
-rw-r--r--doc/man/nvme_mi_mi_opcode.230
-rw-r--r--doc/man/nvme_mi_mi_read_mi_data_ctrl.223
-rw-r--r--doc/man/nvme_mi_mi_read_mi_data_ctrl_list.223
-rw-r--r--doc/man/nvme_mi_mi_read_mi_data_port.224
-rw-r--r--doc/man/nvme_mi_mi_read_mi_data_subsys.218
-rw-r--r--doc/man/nvme_mi_mi_req_hdr.231
-rw-r--r--doc/man/nvme_mi_mi_resp_hdr.225
-rw-r--r--doc/man/nvme_mi_mi_subsystem_health_status_poll.224
-rw-r--r--doc/man/nvme_mi_msg_hdr.230
-rw-r--r--doc/man/nvme_mi_msg_resp.226
-rw-r--r--doc/man/nvme_mi_nvm_ss_health_status.235
-rw-r--r--doc/man/nvme_mi_open_mctp.222
-rw-r--r--doc/man/nvme_mi_osc.219
-rw-r--r--doc/man/nvme_mi_port_pcie.239
-rw-r--r--doc/man/nvme_mi_port_smb.235
-rw-r--r--doc/man/nvme_mi_read_ctrl_info.247
-rw-r--r--doc/man/nvme_mi_read_nvm_ss_info.227
-rw-r--r--doc/man/nvme_mi_read_port_info.241
-rw-r--r--doc/man/nvme_mi_read_sc_list.220
-rw-r--r--doc/man/nvme_mi_resp_status.2120
-rw-r--r--doc/man/nvme_mi_set_probe_enabled.216
-rw-r--r--doc/man/nvme_mi_status_to_string.217
-rw-r--r--doc/man/nvme_mi_vpd_hdr.247
-rw-r--r--doc/man/nvme_mi_vpd_mr_common.249
-rw-r--r--doc/man/nvme_mi_vpd_mra.275
-rw-r--r--doc/man/nvme_mi_vpd_ppmra.247
-rw-r--r--doc/man/nvme_mi_vpd_telem.228
-rw-r--r--doc/man/nvme_mi_vpd_tra.227
-rw-r--r--doc/man/nvme_namespace_attach_ctrls.221
-rw-r--r--doc/man/nvme_namespace_detach_ctrls.221
-rw-r--r--doc/man/nvme_namespace_filter.211
-rw-r--r--doc/man/nvme_namespace_first_path.211
-rw-r--r--doc/man/nvme_namespace_for_each_path.212
-rw-r--r--doc/man/nvme_namespace_for_each_path_safe.215
-rw-r--r--doc/man/nvme_namespace_next_path.214
-rw-r--r--doc/man/nvme_nd_ns_fpi.219
-rw-r--r--doc/man/nvme_next_host.214
-rw-r--r--doc/man/nvme_next_subsystem.214
-rw-r--r--doc/man/nvme_ns_attach.212
-rw-r--r--doc/man/nvme_ns_attach_ctrls.218
-rw-r--r--doc/man/nvme_ns_attach_sel.218
-rw-r--r--doc/man/nvme_ns_compare.220
-rw-r--r--doc/man/nvme_ns_detach_ctrls.218
-rw-r--r--doc/man/nvme_ns_flush.211
-rw-r--r--doc/man/nvme_ns_get_csi.211
-rw-r--r--doc/man/nvme_ns_get_ctrl.213
-rw-r--r--doc/man/nvme_ns_get_eui64.211
-rw-r--r--doc/man/nvme_ns_get_fd.211
-rw-r--r--doc/man/nvme_ns_get_firmware.211
-rw-r--r--doc/man/nvme_ns_get_generic_name.211
-rw-r--r--doc/man/nvme_ns_get_lba_count.211
-rw-r--r--doc/man/nvme_ns_get_lba_size.211
-rw-r--r--doc/man/nvme_ns_get_lba_util.211
-rw-r--r--doc/man/nvme_ns_get_meta_size.211
-rw-r--r--doc/man/nvme_ns_get_model.211
-rw-r--r--doc/man/nvme_ns_get_name.211
-rw-r--r--doc/man/nvme_ns_get_nguid.211
-rw-r--r--doc/man/nvme_ns_get_nsid.211
-rw-r--r--doc/man/nvme_ns_get_serial.211
-rw-r--r--doc/man/nvme_ns_get_subsystem.211
-rw-r--r--doc/man/nvme_ns_get_sysfs_dir.211
-rw-r--r--doc/man/nvme_ns_get_uuid.214
-rw-r--r--doc/man/nvme_ns_id_desc.230
-rw-r--r--doc/man/nvme_ns_id_desc_nidt.233
-rw-r--r--doc/man/nvme_ns_identify.217
-rw-r--r--doc/man/nvme_ns_identify_descs.217
-rw-r--r--doc/man/nvme_ns_list.215
-rw-r--r--doc/man/nvme_ns_metadata_type.234
-rw-r--r--doc/man/nvme_ns_mgmt.212
-rw-r--r--doc/man/nvme_ns_mgmt_create.229
-rw-r--r--doc/man/nvme_ns_mgmt_delete.219
-rw-r--r--doc/man/nvme_ns_mgmt_sel.218
-rw-r--r--doc/man/nvme_ns_read.220
-rw-r--r--doc/man/nvme_ns_rescan.213
-rw-r--r--doc/man/nvme_ns_verify.217
-rw-r--r--doc/man/nvme_ns_write.220
-rw-r--r--doc/man/nvme_ns_write_protect_cfg.230
-rw-r--r--doc/man/nvme_ns_write_uncorrectable.217
-rw-r--r--doc/man/nvme_ns_write_zeros.217
-rw-r--r--doc/man/nvme_nss_hw_err_event.223
-rw-r--r--doc/man/nvme_nvm_id_ns.231
-rw-r--r--doc/man/nvme_nvm_id_ns_elbaf.220
-rw-r--r--doc/man/nvme_nvm_identify_ctrl.218
-rw-r--r--doc/man/nvme_nvmeset_pl_status.224
-rw-r--r--doc/man/nvme_nvmset_attr.246
-rw-r--r--doc/man/nvme_nvmset_pl_events.240
-rw-r--r--doc/man/nvme_nvmset_predictable_lat_log.267
-rw-r--r--doc/man/nvme_open.215
-rw-r--r--doc/man/nvme_passthru_cmd.283
-rw-r--r--doc/man/nvme_passthru_cmd64.287
-rw-r--r--doc/man/nvme_path_get_ana_state.211
-rw-r--r--doc/man/nvme_path_get_ctrl.211
-rw-r--r--doc/man/nvme_path_get_name.211
-rw-r--r--doc/man/nvme_path_get_ns.211
-rw-r--r--doc/man/nvme_path_get_sysfs_dir.211
-rw-r--r--doc/man/nvme_paths_filter.211
-rw-r--r--doc/man/nvme_persistent_event_entry.251
-rw-r--r--doc/man/nvme_persistent_event_log.287
-rw-r--r--doc/man/nvme_persistent_event_types.284
-rw-r--r--doc/man/nvme_pevent_log_action.224
-rw-r--r--doc/man/nvme_plm_config.235
-rw-r--r--doc/man/nvme_pmr_size.211
-rw-r--r--doc/man/nvme_pmr_throughput.211
-rw-r--r--doc/man/nvme_power_on_reset_info_list.239
-rw-r--r--doc/man/nvme_primary_ctrl_cap.283
-rw-r--r--doc/man/nvme_psd_flags.226
-rw-r--r--doc/man/nvme_psd_power_scale.211
-rw-r--r--doc/man/nvme_psd_ps.224
-rw-r--r--doc/man/nvme_psd_workload.235
-rw-r--r--doc/man/nvme_read.212
-rw-r--r--doc/man/nvme_read_config.217
-rw-r--r--doc/man/nvme_refresh_topology.211
-rw-r--r--doc/man/nvme_register_offsets.2156
-rw-r--r--doc/man/nvme_registered_ctrl.231
-rw-r--r--doc/man/nvme_registered_ctrl_ext.235
-rw-r--r--doc/man/nvme_rescan_ctrl.29
-rw-r--r--doc/man/nvme_resv_acquire.216
-rw-r--r--doc/man/nvme_resv_cptpl.226
-rw-r--r--doc/man/nvme_resv_notification_log.235
-rw-r--r--doc/man/nvme_resv_notify_rnlpt.230
-rw-r--r--doc/man/nvme_resv_racqa.224
-rw-r--r--doc/man/nvme_resv_register.215
-rw-r--r--doc/man/nvme_resv_release.212
-rw-r--r--doc/man/nvme_resv_report.216
-rw-r--r--doc/man/nvme_resv_rrega.224
-rw-r--r--doc/man/nvme_resv_rrela.218
-rw-r--r--doc/man/nvme_resv_rtype.242
-rw-r--r--doc/man/nvme_resv_status.259
-rw-r--r--doc/man/nvme_sanitize_compln_event.227
-rw-r--r--doc/man/nvme_sanitize_log_page.2106
-rw-r--r--doc/man/nvme_sanitize_nvm.222
-rw-r--r--doc/man/nvme_sanitize_sanact.230
-rw-r--r--doc/man/nvme_sanitize_sstat.2105
-rw-r--r--doc/man/nvme_sanitize_start_event.223
-rw-r--r--doc/man/nvme_scan.211
-rw-r--r--doc/man/nvme_scan_ctrl.216
-rw-r--r--doc/man/nvme_scan_ctrl_namespace_paths.214
-rw-r--r--doc/man/nvme_scan_ctrl_namespaces.214
-rw-r--r--doc/man/nvme_scan_ctrls.211
-rw-r--r--doc/man/nvme_scan_namespace.211
-rw-r--r--doc/man/nvme_scan_subsystem_namespaces.214
-rw-r--r--doc/man/nvme_scan_subsystems.211
-rw-r--r--doc/man/nvme_scan_topology.220
-rw-r--r--doc/man/nvme_secondary_ctrl.243
-rw-r--r--doc/man/nvme_secondary_ctrl_list.223
-rw-r--r--doc/man/nvme_security_receive.212
-rw-r--r--doc/man/nvme_security_send.221
-rw-r--r--doc/man/nvme_self_test_log.243
-rw-r--r--doc/man/nvme_set_feature_event.219
-rw-r--r--doc/man/nvme_set_features.212
-rw-r--r--doc/man/nvme_set_features_arbitration.230
-rw-r--r--doc/man/nvme_set_features_async_event.221
-rw-r--r--doc/man/nvme_set_features_auto_pst.224
-rw-r--r--doc/man/nvme_set_features_data.233
-rw-r--r--doc/man/nvme_set_features_endurance_evt_cfg.224
-rw-r--r--doc/man/nvme_set_features_err_recovery.227
-rw-r--r--doc/man/nvme_set_features_hctm.224
-rw-r--r--doc/man/nvme_set_features_host_behavior.218
-rw-r--r--doc/man/nvme_set_features_host_id.221
-rw-r--r--doc/man/nvme_set_features_irq_coalesce.224
-rw-r--r--doc/man/nvme_set_features_irq_config.224
-rw-r--r--doc/man/nvme_set_features_lba_range.227
-rw-r--r--doc/man/nvme_set_features_lba_sts_interval.224
-rw-r--r--doc/man/nvme_set_features_nopsc.221
-rw-r--r--doc/man/nvme_set_features_plm_config.227
-rw-r--r--doc/man/nvme_set_features_plm_window.224
-rw-r--r--doc/man/nvme_set_features_power_mgmt.224
-rw-r--r--doc/man/nvme_set_features_resv_mask.221
-rw-r--r--doc/man/nvme_set_features_resv_persist.221
-rw-r--r--doc/man/nvme_set_features_rrl.224
-rw-r--r--doc/man/nvme_set_features_sanitize.221
-rw-r--r--doc/man/nvme_set_features_simple.227
-rw-r--r--doc/man/nvme_set_features_sw_progress.221
-rw-r--r--doc/man/nvme_set_features_temp_thresh.227
-rw-r--r--doc/man/nvme_set_features_timestamp.218
-rw-r--r--doc/man/nvme_set_features_volatile_wc.221
-rw-r--r--doc/man/nvme_set_features_write_atomic.221
-rw-r--r--doc/man/nvme_set_features_write_protect.221
-rw-r--r--doc/man/nvme_set_property.215
-rw-r--r--doc/man/nvme_smart_crit.254
-rw-r--r--doc/man/nvme_smart_egcw.231
-rw-r--r--doc/man/nvme_smart_log.2235
-rw-r--r--doc/man/nvme_st_code.243
-rw-r--r--doc/man/nvme_st_curr_op.250
-rw-r--r--doc/man/nvme_st_result.277
-rw-r--r--doc/man/nvme_st_valid_diag_info.234
-rw-r--r--doc/man/nvme_status_code.212
-rw-r--r--doc/man/nvme_status_code_type.212
-rw-r--r--doc/man/nvme_status_equals.217
-rw-r--r--doc/man/nvme_status_field.21158
-rw-r--r--doc/man/nvme_status_get_type.211
-rw-r--r--doc/man/nvme_status_get_value.212
-rw-r--r--doc/man/nvme_status_result.287
-rw-r--r--doc/man/nvme_status_to_errno.215
-rw-r--r--doc/man/nvme_status_to_string.215
-rw-r--r--doc/man/nvme_status_type.240
-rw-r--r--doc/man/nvme_streams_directive_params.251
-rw-r--r--doc/man/nvme_streams_directive_status.219
-rw-r--r--doc/man/nvme_submit_admin_passthru.220
-rw-r--r--doc/man/nvme_submit_admin_passthru64.220
-rw-r--r--doc/man/nvme_submit_io_passthru.220
-rw-r--r--doc/man/nvme_submit_io_passthru64.220
-rw-r--r--doc/man/nvme_subsys_filter.211
-rw-r--r--doc/man/nvme_subsys_type.237
-rw-r--r--doc/man/nvme_subsystem_first_ctrl.211
-rw-r--r--doc/man/nvme_subsystem_first_ns.211
-rw-r--r--doc/man/nvme_subsystem_for_each_ctrl.212
-rw-r--r--doc/man/nvme_subsystem_for_each_ctrl_safe.215
-rw-r--r--doc/man/nvme_subsystem_for_each_ns.212
-rw-r--r--doc/man/nvme_subsystem_for_each_ns_safe.215
-rw-r--r--doc/man/nvme_subsystem_get_host.211
-rw-r--r--doc/man/nvme_subsystem_get_name.211
-rw-r--r--doc/man/nvme_subsystem_get_nqn.211
-rw-r--r--doc/man/nvme_subsystem_get_sysfs_dir.211
-rw-r--r--doc/man/nvme_subsystem_get_type.213
-rw-r--r--doc/man/nvme_subsystem_lookup_namespace.214
-rw-r--r--doc/man/nvme_subsystem_next_ctrl.214
-rw-r--r--doc/man/nvme_subsystem_next_ns.214
-rw-r--r--doc/man/nvme_subsystem_reset.214
-rw-r--r--doc/man/nvme_supported_cap_config_list_log.224
-rw-r--r--doc/man/nvme_supported_log_pages.217
-rw-r--r--doc/man/nvme_telemetry_da.230
-rw-r--r--doc/man/nvme_telemetry_log.288
-rw-r--r--doc/man/nvme_thermal_exc_event.219
-rw-r--r--doc/man/nvme_time_stamp_change_event.219
-rw-r--r--doc/man/nvme_timestamp.223
-rw-r--r--doc/man/nvme_unlink_ctrl.29
-rw-r--r--doc/man/nvme_update_config.213
-rw-r--r--doc/man/nvme_uring_cmd.283
-rw-r--r--doc/man/nvme_verify.216
-rw-r--r--doc/man/nvme_version.218
-rw-r--r--doc/man/nvme_virt_mgmt_act.231
-rw-r--r--doc/man/nvme_virt_mgmt_rt.218
-rw-r--r--doc/man/nvme_virtual_mgmt.220
-rw-r--r--doc/man/nvme_write.212
-rw-r--r--doc/man/nvme_write_uncorrectable.217
-rw-r--r--doc/man/nvme_write_zeros.217
-rw-r--r--doc/man/nvme_zns_append.212
-rw-r--r--doc/man/nvme_zns_changed_zone_log.223
-rw-r--r--doc/man/nvme_zns_desc.247
-rw-r--r--doc/man/nvme_zns_id_ctrl.219
-rw-r--r--doc/man/nvme_zns_id_ns.287
-rw-r--r--doc/man/nvme_zns_identify_ctrl.215
-rw-r--r--doc/man/nvme_zns_identify_ns.218
-rw-r--r--doc/man/nvme_zns_lbafe.223
-rw-r--r--doc/man/nvme_zns_mgmt_recv.212
-rw-r--r--doc/man/nvme_zns_mgmt_send.212
-rw-r--r--doc/man/nvme_zns_recv_action.218
-rw-r--r--doc/man/nvme_zns_report_options.254
-rw-r--r--doc/man/nvme_zns_report_zones.239
-rw-r--r--doc/man/nvme_zns_send_action.248
-rw-r--r--doc/man/nvme_zns_za.235
-rw-r--r--doc/man/nvme_zns_zs.248
-rw-r--r--doc/man/nvme_zns_zt.212
-rw-r--r--doc/man/nvme_zone_report.223
-rw-r--r--doc/man/nvmf_add_ctrl.221
-rw-r--r--doc/man/nvmf_addr_family.243
-rw-r--r--doc/man/nvmf_adrfam_str.214
-rw-r--r--doc/man/nvmf_cms_str.214
-rw-r--r--doc/man/nvmf_connect_data.235
-rw-r--r--doc/man/nvmf_connect_disc_entry.220
-rw-r--r--doc/man/nvmf_default_config.211
-rw-r--r--doc/man/nvmf_dim_data.263
-rw-r--r--doc/man/nvmf_dim_entfmt.218
-rw-r--r--doc/man/nvmf_dim_etype.224
-rw-r--r--doc/man/nvmf_dim_tas.224
-rw-r--r--doc/man/nvmf_disc_eflags.246
-rw-r--r--doc/man/nvmf_disc_log_entry.296
-rw-r--r--doc/man/nvmf_discovery_log.238
-rw-r--r--doc/man/nvmf_eflags_str.214
-rw-r--r--doc/man/nvmf_exat_len.215
-rw-r--r--doc/man/nvmf_exattype.218
-rw-r--r--doc/man/nvmf_ext_attr.224
-rw-r--r--doc/man/nvmf_ext_die.279
-rw-r--r--doc/man/nvmf_get_discovery_log.222
-rw-r--r--doc/man/nvmf_get_discovery_wargs.220
-rw-r--r--doc/man/nvmf_hostid_from_file.29
-rw-r--r--doc/man/nvmf_hostnqn_from_file.29
-rw-r--r--doc/man/nvmf_hostnqn_generate.29
-rw-r--r--doc/man/nvmf_log_discovery_lid_support.230
-rw-r--r--doc/man/nvmf_log_discovery_lsp.230
-rw-r--r--doc/man/nvmf_prtype_str.214
-rw-r--r--doc/man/nvmf_qptype_str.214
-rw-r--r--doc/man/nvmf_rdma_cms.212
-rw-r--r--doc/man/nvmf_rdma_prtype.236
-rw-r--r--doc/man/nvmf_rdma_qptype.218
-rw-r--r--doc/man/nvmf_register_ctrl.222
-rw-r--r--doc/man/nvmf_sectype_str.214
-rw-r--r--doc/man/nvmf_subtype_str.214
-rw-r--r--doc/man/nvmf_tcp_sectype.226
-rw-r--r--doc/man/nvmf_treq.230
-rw-r--r--doc/man/nvmf_treq_str.214
-rw-r--r--doc/man/nvmf_trtype.243
-rw-r--r--doc/man/nvmf_trtype_str.214
-rw-r--r--doc/man/nvmf_update_config.215
-rw-r--r--doc/meson.build117
-rw-r--r--doc/mi.rst.in54
-rw-r--r--doc/quickstart.rst.in5
-rw-r--r--doc/rst/fabrics.rst521
-rw-r--r--doc/rst/filters.rst142
-rw-r--r--doc/rst/ioctl.rst4902
-rw-r--r--doc/rst/linux.rst321
-rw-r--r--doc/rst/log.rst30
-rw-r--r--doc/rst/meson.build34
-rw-r--r--doc/rst/mi.rst3157
-rw-r--r--doc/rst/tree.rst2205
-rw-r--r--doc/rst/types.rst11739
-rw-r--r--doc/rst/util.rst577
-rwxr-xr-xdoc/update-docs.sh41
777 files changed, 49731 insertions, 0 deletions
diff --git a/doc/api.rst.in b/doc/api.rst.in
new file mode 100644
index 0000000..3478766
--- /dev/null
+++ b/doc/api.rst.in
@@ -0,0 +1,18 @@
+===
+API
+===
+
+.. module:: libnvme
+
+This part of the documentation lists the full API reference of all public classes and
+functions.
+
+.. include:: rst/types.rst
+.. include:: rst/ioctl.rst
+.. include:: rst/fabrics.rst
+.. include:: rst/linux.rst
+.. include:: rst/mi.rst
+.. include:: rst/tree.rst
+.. include:: rst/filters.rst
+.. include:: rst/util.rst
+.. include:: rst/log.rst
diff --git a/doc/conf.py b/doc/conf.py
new file mode 100644
index 0000000..d641bee
--- /dev/null
+++ b/doc/conf.py
@@ -0,0 +1,32 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+
+# -- Project information -----------------------------------------------------
+
+project = 'libnvme'
+copyright = '2020, Keith Busch'
+author = 'Keith Busch <kbusch@kernel.org>'
+master_doc = 'index'
+
+release = '1.3'
+
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = ['html', 'man', 'Thumbs.db', '.DS_Store']
diff --git a/doc/conf.py.in b/doc/conf.py.in
new file mode 100644
index 0000000..3415bbf
--- /dev/null
+++ b/doc/conf.py.in
@@ -0,0 +1,32 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+
+# -- Project information -----------------------------------------------------
+
+project = 'libnvme'
+copyright = '2020, Keith Busch'
+author = 'Keith Busch <kbusch@kernel.org>'
+master_doc = 'index'
+
+release = '@VERSION@'
+
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = ['html', 'man', 'Thumbs.db', '.DS_Store']
diff --git a/doc/config-schema.json b/doc/config-schema.json
new file mode 100644
index 0000000..bde3d91
--- /dev/null
+++ b/doc/config-schema.json
@@ -0,0 +1,172 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://github.com/linux-nvme/libnvme/doc/config-schema.json",
+ "title": "config.json",
+ "description": "libnvme JSON configuration",
+ "type": "object",
+ "properties": {
+ "hosts": {
+ "description": "Array of NVMe Host properties",
+ "type": "array",
+ "items": { "$ref": "#/$defs/host" }
+ }
+ },
+ "$defs": {
+ "host": {
+ "description": "NVMe Host properties",
+ "type": "object",
+ "properties": {
+ "hostnqn": {
+ "description": "NVMe host NQN",
+ "type": "string",
+ "maxLength": 223
+ },
+ "hostid": {
+ "description": "NVMe host ID",
+ "type": "string"
+ },
+ "dhchap_key": {
+ "description": "Host DH-HMAC-CHAP key",
+ "type": "string"
+ },
+ "hostsymname": {
+ "description": "NVMe host symbolic name",
+ "type": "string"
+ },
+ "persistent_discovery_ctrl": {
+ "description": "Enable/disable Persistent Discovery Controller",
+ "type": "boolean"
+ },
+ "required": [ "hostnqn" ],
+ "subsystems": {
+ "description": "Array of NVMe subsystem properties",
+ "type": "array",
+ "items": { "$ref": "#/$defs/subsystem" }
+ }
+ }
+ },
+ "subsystem": {
+ "description": "NVMe subsystem properties",
+ "type": "object",
+ "properties": {
+ "nqn": {
+ "description": "Subsystem NQN",
+ "type": "string",
+ "maxLength": 223
+ },
+ "ports": {
+ "description": "Array of NVMe subsystem ports",
+ "type": "array",
+ "items": { "$ref": "#/$defs/port" }
+ },
+ "required": [ "nqn" ]
+ }
+ },
+ "port": {
+ "description": "NVMe subsystem port",
+ "type": "object",
+ "properties": {
+ "transport": {
+ "description": "Transport type",
+ "type": "string"
+ },
+ "traddr": {
+ "description": "Transport address",
+ "type": "string"
+ },
+ "host_traddr": {
+ "description": "Host transport address",
+ "type": "string"
+ },
+ "host_iface": {
+ "description": "Host interface name",
+ "type": "string"
+ },
+ "trsvcid": {
+ "description": "Transport service identifier",
+ "type": "string"
+ },
+ "dhchap_key": {
+ "description": "Host DH-HMAC-CHAP key",
+ "type": "string"
+ },
+ "dhchap_ctrl_key": {
+ "description": "Controller DH-HMAC-CHAP key",
+ "type": "string"
+ },
+ "nr_io_queues": {
+ "description": "Number of I/O queues",
+ "type": "integer"
+ },
+ "nr_write_queues": {
+ "description": "Number of write queues",
+ "type": "integer"
+ },
+ "nr_poll_queues": {
+ "description": "Number of poll queues",
+ "type": "integer"
+ },
+ "queue_size": {
+ "description": "Queue size",
+ "type": "integer"
+ },
+ "keep_alive_tmo": {
+ "description": "Keep-Alive timeout (in seconds)",
+ "type": "integer"
+ },
+ "reconnect_delay": {
+ "description": "Reconnect delay (in seconds)",
+ "type": "integer"
+ },
+ "ctrl_loss_tmo": {
+ "description": "Controller loss timeout (in seconds)",
+ "type": "integer"
+ },
+ "fast_io_fail_tmo": {
+ "description": "Fast I/O Fail timeout (in seconds)",
+ "type": "integer",
+ "default": 600
+ },
+ "tos": {
+ "description": "Type of service",
+ "type": "integer",
+ "default": -1
+ },
+ "duplicate_connect": {
+ "description": "Allow duplicate connections",
+ "type": "boolean",
+ "default": false
+ },
+ "disable_sqflow": {
+ "description": "Explicitly disable SQ flow control",
+ "type": "boolean",
+ "default": false
+ },
+ "hdr_digest": {
+ "description": "Enable header digest",
+ "type": "boolean",
+ "default": false
+ },
+ "data_digest": {
+ "description": "Enable data digest",
+ "type": "boolean",
+ "default": false
+ },
+ "tls": {
+ "description": "Enable TLS encryption",
+ "type": "boolean",
+ "default": false
+ },
+ "persistent": {
+ "description": "Create persistent discovery connection",
+ "type": "boolean"
+ },
+ "discovery": {
+ "description": "Connect to a discovery controller",
+ "type": "boolean"
+ }
+ },
+ "required": [ "transport" ]
+ }
+ }
+}
diff --git a/doc/config-schema.json.in b/doc/config-schema.json.in
new file mode 100644
index 0000000..bde3d91
--- /dev/null
+++ b/doc/config-schema.json.in
@@ -0,0 +1,172 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://github.com/linux-nvme/libnvme/doc/config-schema.json",
+ "title": "config.json",
+ "description": "libnvme JSON configuration",
+ "type": "object",
+ "properties": {
+ "hosts": {
+ "description": "Array of NVMe Host properties",
+ "type": "array",
+ "items": { "$ref": "#/$defs/host" }
+ }
+ },
+ "$defs": {
+ "host": {
+ "description": "NVMe Host properties",
+ "type": "object",
+ "properties": {
+ "hostnqn": {
+ "description": "NVMe host NQN",
+ "type": "string",
+ "maxLength": 223
+ },
+ "hostid": {
+ "description": "NVMe host ID",
+ "type": "string"
+ },
+ "dhchap_key": {
+ "description": "Host DH-HMAC-CHAP key",
+ "type": "string"
+ },
+ "hostsymname": {
+ "description": "NVMe host symbolic name",
+ "type": "string"
+ },
+ "persistent_discovery_ctrl": {
+ "description": "Enable/disable Persistent Discovery Controller",
+ "type": "boolean"
+ },
+ "required": [ "hostnqn" ],
+ "subsystems": {
+ "description": "Array of NVMe subsystem properties",
+ "type": "array",
+ "items": { "$ref": "#/$defs/subsystem" }
+ }
+ }
+ },
+ "subsystem": {
+ "description": "NVMe subsystem properties",
+ "type": "object",
+ "properties": {
+ "nqn": {
+ "description": "Subsystem NQN",
+ "type": "string",
+ "maxLength": 223
+ },
+ "ports": {
+ "description": "Array of NVMe subsystem ports",
+ "type": "array",
+ "items": { "$ref": "#/$defs/port" }
+ },
+ "required": [ "nqn" ]
+ }
+ },
+ "port": {
+ "description": "NVMe subsystem port",
+ "type": "object",
+ "properties": {
+ "transport": {
+ "description": "Transport type",
+ "type": "string"
+ },
+ "traddr": {
+ "description": "Transport address",
+ "type": "string"
+ },
+ "host_traddr": {
+ "description": "Host transport address",
+ "type": "string"
+ },
+ "host_iface": {
+ "description": "Host interface name",
+ "type": "string"
+ },
+ "trsvcid": {
+ "description": "Transport service identifier",
+ "type": "string"
+ },
+ "dhchap_key": {
+ "description": "Host DH-HMAC-CHAP key",
+ "type": "string"
+ },
+ "dhchap_ctrl_key": {
+ "description": "Controller DH-HMAC-CHAP key",
+ "type": "string"
+ },
+ "nr_io_queues": {
+ "description": "Number of I/O queues",
+ "type": "integer"
+ },
+ "nr_write_queues": {
+ "description": "Number of write queues",
+ "type": "integer"
+ },
+ "nr_poll_queues": {
+ "description": "Number of poll queues",
+ "type": "integer"
+ },
+ "queue_size": {
+ "description": "Queue size",
+ "type": "integer"
+ },
+ "keep_alive_tmo": {
+ "description": "Keep-Alive timeout (in seconds)",
+ "type": "integer"
+ },
+ "reconnect_delay": {
+ "description": "Reconnect delay (in seconds)",
+ "type": "integer"
+ },
+ "ctrl_loss_tmo": {
+ "description": "Controller loss timeout (in seconds)",
+ "type": "integer"
+ },
+ "fast_io_fail_tmo": {
+ "description": "Fast I/O Fail timeout (in seconds)",
+ "type": "integer",
+ "default": 600
+ },
+ "tos": {
+ "description": "Type of service",
+ "type": "integer",
+ "default": -1
+ },
+ "duplicate_connect": {
+ "description": "Allow duplicate connections",
+ "type": "boolean",
+ "default": false
+ },
+ "disable_sqflow": {
+ "description": "Explicitly disable SQ flow control",
+ "type": "boolean",
+ "default": false
+ },
+ "hdr_digest": {
+ "description": "Enable header digest",
+ "type": "boolean",
+ "default": false
+ },
+ "data_digest": {
+ "description": "Enable data digest",
+ "type": "boolean",
+ "default": false
+ },
+ "tls": {
+ "description": "Enable TLS encryption",
+ "type": "boolean",
+ "default": false
+ },
+ "persistent": {
+ "description": "Create persistent discovery connection",
+ "type": "boolean"
+ },
+ "discovery": {
+ "description": "Connect to a discovery controller",
+ "type": "boolean"
+ }
+ },
+ "required": [ "transport" ]
+ }
+ }
+}
diff --git a/doc/index.rst b/doc/index.rst
new file mode 100644
index 0000000..54c2415
--- /dev/null
+++ b/doc/index.rst
@@ -0,0 +1,23 @@
+Welcome to libnvme's documentation!
+===================================
+
+This is the libnvme development C library. libnvme provides type definitions for
+NVMe specification structures, enumerations, and bit fields,
+helper functions to construct, dispatch, and decode commands and payloads,
+and utilities to connect, scan, and manage nvme devices on a Linux system.
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Contents:
+
+ installation.rst
+ quickstart.rst
+ mi.rst
+ api.rst
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/doc/index.rst.in b/doc/index.rst.in
new file mode 100644
index 0000000..54c2415
--- /dev/null
+++ b/doc/index.rst.in
@@ -0,0 +1,23 @@
+Welcome to libnvme's documentation!
+===================================
+
+This is the libnvme development C library. libnvme provides type definitions for
+NVMe specification structures, enumerations, and bit fields,
+helper functions to construct, dispatch, and decode commands and payloads,
+and utilities to connect, scan, and manage nvme devices on a Linux system.
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Contents:
+
+ installation.rst
+ quickstart.rst
+ mi.rst
+ api.rst
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/doc/installation.rst.in b/doc/installation.rst.in
new file mode 100644
index 0000000..ea0415d
--- /dev/null
+++ b/doc/installation.rst.in
@@ -0,0 +1,55 @@
+Installation
+============
+
+Debian / Ubuntu:
+----------------
+
+.. code-block:: sh
+
+ $ apt-get install libnvme
+
+Fedora / Red Hat:
+-----------------
+
+.. code-block:: sh
+
+ $ dnf install libnvme
+
+Python binding
+--------------
+
+Python Version
+^^^^^^^^^^^^^^
+
+The latest Python 3 version is always recommended, since it has all
+the latest bells and whistles. libnvme supports Python 3.6 and above.
+
+Dependencies
+^^^^^^^^^^^^
+
+libnvme only uses packages from the standard library, so no additional
+dependencies will be installed when installing libnvme.
+
+Install libnvme python
+^^^^^^^^^^^^^^^^^^^^^^
+
+Debian / Ubuntu:
+
+.. code-block:: sh
+
+ $ apt-get install python3-libnvme
+
+Fedora / Red Hat:
+
+.. code-block:: sh
+
+ $ dnf install python3-libnvme
+
+libnvme is available on `PyPI`_, and can be installed using pip. The
+version on PyPI is always the latest stable release.
+
+.. _PyPi: https://pypi.org/project/libnvme/
+
+.. code-block:: sh
+
+ $ pip install libnvme
diff --git a/doc/kernel-doc b/doc/kernel-doc
new file mode 100755
index 0000000..4900c3a
--- /dev/null
+++ b/doc/kernel-doc
@@ -0,0 +1,2523 @@
+#!/usr/bin/env perl
+# SPDX-License-Identifier: GPL-2.0
+
+use warnings;
+use strict;
+
+## Copyright (c) 1998 Michael Zucchi, All Rights Reserved ##
+## Copyright (C) 2000, 1 Tim Waugh <twaugh@redhat.com> ##
+## Copyright (C) 2001 Simon Huggins ##
+## Copyright (C) 2005-2012 Randy Dunlap ##
+## Copyright (C) 2012 Dan Luedtke ##
+## ##
+## #define enhancements by Armin Kuster <akuster@mvista.com> ##
+## Copyright (c) 2000 MontaVista Software, Inc. ##
+## ##
+## This software falls under the GNU General Public License. ##
+## Please read the COPYING file for more information ##
+
+# 18/01/2001 - Cleanups
+# Functions prototyped as foo(void) same as foo()
+# Stop eval'ing where we don't need to.
+# -- huggie@earth.li
+
+# 27/06/2001 - Allowed whitespace after initial "/**" and
+# allowed comments before function declarations.
+# -- Christian Kreibich <ck@whoop.org>
+
+# Still to do:
+# - add perldoc documentation
+# - Look more closely at some of the scarier bits :)
+
+# 26/05/2001 - Support for separate source and object trees.
+# Return error code.
+# Keith Owens <kaos@ocs.com.au>
+
+# 23/09/2001 - Added support for typedefs, structs, enums and unions
+# Support for Context section; can be terminated using empty line
+# Small fixes (like spaces vs. \s in regex)
+# -- Tim Jansen <tim@tjansen.de>
+
+# 25/07/2012 - Added support for HTML5
+# -- Dan Luedtke <mail@danrl.de>
+
+sub usage {
+ my $message = <<"EOF";
+Usage: $0 [OPTION ...] FILE ...
+
+Read C language source or header FILEs, extract embedded documentation comments,
+and print formatted documentation to standard output.
+
+The documentation comments are identified by "/**" opening comment mark. See
+Documentation/doc-guide/kernel-doc.rst for the documentation comment syntax.
+
+Output format selection (mutually exclusive):
+ -man Output troff manual page format. This is the default.
+ -rst Output reStructuredText format.
+ -none Do not output documentation, only warnings.
+
+Output format selection modifier (affects only ReST output):
+
+ -sphinx-version Use the ReST C domain dialect compatible with an
+ specific Sphinx Version.
+ If not specified, kernel-doc will auto-detect using
+ the sphinx-build version found on PATH.
+
+Output selection (mutually exclusive):
+ -export Only output documentation for symbols that have been
+ exported using EXPORT_SYMBOL() or EXPORT_SYMBOL_GPL()
+ in any input FILE or -export-file FILE.
+ -internal Only output documentation for symbols that have NOT been
+ exported using EXPORT_SYMBOL() or EXPORT_SYMBOL_GPL()
+ in any input FILE or -export-file FILE.
+ -function NAME Only output documentation for the given function(s)
+ or DOC: section title(s). All other functions and DOC:
+ sections are ignored. May be specified multiple times.
+ -nosymbol NAME Exclude the specified symbols from the output
+ documentation. May be specified multiple times.
+
+Output selection modifiers:
+ -no-doc-sections Do not output DOC: sections.
+ -enable-lineno Enable output of #define LINENO lines. Only works with
+ reStructuredText format.
+ -export-file FILE Specify an additional FILE in which to look for
+ EXPORT_SYMBOL() and EXPORT_SYMBOL_GPL(). To be used with
+ -export or -internal. May be specified multiple times.
+
+Other parameters:
+ -v Verbose output, more warnings and other information.
+ -h Print this help.
+ -Werror Treat warnings as errors.
+
+EOF
+ print $message;
+ exit 1;
+}
+
+#
+# format of comments.
+# In the following table, (...)? signifies optional structure.
+# (...)* signifies 0 or more structure elements
+# /**
+# * function_name(:)? (- short description)?
+# (* @parameterx: (description of parameter x)?)*
+# (* a blank line)?
+# * (Description:)? (Description of function)?
+# * (section header: (section description)? )*
+# (*)?*/
+#
+# So .. the trivial example would be:
+#
+# /**
+# * my_function
+# */
+#
+# If the Description: header tag is omitted, then there must be a blank line
+# after the last parameter specification.
+# e.g.
+# /**
+# * my_function - does my stuff
+# * @my_arg: its mine damnit
+# *
+# * Does my stuff explained.
+# */
+#
+# or, could also use:
+# /**
+# * my_function - does my stuff
+# * @my_arg: its mine damnit
+# * Description: Does my stuff explained.
+# */
+# etc.
+#
+# Besides functions you can also write documentation for structs, unions,
+# enums and typedefs. Instead of the function name you must write the name
+# of the declaration; the struct/union/enum/typedef must always precede
+# the name. Nesting of declarations is not supported.
+# Use the argument mechanism to document members or constants.
+# e.g.
+# /**
+# * struct my_struct - short description
+# * @a: first member
+# * @b: second member
+# *
+# * Longer description
+# */
+# struct my_struct {
+# int a;
+# int b;
+# /* private: */
+# int c;
+# };
+#
+# All descriptions can be multiline, except the short function description.
+#
+# For really longs structs, you can also describe arguments inside the
+# body of the struct.
+# eg.
+# /**
+# * struct my_struct - short description
+# * @a: first member
+# * @b: second member
+# *
+# * Longer description
+# */
+# struct my_struct {
+# int a;
+# int b;
+# /**
+# * @c: This is longer description of C
+# *
+# * You can use paragraphs to describe arguments
+# * using this method.
+# */
+# int c;
+# };
+#
+# This should be use only for struct/enum members.
+#
+# You can also add additional sections. When documenting kernel functions you
+# should document the "Context:" of the function, e.g. whether the functions
+# can be called form interrupts. Unlike other sections you can end it with an
+# empty line.
+# A non-void function should have a "Return:" section describing the return
+# value(s).
+# Example-sections should contain the string EXAMPLE so that they are marked
+# appropriately in DocBook.
+#
+# Example:
+# /**
+# * user_function - function that can only be called in user context
+# * @a: some argument
+# * Context: !in_interrupt()
+# *
+# * Some description
+# * Example:
+# * user_function(22);
+# */
+# ...
+#
+#
+# All descriptive text is further processed, scanning for the following special
+# patterns, which are highlighted appropriately.
+#
+# 'funcname()' - function
+# '$ENVVAR' - environmental variable
+# '&struct_name' - name of a structure (up to two words including 'struct')
+# '&struct_name.member' - name of a structure member
+# '@parameter' - name of a parameter
+# '%CONST' - name of a constant.
+# '``LITERAL``' - literal string without any spaces on it.
+
+## init lots of data
+
+my $errors = 0;
+my $warnings = 0;
+my $anon_struct_union = 0;
+
+# match expressions used to find embedded type information
+my $type_constant = '\b``([^\`]+)``\b';
+my $type_constant2 = '\%([-_\w]+)';
+my $type_func = '(\w+)\(\)';
+my $type_param = '\@(\w*((\.\w+)|(->\w+))*(\.\.\.)?)';
+my $type_param_ref = '([\!]?)\@(\w*((\.\w+)|(->\w+))*(\.\.\.)?)';
+my $type_fp_param = '\@(\w+)\(\)'; # Special RST handling for func ptr params
+my $type_fp_param2 = '\@(\w+->\S+)\(\)'; # Special RST handling for structs with func ptr params
+my $type_env = '(\$\w+)';
+my $type_enum = '\&(enum\s*([_\w]+))';
+my $type_struct = '\&(struct\s*([_\w]+))';
+my $type_typedef = '\&(typedef\s*([_\w]+))';
+my $type_union = '\&(union\s*([_\w]+))';
+my $type_member = '\&([_\w]+)(\.|->)([_\w]+)';
+my $type_fallback = '\&([_\w]+)';
+my $type_member_func = $type_member . '\(\)';
+
+# Output conversion substitutions.
+# One for each output format
+
+# these are pretty rough
+my @highlights_man = (
+ [$type_constant, "\$1"],
+ [$type_constant2, "\$1"],
+ [$type_func, "\\\\fB\$1\\\\fP"],
+ [$type_enum, "\\\\fI\$1\\\\fP"],
+ [$type_struct, "\\\\fI\$1\\\\fP"],
+ [$type_typedef, "\\\\fI\$1\\\\fP"],
+ [$type_union, "\\\\fI\$1\\\\fP"],
+ [$type_param, "\\\\fI\$1\\\\fP"],
+ [$type_param_ref, "\\\\fI\$1\$2\\\\fP"],
+ [$type_member, "\\\\fI\$1\$2\$3\\\\fP"],
+ [$type_fallback, "\\\\fI\$1\\\\fP"]
+ );
+my $blankline_man = "";
+
+# rst-mode
+my @highlights_rst = (
+ [$type_constant, "``\$1``"],
+ [$type_constant2, "``\$1``"],
+ # Note: need to escape () to avoid func matching later
+ [$type_member_func, "\\:c\\:type\\:`\$1\$2\$3\\\\(\\\\) <\$1>`"],
+ [$type_member, "\\:c\\:type\\:`\$1\$2\$3 <\$1>`"],
+ [$type_fp_param, "**\$1\\\\(\\\\)**"],
+ [$type_fp_param2, "**\$1\\\\(\\\\)**"],
+ [$type_func, "\$1()"],
+ [$type_enum, "\\:c\\:type\\:`\$1 <\$2>`"],
+ [$type_struct, "\\:c\\:type\\:`\$1 <\$2>`"],
+ [$type_typedef, "\\:c\\:type\\:`\$1 <\$2>`"],
+ [$type_union, "\\:c\\:type\\:`\$1 <\$2>`"],
+ # in rst this can refer to any type
+ [$type_fallback, "\\:c\\:type\\:`\$1`"],
+ [$type_param_ref, "**\$1\$2**"]
+ );
+my $blankline_rst = "\n";
+
+# read arguments
+if ($#ARGV == -1) {
+ usage();
+}
+
+my $kernelversion;
+my ($sphinx_major, $sphinx_minor, $sphinx_patch);
+
+my $dohighlight = "";
+
+my $verbose = 0;
+my $Werror = 0;
+my $output_mode = "rst";
+my $output_preformatted = 0;
+my $no_doc_sections = 0;
+my $enable_lineno = 0;
+my @highlights = @highlights_rst;
+my $blankline = $blankline_rst;
+my $modulename = "Kernel API";
+
+use constant {
+ OUTPUT_ALL => 0, # output all symbols and doc sections
+ OUTPUT_INCLUDE => 1, # output only specified symbols
+ OUTPUT_EXPORTED => 2, # output exported symbols
+ OUTPUT_INTERNAL => 3, # output non-exported symbols
+};
+my $output_selection = OUTPUT_ALL;
+my $show_not_found = 0; # No longer used
+
+my @export_file_list;
+
+my @build_time;
+if (defined($ENV{'KBUILD_BUILD_TIMESTAMP'}) &&
+ (my $seconds = `date -d"${ENV{'KBUILD_BUILD_TIMESTAMP'}}" +%s`) ne '') {
+ @build_time = gmtime($seconds);
+} else {
+ @build_time = localtime;
+}
+
+my $man_date = ('January', 'February', 'March', 'April', 'May', 'June',
+ 'July', 'August', 'September', 'October',
+ 'November', 'December')[$build_time[4]] .
+ " " . ($build_time[5]+1900);
+
+# Essentially these are globals.
+# They probably want to be tidied up, made more localised or something.
+# CAVEAT EMPTOR! Some of the others I localised may not want to be, which
+# could cause "use of undefined value" or other bugs.
+my ($function, %function_table, %parametertypes, $declaration_purpose);
+my %nosymbol_table = ();
+my $declaration_start_line;
+my ($type, $declaration_name, $return_type);
+my ($newsection, $newcontents, $prototype, $brcount, %source_map);
+
+if (defined($ENV{'KBUILD_VERBOSE'})) {
+ $verbose = "$ENV{'KBUILD_VERBOSE'}";
+}
+
+if (defined($ENV{'KCFLAGS'})) {
+ my $kcflags = "$ENV{'KCFLAGS'}";
+
+ if ($kcflags =~ /Werror/) {
+ $Werror = 1;
+ }
+}
+
+if (defined($ENV{'KDOC_WERROR'})) {
+ $Werror = "$ENV{'KDOC_WERROR'}";
+}
+
+# Generated docbook code is inserted in a template at a point where
+# docbook v3.1 requires a non-zero sequence of RefEntry's; see:
+# https://www.oasis-open.org/docbook/documentation/reference/html/refentry.html
+# We keep track of number of generated entries and generate a dummy
+# if needs be to ensure the expanded template can be postprocessed
+# into html.
+my $section_counter = 0;
+
+my $lineprefix="";
+
+# Parser states
+use constant {
+ STATE_NORMAL => 0, # normal code
+ STATE_NAME => 1, # looking for function name
+ STATE_BODY_MAYBE => 2, # body - or maybe more description
+ STATE_BODY => 3, # the body of the comment
+ STATE_BODY_WITH_BLANK_LINE => 4, # the body, which has a blank line
+ STATE_PROTO => 5, # scanning prototype
+ STATE_DOCBLOCK => 6, # documentation block
+ STATE_INLINE => 7, # gathering doc outside main block
+};
+my $state;
+my $in_doc_sect;
+my $leading_space;
+
+# Inline documentation state
+use constant {
+ STATE_INLINE_NA => 0, # not applicable ($state != STATE_INLINE)
+ STATE_INLINE_NAME => 1, # looking for member name (@foo:)
+ STATE_INLINE_TEXT => 2, # looking for member documentation
+ STATE_INLINE_END => 3, # done
+ STATE_INLINE_ERROR => 4, # error - Comment without header was found.
+ # Spit a warning as it's not
+ # proper kernel-doc and ignore the rest.
+};
+my $inline_doc_state;
+
+#declaration types: can be
+# 'function', 'struct', 'union', 'enum', 'typedef'
+my $decl_type;
+
+# Name of the kernel-doc identifier for non-DOC markups
+my $identifier;
+
+my $doc_start = '^/\*\*\s*$'; # Allow whitespace at end of comment start.
+my $doc_end = '\*/';
+my $doc_com = '\s*\*\s*';
+my $doc_com_body = '\s*\* ?';
+my $doc_decl = $doc_com . '(\w+)';
+# @params and a strictly limited set of supported section names
+# Specifically:
+# Match @word:
+# @...:
+# @{section-name}:
+# while trying to not match literal block starts like "example::"
+#
+my $doc_sect = $doc_com .
+ '\s*(\@[.\w]+|\@\.\.\.|description|context|returns?|notes?|examples?)\s*:([^:].*)?$';
+my $doc_content = $doc_com_body . '(.*)';
+my $doc_block = $doc_com . 'DOC:\s*(.*)?';
+my $doc_inline_start = '^\s*/\*\*\s*$';
+my $doc_inline_sect = '\s*\*\s*(@\s*[\w][\w\.]*\s*):(.*)';
+my $doc_inline_end = '^\s*\*/\s*$';
+my $doc_inline_oneline = '^\s*/\*\*\s*(@[\w\s]+):\s*(.*)\s*\*/\s*$';
+my $export_symbol = '^\s*EXPORT_SYMBOL(_GPL)?\s*\(\s*(\w+)\s*\)\s*;';
+my $function_pointer = qr{([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)};
+my $attribute = qr{__attribute__\s*\(\([a-z0-9,_\*\s\(\)]*\)\)}i;
+
+my %parameterdescs;
+my %parameterdesc_start_lines;
+my @parameterlist;
+my %sections;
+my @sectionlist;
+my %section_start_lines;
+my $sectcheck;
+my $struct_actual;
+
+my $contents = "";
+my $new_start_line = 0;
+
+# the canonical section names. see also $doc_sect above.
+my $section_default = "Description"; # default section
+my $section_intro = "Introduction";
+my $section = $section_default;
+my $section_context = "Context";
+my $section_return = "Return";
+
+my $undescribed = "-- undescribed --";
+
+reset_state();
+
+while ($ARGV[0] =~ m/^--?(.*)/) {
+ my $cmd = $1;
+ shift @ARGV;
+ if ($cmd eq "man") {
+ $output_mode = "man";
+ @highlights = @highlights_man;
+ $blankline = $blankline_man;
+ } elsif ($cmd eq "rst") {
+ $output_mode = "rst";
+ @highlights = @highlights_rst;
+ $blankline = $blankline_rst;
+ } elsif ($cmd eq "none") {
+ $output_mode = "none";
+ } elsif ($cmd eq "module") { # not needed for XML, inherits from calling document
+ $modulename = shift @ARGV;
+ } elsif ($cmd eq "function") { # to only output specific functions
+ $output_selection = OUTPUT_INCLUDE;
+ $function = shift @ARGV;
+ $function_table{$function} = 1;
+ } elsif ($cmd eq "nosymbol") { # Exclude specific symbols
+ my $symbol = shift @ARGV;
+ $nosymbol_table{$symbol} = 1;
+ } elsif ($cmd eq "export") { # only exported symbols
+ $output_selection = OUTPUT_EXPORTED;
+ %function_table = ();
+ } elsif ($cmd eq "internal") { # only non-exported symbols
+ $output_selection = OUTPUT_INTERNAL;
+ %function_table = ();
+ } elsif ($cmd eq "export-file") {
+ my $file = shift @ARGV;
+ push(@export_file_list, $file);
+ } elsif ($cmd eq "v") {
+ $verbose = 1;
+ } elsif ($cmd eq "Werror") {
+ $Werror = 1;
+ } elsif (($cmd eq "h") || ($cmd eq "help")) {
+ usage();
+ } elsif ($cmd eq 'no-doc-sections') {
+ $no_doc_sections = 1;
+ } elsif ($cmd eq 'enable-lineno') {
+ $enable_lineno = 1;
+ } elsif ($cmd eq 'show-not-found') {
+ $show_not_found = 1; # A no-op but don't fail
+ } elsif ($cmd eq "sphinx-version") {
+ my $ver_string = shift @ARGV;
+ if ($ver_string =~ m/^(\d+)(\.\d+)?(\.\d+)?/) {
+ $sphinx_major = $1;
+ if (defined($2)) {
+ $sphinx_minor = substr($2,1);
+ } else {
+ $sphinx_minor = 0;
+ }
+ if (defined($3)) {
+ $sphinx_patch = substr($3,1)
+ } else {
+ $sphinx_patch = 0;
+ }
+ } else {
+ die "Sphinx version should either major.minor or major.minor.patch format\n";
+ }
+ } else {
+ # Unknown argument
+ usage();
+ }
+}
+
+# continue execution near EOF;
+
+# The C domain dialect changed on Sphinx 3. So, we need to check the
+# version in order to produce the right tags.
+sub findprog($)
+{
+ foreach(split(/:/, $ENV{PATH})) {
+ return "$_/$_[0]" if(-x "$_/$_[0]");
+ }
+}
+
+sub get_sphinx_version()
+{
+ my $ver;
+
+ my $cmd = "sphinx-build";
+ if (!findprog($cmd)) {
+ my $cmd = "sphinx-build3";
+ if (!findprog($cmd)) {
+ $sphinx_major = 1;
+ $sphinx_minor = 2;
+ $sphinx_patch = 0;
+ printf STDERR "Warning: Sphinx version not found. Using default (Sphinx version %d.%d.%d)\n",
+ $sphinx_major, $sphinx_minor, $sphinx_patch;
+ return;
+ }
+ }
+
+ open IN, "$cmd --version 2>&1 |";
+ while (<IN>) {
+ if (m/^\s*sphinx-build\s+([\d]+)\.([\d\.]+)(\+\/[\da-f]+)?$/) {
+ $sphinx_major = $1;
+ $sphinx_minor = $2;
+ $sphinx_patch = $3;
+ last;
+ }
+ # Sphinx 1.2.x uses a different format
+ if (m/^\s*Sphinx.*\s+([\d]+)\.([\d\.]+)$/) {
+ $sphinx_major = $1;
+ $sphinx_minor = $2;
+ $sphinx_patch = $3;
+ last;
+ }
+ }
+ close IN;
+}
+
+# get kernel version from env
+sub get_kernel_version() {
+ my $version = 'unknown kernel version';
+
+ if (defined($ENV{'KERNELVERSION'})) {
+ $version = $ENV{'KERNELVERSION'};
+ }
+ return $version;
+}
+
+#
+sub print_lineno {
+ my $lineno = shift;
+ if ($enable_lineno && defined($lineno)) {
+ print "#define LINENO " . $lineno . "\n";
+ }
+}
+##
+# dumps section contents to arrays/hashes intended for that purpose.
+#
+sub dump_section {
+ my $file = shift;
+ my $name = shift;
+ my $contents = join "\n", @_;
+
+ if ($name =~ m/$type_param/) {
+ $name = $1;
+ $parameterdescs{$name} = $contents;
+ $sectcheck = $sectcheck . $name . " ";
+ $parameterdesc_start_lines{$name} = $new_start_line;
+ $new_start_line = 0;
+ } elsif ($name eq "@\.\.\.") {
+ $name = "...";
+ $parameterdescs{$name} = $contents;
+ $sectcheck = $sectcheck . $name . " ";
+ $parameterdesc_start_lines{$name} = $new_start_line;
+ $new_start_line = 0;
+ } else {
+ if (defined($sections{$name}) && ($sections{$name} ne "")) {
+ # Only warn on user specified duplicate section names.
+ if ($name ne $section_default) {
+ print STDERR "${file}:$.: warning: duplicate section name '$name'\n";
+ ++$warnings;
+ }
+ $sections{$name} .= $contents;
+ } else {
+ $sections{$name} = $contents;
+ push @sectionlist, $name;
+ $section_start_lines{$name} = $new_start_line;
+ $new_start_line = 0;
+ }
+ }
+}
+
+##
+# dump DOC: section after checking that it should go out
+#
+sub dump_doc_section {
+ my $file = shift;
+ my $name = shift;
+ my $contents = join "\n", @_;
+
+ if ($no_doc_sections) {
+ return;
+ }
+
+ return if (defined($nosymbol_table{$name}));
+
+ if (($output_selection == OUTPUT_ALL) ||
+ (($output_selection == OUTPUT_INCLUDE) &&
+ defined($function_table{$name})))
+ {
+ dump_section($file, $name, $contents);
+ output_blockhead({'sectionlist' => \@sectionlist,
+ 'sections' => \%sections,
+ 'module' => $modulename,
+ 'content-only' => ($output_selection != OUTPUT_ALL), });
+ }
+}
+
+##
+# output function
+#
+# parameterdescs, a hash.
+# function => "function name"
+# parameterlist => @list of parameters
+# parameterdescs => %parameter descriptions
+# sectionlist => @list of sections
+# sections => %section descriptions
+#
+
+sub output_highlight {
+ my $contents = join "\n",@_;
+ my $line;
+
+# DEBUG
+# if (!defined $contents) {
+# use Carp;
+# confess "output_highlight got called with no args?\n";
+# }
+
+# print STDERR "contents b4:$contents\n";
+ eval $dohighlight;
+ die $@ if $@;
+# print STDERR "contents af:$contents\n";
+
+ foreach $line (split "\n", $contents) {
+ if (! $output_preformatted) {
+ $line =~ s/^\s*//;
+ }
+ if ($line eq ""){
+ if (! $output_preformatted) {
+ print $lineprefix, $blankline;
+ }
+ } else {
+ if ($output_mode eq "man" && substr($line, 0, 1) eq ".") {
+ print "\\&$line";
+ } else {
+ print $lineprefix, $line;
+ }
+ }
+ print "\n";
+ }
+}
+
+##
+# output function in man
+sub output_function_man(%) {
+ my %args = %{$_[0]};
+ my ($parameter, $section);
+ my $count;
+
+ print ".TH \"$args{'function'}\" 9 \"$args{'function'}\" \"$man_date\" \"libnvme API manual\" LINUX\n";
+
+ print ".SH NAME\n";
+ print $args{'function'} . " \\- " . $args{'purpose'} . "\n";
+
+ print ".SH SYNOPSIS\n";
+ if ($args{'functiontype'} ne "") {
+ print ".B \"" . $args{'functiontype'} . "\" " . $args{'function'} . "\n";
+ } else {
+ print ".B \"" . $args{'function'} . "\n";
+ }
+ $count = 0;
+ my $parenth = "(";
+ my $post = ",";
+ foreach my $parameter (@{$args{'parameterlist'}}) {
+ if ($count == $#{$args{'parameterlist'}}) {
+ $post = ");";
+ }
+ $type = $args{'parametertypes'}{$parameter};
+ if ($type =~ m/$function_pointer/) {
+ # pointer-to-function
+ print ".BI \"" . $parenth . $1 . "\" " . " \") (" . $2 . ")" . $post . "\"\n";
+ } else {
+ $type =~ s/([^\*])$/$1 /;
+ print ".BI \"" . $parenth . $type . "\" " . " \"" . $post . "\"\n";
+ }
+ $count++;
+ $parenth = "";
+ }
+
+ print ".SH ARGUMENTS\n";
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ my $parameter_name = $parameter;
+ $parameter_name =~ s/\[.*//;
+
+ print ".IP \"" . $parameter . "\" 12\n";
+ output_highlight($args{'parameterdescs'}{$parameter_name});
+ }
+ foreach $section (@{$args{'sectionlist'}}) {
+ print ".SH \"", uc $section, "\"\n";
+ output_highlight($args{'sections'}{$section});
+ }
+}
+
+##
+# output enum in man
+sub output_enum_man(%) {
+ my %args = %{$_[0]};
+ my ($parameter, $section);
+ my $count;
+
+ print ".TH \"$args{'module'}\" 9 \"enum $args{'enum'}\" \"$man_date\" \"API Manual\" LINUX\n";
+
+ print ".SH NAME\n";
+ print "enum " . $args{'enum'} . " \\- " . $args{'purpose'} . "\n";
+
+ print ".SH SYNOPSIS\n";
+ print "enum " . $args{'enum'} . " {\n";
+ $count = 0;
+ foreach my $parameter (@{$args{'parameterlist'}}) {
+ print ".br\n.BI \" $parameter\"\n";
+ if ($count == $#{$args{'parameterlist'}}) {
+ print "\n};\n";
+ last;
+ }
+ else {
+ print ", \n.br\n";
+ }
+ $count++;
+ }
+
+ print ".SH Constants\n";
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ my $parameter_name = $parameter;
+ $parameter_name =~ s/\[.*//;
+
+ print ".IP \"" . $parameter . "\" 12\n";
+ output_highlight($args{'parameterdescs'}{$parameter_name});
+ }
+ foreach $section (@{$args{'sectionlist'}}) {
+ print ".SH \"$section\"\n";
+ output_highlight($args{'sections'}{$section});
+ }
+}
+
+##
+# output struct in man
+sub output_struct_man(%) {
+ my %args = %{$_[0]};
+ my ($parameter, $section);
+
+ print ".TH \"$args{'module'}\" 9 \"" . $args{'type'} . " " . $args{'struct'} . "\" \"$man_date\" \"API Manual\" LINUX\n";
+
+ print ".SH NAME\n";
+ print $args{'type'} . " " . $args{'struct'} . " \\- " . $args{'purpose'} . "\n";
+
+ my $declaration = $args{'definition'};
+ $declaration =~ s/\t/ /g;
+ $declaration =~ s/\n/"\n.br\n.BI \"/g;
+ print ".SH SYNOPSIS\n";
+ print $args{'type'} . " " . $args{'struct'} . " {\n.br\n";
+ print ".BI \"$declaration\n};\n.br\n\n";
+
+ print ".SH Members\n";
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ ($parameter =~ /^#/) && next;
+
+ my $parameter_name = $parameter;
+ $parameter_name =~ s/\[.*//;
+
+ ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+ print ".IP \"" . $parameter . "\" 12\n";
+ output_highlight($args{'parameterdescs'}{$parameter_name});
+ }
+ foreach $section (@{$args{'sectionlist'}}) {
+ print ".SH \"$section\"\n";
+ output_highlight($args{'sections'}{$section});
+ }
+}
+
+##
+# output typedef in man
+sub output_typedef_man(%) {
+ my %args = %{$_[0]};
+ my ($parameter, $section);
+
+ print ".TH \"$args{'module'}\" 9 \"$args{'typedef'}\" \"$man_date\" \"API Manual\" LINUX\n";
+
+ print ".SH NAME\n";
+ print "typedef " . $args{'typedef'} . " \\- " . $args{'purpose'} . "\n";
+
+ foreach $section (@{$args{'sectionlist'}}) {
+ print ".SH \"$section\"\n";
+ output_highlight($args{'sections'}{$section});
+ }
+}
+
+sub output_blockhead_man(%) {
+ my %args = %{$_[0]};
+ my ($parameter, $section);
+ my $count;
+
+ print ".TH \"$args{'module'}\" 9 \"$args{'module'}\" \"$man_date\" \"API Manual\" LINUX\n";
+
+ foreach $section (@{$args{'sectionlist'}}) {
+ print ".SH \"$section\"\n";
+ output_highlight($args{'sections'}{$section});
+ }
+}
+
+##
+# output in restructured text
+#
+
+#
+# This could use some work; it's used to output the DOC: sections, and
+# starts by putting out the name of the doc section itself, but that tends
+# to duplicate a header already in the template file.
+#
+sub output_blockhead_rst(%) {
+ my %args = %{$_[0]};
+ my ($parameter, $section);
+
+ foreach $section (@{$args{'sectionlist'}}) {
+ next if (defined($nosymbol_table{$section}));
+
+ if ($output_selection != OUTPUT_INCLUDE) {
+ print ".. _$section:\n\n";
+ print "**$section**\n\n";
+ }
+ print_lineno($section_start_lines{$section});
+ output_highlight_rst($args{'sections'}{$section});
+ print "\n";
+ }
+}
+
+#
+# Apply the RST highlights to a sub-block of text.
+#
+sub highlight_block($) {
+ # The dohighlight kludge requires the text be called $contents
+ my $contents = shift;
+ eval $dohighlight;
+ die $@ if $@;
+ return $contents;
+}
+
+#
+# Regexes used only here.
+#
+my $sphinx_literal = '^[^.].*::$';
+my $sphinx_cblock = '^\.\.\ +code-block::';
+
+sub output_highlight_rst {
+ my $input = join "\n",@_;
+ my $output = "";
+ my $line;
+ my $in_literal = 0;
+ my $litprefix;
+ my $block = "";
+
+ foreach $line (split "\n",$input) {
+ #
+ # If we're in a literal block, see if we should drop out
+ # of it. Otherwise pass the line straight through unmunged.
+ #
+ if ($in_literal) {
+ if (! ($line =~ /^\s*$/)) {
+ #
+ # If this is the first non-blank line in a literal
+ # block we need to figure out what the proper indent is.
+ #
+ if ($litprefix eq "") {
+ $line =~ /^(\s*)/;
+ $litprefix = '^' . $1;
+ $output .= $line . "\n";
+ } elsif (! ($line =~ /$litprefix/)) {
+ $in_literal = 0;
+ } else {
+ $output .= $line . "\n";
+ }
+ } else {
+ $output .= $line . "\n";
+ }
+ }
+ #
+ # Not in a literal block (or just dropped out)
+ #
+ if (! $in_literal) {
+ $block .= $line . "\n";
+ if (($line =~ /$sphinx_literal/) || ($line =~ /$sphinx_cblock/)) {
+ $in_literal = 1;
+ $litprefix = "";
+ $output .= highlight_block($block);
+ $block = ""
+ }
+ }
+ }
+
+ if ($block) {
+ $output .= highlight_block($block);
+ }
+ foreach $line (split "\n", $output) {
+ print $lineprefix . $line . "\n";
+ }
+}
+
+sub output_function_rst(%) {
+ my %args = %{$_[0]};
+ my ($parameter, $section);
+ my $oldprefix = $lineprefix;
+ my $start = "";
+ my $is_macro = 0;
+
+ if ($sphinx_major < 3) {
+ if ($args{'typedef'}) {
+ print ".. c:type:: ". $args{'function'} . "\n\n";
+ print_lineno($declaration_start_line);
+ print " **Typedef**: ";
+ $lineprefix = "";
+ output_highlight_rst($args{'purpose'});
+ $start = "\n\n**Syntax**\n\n ``";
+ $is_macro = 1;
+ } else {
+ print ".. c:function:: ";
+ }
+ } else {
+ if ($args{'typedef'} || $args{'functiontype'} eq "") {
+ $is_macro = 1;
+ print ".. c:macro:: ". $args{'function'} . "\n\n";
+ } else {
+ print ".. c:function:: ";
+ }
+
+ if ($args{'typedef'}) {
+ print_lineno($declaration_start_line);
+ print " **Typedef**: ";
+ $lineprefix = "";
+ output_highlight_rst($args{'purpose'});
+ $start = "\n\n**Syntax**\n\n ``";
+ } else {
+ print "``" if ($is_macro);
+ }
+ }
+ if ($args{'functiontype'} ne "") {
+ $start .= $args{'functiontype'} . " " . $args{'function'} . " (";
+ } else {
+ $start .= $args{'function'} . " (";
+ }
+ print $start;
+
+ my $count = 0;
+ foreach my $parameter (@{$args{'parameterlist'}}) {
+ if ($count ne 0) {
+ print ", ";
+ }
+ $count++;
+ $type = $args{'parametertypes'}{$parameter};
+
+ if ($type =~ m/$function_pointer/) {
+ # pointer-to-function
+ print $1 . $parameter . ") (" . $2 . ")";
+ } else {
+ print $type;
+ }
+ }
+ if ($is_macro) {
+ print ")``\n\n";
+ } else {
+ print ")\n\n";
+ }
+ if (!$args{'typedef'}) {
+ print_lineno($declaration_start_line);
+ $lineprefix = " ";
+ output_highlight_rst($args{'purpose'});
+ print "\n";
+ }
+
+ print "**Parameters**\n\n";
+ $lineprefix = " ";
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ my $parameter_name = $parameter;
+ $parameter_name =~ s/\[.*//;
+ $type = $args{'parametertypes'}{$parameter};
+
+ if ($type ne "") {
+ print "``$type``\n";
+ } else {
+ print "``$parameter``\n";
+ }
+
+ print_lineno($parameterdesc_start_lines{$parameter_name});
+
+ if (defined($args{'parameterdescs'}{$parameter_name}) &&
+ $args{'parameterdescs'}{$parameter_name} ne $undescribed) {
+ output_highlight_rst($args{'parameterdescs'}{$parameter_name});
+ } else {
+ print " *undescribed*\n";
+ }
+ print "\n";
+ }
+
+ $lineprefix = $oldprefix;
+ output_section_rst(@_);
+}
+
+sub output_section_rst(%) {
+ my %args = %{$_[0]};
+ my $section;
+ my $oldprefix = $lineprefix;
+ $lineprefix = "";
+
+ foreach $section (@{$args{'sectionlist'}}) {
+ print "**$section**\n\n";
+ print_lineno($section_start_lines{$section});
+ output_highlight_rst($args{'sections'}{$section});
+ print "\n";
+ }
+ print "\n";
+ $lineprefix = $oldprefix;
+}
+
+sub output_enum_rst(%) {
+ my %args = %{$_[0]};
+ my ($parameter);
+ my $oldprefix = $lineprefix;
+ my $count;
+
+ if ($sphinx_major < 3) {
+ my $name = "enum " . $args{'enum'};
+ print "\n\n.. c:type:: " . $name . "\n\n";
+ } else {
+ my $name = $args{'enum'};
+ print "\n\n.. c:enum:: " . $name . "\n\n";
+ }
+ print_lineno($declaration_start_line);
+ $lineprefix = " ";
+ output_highlight_rst($args{'purpose'});
+ print "\n";
+
+ print "**Constants**\n\n";
+ $lineprefix = " ";
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ print "``$parameter``\n";
+ if ($args{'parameterdescs'}{$parameter} ne $undescribed) {
+ output_highlight_rst($args{'parameterdescs'}{$parameter});
+ } else {
+ print " *undescribed*\n";
+ }
+ print "\n";
+ }
+
+ $lineprefix = $oldprefix;
+ output_section_rst(@_);
+}
+
+sub output_typedef_rst(%) {
+ my %args = %{$_[0]};
+ my ($parameter);
+ my $oldprefix = $lineprefix;
+ my $name;
+
+ if ($sphinx_major < 3) {
+ $name = "typedef " . $args{'typedef'};
+ } else {
+ $name = $args{'typedef'};
+ }
+ print "\n\n.. c:type:: " . $name . "\n\n";
+ print_lineno($declaration_start_line);
+ $lineprefix = " ";
+ output_highlight_rst($args{'purpose'});
+ print "\n";
+
+ $lineprefix = $oldprefix;
+ output_section_rst(@_);
+}
+
+sub output_struct_rst(%) {
+ my %args = %{$_[0]};
+ my ($parameter);
+ my $oldprefix = $lineprefix;
+
+ if ($sphinx_major < 3) {
+ my $name = $args{'type'} . " " . $args{'struct'};
+ print "\n\n.. c:type:: " . $name . "\n\n";
+ } else {
+ my $name = $args{'struct'};
+ if ($args{'type'} eq 'union') {
+ print "\n\n.. c:union:: " . $name . "\n\n";
+ } else {
+ print "\n\n.. c:struct:: " . $name . "\n\n";
+ }
+ }
+ print_lineno($declaration_start_line);
+ $lineprefix = " ";
+ output_highlight_rst($args{'purpose'});
+ print "\n";
+
+ print "**Definition**\n\n";
+ print "::\n\n";
+ my $declaration = $args{'definition'};
+ $declaration =~ s/\t/ /g;
+ print " " . $args{'type'} . " " . $args{'struct'} . " {\n$declaration };\n\n";
+
+ print "**Members**\n\n";
+ $lineprefix = " ";
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ ($parameter =~ /^#/) && next;
+
+ my $parameter_name = $parameter;
+ $parameter_name =~ s/\[.*//;
+
+ ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+ $type = $args{'parametertypes'}{$parameter};
+ print_lineno($parameterdesc_start_lines{$parameter_name});
+ print "``" . $parameter . "``\n";
+ output_highlight_rst($args{'parameterdescs'}{$parameter_name});
+ print "\n";
+ }
+ print "\n";
+
+ $lineprefix = $oldprefix;
+ output_section_rst(@_);
+}
+
+## none mode output functions
+
+sub output_function_none(%) {
+}
+
+sub output_enum_none(%) {
+}
+
+sub output_typedef_none(%) {
+}
+
+sub output_struct_none(%) {
+}
+
+sub output_blockhead_none(%) {
+}
+
+##
+# generic output function for all types (function, struct/union, typedef, enum);
+# calls the generated, variable output_ function name based on
+# functype and output_mode
+sub output_declaration {
+ no strict 'refs';
+ my $name = shift;
+ my $functype = shift;
+ my $func = "output_${functype}_$output_mode";
+
+ return if (defined($nosymbol_table{$name}));
+
+ if (($output_selection == OUTPUT_ALL) ||
+ (($output_selection == OUTPUT_INCLUDE ||
+ $output_selection == OUTPUT_EXPORTED) &&
+ defined($function_table{$name})) ||
+ ($output_selection == OUTPUT_INTERNAL &&
+ !($functype eq "function" && defined($function_table{$name}))))
+ {
+ &$func(@_);
+ $section_counter++;
+ }
+}
+
+##
+# generic output function - calls the right one based on current output mode.
+sub output_blockhead {
+ no strict 'refs';
+ my $func = "output_blockhead_" . $output_mode;
+ &$func(@_);
+ $section_counter++;
+}
+
+##
+# takes a declaration (struct, union, enum, typedef) and
+# invokes the right handler. NOT called for functions.
+sub dump_declaration($$) {
+ no strict 'refs';
+ my ($prototype, $file) = @_;
+ my $func = "dump_" . $decl_type;
+ &$func(@_);
+}
+
+sub dump_union($$) {
+ dump_struct(@_);
+}
+
+sub dump_struct($$) {
+ my $x = shift;
+ my $file = shift;
+ my $decl_type;
+ my $members;
+ my $type = qr{struct|union};
+ # For capturing struct/union definition body, i.e. "{members*}qualifiers*"
+ my $qualifiers = qr{$attribute|__packed|__aligned|____cacheline_aligned_in_smp|____cacheline_aligned};
+ my $definition_body = qr{\{(.*)\}\s*$qualifiers*};
+ my $struct_members = qr{($type)([^\{\};]+)\{([^\{\}]*)\}([^\{\}\;]*)\;};
+
+ if ($x =~ /($type)\s+(\w+)\s*$definition_body/) {
+ $decl_type = $1;
+ $declaration_name = $2;
+ $members = $3;
+ } elsif ($x =~ /typedef\s+($type)\s*$definition_body\s*(\w+)\s*;/) {
+ $decl_type = $1;
+ $declaration_name = $3;
+ $members = $2;
+ }
+
+ if ($members) {
+ if ($identifier ne $declaration_name) {
+ print STDERR "${file}:$.: warning: expecting prototype for $decl_type $identifier. Prototype was for $decl_type $declaration_name instead\n";
+ return;
+ }
+
+ # ignore members marked private:
+ $members =~ s/\/\*\s*private:.*?\/\*\s*public:.*?\*\///gosi;
+ $members =~ s/\/\*\s*private:.*//gosi;
+ # strip comments:
+ $members =~ s/\/\*.*?\*\///gos;
+ # strip attributes
+ $members =~ s/\s*$attribute/ /gi;
+ $members =~ s/\s*__aligned\s*\([^;]*\)/ /gos;
+ $members =~ s/\s*__packed\s*/ /gos;
+ $members =~ s/\s*CRYPTO_MINALIGN_ATTR/ /gos;
+ $members =~ s/\s*____cacheline_aligned_in_smp/ /gos;
+ $members =~ s/\s*____cacheline_aligned/ /gos;
+ # unwrap struct_group():
+ # - first eat non-declaration parameters and rewrite for final match
+ # - then remove macro, outer parens, and trailing semicolon
+ $members =~ s/\bstruct_group\s*\(([^,]*,)/STRUCT_GROUP(/gos;
+ $members =~ s/\bstruct_group_(attr|tagged)\s*\(([^,]*,){2}/STRUCT_GROUP(/gos;
+ $members =~ s/\b__struct_group\s*\(([^,]*,){3}/STRUCT_GROUP(/gos;
+ $members =~ s/\bSTRUCT_GROUP(\(((?:(?>[^)(]+)|(?1))*)\))[^;]*;/$2/gos;
+
+ my $args = qr{([^,)]+)};
+ # replace DECLARE_BITMAP
+ $members =~ s/__ETHTOOL_DECLARE_LINK_MODE_MASK\s*\(([^\)]+)\)/DECLARE_BITMAP($1, __ETHTOOL_LINK_MODE_MASK_NBITS)/gos;
+ $members =~ s/DECLARE_PHY_INTERFACE_MASK\s*\(([^\)]+)\)/DECLARE_BITMAP($1, PHY_INTERFACE_MODE_MAX)/gos;
+ $members =~ s/DECLARE_BITMAP\s*\($args,\s*$args\)/unsigned long $1\[BITS_TO_LONGS($2)\]/gos;
+ # replace DECLARE_HASHTABLE
+ $members =~ s/DECLARE_HASHTABLE\s*\($args,\s*$args\)/unsigned long $1\[1 << (($2) - 1)\]/gos;
+ # replace DECLARE_KFIFO
+ $members =~ s/DECLARE_KFIFO\s*\($args,\s*$args,\s*$args\)/$2 \*$1/gos;
+ # replace DECLARE_KFIFO_PTR
+ $members =~ s/DECLARE_KFIFO_PTR\s*\($args,\s*$args\)/$2 \*$1/gos;
+ # replace DECLARE_FLEX_ARRAY
+ $members =~ s/(?:__)?DECLARE_FLEX_ARRAY\s*\($args,\s*$args\)/$1 $2\[\]/gos;
+ my $declaration = $members;
+
+ # Split nested struct/union elements as newer ones
+ while ($members =~ m/$struct_members/) {
+ my $newmember;
+ my $maintype = $1;
+ my $ids = $4;
+ my $content = $3;
+ foreach my $id(split /,/, $ids) {
+ $newmember .= "$maintype $id; ";
+
+ $id =~ s/[:\[].*//;
+ $id =~ s/^\s*\**(\S+)\s*/$1/;
+ foreach my $arg (split /;/, $content) {
+ next if ($arg =~ m/^\s*$/);
+ if ($arg =~ m/^([^\(]+\(\*?\s*)([\w\.]*)(\s*\).*)/) {
+ # pointer-to-function
+ my $type = $1;
+ my $name = $2;
+ my $extra = $3;
+ next if (!$name);
+ if ($id =~ m/^\s*$/) {
+ # anonymous struct/union
+ $newmember .= "$type$name$extra; ";
+ } else {
+ $newmember .= "$type$id.$name$extra; ";
+ }
+ } else {
+ my $type;
+ my $names;
+ $arg =~ s/^\s+//;
+ $arg =~ s/\s+$//;
+ # Handle bitmaps
+ $arg =~ s/:\s*\d+\s*//g;
+ # Handle arrays
+ $arg =~ s/\[.*\]//g;
+ # The type may have multiple words,
+ # and multiple IDs can be defined, like:
+ # const struct foo, *bar, foobar
+ # So, we remove spaces when parsing the
+ # names, in order to match just names
+ # and commas for the names
+ $arg =~ s/\s*,\s*/,/g;
+ if ($arg =~ m/(.*)\s+([\S+,]+)/) {
+ $type = $1;
+ $names = $2;
+ } else {
+ $newmember .= "$arg; ";
+ next;
+ }
+ foreach my $name (split /,/, $names) {
+ $name =~ s/^\s*\**(\S+)\s*/$1/;
+ next if (($name =~ m/^\s*$/));
+ if ($id =~ m/^\s*$/) {
+ # anonymous struct/union
+ $newmember .= "$type $name; ";
+ } else {
+ $newmember .= "$type $id.$name; ";
+ }
+ }
+ }
+ }
+ }
+ $members =~ s/$struct_members/$newmember/;
+ }
+
+ # Ignore other nested elements, like enums
+ $members =~ s/(\{[^\{\}]*\})//g;
+
+ create_parameterlist($members, ';', $file, $declaration_name);
+ check_sections($file, $declaration_name, $decl_type, $sectcheck, $struct_actual);
+
+ # Adjust declaration for better display
+ $declaration =~ s/([\{;])/$1\n/g;
+ $declaration =~ s/\}\s+;/};/g;
+ # Better handle inlined enums
+ do {} while ($declaration =~ s/(enum\s+\{[^\}]+),([^\n])/$1,\n$2/);
+
+ my @def_args = split /\n/, $declaration;
+ my $level = 1;
+ $declaration = "";
+ foreach my $clause (@def_args) {
+ $clause =~ s/^\s+//;
+ $clause =~ s/\s+$//;
+ $clause =~ s/\s+/ /;
+ next if (!$clause);
+ $level-- if ($clause =~ m/(\})/ && $level > 1);
+ if (!($clause =~ m/^\s*#/)) {
+ $declaration .= "\t" x $level;
+ }
+ $declaration .= "\t" . $clause . "\n";
+ $level++ if ($clause =~ m/(\{)/ && !($clause =~m/\}/));
+ }
+ output_declaration($declaration_name,
+ 'struct',
+ {'struct' => $declaration_name,
+ 'module' => $modulename,
+ 'definition' => $declaration,
+ 'parameterlist' => \@parameterlist,
+ 'parameterdescs' => \%parameterdescs,
+ 'parametertypes' => \%parametertypes,
+ 'sectionlist' => \@sectionlist,
+ 'sections' => \%sections,
+ 'purpose' => $declaration_purpose,
+ 'type' => $decl_type
+ });
+ }
+ else {
+ print STDERR "${file}:$.: error: Cannot parse struct or union!\n";
+ ++$errors;
+ }
+}
+
+
+sub show_warnings($$) {
+ my $functype = shift;
+ my $name = shift;
+
+ return 0 if (defined($nosymbol_table{$name}));
+
+ return 1 if ($output_selection == OUTPUT_ALL);
+
+ if ($output_selection == OUTPUT_EXPORTED) {
+ if (defined($function_table{$name})) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+ if ($output_selection == OUTPUT_INTERNAL) {
+ if (!($functype eq "function" && defined($function_table{$name}))) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+ if ($output_selection == OUTPUT_INCLUDE) {
+ if (defined($function_table{$name})) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+ die("Please add the new output type at show_warnings()");
+}
+
+sub dump_enum($$) {
+ my $x = shift;
+ my $file = shift;
+ my $members;
+
+
+ $x =~ s@/\*.*?\*/@@gos; # strip comments.
+ # strip #define macros inside enums
+ $x =~ s@#\s*((define|ifdef)\s+|endif)[^;]*;@@gos;
+
+ if ($x =~ /typedef\s+enum\s*\{(.*)\}\s*(\w*)\s*;/) {
+ $declaration_name = $2;
+ $members = $1;
+ } elsif ($x =~ /enum\s+(\w*)\s*\{(.*)\}/) {
+ $declaration_name = $1;
+ $members = $2;
+ }
+
+ if ($members) {
+ if ($identifier ne $declaration_name) {
+ if ($identifier eq "") {
+ print STDERR "${file}:$.: warning: wrong kernel-doc identifier on line:\n";
+ } else {
+ print STDERR "${file}:$.: warning: expecting prototype for enum $identifier. Prototype was for enum $declaration_name instead\n";
+ }
+ return;
+ }
+ $declaration_name = "(anonymous)" if ($declaration_name eq "");
+
+ my %_members;
+
+ $members =~ s/\s+$//;
+
+ foreach my $arg (split ',', $members) {
+ $arg =~ s/^\s*(\w+).*/$1/;
+ push @parameterlist, $arg;
+ if (!$parameterdescs{$arg}) {
+ $parameterdescs{$arg} = $undescribed;
+ if (show_warnings("enum", $declaration_name)) {
+ print STDERR "${file}:$.: warning: Enum value '$arg' not described in enum '$declaration_name'\n";
+ }
+ }
+ $_members{$arg} = 1;
+ }
+
+ while (my ($k, $v) = each %parameterdescs) {
+ if (!exists($_members{$k})) {
+ if (show_warnings("enum", $declaration_name)) {
+ print STDERR "${file}:$.: warning: Excess enum value '$k' description in '$declaration_name'\n";
+ }
+ }
+ }
+
+ output_declaration($declaration_name,
+ 'enum',
+ {'enum' => $declaration_name,
+ 'module' => $modulename,
+ 'parameterlist' => \@parameterlist,
+ 'parameterdescs' => \%parameterdescs,
+ 'sectionlist' => \@sectionlist,
+ 'sections' => \%sections,
+ 'purpose' => $declaration_purpose
+ });
+ } else {
+ print STDERR "${file}:$.: error: Cannot parse enum!\n";
+ ++$errors;
+ }
+}
+
+my $typedef_type = qr { ((?:\s+[\w\*]+\b){1,8})\s* }x;
+my $typedef_ident = qr { \*?\s*(\w\S+)\s* }x;
+my $typedef_args = qr { \s*\((.*)\); }x;
+
+my $typedef1 = qr { typedef$typedef_type\($typedef_ident\)$typedef_args }x;
+my $typedef2 = qr { typedef$typedef_type$typedef_ident$typedef_args }x;
+
+sub dump_typedef($$) {
+ my $x = shift;
+ my $file = shift;
+
+ $x =~ s@/\*.*?\*/@@gos; # strip comments.
+
+ # Parse function typedef prototypes
+ if ($x =~ $typedef1 || $x =~ $typedef2) {
+ $return_type = $1;
+ $declaration_name = $2;
+ my $args = $3;
+ $return_type =~ s/^\s+//;
+
+ if ($identifier ne $declaration_name) {
+ print STDERR "${file}:$.: warning: expecting prototype for typedef $identifier. Prototype was for typedef $declaration_name instead\n";
+ return;
+ }
+
+ create_parameterlist($args, ',', $file, $declaration_name);
+
+ output_declaration($declaration_name,
+ 'function',
+ {'function' => $declaration_name,
+ 'typedef' => 1,
+ 'module' => $modulename,
+ 'functiontype' => $return_type,
+ 'parameterlist' => \@parameterlist,
+ 'parameterdescs' => \%parameterdescs,
+ 'parametertypes' => \%parametertypes,
+ 'sectionlist' => \@sectionlist,
+ 'sections' => \%sections,
+ 'purpose' => $declaration_purpose
+ });
+ return;
+ }
+
+ while (($x =~ /\(*.\)\s*;$/) || ($x =~ /\[*.\]\s*;$/)) {
+ $x =~ s/\(*.\)\s*;$/;/;
+ $x =~ s/\[*.\]\s*;$/;/;
+ }
+
+ if ($x =~ /typedef.*\s+(\w+)\s*;/) {
+ $declaration_name = $1;
+
+ if ($identifier ne $declaration_name) {
+ print STDERR "${file}:$.: warning: expecting prototype for typedef $identifier. Prototype was for typedef $declaration_name instead\n";
+ return;
+ }
+
+ output_declaration($declaration_name,
+ 'typedef',
+ {'typedef' => $declaration_name,
+ 'module' => $modulename,
+ 'sectionlist' => \@sectionlist,
+ 'sections' => \%sections,
+ 'purpose' => $declaration_purpose
+ });
+ }
+ else {
+ print STDERR "${file}:$.: error: Cannot parse typedef!\n";
+ ++$errors;
+ }
+}
+
+sub save_struct_actual($) {
+ my $actual = shift;
+
+ # strip all spaces from the actual param so that it looks like one string item
+ $actual =~ s/\s*//g;
+ $struct_actual = $struct_actual . $actual . " ";
+}
+
+sub create_parameterlist($$$$) {
+ my $args = shift;
+ my $splitter = shift;
+ my $file = shift;
+ my $declaration_name = shift;
+ my $type;
+ my $param;
+
+ # temporarily replace commas inside function pointer definition
+ my $arg_expr = qr{\([^\),]+};
+ while ($args =~ /$arg_expr,/) {
+ $args =~ s/($arg_expr),/$1#/g;
+ }
+
+ foreach my $arg (split($splitter, $args)) {
+ # strip comments
+ $arg =~ s/\/\*.*\*\///;
+ # strip leading/trailing spaces
+ $arg =~ s/^\s*//;
+ $arg =~ s/\s*$//;
+ $arg =~ s/\s+/ /;
+
+ if ($arg =~ /^#/) {
+ # Treat preprocessor directive as a typeless variable just to fill
+ # corresponding data structures "correctly". Catch it later in
+ # output_* subs.
+ push_parameter($arg, "", "", $file);
+ } elsif ($arg =~ m/\(.+\)\s*\(/) {
+ # pointer-to-function
+ $arg =~ tr/#/,/;
+ $arg =~ m/[^\(]+\(\*?\s*([\w\[\]\.]*)\s*\)/;
+ $param = $1;
+ $type = $arg;
+ $type =~ s/([^\(]+\(\*?)\s*$param/$1/;
+ save_struct_actual($param);
+ push_parameter($param, $type, $arg, $file, $declaration_name);
+ } elsif ($arg) {
+ $arg =~ s/\s*:\s*/:/g;
+ $arg =~ s/\s*\[/\[/g;
+
+ my @args = split('\s*,\s*', $arg);
+ if ($args[0] =~ m/\*/) {
+ $args[0] =~ s/(\*+)\s*/ $1/;
+ }
+
+ my @first_arg;
+ if ($args[0] =~ /^(.*\s+)(.*?\[.*\].*)$/) {
+ shift @args;
+ push(@first_arg, split('\s+', $1));
+ push(@first_arg, $2);
+ } else {
+ @first_arg = split('\s+', shift @args);
+ }
+
+ unshift(@args, pop @first_arg);
+ $type = join " ", @first_arg;
+
+ foreach $param (@args) {
+ if ($param =~ m/^(\*+)\s*(.*)/) {
+ save_struct_actual($2);
+
+ push_parameter($2, "$type $1", $arg, $file, $declaration_name);
+ }
+ elsif ($param =~ m/(.*?):(\d+)/) {
+ if ($type ne "") { # skip unnamed bit-fields
+ save_struct_actual($1);
+ push_parameter($1, "$type:$2", $arg, $file, $declaration_name)
+ }
+ }
+ else {
+ save_struct_actual($param);
+ push_parameter($param, $type, $arg, $file, $declaration_name);
+ }
+ }
+ }
+ }
+}
+
+sub push_parameter($$$$$) {
+ my $param = shift;
+ my $type = shift;
+ my $org_arg = shift;
+ my $file = shift;
+ my $declaration_name = shift;
+
+ if (($anon_struct_union == 1) && ($type eq "") &&
+ ($param eq "}")) {
+ return; # ignore the ending }; from anon. struct/union
+ }
+
+ $anon_struct_union = 0;
+ $param =~ s/[\[\)].*//;
+
+ if ($type eq "" && $param =~ /\.\.\.$/)
+ {
+ if (!$param =~ /\w\.\.\.$/) {
+ # handles unnamed variable parameters
+ $param = "...";
+ }
+ elsif ($param =~ /\w\.\.\.$/) {
+ # for named variable parameters of the form `x...`, remove the dots
+ $param =~ s/\.\.\.$//;
+ }
+ if (!defined $parameterdescs{$param} || $parameterdescs{$param} eq "") {
+ $parameterdescs{$param} = "variable arguments";
+ }
+ }
+ elsif ($type eq "" && ($param eq "" or $param eq "void"))
+ {
+ $param="void";
+ $parameterdescs{void} = "no arguments";
+ }
+ elsif ($type eq "" && ($param eq "struct" or $param eq "union"))
+ # handle unnamed (anonymous) union or struct:
+ {
+ $type = $param;
+ $param = "{unnamed_" . $param . "}";
+ $parameterdescs{$param} = "anonymous\n";
+ $anon_struct_union = 1;
+ }
+
+ # warn if parameter has no description
+ # (but ignore ones starting with # as these are not parameters
+ # but inline preprocessor statements);
+ # Note: It will also ignore void params and unnamed structs/unions
+ if (!defined $parameterdescs{$param} && $param !~ /^#/) {
+ $parameterdescs{$param} = $undescribed;
+
+ if (show_warnings($type, $declaration_name) && $param !~ /\./) {
+ print STDERR
+ "${file}:$.: warning: Function parameter or member '$param' not described in '$declaration_name'\n";
+ ++$warnings;
+ }
+ }
+
+ # strip spaces from $param so that it is one continuous string
+ # on @parameterlist;
+ # this fixes a problem where check_sections() cannot find
+ # a parameter like "addr[6 + 2]" because it actually appears
+ # as "addr[6", "+", "2]" on the parameter list;
+ # but it's better to maintain the param string unchanged for output,
+ # so just weaken the string compare in check_sections() to ignore
+ # "[blah" in a parameter string;
+ ###$param =~ s/\s*//g;
+ push @parameterlist, $param;
+ $org_arg =~ s/\s\s+/ /g;
+ $parametertypes{$param} = $org_arg;
+}
+
+sub check_sections($$$$$) {
+ my ($file, $decl_name, $decl_type, $sectcheck, $prmscheck) = @_;
+ my @sects = split ' ', $sectcheck;
+ my @prms = split ' ', $prmscheck;
+ my $err;
+ my ($px, $sx);
+ my $prm_clean; # strip trailing "[array size]" and/or beginning "*"
+
+ foreach $sx (0 .. $#sects) {
+ $err = 1;
+ foreach $px (0 .. $#prms) {
+ $prm_clean = $prms[$px];
+ $prm_clean =~ s/\[.*\]//;
+ $prm_clean =~ s/$attribute//i;
+ # ignore array size in a parameter string;
+ # however, the original param string may contain
+ # spaces, e.g.: addr[6 + 2]
+ # and this appears in @prms as "addr[6" since the
+ # parameter list is split at spaces;
+ # hence just ignore "[..." for the sections check;
+ $prm_clean =~ s/\[.*//;
+
+ ##$prm_clean =~ s/^\**//;
+ if ($prm_clean eq $sects[$sx]) {
+ $err = 0;
+ last;
+ }
+ }
+ if ($err) {
+ if ($decl_type eq "function") {
+ print STDERR "${file}:$.: warning: " .
+ "Excess function parameter " .
+ "'$sects[$sx]' " .
+ "description in '$decl_name'\n";
+ ++$warnings;
+ }
+ }
+ }
+}
+
+##
+# Checks the section describing the return value of a function.
+sub check_return_section {
+ my $file = shift;
+ my $declaration_name = shift;
+ my $return_type = shift;
+
+ # Ignore an empty return type (It's a macro)
+ # Ignore functions with a "void" return type. (But don't ignore "void *")
+ if (($return_type eq "") || ($return_type =~ /void\s*\w*\s*$/)) {
+ return;
+ }
+
+ if (!defined($sections{$section_return}) ||
+ $sections{$section_return} eq "") {
+ print STDERR "${file}:$.: warning: " .
+ "No description found for return value of " .
+ "'$declaration_name'\n";
+ ++$warnings;
+ }
+}
+
+##
+# takes a function prototype and the name of the current file being
+# processed and spits out all the details stored in the global
+# arrays/hashes.
+sub dump_function($$) {
+ my $prototype = shift;
+ my $file = shift;
+ my $noret = 0;
+
+ print_lineno($new_start_line);
+
+ $prototype =~ s/^static +//;
+ $prototype =~ s/^extern +//;
+ $prototype =~ s/^asmlinkage +//;
+ $prototype =~ s/^inline +//;
+ $prototype =~ s/^__inline__ +//;
+ $prototype =~ s/^__inline +//;
+ $prototype =~ s/^__always_inline +//;
+ $prototype =~ s/^noinline +//;
+ $prototype =~ s/__init +//;
+ $prototype =~ s/__init_or_module +//;
+ $prototype =~ s/__deprecated +//;
+ $prototype =~ s/__flatten +//;
+ $prototype =~ s/__meminit +//;
+ $prototype =~ s/__must_check +//;
+ $prototype =~ s/__weak +//;
+ $prototype =~ s/__sched +//;
+ $prototype =~ s/__printf\s*\(\s*\d*\s*,\s*\d*\s*\) +//;
+ $prototype =~ s/__alloc_size\s*\(\s*\d+\s*(?:,\s*\d+\s*)?\) +//;
+ my $define = $prototype =~ s/^#\s*define\s+//; #ak added
+ $prototype =~ s/__attribute_const__ +//;
+ $prototype =~ s/__attribute__\s*\(\(
+ (?:
+ [\w\s]++ # attribute name
+ (?:\([^)]*+\))? # attribute arguments
+ \s*+,? # optional comma at the end
+ )+
+ \)\)\s+//x;
+
+ # Yes, this truly is vile. We are looking for:
+ # 1. Return type (may be nothing if we're looking at a macro)
+ # 2. Function name
+ # 3. Function parameters.
+ #
+ # All the while we have to watch out for function pointer parameters
+ # (which IIRC is what the two sections are for), C types (these
+ # regexps don't even start to express all the possibilities), and
+ # so on.
+ #
+ # If you mess with these regexps, it's a good idea to check that
+ # the following functions' documentation still comes out right:
+ # - parport_register_device (function pointer parameters)
+ # - atomic_set (macro)
+ # - pci_match_device, __copy_to_user (long return type)
+ my $name = qr{[a-zA-Z0-9_~:]+};
+ my $prototype_end1 = qr{[^\(]*};
+ my $prototype_end2 = qr{[^\{]*};
+ my $prototype_end = qr{\(($prototype_end1|$prototype_end2)\)};
+ my $type1 = qr{[\w\s]+};
+ my $type2 = qr{$type1\*+};
+
+ if ($define && $prototype =~ m/^()($name)\s+/) {
+ # This is an object-like macro, it has no return type and no parameter
+ # list.
+ # Function-like macros are not allowed to have spaces between
+ # declaration_name and opening parenthesis (notice the \s+).
+ $return_type = $1;
+ $declaration_name = $2;
+ $noret = 1;
+ } elsif ($prototype =~ m/^()($name)\s*$prototype_end/ ||
+ $prototype =~ m/^($type1)\s+($name)\s*$prototype_end/ ||
+ $prototype =~ m/^($type2+)\s*($name)\s*$prototype_end/) {
+ $return_type = $1;
+ $declaration_name = $2;
+ my $args = $3;
+
+ create_parameterlist($args, ',', $file, $declaration_name);
+ } else {
+ print STDERR "${file}:$.: warning: cannot understand function prototype: '$prototype'\n";
+ return;
+ }
+
+ if ($identifier ne $declaration_name) {
+ print STDERR "${file}:$.: warning: expecting prototype for $identifier(). Prototype was for $declaration_name() instead\n";
+ return;
+ }
+
+ my $prms = join " ", @parameterlist;
+ check_sections($file, $declaration_name, "function", $sectcheck, $prms);
+
+ # This check emits a lot of warnings at the moment, because many
+ # functions don't have a 'Return' doc section. So until the number
+ # of warnings goes sufficiently down, the check is only performed in
+ # verbose mode.
+ # TODO: always perform the check.
+ if ($verbose && !$noret) {
+ check_return_section($file, $declaration_name, $return_type);
+ }
+
+ # The function parser can be called with a typedef parameter.
+ # Handle it.
+ if ($return_type =~ /typedef/) {
+ output_declaration($declaration_name,
+ 'function',
+ {'function' => $declaration_name,
+ 'typedef' => 1,
+ 'module' => $modulename,
+ 'functiontype' => $return_type,
+ 'parameterlist' => \@parameterlist,
+ 'parameterdescs' => \%parameterdescs,
+ 'parametertypes' => \%parametertypes,
+ 'sectionlist' => \@sectionlist,
+ 'sections' => \%sections,
+ 'purpose' => $declaration_purpose
+ });
+ } else {
+ output_declaration($declaration_name,
+ 'function',
+ {'function' => $declaration_name,
+ 'module' => $modulename,
+ 'functiontype' => $return_type,
+ 'parameterlist' => \@parameterlist,
+ 'parameterdescs' => \%parameterdescs,
+ 'parametertypes' => \%parametertypes,
+ 'sectionlist' => \@sectionlist,
+ 'sections' => \%sections,
+ 'purpose' => $declaration_purpose
+ });
+ }
+}
+
+sub reset_state {
+ $function = "";
+ %parameterdescs = ();
+ %parametertypes = ();
+ @parameterlist = ();
+ %sections = ();
+ @sectionlist = ();
+ $sectcheck = "";
+ $struct_actual = "";
+ $prototype = "";
+
+ $state = STATE_NORMAL;
+ $inline_doc_state = STATE_INLINE_NA;
+}
+
+sub tracepoint_munge($) {
+ my $file = shift;
+ my $tracepointname = 0;
+ my $tracepointargs = 0;
+
+ if ($prototype =~ m/TRACE_EVENT\((.*?),/) {
+ $tracepointname = $1;
+ }
+ if ($prototype =~ m/DEFINE_SINGLE_EVENT\((.*?),/) {
+ $tracepointname = $1;
+ }
+ if ($prototype =~ m/DEFINE_EVENT\((.*?),(.*?),/) {
+ $tracepointname = $2;
+ }
+ $tracepointname =~ s/^\s+//; #strip leading whitespace
+ if ($prototype =~ m/TP_PROTO\((.*?)\)/) {
+ $tracepointargs = $1;
+ }
+ if (($tracepointname eq 0) || ($tracepointargs eq 0)) {
+ print STDERR "${file}:$.: warning: Unrecognized tracepoint format: \n".
+ "$prototype\n";
+ } else {
+ $prototype = "static inline void trace_$tracepointname($tracepointargs)";
+ $identifier = "trace_$identifier";
+ }
+}
+
+sub syscall_munge() {
+ my $void = 0;
+
+ $prototype =~ s@[\r\n]+@ @gos; # strip newlines/CR's
+## if ($prototype =~ m/SYSCALL_DEFINE0\s*\(\s*(a-zA-Z0-9_)*\s*\)/) {
+ if ($prototype =~ m/SYSCALL_DEFINE0/) {
+ $void = 1;
+## $prototype = "long sys_$1(void)";
+ }
+
+ $prototype =~ s/SYSCALL_DEFINE.*\(/long sys_/; # fix return type & func name
+ if ($prototype =~ m/long (sys_.*?),/) {
+ $prototype =~ s/,/\(/;
+ } elsif ($void) {
+ $prototype =~ s/\)/\(void\)/;
+ }
+
+ # now delete all of the odd-number commas in $prototype
+ # so that arg types & arg names don't have a comma between them
+ my $count = 0;
+ my $len = length($prototype);
+ if ($void) {
+ $len = 0; # skip the for-loop
+ }
+ for (my $ix = 0; $ix < $len; $ix++) {
+ if (substr($prototype, $ix, 1) eq ',') {
+ $count++;
+ if ($count % 2 == 1) {
+ substr($prototype, $ix, 1) = ' ';
+ }
+ }
+ }
+}
+
+sub process_proto_function($$) {
+ my $x = shift;
+ my $file = shift;
+
+ $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line
+
+ if ($x =~ m#\s*/\*\s+MACDOC\s*#io || ($x =~ /^#/ && $x !~ /^#\s*define/)) {
+ # do nothing
+ }
+ elsif ($x =~ /([^\{]*)/) {
+ $prototype .= $1;
+ }
+
+ if (($x =~ /\{/) || ($x =~ /\#\s*define/) || ($x =~ /;/)) {
+ $prototype =~ s@/\*.*?\*/@@gos; # strip comments.
+ $prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
+ $prototype =~ s@^\s+@@gos; # strip leading spaces
+
+ # Handle prototypes for function pointers like:
+ # int (*pcs_config)(struct foo)
+ $prototype =~ s@^(\S+\s+)\(\s*\*(\S+)\)@$1$2@gos;
+
+ if ($prototype =~ /SYSCALL_DEFINE/) {
+ syscall_munge();
+ }
+ if ($prototype =~ /TRACE_EVENT/ || $prototype =~ /DEFINE_EVENT/ ||
+ $prototype =~ /DEFINE_SINGLE_EVENT/)
+ {
+ tracepoint_munge($file);
+ }
+ dump_function($prototype, $file);
+ reset_state();
+ }
+}
+
+sub process_proto_type($$) {
+ my $x = shift;
+ my $file = shift;
+
+ $x =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
+ $x =~ s@^\s+@@gos; # strip leading spaces
+ $x =~ s@\s+$@@gos; # strip trailing spaces
+ $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line
+
+ if ($x =~ /^#/) {
+ # To distinguish preprocessor directive from regular declaration later.
+ $x .= ";";
+ }
+
+ while (1) {
+ if ( $x =~ /([^\{\};]*)([\{\};])(.*)/ ) {
+ if( length $prototype ) {
+ $prototype .= " "
+ }
+ $prototype .= $1 . $2;
+ ($2 eq '{') && $brcount++;
+ ($2 eq '}') && $brcount--;
+ if (($2 eq ';') && ($brcount == 0)) {
+ dump_declaration($prototype, $file);
+ reset_state();
+ last;
+ }
+ $x = $3;
+ } else {
+ $prototype .= $x;
+ last;
+ }
+ }
+}
+
+
+sub map_filename($) {
+ my $file;
+ my ($orig_file) = @_;
+
+ if (defined($ENV{'SRCTREE'})) {
+ $file = "$ENV{'SRCTREE'}" . "/" . $orig_file;
+ } else {
+ $file = $orig_file;
+ }
+
+ if (defined($source_map{$file})) {
+ $file = $source_map{$file};
+ }
+
+ return $file;
+}
+
+sub process_export_file($) {
+ my ($orig_file) = @_;
+ my $file = map_filename($orig_file);
+
+ if (!open(IN,"<$file")) {
+ print STDERR "Error: Cannot open file $file\n";
+ ++$errors;
+ return;
+ }
+
+ while (<IN>) {
+ if (/$export_symbol/) {
+ next if (defined($nosymbol_table{$2}));
+ $function_table{$2} = 1;
+ }
+ }
+
+ close(IN);
+}
+
+#
+# Parsers for the various processing states.
+#
+# STATE_NORMAL: looking for the /** to begin everything.
+#
+sub process_normal() {
+ if (/$doc_start/o) {
+ $state = STATE_NAME; # next line is always the function name
+ $in_doc_sect = 0;
+ $declaration_start_line = $. + 1;
+ }
+}
+
+#
+# STATE_NAME: Looking for the "name - description" line
+#
+sub process_name($$) {
+ my $file = shift;
+ my $descr;
+
+ if (/$doc_block/o) {
+ $state = STATE_DOCBLOCK;
+ $contents = "";
+ $new_start_line = $.;
+
+ if ( $1 eq "" ) {
+ $section = $section_intro;
+ } else {
+ $section = $1;
+ }
+ } elsif (/$doc_decl/o) {
+ $identifier = $1;
+ my $is_kernel_comment = 0;
+ my $decl_start = qr{$doc_com};
+ # test for pointer declaration type, foo * bar() - desc
+ my $fn_type = qr{\w+\s*\*\s*};
+ my $parenthesis = qr{\(\w*\)};
+ my $decl_end = qr{[-:].*};
+ if (/^$decl_start([\w\s]+?)$parenthesis?\s*$decl_end?$/) {
+ $identifier = $1;
+ }
+ if ($identifier =~ m/^(struct|union|enum|typedef)\b\s*(\S*)/) {
+ $decl_type = $1;
+ $identifier = $2;
+ $is_kernel_comment = 1;
+ }
+ # Look for foo() or static void foo() - description; or misspelt
+ # identifier
+ elsif (/^$decl_start$fn_type?(\w+)\s*$parenthesis?\s*$decl_end?$/ ||
+ /^$decl_start$fn_type?(\w+.*)$parenthesis?\s*$decl_end$/) {
+ $identifier = $1;
+ $decl_type = 'function';
+ $identifier =~ s/^define\s+//;
+ $is_kernel_comment = 1;
+ }
+ $identifier =~ s/\s+$//;
+
+ $state = STATE_BODY;
+ # if there's no @param blocks need to set up default section
+ # here
+ $contents = "";
+ $section = $section_default;
+ $new_start_line = $. + 1;
+ if (/[-:](.*)/) {
+ # strip leading/trailing/multiple spaces
+ $descr= $1;
+ $descr =~ s/^\s*//;
+ $descr =~ s/\s*$//;
+ $descr =~ s/\s+/ /g;
+ $declaration_purpose = $descr;
+ $state = STATE_BODY_MAYBE;
+ } else {
+ $declaration_purpose = "";
+ }
+
+ if (!$is_kernel_comment) {
+ print STDERR "${file}:$.: warning: This comment starts with '/**', but isn't a kernel-doc comment. Refer Documentation/doc-guide/kernel-doc.rst\n";
+ print STDERR $_;
+ ++$warnings;
+ $state = STATE_NORMAL;
+ }
+
+ if (($declaration_purpose eq "") && $verbose) {
+ print STDERR "${file}:$.: warning: missing initial short description on line:\n";
+ print STDERR $_;
+ ++$warnings;
+ }
+
+ if ($identifier eq "" && $decl_type ne "enum") {
+ print STDERR "${file}:$.: warning: wrong kernel-doc identifier on line:\n";
+ print STDERR $_;
+ ++$warnings;
+ $state = STATE_NORMAL;
+ }
+
+ if ($verbose) {
+ print STDERR "${file}:$.: info: Scanning doc for $decl_type $identifier\n";
+ }
+ } else {
+ print STDERR "${file}:$.: warning: Cannot understand $_ on line $.",
+ " - I thought it was a doc line\n";
+ ++$warnings;
+ $state = STATE_NORMAL;
+ }
+}
+
+
+#
+# STATE_BODY and STATE_BODY_MAYBE: the bulk of a kerneldoc comment.
+#
+sub process_body($$) {
+ my $file = shift;
+
+ # Until all named variable macro parameters are
+ # documented using the bare name (`x`) rather than with
+ # dots (`x...`), strip the dots:
+ if ($section =~ /\w\.\.\.$/) {
+ $section =~ s/\.\.\.$//;
+
+ if ($verbose) {
+ print STDERR "${file}:$.: warning: Variable macro arguments should be documented without dots\n";
+ ++$warnings;
+ }
+ }
+
+ if ($state == STATE_BODY_WITH_BLANK_LINE && /^\s*\*\s?\S/) {
+ dump_section($file, $section, $contents);
+ $section = $section_default;
+ $new_start_line = $.;
+ $contents = "";
+ }
+
+ if (/$doc_sect/i) { # case insensitive for supported section names
+ $newsection = $1;
+ $newcontents = $2;
+
+ # map the supported section names to the canonical names
+ if ($newsection =~ m/^description$/i) {
+ $newsection = $section_default;
+ } elsif ($newsection =~ m/^context$/i) {
+ $newsection = $section_context;
+ } elsif ($newsection =~ m/^returns?$/i) {
+ $newsection = $section_return;
+ } elsif ($newsection =~ m/^\@return$/) {
+ # special: @return is a section, not a param description
+ $newsection = $section_return;
+ }
+
+ if (($contents ne "") && ($contents ne "\n")) {
+ if (!$in_doc_sect && $verbose) {
+ print STDERR "${file}:$.: warning: contents before sections\n";
+ ++$warnings;
+ }
+ dump_section($file, $section, $contents);
+ $section = $section_default;
+ }
+
+ $in_doc_sect = 1;
+ $state = STATE_BODY;
+ $contents = $newcontents;
+ $new_start_line = $.;
+ while (substr($contents, 0, 1) eq " ") {
+ $contents = substr($contents, 1);
+ }
+ if ($contents ne "") {
+ $contents .= "\n";
+ }
+ $section = $newsection;
+ $leading_space = undef;
+ } elsif (/$doc_end/) {
+ if (($contents ne "") && ($contents ne "\n")) {
+ dump_section($file, $section, $contents);
+ $section = $section_default;
+ $contents = "";
+ }
+ # look for doc_com + <text> + doc_end:
+ if ($_ =~ m'\s*\*\s*[a-zA-Z_0-9:\.]+\*/') {
+ print STDERR "${file}:$.: warning: suspicious ending line: $_";
+ ++$warnings;
+ }
+
+ $prototype = "";
+ $state = STATE_PROTO;
+ $brcount = 0;
+ $new_start_line = $. + 1;
+ } elsif (/$doc_content/) {
+ if ($1 eq "") {
+ if ($section eq $section_context) {
+ dump_section($file, $section, $contents);
+ $section = $section_default;
+ $contents = "";
+ $new_start_line = $.;
+ $state = STATE_BODY;
+ } else {
+ if ($section ne $section_default) {
+ $state = STATE_BODY_WITH_BLANK_LINE;
+ } else {
+ $state = STATE_BODY;
+ }
+ $contents .= "\n";
+ }
+ } elsif ($state == STATE_BODY_MAYBE) {
+ # Continued declaration purpose
+ chomp($declaration_purpose);
+ $declaration_purpose .= " " . $1;
+ $declaration_purpose =~ s/\s+/ /g;
+ } else {
+ my $cont = $1;
+ if ($section =~ m/^@/ || $section eq $section_context) {
+ if (!defined $leading_space) {
+ if ($cont =~ m/^(\s+)/) {
+ $leading_space = $1;
+ } else {
+ $leading_space = "";
+ }
+ }
+ $cont =~ s/^$leading_space//;
+ }
+ $contents .= $cont . "\n";
+ }
+ } else {
+ # i dont know - bad line? ignore.
+ print STDERR "${file}:$.: warning: bad line: $_";
+ ++$warnings;
+ }
+}
+
+
+#
+# STATE_PROTO: reading a function/whatever prototype.
+#
+sub process_proto($$) {
+ my $file = shift;
+
+ if (/$doc_inline_oneline/) {
+ $section = $1;
+ $contents = $2;
+ if ($contents ne "") {
+ $contents .= "\n";
+ dump_section($file, $section, $contents);
+ $section = $section_default;
+ $contents = "";
+ }
+ } elsif (/$doc_inline_start/) {
+ $state = STATE_INLINE;
+ $inline_doc_state = STATE_INLINE_NAME;
+ } elsif ($decl_type eq 'function') {
+ process_proto_function($_, $file);
+ } else {
+ process_proto_type($_, $file);
+ }
+}
+
+#
+# STATE_DOCBLOCK: within a DOC: block.
+#
+sub process_docblock($$) {
+ my $file = shift;
+
+ if (/$doc_end/) {
+ dump_doc_section($file, $section, $contents);
+ $section = $section_default;
+ $contents = "";
+ $function = "";
+ %parameterdescs = ();
+ %parametertypes = ();
+ @parameterlist = ();
+ %sections = ();
+ @sectionlist = ();
+ $prototype = "";
+ $state = STATE_NORMAL;
+ } elsif (/$doc_content/) {
+ if ( $1 eq "" ) {
+ $contents .= $blankline;
+ } else {
+ $contents .= $1 . "\n";
+ }
+ }
+}
+
+#
+# STATE_INLINE: docbook comments within a prototype.
+#
+sub process_inline($$) {
+ my $file = shift;
+
+ # First line (state 1) needs to be a @parameter
+ if ($inline_doc_state == STATE_INLINE_NAME && /$doc_inline_sect/o) {
+ $section = $1;
+ $contents = $2;
+ $new_start_line = $.;
+ if ($contents ne "") {
+ while (substr($contents, 0, 1) eq " ") {
+ $contents = substr($contents, 1);
+ }
+ $contents .= "\n";
+ }
+ $inline_doc_state = STATE_INLINE_TEXT;
+ # Documentation block end */
+ } elsif (/$doc_inline_end/) {
+ if (($contents ne "") && ($contents ne "\n")) {
+ dump_section($file, $section, $contents);
+ $section = $section_default;
+ $contents = "";
+ }
+ $state = STATE_PROTO;
+ $inline_doc_state = STATE_INLINE_NA;
+ # Regular text
+ } elsif (/$doc_content/) {
+ if ($inline_doc_state == STATE_INLINE_TEXT) {
+ $contents .= $1 . "\n";
+ # nuke leading blank lines
+ if ($contents =~ /^\s*$/) {
+ $contents = "";
+ }
+ } elsif ($inline_doc_state == STATE_INLINE_NAME) {
+ $inline_doc_state = STATE_INLINE_ERROR;
+ print STDERR "${file}:$.: warning: ";
+ print STDERR "Incorrect use of kernel-doc format: $_";
+ ++$warnings;
+ }
+ }
+}
+
+
+sub process_file($) {
+ my $file;
+ my $initial_section_counter = $section_counter;
+ my ($orig_file) = @_;
+
+ $file = map_filename($orig_file);
+
+ if (!open(IN_FILE,"<$file")) {
+ print STDERR "Error: Cannot open file $file\n";
+ ++$errors;
+ return;
+ }
+
+ $. = 1;
+
+ $section_counter = 0;
+ while (<IN_FILE>) {
+ while (s/\\\s*$//) {
+ $_ .= <IN_FILE>;
+ }
+ # Replace tabs by spaces
+ while ($_ =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e) {};
+ # Hand this line to the appropriate state handler
+ if ($state == STATE_NORMAL) {
+ process_normal();
+ } elsif ($state == STATE_NAME) {
+ process_name($file, $_);
+ } elsif ($state == STATE_BODY || $state == STATE_BODY_MAYBE ||
+ $state == STATE_BODY_WITH_BLANK_LINE) {
+ process_body($file, $_);
+ } elsif ($state == STATE_INLINE) { # scanning for inline parameters
+ process_inline($file, $_);
+ } elsif ($state == STATE_PROTO) {
+ process_proto($file, $_);
+ } elsif ($state == STATE_DOCBLOCK) {
+ process_docblock($file, $_);
+ }
+ }
+
+ # Make sure we got something interesting.
+ if ($initial_section_counter == $section_counter && $
+ output_mode ne "none") {
+ if ($output_selection == OUTPUT_INCLUDE) {
+ print STDERR "${file}:1: warning: '$_' not found\n"
+ for keys %function_table;
+ }
+ else {
+ print STDERR "${file}:1: warning: no structured comments found\n";
+ }
+ }
+ close IN_FILE;
+}
+
+
+if ($output_mode eq "rst") {
+ get_sphinx_version() if (!$sphinx_major);
+}
+
+$kernelversion = get_kernel_version();
+
+# generate a sequence of code that will splice in highlighting information
+# using the s// operator.
+for (my $k = 0; $k < @highlights; $k++) {
+ my $pattern = $highlights[$k][0];
+ my $result = $highlights[$k][1];
+# print STDERR "scanning pattern:$pattern, highlight:($result)\n";
+ $dohighlight .= "\$contents =~ s:$pattern:$result:gs;\n";
+}
+
+# Read the file that maps relative names to absolute names for
+# separate source and object directories and for shadow trees.
+if (open(SOURCE_MAP, "<.tmp_filelist.txt")) {
+ my ($relname, $absname);
+ while(<SOURCE_MAP>) {
+ chop();
+ ($relname, $absname) = (split())[0..1];
+ $relname =~ s:^/+::;
+ $source_map{$relname} = $absname;
+ }
+ close(SOURCE_MAP);
+}
+
+if ($output_selection == OUTPUT_EXPORTED ||
+ $output_selection == OUTPUT_INTERNAL) {
+
+ push(@export_file_list, @ARGV);
+
+ foreach (@export_file_list) {
+ chomp;
+ process_export_file($_);
+ }
+}
+
+foreach (@ARGV) {
+ chomp;
+ process_file($_);
+}
+if ($verbose && $errors) {
+ print STDERR "$errors errors\n";
+}
+if ($verbose && $warnings) {
+ print STDERR "$warnings warnings\n";
+}
+
+if ($Werror && $warnings) {
+ print STDERR "$warnings warnings as Errors\n";
+ exit($warnings);
+} else {
+ exit($output_mode eq "none" ? 0 : $errors)
+}
diff --git a/doc/kernel-doc-check b/doc/kernel-doc-check
new file mode 100644
index 0000000..23887d0
--- /dev/null
+++ b/doc/kernel-doc-check
@@ -0,0 +1,10 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+kernel_doc=$(dirname $0)/kernel-doc
+
+"$kernel_doc" -none "$@" 2>&1 |
+ grep '\(warning\|error\)'
+
+# check that kernel-doc succeeded, but the grep failed
+[ ${PIPESTATUS[0]} -eq 0 -a ${PIPESTATUS[1]} -eq 1 ]
diff --git a/doc/list-man-pages.sh b/doc/list-man-pages.sh
new file mode 100755
index 0000000..3acdf7a
--- /dev/null
+++ b/doc/list-man-pages.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+file=$1
+
+for func in $(sed -n 's/ \* \([a-z_][a-z_0-9]*\)() -.*/\1/p' $file); do
+ echo ${func}
+done
+
+for struct in $(sed -n 's/ \* struct \([a-z_][a-z_0-9]*\) -.*/\1/p' $file); do
+ echo ${struct}
+done
+
+for enum in $(sed -n 's/ \* enum \([a-z_][a-z_0-9]*\) -.*/\1/p' $file); do
+ echo ${enum}
+done
diff --git a/doc/list-pre-compiled.sh b/doc/list-pre-compiled.sh
new file mode 100755
index 0000000..c31caf9
--- /dev/null
+++ b/doc/list-pre-compiled.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+for i in man/*.2; do
+ echo $i
+done
diff --git a/doc/man/nvme_admin_opcode.2 b/doc/man/nvme_admin_opcode.2
new file mode 100644
index 0000000..26dfe5f
--- /dev/null
+++ b/doc/man/nvme_admin_opcode.2
@@ -0,0 +1,216 @@
+.TH "libnvme" 9 "enum nvme_admin_opcode" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_admin_opcode \- Known NVMe admin opcodes
+.SH SYNOPSIS
+enum nvme_admin_opcode {
+.br
+.BI " nvme_admin_delete_sq"
+,
+.br
+.br
+.BI " nvme_admin_create_sq"
+,
+.br
+.br
+.BI " nvme_admin_get_log_page"
+,
+.br
+.br
+.BI " nvme_admin_delete_cq"
+,
+.br
+.br
+.BI " nvme_admin_create_cq"
+,
+.br
+.br
+.BI " nvme_admin_identify"
+,
+.br
+.br
+.BI " nvme_admin_abort_cmd"
+,
+.br
+.br
+.BI " nvme_admin_set_features"
+,
+.br
+.br
+.BI " nvme_admin_get_features"
+,
+.br
+.br
+.BI " nvme_admin_async_event"
+,
+.br
+.br
+.BI " nvme_admin_ns_mgmt"
+,
+.br
+.br
+.BI " nvme_admin_fw_commit"
+,
+.br
+.br
+.BI " nvme_admin_fw_activate"
+,
+.br
+.br
+.BI " nvme_admin_fw_download"
+,
+.br
+.br
+.BI " nvme_admin_dev_self_test"
+,
+.br
+.br
+.BI " nvme_admin_ns_attach"
+,
+.br
+.br
+.BI " nvme_admin_keep_alive"
+,
+.br
+.br
+.BI " nvme_admin_directive_send"
+,
+.br
+.br
+.BI " nvme_admin_directive_recv"
+,
+.br
+.br
+.BI " nvme_admin_virtual_mgmt"
+,
+.br
+.br
+.BI " nvme_admin_nvme_mi_send"
+,
+.br
+.br
+.BI " nvme_admin_nvme_mi_recv"
+,
+.br
+.br
+.BI " nvme_admin_capacity_mgmt"
+,
+.br
+.br
+.BI " nvme_admin_discovery_info_mgmt"
+,
+.br
+.br
+.BI " nvme_admin_fabric_zoning_recv"
+,
+.br
+.br
+.BI " nvme_admin_lockdown"
+,
+.br
+.br
+.BI " nvme_admin_fabric_zoning_lookup"
+,
+.br
+.br
+.BI " nvme_admin_fabric_zoning_send"
+,
+.br
+.br
+.BI " nvme_admin_dbbuf"
+,
+.br
+.br
+.BI " nvme_admin_fabrics"
+,
+.br
+.br
+.BI " nvme_admin_format_nvm"
+,
+.br
+.br
+.BI " nvme_admin_security_send"
+,
+.br
+.br
+.BI " nvme_admin_security_recv"
+,
+.br
+.br
+.BI " nvme_admin_sanitize_nvm"
+,
+.br
+.br
+.BI " nvme_admin_get_lba_status"
+
+};
+.SH Constants
+.IP "nvme_admin_delete_sq" 12
+Delete I/O Submission Queue
+.IP "nvme_admin_create_sq" 12
+Create I/O Submission Queue
+.IP "nvme_admin_get_log_page" 12
+Get Log Page
+.IP "nvme_admin_delete_cq" 12
+Delete I/O Completion Queue
+.IP "nvme_admin_create_cq" 12
+Create I/O Completion Queue
+.IP "nvme_admin_identify" 12
+Identify
+.IP "nvme_admin_abort_cmd" 12
+Abort
+.IP "nvme_admin_set_features" 12
+Set Features
+.IP "nvme_admin_get_features" 12
+Get Features
+.IP "nvme_admin_async_event" 12
+Asynchronous Event Request
+.IP "nvme_admin_ns_mgmt" 12
+Namespace Management
+.IP "nvme_admin_fw_commit" 12
+Firmware Commit
+.IP "nvme_admin_fw_activate" 12
+Firmware Commit
+.IP "nvme_admin_fw_download" 12
+Firmware Image Download
+.IP "nvme_admin_dev_self_test" 12
+Device Self-test
+.IP "nvme_admin_ns_attach" 12
+Namespace Attachment
+.IP "nvme_admin_keep_alive" 12
+Keep Alive
+.IP "nvme_admin_directive_send" 12
+Directive Send
+.IP "nvme_admin_directive_recv" 12
+Directive Receive
+.IP "nvme_admin_virtual_mgmt" 12
+Virtualization Management
+.IP "nvme_admin_nvme_mi_send" 12
+NVMe-MI Send
+.IP "nvme_admin_nvme_mi_recv" 12
+NVMe-MI Receive
+.IP "nvme_admin_capacity_mgmt" 12
+Capacity Management
+.IP "nvme_admin_discovery_info_mgmt" 12
+Discovery Information Management (DIM)
+.IP "nvme_admin_fabric_zoning_recv" 12
+Fabric Zoning Receive
+.IP "nvme_admin_lockdown" 12
+Lockdown
+.IP "nvme_admin_fabric_zoning_lookup" 12
+Fabric Zoning Lookup
+.IP "nvme_admin_fabric_zoning_send" 12
+Fabric Zoning Send
+.IP "nvme_admin_dbbuf" 12
+Doorbell Buffer Config
+.IP "nvme_admin_fabrics" 12
+Fabrics Commands
+.IP "nvme_admin_format_nvm" 12
+Format NVM
+.IP "nvme_admin_security_send" 12
+Security Send
+.IP "nvme_admin_security_recv" 12
+Security Receive
+.IP "nvme_admin_sanitize_nvm" 12
+Sanitize
+.IP "nvme_admin_get_lba_status" 12
+Get LBA Status
diff --git a/doc/man/nvme_admin_passthru.2 b/doc/man/nvme_admin_passthru.2
new file mode 100644
index 0000000..eebc5f1
--- /dev/null
+++ b/doc/man/nvme_admin_passthru.2
@@ -0,0 +1,71 @@
+.TH "nvme_admin_passthru" 9 "nvme_admin_passthru" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_admin_passthru \- Submit an nvme passthrough command
+.SH SYNOPSIS
+.B "int" nvme_admin_passthru
+.BI "(int fd " ","
+.BI "__u8 opcode " ","
+.BI "__u8 flags " ","
+.BI "__u16 rsvd " ","
+.BI "__u32 nsid " ","
+.BI "__u32 cdw2 " ","
+.BI "__u32 cdw3 " ","
+.BI "__u32 cdw10 " ","
+.BI "__u32 cdw11 " ","
+.BI "__u32 cdw12 " ","
+.BI "__u32 cdw13 " ","
+.BI "__u32 cdw14 " ","
+.BI "__u32 cdw15 " ","
+.BI "__u32 data_len " ","
+.BI "void *data " ","
+.BI "__u32 metadata_len " ","
+.BI "void *metadata " ","
+.BI "__u32 timeout_ms " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "opcode" 12
+The nvme io command to send
+.IP "flags" 12
+NVMe command flags (not used)
+.IP "rsvd" 12
+Reserved for future use
+.IP "nsid" 12
+Namespace identifier
+.IP "cdw2" 12
+Command dword 2
+.IP "cdw3" 12
+Command dword 3
+.IP "cdw10" 12
+Command dword 10
+.IP "cdw11" 12
+Command dword 11
+.IP "cdw12" 12
+Command dword 12
+.IP "cdw13" 12
+Command dword 13
+.IP "cdw14" 12
+Command dword 14
+.IP "cdw15" 12
+Command dword 15
+.IP "data_len" 12
+Length of the data transferred in this command in bytes
+.IP "data" 12
+Pointer to user address of the data buffer
+.IP "metadata_len" 12
+Length of metadata transferred in this command
+.IP "metadata" 12
+Pointer to user address of the metadata buffer
+.IP "timeout_ms" 12
+How long the kernel waits for the command to complete
+.IP "result" 12
+Optional field to return the result from the CQE dword 0
+.SH "DESCRIPTION"
+Parameterized form of \fBnvme_submit_admin_passthru\fP. This sets up and
+submits a \fIstruct nvme_passthru_cmd\fP.
+
+Known values for \fIopcode\fP are defined in \fIenum nvme_admin_opcode\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_admin_passthru64.2 b/doc/man/nvme_admin_passthru64.2
new file mode 100644
index 0000000..50a2091
--- /dev/null
+++ b/doc/man/nvme_admin_passthru64.2
@@ -0,0 +1,71 @@
+.TH "nvme_admin_passthru64" 9 "nvme_admin_passthru64" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_admin_passthru64 \- Submit a 64-bit nvme passthrough command
+.SH SYNOPSIS
+.B "int" nvme_admin_passthru64
+.BI "(int fd " ","
+.BI "__u8 opcode " ","
+.BI "__u8 flags " ","
+.BI "__u16 rsvd " ","
+.BI "__u32 nsid " ","
+.BI "__u32 cdw2 " ","
+.BI "__u32 cdw3 " ","
+.BI "__u32 cdw10 " ","
+.BI "__u32 cdw11 " ","
+.BI "__u32 cdw12 " ","
+.BI "__u32 cdw13 " ","
+.BI "__u32 cdw14 " ","
+.BI "__u32 cdw15 " ","
+.BI "__u32 data_len " ","
+.BI "void *data " ","
+.BI "__u32 metadata_len " ","
+.BI "void *metadata " ","
+.BI "__u32 timeout_ms " ","
+.BI "__u64 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "opcode" 12
+The nvme io command to send
+.IP "flags" 12
+NVMe command flags (not used)
+.IP "rsvd" 12
+Reserved for future use
+.IP "nsid" 12
+Namespace identifier
+.IP "cdw2" 12
+Command dword 2
+.IP "cdw3" 12
+Command dword 3
+.IP "cdw10" 12
+Command dword 10
+.IP "cdw11" 12
+Command dword 11
+.IP "cdw12" 12
+Command dword 12
+.IP "cdw13" 12
+Command dword 13
+.IP "cdw14" 12
+Command dword 14
+.IP "cdw15" 12
+Command dword 15
+.IP "data_len" 12
+Length of the data transferred in this command in bytes
+.IP "data" 12
+Pointer to user address of the data buffer
+.IP "metadata_len" 12
+Length of metadata transferred in this command
+.IP "metadata" 12
+Pointer to user address of the metadata buffer
+.IP "timeout_ms" 12
+How long the kernel waits for the command to complete
+.IP "result" 12
+Optional field to return the result from the CQE dword 0
+.SH "DESCRIPTION"
+Parameterized form of \fBnvme_submit_admin_passthru64\fP. This sets up and
+submits a \fIstruct nvme_passthru_cmd64\fP.
+
+Known values for \fIopcode\fP are defined in \fIenum nvme_admin_opcode\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_ae_info_css_nvm.2 b/doc/man/nvme_ae_info_css_nvm.2
new file mode 100644
index 0000000..08db970
--- /dev/null
+++ b/doc/man/nvme_ae_info_css_nvm.2
@@ -0,0 +1,25 @@
+.TH "libnvme" 9 "enum nvme_ae_info_css_nvm" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_ae_info_css_nvm \- Asynchronous Event Information - I/O Command Specific Status
+.SH SYNOPSIS
+enum nvme_ae_info_css_nvm {
+.br
+.BI " NVME_AER_CSS_NVM_RESERVATION"
+,
+.br
+.br
+.BI " NVME_AER_CSS_NVM_SANITIZE_COMPLETED"
+,
+.br
+.br
+.BI " NVME_AER_CSS_NVM_UNEXPECTED_SANITIZE_DEALLOC"
+
+};
+.SH Constants
+.IP "NVME_AER_CSS_NVM_RESERVATION" 12
+Reservation Log Page Available
+.IP "NVME_AER_CSS_NVM_SANITIZE_COMPLETED" 12
+Sanitize Operation Completed
+.IP "NVME_AER_CSS_NVM_UNEXPECTED_SANITIZE_DEALLOC" 12
+Sanitize Operation Completed
+With Unexpected Deallocation
diff --git a/doc/man/nvme_ae_info_error.2 b/doc/man/nvme_ae_info_error.2
new file mode 100644
index 0000000..dc7e35a
--- /dev/null
+++ b/doc/man/nvme_ae_info_error.2
@@ -0,0 +1,42 @@
+.TH "libnvme" 9 "enum nvme_ae_info_error" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_ae_info_error \- Asynchronous Event Information - Error Status
+.SH SYNOPSIS
+enum nvme_ae_info_error {
+.br
+.BI " NVME_AER_ERROR_INVALID_DB_REG"
+,
+.br
+.br
+.BI " NVME_AER_ERROR_INVALID_DB_VAL"
+,
+.br
+.br
+.BI " NVME_AER_ERROR_DIAG_FAILURE"
+,
+.br
+.br
+.BI " NVME_AER_ERROR_PERSISTENT_INTERNAL_ERROR"
+,
+.br
+.br
+.BI " NVME_AER_ERROR_TRANSIENT_INTERNAL_ERROR"
+,
+.br
+.br
+.BI " NVME_AER_ERROR_FW_IMAGE_LOAD_ERROR"
+
+};
+.SH Constants
+.IP "NVME_AER_ERROR_INVALID_DB_REG" 12
+Write to Invalid Doorbell Register
+.IP "NVME_AER_ERROR_INVALID_DB_VAL" 12
+Invalid Doorbell Write Value
+.IP "NVME_AER_ERROR_DIAG_FAILURE" 12
+Diagnostic Failure
+.IP "NVME_AER_ERROR_PERSISTENT_INTERNAL_ERROR" 12
+Persistent Internal Error
+.IP "NVME_AER_ERROR_TRANSIENT_INTERNAL_ERROR" 12
+Transient Internal Error
+.IP "NVME_AER_ERROR_FW_IMAGE_LOAD_ERROR" 12
+Firmware Image Load Error
diff --git a/doc/man/nvme_ae_info_notice.2 b/doc/man/nvme_ae_info_notice.2
new file mode 100644
index 0000000..ed4b176
--- /dev/null
+++ b/doc/man/nvme_ae_info_notice.2
@@ -0,0 +1,54 @@
+.TH "libnvme" 9 "enum nvme_ae_info_notice" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_ae_info_notice \- Asynchronous Event Information - Notice
+.SH SYNOPSIS
+enum nvme_ae_info_notice {
+.br
+.BI " NVME_AER_NOTICE_NS_CHANGED"
+,
+.br
+.br
+.BI " NVME_AER_NOTICE_FW_ACT_STARTING"
+,
+.br
+.br
+.BI " NVME_AER_NOTICE_TELEMETRY"
+,
+.br
+.br
+.BI " NVME_AER_NOTICE_ANA"
+,
+.br
+.br
+.BI " NVME_AER_NOTICE_PL_EVENT"
+,
+.br
+.br
+.BI " NVME_AER_NOTICE_LBA_STATUS_ALERT"
+,
+.br
+.br
+.BI " NVME_AER_NOTICE_EG_EVENT"
+,
+.br
+.br
+.BI " NVME_AER_NOTICE_DISC_CHANGED"
+
+};
+.SH Constants
+.IP "NVME_AER_NOTICE_NS_CHANGED" 12
+Namespace Attribute Changed
+.IP "NVME_AER_NOTICE_FW_ACT_STARTING" 12
+Firmware Activation Starting
+.IP "NVME_AER_NOTICE_TELEMETRY" 12
+Telemetry Log Changed
+.IP "NVME_AER_NOTICE_ANA" 12
+Asymmetric Namespace Access Change
+.IP "NVME_AER_NOTICE_PL_EVENT" 12
+Predictable Latency Event Aggregate Log Change
+.IP "NVME_AER_NOTICE_LBA_STATUS_ALERT" 12
+LBA Status Information Alert
+.IP "NVME_AER_NOTICE_EG_EVENT" 12
+Endurance Group Event Aggregate Log Page Change
+.IP "NVME_AER_NOTICE_DISC_CHANGED" 12
+Discovery Log Page Change
diff --git a/doc/man/nvme_ae_info_smart.2 b/doc/man/nvme_ae_info_smart.2
new file mode 100644
index 0000000..edbab31
--- /dev/null
+++ b/doc/man/nvme_ae_info_smart.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "enum nvme_ae_info_smart" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_ae_info_smart \- Asynchronous Event Information - SMART / Health Status
+.SH SYNOPSIS
+enum nvme_ae_info_smart {
+.br
+.BI " NVME_AER_SMART_SUBSYSTEM_RELIABILITY"
+,
+.br
+.br
+.BI " NVME_AER_SMART_TEMPERATURE_THRESHOLD"
+,
+.br
+.br
+.BI " NVME_AER_SMART_SPARE_THRESHOLD"
+
+};
+.SH Constants
+.IP "NVME_AER_SMART_SUBSYSTEM_RELIABILITY" 12
+NVM subsystem Reliability
+.IP "NVME_AER_SMART_TEMPERATURE_THRESHOLD" 12
+Temperature Threshold
+.IP "NVME_AER_SMART_SPARE_THRESHOLD" 12
+Spare Below Threshold
diff --git a/doc/man/nvme_ae_type.2 b/doc/man/nvme_ae_type.2
new file mode 100644
index 0000000..e0e99a2
--- /dev/null
+++ b/doc/man/nvme_ae_type.2
@@ -0,0 +1,36 @@
+.TH "libnvme" 9 "enum nvme_ae_type" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_ae_type \- Asynchronous Event Type
+.SH SYNOPSIS
+enum nvme_ae_type {
+.br
+.BI " NVME_AER_ERROR"
+,
+.br
+.br
+.BI " NVME_AER_SMART"
+,
+.br
+.br
+.BI " NVME_AER_NOTICE"
+,
+.br
+.br
+.BI " NVME_AER_CSS"
+,
+.br
+.br
+.BI " NVME_AER_VS"
+
+};
+.SH Constants
+.IP "NVME_AER_ERROR" 12
+Error event
+.IP "NVME_AER_SMART" 12
+SMART / Health Status event
+.IP "NVME_AER_NOTICE" 12
+Notice event
+.IP "NVME_AER_CSS" 12
+NVM Command Set Specific events
+.IP "NVME_AER_VS" 12
+Vendor Specific event
diff --git a/doc/man/nvme_aggregate_endurance_group_event.2 b/doc/man/nvme_aggregate_endurance_group_event.2
new file mode 100644
index 0000000..d52d339
--- /dev/null
+++ b/doc/man/nvme_aggregate_endurance_group_event.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_aggregate_endurance_group_event" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_aggregate_endurance_group_event \- Endurance Group Event Aggregate
+.SH SYNOPSIS
+struct nvme_aggregate_endurance_group_event {
+.br
+.BI " __le64 num_entries;"
+.br
+.BI " __le16 entries[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "num_entries" 12
+Number or entries
+.IP "entries" 12
+List of entries
diff --git a/doc/man/nvme_aggregate_predictable_lat_event.2 b/doc/man/nvme_aggregate_predictable_lat_event.2
new file mode 100644
index 0000000..a673c7c
--- /dev/null
+++ b/doc/man/nvme_aggregate_predictable_lat_event.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_aggregate_predictable_lat_event" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_aggregate_predictable_lat_event \- Predictable Latency Event Aggregate Log Page
+.SH SYNOPSIS
+struct nvme_aggregate_predictable_lat_event {
+.br
+.BI " __le64 num_entries;"
+.br
+.BI " __le16 entries[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "num_entries" 12
+Number of entries
+.IP "entries" 12
+Entry list
diff --git a/doc/man/nvme_ana_group_desc.2 b/doc/man/nvme_ana_group_desc.2
new file mode 100644
index 0000000..67e025f
--- /dev/null
+++ b/doc/man/nvme_ana_group_desc.2
@@ -0,0 +1,35 @@
+.TH "libnvme" 9 "struct nvme_ana_group_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_ana_group_desc \- ANA Group Descriptor
+.SH SYNOPSIS
+struct nvme_ana_group_desc {
+.br
+.BI " __le32 grpid;"
+.br
+.BI " __le32 nnsids;"
+.br
+.BI " __le64 chgcnt;"
+.br
+.BI " __u8 state;"
+.br
+.BI " __u8 rsvd17[15];"
+.br
+.BI " __le32 nsids[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "grpid" 12
+ANA group id
+.IP "nnsids" 12
+Number of namespaces in \fInsids\fP
+.IP "chgcnt" 12
+Change counter
+.IP "state" 12
+ANA state
+.IP "rsvd17" 12
+Reserved
+.IP "nsids" 12
+List of namespaces
diff --git a/doc/man/nvme_ana_log.2 b/doc/man/nvme_ana_log.2
new file mode 100644
index 0000000..3bb09e1
--- /dev/null
+++ b/doc/man/nvme_ana_log.2
@@ -0,0 +1,27 @@
+.TH "libnvme" 9 "struct nvme_ana_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_ana_log \- Asymmetric Namespace Access Log
+.SH SYNOPSIS
+struct nvme_ana_log {
+.br
+.BI " __le64 chgcnt;"
+.br
+.BI " __le16 ngrps;"
+.br
+.BI " __u8 rsvd10[6];"
+.br
+.BI " struct nvme_ana_group_desc descs[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "chgcnt" 12
+Change Count
+.IP "ngrps" 12
+Number of ANA Group Descriptors
+.IP "rsvd10" 12
+Reserved
+.IP "descs" 12
+ANA Group Descriptor
diff --git a/doc/man/nvme_ana_state.2 b/doc/man/nvme_ana_state.2
new file mode 100644
index 0000000..a1a6e2c
--- /dev/null
+++ b/doc/man/nvme_ana_state.2
@@ -0,0 +1,36 @@
+.TH "libnvme" 9 "enum nvme_ana_state" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_ana_state \- ANA Group Descriptor - Asymmetric Namespace Access State
+.SH SYNOPSIS
+enum nvme_ana_state {
+.br
+.BI " NVME_ANA_STATE_OPTIMIZED"
+,
+.br
+.br
+.BI " NVME_ANA_STATE_NONOPTIMIZED"
+,
+.br
+.br
+.BI " NVME_ANA_STATE_INACCESSIBLE"
+,
+.br
+.br
+.BI " NVME_ANA_STATE_PERSISTENT_LOSS"
+,
+.br
+.br
+.BI " NVME_ANA_STATE_CHANGE"
+
+};
+.SH Constants
+.IP "NVME_ANA_STATE_OPTIMIZED" 12
+ANA Optimized state
+.IP "NVME_ANA_STATE_NONOPTIMIZED" 12
+ANA Non-Optimized state
+.IP "NVME_ANA_STATE_INACCESSIBLE" 12
+ANA Inaccessible state
+.IP "NVME_ANA_STATE_PERSISTENT_LOSS" 12
+ANA Persistent Loss state
+.IP "NVME_ANA_STATE_CHANGE" 12
+ANA Change state
diff --git a/doc/man/nvme_apst_entry.2 b/doc/man/nvme_apst_entry.2
new file mode 100644
index 0000000..6df81f5
--- /dev/null
+++ b/doc/man/nvme_apst_entry.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvme_apst_entry" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_apst_entry \- Autonomous Power State Transition
+.SH SYNOPSIS
+enum nvme_apst_entry {
+.br
+.BI " NVME_APST_ENTRY_ITPS_SHIFT"
+,
+.br
+.br
+.BI " NVME_APST_ENTRY_ITPT_SHIFT"
+,
+.br
+.br
+.BI " NVME_APST_ENTRY_ITPS_MASK"
+,
+.br
+.br
+.BI " NVME_APST_ENTRY_ITPT_MASK"
+
+};
+.SH Constants
+.IP "NVME_APST_ENTRY_ITPS_SHIFT" 12
+Idle Transition Power State Shift
+.IP "NVME_APST_ENTRY_ITPT_SHIFT" 12
+Idle Time Prior to Transition Shift
+.IP "NVME_APST_ENTRY_ITPS_MASK" 12
+Idle Transition Power State Mask
+.IP "NVME_APST_ENTRY_ITPT_MASK" 12
+Idle Time Prior to Transition Mask
diff --git a/doc/man/nvme_boot_partition.2 b/doc/man/nvme_boot_partition.2
new file mode 100644
index 0000000..20539dd
--- /dev/null
+++ b/doc/man/nvme_boot_partition.2
@@ -0,0 +1,32 @@
+.TH "libnvme" 9 "struct nvme_boot_partition" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_boot_partition \- Boot Partition Log
+.SH SYNOPSIS
+struct nvme_boot_partition {
+.br
+.BI " __u8 lid;"
+.br
+.BI " __u8 rsvd1[3];"
+.br
+.BI " __le32 bpinfo;"
+.br
+.BI " __u8 rsvd8[8];"
+.br
+.BI " __u8 boot_partition_data[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "lid" 12
+Boot Partition Identifier
+.IP "rsvd1" 12
+Reserved
+.IP "bpinfo" 12
+Boot Partition Information
+.IP "rsvd8" 12
+Reserved
+.IP "boot_partition_data" 12
+Contains the contents of the
+specified Boot Partition
diff --git a/doc/man/nvme_capacity_config_desc.2 b/doc/man/nvme_capacity_config_desc.2
new file mode 100644
index 0000000..911ae67
--- /dev/null
+++ b/doc/man/nvme_capacity_config_desc.2
@@ -0,0 +1,33 @@
+.TH "libnvme" 9 "struct nvme_capacity_config_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_capacity_config_desc \- Capacity Configuration structure definitions
+.SH SYNOPSIS
+struct nvme_capacity_config_desc {
+.br
+.BI " __le16 cap_config_id;"
+.br
+.BI " __le16 domainid;"
+.br
+.BI " __le16 egcn;"
+.br
+.BI " __u8 rsvd6[26];"
+.br
+.BI " struct nvme_end_grp_config_desc egcd[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "cap_config_id" 12
+Capacity Configuration Identifier
+.IP "domainid" 12
+Domain Identifier
+.IP "egcn" 12
+Number Endurance Group Configuration
+Descriptors
+.IP "rsvd6" 12
+Reserved
+.IP "egcd" 12
+Endurance Group Config descriptors.
+See \fIstruct\fP nvme_end_grp_config_desc
diff --git a/doc/man/nvme_capacity_mgmt.2 b/doc/man/nvme_capacity_mgmt.2
new file mode 100644
index 0000000..6ab8d90
--- /dev/null
+++ b/doc/man/nvme_capacity_mgmt.2
@@ -0,0 +1,12 @@
+.TH "nvme_capacity_mgmt" 9 "nvme_capacity_mgmt" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_capacity_mgmt \- Capacity management command
+.SH SYNOPSIS
+.B "int" nvme_capacity_mgmt
+.BI "(struct nvme_capacity_mgmt_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_capacity_mgmt_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_change_ns_event.2 b/doc/man/nvme_change_ns_event.2
new file mode 100644
index 0000000..5661822
--- /dev/null
+++ b/doc/man/nvme_change_ns_event.2
@@ -0,0 +1,63 @@
+.TH "libnvme" 9 "struct nvme_change_ns_event" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_change_ns_event \- Change Namespace Event Data
+.SH SYNOPSIS
+struct nvme_change_ns_event {
+.br
+.BI " __le32 nsmgt_cdw10;"
+.br
+.BI " __u8 rsvd4[4];"
+.br
+.BI " __le64 nsze;"
+.br
+.BI " __u8 rsvd16[8];"
+.br
+.BI " __le64 nscap;"
+.br
+.BI " __u8 flbas;"
+.br
+.BI " __u8 dps;"
+.br
+.BI " __u8 nmic;"
+.br
+.BI " __u8 rsvd35;"
+.br
+.BI " __le32 ana_grp_id;"
+.br
+.BI " __le16 nvmset_id;"
+.br
+.BI " __le16 rsvd42;"
+.br
+.BI " __le32 nsid;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nsmgt_cdw10" 12
+Namespace Management CDW10
+.IP "rsvd4" 12
+Reserved
+.IP "nsze" 12
+Namespace Size
+.IP "rsvd16" 12
+Reserved
+.IP "nscap" 12
+Namespace Capacity
+.IP "flbas" 12
+Formatted LBA Size
+.IP "dps" 12
+End-to-end Data Protection Type Settings
+.IP "nmic" 12
+Namespace Multi-path I/O and Namespace Sharing Capabilities
+.IP "rsvd35" 12
+Reserved
+.IP "ana_grp_id" 12
+ANA Group Identifier
+.IP "nvmset_id" 12
+NVM Set Identifier
+.IP "rsvd42" 12
+Reserved
+.IP "nsid" 12
+Namespace ID
diff --git a/doc/man/nvme_channel_config_desc.2 b/doc/man/nvme_channel_config_desc.2
new file mode 100644
index 0000000..59110f7
--- /dev/null
+++ b/doc/man/nvme_channel_config_desc.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "struct nvme_channel_config_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_channel_config_desc \- Channel Configuration Descriptor
+.SH SYNOPSIS
+struct nvme_channel_config_desc {
+.br
+.BI " __le16 chanid;"
+.br
+.BI " __le16 chmus;"
+.br
+.BI " struct nvme_media_unit_config_desc mu_config_desc[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "chanid" 12
+Channel Identifier
+.IP "chmus" 12
+Number Channel Media Units
+.IP "mu_config_desc" 12
+Channel Unit config descriptors.
+See \fIstruct\fP nvme_media_unit_config_desc
diff --git a/doc/man/nvme_cmb_size.2 b/doc/man/nvme_cmb_size.2
new file mode 100644
index 0000000..86e6417
--- /dev/null
+++ b/doc/man/nvme_cmb_size.2
@@ -0,0 +1,11 @@
+.TH "nvme_cmb_size" 9 "nvme_cmb_size" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_cmb_size \- Calculate size of the controller memory buffer
+.SH SYNOPSIS
+.B "__u64" nvme_cmb_size
+.BI "(__u32 cmbsz " ");"
+.SH ARGUMENTS
+.IP "cmbsz" 12
+Value from controller register NVME_REG_CMBSZ
+.SH "RETURN"
+size of controller memory buffer in bytes
diff --git a/doc/man/nvme_cmd_effects.2 b/doc/man/nvme_cmd_effects.2
new file mode 100644
index 0000000..1e05986
--- /dev/null
+++ b/doc/man/nvme_cmd_effects.2
@@ -0,0 +1,48 @@
+.TH "libnvme" 9 "enum nvme_cmd_effects" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_cmd_effects \- Commands Supported and Effects
+.SH SYNOPSIS
+enum nvme_cmd_effects {
+.br
+.BI " NVME_CMD_EFFECTS_CSUPP"
+,
+.br
+.br
+.BI " NVME_CMD_EFFECTS_LBCC"
+,
+.br
+.br
+.BI " NVME_CMD_EFFECTS_NCC"
+,
+.br
+.br
+.BI " NVME_CMD_EFFECTS_NIC"
+,
+.br
+.br
+.BI " NVME_CMD_EFFECTS_CCC"
+,
+.br
+.br
+.BI " NVME_CMD_EFFECTS_CSE_MASK"
+,
+.br
+.br
+.BI " NVME_CMD_EFFECTS_UUID_SEL"
+
+};
+.SH Constants
+.IP "NVME_CMD_EFFECTS_CSUPP" 12
+Command Supported
+.IP "NVME_CMD_EFFECTS_LBCC" 12
+Logical Block Content Change
+.IP "NVME_CMD_EFFECTS_NCC" 12
+Namespace Capability Change
+.IP "NVME_CMD_EFFECTS_NIC" 12
+Namespace Inventory Change
+.IP "NVME_CMD_EFFECTS_CCC" 12
+Controller Capability Change
+.IP "NVME_CMD_EFFECTS_CSE_MASK" 12
+Command Submission and Execution
+.IP "NVME_CMD_EFFECTS_UUID_SEL" 12
+UUID Selection Supported
diff --git a/doc/man/nvme_cmd_effects_log.2 b/doc/man/nvme_cmd_effects_log.2
new file mode 100644
index 0000000..453098c
--- /dev/null
+++ b/doc/man/nvme_cmd_effects_log.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_cmd_effects_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_cmd_effects_log \- Commands Supported and Effects Log
+.SH SYNOPSIS
+struct nvme_cmd_effects_log {
+.br
+.BI " __le32 acs[256];"
+.br
+.BI " __le32 iocs[256];"
+.br
+.BI " __u8 rsvd[2048];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "acs" 12
+Admin Command Supported
+.IP "iocs" 12
+I/O Command Supported
+.IP "rsvd" 12
+Reserved
diff --git a/doc/man/nvme_cmd_format_mset.2 b/doc/man/nvme_cmd_format_mset.2
new file mode 100644
index 0000000..bd8f952
--- /dev/null
+++ b/doc/man/nvme_cmd_format_mset.2
@@ -0,0 +1,20 @@
+.TH "libnvme" 9 "enum nvme_cmd_format_mset" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_cmd_format_mset \- Format NVM - Metadata Settings
+.SH SYNOPSIS
+enum nvme_cmd_format_mset {
+.br
+.BI " NVME_FORMAT_MSET_SEPARATE"
+,
+.br
+.br
+.BI " NVME_FORMAT_MSET_EXTENDED"
+
+};
+.SH Constants
+.IP "NVME_FORMAT_MSET_SEPARATE" 12
+indicates that the metadata is transferred
+as part of a separate buffer.
+.IP "NVME_FORMAT_MSET_EXTENDED" 12
+indicates that the metadata is transferred
+as part of an extended data LBA.
diff --git a/doc/man/nvme_cmd_format_pi.2 b/doc/man/nvme_cmd_format_pi.2
new file mode 100644
index 0000000..d5fb1da
--- /dev/null
+++ b/doc/man/nvme_cmd_format_pi.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvme_cmd_format_pi" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_cmd_format_pi \- Format NVM - Protection Information
+.SH SYNOPSIS
+enum nvme_cmd_format_pi {
+.br
+.BI " NVME_FORMAT_PI_DISABLE"
+,
+.br
+.br
+.BI " NVME_FORMAT_PI_TYPE1"
+,
+.br
+.br
+.BI " NVME_FORMAT_PI_TYPE2"
+,
+.br
+.br
+.BI " NVME_FORMAT_PI_TYPE3"
+
+};
+.SH Constants
+.IP "NVME_FORMAT_PI_DISABLE" 12
+Protection information is not enabled.
+.IP "NVME_FORMAT_PI_TYPE1" 12
+Protection information is enabled, Type 1.
+.IP "NVME_FORMAT_PI_TYPE2" 12
+Protection information is enabled, Type 2.
+.IP "NVME_FORMAT_PI_TYPE3" 12
+Protection information is enabled, Type 3.
diff --git a/doc/man/nvme_cmd_format_pil.2 b/doc/man/nvme_cmd_format_pil.2
new file mode 100644
index 0000000..17d3553
--- /dev/null
+++ b/doc/man/nvme_cmd_format_pil.2
@@ -0,0 +1,20 @@
+.TH "libnvme" 9 "enum nvme_cmd_format_pil" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_cmd_format_pil \- Format NVM - Protection Information Location
+.SH SYNOPSIS
+enum nvme_cmd_format_pil {
+.br
+.BI " NVME_FORMAT_PIL_LAST"
+,
+.br
+.br
+.BI " NVME_FORMAT_PIL_FIRST"
+
+};
+.SH Constants
+.IP "NVME_FORMAT_PIL_LAST" 12
+Protection information is transferred as the last
+bytes of metadata.
+.IP "NVME_FORMAT_PIL_FIRST" 12
+Protection information is transferred as the first
+bytes of metadata.
diff --git a/doc/man/nvme_cmd_format_ses.2 b/doc/man/nvme_cmd_format_ses.2
new file mode 100644
index 0000000..6374138
--- /dev/null
+++ b/doc/man/nvme_cmd_format_ses.2
@@ -0,0 +1,33 @@
+.TH "libnvme" 9 "enum nvme_cmd_format_ses" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_cmd_format_ses \- Format NVM - Secure Erase Settings
+.SH SYNOPSIS
+enum nvme_cmd_format_ses {
+.br
+.BI " NVME_FORMAT_SES_NONE"
+,
+.br
+.br
+.BI " NVME_FORMAT_SES_USER_DATA_ERASE"
+,
+.br
+.br
+.BI " NVME_FORMAT_SES_CRYPTO_ERASE"
+
+};
+.SH Constants
+.IP "NVME_FORMAT_SES_NONE" 12
+No secure erase operation requested.
+.IP "NVME_FORMAT_SES_USER_DATA_ERASE" 12
+User Data Erase: All user data shall be erased,
+contents of the user data after the erase is
+indeterminate (e.g. the user data may be zero
+filled, one filled, etc.). If a User Data Erase
+is requested and all affected user data is
+encrypted, then the controller is allowed
+to use a cryptographic erase to perform
+the requested User Data Erase.
+.IP "NVME_FORMAT_SES_CRYPTO_ERASE" 12
+Cryptographic Erase: All user data shall
+be erased cryptographically. This is
+accomplished by deleting the encryption key.
diff --git a/doc/man/nvme_cmd_get_log_lid.2 b/doc/man/nvme_cmd_get_log_lid.2
new file mode 100644
index 0000000..130d0ab
--- /dev/null
+++ b/doc/man/nvme_cmd_get_log_lid.2
@@ -0,0 +1,180 @@
+.TH "libnvme" 9 "enum nvme_cmd_get_log_lid" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_cmd_get_log_lid \- Get Log Page -Log Page Identifiers
+.SH SYNOPSIS
+enum nvme_cmd_get_log_lid {
+.br
+.BI " NVME_LOG_LID_SUPPORTED_LOG_PAGES"
+,
+.br
+.br
+.BI " NVME_LOG_LID_ERROR"
+,
+.br
+.br
+.BI " NVME_LOG_LID_SMART"
+,
+.br
+.br
+.BI " NVME_LOG_LID_FW_SLOT"
+,
+.br
+.br
+.BI " NVME_LOG_LID_CHANGED_NS"
+,
+.br
+.br
+.BI " NVME_LOG_LID_CMD_EFFECTS"
+,
+.br
+.br
+.BI " NVME_LOG_LID_DEVICE_SELF_TEST"
+,
+.br
+.br
+.BI " NVME_LOG_LID_TELEMETRY_HOST"
+,
+.br
+.br
+.BI " NVME_LOG_LID_TELEMETRY_CTRL"
+,
+.br
+.br
+.BI " NVME_LOG_LID_ENDURANCE_GROUP"
+,
+.br
+.br
+.BI " NVME_LOG_LID_PREDICTABLE_LAT_NVMSET"
+,
+.br
+.br
+.BI " NVME_LOG_LID_PREDICTABLE_LAT_AGG"
+,
+.br
+.br
+.BI " NVME_LOG_LID_ANA"
+,
+.br
+.br
+.BI " NVME_LOG_LID_PERSISTENT_EVENT"
+,
+.br
+.br
+.BI " NVME_LOG_LID_LBA_STATUS"
+,
+.br
+.br
+.BI " NVME_LOG_LID_ENDURANCE_GRP_EVT"
+,
+.br
+.br
+.BI " NVME_LOG_LID_MEDIA_UNIT_STATUS"
+,
+.br
+.br
+.BI " NVME_LOG_LID_SUPPORTED_CAP_CONFIG_LIST"
+,
+.br
+.br
+.BI " NVME_LOG_LID_FID_SUPPORTED_EFFECTS"
+,
+.br
+.br
+.BI " NVME_LOG_LID_MI_CMD_SUPPORTED_EFFECTS"
+,
+.br
+.br
+.BI " NVME_LOG_LID_BOOT_PARTITION"
+,
+.br
+.br
+.BI " NVME_LOG_LID_FDP_CONFIGS"
+,
+.br
+.br
+.BI " NVME_LOG_LID_FDP_RUH_USAGE"
+,
+.br
+.br
+.BI " NVME_LOG_LID_FDP_STATS"
+,
+.br
+.br
+.BI " NVME_LOG_LID_FDP_EVENTS"
+,
+.br
+.br
+.BI " NVME_LOG_LID_DISCOVER"
+,
+.br
+.br
+.BI " NVME_LOG_LID_RESERVATION"
+,
+.br
+.br
+.BI " NVME_LOG_LID_SANITIZE"
+,
+.br
+.br
+.BI " NVME_LOG_LID_ZNS_CHANGED_ZONES"
+
+};
+.SH Constants
+.IP "NVME_LOG_LID_SUPPORTED_LOG_PAGES" 12
+Supported Log Pages
+.IP "NVME_LOG_LID_ERROR" 12
+Error Information
+.IP "NVME_LOG_LID_SMART" 12
+SMART / Health Information
+.IP "NVME_LOG_LID_FW_SLOT" 12
+Firmware Slot Information
+.IP "NVME_LOG_LID_CHANGED_NS" 12
+Changed Namespace List
+.IP "NVME_LOG_LID_CMD_EFFECTS" 12
+Commands Supported and Effects
+.IP "NVME_LOG_LID_DEVICE_SELF_TEST" 12
+Device Self-test
+.IP "NVME_LOG_LID_TELEMETRY_HOST" 12
+Telemetry Host-Initiated
+.IP "NVME_LOG_LID_TELEMETRY_CTRL" 12
+Telemetry Controller-Initiated
+.IP "NVME_LOG_LID_ENDURANCE_GROUP" 12
+Endurance Group Information
+.IP "NVME_LOG_LID_PREDICTABLE_LAT_NVMSET" 12
+Predictable Latency Per NVM Set
+.IP "NVME_LOG_LID_PREDICTABLE_LAT_AGG" 12
+Predictable Latency Event Aggregate
+.IP "NVME_LOG_LID_ANA" 12
+Asymmetric Namespace Access
+.IP "NVME_LOG_LID_PERSISTENT_EVENT" 12
+Persistent Event Log
+.IP "NVME_LOG_LID_LBA_STATUS" 12
+LBA Status Information
+.IP "NVME_LOG_LID_ENDURANCE_GRP_EVT" 12
+Endurance Group Event Aggregate
+.IP "NVME_LOG_LID_MEDIA_UNIT_STATUS" 12
+Media Unit Status
+.IP "NVME_LOG_LID_SUPPORTED_CAP_CONFIG_LIST" 12
+Supported Capacity Configuration Lis
+.IP "NVME_LOG_LID_FID_SUPPORTED_EFFECTS" 12
+Feature Identifiers Supported and Effects
+.IP "NVME_LOG_LID_MI_CMD_SUPPORTED_EFFECTS" 12
+NVMe-MI Commands Supported and Effects
+.IP "NVME_LOG_LID_BOOT_PARTITION" 12
+Boot Partition
+.IP "NVME_LOG_LID_FDP_CONFIGS" 12
+FDP Configurations
+.IP "NVME_LOG_LID_FDP_RUH_USAGE" 12
+Reclaim Unit Handle Usage
+.IP "NVME_LOG_LID_FDP_STATS" 12
+FDP Statistics
+.IP "NVME_LOG_LID_FDP_EVENTS" 12
+FDP Events
+.IP "NVME_LOG_LID_DISCOVER" 12
+Discovery
+.IP "NVME_LOG_LID_RESERVATION" 12
+Reservation Notification
+.IP "NVME_LOG_LID_SANITIZE" 12
+Sanitize Status
+.IP "NVME_LOG_LID_ZNS_CHANGED_ZONES" 12
+Changed Zone List
diff --git a/doc/man/nvme_cmd_get_log_telemetry_host_lsp.2 b/doc/man/nvme_cmd_get_log_telemetry_host_lsp.2
new file mode 100644
index 0000000..0031542
--- /dev/null
+++ b/doc/man/nvme_cmd_get_log_telemetry_host_lsp.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvme_cmd_get_log_telemetry_host_lsp" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_cmd_get_log_telemetry_host_lsp \- Telemetry Host-Initiated log specific field
+.SH SYNOPSIS
+enum nvme_cmd_get_log_telemetry_host_lsp {
+.br
+.BI " NVME_LOG_TELEM_HOST_LSP_RETAIN"
+,
+.br
+.br
+.BI " NVME_LOG_TELEM_HOST_LSP_CREATE"
+
+};
+.SH Constants
+.IP "NVME_LOG_TELEM_HOST_LSP_RETAIN" 12
+Get Telemetry Data Blocks
+.IP "NVME_LOG_TELEM_HOST_LSP_CREATE" 12
+Create Telemetry Data Blocks
diff --git a/doc/man/nvme_compare.2 b/doc/man/nvme_compare.2
new file mode 100644
index 0000000..9db7b98
--- /dev/null
+++ b/doc/man/nvme_compare.2
@@ -0,0 +1,12 @@
+.TH "nvme_compare" 9 "nvme_compare" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_compare \- Submit an nvme user compare command
+.SH SYNOPSIS
+.B "int" nvme_compare
+.BI "(struct nvme_io_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_io_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_connect_err.2 b/doc/man/nvme_connect_err.2
new file mode 100644
index 0000000..071869c
--- /dev/null
+++ b/doc/man/nvme_connect_err.2
@@ -0,0 +1,114 @@
+.TH "libnvme" 9 "enum nvme_connect_err" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_connect_err \- nvme connect error codes
+.SH SYNOPSIS
+enum nvme_connect_err {
+.br
+.BI " ENVME_CONNECT_RESOLVE"
+,
+.br
+.br
+.BI " ENVME_CONNECT_ADDRFAM"
+,
+.br
+.br
+.BI " ENVME_CONNECT_TRADDR"
+,
+.br
+.br
+.BI " ENVME_CONNECT_TARG"
+,
+.br
+.br
+.BI " ENVME_CONNECT_AARG"
+,
+.br
+.br
+.BI " ENVME_CONNECT_OPEN"
+,
+.br
+.br
+.BI " ENVME_CONNECT_WRITE"
+,
+.br
+.br
+.BI " ENVME_CONNECT_READ"
+,
+.br
+.br
+.BI " ENVME_CONNECT_PARSE"
+,
+.br
+.br
+.BI " ENVME_CONNECT_INVAL_TR"
+,
+.br
+.br
+.BI " ENVME_CONNECT_LOOKUP_SUBSYS_NAME"
+,
+.br
+.br
+.BI " ENVME_CONNECT_LOOKUP_SUBSYS"
+,
+.br
+.br
+.BI " ENVME_CONNECT_ALREADY"
+,
+.br
+.br
+.BI " ENVME_CONNECT_INVAL"
+,
+.br
+.br
+.BI " ENVME_CONNECT_ADDRINUSE"
+,
+.br
+.br
+.BI " ENVME_CONNECT_NODEV"
+,
+.br
+.br
+.BI " ENVME_CONNECT_OPNOTSUPP"
+,
+.br
+.br
+.BI " ENVME_CONNECT_CONNREFUSED"
+
+};
+.SH Constants
+.IP "ENVME_CONNECT_RESOLVE" 12
+failed to resolve host
+.IP "ENVME_CONNECT_ADDRFAM" 12
+unrecognized address family
+.IP "ENVME_CONNECT_TRADDR" 12
+failed to get traddr
+.IP "ENVME_CONNECT_TARG" 12
+need a transport (-t) argument
+.IP "ENVME_CONNECT_AARG" 12
+need a address (-a) argument
+.IP "ENVME_CONNECT_OPEN" 12
+failed to open nvme-fabrics device
+.IP "ENVME_CONNECT_WRITE" 12
+failed to write to nvme-fabrics device
+.IP "ENVME_CONNECT_READ" 12
+failed to read from nvme-fabrics device
+.IP "ENVME_CONNECT_PARSE" 12
+failed to parse ctrl info
+.IP "ENVME_CONNECT_INVAL_TR" 12
+invalid transport type
+.IP "ENVME_CONNECT_LOOKUP_SUBSYS_NAME" 12
+failed to lookup subsystem name
+.IP "ENVME_CONNECT_LOOKUP_SUBSYS" 12
+failed to lookup subsystem
+.IP "ENVME_CONNECT_ALREADY" 12
+the connect attempt failed, already connected
+.IP "ENVME_CONNECT_INVAL" 12
+invalid arguments/configuration
+.IP "ENVME_CONNECT_ADDRINUSE" 12
+hostnqn already in use
+.IP "ENVME_CONNECT_NODEV" 12
+invalid interface
+.IP "ENVME_CONNECT_OPNOTSUPP" 12
+not supported
+.IP "ENVME_CONNECT_CONNREFUSED" 12
+connection refused
diff --git a/doc/man/nvme_constants.2 b/doc/man/nvme_constants.2
new file mode 100644
index 0000000..e16aec4
--- /dev/null
+++ b/doc/man/nvme_constants.2
@@ -0,0 +1,199 @@
+.TH "libnvme" 9 "enum nvme_constants" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_constants \- A place to stash various constant nvme values
+.SH SYNOPSIS
+enum nvme_constants {
+.br
+.BI " NVME_NSID_ALL"
+,
+.br
+.br
+.BI " NVME_NSID_NONE"
+,
+.br
+.br
+.BI " NVME_UUID_NONE"
+,
+.br
+.br
+.BI " NVME_CNTLID_NONE"
+,
+.br
+.br
+.BI " NVME_CNSSPECID_NONE"
+,
+.br
+.br
+.BI " NVME_LOG_LSP_NONE"
+,
+.br
+.br
+.BI " NVME_LOG_LSI_NONE"
+,
+.br
+.br
+.BI " NVME_LOG_LPO_NONE"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_DATA_SIZE"
+,
+.br
+.br
+.BI " NVME_LOG_SUPPORTED_LOG_PAGES_MAX"
+,
+.br
+.br
+.BI " NVME_ID_NVMSET_LIST_MAX"
+,
+.br
+.br
+.BI " NVME_ID_UUID_LIST_MAX"
+,
+.br
+.br
+.BI " NVME_ID_CTRL_LIST_MAX"
+,
+.br
+.br
+.BI " NVME_ID_NS_LIST_MAX"
+,
+.br
+.br
+.BI " NVME_ID_SECONDARY_CTRL_MAX"
+,
+.br
+.br
+.BI " NVME_ID_DOMAIN_LIST_MAX"
+,
+.br
+.br
+.BI " NVME_ID_ENDURANCE_GROUP_LIST_MAX"
+,
+.br
+.br
+.BI " NVME_ID_ND_DESCRIPTOR_MAX"
+,
+.br
+.br
+.BI " NVME_FEAT_LBA_RANGE_MAX"
+,
+.br
+.br
+.BI " NVME_LOG_ST_MAX_RESULTS"
+,
+.br
+.br
+.BI " NVME_LOG_TELEM_BLOCK_SIZE"
+,
+.br
+.br
+.BI " NVME_LOG_FID_SUPPORTED_EFFECTS_MAX"
+,
+.br
+.br
+.BI " NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_MAX"
+,
+.br
+.br
+.BI " NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_RESERVED"
+,
+.br
+.br
+.BI " NVME_DSM_MAX_RANGES"
+,
+.br
+.br
+.BI " NVME_NQN_LENGTH"
+,
+.br
+.br
+.BI " NVMF_TRADDR_SIZE"
+,
+.br
+.br
+.BI " NVMF_TSAS_SIZE"
+,
+.br
+.br
+.BI " NVME_ZNS_CHANGED_ZONES_MAX"
+
+};
+.SH Constants
+.IP "NVME_NSID_ALL" 12
+A broadcast value that is used to specify all
+namespaces
+.IP "NVME_NSID_NONE" 12
+The invalid namespace id, for when the nsid
+parameter is not used in a command
+.IP "NVME_UUID_NONE" 12
+Use to omit a uuid command parameter
+.IP "NVME_CNTLID_NONE" 12
+Use to omit a cntlid command parameter
+.IP "NVME_CNSSPECID_NONE" 12
+Use to omit a cns_specific_id command parameter
+.IP "NVME_LOG_LSP_NONE" 12
+Use to omit a log lsp command parameter
+.IP "NVME_LOG_LSI_NONE" 12
+Use to omit a log lsi command parameter
+.IP "NVME_LOG_LPO_NONE" 12
+Use to omit a log lpo command parameter
+.IP "NVME_IDENTIFY_DATA_SIZE" 12
+The transfer size for nvme identify commands
+.IP "NVME_LOG_SUPPORTED_LOG_PAGES_MAX" 12
+The largest possible index in the supported
+log pages log.
+.IP "NVME_ID_NVMSET_LIST_MAX" 12
+The largest possible nvmset index in identify
+nvmeset
+.IP "NVME_ID_UUID_LIST_MAX" 12
+The largest possible uuid index in identify
+uuid list
+.IP "NVME_ID_CTRL_LIST_MAX" 12
+The largest possible controller index in
+identify controller list
+.IP "NVME_ID_NS_LIST_MAX" 12
+The largest possible namespace index in
+identify namespace list
+.IP "NVME_ID_SECONDARY_CTRL_MAX" 12
+The largest possible secondary controller index
+in identify secondary controller
+.IP "NVME_ID_DOMAIN_LIST_MAX" 12
+The largest possible domain index in the
+in domain list
+.IP "NVME_ID_ENDURANCE_GROUP_LIST_MAX" 12
+The largest possible endurance group
+index in the endurance group list
+.IP "NVME_ID_ND_DESCRIPTOR_MAX" 12
+The largest possible namespace granularity
+index in the namespace granularity descriptor
+list
+.IP "NVME_FEAT_LBA_RANGE_MAX" 12
+The largest possible LBA range index in feature
+lba range type
+.IP "NVME_LOG_ST_MAX_RESULTS" 12
+The largest possible self test result index in the
+device self test log
+.IP "NVME_LOG_TELEM_BLOCK_SIZE" 12
+Specification defined size of Telemetry Data Blocks
+.IP "NVME_LOG_FID_SUPPORTED_EFFECTS_MAX" 12
+The largest possible FID index in the
+feature identifiers effects log.
+.IP "NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_MAX" 12
+The largest possible MI Command index
+in the MI Command effects log.
+.IP "NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_RESERVED" 12
+The reserved space in the MI Command
+effects log.
+.IP "NVME_DSM_MAX_RANGES" 12
+The largest possible range index in a data-set
+management command
+.IP "NVME_NQN_LENGTH" 12
+Max length for NVMe Qualified Name
+.IP "NVMF_TRADDR_SIZE" 12
+Max Transport Address size
+.IP "NVMF_TSAS_SIZE" 12
+Max Transport Specific Address Subtype size
+.IP "NVME_ZNS_CHANGED_ZONES_MAX" 12
+Max number of zones in the changed zones log
+page
diff --git a/doc/man/nvme_copy.2 b/doc/man/nvme_copy.2
new file mode 100644
index 0000000..5c68de3
--- /dev/null
+++ b/doc/man/nvme_copy.2
@@ -0,0 +1,12 @@
+.TH "nvme_copy" 9 "nvme_copy" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_copy \- Copy command
+.SH SYNOPSIS
+.B "int" nvme_copy
+.BI "(struct nvme_copy_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_copy_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_copy_range.2 b/doc/man/nvme_copy_range.2
new file mode 100644
index 0000000..473a8a8
--- /dev/null
+++ b/doc/man/nvme_copy_range.2
@@ -0,0 +1,40 @@
+.TH "libnvme" 9 "struct nvme_copy_range" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_copy_range \- Copy - Source Range Entries Descriptor Format
+.SH SYNOPSIS
+struct nvme_copy_range {
+.br
+.BI " __u8 rsvd0[8];"
+.br
+.BI " __le64 slba;"
+.br
+.BI " __le16 nlb;"
+.br
+.BI " __u8 rsvd18[6];"
+.br
+.BI " __le32 eilbrt;"
+.br
+.BI " __le16 elbatm;"
+.br
+.BI " __le16 elbat;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "rsvd0" 12
+Reserved
+.IP "slba" 12
+Starting LBA
+.IP "nlb" 12
+Number of Logical Blocks
+.IP "rsvd18" 12
+Reserved
+.IP "eilbrt" 12
+Expected Initial Logical Block Reference Tag /
+Expected Logical Block Storage Tag
+.IP "elbatm" 12
+Expected Logical Block Application Tag Mask
+.IP "elbat" 12
+Expected Logical Block Application Tag
diff --git a/doc/man/nvme_copy_range_f1.2 b/doc/man/nvme_copy_range_f1.2
new file mode 100644
index 0000000..8bd3430
--- /dev/null
+++ b/doc/man/nvme_copy_range_f1.2
@@ -0,0 +1,40 @@
+.TH "libnvme" 9 "struct nvme_copy_range_f1" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_copy_range_f1 \- Copy - Source Range Entries Descriptor Format 1h
+.SH SYNOPSIS
+struct nvme_copy_range_f1 {
+.br
+.BI " __u8 rsvd0[8];"
+.br
+.BI " __le64 slba;"
+.br
+.BI " __le16 nlb;"
+.br
+.BI " __u8 rsvd18[8];"
+.br
+.BI " __u8 elbt[10];"
+.br
+.BI " __le16 elbatm;"
+.br
+.BI " __le16 elbat;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "rsvd0" 12
+Reserved
+.IP "slba" 12
+Starting LBA
+.IP "nlb" 12
+Number of Logical Blocks
+.IP "rsvd18" 12
+Reserved
+.IP "elbt" 12
+Expected Initial Logical Block Reference Tag /
+Expected Logical Block Storage Tag
+.IP "elbatm" 12
+Expected Logical Block Application Tag Mask
+.IP "elbat" 12
+Expected Logical Block Application Tag
diff --git a/doc/man/nvme_create_ctrl.2 b/doc/man/nvme_create_ctrl.2
new file mode 100644
index 0000000..1f2d1c9
--- /dev/null
+++ b/doc/man/nvme_create_ctrl.2
@@ -0,0 +1,31 @@
+.TH "nvme_create_ctrl" 9 "nvme_create_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_create_ctrl \- Allocate an unconnected NVMe controller
+.SH SYNOPSIS
+.B "nvme_ctrl_t" nvme_create_ctrl
+.BI "(nvme_root_t r " ","
+.BI "const char *subsysnqn " ","
+.BI "const char *transport " ","
+.BI "const char *traddr " ","
+.BI "const char *host_traddr " ","
+.BI "const char *host_iface " ","
+.BI "const char *trsvcid " ");"
+.SH ARGUMENTS
+.IP "r" 12
+NVMe root element
+.IP "subsysnqn" 12
+Subsystem NQN
+.IP "transport" 12
+Transport type
+.IP "traddr" 12
+Transport address
+.IP "host_traddr" 12
+Host transport address
+.IP "host_iface" 12
+Host interface name
+.IP "trsvcid" 12
+Transport service ID
+.SH "DESCRIPTION"
+Creates an unconnected controller to be used for \fBnvme_add_ctrl\fP.
+.SH "RETURN"
+Controller instance
diff --git a/doc/man/nvme_create_root.2 b/doc/man/nvme_create_root.2
new file mode 100644
index 0000000..82337ee
--- /dev/null
+++ b/doc/man/nvme_create_root.2
@@ -0,0 +1,14 @@
+.TH "nvme_create_root" 9 "nvme_create_root" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_create_root \- Initialize root object
+.SH SYNOPSIS
+.B "nvme_root_t" nvme_create_root
+.BI "(FILE *fp " ","
+.BI "int log_level " ");"
+.SH ARGUMENTS
+.IP "fp" 12
+File descriptor for logging messages
+.IP "log_level" 12
+Logging level to use
+.SH "RETURN"
+Initialized \fInvme_root_t\fP object
diff --git a/doc/man/nvme_csi.2 b/doc/man/nvme_csi.2
new file mode 100644
index 0000000..f879e83
--- /dev/null
+++ b/doc/man/nvme_csi.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "enum nvme_csi" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_csi \- Defined command set indicators
+.SH SYNOPSIS
+enum nvme_csi {
+.br
+.BI " NVME_CSI_NVM"
+,
+.br
+.br
+.BI " NVME_CSI_KV"
+,
+.br
+.br
+.BI " NVME_CSI_ZNS"
+
+};
+.SH Constants
+.IP "NVME_CSI_NVM" 12
+NVM Command Set Indicator
+.IP "NVME_CSI_KV" 12
+Key Value Command Set
+.IP "NVME_CSI_ZNS" 12
+Zoned Namespace Command Set
diff --git a/doc/man/nvme_ctrl_first_ns.2 b/doc/man/nvme_ctrl_first_ns.2
new file mode 100644
index 0000000..6318f2e
--- /dev/null
+++ b/doc/man/nvme_ctrl_first_ns.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_first_ns" 9 "nvme_ctrl_first_ns" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_first_ns \- Start namespace iterator
+.SH SYNOPSIS
+.B "nvme_ns_t" nvme_ctrl_first_ns
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+First \fInvme_ns_t\fP object of an \fIc\fP iterator
diff --git a/doc/man/nvme_ctrl_first_path.2 b/doc/man/nvme_ctrl_first_path.2
new file mode 100644
index 0000000..2c4fdf3
--- /dev/null
+++ b/doc/man/nvme_ctrl_first_path.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_first_path" 9 "nvme_ctrl_first_path" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_first_path \- Start path iterator
+.SH SYNOPSIS
+.B "nvme_path_t" nvme_ctrl_first_path
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+First \fInvme_path_t\fP object of an \fIc\fP iterator
diff --git a/doc/man/nvme_ctrl_for_each_ns.2 b/doc/man/nvme_ctrl_for_each_ns.2
new file mode 100644
index 0000000..7527215
--- /dev/null
+++ b/doc/man/nvme_ctrl_for_each_ns.2
@@ -0,0 +1,12 @@
+.TH "nvme_ctrl_for_each_ns" 9 "nvme_ctrl_for_each_ns" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_for_each_ns \- Traverse namespaces
+.SH SYNOPSIS
+.B "nvme_ctrl_for_each_ns
+.BI "(c " ","
+.BI "n " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.IP "n" 12
+\fInvme_ns_t\fP object
diff --git a/doc/man/nvme_ctrl_for_each_ns_safe.2 b/doc/man/nvme_ctrl_for_each_ns_safe.2
new file mode 100644
index 0000000..69ad287
--- /dev/null
+++ b/doc/man/nvme_ctrl_for_each_ns_safe.2
@@ -0,0 +1,15 @@
+.TH "nvme_ctrl_for_each_ns_safe" 9 "nvme_ctrl_for_each_ns_safe" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_for_each_ns_safe \- Traverse namespaces
+.SH SYNOPSIS
+.B "nvme_ctrl_for_each_ns_safe
+.BI "(c " ","
+.BI "n " ","
+.BI "_n " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.IP "n" 12
+\fInvme_ns_t\fP object
+.IP "_n" 12
+A \fInvme_ns_t_node\fP to use as temporary storage
diff --git a/doc/man/nvme_ctrl_for_each_path.2 b/doc/man/nvme_ctrl_for_each_path.2
new file mode 100644
index 0000000..bbbfc99
--- /dev/null
+++ b/doc/man/nvme_ctrl_for_each_path.2
@@ -0,0 +1,12 @@
+.TH "nvme_ctrl_for_each_path" 9 "nvme_ctrl_for_each_path" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_for_each_path \- Traverse paths
+.SH SYNOPSIS
+.B "nvme_ctrl_for_each_path
+.BI "(c " ","
+.BI "p " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.IP "p" 12
+\fInvme_path_t\fP object
diff --git a/doc/man/nvme_ctrl_for_each_path_safe.2 b/doc/man/nvme_ctrl_for_each_path_safe.2
new file mode 100644
index 0000000..effebd0
--- /dev/null
+++ b/doc/man/nvme_ctrl_for_each_path_safe.2
@@ -0,0 +1,15 @@
+.TH "nvme_ctrl_for_each_path_safe" 9 "nvme_ctrl_for_each_path_safe" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_for_each_path_safe \- Traverse paths
+.SH SYNOPSIS
+.B "nvme_ctrl_for_each_path_safe
+.BI "(c " ","
+.BI "p " ","
+.BI "_p " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.IP "p" 12
+\fInvme_path_t\fP object
+.IP "_p" 12
+A \fInvme_path_t_node\fP to use as temporary storage
diff --git a/doc/man/nvme_ctrl_get_address.2 b/doc/man/nvme_ctrl_get_address.2
new file mode 100644
index 0000000..e4341ea
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_address.2
@@ -0,0 +1,12 @@
+.TH "nvme_ctrl_get_address" 9 "nvme_ctrl_get_address" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_address \- Address string of a controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_address
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+NVMe-over-Fabrics address string of \fIc\fP or empty string
+of no address is present.
diff --git a/doc/man/nvme_ctrl_get_config.2 b/doc/man/nvme_ctrl_get_config.2
new file mode 100644
index 0000000..a9a9729
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_config.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_config" 9 "nvme_ctrl_get_config" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_config \- Fabrics configuration of a controller
+.SH SYNOPSIS
+.B "struct nvme_fabrics_config *" nvme_ctrl_get_config
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+Fabrics configuration of \fIc\fP
diff --git a/doc/man/nvme_ctrl_get_dhchap_host_key.2 b/doc/man/nvme_ctrl_get_dhchap_host_key.2
new file mode 100644
index 0000000..bb0bee4
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_dhchap_host_key.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_dhchap_host_key" 9 "nvme_ctrl_get_dhchap_host_key" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_dhchap_host_key \- Return host key
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_dhchap_host_key
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller to be checked
+.SH "RETURN"
+DH-HMAC-CHAP host key or NULL if not set
diff --git a/doc/man/nvme_ctrl_get_dhchap_key.2 b/doc/man/nvme_ctrl_get_dhchap_key.2
new file mode 100644
index 0000000..f60f0a2
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_dhchap_key.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_dhchap_key" 9 "nvme_ctrl_get_dhchap_key" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_dhchap_key \- Return controller key
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_dhchap_key
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller for which the key should be set
+.SH "RETURN"
+DH-HMAC-CHAP controller key or NULL if not set
diff --git a/doc/man/nvme_ctrl_get_fd.2 b/doc/man/nvme_ctrl_get_fd.2
new file mode 100644
index 0000000..abaf6ef
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_fd.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_fd" 9 "nvme_ctrl_get_fd" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_fd \- Get associated file descriptor
+.SH SYNOPSIS
+.B "int" nvme_ctrl_get_fd
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+File descriptor associated with \fIc\fP or -1
diff --git a/doc/man/nvme_ctrl_get_firmware.2 b/doc/man/nvme_ctrl_get_firmware.2
new file mode 100644
index 0000000..4818b25
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_firmware.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_firmware" 9 "nvme_ctrl_get_firmware" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_firmware \- Firmware string of a controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_firmware
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+Firmware string of \fIc\fP
diff --git a/doc/man/nvme_ctrl_get_host_iface.2 b/doc/man/nvme_ctrl_get_host_iface.2
new file mode 100644
index 0000000..0c058ff
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_host_iface.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_host_iface" 9 "nvme_ctrl_get_host_iface" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_host_iface \- Host interface name of a controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_host_iface
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+Host interface name of \fIc\fP (if present)
diff --git a/doc/man/nvme_ctrl_get_host_traddr.2 b/doc/man/nvme_ctrl_get_host_traddr.2
new file mode 100644
index 0000000..fabe75a
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_host_traddr.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_host_traddr" 9 "nvme_ctrl_get_host_traddr" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_host_traddr \- Host transport address of a controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_host_traddr
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+Host transport address of \fIc\fP (if present)
diff --git a/doc/man/nvme_ctrl_get_model.2 b/doc/man/nvme_ctrl_get_model.2
new file mode 100644
index 0000000..0d780a2
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_model.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_model" 9 "nvme_ctrl_get_model" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_model \- Model of a controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_model
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+Model string of \fIc\fP
diff --git a/doc/man/nvme_ctrl_get_name.2 b/doc/man/nvme_ctrl_get_name.2
new file mode 100644
index 0000000..29276c9
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_name.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_name" 9 "nvme_ctrl_get_name" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_name \- sysfs name of a controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_name
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+sysfs name of \fIc\fP
diff --git a/doc/man/nvme_ctrl_get_numa_node.2 b/doc/man/nvme_ctrl_get_numa_node.2
new file mode 100644
index 0000000..68365ca
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_numa_node.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_numa_node" 9 "nvme_ctrl_get_numa_node" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_numa_node \- NUMA node of a controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_numa_node
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+String indicating the NUMA node
diff --git a/doc/man/nvme_ctrl_get_queue_count.2 b/doc/man/nvme_ctrl_get_queue_count.2
new file mode 100644
index 0000000..a996dd0
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_queue_count.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_queue_count" 9 "nvme_ctrl_get_queue_count" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_queue_count \- Queue count of a controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_queue_count
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+Queue count of \fIc\fP
diff --git a/doc/man/nvme_ctrl_get_serial.2 b/doc/man/nvme_ctrl_get_serial.2
new file mode 100644
index 0000000..867d23c
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_serial.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_serial" 9 "nvme_ctrl_get_serial" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_serial \- Serial number of a controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_serial
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+Serial number string of \fIc\fP
diff --git a/doc/man/nvme_ctrl_get_sqsize.2 b/doc/man/nvme_ctrl_get_sqsize.2
new file mode 100644
index 0000000..0a56ac6
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_sqsize.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_sqsize" 9 "nvme_ctrl_get_sqsize" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_sqsize \- SQ size of a controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_sqsize
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+SQ size (as string) of \fIc\fP
diff --git a/doc/man/nvme_ctrl_get_state.2 b/doc/man/nvme_ctrl_get_state.2
new file mode 100644
index 0000000..3ea67c4
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_state.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_state" 9 "nvme_ctrl_get_state" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_state \- Running state of an controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_state
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+String indicating the running state of \fIc\fP
diff --git a/doc/man/nvme_ctrl_get_subsysnqn.2 b/doc/man/nvme_ctrl_get_subsysnqn.2
new file mode 100644
index 0000000..f940c43
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_subsysnqn.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_subsysnqn" 9 "nvme_ctrl_get_subsysnqn" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_subsysnqn \- Subsystem NQN of a controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_subsysnqn
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+Subsystem NQN of \fIc\fP
diff --git a/doc/man/nvme_ctrl_get_subsystem.2 b/doc/man/nvme_ctrl_get_subsystem.2
new file mode 100644
index 0000000..c514e54
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_subsystem.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_subsystem" 9 "nvme_ctrl_get_subsystem" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_subsystem \- Parent subsystem of a controller
+.SH SYNOPSIS
+.B "nvme_subsystem_t" nvme_ctrl_get_subsystem
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+Parent nvme_subsystem_t object
diff --git a/doc/man/nvme_ctrl_get_sysfs_dir.2 b/doc/man/nvme_ctrl_get_sysfs_dir.2
new file mode 100644
index 0000000..3e87bf0
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_sysfs_dir.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_sysfs_dir" 9 "nvme_ctrl_get_sysfs_dir" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_sysfs_dir \- sysfs directory of a controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_sysfs_dir
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+sysfs directory name of \fIc\fP
diff --git a/doc/man/nvme_ctrl_get_traddr.2 b/doc/man/nvme_ctrl_get_traddr.2
new file mode 100644
index 0000000..e0a5bda
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_traddr.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_traddr" 9 "nvme_ctrl_get_traddr" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_traddr \- Transport address of a controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_traddr
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+Transport address of \fIc\fP
diff --git a/doc/man/nvme_ctrl_get_transport.2 b/doc/man/nvme_ctrl_get_transport.2
new file mode 100644
index 0000000..5404de8
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_transport.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_transport" 9 "nvme_ctrl_get_transport" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_transport \- Transport type of a controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_transport
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+Transport type of \fIc\fP
diff --git a/doc/man/nvme_ctrl_get_trsvcid.2 b/doc/man/nvme_ctrl_get_trsvcid.2
new file mode 100644
index 0000000..f1ffc0f
--- /dev/null
+++ b/doc/man/nvme_ctrl_get_trsvcid.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_get_trsvcid" 9 "nvme_ctrl_get_trsvcid" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_get_trsvcid \- Transport service identifier of a controller
+.SH SYNOPSIS
+.B "const char *" nvme_ctrl_get_trsvcid
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+Transport service identifier of \fIc\fP (if present)
diff --git a/doc/man/nvme_ctrl_identify.2 b/doc/man/nvme_ctrl_identify.2
new file mode 100644
index 0000000..d2e37eb
--- /dev/null
+++ b/doc/man/nvme_ctrl_identify.2
@@ -0,0 +1,17 @@
+.TH "nvme_ctrl_identify" 9 "nvme_ctrl_identify" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_identify \- Issues an 'identify controller' command
+.SH SYNOPSIS
+.B "int" nvme_ctrl_identify
+.BI "(nvme_ctrl_t c " ","
+.BI "struct nvme_id_ctrl *id " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.IP "id" 12
+Identify controller data structure
+.SH "DESCRIPTION"
+Issues an 'identify controller' command to \fIc\fP and copies the
+data into \fIid\fP.
+.SH "RETURN"
+0 on success or -1 on failure.
diff --git a/doc/man/nvme_ctrl_is_discovered.2 b/doc/man/nvme_ctrl_is_discovered.2
new file mode 100644
index 0000000..ba56977
--- /dev/null
+++ b/doc/man/nvme_ctrl_is_discovered.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_is_discovered" 9 "nvme_ctrl_is_discovered" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_is_discovered \- Returns the value of the 'discovered' flag
+.SH SYNOPSIS
+.B "bool" nvme_ctrl_is_discovered
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+Value of the 'discovered' flag of \fIc\fP
diff --git a/doc/man/nvme_ctrl_is_discovery_ctrl.2 b/doc/man/nvme_ctrl_is_discovery_ctrl.2
new file mode 100644
index 0000000..3681b6c
--- /dev/null
+++ b/doc/man/nvme_ctrl_is_discovery_ctrl.2
@@ -0,0 +1,14 @@
+.TH "nvme_ctrl_is_discovery_ctrl" 9 "nvme_ctrl_is_discovery_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_is_discovery_ctrl \- Check the 'discovery_ctrl' flag
+.SH SYNOPSIS
+.B "bool" nvme_ctrl_is_discovery_ctrl
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller to be checked
+.SH "DESCRIPTION"
+Returns the value of the 'discovery_ctrl' flag which specifies whether
+\fIc\fP connects to a discovery subsystem.
+.SH "RETURN"
+Value of the 'discover_ctrl' flag
diff --git a/doc/man/nvme_ctrl_is_persistent.2 b/doc/man/nvme_ctrl_is_persistent.2
new file mode 100644
index 0000000..46f2bf2
--- /dev/null
+++ b/doc/man/nvme_ctrl_is_persistent.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_is_persistent" 9 "nvme_ctrl_is_persistent" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_is_persistent \- Returns the value of the 'persistent' flag
+.SH SYNOPSIS
+.B "bool" nvme_ctrl_is_persistent
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "RETURN"
+Value of the 'persistent' flag of \fIc\fP
diff --git a/doc/man/nvme_ctrl_is_unique_discovery_ctrl.2 b/doc/man/nvme_ctrl_is_unique_discovery_ctrl.2
new file mode 100644
index 0000000..a7ca604
--- /dev/null
+++ b/doc/man/nvme_ctrl_is_unique_discovery_ctrl.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrl_is_unique_discovery_ctrl" 9 "nvme_ctrl_is_unique_discovery_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_is_unique_discovery_ctrl \- Check the 'unique_discovery_ctrl' flag
+.SH SYNOPSIS
+.B "bool" nvme_ctrl_is_unique_discovery_ctrl
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller to be checked
+.SH "RETURN"
+Value of the 'unique_discovery_ctrl' flag
diff --git a/doc/man/nvme_ctrl_list.2 b/doc/man/nvme_ctrl_list.2
new file mode 100644
index 0000000..2469dad
--- /dev/null
+++ b/doc/man/nvme_ctrl_list.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_ctrl_list" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_ctrl_list \- Controller List
+.SH SYNOPSIS
+struct nvme_ctrl_list {
+.br
+.BI " __le16 num;"
+.br
+.BI " __le16 identifier[NVME_ID_CTRL_LIST_MAX];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "num" 12
+Number of Identifiers
+.IP "identifier" 12
+NVM subsystem unique controller identifier
diff --git a/doc/man/nvme_ctrl_metadata_type.2 b/doc/man/nvme_ctrl_metadata_type.2
new file mode 100644
index 0000000..8ae70d3
--- /dev/null
+++ b/doc/man/nvme_ctrl_metadata_type.2
@@ -0,0 +1,108 @@
+.TH "libnvme" 9 "enum nvme_ctrl_metadata_type" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_ctrl_metadata_type \- Controller Metadata Element Types
+.SH SYNOPSIS
+enum nvme_ctrl_metadata_type {
+.br
+.BI " NVME_CTRL_METADATA_OS_CTRL_NAME"
+,
+.br
+.br
+.BI " NVME_CTRL_METADATA_OS_DRIVER_NAME"
+,
+.br
+.br
+.BI " NVME_CTRL_METADATA_OS_DRIVER_VER"
+,
+.br
+.br
+.BI " NVME_CTRL_METADATA_PRE_BOOT_CTRL_NAME"
+,
+.br
+.br
+.BI " NVME_CTRL_METADATA_PRE_BOOT_DRIVER_NAME"
+,
+.br
+.br
+.BI " NVME_CTRL_METADATA_PRE_BOOT_DRIVER_VER"
+,
+.br
+.br
+.BI " NVME_CTRL_METADATA_SYS_PROC_MODEL"
+,
+.br
+.br
+.BI " NVME_CTRL_METADATA_CHIPSET_DRV_NAME"
+,
+.br
+.br
+.BI " NVME_CTRL_METADATA_CHIPSET_DRV_VERSION"
+,
+.br
+.br
+.BI " NVME_CTRL_METADATA_OS_NAME_AND_BUILD"
+,
+.br
+.br
+.BI " NVME_CTRL_METADATA_SYS_PROD_NAME"
+,
+.br
+.br
+.BI " NVME_CTRL_METADATA_FIRMWARE_VERSION"
+,
+.br
+.br
+.BI " NVME_CTRL_METADATA_OS_DRIVER_FILENAME"
+,
+.br
+.br
+.BI " NVME_CTRL_METADATA_DISPLAY_DRV_NAME"
+,
+.br
+.br
+.BI " NVME_CTRL_METADATA_DISPLAY_DRV_VERSION"
+,
+.br
+.br
+.BI " NVME_CTRL_METADATA_HOST_DET_FAIL_REC"
+
+};
+.SH Constants
+.IP "NVME_CTRL_METADATA_OS_CTRL_NAME" 12
+Name of the controller in
+the operating system.
+.IP "NVME_CTRL_METADATA_OS_DRIVER_NAME" 12
+Name of the driver in the
+operating system.
+.IP "NVME_CTRL_METADATA_OS_DRIVER_VER" 12
+Version of the driver in
+the operating system.
+.IP "NVME_CTRL_METADATA_PRE_BOOT_CTRL_NAME" 12
+Name of the controller in
+the pre-boot environment.
+.IP "NVME_CTRL_METADATA_PRE_BOOT_DRIVER_NAME" 12
+Name of the driver in the
+pre-boot environment.
+.IP "NVME_CTRL_METADATA_PRE_BOOT_DRIVER_VER" 12
+Version of the driver in the
+pre-boot environment.
+.IP "NVME_CTRL_METADATA_SYS_PROC_MODEL" 12
+Model of the processor.
+.IP "NVME_CTRL_METADATA_CHIPSET_DRV_NAME" 12
+Chipset driver name.
+.IP "NVME_CTRL_METADATA_CHIPSET_DRV_VERSION" 12
+Chipset driver version.
+.IP "NVME_CTRL_METADATA_OS_NAME_AND_BUILD" 12
+Operating system name and build.
+.IP "NVME_CTRL_METADATA_SYS_PROD_NAME" 12
+System product name.
+.IP "NVME_CTRL_METADATA_FIRMWARE_VERSION" 12
+Host firmware (e.g UEFI) version.
+.IP "NVME_CTRL_METADATA_OS_DRIVER_FILENAME" 12
+Operating system driver filename.
+.IP "NVME_CTRL_METADATA_DISPLAY_DRV_NAME" 12
+Display driver name.
+.IP "NVME_CTRL_METADATA_DISPLAY_DRV_VERSION" 12
+Display driver version.
+.IP "NVME_CTRL_METADATA_HOST_DET_FAIL_REC" 12
+Failure record.
diff --git a/doc/man/nvme_ctrl_next_ns.2 b/doc/man/nvme_ctrl_next_ns.2
new file mode 100644
index 0000000..bb6163a
--- /dev/null
+++ b/doc/man/nvme_ctrl_next_ns.2
@@ -0,0 +1,14 @@
+.TH "nvme_ctrl_next_ns" 9 "nvme_ctrl_next_ns" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_next_ns \- Next namespace iterator
+.SH SYNOPSIS
+.B "nvme_ns_t" nvme_ctrl_next_ns
+.BI "(nvme_ctrl_t c " ","
+.BI "nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.IP "n" 12
+Previous nvme_ns_t iterator
+.SH "RETURN"
+Next nvme_ns_t object of an \fIc\fP iterator
diff --git a/doc/man/nvme_ctrl_next_path.2 b/doc/man/nvme_ctrl_next_path.2
new file mode 100644
index 0000000..b3e323e
--- /dev/null
+++ b/doc/man/nvme_ctrl_next_path.2
@@ -0,0 +1,14 @@
+.TH "nvme_ctrl_next_path" 9 "nvme_ctrl_next_path" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_next_path \- Next path iterator
+.SH SYNOPSIS
+.B "nvme_path_t" nvme_ctrl_next_path
+.BI "(nvme_ctrl_t c " ","
+.BI "nvme_path_t p " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.IP "p" 12
+Previous \fInvme_path_t\fP object of an \fIc\fP iterator
+.SH "RETURN"
+Next \fInvme_path_t\fP object of an \fIc\fP iterator
diff --git a/doc/man/nvme_ctrl_reset.2 b/doc/man/nvme_ctrl_reset.2
new file mode 100644
index 0000000..9d8e129
--- /dev/null
+++ b/doc/man/nvme_ctrl_reset.2
@@ -0,0 +1,13 @@
+.TH "nvme_ctrl_reset" 9 "nvme_ctrl_reset" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_reset \- Initiate a controller reset
+.SH SYNOPSIS
+.B "int" nvme_ctrl_reset
+.BI "(int fd " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.SH "DESCRIPTION"
+This should only be sent to controller handles, not to namespaces.
+.SH "RETURN"
+0 if a reset was initiated or -1 with errno set otherwise.
diff --git a/doc/man/nvme_ctrl_set_dhchap_host_key.2 b/doc/man/nvme_ctrl_set_dhchap_host_key.2
new file mode 100644
index 0000000..d1c82b0
--- /dev/null
+++ b/doc/man/nvme_ctrl_set_dhchap_host_key.2
@@ -0,0 +1,12 @@
+.TH "nvme_ctrl_set_dhchap_host_key" 9 "nvme_ctrl_set_dhchap_host_key" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_set_dhchap_host_key \- Set host key
+.SH SYNOPSIS
+.B "void" nvme_ctrl_set_dhchap_host_key
+.BI "(nvme_ctrl_t c " ","
+.BI "const char *key " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Host for which the key should be set
+.IP "key" 12
+DH-HMAC-CHAP Key to set or NULL to clear existing key
diff --git a/doc/man/nvme_ctrl_set_dhchap_key.2 b/doc/man/nvme_ctrl_set_dhchap_key.2
new file mode 100644
index 0000000..23a61a8
--- /dev/null
+++ b/doc/man/nvme_ctrl_set_dhchap_key.2
@@ -0,0 +1,12 @@
+.TH "nvme_ctrl_set_dhchap_key" 9 "nvme_ctrl_set_dhchap_key" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_set_dhchap_key \- Set controller key
+.SH SYNOPSIS
+.B "void" nvme_ctrl_set_dhchap_key
+.BI "(nvme_ctrl_t c " ","
+.BI "const char *key " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller for which the key should be set
+.IP "key" 12
+DH-HMAC-CHAP Key to set or NULL to clear existing key
diff --git a/doc/man/nvme_ctrl_set_discovered.2 b/doc/man/nvme_ctrl_set_discovered.2
new file mode 100644
index 0000000..77d98c5
--- /dev/null
+++ b/doc/man/nvme_ctrl_set_discovered.2
@@ -0,0 +1,14 @@
+.TH "nvme_ctrl_set_discovered" 9 "nvme_ctrl_set_discovered" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_set_discovered \- Set the 'discovered' flag
+.SH SYNOPSIS
+.B "void" nvme_ctrl_set_discovered
+.BI "(nvme_ctrl_t c " ","
+.BI "bool discovered " ");"
+.SH ARGUMENTS
+.IP "c" 12
+nvme_ctrl_t object
+.IP "discovered" 12
+Value of the 'discovered' flag
+.SH "DESCRIPTION"
+Set the 'discovered' flag of \fIc\fP to \fIdiscovered\fP
diff --git a/doc/man/nvme_ctrl_set_discovery_ctrl.2 b/doc/man/nvme_ctrl_set_discovery_ctrl.2
new file mode 100644
index 0000000..304aa1d
--- /dev/null
+++ b/doc/man/nvme_ctrl_set_discovery_ctrl.2
@@ -0,0 +1,15 @@
+.TH "nvme_ctrl_set_discovery_ctrl" 9 "nvme_ctrl_set_discovery_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_set_discovery_ctrl \- Set the 'discovery_ctrl' flag
+.SH SYNOPSIS
+.B "void" nvme_ctrl_set_discovery_ctrl
+.BI "(nvme_ctrl_t c " ","
+.BI "bool discovery " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller to be modified
+.IP "discovery" 12
+value of the discovery_ctrl flag
+.SH "DESCRIPTION"
+Sets the 'discovery_ctrl' flag in \fIc\fP to specify whether
+\fIc\fP connects to a discovery subsystem.
diff --git a/doc/man/nvme_ctrl_set_persistent.2 b/doc/man/nvme_ctrl_set_persistent.2
new file mode 100644
index 0000000..fe1d73e
--- /dev/null
+++ b/doc/man/nvme_ctrl_set_persistent.2
@@ -0,0 +1,14 @@
+.TH "nvme_ctrl_set_persistent" 9 "nvme_ctrl_set_persistent" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_set_persistent \- Set the 'persistent' flag
+.SH SYNOPSIS
+.B "void" nvme_ctrl_set_persistent
+.BI "(nvme_ctrl_t c " ","
+.BI "bool persistent " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.IP "persistent" 12
+value of the 'persistent' flag
+.SH "DESCRIPTION"
+Set the 'persistent' flag of \fIc\fP to \fIpersistent\fP
diff --git a/doc/man/nvme_ctrl_set_unique_discovery_ctrl.2 b/doc/man/nvme_ctrl_set_unique_discovery_ctrl.2
new file mode 100644
index 0000000..4de9b06
--- /dev/null
+++ b/doc/man/nvme_ctrl_set_unique_discovery_ctrl.2
@@ -0,0 +1,15 @@
+.TH "nvme_ctrl_set_unique_discovery_ctrl" 9 "nvme_ctrl_set_unique_discovery_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrl_set_unique_discovery_ctrl \- Set the 'unique_discovery_ctrl' flag
+.SH SYNOPSIS
+.B "void" nvme_ctrl_set_unique_discovery_ctrl
+.BI "(nvme_ctrl_t c " ","
+.BI "bool unique " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller to be modified
+.IP "unique" 12
+value of the unique_disc_ctrl flag
+.SH "DESCRIPTION"
+Sets the 'unique_discovery_ctrl' flag in \fIc\fP to specify wheter
+\fIc\fP is a unique discovery controller
diff --git a/doc/man/nvme_ctrls_filter.2 b/doc/man/nvme_ctrls_filter.2
new file mode 100644
index 0000000..bf31bc5
--- /dev/null
+++ b/doc/man/nvme_ctrls_filter.2
@@ -0,0 +1,11 @@
+.TH "nvme_ctrls_filter" 9 "nvme_ctrls_filter" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ctrls_filter \- Filter for controllers
+.SH SYNOPSIS
+.B "int" nvme_ctrls_filter
+.BI "(const struct dirent *d " ");"
+.SH ARGUMENTS
+.IP "d" 12
+dirent to check
+.SH "RETURN"
+1 if \fId\fP matches, 0 otherwise
diff --git a/doc/man/nvme_data_tfr.2 b/doc/man/nvme_data_tfr.2
new file mode 100644
index 0000000..c81767e
--- /dev/null
+++ b/doc/man/nvme_data_tfr.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvme_data_tfr" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_data_tfr \- Data transfer direction of the command
+.SH SYNOPSIS
+enum nvme_data_tfr {
+.br
+.BI " NVME_DATA_TFR_NO_DATA_TFR"
+,
+.br
+.br
+.BI " NVME_DATA_TFR_HOST_TO_CTRL"
+,
+.br
+.br
+.BI " NVME_DATA_TFR_CTRL_TO_HOST"
+,
+.br
+.br
+.BI " NVME_DATA_TFR_BIDIRECTIONAL"
+
+};
+.SH Constants
+.IP "NVME_DATA_TFR_NO_DATA_TFR" 12
+No data transfer
+.IP "NVME_DATA_TFR_HOST_TO_CTRL" 12
+Host to controller
+.IP "NVME_DATA_TFR_CTRL_TO_HOST" 12
+Controller to host
+.IP "NVME_DATA_TFR_BIDIRECTIONAL" 12
+Bidirectional
diff --git a/doc/man/nvme_default_host.2 b/doc/man/nvme_default_host.2
new file mode 100644
index 0000000..690fb56
--- /dev/null
+++ b/doc/man/nvme_default_host.2
@@ -0,0 +1,14 @@
+.TH "nvme_default_host" 9 "nvme_default_host" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_default_host \- Initializes the default host
+.SH SYNOPSIS
+.B "nvme_host_t" nvme_default_host
+.BI "(nvme_root_t r " ");"
+.SH ARGUMENTS
+.IP "r" 12
+\fInvme_root_t\fP object
+.SH "DESCRIPTION"
+Initializes the default host object based on the values in
+/etc/nvme/hostnqn and /etc/nvme/hostid and attaches it to \fIr\fP.
+.SH "RETURN"
+\fInvme_host_t\fP object
diff --git a/doc/man/nvme_dev_self_test.2 b/doc/man/nvme_dev_self_test.2
new file mode 100644
index 0000000..1458ded
--- /dev/null
+++ b/doc/man/nvme_dev_self_test.2
@@ -0,0 +1,23 @@
+.TH "nvme_dev_self_test" 9 "nvme_dev_self_test" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_dev_self_test \- Start or abort a self test
+.SH SYNOPSIS
+.B "int" nvme_dev_self_test
+.BI "(struct nvme_dev_self_test_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_dev_self_test\fP argument structure
+.SH "DESCRIPTION"
+The Device Self-test command starts a device self-test operation or abort a
+device self-test operation. A device self-test operation is a diagnostic
+testing sequence that tests the integrity and functionality of the
+controller and may include testing of the media associated with namespaces.
+The controller may return a response to this command immediately while
+running the self-test in the background.
+
+Set the 'nsid' field to 0 to not include namespaces in the test. Set to
+0xffffffff to test all namespaces. All other values tests a specific
+namespace, if present.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_directive_dtype.2 b/doc/man/nvme_directive_dtype.2
new file mode 100644
index 0000000..bab28cc
--- /dev/null
+++ b/doc/man/nvme_directive_dtype.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvme_directive_dtype" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_directive_dtype \- Directive Types
+.SH SYNOPSIS
+enum nvme_directive_dtype {
+.br
+.BI " NVME_DIRECTIVE_DTYPE_IDENTIFY"
+,
+.br
+.br
+.BI " NVME_DIRECTIVE_DTYPE_STREAMS"
+
+};
+.SH Constants
+.IP "NVME_DIRECTIVE_DTYPE_IDENTIFY" 12
+Identify directive type
+.IP "NVME_DIRECTIVE_DTYPE_STREAMS" 12
+Streams directive type
diff --git a/doc/man/nvme_directive_receive_doper.2 b/doc/man/nvme_directive_receive_doper.2
new file mode 100644
index 0000000..9d233ac
--- /dev/null
+++ b/doc/man/nvme_directive_receive_doper.2
@@ -0,0 +1,26 @@
+.TH "libnvme" 9 "enum nvme_directive_receive_doper" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_directive_receive_doper \- Directive Receive Directive Operation
+.SH SYNOPSIS
+enum nvme_directive_receive_doper {
+.br
+.BI " NVME_DIRECTIVE_RECEIVE_IDENTIFY_DOPER_PARAM"
+,
+.br
+.br
+.BI " NVME_DIRECTIVE_RECEIVE_STREAMS_DOPER_PARAM"
+,
+.br
+.br
+.BI " NVME_DIRECTIVE_RECEIVE_STREAMS_DOPER_STATUS"
+,
+.br
+.br
+.BI " NVME_DIRECTIVE_RECEIVE_STREAMS_DOPER_RESOURCE"
+
+};
+.SH Constants
+.IP "NVME_DIRECTIVE_RECEIVE_IDENTIFY_DOPER_PARAM" 12
+.IP "NVME_DIRECTIVE_RECEIVE_STREAMS_DOPER_PARAM" 12
+.IP "NVME_DIRECTIVE_RECEIVE_STREAMS_DOPER_STATUS" 12
+.IP "NVME_DIRECTIVE_RECEIVE_STREAMS_DOPER_RESOURCE" 12
diff --git a/doc/man/nvme_directive_recv.2 b/doc/man/nvme_directive_recv.2
new file mode 100644
index 0000000..6f657fe
--- /dev/null
+++ b/doc/man/nvme_directive_recv.2
@@ -0,0 +1,12 @@
+.TH "nvme_directive_recv" 9 "nvme_directive_recv" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_directive_recv \- Receive directive specific data
+.SH SYNOPSIS
+.B "int" nvme_directive_recv
+.BI "(struct nvme_directive_recv_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_directive_recv_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_directive_recv_identify_parameters.2 b/doc/man/nvme_directive_recv_identify_parameters.2
new file mode 100644
index 0000000..7e41fb1
--- /dev/null
+++ b/doc/man/nvme_directive_recv_identify_parameters.2
@@ -0,0 +1,18 @@
+.TH "nvme_directive_recv_identify_parameters" 9 "nvme_directive_recv_identify_parameters" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_directive_recv_identify_parameters \- Directive receive identifier parameters
+.SH SYNOPSIS
+.B "int" nvme_directive_recv_identify_parameters
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_id_directives *id " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace ID
+.IP "id" 12
+Identify parameters buffer
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_directive_recv_stream_allocate.2 b/doc/man/nvme_directive_recv_stream_allocate.2
new file mode 100644
index 0000000..657c699
--- /dev/null
+++ b/doc/man/nvme_directive_recv_stream_allocate.2
@@ -0,0 +1,21 @@
+.TH "nvme_directive_recv_stream_allocate" 9 "nvme_directive_recv_stream_allocate" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_directive_recv_stream_allocate \- Directive receive stream allocate
+.SH SYNOPSIS
+.B "int" nvme_directive_recv_stream_allocate
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "__u16 nsr " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace ID
+.IP "nsr" 12
+Namespace Streams Requested
+.IP "result" 12
+If successful, the CQE dword0 value
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_directive_recv_stream_parameters.2 b/doc/man/nvme_directive_recv_stream_parameters.2
new file mode 100644
index 0000000..512ea23
--- /dev/null
+++ b/doc/man/nvme_directive_recv_stream_parameters.2
@@ -0,0 +1,18 @@
+.TH "nvme_directive_recv_stream_parameters" 9 "nvme_directive_recv_stream_parameters" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_directive_recv_stream_parameters \- Directive receive stream parameters
+.SH SYNOPSIS
+.B "int" nvme_directive_recv_stream_parameters
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_streams_directive_params *parms " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace ID
+.IP "parms" 12
+Streams directive parameters buffer
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_directive_recv_stream_status.2 b/doc/man/nvme_directive_recv_stream_status.2
new file mode 100644
index 0000000..6052e55
--- /dev/null
+++ b/doc/man/nvme_directive_recv_stream_status.2
@@ -0,0 +1,21 @@
+.TH "nvme_directive_recv_stream_status" 9 "nvme_directive_recv_stream_status" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_directive_recv_stream_status \- Directive receive stream status
+.SH SYNOPSIS
+.B "int" nvme_directive_recv_stream_status
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "unsigned int nr_entries " ","
+.BI "struct nvme_streams_directive_status *id " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace ID
+.IP "nr_entries" 12
+Number of streams to receive
+.IP "id" 12
+Stream status buffer
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_directive_send.2 b/doc/man/nvme_directive_send.2
new file mode 100644
index 0000000..ae5e7c3
--- /dev/null
+++ b/doc/man/nvme_directive_send.2
@@ -0,0 +1,18 @@
+.TH "nvme_directive_send" 9 "nvme_directive_send" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_directive_send \- Send directive command
+.SH SYNOPSIS
+.B "int" nvme_directive_send
+.BI "(struct nvme_directive_send_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_directive_send_args\fP argument structure
+.SH "DESCRIPTION"
+Directives is a mechanism to enable host and NVM subsystem or controller
+information exchange. The Directive Send command transfers data related to a
+specific Directive Type from the host to the controller.
+
+See the NVMe specification for more information.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_directive_send_doper.2 b/doc/man/nvme_directive_send_doper.2
new file mode 100644
index 0000000..7ee960e
--- /dev/null
+++ b/doc/man/nvme_directive_send_doper.2
@@ -0,0 +1,21 @@
+.TH "libnvme" 9 "enum nvme_directive_send_doper" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_directive_send_doper \- Directive Send Directive Operation
+.SH SYNOPSIS
+enum nvme_directive_send_doper {
+.br
+.BI " NVME_DIRECTIVE_SEND_IDENTIFY_DOPER_ENDIR"
+,
+.br
+.br
+.BI " NVME_DIRECTIVE_SEND_STREAMS_DOPER_RELEASE_IDENTIFIER"
+,
+.br
+.br
+.BI " NVME_DIRECTIVE_SEND_STREAMS_DOPER_RELEASE_RESOURCE"
+
+};
+.SH Constants
+.IP "NVME_DIRECTIVE_SEND_IDENTIFY_DOPER_ENDIR" 12
+.IP "NVME_DIRECTIVE_SEND_STREAMS_DOPER_RELEASE_IDENTIFIER" 12
+.IP "NVME_DIRECTIVE_SEND_STREAMS_DOPER_RELEASE_RESOURCE" 12
diff --git a/doc/man/nvme_directive_send_id_endir.2 b/doc/man/nvme_directive_send_id_endir.2
new file mode 100644
index 0000000..3361c43
--- /dev/null
+++ b/doc/man/nvme_directive_send_id_endir.2
@@ -0,0 +1,24 @@
+.TH "nvme_directive_send_id_endir" 9 "nvme_directive_send_id_endir" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_directive_send_id_endir \- Directive Send Enable Directive
+.SH SYNOPSIS
+.B "int" nvme_directive_send_id_endir
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "bool endir " ","
+.BI "enum nvme_directive_dtype dtype " ","
+.BI "struct nvme_id_directives *id " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace Identifier
+.IP "endir" 12
+Enable Directive
+.IP "dtype" 12
+Directive Type
+.IP "id" 12
+Pointer to structure nvme_id_directives
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_directive_send_identify_endir.2 b/doc/man/nvme_directive_send_identify_endir.2
new file mode 100644
index 0000000..75ae651
--- /dev/null
+++ b/doc/man/nvme_directive_send_identify_endir.2
@@ -0,0 +1,16 @@
+.TH "libnvme" 9 "enum nvme_directive_send_identify_endir" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_directive_send_identify_endir \- Enable Directive
+.SH SYNOPSIS
+enum nvme_directive_send_identify_endir {
+.br
+.BI " NVME_DIRECTIVE_SEND_IDENTIFY_ENDIR_DISABLE"
+,
+.br
+.br
+.BI " NVME_DIRECTIVE_SEND_IDENTIFY_ENDIR_ENABLE"
+
+};
+.SH Constants
+.IP "NVME_DIRECTIVE_SEND_IDENTIFY_ENDIR_DISABLE" 12
+.IP "NVME_DIRECTIVE_SEND_IDENTIFY_ENDIR_ENABLE" 12
diff --git a/doc/man/nvme_directive_send_stream_release_identifier.2 b/doc/man/nvme_directive_send_stream_release_identifier.2
new file mode 100644
index 0000000..fccafe4
--- /dev/null
+++ b/doc/man/nvme_directive_send_stream_release_identifier.2
@@ -0,0 +1,18 @@
+.TH "nvme_directive_send_stream_release_identifier" 9 "nvme_directive_send_stream_release_identifier" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_directive_send_stream_release_identifier \- Directive Send Stream release
+.SH SYNOPSIS
+.B "int" nvme_directive_send_stream_release_identifier
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "__u16 stream_id " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace ID
+.IP "stream_id" 12
+Stream identifier
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_directive_send_stream_release_resource.2 b/doc/man/nvme_directive_send_stream_release_resource.2
new file mode 100644
index 0000000..d74c93a
--- /dev/null
+++ b/doc/man/nvme_directive_send_stream_release_resource.2
@@ -0,0 +1,15 @@
+.TH "nvme_directive_send_stream_release_resource" 9 "nvme_directive_send_stream_release_resource" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_directive_send_stream_release_resource \- Directive Send Stream release resources
+.SH SYNOPSIS
+.B "int" nvme_directive_send_stream_release_resource
+.BI "(int fd " ","
+.BI "__u32 nsid " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace ID
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_directive_types.2 b/doc/man/nvme_directive_types.2
new file mode 100644
index 0000000..5557800
--- /dev/null
+++ b/doc/man/nvme_directive_types.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvme_directive_types" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_directive_types \- Directives Supported or Enabled
+.SH SYNOPSIS
+enum nvme_directive_types {
+.br
+.BI " NVME_ID_DIR_ID_BIT"
+,
+.br
+.br
+.BI " NVME_ID_DIR_SD_BIT"
+
+};
+.SH Constants
+.IP "NVME_ID_DIR_ID_BIT" 12
+Identify directive is supported
+.IP "NVME_ID_DIR_SD_BIT" 12
+Streams directive is supported
diff --git a/doc/man/nvme_disconnect_ctrl.2 b/doc/man/nvme_disconnect_ctrl.2
new file mode 100644
index 0000000..03adb3d
--- /dev/null
+++ b/doc/man/nvme_disconnect_ctrl.2
@@ -0,0 +1,13 @@
+.TH "nvme_disconnect_ctrl" 9 "nvme_disconnect_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_disconnect_ctrl \- Disconnect a controller
+.SH SYNOPSIS
+.B "int" nvme_disconnect_ctrl
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.SH "DESCRIPTION"
+Issues a 'disconnect' fabrics command to \fIc\fP
+.SH "RETURN"
+0 on success, -1 on failure.
diff --git a/doc/man/nvme_dsm.2 b/doc/man/nvme_dsm.2
new file mode 100644
index 0000000..52d1d78
--- /dev/null
+++ b/doc/man/nvme_dsm.2
@@ -0,0 +1,18 @@
+.TH "nvme_dsm" 9 "nvme_dsm" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_dsm \- Send an nvme data set management command
+.SH SYNOPSIS
+.B "int" nvme_dsm
+.BI "(struct nvme_dsm_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_dsm_args\fP argument structure
+.SH "DESCRIPTION"
+The Dataset Management command is used by the host to indicate attributes
+for ranges of logical blocks. This includes attributes like frequency that
+data is read or written, access size, and other information that may be used
+to optimize performance and reliability, and may be used to
+deallocate/unmap/trim those logical blocks.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_dsm_attributes.2 b/doc/man/nvme_dsm_attributes.2
new file mode 100644
index 0000000..d4d1195
--- /dev/null
+++ b/doc/man/nvme_dsm_attributes.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "enum nvme_dsm_attributes" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_dsm_attributes \- Dataset Management attributes
+.SH SYNOPSIS
+enum nvme_dsm_attributes {
+.br
+.BI " NVME_DSMGMT_IDR"
+,
+.br
+.br
+.BI " NVME_DSMGMT_IDW"
+,
+.br
+.br
+.BI " NVME_DSMGMT_AD"
+
+};
+.SH Constants
+.IP "NVME_DSMGMT_IDR" 12
+Attribute -Integral Dataset for Read
+.IP "NVME_DSMGMT_IDW" 12
+Attribute - Integral Dataset for Write
+.IP "NVME_DSMGMT_AD" 12
+Attribute - Deallocate
diff --git a/doc/man/nvme_dsm_range.2 b/doc/man/nvme_dsm_range.2
new file mode 100644
index 0000000..c8f1e66
--- /dev/null
+++ b/doc/man/nvme_dsm_range.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_dsm_range" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_dsm_range \- Dataset Management - Range Definition
+.SH SYNOPSIS
+struct nvme_dsm_range {
+.br
+.BI " __le32 cattr;"
+.br
+.BI " __le32 nlb;"
+.br
+.BI " __le64 slba;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "cattr" 12
+Context Attributes
+.IP "nlb" 12
+Length in logical blocks
+.IP "slba" 12
+Starting LBA
diff --git a/doc/man/nvme_dst_stc.2 b/doc/man/nvme_dst_stc.2
new file mode 100644
index 0000000..4d6f7d7
--- /dev/null
+++ b/doc/man/nvme_dst_stc.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvme_dst_stc" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_dst_stc \- Action taken by the Device Self-test command
+.SH SYNOPSIS
+enum nvme_dst_stc {
+.br
+.BI " NVME_DST_STC_SHORT"
+,
+.br
+.br
+.BI " NVME_DST_STC_LONG"
+,
+.br
+.br
+.BI " NVME_DST_STC_VS"
+,
+.br
+.br
+.BI " NVME_DST_STC_ABORT"
+
+};
+.SH Constants
+.IP "NVME_DST_STC_SHORT" 12
+Start a short device self-test operation
+.IP "NVME_DST_STC_LONG" 12
+Start an extended device self-test operation
+.IP "NVME_DST_STC_VS" 12
+Start a vendor specific device self-test operation
+.IP "NVME_DST_STC_ABORT" 12
+Abort device self-test operation
diff --git a/doc/man/nvme_dump_config.2 b/doc/man/nvme_dump_config.2
new file mode 100644
index 0000000..3a6222c
--- /dev/null
+++ b/doc/man/nvme_dump_config.2
@@ -0,0 +1,14 @@
+.TH "nvme_dump_config" 9 "nvme_dump_config" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_dump_config \- Print the JSON configuration
+.SH SYNOPSIS
+.B "int" nvme_dump_config
+.BI "(nvme_root_t r " ");"
+.SH ARGUMENTS
+.IP "r" 12
+nvme_root_t object
+.SH "DESCRIPTION"
+Prints the current contents of the JSON configuration
+file to stdout.
+.SH "RETURN"
+0 on success, -1 on failure.
diff --git a/doc/man/nvme_dump_tree.2 b/doc/man/nvme_dump_tree.2
new file mode 100644
index 0000000..71925ec
--- /dev/null
+++ b/doc/man/nvme_dump_tree.2
@@ -0,0 +1,14 @@
+.TH "nvme_dump_tree" 9 "nvme_dump_tree" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_dump_tree \- Dump internal object tree
+.SH SYNOPSIS
+.B "int" nvme_dump_tree
+.BI "(nvme_root_t r " ");"
+.SH ARGUMENTS
+.IP "r" 12
+nvme_root_t object
+.SH "DESCRIPTION"
+Prints the internal object tree in JSON format
+to stdout.
+.SH "RETURN"
+0 on success, -1 on failure.
diff --git a/doc/man/nvme_eg_critical_warning_flags.2 b/doc/man/nvme_eg_critical_warning_flags.2
new file mode 100644
index 0000000..08a5f7c
--- /dev/null
+++ b/doc/man/nvme_eg_critical_warning_flags.2
@@ -0,0 +1,26 @@
+.TH "libnvme" 9 "enum nvme_eg_critical_warning_flags" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_eg_critical_warning_flags \- Endurance Group Information Log - Critical Warning
+.SH SYNOPSIS
+enum nvme_eg_critical_warning_flags {
+.br
+.BI " NVME_EG_CRITICAL_WARNING_SPARE"
+,
+.br
+.br
+.BI " NVME_EG_CRITICAL_WARNING_DEGRADED"
+,
+.br
+.br
+.BI " NVME_EG_CRITICAL_WARNING_READ_ONLY"
+
+};
+.SH Constants
+.IP "NVME_EG_CRITICAL_WARNING_SPARE" 12
+Available spare capacity of the Endurance Group
+has fallen below the threshold
+.IP "NVME_EG_CRITICAL_WARNING_DEGRADED" 12
+Endurance Group reliability has been degraded
+.IP "NVME_EG_CRITICAL_WARNING_READ_ONLY" 12
+Endurance Group have been placed in read only
+mode
diff --git a/doc/man/nvme_eg_event_aggregate_log.2 b/doc/man/nvme_eg_event_aggregate_log.2
new file mode 100644
index 0000000..aacfeba
--- /dev/null
+++ b/doc/man/nvme_eg_event_aggregate_log.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_eg_event_aggregate_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_eg_event_aggregate_log \- Endurance Group Event Aggregate
+.SH SYNOPSIS
+struct nvme_eg_event_aggregate_log {
+.br
+.BI " __le64 nr_entries;"
+.br
+.BI " __le16 egids[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nr_entries" 12
+Number of Entries
+.IP "egids" 12
+Endurance Group Identifier
diff --git a/doc/man/nvme_end_grp_chan_desc.2 b/doc/man/nvme_end_grp_chan_desc.2
new file mode 100644
index 0000000..acc3f0b
--- /dev/null
+++ b/doc/man/nvme_end_grp_chan_desc.2
@@ -0,0 +1,20 @@
+.TH "libnvme" 9 "struct nvme_end_grp_chan_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_end_grp_chan_desc \- Endurance Group Channel Configuration Descriptor
+.SH SYNOPSIS
+struct nvme_end_grp_chan_desc {
+.br
+.BI " __le16 egchans;"
+.br
+.BI " struct nvme_channel_config_desc chan_config_desc[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "egchans" 12
+Number of Channels
+.IP "chan_config_desc" 12
+Channel config descriptors.
+See \fIstruct\fP nvme_channel_config_desc
diff --git a/doc/man/nvme_end_grp_config_desc.2 b/doc/man/nvme_end_grp_config_desc.2
new file mode 100644
index 0000000..05b3319
--- /dev/null
+++ b/doc/man/nvme_end_grp_config_desc.2
@@ -0,0 +1,47 @@
+.TH "libnvme" 9 "struct nvme_end_grp_config_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_end_grp_config_desc \- Endurance Group Configuration Descriptor
+.SH SYNOPSIS
+struct nvme_end_grp_config_desc {
+.br
+.BI " __le16 endgid;"
+.br
+.BI " __le16 cap_adj_factor;"
+.br
+.BI " __u8 rsvd4[12];"
+.br
+.BI " __u8 tegcap[16];"
+.br
+.BI " __u8 segcap[16];"
+.br
+.BI " __u8 end_est[16];"
+.br
+.BI " __u8 rsvd64[16];"
+.br
+.BI " __le16 egsets;"
+.br
+.BI " __le16 nvmsetid[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "endgid" 12
+Endurance Group Identifier
+.IP "cap_adj_factor" 12
+Capacity Adjustment Factor
+.IP "rsvd4" 12
+Reserved
+.IP "tegcap" 12
+Total Endurance Group Capacity
+.IP "segcap" 12
+Spare Endurance Group Capacity
+.IP "end_est" 12
+Endurance Estimate
+.IP "rsvd64" 12
+Reserved
+.IP "egsets" 12
+Number of NVM Sets
+.IP "nvmsetid" 12
+NVM Set Identifier
diff --git a/doc/man/nvme_endurance_group_log.2 b/doc/man/nvme_endurance_group_log.2
new file mode 100644
index 0000000..af07a02
--- /dev/null
+++ b/doc/man/nvme_endurance_group_log.2
@@ -0,0 +1,71 @@
+.TH "libnvme" 9 "struct nvme_endurance_group_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_endurance_group_log \- Endurance Group Information Log
+.SH SYNOPSIS
+struct nvme_endurance_group_log {
+.br
+.BI " __u8 critical_warning;"
+.br
+.BI " __u8 rsvd1[2];"
+.br
+.BI " __u8 avl_spare;"
+.br
+.BI " __u8 avl_spare_threshold;"
+.br
+.BI " __u8 percent_used;"
+.br
+.BI " __u8 rsvd6[26];"
+.br
+.BI " __u8 endurance_estimate[16];"
+.br
+.BI " __u8 data_units_read[16];"
+.br
+.BI " __u8 data_units_written[16];"
+.br
+.BI " __u8 media_units_written[16];"
+.br
+.BI " __u8 host_read_cmds[16];"
+.br
+.BI " __u8 host_write_cmds[16];"
+.br
+.BI " __u8 media_data_integrity_err[16];"
+.br
+.BI " __u8 num_err_info_log_entries[16];"
+.br
+.BI " __u8 rsvd160[352];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "critical_warning" 12
+Critical Warning
+.IP "rsvd1" 12
+Reserved
+.IP "avl_spare" 12
+Available Spare
+.IP "avl_spare_threshold" 12
+Available Spare Threshold
+.IP "percent_used" 12
+Percentage Used
+.IP "rsvd6" 12
+Reserved
+.IP "endurance_estimate" 12
+Endurance Estimate
+.IP "data_units_read" 12
+Data Units Read
+.IP "data_units_written" 12
+Data Units Written
+.IP "media_units_written" 12
+Media Units Written
+.IP "host_read_cmds" 12
+Host Read Commands
+.IP "host_write_cmds" 12
+Host Write Commands
+.IP "media_data_integrity_err" 12
+Media and Data Integrity Errors
+.IP "num_err_info_log_entries" 12
+Number of Error Information Log Entries
+.IP "rsvd160" 12
+Reserved
diff --git a/doc/man/nvme_errno_to_string.2 b/doc/man/nvme_errno_to_string.2
new file mode 100644
index 0000000..f303d52
--- /dev/null
+++ b/doc/man/nvme_errno_to_string.2
@@ -0,0 +1,11 @@
+.TH "nvme_errno_to_string" 9 "nvme_errno_to_string" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_errno_to_string \- Returns string describing nvme connect failures
+.SH SYNOPSIS
+.B "const char *" nvme_errno_to_string
+.BI "(int err " ");"
+.SH ARGUMENTS
+.IP "err" 12
+Returned error code from \fBnvme_add_ctrl\fP
+.SH "RETURN"
+String representation of the nvme connect error codes
diff --git a/doc/man/nvme_error_log_page.2 b/doc/man/nvme_error_log_page.2
new file mode 100644
index 0000000..7e727ef
--- /dev/null
+++ b/doc/man/nvme_error_log_page.2
@@ -0,0 +1,109 @@
+.TH "libnvme" 9 "struct nvme_error_log_page" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_error_log_page \- Error Information Log Entry (Log Identifier 01h)
+.SH SYNOPSIS
+struct nvme_error_log_page {
+.br
+.BI " __le64 error_count;"
+.br
+.BI " __le16 sqid;"
+.br
+.BI " __le16 cmdid;"
+.br
+.BI " __le16 status_field;"
+.br
+.BI " __le16 parm_error_location;"
+.br
+.BI " __le64 lba;"
+.br
+.BI " __le32 nsid;"
+.br
+.BI " __u8 vs;"
+.br
+.BI " __u8 trtype;"
+.br
+.BI " __u8 rsvd[2];"
+.br
+.BI " __le64 cs;"
+.br
+.BI " __le16 trtype_spec_info;"
+.br
+.BI " __u8 rsvd2[22];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "error_count" 12
+Error Count: a 64-bit incrementing error count,
+indicating a unique identifier for this error. The error
+count starts at 1h, is incremented for each unique error
+log entry, and is retained across power off conditions.
+A value of 0h indicates an invalid entry; this value
+is used when there are lost entries or when there are
+fewer errors than the maximum number of entries the
+controller supports. If the value of this field is
+FFFFFFFFh, then the field shall be set to 1h when
+incremented (i.e., rolls over to 1h). Prior to NVMe
+1.4, processing of incrementing beyond FFFFFFFFh is
+unspecified.
+.IP "sqid" 12
+Submission Queue ID: indicates the Submission Queue
+Identifier of the command that the error information is
+associated with. If the error is not specific to
+a particular command, then this field shall be set to
+FFFFh.
+.IP "cmdid" 12
+Command ID: indicates the Command Identifier of the
+command that the error is associated with. If the error
+is not specific to a particular command, then this field
+shall be set to FFFFh.
+.IP "status_field" 12
+Bits 15-1: Status Field: indicates the Status Field for
+the command that completed. If the error is not specific
+to a particular command, then this field reports the most
+applicable status value.
+Bit 0: Phase Tag: may indicate the Phase Tag posted for
+the command.
+.IP "parm_error_location" 12
+Parameter Error Location: indicates the byte and bit of
+the command parameter that the error is associated with,
+if applicable. If the parameter spans multiple bytes or
+bits, then the location indicates the first byte and bit
+of the parameter.
+Bits 10-8: Bit in command that contained the error.
+Valid values are 0 to 7.
+Bits 7-0: Byte in command that contained the error.
+Valid values are 0 to 63.
+.IP "lba" 12
+LBA: This field indicates the first LBA that experienced
+the error condition, if applicable.
+.IP "nsid" 12
+Namespace: This field indicates the NSID of the namespace
+that the error is associated with, if applicable.
+.IP "vs" 12
+Vendor Specific Information Available: If there is
+additional vendor specific error information available,
+this field provides the log page identifier associated
+with that page. A value of 0h indicates that no additional
+information is available. Valid values are in the range
+of 80h to FFh.
+.IP "trtype" 12
+Transport Type (TRTYPE): indicates the Transport Type of
+the transport associated with the error. The values in
+this field are the same as the TRTYPE values in the
+Discovery Log Page Entry. If the error is not transport
+related, this field shall be cleared to 0h. If the error
+is transport related, this field shall be set to the type
+of the transport - see \fIenum nvme_trtype\fP.
+.IP "rsvd" 12
+Reserved
+.IP "cs" 12
+Command Specific Information: This field contains command
+specific information. If used, the command definition
+specifies the information returned.
+.IP "trtype_spec_info" 12
+Transport Type Specific Information
+.IP "rsvd2" 12
+Reserved
diff --git a/doc/man/nvme_fabrics_config.2 b/doc/man/nvme_fabrics_config.2
new file mode 100644
index 0000000..24c4f6e
--- /dev/null
+++ b/doc/man/nvme_fabrics_config.2
@@ -0,0 +1,75 @@
+.TH "libnvme" 9 "struct nvme_fabrics_config" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_fabrics_config \- Defines all linux nvme fabrics initiator options
+.SH SYNOPSIS
+struct nvme_fabrics_config {
+.br
+.BI " char *host_traddr;"
+.br
+.BI " char *host_iface;"
+.br
+.BI " int queue_size;"
+.br
+.BI " int nr_io_queues;"
+.br
+.BI " int reconnect_delay;"
+.br
+.BI " int ctrl_loss_tmo;"
+.br
+.BI " int fast_io_fail_tmo;"
+.br
+.BI " int keep_alive_tmo;"
+.br
+.BI " int nr_write_queues;"
+.br
+.BI " int nr_poll_queues;"
+.br
+.BI " int tos;"
+.br
+.BI " bool duplicate_connect;"
+.br
+.BI " bool disable_sqflow;"
+.br
+.BI " bool hdr_digest;"
+.br
+.BI " bool data_digest;"
+.br
+.BI " bool tls;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "host_traddr" 12
+Host transport address
+.IP "host_iface" 12
+Host interface name
+.IP "queue_size" 12
+Number of IO queue entries
+.IP "nr_io_queues" 12
+Number of controller IO queues to establish
+.IP "reconnect_delay" 12
+Time between two consecutive reconnect attempts.
+.IP "ctrl_loss_tmo" 12
+Override the default controller reconnect attempt timeout in seconds
+.IP "fast_io_fail_tmo" 12
+Set the fast I/O fail timeout in seconds.
+.IP "keep_alive_tmo" 12
+Override the default keep-alive-timeout to this value in seconds
+.IP "nr_write_queues" 12
+Number of queues to use for exclusively for writing
+.IP "nr_poll_queues" 12
+Number of queues to reserve for polling completions
+.IP "tos" 12
+Type of service
+.IP "duplicate_connect" 12
+Allow multiple connections to the same target
+.IP "disable_sqflow" 12
+Disable controller sq flow control
+.IP "hdr_digest" 12
+Generate/verify header digest (TCP)
+.IP "data_digest" 12
+Generate/verify data digest (TCP)
+.IP "tls" 12
+Start TLS on the connection (TCP)
diff --git a/doc/man/nvme_fctype.2 b/doc/man/nvme_fctype.2
new file mode 100644
index 0000000..8d186cc
--- /dev/null
+++ b/doc/man/nvme_fctype.2
@@ -0,0 +1,42 @@
+.TH "libnvme" 9 "enum nvme_fctype" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_fctype \- Fabrics Command Types
+.SH SYNOPSIS
+enum nvme_fctype {
+.br
+.BI " nvme_fabrics_type_property_set"
+,
+.br
+.br
+.BI " nvme_fabrics_type_connect"
+,
+.br
+.br
+.BI " nvme_fabrics_type_property_get"
+,
+.br
+.br
+.BI " nvme_fabrics_type_auth_send"
+,
+.br
+.br
+.BI " nvme_fabrics_type_auth_receive"
+,
+.br
+.br
+.BI " nvme_fabrics_type_disconnect"
+
+};
+.SH Constants
+.IP "nvme_fabrics_type_property_set" 12
+Property set
+.IP "nvme_fabrics_type_connect" 12
+Connect
+.IP "nvme_fabrics_type_property_get" 12
+Property Get
+.IP "nvme_fabrics_type_auth_send" 12
+Authentication Send
+.IP "nvme_fabrics_type_auth_receive" 12
+Authentication Receive
+.IP "nvme_fabrics_type_disconnect" 12
+Disconnect
diff --git a/doc/man/nvme_fdp_config_desc.2 b/doc/man/nvme_fdp_config_desc.2
new file mode 100644
index 0000000..3bbcbca
--- /dev/null
+++ b/doc/man/nvme_fdp_config_desc.2
@@ -0,0 +1,55 @@
+.TH "libnvme" 9 "struct nvme_fdp_config_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_fdp_config_desc \- FDP Configuration Descriptor
+.SH SYNOPSIS
+struct nvme_fdp_config_desc {
+.br
+.BI " __u16 size;"
+.br
+.BI " __u8 fdpa;"
+.br
+.BI " __u8 vss;"
+.br
+.BI " __u32 nrg;"
+.br
+.BI " __u16 nruh;"
+.br
+.BI " __u16 maxpids;"
+.br
+.BI " __u32 nnss;"
+.br
+.BI " __u64 runs;"
+.br
+.BI " __u32 erutl;"
+.br
+.BI " __u8 rsvd28[36];"
+.br
+.BI " struct nvme_fdp_ruh_desc ruhs[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "size" 12
+Descriptor size
+.IP "fdpa" 12
+FDP Attributes (\fIenum nvme_fdp_config_fdpa\fP)
+.IP "vss" 12
+Vendor Specific Size
+.IP "nrg" 12
+Number of Reclaim Groups
+.IP "nruh" 12
+Number of Reclaim Unit Handles
+.IP "maxpids" 12
+Max Placement Identifiers
+.IP "nnss" 12
+Number of Namespaces Supported
+.IP "runs" 12
+Reclaim Unit Nominal Size
+.IP "erutl" 12
+Estimated Reclaim Unit Time Limit
+.IP "rsvd28" 12
+Reserved
+.IP "ruhs" 12
+Reclaim Unit Handle descriptors (\fIstruct nvme_fdp_ruh_desc\fP)
diff --git a/doc/man/nvme_fdp_config_fdpa.2 b/doc/man/nvme_fdp_config_fdpa.2
new file mode 100644
index 0000000..2a92b4a
--- /dev/null
+++ b/doc/man/nvme_fdp_config_fdpa.2
@@ -0,0 +1,42 @@
+.TH "libnvme" 9 "enum nvme_fdp_config_fdpa" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_fdp_config_fdpa \- FDP Attributes
+.SH SYNOPSIS
+enum nvme_fdp_config_fdpa {
+.br
+.BI " NVME_FDP_CONFIG_FDPA_RGIF_SHIFT"
+,
+.br
+.br
+.BI " NVME_FDP_CONFIG_FDPA_RGIF_MASK"
+,
+.br
+.br
+.BI " NVME_FDP_CONFIG_FDPA_FDPVWC_SHIFT"
+,
+.br
+.br
+.BI " NVME_FDP_CONFIG_FDPA_FDPVWC_MASK"
+,
+.br
+.br
+.BI " NVME_FDP_CONFIG_FDPA_VALID_SHIFT"
+,
+.br
+.br
+.BI " NVME_FDP_CONFIG_FDPA_VALID_MASK"
+
+};
+.SH Constants
+.IP "NVME_FDP_CONFIG_FDPA_RGIF_SHIFT" 12
+Reclaim Group Identifier Format Shift
+.IP "NVME_FDP_CONFIG_FDPA_RGIF_MASK" 12
+Reclaim Group Identifier Format Mask
+.IP "NVME_FDP_CONFIG_FDPA_FDPVWC_SHIFT" 12
+FDP Volatile Write Cache Shift
+.IP "NVME_FDP_CONFIG_FDPA_FDPVWC_MASK" 12
+FDP Volatile Write Cache Mask
+.IP "NVME_FDP_CONFIG_FDPA_VALID_SHIFT" 12
+FDP Configuration Valid Shift
+.IP "NVME_FDP_CONFIG_FDPA_VALID_MASK" 12
+FDP Configuration Valid Mask
diff --git a/doc/man/nvme_fdp_config_log.2 b/doc/man/nvme_fdp_config_log.2
new file mode 100644
index 0000000..5111b7a
--- /dev/null
+++ b/doc/man/nvme_fdp_config_log.2
@@ -0,0 +1,35 @@
+.TH "libnvme" 9 "struct nvme_fdp_config_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_fdp_config_log \- FDP Configurations Log Page
+.SH SYNOPSIS
+struct nvme_fdp_config_log {
+.br
+.BI " __u16 n;"
+.br
+.BI " __u8 version;"
+.br
+.BI " __u8 rsvd3;"
+.br
+.BI " __u32 size;"
+.br
+.BI " __u8 rsvd8[8];"
+.br
+.BI " struct nvme_fdp_config_desc configs[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "n" 12
+Number of FDP Configurations
+.IP "version" 12
+Log page version
+.IP "rsvd3" 12
+Reserved
+.IP "size" 12
+Log page size in bytes
+.IP "rsvd8" 12
+Reserved
+.IP "configs" 12
+FDP Configuration descriptors (\fIstruct nvme_fdp_config_desc\fP)
diff --git a/doc/man/nvme_fdp_event.2 b/doc/man/nvme_fdp_event.2
new file mode 100644
index 0000000..2178f44
--- /dev/null
+++ b/doc/man/nvme_fdp_event.2
@@ -0,0 +1,51 @@
+.TH "libnvme" 9 "struct nvme_fdp_event" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_fdp_event \- FDP Event
+.SH SYNOPSIS
+struct nvme_fdp_event {
+.br
+.BI " __u8 type;"
+.br
+.BI " __u8 flags;"
+.br
+.BI " __u16 pid;"
+.br
+.BI " struct nvme_timestamp ts;"
+.br
+.BI " __u32 nsid;"
+.br
+.BI " __u8 type_specific[16];"
+.br
+.BI " __u16 rgid;"
+.br
+.BI " __u8 ruhid;"
+.br
+.BI " __u8 rsvd35[5];"
+.br
+.BI " __u8 vs[24];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "type" 12
+Event Type (\fIenum nvme_fdp_event_type\fP)
+.IP "flags" 12
+Event Flags (\fIenum nvme_fdp_event_flags\fP)
+.IP "pid" 12
+Placement Identifier
+.IP "ts" 12
+Timestamp
+.IP "nsid" 12
+Namespace Identifier
+.IP "type_specific" 12
+Event Type Specific Information
+.IP "rgid" 12
+Reclaim Group Identifier
+.IP "ruhid" 12
+Reclaim Unit Handle Identifier
+.IP "rsvd35" 12
+Reserved
+.IP "vs" 12
+Vendor Specific
diff --git a/doc/man/nvme_fdp_event_flags.2 b/doc/man/nvme_fdp_event_flags.2
new file mode 100644
index 0000000..1bad4b6
--- /dev/null
+++ b/doc/man/nvme_fdp_event_flags.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "enum nvme_fdp_event_flags" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_fdp_event_flags \- FDP Event Flags
+.SH SYNOPSIS
+enum nvme_fdp_event_flags {
+.br
+.BI " NVME_FDP_EVENT_F_PIV"
+,
+.br
+.br
+.BI " NVME_FDP_EVENT_F_NSIDV"
+,
+.br
+.br
+.BI " NVME_FDP_EVENT_F_LV"
+
+};
+.SH Constants
+.IP "NVME_FDP_EVENT_F_PIV" 12
+Placement Identifier Valid
+.IP "NVME_FDP_EVENT_F_NSIDV" 12
+Namespace Identifier Valid
+.IP "NVME_FDP_EVENT_F_LV" 12
+Location Valid
diff --git a/doc/man/nvme_fdp_event_realloc.2 b/doc/man/nvme_fdp_event_realloc.2
new file mode 100644
index 0000000..fbd1cfe
--- /dev/null
+++ b/doc/man/nvme_fdp_event_realloc.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "struct nvme_fdp_event_realloc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_fdp_event_realloc \- Media Reallocated Event Type Specific Information
+.SH SYNOPSIS
+struct nvme_fdp_event_realloc {
+.br
+.BI " __u8 flags;"
+.br
+.BI " __u8 rsvd1;"
+.br
+.BI " __u16 nlbam;"
+.br
+.BI " __u64 lba;"
+.br
+.BI " __u8 rsvd12[4];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "flags" 12
+Event Type Specific flags (\fIenum nvme_fdp_event_realloc_flags\fP)
+.IP "rsvd1" 12
+Reserved
+.IP "nlbam" 12
+Number of LBAs Moved
+.IP "lba" 12
+Logical Block Address
+.IP "rsvd12" 12
+Reserved
diff --git a/doc/man/nvme_fdp_event_realloc_flags.2 b/doc/man/nvme_fdp_event_realloc_flags.2
new file mode 100644
index 0000000..8ecee78
--- /dev/null
+++ b/doc/man/nvme_fdp_event_realloc_flags.2
@@ -0,0 +1,12 @@
+.TH "libnvme" 9 "enum nvme_fdp_event_realloc_flags" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_fdp_event_realloc_flags \- Media Reallocated Event Type Specific Flags
+.SH SYNOPSIS
+enum nvme_fdp_event_realloc_flags {
+.br
+.BI " NVME_FDP_EVENT_REALLOC_F_LBAV"
+
+};
+.SH Constants
+.IP "NVME_FDP_EVENT_REALLOC_F_LBAV" 12
+LBA Valid
diff --git a/doc/man/nvme_fdp_event_type.2 b/doc/man/nvme_fdp_event_type.2
new file mode 100644
index 0000000..1ef2849
--- /dev/null
+++ b/doc/man/nvme_fdp_event_type.2
@@ -0,0 +1,42 @@
+.TH "libnvme" 9 "enum nvme_fdp_event_type" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_fdp_event_type \- FDP Event Types
+.SH SYNOPSIS
+enum nvme_fdp_event_type {
+.br
+.BI " NVME_FDP_EVENT_RUNFW"
+,
+.br
+.br
+.BI " NVME_FDP_EVENT_RUTLE"
+,
+.br
+.br
+.BI " NVME_FDP_EVENT_RESET"
+,
+.br
+.br
+.BI " NVME_FDP_EVENT_PID"
+,
+.br
+.br
+.BI " NVME_FDP_EVENT_REALLOC"
+,
+.br
+.br
+.BI " NVME_FDP_EVENT_MODIFY"
+
+};
+.SH Constants
+.IP "NVME_FDP_EVENT_RUNFW" 12
+Reclaim Unit Not Fully Written
+.IP "NVME_FDP_EVENT_RUTLE" 12
+Reclaim Unit Time Limit Exceeded
+.IP "NVME_FDP_EVENT_RESET" 12
+Controller Level Reset Modified Reclaim Unit Handles
+.IP "NVME_FDP_EVENT_PID" 12
+Invalid Placement Identifier
+.IP "NVME_FDP_EVENT_REALLOC" 12
+Media Reallocated
+.IP "NVME_FDP_EVENT_MODIFY" 12
+Implicitly Modified Reclaim Unit Handle
diff --git a/doc/man/nvme_fdp_events_log.2 b/doc/man/nvme_fdp_events_log.2
new file mode 100644
index 0000000..c4cec83
--- /dev/null
+++ b/doc/man/nvme_fdp_events_log.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_fdp_events_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_fdp_events_log \- FDP Events Log Page
+.SH SYNOPSIS
+struct nvme_fdp_events_log {
+.br
+.BI " __u32 n;"
+.br
+.BI " __u8 rsvd4[60];"
+.br
+.BI " struct nvme_fdp_event events[63];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "n" 12
+Number of FDP Events
+.IP "rsvd4" 12
+Reserved
+.IP "events" 12
+FDP Events (\fIstruct nvme_fdp_event\fP)
diff --git a/doc/man/nvme_fdp_reclaim_unit_handle_status.2 b/doc/man/nvme_fdp_reclaim_unit_handle_status.2
new file mode 100644
index 0000000..138405d
--- /dev/null
+++ b/doc/man/nvme_fdp_reclaim_unit_handle_status.2
@@ -0,0 +1,21 @@
+.TH "nvme_fdp_reclaim_unit_handle_status" 9 "nvme_fdp_reclaim_unit_handle_status" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_fdp_reclaim_unit_handle_status \- Get reclaim unit handle status
+.SH SYNOPSIS
+.B "int" nvme_fdp_reclaim_unit_handle_status
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "__u32 data_len " ","
+.BI "void *data " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace identifier
+.IP "data_len" 12
+Length of response buffer
+.IP "data" 12
+Response buffer
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_fdp_reclaim_unit_handle_update.2 b/doc/man/nvme_fdp_reclaim_unit_handle_update.2
new file mode 100644
index 0000000..1869f67
--- /dev/null
+++ b/doc/man/nvme_fdp_reclaim_unit_handle_update.2
@@ -0,0 +1,21 @@
+.TH "nvme_fdp_reclaim_unit_handle_update" 9 "nvme_fdp_reclaim_unit_handle_update" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_fdp_reclaim_unit_handle_update \- Update a list of reclaim unit handles
+.SH SYNOPSIS
+.B "int" nvme_fdp_reclaim_unit_handle_update
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "unsigned int npids " ","
+.BI "__u16 *pids " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace identifier
+.IP "npids" 12
+Number of placement identifiers
+.IP "pids" 12
+List of placement identifiers
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_fdp_ruh_desc.2 b/doc/man/nvme_fdp_ruh_desc.2
new file mode 100644
index 0000000..77969b3
--- /dev/null
+++ b/doc/man/nvme_fdp_ruh_desc.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_fdp_ruh_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_fdp_ruh_desc \- Reclaim Unit Handle Descriptor
+.SH SYNOPSIS
+struct nvme_fdp_ruh_desc {
+.br
+.BI " __u8 ruht;"
+.br
+.BI " __u8 rsvd1[3];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "ruht" 12
+Reclaim Unit Handle Type
+.IP "rsvd1" 12
+Reserved
diff --git a/doc/man/nvme_fdp_ruh_status.2 b/doc/man/nvme_fdp_ruh_status.2
new file mode 100644
index 0000000..2fc1389
--- /dev/null
+++ b/doc/man/nvme_fdp_ruh_status.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_fdp_ruh_status" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_fdp_ruh_status \- Reclaim Unit Handle Status
+.SH SYNOPSIS
+struct nvme_fdp_ruh_status {
+.br
+.BI " __u8 rsvd0[14];"
+.br
+.BI " __u16 nruhsd;"
+.br
+.BI " struct nvme_fdp_ruh_status_desc ruhss[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "rsvd0" 12
+Reserved
+.IP "nruhsd" 12
+Number of Reclaim Unit Handle Status Descriptors
+.IP "ruhss" 12
+Reclaim Unit Handle Status descriptors
diff --git a/doc/man/nvme_fdp_ruh_status_desc.2 b/doc/man/nvme_fdp_ruh_status_desc.2
new file mode 100644
index 0000000..7b1dfc7
--- /dev/null
+++ b/doc/man/nvme_fdp_ruh_status_desc.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "struct nvme_fdp_ruh_status_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_fdp_ruh_status_desc \- Reclaim Unit Handle Status Descriptor
+.SH SYNOPSIS
+struct nvme_fdp_ruh_status_desc {
+.br
+.BI " __u16 pid;"
+.br
+.BI " __u16 ruhid;"
+.br
+.BI " __u32 earutr;"
+.br
+.BI " __u64 ruamw;"
+.br
+.BI " __u8 rsvd16[16];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "pid" 12
+Placement Identifier
+.IP "ruhid" 12
+Reclaim Unit Handle Identifier
+.IP "earutr" 12
+Estimated Active Reclaim Unit Time Remaining
+.IP "ruamw" 12
+Reclaim Unit Available Media Writes
+.IP "rsvd16" 12
+Reserved
diff --git a/doc/man/nvme_fdp_ruh_type.2 b/doc/man/nvme_fdp_ruh_type.2
new file mode 100644
index 0000000..5407134
--- /dev/null
+++ b/doc/man/nvme_fdp_ruh_type.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvme_fdp_ruh_type" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_fdp_ruh_type \- Reclaim Unit Handle Type
+.SH SYNOPSIS
+enum nvme_fdp_ruh_type {
+.br
+.BI " NVME_FDP_RUHT_INITIALLY_ISOLATED"
+,
+.br
+.br
+.BI " NVME_FDP_RUHT_PERSISTENTLY_ISOLATED"
+
+};
+.SH Constants
+.IP "NVME_FDP_RUHT_INITIALLY_ISOLATED" 12
+Initially Isolated
+.IP "NVME_FDP_RUHT_PERSISTENTLY_ISOLATED" 12
+Persistently Isolated
diff --git a/doc/man/nvme_fdp_ruha.2 b/doc/man/nvme_fdp_ruha.2
new file mode 100644
index 0000000..99c73b3
--- /dev/null
+++ b/doc/man/nvme_fdp_ruha.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvme_fdp_ruha" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_fdp_ruha \- Reclaim Unit Handle Attributes
+.SH SYNOPSIS
+enum nvme_fdp_ruha {
+.br
+.BI " NVME_FDP_RUHA_HOST_SHIFT"
+,
+.br
+.br
+.BI " NVME_FDP_RUHA_HOST_MASK"
+,
+.br
+.br
+.BI " NVME_FDP_RUHA_CTRL_SHIFT"
+,
+.br
+.br
+.BI " NVME_FDP_RUHA_CTRL_MASK"
+
+};
+.SH Constants
+.IP "NVME_FDP_RUHA_HOST_SHIFT" 12
+Host Specified Reclaim Unit Handle Shift
+.IP "NVME_FDP_RUHA_HOST_MASK" 12
+Host Specified Reclaim Unit Handle Mask
+.IP "NVME_FDP_RUHA_CTRL_SHIFT" 12
+Controller Specified Reclaim Unit Handle Shift
+.IP "NVME_FDP_RUHA_CTRL_MASK" 12
+Controller Specified Reclaim Unit Handle Mask
diff --git a/doc/man/nvme_fdp_ruhu_desc.2 b/doc/man/nvme_fdp_ruhu_desc.2
new file mode 100644
index 0000000..e8a6d15
--- /dev/null
+++ b/doc/man/nvme_fdp_ruhu_desc.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_fdp_ruhu_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_fdp_ruhu_desc \- Reclaim Unit Handle Usage Descriptor
+.SH SYNOPSIS
+struct nvme_fdp_ruhu_desc {
+.br
+.BI " __u8 ruha;"
+.br
+.BI " __u8 rsvd1[7];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "ruha" 12
+Reclaim Unit Handle Attributes (\fIenum nvme_fdp_ruha\fP)
+.IP "rsvd1" 12
+Reserved
diff --git a/doc/man/nvme_fdp_ruhu_log.2 b/doc/man/nvme_fdp_ruhu_log.2
new file mode 100644
index 0000000..794dc15
--- /dev/null
+++ b/doc/man/nvme_fdp_ruhu_log.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_fdp_ruhu_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_fdp_ruhu_log \- Reclaim Unit Handle Usage Log Page
+.SH SYNOPSIS
+struct nvme_fdp_ruhu_log {
+.br
+.BI " __u16 nruh;"
+.br
+.BI " __u8 rsvd2[6];"
+.br
+.BI " struct nvme_fdp_ruhu_desc ruhus[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nruh" 12
+Number of Reclaim Unit Handles
+.IP "rsvd2" 12
+Reserved
+.IP "ruhus" 12
+Reclaim Unit Handle Usage descriptors
diff --git a/doc/man/nvme_fdp_stats_log.2 b/doc/man/nvme_fdp_stats_log.2
new file mode 100644
index 0000000..8ada127
--- /dev/null
+++ b/doc/man/nvme_fdp_stats_log.2
@@ -0,0 +1,27 @@
+.TH "libnvme" 9 "struct nvme_fdp_stats_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_fdp_stats_log \- FDP Statistics Log Page
+.SH SYNOPSIS
+struct nvme_fdp_stats_log {
+.br
+.BI " __u8 hbmw[16];"
+.br
+.BI " __u8 mbmw[16];"
+.br
+.BI " __u8 mbe[16];"
+.br
+.BI " __u8 rsvd48[16];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "hbmw" 12
+Host Bytes with Metadata Written
+.IP "mbmw" 12
+Media Bytes with Metadata Written
+.IP "mbe" 12
+Media Bytes Erased
+.IP "rsvd48" 12
+Reserved
diff --git a/doc/man/nvme_fdp_supported_event_attributes.2 b/doc/man/nvme_fdp_supported_event_attributes.2
new file mode 100644
index 0000000..2f6c55d
--- /dev/null
+++ b/doc/man/nvme_fdp_supported_event_attributes.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvme_fdp_supported_event_attributes" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_fdp_supported_event_attributes \- Supported FDP Event Attributes
+.SH SYNOPSIS
+enum nvme_fdp_supported_event_attributes {
+.br
+.BI " NVME_FDP_SUPP_EVENT_ENABLED_SHIFT"
+,
+.br
+.br
+.BI " NVME_FDP_SUPP_EVENT_ENABLED_MASK"
+
+};
+.SH Constants
+.IP "NVME_FDP_SUPP_EVENT_ENABLED_SHIFT" 12
+FDP Event Enable Shift
+.IP "NVME_FDP_SUPP_EVENT_ENABLED_MASK" 12
+FDP Event Enable Mask
diff --git a/doc/man/nvme_fdp_supported_event_desc.2 b/doc/man/nvme_fdp_supported_event_desc.2
new file mode 100644
index 0000000..421be89
--- /dev/null
+++ b/doc/man/nvme_fdp_supported_event_desc.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_fdp_supported_event_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_fdp_supported_event_desc \- Supported FDP Event Descriptor
+.SH SYNOPSIS
+struct nvme_fdp_supported_event_desc {
+.br
+.BI " __u8 evt;"
+.br
+.BI " __u8 evta;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "evt" 12
+FDP Event Type
+.IP "evta" 12
+FDP Event Type Attributes (\fIenum nvme_fdp_supported_event_attributes\fP)
diff --git a/doc/man/nvme_feat.2 b/doc/man/nvme_feat.2
new file mode 100644
index 0000000..8891682
--- /dev/null
+++ b/doc/man/nvme_feat.2
@@ -0,0 +1,526 @@
+.TH "libnvme" 9 "enum nvme_feat" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_feat \- Features Access Shifts/Masks values
+.SH SYNOPSIS
+enum nvme_feat {
+.br
+.BI " NVME_FEAT_ARBITRATION_BURST_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_ARBITRATION_BURST_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_ARBITRATION_LPW_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_ARBITRATION_LPW_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_ARBITRATION_MPW_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_ARBITRATION_MPW_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_ARBITRATION_HPW_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_ARBITRATION_HPW_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_PWRMGMT_PS_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_PWRMGMT_PS_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_PWRMGMT_WH_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_PWRMGMT_WH_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_LBAR_NR_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_LBAR_NR_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_TT_TMPTH_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_TT_TMPTH_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_TT_TMPSEL_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_TT_TMPSEL_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_TT_THSEL_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_TT_THSEL_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_ERROR_RECOVERY_TLER_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_ERROR_RECOVERY_TLER_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_ERROR_RECOVERY_DULBE_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_ERROR_RECOVERY_DULBE_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_VWC_WCE_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_VWC_WCE_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_NRQS_NSQR_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_NRQS_NSQR_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_NRQS_NCQR_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_NRQS_NCQR_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_IRQC_THR_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_IRQC_THR_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_IRQC_TIME_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_IRQC_TIME_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_ICFG_IV_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_ICFG_IV_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_ICFG_CD_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_ICFG_CD_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_WA_DN_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_WA_DN_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_SMART_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_SMART_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_NAN_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_NAN_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_FW_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_FW_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_TELEM_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_TELEM_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_ANA_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_ANA_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_PLA_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_PLA_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_LBAS_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_LBAS_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_EGA_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_AE_EGA_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_APST_APSTE_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_APST_APSTE_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_HMEM_EHM_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_HMEM_EHM_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_HCTM_TMT2_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_HCTM_TMT2_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_HCTM_TMT1_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_HCTM_TMT1_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_NOPS_NOPPME_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_NOPS_NOPPME_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_RRL_RRL_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_RRL_RRL_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_PLM_PLME_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_PLM_PLME_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_PLMW_WS_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_PLMW_WS_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_LBAS_LSIRI_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_LBAS_LSIRI_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_LBAS_LSIPI_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_LBAS_LSIPI_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_SC_NODRM_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_SC_NODRM_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_EG_ENDGID_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_EG_ENDGID_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_EG_EGCW_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_EG_EGCW_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_SPM_PBSLC_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_SPM_PBSLC_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_HOSTID_EXHID_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_HOSTID_EXHID_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_RM_REGPRE_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_RM_REGPRE_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_RM_RESREL_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_RM_RESREL_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_RM_RESPRE_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_RM_RESPRE_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_RP_PTPL_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_RP_PTPL_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_WP_WPS_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_WP_WPS_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_IOCSP_IOCSCI_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_IOCSP_IOCSCI_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_FDP_ENABLED_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_FDP_ENABLED_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_FDP_INDEX_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_FDP_INDEX_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_FDP_EVENTS_ENABLE_SHIFT"
+,
+.br
+.br
+.BI " NVME_FEAT_FDP_EVENTS_ENABLE_MASK"
+
+};
+.SH Constants
+.IP "NVME_FEAT_ARBITRATION_BURST_SHIFT" 12
+.IP "NVME_FEAT_ARBITRATION_BURST_MASK" 12
+.IP "NVME_FEAT_ARBITRATION_LPW_SHIFT" 12
+.IP "NVME_FEAT_ARBITRATION_LPW_MASK" 12
+.IP "NVME_FEAT_ARBITRATION_MPW_SHIFT" 12
+.IP "NVME_FEAT_ARBITRATION_MPW_MASK" 12
+.IP "NVME_FEAT_ARBITRATION_HPW_SHIFT" 12
+.IP "NVME_FEAT_ARBITRATION_HPW_MASK" 12
+.IP "NVME_FEAT_PWRMGMT_PS_SHIFT" 12
+.IP "NVME_FEAT_PWRMGMT_PS_MASK" 12
+.IP "NVME_FEAT_PWRMGMT_WH_SHIFT" 12
+.IP "NVME_FEAT_PWRMGMT_WH_MASK" 12
+.IP "NVME_FEAT_LBAR_NR_SHIFT" 12
+.IP "NVME_FEAT_LBAR_NR_MASK" 12
+.IP "NVME_FEAT_TT_TMPTH_SHIFT" 12
+.IP "NVME_FEAT_TT_TMPTH_MASK" 12
+.IP "NVME_FEAT_TT_TMPSEL_SHIFT" 12
+.IP "NVME_FEAT_TT_TMPSEL_MASK" 12
+.IP "NVME_FEAT_TT_THSEL_SHIFT" 12
+.IP "NVME_FEAT_TT_THSEL_MASK" 12
+.IP "NVME_FEAT_ERROR_RECOVERY_TLER_SHIFT" 12
+.IP "NVME_FEAT_ERROR_RECOVERY_TLER_MASK" 12
+.IP "NVME_FEAT_ERROR_RECOVERY_DULBE_SHIFT" 12
+.IP "NVME_FEAT_ERROR_RECOVERY_DULBE_MASK" 12
+.IP "NVME_FEAT_VWC_WCE_SHIFT" 12
+.IP "NVME_FEAT_VWC_WCE_MASK" 12
+.IP "NVME_FEAT_NRQS_NSQR_SHIFT" 12
+.IP "NVME_FEAT_NRQS_NSQR_MASK" 12
+.IP "NVME_FEAT_NRQS_NCQR_SHIFT" 12
+.IP "NVME_FEAT_NRQS_NCQR_MASK" 12
+.IP "NVME_FEAT_IRQC_THR_SHIFT" 12
+.IP "NVME_FEAT_IRQC_THR_MASK" 12
+.IP "NVME_FEAT_IRQC_TIME_SHIFT" 12
+.IP "NVME_FEAT_IRQC_TIME_MASK" 12
+.IP "NVME_FEAT_ICFG_IV_SHIFT" 12
+.IP "NVME_FEAT_ICFG_IV_MASK" 12
+.IP "NVME_FEAT_ICFG_CD_SHIFT" 12
+.IP "NVME_FEAT_ICFG_CD_MASK" 12
+.IP "NVME_FEAT_WA_DN_SHIFT" 12
+.IP "NVME_FEAT_WA_DN_MASK" 12
+.IP "NVME_FEAT_AE_SMART_SHIFT" 12
+.IP "NVME_FEAT_AE_SMART_MASK" 12
+.IP "NVME_FEAT_AE_NAN_SHIFT" 12
+.IP "NVME_FEAT_AE_NAN_MASK" 12
+.IP "NVME_FEAT_AE_FW_SHIFT" 12
+.IP "NVME_FEAT_AE_FW_MASK" 12
+.IP "NVME_FEAT_AE_TELEM_SHIFT" 12
+.IP "NVME_FEAT_AE_TELEM_MASK" 12
+.IP "NVME_FEAT_AE_ANA_SHIFT" 12
+.IP "NVME_FEAT_AE_ANA_MASK" 12
+.IP "NVME_FEAT_AE_PLA_SHIFT" 12
+.IP "NVME_FEAT_AE_PLA_MASK" 12
+.IP "NVME_FEAT_AE_LBAS_SHIFT" 12
+.IP "NVME_FEAT_AE_LBAS_MASK" 12
+.IP "NVME_FEAT_AE_EGA_SHIFT" 12
+.IP "NVME_FEAT_AE_EGA_MASK" 12
+.IP "NVME_FEAT_APST_APSTE_SHIFT" 12
+.IP "NVME_FEAT_APST_APSTE_MASK" 12
+.IP "NVME_FEAT_HMEM_EHM_SHIFT" 12
+.IP "NVME_FEAT_HMEM_EHM_MASK" 12
+.IP "NVME_FEAT_HCTM_TMT2_SHIFT" 12
+.IP "NVME_FEAT_HCTM_TMT2_MASK" 12
+.IP "NVME_FEAT_HCTM_TMT1_SHIFT" 12
+.IP "NVME_FEAT_HCTM_TMT1_MASK" 12
+.IP "NVME_FEAT_NOPS_NOPPME_SHIFT" 12
+.IP "NVME_FEAT_NOPS_NOPPME_MASK" 12
+.IP "NVME_FEAT_RRL_RRL_SHIFT" 12
+.IP "NVME_FEAT_RRL_RRL_MASK" 12
+.IP "NVME_FEAT_PLM_PLME_SHIFT" 12
+.IP "NVME_FEAT_PLM_PLME_MASK" 12
+.IP "NVME_FEAT_PLMW_WS_SHIFT" 12
+.IP "NVME_FEAT_PLMW_WS_MASK" 12
+.IP "NVME_FEAT_LBAS_LSIRI_SHIFT" 12
+.IP "NVME_FEAT_LBAS_LSIRI_MASK" 12
+.IP "NVME_FEAT_LBAS_LSIPI_SHIFT" 12
+.IP "NVME_FEAT_LBAS_LSIPI_MASK" 12
+.IP "NVME_FEAT_SC_NODRM_SHIFT" 12
+.IP "NVME_FEAT_SC_NODRM_MASK" 12
+.IP "NVME_FEAT_EG_ENDGID_SHIFT" 12
+.IP "NVME_FEAT_EG_ENDGID_MASK" 12
+.IP "NVME_FEAT_EG_EGCW_SHIFT" 12
+.IP "NVME_FEAT_EG_EGCW_MASK" 12
+.IP "NVME_FEAT_SPM_PBSLC_SHIFT" 12
+.IP "NVME_FEAT_SPM_PBSLC_MASK" 12
+.IP "NVME_FEAT_HOSTID_EXHID_SHIFT" 12
+.IP "NVME_FEAT_HOSTID_EXHID_MASK" 12
+.IP "NVME_FEAT_RM_REGPRE_SHIFT" 12
+.IP "NVME_FEAT_RM_REGPRE_MASK" 12
+.IP "NVME_FEAT_RM_RESREL_SHIFT" 12
+.IP "NVME_FEAT_RM_RESREL_MASK" 12
+.IP "NVME_FEAT_RM_RESPRE_SHIFT" 12
+.IP "NVME_FEAT_RM_RESPRE_MASK" 12
+.IP "NVME_FEAT_RP_PTPL_SHIFT" 12
+.IP "NVME_FEAT_RP_PTPL_MASK" 12
+.IP "NVME_FEAT_WP_WPS_SHIFT" 12
+.IP "NVME_FEAT_WP_WPS_MASK" 12
+.IP "NVME_FEAT_IOCSP_IOCSCI_SHIFT" 12
+.IP "NVME_FEAT_IOCSP_IOCSCI_MASK" 12
+.IP "NVME_FEAT_FDP_ENABLED_SHIFT" 12
+.IP "NVME_FEAT_FDP_ENABLED_MASK" 12
+.IP "NVME_FEAT_FDP_INDEX_SHIFT" 12
+.IP "NVME_FEAT_FDP_INDEX_MASK" 12
+.IP "NVME_FEAT_FDP_EVENTS_ENABLE_SHIFT" 12
+.IP "NVME_FEAT_FDP_EVENTS_ENABLE_MASK" 12
diff --git a/doc/man/nvme_feat_auto_pst.2 b/doc/man/nvme_feat_auto_pst.2
new file mode 100644
index 0000000..3e7ebc9
--- /dev/null
+++ b/doc/man/nvme_feat_auto_pst.2
@@ -0,0 +1,15 @@
+.TH "libnvme" 9 "struct nvme_feat_auto_pst" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_feat_auto_pst \- Autonomous Power State Transition
+.SH SYNOPSIS
+struct nvme_feat_auto_pst {
+.br
+.BI " __le64 apst_entry[32];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "apst_entry" 12
+See \fIenum nvme_apst_entry\fP
diff --git a/doc/man/nvme_feat_fdp_events_cdw11.2 b/doc/man/nvme_feat_fdp_events_cdw11.2
new file mode 100644
index 0000000..5960a6c
--- /dev/null
+++ b/doc/man/nvme_feat_fdp_events_cdw11.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_feat_fdp_events_cdw11" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_feat_fdp_events_cdw11 \- FDP Events Feature Command Dword 11
+.SH SYNOPSIS
+struct nvme_feat_fdp_events_cdw11 {
+.br
+.BI " __u16 phndl;"
+.br
+.BI " __u8 noet;"
+.br
+.BI " __u8 rsvd24;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "phndl" 12
+Placement Handle
+.IP "noet" 12
+Number of FDP Event Types
+.IP "rsvd24" 12
+Reserved
diff --git a/doc/man/nvme_feat_host_behavior.2 b/doc/man/nvme_feat_host_behavior.2
new file mode 100644
index 0000000..8a53e2f
--- /dev/null
+++ b/doc/man/nvme_feat_host_behavior.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_feat_host_behavior" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_feat_host_behavior \- Host Behavior Support - Data Structure
+.SH SYNOPSIS
+struct nvme_feat_host_behavior {
+.br
+.BI " __u8 acre;"
+.br
+.BI " __u8 rsvd1[511];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "acre" 12
+Advanced Command Retry Enable
+.IP "rsvd1" 12
+Reserved
diff --git a/doc/man/nvme_feat_nswpcfg_state.2 b/doc/man/nvme_feat_nswpcfg_state.2
new file mode 100644
index 0000000..fe45d95
--- /dev/null
+++ b/doc/man/nvme_feat_nswpcfg_state.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvme_feat_nswpcfg_state" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_feat_nswpcfg_state \- Write Protection - Write Protection State
+.SH SYNOPSIS
+enum nvme_feat_nswpcfg_state {
+.br
+.BI " NVME_FEAT_NS_NO_WRITE_PROTECT"
+,
+.br
+.br
+.BI " NVME_FEAT_NS_WRITE_PROTECT"
+,
+.br
+.br
+.BI " NVME_FEAT_NS_WRITE_PROTECT_PWR_CYCLE"
+,
+.br
+.br
+.BI " NVME_FEAT_NS_WRITE_PROTECT_PERMANENT"
+
+};
+.SH Constants
+.IP "NVME_FEAT_NS_NO_WRITE_PROTECT" 12
+No Write Protect
+.IP "NVME_FEAT_NS_WRITE_PROTECT" 12
+Write Protect
+.IP "NVME_FEAT_NS_WRITE_PROTECT_PWR_CYCLE" 12
+Write Protect Until Power Cycle
+.IP "NVME_FEAT_NS_WRITE_PROTECT_PERMANENT" 12
+Permanent Write Protect
diff --git a/doc/man/nvme_feat_plm_window_select.2 b/doc/man/nvme_feat_plm_window_select.2
new file mode 100644
index 0000000..37f2cc3
--- /dev/null
+++ b/doc/man/nvme_feat_plm_window_select.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvme_feat_plm_window_select" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_feat_plm_window_select \- Predictable Latency Per NVM Set Log
+.SH SYNOPSIS
+enum nvme_feat_plm_window_select {
+.br
+.BI " NVME_FEATURE_PLM_DTWIN"
+,
+.br
+.br
+.BI " NVME_FEATURE_PLM_NDWIN"
+
+};
+.SH Constants
+.IP "NVME_FEATURE_PLM_DTWIN" 12
+Deterministic Window select
+.IP "NVME_FEATURE_PLM_NDWIN" 12
+Non-Deterministic Window select
diff --git a/doc/man/nvme_feat_resv_notify_flags.2 b/doc/man/nvme_feat_resv_notify_flags.2
new file mode 100644
index 0000000..538f7c4
--- /dev/null
+++ b/doc/man/nvme_feat_resv_notify_flags.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "enum nvme_feat_resv_notify_flags" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_feat_resv_notify_flags \- Reservation Notification Configuration
+.SH SYNOPSIS
+enum nvme_feat_resv_notify_flags {
+.br
+.BI " NVME_FEAT_RESV_NOTIFY_REGPRE"
+,
+.br
+.br
+.BI " NVME_FEAT_RESV_NOTIFY_RESREL"
+,
+.br
+.br
+.BI " NVME_FEAT_RESV_NOTIFY_RESPRE"
+
+};
+.SH Constants
+.IP "NVME_FEAT_RESV_NOTIFY_REGPRE" 12
+Mask Registration Preempted Notification
+.IP "NVME_FEAT_RESV_NOTIFY_RESREL" 12
+Mask Reservation Released Notification
+.IP "NVME_FEAT_RESV_NOTIFY_RESPRE" 12
+Mask Reservation Preempted Notification
diff --git a/doc/man/nvme_feat_tmpthresh_thsel.2 b/doc/man/nvme_feat_tmpthresh_thsel.2
new file mode 100644
index 0000000..635b1c7
--- /dev/null
+++ b/doc/man/nvme_feat_tmpthresh_thsel.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvme_feat_tmpthresh_thsel" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_feat_tmpthresh_thsel \- Temperature Threshold - Threshold Type Select
+.SH SYNOPSIS
+enum nvme_feat_tmpthresh_thsel {
+.br
+.BI " NVME_FEATURE_TEMPTHRESH_THSEL_OVER"
+,
+.br
+.br
+.BI " NVME_FEATURE_TEMPTHRESH_THSEL_UNDER"
+
+};
+.SH Constants
+.IP "NVME_FEATURE_TEMPTHRESH_THSEL_OVER" 12
+Over temperature threshold select
+.IP "NVME_FEATURE_TEMPTHRESH_THSEL_UNDER" 12
+Under temperature threshold select
diff --git a/doc/man/nvme_features_async_event_config_flags.2 b/doc/man/nvme_features_async_event_config_flags.2
new file mode 100644
index 0000000..c7ec84d
--- /dev/null
+++ b/doc/man/nvme_features_async_event_config_flags.2
@@ -0,0 +1,76 @@
+.TH "libnvme" 9 "enum nvme_features_async_event_config_flags" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_features_async_event_config_flags \- Asynchronous Event Configuration configuration flags
+.SH SYNOPSIS
+enum nvme_features_async_event_config_flags {
+.br
+.BI " NVME_FEATURE_AENCFG_SMART_CRIT_SPARE"
+,
+.br
+.br
+.BI " NVME_FEATURE_AENCFG_SMART_CRIT_TEMPERATURE"
+,
+.br
+.br
+.BI " NVME_FEATURE_AENCFG_SMART_CRIT_DEGRADED"
+,
+.br
+.br
+.BI " NVME_FEATURE_AENCFG_SMART_CRIT_READ_ONLY"
+,
+.br
+.br
+.BI " NVME_FEATURE_AENCFG_SMART_CRIT_VOLATILE_BACKUP"
+,
+.br
+.br
+.BI " NVME_FEATURE_AENCFG_SMART_CRIT_READ_ONLY_PMR"
+,
+.br
+.br
+.BI " NVME_FEATURE_AENCFG_NOTICE_NAMESPACE_ATTRIBUTES"
+,
+.br
+.br
+.BI " NVME_FEATURE_AENCFG_NOTICE_FIRMWARE_ACTIVATION"
+,
+.br
+.br
+.BI " NVME_FEATURE_AENCFG_NOTICE_TELEMETRY_LOG"
+,
+.br
+.br
+.BI " NVME_FEATURE_AENCFG_NOTICE_ANA_CHANGE"
+,
+.br
+.br
+.BI " NVME_FEATURE_AENCFG_NOTICE_PL_EVENT"
+,
+.br
+.br
+.BI " NVME_FEATURE_AENCFG_NOTICE_LBA_STATUS"
+,
+.br
+.br
+.BI " NVME_FEATURE_AENCFG_NOTICE_EG_EVENT"
+,
+.br
+.br
+.BI " NVME_FEATURE_AENCFG_NOTICE_DISCOVERY_CHANGE"
+
+};
+.SH Constants
+.IP "NVME_FEATURE_AENCFG_SMART_CRIT_SPARE" 12
+.IP "NVME_FEATURE_AENCFG_SMART_CRIT_TEMPERATURE" 12
+.IP "NVME_FEATURE_AENCFG_SMART_CRIT_DEGRADED" 12
+.IP "NVME_FEATURE_AENCFG_SMART_CRIT_READ_ONLY" 12
+.IP "NVME_FEATURE_AENCFG_SMART_CRIT_VOLATILE_BACKUP" 12
+.IP "NVME_FEATURE_AENCFG_SMART_CRIT_READ_ONLY_PMR" 12
+.IP "NVME_FEATURE_AENCFG_NOTICE_NAMESPACE_ATTRIBUTES" 12
+.IP "NVME_FEATURE_AENCFG_NOTICE_FIRMWARE_ACTIVATION" 12
+.IP "NVME_FEATURE_AENCFG_NOTICE_TELEMETRY_LOG" 12
+.IP "NVME_FEATURE_AENCFG_NOTICE_ANA_CHANGE" 12
+.IP "NVME_FEATURE_AENCFG_NOTICE_PL_EVENT" 12
+.IP "NVME_FEATURE_AENCFG_NOTICE_LBA_STATUS" 12
+.IP "NVME_FEATURE_AENCFG_NOTICE_EG_EVENT" 12
+.IP "NVME_FEATURE_AENCFG_NOTICE_DISCOVERY_CHANGE" 12
diff --git a/doc/man/nvme_features_id.2 b/doc/man/nvme_features_id.2
new file mode 100644
index 0000000..995248c
--- /dev/null
+++ b/doc/man/nvme_features_id.2
@@ -0,0 +1,222 @@
+.TH "libnvme" 9 "enum nvme_features_id" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_features_id \- Features - Feature Identifiers
+.SH SYNOPSIS
+enum nvme_features_id {
+.br
+.BI " NVME_FEAT_FID_ARBITRATION"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_POWER_MGMT"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_LBA_RANGE"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_TEMP_THRESH"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_ERR_RECOVERY"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_VOLATILE_WC"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_NUM_QUEUES"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_IRQ_COALESCE"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_IRQ_CONFIG"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_WRITE_ATOMIC"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_ASYNC_EVENT"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_AUTO_PST"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_HOST_MEM_BUF"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_TIMESTAMP"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_KATO"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_HCTM"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_NOPSC"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_RRL"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_PLM_CONFIG"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_PLM_WINDOW"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_LBA_STS_INTERVAL"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_HOST_BEHAVIOR"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_SANITIZE"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_ENDURANCE_EVT_CFG"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_IOCS_PROFILE"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_SPINUP_CONTROL"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_FDP"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_FDP_EVENTS"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_ENH_CTRL_METADATA"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_CTRL_METADATA"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_NS_METADATA"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_SW_PROGRESS"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_HOST_ID"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_RESV_MASK"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_RESV_PERSIST"
+,
+.br
+.br
+.BI " NVME_FEAT_FID_WRITE_PROTECT"
+
+};
+.SH Constants
+.IP "NVME_FEAT_FID_ARBITRATION" 12
+Arbitration
+.IP "NVME_FEAT_FID_POWER_MGMT" 12
+Power Management
+.IP "NVME_FEAT_FID_LBA_RANGE" 12
+LBA Range Type
+.IP "NVME_FEAT_FID_TEMP_THRESH" 12
+Temperature Threshold
+.IP "NVME_FEAT_FID_ERR_RECOVERY" 12
+Error Recovery
+.IP "NVME_FEAT_FID_VOLATILE_WC" 12
+Volatile Write Cache
+.IP "NVME_FEAT_FID_NUM_QUEUES" 12
+Number of Queues
+.IP "NVME_FEAT_FID_IRQ_COALESCE" 12
+Interrupt Coalescing
+.IP "NVME_FEAT_FID_IRQ_CONFIG" 12
+Interrupt Vector Configuration
+.IP "NVME_FEAT_FID_WRITE_ATOMIC" 12
+Write Atomicity Normal
+.IP "NVME_FEAT_FID_ASYNC_EVENT" 12
+Asynchronous Event Configuration
+.IP "NVME_FEAT_FID_AUTO_PST" 12
+Autonomous Power State Transition
+.IP "NVME_FEAT_FID_HOST_MEM_BUF" 12
+Host Memory Buffer
+.IP "NVME_FEAT_FID_TIMESTAMP" 12
+Timestamp
+.IP "NVME_FEAT_FID_KATO" 12
+Keep Alive Timer
+.IP "NVME_FEAT_FID_HCTM" 12
+Host Controlled Thermal Management
+.IP "NVME_FEAT_FID_NOPSC" 12
+Non-Operational Power State Config
+.IP "NVME_FEAT_FID_RRL" 12
+Read Recovery Level Config
+.IP "NVME_FEAT_FID_PLM_CONFIG" 12
+Predictable Latency Mode Config
+.IP "NVME_FEAT_FID_PLM_WINDOW" 12
+Predictable Latency Mode Window
+.IP "NVME_FEAT_FID_LBA_STS_INTERVAL" 12
+LBA Status Information Report Interval
+.IP "NVME_FEAT_FID_HOST_BEHAVIOR" 12
+Host Behavior Support
+.IP "NVME_FEAT_FID_SANITIZE" 12
+Endurance Group Event Configuration
+.IP "NVME_FEAT_FID_ENDURANCE_EVT_CFG" 12
+Endurance Group Event Configuration
+.IP "NVME_FEAT_FID_IOCS_PROFILE" 12
+I/O Command Set Profile
+.IP "NVME_FEAT_FID_SPINUP_CONTROL" 12
+Spinup Control
+.IP "NVME_FEAT_FID_FDP" 12
+Flexible Data Placement
+.IP "NVME_FEAT_FID_FDP_EVENTS" 12
+FDP Events
+.IP "NVME_FEAT_FID_ENH_CTRL_METADATA" 12
+Enhanced Controller Metadata
+.IP "NVME_FEAT_FID_CTRL_METADATA" 12
+Controller Metadata
+.IP "NVME_FEAT_FID_NS_METADATA" 12
+Namespace Metadata
+.IP "NVME_FEAT_FID_SW_PROGRESS" 12
+Software Progress Marker
+.IP "NVME_FEAT_FID_HOST_ID" 12
+Host Identifier
+.IP "NVME_FEAT_FID_RESV_MASK" 12
+Reservation Notification Mask
+.IP "NVME_FEAT_FID_RESV_PERSIST" 12
+Reservation Persistence
+.IP "NVME_FEAT_FID_WRITE_PROTECT" 12
+Namespace Write Protection Config
diff --git a/doc/man/nvme_fid_supported_effects.2 b/doc/man/nvme_fid_supported_effects.2
new file mode 100644
index 0000000..55c37c8
--- /dev/null
+++ b/doc/man/nvme_fid_supported_effects.2
@@ -0,0 +1,90 @@
+.TH "libnvme" 9 "enum nvme_fid_supported_effects" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_fid_supported_effects \- FID Supported and Effects Data Structure definitions
+.SH SYNOPSIS
+enum nvme_fid_supported_effects {
+.br
+.BI " NVME_FID_SUPPORTED_EFFECTS_FSUPP"
+,
+.br
+.br
+.BI " NVME_FID_SUPPORTED_EFFECTS_UDCC"
+,
+.br
+.br
+.BI " NVME_FID_SUPPORTED_EFFECTS_NCC"
+,
+.br
+.br
+.BI " NVME_FID_SUPPORTED_EFFECTS_NIC"
+,
+.br
+.br
+.BI " NVME_FID_SUPPORTED_EFFECTS_CCC"
+,
+.br
+.br
+.BI " NVME_FID_SUPPORTED_EFFECTS_UUID_SEL"
+,
+.br
+.br
+.BI " NVME_FID_SUPPORTED_EFFECTS_SCOPE_SHIFT"
+,
+.br
+.br
+.BI " NVME_FID_SUPPORTED_EFFECTS_SCOPE_MASK"
+,
+.br
+.br
+.BI " NVME_FID_SUPPORTED_EFFECTS_SCOPE_NS"
+,
+.br
+.br
+.BI " NVME_FID_SUPPORTED_EFFECTS_SCOPE_CTRL"
+,
+.br
+.br
+.BI " NVME_FID_SUPPORTED_EFFECTS_SCOPE_NVM_SET"
+,
+.br
+.br
+.BI " NVME_FID_SUPPORTED_EFFECTS_SCOPE_ENDGRP"
+,
+.br
+.br
+.BI " NVME_FID_SUPPORTED_EFFECTS_SCOPE_DOMAIN"
+,
+.br
+.br
+.BI " NVME_FID_SUPPORTED_EFFECTS_SCOPE_NSS"
+
+};
+.SH Constants
+.IP "NVME_FID_SUPPORTED_EFFECTS_FSUPP" 12
+FID Supported
+.IP "NVME_FID_SUPPORTED_EFFECTS_UDCC" 12
+User Data Content Change
+.IP "NVME_FID_SUPPORTED_EFFECTS_NCC" 12
+Namespace Capability Change
+.IP "NVME_FID_SUPPORTED_EFFECTS_NIC" 12
+Namespace Inventory Change
+.IP "NVME_FID_SUPPORTED_EFFECTS_CCC" 12
+Controller Capability Change
+.IP "NVME_FID_SUPPORTED_EFFECTS_UUID_SEL" 12
+UUID Selection Supported
+.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_SHIFT" 12
+FID Scope Shift
+.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_MASK" 12
+FID Scope Mask
+.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_NS" 12
+Namespace Scope
+.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_CTRL" 12
+Controller Scope
+.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_NVM_SET" 12
+NVM Set Scope
+.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_ENDGRP" 12
+Endurance Group Scope
+.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_DOMAIN" 12
+Domain Scope
+.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_NSS" 12
+NVM Subsystem Scope
diff --git a/doc/man/nvme_fid_supported_effects_log.2 b/doc/man/nvme_fid_supported_effects_log.2
new file mode 100644
index 0000000..4cdff97
--- /dev/null
+++ b/doc/man/nvme_fid_supported_effects_log.2
@@ -0,0 +1,15 @@
+.TH "libnvme" 9 "struct nvme_fid_supported_effects_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_fid_supported_effects_log \- Feature Identifiers Supported and Effects
+.SH SYNOPSIS
+struct nvme_fid_supported_effects_log {
+.br
+.BI " __le32 fid_support[NVME_LOG_FID_SUPPORTED_EFFECTS_MAX];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "fid_support" 12
+Feature Identifier Supported
diff --git a/doc/man/nvme_firmware_slot.2 b/doc/man/nvme_firmware_slot.2
new file mode 100644
index 0000000..17b4722
--- /dev/null
+++ b/doc/man/nvme_firmware_slot.2
@@ -0,0 +1,27 @@
+.TH "libnvme" 9 "struct nvme_firmware_slot" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_firmware_slot \- Firmware Slot Information Log
+.SH SYNOPSIS
+struct nvme_firmware_slot {
+.br
+.BI " __u8 afi;"
+.br
+.BI " __u8 rsvd1[7];"
+.br
+.BI " char frs[7][8];"
+.br
+.BI " __u8 rsvd2[448];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "afi" 12
+Active Firmware Info
+.IP "rsvd1" 12
+Reserved
+.IP "frs" 12
+Firmware Revision for Slot
+.IP "rsvd2" 12
+Reserved
diff --git a/doc/man/nvme_first_host.2 b/doc/man/nvme_first_host.2
new file mode 100644
index 0000000..05d0fbc
--- /dev/null
+++ b/doc/man/nvme_first_host.2
@@ -0,0 +1,11 @@
+.TH "nvme_first_host" 9 "nvme_first_host" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_first_host \- Start host iterator
+.SH SYNOPSIS
+.B "nvme_host_t" nvme_first_host
+.BI "(nvme_root_t r " ");"
+.SH ARGUMENTS
+.IP "r" 12
+\fInvme_root_t\fP object
+.SH "RETURN"
+First \fInvme_host_t\fP object in an iterator
diff --git a/doc/man/nvme_first_subsystem.2 b/doc/man/nvme_first_subsystem.2
new file mode 100644
index 0000000..1b53909
--- /dev/null
+++ b/doc/man/nvme_first_subsystem.2
@@ -0,0 +1,11 @@
+.TH "nvme_first_subsystem" 9 "nvme_first_subsystem" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_first_subsystem \- Start subsystem iterator
+.SH SYNOPSIS
+.B "nvme_subsystem_t" nvme_first_subsystem
+.BI "(nvme_host_t h " ");"
+.SH ARGUMENTS
+.IP "h" 12
+\fInvme_host_t\fP object
+.SH "RETURN"
+first \fInvme_subsystem_t\fP object in an iterator
diff --git a/doc/man/nvme_flush.2 b/doc/man/nvme_flush.2
new file mode 100644
index 0000000..7636bc9
--- /dev/null
+++ b/doc/man/nvme_flush.2
@@ -0,0 +1,18 @@
+.TH "nvme_flush" 9 "nvme_flush" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_flush \- Send an nvme flush command
+.SH SYNOPSIS
+.B "int" nvme_flush
+.BI "(int fd " ","
+.BI "__u32 nsid " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace identifier
+.SH "DESCRIPTION"
+The Flush command requests that the contents of volatile write cache be made
+non-volatile.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_for_each_host.2 b/doc/man/nvme_for_each_host.2
new file mode 100644
index 0000000..177bc15
--- /dev/null
+++ b/doc/man/nvme_for_each_host.2
@@ -0,0 +1,12 @@
+.TH "nvme_for_each_host" 9 "nvme_for_each_host" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_for_each_host \- Traverse host list
+.SH SYNOPSIS
+.B "nvme_for_each_host
+.BI "(r " ","
+.BI "h " ");"
+.SH ARGUMENTS
+.IP "r" 12
+\fInvme_root_t\fP object
+.IP "h" 12
+\fInvme_host_t\fP object
diff --git a/doc/man/nvme_for_each_host_safe.2 b/doc/man/nvme_for_each_host_safe.2
new file mode 100644
index 0000000..fe5e999
--- /dev/null
+++ b/doc/man/nvme_for_each_host_safe.2
@@ -0,0 +1,15 @@
+.TH "nvme_for_each_host_safe" 9 "nvme_for_each_host_safe" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_for_each_host_safe \- Traverse host list
+.SH SYNOPSIS
+.B "nvme_for_each_host_safe
+.BI "(r " ","
+.BI "h " ","
+.BI "_h " ");"
+.SH ARGUMENTS
+.IP "r" 12
+\fInvme_root_t\fP object
+.IP "h" 12
+\fInvme_host_t\fP object
+.IP "_h" 12
+Temporary \fInvme_host_t\fP object
diff --git a/doc/man/nvme_for_each_subsystem.2 b/doc/man/nvme_for_each_subsystem.2
new file mode 100644
index 0000000..7647f7b
--- /dev/null
+++ b/doc/man/nvme_for_each_subsystem.2
@@ -0,0 +1,12 @@
+.TH "nvme_for_each_subsystem" 9 "nvme_for_each_subsystem" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_for_each_subsystem \- Traverse subsystems
+.SH SYNOPSIS
+.B "nvme_for_each_subsystem
+.BI "(h " ","
+.BI "s " ");"
+.SH ARGUMENTS
+.IP "h" 12
+\fInvme_host_t\fP object
+.IP "s" 12
+\fInvme_subsystem_t\fP object
diff --git a/doc/man/nvme_for_each_subsystem_safe.2 b/doc/man/nvme_for_each_subsystem_safe.2
new file mode 100644
index 0000000..1de668b
--- /dev/null
+++ b/doc/man/nvme_for_each_subsystem_safe.2
@@ -0,0 +1,15 @@
+.TH "nvme_for_each_subsystem_safe" 9 "nvme_for_each_subsystem_safe" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_for_each_subsystem_safe \- Traverse subsystems
+.SH SYNOPSIS
+.B "nvme_for_each_subsystem_safe
+.BI "(h " ","
+.BI "s " ","
+.BI "_s " ");"
+.SH ARGUMENTS
+.IP "h" 12
+\fInvme_host_t\fP object
+.IP "s" 12
+\fInvme_subsystem_t\fP object
+.IP "_s" 12
+Temporary \fInvme_subsystem_t\fP object
diff --git a/doc/man/nvme_format_nvm.2 b/doc/man/nvme_format_nvm.2
new file mode 100644
index 0000000..e658244
--- /dev/null
+++ b/doc/man/nvme_format_nvm.2
@@ -0,0 +1,17 @@
+.TH "nvme_format_nvm" 9 "nvme_format_nvm" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_format_nvm \- Format nvme namespace(s)
+.SH SYNOPSIS
+.B "int" nvme_format_nvm
+.BI "(struct nvme_format_nvm_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_format_nvme_args\fP argument structure
+.SH "DESCRIPTION"
+The Format NVM command low level formats the NVM media. This command is used
+by the host to change the LBA data size and/or metadata size. A low level
+format may destroy all data and metadata associated with all namespaces or
+only the specific namespace associated with the command
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_format_nvm_compln_event.2 b/doc/man/nvme_format_nvm_compln_event.2
new file mode 100644
index 0000000..7819ab2
--- /dev/null
+++ b/doc/man/nvme_format_nvm_compln_event.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "struct nvme_format_nvm_compln_event" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_format_nvm_compln_event \- Format NVM Completion Event Data
+.SH SYNOPSIS
+struct nvme_format_nvm_compln_event {
+.br
+.BI " __le32 nsid;"
+.br
+.BI " __u8 smallest_fpi;"
+.br
+.BI " __u8 format_nvm_status;"
+.br
+.BI " __le16 compln_info;"
+.br
+.BI " __le32 status_field;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nsid" 12
+Namespace Identifier
+.IP "smallest_fpi" 12
+Smallest Format Progress Indicator
+.IP "format_nvm_status" 12
+Format NVM Status
+.IP "compln_info" 12
+Completion Information
+.IP "status_field" 12
+Status Field
diff --git a/doc/man/nvme_format_nvm_start_event.2 b/doc/man/nvme_format_nvm_start_event.2
new file mode 100644
index 0000000..3916c1f
--- /dev/null
+++ b/doc/man/nvme_format_nvm_start_event.2
@@ -0,0 +1,27 @@
+.TH "libnvme" 9 "struct nvme_format_nvm_start_event" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_format_nvm_start_event \- Format NVM Start Event Data
+.SH SYNOPSIS
+struct nvme_format_nvm_start_event {
+.br
+.BI " __le32 nsid;"
+.br
+.BI " __u8 fna;"
+.br
+.BI " __u8 rsvd5[3];"
+.br
+.BI " __le32 format_nvm_cdw10;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nsid" 12
+Namespace Identifier
+.IP "fna" 12
+Format NVM Attributes
+.IP "rsvd5" 12
+Reserved
+.IP "format_nvm_cdw10" 12
+Format NVM CDW10
diff --git a/doc/man/nvme_free_ctrl.2 b/doc/man/nvme_free_ctrl.2
new file mode 100644
index 0000000..e1eb037
--- /dev/null
+++ b/doc/man/nvme_free_ctrl.2
@@ -0,0 +1,9 @@
+.TH "nvme_free_ctrl" 9 "nvme_free_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_free_ctrl \- Free controller
+.SH SYNOPSIS
+.B "void" nvme_free_ctrl
+.BI "(struct nvme_ctrl *c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
diff --git a/doc/man/nvme_free_host.2 b/doc/man/nvme_free_host.2
new file mode 100644
index 0000000..b9e8f2f
--- /dev/null
+++ b/doc/man/nvme_free_host.2
@@ -0,0 +1,9 @@
+.TH "nvme_free_host" 9 "nvme_free_host" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_free_host \- Free nvme_host_t object
+.SH SYNOPSIS
+.B "void" nvme_free_host
+.BI "(nvme_host_t h " ");"
+.SH ARGUMENTS
+.IP "h" 12
+nvme_host_t object
diff --git a/doc/man/nvme_free_ns.2 b/doc/man/nvme_free_ns.2
new file mode 100644
index 0000000..4eda57f
--- /dev/null
+++ b/doc/man/nvme_free_ns.2
@@ -0,0 +1,9 @@
+.TH "nvme_free_ns" 9 "nvme_free_ns" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_free_ns \- Free a namespace object
+.SH SYNOPSIS
+.B "void" nvme_free_ns
+.BI "(struct nvme_ns *n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
diff --git a/doc/man/nvme_free_subsystem.2 b/doc/man/nvme_free_subsystem.2
new file mode 100644
index 0000000..2310b66
--- /dev/null
+++ b/doc/man/nvme_free_subsystem.2
@@ -0,0 +1,11 @@
+.TH "nvme_free_subsystem" 9 "nvme_free_subsystem" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_free_subsystem \- Free a subsystem
+.SH SYNOPSIS
+.B "void" nvme_free_subsystem
+.BI "(struct nvme_subsystem *s " ");"
+.SH ARGUMENTS
+.IP "s" 12
+subsystem
+.SH "DESCRIPTION"
+Frees \fIs\fP and all related objects.
diff --git a/doc/man/nvme_free_tree.2 b/doc/man/nvme_free_tree.2
new file mode 100644
index 0000000..cb8f359
--- /dev/null
+++ b/doc/man/nvme_free_tree.2
@@ -0,0 +1,11 @@
+.TH "nvme_free_tree" 9 "nvme_free_tree" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_free_tree \- Free root object
+.SH SYNOPSIS
+.B "void" nvme_free_tree
+.BI "(nvme_root_t r " ");"
+.SH ARGUMENTS
+.IP "r" 12
+\fInvme_root_t\fP object
+.SH "DESCRIPTION"
+Free an \fInvme_root_t\fP object and all attached objects
diff --git a/doc/man/nvme_fw_commit.2 b/doc/man/nvme_fw_commit.2
new file mode 100644
index 0000000..26ffeaa
--- /dev/null
+++ b/doc/man/nvme_fw_commit.2
@@ -0,0 +1,16 @@
+.TH "nvme_fw_commit" 9 "nvme_fw_commit" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_fw_commit \- Commit firmware using the specified action
+.SH SYNOPSIS
+.B "int" nvme_fw_commit
+.BI "(struct nvme_fw_commit_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_fw_commit_args\fP argument structure
+.SH "DESCRIPTION"
+The Firmware Commit command modifies the firmware image or Boot Partitions.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise. The command
+status response may specify additional reset actions required to complete
+the commit process.
diff --git a/doc/man/nvme_fw_commit_ca.2 b/doc/man/nvme_fw_commit_ca.2
new file mode 100644
index 0000000..a93e72b
--- /dev/null
+++ b/doc/man/nvme_fw_commit_ca.2
@@ -0,0 +1,59 @@
+.TH "libnvme" 9 "enum nvme_fw_commit_ca" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_fw_commit_ca \- Firmware Commit - Commit Action
+.SH SYNOPSIS
+enum nvme_fw_commit_ca {
+.br
+.BI " NVME_FW_COMMIT_CA_REPLACE"
+,
+.br
+.br
+.BI " NVME_FW_COMMIT_CA_REPLACE_AND_ACTIVATE"
+,
+.br
+.br
+.BI " NVME_FW_COMMIT_CA_SET_ACTIVE"
+,
+.br
+.br
+.BI " NVME_FW_COMMIT_CA_REPLACE_AND_ACTIVATE_IMMEDIATE"
+,
+.br
+.br
+.BI " NVME_FW_COMMIT_CA_REPLACE_BOOT_PARTITION"
+,
+.br
+.br
+.BI " NVME_FW_COMMIT_CA_ACTIVATE_BOOT_PARTITION"
+
+};
+.SH Constants
+.IP "NVME_FW_COMMIT_CA_REPLACE" 12
+Downloaded image replaces the existing
+image, if any, in the specified Firmware
+Slot. The newly placed image is not
+activated.
+.IP "NVME_FW_COMMIT_CA_REPLACE_AND_ACTIVATE" 12
+Downloaded image replaces the existing
+image, if any, in the specified Firmware
+Slot. The newly placed image is activated
+at the next Controller Level Reset.
+.IP "NVME_FW_COMMIT_CA_SET_ACTIVE" 12
+The existing image in the specified
+Firmware Slot is activated at the
+next Controller Level Reset.
+.IP "NVME_FW_COMMIT_CA_REPLACE_AND_ACTIVATE_IMMEDIATE" 12
+Downloaded image replaces the existing
+image, if any, in the specified Firmware
+Slot and is then activated immediately.
+If there is not a newly downloaded image,
+then the existing image in the specified
+firmware slot is activated immediately.
+.IP "NVME_FW_COMMIT_CA_REPLACE_BOOT_PARTITION" 12
+Downloaded image replaces the Boot
+Partition specified by the Boot
+Partition ID field.
+.IP "NVME_FW_COMMIT_CA_ACTIVATE_BOOT_PARTITION" 12
+Mark the Boot Partition specified in
+the BPID field as active and update
+BPINFO.ABPID.
diff --git a/doc/man/nvme_fw_commit_event.2 b/doc/man/nvme_fw_commit_event.2
new file mode 100644
index 0000000..6790ddf
--- /dev/null
+++ b/doc/man/nvme_fw_commit_event.2
@@ -0,0 +1,39 @@
+.TH "libnvme" 9 "struct nvme_fw_commit_event" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_fw_commit_event \- Firmware Commit Event Data
+.SH SYNOPSIS
+struct nvme_fw_commit_event {
+.br
+.BI " __le64 old_fw_rev;"
+.br
+.BI " __le64 new_fw_rev;"
+.br
+.BI " __u8 fw_commit_action;"
+.br
+.BI " __u8 fw_slot;"
+.br
+.BI " __u8 sct_fw;"
+.br
+.BI " __u8 sc_fw;"
+.br
+.BI " __le16 vndr_assign_fw_commit_rc;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "old_fw_rev" 12
+Old Firmware Revision
+.IP "new_fw_rev" 12
+New Firmware Revision
+.IP "fw_commit_action" 12
+Firmware Commit Action
+.IP "fw_slot" 12
+Firmware Slot
+.IP "sct_fw" 12
+Status Code Type for Firmware Commit Command
+.IP "sc_fw" 12
+Status Returned for Firmware Commit Command
+.IP "vndr_assign_fw_commit_rc" 12
+Vendor Assigned Firmware Commit Result Code
diff --git a/doc/man/nvme_fw_download.2 b/doc/man/nvme_fw_download.2
new file mode 100644
index 0000000..c021d31
--- /dev/null
+++ b/doc/man/nvme_fw_download.2
@@ -0,0 +1,25 @@
+.TH "nvme_fw_download" 9 "nvme_fw_download" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_fw_download \- Download part or all of a firmware image to the controller
+.SH SYNOPSIS
+.B "int" nvme_fw_download
+.BI "(struct nvme_fw_download_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_fw_download_args\fP argument structure
+.SH "DESCRIPTION"
+The Firmware Image Download command downloads all or a portion of an image
+for a future update to the controller. The Firmware Image Download command
+downloads a new image (in whole or in part) to the controller.
+
+The image may be constructed of multiple pieces that are individually
+downloaded with separate Firmware Image Download commands. Each Firmware
+Image Download command includes a Dword Offset and Number of Dwords that
+specify a dword range.
+
+The new firmware image is not activated as part of the Firmware Image
+Download command. Use the \fBnvme_fw_commit\fP to activate a newly downloaded
+image.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_fw_download_seq.2 b/doc/man/nvme_fw_download_seq.2
new file mode 100644
index 0000000..c9b95fa
--- /dev/null
+++ b/doc/man/nvme_fw_download_seq.2
@@ -0,0 +1,24 @@
+.TH "nvme_fw_download_seq" 9 "nvme_fw_download_seq" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_fw_download_seq \- Firmware download sequence
+.SH SYNOPSIS
+.B "int" nvme_fw_download_seq
+.BI "(int fd " ","
+.BI "__u32 size " ","
+.BI "__u32 xfer " ","
+.BI "__u32 offset " ","
+.BI "void *buf " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "size" 12
+Total size of the firmware image to transfer
+.IP "xfer" 12
+Maximum size to send with each partial transfer
+.IP "offset" 12
+Starting offset to send with this firmware download
+.IP "buf" 12
+Address of buffer containing all or part of the firmware image.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_gen_dhchap_key.2 b/doc/man/nvme_gen_dhchap_key.2
new file mode 100644
index 0000000..7035019
--- /dev/null
+++ b/doc/man/nvme_gen_dhchap_key.2
@@ -0,0 +1,24 @@
+.TH "nvme_gen_dhchap_key" 9 "nvme_gen_dhchap_key" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_gen_dhchap_key \- DH-HMAC-CHAP key generation
+.SH SYNOPSIS
+.B "int" nvme_gen_dhchap_key
+.BI "(char *hostnqn " ","
+.BI "enum nvme_hmac_alg hmac " ","
+.BI "unsigned int key_len " ","
+.BI "unsigned char *secret " ","
+.BI "unsigned char *key " ");"
+.SH ARGUMENTS
+.IP "hostnqn" 12
+Host NVMe Qualified Name
+.IP "hmac" 12
+HMAC algorithm
+.IP "key_len" 12
+Output key length
+.IP "secret" 12
+Secret to used for digest
+.IP "key" 12
+Generated DH-HMAC-CHAP key
+.SH "RETURN"
+If key generation was successful the function returns 0 or
+-1 with errno set otherwise.
diff --git a/doc/man/nvme_get_ana_log_len.2 b/doc/man/nvme_get_ana_log_len.2
new file mode 100644
index 0000000..1e1b0da
--- /dev/null
+++ b/doc/man/nvme_get_ana_log_len.2
@@ -0,0 +1,15 @@
+.TH "nvme_get_ana_log_len" 9 "nvme_get_ana_log_len" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_ana_log_len \- Retrieve size of the current ANA log
+.SH SYNOPSIS
+.B "int" nvme_get_ana_log_len
+.BI "(int fd " ","
+.BI "size_t *analen " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "analen" 12
+Pointer to where the length will be set on success
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_attr.2 b/doc/man/nvme_get_attr.2
new file mode 100644
index 0000000..058e372
--- /dev/null
+++ b/doc/man/nvme_get_attr.2
@@ -0,0 +1,15 @@
+.TH "nvme_get_attr" 9 "nvme_get_attr" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_attr \- Read sysfs attribute
+.SH SYNOPSIS
+.B "char *" nvme_get_attr
+.BI "(const char *d " ","
+.BI "const char *attr " ");"
+.SH ARGUMENTS
+.IP "d" 12
+sysfs directory
+.IP "attr" 12
+sysfs attribute name
+.SH "RETURN"
+String with the contents of \fIattr\fP or NULL in case of an empty value
+or in case of an error (indicated by non-zero errno code).
diff --git a/doc/man/nvme_get_ctrl_attr.2 b/doc/man/nvme_get_ctrl_attr.2
new file mode 100644
index 0000000..622fa5f
--- /dev/null
+++ b/doc/man/nvme_get_ctrl_attr.2
@@ -0,0 +1,15 @@
+.TH "nvme_get_ctrl_attr" 9 "nvme_get_ctrl_attr" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_ctrl_attr \- Read controller sysfs attribute
+.SH SYNOPSIS
+.B "char *" nvme_get_ctrl_attr
+.BI "(nvme_ctrl_t c " ","
+.BI "const char *attr " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.IP "attr" 12
+sysfs attribute name
+.SH "RETURN"
+String with the contents of \fIattr\fP or NULL in case of an empty value
+or in case of an error (indicated by non-zero errno code).
diff --git a/doc/man/nvme_get_ctrl_telemetry.2 b/doc/man/nvme_get_ctrl_telemetry.2
new file mode 100644
index 0000000..79d55d6
--- /dev/null
+++ b/doc/man/nvme_get_ctrl_telemetry.2
@@ -0,0 +1,27 @@
+.TH "nvme_get_ctrl_telemetry" 9 "nvme_get_ctrl_telemetry" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_ctrl_telemetry \- Get controller telemetry log
+.SH SYNOPSIS
+.B "int" nvme_get_ctrl_telemetry
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "struct nvme_telemetry_log **log " ","
+.BI "enum nvme_telemetry_da da " ","
+.BI "size_t *size " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "log" 12
+On success, set to the value of the allocated and retrieved log.
+.IP "da" 12
+Log page data area, valid values: \fIenum nvme_telemetry_da\fP
+.IP "size" 12
+Ptr to the telemetry log size, so it can be returned
+.SH "DESCRIPTION"
+The total size allocated can be calculated as:
+(nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_directive_receive_length.2 b/doc/man/nvme_get_directive_receive_length.2
new file mode 100644
index 0000000..729b1de
--- /dev/null
+++ b/doc/man/nvme_get_directive_receive_length.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_directive_receive_length" 9 "nvme_get_directive_receive_length" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_directive_receive_length \- Get directive receive length
+.SH SYNOPSIS
+.B "int" nvme_get_directive_receive_length
+.BI "(enum nvme_directive_dtype dtype " ","
+.BI "enum nvme_directive_receive_doper doper " ","
+.BI "__u32 *len " ");"
+.SH ARGUMENTS
+.IP "dtype" 12
+Directive type, see \fIenum nvme_directive_dtype\fP
+.IP "doper" 12
+Directive receive operation, see \fIenum nvme_directive_receive_doper\fP
+.IP "len" 12
+On success, set to this directives payload length in bytes.
+.SH "RETURN"
+0 on success, -1 with errno set to EINVAL if the function did not
+recognize \fIdtype\fP or \fIdoper\fP.
diff --git a/doc/man/nvme_get_discovery_args.2 b/doc/man/nvme_get_discovery_args.2
new file mode 100644
index 0000000..6f83ded
--- /dev/null
+++ b/doc/man/nvme_get_discovery_args.2
@@ -0,0 +1,35 @@
+.TH "libnvme" 9 "struct nvme_get_discovery_args" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_get_discovery_args \- Arguments for nvmf_get_discovery_wargs()
+.SH SYNOPSIS
+struct nvme_get_discovery_args {
+.br
+.BI " nvme_ctrl_t c;"
+.br
+.BI " int args_size;"
+.br
+.BI " int max_retries;"
+.br
+.BI " __u32 *result;"
+.br
+.BI " __u32 timeout;"
+.br
+.BI " __u8 lsp;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "c" 12
+Discovery controller
+.IP "args_size" 12
+Length of the structure
+.IP "max_retries" 12
+Number of retries in case of failure
+.IP "result" 12
+The command completion result from CQE dword0
+.IP "timeout" 12
+Timeout in ms (default: NVME_DEFAULT_IOCTL_TIMEOUT)
+.IP "lsp" 12
+Log specific field (See enum nvmf_log_discovery_lsp)
diff --git a/doc/man/nvme_get_feature_length.2 b/doc/man/nvme_get_feature_length.2
new file mode 100644
index 0000000..50dd008
--- /dev/null
+++ b/doc/man/nvme_get_feature_length.2
@@ -0,0 +1,19 @@
+.TH "nvme_get_feature_length" 9 "nvme_get_feature_length" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_feature_length \- Retreive the command payload length for a specific feature identifier
+.SH SYNOPSIS
+.B "int" nvme_get_feature_length
+.BI "(int fid " ","
+.BI "__u32 cdw11 " ","
+.BI "__u32 *len " ");"
+.SH ARGUMENTS
+.IP "fid" 12
+Feature identifier, see \fIenum nvme_features_id\fP.
+.IP "cdw11" 12
+The cdw11 value may affect the transfer (only known fid is
+NVME_FEAT_FID_HOST_ID)
+.IP "len" 12
+On success, set to this features payload length in bytes.
+.SH "RETURN"
+0 on success, -1 with errno set to EINVAL if the function did not
+recognize \fIfid\fP.
diff --git a/doc/man/nvme_get_feature_length2.2 b/doc/man/nvme_get_feature_length2.2
new file mode 100644
index 0000000..41bd0f2
--- /dev/null
+++ b/doc/man/nvme_get_feature_length2.2
@@ -0,0 +1,24 @@
+.TH "nvme_get_feature_length2" 9 "nvme_get_feature_length2" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_feature_length2 \- Retreive the command payload length for a specific feature identifier
+.SH SYNOPSIS
+.B "int" nvme_get_feature_length2
+.BI "(int fid " ","
+.BI "__u32 cdw11 " ","
+.BI "enum nvme_data_tfr dir " ","
+.BI "__u32 *len " ");"
+.SH ARGUMENTS
+.IP "fid" 12
+Feature identifier, see \fIenum nvme_features_id\fP.
+.IP "cdw11" 12
+The cdw11 value may affect the transfer (only known fid is
+NVME_FEAT_FID_HOST_ID)
+.IP "dir" 12
+Data transfer direction: false - host to controller, true -
+controller to host may affect the transfer (only known fid is
+NVME_FEAT_FID_HOST_MEM_BUF).
+.IP "len" 12
+On success, set to this features payload length in bytes.
+.SH "RETURN"
+0 on success, -1 with errno set to EINVAL if the function did not
+recognize \fIfid\fP.
diff --git a/doc/man/nvme_get_features.2 b/doc/man/nvme_get_features.2
new file mode 100644
index 0000000..33c0a8f
--- /dev/null
+++ b/doc/man/nvme_get_features.2
@@ -0,0 +1,12 @@
+.TH "nvme_get_features" 9 "nvme_get_features" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features \- Retrieve a feature attribute
+.SH SYNOPSIS
+.B "int" nvme_get_features
+.BI "(struct nvme_get_features_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_get_features_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_arbitration.2 b/doc/man/nvme_get_features_arbitration.2
new file mode 100644
index 0000000..4a51848
--- /dev/null
+++ b/doc/man/nvme_get_features_arbitration.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_arbitration" 9 "nvme_get_features_arbitration" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_arbitration \- Get arbitration feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_arbitration
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_async_event.2 b/doc/man/nvme_get_features_async_event.2
new file mode 100644
index 0000000..2fb73f4
--- /dev/null
+++ b/doc/man/nvme_get_features_async_event.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_async_event" 9 "nvme_get_features_async_event" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_async_event \- Get asynchronous event feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_async_event
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_auto_pst.2 b/doc/man/nvme_get_features_auto_pst.2
new file mode 100644
index 0000000..fa3a947
--- /dev/null
+++ b/doc/man/nvme_get_features_auto_pst.2
@@ -0,0 +1,20 @@
+.TH "nvme_get_features_auto_pst" 9 "nvme_get_features_auto_pst" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_auto_pst \- Get autonomous power state feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_auto_pst
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "struct nvme_feat_auto_pst *apst " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "apst" 12
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_data.2 b/doc/man/nvme_get_features_data.2
new file mode 100644
index 0000000..b1a8604
--- /dev/null
+++ b/doc/man/nvme_get_features_data.2
@@ -0,0 +1,27 @@
+.TH "nvme_get_features_data" 9 "nvme_get_features_data" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_data \- Helper function for @nvme_get_features()
+.SH SYNOPSIS
+.B "int" nvme_get_features_data
+.BI "(int fd " ","
+.BI "enum nvme_features_id fid " ","
+.BI "__u32 nsid " ","
+.BI "__u32 data_len " ","
+.BI "void *data " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "fid" 12
+Feature identifier
+.IP "nsid" 12
+Namespace ID, if applicable
+.IP "data_len" 12
+Length of feature data, if applicable, in bytes
+.IP "data" 12
+User address of feature data, if applicable
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_endurance_event_cfg.2 b/doc/man/nvme_get_features_endurance_event_cfg.2
new file mode 100644
index 0000000..2b4715e
--- /dev/null
+++ b/doc/man/nvme_get_features_endurance_event_cfg.2
@@ -0,0 +1,21 @@
+.TH "nvme_get_features_endurance_event_cfg" 9 "nvme_get_features_endurance_event_cfg" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_endurance_event_cfg \- Get endurance event config feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_endurance_event_cfg
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u16 endgid " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "endgid" 12
+Endurance Group Identifier
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_err_recovery.2 b/doc/man/nvme_get_features_err_recovery.2
new file mode 100644
index 0000000..c8962ed
--- /dev/null
+++ b/doc/man/nvme_get_features_err_recovery.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_err_recovery" 9 "nvme_get_features_err_recovery" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_err_recovery \- Get error recovery feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_err_recovery
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_hctm.2 b/doc/man/nvme_get_features_hctm.2
new file mode 100644
index 0000000..c205318
--- /dev/null
+++ b/doc/man/nvme_get_features_hctm.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_hctm" 9 "nvme_get_features_hctm" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_hctm \- Get thermal management feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_hctm
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_host_behavior.2 b/doc/man/nvme_get_features_host_behavior.2
new file mode 100644
index 0000000..800211d
--- /dev/null
+++ b/doc/man/nvme_get_features_host_behavior.2
@@ -0,0 +1,21 @@
+.TH "nvme_get_features_host_behavior" 9 "nvme_get_features_host_behavior" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_host_behavior \- Get host behavior feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_host_behavior
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "struct nvme_feat_host_behavior *data " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "data" 12
+Pointer to structure nvme_feat_host_behavior
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_host_id.2 b/doc/man/nvme_get_features_host_id.2
new file mode 100644
index 0000000..4ee0ca8
--- /dev/null
+++ b/doc/man/nvme_get_features_host_id.2
@@ -0,0 +1,24 @@
+.TH "nvme_get_features_host_id" 9 "nvme_get_features_host_id" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_host_id \- Get host id feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_host_id
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "bool exhid " ","
+.BI "__u32 len " ","
+.BI "__u8 *hostid " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "exhid" 12
+Enable Extended Host Identifier
+.IP "len" 12
+Length of \fIhostid\fP
+.IP "hostid" 12
+Buffer for returned host ID
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_host_mem_buf.2 b/doc/man/nvme_get_features_host_mem_buf.2
new file mode 100644
index 0000000..5c3766b
--- /dev/null
+++ b/doc/man/nvme_get_features_host_mem_buf.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_host_mem_buf" 9 "nvme_get_features_host_mem_buf" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_host_mem_buf \- Get host memory buffer feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_host_mem_buf
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_iocs_profile.2 b/doc/man/nvme_get_features_iocs_profile.2
new file mode 100644
index 0000000..2fcde5f
--- /dev/null
+++ b/doc/man/nvme_get_features_iocs_profile.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_iocs_profile" 9 "nvme_get_features_iocs_profile" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_iocs_profile \- Get IOCS profile feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_iocs_profile
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_irq_coalesce.2 b/doc/man/nvme_get_features_irq_coalesce.2
new file mode 100644
index 0000000..c2b54dd
--- /dev/null
+++ b/doc/man/nvme_get_features_irq_coalesce.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_irq_coalesce" 9 "nvme_get_features_irq_coalesce" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_irq_coalesce \- Get IRQ coalesce feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_irq_coalesce
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_irq_config.2 b/doc/man/nvme_get_features_irq_config.2
new file mode 100644
index 0000000..1467d67
--- /dev/null
+++ b/doc/man/nvme_get_features_irq_config.2
@@ -0,0 +1,20 @@
+.TH "nvme_get_features_irq_config" 9 "nvme_get_features_irq_config" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_irq_config \- Get IRQ config feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_irq_config
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u16 iv " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "iv" 12
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_kato.2 b/doc/man/nvme_get_features_kato.2
new file mode 100644
index 0000000..464ea62
--- /dev/null
+++ b/doc/man/nvme_get_features_kato.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_kato" 9 "nvme_get_features_kato" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_kato \- Get keep alive timeout feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_kato
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_lba_range.2 b/doc/man/nvme_get_features_lba_range.2
new file mode 100644
index 0000000..19af419
--- /dev/null
+++ b/doc/man/nvme_get_features_lba_range.2
@@ -0,0 +1,21 @@
+.TH "nvme_get_features_lba_range" 9 "nvme_get_features_lba_range" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_lba_range \- Get LBA range feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_lba_range
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "struct nvme_lba_range_type *data " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "data" 12
+User address of feature data, if applicable
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_lba_sts_interval.2 b/doc/man/nvme_get_features_lba_sts_interval.2
new file mode 100644
index 0000000..d06b19b
--- /dev/null
+++ b/doc/man/nvme_get_features_lba_sts_interval.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_lba_sts_interval" 9 "nvme_get_features_lba_sts_interval" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_lba_sts_interval \- Get LBA status information feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_lba_sts_interval
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_nopsc.2 b/doc/man/nvme_get_features_nopsc.2
new file mode 100644
index 0000000..8c1e396
--- /dev/null
+++ b/doc/man/nvme_get_features_nopsc.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_nopsc" 9 "nvme_get_features_nopsc" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_nopsc \- Get non-operational power state feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_nopsc
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_num_queues.2 b/doc/man/nvme_get_features_num_queues.2
new file mode 100644
index 0000000..bda5239
--- /dev/null
+++ b/doc/man/nvme_get_features_num_queues.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_num_queues" 9 "nvme_get_features_num_queues" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_num_queues \- Get number of queues feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_num_queues
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_plm_config.2 b/doc/man/nvme_get_features_plm_config.2
new file mode 100644
index 0000000..d04f793
--- /dev/null
+++ b/doc/man/nvme_get_features_plm_config.2
@@ -0,0 +1,23 @@
+.TH "nvme_get_features_plm_config" 9 "nvme_get_features_plm_config" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_plm_config \- Get predictable latency feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_plm_config
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u16 nvmsetid " ","
+.BI "struct nvme_plm_config *data " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "nvmsetid" 12
+NVM set id
+.IP "data" 12
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_plm_window.2 b/doc/man/nvme_get_features_plm_window.2
new file mode 100644
index 0000000..454617c
--- /dev/null
+++ b/doc/man/nvme_get_features_plm_window.2
@@ -0,0 +1,21 @@
+.TH "nvme_get_features_plm_window" 9 "nvme_get_features_plm_window" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_plm_window \- Get window select feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_plm_window
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u16 nvmsetid " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "nvmsetid" 12
+NVM set id
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_power_mgmt.2 b/doc/man/nvme_get_features_power_mgmt.2
new file mode 100644
index 0000000..3155068
--- /dev/null
+++ b/doc/man/nvme_get_features_power_mgmt.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_power_mgmt" 9 "nvme_get_features_power_mgmt" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_power_mgmt \- Get power management feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_power_mgmt
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_resv_mask.2 b/doc/man/nvme_get_features_resv_mask.2
new file mode 100644
index 0000000..e02f80a
--- /dev/null
+++ b/doc/man/nvme_get_features_resv_mask.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_resv_mask" 9 "nvme_get_features_resv_mask" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_resv_mask \- Get reservation mask feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_resv_mask
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_resv_persist.2 b/doc/man/nvme_get_features_resv_persist.2
new file mode 100644
index 0000000..4e83fa7
--- /dev/null
+++ b/doc/man/nvme_get_features_resv_persist.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_resv_persist" 9 "nvme_get_features_resv_persist" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_resv_persist \- Get reservation persist feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_resv_persist
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_rrl.2 b/doc/man/nvme_get_features_rrl.2
new file mode 100644
index 0000000..069de9e
--- /dev/null
+++ b/doc/man/nvme_get_features_rrl.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_rrl" 9 "nvme_get_features_rrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_rrl \- Get read recovery level feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_rrl
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_sanitize.2 b/doc/man/nvme_get_features_sanitize.2
new file mode 100644
index 0000000..03a4a21
--- /dev/null
+++ b/doc/man/nvme_get_features_sanitize.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_sanitize" 9 "nvme_get_features_sanitize" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_sanitize \- Get sanitize feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_sanitize
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_sel.2 b/doc/man/nvme_get_features_sel.2
new file mode 100644
index 0000000..1b40475
--- /dev/null
+++ b/doc/man/nvme_get_features_sel.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvme_get_features_sel" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_get_features_sel \- Get Features - Select
+.SH SYNOPSIS
+enum nvme_get_features_sel {
+.br
+.BI " NVME_GET_FEATURES_SEL_CURRENT"
+,
+.br
+.br
+.BI " NVME_GET_FEATURES_SEL_DEFAULT"
+,
+.br
+.br
+.BI " NVME_GET_FEATURES_SEL_SAVED"
+,
+.br
+.br
+.BI " NVME_GET_FEATURES_SEL_SUPPORTED"
+
+};
+.SH Constants
+.IP "NVME_GET_FEATURES_SEL_CURRENT" 12
+Current value
+.IP "NVME_GET_FEATURES_SEL_DEFAULT" 12
+Default value
+.IP "NVME_GET_FEATURES_SEL_SAVED" 12
+Saved value
+.IP "NVME_GET_FEATURES_SEL_SUPPORTED" 12
+Supported capabilities
diff --git a/doc/man/nvme_get_features_simple.2 b/doc/man/nvme_get_features_simple.2
new file mode 100644
index 0000000..6347ea7
--- /dev/null
+++ b/doc/man/nvme_get_features_simple.2
@@ -0,0 +1,21 @@
+.TH "nvme_get_features_simple" 9 "nvme_get_features_simple" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_simple \- Helper function for @nvme_get_features()
+.SH SYNOPSIS
+.B "int" nvme_get_features_simple
+.BI "(int fd " ","
+.BI "enum nvme_features_id fid " ","
+.BI "__u32 nsid " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "fid" 12
+Feature identifier
+.IP "nsid" 12
+Namespace ID, if applicable
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_sw_progress.2 b/doc/man/nvme_get_features_sw_progress.2
new file mode 100644
index 0000000..2f3aaef
--- /dev/null
+++ b/doc/man/nvme_get_features_sw_progress.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_sw_progress" 9 "nvme_get_features_sw_progress" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_sw_progress \- Get software progress feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_sw_progress
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_temp_thresh.2 b/doc/man/nvme_get_features_temp_thresh.2
new file mode 100644
index 0000000..20da00f
--- /dev/null
+++ b/doc/man/nvme_get_features_temp_thresh.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_temp_thresh" 9 "nvme_get_features_temp_thresh" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_temp_thresh \- Get temperature threshold feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_temp_thresh
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_timestamp.2 b/doc/man/nvme_get_features_timestamp.2
new file mode 100644
index 0000000..f0e3ed9
--- /dev/null
+++ b/doc/man/nvme_get_features_timestamp.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_timestamp" 9 "nvme_get_features_timestamp" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_timestamp \- Get timestamp feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_timestamp
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "struct nvme_timestamp *ts " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "ts" 12
+Current timestamp
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_volatile_wc.2 b/doc/man/nvme_get_features_volatile_wc.2
new file mode 100644
index 0000000..6c366c9
--- /dev/null
+++ b/doc/man/nvme_get_features_volatile_wc.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_volatile_wc" 9 "nvme_get_features_volatile_wc" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_volatile_wc \- Get volatile write cache feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_volatile_wc
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_write_atomic.2 b/doc/man/nvme_get_features_write_atomic.2
new file mode 100644
index 0000000..5a517da
--- /dev/null
+++ b/doc/man/nvme_get_features_write_atomic.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_features_write_atomic" 9 "nvme_get_features_write_atomic" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_write_atomic \- Get write atomic feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_write_atomic
+.BI "(int fd " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_write_protect.2 b/doc/man/nvme_get_features_write_protect.2
new file mode 100644
index 0000000..cd1da22
--- /dev/null
+++ b/doc/man/nvme_get_features_write_protect.2
@@ -0,0 +1,21 @@
+.TH "nvme_get_features_write_protect" 9 "nvme_get_features_write_protect" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_features_write_protect \- Get write protect feature
+.SH SYNOPSIS
+.B "int" nvme_get_features_write_protect
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "enum nvme_get_features_sel sel " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace ID
+.IP "sel" 12
+Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_host_telemetry.2 b/doc/man/nvme_get_host_telemetry.2
new file mode 100644
index 0000000..5355a3c
--- /dev/null
+++ b/doc/man/nvme_get_host_telemetry.2
@@ -0,0 +1,24 @@
+.TH "nvme_get_host_telemetry" 9 "nvme_get_host_telemetry" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_host_telemetry \- Get host telemetry log
+.SH SYNOPSIS
+.B "int" nvme_get_host_telemetry
+.BI "(int fd " ","
+.BI "struct nvme_telemetry_log **log " ","
+.BI "enum nvme_telemetry_da da " ","
+.BI "size_t *size " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "log" 12
+On success, set to the value of the allocated and retrieved log.
+.IP "da" 12
+Log page data area, valid values: \fIenum nvme_telemetry_da\fP
+.IP "size" 12
+Ptr to the telemetry log size, so it can be returned
+.SH "DESCRIPTION"
+The total size allocated can be calculated as:
+(nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_lba_status.2 b/doc/man/nvme_get_lba_status.2
new file mode 100644
index 0000000..02a9dd3
--- /dev/null
+++ b/doc/man/nvme_get_lba_status.2
@@ -0,0 +1,15 @@
+.TH "nvme_get_lba_status" 9 "nvme_get_lba_status" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_lba_status \- Retrieve information on possibly unrecoverable LBAs
+.SH SYNOPSIS
+.B "int" nvme_get_lba_status
+.BI "(struct nvme_get_lba_status_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_get_lba_status_args\fP argument structure
+.SH "DESCRIPTION"
+The Get LBA Status command requests information about Potentially
+Unrecoverable LBAs. Refer to the specification for action type descriptions.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_lba_status_log.2 b/doc/man/nvme_get_lba_status_log.2
new file mode 100644
index 0000000..79fd0ee
--- /dev/null
+++ b/doc/man/nvme_get_lba_status_log.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_lba_status_log" 9 "nvme_get_lba_status_log" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_lba_status_log \- Retrieve the LBA Status log page
+.SH SYNOPSIS
+.B "int" nvme_get_lba_status_log
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "struct nvme_lba_status_log **log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of the nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "log" 12
+On success, set to the value of the allocated and retrieved log.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log.2 b/doc/man/nvme_get_log.2
new file mode 100644
index 0000000..6c33516
--- /dev/null
+++ b/doc/man/nvme_get_log.2
@@ -0,0 +1,12 @@
+.TH "nvme_get_log" 9 "nvme_get_log" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log \- NVMe Admin Get Log command
+.SH SYNOPSIS
+.B "int" nvme_get_log
+.BI "(struct nvme_get_log_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_get_log_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_ana.2 b/doc/man/nvme_get_log_ana.2
new file mode 100644
index 0000000..6822ff3
--- /dev/null
+++ b/doc/man/nvme_get_log_ana.2
@@ -0,0 +1,33 @@
+.TH "nvme_get_log_ana" 9 "nvme_get_log_ana" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_ana \- Retrieve Asymmetric Namespace Access log page
+.SH SYNOPSIS
+.B "int" nvme_get_log_ana
+.BI "(int fd " ","
+.BI "enum nvme_log_ana_lsp lsp " ","
+.BI "bool rae " ","
+.BI "__u64 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "lsp" 12
+Log specific, see \fIenum nvme_get_log_ana_lsp\fP
+.IP "rae" 12
+Retain asynchronous events
+.IP "offset" 12
+Offset to the start of the log page
+.IP "len" 12
+The allocated length of the log page
+.IP "log" 12
+User address to store the ana log
+.SH "DESCRIPTION"
+This log consists of a header describing the log and descriptors containing
+the asymmetric namespace access information for ANA Groups that contain
+namespaces that are attached to the controller processing the command.
+
+See \fIstruct nvme_ana_rsp_hdr\fP for the definition of the returned structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_ana_groups.2 b/doc/man/nvme_get_log_ana_groups.2
new file mode 100644
index 0000000..466d7e4
--- /dev/null
+++ b/doc/man/nvme_get_log_ana_groups.2
@@ -0,0 +1,23 @@
+.TH "nvme_get_log_ana_groups" 9 "nvme_get_log_ana_groups" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_ana_groups \- Retrieve Asymmetric Namespace Access groups only log page
+.SH SYNOPSIS
+.B "int" nvme_get_log_ana_groups
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "__u32 len " ","
+.BI "struct nvme_ana_group_desc *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "len" 12
+The allocated length of the log page
+.IP "log" 12
+User address to store the ana group log
+.SH "DESCRIPTION"
+See \fIstruct nvme_ana_group_desc\fP for the definition of the returned structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_boot_partition.2 b/doc/man/nvme_get_log_boot_partition.2
new file mode 100644
index 0000000..a649316
--- /dev/null
+++ b/doc/man/nvme_get_log_boot_partition.2
@@ -0,0 +1,25 @@
+.TH "nvme_get_log_boot_partition" 9 "nvme_get_log_boot_partition" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_boot_partition \- Retrieve Boot Partition
+.SH SYNOPSIS
+.B "int" nvme_get_log_boot_partition
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "__u8 lsp " ","
+.BI "__u32 len " ","
+.BI "struct nvme_boot_partition *part " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "lsp" 12
+The log specified field of LID
+.IP "len" 12
+The allocated size, minimum
+struct nvme_boot_partition
+.IP "part" 12
+User address to store the log page
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise
diff --git a/doc/man/nvme_get_log_changed_ns_list.2 b/doc/man/nvme_get_log_changed_ns_list.2
new file mode 100644
index 0000000..2f93f0d
--- /dev/null
+++ b/doc/man/nvme_get_log_changed_ns_list.2
@@ -0,0 +1,22 @@
+.TH "nvme_get_log_changed_ns_list" 9 "nvme_get_log_changed_ns_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_changed_ns_list \- Retrieve namespace changed list
+.SH SYNOPSIS
+.B "int" nvme_get_log_changed_ns_list
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "struct nvme_ns_list *ns_log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "ns_log" 12
+User address to store the log page
+.SH "DESCRIPTION"
+This log page describes namespaces attached to this controller that have
+changed since the last time the namespace was identified, been added, or
+deleted.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_cmd_effects.2 b/doc/man/nvme_get_log_cmd_effects.2
new file mode 100644
index 0000000..7045413
--- /dev/null
+++ b/doc/man/nvme_get_log_cmd_effects.2
@@ -0,0 +1,21 @@
+.TH "nvme_get_log_cmd_effects" 9 "nvme_get_log_cmd_effects" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_cmd_effects \- Retrieve nvme command effects log
+.SH SYNOPSIS
+.B "int" nvme_get_log_cmd_effects
+.BI "(int fd " ","
+.BI "enum nvme_csi csi " ","
+.BI "struct nvme_cmd_effects_log *effects_log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "csi" 12
+Command Set Identifier
+.IP "effects_log" 12
+User address to store the effects log
+.SH "DESCRIPTION"
+This log page describes the commands that the controller supports and the
+effects of those commands on the state of the NVM subsystem.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_create_telemetry_host.2 b/doc/man/nvme_get_log_create_telemetry_host.2
new file mode 100644
index 0000000..4eca320
--- /dev/null
+++ b/doc/man/nvme_get_log_create_telemetry_host.2
@@ -0,0 +1,15 @@
+.TH "nvme_get_log_create_telemetry_host" 9 "nvme_get_log_create_telemetry_host" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_create_telemetry_host \- Create host telemetry log
+.SH SYNOPSIS
+.B "int" nvme_get_log_create_telemetry_host
+.BI "(int fd " ","
+.BI "struct nvme_telemetry_log *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "log" 12
+Userspace address of the log payload
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_device_self_test.2 b/doc/man/nvme_get_log_device_self_test.2
new file mode 100644
index 0000000..9447e7e
--- /dev/null
+++ b/doc/man/nvme_get_log_device_self_test.2
@@ -0,0 +1,19 @@
+.TH "nvme_get_log_device_self_test" 9 "nvme_get_log_device_self_test" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_device_self_test \- Retrieve the device self test log
+.SH SYNOPSIS
+.B "int" nvme_get_log_device_self_test
+.BI "(int fd " ","
+.BI "struct nvme_self_test_log *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "log" 12
+Userspace address of the log payload
+.SH "DESCRIPTION"
+The log page indicates the status of an in progress self test and the
+percent complete of that operation, and the results of the previous 20
+self-test operations.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_discovery.2 b/doc/man/nvme_get_log_discovery.2
new file mode 100644
index 0000000..4fd1409
--- /dev/null
+++ b/doc/man/nvme_get_log_discovery.2
@@ -0,0 +1,27 @@
+.TH "nvme_get_log_discovery" 9 "nvme_get_log_discovery" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_discovery \- Retrieve Discovery log page
+.SH SYNOPSIS
+.B "int" nvme_get_log_discovery
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "__u32 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "offset" 12
+Offset of this log to retrieve
+.IP "len" 12
+The allocated size for this portion of the log
+.IP "log" 12
+User address to store the discovery log
+.SH "DESCRIPTION"
+Supported only by fabrics discovery controllers, returning discovery
+records.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_endurance_group.2 b/doc/man/nvme_get_log_endurance_group.2
new file mode 100644
index 0000000..91b596e
--- /dev/null
+++ b/doc/man/nvme_get_log_endurance_group.2
@@ -0,0 +1,25 @@
+.TH "nvme_get_log_endurance_group" 9 "nvme_get_log_endurance_group" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_endurance_group \- Get Endurance Group log
+.SH SYNOPSIS
+.B "int" nvme_get_log_endurance_group
+.BI "(int fd " ","
+.BI "__u16 endgid " ","
+.BI "struct nvme_endurance_group_log *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "endgid" 12
+Starting group identifier to return in the list
+.IP "log" 12
+User address to store the endurance log
+.SH "DESCRIPTION"
+This log page indicates if an Endurance Group Event has occurred for a
+particular Endurance Group. If an Endurance Group Event has occurred, the
+details of the particular event are included in the Endurance Group
+Information log page for that Endurance Group. An asynchronous event is
+generated when an entry for an Endurance Group is newly added to this log
+page.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_endurance_grp_evt.2 b/doc/man/nvme_get_log_endurance_grp_evt.2
new file mode 100644
index 0000000..fbb4910
--- /dev/null
+++ b/doc/man/nvme_get_log_endurance_grp_evt.2
@@ -0,0 +1,24 @@
+.TH "nvme_get_log_endurance_grp_evt" 9 "nvme_get_log_endurance_grp_evt" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_endurance_grp_evt \- Retrieve Rotational Media Information
+.SH SYNOPSIS
+.B "int" nvme_get_log_endurance_grp_evt
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "__u32 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "offset" 12
+Offset to the start of the log page
+.IP "len" 12
+The allocated length of the log page
+.IP "log" 12
+User address to store the log page
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_error.2 b/doc/man/nvme_get_log_error.2
new file mode 100644
index 0000000..48c1bc1
--- /dev/null
+++ b/doc/man/nvme_get_log_error.2
@@ -0,0 +1,25 @@
+.TH "nvme_get_log_error" 9 "nvme_get_log_error" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_error \- Retrieve nvme error log
+.SH SYNOPSIS
+.B "int" nvme_get_log_error
+.BI "(int fd " ","
+.BI "unsigned int nr_entries " ","
+.BI "bool rae " ","
+.BI "struct nvme_error_log_page *err_log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nr_entries" 12
+Number of error log entries allocated
+.IP "rae" 12
+Retain asynchronous events
+.IP "err_log" 12
+Array of error logs of size 'entries'
+.SH "DESCRIPTION"
+This log page describes extended error information for a command that
+completed with error, or may report an error that is not specific to a
+particular command.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_fdp_configurations.2 b/doc/man/nvme_get_log_fdp_configurations.2
new file mode 100644
index 0000000..71c0b5f
--- /dev/null
+++ b/doc/man/nvme_get_log_fdp_configurations.2
@@ -0,0 +1,21 @@
+.TH "nvme_get_log_fdp_configurations" 9 "nvme_get_log_fdp_configurations" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_fdp_configurations \- Get list of Flexible Data Placement configurations
+.SH SYNOPSIS
+.B "int" nvme_get_log_fdp_configurations
+.BI "(int fd " ","
+.BI "__u16 egid " ","
+.BI "__u32 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "egid" 12
+Endurance group identifier
+.IP "offset" 12
+Offset into log page
+.IP "len" 12
+Length (in bytes) of provided user buffer to hold the log data
+.IP "log" 12
+Log page data buffer
diff --git a/doc/man/nvme_get_log_fdp_events.2 b/doc/man/nvme_get_log_fdp_events.2
new file mode 100644
index 0000000..a5613f4
--- /dev/null
+++ b/doc/man/nvme_get_log_fdp_events.2
@@ -0,0 +1,24 @@
+.TH "nvme_get_log_fdp_events" 9 "nvme_get_log_fdp_events" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_fdp_events \- Get Flexible Data Placement events
+.SH SYNOPSIS
+.B "int" nvme_get_log_fdp_events
+.BI "(int fd " ","
+.BI "__u16 egid " ","
+.BI "bool host_events " ","
+.BI "__u32 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "egid" 12
+Endurance group identifier
+.IP "host_events" 12
+Whether to report host or controller events
+.IP "offset" 12
+Offset into log page
+.IP "len" 12
+Length (in bytes) of provided user buffer to hold the log data
+.IP "log" 12
+Log page data buffer
diff --git a/doc/man/nvme_get_log_fdp_stats.2 b/doc/man/nvme_get_log_fdp_stats.2
new file mode 100644
index 0000000..adcd781
--- /dev/null
+++ b/doc/man/nvme_get_log_fdp_stats.2
@@ -0,0 +1,21 @@
+.TH "nvme_get_log_fdp_stats" 9 "nvme_get_log_fdp_stats" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_fdp_stats \- Get Flexible Data Placement statistics
+.SH SYNOPSIS
+.B "int" nvme_get_log_fdp_stats
+.BI "(int fd " ","
+.BI "__u16 egid " ","
+.BI "__u32 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "egid" 12
+Endurance group identifier
+.IP "offset" 12
+Offset into log page
+.IP "len" 12
+Length (in bytes) of provided user buffer to hold the log data
+.IP "log" 12
+Log page data buffer
diff --git a/doc/man/nvme_get_log_fid_supported_effects.2 b/doc/man/nvme_get_log_fid_supported_effects.2
new file mode 100644
index 0000000..0b7541c
--- /dev/null
+++ b/doc/man/nvme_get_log_fid_supported_effects.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_log_fid_supported_effects" 9 "nvme_get_log_fid_supported_effects" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_fid_supported_effects \- Retrieve Feature Identifiers Supported and Effects
+.SH SYNOPSIS
+.B "int" nvme_get_log_fid_supported_effects
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "struct nvme_fid_supported_effects_log *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "log" 12
+FID Supported and Effects data structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise
diff --git a/doc/man/nvme_get_log_fw_slot.2 b/doc/man/nvme_get_log_fw_slot.2
new file mode 100644
index 0000000..787f2d0
--- /dev/null
+++ b/doc/man/nvme_get_log_fw_slot.2
@@ -0,0 +1,22 @@
+.TH "nvme_get_log_fw_slot" 9 "nvme_get_log_fw_slot" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_fw_slot \- Retrieves the controller firmware log
+.SH SYNOPSIS
+.B "int" nvme_get_log_fw_slot
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "struct nvme_firmware_slot *fw_log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "fw_log" 12
+User address to store the log page
+.SH "DESCRIPTION"
+This log page describes the firmware revision stored in each firmware slot
+supported. The firmware revision is indicated as an ASCII string. The log
+page also indicates the active slot number.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_lba_status.2 b/doc/man/nvme_get_log_lba_status.2
new file mode 100644
index 0000000..11ba889
--- /dev/null
+++ b/doc/man/nvme_get_log_lba_status.2
@@ -0,0 +1,24 @@
+.TH "nvme_get_log_lba_status" 9 "nvme_get_log_lba_status" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_lba_status \- Retrieve LBA Status
+.SH SYNOPSIS
+.B "int" nvme_get_log_lba_status
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "__u64 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "offset" 12
+Offset to the start of the log page
+.IP "len" 12
+The allocated length of the log page
+.IP "log" 12
+User address to store the log page
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_media_unit_stat.2 b/doc/man/nvme_get_log_media_unit_stat.2
new file mode 100644
index 0000000..ce07cf9
--- /dev/null
+++ b/doc/man/nvme_get_log_media_unit_stat.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_log_media_unit_stat" 9 "nvme_get_log_media_unit_stat" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_media_unit_stat \- Retrieve Media Unit Status
+.SH SYNOPSIS
+.B "int" nvme_get_log_media_unit_stat
+.BI "(int fd " ","
+.BI "__u16 domid " ","
+.BI "struct nvme_media_unit_stat_log *mus " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "domid" 12
+Domain Identifier selection, if supported
+.IP "mus" 12
+User address to store the Media Unit statistics log
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise
diff --git a/doc/man/nvme_get_log_mi_cmd_supported_effects.2 b/doc/man/nvme_get_log_mi_cmd_supported_effects.2
new file mode 100644
index 0000000..c2c973f
--- /dev/null
+++ b/doc/man/nvme_get_log_mi_cmd_supported_effects.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_log_mi_cmd_supported_effects" 9 "nvme_get_log_mi_cmd_supported_effects" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_mi_cmd_supported_effects \- displays the MI Commands Supported by the controller
+.SH SYNOPSIS
+.B "int" nvme_get_log_mi_cmd_supported_effects
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "struct nvme_mi_cmd_supported_effects_log *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "log" 12
+MI Command Supported and Effects data structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise
diff --git a/doc/man/nvme_get_log_page.2 b/doc/man/nvme_get_log_page.2
new file mode 100644
index 0000000..9ff9c87
--- /dev/null
+++ b/doc/man/nvme_get_log_page.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_log_page" 9 "nvme_get_log_page" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_page \- Get log page data
+.SH SYNOPSIS
+.B "int" nvme_get_log_page
+.BI "(int fd " ","
+.BI "__u32 xfer_len " ","
+.BI "struct nvme_get_log_args *args " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "xfer_len" 12
+Max log transfer size per request to split the total.
+.IP "args" 12
+\fIstruct nvme_get_log_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_persistent_event.2 b/doc/man/nvme_get_log_persistent_event.2
new file mode 100644
index 0000000..d11de09
--- /dev/null
+++ b/doc/man/nvme_get_log_persistent_event.2
@@ -0,0 +1,21 @@
+.TH "nvme_get_log_persistent_event" 9 "nvme_get_log_persistent_event" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_persistent_event \- Retrieve Persistent Event Log
+.SH SYNOPSIS
+.B "int" nvme_get_log_persistent_event
+.BI "(int fd " ","
+.BI "enum nvme_pevent_log_action action " ","
+.BI "__u32 size " ","
+.BI "void *pevent_log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "action" 12
+Action the controller should take during processing this command
+.IP "size" 12
+Size of \fIpevent_log\fP
+.IP "pevent_log" 12
+User address to store the persistent event log
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_predictable_lat_event.2 b/doc/man/nvme_get_log_predictable_lat_event.2
new file mode 100644
index 0000000..6e33277
--- /dev/null
+++ b/doc/man/nvme_get_log_predictable_lat_event.2
@@ -0,0 +1,24 @@
+.TH "nvme_get_log_predictable_lat_event" 9 "nvme_get_log_predictable_lat_event" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_predictable_lat_event \- Retrieve Predictable Latency Event Aggregate Log Page
+.SH SYNOPSIS
+.B "int" nvme_get_log_predictable_lat_event
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "__u32 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "offset" 12
+Offset into the predictable latency event
+.IP "len" 12
+Length of provided user buffer to hold the log data in bytes
+.IP "log" 12
+User address for log page data
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_predictable_lat_nvmset.2 b/doc/man/nvme_get_log_predictable_lat_nvmset.2
new file mode 100644
index 0000000..bc5fde8
--- /dev/null
+++ b/doc/man/nvme_get_log_predictable_lat_nvmset.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_log_predictable_lat_nvmset" 9 "nvme_get_log_predictable_lat_nvmset" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_predictable_lat_nvmset \- Predictable Latency Per NVM Set
+.SH SYNOPSIS
+.B "int" nvme_get_log_predictable_lat_nvmset
+.BI "(int fd " ","
+.BI "__u16 nvmsetid " ","
+.BI "struct nvme_nvmset_predictable_lat_log *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nvmsetid" 12
+NVM set id
+.IP "log" 12
+User address to store the predictable latency log
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_reclaim_unit_handle_usage.2 b/doc/man/nvme_get_log_reclaim_unit_handle_usage.2
new file mode 100644
index 0000000..7e62cc6
--- /dev/null
+++ b/doc/man/nvme_get_log_reclaim_unit_handle_usage.2
@@ -0,0 +1,21 @@
+.TH "nvme_get_log_reclaim_unit_handle_usage" 9 "nvme_get_log_reclaim_unit_handle_usage" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_reclaim_unit_handle_usage \- Get reclaim unit handle usage
+.SH SYNOPSIS
+.B "int" nvme_get_log_reclaim_unit_handle_usage
+.BI "(int fd " ","
+.BI "__u16 egid " ","
+.BI "__u32 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "egid" 12
+Endurance group identifier
+.IP "offset" 12
+Offset into log page
+.IP "len" 12
+Length (in bytes) of provided user buffer to hold the log data
+.IP "log" 12
+Log page data buffer
diff --git a/doc/man/nvme_get_log_reservation.2 b/doc/man/nvme_get_log_reservation.2
new file mode 100644
index 0000000..dd0a3cb
--- /dev/null
+++ b/doc/man/nvme_get_log_reservation.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_log_reservation" 9 "nvme_get_log_reservation" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_reservation \- Retrieve Reservation Notification
+.SH SYNOPSIS
+.B "int" nvme_get_log_reservation
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "struct nvme_resv_notification_log *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "log" 12
+User address to store the reservation log
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise
diff --git a/doc/man/nvme_get_log_sanitize.2 b/doc/man/nvme_get_log_sanitize.2
new file mode 100644
index 0000000..35c7e41
--- /dev/null
+++ b/doc/man/nvme_get_log_sanitize.2
@@ -0,0 +1,21 @@
+.TH "nvme_get_log_sanitize" 9 "nvme_get_log_sanitize" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_sanitize \- Retrieve Sanitize Status
+.SH SYNOPSIS
+.B "int" nvme_get_log_sanitize
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "struct nvme_sanitize_log_page *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "log" 12
+User address to store the sanitize log
+.SH "DESCRIPTION"
+The Sanitize Status log page reports sanitize operation time estimates and
+information about the most recent sanitize operation.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_smart.2 b/doc/man/nvme_get_log_smart.2
new file mode 100644
index 0000000..48fcc57
--- /dev/null
+++ b/doc/man/nvme_get_log_smart.2
@@ -0,0 +1,28 @@
+.TH "nvme_get_log_smart" 9 "nvme_get_log_smart" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_smart \- Retrieve nvme smart log
+.SH SYNOPSIS
+.B "int" nvme_get_log_smart
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "bool rae " ","
+.BI "struct nvme_smart_log *smart_log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Optional namespace identifier
+.IP "rae" 12
+Retain asynchronous events
+.IP "smart_log" 12
+User address to store the smart log
+.SH "DESCRIPTION"
+This log page provides SMART and general health information. The information
+provided is over the life of the controller and is retained across power
+cycles. To request the controller log page, the namespace identifier
+specified is FFFFFFFFh. The controller may also support requesting the log
+page on a per namespace basis, as indicated by bit 0 of the LPA field in the
+Identify Controller data structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_support_cap_config_list.2 b/doc/man/nvme_get_log_support_cap_config_list.2
new file mode 100644
index 0000000..2b8881d
--- /dev/null
+++ b/doc/man/nvme_get_log_support_cap_config_list.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_log_support_cap_config_list" 9 "nvme_get_log_support_cap_config_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_support_cap_config_list \- Retrieve Supported Capacity Configuration List
+.SH SYNOPSIS
+.B "int" nvme_get_log_support_cap_config_list
+.BI "(int fd " ","
+.BI "__u16 domid " ","
+.BI "struct nvme_supported_cap_config_list_log *cap " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "domid" 12
+Domain Identifier selection, if supported
+.IP "cap" 12
+User address to store supported capabilities config list
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise
diff --git a/doc/man/nvme_get_log_supported_log_pages.2 b/doc/man/nvme_get_log_supported_log_pages.2
new file mode 100644
index 0000000..335b35d
--- /dev/null
+++ b/doc/man/nvme_get_log_supported_log_pages.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_log_supported_log_pages" 9 "nvme_get_log_supported_log_pages" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_supported_log_pages \- Retrieve nmve supported log pages
+.SH SYNOPSIS
+.B "int" nvme_get_log_supported_log_pages
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "struct nvme_supported_log_pages *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "log" 12
+Array of LID supported and Effects data structures
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_telemetry_ctrl.2 b/doc/man/nvme_get_log_telemetry_ctrl.2
new file mode 100644
index 0000000..2fa418f
--- /dev/null
+++ b/doc/man/nvme_get_log_telemetry_ctrl.2
@@ -0,0 +1,27 @@
+.TH "nvme_get_log_telemetry_ctrl" 9 "nvme_get_log_telemetry_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_telemetry_ctrl \- Get Telemetry Controller-Initiated log page
+.SH SYNOPSIS
+.B "int" nvme_get_log_telemetry_ctrl
+.BI "(int fd " ","
+.BI "bool rae " ","
+.BI "__u64 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rae" 12
+Retain asynchronous events
+.IP "offset" 12
+Offset into the telemetry data
+.IP "len" 12
+Length of provided user buffer to hold the log data in bytes
+.IP "log" 12
+User address for log page data
+.SH "DESCRIPTION"
+Retrieves the Telemetry Controller-Initiated log page at the requested offset
+using the previously existing capture.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_telemetry_host.2 b/doc/man/nvme_get_log_telemetry_host.2
new file mode 100644
index 0000000..01bccc7
--- /dev/null
+++ b/doc/man/nvme_get_log_telemetry_host.2
@@ -0,0 +1,24 @@
+.TH "nvme_get_log_telemetry_host" 9 "nvme_get_log_telemetry_host" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_telemetry_host \- Get Telemetry Host-Initiated log page
+.SH SYNOPSIS
+.B "int" nvme_get_log_telemetry_host
+.BI "(int fd " ","
+.BI "__u64 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "offset" 12
+Offset into the telemetry data
+.IP "len" 12
+Length of provided user buffer to hold the log data in bytes
+.IP "log" 12
+User address for log page data
+.SH "DESCRIPTION"
+Retrieves the Telemetry Host-Initiated log page at the requested offset
+using the previously existing capture.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_zns_changed_zones.2 b/doc/man/nvme_get_log_zns_changed_zones.2
new file mode 100644
index 0000000..908bf12
--- /dev/null
+++ b/doc/man/nvme_get_log_zns_changed_zones.2
@@ -0,0 +1,23 @@
+.TH "nvme_get_log_zns_changed_zones" 9 "nvme_get_log_zns_changed_zones" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_log_zns_changed_zones \- Retrieve list of zones that have changed
+.SH SYNOPSIS
+.B "int" nvme_get_log_zns_changed_zones
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "bool rae " ","
+.BI "struct nvme_zns_changed_zone_log *log " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace ID
+.IP "rae" 12
+Retain asynchronous events
+.IP "log" 12
+User address to store the changed zone log
+.SH "DESCRIPTION"
+The list of zones that have changed state due to an exceptional event.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_logical_block_size.2 b/doc/man/nvme_get_logical_block_size.2
new file mode 100644
index 0000000..63419a7
--- /dev/null
+++ b/doc/man/nvme_get_logical_block_size.2
@@ -0,0 +1,18 @@
+.TH "nvme_get_logical_block_size" 9 "nvme_get_logical_block_size" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_logical_block_size \- Retrieve block size
+.SH SYNOPSIS
+.B "int" nvme_get_logical_block_size
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "int *blksize " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace id
+.IP "blksize" 12
+Pointer to where the block size will be set on success
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_new_host_telemetry.2 b/doc/man/nvme_get_new_host_telemetry.2
new file mode 100644
index 0000000..d6d101a
--- /dev/null
+++ b/doc/man/nvme_get_new_host_telemetry.2
@@ -0,0 +1,24 @@
+.TH "nvme_get_new_host_telemetry" 9 "nvme_get_new_host_telemetry" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_new_host_telemetry \- Get new host telemetry log
+.SH SYNOPSIS
+.B "int" nvme_get_new_host_telemetry
+.BI "(int fd " ","
+.BI "struct nvme_telemetry_log **log " ","
+.BI "enum nvme_telemetry_da da " ","
+.BI "size_t *size " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "log" 12
+On success, set to the value of the allocated and retrieved log.
+.IP "da" 12
+Log page data area, valid values: \fIenum nvme_telemetry_da\fP
+.IP "size" 12
+Ptr to the telemetry log size, so it can be returned
+.SH "DESCRIPTION"
+The total size allocated can be calculated as:
+(nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_ns_attr.2 b/doc/man/nvme_get_ns_attr.2
new file mode 100644
index 0000000..0aa77f7
--- /dev/null
+++ b/doc/man/nvme_get_ns_attr.2
@@ -0,0 +1,15 @@
+.TH "nvme_get_ns_attr" 9 "nvme_get_ns_attr" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_ns_attr \- Read namespace sysfs attribute
+.SH SYNOPSIS
+.B "char *" nvme_get_ns_attr
+.BI "(nvme_ns_t n " ","
+.BI "const char *attr " ");"
+.SH ARGUMENTS
+.IP "n" 12
+nvme_ns_t object
+.IP "attr" 12
+sysfs attribute name
+.SH "RETURN"
+String with the contents of \fIattr\fP or NULL in case of an empty value
+or in case of an error (indicated by non-zero errno code).
diff --git a/doc/man/nvme_get_nsid.2 b/doc/man/nvme_get_nsid.2
new file mode 100644
index 0000000..8773686
--- /dev/null
+++ b/doc/man/nvme_get_nsid.2
@@ -0,0 +1,19 @@
+.TH "nvme_get_nsid" 9 "nvme_get_nsid" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_nsid \- Retrieve the NSID from a namespace file descriptor
+.SH SYNOPSIS
+.B "int" nvme_get_nsid
+.BI "(int fd " ","
+.BI "__u32 *nsid " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme namespace
+.IP "nsid" 12
+User pointer to namespace id
+.SH "DESCRIPTION"
+This should only be sent to namespace handles, not to controllers. The
+kernel's interface returns the nsid as the return value. This is unfortunate
+for many architectures that are incapable of allowing distinguishing a
+namespace id > 0x80000000 from a negative error number.
+.SH "RETURN"
+0 if \fInsid\fP was set successfully or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_path_attr.2 b/doc/man/nvme_get_path_attr.2
new file mode 100644
index 0000000..73b73a2
--- /dev/null
+++ b/doc/man/nvme_get_path_attr.2
@@ -0,0 +1,15 @@
+.TH "nvme_get_path_attr" 9 "nvme_get_path_attr" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_path_attr \- Read path sysfs attribute
+.SH SYNOPSIS
+.B "char *" nvme_get_path_attr
+.BI "(nvme_path_t p " ","
+.BI "const char *attr " ");"
+.SH ARGUMENTS
+.IP "p" 12
+nvme_path_t object
+.IP "attr" 12
+sysfs attribute name
+.SH "RETURN"
+String with the contents of \fIattr\fP or NULL in case of an empty value
+or in case of an error (indicated by non-zero errno code).
diff --git a/doc/man/nvme_get_property.2 b/doc/man/nvme_get_property.2
new file mode 100644
index 0000000..b5d8582
--- /dev/null
+++ b/doc/man/nvme_get_property.2
@@ -0,0 +1,15 @@
+.TH "nvme_get_property" 9 "nvme_get_property" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_property \- Get a controller property
+.SH SYNOPSIS
+.B "int" nvme_get_property
+.BI "(struct nvme_get_property_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_get_propert_args\fP argument structure
+.SH "DESCRIPTION"
+This is an NVMe-over-Fabrics specific command, not applicable to PCIe. These
+properties align to the PCI MMIO controller registers.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_subsys_attr.2 b/doc/man/nvme_get_subsys_attr.2
new file mode 100644
index 0000000..645e947
--- /dev/null
+++ b/doc/man/nvme_get_subsys_attr.2
@@ -0,0 +1,15 @@
+.TH "nvme_get_subsys_attr" 9 "nvme_get_subsys_attr" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_get_subsys_attr \- Read subsystem sysfs attribute
+.SH SYNOPSIS
+.B "char *" nvme_get_subsys_attr
+.BI "(nvme_subsystem_t s " ","
+.BI "const char *attr " ");"
+.SH ARGUMENTS
+.IP "s" 12
+nvme_subsystem_t object
+.IP "attr" 12
+sysfs attribute name
+.SH "RETURN"
+String with the contents of \fIattr\fP or NULL in case of an empty value
+or in case of an error (indicated by non-zero errno code).
diff --git a/doc/man/nvme_hmac_alg.2 b/doc/man/nvme_hmac_alg.2
new file mode 100644
index 0000000..a243dee
--- /dev/null
+++ b/doc/man/nvme_hmac_alg.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvme_hmac_alg" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_hmac_alg \- HMAC algorithm
+.SH SYNOPSIS
+enum nvme_hmac_alg {
+.br
+.BI " NVME_HMAC_ALG_NONE"
+,
+.br
+.br
+.BI " NVME_HMAC_ALG_SHA2_256"
+,
+.br
+.br
+.BI " NVME_HMAC_ALG_SHA2_384"
+,
+.br
+.br
+.BI " NVME_HMAC_ALG_SHA2_512"
+
+};
+.SH Constants
+.IP "NVME_HMAC_ALG_NONE" 12
+No HMAC algorithm
+.IP "NVME_HMAC_ALG_SHA2_256" 12
+SHA2-256
+.IP "NVME_HMAC_ALG_SHA2_384" 12
+SHA2-384
+.IP "NVME_HMAC_ALG_SHA2_512" 12
+SHA2-512
diff --git a/doc/man/nvme_host_behavior_support.2 b/doc/man/nvme_host_behavior_support.2
new file mode 100644
index 0000000..d2d1b4d
--- /dev/null
+++ b/doc/man/nvme_host_behavior_support.2
@@ -0,0 +1,12 @@
+.TH "libnvme" 9 "enum nvme_host_behavior_support" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_host_behavior_support \- Enable Advanced Command
+.SH SYNOPSIS
+enum nvme_host_behavior_support {
+.br
+.BI " NVME_ENABLE_ACRE"
+
+};
+.SH Constants
+.IP "NVME_ENABLE_ACRE" 12
+Enable Advanced Command Retry Enable
diff --git a/doc/man/nvme_host_get_dhchap_key.2 b/doc/man/nvme_host_get_dhchap_key.2
new file mode 100644
index 0000000..d99e3cd
--- /dev/null
+++ b/doc/man/nvme_host_get_dhchap_key.2
@@ -0,0 +1,11 @@
+.TH "nvme_host_get_dhchap_key" 9 "nvme_host_get_dhchap_key" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_host_get_dhchap_key \- Return host key
+.SH SYNOPSIS
+.B "const char *" nvme_host_get_dhchap_key
+.BI "(nvme_host_t h " ");"
+.SH ARGUMENTS
+.IP "h" 12
+Host for which the key should be returned
+.SH "RETURN"
+DH-HMAC-CHAP host key or NULL if not set
diff --git a/doc/man/nvme_host_get_hostid.2 b/doc/man/nvme_host_get_hostid.2
new file mode 100644
index 0000000..313c6aa
--- /dev/null
+++ b/doc/man/nvme_host_get_hostid.2
@@ -0,0 +1,11 @@
+.TH "nvme_host_get_hostid" 9 "nvme_host_get_hostid" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_host_get_hostid \- Host ID of an nvme_host_t object
+.SH SYNOPSIS
+.B "const char *" nvme_host_get_hostid
+.BI "(nvme_host_t h " ");"
+.SH ARGUMENTS
+.IP "h" 12
+nvme_host_t object
+.SH "RETURN"
+Host ID of \fIh\fP
diff --git a/doc/man/nvme_host_get_hostnqn.2 b/doc/man/nvme_host_get_hostnqn.2
new file mode 100644
index 0000000..91383a9
--- /dev/null
+++ b/doc/man/nvme_host_get_hostnqn.2
@@ -0,0 +1,11 @@
+.TH "nvme_host_get_hostnqn" 9 "nvme_host_get_hostnqn" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_host_get_hostnqn \- Host NQN of an nvme_host_t object
+.SH SYNOPSIS
+.B "const char *" nvme_host_get_hostnqn
+.BI "(nvme_host_t h " ");"
+.SH ARGUMENTS
+.IP "h" 12
+nvme_host_t object
+.SH "RETURN"
+Host NQN of \fIh\fP
diff --git a/doc/man/nvme_host_get_hostsymname.2 b/doc/man/nvme_host_get_hostsymname.2
new file mode 100644
index 0000000..095d114
--- /dev/null
+++ b/doc/man/nvme_host_get_hostsymname.2
@@ -0,0 +1,12 @@
+.TH "nvme_host_get_hostsymname" 9 "nvme_host_get_hostsymname" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_host_get_hostsymname \- Get the host's symbolic name
+.SH SYNOPSIS
+.B "const char *" nvme_host_get_hostsymname
+.BI "(nvme_host_t h " ");"
+.SH ARGUMENTS
+.IP "h" 12
+Host for which the symbolic name should be returned.
+.SH "RETURN"
+The symbolic name or NULL if a symbolic name hasn't been
+configure.
diff --git a/doc/man/nvme_host_get_root.2 b/doc/man/nvme_host_get_root.2
new file mode 100644
index 0000000..df64a25
--- /dev/null
+++ b/doc/man/nvme_host_get_root.2
@@ -0,0 +1,11 @@
+.TH "nvme_host_get_root" 9 "nvme_host_get_root" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_host_get_root \- Returns nvme_root_t object
+.SH SYNOPSIS
+.B "nvme_root_t" nvme_host_get_root
+.BI "(nvme_host_t h " ");"
+.SH ARGUMENTS
+.IP "h" 12
+\fInvme_host_t\fP object
+.SH "RETURN"
+\fInvme_root_t\fP object from \fIh\fP
diff --git a/doc/man/nvme_host_is_pdc_enabled.2 b/doc/man/nvme_host_is_pdc_enabled.2
new file mode 100644
index 0000000..ab175ee
--- /dev/null
+++ b/doc/man/nvme_host_is_pdc_enabled.2
@@ -0,0 +1,16 @@
+.TH "nvme_host_is_pdc_enabled" 9 "nvme_host_is_pdc_enabled" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_host_is_pdc_enabled \- Is Persistenct Discovery Controller enabled
+.SH SYNOPSIS
+.B "bool" nvme_host_is_pdc_enabled
+.BI "(nvme_host_t h " ","
+.BI "bool fallback " ");"
+.SH ARGUMENTS
+.IP "h" 12
+Host which to check if PDC is enabled
+.IP "fallback" 12
+The fallback default value of the flag when
+\fInvme_host_set_pdc_enabled\fP has not be used
+to set the flag.
+.SH "RETURN"
+true if PDC is enabled for \fIh\fP, else false
diff --git a/doc/man/nvme_host_mem_buf_attrs.2 b/doc/man/nvme_host_mem_buf_attrs.2
new file mode 100644
index 0000000..d37127b
--- /dev/null
+++ b/doc/man/nvme_host_mem_buf_attrs.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "struct nvme_host_mem_buf_attrs" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_host_mem_buf_attrs \- Host Memory Buffer - Attributes Data Structure
+.SH SYNOPSIS
+struct nvme_host_mem_buf_attrs {
+.br
+.BI " __le32 hsize;"
+.br
+.BI " __le32 hmdlal;"
+.br
+.BI " __le32 hmdlau;"
+.br
+.BI " __le32 hmdlec;"
+.br
+.BI " __u8 rsvd16[4080];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "hsize" 12
+Host Memory Buffer Size
+.IP "hmdlal" 12
+Host Memory Descriptor List Lower Address
+.IP "hmdlau" 12
+Host Memory Descriptor List Upper Address
+.IP "hmdlec" 12
+Host Memory Descriptor List Entry Count
+.IP "rsvd16" 12
+Reserved
diff --git a/doc/man/nvme_host_metadata.2 b/doc/man/nvme_host_metadata.2
new file mode 100644
index 0000000..0b1719b
--- /dev/null
+++ b/doc/man/nvme_host_metadata.2
@@ -0,0 +1,33 @@
+.TH "libnvme" 9 "struct nvme_host_metadata" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_host_metadata \- Host Metadata Data Structure
+.SH SYNOPSIS
+struct nvme_host_metadata {
+.br
+.BI " __u8 ndesc;"
+.br
+.BI " __u8 rsvd1;"
+.br
+.BI " union {"
+.br
+.BI " struct nvme_metadata_element_desc descs[0];"
+.br
+.BI " __u8 descs_buf[4094];"
+.br
+.BI " };"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "ndesc" 12
+Number of metadata element descriptors
+.IP "rsvd1" 12
+Reserved
+.IP "{unnamed_union}" 12
+anonymous
+.IP "descs" 12
+Metadata element descriptors
+.IP "descs_buf" 12
+Metadata element descriptor buffer
diff --git a/doc/man/nvme_host_set_dhchap_key.2 b/doc/man/nvme_host_set_dhchap_key.2
new file mode 100644
index 0000000..424fca2
--- /dev/null
+++ b/doc/man/nvme_host_set_dhchap_key.2
@@ -0,0 +1,12 @@
+.TH "nvme_host_set_dhchap_key" 9 "nvme_host_set_dhchap_key" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_host_set_dhchap_key \- set host key
+.SH SYNOPSIS
+.B "void" nvme_host_set_dhchap_key
+.BI "(nvme_host_t h " ","
+.BI "const char *key " ");"
+.SH ARGUMENTS
+.IP "h" 12
+Host for which the key should be set
+.IP "key" 12
+DH-HMAC-CHAP Key to set or NULL to clear existing key
diff --git a/doc/man/nvme_host_set_hostsymname.2 b/doc/man/nvme_host_set_hostsymname.2
new file mode 100644
index 0000000..644dbe7
--- /dev/null
+++ b/doc/man/nvme_host_set_hostsymname.2
@@ -0,0 +1,12 @@
+.TH "nvme_host_set_hostsymname" 9 "nvme_host_set_hostsymname" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_host_set_hostsymname \- Set the host's symbolic name
+.SH SYNOPSIS
+.B "void" nvme_host_set_hostsymname
+.BI "(nvme_host_t h " ","
+.BI "const char *hostsymname " ");"
+.SH ARGUMENTS
+.IP "h" 12
+Host for which the symbolic name should be set.
+.IP "hostsymname" 12
+Symbolic name
diff --git a/doc/man/nvme_host_set_pdc_enabled.2 b/doc/man/nvme_host_set_pdc_enabled.2
new file mode 100644
index 0000000..cede6d6
--- /dev/null
+++ b/doc/man/nvme_host_set_pdc_enabled.2
@@ -0,0 +1,16 @@
+.TH "nvme_host_set_pdc_enabled" 9 "nvme_host_set_pdc_enabled" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_host_set_pdc_enabled \- Set Persistent Discovery Controller flag
+.SH SYNOPSIS
+.B "void" nvme_host_set_pdc_enabled
+.BI "(nvme_host_t h " ","
+.BI "bool enabled " ");"
+.SH ARGUMENTS
+.IP "h" 12
+Host for which the falg should be set
+.IP "enabled" 12
+The bool to set the enabled flag
+.SH "DESCRIPTION"
+When \fBnvme_host_set_pdc_enabled\fP is not used to set the PDC flag,
+\fBnvme_host_is_pdc_enabled\fP will return the default value which was
+passed into the function and not the undefined flag value.
diff --git a/doc/man/nvme_id_ctrl.2 b/doc/man/nvme_id_ctrl.2
new file mode 100644
index 0000000..f3b3164
--- /dev/null
+++ b/doc/man/nvme_id_ctrl.2
@@ -0,0 +1,505 @@
+.TH "libnvme" 9 "struct nvme_id_ctrl" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_id_ctrl \- Identify Controller data structure
+.SH SYNOPSIS
+struct nvme_id_ctrl {
+.br
+.BI " __le16 vid;"
+.br
+.BI " __le16 ssvid;"
+.br
+.BI " char sn[20];"
+.br
+.BI " char mn[40];"
+.br
+.BI " char fr[8];"
+.br
+.BI " __u8 rab;"
+.br
+.BI " __u8 ieee[3];"
+.br
+.BI " __u8 cmic;"
+.br
+.BI " __u8 mdts;"
+.br
+.BI " __le16 cntlid;"
+.br
+.BI " __le32 ver;"
+.br
+.BI " __le32 rtd3r;"
+.br
+.BI " __le32 rtd3e;"
+.br
+.BI " __le32 oaes;"
+.br
+.BI " __le32 ctratt;"
+.br
+.BI " __le16 rrls;"
+.br
+.BI " __u8 rsvd102[9];"
+.br
+.BI " __u8 cntrltype;"
+.br
+.BI " __u8 fguid[16];"
+.br
+.BI " __le16 crdt1;"
+.br
+.BI " __le16 crdt2;"
+.br
+.BI " __le16 crdt3;"
+.br
+.BI " __u8 rsvd134[119];"
+.br
+.BI " __u8 nvmsr;"
+.br
+.BI " __u8 vwci;"
+.br
+.BI " __u8 mec;"
+.br
+.BI " __le16 oacs;"
+.br
+.BI " __u8 acl;"
+.br
+.BI " __u8 aerl;"
+.br
+.BI " __u8 frmw;"
+.br
+.BI " __u8 lpa;"
+.br
+.BI " __u8 elpe;"
+.br
+.BI " __u8 npss;"
+.br
+.BI " __u8 avscc;"
+.br
+.BI " __u8 apsta;"
+.br
+.BI " __le16 wctemp;"
+.br
+.BI " __le16 cctemp;"
+.br
+.BI " __le16 mtfa;"
+.br
+.BI " __le32 hmpre;"
+.br
+.BI " __le32 hmmin;"
+.br
+.BI " __u8 tnvmcap[16];"
+.br
+.BI " __u8 unvmcap[16];"
+.br
+.BI " __le32 rpmbs;"
+.br
+.BI " __le16 edstt;"
+.br
+.BI " __u8 dsto;"
+.br
+.BI " __u8 fwug;"
+.br
+.BI " __le16 kas;"
+.br
+.BI " __le16 hctma;"
+.br
+.BI " __le16 mntmt;"
+.br
+.BI " __le16 mxtmt;"
+.br
+.BI " __le32 sanicap;"
+.br
+.BI " __le32 hmminds;"
+.br
+.BI " __le16 hmmaxd;"
+.br
+.BI " __le16 nsetidmax;"
+.br
+.BI " __le16 endgidmax;"
+.br
+.BI " __u8 anatt;"
+.br
+.BI " __u8 anacap;"
+.br
+.BI " __le32 anagrpmax;"
+.br
+.BI " __le32 nanagrpid;"
+.br
+.BI " __le32 pels;"
+.br
+.BI " __le16 domainid;"
+.br
+.BI " __u8 rsvd358[10];"
+.br
+.BI " __u8 megcap[16];"
+.br
+.BI " __u8 rsvd384[128];"
+.br
+.BI " __u8 sqes;"
+.br
+.BI " __u8 cqes;"
+.br
+.BI " __le16 maxcmd;"
+.br
+.BI " __le32 nn;"
+.br
+.BI " __le16 oncs;"
+.br
+.BI " __le16 fuses;"
+.br
+.BI " __u8 fna;"
+.br
+.BI " __u8 vwc;"
+.br
+.BI " __le16 awun;"
+.br
+.BI " __le16 awupf;"
+.br
+.BI " __u8 icsvscc;"
+.br
+.BI " __u8 nwpc;"
+.br
+.BI " __le16 acwu;"
+.br
+.BI " __le16 ocfs;"
+.br
+.BI " __le32 sgls;"
+.br
+.BI " __le32 mnan;"
+.br
+.BI " __u8 maxdna[16];"
+.br
+.BI " __le32 maxcna;"
+.br
+.BI " __u8 rsvd564[204];"
+.br
+.BI " char subnqn[NVME_NQN_LENGTH];"
+.br
+.BI " __u8 rsvd1024[768];"
+.br
+.BI " __le32 ioccsz;"
+.br
+.BI " __le32 iorcsz;"
+.br
+.BI " __le16 icdoff;"
+.br
+.BI " __u8 fcatt;"
+.br
+.BI " __u8 msdbd;"
+.br
+.BI " __le16 ofcs;"
+.br
+.BI " __u8 dctype;"
+.br
+.BI " __u8 rsvd1807[241];"
+.br
+.BI " struct nvme_id_psd psd[32];"
+.br
+.BI " __u8 vs[1024];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "vid" 12
+PCI Vendor ID, the company vendor identifier that is assigned by
+the PCI SIG.
+.IP "ssvid" 12
+PCI Subsystem Vendor ID, the company vendor identifier that is
+assigned by the PCI SIG for the subsystem.
+.IP "sn" 12
+Serial Number in ASCII
+.IP "mn" 12
+Model Number in ASCII
+.IP "fr" 12
+Firmware Revision in ASCII, the currently active firmware
+revision for the NVM subsystem
+.IP "rab" 12
+Recommended Arbitration Burst, reported as a power of two
+.IP "ieee" 12
+IEEE assigned Organization Unique Identifier
+.IP "cmic" 12
+Controller Multipath IO and Namespace Sharing Capabilities of
+the controller and NVM subsystem. See \fIenum nvme_id_ctrl_cmic\fP.
+.IP "mdts" 12
+Max Data Transfer Size is the largest data transfer size. The
+host should not submit a command that exceeds this maximum data
+transfer size. The value is in units of the minimum memory page
+size (CAP.MPSMIN) and is reported as a power of two
+.IP "cntlid" 12
+Controller ID, the NVM subsystem unique controller identifier
+associated with the controller.
+.IP "ver" 12
+Version, this field contains the value reported in the Version
+register, or property (see \fIenum nvme_registers\fP NVME_REG_VS).
+.IP "rtd3r" 12
+RTD3 Resume Latency, the expected latency in microseconds to resume
+from Runtime D3
+.IP "rtd3e" 12
+RTD3 Exit Latency, the typical latency in microseconds to enter
+Runtime D3.
+.IP "oaes" 12
+Optional Async Events Supported, see \fIenum\fP nvme_id_ctrl_oaes.
+.IP "ctratt" 12
+Controller Attributes, see \fIenum\fP nvme_id_ctrl_ctratt.
+.IP "rrls" 12
+Read Recovery Levels. If a bit is set, then the corresponding
+Read Recovery Level is supported. If a bit is cleared, then the
+corresponding Read Recovery Level is not supported.
+.IP "rsvd102" 12
+Reserved
+.IP "cntrltype" 12
+Controller Type, see \fIenum nvme_id_ctrl_cntrltype\fP
+.IP "fguid" 12
+FRU GUID, a 128-bit value that is globally unique for a given
+Field Replaceable Unit
+.IP "crdt1" 12
+Controller Retry Delay time in 100 millisecond units if CQE CRD
+field is 1
+.IP "crdt2" 12
+Controller Retry Delay time in 100 millisecond units if CQE CRD
+field is 2
+.IP "crdt3" 12
+Controller Retry Delay time in 100 millisecond units if CQE CRD
+field is 3
+.IP "rsvd134" 12
+Reserved
+.IP "nvmsr" 12
+NVM Subsystem Report, see \fIenum nvme_id_ctrl_nvmsr\fP
+.IP "vwci" 12
+VPD Write Cycle Information, see \fIenum nvme_id_ctrl_vwci\fP
+.IP "mec" 12
+Management Endpoint Capabilities, see \fIenum nvme_id_ctrl_mec\fP
+.IP "oacs" 12
+Optional Admin Command Support,the optional Admin commands and
+features supported by the controller, see \fIenum nvme_id_ctrl_oacs\fP.
+.IP "acl" 12
+Abort Command Limit, the maximum number of concurrently
+executing Abort commands supported by the controller. This is a
+0's based value.
+.IP "aerl" 12
+Async Event Request Limit, the maximum number of concurrently
+outstanding Asynchronous Event Request commands supported by the
+controller This is a 0's based value.
+.IP "frmw" 12
+Firmware Updates indicates capabilities regarding firmware
+updates. See \fIenum nvme_id_ctrl_frmw\fP.
+.IP "lpa" 12
+Log Page Attributes, see \fIenum nvme_id_ctrl_lpa\fP.
+.IP "elpe" 12
+Error Log Page Entries, the maximum number of Error Information
+log entries that are stored by the controller. This field is a
+0's based value.
+.IP "npss" 12
+Number of Power States Supported, the number of NVM Express
+power states supported by the controller, indicating the number
+of valid entries in \fIstruct nvme_id_ctrl\fP.psd. This is a 0's
+based value.
+.IP "avscc" 12
+Admin Vendor Specific Command Configuration, see
+\fIenum nvme_id_ctrl_avscc\fP.
+.IP "apsta" 12
+Autonomous Power State Transition Attributes, see
+\fIenum nvme_id_ctrl_apsta\fP.
+.IP "wctemp" 12
+Warning Composite Temperature Threshold indicates
+the minimum Composite Temperature field value (see \fIstruct
+nvme_smart_log\fP.critical_comp_time) that indicates an overheating
+condition during which controller operation continues.
+.IP "cctemp" 12
+Critical Composite Temperature Threshold, field indicates the
+minimum Composite Temperature field value (see \fIstruct
+nvme_smart_log\fP.critical_comp_time) that indicates a critical
+overheating condition.
+.IP "mtfa" 12
+Maximum Time for Firmware Activation indicates the maximum time
+the controller temporarily stops processing commands to activate
+the firmware image, specified in 100 millisecond units. This
+field is always valid if the controller supports firmware
+activation without a reset.
+.IP "hmpre" 12
+Host Memory Buffer Preferred Size indicates the preferred size
+that the host is requested to allocate for the Host Memory
+Buffer feature in 4 KiB units.
+.IP "hmmin" 12
+Host Memory Buffer Minimum Size indicates the minimum size that
+the host is requested to allocate for the Host Memory Buffer
+feature in 4 KiB units.
+.IP "tnvmcap" 12
+Total NVM Capacity, the total NVM capacity in the NVM subsystem.
+The value is in bytes.
+.IP "unvmcap" 12
+Unallocated NVM Capacity, the unallocated NVM capacity in the
+NVM subsystem. The value is in bytes.
+.IP "rpmbs" 12
+Replay Protected Memory Block Support, see
+\fIenum nvme_id_ctrl_rpmbs\fP.
+.IP "edstt" 12
+Extended Device Self-test Time, if Device Self-test command is
+supported (see \fIstruct nvme_id_ctrl\fP.oacs, NVME_CTRL_OACS_SELF_TEST),
+then this field indicates the nominal amount of time in one
+minute units that the controller takes to complete an extended
+device self-test operation when in power state 0.
+.IP "dsto" 12
+Device Self-test Options, see \fIenum nvme_id_ctrl_dsto\fP.
+.IP "fwug" 12
+Firmware Update Granularity indicates the granularity and
+alignment requirement of the firmware image being updated by the
+Firmware Image Download command. The value is reported in 4 KiB
+units. A value of 0h indicates no information on granularity is
+provided. A value of FFh indicates no restriction
+.IP "kas" 12
+Keep Alive Support indicates the granularity of the Keep Alive
+Timer in 100 millisecond units.
+.IP "hctma" 12
+Host Controlled Thermal Management Attributes, see
+\fIenum nvme_id_ctrl_hctm\fP.
+.IP "mntmt" 12
+Minimum Thermal Management Temperature indicates the minimum
+temperature, in degrees Kelvin, that the host may request in the
+Thermal Management Temperature 1 field and Thermal Management
+Temperature 2 field of a Set Features command with the Feature
+Identifier field set to NVME_FEAT_FID_HCTM.
+.IP "mxtmt" 12
+Maximum Thermal Management Temperature indicates the maximum
+temperature, in degrees Kelvin, that the host may request in the
+Thermal Management Temperature 1 field and Thermal Management
+Temperature 2 field of the Set Features command with the Feature
+Identifier set to NVME_FEAT_FID_HCTM.
+.IP "sanicap" 12
+Sanitize Capabilities, see \fIenum nvme_id_ctrl_sanicap\fP
+.IP "hmminds" 12
+Host Memory Buffer Minimum Descriptor Entry Size indicates the
+minimum usable size of a Host Memory Buffer Descriptor Entry in
+4 KiB units.
+.IP "hmmaxd" 12
+Host Memory Maximum Descriptors Entries indicates the number of
+usable Host Memory Buffer Descriptor Entries.
+.IP "nsetidmax" 12
+NVM Set Identifier Maximum, defines the maximum value of a valid
+NVM Set Identifier for any controller in the NVM subsystem.
+.IP "endgidmax" 12
+Endurance Group Identifier Maximum, defines the maximum value of
+a valid Endurance Group Identifier for any controller in the NVM
+subsystem.
+.IP "anatt" 12
+ANA Transition Time indicates the maximum amount of time, in
+seconds, for a transition between ANA states or the maximum
+amount of time, in seconds, that the controller reports the ANA
+change state.
+.IP "anacap" 12
+Asymmetric Namespace Access Capabilities, see
+\fIenum nvme_id_ctrl_anacap\fP.
+.IP "anagrpmax" 12
+ANA Group Identifier Maximum indicates the maximum value of a
+valid ANA Group Identifier for any controller in the NVM
+subsystem.
+.IP "nanagrpid" 12
+Number of ANA Group Identifiers indicates the number of ANA
+groups supported by this controller.
+.IP "pels" 12
+Persistent Event Log Size indicates the maximum reportable size
+for the Persistent Event Log.
+.IP "domainid" 12
+Domain Identifier indicates the identifier of the domain
+that contains this controller.
+.IP "rsvd358" 12
+Reserved
+.IP "megcap" 12
+Max Endurance Group Capacity indicates the maximum capacity
+of a single Endurance Group.
+.IP "rsvd384" 12
+Reserved
+.IP "sqes" 12
+Submission Queue Entry Size, see \fIenum nvme_id_ctrl_sqes\fP.
+.IP "cqes" 12
+Completion Queue Entry Size, see \fIenum nvme_id_ctrl_cqes\fP.
+.IP "maxcmd" 12
+Maximum Outstanding Commands indicates the maximum number of
+commands that the controller processes at one time for a
+particular queue.
+.IP "nn" 12
+Number of Namespaces indicates the maximum value of a valid
+nsid for the NVM subsystem. If the MNAN (\fIstruct nvme_id_ctrl\fP.mnan
+field is cleared to 0h, then this field also indicates the
+maximum number of namespaces supported by the NVM subsystem.
+.IP "oncs" 12
+Optional NVM Command Support, see \fIenum nvme_id_ctrl_oncs\fP.
+.IP "fuses" 12
+Fused Operation Support, see \fIenum nvme_id_ctrl_fuses\fP.
+.IP "fna" 12
+Format NVM Attributes, see \fIenum nvme_id_ctrl_fna\fP.
+.IP "vwc" 12
+Volatile Write Cache, see \fIenum nvme_id_ctrl_vwc\fP.
+.IP "awun" 12
+Atomic Write Unit Normal indicates the size of the write
+operation guaranteed to be written atomically to the NVM across
+all namespaces with any supported namespace format during normal
+operation. This field is specified in logical blocks and is a
+0's based value.
+.IP "awupf" 12
+Atomic Write Unit Power Fail indicates the size of the write
+operation guaranteed to be written atomically to the NVM across
+all namespaces with any supported namespace format during a
+power fail or error condition. This field is specified in
+logical blocks and is a 0’s based value.
+.IP "icsvscc" 12
+NVM Vendor Specific Command Configuration, see
+\fIenum nvme_id_ctrl_nvscc\fP.
+.IP "nwpc" 12
+Namespace Write Protection Capabilities, see
+\fIenum nvme_id_ctrl_nwpc\fP.
+.IP "acwu" 12
+Atomic Compare & Write Unit indicates the size of the write
+operation guaranteed to be written atomically to the NVM across
+all namespaces with any supported namespace format for a Compare
+and Write fused operation. This field is specified in logical
+blocks and is a 0’s based value.
+.IP "ocfs" 12
+Optional Copy Formats Supported, each bit n means controller
+supports Copy Format n.
+.IP "sgls" 12
+SGL Support, see \fIenum nvme_id_ctrl_sgls\fP
+.IP "mnan" 12
+Maximum Number of Allowed Namespaces indicates the maximum
+number of namespaces supported by the NVM subsystem.
+.IP "maxdna" 12
+Maximum Domain Namespace Attachments indicates the maximum
+of the sum of the number of namespaces attached to each I/O
+controller in the Domain.
+.IP "maxcna" 12
+Maximum I/O Controller Namespace Attachments indicates the
+maximum number of namespaces that are allowed to be attached to
+this I/O controller.
+.IP "rsvd564" 12
+Reserved
+.IP "subnqn" 12
+NVM Subsystem NVMe Qualified Name, UTF-8 null terminated string
+.IP "rsvd1024" 12
+Reserved
+.IP "ioccsz" 12
+I/O Queue Command Capsule Supported Size, defines the maximum
+I/O command capsule size in 16 byte units.
+.IP "iorcsz" 12
+I/O Queue Response Capsule Supported Size, defines the maximum
+I/O response capsule size in 16 byte units.
+.IP "icdoff" 12
+In Capsule Data Offset, defines the offset where data starts
+within a capsule. This value is applicable to I/O Queues only.
+.IP "fcatt" 12
+Fabrics Controller Attributes, see \fIenum nvme_id_ctrl_fcatt\fP.
+.IP "msdbd" 12
+Maximum SGL Data Block Descriptors indicates the maximum
+number of SGL Data Block or Keyed SGL Data Block descriptors
+that a host is allowed to place in a capsule. A value of 0h
+indicates no limit.
+.IP "ofcs" 12
+Optional Fabric Commands Support, see \fIenum nvme_id_ctrl_ofcs\fP.
+.IP "dctype" 12
+Discovery Controller Type (DCTYPE). This field indicates what
+type of Discovery controller the controller is (see enum
+nvme_id_ctrl_dctype)
+.IP "rsvd1807" 12
+Reserved
+.IP "psd" 12
+Power State Descriptors, see \fIstruct nvme_id_psd\fP.
+.IP "vs" 12
+Vendor Specific
diff --git a/doc/man/nvme_id_ctrl_anacap.2 b/doc/man/nvme_id_ctrl_anacap.2
new file mode 100644
index 0000000..bb14914
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_anacap.2
@@ -0,0 +1,59 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_anacap" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_anacap \- This field indicates the capabilities associated with Asymmetric Namespace Access Reporting.
+.SH SYNOPSIS
+enum nvme_id_ctrl_anacap {
+.br
+.BI " NVME_CTRL_ANACAP_OPT"
+,
+.br
+.br
+.BI " NVME_CTRL_ANACAP_NON_OPT"
+,
+.br
+.br
+.BI " NVME_CTRL_ANACAP_INACCESSIBLE"
+,
+.br
+.br
+.BI " NVME_CTRL_ANACAP_PERSISTENT_LOSS"
+,
+.br
+.br
+.BI " NVME_CTRL_ANACAP_CHANGE"
+,
+.br
+.br
+.BI " NVME_CTRL_ANACAP_GRPID_NO_CHG"
+,
+.br
+.br
+.BI " NVME_CTRL_ANACAP_GRPID_MGMT"
+
+};
+.SH Constants
+.IP "NVME_CTRL_ANACAP_OPT" 12
+If set, then the controller is able to
+report ANA Optimized state.
+.IP "NVME_CTRL_ANACAP_NON_OPT" 12
+If set, then the controller is able to
+report ANA Non-Optimized state.
+.IP "NVME_CTRL_ANACAP_INACCESSIBLE" 12
+If set, then the controller is able to
+report ANA Inaccessible state.
+.IP "NVME_CTRL_ANACAP_PERSISTENT_LOSS" 12
+If set, then the controller is able to
+report ANA Persistent Loss state.
+.IP "NVME_CTRL_ANACAP_CHANGE" 12
+If set, then the controller is able to
+report ANA Change state.
+.IP "NVME_CTRL_ANACAP_GRPID_NO_CHG" 12
+If set, then the ANAGRPID field in the
+Identify Namespace data structure
+(\fIstruct nvme_id_ns\fP.anagrpid), does not
+change while the namespace is attached to
+any controller.
+.IP "NVME_CTRL_ANACAP_GRPID_MGMT" 12
+If set, then the controller supports a
+non-zero value in the ANAGRPID field of
+the Namespace Management command.
diff --git a/doc/man/nvme_id_ctrl_apsta.2 b/doc/man/nvme_id_ctrl_apsta.2
new file mode 100644
index 0000000..661ba05
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_apsta.2
@@ -0,0 +1,13 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_apsta" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_apsta \- Flags indicating the attributes of the autonomous power state transition feature.
+.SH SYNOPSIS
+enum nvme_id_ctrl_apsta {
+.br
+.BI " NVME_CTRL_APSTA_APST"
+
+};
+.SH Constants
+.IP "NVME_CTRL_APSTA_APST" 12
+If set, then the controller supports autonomous power
+state transitions.
diff --git a/doc/man/nvme_id_ctrl_avscc.2 b/doc/man/nvme_id_ctrl_avscc.2
new file mode 100644
index 0000000..b9a71e4
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_avscc.2
@@ -0,0 +1,14 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_avscc" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_avscc \- Flags indicating the configuration settings for Admin Vendor Specific command handling.
+.SH SYNOPSIS
+enum nvme_id_ctrl_avscc {
+.br
+.BI " NVME_CTRL_AVSCC_AVS"
+
+};
+.SH Constants
+.IP "NVME_CTRL_AVSCC_AVS" 12
+If set, all Admin Vendor Specific Commands use the
+optional vendor specific command format with NDT and
+NDM fields.
diff --git a/doc/man/nvme_id_ctrl_cmic.2 b/doc/man/nvme_id_ctrl_cmic.2
new file mode 100644
index 0000000..e4dee6f
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_cmic.2
@@ -0,0 +1,43 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_cmic" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_cmic \- Controller Multipath IO and Namespace Sharing Capabilities of the controller and NVM subsystem.
+.SH SYNOPSIS
+enum nvme_id_ctrl_cmic {
+.br
+.BI " NVME_CTRL_CMIC_MULTI_PORT"
+,
+.br
+.br
+.BI " NVME_CTRL_CMIC_MULTI_CTRL"
+,
+.br
+.br
+.BI " NVME_CTRL_CMIC_MULTI_SRIOV"
+,
+.br
+.br
+.BI " NVME_CTRL_CMIC_MULTI_ANA_REPORTING"
+
+};
+.SH Constants
+.IP "NVME_CTRL_CMIC_MULTI_PORT" 12
+If set, then the NVM subsystem may contain
+more than one NVM subsystem port, otherwise
+the NVM subsystem contains only a single
+NVM subsystem port.
+.IP "NVME_CTRL_CMIC_MULTI_CTRL" 12
+If set, then the NVM subsystem may contain
+two or more controllers, otherwise the
+NVM subsystem contains only a single
+controller. An NVM subsystem that contains
+multiple controllers may be used by
+multiple hosts, or may provide multiple
+paths for a single host.
+.IP "NVME_CTRL_CMIC_MULTI_SRIOV" 12
+If set, then the controller is associated
+with an SR-IOV Virtual Function, otherwise
+it is associated with a PCI Function
+or a Fabrics connection.
+.IP "NVME_CTRL_CMIC_MULTI_ANA_REPORTING" 12
+If set, then the NVM subsystem supports
+Asymmetric Namespace Access Reporting.
diff --git a/doc/man/nvme_id_ctrl_cntrltype.2 b/doc/man/nvme_id_ctrl_cntrltype.2
new file mode 100644
index 0000000..111367f
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_cntrltype.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_cntrltype" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_cntrltype \- Controller types
+.SH SYNOPSIS
+enum nvme_id_ctrl_cntrltype {
+.br
+.BI " NVME_CTRL_CNTRLTYPE_IO"
+,
+.br
+.br
+.BI " NVME_CTRL_CNTRLTYPE_DISCOVERY"
+,
+.br
+.br
+.BI " NVME_CTRL_CNTRLTYPE_ADMIN"
+
+};
+.SH Constants
+.IP "NVME_CTRL_CNTRLTYPE_IO" 12
+NVM I/O controller
+.IP "NVME_CTRL_CNTRLTYPE_DISCOVERY" 12
+Discovery controller
+.IP "NVME_CTRL_CNTRLTYPE_ADMIN" 12
+Admin controller
diff --git a/doc/man/nvme_id_ctrl_cqes.2 b/doc/man/nvme_id_ctrl_cqes.2
new file mode 100644
index 0000000..88e1045
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_cqes.2
@@ -0,0 +1,20 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_cqes" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_cqes \- Defines the required and maximum Completion Queue entry size when using the NVM Command Set.
+.SH SYNOPSIS
+enum nvme_id_ctrl_cqes {
+.br
+.BI " NVME_CTRL_CQES_MIN"
+,
+.br
+.br
+.BI " NVME_CTRL_CQES_MAX"
+
+};
+.SH Constants
+.IP "NVME_CTRL_CQES_MIN" 12
+Mask to get the value of the required Completion Queue
+Entry size when using the NVM Command Set.
+.IP "NVME_CTRL_CQES_MAX" 12
+Mask to get the value of the maximum Completion Queue
+entry size when using the NVM Command Set.
diff --git a/doc/man/nvme_id_ctrl_ctratt.2 b/doc/man/nvme_id_ctrl_ctratt.2
new file mode 100644
index 0000000..fb5b19e
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_ctratt.2
@@ -0,0 +1,110 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_ctratt" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_ctratt \- Controller attributes
+.SH SYNOPSIS
+enum nvme_id_ctrl_ctratt {
+.br
+.BI " NVME_CTRL_CTRATT_128_ID"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_NON_OP_PSP"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_NVM_SETS"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_READ_RECV_LVLS"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_ENDURANCE_GROUPS"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_PREDICTABLE_LAT"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_TBKAS"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_NAMESPACE_GRANULARITY"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_SQ_ASSOCIATIONS"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_UUID_LIST"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_MDS"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_FIXED_CAP"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_VARIABLE_CAP"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_DEL_ENDURANCE_GROUPS"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_DEL_NVM_SETS"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_ELBAS"
+,
+.br
+.br
+.BI " NVME_CTRL_CTRATT_FDPS"
+
+};
+.SH Constants
+.IP "NVME_CTRL_CTRATT_128_ID" 12
+128-bit Host Identifier supported
+.IP "NVME_CTRL_CTRATT_NON_OP_PSP" 12
+Non-Operational Poser State Permissive Mode
+supported
+.IP "NVME_CTRL_CTRATT_NVM_SETS" 12
+NVM Sets supported
+.IP "NVME_CTRL_CTRATT_READ_RECV_LVLS" 12
+Read Recovery Levels supported
+.IP "NVME_CTRL_CTRATT_ENDURANCE_GROUPS" 12
+Endurance Groups supported
+.IP "NVME_CTRL_CTRATT_PREDICTABLE_LAT" 12
+Predictable Latency Mode supported
+.IP "NVME_CTRL_CTRATT_TBKAS" 12
+Traffic Based Keep Alive Support
+.IP "NVME_CTRL_CTRATT_NAMESPACE_GRANULARITY" 12
+Namespace Granularity reporting
+supported
+.IP "NVME_CTRL_CTRATT_SQ_ASSOCIATIONS" 12
+SQ Associations supported
+.IP "NVME_CTRL_CTRATT_UUID_LIST" 12
+UUID List reporting supported
+.IP "NVME_CTRL_CTRATT_MDS" 12
+Multi-Domain Subsystem supported
+.IP "NVME_CTRL_CTRATT_FIXED_CAP" 12
+Fixed Capacity Management supported
+.IP "NVME_CTRL_CTRATT_VARIABLE_CAP" 12
+Variable Capacity Management supported
+.IP "NVME_CTRL_CTRATT_DEL_ENDURANCE_GROUPS" 12
+Delete Endurance Groups supported
+.IP "NVME_CTRL_CTRATT_DEL_NVM_SETS" 12
+Delete NVM Sets supported
+.IP "NVME_CTRL_CTRATT_ELBAS" 12
+Extended LBA Formats supported
+.IP "NVME_CTRL_CTRATT_FDPS" 12
+Flexible Data Placement supported
diff --git a/doc/man/nvme_id_ctrl_dctype.2 b/doc/man/nvme_id_ctrl_dctype.2
new file mode 100644
index 0000000..84e8eac
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_dctype.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_dctype" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_dctype \- Discovery Controller types
+.SH SYNOPSIS
+enum nvme_id_ctrl_dctype {
+.br
+.BI " NVME_CTRL_DCTYPE_NOT_REPORTED"
+,
+.br
+.br
+.BI " NVME_CTRL_DCTYPE_DDC"
+,
+.br
+.br
+.BI " NVME_CTRL_DCTYPE_CDC"
+
+};
+.SH Constants
+.IP "NVME_CTRL_DCTYPE_NOT_REPORTED" 12
+Not reported (I/O, Admin, and pre-TP8010)
+.IP "NVME_CTRL_DCTYPE_DDC" 12
+Direct Discovery controller
+.IP "NVME_CTRL_DCTYPE_CDC" 12
+Central Discovery controller
diff --git a/doc/man/nvme_id_ctrl_dsto.2 b/doc/man/nvme_id_ctrl_dsto.2
new file mode 100644
index 0000000..5cb40c6
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_dsto.2
@@ -0,0 +1,13 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_dsto" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_dsto \- Flags indicating the optional Device Self-test command or operation behaviors supported by the controller or NVM subsystem.
+.SH SYNOPSIS
+enum nvme_id_ctrl_dsto {
+.br
+.BI " NVME_CTRL_DSTO_ONE_DST"
+
+};
+.SH Constants
+.IP "NVME_CTRL_DSTO_ONE_DST" 12
+If set, then the NVM subsystem supports only one
+device self-test operation in progress at a time.
diff --git a/doc/man/nvme_id_ctrl_fcatt.2 b/doc/man/nvme_id_ctrl_fcatt.2
new file mode 100644
index 0000000..ed96f39
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_fcatt.2
@@ -0,0 +1,14 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_fcatt" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_fcatt \- This field indicates attributes of the controller that are specific to NVMe over Fabrics.
+.SH SYNOPSIS
+enum nvme_id_ctrl_fcatt {
+.br
+.BI " NVME_CTRL_FCATT_DYNAMIC"
+
+};
+.SH Constants
+.IP "NVME_CTRL_FCATT_DYNAMIC" 12
+If cleared, then the NVM subsystem uses a dynamic
+controller model. If set, then the NVM subsystem
+uses a static controller model.
diff --git a/doc/man/nvme_id_ctrl_fna.2 b/doc/man/nvme_id_ctrl_fna.2
new file mode 100644
index 0000000..4356601
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_fna.2
@@ -0,0 +1,48 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_fna" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_fna \- This field indicates attributes for the Format NVM command.
+.SH SYNOPSIS
+enum nvme_id_ctrl_fna {
+.br
+.BI " NVME_CTRL_FNA_FMT_ALL_NAMESPACES"
+,
+.br
+.br
+.BI " NVME_CTRL_FNA_SEC_ALL_NAMESPACES"
+,
+.br
+.br
+.BI " NVME_CTRL_FNA_CRYPTO_ERASE"
+,
+.br
+.br
+.BI " NVME_CTRL_FNA_NSID_FFFFFFFF"
+
+};
+.SH Constants
+.IP "NVME_CTRL_FNA_FMT_ALL_NAMESPACES" 12
+If set, then all namespaces in an NVM
+subsystem shall be configured with the
+same attributes and a format (excluding
+secure erase) of any namespace results in
+a format of all namespaces in an NVM
+subsystem. If cleared, then the
+controller supports format on a per
+namespace basis.
+.IP "NVME_CTRL_FNA_SEC_ALL_NAMESPACES" 12
+If set, then any secure erase performed
+as part of a format operation results in
+a secure erase of all namespaces in the
+NVM subsystem. If cleared, then any
+secure erase performed as part of a
+format results in a secure erase of the
+particular namespace specified.
+.IP "NVME_CTRL_FNA_CRYPTO_ERASE" 12
+If set, then cryptographic erase is
+supported. If cleared, then cryptographic
+erase is not supported.
+.IP "NVME_CTRL_FNA_NSID_FFFFFFFF" 12
+If set, then format does not support
+nsid value set to FFFFFFFFh. If cleared,
+format supports nsid value set to
+FFFFFFFFh.
diff --git a/doc/man/nvme_id_ctrl_frmw.2 b/doc/man/nvme_id_ctrl_frmw.2
new file mode 100644
index 0000000..064ee86
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_frmw.2
@@ -0,0 +1,34 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_frmw" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_frmw \- Flags and values indicates capabilities regarding firmware updates from &struct nvme_id_ctrl.frmw.
+.SH SYNOPSIS
+enum nvme_id_ctrl_frmw {
+.br
+.BI " NVME_CTRL_FRMW_1ST_RO"
+,
+.br
+.br
+.BI " NVME_CTRL_FRMW_NR_SLOTS"
+,
+.br
+.br
+.BI " NVME_CTRL_FRMW_FW_ACT_NO_RESET"
+,
+.br
+.br
+.BI " NVME_CTRL_FRMW_MP_UP_DETECTION"
+
+};
+.SH Constants
+.IP "NVME_CTRL_FRMW_1ST_RO" 12
+If set, the first firmware slot is readonly
+.IP "NVME_CTRL_FRMW_NR_SLOTS" 12
+Mask to get the value of the number of
+firmware slots that the controller supports.
+.IP "NVME_CTRL_FRMW_FW_ACT_NO_RESET" 12
+If set, the controller supports firmware
+activation without a reset.
+.IP "NVME_CTRL_FRMW_MP_UP_DETECTION" 12
+If set, the controller is able to detect
+overlapping firmware/boot partition
+image update.
diff --git a/doc/man/nvme_id_ctrl_fuses.2 b/doc/man/nvme_id_ctrl_fuses.2
new file mode 100644
index 0000000..7abf42e
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_fuses.2
@@ -0,0 +1,13 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_fuses" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_fuses \- This field indicates the fused operations that the controller supports.
+.SH SYNOPSIS
+enum nvme_id_ctrl_fuses {
+.br
+.BI " NVME_CTRL_FUSES_COMPARE_AND_WRITE"
+
+};
+.SH Constants
+.IP "NVME_CTRL_FUSES_COMPARE_AND_WRITE" 12
+If set, then the controller supports the
+Compare and Write fused operation.
diff --git a/doc/man/nvme_id_ctrl_hctm.2 b/doc/man/nvme_id_ctrl_hctm.2
new file mode 100644
index 0000000..ae1e293
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_hctm.2
@@ -0,0 +1,15 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_hctm" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_hctm \- Flags indicate the attributes of the host controlled thermal management feature
+.SH SYNOPSIS
+enum nvme_id_ctrl_hctm {
+.br
+.BI " NVME_CTRL_HCTMA_HCTM"
+
+};
+.SH Constants
+.IP "NVME_CTRL_HCTMA_HCTM" 12
+then the controller supports host controlled thermal
+management, and the Set Features command and Get
+Features command with the Feature Identifier field
+set to NVME_FEAT_FID_HCTM.
diff --git a/doc/man/nvme_id_ctrl_lpa.2 b/doc/man/nvme_id_ctrl_lpa.2
new file mode 100644
index 0000000..24671ea
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_lpa.2
@@ -0,0 +1,65 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_lpa" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_lpa \- Flags indicating optional attributes for log pages that are accessed via the Get Log Page command.
+.SH SYNOPSIS
+enum nvme_id_ctrl_lpa {
+.br
+.BI " NVME_CTRL_LPA_SMART_PER_NS"
+,
+.br
+.br
+.BI " NVME_CTRL_LPA_CMD_EFFECTS"
+,
+.br
+.br
+.BI " NVME_CTRL_LPA_EXTENDED"
+,
+.br
+.br
+.BI " NVME_CTRL_LPA_TELEMETRY"
+,
+.br
+.br
+.BI " NVME_CTRL_LPA_PERSETENT_EVENT"
+,
+.br
+.br
+.BI " NVME_CTRL_LPA_LI0_LI5_LI12_LI13"
+,
+.br
+.br
+.BI " NVME_CTRL_LPA_DA4_TELEMETRY"
+
+};
+.SH Constants
+.IP "NVME_CTRL_LPA_SMART_PER_NS" 12
+If set, controller supports SMART/Health log
+page on a per namespace basis.
+.IP "NVME_CTRL_LPA_CMD_EFFECTS" 12
+If Set, the controller supports the commands
+supported and effects log page.
+.IP "NVME_CTRL_LPA_EXTENDED" 12
+If set, the controller supports extended data
+for log page command including extended number
+of dwords and log page offset fields.
+.IP "NVME_CTRL_LPA_TELEMETRY" 12
+If set, the controller supports the telemetry
+host-initiated and telemetry controller-initiated
+log pages and sending telemetry log notices.
+.IP "NVME_CTRL_LPA_PERSETENT_EVENT" 12
+If set, the controller supports
+persistent event log.
+.IP "NVME_CTRL_LPA_LI0_LI5_LI12_LI13" 12
+If set, the controller supports
+- log pages log page.
+- returning scope of each command in
+commands supported and effects log
+page.
+- feature identifiers supported and
+effects log page.
+- NVMe-MI commands supported and
+effects log page.
+.IP "NVME_CTRL_LPA_DA4_TELEMETRY" 12
+If set, the controller supports data
+area 4 for telemetry host-initiated and
+telemetry.
diff --git a/doc/man/nvme_id_ctrl_mec.2 b/doc/man/nvme_id_ctrl_mec.2
new file mode 100644
index 0000000..9c536ed
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_mec.2
@@ -0,0 +1,20 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_mec" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_mec \- Flags indicating the capabilities of the Management Endpoint in the Controller, &struct nvme_id_ctrl.mec.
+.SH SYNOPSIS
+enum nvme_id_ctrl_mec {
+.br
+.BI " NVME_CTRL_MEC_SMBUSME"
+,
+.br
+.br
+.BI " NVME_CTRL_MEC_PCIEME"
+
+};
+.SH Constants
+.IP "NVME_CTRL_MEC_SMBUSME" 12
+If set, then the NVM Subsystem contains a Management
+Endpoint on an SMBus/I2C port.
+.IP "NVME_CTRL_MEC_PCIEME" 12
+If set, then the NVM Subsystem contains a Management
+Endpoint on a PCIe port.
diff --git a/doc/man/nvme_id_ctrl_nvm.2 b/doc/man/nvme_id_ctrl_nvm.2
new file mode 100644
index 0000000..42cb097
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_nvm.2
@@ -0,0 +1,39 @@
+.TH "libnvme" 9 "struct nvme_id_ctrl_nvm" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_id_ctrl_nvm \- I/O Command Set Specific Identify Controller data structure
+.SH SYNOPSIS
+struct nvme_id_ctrl_nvm {
+.br
+.BI " __u8 vsl;"
+.br
+.BI " __u8 wzsl;"
+.br
+.BI " __u8 wusl;"
+.br
+.BI " __u8 dmrl;"
+.br
+.BI " __u32 dmrsl;"
+.br
+.BI " __u64 dmsl;"
+.br
+.BI " __u8 rsvd16[4080];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "vsl" 12
+Verify Size Limit
+.IP "wzsl" 12
+Write Zeroes Size Limit
+.IP "wusl" 12
+Write Uncorrectable Size Limit
+.IP "dmrl" 12
+Dataset Management Ranges Limit
+.IP "dmrsl" 12
+Dataset Management Range Size Limit
+.IP "dmsl" 12
+Dataset Management Size Limit
+.IP "rsvd16" 12
+reserved
diff --git a/doc/man/nvme_id_ctrl_nvmsr.2 b/doc/man/nvme_id_ctrl_nvmsr.2
new file mode 100644
index 0000000..e0ced53
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_nvmsr.2
@@ -0,0 +1,22 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_nvmsr" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_nvmsr \- This field reports information associated with the NVM Subsystem, see &struct nvme_id_ctrl.nvmsr.
+.SH SYNOPSIS
+enum nvme_id_ctrl_nvmsr {
+.br
+.BI " NVME_CTRL_NVMSR_NVMESD"
+,
+.br
+.br
+.BI " NVME_CTRL_NVMSR_NVMEE"
+
+};
+.SH Constants
+.IP "NVME_CTRL_NVMSR_NVMESD" 12
+If set, then the NVM Subsystem is part of an NVMe
+Storage Device; if cleared, then the NVM Subsystem
+is not part of an NVMe Storage Device.
+.IP "NVME_CTRL_NVMSR_NVMEE" 12
+If set’, then the NVM Subsystem is part of an NVMe
+Enclosure; if cleared, then the NVM Subsystem is
+not part of an NVMe Enclosure.
diff --git a/doc/man/nvme_id_ctrl_nvscc.2 b/doc/man/nvme_id_ctrl_nvscc.2
new file mode 100644
index 0000000..670e9a2
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_nvscc.2
@@ -0,0 +1,13 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_nvscc" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_nvscc \- This field indicates the configuration settings for NVM Vendor Specific command handling.
+.SH SYNOPSIS
+enum nvme_id_ctrl_nvscc {
+.br
+.BI " NVME_CTRL_NVSCC_FMT"
+
+};
+.SH Constants
+.IP "NVME_CTRL_NVSCC_FMT" 12
+If set, all NVM Vendor Specific Commands use the
+format with NDT and NDM fields.
diff --git a/doc/man/nvme_id_ctrl_nwpc.2 b/doc/man/nvme_id_ctrl_nwpc.2
new file mode 100644
index 0000000..f17eba6
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_nwpc.2
@@ -0,0 +1,35 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_nwpc" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_nwpc \- This field indicates the optional namespace write protection capabilities supported by the controller.
+.SH SYNOPSIS
+enum nvme_id_ctrl_nwpc {
+.br
+.BI " NVME_CTRL_NWPC_WRITE_PROTECT"
+,
+.br
+.br
+.BI " NVME_CTRL_NWPC_WRITE_PROTECT_POWER_CYCLE"
+,
+.br
+.br
+.BI " NVME_CTRL_NWPC_WRITE_PROTECT_PERMANENT"
+
+};
+.SH Constants
+.IP "NVME_CTRL_NWPC_WRITE_PROTECT" 12
+If set, then the controller shall
+support the No Write Protect and
+Write Protect namespace write
+protection states and may support
+the Write Protect Until Power
+Cycle state and Permanent Write
+Protect namespace write
+protection states.
+.IP "NVME_CTRL_NWPC_WRITE_PROTECT_POWER_CYCLE" 12
+If set, then the controller
+supports the Write Protect Until
+Power Cycle state.
+.IP "NVME_CTRL_NWPC_WRITE_PROTECT_PERMANENT" 12
+If set, then the controller
+supports the Permanent Write
+Protect state.
diff --git a/doc/man/nvme_id_ctrl_oacs.2 b/doc/man/nvme_id_ctrl_oacs.2
new file mode 100644
index 0000000..d1915fd
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_oacs.2
@@ -0,0 +1,84 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_oacs" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_oacs \- Flags indicating the optional Admin commands and features supported by the controller, see &struct nvme_id_ctrl.oacs.
+.SH SYNOPSIS
+enum nvme_id_ctrl_oacs {
+.br
+.BI " NVME_CTRL_OACS_SECURITY"
+,
+.br
+.br
+.BI " NVME_CTRL_OACS_FORMAT"
+,
+.br
+.br
+.BI " NVME_CTRL_OACS_FW"
+,
+.br
+.br
+.BI " NVME_CTRL_OACS_NS_MGMT"
+,
+.br
+.br
+.BI " NVME_CTRL_OACS_SELF_TEST"
+,
+.br
+.br
+.BI " NVME_CTRL_OACS_DIRECTIVES"
+,
+.br
+.br
+.BI " NVME_CTRL_OACS_NVME_MI"
+,
+.br
+.br
+.BI " NVME_CTRL_OACS_VIRT_MGMT"
+,
+.br
+.br
+.BI " NVME_CTRL_OACS_DBBUF_CFG"
+,
+.br
+.br
+.BI " NVME_CTRL_OACS_LBA_STATUS"
+,
+.br
+.br
+.BI " NVME_CTRL_OACS_CMD_FEAT_LD"
+
+};
+.SH Constants
+.IP "NVME_CTRL_OACS_SECURITY" 12
+If set, then the controller supports the
+Security Send and Security Receive commands.
+.IP "NVME_CTRL_OACS_FORMAT" 12
+If set then the controller supports the Format
+NVM command.
+.IP "NVME_CTRL_OACS_FW" 12
+If set, then the controller supports the
+Firmware Commit and Firmware Image Download commands.
+.IP "NVME_CTRL_OACS_NS_MGMT" 12
+If set, then the controller supports the
+Namespace Management capability
+.IP "NVME_CTRL_OACS_SELF_TEST" 12
+If set, then the controller supports the Device
+Self-test command.
+.IP "NVME_CTRL_OACS_DIRECTIVES" 12
+If set, then the controller supports Directives
+and the Directive Send and Directive Receive
+commands.
+.IP "NVME_CTRL_OACS_NVME_MI" 12
+If set, then the controller supports the NVMe-MI
+Send and NVMe-MI Receive commands.
+.IP "NVME_CTRL_OACS_VIRT_MGMT" 12
+If set, then the controller supports the
+Virtualization Management command.
+.IP "NVME_CTRL_OACS_DBBUF_CFG" 12
+If set, then the controller supports the
+Doorbell Buffer Config command.
+.IP "NVME_CTRL_OACS_LBA_STATUS" 12
+If set, then the controller supports the Get LBA
+Status capability.
+.IP "NVME_CTRL_OACS_CMD_FEAT_LD" 12
+If set, then the controller supports the command
+and feature lockdown capability.
diff --git a/doc/man/nvme_id_ctrl_oaes.2 b/doc/man/nvme_id_ctrl_oaes.2
new file mode 100644
index 0000000..dc536d4
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_oaes.2
@@ -0,0 +1,62 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_oaes" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_oaes \- Optional Asynchronous Events Supported
+.SH SYNOPSIS
+enum nvme_id_ctrl_oaes {
+.br
+.BI " NVME_CTRL_OAES_NA"
+,
+.br
+.br
+.BI " NVME_CTRL_OAES_FA"
+,
+.br
+.br
+.BI " NVME_CTRL_OAES_ANA"
+,
+.br
+.br
+.BI " NVME_CTRL_OAES_PLEA"
+,
+.br
+.br
+.BI " NVME_CTRL_OAES_LBAS"
+,
+.br
+.br
+.BI " NVME_CTRL_OAES_EGE"
+,
+.br
+.br
+.BI " NVME_CTRL_OAES_NS"
+,
+.br
+.br
+.BI " NVME_CTRL_OAES_ZD"
+,
+.br
+.br
+.BI " NVME_CTRL_OAES_DL"
+
+};
+.SH Constants
+.IP "NVME_CTRL_OAES_NA" 12
+Namespace Attribute Notices event supported
+.IP "NVME_CTRL_OAES_FA" 12
+Firmware Activation Notices event supported
+.IP "NVME_CTRL_OAES_ANA" 12
+ANA Change Notices supported
+.IP "NVME_CTRL_OAES_PLEA" 12
+Predictable Latency Event Aggregate Log
+Change Notices event supported
+.IP "NVME_CTRL_OAES_LBAS" 12
+LBA Status Information Notices event supported
+.IP "NVME_CTRL_OAES_EGE" 12
+Endurance Group Events Aggregate Log Change
+Notices event supported
+.IP "NVME_CTRL_OAES_NS" 12
+Normal NVM Subsystem Shutdown event supported
+.IP "NVME_CTRL_OAES_ZD" 12
+Zone Descriptor Change Notifications supported
+.IP "NVME_CTRL_OAES_DL" 12
+Discover Log Page Change Notifications supported
diff --git a/doc/man/nvme_id_ctrl_ofcs.2 b/doc/man/nvme_id_ctrl_ofcs.2
new file mode 100644
index 0000000..3528e37
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_ofcs.2
@@ -0,0 +1,14 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_ofcs" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_ofcs \- Indicate whether the controller supports optional fabric commands.
+.SH SYNOPSIS
+enum nvme_id_ctrl_ofcs {
+.br
+.BI " NVME_CTRL_OFCS_DISCONNECT"
+
+};
+.SH Constants
+.IP "NVME_CTRL_OFCS_DISCONNECT" 12
+If set, then the controller supports the
+Disconnect command and deletion of individual
+I/O Queues.
diff --git a/doc/man/nvme_id_ctrl_oncs.2 b/doc/man/nvme_id_ctrl_oncs.2
new file mode 100644
index 0000000..f788b4d
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_oncs.2
@@ -0,0 +1,72 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_oncs" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_oncs \- This field indicates the optional NVM commands and features supported by the controller.
+.SH SYNOPSIS
+enum nvme_id_ctrl_oncs {
+.br
+.BI " NVME_CTRL_ONCS_COMPARE"
+,
+.br
+.br
+.BI " NVME_CTRL_ONCS_WRITE_UNCORRECTABLE"
+,
+.br
+.br
+.BI " NVME_CTRL_ONCS_DSM"
+,
+.br
+.br
+.BI " NVME_CTRL_ONCS_WRITE_ZEROES"
+,
+.br
+.br
+.BI " NVME_CTRL_ONCS_SAVE_FEATURES"
+,
+.br
+.br
+.BI " NVME_CTRL_ONCS_RESERVATIONS"
+,
+.br
+.br
+.BI " NVME_CTRL_ONCS_TIMESTAMP"
+,
+.br
+.br
+.BI " NVME_CTRL_ONCS_VERIFY"
+,
+.br
+.br
+.BI " NVME_CTRL_ONCS_COPY"
+
+};
+.SH Constants
+.IP "NVME_CTRL_ONCS_COMPARE" 12
+If set, then the controller supports
+the Compare command.
+.IP "NVME_CTRL_ONCS_WRITE_UNCORRECTABLE" 12
+If set, then the controller supports
+the Write Uncorrectable command.
+.IP "NVME_CTRL_ONCS_DSM" 12
+If set, then the controller supports
+the Dataset Management command.
+.IP "NVME_CTRL_ONCS_WRITE_ZEROES" 12
+If set, then the controller supports
+the Write Zeroes command.
+.IP "NVME_CTRL_ONCS_SAVE_FEATURES" 12
+If set, then the controller supports
+the Save field set to a non-zero value
+in the Set Features command and the
+Select field set to a non-zero value in
+the Get Features command.
+.IP "NVME_CTRL_ONCS_RESERVATIONS" 12
+If set, then the controller supports
+reservations.
+.IP "NVME_CTRL_ONCS_TIMESTAMP" 12
+If set, then the controller supports
+the Timestamp feature.
+.IP "NVME_CTRL_ONCS_VERIFY" 12
+If set, then the controller supports
+the Verify command.
+.IP "NVME_CTRL_ONCS_COPY" 12
+If set, then the controller supports
+the copy command.
diff --git a/doc/man/nvme_id_ctrl_rpmbs.2 b/doc/man/nvme_id_ctrl_rpmbs.2
new file mode 100644
index 0000000..501fccc
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_rpmbs.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_rpmbs" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_rpmbs \- This field indicates if the controller supports one or more Replay Protected Memory Blocks, from &struct nvme_id_ctrl.rpmbs.
+.SH SYNOPSIS
+enum nvme_id_ctrl_rpmbs {
+.br
+.BI " NVME_CTRL_RPMBS_NR_UNITS"
+,
+.br
+.br
+.BI " NVME_CTRL_RPMBS_AUTH_METHOD"
+,
+.br
+.br
+.BI " NVME_CTRL_RPMBS_TOTAL_SIZE"
+,
+.br
+.br
+.BI " NVME_CTRL_RPMBS_ACCESS_SIZE"
+
+};
+.SH Constants
+.IP "NVME_CTRL_RPMBS_NR_UNITS" 12
+Mask to get the value of the Number of RPMB Units
+.IP "NVME_CTRL_RPMBS_AUTH_METHOD" 12
+Mask to get the value of the Authentication Method
+.IP "NVME_CTRL_RPMBS_TOTAL_SIZE" 12
+Mask to get the value of Total Size
+.IP "NVME_CTRL_RPMBS_ACCESS_SIZE" 12
+Mask to get the value of Access Size
diff --git a/doc/man/nvme_id_ctrl_sanicap.2 b/doc/man/nvme_id_ctrl_sanicap.2
new file mode 100644
index 0000000..9c53643
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_sanicap.2
@@ -0,0 +1,44 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_sanicap" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_sanicap \- Indicates attributes for sanitize operations.
+.SH SYNOPSIS
+enum nvme_id_ctrl_sanicap {
+.br
+.BI " NVME_CTRL_SANICAP_CES"
+,
+.br
+.br
+.BI " NVME_CTRL_SANICAP_BES"
+,
+.br
+.br
+.BI " NVME_CTRL_SANICAP_OWS"
+,
+.br
+.br
+.BI " NVME_CTRL_SANICAP_NDI"
+,
+.br
+.br
+.BI " NVME_CTRL_SANICAP_NODMMAS"
+
+};
+.SH Constants
+.IP "NVME_CTRL_SANICAP_CES" 12
+Crypto Erase Support. If set, then the
+controller supports the Crypto Erase sanitize operation.
+.IP "NVME_CTRL_SANICAP_BES" 12
+Block Erase Support. If set, then the controller
+supports the Block Erase sanitize operation.
+.IP "NVME_CTRL_SANICAP_OWS" 12
+Overwrite Support. If set, then the controller
+supports the Overwrite sanitize operation.
+.IP "NVME_CTRL_SANICAP_NDI" 12
+No-Deallocate Inhibited. If set and the No-
+Deallocate Response Mode bit is set, then the
+controller deallocates after the sanitize
+operation even if the No-Deallocate After
+Sanitize bit is set in a Sanitize command.
+.IP "NVME_CTRL_SANICAP_NODMMAS" 12
+No-Deallocate Modifies Media After Sanitize,
+mask to extract value.
diff --git a/doc/man/nvme_id_ctrl_sgls.2 b/doc/man/nvme_id_ctrl_sgls.2
new file mode 100644
index 0000000..10809b8
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_sgls.2
@@ -0,0 +1,46 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_sgls" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_sgls \- This field indicates if SGLs are supported for the NVM Command Set and the particular SGL types supported.
+.SH SYNOPSIS
+enum nvme_id_ctrl_sgls {
+.br
+.BI " NVME_CTRL_SGLS_SUPPORTED"
+,
+.br
+.br
+.BI " NVME_CTRL_SGLS_KEYED"
+,
+.br
+.br
+.BI " NVME_CTRL_SGLS_BIT_BUCKET"
+,
+.br
+.br
+.BI " NVME_CTRL_SGLS_MPTR_BYTE_ALIGNED"
+,
+.br
+.br
+.BI " NVME_CTRL_SGLS_OVERSIZE"
+,
+.br
+.br
+.BI " NVME_CTRL_SGLS_MPTR_SGL"
+,
+.br
+.br
+.BI " NVME_CTRL_SGLS_OFFSET"
+,
+.br
+.br
+.BI " NVME_CTRL_SGLS_TPORT"
+
+};
+.SH Constants
+.IP "NVME_CTRL_SGLS_SUPPORTED" 12
+.IP "NVME_CTRL_SGLS_KEYED" 12
+.IP "NVME_CTRL_SGLS_BIT_BUCKET" 12
+.IP "NVME_CTRL_SGLS_MPTR_BYTE_ALIGNED" 12
+.IP "NVME_CTRL_SGLS_OVERSIZE" 12
+.IP "NVME_CTRL_SGLS_MPTR_SGL" 12
+.IP "NVME_CTRL_SGLS_OFFSET" 12
+.IP "NVME_CTRL_SGLS_TPORT" 12
diff --git a/doc/man/nvme_id_ctrl_sqes.2 b/doc/man/nvme_id_ctrl_sqes.2
new file mode 100644
index 0000000..b50dd1b
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_sqes.2
@@ -0,0 +1,20 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_sqes" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_sqes \- Defines the required and maximum Submission Queue entry size when using the NVM Command Set.
+.SH SYNOPSIS
+enum nvme_id_ctrl_sqes {
+.br
+.BI " NVME_CTRL_SQES_MIN"
+,
+.br
+.br
+.BI " NVME_CTRL_SQES_MAX"
+
+};
+.SH Constants
+.IP "NVME_CTRL_SQES_MIN" 12
+Mask to get the value of the required Submission Queue
+Entry size when using the NVM Command Set.
+.IP "NVME_CTRL_SQES_MAX" 12
+Mask to get the value of the maximum Submission Queue
+entry size when using the NVM Command Set.
diff --git a/doc/man/nvme_id_ctrl_vwc.2 b/doc/man/nvme_id_ctrl_vwc.2
new file mode 100644
index 0000000..bc65e6d
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_vwc.2
@@ -0,0 +1,22 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_vwc" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_vwc \- Volatile write cache
+.SH SYNOPSIS
+enum nvme_id_ctrl_vwc {
+.br
+.BI " NVME_CTRL_VWC_PRESENT"
+,
+.br
+.br
+.BI " NVME_CTRL_VWC_FLUSH"
+
+};
+.SH Constants
+.IP "NVME_CTRL_VWC_PRESENT" 12
+If set, indicates a volatile write cache is present.
+If a volatile write cache is present, then the host
+controls whether the volatile write cache is enabled
+with a Set Features command specifying the value
+NVME_FEAT_FID_VOLATILE_WC.
+.IP "NVME_CTRL_VWC_FLUSH" 12
+Mask to get the value of the flush command behavior.
diff --git a/doc/man/nvme_id_ctrl_vwci.2 b/doc/man/nvme_id_ctrl_vwci.2
new file mode 100644
index 0000000..dd6d327
--- /dev/null
+++ b/doc/man/nvme_id_ctrl_vwci.2
@@ -0,0 +1,28 @@
+.TH "libnvme" 9 "enum nvme_id_ctrl_vwci" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ctrl_vwci \- This field indicates information about remaining number of times that VPD contents are able to be updated using the VPD Write command, see &struct nvme_id_ctrl.vwci.
+.SH SYNOPSIS
+enum nvme_id_ctrl_vwci {
+.br
+.BI " NVME_CTRL_VWCI_VWCR"
+,
+.br
+.br
+.BI " NVME_CTRL_VWCI_VWCRV"
+
+};
+.SH Constants
+.IP "NVME_CTRL_VWCI_VWCR" 12
+Mask to get value of VPD Write Cycles Remaining. If
+the VPD Write Cycle Remaining Valid bit is set, then
+this field contains a value indicating the remaining
+number of times that VPD contents are able to be
+updated using the VPD Write command. If this field is
+set to 7Fh, then the remaining number of times that
+VPD contents are able to be updated using the VPD
+Write command is greater than or equal to 7Fh.
+.IP "NVME_CTRL_VWCI_VWCRV" 12
+VPD Write Cycle Remaining Valid. If this bit is set,
+then the VPD Write Cycle Remaining field is valid. If
+this bit is cleared, then the VPD Write Cycles
+Remaining field is invalid and cleared to 0h.
diff --git a/doc/man/nvme_id_directives.2 b/doc/man/nvme_id_directives.2
new file mode 100644
index 0000000..d4e4b8a
--- /dev/null
+++ b/doc/man/nvme_id_directives.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_id_directives" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_id_directives \- Identify Directive - Return Parameters Data Structure
+.SH SYNOPSIS
+struct nvme_id_directives {
+.br
+.BI " __u8 supported[32];"
+.br
+.BI " __u8 enabled[32];"
+.br
+.BI " __u8 rsvd64[4032];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "supported" 12
+Identify directive is supported
+.IP "enabled" 12
+Identify directive is Enabled
+.IP "rsvd64" 12
+Reserved
diff --git a/doc/man/nvme_id_domain_attr.2 b/doc/man/nvme_id_domain_attr.2
new file mode 100644
index 0000000..2820669
--- /dev/null
+++ b/doc/man/nvme_id_domain_attr.2
@@ -0,0 +1,35 @@
+.TH "libnvme" 9 "struct nvme_id_domain_attr" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_id_domain_attr \- Domain Attributes Entry
+.SH SYNOPSIS
+struct nvme_id_domain_attr {
+.br
+.BI " __le16 dom_id;"
+.br
+.BI " __u8 rsvd2[14];"
+.br
+.BI " __u8 dom_cap[16];"
+.br
+.BI " __u8 unalloc_dom_cap[16];"
+.br
+.BI " __u8 max_egrp_dom_cap[16];"
+.br
+.BI " __u8 rsvd64[64];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "dom_id" 12
+Domain Identifier
+.IP "rsvd2" 12
+Reserved
+.IP "dom_cap" 12
+Total Domain Capacity
+.IP "unalloc_dom_cap" 12
+Unallocated Domain Capacity
+.IP "max_egrp_dom_cap" 12
+Max Endurance Group Domain Capacity
+.IP "rsvd64" 12
+Reserved
diff --git a/doc/man/nvme_id_domain_list.2 b/doc/man/nvme_id_domain_list.2
new file mode 100644
index 0000000..64c0e3f
--- /dev/null
+++ b/doc/man/nvme_id_domain_list.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_id_domain_list" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_id_domain_list \- Domain List
+.SH SYNOPSIS
+struct nvme_id_domain_list {
+.br
+.BI " __u8 num;"
+.br
+.BI " __u8 rsvd[127];"
+.br
+.BI " struct nvme_id_domain_attr domain_attr[NVME_ID_DOMAIN_LIST_MAX];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "num" 12
+Number of domain attributes
+.IP "rsvd" 12
+Reserved
+.IP "domain_attr" 12
+List of domain attributes
diff --git a/doc/man/nvme_id_endurance_group_list.2 b/doc/man/nvme_id_endurance_group_list.2
new file mode 100644
index 0000000..12128ef
--- /dev/null
+++ b/doc/man/nvme_id_endurance_group_list.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_id_endurance_group_list" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_id_endurance_group_list \- Endurance Group List
+.SH SYNOPSIS
+struct nvme_id_endurance_group_list {
+.br
+.BI " __le16 num;"
+.br
+.BI " __le16 identifier[NVME_ID_ENDURANCE_GROUP_LIST_MAX];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "num" 12
+Number of Identifiers
+.IP "identifier" 12
+Endurance Group Identifier
diff --git a/doc/man/nvme_id_independent_id_ns.2 b/doc/man/nvme_id_independent_id_ns.2
new file mode 100644
index 0000000..06de59c
--- /dev/null
+++ b/doc/man/nvme_id_independent_id_ns.2
@@ -0,0 +1,56 @@
+.TH "libnvme" 9 "struct nvme_id_independent_id_ns" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_id_independent_id_ns \- Identify - I/O Command Set Independent Identify Namespace Data Structure
+.SH SYNOPSIS
+struct nvme_id_independent_id_ns {
+.br
+.BI " __u8 nsfeat;"
+.br
+.BI " __u8 nmic;"
+.br
+.BI " __u8 rescap;"
+.br
+.BI " __u8 fpi;"
+.br
+.BI " __le32 anagrpid;"
+.br
+.BI " __u8 nsattr;"
+.br
+.BI " __u8 rsvd9;"
+.br
+.BI " __le16 nvmsetid;"
+.br
+.BI " __le16 endgid;"
+.br
+.BI " __u8 nstat;"
+.br
+.BI " __u8 rsvd15[4081];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nsfeat" 12
+common namespace features
+.IP "nmic" 12
+Namespace Multi-path I/O and Namespace
+Sharing Capabilities
+.IP "rescap" 12
+Reservation Capabilities
+.IP "fpi" 12
+Format Progress Indicator
+.IP "anagrpid" 12
+ANA Group Identifier
+.IP "nsattr" 12
+Namespace Attributes
+.IP "rsvd9" 12
+reserved
+.IP "nvmsetid" 12
+NVM Set Identifier
+.IP "endgid" 12
+Endurance Group Identifier
+.IP "nstat" 12
+Namespace Status
+.IP "rsvd15" 12
+reserved
diff --git a/doc/man/nvme_id_iocs.2 b/doc/man/nvme_id_iocs.2
new file mode 100644
index 0000000..6c31e0a
--- /dev/null
+++ b/doc/man/nvme_id_iocs.2
@@ -0,0 +1,15 @@
+.TH "libnvme" 9 "struct nvme_id_iocs" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_id_iocs \- NVMe Identify IO Command Set data structure
+.SH SYNOPSIS
+struct nvme_id_iocs {
+.br
+.BI " __u64 iocsc[512];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "iocsc" 12
+List of supported IO Command Set Combination vectors
diff --git a/doc/man/nvme_id_ns.2 b/doc/man/nvme_id_ns.2
new file mode 100644
index 0000000..8305252
--- /dev/null
+++ b/doc/man/nvme_id_ns.2
@@ -0,0 +1,237 @@
+.TH "libnvme" 9 "struct nvme_id_ns" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_id_ns \- Identify Namespace data structure
+.SH SYNOPSIS
+struct nvme_id_ns {
+.br
+.BI " __le64 nsze;"
+.br
+.BI " __le64 ncap;"
+.br
+.BI " __le64 nuse;"
+.br
+.BI " __u8 nsfeat;"
+.br
+.BI " __u8 nlbaf;"
+.br
+.BI " __u8 flbas;"
+.br
+.BI " __u8 mc;"
+.br
+.BI " __u8 dpc;"
+.br
+.BI " __u8 dps;"
+.br
+.BI " __u8 nmic;"
+.br
+.BI " __u8 rescap;"
+.br
+.BI " __u8 fpi;"
+.br
+.BI " __u8 dlfeat;"
+.br
+.BI " __le16 nawun;"
+.br
+.BI " __le16 nawupf;"
+.br
+.BI " __le16 nacwu;"
+.br
+.BI " __le16 nabsn;"
+.br
+.BI " __le16 nabo;"
+.br
+.BI " __le16 nabspf;"
+.br
+.BI " __le16 noiob;"
+.br
+.BI " __u8 nvmcap[16];"
+.br
+.BI " __le16 npwg;"
+.br
+.BI " __le16 npwa;"
+.br
+.BI " __le16 npdg;"
+.br
+.BI " __le16 npda;"
+.br
+.BI " __le16 nows;"
+.br
+.BI " __le16 mssrl;"
+.br
+.BI " __le32 mcl;"
+.br
+.BI " __u8 msrc;"
+.br
+.BI " __u8 rsvd81;"
+.br
+.BI " __u8 nulbaf;"
+.br
+.BI " __u8 rsvd83[9];"
+.br
+.BI " __le32 anagrpid;"
+.br
+.BI " __u8 rsvd96[3];"
+.br
+.BI " __u8 nsattr;"
+.br
+.BI " __le16 nvmsetid;"
+.br
+.BI " __le16 endgid;"
+.br
+.BI " __u8 nguid[16];"
+.br
+.BI " __u8 eui64[8];"
+.br
+.BI " struct nvme_lbaf lbaf[64];"
+.br
+.BI " __le64 lbstm;"
+.br
+.BI " __u8 vs[3704];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nsze" 12
+Namespace Size indicates the total size of the namespace in
+logical blocks. The number of logical blocks is based on the
+formatted LBA size.
+.IP "ncap" 12
+Namespace Capacity indicates the maximum number of logical blocks
+that may be allocated in the namespace at any point in time. The
+number of logical blocks is based on the formatted LBA size.
+.IP "nuse" 12
+Namespace Utilization indicates the current number of logical
+blocks allocated in the namespace. This field is smaller than or
+equal to the Namespace Capacity. The number of logical blocks is
+based on the formatted LBA size.
+.IP "nsfeat" 12
+Namespace Features, see \fIenum nvme_id_nsfeat\fP.
+.IP "nlbaf" 12
+Number of LBA Formats defines the number of supported LBA data
+size and metadata size combinations supported by the namespace
+and the highest possible index to \fIstruct nvme_id_ns\fP.lbaf.
+.IP "flbas" 12
+Formatted LBA Size, see \fIenum nvme_id_ns_flbas\fP.
+.IP "mc" 12
+Metadata Capabilities, see \fIenum nvme_id_ns_mc\fP.
+.IP "dpc" 12
+End-to-end Data Protection Capabilities, see
+\fIenum nvme_id_ns_dpc\fP.
+.IP "dps" 12
+End-to-end Data Protection Type Settings, see
+\fIenum nvme_id_ns_dps\fP.
+.IP "nmic" 12
+Namespace Multi-path I/O and Namespace Sharing Capabilities, see
+\fIenum nvme_id_ns_nmic\fP.
+.IP "rescap" 12
+Reservation Capabilities, see \fIenum nvme_id_ns_rescap\fP.
+.IP "fpi" 12
+Format Progress Indicator, see \fIenum nvme_nd_ns_fpi\fP.
+.IP "dlfeat" 12
+Deallocate Logical Block Features, see \fIenum nvme_id_ns_dlfeat\fP.
+.IP "nawun" 12
+Namespace Atomic Write Unit Normal indicates the
+namespace specific size of the write operation guaranteed to be
+written atomically to the NVM during normal operation.
+.IP "nawupf" 12
+Namespace Atomic Write Unit Power Fail indicates the
+namespace specific size of the write operation guaranteed to be
+written atomically to the NVM during a power fail or error
+condition.
+.IP "nacwu" 12
+Namespace Atomic Compare & Write Unit indicates the namespace
+specific size of the write operation guaranteed to be written
+atomically to the NVM for a Compare and Write fused command.
+.IP "nabsn" 12
+Namespace Atomic Boundary Size Normal indicates the atomic
+boundary size for this namespace for the NAWUN value. This field
+is specified in logical blocks.
+.IP "nabo" 12
+Namespace Atomic Boundary Offset indicates the LBA on this
+namespace where the first atomic boundary starts.
+.IP "nabspf" 12
+Namespace Atomic Boundary Size Power Fail indicates the atomic
+boundary size for this namespace specific to the Namespace Atomic
+Write Unit Power Fail value. This field is specified in logical
+blocks.
+.IP "noiob" 12
+Namespace Optimal I/O Boundary indicates the optimal I/O boundary
+for this namespace. This field is specified in logical blocks.
+The host should construct Read and Write commands that do not
+cross the I/O boundary to achieve optimal performance.
+.IP "nvmcap" 12
+NVM Capacity indicates the total size of the NVM allocated to
+this namespace. The value is in bytes.
+.IP "npwg" 12
+Namespace Preferred Write Granularity indicates the smallest
+recommended write granularity in logical blocks for this
+namespace. This is a 0's based value.
+.IP "npwa" 12
+Namespace Preferred Write Alignment indicates the recommended
+write alignment in logical blocks for this namespace. This is a
+0's based value.
+.IP "npdg" 12
+Namespace Preferred Deallocate Granularity indicates the
+recommended granularity in logical blocks for the Dataset
+Management command with the Attribute - Deallocate bit.
+.IP "npda" 12
+Namespace Preferred Deallocate Alignment indicates the
+recommended alignment in logical blocks for the Dataset
+Management command with the Attribute - Deallocate bit
+.IP "nows" 12
+Namespace Optimal Write Size indicates the size in logical blocks
+for optimal write performance for this namespace. This is a 0's
+based value.
+.IP "mssrl" 12
+Maximum Single Source Range Length indicates the maximum number
+of logical blocks that may be specified in each valid Source Range
+field of a Copy command.
+.IP "mcl" 12
+Maximum Copy Length indicates the maximum number of logical
+blocks that may be specified in a Copy command.
+.IP "msrc" 12
+Maximum Source Range Count indicates the maximum number of Source
+Range entries that may be used to specify source data in a Copy
+command. This is a 0’s based value.
+.IP "rsvd81" 12
+Reserved
+.IP "nulbaf" 12
+Number of Unique Capability LBA Formats defines the number of
+supported user data size and metadata size combinations supported
+by the namespace that may not share the same capabilities. LBA
+formats shall be allocated in order and packed sequentially.
+.IP "rsvd83" 12
+Reserved
+.IP "anagrpid" 12
+ANA Group Identifier indicates the ANA Group Identifier of the
+ANA group of which the namespace is a member.
+.IP "rsvd96" 12
+Reserved
+.IP "nsattr" 12
+Namespace Attributes, see \fIenum nvme_id_ns_attr\fP.
+.IP "nvmsetid" 12
+NVM Set Identifier indicates the NVM Set with which this
+namespace is associated.
+.IP "endgid" 12
+Endurance Group Identifier indicates the Endurance Group with
+which this namespace is associated.
+.IP "nguid" 12
+Namespace Globally Unique Identifier contains a 128-bit value
+that is globally unique and assigned to the namespace when the
+namespace is created. This field remains fixed throughout the
+life of the namespace and is preserved across namespace and
+controller operations
+.IP "eui64" 12
+IEEE Extended Unique Identifier contains a 64-bit IEEE Extended
+Unique Identifier (EUI-64) that is globally unique and assigned
+to the namespace when the namespace is created. This field
+remains fixed throughout the life of the namespace and is
+preserved across namespace and controller operations
+.IP "lbaf" 12
+LBA Format, see \fIstruct nvme_lbaf\fP.
+.IP "lbstm" 12
+Logical Block Storage Tag Mask for end-to-end protection
+.IP "vs" 12
+Vendor Specific
diff --git a/doc/man/nvme_id_ns_attr.2 b/doc/man/nvme_id_ns_attr.2
new file mode 100644
index 0000000..010790e
--- /dev/null
+++ b/doc/man/nvme_id_ns_attr.2
@@ -0,0 +1,14 @@
+.TH "libnvme" 9 "enum nvme_id_ns_attr" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ns_attr \- Specifies attributes of the namespace.
+.SH SYNOPSIS
+enum nvme_id_ns_attr {
+.br
+.BI " NVME_NS_NSATTR_WRITE_PROTECTED"
+
+};
+.SH Constants
+.IP "NVME_NS_NSATTR_WRITE_PROTECTED" 12
+If set, then the namespace is currently
+write protected and all write access to the
+namespace shall fail.
diff --git a/doc/man/nvme_id_ns_dlfeat.2 b/doc/man/nvme_id_ns_dlfeat.2
new file mode 100644
index 0000000..382aff7
--- /dev/null
+++ b/doc/man/nvme_id_ns_dlfeat.2
@@ -0,0 +1,50 @@
+.TH "libnvme" 9 "enum nvme_id_ns_dlfeat" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ns_dlfeat \- This field indicates information about features that affect deallocating logical blocks for this namespace.
+.SH SYNOPSIS
+enum nvme_id_ns_dlfeat {
+.br
+.BI " NVME_NS_DLFEAT_RB"
+,
+.br
+.br
+.BI " NVME_NS_DLFEAT_RB_NR"
+,
+.br
+.br
+.BI " NVME_NS_DLFEAT_RB_ALL_0S"
+,
+.br
+.br
+.BI " NVME_NS_DLFEAT_RB_ALL_FS"
+,
+.br
+.br
+.BI " NVME_NS_DLFEAT_WRITE_ZEROES"
+,
+.br
+.br
+.BI " NVME_NS_DLFEAT_CRC_GUARD"
+
+};
+.SH Constants
+.IP "NVME_NS_DLFEAT_RB" 12
+Mask to get the value of the read behavior
+.IP "NVME_NS_DLFEAT_RB_NR" 12
+Read behvaior is not reported
+.IP "NVME_NS_DLFEAT_RB_ALL_0S" 12
+A deallocated logical block returns all bytes
+cleared to 0h.
+.IP "NVME_NS_DLFEAT_RB_ALL_FS" 12
+A deallocated logical block returns all bytes
+set to FFh.
+.IP "NVME_NS_DLFEAT_WRITE_ZEROES" 12
+If set, indicates that the controller supports
+the Deallocate bit in the Write Zeroes command
+for this namespace.
+.IP "NVME_NS_DLFEAT_CRC_GUARD" 12
+If set, indicates that the Guard field for
+deallocated logical blocks that contain
+protection information is set to the CRC for
+the value read from the deallocated logical
+block and its metadata
diff --git a/doc/man/nvme_id_ns_dpc.2 b/doc/man/nvme_id_ns_dpc.2
new file mode 100644
index 0000000..cd8aebb
--- /dev/null
+++ b/doc/man/nvme_id_ns_dpc.2
@@ -0,0 +1,43 @@
+.TH "libnvme" 9 "enum nvme_id_ns_dpc" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ns_dpc \- This field indicates the capabilities for the end-to-end data protection feature.
+.SH SYNOPSIS
+enum nvme_id_ns_dpc {
+.br
+.BI " NVME_NS_DPC_PI_TYPE1"
+,
+.br
+.br
+.BI " NVME_NS_DPC_PI_TYPE2"
+,
+.br
+.br
+.BI " NVME_NS_DPC_PI_TYPE3"
+,
+.br
+.br
+.BI " NVME_NS_DPC_PI_FIRST"
+,
+.br
+.br
+.BI " NVME_NS_DPC_PI_LAST"
+
+};
+.SH Constants
+.IP "NVME_NS_DPC_PI_TYPE1" 12
+If set, indicates that the namespace supports
+Protection Information Type 1.
+.IP "NVME_NS_DPC_PI_TYPE2" 12
+If set, indicates that the namespace supports
+Protection Information Type 2.
+.IP "NVME_NS_DPC_PI_TYPE3" 12
+If set, indicates that the namespace supports
+Protection Information Type 3.
+.IP "NVME_NS_DPC_PI_FIRST" 12
+If set, indicates that the namespace supports
+protection information transferred as the first eight
+bytes of metadata.
+.IP "NVME_NS_DPC_PI_LAST" 12
+If set, indicates that the namespace supports
+protection information transferred as the last eight
+bytes of metadata.
diff --git a/doc/man/nvme_id_ns_dps.2 b/doc/man/nvme_id_ns_dps.2
new file mode 100644
index 0000000..7f7097c
--- /dev/null
+++ b/doc/man/nvme_id_ns_dps.2
@@ -0,0 +1,44 @@
+.TH "libnvme" 9 "enum nvme_id_ns_dps" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ns_dps \- This field indicates the Type settings for the end-to-end data protection feature.
+.SH SYNOPSIS
+enum nvme_id_ns_dps {
+.br
+.BI " NVME_NS_DPS_PI_NONE"
+,
+.br
+.br
+.BI " NVME_NS_DPS_PI_TYPE1"
+,
+.br
+.br
+.BI " NVME_NS_DPS_PI_TYPE2"
+,
+.br
+.br
+.BI " NVME_NS_DPS_PI_TYPE3"
+,
+.br
+.br
+.BI " NVME_NS_DPS_PI_MASK"
+,
+.br
+.br
+.BI " NVME_NS_DPS_PI_FIRST"
+
+};
+.SH Constants
+.IP "NVME_NS_DPS_PI_NONE" 12
+Protection information is not enabled
+.IP "NVME_NS_DPS_PI_TYPE1" 12
+Protection information is enabled, Type 1
+.IP "NVME_NS_DPS_PI_TYPE2" 12
+Protection information is enabled, Type 2
+.IP "NVME_NS_DPS_PI_TYPE3" 12
+Protection information is enabled, Type 3
+.IP "NVME_NS_DPS_PI_MASK" 12
+Mask to get the value of the PI type
+.IP "NVME_NS_DPS_PI_FIRST" 12
+If set, indicates that the protection information, if
+enabled, is transferred as the first eight bytes of
+metadata.
diff --git a/doc/man/nvme_id_ns_flbas.2 b/doc/man/nvme_id_ns_flbas.2
new file mode 100644
index 0000000..5794ceb
--- /dev/null
+++ b/doc/man/nvme_id_ns_flbas.2
@@ -0,0 +1,35 @@
+.TH "libnvme" 9 "enum nvme_id_ns_flbas" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ns_flbas \- This field indicates the LBA data size & metadata size combination that the namespace has been formatted with
+.SH SYNOPSIS
+enum nvme_id_ns_flbas {
+.br
+.BI " NVME_NS_FLBAS_LOWER_MASK"
+,
+.br
+.br
+.BI " NVME_NS_FLBAS_META_EXT"
+,
+.br
+.br
+.BI " NVME_NS_FLBAS_HIGHER_MASK"
+
+};
+.SH Constants
+.IP "NVME_NS_FLBAS_LOWER_MASK" 12
+Mask to get the index of one of the supported
+LBA Formats's least significant
+4bits indicated in
+:c:type:`struct nvme_id_ns <nvme_id_ns>`.lbaf.
+.IP "NVME_NS_FLBAS_META_EXT" 12
+Applicable only if format contains metadata. If
+this bit is set, indicates that the metadata is
+transferred at the end of the data LBA, creating an
+extended data LBA. If cleared, indicates that all
+of the metadata for a command is transferred as a
+separate contiguous buffer of data.
+.IP "NVME_NS_FLBAS_HIGHER_MASK" 12
+Mask to get the index of one of
+the supported LBA Formats's most significant
+2bits indicated in
+:c:type:`struct nvme_id_ns <nvme_id_ns>`.lbaf.
diff --git a/doc/man/nvme_id_ns_granularity_desc.2 b/doc/man/nvme_id_ns_granularity_desc.2
new file mode 100644
index 0000000..75adb56
--- /dev/null
+++ b/doc/man/nvme_id_ns_granularity_desc.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_id_ns_granularity_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_id_ns_granularity_desc \- Namespace Granularity Descriptor
+.SH SYNOPSIS
+struct nvme_id_ns_granularity_desc {
+.br
+.BI " __le64 nszegran;"
+.br
+.BI " __le64 ncapgran;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nszegran" 12
+Namespace Size Granularity
+.IP "ncapgran" 12
+Namespace Capacity Granularity
diff --git a/doc/man/nvme_id_ns_granularity_list.2 b/doc/man/nvme_id_ns_granularity_list.2
new file mode 100644
index 0000000..4638d0b
--- /dev/null
+++ b/doc/man/nvme_id_ns_granularity_list.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "struct nvme_id_ns_granularity_list" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_id_ns_granularity_list \- Namespace Granularity List
+.SH SYNOPSIS
+struct nvme_id_ns_granularity_list {
+.br
+.BI " __le32 attributes;"
+.br
+.BI " __u8 num_descriptors;"
+.br
+.BI " __u8 rsvd5[27];"
+.br
+.BI " struct nvme_id_ns_granularity_desc entry[NVME_ID_ND_DESCRIPTOR_MAX];"
+.br
+.BI " __u8 rsvd288[3808];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "attributes" 12
+Namespace Granularity Attributes
+.IP "num_descriptors" 12
+Number of Descriptors
+.IP "rsvd5" 12
+reserved
+.IP "entry" 12
+Namespace Granularity Descriptor
+.IP "rsvd288" 12
+reserved
diff --git a/doc/man/nvme_id_ns_mc.2 b/doc/man/nvme_id_ns_mc.2
new file mode 100644
index 0000000..346c684
--- /dev/null
+++ b/doc/man/nvme_id_ns_mc.2
@@ -0,0 +1,21 @@
+.TH "libnvme" 9 "enum nvme_id_ns_mc" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ns_mc \- This field indicates the capabilities for metadata.
+.SH SYNOPSIS
+enum nvme_id_ns_mc {
+.br
+.BI " NVME_NS_MC_EXTENDED"
+,
+.br
+.br
+.BI " NVME_NS_MC_SEPARATE"
+
+};
+.SH Constants
+.IP "NVME_NS_MC_EXTENDED" 12
+If set, indicates the namespace supports the metadata
+being transferred as part of a separate buffer that is
+specified in the Metadata Pointer.
+.IP "NVME_NS_MC_SEPARATE" 12
+If set, indicates that the namespace supports the
+metadata being transferred as part of an extended data LBA.
diff --git a/doc/man/nvme_id_ns_nmic.2 b/doc/man/nvme_id_ns_nmic.2
new file mode 100644
index 0000000..b0e0765
--- /dev/null
+++ b/doc/man/nvme_id_ns_nmic.2
@@ -0,0 +1,13 @@
+.TH "libnvme" 9 "enum nvme_id_ns_nmic" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ns_nmic \- This field specifies multi-path I/O and namespace sharing capabilities of the namespace.
+.SH SYNOPSIS
+enum nvme_id_ns_nmic {
+.br
+.BI " NVME_NS_NMIC_SHARED"
+
+};
+.SH Constants
+.IP "NVME_NS_NMIC_SHARED" 12
+If set, then the namespace may be attached to two or
+more controllers in the NVM subsystem concurrently
diff --git a/doc/man/nvme_id_ns_rescap.2 b/doc/man/nvme_id_ns_rescap.2
new file mode 100644
index 0000000..cc8901f
--- /dev/null
+++ b/doc/man/nvme_id_ns_rescap.2
@@ -0,0 +1,62 @@
+.TH "libnvme" 9 "enum nvme_id_ns_rescap" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_ns_rescap \- This field indicates the reservation capabilities of the namespace.
+.SH SYNOPSIS
+enum nvme_id_ns_rescap {
+.br
+.BI " NVME_NS_RESCAP_PTPL"
+,
+.br
+.br
+.BI " NVME_NS_RESCAP_WE"
+,
+.br
+.br
+.BI " NVME_NS_RESCAP_EA"
+,
+.br
+.br
+.BI " NVME_NS_RESCAP_WERO"
+,
+.br
+.br
+.BI " NVME_NS_RESCAP_EARO"
+,
+.br
+.br
+.BI " NVME_NS_RESCAP_WEAR"
+,
+.br
+.br
+.BI " NVME_NS_RESCAP_EAAR"
+,
+.br
+.br
+.BI " NVME_NS_RESCAP_IEK_13"
+
+};
+.SH Constants
+.IP "NVME_NS_RESCAP_PTPL" 12
+If set, indicates that the namespace supports the
+Persist Through Power Loss capability.
+.IP "NVME_NS_RESCAP_WE" 12
+If set, indicates that the namespace supports the
+Write Exclusive reservation type.
+.IP "NVME_NS_RESCAP_EA" 12
+If set, indicates that the namespace supports the
+Exclusive Access reservation type.
+.IP "NVME_NS_RESCAP_WERO" 12
+If set, indicates that the namespace supports the
+Write Exclusive - Registrants Only reservation type.
+.IP "NVME_NS_RESCAP_EARO" 12
+If set, indicates that the namespace supports the
+Exclusive Access - Registrants Only reservation type.
+.IP "NVME_NS_RESCAP_WEAR" 12
+If set, indicates that the namespace supports the
+Write Exclusive - All Registrants reservation type.
+.IP "NVME_NS_RESCAP_EAAR" 12
+If set, indicates that the namespace supports the
+Exclusive Access - All Registrants reservation type.
+.IP "NVME_NS_RESCAP_IEK_13" 12
+If set, indicates that Ignore Existing Key is used
+as defined in revision 1.3 or later of this specification.
diff --git a/doc/man/nvme_id_nsfeat.2 b/doc/man/nvme_id_nsfeat.2
new file mode 100644
index 0000000..747a0bc
--- /dev/null
+++ b/doc/man/nvme_id_nsfeat.2
@@ -0,0 +1,50 @@
+.TH "libnvme" 9 "enum nvme_id_nsfeat" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_nsfeat \- This field defines features of the namespace.
+.SH SYNOPSIS
+enum nvme_id_nsfeat {
+.br
+.BI " NVME_NS_FEAT_THIN"
+,
+.br
+.br
+.BI " NVME_NS_FEAT_NATOMIC"
+,
+.br
+.br
+.BI " NVME_NS_FEAT_DULBE"
+,
+.br
+.br
+.BI " NVME_NS_FEAT_ID_REUSE"
+,
+.br
+.br
+.BI " NVME_NS_FEAT_IO_OPT"
+
+};
+.SH Constants
+.IP "NVME_NS_FEAT_THIN" 12
+If set, indicates that the namespace supports thin
+provisioning. Specifically, the Namespace Capacity
+reported may be less than the Namespace Size.
+.IP "NVME_NS_FEAT_NATOMIC" 12
+If set, indicates that the fields NAWUN, NAWUPF, and
+NACWU are defined for this namespace and should be
+used by the host for this namespace instead of the
+AWUN, AWUPF, and ACWU fields in the Identify
+Controller data structure.
+.IP "NVME_NS_FEAT_DULBE" 12
+If set, indicates that the controller supports the
+Deallocated or Unwritten Logical Block error for
+this namespace.
+.IP "NVME_NS_FEAT_ID_REUSE" 12
+If set, indicates that the value in the NGUID field
+for this namespace, if non- zero, is never reused by
+the controller and that the value in the EUI64 field
+for this namespace, if non-zero, is never reused by
+the controller.
+.IP "NVME_NS_FEAT_IO_OPT" 12
+If set, indicates that the fields NPWG, NPWA, NPDG,
+NPDA, and NOWS are defined for this namespace and
+should be used by the host for I/O optimization
diff --git a/doc/man/nvme_id_nvmset_list.2 b/doc/man/nvme_id_nvmset_list.2
new file mode 100644
index 0000000..a7247f9
--- /dev/null
+++ b/doc/man/nvme_id_nvmset_list.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_id_nvmset_list" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_id_nvmset_list \- NVM set list
+.SH SYNOPSIS
+struct nvme_id_nvmset_list {
+.br
+.BI " __u8 nid;"
+.br
+.BI " __u8 rsvd1[127];"
+.br
+.BI " struct nvme_nvmset_attr ent[NVME_ID_NVMSET_LIST_MAX];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nid" 12
+Nvmset id
+.IP "rsvd1" 12
+Reserved
+.IP "ent" 12
+nvmset id list
diff --git a/doc/man/nvme_id_psd.2 b/doc/man/nvme_id_psd.2
new file mode 100644
index 0000000..7ccdee9
--- /dev/null
+++ b/doc/man/nvme_id_psd.2
@@ -0,0 +1,95 @@
+.TH "libnvme" 9 "struct nvme_id_psd" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_id_psd \- Power Management data structure
+.SH SYNOPSIS
+struct nvme_id_psd {
+.br
+.BI " __le16 mp;"
+.br
+.BI " __u8 rsvd2;"
+.br
+.BI " __u8 flags;"
+.br
+.BI " __le32 enlat;"
+.br
+.BI " __le32 exlat;"
+.br
+.BI " __u8 rrt;"
+.br
+.BI " __u8 rrl;"
+.br
+.BI " __u8 rwt;"
+.br
+.BI " __u8 rwl;"
+.br
+.BI " __le16 idlp;"
+.br
+.BI " __u8 ips;"
+.br
+.BI " __u8 rsvd19;"
+.br
+.BI " __le16 actp;"
+.br
+.BI " __u8 apws;"
+.br
+.BI " __u8 rsvd23[9];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "mp" 12
+Maximum Power indicates the sustained maximum power consumed by the
+NVM subsystem in this power state. The power in Watts is equal to
+the value in this field multiplied by the scale specified in the Max
+Power Scale bit (see \fIenum nvme_psd_flags\fP). A value of 0 indicates
+Maximum Power is not reported.
+.IP "rsvd2" 12
+Reserved
+.IP "flags" 12
+Additional decoding flags, see \fIenum nvme_psd_flags\fP.
+.IP "enlat" 12
+Entry Latency indicates the maximum latency in microseconds
+associated with entering this power state. A value of 0 indicates
+Entry Latency is not reported.
+.IP "exlat" 12
+Exit Latency indicates the maximum latency in microseconds
+associated with exiting this power state. A value of 0 indicates
+Exit Latency is not reported.
+.IP "rrt" 12
+Relative Read Throughput indicates the read throughput rank
+associated with this power state relative to others. The value in
+this is less than the number of supported power states.
+.IP "rrl" 12
+Relative Read Latency indicates the read latency rank associated
+with this power state relative to others. The value in this field is
+less than the number of supported power states.
+.IP "rwt" 12
+Relative Write Throughput indicates write throughput rank associated
+with this power state relative to others. The value in this field is
+less than the number of supported power states
+.IP "rwl" 12
+Relative Write Latency indicates the write latency rank associated
+with this power state relative to others. The value in this field is
+less than the number of supported power states
+.IP "idlp" 12
+Idle Power indicates the typical power consumed by the NVM
+subsystem over 30 seconds in this power state when idle.
+.IP "ips" 12
+Idle Power Scale indicates the scale for \fIstruct nvme_id_psd\fP.idlp,
+see \fIenum nvme_psd_ps\fP for decoding this field.
+.IP "rsvd19" 12
+Reserved
+.IP "actp" 12
+Active Power indicates the largest average power consumed by the
+NVM subsystem over a 10 second period in this power state with
+the workload indicated in the Active Power Workload field.
+.IP "apws" 12
+Bits 7-6: Active Power Scale(APS) indicates the scale for the \fIstruct
+nvme_id_psd\fP.actp, see \fIenum nvme_psd_ps\fP for decoding this value.
+Bits 2-0: Active Power Workload(APW) indicates the workload
+used to calculate maximum power for this power state.
+See \fIenum nvme_psd_workload\fP for decoding this field.
+.IP "rsvd23" 12
+Reserved
diff --git a/doc/man/nvme_id_uuid.2 b/doc/man/nvme_id_uuid.2
new file mode 100644
index 0000000..a6f1524
--- /dev/null
+++ b/doc/man/nvme_id_uuid.2
@@ -0,0 +1,26 @@
+.TH "libnvme" 9 "enum nvme_id_uuid" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_id_uuid \- Identifier Association
+.SH SYNOPSIS
+enum nvme_id_uuid {
+.br
+.BI " NVME_ID_UUID_HDR_ASSOCIATION_MASK"
+,
+.br
+.br
+.BI " NVME_ID_UUID_ASSOCIATION_NONE"
+,
+.br
+.br
+.BI " NVME_ID_UUID_ASSOCIATION_VENDOR"
+,
+.br
+.br
+.BI " NVME_ID_UUID_ASSOCIATION_SUBSYSTEM_VENDOR"
+
+};
+.SH Constants
+.IP "NVME_ID_UUID_HDR_ASSOCIATION_MASK" 12
+.IP "NVME_ID_UUID_ASSOCIATION_NONE" 12
+.IP "NVME_ID_UUID_ASSOCIATION_VENDOR" 12
+.IP "NVME_ID_UUID_ASSOCIATION_SUBSYSTEM_VENDOR" 12
diff --git a/doc/man/nvme_id_uuid_list.2 b/doc/man/nvme_id_uuid_list.2
new file mode 100644
index 0000000..68106c9
--- /dev/null
+++ b/doc/man/nvme_id_uuid_list.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_id_uuid_list" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_id_uuid_list \- UUID list
+.SH SYNOPSIS
+struct nvme_id_uuid_list {
+.br
+.BI " __u8 rsvd0[32];"
+.br
+.BI " struct nvme_id_uuid_list_entry entry[NVME_ID_UUID_LIST_MAX];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "rsvd0" 12
+reserved
+.IP "entry" 12
+UUID list entry
diff --git a/doc/man/nvme_id_uuid_list_entry.2 b/doc/man/nvme_id_uuid_list_entry.2
new file mode 100644
index 0000000..1525bad
--- /dev/null
+++ b/doc/man/nvme_id_uuid_list_entry.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_id_uuid_list_entry" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_id_uuid_list_entry \- UUID List Entry
+.SH SYNOPSIS
+struct nvme_id_uuid_list_entry {
+.br
+.BI " __u8 header;"
+.br
+.BI " __u8 rsvd1[15];"
+.br
+.BI " __u8 uuid[16];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "header" 12
+UUID Lists Entry Header
+.IP "rsvd1" 12
+reserved
+.IP "uuid" 12
+128-bit Universally Unique Identifier
diff --git a/doc/man/nvme_identify.2 b/doc/man/nvme_identify.2
new file mode 100644
index 0000000..fa0a0c6
--- /dev/null
+++ b/doc/man/nvme_identify.2
@@ -0,0 +1,15 @@
+.TH "nvme_identify" 9 "nvme_identify" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify \- Send the NVMe Identify command
+.SH SYNOPSIS
+.B "int" nvme_identify
+.BI "(struct nvme_identify_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_identify_args\fP argument structure
+.SH "DESCRIPTION"
+The Identify command returns a data buffer that describes information about
+the NVM subsystem, the controller or the namespace(s).
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_active_ns_list.2 b/doc/man/nvme_identify_active_ns_list.2
new file mode 100644
index 0000000..9f4d11b
--- /dev/null
+++ b/doc/man/nvme_identify_active_ns_list.2
@@ -0,0 +1,24 @@
+.TH "nvme_identify_active_ns_list" 9 "nvme_identify_active_ns_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_active_ns_list \- Retrieves active namespaces id list
+.SH SYNOPSIS
+.B "int" nvme_identify_active_ns_list
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_ns_list *list " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Return namespaces greater than this identifier
+.IP "list" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+A list of 1024 namespace IDs is returned to the host containing NSIDs in
+increasing order that are greater than the value specified in the Namespace
+Identifier (nsid) field of the command.
+
+See \fIstruct nvme_ns_list\fP for the definition of the returned structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_active_ns_list_csi.2 b/doc/man/nvme_identify_active_ns_list_csi.2
new file mode 100644
index 0000000..5bbeda7
--- /dev/null
+++ b/doc/man/nvme_identify_active_ns_list_csi.2
@@ -0,0 +1,28 @@
+.TH "nvme_identify_active_ns_list_csi" 9 "nvme_identify_active_ns_list_csi" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_active_ns_list_csi \- Active namespace ID list associated with a specified I/O command set
+.SH SYNOPSIS
+.B "int" nvme_identify_active_ns_list_csi
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "enum nvme_csi csi " ","
+.BI "struct nvme_ns_list *ns_list " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Return namespaces greater than this identifier
+.IP "csi" 12
+Command Set Identifier
+.IP "ns_list" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+A list of 1024 namespace IDs is returned to the host containing active
+NSIDs in increasing order that are greater than the value specified in
+the Namespace Identifier (nsid) field of the command and matching the
+I/O Command Set specified in the \fIcsi\fP argument.
+
+See \fIstruct nvme_ns_list\fP for the definition of the returned structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_allocated_ns.2 b/doc/man/nvme_identify_allocated_ns.2
new file mode 100644
index 0000000..89120e5
--- /dev/null
+++ b/doc/man/nvme_identify_allocated_ns.2
@@ -0,0 +1,18 @@
+.TH "nvme_identify_allocated_ns" 9 "nvme_identify_allocated_ns" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_allocated_ns \- Same as nvme_identify_ns, but only for allocated namespaces
+.SH SYNOPSIS
+.B "int" nvme_identify_allocated_ns
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_id_ns *ns " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace to identify
+.IP "ns" 12
+User space destination address to transfer the data
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_allocated_ns_list.2 b/doc/man/nvme_identify_allocated_ns_list.2
new file mode 100644
index 0000000..39b7b52
--- /dev/null
+++ b/doc/man/nvme_identify_allocated_ns_list.2
@@ -0,0 +1,24 @@
+.TH "nvme_identify_allocated_ns_list" 9 "nvme_identify_allocated_ns_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_allocated_ns_list \- Retrieves allocated namespace id list
+.SH SYNOPSIS
+.B "int" nvme_identify_allocated_ns_list
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_ns_list *list " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Return namespaces greater than this identifier
+.IP "list" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+A list of 1024 namespace IDs is returned to the host containing NSIDs in
+increasing order that are greater than the value specified in the Namespace
+Identifier (nsid) field of the command.
+
+See \fIstruct nvme_ns_list\fP for the definition of the returned structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_allocated_ns_list_csi.2 b/doc/man/nvme_identify_allocated_ns_list_csi.2
new file mode 100644
index 0000000..b71faa1
--- /dev/null
+++ b/doc/man/nvme_identify_allocated_ns_list_csi.2
@@ -0,0 +1,28 @@
+.TH "nvme_identify_allocated_ns_list_csi" 9 "nvme_identify_allocated_ns_list_csi" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_allocated_ns_list_csi \- Allocated namespace ID list associated with a specified I/O command set
+.SH SYNOPSIS
+.B "int" nvme_identify_allocated_ns_list_csi
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "enum nvme_csi csi " ","
+.BI "struct nvme_ns_list *ns_list " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Return namespaces greater than this identifier
+.IP "csi" 12
+Command Set Identifier
+.IP "ns_list" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+A list of 1024 namespace IDs is returned to the host containing allocated
+NSIDs in increasing order that are greater than the value specified in
+the \fInsid\fP field of the command and matching the I/O Command Set
+specified in the \fIcsi\fP argument.
+
+See \fIstruct nvme_ns_list\fP for the definition of the returned structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_cns.2 b/doc/man/nvme_identify_cns.2
new file mode 100644
index 0000000..d641e33
--- /dev/null
+++ b/doc/man/nvme_identify_cns.2
@@ -0,0 +1,163 @@
+.TH "libnvme" 9 "enum nvme_identify_cns" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_identify_cns \- Identify - CNS Values
+.SH SYNOPSIS
+enum nvme_identify_cns {
+.br
+.BI " NVME_IDENTIFY_CNS_NS"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_CTRL"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_NS_ACTIVE_LIST"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_NS_DESC_LIST"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_NVMSET_LIST"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_CSI_NS"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_CSI_CTRL"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_CSI_NS_ACTIVE_LIST"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_CSI_INDEPENDENT_ID_NS"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_NS_USER_DATA_FORMAT"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_CSI_NS_USER_DATA_FORMAT"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_ALLOCATED_NS_LIST"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_ALLOCATED_NS"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_NS_CTRL_LIST"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_CTRL_LIST"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_PRIMARY_CTRL_CAP"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_SECONDARY_CTRL_LIST"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_NS_GRANULARITY"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_UUID_LIST"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_DOMAIN_LIST"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_ENDURANCE_GROUP_ID"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_CSI_ALLOCATED_NS_LIST"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_CSI_ID_NS_DATA_STRUCTURE"
+,
+.br
+.br
+.BI " NVME_IDENTIFY_CNS_COMMAND_SET_STRUCTURE"
+
+};
+.SH Constants
+.IP "NVME_IDENTIFY_CNS_NS" 12
+Identify Namespace data structure
+.IP "NVME_IDENTIFY_CNS_CTRL" 12
+Identify Controller data structure
+.IP "NVME_IDENTIFY_CNS_NS_ACTIVE_LIST" 12
+Active Namespace ID list
+.IP "NVME_IDENTIFY_CNS_NS_DESC_LIST" 12
+Namespace Identification Descriptor list
+.IP "NVME_IDENTIFY_CNS_NVMSET_LIST" 12
+NVM Set List
+.IP "NVME_IDENTIFY_CNS_CSI_NS" 12
+I/O Command Set specific Identify
+Namespace data structure
+.IP "NVME_IDENTIFY_CNS_CSI_CTRL" 12
+I/O Command Set specific Identify
+Controller data structure
+.IP "NVME_IDENTIFY_CNS_CSI_NS_ACTIVE_LIST" 12
+Active Namespace ID list associated
+with the specified I/O Command Set
+.IP "NVME_IDENTIFY_CNS_CSI_INDEPENDENT_ID_NS" 12
+I/O Command Set Independent Identify
+.IP "NVME_IDENTIFY_CNS_NS_USER_DATA_FORMAT" 12
+Namespace user data format
+.IP "NVME_IDENTIFY_CNS_CSI_NS_USER_DATA_FORMAT" 12
+I/O Command Set specific user data
+format
+Namespace data structure
+.IP "NVME_IDENTIFY_CNS_ALLOCATED_NS_LIST" 12
+Allocated Namespace ID list
+.IP "NVME_IDENTIFY_CNS_ALLOCATED_NS" 12
+Identify Namespace data structure for
+the specified allocated NSID
+.IP "NVME_IDENTIFY_CNS_NS_CTRL_LIST" 12
+Controller List of controllers attached
+to the specified NSID
+.IP "NVME_IDENTIFY_CNS_CTRL_LIST" 12
+Controller List of controllers that exist
+in the NVM subsystem
+.IP "NVME_IDENTIFY_CNS_PRIMARY_CTRL_CAP" 12
+Primary Controller Capabilities data
+structure for the specified primary controller
+.IP "NVME_IDENTIFY_CNS_SECONDARY_CTRL_LIST" 12
+Secondary Controller list of controllers
+associated with the primary controller
+processing the command
+.IP "NVME_IDENTIFY_CNS_NS_GRANULARITY" 12
+A Namespace Granularity List
+.IP "NVME_IDENTIFY_CNS_UUID_LIST" 12
+A UUID List
+.IP "NVME_IDENTIFY_CNS_DOMAIN_LIST" 12
+Domain List
+.IP "NVME_IDENTIFY_CNS_ENDURANCE_GROUP_ID" 12
+Endurance Group List
+.IP "NVME_IDENTIFY_CNS_CSI_ALLOCATED_NS_LIST" 12
+I/O Command Set specific Allocated Namespace
+ID list
+.IP "NVME_IDENTIFY_CNS_CSI_ID_NS_DATA_STRUCTURE" 12
+I/O Command Set specific ID Namespace
+Data Structure for Allocated Namespace ID
+.IP "NVME_IDENTIFY_CNS_COMMAND_SET_STRUCTURE" 12
+Base Specification 2.0a section 5.17.2.21
diff --git a/doc/man/nvme_identify_ctrl.2 b/doc/man/nvme_identify_ctrl.2
new file mode 100644
index 0000000..2f2b488
--- /dev/null
+++ b/doc/man/nvme_identify_ctrl.2
@@ -0,0 +1,19 @@
+.TH "nvme_identify_ctrl" 9 "nvme_identify_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_ctrl \- Retrieves nvme identify controller
+.SH SYNOPSIS
+.B "int" nvme_identify_ctrl
+.BI "(int fd " ","
+.BI "struct nvme_id_ctrl *id " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "id" 12
+User space destination address to transfer the data,
+.SH "DESCRIPTION"
+Sends nvme identify with CNS value NVME_IDENTIFY_CNS_CTRL.
+
+See \fIstruct nvme_id_ctrl\fP for details on the data returned.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_ctrl_csi.2 b/doc/man/nvme_identify_ctrl_csi.2
new file mode 100644
index 0000000..4a3cff7
--- /dev/null
+++ b/doc/man/nvme_identify_ctrl_csi.2
@@ -0,0 +1,22 @@
+.TH "nvme_identify_ctrl_csi" 9 "nvme_identify_ctrl_csi" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_ctrl_csi \- I/O command set specific Identify Controller data
+.SH SYNOPSIS
+.B "int" nvme_identify_ctrl_csi
+.BI "(int fd " ","
+.BI "enum nvme_csi csi " ","
+.BI "void *data " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "csi" 12
+Command Set Identifier
+.IP "data" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+An I/O Command Set specific Identify Controller data structure is returned
+to the host for the controller processing the command. The specific Identify
+Controller data structure to be returned is specified by \fIcsi\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_ctrl_list.2 b/doc/man/nvme_identify_ctrl_list.2
new file mode 100644
index 0000000..7a787a9
--- /dev/null
+++ b/doc/man/nvme_identify_ctrl_list.2
@@ -0,0 +1,24 @@
+.TH "nvme_identify_ctrl_list" 9 "nvme_identify_ctrl_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_ctrl_list \- Retrieves identify controller list
+.SH SYNOPSIS
+.B "int" nvme_identify_ctrl_list
+.BI "(int fd " ","
+.BI "__u16 cntid " ","
+.BI "struct nvme_ctrl_list *cntlist " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "cntid" 12
+Starting CNTLID to return in the list
+.IP "cntlist" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+Up to 2047 controller identifiers is returned containing a controller
+identifier greater than or equal to the controller identifier specified in
+\fIcntid\fP.
+
+See \fIstruct nvme_ctrl_list\fP for a definition of the structure returned.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_domain_list.2 b/doc/man/nvme_identify_domain_list.2
new file mode 100644
index 0000000..332198b
--- /dev/null
+++ b/doc/man/nvme_identify_domain_list.2
@@ -0,0 +1,25 @@
+.TH "nvme_identify_domain_list" 9 "nvme_identify_domain_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_domain_list \- Domain list data
+.SH SYNOPSIS
+.B "int" nvme_identify_domain_list
+.BI "(int fd " ","
+.BI "__u16 domid " ","
+.BI "struct nvme_id_domain_list *list " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "domid" 12
+Domain ID
+.IP "list" 12
+User space destination address to transfer data
+.SH "DESCRIPTION"
+A list of 31 domain IDs is returned to the host containing domain
+attributes in increasing order that are greater than the value
+specified in the \fIdomid\fP field.
+
+See \fIstruct nvme_identify_domain_attr\fP for the definition of the
+returned structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_endurance_group_list.2 b/doc/man/nvme_identify_endurance_group_list.2
new file mode 100644
index 0000000..4420d85
--- /dev/null
+++ b/doc/man/nvme_identify_endurance_group_list.2
@@ -0,0 +1,18 @@
+.TH "nvme_identify_endurance_group_list" 9 "nvme_identify_endurance_group_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_endurance_group_list \- Endurance group list data
+.SH SYNOPSIS
+.B "int" nvme_identify_endurance_group_list
+.BI "(int fd " ","
+.BI "__u16 endgrp_id " ","
+.BI "struct nvme_id_endurance_group_list *list " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "endgrp_id" 12
+Endurance group identifier
+.IP "list" 12
+Array of endurance group identifiers
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_independent_identify_ns.2 b/doc/man/nvme_identify_independent_identify_ns.2
new file mode 100644
index 0000000..b609829
--- /dev/null
+++ b/doc/man/nvme_identify_independent_identify_ns.2
@@ -0,0 +1,22 @@
+.TH "nvme_identify_independent_identify_ns" 9 "nvme_identify_independent_identify_ns" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_independent_identify_ns \- I/O command set independent Identify namespace data
+.SH SYNOPSIS
+.B "int" nvme_identify_independent_identify_ns
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_id_independent_id_ns *ns " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Return namespaces greater than this identifier
+.IP "ns" 12
+I/O Command Set Independent Identify Namespace data
+structure
+.SH "DESCRIPTION"
+The I/O command set independent Identify namespace data structure for
+the namespace identified with \fIns\fP is returned to the host.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_iocs.2 b/doc/man/nvme_identify_iocs.2
new file mode 100644
index 0000000..852d7dc
--- /dev/null
+++ b/doc/man/nvme_identify_iocs.2
@@ -0,0 +1,21 @@
+.TH "nvme_identify_iocs" 9 "nvme_identify_iocs" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_iocs \- I/O command set data structure
+.SH SYNOPSIS
+.B "int" nvme_identify_iocs
+.BI "(int fd " ","
+.BI "__u16 cntlid " ","
+.BI "struct nvme_id_iocs *iocs " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "cntlid" 12
+Controller ID
+.IP "iocs" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+Retrieves list of the controller's supported io command set vectors. See
+\fIstruct nvme_id_iocs\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_iocs_ns_csi_user_data_format.2 b/doc/man/nvme_identify_iocs_ns_csi_user_data_format.2
new file mode 100644
index 0000000..16cc8f2
--- /dev/null
+++ b/doc/man/nvme_identify_iocs_ns_csi_user_data_format.2
@@ -0,0 +1,28 @@
+.TH "nvme_identify_iocs_ns_csi_user_data_format" 9 "nvme_identify_iocs_ns_csi_user_data_format" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_iocs_ns_csi_user_data_format \- Identify I/O command set namespace data structure
+.SH SYNOPSIS
+.B "int" nvme_identify_iocs_ns_csi_user_data_format
+.BI "(int fd " ","
+.BI "__u16 user_data_format " ","
+.BI "__u8 uuidx " ","
+.BI "enum nvme_csi csi " ","
+.BI "void *data " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "user_data_format" 12
+Return namespaces capability of identifier
+.IP "uuidx" 12
+UUID selection, if supported
+.IP "csi" 12
+Command Set Identifier
+.IP "data" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+I/O Command Set specific Identify Namespace data structure for
+the specified User Data Format index containing the namespace
+capabilities for the I/O Command Set specified in the CSI field.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_ns.2 b/doc/man/nvme_identify_ns.2
new file mode 100644
index 0000000..e132d82
--- /dev/null
+++ b/doc/man/nvme_identify_ns.2
@@ -0,0 +1,29 @@
+.TH "nvme_identify_ns" 9 "nvme_identify_ns" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_ns \- Retrieves nvme identify namespace
+.SH SYNOPSIS
+.B "int" nvme_identify_ns
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_id_ns *ns " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace to identify
+.IP "ns" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+If the Namespace Identifier (NSID) field specifies an active NSID, then the
+Identify Namespace data structure is returned to the host for that specified
+namespace.
+
+If the controller supports the Namespace Management capability and the NSID
+field is set to NVME_NSID_ALL, then the controller returns an Identify Namespace
+data structure that specifies capabilities that are common across namespaces
+for this controller.
+
+See \fIstruct nvme_id_ns\fP for details on the structure returned.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_ns_csi.2 b/doc/man/nvme_identify_ns_csi.2
new file mode 100644
index 0000000..3b826ef
--- /dev/null
+++ b/doc/man/nvme_identify_ns_csi.2
@@ -0,0 +1,27 @@
+.TH "nvme_identify_ns_csi" 9 "nvme_identify_ns_csi" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_ns_csi \- I/O command set specific identify namespace data
+.SH SYNOPSIS
+.B "int" nvme_identify_ns_csi
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "__u8 uuidx " ","
+.BI "enum nvme_csi csi " ","
+.BI "void *data " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace to identify
+.IP "uuidx" 12
+UUID Index for differentiating vendor specific encoding
+.IP "csi" 12
+Command Set Identifier
+.IP "data" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+An I/O Command Set specific Identify Namespace data structure is returned
+for the namespace specified in \fInsid\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_ns_csi_user_data_format.2 b/doc/man/nvme_identify_ns_csi_user_data_format.2
new file mode 100644
index 0000000..b9513ea
--- /dev/null
+++ b/doc/man/nvme_identify_ns_csi_user_data_format.2
@@ -0,0 +1,27 @@
+.TH "nvme_identify_ns_csi_user_data_format" 9 "nvme_identify_ns_csi_user_data_format" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_ns_csi_user_data_format \- Identify namespace user data format
+.SH SYNOPSIS
+.B "int" nvme_identify_ns_csi_user_data_format
+.BI "(int fd " ","
+.BI "__u16 user_data_format " ","
+.BI "__u8 uuidx " ","
+.BI "enum nvme_csi csi " ","
+.BI "void *data " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "user_data_format" 12
+Return namespaces capability of identifier
+.IP "uuidx" 12
+UUID selection, if supported
+.IP "csi" 12
+Command Set Identifier
+.IP "data" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+Identify Namespace data structure for the specified User Data Format
+index containing the namespace capabilities for the NVM Command Set.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_ns_descs.2 b/doc/man/nvme_identify_ns_descs.2
new file mode 100644
index 0000000..b7a5f42
--- /dev/null
+++ b/doc/man/nvme_identify_ns_descs.2
@@ -0,0 +1,26 @@
+.TH "nvme_identify_ns_descs" 9 "nvme_identify_ns_descs" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_ns_descs \- Retrieves namespace descriptor list
+.SH SYNOPSIS
+.B "int" nvme_identify_ns_descs
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_ns_id_desc *descs " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+The namespace id to retrieve descriptors
+.IP "descs" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+A list of Namespace Identification Descriptor structures is returned to the
+host for the namespace specified in the Namespace Identifier (NSID) field if
+it is an active NSID.
+
+The data returned is in the form of an array of 'struct nvme_ns_id_desc'.
+
+See \fIstruct nvme_ns_id_desc\fP for the definition of the returned structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_ns_granularity.2 b/doc/man/nvme_identify_ns_granularity.2
new file mode 100644
index 0000000..ca60403
--- /dev/null
+++ b/doc/man/nvme_identify_ns_granularity.2
@@ -0,0 +1,22 @@
+.TH "nvme_identify_ns_granularity" 9 "nvme_identify_ns_granularity" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_ns_granularity \- Retrieves namespace granularity identification
+.SH SYNOPSIS
+.B "int" nvme_identify_ns_granularity
+.BI "(int fd " ","
+.BI "struct nvme_id_ns_granularity_list *gr_list " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "gr_list" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+If the controller supports reporting of Namespace Granularity, then a
+Namespace Granularity List is returned to the host for up to sixteen
+namespace granularity descriptors
+
+See \fIstruct nvme_id_ns_granularity_list\fP for the definition of the returned
+structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_nsid_ctrl_list.2 b/doc/man/nvme_identify_nsid_ctrl_list.2
new file mode 100644
index 0000000..7caf127
--- /dev/null
+++ b/doc/man/nvme_identify_nsid_ctrl_list.2
@@ -0,0 +1,27 @@
+.TH "nvme_identify_nsid_ctrl_list" 9 "nvme_identify_nsid_ctrl_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_nsid_ctrl_list \- Retrieves controller list attached to an nsid
+.SH SYNOPSIS
+.B "int" nvme_identify_nsid_ctrl_list
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "__u16 cntid " ","
+.BI "struct nvme_ctrl_list *cntlist " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Return controllers that are attached to this nsid
+.IP "cntid" 12
+Starting CNTLID to return in the list
+.IP "cntlist" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+Up to 2047 controller identifiers are returned containing a controller
+identifier greater than or equal to the controller identifier specified in
+\fIcntid\fP attached to \fInsid\fP.
+
+See \fIstruct nvme_ctrl_list\fP for a definition of the structure returned.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1
diff --git a/doc/man/nvme_identify_nvmset_list.2 b/doc/man/nvme_identify_nvmset_list.2
new file mode 100644
index 0000000..115b898
--- /dev/null
+++ b/doc/man/nvme_identify_nvmset_list.2
@@ -0,0 +1,25 @@
+.TH "nvme_identify_nvmset_list" 9 "nvme_identify_nvmset_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_nvmset_list \- Retrieves NVM Set List
+.SH SYNOPSIS
+.B "int" nvme_identify_nvmset_list
+.BI "(int fd " ","
+.BI "__u16 nvmsetid " ","
+.BI "struct nvme_id_nvmset_list *nvmset " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nvmsetid" 12
+NVM Set Identifier
+.IP "nvmset" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+Retrieves an NVM Set List, \fIstruct nvme_id_nvmset_list\fP. The data structure
+is an ordered list by NVM Set Identifier, starting with the first NVM Set
+Identifier supported by the NVM subsystem that is equal to or greater than
+the NVM Set Identifier.
+
+See \fIstruct nvme_id_nvmset_list\fP for the definition of the returned structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_primary_ctrl.2 b/doc/man/nvme_identify_primary_ctrl.2
new file mode 100644
index 0000000..4f0f5e4
--- /dev/null
+++ b/doc/man/nvme_identify_primary_ctrl.2
@@ -0,0 +1,20 @@
+.TH "nvme_identify_primary_ctrl" 9 "nvme_identify_primary_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_primary_ctrl \- Retrieve NVMe Primary Controller identification
+.SH SYNOPSIS
+.B "int" nvme_identify_primary_ctrl
+.BI "(int fd " ","
+.BI "__u16 cntid " ","
+.BI "struct nvme_primary_ctrl_cap *cap " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "cntid" 12
+Return controllers starting at this identifier
+.IP "cap" 12
+User space destination buffer address to transfer the data
+.SH "DESCRIPTION"
+See \fIstruct nvme_primary_ctrl_cap\fP for the definition of the returned structure, \fIcap\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_secondary_ctrl_list.2 b/doc/man/nvme_identify_secondary_ctrl_list.2
new file mode 100644
index 0000000..1941b66
--- /dev/null
+++ b/doc/man/nvme_identify_secondary_ctrl_list.2
@@ -0,0 +1,29 @@
+.TH "nvme_identify_secondary_ctrl_list" 9 "nvme_identify_secondary_ctrl_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_secondary_ctrl_list \- Retrieves secondary controller list
+.SH SYNOPSIS
+.B "int" nvme_identify_secondary_ctrl_list
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "__u16 cntid " ","
+.BI "struct nvme_secondary_ctrl_list *sc_list " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace identifier
+.IP "cntid" 12
+Return controllers starting at this identifier
+.IP "sc_list" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+A Secondary Controller List is returned to the host for up to 127 secondary
+controllers associated with the primary controller processing this command.
+The list contains entries for controller identifiers greater than or equal
+to the value specified in the Controller Identifier (cntid).
+
+See \fIstruct nvme_secondary_ctrls_list\fP for a definition of the returned
+structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_uuid.2 b/doc/man/nvme_identify_uuid.2
new file mode 100644
index 0000000..4e131c6
--- /dev/null
+++ b/doc/man/nvme_identify_uuid.2
@@ -0,0 +1,20 @@
+.TH "nvme_identify_uuid" 9 "nvme_identify_uuid" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_identify_uuid \- Retrieves device's UUIDs
+.SH SYNOPSIS
+.B "int" nvme_identify_uuid
+.BI "(int fd " ","
+.BI "struct nvme_id_uuid_list *uuid_list " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "uuid_list" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+Each UUID List entry is either 0h, the NVMe Invalid UUID, or a valid UUID.
+Valid UUIDs are those which are non-zero and are not the NVMe Invalid UUID.
+
+See \fIstruct nvme_id_uuid_list\fP for the definition of the returned structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_init_copy_range.2 b/doc/man/nvme_init_copy_range.2
new file mode 100644
index 0000000..1900f20
--- /dev/null
+++ b/doc/man/nvme_init_copy_range.2
@@ -0,0 +1,27 @@
+.TH "nvme_init_copy_range" 9 "nvme_init_copy_range" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_init_copy_range \- Constructs a copy range structure
+.SH SYNOPSIS
+.B "void" nvme_init_copy_range
+.BI "(struct nvme_copy_range *copy " ","
+.BI "__u16 *nlbs " ","
+.BI "__u64 *slbas " ","
+.BI "__u32 *eilbrts " ","
+.BI "__u32 *elbatms " ","
+.BI "__u32 *elbats " ","
+.BI "__u16 nr " ");"
+.SH ARGUMENTS
+.IP "copy" 12
+Copy range array
+.IP "nlbs" 12
+Number of logical blocks
+.IP "slbas" 12
+Starting LBA
+.IP "eilbrts" 12
+Expected initial logical block reference tag
+.IP "elbatms" 12
+Expected logical block application tag mask
+.IP "elbats" 12
+Expected logical block application tag
+.IP "nr" 12
+Number of descriptors to construct
diff --git a/doc/man/nvme_init_copy_range_f1.2 b/doc/man/nvme_init_copy_range_f1.2
new file mode 100644
index 0000000..451522b
--- /dev/null
+++ b/doc/man/nvme_init_copy_range_f1.2
@@ -0,0 +1,27 @@
+.TH "nvme_init_copy_range_f1" 9 "nvme_init_copy_range_f1" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_init_copy_range_f1 \- Constructs a copy range f1 structure
+.SH SYNOPSIS
+.B "void" nvme_init_copy_range_f1
+.BI "(struct nvme_copy_range_f1 *copy " ","
+.BI "__u16 *nlbs " ","
+.BI "__u64 *slbas " ","
+.BI "__u64 *eilbrts " ","
+.BI "__u32 *elbatms " ","
+.BI "__u32 *elbats " ","
+.BI "__u16 nr " ");"
+.SH ARGUMENTS
+.IP "copy" 12
+Copy range array
+.IP "nlbs" 12
+Number of logical blocks
+.IP "slbas" 12
+Starting LBA
+.IP "eilbrts" 12
+Expected initial logical block reference tag
+.IP "elbatms" 12
+Expected logical block application tag mask
+.IP "elbats" 12
+Expected logical block application tag
+.IP "nr" 12
+Number of descriptors to construct
diff --git a/doc/man/nvme_init_ctrl.2 b/doc/man/nvme_init_ctrl.2
new file mode 100644
index 0000000..1102cb0
--- /dev/null
+++ b/doc/man/nvme_init_ctrl.2
@@ -0,0 +1,17 @@
+.TH "nvme_init_ctrl" 9 "nvme_init_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_init_ctrl \- Initialize nvme_ctrl_t object for an existing controller.
+.SH SYNOPSIS
+.B "int" nvme_init_ctrl
+.BI "(nvme_host_t h " ","
+.BI "nvme_ctrl_t c " ","
+.BI "int instance " ");"
+.SH ARGUMENTS
+.IP "h" 12
+nvme_host_t object
+.IP "c" 12
+nvme_ctrl_t object
+.IP "instance" 12
+Instance number (e.g. 1 for nvme1)
+.SH "RETURN"
+The \fBioctl\fP return code. Typically 0 on success.
diff --git a/doc/man/nvme_init_ctrl_list.2 b/doc/man/nvme_init_ctrl_list.2
new file mode 100644
index 0000000..04b7edf
--- /dev/null
+++ b/doc/man/nvme_init_ctrl_list.2
@@ -0,0 +1,18 @@
+.TH "nvme_init_ctrl_list" 9 "nvme_init_ctrl_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_init_ctrl_list \- Initialize an nvme_ctrl_list structure from an array.
+.SH SYNOPSIS
+.B "void" nvme_init_ctrl_list
+.BI "(struct nvme_ctrl_list *cntlist " ","
+.BI "__u16 num_ctrls " ","
+.BI "__u16 *ctrlist " ");"
+.SH ARGUMENTS
+.IP "cntlist" 12
+The controller list structure to initialize
+.IP "num_ctrls" 12
+The number of controllers in the array, \fIctrlist\fP.
+.IP "ctrlist" 12
+An array of controller identifiers in CPU native endian.
+.SH "DESCRIPTION"
+This is intended to be used with any command that takes a controller list
+argument. See \fBnvme_ns_attach_ctrls\fP and \fBnvme_ns_detach\fP.
diff --git a/doc/man/nvme_init_dsm_range.2 b/doc/man/nvme_init_dsm_range.2
new file mode 100644
index 0000000..ff73816
--- /dev/null
+++ b/doc/man/nvme_init_dsm_range.2
@@ -0,0 +1,27 @@
+.TH "nvme_init_dsm_range" 9 "nvme_init_dsm_range" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_init_dsm_range \- Constructs a data set range structure
+.SH SYNOPSIS
+.B "void" nvme_init_dsm_range
+.BI "(struct nvme_dsm_range *dsm " ","
+.BI "__u32 *ctx_attrs " ","
+.BI "__u32 *llbas " ","
+.BI "__u64 *slbas " ","
+.BI "__u16 nr_ranges " ");"
+.SH ARGUMENTS
+.IP "dsm" 12
+DSM range array
+.IP "ctx_attrs" 12
+Array of context attributes
+.IP "llbas" 12
+Array of length in logical blocks
+.IP "slbas" 12
+Array of starting logical blocks
+.IP "nr_ranges" 12
+The size of the dsm arrays
+.SH "DESCRIPTION"
+Each array must be the same size of size 'nr_ranges'. This is intended to be
+used with constructing a payload for \fBnvme_dsm\fP.
+.SH "RETURN"
+The nvme command status if a response was received or -errno
+otherwise.
diff --git a/doc/man/nvme_init_logging.2 b/doc/man/nvme_init_logging.2
new file mode 100644
index 0000000..644cd8b
--- /dev/null
+++ b/doc/man/nvme_init_logging.2
@@ -0,0 +1,20 @@
+.TH "nvme_init_logging" 9 "nvme_init_logging" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_init_logging \- Initialize logging
+.SH SYNOPSIS
+.B "void" nvme_init_logging
+.BI "(nvme_root_t r " ","
+.BI "int lvl " ","
+.BI "bool log_pid " ","
+.BI "bool log_tstamp " ");"
+.SH ARGUMENTS
+.IP "r" 12
+nvme_root_t context
+.IP "lvl" 12
+Logging level to set
+.IP "log_pid" 12
+Boolean to enable logging of the PID
+.IP "log_tstamp" 12
+Boolean to enable logging of the timestamp
+.SH "DESCRIPTION"
+Sets the default logging variables for the library.
diff --git a/doc/man/nvme_io.2 b/doc/man/nvme_io.2
new file mode 100644
index 0000000..b5be195
--- /dev/null
+++ b/doc/man/nvme_io.2
@@ -0,0 +1,15 @@
+.TH "nvme_io" 9 "nvme_io" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_io \- Submit an nvme user I/O command
+.SH SYNOPSIS
+.B "int" nvme_io
+.BI "(struct nvme_io_args *args " ","
+.BI "__u8 opcode " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_io_args\fP argument structure
+.IP "opcode" 12
+Opcode to execute
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_io_control_flags.2 b/doc/man/nvme_io_control_flags.2
new file mode 100644
index 0000000..d9f5437
--- /dev/null
+++ b/doc/man/nvme_io_control_flags.2
@@ -0,0 +1,66 @@
+.TH "libnvme" 9 "enum nvme_io_control_flags" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_io_control_flags \- I/O control flags
+.SH SYNOPSIS
+enum nvme_io_control_flags {
+.br
+.BI " NVME_IO_DTYPE_STREAMS"
+,
+.br
+.br
+.BI " NVME_IO_STC"
+,
+.br
+.br
+.BI " NVME_IO_DEAC"
+,
+.br
+.br
+.BI " NVME_IO_ZNS_APPEND_PIREMAP"
+,
+.br
+.br
+.BI " NVME_IO_PRINFO_PRCHK_REF"
+,
+.br
+.br
+.BI " NVME_IO_PRINFO_PRCHK_APP"
+,
+.br
+.br
+.BI " NVME_IO_PRINFO_PRCHK_GUARD"
+,
+.br
+.br
+.BI " NVME_IO_PRINFO_PRACT"
+,
+.br
+.br
+.BI " NVME_IO_FUA"
+,
+.br
+.br
+.BI " NVME_IO_LR"
+
+};
+.SH Constants
+.IP "NVME_IO_DTYPE_STREAMS" 12
+Directive Type Streams
+.IP "NVME_IO_STC" 12
+Storage Tag Check
+.IP "NVME_IO_DEAC" 12
+Deallocate
+.IP "NVME_IO_ZNS_APPEND_PIREMAP" 12
+Protection Information Remap
+.IP "NVME_IO_PRINFO_PRCHK_REF" 12
+Protection Information Check Reference Tag
+.IP "NVME_IO_PRINFO_PRCHK_APP" 12
+Protection Information Check Application Tag
+.IP "NVME_IO_PRINFO_PRCHK_GUARD" 12
+Protection Information Check Guard field
+.IP "NVME_IO_PRINFO_PRACT" 12
+Protection Information Action
+.IP "NVME_IO_FUA" 12
+Force Unit Access
+.IP "NVME_IO_LR" 12
+Limited Retry
diff --git a/doc/man/nvme_io_dsm_flags.2 b/doc/man/nvme_io_dsm_flags.2
new file mode 100644
index 0000000..700a615
--- /dev/null
+++ b/doc/man/nvme_io_dsm_flags.2
@@ -0,0 +1,96 @@
+.TH "libnvme" 9 "enum nvme_io_dsm_flags" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_io_dsm_flags \- Dataset Management flags
+.SH SYNOPSIS
+enum nvme_io_dsm_flags {
+.br
+.BI " NVME_IO_DSM_FREQ_UNSPEC"
+,
+.br
+.br
+.BI " NVME_IO_DSM_FREQ_TYPICAL"
+,
+.br
+.br
+.BI " NVME_IO_DSM_FREQ_RARE"
+,
+.br
+.br
+.BI " NVME_IO_DSM_FREQ_READS"
+,
+.br
+.br
+.BI " NVME_IO_DSM_FREQ_WRITES"
+,
+.br
+.br
+.BI " NVME_IO_DSM_FREQ_RW"
+,
+.br
+.br
+.BI " NVME_IO_DSM_FREQ_ONCE"
+,
+.br
+.br
+.BI " NVME_IO_DSM_FREQ_PREFETCH"
+,
+.br
+.br
+.BI " NVME_IO_DSM_FREQ_TEMP"
+,
+.br
+.br
+.BI " NVME_IO_DSM_LATENCY_NONE"
+,
+.br
+.br
+.BI " NVME_IO_DSM_LATENCY_IDLE"
+,
+.br
+.br
+.BI " NVME_IO_DSM_LATENCY_NORM"
+,
+.br
+.br
+.BI " NVME_IO_DSM_LATENCY_LOW"
+,
+.br
+.br
+.BI " NVME_IO_DSM_SEQ_REQ"
+,
+.br
+.br
+.BI " NVME_IO_DSM_COMPRESSED"
+
+};
+.SH Constants
+.IP "NVME_IO_DSM_FREQ_UNSPEC" 12
+No frequency information provided
+.IP "NVME_IO_DSM_FREQ_TYPICAL" 12
+Typical number of reads and writes
+expected for this LBA range
+.IP "NVME_IO_DSM_FREQ_RARE" 12
+Infrequent writes and infrequent
+reads to the LBA range indicated
+.IP "NVME_IO_DSM_FREQ_READS" 12
+Infrequent writes and frequent
+reads to the LBA range indicated
+.IP "NVME_IO_DSM_FREQ_WRITES" 12
+Frequent writes and infrequent
+reads to the LBA range indicated
+.IP "NVME_IO_DSM_FREQ_RW" 12
+Frequent writes and frequent reads
+to the LBA range indicated
+.IP "NVME_IO_DSM_FREQ_ONCE" 12
+.IP "NVME_IO_DSM_FREQ_PREFETCH" 12
+.IP "NVME_IO_DSM_FREQ_TEMP" 12
+.IP "NVME_IO_DSM_LATENCY_NONE" 12
+No latency information provided
+.IP "NVME_IO_DSM_LATENCY_IDLE" 12
+Longer latency acceptable
+.IP "NVME_IO_DSM_LATENCY_NORM" 12
+Typical latency
+.IP "NVME_IO_DSM_LATENCY_LOW" 12
+Smallest possible latency
+.IP "NVME_IO_DSM_SEQ_REQ" 12
+.IP "NVME_IO_DSM_COMPRESSED" 12
diff --git a/doc/man/nvme_io_mgmt_recv.2 b/doc/man/nvme_io_mgmt_recv.2
new file mode 100644
index 0000000..9624abe
--- /dev/null
+++ b/doc/man/nvme_io_mgmt_recv.2
@@ -0,0 +1,12 @@
+.TH "nvme_io_mgmt_recv" 9 "nvme_io_mgmt_recv" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_io_mgmt_recv \- I/O Management Receive command
+.SH SYNOPSIS
+.B "int" nvme_io_mgmt_recv
+.BI "(struct nvme_io_mgmt_recv_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_io_mgmt_recv_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_io_mgmt_recv_mo.2 b/doc/man/nvme_io_mgmt_recv_mo.2
new file mode 100644
index 0000000..f9556d6
--- /dev/null
+++ b/doc/man/nvme_io_mgmt_recv_mo.2
@@ -0,0 +1,12 @@
+.TH "libnvme" 9 "enum nvme_io_mgmt_recv_mo" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_io_mgmt_recv_mo \- I/O Management Receive - Management Operation
+.SH SYNOPSIS
+enum nvme_io_mgmt_recv_mo {
+.br
+.BI " NVME_IO_MGMT_RECV_RUH_STATUS"
+
+};
+.SH Constants
+.IP "NVME_IO_MGMT_RECV_RUH_STATUS" 12
+Reclaim Unit Handle Status
diff --git a/doc/man/nvme_io_mgmt_send.2 b/doc/man/nvme_io_mgmt_send.2
new file mode 100644
index 0000000..9b41e2c
--- /dev/null
+++ b/doc/man/nvme_io_mgmt_send.2
@@ -0,0 +1,12 @@
+.TH "nvme_io_mgmt_send" 9 "nvme_io_mgmt_send" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_io_mgmt_send \- I/O Management Send command
+.SH SYNOPSIS
+.B "int" nvme_io_mgmt_send
+.BI "(struct nvme_io_mgmt_send_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_io_mgmt_send_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_io_mgmt_send_mo.2 b/doc/man/nvme_io_mgmt_send_mo.2
new file mode 100644
index 0000000..a2ae1ac
--- /dev/null
+++ b/doc/man/nvme_io_mgmt_send_mo.2
@@ -0,0 +1,12 @@
+.TH "libnvme" 9 "enum nvme_io_mgmt_send_mo" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_io_mgmt_send_mo \- I/O Management Send - Management Operation
+.SH SYNOPSIS
+enum nvme_io_mgmt_send_mo {
+.br
+.BI " NVME_IO_MGMT_SEND_RUH_UPDATE"
+
+};
+.SH Constants
+.IP "NVME_IO_MGMT_SEND_RUH_UPDATE" 12
+Reclaim Unit Handle Update
diff --git a/doc/man/nvme_io_opcode.2 b/doc/man/nvme_io_opcode.2
new file mode 100644
index 0000000..5421280
--- /dev/null
+++ b/doc/man/nvme_io_opcode.2
@@ -0,0 +1,114 @@
+.TH "libnvme" 9 "enum nvme_io_opcode" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_io_opcode \- Opcodes for I/O Commands
+.SH SYNOPSIS
+enum nvme_io_opcode {
+.br
+.BI " nvme_cmd_flush"
+,
+.br
+.br
+.BI " nvme_cmd_write"
+,
+.br
+.br
+.BI " nvme_cmd_read"
+,
+.br
+.br
+.BI " nvme_cmd_write_uncor"
+,
+.br
+.br
+.BI " nvme_cmd_compare"
+,
+.br
+.br
+.BI " nvme_cmd_write_zeroes"
+,
+.br
+.br
+.BI " nvme_cmd_dsm"
+,
+.br
+.br
+.BI " nvme_cmd_verify"
+,
+.br
+.br
+.BI " nvme_cmd_resv_register"
+,
+.br
+.br
+.BI " nvme_cmd_resv_report"
+,
+.br
+.br
+.BI " nvme_cmd_resv_acquire"
+,
+.br
+.br
+.BI " nvme_cmd_io_mgmt_recv"
+,
+.br
+.br
+.BI " nvme_cmd_resv_release"
+,
+.br
+.br
+.BI " nvme_cmd_copy"
+,
+.br
+.br
+.BI " nvme_cmd_io_mgmt_send"
+,
+.br
+.br
+.BI " nvme_zns_cmd_mgmt_send"
+,
+.br
+.br
+.BI " nvme_zns_cmd_mgmt_recv"
+,
+.br
+.br
+.BI " nvme_zns_cmd_append"
+
+};
+.SH Constants
+.IP "nvme_cmd_flush" 12
+Flush
+.IP "nvme_cmd_write" 12
+Write
+.IP "nvme_cmd_read" 12
+Read
+.IP "nvme_cmd_write_uncor" 12
+Write Uncorrectable
+.IP "nvme_cmd_compare" 12
+Compare
+.IP "nvme_cmd_write_zeroes" 12
+write Zeros
+.IP "nvme_cmd_dsm" 12
+Dataset Management
+.IP "nvme_cmd_verify" 12
+Verify
+.IP "nvme_cmd_resv_register" 12
+Reservation Register
+.IP "nvme_cmd_resv_report" 12
+Reservation Report
+.IP "nvme_cmd_resv_acquire" 12
+Reservation Acquire
+.IP "nvme_cmd_io_mgmt_recv" 12
+I/O Management Receive
+.IP "nvme_cmd_resv_release" 12
+Reservation Release
+.IP "nvme_cmd_copy" 12
+Copy
+.IP "nvme_cmd_io_mgmt_send" 12
+I/O Management Send
+.IP "nvme_zns_cmd_mgmt_send" 12
+Zone Management Send
+.IP "nvme_zns_cmd_mgmt_recv" 12
+Zone Management Receive
+.IP "nvme_zns_cmd_append" 12
+Zone Append
diff --git a/doc/man/nvme_io_passthru.2 b/doc/man/nvme_io_passthru.2
new file mode 100644
index 0000000..2180ab3
--- /dev/null
+++ b/doc/man/nvme_io_passthru.2
@@ -0,0 +1,71 @@
+.TH "nvme_io_passthru" 9 "nvme_io_passthru" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_io_passthru \- Submit an nvme io passthrough command
+.SH SYNOPSIS
+.B "int" nvme_io_passthru
+.BI "(int fd " ","
+.BI "__u8 opcode " ","
+.BI "__u8 flags " ","
+.BI "__u16 rsvd " ","
+.BI "__u32 nsid " ","
+.BI "__u32 cdw2 " ","
+.BI "__u32 cdw3 " ","
+.BI "__u32 cdw10 " ","
+.BI "__u32 cdw11 " ","
+.BI "__u32 cdw12 " ","
+.BI "__u32 cdw13 " ","
+.BI "__u32 cdw14 " ","
+.BI "__u32 cdw15 " ","
+.BI "__u32 data_len " ","
+.BI "void *data " ","
+.BI "__u32 metadata_len " ","
+.BI "void *metadata " ","
+.BI "__u32 timeout_ms " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "opcode" 12
+The nvme io command to send
+.IP "flags" 12
+NVMe command flags (not used)
+.IP "rsvd" 12
+Reserved for future use
+.IP "nsid" 12
+Namespace identifier
+.IP "cdw2" 12
+Command dword 2
+.IP "cdw3" 12
+Command dword 3
+.IP "cdw10" 12
+Command dword 10
+.IP "cdw11" 12
+Command dword 11
+.IP "cdw12" 12
+Command dword 12
+.IP "cdw13" 12
+Command dword 13
+.IP "cdw14" 12
+Command dword 14
+.IP "cdw15" 12
+Command dword 15
+.IP "data_len" 12
+Length of the data transferred in this command in bytes
+.IP "data" 12
+Pointer to user address of the data buffer
+.IP "metadata_len" 12
+Length of metadata transferred in this command
+.IP "metadata" 12
+Pointer to user address of the metadata buffer
+.IP "timeout_ms" 12
+How long the kernel waits for the command to complete
+.IP "result" 12
+Optional field to return the result from the CQE dword 0
+.SH "DESCRIPTION"
+Parameterized form of \fBnvme_submit_io_passthru\fP. This sets up and submits
+a \fIstruct nvme_passthru_cmd\fP.
+
+Known values for \fIopcode\fP are defined in \fIenum nvme_io_opcode\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_io_passthru64.2 b/doc/man/nvme_io_passthru64.2
new file mode 100644
index 0000000..aff02e3
--- /dev/null
+++ b/doc/man/nvme_io_passthru64.2
@@ -0,0 +1,71 @@
+.TH "nvme_io_passthru64" 9 "nvme_io_passthru64" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_io_passthru64 \- Submit an nvme io passthrough command
+.SH SYNOPSIS
+.B "int" nvme_io_passthru64
+.BI "(int fd " ","
+.BI "__u8 opcode " ","
+.BI "__u8 flags " ","
+.BI "__u16 rsvd " ","
+.BI "__u32 nsid " ","
+.BI "__u32 cdw2 " ","
+.BI "__u32 cdw3 " ","
+.BI "__u32 cdw10 " ","
+.BI "__u32 cdw11 " ","
+.BI "__u32 cdw12 " ","
+.BI "__u32 cdw13 " ","
+.BI "__u32 cdw14 " ","
+.BI "__u32 cdw15 " ","
+.BI "__u32 data_len " ","
+.BI "void *data " ","
+.BI "__u32 metadata_len " ","
+.BI "void *metadata " ","
+.BI "__u32 timeout_ms " ","
+.BI "__u64 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "opcode" 12
+The nvme io command to send
+.IP "flags" 12
+NVMe command flags (not used)
+.IP "rsvd" 12
+Reserved for future use
+.IP "nsid" 12
+Namespace identifier
+.IP "cdw2" 12
+Command dword 2
+.IP "cdw3" 12
+Command dword 3
+.IP "cdw10" 12
+Command dword 10
+.IP "cdw11" 12
+Command dword 11
+.IP "cdw12" 12
+Command dword 12
+.IP "cdw13" 12
+Command dword 13
+.IP "cdw14" 12
+Command dword 14
+.IP "cdw15" 12
+Command dword 15
+.IP "data_len" 12
+Length of the data transferred in this command in bytes
+.IP "data" 12
+Pointer to user address of the data buffer
+.IP "metadata_len" 12
+Length of metadata transferred in this command
+.IP "metadata" 12
+Pointer to user address of the metadata buffer
+.IP "timeout_ms" 12
+How long the kernel waits for the command to complete
+.IP "result" 12
+Optional field to return the result from the CQE dword 0
+.SH "DESCRIPTION"
+Parameterized form of \fBnvme_submit_io_passthru64\fP. This sets up and submits
+a \fIstruct nvme_passthru_cmd64\fP.
+
+Known values for \fIopcode\fP are defined in \fIenum nvme_io_opcode\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_is_64bit_reg.2 b/doc/man/nvme_is_64bit_reg.2
new file mode 100644
index 0000000..39701b1
--- /dev/null
+++ b/doc/man/nvme_is_64bit_reg.2
@@ -0,0 +1,16 @@
+.TH "nvme_is_64bit_reg" 9 "nvme_is_64bit_reg" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_is_64bit_reg \- Checks if offset of the controller register is a know 64bit value.
+.SH SYNOPSIS
+.B "bool" nvme_is_64bit_reg
+.BI "(__u32 offset " ");"
+.SH ARGUMENTS
+.IP "offset" 12
+Offset of controller register field in bytes
+.SH "DESCRIPTION"
+This function does not care about transport so that the offset is not going
+to be checked inside of this function for the unsupported fields in a
+specific transport. For example, BPMBL(Boot Partition Memory Buffer
+Location) register is not supported by fabrics, but it can be checked here.
+.SH "RETURN"
+true if given offset is 64bit register, otherwise it returns false.
diff --git a/doc/man/nvme_lba_range_type.2 b/doc/man/nvme_lba_range_type.2
new file mode 100644
index 0000000..034191b
--- /dev/null
+++ b/doc/man/nvme_lba_range_type.2
@@ -0,0 +1,15 @@
+.TH "libnvme" 9 "struct nvme_lba_range_type" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_lba_range_type \- LBA Range Type
+.SH SYNOPSIS
+struct nvme_lba_range_type {
+.br
+.BI " struct nvme_lba_range_type_entry entry[NVME_FEAT_LBA_RANGE_MAX];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "entry" 12
+LBA range type entry. See \fIstruct\fP nvme_lba_range_type_entry
diff --git a/doc/man/nvme_lba_range_type_entry.2 b/doc/man/nvme_lba_range_type_entry.2
new file mode 100644
index 0000000..5740756
--- /dev/null
+++ b/doc/man/nvme_lba_range_type_entry.2
@@ -0,0 +1,39 @@
+.TH "libnvme" 9 "struct nvme_lba_range_type_entry" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_lba_range_type_entry \- LBA Range Type - Data Structure Entry
+.SH SYNOPSIS
+struct nvme_lba_range_type_entry {
+.br
+.BI " __u8 type;"
+.br
+.BI " __u8 attributes;"
+.br
+.BI " __u8 rsvd2[14];"
+.br
+.BI " __u64 slba;"
+.br
+.BI " __u64 nlb;"
+.br
+.BI " __u8 guid[16];"
+.br
+.BI " __u8 rsvd48[16];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "type" 12
+Specifies the Type of the LBA range
+.IP "attributes" 12
+Specifies attributes of the LBA range
+.IP "rsvd2" 12
+Reserved
+.IP "slba" 12
+Starting LBA
+.IP "nlb" 12
+Number of Logical Blocks
+.IP "guid" 12
+Unique Identifier
+.IP "rsvd48" 12
+Reserved
diff --git a/doc/man/nvme_lba_rd.2 b/doc/man/nvme_lba_rd.2
new file mode 100644
index 0000000..b1e87d3
--- /dev/null
+++ b/doc/man/nvme_lba_rd.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_lba_rd" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_lba_rd \- LBA Range Descriptor
+.SH SYNOPSIS
+struct nvme_lba_rd {
+.br
+.BI " __le64 rslba;"
+.br
+.BI " __le32 rnlb;"
+.br
+.BI " __u8 rsvd12[4];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "rslba" 12
+Range Starting LBA
+.IP "rnlb" 12
+Range Number of Logical Blocks
+.IP "rsvd12" 12
+Reserved
diff --git a/doc/man/nvme_lba_status.2 b/doc/man/nvme_lba_status.2
new file mode 100644
index 0000000..ba502c6
--- /dev/null
+++ b/doc/man/nvme_lba_status.2
@@ -0,0 +1,27 @@
+.TH "libnvme" 9 "struct nvme_lba_status" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_lba_status \- LBA Status Descriptor List
+.SH SYNOPSIS
+struct nvme_lba_status {
+.br
+.BI " __le32 nlsd;"
+.br
+.BI " __u8 cmpc;"
+.br
+.BI " __u8 rsvd5[3];"
+.br
+.BI " struct nvme_lba_status_desc descs[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nlsd" 12
+Number of LBA Status Descriptors
+.IP "cmpc" 12
+Completion Condition
+.IP "rsvd5" 12
+Reserved
+.IP "descs" 12
+LBA status descriptor Entry
diff --git a/doc/man/nvme_lba_status_atype.2 b/doc/man/nvme_lba_status_atype.2
new file mode 100644
index 0000000..064bf4c
--- /dev/null
+++ b/doc/man/nvme_lba_status_atype.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "enum nvme_lba_status_atype" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_lba_status_atype \- Potentially Unrecoverable LBAs
+.SH SYNOPSIS
+enum nvme_lba_status_atype {
+.br
+.BI " NVME_LBA_STATUS_ATYPE_SCAN_UNTRACKED"
+,
+.br
+.br
+.BI " NVME_LBA_STATUS_ATYPE_SCAN_TRACKED"
+
+};
+.SH Constants
+.IP "NVME_LBA_STATUS_ATYPE_SCAN_UNTRACKED" 12
+Potentially Unrecoverable LBAs
+.IP "NVME_LBA_STATUS_ATYPE_SCAN_TRACKED" 12
+Potentially Unrecoverable LBAs
+associated with physical storage
diff --git a/doc/man/nvme_lba_status_desc.2 b/doc/man/nvme_lba_status_desc.2
new file mode 100644
index 0000000..a7f1cec
--- /dev/null
+++ b/doc/man/nvme_lba_status_desc.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "struct nvme_lba_status_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_lba_status_desc \- LBA Status Descriptor Entry
+.SH SYNOPSIS
+struct nvme_lba_status_desc {
+.br
+.BI " __le64 dslba;"
+.br
+.BI " __le32 nlb;"
+.br
+.BI " __u8 rsvd12;"
+.br
+.BI " __u8 status;"
+.br
+.BI " __u8 rsvd14[2];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "dslba" 12
+Descriptor Starting LBA
+.IP "nlb" 12
+Number of Logical Blocks
+.IP "rsvd12" 12
+Reserved
+.IP "status" 12
+Additional status about this LBA range
+.IP "rsvd14" 12
+Reserved
diff --git a/doc/man/nvme_lba_status_log.2 b/doc/man/nvme_lba_status_log.2
new file mode 100644
index 0000000..eb61fdf
--- /dev/null
+++ b/doc/man/nvme_lba_status_log.2
@@ -0,0 +1,35 @@
+.TH "libnvme" 9 "struct nvme_lba_status_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_lba_status_log \- LBA Status Information Log
+.SH SYNOPSIS
+struct nvme_lba_status_log {
+.br
+.BI " __le32 lslplen;"
+.br
+.BI " __le32 nlslne;"
+.br
+.BI " __le32 estulb;"
+.br
+.BI " __u8 rsvd12[2];"
+.br
+.BI " __le16 lsgc;"
+.br
+.BI " struct nvme_lbas_ns_element elements[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "lslplen" 12
+LBA Status Log Page Length
+.IP "nlslne" 12
+Number of LBA Status Log Namespace Elements
+.IP "estulb" 12
+Estimate of Unrecoverable Logical Blocks
+.IP "rsvd12" 12
+Reserved
+.IP "lsgc" 12
+LBA Status Generation Counter
+.IP "elements" 12
+LBA Status Log Namespace Element List
diff --git a/doc/man/nvme_lbaf.2 b/doc/man/nvme_lbaf.2
new file mode 100644
index 0000000..9e4a98b
--- /dev/null
+++ b/doc/man/nvme_lbaf.2
@@ -0,0 +1,25 @@
+.TH "libnvme" 9 "struct nvme_lbaf" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_lbaf \- LBA Format Data Structure
+.SH SYNOPSIS
+struct nvme_lbaf {
+.br
+.BI " __le16 ms;"
+.br
+.BI " __u8 ds;"
+.br
+.BI " __u8 rp;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "ms" 12
+Metadata Size indicates the number of metadata bytes provided per LBA
+based on the LBA Data Size indicated.
+.IP "ds" 12
+LBA Data Size indicates the LBA data size supported, reported as a
+power of two.
+.IP "rp" 12
+Relative Performance, see \fIenum nvme_lbaf_rp\fP.
diff --git a/doc/man/nvme_lbaf_rp.2 b/doc/man/nvme_lbaf_rp.2
new file mode 100644
index 0000000..5c66eac
--- /dev/null
+++ b/doc/man/nvme_lbaf_rp.2
@@ -0,0 +1,37 @@
+.TH "libnvme" 9 "enum nvme_lbaf_rp" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_lbaf_rp \- This field indicates the relative performance of the LBA format indicated relative to other LBA formats supported by the controller.
+.SH SYNOPSIS
+enum nvme_lbaf_rp {
+.br
+.BI " NVME_LBAF_RP_BEST"
+,
+.br
+.br
+.BI " NVME_LBAF_RP_BETTER"
+,
+.br
+.br
+.BI " NVME_LBAF_RP_GOOD"
+,
+.br
+.br
+.BI " NVME_LBAF_RP_DEGRADED"
+,
+.br
+.br
+.BI " NVME_LBAF_RP_MASK"
+
+};
+.SH Constants
+.IP "NVME_LBAF_RP_BEST" 12
+Best performance
+.IP "NVME_LBAF_RP_BETTER" 12
+Better performance
+.IP "NVME_LBAF_RP_GOOD" 12
+Good performance
+.IP "NVME_LBAF_RP_DEGRADED" 12
+Degraded performance
+.IP "NVME_LBAF_RP_MASK" 12
+Mask to get the relative performance value from the
+field
diff --git a/doc/man/nvme_lbart.2 b/doc/man/nvme_lbart.2
new file mode 100644
index 0000000..55b6aa9
--- /dev/null
+++ b/doc/man/nvme_lbart.2
@@ -0,0 +1,48 @@
+.TH "libnvme" 9 "enum nvme_lbart" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_lbart \- LBA Range Type - Data Structure Entry
+.SH SYNOPSIS
+enum nvme_lbart {
+.br
+.BI " NVME_LBART_TYPE_GP"
+,
+.br
+.br
+.BI " NVME_LBART_TYPE_FS"
+,
+.br
+.br
+.BI " NVME_LBART_TYPE_RAID"
+,
+.br
+.br
+.BI " NVME_LBART_TYPE_CACHE"
+,
+.br
+.br
+.BI " NVME_LBART_TYPE_SWAP"
+,
+.br
+.br
+.BI " NVME_LBART_ATTRIB_TEMP"
+,
+.br
+.br
+.BI " NVME_LBART_ATTRIB_HIDE"
+
+};
+.SH Constants
+.IP "NVME_LBART_TYPE_GP" 12
+General Purpose
+.IP "NVME_LBART_TYPE_FS" 12
+Filesystem
+.IP "NVME_LBART_TYPE_RAID" 12
+RAID
+.IP "NVME_LBART_TYPE_CACHE" 12
+Cache
+.IP "NVME_LBART_TYPE_SWAP" 12
+Page / swap file
+.IP "NVME_LBART_ATTRIB_TEMP" 12
+Temp
+.IP "NVME_LBART_ATTRIB_HIDE" 12
+Hidden
diff --git a/doc/man/nvme_lbas_ns_element.2 b/doc/man/nvme_lbas_ns_element.2
new file mode 100644
index 0000000..6b4a3bc
--- /dev/null
+++ b/doc/man/nvme_lbas_ns_element.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "struct nvme_lbas_ns_element" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_lbas_ns_element \- LBA Status Log Namespace Element
+.SH SYNOPSIS
+struct nvme_lbas_ns_element {
+.br
+.BI " __le32 neid;"
+.br
+.BI " __le32 nlrd;"
+.br
+.BI " __u8 ratype;"
+.br
+.BI " __u8 rsvd8[7];"
+.br
+.BI " struct nvme_lba_rd lba_rd[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "neid" 12
+Namespace Element Identifier
+.IP "nlrd" 12
+Number of LBA Range Descriptors
+.IP "ratype" 12
+Recommended Action Type. see \fIenum\fP nvme_lba_status_atype
+.IP "rsvd8" 12
+Reserved
+.IP "lba_rd" 12
+LBA Range Descriptor
diff --git a/doc/man/nvme_lockdown.2 b/doc/man/nvme_lockdown.2
new file mode 100644
index 0000000..4b331ea
--- /dev/null
+++ b/doc/man/nvme_lockdown.2
@@ -0,0 +1,12 @@
+.TH "nvme_lockdown" 9 "nvme_lockdown" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_lockdown \- Issue lockdown command
+.SH SYNOPSIS
+.B "int" nvme_lockdown
+.BI "(struct nvme_lockdown_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_lockdown_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_log_ana_lsp.2 b/doc/man/nvme_log_ana_lsp.2
new file mode 100644
index 0000000..a67274f
--- /dev/null
+++ b/doc/man/nvme_log_ana_lsp.2
@@ -0,0 +1,16 @@
+.TH "libnvme" 9 "enum nvme_log_ana_lsp" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_log_ana_lsp \- Asymmetric Namespace Access - Return Groups Only
+.SH SYNOPSIS
+enum nvme_log_ana_lsp {
+.br
+.BI " NVME_LOG_ANA_LSP_RGO_NAMESPACES"
+,
+.br
+.br
+.BI " NVME_LOG_ANA_LSP_RGO_GROUPS_ONLY"
+
+};
+.SH Constants
+.IP "NVME_LOG_ANA_LSP_RGO_NAMESPACES" 12
+.IP "NVME_LOG_ANA_LSP_RGO_GROUPS_ONLY" 12
diff --git a/doc/man/nvme_lookup_ctrl.2 b/doc/man/nvme_lookup_ctrl.2
new file mode 100644
index 0000000..c9942b7
--- /dev/null
+++ b/doc/man/nvme_lookup_ctrl.2
@@ -0,0 +1,35 @@
+.TH "nvme_lookup_ctrl" 9 "nvme_lookup_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_lookup_ctrl \- Lookup nvme_ctrl_t object
+.SH SYNOPSIS
+.B "nvme_ctrl_t" nvme_lookup_ctrl
+.BI "(nvme_subsystem_t s " ","
+.BI "const char *transport " ","
+.BI "const char *traddr " ","
+.BI "const char *host_traddr " ","
+.BI "const char *host_iface " ","
+.BI "const char *trsvcid " ","
+.BI "nvme_ctrl_t p " ");"
+.SH ARGUMENTS
+.IP "s" 12
+\fInvme_subsystem_t\fP object
+.IP "transport" 12
+Transport name
+.IP "traddr" 12
+Transport address
+.IP "host_traddr" 12
+Host transport address
+.IP "host_iface" 12
+Host interface name
+.IP "trsvcid" 12
+Transport service identifier
+.IP "p" 12
+Previous controller instance
+.SH "DESCRIPTION"
+Lookup a controller in \fIs\fP based on \fItransport\fP, \fItraddr\fP,
+\fIhost_traddr\fP, \fIhost_iface\fP, and \fItrsvcid\fP. \fItransport\fP must be specified,
+other fields may be required depending on the transport. A new
+object is created if none is found. If \fIp\fP is specified the lookup
+will start at \fIp\fP instead of the first controller.
+.SH "RETURN"
+Controller instance
diff --git a/doc/man/nvme_lookup_host.2 b/doc/man/nvme_lookup_host.2
new file mode 100644
index 0000000..74f9abe
--- /dev/null
+++ b/doc/man/nvme_lookup_host.2
@@ -0,0 +1,20 @@
+.TH "nvme_lookup_host" 9 "nvme_lookup_host" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_lookup_host \- Lookup nvme_host_t object
+.SH SYNOPSIS
+.B "nvme_host_t" nvme_lookup_host
+.BI "(nvme_root_t r " ","
+.BI "const char *hostnqn " ","
+.BI "const char *hostid " ");"
+.SH ARGUMENTS
+.IP "r" 12
+\fInvme_root_t\fP object
+.IP "hostnqn" 12
+Host NQN
+.IP "hostid" 12
+Host ID
+.SH "DESCRIPTION"
+Lookup a nvme_host_t object based on \fIhostnqn\fP and \fIhostid\fP
+or create one if not found.
+.SH "RETURN"
+\fInvme_host_t\fP object
diff --git a/doc/man/nvme_lookup_subsystem.2 b/doc/man/nvme_lookup_subsystem.2
new file mode 100644
index 0000000..0e780eb
--- /dev/null
+++ b/doc/man/nvme_lookup_subsystem.2
@@ -0,0 +1,20 @@
+.TH "nvme_lookup_subsystem" 9 "nvme_lookup_subsystem" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_lookup_subsystem \- Lookup nvme_subsystem_t object
+.SH SYNOPSIS
+.B "nvme_subsystem_t" nvme_lookup_subsystem
+.BI "(struct nvme_host *h " ","
+.BI "const char *name " ","
+.BI "const char *subsysnqn " ");"
+.SH ARGUMENTS
+.IP "h" 12
+\fInvme_host_t\fP object
+.IP "name" 12
+Name of the subsystem (may be NULL)
+.IP "subsysnqn" 12
+Subsystem NQN
+.SH "DESCRIPTION"
+Lookup a \fInvme_subsystem_t\fP object in \fIh\fP base on \fIname\fP (if present)
+and \fIsubsysnqn\fP or create one if not found.
+.SH "RETURN"
+nvme_subsystem_t object
diff --git a/doc/man/nvme_media_unit_config_desc.2 b/doc/man/nvme_media_unit_config_desc.2
new file mode 100644
index 0000000..02c7725
--- /dev/null
+++ b/doc/man/nvme_media_unit_config_desc.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_media_unit_config_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_media_unit_config_desc \- Media Unit Configuration Descriptor
+.SH SYNOPSIS
+struct nvme_media_unit_config_desc {
+.br
+.BI " __le16 muid;"
+.br
+.BI " __u8 rsvd2[4];"
+.br
+.BI " __le16 mudl;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "muid" 12
+Media Unit Identifier
+.IP "rsvd2" 12
+Reserved
+.IP "mudl" 12
+Media Unit Descriptor Length
diff --git a/doc/man/nvme_media_unit_stat_desc.2 b/doc/man/nvme_media_unit_stat_desc.2
new file mode 100644
index 0000000..079dba6
--- /dev/null
+++ b/doc/man/nvme_media_unit_stat_desc.2
@@ -0,0 +1,47 @@
+.TH "libnvme" 9 "struct nvme_media_unit_stat_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_media_unit_stat_desc \- Media Unit Status Descriptor
+.SH SYNOPSIS
+struct nvme_media_unit_stat_desc {
+.br
+.BI " __le16 muid;"
+.br
+.BI " __le16 domainid;"
+.br
+.BI " __le16 endgid;"
+.br
+.BI " __le16 nvmsetid;"
+.br
+.BI " __le16 cap_adj_fctr;"
+.br
+.BI " __u8 avl_spare;"
+.br
+.BI " __u8 percent_used;"
+.br
+.BI " __u8 mucs;"
+.br
+.BI " __u8 cio;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "muid" 12
+Media Unit Identifier
+.IP "domainid" 12
+Domain Identifier
+.IP "endgid" 12
+Endurance Group Identifier
+.IP "nvmsetid" 12
+NVM Set Identifier
+.IP "cap_adj_fctr" 12
+Capacity Adjustment Factor
+.IP "avl_spare" 12
+Available Spare
+.IP "percent_used" 12
+Percentage Used
+.IP "mucs" 12
+Number of Channels attached to media units
+.IP "cio" 12
+Channel Identifiers Offset
diff --git a/doc/man/nvme_media_unit_stat_log.2 b/doc/man/nvme_media_unit_stat_log.2
new file mode 100644
index 0000000..4b0318e
--- /dev/null
+++ b/doc/man/nvme_media_unit_stat_log.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "struct nvme_media_unit_stat_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_media_unit_stat_log \- Media Unit Status
+.SH SYNOPSIS
+struct nvme_media_unit_stat_log {
+.br
+.BI " __le16 nmu;"
+.br
+.BI " __le16 cchans;"
+.br
+.BI " __le16 sel_config;"
+.br
+.BI " __u8 rsvd6[10];"
+.br
+.BI " struct nvme_media_unit_stat_desc mus_desc[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nmu" 12
+Number unit status descriptor
+.IP "cchans" 12
+Number of Channels
+.IP "sel_config" 12
+Selected Configuration
+.IP "rsvd6" 12
+Reserved
+.IP "mus_desc" 12
+Media unit statistic descriptors
diff --git a/doc/man/nvme_metadata_element_desc.2 b/doc/man/nvme_metadata_element_desc.2
new file mode 100644
index 0000000..56e552f
--- /dev/null
+++ b/doc/man/nvme_metadata_element_desc.2
@@ -0,0 +1,27 @@
+.TH "libnvme" 9 "struct nvme_metadata_element_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_metadata_element_desc \- Metadata Element Descriptor
+.SH SYNOPSIS
+struct nvme_metadata_element_desc {
+.br
+.BI " __u8 type;"
+.br
+.BI " __u8 rev;"
+.br
+.BI " __u16 len;"
+.br
+.BI " __u8 val[0];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "type" 12
+Element Type (ET)
+.IP "rev" 12
+Element Revision (ER)
+.IP "len" 12
+Element Length (ELEN)
+.IP "val" 12
+Element Value (EVAL), UTF-8 string
diff --git a/doc/man/nvme_mi_admin_admin_passthru.2 b/doc/man/nvme_mi_admin_admin_passthru.2
new file mode 100644
index 0000000..9ba91d8
--- /dev/null
+++ b/doc/man/nvme_mi_admin_admin_passthru.2
@@ -0,0 +1,74 @@
+.TH "nvme_mi_admin_admin_passthru" 9 "nvme_mi_admin_admin_passthru" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_admin_passthru \- Submit an nvme admin passthrough command
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_admin_passthru
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u8 opcode " ","
+.BI "__u8 flags " ","
+.BI "__u16 rsvd " ","
+.BI "__u32 nsid " ","
+.BI "__u32 cdw2 " ","
+.BI "__u32 cdw3 " ","
+.BI "__u32 cdw10 " ","
+.BI "__u32 cdw11 " ","
+.BI "__u32 cdw12 " ","
+.BI "__u32 cdw13 " ","
+.BI "__u32 cdw14 " ","
+.BI "__u32 cdw15 " ","
+.BI "__u32 data_len " ","
+.BI "void *data " ","
+.BI "__u32 metadata_len " ","
+.BI "void *metadata " ","
+.BI "__u32 timeout_ms " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to send command to
+.IP "opcode" 12
+The nvme admin command to send
+.IP "flags" 12
+NVMe command flags (not used)
+.IP "rsvd" 12
+Reserved for future use
+.IP "nsid" 12
+Namespace identifier
+.IP "cdw2" 12
+Command dword 2
+.IP "cdw3" 12
+Command dword 3
+.IP "cdw10" 12
+Command dword 10
+.IP "cdw11" 12
+Command dword 11
+.IP "cdw12" 12
+Command dword 12
+.IP "cdw13" 12
+Command dword 13
+.IP "cdw14" 12
+Command dword 14
+.IP "cdw15" 12
+Command dword 15
+.IP "data_len" 12
+Length of the data transferred in this command in bytes
+.IP "data" 12
+Pointer to user address of the data buffer
+.IP "metadata_len" 12
+Length of metadata transferred in this command(not used)
+.IP "metadata" 12
+Pointer to user address of the metadata buffer(not used)
+.IP "timeout_ms" 12
+How long to wait for the command to complete
+.IP "result" 12
+Optional field to return the result from the CQE dword 0
+.SH "DESCRIPTION"
+Send a customized NVMe Admin command request message and get the corresponding
+response message.
+
+This interface supports no data, host to controller and controller to
+host but it doesn't support bidirectional data transfer.
+Also this interface only supports data transfer size range [0, 4096] (bytes)
+so the & data_len parameter must be less than 4097.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_format_nvm.2 b/doc/man/nvme_mi_admin_format_nvm.2
new file mode 100644
index 0000000..6340aec
--- /dev/null
+++ b/doc/man/nvme_mi_admin_format_nvm.2
@@ -0,0 +1,18 @@
+.TH "nvme_mi_admin_format_nvm" 9 "nvme_mi_admin_format_nvm" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_format_nvm \- Format NVMe namespace
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_format_nvm
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_format_nvm_args *args " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to send command to
+.IP "args" 12
+Format NVM command arguments
+.SH "DESCRIPTION"
+Perform a low-level format to set the LBA data & metadata size. May destroy
+data & metadata on the specified namespaces
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_fw_commit.2 b/doc/man/nvme_mi_admin_fw_commit.2
new file mode 100644
index 0000000..a8c69bd
--- /dev/null
+++ b/doc/man/nvme_mi_admin_fw_commit.2
@@ -0,0 +1,16 @@
+.TH "nvme_mi_admin_fw_commit" 9 "nvme_mi_admin_fw_commit" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_fw_commit \- Commit firmware using the specified action
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_fw_commit
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_fw_commit_args *args " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to send firmware data to
+.IP "args" 12
+\fIstruct nvme_fw_download_args\fP argument structure
+.SH "DESCRIPTION"
+The Firmware Commit command modifies the firmware image or Boot Partitions.
+.SH "RETURN"
+0 on success, non-zero on failure
diff --git a/doc/man/nvme_mi_admin_fw_download.2 b/doc/man/nvme_mi_admin_fw_download.2
new file mode 100644
index 0000000..c3fab1d
--- /dev/null
+++ b/doc/man/nvme_mi_admin_fw_download.2
@@ -0,0 +1,27 @@
+.TH "nvme_mi_admin_fw_download" 9 "nvme_mi_admin_fw_download" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_fw_download \- Download part or all of a firmware image to the controller
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_fw_download
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_fw_download_args *args " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to send firmware data to
+.IP "args" 12
+\fIstruct nvme_fw_download_args\fP argument structure
+.SH "DESCRIPTION"
+The Firmware Image Download command downloads all or a portion of an image
+for a future update to the controller. The Firmware Image Download command
+downloads a new image (in whole or in part) to the controller.
+
+The image may be constructed of multiple pieces that are individually
+downloaded with separate Firmware Image Download commands. Each Firmware
+Image Download command includes a Dword Offset and Number of Dwords that
+specify a dword range.
+
+The new firmware image is not activated as part of the Firmware Image
+Download command. Use the \fBnvme_mi_admin_fw_commit\fP to activate a newly
+downloaded image.
+.SH "RETURN"
+0 on success, non-zero on failure
diff --git a/doc/man/nvme_mi_admin_get_features_data.2 b/doc/man/nvme_mi_admin_get_features_data.2
new file mode 100644
index 0000000..07ecbf4
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_features_data.2
@@ -0,0 +1,30 @@
+.TH "nvme_mi_admin_get_features_data" 9 "nvme_mi_admin_get_features_data" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_features_data \- Helper function for &nvme_mi_admin_get_features()
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_features_data
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "enum nvme_features_id fid " ","
+.BI "__u32 nsid " ","
+.BI "__u32 data_len " ","
+.BI "void *data " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to send command to
+.IP "fid" 12
+Feature identifier
+.IP "nsid" 12
+Namespace ID, if applicable for \fIfid\fP
+.IP "data_len" 12
+Length of feature data, if applicable for \fIfid\fP, in bytes
+.IP "data" 12
+User address of feature data, if applicable
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "DESCRIPTION"
+Helper for optionally features that optionally return data, using the
+SEL_CURRENT selector value.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log.2 b/doc/man/nvme_mi_admin_get_log.2
new file mode 100644
index 0000000..3d63864
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log.2
@@ -0,0 +1,25 @@
+.TH "nvme_mi_admin_get_log" 9 "nvme_mi_admin_get_log" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log \- Retrieve log page data from controller
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_get_log_args *args " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "args" 12
+Get Log Page command arguments
+.SH "DESCRIPTION"
+Performs a Get Log Page Admin command as specified by \fIargs\fP. Response data
+is stored in \fIargs->data\fP, which should be a buffer of \fIargs->data_len\fP bytes.
+Resulting data length is stored in \fIargs->data_len\fP on successful
+command completion.
+
+This request may be implemented as multiple log page commands, in order
+to fit within MI message-size limits.
+
+See: \fIstruct nvme_get_log_args\fP
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_ana.2 b/doc/man/nvme_mi_admin_get_log_ana.2
new file mode 100644
index 0000000..e0e1eec
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_ana.2
@@ -0,0 +1,33 @@
+.TH "nvme_mi_admin_get_log_ana" 9 "nvme_mi_admin_get_log_ana" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_ana \- Retrieve Asymmetric Namespace Access log page
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_ana
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "enum nvme_log_ana_lsp lsp " ","
+.BI "bool rae " ","
+.BI "__u64 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "lsp" 12
+Log specific, see \fIenum nvme_get_log_ana_lsp\fP
+.IP "rae" 12
+Retain asynchronous events
+.IP "offset" 12
+Offset to the start of the log page
+.IP "len" 12
+The allocated length of the log page
+.IP "log" 12
+User address to store the ana log
+.SH "DESCRIPTION"
+This log consists of a header describing the log and descriptors containing
+the asymmetric namespace access information for ANA Groups that contain
+namespaces that are attached to the controller processing the command.
+
+See \fIstruct nvme_ana_rsp_hdr\fP for the definition of the returned structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_ana_groups.2 b/doc/man/nvme_mi_admin_get_log_ana_groups.2
new file mode 100644
index 0000000..b9cf9ba
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_ana_groups.2
@@ -0,0 +1,23 @@
+.TH "nvme_mi_admin_get_log_ana_groups" 9 "nvme_mi_admin_get_log_ana_groups" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_ana_groups \- Retrieve Asymmetric Namespace Access groups only log page
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_ana_groups
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "bool rae " ","
+.BI "__u32 len " ","
+.BI "struct nvme_ana_group_desc *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "rae" 12
+Retain asynchronous events
+.IP "len" 12
+The allocated length of the log page
+.IP "log" 12
+User address to store the ana group log
+.SH "DESCRIPTION"
+See \fIstruct nvme_ana_group_desc\fP for the definition of the returned structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_boot_partition.2 b/doc/man/nvme_mi_admin_get_log_boot_partition.2
new file mode 100644
index 0000000..adf9d7a
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_boot_partition.2
@@ -0,0 +1,25 @@
+.TH "nvme_mi_admin_get_log_boot_partition" 9 "nvme_mi_admin_get_log_boot_partition" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_boot_partition \- Retrieve Boot Partition
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_boot_partition
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "bool rae " ","
+.BI "__u8 lsp " ","
+.BI "__u32 len " ","
+.BI "struct nvme_boot_partition *part " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "rae" 12
+Retain asynchronous events
+.IP "lsp" 12
+The log specified field of LID
+.IP "len" 12
+The allocated size, minimum
+struct nvme_boot_partition
+.IP "part" 12
+User address to store the log page
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_changed_ns_list.2 b/doc/man/nvme_mi_admin_get_log_changed_ns_list.2
new file mode 100644
index 0000000..22f8301
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_changed_ns_list.2
@@ -0,0 +1,22 @@
+.TH "nvme_mi_admin_get_log_changed_ns_list" 9 "nvme_mi_admin_get_log_changed_ns_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_changed_ns_list \- Retrieve namespace changed list
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_changed_ns_list
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "bool rae " ","
+.BI "struct nvme_ns_list *ns_log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "rae" 12
+Retain asynchronous events
+.IP "ns_log" 12
+User address to store the log page
+.SH "DESCRIPTION"
+This log page describes namespaces attached to this controller that have
+changed since the last time the namespace was identified, been added, or
+deleted.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_cmd_effects.2 b/doc/man/nvme_mi_admin_get_log_cmd_effects.2
new file mode 100644
index 0000000..cb30a55
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_cmd_effects.2
@@ -0,0 +1,21 @@
+.TH "nvme_mi_admin_get_log_cmd_effects" 9 "nvme_mi_admin_get_log_cmd_effects" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_cmd_effects \- Retrieve nvme command effects log
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_cmd_effects
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "enum nvme_csi csi " ","
+.BI "struct nvme_cmd_effects_log *effects_log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "csi" 12
+Command Set Identifier
+.IP "effects_log" 12
+User address to store the effects log
+.SH "DESCRIPTION"
+This log page describes the commands that the controller supports and the
+effects of those commands on the state of the NVM subsystem.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_create_telemetry_host.2 b/doc/man/nvme_mi_admin_get_log_create_telemetry_host.2
new file mode 100644
index 0000000..cdf6cb6
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_create_telemetry_host.2
@@ -0,0 +1,15 @@
+.TH "nvme_mi_admin_get_log_create_telemetry_host" 9 "nvme_mi_admin_get_log_create_telemetry_host" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_create_telemetry_host \- Create host telemetry log
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_create_telemetry_host
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_telemetry_log *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "log" 12
+Userspace address of the log payload
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_device_self_test.2 b/doc/man/nvme_mi_admin_get_log_device_self_test.2
new file mode 100644
index 0000000..76606fa
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_device_self_test.2
@@ -0,0 +1,19 @@
+.TH "nvme_mi_admin_get_log_device_self_test" 9 "nvme_mi_admin_get_log_device_self_test" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_device_self_test \- Retrieve the device self test log
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_device_self_test
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_self_test_log *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "log" 12
+Userspace address of the log payload
+.SH "DESCRIPTION"
+The log page indicates the status of an in progress self test and the
+percent complete of that operation, and the results of the previous 20
+self-test operations.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_discovery.2 b/doc/man/nvme_mi_admin_get_log_discovery.2
new file mode 100644
index 0000000..c65ed47
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_discovery.2
@@ -0,0 +1,27 @@
+.TH "nvme_mi_admin_get_log_discovery" 9 "nvme_mi_admin_get_log_discovery" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_discovery \- Retrieve Discovery log page
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_discovery
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "bool rae " ","
+.BI "__u32 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "rae" 12
+Retain asynchronous events
+.IP "offset" 12
+Offset of this log to retrieve
+.IP "len" 12
+The allocated size for this portion of the log
+.IP "log" 12
+User address to store the discovery log
+.SH "DESCRIPTION"
+Supported only by fabrics discovery controllers, returning discovery
+records.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_endurance_group.2 b/doc/man/nvme_mi_admin_get_log_endurance_group.2
new file mode 100644
index 0000000..55917ac
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_endurance_group.2
@@ -0,0 +1,25 @@
+.TH "nvme_mi_admin_get_log_endurance_group" 9 "nvme_mi_admin_get_log_endurance_group" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_endurance_group \- Get Endurance Group log
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_endurance_group
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u16 endgid " ","
+.BI "struct nvme_endurance_group_log *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "endgid" 12
+Starting group identifier to return in the list
+.IP "log" 12
+User address to store the endurance log
+.SH "DESCRIPTION"
+This log page indicates if an Endurance Group Event has occurred for a
+particular Endurance Group. If an Endurance Group Event has occurred, the
+details of the particular event are included in the Endurance Group
+Information log page for that Endurance Group. An asynchronous event is
+generated when an entry for an Endurance Group is newly added to this log
+page.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_endurance_grp_evt.2 b/doc/man/nvme_mi_admin_get_log_endurance_grp_evt.2
new file mode 100644
index 0000000..14aa007
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_endurance_grp_evt.2
@@ -0,0 +1,24 @@
+.TH "nvme_mi_admin_get_log_endurance_grp_evt" 9 "nvme_mi_admin_get_log_endurance_grp_evt" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_endurance_grp_evt \- Retrieve Rotational Media Information
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_endurance_grp_evt
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "bool rae " ","
+.BI "__u32 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "rae" 12
+Retain asynchronous events
+.IP "offset" 12
+Offset to the start of the log page
+.IP "len" 12
+The allocated length of the log page
+.IP "log" 12
+User address to store the log page
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_error.2 b/doc/man/nvme_mi_admin_get_log_error.2
new file mode 100644
index 0000000..5bb2983
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_error.2
@@ -0,0 +1,25 @@
+.TH "nvme_mi_admin_get_log_error" 9 "nvme_mi_admin_get_log_error" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_error \- Retrieve nvme error log
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_error
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "unsigned int nr_entries " ","
+.BI "bool rae " ","
+.BI "struct nvme_error_log_page *err_log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "nr_entries" 12
+Number of error log entries allocated
+.IP "rae" 12
+Retain asynchronous events
+.IP "err_log" 12
+Array of error logs of size 'entries'
+.SH "DESCRIPTION"
+This log page describes extended error information for a command that
+completed with error, or may report an error that is not specific to a
+particular command.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_fid_supported_effects.2 b/doc/man/nvme_mi_admin_get_log_fid_supported_effects.2
new file mode 100644
index 0000000..d090aed
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_fid_supported_effects.2
@@ -0,0 +1,18 @@
+.TH "nvme_mi_admin_get_log_fid_supported_effects" 9 "nvme_mi_admin_get_log_fid_supported_effects" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_fid_supported_effects \- Retrieve Feature Identifiers Supported and Effects
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_fid_supported_effects
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "bool rae " ","
+.BI "struct nvme_fid_supported_effects_log *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "rae" 12
+Retain asynchronous events
+.IP "log" 12
+FID Supported and Effects data structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_fw_slot.2 b/doc/man/nvme_mi_admin_get_log_fw_slot.2
new file mode 100644
index 0000000..098d7dc
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_fw_slot.2
@@ -0,0 +1,22 @@
+.TH "nvme_mi_admin_get_log_fw_slot" 9 "nvme_mi_admin_get_log_fw_slot" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_fw_slot \- Retrieves the controller firmware log
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_fw_slot
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "bool rae " ","
+.BI "struct nvme_firmware_slot *fw_log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "rae" 12
+Retain asynchronous events
+.IP "fw_log" 12
+User address to store the log page
+.SH "DESCRIPTION"
+This log page describes the firmware revision stored in each firmware slot
+supported. The firmware revision is indicated as an ASCII string. The log
+page also indicates the active slot number.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_lba_status.2 b/doc/man/nvme_mi_admin_get_log_lba_status.2
new file mode 100644
index 0000000..a140e27
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_lba_status.2
@@ -0,0 +1,24 @@
+.TH "nvme_mi_admin_get_log_lba_status" 9 "nvme_mi_admin_get_log_lba_status" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_lba_status \- Retrieve LBA Status
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_lba_status
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "bool rae " ","
+.BI "__u64 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "rae" 12
+Retain asynchronous events
+.IP "offset" 12
+Offset to the start of the log page
+.IP "len" 12
+The allocated length of the log page
+.IP "log" 12
+User address to store the log page
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_media_unit_stat.2 b/doc/man/nvme_mi_admin_get_log_media_unit_stat.2
new file mode 100644
index 0000000..a2516b8
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_media_unit_stat.2
@@ -0,0 +1,18 @@
+.TH "nvme_mi_admin_get_log_media_unit_stat" 9 "nvme_mi_admin_get_log_media_unit_stat" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_media_unit_stat \- Retrieve Media Unit Status
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_media_unit_stat
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u16 domid " ","
+.BI "struct nvme_media_unit_stat_log *mus " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "domid" 12
+Domain Identifier selection, if supported
+.IP "mus" 12
+User address to store the Media Unit statistics log
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_mi_cmd_supported_effects.2 b/doc/man/nvme_mi_admin_get_log_mi_cmd_supported_effects.2
new file mode 100644
index 0000000..0412b25
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_mi_cmd_supported_effects.2
@@ -0,0 +1,18 @@
+.TH "nvme_mi_admin_get_log_mi_cmd_supported_effects" 9 "nvme_mi_admin_get_log_mi_cmd_supported_effects" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_mi_cmd_supported_effects \- displays the MI Commands Supported by the controller
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_mi_cmd_supported_effects
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "bool rae " ","
+.BI "struct nvme_mi_cmd_supported_effects_log *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "rae" 12
+Retain asynchronous events
+.IP "log" 12
+MI Command Supported and Effects data structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_persistent_event.2 b/doc/man/nvme_mi_admin_get_log_persistent_event.2
new file mode 100644
index 0000000..39a43a3
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_persistent_event.2
@@ -0,0 +1,21 @@
+.TH "nvme_mi_admin_get_log_persistent_event" 9 "nvme_mi_admin_get_log_persistent_event" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_persistent_event \- Retrieve Persistent Event Log
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_persistent_event
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "enum nvme_pevent_log_action action " ","
+.BI "__u32 size " ","
+.BI "void *pevent_log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "action" 12
+Action the controller should take during processing this command
+.IP "size" 12
+Size of \fIpevent_log\fP
+.IP "pevent_log" 12
+User address to store the persistent event log
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_predictable_lat_event.2 b/doc/man/nvme_mi_admin_get_log_predictable_lat_event.2
new file mode 100644
index 0000000..e4272b1
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_predictable_lat_event.2
@@ -0,0 +1,24 @@
+.TH "nvme_mi_admin_get_log_predictable_lat_event" 9 "nvme_mi_admin_get_log_predictable_lat_event" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_predictable_lat_event \- Retrieve Predictable Latency Event Aggregate Log Page
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_predictable_lat_event
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "bool rae " ","
+.BI "__u32 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "rae" 12
+Retain asynchronous events
+.IP "offset" 12
+Offset into the predictable latency event
+.IP "len" 12
+Length of provided user buffer to hold the log data in bytes
+.IP "log" 12
+User address for log page data
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_predictable_lat_nvmset.2 b/doc/man/nvme_mi_admin_get_log_predictable_lat_nvmset.2
new file mode 100644
index 0000000..b827805
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_predictable_lat_nvmset.2
@@ -0,0 +1,18 @@
+.TH "nvme_mi_admin_get_log_predictable_lat_nvmset" 9 "nvme_mi_admin_get_log_predictable_lat_nvmset" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_predictable_lat_nvmset \- Predictable Latency Per NVM Set
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_predictable_lat_nvmset
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u16 nvmsetid " ","
+.BI "struct nvme_nvmset_predictable_lat_log *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "nvmsetid" 12
+NVM set id
+.IP "log" 12
+User address to store the predictable latency log
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_reservation.2 b/doc/man/nvme_mi_admin_get_log_reservation.2
new file mode 100644
index 0000000..7f27ac4
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_reservation.2
@@ -0,0 +1,18 @@
+.TH "nvme_mi_admin_get_log_reservation" 9 "nvme_mi_admin_get_log_reservation" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_reservation \- Retrieve Reservation Notification
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_reservation
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "bool rae " ","
+.BI "struct nvme_resv_notification_log *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "rae" 12
+Retain asynchronous events
+.IP "log" 12
+User address to store the reservation log
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_sanitize.2 b/doc/man/nvme_mi_admin_get_log_sanitize.2
new file mode 100644
index 0000000..2eb8ca1
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_sanitize.2
@@ -0,0 +1,21 @@
+.TH "nvme_mi_admin_get_log_sanitize" 9 "nvme_mi_admin_get_log_sanitize" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_sanitize \- Retrieve Sanitize Status
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_sanitize
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "bool rae " ","
+.BI "struct nvme_sanitize_log_page *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "rae" 12
+Retain asynchronous events
+.IP "log" 12
+User address to store the sanitize log
+.SH "DESCRIPTION"
+The Sanitize Status log page reports sanitize operation time estimates and
+information about the most recent sanitize operation.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_simple.2 b/doc/man/nvme_mi_admin_get_log_simple.2
new file mode 100644
index 0000000..1277095
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_simple.2
@@ -0,0 +1,24 @@
+.TH "nvme_mi_admin_get_log_simple" 9 "nvme_mi_admin_get_log_simple" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_simple \- Helper for Get Log Page functions with no NSID or RAE requirements
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_simple
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "enum nvme_cmd_get_log_lid lid " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "lid" 12
+Log identifier
+.IP "len" 12
+length of log buffer
+.IP "log" 12
+pointer for resulting log data
+.SH "DESCRIPTION"
+Performs a Get Log Page Admin command for a specific log ID \fIlid\fP, using
+NVME_NSID_ALL for the namespace identifier, and rae set to false.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_smart.2 b/doc/man/nvme_mi_admin_get_log_smart.2
new file mode 100644
index 0000000..742bf24
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_smart.2
@@ -0,0 +1,28 @@
+.TH "nvme_mi_admin_get_log_smart" 9 "nvme_mi_admin_get_log_smart" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_smart \- Retrieve nvme smart log
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_smart
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u32 nsid " ","
+.BI "bool rae " ","
+.BI "struct nvme_smart_log *smart_log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "nsid" 12
+Optional namespace identifier
+.IP "rae" 12
+Retain asynchronous events
+.IP "smart_log" 12
+User address to store the smart log
+.SH "DESCRIPTION"
+This log page provides SMART and general health information. The information
+provided is over the life of the controller and is retained across power
+cycles. To request the controller log page, the namespace identifier
+specified is FFFFFFFFh. The controller may also support requesting the log
+page on a per namespace basis, as indicated by bit 0 of the LPA field in the
+Identify Controller data structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_support_cap_config_list.2 b/doc/man/nvme_mi_admin_get_log_support_cap_config_list.2
new file mode 100644
index 0000000..b4d1df5
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_support_cap_config_list.2
@@ -0,0 +1,18 @@
+.TH "nvme_mi_admin_get_log_support_cap_config_list" 9 "nvme_mi_admin_get_log_support_cap_config_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_support_cap_config_list \- Retrieve Supported Capacity Configuration List
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_support_cap_config_list
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u16 domid " ","
+.BI "struct nvme_supported_cap_config_list_log *cap " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "domid" 12
+Domain Identifier selection, if supported
+.IP "cap" 12
+User address to store supported capabilities config list
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_supported_log_pages.2 b/doc/man/nvme_mi_admin_get_log_supported_log_pages.2
new file mode 100644
index 0000000..7958459
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_supported_log_pages.2
@@ -0,0 +1,18 @@
+.TH "nvme_mi_admin_get_log_supported_log_pages" 9 "nvme_mi_admin_get_log_supported_log_pages" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_supported_log_pages \- Retrieve nmve supported log pages
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_supported_log_pages
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "bool rae " ","
+.BI "struct nvme_supported_log_pages *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "rae" 12
+Retain asynchronous events
+.IP "log" 12
+Array of LID supported and Effects data structures
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_telemetry_ctrl.2 b/doc/man/nvme_mi_admin_get_log_telemetry_ctrl.2
new file mode 100644
index 0000000..623c5fb
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_telemetry_ctrl.2
@@ -0,0 +1,27 @@
+.TH "nvme_mi_admin_get_log_telemetry_ctrl" 9 "nvme_mi_admin_get_log_telemetry_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_telemetry_ctrl \- Get Telemetry Controller-Initiated log page
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_telemetry_ctrl
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "bool rae " ","
+.BI "__u64 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "rae" 12
+Retain asynchronous events
+.IP "offset" 12
+Offset into the telemetry data
+.IP "len" 12
+Length of provided user buffer to hold the log data in bytes
+.IP "log" 12
+User address for log page data
+.SH "DESCRIPTION"
+Retrieves the Telemetry Controller-Initiated log page at the requested offset
+using the previously existing capture.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_telemetry_host.2 b/doc/man/nvme_mi_admin_get_log_telemetry_host.2
new file mode 100644
index 0000000..9a96a4b
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_telemetry_host.2
@@ -0,0 +1,24 @@
+.TH "nvme_mi_admin_get_log_telemetry_host" 9 "nvme_mi_admin_get_log_telemetry_host" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_telemetry_host \- Get Telemetry Host-Initiated log page
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_telemetry_host
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u64 offset " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "offset" 12
+Offset into the telemetry data
+.IP "len" 12
+Length of provided user buffer to hold the log data in bytes
+.IP "log" 12
+User address for log page data
+.SH "DESCRIPTION"
+Retrieves the Telemetry Host-Initiated log page at the requested offset
+using the previously existing capture.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_log_zns_changed_zones.2 b/doc/man/nvme_mi_admin_get_log_zns_changed_zones.2
new file mode 100644
index 0000000..b2e3614
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_zns_changed_zones.2
@@ -0,0 +1,23 @@
+.TH "nvme_mi_admin_get_log_zns_changed_zones" 9 "nvme_mi_admin_get_log_zns_changed_zones" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_zns_changed_zones \- Retrieve list of zones that have changed
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_zns_changed_zones
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u32 nsid " ","
+.BI "bool rae " ","
+.BI "struct nvme_zns_changed_zone_log *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "nsid" 12
+Namespace ID
+.IP "rae" 12
+Retain asynchronous events
+.IP "log" 12
+User address to store the changed zone log
+.SH "DESCRIPTION"
+The list of zones that have changed state due to an exceptional event.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_get_nsid_log.2 b/doc/man/nvme_mi_admin_get_nsid_log.2
new file mode 100644
index 0000000..8126e5f
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_nsid_log.2
@@ -0,0 +1,32 @@
+.TH "nvme_mi_admin_get_nsid_log" 9 "nvme_mi_admin_get_nsid_log" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_nsid_log \- Helper for Get Log Page functions
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_nsid_log
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "bool rae " ","
+.BI "enum nvme_cmd_get_log_lid lid " ","
+.BI "__u32 nsid " ","
+.BI "__u32 len " ","
+.BI "void *log " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "rae" 12
+Retain Asynchronous Events
+.IP "lid" 12
+Log identifier
+.IP "nsid" 12
+Namespace ID
+.IP "len" 12
+length of log buffer
+.IP "log" 12
+pointer for resulting log data
+.SH "DESCRIPTION"
+Performs a Get Log Page Admin command for a specific log ID \fIlid\fP and
+namespace ID \fInsid\fP. Log data is expected to be \fIlen\fP bytes, and is stored
+in \fIlog\fP on success. The \fIrae\fP flag is passed as-is to the Get Log Page
+command, and is specific to the Log Page requested.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_identify.2 b/doc/man/nvme_mi_admin_identify.2
new file mode 100644
index 0000000..c741daa
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify.2
@@ -0,0 +1,24 @@
+.TH "nvme_mi_admin_identify" 9 "nvme_mi_admin_identify" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify \- Perform an Admin identify command.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_identify_args *args " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "args" 12
+Identify command arguments
+.SH "DESCRIPTION"
+Perform an Identify command, using the Identify command parameters in \fIargs\fP.
+Stores the identify data in ->data, and (if set) the result from cdw0
+into args->result.
+
+Will return an error if the length of the response data (from the
+controller) is not a full \fINVME_IDENTIFY_DATA_SIZE\fP.
+
+See: \fIstruct nvme_identify_args\fP
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_identify_active_ns_list.2 b/doc/man/nvme_mi_admin_identify_active_ns_list.2
new file mode 100644
index 0000000..4a374ac
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_active_ns_list.2
@@ -0,0 +1,28 @@
+.TH "nvme_mi_admin_identify_active_ns_list" 9 "nvme_mi_admin_identify_active_ns_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_active_ns_list \- Perform an Admin identify for an active namespace list
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_active_ns_list
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_ns_list *list " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "nsid" 12
+Namespace ID to specify list start
+.IP "list" 12
+List data to populate
+.SH "DESCRIPTION"
+Perform an Identify command, for the active namespace list starting with
+IDs greater than or equal to \fInsid\fP. Specify \fINVME_NSID_NONE\fP for the start
+of the list.
+
+Will return an error if the length of the response data (from the
+controller) is not a full \fINVME_IDENTIFY_DATA_SIZE\fP, so \fIlist\fP will be
+be fully populated on success.
+
+See: \fIstruct nvme_ns_list\fP
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_identify_allocated_ns.2 b/doc/man/nvme_mi_admin_identify_allocated_ns.2
new file mode 100644
index 0000000..4fd9023
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_allocated_ns.2
@@ -0,0 +1,21 @@
+.TH "nvme_mi_admin_identify_allocated_ns" 9 "nvme_mi_admin_identify_allocated_ns" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_allocated_ns \- Perform an Admin identify command for an allocated namespace
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_allocated_ns
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_id_ns *ns " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "nsid" 12
+namespace ID
+.IP "ns" 12
+Namespace identification to populate
+.SH "DESCRIPTION"
+Perform an Identify (namespace) command, setting the namespace id data
+in \fIns\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_identify_allocated_ns_list.2 b/doc/man/nvme_mi_admin_identify_allocated_ns_list.2
new file mode 100644
index 0000000..fd42cb2
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_allocated_ns_list.2
@@ -0,0 +1,28 @@
+.TH "nvme_mi_admin_identify_allocated_ns_list" 9 "nvme_mi_admin_identify_allocated_ns_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_allocated_ns_list \- Perform an Admin identify for an allocated namespace list
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_allocated_ns_list
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_ns_list *list " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "nsid" 12
+Namespace ID to specify list start
+.IP "list" 12
+List data to populate
+.SH "DESCRIPTION"
+Perform an Identify command, for the allocated namespace list starting with
+IDs greater than or equal to \fInsid\fP. Specify \fINVME_NSID_NONE\fP for the start
+of the list.
+
+Will return an error if the length of the response data (from the
+controller) is not a full \fINVME_IDENTIFY_DATA_SIZE\fP, so \fIlist\fP will be
+be fully populated on success.
+
+See: \fIstruct nvme_ns_list\fP
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_identify_cns_nsid.2 b/doc/man/nvme_mi_admin_identify_cns_nsid.2
new file mode 100644
index 0000000..49c9c2b
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_cns_nsid.2
@@ -0,0 +1,30 @@
+.TH "nvme_mi_admin_identify_cns_nsid" 9 "nvme_mi_admin_identify_cns_nsid" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_cns_nsid \- Perform an Admin identify command using specific CNS/NSID parameters.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_cns_nsid
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "enum nvme_identify_cns cns " ","
+.BI "__u32 nsid " ","
+.BI "void *data " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "cns" 12
+Controller or Namespace Structure, specifying identified object
+.IP "nsid" 12
+namespace ID
+.IP "data" 12
+buffer for identify data response
+.SH "DESCRIPTION"
+Perform an Identify command, using the CNS specifier \fIcns\fP, and the
+namespace ID \fInsid\fP if required by the CNS type.
+
+Stores the identify data in \fIdata\fP, which is expected to be a buffer of
+\fINVME_IDENTIFY_DATA_SIZE\fP bytes.
+
+Will return an error if the length of the response data (from the
+controller) is not a full \fINVME_IDENTIFY_DATA_SIZE\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_identify_ctrl.2 b/doc/man/nvme_mi_admin_identify_ctrl.2
new file mode 100644
index 0000000..a268d0b
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_ctrl.2
@@ -0,0 +1,24 @@
+.TH "nvme_mi_admin_identify_ctrl" 9 "nvme_mi_admin_identify_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_ctrl \- Perform an Admin identify for a controller
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_ctrl
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_id_ctrl *id " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "id" 12
+Controller identify data to populate
+.SH "DESCRIPTION"
+Perform an Identify command, for the controller specified by \fIctrl\fP,
+writing identify data to \fIid\fP.
+
+Will return an error if the length of the response data (from the
+controller) is not a full \fINVME_IDENTIFY_DATA_SIZE\fP, so \fIid\fP will be
+fully populated on success.
+
+See: \fIstruct nvme_id_ctrl\fP
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_identify_ctrl_list.2 b/doc/man/nvme_mi_admin_identify_ctrl_list.2
new file mode 100644
index 0000000..c407f3b
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_ctrl_list.2
@@ -0,0 +1,27 @@
+.TH "nvme_mi_admin_identify_ctrl_list" 9 "nvme_mi_admin_identify_ctrl_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_ctrl_list \- Perform an Admin identify for a controller list.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_ctrl_list
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u16 cntid " ","
+.BI "struct nvme_ctrl_list *list " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "cntid" 12
+Controller ID to specify list start
+.IP "list" 12
+List data to populate
+.SH "DESCRIPTION"
+Perform an Identify command, for the controller list starting with
+IDs greater than or equal to \fIcntid\fP.
+
+Will return an error if the length of the response data (from the
+controller) is not a full \fINVME_IDENTIFY_DATA_SIZE\fP, so \fIid\fP will be
+fully populated on success.
+
+See: \fIstruct nvme_ctrl_list\fP
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_identify_ns.2 b/doc/man/nvme_mi_admin_identify_ns.2
new file mode 100644
index 0000000..5333f89
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_ns.2
@@ -0,0 +1,21 @@
+.TH "nvme_mi_admin_identify_ns" 9 "nvme_mi_admin_identify_ns" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_ns \- Perform an Admin identify command for a namespace
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_ns
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_id_ns *ns " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "nsid" 12
+namespace ID
+.IP "ns" 12
+Namespace identification to populate
+.SH "DESCRIPTION"
+Perform an Identify (namespace) command, setting the namespace id data
+in \fIns\fP. The namespace is expected to active and allocated.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_identify_ns_descs.2 b/doc/man/nvme_mi_admin_identify_ns_descs.2
new file mode 100644
index 0000000..919f008
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_ns_descs.2
@@ -0,0 +1,21 @@
+.TH "nvme_mi_admin_identify_ns_descs" 9 "nvme_mi_admin_identify_ns_descs" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_ns_descs \- Perform an Admin identify Namespace Identification Descriptor list command for a namespace
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_ns_descs
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_ns_id_desc *descs " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "nsid" 12
+Namespace ID
+.IP "descs" 12
+Namespace Identification Descriptor list to populate
+.SH "DESCRIPTION"
+Perform an Identify namespace identification description list command,
+setting the namespace identification description list in \fIdescs\fP
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_identify_nsid_ctrl_list.2 b/doc/man/nvme_mi_admin_identify_nsid_ctrl_list.2
new file mode 100644
index 0000000..981f7a6
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_nsid_ctrl_list.2
@@ -0,0 +1,30 @@
+.TH "nvme_mi_admin_identify_nsid_ctrl_list" 9 "nvme_mi_admin_identify_nsid_ctrl_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_nsid_ctrl_list \- Perform an Admin identify for a controller list with specific namespace ID
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_nsid_ctrl_list
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u32 nsid " ","
+.BI "__u16 cntid " ","
+.BI "struct nvme_ctrl_list *list " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "nsid" 12
+Namespace identifier
+.IP "cntid" 12
+Controller ID to specify list start
+.IP "list" 12
+List data to populate
+.SH "DESCRIPTION"
+Perform an Identify command, for the controller list for \fInsid\fP, starting
+with IDs greater than or equal to \fIcntid\fP.
+
+Will return an error if the length of the response data (from the
+controller) is not a full \fINVME_IDENTIFY_DATA_SIZE\fP, so \fIid\fP will be
+fully populated on success.
+
+See: \fIstruct nvme_ctrl_list\fP
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_identify_partial.2 b/doc/man/nvme_mi_admin_identify_partial.2
new file mode 100644
index 0000000..027c4f6
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_partial.2
@@ -0,0 +1,37 @@
+.TH "nvme_mi_admin_identify_partial" 9 "nvme_mi_admin_identify_partial" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_partial \- Perform an Admin identify command, and retrieve partial response data.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_partial
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_identify_args *args " ","
+.BI "off_t offset " ","
+.BI "size_t size " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "args" 12
+Identify command arguments
+.IP "offset" 12
+offset of identify data to retrieve from response
+.IP "size" 12
+size of identify data to return
+.SH "DESCRIPTION"
+Perform an Identify command, using the Identify command parameters in \fIargs\fP.
+The \fIoffset\fP and \fIsize\fP arguments allow the caller to retrieve part of
+the identify response. See NVMe-MI section 6.2 for the semantics (and some
+handy diagrams) of the offset & size parameters.
+
+Will return an error if the length of the response data (from the controller)
+did not match \fIsize\fP.
+
+Unless you're performing a vendor-unique identify command, You'll probably
+want to use one of the identify helpers (nvme_mi_admin_identify,
+nvme_mi_admin_identify_cns_nsid, or nvme_mi_admin_identify_<type>) instead
+of this. If the type of your identify command is standardized but not
+yet supported by libnvme-mi, please contact the maintainers.
+
+See: \fIstruct nvme_identify_args\fP
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_identify_primary_ctrl.2 b/doc/man/nvme_mi_admin_identify_primary_ctrl.2
new file mode 100644
index 0000000..13eec74
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_primary_ctrl.2
@@ -0,0 +1,26 @@
+.TH "nvme_mi_admin_identify_primary_ctrl" 9 "nvme_mi_admin_identify_primary_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_primary_ctrl \- Perform an Admin identify for primary controller capabilities data structure.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_primary_ctrl
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u16 cntid " ","
+.BI "struct nvme_primary_ctrl_cap *cap " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "cntid" 12
+Controller ID to specify
+.IP "cap" 12
+Primary Controller Capabilities data structure to populate
+.SH "DESCRIPTION"
+Perform an Identify command to get the Primary Controller Capabilities data
+for the controller specified by \fIcntid\fP
+
+Will return an error if the length of the response data (from the
+controller) is not a full \fINVME_IDENTIFY_DATA_SIZE\fP, so \fIcap\fP will be
+be fully populated on success.
+
+See: \fIstruct nvme_primary_ctrl_cap\fP
+.SH "RETURN"
+0 on success, non-zero on failure
diff --git a/doc/man/nvme_mi_admin_identify_secondary_ctrl_list.2 b/doc/man/nvme_mi_admin_identify_secondary_ctrl_list.2
new file mode 100644
index 0000000..2339d4d
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_secondary_ctrl_list.2
@@ -0,0 +1,30 @@
+.TH "nvme_mi_admin_identify_secondary_ctrl_list" 9 "nvme_mi_admin_identify_secondary_ctrl_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_secondary_ctrl_list \- Perform an Admin identify for a secondary controller list.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_secondary_ctrl_list
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u32 nsid " ","
+.BI "__u16 cntid " ","
+.BI "struct nvme_secondary_ctrl_list *list " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "nsid" 12
+Namespace ID to specify list start
+.IP "cntid" 12
+Controller ID to specify list start
+.IP "list" 12
+List data to populate
+.SH "DESCRIPTION"
+Perform an Identify command, for the secondary controllers associated with
+the current primary controller. Only entries with IDs greater than or
+equal to \fIcntid\fP are returned.
+
+Will return an error if the length of the response data (from the
+controller) is not a full \fINVME_IDENTIFY_DATA_SIZE\fP, so \fIlist\fP will be
+be fully populated on success.
+
+See: \fIstruct nvme_secondary_ctrl_list\fP
+.SH "RETURN"
+0 on success, non-zero on failure
diff --git a/doc/man/nvme_mi_admin_ns_attach.2 b/doc/man/nvme_mi_admin_ns_attach.2
new file mode 100644
index 0000000..94d7c8e
--- /dev/null
+++ b/doc/man/nvme_mi_admin_ns_attach.2
@@ -0,0 +1,15 @@
+.TH "nvme_mi_admin_ns_attach" 9 "nvme_mi_admin_ns_attach" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_ns_attach \- Attach or detach namespace to controller(s)
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_ns_attach
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_ns_attach_args *args " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to send command to
+.IP "args" 12
+Namespace Attach command arguments
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_ns_attach_ctrls.2 b/doc/man/nvme_mi_admin_ns_attach_ctrls.2
new file mode 100644
index 0000000..ebb64a6
--- /dev/null
+++ b/doc/man/nvme_mi_admin_ns_attach_ctrls.2
@@ -0,0 +1,18 @@
+.TH "nvme_mi_admin_ns_attach_ctrls" 9 "nvme_mi_admin_ns_attach_ctrls" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_ns_attach_ctrls \- Attach namespace to controllers
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_ns_attach_ctrls
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_ctrl_list *ctrlist " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to send command to
+.IP "nsid" 12
+Namespace ID to attach
+.IP "ctrlist" 12
+Controller list to modify attachment state of nsid
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_ns_detach_ctrls.2 b/doc/man/nvme_mi_admin_ns_detach_ctrls.2
new file mode 100644
index 0000000..799c39a
--- /dev/null
+++ b/doc/man/nvme_mi_admin_ns_detach_ctrls.2
@@ -0,0 +1,18 @@
+.TH "nvme_mi_admin_ns_detach_ctrls" 9 "nvme_mi_admin_ns_detach_ctrls" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_ns_detach_ctrls \- Detach namespace from controllers
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_ns_detach_ctrls
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_ctrl_list *ctrlist " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to send command to
+.IP "nsid" 12
+Namespace ID to detach
+.IP "ctrlist" 12
+Controller list to modify attachment state of nsid
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_req_hdr.2 b/doc/man/nvme_mi_admin_req_hdr.2
new file mode 100644
index 0000000..33b22de
--- /dev/null
+++ b/doc/man/nvme_mi_admin_req_hdr.2
@@ -0,0 +1,72 @@
+.TH "libnvme" 9 "struct nvme_mi_admin_req_hdr" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_admin_req_hdr \- Admin command request header.
+.SH SYNOPSIS
+struct nvme_mi_admin_req_hdr {
+.br
+.BI " struct nvme_mi_msg_hdr hdr;"
+.br
+.BI " __u8 opcode;"
+.br
+.BI " __u8 flags;"
+.br
+.BI " __le16 ctrl_id;"
+.br
+.BI " __le32 cdw1, cdw2, cdw3, cdw4, cdw5;"
+.br
+.BI " __le32 doff;"
+.br
+.BI " __le32 dlen;"
+.br
+.BI " __le32 rsvd0, rsvd1;"
+.br
+.BI " __le32 cdw10, cdw11, cdw12, cdw13, cdw14, cdw15;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "hdr" 12
+Generic MI message header
+.IP "opcode" 12
+Admin command opcode (using enum nvme_admin_opcode)
+.IP "flags" 12
+Command Flags, indicating dlen and doff validity; Only defined in
+NVMe-MI version 1.1, no fields defined in 1.2 (where the dlen/doff
+are always considered valid).
+.IP "ctrl_id" 12
+Controller ID target of command
+.IP "cdw1" 12
+Submission Queue Entry doubleword 1
+.IP "cdw2" 12
+Submission Queue Entry doubleword 2
+.IP "cdw3" 12
+Submission Queue Entry doubleword 3
+.IP "cdw4" 12
+Submission Queue Entry doubleword 4
+.IP "cdw5" 12
+Submission Queue Entry doubleword 5
+.IP "doff" 12
+Offset of data to return from command
+.IP "dlen" 12
+Length of sent/returned data
+.IP "rsvd0" 12
+Reserved
+.IP "rsvd1" 12
+Reserved
+.IP "cdw10" 12
+Submission Queue Entry doubleword 10
+.IP "cdw11" 12
+Submission Queue Entry doubleword 11
+.IP "cdw12" 12
+Submission Queue Entry doubleword 12
+.IP "cdw13" 12
+Submission Queue Entry doubleword 13
+.IP "cdw14" 12
+Submission Queue Entry doubleword 14
+.IP "cdw15" 12
+Submission Queue Entry doubleword 15
+.SH "Description"
+Wire format for Admin command message headers, defined in section 6 of
+NVMe-MI.
diff --git a/doc/man/nvme_mi_admin_resp_hdr.2 b/doc/man/nvme_mi_admin_resp_hdr.2
new file mode 100644
index 0000000..1818c60
--- /dev/null
+++ b/doc/man/nvme_mi_admin_resp_hdr.2
@@ -0,0 +1,34 @@
+.TH "libnvme" 9 "struct nvme_mi_admin_resp_hdr" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_admin_resp_hdr \- Admin command response header.
+.SH SYNOPSIS
+struct nvme_mi_admin_resp_hdr {
+.br
+.BI " struct nvme_mi_msg_hdr hdr;"
+.br
+.BI " __u8 status;"
+.br
+.BI " __u8 rsvd0[3];"
+.br
+.BI " __le32 cdw0, cdw1, cdw3;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "hdr" 12
+Generic MI message header
+.IP "status" 12
+Generic response code, non-zero on failure
+.IP "rsvd0" 12
+Reserved
+.IP "cdw0" 12
+Completion Queue Entry doubleword 0
+.IP "cdw1" 12
+Completion Queue Entry doubleword 1
+.IP "cdw3" 12
+Completion Queue Entry doubleword 3
+.SH "Description"
+This is the generic response format with the three doublewords of completion
+queue data, plus optional response data.
diff --git a/doc/man/nvme_mi_admin_sanitize_nvm.2 b/doc/man/nvme_mi_admin_sanitize_nvm.2
new file mode 100644
index 0000000..c27abd2
--- /dev/null
+++ b/doc/man/nvme_mi_admin_sanitize_nvm.2
@@ -0,0 +1,25 @@
+.TH "nvme_mi_admin_sanitize_nvm" 9 "nvme_mi_admin_sanitize_nvm" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_sanitize_nvm \- Start a subsystem Sanitize operation
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_sanitize_nvm
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_sanitize_nvm_args *args " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to send command to
+.IP "args" 12
+Sanitize command arguments
+.SH "DESCRIPTION"
+A sanitize operation alters all user data in the NVM subsystem such that
+recovery of any previous user data from any cache, the non-volatile media,
+or any Controller Memory Buffer is not possible.
+
+The Sanitize command starts a sanitize operation or to recover from a
+previously failed sanitize operation. The sanitize operation types that may
+be supported are Block Erase, Crypto Erase, and Overwrite. All sanitize
+operations are processed in the background, i.e., completion of the sanitize
+command does not indicate completion of the sanitize operation.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_security_recv.2 b/doc/man/nvme_mi_admin_security_recv.2
new file mode 100644
index 0000000..b101ab0
--- /dev/null
+++ b/doc/man/nvme_mi_admin_security_recv.2
@@ -0,0 +1,25 @@
+.TH "nvme_mi_admin_security_recv" 9 "nvme_mi_admin_security_recv" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_security_recv \- Perform a Security Receive command on a controller.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_security_recv
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_security_receive_args *args " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to send command to
+.IP "args" 12
+Security Receive command arguments
+.SH "DESCRIPTION"
+Performs a Security Receive Admin command as specified by \fIargs\fP. Response
+data is stored in \fIargs->data\fP, which should be a buffer of \fIargs->data_len\fP
+bytes. Resulting data length is stored in \fIargs->data_len\fP on successful
+command completion.
+
+Security Receive data length should not be greater than 4096 bytes to
+comply with specification limits.
+
+See: \fIstruct nvme_get_log_args\fP
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_security_send.2 b/doc/man/nvme_mi_admin_security_send.2
new file mode 100644
index 0000000..12c34b3
--- /dev/null
+++ b/doc/man/nvme_mi_admin_security_send.2
@@ -0,0 +1,25 @@
+.TH "nvme_mi_admin_security_send" 9 "nvme_mi_admin_security_send" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_security_send \- Perform a Security Send command on a controller.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_security_send
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_security_send_args *args " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to send command to
+.IP "args" 12
+Security Send command arguments
+.SH "DESCRIPTION"
+Performs a Security Send Admin command as specified by \fIargs\fP. Response data
+is stored in \fIargs->data\fP, which should be a buffer of \fIargs->data_len\fP bytes.
+Resulting data length is stored in \fIargs->data_len\fP on successful
+command completion.
+
+Security Send data length should not be greater than 4096 bytes to
+comply with specification limits.
+
+See: \fIstruct nvme_get_log_args\fP
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_mi_admin_xfer.2 b/doc/man/nvme_mi_admin_xfer.2
new file mode 100644
index 0000000..9685540
--- /dev/null
+++ b/doc/man/nvme_mi_admin_xfer.2
@@ -0,0 +1,42 @@
+.TH "nvme_mi_admin_xfer" 9 "nvme_mi_admin_xfer" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_xfer \- Raw admin transfer interface.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_xfer
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_mi_admin_req_hdr *admin_req " ","
+.BI "size_t req_data_size " ","
+.BI "struct nvme_mi_admin_resp_hdr *admin_resp " ","
+.BI "off_t resp_data_offset " ","
+.BI "size_t *resp_data_size " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+controller to send the admin command to
+.IP "admin_req" 12
+request data
+.IP "req_data_size" 12
+size of request data payload
+.IP "admin_resp" 12
+buffer for response data
+.IP "resp_data_offset" 12
+offset into request data to retrieve from controller
+.IP "resp_data_size" 12
+size of response data buffer, updated to received size
+.SH "DESCRIPTION"
+Performs an arbitrary NVMe Admin command, using the provided request data,
+in \fIadmin_req\fP. The size of the request data *payload* is specified in
+\fIreq_data_size\fP - this does not include the standard header length (so a
+header-only request would have a size of 0).
+
+On success, response data is stored in \fIadmin_resp\fP, which has an optional
+appended payload buffer of \fIresp_data_size\fP bytes. The actual payload
+transferred will be stored in \fIresp_data_size\fP. These sizes do not include
+the Admin request header, so 0 represents no payload.
+
+As with all Admin commands, we can request partial data from the Admin
+Response payload, offset by \fIresp_data_offset\fP.
+
+See: \fIstruct nvme_mi_admin_req_hdr\fP and \fIstruct nvme_mi_admin_resp_hdr\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise..
diff --git a/doc/man/nvme_mi_ccs.2 b/doc/man/nvme_mi_ccs.2
new file mode 100644
index 0000000..9f1d05c
--- /dev/null
+++ b/doc/man/nvme_mi_ccs.2
@@ -0,0 +1,78 @@
+.TH "libnvme" 9 "enum nvme_mi_ccs" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_ccs \- Get State Control Primitive Success Response Fields - Control Primitive Specific Response
+.SH SYNOPSIS
+enum nvme_mi_ccs {
+.br
+.BI " NVME_MI_CCS_RDY"
+,
+.br
+.br
+.BI " NVME_MI_CCS_CFS"
+,
+.br
+.br
+.BI " NVME_MI_CCS_SHST"
+,
+.br
+.br
+.BI " NVME_MI_CCS_NSSRO"
+,
+.br
+.br
+.BI " NVME_MI_CCS_CECO"
+,
+.br
+.br
+.BI " NVME_MI_CCS_NAC"
+,
+.br
+.br
+.BI " NVME_MI_CCS_FA"
+,
+.br
+.br
+.BI " NVME_MI_CCS_CSTS"
+,
+.br
+.br
+.BI " NVME_MI_CCS_CTEMP"
+,
+.br
+.br
+.BI " NVME_MI_CCS_PDLU"
+,
+.br
+.br
+.BI " NVME_MI_CCS_SPARE"
+,
+.br
+.br
+.BI " NVME_MI_CCS_CCWARN"
+
+};
+.SH Constants
+.IP "NVME_MI_CCS_RDY" 12
+Ready
+.IP "NVME_MI_CCS_CFS" 12
+Controller Fatal Status
+.IP "NVME_MI_CCS_SHST" 12
+Shutdown Status
+.IP "NVME_MI_CCS_NSSRO" 12
+NVM Subsystem Reset Occurred
+.IP "NVME_MI_CCS_CECO" 12
+Controller Enable Change Occurred
+.IP "NVME_MI_CCS_NAC" 12
+Namespace Attribute Changed
+.IP "NVME_MI_CCS_FA" 12
+Firmware Activated
+.IP "NVME_MI_CCS_CSTS" 12
+Controller Status Change
+.IP "NVME_MI_CCS_CTEMP" 12
+Composite Temperature Change
+.IP "NVME_MI_CCS_PDLU" 12
+Percentage Used
+.IP "NVME_MI_CCS_SPARE" 12
+Available Spare
+.IP "NVME_MI_CCS_CCWARN" 12
+Critical Warning
diff --git a/doc/man/nvme_mi_close.2 b/doc/man/nvme_mi_close.2
new file mode 100644
index 0000000..20fc032
--- /dev/null
+++ b/doc/man/nvme_mi_close.2
@@ -0,0 +1,9 @@
+.TH "nvme_mi_close" 9 "nvme_mi_close" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_close \- Close an endpoint connection and release resources, including controller objects.
+.SH SYNOPSIS
+.B "void" nvme_mi_close
+.BI "(nvme_mi_ep_t ep " ");"
+.SH ARGUMENTS
+.IP "ep" 12
+Endpoint object to close
diff --git a/doc/man/nvme_mi_close_ctrl.2 b/doc/man/nvme_mi_close_ctrl.2
new file mode 100644
index 0000000..4423444
--- /dev/null
+++ b/doc/man/nvme_mi_close_ctrl.2
@@ -0,0 +1,9 @@
+.TH "nvme_mi_close_ctrl" 9 "nvme_mi_close_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_close_ctrl \- free a controller
+.SH SYNOPSIS
+.B "void" nvme_mi_close_ctrl
+.BI "(nvme_mi_ctrl_t ctrl " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+controller to free
diff --git a/doc/man/nvme_mi_cmd_supported_effects.2 b/doc/man/nvme_mi_cmd_supported_effects.2
new file mode 100644
index 0000000..aa56713
--- /dev/null
+++ b/doc/man/nvme_mi_cmd_supported_effects.2
@@ -0,0 +1,84 @@
+.TH "libnvme" 9 "enum nvme_mi_cmd_supported_effects" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_cmd_supported_effects \- MI Command Supported and Effects Data Structure
+.SH SYNOPSIS
+enum nvme_mi_cmd_supported_effects {
+.br
+.BI " NVME_MI_CMD_SUPPORTED_EFFECTS_CSUPP"
+,
+.br
+.br
+.BI " NVME_MI_CMD_SUPPORTED_EFFECTS_UDCC"
+,
+.br
+.br
+.BI " NVME_MI_CMD_SUPPORTED_EFFECTS_NCC"
+,
+.br
+.br
+.BI " NVME_MI_CMD_SUPPORTED_EFFECTS_NIC"
+,
+.br
+.br
+.BI " NVME_MI_CMD_SUPPORTED_EFFECTS_CCC"
+,
+.br
+.br
+.BI " NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_SHIFT"
+,
+.br
+.br
+.BI " NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_MASK"
+,
+.br
+.br
+.BI " NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NS"
+,
+.br
+.br
+.BI " NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_CTRL"
+,
+.br
+.br
+.BI " NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NVM_SET"
+,
+.br
+.br
+.BI " NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_ENDGRP"
+,
+.br
+.br
+.BI " NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_DOMAIN"
+,
+.br
+.br
+.BI " NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NSS"
+
+};
+.SH Constants
+.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_CSUPP" 12
+Command Supported
+.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_UDCC" 12
+User Data Content Change
+.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_NCC" 12
+Namespace Capability Change
+.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_NIC" 12
+Namespace Inventory Change
+.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_CCC" 12
+Controller Capability Change
+.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_SHIFT" 12
+20 bit shift
+.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_MASK" 12
+12 bit mask - 0xfff
+.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NS" 12
+Namespace Scope
+.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_CTRL" 12
+Controller Scope
+.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NVM_SET" 12
+NVM Set Scope
+.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_ENDGRP" 12
+Endurance Group Scope
+.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_DOMAIN" 12
+Domain Scope
+.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NSS" 12
+NVM Subsystem Scope
diff --git a/doc/man/nvme_mi_cmd_supported_effects_log.2 b/doc/man/nvme_mi_cmd_supported_effects_log.2
new file mode 100644
index 0000000..802a223
--- /dev/null
+++ b/doc/man/nvme_mi_cmd_supported_effects_log.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_mi_cmd_supported_effects_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_cmd_supported_effects_log \- NVMe-MI Commands Supported and Effects Log
+.SH SYNOPSIS
+struct nvme_mi_cmd_supported_effects_log {
+.br
+.BI " __le32 mi_cmd_support[NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_MAX];"
+.br
+.BI " __le32 reserved1[NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_RESERVED];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "mi_cmd_support" 12
+NVMe-MI Commands Supported
+.IP "reserved1" 12
+Reserved
diff --git a/doc/man/nvme_mi_config_id.2 b/doc/man/nvme_mi_config_id.2
new file mode 100644
index 0000000..b479b9f
--- /dev/null
+++ b/doc/man/nvme_mi_config_id.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "enum nvme_mi_config_id" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_config_id \- NVMe-MI Configuration identifier.
+.SH SYNOPSIS
+enum nvme_mi_config_id {
+.br
+.BI " NVME_MI_CONFIG_SMBUS_FREQ"
+,
+.br
+.br
+.BI " NVME_MI_CONFIG_HEALTH_STATUS_CHANGE"
+,
+.br
+.br
+.BI " NVME_MI_CONFIG_MCTP_MTU"
+
+};
+.SH Constants
+.IP "NVME_MI_CONFIG_SMBUS_FREQ" 12
+Current SMBus/I2C frequency
+.IP "NVME_MI_CONFIG_HEALTH_STATUS_CHANGE" 12
+Health Status change - used to clear
+health status bits in CCS bits of
+status poll. Only for Set ops.
+.IP "NVME_MI_CONFIG_MCTP_MTU" 12
+MCTP maximum transmission unit size of port
+specified in dw 0
+.SH "Description"
+Configuration parameters for the MI Get/Set Configuration commands.
+
+See &\fBnvme_mi_mi_config_get\fP and &\fBnvme_mi_config_set\fP.
diff --git a/doc/man/nvme_mi_config_smbus_freq.2 b/doc/man/nvme_mi_config_smbus_freq.2
new file mode 100644
index 0000000..e377a8f
--- /dev/null
+++ b/doc/man/nvme_mi_config_smbus_freq.2
@@ -0,0 +1,27 @@
+.TH "libnvme" 9 "enum nvme_mi_config_smbus_freq" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_config_smbus_freq \- SMBus/I2C frequency values
+.SH SYNOPSIS
+enum nvme_mi_config_smbus_freq {
+.br
+.BI " NVME_MI_CONFIG_SMBUS_FREQ_100kHz"
+,
+.br
+.br
+.BI " NVME_MI_CONFIG_SMBUS_FREQ_400kHz"
+,
+.br
+.br
+.BI " NVME_MI_CONFIG_SMBUS_FREQ_1MHz"
+
+};
+.SH Constants
+.IP "NVME_MI_CONFIG_SMBUS_FREQ_100kHz" 12
+100kHz
+.IP "NVME_MI_CONFIG_SMBUS_FREQ_400kHz" 12
+400kHz
+.IP "NVME_MI_CONFIG_SMBUS_FREQ_1MHz" 12
+1MHz
+.SH "Description"
+Values used in the SMBus Frequency device configuration. See
+&\fBnvme_mi_mi_config_get_smbus_freq\fP and &\fBnvme_mi_mi_config_set_smbus_freq\fP.
diff --git a/doc/man/nvme_mi_create_root.2 b/doc/man/nvme_mi_create_root.2
new file mode 100644
index 0000000..19de502
--- /dev/null
+++ b/doc/man/nvme_mi_create_root.2
@@ -0,0 +1,20 @@
+.TH "nvme_mi_create_root" 9 "nvme_mi_create_root" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_create_root \- Create top-level MI (root) handle.
+.SH SYNOPSIS
+.B "nvme_root_t" nvme_mi_create_root
+.BI "(FILE *fp " ","
+.BI "int log_level " ");"
+.SH ARGUMENTS
+.IP "fp" 12
+File descriptor for logging messages
+.IP "log_level" 12
+Logging level to use
+.SH "DESCRIPTION"
+Create the top-level (library) handle for creating subsequent endpoint
+objects. Similar to \fBnvme_create_root\fP, but we provide this to allow linking
+without the core libnvme.
+
+See \fInvme_create_root\fP.
+.SH "RETURN"
+new root object, or NULL on failure.
diff --git a/doc/man/nvme_mi_csts.2 b/doc/man/nvme_mi_csts.2
new file mode 100644
index 0000000..29307d8
--- /dev/null
+++ b/doc/man/nvme_mi_csts.2
@@ -0,0 +1,48 @@
+.TH "libnvme" 9 "enum nvme_mi_csts" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_csts \- Controller Health Data Structure (CHDS) - Controller Status (CSTS)
+.SH SYNOPSIS
+enum nvme_mi_csts {
+.br
+.BI " NVME_MI_CSTS_RDY"
+,
+.br
+.br
+.BI " NVME_MI_CSTS_CFS"
+,
+.br
+.br
+.BI " NVME_MI_CSTS_SHST"
+,
+.br
+.br
+.BI " NVME_MI_CSTS_NSSRO"
+,
+.br
+.br
+.BI " NVME_MI_CSTS_CECO"
+,
+.br
+.br
+.BI " NVME_MI_CSTS_NAC"
+,
+.br
+.br
+.BI " NVME_MI_CSTS_FA"
+
+};
+.SH Constants
+.IP "NVME_MI_CSTS_RDY" 12
+Ready
+.IP "NVME_MI_CSTS_CFS" 12
+Controller Fatal Status
+.IP "NVME_MI_CSTS_SHST" 12
+Shutdown Status
+.IP "NVME_MI_CSTS_NSSRO" 12
+NVM Subsystem Reset Occurred
+.IP "NVME_MI_CSTS_CECO" 12
+Controller Enable Change Occurred
+.IP "NVME_MI_CSTS_NAC" 12
+Namespace Attribute Changed
+.IP "NVME_MI_CSTS_FA" 12
+Firmware Activated
diff --git a/doc/man/nvme_mi_ctrl_health_status.2 b/doc/man/nvme_mi_ctrl_health_status.2
new file mode 100644
index 0000000..263dac2
--- /dev/null
+++ b/doc/man/nvme_mi_ctrl_health_status.2
@@ -0,0 +1,39 @@
+.TH "libnvme" 9 "struct nvme_mi_ctrl_health_status" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_ctrl_health_status \- Controller Health Data Structure (CHDS)
+.SH SYNOPSIS
+struct nvme_mi_ctrl_health_status {
+.br
+.BI " __le16 ctlid;"
+.br
+.BI " __le16 csts;"
+.br
+.BI " __le16 ctemp;"
+.br
+.BI " __u8 pdlu;"
+.br
+.BI " __u8 spare;"
+.br
+.BI " __u8 cwarn;"
+.br
+.BI " __u8 rsvd9[7];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "ctlid" 12
+Controller Identifier
+.IP "csts" 12
+Controller Status
+.IP "ctemp" 12
+Composite Temperature
+.IP "pdlu" 12
+Percentage Used
+.IP "spare" 12
+Available Spare
+.IP "cwarn" 12
+Critical Warning
+.IP "rsvd9" 12
+Reserved
diff --git a/doc/man/nvme_mi_cwarn.2 b/doc/man/nvme_mi_cwarn.2
new file mode 100644
index 0000000..db713cf
--- /dev/null
+++ b/doc/man/nvme_mi_cwarn.2
@@ -0,0 +1,36 @@
+.TH "libnvme" 9 "enum nvme_mi_cwarn" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_cwarn \- Controller Health Data Structure (CHDS) - Critical Warning (CWARN)
+.SH SYNOPSIS
+enum nvme_mi_cwarn {
+.br
+.BI " NVME_MI_CWARN_ST"
+,
+.br
+.br
+.BI " NVME_MI_CWARN_TAUT"
+,
+.br
+.br
+.BI " NVME_MI_CWARN_RD"
+,
+.br
+.br
+.BI " NVME_MI_CWARN_RO"
+,
+.br
+.br
+.BI " NVME_MI_CWARN_VMBF"
+
+};
+.SH Constants
+.IP "NVME_MI_CWARN_ST" 12
+Spare Threshold
+.IP "NVME_MI_CWARN_TAUT" 12
+Temperature Above or Under Threshold
+.IP "NVME_MI_CWARN_RD" 12
+Reliability Degraded
+.IP "NVME_MI_CWARN_RO" 12
+Read Only
+.IP "NVME_MI_CWARN_VMBF" 12
+Volatile Memory Backup Failed
diff --git a/doc/man/nvme_mi_dtyp.2 b/doc/man/nvme_mi_dtyp.2
new file mode 100644
index 0000000..55018c0
--- /dev/null
+++ b/doc/man/nvme_mi_dtyp.2
@@ -0,0 +1,45 @@
+.TH "libnvme" 9 "enum nvme_mi_dtyp" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_dtyp \- Data Structure Type field.
+.SH SYNOPSIS
+enum nvme_mi_dtyp {
+.br
+.BI " nvme_mi_dtyp_subsys_info"
+,
+.br
+.br
+.BI " nvme_mi_dtyp_port_info"
+,
+.br
+.br
+.BI " nvme_mi_dtyp_ctrl_list"
+,
+.br
+.br
+.BI " nvme_mi_dtyp_ctrl_info"
+,
+.br
+.br
+.BI " nvme_mi_dtyp_opt_cmd_support"
+,
+.br
+.br
+.BI " nvme_mi_dtyp_meb_support"
+
+};
+.SH Constants
+.IP "nvme_mi_dtyp_subsys_info" 12
+NVM Subsystem Information
+.IP "nvme_mi_dtyp_port_info" 12
+Port information
+.IP "nvme_mi_dtyp_ctrl_list" 12
+Controller List
+.IP "nvme_mi_dtyp_ctrl_info" 12
+Controller Information
+.IP "nvme_mi_dtyp_opt_cmd_support" 12
+Optionally Supported Command List
+.IP "nvme_mi_dtyp_meb_support" 12
+Management Endpoint Buffer Command Support List
+.SH "Description"
+Data Structure Type field for Read NVMe-MI Data Structure command, used to
+indicate the particular structure to query from the endpoint.
diff --git a/doc/man/nvme_mi_elem.2 b/doc/man/nvme_mi_elem.2
new file mode 100644
index 0000000..0b29b0f
--- /dev/null
+++ b/doc/man/nvme_mi_elem.2
@@ -0,0 +1,48 @@
+.TH "libnvme" 9 "enum nvme_mi_elem" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_elem \- Element Descriptor Types
+.SH SYNOPSIS
+enum nvme_mi_elem {
+.br
+.BI " NVME_MI_ELEM_EED"
+,
+.br
+.br
+.BI " NVME_MI_ELEM_USCE"
+,
+.br
+.br
+.BI " NVME_MI_ELEM_ECED"
+,
+.br
+.br
+.BI " NVME_MI_ELEM_LED"
+,
+.br
+.br
+.BI " NVME_MI_ELEM_SMBMED"
+,
+.br
+.br
+.BI " NVME_MI_ELEM_PCIESED"
+,
+.br
+.br
+.BI " NVME_MI_ELEM_NVMED"
+
+};
+.SH Constants
+.IP "NVME_MI_ELEM_EED" 12
+Extended Element Descriptor
+.IP "NVME_MI_ELEM_USCE" 12
+Upstream Connector Element Descriptor
+.IP "NVME_MI_ELEM_ECED" 12
+Expansion Connector Element Descriptor
+.IP "NVME_MI_ELEM_LED" 12
+Label Element Descriptor
+.IP "NVME_MI_ELEM_SMBMED" 12
+SMBus/I2C Mux Element Descriptor
+.IP "NVME_MI_ELEM_PCIESED" 12
+PCIe Switch Element Descriptor
+.IP "NVME_MI_ELEM_NVMED" 12
+NVM Subsystem Element Descriptor
diff --git a/doc/man/nvme_mi_free_root.2 b/doc/man/nvme_mi_free_root.2
new file mode 100644
index 0000000..cd7c38b
--- /dev/null
+++ b/doc/man/nvme_mi_free_root.2
@@ -0,0 +1,9 @@
+.TH "nvme_mi_free_root" 9 "nvme_mi_free_root" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_free_root \- Free root object.
+.SH SYNOPSIS
+.B "void" nvme_mi_free_root
+.BI "(nvme_root_t root " ");"
+.SH ARGUMENTS
+.IP "root" 12
+root to free
diff --git a/doc/man/nvme_mi_init_ctrl.2 b/doc/man/nvme_mi_init_ctrl.2
new file mode 100644
index 0000000..be37340
--- /dev/null
+++ b/doc/man/nvme_mi_init_ctrl.2
@@ -0,0 +1,20 @@
+.TH "nvme_mi_init_ctrl" 9 "nvme_mi_init_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_init_ctrl \- initialise a NVMe controller.
+.SH SYNOPSIS
+.B "nvme_mi_ctrl_t" nvme_mi_init_ctrl
+.BI "(nvme_mi_ep_t ep " ","
+.BI "__u16 ctrl_id " ");"
+.SH ARGUMENTS
+.IP "ep" 12
+Endpoint to create under
+.IP "ctrl_id" 12
+ID of controller to initialize.
+.SH "DESCRIPTION"
+Create a connection to a controller behind the endpoint specified in \fIep\fP.
+Controller IDs may be queried from the endpoint through
+\fInvme_mi_mi_read_mi_data_ctrl_list\fP.
+
+See \fInvme_mi_close_ctrl\fP
+.SH "RETURN"
+New controller object, or NULL on failure.
diff --git a/doc/man/nvme_mi_message_type.2 b/doc/man/nvme_mi_message_type.2
new file mode 100644
index 0000000..c54e4bc
--- /dev/null
+++ b/doc/man/nvme_mi_message_type.2
@@ -0,0 +1,33 @@
+.TH "libnvme" 9 "enum nvme_mi_message_type" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_message_type \- NVMe-MI message type field.
+.SH SYNOPSIS
+enum nvme_mi_message_type {
+.br
+.BI " NVME_MI_MT_CONTROL"
+,
+.br
+.br
+.BI " NVME_MI_MT_MI"
+,
+.br
+.br
+.BI " NVME_MI_MT_ADMIN"
+,
+.br
+.br
+.BI " NVME_MI_MT_PCIE"
+
+};
+.SH Constants
+.IP "NVME_MI_MT_CONTROL" 12
+NVME-MI Control Primitive
+.IP "NVME_MI_MT_MI" 12
+NVMe-MI command
+.IP "NVME_MI_MT_ADMIN" 12
+NVMe Admin command
+.IP "NVME_MI_MT_PCIE" 12
+PCIe command
+.SH "Description"
+Used as byte 1 of both request and response messages (NMIMT bits of NMP
+byte). Not to be confused with the MCTP message type in byte 0.
diff --git a/doc/man/nvme_mi_mi_opcode.2 b/doc/man/nvme_mi_mi_opcode.2
new file mode 100644
index 0000000..e5a8437
--- /dev/null
+++ b/doc/man/nvme_mi_mi_opcode.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvme_mi_mi_opcode" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_mi_opcode \- Operation code for supported NVMe-MI commands.
+.SH SYNOPSIS
+enum nvme_mi_mi_opcode {
+.br
+.BI " nvme_mi_mi_opcode_mi_data_read"
+,
+.br
+.br
+.BI " nvme_mi_mi_opcode_subsys_health_status_poll"
+,
+.br
+.br
+.BI " nvme_mi_mi_opcode_configuration_set"
+,
+.br
+.br
+.BI " nvme_mi_mi_opcode_configuration_get"
+
+};
+.SH Constants
+.IP "nvme_mi_mi_opcode_mi_data_read" 12
+Read NVMe-MI Data Structure
+.IP "nvme_mi_mi_opcode_subsys_health_status_poll" 12
+Subsystem Health Status Poll
+.IP "nvme_mi_mi_opcode_configuration_set" 12
+MI Configuration Set
+.IP "nvme_mi_mi_opcode_configuration_get" 12
+MI Configuration Get
diff --git a/doc/man/nvme_mi_mi_read_mi_data_ctrl.2 b/doc/man/nvme_mi_mi_read_mi_data_ctrl.2
new file mode 100644
index 0000000..5264357
--- /dev/null
+++ b/doc/man/nvme_mi_mi_read_mi_data_ctrl.2
@@ -0,0 +1,23 @@
+.TH "nvme_mi_mi_read_mi_data_ctrl" 9 "nvme_mi_mi_read_mi_data_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_mi_read_mi_data_ctrl \- Perform a Read MI Data Structure command, retrieving controller information
+.SH SYNOPSIS
+.B "int" nvme_mi_mi_read_mi_data_ctrl
+.BI "(nvme_mi_ep_t ep " ","
+.BI "__u16 ctrl_id " ","
+.BI "struct nvme_mi_read_ctrl_info *ctrl " ");"
+.SH ARGUMENTS
+.IP "ep" 12
+endpoint for MI communication
+.IP "ctrl_id" 12
+ID of controller to query
+.IP "ctrl" 12
+controller data to populate
+.SH "DESCRIPTION"
+Retrieves the Controller Information Data Structure for the attached
+controller with ID \fIctrlid\fP.
+
+See \fIstruct nvme_mi_read_ctrl_info\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise..
diff --git a/doc/man/nvme_mi_mi_read_mi_data_ctrl_list.2 b/doc/man/nvme_mi_mi_read_mi_data_ctrl_list.2
new file mode 100644
index 0000000..594d8f6
--- /dev/null
+++ b/doc/man/nvme_mi_mi_read_mi_data_ctrl_list.2
@@ -0,0 +1,23 @@
+.TH "nvme_mi_mi_read_mi_data_ctrl_list" 9 "nvme_mi_mi_read_mi_data_ctrl_list" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_mi_read_mi_data_ctrl_list \- Perform a Read MI Data Structure command, retrieving the list of attached controllers.
+.SH SYNOPSIS
+.B "int" nvme_mi_mi_read_mi_data_ctrl_list
+.BI "(nvme_mi_ep_t ep " ","
+.BI "__u8 start_ctrlid " ","
+.BI "struct nvme_ctrl_list *list " ");"
+.SH ARGUMENTS
+.IP "ep" 12
+endpoint for MI communication
+.IP "start_ctrlid" 12
+starting controller ID
+.IP "list" 12
+controller list to populate
+.SH "DESCRIPTION"
+Retrieves the list of attached controllers, with IDs greater than or
+equal to \fIstart_ctrlid\fP.
+
+See \fIstruct nvme_ctrl_list\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise..
diff --git a/doc/man/nvme_mi_mi_read_mi_data_port.2 b/doc/man/nvme_mi_mi_read_mi_data_port.2
new file mode 100644
index 0000000..f3aeaf3
--- /dev/null
+++ b/doc/man/nvme_mi_mi_read_mi_data_port.2
@@ -0,0 +1,24 @@
+.TH "nvme_mi_mi_read_mi_data_port" 9 "nvme_mi_mi_read_mi_data_port" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_mi_read_mi_data_port \- Perform a Read MI Data Structure command, retrieving port data.
+.SH SYNOPSIS
+.B "int" nvme_mi_mi_read_mi_data_port
+.BI "(nvme_mi_ep_t ep " ","
+.BI "__u8 portid " ","
+.BI "struct nvme_mi_read_port_info *p " ");"
+.SH ARGUMENTS
+.IP "ep" 12
+endpoint for MI communication
+.IP "portid" 12
+id of port data to retrieve
+.IP "p" 12
+port information to populate
+.SH "DESCRIPTION"
+Retrieves the Port information, for the specified port ID. The subsystem
+data (from \fInvme_mi_mi_read_mi_data_subsys\fP) nmp field contains the allowed
+range of port IDs.
+
+See \fIstruct nvme_mi_read_port_info\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise..
diff --git a/doc/man/nvme_mi_mi_read_mi_data_subsys.2 b/doc/man/nvme_mi_mi_read_mi_data_subsys.2
new file mode 100644
index 0000000..a4a5191
--- /dev/null
+++ b/doc/man/nvme_mi_mi_read_mi_data_subsys.2
@@ -0,0 +1,18 @@
+.TH "nvme_mi_mi_read_mi_data_subsys" 9 "nvme_mi_mi_read_mi_data_subsys" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_mi_read_mi_data_subsys \- Perform a Read MI Data Structure command, retrieving subsystem data.
+.SH SYNOPSIS
+.B "int" nvme_mi_mi_read_mi_data_subsys
+.BI "(nvme_mi_ep_t ep " ","
+.BI "struct nvme_mi_read_nvm_ss_info *s " ");"
+.SH ARGUMENTS
+.IP "ep" 12
+endpoint for MI communication
+.IP "s" 12
+subsystem information to populate
+.SH "DESCRIPTION"
+Retrieves the Subsystem information - number of external ports and
+NVMe version information. See \fIstruct nvme_mi_read_nvm_ss_info\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise..
diff --git a/doc/man/nvme_mi_mi_req_hdr.2 b/doc/man/nvme_mi_mi_req_hdr.2
new file mode 100644
index 0000000..a7c0d49
--- /dev/null
+++ b/doc/man/nvme_mi_mi_req_hdr.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "struct nvme_mi_mi_req_hdr" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_mi_req_hdr \- MI request message header.
+.SH SYNOPSIS
+struct nvme_mi_mi_req_hdr {
+.br
+.BI " struct nvme_mi_msg_hdr hdr;"
+.br
+.BI " __u8 opcode;"
+.br
+.BI " __u8 rsvd0[3];"
+.br
+.BI " __le32 cdw0, cdw1;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "hdr" 12
+generic MI message header
+.IP "opcode" 12
+opcode (OPC) for the specific MI command
+.IP "rsvd0" 12
+reserved bytes
+.IP "cdw0" 12
+Management Request Doubleword 0 - command specific usage
+.IP "cdw1" 12
+Management Request Doubleword 1 - command specific usage
+.SH "Description"
+Wire format for MI request message headers, defined in section 5 of NVMe-MI.
diff --git a/doc/man/nvme_mi_mi_resp_hdr.2 b/doc/man/nvme_mi_mi_resp_hdr.2
new file mode 100644
index 0000000..37e78e5
--- /dev/null
+++ b/doc/man/nvme_mi_mi_resp_hdr.2
@@ -0,0 +1,25 @@
+.TH "libnvme" 9 "struct nvme_mi_mi_resp_hdr" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_mi_resp_hdr \- MI response message header.
+.SH SYNOPSIS
+struct nvme_mi_mi_resp_hdr {
+.br
+.BI " struct nvme_mi_msg_hdr hdr;"
+.br
+.BI " __u8 status;"
+.br
+.BI " __u8 nmresp[3];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "hdr" 12
+generic MI message header
+.IP "status" 12
+generic response status from command; non-zero on failure.
+.IP "nmresp" 12
+NVMe Management Response: command-type-specific response data
+.SH "Description"
+Wire format for MI response message header, defined in section 5 of NVMe-MI.
diff --git a/doc/man/nvme_mi_mi_subsystem_health_status_poll.2 b/doc/man/nvme_mi_mi_subsystem_health_status_poll.2
new file mode 100644
index 0000000..1b9b2c4
--- /dev/null
+++ b/doc/man/nvme_mi_mi_subsystem_health_status_poll.2
@@ -0,0 +1,24 @@
+.TH "nvme_mi_mi_subsystem_health_status_poll" 9 "nvme_mi_mi_subsystem_health_status_poll" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_mi_subsystem_health_status_poll \- Read the Subsystem Health Data Structure from the NVM subsystem
+.SH SYNOPSIS
+.B "int" nvme_mi_mi_subsystem_health_status_poll
+.BI "(nvme_mi_ep_t ep " ","
+.BI "bool clear " ","
+.BI "struct nvme_mi_nvm_ss_health_status *nshds " ");"
+.SH ARGUMENTS
+.IP "ep" 12
+endpoint for MI communication
+.IP "clear" 12
+flag to clear the Composite Controller Status state
+.IP "nshds" 12
+subsystem health status data to populate
+.SH "DESCRIPTION"
+Retrieves the Subsystem Health Data Structure into \fInshds\fP. If \fIclear\fP is
+set, requests that the Composite Controller Status bits are cleared after
+the read. See NVMe-MI section 5.6 for details on the CCS bits.
+
+See \fIstruct nvme_mi_nvm_ss_health_status\fP.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise..
diff --git a/doc/man/nvme_mi_msg_hdr.2 b/doc/man/nvme_mi_msg_hdr.2
new file mode 100644
index 0000000..29e9bd6
--- /dev/null
+++ b/doc/man/nvme_mi_msg_hdr.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "struct nvme_mi_msg_hdr" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_msg_hdr \- General MI message header.
+.SH SYNOPSIS
+struct nvme_mi_msg_hdr {
+.br
+.BI " __u8 type;"
+.br
+.BI " __u8 nmp;"
+.br
+.BI " __u8 meb;"
+.br
+.BI " __u8 rsvd0;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "type" 12
+MCTP message type, will always be NVME_MI_MSGTYPE_NVME
+.IP "nmp" 12
+NVMe-MI message parameters (including MI message type)
+.IP "meb" 12
+Management Endpoint Buffer flag; unused for libnvme-mi implementation
+.IP "rsvd0" 12
+currently reserved
+.SH "Description"
+Wire format shared by both request and response messages, per NVMe-MI
+section 3.1. This is used for all message types, MI and Admin.
diff --git a/doc/man/nvme_mi_msg_resp.2 b/doc/man/nvme_mi_msg_resp.2
new file mode 100644
index 0000000..64aad38
--- /dev/null
+++ b/doc/man/nvme_mi_msg_resp.2
@@ -0,0 +1,26 @@
+.TH "libnvme" 9 "struct nvme_mi_msg_resp" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_msg_resp \- Generic response type.
+.SH SYNOPSIS
+struct nvme_mi_msg_resp {
+.br
+.BI " struct nvme_mi_msg_hdr hdr;"
+.br
+.BI " __u8 status;"
+.br
+.BI " __u8 rsvd0[3];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "hdr" 12
+the general request/response message header
+.IP "status" 12
+response status value (see \fIenum nvme_mi_resp_status\fP)
+.IP "rsvd0" 12
+reserved data, may be defined by specific response
+.SH "Description"
+Every response will start with one of these; command-specific responses
+will define parts of the reserved data, and may add further fields.
diff --git a/doc/man/nvme_mi_nvm_ss_health_status.2 b/doc/man/nvme_mi_nvm_ss_health_status.2
new file mode 100644
index 0000000..1525edd
--- /dev/null
+++ b/doc/man/nvme_mi_nvm_ss_health_status.2
@@ -0,0 +1,35 @@
+.TH "libnvme" 9 "struct nvme_mi_nvm_ss_health_status" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_nvm_ss_health_status \- Subsystem Management Data Structure
+.SH SYNOPSIS
+struct nvme_mi_nvm_ss_health_status {
+.br
+.BI " __u8 nss;"
+.br
+.BI " __u8 sw;"
+.br
+.BI " __u8 ctemp;"
+.br
+.BI " __u8 pdlu;"
+.br
+.BI " __le16 ccs;"
+.br
+.BI " __u8 rsvd8[2];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nss" 12
+NVM Subsystem Status
+.IP "sw" 12
+Smart Warnings
+.IP "ctemp" 12
+Composite Temperature
+.IP "pdlu" 12
+Percentage Drive Life Used
+.IP "ccs" 12
+Composite Controller Status
+.IP "rsvd8" 12
+Reserved
diff --git a/doc/man/nvme_mi_open_mctp.2 b/doc/man/nvme_mi_open_mctp.2
new file mode 100644
index 0000000..11cf4ef
--- /dev/null
+++ b/doc/man/nvme_mi_open_mctp.2
@@ -0,0 +1,22 @@
+.TH "nvme_mi_open_mctp" 9 "nvme_mi_open_mctp" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_open_mctp \- Create an endpoint using a MCTP connection.
+.SH SYNOPSIS
+.B "nvme_mi_ep_t" nvme_mi_open_mctp
+.BI "(nvme_root_t root " ","
+.BI "unsigned int netid " ","
+.BI "uint8_t eid " ");"
+.SH ARGUMENTS
+.IP "root" 12
+root object to create under
+.IP "netid" 12
+MCTP network ID on this system
+.IP "eid" 12
+MCTP endpoint ID
+.SH "DESCRIPTION"
+Transport-specific endpoint initialization for MI-connected endpoints. Once
+an endpoint is created, the rest of the API is transport-independent.
+
+See \fInvme_mi_close\fP
+.SH "RETURN"
+New endpoint object for \fInetid\fP & \fIeid\fP, or NULL on failure.
diff --git a/doc/man/nvme_mi_osc.2 b/doc/man/nvme_mi_osc.2
new file mode 100644
index 0000000..5841d25
--- /dev/null
+++ b/doc/man/nvme_mi_osc.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_mi_osc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_osc \- Optionally Supported Command Data Structure
+.SH SYNOPSIS
+struct nvme_mi_osc {
+.br
+.BI " __u8 type;"
+.br
+.BI " __u8 opc;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "type" 12
+Command Type
+.IP "opc" 12
+Opcode
diff --git a/doc/man/nvme_mi_port_pcie.2 b/doc/man/nvme_mi_port_pcie.2
new file mode 100644
index 0000000..0eaa2f2
--- /dev/null
+++ b/doc/man/nvme_mi_port_pcie.2
@@ -0,0 +1,39 @@
+.TH "libnvme" 9 "struct nvme_mi_port_pcie" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_port_pcie \- PCIe Port Specific Data
+.SH SYNOPSIS
+struct nvme_mi_port_pcie {
+.br
+.BI " __u8 mps;"
+.br
+.BI " __u8 sls;"
+.br
+.BI " __u8 cls;"
+.br
+.BI " __u8 mlw;"
+.br
+.BI " __u8 nlw;"
+.br
+.BI " __u8 pn;"
+.br
+.BI " __u8 rsvd14[18];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "mps" 12
+PCIe Maximum Payload Size
+.IP "sls" 12
+PCIe Supported Link Speeds Vector
+.IP "cls" 12
+PCIe Current Link Speed
+.IP "mlw" 12
+PCIe Maximum Link Width
+.IP "nlw" 12
+PCIe Negotiated Link Width
+.IP "pn" 12
+PCIe Port Number
+.IP "rsvd14" 12
+Reserved
diff --git a/doc/man/nvme_mi_port_smb.2 b/doc/man/nvme_mi_port_smb.2
new file mode 100644
index 0000000..efda36a
--- /dev/null
+++ b/doc/man/nvme_mi_port_smb.2
@@ -0,0 +1,35 @@
+.TH "libnvme" 9 "struct nvme_mi_port_smb" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_port_smb \- SMBus Port Specific Data
+.SH SYNOPSIS
+struct nvme_mi_port_smb {
+.br
+.BI " __u8 vpd_addr;"
+.br
+.BI " __u8 mvpd_freq;"
+.br
+.BI " __u8 mme_addr;"
+.br
+.BI " __u8 mme_freq;"
+.br
+.BI " __u8 nvmebm;"
+.br
+.BI " __u8 rsvd13[19];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "vpd_addr" 12
+Current VPD SMBus/I2C Address
+.IP "mvpd_freq" 12
+Maximum VPD Access SMBus/I2C Frequency
+.IP "mme_addr" 12
+Current Management Endpoint SMBus/I2C Address
+.IP "mme_freq" 12
+Maximum Management Endpoint SMBus/I2C Frequency
+.IP "nvmebm" 12
+NVMe Basic Management
+.IP "rsvd13" 12
+Reserved
diff --git a/doc/man/nvme_mi_read_ctrl_info.2 b/doc/man/nvme_mi_read_ctrl_info.2
new file mode 100644
index 0000000..8b78aab
--- /dev/null
+++ b/doc/man/nvme_mi_read_ctrl_info.2
@@ -0,0 +1,47 @@
+.TH "libnvme" 9 "struct nvme_mi_read_ctrl_info" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_read_ctrl_info \- Controller Information Data Structure
+.SH SYNOPSIS
+struct nvme_mi_read_ctrl_info {
+.br
+.BI " __u8 portid;"
+.br
+.BI " __u8 rsvd1[4];"
+.br
+.BI " __u8 prii;"
+.br
+.BI " __le16 pri;"
+.br
+.BI " __le16 vid;"
+.br
+.BI " __le16 did;"
+.br
+.BI " __le16 ssvid;"
+.br
+.BI " __le16 ssid;"
+.br
+.BI " __u8 rsvd16[16];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "portid" 12
+Port Identifier
+.IP "rsvd1" 12
+Reserved
+.IP "prii" 12
+PCIe Routing ID Information
+.IP "pri" 12
+PCIe Routing ID
+.IP "vid" 12
+PCI Vendor ID
+.IP "did" 12
+PCI Device ID
+.IP "ssvid" 12
+PCI Subsystem Vendor ID
+.IP "ssid" 12
+PCI Subsystem Device ID
+.IP "rsvd16" 12
+Reserved
diff --git a/doc/man/nvme_mi_read_nvm_ss_info.2 b/doc/man/nvme_mi_read_nvm_ss_info.2
new file mode 100644
index 0000000..3fb30ad
--- /dev/null
+++ b/doc/man/nvme_mi_read_nvm_ss_info.2
@@ -0,0 +1,27 @@
+.TH "libnvme" 9 "struct nvme_mi_read_nvm_ss_info" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_read_nvm_ss_info \- NVM Subsystem Information Data Structure
+.SH SYNOPSIS
+struct nvme_mi_read_nvm_ss_info {
+.br
+.BI " __u8 nump;"
+.br
+.BI " __u8 mjr;"
+.br
+.BI " __u8 mnr;"
+.br
+.BI " __u8 rsvd3[29];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nump" 12
+Number of Ports
+.IP "mjr" 12
+NVMe-MI Major Version Number
+.IP "mnr" 12
+NVMe-MI Minor Version Number
+.IP "rsvd3" 12
+Reserved
diff --git a/doc/man/nvme_mi_read_port_info.2 b/doc/man/nvme_mi_read_port_info.2
new file mode 100644
index 0000000..8931639
--- /dev/null
+++ b/doc/man/nvme_mi_read_port_info.2
@@ -0,0 +1,41 @@
+.TH "libnvme" 9 "struct nvme_mi_read_port_info" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_read_port_info \- Port Information Data Structure
+.SH SYNOPSIS
+struct nvme_mi_read_port_info {
+.br
+.BI " __u8 portt;"
+.br
+.BI " __u8 rsvd1;"
+.br
+.BI " __le16 mmctptus;"
+.br
+.BI " __le32 meb;"
+.br
+.BI " union {"
+.br
+.BI " struct nvme_mi_port_pcie pcie;"
+.br
+.BI " struct nvme_mi_port_smb smb;"
+.br
+.BI " };"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "portt" 12
+Port Type
+.IP "rsvd1" 12
+Reserved
+.IP "mmctptus" 12
+Maximum MCTP Transmission Unit Size
+.IP "meb" 12
+Management Endpoint Buffer Size
+.IP "{unnamed_union}" 12
+anonymous
+.IP "pcie" 12
+PCIe Port Specific Data
+.IP "smb" 12
+SMBus Port Specific Data
diff --git a/doc/man/nvme_mi_read_sc_list.2 b/doc/man/nvme_mi_read_sc_list.2
new file mode 100644
index 0000000..2ff5a87
--- /dev/null
+++ b/doc/man/nvme_mi_read_sc_list.2
@@ -0,0 +1,20 @@
+.TH "libnvme" 9 "struct nvme_mi_read_sc_list" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_read_sc_list \- Management Endpoint Buffer Supported Command List Data Structure
+.SH SYNOPSIS
+struct nvme_mi_read_sc_list {
+.br
+.BI " __le16 numcmd;"
+.br
+.BI " struct nvme_mi_osc cmds[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "numcmd" 12
+Number of Commands
+.IP "cmds" 12
+MEB supported Command Data Structure.
+See \fIstruct\fP nvme_mi_osc
diff --git a/doc/man/nvme_mi_resp_status.2 b/doc/man/nvme_mi_resp_status.2
new file mode 100644
index 0000000..aceae13
--- /dev/null
+++ b/doc/man/nvme_mi_resp_status.2
@@ -0,0 +1,120 @@
+.TH "libnvme" 9 "enum nvme_mi_resp_status" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_resp_status \- values for the response status field
+.SH SYNOPSIS
+enum nvme_mi_resp_status {
+.br
+.BI " NVME_MI_RESP_SUCCESS"
+,
+.br
+.br
+.BI " NVME_MI_RESP_MPR"
+,
+.br
+.br
+.BI " NVME_MI_RESP_INTERNAL_ERR"
+,
+.br
+.br
+.BI " NVME_MI_RESP_INVALID_OPCODE"
+,
+.br
+.br
+.BI " NVME_MI_RESP_INVALID_PARAM"
+,
+.br
+.br
+.BI " NVME_MI_RESP_INVALID_CMD_SIZE"
+,
+.br
+.br
+.BI " NVME_MI_RESP_INVALID_INPUT_SIZE"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ACCESS_DENIED"
+,
+.br
+.br
+.BI " NVME_MI_RESP_VPD_UPDATES_EXCEEDED"
+,
+.br
+.br
+.BI " NVME_MI_RESP_PCIE_INACCESSIBLE"
+,
+.br
+.br
+.BI " NVME_MI_RESP_MEB_SANITIZED"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ENC_SERV_FAILURE"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ENC_SERV_XFER_FAILURE"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ENC_FAILURE"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ENC_XFER_REFUSED"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ENC_FUNC_UNSUP"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ENC_SERV_UNAVAIL"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ENC_DEGRADED"
+,
+.br
+.br
+.BI " NVME_MI_RESP_SANITIZE_IN_PROGRESS"
+
+};
+.SH Constants
+.IP "NVME_MI_RESP_SUCCESS" 12
+success
+.IP "NVME_MI_RESP_MPR" 12
+More Processing Required
+.IP "NVME_MI_RESP_INTERNAL_ERR" 12
+Internal Error
+.IP "NVME_MI_RESP_INVALID_OPCODE" 12
+Invalid command opcode
+.IP "NVME_MI_RESP_INVALID_PARAM" 12
+Invalid command parameter
+.IP "NVME_MI_RESP_INVALID_CMD_SIZE" 12
+Invalid command size
+.IP "NVME_MI_RESP_INVALID_INPUT_SIZE" 12
+Invalid command input data size
+.IP "NVME_MI_RESP_ACCESS_DENIED" 12
+Access Denied
+.IP "NVME_MI_RESP_VPD_UPDATES_EXCEEDED" 12
+More VPD updates than allowed
+.IP "NVME_MI_RESP_PCIE_INACCESSIBLE" 12
+PCIe functionality currently unavailable
+.IP "NVME_MI_RESP_MEB_SANITIZED" 12
+MEB has been cleared due to sanitize
+.IP "NVME_MI_RESP_ENC_SERV_FAILURE" 12
+Enclosure services process failed
+.IP "NVME_MI_RESP_ENC_SERV_XFER_FAILURE" 12
+Transfer with enclosure services failed
+.IP "NVME_MI_RESP_ENC_FAILURE" 12
+Unreoverable enclosure failure
+.IP "NVME_MI_RESP_ENC_XFER_REFUSED" 12
+Enclosure services transfer refused
+.IP "NVME_MI_RESP_ENC_FUNC_UNSUP" 12
+Unsupported enclosure services function
+.IP "NVME_MI_RESP_ENC_SERV_UNAVAIL" 12
+Enclosure services unavailable
+.IP "NVME_MI_RESP_ENC_DEGRADED" 12
+Noncritical failure detected by enc. services
+.IP "NVME_MI_RESP_SANITIZE_IN_PROGRESS" 12
+Command prohibited during sanitize
diff --git a/doc/man/nvme_mi_set_probe_enabled.2 b/doc/man/nvme_mi_set_probe_enabled.2
new file mode 100644
index 0000000..6b11db3
--- /dev/null
+++ b/doc/man/nvme_mi_set_probe_enabled.2
@@ -0,0 +1,16 @@
+.TH "nvme_mi_set_probe_enabled" 9 "nvme_mi_set_probe_enabled" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_set_probe_enabled \- enable/disable the probe for new endpoints
+.SH SYNOPSIS
+.B "void" nvme_mi_set_probe_enabled
+.BI "(nvme_root_t root " ","
+.BI "bool enabled " ");"
+.SH ARGUMENTS
+.IP "root" 12
+\fInvme_root_t\fP object
+.IP "enabled" 12
+whether to probe new endpoints
+.SH "DESCRIPTION"
+Controls whether newly-created endpoints are probed for quirks on creation.
+Defaults to enabled, which results in some initial messaging with the
+endpoint to determine model-specific details.
diff --git a/doc/man/nvme_mi_status_to_string.2 b/doc/man/nvme_mi_status_to_string.2
new file mode 100644
index 0000000..ba26ae5
--- /dev/null
+++ b/doc/man/nvme_mi_status_to_string.2
@@ -0,0 +1,17 @@
+.TH "nvme_mi_status_to_string" 9 "nvme_mi_status_to_string" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_status_to_string \- return a string representation of the MI status.
+.SH SYNOPSIS
+.B "const char *" nvme_mi_status_to_string
+.BI "(int status " ");"
+.SH ARGUMENTS
+.IP "status" 12
+MI response status
+.SH "DESCRIPTION"
+Gives a string description of \fIstatus\fP, as per section 4.1.2 of the NVMe-MI
+spec. The status value should be of type NVME_STATUS_MI, and extracted
+from the return value using \fBnvme_status_get_value\fP.
+
+Returned string is const, and should not be \fBfree\fPed.
+.SH "RETURN"
+A string representing the status value
diff --git a/doc/man/nvme_mi_vpd_hdr.2 b/doc/man/nvme_mi_vpd_hdr.2
new file mode 100644
index 0000000..63f0e1d
--- /dev/null
+++ b/doc/man/nvme_mi_vpd_hdr.2
@@ -0,0 +1,47 @@
+.TH "libnvme" 9 "struct nvme_mi_vpd_hdr" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_vpd_hdr \- Vital Product Data Common Header
+.SH SYNOPSIS
+struct nvme_mi_vpd_hdr {
+.br
+.BI " __u8 ipmiver;"
+.br
+.BI " __u8 iuaoff;"
+.br
+.BI " __u8 ciaoff;"
+.br
+.BI " __u8 biaoff;"
+.br
+.BI " __u8 piaoff;"
+.br
+.BI " __u8 mrioff;"
+.br
+.BI " __u8 rsvd6;"
+.br
+.BI " __u8 chchk;"
+.br
+.BI " __u8 vpd[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "ipmiver" 12
+IPMI Format Version Number
+.IP "iuaoff" 12
+Internal Use Area Starting Offset
+.IP "ciaoff" 12
+Chassis Info Area Starting Offset
+.IP "biaoff" 12
+Board Info Area Starting Offset
+.IP "piaoff" 12
+Product Info Area Starting Offset
+.IP "mrioff" 12
+MultiRecord Info Area Starting Offset
+.IP "rsvd6" 12
+Reserved
+.IP "chchk" 12
+Common Header Checksum
+.IP "vpd" 12
+Vital Product Data
diff --git a/doc/man/nvme_mi_vpd_mr_common.2 b/doc/man/nvme_mi_vpd_mr_common.2
new file mode 100644
index 0000000..a0ca4a9
--- /dev/null
+++ b/doc/man/nvme_mi_vpd_mr_common.2
@@ -0,0 +1,49 @@
+.TH "libnvme" 9 "struct nvme_mi_vpd_mr_common" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_vpd_mr_common \- NVMe MultiRecord Area
+.SH SYNOPSIS
+struct nvme_mi_vpd_mr_common {
+.br
+.BI " __u8 type;"
+.br
+.BI " __u8 rf;"
+.br
+.BI " __u8 rlen;"
+.br
+.BI " __u8 rchksum;"
+.br
+.BI " __u8 hchksum;"
+.br
+.BI " union {"
+.br
+.BI " struct nvme_mi_vpd_mra nmra;"
+.br
+.BI " struct nvme_mi_vpd_ppmra ppmra;"
+.br
+.BI " struct nvme_mi_vpd_tra tmra;"
+.br
+.BI " };"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "type" 12
+NVMe Record Type ID
+.IP "rf" 12
+Record Format
+.IP "rlen" 12
+Record Length
+.IP "rchksum" 12
+Record Checksum
+.IP "hchksum" 12
+Header Checksum
+.IP "{unnamed_union}" 12
+anonymous
+.IP "nmra" 12
+NVMe MultiRecord Area
+.IP "ppmra" 12
+NVMe PCIe Port MultiRecord Area
+.IP "tmra" 12
+Topology MultiRecord Area
diff --git a/doc/man/nvme_mi_vpd_mra.2 b/doc/man/nvme_mi_vpd_mra.2
new file mode 100644
index 0000000..6d08710
--- /dev/null
+++ b/doc/man/nvme_mi_vpd_mra.2
@@ -0,0 +1,75 @@
+.TH "libnvme" 9 "struct nvme_mi_vpd_mra" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_vpd_mra \- NVMe MultiRecord Area
+.SH SYNOPSIS
+struct nvme_mi_vpd_mra {
+.br
+.BI " __u8 nmravn;"
+.br
+.BI " __u8 ff;"
+.br
+.BI " __u8 rsvd7[6];"
+.br
+.BI " __u8 i18vpwr;"
+.br
+.BI " __u8 m18vpwr;"
+.br
+.BI " __u8 i33vpwr;"
+.br
+.BI " __u8 m33vpwr;"
+.br
+.BI " __u8 rsvd17;"
+.br
+.BI " __u8 m33vapsr;"
+.br
+.BI " __u8 i5vapsr;"
+.br
+.BI " __u8 m5vapsr;"
+.br
+.BI " __u8 i12vapsr;"
+.br
+.BI " __u8 m12vapsr;"
+.br
+.BI " __u8 mtl;"
+.br
+.BI " __u8 tnvmcap[16];"
+.br
+.BI " __u8 rsvd37[27];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nmravn" 12
+NVMe MultiRecord Area Version Number
+.IP "ff" 12
+Form Factor
+.IP "rsvd7" 12
+Reserved
+.IP "i18vpwr" 12
+Initial 1.8 V Power Supply Requirements
+.IP "m18vpwr" 12
+Maximum 1.8 V Power Supply Requirements
+.IP "i33vpwr" 12
+Initial 3.3 V Power Supply Requirements
+.IP "m33vpwr" 12
+Maximum 3.3 V Power Supply Requirements
+.IP "rsvd17" 12
+Reserved
+.IP "m33vapsr" 12
+Maximum 3.3 Vi aux Power Supply Requirements
+.IP "i5vapsr" 12
+Initial 5 V Power Supply Requirements
+.IP "m5vapsr" 12
+Maximum 5 V Power Supply Requirements
+.IP "i12vapsr" 12
+Initial 12 V Power Supply Requirements
+.IP "m12vapsr" 12
+Maximum 12 V Power Supply Requirements
+.IP "mtl" 12
+Maximum Thermal Load
+.IP "tnvmcap" 12
+Total NVM Capacity
+.IP "rsvd37" 12
+Reserved
diff --git a/doc/man/nvme_mi_vpd_ppmra.2 b/doc/man/nvme_mi_vpd_ppmra.2
new file mode 100644
index 0000000..9a2cb9a
--- /dev/null
+++ b/doc/man/nvme_mi_vpd_ppmra.2
@@ -0,0 +1,47 @@
+.TH "libnvme" 9 "struct nvme_mi_vpd_ppmra" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_vpd_ppmra \- NVMe PCIe Port MultiRecord Area
+.SH SYNOPSIS
+struct nvme_mi_vpd_ppmra {
+.br
+.BI " __u8 nppmravn;"
+.br
+.BI " __u8 pn;"
+.br
+.BI " __u8 ppi;"
+.br
+.BI " __u8 ls;"
+.br
+.BI " __u8 mlw;"
+.br
+.BI " __u8 mctp;"
+.br
+.BI " __u8 refccap;"
+.br
+.BI " __u8 pi;"
+.br
+.BI " __u8 rsvd13[3];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nppmravn" 12
+NVMe PCIe Port MultiRecord Area Version Number
+.IP "pn" 12
+PCIe Port Number
+.IP "ppi" 12
+Port Information
+.IP "ls" 12
+PCIe Link Speed
+.IP "mlw" 12
+PCIe Maximum Link Width
+.IP "mctp" 12
+MCTP Support
+.IP "refccap" 12
+Ref Clk Capability
+.IP "pi" 12
+Port Identifier
+.IP "rsvd13" 12
+Reserved
diff --git a/doc/man/nvme_mi_vpd_telem.2 b/doc/man/nvme_mi_vpd_telem.2
new file mode 100644
index 0000000..6e2c6f3
--- /dev/null
+++ b/doc/man/nvme_mi_vpd_telem.2
@@ -0,0 +1,28 @@
+.TH "libnvme" 9 "struct nvme_mi_vpd_telem" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_vpd_telem \- Vital Product Data Element Descriptor
+.SH SYNOPSIS
+struct nvme_mi_vpd_telem {
+.br
+.BI " __u8 type;"
+.br
+.BI " __u8 rev;"
+.br
+.BI " __u8 len;"
+.br
+.BI " __u8 data[0];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "type" 12
+Type of the Element Descriptor
+.IP "rev" 12
+Revision of the Element Descriptor
+.IP "len" 12
+Number of bytes in the Element Descriptor
+.IP "data" 12
+Type-specific information associated with
+the Element Descriptor
diff --git a/doc/man/nvme_mi_vpd_tra.2 b/doc/man/nvme_mi_vpd_tra.2
new file mode 100644
index 0000000..eddac5e
--- /dev/null
+++ b/doc/man/nvme_mi_vpd_tra.2
@@ -0,0 +1,27 @@
+.TH "libnvme" 9 "struct nvme_mi_vpd_tra" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_vpd_tra \- Vital Product Data Topology MultiRecord
+.SH SYNOPSIS
+struct nvme_mi_vpd_tra {
+.br
+.BI " __u8 vn;"
+.br
+.BI " __u8 rsvd6;"
+.br
+.BI " __u8 ec;"
+.br
+.BI " struct nvme_mi_vpd_telem elems[0];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "vn" 12
+Version Number
+.IP "rsvd6" 12
+Reserved
+.IP "ec" 12
+Element Count
+.IP "elems" 12
+Element Descriptor
diff --git a/doc/man/nvme_namespace_attach_ctrls.2 b/doc/man/nvme_namespace_attach_ctrls.2
new file mode 100644
index 0000000..83800d9
--- /dev/null
+++ b/doc/man/nvme_namespace_attach_ctrls.2
@@ -0,0 +1,21 @@
+.TH "nvme_namespace_attach_ctrls" 9 "nvme_namespace_attach_ctrls" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_namespace_attach_ctrls \- Attach namespace to controller(s)
+.SH SYNOPSIS
+.B "int" nvme_namespace_attach_ctrls
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "__u16 num_ctrls " ","
+.BI "__u16 *ctrlist " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace ID to attach
+.IP "num_ctrls" 12
+Number of controllers in ctrlist
+.IP "ctrlist" 12
+List of controller IDs to perform the attach action
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_namespace_detach_ctrls.2 b/doc/man/nvme_namespace_detach_ctrls.2
new file mode 100644
index 0000000..693dab8
--- /dev/null
+++ b/doc/man/nvme_namespace_detach_ctrls.2
@@ -0,0 +1,21 @@
+.TH "nvme_namespace_detach_ctrls" 9 "nvme_namespace_detach_ctrls" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_namespace_detach_ctrls \- Detach namespace from controller(s)
+.SH SYNOPSIS
+.B "int" nvme_namespace_detach_ctrls
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "__u16 num_ctrls " ","
+.BI "__u16 *ctrlist " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace ID to detach
+.IP "num_ctrls" 12
+Number of controllers in ctrlist
+.IP "ctrlist" 12
+List of controller IDs to perform the detach action
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_namespace_filter.2 b/doc/man/nvme_namespace_filter.2
new file mode 100644
index 0000000..d812134
--- /dev/null
+++ b/doc/man/nvme_namespace_filter.2
@@ -0,0 +1,11 @@
+.TH "nvme_namespace_filter" 9 "nvme_namespace_filter" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_namespace_filter \- Filter for namespaces
+.SH SYNOPSIS
+.B "int" nvme_namespace_filter
+.BI "(const struct dirent *d " ");"
+.SH ARGUMENTS
+.IP "d" 12
+dirent to check
+.SH "RETURN"
+1 if \fId\fP matches, 0 otherwise
diff --git a/doc/man/nvme_namespace_first_path.2 b/doc/man/nvme_namespace_first_path.2
new file mode 100644
index 0000000..5cbc1a3
--- /dev/null
+++ b/doc/man/nvme_namespace_first_path.2
@@ -0,0 +1,11 @@
+.TH "nvme_namespace_first_path" 9 "nvme_namespace_first_path" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_namespace_first_path \- Start path iterator
+.SH SYNOPSIS
+.B "nvme_path_t" nvme_namespace_first_path
+.BI "(nvme_ns_t ns " ");"
+.SH ARGUMENTS
+.IP "ns" 12
+Namespace instance
+.SH "RETURN"
+First \fInvme_path_t\fP object of an \fIns\fP iterator
diff --git a/doc/man/nvme_namespace_for_each_path.2 b/doc/man/nvme_namespace_for_each_path.2
new file mode 100644
index 0000000..1631576
--- /dev/null
+++ b/doc/man/nvme_namespace_for_each_path.2
@@ -0,0 +1,12 @@
+.TH "nvme_namespace_for_each_path" 9 "nvme_namespace_for_each_path" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_namespace_for_each_path \- Traverse paths
+.SH SYNOPSIS
+.B "nvme_namespace_for_each_path
+.BI "(n " ","
+.BI "p " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.IP "p" 12
+\fInvme_path_t\fP object
diff --git a/doc/man/nvme_namespace_for_each_path_safe.2 b/doc/man/nvme_namespace_for_each_path_safe.2
new file mode 100644
index 0000000..5e580c1
--- /dev/null
+++ b/doc/man/nvme_namespace_for_each_path_safe.2
@@ -0,0 +1,15 @@
+.TH "nvme_namespace_for_each_path_safe" 9 "nvme_namespace_for_each_path_safe" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_namespace_for_each_path_safe \- Traverse paths
+.SH SYNOPSIS
+.B "nvme_namespace_for_each_path_safe
+.BI "(n " ","
+.BI "p " ","
+.BI "_p " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.IP "p" 12
+\fInvme_path_t\fP object
+.IP "_p" 12
+A \fInvme_path_t_node\fP to use as temporary storage
diff --git a/doc/man/nvme_namespace_next_path.2 b/doc/man/nvme_namespace_next_path.2
new file mode 100644
index 0000000..1e6453f
--- /dev/null
+++ b/doc/man/nvme_namespace_next_path.2
@@ -0,0 +1,14 @@
+.TH "nvme_namespace_next_path" 9 "nvme_namespace_next_path" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_namespace_next_path \- Next path iterator
+.SH SYNOPSIS
+.B "nvme_path_t" nvme_namespace_next_path
+.BI "(nvme_ns_t ns " ","
+.BI "nvme_path_t p " ");"
+.SH ARGUMENTS
+.IP "ns" 12
+Namespace instance
+.IP "p" 12
+Previous \fInvme_path_t\fP object of an \fIns\fP iterator
+.SH "RETURN"
+Next \fInvme_path_t\fP object of an \fIns\fP iterator
diff --git a/doc/man/nvme_nd_ns_fpi.2 b/doc/man/nvme_nd_ns_fpi.2
new file mode 100644
index 0000000..9f59b2f
--- /dev/null
+++ b/doc/man/nvme_nd_ns_fpi.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "enum nvme_nd_ns_fpi" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_nd_ns_fpi \- If a format operation is in progress, this field indicates the percentage of the namespace that remains to be formatted.
+.SH SYNOPSIS
+enum nvme_nd_ns_fpi {
+.br
+.BI " NVME_NS_FPI_REMAINING"
+,
+.br
+.br
+.BI " NVME_NS_FPI_SUPPORTED"
+
+};
+.SH Constants
+.IP "NVME_NS_FPI_REMAINING" 12
+Mask to get the format percent remaining value
+.IP "NVME_NS_FPI_SUPPORTED" 12
+If set, indicates that the namespace supports the
+Format Progress Indicator defined for the field.
diff --git a/doc/man/nvme_next_host.2 b/doc/man/nvme_next_host.2
new file mode 100644
index 0000000..a6023c9
--- /dev/null
+++ b/doc/man/nvme_next_host.2
@@ -0,0 +1,14 @@
+.TH "nvme_next_host" 9 "nvme_next_host" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_next_host \- Next host iterator
+.SH SYNOPSIS
+.B "nvme_host_t" nvme_next_host
+.BI "(nvme_root_t r " ","
+.BI "nvme_host_t h " ");"
+.SH ARGUMENTS
+.IP "r" 12
+\fInvme_root_t\fP object
+.IP "h" 12
+Previous \fInvme_host_t\fP iterator
+.SH "RETURN"
+Next \fInvme_host_t\fP object in an iterator
diff --git a/doc/man/nvme_next_subsystem.2 b/doc/man/nvme_next_subsystem.2
new file mode 100644
index 0000000..4e0ba64
--- /dev/null
+++ b/doc/man/nvme_next_subsystem.2
@@ -0,0 +1,14 @@
+.TH "nvme_next_subsystem" 9 "nvme_next_subsystem" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_next_subsystem \- Next subsystem iterator
+.SH SYNOPSIS
+.B "nvme_subsystem_t" nvme_next_subsystem
+.BI "(nvme_host_t h " ","
+.BI "nvme_subsystem_t s " ");"
+.SH ARGUMENTS
+.IP "h" 12
+\fInvme_host_t\fP object
+.IP "s" 12
+Previous \fInvme_subsystem_t\fP iterator
+.SH "RETURN"
+next \fInvme_subsystem_t\fP object in an iterator
diff --git a/doc/man/nvme_ns_attach.2 b/doc/man/nvme_ns_attach.2
new file mode 100644
index 0000000..e506dad
--- /dev/null
+++ b/doc/man/nvme_ns_attach.2
@@ -0,0 +1,12 @@
+.TH "nvme_ns_attach" 9 "nvme_ns_attach" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_attach \- Attach or detach namespace to controller(s)
+.SH SYNOPSIS
+.B "int" nvme_ns_attach
+.BI "(struct nvme_ns_attach_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_ns_attach_args\fP Argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_ns_attach_ctrls.2 b/doc/man/nvme_ns_attach_ctrls.2
new file mode 100644
index 0000000..99f02dc
--- /dev/null
+++ b/doc/man/nvme_ns_attach_ctrls.2
@@ -0,0 +1,18 @@
+.TH "nvme_ns_attach_ctrls" 9 "nvme_ns_attach_ctrls" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_attach_ctrls \- Attach namespace to controllers
+.SH SYNOPSIS
+.B "int" nvme_ns_attach_ctrls
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_ctrl_list *ctrlist " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace ID to attach
+.IP "ctrlist" 12
+Controller list to modify attachment state of nsid
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_ns_attach_sel.2 b/doc/man/nvme_ns_attach_sel.2
new file mode 100644
index 0000000..3cad00e
--- /dev/null
+++ b/doc/man/nvme_ns_attach_sel.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvme_ns_attach_sel" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_ns_attach_sel \- Namespace Attachment - Select
+.SH SYNOPSIS
+enum nvme_ns_attach_sel {
+.br
+.BI " NVME_NS_ATTACH_SEL_CTRL_ATTACH"
+,
+.br
+.br
+.BI " NVME_NS_ATTACH_SEL_CTRL_DEATTACH"
+
+};
+.SH Constants
+.IP "NVME_NS_ATTACH_SEL_CTRL_ATTACH" 12
+Namespace attach selection
+.IP "NVME_NS_ATTACH_SEL_CTRL_DEATTACH" 12
+Namespace detach selection
diff --git a/doc/man/nvme_ns_compare.2 b/doc/man/nvme_ns_compare.2
new file mode 100644
index 0000000..b1ae3c3
--- /dev/null
+++ b/doc/man/nvme_ns_compare.2
@@ -0,0 +1,20 @@
+.TH "nvme_ns_compare" 9 "nvme_ns_compare" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_compare \- Compare data on a namespace
+.SH SYNOPSIS
+.B "int" nvme_ns_compare
+.BI "(nvme_ns_t n " ","
+.BI "void *buf " ","
+.BI "off_t offset " ","
+.BI "size_t count " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.IP "buf" 12
+Buffer with data to be compared
+.IP "offset" 12
+LBA offset of \fIn\fP
+.IP "count" 12
+Number of sectors in \fIbuf\fP
+.SH "RETURN"
+Number of sectors compared
diff --git a/doc/man/nvme_ns_detach_ctrls.2 b/doc/man/nvme_ns_detach_ctrls.2
new file mode 100644
index 0000000..a0869ad
--- /dev/null
+++ b/doc/man/nvme_ns_detach_ctrls.2
@@ -0,0 +1,18 @@
+.TH "nvme_ns_detach_ctrls" 9 "nvme_ns_detach_ctrls" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_detach_ctrls \- Detach namespace from controllers
+.SH SYNOPSIS
+.B "int" nvme_ns_detach_ctrls
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_ctrl_list *ctrlist " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace ID to detach
+.IP "ctrlist" 12
+Controller list to modify attachment state of nsid
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_ns_flush.2 b/doc/man/nvme_ns_flush.2
new file mode 100644
index 0000000..04acee3
--- /dev/null
+++ b/doc/man/nvme_ns_flush.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_flush" 9 "nvme_ns_flush" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_flush \- Flush data to a namespace
+.SH SYNOPSIS
+.B "int" nvme_ns_flush
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+0 on success, -1 on error.
diff --git a/doc/man/nvme_ns_get_csi.2 b/doc/man/nvme_ns_get_csi.2
new file mode 100644
index 0000000..a94fe51
--- /dev/null
+++ b/doc/man/nvme_ns_get_csi.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_csi" 9 "nvme_ns_get_csi" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_csi \- Command set identifier of a namespace
+.SH SYNOPSIS
+.B "enum nvme_csi" nvme_ns_get_csi
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+The namespace's command set identifier in use
diff --git a/doc/man/nvme_ns_get_ctrl.2 b/doc/man/nvme_ns_get_ctrl.2
new file mode 100644
index 0000000..666e2f8
--- /dev/null
+++ b/doc/man/nvme_ns_get_ctrl.2
@@ -0,0 +1,13 @@
+.TH "nvme_ns_get_ctrl" 9 "nvme_ns_get_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_ctrl \- &nvme_ctrl_t of a namespace
+.SH SYNOPSIS
+.B "nvme_ctrl_t" nvme_ns_get_ctrl
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "DESCRIPTION"
+nvme_ctrl_t object may be NULL for a multipathed namespace
+.SH "RETURN"
+nvme_ctrl_t object of \fIn\fP if present
diff --git a/doc/man/nvme_ns_get_eui64.2 b/doc/man/nvme_ns_get_eui64.2
new file mode 100644
index 0000000..6f53422
--- /dev/null
+++ b/doc/man/nvme_ns_get_eui64.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_eui64" 9 "nvme_ns_get_eui64" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_eui64 \- 64-bit eui of a namespace
+.SH SYNOPSIS
+.B "const uint8_t *" nvme_ns_get_eui64
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+A pointer to the 64-bit eui
diff --git a/doc/man/nvme_ns_get_fd.2 b/doc/man/nvme_ns_get_fd.2
new file mode 100644
index 0000000..0ff82d5
--- /dev/null
+++ b/doc/man/nvme_ns_get_fd.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_fd" 9 "nvme_ns_get_fd" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_fd \- Get associated file descriptor
+.SH SYNOPSIS
+.B "int" nvme_ns_get_fd
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+File descriptor associated with \fIn\fP or -1
diff --git a/doc/man/nvme_ns_get_firmware.2 b/doc/man/nvme_ns_get_firmware.2
new file mode 100644
index 0000000..d4a9c68
--- /dev/null
+++ b/doc/man/nvme_ns_get_firmware.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_firmware" 9 "nvme_ns_get_firmware" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_firmware \- Firmware string of a namespace
+.SH SYNOPSIS
+.B "const char *" nvme_ns_get_firmware
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+Firmware string of \fIn\fP
diff --git a/doc/man/nvme_ns_get_generic_name.2 b/doc/man/nvme_ns_get_generic_name.2
new file mode 100644
index 0000000..8dcd9fb
--- /dev/null
+++ b/doc/man/nvme_ns_get_generic_name.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_generic_name" 9 "nvme_ns_get_generic_name" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_generic_name \- Returns name of generic namespace chardev.
+.SH SYNOPSIS
+.B "const char *" nvme_ns_get_generic_name
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+Name of generic namespace chardev
diff --git a/doc/man/nvme_ns_get_lba_count.2 b/doc/man/nvme_ns_get_lba_count.2
new file mode 100644
index 0000000..f614362
--- /dev/null
+++ b/doc/man/nvme_ns_get_lba_count.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_lba_count" 9 "nvme_ns_get_lba_count" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_lba_count \- LBA count of a namespace
+.SH SYNOPSIS
+.B "uint64_t" nvme_ns_get_lba_count
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+LBA count of \fIn\fP
diff --git a/doc/man/nvme_ns_get_lba_size.2 b/doc/man/nvme_ns_get_lba_size.2
new file mode 100644
index 0000000..bd57491
--- /dev/null
+++ b/doc/man/nvme_ns_get_lba_size.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_lba_size" 9 "nvme_ns_get_lba_size" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_lba_size \- LBA size of a namespace
+.SH SYNOPSIS
+.B "int" nvme_ns_get_lba_size
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+LBA size of \fIn\fP
diff --git a/doc/man/nvme_ns_get_lba_util.2 b/doc/man/nvme_ns_get_lba_util.2
new file mode 100644
index 0000000..fc82c51
--- /dev/null
+++ b/doc/man/nvme_ns_get_lba_util.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_lba_util" 9 "nvme_ns_get_lba_util" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_lba_util \- LBA utilization of a namespace
+.SH SYNOPSIS
+.B "uint64_t" nvme_ns_get_lba_util
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+LBA utilization of \fIn\fP
diff --git a/doc/man/nvme_ns_get_meta_size.2 b/doc/man/nvme_ns_get_meta_size.2
new file mode 100644
index 0000000..75e1d1c
--- /dev/null
+++ b/doc/man/nvme_ns_get_meta_size.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_meta_size" 9 "nvme_ns_get_meta_size" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_meta_size \- Metadata size of a namespace
+.SH SYNOPSIS
+.B "int" nvme_ns_get_meta_size
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+Metadata size of \fIn\fP
diff --git a/doc/man/nvme_ns_get_model.2 b/doc/man/nvme_ns_get_model.2
new file mode 100644
index 0000000..dd4f3de
--- /dev/null
+++ b/doc/man/nvme_ns_get_model.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_model" 9 "nvme_ns_get_model" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_model \- Model of a namespace
+.SH SYNOPSIS
+.B "const char *" nvme_ns_get_model
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+Model string of \fIn\fP
diff --git a/doc/man/nvme_ns_get_name.2 b/doc/man/nvme_ns_get_name.2
new file mode 100644
index 0000000..6fce252
--- /dev/null
+++ b/doc/man/nvme_ns_get_name.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_name" 9 "nvme_ns_get_name" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_name \- sysfs name of a namespace
+.SH SYNOPSIS
+.B "const char *" nvme_ns_get_name
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+sysfs name of \fIn\fP
diff --git a/doc/man/nvme_ns_get_nguid.2 b/doc/man/nvme_ns_get_nguid.2
new file mode 100644
index 0000000..43c8cbd
--- /dev/null
+++ b/doc/man/nvme_ns_get_nguid.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_nguid" 9 "nvme_ns_get_nguid" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_nguid \- 128-bit nguid of a namespace
+.SH SYNOPSIS
+.B "const uint8_t *" nvme_ns_get_nguid
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+A pointer to the 128-bit nguid
diff --git a/doc/man/nvme_ns_get_nsid.2 b/doc/man/nvme_ns_get_nsid.2
new file mode 100644
index 0000000..4cd6c6a
--- /dev/null
+++ b/doc/man/nvme_ns_get_nsid.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_nsid" 9 "nvme_ns_get_nsid" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_nsid \- NSID of a namespace
+.SH SYNOPSIS
+.B "int" nvme_ns_get_nsid
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+NSID of \fIn\fP
diff --git a/doc/man/nvme_ns_get_serial.2 b/doc/man/nvme_ns_get_serial.2
new file mode 100644
index 0000000..2320ff6
--- /dev/null
+++ b/doc/man/nvme_ns_get_serial.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_serial" 9 "nvme_ns_get_serial" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_serial \- Serial number of a namespace
+.SH SYNOPSIS
+.B "const char *" nvme_ns_get_serial
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+Serial number string of \fIn\fP
diff --git a/doc/man/nvme_ns_get_subsystem.2 b/doc/man/nvme_ns_get_subsystem.2
new file mode 100644
index 0000000..eb847d0
--- /dev/null
+++ b/doc/man/nvme_ns_get_subsystem.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_subsystem" 9 "nvme_ns_get_subsystem" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_subsystem \- &nvme_subsystem_t of a namespace
+.SH SYNOPSIS
+.B "nvme_subsystem_t" nvme_ns_get_subsystem
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+nvme_subsystem_t object of \fIn\fP
diff --git a/doc/man/nvme_ns_get_sysfs_dir.2 b/doc/man/nvme_ns_get_sysfs_dir.2
new file mode 100644
index 0000000..55d0387
--- /dev/null
+++ b/doc/man/nvme_ns_get_sysfs_dir.2
@@ -0,0 +1,11 @@
+.TH "nvme_ns_get_sysfs_dir" 9 "nvme_ns_get_sysfs_dir" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_sysfs_dir \- sysfs directory of a namespace
+.SH SYNOPSIS
+.B "const char *" nvme_ns_get_sysfs_dir
+.BI "(nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.SH "RETURN"
+sysfs directory name of \fIn\fP
diff --git a/doc/man/nvme_ns_get_uuid.2 b/doc/man/nvme_ns_get_uuid.2
new file mode 100644
index 0000000..f9ea1db
--- /dev/null
+++ b/doc/man/nvme_ns_get_uuid.2
@@ -0,0 +1,14 @@
+.TH "nvme_ns_get_uuid" 9 "nvme_ns_get_uuid" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_get_uuid \- UUID of a namespace
+.SH SYNOPSIS
+.B "void" nvme_ns_get_uuid
+.BI "(nvme_ns_t n " ","
+.BI "unsigned char out[NVME_UUID_LEN] " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.IP "out" 12
+buffer for the UUID
+.SH "DESCRIPTION"
+Copies the namespace's uuid into \fIout\fP
diff --git a/doc/man/nvme_ns_id_desc.2 b/doc/man/nvme_ns_id_desc.2
new file mode 100644
index 0000000..f3568fd
--- /dev/null
+++ b/doc/man/nvme_ns_id_desc.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "struct nvme_ns_id_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_ns_id_desc \- Namespace identifier type descriptor
+.SH SYNOPSIS
+struct nvme_ns_id_desc {
+.br
+.BI " __u8 nidt;"
+.br
+.BI " __u8 nidl;"
+.br
+.BI " __le16 rsvd;"
+.br
+.BI " __u8 nid[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nidt" 12
+Namespace Identifier Type, see \fIenum nvme_ns_id_desc_nidt\fP
+.IP "nidl" 12
+Namespace Identifier Length contains the length in bytes of the
+\fIstruct nvme_id_ns\fP.nid.
+.IP "rsvd" 12
+Reserved
+.IP "nid" 12
+Namespace Identifier contains a value that is globally unique and
+assigned to the namespace when the namespace is created. The length
+is defined in \fIstruct nvme_id_ns\fP.nidl.
diff --git a/doc/man/nvme_ns_id_desc_nidt.2 b/doc/man/nvme_ns_id_desc_nidt.2
new file mode 100644
index 0000000..dfef8a2
--- /dev/null
+++ b/doc/man/nvme_ns_id_desc_nidt.2
@@ -0,0 +1,33 @@
+.TH "libnvme" 9 "enum nvme_ns_id_desc_nidt" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_ns_id_desc_nidt \- Known namespace identifier types
+.SH SYNOPSIS
+enum nvme_ns_id_desc_nidt {
+.br
+.BI " NVME_NIDT_EUI64"
+,
+.br
+.br
+.BI " NVME_NIDT_NGUID"
+,
+.br
+.br
+.BI " NVME_NIDT_UUID"
+,
+.br
+.br
+.BI " NVME_NIDT_CSI"
+
+};
+.SH Constants
+.IP "NVME_NIDT_EUI64" 12
+IEEE Extended Unique Identifier, the NID field contains a
+copy of the EUI64 field in the struct nvme_id_ns.eui64.
+.IP "NVME_NIDT_NGUID" 12
+Namespace Globally Unique Identifier, the NID field
+contains a copy of the NGUID field in struct nvme_id_ns.nguid.
+.IP "NVME_NIDT_UUID" 12
+The NID field contains a 128-bit Universally Unique
+Identifier (UUID) as specified in RFC 4122.
+.IP "NVME_NIDT_CSI" 12
+The NID field contains the command set identifier.
diff --git a/doc/man/nvme_ns_identify.2 b/doc/man/nvme_ns_identify.2
new file mode 100644
index 0000000..ec345b1
--- /dev/null
+++ b/doc/man/nvme_ns_identify.2
@@ -0,0 +1,17 @@
+.TH "nvme_ns_identify" 9 "nvme_ns_identify" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_identify \- Issue an 'identify namespace' command
+.SH SYNOPSIS
+.B "int" nvme_ns_identify
+.BI "(nvme_ns_t n " ","
+.BI "struct nvme_id_ns *ns " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.IP "ns" 12
+\fInvme_id_ns\fP buffer
+.SH "DESCRIPTION"
+Writes the data returned by the 'identify namespace' command
+into \fIns\fP.
+.SH "RETURN"
+0 on success, -1 on error.
diff --git a/doc/man/nvme_ns_identify_descs.2 b/doc/man/nvme_ns_identify_descs.2
new file mode 100644
index 0000000..cd266ed
--- /dev/null
+++ b/doc/man/nvme_ns_identify_descs.2
@@ -0,0 +1,17 @@
+.TH "nvme_ns_identify_descs" 9 "nvme_ns_identify_descs" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_identify_descs \- Issue an 'identify descriptors' command
+.SH SYNOPSIS
+.B "int" nvme_ns_identify_descs
+.BI "(nvme_ns_t n " ","
+.BI "struct nvme_ns_id_desc *descs " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.IP "descs" 12
+List of identify descriptors
+.SH "DESCRIPTION"
+Writes the data returned by the 'identify descriptors' command
+into \fIdescs\fP.
+.SH "RETURN"
+0 on success, -1 on error.
diff --git a/doc/man/nvme_ns_list.2 b/doc/man/nvme_ns_list.2
new file mode 100644
index 0000000..ad01208
--- /dev/null
+++ b/doc/man/nvme_ns_list.2
@@ -0,0 +1,15 @@
+.TH "libnvme" 9 "struct nvme_ns_list" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_ns_list \- Namespace List
+.SH SYNOPSIS
+struct nvme_ns_list {
+.br
+.BI " __le32 ns[NVME_ID_NS_LIST_MAX];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "ns" 12
+Namespace Identifier
diff --git a/doc/man/nvme_ns_metadata_type.2 b/doc/man/nvme_ns_metadata_type.2
new file mode 100644
index 0000000..b427ffb
--- /dev/null
+++ b/doc/man/nvme_ns_metadata_type.2
@@ -0,0 +1,34 @@
+.TH "libnvme" 9 "enum nvme_ns_metadata_type" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_ns_metadata_type \- Namespace Metadata Element Types
+.SH SYNOPSIS
+enum nvme_ns_metadata_type {
+.br
+.BI " NVME_NS_METADATA_OS_NS_NAME"
+,
+.br
+.br
+.BI " NVME_NS_METADATA_PRE_BOOT_NS_NAME"
+,
+.br
+.br
+.BI " NVME_NS_METADATA_OS_NS_QUAL_1"
+,
+.br
+.br
+.BI " NVME_NS_METADATA_OS_NS_QUAL_2"
+
+};
+.SH Constants
+.IP "NVME_NS_METADATA_OS_NS_NAME" 12
+Name of the namespace in the
+operating system
+.IP "NVME_NS_METADATA_PRE_BOOT_NS_NAME" 12
+Name of the namespace in the pre-boot
+environment.
+.IP "NVME_NS_METADATA_OS_NS_QUAL_1" 12
+First qualifier of the Operating System
+Namespace Name.
+.IP "NVME_NS_METADATA_OS_NS_QUAL_2" 12
+Second qualifier of the Operating System
+Namespace Name.
diff --git a/doc/man/nvme_ns_mgmt.2 b/doc/man/nvme_ns_mgmt.2
new file mode 100644
index 0000000..e835501
--- /dev/null
+++ b/doc/man/nvme_ns_mgmt.2
@@ -0,0 +1,12 @@
+.TH "nvme_ns_mgmt" 9 "nvme_ns_mgmt" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_mgmt \- Issue a Namespace management command
+.SH SYNOPSIS
+.B "int" nvme_ns_mgmt
+.BI "(struct nvme_ns_mgmt_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_ns_mgmt_args\fP Argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_ns_mgmt_create.2 b/doc/man/nvme_ns_mgmt_create.2
new file mode 100644
index 0000000..e1bb3df
--- /dev/null
+++ b/doc/man/nvme_ns_mgmt_create.2
@@ -0,0 +1,29 @@
+.TH "nvme_ns_mgmt_create" 9 "nvme_ns_mgmt_create" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_mgmt_create \- Create a non attached namespace
+.SH SYNOPSIS
+.B "int" nvme_ns_mgmt_create
+.BI "(int fd " ","
+.BI "struct nvme_id_ns *ns " ","
+.BI "__u32 *nsid " ","
+.BI "__u32 timeout " ","
+.BI "__u8 csi " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "ns" 12
+Namespace identification that defines ns creation parameters
+.IP "nsid" 12
+On success, set to the namespace id that was created
+.IP "timeout" 12
+Override the default timeout to this value in milliseconds;
+set to 0 to use the system default.
+.IP "csi" 12
+Command Set Identifier
+.SH "DESCRIPTION"
+On successful creation, the namespace exists in the subsystem, but is not
+attached to any controller. Use the \fBnvme_ns_attach_ctrls\fP to assign the
+namespace to one or more controllers.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_ns_mgmt_delete.2 b/doc/man/nvme_ns_mgmt_delete.2
new file mode 100644
index 0000000..3d813e6
--- /dev/null
+++ b/doc/man/nvme_ns_mgmt_delete.2
@@ -0,0 +1,19 @@
+.TH "nvme_ns_mgmt_delete" 9 "nvme_ns_mgmt_delete" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_mgmt_delete \- Delete a non attached namespace
+.SH SYNOPSIS
+.B "int" nvme_ns_mgmt_delete
+.BI "(int fd " ","
+.BI "__u32 nsid " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace identifier to delete
+.SH "DESCRIPTION"
+It is recommended that a namespace being deleted is not attached to any
+controller. Use the \fBnvme_ns_detach_ctrls\fP first if the namespace is still
+attached.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_ns_mgmt_sel.2 b/doc/man/nvme_ns_mgmt_sel.2
new file mode 100644
index 0000000..055dcb2
--- /dev/null
+++ b/doc/man/nvme_ns_mgmt_sel.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvme_ns_mgmt_sel" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_ns_mgmt_sel \- Namespace Management - Select
+.SH SYNOPSIS
+enum nvme_ns_mgmt_sel {
+.br
+.BI " NVME_NS_MGMT_SEL_CREATE"
+,
+.br
+.br
+.BI " NVME_NS_MGMT_SEL_DELETE"
+
+};
+.SH Constants
+.IP "NVME_NS_MGMT_SEL_CREATE" 12
+Namespace Create selection
+.IP "NVME_NS_MGMT_SEL_DELETE" 12
+Namespace Delete selection
diff --git a/doc/man/nvme_ns_read.2 b/doc/man/nvme_ns_read.2
new file mode 100644
index 0000000..af85e0a
--- /dev/null
+++ b/doc/man/nvme_ns_read.2
@@ -0,0 +1,20 @@
+.TH "nvme_ns_read" 9 "nvme_ns_read" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_read \- Read from a namespace
+.SH SYNOPSIS
+.B "int" nvme_ns_read
+.BI "(nvme_ns_t n " ","
+.BI "void *buf " ","
+.BI "off_t offset " ","
+.BI "size_t count " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.IP "buf" 12
+Buffer into which the data will be transferred
+.IP "offset" 12
+LBA offset of \fIn\fP
+.IP "count" 12
+Number of sectors in \fIbuf\fP
+.SH "RETURN"
+Number of sectors read or -1 on error.
diff --git a/doc/man/nvme_ns_rescan.2 b/doc/man/nvme_ns_rescan.2
new file mode 100644
index 0000000..559de47
--- /dev/null
+++ b/doc/man/nvme_ns_rescan.2
@@ -0,0 +1,13 @@
+.TH "nvme_ns_rescan" 9 "nvme_ns_rescan" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_rescan \- Initiate a controller rescan
+.SH SYNOPSIS
+.B "int" nvme_ns_rescan
+.BI "(int fd " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.SH "DESCRIPTION"
+This should only be sent to controller handles, not to namespaces.
+.SH "RETURN"
+0 if a rescan was initiated or -1 with errno set otherwise.
diff --git a/doc/man/nvme_ns_verify.2 b/doc/man/nvme_ns_verify.2
new file mode 100644
index 0000000..3811496
--- /dev/null
+++ b/doc/man/nvme_ns_verify.2
@@ -0,0 +1,17 @@
+.TH "nvme_ns_verify" 9 "nvme_ns_verify" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_verify \- Verify data on a namespace
+.SH SYNOPSIS
+.B "int" nvme_ns_verify
+.BI "(nvme_ns_t n " ","
+.BI "off_t offset " ","
+.BI "size_t count " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.IP "offset" 12
+LBA offset of \fIn\fP
+.IP "count" 12
+Number of sectors to be verified
+.SH "RETURN"
+Number of sectors verified
diff --git a/doc/man/nvme_ns_write.2 b/doc/man/nvme_ns_write.2
new file mode 100644
index 0000000..ddc21cd
--- /dev/null
+++ b/doc/man/nvme_ns_write.2
@@ -0,0 +1,20 @@
+.TH "nvme_ns_write" 9 "nvme_ns_write" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_write \- Write to a namespace
+.SH SYNOPSIS
+.B "int" nvme_ns_write
+.BI "(nvme_ns_t n " ","
+.BI "void *buf " ","
+.BI "off_t offset " ","
+.BI "size_t count " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.IP "buf" 12
+Buffer with data to be written
+.IP "offset" 12
+LBA offset of \fIn\fP
+.IP "count" 12
+Number of sectors in \fIbuf\fP
+.SH "RETURN"
+Number of sectors written or -1 on error
diff --git a/doc/man/nvme_ns_write_protect_cfg.2 b/doc/man/nvme_ns_write_protect_cfg.2
new file mode 100644
index 0000000..eebca9c
--- /dev/null
+++ b/doc/man/nvme_ns_write_protect_cfg.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvme_ns_write_protect_cfg" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_ns_write_protect_cfg \- Write Protection - Write Protection State
+.SH SYNOPSIS
+enum nvme_ns_write_protect_cfg {
+.br
+.BI " NVME_NS_WP_CFG_NONE"
+,
+.br
+.br
+.BI " NVME_NS_WP_CFG_PROTECT"
+,
+.br
+.br
+.BI " NVME_NS_WP_CFG_PROTECT_POWER_CYCLE"
+,
+.br
+.br
+.BI " NVME_NS_WP_CFG_PROTECT_PERMANENT"
+
+};
+.SH Constants
+.IP "NVME_NS_WP_CFG_NONE" 12
+No Write Protect
+.IP "NVME_NS_WP_CFG_PROTECT" 12
+Write Protect
+.IP "NVME_NS_WP_CFG_PROTECT_POWER_CYCLE" 12
+Write Protect Until Power Cycle
+.IP "NVME_NS_WP_CFG_PROTECT_PERMANENT" 12
+Permanent Write Protect
diff --git a/doc/man/nvme_ns_write_uncorrectable.2 b/doc/man/nvme_ns_write_uncorrectable.2
new file mode 100644
index 0000000..c3d3b80
--- /dev/null
+++ b/doc/man/nvme_ns_write_uncorrectable.2
@@ -0,0 +1,17 @@
+.TH "nvme_ns_write_uncorrectable" 9 "nvme_ns_write_uncorrectable" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_write_uncorrectable \- Issus a 'write uncorrectable' command
+.SH SYNOPSIS
+.B "int" nvme_ns_write_uncorrectable
+.BI "(nvme_ns_t n " ","
+.BI "off_t offset " ","
+.BI "size_t count " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.IP "offset" 12
+LBA offset in \fIn\fP
+.IP "count" 12
+Number of sectors to be written
+.SH "RETURN"
+Number of sectors written
diff --git a/doc/man/nvme_ns_write_zeros.2 b/doc/man/nvme_ns_write_zeros.2
new file mode 100644
index 0000000..adecc20
--- /dev/null
+++ b/doc/man/nvme_ns_write_zeros.2
@@ -0,0 +1,17 @@
+.TH "nvme_ns_write_zeros" 9 "nvme_ns_write_zeros" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_ns_write_zeros \- Write zeros to a namespace
+.SH SYNOPSIS
+.B "int" nvme_ns_write_zeros
+.BI "(nvme_ns_t n " ","
+.BI "off_t offset " ","
+.BI "size_t count " ");"
+.SH ARGUMENTS
+.IP "n" 12
+Namespace instance
+.IP "offset" 12
+LBA offset in \fIn\fP
+.IP "count" 12
+Number of sectors to be written
+.SH "RETURN"
+Number of sectors written
diff --git a/doc/man/nvme_nss_hw_err_event.2 b/doc/man/nvme_nss_hw_err_event.2
new file mode 100644
index 0000000..1ea2151
--- /dev/null
+++ b/doc/man/nvme_nss_hw_err_event.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_nss_hw_err_event" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_nss_hw_err_event \- NVM Subsystem Hardware Error Event
+.SH SYNOPSIS
+struct nvme_nss_hw_err_event {
+.br
+.BI " __le16 nss_hw_err_event_code;"
+.br
+.BI " __u8 rsvd2[2];"
+.br
+.BI " __u8 *add_hw_err_info;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nss_hw_err_event_code" 12
+NVM Subsystem Hardware Error Event Code
+.IP "rsvd2" 12
+Reserved
+.IP "add_hw_err_info" 12
+Additional Hardware Error Information
diff --git a/doc/man/nvme_nvm_id_ns.2 b/doc/man/nvme_nvm_id_ns.2
new file mode 100644
index 0000000..4f839de
--- /dev/null
+++ b/doc/man/nvme_nvm_id_ns.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "struct nvme_nvm_id_ns" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_nvm_id_ns \- NVME Command Set I/O Command Set Specific Identify Namespace Data Structure
+.SH SYNOPSIS
+struct nvme_nvm_id_ns {
+.br
+.BI " __le64 lbstm;"
+.br
+.BI " __u8 pic;"
+.br
+.BI " __u8 rsvd9[3];"
+.br
+.BI " __le32 elbaf[64];"
+.br
+.BI " __u8 rsvd268[3828];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "lbstm" 12
+Logical Block Storage Tag Mask
+.IP "pic" 12
+Protection Information Capabilities
+.IP "rsvd9" 12
+Reserved
+.IP "elbaf" 12
+List of Extended LBA Format Support
+.IP "rsvd268" 12
+Reserved
diff --git a/doc/man/nvme_nvm_id_ns_elbaf.2 b/doc/man/nvme_nvm_id_ns_elbaf.2
new file mode 100644
index 0000000..e34c953
--- /dev/null
+++ b/doc/man/nvme_nvm_id_ns_elbaf.2
@@ -0,0 +1,20 @@
+.TH "libnvme" 9 "enum nvme_nvm_id_ns_elbaf" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_nvm_id_ns_elbaf \- This field indicates the extended LBA format
+.SH SYNOPSIS
+enum nvme_nvm_id_ns_elbaf {
+.br
+.BI " NVME_NVM_ELBAF_STS_MASK"
+,
+.br
+.br
+.BI " NVME_NVM_ELBAF_PIF_MASK"
+
+};
+.SH Constants
+.IP "NVME_NVM_ELBAF_STS_MASK" 12
+Mask to get the storage tag size used to determine
+the variable-sized storage tag/reference tag fields
+.IP "NVME_NVM_ELBAF_PIF_MASK" 12
+Mask to get the protection information format for
+the extended LBA format.
diff --git a/doc/man/nvme_nvm_identify_ctrl.2 b/doc/man/nvme_nvm_identify_ctrl.2
new file mode 100644
index 0000000..48e433f
--- /dev/null
+++ b/doc/man/nvme_nvm_identify_ctrl.2
@@ -0,0 +1,18 @@
+.TH "nvme_nvm_identify_ctrl" 9 "nvme_nvm_identify_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_nvm_identify_ctrl \- Identify controller data
+.SH SYNOPSIS
+.B "int" nvme_nvm_identify_ctrl
+.BI "(int fd " ","
+.BI "struct nvme_id_ctrl_nvm *id " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "id" 12
+User space destination address to transfer the data
+.SH "DESCRIPTION"
+Return an identify controller data structure to the host of
+processing controller.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_nvmeset_pl_status.2 b/doc/man/nvme_nvmeset_pl_status.2
new file mode 100644
index 0000000..9ba17bf
--- /dev/null
+++ b/doc/man/nvme_nvmeset_pl_status.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "enum nvme_nvmeset_pl_status" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_nvmeset_pl_status \- Predictable Latency Per NVM Set Log - Status
+.SH SYNOPSIS
+enum nvme_nvmeset_pl_status {
+.br
+.BI " NVME_NVMSET_PL_STATUS_DISABLED"
+,
+.br
+.br
+.BI " NVME_NVMSET_PL_STATUS_DTWIN"
+,
+.br
+.br
+.BI " NVME_NVMSET_PL_STATUS_NDWIN"
+
+};
+.SH Constants
+.IP "NVME_NVMSET_PL_STATUS_DISABLED" 12
+Not used (Predictable Latency Mode not enabled)
+.IP "NVME_NVMSET_PL_STATUS_DTWIN" 12
+Deterministic Window (DTWIN)
+.IP "NVME_NVMSET_PL_STATUS_NDWIN" 12
+Non-Deterministic Window (NDWIN)
diff --git a/doc/man/nvme_nvmset_attr.2 b/doc/man/nvme_nvmset_attr.2
new file mode 100644
index 0000000..8dae126
--- /dev/null
+++ b/doc/man/nvme_nvmset_attr.2
@@ -0,0 +1,46 @@
+.TH "libnvme" 9 "struct nvme_nvmset_attr" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_nvmset_attr \- NVM Set Attributes Entry
+.SH SYNOPSIS
+struct nvme_nvmset_attr {
+.br
+.BI " __le16 nvmsetid;"
+.br
+.BI " __le16 endgid;"
+.br
+.BI " __u8 rsvd4[4];"
+.br
+.BI " __le32 rr4kt;"
+.br
+.BI " __le32 ows;"
+.br
+.BI " __u8 tnvmsetcap[16];"
+.br
+.BI " __u8 unvmsetcap[16];"
+.br
+.BI " __u8 rsvd48[80];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nvmsetid" 12
+NVM Set Identifier
+.IP "endgid" 12
+Endurance Group Identifier
+.IP "rsvd4" 12
+Reserved
+.IP "rr4kt" 12
+Random 4 KiB Read Typical indicates the typical
+time to complete a 4 KiB random read in 100 nanosecond units
+when the NVM Set is in a Predictable Latency Mode Deterministic
+Window and there is 1 outstanding command per NVM Set.
+.IP "ows" 12
+Optimal Write Size
+.IP "tnvmsetcap" 12
+Total NVM Set Capacity
+.IP "unvmsetcap" 12
+Unallocated NVM Set Capacity
+.IP "rsvd48" 12
+Reserved
diff --git a/doc/man/nvme_nvmset_pl_events.2 b/doc/man/nvme_nvmset_pl_events.2
new file mode 100644
index 0000000..9ebe442
--- /dev/null
+++ b/doc/man/nvme_nvmset_pl_events.2
@@ -0,0 +1,40 @@
+.TH "libnvme" 9 "enum nvme_nvmset_pl_events" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_nvmset_pl_events \- Predictable Latency Per NVM Set Log - Event Type
+.SH SYNOPSIS
+enum nvme_nvmset_pl_events {
+.br
+.BI " NVME_NVMSET_PL_EVENT_DTWIN_READ_WARN"
+,
+.br
+.br
+.BI " NVME_NVMSET_PL_EVENT_DTWIN_WRITE_WARN"
+,
+.br
+.br
+.BI " NVME_NVMSET_PL_EVENT_DTWIN_TIME_WARN"
+,
+.br
+.br
+.BI " NVME_NVMSET_PL_EVENT_DTWIN_EXCEEDED"
+,
+.br
+.br
+.BI " NVME_NVMSET_PL_EVENT_DTWIN_EXCURSION"
+
+};
+.SH Constants
+.IP "NVME_NVMSET_PL_EVENT_DTWIN_READ_WARN" 12
+DTWIN Reads Warning
+.IP "NVME_NVMSET_PL_EVENT_DTWIN_WRITE_WARN" 12
+DTWIN Writes Warning
+.IP "NVME_NVMSET_PL_EVENT_DTWIN_TIME_WARN" 12
+DTWIN Time Warning
+.IP "NVME_NVMSET_PL_EVENT_DTWIN_EXCEEDED" 12
+Autonomous transition from DTWIN
+to NDWIN due to typical or
+maximum value exceeded
+.IP "NVME_NVMSET_PL_EVENT_DTWIN_EXCURSION" 12
+Autonomous transition from DTWIN
+to NDWIN due to Deterministic
+Excursion
diff --git a/doc/man/nvme_nvmset_predictable_lat_log.2 b/doc/man/nvme_nvmset_predictable_lat_log.2
new file mode 100644
index 0000000..afe4302
--- /dev/null
+++ b/doc/man/nvme_nvmset_predictable_lat_log.2
@@ -0,0 +1,67 @@
+.TH "libnvme" 9 "struct nvme_nvmset_predictable_lat_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_nvmset_predictable_lat_log \- Predictable Latency Mode - Deterministic Threshold Configuration Data
+.SH SYNOPSIS
+struct nvme_nvmset_predictable_lat_log {
+.br
+.BI " __u8 status;"
+.br
+.BI " __u8 rsvd1;"
+.br
+.BI " __le16 event_type;"
+.br
+.BI " __u8 rsvd4[28];"
+.br
+.BI " __le64 dtwin_rt;"
+.br
+.BI " __le64 dtwin_wt;"
+.br
+.BI " __le64 dtwin_tmax;"
+.br
+.BI " __le64 ndwin_tmin_hi;"
+.br
+.BI " __le64 ndwin_tmin_lo;"
+.br
+.BI " __u8 rsvd72[56];"
+.br
+.BI " __le64 dtwin_re;"
+.br
+.BI " __le64 dtwin_we;"
+.br
+.BI " __le64 dtwin_te;"
+.br
+.BI " __u8 rsvd152[360];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "status" 12
+Status
+.IP "rsvd1" 12
+Reserved
+.IP "event_type" 12
+Event Type
+.IP "rsvd4" 12
+Reserved
+.IP "dtwin_rt" 12
+DTWIN Reads Typical
+.IP "dtwin_wt" 12
+DTWIN Writes Typical
+.IP "dtwin_tmax" 12
+DTWIN Time Maximum
+.IP "ndwin_tmin_hi" 12
+NDWIN Time Minimum High
+.IP "ndwin_tmin_lo" 12
+NDWIN Time Minimum Low
+.IP "rsvd72" 12
+Reserved
+.IP "dtwin_re" 12
+DTWIN Reads Estimate
+.IP "dtwin_we" 12
+DTWIN Writes Estimate
+.IP "dtwin_te" 12
+DTWIN Time Estimate
+.IP "rsvd152" 12
+Reserved
diff --git a/doc/man/nvme_open.2 b/doc/man/nvme_open.2
new file mode 100644
index 0000000..d9ae3e7
--- /dev/null
+++ b/doc/man/nvme_open.2
@@ -0,0 +1,15 @@
+.TH "nvme_open" 9 "nvme_open" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_open \- Open an nvme controller or namespace device
+.SH SYNOPSIS
+.B "int" nvme_open
+.BI "(const char *name " ");"
+.SH ARGUMENTS
+.IP "name" 12
+The basename of the device to open
+.SH "DESCRIPTION"
+This will look for the handle in /dev/ and validate the name and filetype
+match linux conventions.
+.SH "RETURN"
+A file descriptor for the device on a successful open, or -1 with
+errno set otherwise.
diff --git a/doc/man/nvme_passthru_cmd.2 b/doc/man/nvme_passthru_cmd.2
new file mode 100644
index 0000000..4c47164
--- /dev/null
+++ b/doc/man/nvme_passthru_cmd.2
@@ -0,0 +1,83 @@
+.TH "libnvme" 9 "struct nvme_passthru_cmd" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_passthru_cmd \- nvme passthrough command structure
+.SH SYNOPSIS
+struct nvme_passthru_cmd {
+.br
+.BI " __u8 opcode;"
+.br
+.BI " __u8 flags;"
+.br
+.BI " __u16 rsvd1;"
+.br
+.BI " __u32 nsid;"
+.br
+.BI " __u32 cdw2;"
+.br
+.BI " __u32 cdw3;"
+.br
+.BI " __u64 metadata;"
+.br
+.BI " __u64 addr;"
+.br
+.BI " __u32 metadata_len;"
+.br
+.BI " __u32 data_len;"
+.br
+.BI " __u32 cdw10;"
+.br
+.BI " __u32 cdw11;"
+.br
+.BI " __u32 cdw12;"
+.br
+.BI " __u32 cdw13;"
+.br
+.BI " __u32 cdw14;"
+.br
+.BI " __u32 cdw15;"
+.br
+.BI " __u32 timeout_ms;"
+.br
+.BI " __u32 result;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "opcode" 12
+Operation code, see \fIenum nvme_io_opcodes\fP and \fIenum nvme_admin_opcodes\fP
+.IP "flags" 12
+Not supported: intended for command flags (eg: SGL, FUSE)
+.IP "rsvd1" 12
+Reserved for future use
+.IP "nsid" 12
+Namespace Identifier, or Fabrics type
+.IP "cdw2" 12
+Command Dword 2 (no spec defined use)
+.IP "cdw3" 12
+Command Dword 3 (no spec defined use)
+.IP "metadata" 12
+User space address to metadata buffer (NULL if not used)
+.IP "addr" 12
+User space address to data buffer (NULL if not used)
+.IP "metadata_len" 12
+Metadata buffer transfer length
+.IP "data_len" 12
+Data buffer transfer length
+.IP "cdw10" 12
+Command Dword 10 (command specific)
+.IP "cdw11" 12
+Command Dword 11 (command specific)
+.IP "cdw12" 12
+Command Dword 12 (command specific)
+.IP "cdw13" 12
+Command Dword 13 (command specific)
+.IP "cdw14" 12
+Command Dword 14 (command specific)
+.IP "cdw15" 12
+Command Dword 15 (command specific)
+.IP "timeout_ms" 12
+If non-zero, overrides system default timeout in milliseconds
+.IP "result" 12
+Set on completion to the command's CQE DWORD 0 controller response
diff --git a/doc/man/nvme_passthru_cmd64.2 b/doc/man/nvme_passthru_cmd64.2
new file mode 100644
index 0000000..a4cc2f3
--- /dev/null
+++ b/doc/man/nvme_passthru_cmd64.2
@@ -0,0 +1,87 @@
+.TH "libnvme" 9 "struct nvme_passthru_cmd64" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_passthru_cmd64 \- 64-bit nvme passthrough command structure
+.SH SYNOPSIS
+struct nvme_passthru_cmd64 {
+.br
+.BI " __u8 opcode;"
+.br
+.BI " __u8 flags;"
+.br
+.BI " __u16 rsvd1;"
+.br
+.BI " __u32 nsid;"
+.br
+.BI " __u32 cdw2;"
+.br
+.BI " __u32 cdw3;"
+.br
+.BI " __u64 metadata;"
+.br
+.BI " __u64 addr;"
+.br
+.BI " __u32 metadata_len;"
+.br
+.BI " __u32 data_len;"
+.br
+.BI " __u32 cdw10;"
+.br
+.BI " __u32 cdw11;"
+.br
+.BI " __u32 cdw12;"
+.br
+.BI " __u32 cdw13;"
+.br
+.BI " __u32 cdw14;"
+.br
+.BI " __u32 cdw15;"
+.br
+.BI " __u32 timeout_ms;"
+.br
+.BI " __u32 rsvd2;"
+.br
+.BI " __u64 result;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "opcode" 12
+Operation code, see \fIenum nvme_io_opcodes\fP and \fIenum nvme_admin_opcodes\fP
+.IP "flags" 12
+Not supported: intended for command flags (eg: SGL, FUSE)
+.IP "rsvd1" 12
+Reserved for future use
+.IP "nsid" 12
+Namespace Identifier, or Fabrics type
+.IP "cdw2" 12
+Command Dword 2 (no spec defined use)
+.IP "cdw3" 12
+Command Dword 3 (no spec defined use)
+.IP "metadata" 12
+User space address to metadata buffer (NULL if not used)
+.IP "addr" 12
+User space address to data buffer (NULL if not used)
+.IP "metadata_len" 12
+Metadata buffer transfer length
+.IP "data_len" 12
+Data buffer transfer length
+.IP "cdw10" 12
+Command Dword 10 (command specific)
+.IP "cdw11" 12
+Command Dword 11 (command specific)
+.IP "cdw12" 12
+Command Dword 12 (command specific)
+.IP "cdw13" 12
+Command Dword 13 (command specific)
+.IP "cdw14" 12
+Command Dword 14 (command specific)
+.IP "cdw15" 12
+Command Dword 15 (command specific)
+.IP "timeout_ms" 12
+If non-zero, overrides system default timeout in milliseconds
+.IP "rsvd2" 12
+Reserved for future use (and fills an implicit struct pad
+.IP "result" 12
+Set on completion to the command's CQE DWORD 0-1 controller response
diff --git a/doc/man/nvme_path_get_ana_state.2 b/doc/man/nvme_path_get_ana_state.2
new file mode 100644
index 0000000..840d533
--- /dev/null
+++ b/doc/man/nvme_path_get_ana_state.2
@@ -0,0 +1,11 @@
+.TH "nvme_path_get_ana_state" 9 "nvme_path_get_ana_state" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_path_get_ana_state \- ANA state of an nvme_path_t object
+.SH SYNOPSIS
+.B "const char *" nvme_path_get_ana_state
+.BI "(nvme_path_t p " ");"
+.SH ARGUMENTS
+.IP "p" 12
+\fInvme_path_t\fP object
+.SH "RETURN"
+ANA (Asynchronous Namespace Access) state of \fIp\fP
diff --git a/doc/man/nvme_path_get_ctrl.2 b/doc/man/nvme_path_get_ctrl.2
new file mode 100644
index 0000000..759d8ba
--- /dev/null
+++ b/doc/man/nvme_path_get_ctrl.2
@@ -0,0 +1,11 @@
+.TH "nvme_path_get_ctrl" 9 "nvme_path_get_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_path_get_ctrl \- Parent controller of an nvme_path_t object
+.SH SYNOPSIS
+.B "nvme_ctrl_t" nvme_path_get_ctrl
+.BI "(nvme_path_t p " ");"
+.SH ARGUMENTS
+.IP "p" 12
+\fInvme_path_t\fP object
+.SH "RETURN"
+Parent controller if present
diff --git a/doc/man/nvme_path_get_name.2 b/doc/man/nvme_path_get_name.2
new file mode 100644
index 0000000..100556a
--- /dev/null
+++ b/doc/man/nvme_path_get_name.2
@@ -0,0 +1,11 @@
+.TH "nvme_path_get_name" 9 "nvme_path_get_name" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_path_get_name \- sysfs name of an &nvme_path_t object
+.SH SYNOPSIS
+.B "const char *" nvme_path_get_name
+.BI "(nvme_path_t p " ");"
+.SH ARGUMENTS
+.IP "p" 12
+\fInvme_path_t\fP object
+.SH "RETURN"
+sysfs name of \fIp\fP
diff --git a/doc/man/nvme_path_get_ns.2 b/doc/man/nvme_path_get_ns.2
new file mode 100644
index 0000000..515c889
--- /dev/null
+++ b/doc/man/nvme_path_get_ns.2
@@ -0,0 +1,11 @@
+.TH "nvme_path_get_ns" 9 "nvme_path_get_ns" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_path_get_ns \- Parent namespace of an nvme_path_t object
+.SH SYNOPSIS
+.B "nvme_ns_t" nvme_path_get_ns
+.BI "(nvme_path_t p " ");"
+.SH ARGUMENTS
+.IP "p" 12
+\fInvme_path_t\fP object
+.SH "RETURN"
+Parent namespace if present
diff --git a/doc/man/nvme_path_get_sysfs_dir.2 b/doc/man/nvme_path_get_sysfs_dir.2
new file mode 100644
index 0000000..621d309
--- /dev/null
+++ b/doc/man/nvme_path_get_sysfs_dir.2
@@ -0,0 +1,11 @@
+.TH "nvme_path_get_sysfs_dir" 9 "nvme_path_get_sysfs_dir" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_path_get_sysfs_dir \- sysfs directory of an nvme_path_t object
+.SH SYNOPSIS
+.B "const char *" nvme_path_get_sysfs_dir
+.BI "(nvme_path_t p " ");"
+.SH ARGUMENTS
+.IP "p" 12
+\fInvme_path_t\fP object
+.SH "RETURN"
+sysfs directory of \fIp\fP
diff --git a/doc/man/nvme_paths_filter.2 b/doc/man/nvme_paths_filter.2
new file mode 100644
index 0000000..29514c0
--- /dev/null
+++ b/doc/man/nvme_paths_filter.2
@@ -0,0 +1,11 @@
+.TH "nvme_paths_filter" 9 "nvme_paths_filter" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_paths_filter \- Filter for paths
+.SH SYNOPSIS
+.B "int" nvme_paths_filter
+.BI "(const struct dirent *d " ");"
+.SH ARGUMENTS
+.IP "d" 12
+dirent to check
+.SH "RETURN"
+1 if \fId\fP matches, 0 otherwise
diff --git a/doc/man/nvme_persistent_event_entry.2 b/doc/man/nvme_persistent_event_entry.2
new file mode 100644
index 0000000..24a25fa
--- /dev/null
+++ b/doc/man/nvme_persistent_event_entry.2
@@ -0,0 +1,51 @@
+.TH "libnvme" 9 "struct nvme_persistent_event_entry" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_persistent_event_entry \- Persistent Event
+.SH SYNOPSIS
+struct nvme_persistent_event_entry {
+.br
+.BI " __u8 etype;"
+.br
+.BI " __u8 etype_rev;"
+.br
+.BI " __u8 ehl;"
+.br
+.BI " __u8 ehai;"
+.br
+.BI " __le16 cntlid;"
+.br
+.BI " __le64 ets;"
+.br
+.BI " __le16 pelpid;"
+.br
+.BI " __u8 rsvd16[4];"
+.br
+.BI " __le16 vsil;"
+.br
+.BI " __le16 el;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "etype" 12
+Event Type
+.IP "etype_rev" 12
+Event Type Revision
+.IP "ehl" 12
+Event Header Length
+.IP "ehai" 12
+Event Header Additional Info
+.IP "cntlid" 12
+Controller Identifier
+.IP "ets" 12
+Event Timestamp
+.IP "pelpid" 12
+Port Identifier
+.IP "rsvd16" 12
+Reserved
+.IP "vsil" 12
+Vendor Specific Information Length
+.IP "el" 12
+Event Length
diff --git a/doc/man/nvme_persistent_event_log.2 b/doc/man/nvme_persistent_event_log.2
new file mode 100644
index 0000000..f4dfa80
--- /dev/null
+++ b/doc/man/nvme_persistent_event_log.2
@@ -0,0 +1,87 @@
+.TH "libnvme" 9 "struct nvme_persistent_event_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_persistent_event_log \- Persistent Event Log
+.SH SYNOPSIS
+struct nvme_persistent_event_log {
+.br
+.BI " __u8 lid;"
+.br
+.BI " __u8 rsvd1[3];"
+.br
+.BI " __le32 tnev;"
+.br
+.BI " __le64 tll;"
+.br
+.BI " __u8 rv;"
+.br
+.BI " __u8 rsvd17;"
+.br
+.BI " __le16 lhl;"
+.br
+.BI " __le64 ts;"
+.br
+.BI " __u8 poh[16];"
+.br
+.BI " __le64 pcc;"
+.br
+.BI " __le16 vid;"
+.br
+.BI " __le16 ssvid;"
+.br
+.BI " char sn[20];"
+.br
+.BI " char mn[40];"
+.br
+.BI " char subnqn[NVME_NQN_LENGTH];"
+.br
+.BI " __le16 gen_number;"
+.br
+.BI " __le32 rci;"
+.br
+.BI " __u8 rsvd378[102];"
+.br
+.BI " __u8 seb[32];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "lid" 12
+Log Identifier
+.IP "rsvd1" 12
+Reserved
+.IP "tnev" 12
+Total Number of Events
+.IP "tll" 12
+Total Log Length
+.IP "rv" 12
+Log Revision
+.IP "rsvd17" 12
+Reserved
+.IP "lhl" 12
+Log Header Length
+.IP "ts" 12
+Timestamp
+.IP "poh" 12
+Power on Hours
+.IP "pcc" 12
+Power Cycle Count
+.IP "vid" 12
+PCI Vendor ID
+.IP "ssvid" 12
+PCI Subsystem Vendor ID
+.IP "sn" 12
+Serial Number
+.IP "mn" 12
+Model Number
+.IP "subnqn" 12
+NVM Subsystem NVMe Qualified Name
+.IP "gen_number" 12
+Generation Number
+.IP "rci" 12
+Reporting Context Information
+.IP "rsvd378" 12
+Reserved
+.IP "seb" 12
+Supported Events Bitmap
diff --git a/doc/man/nvme_persistent_event_types.2 b/doc/man/nvme_persistent_event_types.2
new file mode 100644
index 0000000..e7d8de7
--- /dev/null
+++ b/doc/man/nvme_persistent_event_types.2
@@ -0,0 +1,84 @@
+.TH "libnvme" 9 "enum nvme_persistent_event_types" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_persistent_event_types \- Persistent event log events
+.SH SYNOPSIS
+enum nvme_persistent_event_types {
+.br
+.BI " NVME_PEL_SMART_HEALTH_EVENT"
+,
+.br
+.br
+.BI " NVME_PEL_FW_COMMIT_EVENT"
+,
+.br
+.br
+.BI " NVME_PEL_TIMESTAMP_EVENT"
+,
+.br
+.br
+.BI " NVME_PEL_POWER_ON_RESET_EVENT"
+,
+.br
+.br
+.BI " NVME_PEL_NSS_HW_ERROR_EVENT"
+,
+.br
+.br
+.BI " NVME_PEL_CHANGE_NS_EVENT"
+,
+.br
+.br
+.BI " NVME_PEL_FORMAT_START_EVENT"
+,
+.br
+.br
+.BI " NVME_PEL_FORMAT_COMPLETION_EVENT"
+,
+.br
+.br
+.BI " NVME_PEL_SANITIZE_START_EVENT"
+,
+.br
+.br
+.BI " NVME_PEL_SANITIZE_COMPLETION_EVENT"
+,
+.br
+.br
+.BI " NVME_PEL_SET_FEATURE_EVENT"
+,
+.br
+.br
+.BI " NVME_PEL_TELEMETRY_CRT"
+,
+.br
+.br
+.BI " NVME_PEL_THERMAL_EXCURSION_EVENT"
+
+};
+.SH Constants
+.IP "NVME_PEL_SMART_HEALTH_EVENT" 12
+SMART / Health Log Snapshot Event
+.IP "NVME_PEL_FW_COMMIT_EVENT" 12
+Firmware Commit Event
+.IP "NVME_PEL_TIMESTAMP_EVENT" 12
+Timestamp Change Event
+.IP "NVME_PEL_POWER_ON_RESET_EVENT" 12
+Power-on or Reset Event
+.IP "NVME_PEL_NSS_HW_ERROR_EVENT" 12
+NVM Subsystem Hardware Error Event
+.IP "NVME_PEL_CHANGE_NS_EVENT" 12
+Change Namespace Event
+.IP "NVME_PEL_FORMAT_START_EVENT" 12
+Format NVM Start Event
+.IP "NVME_PEL_FORMAT_COMPLETION_EVENT" 12
+Format NVM Completion Event
+.IP "NVME_PEL_SANITIZE_START_EVENT" 12
+Sanitize Start Event
+.IP "NVME_PEL_SANITIZE_COMPLETION_EVENT" 12
+Sanitize Completion Event
+.IP "NVME_PEL_SET_FEATURE_EVENT" 12
+Set Feature Event
+.IP "NVME_PEL_TELEMETRY_CRT" 12
+Telemetry Log Create Event
+.IP "NVME_PEL_THERMAL_EXCURSION_EVENT" 12
+Thermal Excursion Event
diff --git a/doc/man/nvme_pevent_log_action.2 b/doc/man/nvme_pevent_log_action.2
new file mode 100644
index 0000000..fd80ffd
--- /dev/null
+++ b/doc/man/nvme_pevent_log_action.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "enum nvme_pevent_log_action" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_pevent_log_action \- Persistent Event Log - Action
+.SH SYNOPSIS
+enum nvme_pevent_log_action {
+.br
+.BI " NVME_PEVENT_LOG_READ"
+,
+.br
+.br
+.BI " NVME_PEVENT_LOG_EST_CTX_AND_READ"
+,
+.br
+.br
+.BI " NVME_PEVENT_LOG_RELEASE_CTX"
+
+};
+.SH Constants
+.IP "NVME_PEVENT_LOG_READ" 12
+Read Log Data
+.IP "NVME_PEVENT_LOG_EST_CTX_AND_READ" 12
+Establish Context and Read Log Data
+.IP "NVME_PEVENT_LOG_RELEASE_CTX" 12
+Release Context
diff --git a/doc/man/nvme_plm_config.2 b/doc/man/nvme_plm_config.2
new file mode 100644
index 0000000..62893ed
--- /dev/null
+++ b/doc/man/nvme_plm_config.2
@@ -0,0 +1,35 @@
+.TH "libnvme" 9 "struct nvme_plm_config" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_plm_config \- Predictable Latency Mode - Deterministic Threshold Configuration Data Structure
+.SH SYNOPSIS
+struct nvme_plm_config {
+.br
+.BI " __le16 ee;"
+.br
+.BI " __u8 rsvd2[30];"
+.br
+.BI " __le64 dtwinrt;"
+.br
+.BI " __le64 dtwinwt;"
+.br
+.BI " __le64 dtwintt;"
+.br
+.BI " __u8 rsvd56[456];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "ee" 12
+Enable Event
+.IP "rsvd2" 12
+Reserved
+.IP "dtwinrt" 12
+DTWIN Reads Threshold
+.IP "dtwinwt" 12
+DTWIN Writes Threshold
+.IP "dtwintt" 12
+DTWIN Time Threshold
+.IP "rsvd56" 12
+Reserved
diff --git a/doc/man/nvme_pmr_size.2 b/doc/man/nvme_pmr_size.2
new file mode 100644
index 0000000..adf55bc
--- /dev/null
+++ b/doc/man/nvme_pmr_size.2
@@ -0,0 +1,11 @@
+.TH "nvme_pmr_size" 9 "nvme_pmr_size" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_pmr_size \- Calculate size of persistent memory region elasticity buffer
+.SH SYNOPSIS
+.B "__u64" nvme_pmr_size
+.BI "(__u32 pmrebs " ");"
+.SH ARGUMENTS
+.IP "pmrebs" 12
+Value from controller register NVME_REG_PMREBS
+.SH "RETURN"
+size of controller persistent memory buffer in bytes
diff --git a/doc/man/nvme_pmr_throughput.2 b/doc/man/nvme_pmr_throughput.2
new file mode 100644
index 0000000..364126a
--- /dev/null
+++ b/doc/man/nvme_pmr_throughput.2
@@ -0,0 +1,11 @@
+.TH "nvme_pmr_throughput" 9 "nvme_pmr_throughput" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_pmr_throughput \- Calculate throughput of persistent memory buffer
+.SH SYNOPSIS
+.B "__u64" nvme_pmr_throughput
+.BI "(__u32 pmrswtp " ");"
+.SH ARGUMENTS
+.IP "pmrswtp" 12
+Value from controller register NVME_REG_PMRSWTP
+.SH "RETURN"
+throughput of controller persistent memory buffer in bytes/second
diff --git a/doc/man/nvme_power_on_reset_info_list.2 b/doc/man/nvme_power_on_reset_info_list.2
new file mode 100644
index 0000000..327cdb3
--- /dev/null
+++ b/doc/man/nvme_power_on_reset_info_list.2
@@ -0,0 +1,39 @@
+.TH "libnvme" 9 "struct nvme_power_on_reset_info_list" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_power_on_reset_info_list \- Controller Reset Information
+.SH SYNOPSIS
+struct nvme_power_on_reset_info_list {
+.br
+.BI " __le16 cid;"
+.br
+.BI " __u8 fw_act;"
+.br
+.BI " __u8 op_in_prog;"
+.br
+.BI " __u8 rsvd4[12];"
+.br
+.BI " __le32 ctrl_power_cycle;"
+.br
+.BI " __le64 power_on_ml_seconds;"
+.br
+.BI " __le64 ctrl_time_stamp;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "cid" 12
+Controller ID
+.IP "fw_act" 12
+Firmware Activation
+.IP "op_in_prog" 12
+Operation in Progress
+.IP "rsvd4" 12
+Reserved
+.IP "ctrl_power_cycle" 12
+Controller Power Cycle
+.IP "power_on_ml_seconds" 12
+Power on milliseconds
+.IP "ctrl_time_stamp" 12
+Controller Timestamp
diff --git a/doc/man/nvme_primary_ctrl_cap.2 b/doc/man/nvme_primary_ctrl_cap.2
new file mode 100644
index 0000000..8f9c593
--- /dev/null
+++ b/doc/man/nvme_primary_ctrl_cap.2
@@ -0,0 +1,83 @@
+.TH "libnvme" 9 "struct nvme_primary_ctrl_cap" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_primary_ctrl_cap \- Identify - Controller Capabilities Structure
+.SH SYNOPSIS
+struct nvme_primary_ctrl_cap {
+.br
+.BI " __le16 cntlid;"
+.br
+.BI " __le16 portid;"
+.br
+.BI " __u8 crt;"
+.br
+.BI " __u8 rsvd5[27];"
+.br
+.BI " __le32 vqfrt;"
+.br
+.BI " __le32 vqrfa;"
+.br
+.BI " __le16 vqrfap;"
+.br
+.BI " __le16 vqprt;"
+.br
+.BI " __le16 vqfrsm;"
+.br
+.BI " __le16 vqgran;"
+.br
+.BI " __u8 rsvd48[16];"
+.br
+.BI " __le32 vifrt;"
+.br
+.BI " __le32 virfa;"
+.br
+.BI " __le16 virfap;"
+.br
+.BI " __le16 viprt;"
+.br
+.BI " __le16 vifrsm;"
+.br
+.BI " __le16 vigran;"
+.br
+.BI " __u8 rsvd80[4016];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "cntlid" 12
+Controller Identifier
+.IP "portid" 12
+Port Identifier
+.IP "crt" 12
+Controller Resource Types
+.IP "rsvd5" 12
+reserved
+.IP "vqfrt" 12
+VQ Resources Flexible Total
+.IP "vqrfa" 12
+VQ Resources Flexible Assigned
+.IP "vqrfap" 12
+VQ Resources Flexible Allocated to Primary
+.IP "vqprt" 12
+VQ Resources Private Total
+.IP "vqfrsm" 12
+VQ Resources Flexible Secondary Maximum
+.IP "vqgran" 12
+VQ Flexible Resource Preferred Granularity
+.IP "rsvd48" 12
+reserved
+.IP "vifrt" 12
+VI Resources Flexible Total
+.IP "virfa" 12
+VI Resources Flexible Assigned
+.IP "virfap" 12
+VI Resources Flexible Allocated to Primary
+.IP "viprt" 12
+VI Resources Private Total
+.IP "vifrsm" 12
+VI Resources Flexible Secondary Maximum
+.IP "vigran" 12
+VI Flexible Resource Preferred Granularity
+.IP "rsvd80" 12
+reserved
diff --git a/doc/man/nvme_psd_flags.2 b/doc/man/nvme_psd_flags.2
new file mode 100644
index 0000000..e02cde6
--- /dev/null
+++ b/doc/man/nvme_psd_flags.2
@@ -0,0 +1,26 @@
+.TH "libnvme" 9 "enum nvme_psd_flags" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_psd_flags \- Possible flag values in nvme power state descriptor
+.SH SYNOPSIS
+enum nvme_psd_flags {
+.br
+.BI " NVME_PSD_FLAGS_MXPS"
+,
+.br
+.br
+.BI " NVME_PSD_FLAGS_NOPS"
+
+};
+.SH Constants
+.IP "NVME_PSD_FLAGS_MXPS" 12
+Indicates the scale for the Maximum Power
+field. If this bit is cleared, then the scale of the
+Maximum Power field is in 0.01 Watts. If this bit is
+set, then the scale of the Maximum Power field is in
+0.0001 Watts.
+.IP "NVME_PSD_FLAGS_NOPS" 12
+Indicates whether the controller processes I/O
+commands in this power state. If this bit is cleared,
+then the controller processes I/O commands in this
+power state. If this bit is set, then the controller
+does not process I/O commands in this power state.
diff --git a/doc/man/nvme_psd_power_scale.2 b/doc/man/nvme_psd_power_scale.2
new file mode 100644
index 0000000..3e7c358
--- /dev/null
+++ b/doc/man/nvme_psd_power_scale.2
@@ -0,0 +1,11 @@
+.TH "nvme_psd_power_scale" 9 "nvme_psd_power_scale" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_psd_power_scale \- power scale occupies the upper 3 bits
+.SH SYNOPSIS
+.B "unsigned int" nvme_psd_power_scale
+.BI "(__u8 ps " ");"
+.SH ARGUMENTS
+.IP "ps" 12
+power scale value
+.SH "RETURN"
+power scale value
diff --git a/doc/man/nvme_psd_ps.2 b/doc/man/nvme_psd_ps.2
new file mode 100644
index 0000000..ed59fcd
--- /dev/null
+++ b/doc/man/nvme_psd_ps.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "enum nvme_psd_ps" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_psd_ps \- Known values for &struct nvme_psd %ips and %aps. Use with nvme_psd_power_scale() to extract the power scale field to match this enum.
+.SH SYNOPSIS
+enum nvme_psd_ps {
+.br
+.BI " NVME_PSD_PS_NOT_REPORTED"
+,
+.br
+.br
+.BI " NVME_PSD_PS_100_MICRO_WATT"
+,
+.br
+.br
+.BI " NVME_PSD_PS_10_MILLI_WATT"
+
+};
+.SH Constants
+.IP "NVME_PSD_PS_NOT_REPORTED" 12
+Not reported
+.IP "NVME_PSD_PS_100_MICRO_WATT" 12
+0.0001 watt scale
+.IP "NVME_PSD_PS_10_MILLI_WATT" 12
+0.01 watt scale
diff --git a/doc/man/nvme_psd_workload.2 b/doc/man/nvme_psd_workload.2
new file mode 100644
index 0000000..bf6cead
--- /dev/null
+++ b/doc/man/nvme_psd_workload.2
@@ -0,0 +1,35 @@
+.TH "libnvme" 9 "enum nvme_psd_workload" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_psd_workload \- Specifies a workload hint in the Power Management Feature (see &struct nvme_psd.apw) to inform the NVM subsystem or indicate the conditions for the active power level.
+.SH SYNOPSIS
+enum nvme_psd_workload {
+.br
+.BI " NVME_PSD_WORKLOAD_NP"
+,
+.br
+.br
+.BI " NVME_PSD_WORKLOAD_1"
+,
+.br
+.br
+.BI " NVME_PSD_WORKLOAD_2"
+
+};
+.SH Constants
+.IP "NVME_PSD_WORKLOAD_NP" 12
+The workload is unknown or not provided.
+.IP "NVME_PSD_WORKLOAD_1" 12
+Extended Idle Period with a Burst of Random Write
+consists of five minutes of idle followed by
+thirty-two random write commands of size 1 MiB
+submitted to a single controller while all other
+controllers in the NVM subsystem are idle, and then
+thirty (30) seconds of idle.
+.IP "NVME_PSD_WORKLOAD_2" 12
+Heavy Sequential Writes consists of 80,000
+sequential write commands of size 128 KiB submitted to
+a single controller while all other controllers in the
+NVM subsystem are idle. The submission queue(s)
+should be sufficiently large allowing the host to
+ensure there are multiple commands pending at all
+times during the workload.
diff --git a/doc/man/nvme_read.2 b/doc/man/nvme_read.2
new file mode 100644
index 0000000..d7de4a9
--- /dev/null
+++ b/doc/man/nvme_read.2
@@ -0,0 +1,12 @@
+.TH "nvme_read" 9 "nvme_read" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_read \- Submit an nvme user read command
+.SH SYNOPSIS
+.B "int" nvme_read
+.BI "(struct nvme_io_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_io_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_read_config.2 b/doc/man/nvme_read_config.2
new file mode 100644
index 0000000..363647f
--- /dev/null
+++ b/doc/man/nvme_read_config.2
@@ -0,0 +1,17 @@
+.TH "nvme_read_config" 9 "nvme_read_config" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_read_config \- Read NVMe JSON configuration file
+.SH SYNOPSIS
+.B "int" nvme_read_config
+.BI "(nvme_root_t r " ","
+.BI "const char *config_file " ");"
+.SH ARGUMENTS
+.IP "r" 12
+nvme_root_t object
+.IP "config_file" 12
+JSON configuration file
+.SH "DESCRIPTION"
+Read in the contents of \fIconfig_file\fP and merge them with
+the elements in \fIr\fP.
+.SH "RETURN"
+0 on success, -1 on failure with errno set.
diff --git a/doc/man/nvme_refresh_topology.2 b/doc/man/nvme_refresh_topology.2
new file mode 100644
index 0000000..dac1ee1
--- /dev/null
+++ b/doc/man/nvme_refresh_topology.2
@@ -0,0 +1,11 @@
+.TH "nvme_refresh_topology" 9 "nvme_refresh_topology" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_refresh_topology \- Refresh nvme_root_t object contents
+.SH SYNOPSIS
+.B "void" nvme_refresh_topology
+.BI "(nvme_root_t r " ");"
+.SH ARGUMENTS
+.IP "r" 12
+nvme_root_t object
+.SH "DESCRIPTION"
+Removes all elements in \fIr\fP and rescans the existing topology.
diff --git a/doc/man/nvme_register_offsets.2 b/doc/man/nvme_register_offsets.2
new file mode 100644
index 0000000..17d03b7
--- /dev/null
+++ b/doc/man/nvme_register_offsets.2
@@ -0,0 +1,156 @@
+.TH "libnvme" 9 "enum nvme_register_offsets" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_register_offsets \- controller registers for all transports. This is the layout of BAR0/1 for PCIe, and properties for fabrics.
+.SH SYNOPSIS
+enum nvme_register_offsets {
+.br
+.BI " NVME_REG_CAP"
+,
+.br
+.br
+.BI " NVME_REG_VS"
+,
+.br
+.br
+.BI " NVME_REG_INTMS"
+,
+.br
+.br
+.BI " NVME_REG_INTMC"
+,
+.br
+.br
+.BI " NVME_REG_CC"
+,
+.br
+.br
+.BI " NVME_REG_CSTS"
+,
+.br
+.br
+.BI " NVME_REG_NSSR"
+,
+.br
+.br
+.BI " NVME_REG_AQA"
+,
+.br
+.br
+.BI " NVME_REG_ASQ"
+,
+.br
+.br
+.BI " NVME_REG_ACQ"
+,
+.br
+.br
+.BI " NVME_REG_CMBLOC"
+,
+.br
+.br
+.BI " NVME_REG_CMBSZ"
+,
+.br
+.br
+.BI " NVME_REG_BPINFO"
+,
+.br
+.br
+.BI " NVME_REG_BPRSEL"
+,
+.br
+.br
+.BI " NVME_REG_BPMBL"
+,
+.br
+.br
+.BI " NVME_REG_CMBMSC"
+,
+.br
+.br
+.BI " NVME_REG_CMBSTS"
+,
+.br
+.br
+.BI " NVME_REG_CRTO"
+,
+.br
+.br
+.BI " NVME_REG_PMRCAP"
+,
+.br
+.br
+.BI " NVME_REG_PMRCTL"
+,
+.br
+.br
+.BI " NVME_REG_PMRSTS"
+,
+.br
+.br
+.BI " NVME_REG_PMREBS"
+,
+.br
+.br
+.BI " NVME_REG_PMRSWTP"
+,
+.br
+.br
+.BI " NVME_REG_PMRMSCL"
+,
+.br
+.br
+.BI " NVME_REG_PMRMSCU"
+
+};
+.SH Constants
+.IP "NVME_REG_CAP" 12
+Controller Capabilities
+.IP "NVME_REG_VS" 12
+Version
+.IP "NVME_REG_INTMS" 12
+Interrupt Mask Set
+.IP "NVME_REG_INTMC" 12
+Interrupt Mask Clear
+.IP "NVME_REG_CC" 12
+Controller Configuration
+.IP "NVME_REG_CSTS" 12
+Controller Status
+.IP "NVME_REG_NSSR" 12
+NVM Subsystem Reset
+.IP "NVME_REG_AQA" 12
+Admin Queue Attributes
+.IP "NVME_REG_ASQ" 12
+Admin SQ Base Address
+.IP "NVME_REG_ACQ" 12
+Admin CQ Base Address
+.IP "NVME_REG_CMBLOC" 12
+Controller Memory Buffer Location
+.IP "NVME_REG_CMBSZ" 12
+Controller Memory Buffer Size
+.IP "NVME_REG_BPINFO" 12
+Boot Partition Information
+.IP "NVME_REG_BPRSEL" 12
+Boot Partition Read Select
+.IP "NVME_REG_BPMBL" 12
+Boot Partition Memory Buffer Location
+.IP "NVME_REG_CMBMSC" 12
+Controller Memory Buffer Memory Space Control
+.IP "NVME_REG_CMBSTS" 12
+Controller Memory Buffer Status
+.IP "NVME_REG_CRTO" 12
+Controller Ready Timeouts
+.IP "NVME_REG_PMRCAP" 12
+Persistent Memory Capabilities
+.IP "NVME_REG_PMRCTL" 12
+Persistent Memory Region Control
+.IP "NVME_REG_PMRSTS" 12
+Persistent Memory Region Status
+.IP "NVME_REG_PMREBS" 12
+Persistent Memory Region Elasticity Buffer Size
+.IP "NVME_REG_PMRSWTP" 12
+Memory Region Sustained Write Throughput
+.IP "NVME_REG_PMRMSCL" 12
+Persistent Memory Region Controller Memory Space Control Lower
+.IP "NVME_REG_PMRMSCU" 12
+Persistent Memory Region Controller Memory Space Control Upper
diff --git a/doc/man/nvme_registered_ctrl.2 b/doc/man/nvme_registered_ctrl.2
new file mode 100644
index 0000000..7d10215
--- /dev/null
+++ b/doc/man/nvme_registered_ctrl.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "struct nvme_registered_ctrl" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_registered_ctrl \- Registered Controller Data Structure
+.SH SYNOPSIS
+struct nvme_registered_ctrl {
+.br
+.BI " __le16 cntlid;"
+.br
+.BI " __u8 rcsts;"
+.br
+.BI " __u8 rsvd3[5];"
+.br
+.BI " __le64 hostid;"
+.br
+.BI " __le64 rkey;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "cntlid" 12
+Controller ID
+.IP "rcsts" 12
+Reservation Status
+.IP "rsvd3" 12
+Reserved
+.IP "hostid" 12
+Host Identifier
+.IP "rkey" 12
+Reservation Key
diff --git a/doc/man/nvme_registered_ctrl_ext.2 b/doc/man/nvme_registered_ctrl_ext.2
new file mode 100644
index 0000000..370a57d
--- /dev/null
+++ b/doc/man/nvme_registered_ctrl_ext.2
@@ -0,0 +1,35 @@
+.TH "libnvme" 9 "struct nvme_registered_ctrl_ext" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_registered_ctrl_ext \- Registered Controller Extended Data Structure
+.SH SYNOPSIS
+struct nvme_registered_ctrl_ext {
+.br
+.BI " __le16 cntlid;"
+.br
+.BI " __u8 rcsts;"
+.br
+.BI " __u8 rsvd3[5];"
+.br
+.BI " __le64 rkey;"
+.br
+.BI " __u8 hostid[16];"
+.br
+.BI " __u8 rsvd32[32];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "cntlid" 12
+Controller ID
+.IP "rcsts" 12
+Reservation Status
+.IP "rsvd3" 12
+Reserved
+.IP "rkey" 12
+Reservation Key
+.IP "hostid" 12
+Host Identifier
+.IP "rsvd32" 12
+Reserved
diff --git a/doc/man/nvme_rescan_ctrl.2 b/doc/man/nvme_rescan_ctrl.2
new file mode 100644
index 0000000..fd7c417
--- /dev/null
+++ b/doc/man/nvme_rescan_ctrl.2
@@ -0,0 +1,9 @@
+.TH "nvme_rescan_ctrl" 9 "nvme_rescan_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_rescan_ctrl \- Rescan an existing controller
+.SH SYNOPSIS
+.B "void" nvme_rescan_ctrl
+.BI "(nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
diff --git a/doc/man/nvme_resv_acquire.2 b/doc/man/nvme_resv_acquire.2
new file mode 100644
index 0000000..25f9f86
--- /dev/null
+++ b/doc/man/nvme_resv_acquire.2
@@ -0,0 +1,16 @@
+.TH "nvme_resv_acquire" 9 "nvme_resv_acquire" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_resv_acquire \- Send an nvme reservation acquire
+.SH SYNOPSIS
+.B "int" nvme_resv_acquire
+.BI "(struct nvme_resv_acquire_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_resv_acquire\fP argument structure
+.SH "DESCRIPTION"
+The Reservation Acquire command acquires a reservation on a namespace,
+preempt a reservation held on a namespace, and abort a reservation held on a
+namespace.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_resv_cptpl.2 b/doc/man/nvme_resv_cptpl.2
new file mode 100644
index 0000000..0b7d4f2
--- /dev/null
+++ b/doc/man/nvme_resv_cptpl.2
@@ -0,0 +1,26 @@
+.TH "libnvme" 9 "enum nvme_resv_cptpl" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_resv_cptpl \- Reservation Register - Change Persist Through Power Loss State
+.SH SYNOPSIS
+enum nvme_resv_cptpl {
+.br
+.BI " NVME_RESERVATION_CPTPL_NO_CHANGE"
+,
+.br
+.br
+.BI " NVME_RESERVATION_CPTPL_CLEAR"
+,
+.br
+.br
+.BI " NVME_RESERVATION_CPTPL_PERSIST"
+
+};
+.SH Constants
+.IP "NVME_RESERVATION_CPTPL_NO_CHANGE" 12
+No change to PTPL state
+.IP "NVME_RESERVATION_CPTPL_CLEAR" 12
+Reservations are released and
+registrants are cleared on a power on
+.IP "NVME_RESERVATION_CPTPL_PERSIST" 12
+Reservations and registrants persist
+across a power loss
diff --git a/doc/man/nvme_resv_notification_log.2 b/doc/man/nvme_resv_notification_log.2
new file mode 100644
index 0000000..d650b77
--- /dev/null
+++ b/doc/man/nvme_resv_notification_log.2
@@ -0,0 +1,35 @@
+.TH "libnvme" 9 "struct nvme_resv_notification_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_resv_notification_log \- Reservation Notification Log
+.SH SYNOPSIS
+struct nvme_resv_notification_log {
+.br
+.BI " __le64 lpc;"
+.br
+.BI " __u8 rnlpt;"
+.br
+.BI " __u8 nalp;"
+.br
+.BI " __u8 rsvd9[2];"
+.br
+.BI " __le32 nsid;"
+.br
+.BI " __u8 rsvd16[48];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "lpc" 12
+Log Page Count
+.IP "rnlpt" 12
+See \fIenum nvme_resv_notify_rnlpt\fP.
+.IP "nalp" 12
+Number of Available Log Pages
+.IP "rsvd9" 12
+Reserved
+.IP "nsid" 12
+Namespace ID
+.IP "rsvd16" 12
+Reserved
diff --git a/doc/man/nvme_resv_notify_rnlpt.2 b/doc/man/nvme_resv_notify_rnlpt.2
new file mode 100644
index 0000000..a12923b
--- /dev/null
+++ b/doc/man/nvme_resv_notify_rnlpt.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvme_resv_notify_rnlpt" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_resv_notify_rnlpt \- Reservation Notification Log - Reservation Notification Log Page Type
+.SH SYNOPSIS
+enum nvme_resv_notify_rnlpt {
+.br
+.BI " NVME_RESV_NOTIFY_RNLPT_EMPTY"
+,
+.br
+.br
+.BI " NVME_RESV_NOTIFY_RNLPT_REGISTRATION_PREEMPTED"
+,
+.br
+.br
+.BI " NVME_RESV_NOTIFY_RNLPT_RESERVATION_RELEASED"
+,
+.br
+.br
+.BI " NVME_RESV_NOTIFY_RNLPT_RESERVATION_PREEMPTED"
+
+};
+.SH Constants
+.IP "NVME_RESV_NOTIFY_RNLPT_EMPTY" 12
+Empty Log Page
+.IP "NVME_RESV_NOTIFY_RNLPT_REGISTRATION_PREEMPTED" 12
+Registration Preempted
+.IP "NVME_RESV_NOTIFY_RNLPT_RESERVATION_RELEASED" 12
+Reservation Released
+.IP "NVME_RESV_NOTIFY_RNLPT_RESERVATION_PREEMPTED" 12
+Reservation Preempted
diff --git a/doc/man/nvme_resv_racqa.2 b/doc/man/nvme_resv_racqa.2
new file mode 100644
index 0000000..ba115a2
--- /dev/null
+++ b/doc/man/nvme_resv_racqa.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "enum nvme_resv_racqa" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_resv_racqa \- Reservation Acquire - Reservation Acquire Action
+.SH SYNOPSIS
+enum nvme_resv_racqa {
+.br
+.BI " NVME_RESERVATION_RACQA_ACQUIRE"
+,
+.br
+.br
+.BI " NVME_RESERVATION_RACQA_PREEMPT"
+,
+.br
+.br
+.BI " NVME_RESERVATION_RACQA_PREEMPT_AND_ABORT"
+
+};
+.SH Constants
+.IP "NVME_RESERVATION_RACQA_ACQUIRE" 12
+Acquire
+.IP "NVME_RESERVATION_RACQA_PREEMPT" 12
+Preempt
+.IP "NVME_RESERVATION_RACQA_PREEMPT_AND_ABORT" 12
+Preempt and Abort
diff --git a/doc/man/nvme_resv_register.2 b/doc/man/nvme_resv_register.2
new file mode 100644
index 0000000..944c6a1
--- /dev/null
+++ b/doc/man/nvme_resv_register.2
@@ -0,0 +1,15 @@
+.TH "nvme_resv_register" 9 "nvme_resv_register" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_resv_register \- Send an nvme reservation register
+.SH SYNOPSIS
+.B "int" nvme_resv_register
+.BI "(struct nvme_resv_register_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_resv_register_args\fP argument structure
+.SH "DESCRIPTION"
+The Reservation Register command registers, unregisters, or replaces a
+reservation key.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_resv_release.2 b/doc/man/nvme_resv_release.2
new file mode 100644
index 0000000..0b38617
--- /dev/null
+++ b/doc/man/nvme_resv_release.2
@@ -0,0 +1,12 @@
+.TH "nvme_resv_release" 9 "nvme_resv_release" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_resv_release \- Send an nvme reservation release
+.SH SYNOPSIS
+.B "int" nvme_resv_release
+.BI "(struct nvme_resv_release_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_resv_release_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_resv_report.2 b/doc/man/nvme_resv_report.2
new file mode 100644
index 0000000..30c8535
--- /dev/null
+++ b/doc/man/nvme_resv_report.2
@@ -0,0 +1,16 @@
+.TH "nvme_resv_report" 9 "nvme_resv_report" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_resv_report \- Send an nvme reservation report
+.SH SYNOPSIS
+.B "int" nvme_resv_report
+.BI "(struct nvme_resv_report_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+struct nvme_resv_report_args argument structure
+.SH "DESCRIPTION"
+Returns a Reservation Status data structure to memory that describes the
+registration and reservation status of a namespace. See the definition for
+the returned structure, \fIstruct nvme_reservation_status\fP, for more details.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_resv_rrega.2 b/doc/man/nvme_resv_rrega.2
new file mode 100644
index 0000000..fe46dca
--- /dev/null
+++ b/doc/man/nvme_resv_rrega.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "enum nvme_resv_rrega" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_resv_rrega \- Reservation Register - Reservation Register Action
+.SH SYNOPSIS
+enum nvme_resv_rrega {
+.br
+.BI " NVME_RESERVATION_RREGA_REGISTER_KEY"
+,
+.br
+.br
+.BI " NVME_RESERVATION_RREGA_UNREGISTER_KEY"
+,
+.br
+.br
+.BI " NVME_RESERVATION_RREGA_REPLACE_KEY"
+
+};
+.SH Constants
+.IP "NVME_RESERVATION_RREGA_REGISTER_KEY" 12
+Register Reservation Key
+.IP "NVME_RESERVATION_RREGA_UNREGISTER_KEY" 12
+Unregister Reservation Key
+.IP "NVME_RESERVATION_RREGA_REPLACE_KEY" 12
+Replace Reservation Key
diff --git a/doc/man/nvme_resv_rrela.2 b/doc/man/nvme_resv_rrela.2
new file mode 100644
index 0000000..e215461
--- /dev/null
+++ b/doc/man/nvme_resv_rrela.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvme_resv_rrela" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_resv_rrela \- Reservation Release - Reservation Release Action
+.SH SYNOPSIS
+enum nvme_resv_rrela {
+.br
+.BI " NVME_RESERVATION_RRELA_RELEASE"
+,
+.br
+.br
+.BI " NVME_RESERVATION_RRELA_CLEAR"
+
+};
+.SH Constants
+.IP "NVME_RESERVATION_RRELA_RELEASE" 12
+Release
+.IP "NVME_RESERVATION_RRELA_CLEAR" 12
+Clear
diff --git a/doc/man/nvme_resv_rtype.2 b/doc/man/nvme_resv_rtype.2
new file mode 100644
index 0000000..3468eae
--- /dev/null
+++ b/doc/man/nvme_resv_rtype.2
@@ -0,0 +1,42 @@
+.TH "libnvme" 9 "enum nvme_resv_rtype" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_resv_rtype \- Reservation Type Encoding
+.SH SYNOPSIS
+enum nvme_resv_rtype {
+.br
+.BI " NVME_RESERVATION_RTYPE_WE"
+,
+.br
+.br
+.BI " NVME_RESERVATION_RTYPE_EA"
+,
+.br
+.br
+.BI " NVME_RESERVATION_RTYPE_WERO"
+,
+.br
+.br
+.BI " NVME_RESERVATION_RTYPE_EARO"
+,
+.br
+.br
+.BI " NVME_RESERVATION_RTYPE_WEAR"
+,
+.br
+.br
+.BI " NVME_RESERVATION_RTYPE_EAAR"
+
+};
+.SH Constants
+.IP "NVME_RESERVATION_RTYPE_WE" 12
+Write Exclusive Reservation
+.IP "NVME_RESERVATION_RTYPE_EA" 12
+Exclusive Access Reservation
+.IP "NVME_RESERVATION_RTYPE_WERO" 12
+Write Exclusive - Registrants Only Reservation
+.IP "NVME_RESERVATION_RTYPE_EARO" 12
+Exclusive Access - Registrants Only Reservation
+.IP "NVME_RESERVATION_RTYPE_WEAR" 12
+Write Exclusive - All Registrants Reservation
+.IP "NVME_RESERVATION_RTYPE_EAAR" 12
+Exclusive Access - All Registrants Reservation
diff --git a/doc/man/nvme_resv_status.2 b/doc/man/nvme_resv_status.2
new file mode 100644
index 0000000..5a1beeb
--- /dev/null
+++ b/doc/man/nvme_resv_status.2
@@ -0,0 +1,59 @@
+.TH "libnvme" 9 "struct nvme_resv_status" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_resv_status \- Reservation Status Data Structure
+.SH SYNOPSIS
+struct nvme_resv_status {
+.br
+.BI " __le32 gen;"
+.br
+.BI " __u8 rtype;"
+.br
+.BI " __u8 regctl[2];"
+.br
+.BI " __u8 rsvd7[2];"
+.br
+.BI " __u8 ptpls;"
+.br
+.BI " __u8 rsvd10[14];"
+.br
+.BI " union {"
+.br
+.BI " struct {"
+.br
+.BI " __u8 rsvd24[40];"
+.br
+.BI " struct nvme_registered_ctrl_ext regctl_eds[0];"
+.br
+.BI " };"
+.br
+.BI " struct nvme_registered_ctrl regctl_ds[0];"
+.br
+.BI " };"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "gen" 12
+Generation
+.IP "rtype" 12
+Reservation Type
+.IP "regctl" 12
+Number of Registered Controllers
+.IP "rsvd7" 12
+Reserved
+.IP "ptpls" 12
+Persist Through Power Loss State
+.IP "rsvd10" 12
+Reserved
+.IP "{unnamed_union}" 12
+anonymous
+.IP "{unnamed_struct}" 12
+anonymous
+.IP "rsvd24" 12
+Reserved
+.IP "regctl_eds" 12
+Registered Controller Extended Data Structure
+.IP "regctl_ds" 12
+Registered Controller Data Structure
diff --git a/doc/man/nvme_sanitize_compln_event.2 b/doc/man/nvme_sanitize_compln_event.2
new file mode 100644
index 0000000..044d37e
--- /dev/null
+++ b/doc/man/nvme_sanitize_compln_event.2
@@ -0,0 +1,27 @@
+.TH "libnvme" 9 "struct nvme_sanitize_compln_event" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_sanitize_compln_event \- Sanitize Completion Event Data
+.SH SYNOPSIS
+struct nvme_sanitize_compln_event {
+.br
+.BI " __le16 sani_prog;"
+.br
+.BI " __le16 sani_status;"
+.br
+.BI " __le16 cmpln_info;"
+.br
+.BI " __u8 rsvd6[2];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "sani_prog" 12
+Sanitize Progress
+.IP "sani_status" 12
+Sanitize Status
+.IP "cmpln_info" 12
+Completion Information
+.IP "rsvd6" 12
+Reserved
diff --git a/doc/man/nvme_sanitize_log_page.2 b/doc/man/nvme_sanitize_log_page.2
new file mode 100644
index 0000000..2c14b07
--- /dev/null
+++ b/doc/man/nvme_sanitize_log_page.2
@@ -0,0 +1,106 @@
+.TH "libnvme" 9 "struct nvme_sanitize_log_page" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_sanitize_log_page \- Sanitize Status (Log Identifier 81h)
+.SH SYNOPSIS
+struct nvme_sanitize_log_page {
+.br
+.BI " __le16 sprog;"
+.br
+.BI " __le16 sstat;"
+.br
+.BI " __le32 scdw10;"
+.br
+.BI " __le32 eto;"
+.br
+.BI " __le32 etbe;"
+.br
+.BI " __le32 etce;"
+.br
+.BI " __le32 etond;"
+.br
+.BI " __le32 etbend;"
+.br
+.BI " __le32 etcend;"
+.br
+.BI " __u8 rsvd32[480];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "sprog" 12
+Sanitize Progress (SPROG): indicates the fraction complete of the
+sanitize operation. The value is a numerator of the fraction
+complete that has 65,536 (10000h) as its denominator. This value
+shall be set to FFFFh if the \fIsstat\fP field is not set to
+NVME_SANITIZE_SSTAT_STATUS_IN_PROGESS.
+.IP "sstat" 12
+Sanitize Status (SSTAT): indicates the status associated with
+the most recent sanitize operation. See \fIenum nvme_sanitize_sstat\fP.
+.IP "scdw10" 12
+Sanitize Command Dword 10 Information (SCDW10): contains the value
+of the Command Dword 10 field of the Sanitize command that started
+the sanitize operation.
+.IP "eto" 12
+Estimated Time For Overwrite: indicates the number of seconds required
+to complete an Overwrite sanitize operation with 16 passes in
+the background when the No-Deallocate Modifies Media After Sanitize
+field is not set to 10b. A value of 0h indicates that the sanitize
+operation is expected to be completed in the background when the
+Sanitize command that started that operation is completed. A value
+of FFFFFFFFh indicates that no time period is reported.
+.IP "etbe" 12
+Estimated Time For Block Erase: indicates the number of seconds
+required to complete a Block Erase sanitize operation in the
+background when the No-Deallocate Modifies Media After Sanitize
+field is not set to 10b. A value of 0h indicates that the sanitize
+operation is expected to be completed in the background when the
+Sanitize command that started that operation is completed.
+A value of FFFFFFFFh indicates that no time period is reported.
+.IP "etce" 12
+Estimated Time For Crypto Erase: indicates the number of seconds
+required to complete a Crypto Erase sanitize operation in the
+background when the No-Deallocate Modifies Media After Sanitize
+field is not set to 10b. A value of 0h indicates that the sanitize
+operation is expected to be completed in the background when the
+Sanitize command that started that operation is completed.
+A value of FFFFFFFFh indicates that no time period is reported.
+.IP "etond" 12
+Estimated Time For Overwrite With No-Deallocate Media Modification:
+indicates the number of seconds required to complete an Overwrite
+sanitize operation and the associated additional media modification
+after the Overwrite sanitize operation in the background when
+the No-Deallocate After Sanitize bit was set to 1 in the Sanitize
+command that requested the Overwrite sanitize operation; and
+the No-Deallocate Modifies Media After Sanitize field is set to 10b.
+A value of 0h indicates that the sanitize operation is expected
+to be completed in the background when the Sanitize command that
+started that operation is completed. A value of FFFFFFFFh indicates
+that no time period is reported.
+.IP "etbend" 12
+Estimated Time For Block Erase With No-Deallocate Media Modification:
+indicates the number of seconds required to complete a Block Erase
+sanitize operation and the associated additional media modification
+after the Block Erase sanitize operation in the background when
+the No-Deallocate After Sanitize bit was set to 1 in the Sanitize
+command that requested the Overwrite sanitize operation; and
+the No-Deallocate Modifies Media After Sanitize field is set to 10b.
+A value of 0h indicates that the sanitize operation is expected
+to be completed in the background when the Sanitize command that
+started that operation is completed. A value of FFFFFFFFh indicates
+that no time period is reported.
+.IP "etcend" 12
+Estimated Time For Crypto Erase With No-Deallocate Media Modification:
+indicates the number of seconds required to complete a Crypto Erase
+sanitize operation and the associated additional media modification
+after the Crypto Erase sanitize operation in the background when
+the No-Deallocate After Sanitize bit was set to 1 in the Sanitize
+command that requested the Overwrite sanitize operation; and
+the No-Deallocate Modifies Media After Sanitize field is set to 10b.
+A value of 0h indicates that the sanitize operation is expected
+to be completed in the background when the Sanitize command that
+started that operation is completed. A value of FFFFFFFFh indicates
+that no time period is reported.
+.IP "rsvd32" 12
+Reserved
diff --git a/doc/man/nvme_sanitize_nvm.2 b/doc/man/nvme_sanitize_nvm.2
new file mode 100644
index 0000000..79ecb8b
--- /dev/null
+++ b/doc/man/nvme_sanitize_nvm.2
@@ -0,0 +1,22 @@
+.TH "nvme_sanitize_nvm" 9 "nvme_sanitize_nvm" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_sanitize_nvm \- Start a sanitize operation
+.SH SYNOPSIS
+.B "int" nvme_sanitize_nvm
+.BI "(struct nvme_sanitize_nvm_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_sanitize_nvm_args\fP argument structure
+.SH "DESCRIPTION"
+A sanitize operation alters all user data in the NVM subsystem such that
+recovery of any previous user data from any cache, the non-volatile media,
+or any Controller Memory Buffer is not possible.
+
+The Sanitize command starts a sanitize operation or to recover from a
+previously failed sanitize operation. The sanitize operation types that may
+be supported are Block Erase, Crypto Erase, and Overwrite. All sanitize
+operations are processed in the background, i.e., completion of the sanitize
+command does not indicate completion of the sanitize operation.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_sanitize_sanact.2 b/doc/man/nvme_sanitize_sanact.2
new file mode 100644
index 0000000..a571589
--- /dev/null
+++ b/doc/man/nvme_sanitize_sanact.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvme_sanitize_sanact" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_sanitize_sanact \- Sanitize Action
+.SH SYNOPSIS
+enum nvme_sanitize_sanact {
+.br
+.BI " NVME_SANITIZE_SANACT_EXIT_FAILURE"
+,
+.br
+.br
+.BI " NVME_SANITIZE_SANACT_START_BLOCK_ERASE"
+,
+.br
+.br
+.BI " NVME_SANITIZE_SANACT_START_OVERWRITE"
+,
+.br
+.br
+.BI " NVME_SANITIZE_SANACT_START_CRYPTO_ERASE"
+
+};
+.SH Constants
+.IP "NVME_SANITIZE_SANACT_EXIT_FAILURE" 12
+Exit Failure Mode.
+.IP "NVME_SANITIZE_SANACT_START_BLOCK_ERASE" 12
+Start a Block Erase sanitize operation.
+.IP "NVME_SANITIZE_SANACT_START_OVERWRITE" 12
+Start an Overwrite sanitize operation.
+.IP "NVME_SANITIZE_SANACT_START_CRYPTO_ERASE" 12
+Start a Crypto Erase sanitize operation.
diff --git a/doc/man/nvme_sanitize_sstat.2 b/doc/man/nvme_sanitize_sstat.2
new file mode 100644
index 0000000..35fcbef
--- /dev/null
+++ b/doc/man/nvme_sanitize_sstat.2
@@ -0,0 +1,105 @@
+.TH "libnvme" 9 "enum nvme_sanitize_sstat" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_sanitize_sstat \- Sanitize Status (SSTAT)
+.SH SYNOPSIS
+enum nvme_sanitize_sstat {
+.br
+.BI " NVME_SANITIZE_SSTAT_STATUS_SHIFT"
+,
+.br
+.br
+.BI " NVME_SANITIZE_SSTAT_STATUS_MASK"
+,
+.br
+.br
+.BI " NVME_SANITIZE_SSTAT_STATUS_NEVER_SANITIZED"
+,
+.br
+.br
+.BI " NVME_SANITIZE_SSTAT_STATUS_COMPLETE_SUCCESS"
+,
+.br
+.br
+.BI " NVME_SANITIZE_SSTAT_STATUS_IN_PROGESS"
+,
+.br
+.br
+.BI " NVME_SANITIZE_SSTAT_STATUS_COMPLETED_FAILED"
+,
+.br
+.br
+.BI " NVME_SANITIZE_SSTAT_STATUS_ND_COMPLETE_SUCCESS"
+,
+.br
+.br
+.BI " NVME_SANITIZE_SSTAT_COMPLETED_PASSES_SHIFT"
+,
+.br
+.br
+.BI " NVME_SANITIZE_SSTAT_COMPLETED_PASSES_MASK"
+,
+.br
+.br
+.BI " NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED_SHIFT"
+,
+.br
+.br
+.BI " NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED_MASK"
+,
+.br
+.br
+.BI " NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED"
+
+};
+.SH Constants
+.IP "NVME_SANITIZE_SSTAT_STATUS_SHIFT" 12
+Shift amount to get the status value of
+the most recent sanitize operation from
+the \fIstruct nvme_sanitize_log_page\fP.sstat
+field.
+.IP "NVME_SANITIZE_SSTAT_STATUS_MASK" 12
+Mask to get the status value of the most
+recent sanitize operation.
+.IP "NVME_SANITIZE_SSTAT_STATUS_NEVER_SANITIZED" 12
+The NVM subsystem has never been
+sanitized.
+.IP "NVME_SANITIZE_SSTAT_STATUS_COMPLETE_SUCCESS" 12
+The most recent sanitize operation
+completed successfully including any
+additional media modification.
+.IP "NVME_SANITIZE_SSTAT_STATUS_IN_PROGESS" 12
+A sanitize operation is currently in progress.
+.IP "NVME_SANITIZE_SSTAT_STATUS_COMPLETED_FAILED" 12
+The most recent sanitize operation
+failed.
+.IP "NVME_SANITIZE_SSTAT_STATUS_ND_COMPLETE_SUCCESS" 12
+The most recent sanitize operation
+for which No-Deallocate After Sanitize was
+requested has completed successfully with
+deallocation of all user data.
+.IP "NVME_SANITIZE_SSTAT_COMPLETED_PASSES_SHIFT" 12
+Shift amount to get the number
+of completed passes if the most recent
+sanitize operation was an Overwrite. This
+value shall be cleared to 0h if the most
+recent sanitize operation was not
+an Overwrite.
+.IP "NVME_SANITIZE_SSTAT_COMPLETED_PASSES_MASK" 12
+Mask to get the number of completed
+passes.
+.IP "NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED_SHIFT" 12
+Shift amount to get the Global
+Data Erased value from the
+\fIstruct nvme_sanitize_log_page\fP.sstat field.
+.IP "NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED_MASK" 12
+Mask to get the Global Data Erased
+value.
+.IP "NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED" 12
+Global Data Erased: if set, then no
+namespace user data in the NVM subsystem
+has been written to and no Persistent
+Memory Region in the NVM subsystem has
+been enabled since being manufactured and
+the NVM subsystem has never been sanitized;
+or since the most recent successful sanitize
+operation.
diff --git a/doc/man/nvme_sanitize_start_event.2 b/doc/man/nvme_sanitize_start_event.2
new file mode 100644
index 0000000..213e0b4
--- /dev/null
+++ b/doc/man/nvme_sanitize_start_event.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_sanitize_start_event" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_sanitize_start_event \- Sanitize Start Event Data
+.SH SYNOPSIS
+struct nvme_sanitize_start_event {
+.br
+.BI " __le32 sani_cap;"
+.br
+.BI " __le32 sani_cdw10;"
+.br
+.BI " __le32 sani_cdw11;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "sani_cap" 12
+SANICAP
+.IP "sani_cdw10" 12
+Sanitize CDW10
+.IP "sani_cdw11" 12
+Sanitize CDW11
diff --git a/doc/man/nvme_scan.2 b/doc/man/nvme_scan.2
new file mode 100644
index 0000000..a3951d6
--- /dev/null
+++ b/doc/man/nvme_scan.2
@@ -0,0 +1,11 @@
+.TH "nvme_scan" 9 "nvme_scan" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_scan \- Scan NVMe topology
+.SH SYNOPSIS
+.B "nvme_root_t" nvme_scan
+.BI "(const char *config_file " ");"
+.SH ARGUMENTS
+.IP "config_file" 12
+Configuration file
+.SH "RETURN"
+nvme_root_t object of found elements
diff --git a/doc/man/nvme_scan_ctrl.2 b/doc/man/nvme_scan_ctrl.2
new file mode 100644
index 0000000..07bef5d
--- /dev/null
+++ b/doc/man/nvme_scan_ctrl.2
@@ -0,0 +1,16 @@
+.TH "nvme_scan_ctrl" 9 "nvme_scan_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_scan_ctrl \- Scan on a controller
+.SH SYNOPSIS
+.B "nvme_ctrl_t" nvme_scan_ctrl
+.BI "(nvme_root_t r " ","
+.BI "const char *name " ");"
+.SH ARGUMENTS
+.IP "r" 12
+nvme_root_t object
+.IP "name" 12
+Name of the controller
+.SH "DESCRIPTION"
+Scans a controller with sysfs name \fIname\fP and add it to \fIr\fP.
+.SH "RETURN"
+nvme_ctrl_t object
diff --git a/doc/man/nvme_scan_ctrl_namespace_paths.2 b/doc/man/nvme_scan_ctrl_namespace_paths.2
new file mode 100644
index 0000000..b473d72
--- /dev/null
+++ b/doc/man/nvme_scan_ctrl_namespace_paths.2
@@ -0,0 +1,14 @@
+.TH "nvme_scan_ctrl_namespace_paths" 9 "nvme_scan_ctrl_namespace_paths" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_scan_ctrl_namespace_paths \- Scan for namespace paths in a controller
+.SH SYNOPSIS
+.B "int" nvme_scan_ctrl_namespace_paths
+.BI "(nvme_ctrl_t c " ","
+.BI "struct dirent ***paths " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller to scan
+.IP "paths" 12
+Pointer to array of dirents
+.SH "RETURN"
+number of entries in \fIpaths\fP
diff --git a/doc/man/nvme_scan_ctrl_namespaces.2 b/doc/man/nvme_scan_ctrl_namespaces.2
new file mode 100644
index 0000000..fb4854d
--- /dev/null
+++ b/doc/man/nvme_scan_ctrl_namespaces.2
@@ -0,0 +1,14 @@
+.TH "nvme_scan_ctrl_namespaces" 9 "nvme_scan_ctrl_namespaces" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_scan_ctrl_namespaces \- Scan for namespaces in a controller
+.SH SYNOPSIS
+.B "int" nvme_scan_ctrl_namespaces
+.BI "(nvme_ctrl_t c " ","
+.BI "struct dirent ***ns " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller to scan
+.IP "ns" 12
+Pointer to array of dirents
+.SH "RETURN"
+number of entries in \fIns\fP
diff --git a/doc/man/nvme_scan_ctrls.2 b/doc/man/nvme_scan_ctrls.2
new file mode 100644
index 0000000..a306590
--- /dev/null
+++ b/doc/man/nvme_scan_ctrls.2
@@ -0,0 +1,11 @@
+.TH "nvme_scan_ctrls" 9 "nvme_scan_ctrls" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_scan_ctrls \- Scan for controllers
+.SH SYNOPSIS
+.B "int" nvme_scan_ctrls
+.BI "(struct dirent ***ctrls " ");"
+.SH ARGUMENTS
+.IP "ctrls" 12
+Pointer to array of dirents
+.SH "RETURN"
+number of entries in \fIctrls\fP
diff --git a/doc/man/nvme_scan_namespace.2 b/doc/man/nvme_scan_namespace.2
new file mode 100644
index 0000000..7fc7523
--- /dev/null
+++ b/doc/man/nvme_scan_namespace.2
@@ -0,0 +1,11 @@
+.TH "nvme_scan_namespace" 9 "nvme_scan_namespace" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_scan_namespace \- scan namespace based on sysfs name
+.SH SYNOPSIS
+.B "nvme_ns_t" nvme_scan_namespace
+.BI "(const char *name " ");"
+.SH ARGUMENTS
+.IP "name" 12
+sysfs name of the namespace to scan
+.SH "RETURN"
+nvme_ns_t object or NULL if not found.
diff --git a/doc/man/nvme_scan_subsystem_namespaces.2 b/doc/man/nvme_scan_subsystem_namespaces.2
new file mode 100644
index 0000000..1dc7ff7
--- /dev/null
+++ b/doc/man/nvme_scan_subsystem_namespaces.2
@@ -0,0 +1,14 @@
+.TH "nvme_scan_subsystem_namespaces" 9 "nvme_scan_subsystem_namespaces" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_scan_subsystem_namespaces \- Scan for namespaces in a subsystem
+.SH SYNOPSIS
+.B "int" nvme_scan_subsystem_namespaces
+.BI "(nvme_subsystem_t s " ","
+.BI "struct dirent ***ns " ");"
+.SH ARGUMENTS
+.IP "s" 12
+Subsystem to scan
+.IP "ns" 12
+Pointer to array of dirents
+.SH "RETURN"
+number of entries in \fIns\fP
diff --git a/doc/man/nvme_scan_subsystems.2 b/doc/man/nvme_scan_subsystems.2
new file mode 100644
index 0000000..fe7d2cc
--- /dev/null
+++ b/doc/man/nvme_scan_subsystems.2
@@ -0,0 +1,11 @@
+.TH "nvme_scan_subsystems" 9 "nvme_scan_subsystems" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_scan_subsystems \- Scan for subsystems
+.SH SYNOPSIS
+.B "int" nvme_scan_subsystems
+.BI "(struct dirent ***subsys " ");"
+.SH ARGUMENTS
+.IP "subsys" 12
+Pointer to array of dirents
+.SH "RETURN"
+number of entries in \fIsubsys\fP
diff --git a/doc/man/nvme_scan_topology.2 b/doc/man/nvme_scan_topology.2
new file mode 100644
index 0000000..7c6f4e1
--- /dev/null
+++ b/doc/man/nvme_scan_topology.2
@@ -0,0 +1,20 @@
+.TH "nvme_scan_topology" 9 "nvme_scan_topology" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_scan_topology \- Scan NVMe topology and apply filter
+.SH SYNOPSIS
+.B "int" nvme_scan_topology
+.BI "(nvme_root_t r " ","
+.BI "nvme_scan_filter_t f " ","
+.BI "void *f_args " ");"
+.SH ARGUMENTS
+.IP "r" 12
+nvme_root_t object
+.IP "f" 12
+filter to apply
+.IP "f_args" 12
+user-specified argument to \fIf\fP
+.SH "DESCRIPTION"
+Scans the NVMe topology and filters out the resulting elements
+by applying \fIf\fP.
+.SH "RETURN"
+Number of elements scanned
diff --git a/doc/man/nvme_secondary_ctrl.2 b/doc/man/nvme_secondary_ctrl.2
new file mode 100644
index 0000000..75616e5
--- /dev/null
+++ b/doc/man/nvme_secondary_ctrl.2
@@ -0,0 +1,43 @@
+.TH "libnvme" 9 "struct nvme_secondary_ctrl" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_secondary_ctrl \- Secondary Controller Entry
+.SH SYNOPSIS
+struct nvme_secondary_ctrl {
+.br
+.BI " __le16 scid;"
+.br
+.BI " __le16 pcid;"
+.br
+.BI " __u8 scs;"
+.br
+.BI " __u8 rsvd5[3];"
+.br
+.BI " __le16 vfn;"
+.br
+.BI " __le16 nvq;"
+.br
+.BI " __le16 nvi;"
+.br
+.BI " __u8 rsvd14[18];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "scid" 12
+Secondary Controller Identifier
+.IP "pcid" 12
+Primary Controller Identifier
+.IP "scs" 12
+Secondary Controller State
+.IP "rsvd5" 12
+Reserved
+.IP "vfn" 12
+Virtual Function Number
+.IP "nvq" 12
+Number of VQ Flexible Resources Assigned
+.IP "nvi" 12
+Number of VI Flexible Resources Assigned
+.IP "rsvd14" 12
+Reserved
diff --git a/doc/man/nvme_secondary_ctrl_list.2 b/doc/man/nvme_secondary_ctrl_list.2
new file mode 100644
index 0000000..c2021f5
--- /dev/null
+++ b/doc/man/nvme_secondary_ctrl_list.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_secondary_ctrl_list" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_secondary_ctrl_list \- Secondary Controller List
+.SH SYNOPSIS
+struct nvme_secondary_ctrl_list {
+.br
+.BI " __u8 num;"
+.br
+.BI " __u8 rsvd[31];"
+.br
+.BI " struct nvme_secondary_ctrl sc_entry[NVME_ID_SECONDARY_CTRL_MAX];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "num" 12
+Number of Identifiers
+.IP "rsvd" 12
+Reserved
+.IP "sc_entry" 12
+Secondary Controller Entry
diff --git a/doc/man/nvme_security_receive.2 b/doc/man/nvme_security_receive.2
new file mode 100644
index 0000000..e2aac09
--- /dev/null
+++ b/doc/man/nvme_security_receive.2
@@ -0,0 +1,12 @@
+.TH "nvme_security_receive" 9 "nvme_security_receive" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_security_receive \- Security Receive command
+.SH SYNOPSIS
+.B "int" nvme_security_receive
+.BI "(struct nvme_security_receive_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_security_receive\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_security_send.2 b/doc/man/nvme_security_send.2
new file mode 100644
index 0000000..0ece82e
--- /dev/null
+++ b/doc/man/nvme_security_send.2
@@ -0,0 +1,21 @@
+.TH "nvme_security_send" 9 "nvme_security_send" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_security_send \- Security Send command
+.SH SYNOPSIS
+.B "int" nvme_security_send
+.BI "(struct nvme_security_send_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_security_send\fP argument structure
+.SH "DESCRIPTION"
+The Security Send command transfers security protocol data to the
+controller. The data structure transferred to the controller as part of this
+command contains security protocol specific commands to be performed by the
+controller. The data structure transferred may also contain data or
+parameters associated with the security protocol commands.
+
+The security data is protocol specific and is not defined by the NVMe
+specification.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_self_test_log.2 b/doc/man/nvme_self_test_log.2
new file mode 100644
index 0000000..72431c2
--- /dev/null
+++ b/doc/man/nvme_self_test_log.2
@@ -0,0 +1,43 @@
+.TH "libnvme" 9 "struct nvme_self_test_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_self_test_log \- Device Self-test (Log Identifier 06h)
+.SH SYNOPSIS
+struct nvme_self_test_log {
+.br
+.BI " __u8 current_operation;"
+.br
+.BI " __u8 completion;"
+.br
+.BI " __u8 rsvd[2];"
+.br
+.BI " struct nvme_st_result result[NVME_LOG_ST_MAX_RESULTS];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "current_operation" 12
+Current Device Self-Test Operation: indicates the status
+of the current device self-test operation. If a device
+self-test operation is in process (i.e., this field is set
+to #NVME_ST_CURR_OP_SHORT or #NVME_ST_CURR_OP_EXTENDED),
+then the controller shall not set this field to
+#NVME_ST_CURR_OP_NOT_RUNNING until a new Self-test Result
+Data Structure is created (i.e., if a device self-test
+operation completes or is aborted, then the controller
+shall create a Self-test Result Data Structure prior to
+setting this field to #NVME_ST_CURR_OP_NOT_RUNNING).
+See \fIenum nvme_st_curr_op\fP.
+.IP "completion" 12
+Current Device Self-Test Completion: indicates the percentage
+of the device self-test operation that is complete (e.g.,
+a value of 25 indicates that 25% of the device self-test
+operation is complete and 75% remains to be tested).
+If the \fIcurrent_operation\fP field is cleared to
+#NVME_ST_CURR_OP_NOT_RUNNING (indicating there is no device
+self-test operation in progress), then this field is ignored.
+.IP "rsvd" 12
+Reserved
+.IP "result" 12
+Self-test Result Data Structures, see \fIstruct nvme_st_result\fP.
diff --git a/doc/man/nvme_set_feature_event.2 b/doc/man/nvme_set_feature_event.2
new file mode 100644
index 0000000..e29c550
--- /dev/null
+++ b/doc/man/nvme_set_feature_event.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_set_feature_event" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_set_feature_event \- Set Feature Event Data
+.SH SYNOPSIS
+struct nvme_set_feature_event {
+.br
+.BI " __le32 layout;"
+.br
+.BI " __le32 cdw_mem[0];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "layout" 12
+Set Feature Event Layout
+.IP "cdw_mem" 12
+Command Dwords Memory buffer
diff --git a/doc/man/nvme_set_features.2 b/doc/man/nvme_set_features.2
new file mode 100644
index 0000000..8e337e7
--- /dev/null
+++ b/doc/man/nvme_set_features.2
@@ -0,0 +1,12 @@
+.TH "nvme_set_features" 9 "nvme_set_features" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features \- Set a feature attribute
+.SH SYNOPSIS
+.B "int" nvme_set_features
+.BI "(struct nvme_set_features_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_set_features_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_arbitration.2 b/doc/man/nvme_set_features_arbitration.2
new file mode 100644
index 0000000..932b501
--- /dev/null
+++ b/doc/man/nvme_set_features_arbitration.2
@@ -0,0 +1,30 @@
+.TH "nvme_set_features_arbitration" 9 "nvme_set_features_arbitration" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_arbitration \- Set arbitration features
+.SH SYNOPSIS
+.B "int" nvme_set_features_arbitration
+.BI "(int fd " ","
+.BI "__u8 ab " ","
+.BI "__u8 lpw " ","
+.BI "__u8 mpw " ","
+.BI "__u8 hpw " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "ab" 12
+Arbitration Burst
+.IP "lpw" 12
+Low Priority Weight
+.IP "mpw" 12
+Medium Priority Weight
+.IP "hpw" 12
+High Priority Weight
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_async_event.2 b/doc/man/nvme_set_features_async_event.2
new file mode 100644
index 0000000..fcf4d75
--- /dev/null
+++ b/doc/man/nvme_set_features_async_event.2
@@ -0,0 +1,21 @@
+.TH "nvme_set_features_async_event" 9 "nvme_set_features_async_event" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_async_event \- Set asynchronous event feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_async_event
+.BI "(int fd " ","
+.BI "__u32 events " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "events" 12
+Events to enable
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_auto_pst.2 b/doc/man/nvme_set_features_auto_pst.2
new file mode 100644
index 0000000..a88d7b8
--- /dev/null
+++ b/doc/man/nvme_set_features_auto_pst.2
@@ -0,0 +1,24 @@
+.TH "nvme_set_features_auto_pst" 9 "nvme_set_features_auto_pst" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_auto_pst \- Set autonomous power state feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_auto_pst
+.BI "(int fd " ","
+.BI "bool apste " ","
+.BI "bool save " ","
+.BI "struct nvme_feat_auto_pst *apst " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "apste" 12
+Autonomous Power State Transition Enable
+.IP "save" 12
+Save value across power states
+.IP "apst" 12
+Autonomous Power State Transition
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_data.2 b/doc/man/nvme_set_features_data.2
new file mode 100644
index 0000000..ec7e399
--- /dev/null
+++ b/doc/man/nvme_set_features_data.2
@@ -0,0 +1,33 @@
+.TH "nvme_set_features_data" 9 "nvme_set_features_data" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_data \- Helper function for @nvme_set_features()
+.SH SYNOPSIS
+.B "int" nvme_set_features_data
+.BI "(int fd " ","
+.BI "__u8 fid " ","
+.BI "__u32 nsid " ","
+.BI "__u32 cdw11 " ","
+.BI "bool save " ","
+.BI "__u32 data_len " ","
+.BI "void *data " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "fid" 12
+Feature identifier
+.IP "nsid" 12
+Namespace ID, if applicable
+.IP "cdw11" 12
+Value to set the feature to
+.IP "save" 12
+Save value across power states
+.IP "data_len" 12
+Length of feature data, if applicable, in bytes
+.IP "data" 12
+User address of feature data, if applicable
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_endurance_evt_cfg.2 b/doc/man/nvme_set_features_endurance_evt_cfg.2
new file mode 100644
index 0000000..7047b7c
--- /dev/null
+++ b/doc/man/nvme_set_features_endurance_evt_cfg.2
@@ -0,0 +1,24 @@
+.TH "nvme_set_features_endurance_evt_cfg" 9 "nvme_set_features_endurance_evt_cfg" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_endurance_evt_cfg \- Set endurance event config feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_endurance_evt_cfg
+.BI "(int fd " ","
+.BI "__u16 endgid " ","
+.BI "__u8 egwarn " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "endgid" 12
+Endurance Group Identifier
+.IP "egwarn" 12
+Flags to enable warning, see \fIenum nvme_eg_critical_warning_flags\fP
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_err_recovery.2 b/doc/man/nvme_set_features_err_recovery.2
new file mode 100644
index 0000000..c91df19
--- /dev/null
+++ b/doc/man/nvme_set_features_err_recovery.2
@@ -0,0 +1,27 @@
+.TH "nvme_set_features_err_recovery" 9 "nvme_set_features_err_recovery" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_err_recovery \- Set error recovery feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_err_recovery
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "__u16 tler " ","
+.BI "bool dulbe " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace ID
+.IP "tler" 12
+Time-limited error recovery value
+.IP "dulbe" 12
+Deallocated or Unwritten Logical Block Error Enable
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_hctm.2 b/doc/man/nvme_set_features_hctm.2
new file mode 100644
index 0000000..811da64
--- /dev/null
+++ b/doc/man/nvme_set_features_hctm.2
@@ -0,0 +1,24 @@
+.TH "nvme_set_features_hctm" 9 "nvme_set_features_hctm" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_hctm \- Set thermal management feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_hctm
+.BI "(int fd " ","
+.BI "__u16 tmt2 " ","
+.BI "__u16 tmt1 " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "tmt2" 12
+Thermal Management Temperature 2
+.IP "tmt1" 12
+Thermal Management Temperature 1
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_host_behavior.2 b/doc/man/nvme_set_features_host_behavior.2
new file mode 100644
index 0000000..3869951
--- /dev/null
+++ b/doc/man/nvme_set_features_host_behavior.2
@@ -0,0 +1,18 @@
+.TH "nvme_set_features_host_behavior" 9 "nvme_set_features_host_behavior" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_host_behavior \- Set host behavior feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_host_behavior
+.BI "(int fd " ","
+.BI "bool save " ","
+.BI "struct nvme_feat_host_behavior *data " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "save" 12
+Save value across power states
+.IP "data" 12
+Pointer to structure nvme_feat_host_behavior
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_host_id.2 b/doc/man/nvme_set_features_host_id.2
new file mode 100644
index 0000000..971b72b
--- /dev/null
+++ b/doc/man/nvme_set_features_host_id.2
@@ -0,0 +1,21 @@
+.TH "nvme_set_features_host_id" 9 "nvme_set_features_host_id" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_host_id \- Set enable extended host identifiers feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_host_id
+.BI "(int fd " ","
+.BI "bool exhid " ","
+.BI "bool save " ","
+.BI "__u8 *hostid " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "exhid" 12
+Enable Extended Host Identifier
+.IP "save" 12
+Save value across power states
+.IP "hostid" 12
+Host ID to set
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_irq_coalesce.2 b/doc/man/nvme_set_features_irq_coalesce.2
new file mode 100644
index 0000000..3841853
--- /dev/null
+++ b/doc/man/nvme_set_features_irq_coalesce.2
@@ -0,0 +1,24 @@
+.TH "nvme_set_features_irq_coalesce" 9 "nvme_set_features_irq_coalesce" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_irq_coalesce \- Set IRQ coalesce feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_irq_coalesce
+.BI "(int fd " ","
+.BI "__u8 thr " ","
+.BI "__u8 time " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "thr" 12
+Aggregation Threshold
+.IP "time" 12
+Aggregation Time
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_irq_config.2 b/doc/man/nvme_set_features_irq_config.2
new file mode 100644
index 0000000..a16f51c
--- /dev/null
+++ b/doc/man/nvme_set_features_irq_config.2
@@ -0,0 +1,24 @@
+.TH "nvme_set_features_irq_config" 9 "nvme_set_features_irq_config" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_irq_config \- Set IRQ config feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_irq_config
+.BI "(int fd " ","
+.BI "__u16 iv " ","
+.BI "bool cd " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "iv" 12
+Interrupt Vector
+.IP "cd" 12
+Coalescing Disable
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_lba_range.2 b/doc/man/nvme_set_features_lba_range.2
new file mode 100644
index 0000000..ab637ca
--- /dev/null
+++ b/doc/man/nvme_set_features_lba_range.2
@@ -0,0 +1,27 @@
+.TH "nvme_set_features_lba_range" 9 "nvme_set_features_lba_range" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_lba_range \- Set LBA range feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_lba_range
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "__u32 nr_ranges " ","
+.BI "bool save " ","
+.BI "struct nvme_lba_range_type *data " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace ID
+.IP "nr_ranges" 12
+Number of ranges in \fIdata\fP
+.IP "save" 12
+Save value across power states
+.IP "data" 12
+User address of feature data
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_lba_sts_interval.2 b/doc/man/nvme_set_features_lba_sts_interval.2
new file mode 100644
index 0000000..3391c6e
--- /dev/null
+++ b/doc/man/nvme_set_features_lba_sts_interval.2
@@ -0,0 +1,24 @@
+.TH "nvme_set_features_lba_sts_interval" 9 "nvme_set_features_lba_sts_interval" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_lba_sts_interval \- Set LBA status information feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_lba_sts_interval
+.BI "(int fd " ","
+.BI "__u16 lsiri " ","
+.BI "__u16 lsipi " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "lsiri" 12
+LBA Status Information Report Interval
+.IP "lsipi" 12
+LBA Status Information Poll Interval
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_nopsc.2 b/doc/man/nvme_set_features_nopsc.2
new file mode 100644
index 0000000..21eddf1
--- /dev/null
+++ b/doc/man/nvme_set_features_nopsc.2
@@ -0,0 +1,21 @@
+.TH "nvme_set_features_nopsc" 9 "nvme_set_features_nopsc" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_nopsc \- Set non-operational power state feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_nopsc
+.BI "(int fd " ","
+.BI "bool noppme " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "noppme" 12
+Non-Operational Power State Permissive Mode Enable
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_plm_config.2 b/doc/man/nvme_set_features_plm_config.2
new file mode 100644
index 0000000..dec33b5
--- /dev/null
+++ b/doc/man/nvme_set_features_plm_config.2
@@ -0,0 +1,27 @@
+.TH "nvme_set_features_plm_config" 9 "nvme_set_features_plm_config" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_plm_config \- Set predictable latency feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_plm_config
+.BI "(int fd " ","
+.BI "bool enable " ","
+.BI "__u16 nvmsetid " ","
+.BI "bool save " ","
+.BI "struct nvme_plm_config *data " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "enable" 12
+Predictable Latency Enable
+.IP "nvmsetid" 12
+NVM Set Identifier
+.IP "save" 12
+Save value across power states
+.IP "data" 12
+Pointer to structure nvme_plm_config
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_plm_window.2 b/doc/man/nvme_set_features_plm_window.2
new file mode 100644
index 0000000..39a112e
--- /dev/null
+++ b/doc/man/nvme_set_features_plm_window.2
@@ -0,0 +1,24 @@
+.TH "nvme_set_features_plm_window" 9 "nvme_set_features_plm_window" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_plm_window \- Set window select feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_plm_window
+.BI "(int fd " ","
+.BI "enum nvme_feat_plm_window_select sel " ","
+.BI "__u16 nvmsetid " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "sel" 12
+Window Select
+.IP "nvmsetid" 12
+NVM Set Identifier
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_power_mgmt.2 b/doc/man/nvme_set_features_power_mgmt.2
new file mode 100644
index 0000000..6a67b4b
--- /dev/null
+++ b/doc/man/nvme_set_features_power_mgmt.2
@@ -0,0 +1,24 @@
+.TH "nvme_set_features_power_mgmt" 9 "nvme_set_features_power_mgmt" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_power_mgmt \- Set power management feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_power_mgmt
+.BI "(int fd " ","
+.BI "__u8 ps " ","
+.BI "__u8 wh " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "ps" 12
+Power State
+.IP "wh" 12
+Workload Hint
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_resv_mask.2 b/doc/man/nvme_set_features_resv_mask.2
new file mode 100644
index 0000000..0cb6559
--- /dev/null
+++ b/doc/man/nvme_set_features_resv_mask.2
@@ -0,0 +1,21 @@
+.TH "nvme_set_features_resv_mask" 9 "nvme_set_features_resv_mask" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_resv_mask \- Set reservation notification mask feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_resv_mask
+.BI "(int fd " ","
+.BI "__u32 mask " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "mask" 12
+Reservation Notification Mask Field
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_resv_persist.2 b/doc/man/nvme_set_features_resv_persist.2
new file mode 100644
index 0000000..1561187
--- /dev/null
+++ b/doc/man/nvme_set_features_resv_persist.2
@@ -0,0 +1,21 @@
+.TH "nvme_set_features_resv_persist" 9 "nvme_set_features_resv_persist" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_resv_persist \- Set persist through power loss feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_resv_persist
+.BI "(int fd " ","
+.BI "bool ptpl " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "ptpl" 12
+Persist Through Power Loss
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_rrl.2 b/doc/man/nvme_set_features_rrl.2
new file mode 100644
index 0000000..1b4f212
--- /dev/null
+++ b/doc/man/nvme_set_features_rrl.2
@@ -0,0 +1,24 @@
+.TH "nvme_set_features_rrl" 9 "nvme_set_features_rrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_rrl \- Set read recovery level feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_rrl
+.BI "(int fd " ","
+.BI "__u8 rrl " ","
+.BI "__u16 nvmsetid " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "rrl" 12
+Read recovery level setting
+.IP "nvmsetid" 12
+NVM set id
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_sanitize.2 b/doc/man/nvme_set_features_sanitize.2
new file mode 100644
index 0000000..4b8c042
--- /dev/null
+++ b/doc/man/nvme_set_features_sanitize.2
@@ -0,0 +1,21 @@
+.TH "nvme_set_features_sanitize" 9 "nvme_set_features_sanitize" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_sanitize \- Set sanitize feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_sanitize
+.BI "(int fd " ","
+.BI "bool nodrm " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nodrm" 12
+No-Deallocate Response Mode
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_simple.2 b/doc/man/nvme_set_features_simple.2
new file mode 100644
index 0000000..b17c500
--- /dev/null
+++ b/doc/man/nvme_set_features_simple.2
@@ -0,0 +1,27 @@
+.TH "nvme_set_features_simple" 9 "nvme_set_features_simple" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_simple \- Helper function for @nvme_set_features()
+.SH SYNOPSIS
+.B "int" nvme_set_features_simple
+.BI "(int fd " ","
+.BI "__u8 fid " ","
+.BI "__u32 nsid " ","
+.BI "__u32 cdw11 " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "fid" 12
+Feature identifier
+.IP "nsid" 12
+Namespace ID, if applicable
+.IP "cdw11" 12
+Value to set the feature to
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_sw_progress.2 b/doc/man/nvme_set_features_sw_progress.2
new file mode 100644
index 0000000..642fb20
--- /dev/null
+++ b/doc/man/nvme_set_features_sw_progress.2
@@ -0,0 +1,21 @@
+.TH "nvme_set_features_sw_progress" 9 "nvme_set_features_sw_progress" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_sw_progress \- Set pre-boot software load count feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_sw_progress
+.BI "(int fd " ","
+.BI "__u8 pbslc " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "pbslc" 12
+Pre-boot Software Load Count
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_temp_thresh.2 b/doc/man/nvme_set_features_temp_thresh.2
new file mode 100644
index 0000000..8df4638
--- /dev/null
+++ b/doc/man/nvme_set_features_temp_thresh.2
@@ -0,0 +1,27 @@
+.TH "nvme_set_features_temp_thresh" 9 "nvme_set_features_temp_thresh" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_temp_thresh \- Set temperature threshold feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_temp_thresh
+.BI "(int fd " ","
+.BI "__u16 tmpth " ","
+.BI "__u8 tmpsel " ","
+.BI "enum nvme_feat_tmpthresh_thsel thsel " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "tmpth" 12
+Temperature Threshold
+.IP "tmpsel" 12
+Threshold Temperature Select
+.IP "thsel" 12
+Threshold Type Select
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_timestamp.2 b/doc/man/nvme_set_features_timestamp.2
new file mode 100644
index 0000000..5ada471
--- /dev/null
+++ b/doc/man/nvme_set_features_timestamp.2
@@ -0,0 +1,18 @@
+.TH "nvme_set_features_timestamp" 9 "nvme_set_features_timestamp" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_timestamp \- Set timestamp feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_timestamp
+.BI "(int fd " ","
+.BI "bool save " ","
+.BI "__u64 timestamp " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "save" 12
+Save value across power states
+.IP "timestamp" 12
+The current timestamp value to assign to this feature
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_volatile_wc.2 b/doc/man/nvme_set_features_volatile_wc.2
new file mode 100644
index 0000000..88658cb
--- /dev/null
+++ b/doc/man/nvme_set_features_volatile_wc.2
@@ -0,0 +1,21 @@
+.TH "nvme_set_features_volatile_wc" 9 "nvme_set_features_volatile_wc" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_volatile_wc \- Set volatile write cache feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_volatile_wc
+.BI "(int fd " ","
+.BI "bool wce " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "wce" 12
+Write cache enable
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_write_atomic.2 b/doc/man/nvme_set_features_write_atomic.2
new file mode 100644
index 0000000..94a9208
--- /dev/null
+++ b/doc/man/nvme_set_features_write_atomic.2
@@ -0,0 +1,21 @@
+.TH "nvme_set_features_write_atomic" 9 "nvme_set_features_write_atomic" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_write_atomic \- Set write atomic feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_write_atomic
+.BI "(int fd " ","
+.BI "bool dn " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "dn" 12
+Disable Normal
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_write_protect.2 b/doc/man/nvme_set_features_write_protect.2
new file mode 100644
index 0000000..b8af3f8
--- /dev/null
+++ b/doc/man/nvme_set_features_write_protect.2
@@ -0,0 +1,21 @@
+.TH "nvme_set_features_write_protect" 9 "nvme_set_features_write_protect" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_features_write_protect \- Set write protect feature
+.SH SYNOPSIS
+.B "int" nvme_set_features_write_protect
+.BI "(int fd " ","
+.BI "enum nvme_feat_nswpcfg_state state " ","
+.BI "bool save " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "state" 12
+Write Protection State
+.IP "save" 12
+Save value across power states
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_property.2 b/doc/man/nvme_set_property.2
new file mode 100644
index 0000000..4ce4d1f
--- /dev/null
+++ b/doc/man/nvme_set_property.2
@@ -0,0 +1,15 @@
+.TH "nvme_set_property" 9 "nvme_set_property" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_set_property \- Set controller property
+.SH SYNOPSIS
+.B "int" nvme_set_property
+.BI "(struct nvme_set_property_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_set_property_args\fP argument structure
+.SH "DESCRIPTION"
+This is an NVMe-over-Fabrics specific command, not applicable to PCIe. These
+properties align to the PCI MMIO controller registers.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_smart_crit.2 b/doc/man/nvme_smart_crit.2
new file mode 100644
index 0000000..b9a1c55
--- /dev/null
+++ b/doc/man/nvme_smart_crit.2
@@ -0,0 +1,54 @@
+.TH "libnvme" 9 "enum nvme_smart_crit" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_smart_crit \- Critical Warning
+.SH SYNOPSIS
+enum nvme_smart_crit {
+.br
+.BI " NVME_SMART_CRIT_SPARE"
+,
+.br
+.br
+.BI " NVME_SMART_CRIT_TEMPERATURE"
+,
+.br
+.br
+.BI " NVME_SMART_CRIT_DEGRADED"
+,
+.br
+.br
+.BI " NVME_SMART_CRIT_MEDIA"
+,
+.br
+.br
+.BI " NVME_SMART_CRIT_VOLATILE_MEMORY"
+,
+.br
+.br
+.BI " NVME_SMART_CRIT_PMR_RO"
+
+};
+.SH Constants
+.IP "NVME_SMART_CRIT_SPARE" 12
+If set, then the available spare capacity has fallen
+below the threshold.
+.IP "NVME_SMART_CRIT_TEMPERATURE" 12
+If set, then a temperature is either greater
+than or equal to an over temperature threshold; or
+less than or equal to an under temperature threshold.
+.IP "NVME_SMART_CRIT_DEGRADED" 12
+If set, then the NVM subsystem reliability has
+been degraded due to significant media related errors
+or any internal error that degrades NVM subsystem
+reliability.
+.IP "NVME_SMART_CRIT_MEDIA" 12
+If set, then all of the media has been placed in read
+only mode. The controller shall not set this bit if
+the read-only condition on the media is a result of
+a change in the write protection state of a namespace.
+.IP "NVME_SMART_CRIT_VOLATILE_MEMORY" 12
+If set, then the volatile memory backup
+device has failed. This field is only valid if the
+controller has a volatile memory backup solution.
+.IP "NVME_SMART_CRIT_PMR_RO" 12
+If set, then the Persistent Memory Region has become
+read-only or unreliable.
diff --git a/doc/man/nvme_smart_egcw.2 b/doc/man/nvme_smart_egcw.2
new file mode 100644
index 0000000..83716ff
--- /dev/null
+++ b/doc/man/nvme_smart_egcw.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "enum nvme_smart_egcw" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_smart_egcw \- Endurance Group Critical Warning Summary
+.SH SYNOPSIS
+enum nvme_smart_egcw {
+.br
+.BI " NVME_SMART_EGCW_SPARE"
+,
+.br
+.br
+.BI " NVME_SMART_EGCW_DEGRADED"
+,
+.br
+.br
+.BI " NVME_SMART_EGCW_RO"
+
+};
+.SH Constants
+.IP "NVME_SMART_EGCW_SPARE" 12
+If set, then the available spare capacity of one or
+more Endurance Groups has fallen below the threshold.
+.IP "NVME_SMART_EGCW_DEGRADED" 12
+If set, then the reliability of one or more
+Endurance Groups has been degraded due to significant
+media related errors or any internal error that
+degrades NVM subsystem reliability.
+.IP "NVME_SMART_EGCW_RO" 12
+If set, then the namespaces in one or more Endurance
+Groups have been placed in read only mode not as
+a result of a change in the write protection state
+of a namespace.
diff --git a/doc/man/nvme_smart_log.2 b/doc/man/nvme_smart_log.2
new file mode 100644
index 0000000..fe4c65f
--- /dev/null
+++ b/doc/man/nvme_smart_log.2
@@ -0,0 +1,235 @@
+.TH "libnvme" 9 "struct nvme_smart_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_smart_log \- SMART / Health Information Log (Log Identifier 02h)
+.SH SYNOPSIS
+struct nvme_smart_log {
+.br
+.BI " __u8 critical_warning;"
+.br
+.BI " __u8 temperature[2];"
+.br
+.BI " __u8 avail_spare;"
+.br
+.BI " __u8 spare_thresh;"
+.br
+.BI " __u8 percent_used;"
+.br
+.BI " __u8 endu_grp_crit_warn_sumry;"
+.br
+.BI " __u8 rsvd7[25];"
+.br
+.BI " __u8 data_units_read[16];"
+.br
+.BI " __u8 data_units_written[16];"
+.br
+.BI " __u8 host_reads[16];"
+.br
+.BI " __u8 host_writes[16];"
+.br
+.BI " __u8 ctrl_busy_time[16];"
+.br
+.BI " __u8 power_cycles[16];"
+.br
+.BI " __u8 power_on_hours[16];"
+.br
+.BI " __u8 unsafe_shutdowns[16];"
+.br
+.BI " __u8 media_errors[16];"
+.br
+.BI " __u8 num_err_log_entries[16];"
+.br
+.BI " __le32 warning_temp_time;"
+.br
+.BI " __le32 critical_comp_time;"
+.br
+.BI " __le16 temp_sensor[8];"
+.br
+.BI " __le32 thm_temp1_trans_count;"
+.br
+.BI " __le32 thm_temp2_trans_count;"
+.br
+.BI " __le32 thm_temp1_total_time;"
+.br
+.BI " __le32 thm_temp2_total_time;"
+.br
+.BI " __u8 rsvd232[280];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "critical_warning" 12
+This field indicates critical warnings for the state
+of the controller. Critical warnings may result in an
+asynchronous event notification to the host. Bits in
+this field represent the current associated state and
+are not persistent (see \fIenum nvme_smart_crit\fP).
+.IP "temperature" 12
+Composite Temperature: Contains a value corresponding
+to a temperature in Kelvins that represents the current
+composite temperature of the controller and namespace(s)
+associated with that controller. The manner in which
+this value is computed is implementation specific and
+may not represent the actual temperature of any physical
+point in the NVM subsystem. Warning and critical
+overheating composite temperature threshold values are
+reported by the WCTEMP and CCTEMP fields in the Identify
+Controller data structure.
+.IP "avail_spare" 12
+Available Spare: Contains a normalized percentage (0%
+to 100%) of the remaining spare capacity available.
+.IP "spare_thresh" 12
+Available Spare Threshold: When the Available Spare
+falls below the threshold indicated in this field, an
+asynchronous event completion may occur. The value is
+indicated as a normalized percentage (0% to 100%).
+The values 101 to 255 are reserved.
+.IP "percent_used" 12
+Percentage Used: Contains a vendor specific estimate
+of the percentage of NVM subsystem life used based on
+the actual usage and the manufacturer's prediction of
+NVM life. A value of 100 indicates that the estimated
+endurance of the NVM in the NVM subsystem has been
+consumed, but may not indicate an NVM subsystem failure.
+The value is allowed to exceed 100. Percentages greater
+than 254 shall be represented as 255. This value shall
+be updated once per power-on hour (when the controller
+is not in a sleep state).
+.IP "endu_grp_crit_warn_sumry" 12
+Endurance Group Critical Warning Summary: This field
+indicates critical warnings for the state of Endurance
+Groups. Bits in this field represent the current associated
+state and are not persistent (see \fIenum nvme_smart_egcw\fP).
+.IP "rsvd7" 12
+Reserved
+.IP "data_units_read" 12
+Data Units Read: Contains the number of 512 byte data
+units the host has read from the controller; this value
+does not include metadata. This value is reported in
+thousands (i.e., a value of 1 corresponds to 1000
+units of 512 bytes read) and is rounded up (e.g., one
+indicates the that number of 512 byte data units read
+is from 1 to 1000, three indicates that the number of
+512 byte data units read is from 2001 to 3000). When
+the LBA size is a value other than 512 bytes, the
+controller shall convert the amount of data read to
+512 byte units. For the NVM command set, logical blocks
+read as part of Compare, Read, and Verify operations
+shall be included in this value. A value of 0h in
+this field indicates that the number of Data Units Read
+is not reported.
+.IP "data_units_written" 12
+Data Units Written: Contains the number of 512 byte
+data units the host has written to the controller;
+this value does not include metadata. This value is
+reported in thousands (i.e., a value of 1 corresponds
+to 1000 units of 512 bytes written) and is rounded up
+(e.g., one indicates that the number of 512 byte data
+units written is from 1 to 1,000, three indicates that
+the number of 512 byte data units written is from 2001
+to 3000). When the LBA size is a value other than 512
+bytes, the controller shall convert the amount of data
+written to 512 byte units. For the NVM command set,
+logical blocks written as part of Write operations shall
+be included in this value. Write Uncorrectable commands
+and Write Zeroes commands shall not impact this value.
+A value of 0h in this field indicates that the number
+of Data Units Written is not reported.
+.IP "host_reads" 12
+Host Read Commands: Contains the number of read commands
+completed by the controller. For the NVM command set,
+this value is the sum of the number of Compare commands
+and the number of Read commands.
+.IP "host_writes" 12
+Host Write Commands: Contains the number of write
+commands completed by the controller. For the NVM
+command set, this is the number of Write commands.
+.IP "ctrl_busy_time" 12
+Controller Busy Time: Contains the amount of time the
+controller is busy with I/O commands. The controller
+is busy when there is a command outstanding to an I/O
+Queue (specifically, a command was issued via an I/O
+Submission Queue Tail doorbell write and the corresponding
+completion queue entry has not been posted yet to the
+associated I/O Completion Queue). This value is
+reported in minutes.
+.IP "power_cycles" 12
+Power Cycles: Contains the number of power cycles.
+.IP "power_on_hours" 12
+Power On Hours: Contains the number of power-on hours.
+This may not include time that the controller was
+powered and in a non-operational power state.
+.IP "unsafe_shutdowns" 12
+Unsafe Shutdowns: Contains the number of unsafe
+shutdowns. This count is incremented when a Shutdown
+Notification (CC.SHN) is not received prior to loss of power.
+.IP "media_errors" 12
+Media and Data Integrity Errors: Contains the number
+of occurrences where the controller detected an
+unrecovered data integrity error. Errors such as
+uncorrectable ECC, CRC checksum failure, or LBA tag
+mismatch are included in this field. Errors introduced
+as a result of a Write Uncorrectable command may or
+may not be included in this field.
+.IP "num_err_log_entries" 12
+Number of Error Information Log Entries: Contains the
+number of Error Information log entries over the life
+of the controller.
+.IP "warning_temp_time" 12
+Warning Composite Temperature Time: Contains the amount
+of time in minutes that the controller is operational
+and the Composite Temperature is greater than or equal
+to the Warning Composite Temperature Threshold (WCTEMP)
+field and less than the Critical Composite Temperature
+Threshold (CCTEMP) field in the Identify Controller
+data structure. If the value of the WCTEMP or CCTEMP
+field is 0h, then this field is always cleared to 0h
+regardless of the Composite Temperature value.
+.IP "critical_comp_time" 12
+Critical Composite Temperature Time: Contains the amount
+of time in minutes that the controller is operational
+and the Composite Temperature is greater than or equal
+to the Critical Composite Temperature Threshold (CCTEMP)
+field in the Identify Controller data structure. If
+the value of the CCTEMP field is 0h, then this field
+is always cleared to 0h regardless of the Composite
+Temperature value.
+.IP "temp_sensor" 12
+Temperature Sensor 1-8: Contains the current temperature
+in degrees Kelvin reported by temperature sensors 1-8.
+The physical point in the NVM subsystem whose temperature
+is reported by the temperature sensor and the temperature
+accuracy is implementation specific. An implementation
+that does not implement the temperature sensor reports
+a value of 0h.
+.IP "thm_temp1_trans_count" 12
+Thermal Management Temperature 1 Transition Count:
+Contains the number of times the controller transitioned
+to lower power active power states or performed vendor
+specific thermal management actions while minimizing
+the impact on performance in order to attempt to reduce
+the Composite Temperature because of the host controlled
+thermal management feature (i.e., the Composite
+Temperature rose above the Thermal Management
+Temperature 1). This counter shall not wrap once the
+value FFFFFFFFh is reached. A value of 0h, indicates
+that this transition has never occurred or this field
+is not implemented.
+.IP "thm_temp2_trans_count" 12
+Thermal Management Temperature 2 Transition Count
+.IP "thm_temp1_total_time" 12
+Total Time For Thermal Management Temperature 1:
+Contains the number of seconds that the controller
+had transitioned to lower power active power states or
+performed vendor specific thermal management actions
+while minimizing the impact on performance in order to
+attempt to reduce the Composite Temperature because of
+the host controlled thermal management feature. This
+counter shall not wrap once the value FFFFFFFFh is
+reached. A value of 0h, indicates that this transition
+has never occurred or this field is not implemented.
+.IP "thm_temp2_total_time" 12
+Total Time For Thermal Management Temperature 2
+.IP "rsvd232" 12
+Reserved
diff --git a/doc/man/nvme_st_code.2 b/doc/man/nvme_st_code.2
new file mode 100644
index 0000000..625b0bf
--- /dev/null
+++ b/doc/man/nvme_st_code.2
@@ -0,0 +1,43 @@
+.TH "libnvme" 9 "enum nvme_st_code" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_st_code \- Self-test Code value
+.SH SYNOPSIS
+enum nvme_st_code {
+.br
+.BI " NVME_ST_CODE_RESERVED"
+,
+.br
+.br
+.BI " NVME_ST_CODE_SHORT"
+,
+.br
+.br
+.BI " NVME_ST_CODE_EXTENDED"
+,
+.br
+.br
+.BI " NVME_ST_CODE_VS"
+,
+.br
+.br
+.BI " NVME_ST_CODE_ABORT"
+,
+.br
+.br
+.BI " NVME_ST_CODE_SHIFT"
+
+};
+.SH Constants
+.IP "NVME_ST_CODE_RESERVED" 12
+Reserved.
+.IP "NVME_ST_CODE_SHORT" 12
+Short device self-test operation.
+.IP "NVME_ST_CODE_EXTENDED" 12
+Extended device self-test operation.
+.IP "NVME_ST_CODE_VS" 12
+Vendor specific.
+.IP "NVME_ST_CODE_ABORT" 12
+Abort device self-test operation.
+.IP "NVME_ST_CODE_SHIFT" 12
+Shift amount to get the code value from the
+\fIstruct nvme_st_result\fP.dsts field.
diff --git a/doc/man/nvme_st_curr_op.2 b/doc/man/nvme_st_curr_op.2
new file mode 100644
index 0000000..11733ab
--- /dev/null
+++ b/doc/man/nvme_st_curr_op.2
@@ -0,0 +1,50 @@
+.TH "libnvme" 9 "enum nvme_st_curr_op" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_st_curr_op \- Current Device Self-Test Operation
+.SH SYNOPSIS
+enum nvme_st_curr_op {
+.br
+.BI " NVME_ST_CURR_OP_NOT_RUNNING"
+,
+.br
+.br
+.BI " NVME_ST_CURR_OP_SHORT"
+,
+.br
+.br
+.BI " NVME_ST_CURR_OP_EXTENDED"
+,
+.br
+.br
+.BI " NVME_ST_CURR_OP_VS"
+,
+.br
+.br
+.BI " NVME_ST_CURR_OP_RESERVED"
+,
+.br
+.br
+.BI " NVME_ST_CURR_OP_MASK"
+,
+.br
+.br
+.BI " NVME_ST_CURR_OP_CMPL_MASK"
+
+};
+.SH Constants
+.IP "NVME_ST_CURR_OP_NOT_RUNNING" 12
+No device self-test operation in progress.
+.IP "NVME_ST_CURR_OP_SHORT" 12
+Short device self-test operation in progress.
+.IP "NVME_ST_CURR_OP_EXTENDED" 12
+Extended device self-test operation in progress.
+.IP "NVME_ST_CURR_OP_VS" 12
+Vendor specific.
+.IP "NVME_ST_CURR_OP_RESERVED" 12
+Reserved.
+.IP "NVME_ST_CURR_OP_MASK" 12
+Mask to get the current operation value from the
+\fIstruct nvme_self_test_log\fP.current_operation field.
+.IP "NVME_ST_CURR_OP_CMPL_MASK" 12
+Mask to get the current operation completion value
+from the \fIstruct nvme_self_test_log\fP.completion field.
diff --git a/doc/man/nvme_st_result.2 b/doc/man/nvme_st_result.2
new file mode 100644
index 0000000..bd52e2d
--- /dev/null
+++ b/doc/man/nvme_st_result.2
@@ -0,0 +1,77 @@
+.TH "libnvme" 9 "struct nvme_st_result" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_st_result \- Self-test Result
+.SH SYNOPSIS
+struct nvme_st_result {
+.br
+.BI " __u8 dsts;"
+.br
+.BI " __u8 seg;"
+.br
+.BI " __u8 vdi;"
+.br
+.BI " __u8 rsvd;"
+.br
+.BI " __le64 poh;"
+.br
+.BI " __le32 nsid;"
+.br
+.BI " __le64 flba;"
+.br
+.BI " __u8 sct;"
+.br
+.BI " __u8 sc;"
+.br
+.BI " __u8 vs[2];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "dsts" 12
+Device Self-test Status: Indicates the device self-test code and the
+status of the operation (see \fIenum nvme_status_result\fP and \fIenum nvme_st_code\fP).
+.IP "seg" 12
+Segment Number: Iindicates the segment number where the first self-test
+failure occurred. If Device Self-test Status (\fIdsts\fP) is not set to
+#NVME_ST_RESULT_KNOWN_SEG_FAIL, then this field should be ignored.
+.IP "vdi" 12
+Valid Diagnostic Information: Indicates the diagnostic failure
+information that is reported. See \fIenum nvme_st_valid_diag_info\fP.
+.IP "rsvd" 12
+Reserved
+.IP "poh" 12
+Power On Hours (POH): Indicates the number of power-on hours at the
+time the device self-test operation was completed or aborted. This
+does not include time that the controller was powered and in a low
+power state condition.
+.IP "nsid" 12
+Namespace Identifier (NSID): Indicates the namespace that the Failing
+LBA occurred on. Valid only when the NSID Valid bit
+(#NVME_ST_VALID_DIAG_INFO_NSID) is set in the Valid Diagnostic
+Information (\fIvdi\fP) field.
+.IP "flba" 12
+Failing LBA: indicates the LBA of the logical block that caused the
+test to fail. If the device encountered more than one failed logical
+block during the test, then this field only indicates one of those
+failed logical blocks. Valid only when the NSID Valid bit
+(#NVME_ST_VALID_DIAG_INFO_FLBA) is set in the Valid Diagnostic
+Information (\fIvdi\fP) field.
+.IP "sct" 12
+Status Code Type: This field may contain additional information related
+to errors or conditions. Bits 2:0 may contain additional information
+relating to errors or conditions that occurred during the device
+self-test operation represented in the same format used in the Status
+Code Type field of the completion queue entry (refer to \fIenum nvme_status_field\fP).
+Valid only when the NSID Valid bit (#NVME_ST_VALID_DIAG_INFO_SCT) is
+set in the Valid Diagnostic Information (\fIvdi\fP) field.
+.IP "sc" 12
+Status Code: This field may contain additional information relating
+to errors or conditions that occurred during the device self-test
+operation represented in the same format used in the Status Code field
+of the completion queue entry. Valid only when the SCT Valid bit
+(#NVME_ST_VALID_DIAG_INFO_SC) is set in the Valid Diagnostic
+Information (\fIvdi\fP) field.
+.IP "vs" 12
+Vendor Specific.
diff --git a/doc/man/nvme_st_valid_diag_info.2 b/doc/man/nvme_st_valid_diag_info.2
new file mode 100644
index 0000000..2267645
--- /dev/null
+++ b/doc/man/nvme_st_valid_diag_info.2
@@ -0,0 +1,34 @@
+.TH "libnvme" 9 "enum nvme_st_valid_diag_info" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_st_valid_diag_info \- Valid Diagnostic Information
+.SH SYNOPSIS
+enum nvme_st_valid_diag_info {
+.br
+.BI " NVME_ST_VALID_DIAG_INFO_NSID"
+,
+.br
+.br
+.BI " NVME_ST_VALID_DIAG_INFO_FLBA"
+,
+.br
+.br
+.BI " NVME_ST_VALID_DIAG_INFO_SCT"
+,
+.br
+.br
+.BI " NVME_ST_VALID_DIAG_INFO_SC"
+
+};
+.SH Constants
+.IP "NVME_ST_VALID_DIAG_INFO_NSID" 12
+NSID Valid: if set, then the contents of
+the Namespace Identifier field are valid.
+.IP "NVME_ST_VALID_DIAG_INFO_FLBA" 12
+FLBA Valid: if set, then the contents of
+the Failing LBA field are valid.
+.IP "NVME_ST_VALID_DIAG_INFO_SCT" 12
+SCT Valid: if set, then the contents of
+the Status Code Type field are valid.
+.IP "NVME_ST_VALID_DIAG_INFO_SC" 12
+SC Valid: if set, then the contents of
+the Status Code field are valid.
diff --git a/doc/man/nvme_status_code.2 b/doc/man/nvme_status_code.2
new file mode 100644
index 0000000..34a4406
--- /dev/null
+++ b/doc/man/nvme_status_code.2
@@ -0,0 +1,12 @@
+.TH "nvme_status_code" 9 "nvme_status_code" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_status_code \- Returns the NVMe Status Code
+.SH SYNOPSIS
+.B "__u16" nvme_status_code
+.BI "(__u16 status_field " ");"
+.SH ARGUMENTS
+.IP "status_field" 12
+The NVMe Completion Queue Entry's Status Field
+See \fIenum nvme_status_field\fP
+.SH "RETURN"
+status code
diff --git a/doc/man/nvme_status_code_type.2 b/doc/man/nvme_status_code_type.2
new file mode 100644
index 0000000..6ba2454
--- /dev/null
+++ b/doc/man/nvme_status_code_type.2
@@ -0,0 +1,12 @@
+.TH "nvme_status_code_type" 9 "nvme_status_code_type" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_status_code_type \- Returns the NVMe Status Code Type
+.SH SYNOPSIS
+.B "__u16" nvme_status_code_type
+.BI "(__u16 status_field " ");"
+.SH ARGUMENTS
+.IP "status_field" 12
+The NVMe Completion Queue Entry's Status Field
+See \fIenum nvme_status_field\fP
+.SH "RETURN"
+status code type
diff --git a/doc/man/nvme_status_equals.2 b/doc/man/nvme_status_equals.2
new file mode 100644
index 0000000..3203ee4
--- /dev/null
+++ b/doc/man/nvme_status_equals.2
@@ -0,0 +1,17 @@
+.TH "nvme_status_equals" 9 "nvme_status_equals" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_status_equals \- helper to check a status against a type and value
+.SH SYNOPSIS
+.B "__u32" nvme_status_equals
+.BI "(int status " ","
+.BI "enum nvme_status_type type " ","
+.BI "unsigned int value " ");"
+.SH ARGUMENTS
+.IP "status" 12
+the (non-negative) return value from the NVMe API
+.IP "type" 12
+the status type
+.IP "value" 12
+the status value
+.SH "RETURN"
+true if \fIstatus\fP is of the specified type and value
diff --git a/doc/man/nvme_status_field.2 b/doc/man/nvme_status_field.2
new file mode 100644
index 0000000..e5df43f
--- /dev/null
+++ b/doc/man/nvme_status_field.2
@@ -0,0 +1,1158 @@
+.TH "libnvme" 9 "enum nvme_status_field" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_status_field \- Defines all parts of the nvme status field: status code, status code type, and additional flags.
+.SH SYNOPSIS
+enum nvme_status_field {
+.br
+.BI " NVME_SCT_GENERIC"
+,
+.br
+.br
+.BI " NVME_SCT_CMD_SPECIFIC"
+,
+.br
+.br
+.BI " NVME_SCT_MEDIA"
+,
+.br
+.br
+.BI " NVME_SCT_PATH"
+,
+.br
+.br
+.BI " NVME_SCT_VS"
+,
+.br
+.br
+.BI " NVME_SCT_MASK"
+,
+.br
+.br
+.BI " NVME_SCT_SHIFT"
+,
+.br
+.br
+.BI " NVME_SC_MASK"
+,
+.br
+.br
+.BI " NVME_SC_SHIFT"
+,
+.br
+.br
+.BI " NVME_SC_SUCCESS"
+,
+.br
+.br
+.BI " NVME_SC_INVALID_OPCODE"
+,
+.br
+.br
+.BI " NVME_SC_INVALID_FIELD"
+,
+.br
+.br
+.BI " NVME_SC_CMDID_CONFLICT"
+,
+.br
+.br
+.BI " NVME_SC_DATA_XFER_ERROR"
+,
+.br
+.br
+.BI " NVME_SC_POWER_LOSS"
+,
+.br
+.br
+.BI " NVME_SC_INTERNAL"
+,
+.br
+.br
+.BI " NVME_SC_ABORT_REQ"
+,
+.br
+.br
+.BI " NVME_SC_ABORT_QUEUE"
+,
+.br
+.br
+.BI " NVME_SC_FUSED_FAIL"
+,
+.br
+.br
+.BI " NVME_SC_FUSED_MISSING"
+,
+.br
+.br
+.BI " NVME_SC_INVALID_NS"
+,
+.br
+.br
+.BI " NVME_SC_CMD_SEQ_ERROR"
+,
+.br
+.br
+.BI " NVME_SC_SGL_INVALID_LAST"
+,
+.br
+.br
+.BI " NVME_SC_SGL_INVALID_COUNT"
+,
+.br
+.br
+.BI " NVME_SC_SGL_INVALID_DATA"
+,
+.br
+.br
+.BI " NVME_SC_SGL_INVALID_METADATA"
+,
+.br
+.br
+.BI " NVME_SC_SGL_INVALID_TYPE"
+,
+.br
+.br
+.BI " NVME_SC_CMB_INVALID_USE"
+,
+.br
+.br
+.BI " NVME_SC_PRP_INVALID_OFFSET"
+,
+.br
+.br
+.BI " NVME_SC_AWU_EXCEEDED"
+,
+.br
+.br
+.BI " NVME_SC_OP_DENIED"
+,
+.br
+.br
+.BI " NVME_SC_SGL_INVALID_OFFSET"
+,
+.br
+.br
+.BI " NVME_SC_HOSTID_FORMAT"
+,
+.br
+.br
+.BI " NVME_SC_KAT_EXPIRED"
+,
+.br
+.br
+.BI " NVME_SC_KAT_INVALID"
+,
+.br
+.br
+.BI " NVME_SC_CMD_ABORTED_PREMEPT"
+,
+.br
+.br
+.BI " NVME_SC_SANITIZE_FAILED"
+,
+.br
+.br
+.BI " NVME_SC_SANITIZE_IN_PROGRESS"
+,
+.br
+.br
+.BI " NVME_SC_SGL_INVALID_GRANULARITY"
+,
+.br
+.br
+.BI " NVME_SC_CMD_IN_CMBQ_NOT_SUPP"
+,
+.br
+.br
+.BI " NVME_SC_NS_WRITE_PROTECTED"
+,
+.br
+.br
+.BI " NVME_SC_CMD_INTERRUPTED"
+,
+.br
+.br
+.BI " NVME_SC_TRAN_TPORT_ERROR"
+,
+.br
+.br
+.BI " NVME_SC_PROHIBITED_BY_CMD_AND_FEAT"
+,
+.br
+.br
+.BI " NVME_SC_ADMIN_CMD_MEDIA_NOT_READY"
+,
+.br
+.br
+.BI " NVME_SC_LBA_RANGE"
+,
+.br
+.br
+.BI " NVME_SC_CAP_EXCEEDED"
+,
+.br
+.br
+.BI " NVME_SC_NS_NOT_READY"
+,
+.br
+.br
+.BI " NVME_SC_RESERVATION_CONFLICT"
+,
+.br
+.br
+.BI " NVME_SC_FORMAT_IN_PROGRESS"
+,
+.br
+.br
+.BI " NVME_SC_CQ_INVALID"
+,
+.br
+.br
+.BI " NVME_SC_QID_INVALID"
+,
+.br
+.br
+.BI " NVME_SC_QUEUE_SIZE"
+,
+.br
+.br
+.BI " NVME_SC_ABORT_LIMIT"
+,
+.br
+.br
+.BI " NVME_SC_ABORT_MISSING"
+,
+.br
+.br
+.BI " NVME_SC_ASYNC_LIMIT"
+,
+.br
+.br
+.BI " NVME_SC_FIRMWARE_SLOT"
+,
+.br
+.br
+.BI " NVME_SC_FIRMWARE_IMAGE"
+,
+.br
+.br
+.BI " NVME_SC_INVALID_VECTOR"
+,
+.br
+.br
+.BI " NVME_SC_INVALID_LOG_PAGE"
+,
+.br
+.br
+.BI " NVME_SC_INVALID_FORMAT"
+,
+.br
+.br
+.BI " NVME_SC_FW_NEEDS_CONV_RESET"
+,
+.br
+.br
+.BI " NVME_SC_INVALID_QUEUE"
+,
+.br
+.br
+.BI " NVME_SC_FEATURE_NOT_SAVEABLE"
+,
+.br
+.br
+.BI " NVME_SC_FEATURE_NOT_CHANGEABLE"
+,
+.br
+.br
+.BI " NVME_SC_FEATURE_NOT_PER_NS"
+,
+.br
+.br
+.BI " NVME_SC_FW_NEEDS_SUBSYS_RESET"
+,
+.br
+.br
+.BI " NVME_SC_FW_NEEDS_RESET"
+,
+.br
+.br
+.BI " NVME_SC_FW_NEEDS_MAX_TIME"
+,
+.br
+.br
+.BI " NVME_SC_FW_ACTIVATE_PROHIBITED"
+,
+.br
+.br
+.BI " NVME_SC_OVERLAPPING_RANGE"
+,
+.br
+.br
+.BI " NVME_SC_NS_INSUFFICIENT_CAP"
+,
+.br
+.br
+.BI " NVME_SC_NS_ID_UNAVAILABLE"
+,
+.br
+.br
+.BI " NVME_SC_NS_ALREADY_ATTACHED"
+,
+.br
+.br
+.BI " NVME_SC_NS_IS_PRIVATE"
+,
+.br
+.br
+.BI " NVME_SC_NS_NOT_ATTACHED"
+,
+.br
+.br
+.BI " NVME_SC_THIN_PROV_NOT_SUPP"
+,
+.br
+.br
+.BI " NVME_SC_CTRL_LIST_INVALID"
+,
+.br
+.br
+.BI " NVME_SC_SELF_TEST_IN_PROGRESS"
+,
+.br
+.br
+.BI " NVME_SC_BP_WRITE_PROHIBITED"
+,
+.br
+.br
+.BI " NVME_SC_INVALID_CTRL_ID"
+,
+.br
+.br
+.BI " NVME_SC_INVALID_SEC_CTRL_STATE"
+,
+.br
+.br
+.BI " NVME_SC_INVALID_CTRL_RESOURCES"
+,
+.br
+.br
+.BI " NVME_SC_INVALID_RESOURCE_ID"
+,
+.br
+.br
+.BI " NVME_SC_PMR_SAN_PROHIBITED"
+,
+.br
+.br
+.BI " NVME_SC_ANA_GROUP_ID_INVALID"
+,
+.br
+.br
+.BI " NVME_SC_ANA_ATTACH_FAILED"
+,
+.br
+.br
+.BI " NVME_SC_INSUFFICIENT_CAP"
+,
+.br
+.br
+.BI " NVME_SC_NS_ATTACHMENT_LIMIT_EXCEEDED"
+,
+.br
+.br
+.BI " NVME_SC_PROHIBIT_CMD_EXEC_NOT_SUPPORTED"
+,
+.br
+.br
+.BI " NVME_SC_IOCS_NOT_SUPPORTED"
+,
+.br
+.br
+.BI " NVME_SC_IOCS_NOT_ENABLED"
+,
+.br
+.br
+.BI " NVME_SC_IOCS_COMBINATION_REJECTED"
+,
+.br
+.br
+.BI " NVME_SC_INVALID_IOCS"
+,
+.br
+.br
+.BI " NVME_SC_ID_UNAVAILABLE"
+,
+.br
+.br
+.BI " NVME_SC_INVALID_DISCOVERY_INFO"
+,
+.br
+.br
+.BI " NVME_SC_ZONING_DATA_STRUCT_LOCKED"
+,
+.br
+.br
+.BI " NVME_SC_ZONING_DATA_STRUCT_NOTFND"
+,
+.br
+.br
+.BI " NVME_SC_INSUFFICIENT_DISC_RES"
+,
+.br
+.br
+.BI " NVME_SC_REQSTD_FUNCTION_DISABLED"
+,
+.br
+.br
+.BI " NVME_SC_ZONEGRP_ORIGINATOR_INVLD"
+,
+.br
+.br
+.BI " NVME_SC_BAD_ATTRIBUTES"
+,
+.br
+.br
+.BI " NVME_SC_INVALID_PI"
+,
+.br
+.br
+.BI " NVME_SC_READ_ONLY"
+,
+.br
+.br
+.BI " NVME_SC_CMD_SIZE_LIMIT_EXCEEDED"
+,
+.br
+.br
+.BI " NVME_SC_CONNECT_FORMAT"
+,
+.br
+.br
+.BI " NVME_SC_CONNECT_CTRL_BUSY"
+,
+.br
+.br
+.BI " NVME_SC_CONNECT_INVALID_PARAM"
+,
+.br
+.br
+.BI " NVME_SC_CONNECT_RESTART_DISC"
+,
+.br
+.br
+.BI " NVME_SC_CONNECT_INVALID_HOST"
+,
+.br
+.br
+.BI " NVME_SC_DISCONNECT_INVALID_QTYPE"
+,
+.br
+.br
+.BI " NVME_SC_DISCOVERY_RESTART"
+,
+.br
+.br
+.BI " NVME_SC_AUTH_REQUIRED"
+,
+.br
+.br
+.BI " NVME_SC_ZNS_INVALID_OP_REQUEST"
+,
+.br
+.br
+.BI " NVME_SC_ZNS_ZRWA_RESOURCES_UNAVAILABLE"
+,
+.br
+.br
+.BI " NVME_SC_ZNS_BOUNDARY_ERROR"
+,
+.br
+.br
+.BI " NVME_SC_ZNS_FULL"
+,
+.br
+.br
+.BI " NVME_SC_ZNS_READ_ONLY"
+,
+.br
+.br
+.BI " NVME_SC_ZNS_OFFLINE"
+,
+.br
+.br
+.BI " NVME_SC_ZNS_INVALID_WRITE"
+,
+.br
+.br
+.BI " NVME_SC_ZNS_TOO_MANY_ACTIVE"
+,
+.br
+.br
+.BI " NVME_SC_ZNS_TOO_MANY_OPENS"
+,
+.br
+.br
+.BI " NVME_SC_ZNS_INVAL_TRANSITION"
+,
+.br
+.br
+.BI " NVME_SC_WRITE_FAULT"
+,
+.br
+.br
+.BI " NVME_SC_READ_ERROR"
+,
+.br
+.br
+.BI " NVME_SC_GUARD_CHECK"
+,
+.br
+.br
+.BI " NVME_SC_APPTAG_CHECK"
+,
+.br
+.br
+.BI " NVME_SC_REFTAG_CHECK"
+,
+.br
+.br
+.BI " NVME_SC_COMPARE_FAILED"
+,
+.br
+.br
+.BI " NVME_SC_ACCESS_DENIED"
+,
+.br
+.br
+.BI " NVME_SC_UNWRITTEN_BLOCK"
+,
+.br
+.br
+.BI " NVME_SC_STORAGE_TAG_CHECK"
+,
+.br
+.br
+.BI " NVME_SC_ANA_INTERNAL_PATH_ERROR"
+,
+.br
+.br
+.BI " NVME_SC_ANA_PERSISTENT_LOSS"
+,
+.br
+.br
+.BI " NVME_SC_ANA_INACCESSIBLE"
+,
+.br
+.br
+.BI " NVME_SC_ANA_TRANSITION"
+,
+.br
+.br
+.BI " NVME_SC_CTRL_PATH_ERROR"
+,
+.br
+.br
+.BI " NVME_SC_HOST_PATH_ERROR"
+,
+.br
+.br
+.BI " NVME_SC_CMD_ABORTED_BY_HOST"
+,
+.br
+.br
+.BI " NVME_SC_CRD"
+,
+.br
+.br
+.BI " NVME_SC_MORE"
+,
+.br
+.br
+.BI " NVME_SC_DNR"
+
+};
+.SH Constants
+.IP "NVME_SCT_GENERIC" 12
+Generic errors applicable to multiple opcodes
+.IP "NVME_SCT_CMD_SPECIFIC" 12
+Errors associated to a specific opcode
+.IP "NVME_SCT_MEDIA" 12
+Errors associated with media and data integrity
+.IP "NVME_SCT_PATH" 12
+Errors associated with the paths connection
+.IP "NVME_SCT_VS" 12
+Vendor specific errors
+.IP "NVME_SCT_MASK" 12
+Mask to get the value of the Status Code Type
+.IP "NVME_SCT_SHIFT" 12
+Shift value to get the value of the Status
+Code Type
+.IP "NVME_SC_MASK" 12
+Mask to get the value of the status code.
+.IP "NVME_SC_SHIFT" 12
+Shift value to get the value of the status
+code.
+.IP "NVME_SC_SUCCESS" 12
+Successful Completion: The command
+completed without error.
+.IP "NVME_SC_INVALID_OPCODE" 12
+Invalid Command Opcode: A reserved coded
+value or an unsupported value in the
+command opcode field.
+.IP "NVME_SC_INVALID_FIELD" 12
+Invalid Field in Command: A reserved
+coded value or an unsupported value in a
+defined field.
+.IP "NVME_SC_CMDID_CONFLICT" 12
+Command ID Conflict: The command
+identifier is already in use.
+.IP "NVME_SC_DATA_XFER_ERROR" 12
+Data Transfer Error: Transferring the
+data or metadata associated with a
+command experienced an error.
+.IP "NVME_SC_POWER_LOSS" 12
+Commands Aborted due to Power Loss
+Notification: Indicates that the command
+was aborted due to a power loss
+notification.
+.IP "NVME_SC_INTERNAL" 12
+Internal Error: The command was not
+completed successfully due to an internal error.
+.IP "NVME_SC_ABORT_REQ" 12
+Command Abort Requested: The command was
+aborted due to an Abort command being
+received that specified the Submission
+Queue Identifier and Command Identifier
+of this command.
+.IP "NVME_SC_ABORT_QUEUE" 12
+Command Aborted due to SQ Deletion: The
+command was aborted due to a Delete I/O
+Submission Queue request received for the
+Submission Queue to which the command was
+submitted.
+.IP "NVME_SC_FUSED_FAIL" 12
+Command Aborted due to Failed Fused Command:
+The command was aborted due to the other
+command in a fused operation failing.
+.IP "NVME_SC_FUSED_MISSING" 12
+Aborted due to Missing Fused Command: The
+fused command was aborted due to the
+adjacent submission queue entry not
+containing a fused command that is the
+other command.
+.IP "NVME_SC_INVALID_NS" 12
+Invalid Namespace or Format: The
+namespace or the format of that namespace
+is invalid.
+.IP "NVME_SC_CMD_SEQ_ERROR" 12
+Command Sequence Error: The command was
+aborted due to a protocol violation in a
+multi-command sequence.
+.IP "NVME_SC_SGL_INVALID_LAST" 12
+Invalid SGL Segment Descriptor: The
+command includes an invalid SGL Last
+Segment or SGL Segment descriptor.
+.IP "NVME_SC_SGL_INVALID_COUNT" 12
+Invalid Number of SGL Descriptors: There
+is an SGL Last Segment descriptor or an
+SGL Segment descriptor in a location
+other than the last descriptor of a
+segment based on the length indicated.
+.IP "NVME_SC_SGL_INVALID_DATA" 12
+Data SGL Length Invalid: This may occur
+if the length of a Data SGL is too short.
+This may occur if the length of a Data
+SGL is too long and the controller does
+not support SGL transfers longer than the
+amount of data to be transferred as
+indicated in the SGL Support field of the
+Identify Controller data structure.
+.IP "NVME_SC_SGL_INVALID_METADATA" 12
+Metadata SGL Length Invalid: This may
+occur if the length of a Metadata SGL is
+too short. This may occur if the length
+of a Metadata SGL is too long and the
+controller does not support SGL transfers
+longer than the amount of data to be
+transferred as indicated in the SGL
+Support field of the Identify Controller
+data structure.
+.IP "NVME_SC_SGL_INVALID_TYPE" 12
+SGL Descriptor Type Invalid: The type of
+an SGL Descriptor is a type that is not
+supported by the controller.
+.IP "NVME_SC_CMB_INVALID_USE" 12
+Invalid Use of Controller Memory Buffer:
+The attempted use of the Controller
+Memory Buffer is not supported by the
+controller.
+.IP "NVME_SC_PRP_INVALID_OFFSET" 12
+PRP Offset Invalid: The Offset field for
+a PRP entry is invalid.
+.IP "NVME_SC_AWU_EXCEEDED" 12
+Atomic Write Unit Exceeded: The length
+specified exceeds the atomic write unit size.
+.IP "NVME_SC_OP_DENIED" 12
+Operation Denied: The command was denied
+due to lack of access rights. Refer to
+the appropriate security specification.
+.IP "NVME_SC_SGL_INVALID_OFFSET" 12
+SGL Offset Invalid: The offset specified
+in a descriptor is invalid. This may
+occur when using capsules for data
+transfers in NVMe over Fabrics
+implementations and an invalid offset in
+the capsule is specified.
+.IP "NVME_SC_HOSTID_FORMAT" 12
+Host Identifier Inconsistent Format: The
+NVM subsystem detected the simultaneous
+use of 64- bit and 128-bit Host
+Identifier values on different
+controllers.
+.IP "NVME_SC_KAT_EXPIRED" 12
+Keep Alive Timer Expired: The Keep Alive
+Timer expired.
+.IP "NVME_SC_KAT_INVALID" 12
+Keep Alive Timeout Invalid: The Keep
+Alive Timeout value specified is invalid.
+.IP "NVME_SC_CMD_ABORTED_PREMEPT" 12
+Command Aborted due to Preempt and Abort:
+The command was aborted due to a
+Reservation Acquire command.
+.IP "NVME_SC_SANITIZE_FAILED" 12
+Sanitize Failed: The most recent sanitize
+operation failed and no recovery action
+has been successfully completed.
+.IP "NVME_SC_SANITIZE_IN_PROGRESS" 12
+Sanitize In Progress: The requested
+function (e.g., command) is prohibited
+while a sanitize operation is in
+progress.
+.IP "NVME_SC_SGL_INVALID_GRANULARITY" 12
+SGL Data Block Granularity Invalid: The
+Address alignment or Length granularity
+for an SGL Data Block descriptor is
+invalid.
+.IP "NVME_SC_CMD_IN_CMBQ_NOT_SUPP" 12
+Command Not Supported for Queue in CMB:
+The implementation does not support
+submission of the command to a Submission
+Queue in the Controller Memory Buffer or
+command completion to a Completion Queue
+in the Controller Memory Buffer.
+.IP "NVME_SC_NS_WRITE_PROTECTED" 12
+Namespace is Write Protected: The command
+is prohibited while the namespace is
+write protected as a result of a change
+in the namespace write protection state
+as defined by the Namespace Write
+Protection State Machine.
+.IP "NVME_SC_CMD_INTERRUPTED" 12
+Command Interrupted: Command processing
+was interrupted and the controller is
+unable to successfully complete the
+command. The host should retry the
+command.
+.IP "NVME_SC_TRAN_TPORT_ERROR" 12
+Transient Transport Error: A transient
+transport error was detected. If the
+command is retried on the same
+controller, the command is likely to
+succeed. A command that fails with a
+transient transport error four or more
+times should be treated as a persistent
+transport error that is not likely to
+succeed if retried on the same
+controller.
+.IP "NVME_SC_PROHIBITED_BY_CMD_AND_FEAT" 12
+Command Prohibited by Command and Feature
+Lockdown: The command was aborted due to
+command execution being prohibited by
+the Command and Feature Lockdown.
+.IP "NVME_SC_ADMIN_CMD_MEDIA_NOT_READY" 12
+Admin Command Media Not Ready: The Admin
+command requires access to media and
+the media is not ready.
+.IP "NVME_SC_LBA_RANGE" 12
+LBA Out of Range: The command references
+an LBA that exceeds the size of the namespace.
+.IP "NVME_SC_CAP_EXCEEDED" 12
+Capacity Exceeded: Execution of the
+command has caused the capacity of the
+namespace to be exceeded.
+.IP "NVME_SC_NS_NOT_READY" 12
+Namespace Not Ready: The namespace is not
+ready to be accessed as a result of a
+condition other than a condition that is
+reported as an Asymmetric Namespace
+Access condition.
+.IP "NVME_SC_RESERVATION_CONFLICT" 12
+Reservation Conflict: The command was
+aborted due to a conflict with a
+reservation held on the accessed
+namespace.
+.IP "NVME_SC_FORMAT_IN_PROGRESS" 12
+Format In Progress: A Format NVM command
+is in progress on the namespace.
+.IP "NVME_SC_CQ_INVALID" 12
+Completion Queue Invalid: The Completion
+Queue identifier specified in the command
+does not exist.
+.IP "NVME_SC_QID_INVALID" 12
+Invalid Queue Identifier: The creation of
+the I/O Completion Queue failed due to an
+invalid queue identifier specified as
+part of the command. An invalid queue
+identifier is one that is currently in
+use or one that is outside the range
+supported by the controller.
+.IP "NVME_SC_QUEUE_SIZE" 12
+Invalid Queue Size: The host attempted to
+create an I/O Completion Queue with an
+invalid number of entries.
+.IP "NVME_SC_ABORT_LIMIT" 12
+Abort Command Limit Exceeded: The number
+of concurrently outstanding Abort commands
+has exceeded the limit indicated in the
+Identify Controller data structure.
+.IP "NVME_SC_ABORT_MISSING" 12
+Abort Command is missing: The abort
+command is missing.
+.IP "NVME_SC_ASYNC_LIMIT" 12
+Asynchronous Event Request Limit
+Exceeded: The number of concurrently
+outstanding Asynchronous Event Request
+commands has been exceeded.
+.IP "NVME_SC_FIRMWARE_SLOT" 12
+Invalid Firmware Slot: The firmware slot
+indicated is invalid or read only. This
+error is indicated if the firmware slot
+exceeds the number supported.
+.IP "NVME_SC_FIRMWARE_IMAGE" 12
+Invalid Firmware Image: The firmware
+image specified for activation is invalid
+and not loaded by the controller.
+.IP "NVME_SC_INVALID_VECTOR" 12
+Invalid Interrupt Vector: The creation of
+the I/O Completion Queue failed due to an
+invalid interrupt vector specified as
+part of the command.
+.IP "NVME_SC_INVALID_LOG_PAGE" 12
+Invalid Log Page: The log page indicated
+is invalid. This error condition is also
+returned if a reserved log page is
+requested.
+.IP "NVME_SC_INVALID_FORMAT" 12
+Invalid Format: The LBA Format specified
+is not supported.
+.IP "NVME_SC_FW_NEEDS_CONV_RESET" 12
+Firmware Activation Requires Conventional Reset:
+The firmware commit was successful,
+however, activation of the firmware image
+requires a conventional reset.
+.IP "NVME_SC_INVALID_QUEUE" 12
+Invalid Queue Deletion: Invalid I/O
+Completion Queue specified to delete.
+.IP "NVME_SC_FEATURE_NOT_SAVEABLE" 12
+Feature Identifier Not Saveable: The
+Feature Identifier specified does not
+support a saveable value.
+.IP "NVME_SC_FEATURE_NOT_CHANGEABLE" 12
+Feature Not Changeable: The Feature
+Identifier is not able to be changed.
+.IP "NVME_SC_FEATURE_NOT_PER_NS" 12
+Feature Not Namespace Specific: The
+Feature Identifier specified is not
+namespace specific. The Feature
+Identifier settings apply across all
+namespaces.
+.IP "NVME_SC_FW_NEEDS_SUBSYS_RESET" 12
+Firmware Activation Requires NVM
+Subsystem Reset: The firmware commit was
+successful, however, activation of the
+firmware image requires an NVM Subsystem.
+.IP "NVME_SC_FW_NEEDS_RESET" 12
+Firmware Activation Requires Controller
+Level Reset: The firmware commit was
+successful; however, the image specified
+does not support being activated without
+a reset.
+.IP "NVME_SC_FW_NEEDS_MAX_TIME" 12
+Firmware Activation Requires Maximum Time
+Violation: The image specified if
+activated immediately would exceed the
+Maximum Time for Firmware Activation
+(MTFA) value reported in Identify
+Controller.
+.IP "NVME_SC_FW_ACTIVATE_PROHIBITED" 12
+Firmware Activation Prohibited: The image
+specified is being prohibited from
+activation by the controller for vendor
+specific reasons.
+.IP "NVME_SC_OVERLAPPING_RANGE" 12
+Overlapping Range: The downloaded
+firmware image has overlapping ranges.
+.IP "NVME_SC_NS_INSUFFICIENT_CAP" 12
+Namespace Insufficient Capacity: Creating
+the namespace requires more free space
+than is currently available.
+.IP "NVME_SC_NS_ID_UNAVAILABLE" 12
+Namespace Identifier Unavailable: The
+number of namespaces supported has been
+exceeded.
+.IP "NVME_SC_NS_ALREADY_ATTACHED" 12
+Namespace Already Attached: The
+controller is already attached to the
+namespace specified.
+.IP "NVME_SC_NS_IS_PRIVATE" 12
+Namespace Is Private: The namespace is
+private and is already attached to one
+controller.
+.IP "NVME_SC_NS_NOT_ATTACHED" 12
+Namespace Not Attached: The request to
+detach the controller could not be
+completed because the controller is not
+attached to the namespace.
+.IP "NVME_SC_THIN_PROV_NOT_SUPP" 12
+Thin Provisioning Not Supported: Thin
+provisioning is not supported by the
+controller.
+.IP "NVME_SC_CTRL_LIST_INVALID" 12
+Controller List Invalid: The controller
+list provided contains invalid controller
+ids.
+.IP "NVME_SC_SELF_TEST_IN_PROGRESS" 12
+Device Self-test In Progress: The controller
+or NVM subsystem already has a device
+self-test operation in process.
+.IP "NVME_SC_BP_WRITE_PROHIBITED" 12
+Boot Partition Write Prohibited: The
+command is trying to modify a locked Boot
+Partition.
+.IP "NVME_SC_INVALID_CTRL_ID" 12
+Invalid Controller Identifier:
+.IP "NVME_SC_INVALID_SEC_CTRL_STATE" 12
+Invalid Secondary Controller State
+.IP "NVME_SC_INVALID_CTRL_RESOURCES" 12
+Invalid Number of Controller Resources
+.IP "NVME_SC_INVALID_RESOURCE_ID" 12
+Invalid Resource Identifier
+.IP "NVME_SC_PMR_SAN_PROHIBITED" 12
+Sanitize Prohibited While Persistent
+Memory Region is Enabled
+.IP "NVME_SC_ANA_GROUP_ID_INVALID" 12
+ANA Group Identifier Invalid: The specified
+ANA Group Identifier (ANAGRPID) is not
+supported in the submitted command.
+.IP "NVME_SC_ANA_ATTACH_FAILED" 12
+ANA Attach Failed: The controller is not
+attached to the namespace as a result
+of an ANA condition.
+.IP "NVME_SC_INSUFFICIENT_CAP" 12
+Insufficient Capacity: Requested operation
+requires more free space than is currently
+available.
+.IP "NVME_SC_NS_ATTACHMENT_LIMIT_EXCEEDED" 12
+Namespace Attachment Limit Exceeded:
+Attaching the ns to a controller causes
+max number of ns attachments allowed
+to be exceeded.
+.IP "NVME_SC_PROHIBIT_CMD_EXEC_NOT_SUPPORTED" 12
+Prohibition of Command Execution
+Not Supported
+.IP "NVME_SC_IOCS_NOT_SUPPORTED" 12
+I/O Command Set Not Supported
+.IP "NVME_SC_IOCS_NOT_ENABLED" 12
+I/O Command Set Not Enabled
+.IP "NVME_SC_IOCS_COMBINATION_REJECTED" 12
+I/O Command Set Combination Rejected
+.IP "NVME_SC_INVALID_IOCS" 12
+Invalid I/O Command Set
+.IP "NVME_SC_ID_UNAVAILABLE" 12
+Identifier Unavailable
+.IP "NVME_SC_INVALID_DISCOVERY_INFO" 12
+The discovery information provided in
+one or more extended discovery
+information entries is not applicable
+for the type of entity selected in
+the Entity Type (ETYPE) field of the
+Discovery Information Management
+command data portion’s header.
+.IP "NVME_SC_ZONING_DATA_STRUCT_LOCKED" 12
+The requested Zoning data structure
+is locked on the CDC.
+.IP "NVME_SC_ZONING_DATA_STRUCT_NOTFND" 12
+The requested Zoning data structure
+does not exist on the CDC.
+.IP "NVME_SC_INSUFFICIENT_DISC_RES" 12
+The number of discover information
+entries provided in the data portion
+of the Discovery Information
+Management command for a registration
+task (i.e., TAS field cleared to 0h)
+exceeds the available capacity for
+new discovery information entries on
+the CDC or DDC. This may be a
+transient condition.
+.IP "NVME_SC_REQSTD_FUNCTION_DISABLED" 12
+Fabric Zoning is not enabled on the
+CDC
+.IP "NVME_SC_ZONEGRP_ORIGINATOR_INVLD" 12
+The NQN contained in the ZoneGroup
+Originator field does not match the
+Host NQN used by the DDC to connect
+to the CDC.
+.IP "NVME_SC_BAD_ATTRIBUTES" 12
+Conflicting Dataset Management Attributes
+.IP "NVME_SC_INVALID_PI" 12
+Invalid Protection Information
+.IP "NVME_SC_READ_ONLY" 12
+Attempted Write to Read Only Range
+.IP "NVME_SC_CMD_SIZE_LIMIT_EXCEEDED" 12
+Command Size Limit Exceeded
+.IP "NVME_SC_CONNECT_FORMAT" 12
+Incompatible Format: The NVM subsystem
+does not support the record format
+specified by the host.
+.IP "NVME_SC_CONNECT_CTRL_BUSY" 12
+Controller Busy: The controller is
+already associated with a host.
+.IP "NVME_SC_CONNECT_INVALID_PARAM" 12
+Connect Invalid Parameters: One or more
+of the command parameters.
+.IP "NVME_SC_CONNECT_RESTART_DISC" 12
+Connect Restart Discovery: The NVM
+subsystem requested is not available.
+.IP "NVME_SC_CONNECT_INVALID_HOST" 12
+Connect Invalid Host: The host is either
+not allowed to establish an association
+to any controller in the NVM subsystem or
+the host is not allowed to establish an
+association to the specified controller
+.IP "NVME_SC_DISCONNECT_INVALID_QTYPE" 12
+Invalid Queue Type: The command was sent
+on the wrong queue type.
+.IP "NVME_SC_DISCOVERY_RESTART" 12
+Discover Restart: The snapshot of the
+records is now invalid or out of date.
+.IP "NVME_SC_AUTH_REQUIRED" 12
+Authentication Required: NVMe in-band
+authentication is required and the queue
+has not yet been authenticated.
+.IP "NVME_SC_ZNS_INVALID_OP_REQUEST" 12
+Invalid Zone Operation Request:
+The operation requested is invalid. This may be due to
+various conditions, including: attempting to allocate a
+ZRWA when a zone is not in the ZSE:Empty state; or
+invalid Flush Explicit ZRWA Range Send Zone Action
+operation.
+.IP "NVME_SC_ZNS_ZRWA_RESOURCES_UNAVAILABLE" 12
+ZRWA Resources Unavailable:
+No ZRWAs are available.
+.IP "NVME_SC_ZNS_BOUNDARY_ERROR" 12
+Zone Boundary Error: The command specifies
+logical blocks in more than one zone.
+.IP "NVME_SC_ZNS_FULL" 12
+Zone Is Full: The accessed zone is in the
+ZSF:Full state.
+.IP "NVME_SC_ZNS_READ_ONLY" 12
+Zone Is Read Only: The accessed zone is
+in the ZSRO:Read Only state.
+.IP "NVME_SC_ZNS_OFFLINE" 12
+Zone Is Offline: The accessed zone is
+in the ZSO:Offline state.
+.IP "NVME_SC_ZNS_INVALID_WRITE" 12
+Zone Invalid Write: The write to a zone
+was not at the write pointer.
+.IP "NVME_SC_ZNS_TOO_MANY_ACTIVE" 12
+Too Many Active Zones: The controller
+does not allow additional active zones.
+.IP "NVME_SC_ZNS_TOO_MANY_OPENS" 12
+Too Many Open Zones: The controller does
+not allow additional open zones.
+.IP "NVME_SC_ZNS_INVAL_TRANSITION" 12
+Invalid Zone State Transition: The request
+is not a valid zone state transition.
+.IP "NVME_SC_WRITE_FAULT" 12
+Write Fault: The write data could not be
+committed to the media.
+.IP "NVME_SC_READ_ERROR" 12
+Unrecovered Read Error: The read data
+could not be recovered from the media.
+.IP "NVME_SC_GUARD_CHECK" 12
+End-to-end Guard Check Error: The command
+was aborted due to an end-to-end guard
+check failure.
+.IP "NVME_SC_APPTAG_CHECK" 12
+End-to-end Application Tag Check Error:
+The command was aborted due to an
+end-to-end application tag check failure.
+.IP "NVME_SC_REFTAG_CHECK" 12
+End-to-end Reference Tag Check Error: The
+command was aborted due to an end-to-end
+reference tag check failure.
+.IP "NVME_SC_COMPARE_FAILED" 12
+Compare Failure: The command failed due
+to a miscompare during a Compare command.
+.IP "NVME_SC_ACCESS_DENIED" 12
+Access Denied: Access to the namespace
+and/or LBA range is denied due to lack of
+access rights.
+.IP "NVME_SC_UNWRITTEN_BLOCK" 12
+Deallocated or Unwritten Logical Block:
+The command failed due to an attempt to
+read from or verify an LBA range
+containing a deallocated or unwritten
+logical block.
+.IP "NVME_SC_STORAGE_TAG_CHECK" 12
+End-to-End Storage Tag Check Error: The
+command was aborted due to an end-to-end
+storage tag check failure.
+.IP "NVME_SC_ANA_INTERNAL_PATH_ERROR" 12
+Internal Path Error: The command was not
+completed as the result of a controller
+internal error that is specific to the
+controller processing the command.
+.IP "NVME_SC_ANA_PERSISTENT_LOSS" 12
+Asymmetric Access Persistent Loss: The
+requested function (e.g., command) is not
+able to be performed as a result of the
+relationship between the controller and
+the namespace being in the ANA Persistent
+Loss state.
+.IP "NVME_SC_ANA_INACCESSIBLE" 12
+Asymmetric Access Inaccessible: The
+requested function (e.g., command) is not
+able to be performed as a result of the
+relationship between the controller and
+the namespace being in the ANA
+Inaccessible state.
+.IP "NVME_SC_ANA_TRANSITION" 12
+Asymmetric Access Transition: The
+requested function (e.g., command) is not
+able to be performed as a result of the
+relationship between the controller and
+the namespace transitioning between
+Asymmetric Namespace Access states.
+.IP "NVME_SC_CTRL_PATH_ERROR" 12
+Controller Pathing Error: A pathing error
+was detected by the controller.
+.IP "NVME_SC_HOST_PATH_ERROR" 12
+Host Pathing Error: A pathing error was
+detected by the host.
+.IP "NVME_SC_CMD_ABORTED_BY_HOST" 12
+Command Aborted By Host: The command was
+aborted as a result of host action.
+.IP "NVME_SC_CRD" 12
+Mask to get value of Command Retry Delay
+index
+.IP "NVME_SC_MORE" 12
+More bit. If set, more status information
+for this command as part of the Error
+Information log that may be retrieved with
+the Get Log Page command.
+.IP "NVME_SC_DNR" 12
+Do Not Retry bit. If set, if the same
+command is re-submitted to any controller
+in the NVM subsystem, then that
+re-submitted command is expected to fail.
diff --git a/doc/man/nvme_status_get_type.2 b/doc/man/nvme_status_get_type.2
new file mode 100644
index 0000000..6e5bfaa
--- /dev/null
+++ b/doc/man/nvme_status_get_type.2
@@ -0,0 +1,11 @@
+.TH "nvme_status_get_type" 9 "nvme_status_get_type" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_status_get_type \- extract the type from a nvme_* return value
+.SH SYNOPSIS
+.B "__u32" nvme_status_get_type
+.BI "(int status " ");"
+.SH ARGUMENTS
+.IP "status" 12
+the (non-negative) return value from the NVMe API
+.SH "RETURN"
+the type component of the status.
diff --git a/doc/man/nvme_status_get_value.2 b/doc/man/nvme_status_get_value.2
new file mode 100644
index 0000000..4037129
--- /dev/null
+++ b/doc/man/nvme_status_get_value.2
@@ -0,0 +1,12 @@
+.TH "nvme_status_get_value" 9 "nvme_status_get_value" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_status_get_value \- extract the status value from a nvme_* return value
+.SH SYNOPSIS
+.B "__u32" nvme_status_get_value
+.BI "(int status " ");"
+.SH ARGUMENTS
+.IP "status" 12
+the (non-negative) return value from the NVMe API
+.SH "RETURN"
+the value component of the status; the set of values will depend
+on the status type.
diff --git a/doc/man/nvme_status_result.2 b/doc/man/nvme_status_result.2
new file mode 100644
index 0000000..341cf43
--- /dev/null
+++ b/doc/man/nvme_status_result.2
@@ -0,0 +1,87 @@
+.TH "libnvme" 9 "enum nvme_status_result" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_status_result \- Result of the device self-test operation
+.SH SYNOPSIS
+enum nvme_status_result {
+.br
+.BI " NVME_ST_RESULT_NO_ERR"
+,
+.br
+.br
+.BI " NVME_ST_RESULT_ABORTED"
+,
+.br
+.br
+.BI " NVME_ST_RESULT_CLR"
+,
+.br
+.br
+.BI " NVME_ST_RESULT_NS_REMOVED"
+,
+.br
+.br
+.BI " NVME_ST_RESULT_ABORTED_FORMAT"
+,
+.br
+.br
+.BI " NVME_ST_RESULT_FATAL_ERR"
+,
+.br
+.br
+.BI " NVME_ST_RESULT_UNKNOWN_SEG_FAIL"
+,
+.br
+.br
+.BI " NVME_ST_RESULT_KNOWN_SEG_FAIL"
+,
+.br
+.br
+.BI " NVME_ST_RESULT_ABORTED_UNKNOWN"
+,
+.br
+.br
+.BI " NVME_ST_RESULT_ABORTED_SANITIZE"
+,
+.br
+.br
+.BI " NVME_ST_RESULT_NOT_USED"
+,
+.br
+.br
+.BI " NVME_ST_RESULT_MASK"
+
+};
+.SH Constants
+.IP "NVME_ST_RESULT_NO_ERR" 12
+Operation completed without error.
+.IP "NVME_ST_RESULT_ABORTED" 12
+Operation was aborted by a Device Self-test command.
+.IP "NVME_ST_RESULT_CLR" 12
+Operation was aborted by a Controller Level Reset.
+.IP "NVME_ST_RESULT_NS_REMOVED" 12
+Operation was aborted due to a removal of
+a namespace from the namespace inventory.
+.IP "NVME_ST_RESULT_ABORTED_FORMAT" 12
+Operation was aborted due to the processing
+of a Format NVM command.
+.IP "NVME_ST_RESULT_FATAL_ERR" 12
+A fatal error or unknown test error occurred
+while the controller was executing the device
+self-test operation and the operation did
+not complete.
+.IP "NVME_ST_RESULT_UNKNOWN_SEG_FAIL" 12
+Operation completed with a segment that failed
+and the segment that failed is not known.
+.IP "NVME_ST_RESULT_KNOWN_SEG_FAIL" 12
+Operation completed with one or more failed
+segments and the first segment that failed
+is indicated in the Segment Number field.
+.IP "NVME_ST_RESULT_ABORTED_UNKNOWN" 12
+Operation was aborted for unknown reason.
+.IP "NVME_ST_RESULT_ABORTED_SANITIZE" 12
+Operation was aborted due to a sanitize operation.
+.IP "NVME_ST_RESULT_NOT_USED" 12
+Entry not used (does not contain a test result).
+.IP "NVME_ST_RESULT_MASK" 12
+Mask to get the status result value from
+the \fIstruct nvme_st_result\fP.dsts field.
diff --git a/doc/man/nvme_status_to_errno.2 b/doc/man/nvme_status_to_errno.2
new file mode 100644
index 0000000..b244b98
--- /dev/null
+++ b/doc/man/nvme_status_to_errno.2
@@ -0,0 +1,15 @@
+.TH "nvme_status_to_errno" 9 "nvme_status_to_errno" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_status_to_errno \- Converts nvme return status to errno
+.SH SYNOPSIS
+.B "__u8" nvme_status_to_errno
+.BI "(int status " ","
+.BI "bool fabrics " ");"
+.SH ARGUMENTS
+.IP "status" 12
+Return status from an nvme passthrough command
+.IP "fabrics" 12
+Set to true if \fIstatus\fP is to a fabrics target.
+.SH "RETURN"
+An errno representing the nvme status if it is an nvme status field,
+or unchanged status is < 0 since errno is already set.
diff --git a/doc/man/nvme_status_to_string.2 b/doc/man/nvme_status_to_string.2
new file mode 100644
index 0000000..608f314
--- /dev/null
+++ b/doc/man/nvme_status_to_string.2
@@ -0,0 +1,15 @@
+.TH "nvme_status_to_string" 9 "nvme_status_to_string" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_status_to_string \- Returns string describing nvme return status.
+.SH SYNOPSIS
+.B "const char *" nvme_status_to_string
+.BI "(int status " ","
+.BI "bool fabrics " ");"
+.SH ARGUMENTS
+.IP "status" 12
+Return status from an nvme passthrough command
+.IP "fabrics" 12
+Set to true if \fIstatus\fP is to a fabrics target.
+.SH "RETURN"
+String representation of the nvme status if it is an nvme status field,
+or a standard errno string if status is < 0.
diff --git a/doc/man/nvme_status_type.2 b/doc/man/nvme_status_type.2
new file mode 100644
index 0000000..aa76128
--- /dev/null
+++ b/doc/man/nvme_status_type.2
@@ -0,0 +1,40 @@
+.TH "libnvme" 9 "enum nvme_status_type" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_status_type \- type encoding for NVMe return values, when represented as an int.
+.SH SYNOPSIS
+enum nvme_status_type {
+.br
+.BI " NVME_STATUS_TYPE_SHIFT"
+,
+.br
+.br
+.BI " NVME_STATUS_TYPE_MASK"
+,
+.br
+.br
+.BI " NVME_STATUS_TYPE_NVME"
+,
+.br
+.br
+.BI " NVME_STATUS_TYPE_MI"
+
+};
+.SH Constants
+.IP "NVME_STATUS_TYPE_SHIFT" 12
+shift value for status bits
+.IP "NVME_STATUS_TYPE_MASK" 12
+mask value for status bits
+.IP "NVME_STATUS_TYPE_NVME" 12
+NVMe command status value, typically from CDW3
+.IP "NVME_STATUS_TYPE_MI" 12
+NVMe-MI header status
+.SH "Description"
+
+The nvme_* api returns an int, with negative values indicating an internal
+or syscall error, zero signifying success, positive values representing
+the NVMe status.
+
+That latter case (the NVMe status) may represent status values from
+different parts of the transport/controller/etc, and are at most 16 bits of
+data. So, we use the most-significant 3 bits of the signed int to indicate
+which type of status this is.
diff --git a/doc/man/nvme_streams_directive_params.2 b/doc/man/nvme_streams_directive_params.2
new file mode 100644
index 0000000..f0b44ef
--- /dev/null
+++ b/doc/man/nvme_streams_directive_params.2
@@ -0,0 +1,51 @@
+.TH "libnvme" 9 "struct nvme_streams_directive_params" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_streams_directive_params \- Streams Directive - Return Parameters Data Structure
+.SH SYNOPSIS
+struct nvme_streams_directive_params {
+.br
+.BI " __le16 msl;"
+.br
+.BI " __le16 nssa;"
+.br
+.BI " __le16 nsso;"
+.br
+.BI " __u8 nssc;"
+.br
+.BI " __u8 rsvd[9];"
+.br
+.BI " __le32 sws;"
+.br
+.BI " __le16 sgs;"
+.br
+.BI " __le16 nsa;"
+.br
+.BI " __le16 nso;"
+.br
+.BI " __u8 rsvd2[6];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "msl" 12
+Max Streams Limit
+.IP "nssa" 12
+NVM Subsystem Streams Available
+.IP "nsso" 12
+NVM Subsystem Streams Open
+.IP "nssc" 12
+NVM Subsystem Stream Capability
+.IP "rsvd" 12
+Reserved
+.IP "sws" 12
+Stream Write Size
+.IP "sgs" 12
+Stream Granularity Size
+.IP "nsa" 12
+Namespace Streams Allocated
+.IP "nso" 12
+Namespace Streams Open
+.IP "rsvd2" 12
+Reserved
diff --git a/doc/man/nvme_streams_directive_status.2 b/doc/man/nvme_streams_directive_status.2
new file mode 100644
index 0000000..9eaa423
--- /dev/null
+++ b/doc/man/nvme_streams_directive_status.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_streams_directive_status" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_streams_directive_status \- Streams Directive - Get Status Data Structure
+.SH SYNOPSIS
+struct nvme_streams_directive_status {
+.br
+.BI " __le16 osc;"
+.br
+.BI " __le16 sid[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "osc" 12
+Open Stream Count
+.IP "sid" 12
+Stream Identifier
diff --git a/doc/man/nvme_submit_admin_passthru.2 b/doc/man/nvme_submit_admin_passthru.2
new file mode 100644
index 0000000..ee20a75
--- /dev/null
+++ b/doc/man/nvme_submit_admin_passthru.2
@@ -0,0 +1,20 @@
+.TH "nvme_submit_admin_passthru" 9 "nvme_submit_admin_passthru" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_submit_admin_passthru \- Submit an nvme passthrough admin command
+.SH SYNOPSIS
+.B "int" nvme_submit_admin_passthru
+.BI "(int fd " ","
+.BI "struct nvme_passthru_cmd *cmd " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "cmd" 12
+The nvme admin command to send
+.IP "result" 12
+Optional field to return the result from the CQE DW0
+.SH "DESCRIPTION"
+Uses NVME_IOCTL_ADMIN_CMD for the ioctl request.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_submit_admin_passthru64.2 b/doc/man/nvme_submit_admin_passthru64.2
new file mode 100644
index 0000000..48d6795
--- /dev/null
+++ b/doc/man/nvme_submit_admin_passthru64.2
@@ -0,0 +1,20 @@
+.TH "nvme_submit_admin_passthru64" 9 "nvme_submit_admin_passthru64" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_submit_admin_passthru64 \- Submit a 64-bit nvme passthrough admin command
+.SH SYNOPSIS
+.B "int" nvme_submit_admin_passthru64
+.BI "(int fd " ","
+.BI "struct nvme_passthru_cmd64 *cmd " ","
+.BI "__u64 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "cmd" 12
+The nvme admin command to send
+.IP "result" 12
+Optional field to return the result from the CQE DW0-1
+.SH "DESCRIPTION"
+Uses NVME_IOCTL_ADMIN64_CMD for the ioctl request.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_submit_io_passthru.2 b/doc/man/nvme_submit_io_passthru.2
new file mode 100644
index 0000000..b8f70f1
--- /dev/null
+++ b/doc/man/nvme_submit_io_passthru.2
@@ -0,0 +1,20 @@
+.TH "nvme_submit_io_passthru" 9 "nvme_submit_io_passthru" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_submit_io_passthru \- Submit an nvme passthrough command
+.SH SYNOPSIS
+.B "int" nvme_submit_io_passthru
+.BI "(int fd " ","
+.BI "struct nvme_passthru_cmd *cmd " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "cmd" 12
+The nvme io command to send
+.IP "result" 12
+Optional field to return the result from the CQE DW0
+.SH "DESCRIPTION"
+Uses NVME_IOCTL_IO_CMD for the ioctl request.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_submit_io_passthru64.2 b/doc/man/nvme_submit_io_passthru64.2
new file mode 100644
index 0000000..00bfbe0
--- /dev/null
+++ b/doc/man/nvme_submit_io_passthru64.2
@@ -0,0 +1,20 @@
+.TH "nvme_submit_io_passthru64" 9 "nvme_submit_io_passthru64" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_submit_io_passthru64 \- Submit a 64-bit nvme passthrough command
+.SH SYNOPSIS
+.B "int" nvme_submit_io_passthru64
+.BI "(int fd " ","
+.BI "struct nvme_passthru_cmd64 *cmd " ","
+.BI "__u64 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "cmd" 12
+The nvme io command to send
+.IP "result" 12
+Optional field to return the result from the CQE DW0-1
+.SH "DESCRIPTION"
+Uses NVME_IOCTL_IO64_CMD for the ioctl request.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_subsys_filter.2 b/doc/man/nvme_subsys_filter.2
new file mode 100644
index 0000000..d8bee40
--- /dev/null
+++ b/doc/man/nvme_subsys_filter.2
@@ -0,0 +1,11 @@
+.TH "nvme_subsys_filter" 9 "nvme_subsys_filter" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsys_filter \- Filter for subsystems
+.SH SYNOPSIS
+.B "int" nvme_subsys_filter
+.BI "(const struct dirent *d " ");"
+.SH ARGUMENTS
+.IP "d" 12
+dirent to check
+.SH "RETURN"
+1 if \fId\fP matches, 0 otherwise
diff --git a/doc/man/nvme_subsys_type.2 b/doc/man/nvme_subsys_type.2
new file mode 100644
index 0000000..45e90ad
--- /dev/null
+++ b/doc/man/nvme_subsys_type.2
@@ -0,0 +1,37 @@
+.TH "libnvme" 9 "enum nvme_subsys_type" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_subsys_type \- Type of the NVM subsystem.
+.SH SYNOPSIS
+enum nvme_subsys_type {
+.br
+.BI " NVME_NQN_DISC"
+,
+.br
+.br
+.BI " NVME_NQN_NVME"
+,
+.br
+.br
+.BI " NVME_NQN_CURR"
+
+};
+.SH Constants
+.IP "NVME_NQN_DISC" 12
+Discovery type target subsystem. Describes a referral to another
+Discovery Service composed of Discovery controllers that provide
+additional discovery records. Multiple Referral entries may
+be reported for each Discovery Service (if that Discovery Service
+has multiple NVM subsystem ports or supports multiple protocols).
+.IP "NVME_NQN_NVME" 12
+NVME type target subsystem. Describes an NVM subsystem whose
+controllers may have attached namespaces (an NVM subsystem
+that is not composed of Discovery controllers). Multiple NVM
+Subsystem entries may be reported for each NVM subsystem if
+that NVM subsystem has multiple NVM subsystem ports.
+.IP "NVME_NQN_CURR" 12
+Current Discovery type target subsystem. Describes this Discovery
+subsystem (the Discovery Service that contains the controller
+processing the Get Log Page command). Multiple Current Discovery
+Subsystem entries may be reported for this Discovery subsystem
+if the current Discovery subsystem has multiple NVM subsystem
+ports.
diff --git a/doc/man/nvme_subsystem_first_ctrl.2 b/doc/man/nvme_subsystem_first_ctrl.2
new file mode 100644
index 0000000..84fbf6b
--- /dev/null
+++ b/doc/man/nvme_subsystem_first_ctrl.2
@@ -0,0 +1,11 @@
+.TH "nvme_subsystem_first_ctrl" 9 "nvme_subsystem_first_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsystem_first_ctrl \- First ctrl iterator
+.SH SYNOPSIS
+.B "nvme_ctrl_t" nvme_subsystem_first_ctrl
+.BI "(nvme_subsystem_t s " ");"
+.SH ARGUMENTS
+.IP "s" 12
+\fInvme_subsystem_t\fP object
+.SH "RETURN"
+First controller of an \fIs\fP iterator
diff --git a/doc/man/nvme_subsystem_first_ns.2 b/doc/man/nvme_subsystem_first_ns.2
new file mode 100644
index 0000000..b0a3193
--- /dev/null
+++ b/doc/man/nvme_subsystem_first_ns.2
@@ -0,0 +1,11 @@
+.TH "nvme_subsystem_first_ns" 9 "nvme_subsystem_first_ns" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsystem_first_ns \- Start namespace iterator
+.SH SYNOPSIS
+.B "nvme_ns_t" nvme_subsystem_first_ns
+.BI "(nvme_subsystem_t s " ");"
+.SH ARGUMENTS
+.IP "s" 12
+\fInvme_subsystem_t\fP object
+.SH "RETURN"
+First \fInvme_ns_t\fP object of an \fIs\fP iterator
diff --git a/doc/man/nvme_subsystem_for_each_ctrl.2 b/doc/man/nvme_subsystem_for_each_ctrl.2
new file mode 100644
index 0000000..2b28627
--- /dev/null
+++ b/doc/man/nvme_subsystem_for_each_ctrl.2
@@ -0,0 +1,12 @@
+.TH "nvme_subsystem_for_each_ctrl" 9 "nvme_subsystem_for_each_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsystem_for_each_ctrl \- Traverse controllers
+.SH SYNOPSIS
+.B "nvme_subsystem_for_each_ctrl
+.BI "(s " ","
+.BI "c " ");"
+.SH ARGUMENTS
+.IP "s" 12
+\fInvme_subsystem_t\fP object
+.IP "c" 12
+Controller instance
diff --git a/doc/man/nvme_subsystem_for_each_ctrl_safe.2 b/doc/man/nvme_subsystem_for_each_ctrl_safe.2
new file mode 100644
index 0000000..33efe94
--- /dev/null
+++ b/doc/man/nvme_subsystem_for_each_ctrl_safe.2
@@ -0,0 +1,15 @@
+.TH "nvme_subsystem_for_each_ctrl_safe" 9 "nvme_subsystem_for_each_ctrl_safe" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsystem_for_each_ctrl_safe \- Traverse controllers
+.SH SYNOPSIS
+.B "nvme_subsystem_for_each_ctrl_safe
+.BI "(s " ","
+.BI "c " ","
+.BI "_c " ");"
+.SH ARGUMENTS
+.IP "s" 12
+\fInvme_subsystem_t\fP object
+.IP "c" 12
+Controller instance
+.IP "_c" 12
+A \fInvme_ctrl_t_node\fP to use as temporary storage
diff --git a/doc/man/nvme_subsystem_for_each_ns.2 b/doc/man/nvme_subsystem_for_each_ns.2
new file mode 100644
index 0000000..111ad1f
--- /dev/null
+++ b/doc/man/nvme_subsystem_for_each_ns.2
@@ -0,0 +1,12 @@
+.TH "nvme_subsystem_for_each_ns" 9 "nvme_subsystem_for_each_ns" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsystem_for_each_ns \- Traverse namespaces
+.SH SYNOPSIS
+.B "nvme_subsystem_for_each_ns
+.BI "(s " ","
+.BI "n " ");"
+.SH ARGUMENTS
+.IP "s" 12
+\fInvme_subsystem_t\fP object
+.IP "n" 12
+\fInvme_ns_t\fP object
diff --git a/doc/man/nvme_subsystem_for_each_ns_safe.2 b/doc/man/nvme_subsystem_for_each_ns_safe.2
new file mode 100644
index 0000000..8a82dd3
--- /dev/null
+++ b/doc/man/nvme_subsystem_for_each_ns_safe.2
@@ -0,0 +1,15 @@
+.TH "nvme_subsystem_for_each_ns_safe" 9 "nvme_subsystem_for_each_ns_safe" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsystem_for_each_ns_safe \- Traverse namespaces
+.SH SYNOPSIS
+.B "nvme_subsystem_for_each_ns_safe
+.BI "(s " ","
+.BI "n " ","
+.BI "_n " ");"
+.SH ARGUMENTS
+.IP "s" 12
+\fInvme_subsystem_t\fP object
+.IP "n" 12
+\fInvme_ns_t\fP object
+.IP "_n" 12
+A \fInvme_ns_t_node\fP to use as temporary storage
diff --git a/doc/man/nvme_subsystem_get_host.2 b/doc/man/nvme_subsystem_get_host.2
new file mode 100644
index 0000000..9cea0f2
--- /dev/null
+++ b/doc/man/nvme_subsystem_get_host.2
@@ -0,0 +1,11 @@
+.TH "nvme_subsystem_get_host" 9 "nvme_subsystem_get_host" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsystem_get_host \- Returns nvme_host_t object
+.SH SYNOPSIS
+.B "nvme_host_t" nvme_subsystem_get_host
+.BI "(nvme_subsystem_t s " ");"
+.SH ARGUMENTS
+.IP "s" 12
+subsystem
+.SH "RETURN"
+\fInvme_host_t\fP object from \fIs\fP
diff --git a/doc/man/nvme_subsystem_get_name.2 b/doc/man/nvme_subsystem_get_name.2
new file mode 100644
index 0000000..61a6e65
--- /dev/null
+++ b/doc/man/nvme_subsystem_get_name.2
@@ -0,0 +1,11 @@
+.TH "nvme_subsystem_get_name" 9 "nvme_subsystem_get_name" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsystem_get_name \- sysfs name of an nvme_subsystem_t object
+.SH SYNOPSIS
+.B "const char *" nvme_subsystem_get_name
+.BI "(nvme_subsystem_t s " ");"
+.SH ARGUMENTS
+.IP "s" 12
+nvme_subsystem_t object
+.SH "RETURN"
+sysfs name of \fIs\fP
diff --git a/doc/man/nvme_subsystem_get_nqn.2 b/doc/man/nvme_subsystem_get_nqn.2
new file mode 100644
index 0000000..288f25d
--- /dev/null
+++ b/doc/man/nvme_subsystem_get_nqn.2
@@ -0,0 +1,11 @@
+.TH "nvme_subsystem_get_nqn" 9 "nvme_subsystem_get_nqn" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsystem_get_nqn \- Retrieve NQN from subsystem
+.SH SYNOPSIS
+.B "const char *" nvme_subsystem_get_nqn
+.BI "(nvme_subsystem_t s " ");"
+.SH ARGUMENTS
+.IP "s" 12
+nvme_subsystem_t object
+.SH "RETURN"
+NQN of subsystem
diff --git a/doc/man/nvme_subsystem_get_sysfs_dir.2 b/doc/man/nvme_subsystem_get_sysfs_dir.2
new file mode 100644
index 0000000..ee5e177
--- /dev/null
+++ b/doc/man/nvme_subsystem_get_sysfs_dir.2
@@ -0,0 +1,11 @@
+.TH "nvme_subsystem_get_sysfs_dir" 9 "nvme_subsystem_get_sysfs_dir" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsystem_get_sysfs_dir \- sysfs directory of an nvme_subsystem_t object
+.SH SYNOPSIS
+.B "const char *" nvme_subsystem_get_sysfs_dir
+.BI "(nvme_subsystem_t s " ");"
+.SH ARGUMENTS
+.IP "s" 12
+nvme_subsystem_t object
+.SH "RETURN"
+sysfs directory name of \fIs\fP
diff --git a/doc/man/nvme_subsystem_get_type.2 b/doc/man/nvme_subsystem_get_type.2
new file mode 100644
index 0000000..4ea6950
--- /dev/null
+++ b/doc/man/nvme_subsystem_get_type.2
@@ -0,0 +1,13 @@
+.TH "nvme_subsystem_get_type" 9 "nvme_subsystem_get_type" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsystem_get_type \- Returns the type of a subsystem
+.SH SYNOPSIS
+.B "const char *" nvme_subsystem_get_type
+.BI "(nvme_subsystem_t s " ");"
+.SH ARGUMENTS
+.IP "s" 12
+nvme_subsystem_t object
+.SH "DESCRIPTION"
+Returns the subsystem type of \fIs\fP.
+.SH "RETURN"
+'nvm' or 'discovery'
diff --git a/doc/man/nvme_subsystem_lookup_namespace.2 b/doc/man/nvme_subsystem_lookup_namespace.2
new file mode 100644
index 0000000..d7e23da
--- /dev/null
+++ b/doc/man/nvme_subsystem_lookup_namespace.2
@@ -0,0 +1,14 @@
+.TH "nvme_subsystem_lookup_namespace" 9 "nvme_subsystem_lookup_namespace" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsystem_lookup_namespace \- lookup namespace by NSID
+.SH SYNOPSIS
+.B "nvme_ns_t" nvme_subsystem_lookup_namespace
+.BI "(struct nvme_subsystem *s " ","
+.BI "__u32 nsid " ");"
+.SH ARGUMENTS
+.IP "s" 12
+nvme_subsystem_t object
+.IP "nsid" 12
+Namespace id
+.SH "RETURN"
+nvme_ns_t of the namespace with id \fInsid\fP in subsystem \fIs\fP
diff --git a/doc/man/nvme_subsystem_next_ctrl.2 b/doc/man/nvme_subsystem_next_ctrl.2
new file mode 100644
index 0000000..5d87496
--- /dev/null
+++ b/doc/man/nvme_subsystem_next_ctrl.2
@@ -0,0 +1,14 @@
+.TH "nvme_subsystem_next_ctrl" 9 "nvme_subsystem_next_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsystem_next_ctrl \- Next ctrl iterator
+.SH SYNOPSIS
+.B "nvme_ctrl_t" nvme_subsystem_next_ctrl
+.BI "(nvme_subsystem_t s " ","
+.BI "nvme_ctrl_t c " ");"
+.SH ARGUMENTS
+.IP "s" 12
+\fInvme_subsystem_t\fP object
+.IP "c" 12
+Previous controller instance of an \fIs\fP iterator
+.SH "RETURN"
+Next controller of an \fIs\fP iterator
diff --git a/doc/man/nvme_subsystem_next_ns.2 b/doc/man/nvme_subsystem_next_ns.2
new file mode 100644
index 0000000..8c4c225
--- /dev/null
+++ b/doc/man/nvme_subsystem_next_ns.2
@@ -0,0 +1,14 @@
+.TH "nvme_subsystem_next_ns" 9 "nvme_subsystem_next_ns" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsystem_next_ns \- Next namespace iterator
+.SH SYNOPSIS
+.B "nvme_ns_t" nvme_subsystem_next_ns
+.BI "(nvme_subsystem_t s " ","
+.BI "nvme_ns_t n " ");"
+.SH ARGUMENTS
+.IP "s" 12
+\fInvme_subsystem_t\fP object
+.IP "n" 12
+Previous \fInvme_ns_t\fP iterator
+.SH "RETURN"
+Next \fInvme_ns_t\fP object of an \fIs\fP iterator
diff --git a/doc/man/nvme_subsystem_reset.2 b/doc/man/nvme_subsystem_reset.2
new file mode 100644
index 0000000..492289a
--- /dev/null
+++ b/doc/man/nvme_subsystem_reset.2
@@ -0,0 +1,14 @@
+.TH "nvme_subsystem_reset" 9 "nvme_subsystem_reset" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_subsystem_reset \- Initiate a subsystem reset
+.SH SYNOPSIS
+.B "int" nvme_subsystem_reset
+.BI "(int fd " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.SH "DESCRIPTION"
+This should only be sent to controller handles, not to namespaces.
+.SH "RETURN"
+Zero if a subsystem reset was initiated or -1 with errno set
+otherwise.
diff --git a/doc/man/nvme_supported_cap_config_list_log.2 b/doc/man/nvme_supported_cap_config_list_log.2
new file mode 100644
index 0000000..0d71f50
--- /dev/null
+++ b/doc/man/nvme_supported_cap_config_list_log.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "struct nvme_supported_cap_config_list_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_supported_cap_config_list_log \- Supported Capacity Configuration list log page
+.SH SYNOPSIS
+struct nvme_supported_cap_config_list_log {
+.br
+.BI " __u8 sccn;"
+.br
+.BI " __u8 rsvd1[15];"
+.br
+.BI " struct nvme_capacity_config_desc cap_config_desc[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "sccn" 12
+Number of capacity configuration
+.IP "rsvd1" 12
+Reserved
+.IP "cap_config_desc" 12
+Capacity configuration descriptor.
+See \fIstruct\fP nvme_capacity_config_desc
diff --git a/doc/man/nvme_supported_log_pages.2 b/doc/man/nvme_supported_log_pages.2
new file mode 100644
index 0000000..541d1aa
--- /dev/null
+++ b/doc/man/nvme_supported_log_pages.2
@@ -0,0 +1,17 @@
+.TH "libnvme" 9 "struct nvme_supported_log_pages" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_supported_log_pages \- Supported Log Pages - Log
+.SH SYNOPSIS
+struct nvme_supported_log_pages {
+.br
+.BI " __le32 lid_support[NVME_LOG_SUPPORTED_LOG_PAGES_MAX];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "lid_support" 12
+Log Page Identifier Supported
+.SH "Description"
+Supported Log Pages (Log Identifier 00h)
diff --git a/doc/man/nvme_telemetry_da.2 b/doc/man/nvme_telemetry_da.2
new file mode 100644
index 0000000..609723b
--- /dev/null
+++ b/doc/man/nvme_telemetry_da.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvme_telemetry_da" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_telemetry_da \- Telemetry Log Data Area
+.SH SYNOPSIS
+enum nvme_telemetry_da {
+.br
+.BI " NVME_TELEMETRY_DA_1"
+,
+.br
+.br
+.BI " NVME_TELEMETRY_DA_2"
+,
+.br
+.br
+.BI " NVME_TELEMETRY_DA_3"
+,
+.br
+.br
+.BI " NVME_TELEMETRY_DA_4"
+
+};
+.SH Constants
+.IP "NVME_TELEMETRY_DA_1" 12
+Data Area 1
+.IP "NVME_TELEMETRY_DA_2" 12
+Data Area 2
+.IP "NVME_TELEMETRY_DA_3" 12
+Data Area 3
+.IP "NVME_TELEMETRY_DA_4" 12
+Data Area 4
diff --git a/doc/man/nvme_telemetry_log.2 b/doc/man/nvme_telemetry_log.2
new file mode 100644
index 0000000..416b679
--- /dev/null
+++ b/doc/man/nvme_telemetry_log.2
@@ -0,0 +1,88 @@
+.TH "libnvme" 9 "struct nvme_telemetry_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_telemetry_log \- Retrieve internal data specific to the manufacturer.
+.SH SYNOPSIS
+struct nvme_telemetry_log {
+.br
+.BI " __u8 lpi;"
+.br
+.BI " __u8 rsvd1[4];"
+.br
+.BI " __u8 ieee[3];"
+.br
+.BI " __le16 dalb1;"
+.br
+.BI " __le16 dalb2;"
+.br
+.BI " __le16 dalb3;"
+.br
+.BI " __u8 rsvd14[2];"
+.br
+.BI " __le32 dalb4;"
+.br
+.BI " __u8 rsvd20[361];"
+.br
+.BI " __u8 hostdgn;"
+.br
+.BI " __u8 ctrlavail;"
+.br
+.BI " __u8 ctrldgn;"
+.br
+.BI " __u8 rsnident[128];"
+.br
+.BI " __u8 data_area[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "lpi" 12
+Log Identifier, either NVME_LOG_LID_TELEMETRY_HOST or
+NVME_LOG_LID_TELEMETRY_CTRL
+.IP "rsvd1" 12
+Reserved
+.IP "ieee" 12
+IEEE OUI Identifier is the Organization Unique Identifier (OUI)
+for the controller vendor that is able to interpret the data.
+.IP "dalb1" 12
+Telemetry Controller-Initiated Data Area 1 Last Block is
+the value of the last block in this area.
+.IP "dalb2" 12
+Telemetry Controller-Initiated Data Area 1 Last Block is
+the value of the last block in this area.
+.IP "dalb3" 12
+Telemetry Controller-Initiated Data Area 1 Last Block is
+the value of the last block in this area.
+.IP "rsvd14" 12
+Reserved
+.IP "dalb4" 12
+Telemetry Controller-Initiated Data Area 4 Last Block is
+the value of the last block in this area.
+.IP "rsvd20" 12
+Reserved
+.IP "hostdgn" 12
+Telemetry Host-Initiated Data Generation Number is a
+value that is incremented each time the host initiates a
+capture of its internal controller state in the controller .
+.IP "ctrlavail" 12
+Telemetry Controller-Initiated Data Available, if cleared,
+then the controller telemetry log does not contain saved
+internal controller state. If this field is set to 1h, the
+controller log contains saved internal controller state. If
+this field is set to 1h, the data will be latched until the
+host releases it by reading the log with RAE cleared.
+.IP "ctrldgn" 12
+Telemetry Controller-Initiated Data Generation Number is
+a value that is incremented each time the controller initiates a
+capture of its internal controller state in the controller .
+.IP "rsnident" 12
+Reason Identifiers a vendor specific identifier that describes
+the operating conditions of the controller at the time of
+capture.
+.IP "data_area" 12
+Telemetry data blocks, vendor specific information data.
+.SH "Description"
+This log consists of a header describing the log and zero or more Telemetry
+Data Blocks. All Telemetry Data Blocks are NVME_LOG_TELEM_BLOCK_SIZE, 512
+bytes, in size. This log captures the controller’s internal state.
diff --git a/doc/man/nvme_thermal_exc_event.2 b/doc/man/nvme_thermal_exc_event.2
new file mode 100644
index 0000000..764d28a
--- /dev/null
+++ b/doc/man/nvme_thermal_exc_event.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_thermal_exc_event" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_thermal_exc_event \- Thermal Excursion Event Data
+.SH SYNOPSIS
+struct nvme_thermal_exc_event {
+.br
+.BI " __u8 over_temp;"
+.br
+.BI " __u8 threshold;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "over_temp" 12
+Over Temperature
+.IP "threshold" 12
+temperature threshold
diff --git a/doc/man/nvme_time_stamp_change_event.2 b/doc/man/nvme_time_stamp_change_event.2
new file mode 100644
index 0000000..f821366
--- /dev/null
+++ b/doc/man/nvme_time_stamp_change_event.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_time_stamp_change_event" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_time_stamp_change_event \- Timestamp Change Event
+.SH SYNOPSIS
+struct nvme_time_stamp_change_event {
+.br
+.BI " __le64 previous_timestamp;"
+.br
+.BI " __le64 ml_secs_since_reset;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "previous_timestamp" 12
+Previous Timestamp
+.IP "ml_secs_since_reset" 12
+Milliseconds Since Reset
diff --git a/doc/man/nvme_timestamp.2 b/doc/man/nvme_timestamp.2
new file mode 100644
index 0000000..9a4d4e0
--- /dev/null
+++ b/doc/man/nvme_timestamp.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_timestamp" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_timestamp \- Timestamp - Data Structure for Get Features
+.SH SYNOPSIS
+struct nvme_timestamp {
+.br
+.BI " __u8 timestamp[6];"
+.br
+.BI " __u8 attr;"
+.br
+.BI " __u8 rsvd;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "timestamp" 12
+Timestamp value based on origin and synch field
+.IP "attr" 12
+Attribute
+.IP "rsvd" 12
+Reserved
diff --git a/doc/man/nvme_unlink_ctrl.2 b/doc/man/nvme_unlink_ctrl.2
new file mode 100644
index 0000000..452a49d
--- /dev/null
+++ b/doc/man/nvme_unlink_ctrl.2
@@ -0,0 +1,9 @@
+.TH "nvme_unlink_ctrl" 9 "nvme_unlink_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_unlink_ctrl \- Unlink controller
+.SH SYNOPSIS
+.B "void" nvme_unlink_ctrl
+.BI "(struct nvme_ctrl *c " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
diff --git a/doc/man/nvme_update_config.2 b/doc/man/nvme_update_config.2
new file mode 100644
index 0000000..26883c4
--- /dev/null
+++ b/doc/man/nvme_update_config.2
@@ -0,0 +1,13 @@
+.TH "nvme_update_config" 9 "nvme_update_config" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_update_config \- Update JSON configuration
+.SH SYNOPSIS
+.B "int" nvme_update_config
+.BI "(nvme_root_t r " ");"
+.SH ARGUMENTS
+.IP "r" 12
+nvme_root_t object
+.SH "DESCRIPTION"
+Updates the JSON configuration file with the contents of \fIr\fP.
+.SH "RETURN"
+0 on success, -1 on failure.
diff --git a/doc/man/nvme_uring_cmd.2 b/doc/man/nvme_uring_cmd.2
new file mode 100644
index 0000000..90809f9
--- /dev/null
+++ b/doc/man/nvme_uring_cmd.2
@@ -0,0 +1,83 @@
+.TH "libnvme" 9 "struct nvme_uring_cmd" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_uring_cmd \- nvme uring command structure
+.SH SYNOPSIS
+struct nvme_uring_cmd {
+.br
+.BI " __u8 opcode;"
+.br
+.BI " __u8 flags;"
+.br
+.BI " __u16 rsvd1;"
+.br
+.BI " __u32 nsid;"
+.br
+.BI " __u32 cdw2;"
+.br
+.BI " __u32 cdw3;"
+.br
+.BI " __u64 metadata;"
+.br
+.BI " __u64 addr;"
+.br
+.BI " __u32 metadata_len;"
+.br
+.BI " __u32 data_len;"
+.br
+.BI " __u32 cdw10;"
+.br
+.BI " __u32 cdw11;"
+.br
+.BI " __u32 cdw12;"
+.br
+.BI " __u32 cdw13;"
+.br
+.BI " __u32 cdw14;"
+.br
+.BI " __u32 cdw15;"
+.br
+.BI " __u32 timeout_ms;"
+.br
+.BI " __u32 rsvd2;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "opcode" 12
+Operation code, see \fIenum nvme_io_opcodes\fP and \fIenum nvme_admin_opcodes\fP
+.IP "flags" 12
+Not supported: intended for command flags (eg: SGL, FUSE)
+.IP "rsvd1" 12
+Reserved for future use
+.IP "nsid" 12
+Namespace Identifier, or Fabrics type
+.IP "cdw2" 12
+Command Dword 2 (no spec defined use)
+.IP "cdw3" 12
+Command Dword 3 (no spec defined use)
+.IP "metadata" 12
+User space address to metadata buffer (NULL if not used)
+.IP "addr" 12
+User space address to data buffer (NULL if not used)
+.IP "metadata_len" 12
+Metadata buffer transfer length
+.IP "data_len" 12
+Data buffer transfer length
+.IP "cdw10" 12
+Command Dword 10 (command specific)
+.IP "cdw11" 12
+Command Dword 11 (command specific)
+.IP "cdw12" 12
+Command Dword 12 (command specific)
+.IP "cdw13" 12
+Command Dword 13 (command specific)
+.IP "cdw14" 12
+Command Dword 14 (command specific)
+.IP "cdw15" 12
+Command Dword 15 (command specific)
+.IP "timeout_ms" 12
+If non-zero, overrides system default timeout in milliseconds
+.IP "rsvd2" 12
+Reserved for future use (and fills an implicit struct pad
diff --git a/doc/man/nvme_verify.2 b/doc/man/nvme_verify.2
new file mode 100644
index 0000000..8701338
--- /dev/null
+++ b/doc/man/nvme_verify.2
@@ -0,0 +1,16 @@
+.TH "nvme_verify" 9 "nvme_verify" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_verify \- Send an nvme verify command
+.SH SYNOPSIS
+.B "int" nvme_verify
+.BI "(struct nvme_io_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_io_args\fP argument structure
+.SH "DESCRIPTION"
+The Verify command verifies integrity of stored information by reading data
+and metadata, if applicable, for the LBAs indicated without transferring any
+data or metadata to the host.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_version.2 b/doc/man/nvme_version.2
new file mode 100644
index 0000000..02a88d5
--- /dev/null
+++ b/doc/man/nvme_version.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvme_version" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_version \- Selector for version to be returned by @nvme_get_version
+.SH SYNOPSIS
+enum nvme_version {
+.br
+.BI " NVME_VERSION_PROJECT"
+,
+.br
+.br
+.BI " NVME_VERSION_GIT"
+
+};
+.SH Constants
+.IP "NVME_VERSION_PROJECT" 12
+Project release version
+.IP "NVME_VERSION_GIT" 12
+Git reference
diff --git a/doc/man/nvme_virt_mgmt_act.2 b/doc/man/nvme_virt_mgmt_act.2
new file mode 100644
index 0000000..c4000ae
--- /dev/null
+++ b/doc/man/nvme_virt_mgmt_act.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "enum nvme_virt_mgmt_act" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_virt_mgmt_act \- Virtualization Management - Action
+.SH SYNOPSIS
+enum nvme_virt_mgmt_act {
+.br
+.BI " NVME_VIRT_MGMT_ACT_PRIM_CTRL_FLEX_ALLOC"
+,
+.br
+.br
+.BI " NVME_VIRT_MGMT_ACT_OFFLINE_SEC_CTRL"
+,
+.br
+.br
+.BI " NVME_VIRT_MGMT_ACT_ASSIGN_SEC_CTRL"
+,
+.br
+.br
+.BI " NVME_VIRT_MGMT_ACT_ONLINE_SEC_CTRL"
+
+};
+.SH Constants
+.IP "NVME_VIRT_MGMT_ACT_PRIM_CTRL_FLEX_ALLOC" 12
+Primary Controller Flexible
+Allocation
+.IP "NVME_VIRT_MGMT_ACT_OFFLINE_SEC_CTRL" 12
+Secondary Controller Offline
+.IP "NVME_VIRT_MGMT_ACT_ASSIGN_SEC_CTRL" 12
+Secondary Controller Assign
+.IP "NVME_VIRT_MGMT_ACT_ONLINE_SEC_CTRL" 12
+Secondary Controller Online
diff --git a/doc/man/nvme_virt_mgmt_rt.2 b/doc/man/nvme_virt_mgmt_rt.2
new file mode 100644
index 0000000..f6c0f2c
--- /dev/null
+++ b/doc/man/nvme_virt_mgmt_rt.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvme_virt_mgmt_rt" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_virt_mgmt_rt \- Virtualization Management - Resource Type
+.SH SYNOPSIS
+enum nvme_virt_mgmt_rt {
+.br
+.BI " NVME_VIRT_MGMT_RT_VQ_RESOURCE"
+,
+.br
+.br
+.BI " NVME_VIRT_MGMT_RT_VI_RESOURCE"
+
+};
+.SH Constants
+.IP "NVME_VIRT_MGMT_RT_VQ_RESOURCE" 12
+VQ Resources
+.IP "NVME_VIRT_MGMT_RT_VI_RESOURCE" 12
+VI Resources
diff --git a/doc/man/nvme_virtual_mgmt.2 b/doc/man/nvme_virtual_mgmt.2
new file mode 100644
index 0000000..a30fce6
--- /dev/null
+++ b/doc/man/nvme_virtual_mgmt.2
@@ -0,0 +1,20 @@
+.TH "nvme_virtual_mgmt" 9 "nvme_virtual_mgmt" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_virtual_mgmt \- Virtualization resource management
+.SH SYNOPSIS
+.B "int" nvme_virtual_mgmt
+.BI "(struct nvme_virtual_mgmt_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_virtual_mgmt_args\fP argument structure
+.SH "DESCRIPTION"
+The Virtualization Management command is supported by primary controllers
+that support the Virtualization Enhancements capability. This command is
+used for several functions:
+
+- Modifying Flexible Resource allocation for the primary controller
+- Assigning Flexible Resources for secondary controllers
+- Setting the Online and Offline state for secondary controllers
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_write.2 b/doc/man/nvme_write.2
new file mode 100644
index 0000000..5f93252
--- /dev/null
+++ b/doc/man/nvme_write.2
@@ -0,0 +1,12 @@
+.TH "nvme_write" 9 "nvme_write" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_write \- Submit an nvme user write command
+.SH SYNOPSIS
+.B "int" nvme_write
+.BI "(struct nvme_io_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_io_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_write_uncorrectable.2 b/doc/man/nvme_write_uncorrectable.2
new file mode 100644
index 0000000..c421bd1
--- /dev/null
+++ b/doc/man/nvme_write_uncorrectable.2
@@ -0,0 +1,17 @@
+.TH "nvme_write_uncorrectable" 9 "nvme_write_uncorrectable" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_write_uncorrectable \- Submit an nvme write uncorrectable command
+.SH SYNOPSIS
+.B "int" nvme_write_uncorrectable
+.BI "(struct nvme_io_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_io_args\fP argument structure
+.SH "DESCRIPTION"
+The Write Uncorrectable command marks a range of logical blocks as invalid.
+When the specified logical block(s) are read after this operation, a failure
+is returned with Unrecovered Read Error status. To clear the invalid logical
+block status, a write operation on those logical blocks is required.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_write_zeros.2 b/doc/man/nvme_write_zeros.2
new file mode 100644
index 0000000..4bd47ca
--- /dev/null
+++ b/doc/man/nvme_write_zeros.2
@@ -0,0 +1,17 @@
+.TH "nvme_write_zeros" 9 "nvme_write_zeros" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_write_zeros \- Submit an nvme write zeroes command
+.SH SYNOPSIS
+.B "int" nvme_write_zeros
+.BI "(struct nvme_io_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_io_args\fP argument structure
+.SH "DESCRIPTION"
+The Write Zeroes command sets a range of logical blocks to zero. After
+successful completion of this command, the value returned by subsequent
+reads of logical blocks in this range shall be all bytes cleared to 0h until
+a write occurs to this LBA range.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_zns_append.2 b/doc/man/nvme_zns_append.2
new file mode 100644
index 0000000..29d3cdd
--- /dev/null
+++ b/doc/man/nvme_zns_append.2
@@ -0,0 +1,12 @@
+.TH "nvme_zns_append" 9 "nvme_zns_append" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_zns_append \- Append data to a zone
+.SH SYNOPSIS
+.B "int" nvme_zns_append
+.BI "(struct nvme_zns_append_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_zns_append_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_zns_changed_zone_log.2 b/doc/man/nvme_zns_changed_zone_log.2
new file mode 100644
index 0000000..b334102
--- /dev/null
+++ b/doc/man/nvme_zns_changed_zone_log.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_zns_changed_zone_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_zns_changed_zone_log \- ZNS Changed Zone List log
+.SH SYNOPSIS
+struct nvme_zns_changed_zone_log {
+.br
+.BI " __le16 nrzid;"
+.br
+.BI " __u8 rsvd2[6];"
+.br
+.BI " __le64 zid[NVME_ZNS_CHANGED_ZONES_MAX];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nrzid" 12
+Number of Zone Identifiers
+.IP "rsvd2" 12
+Reserved
+.IP "zid" 12
+Zone Identifier
diff --git a/doc/man/nvme_zns_desc.2 b/doc/man/nvme_zns_desc.2
new file mode 100644
index 0000000..5628f08
--- /dev/null
+++ b/doc/man/nvme_zns_desc.2
@@ -0,0 +1,47 @@
+.TH "libnvme" 9 "struct nvme_zns_desc" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_zns_desc \- Zone Descriptor Data Structure
+.SH SYNOPSIS
+struct nvme_zns_desc {
+.br
+.BI " __u8 zt;"
+.br
+.BI " __u8 zs;"
+.br
+.BI " __u8 za;"
+.br
+.BI " __u8 zai;"
+.br
+.BI " __u8 rsvd4[4];"
+.br
+.BI " __le64 zcap;"
+.br
+.BI " __le64 zslba;"
+.br
+.BI " __le64 wp;"
+.br
+.BI " __u8 rsvd32[32];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "zt" 12
+Zone Type
+.IP "zs" 12
+Zone State
+.IP "za" 12
+Zone Attributes
+.IP "zai" 12
+Zone Attributes Information
+.IP "rsvd4" 12
+Reserved
+.IP "zcap" 12
+Zone Capacity
+.IP "zslba" 12
+Zone Start Logical Block Address
+.IP "wp" 12
+Write Pointer
+.IP "rsvd32" 12
+Reserved
diff --git a/doc/man/nvme_zns_id_ctrl.2 b/doc/man/nvme_zns_id_ctrl.2
new file mode 100644
index 0000000..0291be2
--- /dev/null
+++ b/doc/man/nvme_zns_id_ctrl.2
@@ -0,0 +1,19 @@
+.TH "libnvme" 9 "struct nvme_zns_id_ctrl" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_zns_id_ctrl \- I/O Command Set Specific Identify Controller Data Structure for the Zoned Namespace Command Set
+.SH SYNOPSIS
+struct nvme_zns_id_ctrl {
+.br
+.BI " __u8 zasl;"
+.br
+.BI " __u8 rsvd1[4095];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "zasl" 12
+Zone Append Size Limit
+.IP "rsvd1" 12
+Reserved
diff --git a/doc/man/nvme_zns_id_ns.2 b/doc/man/nvme_zns_id_ns.2
new file mode 100644
index 0000000..1bfc005
--- /dev/null
+++ b/doc/man/nvme_zns_id_ns.2
@@ -0,0 +1,87 @@
+.TH "libnvme" 9 "struct nvme_zns_id_ns" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_zns_id_ns \- Zoned Namespace Command Set Specific Identify Namespace Data Structure
+.SH SYNOPSIS
+struct nvme_zns_id_ns {
+.br
+.BI " __le16 zoc;"
+.br
+.BI " __le16 ozcs;"
+.br
+.BI " __le32 mar;"
+.br
+.BI " __le32 mor;"
+.br
+.BI " __le32 rrl;"
+.br
+.BI " __le32 frl;"
+.br
+.BI " __le32 rrl1;"
+.br
+.BI " __le32 rrl2;"
+.br
+.BI " __le32 rrl3;"
+.br
+.BI " __le32 frl1;"
+.br
+.BI " __le32 frl2;"
+.br
+.BI " __le32 frl3;"
+.br
+.BI " __le32 numzrwa;"
+.br
+.BI " __le16 zrwafg;"
+.br
+.BI " __le16 zrwasz;"
+.br
+.BI " __u8 zrwacap;"
+.br
+.BI " __u8 rsvd53[2763];"
+.br
+.BI " struct nvme_zns_lbafe lbafe[64];"
+.br
+.BI " __u8 vs[256];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "zoc" 12
+Zone Operation Characteristics
+.IP "ozcs" 12
+Optional Zoned Command Support
+.IP "mar" 12
+Maximum Active Resources
+.IP "mor" 12
+Maximum Open Resources
+.IP "rrl" 12
+Reset Recommended Limit
+.IP "frl" 12
+Finish Recommended Limit
+.IP "rrl1" 12
+Reset Recommended Limit 1
+.IP "rrl2" 12
+Reset Recommended Limit 2
+.IP "rrl3" 12
+Reset Recommended Limit 3
+.IP "frl1" 12
+Finish Recommended Limit 1
+.IP "frl2" 12
+Finish Recommended Limit 2
+.IP "frl3" 12
+Finish Recommended Limit 3
+.IP "numzrwa" 12
+Number of ZRWA Resources
+.IP "zrwafg" 12
+ZRWA Flush Granularity
+.IP "zrwasz" 12
+ZRWA Size
+.IP "zrwacap" 12
+ZRWA Capability
+.IP "rsvd53" 12
+Reserved
+.IP "lbafe" 12
+LBA Format Extension
+.IP "vs" 12
+Vendor Specific
diff --git a/doc/man/nvme_zns_identify_ctrl.2 b/doc/man/nvme_zns_identify_ctrl.2
new file mode 100644
index 0000000..0334264
--- /dev/null
+++ b/doc/man/nvme_zns_identify_ctrl.2
@@ -0,0 +1,15 @@
+.TH "nvme_zns_identify_ctrl" 9 "nvme_zns_identify_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_zns_identify_ctrl \- ZNS identify controller data
+.SH SYNOPSIS
+.B "int" nvme_zns_identify_ctrl
+.BI "(int fd " ","
+.BI "struct nvme_zns_id_ctrl *id " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "id" 12
+User space destination address to transfer the data
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_zns_identify_ns.2 b/doc/man/nvme_zns_identify_ns.2
new file mode 100644
index 0000000..7169397
--- /dev/null
+++ b/doc/man/nvme_zns_identify_ns.2
@@ -0,0 +1,18 @@
+.TH "nvme_zns_identify_ns" 9 "nvme_zns_identify_ns" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_zns_identify_ns \- ZNS identify namespace data
+.SH SYNOPSIS
+.B "int" nvme_zns_identify_ns
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "struct nvme_zns_id_ns *data " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace to identify
+.IP "data" 12
+User space destination address to transfer the data
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_zns_lbafe.2 b/doc/man/nvme_zns_lbafe.2
new file mode 100644
index 0000000..0fdb2c5
--- /dev/null
+++ b/doc/man/nvme_zns_lbafe.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_zns_lbafe" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_zns_lbafe \- LBA Format Extension Data Structure
+.SH SYNOPSIS
+struct nvme_zns_lbafe {
+.br
+.BI " __le64 zsze;"
+.br
+.BI " __u8 zdes;"
+.br
+.BI " __u8 rsvd9[7];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "zsze" 12
+Zone Size
+.IP "zdes" 12
+Zone Descriptor Extension Size
+.IP "rsvd9" 12
+reserved
diff --git a/doc/man/nvme_zns_mgmt_recv.2 b/doc/man/nvme_zns_mgmt_recv.2
new file mode 100644
index 0000000..2f88f27
--- /dev/null
+++ b/doc/man/nvme_zns_mgmt_recv.2
@@ -0,0 +1,12 @@
+.TH "nvme_zns_mgmt_recv" 9 "nvme_zns_mgmt_recv" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_zns_mgmt_recv \- ZNS management receive command
+.SH SYNOPSIS
+.B "int" nvme_zns_mgmt_recv
+.BI "(struct nvme_zns_mgmt_recv_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_zns_mgmt_recv_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_zns_mgmt_send.2 b/doc/man/nvme_zns_mgmt_send.2
new file mode 100644
index 0000000..40d16a4
--- /dev/null
+++ b/doc/man/nvme_zns_mgmt_send.2
@@ -0,0 +1,12 @@
+.TH "nvme_zns_mgmt_send" 9 "nvme_zns_mgmt_send" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_zns_mgmt_send \- ZNS management send command
+.SH SYNOPSIS
+.B "int" nvme_zns_mgmt_send
+.BI "(struct nvme_zns_mgmt_send_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+\fIstruct nvme_zns_mgmt_send_args\fP argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_zns_recv_action.2 b/doc/man/nvme_zns_recv_action.2
new file mode 100644
index 0000000..4063c74
--- /dev/null
+++ b/doc/man/nvme_zns_recv_action.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvme_zns_recv_action" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_zns_recv_action \- Zone Management Receive - Zone Receive Action Specific Features
+.SH SYNOPSIS
+enum nvme_zns_recv_action {
+.br
+.BI " NVME_ZNS_ZRA_REPORT_ZONES"
+,
+.br
+.br
+.BI " NVME_ZNS_ZRA_EXTENDED_REPORT_ZONES"
+
+};
+.SH Constants
+.IP "NVME_ZNS_ZRA_REPORT_ZONES" 12
+Report Zones
+.IP "NVME_ZNS_ZRA_EXTENDED_REPORT_ZONES" 12
+Extended Report Zones
diff --git a/doc/man/nvme_zns_report_options.2 b/doc/man/nvme_zns_report_options.2
new file mode 100644
index 0000000..c09de4a
--- /dev/null
+++ b/doc/man/nvme_zns_report_options.2
@@ -0,0 +1,54 @@
+.TH "libnvme" 9 "enum nvme_zns_report_options" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_zns_report_options \- Zone Management Receive - Zone Receive Action Specific Field
+.SH SYNOPSIS
+enum nvme_zns_report_options {
+.br
+.BI " NVME_ZNS_ZRAS_REPORT_ALL"
+,
+.br
+.br
+.BI " NVME_ZNS_ZRAS_REPORT_EMPTY"
+,
+.br
+.br
+.BI " NVME_ZNS_ZRAS_REPORT_IMPL_OPENED"
+,
+.br
+.br
+.BI " NVME_ZNS_ZRAS_REPORT_EXPL_OPENED"
+,
+.br
+.br
+.BI " NVME_ZNS_ZRAS_REPORT_CLOSED"
+,
+.br
+.br
+.BI " NVME_ZNS_ZRAS_REPORT_FULL"
+,
+.br
+.br
+.BI " NVME_ZNS_ZRAS_REPORT_READ_ONLY"
+,
+.br
+.br
+.BI " NVME_ZNS_ZRAS_REPORT_OFFLINE"
+
+};
+.SH Constants
+.IP "NVME_ZNS_ZRAS_REPORT_ALL" 12
+List all zones
+.IP "NVME_ZNS_ZRAS_REPORT_EMPTY" 12
+List the zones in the ZSE:Empty state
+.IP "NVME_ZNS_ZRAS_REPORT_IMPL_OPENED" 12
+List the zones in the ZSIO:Implicitly Opened state
+.IP "NVME_ZNS_ZRAS_REPORT_EXPL_OPENED" 12
+List the zones in the ZSEO:Explicitly Opened state
+.IP "NVME_ZNS_ZRAS_REPORT_CLOSED" 12
+List the zones in the ZSC:Closed state
+.IP "NVME_ZNS_ZRAS_REPORT_FULL" 12
+List the zones in the ZSF:Full state
+.IP "NVME_ZNS_ZRAS_REPORT_READ_ONLY" 12
+List the zones in the ZSRO:Read Only state
+.IP "NVME_ZNS_ZRAS_REPORT_OFFLINE" 12
+List the zones in the ZSO:Offline state
diff --git a/doc/man/nvme_zns_report_zones.2 b/doc/man/nvme_zns_report_zones.2
new file mode 100644
index 0000000..777efbf
--- /dev/null
+++ b/doc/man/nvme_zns_report_zones.2
@@ -0,0 +1,39 @@
+.TH "nvme_zns_report_zones" 9 "nvme_zns_report_zones" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvme_zns_report_zones \- Return the list of zones
+.SH SYNOPSIS
+.B "int" nvme_zns_report_zones
+.BI "(int fd " ","
+.BI "__u32 nsid " ","
+.BI "__u64 slba " ","
+.BI "enum nvme_zns_report_options opts " ","
+.BI "bool extended " ","
+.BI "bool partial " ","
+.BI "__u32 data_len " ","
+.BI "void *data " ","
+.BI "__u32 timeout " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "fd" 12
+File descriptor of nvme device
+.IP "nsid" 12
+Namespace ID
+.IP "slba" 12
+Starting LBA
+.IP "opts" 12
+Reporting options
+.IP "extended" 12
+Extended report
+.IP "partial" 12
+Partial report requested
+.IP "data_len" 12
+Length of the data buffer
+.IP "data" 12
+Userspace address of the report zones data
+.IP "timeout" 12
+timeout in ms
+.IP "result" 12
+The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_zns_send_action.2 b/doc/man/nvme_zns_send_action.2
new file mode 100644
index 0000000..afc38fd
--- /dev/null
+++ b/doc/man/nvme_zns_send_action.2
@@ -0,0 +1,48 @@
+.TH "libnvme" 9 "enum nvme_zns_send_action" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_zns_send_action \- Zone Management Send - Zone Send Action
+.SH SYNOPSIS
+enum nvme_zns_send_action {
+.br
+.BI " NVME_ZNS_ZSA_CLOSE"
+,
+.br
+.br
+.BI " NVME_ZNS_ZSA_FINISH"
+,
+.br
+.br
+.BI " NVME_ZNS_ZSA_OPEN"
+,
+.br
+.br
+.BI " NVME_ZNS_ZSA_RESET"
+,
+.br
+.br
+.BI " NVME_ZNS_ZSA_OFFLINE"
+,
+.br
+.br
+.BI " NVME_ZNS_ZSA_SET_DESC_EXT"
+,
+.br
+.br
+.BI " NVME_ZNS_ZSA_ZRWA_FLUSH"
+
+};
+.SH Constants
+.IP "NVME_ZNS_ZSA_CLOSE" 12
+Close Zone
+.IP "NVME_ZNS_ZSA_FINISH" 12
+Finish Zone
+.IP "NVME_ZNS_ZSA_OPEN" 12
+Open Zone
+.IP "NVME_ZNS_ZSA_RESET" 12
+Reset Zone
+.IP "NVME_ZNS_ZSA_OFFLINE" 12
+Offline Zone
+.IP "NVME_ZNS_ZSA_SET_DESC_EXT" 12
+Set Zone Descriptor Extension
+.IP "NVME_ZNS_ZSA_ZRWA_FLUSH" 12
+Flush
diff --git a/doc/man/nvme_zns_za.2 b/doc/man/nvme_zns_za.2
new file mode 100644
index 0000000..7beb8cb
--- /dev/null
+++ b/doc/man/nvme_zns_za.2
@@ -0,0 +1,35 @@
+.TH "libnvme" 9 "enum nvme_zns_za" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_zns_za \- Zone Descriptor Data Structure
+.SH SYNOPSIS
+enum nvme_zns_za {
+.br
+.BI " NVME_ZNS_ZA_ZFC"
+,
+.br
+.br
+.BI " NVME_ZNS_ZA_FZR"
+,
+.br
+.br
+.BI " NVME_ZNS_ZA_RZR"
+,
+.br
+.br
+.BI " NVME_ZNS_ZA_ZRWAV"
+,
+.br
+.br
+.BI " NVME_ZNS_ZA_ZDEV"
+
+};
+.SH Constants
+.IP "NVME_ZNS_ZA_ZFC" 12
+Zone Finished by Controller
+.IP "NVME_ZNS_ZA_FZR" 12
+Finish Zone Recommended
+.IP "NVME_ZNS_ZA_RZR" 12
+Reset Zone Recommended
+.IP "NVME_ZNS_ZA_ZRWAV" 12
+.IP "NVME_ZNS_ZA_ZDEV" 12
+Zone Descriptor Extension Valid
diff --git a/doc/man/nvme_zns_zs.2 b/doc/man/nvme_zns_zs.2
new file mode 100644
index 0000000..f84a29e
--- /dev/null
+++ b/doc/man/nvme_zns_zs.2
@@ -0,0 +1,48 @@
+.TH "libnvme" 9 "enum nvme_zns_zs" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_zns_zs \- Zone Descriptor Data Structure - Zone State
+.SH SYNOPSIS
+enum nvme_zns_zs {
+.br
+.BI " NVME_ZNS_ZS_EMPTY"
+,
+.br
+.br
+.BI " NVME_ZNS_ZS_IMPL_OPEN"
+,
+.br
+.br
+.BI " NVME_ZNS_ZS_EXPL_OPEN"
+,
+.br
+.br
+.BI " NVME_ZNS_ZS_CLOSED"
+,
+.br
+.br
+.BI " NVME_ZNS_ZS_READ_ONLY"
+,
+.br
+.br
+.BI " NVME_ZNS_ZS_FULL"
+,
+.br
+.br
+.BI " NVME_ZNS_ZS_OFFLINE"
+
+};
+.SH Constants
+.IP "NVME_ZNS_ZS_EMPTY" 12
+Empty state
+.IP "NVME_ZNS_ZS_IMPL_OPEN" 12
+Implicitly open state
+.IP "NVME_ZNS_ZS_EXPL_OPEN" 12
+Explicitly open state
+.IP "NVME_ZNS_ZS_CLOSED" 12
+Closed state
+.IP "NVME_ZNS_ZS_READ_ONLY" 12
+Read only state
+.IP "NVME_ZNS_ZS_FULL" 12
+Full state
+.IP "NVME_ZNS_ZS_OFFLINE" 12
+Offline state
diff --git a/doc/man/nvme_zns_zt.2 b/doc/man/nvme_zns_zt.2
new file mode 100644
index 0000000..ce74dfe
--- /dev/null
+++ b/doc/man/nvme_zns_zt.2
@@ -0,0 +1,12 @@
+.TH "libnvme" 9 "enum nvme_zns_zt" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvme_zns_zt \- Zone Descriptor Data Structure - Zone Type
+.SH SYNOPSIS
+enum nvme_zns_zt {
+.br
+.BI " NVME_ZONE_TYPE_SEQWRITE_REQ"
+
+};
+.SH Constants
+.IP "NVME_ZONE_TYPE_SEQWRITE_REQ" 12
+Sequential Write Required
diff --git a/doc/man/nvme_zone_report.2 b/doc/man/nvme_zone_report.2
new file mode 100644
index 0000000..f056485
--- /dev/null
+++ b/doc/man/nvme_zone_report.2
@@ -0,0 +1,23 @@
+.TH "libnvme" 9 "struct nvme_zone_report" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvme_zone_report \- Report Zones Data Structure
+.SH SYNOPSIS
+struct nvme_zone_report {
+.br
+.BI " __le64 nr_zones;"
+.br
+.BI " __u8 rsvd8[56];"
+.br
+.BI " struct nvme_zns_desc entries[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "nr_zones" 12
+Number of descriptors in \fIentries\fP
+.IP "rsvd8" 12
+Reserved
+.IP "entries" 12
+Zoned namespace descriptors
diff --git a/doc/man/nvmf_add_ctrl.2 b/doc/man/nvmf_add_ctrl.2
new file mode 100644
index 0000000..0bf0093
--- /dev/null
+++ b/doc/man/nvmf_add_ctrl.2
@@ -0,0 +1,21 @@
+.TH "nvmf_add_ctrl" 9 "nvmf_add_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_add_ctrl \- Connect a controller and update topology
+.SH SYNOPSIS
+.B "int" nvmf_add_ctrl
+.BI "(nvme_host_t h " ","
+.BI "nvme_ctrl_t c " ","
+.BI "const struct nvme_fabrics_config *cfg " ");"
+.SH ARGUMENTS
+.IP "h" 12
+Host to which the controller should be attached
+.IP "c" 12
+Controller to be connected
+.IP "cfg" 12
+Default configuration for the controller
+.SH "DESCRIPTION"
+Issues a 'connect' command to the NVMe-oF controller and inserts \fIc\fP
+into the topology using \fIh\fP as parent.
+\fIc\fP must be initialized and not connected to the topology.
+.SH "RETURN"
+0 on success; on failure errno is set and -1 is returned.
diff --git a/doc/man/nvmf_addr_family.2 b/doc/man/nvmf_addr_family.2
new file mode 100644
index 0000000..6de153a
--- /dev/null
+++ b/doc/man/nvmf_addr_family.2
@@ -0,0 +1,43 @@
+.TH "libnvme" 9 "enum nvmf_addr_family" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvmf_addr_family \- Address Family codes for Discovery Log Page entry ADRFAM field
+.SH SYNOPSIS
+enum nvmf_addr_family {
+.br
+.BI " NVMF_ADDR_FAMILY_PCI"
+,
+.br
+.br
+.BI " NVMF_ADDR_FAMILY_IP4"
+,
+.br
+.br
+.BI " NVMF_ADDR_FAMILY_IP6"
+,
+.br
+.br
+.BI " NVMF_ADDR_FAMILY_IB"
+,
+.br
+.br
+.BI " NVMF_ADDR_FAMILY_FC"
+,
+.br
+.br
+.BI " NVMF_ADDR_FAMILY_LOOP"
+
+};
+.SH Constants
+.IP "NVMF_ADDR_FAMILY_PCI" 12
+PCIe
+.IP "NVMF_ADDR_FAMILY_IP4" 12
+AF_INET: IPv4 address family.
+.IP "NVMF_ADDR_FAMILY_IP6" 12
+AF_INET6: IPv6 address family.
+.IP "NVMF_ADDR_FAMILY_IB" 12
+AF_IB: InfiniBand address family.
+.IP "NVMF_ADDR_FAMILY_FC" 12
+Fibre Channel address family.
+.IP "NVMF_ADDR_FAMILY_LOOP" 12
+Intra-host Transport (i.e., loopback), reserved
+for host usage.
diff --git a/doc/man/nvmf_adrfam_str.2 b/doc/man/nvmf_adrfam_str.2
new file mode 100644
index 0000000..e462754
--- /dev/null
+++ b/doc/man/nvmf_adrfam_str.2
@@ -0,0 +1,14 @@
+.TH "nvmf_adrfam_str" 9 "nvmf_adrfam_str" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_adrfam_str \- Decode ADRFAM field
+.SH SYNOPSIS
+.B "const char *" nvmf_adrfam_str
+.BI "(__u8 adrfam " ");"
+.SH ARGUMENTS
+.IP "adrfam" 12
+value to be decoded
+.SH "DESCRIPTION"
+Decode the address family field in the discovery
+log page entry.
+.SH "RETURN"
+decoded string
diff --git a/doc/man/nvmf_cms_str.2 b/doc/man/nvmf_cms_str.2
new file mode 100644
index 0000000..b7a72aa
--- /dev/null
+++ b/doc/man/nvmf_cms_str.2
@@ -0,0 +1,14 @@
+.TH "nvmf_cms_str" 9 "nvmf_cms_str" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_cms_str \- Decode RDMA connection management service field
+.SH SYNOPSIS
+.B "const char *" nvmf_cms_str
+.BI "(__u8 cms " ");"
+.SH ARGUMENTS
+.IP "cms" 12
+value to be decoded
+.SH "DESCRIPTION"
+Decode the RDMA connection management service field in the discovery
+log page entry.
+.SH "RETURN"
+decoded string
diff --git a/doc/man/nvmf_connect_data.2 b/doc/man/nvmf_connect_data.2
new file mode 100644
index 0000000..3eec165
--- /dev/null
+++ b/doc/man/nvmf_connect_data.2
@@ -0,0 +1,35 @@
+.TH "libnvme" 9 "struct nvmf_connect_data" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvmf_connect_data \- Data payload for the 'connect' command
+.SH SYNOPSIS
+struct nvmf_connect_data {
+.br
+.BI " __u8 hostid[16];"
+.br
+.BI " __le16 cntlid;"
+.br
+.BI " char rsvd4[238];"
+.br
+.BI " char subsysnqn[NVME_NQN_LENGTH];"
+.br
+.BI " char hostnqn[NVME_NQN_LENGTH];"
+.br
+.BI " char rsvd5[256];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "hostid" 12
+Host ID of the connecting host
+.IP "cntlid" 12
+Requested controller ID
+.IP "rsvd4" 12
+Reserved
+.IP "subsysnqn" 12
+Subsystem NQN to connect to
+.IP "hostnqn" 12
+Host NQN of the connecting host
+.IP "rsvd5" 12
+Reserved
diff --git a/doc/man/nvmf_connect_disc_entry.2 b/doc/man/nvmf_connect_disc_entry.2
new file mode 100644
index 0000000..f85bf73
--- /dev/null
+++ b/doc/man/nvmf_connect_disc_entry.2
@@ -0,0 +1,20 @@
+.TH "nvmf_connect_disc_entry" 9 "nvmf_connect_disc_entry" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_connect_disc_entry \- Connect controller based on the discovery log page entry
+.SH SYNOPSIS
+.B "nvme_ctrl_t" nvmf_connect_disc_entry
+.BI "(nvme_host_t h " ","
+.BI "struct nvmf_disc_log_entry *e " ","
+.BI "const struct nvme_fabrics_config *defcfg " ","
+.BI "bool *discover " ");"
+.SH ARGUMENTS
+.IP "h" 12
+Host to which the controller should be connected
+.IP "e" 12
+Discovery log page entry
+.IP "defcfg" 12
+Default configuration to be used for the new controller
+.IP "discover" 12
+Set to 'true' if the new controller is a discovery controller
+.SH "RETURN"
+Pointer to the new controller
diff --git a/doc/man/nvmf_default_config.2 b/doc/man/nvmf_default_config.2
new file mode 100644
index 0000000..0261fd3
--- /dev/null
+++ b/doc/man/nvmf_default_config.2
@@ -0,0 +1,11 @@
+.TH "nvmf_default_config" 9 "nvmf_default_config" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_default_config \- Default values for fabrics configuration
+.SH SYNOPSIS
+.B "void" nvmf_default_config
+.BI "(struct nvme_fabrics_config *cfg " ");"
+.SH ARGUMENTS
+.IP "cfg" 12
+config values to set
+.SH "DESCRIPTION"
+Initializes \fIcfg\fP with default values.
diff --git a/doc/man/nvmf_dim_data.2 b/doc/man/nvmf_dim_data.2
new file mode 100644
index 0000000..b4ca819
--- /dev/null
+++ b/doc/man/nvmf_dim_data.2
@@ -0,0 +1,63 @@
+.TH "libnvme" 9 "struct nvmf_dim_data" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvmf_dim_data \- Discovery Information Management (DIM) - Data
+.SH SYNOPSIS
+struct nvmf_dim_data {
+.br
+.BI " __le32 tdl;"
+.br
+.BI " __u8 rsvd4[4];"
+.br
+.BI " __le64 nument;"
+.br
+.BI " __le16 entfmt;"
+.br
+.BI " __le16 etype;"
+.br
+.BI " __u8 portlcl;"
+.br
+.BI " __u8 rsvd21;"
+.br
+.BI " __le16 ektype;"
+.br
+.BI " char eid[NVME_NQN_LENGTH];"
+.br
+.BI " char ename[NVMF_ENAME_LEN];"
+.br
+.BI " char ever[NVMF_EVER_LEN];"
+.br
+.BI " __u8 rsvd600[424];"
+.br
+.BI " union nvmf_die die[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "tdl" 12
+Total Data Length
+.IP "rsvd4" 12
+Reserved
+.IP "nument" 12
+Number of entries
+.IP "entfmt" 12
+Entry Format (\fIenum nvmf_dim_entfmt\fP)
+.IP "etype" 12
+Entity Type (\fIenum nvmf_dim_etype\fP)
+.IP "portlcl" 12
+Port Local
+.IP "rsvd21" 12
+Reserved
+.IP "ektype" 12
+Entry Key Type
+.IP "eid" 12
+Entity Identifier (e.g. Host NQN)
+.IP "ename" 12
+Entity Name (e.g. hostname)
+.IP "ever" 12
+Entity Version (e.g. OS Name/Version)
+.IP "rsvd600" 12
+Reserved
+.IP "die" 12
+Discovery Information Entry (see \fInument\fP above)
diff --git a/doc/man/nvmf_dim_entfmt.2 b/doc/man/nvmf_dim_entfmt.2
new file mode 100644
index 0000000..eb36fee
--- /dev/null
+++ b/doc/man/nvmf_dim_entfmt.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvmf_dim_entfmt" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvmf_dim_entfmt \- Discovery Information Management Entry Format
+.SH SYNOPSIS
+enum nvmf_dim_entfmt {
+.br
+.BI " NVMF_DIM_ENTFMT_BASIC"
+,
+.br
+.br
+.BI " NVMF_DIM_ENTFMT_EXTENDED"
+
+};
+.SH Constants
+.IP "NVMF_DIM_ENTFMT_BASIC" 12
+Basic discovery information entry
+.IP "NVMF_DIM_ENTFMT_EXTENDED" 12
+Extended discovery information entry
diff --git a/doc/man/nvmf_dim_etype.2 b/doc/man/nvmf_dim_etype.2
new file mode 100644
index 0000000..dca2311
--- /dev/null
+++ b/doc/man/nvmf_dim_etype.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "enum nvmf_dim_etype" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvmf_dim_etype \- Discovery Information Management Entity Type
+.SH SYNOPSIS
+enum nvmf_dim_etype {
+.br
+.BI " NVMF_DIM_ETYPE_HOST"
+,
+.br
+.br
+.BI " NVMF_DIM_ETYPE_DDC"
+,
+.br
+.br
+.BI " NVMF_DIM_ETYPE_CDC"
+
+};
+.SH Constants
+.IP "NVMF_DIM_ETYPE_HOST" 12
+Host
+.IP "NVMF_DIM_ETYPE_DDC" 12
+Direct Discovery controller
+.IP "NVMF_DIM_ETYPE_CDC" 12
+Centralized Discovery controller
diff --git a/doc/man/nvmf_dim_tas.2 b/doc/man/nvmf_dim_tas.2
new file mode 100644
index 0000000..8ad2947
--- /dev/null
+++ b/doc/man/nvmf_dim_tas.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "enum nvmf_dim_tas" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvmf_dim_tas \- Discovery Information Management Task
+.SH SYNOPSIS
+enum nvmf_dim_tas {
+.br
+.BI " NVMF_DIM_TAS_REGISTER"
+,
+.br
+.br
+.BI " NVMF_DIM_TAS_DEREGISTER"
+,
+.br
+.br
+.BI " NVMF_DIM_TAS_UPDATE"
+
+};
+.SH Constants
+.IP "NVMF_DIM_TAS_REGISTER" 12
+Register
+.IP "NVMF_DIM_TAS_DEREGISTER" 12
+Deregister
+.IP "NVMF_DIM_TAS_UPDATE" 12
+Update
diff --git a/doc/man/nvmf_disc_eflags.2 b/doc/man/nvmf_disc_eflags.2
new file mode 100644
index 0000000..3eaa582
--- /dev/null
+++ b/doc/man/nvmf_disc_eflags.2
@@ -0,0 +1,46 @@
+.TH "libnvme" 9 "enum nvmf_disc_eflags" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvmf_disc_eflags \- Discovery Log Page entry flags.
+.SH SYNOPSIS
+enum nvmf_disc_eflags {
+.br
+.BI " NVMF_DISC_EFLAGS_NONE"
+,
+.br
+.br
+.BI " NVMF_DISC_EFLAGS_DUPRETINFO"
+,
+.br
+.br
+.BI " NVMF_DISC_EFLAGS_EPCSD"
+,
+.br
+.br
+.BI " NVMF_DISC_EFLAGS_NCC"
+
+};
+.SH Constants
+.IP "NVMF_DISC_EFLAGS_NONE" 12
+Indicates that none of the DUPRETINFO or EPCSD
+features are supported.
+.IP "NVMF_DISC_EFLAGS_DUPRETINFO" 12
+Duplicate Returned Information (DUPRETINFO):
+Indicates that using the content of this entry
+to access this Discovery Service returns the same
+information that is returned by using the content
+of other entries in this log page that also have
+this flag set.
+.IP "NVMF_DISC_EFLAGS_EPCSD" 12
+Explicit Persistent Connection Support for Discovery (EPCSD):
+Indicates that Explicit Persistent Connections are
+supported for the Discovery controller.
+.IP "NVMF_DISC_EFLAGS_NCC" 12
+No CDC Connectivity (NCC): If set to
+'1', then no DDC that describes this entry
+is currently connected to the CDC. If
+cleared to '0', then at least one DDC that
+describes this entry is currently
+connected to the CDC. If the Discovery
+controller returning this log page is not
+a CDC, then this bit shall be cleared to
+'0' and should be ignored by the host.
diff --git a/doc/man/nvmf_disc_log_entry.2 b/doc/man/nvmf_disc_log_entry.2
new file mode 100644
index 0000000..e2a53f4
--- /dev/null
+++ b/doc/man/nvmf_disc_log_entry.2
@@ -0,0 +1,96 @@
+.TH "libnvme" 9 "struct nvmf_disc_log_entry" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvmf_disc_log_entry \- Discovery Log Page entry
+.SH SYNOPSIS
+struct nvmf_disc_log_entry {
+.br
+.BI " __u8 trtype;"
+.br
+.BI " __u8 adrfam;"
+.br
+.BI " __u8 subtype;"
+.br
+.BI " __u8 treq;"
+.br
+.BI " __le16 portid;"
+.br
+.BI " __le16 cntlid;"
+.br
+.BI " __le16 asqsz;"
+.br
+.BI " __le16 eflags;"
+.br
+.BI " __u8 rsvd12[20];"
+.br
+.BI " char trsvcid[NVMF_TRSVCID_SIZE];"
+.br
+.BI " __u8 rsvd64[192];"
+.br
+.BI " char subnqn[NVME_NQN_LENGTH];"
+.br
+.BI " char traddr[NVMF_TRADDR_SIZE];"
+.br
+.BI " union nvmf_tsas tsas;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "trtype" 12
+Transport Type (TRTYPE): Specifies the NVMe Transport type.
+See \fIenum nvmf_trtype\fP.
+.IP "adrfam" 12
+Address Family (ADRFAM): Specifies the address family.
+See \fIenum nvmf_addr_family\fP.
+.IP "subtype" 12
+Subsystem Type (SUBTYPE): Specifies the type of the NVM subsystem
+that is indicated in this entry. See \fIenum nvme_subsys_type\fP.
+.IP "treq" 12
+Transport Requirements (TREQ): Indicates requirements for the NVMe
+Transport. See \fIenum nvmf_treq\fP.
+.IP "portid" 12
+Port ID (PORTID): Specifies a particular NVM subsystem port.
+Different NVMe Transports or address families may utilize the same
+Port ID value (e.g. a Port ID may support both iWARP and RoCE).
+.IP "cntlid" 12
+Controller ID (CNTLID): Specifies the controller ID. If the NVM
+subsystem uses a dynamic controller model, then this field shall
+be set to FFFFh. If the NVM subsystem uses a static controller model,
+then this field may be set to a specific controller ID (values 0h
+to FFEFh are valid). If the NVM subsystem uses a static controller
+model and the value indicated is FFFEh, then the host should remember
+the Controller ID returned as part of the Fabrics Connect command
+in order to re-establish an association in the future with the same
+controller.
+.IP "asqsz" 12
+Admin Max SQ Size (ASQSZ): Specifies the maximum size of an Admin
+Submission Queue. This applies to all controllers in the NVM
+subsystem. The value shall be a minimum of 32 entries.
+.IP "eflags" 12
+Entry Flags (EFLAGS): Indicates additional information related to
+the current entry. See \fIenum nvmf_disc_eflags\fP.
+.IP "rsvd12" 12
+Reserved
+.IP "trsvcid" 12
+Transport Service Identifier (TRSVCID): Specifies the NVMe Transport
+service identifier as an ASCII string. The NVMe Transport service
+identifier is specified by the associated NVMe Transport binding
+specification.
+.IP "rsvd64" 12
+Reserved
+.IP "subnqn" 12
+NVM Subsystem Qualified Name (SUBNQN): NVMe Qualified Name (NQN)
+that uniquely identifies the NVM subsystem. For a subsystem, if that
+Discovery subsystem has a unique NQN (i.e., the NVM Subsystem NVMe
+Qualified Name (SUBNQN) field in that Discovery subsystem's Identify
+Controller data structure contains a unique NQN value), then the
+value returned shall be that unique NQN. If the Discovery subsystem
+does not have a unique NQN, then the value returned shall be the
+well-known Discovery Service NQN (nqn.2014-08.org.nvmexpress.discovery).
+.IP "traddr" 12
+Transport Address (TRADDR): Specifies the address of the NVM subsystem
+that may be used for a Connect command as an ASCII string. The
+Address Family field describes the reference for parsing this field.
+.IP "tsas" 12
+Transport specific attribute settings
diff --git a/doc/man/nvmf_discovery_log.2 b/doc/man/nvmf_discovery_log.2
new file mode 100644
index 0000000..c758fe1
--- /dev/null
+++ b/doc/man/nvmf_discovery_log.2
@@ -0,0 +1,38 @@
+.TH "libnvme" 9 "struct nvmf_discovery_log" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvmf_discovery_log \- Discovery Log Page (Log Identifier 70h)
+.SH SYNOPSIS
+struct nvmf_discovery_log {
+.br
+.BI " __le64 genctr;"
+.br
+.BI " __le64 numrec;"
+.br
+.BI " __le16 recfmt;"
+.br
+.BI " __u8 rsvd14[1006];"
+.br
+.BI " struct nvmf_disc_log_entry entries[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "genctr" 12
+Generation Counter (GENCTR): Indicates the version of the discovery
+information, starting at a value of 0h. For each change in the
+Discovery Log Page, this counter is incremented by one. If the value
+of this field is FFFFFFFF_FFFFFFFFh, then the field shall be cleared
+to 0h when incremented (i.e., rolls over to 0h).
+.IP "numrec" 12
+Number of Records (NUMREC): Indicates the number of records
+contained in the log.
+.IP "recfmt" 12
+Record Format (RECFMT): Specifies the format of the Discovery Log
+Page. If a new format is defined, this value is incremented by one.
+The format of the record specified in this definition shall be 0h.
+.IP "rsvd14" 12
+Reserved
+.IP "entries" 12
+Discovery Log Page Entries - see \fIstruct nvmf_disc_log_entry\fP.
diff --git a/doc/man/nvmf_eflags_str.2 b/doc/man/nvmf_eflags_str.2
new file mode 100644
index 0000000..402bb2b
--- /dev/null
+++ b/doc/man/nvmf_eflags_str.2
@@ -0,0 +1,14 @@
+.TH "nvmf_eflags_str" 9 "nvmf_eflags_str" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_eflags_str \- Decode EFLAGS field
+.SH SYNOPSIS
+.B "const char *" nvmf_eflags_str
+.BI "(__u16 eflags " ");"
+.SH ARGUMENTS
+.IP "eflags" 12
+value to be decoded
+.SH "DESCRIPTION"
+Decode the EFLAGS field in the discovery log page
+entry.
+.SH "RETURN"
+decoded string
diff --git a/doc/man/nvmf_exat_len.2 b/doc/man/nvmf_exat_len.2
new file mode 100644
index 0000000..49a3932
--- /dev/null
+++ b/doc/man/nvmf_exat_len.2
@@ -0,0 +1,15 @@
+.TH "nvmf_exat_len" 9 "nvmf_exat_len" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_exat_len \- Return length rounded up by 4
+.SH SYNOPSIS
+.B "__u16" nvmf_exat_len
+.BI "(size_t val_len " ");"
+.SH ARGUMENTS
+.IP "val_len" 12
+Value length
+.SH "DESCRIPTION"
+Return the size in bytes, rounded to a multiple of 4 (e.g., size of
+__u32), of the buffer needed to hold the exat value of size
+\fIval_len\fP.
+.SH "RETURN"
+Length rounded up by 4
diff --git a/doc/man/nvmf_exattype.2 b/doc/man/nvmf_exattype.2
new file mode 100644
index 0000000..16d237b
--- /dev/null
+++ b/doc/man/nvmf_exattype.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvmf_exattype" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvmf_exattype \- Extended Attribute Type
+.SH SYNOPSIS
+enum nvmf_exattype {
+.br
+.BI " NVMF_EXATTYPE_HOSTID"
+,
+.br
+.br
+.BI " NVMF_EXATTYPE_SYMNAME"
+
+};
+.SH Constants
+.IP "NVMF_EXATTYPE_HOSTID" 12
+Host Identifier
+.IP "NVMF_EXATTYPE_SYMNAME" 12
+Symblic Name
diff --git a/doc/man/nvmf_ext_attr.2 b/doc/man/nvmf_ext_attr.2
new file mode 100644
index 0000000..5d581c8
--- /dev/null
+++ b/doc/man/nvmf_ext_attr.2
@@ -0,0 +1,24 @@
+.TH "libnvme" 9 "struct nvmf_ext_attr" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvmf_ext_attr \- Extended Attribute (EXAT)
+.SH SYNOPSIS
+struct nvmf_ext_attr {
+.br
+.BI " __le16 exattype;"
+.br
+.BI " __le16 exatlen;"
+.br
+.BI " __u8 exatval[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "exattype" 12
+Extended Attribute Type (EXATTYPE) - see \fIenum\fP nvmf_exattype
+.IP "exatlen" 12
+Extended Attribute Length (EXATLEN)
+.IP "exatval" 12
+Extended Attribute Value (EXATVAL) - size allocated for array
+must be a multiple of 4 bytes
diff --git a/doc/man/nvmf_ext_die.2 b/doc/man/nvmf_ext_die.2
new file mode 100644
index 0000000..ccb682f
--- /dev/null
+++ b/doc/man/nvmf_ext_die.2
@@ -0,0 +1,79 @@
+.TH "libnvme" 9 "struct nvmf_ext_die" "January 2023" "API Manual" LINUX
+.SH NAME
+struct nvmf_ext_die \- Extended Discovery Information Entry (DIE)
+.SH SYNOPSIS
+struct nvmf_ext_die {
+.br
+.BI " __u8 trtype;"
+.br
+.BI " __u8 adrfam;"
+.br
+.BI " __u8 subtype;"
+.br
+.BI " __u8 treq;"
+.br
+.BI " __le16 portid;"
+.br
+.BI " __le16 cntlid;"
+.br
+.BI " __le16 asqsz;"
+.br
+.BI " __u8 rsvd10[22];"
+.br
+.BI " char trsvcid[NVMF_TRSVCID_SIZE];"
+.br
+.BI " __u8 resv64[192];"
+.br
+.BI " char nqn[NVME_NQN_LENGTH];"
+.br
+.BI " char traddr[NVMF_TRADDR_SIZE];"
+.br
+.BI " union nvmf_tsas tsas;"
+.br
+.BI " __le32 tel;"
+.br
+.BI " __le16 numexat;"
+.br
+.BI " __u8 resv1030[2];"
+.br
+.BI " struct nvmf_ext_attr exat[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "trtype" 12
+Transport Type (\fIenum nvmf_trtype\fP)
+.IP "adrfam" 12
+Address Family (\fIenum nvmf_addr_family\fP)
+.IP "subtype" 12
+Subsystem Type (\fIenum nvme_subsys_type\fP)
+.IP "treq" 12
+Transport Requirements (\fIenum nvmf_treq\fP)
+.IP "portid" 12
+Port ID
+.IP "cntlid" 12
+Controller ID
+.IP "asqsz" 12
+Admin Max SQ Size
+.IP "rsvd10" 12
+Reserved
+.IP "trsvcid" 12
+Transport Service Identifier
+.IP "resv64" 12
+Reserved
+.IP "nqn" 12
+NVM Qualified Name
+.IP "traddr" 12
+Transport Address
+.IP "tsas" 12
+Transport Specific Address Subtype (\fIunion nvmf_tsas\fP)
+.IP "tel" 12
+Total Entry Length
+.IP "numexat" 12
+Number of Extended Attributes
+.IP "resv1030" 12
+Reserved
+.IP "exat" 12
+Extended Attributes 0 (\fIstruct nvmf_ext_attr\fP)
diff --git a/doc/man/nvmf_get_discovery_log.2 b/doc/man/nvmf_get_discovery_log.2
new file mode 100644
index 0000000..fef0824
--- /dev/null
+++ b/doc/man/nvmf_get_discovery_log.2
@@ -0,0 +1,22 @@
+.TH "nvmf_get_discovery_log" 9 "nvmf_get_discovery_log" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_get_discovery_log \- Return the discovery log page
+.SH SYNOPSIS
+.B "int" nvmf_get_discovery_log
+.BI "(nvme_ctrl_t c " ","
+.BI "struct nvmf_discovery_log **logp " ","
+.BI "int max_retries " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Discovery controller to use
+.IP "logp" 12
+Pointer to the log page to be returned
+.IP "max_retries" 12
+Number of retries in case of failure
+.SH "DESCRIPTION"
+The memory allocated for the log page and returned in \fIlogp\fP
+must be freed by the caller using \fBfree\fP.
+.SH "NOTE"
+Consider using \fBnvmf_get_discovery_wargs\fP instead.
+.SH "RETURN"
+0 on success; on failure -1 is returned and errno is set
diff --git a/doc/man/nvmf_get_discovery_wargs.2 b/doc/man/nvmf_get_discovery_wargs.2
new file mode 100644
index 0000000..d8e77d4
--- /dev/null
+++ b/doc/man/nvmf_get_discovery_wargs.2
@@ -0,0 +1,20 @@
+.TH "nvmf_get_discovery_wargs" 9 "nvmf_get_discovery_wargs" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_get_discovery_wargs \- Get the discovery log page with args
+.SH SYNOPSIS
+.B "struct nvmf_discovery_log *" nvmf_get_discovery_wargs
+.BI "(struct nvme_get_discovery_args *args " ");"
+.SH ARGUMENTS
+.IP "args" 12
+Argument structure
+.SH "DESCRIPTION"
+This function is similar to \fBnvmf_get_discovery_log\fP, but
+takes an extensible \fIargs\fP parameter. \fIargs\fP provides more
+options than \fBnvmf_get_discovery_log\fP.
+
+This function performs a get discovery log page (DLP) command
+and returns the DLP. The memory allocated for the returned
+DLP must be freed by the caller using \fBfree\fP.
+.SH "RETURN"
+Pointer to the discovery log page (to be freed). NULL
+on failure and errno is set.
diff --git a/doc/man/nvmf_hostid_from_file.2 b/doc/man/nvmf_hostid_from_file.2
new file mode 100644
index 0000000..b129ba3
--- /dev/null
+++ b/doc/man/nvmf_hostid_from_file.2
@@ -0,0 +1,9 @@
+.TH "nvmf_hostid_from_file" 9 "nvmf_hostid_from_file" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_hostid_from_file \- Reads the host identifier from the config default location in /usr/local/etc/nvme/.
+.SH SYNOPSIS
+.B "char *" nvmf_hostid_from_file
+.SH ARGUMENTS
+.SH "RETURN"
+The host identifier, or NULL if unsuccessful. If found, the caller
+is responsible to free the string.
diff --git a/doc/man/nvmf_hostnqn_from_file.2 b/doc/man/nvmf_hostnqn_from_file.2
new file mode 100644
index 0000000..4323221
--- /dev/null
+++ b/doc/man/nvmf_hostnqn_from_file.2
@@ -0,0 +1,9 @@
+.TH "nvmf_hostnqn_from_file" 9 "nvmf_hostnqn_from_file" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_hostnqn_from_file \- Reads the host nvm qualified name from the config default location in /usr/local/etc/nvme/
+.SH SYNOPSIS
+.B "char *" nvmf_hostnqn_from_file
+.SH ARGUMENTS
+.SH "RETURN"
+The host nqn, or NULL if unsuccessful. If found, the caller
+is responsible to free the string.
diff --git a/doc/man/nvmf_hostnqn_generate.2 b/doc/man/nvmf_hostnqn_generate.2
new file mode 100644
index 0000000..9cb9457
--- /dev/null
+++ b/doc/man/nvmf_hostnqn_generate.2
@@ -0,0 +1,9 @@
+.TH "nvmf_hostnqn_generate" 9 "nvmf_hostnqn_generate" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_hostnqn_generate \- Generate a machine specific host nqn
+.SH SYNOPSIS
+.B "char *" nvmf_hostnqn_generate
+.SH ARGUMENTS
+.SH "RETURN"
+An nvm namespace qualified name string based on the machine
+identifier, or NULL if not successful.
diff --git a/doc/man/nvmf_log_discovery_lid_support.2 b/doc/man/nvmf_log_discovery_lid_support.2
new file mode 100644
index 0000000..d9c6cc2
--- /dev/null
+++ b/doc/man/nvmf_log_discovery_lid_support.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvmf_log_discovery_lid_support" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvmf_log_discovery_lid_support \- Discovery log specific support
+.SH SYNOPSIS
+enum nvmf_log_discovery_lid_support {
+.br
+.BI " NVMF_LOG_DISC_LID_NONE"
+,
+.br
+.br
+.BI " NVMF_LOG_DISC_LID_EXTDLPES"
+,
+.br
+.br
+.BI " NVMF_LOG_DISC_LID_PLEOS"
+,
+.br
+.br
+.BI " NVMF_LOG_DISC_LID_ALLSUBES"
+
+};
+.SH Constants
+.IP "NVMF_LOG_DISC_LID_NONE" 12
+None
+.IP "NVMF_LOG_DISC_LID_EXTDLPES" 12
+Extended Discovery Log Page Entries Supported
+.IP "NVMF_LOG_DISC_LID_PLEOS" 12
+Port Local Entries Only Supported
+.IP "NVMF_LOG_DISC_LID_ALLSUBES" 12
+All NVM Subsystem Entries Supported
diff --git a/doc/man/nvmf_log_discovery_lsp.2 b/doc/man/nvmf_log_discovery_lsp.2
new file mode 100644
index 0000000..e9e91d0
--- /dev/null
+++ b/doc/man/nvmf_log_discovery_lsp.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvmf_log_discovery_lsp" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvmf_log_discovery_lsp \- Discovery log specific field
+.SH SYNOPSIS
+enum nvmf_log_discovery_lsp {
+.br
+.BI " NVMF_LOG_DISC_LSP_NONE"
+,
+.br
+.br
+.BI " NVMF_LOG_DISC_LSP_EXTDLPE"
+,
+.br
+.br
+.BI " NVMF_LOG_DISC_LSP_PLEO"
+,
+.br
+.br
+.BI " NVMF_LOG_DISC_LSP_ALLSUBE"
+
+};
+.SH Constants
+.IP "NVMF_LOG_DISC_LSP_NONE" 12
+None
+.IP "NVMF_LOG_DISC_LSP_EXTDLPE" 12
+Extended Discovery Log Page Entries
+.IP "NVMF_LOG_DISC_LSP_PLEO" 12
+Port Local Entries Only
+.IP "NVMF_LOG_DISC_LSP_ALLSUBE" 12
+All NVM Subsystem Entries
diff --git a/doc/man/nvmf_prtype_str.2 b/doc/man/nvmf_prtype_str.2
new file mode 100644
index 0000000..15d6289
--- /dev/null
+++ b/doc/man/nvmf_prtype_str.2
@@ -0,0 +1,14 @@
+.TH "nvmf_prtype_str" 9 "nvmf_prtype_str" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_prtype_str \- Decode RDMA Provider type field
+.SH SYNOPSIS
+.B "const char *" nvmf_prtype_str
+.BI "(__u8 prtype " ");"
+.SH ARGUMENTS
+.IP "prtype" 12
+value to be decoded
+.SH "DESCRIPTION"
+Decode the RDMA Provider type field in the discovery
+log page entry.
+.SH "RETURN"
+decoded string
diff --git a/doc/man/nvmf_qptype_str.2 b/doc/man/nvmf_qptype_str.2
new file mode 100644
index 0000000..d873573
--- /dev/null
+++ b/doc/man/nvmf_qptype_str.2
@@ -0,0 +1,14 @@
+.TH "nvmf_qptype_str" 9 "nvmf_qptype_str" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_qptype_str \- Decode RDMA QP Service type field
+.SH SYNOPSIS
+.B "const char *" nvmf_qptype_str
+.BI "(__u8 qptype " ");"
+.SH ARGUMENTS
+.IP "qptype" 12
+value to be decoded
+.SH "DESCRIPTION"
+Decode the RDMA QP Service type field in the discovery log page
+entry.
+.SH "RETURN"
+decoded string
diff --git a/doc/man/nvmf_rdma_cms.2 b/doc/man/nvmf_rdma_cms.2
new file mode 100644
index 0000000..6c31c01
--- /dev/null
+++ b/doc/man/nvmf_rdma_cms.2
@@ -0,0 +1,12 @@
+.TH "libnvme" 9 "enum nvmf_rdma_cms" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvmf_rdma_cms \- RDMA Connection Management Service Type codes for Discovery Log Page entry TSAS RDMA_CMS field
+.SH SYNOPSIS
+enum nvmf_rdma_cms {
+.br
+.BI " NVMF_RDMA_CMS_RDMA_CM"
+
+};
+.SH Constants
+.IP "NVMF_RDMA_CMS_RDMA_CM" 12
+Sockets based endpoint addressing
diff --git a/doc/man/nvmf_rdma_prtype.2 b/doc/man/nvmf_rdma_prtype.2
new file mode 100644
index 0000000..3ebf9a2
--- /dev/null
+++ b/doc/man/nvmf_rdma_prtype.2
@@ -0,0 +1,36 @@
+.TH "libnvme" 9 "enum nvmf_rdma_prtype" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvmf_rdma_prtype \- RDMA Provider Type codes for Discovery Log Page entry TSAS RDMA_PRTYPE field
+.SH SYNOPSIS
+enum nvmf_rdma_prtype {
+.br
+.BI " NVMF_RDMA_PRTYPE_NOT_SPECIFIED"
+,
+.br
+.br
+.BI " NVMF_RDMA_PRTYPE_IB"
+,
+.br
+.br
+.BI " NVMF_RDMA_PRTYPE_ROCE"
+,
+.br
+.br
+.BI " NVMF_RDMA_PRTYPE_ROCEV2"
+,
+.br
+.br
+.BI " NVMF_RDMA_PRTYPE_IWARP"
+
+};
+.SH Constants
+.IP "NVMF_RDMA_PRTYPE_NOT_SPECIFIED" 12
+No Provider Specified
+.IP "NVMF_RDMA_PRTYPE_IB" 12
+InfiniBand
+.IP "NVMF_RDMA_PRTYPE_ROCE" 12
+InfiniBand RoCE
+.IP "NVMF_RDMA_PRTYPE_ROCEV2" 12
+InfiniBand RoCEV2
+.IP "NVMF_RDMA_PRTYPE_IWARP" 12
+iWARP
diff --git a/doc/man/nvmf_rdma_qptype.2 b/doc/man/nvmf_rdma_qptype.2
new file mode 100644
index 0000000..8be2b64
--- /dev/null
+++ b/doc/man/nvmf_rdma_qptype.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvmf_rdma_qptype" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvmf_rdma_qptype \- RDMA QP Service Type codes for Discovery Log Page entry TSAS RDMA_QPTYPE field
+.SH SYNOPSIS
+enum nvmf_rdma_qptype {
+.br
+.BI " NVMF_RDMA_QPTYPE_CONNECTED"
+,
+.br
+.br
+.BI " NVMF_RDMA_QPTYPE_DATAGRAM"
+
+};
+.SH Constants
+.IP "NVMF_RDMA_QPTYPE_CONNECTED" 12
+Reliable Connected
+.IP "NVMF_RDMA_QPTYPE_DATAGRAM" 12
+Reliable Datagram
diff --git a/doc/man/nvmf_register_ctrl.2 b/doc/man/nvmf_register_ctrl.2
new file mode 100644
index 0000000..43c77d4
--- /dev/null
+++ b/doc/man/nvmf_register_ctrl.2
@@ -0,0 +1,22 @@
+.TH "nvmf_register_ctrl" 9 "nvmf_register_ctrl" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_register_ctrl \- Perform registration task with a DC
+.SH SYNOPSIS
+.B "int" nvmf_register_ctrl
+.BI "(nvme_ctrl_t c " ","
+.BI "enum nvmf_dim_tas tas " ","
+.BI "__u32 *result " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller instance
+.IP "tas" 12
+Task field of the Command Dword 10 (cdw10). Indicates whether to
+perform a Registration, Deregistration, or Registration-update.
+.IP "result" 12
+The command-specific result returned by the DC upon command
+completion.
+.SH "DESCRIPTION"
+Perform registration task with a Discovery Controller (DC). Three
+tasks are supported: register, deregister, and registration update.
+.SH "RETURN"
+0 on success; on failure -1 is returned and errno is set
diff --git a/doc/man/nvmf_sectype_str.2 b/doc/man/nvmf_sectype_str.2
new file mode 100644
index 0000000..d625a34
--- /dev/null
+++ b/doc/man/nvmf_sectype_str.2
@@ -0,0 +1,14 @@
+.TH "nvmf_sectype_str" 9 "nvmf_sectype_str" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_sectype_str \- Decode SECTYPE field
+.SH SYNOPSIS
+.B "const char *" nvmf_sectype_str
+.BI "(__u8 sectype " ");"
+.SH ARGUMENTS
+.IP "sectype" 12
+value to be decoded
+.SH "DESCRIPTION"
+Decode the SECTYPE field in the discovery log page
+entry.
+.SH "RETURN"
+decoded string
diff --git a/doc/man/nvmf_subtype_str.2 b/doc/man/nvmf_subtype_str.2
new file mode 100644
index 0000000..12ee728
--- /dev/null
+++ b/doc/man/nvmf_subtype_str.2
@@ -0,0 +1,14 @@
+.TH "nvmf_subtype_str" 9 "nvmf_subtype_str" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_subtype_str \- Decode SUBTYPE field
+.SH SYNOPSIS
+.B "const char *" nvmf_subtype_str
+.BI "(__u8 subtype " ");"
+.SH ARGUMENTS
+.IP "subtype" 12
+value to be decoded
+.SH "DESCRIPTION"
+Decode the subsystem type field in the discovery
+log page entry.
+.SH "RETURN"
+decoded string
diff --git a/doc/man/nvmf_tcp_sectype.2 b/doc/man/nvmf_tcp_sectype.2
new file mode 100644
index 0000000..65c69b1
--- /dev/null
+++ b/doc/man/nvmf_tcp_sectype.2
@@ -0,0 +1,26 @@
+.TH "libnvme" 9 "enum nvmf_tcp_sectype" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvmf_tcp_sectype \- Transport Specific Address Subtype Definition for NVMe/TCP Transport
+.SH SYNOPSIS
+enum nvmf_tcp_sectype {
+.br
+.BI " NVMF_TCP_SECTYPE_NONE"
+,
+.br
+.br
+.BI " NVMF_TCP_SECTYPE_TLS"
+,
+.br
+.br
+.BI " NVMF_TCP_SECTYPE_TLS13"
+
+};
+.SH Constants
+.IP "NVMF_TCP_SECTYPE_NONE" 12
+No Security
+.IP "NVMF_TCP_SECTYPE_TLS" 12
+Transport Layer Security version 1.2
+.IP "NVMF_TCP_SECTYPE_TLS13" 12
+Transport Layer Security version 1.3 or a subsequent
+version. The TLS protocol negotiates the version and
+cipher suite for each TCP connection.
diff --git a/doc/man/nvmf_treq.2 b/doc/man/nvmf_treq.2
new file mode 100644
index 0000000..200c3ab
--- /dev/null
+++ b/doc/man/nvmf_treq.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvmf_treq" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvmf_treq \- Transport Requirements codes for Discovery Log Page entry TREQ field
+.SH SYNOPSIS
+enum nvmf_treq {
+.br
+.BI " NVMF_TREQ_NOT_SPECIFIED"
+,
+.br
+.br
+.BI " NVMF_TREQ_REQUIRED"
+,
+.br
+.br
+.BI " NVMF_TREQ_NOT_REQUIRED"
+,
+.br
+.br
+.BI " NVMF_TREQ_DISABLE_SQFLOW"
+
+};
+.SH Constants
+.IP "NVMF_TREQ_NOT_SPECIFIED" 12
+Not specified
+.IP "NVMF_TREQ_REQUIRED" 12
+Required
+.IP "NVMF_TREQ_NOT_REQUIRED" 12
+Not Required
+.IP "NVMF_TREQ_DISABLE_SQFLOW" 12
+SQ flow control disable supported
diff --git a/doc/man/nvmf_treq_str.2 b/doc/man/nvmf_treq_str.2
new file mode 100644
index 0000000..ae02578
--- /dev/null
+++ b/doc/man/nvmf_treq_str.2
@@ -0,0 +1,14 @@
+.TH "nvmf_treq_str" 9 "nvmf_treq_str" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_treq_str \- Decode TREQ field
+.SH SYNOPSIS
+.B "const char *" nvmf_treq_str
+.BI "(__u8 treq " ");"
+.SH ARGUMENTS
+.IP "treq" 12
+value to be decoded
+.SH "DESCRIPTION"
+Decode the transport requirements field in the
+discovery log page entry.
+.SH "RETURN"
+decoded string
diff --git a/doc/man/nvmf_trtype.2 b/doc/man/nvmf_trtype.2
new file mode 100644
index 0000000..b0fe0c2
--- /dev/null
+++ b/doc/man/nvmf_trtype.2
@@ -0,0 +1,43 @@
+.TH "libnvme" 9 "enum nvmf_trtype" "January 2023" "API Manual" LINUX
+.SH NAME
+enum nvmf_trtype \- Transport Type codes for Discovery Log Page entry TRTYPE field
+.SH SYNOPSIS
+enum nvmf_trtype {
+.br
+.BI " NVMF_TRTYPE_UNSPECIFIED"
+,
+.br
+.br
+.BI " NVMF_TRTYPE_RDMA"
+,
+.br
+.br
+.BI " NVMF_TRTYPE_FC"
+,
+.br
+.br
+.BI " NVMF_TRTYPE_TCP"
+,
+.br
+.br
+.BI " NVMF_TRTYPE_LOOP"
+,
+.br
+.br
+.BI " NVMF_TRTYPE_MAX"
+
+};
+.SH Constants
+.IP "NVMF_TRTYPE_UNSPECIFIED" 12
+Not indicated
+.IP "NVMF_TRTYPE_RDMA" 12
+RDMA
+.IP "NVMF_TRTYPE_FC" 12
+Fibre Channel
+.IP "NVMF_TRTYPE_TCP" 12
+TCP
+.IP "NVMF_TRTYPE_LOOP" 12
+Intra-host Transport (i.e., loopback), reserved
+for host usage.
+.IP "NVMF_TRTYPE_MAX" 12
+Maximum value for \fIenum nvmf_trtype\fP
diff --git a/doc/man/nvmf_trtype_str.2 b/doc/man/nvmf_trtype_str.2
new file mode 100644
index 0000000..4926c56
--- /dev/null
+++ b/doc/man/nvmf_trtype_str.2
@@ -0,0 +1,14 @@
+.TH "nvmf_trtype_str" 9 "nvmf_trtype_str" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_trtype_str \- Decode TRTYPE field
+.SH SYNOPSIS
+.B "const char *" nvmf_trtype_str
+.BI "(__u8 trtype " ");"
+.SH ARGUMENTS
+.IP "trtype" 12
+value to be decoded
+.SH "DESCRIPTION"
+Decode the transport type field in the discovery
+log page entry.
+.SH "RETURN"
+decoded string
diff --git a/doc/man/nvmf_update_config.2 b/doc/man/nvmf_update_config.2
new file mode 100644
index 0000000..a4bff1c
--- /dev/null
+++ b/doc/man/nvmf_update_config.2
@@ -0,0 +1,15 @@
+.TH "nvmf_update_config" 9 "nvmf_update_config" "January 2023" "libnvme API manual" LINUX
+.SH NAME
+nvmf_update_config \- Update fabrics configuration values
+.SH SYNOPSIS
+.B "void" nvmf_update_config
+.BI "(nvme_ctrl_t c " ","
+.BI "const struct nvme_fabrics_config *cfg " ");"
+.SH ARGUMENTS
+.IP "c" 12
+Controller to be modified
+.IP "cfg" 12
+Updated configuration values
+.SH "DESCRIPTION"
+Updates the values from \fIc\fP with the configuration values from \fIcfg\fP;
+all non-default values from \fIcfg\fP will overwrite the values in \fIc\fP.
diff --git a/doc/meson.build b/doc/meson.build
new file mode 100644
index 0000000..60a92ed
--- /dev/null
+++ b/doc/meson.build
@@ -0,0 +1,117 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+#
+# This file is part of libnvme.
+# Copyright (c) 2022 Dell Inc.
+# Copyright (c) 2022 SUSE LLC
+#
+# Authors: Martin Belanger <Martin.Belanger@dell.com>
+# Authors: Daniel Wagner <dwagner@suse.de>
+#
+
+api_files = [
+ 'filters.h',
+ 'ioctl.h',
+ 'linux.h',
+ 'log.h',
+ 'mi.h',
+ 'tree.h',
+ 'types.h',
+ 'fabrics.h',
+ 'util.h'
+]
+
+api_paths = []
+foreach f: api_files
+ api_paths += files('../src/nvme/' + f)
+endforeach
+
+sphinx_sources = [
+ 'conf.py',
+ 'api.rst',
+ 'index.rst',
+ 'quickstart.rst',
+ 'installation.rst',
+ 'mi.rst',
+ 'config-schema.json'
+]
+
+static_sources = []
+foreach file : sphinx_sources
+ static_sources += configure_file(input: file + '.in',
+ output: file,
+ configuration: substs)
+endforeach
+
+subdir('rst')
+
+want_docs = get_option('docs')
+want_docs_build = get_option('docs-build')
+kernel_doc = find_program('kernel-doc')
+kernel_doc_check = find_program('kernel-doc-check')
+
+test('kdoc', kernel_doc_check, args: api_paths)
+
+if want_docs != 'false'
+
+ conf = configuration_data()
+ conf.set('SYSCONFDIR', sysconfdir)
+
+ if want_docs == 'all' or want_docs == 'man'
+ mandir = join_paths(get_option('mandir'), 'man2')
+ list_man_pages = find_program('list-man-pages.sh')
+ if want_docs_build
+ foreach apif : api_paths
+ subst = configure_file(
+ input: apif,
+ output: '@BASENAME@.subst',
+ configuration: conf)
+ c = run_command(list_man_pages, subst, check: true)
+ man_pages = c.stdout().split()
+ foreach page : man_pages
+ custom_target(
+ page.underscorify() + '_man',
+ input: subst,
+ output: page + '.2',
+ capture: true,
+ command: [kernel_doc,
+ '-module', 'libnvme',
+ '-man',
+ '-function',
+ page,
+ subst],
+ install: true,
+ install_dir: mandir)
+ endforeach
+ endforeach
+ else
+ if want_docs == 'all' or want_docs == 'man'
+ list_pre_compiled = find_program('list-pre-compiled.sh')
+ m = run_command(list_pre_compiled, check: true)
+ man_pages = m.stdout().strip().split('\n')
+ install_data(man_pages, install_dir: mandir)
+ endif
+ endif
+ endif
+
+ if want_docs == 'all' or want_docs == 'html'
+ htmldir = join_paths(get_option('htmldir'), 'nvme')
+ sphinx_build = find_program('sphinx-build-3', 'sphinx-build')
+ if sphinx_build.found() and want_docs_build
+ custom_target(
+ 'generate_doc_html',
+ input: [static_sources, rst],
+ output: 'html',
+ command: [sphinx_build,
+ '-b', 'html',
+ '@OUTDIR@',
+ '@OUTDIR@' + '/html'],
+ install: true,
+ install_dir: htmldir)
+ else
+ # The HTML doc is not ready yet.
+ # if want_docs == 'all' or want_docs == 'html'
+ # install_subdir('html', install_dir: htmldir)
+ # endif
+ endif
+ endif
+endif
diff --git a/doc/mi.rst.in b/doc/mi.rst.in
new file mode 100644
index 0000000..a75fd69
--- /dev/null
+++ b/doc/mi.rst.in
@@ -0,0 +1,54 @@
+NVMe Management Interface (NVMe-MI) support
+===========================================
+
+This libnvme project also includes support for the NVMe Management Interface
+(NVMe-MI), currently over a Management Component Transport (MCTP)
+protocol link. This MCTP link will typically use i2c/SMBus as the
+hardware transport, enabling out-of-band management and control over NVMe
+devices using a simple SMBus interface.
+
+The MI interface is compiled into a separate shared object, ``libnvme-mi.so``.
+
+Most of the MI API is transport-agnostic, except for the endpoint constructor
+functions. Once an endpoint object (``nvme_mi_ep_t``) is created, the generic
+functions can be used to manage it.
+
+When endpoints are created (through one of the transport-specific functions,
+like ``nvme_mi_open_mctp()``), the endpoint hardware will be probed to
+see if any device-specific workarounds ("quirks") are required. This is
+implemented as an Identify Controller command, requesting a small amount of
+data on controller ID 0.
+
+To suppress this probe, the ``LIBNVME_MI_PROBE_ENABLED`` environment var can be
+set. Values of ``0``, ``false`` and ``disabled`` will disable the probe, and no
+quirks will be applied. Other values, or an unset environment variable, will
+enable the probe.
+
+MCTP Transport
+--------------
+
+The MI API is generally transport-agnostic, but the only currently-supported
+transport is MCTP, using the kernel ``AF_MCTP`` socket interface.
+
+MCTP endpoints are addressed by a (network-id, endpoint-id) pair. Endpoint
+IDs (EIDs) are defined by the MCTP standard as an 8-bit value. Since the
+address space is somewhat limited, the Linux `AF_MCTP` support allows for
+separate MCTP "networks", which provide separate address spaces. These networks
+each have a unique ``unsigned int`` as their ID.
+
+The default Network ID is 1; unless you have configured otherwise, MCTP
+endpoints will appear on this network.
+
+If compiled with D-Bus support, ``libnvme-mi`` can query the system MCTP daemon
+("``mctpd``") to find attached NVMe devices, via the ``nvme_mi_scan_mctp()``
+function. Calling this will establish a ``nvme_root_t`` object, populated
+with the results of that scan. Use the ``nvme_mi_for_each_endpoint`` macro
+to iterate through the scanned endpoints.
+
+Note that the MCTP daemon is provided separately, as part of the MCTP userspace
+tools, at https://github.com/CodeConstruct/mctp . ``mctpd`` is responsible for
+discovery and enumeration for MCTP endpoints on the system, and will query
+each for its protocol capabilities during enumeration. Consequently, NVMe-MI
+endpoints will need to report support for NVMe-MI-over-MCTP (protocol 0x4) in
+their supported protocols list (ie., as returned by the MCTP Get Message Type
+Support command) in order to be discovered.
diff --git a/doc/quickstart.rst.in b/doc/quickstart.rst.in
new file mode 100644
index 0000000..d356188
--- /dev/null
+++ b/doc/quickstart.rst.in
@@ -0,0 +1,5 @@
+==========
+Quickstart
+==========
+
+tbd \ No newline at end of file
diff --git a/doc/rst/fabrics.rst b/doc/rst/fabrics.rst
new file mode 100644
index 0000000..a7e0e60
--- /dev/null
+++ b/doc/rst/fabrics.rst
@@ -0,0 +1,521 @@
+.. _fabrics.h:
+
+**fabrics.h**
+
+
+Fabrics-specific definitions.
+
+
+
+.. c:struct:: nvme_fabrics_config
+
+ Defines all linux nvme fabrics initiator options
+
+**Definition**
+
+::
+
+ struct nvme_fabrics_config {
+ char *host_traddr;
+ char *host_iface;
+ int queue_size;
+ int nr_io_queues;
+ int reconnect_delay;
+ int ctrl_loss_tmo;
+ int fast_io_fail_tmo;
+ int keep_alive_tmo;
+ int nr_write_queues;
+ int nr_poll_queues;
+ int tos;
+ bool duplicate_connect;
+ bool disable_sqflow;
+ bool hdr_digest;
+ bool data_digest;
+ bool tls;
+ };
+
+**Members**
+
+``host_traddr``
+ Host transport address
+
+``host_iface``
+ Host interface name
+
+``queue_size``
+ Number of IO queue entries
+
+``nr_io_queues``
+ Number of controller IO queues to establish
+
+``reconnect_delay``
+ Time between two consecutive reconnect attempts.
+
+``ctrl_loss_tmo``
+ Override the default controller reconnect attempt timeout in seconds
+
+``fast_io_fail_tmo``
+ Set the fast I/O fail timeout in seconds.
+
+``keep_alive_tmo``
+ Override the default keep-alive-timeout to this value in seconds
+
+``nr_write_queues``
+ Number of queues to use for exclusively for writing
+
+``nr_poll_queues``
+ Number of queues to reserve for polling completions
+
+``tos``
+ Type of service
+
+``duplicate_connect``
+ Allow multiple connections to the same target
+
+``disable_sqflow``
+ Disable controller sq flow control
+
+``hdr_digest``
+ Generate/verify header digest (TCP)
+
+``data_digest``
+ Generate/verify data digest (TCP)
+
+``tls``
+ Start TLS on the connection (TCP)
+
+
+
+.. c:function:: const char * nvmf_trtype_str (__u8 trtype)
+
+ Decode TRTYPE field
+
+**Parameters**
+
+``__u8 trtype``
+ value to be decoded
+
+**Description**
+
+Decode the transport type field in the discovery
+log page entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_adrfam_str (__u8 adrfam)
+
+ Decode ADRFAM field
+
+**Parameters**
+
+``__u8 adrfam``
+ value to be decoded
+
+**Description**
+
+Decode the address family field in the discovery
+log page entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_subtype_str (__u8 subtype)
+
+ Decode SUBTYPE field
+
+**Parameters**
+
+``__u8 subtype``
+ value to be decoded
+
+**Description**
+
+Decode the subsystem type field in the discovery
+log page entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_treq_str (__u8 treq)
+
+ Decode TREQ field
+
+**Parameters**
+
+``__u8 treq``
+ value to be decoded
+
+**Description**
+
+Decode the transport requirements field in the
+discovery log page entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_eflags_str (__u16 eflags)
+
+ Decode EFLAGS field
+
+**Parameters**
+
+``__u16 eflags``
+ value to be decoded
+
+**Description**
+
+Decode the EFLAGS field in the discovery log page
+entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_sectype_str (__u8 sectype)
+
+ Decode SECTYPE field
+
+**Parameters**
+
+``__u8 sectype``
+ value to be decoded
+
+**Description**
+
+Decode the SECTYPE field in the discovery log page
+entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_prtype_str (__u8 prtype)
+
+ Decode RDMA Provider type field
+
+**Parameters**
+
+``__u8 prtype``
+ value to be decoded
+
+**Description**
+
+Decode the RDMA Provider type field in the discovery
+log page entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_qptype_str (__u8 qptype)
+
+ Decode RDMA QP Service type field
+
+**Parameters**
+
+``__u8 qptype``
+ value to be decoded
+
+**Description**
+
+Decode the RDMA QP Service type field in the discovery log page
+entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_cms_str (__u8 cms)
+
+ Decode RDMA connection management service field
+
+**Parameters**
+
+``__u8 cms``
+ value to be decoded
+
+**Description**
+
+Decode the RDMA connection management service field in the discovery
+log page entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: void nvmf_default_config (struct nvme_fabrics_config *cfg)
+
+ Default values for fabrics configuration
+
+**Parameters**
+
+``struct nvme_fabrics_config *cfg``
+ config values to set
+
+**Description**
+
+Initializes **cfg** with default values.
+
+
+.. c:function:: void nvmf_update_config (nvme_ctrl_t c, const struct nvme_fabrics_config *cfg)
+
+ Update fabrics configuration values
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller to be modified
+
+``const struct nvme_fabrics_config *cfg``
+ Updated configuration values
+
+**Description**
+
+Updates the values from **c** with the configuration values from **cfg**;
+all non-default values from **cfg** will overwrite the values in **c**.
+
+
+.. c:function:: int nvmf_add_ctrl (nvme_host_t h, nvme_ctrl_t c, const struct nvme_fabrics_config *cfg)
+
+ Connect a controller and update topology
+
+**Parameters**
+
+``nvme_host_t h``
+ Host to which the controller should be attached
+
+``nvme_ctrl_t c``
+ Controller to be connected
+
+``const struct nvme_fabrics_config *cfg``
+ Default configuration for the controller
+
+**Description**
+
+Issues a 'connect' command to the NVMe-oF controller and inserts **c**
+into the topology using **h** as parent.
+**c** must be initialized and not connected to the topology.
+
+**Return**
+
+0 on success; on failure errno is set and -1 is returned.
+
+
+.. c:function:: int nvmf_get_discovery_log (nvme_ctrl_t c, struct nvmf_discovery_log **logp, int max_retries)
+
+ Return the discovery log page
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Discovery controller to use
+
+``struct nvmf_discovery_log **logp``
+ Pointer to the log page to be returned
+
+``int max_retries``
+ Number of retries in case of failure
+
+**Description**
+
+The memory allocated for the log page and returned in **logp**
+must be freed by the caller using free().
+
+**Note**
+
+Consider using nvmf_get_discovery_wargs() instead.
+
+**Return**
+
+0 on success; on failure -1 is returned and errno is set
+
+
+
+
+.. c:struct:: nvme_get_discovery_args
+
+ Arguments for nvmf_get_discovery_wargs()
+
+**Definition**
+
+::
+
+ struct nvme_get_discovery_args {
+ nvme_ctrl_t c;
+ int args_size;
+ int max_retries;
+ __u32 *result;
+ __u32 timeout;
+ __u8 lsp;
+ };
+
+**Members**
+
+``c``
+ Discovery controller
+
+``args_size``
+ Length of the structure
+
+``max_retries``
+ Number of retries in case of failure
+
+``result``
+ The command completion result from CQE dword0
+
+``timeout``
+ Timeout in ms (default: NVME_DEFAULT_IOCTL_TIMEOUT)
+
+``lsp``
+ Log specific field (See enum nvmf_log_discovery_lsp)
+
+
+
+.. c:function:: struct nvmf_discovery_log * nvmf_get_discovery_wargs (struct nvme_get_discovery_args *args)
+
+ Get the discovery log page with args
+
+**Parameters**
+
+``struct nvme_get_discovery_args *args``
+ Argument structure
+
+**Description**
+
+This function is similar to nvmf_get_discovery_log(), but
+takes an extensible **args** parameter. **args** provides more
+options than nvmf_get_discovery_log().
+
+This function performs a get discovery log page (DLP) command
+and returns the DLP. The memory allocated for the returned
+DLP must be freed by the caller using free().
+
+**Return**
+
+Pointer to the discovery log page (to be freed). NULL
+on failure and errno is set.
+
+
+.. c:function:: char * nvmf_hostnqn_generate ()
+
+ Generate a machine specific host nqn
+
+**Parameters**
+
+**Return**
+
+An nvm namespace qualified name string based on the machine
+identifier, or NULL if not successful.
+
+
+.. c:function:: char * nvmf_hostnqn_from_file ()
+
+ Reads the host nvm qualified name from the config default location in /usr/local/etc/nvme/
+
+**Parameters**
+
+**Return**
+
+The host nqn, or NULL if unsuccessful. If found, the caller
+is responsible to free the string.
+
+
+.. c:function:: char * nvmf_hostid_from_file ()
+
+ Reads the host identifier from the config default location in /usr/local/etc/nvme/.
+
+**Parameters**
+
+**Return**
+
+The host identifier, or NULL if unsuccessful. If found, the caller
+ is responsible to free the string.
+
+
+.. c:function:: nvme_ctrl_t nvmf_connect_disc_entry (nvme_host_t h, struct nvmf_disc_log_entry *e, const struct nvme_fabrics_config *defcfg, bool *discover)
+
+ Connect controller based on the discovery log page entry
+
+**Parameters**
+
+``nvme_host_t h``
+ Host to which the controller should be connected
+
+``struct nvmf_disc_log_entry *e``
+ Discovery log page entry
+
+``const struct nvme_fabrics_config *defcfg``
+ Default configuration to be used for the new controller
+
+``bool *discover``
+ Set to 'true' if the new controller is a discovery controller
+
+**Return**
+
+Pointer to the new controller
+
+
+.. c:function:: bool nvmf_is_registration_supported (nvme_ctrl_t c)
+
+ check whether registration can be performed.
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Description**
+
+Only discovery controllers (DC) that comply with TP8010 support
+explicit registration with the DIM PDU. These can be identified by
+looking at the value of a dctype in the Identify command
+response. A value of 1 (DDC) or 2 (CDC) indicates that the DC
+supports explicit registration.
+
+**Return**
+
+true if controller supports explicit registration. false
+otherwise.
+
+
+.. c:function:: int nvmf_register_ctrl (nvme_ctrl_t c, enum nvmf_dim_tas tas, __u32 *result)
+
+ Perform registration task with a DC
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+``enum nvmf_dim_tas tas``
+ Task field of the Command Dword 10 (cdw10). Indicates whether to
+ perform a Registration, Deregistration, or Registration-update.
+
+``__u32 *result``
+ The command-specific result returned by the DC upon command
+ completion.
+
+**Description**
+
+Perform registration task with a Discovery Controller (DC). Three
+tasks are supported: register, deregister, and registration update.
+
+**Return**
+
+0 on success; on failure -1 is returned and errno is set
+
+
diff --git a/doc/rst/filters.rst b/doc/rst/filters.rst
new file mode 100644
index 0000000..3e8c997
--- /dev/null
+++ b/doc/rst/filters.rst
@@ -0,0 +1,142 @@
+.. _filters.h:
+
+**filters.h**
+
+
+libnvme directory filter
+
+.. c:function:: int nvme_namespace_filter (const struct dirent *d)
+
+ Filter for namespaces
+
+**Parameters**
+
+``const struct dirent *d``
+ dirent to check
+
+**Return**
+
+1 if **d** matches, 0 otherwise
+
+
+.. c:function:: int nvme_paths_filter (const struct dirent *d)
+
+ Filter for paths
+
+**Parameters**
+
+``const struct dirent *d``
+ dirent to check
+
+**Return**
+
+1 if **d** matches, 0 otherwise
+
+
+.. c:function:: int nvme_ctrls_filter (const struct dirent *d)
+
+ Filter for controllers
+
+**Parameters**
+
+``const struct dirent *d``
+ dirent to check
+
+**Return**
+
+1 if **d** matches, 0 otherwise
+
+
+.. c:function:: int nvme_subsys_filter (const struct dirent *d)
+
+ Filter for subsystems
+
+**Parameters**
+
+``const struct dirent *d``
+ dirent to check
+
+**Return**
+
+1 if **d** matches, 0 otherwise
+
+
+.. c:function:: int nvme_scan_subsystems (struct dirent ***subsys)
+
+ Scan for subsystems
+
+**Parameters**
+
+``struct dirent ***subsys``
+ Pointer to array of dirents
+
+**Return**
+
+number of entries in **subsys**
+
+
+.. c:function:: int nvme_scan_subsystem_namespaces (nvme_subsystem_t s, struct dirent ***ns)
+
+ Scan for namespaces in a subsystem
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ Subsystem to scan
+
+``struct dirent ***ns``
+ Pointer to array of dirents
+
+**Return**
+
+number of entries in **ns**
+
+
+.. c:function:: int nvme_scan_ctrls (struct dirent ***ctrls)
+
+ Scan for controllers
+
+**Parameters**
+
+``struct dirent ***ctrls``
+ Pointer to array of dirents
+
+**Return**
+
+number of entries in **ctrls**
+
+
+.. c:function:: int nvme_scan_ctrl_namespace_paths (nvme_ctrl_t c, struct dirent ***paths)
+
+ Scan for namespace paths in a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller to scan
+
+``struct dirent ***paths``
+ Pointer to array of dirents
+
+**Return**
+
+number of entries in **paths**
+
+
+.. c:function:: int nvme_scan_ctrl_namespaces (nvme_ctrl_t c, struct dirent ***ns)
+
+ Scan for namespaces in a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller to scan
+
+``struct dirent ***ns``
+ Pointer to array of dirents
+
+**Return**
+
+number of entries in **ns**
+
+
diff --git a/doc/rst/ioctl.rst b/doc/rst/ioctl.rst
new file mode 100644
index 0000000..d0a5173
--- /dev/null
+++ b/doc/rst/ioctl.rst
@@ -0,0 +1,4902 @@
+.. _ioctl.h:
+
+**ioctl.h**
+
+
+Linux NVMe ioctl interface functions
+
+
+
+.. c:struct:: nvme_passthru_cmd
+
+ nvme passthrough command structure
+
+**Definition**
+
+::
+
+ struct nvme_passthru_cmd {
+ __u8 opcode;
+ __u8 flags;
+ __u16 rsvd1;
+ __u32 nsid;
+ __u32 cdw2;
+ __u32 cdw3;
+ __u64 metadata;
+ __u64 addr;
+ __u32 metadata_len;
+ __u32 data_len;
+ __u32 cdw10;
+ __u32 cdw11;
+ __u32 cdw12;
+ __u32 cdw13;
+ __u32 cdw14;
+ __u32 cdw15;
+ __u32 timeout_ms;
+ __u32 result;
+ };
+
+**Members**
+
+``opcode``
+ Operation code, see :c:type:`enum nvme_io_opcodes <nvme_io_opcodes>` and :c:type:`enum nvme_admin_opcodes <nvme_admin_opcodes>`
+
+``flags``
+ Not supported: intended for command flags (eg: SGL, FUSE)
+
+``rsvd1``
+ Reserved for future use
+
+``nsid``
+ Namespace Identifier, or Fabrics type
+
+``cdw2``
+ Command Dword 2 (no spec defined use)
+
+``cdw3``
+ Command Dword 3 (no spec defined use)
+
+``metadata``
+ User space address to metadata buffer (NULL if not used)
+
+``addr``
+ User space address to data buffer (NULL if not used)
+
+``metadata_len``
+ Metadata buffer transfer length
+
+``data_len``
+ Data buffer transfer length
+
+``cdw10``
+ Command Dword 10 (command specific)
+
+``cdw11``
+ Command Dword 11 (command specific)
+
+``cdw12``
+ Command Dword 12 (command specific)
+
+``cdw13``
+ Command Dword 13 (command specific)
+
+``cdw14``
+ Command Dword 14 (command specific)
+
+``cdw15``
+ Command Dword 15 (command specific)
+
+``timeout_ms``
+ If non-zero, overrides system default timeout in milliseconds
+
+``result``
+ Set on completion to the command's CQE DWORD 0 controller response
+
+
+
+
+
+.. c:struct:: nvme_passthru_cmd64
+
+ 64-bit nvme passthrough command structure
+
+**Definition**
+
+::
+
+ struct nvme_passthru_cmd64 {
+ __u8 opcode;
+ __u8 flags;
+ __u16 rsvd1;
+ __u32 nsid;
+ __u32 cdw2;
+ __u32 cdw3;
+ __u64 metadata;
+ __u64 addr;
+ __u32 metadata_len;
+ __u32 data_len;
+ __u32 cdw10;
+ __u32 cdw11;
+ __u32 cdw12;
+ __u32 cdw13;
+ __u32 cdw14;
+ __u32 cdw15;
+ __u32 timeout_ms;
+ __u32 rsvd2;
+ __u64 result;
+ };
+
+**Members**
+
+``opcode``
+ Operation code, see :c:type:`enum nvme_io_opcodes <nvme_io_opcodes>` and :c:type:`enum nvme_admin_opcodes <nvme_admin_opcodes>`
+
+``flags``
+ Not supported: intended for command flags (eg: SGL, FUSE)
+
+``rsvd1``
+ Reserved for future use
+
+``nsid``
+ Namespace Identifier, or Fabrics type
+
+``cdw2``
+ Command Dword 2 (no spec defined use)
+
+``cdw3``
+ Command Dword 3 (no spec defined use)
+
+``metadata``
+ User space address to metadata buffer (NULL if not used)
+
+``addr``
+ User space address to data buffer (NULL if not used)
+
+``metadata_len``
+ Metadata buffer transfer length
+
+``data_len``
+ Data buffer transfer length
+
+``cdw10``
+ Command Dword 10 (command specific)
+
+``cdw11``
+ Command Dword 11 (command specific)
+
+``cdw12``
+ Command Dword 12 (command specific)
+
+``cdw13``
+ Command Dword 13 (command specific)
+
+``cdw14``
+ Command Dword 14 (command specific)
+
+``cdw15``
+ Command Dword 15 (command specific)
+
+``timeout_ms``
+ If non-zero, overrides system default timeout in milliseconds
+
+``rsvd2``
+ Reserved for future use (and fills an implicit struct pad
+
+``result``
+ Set on completion to the command's CQE DWORD 0-1 controller response
+
+
+
+
+
+.. c:struct:: nvme_uring_cmd
+
+ nvme uring command structure
+
+**Definition**
+
+::
+
+ struct nvme_uring_cmd {
+ __u8 opcode;
+ __u8 flags;
+ __u16 rsvd1;
+ __u32 nsid;
+ __u32 cdw2;
+ __u32 cdw3;
+ __u64 metadata;
+ __u64 addr;
+ __u32 metadata_len;
+ __u32 data_len;
+ __u32 cdw10;
+ __u32 cdw11;
+ __u32 cdw12;
+ __u32 cdw13;
+ __u32 cdw14;
+ __u32 cdw15;
+ __u32 timeout_ms;
+ __u32 rsvd2;
+ };
+
+**Members**
+
+``opcode``
+ Operation code, see :c:type:`enum nvme_io_opcodes <nvme_io_opcodes>` and :c:type:`enum nvme_admin_opcodes <nvme_admin_opcodes>`
+
+``flags``
+ Not supported: intended for command flags (eg: SGL, FUSE)
+
+``rsvd1``
+ Reserved for future use
+
+``nsid``
+ Namespace Identifier, or Fabrics type
+
+``cdw2``
+ Command Dword 2 (no spec defined use)
+
+``cdw3``
+ Command Dword 3 (no spec defined use)
+
+``metadata``
+ User space address to metadata buffer (NULL if not used)
+
+``addr``
+ User space address to data buffer (NULL if not used)
+
+``metadata_len``
+ Metadata buffer transfer length
+
+``data_len``
+ Data buffer transfer length
+
+``cdw10``
+ Command Dword 10 (command specific)
+
+``cdw11``
+ Command Dword 11 (command specific)
+
+``cdw12``
+ Command Dword 12 (command specific)
+
+``cdw13``
+ Command Dword 13 (command specific)
+
+``cdw14``
+ Command Dword 14 (command specific)
+
+``cdw15``
+ Command Dword 15 (command specific)
+
+``timeout_ms``
+ If non-zero, overrides system default timeout in milliseconds
+
+``rsvd2``
+ Reserved for future use (and fills an implicit struct pad
+
+
+
+.. c:macro:: sizeof_args
+
+``sizeof_args (type, member, align)``
+
+ Helper function used to determine structure sizes
+
+**Parameters**
+
+``type``
+ Argument structure type
+
+``member``
+ Member inside the type
+
+``align``
+ Alignment information
+
+
+.. c:function:: int nvme_submit_admin_passthru64 (int fd, struct nvme_passthru_cmd64 *cmd, __u64 *result)
+
+ Submit a 64-bit nvme passthrough admin command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_passthru_cmd64 *cmd``
+ The nvme admin command to send
+
+``__u64 *result``
+ Optional field to return the result from the CQE DW0-1
+
+**Description**
+
+Uses NVME_IOCTL_ADMIN64_CMD for the ioctl request.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_admin_passthru64 (int fd, __u8 opcode, __u8 flags, __u16 rsvd, __u32 nsid, __u32 cdw2, __u32 cdw3, __u32 cdw10, __u32 cdw11, __u32 cdw12, __u32 cdw13, __u32 cdw14, __u32 cdw15, __u32 data_len, void *data, __u32 metadata_len, void *metadata, __u32 timeout_ms, __u64 *result)
+
+ Submit a 64-bit nvme passthrough command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 opcode``
+ The nvme io command to send
+
+``__u8 flags``
+ NVMe command flags (not used)
+
+``__u16 rsvd``
+ Reserved for future use
+
+``__u32 nsid``
+ Namespace identifier
+
+``__u32 cdw2``
+ Command dword 2
+
+``__u32 cdw3``
+ Command dword 3
+
+``__u32 cdw10``
+ Command dword 10
+
+``__u32 cdw11``
+ Command dword 11
+
+``__u32 cdw12``
+ Command dword 12
+
+``__u32 cdw13``
+ Command dword 13
+
+``__u32 cdw14``
+ Command dword 14
+
+``__u32 cdw15``
+ Command dword 15
+
+``__u32 data_len``
+ Length of the data transferred in this command in bytes
+
+``void *data``
+ Pointer to user address of the data buffer
+
+``__u32 metadata_len``
+ Length of metadata transferred in this command
+
+``void *metadata``
+ Pointer to user address of the metadata buffer
+
+``__u32 timeout_ms``
+ How long the kernel waits for the command to complete
+
+``__u64 *result``
+ Optional field to return the result from the CQE dword 0
+
+**Description**
+
+Parameterized form of nvme_submit_admin_passthru64(). This sets up and
+submits a :c:type:`struct nvme_passthru_cmd64 <nvme_passthru_cmd64>`.
+
+Known values for **opcode** are defined in :c:type:`enum nvme_admin_opcode <nvme_admin_opcode>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_submit_admin_passthru (int fd, struct nvme_passthru_cmd *cmd, __u32 *result)
+
+ Submit an nvme passthrough admin command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_passthru_cmd *cmd``
+ The nvme admin command to send
+
+``__u32 *result``
+ Optional field to return the result from the CQE DW0
+
+**Description**
+
+Uses NVME_IOCTL_ADMIN_CMD for the ioctl request.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_admin_passthru (int fd, __u8 opcode, __u8 flags, __u16 rsvd, __u32 nsid, __u32 cdw2, __u32 cdw3, __u32 cdw10, __u32 cdw11, __u32 cdw12, __u32 cdw13, __u32 cdw14, __u32 cdw15, __u32 data_len, void *data, __u32 metadata_len, void *metadata, __u32 timeout_ms, __u32 *result)
+
+ Submit an nvme passthrough command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 opcode``
+ The nvme io command to send
+
+``__u8 flags``
+ NVMe command flags (not used)
+
+``__u16 rsvd``
+ Reserved for future use
+
+``__u32 nsid``
+ Namespace identifier
+
+``__u32 cdw2``
+ Command dword 2
+
+``__u32 cdw3``
+ Command dword 3
+
+``__u32 cdw10``
+ Command dword 10
+
+``__u32 cdw11``
+ Command dword 11
+
+``__u32 cdw12``
+ Command dword 12
+
+``__u32 cdw13``
+ Command dword 13
+
+``__u32 cdw14``
+ Command dword 14
+
+``__u32 cdw15``
+ Command dword 15
+
+``__u32 data_len``
+ Length of the data transferred in this command in bytes
+
+``void *data``
+ Pointer to user address of the data buffer
+
+``__u32 metadata_len``
+ Length of metadata transferred in this command
+
+``void *metadata``
+ Pointer to user address of the metadata buffer
+
+``__u32 timeout_ms``
+ How long the kernel waits for the command to complete
+
+``__u32 *result``
+ Optional field to return the result from the CQE dword 0
+
+**Description**
+
+Parameterized form of nvme_submit_admin_passthru(). This sets up and
+submits a :c:type:`struct nvme_passthru_cmd <nvme_passthru_cmd>`.
+
+Known values for **opcode** are defined in :c:type:`enum nvme_admin_opcode <nvme_admin_opcode>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_submit_io_passthru64 (int fd, struct nvme_passthru_cmd64 *cmd, __u64 *result)
+
+ Submit a 64-bit nvme passthrough command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_passthru_cmd64 *cmd``
+ The nvme io command to send
+
+``__u64 *result``
+ Optional field to return the result from the CQE DW0-1
+
+**Description**
+
+Uses NVME_IOCTL_IO64_CMD for the ioctl request.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_io_passthru64 (int fd, __u8 opcode, __u8 flags, __u16 rsvd, __u32 nsid, __u32 cdw2, __u32 cdw3, __u32 cdw10, __u32 cdw11, __u32 cdw12, __u32 cdw13, __u32 cdw14, __u32 cdw15, __u32 data_len, void *data, __u32 metadata_len, void *metadata, __u32 timeout_ms, __u64 *result)
+
+ Submit an nvme io passthrough command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 opcode``
+ The nvme io command to send
+
+``__u8 flags``
+ NVMe command flags (not used)
+
+``__u16 rsvd``
+ Reserved for future use
+
+``__u32 nsid``
+ Namespace identifier
+
+``__u32 cdw2``
+ Command dword 2
+
+``__u32 cdw3``
+ Command dword 3
+
+``__u32 cdw10``
+ Command dword 10
+
+``__u32 cdw11``
+ Command dword 11
+
+``__u32 cdw12``
+ Command dword 12
+
+``__u32 cdw13``
+ Command dword 13
+
+``__u32 cdw14``
+ Command dword 14
+
+``__u32 cdw15``
+ Command dword 15
+
+``__u32 data_len``
+ Length of the data transferred in this command in bytes
+
+``void *data``
+ Pointer to user address of the data buffer
+
+``__u32 metadata_len``
+ Length of metadata transferred in this command
+
+``void *metadata``
+ Pointer to user address of the metadata buffer
+
+``__u32 timeout_ms``
+ How long the kernel waits for the command to complete
+
+``__u64 *result``
+ Optional field to return the result from the CQE dword 0
+
+**Description**
+
+Parameterized form of nvme_submit_io_passthru64(). This sets up and submits
+a :c:type:`struct nvme_passthru_cmd64 <nvme_passthru_cmd64>`.
+
+Known values for **opcode** are defined in :c:type:`enum nvme_io_opcode <nvme_io_opcode>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_submit_io_passthru (int fd, struct nvme_passthru_cmd *cmd, __u32 *result)
+
+ Submit an nvme passthrough command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_passthru_cmd *cmd``
+ The nvme io command to send
+
+``__u32 *result``
+ Optional field to return the result from the CQE DW0
+
+**Description**
+
+Uses NVME_IOCTL_IO_CMD for the ioctl request.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_io_passthru (int fd, __u8 opcode, __u8 flags, __u16 rsvd, __u32 nsid, __u32 cdw2, __u32 cdw3, __u32 cdw10, __u32 cdw11, __u32 cdw12, __u32 cdw13, __u32 cdw14, __u32 cdw15, __u32 data_len, void *data, __u32 metadata_len, void *metadata, __u32 timeout_ms, __u32 *result)
+
+ Submit an nvme io passthrough command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 opcode``
+ The nvme io command to send
+
+``__u8 flags``
+ NVMe command flags (not used)
+
+``__u16 rsvd``
+ Reserved for future use
+
+``__u32 nsid``
+ Namespace identifier
+
+``__u32 cdw2``
+ Command dword 2
+
+``__u32 cdw3``
+ Command dword 3
+
+``__u32 cdw10``
+ Command dword 10
+
+``__u32 cdw11``
+ Command dword 11
+
+``__u32 cdw12``
+ Command dword 12
+
+``__u32 cdw13``
+ Command dword 13
+
+``__u32 cdw14``
+ Command dword 14
+
+``__u32 cdw15``
+ Command dword 15
+
+``__u32 data_len``
+ Length of the data transferred in this command in bytes
+
+``void *data``
+ Pointer to user address of the data buffer
+
+``__u32 metadata_len``
+ Length of metadata transferred in this command
+
+``void *metadata``
+ Pointer to user address of the metadata buffer
+
+``__u32 timeout_ms``
+ How long the kernel waits for the command to complete
+
+``__u32 *result``
+ Optional field to return the result from the CQE dword 0
+
+**Description**
+
+Parameterized form of nvme_submit_io_passthru(). This sets up and submits
+a :c:type:`struct nvme_passthru_cmd <nvme_passthru_cmd>`.
+
+Known values for **opcode** are defined in :c:type:`enum nvme_io_opcode <nvme_io_opcode>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_subsystem_reset (int fd)
+
+ Initiate a subsystem reset
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+**Description**
+
+This should only be sent to controller handles, not to namespaces.
+
+**Return**
+
+Zero if a subsystem reset was initiated or -1 with errno set
+otherwise.
+
+
+.. c:function:: int nvme_ctrl_reset (int fd)
+
+ Initiate a controller reset
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+**Description**
+
+This should only be sent to controller handles, not to namespaces.
+
+**Return**
+
+0 if a reset was initiated or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_ns_rescan (int fd)
+
+ Initiate a controller rescan
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+**Description**
+
+This should only be sent to controller handles, not to namespaces.
+
+**Return**
+
+0 if a rescan was initiated or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_nsid (int fd, __u32 *nsid)
+
+ Retrieve the NSID from a namespace file descriptor
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme namespace
+
+``__u32 *nsid``
+ User pointer to namespace id
+
+**Description**
+
+This should only be sent to namespace handles, not to controllers. The
+kernel's interface returns the nsid as the return value. This is unfortunate
+for many architectures that are incapable of allowing distinguishing a
+namespace id > 0x80000000 from a negative error number.
+
+**Return**
+
+0 if **nsid** was set successfully or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify (struct nvme_identify_args *args)
+
+ Send the NVMe Identify command
+
+**Parameters**
+
+``struct nvme_identify_args *args``
+ :c:type:`struct nvme_identify_args <nvme_identify_args>` argument structure
+
+**Description**
+
+The Identify command returns a data buffer that describes information about
+the NVM subsystem, the controller or the namespace(s).
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_ctrl (int fd, struct nvme_id_ctrl *id)
+
+ Retrieves nvme identify controller
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_id_ctrl *id``
+ User space destination address to transfer the data,
+
+**Description**
+
+Sends nvme identify with CNS value ``NVME_IDENTIFY_CNS_CTRL``.
+
+See :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>` for details on the data returned.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_ns (int fd, __u32 nsid, struct nvme_id_ns *ns)
+
+ Retrieves nvme identify namespace
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace to identify
+
+``struct nvme_id_ns *ns``
+ User space destination address to transfer the data
+
+**Description**
+
+If the Namespace Identifier (NSID) field specifies an active NSID, then the
+Identify Namespace data structure is returned to the host for that specified
+namespace.
+
+If the controller supports the Namespace Management capability and the NSID
+field is set to ``NVME_NSID_ALL``, then the controller returns an Identify Namespace
+data structure that specifies capabilities that are common across namespaces
+for this controller.
+
+See :c:type:`struct nvme_id_ns <nvme_id_ns>` for details on the structure returned.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_allocated_ns (int fd, __u32 nsid, struct nvme_id_ns *ns)
+
+ Same as nvme_identify_ns, but only for allocated namespaces
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace to identify
+
+``struct nvme_id_ns *ns``
+ User space destination address to transfer the data
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_active_ns_list (int fd, __u32 nsid, struct nvme_ns_list *list)
+
+ Retrieves active namespaces id list
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Return namespaces greater than this identifier
+
+``struct nvme_ns_list *list``
+ User space destination address to transfer the data
+
+**Description**
+
+A list of 1024 namespace IDs is returned to the host containing NSIDs in
+increasing order that are greater than the value specified in the Namespace
+Identifier (nsid) field of the command.
+
+See :c:type:`struct nvme_ns_list <nvme_ns_list>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_allocated_ns_list (int fd, __u32 nsid, struct nvme_ns_list *list)
+
+ Retrieves allocated namespace id list
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Return namespaces greater than this identifier
+
+``struct nvme_ns_list *list``
+ User space destination address to transfer the data
+
+**Description**
+
+A list of 1024 namespace IDs is returned to the host containing NSIDs in
+increasing order that are greater than the value specified in the Namespace
+Identifier (nsid) field of the command.
+
+See :c:type:`struct nvme_ns_list <nvme_ns_list>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_ctrl_list (int fd, __u16 cntid, struct nvme_ctrl_list *cntlist)
+
+ Retrieves identify controller list
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 cntid``
+ Starting CNTLID to return in the list
+
+``struct nvme_ctrl_list *cntlist``
+ User space destination address to transfer the data
+
+**Description**
+
+Up to 2047 controller identifiers is returned containing a controller
+identifier greater than or equal to the controller identifier specified in
+**cntid**.
+
+See :c:type:`struct nvme_ctrl_list <nvme_ctrl_list>` for a definition of the structure returned.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_nsid_ctrl_list (int fd, __u32 nsid, __u16 cntid, struct nvme_ctrl_list *cntlist)
+
+ Retrieves controller list attached to an nsid
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Return controllers that are attached to this nsid
+
+``__u16 cntid``
+ Starting CNTLID to return in the list
+
+``struct nvme_ctrl_list *cntlist``
+ User space destination address to transfer the data
+
+**Description**
+
+Up to 2047 controller identifiers are returned containing a controller
+identifier greater than or equal to the controller identifier specified in
+**cntid** attached to **nsid**.
+
+See :c:type:`struct nvme_ctrl_list <nvme_ctrl_list>` for a definition of the structure returned.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1
+
+
+.. c:function:: int nvme_identify_ns_descs (int fd, __u32 nsid, struct nvme_ns_id_desc *descs)
+
+ Retrieves namespace descriptor list
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ The namespace id to retrieve descriptors
+
+``struct nvme_ns_id_desc *descs``
+ User space destination address to transfer the data
+
+**Description**
+
+A list of Namespace Identification Descriptor structures is returned to the
+host for the namespace specified in the Namespace Identifier (NSID) field if
+it is an active NSID.
+
+The data returned is in the form of an array of 'struct nvme_ns_id_desc'.
+
+See :c:type:`struct nvme_ns_id_desc <nvme_ns_id_desc>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_nvmset_list (int fd, __u16 nvmsetid, struct nvme_id_nvmset_list *nvmset)
+
+ Retrieves NVM Set List
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 nvmsetid``
+ NVM Set Identifier
+
+``struct nvme_id_nvmset_list *nvmset``
+ User space destination address to transfer the data
+
+**Description**
+
+Retrieves an NVM Set List, :c:type:`struct nvme_id_nvmset_list <nvme_id_nvmset_list>`. The data structure
+is an ordered list by NVM Set Identifier, starting with the first NVM Set
+Identifier supported by the NVM subsystem that is equal to or greater than
+the NVM Set Identifier.
+
+See :c:type:`struct nvme_id_nvmset_list <nvme_id_nvmset_list>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_primary_ctrl (int fd, __u16 cntid, struct nvme_primary_ctrl_cap *cap)
+
+ Retrieve NVMe Primary Controller identification
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 cntid``
+ Return controllers starting at this identifier
+
+``struct nvme_primary_ctrl_cap *cap``
+ User space destination buffer address to transfer the data
+
+**Description**
+
+See :c:type:`struct nvme_primary_ctrl_cap <nvme_primary_ctrl_cap>` for the definition of the returned structure, **cap**.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_secondary_ctrl_list (int fd, __u32 nsid, __u16 cntid, struct nvme_secondary_ctrl_list *sc_list)
+
+ Retrieves secondary controller list
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace identifier
+
+``__u16 cntid``
+ Return controllers starting at this identifier
+
+``struct nvme_secondary_ctrl_list *sc_list``
+ User space destination address to transfer the data
+
+**Description**
+
+A Secondary Controller List is returned to the host for up to 127 secondary
+controllers associated with the primary controller processing this command.
+The list contains entries for controller identifiers greater than or equal
+to the value specified in the Controller Identifier (cntid).
+
+See :c:type:`struct nvme_secondary_ctrls_list <nvme_secondary_ctrls_list>` for a definition of the returned
+structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_ns_granularity (int fd, struct nvme_id_ns_granularity_list *gr_list)
+
+ Retrieves namespace granularity identification
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_id_ns_granularity_list *gr_list``
+ User space destination address to transfer the data
+
+**Description**
+
+If the controller supports reporting of Namespace Granularity, then a
+Namespace Granularity List is returned to the host for up to sixteen
+namespace granularity descriptors
+
+See :c:type:`struct nvme_id_ns_granularity_list <nvme_id_ns_granularity_list>` for the definition of the returned
+structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_uuid (int fd, struct nvme_id_uuid_list *uuid_list)
+
+ Retrieves device's UUIDs
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_id_uuid_list *uuid_list``
+ User space destination address to transfer the data
+
+**Description**
+
+Each UUID List entry is either 0h, the NVMe Invalid UUID, or a valid UUID.
+Valid UUIDs are those which are non-zero and are not the NVMe Invalid UUID.
+
+See :c:type:`struct nvme_id_uuid_list <nvme_id_uuid_list>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_ns_csi (int fd, __u32 nsid, __u8 uuidx, enum nvme_csi csi, void *data)
+
+ I/O command set specific identify namespace data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace to identify
+
+``__u8 uuidx``
+ UUID Index for differentiating vendor specific encoding
+
+``enum nvme_csi csi``
+ Command Set Identifier
+
+``void *data``
+ User space destination address to transfer the data
+
+**Description**
+
+An I/O Command Set specific Identify Namespace data structure is returned
+for the namespace specified in **nsid**.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_ctrl_csi (int fd, enum nvme_csi csi, void *data)
+
+ I/O command set specific Identify Controller data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_csi csi``
+ Command Set Identifier
+
+``void *data``
+ User space destination address to transfer the data
+
+**Description**
+
+An I/O Command Set specific Identify Controller data structure is returned
+to the host for the controller processing the command. The specific Identify
+Controller data structure to be returned is specified by **csi**.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_active_ns_list_csi (int fd, __u32 nsid, enum nvme_csi csi, struct nvme_ns_list *ns_list)
+
+ Active namespace ID list associated with a specified I/O command set
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Return namespaces greater than this identifier
+
+``enum nvme_csi csi``
+ Command Set Identifier
+
+``struct nvme_ns_list *ns_list``
+ User space destination address to transfer the data
+
+**Description**
+
+A list of 1024 namespace IDs is returned to the host containing active
+NSIDs in increasing order that are greater than the value specified in
+the Namespace Identifier (nsid) field of the command and matching the
+I/O Command Set specified in the **csi** argument.
+
+See :c:type:`struct nvme_ns_list <nvme_ns_list>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_allocated_ns_list_csi (int fd, __u32 nsid, enum nvme_csi csi, struct nvme_ns_list *ns_list)
+
+ Allocated namespace ID list associated with a specified I/O command set
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Return namespaces greater than this identifier
+
+``enum nvme_csi csi``
+ Command Set Identifier
+
+``struct nvme_ns_list *ns_list``
+ User space destination address to transfer the data
+
+**Description**
+
+A list of 1024 namespace IDs is returned to the host containing allocated
+NSIDs in increasing order that are greater than the value specified in
+the **nsid** field of the command and matching the I/O Command Set
+specified in the **csi** argument.
+
+See :c:type:`struct nvme_ns_list <nvme_ns_list>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_independent_identify_ns (int fd, __u32 nsid, struct nvme_id_independent_id_ns *ns)
+
+ I/O command set independent Identify namespace data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Return namespaces greater than this identifier
+
+``struct nvme_id_independent_id_ns *ns``
+ I/O Command Set Independent Identify Namespace data
+ structure
+
+**Description**
+
+The I/O command set independent Identify namespace data structure for
+the namespace identified with **ns** is returned to the host.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_ns_csi_user_data_format (int fd, __u16 user_data_format, __u8 uuidx, enum nvme_csi csi, void *data)
+
+ Identify namespace user data format
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 user_data_format``
+ Return namespaces capability of identifier
+
+``__u8 uuidx``
+ UUID selection, if supported
+
+``enum nvme_csi csi``
+ Command Set Identifier
+
+``void *data``
+ User space destination address to transfer the data
+
+**Description**
+
+Identify Namespace data structure for the specified User Data Format
+index containing the namespace capabilities for the NVM Command Set.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_iocs_ns_csi_user_data_format (int fd, __u16 user_data_format, __u8 uuidx, enum nvme_csi csi, void *data)
+
+ Identify I/O command set namespace data structure
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 user_data_format``
+ Return namespaces capability of identifier
+
+``__u8 uuidx``
+ UUID selection, if supported
+
+``enum nvme_csi csi``
+ Command Set Identifier
+
+``void *data``
+ User space destination address to transfer the data
+
+**Description**
+
+I/O Command Set specific Identify Namespace data structure for
+the specified User Data Format index containing the namespace
+capabilities for the I/O Command Set specified in the CSI field.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_nvm_identify_ctrl (int fd, struct nvme_id_ctrl_nvm *id)
+
+ Identify controller data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_id_ctrl_nvm *id``
+ User space destination address to transfer the data
+
+**Description**
+
+Return an identify controller data structure to the host of
+processing controller.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_domain_list (int fd, __u16 domid, struct nvme_id_domain_list *list)
+
+ Domain list data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 domid``
+ Domain ID
+
+``struct nvme_id_domain_list *list``
+ User space destination address to transfer data
+
+**Description**
+
+A list of 31 domain IDs is returned to the host containing domain
+attributes in increasing order that are greater than the value
+specified in the **domid** field.
+
+See :c:type:`struct nvme_identify_domain_attr <nvme_identify_domain_attr>` for the definition of the
+returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_endurance_group_list (int fd, __u16 endgrp_id, struct nvme_id_endurance_group_list *list)
+
+ Endurance group list data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 endgrp_id``
+ Endurance group identifier
+
+``struct nvme_id_endurance_group_list *list``
+ Array of endurance group identifiers
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_iocs (int fd, __u16 cntlid, struct nvme_id_iocs *iocs)
+
+ I/O command set data structure
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 cntlid``
+ Controller ID
+
+``struct nvme_id_iocs *iocs``
+ User space destination address to transfer the data
+
+**Description**
+
+Retrieves list of the controller's supported io command set vectors. See
+:c:type:`struct nvme_id_iocs <nvme_id_iocs>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_zns_identify_ns (int fd, __u32 nsid, struct nvme_zns_id_ns *data)
+
+ ZNS identify namespace data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace to identify
+
+``struct nvme_zns_id_ns *data``
+ User space destination address to transfer the data
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_zns_identify_ctrl (int fd, struct nvme_zns_id_ctrl *id)
+
+ ZNS identify controller data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_zns_id_ctrl *id``
+ User space destination address to transfer the data
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log (struct nvme_get_log_args *args)
+
+ NVMe Admin Get Log command
+
+**Parameters**
+
+``struct nvme_get_log_args *args``
+ :c:type:`struct nvme_get_log_args <nvme_get_log_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_page (int fd, __u32 xfer_len, struct nvme_get_log_args *args)
+
+ Get log page data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 xfer_len``
+ Max log transfer size per request to split the total.
+
+``struct nvme_get_log_args *args``
+ :c:type:`struct nvme_get_log_args <nvme_get_log_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_supported_log_pages (int fd, bool rae, struct nvme_supported_log_pages *log)
+
+ Retrieve nmve supported log pages
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_supported_log_pages *log``
+ Array of LID supported and Effects data structures
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_error (int fd, unsigned int nr_entries, bool rae, struct nvme_error_log_page *err_log)
+
+ Retrieve nvme error log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``unsigned int nr_entries``
+ Number of error log entries allocated
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_error_log_page *err_log``
+ Array of error logs of size 'entries'
+
+**Description**
+
+This log page describes extended error information for a command that
+completed with error, or may report an error that is not specific to a
+particular command.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_smart (int fd, __u32 nsid, bool rae, struct nvme_smart_log *smart_log)
+
+ Retrieve nvme smart log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Optional namespace identifier
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_smart_log *smart_log``
+ User address to store the smart log
+
+**Description**
+
+This log page provides SMART and general health information. The information
+provided is over the life of the controller and is retained across power
+cycles. To request the controller log page, the namespace identifier
+specified is FFFFFFFFh. The controller may also support requesting the log
+page on a per namespace basis, as indicated by bit 0 of the LPA field in the
+Identify Controller data structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_fw_slot (int fd, bool rae, struct nvme_firmware_slot *fw_log)
+
+ Retrieves the controller firmware log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_firmware_slot *fw_log``
+ User address to store the log page
+
+**Description**
+
+This log page describes the firmware revision stored in each firmware slot
+supported. The firmware revision is indicated as an ASCII string. The log
+page also indicates the active slot number.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_changed_ns_list (int fd, bool rae, struct nvme_ns_list *ns_log)
+
+ Retrieve namespace changed list
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_ns_list *ns_log``
+ User address to store the log page
+
+**Description**
+
+This log page describes namespaces attached to this controller that have
+changed since the last time the namespace was identified, been added, or
+deleted.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_cmd_effects (int fd, enum nvme_csi csi, struct nvme_cmd_effects_log *effects_log)
+
+ Retrieve nvme command effects log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_csi csi``
+ Command Set Identifier
+
+``struct nvme_cmd_effects_log *effects_log``
+ User address to store the effects log
+
+**Description**
+
+This log page describes the commands that the controller supports and the
+effects of those commands on the state of the NVM subsystem.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_device_self_test (int fd, struct nvme_self_test_log *log)
+
+ Retrieve the device self test log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_self_test_log *log``
+ Userspace address of the log payload
+
+**Description**
+
+The log page indicates the status of an in progress self test and the
+percent complete of that operation, and the results of the previous 20
+self-test operations.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_create_telemetry_host (int fd, struct nvme_telemetry_log *log)
+
+ Create host telemetry log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_telemetry_log *log``
+ Userspace address of the log payload
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_telemetry_host (int fd, __u64 offset, __u32 len, void *log)
+
+ Get Telemetry Host-Initiated log page
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u64 offset``
+ Offset into the telemetry data
+
+``__u32 len``
+ Length of provided user buffer to hold the log data in bytes
+
+``void *log``
+ User address for log page data
+
+**Description**
+
+Retrieves the Telemetry Host-Initiated log page at the requested offset
+using the previously existing capture.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_telemetry_ctrl (int fd, bool rae, __u64 offset, __u32 len, void *log)
+
+ Get Telemetry Controller-Initiated log page
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``__u64 offset``
+ Offset into the telemetry data
+
+``__u32 len``
+ Length of provided user buffer to hold the log data in bytes
+
+``void *log``
+ User address for log page data
+
+**Description**
+
+Retrieves the Telemetry Controller-Initiated log page at the requested offset
+using the previously existing capture.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_endurance_group (int fd, __u16 endgid, struct nvme_endurance_group_log *log)
+
+ Get Endurance Group log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 endgid``
+ Starting group identifier to return in the list
+
+``struct nvme_endurance_group_log *log``
+ User address to store the endurance log
+
+**Description**
+
+This log page indicates if an Endurance Group Event has occurred for a
+particular Endurance Group. If an Endurance Group Event has occurred, the
+details of the particular event are included in the Endurance Group
+Information log page for that Endurance Group. An asynchronous event is
+generated when an entry for an Endurance Group is newly added to this log
+page.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_predictable_lat_nvmset (int fd, __u16 nvmsetid, struct nvme_nvmset_predictable_lat_log *log)
+
+ Predictable Latency Per NVM Set
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 nvmsetid``
+ NVM set id
+
+``struct nvme_nvmset_predictable_lat_log *log``
+ User address to store the predictable latency log
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_predictable_lat_event (int fd, bool rae, __u32 offset, __u32 len, void *log)
+
+ Retrieve Predictable Latency Event Aggregate Log Page
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``__u32 offset``
+ Offset into the predictable latency event
+
+``__u32 len``
+ Length of provided user buffer to hold the log data in bytes
+
+``void *log``
+ User address for log page data
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_fdp_configurations (int fd, __u16 egid, __u32 offset, __u32 len, void *log)
+
+ Get list of Flexible Data Placement configurations
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 egid``
+ Endurance group identifier
+
+``__u32 offset``
+ Offset into log page
+
+``__u32 len``
+ Length (in bytes) of provided user buffer to hold the log data
+
+``void *log``
+ Log page data buffer
+
+
+.. c:function:: int nvme_get_log_reclaim_unit_handle_usage (int fd, __u16 egid, __u32 offset, __u32 len, void *log)
+
+ Get reclaim unit handle usage
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 egid``
+ Endurance group identifier
+
+``__u32 offset``
+ Offset into log page
+
+``__u32 len``
+ Length (in bytes) of provided user buffer to hold the log data
+
+``void *log``
+ Log page data buffer
+
+
+.. c:function:: int nvme_get_log_fdp_stats (int fd, __u16 egid, __u32 offset, __u32 len, void *log)
+
+ Get Flexible Data Placement statistics
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 egid``
+ Endurance group identifier
+
+``__u32 offset``
+ Offset into log page
+
+``__u32 len``
+ Length (in bytes) of provided user buffer to hold the log data
+
+``void *log``
+ Log page data buffer
+
+
+.. c:function:: int nvme_get_log_fdp_events (int fd, __u16 egid, bool host_events, __u32 offset, __u32 len, void *log)
+
+ Get Flexible Data Placement events
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 egid``
+ Endurance group identifier
+
+``bool host_events``
+ Whether to report host or controller events
+
+``__u32 offset``
+ Offset into log page
+
+``__u32 len``
+ Length (in bytes) of provided user buffer to hold the log data
+
+``void *log``
+ Log page data buffer
+
+
+.. c:function:: int nvme_get_log_ana (int fd, enum nvme_log_ana_lsp lsp, bool rae, __u64 offset, __u32 len, void *log)
+
+ Retrieve Asymmetric Namespace Access log page
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_log_ana_lsp lsp``
+ Log specific, see :c:type:`enum nvme_get_log_ana_lsp <nvme_get_log_ana_lsp>`
+
+``bool rae``
+ Retain asynchronous events
+
+``__u64 offset``
+ Offset to the start of the log page
+
+``__u32 len``
+ The allocated length of the log page
+
+``void *log``
+ User address to store the ana log
+
+**Description**
+
+This log consists of a header describing the log and descriptors containing
+the asymmetric namespace access information for ANA Groups that contain
+namespaces that are attached to the controller processing the command.
+
+See :c:type:`struct nvme_ana_rsp_hdr <nvme_ana_rsp_hdr>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_ana_groups (int fd, bool rae, __u32 len, struct nvme_ana_group_desc *log)
+
+ Retrieve Asymmetric Namespace Access groups only log page
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``__u32 len``
+ The allocated length of the log page
+
+``struct nvme_ana_group_desc *log``
+ User address to store the ana group log
+
+**Description**
+
+See :c:type:`struct nvme_ana_group_desc <nvme_ana_group_desc>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_lba_status (int fd, bool rae, __u64 offset, __u32 len, void *log)
+
+ Retrieve LBA Status
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``__u64 offset``
+ Offset to the start of the log page
+
+``__u32 len``
+ The allocated length of the log page
+
+``void *log``
+ User address to store the log page
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_endurance_grp_evt (int fd, bool rae, __u32 offset, __u32 len, void *log)
+
+ Retrieve Rotational Media Information
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``__u32 offset``
+ Offset to the start of the log page
+
+``__u32 len``
+ The allocated length of the log page
+
+``void *log``
+ User address to store the log page
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_fid_supported_effects (int fd, bool rae, struct nvme_fid_supported_effects_log *log)
+
+ Retrieve Feature Identifiers Supported and Effects
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_fid_supported_effects_log *log``
+ FID Supported and Effects data structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise
+
+
+.. c:function:: int nvme_get_log_mi_cmd_supported_effects (int fd, bool rae, struct nvme_mi_cmd_supported_effects_log *log)
+
+ displays the MI Commands Supported by the controller
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_mi_cmd_supported_effects_log *log``
+ MI Command Supported and Effects data structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise
+
+
+.. c:function:: int nvme_get_log_boot_partition (int fd, bool rae, __u8 lsp, __u32 len, struct nvme_boot_partition *part)
+
+ Retrieve Boot Partition
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``__u8 lsp``
+ The log specified field of LID
+
+``__u32 len``
+ The allocated size, minimum
+ struct nvme_boot_partition
+
+``struct nvme_boot_partition *part``
+ User address to store the log page
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise
+
+
+.. c:function:: int nvme_get_log_discovery (int fd, bool rae, __u32 offset, __u32 len, void *log)
+
+ Retrieve Discovery log page
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``__u32 offset``
+ Offset of this log to retrieve
+
+``__u32 len``
+ The allocated size for this portion of the log
+
+``void *log``
+ User address to store the discovery log
+
+**Description**
+
+Supported only by fabrics discovery controllers, returning discovery
+records.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_media_unit_stat (int fd, __u16 domid, struct nvme_media_unit_stat_log *mus)
+
+ Retrieve Media Unit Status
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 domid``
+ Domain Identifier selection, if supported
+
+``struct nvme_media_unit_stat_log *mus``
+ User address to store the Media Unit statistics log
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise
+
+
+.. c:function:: int nvme_get_log_support_cap_config_list (int fd, __u16 domid, struct nvme_supported_cap_config_list_log *cap)
+
+ Retrieve Supported Capacity Configuration List
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 domid``
+ Domain Identifier selection, if supported
+
+``struct nvme_supported_cap_config_list_log *cap``
+ User address to store supported capabilities config list
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise
+
+
+.. c:function:: int nvme_get_log_reservation (int fd, bool rae, struct nvme_resv_notification_log *log)
+
+ Retrieve Reservation Notification
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_resv_notification_log *log``
+ User address to store the reservation log
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise
+
+
+.. c:function:: int nvme_get_log_sanitize (int fd, bool rae, struct nvme_sanitize_log_page *log)
+
+ Retrieve Sanitize Status
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_sanitize_log_page *log``
+ User address to store the sanitize log
+
+**Description**
+
+The Sanitize Status log page reports sanitize operation time estimates and
+information about the most recent sanitize operation.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_zns_changed_zones (int fd, __u32 nsid, bool rae, struct nvme_zns_changed_zone_log *log)
+
+ Retrieve list of zones that have changed
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_zns_changed_zone_log *log``
+ User address to store the changed zone log
+
+**Description**
+
+The list of zones that have changed state due to an exceptional event.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_persistent_event (int fd, enum nvme_pevent_log_action action, __u32 size, void *pevent_log)
+
+ Retrieve Persistent Event Log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_pevent_log_action action``
+ Action the controller should take during processing this command
+
+``__u32 size``
+ Size of **pevent_log**
+
+``void *pevent_log``
+ User address to store the persistent event log
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features (struct nvme_set_features_args *args)
+
+ Set a feature attribute
+
+**Parameters**
+
+``struct nvme_set_features_args *args``
+ :c:type:`struct nvme_set_features_args <nvme_set_features_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_data (int fd, __u8 fid, __u32 nsid, __u32 cdw11, bool save, __u32 data_len, void *data, __u32 *result)
+
+ Helper function for **nvme_set_features\(\)**
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 fid``
+ Feature identifier
+
+``__u32 nsid``
+ Namespace ID, if applicable
+
+``__u32 cdw11``
+ Value to set the feature to
+
+``bool save``
+ Save value across power states
+
+``__u32 data_len``
+ Length of feature data, if applicable, in bytes
+
+``void *data``
+ User address of feature data, if applicable
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_simple (int fd, __u8 fid, __u32 nsid, __u32 cdw11, bool save, __u32 *result)
+
+ Helper function for **nvme_set_features\(\)**
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 fid``
+ Feature identifier
+
+``__u32 nsid``
+ Namespace ID, if applicable
+
+``__u32 cdw11``
+ Value to set the feature to
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_arbitration (int fd, __u8 ab, __u8 lpw, __u8 mpw, __u8 hpw, bool save, __u32 *result)
+
+ Set arbitration features
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 ab``
+ Arbitration Burst
+
+``__u8 lpw``
+ Low Priority Weight
+
+``__u8 mpw``
+ Medium Priority Weight
+
+``__u8 hpw``
+ High Priority Weight
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_power_mgmt (int fd, __u8 ps, __u8 wh, bool save, __u32 *result)
+
+ Set power management feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 ps``
+ Power State
+
+``__u8 wh``
+ Workload Hint
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_lba_range (int fd, __u32 nsid, __u32 nr_ranges, bool save, struct nvme_lba_range_type *data, __u32 *result)
+
+ Set LBA range feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``__u32 nr_ranges``
+ Number of ranges in **data**
+
+``bool save``
+ Save value across power states
+
+``struct nvme_lba_range_type *data``
+ User address of feature data
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_temp_thresh (int fd, __u16 tmpth, __u8 tmpsel, enum nvme_feat_tmpthresh_thsel thsel, bool save, __u32 *result)
+
+ Set temperature threshold feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 tmpth``
+ Temperature Threshold
+
+``__u8 tmpsel``
+ Threshold Temperature Select
+
+``enum nvme_feat_tmpthresh_thsel thsel``
+ Threshold Type Select
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_err_recovery (int fd, __u32 nsid, __u16 tler, bool dulbe, bool save, __u32 *result)
+
+ Set error recovery feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``__u16 tler``
+ Time-limited error recovery value
+
+``bool dulbe``
+ Deallocated or Unwritten Logical Block Error Enable
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_volatile_wc (int fd, bool wce, bool save, __u32 *result)
+
+ Set volatile write cache feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool wce``
+ Write cache enable
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_irq_coalesce (int fd, __u8 thr, __u8 time, bool save, __u32 *result)
+
+ Set IRQ coalesce feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 thr``
+ Aggregation Threshold
+
+``__u8 time``
+ Aggregation Time
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_irq_config (int fd, __u16 iv, bool cd, bool save, __u32 *result)
+
+ Set IRQ config feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 iv``
+ Interrupt Vector
+
+``bool cd``
+ Coalescing Disable
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_write_atomic (int fd, bool dn, bool save, __u32 *result)
+
+ Set write atomic feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool dn``
+ Disable Normal
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_async_event (int fd, __u32 events, bool save, __u32 *result)
+
+ Set asynchronous event feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 events``
+ Events to enable
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_auto_pst (int fd, bool apste, bool save, struct nvme_feat_auto_pst *apst, __u32 *result)
+
+ Set autonomous power state feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool apste``
+ Autonomous Power State Transition Enable
+
+``bool save``
+ Save value across power states
+
+``struct nvme_feat_auto_pst *apst``
+ Autonomous Power State Transition
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_timestamp (int fd, bool save, __u64 timestamp)
+
+ Set timestamp feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool save``
+ Save value across power states
+
+``__u64 timestamp``
+ The current timestamp value to assign to this feature
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_hctm (int fd, __u16 tmt2, __u16 tmt1, bool save, __u32 *result)
+
+ Set thermal management feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 tmt2``
+ Thermal Management Temperature 2
+
+``__u16 tmt1``
+ Thermal Management Temperature 1
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_nopsc (int fd, bool noppme, bool save, __u32 *result)
+
+ Set non-operational power state feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool noppme``
+ Non-Operational Power State Permissive Mode Enable
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_rrl (int fd, __u8 rrl, __u16 nvmsetid, bool save, __u32 *result)
+
+ Set read recovery level feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 rrl``
+ Read recovery level setting
+
+``__u16 nvmsetid``
+ NVM set id
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_plm_config (int fd, bool enable, __u16 nvmsetid, bool save, struct nvme_plm_config *data, __u32 *result)
+
+ Set predictable latency feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool enable``
+ Predictable Latency Enable
+
+``__u16 nvmsetid``
+ NVM Set Identifier
+
+``bool save``
+ Save value across power states
+
+``struct nvme_plm_config *data``
+ Pointer to structure nvme_plm_config
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_plm_window (int fd, enum nvme_feat_plm_window_select sel, __u16 nvmsetid, bool save, __u32 *result)
+
+ Set window select feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_feat_plm_window_select sel``
+ Window Select
+
+``__u16 nvmsetid``
+ NVM Set Identifier
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_lba_sts_interval (int fd, __u16 lsiri, __u16 lsipi, bool save, __u32 *result)
+
+ Set LBA status information feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 lsiri``
+ LBA Status Information Report Interval
+
+``__u16 lsipi``
+ LBA Status Information Poll Interval
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_host_behavior (int fd, bool save, struct nvme_feat_host_behavior *data)
+
+ Set host behavior feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool save``
+ Save value across power states
+
+``struct nvme_feat_host_behavior *data``
+ Pointer to structure nvme_feat_host_behavior
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_sanitize (int fd, bool nodrm, bool save, __u32 *result)
+
+ Set sanitize feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool nodrm``
+ No-Deallocate Response Mode
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_endurance_evt_cfg (int fd, __u16 endgid, __u8 egwarn, bool save, __u32 *result)
+
+ Set endurance event config feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 endgid``
+ Endurance Group Identifier
+
+``__u8 egwarn``
+ Flags to enable warning, see :c:type:`enum nvme_eg_critical_warning_flags <nvme_eg_critical_warning_flags>`
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_sw_progress (int fd, __u8 pbslc, bool save, __u32 *result)
+
+ Set pre-boot software load count feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 pbslc``
+ Pre-boot Software Load Count
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_host_id (int fd, bool exhid, bool save, __u8 *hostid)
+
+ Set enable extended host identifiers feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool exhid``
+ Enable Extended Host Identifier
+
+``bool save``
+ Save value across power states
+
+``__u8 *hostid``
+ Host ID to set
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_resv_mask (int fd, __u32 mask, bool save, __u32 *result)
+
+ Set reservation notification mask feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 mask``
+ Reservation Notification Mask Field
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_resv_persist (int fd, bool ptpl, bool save, __u32 *result)
+
+ Set persist through power loss feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool ptpl``
+ Persist Through Power Loss
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_write_protect (int fd, enum nvme_feat_nswpcfg_state state, bool save, __u32 *result)
+
+ Set write protect feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_feat_nswpcfg_state state``
+ Write Protection State
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features (struct nvme_get_features_args *args)
+
+ Retrieve a feature attribute
+
+**Parameters**
+
+``struct nvme_get_features_args *args``
+ :c:type:`struct nvme_get_features_args <nvme_get_features_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_data (int fd, enum nvme_features_id fid, __u32 nsid, __u32 data_len, void *data, __u32 *result)
+
+ Helper function for **nvme_get_features\(\)**
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_features_id fid``
+ Feature identifier
+
+``__u32 nsid``
+ Namespace ID, if applicable
+
+``__u32 data_len``
+ Length of feature data, if applicable, in bytes
+
+``void *data``
+ User address of feature data, if applicable
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_simple (int fd, enum nvme_features_id fid, __u32 nsid, __u32 *result)
+
+ Helper function for **nvme_get_features\(\)**
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_features_id fid``
+ Feature identifier
+
+``__u32 nsid``
+ Namespace ID, if applicable
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_arbitration (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get arbitration feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_power_mgmt (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get power management feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_lba_range (int fd, enum nvme_get_features_sel sel, struct nvme_lba_range_type *data, __u32 *result)
+
+ Get LBA range feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``struct nvme_lba_range_type *data``
+ User address of feature data, if applicable
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_temp_thresh (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get temperature threshold feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_err_recovery (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get error recovery feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_volatile_wc (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get volatile write cache feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_num_queues (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get number of queues feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_irq_coalesce (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get IRQ coalesce feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_irq_config (int fd, enum nvme_get_features_sel sel, __u16 iv, __u32 *result)
+
+ Get IRQ config feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u16 iv``
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_write_atomic (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get write atomic feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_async_event (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get asynchronous event feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_auto_pst (int fd, enum nvme_get_features_sel sel, struct nvme_feat_auto_pst *apst, __u32 *result)
+
+ Get autonomous power state feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``struct nvme_feat_auto_pst *apst``
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_host_mem_buf (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get host memory buffer feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_timestamp (int fd, enum nvme_get_features_sel sel, struct nvme_timestamp *ts)
+
+ Get timestamp feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``struct nvme_timestamp *ts``
+ Current timestamp
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_kato (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get keep alive timeout feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_hctm (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get thermal management feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_nopsc (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get non-operational power state feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_rrl (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get read recovery level feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_plm_config (int fd, enum nvme_get_features_sel sel, __u16 nvmsetid, struct nvme_plm_config *data, __u32 *result)
+
+ Get predictable latency feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u16 nvmsetid``
+ NVM set id
+
+``struct nvme_plm_config *data``
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_plm_window (int fd, enum nvme_get_features_sel sel, __u16 nvmsetid, __u32 *result)
+
+ Get window select feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u16 nvmsetid``
+ NVM set id
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_lba_sts_interval (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get LBA status information feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_host_behavior (int fd, enum nvme_get_features_sel sel, struct nvme_feat_host_behavior *data, __u32 *result)
+
+ Get host behavior feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``struct nvme_feat_host_behavior *data``
+ Pointer to structure nvme_feat_host_behavior
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_sanitize (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get sanitize feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_endurance_event_cfg (int fd, enum nvme_get_features_sel sel, __u16 endgid, __u32 *result)
+
+ Get endurance event config feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u16 endgid``
+ Endurance Group Identifier
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_sw_progress (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get software progress feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_host_id (int fd, enum nvme_get_features_sel sel, bool exhid, __u32 len, __u8 *hostid)
+
+ Get host id feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``bool exhid``
+ Enable Extended Host Identifier
+
+``__u32 len``
+ Length of **hostid**
+
+``__u8 *hostid``
+ Buffer for returned host ID
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_resv_mask (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get reservation mask feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_resv_persist (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get reservation persist feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_write_protect (int fd, __u32 nsid, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get write protect feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_iocs_profile (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get IOCS profile feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_format_nvm (struct nvme_format_nvm_args *args)
+
+ Format nvme namespace(s)
+
+**Parameters**
+
+``struct nvme_format_nvm_args *args``
+ :c:type:`struct nvme_format_nvme_args <nvme_format_nvme_args>` argument structure
+
+**Description**
+
+The Format NVM command low level formats the NVM media. This command is used
+by the host to change the LBA data size and/or metadata size. A low level
+format may destroy all data and metadata associated with all namespaces or
+only the specific namespace associated with the command
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_ns_mgmt (struct nvme_ns_mgmt_args *args)
+
+ Issue a Namespace management command
+
+**Parameters**
+
+``struct nvme_ns_mgmt_args *args``
+ :c:type:`struct nvme_ns_mgmt_args <nvme_ns_mgmt_args>` Argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_ns_mgmt_create (int fd, struct nvme_id_ns *ns, __u32 *nsid, __u32 timeout, __u8 csi)
+
+ Create a non attached namespace
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_id_ns *ns``
+ Namespace identification that defines ns creation parameters
+
+``__u32 *nsid``
+ On success, set to the namespace id that was created
+
+``__u32 timeout``
+ Override the default timeout to this value in milliseconds;
+ set to 0 to use the system default.
+
+``__u8 csi``
+ Command Set Identifier
+
+**Description**
+
+On successful creation, the namespace exists in the subsystem, but is not
+attached to any controller. Use the nvme_ns_attach_ctrls() to assign the
+namespace to one or more controllers.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_ns_mgmt_delete (int fd, __u32 nsid)
+
+ Delete a non attached namespace
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace identifier to delete
+
+**Description**
+
+It is recommended that a namespace being deleted is not attached to any
+controller. Use the nvme_ns_detach_ctrls() first if the namespace is still
+attached.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_ns_attach (struct nvme_ns_attach_args *args)
+
+ Attach or detach namespace to controller(s)
+
+**Parameters**
+
+``struct nvme_ns_attach_args *args``
+ :c:type:`struct nvme_ns_attach_args <nvme_ns_attach_args>` Argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_ns_attach_ctrls (int fd, __u32 nsid, struct nvme_ctrl_list *ctrlist)
+
+ Attach namespace to controllers
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID to attach
+
+``struct nvme_ctrl_list *ctrlist``
+ Controller list to modify attachment state of nsid
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_ns_detach_ctrls (int fd, __u32 nsid, struct nvme_ctrl_list *ctrlist)
+
+ Detach namespace from controllers
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID to detach
+
+``struct nvme_ctrl_list *ctrlist``
+ Controller list to modify attachment state of nsid
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_fw_download (struct nvme_fw_download_args *args)
+
+ Download part or all of a firmware image to the controller
+
+**Parameters**
+
+``struct nvme_fw_download_args *args``
+ :c:type:`struct nvme_fw_download_args <nvme_fw_download_args>` argument structure
+
+**Description**
+
+The Firmware Image Download command downloads all or a portion of an image
+for a future update to the controller. The Firmware Image Download command
+downloads a new image (in whole or in part) to the controller.
+
+The image may be constructed of multiple pieces that are individually
+downloaded with separate Firmware Image Download commands. Each Firmware
+Image Download command includes a Dword Offset and Number of Dwords that
+specify a dword range.
+
+The new firmware image is not activated as part of the Firmware Image
+Download command. Use the nvme_fw_commit() to activate a newly downloaded
+image.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_fw_commit (struct nvme_fw_commit_args *args)
+
+ Commit firmware using the specified action
+
+**Parameters**
+
+``struct nvme_fw_commit_args *args``
+ :c:type:`struct nvme_fw_commit_args <nvme_fw_commit_args>` argument structure
+
+**Description**
+
+The Firmware Commit command modifies the firmware image or Boot Partitions.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise. The command
+status response may specify additional reset actions required to complete
+the commit process.
+
+
+.. c:function:: int nvme_security_send (struct nvme_security_send_args *args)
+
+ Security Send command
+
+**Parameters**
+
+``struct nvme_security_send_args *args``
+ :c:type:`struct nvme_security_send <nvme_security_send>` argument structure
+
+**Description**
+
+The Security Send command transfers security protocol data to the
+controller. The data structure transferred to the controller as part of this
+command contains security protocol specific commands to be performed by the
+controller. The data structure transferred may also contain data or
+parameters associated with the security protocol commands.
+
+The security data is protocol specific and is not defined by the NVMe
+specification.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_security_receive (struct nvme_security_receive_args *args)
+
+ Security Receive command
+
+**Parameters**
+
+``struct nvme_security_receive_args *args``
+ :c:type:`struct nvme_security_receive <nvme_security_receive>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_lba_status (struct nvme_get_lba_status_args *args)
+
+ Retrieve information on possibly unrecoverable LBAs
+
+**Parameters**
+
+``struct nvme_get_lba_status_args *args``
+ :c:type:`struct nvme_get_lba_status_args <nvme_get_lba_status_args>` argument structure
+
+**Description**
+
+The Get LBA Status command requests information about Potentially
+Unrecoverable LBAs. Refer to the specification for action type descriptions.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_send (struct nvme_directive_send_args *args)
+
+ Send directive command
+
+**Parameters**
+
+``struct nvme_directive_send_args *args``
+ :c:type:`struct nvme_directive_send_args <nvme_directive_send_args>` argument structure
+
+**Description**
+
+Directives is a mechanism to enable host and NVM subsystem or controller
+information exchange. The Directive Send command transfers data related to a
+specific Directive Type from the host to the controller.
+
+See the NVMe specification for more information.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_send_id_endir (int fd, __u32 nsid, bool endir, enum nvme_directive_dtype dtype, struct nvme_id_directives *id)
+
+ Directive Send Enable Directive
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace Identifier
+
+``bool endir``
+ Enable Directive
+
+``enum nvme_directive_dtype dtype``
+ Directive Type
+
+``struct nvme_id_directives *id``
+ Pointer to structure nvme_id_directives
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_send_stream_release_identifier (int fd, __u32 nsid, __u16 stream_id)
+
+ Directive Send Stream release
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``__u16 stream_id``
+ Stream identifier
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_send_stream_release_resource (int fd, __u32 nsid)
+
+ Directive Send Stream release resources
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_recv (struct nvme_directive_recv_args *args)
+
+ Receive directive specific data
+
+**Parameters**
+
+``struct nvme_directive_recv_args *args``
+ :c:type:`struct nvme_directive_recv_args <nvme_directive_recv_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_recv_identify_parameters (int fd, __u32 nsid, struct nvme_id_directives *id)
+
+ Directive receive identifier parameters
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``struct nvme_id_directives *id``
+ Identify parameters buffer
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_recv_stream_parameters (int fd, __u32 nsid, struct nvme_streams_directive_params *parms)
+
+ Directive receive stream parameters
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``struct nvme_streams_directive_params *parms``
+ Streams directive parameters buffer
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_recv_stream_status (int fd, __u32 nsid, unsigned int nr_entries, struct nvme_streams_directive_status *id)
+
+ Directive receive stream status
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``unsigned int nr_entries``
+ Number of streams to receive
+
+``struct nvme_streams_directive_status *id``
+ Stream status buffer
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_recv_stream_allocate (int fd, __u32 nsid, __u16 nsr, __u32 *result)
+
+ Directive receive stream allocate
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``__u16 nsr``
+ Namespace Streams Requested
+
+``__u32 *result``
+ If successful, the CQE dword0 value
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_capacity_mgmt (struct nvme_capacity_mgmt_args *args)
+
+ Capacity management command
+
+**Parameters**
+
+``struct nvme_capacity_mgmt_args *args``
+ :c:type:`struct nvme_capacity_mgmt_args <nvme_capacity_mgmt_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_lockdown (struct nvme_lockdown_args *args)
+
+ Issue lockdown command
+
+**Parameters**
+
+``struct nvme_lockdown_args *args``
+ :c:type:`struct nvme_lockdown_args <nvme_lockdown_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_property (struct nvme_set_property_args *args)
+
+ Set controller property
+
+**Parameters**
+
+``struct nvme_set_property_args *args``
+ :c:type:`struct nvme_set_property_args <nvme_set_property_args>` argument structure
+
+**Description**
+
+This is an NVMe-over-Fabrics specific command, not applicable to PCIe. These
+properties align to the PCI MMIO controller registers.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_property (struct nvme_get_property_args *args)
+
+ Get a controller property
+
+**Parameters**
+
+``struct nvme_get_property_args *args``
+ :c:type:`struct nvme_get_propert_args <nvme_get_propert_args>` argument structure
+
+**Description**
+
+This is an NVMe-over-Fabrics specific command, not applicable to PCIe. These
+properties align to the PCI MMIO controller registers.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_sanitize_nvm (struct nvme_sanitize_nvm_args *args)
+
+ Start a sanitize operation
+
+**Parameters**
+
+``struct nvme_sanitize_nvm_args *args``
+ :c:type:`struct nvme_sanitize_nvm_args <nvme_sanitize_nvm_args>` argument structure
+
+**Description**
+
+A sanitize operation alters all user data in the NVM subsystem such that
+recovery of any previous user data from any cache, the non-volatile media,
+or any Controller Memory Buffer is not possible.
+
+The Sanitize command starts a sanitize operation or to recover from a
+previously failed sanitize operation. The sanitize operation types that may
+be supported are Block Erase, Crypto Erase, and Overwrite. All sanitize
+operations are processed in the background, i.e., completion of the sanitize
+command does not indicate completion of the sanitize operation.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_dev_self_test (struct nvme_dev_self_test_args *args)
+
+ Start or abort a self test
+
+**Parameters**
+
+``struct nvme_dev_self_test_args *args``
+ :c:type:`struct nvme_dev_self_test <nvme_dev_self_test>` argument structure
+
+**Description**
+
+The Device Self-test command starts a device self-test operation or abort a
+device self-test operation. A device self-test operation is a diagnostic
+testing sequence that tests the integrity and functionality of the
+controller and may include testing of the media associated with namespaces.
+The controller may return a response to this command immediately while
+running the self-test in the background.
+
+Set the 'nsid' field to 0 to not include namespaces in the test. Set to
+0xffffffff to test all namespaces. All other values tests a specific
+namespace, if present.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_virtual_mgmt (struct nvme_virtual_mgmt_args *args)
+
+ Virtualization resource management
+
+**Parameters**
+
+``struct nvme_virtual_mgmt_args *args``
+ :c:type:`struct nvme_virtual_mgmt_args <nvme_virtual_mgmt_args>` argument structure
+
+**Description**
+
+The Virtualization Management command is supported by primary controllers
+that support the Virtualization Enhancements capability. This command is
+used for several functions:
+
+ - Modifying Flexible Resource allocation for the primary controller
+ - Assigning Flexible Resources for secondary controllers
+ - Setting the Online and Offline state for secondary controllers
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_flush (int fd, __u32 nsid)
+
+ Send an nvme flush command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace identifier
+
+**Description**
+
+The Flush command requests that the contents of volatile write cache be made
+non-volatile.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_io (struct nvme_io_args *args, __u8 opcode)
+
+ Submit an nvme user I/O command
+
+**Parameters**
+
+``struct nvme_io_args *args``
+ :c:type:`struct nvme_io_args <nvme_io_args>` argument structure
+
+``__u8 opcode``
+ Opcode to execute
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_read (struct nvme_io_args *args)
+
+ Submit an nvme user read command
+
+**Parameters**
+
+``struct nvme_io_args *args``
+ :c:type:`struct nvme_io_args <nvme_io_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_write (struct nvme_io_args *args)
+
+ Submit an nvme user write command
+
+**Parameters**
+
+``struct nvme_io_args *args``
+ :c:type:`struct nvme_io_args <nvme_io_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_compare (struct nvme_io_args *args)
+
+ Submit an nvme user compare command
+
+**Parameters**
+
+``struct nvme_io_args *args``
+ :c:type:`struct nvme_io_args <nvme_io_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_write_zeros (struct nvme_io_args *args)
+
+ Submit an nvme write zeroes command
+
+**Parameters**
+
+``struct nvme_io_args *args``
+ :c:type:`struct nvme_io_args <nvme_io_args>` argument structure
+
+**Description**
+
+The Write Zeroes command sets a range of logical blocks to zero. After
+successful completion of this command, the value returned by subsequent
+reads of logical blocks in this range shall be all bytes cleared to 0h until
+a write occurs to this LBA range.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_write_uncorrectable (struct nvme_io_args *args)
+
+ Submit an nvme write uncorrectable command
+
+**Parameters**
+
+``struct nvme_io_args *args``
+ :c:type:`struct nvme_io_args <nvme_io_args>` argument structure
+
+**Description**
+
+The Write Uncorrectable command marks a range of logical blocks as invalid.
+When the specified logical block(s) are read after this operation, a failure
+is returned with Unrecovered Read Error status. To clear the invalid logical
+block status, a write operation on those logical blocks is required.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_verify (struct nvme_io_args *args)
+
+ Send an nvme verify command
+
+**Parameters**
+
+``struct nvme_io_args *args``
+ :c:type:`struct nvme_io_args <nvme_io_args>` argument structure
+
+**Description**
+
+The Verify command verifies integrity of stored information by reading data
+and metadata, if applicable, for the LBAs indicated without transferring any
+data or metadata to the host.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_dsm (struct nvme_dsm_args *args)
+
+ Send an nvme data set management command
+
+**Parameters**
+
+``struct nvme_dsm_args *args``
+ :c:type:`struct nvme_dsm_args <nvme_dsm_args>` argument structure
+
+**Description**
+
+The Dataset Management command is used by the host to indicate attributes
+for ranges of logical blocks. This includes attributes like frequency that
+data is read or written, access size, and other information that may be used
+to optimize performance and reliability, and may be used to
+deallocate/unmap/trim those logical blocks.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_copy (struct nvme_copy_args *args)
+
+ Copy command
+
+**Parameters**
+
+``struct nvme_copy_args *args``
+ :c:type:`struct nvme_copy_args <nvme_copy_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_resv_acquire (struct nvme_resv_acquire_args *args)
+
+ Send an nvme reservation acquire
+
+**Parameters**
+
+``struct nvme_resv_acquire_args *args``
+ :c:type:`struct nvme_resv_acquire <nvme_resv_acquire>` argument structure
+
+**Description**
+
+The Reservation Acquire command acquires a reservation on a namespace,
+preempt a reservation held on a namespace, and abort a reservation held on a
+namespace.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_resv_register (struct nvme_resv_register_args *args)
+
+ Send an nvme reservation register
+
+**Parameters**
+
+``struct nvme_resv_register_args *args``
+ :c:type:`struct nvme_resv_register_args <nvme_resv_register_args>` argument structure
+
+**Description**
+
+The Reservation Register command registers, unregisters, or replaces a
+reservation key.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_resv_release (struct nvme_resv_release_args *args)
+
+ Send an nvme reservation release
+
+**Parameters**
+
+``struct nvme_resv_release_args *args``
+ :c:type:`struct nvme_resv_release_args <nvme_resv_release_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_resv_report (struct nvme_resv_report_args *args)
+
+ Send an nvme reservation report
+
+**Parameters**
+
+``struct nvme_resv_report_args *args``
+ struct nvme_resv_report_args argument structure
+
+**Description**
+
+Returns a Reservation Status data structure to memory that describes the
+registration and reservation status of a namespace. See the definition for
+the returned structure, :c:type:`struct nvme_reservation_status <nvme_reservation_status>`, for more details.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_io_mgmt_recv (struct nvme_io_mgmt_recv_args *args)
+
+ I/O Management Receive command
+
+**Parameters**
+
+``struct nvme_io_mgmt_recv_args *args``
+ :c:type:`struct nvme_io_mgmt_recv_args <nvme_io_mgmt_recv_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_fdp_reclaim_unit_handle_status (int fd, __u32 nsid, __u32 data_len, void *data)
+
+ Get reclaim unit handle status
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace identifier
+
+``__u32 data_len``
+ Length of response buffer
+
+``void *data``
+ Response buffer
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_io_mgmt_send (struct nvme_io_mgmt_send_args *args)
+
+ I/O Management Send command
+
+**Parameters**
+
+``struct nvme_io_mgmt_send_args *args``
+ :c:type:`struct nvme_io_mgmt_send_args <nvme_io_mgmt_send_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_fdp_reclaim_unit_handle_update (int fd, __u32 nsid, unsigned int npids, __u16 *pids)
+
+ Update a list of reclaim unit handles
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace identifier
+
+``unsigned int npids``
+ Number of placement identifiers
+
+``__u16 *pids``
+ List of placement identifiers
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_zns_mgmt_send (struct nvme_zns_mgmt_send_args *args)
+
+ ZNS management send command
+
+**Parameters**
+
+``struct nvme_zns_mgmt_send_args *args``
+ :c:type:`struct nvme_zns_mgmt_send_args <nvme_zns_mgmt_send_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_zns_mgmt_recv (struct nvme_zns_mgmt_recv_args *args)
+
+ ZNS management receive command
+
+**Parameters**
+
+``struct nvme_zns_mgmt_recv_args *args``
+ :c:type:`struct nvme_zns_mgmt_recv_args <nvme_zns_mgmt_recv_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_zns_report_zones (int fd, __u32 nsid, __u64 slba, enum nvme_zns_report_options opts, bool extended, bool partial, __u32 data_len, void *data, __u32 timeout, __u32 *result)
+
+ Return the list of zones
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``__u64 slba``
+ Starting LBA
+
+``enum nvme_zns_report_options opts``
+ Reporting options
+
+``bool extended``
+ Extended report
+
+``bool partial``
+ Partial report requested
+
+``__u32 data_len``
+ Length of the data buffer
+
+``void *data``
+ Userspace address of the report zones data
+
+``__u32 timeout``
+ timeout in ms
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_zns_append (struct nvme_zns_append_args *args)
+
+ Append data to a zone
+
+**Parameters**
+
+``struct nvme_zns_append_args *args``
+ :c:type:`struct nvme_zns_append_args <nvme_zns_append_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_dim_send (struct nvme_dim_args *args)
+
+ Send a Discovery Information Management (DIM) command
+
+**Parameters**
+
+``struct nvme_dim_args *args``
+ :c:type:`struct nvme_dim_args <nvme_dim_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
diff --git a/doc/rst/linux.rst b/doc/rst/linux.rst
new file mode 100644
index 0000000..4f159f1
--- /dev/null
+++ b/doc/rst/linux.rst
@@ -0,0 +1,321 @@
+.. _linux.h:
+
+**linux.h**
+
+
+linux-specific utility functions
+
+.. c:function:: int nvme_fw_download_seq (int fd, __u32 size, __u32 xfer, __u32 offset, void *buf)
+
+ Firmware download sequence
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 size``
+ Total size of the firmware image to transfer
+
+``__u32 xfer``
+ Maximum size to send with each partial transfer
+
+``__u32 offset``
+ Starting offset to send with this firmware download
+
+``void *buf``
+ Address of buffer containing all or part of the firmware image.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+
+
+.. c:enum:: nvme_telemetry_da
+
+ Telemetry Log Data Area
+
+**Constants**
+
+``NVME_TELEMETRY_DA_1``
+ Data Area 1
+
+``NVME_TELEMETRY_DA_2``
+ Data Area 2
+
+``NVME_TELEMETRY_DA_3``
+ Data Area 3
+
+``NVME_TELEMETRY_DA_4``
+ Data Area 4
+
+
+.. c:function:: int nvme_get_ctrl_telemetry (int fd, bool rae, struct nvme_telemetry_log **log, enum nvme_telemetry_da da, size_t *size)
+
+ Get controller telemetry log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_telemetry_log **log``
+ On success, set to the value of the allocated and retrieved log.
+
+``enum nvme_telemetry_da da``
+ Log page data area, valid values: :c:type:`enum nvme_telemetry_da <nvme_telemetry_da>`
+
+``size_t *size``
+ Ptr to the telemetry log size, so it can be returned
+
+**Description**
+
+The total size allocated can be calculated as:
+ (nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_host_telemetry (int fd, struct nvme_telemetry_log **log, enum nvme_telemetry_da da, size_t *size)
+
+ Get host telemetry log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_telemetry_log **log``
+ On success, set to the value of the allocated and retrieved log.
+
+``enum nvme_telemetry_da da``
+ Log page data area, valid values: :c:type:`enum nvme_telemetry_da <nvme_telemetry_da>`
+
+``size_t *size``
+ Ptr to the telemetry log size, so it can be returned
+
+**Description**
+
+The total size allocated can be calculated as:
+ (nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_new_host_telemetry (int fd, struct nvme_telemetry_log **log, enum nvme_telemetry_da da, size_t *size)
+
+ Get new host telemetry log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_telemetry_log **log``
+ On success, set to the value of the allocated and retrieved log.
+
+``enum nvme_telemetry_da da``
+ Log page data area, valid values: :c:type:`enum nvme_telemetry_da <nvme_telemetry_da>`
+
+``size_t *size``
+ Ptr to the telemetry log size, so it can be returned
+
+**Description**
+
+The total size allocated can be calculated as:
+ (nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_ana_log_len (int fd, size_t *analen)
+
+ Retrieve size of the current ANA log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``size_t *analen``
+ Pointer to where the length will be set on success
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_logical_block_size (int fd, __u32 nsid, int *blksize)
+
+ Retrieve block size
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace id
+
+``int *blksize``
+ Pointer to where the block size will be set on success
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_lba_status_log (int fd, bool rae, struct nvme_lba_status_log **log)
+
+ Retrieve the LBA Status log page
+
+**Parameters**
+
+``int fd``
+ File descriptor of the nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_lba_status_log **log``
+ On success, set to the value of the allocated and retrieved log.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_namespace_attach_ctrls (int fd, __u32 nsid, __u16 num_ctrls, __u16 *ctrlist)
+
+ Attach namespace to controller(s)
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID to attach
+
+``__u16 num_ctrls``
+ Number of controllers in ctrlist
+
+``__u16 *ctrlist``
+ List of controller IDs to perform the attach action
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_namespace_detach_ctrls (int fd, __u32 nsid, __u16 num_ctrls, __u16 *ctrlist)
+
+ Detach namespace from controller(s)
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID to detach
+
+``__u16 num_ctrls``
+ Number of controllers in ctrlist
+
+``__u16 *ctrlist``
+ List of controller IDs to perform the detach action
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_open (const char *name)
+
+ Open an nvme controller or namespace device
+
+**Parameters**
+
+``const char *name``
+ The basename of the device to open
+
+**Description**
+
+This will look for the handle in /dev/ and validate the name and filetype
+match linux conventions.
+
+**Return**
+
+A file descriptor for the device on a successful open, or -1 with
+errno set otherwise.
+
+
+
+
+.. c:enum:: nvme_hmac_alg
+
+ HMAC algorithm
+
+**Constants**
+
+``NVME_HMAC_ALG_NONE``
+ No HMAC algorithm
+
+``NVME_HMAC_ALG_SHA2_256``
+ SHA2-256
+
+``NVME_HMAC_ALG_SHA2_384``
+ SHA2-384
+
+``NVME_HMAC_ALG_SHA2_512``
+ SHA2-512
+
+
+.. c:function:: int nvme_gen_dhchap_key (char *hostnqn, enum nvme_hmac_alg hmac, unsigned int key_len, unsigned char *secret, unsigned char *key)
+
+ DH-HMAC-CHAP key generation
+
+**Parameters**
+
+``char *hostnqn``
+ Host NVMe Qualified Name
+
+``enum nvme_hmac_alg hmac``
+ HMAC algorithm
+
+``unsigned int key_len``
+ Output key length
+
+``unsigned char *secret``
+ Secret to used for digest
+
+``unsigned char *key``
+ Generated DH-HMAC-CHAP key
+
+**Return**
+
+If key generation was successful the function returns 0 or
+-1 with errno set otherwise.
+
+
diff --git a/doc/rst/log.rst b/doc/rst/log.rst
new file mode 100644
index 0000000..45b4689
--- /dev/null
+++ b/doc/rst/log.rst
@@ -0,0 +1,30 @@
+.. _log.h:
+
+**log.h**
+
+
+logging functions
+
+.. c:function:: void nvme_init_logging (nvme_root_t r, int lvl, bool log_pid, bool log_tstamp)
+
+ Initialize logging
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t context
+
+``int lvl``
+ Logging level to set
+
+``bool log_pid``
+ Boolean to enable logging of the PID
+
+``bool log_tstamp``
+ Boolean to enable logging of the timestamp
+
+**Description**
+
+Sets the default logging variables for the library.
+
+
diff --git a/doc/rst/meson.build b/doc/rst/meson.build
new file mode 100644
index 0000000..ea79115
--- /dev/null
+++ b/doc/rst/meson.build
@@ -0,0 +1,34 @@
+want_docs = get_option('docs')
+
+if want_docs != 'false'
+ want_docs_build = get_option('docs-build')
+ rstdir = get_option('rstdir')
+ if want_docs_build
+ kernel_doc = find_program('../kernel-doc')
+
+ conf = configuration_data()
+ conf.set('SYSCONFDIR', sysconfdir)
+
+ if want_docs == 'all' or want_docs == 'rst' or want_docs == 'html'
+ foreach apif : api_files
+ afile = files('../../src/nvme/' + apif)
+ subst = configure_file(
+ input: afile,
+ output: '@BASENAME@.subst',
+ configuration: conf)
+ rst = custom_target(
+ apif.underscorify() + '_rst',
+ input: subst,
+ output: '@BASENAME@.rst',
+ capture: true,
+ command: [kernel_doc,
+ '-rst',
+ '@INPUT@'],
+ install: true,
+ install_dir: rstdir)
+ endforeach
+ endif
+ else
+ # no prebuild docs
+ endif
+endif
diff --git a/doc/rst/mi.rst b/doc/rst/mi.rst
new file mode 100644
index 0000000..7e82918
--- /dev/null
+++ b/doc/rst/mi.rst
@@ -0,0 +1,3157 @@
+.. _mi.h - NVMe Management Interface library (libnvme-mi) definitions.:
+
+**mi.h - NVMe Management Interface library (libnvme-mi) definitions.**
+
+
+These provide an abstraction for the MI messaging between controllers
+and a host, typically over an MCTP-over-i2c link to a NVMe device, used
+as part of the out-of-band management of a system.
+
+We have a few data structures define here to reflect the topology
+of a MI connection with an NVMe subsystem:
+
+ - :c:type:`nvme_mi_ep_t`: an MI endpoint - our mechanism of communication with a
+ NVMe subsystem. For MCTP, an endpoint will be the component that
+ holds the MCTP address (EID), and receives our request message.
+
+ endpoints are defined in the NVMe-MI spec, and are specific to the MI
+ interface.
+
+ Each endpoint will provide access to one or more of:
+
+ - :c:type:`nvme_mi_ctrl_t`: a NVMe controller, as defined by the NVMe base spec.
+ The controllers are responsible for processing any NVMe standard
+ commands (eg, the Admin command set). An endpoint (:c:type:`nvme_mi_ep_t`)
+ may provide access to multiple controllers - so each of the controller-
+ type commands will require a :c:type:`nvme_mi_ctrl_t` to be specified, rather than
+ an endpoint
+
+A couple of conventions with the libnvme-mi API:
+
+ - All types and functions have the nvme_mi prefix, to distinguish from
+ the libnvme core.
+
+ - We currently support either MI commands and Admin commands. The
+ former adds a _mi prefix, the latter an _admin prefix. [This does
+ result in the MI functions having a double _mi, like
+ :c:type:`nvme_mi_mi_subsystem_health_status_poll`, which is apparently amusing
+ for our German-speaking readers]
+
+For return values: unless specified in the per-function documentation,
+all functions:
+
+ - return 0 on success
+
+ - return -1, with errno set, for errors communicating with the MI device,
+ either in request or response data
+
+ - return >1 on MI status errors. This value is the 8-bit MI status
+ value, represented by :c:type:`enum nvme_mi_resp_status <nvme_mi_resp_status>`. Note that the
+ status values may be vendor-defined above 0xe0.
+
+For the second case, we have a few conventions for errno values:
+
+ - EPROTO: response data violated the MI protocol, and libnvme cannot
+ validly interpret the response
+
+ - EIO: Other I/O error communicating with device (eg., valid but
+ unexpected response data)
+
+ - EINVAL: invalid input arguments for a command
+
+In line with the core NVMe API, the Admin command functions take an
+`_args` structure to provide the command-specific parameters. However,
+for the MI interface, the fd and timeout members of these _args structs
+are ignored.
+
+References to the specifications here will either to be the NVM Express
+Management Interface ("NVMe-MI") or the NVM Express Base specification
+("NVMe"). At the time of writing, the versions we're referencing here
+are:
+ - NVMe-MI 1.2b
+ - NVMe 2.0b
+with a couple of accommodations for older spec types, particularly NVMe-MI
+1.1, where possible.
+
+.. c:macro:: NVME_MI_MSGTYPE_NVME
+
+``NVME_MI_MSGTYPE_NVME ()``
+
+ MCTP message type for NVMe-MI messages.
+
+**Parameters**
+
+**Description**
+
+
+This is defined by MCTP, but is referenced as part of the NVMe-MI message
+spec. This is the MCTP NVMe message type (0x4), with the message-integrity
+bit (0x80) set.
+
+
+
+
+.. c:enum:: nvme_mi_message_type
+
+ NVMe-MI message type field.
+
+**Constants**
+
+``NVME_MI_MT_CONTROL``
+ NVME-MI Control Primitive
+
+``NVME_MI_MT_MI``
+ NVMe-MI command
+
+``NVME_MI_MT_ADMIN``
+ NVMe Admin command
+
+``NVME_MI_MT_PCIE``
+ PCIe command
+
+**Description**
+
+Used as byte 1 of both request and response messages (NMIMT bits of NMP
+byte). Not to be confused with the MCTP message type in byte 0.
+
+
+
+
+.. c:enum:: nvme_mi_ror
+
+ Request or response field.
+
+**Constants**
+
+``NVME_MI_ROR_REQ``
+ request message
+
+``NVME_MI_ROR_RSP``
+ response message
+
+
+
+
+.. c:enum:: nvme_mi_resp_status
+
+ values for the response status field
+
+**Constants**
+
+``NVME_MI_RESP_SUCCESS``
+ success
+
+``NVME_MI_RESP_MPR``
+ More Processing Required
+
+``NVME_MI_RESP_INTERNAL_ERR``
+ Internal Error
+
+``NVME_MI_RESP_INVALID_OPCODE``
+ Invalid command opcode
+
+``NVME_MI_RESP_INVALID_PARAM``
+ Invalid command parameter
+
+``NVME_MI_RESP_INVALID_CMD_SIZE``
+ Invalid command size
+
+``NVME_MI_RESP_INVALID_INPUT_SIZE``
+ Invalid command input data size
+
+``NVME_MI_RESP_ACCESS_DENIED``
+ Access Denied
+
+``NVME_MI_RESP_VPD_UPDATES_EXCEEDED``
+ More VPD updates than allowed
+
+``NVME_MI_RESP_PCIE_INACCESSIBLE``
+ PCIe functionality currently unavailable
+
+``NVME_MI_RESP_MEB_SANITIZED``
+ MEB has been cleared due to sanitize
+
+``NVME_MI_RESP_ENC_SERV_FAILURE``
+ Enclosure services process failed
+
+``NVME_MI_RESP_ENC_SERV_XFER_FAILURE``
+ Transfer with enclosure services failed
+
+``NVME_MI_RESP_ENC_FAILURE``
+ Unreoverable enclosure failure
+
+``NVME_MI_RESP_ENC_XFER_REFUSED``
+ Enclosure services transfer refused
+
+``NVME_MI_RESP_ENC_FUNC_UNSUP``
+ Unsupported enclosure services function
+
+``NVME_MI_RESP_ENC_SERV_UNAVAIL``
+ Enclosure services unavailable
+
+``NVME_MI_RESP_ENC_DEGRADED``
+ Noncritical failure detected by enc. services
+
+``NVME_MI_RESP_SANITIZE_IN_PROGRESS``
+ Command prohibited during sanitize
+
+
+
+
+.. c:struct:: nvme_mi_msg_hdr
+
+ General MI message header.
+
+**Definition**
+
+::
+
+ struct nvme_mi_msg_hdr {
+ __u8 type;
+ __u8 nmp;
+ __u8 meb;
+ __u8 rsvd0;
+ };
+
+**Members**
+
+``type``
+ MCTP message type, will always be NVME_MI_MSGTYPE_NVME
+
+``nmp``
+ NVMe-MI message parameters (including MI message type)
+
+``meb``
+ Management Endpoint Buffer flag; unused for libnvme-mi implementation
+
+``rsvd0``
+ currently reserved
+
+
+**Description**
+
+Wire format shared by both request and response messages, per NVMe-MI
+section 3.1. This is used for all message types, MI and Admin.
+
+
+
+
+.. c:struct:: nvme_mi_msg_resp
+
+ Generic response type.
+
+**Definition**
+
+::
+
+ struct nvme_mi_msg_resp {
+ struct nvme_mi_msg_hdr hdr;
+ __u8 status;
+ __u8 rsvd0[3];
+ };
+
+**Members**
+
+``hdr``
+ the general request/response message header
+
+``status``
+ response status value (see :c:type:`enum nvme_mi_resp_status <nvme_mi_resp_status>`)
+
+``rsvd0``
+ reserved data, may be defined by specific response
+
+
+**Description**
+
+Every response will start with one of these; command-specific responses
+will define parts of the reserved data, and may add further fields.
+
+
+
+
+.. c:enum:: nvme_mi_mi_opcode
+
+ Operation code for supported NVMe-MI commands.
+
+**Constants**
+
+``nvme_mi_mi_opcode_mi_data_read``
+ Read NVMe-MI Data Structure
+
+``nvme_mi_mi_opcode_subsys_health_status_poll``
+ Subsystem Health Status Poll
+
+``nvme_mi_mi_opcode_configuration_set``
+ MI Configuration Set
+
+``nvme_mi_mi_opcode_configuration_get``
+ MI Configuration Get
+
+
+
+
+.. c:struct:: nvme_mi_mi_req_hdr
+
+ MI request message header.
+
+**Definition**
+
+::
+
+ struct nvme_mi_mi_req_hdr {
+ struct nvme_mi_msg_hdr hdr;
+ __u8 opcode;
+ __u8 rsvd0[3];
+ __le32 cdw0, cdw1;
+ };
+
+**Members**
+
+``hdr``
+ generic MI message header
+
+``opcode``
+ opcode (OPC) for the specific MI command
+
+``rsvd0``
+ reserved bytes
+
+``cdw0``
+ Management Request Doubleword 0 - command specific usage
+
+``cdw1``
+ Management Request Doubleword 1 - command specific usage
+
+
+**Description**
+
+Wire format for MI request message headers, defined in section 5 of NVMe-MI.
+
+
+
+
+.. c:struct:: nvme_mi_mi_resp_hdr
+
+ MI response message header.
+
+**Definition**
+
+::
+
+ struct nvme_mi_mi_resp_hdr {
+ struct nvme_mi_msg_hdr hdr;
+ __u8 status;
+ __u8 nmresp[3];
+ };
+
+**Members**
+
+``hdr``
+ generic MI message header
+
+``status``
+ generic response status from command; non-zero on failure.
+
+``nmresp``
+ NVMe Management Response: command-type-specific response data
+
+
+**Description**
+
+Wire format for MI response message header, defined in section 5 of NVMe-MI.
+
+
+
+
+.. c:enum:: nvme_mi_dtyp
+
+ Data Structure Type field.
+
+**Constants**
+
+``nvme_mi_dtyp_subsys_info``
+ NVM Subsystem Information
+
+``nvme_mi_dtyp_port_info``
+ Port information
+
+``nvme_mi_dtyp_ctrl_list``
+ Controller List
+
+``nvme_mi_dtyp_ctrl_info``
+ Controller Information
+
+``nvme_mi_dtyp_opt_cmd_support``
+ Optionally Supported Command List
+
+``nvme_mi_dtyp_meb_support``
+ Management Endpoint Buffer Command Support List
+
+**Description**
+
+Data Structure Type field for Read NVMe-MI Data Structure command, used to
+indicate the particular structure to query from the endpoint.
+
+
+
+
+.. c:enum:: nvme_mi_config_id
+
+ NVMe-MI Configuration identifier.
+
+**Constants**
+
+``NVME_MI_CONFIG_SMBUS_FREQ``
+ Current SMBus/I2C frequency
+
+``NVME_MI_CONFIG_HEALTH_STATUS_CHANGE``
+ Health Status change - used to clear
+ health status bits in CCS bits of
+ status poll. Only for Set ops.
+
+``NVME_MI_CONFIG_MCTP_MTU``
+ MCTP maximum transmission unit size of port
+ specified in dw 0
+
+**Description**
+
+Configuration parameters for the MI Get/Set Configuration commands.
+
+See :c:type:`nvme_mi_mi_config_get`() and :c:type:`nvme_mi_config_set`().
+
+
+
+
+.. c:enum:: nvme_mi_config_smbus_freq
+
+ SMBus/I2C frequency values
+
+**Constants**
+
+``NVME_MI_CONFIG_SMBUS_FREQ_100kHz``
+ 100kHz
+
+``NVME_MI_CONFIG_SMBUS_FREQ_400kHz``
+ 400kHz
+
+``NVME_MI_CONFIG_SMBUS_FREQ_1MHz``
+ 1MHz
+
+**Description**
+
+Values used in the SMBus Frequency device configuration. See
+:c:type:`nvme_mi_mi_config_get_smbus_freq`() and :c:type:`nvme_mi_mi_config_set_smbus_freq`().
+
+
+
+
+.. c:struct:: nvme_mi_admin_req_hdr
+
+ Admin command request header.
+
+**Definition**
+
+::
+
+ struct nvme_mi_admin_req_hdr {
+ struct nvme_mi_msg_hdr hdr;
+ __u8 opcode;
+ __u8 flags;
+ __le16 ctrl_id;
+ __le32 cdw1, cdw2, cdw3, cdw4, cdw5;
+ __le32 doff;
+ __le32 dlen;
+ __le32 rsvd0, rsvd1;
+ __le32 cdw10, cdw11, cdw12, cdw13, cdw14, cdw15;
+ };
+
+**Members**
+
+``hdr``
+ Generic MI message header
+
+``opcode``
+ Admin command opcode (using enum nvme_admin_opcode)
+
+``flags``
+ Command Flags, indicating dlen and doff validity; Only defined in
+ NVMe-MI version 1.1, no fields defined in 1.2 (where the dlen/doff
+ are always considered valid).
+
+``ctrl_id``
+ Controller ID target of command
+
+``cdw1``
+ Submission Queue Entry doubleword 1
+
+``cdw2``
+ Submission Queue Entry doubleword 2
+
+``cdw3``
+ Submission Queue Entry doubleword 3
+
+``cdw4``
+ Submission Queue Entry doubleword 4
+
+``cdw5``
+ Submission Queue Entry doubleword 5
+
+``doff``
+ Offset of data to return from command
+
+``dlen``
+ Length of sent/returned data
+
+``rsvd0``
+ Reserved
+
+``rsvd1``
+ Reserved
+
+``cdw10``
+ Submission Queue Entry doubleword 10
+
+``cdw11``
+ Submission Queue Entry doubleword 11
+
+``cdw12``
+ Submission Queue Entry doubleword 12
+
+``cdw13``
+ Submission Queue Entry doubleword 13
+
+``cdw14``
+ Submission Queue Entry doubleword 14
+
+``cdw15``
+ Submission Queue Entry doubleword 15
+
+
+**Description**
+
+Wire format for Admin command message headers, defined in section 6 of
+NVMe-MI.
+
+
+
+
+.. c:struct:: nvme_mi_admin_resp_hdr
+
+ Admin command response header.
+
+**Definition**
+
+::
+
+ struct nvme_mi_admin_resp_hdr {
+ struct nvme_mi_msg_hdr hdr;
+ __u8 status;
+ __u8 rsvd0[3];
+ __le32 cdw0, cdw1, cdw3;
+ };
+
+**Members**
+
+``hdr``
+ Generic MI message header
+
+``status``
+ Generic response code, non-zero on failure
+
+``rsvd0``
+ Reserved
+
+``cdw0``
+ Completion Queue Entry doubleword 0
+
+``cdw1``
+ Completion Queue Entry doubleword 1
+
+``cdw3``
+ Completion Queue Entry doubleword 3
+
+
+**Description**
+
+This is the generic response format with the three doublewords of completion
+queue data, plus optional response data.
+
+
+.. c:function:: const char * nvme_mi_status_to_string (int status)
+
+ return a string representation of the MI status.
+
+**Parameters**
+
+``int status``
+ MI response status
+
+**Description**
+
+Gives a string description of **status**, as per section 4.1.2 of the NVMe-MI
+spec. The status value should be of type NVME_STATUS_MI, and extracted
+from the return value using nvme_status_get_value().
+
+Returned string is const, and should not be free()ed.
+
+**Return**
+
+A string representing the status value
+
+
+.. c:function:: nvme_root_t nvme_mi_create_root (FILE *fp, int log_level)
+
+ Create top-level MI (root) handle.
+
+**Parameters**
+
+``FILE *fp``
+ File descriptor for logging messages
+
+``int log_level``
+ Logging level to use
+
+**Description**
+
+Create the top-level (library) handle for creating subsequent endpoint
+objects. Similar to nvme_create_root(), but we provide this to allow linking
+without the core libnvme.
+
+See :c:type:`nvme_create_root`.
+
+**Return**
+
+new root object, or NULL on failure.
+
+
+.. c:function:: void nvme_mi_free_root (nvme_root_t root)
+
+ Free root object.
+
+**Parameters**
+
+``nvme_root_t root``
+ root to free
+
+
+.. c:function:: void nvme_mi_set_probe_enabled (nvme_root_t root, bool enabled)
+
+ enable/disable the probe for new endpoints
+
+**Parameters**
+
+``nvme_root_t root``
+ :c:type:`nvme_root_t` object
+
+``bool enabled``
+ whether to probe new endpoints
+
+**Description**
+
+Controls whether newly-created endpoints are probed for quirks on creation.
+Defaults to enabled, which results in some initial messaging with the
+endpoint to determine model-specific details.
+
+
+
+
+.. c:type:: nvme_mi_ep_t
+
+ MI Endpoint object.
+
+**Description**
+
+
+Represents our communication endpoint on the remote MI-capable device.
+To be used for direct MI commands for the endpoint (through the
+nvme_mi_mi_* functions(), or to communicate with individual controllers
+(see :c:type:`nvme_mi_init_ctrl`).
+
+Endpoints are created through a transport-specific constructor; currently
+only MCTP-connected endpoints are supported, through :c:type:`nvme_mi_open_mctp`.
+Subsequent operations on the endpoint (and related controllers) are
+transport-independent.
+
+
+.. c:function:: nvme_mi_ep_t nvme_mi_first_endpoint (nvme_root_t m)
+
+ Start endpoint iterator
+
+**Parameters**
+
+``nvme_root_t m``
+ :c:type:`nvme_root_t` object
+
+**Return**
+
+first MI endpoint object under this root, or NULL if no endpoints
+ are present.
+
+**Description**
+
+See: :c:type:`nvme_mi_next_endpoint`, :c:type:`nvme_mi_for_each_endpoint`
+
+
+.. c:function:: nvme_mi_ep_t nvme_mi_next_endpoint (nvme_root_t m, nvme_mi_ep_t e)
+
+ Continue endpoint iterator
+
+**Parameters**
+
+``nvme_root_t m``
+ :c:type:`nvme_root_t` object
+
+``nvme_mi_ep_t e``
+ :c:type:`nvme_mi_ep_t` current position of iterator
+
+**Return**
+
+next endpoint MI endpoint object after **e** under this root, or NULL
+ if no further endpoints are present.
+
+**Description**
+
+See: :c:type:`nvme_mi_first_endpoint`, :c:type:`nvme_mi_for_each_endpoint`
+
+
+.. c:macro:: nvme_mi_for_each_endpoint
+
+``nvme_mi_for_each_endpoint (m, e)``
+
+ Iterator for NVMe-MI endpoints.
+
+**Parameters**
+
+``m``
+ :c:type:`nvme_root_t` containing endpoints
+
+``e``
+ :c:type:`nvme_mi_ep_t` object, set on each iteration
+
+
+.. c:macro:: nvme_mi_for_each_endpoint_safe
+
+``nvme_mi_for_each_endpoint_safe (m, e, _e)``
+
+ Iterator for NVMe-MI endpoints, allowing deletion during traversal
+
+**Parameters**
+
+``m``
+ :c:type:`nvme_root_t` containing endpoints
+
+``e``
+ :c:type:`nvme_mi_ep_t` object, set on each iteration
+
+``_e``
+ :c:type:`nvme_mi_ep_t` object used as temporary storage
+
+
+.. c:function:: int nvme_mi_ep_set_timeout (nvme_mi_ep_t ep, unsigned int timeout_ms)
+
+ set a timeout for NVMe-MI responses
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ MI endpoint object
+
+``unsigned int timeout_ms``
+ Timeout for MI responses, given in milliseconds
+
+
+.. c:function:: void nvme_mi_ep_set_mprt_max (nvme_mi_ep_t ep, unsigned int mprt_max_ms)
+
+ set the maximum wait time for a More Processing Required response
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ MI endpoint object
+
+``unsigned int mprt_max_ms``
+ Maximum more processing required wait time
+
+**Description**
+
+NVMe-MI endpoints may respond to a request with a "More Processing Required"
+response; this also includes a hint on the worst-case processing time for
+the eventual response data, with a specification-defined maximum of 65.535
+seconds.
+
+This function provides a way to limit the maximum time we're prepared to
+wait for the final response. Specify zero in **mprt_max_ms** for no limit.
+This should be larger than the command/response timeout set in
+:c:type:`nvme_mi_ep_set_timeout`().
+
+
+.. c:function:: unsigned int nvme_mi_ep_get_timeout (nvme_mi_ep_t ep)
+
+ get the current timeout value for NVMe-MI responses
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ MI endpoint object
+
+**Description**
+
+Returns the current timeout value, in milliseconds, for this endpoint.
+
+
+
+
+.. c:type:: nvme_mi_ctrl_t
+
+ NVMe-MI Controller object.
+
+**Description**
+
+
+Provides NVMe command functionality, through the MI interface.
+
+
+.. c:function:: nvme_mi_ctrl_t nvme_mi_first_ctrl (nvme_mi_ep_t ep)
+
+ Start controller iterator
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ :c:type:`nvme_mi_ep_t` object
+
+**Return**
+
+first MI controller object under this root, or NULL if no controllers
+ are present.
+
+**Description**
+
+See: :c:type:`nvme_mi_next_ctrl`, :c:type:`nvme_mi_for_each_ctrl`
+
+
+.. c:function:: nvme_mi_ctrl_t nvme_mi_next_ctrl (nvme_mi_ep_t ep, nvme_mi_ctrl_t c)
+
+ Continue ctrl iterator
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ :c:type:`nvme_mi_ep_t` object
+
+``nvme_mi_ctrl_t c``
+ :c:type:`nvme_mi_ctrl_t` current position of iterator
+
+**Return**
+
+next MI controller object after **c** under this endpoint, or NULL
+ if no further controllers are present.
+
+**Description**
+
+See: :c:type:`nvme_mi_first_ctrl`, :c:type:`nvme_mi_for_each_ctrl`
+
+
+.. c:macro:: nvme_mi_for_each_ctrl
+
+``nvme_mi_for_each_ctrl (ep, c)``
+
+ Iterator for NVMe-MI controllers.
+
+**Parameters**
+
+``ep``
+ :c:type:`nvme_mi_ep_t` containing endpoints
+
+``c``
+ :c:type:`nvme_mi_ctrl_t` object, set on each iteration
+
+**Description**
+
+Allows iteration of the list of controllers behind an endpoint. Unless the
+controllers have already been created explicitly, you'll probably want to
+call :c:type:`nvme_mi_scan_ep`() to scan for the controllers first.
+
+See: :c:type:`nvme_mi_scan_ep`()
+
+
+.. c:macro:: nvme_mi_for_each_ctrl_safe
+
+``nvme_mi_for_each_ctrl_safe (ep, c, _c)``
+
+ Iterator for NVMe-MI controllers, allowing deletion during traversal
+
+**Parameters**
+
+``ep``
+ :c:type:`nvme_mi_ep_t` containing controllers
+
+``c``
+ :c:type:`nvme_mi_ctrl_t` object, set on each iteration
+
+``_c``
+ :c:type:`nvme_mi_ctrl_t` object used as temporary storage
+
+**Description**
+
+Allows iteration of the list of controllers behind an endpoint, safe against
+deletion during iteration. Unless the controllers have already been created
+explicitly (or you're just iterating to destroy controllers) you'll probably
+want to call :c:type:`nvme_mi_scan_ep`() to scan for the controllers first.
+
+See: :c:type:`nvme_mi_scan_ep`()
+
+
+.. c:function:: nvme_mi_ep_t nvme_mi_open_mctp (nvme_root_t root, unsigned int netid, uint8_t eid)
+
+ Create an endpoint using a MCTP connection.
+
+**Parameters**
+
+``nvme_root_t root``
+ root object to create under
+
+``unsigned int netid``
+ MCTP network ID on this system
+
+``uint8_t eid``
+ MCTP endpoint ID
+
+**Description**
+
+Transport-specific endpoint initialization for MI-connected endpoints. Once
+an endpoint is created, the rest of the API is transport-independent.
+
+See :c:type:`nvme_mi_close`
+
+**Return**
+
+New endpoint object for **netid** & **eid**, or NULL on failure.
+
+
+.. c:function:: void nvme_mi_close (nvme_mi_ep_t ep)
+
+ Close an endpoint connection and release resources, including controller objects.
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ Endpoint object to close
+
+
+.. c:function:: nvme_root_t nvme_mi_scan_mctp (void)
+
+ look for MCTP-connected NVMe-MI endpoints.
+
+**Parameters**
+
+``void``
+ no arguments
+
+**Description**
+
+This function queries the system MCTP daemon ("mctpd") over
+D-Bus, to find MCTP endpoints that report support for NVMe-MI over MCTP.
+
+This requires libvnme-mi to be compiled with D-Bus support; if not, this
+will return NULL.
+
+**Return**
+
+A **nvme_root_t** populated with a set of MCTP-connected endpoints,
+ or NULL on failure
+
+
+.. c:function:: int nvme_mi_scan_ep (nvme_mi_ep_t ep, bool force_rescan)
+
+ query an endpoint for its NVMe controllers.
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ Endpoint to scan
+
+``bool force_rescan``
+ close existing controllers and rescan
+
+**Description**
+
+This function queries an MI endpoint for the controllers available, by
+performing an MI Read MI Data Structure command (requesting the
+controller list). The controllers are stored in the endpoint's internal
+list, and can be iterated with nvme_mi_for_each_ctrl.
+
+This will only scan the endpoint once, unless **force_rescan** is set. If
+so, all existing controller objects will be freed - the caller must not
+hold a reference to those across this call.
+
+See: :c:type:`nvme_mi_for_each_ctrl`
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: nvme_mi_ctrl_t nvme_mi_init_ctrl (nvme_mi_ep_t ep, __u16 ctrl_id)
+
+ initialise a NVMe controller.
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ Endpoint to create under
+
+``__u16 ctrl_id``
+ ID of controller to initialize.
+
+**Description**
+
+Create a connection to a controller behind the endpoint specified in **ep**.
+Controller IDs may be queried from the endpoint through
+:c:type:`nvme_mi_mi_read_mi_data_ctrl_list`.
+
+See :c:type:`nvme_mi_close_ctrl`
+
+**Return**
+
+New controller object, or NULL on failure.
+
+
+.. c:function:: void nvme_mi_close_ctrl (nvme_mi_ctrl_t ctrl)
+
+ free a controller
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ controller to free
+
+
+.. c:function:: char * nvme_mi_endpoint_desc (nvme_mi_ep_t ep)
+
+ Get a string describing a MI endpoint.
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint to describe
+
+**Description**
+
+Generates a human-readable string describing the endpoint, with possibly
+transport-specific data. The string is allocated during the call, and the
+caller is responsible for free()-ing the string.
+
+**Return**
+
+a newly-allocated string containing the endpoint description, or
+ NULL on failure.
+
+
+.. c:function:: int nvme_mi_mi_read_mi_data_subsys (nvme_mi_ep_t ep, struct nvme_mi_read_nvm_ss_info *s)
+
+ Perform a Read MI Data Structure command, retrieving subsystem data.
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``struct nvme_mi_read_nvm_ss_info *s``
+ subsystem information to populate
+
+**Description**
+
+Retrieves the Subsystem information - number of external ports and
+NVMe version information. See :c:type:`struct nvme_mi_read_nvm_ss_info <nvme_mi_read_nvm_ss_info>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise..
+
+
+.. c:function:: int nvme_mi_mi_read_mi_data_port (nvme_mi_ep_t ep, __u8 portid, struct nvme_mi_read_port_info *p)
+
+ Perform a Read MI Data Structure command, retrieving port data.
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u8 portid``
+ id of port data to retrieve
+
+``struct nvme_mi_read_port_info *p``
+ port information to populate
+
+**Description**
+
+Retrieves the Port information, for the specified port ID. The subsystem
+data (from :c:type:`nvme_mi_mi_read_mi_data_subsys`) nmp field contains the allowed
+range of port IDs.
+
+See :c:type:`struct nvme_mi_read_port_info <nvme_mi_read_port_info>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise..
+
+
+.. c:function:: int nvme_mi_mi_read_mi_data_ctrl_list (nvme_mi_ep_t ep, __u8 start_ctrlid, struct nvme_ctrl_list *list)
+
+ Perform a Read MI Data Structure command, retrieving the list of attached controllers.
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u8 start_ctrlid``
+ starting controller ID
+
+``struct nvme_ctrl_list *list``
+ controller list to populate
+
+**Description**
+
+Retrieves the list of attached controllers, with IDs greater than or
+equal to **start_ctrlid**.
+
+See :c:type:`struct nvme_ctrl_list <nvme_ctrl_list>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise..
+
+
+.. c:function:: int nvme_mi_mi_read_mi_data_ctrl (nvme_mi_ep_t ep, __u16 ctrl_id, struct nvme_mi_read_ctrl_info *ctrl)
+
+ Perform a Read MI Data Structure command, retrieving controller information
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u16 ctrl_id``
+ ID of controller to query
+
+``struct nvme_mi_read_ctrl_info *ctrl``
+ controller data to populate
+
+**Description**
+
+Retrieves the Controller Information Data Structure for the attached
+controller with ID **ctrlid**.
+
+See :c:type:`struct nvme_mi_read_ctrl_info <nvme_mi_read_ctrl_info>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise..
+
+
+.. c:function:: int nvme_mi_mi_subsystem_health_status_poll (nvme_mi_ep_t ep, bool clear, struct nvme_mi_nvm_ss_health_status *nshds)
+
+ Read the Subsystem Health Data Structure from the NVM subsystem
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``bool clear``
+ flag to clear the Composite Controller Status state
+
+``struct nvme_mi_nvm_ss_health_status *nshds``
+ subsystem health status data to populate
+
+**Description**
+
+Retrieves the Subsystem Health Data Structure into **nshds**. If **clear** is
+set, requests that the Composite Controller Status bits are cleared after
+the read. See NVMe-MI section 5.6 for details on the CCS bits.
+
+See :c:type:`struct nvme_mi_nvm_ss_health_status <nvme_mi_nvm_ss_health_status>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise..
+
+
+.. c:function:: int nvme_mi_mi_config_get (nvme_mi_ep_t ep, __u32 dw0, __u32 dw1, __u32 *nmresp)
+
+ query a configuration parameter
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u32 dw0``
+ management doubleword 0, containing configuration identifier, plus
+ config-specific fields
+
+``__u32 dw1``
+ management doubleword 0, config-specific.
+
+``__u32 *nmresp``
+ set to queried configuration data in NMRESP field of response.
+
+**Description**
+
+Performs a MI Configuration Get command, with the configuration identifier
+as the LSB of **dw0**. Other **dw0** and **dw1** data is configuration-identifier
+specific.
+
+On a successful Configuration Get, the **nmresp** pointer will be populated with
+the bytes from the 3-byte NMRESP field, converted to native endian.
+
+See :c:type:`enum nvme_mi_config_id <nvme_mi_config_id>` for identifiers.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise..
+
+
+.. c:function:: int nvme_mi_mi_config_set (nvme_mi_ep_t ep, __u32 dw0, __u32 dw1)
+
+ set a configuration parameter
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u32 dw0``
+ management doubleword 0, containing configuration identifier, plus
+ config-specific fields
+
+``__u32 dw1``
+ management doubleword 0, config-specific.
+
+**Description**
+
+Performs a MI Configuration Set command, with the command as the LSB of
+**dw0**. Other **dw0** and **dw1** data is configuration-identifier specific.
+
+See :c:type:`enum nvme_mi_config_id <nvme_mi_config_id>` for identifiers.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise..
+
+
+.. c:function:: int nvme_mi_mi_config_get_smbus_freq (nvme_mi_ep_t ep, __u8 port, enum nvme_mi_config_smbus_freq *freq)
+
+ get configuration: SMBus port frequency
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u8 port``
+ port ID to query
+
+``enum nvme_mi_config_smbus_freq *freq``
+ output value for current frequency configuration
+
+**Description**
+
+Performs a MI Configuration Get, to query the current SMBus frequency of
+the port specified in **port**. On success, populates **freq** with the port
+frequency
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise..
+
+
+.. c:function:: int nvme_mi_mi_config_set_smbus_freq (nvme_mi_ep_t ep, __u8 port, enum nvme_mi_config_smbus_freq freq)
+
+ set configuration: SMBus port frequency
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u8 port``
+ port ID to set
+
+``enum nvme_mi_config_smbus_freq freq``
+ new frequency configuration
+
+**Description**
+
+Performs a MI Configuration Set, to update the current SMBus frequency of
+the port specified in **port**.
+
+See :c:type:`struct nvme_mi_read_port_info <nvme_mi_read_port_info>` for the maximum supported SMBus frequency
+for the port.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise..
+
+
+.. c:function:: int nvme_mi_mi_config_set_health_status_change (nvme_mi_ep_t ep, __u32 mask)
+
+ clear CCS bits in health status
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u32 mask``
+ bitmask to clear
+
+**Description**
+
+Performs a MI Configuration Set, to update the current health status poll
+values of the Composite Controller Status bits. Bits set in **mask** will
+be cleared from future health status poll data, and may be re-triggered by
+a future health change event.
+
+See :c:type:`nvme_mi_mi_subsystem_health_status_poll`(), :c:type:`enum nvme_mi_ccs <nvme_mi_ccs>` for
+values in **mask**.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise..
+
+
+.. c:function:: int nvme_mi_mi_config_get_mctp_mtu (nvme_mi_ep_t ep, __u8 port, __u16 *mtu)
+
+ get configuration: MCTP MTU
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u8 port``
+ port ID to query
+
+``__u16 *mtu``
+ output value for current MCTP MTU configuration
+
+**Description**
+
+Performs a MI Configuration Get, to query the current MCTP Maximum
+Transmission Unit size (MTU) of the port specified in **port**. On success,
+populates **mtu** with the MTU.
+
+The default reset value is 64, corresponding to the MCTP baseline MTU.
+
+Some controllers may also use this as the maximum receive unit size, and
+may not accept MCTP messages larger than the configured MTU.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise..
+
+
+.. c:function:: int nvme_mi_mi_config_set_mctp_mtu (nvme_mi_ep_t ep, __u8 port, __u16 mtu)
+
+ set configuration: MCTP MTU
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u8 port``
+ port ID to set
+
+``__u16 mtu``
+ new MTU configuration
+
+**Description**
+
+Performs a MI Configuration Set, to update the current MCTP MTU value for
+the port specified in **port**.
+
+Some controllers may also use this as the maximum receive unit size, and
+may not accept MCTP messages larger than the configured MTU. When setting
+this value, you will likely need to change the MTU of the local MCTP
+interface(s) to match.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise..
+
+
+.. c:function:: int nvme_mi_admin_xfer (nvme_mi_ctrl_t ctrl, struct nvme_mi_admin_req_hdr *admin_req, size_t req_data_size, struct nvme_mi_admin_resp_hdr *admin_resp, off_t resp_data_offset, size_t *resp_data_size)
+
+ Raw admin transfer interface.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ controller to send the admin command to
+
+``struct nvme_mi_admin_req_hdr *admin_req``
+ request data
+
+``size_t req_data_size``
+ size of request data payload
+
+``struct nvme_mi_admin_resp_hdr *admin_resp``
+ buffer for response data
+
+``off_t resp_data_offset``
+ offset into request data to retrieve from controller
+
+``size_t *resp_data_size``
+ size of response data buffer, updated to received size
+
+**Description**
+
+Performs an arbitrary NVMe Admin command, using the provided request data,
+in **admin_req**. The size of the request data *payload* is specified in
+**req_data_size** - this does not include the standard header length (so a
+header-only request would have a size of 0).
+
+On success, response data is stored in **admin_resp**, which has an optional
+appended payload buffer of **resp_data_size** bytes. The actual payload
+transferred will be stored in **resp_data_size**. These sizes do not include
+the Admin request header, so 0 represents no payload.
+
+As with all Admin commands, we can request partial data from the Admin
+Response payload, offset by **resp_data_offset**.
+
+See: :c:type:`struct nvme_mi_admin_req_hdr <nvme_mi_admin_req_hdr>` and :c:type:`struct nvme_mi_admin_resp_hdr <nvme_mi_admin_resp_hdr>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise..
+
+
+.. c:function:: int nvme_mi_admin_admin_passthru (nvme_mi_ctrl_t ctrl, __u8 opcode, __u8 flags, __u16 rsvd, __u32 nsid, __u32 cdw2, __u32 cdw3, __u32 cdw10, __u32 cdw11, __u32 cdw12, __u32 cdw13, __u32 cdw14, __u32 cdw15, __u32 data_len, void *data, __u32 metadata_len, void *metadata, __u32 timeout_ms, __u32 *result)
+
+ Submit an nvme admin passthrough command
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``__u8 opcode``
+ The nvme admin command to send
+
+``__u8 flags``
+ NVMe command flags (not used)
+
+``__u16 rsvd``
+ Reserved for future use
+
+``__u32 nsid``
+ Namespace identifier
+
+``__u32 cdw2``
+ Command dword 2
+
+``__u32 cdw3``
+ Command dword 3
+
+``__u32 cdw10``
+ Command dword 10
+
+``__u32 cdw11``
+ Command dword 11
+
+``__u32 cdw12``
+ Command dword 12
+
+``__u32 cdw13``
+ Command dword 13
+
+``__u32 cdw14``
+ Command dword 14
+
+``__u32 cdw15``
+ Command dword 15
+
+``__u32 data_len``
+ Length of the data transferred in this command in bytes
+
+``void *data``
+ Pointer to user address of the data buffer
+
+``__u32 metadata_len``
+ Length of metadata transferred in this command(not used)
+
+``void *metadata``
+ Pointer to user address of the metadata buffer(not used)
+
+``__u32 timeout_ms``
+ How long to wait for the command to complete
+
+``__u32 *result``
+ Optional field to return the result from the CQE dword 0
+
+**Description**
+
+Send a customized NVMe Admin command request message and get the corresponding
+response message.
+
+This interface supports no data, host to controller and controller to
+host but it doesn't support bidirectional data transfer.
+Also this interface only supports data transfer size range [0, 4096] (bytes)
+so the & data_len parameter must be less than 4097.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_identify_partial (nvme_mi_ctrl_t ctrl, struct nvme_identify_args *args, off_t offset, size_t size)
+
+ Perform an Admin identify command, and retrieve partial response data.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``struct nvme_identify_args *args``
+ Identify command arguments
+
+``off_t offset``
+ offset of identify data to retrieve from response
+
+``size_t size``
+ size of identify data to return
+
+**Description**
+
+Perform an Identify command, using the Identify command parameters in **args**.
+The **offset** and **size** arguments allow the caller to retrieve part of
+the identify response. See NVMe-MI section 6.2 for the semantics (and some
+handy diagrams) of the offset & size parameters.
+
+Will return an error if the length of the response data (from the controller)
+did not match **size**.
+
+Unless you're performing a vendor-unique identify command, You'll probably
+want to use one of the identify helpers (nvme_mi_admin_identify,
+nvme_mi_admin_identify_cns_nsid, or nvme_mi_admin_identify_<type>) instead
+of this. If the type of your identify command is standardized but not
+yet supported by libnvme-mi, please contact the maintainers.
+
+See: :c:type:`struct nvme_identify_args <nvme_identify_args>`
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_identify (nvme_mi_ctrl_t ctrl, struct nvme_identify_args *args)
+
+ Perform an Admin identify command.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``struct nvme_identify_args *args``
+ Identify command arguments
+
+**Description**
+
+Perform an Identify command, using the Identify command parameters in **args**.
+Stores the identify data in ->data, and (if set) the result from cdw0
+into args->result.
+
+Will return an error if the length of the response data (from the
+controller) is not a full :c:type:`NVME_IDENTIFY_DATA_SIZE`.
+
+See: :c:type:`struct nvme_identify_args <nvme_identify_args>`
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_identify_cns_nsid (nvme_mi_ctrl_t ctrl, enum nvme_identify_cns cns, __u32 nsid, void *data)
+
+ Perform an Admin identify command using specific CNS/NSID parameters.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``enum nvme_identify_cns cns``
+ Controller or Namespace Structure, specifying identified object
+
+``__u32 nsid``
+ namespace ID
+
+``void *data``
+ buffer for identify data response
+
+**Description**
+
+Perform an Identify command, using the CNS specifier **cns**, and the
+namespace ID **nsid** if required by the CNS type.
+
+Stores the identify data in **data**, which is expected to be a buffer of
+:c:type:`NVME_IDENTIFY_DATA_SIZE` bytes.
+
+Will return an error if the length of the response data (from the
+controller) is not a full :c:type:`NVME_IDENTIFY_DATA_SIZE`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_identify_ns (nvme_mi_ctrl_t ctrl, __u32 nsid, struct nvme_id_ns *ns)
+
+ Perform an Admin identify command for a namespace
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``__u32 nsid``
+ namespace ID
+
+``struct nvme_id_ns *ns``
+ Namespace identification to populate
+
+**Description**
+
+Perform an Identify (namespace) command, setting the namespace id data
+in **ns**. The namespace is expected to active and allocated.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_identify_ns_descs (nvme_mi_ctrl_t ctrl, __u32 nsid, struct nvme_ns_id_desc *descs)
+
+ Perform an Admin identify Namespace Identification Descriptor list command for a namespace
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``__u32 nsid``
+ Namespace ID
+
+``struct nvme_ns_id_desc *descs``
+ Namespace Identification Descriptor list to populate
+
+**Description**
+
+Perform an Identify namespace identification description list command,
+setting the namespace identification description list in **descs**
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_identify_allocated_ns (nvme_mi_ctrl_t ctrl, __u32 nsid, struct nvme_id_ns *ns)
+
+ Perform an Admin identify command for an allocated namespace
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``__u32 nsid``
+ namespace ID
+
+``struct nvme_id_ns *ns``
+ Namespace identification to populate
+
+**Description**
+
+Perform an Identify (namespace) command, setting the namespace id data
+in **ns**.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_identify_ctrl (nvme_mi_ctrl_t ctrl, struct nvme_id_ctrl *id)
+
+ Perform an Admin identify for a controller
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``struct nvme_id_ctrl *id``
+ Controller identify data to populate
+
+**Description**
+
+Perform an Identify command, for the controller specified by **ctrl**,
+writing identify data to **id**.
+
+Will return an error if the length of the response data (from the
+controller) is not a full :c:type:`NVME_IDENTIFY_DATA_SIZE`, so **id** will be
+fully populated on success.
+
+See: :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_identify_ctrl_list (nvme_mi_ctrl_t ctrl, __u16 cntid, struct nvme_ctrl_list *list)
+
+ Perform an Admin identify for a controller list.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``__u16 cntid``
+ Controller ID to specify list start
+
+``struct nvme_ctrl_list *list``
+ List data to populate
+
+**Description**
+
+Perform an Identify command, for the controller list starting with
+IDs greater than or equal to **cntid**.
+
+Will return an error if the length of the response data (from the
+controller) is not a full :c:type:`NVME_IDENTIFY_DATA_SIZE`, so **id** will be
+fully populated on success.
+
+See: :c:type:`struct nvme_ctrl_list <nvme_ctrl_list>`
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_identify_nsid_ctrl_list (nvme_mi_ctrl_t ctrl, __u32 nsid, __u16 cntid, struct nvme_ctrl_list *list)
+
+ Perform an Admin identify for a controller list with specific namespace ID
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``__u32 nsid``
+ Namespace identifier
+
+``__u16 cntid``
+ Controller ID to specify list start
+
+``struct nvme_ctrl_list *list``
+ List data to populate
+
+**Description**
+
+Perform an Identify command, for the controller list for **nsid**, starting
+with IDs greater than or equal to **cntid**.
+
+Will return an error if the length of the response data (from the
+controller) is not a full :c:type:`NVME_IDENTIFY_DATA_SIZE`, so **id** will be
+fully populated on success.
+
+See: :c:type:`struct nvme_ctrl_list <nvme_ctrl_list>`
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_identify_allocated_ns_list (nvme_mi_ctrl_t ctrl, __u32 nsid, struct nvme_ns_list *list)
+
+ Perform an Admin identify for an allocated namespace list
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``__u32 nsid``
+ Namespace ID to specify list start
+
+``struct nvme_ns_list *list``
+ List data to populate
+
+**Description**
+
+Perform an Identify command, for the allocated namespace list starting with
+IDs greater than or equal to **nsid**. Specify :c:type:`NVME_NSID_NONE` for the start
+of the list.
+
+Will return an error if the length of the response data (from the
+controller) is not a full :c:type:`NVME_IDENTIFY_DATA_SIZE`, so **list** will be
+be fully populated on success.
+
+See: :c:type:`struct nvme_ns_list <nvme_ns_list>`
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_identify_active_ns_list (nvme_mi_ctrl_t ctrl, __u32 nsid, struct nvme_ns_list *list)
+
+ Perform an Admin identify for an active namespace list
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``__u32 nsid``
+ Namespace ID to specify list start
+
+``struct nvme_ns_list *list``
+ List data to populate
+
+**Description**
+
+Perform an Identify command, for the active namespace list starting with
+IDs greater than or equal to **nsid**. Specify :c:type:`NVME_NSID_NONE` for the start
+of the list.
+
+Will return an error if the length of the response data (from the
+controller) is not a full :c:type:`NVME_IDENTIFY_DATA_SIZE`, so **list** will be
+be fully populated on success.
+
+See: :c:type:`struct nvme_ns_list <nvme_ns_list>`
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_identify_primary_ctrl (nvme_mi_ctrl_t ctrl, __u16 cntid, struct nvme_primary_ctrl_cap *cap)
+
+ Perform an Admin identify for primary controller capabilities data structure.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``__u16 cntid``
+ Controller ID to specify
+
+``struct nvme_primary_ctrl_cap *cap``
+ Primary Controller Capabilities data structure to populate
+
+**Description**
+
+Perform an Identify command to get the Primary Controller Capabilities data
+for the controller specified by **cntid**
+
+Will return an error if the length of the response data (from the
+controller) is not a full :c:type:`NVME_IDENTIFY_DATA_SIZE`, so **cap** will be
+be fully populated on success.
+
+See: :c:type:`struct nvme_primary_ctrl_cap <nvme_primary_ctrl_cap>`
+
+**Return**
+
+0 on success, non-zero on failure
+
+
+.. c:function:: int nvme_mi_admin_identify_secondary_ctrl_list (nvme_mi_ctrl_t ctrl, __u32 nsid, __u16 cntid, struct nvme_secondary_ctrl_list *list)
+
+ Perform an Admin identify for a secondary controller list.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``__u32 nsid``
+ Namespace ID to specify list start
+
+``__u16 cntid``
+ Controller ID to specify list start
+
+``struct nvme_secondary_ctrl_list *list``
+ List data to populate
+
+**Description**
+
+Perform an Identify command, for the secondary controllers associated with
+the current primary controller. Only entries with IDs greater than or
+equal to **cntid** are returned.
+
+Will return an error if the length of the response data (from the
+controller) is not a full :c:type:`NVME_IDENTIFY_DATA_SIZE`, so **list** will be
+be fully populated on success.
+
+See: :c:type:`struct nvme_secondary_ctrl_list <nvme_secondary_ctrl_list>`
+
+**Return**
+
+0 on success, non-zero on failure
+
+
+.. c:function:: int nvme_mi_admin_get_log (nvme_mi_ctrl_t ctrl, struct nvme_get_log_args *args)
+
+ Retrieve log page data from controller
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``struct nvme_get_log_args *args``
+ Get Log Page command arguments
+
+**Description**
+
+Performs a Get Log Page Admin command as specified by **args**. Response data
+is stored in **args->data**, which should be a buffer of **args->data_len** bytes.
+Resulting data length is stored in **args->data_len** on successful
+command completion.
+
+This request may be implemented as multiple log page commands, in order
+to fit within MI message-size limits.
+
+See: :c:type:`struct nvme_get_log_args <nvme_get_log_args>`
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_nsid_log (nvme_mi_ctrl_t ctrl, bool rae, enum nvme_cmd_get_log_lid lid, __u32 nsid, __u32 len, void *log)
+
+ Helper for Get Log Page functions
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``bool rae``
+ Retain Asynchronous Events
+
+``enum nvme_cmd_get_log_lid lid``
+ Log identifier
+
+``__u32 nsid``
+ Namespace ID
+
+``__u32 len``
+ length of log buffer
+
+``void *log``
+ pointer for resulting log data
+
+**Description**
+
+Performs a Get Log Page Admin command for a specific log ID **lid** and
+namespace ID **nsid**. Log data is expected to be **len** bytes, and is stored
+in **log** on success. The **rae** flag is passed as-is to the Get Log Page
+command, and is specific to the Log Page requested.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_simple (nvme_mi_ctrl_t ctrl, enum nvme_cmd_get_log_lid lid, __u32 len, void *log)
+
+ Helper for Get Log Page functions with no NSID or RAE requirements
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``enum nvme_cmd_get_log_lid lid``
+ Log identifier
+
+``__u32 len``
+ length of log buffer
+
+``void *log``
+ pointer for resulting log data
+
+**Description**
+
+Performs a Get Log Page Admin command for a specific log ID **lid**, using
+NVME_NSID_ALL for the namespace identifier, and rae set to false.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_supported_log_pages (nvme_mi_ctrl_t ctrl, bool rae, struct nvme_supported_log_pages *log)
+
+ Retrieve nmve supported log pages
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_supported_log_pages *log``
+ Array of LID supported and Effects data structures
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_error (nvme_mi_ctrl_t ctrl, unsigned int nr_entries, bool rae, struct nvme_error_log_page *err_log)
+
+ Retrieve nvme error log
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``unsigned int nr_entries``
+ Number of error log entries allocated
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_error_log_page *err_log``
+ Array of error logs of size 'entries'
+
+**Description**
+
+This log page describes extended error information for a command that
+completed with error, or may report an error that is not specific to a
+particular command.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_smart (nvme_mi_ctrl_t ctrl, __u32 nsid, bool rae, struct nvme_smart_log *smart_log)
+
+ Retrieve nvme smart log
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``__u32 nsid``
+ Optional namespace identifier
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_smart_log *smart_log``
+ User address to store the smart log
+
+**Description**
+
+This log page provides SMART and general health information. The information
+provided is over the life of the controller and is retained across power
+cycles. To request the controller log page, the namespace identifier
+specified is FFFFFFFFh. The controller may also support requesting the log
+page on a per namespace basis, as indicated by bit 0 of the LPA field in the
+Identify Controller data structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_fw_slot (nvme_mi_ctrl_t ctrl, bool rae, struct nvme_firmware_slot *fw_log)
+
+ Retrieves the controller firmware log
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_firmware_slot *fw_log``
+ User address to store the log page
+
+**Description**
+
+This log page describes the firmware revision stored in each firmware slot
+supported. The firmware revision is indicated as an ASCII string. The log
+page also indicates the active slot number.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_changed_ns_list (nvme_mi_ctrl_t ctrl, bool rae, struct nvme_ns_list *ns_log)
+
+ Retrieve namespace changed list
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_ns_list *ns_log``
+ User address to store the log page
+
+**Description**
+
+This log page describes namespaces attached to this controller that have
+changed since the last time the namespace was identified, been added, or
+deleted.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_cmd_effects (nvme_mi_ctrl_t ctrl, enum nvme_csi csi, struct nvme_cmd_effects_log *effects_log)
+
+ Retrieve nvme command effects log
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``enum nvme_csi csi``
+ Command Set Identifier
+
+``struct nvme_cmd_effects_log *effects_log``
+ User address to store the effects log
+
+**Description**
+
+This log page describes the commands that the controller supports and the
+effects of those commands on the state of the NVM subsystem.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_device_self_test (nvme_mi_ctrl_t ctrl, struct nvme_self_test_log *log)
+
+ Retrieve the device self test log
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``struct nvme_self_test_log *log``
+ Userspace address of the log payload
+
+**Description**
+
+The log page indicates the status of an in progress self test and the
+percent complete of that operation, and the results of the previous 20
+self-test operations.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_create_telemetry_host (nvme_mi_ctrl_t ctrl, struct nvme_telemetry_log *log)
+
+ Create host telemetry log
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``struct nvme_telemetry_log *log``
+ Userspace address of the log payload
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_telemetry_host (nvme_mi_ctrl_t ctrl, __u64 offset, __u32 len, void *log)
+
+ Get Telemetry Host-Initiated log page
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``__u64 offset``
+ Offset into the telemetry data
+
+``__u32 len``
+ Length of provided user buffer to hold the log data in bytes
+
+``void *log``
+ User address for log page data
+
+**Description**
+
+Retrieves the Telemetry Host-Initiated log page at the requested offset
+using the previously existing capture.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_telemetry_ctrl (nvme_mi_ctrl_t ctrl, bool rae, __u64 offset, __u32 len, void *log)
+
+ Get Telemetry Controller-Initiated log page
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``bool rae``
+ Retain asynchronous events
+
+``__u64 offset``
+ Offset into the telemetry data
+
+``__u32 len``
+ Length of provided user buffer to hold the log data in bytes
+
+``void *log``
+ User address for log page data
+
+**Description**
+
+Retrieves the Telemetry Controller-Initiated log page at the requested offset
+using the previously existing capture.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_endurance_group (nvme_mi_ctrl_t ctrl, __u16 endgid, struct nvme_endurance_group_log *log)
+
+ Get Endurance Group log
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``__u16 endgid``
+ Starting group identifier to return in the list
+
+``struct nvme_endurance_group_log *log``
+ User address to store the endurance log
+
+**Description**
+
+This log page indicates if an Endurance Group Event has occurred for a
+particular Endurance Group. If an Endurance Group Event has occurred, the
+details of the particular event are included in the Endurance Group
+Information log page for that Endurance Group. An asynchronous event is
+generated when an entry for an Endurance Group is newly added to this log
+page.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_predictable_lat_nvmset (nvme_mi_ctrl_t ctrl, __u16 nvmsetid, struct nvme_nvmset_predictable_lat_log *log)
+
+ Predictable Latency Per NVM Set
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``__u16 nvmsetid``
+ NVM set id
+
+``struct nvme_nvmset_predictable_lat_log *log``
+ User address to store the predictable latency log
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_predictable_lat_event (nvme_mi_ctrl_t ctrl, bool rae, __u32 offset, __u32 len, void *log)
+
+ Retrieve Predictable Latency Event Aggregate Log Page
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``bool rae``
+ Retain asynchronous events
+
+``__u32 offset``
+ Offset into the predictable latency event
+
+``__u32 len``
+ Length of provided user buffer to hold the log data in bytes
+
+``void *log``
+ User address for log page data
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_ana (nvme_mi_ctrl_t ctrl, enum nvme_log_ana_lsp lsp, bool rae, __u64 offset, __u32 len, void *log)
+
+ Retrieve Asymmetric Namespace Access log page
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``enum nvme_log_ana_lsp lsp``
+ Log specific, see :c:type:`enum nvme_get_log_ana_lsp <nvme_get_log_ana_lsp>`
+
+``bool rae``
+ Retain asynchronous events
+
+``__u64 offset``
+ Offset to the start of the log page
+
+``__u32 len``
+ The allocated length of the log page
+
+``void *log``
+ User address to store the ana log
+
+**Description**
+
+This log consists of a header describing the log and descriptors containing
+the asymmetric namespace access information for ANA Groups that contain
+namespaces that are attached to the controller processing the command.
+
+See :c:type:`struct nvme_ana_rsp_hdr <nvme_ana_rsp_hdr>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_ana_groups (nvme_mi_ctrl_t ctrl, bool rae, __u32 len, struct nvme_ana_group_desc *log)
+
+ Retrieve Asymmetric Namespace Access groups only log page
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``bool rae``
+ Retain asynchronous events
+
+``__u32 len``
+ The allocated length of the log page
+
+``struct nvme_ana_group_desc *log``
+ User address to store the ana group log
+
+**Description**
+
+See :c:type:`struct nvme_ana_group_desc <nvme_ana_group_desc>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_lba_status (nvme_mi_ctrl_t ctrl, bool rae, __u64 offset, __u32 len, void *log)
+
+ Retrieve LBA Status
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``bool rae``
+ Retain asynchronous events
+
+``__u64 offset``
+ Offset to the start of the log page
+
+``__u32 len``
+ The allocated length of the log page
+
+``void *log``
+ User address to store the log page
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_endurance_grp_evt (nvme_mi_ctrl_t ctrl, bool rae, __u32 offset, __u32 len, void *log)
+
+ Retrieve Rotational Media Information
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``bool rae``
+ Retain asynchronous events
+
+``__u32 offset``
+ Offset to the start of the log page
+
+``__u32 len``
+ The allocated length of the log page
+
+``void *log``
+ User address to store the log page
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_fid_supported_effects (nvme_mi_ctrl_t ctrl, bool rae, struct nvme_fid_supported_effects_log *log)
+
+ Retrieve Feature Identifiers Supported and Effects
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_fid_supported_effects_log *log``
+ FID Supported and Effects data structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_mi_cmd_supported_effects (nvme_mi_ctrl_t ctrl, bool rae, struct nvme_mi_cmd_supported_effects_log *log)
+
+ displays the MI Commands Supported by the controller
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_mi_cmd_supported_effects_log *log``
+ MI Command Supported and Effects data structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_boot_partition (nvme_mi_ctrl_t ctrl, bool rae, __u8 lsp, __u32 len, struct nvme_boot_partition *part)
+
+ Retrieve Boot Partition
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``bool rae``
+ Retain asynchronous events
+
+``__u8 lsp``
+ The log specified field of LID
+
+``__u32 len``
+ The allocated size, minimum
+ struct nvme_boot_partition
+
+``struct nvme_boot_partition *part``
+ User address to store the log page
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_discovery (nvme_mi_ctrl_t ctrl, bool rae, __u32 offset, __u32 len, void *log)
+
+ Retrieve Discovery log page
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``bool rae``
+ Retain asynchronous events
+
+``__u32 offset``
+ Offset of this log to retrieve
+
+``__u32 len``
+ The allocated size for this portion of the log
+
+``void *log``
+ User address to store the discovery log
+
+**Description**
+
+Supported only by fabrics discovery controllers, returning discovery
+records.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_media_unit_stat (nvme_mi_ctrl_t ctrl, __u16 domid, struct nvme_media_unit_stat_log *mus)
+
+ Retrieve Media Unit Status
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``__u16 domid``
+ Domain Identifier selection, if supported
+
+``struct nvme_media_unit_stat_log *mus``
+ User address to store the Media Unit statistics log
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_support_cap_config_list (nvme_mi_ctrl_t ctrl, __u16 domid, struct nvme_supported_cap_config_list_log *cap)
+
+ Retrieve Supported Capacity Configuration List
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``__u16 domid``
+ Domain Identifier selection, if supported
+
+``struct nvme_supported_cap_config_list_log *cap``
+ User address to store supported capabilities config list
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_reservation (nvme_mi_ctrl_t ctrl, bool rae, struct nvme_resv_notification_log *log)
+
+ Retrieve Reservation Notification
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_resv_notification_log *log``
+ User address to store the reservation log
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_sanitize (nvme_mi_ctrl_t ctrl, bool rae, struct nvme_sanitize_log_page *log)
+
+ Retrieve Sanitize Status
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_sanitize_log_page *log``
+ User address to store the sanitize log
+
+**Description**
+
+The Sanitize Status log page reports sanitize operation time estimates and
+information about the most recent sanitize operation.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_zns_changed_zones (nvme_mi_ctrl_t ctrl, __u32 nsid, bool rae, struct nvme_zns_changed_zone_log *log)
+
+ Retrieve list of zones that have changed
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``__u32 nsid``
+ Namespace ID
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_zns_changed_zone_log *log``
+ User address to store the changed zone log
+
+**Description**
+
+The list of zones that have changed state due to an exceptional event.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_log_persistent_event (nvme_mi_ctrl_t ctrl, enum nvme_pevent_log_action action, __u32 size, void *pevent_log)
+
+ Retrieve Persistent Event Log
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``enum nvme_pevent_log_action action``
+ Action the controller should take during processing this command
+
+``__u32 size``
+ Size of **pevent_log**
+
+``void *pevent_log``
+ User address to store the persistent event log
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_security_send (nvme_mi_ctrl_t ctrl, struct nvme_security_send_args *args)
+
+ Perform a Security Send command on a controller.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``struct nvme_security_send_args *args``
+ Security Send command arguments
+
+**Description**
+
+Performs a Security Send Admin command as specified by **args**. Response data
+is stored in **args->data**, which should be a buffer of **args->data_len** bytes.
+Resulting data length is stored in **args->data_len** on successful
+command completion.
+
+Security Send data length should not be greater than 4096 bytes to
+comply with specification limits.
+
+See: :c:type:`struct nvme_get_log_args <nvme_get_log_args>`
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_security_recv (nvme_mi_ctrl_t ctrl, struct nvme_security_receive_args *args)
+
+ Perform a Security Receive command on a controller.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``struct nvme_security_receive_args *args``
+ Security Receive command arguments
+
+**Description**
+
+Performs a Security Receive Admin command as specified by **args**. Response
+data is stored in **args->data**, which should be a buffer of **args->data_len**
+bytes. Resulting data length is stored in **args->data_len** on successful
+command completion.
+
+Security Receive data length should not be greater than 4096 bytes to
+comply with specification limits.
+
+See: :c:type:`struct nvme_get_log_args <nvme_get_log_args>`
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_features (nvme_mi_ctrl_t ctrl, struct nvme_get_features_args *args)
+
+ Perform a Get Feature command on a controller
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``struct nvme_get_features_args *args``
+ Get Features command arguments
+
+**Description**
+
+Performs a Get Features Admin command as specified by **args**. Returned
+feature data will be stored in **args->result** and **args->data**, depending
+on the specification of the feature itself; most features do not return
+additional data. See section 5.27.1 of the NVMe spec (v2.0b) for
+feature-specific information.
+
+On success, **args->data_len** will be updated with the actual data length
+received.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_features_data (nvme_mi_ctrl_t ctrl, enum nvme_features_id fid, __u32 nsid, __u32 data_len, void *data, __u32 *result)
+
+ Helper function for :c:type:`nvme_mi_admin_get_features`()
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``enum nvme_features_id fid``
+ Feature identifier
+
+``__u32 nsid``
+ Namespace ID, if applicable for **fid**
+
+``__u32 data_len``
+ Length of feature data, if applicable for **fid**, in bytes
+
+``void *data``
+ User address of feature data, if applicable
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Description**
+
+Helper for optionally features that optionally return data, using the
+SEL_CURRENT selector value.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_get_features_simple (nvme_mi_ctrl_t ctrl, enum nvme_features_id fid, __u32 nsid, __u32 *result)
+
+ Get a simple feature value with no data
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``enum nvme_features_id fid``
+ Feature identifier
+
+``__u32 nsid``
+ Namespace id, if required by **fid**
+
+``__u32 *result``
+ output feature data
+
+
+.. c:function:: int nvme_mi_admin_set_features (nvme_mi_ctrl_t ctrl, struct nvme_set_features_args *args)
+
+ Perform a Set Features command on a controller
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``struct nvme_set_features_args *args``
+ Set Features command arguments
+
+**Description**
+
+Performs a Set Features Admin command as specified by **args**. Result
+data will be stored in **args->result**.
+on the specification of the feature itself; most features do not return
+additional data. See section 5.27.1 of the NVMe spec (v2.0b) for
+feature-specific information.
+
+On success, **args->data_len** will be updated with the actual data length
+received.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_ns_mgmt (nvme_mi_ctrl_t ctrl, struct nvme_ns_mgmt_args *args)
+
+ Issue a Namespace Management command
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``struct nvme_ns_mgmt_args *args``
+ Namespace management command arguments
+
+**Description**
+
+Issues a Namespace Management command to **ctrl**, with arguments specified
+from **args**.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_ns_mgmt_create (nvme_mi_ctrl_t ctrl, struct nvme_id_ns *ns, __u8 csi, __u32 *nsid)
+
+ Helper for Namespace Management Create command
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``struct nvme_id_ns *ns``
+ New namespace parameters
+
+``__u8 csi``
+ Command Set Identifier for new NS
+
+``__u32 *nsid``
+ Set to new namespace ID on create
+
+**Description**
+
+Issues a Namespace Management (Create) command to **ctrl**, to create a
+new namespace specified by **ns**, using command set **csi**. On success,
+the new namespace ID will be written to **nsid**.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_ns_mgmt_delete (nvme_mi_ctrl_t ctrl, __u32 nsid)
+
+ Helper for Namespace Management Delete command
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``__u32 nsid``
+ Namespace ID to delete
+
+**Description**
+
+Issues a Namespace Management (Delete) command to **ctrl**, to delete the
+namespace with id **nsid**.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_ns_attach (nvme_mi_ctrl_t ctrl, struct nvme_ns_attach_args *args)
+
+ Attach or detach namespace to controller(s)
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``struct nvme_ns_attach_args *args``
+ Namespace Attach command arguments
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_ns_attach_ctrls (nvme_mi_ctrl_t ctrl, __u32 nsid, struct nvme_ctrl_list *ctrlist)
+
+ Attach namespace to controllers
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``__u32 nsid``
+ Namespace ID to attach
+
+``struct nvme_ctrl_list *ctrlist``
+ Controller list to modify attachment state of nsid
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_ns_detach_ctrls (nvme_mi_ctrl_t ctrl, __u32 nsid, struct nvme_ctrl_list *ctrlist)
+
+ Detach namespace from controllers
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``__u32 nsid``
+ Namespace ID to detach
+
+``struct nvme_ctrl_list *ctrlist``
+ Controller list to modify attachment state of nsid
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_fw_download (nvme_mi_ctrl_t ctrl, struct nvme_fw_download_args *args)
+
+ Download part or all of a firmware image to the controller
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send firmware data to
+
+``struct nvme_fw_download_args *args``
+ :c:type:`struct nvme_fw_download_args <nvme_fw_download_args>` argument structure
+
+**Description**
+
+The Firmware Image Download command downloads all or a portion of an image
+for a future update to the controller. The Firmware Image Download command
+downloads a new image (in whole or in part) to the controller.
+
+The image may be constructed of multiple pieces that are individually
+downloaded with separate Firmware Image Download commands. Each Firmware
+Image Download command includes a Dword Offset and Number of Dwords that
+specify a dword range.
+
+The new firmware image is not activated as part of the Firmware Image
+Download command. Use the nvme_mi_admin_fw_commit() to activate a newly
+downloaded image.
+
+**Return**
+
+0 on success, non-zero on failure
+
+
+.. c:function:: int nvme_mi_admin_fw_commit (nvme_mi_ctrl_t ctrl, struct nvme_fw_commit_args *args)
+
+ Commit firmware using the specified action
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send firmware data to
+
+``struct nvme_fw_commit_args *args``
+ :c:type:`struct nvme_fw_download_args <nvme_fw_download_args>` argument structure
+
+**Description**
+
+The Firmware Commit command modifies the firmware image or Boot Partitions.
+
+**Return**
+
+0 on success, non-zero on failure
+
+
+.. c:function:: int nvme_mi_admin_format_nvm (nvme_mi_ctrl_t ctrl, struct nvme_format_nvm_args *args)
+
+ Format NVMe namespace
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``struct nvme_format_nvm_args *args``
+ Format NVM command arguments
+
+**Description**
+
+Perform a low-level format to set the LBA data & metadata size. May destroy
+data & metadata on the specified namespaces
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_mi_admin_sanitize_nvm (nvme_mi_ctrl_t ctrl, struct nvme_sanitize_nvm_args *args)
+
+ Start a subsystem Sanitize operation
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``struct nvme_sanitize_nvm_args *args``
+ Sanitize command arguments
+
+**Description**
+
+A sanitize operation alters all user data in the NVM subsystem such that
+recovery of any previous user data from any cache, the non-volatile media,
+or any Controller Memory Buffer is not possible.
+
+The Sanitize command starts a sanitize operation or to recover from a
+previously failed sanitize operation. The sanitize operation types that may
+be supported are Block Erase, Crypto Erase, and Overwrite. All sanitize
+operations are processed in the background, i.e., completion of the sanitize
+command does not indicate completion of the sanitize operation.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
diff --git a/doc/rst/tree.rst b/doc/rst/tree.rst
new file mode 100644
index 0000000..9a8bb3f
--- /dev/null
+++ b/doc/rst/tree.rst
@@ -0,0 +1,2205 @@
+.. _tree.h:
+
+**tree.h**
+
+
+libnvme tree object interface
+
+.. c:function:: nvme_root_t nvme_create_root (FILE *fp, int log_level)
+
+ Initialize root object
+
+**Parameters**
+
+``FILE *fp``
+ File descriptor for logging messages
+
+``int log_level``
+ Logging level to use
+
+**Return**
+
+Initialized :c:type:`nvme_root_t` object
+
+
+.. c:function:: void nvme_free_tree (nvme_root_t r)
+
+ Free root object
+
+**Parameters**
+
+``nvme_root_t r``
+ :c:type:`nvme_root_t` object
+
+**Description**
+
+Free an :c:type:`nvme_root_t` object and all attached objects
+
+
+.. c:function:: nvme_host_t nvme_first_host (nvme_root_t r)
+
+ Start host iterator
+
+**Parameters**
+
+``nvme_root_t r``
+ :c:type:`nvme_root_t` object
+
+**Return**
+
+First :c:type:`nvme_host_t` object in an iterator
+
+
+.. c:function:: nvme_host_t nvme_next_host (nvme_root_t r, nvme_host_t h)
+
+ Next host iterator
+
+**Parameters**
+
+``nvme_root_t r``
+ :c:type:`nvme_root_t` object
+
+``nvme_host_t h``
+ Previous :c:type:`nvme_host_t` iterator
+
+**Return**
+
+Next :c:type:`nvme_host_t` object in an iterator
+
+
+.. c:function:: nvme_root_t nvme_host_get_root (nvme_host_t h)
+
+ Returns nvme_root_t object
+
+**Parameters**
+
+``nvme_host_t h``
+ :c:type:`nvme_host_t` object
+
+**Return**
+
+:c:type:`nvme_root_t` object from **h**
+
+
+.. c:function:: nvme_host_t nvme_lookup_host (nvme_root_t r, const char *hostnqn, const char *hostid)
+
+ Lookup nvme_host_t object
+
+**Parameters**
+
+``nvme_root_t r``
+ :c:type:`nvme_root_t` object
+
+``const char *hostnqn``
+ Host NQN
+
+``const char *hostid``
+ Host ID
+
+**Description**
+
+Lookup a nvme_host_t object based on **hostnqn** and **hostid**
+or create one if not found.
+
+**Return**
+
+:c:type:`nvme_host_t` object
+
+
+.. c:function:: const char * nvme_host_get_dhchap_key (nvme_host_t h)
+
+ Return host key
+
+**Parameters**
+
+``nvme_host_t h``
+ Host for which the key should be returned
+
+**Return**
+
+DH-HMAC-CHAP host key or NULL if not set
+
+
+.. c:function:: void nvme_host_set_dhchap_key (nvme_host_t h, const char *key)
+
+ set host key
+
+**Parameters**
+
+``nvme_host_t h``
+ Host for which the key should be set
+
+``const char *key``
+ DH-HMAC-CHAP Key to set or NULL to clear existing key
+
+
+.. c:function:: void nvme_host_set_pdc_enabled (nvme_host_t h, bool enabled)
+
+ Set Persistent Discovery Controller flag
+
+**Parameters**
+
+``nvme_host_t h``
+ Host for which the falg should be set
+
+``bool enabled``
+ The bool to set the enabled flag
+
+**Description**
+
+When nvme_host_set_pdc_enabled() is not used to set the PDC flag,
+nvme_host_is_pdc_enabled() will return the default value which was
+passed into the function and not the undefined flag value.
+
+
+.. c:function:: bool nvme_host_is_pdc_enabled (nvme_host_t h, bool fallback)
+
+ Is Persistenct Discovery Controller enabled
+
+**Parameters**
+
+``nvme_host_t h``
+ Host which to check if PDC is enabled
+
+``bool fallback``
+ The fallback default value of the flag when
+ **nvme_host_set_pdc_enabled** has not be used
+ to set the flag.
+
+**Return**
+
+true if PDC is enabled for **h**, else false
+
+
+.. c:function:: nvme_host_t nvme_default_host (nvme_root_t r)
+
+ Initializes the default host
+
+**Parameters**
+
+``nvme_root_t r``
+ :c:type:`nvme_root_t` object
+
+**Description**
+
+Initializes the default host object based on the values in
+/etc/nvme/hostnqn and /etc/nvme/hostid and attaches it to **r**.
+
+**Return**
+
+:c:type:`nvme_host_t` object
+
+
+.. c:function:: nvme_subsystem_t nvme_first_subsystem (nvme_host_t h)
+
+ Start subsystem iterator
+
+**Parameters**
+
+``nvme_host_t h``
+ :c:type:`nvme_host_t` object
+
+**Return**
+
+first :c:type:`nvme_subsystem_t` object in an iterator
+
+
+.. c:function:: nvme_subsystem_t nvme_next_subsystem (nvme_host_t h, nvme_subsystem_t s)
+
+ Next subsystem iterator
+
+**Parameters**
+
+``nvme_host_t h``
+ :c:type:`nvme_host_t` object
+
+``nvme_subsystem_t s``
+ Previous :c:type:`nvme_subsystem_t` iterator
+
+**Return**
+
+next :c:type:`nvme_subsystem_t` object in an iterator
+
+
+.. c:function:: nvme_subsystem_t nvme_lookup_subsystem (struct nvme_host *h, const char *name, const char *subsysnqn)
+
+ Lookup nvme_subsystem_t object
+
+**Parameters**
+
+``struct nvme_host *h``
+ :c:type:`nvme_host_t` object
+
+``const char *name``
+ Name of the subsystem (may be NULL)
+
+``const char *subsysnqn``
+ Subsystem NQN
+
+**Description**
+
+Lookup a :c:type:`nvme_subsystem_t` object in **h** base on **name** (if present)
+and **subsysnqn** or create one if not found.
+
+**Return**
+
+nvme_subsystem_t object
+
+
+.. c:function:: void nvme_free_subsystem (struct nvme_subsystem *s)
+
+ Free a subsystem
+
+**Parameters**
+
+``struct nvme_subsystem *s``
+ subsystem
+
+**Description**
+
+Frees **s** and all related objects.
+
+
+.. c:function:: nvme_host_t nvme_subsystem_get_host (nvme_subsystem_t s)
+
+ Returns nvme_host_t object
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ subsystem
+
+**Return**
+
+:c:type:`nvme_host_t` object from **s**
+
+
+.. c:function:: nvme_ns_t nvme_ctrl_first_ns (nvme_ctrl_t c)
+
+ Start namespace iterator
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+First :c:type:`nvme_ns_t` object of an **c** iterator
+
+
+.. c:function:: nvme_ns_t nvme_ctrl_next_ns (nvme_ctrl_t c, nvme_ns_t n)
+
+ Next namespace iterator
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+``nvme_ns_t n``
+ Previous nvme_ns_t iterator
+
+**Return**
+
+Next nvme_ns_t object of an **c** iterator
+
+
+.. c:function:: nvme_path_t nvme_ctrl_first_path (nvme_ctrl_t c)
+
+ Start path iterator
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+First :c:type:`nvme_path_t` object of an **c** iterator
+
+
+.. c:function:: nvme_path_t nvme_ctrl_next_path (nvme_ctrl_t c, nvme_path_t p)
+
+ Next path iterator
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+``nvme_path_t p``
+ Previous :c:type:`nvme_path_t` object of an **c** iterator
+
+**Return**
+
+Next :c:type:`nvme_path_t` object of an **c** iterator
+
+
+.. c:function:: nvme_ctrl_t nvme_subsystem_first_ctrl (nvme_subsystem_t s)
+
+ First ctrl iterator
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ :c:type:`nvme_subsystem_t` object
+
+**Return**
+
+First controller of an **s** iterator
+
+
+.. c:function:: nvme_ctrl_t nvme_subsystem_next_ctrl (nvme_subsystem_t s, nvme_ctrl_t c)
+
+ Next ctrl iterator
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ :c:type:`nvme_subsystem_t` object
+
+``nvme_ctrl_t c``
+ Previous controller instance of an **s** iterator
+
+**Return**
+
+Next controller of an **s** iterator
+
+
+.. c:function:: nvme_path_t nvme_namespace_first_path (nvme_ns_t ns)
+
+ Start path iterator
+
+**Parameters**
+
+``nvme_ns_t ns``
+ Namespace instance
+
+**Return**
+
+First :c:type:`nvme_path_t` object of an **ns** iterator
+
+
+.. c:function:: nvme_path_t nvme_namespace_next_path (nvme_ns_t ns, nvme_path_t p)
+
+ Next path iterator
+
+**Parameters**
+
+``nvme_ns_t ns``
+ Namespace instance
+
+``nvme_path_t p``
+ Previous :c:type:`nvme_path_t` object of an **ns** iterator
+
+**Return**
+
+Next :c:type:`nvme_path_t` object of an **ns** iterator
+
+
+.. c:function:: nvme_ctrl_t nvme_lookup_ctrl (nvme_subsystem_t s, const char *transport, const char *traddr, const char *host_traddr, const char *host_iface, const char *trsvcid, nvme_ctrl_t p)
+
+ Lookup nvme_ctrl_t object
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ :c:type:`nvme_subsystem_t` object
+
+``const char *transport``
+ Transport name
+
+``const char *traddr``
+ Transport address
+
+``const char *host_traddr``
+ Host transport address
+
+``const char *host_iface``
+ Host interface name
+
+``const char *trsvcid``
+ Transport service identifier
+
+``nvme_ctrl_t p``
+ Previous controller instance
+
+**Description**
+
+Lookup a controller in **s** based on **transport**, **traddr**,
+**host_traddr**, **host_iface**, and **trsvcid**. **transport** must be specified,
+other fields may be required depending on the transport. A new
+object is created if none is found. If **p** is specified the lookup
+will start at **p** instead of the first controller.
+
+**Return**
+
+Controller instance
+
+
+.. c:function:: nvme_ctrl_t nvme_create_ctrl (nvme_root_t r, const char *subsysnqn, const char *transport, const char *traddr, const char *host_traddr, const char *host_iface, const char *trsvcid)
+
+ Allocate an unconnected NVMe controller
+
+**Parameters**
+
+``nvme_root_t r``
+ NVMe root element
+
+``const char *subsysnqn``
+ Subsystem NQN
+
+``const char *transport``
+ Transport type
+
+``const char *traddr``
+ Transport address
+
+``const char *host_traddr``
+ Host transport address
+
+``const char *host_iface``
+ Host interface name
+
+``const char *trsvcid``
+ Transport service ID
+
+**Description**
+
+Creates an unconnected controller to be used for nvme_add_ctrl().
+
+**Return**
+
+Controller instance
+
+
+.. c:function:: nvme_ns_t nvme_subsystem_first_ns (nvme_subsystem_t s)
+
+ Start namespace iterator
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ :c:type:`nvme_subsystem_t` object
+
+**Return**
+
+First :c:type:`nvme_ns_t` object of an **s** iterator
+
+
+.. c:function:: nvme_ns_t nvme_subsystem_next_ns (nvme_subsystem_t s, nvme_ns_t n)
+
+ Next namespace iterator
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ :c:type:`nvme_subsystem_t` object
+
+``nvme_ns_t n``
+ Previous :c:type:`nvme_ns_t` iterator
+
+**Return**
+
+Next :c:type:`nvme_ns_t` object of an **s** iterator
+
+
+.. c:macro:: nvme_for_each_host_safe
+
+``nvme_for_each_host_safe (r, h, _h)``
+
+ Traverse host list
+
+**Parameters**
+
+``r``
+ :c:type:`nvme_root_t` object
+
+``h``
+ :c:type:`nvme_host_t` object
+
+``_h``
+ Temporary :c:type:`nvme_host_t` object
+
+
+.. c:macro:: nvme_for_each_host
+
+``nvme_for_each_host (r, h)``
+
+ Traverse host list
+
+**Parameters**
+
+``r``
+ :c:type:`nvme_root_t` object
+
+``h``
+ :c:type:`nvme_host_t` object
+
+
+.. c:macro:: nvme_for_each_subsystem_safe
+
+``nvme_for_each_subsystem_safe (h, s, _s)``
+
+ Traverse subsystems
+
+**Parameters**
+
+``h``
+ :c:type:`nvme_host_t` object
+
+``s``
+ :c:type:`nvme_subsystem_t` object
+
+``_s``
+ Temporary :c:type:`nvme_subsystem_t` object
+
+
+.. c:macro:: nvme_for_each_subsystem
+
+``nvme_for_each_subsystem (h, s)``
+
+ Traverse subsystems
+
+**Parameters**
+
+``h``
+ :c:type:`nvme_host_t` object
+
+``s``
+ :c:type:`nvme_subsystem_t` object
+
+
+.. c:macro:: nvme_subsystem_for_each_ctrl_safe
+
+``nvme_subsystem_for_each_ctrl_safe (s, c, _c)``
+
+ Traverse controllers
+
+**Parameters**
+
+``s``
+ :c:type:`nvme_subsystem_t` object
+
+``c``
+ Controller instance
+
+``_c``
+ A :c:type:`nvme_ctrl_t_node` to use as temporary storage
+
+
+.. c:macro:: nvme_subsystem_for_each_ctrl
+
+``nvme_subsystem_for_each_ctrl (s, c)``
+
+ Traverse controllers
+
+**Parameters**
+
+``s``
+ :c:type:`nvme_subsystem_t` object
+
+``c``
+ Controller instance
+
+
+.. c:macro:: nvme_ctrl_for_each_ns_safe
+
+``nvme_ctrl_for_each_ns_safe (c, n, _n)``
+
+ Traverse namespaces
+
+**Parameters**
+
+``c``
+ Controller instance
+
+``n``
+ :c:type:`nvme_ns_t` object
+
+``_n``
+ A :c:type:`nvme_ns_t_node` to use as temporary storage
+
+
+.. c:macro:: nvme_ctrl_for_each_ns
+
+``nvme_ctrl_for_each_ns (c, n)``
+
+ Traverse namespaces
+
+**Parameters**
+
+``c``
+ Controller instance
+
+``n``
+ :c:type:`nvme_ns_t` object
+
+
+.. c:macro:: nvme_ctrl_for_each_path_safe
+
+``nvme_ctrl_for_each_path_safe (c, p, _p)``
+
+ Traverse paths
+
+**Parameters**
+
+``c``
+ Controller instance
+
+``p``
+ :c:type:`nvme_path_t` object
+
+``_p``
+ A :c:type:`nvme_path_t_node` to use as temporary storage
+
+
+.. c:macro:: nvme_ctrl_for_each_path
+
+``nvme_ctrl_for_each_path (c, p)``
+
+ Traverse paths
+
+**Parameters**
+
+``c``
+ Controller instance
+
+``p``
+ :c:type:`nvme_path_t` object
+
+
+.. c:macro:: nvme_subsystem_for_each_ns_safe
+
+``nvme_subsystem_for_each_ns_safe (s, n, _n)``
+
+ Traverse namespaces
+
+**Parameters**
+
+``s``
+ :c:type:`nvme_subsystem_t` object
+
+``n``
+ :c:type:`nvme_ns_t` object
+
+``_n``
+ A :c:type:`nvme_ns_t_node` to use as temporary storage
+
+
+.. c:macro:: nvme_subsystem_for_each_ns
+
+``nvme_subsystem_for_each_ns (s, n)``
+
+ Traverse namespaces
+
+**Parameters**
+
+``s``
+ :c:type:`nvme_subsystem_t` object
+
+``n``
+ :c:type:`nvme_ns_t` object
+
+
+.. c:macro:: nvme_namespace_for_each_path_safe
+
+``nvme_namespace_for_each_path_safe (n, p, _p)``
+
+ Traverse paths
+
+**Parameters**
+
+``n``
+ Namespace instance
+
+``p``
+ :c:type:`nvme_path_t` object
+
+``_p``
+ A :c:type:`nvme_path_t_node` to use as temporary storage
+
+
+.. c:macro:: nvme_namespace_for_each_path
+
+``nvme_namespace_for_each_path (n, p)``
+
+ Traverse paths
+
+**Parameters**
+
+``n``
+ Namespace instance
+
+``p``
+ :c:type:`nvme_path_t` object
+
+
+.. c:function:: int nvme_ns_get_fd (nvme_ns_t n)
+
+ Get associated file descriptor
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+File descriptor associated with **n** or -1
+
+
+.. c:function:: int nvme_ns_get_nsid (nvme_ns_t n)
+
+ NSID of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+NSID of **n**
+
+
+.. c:function:: int nvme_ns_get_lba_size (nvme_ns_t n)
+
+ LBA size of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+LBA size of **n**
+
+
+.. c:function:: int nvme_ns_get_meta_size (nvme_ns_t n)
+
+ Metadata size of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+Metadata size of **n**
+
+
+.. c:function:: uint64_t nvme_ns_get_lba_count (nvme_ns_t n)
+
+ LBA count of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+LBA count of **n**
+
+
+.. c:function:: uint64_t nvme_ns_get_lba_util (nvme_ns_t n)
+
+ LBA utilization of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+LBA utilization of **n**
+
+
+.. c:function:: enum nvme_csi nvme_ns_get_csi (nvme_ns_t n)
+
+ Command set identifier of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+The namespace's command set identifier in use
+
+
+.. c:function:: const uint8_t * nvme_ns_get_eui64 (nvme_ns_t n)
+
+ 64-bit eui of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+A pointer to the 64-bit eui
+
+
+.. c:function:: const uint8_t * nvme_ns_get_nguid (nvme_ns_t n)
+
+ 128-bit nguid of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+A pointer to the 128-bit nguid
+
+
+.. c:function:: void nvme_ns_get_uuid (nvme_ns_t n, unsigned char out[NVME_UUID_LEN])
+
+ UUID of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``unsigned char out[NVME_UUID_LEN]``
+ buffer for the UUID
+
+**Description**
+
+Copies the namespace's uuid into **out**
+
+
+.. c:function:: const char * nvme_ns_get_sysfs_dir (nvme_ns_t n)
+
+ sysfs directory of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+sysfs directory name of **n**
+
+
+.. c:function:: const char * nvme_ns_get_name (nvme_ns_t n)
+
+ sysfs name of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+sysfs name of **n**
+
+
+.. c:function:: const char * nvme_ns_get_generic_name (nvme_ns_t n)
+
+ Returns name of generic namespace chardev.
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+Name of generic namespace chardev
+
+
+.. c:function:: const char * nvme_ns_get_firmware (nvme_ns_t n)
+
+ Firmware string of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+Firmware string of **n**
+
+
+.. c:function:: const char * nvme_ns_get_serial (nvme_ns_t n)
+
+ Serial number of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+Serial number string of **n**
+
+
+.. c:function:: const char * nvme_ns_get_model (nvme_ns_t n)
+
+ Model of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+Model string of **n**
+
+
+.. c:function:: nvme_subsystem_t nvme_ns_get_subsystem (nvme_ns_t n)
+
+ :c:type:`nvme_subsystem_t` of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+nvme_subsystem_t object of **n**
+
+
+.. c:function:: nvme_ctrl_t nvme_ns_get_ctrl (nvme_ns_t n)
+
+ :c:type:`nvme_ctrl_t` of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Description**
+
+nvme_ctrl_t object may be NULL for a multipathed namespace
+
+**Return**
+
+nvme_ctrl_t object of **n** if present
+
+
+.. c:function:: void nvme_free_ns (struct nvme_ns *n)
+
+ Free a namespace object
+
+**Parameters**
+
+``struct nvme_ns *n``
+ Namespace instance
+
+
+.. c:function:: int nvme_ns_read (nvme_ns_t n, void *buf, off_t offset, size_t count)
+
+ Read from a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``void *buf``
+ Buffer into which the data will be transferred
+
+``off_t offset``
+ LBA offset of **n**
+
+``size_t count``
+ Number of sectors in **buf**
+
+**Return**
+
+Number of sectors read or -1 on error.
+
+
+.. c:function:: int nvme_ns_write (nvme_ns_t n, void *buf, off_t offset, size_t count)
+
+ Write to a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``void *buf``
+ Buffer with data to be written
+
+``off_t offset``
+ LBA offset of **n**
+
+``size_t count``
+ Number of sectors in **buf**
+
+**Return**
+
+Number of sectors written or -1 on error
+
+
+.. c:function:: int nvme_ns_verify (nvme_ns_t n, off_t offset, size_t count)
+
+ Verify data on a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``off_t offset``
+ LBA offset of **n**
+
+``size_t count``
+ Number of sectors to be verified
+
+**Return**
+
+Number of sectors verified
+
+
+.. c:function:: int nvme_ns_compare (nvme_ns_t n, void *buf, off_t offset, size_t count)
+
+ Compare data on a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``void *buf``
+ Buffer with data to be compared
+
+``off_t offset``
+ LBA offset of **n**
+
+``size_t count``
+ Number of sectors in **buf**
+
+**Return**
+
+Number of sectors compared
+
+
+.. c:function:: int nvme_ns_write_zeros (nvme_ns_t n, off_t offset, size_t count)
+
+ Write zeros to a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``off_t offset``
+ LBA offset in **n**
+
+``size_t count``
+ Number of sectors to be written
+
+**Return**
+
+Number of sectors written
+
+
+.. c:function:: int nvme_ns_write_uncorrectable (nvme_ns_t n, off_t offset, size_t count)
+
+ Issus a 'write uncorrectable' command
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``off_t offset``
+ LBA offset in **n**
+
+``size_t count``
+ Number of sectors to be written
+
+**Return**
+
+Number of sectors written
+
+
+.. c:function:: int nvme_ns_flush (nvme_ns_t n)
+
+ Flush data to a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+0 on success, -1 on error.
+
+
+.. c:function:: int nvme_ns_identify (nvme_ns_t n, struct nvme_id_ns *ns)
+
+ Issue an 'identify namespace' command
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``struct nvme_id_ns *ns``
+ :c:type:`nvme_id_ns` buffer
+
+**Description**
+
+Writes the data returned by the 'identify namespace' command
+into **ns**.
+
+**Return**
+
+0 on success, -1 on error.
+
+
+.. c:function:: int nvme_ns_identify_descs (nvme_ns_t n, struct nvme_ns_id_desc *descs)
+
+ Issue an 'identify descriptors' command
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``struct nvme_ns_id_desc *descs``
+ List of identify descriptors
+
+**Description**
+
+Writes the data returned by the 'identify descriptors' command
+into **descs**.
+
+**Return**
+
+0 on success, -1 on error.
+
+
+.. c:function:: const char * nvme_path_get_name (nvme_path_t p)
+
+ sysfs name of an :c:type:`nvme_path_t` object
+
+**Parameters**
+
+``nvme_path_t p``
+ :c:type:`nvme_path_t` object
+
+**Return**
+
+sysfs name of **p**
+
+
+.. c:function:: const char * nvme_path_get_sysfs_dir (nvme_path_t p)
+
+ sysfs directory of an nvme_path_t object
+
+**Parameters**
+
+``nvme_path_t p``
+ :c:type:`nvme_path_t` object
+
+**Return**
+
+sysfs directory of **p**
+
+
+.. c:function:: const char * nvme_path_get_ana_state (nvme_path_t p)
+
+ ANA state of an nvme_path_t object
+
+**Parameters**
+
+``nvme_path_t p``
+ :c:type:`nvme_path_t` object
+
+**Return**
+
+ANA (Asynchronous Namespace Access) state of **p**
+
+
+.. c:function:: nvme_ctrl_t nvme_path_get_ctrl (nvme_path_t p)
+
+ Parent controller of an nvme_path_t object
+
+**Parameters**
+
+``nvme_path_t p``
+ :c:type:`nvme_path_t` object
+
+**Return**
+
+Parent controller if present
+
+
+.. c:function:: nvme_ns_t nvme_path_get_ns (nvme_path_t p)
+
+ Parent namespace of an nvme_path_t object
+
+**Parameters**
+
+``nvme_path_t p``
+ :c:type:`nvme_path_t` object
+
+**Return**
+
+Parent namespace if present
+
+
+.. c:function:: int nvme_ctrl_get_fd (nvme_ctrl_t c)
+
+ Get associated file descriptor
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+File descriptor associated with **c** or -1
+
+
+.. c:function:: const char * nvme_ctrl_get_name (nvme_ctrl_t c)
+
+ sysfs name of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+sysfs name of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_sysfs_dir (nvme_ctrl_t c)
+
+ sysfs directory of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+sysfs directory name of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_address (nvme_ctrl_t c)
+
+ Address string of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+NVMe-over-Fabrics address string of **c** or empty string
+of no address is present.
+
+
+.. c:function:: const char * nvme_ctrl_get_firmware (nvme_ctrl_t c)
+
+ Firmware string of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Firmware string of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_model (nvme_ctrl_t c)
+
+ Model of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Model string of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_state (nvme_ctrl_t c)
+
+ Running state of an controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+String indicating the running state of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_numa_node (nvme_ctrl_t c)
+
+ NUMA node of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+String indicating the NUMA node
+
+
+.. c:function:: const char * nvme_ctrl_get_queue_count (nvme_ctrl_t c)
+
+ Queue count of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Queue count of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_serial (nvme_ctrl_t c)
+
+ Serial number of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Serial number string of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_sqsize (nvme_ctrl_t c)
+
+ SQ size of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+SQ size (as string) of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_transport (nvme_ctrl_t c)
+
+ Transport type of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Transport type of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_subsysnqn (nvme_ctrl_t c)
+
+ Subsystem NQN of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Subsystem NQN of **c**
+
+
+.. c:function:: nvme_subsystem_t nvme_ctrl_get_subsystem (nvme_ctrl_t c)
+
+ Parent subsystem of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Parent nvme_subsystem_t object
+
+
+.. c:function:: const char * nvme_ctrl_get_traddr (nvme_ctrl_t c)
+
+ Transport address of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Transport address of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_trsvcid (nvme_ctrl_t c)
+
+ Transport service identifier of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Transport service identifier of **c** (if present)
+
+
+.. c:function:: const char * nvme_ctrl_get_host_traddr (nvme_ctrl_t c)
+
+ Host transport address of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Host transport address of **c** (if present)
+
+
+.. c:function:: const char * nvme_ctrl_get_host_iface (nvme_ctrl_t c)
+
+ Host interface name of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Host interface name of **c** (if present)
+
+
+.. c:function:: const char * nvme_ctrl_get_dhchap_host_key (nvme_ctrl_t c)
+
+ Return host key
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller to be checked
+
+**Return**
+
+DH-HMAC-CHAP host key or NULL if not set
+
+
+.. c:function:: void nvme_ctrl_set_dhchap_host_key (nvme_ctrl_t c, const char *key)
+
+ Set host key
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Host for which the key should be set
+
+``const char *key``
+ DH-HMAC-CHAP Key to set or NULL to clear existing key
+
+
+.. c:function:: const char * nvme_ctrl_get_dhchap_key (nvme_ctrl_t c)
+
+ Return controller key
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller for which the key should be set
+
+**Return**
+
+DH-HMAC-CHAP controller key or NULL if not set
+
+
+.. c:function:: void nvme_ctrl_set_dhchap_key (nvme_ctrl_t c, const char *key)
+
+ Set controller key
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller for which the key should be set
+
+``const char *key``
+ DH-HMAC-CHAP Key to set or NULL to clear existing key
+
+
+.. c:function:: struct nvme_fabrics_config * nvme_ctrl_get_config (nvme_ctrl_t c)
+
+ Fabrics configuration of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Fabrics configuration of **c**
+
+
+.. c:function:: void nvme_ctrl_set_discovered (nvme_ctrl_t c, bool discovered)
+
+ Set the 'discovered' flag
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ nvme_ctrl_t object
+
+``bool discovered``
+ Value of the 'discovered' flag
+
+**Description**
+
+Set the 'discovered' flag of **c** to **discovered**
+
+
+.. c:function:: bool nvme_ctrl_is_discovered (nvme_ctrl_t c)
+
+ Returns the value of the 'discovered' flag
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Value of the 'discovered' flag of **c**
+
+
+.. c:function:: void nvme_ctrl_set_persistent (nvme_ctrl_t c, bool persistent)
+
+ Set the 'persistent' flag
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+``bool persistent``
+ value of the 'persistent' flag
+
+**Description**
+
+Set the 'persistent' flag of **c** to **persistent**
+
+
+.. c:function:: bool nvme_ctrl_is_persistent (nvme_ctrl_t c)
+
+ Returns the value of the 'persistent' flag
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Value of the 'persistent' flag of **c**
+
+
+.. c:function:: void nvme_ctrl_set_discovery_ctrl (nvme_ctrl_t c, bool discovery)
+
+ Set the 'discovery_ctrl' flag
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller to be modified
+
+``bool discovery``
+ value of the discovery_ctrl flag
+
+**Description**
+
+Sets the 'discovery_ctrl' flag in **c** to specify whether
+**c** connects to a discovery subsystem.
+
+
+.. c:function:: bool nvme_ctrl_is_discovery_ctrl (nvme_ctrl_t c)
+
+ Check the 'discovery_ctrl' flag
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller to be checked
+
+**Description**
+
+Returns the value of the 'discovery_ctrl' flag which specifies whether
+**c** connects to a discovery subsystem.
+
+**Return**
+
+Value of the 'discover_ctrl' flag
+
+
+.. c:function:: void nvme_ctrl_set_unique_discovery_ctrl (nvme_ctrl_t c, bool unique)
+
+ Set the 'unique_discovery_ctrl' flag
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller to be modified
+
+``bool unique``
+ value of the unique_disc_ctrl flag
+
+**Description**
+
+Sets the 'unique_discovery_ctrl' flag in **c** to specify wheter
+**c** is a unique discovery controller
+
+
+.. c:function:: bool nvme_ctrl_is_unique_discovery_ctrl (nvme_ctrl_t c)
+
+ Check the 'unique_discovery_ctrl' flag
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller to be checked
+
+**Return**
+
+Value of the 'unique_discovery_ctrl' flag
+
+
+.. c:function:: int nvme_ctrl_identify (nvme_ctrl_t c, struct nvme_id_ctrl *id)
+
+ Issues an 'identify controller' command
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+``struct nvme_id_ctrl *id``
+ Identify controller data structure
+
+**Description**
+
+Issues an 'identify controller' command to **c** and copies the
+data into **id**.
+
+**Return**
+
+0 on success or -1 on failure.
+
+
+.. c:function:: int nvme_disconnect_ctrl (nvme_ctrl_t c)
+
+ Disconnect a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Description**
+
+Issues a 'disconnect' fabrics command to **c**
+
+**Return**
+
+0 on success, -1 on failure.
+
+
+.. c:function:: nvme_ctrl_t nvme_scan_ctrl (nvme_root_t r, const char *name)
+
+ Scan on a controller
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t object
+
+``const char *name``
+ Name of the controller
+
+**Description**
+
+Scans a controller with sysfs name **name** and add it to **r**.
+
+**Return**
+
+nvme_ctrl_t object
+
+
+.. c:function:: void nvme_rescan_ctrl (nvme_ctrl_t c)
+
+ Rescan an existing controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+
+.. c:function:: int nvme_init_ctrl (nvme_host_t h, nvme_ctrl_t c, int instance)
+
+ Initialize nvme_ctrl_t object for an existing controller.
+
+**Parameters**
+
+``nvme_host_t h``
+ nvme_host_t object
+
+``nvme_ctrl_t c``
+ nvme_ctrl_t object
+
+``int instance``
+ Instance number (e.g. 1 for nvme1)
+
+**Return**
+
+The ioctl() return code. Typically 0 on success.
+
+
+.. c:function:: void nvme_free_ctrl (struct nvme_ctrl *c)
+
+ Free controller
+
+**Parameters**
+
+``struct nvme_ctrl *c``
+ Controller instance
+
+
+.. c:function:: void nvme_unlink_ctrl (struct nvme_ctrl *c)
+
+ Unlink controller
+
+**Parameters**
+
+``struct nvme_ctrl *c``
+ Controller instance
+
+
+.. c:function:: const char * nvme_subsystem_get_nqn (nvme_subsystem_t s)
+
+ Retrieve NQN from subsystem
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ nvme_subsystem_t object
+
+**Return**
+
+NQN of subsystem
+
+
+.. c:function:: const char * nvme_subsystem_get_sysfs_dir (nvme_subsystem_t s)
+
+ sysfs directory of an nvme_subsystem_t object
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ nvme_subsystem_t object
+
+**Return**
+
+sysfs directory name of **s**
+
+
+.. c:function:: const char * nvme_subsystem_get_name (nvme_subsystem_t s)
+
+ sysfs name of an nvme_subsystem_t object
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ nvme_subsystem_t object
+
+**Return**
+
+sysfs name of **s**
+
+
+.. c:function:: const char * nvme_subsystem_get_type (nvme_subsystem_t s)
+
+ Returns the type of a subsystem
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ nvme_subsystem_t object
+
+**Description**
+
+Returns the subsystem type of **s**.
+
+**Return**
+
+'nvm' or 'discovery'
+
+
+.. c:function:: int nvme_scan_topology (nvme_root_t r, nvme_scan_filter_t f, void *f_args)
+
+ Scan NVMe topology and apply filter
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t object
+
+``nvme_scan_filter_t f``
+ filter to apply
+
+``void *f_args``
+ user-specified argument to **f**
+
+**Description**
+
+Scans the NVMe topology and filters out the resulting elements
+by applying **f**.
+
+**Return**
+
+Number of elements scanned
+
+
+.. c:function:: const char * nvme_host_get_hostnqn (nvme_host_t h)
+
+ Host NQN of an nvme_host_t object
+
+**Parameters**
+
+``nvme_host_t h``
+ nvme_host_t object
+
+**Return**
+
+Host NQN of **h**
+
+
+.. c:function:: const char * nvme_host_get_hostid (nvme_host_t h)
+
+ Host ID of an nvme_host_t object
+
+**Parameters**
+
+``nvme_host_t h``
+ nvme_host_t object
+
+**Return**
+
+Host ID of **h**
+
+
+.. c:function:: void nvme_free_host (nvme_host_t h)
+
+ Free nvme_host_t object
+
+**Parameters**
+
+``nvme_host_t h``
+ nvme_host_t object
+
+
+.. c:function:: nvme_root_t nvme_scan (const char *config_file)
+
+ Scan NVMe topology
+
+**Parameters**
+
+``const char *config_file``
+ Configuration file
+
+**Return**
+
+nvme_root_t object of found elements
+
+
+.. c:function:: int nvme_read_config (nvme_root_t r, const char *config_file)
+
+ Read NVMe JSON configuration file
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t object
+
+``const char *config_file``
+ JSON configuration file
+
+**Description**
+
+Read in the contents of **config_file** and merge them with
+the elements in **r**.
+
+**Return**
+
+0 on success, -1 on failure with errno set.
+
+
+.. c:function:: void nvme_refresh_topology (nvme_root_t r)
+
+ Refresh nvme_root_t object contents
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t object
+
+**Description**
+
+Removes all elements in **r** and rescans the existing topology.
+
+
+.. c:function:: int nvme_update_config (nvme_root_t r)
+
+ Update JSON configuration
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t object
+
+**Description**
+
+Updates the JSON configuration file with the contents of **r**.
+
+**Return**
+
+0 on success, -1 on failure.
+
+
+.. c:function:: int nvme_dump_config (nvme_root_t r)
+
+ Print the JSON configuration
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t object
+
+**Description**
+
+Prints the current contents of the JSON configuration
+file to stdout.
+
+**Return**
+
+0 on success, -1 on failure.
+
+
+.. c:function:: int nvme_dump_tree (nvme_root_t r)
+
+ Dump internal object tree
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t object
+
+**Description**
+
+Prints the internal object tree in JSON format
+to stdout.
+
+**Return**
+
+0 on success, -1 on failure.
+
+
+.. c:function:: char * nvme_get_attr (const char *d, const char *attr)
+
+ Read sysfs attribute
+
+**Parameters**
+
+``const char *d``
+ sysfs directory
+
+``const char *attr``
+ sysfs attribute name
+
+**Return**
+
+String with the contents of **attr** or ``NULL`` in case of an empty value
+ or in case of an error (indicated by non-zero errno code).
+
+
+.. c:function:: char * nvme_get_subsys_attr (nvme_subsystem_t s, const char *attr)
+
+ Read subsystem sysfs attribute
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ nvme_subsystem_t object
+
+``const char *attr``
+ sysfs attribute name
+
+**Return**
+
+String with the contents of **attr** or ``NULL`` in case of an empty value
+ or in case of an error (indicated by non-zero errno code).
+
+
+.. c:function:: char * nvme_get_ctrl_attr (nvme_ctrl_t c, const char *attr)
+
+ Read controller sysfs attribute
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+``const char *attr``
+ sysfs attribute name
+
+**Return**
+
+String with the contents of **attr** or ``NULL`` in case of an empty value
+ or in case of an error (indicated by non-zero errno code).
+
+
+.. c:function:: char * nvme_get_ns_attr (nvme_ns_t n, const char *attr)
+
+ Read namespace sysfs attribute
+
+**Parameters**
+
+``nvme_ns_t n``
+ nvme_ns_t object
+
+``const char *attr``
+ sysfs attribute name
+
+**Return**
+
+String with the contents of **attr** or ``NULL`` in case of an empty value
+ or in case of an error (indicated by non-zero errno code).
+
+
+.. c:function:: nvme_ns_t nvme_subsystem_lookup_namespace (struct nvme_subsystem *s, __u32 nsid)
+
+ lookup namespace by NSID
+
+**Parameters**
+
+``struct nvme_subsystem *s``
+ nvme_subsystem_t object
+
+``__u32 nsid``
+ Namespace id
+
+**Return**
+
+nvme_ns_t of the namespace with id **nsid** in subsystem **s**
+
+
+.. c:function:: char * nvme_get_path_attr (nvme_path_t p, const char *attr)
+
+ Read path sysfs attribute
+
+**Parameters**
+
+``nvme_path_t p``
+ nvme_path_t object
+
+``const char *attr``
+ sysfs attribute name
+
+**Return**
+
+String with the contents of **attr** or ``NULL`` in case of an empty value
+ or in case of an error (indicated by non-zero errno code).
+
+
+.. c:function:: nvme_ns_t nvme_scan_namespace (const char *name)
+
+ scan namespace based on sysfs name
+
+**Parameters**
+
+``const char *name``
+ sysfs name of the namespace to scan
+
+**Return**
+
+nvme_ns_t object or NULL if not found.
+
+
+.. c:function:: const char * nvme_host_get_hostsymname (nvme_host_t h)
+
+ Get the host's symbolic name
+
+**Parameters**
+
+``nvme_host_t h``
+ Host for which the symbolic name should be returned.
+
+**Return**
+
+The symbolic name or NULL if a symbolic name hasn't been
+configure.
+
+
+.. c:function:: void nvme_host_set_hostsymname (nvme_host_t h, const char *hostsymname)
+
+ Set the host's symbolic name
+
+**Parameters**
+
+``nvme_host_t h``
+ Host for which the symbolic name should be set.
+
+``const char *hostsymname``
+ Symbolic name
+
+
diff --git a/doc/rst/types.rst b/doc/rst/types.rst
new file mode 100644
index 0000000..0435c87
--- /dev/null
+++ b/doc/rst/types.rst
@@ -0,0 +1,11739 @@
+.. _types.h:
+
+**types.h**
+
+
+NVMe standard definitions
+
+.. c:macro:: NVME_GET
+
+``NVME_GET (value, name)``
+
+ extract field from complex value
+
+**Parameters**
+
+``value``
+ The original value of a complex field
+
+``name``
+ The name of the sub-field within an nvme value
+
+**Description**
+
+By convention, this library defines _SHIFT and _MASK such that mask can be
+applied after the shift to isolate a specific set of bits that decode to a
+sub-field.
+
+**Return**
+
+The 'name' field from 'value'
+
+
+.. c:macro:: NVME_SET
+
+``NVME_SET (value, name)``
+
+ set field into complex value
+
+**Parameters**
+
+``value``
+ The value to be set in its completed position
+
+``name``
+ The name of the sub-field within an nvme value
+
+**Return**
+
+The 'name' field from 'value'
+
+
+
+
+.. c:enum:: nvme_constants
+
+ A place to stash various constant nvme values
+
+**Constants**
+
+``NVME_NSID_ALL``
+ A broadcast value that is used to specify all
+ namespaces
+
+``NVME_NSID_NONE``
+ The invalid namespace id, for when the nsid
+ parameter is not used in a command
+
+``NVME_UUID_NONE``
+ Use to omit a uuid command parameter
+
+``NVME_CNTLID_NONE``
+ Use to omit a cntlid command parameter
+
+``NVME_CNSSPECID_NONE``
+ Use to omit a cns_specific_id command parameter
+
+``NVME_LOG_LSP_NONE``
+ Use to omit a log lsp command parameter
+
+``NVME_LOG_LSI_NONE``
+ Use to omit a log lsi command parameter
+
+``NVME_LOG_LPO_NONE``
+ Use to omit a log lpo command parameter
+
+``NVME_IDENTIFY_DATA_SIZE``
+ The transfer size for nvme identify commands
+
+``NVME_LOG_SUPPORTED_LOG_PAGES_MAX``
+ The largest possible index in the supported
+ log pages log.
+
+``NVME_ID_NVMSET_LIST_MAX``
+ The largest possible nvmset index in identify
+ nvmeset
+
+``NVME_ID_UUID_LIST_MAX``
+ The largest possible uuid index in identify
+ uuid list
+
+``NVME_ID_CTRL_LIST_MAX``
+ The largest possible controller index in
+ identify controller list
+
+``NVME_ID_NS_LIST_MAX``
+ The largest possible namespace index in
+ identify namespace list
+
+``NVME_ID_SECONDARY_CTRL_MAX``
+ The largest possible secondary controller index
+ in identify secondary controller
+
+``NVME_ID_DOMAIN_LIST_MAX``
+ The largest possible domain index in the
+ in domain list
+
+``NVME_ID_ENDURANCE_GROUP_LIST_MAX``
+ The largest possible endurance group
+ index in the endurance group list
+
+``NVME_ID_ND_DESCRIPTOR_MAX``
+ The largest possible namespace granularity
+ index in the namespace granularity descriptor
+ list
+
+``NVME_FEAT_LBA_RANGE_MAX``
+ The largest possible LBA range index in feature
+ lba range type
+
+``NVME_LOG_ST_MAX_RESULTS``
+ The largest possible self test result index in the
+ device self test log
+
+``NVME_LOG_TELEM_BLOCK_SIZE``
+ Specification defined size of Telemetry Data Blocks
+
+``NVME_LOG_FID_SUPPORTED_EFFECTS_MAX``
+ The largest possible FID index in the
+ feature identifiers effects log.
+
+``NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_MAX``
+ The largest possible MI Command index
+ in the MI Command effects log.
+
+``NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_RESERVED``
+ The reserved space in the MI Command
+ effects log.
+
+``NVME_DSM_MAX_RANGES``
+ The largest possible range index in a data-set
+ management command
+
+``NVME_NQN_LENGTH``
+ Max length for NVMe Qualified Name
+
+``NVMF_TRADDR_SIZE``
+ Max Transport Address size
+
+``NVMF_TSAS_SIZE``
+ Max Transport Specific Address Subtype size
+
+``NVME_ZNS_CHANGED_ZONES_MAX``
+ Max number of zones in the changed zones log
+ page
+
+
+
+
+.. c:enum:: nvme_csi
+
+ Defined command set indicators
+
+**Constants**
+
+``NVME_CSI_NVM``
+ NVM Command Set Indicator
+
+``NVME_CSI_KV``
+ Key Value Command Set
+
+``NVME_CSI_ZNS``
+ Zoned Namespace Command Set
+
+
+
+
+.. c:enum:: nvme_register_offsets
+
+ controller registers for all transports. This is the layout of BAR0/1 for PCIe, and properties for fabrics.
+
+**Constants**
+
+``NVME_REG_CAP``
+ Controller Capabilities
+
+``NVME_REG_VS``
+ Version
+
+``NVME_REG_INTMS``
+ Interrupt Mask Set
+
+``NVME_REG_INTMC``
+ Interrupt Mask Clear
+
+``NVME_REG_CC``
+ Controller Configuration
+
+``NVME_REG_CSTS``
+ Controller Status
+
+``NVME_REG_NSSR``
+ NVM Subsystem Reset
+
+``NVME_REG_AQA``
+ Admin Queue Attributes
+
+``NVME_REG_ASQ``
+ Admin SQ Base Address
+
+``NVME_REG_ACQ``
+ Admin CQ Base Address
+
+``NVME_REG_CMBLOC``
+ Controller Memory Buffer Location
+
+``NVME_REG_CMBSZ``
+ Controller Memory Buffer Size
+
+``NVME_REG_BPINFO``
+ Boot Partition Information
+
+``NVME_REG_BPRSEL``
+ Boot Partition Read Select
+
+``NVME_REG_BPMBL``
+ Boot Partition Memory Buffer Location
+
+``NVME_REG_CMBMSC``
+ Controller Memory Buffer Memory Space Control
+
+``NVME_REG_CMBSTS``
+ Controller Memory Buffer Status
+
+``NVME_REG_CRTO``
+ Controller Ready Timeouts
+
+``NVME_REG_PMRCAP``
+ Persistent Memory Capabilities
+
+``NVME_REG_PMRCTL``
+ Persistent Memory Region Control
+
+``NVME_REG_PMRSTS``
+ Persistent Memory Region Status
+
+``NVME_REG_PMREBS``
+ Persistent Memory Region Elasticity Buffer Size
+
+``NVME_REG_PMRSWTP``
+ Memory Region Sustained Write Throughput
+
+``NVME_REG_PMRMSCL``
+ Persistent Memory Region Controller Memory Space Control Lower
+
+``NVME_REG_PMRMSCU``
+ Persistent Memory Region Controller Memory Space Control Upper
+
+
+.. c:function:: bool nvme_is_64bit_reg (__u32 offset)
+
+ Checks if offset of the controller register is a know 64bit value.
+
+**Parameters**
+
+``__u32 offset``
+ Offset of controller register field in bytes
+
+**Description**
+
+This function does not care about transport so that the offset is not going
+to be checked inside of this function for the unsupported fields in a
+specific transport. For example, BPMBL(Boot Partition Memory Buffer
+Location) register is not supported by fabrics, but it can be checked here.
+
+**Return**
+
+true if given offset is 64bit register, otherwise it returns false.
+
+
+.. c:function:: __u64 nvme_cmb_size (__u32 cmbsz)
+
+ Calculate size of the controller memory buffer
+
+**Parameters**
+
+``__u32 cmbsz``
+ Value from controller register ``NVME_REG_CMBSZ``
+
+**Return**
+
+size of controller memory buffer in bytes
+
+
+.. c:function:: __u64 nvme_pmr_size (__u32 pmrebs)
+
+ Calculate size of persistent memory region elasticity buffer
+
+**Parameters**
+
+``__u32 pmrebs``
+ Value from controller register ``NVME_REG_PMREBS``
+
+**Return**
+
+size of controller persistent memory buffer in bytes
+
+
+.. c:function:: __u64 nvme_pmr_throughput (__u32 pmrswtp)
+
+ Calculate throughput of persistent memory buffer
+
+**Parameters**
+
+``__u32 pmrswtp``
+ Value from controller register ``NVME_REG_PMRSWTP``
+
+**Return**
+
+throughput of controller persistent memory buffer in bytes/second
+
+
+
+
+.. c:enum:: nvme_psd_flags
+
+ Possible flag values in nvme power state descriptor
+
+**Constants**
+
+``NVME_PSD_FLAGS_MXPS``
+ Indicates the scale for the Maximum Power
+ field. If this bit is cleared, then the scale of the
+ Maximum Power field is in 0.01 Watts. If this bit is
+ set, then the scale of the Maximum Power field is in
+ 0.0001 Watts.
+
+``NVME_PSD_FLAGS_NOPS``
+ Indicates whether the controller processes I/O
+ commands in this power state. If this bit is cleared,
+ then the controller processes I/O commands in this
+ power state. If this bit is set, then the controller
+ does not process I/O commands in this power state.
+
+
+
+
+.. c:enum:: nvme_psd_ps
+
+ Known values for :c:type:`struct nvme_psd <nvme_psd>` ``ips`` and ``aps``. Use with nvme_psd_power_scale() to extract the power scale field to match this enum.
+
+**Constants**
+
+``NVME_PSD_PS_NOT_REPORTED``
+ Not reported
+
+``NVME_PSD_PS_100_MICRO_WATT``
+ 0.0001 watt scale
+
+``NVME_PSD_PS_10_MILLI_WATT``
+ 0.01 watt scale
+
+
+.. c:function:: unsigned int nvme_psd_power_scale (__u8 ps)
+
+ power scale occupies the upper 3 bits
+
+**Parameters**
+
+``__u8 ps``
+ power scale value
+
+**Return**
+
+power scale value
+
+
+
+
+.. c:enum:: nvme_psd_workload
+
+ Specifies a workload hint in the Power Management Feature (see :c:type:`struct nvme_psd <nvme_psd>`.apw) to inform the NVM subsystem or indicate the conditions for the active power level.
+
+**Constants**
+
+``NVME_PSD_WORKLOAD_NP``
+ The workload is unknown or not provided.
+
+``NVME_PSD_WORKLOAD_1``
+ Extended Idle Period with a Burst of Random Write
+ consists of five minutes of idle followed by
+ thirty-two random write commands of size 1 MiB
+ submitted to a single controller while all other
+ controllers in the NVM subsystem are idle, and then
+ thirty (30) seconds of idle.
+
+``NVME_PSD_WORKLOAD_2``
+ Heavy Sequential Writes consists of 80,000
+ sequential write commands of size 128 KiB submitted to
+ a single controller while all other controllers in the
+ NVM subsystem are idle. The submission queue(s)
+ should be sufficiently large allowing the host to
+ ensure there are multiple commands pending at all
+ times during the workload.
+
+
+
+
+.. c:struct:: nvme_id_psd
+
+ Power Management data structure
+
+**Definition**
+
+::
+
+ struct nvme_id_psd {
+ __le16 mp;
+ __u8 rsvd2;
+ __u8 flags;
+ __le32 enlat;
+ __le32 exlat;
+ __u8 rrt;
+ __u8 rrl;
+ __u8 rwt;
+ __u8 rwl;
+ __le16 idlp;
+ __u8 ips;
+ __u8 rsvd19;
+ __le16 actp;
+ __u8 apws;
+ __u8 rsvd23[9];
+ };
+
+**Members**
+
+``mp``
+ Maximum Power indicates the sustained maximum power consumed by the
+ NVM subsystem in this power state. The power in Watts is equal to
+ the value in this field multiplied by the scale specified in the Max
+ Power Scale bit (see :c:type:`enum nvme_psd_flags <nvme_psd_flags>`). A value of 0 indicates
+ Maximum Power is not reported.
+
+``rsvd2``
+ Reserved
+
+``flags``
+ Additional decoding flags, see :c:type:`enum nvme_psd_flags <nvme_psd_flags>`.
+
+``enlat``
+ Entry Latency indicates the maximum latency in microseconds
+ associated with entering this power state. A value of 0 indicates
+ Entry Latency is not reported.
+
+``exlat``
+ Exit Latency indicates the maximum latency in microseconds
+ associated with exiting this power state. A value of 0 indicates
+ Exit Latency is not reported.
+
+``rrt``
+ Relative Read Throughput indicates the read throughput rank
+ associated with this power state relative to others. The value in
+ this is less than the number of supported power states.
+
+``rrl``
+ Relative Read Latency indicates the read latency rank associated
+ with this power state relative to others. The value in this field is
+ less than the number of supported power states.
+
+``rwt``
+ Relative Write Throughput indicates write throughput rank associated
+ with this power state relative to others. The value in this field is
+ less than the number of supported power states
+
+``rwl``
+ Relative Write Latency indicates the write latency rank associated
+ with this power state relative to others. The value in this field is
+ less than the number of supported power states
+
+``idlp``
+ Idle Power indicates the typical power consumed by the NVM
+ subsystem over 30 seconds in this power state when idle.
+
+``ips``
+ Idle Power Scale indicates the scale for :c:type:`struct nvme_id_psd <nvme_id_psd>`.idlp,
+ see :c:type:`enum nvme_psd_ps <nvme_psd_ps>` for decoding this field.
+
+``rsvd19``
+ Reserved
+
+``actp``
+ Active Power indicates the largest average power consumed by the
+ NVM subsystem over a 10 second period in this power state with
+ the workload indicated in the Active Power Workload field.
+
+``apws``
+ Bits 7-6: Active Power Scale(APS) indicates the scale for the :c:type:`struct
+ nvme_id_psd <nvme_id_psd>`.actp, see :c:type:`enum nvme_psd_ps <nvme_psd_ps>` for decoding this value.
+ Bits 2-0: Active Power Workload(APW) indicates the workload
+ used to calculate maximum power for this power state.
+ See :c:type:`enum nvme_psd_workload <nvme_psd_workload>` for decoding this field.
+
+``rsvd23``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_id_ctrl
+
+ Identify Controller data structure
+
+**Definition**
+
+::
+
+ struct nvme_id_ctrl {
+ __le16 vid;
+ __le16 ssvid;
+ char sn[20];
+ char mn[40];
+ char fr[8];
+ __u8 rab;
+ __u8 ieee[3];
+ __u8 cmic;
+ __u8 mdts;
+ __le16 cntlid;
+ __le32 ver;
+ __le32 rtd3r;
+ __le32 rtd3e;
+ __le32 oaes;
+ __le32 ctratt;
+ __le16 rrls;
+ __u8 rsvd102[9];
+ __u8 cntrltype;
+ __u8 fguid[16];
+ __le16 crdt1;
+ __le16 crdt2;
+ __le16 crdt3;
+ __u8 rsvd134[119];
+ __u8 nvmsr;
+ __u8 vwci;
+ __u8 mec;
+ __le16 oacs;
+ __u8 acl;
+ __u8 aerl;
+ __u8 frmw;
+ __u8 lpa;
+ __u8 elpe;
+ __u8 npss;
+ __u8 avscc;
+ __u8 apsta;
+ __le16 wctemp;
+ __le16 cctemp;
+ __le16 mtfa;
+ __le32 hmpre;
+ __le32 hmmin;
+ __u8 tnvmcap[16];
+ __u8 unvmcap[16];
+ __le32 rpmbs;
+ __le16 edstt;
+ __u8 dsto;
+ __u8 fwug;
+ __le16 kas;
+ __le16 hctma;
+ __le16 mntmt;
+ __le16 mxtmt;
+ __le32 sanicap;
+ __le32 hmminds;
+ __le16 hmmaxd;
+ __le16 nsetidmax;
+ __le16 endgidmax;
+ __u8 anatt;
+ __u8 anacap;
+ __le32 anagrpmax;
+ __le32 nanagrpid;
+ __le32 pels;
+ __le16 domainid;
+ __u8 rsvd358[10];
+ __u8 megcap[16];
+ __u8 rsvd384[128];
+ __u8 sqes;
+ __u8 cqes;
+ __le16 maxcmd;
+ __le32 nn;
+ __le16 oncs;
+ __le16 fuses;
+ __u8 fna;
+ __u8 vwc;
+ __le16 awun;
+ __le16 awupf;
+ __u8 icsvscc;
+ __u8 nwpc;
+ __le16 acwu;
+ __le16 ocfs;
+ __le32 sgls;
+ __le32 mnan;
+ __u8 maxdna[16];
+ __le32 maxcna;
+ __u8 rsvd564[204];
+ char subnqn[NVME_NQN_LENGTH];
+ __u8 rsvd1024[768];
+ __le32 ioccsz;
+ __le32 iorcsz;
+ __le16 icdoff;
+ __u8 fcatt;
+ __u8 msdbd;
+ __le16 ofcs;
+ __u8 dctype;
+ __u8 rsvd1807[241];
+ struct nvme_id_psd psd[32];
+ __u8 vs[1024];
+ };
+
+**Members**
+
+``vid``
+ PCI Vendor ID, the company vendor identifier that is assigned by
+ the PCI SIG.
+
+``ssvid``
+ PCI Subsystem Vendor ID, the company vendor identifier that is
+ assigned by the PCI SIG for the subsystem.
+
+``sn``
+ Serial Number in ASCII
+
+``mn``
+ Model Number in ASCII
+
+``fr``
+ Firmware Revision in ASCII, the currently active firmware
+ revision for the NVM subsystem
+
+``rab``
+ Recommended Arbitration Burst, reported as a power of two
+
+``ieee``
+ IEEE assigned Organization Unique Identifier
+
+``cmic``
+ Controller Multipath IO and Namespace Sharing Capabilities of
+ the controller and NVM subsystem. See :c:type:`enum nvme_id_ctrl_cmic <nvme_id_ctrl_cmic>`.
+
+``mdts``
+ Max Data Transfer Size is the largest data transfer size. The
+ host should not submit a command that exceeds this maximum data
+ transfer size. The value is in units of the minimum memory page
+ size (CAP.MPSMIN) and is reported as a power of two
+
+``cntlid``
+ Controller ID, the NVM subsystem unique controller identifier
+ associated with the controller.
+
+``ver``
+ Version, this field contains the value reported in the Version
+ register, or property (see :c:type:`enum nvme_registers <nvme_registers>` ``NVME_REG_VS``).
+
+``rtd3r``
+ RTD3 Resume Latency, the expected latency in microseconds to resume
+ from Runtime D3
+
+``rtd3e``
+ RTD3 Exit Latency, the typical latency in microseconds to enter
+ Runtime D3.
+
+``oaes``
+ Optional Async Events Supported, see **enum** nvme_id_ctrl_oaes.
+
+``ctratt``
+ Controller Attributes, see **enum** nvme_id_ctrl_ctratt.
+
+``rrls``
+ Read Recovery Levels. If a bit is set, then the corresponding
+ Read Recovery Level is supported. If a bit is cleared, then the
+ corresponding Read Recovery Level is not supported.
+
+``rsvd102``
+ Reserved
+
+``cntrltype``
+ Controller Type, see :c:type:`enum nvme_id_ctrl_cntrltype <nvme_id_ctrl_cntrltype>`
+
+``fguid``
+ FRU GUID, a 128-bit value that is globally unique for a given
+ Field Replaceable Unit
+
+``crdt1``
+ Controller Retry Delay time in 100 millisecond units if CQE CRD
+ field is 1
+
+``crdt2``
+ Controller Retry Delay time in 100 millisecond units if CQE CRD
+ field is 2
+
+``crdt3``
+ Controller Retry Delay time in 100 millisecond units if CQE CRD
+ field is 3
+
+``rsvd134``
+ Reserved
+
+``nvmsr``
+ NVM Subsystem Report, see :c:type:`enum nvme_id_ctrl_nvmsr <nvme_id_ctrl_nvmsr>`
+
+``vwci``
+ VPD Write Cycle Information, see :c:type:`enum nvme_id_ctrl_vwci <nvme_id_ctrl_vwci>`
+
+``mec``
+ Management Endpoint Capabilities, see :c:type:`enum nvme_id_ctrl_mec <nvme_id_ctrl_mec>`
+
+``oacs``
+ Optional Admin Command Support,the optional Admin commands and
+ features supported by the controller, see :c:type:`enum nvme_id_ctrl_oacs <nvme_id_ctrl_oacs>`.
+
+``acl``
+ Abort Command Limit, the maximum number of concurrently
+ executing Abort commands supported by the controller. This is a
+ 0's based value.
+
+``aerl``
+ Async Event Request Limit, the maximum number of concurrently
+ outstanding Asynchronous Event Request commands supported by the
+ controller This is a 0's based value.
+
+``frmw``
+ Firmware Updates indicates capabilities regarding firmware
+ updates. See :c:type:`enum nvme_id_ctrl_frmw <nvme_id_ctrl_frmw>`.
+
+``lpa``
+ Log Page Attributes, see :c:type:`enum nvme_id_ctrl_lpa <nvme_id_ctrl_lpa>`.
+
+``elpe``
+ Error Log Page Entries, the maximum number of Error Information
+ log entries that are stored by the controller. This field is a
+ 0's based value.
+
+``npss``
+ Number of Power States Supported, the number of NVM Express
+ power states supported by the controller, indicating the number
+ of valid entries in :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.psd. This is a 0's
+ based value.
+
+``avscc``
+ Admin Vendor Specific Command Configuration, see
+ :c:type:`enum nvme_id_ctrl_avscc <nvme_id_ctrl_avscc>`.
+
+``apsta``
+ Autonomous Power State Transition Attributes, see
+ :c:type:`enum nvme_id_ctrl_apsta <nvme_id_ctrl_apsta>`.
+
+``wctemp``
+ Warning Composite Temperature Threshold indicates
+ the minimum Composite Temperature field value (see :c:type:`struct
+ nvme_smart_log <nvme_smart_log>`.critical_comp_time) that indicates an overheating
+ condition during which controller operation continues.
+
+``cctemp``
+ Critical Composite Temperature Threshold, field indicates the
+ minimum Composite Temperature field value (see :c:type:`struct
+ nvme_smart_log <nvme_smart_log>`.critical_comp_time) that indicates a critical
+ overheating condition.
+
+``mtfa``
+ Maximum Time for Firmware Activation indicates the maximum time
+ the controller temporarily stops processing commands to activate
+ the firmware image, specified in 100 millisecond units. This
+ field is always valid if the controller supports firmware
+ activation without a reset.
+
+``hmpre``
+ Host Memory Buffer Preferred Size indicates the preferred size
+ that the host is requested to allocate for the Host Memory
+ Buffer feature in 4 KiB units.
+
+``hmmin``
+ Host Memory Buffer Minimum Size indicates the minimum size that
+ the host is requested to allocate for the Host Memory Buffer
+ feature in 4 KiB units.
+
+``tnvmcap``
+ Total NVM Capacity, the total NVM capacity in the NVM subsystem.
+ The value is in bytes.
+
+``unvmcap``
+ Unallocated NVM Capacity, the unallocated NVM capacity in the
+ NVM subsystem. The value is in bytes.
+
+``rpmbs``
+ Replay Protected Memory Block Support, see
+ :c:type:`enum nvme_id_ctrl_rpmbs <nvme_id_ctrl_rpmbs>`.
+
+``edstt``
+ Extended Device Self-test Time, if Device Self-test command is
+ supported (see :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.oacs, ``NVME_CTRL_OACS_SELF_TEST``),
+ then this field indicates the nominal amount of time in one
+ minute units that the controller takes to complete an extended
+ device self-test operation when in power state 0.
+
+``dsto``
+ Device Self-test Options, see :c:type:`enum nvme_id_ctrl_dsto <nvme_id_ctrl_dsto>`.
+
+``fwug``
+ Firmware Update Granularity indicates the granularity and
+ alignment requirement of the firmware image being updated by the
+ Firmware Image Download command. The value is reported in 4 KiB
+ units. A value of 0h indicates no information on granularity is
+ provided. A value of FFh indicates no restriction
+
+``kas``
+ Keep Alive Support indicates the granularity of the Keep Alive
+ Timer in 100 millisecond units.
+
+``hctma``
+ Host Controlled Thermal Management Attributes, see
+ :c:type:`enum nvme_id_ctrl_hctm <nvme_id_ctrl_hctm>`.
+
+``mntmt``
+ Minimum Thermal Management Temperature indicates the minimum
+ temperature, in degrees Kelvin, that the host may request in the
+ Thermal Management Temperature 1 field and Thermal Management
+ Temperature 2 field of a Set Features command with the Feature
+ Identifier field set to ``NVME_FEAT_FID_HCTM``.
+
+``mxtmt``
+ Maximum Thermal Management Temperature indicates the maximum
+ temperature, in degrees Kelvin, that the host may request in the
+ Thermal Management Temperature 1 field and Thermal Management
+ Temperature 2 field of the Set Features command with the Feature
+ Identifier set to ``NVME_FEAT_FID_HCTM``.
+
+``sanicap``
+ Sanitize Capabilities, see :c:type:`enum nvme_id_ctrl_sanicap <nvme_id_ctrl_sanicap>`
+
+``hmminds``
+ Host Memory Buffer Minimum Descriptor Entry Size indicates the
+ minimum usable size of a Host Memory Buffer Descriptor Entry in
+ 4 KiB units.
+
+``hmmaxd``
+ Host Memory Maximum Descriptors Entries indicates the number of
+ usable Host Memory Buffer Descriptor Entries.
+
+``nsetidmax``
+ NVM Set Identifier Maximum, defines the maximum value of a valid
+ NVM Set Identifier for any controller in the NVM subsystem.
+
+``endgidmax``
+ Endurance Group Identifier Maximum, defines the maximum value of
+ a valid Endurance Group Identifier for any controller in the NVM
+ subsystem.
+
+``anatt``
+ ANA Transition Time indicates the maximum amount of time, in
+ seconds, for a transition between ANA states or the maximum
+ amount of time, in seconds, that the controller reports the ANA
+ change state.
+
+``anacap``
+ Asymmetric Namespace Access Capabilities, see
+ :c:type:`enum nvme_id_ctrl_anacap <nvme_id_ctrl_anacap>`.
+
+``anagrpmax``
+ ANA Group Identifier Maximum indicates the maximum value of a
+ valid ANA Group Identifier for any controller in the NVM
+ subsystem.
+
+``nanagrpid``
+ Number of ANA Group Identifiers indicates the number of ANA
+ groups supported by this controller.
+
+``pels``
+ Persistent Event Log Size indicates the maximum reportable size
+ for the Persistent Event Log.
+
+``domainid``
+ Domain Identifier indicates the identifier of the domain
+ that contains this controller.
+
+``rsvd358``
+ Reserved
+
+``megcap``
+ Max Endurance Group Capacity indicates the maximum capacity
+ of a single Endurance Group.
+
+``rsvd384``
+ Reserved
+
+``sqes``
+ Submission Queue Entry Size, see :c:type:`enum nvme_id_ctrl_sqes <nvme_id_ctrl_sqes>`.
+
+``cqes``
+ Completion Queue Entry Size, see :c:type:`enum nvme_id_ctrl_cqes <nvme_id_ctrl_cqes>`.
+
+``maxcmd``
+ Maximum Outstanding Commands indicates the maximum number of
+ commands that the controller processes at one time for a
+ particular queue.
+
+``nn``
+ Number of Namespaces indicates the maximum value of a valid
+ nsid for the NVM subsystem. If the MNAN (:c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.mnan
+ field is cleared to 0h, then this field also indicates the
+ maximum number of namespaces supported by the NVM subsystem.
+
+``oncs``
+ Optional NVM Command Support, see :c:type:`enum nvme_id_ctrl_oncs <nvme_id_ctrl_oncs>`.
+
+``fuses``
+ Fused Operation Support, see :c:type:`enum nvme_id_ctrl_fuses <nvme_id_ctrl_fuses>`.
+
+``fna``
+ Format NVM Attributes, see :c:type:`enum nvme_id_ctrl_fna <nvme_id_ctrl_fna>`.
+
+``vwc``
+ Volatile Write Cache, see :c:type:`enum nvme_id_ctrl_vwc <nvme_id_ctrl_vwc>`.
+
+``awun``
+ Atomic Write Unit Normal indicates the size of the write
+ operation guaranteed to be written atomically to the NVM across
+ all namespaces with any supported namespace format during normal
+ operation. This field is specified in logical blocks and is a
+ 0's based value.
+
+``awupf``
+ Atomic Write Unit Power Fail indicates the size of the write
+ operation guaranteed to be written atomically to the NVM across
+ all namespaces with any supported namespace format during a
+ power fail or error condition. This field is specified in
+ logical blocks and is a 0’s based value.
+
+``icsvscc``
+ NVM Vendor Specific Command Configuration, see
+ :c:type:`enum nvme_id_ctrl_nvscc <nvme_id_ctrl_nvscc>`.
+
+``nwpc``
+ Namespace Write Protection Capabilities, see
+ :c:type:`enum nvme_id_ctrl_nwpc <nvme_id_ctrl_nwpc>`.
+
+``acwu``
+ Atomic Compare & Write Unit indicates the size of the write
+ operation guaranteed to be written atomically to the NVM across
+ all namespaces with any supported namespace format for a Compare
+ and Write fused operation. This field is specified in logical
+ blocks and is a 0’s based value.
+
+``ocfs``
+ Optional Copy Formats Supported, each bit n means controller
+ supports Copy Format n.
+
+``sgls``
+ SGL Support, see :c:type:`enum nvme_id_ctrl_sgls <nvme_id_ctrl_sgls>`
+
+``mnan``
+ Maximum Number of Allowed Namespaces indicates the maximum
+ number of namespaces supported by the NVM subsystem.
+
+``maxdna``
+ Maximum Domain Namespace Attachments indicates the maximum
+ of the sum of the number of namespaces attached to each I/O
+ controller in the Domain.
+
+``maxcna``
+ Maximum I/O Controller Namespace Attachments indicates the
+ maximum number of namespaces that are allowed to be attached to
+ this I/O controller.
+
+``rsvd564``
+ Reserved
+
+``subnqn``
+ NVM Subsystem NVMe Qualified Name, UTF-8 null terminated string
+
+``rsvd1024``
+ Reserved
+
+``ioccsz``
+ I/O Queue Command Capsule Supported Size, defines the maximum
+ I/O command capsule size in 16 byte units.
+
+``iorcsz``
+ I/O Queue Response Capsule Supported Size, defines the maximum
+ I/O response capsule size in 16 byte units.
+
+``icdoff``
+ In Capsule Data Offset, defines the offset where data starts
+ within a capsule. This value is applicable to I/O Queues only.
+
+``fcatt``
+ Fabrics Controller Attributes, see :c:type:`enum nvme_id_ctrl_fcatt <nvme_id_ctrl_fcatt>`.
+
+``msdbd``
+ Maximum SGL Data Block Descriptors indicates the maximum
+ number of SGL Data Block or Keyed SGL Data Block descriptors
+ that a host is allowed to place in a capsule. A value of 0h
+ indicates no limit.
+
+``ofcs``
+ Optional Fabric Commands Support, see :c:type:`enum nvme_id_ctrl_ofcs <nvme_id_ctrl_ofcs>`.
+
+``dctype``
+ Discovery Controller Type (DCTYPE). This field indicates what
+ type of Discovery controller the controller is (see enum
+ nvme_id_ctrl_dctype)
+
+``rsvd1807``
+ Reserved
+
+``psd``
+ Power State Descriptors, see :c:type:`struct nvme_id_psd <nvme_id_psd>`.
+
+``vs``
+ Vendor Specific
+
+
+
+
+
+.. c:enum:: nvme_id_ctrl_cmic
+
+ Controller Multipath IO and Namespace Sharing Capabilities of the controller and NVM subsystem.
+
+**Constants**
+
+``NVME_CTRL_CMIC_MULTI_PORT``
+ If set, then the NVM subsystem may contain
+ more than one NVM subsystem port, otherwise
+ the NVM subsystem contains only a single
+ NVM subsystem port.
+
+``NVME_CTRL_CMIC_MULTI_CTRL``
+ If set, then the NVM subsystem may contain
+ two or more controllers, otherwise the
+ NVM subsystem contains only a single
+ controller. An NVM subsystem that contains
+ multiple controllers may be used by
+ multiple hosts, or may provide multiple
+ paths for a single host.
+
+``NVME_CTRL_CMIC_MULTI_SRIOV``
+ If set, then the controller is associated
+ with an SR-IOV Virtual Function, otherwise
+ it is associated with a PCI Function
+ or a Fabrics connection.
+
+``NVME_CTRL_CMIC_MULTI_ANA_REPORTING``
+ If set, then the NVM subsystem supports
+ Asymmetric Namespace Access Reporting.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_oaes
+
+ Optional Asynchronous Events Supported
+
+**Constants**
+
+``NVME_CTRL_OAES_NA``
+ Namespace Attribute Notices event supported
+
+``NVME_CTRL_OAES_FA``
+ Firmware Activation Notices event supported
+
+``NVME_CTRL_OAES_ANA``
+ ANA Change Notices supported
+
+``NVME_CTRL_OAES_PLEA``
+ Predictable Latency Event Aggregate Log
+ Change Notices event supported
+
+``NVME_CTRL_OAES_LBAS``
+ LBA Status Information Notices event supported
+
+``NVME_CTRL_OAES_EGE``
+ Endurance Group Events Aggregate Log Change
+ Notices event supported
+
+``NVME_CTRL_OAES_NS``
+ Normal NVM Subsystem Shutdown event supported
+
+``NVME_CTRL_OAES_ZD``
+ Zone Descriptor Change Notifications supported
+
+``NVME_CTRL_OAES_DL``
+ Discover Log Page Change Notifications supported
+
+
+
+
+.. c:enum:: nvme_id_ctrl_ctratt
+
+ Controller attributes
+
+**Constants**
+
+``NVME_CTRL_CTRATT_128_ID``
+ 128-bit Host Identifier supported
+
+``NVME_CTRL_CTRATT_NON_OP_PSP``
+ Non-Operational Poser State Permissive Mode
+ supported
+
+``NVME_CTRL_CTRATT_NVM_SETS``
+ NVM Sets supported
+
+``NVME_CTRL_CTRATT_READ_RECV_LVLS``
+ Read Recovery Levels supported
+
+``NVME_CTRL_CTRATT_ENDURANCE_GROUPS``
+ Endurance Groups supported
+
+``NVME_CTRL_CTRATT_PREDICTABLE_LAT``
+ Predictable Latency Mode supported
+
+``NVME_CTRL_CTRATT_TBKAS``
+ Traffic Based Keep Alive Support
+
+``NVME_CTRL_CTRATT_NAMESPACE_GRANULARITY``
+ Namespace Granularity reporting
+ supported
+
+``NVME_CTRL_CTRATT_SQ_ASSOCIATIONS``
+ SQ Associations supported
+
+``NVME_CTRL_CTRATT_UUID_LIST``
+ UUID List reporting supported
+
+``NVME_CTRL_CTRATT_MDS``
+ Multi-Domain Subsystem supported
+
+``NVME_CTRL_CTRATT_FIXED_CAP``
+ Fixed Capacity Management supported
+
+``NVME_CTRL_CTRATT_VARIABLE_CAP``
+ Variable Capacity Management supported
+
+``NVME_CTRL_CTRATT_DEL_ENDURANCE_GROUPS``
+ Delete Endurance Groups supported
+
+``NVME_CTRL_CTRATT_DEL_NVM_SETS``
+ Delete NVM Sets supported
+
+``NVME_CTRL_CTRATT_ELBAS``
+ Extended LBA Formats supported
+
+``NVME_CTRL_CTRATT_FDPS``
+ Flexible Data Placement supported
+
+
+
+
+.. c:enum:: nvme_id_ctrl_cntrltype
+
+ Controller types
+
+**Constants**
+
+``NVME_CTRL_CNTRLTYPE_IO``
+ NVM I/O controller
+
+``NVME_CTRL_CNTRLTYPE_DISCOVERY``
+ Discovery controller
+
+``NVME_CTRL_CNTRLTYPE_ADMIN``
+ Admin controller
+
+
+
+
+.. c:enum:: nvme_id_ctrl_dctype
+
+ Discovery Controller types
+
+**Constants**
+
+``NVME_CTRL_DCTYPE_NOT_REPORTED``
+ Not reported (I/O, Admin, and pre-TP8010)
+
+``NVME_CTRL_DCTYPE_DDC``
+ Direct Discovery controller
+
+``NVME_CTRL_DCTYPE_CDC``
+ Central Discovery controller
+
+
+
+
+.. c:enum:: nvme_id_ctrl_nvmsr
+
+ This field reports information associated with the NVM Subsystem, see :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.nvmsr.
+
+**Constants**
+
+``NVME_CTRL_NVMSR_NVMESD``
+ If set, then the NVM Subsystem is part of an NVMe
+ Storage Device; if cleared, then the NVM Subsystem
+ is not part of an NVMe Storage Device.
+
+``NVME_CTRL_NVMSR_NVMEE``
+ If set’, then the NVM Subsystem is part of an NVMe
+ Enclosure; if cleared, then the NVM Subsystem is
+ not part of an NVMe Enclosure.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_vwci
+
+ This field indicates information about remaining number of times that VPD contents are able to be updated using the VPD Write command, see :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.vwci.
+
+**Constants**
+
+``NVME_CTRL_VWCI_VWCR``
+ Mask to get value of VPD Write Cycles Remaining. If
+ the VPD Write Cycle Remaining Valid bit is set, then
+ this field contains a value indicating the remaining
+ number of times that VPD contents are able to be
+ updated using the VPD Write command. If this field is
+ set to 7Fh, then the remaining number of times that
+ VPD contents are able to be updated using the VPD
+ Write command is greater than or equal to 7Fh.
+
+``NVME_CTRL_VWCI_VWCRV``
+ VPD Write Cycle Remaining Valid. If this bit is set,
+ then the VPD Write Cycle Remaining field is valid. If
+ this bit is cleared, then the VPD Write Cycles
+ Remaining field is invalid and cleared to 0h.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_mec
+
+ Flags indicating the capabilities of the Management Endpoint in the Controller, :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.mec.
+
+**Constants**
+
+``NVME_CTRL_MEC_SMBUSME``
+ If set, then the NVM Subsystem contains a Management
+ Endpoint on an SMBus/I2C port.
+
+``NVME_CTRL_MEC_PCIEME``
+ If set, then the NVM Subsystem contains a Management
+ Endpoint on a PCIe port.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_oacs
+
+ Flags indicating the optional Admin commands and features supported by the controller, see :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.oacs.
+
+**Constants**
+
+``NVME_CTRL_OACS_SECURITY``
+ If set, then the controller supports the
+ Security Send and Security Receive commands.
+
+``NVME_CTRL_OACS_FORMAT``
+ If set then the controller supports the Format
+ NVM command.
+
+``NVME_CTRL_OACS_FW``
+ If set, then the controller supports the
+ Firmware Commit and Firmware Image Download commands.
+
+``NVME_CTRL_OACS_NS_MGMT``
+ If set, then the controller supports the
+ Namespace Management capability
+
+``NVME_CTRL_OACS_SELF_TEST``
+ If set, then the controller supports the Device
+ Self-test command.
+
+``NVME_CTRL_OACS_DIRECTIVES``
+ If set, then the controller supports Directives
+ and the Directive Send and Directive Receive
+ commands.
+
+``NVME_CTRL_OACS_NVME_MI``
+ If set, then the controller supports the NVMe-MI
+ Send and NVMe-MI Receive commands.
+
+``NVME_CTRL_OACS_VIRT_MGMT``
+ If set, then the controller supports the
+ Virtualization Management command.
+
+``NVME_CTRL_OACS_DBBUF_CFG``
+ If set, then the controller supports the
+ Doorbell Buffer Config command.
+
+``NVME_CTRL_OACS_LBA_STATUS``
+ If set, then the controller supports the Get LBA
+ Status capability.
+
+``NVME_CTRL_OACS_CMD_FEAT_LD``
+ If set, then the controller supports the command
+ and feature lockdown capability.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_frmw
+
+ Flags and values indicates capabilities regarding firmware updates from :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.frmw.
+
+**Constants**
+
+``NVME_CTRL_FRMW_1ST_RO``
+ If set, the first firmware slot is readonly
+
+``NVME_CTRL_FRMW_NR_SLOTS``
+ Mask to get the value of the number of
+ firmware slots that the controller supports.
+
+``NVME_CTRL_FRMW_FW_ACT_NO_RESET``
+ If set, the controller supports firmware
+ activation without a reset.
+
+``NVME_CTRL_FRMW_MP_UP_DETECTION``
+ If set, the controller is able to detect
+ overlapping firmware/boot partition
+ image update.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_lpa
+
+ Flags indicating optional attributes for log pages that are accessed via the Get Log Page command.
+
+**Constants**
+
+``NVME_CTRL_LPA_SMART_PER_NS``
+ If set, controller supports SMART/Health log
+ page on a per namespace basis.
+
+``NVME_CTRL_LPA_CMD_EFFECTS``
+ If Set, the controller supports the commands
+ supported and effects log page.
+
+``NVME_CTRL_LPA_EXTENDED``
+ If set, the controller supports extended data
+ for log page command including extended number
+ of dwords and log page offset fields.
+
+``NVME_CTRL_LPA_TELEMETRY``
+ If set, the controller supports the telemetry
+ host-initiated and telemetry controller-initiated
+ log pages and sending telemetry log notices.
+
+``NVME_CTRL_LPA_PERSETENT_EVENT``
+ If set, the controller supports
+ persistent event log.
+
+``NVME_CTRL_LPA_LI0_LI5_LI12_LI13``
+ If set, the controller supports
+ - log pages log page.
+ - returning scope of each command in
+ commands supported and effects log
+ page.
+ - feature identifiers supported and
+ effects log page.
+ - NVMe-MI commands supported and
+ effects log page.
+
+``NVME_CTRL_LPA_DA4_TELEMETRY``
+ If set, the controller supports data
+ area 4 for telemetry host-initiated and
+ telemetry.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_avscc
+
+ Flags indicating the configuration settings for Admin Vendor Specific command handling.
+
+**Constants**
+
+``NVME_CTRL_AVSCC_AVS``
+ If set, all Admin Vendor Specific Commands use the
+ optional vendor specific command format with NDT and
+ NDM fields.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_apsta
+
+ Flags indicating the attributes of the autonomous power state transition feature.
+
+**Constants**
+
+``NVME_CTRL_APSTA_APST``
+ If set, then the controller supports autonomous power
+ state transitions.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_rpmbs
+
+ This field indicates if the controller supports one or more Replay Protected Memory Blocks, from :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.rpmbs.
+
+**Constants**
+
+``NVME_CTRL_RPMBS_NR_UNITS``
+ Mask to get the value of the Number of RPMB Units
+
+``NVME_CTRL_RPMBS_AUTH_METHOD``
+ Mask to get the value of the Authentication Method
+
+``NVME_CTRL_RPMBS_TOTAL_SIZE``
+ Mask to get the value of Total Size
+
+``NVME_CTRL_RPMBS_ACCESS_SIZE``
+ Mask to get the value of Access Size
+
+
+
+
+.. c:enum:: nvme_id_ctrl_dsto
+
+ Flags indicating the optional Device Self-test command or operation behaviors supported by the controller or NVM subsystem.
+
+**Constants**
+
+``NVME_CTRL_DSTO_ONE_DST``
+ If set, then the NVM subsystem supports only one
+ device self-test operation in progress at a time.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_hctm
+
+ Flags indicate the attributes of the host controlled thermal management feature
+
+**Constants**
+
+``NVME_CTRL_HCTMA_HCTM``
+ then the controller supports host controlled thermal
+ management, and the Set Features command and Get
+ Features command with the Feature Identifier field
+ set to ``NVME_FEAT_FID_HCTM``.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_sanicap
+
+ Indicates attributes for sanitize operations.
+
+**Constants**
+
+``NVME_CTRL_SANICAP_CES``
+ Crypto Erase Support. If set, then the
+ controller supports the Crypto Erase sanitize operation.
+
+``NVME_CTRL_SANICAP_BES``
+ Block Erase Support. If set, then the controller
+ supports the Block Erase sanitize operation.
+
+``NVME_CTRL_SANICAP_OWS``
+ Overwrite Support. If set, then the controller
+ supports the Overwrite sanitize operation.
+
+``NVME_CTRL_SANICAP_NDI``
+ No-Deallocate Inhibited. If set and the No-
+ Deallocate Response Mode bit is set, then the
+ controller deallocates after the sanitize
+ operation even if the No-Deallocate After
+ Sanitize bit is set in a Sanitize command.
+
+``NVME_CTRL_SANICAP_NODMMAS``
+ No-Deallocate Modifies Media After Sanitize,
+ mask to extract value.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_anacap
+
+ This field indicates the capabilities associated with Asymmetric Namespace Access Reporting.
+
+**Constants**
+
+``NVME_CTRL_ANACAP_OPT``
+ If set, then the controller is able to
+ report ANA Optimized state.
+
+``NVME_CTRL_ANACAP_NON_OPT``
+ If set, then the controller is able to
+ report ANA Non-Optimized state.
+
+``NVME_CTRL_ANACAP_INACCESSIBLE``
+ If set, then the controller is able to
+ report ANA Inaccessible state.
+
+``NVME_CTRL_ANACAP_PERSISTENT_LOSS``
+ If set, then the controller is able to
+ report ANA Persistent Loss state.
+
+``NVME_CTRL_ANACAP_CHANGE``
+ If set, then the controller is able to
+ report ANA Change state.
+
+``NVME_CTRL_ANACAP_GRPID_NO_CHG``
+ If set, then the ANAGRPID field in the
+ Identify Namespace data structure
+ (:c:type:`struct nvme_id_ns <nvme_id_ns>`.anagrpid), does not
+ change while the namespace is attached to
+ any controller.
+
+``NVME_CTRL_ANACAP_GRPID_MGMT``
+ If set, then the controller supports a
+ non-zero value in the ANAGRPID field of
+ the Namespace Management command.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_sqes
+
+ Defines the required and maximum Submission Queue entry size when using the NVM Command Set.
+
+**Constants**
+
+``NVME_CTRL_SQES_MIN``
+ Mask to get the value of the required Submission Queue
+ Entry size when using the NVM Command Set.
+
+``NVME_CTRL_SQES_MAX``
+ Mask to get the value of the maximum Submission Queue
+ entry size when using the NVM Command Set.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_cqes
+
+ Defines the required and maximum Completion Queue entry size when using the NVM Command Set.
+
+**Constants**
+
+``NVME_CTRL_CQES_MIN``
+ Mask to get the value of the required Completion Queue
+ Entry size when using the NVM Command Set.
+
+``NVME_CTRL_CQES_MAX``
+ Mask to get the value of the maximum Completion Queue
+ entry size when using the NVM Command Set.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_oncs
+
+ This field indicates the optional NVM commands and features supported by the controller.
+
+**Constants**
+
+``NVME_CTRL_ONCS_COMPARE``
+ If set, then the controller supports
+ the Compare command.
+
+``NVME_CTRL_ONCS_WRITE_UNCORRECTABLE``
+ If set, then the controller supports
+ the Write Uncorrectable command.
+
+``NVME_CTRL_ONCS_DSM``
+ If set, then the controller supports
+ the Dataset Management command.
+
+``NVME_CTRL_ONCS_WRITE_ZEROES``
+ If set, then the controller supports
+ the Write Zeroes command.
+
+``NVME_CTRL_ONCS_SAVE_FEATURES``
+ If set, then the controller supports
+ the Save field set to a non-zero value
+ in the Set Features command and the
+ Select field set to a non-zero value in
+ the Get Features command.
+
+``NVME_CTRL_ONCS_RESERVATIONS``
+ If set, then the controller supports
+ reservations.
+
+``NVME_CTRL_ONCS_TIMESTAMP``
+ If set, then the controller supports
+ the Timestamp feature.
+
+``NVME_CTRL_ONCS_VERIFY``
+ If set, then the controller supports
+ the Verify command.
+
+``NVME_CTRL_ONCS_COPY``
+ If set, then the controller supports
+ the copy command.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_fuses
+
+ This field indicates the fused operations that the controller supports.
+
+**Constants**
+
+``NVME_CTRL_FUSES_COMPARE_AND_WRITE``
+ If set, then the controller supports the
+ Compare and Write fused operation.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_fna
+
+ This field indicates attributes for the Format NVM command.
+
+**Constants**
+
+``NVME_CTRL_FNA_FMT_ALL_NAMESPACES``
+ If set, then all namespaces in an NVM
+ subsystem shall be configured with the
+ same attributes and a format (excluding
+ secure erase) of any namespace results in
+ a format of all namespaces in an NVM
+ subsystem. If cleared, then the
+ controller supports format on a per
+ namespace basis.
+
+``NVME_CTRL_FNA_SEC_ALL_NAMESPACES``
+ If set, then any secure erase performed
+ as part of a format operation results in
+ a secure erase of all namespaces in the
+ NVM subsystem. If cleared, then any
+ secure erase performed as part of a
+ format results in a secure erase of the
+ particular namespace specified.
+
+``NVME_CTRL_FNA_CRYPTO_ERASE``
+ If set, then cryptographic erase is
+ supported. If cleared, then cryptographic
+ erase is not supported.
+
+``NVME_CTRL_FNA_NSID_FFFFFFFF``
+ If set, then format does not support
+ nsid value set to FFFFFFFFh. If cleared,
+ format supports nsid value set to
+ FFFFFFFFh.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_vwc
+
+ Volatile write cache
+
+**Constants**
+
+``NVME_CTRL_VWC_PRESENT``
+ If set, indicates a volatile write cache is present.
+ If a volatile write cache is present, then the host
+ controls whether the volatile write cache is enabled
+ with a Set Features command specifying the value
+ ``NVME_FEAT_FID_VOLATILE_WC``.
+
+``NVME_CTRL_VWC_FLUSH``
+ Mask to get the value of the flush command behavior.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_nvscc
+
+ This field indicates the configuration settings for NVM Vendor Specific command handling.
+
+**Constants**
+
+``NVME_CTRL_NVSCC_FMT``
+ If set, all NVM Vendor Specific Commands use the
+ format with NDT and NDM fields.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_nwpc
+
+ This field indicates the optional namespace write protection capabilities supported by the controller.
+
+**Constants**
+
+``NVME_CTRL_NWPC_WRITE_PROTECT``
+ If set, then the controller shall
+ support the No Write Protect and
+ Write Protect namespace write
+ protection states and may support
+ the Write Protect Until Power
+ Cycle state and Permanent Write
+ Protect namespace write
+ protection states.
+
+``NVME_CTRL_NWPC_WRITE_PROTECT_POWER_CYCLE``
+ If set, then the controller
+ supports the Write Protect Until
+ Power Cycle state.
+
+``NVME_CTRL_NWPC_WRITE_PROTECT_PERMANENT``
+ If set, then the controller
+ supports the Permanent Write
+ Protect state.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_sgls
+
+ This field indicates if SGLs are supported for the NVM Command Set and the particular SGL types supported.
+
+**Constants**
+
+``NVME_CTRL_SGLS_SUPPORTED``
+
+``NVME_CTRL_SGLS_KEYED``
+
+``NVME_CTRL_SGLS_BIT_BUCKET``
+
+``NVME_CTRL_SGLS_MPTR_BYTE_ALIGNED``
+
+``NVME_CTRL_SGLS_OVERSIZE``
+
+``NVME_CTRL_SGLS_MPTR_SGL``
+
+``NVME_CTRL_SGLS_OFFSET``
+
+``NVME_CTRL_SGLS_TPORT``
+
+
+
+
+.. c:enum:: nvme_id_ctrl_fcatt
+
+ This field indicates attributes of the controller that are specific to NVMe over Fabrics.
+
+**Constants**
+
+``NVME_CTRL_FCATT_DYNAMIC``
+ If cleared, then the NVM subsystem uses a dynamic
+ controller model. If set, then the NVM subsystem
+ uses a static controller model.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_ofcs
+
+ Indicate whether the controller supports optional fabric commands.
+
+**Constants**
+
+``NVME_CTRL_OFCS_DISCONNECT``
+ If set, then the controller supports the
+ Disconnect command and deletion of individual
+ I/O Queues.
+
+
+
+
+.. c:struct:: nvme_lbaf
+
+ LBA Format Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_lbaf {
+ __le16 ms;
+ __u8 ds;
+ __u8 rp;
+ };
+
+**Members**
+
+``ms``
+ Metadata Size indicates the number of metadata bytes provided per LBA
+ based on the LBA Data Size indicated.
+
+``ds``
+ LBA Data Size indicates the LBA data size supported, reported as a
+ power of two.
+
+``rp``
+ Relative Performance, see :c:type:`enum nvme_lbaf_rp <nvme_lbaf_rp>`.
+
+
+
+
+
+.. c:enum:: nvme_lbaf_rp
+
+ This field indicates the relative performance of the LBA format indicated relative to other LBA formats supported by the controller.
+
+**Constants**
+
+``NVME_LBAF_RP_BEST``
+ Best performance
+
+``NVME_LBAF_RP_BETTER``
+ Better performance
+
+``NVME_LBAF_RP_GOOD``
+ Good performance
+
+``NVME_LBAF_RP_DEGRADED``
+ Degraded performance
+
+``NVME_LBAF_RP_MASK``
+ Mask to get the relative performance value from the
+ field
+
+
+
+
+.. c:struct:: nvme_id_ns
+
+ Identify Namespace data structure
+
+**Definition**
+
+::
+
+ struct nvme_id_ns {
+ __le64 nsze;
+ __le64 ncap;
+ __le64 nuse;
+ __u8 nsfeat;
+ __u8 nlbaf;
+ __u8 flbas;
+ __u8 mc;
+ __u8 dpc;
+ __u8 dps;
+ __u8 nmic;
+ __u8 rescap;
+ __u8 fpi;
+ __u8 dlfeat;
+ __le16 nawun;
+ __le16 nawupf;
+ __le16 nacwu;
+ __le16 nabsn;
+ __le16 nabo;
+ __le16 nabspf;
+ __le16 noiob;
+ __u8 nvmcap[16];
+ __le16 npwg;
+ __le16 npwa;
+ __le16 npdg;
+ __le16 npda;
+ __le16 nows;
+ __le16 mssrl;
+ __le32 mcl;
+ __u8 msrc;
+ __u8 rsvd81;
+ __u8 nulbaf;
+ __u8 rsvd83[9];
+ __le32 anagrpid;
+ __u8 rsvd96[3];
+ __u8 nsattr;
+ __le16 nvmsetid;
+ __le16 endgid;
+ __u8 nguid[16];
+ __u8 eui64[8];
+ struct nvme_lbaf lbaf[64];
+ __le64 lbstm;
+ __u8 vs[3704];
+ };
+
+**Members**
+
+``nsze``
+ Namespace Size indicates the total size of the namespace in
+ logical blocks. The number of logical blocks is based on the
+ formatted LBA size.
+
+``ncap``
+ Namespace Capacity indicates the maximum number of logical blocks
+ that may be allocated in the namespace at any point in time. The
+ number of logical blocks is based on the formatted LBA size.
+
+``nuse``
+ Namespace Utilization indicates the current number of logical
+ blocks allocated in the namespace. This field is smaller than or
+ equal to the Namespace Capacity. The number of logical blocks is
+ based on the formatted LBA size.
+
+``nsfeat``
+ Namespace Features, see :c:type:`enum nvme_id_nsfeat <nvme_id_nsfeat>`.
+
+``nlbaf``
+ Number of LBA Formats defines the number of supported LBA data
+ size and metadata size combinations supported by the namespace
+ and the highest possible index to :c:type:`struct nvme_id_ns <nvme_id_ns>`.lbaf.
+
+``flbas``
+ Formatted LBA Size, see :c:type:`enum nvme_id_ns_flbas <nvme_id_ns_flbas>`.
+
+``mc``
+ Metadata Capabilities, see :c:type:`enum nvme_id_ns_mc <nvme_id_ns_mc>`.
+
+``dpc``
+ End-to-end Data Protection Capabilities, see
+ :c:type:`enum nvme_id_ns_dpc <nvme_id_ns_dpc>`.
+
+``dps``
+ End-to-end Data Protection Type Settings, see
+ :c:type:`enum nvme_id_ns_dps <nvme_id_ns_dps>`.
+
+``nmic``
+ Namespace Multi-path I/O and Namespace Sharing Capabilities, see
+ :c:type:`enum nvme_id_ns_nmic <nvme_id_ns_nmic>`.
+
+``rescap``
+ Reservation Capabilities, see :c:type:`enum nvme_id_ns_rescap <nvme_id_ns_rescap>`.
+
+``fpi``
+ Format Progress Indicator, see :c:type:`enum nvme_nd_ns_fpi <nvme_nd_ns_fpi>`.
+
+``dlfeat``
+ Deallocate Logical Block Features, see :c:type:`enum nvme_id_ns_dlfeat <nvme_id_ns_dlfeat>`.
+
+``nawun``
+ Namespace Atomic Write Unit Normal indicates the
+ namespace specific size of the write operation guaranteed to be
+ written atomically to the NVM during normal operation.
+
+``nawupf``
+ Namespace Atomic Write Unit Power Fail indicates the
+ namespace specific size of the write operation guaranteed to be
+ written atomically to the NVM during a power fail or error
+ condition.
+
+``nacwu``
+ Namespace Atomic Compare & Write Unit indicates the namespace
+ specific size of the write operation guaranteed to be written
+ atomically to the NVM for a Compare and Write fused command.
+
+``nabsn``
+ Namespace Atomic Boundary Size Normal indicates the atomic
+ boundary size for this namespace for the NAWUN value. This field
+ is specified in logical blocks.
+
+``nabo``
+ Namespace Atomic Boundary Offset indicates the LBA on this
+ namespace where the first atomic boundary starts.
+
+``nabspf``
+ Namespace Atomic Boundary Size Power Fail indicates the atomic
+ boundary size for this namespace specific to the Namespace Atomic
+ Write Unit Power Fail value. This field is specified in logical
+ blocks.
+
+``noiob``
+ Namespace Optimal I/O Boundary indicates the optimal I/O boundary
+ for this namespace. This field is specified in logical blocks.
+ The host should construct Read and Write commands that do not
+ cross the I/O boundary to achieve optimal performance.
+
+``nvmcap``
+ NVM Capacity indicates the total size of the NVM allocated to
+ this namespace. The value is in bytes.
+
+``npwg``
+ Namespace Preferred Write Granularity indicates the smallest
+ recommended write granularity in logical blocks for this
+ namespace. This is a 0's based value.
+
+``npwa``
+ Namespace Preferred Write Alignment indicates the recommended
+ write alignment in logical blocks for this namespace. This is a
+ 0's based value.
+
+``npdg``
+ Namespace Preferred Deallocate Granularity indicates the
+ recommended granularity in logical blocks for the Dataset
+ Management command with the Attribute - Deallocate bit.
+
+``npda``
+ Namespace Preferred Deallocate Alignment indicates the
+ recommended alignment in logical blocks for the Dataset
+ Management command with the Attribute - Deallocate bit
+
+``nows``
+ Namespace Optimal Write Size indicates the size in logical blocks
+ for optimal write performance for this namespace. This is a 0's
+ based value.
+
+``mssrl``
+ Maximum Single Source Range Length indicates the maximum number
+ of logical blocks that may be specified in each valid Source Range
+ field of a Copy command.
+
+``mcl``
+ Maximum Copy Length indicates the maximum number of logical
+ blocks that may be specified in a Copy command.
+
+``msrc``
+ Maximum Source Range Count indicates the maximum number of Source
+ Range entries that may be used to specify source data in a Copy
+ command. This is a 0’s based value.
+
+``rsvd81``
+ Reserved
+
+``nulbaf``
+ Number of Unique Capability LBA Formats defines the number of
+ supported user data size and metadata size combinations supported
+ by the namespace that may not share the same capabilities. LBA
+ formats shall be allocated in order and packed sequentially.
+
+``rsvd83``
+ Reserved
+
+``anagrpid``
+ ANA Group Identifier indicates the ANA Group Identifier of the
+ ANA group of which the namespace is a member.
+
+``rsvd96``
+ Reserved
+
+``nsattr``
+ Namespace Attributes, see :c:type:`enum nvme_id_ns_attr <nvme_id_ns_attr>`.
+
+``nvmsetid``
+ NVM Set Identifier indicates the NVM Set with which this
+ namespace is associated.
+
+``endgid``
+ Endurance Group Identifier indicates the Endurance Group with
+ which this namespace is associated.
+
+``nguid``
+ Namespace Globally Unique Identifier contains a 128-bit value
+ that is globally unique and assigned to the namespace when the
+ namespace is created. This field remains fixed throughout the
+ life of the namespace and is preserved across namespace and
+ controller operations
+
+``eui64``
+ IEEE Extended Unique Identifier contains a 64-bit IEEE Extended
+ Unique Identifier (EUI-64) that is globally unique and assigned
+ to the namespace when the namespace is created. This field
+ remains fixed throughout the life of the namespace and is
+ preserved across namespace and controller operations
+
+``lbaf``
+ LBA Format, see :c:type:`struct nvme_lbaf <nvme_lbaf>`.
+
+``lbstm``
+ Logical Block Storage Tag Mask for end-to-end protection
+
+``vs``
+ Vendor Specific
+
+
+
+
+
+.. c:enum:: nvme_id_nsfeat
+
+ This field defines features of the namespace.
+
+**Constants**
+
+``NVME_NS_FEAT_THIN``
+ If set, indicates that the namespace supports thin
+ provisioning. Specifically, the Namespace Capacity
+ reported may be less than the Namespace Size.
+
+``NVME_NS_FEAT_NATOMIC``
+ If set, indicates that the fields NAWUN, NAWUPF, and
+ NACWU are defined for this namespace and should be
+ used by the host for this namespace instead of the
+ AWUN, AWUPF, and ACWU fields in the Identify
+ Controller data structure.
+
+``NVME_NS_FEAT_DULBE``
+ If set, indicates that the controller supports the
+ Deallocated or Unwritten Logical Block error for
+ this namespace.
+
+``NVME_NS_FEAT_ID_REUSE``
+ If set, indicates that the value in the NGUID field
+ for this namespace, if non- zero, is never reused by
+ the controller and that the value in the EUI64 field
+ for this namespace, if non-zero, is never reused by
+ the controller.
+
+``NVME_NS_FEAT_IO_OPT``
+ If set, indicates that the fields NPWG, NPWA, NPDG,
+ NPDA, and NOWS are defined for this namespace and
+ should be used by the host for I/O optimization
+
+
+
+
+.. c:enum:: nvme_id_ns_flbas
+
+ This field indicates the LBA data size & metadata size combination that the namespace has been formatted with
+
+**Constants**
+
+``NVME_NS_FLBAS_LOWER_MASK``
+ Mask to get the index of one of the supported
+ LBA Formats's least significant
+ 4bits indicated in
+ :c:type:`struct nvme_id_ns <nvme_id_ns>`.lbaf.
+
+``NVME_NS_FLBAS_META_EXT``
+ Applicable only if format contains metadata. If
+ this bit is set, indicates that the metadata is
+ transferred at the end of the data LBA, creating an
+ extended data LBA. If cleared, indicates that all
+ of the metadata for a command is transferred as a
+ separate contiguous buffer of data.
+
+``NVME_NS_FLBAS_HIGHER_MASK``
+ Mask to get the index of one of
+ the supported LBA Formats's most significant
+ 2bits indicated in
+ :c:type:`struct nvme_id_ns <nvme_id_ns>`.lbaf.
+
+
+
+
+.. c:enum:: nvme_nvm_id_ns_elbaf
+
+ This field indicates the extended LBA format
+
+**Constants**
+
+``NVME_NVM_ELBAF_STS_MASK``
+ Mask to get the storage tag size used to determine
+ the variable-sized storage tag/reference tag fields
+
+``NVME_NVM_ELBAF_PIF_MASK``
+ Mask to get the protection information format for
+ the extended LBA format.
+
+
+
+
+.. c:enum:: nvme_id_ns_mc
+
+ This field indicates the capabilities for metadata.
+
+**Constants**
+
+``NVME_NS_MC_EXTENDED``
+ If set, indicates the namespace supports the metadata
+ being transferred as part of a separate buffer that is
+ specified in the Metadata Pointer.
+
+``NVME_NS_MC_SEPARATE``
+ If set, indicates that the namespace supports the
+ metadata being transferred as part of an extended data LBA.
+
+
+
+
+.. c:enum:: nvme_id_ns_dpc
+
+ This field indicates the capabilities for the end-to-end data protection feature.
+
+**Constants**
+
+``NVME_NS_DPC_PI_TYPE1``
+ If set, indicates that the namespace supports
+ Protection Information Type 1.
+
+``NVME_NS_DPC_PI_TYPE2``
+ If set, indicates that the namespace supports
+ Protection Information Type 2.
+
+``NVME_NS_DPC_PI_TYPE3``
+ If set, indicates that the namespace supports
+ Protection Information Type 3.
+
+``NVME_NS_DPC_PI_FIRST``
+ If set, indicates that the namespace supports
+ protection information transferred as the first eight
+ bytes of metadata.
+
+``NVME_NS_DPC_PI_LAST``
+ If set, indicates that the namespace supports
+ protection information transferred as the last eight
+ bytes of metadata.
+
+
+
+
+.. c:enum:: nvme_id_ns_dps
+
+ This field indicates the Type settings for the end-to-end data protection feature.
+
+**Constants**
+
+``NVME_NS_DPS_PI_NONE``
+ Protection information is not enabled
+
+``NVME_NS_DPS_PI_TYPE1``
+ Protection information is enabled, Type 1
+
+``NVME_NS_DPS_PI_TYPE2``
+ Protection information is enabled, Type 2
+
+``NVME_NS_DPS_PI_TYPE3``
+ Protection information is enabled, Type 3
+
+``NVME_NS_DPS_PI_MASK``
+ Mask to get the value of the PI type
+
+``NVME_NS_DPS_PI_FIRST``
+ If set, indicates that the protection information, if
+ enabled, is transferred as the first eight bytes of
+ metadata.
+
+
+
+
+.. c:enum:: nvme_id_ns_nmic
+
+ This field specifies multi-path I/O and namespace sharing capabilities of the namespace.
+
+**Constants**
+
+``NVME_NS_NMIC_SHARED``
+ If set, then the namespace may be attached to two or
+ more controllers in the NVM subsystem concurrently
+
+
+
+
+.. c:enum:: nvme_id_ns_rescap
+
+ This field indicates the reservation capabilities of the namespace.
+
+**Constants**
+
+``NVME_NS_RESCAP_PTPL``
+ If set, indicates that the namespace supports the
+ Persist Through Power Loss capability.
+
+``NVME_NS_RESCAP_WE``
+ If set, indicates that the namespace supports the
+ Write Exclusive reservation type.
+
+``NVME_NS_RESCAP_EA``
+ If set, indicates that the namespace supports the
+ Exclusive Access reservation type.
+
+``NVME_NS_RESCAP_WERO``
+ If set, indicates that the namespace supports the
+ Write Exclusive - Registrants Only reservation type.
+
+``NVME_NS_RESCAP_EARO``
+ If set, indicates that the namespace supports the
+ Exclusive Access - Registrants Only reservation type.
+
+``NVME_NS_RESCAP_WEAR``
+ If set, indicates that the namespace supports the
+ Write Exclusive - All Registrants reservation type.
+
+``NVME_NS_RESCAP_EAAR``
+ If set, indicates that the namespace supports the
+ Exclusive Access - All Registrants reservation type.
+
+``NVME_NS_RESCAP_IEK_13``
+ If set, indicates that Ignore Existing Key is used
+ as defined in revision 1.3 or later of this specification.
+
+
+
+
+.. c:enum:: nvme_nd_ns_fpi
+
+ If a format operation is in progress, this field indicates the percentage of the namespace that remains to be formatted.
+
+**Constants**
+
+``NVME_NS_FPI_REMAINING``
+ Mask to get the format percent remaining value
+
+``NVME_NS_FPI_SUPPORTED``
+ If set, indicates that the namespace supports the
+ Format Progress Indicator defined for the field.
+
+
+
+
+.. c:enum:: nvme_id_ns_dlfeat
+
+ This field indicates information about features that affect deallocating logical blocks for this namespace.
+
+**Constants**
+
+``NVME_NS_DLFEAT_RB``
+ Mask to get the value of the read behavior
+
+``NVME_NS_DLFEAT_RB_NR``
+ Read behvaior is not reported
+
+``NVME_NS_DLFEAT_RB_ALL_0S``
+ A deallocated logical block returns all bytes
+ cleared to 0h.
+
+``NVME_NS_DLFEAT_RB_ALL_FS``
+ A deallocated logical block returns all bytes
+ set to FFh.
+
+``NVME_NS_DLFEAT_WRITE_ZEROES``
+ If set, indicates that the controller supports
+ the Deallocate bit in the Write Zeroes command
+ for this namespace.
+
+``NVME_NS_DLFEAT_CRC_GUARD``
+ If set, indicates that the Guard field for
+ deallocated logical blocks that contain
+ protection information is set to the CRC for
+ the value read from the deallocated logical
+ block and its metadata
+
+
+
+
+.. c:enum:: nvme_id_ns_attr
+
+ Specifies attributes of the namespace.
+
+**Constants**
+
+``NVME_NS_NSATTR_WRITE_PROTECTED``
+ If set, then the namespace is currently
+ write protected and all write access to the
+ namespace shall fail.
+
+
+
+
+.. c:struct:: nvme_ns_id_desc
+
+ Namespace identifier type descriptor
+
+**Definition**
+
+::
+
+ struct nvme_ns_id_desc {
+ __u8 nidt;
+ __u8 nidl;
+ __le16 rsvd;
+ __u8 nid[];
+ };
+
+**Members**
+
+``nidt``
+ Namespace Identifier Type, see :c:type:`enum nvme_ns_id_desc_nidt <nvme_ns_id_desc_nidt>`
+
+``nidl``
+ Namespace Identifier Length contains the length in bytes of the
+ :c:type:`struct nvme_id_ns <nvme_id_ns>`.nid.
+
+``rsvd``
+ Reserved
+
+``nid``
+ Namespace Identifier contains a value that is globally unique and
+ assigned to the namespace when the namespace is created. The length
+ is defined in :c:type:`struct nvme_id_ns <nvme_id_ns>`.nidl.
+
+
+
+
+
+.. c:enum:: nvme_ns_id_desc_nidt
+
+ Known namespace identifier types
+
+**Constants**
+
+``NVME_NIDT_EUI64``
+ IEEE Extended Unique Identifier, the NID field contains a
+ copy of the EUI64 field in the struct nvme_id_ns.eui64.
+
+``NVME_NIDT_NGUID``
+ Namespace Globally Unique Identifier, the NID field
+ contains a copy of the NGUID field in struct nvme_id_ns.nguid.
+
+``NVME_NIDT_UUID``
+ The NID field contains a 128-bit Universally Unique
+ Identifier (UUID) as specified in RFC 4122.
+
+``NVME_NIDT_CSI``
+ The NID field contains the command set identifier.
+
+
+
+
+.. c:struct:: nvme_nvmset_attr
+
+ NVM Set Attributes Entry
+
+**Definition**
+
+::
+
+ struct nvme_nvmset_attr {
+ __le16 nvmsetid;
+ __le16 endgid;
+ __u8 rsvd4[4];
+ __le32 rr4kt;
+ __le32 ows;
+ __u8 tnvmsetcap[16];
+ __u8 unvmsetcap[16];
+ __u8 rsvd48[80];
+ };
+
+**Members**
+
+``nvmsetid``
+ NVM Set Identifier
+
+``endgid``
+ Endurance Group Identifier
+
+``rsvd4``
+ Reserved
+
+``rr4kt``
+ Random 4 KiB Read Typical indicates the typical
+ time to complete a 4 KiB random read in 100 nanosecond units
+ when the NVM Set is in a Predictable Latency Mode Deterministic
+ Window and there is 1 outstanding command per NVM Set.
+
+``ows``
+ Optimal Write Size
+
+``tnvmsetcap``
+ Total NVM Set Capacity
+
+``unvmsetcap``
+ Unallocated NVM Set Capacity
+
+``rsvd48``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_id_nvmset_list
+
+ NVM set list
+
+**Definition**
+
+::
+
+ struct nvme_id_nvmset_list {
+ __u8 nid;
+ __u8 rsvd1[127];
+ struct nvme_nvmset_attr ent[NVME_ID_NVMSET_LIST_MAX];
+ };
+
+**Members**
+
+``nid``
+ Nvmset id
+
+``rsvd1``
+ Reserved
+
+``ent``
+ nvmset id list
+
+
+
+
+
+.. c:struct:: nvme_id_independent_id_ns
+
+ Identify - I/O Command Set Independent Identify Namespace Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_id_independent_id_ns {
+ __u8 nsfeat;
+ __u8 nmic;
+ __u8 rescap;
+ __u8 fpi;
+ __le32 anagrpid;
+ __u8 nsattr;
+ __u8 rsvd9;
+ __le16 nvmsetid;
+ __le16 endgid;
+ __u8 nstat;
+ __u8 rsvd15[4081];
+ };
+
+**Members**
+
+``nsfeat``
+ common namespace features
+
+``nmic``
+ Namespace Multi-path I/O and Namespace
+ Sharing Capabilities
+
+``rescap``
+ Reservation Capabilities
+
+``fpi``
+ Format Progress Indicator
+
+``anagrpid``
+ ANA Group Identifier
+
+``nsattr``
+ Namespace Attributes
+
+``rsvd9``
+ reserved
+
+``nvmsetid``
+ NVM Set Identifier
+
+``endgid``
+ Endurance Group Identifier
+
+``nstat``
+ Namespace Status
+
+``rsvd15``
+ reserved
+
+
+
+
+
+.. c:struct:: nvme_id_ns_granularity_desc
+
+ Namespace Granularity Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_id_ns_granularity_desc {
+ __le64 nszegran;
+ __le64 ncapgran;
+ };
+
+**Members**
+
+``nszegran``
+ Namespace Size Granularity
+
+``ncapgran``
+ Namespace Capacity Granularity
+
+
+
+
+
+.. c:struct:: nvme_id_ns_granularity_list
+
+ Namespace Granularity List
+
+**Definition**
+
+::
+
+ struct nvme_id_ns_granularity_list {
+ __le32 attributes;
+ __u8 num_descriptors;
+ __u8 rsvd5[27];
+ struct nvme_id_ns_granularity_desc entry[NVME_ID_ND_DESCRIPTOR_MAX];
+ __u8 rsvd288[3808];
+ };
+
+**Members**
+
+``attributes``
+ Namespace Granularity Attributes
+
+``num_descriptors``
+ Number of Descriptors
+
+``rsvd5``
+ reserved
+
+``entry``
+ Namespace Granularity Descriptor
+
+``rsvd288``
+ reserved
+
+
+
+
+
+.. c:struct:: nvme_id_uuid_list_entry
+
+ UUID List Entry
+
+**Definition**
+
+::
+
+ struct nvme_id_uuid_list_entry {
+ __u8 header;
+ __u8 rsvd1[15];
+ __u8 uuid[16];
+ };
+
+**Members**
+
+``header``
+ UUID Lists Entry Header
+
+``rsvd1``
+ reserved
+
+``uuid``
+ 128-bit Universally Unique Identifier
+
+
+
+
+
+.. c:enum:: nvme_id_uuid
+
+ Identifier Association
+
+**Constants**
+
+``NVME_ID_UUID_HDR_ASSOCIATION_MASK``
+
+``NVME_ID_UUID_ASSOCIATION_NONE``
+
+``NVME_ID_UUID_ASSOCIATION_VENDOR``
+
+``NVME_ID_UUID_ASSOCIATION_SUBSYSTEM_VENDOR``
+
+
+
+
+.. c:struct:: nvme_id_uuid_list
+
+ UUID list
+
+**Definition**
+
+::
+
+ struct nvme_id_uuid_list {
+ __u8 rsvd0[32];
+ struct nvme_id_uuid_list_entry entry[NVME_ID_UUID_LIST_MAX];
+ };
+
+**Members**
+
+``rsvd0``
+ reserved
+
+``entry``
+ UUID list entry
+
+
+
+
+
+.. c:struct:: nvme_ctrl_list
+
+ Controller List
+
+**Definition**
+
+::
+
+ struct nvme_ctrl_list {
+ __le16 num;
+ __le16 identifier[NVME_ID_CTRL_LIST_MAX];
+ };
+
+**Members**
+
+``num``
+ Number of Identifiers
+
+``identifier``
+ NVM subsystem unique controller identifier
+
+
+
+
+
+.. c:struct:: nvme_ns_list
+
+ Namespace List
+
+**Definition**
+
+::
+
+ struct nvme_ns_list {
+ __le32 ns[NVME_ID_NS_LIST_MAX];
+ };
+
+**Members**
+
+``ns``
+ Namespace Identifier
+
+
+
+
+
+.. c:struct:: nvme_id_ctrl_nvm
+
+ I/O Command Set Specific Identify Controller data structure
+
+**Definition**
+
+::
+
+ struct nvme_id_ctrl_nvm {
+ __u8 vsl;
+ __u8 wzsl;
+ __u8 wusl;
+ __u8 dmrl;
+ __u32 dmrsl;
+ __u64 dmsl;
+ __u8 rsvd16[4080];
+ };
+
+**Members**
+
+``vsl``
+ Verify Size Limit
+
+``wzsl``
+ Write Zeroes Size Limit
+
+``wusl``
+ Write Uncorrectable Size Limit
+
+``dmrl``
+ Dataset Management Ranges Limit
+
+``dmrsl``
+ Dataset Management Range Size Limit
+
+``dmsl``
+ Dataset Management Size Limit
+
+``rsvd16``
+ reserved
+
+
+
+
+
+.. c:struct:: nvme_nvm_id_ns
+
+ NVME Command Set I/O Command Set Specific Identify Namespace Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_nvm_id_ns {
+ __le64 lbstm;
+ __u8 pic;
+ __u8 rsvd9[3];
+ __le32 elbaf[64];
+ __u8 rsvd268[3828];
+ };
+
+**Members**
+
+``lbstm``
+ Logical Block Storage Tag Mask
+
+``pic``
+ Protection Information Capabilities
+
+``rsvd9``
+ Reserved
+
+``elbaf``
+ List of Extended LBA Format Support
+
+``rsvd268``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_zns_lbafe
+
+ LBA Format Extension Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_zns_lbafe {
+ __le64 zsze;
+ __u8 zdes;
+ __u8 rsvd9[7];
+ };
+
+**Members**
+
+``zsze``
+ Zone Size
+
+``zdes``
+ Zone Descriptor Extension Size
+
+``rsvd9``
+ reserved
+
+
+
+
+
+.. c:struct:: nvme_zns_id_ns
+
+ Zoned Namespace Command Set Specific Identify Namespace Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_zns_id_ns {
+ __le16 zoc;
+ __le16 ozcs;
+ __le32 mar;
+ __le32 mor;
+ __le32 rrl;
+ __le32 frl;
+ __le32 rrl1;
+ __le32 rrl2;
+ __le32 rrl3;
+ __le32 frl1;
+ __le32 frl2;
+ __le32 frl3;
+ __le32 numzrwa;
+ __le16 zrwafg;
+ __le16 zrwasz;
+ __u8 zrwacap;
+ __u8 rsvd53[2763];
+ struct nvme_zns_lbafe lbafe[64];
+ __u8 vs[256];
+ };
+
+**Members**
+
+``zoc``
+ Zone Operation Characteristics
+
+``ozcs``
+ Optional Zoned Command Support
+
+``mar``
+ Maximum Active Resources
+
+``mor``
+ Maximum Open Resources
+
+``rrl``
+ Reset Recommended Limit
+
+``frl``
+ Finish Recommended Limit
+
+``rrl1``
+ Reset Recommended Limit 1
+
+``rrl2``
+ Reset Recommended Limit 2
+
+``rrl3``
+ Reset Recommended Limit 3
+
+``frl1``
+ Finish Recommended Limit 1
+
+``frl2``
+ Finish Recommended Limit 2
+
+``frl3``
+ Finish Recommended Limit 3
+
+``numzrwa``
+ Number of ZRWA Resources
+
+``zrwafg``
+ ZRWA Flush Granularity
+
+``zrwasz``
+ ZRWA Size
+
+``zrwacap``
+ ZRWA Capability
+
+``rsvd53``
+ Reserved
+
+``lbafe``
+ LBA Format Extension
+
+``vs``
+ Vendor Specific
+
+
+
+
+
+.. c:struct:: nvme_zns_id_ctrl
+
+ I/O Command Set Specific Identify Controller Data Structure for the Zoned Namespace Command Set
+
+**Definition**
+
+::
+
+ struct nvme_zns_id_ctrl {
+ __u8 zasl;
+ __u8 rsvd1[4095];
+ };
+
+**Members**
+
+``zasl``
+ Zone Append Size Limit
+
+``rsvd1``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_primary_ctrl_cap
+
+ Identify - Controller Capabilities Structure
+
+**Definition**
+
+::
+
+ struct nvme_primary_ctrl_cap {
+ __le16 cntlid;
+ __le16 portid;
+ __u8 crt;
+ __u8 rsvd5[27];
+ __le32 vqfrt;
+ __le32 vqrfa;
+ __le16 vqrfap;
+ __le16 vqprt;
+ __le16 vqfrsm;
+ __le16 vqgran;
+ __u8 rsvd48[16];
+ __le32 vifrt;
+ __le32 virfa;
+ __le16 virfap;
+ __le16 viprt;
+ __le16 vifrsm;
+ __le16 vigran;
+ __u8 rsvd80[4016];
+ };
+
+**Members**
+
+``cntlid``
+ Controller Identifier
+
+``portid``
+ Port Identifier
+
+``crt``
+ Controller Resource Types
+
+``rsvd5``
+ reserved
+
+``vqfrt``
+ VQ Resources Flexible Total
+
+``vqrfa``
+ VQ Resources Flexible Assigned
+
+``vqrfap``
+ VQ Resources Flexible Allocated to Primary
+
+``vqprt``
+ VQ Resources Private Total
+
+``vqfrsm``
+ VQ Resources Flexible Secondary Maximum
+
+``vqgran``
+ VQ Flexible Resource Preferred Granularity
+
+``rsvd48``
+ reserved
+
+``vifrt``
+ VI Resources Flexible Total
+
+``virfa``
+ VI Resources Flexible Assigned
+
+``virfap``
+ VI Resources Flexible Allocated to Primary
+
+``viprt``
+ VI Resources Private Total
+
+``vifrsm``
+ VI Resources Flexible Secondary Maximum
+
+``vigran``
+ VI Flexible Resource Preferred Granularity
+
+``rsvd80``
+ reserved
+
+
+
+
+
+.. c:struct:: nvme_secondary_ctrl
+
+ Secondary Controller Entry
+
+**Definition**
+
+::
+
+ struct nvme_secondary_ctrl {
+ __le16 scid;
+ __le16 pcid;
+ __u8 scs;
+ __u8 rsvd5[3];
+ __le16 vfn;
+ __le16 nvq;
+ __le16 nvi;
+ __u8 rsvd14[18];
+ };
+
+**Members**
+
+``scid``
+ Secondary Controller Identifier
+
+``pcid``
+ Primary Controller Identifier
+
+``scs``
+ Secondary Controller State
+
+``rsvd5``
+ Reserved
+
+``vfn``
+ Virtual Function Number
+
+``nvq``
+ Number of VQ Flexible Resources Assigned
+
+``nvi``
+ Number of VI Flexible Resources Assigned
+
+``rsvd14``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_secondary_ctrl_list
+
+ Secondary Controller List
+
+**Definition**
+
+::
+
+ struct nvme_secondary_ctrl_list {
+ __u8 num;
+ __u8 rsvd[31];
+ struct nvme_secondary_ctrl sc_entry[NVME_ID_SECONDARY_CTRL_MAX];
+ };
+
+**Members**
+
+``num``
+ Number of Identifiers
+
+``rsvd``
+ Reserved
+
+``sc_entry``
+ Secondary Controller Entry
+
+
+
+
+
+.. c:struct:: nvme_id_iocs
+
+ NVMe Identify IO Command Set data structure
+
+**Definition**
+
+::
+
+ struct nvme_id_iocs {
+ __u64 iocsc[512];
+ };
+
+**Members**
+
+``iocsc``
+ List of supported IO Command Set Combination vectors
+
+
+
+
+
+.. c:struct:: nvme_id_domain_attr
+
+ Domain Attributes Entry
+
+**Definition**
+
+::
+
+ struct nvme_id_domain_attr {
+ __le16 dom_id;
+ __u8 rsvd2[14];
+ __u8 dom_cap[16];
+ __u8 unalloc_dom_cap[16];
+ __u8 max_egrp_dom_cap[16];
+ __u8 rsvd64[64];
+ };
+
+**Members**
+
+``dom_id``
+ Domain Identifier
+
+``rsvd2``
+ Reserved
+
+``dom_cap``
+ Total Domain Capacity
+
+``unalloc_dom_cap``
+ Unallocated Domain Capacity
+
+``max_egrp_dom_cap``
+ Max Endurance Group Domain Capacity
+
+``rsvd64``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_id_domain_list
+
+ Domain List
+
+**Definition**
+
+::
+
+ struct nvme_id_domain_list {
+ __u8 num;
+ __u8 rsvd[127];
+ struct nvme_id_domain_attr domain_attr[NVME_ID_DOMAIN_LIST_MAX];
+ };
+
+**Members**
+
+``num``
+ Number of domain attributes
+
+``rsvd``
+ Reserved
+
+``domain_attr``
+ List of domain attributes
+
+
+
+
+
+.. c:struct:: nvme_id_endurance_group_list
+
+ Endurance Group List
+
+**Definition**
+
+::
+
+ struct nvme_id_endurance_group_list {
+ __le16 num;
+ __le16 identifier[NVME_ID_ENDURANCE_GROUP_LIST_MAX];
+ };
+
+**Members**
+
+``num``
+ Number of Identifiers
+
+``identifier``
+ Endurance Group Identifier
+
+
+
+
+
+.. c:struct:: nvme_supported_log_pages
+
+ Supported Log Pages - Log
+
+**Definition**
+
+::
+
+ struct nvme_supported_log_pages {
+ __le32 lid_support[NVME_LOG_SUPPORTED_LOG_PAGES_MAX];
+ };
+
+**Members**
+
+``lid_support``
+ Log Page Identifier Supported
+
+
+**Description**
+
+Supported Log Pages (Log Identifier 00h)
+
+
+
+
+.. c:struct:: nvme_error_log_page
+
+ Error Information Log Entry (Log Identifier 01h)
+
+**Definition**
+
+::
+
+ struct nvme_error_log_page {
+ __le64 error_count;
+ __le16 sqid;
+ __le16 cmdid;
+ __le16 status_field;
+ __le16 parm_error_location;
+ __le64 lba;
+ __le32 nsid;
+ __u8 vs;
+ __u8 trtype;
+ __u8 rsvd[2];
+ __le64 cs;
+ __le16 trtype_spec_info;
+ __u8 rsvd2[22];
+ };
+
+**Members**
+
+``error_count``
+ Error Count: a 64-bit incrementing error count,
+ indicating a unique identifier for this error. The error
+ count starts at ``1h``, is incremented for each unique error
+ log entry, and is retained across power off conditions.
+ A value of ``0h`` indicates an invalid entry; this value
+ is used when there are lost entries or when there are
+ fewer errors than the maximum number of entries the
+ controller supports. If the value of this field is
+ ``FFFFFFFFh``, then the field shall be set to 1h when
+ incremented (i.e., rolls over to ``1h``). Prior to NVMe
+ 1.4, processing of incrementing beyond ``FFFFFFFFh`` is
+ unspecified.
+
+``sqid``
+ Submission Queue ID: indicates the Submission Queue
+ Identifier of the command that the error information is
+ associated with. If the error is not specific to
+ a particular command, then this field shall be set to
+ ``FFFFh``.
+
+``cmdid``
+ Command ID: indicates the Command Identifier of the
+ command that the error is associated with. If the error
+ is not specific to a particular command, then this field
+ shall be set to ``FFFFh``.
+
+``status_field``
+ Bits 15-1: Status Field: indicates the Status Field for
+ the command that completed. If the error is not specific
+ to a particular command, then this field reports the most
+ applicable status value.
+ Bit 0: Phase Tag: may indicate the Phase Tag posted for
+ the command.
+
+``parm_error_location``
+ Parameter Error Location: indicates the byte and bit of
+ the command parameter that the error is associated with,
+ if applicable. If the parameter spans multiple bytes or
+ bits, then the location indicates the first byte and bit
+ of the parameter.
+ Bits 10-8: Bit in command that contained the error.
+ Valid values are 0 to 7.
+ Bits 7-0: Byte in command that contained the error.
+ Valid values are 0 to 63.
+
+``lba``
+ LBA: This field indicates the first LBA that experienced
+ the error condition, if applicable.
+
+``nsid``
+ Namespace: This field indicates the NSID of the namespace
+ that the error is associated with, if applicable.
+
+``vs``
+ Vendor Specific Information Available: If there is
+ additional vendor specific error information available,
+ this field provides the log page identifier associated
+ with that page. A value of ``0h`` indicates that no additional
+ information is available. Valid values are in the range
+ of ``80h`` to ``FFh``.
+
+``trtype``
+ Transport Type (TRTYPE): indicates the Transport Type of
+ the transport associated with the error. The values in
+ this field are the same as the TRTYPE values in the
+ Discovery Log Page Entry. If the error is not transport
+ related, this field shall be cleared to ``0h``. If the error
+ is transport related, this field shall be set to the type
+ of the transport - see :c:type:`enum nvme_trtype <nvme_trtype>`.
+
+``rsvd``
+ Reserved
+
+``cs``
+ Command Specific Information: This field contains command
+ specific information. If used, the command definition
+ specifies the information returned.
+
+``trtype_spec_info``
+ Transport Type Specific Information
+
+``rsvd2``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_smart_log
+
+ SMART / Health Information Log (Log Identifier 02h)
+
+**Definition**
+
+::
+
+ struct nvme_smart_log {
+ __u8 critical_warning;
+ __u8 temperature[2];
+ __u8 avail_spare;
+ __u8 spare_thresh;
+ __u8 percent_used;
+ __u8 endu_grp_crit_warn_sumry;
+ __u8 rsvd7[25];
+ __u8 data_units_read[16];
+ __u8 data_units_written[16];
+ __u8 host_reads[16];
+ __u8 host_writes[16];
+ __u8 ctrl_busy_time[16];
+ __u8 power_cycles[16];
+ __u8 power_on_hours[16];
+ __u8 unsafe_shutdowns[16];
+ __u8 media_errors[16];
+ __u8 num_err_log_entries[16];
+ __le32 warning_temp_time;
+ __le32 critical_comp_time;
+ __le16 temp_sensor[8];
+ __le32 thm_temp1_trans_count;
+ __le32 thm_temp2_trans_count;
+ __le32 thm_temp1_total_time;
+ __le32 thm_temp2_total_time;
+ __u8 rsvd232[280];
+ };
+
+**Members**
+
+``critical_warning``
+ This field indicates critical warnings for the state
+ of the controller. Critical warnings may result in an
+ asynchronous event notification to the host. Bits in
+ this field represent the current associated state and
+ are not persistent (see :c:type:`enum nvme_smart_crit <nvme_smart_crit>`).
+
+``temperature``
+ Composite Temperature: Contains a value corresponding
+ to a temperature in Kelvins that represents the current
+ composite temperature of the controller and namespace(s)
+ associated with that controller. The manner in which
+ this value is computed is implementation specific and
+ may not represent the actual temperature of any physical
+ point in the NVM subsystem. Warning and critical
+ overheating composite temperature threshold values are
+ reported by the WCTEMP and CCTEMP fields in the Identify
+ Controller data structure.
+
+``avail_spare``
+ Available Spare: Contains a normalized percentage (0%
+ to 100%) of the remaining spare capacity available.
+
+``spare_thresh``
+ Available Spare Threshold: When the Available Spare
+ falls below the threshold indicated in this field, an
+ asynchronous event completion may occur. The value is
+ indicated as a normalized percentage (0% to 100%).
+ The values 101 to 255 are reserved.
+
+``percent_used``
+ Percentage Used: Contains a vendor specific estimate
+ of the percentage of NVM subsystem life used based on
+ the actual usage and the manufacturer's prediction of
+ NVM life. A value of 100 indicates that the estimated
+ endurance of the NVM in the NVM subsystem has been
+ consumed, but may not indicate an NVM subsystem failure.
+ The value is allowed to exceed 100. Percentages greater
+ than 254 shall be represented as 255. This value shall
+ be updated once per power-on hour (when the controller
+ is not in a sleep state).
+
+``endu_grp_crit_warn_sumry``
+ Endurance Group Critical Warning Summary: This field
+ indicates critical warnings for the state of Endurance
+ Groups. Bits in this field represent the current associated
+ state and are not persistent (see :c:type:`enum nvme_smart_egcw <nvme_smart_egcw>`).
+
+``rsvd7``
+ Reserved
+
+``data_units_read``
+ Data Units Read: Contains the number of 512 byte data
+ units the host has read from the controller; this value
+ does not include metadata. This value is reported in
+ thousands (i.e., a value of 1 corresponds to 1000
+ units of 512 bytes read) and is rounded up (e.g., one
+ indicates the that number of 512 byte data units read
+ is from 1 to 1000, three indicates that the number of
+ 512 byte data units read is from 2001 to 3000). When
+ the LBA size is a value other than 512 bytes, the
+ controller shall convert the amount of data read to
+ 512 byte units. For the NVM command set, logical blocks
+ read as part of Compare, Read, and Verify operations
+ shall be included in this value. A value of ``0h`` in
+ this field indicates that the number of Data Units Read
+ is not reported.
+
+``data_units_written``
+ Data Units Written: Contains the number of 512 byte
+ data units the host has written to the controller;
+ this value does not include metadata. This value is
+ reported in thousands (i.e., a value of 1 corresponds
+ to 1000 units of 512 bytes written) and is rounded up
+ (e.g., one indicates that the number of 512 byte data
+ units written is from 1 to 1,000, three indicates that
+ the number of 512 byte data units written is from 2001
+ to 3000). When the LBA size is a value other than 512
+ bytes, the controller shall convert the amount of data
+ written to 512 byte units. For the NVM command set,
+ logical blocks written as part of Write operations shall
+ be included in this value. Write Uncorrectable commands
+ and Write Zeroes commands shall not impact this value.
+ A value of ``0h`` in this field indicates that the number
+ of Data Units Written is not reported.
+
+``host_reads``
+ Host Read Commands: Contains the number of read commands
+ completed by the controller. For the NVM command set,
+ this value is the sum of the number of Compare commands
+ and the number of Read commands.
+
+``host_writes``
+ Host Write Commands: Contains the number of write
+ commands completed by the controller. For the NVM
+ command set, this is the number of Write commands.
+
+``ctrl_busy_time``
+ Controller Busy Time: Contains the amount of time the
+ controller is busy with I/O commands. The controller
+ is busy when there is a command outstanding to an I/O
+ Queue (specifically, a command was issued via an I/O
+ Submission Queue Tail doorbell write and the corresponding
+ completion queue entry has not been posted yet to the
+ associated I/O Completion Queue). This value is
+ reported in minutes.
+
+``power_cycles``
+ Power Cycles: Contains the number of power cycles.
+
+``power_on_hours``
+ Power On Hours: Contains the number of power-on hours.
+ This may not include time that the controller was
+ powered and in a non-operational power state.
+
+``unsafe_shutdowns``
+ Unsafe Shutdowns: Contains the number of unsafe
+ shutdowns. This count is incremented when a Shutdown
+ Notification (CC.SHN) is not received prior to loss of power.
+
+``media_errors``
+ Media and Data Integrity Errors: Contains the number
+ of occurrences where the controller detected an
+ unrecovered data integrity error. Errors such as
+ uncorrectable ECC, CRC checksum failure, or LBA tag
+ mismatch are included in this field. Errors introduced
+ as a result of a Write Uncorrectable command may or
+ may not be included in this field.
+
+``num_err_log_entries``
+ Number of Error Information Log Entries: Contains the
+ number of Error Information log entries over the life
+ of the controller.
+
+``warning_temp_time``
+ Warning Composite Temperature Time: Contains the amount
+ of time in minutes that the controller is operational
+ and the Composite Temperature is greater than or equal
+ to the Warning Composite Temperature Threshold (WCTEMP)
+ field and less than the Critical Composite Temperature
+ Threshold (CCTEMP) field in the Identify Controller
+ data structure. If the value of the WCTEMP or CCTEMP
+ field is ``0h``, then this field is always cleared to ``0h``
+ regardless of the Composite Temperature value.
+
+``critical_comp_time``
+ Critical Composite Temperature Time: Contains the amount
+ of time in minutes that the controller is operational
+ and the Composite Temperature is greater than or equal
+ to the Critical Composite Temperature Threshold (CCTEMP)
+ field in the Identify Controller data structure. If
+ the value of the CCTEMP field is ``0h``, then this field
+ is always cleared to 0h regardless of the Composite
+ Temperature value.
+
+``temp_sensor``
+ Temperature Sensor 1-8: Contains the current temperature
+ in degrees Kelvin reported by temperature sensors 1-8.
+ The physical point in the NVM subsystem whose temperature
+ is reported by the temperature sensor and the temperature
+ accuracy is implementation specific. An implementation
+ that does not implement the temperature sensor reports
+ a value of ``0h``.
+
+``thm_temp1_trans_count``
+ Thermal Management Temperature 1 Transition Count:
+ Contains the number of times the controller transitioned
+ to lower power active power states or performed vendor
+ specific thermal management actions while minimizing
+ the impact on performance in order to attempt to reduce
+ the Composite Temperature because of the host controlled
+ thermal management feature (i.e., the Composite
+ Temperature rose above the Thermal Management
+ Temperature 1). This counter shall not wrap once the
+ value ``FFFFFFFFh`` is reached. A value of ``0h``, indicates
+ that this transition has never occurred or this field
+ is not implemented.
+
+``thm_temp2_trans_count``
+ Thermal Management Temperature 2 Transition Count
+
+``thm_temp1_total_time``
+ Total Time For Thermal Management Temperature 1:
+ Contains the number of seconds that the controller
+ had transitioned to lower power active power states or
+ performed vendor specific thermal management actions
+ while minimizing the impact on performance in order to
+ attempt to reduce the Composite Temperature because of
+ the host controlled thermal management feature. This
+ counter shall not wrap once the value ``FFFFFFFFh`` is
+ reached. A value of ``0h``, indicates that this transition
+ has never occurred or this field is not implemented.
+
+``thm_temp2_total_time``
+ Total Time For Thermal Management Temperature 2
+
+``rsvd232``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_smart_crit
+
+ Critical Warning
+
+**Constants**
+
+``NVME_SMART_CRIT_SPARE``
+ If set, then the available spare capacity has fallen
+ below the threshold.
+
+``NVME_SMART_CRIT_TEMPERATURE``
+ If set, then a temperature is either greater
+ than or equal to an over temperature threshold; or
+ less than or equal to an under temperature threshold.
+
+``NVME_SMART_CRIT_DEGRADED``
+ If set, then the NVM subsystem reliability has
+ been degraded due to significant media related errors
+ or any internal error that degrades NVM subsystem
+ reliability.
+
+``NVME_SMART_CRIT_MEDIA``
+ If set, then all of the media has been placed in read
+ only mode. The controller shall not set this bit if
+ the read-only condition on the media is a result of
+ a change in the write protection state of a namespace.
+
+``NVME_SMART_CRIT_VOLATILE_MEMORY``
+ If set, then the volatile memory backup
+ device has failed. This field is only valid if the
+ controller has a volatile memory backup solution.
+
+``NVME_SMART_CRIT_PMR_RO``
+ If set, then the Persistent Memory Region has become
+ read-only or unreliable.
+
+
+
+
+.. c:enum:: nvme_smart_egcw
+
+ Endurance Group Critical Warning Summary
+
+**Constants**
+
+``NVME_SMART_EGCW_SPARE``
+ If set, then the available spare capacity of one or
+ more Endurance Groups has fallen below the threshold.
+
+``NVME_SMART_EGCW_DEGRADED``
+ If set, then the reliability of one or more
+ Endurance Groups has been degraded due to significant
+ media related errors or any internal error that
+ degrades NVM subsystem reliability.
+
+``NVME_SMART_EGCW_RO``
+ If set, then the namespaces in one or more Endurance
+ Groups have been placed in read only mode not as
+ a result of a change in the write protection state
+ of a namespace.
+
+
+
+
+.. c:struct:: nvme_firmware_slot
+
+ Firmware Slot Information Log
+
+**Definition**
+
+::
+
+ struct nvme_firmware_slot {
+ __u8 afi;
+ __u8 rsvd1[7];
+ char frs[7][8];
+ __u8 rsvd2[448];
+ };
+
+**Members**
+
+``afi``
+ Active Firmware Info
+
+``rsvd1``
+ Reserved
+
+``frs``
+ Firmware Revision for Slot
+
+``rsvd2``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_cmd_effects_log
+
+ Commands Supported and Effects Log
+
+**Definition**
+
+::
+
+ struct nvme_cmd_effects_log {
+ __le32 acs[256];
+ __le32 iocs[256];
+ __u8 rsvd[2048];
+ };
+
+**Members**
+
+``acs``
+ Admin Command Supported
+
+``iocs``
+ I/O Command Supported
+
+``rsvd``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_cmd_effects
+
+ Commands Supported and Effects
+
+**Constants**
+
+``NVME_CMD_EFFECTS_CSUPP``
+ Command Supported
+
+``NVME_CMD_EFFECTS_LBCC``
+ Logical Block Content Change
+
+``NVME_CMD_EFFECTS_NCC``
+ Namespace Capability Change
+
+``NVME_CMD_EFFECTS_NIC``
+ Namespace Inventory Change
+
+``NVME_CMD_EFFECTS_CCC``
+ Controller Capability Change
+
+``NVME_CMD_EFFECTS_CSE_MASK``
+ Command Submission and Execution
+
+``NVME_CMD_EFFECTS_UUID_SEL``
+ UUID Selection Supported
+
+
+
+
+.. c:struct:: nvme_st_result
+
+ Self-test Result
+
+**Definition**
+
+::
+
+ struct nvme_st_result {
+ __u8 dsts;
+ __u8 seg;
+ __u8 vdi;
+ __u8 rsvd;
+ __le64 poh;
+ __le32 nsid;
+ __le64 flba;
+ __u8 sct;
+ __u8 sc;
+ __u8 vs[2];
+ };
+
+**Members**
+
+``dsts``
+ Device Self-test Status: Indicates the device self-test code and the
+ status of the operation (see :c:type:`enum nvme_status_result <nvme_status_result>` and :c:type:`enum nvme_st_code <nvme_st_code>`).
+
+``seg``
+ Segment Number: Iindicates the segment number where the first self-test
+ failure occurred. If Device Self-test Status (**dsts**) is not set to
+ #NVME_ST_RESULT_KNOWN_SEG_FAIL, then this field should be ignored.
+
+``vdi``
+ Valid Diagnostic Information: Indicates the diagnostic failure
+ information that is reported. See :c:type:`enum nvme_st_valid_diag_info <nvme_st_valid_diag_info>`.
+
+``rsvd``
+ Reserved
+
+``poh``
+ Power On Hours (POH): Indicates the number of power-on hours at the
+ time the device self-test operation was completed or aborted. This
+ does not include time that the controller was powered and in a low
+ power state condition.
+
+``nsid``
+ Namespace Identifier (NSID): Indicates the namespace that the Failing
+ LBA occurred on. Valid only when the NSID Valid bit
+ (#NVME_ST_VALID_DIAG_INFO_NSID) is set in the Valid Diagnostic
+ Information (**vdi**) field.
+
+``flba``
+ Failing LBA: indicates the LBA of the logical block that caused the
+ test to fail. If the device encountered more than one failed logical
+ block during the test, then this field only indicates one of those
+ failed logical blocks. Valid only when the NSID Valid bit
+ (#NVME_ST_VALID_DIAG_INFO_FLBA) is set in the Valid Diagnostic
+ Information (**vdi**) field.
+
+``sct``
+ Status Code Type: This field may contain additional information related
+ to errors or conditions. Bits 2:0 may contain additional information
+ relating to errors or conditions that occurred during the device
+ self-test operation represented in the same format used in the Status
+ Code Type field of the completion queue entry (refer to :c:type:`enum nvme_status_field <nvme_status_field>`).
+ Valid only when the NSID Valid bit (#NVME_ST_VALID_DIAG_INFO_SCT) is
+ set in the Valid Diagnostic Information (**vdi**) field.
+
+``sc``
+ Status Code: This field may contain additional information relating
+ to errors or conditions that occurred during the device self-test
+ operation represented in the same format used in the Status Code field
+ of the completion queue entry. Valid only when the SCT Valid bit
+ (#NVME_ST_VALID_DIAG_INFO_SC) is set in the Valid Diagnostic
+ Information (**vdi**) field.
+
+``vs``
+ Vendor Specific.
+
+
+
+
+
+.. c:enum:: nvme_status_result
+
+ Result of the device self-test operation
+
+**Constants**
+
+``NVME_ST_RESULT_NO_ERR``
+ Operation completed without error.
+
+``NVME_ST_RESULT_ABORTED``
+ Operation was aborted by a Device Self-test command.
+
+``NVME_ST_RESULT_CLR``
+ Operation was aborted by a Controller Level Reset.
+
+``NVME_ST_RESULT_NS_REMOVED``
+ Operation was aborted due to a removal of
+ a namespace from the namespace inventory.
+
+``NVME_ST_RESULT_ABORTED_FORMAT``
+ Operation was aborted due to the processing
+ of a Format NVM command.
+
+``NVME_ST_RESULT_FATAL_ERR``
+ A fatal error or unknown test error occurred
+ while the controller was executing the device
+ self-test operation and the operation did
+ not complete.
+
+``NVME_ST_RESULT_UNKNOWN_SEG_FAIL``
+ Operation completed with a segment that failed
+ and the segment that failed is not known.
+
+``NVME_ST_RESULT_KNOWN_SEG_FAIL``
+ Operation completed with one or more failed
+ segments and the first segment that failed
+ is indicated in the Segment Number field.
+
+``NVME_ST_RESULT_ABORTED_UNKNOWN``
+ Operation was aborted for unknown reason.
+
+``NVME_ST_RESULT_ABORTED_SANITIZE``
+ Operation was aborted due to a sanitize operation.
+
+``NVME_ST_RESULT_NOT_USED``
+ Entry not used (does not contain a test result).
+
+``NVME_ST_RESULT_MASK``
+ Mask to get the status result value from
+ the :c:type:`struct nvme_st_result <nvme_st_result>`.dsts field.
+
+
+
+
+.. c:enum:: nvme_st_code
+
+ Self-test Code value
+
+**Constants**
+
+``NVME_ST_CODE_RESERVED``
+ Reserved.
+
+``NVME_ST_CODE_SHORT``
+ Short device self-test operation.
+
+``NVME_ST_CODE_EXTENDED``
+ Extended device self-test operation.
+
+``NVME_ST_CODE_VS``
+ Vendor specific.
+
+``NVME_ST_CODE_ABORT``
+ Abort device self-test operation.
+
+``NVME_ST_CODE_SHIFT``
+ Shift amount to get the code value from the
+ :c:type:`struct nvme_st_result <nvme_st_result>`.dsts field.
+
+
+
+
+.. c:enum:: nvme_st_curr_op
+
+ Current Device Self-Test Operation
+
+**Constants**
+
+``NVME_ST_CURR_OP_NOT_RUNNING``
+ No device self-test operation in progress.
+
+``NVME_ST_CURR_OP_SHORT``
+ Short device self-test operation in progress.
+
+``NVME_ST_CURR_OP_EXTENDED``
+ Extended device self-test operation in progress.
+
+``NVME_ST_CURR_OP_VS``
+ Vendor specific.
+
+``NVME_ST_CURR_OP_RESERVED``
+ Reserved.
+
+``NVME_ST_CURR_OP_MASK``
+ Mask to get the current operation value from the
+ :c:type:`struct nvme_self_test_log <nvme_self_test_log>`.current_operation field.
+
+``NVME_ST_CURR_OP_CMPL_MASK``
+ Mask to get the current operation completion value
+ from the :c:type:`struct nvme_self_test_log <nvme_self_test_log>`.completion field.
+
+
+
+
+.. c:enum:: nvme_st_valid_diag_info
+
+ Valid Diagnostic Information
+
+**Constants**
+
+``NVME_ST_VALID_DIAG_INFO_NSID``
+ NSID Valid: if set, then the contents of
+ the Namespace Identifier field are valid.
+
+``NVME_ST_VALID_DIAG_INFO_FLBA``
+ FLBA Valid: if set, then the contents of
+ the Failing LBA field are valid.
+
+``NVME_ST_VALID_DIAG_INFO_SCT``
+ SCT Valid: if set, then the contents of
+ the Status Code Type field are valid.
+
+``NVME_ST_VALID_DIAG_INFO_SC``
+ SC Valid: if set, then the contents of
+ the Status Code field are valid.
+
+
+
+
+.. c:struct:: nvme_self_test_log
+
+ Device Self-test (Log Identifier 06h)
+
+**Definition**
+
+::
+
+ struct nvme_self_test_log {
+ __u8 current_operation;
+ __u8 completion;
+ __u8 rsvd[2];
+ struct nvme_st_result result[NVME_LOG_ST_MAX_RESULTS];
+ };
+
+**Members**
+
+``current_operation``
+ Current Device Self-Test Operation: indicates the status
+ of the current device self-test operation. If a device
+ self-test operation is in process (i.e., this field is set
+ to #NVME_ST_CURR_OP_SHORT or #NVME_ST_CURR_OP_EXTENDED),
+ then the controller shall not set this field to
+ #NVME_ST_CURR_OP_NOT_RUNNING until a new Self-test Result
+ Data Structure is created (i.e., if a device self-test
+ operation completes or is aborted, then the controller
+ shall create a Self-test Result Data Structure prior to
+ setting this field to #NVME_ST_CURR_OP_NOT_RUNNING).
+ See :c:type:`enum nvme_st_curr_op <nvme_st_curr_op>`.
+
+``completion``
+ Current Device Self-Test Completion: indicates the percentage
+ of the device self-test operation that is complete (e.g.,
+ a value of 25 indicates that 25% of the device self-test
+ operation is complete and 75% remains to be tested).
+ If the **current_operation** field is cleared to
+ #NVME_ST_CURR_OP_NOT_RUNNING (indicating there is no device
+ self-test operation in progress), then this field is ignored.
+
+``rsvd``
+ Reserved
+
+``result``
+ Self-test Result Data Structures, see :c:type:`struct nvme_st_result <nvme_st_result>`.
+
+
+
+
+
+.. c:enum:: nvme_cmd_get_log_telemetry_host_lsp
+
+ Telemetry Host-Initiated log specific field
+
+**Constants**
+
+``NVME_LOG_TELEM_HOST_LSP_RETAIN``
+ Get Telemetry Data Blocks
+
+``NVME_LOG_TELEM_HOST_LSP_CREATE``
+ Create Telemetry Data Blocks
+
+
+
+
+.. c:struct:: nvme_telemetry_log
+
+ Retrieve internal data specific to the manufacturer.
+
+**Definition**
+
+::
+
+ struct nvme_telemetry_log {
+ __u8 lpi;
+ __u8 rsvd1[4];
+ __u8 ieee[3];
+ __le16 dalb1;
+ __le16 dalb2;
+ __le16 dalb3;
+ __u8 rsvd14[2];
+ __le32 dalb4;
+ __u8 rsvd20[361];
+ __u8 hostdgn;
+ __u8 ctrlavail;
+ __u8 ctrldgn;
+ __u8 rsnident[128];
+ __u8 data_area[];
+ };
+
+**Members**
+
+``lpi``
+ Log Identifier, either ``NVME_LOG_LID_TELEMETRY_HOST`` or
+ ``NVME_LOG_LID_TELEMETRY_CTRL``
+
+``rsvd1``
+ Reserved
+
+``ieee``
+ IEEE OUI Identifier is the Organization Unique Identifier (OUI)
+ for the controller vendor that is able to interpret the data.
+
+``dalb1``
+ Telemetry Controller-Initiated Data Area 1 Last Block is
+ the value of the last block in this area.
+
+``dalb2``
+ Telemetry Controller-Initiated Data Area 1 Last Block is
+ the value of the last block in this area.
+
+``dalb3``
+ Telemetry Controller-Initiated Data Area 1 Last Block is
+ the value of the last block in this area.
+
+``rsvd14``
+ Reserved
+
+``dalb4``
+ Telemetry Controller-Initiated Data Area 4 Last Block is
+ the value of the last block in this area.
+
+``rsvd20``
+ Reserved
+
+``hostdgn``
+ Telemetry Host-Initiated Data Generation Number is a
+ value that is incremented each time the host initiates a
+ capture of its internal controller state in the controller .
+
+``ctrlavail``
+ Telemetry Controller-Initiated Data Available, if cleared,
+ then the controller telemetry log does not contain saved
+ internal controller state. If this field is set to 1h, the
+ controller log contains saved internal controller state. If
+ this field is set to 1h, the data will be latched until the
+ host releases it by reading the log with RAE cleared.
+
+``ctrldgn``
+ Telemetry Controller-Initiated Data Generation Number is
+ a value that is incremented each time the controller initiates a
+ capture of its internal controller state in the controller .
+
+``rsnident``
+ Reason Identifiers a vendor specific identifier that describes
+ the operating conditions of the controller at the time of
+ capture.
+
+``data_area``
+ Telemetry data blocks, vendor specific information data.
+
+
+**Description**
+
+This log consists of a header describing the log and zero or more Telemetry
+Data Blocks. All Telemetry Data Blocks are ``NVME_LOG_TELEM_BLOCK_SIZE``, 512
+bytes, in size. This log captures the controller’s internal state.
+
+
+
+
+.. c:struct:: nvme_endurance_group_log
+
+ Endurance Group Information Log
+
+**Definition**
+
+::
+
+ struct nvme_endurance_group_log {
+ __u8 critical_warning;
+ __u8 rsvd1[2];
+ __u8 avl_spare;
+ __u8 avl_spare_threshold;
+ __u8 percent_used;
+ __u8 rsvd6[26];
+ __u8 endurance_estimate[16];
+ __u8 data_units_read[16];
+ __u8 data_units_written[16];
+ __u8 media_units_written[16];
+ __u8 host_read_cmds[16];
+ __u8 host_write_cmds[16];
+ __u8 media_data_integrity_err[16];
+ __u8 num_err_info_log_entries[16];
+ __u8 rsvd160[352];
+ };
+
+**Members**
+
+``critical_warning``
+ Critical Warning
+
+``rsvd1``
+ Reserved
+
+``avl_spare``
+ Available Spare
+
+``avl_spare_threshold``
+ Available Spare Threshold
+
+``percent_used``
+ Percentage Used
+
+``rsvd6``
+ Reserved
+
+``endurance_estimate``
+ Endurance Estimate
+
+``data_units_read``
+ Data Units Read
+
+``data_units_written``
+ Data Units Written
+
+``media_units_written``
+ Media Units Written
+
+``host_read_cmds``
+ Host Read Commands
+
+``host_write_cmds``
+ Host Write Commands
+
+``media_data_integrity_err``
+ Media and Data Integrity Errors
+
+``num_err_info_log_entries``
+ Number of Error Information Log Entries
+
+``rsvd160``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_eg_critical_warning_flags
+
+ Endurance Group Information Log - Critical Warning
+
+**Constants**
+
+``NVME_EG_CRITICAL_WARNING_SPARE``
+ Available spare capacity of the Endurance Group
+ has fallen below the threshold
+
+``NVME_EG_CRITICAL_WARNING_DEGRADED``
+ Endurance Group reliability has been degraded
+
+``NVME_EG_CRITICAL_WARNING_READ_ONLY``
+ Endurance Group have been placed in read only
+ mode
+
+
+
+
+.. c:struct:: nvme_aggregate_endurance_group_event
+
+ Endurance Group Event Aggregate
+
+**Definition**
+
+::
+
+ struct nvme_aggregate_endurance_group_event {
+ __le64 num_entries;
+ __le16 entries[];
+ };
+
+**Members**
+
+``num_entries``
+ Number or entries
+
+``entries``
+ List of entries
+
+
+
+
+
+.. c:struct:: nvme_nvmset_predictable_lat_log
+
+ Predictable Latency Mode - Deterministic Threshold Configuration Data
+
+**Definition**
+
+::
+
+ struct nvme_nvmset_predictable_lat_log {
+ __u8 status;
+ __u8 rsvd1;
+ __le16 event_type;
+ __u8 rsvd4[28];
+ __le64 dtwin_rt;
+ __le64 dtwin_wt;
+ __le64 dtwin_tmax;
+ __le64 ndwin_tmin_hi;
+ __le64 ndwin_tmin_lo;
+ __u8 rsvd72[56];
+ __le64 dtwin_re;
+ __le64 dtwin_we;
+ __le64 dtwin_te;
+ __u8 rsvd152[360];
+ };
+
+**Members**
+
+``status``
+ Status
+
+``rsvd1``
+ Reserved
+
+``event_type``
+ Event Type
+
+``rsvd4``
+ Reserved
+
+``dtwin_rt``
+ DTWIN Reads Typical
+
+``dtwin_wt``
+ DTWIN Writes Typical
+
+``dtwin_tmax``
+ DTWIN Time Maximum
+
+``ndwin_tmin_hi``
+ NDWIN Time Minimum High
+
+``ndwin_tmin_lo``
+ NDWIN Time Minimum Low
+
+``rsvd72``
+ Reserved
+
+``dtwin_re``
+ DTWIN Reads Estimate
+
+``dtwin_we``
+ DTWIN Writes Estimate
+
+``dtwin_te``
+ DTWIN Time Estimate
+
+``rsvd152``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_nvmeset_pl_status
+
+ Predictable Latency Per NVM Set Log - Status
+
+**Constants**
+
+``NVME_NVMSET_PL_STATUS_DISABLED``
+ Not used (Predictable Latency Mode not enabled)
+
+``NVME_NVMSET_PL_STATUS_DTWIN``
+ Deterministic Window (DTWIN)
+
+``NVME_NVMSET_PL_STATUS_NDWIN``
+ Non-Deterministic Window (NDWIN)
+
+
+
+
+.. c:enum:: nvme_nvmset_pl_events
+
+ Predictable Latency Per NVM Set Log - Event Type
+
+**Constants**
+
+``NVME_NVMSET_PL_EVENT_DTWIN_READ_WARN``
+ DTWIN Reads Warning
+
+``NVME_NVMSET_PL_EVENT_DTWIN_WRITE_WARN``
+ DTWIN Writes Warning
+
+``NVME_NVMSET_PL_EVENT_DTWIN_TIME_WARN``
+ DTWIN Time Warning
+
+``NVME_NVMSET_PL_EVENT_DTWIN_EXCEEDED``
+ Autonomous transition from DTWIN
+ to NDWIN due to typical or
+ maximum value exceeded
+
+``NVME_NVMSET_PL_EVENT_DTWIN_EXCURSION``
+ Autonomous transition from DTWIN
+ to NDWIN due to Deterministic
+ Excursion
+
+
+
+
+.. c:struct:: nvme_aggregate_predictable_lat_event
+
+ Predictable Latency Event Aggregate Log Page
+
+**Definition**
+
+::
+
+ struct nvme_aggregate_predictable_lat_event {
+ __le64 num_entries;
+ __le16 entries[];
+ };
+
+**Members**
+
+``num_entries``
+ Number of entries
+
+``entries``
+ Entry list
+
+
+
+
+
+.. c:struct:: nvme_ana_group_desc
+
+ ANA Group Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_ana_group_desc {
+ __le32 grpid;
+ __le32 nnsids;
+ __le64 chgcnt;
+ __u8 state;
+ __u8 rsvd17[15];
+ __le32 nsids[];
+ };
+
+**Members**
+
+``grpid``
+ ANA group id
+
+``nnsids``
+ Number of namespaces in **nsids**
+
+``chgcnt``
+ Change counter
+
+``state``
+ ANA state
+
+``rsvd17``
+ Reserved
+
+``nsids``
+ List of namespaces
+
+
+
+
+
+.. c:enum:: nvme_ana_state
+
+ ANA Group Descriptor - Asymmetric Namespace Access State
+
+**Constants**
+
+``NVME_ANA_STATE_OPTIMIZED``
+ ANA Optimized state
+
+``NVME_ANA_STATE_NONOPTIMIZED``
+ ANA Non-Optimized state
+
+``NVME_ANA_STATE_INACCESSIBLE``
+ ANA Inaccessible state
+
+``NVME_ANA_STATE_PERSISTENT_LOSS``
+ ANA Persistent Loss state
+
+``NVME_ANA_STATE_CHANGE``
+ ANA Change state
+
+
+
+
+.. c:struct:: nvme_ana_log
+
+ Asymmetric Namespace Access Log
+
+**Definition**
+
+::
+
+ struct nvme_ana_log {
+ __le64 chgcnt;
+ __le16 ngrps;
+ __u8 rsvd10[6];
+ struct nvme_ana_group_desc descs[];
+ };
+
+**Members**
+
+``chgcnt``
+ Change Count
+
+``ngrps``
+ Number of ANA Group Descriptors
+
+``rsvd10``
+ Reserved
+
+``descs``
+ ANA Group Descriptor
+
+
+
+
+
+.. c:struct:: nvme_persistent_event_log
+
+ Persistent Event Log
+
+**Definition**
+
+::
+
+ struct nvme_persistent_event_log {
+ __u8 lid;
+ __u8 rsvd1[3];
+ __le32 tnev;
+ __le64 tll;
+ __u8 rv;
+ __u8 rsvd17;
+ __le16 lhl;
+ __le64 ts;
+ __u8 poh[16];
+ __le64 pcc;
+ __le16 vid;
+ __le16 ssvid;
+ char sn[20];
+ char mn[40];
+ char subnqn[NVME_NQN_LENGTH];
+ __le16 gen_number;
+ __le32 rci;
+ __u8 rsvd378[102];
+ __u8 seb[32];
+ };
+
+**Members**
+
+``lid``
+ Log Identifier
+
+``rsvd1``
+ Reserved
+
+``tnev``
+ Total Number of Events
+
+``tll``
+ Total Log Length
+
+``rv``
+ Log Revision
+
+``rsvd17``
+ Reserved
+
+``lhl``
+ Log Header Length
+
+``ts``
+ Timestamp
+
+``poh``
+ Power on Hours
+
+``pcc``
+ Power Cycle Count
+
+``vid``
+ PCI Vendor ID
+
+``ssvid``
+ PCI Subsystem Vendor ID
+
+``sn``
+ Serial Number
+
+``mn``
+ Model Number
+
+``subnqn``
+ NVM Subsystem NVMe Qualified Name
+
+``gen_number``
+ Generation Number
+
+``rci``
+ Reporting Context Information
+
+``rsvd378``
+ Reserved
+
+``seb``
+ Supported Events Bitmap
+
+
+
+
+
+.. c:struct:: nvme_persistent_event_entry
+
+ Persistent Event
+
+**Definition**
+
+::
+
+ struct nvme_persistent_event_entry {
+ __u8 etype;
+ __u8 etype_rev;
+ __u8 ehl;
+ __u8 ehai;
+ __le16 cntlid;
+ __le64 ets;
+ __le16 pelpid;
+ __u8 rsvd16[4];
+ __le16 vsil;
+ __le16 el;
+ };
+
+**Members**
+
+``etype``
+ Event Type
+
+``etype_rev``
+ Event Type Revision
+
+``ehl``
+ Event Header Length
+
+``ehai``
+ Event Header Additional Info
+
+``cntlid``
+ Controller Identifier
+
+``ets``
+ Event Timestamp
+
+``pelpid``
+ Port Identifier
+
+``rsvd16``
+ Reserved
+
+``vsil``
+ Vendor Specific Information Length
+
+``el``
+ Event Length
+
+
+
+
+
+.. c:enum:: nvme_persistent_event_types
+
+ Persistent event log events
+
+**Constants**
+
+``NVME_PEL_SMART_HEALTH_EVENT``
+ SMART / Health Log Snapshot Event
+
+``NVME_PEL_FW_COMMIT_EVENT``
+ Firmware Commit Event
+
+``NVME_PEL_TIMESTAMP_EVENT``
+ Timestamp Change Event
+
+``NVME_PEL_POWER_ON_RESET_EVENT``
+ Power-on or Reset Event
+
+``NVME_PEL_NSS_HW_ERROR_EVENT``
+ NVM Subsystem Hardware Error Event
+
+``NVME_PEL_CHANGE_NS_EVENT``
+ Change Namespace Event
+
+``NVME_PEL_FORMAT_START_EVENT``
+ Format NVM Start Event
+
+``NVME_PEL_FORMAT_COMPLETION_EVENT``
+ Format NVM Completion Event
+
+``NVME_PEL_SANITIZE_START_EVENT``
+ Sanitize Start Event
+
+``NVME_PEL_SANITIZE_COMPLETION_EVENT``
+ Sanitize Completion Event
+
+``NVME_PEL_SET_FEATURE_EVENT``
+ Set Feature Event
+
+``NVME_PEL_TELEMETRY_CRT``
+ Telemetry Log Create Event
+
+``NVME_PEL_THERMAL_EXCURSION_EVENT``
+ Thermal Excursion Event
+
+
+
+
+.. c:struct:: nvme_fw_commit_event
+
+ Firmware Commit Event Data
+
+**Definition**
+
+::
+
+ struct nvme_fw_commit_event {
+ __le64 old_fw_rev;
+ __le64 new_fw_rev;
+ __u8 fw_commit_action;
+ __u8 fw_slot;
+ __u8 sct_fw;
+ __u8 sc_fw;
+ __le16 vndr_assign_fw_commit_rc;
+ };
+
+**Members**
+
+``old_fw_rev``
+ Old Firmware Revision
+
+``new_fw_rev``
+ New Firmware Revision
+
+``fw_commit_action``
+ Firmware Commit Action
+
+``fw_slot``
+ Firmware Slot
+
+``sct_fw``
+ Status Code Type for Firmware Commit Command
+
+``sc_fw``
+ Status Returned for Firmware Commit Command
+
+``vndr_assign_fw_commit_rc``
+ Vendor Assigned Firmware Commit Result Code
+
+
+
+
+
+.. c:struct:: nvme_timestamp
+
+ Timestamp - Data Structure for Get Features
+
+**Definition**
+
+::
+
+ struct nvme_timestamp {
+ __u8 timestamp[6];
+ __u8 attr;
+ __u8 rsvd;
+ };
+
+**Members**
+
+``timestamp``
+ Timestamp value based on origin and synch field
+
+``attr``
+ Attribute
+
+``rsvd``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_time_stamp_change_event
+
+ Timestamp Change Event
+
+**Definition**
+
+::
+
+ struct nvme_time_stamp_change_event {
+ __le64 previous_timestamp;
+ __le64 ml_secs_since_reset;
+ };
+
+**Members**
+
+``previous_timestamp``
+ Previous Timestamp
+
+``ml_secs_since_reset``
+ Milliseconds Since Reset
+
+
+
+
+
+.. c:struct:: nvme_power_on_reset_info_list
+
+ Controller Reset Information
+
+**Definition**
+
+::
+
+ struct nvme_power_on_reset_info_list {
+ __le16 cid;
+ __u8 fw_act;
+ __u8 op_in_prog;
+ __u8 rsvd4[12];
+ __le32 ctrl_power_cycle;
+ __le64 power_on_ml_seconds;
+ __le64 ctrl_time_stamp;
+ };
+
+**Members**
+
+``cid``
+ Controller ID
+
+``fw_act``
+ Firmware Activation
+
+``op_in_prog``
+ Operation in Progress
+
+``rsvd4``
+ Reserved
+
+``ctrl_power_cycle``
+ Controller Power Cycle
+
+``power_on_ml_seconds``
+ Power on milliseconds
+
+``ctrl_time_stamp``
+ Controller Timestamp
+
+
+
+
+
+.. c:struct:: nvme_nss_hw_err_event
+
+ NVM Subsystem Hardware Error Event
+
+**Definition**
+
+::
+
+ struct nvme_nss_hw_err_event {
+ __le16 nss_hw_err_event_code;
+ __u8 rsvd2[2];
+ __u8 *add_hw_err_info;
+ };
+
+**Members**
+
+``nss_hw_err_event_code``
+ NVM Subsystem Hardware Error Event Code
+
+``rsvd2``
+ Reserved
+
+``add_hw_err_info``
+ Additional Hardware Error Information
+
+
+
+
+
+.. c:struct:: nvme_change_ns_event
+
+ Change Namespace Event Data
+
+**Definition**
+
+::
+
+ struct nvme_change_ns_event {
+ __le32 nsmgt_cdw10;
+ __u8 rsvd4[4];
+ __le64 nsze;
+ __u8 rsvd16[8];
+ __le64 nscap;
+ __u8 flbas;
+ __u8 dps;
+ __u8 nmic;
+ __u8 rsvd35;
+ __le32 ana_grp_id;
+ __le16 nvmset_id;
+ __le16 rsvd42;
+ __le32 nsid;
+ };
+
+**Members**
+
+``nsmgt_cdw10``
+ Namespace Management CDW10
+
+``rsvd4``
+ Reserved
+
+``nsze``
+ Namespace Size
+
+``rsvd16``
+ Reserved
+
+``nscap``
+ Namespace Capacity
+
+``flbas``
+ Formatted LBA Size
+
+``dps``
+ End-to-end Data Protection Type Settings
+
+``nmic``
+ Namespace Multi-path I/O and Namespace Sharing Capabilities
+
+``rsvd35``
+ Reserved
+
+``ana_grp_id``
+ ANA Group Identifier
+
+``nvmset_id``
+ NVM Set Identifier
+
+``rsvd42``
+ Reserved
+
+``nsid``
+ Namespace ID
+
+
+
+
+
+.. c:struct:: nvme_format_nvm_start_event
+
+ Format NVM Start Event Data
+
+**Definition**
+
+::
+
+ struct nvme_format_nvm_start_event {
+ __le32 nsid;
+ __u8 fna;
+ __u8 rsvd5[3];
+ __le32 format_nvm_cdw10;
+ };
+
+**Members**
+
+``nsid``
+ Namespace Identifier
+
+``fna``
+ Format NVM Attributes
+
+``rsvd5``
+ Reserved
+
+``format_nvm_cdw10``
+ Format NVM CDW10
+
+
+
+
+
+.. c:struct:: nvme_format_nvm_compln_event
+
+ Format NVM Completion Event Data
+
+**Definition**
+
+::
+
+ struct nvme_format_nvm_compln_event {
+ __le32 nsid;
+ __u8 smallest_fpi;
+ __u8 format_nvm_status;
+ __le16 compln_info;
+ __le32 status_field;
+ };
+
+**Members**
+
+``nsid``
+ Namespace Identifier
+
+``smallest_fpi``
+ Smallest Format Progress Indicator
+
+``format_nvm_status``
+ Format NVM Status
+
+``compln_info``
+ Completion Information
+
+``status_field``
+ Status Field
+
+
+
+
+
+.. c:struct:: nvme_sanitize_start_event
+
+ Sanitize Start Event Data
+
+**Definition**
+
+::
+
+ struct nvme_sanitize_start_event {
+ __le32 sani_cap;
+ __le32 sani_cdw10;
+ __le32 sani_cdw11;
+ };
+
+**Members**
+
+``sani_cap``
+ SANICAP
+
+``sani_cdw10``
+ Sanitize CDW10
+
+``sani_cdw11``
+ Sanitize CDW11
+
+
+
+
+
+.. c:struct:: nvme_sanitize_compln_event
+
+ Sanitize Completion Event Data
+
+**Definition**
+
+::
+
+ struct nvme_sanitize_compln_event {
+ __le16 sani_prog;
+ __le16 sani_status;
+ __le16 cmpln_info;
+ __u8 rsvd6[2];
+ };
+
+**Members**
+
+``sani_prog``
+ Sanitize Progress
+
+``sani_status``
+ Sanitize Status
+
+``cmpln_info``
+ Completion Information
+
+``rsvd6``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_set_feature_event
+
+ Set Feature Event Data
+
+**Definition**
+
+::
+
+ struct nvme_set_feature_event {
+ __le32 layout;
+ __le32 cdw_mem[0];
+ };
+
+**Members**
+
+``layout``
+ Set Feature Event Layout
+
+``cdw_mem``
+ Command Dwords Memory buffer
+
+
+
+
+
+.. c:struct:: nvme_thermal_exc_event
+
+ Thermal Excursion Event Data
+
+**Definition**
+
+::
+
+ struct nvme_thermal_exc_event {
+ __u8 over_temp;
+ __u8 threshold;
+ };
+
+**Members**
+
+``over_temp``
+ Over Temperature
+
+``threshold``
+ temperature threshold
+
+
+
+
+
+.. c:struct:: nvme_lba_rd
+
+ LBA Range Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_lba_rd {
+ __le64 rslba;
+ __le32 rnlb;
+ __u8 rsvd12[4];
+ };
+
+**Members**
+
+``rslba``
+ Range Starting LBA
+
+``rnlb``
+ Range Number of Logical Blocks
+
+``rsvd12``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_lbas_ns_element
+
+ LBA Status Log Namespace Element
+
+**Definition**
+
+::
+
+ struct nvme_lbas_ns_element {
+ __le32 neid;
+ __le32 nlrd;
+ __u8 ratype;
+ __u8 rsvd8[7];
+ struct nvme_lba_rd lba_rd[];
+ };
+
+**Members**
+
+``neid``
+ Namespace Element Identifier
+
+``nlrd``
+ Number of LBA Range Descriptors
+
+``ratype``
+ Recommended Action Type. see **enum** nvme_lba_status_atype
+
+``rsvd8``
+ Reserved
+
+``lba_rd``
+ LBA Range Descriptor
+
+
+
+
+
+.. c:enum:: nvme_lba_status_atype
+
+ Potentially Unrecoverable LBAs
+
+**Constants**
+
+``NVME_LBA_STATUS_ATYPE_SCAN_UNTRACKED``
+ Potentially Unrecoverable LBAs
+
+``NVME_LBA_STATUS_ATYPE_SCAN_TRACKED``
+ Potentially Unrecoverable LBAs
+ associated with physical storage
+
+
+
+
+.. c:struct:: nvme_lba_status_log
+
+ LBA Status Information Log
+
+**Definition**
+
+::
+
+ struct nvme_lba_status_log {
+ __le32 lslplen;
+ __le32 nlslne;
+ __le32 estulb;
+ __u8 rsvd12[2];
+ __le16 lsgc;
+ struct nvme_lbas_ns_element elements[];
+ };
+
+**Members**
+
+``lslplen``
+ LBA Status Log Page Length
+
+``nlslne``
+ Number of LBA Status Log Namespace Elements
+
+``estulb``
+ Estimate of Unrecoverable Logical Blocks
+
+``rsvd12``
+ Reserved
+
+``lsgc``
+ LBA Status Generation Counter
+
+``elements``
+ LBA Status Log Namespace Element List
+
+
+
+
+
+.. c:struct:: nvme_eg_event_aggregate_log
+
+ Endurance Group Event Aggregate
+
+**Definition**
+
+::
+
+ struct nvme_eg_event_aggregate_log {
+ __le64 nr_entries;
+ __le16 egids[];
+ };
+
+**Members**
+
+``nr_entries``
+ Number of Entries
+
+``egids``
+ Endurance Group Identifier
+
+
+
+
+
+.. c:enum:: nvme_fid_supported_effects
+
+ FID Supported and Effects Data Structure definitions
+
+**Constants**
+
+``NVME_FID_SUPPORTED_EFFECTS_FSUPP``
+ FID Supported
+
+``NVME_FID_SUPPORTED_EFFECTS_UDCC``
+ User Data Content Change
+
+``NVME_FID_SUPPORTED_EFFECTS_NCC``
+ Namespace Capability Change
+
+``NVME_FID_SUPPORTED_EFFECTS_NIC``
+ Namespace Inventory Change
+
+``NVME_FID_SUPPORTED_EFFECTS_CCC``
+ Controller Capability Change
+
+``NVME_FID_SUPPORTED_EFFECTS_UUID_SEL``
+ UUID Selection Supported
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_SHIFT``
+ FID Scope Shift
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_MASK``
+ FID Scope Mask
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_NS``
+ Namespace Scope
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_CTRL``
+ Controller Scope
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_NVM_SET``
+ NVM Set Scope
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_ENDGRP``
+ Endurance Group Scope
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_DOMAIN``
+ Domain Scope
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_NSS``
+ NVM Subsystem Scope
+
+
+
+
+.. c:struct:: nvme_fid_supported_effects_log
+
+ Feature Identifiers Supported and Effects
+
+**Definition**
+
+::
+
+ struct nvme_fid_supported_effects_log {
+ __le32 fid_support[NVME_LOG_FID_SUPPORTED_EFFECTS_MAX];
+ };
+
+**Members**
+
+``fid_support``
+ Feature Identifier Supported
+
+
+
+
+
+.. c:enum:: nvme_mi_cmd_supported_effects
+
+ MI Command Supported and Effects Data Structure
+
+**Constants**
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_CSUPP``
+ Command Supported
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_UDCC``
+ User Data Content Change
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_NCC``
+ Namespace Capability Change
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_NIC``
+ Namespace Inventory Change
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_CCC``
+ Controller Capability Change
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_SHIFT``
+ 20 bit shift
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_MASK``
+ 12 bit mask - 0xfff
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NS``
+ Namespace Scope
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_CTRL``
+ Controller Scope
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NVM_SET``
+ NVM Set Scope
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_ENDGRP``
+ Endurance Group Scope
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_DOMAIN``
+ Domain Scope
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NSS``
+ NVM Subsystem Scope
+
+
+
+
+.. c:struct:: nvme_mi_cmd_supported_effects_log
+
+ NVMe-MI Commands Supported and Effects Log
+
+**Definition**
+
+::
+
+ struct nvme_mi_cmd_supported_effects_log {
+ __le32 mi_cmd_support[NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_MAX];
+ __le32 reserved1[NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_RESERVED];
+ };
+
+**Members**
+
+``mi_cmd_support``
+ NVMe-MI Commands Supported
+
+``reserved1``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_boot_partition
+
+ Boot Partition Log
+
+**Definition**
+
+::
+
+ struct nvme_boot_partition {
+ __u8 lid;
+ __u8 rsvd1[3];
+ __le32 bpinfo;
+ __u8 rsvd8[8];
+ __u8 boot_partition_data[];
+ };
+
+**Members**
+
+``lid``
+ Boot Partition Identifier
+
+``rsvd1``
+ Reserved
+
+``bpinfo``
+ Boot Partition Information
+
+``rsvd8``
+ Reserved
+
+``boot_partition_data``
+ Contains the contents of the
+ specified Boot Partition
+
+
+
+
+
+.. c:struct:: nvme_media_unit_stat_desc
+
+ Media Unit Status Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_media_unit_stat_desc {
+ __le16 muid;
+ __le16 domainid;
+ __le16 endgid;
+ __le16 nvmsetid;
+ __le16 cap_adj_fctr;
+ __u8 avl_spare;
+ __u8 percent_used;
+ __u8 mucs;
+ __u8 cio;
+ };
+
+**Members**
+
+``muid``
+ Media Unit Identifier
+
+``domainid``
+ Domain Identifier
+
+``endgid``
+ Endurance Group Identifier
+
+``nvmsetid``
+ NVM Set Identifier
+
+``cap_adj_fctr``
+ Capacity Adjustment Factor
+
+``avl_spare``
+ Available Spare
+
+``percent_used``
+ Percentage Used
+
+``mucs``
+ Number of Channels attached to media units
+
+``cio``
+ Channel Identifiers Offset
+
+
+
+
+
+.. c:struct:: nvme_media_unit_stat_log
+
+ Media Unit Status
+
+**Definition**
+
+::
+
+ struct nvme_media_unit_stat_log {
+ __le16 nmu;
+ __le16 cchans;
+ __le16 sel_config;
+ __u8 rsvd6[10];
+ struct nvme_media_unit_stat_desc mus_desc[];
+ };
+
+**Members**
+
+``nmu``
+ Number unit status descriptor
+
+``cchans``
+ Number of Channels
+
+``sel_config``
+ Selected Configuration
+
+``rsvd6``
+ Reserved
+
+``mus_desc``
+ Media unit statistic descriptors
+
+
+
+
+
+.. c:struct:: nvme_media_unit_config_desc
+
+ Media Unit Configuration Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_media_unit_config_desc {
+ __le16 muid;
+ __u8 rsvd2[4];
+ __le16 mudl;
+ };
+
+**Members**
+
+``muid``
+ Media Unit Identifier
+
+``rsvd2``
+ Reserved
+
+``mudl``
+ Media Unit Descriptor Length
+
+
+
+
+
+.. c:struct:: nvme_channel_config_desc
+
+ Channel Configuration Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_channel_config_desc {
+ __le16 chanid;
+ __le16 chmus;
+ struct nvme_media_unit_config_desc mu_config_desc[];
+ };
+
+**Members**
+
+``chanid``
+ Channel Identifier
+
+``chmus``
+ Number Channel Media Units
+
+``mu_config_desc``
+ Channel Unit config descriptors.
+ See **struct** nvme_media_unit_config_desc
+
+
+
+
+
+.. c:struct:: nvme_end_grp_chan_desc
+
+ Endurance Group Channel Configuration Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_end_grp_chan_desc {
+ __le16 egchans;
+ struct nvme_channel_config_desc chan_config_desc[];
+ };
+
+**Members**
+
+``egchans``
+ Number of Channels
+
+``chan_config_desc``
+ Channel config descriptors.
+ See **struct** nvme_channel_config_desc
+
+
+
+
+
+.. c:struct:: nvme_end_grp_config_desc
+
+ Endurance Group Configuration Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_end_grp_config_desc {
+ __le16 endgid;
+ __le16 cap_adj_factor;
+ __u8 rsvd4[12];
+ __u8 tegcap[16];
+ __u8 segcap[16];
+ __u8 end_est[16];
+ __u8 rsvd64[16];
+ __le16 egsets;
+ __le16 nvmsetid[];
+ };
+
+**Members**
+
+``endgid``
+ Endurance Group Identifier
+
+``cap_adj_factor``
+ Capacity Adjustment Factor
+
+``rsvd4``
+ Reserved
+
+``tegcap``
+ Total Endurance Group Capacity
+
+``segcap``
+ Spare Endurance Group Capacity
+
+``end_est``
+ Endurance Estimate
+
+``rsvd64``
+ Reserved
+
+``egsets``
+ Number of NVM Sets
+
+``nvmsetid``
+ NVM Set Identifier
+
+
+
+
+
+.. c:struct:: nvme_capacity_config_desc
+
+ Capacity Configuration structure definitions
+
+**Definition**
+
+::
+
+ struct nvme_capacity_config_desc {
+ __le16 cap_config_id;
+ __le16 domainid;
+ __le16 egcn;
+ __u8 rsvd6[26];
+ struct nvme_end_grp_config_desc egcd[];
+ };
+
+**Members**
+
+``cap_config_id``
+ Capacity Configuration Identifier
+
+``domainid``
+ Domain Identifier
+
+``egcn``
+ Number Endurance Group Configuration
+ Descriptors
+
+``rsvd6``
+ Reserved
+
+``egcd``
+ Endurance Group Config descriptors.
+ See **struct** nvme_end_grp_config_desc
+
+
+
+
+
+.. c:struct:: nvme_supported_cap_config_list_log
+
+ Supported Capacity Configuration list log page
+
+**Definition**
+
+::
+
+ struct nvme_supported_cap_config_list_log {
+ __u8 sccn;
+ __u8 rsvd1[15];
+ struct nvme_capacity_config_desc cap_config_desc[];
+ };
+
+**Members**
+
+``sccn``
+ Number of capacity configuration
+
+``rsvd1``
+ Reserved
+
+``cap_config_desc``
+ Capacity configuration descriptor.
+ See **struct** nvme_capacity_config_desc
+
+
+
+
+
+.. c:struct:: nvme_resv_notification_log
+
+ Reservation Notification Log
+
+**Definition**
+
+::
+
+ struct nvme_resv_notification_log {
+ __le64 lpc;
+ __u8 rnlpt;
+ __u8 nalp;
+ __u8 rsvd9[2];
+ __le32 nsid;
+ __u8 rsvd16[48];
+ };
+
+**Members**
+
+``lpc``
+ Log Page Count
+
+``rnlpt``
+ See :c:type:`enum nvme_resv_notify_rnlpt <nvme_resv_notify_rnlpt>`.
+
+``nalp``
+ Number of Available Log Pages
+
+``rsvd9``
+ Reserved
+
+``nsid``
+ Namespace ID
+
+``rsvd16``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_resv_notify_rnlpt
+
+ Reservation Notification Log - Reservation Notification Log Page Type
+
+**Constants**
+
+``NVME_RESV_NOTIFY_RNLPT_EMPTY``
+ Empty Log Page
+
+``NVME_RESV_NOTIFY_RNLPT_REGISTRATION_PREEMPTED``
+ Registration Preempted
+
+``NVME_RESV_NOTIFY_RNLPT_RESERVATION_RELEASED``
+ Reservation Released
+
+``NVME_RESV_NOTIFY_RNLPT_RESERVATION_PREEMPTED``
+ Reservation Preempted
+
+
+
+
+.. c:struct:: nvme_sanitize_log_page
+
+ Sanitize Status (Log Identifier 81h)
+
+**Definition**
+
+::
+
+ struct nvme_sanitize_log_page {
+ __le16 sprog;
+ __le16 sstat;
+ __le32 scdw10;
+ __le32 eto;
+ __le32 etbe;
+ __le32 etce;
+ __le32 etond;
+ __le32 etbend;
+ __le32 etcend;
+ __u8 rsvd32[480];
+ };
+
+**Members**
+
+``sprog``
+ Sanitize Progress (SPROG): indicates the fraction complete of the
+ sanitize operation. The value is a numerator of the fraction
+ complete that has 65,536 (10000h) as its denominator. This value
+ shall be set to FFFFh if the **sstat** field is not set to
+ ``NVME_SANITIZE_SSTAT_STATUS_IN_PROGESS``.
+
+``sstat``
+ Sanitize Status (SSTAT): indicates the status associated with
+ the most recent sanitize operation. See :c:type:`enum nvme_sanitize_sstat <nvme_sanitize_sstat>`.
+
+``scdw10``
+ Sanitize Command Dword 10 Information (SCDW10): contains the value
+ of the Command Dword 10 field of the Sanitize command that started
+ the sanitize operation.
+
+``eto``
+ Estimated Time For Overwrite: indicates the number of seconds required
+ to complete an Overwrite sanitize operation with 16 passes in
+ the background when the No-Deallocate Modifies Media After Sanitize
+ field is not set to 10b. A value of 0h indicates that the sanitize
+ operation is expected to be completed in the background when the
+ Sanitize command that started that operation is completed. A value
+ of FFFFFFFFh indicates that no time period is reported.
+
+``etbe``
+ Estimated Time For Block Erase: indicates the number of seconds
+ required to complete a Block Erase sanitize operation in the
+ background when the No-Deallocate Modifies Media After Sanitize
+ field is not set to 10b. A value of 0h indicates that the sanitize
+ operation is expected to be completed in the background when the
+ Sanitize command that started that operation is completed.
+ A value of FFFFFFFFh indicates that no time period is reported.
+
+``etce``
+ Estimated Time For Crypto Erase: indicates the number of seconds
+ required to complete a Crypto Erase sanitize operation in the
+ background when the No-Deallocate Modifies Media After Sanitize
+ field is not set to 10b. A value of 0h indicates that the sanitize
+ operation is expected to be completed in the background when the
+ Sanitize command that started that operation is completed.
+ A value of FFFFFFFFh indicates that no time period is reported.
+
+``etond``
+ Estimated Time For Overwrite With No-Deallocate Media Modification:
+ indicates the number of seconds required to complete an Overwrite
+ sanitize operation and the associated additional media modification
+ after the Overwrite sanitize operation in the background when
+ the No-Deallocate After Sanitize bit was set to 1 in the Sanitize
+ command that requested the Overwrite sanitize operation; and
+ the No-Deallocate Modifies Media After Sanitize field is set to 10b.
+ A value of 0h indicates that the sanitize operation is expected
+ to be completed in the background when the Sanitize command that
+ started that operation is completed. A value of FFFFFFFFh indicates
+ that no time period is reported.
+
+``etbend``
+ Estimated Time For Block Erase With No-Deallocate Media Modification:
+ indicates the number of seconds required to complete a Block Erase
+ sanitize operation and the associated additional media modification
+ after the Block Erase sanitize operation in the background when
+ the No-Deallocate After Sanitize bit was set to 1 in the Sanitize
+ command that requested the Overwrite sanitize operation; and
+ the No-Deallocate Modifies Media After Sanitize field is set to 10b.
+ A value of 0h indicates that the sanitize operation is expected
+ to be completed in the background when the Sanitize command that
+ started that operation is completed. A value of FFFFFFFFh indicates
+ that no time period is reported.
+
+``etcend``
+ Estimated Time For Crypto Erase With No-Deallocate Media Modification:
+ indicates the number of seconds required to complete a Crypto Erase
+ sanitize operation and the associated additional media modification
+ after the Crypto Erase sanitize operation in the background when
+ the No-Deallocate After Sanitize bit was set to 1 in the Sanitize
+ command that requested the Overwrite sanitize operation; and
+ the No-Deallocate Modifies Media After Sanitize field is set to 10b.
+ A value of 0h indicates that the sanitize operation is expected
+ to be completed in the background when the Sanitize command that
+ started that operation is completed. A value of FFFFFFFFh indicates
+ that no time period is reported.
+
+``rsvd32``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_sanitize_sstat
+
+ Sanitize Status (SSTAT)
+
+**Constants**
+
+``NVME_SANITIZE_SSTAT_STATUS_SHIFT``
+ Shift amount to get the status value of
+ the most recent sanitize operation from
+ the :c:type:`struct nvme_sanitize_log_page <nvme_sanitize_log_page>`.sstat
+ field.
+
+``NVME_SANITIZE_SSTAT_STATUS_MASK``
+ Mask to get the status value of the most
+ recent sanitize operation.
+
+``NVME_SANITIZE_SSTAT_STATUS_NEVER_SANITIZED``
+ The NVM subsystem has never been
+ sanitized.
+
+``NVME_SANITIZE_SSTAT_STATUS_COMPLETE_SUCCESS``
+ The most recent sanitize operation
+ completed successfully including any
+ additional media modification.
+
+``NVME_SANITIZE_SSTAT_STATUS_IN_PROGESS``
+ A sanitize operation is currently in progress.
+
+``NVME_SANITIZE_SSTAT_STATUS_COMPLETED_FAILED``
+ The most recent sanitize operation
+ failed.
+
+``NVME_SANITIZE_SSTAT_STATUS_ND_COMPLETE_SUCCESS``
+ The most recent sanitize operation
+ for which No-Deallocate After Sanitize was
+ requested has completed successfully with
+ deallocation of all user data.
+
+``NVME_SANITIZE_SSTAT_COMPLETED_PASSES_SHIFT``
+ Shift amount to get the number
+ of completed passes if the most recent
+ sanitize operation was an Overwrite. This
+ value shall be cleared to 0h if the most
+ recent sanitize operation was not
+ an Overwrite.
+
+``NVME_SANITIZE_SSTAT_COMPLETED_PASSES_MASK``
+ Mask to get the number of completed
+ passes.
+
+``NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED_SHIFT``
+ Shift amount to get the Global
+ Data Erased value from the
+ :c:type:`struct nvme_sanitize_log_page <nvme_sanitize_log_page>`.sstat field.
+
+``NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED_MASK``
+ Mask to get the Global Data Erased
+ value.
+
+``NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED``
+ Global Data Erased: if set, then no
+ namespace user data in the NVM subsystem
+ has been written to and no Persistent
+ Memory Region in the NVM subsystem has
+ been enabled since being manufactured and
+ the NVM subsystem has never been sanitized;
+ or since the most recent successful sanitize
+ operation.
+
+
+
+
+.. c:struct:: nvme_zns_changed_zone_log
+
+ ZNS Changed Zone List log
+
+**Definition**
+
+::
+
+ struct nvme_zns_changed_zone_log {
+ __le16 nrzid;
+ __u8 rsvd2[6];
+ __le64 zid[NVME_ZNS_CHANGED_ZONES_MAX];
+ };
+
+**Members**
+
+``nrzid``
+ Number of Zone Identifiers
+
+``rsvd2``
+ Reserved
+
+``zid``
+ Zone Identifier
+
+
+
+
+
+.. c:enum:: nvme_zns_zt
+
+ Zone Descriptor Data Structure - Zone Type
+
+**Constants**
+
+``NVME_ZONE_TYPE_SEQWRITE_REQ``
+ Sequential Write Required
+
+
+
+
+.. c:enum:: nvme_zns_za
+
+ Zone Descriptor Data Structure
+
+**Constants**
+
+``NVME_ZNS_ZA_ZFC``
+ Zone Finished by Controller
+
+``NVME_ZNS_ZA_FZR``
+ Finish Zone Recommended
+
+``NVME_ZNS_ZA_RZR``
+ Reset Zone Recommended
+
+``NVME_ZNS_ZA_ZRWAV``
+
+``NVME_ZNS_ZA_ZDEV``
+ Zone Descriptor Extension Valid
+
+
+
+
+.. c:enum:: nvme_zns_zs
+
+ Zone Descriptor Data Structure - Zone State
+
+**Constants**
+
+``NVME_ZNS_ZS_EMPTY``
+ Empty state
+
+``NVME_ZNS_ZS_IMPL_OPEN``
+ Implicitly open state
+
+``NVME_ZNS_ZS_EXPL_OPEN``
+ Explicitly open state
+
+``NVME_ZNS_ZS_CLOSED``
+ Closed state
+
+``NVME_ZNS_ZS_READ_ONLY``
+ Read only state
+
+``NVME_ZNS_ZS_FULL``
+ Full state
+
+``NVME_ZNS_ZS_OFFLINE``
+ Offline state
+
+
+
+
+.. c:struct:: nvme_zns_desc
+
+ Zone Descriptor Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_zns_desc {
+ __u8 zt;
+ __u8 zs;
+ __u8 za;
+ __u8 zai;
+ __u8 rsvd4[4];
+ __le64 zcap;
+ __le64 zslba;
+ __le64 wp;
+ __u8 rsvd32[32];
+ };
+
+**Members**
+
+``zt``
+ Zone Type
+
+``zs``
+ Zone State
+
+``za``
+ Zone Attributes
+
+``zai``
+ Zone Attributes Information
+
+``rsvd4``
+ Reserved
+
+``zcap``
+ Zone Capacity
+
+``zslba``
+ Zone Start Logical Block Address
+
+``wp``
+ Write Pointer
+
+``rsvd32``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_zone_report
+
+ Report Zones Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_zone_report {
+ __le64 nr_zones;
+ __u8 rsvd8[56];
+ struct nvme_zns_desc entries[];
+ };
+
+**Members**
+
+``nr_zones``
+ Number of descriptors in **entries**
+
+``rsvd8``
+ Reserved
+
+``entries``
+ Zoned namespace descriptors
+
+
+
+
+
+.. c:enum:: nvme_fdp_ruh_type
+
+ Reclaim Unit Handle Type
+
+**Constants**
+
+``NVME_FDP_RUHT_INITIALLY_ISOLATED``
+ Initially Isolated
+
+``NVME_FDP_RUHT_PERSISTENTLY_ISOLATED``
+ Persistently Isolated
+
+
+
+
+.. c:struct:: nvme_fdp_ruh_desc
+
+ Reclaim Unit Handle Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_fdp_ruh_desc {
+ __u8 ruht;
+ __u8 rsvd1[3];
+ };
+
+**Members**
+
+``ruht``
+ Reclaim Unit Handle Type
+
+``rsvd1``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_fdp_config_fdpa
+
+ FDP Attributes
+
+**Constants**
+
+``NVME_FDP_CONFIG_FDPA_RGIF_SHIFT``
+ Reclaim Group Identifier Format Shift
+
+``NVME_FDP_CONFIG_FDPA_RGIF_MASK``
+ Reclaim Group Identifier Format Mask
+
+``NVME_FDP_CONFIG_FDPA_FDPVWC_SHIFT``
+ FDP Volatile Write Cache Shift
+
+``NVME_FDP_CONFIG_FDPA_FDPVWC_MASK``
+ FDP Volatile Write Cache Mask
+
+``NVME_FDP_CONFIG_FDPA_VALID_SHIFT``
+ FDP Configuration Valid Shift
+
+``NVME_FDP_CONFIG_FDPA_VALID_MASK``
+ FDP Configuration Valid Mask
+
+
+
+
+.. c:struct:: nvme_fdp_config_desc
+
+ FDP Configuration Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_fdp_config_desc {
+ __u16 size;
+ __u8 fdpa;
+ __u8 vss;
+ __u32 nrg;
+ __u16 nruh;
+ __u16 maxpids;
+ __u32 nnss;
+ __u64 runs;
+ __u32 erutl;
+ __u8 rsvd28[36];
+ struct nvme_fdp_ruh_desc ruhs[];
+ };
+
+**Members**
+
+``size``
+ Descriptor size
+
+``fdpa``
+ FDP Attributes (:c:type:`enum nvme_fdp_config_fdpa <nvme_fdp_config_fdpa>`)
+
+``vss``
+ Vendor Specific Size
+
+``nrg``
+ Number of Reclaim Groups
+
+``nruh``
+ Number of Reclaim Unit Handles
+
+``maxpids``
+ Max Placement Identifiers
+
+``nnss``
+ Number of Namespaces Supported
+
+``runs``
+ Reclaim Unit Nominal Size
+
+``erutl``
+ Estimated Reclaim Unit Time Limit
+
+``rsvd28``
+ Reserved
+
+``ruhs``
+ Reclaim Unit Handle descriptors (:c:type:`struct nvme_fdp_ruh_desc <nvme_fdp_ruh_desc>`)
+
+
+
+
+
+.. c:struct:: nvme_fdp_config_log
+
+ FDP Configurations Log Page
+
+**Definition**
+
+::
+
+ struct nvme_fdp_config_log {
+ __u16 n;
+ __u8 version;
+ __u8 rsvd3;
+ __u32 size;
+ __u8 rsvd8[8];
+ struct nvme_fdp_config_desc configs[];
+ };
+
+**Members**
+
+``n``
+ Number of FDP Configurations
+
+``version``
+ Log page version
+
+``rsvd3``
+ Reserved
+
+``size``
+ Log page size in bytes
+
+``rsvd8``
+ Reserved
+
+``configs``
+ FDP Configuration descriptors (:c:type:`struct nvme_fdp_config_desc <nvme_fdp_config_desc>`)
+
+
+
+
+
+.. c:enum:: nvme_fdp_ruha
+
+ Reclaim Unit Handle Attributes
+
+**Constants**
+
+``NVME_FDP_RUHA_HOST_SHIFT``
+ Host Specified Reclaim Unit Handle Shift
+
+``NVME_FDP_RUHA_HOST_MASK``
+ Host Specified Reclaim Unit Handle Mask
+
+``NVME_FDP_RUHA_CTRL_SHIFT``
+ Controller Specified Reclaim Unit Handle Shift
+
+``NVME_FDP_RUHA_CTRL_MASK``
+ Controller Specified Reclaim Unit Handle Mask
+
+
+
+
+.. c:struct:: nvme_fdp_ruhu_desc
+
+ Reclaim Unit Handle Usage Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_fdp_ruhu_desc {
+ __u8 ruha;
+ __u8 rsvd1[7];
+ };
+
+**Members**
+
+``ruha``
+ Reclaim Unit Handle Attributes (:c:type:`enum nvme_fdp_ruha <nvme_fdp_ruha>`)
+
+``rsvd1``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_fdp_ruhu_log
+
+ Reclaim Unit Handle Usage Log Page
+
+**Definition**
+
+::
+
+ struct nvme_fdp_ruhu_log {
+ __u16 nruh;
+ __u8 rsvd2[6];
+ struct nvme_fdp_ruhu_desc ruhus[];
+ };
+
+**Members**
+
+``nruh``
+ Number of Reclaim Unit Handles
+
+``rsvd2``
+ Reserved
+
+``ruhus``
+ Reclaim Unit Handle Usage descriptors
+
+
+
+
+
+.. c:struct:: nvme_fdp_stats_log
+
+ FDP Statistics Log Page
+
+**Definition**
+
+::
+
+ struct nvme_fdp_stats_log {
+ __u8 hbmw[16];
+ __u8 mbmw[16];
+ __u8 mbe[16];
+ __u8 rsvd48[16];
+ };
+
+**Members**
+
+``hbmw``
+ Host Bytes with Metadata Written
+
+``mbmw``
+ Media Bytes with Metadata Written
+
+``mbe``
+ Media Bytes Erased
+
+``rsvd48``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_fdp_event_type
+
+ FDP Event Types
+
+**Constants**
+
+``NVME_FDP_EVENT_RUNFW``
+ Reclaim Unit Not Fully Written
+
+``NVME_FDP_EVENT_RUTLE``
+ Reclaim Unit Time Limit Exceeded
+
+``NVME_FDP_EVENT_RESET``
+ Controller Level Reset Modified Reclaim Unit Handles
+
+``NVME_FDP_EVENT_PID``
+ Invalid Placement Identifier
+
+``NVME_FDP_EVENT_REALLOC``
+ Media Reallocated
+
+``NVME_FDP_EVENT_MODIFY``
+ Implicitly Modified Reclaim Unit Handle
+
+
+
+
+.. c:enum:: nvme_fdp_event_realloc_flags
+
+ Media Reallocated Event Type Specific Flags
+
+**Constants**
+
+``NVME_FDP_EVENT_REALLOC_F_LBAV``
+ LBA Valid
+
+
+
+
+.. c:struct:: nvme_fdp_event_realloc
+
+ Media Reallocated Event Type Specific Information
+
+**Definition**
+
+::
+
+ struct nvme_fdp_event_realloc {
+ __u8 flags;
+ __u8 rsvd1;
+ __u16 nlbam;
+ __u64 lba;
+ __u8 rsvd12[4];
+ };
+
+**Members**
+
+``flags``
+ Event Type Specific flags (:c:type:`enum nvme_fdp_event_realloc_flags <nvme_fdp_event_realloc_flags>`)
+
+``rsvd1``
+ Reserved
+
+``nlbam``
+ Number of LBAs Moved
+
+``lba``
+ Logical Block Address
+
+``rsvd12``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_fdp_event_flags
+
+ FDP Event Flags
+
+**Constants**
+
+``NVME_FDP_EVENT_F_PIV``
+ Placement Identifier Valid
+
+``NVME_FDP_EVENT_F_NSIDV``
+ Namespace Identifier Valid
+
+``NVME_FDP_EVENT_F_LV``
+ Location Valid
+
+
+
+
+.. c:struct:: nvme_fdp_event
+
+ FDP Event
+
+**Definition**
+
+::
+
+ struct nvme_fdp_event {
+ __u8 type;
+ __u8 flags;
+ __u16 pid;
+ struct nvme_timestamp ts;
+ __u32 nsid;
+ __u8 type_specific[16];
+ __u16 rgid;
+ __u8 ruhid;
+ __u8 rsvd35[5];
+ __u8 vs[24];
+ };
+
+**Members**
+
+``type``
+ Event Type (:c:type:`enum nvme_fdp_event_type <nvme_fdp_event_type>`)
+
+``flags``
+ Event Flags (:c:type:`enum nvme_fdp_event_flags <nvme_fdp_event_flags>`)
+
+``pid``
+ Placement Identifier
+
+``ts``
+ Timestamp
+
+``nsid``
+ Namespace Identifier
+
+``type_specific``
+ Event Type Specific Information
+
+``rgid``
+ Reclaim Group Identifier
+
+``ruhid``
+ Reclaim Unit Handle Identifier
+
+``rsvd35``
+ Reserved
+
+``vs``
+ Vendor Specific
+
+
+
+
+
+.. c:struct:: nvme_fdp_events_log
+
+ FDP Events Log Page
+
+**Definition**
+
+::
+
+ struct nvme_fdp_events_log {
+ __u32 n;
+ __u8 rsvd4[60];
+ struct nvme_fdp_event events[63];
+ };
+
+**Members**
+
+``n``
+ Number of FDP Events
+
+``rsvd4``
+ Reserved
+
+``events``
+ FDP Events (:c:type:`struct nvme_fdp_event <nvme_fdp_event>`)
+
+
+
+
+
+.. c:struct:: nvme_feat_fdp_events_cdw11
+
+ FDP Events Feature Command Dword 11
+
+**Definition**
+
+::
+
+ struct nvme_feat_fdp_events_cdw11 {
+ __u16 phndl;
+ __u8 noet;
+ __u8 rsvd24;
+ };
+
+**Members**
+
+``phndl``
+ Placement Handle
+
+``noet``
+ Number of FDP Event Types
+
+``rsvd24``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_fdp_supported_event_attributes
+
+ Supported FDP Event Attributes
+
+**Constants**
+
+``NVME_FDP_SUPP_EVENT_ENABLED_SHIFT``
+ FDP Event Enable Shift
+
+``NVME_FDP_SUPP_EVENT_ENABLED_MASK``
+ FDP Event Enable Mask
+
+
+
+
+.. c:struct:: nvme_fdp_supported_event_desc
+
+ Supported FDP Event Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_fdp_supported_event_desc {
+ __u8 evt;
+ __u8 evta;
+ };
+
+**Members**
+
+``evt``
+ FDP Event Type
+
+``evta``
+ FDP Event Type Attributes (:c:type:`enum nvme_fdp_supported_event_attributes <nvme_fdp_supported_event_attributes>`)
+
+
+
+
+
+.. c:struct:: nvme_fdp_ruh_status_desc
+
+ Reclaim Unit Handle Status Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_fdp_ruh_status_desc {
+ __u16 pid;
+ __u16 ruhid;
+ __u32 earutr;
+ __u64 ruamw;
+ __u8 rsvd16[16];
+ };
+
+**Members**
+
+``pid``
+ Placement Identifier
+
+``ruhid``
+ Reclaim Unit Handle Identifier
+
+``earutr``
+ Estimated Active Reclaim Unit Time Remaining
+
+``ruamw``
+ Reclaim Unit Available Media Writes
+
+``rsvd16``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_fdp_ruh_status
+
+ Reclaim Unit Handle Status
+
+**Definition**
+
+::
+
+ struct nvme_fdp_ruh_status {
+ __u8 rsvd0[14];
+ __u16 nruhsd;
+ struct nvme_fdp_ruh_status_desc ruhss[];
+ };
+
+**Members**
+
+``rsvd0``
+ Reserved
+
+``nruhsd``
+ Number of Reclaim Unit Handle Status Descriptors
+
+``ruhss``
+ Reclaim Unit Handle Status descriptors
+
+
+
+
+
+.. c:struct:: nvme_lba_status_desc
+
+ LBA Status Descriptor Entry
+
+**Definition**
+
+::
+
+ struct nvme_lba_status_desc {
+ __le64 dslba;
+ __le32 nlb;
+ __u8 rsvd12;
+ __u8 status;
+ __u8 rsvd14[2];
+ };
+
+**Members**
+
+``dslba``
+ Descriptor Starting LBA
+
+``nlb``
+ Number of Logical Blocks
+
+``rsvd12``
+ Reserved
+
+``status``
+ Additional status about this LBA range
+
+``rsvd14``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_lba_status
+
+ LBA Status Descriptor List
+
+**Definition**
+
+::
+
+ struct nvme_lba_status {
+ __le32 nlsd;
+ __u8 cmpc;
+ __u8 rsvd5[3];
+ struct nvme_lba_status_desc descs[];
+ };
+
+**Members**
+
+``nlsd``
+ Number of LBA Status Descriptors
+
+``cmpc``
+ Completion Condition
+
+``rsvd5``
+ Reserved
+
+``descs``
+ LBA status descriptor Entry
+
+
+
+
+
+.. c:struct:: nvme_feat_auto_pst
+
+ Autonomous Power State Transition
+
+**Definition**
+
+::
+
+ struct nvme_feat_auto_pst {
+ __le64 apst_entry[32];
+ };
+
+**Members**
+
+``apst_entry``
+ See :c:type:`enum nvme_apst_entry <nvme_apst_entry>`
+
+
+
+
+
+.. c:enum:: nvme_apst_entry
+
+ Autonomous Power State Transition
+
+**Constants**
+
+``NVME_APST_ENTRY_ITPS_SHIFT``
+ Idle Transition Power State Shift
+
+``NVME_APST_ENTRY_ITPT_SHIFT``
+ Idle Time Prior to Transition Shift
+
+``NVME_APST_ENTRY_ITPS_MASK``
+ Idle Transition Power State Mask
+
+``NVME_APST_ENTRY_ITPT_MASK``
+ Idle Time Prior to Transition Mask
+
+
+
+
+.. c:struct:: nvme_metadata_element_desc
+
+ Metadata Element Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_metadata_element_desc {
+ __u8 type;
+ __u8 rev;
+ __u16 len;
+ __u8 val[0];
+ };
+
+**Members**
+
+``type``
+ Element Type (ET)
+
+``rev``
+ Element Revision (ER)
+
+``len``
+ Element Length (ELEN)
+
+``val``
+ Element Value (EVAL), UTF-8 string
+
+
+
+
+
+.. c:struct:: nvme_host_metadata
+
+ Host Metadata Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_host_metadata {
+ __u8 ndesc;
+ __u8 rsvd1;
+ union {
+ struct nvme_metadata_element_desc descs[0];
+ __u8 descs_buf[4094];
+ };
+ };
+
+**Members**
+
+``ndesc``
+ Number of metadata element descriptors
+
+``rsvd1``
+ Reserved
+
+``{unnamed_union}``
+ anonymous
+
+``descs``
+ Metadata element descriptors
+
+``descs_buf``
+ Metadata element descriptor buffer
+
+
+
+
+
+.. c:enum:: nvme_ctrl_metadata_type
+
+ Controller Metadata Element Types
+
+**Constants**
+
+``NVME_CTRL_METADATA_OS_CTRL_NAME``
+ Name of the controller in
+ the operating system.
+
+``NVME_CTRL_METADATA_OS_DRIVER_NAME``
+ Name of the driver in the
+ operating system.
+
+``NVME_CTRL_METADATA_OS_DRIVER_VER``
+ Version of the driver in
+ the operating system.
+
+``NVME_CTRL_METADATA_PRE_BOOT_CTRL_NAME``
+ Name of the controller in
+ the pre-boot environment.
+
+``NVME_CTRL_METADATA_PRE_BOOT_DRIVER_NAME``
+ Name of the driver in the
+ pre-boot environment.
+
+``NVME_CTRL_METADATA_PRE_BOOT_DRIVER_VER``
+ Version of the driver in the
+ pre-boot environment.
+
+``NVME_CTRL_METADATA_SYS_PROC_MODEL``
+ Model of the processor.
+
+``NVME_CTRL_METADATA_CHIPSET_DRV_NAME``
+ Chipset driver name.
+
+``NVME_CTRL_METADATA_CHIPSET_DRV_VERSION``
+ Chipset driver version.
+
+``NVME_CTRL_METADATA_OS_NAME_AND_BUILD``
+ Operating system name and build.
+
+``NVME_CTRL_METADATA_SYS_PROD_NAME``
+ System product name.
+
+``NVME_CTRL_METADATA_FIRMWARE_VERSION``
+ Host firmware (e.g UEFI) version.
+
+``NVME_CTRL_METADATA_OS_DRIVER_FILENAME``
+ Operating system driver filename.
+
+``NVME_CTRL_METADATA_DISPLAY_DRV_NAME``
+ Display driver name.
+
+``NVME_CTRL_METADATA_DISPLAY_DRV_VERSION``
+ Display driver version.
+
+``NVME_CTRL_METADATA_HOST_DET_FAIL_REC``
+ Failure record.
+
+
+
+
+.. c:enum:: nvme_ns_metadata_type
+
+ Namespace Metadata Element Types
+
+**Constants**
+
+``NVME_NS_METADATA_OS_NS_NAME``
+ Name of the namespace in the
+ operating system
+
+``NVME_NS_METADATA_PRE_BOOT_NS_NAME``
+ Name of the namespace in the pre-boot
+ environment.
+
+``NVME_NS_METADATA_OS_NS_QUAL_1``
+ First qualifier of the Operating System
+ Namespace Name.
+
+``NVME_NS_METADATA_OS_NS_QUAL_2``
+ Second qualifier of the Operating System
+ Namespace Name.
+
+
+
+
+.. c:struct:: nvme_lba_range_type_entry
+
+ LBA Range Type - Data Structure Entry
+
+**Definition**
+
+::
+
+ struct nvme_lba_range_type_entry {
+ __u8 type;
+ __u8 attributes;
+ __u8 rsvd2[14];
+ __u64 slba;
+ __u64 nlb;
+ __u8 guid[16];
+ __u8 rsvd48[16];
+ };
+
+**Members**
+
+``type``
+ Specifies the Type of the LBA range
+
+``attributes``
+ Specifies attributes of the LBA range
+
+``rsvd2``
+ Reserved
+
+``slba``
+ Starting LBA
+
+``nlb``
+ Number of Logical Blocks
+
+``guid``
+ Unique Identifier
+
+``rsvd48``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_lbart
+
+ LBA Range Type - Data Structure Entry
+
+**Constants**
+
+``NVME_LBART_TYPE_GP``
+ General Purpose
+
+``NVME_LBART_TYPE_FS``
+ Filesystem
+
+``NVME_LBART_TYPE_RAID``
+ RAID
+
+``NVME_LBART_TYPE_CACHE``
+ Cache
+
+``NVME_LBART_TYPE_SWAP``
+ Page / swap file
+
+``NVME_LBART_ATTRIB_TEMP``
+ Temp
+
+``NVME_LBART_ATTRIB_HIDE``
+ Hidden
+
+
+
+
+.. c:struct:: nvme_lba_range_type
+
+ LBA Range Type
+
+**Definition**
+
+::
+
+ struct nvme_lba_range_type {
+ struct nvme_lba_range_type_entry entry[NVME_FEAT_LBA_RANGE_MAX];
+ };
+
+**Members**
+
+``entry``
+ LBA range type entry. See **struct** nvme_lba_range_type_entry
+
+
+
+
+
+.. c:struct:: nvme_plm_config
+
+ Predictable Latency Mode - Deterministic Threshold Configuration Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_plm_config {
+ __le16 ee;
+ __u8 rsvd2[30];
+ __le64 dtwinrt;
+ __le64 dtwinwt;
+ __le64 dtwintt;
+ __u8 rsvd56[456];
+ };
+
+**Members**
+
+``ee``
+ Enable Event
+
+``rsvd2``
+ Reserved
+
+``dtwinrt``
+ DTWIN Reads Threshold
+
+``dtwinwt``
+ DTWIN Writes Threshold
+
+``dtwintt``
+ DTWIN Time Threshold
+
+``rsvd56``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_feat_host_behavior
+
+ Host Behavior Support - Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_feat_host_behavior {
+ __u8 acre;
+ __u8 rsvd1[511];
+ };
+
+**Members**
+
+``acre``
+ Advanced Command Retry Enable
+
+``rsvd1``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_host_behavior_support
+
+ Enable Advanced Command
+
+**Constants**
+
+``NVME_ENABLE_ACRE``
+ Enable Advanced Command Retry Enable
+
+
+
+
+.. c:struct:: nvme_dsm_range
+
+ Dataset Management - Range Definition
+
+**Definition**
+
+::
+
+ struct nvme_dsm_range {
+ __le32 cattr;
+ __le32 nlb;
+ __le64 slba;
+ };
+
+**Members**
+
+``cattr``
+ Context Attributes
+
+``nlb``
+ Length in logical blocks
+
+``slba``
+ Starting LBA
+
+
+
+
+
+.. c:struct:: nvme_copy_range
+
+ Copy - Source Range Entries Descriptor Format
+
+**Definition**
+
+::
+
+ struct nvme_copy_range {
+ __u8 rsvd0[8];
+ __le64 slba;
+ __le16 nlb;
+ __u8 rsvd18[6];
+ __le32 eilbrt;
+ __le16 elbatm;
+ __le16 elbat;
+ };
+
+**Members**
+
+``rsvd0``
+ Reserved
+
+``slba``
+ Starting LBA
+
+``nlb``
+ Number of Logical Blocks
+
+``rsvd18``
+ Reserved
+
+``eilbrt``
+ Expected Initial Logical Block Reference Tag /
+ Expected Logical Block Storage Tag
+
+``elbatm``
+ Expected Logical Block Application Tag Mask
+
+``elbat``
+ Expected Logical Block Application Tag
+
+
+
+
+
+.. c:struct:: nvme_copy_range_f1
+
+ Copy - Source Range Entries Descriptor Format 1h
+
+**Definition**
+
+::
+
+ struct nvme_copy_range_f1 {
+ __u8 rsvd0[8];
+ __le64 slba;
+ __le16 nlb;
+ __u8 rsvd18[8];
+ __u8 elbt[10];
+ __le16 elbatm;
+ __le16 elbat;
+ };
+
+**Members**
+
+``rsvd0``
+ Reserved
+
+``slba``
+ Starting LBA
+
+``nlb``
+ Number of Logical Blocks
+
+``rsvd18``
+ Reserved
+
+``elbt``
+ Expected Initial Logical Block Reference Tag /
+ Expected Logical Block Storage Tag
+
+``elbatm``
+ Expected Logical Block Application Tag Mask
+
+``elbat``
+ Expected Logical Block Application Tag
+
+
+
+
+
+.. c:struct:: nvme_registered_ctrl
+
+ Registered Controller Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_registered_ctrl {
+ __le16 cntlid;
+ __u8 rcsts;
+ __u8 rsvd3[5];
+ __le64 hostid;
+ __le64 rkey;
+ };
+
+**Members**
+
+``cntlid``
+ Controller ID
+
+``rcsts``
+ Reservation Status
+
+``rsvd3``
+ Reserved
+
+``hostid``
+ Host Identifier
+
+``rkey``
+ Reservation Key
+
+
+
+
+
+.. c:struct:: nvme_registered_ctrl_ext
+
+ Registered Controller Extended Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_registered_ctrl_ext {
+ __le16 cntlid;
+ __u8 rcsts;
+ __u8 rsvd3[5];
+ __le64 rkey;
+ __u8 hostid[16];
+ __u8 rsvd32[32];
+ };
+
+**Members**
+
+``cntlid``
+ Controller ID
+
+``rcsts``
+ Reservation Status
+
+``rsvd3``
+ Reserved
+
+``rkey``
+ Reservation Key
+
+``hostid``
+ Host Identifier
+
+``rsvd32``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_resv_status
+
+ Reservation Status Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_resv_status {
+ __le32 gen;
+ __u8 rtype;
+ __u8 regctl[2];
+ __u8 rsvd7[2];
+ __u8 ptpls;
+ __u8 rsvd10[14];
+ union {
+ struct {
+ __u8 rsvd24[40];
+ struct nvme_registered_ctrl_ext regctl_eds[0];
+ };
+ struct nvme_registered_ctrl regctl_ds[0];
+ };
+ };
+
+**Members**
+
+``gen``
+ Generation
+
+``rtype``
+ Reservation Type
+
+``regctl``
+ Number of Registered Controllers
+
+``rsvd7``
+ Reserved
+
+``ptpls``
+ Persist Through Power Loss State
+
+``rsvd10``
+ Reserved
+
+``{unnamed_union}``
+ anonymous
+
+``{unnamed_struct}``
+ anonymous
+
+``rsvd24``
+ Reserved
+
+``regctl_eds``
+ Registered Controller Extended Data Structure
+
+``regctl_ds``
+ Registered Controller Data Structure
+
+
+
+
+
+.. c:struct:: nvme_streams_directive_params
+
+ Streams Directive - Return Parameters Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_streams_directive_params {
+ __le16 msl;
+ __le16 nssa;
+ __le16 nsso;
+ __u8 nssc;
+ __u8 rsvd[9];
+ __le32 sws;
+ __le16 sgs;
+ __le16 nsa;
+ __le16 nso;
+ __u8 rsvd2[6];
+ };
+
+**Members**
+
+``msl``
+ Max Streams Limit
+
+``nssa``
+ NVM Subsystem Streams Available
+
+``nsso``
+ NVM Subsystem Streams Open
+
+``nssc``
+ NVM Subsystem Stream Capability
+
+``rsvd``
+ Reserved
+
+``sws``
+ Stream Write Size
+
+``sgs``
+ Stream Granularity Size
+
+``nsa``
+ Namespace Streams Allocated
+
+``nso``
+ Namespace Streams Open
+
+``rsvd2``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_streams_directive_status
+
+ Streams Directive - Get Status Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_streams_directive_status {
+ __le16 osc;
+ __le16 sid[];
+ };
+
+**Members**
+
+``osc``
+ Open Stream Count
+
+``sid``
+ Stream Identifier
+
+
+
+
+
+.. c:struct:: nvme_id_directives
+
+ Identify Directive - Return Parameters Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_id_directives {
+ __u8 supported[32];
+ __u8 enabled[32];
+ __u8 rsvd64[4032];
+ };
+
+**Members**
+
+``supported``
+ Identify directive is supported
+
+``enabled``
+ Identify directive is Enabled
+
+``rsvd64``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_directive_types
+
+ Directives Supported or Enabled
+
+**Constants**
+
+``NVME_ID_DIR_ID_BIT``
+ Identify directive is supported
+
+``NVME_ID_DIR_SD_BIT``
+ Streams directive is supported
+
+
+
+
+.. c:struct:: nvme_host_mem_buf_attrs
+
+ Host Memory Buffer - Attributes Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_host_mem_buf_attrs {
+ __le32 hsize;
+ __le32 hmdlal;
+ __le32 hmdlau;
+ __le32 hmdlec;
+ __u8 rsvd16[4080];
+ };
+
+**Members**
+
+``hsize``
+ Host Memory Buffer Size
+
+``hmdlal``
+ Host Memory Descriptor List Lower Address
+
+``hmdlau``
+ Host Memory Descriptor List Upper Address
+
+``hmdlec``
+ Host Memory Descriptor List Entry Count
+
+``rsvd16``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_ae_type
+
+ Asynchronous Event Type
+
+**Constants**
+
+``NVME_AER_ERROR``
+ Error event
+
+``NVME_AER_SMART``
+ SMART / Health Status event
+
+``NVME_AER_NOTICE``
+ Notice event
+
+``NVME_AER_CSS``
+ NVM Command Set Specific events
+
+``NVME_AER_VS``
+ Vendor Specific event
+
+
+
+
+.. c:enum:: nvme_ae_info_error
+
+ Asynchronous Event Information - Error Status
+
+**Constants**
+
+``NVME_AER_ERROR_INVALID_DB_REG``
+ Write to Invalid Doorbell Register
+
+``NVME_AER_ERROR_INVALID_DB_VAL``
+ Invalid Doorbell Write Value
+
+``NVME_AER_ERROR_DIAG_FAILURE``
+ Diagnostic Failure
+
+``NVME_AER_ERROR_PERSISTENT_INTERNAL_ERROR``
+ Persistent Internal Error
+
+``NVME_AER_ERROR_TRANSIENT_INTERNAL_ERROR``
+ Transient Internal Error
+
+``NVME_AER_ERROR_FW_IMAGE_LOAD_ERROR``
+ Firmware Image Load Error
+
+
+
+
+.. c:enum:: nvme_ae_info_smart
+
+ Asynchronous Event Information - SMART / Health Status
+
+**Constants**
+
+``NVME_AER_SMART_SUBSYSTEM_RELIABILITY``
+ NVM subsystem Reliability
+
+``NVME_AER_SMART_TEMPERATURE_THRESHOLD``
+ Temperature Threshold
+
+``NVME_AER_SMART_SPARE_THRESHOLD``
+ Spare Below Threshold
+
+
+
+
+.. c:enum:: nvme_ae_info_css_nvm
+
+ Asynchronous Event Information - I/O Command Specific Status
+
+**Constants**
+
+``NVME_AER_CSS_NVM_RESERVATION``
+ Reservation Log Page Available
+
+``NVME_AER_CSS_NVM_SANITIZE_COMPLETED``
+ Sanitize Operation Completed
+
+``NVME_AER_CSS_NVM_UNEXPECTED_SANITIZE_DEALLOC``
+ Sanitize Operation Completed
+ With Unexpected Deallocation
+
+
+
+
+.. c:enum:: nvme_ae_info_notice
+
+ Asynchronous Event Information - Notice
+
+**Constants**
+
+``NVME_AER_NOTICE_NS_CHANGED``
+ Namespace Attribute Changed
+
+``NVME_AER_NOTICE_FW_ACT_STARTING``
+ Firmware Activation Starting
+
+``NVME_AER_NOTICE_TELEMETRY``
+ Telemetry Log Changed
+
+``NVME_AER_NOTICE_ANA``
+ Asymmetric Namespace Access Change
+
+``NVME_AER_NOTICE_PL_EVENT``
+ Predictable Latency Event Aggregate Log Change
+
+``NVME_AER_NOTICE_LBA_STATUS_ALERT``
+ LBA Status Information Alert
+
+``NVME_AER_NOTICE_EG_EVENT``
+ Endurance Group Event Aggregate Log Page Change
+
+``NVME_AER_NOTICE_DISC_CHANGED``
+ Discovery Log Page Change
+
+
+
+
+.. c:enum:: nvme_subsys_type
+
+ Type of the NVM subsystem.
+
+**Constants**
+
+``NVME_NQN_DISC``
+ Discovery type target subsystem. Describes a referral to another
+ Discovery Service composed of Discovery controllers that provide
+ additional discovery records. Multiple Referral entries may
+ be reported for each Discovery Service (if that Discovery Service
+ has multiple NVM subsystem ports or supports multiple protocols).
+
+``NVME_NQN_NVME``
+ NVME type target subsystem. Describes an NVM subsystem whose
+ controllers may have attached namespaces (an NVM subsystem
+ that is not composed of Discovery controllers). Multiple NVM
+ Subsystem entries may be reported for each NVM subsystem if
+ that NVM subsystem has multiple NVM subsystem ports.
+
+``NVME_NQN_CURR``
+ Current Discovery type target subsystem. Describes this Discovery
+ subsystem (the Discovery Service that contains the controller
+ processing the Get Log Page command). Multiple Current Discovery
+ Subsystem entries may be reported for this Discovery subsystem
+ if the current Discovery subsystem has multiple NVM subsystem
+ ports.
+
+
+
+
+.. c:enum:: nvmf_disc_eflags
+
+ Discovery Log Page entry flags.
+
+**Constants**
+
+``NVMF_DISC_EFLAGS_NONE``
+ Indicates that none of the DUPRETINFO or EPCSD
+ features are supported.
+
+``NVMF_DISC_EFLAGS_DUPRETINFO``
+ Duplicate Returned Information (DUPRETINFO):
+ Indicates that using the content of this entry
+ to access this Discovery Service returns the same
+ information that is returned by using the content
+ of other entries in this log page that also have
+ this flag set.
+
+``NVMF_DISC_EFLAGS_EPCSD``
+ Explicit Persistent Connection Support for Discovery (EPCSD):
+ Indicates that Explicit Persistent Connections are
+ supported for the Discovery controller.
+
+``NVMF_DISC_EFLAGS_NCC``
+ No CDC Connectivity (NCC): If set to
+ '1', then no DDC that describes this entry
+ is currently connected to the CDC. If
+ cleared to '0', then at least one DDC that
+ describes this entry is currently
+ connected to the CDC. If the Discovery
+ controller returning this log page is not
+ a CDC, then this bit shall be cleared to
+ '0' and should be ignored by the host.
+
+
+
+
+.. c:union:: nvmf_tsas
+
+ Transport Specific Address Subtype
+
+**Definition**
+
+::
+
+ union nvmf_tsas {
+ char common[NVMF_TSAS_SIZE];
+ struct rdma {
+ __u8 qptype;
+ __u8 prtype;
+ __u8 cms;
+ __u8 rsvd3[5];
+ __u16 pkey;
+ __u8 rsvd10[246];
+ } rdma;
+ struct tcp {
+ __u8 sectype;
+ } tcp;
+ };
+
+**Members**
+
+``common``
+ Common transport specific attributes
+
+``rdma``
+ RDMA transport specific attribute settings
+
+``tcp``
+ TCP transport specific attribute settings
+
+
+
+
+
+.. c:struct:: nvmf_disc_log_entry
+
+ Discovery Log Page entry
+
+**Definition**
+
+::
+
+ struct nvmf_disc_log_entry {
+ __u8 trtype;
+ __u8 adrfam;
+ __u8 subtype;
+ __u8 treq;
+ __le16 portid;
+ __le16 cntlid;
+ __le16 asqsz;
+ __le16 eflags;
+ __u8 rsvd12[20];
+ char trsvcid[NVMF_TRSVCID_SIZE];
+ __u8 rsvd64[192];
+ char subnqn[NVME_NQN_LENGTH];
+ char traddr[NVMF_TRADDR_SIZE];
+ union nvmf_tsas tsas;
+ };
+
+**Members**
+
+``trtype``
+ Transport Type (TRTYPE): Specifies the NVMe Transport type.
+ See :c:type:`enum nvmf_trtype <nvmf_trtype>`.
+
+``adrfam``
+ Address Family (ADRFAM): Specifies the address family.
+ See :c:type:`enum nvmf_addr_family <nvmf_addr_family>`.
+
+``subtype``
+ Subsystem Type (SUBTYPE): Specifies the type of the NVM subsystem
+ that is indicated in this entry. See :c:type:`enum nvme_subsys_type <nvme_subsys_type>`.
+
+``treq``
+ Transport Requirements (TREQ): Indicates requirements for the NVMe
+ Transport. See :c:type:`enum nvmf_treq <nvmf_treq>`.
+
+``portid``
+ Port ID (PORTID): Specifies a particular NVM subsystem port.
+ Different NVMe Transports or address families may utilize the same
+ Port ID value (e.g. a Port ID may support both iWARP and RoCE).
+
+``cntlid``
+ Controller ID (CNTLID): Specifies the controller ID. If the NVM
+ subsystem uses a dynamic controller model, then this field shall
+ be set to FFFFh. If the NVM subsystem uses a static controller model,
+ then this field may be set to a specific controller ID (values 0h
+ to FFEFh are valid). If the NVM subsystem uses a static controller
+ model and the value indicated is FFFEh, then the host should remember
+ the Controller ID returned as part of the Fabrics Connect command
+ in order to re-establish an association in the future with the same
+ controller.
+
+``asqsz``
+ Admin Max SQ Size (ASQSZ): Specifies the maximum size of an Admin
+ Submission Queue. This applies to all controllers in the NVM
+ subsystem. The value shall be a minimum of 32 entries.
+
+``eflags``
+ Entry Flags (EFLAGS): Indicates additional information related to
+ the current entry. See :c:type:`enum nvmf_disc_eflags <nvmf_disc_eflags>`.
+
+``rsvd12``
+ Reserved
+
+``trsvcid``
+ Transport Service Identifier (TRSVCID): Specifies the NVMe Transport
+ service identifier as an ASCII string. The NVMe Transport service
+ identifier is specified by the associated NVMe Transport binding
+ specification.
+
+``rsvd64``
+ Reserved
+
+``subnqn``
+ NVM Subsystem Qualified Name (SUBNQN): NVMe Qualified Name (NQN)
+ that uniquely identifies the NVM subsystem. For a subsystem, if that
+ Discovery subsystem has a unique NQN (i.e., the NVM Subsystem NVMe
+ Qualified Name (SUBNQN) field in that Discovery subsystem's Identify
+ Controller data structure contains a unique NQN value), then the
+ value returned shall be that unique NQN. If the Discovery subsystem
+ does not have a unique NQN, then the value returned shall be the
+ well-known Discovery Service NQN (nqn.2014-08.org.nvmexpress.discovery).
+
+``traddr``
+ Transport Address (TRADDR): Specifies the address of the NVM subsystem
+ that may be used for a Connect command as an ASCII string. The
+ Address Family field describes the reference for parsing this field.
+
+``tsas``
+ Transport specific attribute settings
+
+
+
+
+
+.. c:enum:: nvmf_trtype
+
+ Transport Type codes for Discovery Log Page entry TRTYPE field
+
+**Constants**
+
+``NVMF_TRTYPE_UNSPECIFIED``
+ Not indicated
+
+``NVMF_TRTYPE_RDMA``
+ RDMA
+
+``NVMF_TRTYPE_FC``
+ Fibre Channel
+
+``NVMF_TRTYPE_TCP``
+ TCP
+
+``NVMF_TRTYPE_LOOP``
+ Intra-host Transport (i.e., loopback), reserved
+ for host usage.
+
+``NVMF_TRTYPE_MAX``
+ Maximum value for :c:type:`enum nvmf_trtype <nvmf_trtype>`
+
+
+
+
+.. c:enum:: nvmf_addr_family
+
+ Address Family codes for Discovery Log Page entry ADRFAM field
+
+**Constants**
+
+``NVMF_ADDR_FAMILY_PCI``
+ PCIe
+
+``NVMF_ADDR_FAMILY_IP4``
+ AF_INET: IPv4 address family.
+
+``NVMF_ADDR_FAMILY_IP6``
+ AF_INET6: IPv6 address family.
+
+``NVMF_ADDR_FAMILY_IB``
+ AF_IB: InfiniBand address family.
+
+``NVMF_ADDR_FAMILY_FC``
+ Fibre Channel address family.
+
+``NVMF_ADDR_FAMILY_LOOP``
+ Intra-host Transport (i.e., loopback), reserved
+ for host usage.
+
+
+
+
+.. c:enum:: nvmf_treq
+
+ Transport Requirements codes for Discovery Log Page entry TREQ field
+
+**Constants**
+
+``NVMF_TREQ_NOT_SPECIFIED``
+ Not specified
+
+``NVMF_TREQ_REQUIRED``
+ Required
+
+``NVMF_TREQ_NOT_REQUIRED``
+ Not Required
+
+``NVMF_TREQ_DISABLE_SQFLOW``
+ SQ flow control disable supported
+
+
+
+
+.. c:enum:: nvmf_rdma_qptype
+
+ RDMA QP Service Type codes for Discovery Log Page entry TSAS RDMA_QPTYPE field
+
+**Constants**
+
+``NVMF_RDMA_QPTYPE_CONNECTED``
+ Reliable Connected
+
+``NVMF_RDMA_QPTYPE_DATAGRAM``
+ Reliable Datagram
+
+
+
+
+.. c:enum:: nvmf_rdma_prtype
+
+ RDMA Provider Type codes for Discovery Log Page entry TSAS RDMA_PRTYPE field
+
+**Constants**
+
+``NVMF_RDMA_PRTYPE_NOT_SPECIFIED``
+ No Provider Specified
+
+``NVMF_RDMA_PRTYPE_IB``
+ InfiniBand
+
+``NVMF_RDMA_PRTYPE_ROCE``
+ InfiniBand RoCE
+
+``NVMF_RDMA_PRTYPE_ROCEV2``
+ InfiniBand RoCEV2
+
+``NVMF_RDMA_PRTYPE_IWARP``
+ iWARP
+
+
+
+
+.. c:enum:: nvmf_rdma_cms
+
+ RDMA Connection Management Service Type codes for Discovery Log Page entry TSAS RDMA_CMS field
+
+**Constants**
+
+``NVMF_RDMA_CMS_RDMA_CM``
+ Sockets based endpoint addressing
+
+
+
+
+.. c:enum:: nvmf_tcp_sectype
+
+ Transport Specific Address Subtype Definition for NVMe/TCP Transport
+
+**Constants**
+
+``NVMF_TCP_SECTYPE_NONE``
+ No Security
+
+``NVMF_TCP_SECTYPE_TLS``
+ Transport Layer Security version 1.2
+
+``NVMF_TCP_SECTYPE_TLS13``
+ Transport Layer Security version 1.3 or a subsequent
+ version. The TLS protocol negotiates the version and
+ cipher suite for each TCP connection.
+
+
+
+
+.. c:enum:: nvmf_log_discovery_lid_support
+
+ Discovery log specific support
+
+**Constants**
+
+``NVMF_LOG_DISC_LID_NONE``
+ None
+
+``NVMF_LOG_DISC_LID_EXTDLPES``
+ Extended Discovery Log Page Entries Supported
+
+``NVMF_LOG_DISC_LID_PLEOS``
+ Port Local Entries Only Supported
+
+``NVMF_LOG_DISC_LID_ALLSUBES``
+ All NVM Subsystem Entries Supported
+
+
+
+
+.. c:enum:: nvmf_log_discovery_lsp
+
+ Discovery log specific field
+
+**Constants**
+
+``NVMF_LOG_DISC_LSP_NONE``
+ None
+
+``NVMF_LOG_DISC_LSP_EXTDLPE``
+ Extended Discovery Log Page Entries
+
+``NVMF_LOG_DISC_LSP_PLEO``
+ Port Local Entries Only
+
+``NVMF_LOG_DISC_LSP_ALLSUBE``
+ All NVM Subsystem Entries
+
+
+
+
+.. c:struct:: nvmf_discovery_log
+
+ Discovery Log Page (Log Identifier 70h)
+
+**Definition**
+
+::
+
+ struct nvmf_discovery_log {
+ __le64 genctr;
+ __le64 numrec;
+ __le16 recfmt;
+ __u8 rsvd14[1006];
+ struct nvmf_disc_log_entry entries[];
+ };
+
+**Members**
+
+``genctr``
+ Generation Counter (GENCTR): Indicates the version of the discovery
+ information, starting at a value of 0h. For each change in the
+ Discovery Log Page, this counter is incremented by one. If the value
+ of this field is FFFFFFFF_FFFFFFFFh, then the field shall be cleared
+ to 0h when incremented (i.e., rolls over to 0h).
+
+``numrec``
+ Number of Records (NUMREC): Indicates the number of records
+ contained in the log.
+
+``recfmt``
+ Record Format (RECFMT): Specifies the format of the Discovery Log
+ Page. If a new format is defined, this value is incremented by one.
+ The format of the record specified in this definition shall be 0h.
+
+``rsvd14``
+ Reserved
+
+``entries``
+ Discovery Log Page Entries - see :c:type:`struct nvmf_disc_log_entry <nvmf_disc_log_entry>`.
+
+
+
+
+
+.. c:enum:: nvmf_dim_tas
+
+ Discovery Information Management Task
+
+**Constants**
+
+``NVMF_DIM_TAS_REGISTER``
+ Register
+
+``NVMF_DIM_TAS_DEREGISTER``
+ Deregister
+
+``NVMF_DIM_TAS_UPDATE``
+ Update
+
+
+
+
+.. c:enum:: nvmf_dim_entfmt
+
+ Discovery Information Management Entry Format
+
+**Constants**
+
+``NVMF_DIM_ENTFMT_BASIC``
+ Basic discovery information entry
+
+``NVMF_DIM_ENTFMT_EXTENDED``
+ Extended discovery information entry
+
+
+
+
+.. c:enum:: nvmf_dim_etype
+
+ Discovery Information Management Entity Type
+
+**Constants**
+
+``NVMF_DIM_ETYPE_HOST``
+ Host
+
+``NVMF_DIM_ETYPE_DDC``
+ Direct Discovery controller
+
+``NVMF_DIM_ETYPE_CDC``
+ Centralized Discovery controller
+
+
+
+
+.. c:enum:: nvmf_exattype
+
+ Extended Attribute Type
+
+**Constants**
+
+``NVMF_EXATTYPE_HOSTID``
+ Host Identifier
+
+``NVMF_EXATTYPE_SYMNAME``
+ Symblic Name
+
+
+
+
+.. c:struct:: nvmf_ext_attr
+
+ Extended Attribute (EXAT)
+
+**Definition**
+
+::
+
+ struct nvmf_ext_attr {
+ __le16 exattype;
+ __le16 exatlen;
+ __u8 exatval[];
+ };
+
+**Members**
+
+``exattype``
+ Extended Attribute Type (EXATTYPE) - see **enum** nvmf_exattype
+
+``exatlen``
+ Extended Attribute Length (EXATLEN)
+
+``exatval``
+ Extended Attribute Value (EXATVAL) - size allocated for array
+ must be a multiple of 4 bytes
+
+
+
+
+
+.. c:struct:: nvmf_ext_die
+
+ Extended Discovery Information Entry (DIE)
+
+**Definition**
+
+::
+
+ struct nvmf_ext_die {
+ __u8 trtype;
+ __u8 adrfam;
+ __u8 subtype;
+ __u8 treq;
+ __le16 portid;
+ __le16 cntlid;
+ __le16 asqsz;
+ __u8 rsvd10[22];
+ char trsvcid[NVMF_TRSVCID_SIZE];
+ __u8 resv64[192];
+ char nqn[NVME_NQN_LENGTH];
+ char traddr[NVMF_TRADDR_SIZE];
+ union nvmf_tsas tsas;
+ __le32 tel;
+ __le16 numexat;
+ __u8 resv1030[2];
+ struct nvmf_ext_attr exat[];
+ };
+
+**Members**
+
+``trtype``
+ Transport Type (:c:type:`enum nvmf_trtype <nvmf_trtype>`)
+
+``adrfam``
+ Address Family (:c:type:`enum nvmf_addr_family <nvmf_addr_family>`)
+
+``subtype``
+ Subsystem Type (:c:type:`enum nvme_subsys_type <nvme_subsys_type>`)
+
+``treq``
+ Transport Requirements (:c:type:`enum nvmf_treq <nvmf_treq>`)
+
+``portid``
+ Port ID
+
+``cntlid``
+ Controller ID
+
+``asqsz``
+ Admin Max SQ Size
+
+``rsvd10``
+ Reserved
+
+``trsvcid``
+ Transport Service Identifier
+
+``resv64``
+ Reserved
+
+``nqn``
+ NVM Qualified Name
+
+``traddr``
+ Transport Address
+
+``tsas``
+ Transport Specific Address Subtype (:c:type:`union nvmf_tsas <nvmf_tsas>`)
+
+``tel``
+ Total Entry Length
+
+``numexat``
+ Number of Extended Attributes
+
+``resv1030``
+ Reserved
+
+``exat``
+ Extended Attributes 0 (:c:type:`struct nvmf_ext_attr <nvmf_ext_attr>`)
+
+
+
+
+
+.. c:union:: nvmf_die
+
+ Discovery Information Entry (DIE)
+
+**Definition**
+
+::
+
+ union nvmf_die {
+ struct nvmf_disc_log_entry basic[0];
+ struct nvmf_ext_die extended;
+ };
+
+**Members**
+
+``basic``
+ Basic format (:c:type:`struct nvmf_disc_log_entry <nvmf_disc_log_entry>`)
+
+``extended``
+ Extended format (:c:type:`struct nvmf_ext_die <nvmf_ext_die>`)
+
+
+**Description**
+
+Depending on the ENTFMT specified in the DIM, DIEs can be entered
+with the Basic or Extended formats. For Basic format, each entry
+has a fixed length. Therefore, the "basic" field defined below can
+be accessed as a C array. For the Extended format, however, each
+entry is of variable length (TEL). Therefore, the "extended" field
+defined below cannot be accessed as a C array. Instead, the
+"extended" field is akin to a linked-list, where one can "walk"
+through the list. To move to the next entry, one simply adds the
+current entry's length (TEL) to the "walk" pointer. The number of
+entries in the list is specified by NUMENT. Although extended
+entries are of a variable lengths (TEL), TEL is always a multiple of
+4 bytes.
+
+
+
+
+.. c:struct:: nvmf_dim_data
+
+ Discovery Information Management (DIM) - Data
+
+**Definition**
+
+::
+
+ struct nvmf_dim_data {
+ __le32 tdl;
+ __u8 rsvd4[4];
+ __le64 nument;
+ __le16 entfmt;
+ __le16 etype;
+ __u8 portlcl;
+ __u8 rsvd21;
+ __le16 ektype;
+ char eid[NVME_NQN_LENGTH];
+ char ename[NVMF_ENAME_LEN];
+ char ever[NVMF_EVER_LEN];
+ __u8 rsvd600[424];
+ union nvmf_die die[];
+ };
+
+**Members**
+
+``tdl``
+ Total Data Length
+
+``rsvd4``
+ Reserved
+
+``nument``
+ Number of entries
+
+``entfmt``
+ Entry Format (:c:type:`enum nvmf_dim_entfmt <nvmf_dim_entfmt>`)
+
+``etype``
+ Entity Type (:c:type:`enum nvmf_dim_etype <nvmf_dim_etype>`)
+
+``portlcl``
+ Port Local
+
+``rsvd21``
+ Reserved
+
+``ektype``
+ Entry Key Type
+
+``eid``
+ Entity Identifier (e.g. Host NQN)
+
+``ename``
+ Entity Name (e.g. hostname)
+
+``ever``
+ Entity Version (e.g. OS Name/Version)
+
+``rsvd600``
+ Reserved
+
+``die``
+ Discovery Information Entry (see **nument** above)
+
+
+
+
+
+.. c:struct:: nvmf_connect_data
+
+ Data payload for the 'connect' command
+
+**Definition**
+
+::
+
+ struct nvmf_connect_data {
+ __u8 hostid[16];
+ __le16 cntlid;
+ char rsvd4[238];
+ char subsysnqn[NVME_NQN_LENGTH];
+ char hostnqn[NVME_NQN_LENGTH];
+ char rsvd5[256];
+ };
+
+**Members**
+
+``hostid``
+ Host ID of the connecting host
+
+``cntlid``
+ Requested controller ID
+
+``rsvd4``
+ Reserved
+
+``subsysnqn``
+ Subsystem NQN to connect to
+
+``hostnqn``
+ Host NQN of the connecting host
+
+``rsvd5``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_mi_read_nvm_ss_info
+
+ NVM Subsystem Information Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_mi_read_nvm_ss_info {
+ __u8 nump;
+ __u8 mjr;
+ __u8 mnr;
+ __u8 rsvd3[29];
+ };
+
+**Members**
+
+``nump``
+ Number of Ports
+
+``mjr``
+ NVMe-MI Major Version Number
+
+``mnr``
+ NVMe-MI Minor Version Number
+
+``rsvd3``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_mi_port_pcie
+
+ PCIe Port Specific Data
+
+**Definition**
+
+::
+
+ struct nvme_mi_port_pcie {
+ __u8 mps;
+ __u8 sls;
+ __u8 cls;
+ __u8 mlw;
+ __u8 nlw;
+ __u8 pn;
+ __u8 rsvd14[18];
+ };
+
+**Members**
+
+``mps``
+ PCIe Maximum Payload Size
+
+``sls``
+ PCIe Supported Link Speeds Vector
+
+``cls``
+ PCIe Current Link Speed
+
+``mlw``
+ PCIe Maximum Link Width
+
+``nlw``
+ PCIe Negotiated Link Width
+
+``pn``
+ PCIe Port Number
+
+``rsvd14``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_mi_port_smb
+
+ SMBus Port Specific Data
+
+**Definition**
+
+::
+
+ struct nvme_mi_port_smb {
+ __u8 vpd_addr;
+ __u8 mvpd_freq;
+ __u8 mme_addr;
+ __u8 mme_freq;
+ __u8 nvmebm;
+ __u8 rsvd13[19];
+ };
+
+**Members**
+
+``vpd_addr``
+ Current VPD SMBus/I2C Address
+
+``mvpd_freq``
+ Maximum VPD Access SMBus/I2C Frequency
+
+``mme_addr``
+ Current Management Endpoint SMBus/I2C Address
+
+``mme_freq``
+ Maximum Management Endpoint SMBus/I2C Frequency
+
+``nvmebm``
+ NVMe Basic Management
+
+``rsvd13``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_mi_read_port_info
+
+ Port Information Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_mi_read_port_info {
+ __u8 portt;
+ __u8 rsvd1;
+ __le16 mmctptus;
+ __le32 meb;
+ union {
+ struct nvme_mi_port_pcie pcie;
+ struct nvme_mi_port_smb smb;
+ };
+ };
+
+**Members**
+
+``portt``
+ Port Type
+
+``rsvd1``
+ Reserved
+
+``mmctptus``
+ Maximum MCTP Transmission Unit Size
+
+``meb``
+ Management Endpoint Buffer Size
+
+``{unnamed_union}``
+ anonymous
+
+``pcie``
+ PCIe Port Specific Data
+
+``smb``
+ SMBus Port Specific Data
+
+
+
+
+
+.. c:struct:: nvme_mi_read_ctrl_info
+
+ Controller Information Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_mi_read_ctrl_info {
+ __u8 portid;
+ __u8 rsvd1[4];
+ __u8 prii;
+ __le16 pri;
+ __le16 vid;
+ __le16 did;
+ __le16 ssvid;
+ __le16 ssid;
+ __u8 rsvd16[16];
+ };
+
+**Members**
+
+``portid``
+ Port Identifier
+
+``rsvd1``
+ Reserved
+
+``prii``
+ PCIe Routing ID Information
+
+``pri``
+ PCIe Routing ID
+
+``vid``
+ PCI Vendor ID
+
+``did``
+ PCI Device ID
+
+``ssvid``
+ PCI Subsystem Vendor ID
+
+``ssid``
+ PCI Subsystem Device ID
+
+``rsvd16``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_mi_osc
+
+ Optionally Supported Command Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_mi_osc {
+ __u8 type;
+ __u8 opc;
+ };
+
+**Members**
+
+``type``
+ Command Type
+
+``opc``
+ Opcode
+
+
+
+
+
+.. c:struct:: nvme_mi_read_sc_list
+
+ Management Endpoint Buffer Supported Command List Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_mi_read_sc_list {
+ __le16 numcmd;
+ struct nvme_mi_osc cmds[];
+ };
+
+**Members**
+
+``numcmd``
+ Number of Commands
+
+``cmds``
+ MEB supported Command Data Structure.
+ See **struct** nvme_mi_osc
+
+
+
+
+
+.. c:struct:: nvme_mi_nvm_ss_health_status
+
+ Subsystem Management Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_mi_nvm_ss_health_status {
+ __u8 nss;
+ __u8 sw;
+ __u8 ctemp;
+ __u8 pdlu;
+ __le16 ccs;
+ __u8 rsvd8[2];
+ };
+
+**Members**
+
+``nss``
+ NVM Subsystem Status
+
+``sw``
+ Smart Warnings
+
+``ctemp``
+ Composite Temperature
+
+``pdlu``
+ Percentage Drive Life Used
+
+``ccs``
+ Composite Controller Status
+
+``rsvd8``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_mi_ccs
+
+ Get State Control Primitive Success Response Fields - Control Primitive Specific Response
+
+**Constants**
+
+``NVME_MI_CCS_RDY``
+ Ready
+
+``NVME_MI_CCS_CFS``
+ Controller Fatal Status
+
+``NVME_MI_CCS_SHST``
+ Shutdown Status
+
+``NVME_MI_CCS_NSSRO``
+ NVM Subsystem Reset Occurred
+
+``NVME_MI_CCS_CECO``
+ Controller Enable Change Occurred
+
+``NVME_MI_CCS_NAC``
+ Namespace Attribute Changed
+
+``NVME_MI_CCS_FA``
+ Firmware Activated
+
+``NVME_MI_CCS_CSTS``
+ Controller Status Change
+
+``NVME_MI_CCS_CTEMP``
+ Composite Temperature Change
+
+``NVME_MI_CCS_PDLU``
+ Percentage Used
+
+``NVME_MI_CCS_SPARE``
+ Available Spare
+
+``NVME_MI_CCS_CCWARN``
+ Critical Warning
+
+
+
+
+.. c:struct:: nvme_mi_ctrl_health_status
+
+ Controller Health Data Structure (CHDS)
+
+**Definition**
+
+::
+
+ struct nvme_mi_ctrl_health_status {
+ __le16 ctlid;
+ __le16 csts;
+ __le16 ctemp;
+ __u8 pdlu;
+ __u8 spare;
+ __u8 cwarn;
+ __u8 rsvd9[7];
+ };
+
+**Members**
+
+``ctlid``
+ Controller Identifier
+
+``csts``
+ Controller Status
+
+``ctemp``
+ Composite Temperature
+
+``pdlu``
+ Percentage Used
+
+``spare``
+ Available Spare
+
+``cwarn``
+ Critical Warning
+
+``rsvd9``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_mi_csts
+
+ Controller Health Data Structure (CHDS) - Controller Status (CSTS)
+
+**Constants**
+
+``NVME_MI_CSTS_RDY``
+ Ready
+
+``NVME_MI_CSTS_CFS``
+ Controller Fatal Status
+
+``NVME_MI_CSTS_SHST``
+ Shutdown Status
+
+``NVME_MI_CSTS_NSSRO``
+ NVM Subsystem Reset Occurred
+
+``NVME_MI_CSTS_CECO``
+ Controller Enable Change Occurred
+
+``NVME_MI_CSTS_NAC``
+ Namespace Attribute Changed
+
+``NVME_MI_CSTS_FA``
+ Firmware Activated
+
+
+
+
+.. c:enum:: nvme_mi_cwarn
+
+ Controller Health Data Structure (CHDS) - Critical Warning (CWARN)
+
+**Constants**
+
+``NVME_MI_CWARN_ST``
+ Spare Threshold
+
+``NVME_MI_CWARN_TAUT``
+ Temperature Above or Under Threshold
+
+``NVME_MI_CWARN_RD``
+ Reliability Degraded
+
+``NVME_MI_CWARN_RO``
+ Read Only
+
+``NVME_MI_CWARN_VMBF``
+ Volatile Memory Backup Failed
+
+
+
+
+.. c:struct:: nvme_mi_vpd_mra
+
+ NVMe MultiRecord Area
+
+**Definition**
+
+::
+
+ struct nvme_mi_vpd_mra {
+ __u8 nmravn;
+ __u8 ff;
+ __u8 rsvd7[6];
+ __u8 i18vpwr;
+ __u8 m18vpwr;
+ __u8 i33vpwr;
+ __u8 m33vpwr;
+ __u8 rsvd17;
+ __u8 m33vapsr;
+ __u8 i5vapsr;
+ __u8 m5vapsr;
+ __u8 i12vapsr;
+ __u8 m12vapsr;
+ __u8 mtl;
+ __u8 tnvmcap[16];
+ __u8 rsvd37[27];
+ };
+
+**Members**
+
+``nmravn``
+ NVMe MultiRecord Area Version Number
+
+``ff``
+ Form Factor
+
+``rsvd7``
+ Reserved
+
+``i18vpwr``
+ Initial 1.8 V Power Supply Requirements
+
+``m18vpwr``
+ Maximum 1.8 V Power Supply Requirements
+
+``i33vpwr``
+ Initial 3.3 V Power Supply Requirements
+
+``m33vpwr``
+ Maximum 3.3 V Power Supply Requirements
+
+``rsvd17``
+ Reserved
+
+``m33vapsr``
+ Maximum 3.3 Vi aux Power Supply Requirements
+
+``i5vapsr``
+ Initial 5 V Power Supply Requirements
+
+``m5vapsr``
+ Maximum 5 V Power Supply Requirements
+
+``i12vapsr``
+ Initial 12 V Power Supply Requirements
+
+``m12vapsr``
+ Maximum 12 V Power Supply Requirements
+
+``mtl``
+ Maximum Thermal Load
+
+``tnvmcap``
+ Total NVM Capacity
+
+``rsvd37``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_mi_vpd_ppmra
+
+ NVMe PCIe Port MultiRecord Area
+
+**Definition**
+
+::
+
+ struct nvme_mi_vpd_ppmra {
+ __u8 nppmravn;
+ __u8 pn;
+ __u8 ppi;
+ __u8 ls;
+ __u8 mlw;
+ __u8 mctp;
+ __u8 refccap;
+ __u8 pi;
+ __u8 rsvd13[3];
+ };
+
+**Members**
+
+``nppmravn``
+ NVMe PCIe Port MultiRecord Area Version Number
+
+``pn``
+ PCIe Port Number
+
+``ppi``
+ Port Information
+
+``ls``
+ PCIe Link Speed
+
+``mlw``
+ PCIe Maximum Link Width
+
+``mctp``
+ MCTP Support
+
+``refccap``
+ Ref Clk Capability
+
+``pi``
+ Port Identifier
+
+``rsvd13``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_mi_vpd_telem
+
+ Vital Product Data Element Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_mi_vpd_telem {
+ __u8 type;
+ __u8 rev;
+ __u8 len;
+ __u8 data[0];
+ };
+
+**Members**
+
+``type``
+ Type of the Element Descriptor
+
+``rev``
+ Revision of the Element Descriptor
+
+``len``
+ Number of bytes in the Element Descriptor
+
+``data``
+ Type-specific information associated with
+ the Element Descriptor
+
+
+
+
+
+.. c:enum:: nvme_mi_elem
+
+ Element Descriptor Types
+
+**Constants**
+
+``NVME_MI_ELEM_EED``
+ Extended Element Descriptor
+
+``NVME_MI_ELEM_USCE``
+ Upstream Connector Element Descriptor
+
+``NVME_MI_ELEM_ECED``
+ Expansion Connector Element Descriptor
+
+``NVME_MI_ELEM_LED``
+ Label Element Descriptor
+
+``NVME_MI_ELEM_SMBMED``
+ SMBus/I2C Mux Element Descriptor
+
+``NVME_MI_ELEM_PCIESED``
+ PCIe Switch Element Descriptor
+
+``NVME_MI_ELEM_NVMED``
+ NVM Subsystem Element Descriptor
+
+
+
+
+.. c:struct:: nvme_mi_vpd_tra
+
+ Vital Product Data Topology MultiRecord
+
+**Definition**
+
+::
+
+ struct nvme_mi_vpd_tra {
+ __u8 vn;
+ __u8 rsvd6;
+ __u8 ec;
+ struct nvme_mi_vpd_telem elems[0];
+ };
+
+**Members**
+
+``vn``
+ Version Number
+
+``rsvd6``
+ Reserved
+
+``ec``
+ Element Count
+
+``elems``
+ Element Descriptor
+
+
+
+
+
+.. c:struct:: nvme_mi_vpd_mr_common
+
+ NVMe MultiRecord Area
+
+**Definition**
+
+::
+
+ struct nvme_mi_vpd_mr_common {
+ __u8 type;
+ __u8 rf;
+ __u8 rlen;
+ __u8 rchksum;
+ __u8 hchksum;
+ union {
+ struct nvme_mi_vpd_mra nmra;
+ struct nvme_mi_vpd_ppmra ppmra;
+ struct nvme_mi_vpd_tra tmra;
+ };
+ };
+
+**Members**
+
+``type``
+ NVMe Record Type ID
+
+``rf``
+ Record Format
+
+``rlen``
+ Record Length
+
+``rchksum``
+ Record Checksum
+
+``hchksum``
+ Header Checksum
+
+``{unnamed_union}``
+ anonymous
+
+``nmra``
+ NVMe MultiRecord Area
+
+``ppmra``
+ NVMe PCIe Port MultiRecord Area
+
+``tmra``
+ Topology MultiRecord Area
+
+
+
+
+
+.. c:struct:: nvme_mi_vpd_hdr
+
+ Vital Product Data Common Header
+
+**Definition**
+
+::
+
+ struct nvme_mi_vpd_hdr {
+ __u8 ipmiver;
+ __u8 iuaoff;
+ __u8 ciaoff;
+ __u8 biaoff;
+ __u8 piaoff;
+ __u8 mrioff;
+ __u8 rsvd6;
+ __u8 chchk;
+ __u8 vpd[];
+ };
+
+**Members**
+
+``ipmiver``
+ IPMI Format Version Number
+
+``iuaoff``
+ Internal Use Area Starting Offset
+
+``ciaoff``
+ Chassis Info Area Starting Offset
+
+``biaoff``
+ Board Info Area Starting Offset
+
+``piaoff``
+ Product Info Area Starting Offset
+
+``mrioff``
+ MultiRecord Info Area Starting Offset
+
+``rsvd6``
+ Reserved
+
+``chchk``
+ Common Header Checksum
+
+``vpd``
+ Vital Product Data
+
+
+
+
+
+.. c:enum:: nvme_status_field
+
+ Defines all parts of the nvme status field: status code, status code type, and additional flags.
+
+**Constants**
+
+``NVME_SCT_GENERIC``
+ Generic errors applicable to multiple opcodes
+
+``NVME_SCT_CMD_SPECIFIC``
+ Errors associated to a specific opcode
+
+``NVME_SCT_MEDIA``
+ Errors associated with media and data integrity
+
+``NVME_SCT_PATH``
+ Errors associated with the paths connection
+
+``NVME_SCT_VS``
+ Vendor specific errors
+
+``NVME_SCT_MASK``
+ Mask to get the value of the Status Code Type
+
+``NVME_SCT_SHIFT``
+ Shift value to get the value of the Status
+ Code Type
+
+``NVME_SC_MASK``
+ Mask to get the value of the status code.
+
+``NVME_SC_SHIFT``
+ Shift value to get the value of the status
+ code.
+
+``NVME_SC_SUCCESS``
+ Successful Completion: The command
+ completed without error.
+
+``NVME_SC_INVALID_OPCODE``
+ Invalid Command Opcode: A reserved coded
+ value or an unsupported value in the
+ command opcode field.
+
+``NVME_SC_INVALID_FIELD``
+ Invalid Field in Command: A reserved
+ coded value or an unsupported value in a
+ defined field.
+
+``NVME_SC_CMDID_CONFLICT``
+ Command ID Conflict: The command
+ identifier is already in use.
+
+``NVME_SC_DATA_XFER_ERROR``
+ Data Transfer Error: Transferring the
+ data or metadata associated with a
+ command experienced an error.
+
+``NVME_SC_POWER_LOSS``
+ Commands Aborted due to Power Loss
+ Notification: Indicates that the command
+ was aborted due to a power loss
+ notification.
+
+``NVME_SC_INTERNAL``
+ Internal Error: The command was not
+ completed successfully due to an internal error.
+
+``NVME_SC_ABORT_REQ``
+ Command Abort Requested: The command was
+ aborted due to an Abort command being
+ received that specified the Submission
+ Queue Identifier and Command Identifier
+ of this command.
+
+``NVME_SC_ABORT_QUEUE``
+ Command Aborted due to SQ Deletion: The
+ command was aborted due to a Delete I/O
+ Submission Queue request received for the
+ Submission Queue to which the command was
+ submitted.
+
+``NVME_SC_FUSED_FAIL``
+ Command Aborted due to Failed Fused Command:
+ The command was aborted due to the other
+ command in a fused operation failing.
+
+``NVME_SC_FUSED_MISSING``
+ Aborted due to Missing Fused Command: The
+ fused command was aborted due to the
+ adjacent submission queue entry not
+ containing a fused command that is the
+ other command.
+
+``NVME_SC_INVALID_NS``
+ Invalid Namespace or Format: The
+ namespace or the format of that namespace
+ is invalid.
+
+``NVME_SC_CMD_SEQ_ERROR``
+ Command Sequence Error: The command was
+ aborted due to a protocol violation in a
+ multi-command sequence.
+
+``NVME_SC_SGL_INVALID_LAST``
+ Invalid SGL Segment Descriptor: The
+ command includes an invalid SGL Last
+ Segment or SGL Segment descriptor.
+
+``NVME_SC_SGL_INVALID_COUNT``
+ Invalid Number of SGL Descriptors: There
+ is an SGL Last Segment descriptor or an
+ SGL Segment descriptor in a location
+ other than the last descriptor of a
+ segment based on the length indicated.
+
+``NVME_SC_SGL_INVALID_DATA``
+ Data SGL Length Invalid: This may occur
+ if the length of a Data SGL is too short.
+ This may occur if the length of a Data
+ SGL is too long and the controller does
+ not support SGL transfers longer than the
+ amount of data to be transferred as
+ indicated in the SGL Support field of the
+ Identify Controller data structure.
+
+``NVME_SC_SGL_INVALID_METADATA``
+ Metadata SGL Length Invalid: This may
+ occur if the length of a Metadata SGL is
+ too short. This may occur if the length
+ of a Metadata SGL is too long and the
+ controller does not support SGL transfers
+ longer than the amount of data to be
+ transferred as indicated in the SGL
+ Support field of the Identify Controller
+ data structure.
+
+``NVME_SC_SGL_INVALID_TYPE``
+ SGL Descriptor Type Invalid: The type of
+ an SGL Descriptor is a type that is not
+ supported by the controller.
+
+``NVME_SC_CMB_INVALID_USE``
+ Invalid Use of Controller Memory Buffer:
+ The attempted use of the Controller
+ Memory Buffer is not supported by the
+ controller.
+
+``NVME_SC_PRP_INVALID_OFFSET``
+ PRP Offset Invalid: The Offset field for
+ a PRP entry is invalid.
+
+``NVME_SC_AWU_EXCEEDED``
+ Atomic Write Unit Exceeded: The length
+ specified exceeds the atomic write unit size.
+
+``NVME_SC_OP_DENIED``
+ Operation Denied: The command was denied
+ due to lack of access rights. Refer to
+ the appropriate security specification.
+
+``NVME_SC_SGL_INVALID_OFFSET``
+ SGL Offset Invalid: The offset specified
+ in a descriptor is invalid. This may
+ occur when using capsules for data
+ transfers in NVMe over Fabrics
+ implementations and an invalid offset in
+ the capsule is specified.
+
+``NVME_SC_HOSTID_FORMAT``
+ Host Identifier Inconsistent Format: The
+ NVM subsystem detected the simultaneous
+ use of 64- bit and 128-bit Host
+ Identifier values on different
+ controllers.
+
+``NVME_SC_KAT_EXPIRED``
+ Keep Alive Timer Expired: The Keep Alive
+ Timer expired.
+
+``NVME_SC_KAT_INVALID``
+ Keep Alive Timeout Invalid: The Keep
+ Alive Timeout value specified is invalid.
+
+``NVME_SC_CMD_ABORTED_PREMEPT``
+ Command Aborted due to Preempt and Abort:
+ The command was aborted due to a
+ Reservation Acquire command.
+
+``NVME_SC_SANITIZE_FAILED``
+ Sanitize Failed: The most recent sanitize
+ operation failed and no recovery action
+ has been successfully completed.
+
+``NVME_SC_SANITIZE_IN_PROGRESS``
+ Sanitize In Progress: The requested
+ function (e.g., command) is prohibited
+ while a sanitize operation is in
+ progress.
+
+``NVME_SC_SGL_INVALID_GRANULARITY``
+ SGL Data Block Granularity Invalid: The
+ Address alignment or Length granularity
+ for an SGL Data Block descriptor is
+ invalid.
+
+``NVME_SC_CMD_IN_CMBQ_NOT_SUPP``
+ Command Not Supported for Queue in CMB:
+ The implementation does not support
+ submission of the command to a Submission
+ Queue in the Controller Memory Buffer or
+ command completion to a Completion Queue
+ in the Controller Memory Buffer.
+
+``NVME_SC_NS_WRITE_PROTECTED``
+ Namespace is Write Protected: The command
+ is prohibited while the namespace is
+ write protected as a result of a change
+ in the namespace write protection state
+ as defined by the Namespace Write
+ Protection State Machine.
+
+``NVME_SC_CMD_INTERRUPTED``
+ Command Interrupted: Command processing
+ was interrupted and the controller is
+ unable to successfully complete the
+ command. The host should retry the
+ command.
+
+``NVME_SC_TRAN_TPORT_ERROR``
+ Transient Transport Error: A transient
+ transport error was detected. If the
+ command is retried on the same
+ controller, the command is likely to
+ succeed. A command that fails with a
+ transient transport error four or more
+ times should be treated as a persistent
+ transport error that is not likely to
+ succeed if retried on the same
+ controller.
+
+``NVME_SC_PROHIBITED_BY_CMD_AND_FEAT``
+ Command Prohibited by Command and Feature
+ Lockdown: The command was aborted due to
+ command execution being prohibited by
+ the Command and Feature Lockdown.
+
+``NVME_SC_ADMIN_CMD_MEDIA_NOT_READY``
+ Admin Command Media Not Ready: The Admin
+ command requires access to media and
+ the media is not ready.
+
+``NVME_SC_LBA_RANGE``
+ LBA Out of Range: The command references
+ an LBA that exceeds the size of the namespace.
+
+``NVME_SC_CAP_EXCEEDED``
+ Capacity Exceeded: Execution of the
+ command has caused the capacity of the
+ namespace to be exceeded.
+
+``NVME_SC_NS_NOT_READY``
+ Namespace Not Ready: The namespace is not
+ ready to be accessed as a result of a
+ condition other than a condition that is
+ reported as an Asymmetric Namespace
+ Access condition.
+
+``NVME_SC_RESERVATION_CONFLICT``
+ Reservation Conflict: The command was
+ aborted due to a conflict with a
+ reservation held on the accessed
+ namespace.
+
+``NVME_SC_FORMAT_IN_PROGRESS``
+ Format In Progress: A Format NVM command
+ is in progress on the namespace.
+
+``NVME_SC_CQ_INVALID``
+ Completion Queue Invalid: The Completion
+ Queue identifier specified in the command
+ does not exist.
+
+``NVME_SC_QID_INVALID``
+ Invalid Queue Identifier: The creation of
+ the I/O Completion Queue failed due to an
+ invalid queue identifier specified as
+ part of the command. An invalid queue
+ identifier is one that is currently in
+ use or one that is outside the range
+ supported by the controller.
+
+``NVME_SC_QUEUE_SIZE``
+ Invalid Queue Size: The host attempted to
+ create an I/O Completion Queue with an
+ invalid number of entries.
+
+``NVME_SC_ABORT_LIMIT``
+ Abort Command Limit Exceeded: The number
+ of concurrently outstanding Abort commands
+ has exceeded the limit indicated in the
+ Identify Controller data structure.
+
+``NVME_SC_ABORT_MISSING``
+ Abort Command is missing: The abort
+ command is missing.
+
+``NVME_SC_ASYNC_LIMIT``
+ Asynchronous Event Request Limit
+ Exceeded: The number of concurrently
+ outstanding Asynchronous Event Request
+ commands has been exceeded.
+
+``NVME_SC_FIRMWARE_SLOT``
+ Invalid Firmware Slot: The firmware slot
+ indicated is invalid or read only. This
+ error is indicated if the firmware slot
+ exceeds the number supported.
+
+``NVME_SC_FIRMWARE_IMAGE``
+ Invalid Firmware Image: The firmware
+ image specified for activation is invalid
+ and not loaded by the controller.
+
+``NVME_SC_INVALID_VECTOR``
+ Invalid Interrupt Vector: The creation of
+ the I/O Completion Queue failed due to an
+ invalid interrupt vector specified as
+ part of the command.
+
+``NVME_SC_INVALID_LOG_PAGE``
+ Invalid Log Page: The log page indicated
+ is invalid. This error condition is also
+ returned if a reserved log page is
+ requested.
+
+``NVME_SC_INVALID_FORMAT``
+ Invalid Format: The LBA Format specified
+ is not supported.
+
+``NVME_SC_FW_NEEDS_CONV_RESET``
+ Firmware Activation Requires Conventional Reset:
+ The firmware commit was successful,
+ however, activation of the firmware image
+ requires a conventional reset.
+
+``NVME_SC_INVALID_QUEUE``
+ Invalid Queue Deletion: Invalid I/O
+ Completion Queue specified to delete.
+
+``NVME_SC_FEATURE_NOT_SAVEABLE``
+ Feature Identifier Not Saveable: The
+ Feature Identifier specified does not
+ support a saveable value.
+
+``NVME_SC_FEATURE_NOT_CHANGEABLE``
+ Feature Not Changeable: The Feature
+ Identifier is not able to be changed.
+
+``NVME_SC_FEATURE_NOT_PER_NS``
+ Feature Not Namespace Specific: The
+ Feature Identifier specified is not
+ namespace specific. The Feature
+ Identifier settings apply across all
+ namespaces.
+
+``NVME_SC_FW_NEEDS_SUBSYS_RESET``
+ Firmware Activation Requires NVM
+ Subsystem Reset: The firmware commit was
+ successful, however, activation of the
+ firmware image requires an NVM Subsystem.
+
+``NVME_SC_FW_NEEDS_RESET``
+ Firmware Activation Requires Controller
+ Level Reset: The firmware commit was
+ successful; however, the image specified
+ does not support being activated without
+ a reset.
+
+``NVME_SC_FW_NEEDS_MAX_TIME``
+ Firmware Activation Requires Maximum Time
+ Violation: The image specified if
+ activated immediately would exceed the
+ Maximum Time for Firmware Activation
+ (MTFA) value reported in Identify
+ Controller.
+
+``NVME_SC_FW_ACTIVATE_PROHIBITED``
+ Firmware Activation Prohibited: The image
+ specified is being prohibited from
+ activation by the controller for vendor
+ specific reasons.
+
+``NVME_SC_OVERLAPPING_RANGE``
+ Overlapping Range: The downloaded
+ firmware image has overlapping ranges.
+
+``NVME_SC_NS_INSUFFICIENT_CAP``
+ Namespace Insufficient Capacity: Creating
+ the namespace requires more free space
+ than is currently available.
+
+``NVME_SC_NS_ID_UNAVAILABLE``
+ Namespace Identifier Unavailable: The
+ number of namespaces supported has been
+ exceeded.
+
+``NVME_SC_NS_ALREADY_ATTACHED``
+ Namespace Already Attached: The
+ controller is already attached to the
+ namespace specified.
+
+``NVME_SC_NS_IS_PRIVATE``
+ Namespace Is Private: The namespace is
+ private and is already attached to one
+ controller.
+
+``NVME_SC_NS_NOT_ATTACHED``
+ Namespace Not Attached: The request to
+ detach the controller could not be
+ completed because the controller is not
+ attached to the namespace.
+
+``NVME_SC_THIN_PROV_NOT_SUPP``
+ Thin Provisioning Not Supported: Thin
+ provisioning is not supported by the
+ controller.
+
+``NVME_SC_CTRL_LIST_INVALID``
+ Controller List Invalid: The controller
+ list provided contains invalid controller
+ ids.
+
+``NVME_SC_SELF_TEST_IN_PROGRESS``
+ Device Self-test In Progress: The controller
+ or NVM subsystem already has a device
+ self-test operation in process.
+
+``NVME_SC_BP_WRITE_PROHIBITED``
+ Boot Partition Write Prohibited: The
+ command is trying to modify a locked Boot
+ Partition.
+
+``NVME_SC_INVALID_CTRL_ID``
+ Invalid Controller Identifier:
+
+``NVME_SC_INVALID_SEC_CTRL_STATE``
+ Invalid Secondary Controller State
+
+``NVME_SC_INVALID_CTRL_RESOURCES``
+ Invalid Number of Controller Resources
+
+``NVME_SC_INVALID_RESOURCE_ID``
+ Invalid Resource Identifier
+
+``NVME_SC_PMR_SAN_PROHIBITED``
+ Sanitize Prohibited While Persistent
+ Memory Region is Enabled
+
+``NVME_SC_ANA_GROUP_ID_INVALID``
+ ANA Group Identifier Invalid: The specified
+ ANA Group Identifier (ANAGRPID) is not
+ supported in the submitted command.
+
+``NVME_SC_ANA_ATTACH_FAILED``
+ ANA Attach Failed: The controller is not
+ attached to the namespace as a result
+ of an ANA condition.
+
+``NVME_SC_INSUFFICIENT_CAP``
+ Insufficient Capacity: Requested operation
+ requires more free space than is currently
+ available.
+
+``NVME_SC_NS_ATTACHMENT_LIMIT_EXCEEDED``
+ Namespace Attachment Limit Exceeded:
+ Attaching the ns to a controller causes
+ max number of ns attachments allowed
+ to be exceeded.
+
+``NVME_SC_PROHIBIT_CMD_EXEC_NOT_SUPPORTED``
+ Prohibition of Command Execution
+ Not Supported
+
+``NVME_SC_IOCS_NOT_SUPPORTED``
+ I/O Command Set Not Supported
+
+``NVME_SC_IOCS_NOT_ENABLED``
+ I/O Command Set Not Enabled
+
+``NVME_SC_IOCS_COMBINATION_REJECTED``
+ I/O Command Set Combination Rejected
+
+``NVME_SC_INVALID_IOCS``
+ Invalid I/O Command Set
+
+``NVME_SC_ID_UNAVAILABLE``
+ Identifier Unavailable
+
+``NVME_SC_INVALID_DISCOVERY_INFO``
+ The discovery information provided in
+ one or more extended discovery
+ information entries is not applicable
+ for the type of entity selected in
+ the Entity Type (ETYPE) field of the
+ Discovery Information Management
+ command data portion’s header.
+
+``NVME_SC_ZONING_DATA_STRUCT_LOCKED``
+ The requested Zoning data structure
+ is locked on the CDC.
+
+``NVME_SC_ZONING_DATA_STRUCT_NOTFND``
+ The requested Zoning data structure
+ does not exist on the CDC.
+
+``NVME_SC_INSUFFICIENT_DISC_RES``
+ The number of discover information
+ entries provided in the data portion
+ of the Discovery Information
+ Management command for a registration
+ task (i.e., TAS field cleared to 0h)
+ exceeds the available capacity for
+ new discovery information entries on
+ the CDC or DDC. This may be a
+ transient condition.
+
+``NVME_SC_REQSTD_FUNCTION_DISABLED``
+ Fabric Zoning is not enabled on the
+ CDC
+
+``NVME_SC_ZONEGRP_ORIGINATOR_INVLD``
+ The NQN contained in the ZoneGroup
+ Originator field does not match the
+ Host NQN used by the DDC to connect
+ to the CDC.
+
+``NVME_SC_BAD_ATTRIBUTES``
+ Conflicting Dataset Management Attributes
+
+``NVME_SC_INVALID_PI``
+ Invalid Protection Information
+
+``NVME_SC_READ_ONLY``
+ Attempted Write to Read Only Range
+
+``NVME_SC_CMD_SIZE_LIMIT_EXCEEDED``
+ Command Size Limit Exceeded
+
+``NVME_SC_CONNECT_FORMAT``
+ Incompatible Format: The NVM subsystem
+ does not support the record format
+ specified by the host.
+
+``NVME_SC_CONNECT_CTRL_BUSY``
+ Controller Busy: The controller is
+ already associated with a host.
+
+``NVME_SC_CONNECT_INVALID_PARAM``
+ Connect Invalid Parameters: One or more
+ of the command parameters.
+
+``NVME_SC_CONNECT_RESTART_DISC``
+ Connect Restart Discovery: The NVM
+ subsystem requested is not available.
+
+``NVME_SC_CONNECT_INVALID_HOST``
+ Connect Invalid Host: The host is either
+ not allowed to establish an association
+ to any controller in the NVM subsystem or
+ the host is not allowed to establish an
+ association to the specified controller
+
+``NVME_SC_DISCONNECT_INVALID_QTYPE``
+ Invalid Queue Type: The command was sent
+ on the wrong queue type.
+
+``NVME_SC_DISCOVERY_RESTART``
+ Discover Restart: The snapshot of the
+ records is now invalid or out of date.
+
+``NVME_SC_AUTH_REQUIRED``
+ Authentication Required: NVMe in-band
+ authentication is required and the queue
+ has not yet been authenticated.
+
+``NVME_SC_ZNS_INVALID_OP_REQUEST``
+ Invalid Zone Operation Request:
+ The operation requested is invalid. This may be due to
+ various conditions, including: attempting to allocate a
+ ZRWA when a zone is not in the ZSE:Empty state; or
+ invalid Flush Explicit ZRWA Range Send Zone Action
+ operation.
+
+``NVME_SC_ZNS_ZRWA_RESOURCES_UNAVAILABLE``
+ ZRWA Resources Unavailable:
+ No ZRWAs are available.
+
+``NVME_SC_ZNS_BOUNDARY_ERROR``
+ Zone Boundary Error: The command specifies
+ logical blocks in more than one zone.
+
+``NVME_SC_ZNS_FULL``
+ Zone Is Full: The accessed zone is in the
+ ZSF:Full state.
+
+``NVME_SC_ZNS_READ_ONLY``
+ Zone Is Read Only: The accessed zone is
+ in the ZSRO:Read Only state.
+
+``NVME_SC_ZNS_OFFLINE``
+ Zone Is Offline: The accessed zone is
+ in the ZSO:Offline state.
+
+``NVME_SC_ZNS_INVALID_WRITE``
+ Zone Invalid Write: The write to a zone
+ was not at the write pointer.
+
+``NVME_SC_ZNS_TOO_MANY_ACTIVE``
+ Too Many Active Zones: The controller
+ does not allow additional active zones.
+
+``NVME_SC_ZNS_TOO_MANY_OPENS``
+ Too Many Open Zones: The controller does
+ not allow additional open zones.
+
+``NVME_SC_ZNS_INVAL_TRANSITION``
+ Invalid Zone State Transition: The request
+ is not a valid zone state transition.
+
+``NVME_SC_WRITE_FAULT``
+ Write Fault: The write data could not be
+ committed to the media.
+
+``NVME_SC_READ_ERROR``
+ Unrecovered Read Error: The read data
+ could not be recovered from the media.
+
+``NVME_SC_GUARD_CHECK``
+ End-to-end Guard Check Error: The command
+ was aborted due to an end-to-end guard
+ check failure.
+
+``NVME_SC_APPTAG_CHECK``
+ End-to-end Application Tag Check Error:
+ The command was aborted due to an
+ end-to-end application tag check failure.
+
+``NVME_SC_REFTAG_CHECK``
+ End-to-end Reference Tag Check Error: The
+ command was aborted due to an end-to-end
+ reference tag check failure.
+
+``NVME_SC_COMPARE_FAILED``
+ Compare Failure: The command failed due
+ to a miscompare during a Compare command.
+
+``NVME_SC_ACCESS_DENIED``
+ Access Denied: Access to the namespace
+ and/or LBA range is denied due to lack of
+ access rights.
+
+``NVME_SC_UNWRITTEN_BLOCK``
+ Deallocated or Unwritten Logical Block:
+ The command failed due to an attempt to
+ read from or verify an LBA range
+ containing a deallocated or unwritten
+ logical block.
+
+``NVME_SC_STORAGE_TAG_CHECK``
+ End-to-End Storage Tag Check Error: The
+ command was aborted due to an end-to-end
+ storage tag check failure.
+
+``NVME_SC_ANA_INTERNAL_PATH_ERROR``
+ Internal Path Error: The command was not
+ completed as the result of a controller
+ internal error that is specific to the
+ controller processing the command.
+
+``NVME_SC_ANA_PERSISTENT_LOSS``
+ Asymmetric Access Persistent Loss: The
+ requested function (e.g., command) is not
+ able to be performed as a result of the
+ relationship between the controller and
+ the namespace being in the ANA Persistent
+ Loss state.
+
+``NVME_SC_ANA_INACCESSIBLE``
+ Asymmetric Access Inaccessible: The
+ requested function (e.g., command) is not
+ able to be performed as a result of the
+ relationship between the controller and
+ the namespace being in the ANA
+ Inaccessible state.
+
+``NVME_SC_ANA_TRANSITION``
+ Asymmetric Access Transition: The
+ requested function (e.g., command) is not
+ able to be performed as a result of the
+ relationship between the controller and
+ the namespace transitioning between
+ Asymmetric Namespace Access states.
+
+``NVME_SC_CTRL_PATH_ERROR``
+ Controller Pathing Error: A pathing error
+ was detected by the controller.
+
+``NVME_SC_HOST_PATH_ERROR``
+ Host Pathing Error: A pathing error was
+ detected by the host.
+
+``NVME_SC_CMD_ABORTED_BY_HOST``
+ Command Aborted By Host: The command was
+ aborted as a result of host action.
+
+``NVME_SC_CRD``
+ Mask to get value of Command Retry Delay
+ index
+
+``NVME_SC_MORE``
+ More bit. If set, more status information
+ for this command as part of the Error
+ Information log that may be retrieved with
+ the Get Log Page command.
+
+``NVME_SC_DNR``
+ Do Not Retry bit. If set, if the same
+ command is re-submitted to any controller
+ in the NVM subsystem, then that
+ re-submitted command is expected to fail.
+
+
+.. c:function:: __u16 nvme_status_code_type (__u16 status_field)
+
+ Returns the NVMe Status Code Type
+
+**Parameters**
+
+``__u16 status_field``
+ The NVMe Completion Queue Entry's Status Field
+ See :c:type:`enum nvme_status_field <nvme_status_field>`
+
+**Return**
+
+status code type
+
+
+.. c:function:: __u16 nvme_status_code (__u16 status_field)
+
+ Returns the NVMe Status Code
+
+**Parameters**
+
+``__u16 status_field``
+ The NVMe Completion Queue Entry's Status Field
+ See :c:type:`enum nvme_status_field <nvme_status_field>`
+
+**Return**
+
+status code
+
+
+
+
+.. c:enum:: nvme_status_type
+
+ type encoding for NVMe return values, when represented as an int.
+
+**Constants**
+
+``NVME_STATUS_TYPE_SHIFT``
+ shift value for status bits
+
+``NVME_STATUS_TYPE_MASK``
+ mask value for status bits
+
+``NVME_STATUS_TYPE_NVME``
+ NVMe command status value, typically from CDW3
+
+``NVME_STATUS_TYPE_MI``
+ NVMe-MI header status
+
+**Description**
+
+
+The nvme_* api returns an int, with negative values indicating an internal
+or syscall error, zero signifying success, positive values representing
+the NVMe status.
+
+That latter case (the NVMe status) may represent status values from
+different parts of the transport/controller/etc, and are at most 16 bits of
+data. So, we use the most-significant 3 bits of the signed int to indicate
+which type of status this is.
+
+
+.. c:function:: __u32 nvme_status_get_type (int status)
+
+ extract the type from a nvme_* return value
+
+**Parameters**
+
+``int status``
+ the (non-negative) return value from the NVMe API
+
+**Return**
+
+the type component of the status.
+
+
+.. c:function:: __u32 nvme_status_get_value (int status)
+
+ extract the status value from a nvme_* return value
+
+**Parameters**
+
+``int status``
+ the (non-negative) return value from the NVMe API
+
+**Return**
+
+the value component of the status; the set of values will depend
+on the status type.
+
+
+.. c:function:: __u32 nvme_status_equals (int status, enum nvme_status_type type, unsigned int value)
+
+ helper to check a status against a type and value
+
+**Parameters**
+
+``int status``
+ the (non-negative) return value from the NVMe API
+
+``enum nvme_status_type type``
+ the status type
+
+``unsigned int value``
+ the status value
+
+**Return**
+
+true if **status** is of the specified type and value
+
+
+
+
+.. c:enum:: nvme_admin_opcode
+
+ Known NVMe admin opcodes
+
+**Constants**
+
+``nvme_admin_delete_sq``
+ Delete I/O Submission Queue
+
+``nvme_admin_create_sq``
+ Create I/O Submission Queue
+
+``nvme_admin_get_log_page``
+ Get Log Page
+
+``nvme_admin_delete_cq``
+ Delete I/O Completion Queue
+
+``nvme_admin_create_cq``
+ Create I/O Completion Queue
+
+``nvme_admin_identify``
+ Identify
+
+``nvme_admin_abort_cmd``
+ Abort
+
+``nvme_admin_set_features``
+ Set Features
+
+``nvme_admin_get_features``
+ Get Features
+
+``nvme_admin_async_event``
+ Asynchronous Event Request
+
+``nvme_admin_ns_mgmt``
+ Namespace Management
+
+``nvme_admin_fw_commit``
+ Firmware Commit
+
+``nvme_admin_fw_activate``
+ Firmware Commit
+
+``nvme_admin_fw_download``
+ Firmware Image Download
+
+``nvme_admin_dev_self_test``
+ Device Self-test
+
+``nvme_admin_ns_attach``
+ Namespace Attachment
+
+``nvme_admin_keep_alive``
+ Keep Alive
+
+``nvme_admin_directive_send``
+ Directive Send
+
+``nvme_admin_directive_recv``
+ Directive Receive
+
+``nvme_admin_virtual_mgmt``
+ Virtualization Management
+
+``nvme_admin_nvme_mi_send``
+ NVMe-MI Send
+
+``nvme_admin_nvme_mi_recv``
+ NVMe-MI Receive
+
+``nvme_admin_capacity_mgmt``
+ Capacity Management
+
+``nvme_admin_discovery_info_mgmt``
+ Discovery Information Management (DIM)
+
+``nvme_admin_fabric_zoning_recv``
+ Fabric Zoning Receive
+
+``nvme_admin_lockdown``
+ Lockdown
+
+``nvme_admin_fabric_zoning_lookup``
+ Fabric Zoning Lookup
+
+``nvme_admin_fabric_zoning_send``
+ Fabric Zoning Send
+
+``nvme_admin_dbbuf``
+ Doorbell Buffer Config
+
+``nvme_admin_fabrics``
+ Fabrics Commands
+
+``nvme_admin_format_nvm``
+ Format NVM
+
+``nvme_admin_security_send``
+ Security Send
+
+``nvme_admin_security_recv``
+ Security Receive
+
+``nvme_admin_sanitize_nvm``
+ Sanitize
+
+``nvme_admin_get_lba_status``
+ Get LBA Status
+
+
+
+
+.. c:enum:: nvme_identify_cns
+
+ Identify - CNS Values
+
+**Constants**
+
+``NVME_IDENTIFY_CNS_NS``
+ Identify Namespace data structure
+
+``NVME_IDENTIFY_CNS_CTRL``
+ Identify Controller data structure
+
+``NVME_IDENTIFY_CNS_NS_ACTIVE_LIST``
+ Active Namespace ID list
+
+``NVME_IDENTIFY_CNS_NS_DESC_LIST``
+ Namespace Identification Descriptor list
+
+``NVME_IDENTIFY_CNS_NVMSET_LIST``
+ NVM Set List
+
+``NVME_IDENTIFY_CNS_CSI_NS``
+ I/O Command Set specific Identify
+ Namespace data structure
+
+``NVME_IDENTIFY_CNS_CSI_CTRL``
+ I/O Command Set specific Identify
+ Controller data structure
+
+``NVME_IDENTIFY_CNS_CSI_NS_ACTIVE_LIST``
+ Active Namespace ID list associated
+ with the specified I/O Command Set
+
+``NVME_IDENTIFY_CNS_CSI_INDEPENDENT_ID_NS``
+ I/O Command Set Independent Identify
+
+``NVME_IDENTIFY_CNS_NS_USER_DATA_FORMAT``
+ Namespace user data format
+
+``NVME_IDENTIFY_CNS_CSI_NS_USER_DATA_FORMAT``
+ I/O Command Set specific user data
+ format
+ Namespace data structure
+
+``NVME_IDENTIFY_CNS_ALLOCATED_NS_LIST``
+ Allocated Namespace ID list
+
+``NVME_IDENTIFY_CNS_ALLOCATED_NS``
+ Identify Namespace data structure for
+ the specified allocated NSID
+
+``NVME_IDENTIFY_CNS_NS_CTRL_LIST``
+ Controller List of controllers attached
+ to the specified NSID
+
+``NVME_IDENTIFY_CNS_CTRL_LIST``
+ Controller List of controllers that exist
+ in the NVM subsystem
+
+``NVME_IDENTIFY_CNS_PRIMARY_CTRL_CAP``
+ Primary Controller Capabilities data
+ structure for the specified primary controller
+
+``NVME_IDENTIFY_CNS_SECONDARY_CTRL_LIST``
+ Secondary Controller list of controllers
+ associated with the primary controller
+ processing the command
+
+``NVME_IDENTIFY_CNS_NS_GRANULARITY``
+ A Namespace Granularity List
+
+``NVME_IDENTIFY_CNS_UUID_LIST``
+ A UUID List
+
+``NVME_IDENTIFY_CNS_DOMAIN_LIST``
+ Domain List
+
+``NVME_IDENTIFY_CNS_ENDURANCE_GROUP_ID``
+ Endurance Group List
+
+``NVME_IDENTIFY_CNS_CSI_ALLOCATED_NS_LIST``
+ I/O Command Set specific Allocated Namespace
+ ID list
+
+``NVME_IDENTIFY_CNS_CSI_ID_NS_DATA_STRUCTURE``
+ I/O Command Set specific ID Namespace
+ Data Structure for Allocated Namespace ID
+
+``NVME_IDENTIFY_CNS_COMMAND_SET_STRUCTURE``
+ Base Specification 2.0a section 5.17.2.21
+
+
+
+
+.. c:enum:: nvme_cmd_get_log_lid
+
+ Get Log Page -Log Page Identifiers
+
+**Constants**
+
+``NVME_LOG_LID_SUPPORTED_LOG_PAGES``
+ Supported Log Pages
+
+``NVME_LOG_LID_ERROR``
+ Error Information
+
+``NVME_LOG_LID_SMART``
+ SMART / Health Information
+
+``NVME_LOG_LID_FW_SLOT``
+ Firmware Slot Information
+
+``NVME_LOG_LID_CHANGED_NS``
+ Changed Namespace List
+
+``NVME_LOG_LID_CMD_EFFECTS``
+ Commands Supported and Effects
+
+``NVME_LOG_LID_DEVICE_SELF_TEST``
+ Device Self-test
+
+``NVME_LOG_LID_TELEMETRY_HOST``
+ Telemetry Host-Initiated
+
+``NVME_LOG_LID_TELEMETRY_CTRL``
+ Telemetry Controller-Initiated
+
+``NVME_LOG_LID_ENDURANCE_GROUP``
+ Endurance Group Information
+
+``NVME_LOG_LID_PREDICTABLE_LAT_NVMSET``
+ Predictable Latency Per NVM Set
+
+``NVME_LOG_LID_PREDICTABLE_LAT_AGG``
+ Predictable Latency Event Aggregate
+
+``NVME_LOG_LID_ANA``
+ Asymmetric Namespace Access
+
+``NVME_LOG_LID_PERSISTENT_EVENT``
+ Persistent Event Log
+
+``NVME_LOG_LID_LBA_STATUS``
+ LBA Status Information
+
+``NVME_LOG_LID_ENDURANCE_GRP_EVT``
+ Endurance Group Event Aggregate
+
+``NVME_LOG_LID_MEDIA_UNIT_STATUS``
+ Media Unit Status
+
+``NVME_LOG_LID_SUPPORTED_CAP_CONFIG_LIST``
+ Supported Capacity Configuration Lis
+
+``NVME_LOG_LID_FID_SUPPORTED_EFFECTS``
+ Feature Identifiers Supported and Effects
+
+``NVME_LOG_LID_MI_CMD_SUPPORTED_EFFECTS``
+ NVMe-MI Commands Supported and Effects
+
+``NVME_LOG_LID_BOOT_PARTITION``
+ Boot Partition
+
+``NVME_LOG_LID_FDP_CONFIGS``
+ FDP Configurations
+
+``NVME_LOG_LID_FDP_RUH_USAGE``
+ Reclaim Unit Handle Usage
+
+``NVME_LOG_LID_FDP_STATS``
+ FDP Statistics
+
+``NVME_LOG_LID_FDP_EVENTS``
+ FDP Events
+
+``NVME_LOG_LID_DISCOVER``
+ Discovery
+
+``NVME_LOG_LID_RESERVATION``
+ Reservation Notification
+
+``NVME_LOG_LID_SANITIZE``
+ Sanitize Status
+
+``NVME_LOG_LID_ZNS_CHANGED_ZONES``
+ Changed Zone List
+
+
+
+
+.. c:enum:: nvme_features_id
+
+ Features - Feature Identifiers
+
+**Constants**
+
+``NVME_FEAT_FID_ARBITRATION``
+ Arbitration
+
+``NVME_FEAT_FID_POWER_MGMT``
+ Power Management
+
+``NVME_FEAT_FID_LBA_RANGE``
+ LBA Range Type
+
+``NVME_FEAT_FID_TEMP_THRESH``
+ Temperature Threshold
+
+``NVME_FEAT_FID_ERR_RECOVERY``
+ Error Recovery
+
+``NVME_FEAT_FID_VOLATILE_WC``
+ Volatile Write Cache
+
+``NVME_FEAT_FID_NUM_QUEUES``
+ Number of Queues
+
+``NVME_FEAT_FID_IRQ_COALESCE``
+ Interrupt Coalescing
+
+``NVME_FEAT_FID_IRQ_CONFIG``
+ Interrupt Vector Configuration
+
+``NVME_FEAT_FID_WRITE_ATOMIC``
+ Write Atomicity Normal
+
+``NVME_FEAT_FID_ASYNC_EVENT``
+ Asynchronous Event Configuration
+
+``NVME_FEAT_FID_AUTO_PST``
+ Autonomous Power State Transition
+
+``NVME_FEAT_FID_HOST_MEM_BUF``
+ Host Memory Buffer
+
+``NVME_FEAT_FID_TIMESTAMP``
+ Timestamp
+
+``NVME_FEAT_FID_KATO``
+ Keep Alive Timer
+
+``NVME_FEAT_FID_HCTM``
+ Host Controlled Thermal Management
+
+``NVME_FEAT_FID_NOPSC``
+ Non-Operational Power State Config
+
+``NVME_FEAT_FID_RRL``
+ Read Recovery Level Config
+
+``NVME_FEAT_FID_PLM_CONFIG``
+ Predictable Latency Mode Config
+
+``NVME_FEAT_FID_PLM_WINDOW``
+ Predictable Latency Mode Window
+
+``NVME_FEAT_FID_LBA_STS_INTERVAL``
+ LBA Status Information Report Interval
+
+``NVME_FEAT_FID_HOST_BEHAVIOR``
+ Host Behavior Support
+
+``NVME_FEAT_FID_SANITIZE``
+ Endurance Group Event Configuration
+
+``NVME_FEAT_FID_ENDURANCE_EVT_CFG``
+ Endurance Group Event Configuration
+
+``NVME_FEAT_FID_IOCS_PROFILE``
+ I/O Command Set Profile
+
+``NVME_FEAT_FID_SPINUP_CONTROL``
+ Spinup Control
+
+``NVME_FEAT_FID_FDP``
+ Flexible Data Placement
+
+``NVME_FEAT_FID_FDP_EVENTS``
+ FDP Events
+
+``NVME_FEAT_FID_ENH_CTRL_METADATA``
+ Enhanced Controller Metadata
+
+``NVME_FEAT_FID_CTRL_METADATA``
+ Controller Metadata
+
+``NVME_FEAT_FID_NS_METADATA``
+ Namespace Metadata
+
+``NVME_FEAT_FID_SW_PROGRESS``
+ Software Progress Marker
+
+``NVME_FEAT_FID_HOST_ID``
+ Host Identifier
+
+``NVME_FEAT_FID_RESV_MASK``
+ Reservation Notification Mask
+
+``NVME_FEAT_FID_RESV_PERSIST``
+ Reservation Persistence
+
+``NVME_FEAT_FID_WRITE_PROTECT``
+ Namespace Write Protection Config
+
+
+
+
+.. c:enum:: nvme_feat
+
+ Features Access Shifts/Masks values
+
+**Constants**
+
+``NVME_FEAT_ARBITRATION_BURST_SHIFT``
+
+``NVME_FEAT_ARBITRATION_BURST_MASK``
+
+``NVME_FEAT_ARBITRATION_LPW_SHIFT``
+
+``NVME_FEAT_ARBITRATION_LPW_MASK``
+
+``NVME_FEAT_ARBITRATION_MPW_SHIFT``
+
+``NVME_FEAT_ARBITRATION_MPW_MASK``
+
+``NVME_FEAT_ARBITRATION_HPW_SHIFT``
+
+``NVME_FEAT_ARBITRATION_HPW_MASK``
+
+``NVME_FEAT_PWRMGMT_PS_SHIFT``
+
+``NVME_FEAT_PWRMGMT_PS_MASK``
+
+``NVME_FEAT_PWRMGMT_WH_SHIFT``
+
+``NVME_FEAT_PWRMGMT_WH_MASK``
+
+``NVME_FEAT_LBAR_NR_SHIFT``
+
+``NVME_FEAT_LBAR_NR_MASK``
+
+``NVME_FEAT_TT_TMPTH_SHIFT``
+
+``NVME_FEAT_TT_TMPTH_MASK``
+
+``NVME_FEAT_TT_TMPSEL_SHIFT``
+
+``NVME_FEAT_TT_TMPSEL_MASK``
+
+``NVME_FEAT_TT_THSEL_SHIFT``
+
+``NVME_FEAT_TT_THSEL_MASK``
+
+``NVME_FEAT_ERROR_RECOVERY_TLER_SHIFT``
+
+``NVME_FEAT_ERROR_RECOVERY_TLER_MASK``
+
+``NVME_FEAT_ERROR_RECOVERY_DULBE_SHIFT``
+
+``NVME_FEAT_ERROR_RECOVERY_DULBE_MASK``
+
+``NVME_FEAT_VWC_WCE_SHIFT``
+
+``NVME_FEAT_VWC_WCE_MASK``
+
+``NVME_FEAT_NRQS_NSQR_SHIFT``
+
+``NVME_FEAT_NRQS_NSQR_MASK``
+
+``NVME_FEAT_NRQS_NCQR_SHIFT``
+
+``NVME_FEAT_NRQS_NCQR_MASK``
+
+``NVME_FEAT_IRQC_THR_SHIFT``
+
+``NVME_FEAT_IRQC_THR_MASK``
+
+``NVME_FEAT_IRQC_TIME_SHIFT``
+
+``NVME_FEAT_IRQC_TIME_MASK``
+
+``NVME_FEAT_ICFG_IV_SHIFT``
+
+``NVME_FEAT_ICFG_IV_MASK``
+
+``NVME_FEAT_ICFG_CD_SHIFT``
+
+``NVME_FEAT_ICFG_CD_MASK``
+
+``NVME_FEAT_WA_DN_SHIFT``
+
+``NVME_FEAT_WA_DN_MASK``
+
+``NVME_FEAT_AE_SMART_SHIFT``
+
+``NVME_FEAT_AE_SMART_MASK``
+
+``NVME_FEAT_AE_NAN_SHIFT``
+
+``NVME_FEAT_AE_NAN_MASK``
+
+``NVME_FEAT_AE_FW_SHIFT``
+
+``NVME_FEAT_AE_FW_MASK``
+
+``NVME_FEAT_AE_TELEM_SHIFT``
+
+``NVME_FEAT_AE_TELEM_MASK``
+
+``NVME_FEAT_AE_ANA_SHIFT``
+
+``NVME_FEAT_AE_ANA_MASK``
+
+``NVME_FEAT_AE_PLA_SHIFT``
+
+``NVME_FEAT_AE_PLA_MASK``
+
+``NVME_FEAT_AE_LBAS_SHIFT``
+
+``NVME_FEAT_AE_LBAS_MASK``
+
+``NVME_FEAT_AE_EGA_SHIFT``
+
+``NVME_FEAT_AE_EGA_MASK``
+
+``NVME_FEAT_APST_APSTE_SHIFT``
+
+``NVME_FEAT_APST_APSTE_MASK``
+
+``NVME_FEAT_HMEM_EHM_SHIFT``
+
+``NVME_FEAT_HMEM_EHM_MASK``
+
+``NVME_FEAT_HCTM_TMT2_SHIFT``
+
+``NVME_FEAT_HCTM_TMT2_MASK``
+
+``NVME_FEAT_HCTM_TMT1_SHIFT``
+
+``NVME_FEAT_HCTM_TMT1_MASK``
+
+``NVME_FEAT_NOPS_NOPPME_SHIFT``
+
+``NVME_FEAT_NOPS_NOPPME_MASK``
+
+``NVME_FEAT_RRL_RRL_SHIFT``
+
+``NVME_FEAT_RRL_RRL_MASK``
+
+``NVME_FEAT_PLM_PLME_SHIFT``
+
+``NVME_FEAT_PLM_PLME_MASK``
+
+``NVME_FEAT_PLMW_WS_SHIFT``
+
+``NVME_FEAT_PLMW_WS_MASK``
+
+``NVME_FEAT_LBAS_LSIRI_SHIFT``
+
+``NVME_FEAT_LBAS_LSIRI_MASK``
+
+``NVME_FEAT_LBAS_LSIPI_SHIFT``
+
+``NVME_FEAT_LBAS_LSIPI_MASK``
+
+``NVME_FEAT_SC_NODRM_SHIFT``
+
+``NVME_FEAT_SC_NODRM_MASK``
+
+``NVME_FEAT_EG_ENDGID_SHIFT``
+
+``NVME_FEAT_EG_ENDGID_MASK``
+
+``NVME_FEAT_EG_EGCW_SHIFT``
+
+``NVME_FEAT_EG_EGCW_MASK``
+
+``NVME_FEAT_SPM_PBSLC_SHIFT``
+
+``NVME_FEAT_SPM_PBSLC_MASK``
+
+``NVME_FEAT_HOSTID_EXHID_SHIFT``
+
+``NVME_FEAT_HOSTID_EXHID_MASK``
+
+``NVME_FEAT_RM_REGPRE_SHIFT``
+
+``NVME_FEAT_RM_REGPRE_MASK``
+
+``NVME_FEAT_RM_RESREL_SHIFT``
+
+``NVME_FEAT_RM_RESREL_MASK``
+
+``NVME_FEAT_RM_RESPRE_SHIFT``
+
+``NVME_FEAT_RM_RESPRE_MASK``
+
+``NVME_FEAT_RP_PTPL_SHIFT``
+
+``NVME_FEAT_RP_PTPL_MASK``
+
+``NVME_FEAT_WP_WPS_SHIFT``
+
+``NVME_FEAT_WP_WPS_MASK``
+
+``NVME_FEAT_IOCSP_IOCSCI_SHIFT``
+
+``NVME_FEAT_IOCSP_IOCSCI_MASK``
+
+``NVME_FEAT_FDP_ENABLED_SHIFT``
+
+``NVME_FEAT_FDP_ENABLED_MASK``
+
+``NVME_FEAT_FDP_INDEX_SHIFT``
+
+``NVME_FEAT_FDP_INDEX_MASK``
+
+``NVME_FEAT_FDP_EVENTS_ENABLE_SHIFT``
+
+``NVME_FEAT_FDP_EVENTS_ENABLE_MASK``
+
+
+
+
+.. c:enum:: nvme_get_features_sel
+
+ Get Features - Select
+
+**Constants**
+
+``NVME_GET_FEATURES_SEL_CURRENT``
+ Current value
+
+``NVME_GET_FEATURES_SEL_DEFAULT``
+ Default value
+
+``NVME_GET_FEATURES_SEL_SAVED``
+ Saved value
+
+``NVME_GET_FEATURES_SEL_SUPPORTED``
+ Supported capabilities
+
+
+
+
+.. c:enum:: nvme_cmd_format_mset
+
+ Format NVM - Metadata Settings
+
+**Constants**
+
+``NVME_FORMAT_MSET_SEPARATE``
+ indicates that the metadata is transferred
+ as part of a separate buffer.
+
+``NVME_FORMAT_MSET_EXTENDED``
+ indicates that the metadata is transferred
+ as part of an extended data LBA.
+
+
+
+
+.. c:enum:: nvme_cmd_format_pi
+
+ Format NVM - Protection Information
+
+**Constants**
+
+``NVME_FORMAT_PI_DISABLE``
+ Protection information is not enabled.
+
+``NVME_FORMAT_PI_TYPE1``
+ Protection information is enabled, Type 1.
+
+``NVME_FORMAT_PI_TYPE2``
+ Protection information is enabled, Type 2.
+
+``NVME_FORMAT_PI_TYPE3``
+ Protection information is enabled, Type 3.
+
+
+
+
+.. c:enum:: nvme_cmd_format_pil
+
+ Format NVM - Protection Information Location
+
+**Constants**
+
+``NVME_FORMAT_PIL_LAST``
+ Protection information is transferred as the last
+ bytes of metadata.
+
+``NVME_FORMAT_PIL_FIRST``
+ Protection information is transferred as the first
+ bytes of metadata.
+
+
+
+
+.. c:enum:: nvme_cmd_format_ses
+
+ Format NVM - Secure Erase Settings
+
+**Constants**
+
+``NVME_FORMAT_SES_NONE``
+ No secure erase operation requested.
+
+``NVME_FORMAT_SES_USER_DATA_ERASE``
+ User Data Erase: All user data shall be erased,
+ contents of the user data after the erase is
+ indeterminate (e.g. the user data may be zero
+ filled, one filled, etc.). If a User Data Erase
+ is requested and all affected user data is
+ encrypted, then the controller is allowed
+ to use a cryptographic erase to perform
+ the requested User Data Erase.
+
+``NVME_FORMAT_SES_CRYPTO_ERASE``
+ Cryptographic Erase: All user data shall
+ be erased cryptographically. This is
+ accomplished by deleting the encryption key.
+
+
+
+
+.. c:enum:: nvme_ns_mgmt_sel
+
+ Namespace Management - Select
+
+**Constants**
+
+``NVME_NS_MGMT_SEL_CREATE``
+ Namespace Create selection
+
+``NVME_NS_MGMT_SEL_DELETE``
+ Namespace Delete selection
+
+
+
+
+.. c:enum:: nvme_ns_attach_sel
+
+ Namespace Attachment - Select
+
+**Constants**
+
+``NVME_NS_ATTACH_SEL_CTRL_ATTACH``
+ Namespace attach selection
+
+``NVME_NS_ATTACH_SEL_CTRL_DEATTACH``
+ Namespace detach selection
+
+
+
+
+.. c:enum:: nvme_fw_commit_ca
+
+ Firmware Commit - Commit Action
+
+**Constants**
+
+``NVME_FW_COMMIT_CA_REPLACE``
+ Downloaded image replaces the existing
+ image, if any, in the specified Firmware
+ Slot. The newly placed image is not
+ activated.
+
+``NVME_FW_COMMIT_CA_REPLACE_AND_ACTIVATE``
+ Downloaded image replaces the existing
+ image, if any, in the specified Firmware
+ Slot. The newly placed image is activated
+ at the next Controller Level Reset.
+
+``NVME_FW_COMMIT_CA_SET_ACTIVE``
+ The existing image in the specified
+ Firmware Slot is activated at the
+ next Controller Level Reset.
+
+``NVME_FW_COMMIT_CA_REPLACE_AND_ACTIVATE_IMMEDIATE``
+ Downloaded image replaces the existing
+ image, if any, in the specified Firmware
+ Slot and is then activated immediately.
+ If there is not a newly downloaded image,
+ then the existing image in the specified
+ firmware slot is activated immediately.
+
+``NVME_FW_COMMIT_CA_REPLACE_BOOT_PARTITION``
+ Downloaded image replaces the Boot
+ Partition specified by the Boot
+ Partition ID field.
+
+``NVME_FW_COMMIT_CA_ACTIVATE_BOOT_PARTITION``
+ Mark the Boot Partition specified in
+ the BPID field as active and update
+ BPINFO.ABPID.
+
+
+
+
+.. c:enum:: nvme_directive_dtype
+
+ Directive Types
+
+**Constants**
+
+``NVME_DIRECTIVE_DTYPE_IDENTIFY``
+ Identify directive type
+
+``NVME_DIRECTIVE_DTYPE_STREAMS``
+ Streams directive type
+
+
+
+
+.. c:enum:: nvme_directive_receive_doper
+
+ Directive Receive Directive Operation
+
+**Constants**
+
+``NVME_DIRECTIVE_RECEIVE_IDENTIFY_DOPER_PARAM``
+
+``NVME_DIRECTIVE_RECEIVE_STREAMS_DOPER_PARAM``
+
+``NVME_DIRECTIVE_RECEIVE_STREAMS_DOPER_STATUS``
+
+``NVME_DIRECTIVE_RECEIVE_STREAMS_DOPER_RESOURCE``
+
+
+
+
+.. c:enum:: nvme_directive_send_doper
+
+ Directive Send Directive Operation
+
+**Constants**
+
+``NVME_DIRECTIVE_SEND_IDENTIFY_DOPER_ENDIR``
+
+``NVME_DIRECTIVE_SEND_STREAMS_DOPER_RELEASE_IDENTIFIER``
+
+``NVME_DIRECTIVE_SEND_STREAMS_DOPER_RELEASE_RESOURCE``
+
+
+
+
+.. c:enum:: nvme_directive_send_identify_endir
+
+ Enable Directive
+
+**Constants**
+
+``NVME_DIRECTIVE_SEND_IDENTIFY_ENDIR_DISABLE``
+
+``NVME_DIRECTIVE_SEND_IDENTIFY_ENDIR_ENABLE``
+
+
+
+
+.. c:enum:: nvme_sanitize_sanact
+
+ Sanitize Action
+
+**Constants**
+
+``NVME_SANITIZE_SANACT_EXIT_FAILURE``
+ Exit Failure Mode.
+
+``NVME_SANITIZE_SANACT_START_BLOCK_ERASE``
+ Start a Block Erase sanitize operation.
+
+``NVME_SANITIZE_SANACT_START_OVERWRITE``
+ Start an Overwrite sanitize operation.
+
+``NVME_SANITIZE_SANACT_START_CRYPTO_ERASE``
+ Start a Crypto Erase sanitize operation.
+
+
+
+
+.. c:enum:: nvme_dst_stc
+
+ Action taken by the Device Self-test command
+
+**Constants**
+
+``NVME_DST_STC_SHORT``
+ Start a short device self-test operation
+
+``NVME_DST_STC_LONG``
+ Start an extended device self-test operation
+
+``NVME_DST_STC_VS``
+ Start a vendor specific device self-test operation
+
+``NVME_DST_STC_ABORT``
+ Abort device self-test operation
+
+
+
+
+.. c:enum:: nvme_virt_mgmt_act
+
+ Virtualization Management - Action
+
+**Constants**
+
+``NVME_VIRT_MGMT_ACT_PRIM_CTRL_FLEX_ALLOC``
+ Primary Controller Flexible
+ Allocation
+
+``NVME_VIRT_MGMT_ACT_OFFLINE_SEC_CTRL``
+ Secondary Controller Offline
+
+``NVME_VIRT_MGMT_ACT_ASSIGN_SEC_CTRL``
+ Secondary Controller Assign
+
+``NVME_VIRT_MGMT_ACT_ONLINE_SEC_CTRL``
+ Secondary Controller Online
+
+
+
+
+.. c:enum:: nvme_virt_mgmt_rt
+
+ Virtualization Management - Resource Type
+
+**Constants**
+
+``NVME_VIRT_MGMT_RT_VQ_RESOURCE``
+ VQ Resources
+
+``NVME_VIRT_MGMT_RT_VI_RESOURCE``
+ VI Resources
+
+
+
+
+.. c:enum:: nvme_ns_write_protect_cfg
+
+ Write Protection - Write Protection State
+
+**Constants**
+
+``NVME_NS_WP_CFG_NONE``
+ No Write Protect
+
+``NVME_NS_WP_CFG_PROTECT``
+ Write Protect
+
+``NVME_NS_WP_CFG_PROTECT_POWER_CYCLE``
+ Write Protect Until Power Cycle
+
+``NVME_NS_WP_CFG_PROTECT_PERMANENT``
+ Permanent Write Protect
+
+
+
+
+.. c:enum:: nvme_log_ana_lsp
+
+ Asymmetric Namespace Access - Return Groups Only
+
+**Constants**
+
+``NVME_LOG_ANA_LSP_RGO_NAMESPACES``
+
+``NVME_LOG_ANA_LSP_RGO_GROUPS_ONLY``
+
+
+
+
+.. c:enum:: nvme_pevent_log_action
+
+ Persistent Event Log - Action
+
+**Constants**
+
+``NVME_PEVENT_LOG_READ``
+ Read Log Data
+
+``NVME_PEVENT_LOG_EST_CTX_AND_READ``
+ Establish Context and Read Log Data
+
+``NVME_PEVENT_LOG_RELEASE_CTX``
+ Release Context
+
+
+
+
+.. c:enum:: nvme_feat_tmpthresh_thsel
+
+ Temperature Threshold - Threshold Type Select
+
+**Constants**
+
+``NVME_FEATURE_TEMPTHRESH_THSEL_OVER``
+ Over temperature threshold select
+
+``NVME_FEATURE_TEMPTHRESH_THSEL_UNDER``
+ Under temperature threshold select
+
+
+
+
+.. c:enum:: nvme_features_async_event_config_flags
+
+ Asynchronous Event Configuration configuration flags
+
+**Constants**
+
+``NVME_FEATURE_AENCFG_SMART_CRIT_SPARE``
+
+``NVME_FEATURE_AENCFG_SMART_CRIT_TEMPERATURE``
+
+``NVME_FEATURE_AENCFG_SMART_CRIT_DEGRADED``
+
+``NVME_FEATURE_AENCFG_SMART_CRIT_READ_ONLY``
+
+``NVME_FEATURE_AENCFG_SMART_CRIT_VOLATILE_BACKUP``
+
+``NVME_FEATURE_AENCFG_SMART_CRIT_READ_ONLY_PMR``
+
+``NVME_FEATURE_AENCFG_NOTICE_NAMESPACE_ATTRIBUTES``
+
+``NVME_FEATURE_AENCFG_NOTICE_FIRMWARE_ACTIVATION``
+
+``NVME_FEATURE_AENCFG_NOTICE_TELEMETRY_LOG``
+
+``NVME_FEATURE_AENCFG_NOTICE_ANA_CHANGE``
+
+``NVME_FEATURE_AENCFG_NOTICE_PL_EVENT``
+
+``NVME_FEATURE_AENCFG_NOTICE_LBA_STATUS``
+
+``NVME_FEATURE_AENCFG_NOTICE_EG_EVENT``
+
+``NVME_FEATURE_AENCFG_NOTICE_DISCOVERY_CHANGE``
+
+
+
+
+.. c:enum:: nvme_feat_plm_window_select
+
+ Predictable Latency Per NVM Set Log
+
+**Constants**
+
+``NVME_FEATURE_PLM_DTWIN``
+ Deterministic Window select
+
+``NVME_FEATURE_PLM_NDWIN``
+ Non-Deterministic Window select
+
+
+
+
+.. c:enum:: nvme_feat_resv_notify_flags
+
+ Reservation Notification Configuration
+
+**Constants**
+
+``NVME_FEAT_RESV_NOTIFY_REGPRE``
+ Mask Registration Preempted Notification
+
+``NVME_FEAT_RESV_NOTIFY_RESREL``
+ Mask Reservation Released Notification
+
+``NVME_FEAT_RESV_NOTIFY_RESPRE``
+ Mask Reservation Preempted Notification
+
+
+
+
+.. c:enum:: nvme_feat_nswpcfg_state
+
+ Write Protection - Write Protection State
+
+**Constants**
+
+``NVME_FEAT_NS_NO_WRITE_PROTECT``
+ No Write Protect
+
+``NVME_FEAT_NS_WRITE_PROTECT``
+ Write Protect
+
+``NVME_FEAT_NS_WRITE_PROTECT_PWR_CYCLE``
+ Write Protect Until Power Cycle
+
+``NVME_FEAT_NS_WRITE_PROTECT_PERMANENT``
+ Permanent Write Protect
+
+
+
+
+.. c:enum:: nvme_fctype
+
+ Fabrics Command Types
+
+**Constants**
+
+``nvme_fabrics_type_property_set``
+ Property set
+
+``nvme_fabrics_type_connect``
+ Connect
+
+``nvme_fabrics_type_property_get``
+ Property Get
+
+``nvme_fabrics_type_auth_send``
+ Authentication Send
+
+``nvme_fabrics_type_auth_receive``
+ Authentication Receive
+
+``nvme_fabrics_type_disconnect``
+ Disconnect
+
+
+
+
+.. c:enum:: nvme_data_tfr
+
+ Data transfer direction of the command
+
+**Constants**
+
+``NVME_DATA_TFR_NO_DATA_TFR``
+ No data transfer
+
+``NVME_DATA_TFR_HOST_TO_CTRL``
+ Host to controller
+
+``NVME_DATA_TFR_CTRL_TO_HOST``
+ Controller to host
+
+``NVME_DATA_TFR_BIDIRECTIONAL``
+ Bidirectional
+
+
+
+
+.. c:enum:: nvme_io_opcode
+
+ Opcodes for I/O Commands
+
+**Constants**
+
+``nvme_cmd_flush``
+ Flush
+
+``nvme_cmd_write``
+ Write
+
+``nvme_cmd_read``
+ Read
+
+``nvme_cmd_write_uncor``
+ Write Uncorrectable
+
+``nvme_cmd_compare``
+ Compare
+
+``nvme_cmd_write_zeroes``
+ write Zeros
+
+``nvme_cmd_dsm``
+ Dataset Management
+
+``nvme_cmd_verify``
+ Verify
+
+``nvme_cmd_resv_register``
+ Reservation Register
+
+``nvme_cmd_resv_report``
+ Reservation Report
+
+``nvme_cmd_resv_acquire``
+ Reservation Acquire
+
+``nvme_cmd_io_mgmt_recv``
+ I/O Management Receive
+
+``nvme_cmd_resv_release``
+ Reservation Release
+
+``nvme_cmd_copy``
+ Copy
+
+``nvme_cmd_io_mgmt_send``
+ I/O Management Send
+
+``nvme_zns_cmd_mgmt_send``
+ Zone Management Send
+
+``nvme_zns_cmd_mgmt_recv``
+ Zone Management Receive
+
+``nvme_zns_cmd_append``
+ Zone Append
+
+
+
+
+.. c:enum:: nvme_io_control_flags
+
+ I/O control flags
+
+**Constants**
+
+``NVME_IO_DTYPE_STREAMS``
+ Directive Type Streams
+
+``NVME_IO_STC``
+ Storage Tag Check
+
+``NVME_IO_DEAC``
+ Deallocate
+
+``NVME_IO_ZNS_APPEND_PIREMAP``
+ Protection Information Remap
+
+``NVME_IO_PRINFO_PRCHK_REF``
+ Protection Information Check Reference Tag
+
+``NVME_IO_PRINFO_PRCHK_APP``
+ Protection Information Check Application Tag
+
+``NVME_IO_PRINFO_PRCHK_GUARD``
+ Protection Information Check Guard field
+
+``NVME_IO_PRINFO_PRACT``
+ Protection Information Action
+
+``NVME_IO_FUA``
+ Force Unit Access
+
+``NVME_IO_LR``
+ Limited Retry
+
+
+
+
+.. c:enum:: nvme_io_dsm_flags
+
+ Dataset Management flags
+
+**Constants**
+
+``NVME_IO_DSM_FREQ_UNSPEC``
+ No frequency information provided
+
+``NVME_IO_DSM_FREQ_TYPICAL``
+ Typical number of reads and writes
+ expected for this LBA range
+
+``NVME_IO_DSM_FREQ_RARE``
+ Infrequent writes and infrequent
+ reads to the LBA range indicated
+
+``NVME_IO_DSM_FREQ_READS``
+ Infrequent writes and frequent
+ reads to the LBA range indicated
+
+``NVME_IO_DSM_FREQ_WRITES``
+ Frequent writes and infrequent
+ reads to the LBA range indicated
+
+``NVME_IO_DSM_FREQ_RW``
+ Frequent writes and frequent reads
+ to the LBA range indicated
+
+``NVME_IO_DSM_FREQ_ONCE``
+
+``NVME_IO_DSM_FREQ_PREFETCH``
+
+``NVME_IO_DSM_FREQ_TEMP``
+
+``NVME_IO_DSM_LATENCY_NONE``
+ No latency information provided
+
+``NVME_IO_DSM_LATENCY_IDLE``
+ Longer latency acceptable
+
+``NVME_IO_DSM_LATENCY_NORM``
+ Typical latency
+
+``NVME_IO_DSM_LATENCY_LOW``
+ Smallest possible latency
+
+``NVME_IO_DSM_SEQ_REQ``
+
+``NVME_IO_DSM_COMPRESSED``
+
+
+
+
+.. c:enum:: nvme_dsm_attributes
+
+ Dataset Management attributes
+
+**Constants**
+
+``NVME_DSMGMT_IDR``
+ Attribute -Integral Dataset for Read
+
+``NVME_DSMGMT_IDW``
+ Attribute - Integral Dataset for Write
+
+``NVME_DSMGMT_AD``
+ Attribute - Deallocate
+
+
+
+
+.. c:enum:: nvme_resv_rtype
+
+ Reservation Type Encoding
+
+**Constants**
+
+``NVME_RESERVATION_RTYPE_WE``
+ Write Exclusive Reservation
+
+``NVME_RESERVATION_RTYPE_EA``
+ Exclusive Access Reservation
+
+``NVME_RESERVATION_RTYPE_WERO``
+ Write Exclusive - Registrants Only Reservation
+
+``NVME_RESERVATION_RTYPE_EARO``
+ Exclusive Access - Registrants Only Reservation
+
+``NVME_RESERVATION_RTYPE_WEAR``
+ Write Exclusive - All Registrants Reservation
+
+``NVME_RESERVATION_RTYPE_EAAR``
+ Exclusive Access - All Registrants Reservation
+
+
+
+
+.. c:enum:: nvme_resv_racqa
+
+ Reservation Acquire - Reservation Acquire Action
+
+**Constants**
+
+``NVME_RESERVATION_RACQA_ACQUIRE``
+ Acquire
+
+``NVME_RESERVATION_RACQA_PREEMPT``
+ Preempt
+
+``NVME_RESERVATION_RACQA_PREEMPT_AND_ABORT``
+ Preempt and Abort
+
+
+
+
+.. c:enum:: nvme_resv_rrega
+
+ Reservation Register - Reservation Register Action
+
+**Constants**
+
+``NVME_RESERVATION_RREGA_REGISTER_KEY``
+ Register Reservation Key
+
+``NVME_RESERVATION_RREGA_UNREGISTER_KEY``
+ Unregister Reservation Key
+
+``NVME_RESERVATION_RREGA_REPLACE_KEY``
+ Replace Reservation Key
+
+
+
+
+.. c:enum:: nvme_resv_cptpl
+
+ Reservation Register - Change Persist Through Power Loss State
+
+**Constants**
+
+``NVME_RESERVATION_CPTPL_NO_CHANGE``
+ No change to PTPL state
+
+``NVME_RESERVATION_CPTPL_CLEAR``
+ Reservations are released and
+ registrants are cleared on a power on
+
+``NVME_RESERVATION_CPTPL_PERSIST``
+ Reservations and registrants persist
+ across a power loss
+
+
+
+
+.. c:enum:: nvme_resv_rrela
+
+ Reservation Release - Reservation Release Action
+
+**Constants**
+
+``NVME_RESERVATION_RRELA_RELEASE``
+ Release
+
+``NVME_RESERVATION_RRELA_CLEAR``
+ Clear
+
+
+
+
+.. c:enum:: nvme_zns_send_action
+
+ Zone Management Send - Zone Send Action
+
+**Constants**
+
+``NVME_ZNS_ZSA_CLOSE``
+ Close Zone
+
+``NVME_ZNS_ZSA_FINISH``
+ Finish Zone
+
+``NVME_ZNS_ZSA_OPEN``
+ Open Zone
+
+``NVME_ZNS_ZSA_RESET``
+ Reset Zone
+
+``NVME_ZNS_ZSA_OFFLINE``
+ Offline Zone
+
+``NVME_ZNS_ZSA_SET_DESC_EXT``
+ Set Zone Descriptor Extension
+
+``NVME_ZNS_ZSA_ZRWA_FLUSH``
+ Flush
+
+
+
+
+.. c:enum:: nvme_zns_recv_action
+
+ Zone Management Receive - Zone Receive Action Specific Features
+
+**Constants**
+
+``NVME_ZNS_ZRA_REPORT_ZONES``
+ Report Zones
+
+``NVME_ZNS_ZRA_EXTENDED_REPORT_ZONES``
+ Extended Report Zones
+
+
+
+
+.. c:enum:: nvme_zns_report_options
+
+ Zone Management Receive - Zone Receive Action Specific Field
+
+**Constants**
+
+``NVME_ZNS_ZRAS_REPORT_ALL``
+ List all zones
+
+``NVME_ZNS_ZRAS_REPORT_EMPTY``
+ List the zones in the ZSE:Empty state
+
+``NVME_ZNS_ZRAS_REPORT_IMPL_OPENED``
+ List the zones in the ZSIO:Implicitly Opened state
+
+``NVME_ZNS_ZRAS_REPORT_EXPL_OPENED``
+ List the zones in the ZSEO:Explicitly Opened state
+
+``NVME_ZNS_ZRAS_REPORT_CLOSED``
+ List the zones in the ZSC:Closed state
+
+``NVME_ZNS_ZRAS_REPORT_FULL``
+ List the zones in the ZSF:Full state
+
+``NVME_ZNS_ZRAS_REPORT_READ_ONLY``
+ List the zones in the ZSRO:Read Only state
+
+``NVME_ZNS_ZRAS_REPORT_OFFLINE``
+ List the zones in the ZSO:Offline state
+
+
+
+
+.. c:enum:: nvme_io_mgmt_recv_mo
+
+ I/O Management Receive - Management Operation
+
+**Constants**
+
+``NVME_IO_MGMT_RECV_RUH_STATUS``
+ Reclaim Unit Handle Status
+
+
+
+
+.. c:enum:: nvme_io_mgmt_send_mo
+
+ I/O Management Send - Management Operation
+
+**Constants**
+
+``NVME_IO_MGMT_SEND_RUH_UPDATE``
+ Reclaim Unit Handle Update
+
+
diff --git a/doc/rst/util.rst b/doc/rst/util.rst
new file mode 100644
index 0000000..4b85492
--- /dev/null
+++ b/doc/rst/util.rst
@@ -0,0 +1,577 @@
+.. _util.h:
+
+**util.h**
+
+
+libnvme utility functions
+
+
+
+.. c:enum:: nvme_connect_err
+
+ nvme connect error codes
+
+**Constants**
+
+``ENVME_CONNECT_RESOLVE``
+ failed to resolve host
+
+``ENVME_CONNECT_ADDRFAM``
+ unrecognized address family
+
+``ENVME_CONNECT_TRADDR``
+ failed to get traddr
+
+``ENVME_CONNECT_TARG``
+ need a transport (-t) argument
+
+``ENVME_CONNECT_AARG``
+ need a address (-a) argument
+
+``ENVME_CONNECT_OPEN``
+ failed to open nvme-fabrics device
+
+``ENVME_CONNECT_WRITE``
+ failed to write to nvme-fabrics device
+
+``ENVME_CONNECT_READ``
+ failed to read from nvme-fabrics device
+
+``ENVME_CONNECT_PARSE``
+ failed to parse ctrl info
+
+``ENVME_CONNECT_INVAL_TR``
+ invalid transport type
+
+``ENVME_CONNECT_LOOKUP_SUBSYS_NAME``
+ failed to lookup subsystem name
+
+``ENVME_CONNECT_LOOKUP_SUBSYS``
+ failed to lookup subsystem
+
+``ENVME_CONNECT_ALREADY``
+ the connect attempt failed, already connected
+
+``ENVME_CONNECT_INVAL``
+ invalid arguments/configuration
+
+``ENVME_CONNECT_ADDRINUSE``
+ hostnqn already in use
+
+``ENVME_CONNECT_NODEV``
+ invalid interface
+
+``ENVME_CONNECT_OPNOTSUPP``
+ not supported
+
+``ENVME_CONNECT_CONNREFUSED``
+ connection refused
+
+
+.. c:function:: __u8 nvme_status_to_errno (int status, bool fabrics)
+
+ Converts nvme return status to errno
+
+**Parameters**
+
+``int status``
+ Return status from an nvme passthrough command
+
+``bool fabrics``
+ Set to true if :c:type:`status` is to a fabrics target.
+
+**Return**
+
+An errno representing the nvme status if it is an nvme status field,
+or unchanged status is < 0 since errno is already set.
+
+
+.. c:function:: const char * nvme_status_to_string (int status, bool fabrics)
+
+ Returns string describing nvme return status.
+
+**Parameters**
+
+``int status``
+ Return status from an nvme passthrough command
+
+``bool fabrics``
+ Set to true if :c:type:`status` is to a fabrics target.
+
+**Return**
+
+String representation of the nvme status if it is an nvme status field,
+or a standard errno string if status is < 0.
+
+
+.. c:function:: const char * nvme_errno_to_string (int err)
+
+ Returns string describing nvme connect failures
+
+**Parameters**
+
+``int err``
+ Returned error code from nvme_add_ctrl()
+
+**Return**
+
+String representation of the nvme connect error codes
+
+
+.. c:function:: void nvme_init_ctrl_list (struct nvme_ctrl_list *cntlist, __u16 num_ctrls, __u16 *ctrlist)
+
+ Initialize an nvme_ctrl_list structure from an array.
+
+**Parameters**
+
+``struct nvme_ctrl_list *cntlist``
+ The controller list structure to initialize
+
+``__u16 num_ctrls``
+ The number of controllers in the array, :c:type:`ctrlist`.
+
+``__u16 *ctrlist``
+ An array of controller identifiers in CPU native endian.
+
+**Description**
+
+This is intended to be used with any command that takes a controller list
+argument. See nvme_ns_attach_ctrls() and nvme_ns_detach().
+
+
+.. c:function:: void nvme_init_dsm_range (struct nvme_dsm_range *dsm, __u32 *ctx_attrs, __u32 *llbas, __u64 *slbas, __u16 nr_ranges)
+
+ Constructs a data set range structure
+
+**Parameters**
+
+``struct nvme_dsm_range *dsm``
+ DSM range array
+
+``__u32 *ctx_attrs``
+ Array of context attributes
+
+``__u32 *llbas``
+ Array of length in logical blocks
+
+``__u64 *slbas``
+ Array of starting logical blocks
+
+``__u16 nr_ranges``
+ The size of the dsm arrays
+
+**Description**
+
+Each array must be the same size of size 'nr_ranges'. This is intended to be
+used with constructing a payload for nvme_dsm().
+
+**Return**
+
+The nvme command status if a response was received or -errno
+otherwise.
+
+
+.. c:function:: void nvme_init_copy_range (struct nvme_copy_range *copy, __u16 *nlbs, __u64 *slbas, __u32 *eilbrts, __u32 *elbatms, __u32 *elbats, __u16 nr)
+
+ Constructs a copy range structure
+
+**Parameters**
+
+``struct nvme_copy_range *copy``
+ Copy range array
+
+``__u16 *nlbs``
+ Number of logical blocks
+
+``__u64 *slbas``
+ Starting LBA
+
+``__u32 *eilbrts``
+ Expected initial logical block reference tag
+
+``__u32 *elbatms``
+ Expected logical block application tag mask
+
+``__u32 *elbats``
+ Expected logical block application tag
+
+``__u16 nr``
+ Number of descriptors to construct
+
+
+.. c:function:: void nvme_init_copy_range_f1 (struct nvme_copy_range_f1 *copy, __u16 *nlbs, __u64 *slbas, __u64 *eilbrts, __u32 *elbatms, __u32 *elbats, __u16 nr)
+
+ Constructs a copy range f1 structure
+
+**Parameters**
+
+``struct nvme_copy_range_f1 *copy``
+ Copy range array
+
+``__u16 *nlbs``
+ Number of logical blocks
+
+``__u64 *slbas``
+ Starting LBA
+
+``__u64 *eilbrts``
+ Expected initial logical block reference tag
+
+``__u32 *elbatms``
+ Expected logical block application tag mask
+
+``__u32 *elbats``
+ Expected logical block application tag
+
+``__u16 nr``
+ Number of descriptors to construct
+
+
+.. c:function:: int nvme_get_feature_length (int fid, __u32 cdw11, __u32 *len)
+
+ Retreive the command payload length for a specific feature identifier
+
+**Parameters**
+
+``int fid``
+ Feature identifier, see :c:type:`enum nvme_features_id <nvme_features_id>`.
+
+``__u32 cdw11``
+ The cdw11 value may affect the transfer (only known fid is
+ ``NVME_FEAT_FID_HOST_ID``)
+
+``__u32 *len``
+ On success, set to this features payload length in bytes.
+
+**Return**
+
+0 on success, -1 with errno set to EINVAL if the function did not
+recognize :c:type:`fid`.
+
+
+.. c:function:: int nvme_get_feature_length2 (int fid, __u32 cdw11, enum nvme_data_tfr dir, __u32 *len)
+
+ Retreive the command payload length for a specific feature identifier
+
+**Parameters**
+
+``int fid``
+ Feature identifier, see :c:type:`enum nvme_features_id <nvme_features_id>`.
+
+``__u32 cdw11``
+ The cdw11 value may affect the transfer (only known fid is
+ ``NVME_FEAT_FID_HOST_ID``)
+
+``enum nvme_data_tfr dir``
+ Data transfer direction: false - host to controller, true -
+ controller to host may affect the transfer (only known fid is
+ ``NVME_FEAT_FID_HOST_MEM_BUF``).
+
+``__u32 *len``
+ On success, set to this features payload length in bytes.
+
+**Return**
+
+0 on success, -1 with errno set to EINVAL if the function did not
+recognize :c:type:`fid`.
+
+
+.. c:function:: int nvme_get_directive_receive_length (enum nvme_directive_dtype dtype, enum nvme_directive_receive_doper doper, __u32 *len)
+
+ Get directive receive length
+
+**Parameters**
+
+``enum nvme_directive_dtype dtype``
+ Directive type, see :c:type:`enum nvme_directive_dtype <nvme_directive_dtype>`
+
+``enum nvme_directive_receive_doper doper``
+ Directive receive operation, see :c:type:`enum nvme_directive_receive_doper <nvme_directive_receive_doper>`
+
+``__u32 *len``
+ On success, set to this directives payload length in bytes.
+
+**Return**
+
+0 on success, -1 with errno set to EINVAL if the function did not
+recognize :c:type:`dtype` or :c:type:`doper`.
+
+
+.. c:function:: size_t get_entity_name (char *buffer, size_t bufsz)
+
+ Get Entity Name (ENAME).
+
+**Parameters**
+
+``char *buffer``
+ The buffer where the ENAME will be saved as an ASCII string.
+
+``size_t bufsz``
+ The size of **buffer**.
+
+**Description**
+
+Per TP8010, ENAME is defined as the name associated with the host (i.e.
+hostname).
+
+**Return**
+
+Number of characters copied to **buffer**.
+
+
+.. c:function:: size_t get_entity_version (char *buffer, size_t bufsz)
+
+ Get Entity Version (EVER).
+
+**Parameters**
+
+``char *buffer``
+ The buffer where the EVER will be saved as an ASCII string.
+
+``size_t bufsz``
+ The size of **buffer**.
+
+**Description**
+
+EVER is defined as the operating system name and version as an ASCII
+string. This function reads different files from the file system and
+builds a string as follows: [os type] [os release] [distro release]
+
+ E.g. "Linux 5.17.0-rc1 SLES 15.4"
+
+**Return**
+
+Number of characters copied to **buffer**.
+
+
+.. c:function:: char * kv_strip (char *kv)
+
+ Strip blanks from key value string
+
+**Parameters**
+
+``char *kv``
+ The key-value string to strip
+
+**Description**
+
+Strip leading/trailing blanks as well as trailing comments from the
+Key=Value string pointed to by **kv**.
+
+**Return**
+
+A pointer to the stripped string. Note that the original string,
+**kv**, gets modified.
+
+
+.. c:function:: char * kv_keymatch (const char *kv, const char *key)
+
+ Look for key in key value string
+
+**Parameters**
+
+``const char *kv``
+ The key=value string to search for the presence of **key**
+
+``const char *key``
+ The key to look for
+
+**Description**
+
+Look for **key** in the Key=Value pair pointed to by **k** and return a
+pointer to the Value if **key** is found.
+
+Check if **kv** starts with **key**. If it does then make sure that we
+have a whole-word match on the **key**, and if we do, return a pointer
+to the first character of value (i.e. skip leading spaces, tabs,
+and equal sign)
+
+**Return**
+
+A pointer to the first character of "value" if a match is found.
+NULL otherwise.
+
+
+.. c:function:: char * startswith (const char *s, const char *prefix)
+
+ Checks that a string starts with a given prefix.
+
+**Parameters**
+
+``const char *s``
+ The string to check
+
+``const char *prefix``
+ A string that **s** could be starting with
+
+**Return**
+
+If **s** starts with **prefix**, then return a pointer within **s** at
+the first character after the matched **prefix**. NULL otherwise.
+
+
+.. c:macro:: round_up
+
+``round_up (val, mult)``
+
+ Round a value **val** to the next multiple specified by **mult**.
+
+**Parameters**
+
+``val``
+ Value to round
+
+``mult``
+ Multiple to round to.
+
+**Description**
+
+usage: int x = round_up(13, sizeof(__u32)); // 13 -> 16
+
+
+.. c:function:: __u16 nvmf_exat_len (size_t val_len)
+
+ Return length rounded up by 4
+
+**Parameters**
+
+``size_t val_len``
+ Value length
+
+**Description**
+
+Return the size in bytes, rounded to a multiple of 4 (e.g., size of
+__u32), of the buffer needed to hold the exat value of size
+**val_len**.
+
+**Return**
+
+Length rounded up by 4
+
+
+.. c:function:: __u16 nvmf_exat_size (size_t val_len)
+
+ Return min aligned size to hold value
+
+**Parameters**
+
+``size_t val_len``
+ This is the length of the data to be copied to the "exatval"
+ field of a "struct nvmf_ext_attr".
+
+**Description**
+
+Return the size of the "struct nvmf_ext_attr" needed to hold
+a value of size **val_len**.
+
+**Return**
+
+The size in bytes, rounded to a multiple of 4 (i.e. size of
+__u32), of the "struct nvmf_ext_attr" required to hold a string of
+length **val_len**.
+
+
+.. c:function:: struct nvmf_ext_attr * nvmf_exat_ptr_next (struct nvmf_ext_attr *p)
+
+ Increment **p** to the next element in the array.
+
+**Parameters**
+
+``struct nvmf_ext_attr *p``
+ Pointer to an element of an array of "struct nvmf_ext_attr".
+
+**Description**
+
+Extended attributes are saved to an array of "struct nvmf_ext_attr"
+where each element of the array is of variable size. In order to
+move to the next element in the array one must increment the
+pointer to the current element (**p**) by the size of the current
+element.
+
+**Return**
+
+Pointer to the next element in the array.
+
+
+
+
+.. c:enum:: nvme_version
+
+ Selector for version to be returned by **nvme_get_version**
+
+**Constants**
+
+``NVME_VERSION_PROJECT``
+ Project release version
+
+``NVME_VERSION_GIT``
+ Git reference
+
+
+.. c:function:: const char * nvme_get_version (enum nvme_version type)
+
+ Return version libnvme string
+
+**Parameters**
+
+``enum nvme_version type``
+ Selects which version type (see **struct** nvme_version)
+
+**Return**
+
+Returns version string for known types or else "n/a"
+
+
+.. c:function:: int nvme_uuid_to_string (unsigned char uuid[NVME_UUID_LEN], char *str)
+
+ Return string represenation of encoded UUID
+
+**Parameters**
+
+``unsigned char uuid[NVME_UUID_LEN]``
+ Binary encoded input UUID
+
+``char *str``
+ Output string represenation of UUID
+
+**Return**
+
+Returns error code if type conversion fails.
+
+
+.. c:function:: int nvme_uuid_from_string (const char *str, unsigned char uuid[NVME_UUID_LEN])
+
+ Return encoded UUID represenation of string UUID
+
+**Parameters**
+
+``const char *str``
+ Output string represenation of UUID
+
+``unsigned char uuid[NVME_UUID_LEN]``
+ Binary encoded input UUID
+
+**Return**
+
+Returns error code if type conversion fails.
+
+
+.. c:function:: int nvme_uuid_random (unsigned char uuid[NVME_UUID_LEN])
+
+ Generate random UUID
+
+**Parameters**
+
+``unsigned char uuid[NVME_UUID_LEN]``
+ Generated random UUID
+
+**Description**
+
+Generate random number according
+https://www.rfc-editor.org/rfc/rfc4122#section-4.4
+
+**Return**
+
+Returns error code if generating of random number fails.
+
+
diff --git a/doc/update-docs.sh b/doc/update-docs.sh
new file mode 100755
index 0000000..dfa1fd8
--- /dev/null
+++ b/doc/update-docs.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+DESTDIR=$(pwd)
+
+# build man docs
+BUILDDIR="$(mktemp -d)"
+echo $BUILDDIR
+trap 'rm -rf -- $BUILDDIR' EXIT
+
+meson $BUILDDIR -Ddocs=man -Ddocs-build=true
+ninja -C $BUILDDIR
+
+rm -rf $DESTDIR/doc/man
+mkdir $DESTDIR/doc/man
+
+find $BUILDDIR/doc -maxdepth 1 -name '*.2' -exec cp {} $DESTDIR/doc/man \;
+
+# build ReST docs
+rm -rf -- $BUILDDIR
+BUILDDIR="$(mktemp -d)"
+echo $BUILDDIR
+trap 'rm -rf -- $BUILDDIR' EXIT
+
+meson $BUILDDIR -Ddocs=rst -Ddocs-build=true
+ninja -C $BUILDDIR
+
+rm -rf $DESTDIR/doc/rst/*.rst
+mkdir -p $DESTDIR/doc/rst
+
+find $BUILDDIR/doc/rst -maxdepth 1 -name '*.rst' -exec cp {} $DESTDIR/doc/rst \;
+
+cp $BUILDDIR/doc/conf.py $DESTDIR/doc
+cp $BUILDDIR/doc/index.rst $DESTDIR/doc
+cp $BUILDDIR/doc/config-schema.json $DESTDIR/doc
+
+# build html docs
+# The HTML doc is not ready yet
+# rm -rf $DESTDIR/doc/html
+# cp -R $BUILDDIR/doc/html $DESTDIR/doc/
+