"use strict" ;
const { B } = require ( "../unit-bytes-iec" ) ;
const thirdFourthByteMask = parseInt ( "11111111111111110000000000000000" , 2 ) ;
const secondByteMask = parseInt ( "00000000000000001111111100000000" , 2 ) ;
const firstByteMask = parseInt ( "00000000000000000000000011111111" , 2 ) ;
module . exports = {
vid : "vendorID" ,
ssvi : "subsystemVendorID" ,
sn : { name : "serialNumber" , transform : ( string ) => string . trim ( ) } ,
mn : { name : "modelNumber" , transform : ( string ) => string . trim ( ) } ,
fr : "firmwareRevision" ,
rab : { name : "recommendedArbitrationBurst" , transform : ( value ) => 2 * * value } , // FIXME: Is this correct?
ieee : "ouiIdentifier" ,
cmic : { name : "cmicCapabilities" , transform : ( bitField ) => {
return {
anar : bitField & 8 ,
virtualFunction : bitField & 4 ,
multipleControllers : bitField & 2 ,
multipleSubsystemPorts : bitField & 1
} ;
} } ,
mdts : { name : "maximumDataTransferSize" , transform : ( value ) => {
if ( value === 0 ) {
return null ;
} else {
// Note: counted in multiples of the minimum memory page size
// TODO: Can we grab this from somewhere and return the value in bytes instead?
return 2 * * value ;
}
} } ,
cntlid : "controllerID" ,
ver : { name : "protocolVersion" , transform : ( value ) => {
return {
major : value & thirdFourthByteMask ,
minor : value & secondByteMask ,
tertiary : value & firstByteMask
} ;
} } ,
// MARKER
rtd3r : { name : "rtd3ResumeLatency" , transform : ( value ) => {
if ( value === 0 ) {
return null ;
} else {
// TODO: Unit?
return value ;
}
} } ,
rtd3e : { name : "rtd3EntryLatency" , transform : ( value ) => {
if ( value === 0 ) {
return null ;
} else {
// TODO: Unit?
return value ;
}
} } ,
// TODO:
// oaes,
// ctratt,
// rrls,
// crdt1,
// crdt2,
// crdt3,
// nvmsr,
// vwci,
// mec,
// oacs,
// acl,
// aerl,
// frmw,
// lpa,
// elpe,
// npss,
// avscc,
// apsta,
// wctemp,
// cctemp,
// mtfa,
// hmpre,
// hmmin,
// FIXME: The following two values are exported as string (in newer versions of nvme-cli), presumably for precision reasons. Eventually the units package should probably be updated to support bigints, to avoid precision loss in our own code.
tnvmcap : { name : "totalSpace" , transform : ( value ) => B ( parseInt ( value ) ) } ,
unvmcap : { name : "freeSpace" , transform : ( value ) => B ( parseInt ( value ) ) } ,
// TOOD:
// rpmbs,
// edstt,
// dsto,
// fwug,
// kas,
// hctma,
// mntmt,
// mxtmt,
// sanicap,
// hmminds,
// hmmaxd,
// nsetidmax,
// anatt,
// anacap,
// anagrpmax,
// nanagrpid,
// domainid,
// megcap,
// sqes,
// cqes,
// maxcmd,
// nn,
// oncs,
// fuses,
// fna,
// vwc,
// awun,
// awupf,
// icsvscc,
// nwpc,
// acwu,
// ocfs,
// sgls,
// maxdna,
// maxcna,
// ioccsz,
// iorcsz,
// icdoff,
// fcatt,
// msdbd,
// ofcs,
// psds
} ;