These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / crypto / qat / qat_dh895xcc / adf_drv.c
index 9decea2..f8dd14f 100644 (file)
@@ -82,16 +82,21 @@ static struct pci_driver adf_driver = {
        .id_table = adf_pci_tbl,
        .name = adf_driver_name,
        .probe = adf_probe,
-       .remove = adf_remove
+       .remove = adf_remove,
+       .sriov_configure = adf_sriov_configure,
 };
 
+static void adf_cleanup_pci_dev(struct adf_accel_dev *accel_dev)
+{
+       pci_release_regions(accel_dev->accel_pci_dev.pci_dev);
+       pci_disable_device(accel_dev->accel_pci_dev.pci_dev);
+}
+
 static void adf_cleanup_accel(struct adf_accel_dev *accel_dev)
 {
        struct adf_accel_pci *accel_pci_dev = &accel_dev->accel_pci_dev;
        int i;
 
-       adf_dev_shutdown(accel_dev);
-
        for (i = 0; i < ADF_PCI_MAX_BARS; i++) {
                struct adf_bar *bar = &accel_pci_dev->pci_bars[i];
 
@@ -100,7 +105,7 @@ static void adf_cleanup_accel(struct adf_accel_dev *accel_dev)
        }
 
        if (accel_dev->hw_device) {
-               switch (accel_dev->hw_device->pci_dev_id) {
+               switch (accel_pci_dev->pci_dev->device) {
                case ADF_DH895XCC_PCI_DEVICE_ID:
                        adf_clean_hw_data_dh895xcc(accel_dev->hw_device);
                        break;
@@ -108,13 +113,11 @@ static void adf_cleanup_accel(struct adf_accel_dev *accel_dev)
                        break;
                }
                kfree(accel_dev->hw_device);
+               accel_dev->hw_device = NULL;
        }
        adf_cfg_dev_remove(accel_dev);
        debugfs_remove(accel_dev->debugfs_dir);
-       adf_devmgr_rm_dev(accel_dev);
-       pci_release_regions(accel_pci_dev->pci_dev);
-       pci_disable_device(accel_pci_dev->pci_dev);
-       kfree(accel_dev);
+       adf_devmgr_rm_dev(accel_dev, NULL);
 }
 
 static int adf_dev_configure(struct adf_accel_dev *accel_dev)
@@ -167,12 +170,6 @@ static int adf_dev_configure(struct adf_accel_dev *accel_dev)
                                                key, (void *)&val, ADF_DEC))
                        goto err;
 
-               val = 4;
-               snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_RND_TX, i);
-               if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
-                                               key, (void *)&val, ADF_DEC))
-                       goto err;
-
                val = 8;
                snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_RX, i);
                if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
@@ -185,12 +182,6 @@ static int adf_dev_configure(struct adf_accel_dev *accel_dev)
                                                key, (void *)&val, ADF_DEC))
                        goto err;
 
