blob: 8bde44abf9be0c4dbabe258584cc80efd9d3162d [file] [log] [blame]
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,
})
}