Commit a00852c1 authored by Daniel Verkamp's avatar Daniel Verkamp
Browse files

nvme: add PCI ID accessor to transport



Change-Id: I1776c21d7479f3ef69fe254b8dc4b6d64bbe48bc
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent d7b7dbfb
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -208,17 +208,19 @@ static void
nvme_ctrlr_construct_intel_support_log_page_list(struct spdk_nvme_ctrlr *ctrlr,
		struct spdk_nvme_intel_log_page_directory *log_page_directory)
{
	struct spdk_pci_device *dev;
	struct pci_id pci_id;

	if (ctrlr->cdata.vid != SPDK_PCI_VID_INTEL || log_page_directory == NULL)
	if (log_page_directory == NULL) {
		return;
	}

	dev = ctrlr->devhandle;
	pci_id.vendor_id = spdk_pci_device_get_vendor_id(dev);
	pci_id.dev_id = spdk_pci_device_get_device_id(dev);
	pci_id.sub_vendor_id = spdk_pci_device_get_subvendor_id(dev);
	pci_id.sub_dev_id = spdk_pci_device_get_subdevice_id(dev);
	if (ctrlr->transport->ctrlr_get_pci_id(ctrlr, &pci_id)) {
		return;
	}

	if (pci_id.vendor_id != SPDK_PCI_VID_INTEL) {
		return;
	}

	ctrlr->log_page_supported[SPDK_NVME_INTEL_LOG_PAGE_DIRECTORY] = true;

+9 −9
Original line number Diff line number Diff line
@@ -241,8 +241,15 @@ struct nvme_request {
	void				*user_buffer;
};

struct pci_id {
	uint16_t	vendor_id;
	uint16_t	dev_id;
	uint16_t	sub_vendor_id;
	uint16_t	sub_dev_id;
};

struct spdk_nvme_transport {
	int reserved;
	int (*ctrlr_get_pci_id)(struct spdk_nvme_ctrlr *ctrlr, struct pci_id *pci_id);
};

struct nvme_completion_poll_status {
@@ -479,20 +486,13 @@ struct nvme_driver {
	struct spdk_mempool	*request_mempool;
};

struct pci_id {
	uint16_t	vendor_id;
	uint16_t	dev_id;
	uint16_t	sub_vendor_id;
	uint16_t	sub_dev_id;
};

extern struct nvme_driver *g_spdk_nvme_driver;

extern const struct spdk_nvme_transport spdk_nvme_transport_pcie;

#define nvme_min(a,b) (((a)<(b))?(a):(b))

#define INTEL_DC_P3X00_DEVID	0x09538086
#define INTEL_DC_P3X00_DEVID	0x0953

#define nvme_mmio_read_4(sc, reg) \
	spdk_mmio_read_4(&(sc)->regs->reg)
+7 −4
Original line number Diff line number Diff line
@@ -183,7 +183,7 @@ spdk_nvme_ns_get_data(struct spdk_nvme_ns *ns)
int nvme_ns_construct(struct spdk_nvme_ns *ns, uint16_t id,
		      struct spdk_nvme_ctrlr *ctrlr)
{
	uint32_t				pci_devid;
	struct pci_id pci_id;

