diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index f986a34fe..dd319ab2d 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -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; diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 3bbf13c5d..1f07f356d 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -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) diff --git a/lib/nvme/nvme_ns.c b/lib/nvme/nvme_ns.c index 597005d39..2078618eb 100644 --- a/lib/nvme/nvme_ns.c +++ b/lib/nvme/nvme_ns.c @@ -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,9 +191,12 @@ 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) { - ns->stripe_size = (1 << ctrlr->cdata.vs[3]) * ctrlr->min_page_size; + 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); diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index 15cb7467b..b6b4de944 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -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, }; diff --git a/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c b/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c index d7672f7ec..9afe6d4eb 100644 --- a/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c +++ b/test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c @@ -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; + } + + 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; + + return 0; } -uint16_t -spdk_pci_device_get_device_id(struct spdk_pci_device *dev) -{ - return g_pci_device_id; -} - -uint16_t -spdk_pci_device_get_subvendor_id(struct spdk_pci_device *dev) -{ - return g_pci_subvendor_id; -} - -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));