From b649a1dc3eb47aa63df5cd83144ef7f92992bb17 Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Wed, 12 Feb 2020 11:44:46 -0700 Subject: [PATCH] nvme: Add new NVMe 1.4 definitions for controller memory buffer Change-Id: I00f1880a6b0f018c291d015b3f65a7579541c069 Signed-off-by: Ben Walker Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/837 Reviewed-by: Changpeng Liu Reviewed-by: Shuhei Matsumoto Reviewed-by: Jim Harris Tested-by: SPDK CI Jenkins --- include/spdk/nvme_spec.h | 41 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/include/spdk/nvme_spec.h b/include/spdk/nvme_spec.h index cea379c87..cd7c947c3 100644 --- a/include/spdk/nvme_spec.h +++ b/include/spdk/nvme_spec.h @@ -263,6 +263,35 @@ union spdk_nvme_cmbsz_register { }; SPDK_STATIC_ASSERT(sizeof(union spdk_nvme_cmbsz_register) == 4, "Incorrect size"); +union spdk_nvme_cmbmsc_register { + uint64_t raw; + struct { + /** capability registers enabled */ + uint64_t cre : 1; + + /** controller memory space enable */ + uint64_t cmse : 1; + + uint64_t reserved : 10; + + /** controller base address */ + uint64_t cba : 52; + } bits; + +}; +SPDK_STATIC_ASSERT(sizeof(union spdk_nvme_cmbmsc_register) == 8, "Incorrect size"); + +union spdk_nvme_cmbsts_register { + uint32_t raw; + struct { + /** controller base address invalid */ + uint32_t cbai : 1; + + uint32_t reserved : 31; + } bits; +}; +SPDK_STATIC_ASSERT(sizeof(union spdk_nvme_cmbsts_register) == 4, "Incorrect size"); + /** Boot partition information */ union spdk_nvme_bpinfo_register { uint32_t raw; @@ -345,7 +374,13 @@ struct spdk_nvme_registers { /** boot partition memory buffer location (must be 4KB aligned) */ uint64_t bpmbl; - uint32_t reserved3[0x3ec]; + /** controller memory buffer memory space control */ + union spdk_nvme_cmbmsc_register cmbmsc; + + /** controller memory buffer status */ + union spdk_nvme_cmbsts_register cmbsts; + + uint32_t reserved3[0x3e9]; struct { uint32_t sq_tdbl; /* submission queue tail doorbell */ @@ -377,6 +412,10 @@ SPDK_STATIC_ASSERT(0x44 == offsetof(struct spdk_nvme_registers, bprsel), "Incorrect register offset"); SPDK_STATIC_ASSERT(0x48 == offsetof(struct spdk_nvme_registers, bpmbl), "Incorrect register offset"); +SPDK_STATIC_ASSERT(0x50 == offsetof(struct spdk_nvme_registers, cmbmsc), + "Incorrect register offset"); +SPDK_STATIC_ASSERT(0x58 == offsetof(struct spdk_nvme_registers, cmbsts), + "Incorrect register offset"); enum spdk_nvme_sgl_descriptor_type { SPDK_NVME_SGL_TYPE_DATA_BLOCK = 0x0,