nvme: add PCI ID accessor to transport

Change-Id: I1776c21d7479f3ef69fe254b8dc4b6d64bbe48bc
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Daniel Verkamp 2016-10-12 16:18:13 -07:00
parent d7b7dbfb78
commit a00852c1fc
5 changed files with 64 additions and 42 deletions

View File

@ -208,17 +208,19 @@ static void
nvme_ctrlr_construct_intel_support_log_page_list(struct spdk_nvme_ctrlr *ctrlr, 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_nvme_intel_log_page_directory *log_page_directory)
{ {
struct spdk_pci_device *dev;
struct pci_id pci_id; struct pci_id pci_id;
if (ctrlr->cdata.vid != SPDK_PCI_VID_INTEL || log_page_directory == NULL) if (log_page_directory == NULL) {
return; return;
}
dev = ctrlr->devhandle; if (ctrlr->transport->ctrlr_get_pci_id(ctrlr, &pci_id)) {
pci_id.vendor_id = spdk_pci_device_get_vendor_id(dev); return;
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 (pci_id.vendor_id != SPDK_PCI_VID_INTEL) {
return;
}
ctrlr->log_page_supported[SPDK_NVME_INTEL_LOG_PAGE_DIRECTORY] = true; ctrlr->log_page_supported[SPDK_NVME_INTEL_LOG_PAGE_DIRECTORY] = true;

View File

@ -241,8 +241,15 @@ struct nvme_request {
void *user_buffer; 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 { 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 { struct nvme_completion_poll_status {
@ -479,20 +486,13 @@ struct nvme_driver {
struct spdk_mempool *request_mempool; 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 struct nvme_driver *g_spdk_nvme_driver;
extern const struct spdk_nvme_transport spdk_nvme_transport_pcie; extern const struct spdk_nvme_transport spdk_nvme_transport_pcie;
#define nvme_min(a,b) (((a)<(b))?(a):(b)) #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) \ #define nvme_mmio_read_4(sc, reg) \
spdk_mmio_read_4(&(sc)->regs->reg) spdk_mmio_read_4(&(sc)->regs->reg)

View File

@ -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, int nvme_ns_construct(struct spdk_nvme_ns *ns, uint16_t id,
struct spdk_nvme_ctrlr *ctrlr) struct spdk_nvme_ctrlr *ctrlr)
{ {
uint32_t pci_devid; struct pci_id pci_id;
assert(id > 0); assert(id > 0);
@ -191,9 +191,12 @@ int nvme_ns_construct(struct spdk_nvme_ns *ns, uint16_t id,
ns->id = id; ns->id = id;
ns->stripe_size = 0; ns->stripe_size = 0;
spdk_pci_device_cfg_read32(ctrlr->devhandle, &pci_devid, 0); if (ctrlr->transport->ctrlr_get_pci_id(ctrlr, &pci_id) == 0) {
if (pci_devid == INTEL_DC_P3X00_DEVID && ctrlr->cdata.vs[3] != 0) { if (pci_id.vendor_id == SPDK_PCI_VID_INTEL &&
ns->stripe_size = (1 << ctrlr->cdata.vs[3]) * ctrlr->min_page_size; 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); return nvme_ns_identify_update(ns);

View File

@ -37,5 +37,25 @@
#include "nvme_internal.h" #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 = { const struct spdk_nvme_transport spdk_nvme_transport_pcie = {
.ctrlr_get_pci_id = nvme_pcie_ctrlr_get_pci_id,
}; };

View File

@ -92,29 +92,24 @@ spdk_pci_device_cfg_write32(struct spdk_pci_device *dev, uint32_t value,
return 0; return 0;
} }
uint16_t static int
spdk_pci_device_get_vendor_id(struct spdk_pci_device *dev) 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 static const struct spdk_nvme_transport nvme_ctrlr_ut_transport = {
spdk_pci_device_get_device_id(struct spdk_pci_device *dev) .ctrlr_get_pci_id = ut_ctrlr_get_pci_id,
{ };
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;
}
uint16_t uint16_t
spdk_pci_device_get_domain(struct spdk_pci_device *dev) 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_ctrlr ctrlr = {};
struct spdk_nvme_intel_log_page_directory payload = {}; struct spdk_nvme_intel_log_page_directory payload = {};
ctrlr.transport = &nvme_ctrlr_ut_transport;
/* set a invalid vendor id */ /* set a invalid vendor id */
ctrlr.cdata.vid = 0xFFFF; g_pci_vendor_id = 0xFFFF;
nvme_ctrlr_construct_intel_support_log_page_list(&ctrlr, &payload); nvme_ctrlr_construct_intel_support_log_page_list(&ctrlr, &payload);
res = spdk_nvme_ctrlr_is_log_page_supported(&ctrlr, SPDK_NVME_INTEL_LOG_TEMPERATURE); res = spdk_nvme_ctrlr_is_log_page_supported(&ctrlr, SPDK_NVME_INTEL_LOG_TEMPERATURE);
CU_ASSERT(res == false); CU_ASSERT(res == false);
/* set valid vendor id and log page directory*/ /* 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; payload.temperature_statistics_log_len = 1;
memset(ctrlr.log_page_supported, 0, sizeof(ctrlr.log_page_supported)); memset(ctrlr.log_page_supported, 0, sizeof(ctrlr.log_page_supported));