From 740b2f5622cf4b0141dc77c0bf58b30eb8ac2007 Mon Sep 17 00:00:00 2001 From: James Bergsten Date: Thu, 2 May 2019 15:40:32 -0700 Subject: [PATCH] nvme: spdk_nvme_ctrlr_get_registers This function returns a pointer to the PCIe I/O registers for a controller or NULL if unsupported for this transport. Used for PCIe only, other transports return NULL. Use with caution. Signed-off-by: James Bergsten Change-Id: I849f9de9ad259a65b1eef9c1237345eb7195b9bf Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/452927 Reviewed-by: Jim Harris Reviewed-by: Changpeng Liu Reviewed-by: Shuhei Matsumoto Reviewed-by: Ben Walker Tested-by: SPDK CI Jenkins --- include/spdk/nvme.h | 12 ++++++++++++ lib/nvme/nvme_internal.h | 1 + lib/nvme/nvme_pcie.c | 8 ++++++++ lib/nvme/nvme_rdma.c | 6 ++++++ lib/nvme/nvme_tcp.c | 6 ++++++ lib/nvme/nvme_transport.c | 6 ++++++ 6 files changed, 39 insertions(+) diff --git a/include/spdk/nvme.h b/include/spdk/nvme.h index 4e18712ee..862877f33 100644 --- a/include/spdk/nvme.h +++ b/include/spdk/nvme.h @@ -1504,6 +1504,18 @@ int spdk_nvme_ctrlr_update_firmware(struct spdk_nvme_ctrlr *ctrlr, void *payload int slot, enum spdk_nvme_fw_commit_action commit_action, struct spdk_nvme_status *completion_status); +/** + * Return virtual address of PCIe NVM I/O registers + * + * This function returns a pointer to the PCIe I/O registers for a controller + * or NULL if unsupported for this transport. + * + * \param ctrlr Controller whose registers are to be accessed. + * + * \return Pointer to virtual address of register bank, or NULL. + */ +volatile struct spdk_nvme_registers *spdk_nvme_ctrlr_get_registers(struct spdk_nvme_ctrlr *ctrlr); + /** * Allocate an I/O buffer from the controller memory buffer (Experimental). * diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 3071814d2..558c70709 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -989,6 +989,7 @@ struct spdk_nvme_ctrlr *spdk_nvme_get_ctrlr_by_trid_unsafe( struct spdk_nvme_qpair *nvme_ ## name ## _ctrlr_create_io_qpair(struct spdk_nvme_ctrlr *ctrlr, uint16_t qid, const struct spdk_nvme_io_qpair_opts *opts); \ void *nvme_ ## name ## _ctrlr_alloc_cmb_io_buffer(struct spdk_nvme_ctrlr *ctrlr, size_t size); \ int nvme_ ## name ## _ctrlr_free_cmb_io_buffer(struct spdk_nvme_ctrlr *ctrlr, void *buf, size_t size); \ + volatile struct spdk_nvme_registers *nvme_ ## name ## _ctrlr_get_registers(struct spdk_nvme_ctrlr *ctrlr); \ int nvme_ ## name ## _ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair); \ int nvme_ ## name ## _ctrlr_reconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair); \ void nvme_ ## name ## _qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t dnr); \ diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index 732635ece..0d1ee6b52 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -594,6 +594,14 @@ nvme_pcie_ctrlr_alloc_cmb(struct spdk_nvme_ctrlr *ctrlr, uint64_t length, uint64 return 0; } +volatile struct spdk_nvme_registers * +nvme_pcie_ctrlr_get_registers(struct spdk_nvme_ctrlr *ctrlr) +{ + struct nvme_pcie_ctrlr *pctrlr = nvme_pcie_ctrlr(ctrlr); + + return pctrlr->regs; +} + void * nvme_pcie_ctrlr_alloc_cmb_io_buffer(struct spdk_nvme_ctrlr *ctrlr, size_t size) { diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index 9589ba70e..9fae2f7eb 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -1761,6 +1761,12 @@ nvme_rdma_ctrlr_get_max_sges(struct spdk_nvme_ctrlr *ctrlr) return spdk_min(ctrlr->cdata.nvmf_specific.msdbd, NVME_RDMA_MAX_SGL_DESCRIPTORS); } +volatile struct spdk_nvme_registers * +nvme_rdma_ctrlr_get_registers(struct spdk_nvme_ctrlr *ctrlr) +{ + return NULL; +} + void * nvme_rdma_ctrlr_alloc_cmb_io_buffer(struct spdk_nvme_ctrlr *ctrlr, size_t size) { diff --git a/lib/nvme/nvme_tcp.c b/lib/nvme/nvme_tcp.c index 4b8887498..a66b3d0ae 100644 --- a/lib/nvme/nvme_tcp.c +++ b/lib/nvme/nvme_tcp.c @@ -1852,6 +1852,12 @@ nvme_tcp_ctrlr_get_max_sges(struct spdk_nvme_ctrlr *ctrlr) return 1; } +volatile struct spdk_nvme_registers * +nvme_tcp_ctrlr_get_registers(struct spdk_nvme_ctrlr *ctrlr) +{ + return NULL; +} + void * nvme_tcp_ctrlr_alloc_cmb_io_buffer(struct spdk_nvme_ctrlr *ctrlr, size_t size) { diff --git a/lib/nvme/nvme_transport.c b/lib/nvme/nvme_transport.c index 063f56f3f..8d1ca1b6e 100644 --- a/lib/nvme/nvme_transport.c +++ b/lib/nvme/nvme_transport.c @@ -185,6 +185,12 @@ nvme_transport_ctrlr_reconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_ NVME_TRANSPORT_CALL(ctrlr->trid.trtype, ctrlr_reconnect_qpair, (ctrlr, qpair)); } +volatile struct spdk_nvme_registers * +nvme_transport_ctrlr_get_registers(struct spdk_nvme_ctrlr *ctrlr) +{ + NVME_TRANSPORT_CALL(ctrlr->trid.trtype, ctrlr_get_registers, (ctrlr)); +} + void nvme_transport_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t dnr) {