From 45528bfef64409bf4a22a0df070bf14c5b0a1ca0 Mon Sep 17 00:00:00 2001 From: Darek Stojaczyk Date: Thu, 2 Jul 2020 23:17:30 +0200 Subject: [PATCH] env: add spdk_pci_id->class_id This follows struct rte_pci_id which had class_id as well. We'll need it to make some additional DPDK APIs public through the env abstraction. Change-Id: I794a6cd6b17e48daf53b48fa5abe3d3dcfeaa403 Signed-off-by: Darek Stojaczyk Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3182 Reviewed-by: Jacek Kalwas Reviewed-by: Jim Harris Reviewed-by: Ben Walker Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins --- include/spdk/env.h | 9 +++--- include/spdk/pci_ids.h | 1 + lib/env_dpdk/pci.c | 1 + lib/nvme/nvme_quirks.c | 29 ++++++++++--------- .../lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c | 1 + .../lib/nvme/nvme_quirks.c/nvme_quirks_ut.c | 1 + 6 files changed, 24 insertions(+), 18 deletions(-) diff --git a/include/spdk/env.h b/include/spdk/env.h index b92a4cef6..c02232275 100644 --- a/include/spdk/env.h +++ b/include/spdk/env.h @@ -645,10 +645,11 @@ struct spdk_pci_addr { }; struct spdk_pci_id { - uint16_t vendor_id; - uint16_t device_id; - uint16_t subvendor_id; - uint16_t subdevice_id; + uint32_t class_id; /**< Class ID or SPDK_PCI_CLASS_ANY_ID. */ + uint16_t vendor_id; /**< Vendor ID or SPDK_PCI_ANY_ID. */ + uint16_t device_id; /**< Device ID or SPDK_PCI_ANY_ID. */ + uint16_t subvendor_id; /**< Subsystem vendor ID or SPDK_PCI_ANY_ID. */ + uint16_t subdevice_id; /**< Subsystem device ID or SPDK_PCI_ANY_ID. */ }; struct spdk_pci_device { diff --git a/include/spdk/pci_ids.h b/include/spdk/pci_ids.h index 8896e0905..816eb0a84 100644 --- a/include/spdk/pci_ids.h +++ b/include/spdk/pci_ids.h @@ -53,6 +53,7 @@ extern "C" { #define SPDK_PCI_VID_CNEXLABS 0x1d1d #define SPDK_PCI_VID_VMWARE 0x15ad +#define SPDK_PCI_CLASS_ANY_ID 0xffffff /** * PCI class code for NVMe devices. * diff --git a/lib/env_dpdk/pci.c b/lib/env_dpdk/pci.c index a6078822e..4b43ccc18 100644 --- a/lib/env_dpdk/pci.c +++ b/lib/env_dpdk/pci.c @@ -313,6 +313,7 @@ pci_device_init(struct rte_pci_driver *_drv, dev->addr.bus = _dev->addr.bus; dev->addr.dev = _dev->addr.devid; dev->addr.func = _dev->addr.function; + dev->id.class_id = _dev->id.class_id; dev->id.vendor_id = _dev->id.vendor_id; dev->id.device_id = _dev->id.device_id; dev->id.subvendor_id = _dev->id.subsystem_vendor_id; diff --git a/lib/nvme/nvme_quirks.c b/lib/nvme/nvme_quirks.c index 58347905c..38c8f0eae 100644 --- a/lib/nvme/nvme_quirks.c +++ b/lib/nvme/nvme_quirks.c @@ -39,7 +39,7 @@ struct nvme_quirk { }; static const struct nvme_quirk nvme_quirks[] = { - { {SPDK_PCI_VID_INTEL, 0x0953, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, + { {SPDK_PCI_CLASS_NVME, SPDK_PCI_VID_INTEL, 0x0953, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_INTEL_QUIRK_READ_LATENCY | NVME_INTEL_QUIRK_WRITE_LATENCY | NVME_INTEL_QUIRK_STRIPING | @@ -47,7 +47,7 @@ static const struct nvme_quirk nvme_quirks[] = { NVME_QUIRK_DELAY_BEFORE_INIT | NVME_QUIRK_MINIMUM_IO_QUEUE_SIZE }, - { {SPDK_PCI_VID_INTEL, 0x0A53, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, + { {SPDK_PCI_CLASS_NVME, SPDK_PCI_VID_INTEL, 0x0A53, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_INTEL_QUIRK_READ_LATENCY | NVME_INTEL_QUIRK_WRITE_LATENCY | NVME_INTEL_QUIRK_STRIPING | @@ -55,55 +55,56 @@ static const struct nvme_quirk nvme_quirks[] = { NVME_QUIRK_DELAY_BEFORE_INIT | NVME_QUIRK_MINIMUM_IO_QUEUE_SIZE }, - { {SPDK_PCI_VID_INTEL, 0x0A54, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, + { {SPDK_PCI_CLASS_NVME, SPDK_PCI_VID_INTEL, 0x0A54, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_INTEL_QUIRK_READ_LATENCY | NVME_INTEL_QUIRK_WRITE_LATENCY | NVME_INTEL_QUIRK_STRIPING | NVME_QUIRK_READ_ZERO_AFTER_DEALLOCATE | NVME_QUIRK_MINIMUM_IO_QUEUE_SIZE }, - { {SPDK_PCI_VID_INTEL, 0x0A55, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, + { {SPDK_PCI_CLASS_NVME, SPDK_PCI_VID_INTEL, 0x0A55, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_INTEL_QUIRK_READ_LATENCY | NVME_INTEL_QUIRK_WRITE_LATENCY | NVME_INTEL_QUIRK_STRIPING | NVME_QUIRK_READ_ZERO_AFTER_DEALLOCATE | NVME_QUIRK_MINIMUM_IO_QUEUE_SIZE }, - { {SPDK_PCI_VID_MEMBLAZE, 0x0540, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, + { {SPDK_PCI_CLASS_NVME, SPDK_PCI_VID_MEMBLAZE, 0x0540, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_QUIRK_DELAY_BEFORE_CHK_RDY }, - { {SPDK_PCI_VID_SAMSUNG, 0xa821, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, + { {SPDK_PCI_CLASS_NVME, SPDK_PCI_VID_SAMSUNG, 0xa821, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_QUIRK_DELAY_BEFORE_CHK_RDY }, - { {SPDK_PCI_VID_SAMSUNG, 0xa822, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, + { {SPDK_PCI_CLASS_NVME, SPDK_PCI_VID_SAMSUNG, 0xa822, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_QUIRK_DELAY_BEFORE_CHK_RDY }, - { {SPDK_PCI_VID_VIRTUALBOX, 0x4e56, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, + { {SPDK_PCI_CLASS_NVME, SPDK_PCI_VID_VIRTUALBOX, 0x4e56, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_QUIRK_DELAY_AFTER_QUEUE_ALLOC }, - { {SPDK_PCI_VID_INTEL, 0x5845, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, + { {SPDK_PCI_CLASS_NVME, SPDK_PCI_VID_INTEL, 0x5845, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_QUIRK_IDENTIFY_CNS | NVME_INTEL_QUIRK_NO_LOG_PAGES | NVME_QUIRK_MAXIMUM_PCI_ACCESS_WIDTH }, - { {SPDK_PCI_VID_CNEXLABS, 0x1f1f, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, + { {SPDK_PCI_CLASS_NVME, SPDK_PCI_VID_CNEXLABS, 0x1f1f, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_QUIRK_IDENTIFY_CNS | NVME_QUIRK_OCSSD }, - { {SPDK_PCI_VID_VMWARE, 0x07f0, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, + { {SPDK_PCI_CLASS_NVME, SPDK_PCI_VID_VMWARE, 0x07f0, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_QUIRK_SHST_COMPLETE }, - { {SPDK_PCI_VID_INTEL, 0x2700, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, + { {SPDK_PCI_CLASS_NVME, SPDK_PCI_VID_INTEL, 0x2700, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_QUIRK_OACS_SECURITY }, - { {0x0000, 0x0000, 0x0000, 0x0000}, 0} + { {0x000000, 0x0000, 0x0000, 0x0000, 0x0000}, 0} }; /* Compare each field. SPDK_PCI_ANY_ID in s1 matches everything */ static bool pci_id_match(const struct spdk_pci_id *s1, const struct spdk_pci_id *s2) { - if ((s1->vendor_id == SPDK_PCI_ANY_ID || s1->vendor_id == s2->vendor_id) && + if ((s1->class_id == SPDK_PCI_CLASS_ANY_ID || s1->class_id == s2->class_id) && + (s1->vendor_id == SPDK_PCI_ANY_ID || s1->vendor_id == s2->vendor_id) && (s1->device_id == SPDK_PCI_ANY_ID || s1->device_id == s2->device_id) && (s1->subvendor_id == SPDK_PCI_ANY_ID || s1->subvendor_id == s2->subvendor_id) && (s1->subdevice_id == SPDK_PCI_ANY_ID || s1->subdevice_id == s2->subdevice_id)) { diff --git a/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c b/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c index 5e20fae45..f5b374639 100644 --- a/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c +++ b/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c @@ -1516,6 +1516,7 @@ test_nvme_ctrlr_construct_intel_support_log_page_list(void) CU_ASSERT(res == false); /* Set the vendor to Intel, but provide no device id */ + pci_id.class_id = SPDK_PCI_CLASS_NVME; ctrlr.cdata.vid = pci_id.vendor_id = SPDK_PCI_VID_INTEL; payload.temperature_statistics_log_len = 1; ctrlr.quirks = nvme_get_quirks(&pci_id); diff --git a/test/unit/lib/nvme/nvme_quirks.c/nvme_quirks_ut.c b/test/unit/lib/nvme/nvme_quirks.c/nvme_quirks_ut.c index 1054d6c26..c3e799251 100644 --- a/test/unit/lib/nvme/nvme_quirks.c/nvme_quirks_ut.c +++ b/test/unit/lib/nvme/nvme_quirks.c/nvme_quirks_ut.c @@ -48,6 +48,7 @@ test_nvme_quirks_striping(void) CU_ASSERT((quirks & NVME_INTEL_QUIRK_STRIPING) == 0); /* Set the vendor id to Intel, but no device id. No striping. */ + pci_id.class_id = SPDK_PCI_CLASS_NVME; pci_id.vendor_id = SPDK_PCI_VID_INTEL; quirks = nvme_get_quirks(&pci_id); CU_ASSERT((quirks & NVME_INTEL_QUIRK_STRIPING) == 0);