X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fraw%2Fifpga%2Fifpga_rawdev.c;h=a7463de8e4adcda74bb5457059e24c7adf126a99;hb=491757372f98acbc6aa346730a55ed4cd2bfd676;hp=63696a78d7f58a482e718f5785e237aff04593cb;hpb=9c006c45d0c570f0e4190f67a5aed995ffcc0b0d;p=dpdk.git diff --git a/drivers/raw/ifpga/ifpga_rawdev.c b/drivers/raw/ifpga/ifpga_rawdev.c index 63696a78d7..a7463de8e4 100644 --- a/drivers/raw/ifpga/ifpga_rawdev.c +++ b/drivers/raw/ifpga/ifpga_rawdev.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "base/opae_hw_api.h" #include "base/opae_ifpga_hw_api.h" @@ -40,14 +41,6 @@ #include "ifpga_rawdev.h" #include "ipn3ke_rawdev_api.h" -#define RTE_PCI_EXT_CAP_ID_ERR 0x01 /* Advanced Error Reporting */ -#define RTE_PCI_CFG_SPACE_SIZE 256 -#define RTE_PCI_CFG_SPACE_EXP_SIZE 4096 -#define RTE_PCI_EXT_CAP_ID(header) (int)(header & 0x0000ffff) -#define RTE_PCI_EXT_CAP_NEXT(header) ((header >> 20) & 0xffc) - -int ifpga_rawdev_logtype; - #define PCI_VENDOR_ID_INTEL 0x8086 /* PCI Device ID */ #define PCIE_DEVICE_ID_PF_INT_5_X 0xBCBD @@ -78,13 +71,17 @@ static struct ifpga_rawdev ifpga_rawdevices[IFPGA_RAWDEV_NUM]; static int ifpga_monitor_start; static pthread_t ifpga_monitor_start_thread; +#define IFPGA_MAX_IRQ 12 +/* 0 for FME interrupt, others are reserved for AFU irq */ +static struct rte_intr_handle ifpga_irq_handle[IFPGA_MAX_IRQ]; + static struct ifpga_rawdev * ifpga_rawdev_allocate(struct rte_rawdev *rawdev); static int set_surprise_link_check_aer( struct ifpga_rawdev *ifpga_rdev, int force_disable); static int ifpga_pci_find_next_ext_capability(unsigned int fd, - int start, int cap); -static int ifpga_pci_find_ext_capability(unsigned int fd, int cap); + int start, uint32_t cap); +static int ifpga_pci_find_ext_capability(unsigned int fd, uint32_t cap); struct ifpga_rawdev * ifpga_rawdev_get(const struct rte_rawdev *rawdev) @@ -141,8 +138,8 @@ ifpga_rawdev_allocate(struct rte_rawdev *rawdev) return dev; } -static int ifpga_pci_find_next_ext_capability(unsigned int fd, -int start, int cap) +static int +ifpga_pci_find_next_ext_capability(unsigned int fd, int start, uint32_t cap) { uint32_t header; int ttl; @@ -180,7 +177,8 @@ int start, int cap) return 0; } -static int ifpga_pci_find_ext_capability(unsigned int fd, int cap) +static int +ifpga_pci_find_ext_capability(unsigned int fd, uint32_t cap) { return ifpga_pci_find_next_ext_capability(fd, 0, cap); } @@ -360,7 +358,7 @@ ifpga_monitor_sensor(struct rte_rawdev *raw_dev, if (!mgr) return -ENODEV; - opae_mgr_for_each_sensor(sensor) { + opae_mgr_for_each_sensor(mgr, sensor) { if (!(sensor->flags & OPAE_SENSOR_VALID)) goto fail; @@ -369,8 +367,8 @@ ifpga_monitor_sensor(struct rte_rawdev *raw_dev, goto fail; if (value == 0xdeadbeef) { - IFPGA_RAWDEV_PMD_ERR("sensor %s is invalid value %x\n", - sensor->name, value); + IFPGA_RAWDEV_PMD_ERR("dev_id %d sensor %s value %x\n", + raw_dev->dev_id, sensor->name, value); continue; } @@ -393,8 +391,9 @@ ifpga_monitor_sensor(struct rte_rawdev *raw_dev, /* monitor 12V AUX sensor */ if (!strcmp(sensor->name, "12V AUX Voltage")) { if (value < AUX_VOLTAGE_WARN) { - IFPGA_RAWDEV_PMD_INFO("%s reach theshold %d\n", - sensor->name, value); + IFPGA_RAWDEV_PMD_INFO( + "%s reach theshold %d mV\n", + sensor->name, value); *gsd_start = true; break; } @@ -599,9 +598,10 @@ ifpga_fill_afu_dev(struct opae_accelerator *acc, return 0; } -static void +static int ifpga_rawdev_info_get(struct rte_rawdev *dev, - rte_rawdev_obj_t dev_info) + rte_rawdev_obj_t dev_info, + size_t dev_info_size) { struct opae_adapter *adapter; struct opae_accelerator *acc; @@ -613,14 +613,14 @@ ifpga_rawdev_info_get(struct rte_rawdev *dev, IFPGA_RAWDEV_PMD_FUNC_TRACE(); - if (!dev_info) { + if (!dev_info || dev_info_size != sizeof(*afu_dev)) { IFPGA_RAWDEV_PMD_ERR("Invalid request"); - return; + return -EINVAL; } adapter = ifpga_rawdev_get_priv(dev); if (!adapter) - return; + return -ENOENT; afu_dev = dev_info; afu_dev->rawdev = dev; @@ -632,7 +632,7 @@ ifpga_rawdev_info_get(struct rte_rawdev *dev, if (ifpga_fill_afu_dev(acc, afu_dev)) { IFPGA_RAWDEV_PMD_ERR("cannot get info\n"); - return; + return -ENOENT; } } @@ -642,21 +642,21 @@ ifpga_rawdev_info_get(struct rte_rawdev *dev, /* get LineSide BAR Index */ if (opae_manager_get_eth_group_region_info(mgr, 0, &opae_lside_eth_info)) { - return; + return -ENOENT; } lside_bar_idx = opae_lside_eth_info.mem_idx; /* get NICSide BAR Index */ if (opae_manager_get_eth_group_region_info(mgr, 1, &opae_nside_eth_info)) { - return; + return -ENOENT; } nside_bar_idx = opae_nside_eth_info.mem_idx; if (lside_bar_idx >= PCI_MAX_RESOURCE || nside_bar_idx >= PCI_MAX_RESOURCE || lside_bar_idx == nside_bar_idx) - return; + return -ENOENT; /* fill LineSide BAR Index */ afu_dev->mem_resource[lside_bar_idx].phys_addr = @@ -674,11 +674,13 @@ ifpga_rawdev_info_get(struct rte_rawdev *dev, afu_dev->mem_resource[nside_bar_idx].addr = opae_nside_eth_info.addr; } + return 0; } static int ifpga_rawdev_configure(const struct rte_rawdev *dev, - rte_rawdev_obj_t config) + rte_rawdev_obj_t config, + size_t config_size __rte_unused) { IFPGA_RAWDEV_PMD_FUNC_TRACE(); @@ -835,6 +837,8 @@ ifpga_rawdev_pr(struct rte_rawdev *dev, rte_rawdev_obj_t pr_conf) { struct opae_adapter *adapter; + struct opae_manager *mgr; + struct opae_board_info *info; struct rte_afu_pr_conf *afu_pr_conf; int ret; struct uuid uuid; @@ -861,22 +865,40 @@ ifpga_rawdev_pr(struct rte_rawdev *dev, } } - acc = opae_adapter_get_acc(adapter, afu_pr_conf->afu_id.port); - if (!acc) - return -ENODEV; + mgr = opae_adapter_get_mgr(adapter); + if (!mgr) { + IFPGA_RAWDEV_PMD_ERR("opae_manager of opae_adapter is NULL"); + return -1; + } - ret = opae_acc_get_uuid(acc, &uuid); - if (ret) - return ret; + if (ifpga_mgr_ops.get_board_info(mgr, &info)) { + IFPGA_RAWDEV_PMD_ERR("ifpga manager get_board_info fail!"); + return -1; + } + + if (info->lightweight) { + /* set uuid to all 0, when fpga is lightweight image */ + memset(&afu_pr_conf->afu_id.uuid.uuid_low, 0, sizeof(u64)); + memset(&afu_pr_conf->afu_id.uuid.uuid_high, 0, sizeof(u64)); + } else { + acc = opae_adapter_get_acc(adapter, afu_pr_conf->afu_id.port); + if (!acc) + return -ENODEV; - rte_memcpy(&afu_pr_conf->afu_id.uuid.uuid_low, uuid.b, sizeof(u64)); - rte_memcpy(&afu_pr_conf->afu_id.uuid.uuid_high, - uuid.b + 8, sizeof(u64)); + ret = opae_acc_get_uuid(acc, &uuid); + if (ret) + return ret; - IFPGA_RAWDEV_PMD_INFO("%s: uuid_l=0x%lx, uuid_h=0x%lx\n", __func__, - (unsigned long)afu_pr_conf->afu_id.uuid.uuid_low, - (unsigned long)afu_pr_conf->afu_id.uuid.uuid_high); + rte_memcpy(&afu_pr_conf->afu_id.uuid.uuid_low, uuid.b, + sizeof(u64)); + rte_memcpy(&afu_pr_conf->afu_id.uuid.uuid_high, uuid.b + 8, + sizeof(u64)); + IFPGA_RAWDEV_PMD_INFO("%s: uuid_l=0x%lx, uuid_h=0x%lx\n", + __func__, + (unsigned long)afu_pr_conf->afu_id.uuid.uuid_low, + (unsigned long)afu_pr_conf->afu_id.uuid.uuid_high); + } return 0; } @@ -1174,6 +1196,25 @@ static int fme_clear_warning_intr(struct opae_manager *mgr) return 0; } +static int fme_clean_fme_error(struct opae_manager *mgr) +{ + u64 val; + + if (ifpga_get_fme_error_prop(mgr, FME_ERR_PROP_ERRORS, &val)) + return -EINVAL; + + IFPGA_RAWDEV_PMD_DEBUG("before clean 0x%" PRIx64 "\n", val); + + ifpga_set_fme_error_prop(mgr, FME_ERR_PROP_CLEAR, val); + + if (ifpga_get_fme_error_prop(mgr, FME_ERR_PROP_ERRORS, &val)) + return -EINVAL; + + IFPGA_RAWDEV_PMD_DEBUG("after clean 0x%" PRIx64 "\n", val); + + return 0; +} + static int fme_err_handle_error0(struct opae_manager *mgr) { @@ -1183,6 +1224,9 @@ fme_err_handle_error0(struct opae_manager *mgr) if (ifpga_get_fme_error_prop(mgr, FME_ERR_PROP_ERRORS, &val)) return -EINVAL; + if (fme_clean_fme_error(mgr)) + return -EINVAL; + fme_error0.csr = val; if (fme_error0.fabric_err) @@ -1284,52 +1328,89 @@ fme_interrupt_handler(void *param) fme_err_handle_catfatal_error(mgr); } -static struct rte_intr_handle fme_intr_handle; +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; + + if (type == IFPGA_FME_IRQ) + intr_handle = ifpga_irq_handle[0]; + else if (type == IFPGA_AFU_IRQ) + intr_handle = ifpga_irq_handle[vec_start + 1]; + + rte_intr_efd_disable(&intr_handle); + + return rte_intr_callback_unregister(&intr_handle, + handler, arg); +} -static int ifpga_register_fme_interrupt(struct opae_manager *mgr) +int +ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, + enum ifpga_irq_type type, int vec_start, int count, + rte_intr_callback_fn handler, const char *name, + void *arg) { int ret; - struct fpga_fme_err_irq_set err_irq_set; + struct rte_intr_handle intr_handle; + struct opae_adapter *adapter; + struct opae_manager *mgr; + struct opae_accelerator *acc; - fme_intr_handle.type = RTE_INTR_HANDLE_VFIO_MSIX; + adapter = ifpga_rawdev_get_priv(dev); + if (!adapter) + return -ENODEV; - ret = rte_intr_efd_enable(&fme_intr_handle, 1); - if (ret) - return -EINVAL; + mgr = opae_adapter_get_mgr(adapter); + if (!mgr) + return -ENODEV; - fme_intr_handle.fd = fme_intr_handle.efds[0]; + if (type == IFPGA_FME_IRQ) { + intr_handle = ifpga_irq_handle[0]; + count = 1; + } else if (type == IFPGA_AFU_IRQ) + intr_handle = ifpga_irq_handle[vec_start + 1]; - IFPGA_RAWDEV_PMD_DEBUG("vfio_dev_fd=%d, efd=%d, fd=%d\n", - fme_intr_handle.vfio_dev_fd, - fme_intr_handle.efds[0], fme_intr_handle.fd); + intr_handle.type = RTE_INTR_HANDLE_VFIO_MSIX; - err_irq_set.evtfd = fme_intr_handle.efds[0]; - ret = opae_manager_ifpga_set_err_irq(mgr, &err_irq_set); + ret = rte_intr_efd_enable(&intr_handle, count); if (ret) - return -EINVAL; + return -ENODEV; + + 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); + + if (type == IFPGA_FME_IRQ) { + struct fpga_fme_err_irq_set err_irq_set; + err_irq_set.evtfd = intr_handle.efds[0]; + + ret = opae_manager_ifpga_set_err_irq(mgr, &err_irq_set); + if (ret) + return -EINVAL; + } else if (type == IFPGA_AFU_IRQ) { + acc = opae_adapter_get_acc(adapter, port_id); + if (!acc) + return -EINVAL; + + ret = opae_acc_set_irq(acc, vec_start, count, intr_handle.efds); + if (ret) + return -EINVAL; + } - /* register FME interrupt using DPDK API */ - ret = rte_intr_callback_register(&fme_intr_handle, - fme_interrupt_handler, - (void *)mgr); + /* register interrupt handler using DPDK API */ + ret = rte_intr_callback_register(&intr_handle, + handler, (void *)arg); if (ret) return -EINVAL; - IFPGA_RAWDEV_PMD_INFO("success register fme interrupt\n"); + IFPGA_RAWDEV_PMD_INFO("success register %s interrupt\n", name); return 0; } -static int -ifpga_unregister_fme_interrupt(struct opae_manager *mgr) -{ - rte_intr_efd_disable(&fme_intr_handle); - - return rte_intr_callback_unregister(&fme_intr_handle, - fme_interrupt_handler, - (void *)mgr); -} - static int ifpga_rawdev_create(struct rte_pci_device *pci_dev, int socket_id) @@ -1364,6 +1445,9 @@ ifpga_rawdev_create(struct rte_pci_device *pci_dev, goto cleanup; } + ipn3ke_bridge_func.get_ifpga_rawdev = ifpga_rawdev_get; + ipn3ke_bridge_func.set_i40e_sw_dev = rte_pmd_i40e_set_switch_dev; + dev = ifpga_rawdev_allocate(rawdev); if (dev == NULL) { IFPGA_RAWDEV_PMD_ERR("Unable to allocate ifpga_rawdevice"); @@ -1387,6 +1471,9 @@ ifpga_rawdev_create(struct rte_pci_device *pci_dev, } data->device_id = pci_dev->id.device_id; data->vendor_id = pci_dev->id.vendor_id; + data->bus = pci_dev->addr.bus; + data->devid = pci_dev->addr.devid; + data->function = pci_dev->addr.function; data->vfio_dev_fd = pci_dev->intr_handle.vfio_dev_fd; adapter = rawdev->dev_private; @@ -1413,7 +1500,8 @@ ifpga_rawdev_create(struct rte_pci_device *pci_dev, IFPGA_RAWDEV_PMD_INFO("this is a PF function"); } - ret = ifpga_register_fme_interrupt(mgr); + ret = ifpga_register_msix_irq(rawdev, 0, IFPGA_FME_IRQ, 0, 0, + fme_interrupt_handler, "fme_irq", mgr); if (ret) goto free_adapter_data; @@ -1465,7 +1553,8 @@ ifpga_rawdev_destroy(struct rte_pci_device *pci_dev) if (!mgr) return -ENODEV; - if (ifpga_unregister_fme_interrupt(mgr)) + if (ifpga_unregister_msix_irq(IFPGA_FME_IRQ, 0, + fme_interrupt_handler, mgr)) return -EINVAL; opae_adapter_data_free(adapter->data); @@ -1504,13 +1593,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_INIT(ifpga_rawdev_init_log) -{ - ifpga_rawdev_logtype = rte_log_register("driver.raw.init"); - if (ifpga_rawdev_logtype >= 0) - rte_log_set_level(ifpga_rawdev_logtype, RTE_LOG_NOTICE); -} +RTE_LOG_REGISTER(ifpga_rawdev_logtype, driver.raw.init, NOTICE); static const char * const valid_args[] = { #define IFPGA_ARG_NAME "ifpga"