Loading lib/nvme/nvme_ctrlr.c +9 −7 Original line number Diff line number Diff line Loading @@ -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; Loading lib/nvme/nvme_internal.h +9 −9 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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) Loading lib/nvme/nvme_ns.c +7 −4 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); } Loading lib/nvme/nvme_pcie.c +20 −0 Original line number Diff line number Diff line Loading @@ -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, }; test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c +17 −20 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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)); Loading Loading
lib/nvme/nvme_ctrlr.c +9 −7 Original line number Diff line number Diff line Loading @@ -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; Loading
lib/nvme/nvme_internal.h +9 −9 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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) Loading
lib/nvme/nvme_ns.c +7 −4 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); } Loading
lib/nvme/nvme_pcie.c +20 −0 Original line number Diff line number Diff line Loading @@ -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, };
test/lib/nvme/unit/nvme_ctrlr_c/nvme_ctrlr_ut.c +17 −20 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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)); Loading