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,
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;

View File

@ -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)

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,
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);

View File

@ -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,
};

View File

@ -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));