vdpa/mlx5: support queue update
[dpdk.git] / drivers / common / qat / qat_device.c
index 2a1cf3e..2b41d9a 100644 (file)
@@ -3,6 +3,8 @@
  */
 
 #include <rte_string_fns.h>
+#include <rte_devargs.h>
+#include <ctype.h>
 
 #include "qat_device.h"
 #include "adf_transport_access_macros.h"
@@ -105,12 +107,71 @@ qat_get_qat_dev_from_pci_dev(struct rte_pci_device *pci_dev)
        return qat_pci_get_named_dev(name);
 }
 
+static void qat_dev_parse_cmd(const char *str, struct qat_dev_cmd_param
+               *qat_dev_cmd_param)
+{
+       int i = 0;
+       const char *param;
+
+       while (1) {
+               char value_str[4] = { };
+
+               param = qat_dev_cmd_param[i].name;
+               if (param == NULL)
+                       return;
+               long value = 0;
+               const char *arg = strstr(str, param);
+               const char *arg2 = NULL;
+
+               if (arg) {
+                       arg2 = arg + strlen(param);
+                       if (*arg2 != '=') {
+                               QAT_LOG(DEBUG, "parsing error '=' sign"
+                                               " should immediately follow %s",
+                                               param);
+                               arg2 = NULL;
+                       } else
+                               arg2++;
+               } else {
+                       QAT_LOG(DEBUG, "%s not provided", param);
+               }
+               if (arg2) {
+                       int iter = 0;
+                       while (iter < 2) {
+                               if (!isdigit(*(arg2 + iter)))
+                                       break;
+                               iter++;
+                       }
+                       if (!iter) {
+                               QAT_LOG(DEBUG, "parsing error %s"
+                                              " no number provided",
+                                              param);
+                       } else {
+                               memcpy(value_str, arg2, iter);
+                               value = strtol(value_str, NULL, 10);
+                               if (value > MAX_QP_THRESHOLD_SIZE) {
+                                       QAT_LOG(DEBUG, "Exceeded max size of"
+                                               " threshold, setting to %d",
+                                               MAX_QP_THRESHOLD_SIZE);
+                                       value = MAX_QP_THRESHOLD_SIZE;
+                               }
+                               QAT_LOG(DEBUG, "parsing %s = %ld",
+                                               param, value);
+                       }
+               }
+               qat_dev_cmd_param[i].val = value;
+               i++;
+       }
+}
+
 struct qat_pci_device *
-qat_pci_device_allocate(struct rte_pci_device *pci_dev)
+qat_pci_device_allocate(struct rte_pci_device *pci_dev,
+               struct qat_dev_cmd_param *qat_dev_cmd_param)
 {
        struct qat_pci_device *qat_dev;
        uint8_t qat_dev_id;
        char name[QAT_DEV_NAME_MAX_LEN];
+       struct rte_devargs *devargs = pci_dev->device.devargs;
 
        rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
        snprintf(name+strlen(name), QAT_DEV_NAME_MAX_LEN-strlen(name), "_qat");
@@ -148,6 +209,9 @@ qat_pci_device_allocate(struct rte_pci_device *pci_dev)
                return NULL;
        }
 
+       if (devargs && devargs->drv_str)
+               qat_dev_parse_cmd(devargs->drv_str, qat_dev_cmd_param);
+
        rte_spinlock_init(&qat_dev->arb_csr_lock);
 
        qat_dev->attached = QAT_ATTACHED;
@@ -199,37 +263,45 @@ qat_pci_dev_destroy(struct qat_pci_device *qat_pci_dev,
 static int qat_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
                struct rte_pci_device *pci_dev)
 {
-       int ret = 0;
+       int sym_ret = 0, asym_ret = 0, comp_ret = 0;
        int num_pmds_created = 0;
        struct qat_pci_device *qat_pci_dev;
+       struct qat_dev_cmd_param qat_dev_cmd_param[] = {
+                       { SYM_ENQ_THRESHOLD_NAME, 0 },
+                       { ASYM_ENQ_THRESHOLD_NAME, 0 },
+                       { COMP_ENQ_THRESHOLD_NAME, 0 },
+                       { NULL, 0 },
+       };
 
        QAT_LOG(DEBUG, "Found QAT device at %02x:%02x.%x",
                        pci_dev->addr.bus,
                        pci_dev->addr.devid,
                        pci_dev->addr.function);
 
-       qat_pci_dev = qat_pci_device_allocate(pci_dev);
+       qat_pci_dev = qat_pci_device_allocate(pci_dev, qat_dev_cmd_param);
        if (qat_pci_dev == NULL)
                return -ENODEV;
 
-       ret = qat_sym_dev_create(qat_pci_dev);
-       if (ret == 0)
+       sym_ret = qat_sym_dev_create(qat_pci_dev, qat_dev_cmd_param);
+       if (sym_ret == 0) {
                num_pmds_created++;
+
+       }
        else
                QAT_LOG(WARNING,
                                "Failed to create QAT SYM PMD on device %s",
                                qat_pci_dev->name);
 
-       ret = qat_comp_dev_create(qat_pci_dev);
-       if (ret == 0)
+       comp_ret = qat_comp_dev_create(qat_pci_dev, qat_dev_cmd_param);
+       if (comp_ret == 0)
                num_pmds_created++;
        else
                QAT_LOG(WARNING,
                                "Failed to create QAT COMP PMD on device %s",
                                qat_pci_dev->name);
 
-       ret = qat_asym_dev_create(qat_pci_dev);
-       if (ret == 0)
+       asym_ret = qat_asym_dev_create(qat_pci_dev, qat_dev_cmd_param);
+       if (asym_ret == 0)
                num_pmds_created++;
        else
                QAT_LOG(WARNING,
@@ -264,13 +336,15 @@ static struct rte_pci_driver rte_qat_pmd = {
 };
 
 __rte_weak int
-qat_sym_dev_create(struct qat_pci_device *qat_pci_dev __rte_unused)
+qat_sym_dev_create(struct qat_pci_device *qat_pci_dev __rte_unused,
+               struct qat_dev_cmd_param *qat_dev_cmd_param __rte_unused)
 {
        return 0;
 }
 
 __rte_weak int
-qat_asym_dev_create(struct qat_pci_device *qat_pci_dev __rte_unused)
+qat_asym_dev_create(struct qat_pci_device *qat_pci_dev __rte_unused,
+               struct qat_dev_cmd_param *qat_dev_cmd_param __rte_unused)
 {
        return 0;
 }
@@ -288,7 +362,8 @@ qat_asym_dev_destroy(struct qat_pci_device *qat_pci_dev __rte_unused)
 }
 
 __rte_weak int
-qat_comp_dev_create(struct qat_pci_device *qat_pci_dev __rte_unused)
+qat_comp_dev_create(struct qat_pci_device *qat_pci_dev __rte_unused,
+               struct qat_dev_cmd_param *qat_dev_cmd_param __rte_unused)
 {
        return 0;
 }