From 25d0dc19d53694d891612953bd386826bb8a887a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Sun, 13 Nov 2022 20:11:16 +0000 Subject: [PATCH] nvme_drv: provide get/set feature command These admin commands are used to configure features of the NVMe device. Issue #4715. --- repos/os/src/drivers/nvme/main.cc | 39 +++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/repos/os/src/drivers/nvme/main.cc b/repos/os/src/drivers/nvme/main.cc index eeaf138dad..ec2fc4817d 100644 --- a/repos/os/src/drivers/nvme/main.cc +++ b/repos/os/src/drivers/nvme/main.cc @@ -66,6 +66,8 @@ namespace Nvme { struct Sqe_create_cq; struct Sqe_create_sq; struct Sqe_identify; + struct Sqe_get_feature; + struct Sqe_set_feature; struct Sqe_io; struct Queue; @@ -133,6 +135,13 @@ namespace Nvme { WRITE_ZEROS = 0x08, }; + enum Feature_sel { + CURRENT = 0b000, + DEFAULT = 0b001, + SAVED = 0b010, + SUPPORTED = 0b011, + }; + struct Block_session_component; struct Driver; struct Main; @@ -332,6 +341,36 @@ struct Nvme::Sqe_identify : Nvme::Sqe }; +/* + * Get feature command + */ +struct Nvme::Sqe_get_feature : Nvme::Sqe +{ + struct Cdw10 : Register<0x28, 32> + { + struct Fid : Bitfield< 0, 8> { }; /* feature identifier */ + struct Sel : Bitfield< 8, 2> { }; /* select which value is returned */ + }; + + Sqe_get_feature(addr_t const base) : Sqe(base) { } +}; + + +/* + * Set feature command + */ +struct Nvme::Sqe_set_feature : Nvme::Sqe +{ + struct Cdw10 : Register<0x28, 32> + { + struct Fid : Bitfield< 0, 8> { }; /* feature identifier */ + struct Sv : Bitfield<31, 1> { }; /* save */ + }; + + Sqe_set_feature(addr_t const base) : Sqe(base) { } +}; + + /* * Create completion queue command */