external_code/nvme: map controller's registers

The controller's memory register space (located in the first BAR) is now
mapped.  The functions for accessing individual registers from this area
will be added in the following patch.

Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com>
Change-Id: Ie5f88079a46152ba8d68e534d5e4c0c2bef84ef3
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6667
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Konrad Sztyber 2021-02-17 16:14:57 +01:00 committed by Tomasz Zawadzki
parent 86b1b71f5f
commit c2ca187c1e

View File

@ -31,14 +31,17 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "spdk/nvme_spec.h"
#include "spdk/log.h"
#include "spdk/stdinc.h"
#include "nvme.h"
struct nvme_ctrlr {
/* Underlying PCI device */
struct spdk_pci_device *pci_device;
TAILQ_ENTRY(nvme_ctrlr) tailq;
struct spdk_pci_device *pci_device;
/* Pointer to the MMIO register space */
volatile struct spdk_nvme_registers *regs;
TAILQ_ENTRY(nvme_ctrlr) tailq;
};
static struct spdk_pci_id nvme_pci_driver_id[] = {
@ -77,6 +80,8 @@ pcie_enum_cb(void *ctx, struct spdk_pci_device *pci_dev)
struct nvme_ctrlr *ctrlr;
TAILQ_HEAD(, nvme_ctrlr) *ctrlrs = ctx;
char addr[32] = {};
uint64_t phys_addr, size;
void *reg_addr;
spdk_pci_addr_fmt(addr, sizeof(addr), &pci_dev->addr);
@ -92,7 +97,15 @@ pcie_enum_cb(void *ctx, struct spdk_pci_device *pci_dev)
return -1;
}
if (spdk_pci_device_map_bar(pci_dev, 0, &reg_addr, &phys_addr, &size)) {
SPDK_ERRLOG("Failed to allocate BAR0 for NVMe controller: %s\n", addr);
spdk_pci_device_unclaim(pci_dev);
free(ctrlr);
return -1;
}
ctrlr->pci_device = pci_dev;
ctrlr->regs = (volatile struct spdk_nvme_registers *)reg_addr;
TAILQ_INSERT_TAIL(ctrlrs, ctrlr, tailq);
return 0;
@ -101,6 +114,7 @@ pcie_enum_cb(void *ctx, struct spdk_pci_device *pci_dev)
static void
free_ctrlr(struct nvme_ctrlr *ctrlr)
{
spdk_pci_device_unmap_bar(ctrlr->pci_device, 0, (void *)ctrlr->regs);
spdk_pci_device_unclaim(ctrlr->pci_device);
spdk_pci_device_detach(ctrlr->pci_device);
free(ctrlr);