#compdef _nvme nvme

# zsh completions for the nvme command-line interface,
# very loosely based on git and adb command completion
# Kelly Kaoudis kelly.n.kaoudis at intel.com, June 2015

_nvme () {
	local -a _cmds
	_cmds=(
	'id-ctrl:display information about the controller'
	'id-ns:display information about the namespace'
	'list-ns:identify all namespace(s) attached'
	'id-iocs:display information about I/O command sets'
	'create-ns:create a new namespace before attachment'
	'delete-ns:delete a detached namespace'
	'attach-ns:attach namespace to controller'
	'detach-ns:detach namespace from controller'
	'list-ctrl:identify all controller(s) attached'
	'nvm-id-ctrl:display information about the nvm command set'
	'get-ns-id:get namespace id of opened block device'
	'get-log:retrieve any log in raw format'
	'predictable-lat-log:retrieve predictable latency per nvmset log'
	'pred-lat-event-agg-log:retrieve predictable latency event aggregate log'
	'persistent-event-log:retrieve presistent event log'
	'fw-log:retrieve fw log'
	'smart-log:retrieve SMART log'
	'smart-log-add:retrieve additional SMART log'
	'error-log:retrieve error log'
	'endurance-event-agg-log:retrieve endurance group event aggregate log'
	'lba-status-log:retrieve lba status log'
	'resv-notif-log: retrieve reservation notification log'
	'get-feature:display a controller feature'
	'set-feature:set a controller feature and show results'
	'format:apply new block format to namespace'
	'fw-activate:activate a firmware on the device'
	'fw-download:download a firmware to the device'
	'admin-passthru:submit a passthrough IOCTL'
	'io-passthru:submit a passthrough IOCTL'
	'security-send:send security/secure data to controller'
	'security-recv:ask for security/secure data from controller'
	'resv-acquire:acquire reservation on a namespace'
	'resv-register:register reservation on a namespace'
	'resv-release:release reservation on a namespace'
	'resv-report:report reservation on a namespace'
	'copy:submit a simple copy command'
	'flush:submit a flush'
	'compare:compare data on device to data elsewhere'
	'read:submit a read command'
	'write:submit a write command'
	'show-regs:shows the controller registers; requires admin character device'
	'help:print brief descriptions of all nvme commands'
	)

	local expl

	_arguments '*:: :->subcmds' && return 0

	if (( CURRENT == 1 )); then
		_describe -t commands "nvme subcommands" _cmds
		return
	else
		case ${words[CURRENT-1]} in
		(id-ctrl)
			local _idctrl
			_idctrl=(
			/dev/nvme':supply a device to use (required)'
			--raw-binary':dump infos in binary format'
			-b':alias of --raw-binary'
			--human-readable':show infos in readable format'
			-H':alias of --human-readable'
			--vendor-specific':also dump binary vendor infos'
			-v':alias of --vendor-specific'
			)

			_arguments '*:: :->subcmds'
			_describe -t commands "nvme id-ctrl options" _idctrl
			;;
		(id-ns)
			local _idns
			_idns=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':show infos for namespace <nsid>'
			-n':alias of --namespace-id'
			--raw-binary':dump infos in binary format'
			-b':alias of --raw-binary'
			--human-readable':show infos in readable format'
			-H':alias of --human-readable'
			--vendor-specific':also dump binary vendor infos'
			-v':alias of --vendor-specific'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme id-ns options" _idns
			;;
		(list-ns)
			local _listns
			_listns=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':start namespace infos listing with this nsid'
			-n':alias of --namespace-id'
			--csi=':command set identifier'
			-y':alias of --csi'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme list-ns options" _listns
			;;
		(id-iocs)
			local _idiocs
			_idiocs=(
			/dev/nvme':supply a device to use (required)'
			--controller-id=':show infos for controller <cntid>'
			-c':alias of --controller-id'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme id-iocs options" _idiocs
			;;
		nvm-id-ctrl)
			local _nvmidctrl
			_nvmidctrl=(
			/dev/nvme':supply a device to use (required)'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme nvm-id-ctrl options" _nvmidctrl
			;;
		(create-ns)
			local _createns
			_createns=(
			/dev/nvme':supply a device to use (required)'
			--nsze=':namespace size to create'
			-s':alias of --nsze'
			--ncap=':namespace capacity'
			-c':alias of --ncap'
			--flbas=':FLBA size'
			-f':alias of --flbas'
			--dps=':data protection?'
			-d':alias of --dps'
			--nmic=':multipath and sharing'
			-n':alias of --nmic'
			--csi=':command set identifier'
			-y':alias of --csi'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme create-ns options" _createns
			;;
		(delete-ns)
			local _deletens
			_deletens=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':namespace to delete'
			-n':alias of --namespace-id'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme delete-ns options" _deletens
			;;
		(attach-ns)
			local _attachns
			_attachns=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':namespace to attach to the controller'
			-n':alias of --namespace-id'
			--controllers=':if a device is not provided, supply a comma-sep list of controllers'
			-c':alias of --controllers'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme attach-ns options" _attachns
			;;
		(detach-ns)
			local _detachns
			_detachns=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':namespace to detach from controller'
			-n':alias of --namespace-id'
			--controllers=':if a device is not provided, supply a comma-sep list of controllers'
			-c':alias of --controllers'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme detach-ns options" _detachns
			;;
		(list-ctrl)
			local _listctrl
			_listctrl=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':show controllers attached to this namespace'
			-n':alias of --namespace-id'
			--cntid=':start the list with this controller'
			-c':alias of --cntid'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme list-ctrl options" _listctrl
			;;
		(get-ns-id)
			local _getnsid
			_getnsid=(
			/dev/nvme':supply a device to use (required)'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme get-ns-id options" _getnsid
			;;
		(get-log)
			local _getlog
			_getlog=(
			/dev/nvme':supply a device to use (required)'
			--log-id=':requested log number'
			-i':alias of --log-id'
			--log-len=':number of bytes to show for requested log'
			-l':alias of --log-len'
			--namespace-id=':get log specific to <nsid> if namespace logs are supported'
			-n':alias of --namespace-id'
			--raw-binary':dump infos in binary format'
			-b':alias of --raw-binary'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme get-log options" _getlog
			;;
		(persistent-event-log)
			local _persistenteventlog
			_persistenteventlog=(
			/dev/nvme':supply a device to use (required)'
			--action=': action the controller shall take for this log page'
			-a':alias to --action'
			--log-len=':number of bytes to show for requested log'
			-l':alias of --log-len'
			--raw-binary':dump infos in binary format'
			-b':alias of --raw-binary'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "persistent-event-log options" _persistenteventlog
			;;
		(pred-lat-event-agg-log)
			local _predlateventagglog
			_predlateventagglog=(
			/dev/nvme':supply a device to use (required)'
			--log-entries=': Number of pending NVM Set Entries log list'
			-e':alias to --log-entries'
			--rae': Retain an Asynchronous Event'
			-r':alias to --rae
			--raw-binary':dump infos in binary format'
			-b':alias of --raw-binary'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme pred-lat-event-agg-log options" _predlateventagglog
			;;
		(predictablelatlog)
			local _predictablelatlog
			_predictablelatlog=(
			/dev/nvme':supply a device to use (required)'
			--nvmset-id=': NVM Set Identifier on which log page retrieve info'
			-i':alias to --nvmset-id'
			--raw-binary':dump infos in binary format'
			-b':alias of --raw-binary'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme predictable-lat-log options" _predictablelatlog
			;;
		(fw-log)
			local _fwlog
			_fwlog=(
			/dev/nvme':supply a device to use (required)'
			--raw-binary':dump infos in binary format'
			-b':alias of --raw-binary'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme fw-log options" _fwlog
			;;
		(smart-log)
			local _smartlog
			_smartlog=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':get SMART log specific to <nsid> if namespace logs are supported'
			-n':alias to --namespace-id'
			--raw-binary':dump infos in binary format'
			-b':alias to --raw-binary'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme smart-log options" _smartlog
			;;
		(smart-log-add)
			local _add
			_add=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':get additional SMART log specific to <nsid> if namespace logs supported'
			-n':alias to --namespace-id'
			--raw-binary':dump infos in binary format'
			-b':alias to --raw-binary'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme smart-log-add options" _add
			;;
		(error-log)
			local _errlog
			_errlog=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':get log specific to <nsid> if namespace logs are supported'
			-n':alias to --namespace-id'
			--raw-binary':dump infos in binary format'
			-b':alias to --raw-binary'
			--log-entries=':request n >= 1 log entries'
			-e':alias to --log-entries'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme error-log options" _errlog
			;;
		(endurance-event-agg-log)
			local _enduranceeventagglog
			_enduranceeventagglog=(
			/dev/nvme':supply a device to use (required)'
			--log-entries=': Number of Endurance Group Event Agg Entries log list'
			-e':alias to --log-entries'
			--rae': Retain an Asynchronous Event'
			-r':alias to --rae
			--raw-binary':dump infos in binary format'
			-b':alias of --raw-binary'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme endurance-event-agg-log options" _enduranceeventagglog
			;;
		(lba-status-log)
			local _lbastatuslog
			_lbastatuslog=(
			/dev/nvme':supply a device to use (required)'
			--rae': Retain an Asynchronous Event'
			-r':alias to --rae
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme lba-status-log options" _lbastatuslog
			;;
		(resv-notif-log)
			local _resvnotiflog
			_resvnotiflog=(
			/dev/nvme':supply a device to use (required)'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme resv-notif-log options" _resvnotiflog
			;;
		(get-feature)
			local _getf
			_getf=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':get feature specific to <nsid>'
			-n':alias to --namespace-id'
			--feature-id=':hexadecimal name of feature to examine (required)'
			-f':alias to --feature-id'
			--sel=':select from 0 - current, 1 - default, 2 - saved, 3 - supported'
			-s':alias to --sel'
			--data-len=':buffer len for returned LBA Type Range or host identifier data'
			-l':alias for --data-len'
			--cdw11=':dword 11 value, used for interrupt vector configuration only'
			--raw-binary':dump infos in binary format'
			-b':alias to --raw-binary'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme get-feature options" _getf
			;;
		(set-feature)
			local _setf
			_setf=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':feature is specific to <nsid>'
			-n':alias to --namespace-id'
			--feature-id=':hexadecimal name of feature to set (required)'
			-f':alias to --feature-id'
			--data-len=':buffer length, only used for LBA Type Range or host identifier data'
			-l':alias for --data-len'
			--data=':data file for LBA Type Range or host identifier buffer (defaults to stdin)'
			-d':alias to --data'
			--value=':new value of feature (required)'
			-v'alias to --value'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme set-feature options" _setf
			;;
		(format)
			local _format
			_format=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':<nsid> of namespace to format (required)'
			-n':alias of --namespace-id'
			--lbaf=':LBA format to apply to namespace (required)'
			-l':alias of --lbaf'
			--ses=':secure erase? 0 - no-op (default), 1 - user-data erase, 2 - cryptographic erase'
			-s':alias of --ses'
			--pil=':location of protection information? 0 - end, 1 - start'
			-p':alias of --pil'
			--pi=':protection information? 0 - off, 1 - Type 1 on, 2 - Type 2 on, 3 - Type 3 on'
			-i':alias of --pi'
			--ms=':extended format? 0 - off (metadata in separate buffer), 1 - on (extended LBA used)'
			-m':alias of --ms'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme format options" _format
			;;
		(fw-activate)
			local _fwact
			_fwact=(
			/dev/nvme':supply a device to use (required)'
			--action=':activation action (required)? 0 - replace fw without activating, 1 - replace with activation, 2 - replace with activation at next reset'
			-a':alias of --action'
			--slot=':firmware slot to activate'
			-s':alias of --slot'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme fw-activate options" _fwact
			;;
		(fw-download)
			local _fwd
			_fwd=(
			/dev/nvme':supply a device to use (required)'
			--fw=':firmware file to download (required)'
			-f':alias of --fw'
			--xfer=':limit on chunk-size of transfer (if device has download size limit)'
			-x':alias of --xfer'
			--offset=':starting offset, in dwords (defaults to 0, only useful if download is split across multiple files)'
			-o':alias of --offset'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme fw-download options" _fwd
			;;
		(admin-passthru)
			local _admin
			_admin=(
			/dev/nvme':supply a device to use (required)'
			--opcode=':hexadecimal opcode to send (required)'
			-o':alias of --opcode'
			--flags=':command flags'
			-f':alias of --flags'
			--rsvd=':value for reserved field'
			-R':alias of --rsvd'
			--namespace-id=':value for nsid'
			-n':alias of --namespace-id'
			--data-len=':length for data buffer'
			-l':alias of --data-len'
			--metadata-len=':length for metadata buffer'
			-m':alias of --metadata-len'
			--timeout=':value for timeout'
			-t':alias of --timeout'
			--cdw2=':value for command dword 2'
			-2':alias for --cdw2'
			--cdw3=':value for command dword 3'
			-3':alias for --cdw3'
			--cdw10=':value for command dword 10'
			-4':alias for --cdw10'
			--cdw11=':value for command dword 11'
			-5':alias for --cdw11'
			--cdw12=':value for command dword 12'
			-6':alias for --cdw12'
			--cdw13=':value for command dword 13'
			-7':alias for --cdw13'
			--cdw14=':value for command dword 14'
			-8':alias for command dword 14'
			--cdw15=':value for command dword 15'
			-9':alias for command dword 15'
			--input-file=':defaults to stdin; input for write (send direction)'
			-i':alias for --input-file'
			--raw-binary':dump output in binary format'
			-b':alias for --raw-binary'
			--show-command':simply print command instead of sending it to <device>'
			-s':alias for --show-command'
			--dry-run':alias for --show-command'
			-d':alias for --show-command'
			--read':set dataflow direction to receive'
			-r':alias for --read'
			--write':set dataflow direction to send'
			-w':alias for --write'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme admin-passthru options" _admin
			;;
		(io-passthru)
			local _io
			_io=(
			/dev/nvme':supply a device to use (required)'
			--opcode=':hexadecimal opcode to send (required)'
			-o':alias of --opcode'
			--flags=':command flags'
			-f':alias of --flags'
			--rsvd=':value for reserved field'
			-R':alias of --rsvd'
			--namespace-id=':value for nsid'
			-n':alias of --namespace-id'
			--data-len=':length for data buffer'
			-l':alias of --data-len'
			--metadata-len=':length for metadata buffer'
			-m':alias of --metadata-len'
			--timeout=':value for timeout'
			-t':alias of --timeout'
			--cdw2=':value for command dword 2'
			-2':alias for --cdw2'
			--cdw3=':value for command dword 3'
			-3':alias for --cdw3'
			--cdw10=':value for command dword 10'
			-4':alias for --cdw10'
			--cdw11=':value for command dword 11'
			-5':alias for --cdw11'
			--cdw12=':value for command dword 12'
			-6':alias for --cdw12'
			--cdw13=':value for command dword 13'
			-7':alias for --cdw13'
			--cdw14=':value for command dword 14'
			-8':alias for command dword 14'
			--cdw15=':value for command dword 15'
			-9':alias for command dword 15'
			--input-file=':defaults to stdin; input for write (send direction)'
			-i':alias for --input-file'
			--raw-binary':dump output in binary format'
			-b':alias for --raw-binary'
			--show-command':simply print command instead of sending it to <device>'
			-s':alias for --show-command'
			--dry-run':alias for --show-command'
			-d':alias for --show-command'
			--read':set dataflow direction to receive'
			-r':alias for --read'
			--write':set dataflow direction to send'
			-w':alias for --write'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme io-passthru options" _io
			;;
		(security-send)
			local _ssend
			_ssend=(
			/dev/nvme':supply a device to use (required)'
			--file=':payload'
			-f':alias for --file'
			--secp=':security protocol as defined in SPC-4'
			-p':alias for --secp'
			--spsp=':send security-protocol-specific data as defined in SPC-4'
			-s':alias for --spsp'
			--tl=':transfer length as defined in SPC-4'
			-t':alias for --tl'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme security-send options" _ssend
			;;
		(security-recv)
			local _srecv
			_srecv=(
			/dev/nvme':supply a device to use (required)'
			--secp=':security protocol as defined in SPC-4'
			-p':alias for --secp'
			--spsp=':send security-protocol-specific data as defined in SPC-4'
			-s':alias for --spsp'
			--size=':size of buffer (prints to stdout on successful recv)'
			-x':alias for --size'
			--al=':allocation length as defined in SPC-4'
			-a':alias for --al'
			--raw-binary':dump output in binary format'
			-b':alias for --raw-binary'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme security-recv options" _srecv
			;;
		(resv-acquire)
			local _acq
			_acq=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':<nsid> of namespace to try to reserve (required)'
			-n':alias for --namespace-id'
			--prkey=':pre-empt reservation key'
			-p':alias for --prkey'
			--rtype=':hexadecimal reservation type'
			-t':alias for --rtype'
			--racqa=':reservation acquiry action'
			-a':alias for --racqa'
			--iekey=':ignore existing reservation key'
			-i':alias for --iekey'
			--crkey':current reservation key'
			-c':alias for --crkey'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme resv-acquire options" _acq
			;;
		(resv-release)
			local _rel
			_rel=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':nsid'
			-n':alias of --namespace-id'
			--rtype=':hexadecimal reservation type'
			-t':alias of --rtype'
			--rrela=':reservation release action'
			-a':alias of --rrela'
			--iekey':ignore existing reservation key'
			-i':alias of --iekey'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme resv-release options" _rel
			;;
		(resv-report)
			local _rep
			_rep=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':nsid'
			-n':alias of --namespace-id'
			--numd=':number of dwords of reservation status to xfer'
			-d':alias of --numd'
			--raw-binary':dump output in binary format'
			-b':alias of --raw-binary'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme resv-report options" _rep
			;;
		(resv-register)
			local _reg
			_reg=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':nsid'
			-n':alias of --namespace-id'
			--crkey=':current reservation key'
			-c'alias of --crkey'
			--nrkey=':new reservation key'
			-k':alias of --nrkey'
			--cptpl=':change persistence through power loss setting'
			-p':alias for --cptpl'
			--rrega=':reservation registration action to perform'
			-a':alias for --rrega'
			--iekey':ignore existing reservation key'
			-i':alias for --iekey'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme resv-register options" _reg
			;;
		(copy)
			local _copy
			_copy=(
			/dev/nvme':supply a device to use (required)'
			--sdlba=':64-bit addr of first destination logical block'
			-d':alias of --sdlba'
			--slbs=':64-bit addr of first block per range (comma-separated list)'
			-s':alias of --slbs'
			--blocks=':number of blocks per range (comma-separated list, zeroes-based values)'
			-b':alias of --blocks'
			--limited-retry':if included, controller should try less hard to retrieve data from media (if not included, all available data recovery means used)'
			-l':alias of --limited-retry'
			--force-unit-access':if included, the data shall be read from non-volatile media'
			-f':alias of --force-unit access'
			--prinfow=':protection information and check field (write part)'
			-p':alias of --prinfow'
			--prinfor=':protection information and check field (read part)'
			-P':alias of --prinfor'
			--ref-tag=':initial lba reference tag (write part)'
			-r':alias of --ref-tag'
			--expected-ref-tags=':expected lba reference tags (read part, comma-separated list)'
			-R':alias of --expected-ref-tags'
			--app-tag=':lba application tag (write part)'
			-a':alias of --app-tag'
			--expected-app-tags=':expected lba application tags (read part, comma-separated list)'
			-A':alias of --expected-app-tags'
			--app-tag-mask=':lba application tag mask (write part)'
			-m':alias of --app-tag-mask'
			--expected-app-tag-masks=':expected lba application tag masks (read part, comma-separated list)'
			-M':alias of --expected-app-tag-masks'
			--dir-type':directive type (write part)'
			-T':alias of --dir-type'
			--dir-spec':directive specific (write part)'
			-S':alias of --dir-spec'
			--format':source range entry format'
			-F':alias of --format'
			)
			_arguments '*:: :->subcmds'
                       _describe -t commands "nvme copy options" _copy
		       ;;
		(flush)
			local _flush
			_flush=(
			/dev/nvme':supply a device to use (required)'
			--namespace-id=':nsid'
			-n':alias of --namespace-id'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme flush options" _flush
			;;
		(compare)
			local _comp
			_comp=(
			/dev/nvme':supply a device to use (required)'
			--start-block=':begin compare at this 64-bit LBA on device'
			-s':alias of --start-block'
			--block-count=':number of logical blocks on device to compare to local data'
			-c':alias of --block-count'
			--metadata-size=':number of bytes of metadata to compare'
			-y':alias of --metadata-size'
			--data-size=':size of local data buffer in bytes'
			-z':alias of --data-size'
			--data=':local data file to compare to blocks on device'
			-d':alias of --data'
			--prinfo=':protection information action and check field'
			-p':alias of --prinfo'
			--app-tag-mask=':application tag mask (for end to end PI)'
			-m':alias of --app-tag-mask'
			--app-tag=':application tag (for end to end PI)'
			-a':alias of --app-tag'
			--limited-retry':if included, controller should try less hard to retrieve data from media (if not included, all available data recovery means used)'
			-l':alias of --limited-retry'
			--force-unit-access':if included, the data shall be read from non-volatile media'
			-f':alias of --force-unit access'
			--show-command':show command instead of sending to device'
			-v':alias of --show-command'
			--dry-run':show command instead of sending to device'
			-w':alias of --show-command'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme compare options" _comp
			;;
		(read)
			local _read
			_read=(
			/dev/nvme':supply a device to use (required)'
			--start-block=':64-bit address of the first logical block to be read'
			-s':alias of --start-block'
			--block-count=':number of logical blocks on device to read'
			-c':alias of --block-count'
			--data-size=':size of data to be read'
			-z':alias of --data-size'
			--metadata-size=':size of metadata to be read'
			-y':alias of --metadata-size'
			--ref-tag=':reference tag (for end to end PI)'
			-r':alias of --ref-tag'
			--data=':file into which data should be read (defaults to stdout)'
			-d':alias of --data'
			--prinfo=':protection information and check field'
			-p':alias of --prinfo'
			--app-tag-mask=':application tag mask (for end to end PI)'
			-m':alias of --app-tag-mask'
			--app-tag=':application tag (for end to end PI)'
			-a':alias of --app-tag'
			--limited-retry=':if included, controller should try less hard to retrieve data from media (if not included, all available data-recovery means used)'
			-l':alias of --limited-retry'
			--latency':latency statistics will be output following read'
			-t':alias of --latency'
			--force-unit-access':data read shall be returned from nonvolatile media before command completion is indicated'
			-f':alias of --force-unit-access'
			--show-command':show command instead of sending to device'
			-v':alias of --show-command'
			--dry-run':show command instead of sending to device'
			-w':alias of --show-command'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme read options" _read
			;;
		(write)
			local _wr
			_wr=(
			/dev/nvme':supply a device to use (required)'
			--start-block=':64-bit address of the first logical block to be written'
			-s':alias of --start-block'
			--block-count=':number of logical blocks on device to write'
			-c':alias of --block-count'
			--data-size=':size of data to be written'
			-z':alias of --data-size'
			--metadata-size=':size of metadata to be written'
			-y':alias of --metadata-size'
			--ref-tag=':reference tag (for end to end PI)'
			-r':alias of --ref-tag'
			--data=':file from which data should be written to device (defaults to stdin)'
			-d':alias of --data'
			--prinfo=':protection information and check field'
			-p':alias of --prinfo'
			--app-tag-mask=':application tag mask (for end to end PI)'
			-m':alias of --app-tag-mask'
			--app-tag=':application tag (for end to end PI)'
			-a':alias of --app-tag'
			--limited-retry=':if included, controller should try less hard to send data to media (if not included, all available data-recovery means used)'
			-l':alias of --limited-retry'
			--latency':latency statistics will be output following write'
			-t':alias of --latency'
			--force-unit-access':data shall be written to nonvolatile media before command completion is indicated'
			-f':alias of --force-unit-access'
			--show-command':show command instead of sending to device'
			-v':alias of --show-command'
			--dry-run':show command instead of sending to device'
			-w':alias of --show-command'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme write options" _wr
			;;
		(show-regs)
			local _shor
			_shor=(
			/dev/nvme':supply a device to use (required)'
			)
			_arguments '*:: :->subcmds'
			_describe -t commands "nvme show-regs options" _shor
			;;
		(help)
			local _h
			_h=( id-ctrl id-ns list-ns id-iocs create-ns delete-ns attach-ns detach-ns
			     list-ctrl get-ns-id get-log fw-log smart-log error-log get-feature
			     set-feature format fw-activate fw-download admin-passthru io-passthru
			     security-send security-recv resv-acquire resv-register resv-release
			     resv-report flush compare read write copy show-regs persistent-event-log
				 pred-lat-event-agg-log nvm-id-ctrl endurance-event-agg-log lba-status-log
				 resv-notif-log
			   )
			_arguments '*:: :->subcmds'
			_describe -t commands "help: infos on a specific nvme command, or provide no option to see a synopsis of all nvme commands" _h
			;;
		(*)
			_files
			;;
		esac
		return
	fi

	_files
}
