Skip to content

Commit 2807f60

Browse files
committed
nvme: Convert AdminIdentifyControllerResponse to FlagSet
Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
1 parent 62f2316 commit 2807f60

2 files changed

Lines changed: 110 additions & 14 deletions

File tree

src/nvme.rs

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,42 @@ pub enum CommandSetIdentifier {
448448
ComputationalPrograms = 0x04,
449449
}
450450

451+
// Base v2.1, 5.1.13.2.1, Figure 312, CMIC
452+
flags! {
453+
enum ControllerMultipathIoNamespaceSharingCapabilityFlags: u8 {
454+
Mports,
455+
Mctrs,
456+
Ft,
457+
Anars,
458+
}
459+
}
460+
461+
// Base v2.1, 5.1.13.2.1, Figure 312, CTRATT
462+
flags! {
463+
enum ControllerAttributeFlags: u32 {
464+
Hids,
465+
Nopspm,
466+
Nsets,
467+
Rrlvls,
468+
Egs,
469+
Plm,
470+
Tbkas,
471+
Ng,
472+
Sqa,
473+
Ulist,
474+
Mds,
475+
Fcm,
476+
Vcm,
477+
Deg,
478+
Dnvms,
479+
Elbas,
480+
Mem,
481+
Hmbr,
482+
Rhii,
483+
Fdps,
484+
}
485+
}
486+
451487
// Base v2.1, 5.1.13.2.1, Figure 312, CNTRLTYPE
452488
#[derive(Clone, Copy, Debug, DekuRead, DekuWrite, PartialEq)]
453489
#[deku(id_type = "u8", endian = "endian", ctx = "endian: Endian")]
@@ -469,6 +505,22 @@ impl From<crate::ControllerType> for ControllerType {
469505
}
470506
}
471507

508+
// Base v2.1, 5.1.13.2.1, Figure 312, NVMSR
509+
flags! {
510+
enum NvmSubsystemReportFlags: u8 {
511+
Nvmesd,
512+
Nvmee,
513+
}
514+
}
515+
516+
// Base v2.1, 5.1.13.2.1, Figure 312, MEC
517+
flags! {
518+
enum ManagementEndpointCapabilityFlags: u8 {
519+
Twpme,
520+
Pcieme,
521+
}
522+
}
523+
472524
// Base v2.1, 5.1.13.2.1, Figure 312, LPA
473525
flags! {
474526
#[repr(u8)]
@@ -551,20 +603,20 @@ struct AdminIdentifyControllerResponse {
551603
fr: WireString<8>,
552604
rab: u8,
553605
ieee: [u8; 3],
554-
cmic: u8,
606+
cmic: WireFlagSet<ControllerMultipathIoNamespaceSharingCapabilityFlags>,
555607
mdts: u8,
556608
cntlid: u16,
557609
ver: u32,
558610
rtd3r: u32,
559611
rtd3e: u32,
560612
oaes: u32,
561-
ctratt: u32,
613+
ctratt: WireFlagSet<ControllerAttributeFlags>,
562614
#[deku(seek_from_current = "11")]
563615
cntrltype: crate::nvme::ControllerType,
564616
#[deku(seek_from_current = "141")]
565-
nvmsr: u8,
617+
nvmsr: WireFlagSet<NvmSubsystemReportFlags>,
566618
vwci: u8,
567-
mec: u8,
619+
mec: WireFlagSet<ManagementEndpointCapabilityFlags>,
568620
ocas: u16,
569621
acl: u8,
570622
aerl: u8,

src/nvme/mi/dev.rs

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ use log::debug;
99
use mctp::{AsyncRespChannel, MsgIC};
1010

1111
use crate::nvme::mi::{NvmSubsystemStatusFlags, PortCapabilityFlags};
12+
use crate::nvme::{
13+
ControllerAttributeFlags, ControllerMultipathIoNamespaceSharingCapabilityFlags,
14+
ManagementEndpointCapabilityFlags, NvmSubsystemReportFlags,
15+
};
1216
use crate::{
1317
CommandEffect, CommandEffectError, Controller, ControllerError, ControllerType, Discriminant,
1418
MAX_CONTROLLERS, MAX_NAMESPACES, NamespaceId, NamespaceIdDisposition, SubsystemError,
@@ -1385,26 +1389,66 @@ impl RequestHandler for AdminIdentifyRequest {
13851389
fixup.reverse();
13861390
fixup
13871391
},
1388-
cmic: ((subsys.ctlrs.len() > 1) as u8) << 1 // MCTRS
1389-
| ((subsys.ports.len() > 1) as u8), // MPORTS
1392+
cmic: {
1393+
let mut flags = FlagSet::empty();
1394+
1395+
if subsys.ctlrs.len() > 1 {
1396+
flags |=
1397+
ControllerMultipathIoNamespaceSharingCapabilityFlags::Mctrs;
1398+
}
1399+
1400+
if subsys.ports.len() > 1 {
1401+
flags |=
1402+
ControllerMultipathIoNamespaceSharingCapabilityFlags::Mports;
1403+
}
1404+
1405+
flags
1406+
}
1407+
.into(),
13901408
mdts: 0,
13911409
cntlid: ctlr.id.0,
13921410
ver: 0,
13931411
rtd3r: 0,
13941412
rtd3e: 0,
13951413
oaes: 0,
13961414
// TODO: Tie to data model
1397-
ctratt: ((false as u32) << 14) // DNVMS
1398-
| ((false as u32) << 13) // DEG
1399-
| ((false as u32) << 4) // EGS
1400-
| ((false as u32) << 2), // NSETS
1415+
ctratt: {
1416+
let mut flags = FlagSet::empty();
1417+
1418+
flags -= ControllerAttributeFlags::Nsets;
1419+
flags -= ControllerAttributeFlags::Egs;
1420+
flags -= ControllerAttributeFlags::Deg;
1421+
flags -= ControllerAttributeFlags::Dnvms;
1422+
1423+
flags
1424+
}
1425+
.into(),
14011426
cntrltype: ctlr.cntrltype.into(),
14021427
// TODO: Tie to data model
1403-
nvmsr: ((false as u8) << 1) // NVMEE
1404-
| (true as u8), // NVMESD
1428+
nvmsr: { FlagSet::empty() | NvmSubsystemReportFlags::Nvmesd }.into(),
14051429
vwci: 0,
1406-
mec: ((subsys.ports.iter().any(|p| matches!(p.typ, crate::PortType::Pcie(_)))) as u8) << 1 // PCIEME
1407-
| (subsys.ports.iter().any(|p| matches!(p.typ, crate::PortType::TwoWire(_)))) as u8, // TWPME
1430+
mec: {
1431+
let mut flags = FlagSet::empty();
1432+
1433+
if subsys
1434+
.ports
1435+
.iter()
1436+
.any(|p| matches!(p.typ, crate::PortType::Pcie(_)))
1437+
{
1438+
flags |= ManagementEndpointCapabilityFlags::Pcieme;
1439+
}
1440+
1441+
if subsys
1442+
.ports
1443+
.iter()
1444+
.any(|p| matches!(p.typ, crate::PortType::TwoWire(_)))
1445+
{
1446+
flags |= ManagementEndpointCapabilityFlags::Twpme;
1447+
}
1448+
1449+
flags
1450+
}
1451+
.into(),
14081452
ocas: 0,
14091453
acl: 0,
14101454
aerl: 0,

0 commit comments

Comments
 (0)