The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/qat/qat_hw/qat_dh895xcc/adf_drv.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /* SPDX-License-Identifier: BSD-3-Clause */
    2 /* Copyright(c) 2007-2022 Intel Corporation */
    3 /* $FreeBSD$ */
    4 #include "qat_freebsd.h"
    5 #include "adf_cfg.h"
    6 #include "adf_common_drv.h"
    7 #include "adf_accel_devices.h"
    8 #include "adf_dh895xcc_hw_data.h"
    9 #include "adf_fw_counters.h"
   10 #include "adf_cfg_device.h"
   11 #include <sys/types.h>
   12 #include <sys/kernel.h>
   13 #include <sys/malloc.h>
   14 #include <machine/bus_dma.h>
   15 #include <dev/pci/pcireg.h>
   16 #include "adf_heartbeat_dbg.h"
   17 #include "adf_cnvnr_freq_counters.h"
   18 
   19 static MALLOC_DEFINE(M_QAT_DH895XCC, "qat_dh895xcc", "qat_dh895xcc");
   20 
   21 #define ADF_SYSTEM_DEVICE(device_id)                                           \
   22         {                                                                      \
   23                 PCI_VENDOR_ID_INTEL, device_id                                 \
   24         }
   25 
   26 static const struct pci_device_id adf_pci_tbl[] =
   27     { ADF_SYSTEM_DEVICE(ADF_DH895XCC_PCI_DEVICE_ID),
   28       {
   29           0,
   30       } };
   31 
   32 static int
   33 adf_probe(device_t dev)
   34 {
   35         const struct pci_device_id *id;
   36 
   37         for (id = adf_pci_tbl; id->vendor != 0; id++) {
   38                 if (pci_get_vendor(dev) == id->vendor &&
   39                     pci_get_device(dev) == id->device) {
   40                         device_set_desc(dev,
   41                                         "Intel " ADF_DH895XCC_DEVICE_NAME
   42                                         " QuickAssist");
   43                         return BUS_PROBE_DEFAULT;
   44                 }
   45         }
   46         return ENXIO;
   47 }
   48 
   49 static void
   50 adf_cleanup_accel(struct adf_accel_dev *accel_dev)
   51 {
   52         struct adf_accel_pci *accel_pci_dev = &accel_dev->accel_pci_dev;
   53         int i;
   54 
   55         if (accel_dev->dma_tag)
   56                 bus_dma_tag_destroy(accel_dev->dma_tag);
   57         for (i = 0; i < ADF_PCI_MAX_BARS; i++) {
   58                 struct adf_bar *bar = &accel_pci_dev->pci_bars[i];
   59 
   60                 if (bar->virt_addr)
   61                         bus_free_resource(accel_pci_dev->pci_dev,
   62                                           SYS_RES_MEMORY,
   63                                           bar->virt_addr);
   64         }
   65 
   66         if (accel_dev->hw_device) {
   67                 switch (pci_get_device(accel_pci_dev->pci_dev)) {
   68                 case ADF_DH895XCC_PCI_DEVICE_ID:
   69                         adf_clean_hw_data_dh895xcc(accel_dev->hw_device);
   70                         break;
   71                 default:
   72                         break;
   73                 }
   74                 free(accel_dev->hw_device, M_QAT_DH895XCC);
   75                 accel_dev->hw_device = NULL;
   76         }
   77         adf_cfg_dev_remove(accel_dev);
   78         adf_devmgr_rm_dev(accel_dev, NULL);
   79 }
   80 
   81 static int
   82 adf_attach(device_t dev)
   83 {
   84         struct adf_accel_dev *accel_dev;
   85         struct adf_accel_pci *accel_pci_dev;
   86         struct adf_hw_device_data *hw_data;
   87         unsigned int i, bar_nr;
   88         int ret, rid;
   89         struct adf_cfg_device *cfg_dev = NULL;
   90 
   91         /* Set pci MaxPayLoad to 256. Implemented to avoid the issue of
   92          * Pci-passthrough causing Maxpayload to be reset to 128 bytes
   93          * when the device is reset. */
   94         if (pci_get_max_payload(dev) != 256)
   95                 pci_set_max_payload(dev, 256);
   96 
   97         accel_dev = device_get_softc(dev);
   98 
   99         INIT_LIST_HEAD(&accel_dev->crypto_list);
  100         accel_pci_dev = &accel_dev->accel_pci_dev;
  101         accel_pci_dev->pci_dev = dev;
  102 
  103         if (bus_get_domain(dev, &accel_pci_dev->node) != 0)
  104                 accel_pci_dev->node = 0;
  105 
  106         /* Add accel device to accel table.
  107          * This should be called before adf_cleanup_accel is called */
  108         if (adf_devmgr_add_dev(accel_dev, NULL)) {
  109                 device_printf(dev, "Failed to add new accelerator device.\n");
  110                 return ENXIO;
  111         }
  112 
  113         /* Allocate and configure device configuration structure */
  114         hw_data = malloc(sizeof(*hw_data), M_QAT_DH895XCC, M_WAITOK | M_ZERO);
  115 
  116         accel_dev->hw_device = hw_data;
  117         adf_init_hw_data_dh895xcc(accel_dev->hw_device);
  118         accel_pci_dev->revid = pci_get_revid(dev);
  119         hw_data->fuses = pci_read_config(dev, ADF_DEVICE_FUSECTL_OFFSET, 4);
  120 
  121         /* Get PPAERUCM values and store */
  122         ret = adf_aer_store_ppaerucm_reg(dev, hw_data);
  123         if (ret)
  124                 goto out_err;
  125 
  126         /* Get Accelerators and Accelerators Engines masks */
  127         hw_data->accel_mask = hw_data->get_accel_mask(accel_dev);
  128         hw_data->ae_mask = hw_data->get_ae_mask(accel_dev);
  129         hw_data->admin_ae_mask = hw_data->ae_mask;
  130         accel_pci_dev->sku = hw_data->get_sku(hw_data);
  131         /* If the device has no acceleration engines then ignore it. */
  132         if (!hw_data->accel_mask || !hw_data->ae_mask ||
  133             ((~hw_data->ae_mask) & 0x01)) {
  134                 device_printf(dev, "No acceleration units found\n");
  135                 ret = ENXIO;
  136                 goto out_err;
  137         }
  138 
  139         /* Create device configuration table */
  140         ret = adf_cfg_dev_add(accel_dev);
  141         if (ret)
  142                 goto out_err;
  143 
  144         pci_set_max_read_req(dev, 1024);
  145 
  146         ret = bus_dma_tag_create(bus_get_dma_tag(dev),
  147                                  1,
  148                                  0,
  149                                  BUS_SPACE_MAXADDR,
  150                                  BUS_SPACE_MAXADDR,
  151                                  NULL,
  152                                  NULL,
  153                                  BUS_SPACE_MAXSIZE,
  154                                  /* BUS_SPACE_UNRESTRICTED */ 1,
  155                                  BUS_SPACE_MAXSIZE,
  156                                  0,
  157                                  NULL,
  158                                  NULL,
  159                                  &accel_dev->dma_tag);
  160         if (ret)
  161                 goto out_err;
  162 
  163         if (hw_data->get_accel_cap) {
  164                 hw_data->accel_capabilities_mask =
  165                     hw_data->get_accel_cap(accel_dev);
  166         }
  167 
  168         /* Find and map all the device's BARS */
  169         i = 0;
  170         for (bar_nr = 0; i < ADF_PCI_MAX_BARS && bar_nr < PCIR_MAX_BAR_0;
  171              bar_nr++) {
  172                 struct adf_bar *bar;
  173 
  174                 /*
  175                  * This will ignore a BAR
  176                  * that wasn't assigned a valid resource range by the
  177                  * firmware.
  178                  */
  179                 rid = PCIR_BAR(bar_nr);
  180                 if (bus_get_resource(dev, SYS_RES_MEMORY, rid, NULL, NULL) != 0)
  181                         continue;
  182                 bar = &accel_pci_dev->pci_bars[i++];
  183                 bar->virt_addr = bus_alloc_resource_any(dev,
  184                                                         SYS_RES_MEMORY,
  185                                                         &rid,
  186                                                         RF_ACTIVE);
  187                 if (bar->virt_addr == NULL) {
  188                         device_printf(dev, "Failed to map BAR %d\n", bar_nr);
  189                         ret = ENXIO;
  190                         goto out_err;
  191                 }
  192                 bar->base_addr = rman_get_start(bar->virt_addr);
  193                 bar->size = rman_get_size(bar->virt_addr);
  194         }
  195         pci_enable_busmaster(dev);
  196 
  197         if (!accel_dev->hw_device->config_device) {
  198                 ret = EFAULT;
  199                 goto out_err;
  200         }
  201 
  202         ret = accel_dev->hw_device->config_device(accel_dev);
  203         if (ret)
  204                 goto out_err;
  205 
  206         ret = adf_dev_init(accel_dev);
  207         if (ret)
  208                 goto out_dev_shutdown;
  209 
  210         ret = adf_dev_start(accel_dev);
  211         if (ret)
  212                 goto out_dev_stop;
  213 
  214         cfg_dev = accel_dev->cfg->dev;
  215         adf_cfg_device_clear(cfg_dev, accel_dev);
  216         free(cfg_dev, M_QAT);
  217         accel_dev->cfg->dev = NULL;
  218         return ret;
  219 out_dev_stop:
  220         adf_dev_stop(accel_dev);
  221 out_dev_shutdown:
  222         adf_dev_shutdown(accel_dev);
  223 out_err:
  224         adf_cleanup_accel(accel_dev);
  225         return ret;
  226 }
  227 
  228 static int
  229 adf_detach(device_t dev)
  230 {
  231         struct adf_accel_dev *accel_dev = device_get_softc(dev);
  232 
  233         if (adf_dev_stop(accel_dev)) {
  234                 device_printf(dev, "Failed to stop QAT accel dev\n");
  235                 return EBUSY;
  236         }
  237 
  238         adf_dev_shutdown(accel_dev);
  239 
  240         adf_cleanup_accel(accel_dev);
  241         return 0;
  242 }
  243 
  244 static device_method_t adf_methods[] = { DEVMETHOD(device_probe, adf_probe),
  245                                          DEVMETHOD(device_attach, adf_attach),
  246                                          DEVMETHOD(device_detach, adf_detach),
  247 
  248                                          DEVMETHOD_END };
  249 
  250 static driver_t adf_driver = { "qat",
  251                                adf_methods,
  252                                sizeof(struct adf_accel_dev) };
  253 
  254 DRIVER_MODULE_ORDERED(qat_dh895xcc,
  255                       pci,
  256                       adf_driver,
  257                       NULL,
  258                       NULL,
  259                       SI_ORDER_THIRD);
  260 MODULE_VERSION(qat_dh895xcc, 1);
  261 MODULE_DEPEND(qat_dh895xcc, qat_common, 1, 1, 1);
  262 MODULE_DEPEND(qat_dh895xcc, qat_api, 1, 1, 1);
  263 MODULE_DEPEND(qat_dh895xcc, linuxkpi, 1, 1, 1);

Cache object: 0796f6d769f73783bbdcabde796708f4


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.