|  | package nvme | 
|  |  | 
|  | // SecureEraseType specifices what type of secure erase should be performed by | 
|  | // by the controller. The zero value requests no secure erase. | 
|  | type SecureEraseType uint8 | 
|  |  | 
|  | const ( | 
|  | // SecureEraseTypeNone specifies that no secure erase operation is | 
|  | // requested. | 
|  | SecureEraseTypeNone SecureEraseType = 0 | 
|  | // SecureEraseTypeUserData specifies that all user data should be securely | 
|  | // erased. The controller is allowed to perform a cryptographic erase | 
|  | // instead. | 
|  | SecureEraseTypeUserData SecureEraseType = 1 | 
|  | // SecureEraseTypeCryptographic specifies that the encryption key for user | 
|  | // data should be erased. This in turn causes all current user data to | 
|  | // become unreadable. | 
|  | SecureEraseTypeCryptographic SecureEraseType = 2 | 
|  | ) | 
|  |  | 
|  | // ProtectionInformationType selects the type of end-to-end protection tags to | 
|  | // use. NVMe supports the same types as T10 DIF (SCSI). | 
|  | type ProtectionInformationType uint8 | 
|  |  | 
|  | const ( | 
|  | ProtectionInformationTypeNone ProtectionInformationType = 0 | 
|  | ProtectionInformationType1    ProtectionInformationType = 1 | 
|  | ProtectionInformationType2    ProtectionInformationType = 2 | 
|  | ProtectionInformationType3    ProtectionInformationType = 3 | 
|  | ) | 
|  |  | 
|  | type FormatRequest struct { | 
|  | // NamespaceID contains the ID of the namespace to format. | 
|  | // NamespaceGlobal formats all namespaces. | 
|  | NamespaceID uint32 | 
|  | // SecureEraseSettings specifies the type of secure erase to perform. | 
|  | SecureEraseSettings SecureEraseType | 
|  | // ProtectionInformationLocation selects where protection information is | 
|  | // transmitted. If true, it is transmitted as the first 8 bytes of metadata. | 
|  | // If false, it is transmitted as the last 8 bytes of metadata. | 
|  | ProtectionInformationLocation bool | 
|  | // ProtectionInformation specifies the type of T10 DIF Protection | 
|  | // Information to use. | 
|  | ProtectionInformation ProtectionInformationType | 
|  | // MetadataInline selects whether metadata is transferred as part of an | 
|  | // extended data LBA. If false, metadata is returned in a separate buffer. | 
|  | // If true, metadata is appended to the data buffer. | 
|  | MetadataInline bool | 
|  | // LBAFormat specifies the LBA format to use. This needs to be selected | 
|  | // from the list of supported LBA formats in the Identify response. | 
|  | LBAFormat uint8 | 
|  | } | 
|  |  | 
|  | // Format performs a low-level format of the NVM media. This is used for | 
|  | // changing the block and/or metadata size. This command causes all data | 
|  | // on the specified namespace to be lost. By setting SecureEraseSettings | 
|  | // to the appropriate value it can also be used to securely erase data. | 
|  | // See also the Sanitize command for just wiping the device. | 
|  | func (d *Device) Format(req *FormatRequest) error { | 
|  | var cdw10 uint32 | 
|  | cdw10 |= uint32(req.SecureEraseSettings&0x7) << 9 | 
|  | cdw10 |= uint32(req.ProtectionInformation&0x7) << 5 | 
|  | cdw10 |= uint32(req.LBAFormat & 0x7) | 
|  | if req.ProtectionInformationLocation { | 
|  | cdw10 |= 1 << 8 | 
|  | } | 
|  | if req.MetadataInline { | 
|  | cdw10 |= 1 << 4 | 
|  | } | 
|  | return d.RawCommand(&Command{ | 
|  | Opcode:      0x80, | 
|  | NamespaceID: req.NamespaceID, | 
|  | CDW10:       cdw10, | 
|  | }) | 
|  | } |