-               val = 12;
-               snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_RND_RX, i);
-               if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
-                                               key, (void *)&val, ADF_DEC))
-                       goto err;
-
                val = ADF_COALESCING_DEF_TIME;
                snprintf(key, sizeof(key), ADF_ETRMGR_COALESCE_TIMER_FORMAT, i);
                if (adf_cfg_add_key_value_param(accel_dev, "Accelerator0",
@@ -217,7 +208,7 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        struct adf_hw_device_data *hw_data;
        char name[ADF_DEVICE_NAME_LENGTH];
        unsigned int i, bar_nr;
-       int ret;
+       int ret, bar_mask;
 
        switch (ent->device) {
        case ADF_DH895XCC_PCI_DEVICE_ID:
@@ -241,10 +232,12 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                return -ENOMEM;
 
        INIT_LIST_HEAD(&accel_dev->crypto_list);
+       accel_pci_dev = &accel_dev->accel_pci_dev;
+       accel_pci_dev->pci_dev = pdev;
 
        /* Add accel device to accel table.
         * This should be called before adf_cleanup_accel is called */
-       if (adf_devmgr_add_dev(accel_dev)) {
+       if (adf_devmgr_add_dev(accel_dev, NULL)) {
                dev_err(&pdev->dev, "Failed to add new accelerator device.\n");
                kfree(accel_dev);
                return -EFAULT;
@@ -267,7 +260,6 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        default:
                return -ENODEV;
        }
-       accel_pci_dev = &accel_dev->accel_pci_dev;
        pci_read_config_byte(pdev, PCI_REVISION_ID, &accel_pci_dev->revid);
        pci_read_config_dword(pdev, ADF_DH895XCC_FUSECTL_OFFSET,
                              &hw_data->fuses);
@@ -276,7 +268,6 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        hw_data->accel_mask = hw_data->get_accel_mask(hw_data->fuses);
        hw_data->ae_mask = hw_data->get_ae_mask(hw_data->fuses);
        accel_pci_dev->sku = hw_data->get_sku(hw_data);
-       accel_pci_dev->pci_dev = pdev;
        /* If the device has no acceleration engines then ignore it. */
        if (!hw_data->accel_mask || !hw_data->ae_mask ||
            ((~hw_data->ae_mask) & 0x01)) {
@@ -286,11 +277,14 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        /* Create dev top level debugfs entry */
-       snprintf(name, sizeof(name), "%s%s_dev%d", ADF_DEVICE_NAME_PREFIX,
-                hw_data->dev_class->name, hw_data->instance_id);
+       snprintf(name, sizeof(name), "%s%s_%02x:%02d.%02d",
+                ADF_DEVICE_NAME_PREFIX, hw_data->dev_class->name,
+                pdev->bus->number, PCI_SLOT(pdev->devfn),
+                PCI_FUNC(pdev->devfn));
+
        accel_dev->debugfs_dir = debugfs_create_dir(name, NULL);
        if (!accel_dev->debugfs_dir) {
-               dev_err(&pdev->dev, "Could not create debugfs dir\n");
+               dev_err(&pdev->dev, "Could not create debugfs dir %s\n", name);
                ret = -EINVAL;
                goto out_err;
        }
@@ -300,6 +294,8 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (ret)
                goto out_err;
 
+       pcie_set_readrq(pdev, 1024);
+
        /* enable PCI device */
        if (pci_enable_device(pdev)) {
                ret = -EFAULT;
@@ -311,7 +307,7 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                if ((pci_set_dma_mask(pdev, DMA_BIT_MASK(32)))) {
                        dev_err(&pdev->dev, "No usable DMA configuration\n");
                        ret = -EFAULT;
-                       goto out_err;
+                       goto out_err_disable;
                } else {
                        pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                }
@@ -322,7 +318,7 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        if (pci_request_regions(pdev, adf_driver_name)) {
                ret = -EFAULT;
-               goto out_err;
+               goto out_err_disable;
        }
 
        /* Read accelerator capabilities mask */
@@ -330,19 +326,21 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                              &hw_data->accel_capabilities_mask);
 
        /* Find and map all the device's BARS */
-       for (i = 0; i < ADF_PCI_MAX_BARS; i++) {
-               struct adf_bar *bar = &accel_pci_dev->pci_bars[i];
+       i = 0;
+       bar_mask = pci_select_bars(pdev, IORESOURCE_MEM);
+       for_each_set_bit(bar_nr, (const unsigned long *)&bar_mask,
+                        ADF_PCI_MAX_BARS * 2) {
+               struct adf_bar *bar = &accel_pci_dev->pci_bars[i++];
 
-               bar_nr = i * 2;
                bar->base_addr = pci_resource_start(pdev, bar_nr);
                if (!bar->base_addr)
                        break;
                bar->size = pci_resource_len(pdev, bar_nr);
                bar->virt_addr = pci_iomap(accel_pci_dev->pci_dev, bar_nr, 0);
                if (!bar->virt_addr) {
-                       dev_err(&pdev->dev, "Failed to map BAR %d\n", i);
+                       dev_err(&pdev->dev, "Failed to map BAR %d\n", bar_nr);
                        ret = -EFAULT;
-                       goto out_err;
+                       goto out_err_free_reg;
                }
        }
        pci_set_master(pdev);
@@ -350,32 +348,40 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (adf_enable_aer(accel_dev, &adf_driver)) {
                dev_err(&pdev->dev, "Failed to enable aer\n");
                ret = -EFAULT;
-               goto out_err;
+               goto out_err_free_reg;
        }
 
        if (pci_save_state(pdev)) {
                dev_err(&pdev->dev, "Failed to save pci state\n");
                ret = -ENOMEM;
-               goto out_err;
+               goto out_err_free_reg;
        }
 
        ret = adf_dev_configure(accel_dev);
        if (ret)
-               goto out_err;
+               goto out_err_free_reg;
 
        ret = adf_dev_init(accel_dev);
        if (ret)
-               goto out_err;
+               goto out_err_dev_shutdown;
 
        ret = adf_dev_start(accel_dev);
-       if (ret) {
-               adf_dev_stop(accel_dev);
-               goto out_err;
-       }
+       if (ret)
+               goto out_err_dev_stop;
 
-       return 0;
+       return ret;
+
+out_err_dev_stop:
+       adf_dev_stop(accel_dev);
+out_err_dev_shutdown:
+       adf_dev_shutdown(accel_dev);
+out_err_free_reg:
+       pci_release_regions(accel_pci_dev->pci_dev);
+out_err_disable:
+       pci_disable_device(accel_pci_dev->pci_dev);
 out_err:
        adf_cleanup_accel(accel_dev);
+       kfree(accel_dev);
        return ret;
 }
 
@@ -389,15 +395,17 @@ static void adf_remove(struct pci_dev *pdev)
        }
        if (adf_dev_stop(accel_dev))
                dev_err(&GET_DEV(accel_dev), "Failed to stop QAT accel dev\n");
+
+       adf_dev_shutdown(accel_dev);
        adf_disable_aer(accel_dev);
        adf_cleanup_accel(accel_dev);
+       adf_cleanup_pci_dev(accel_dev);
+       kfree(accel_dev);
 }
 
 static int __init adfdrv_init(void)
 {
        request_module("intel_qat");
-       if (qat_admin_register())
-               return -EFAULT;
 
        if (pci_register_driver(&adf_driver)) {
                pr_err("QAT: Driver initialization failed\n");
@@ -409,7 +417,6 @@ static int __init adfdrv_init(void)
 static void __exit adfdrv_release(void)
 {
        pci_unregister_driver(&adf_driver);
-       qat_admin_unregister();
 }
 
 module_init(adfdrv_init);
@@ -417,5 +424,6 @@ module_exit(adfdrv_release);
 
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_AUTHOR("Intel");
-MODULE_FIRMWARE("qat_895xcc.bin");
+MODULE_FIRMWARE(ADF_DH895XCC_FW);
 MODULE_DESCRIPTION("Intel(R) QuickAssist Technology");
+MODULE_VERSION(ADF_DRV_VERSION);