X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fraw%2Fioat%2Fioat_rawdev.c;h=4ea913fff1c5e3d39c6d97a6c70ac7f70ea4c2d7;hb=8636b9a18e19a48fc7c133900b476ac581f02aaa;hp=86b5b2a7787ce30c9e21a43afef604da59fa9436;hpb=abff4333ec20b3fd6cd998523382956881bac842;p=dpdk.git diff --git a/drivers/raw/ioat/ioat_rawdev.c b/drivers/raw/ioat/ioat_rawdev.c index 86b5b2a778..4ea913fff1 100644 --- a/drivers/raw/ioat/ioat_rawdev.c +++ b/drivers/raw/ioat/ioat_rawdev.c @@ -4,12 +4,13 @@ #include #include +#include +#include #include #include "rte_ioat_rawdev.h" - -/* Dynamic log type identifier */ -int ioat_pmd_logtype; +#include "ioat_spec.h" +#include "ioat_private.h" static struct rte_pci_driver ioat_pmd_drv; @@ -25,19 +26,181 @@ static struct rte_pci_driver ioat_pmd_drv; #define IOAT_DEVICE_ID_BDX7 0x6f27 #define IOAT_DEVICE_ID_BDXE 0x6f2E #define IOAT_DEVICE_ID_BDXF 0x6f2F +#define IOAT_DEVICE_ID_ICX 0x0b00 + +RTE_LOG_REGISTER(ioat_pmd_logtype, rawdev.ioat, INFO); + +#define DESC_SZ sizeof(struct rte_ioat_generic_hw_desc) +#define COMPLETION_SZ sizeof(__m128i) + +static int +ioat_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config, + size_t config_size) +{ + struct rte_ioat_rawdev_config *params = config; + struct rte_ioat_rawdev *ioat = dev->dev_private; + char mz_name[RTE_MEMZONE_NAMESIZE]; + unsigned short i; + + if (dev->started) + return -EBUSY; + + if (params == NULL || config_size != sizeof(*params)) + return -EINVAL; + + if (params->ring_size > 4096 || params->ring_size < 64 || + !rte_is_power_of_2(params->ring_size)) + return -EINVAL; + + ioat->ring_size = params->ring_size; + ioat->hdls_disable = params->hdls_disable; + if (ioat->desc_ring != NULL) { + rte_memzone_free(ioat->desc_mz); + ioat->desc_ring = NULL; + ioat->desc_mz = NULL; + } + + /* allocate one block of memory for both descriptors + * and completion handles. + */ + snprintf(mz_name, sizeof(mz_name), "rawdev%u_desc_ring", dev->dev_id); + ioat->desc_mz = rte_memzone_reserve(mz_name, + (DESC_SZ + COMPLETION_SZ) * ioat->ring_size, + dev->device->numa_node, RTE_MEMZONE_IOVA_CONTIG); + if (ioat->desc_mz == NULL) + return -ENOMEM; + ioat->desc_ring = ioat->desc_mz->addr; + ioat->hdls = (void *)&ioat->desc_ring[ioat->ring_size]; + + ioat->ring_addr = ioat->desc_mz->iova; + + /* configure descriptor ring - each one points to next */ + for (i = 0; i < ioat->ring_size; i++) { + ioat->desc_ring[i].next = ioat->ring_addr + + (((i + 1) % ioat->ring_size) * DESC_SZ); + } + + return 0; +} + +static int +ioat_dev_start(struct rte_rawdev *dev) +{ + struct rte_ioat_rawdev *ioat = dev->dev_private; + + if (ioat->ring_size == 0 || ioat->desc_ring == NULL) + return -EBUSY; + + /* inform hardware of where the descriptor ring is */ + ioat->regs->chainaddr = ioat->ring_addr; + /* inform hardware of where to write the status/completions */ + ioat->regs->chancmp = ioat->status_addr; + + /* prime the status register to be set to the last element */ + ioat->status = ioat->ring_addr + ((ioat->ring_size - 1) * DESC_SZ); + return 0; +} + +static void +ioat_dev_stop(struct rte_rawdev *dev) +{ + RTE_SET_USED(dev); +} + +static int +ioat_dev_info_get(struct rte_rawdev *dev, rte_rawdev_obj_t dev_info, + size_t dev_info_size) +{ + struct rte_ioat_rawdev_config *cfg = dev_info; + struct rte_ioat_rawdev *ioat = dev->dev_private; + + if (dev_info == NULL || dev_info_size != sizeof(*cfg)) + return -EINVAL; + + cfg->ring_size = ioat->ring_size; + cfg->hdls_disable = ioat->hdls_disable; + return 0; +} + +static const char * const xstat_names[] = { + "failed_enqueues", "successful_enqueues", + "copies_started", "copies_completed" +}; + +static int +ioat_xstats_get(const struct rte_rawdev *dev, const unsigned int ids[], + uint64_t values[], unsigned int n) +{ + const struct rte_ioat_rawdev *ioat = dev->dev_private; + const uint64_t *stats = (const void *)&ioat->xstats; + unsigned int i; + + for (i = 0; i < n; i++) { + if (ids[i] < sizeof(ioat->xstats)/sizeof(*stats)) + values[i] = stats[ids[i]]; + else + values[i] = 0; + } + return n; +} + +static int +ioat_xstats_get_names(const struct rte_rawdev *dev, + struct rte_rawdev_xstats_name *names, + unsigned int size) +{ + unsigned int i; + + RTE_SET_USED(dev); + if (size < RTE_DIM(xstat_names)) + return RTE_DIM(xstat_names); + + for (i = 0; i < RTE_DIM(xstat_names); i++) + strlcpy(names[i].name, xstat_names[i], sizeof(names[i])); + + return RTE_DIM(xstat_names); +} -#define IOAT_PMD_LOG(level, fmt, args...) rte_log(RTE_LOG_ ## level, \ - ioat_pmd_logtype, "%s(): " fmt "\n", __func__, ##args) +static int +ioat_xstats_reset(struct rte_rawdev *dev, const uint32_t *ids, uint32_t nb_ids) +{ + struct rte_ioat_rawdev *ioat = dev->dev_private; + uint64_t *stats = (void *)&ioat->xstats; + unsigned int i; + + if (!ids) { + memset(&ioat->xstats, 0, sizeof(ioat->xstats)); + return 0; + } -#define IOAT_PMD_DEBUG(fmt, args...) IOAT_PMD_LOG(DEBUG, fmt, ## args) -#define IOAT_PMD_INFO(fmt, args...) IOAT_PMD_LOG(INFO, fmt, ## args) -#define IOAT_PMD_ERR(fmt, args...) IOAT_PMD_LOG(ERR, fmt, ## args) -#define IOAT_PMD_WARN(fmt, args...) IOAT_PMD_LOG(WARNING, fmt, ## args) + for (i = 0; i < nb_ids; i++) + if (ids[i] < sizeof(ioat->xstats)/sizeof(*stats)) + stats[ids[i]] = 0; + + return 0; +} + +static int +ioat_dev_close(struct rte_rawdev *dev __rte_unused) +{ + return 0; +} + +extern int ioat_rawdev_test(uint16_t dev_id); static int ioat_rawdev_create(const char *name, struct rte_pci_device *dev) { static const struct rte_rawdev_ops ioat_rawdev_ops = { + .dev_configure = ioat_dev_configure, + .dev_start = ioat_dev_start, + .dev_stop = ioat_dev_stop, + .dev_close = ioat_dev_close, + .dev_info_get = ioat_dev_info_get, + .xstats_get = ioat_xstats_get, + .xstats_get_names = ioat_xstats_get_names, + .xstats_reset = ioat_xstats_reset, + .dev_selftest = ioat_rawdev_test, }; struct rte_rawdev *rawdev = NULL; @@ -77,9 +240,11 @@ ioat_rawdev_create(const char *name, struct rte_pci_device *dev) rawdev->driver_name = dev->device.driver->name; ioat = rawdev->dev_private; + ioat->type = RTE_IOAT_DEV; ioat->rawdev = rawdev; ioat->mz = mz; ioat->regs = dev->mem_resource[0].addr; + ioat->doorbell = &ioat->regs->dmacount; ioat->ring_size = 0; ioat->desc_ring = NULL; ioat->status_addr = ioat->mz->iova + @@ -143,6 +308,7 @@ ioat_rawdev_destroy(const char *name) if (rdev->dev_private != NULL) { struct rte_ioat_rawdev *ioat = rdev->dev_private; rdev->dev_private = NULL; + rte_memzone_free(ioat->desc_mz); rte_memzone_free(ioat->mz); } @@ -196,13 +362,13 @@ static const struct rte_pci_id pci_id_ioat_map[] = { { RTE_PCI_DEVICE(IOAT_VENDOR_ID, IOAT_DEVICE_ID_BDX7) }, { RTE_PCI_DEVICE(IOAT_VENDOR_ID, IOAT_DEVICE_ID_BDXE) }, { RTE_PCI_DEVICE(IOAT_VENDOR_ID, IOAT_DEVICE_ID_BDXF) }, + { RTE_PCI_DEVICE(IOAT_VENDOR_ID, IOAT_DEVICE_ID_ICX) }, { .vendor_id = 0, /* sentinel */ }, }; static struct rte_pci_driver ioat_pmd_drv = { .id_table = pci_id_ioat_map, - .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC | - RTE_PCI_DRV_IOVA_AS_VA, + .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC, .probe = ioat_rawdev_probe, .remove = ioat_rawdev_remove, }; @@ -210,10 +376,3 @@ static struct rte_pci_driver ioat_pmd_drv = { RTE_PMD_REGISTER_PCI(IOAT_PMD_RAWDEV_NAME, ioat_pmd_drv); RTE_PMD_REGISTER_PCI_TABLE(IOAT_PMD_RAWDEV_NAME, pci_id_ioat_map); RTE_PMD_REGISTER_KMOD_DEP(IOAT_PMD_RAWDEV_NAME, "* igb_uio | uio_pci_generic"); - -RTE_INIT(ioat_pmd_init_log) -{ - ioat_pmd_logtype = rte_log_register(IOAT_PMD_LOG_NAME); - if (ioat_pmd_logtype >= 0) - rte_log_set_level(ioat_pmd_logtype, RTE_LOG_INFO); -}