X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fraw%2Fifpga%2Fifpga_rawdev.c;h=76e6a8530b273ce1f1aac83c9499aaba12283df7;hb=520e3f4888c508dad32da1d8c5486a7be9b0fbba;hp=a7463de8e4adcda74bb5457059e24c7adf126a99;hpb=e00d2b4cead0fba1af517f38938db41a7f10b729;p=dpdk.git diff --git a/drivers/raw/ifpga/ifpga_rawdev.c b/drivers/raw/ifpga/ifpga_rawdev.c index a7463de8e4..76e6a8530b 100644 --- a/drivers/raw/ifpga/ifpga_rawdev.c +++ b/drivers/raw/ifpga/ifpga_rawdev.c @@ -230,8 +230,9 @@ static int ifpga_rawdev_fill_info(struct ifpga_rawdev *ifpga_dev, memset(link, 0, sizeof(link)); memset(link1, 0, sizeof(link1)); ret = readlink(path, link, (sizeof(link)-1)); - if (ret == -1) + if ((ret < 0) || ((unsigned int)ret > (sizeof(link)-1))) return -1; + link[ret] = 0; /* terminate string with null character */ strlcpy(link1, link, sizeof(link1)); memset(ifpga_dev->parent_bdf, 0, 16); point = strlen(link); @@ -525,10 +526,10 @@ ifpga_monitor_start_func(void) int ret; if (ifpga_monitor_start == 0) { - ret = pthread_create(&ifpga_monitor_start_thread, - NULL, - ifpga_rawdev_gsd_handle, NULL); - if (ret) { + ret = rte_ctrl_thread_create(&ifpga_monitor_start_thread, + "ifpga-monitor", NULL, + ifpga_rawdev_gsd_handle, NULL); + if (ret != 0) { IFPGA_RAWDEV_PMD_ERR( "Fail to create ifpga nonitor thread"); return -1; @@ -715,6 +716,16 @@ ifpga_rawdev_stop(struct rte_rawdev *dev) static int ifpga_rawdev_close(struct rte_rawdev *dev) { + struct opae_adapter *adapter; + + if (dev) { + adapter = ifpga_rawdev_get_priv(dev); + if (adapter) { + opae_adapter_destroy(adapter); + opae_adapter_data_free(adapter->data); + } + } + return dev ? 0:1; } @@ -775,7 +786,7 @@ rte_fpga_do_pr(struct rte_rawdev *rawdev, int port_id, int file_fd; int ret = 0; ssize_t buffer_size; - void *buffer; + void *buffer, *buf_to_free; u64 pr_error; if (!file_name) @@ -807,6 +818,7 @@ rte_fpga_do_pr(struct rte_rawdev *rawdev, int port_id, ret = -ENOMEM; goto close_fd; } + buf_to_free = buffer; /*read the raw data*/ if (buffer_size != read(file_fd, (void *)buffer, buffer_size)) { @@ -824,8 +836,8 @@ rte_fpga_do_pr(struct rte_rawdev *rawdev, int port_id, } free_buffer: - if (buffer) - rte_free(buffer); + if (buf_to_free) + rte_free(buf_to_free); close_fd: close(file_fd); file_fd = 0; @@ -1332,17 +1344,18 @@ int ifpga_unregister_msix_irq(enum ifpga_irq_type type, int vec_start, rte_intr_callback_fn handler, void *arg) { - struct rte_intr_handle intr_handle; + struct rte_intr_handle *intr_handle; if (type == IFPGA_FME_IRQ) - intr_handle = ifpga_irq_handle[0]; + intr_handle = &ifpga_irq_handle[0]; else if (type == IFPGA_AFU_IRQ) - intr_handle = ifpga_irq_handle[vec_start + 1]; + intr_handle = &ifpga_irq_handle[vec_start + 1]; + else + return 0; - rte_intr_efd_disable(&intr_handle); + rte_intr_efd_disable(intr_handle); - return rte_intr_callback_unregister(&intr_handle, - handler, arg); + return rte_intr_callback_unregister(intr_handle, handler, arg); } int @@ -1352,7 +1365,7 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, void *arg) { int ret; - struct rte_intr_handle intr_handle; + struct rte_intr_handle *intr_handle; struct opae_adapter *adapter; struct opae_manager *mgr; struct opae_accelerator *acc; @@ -1366,26 +1379,29 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, return -ENODEV; if (type == IFPGA_FME_IRQ) { - intr_handle = ifpga_irq_handle[0]; + intr_handle = &ifpga_irq_handle[0]; count = 1; - } else if (type == IFPGA_AFU_IRQ) - intr_handle = ifpga_irq_handle[vec_start + 1]; + } else if (type == IFPGA_AFU_IRQ) { + intr_handle = &ifpga_irq_handle[vec_start + 1]; + } else { + return -EINVAL; + } - intr_handle.type = RTE_INTR_HANDLE_VFIO_MSIX; + intr_handle->type = RTE_INTR_HANDLE_VFIO_MSIX; - ret = rte_intr_efd_enable(&intr_handle, count); + ret = rte_intr_efd_enable(intr_handle, count); if (ret) return -ENODEV; - intr_handle.fd = intr_handle.efds[0]; + intr_handle->fd = intr_handle->efds[0]; IFPGA_RAWDEV_PMD_DEBUG("register %s irq, vfio_fd=%d, fd=%d\n", - name, intr_handle.vfio_dev_fd, - intr_handle.fd); + name, intr_handle->vfio_dev_fd, + intr_handle->fd); if (type == IFPGA_FME_IRQ) { struct fpga_fme_err_irq_set err_irq_set; - err_irq_set.evtfd = intr_handle.efds[0]; + err_irq_set.evtfd = intr_handle->efds[0]; ret = opae_manager_ifpga_set_err_irq(mgr, &err_irq_set); if (ret) @@ -1395,13 +1411,14 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, if (!acc) return -EINVAL; - ret = opae_acc_set_irq(acc, vec_start, count, intr_handle.efds); + ret = opae_acc_set_irq(acc, vec_start, count, + intr_handle->efds); if (ret) return -EINVAL; } /* register interrupt handler using DPDK API */ - ret = rte_intr_callback_register(&intr_handle, + ret = rte_intr_callback_register(intr_handle, handler, (void *)arg); if (ret) return -EINVAL; @@ -1431,7 +1448,7 @@ ifpga_rawdev_create(struct rte_pci_device *pci_dev, } memset(name, 0, sizeof(name)); - snprintf(name, RTE_RAWDEV_NAME_MAX_LEN, "IFPGA:%02x:%02x.%x", + snprintf(name, RTE_RAWDEV_NAME_MAX_LEN, IFPGA_RAWDEV_NAME_FMT, pci_dev->addr.bus, pci_dev->addr.devid, pci_dev->addr.function); IFPGA_RAWDEV_PMD_INFO("Init %s on NUMA node %d", name, rte_socket_id()); @@ -1525,6 +1542,7 @@ ifpga_rawdev_destroy(struct rte_pci_device *pci_dev) char name[RTE_RAWDEV_NAME_MAX_LEN]; struct opae_adapter *adapter; struct opae_manager *mgr; + struct ifpga_rawdev *dev; if (!pci_dev) { IFPGA_RAWDEV_PMD_ERR("Invalid pci_dev of the device!"); @@ -1533,7 +1551,7 @@ ifpga_rawdev_destroy(struct rte_pci_device *pci_dev) } memset(name, 0, sizeof(name)); - snprintf(name, RTE_RAWDEV_NAME_MAX_LEN, "IFPGA:%x:%02x.%x", + snprintf(name, RTE_RAWDEV_NAME_MAX_LEN, IFPGA_RAWDEV_NAME_FMT, pci_dev->addr.bus, pci_dev->addr.devid, pci_dev->addr.function); IFPGA_RAWDEV_PMD_INFO("Closing %s on NUMA node %d", @@ -1544,6 +1562,9 @@ ifpga_rawdev_destroy(struct rte_pci_device *pci_dev) IFPGA_RAWDEV_PMD_ERR("Invalid device name (%s)", name); return -EINVAL; } + dev = ifpga_rawdev_get(rawdev); + if (dev) + dev->rawdev = NULL; adapter = ifpga_rawdev_get_priv(rawdev); if (!adapter) @@ -1554,12 +1575,9 @@ ifpga_rawdev_destroy(struct rte_pci_device *pci_dev) return -ENODEV; if (ifpga_unregister_msix_irq(IFPGA_FME_IRQ, 0, - fme_interrupt_handler, mgr)) + fme_interrupt_handler, mgr) < 0) return -EINVAL; - opae_adapter_data_free(adapter->data); - opae_adapter_free(adapter); - /* rte_rawdev_close is called by pmd_release */ ret = rte_rawdev_pmd_release(rawdev); if (ret) @@ -1593,7 +1611,7 @@ static struct rte_pci_driver rte_ifpga_rawdev_pmd = { RTE_PMD_REGISTER_PCI(ifpga_rawdev_pci_driver, rte_ifpga_rawdev_pmd); RTE_PMD_REGISTER_PCI_TABLE(ifpga_rawdev_pci_driver, rte_ifpga_rawdev_pmd); RTE_PMD_REGISTER_KMOD_DEP(ifpga_rawdev_pci_driver, "* igb_uio | uio_pci_generic | vfio-pci"); -RTE_LOG_REGISTER(ifpga_rawdev_logtype, driver.raw.init, NOTICE); +RTE_LOG_REGISTER_DEFAULT(ifpga_rawdev_logtype, NOTICE); static const char * const valid_args[] = { #define IFPGA_ARG_NAME "ifpga" @@ -1719,3 +1737,33 @@ RTE_PMD_REGISTER_PARAM_STRING(ifpga_rawdev_cfg, "ifpga= " "port= " "afu_bts="); + +struct rte_pci_bus *ifpga_get_pci_bus(void) +{ + return rte_ifpga_rawdev_pmd.bus; +} + +int ifpga_rawdev_partial_reconfigure(struct rte_rawdev *dev, int port, + const char *file) +{ + if (!dev) { + IFPGA_RAWDEV_PMD_ERR("Input parameter is invalid"); + return -EINVAL; + } + + return rte_fpga_do_pr(dev, port, file); +} + +void ifpga_rawdev_cleanup(void) +{ + struct ifpga_rawdev *dev; + unsigned int i; + + for (i = 0; i < IFPGA_RAWDEV_NUM; i++) { + dev = &ifpga_rawdevices[i]; + if (dev->rawdev) { + rte_rawdev_pmd_release(dev->rawdev); + dev->rawdev = NULL; + } + } +}