	assert(id > 0);

@@ -191,10 +191,13 @@ int nvme_ns_construct(struct spdk_nvme_ns *ns, uint16_t id,
	ns->id = id;
	ns->stripe_size = 0;

	spdk_pci_device_cfg_read32(ctrlr->devhandle, &pci_devid, 0);
	if (pci_devid == INTEL_DC_P3X00_DEVID && ctrlr->cdata.vs[3] != 0) {
	if (ctrlr->transport->ctrlr_get_pci_id(ctrlr, &pci_id) == 0) {
		if (pci_id.vendor_id == SPDK_PCI_VID_INTEL &&
		    pci_id.dev_id == INTEL_DC_P3X00_DEVID &&
		    ctrlr->cdata.vs[3] != 0) {
			ns->stripe_size = (1 << ctrlr->cdata.vs[3]) * ctrlr->min_page_size;
		}
	}

	return nvme_ns_identify_update(ns);
}
+20 −0
Original line number Diff line number Diff line
@@ -37,5 +37,25 @@

#include "nvme_internal.h"

static int
nvme_pcie_ctrlr_get_pci_id(struct spdk_nvme_ctrlr *ctrlr, struct pci_id *pci_id)
{
	struct spdk_pci_device *pci_dev;

	assert(ctrlr != NULL);
	assert(pci_id != NULL);

	pci_dev = ctrlr->devhandle;
	assert(pci_dev != NULL);

	pci_id->vendor_id = spdk_pci_device_get_vendor_id(pci_dev);
	pci_id->dev_id = spdk_pci_device_get_device_id(pci_dev);
	pci_id->sub_vendor_id = spdk_pci_device_get_subvendor_id(pci_dev);
	pci_id->sub_dev_id = spdk_pci_device_get_subdevice_id(pci_dev);

	return 0;
}

const struct spdk_nvme_transport spdk_nvme_transport_pcie = {
	.ctrlr_get_pci_id = nvme_pcie_ctrlr_get_pci_id,
};
+17 −20
Original line number Diff line number Diff line
@@ -92,29 +92,24 @@ spdk_pci_device_cfg_write32(struct spdk_pci_device *dev, uint32_t value,
	return 0;
}

uint16_t
spdk_pci_device_get_vendor_id(struct spdk_pci_device *dev)
static int
ut_ctrlr_get_pci_id(struct spdk_nvme_ctrlr *ctrlr, struct pci_id *pci_id)
{
	return g_pci_vendor_id;
	if (ctrlr == NULL || pci_id == NULL) {
		return -EINVAL;
	}

uint16_t
spdk_pci_device_get_device_id(struct spdk_pci_device *dev)
{
	return g_pci_device_id;
}
	pci_id->vendor_id = g_pci_vendor_id;
	pci_id->dev_id = g_pci_device_id;
	pci_id->sub_vendor_id = g_pci_subvendor_id;
	pci_id->sub_dev_id = g_pci_subdevice_id;

uint16_t
spdk_pci_device_get_subvendor_id(struct spdk_pci_device *dev)
{
	return g_pci_subvendor_id;
	return 0;
}

uint16_t
spdk_pci_device_get_subdevice_id(struct spdk_pci_device *dev)
{
	return g_pci_subdevice_id;
}
static const struct spdk_nvme_transport nvme_ctrlr_ut_transport = {
	.ctrlr_get_pci_id = ut_ctrlr_get_pci_id,
};

uint16_t
spdk_pci_device_get_domain(struct spdk_pci_device *dev)
@@ -1092,15 +1087,17 @@ test_nvme_ctrlr_construct_intel_support_log_page_list(void)
	struct spdk_nvme_ctrlr				ctrlr = {};
	struct spdk_nvme_intel_log_page_directory	payload = {};

	ctrlr.transport = &nvme_ctrlr_ut_transport;

	/* set a invalid vendor id */
	ctrlr.cdata.vid = 0xFFFF;
	g_pci_vendor_id = 0xFFFF;

	nvme_ctrlr_construct_intel_support_log_page_list(&ctrlr, &payload);
	res = spdk_nvme_ctrlr_is_log_page_supported(&ctrlr, SPDK_NVME_INTEL_LOG_TEMPERATURE);
	CU_ASSERT(res == false);

	/* set valid vendor id and log page directory*/
	ctrlr.cdata.vid = SPDK_PCI_VID_INTEL;
	g_pci_vendor_id = SPDK_PCI_VID_INTEL;
	payload.temperature_statistics_log_len = 1;
	memset(ctrlr.log_page_supported, 0, sizeof(ctrlr.log_page_supported));