get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/130149/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 130149,
    "url": "http://patchwork.dpdk.org/api/patches/130149/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20230811093032.2065099-5-wenjing.qiao@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20230811093032.2065099-5-wenjing.qiao@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230811093032.2065099-5-wenjing.qiao@intel.com",
    "date": "2023-08-11T09:30:37",
    "name": "[4/4] net/cpfl: setup ctrl path",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "b8595be05613d508600e9498a904e31d6b099b45",
    "submitter": {
        "id": 2680,
        "url": "http://patchwork.dpdk.org/api/people/2680/?format=api",
        "name": "Wenjing Qiao",
        "email": "wenjing.qiao@intel.com"
    },
    "delegate": {
        "id": 1540,
        "url": "http://patchwork.dpdk.org/api/users/1540/?format=api",
        "username": "qzhan15",
        "first_name": "Qi",
        "last_name": "Zhang",
        "email": "qi.z.zhang@intel.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20230811093032.2065099-5-wenjing.qiao@intel.com/mbox/",
    "series": [
        {
            "id": 29178,
            "url": "http://patchwork.dpdk.org/api/series/29178/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=29178",
            "date": "2023-08-11T09:30:29",
            "name": "net/cpfl: add basic support for rte_flow",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/29178/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/130149/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/130149/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 5155C43032;\n\tFri, 11 Aug 2023 11:33:09 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 41677410E3;\n\tFri, 11 Aug 2023 11:33:09 +0200 (CEST)",
            "from mgamail.intel.com (mgamail.intel.com [192.55.52.151])\n by mails.dpdk.org (Postfix) with ESMTP id F1E5F40E03\n for <dev@dpdk.org>; Fri, 11 Aug 2023 11:33:06 +0200 (CEST)",
            "from orsmga007.jf.intel.com ([10.7.209.58])\n by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 11 Aug 2023 02:32:52 -0700",
            "from dpdk-wenjing-02.sh.intel.com ([10.67.119.75])\n by orsmga007.jf.intel.com with ESMTP; 11 Aug 2023 02:32:46 -0700"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1691746387; x=1723282387;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=1VSo+T3jGZMnANDwM53XOBDZxkQhB1izPiZSpiUGHwU=;\n b=O3G4cJCuBAAyT3qK0wZR3SUgKZJOZyxGc69lUC8b7zsUzCszer3dIoHW\n 9UNyG/HaLJv6jgCevnv3fy1DDwQb5smrbbHzPRrzQ8UTHZtZOp409NWYM\n fn66CYfHYiBLQ65/iqgd4JYiPHpskmxQBaGF/iASFSoQCYGzxUX510ysG\n QMsTq/AhBWijCbFBBDg1wyWEtr77vbChjP9NXWFTQIagiotXGWFEIhF7o\n p2Xy98T1oxUtgjBlu7LkuoZ5sH0qxLeTycAN4+OUH0u08RYtCz43ocWii\n OCWAAp8E8ddycfrxv5lUpHliwl+3ASEIxsyV+ZIilLcBmsRwmbJNfUogY Q==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6600,9927,10798\"; a=\"351960288\"",
            "E=Sophos;i=\"6.01,165,1684825200\"; d=\"scan'208\";a=\"351960288\"",
            "E=McAfee;i=\"6600,9927,10798\"; a=\"726200096\"",
            "E=Sophos;i=\"6.01,165,1684825200\"; d=\"scan'208\";a=\"726200096\""
        ],
        "X-ExtLoop1": "1",
        "From": "Wenjing Qiao <wenjing.qiao@intel.com>",
        "To": "yuying.zhang@intel.com,\n\tbeilei.xing@intel.com",
        "Cc": "dev@dpdk.org, mingxia.liu@intel.com,\n Wenjing Qiao <wenjing.qiao@intel.com>,\n Qi Zhang <qi.z.zhang@intel.com>",
        "Subject": "[PATCH 4/4] net/cpfl: setup ctrl path",
        "Date": "Fri, 11 Aug 2023 09:30:37 +0000",
        "Message-Id": "<20230811093032.2065099-5-wenjing.qiao@intel.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20230811093032.2065099-1-wenjing.qiao@intel.com>",
        "References": "<20230811093032.2065099-1-wenjing.qiao@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Setup the control vport and control queue for flow offloading.\n\nSigned-off-by: Yuying Zhang <yuying.zhang@intel.com>\nSigned-off-by: Beilei Xing <beilei.xing@intel.com>\nSigned-off-by: Qi Zhang <qi.z.zhang@intel.com>\nSigned-off-by: Wenjing Qiao <wenjing.qiao@intel.com>\n---\n drivers/net/cpfl/cpfl_ethdev.c | 270 ++++++++++++++++++++++++++++++++-\n drivers/net/cpfl/cpfl_ethdev.h |  14 ++\n drivers/net/cpfl/cpfl_vchnl.c  | 144 ++++++++++++++++++\n 3 files changed, 425 insertions(+), 3 deletions(-)",
    "diff": "diff --git a/drivers/net/cpfl/cpfl_ethdev.c b/drivers/net/cpfl/cpfl_ethdev.c\nindex a2f308fb86..34b7c22ee1 100644\n--- a/drivers/net/cpfl/cpfl_ethdev.c\n+++ b/drivers/net/cpfl/cpfl_ethdev.c\n@@ -1783,9 +1783,10 @@ cpfl_handle_vchnl_event_msg(struct cpfl_adapter_ext *adapter, uint8_t *msg, uint\n \t\treturn;\n \t}\n \n-\t/* ignore if it is exceptional vport */\n-\tif (adapter->exceptional_vport &&\n-\t    adapter->exceptional_vport->base.vport_id == vc_event->vport_id)\n+\t/* ignore if it is ctrl vport or exceptional vport */\n+\tif (adapter->ctrl_vport.base.vport_id == vc_event->vport_id ||\n+\t    (adapter->exceptional_vport &&\n+\t     adapter->exceptional_vport->base.vport_id == vc_event->vport_id))\n \t\treturn;\n \n \tvport = cpfl_find_vport(adapter, vc_event->vport_id);\n@@ -1983,6 +1984,260 @@ cpfl_dev_alarm_handler(void *param)\n \trte_eal_alarm_set(CPFL_ALARM_INTERVAL, cpfl_dev_alarm_handler, adapter);\n }\n \n+static int\n+cpfl_stop_cfgqs(struct cpfl_adapter_ext *adapter)\n+{\n+\tint i, ret;\n+\n+\tfor (i = 0; i < CPFL_TX_CFGQ_NUM; i++) {\n+\t\tret = idpf_vc_queue_switch(&adapter->ctrl_vport.base, i, false, false);\n+\t\tif (ret) {\n+\t\t\tPMD_DRV_LOG(ERR, \"Fail to disable Tx config queue.\");\n+\t\t\treturn ret;\n+\t\t}\n+\t}\n+\n+\tfor (i = 0; i < CPFL_RX_CFGQ_NUM; i++) {\n+\t\tret = idpf_vc_queue_switch(&adapter->ctrl_vport.base, i, true, false);\n+\t\tif (ret) {\n+\t\t\tPMD_DRV_LOG(ERR, \"Fail to disable Rx config queue.\");\n+\t\t\treturn ret;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+cpfl_start_cfgqs(struct cpfl_adapter_ext *adapter)\n+{\n+\tint i, ret;\n+\n+\tret = cpfl_config_ctlq_tx(adapter);\n+\tif (ret) {\n+\t\tPMD_DRV_LOG(ERR, \"Fail to configure Tx config queue.\");\n+\t\treturn ret;\n+\t}\n+\n+\tret = cpfl_config_ctlq_rx(adapter);\n+\tif (ret) {\n+\t\tPMD_DRV_LOG(ERR, \"Fail to configure Rx config queue.\");\n+\t\treturn ret;\n+\t}\n+\n+\tfor (i = 0; i < CPFL_TX_CFGQ_NUM; i++) {\n+\t\tret = idpf_vc_queue_switch(&adapter->ctrl_vport.base, i, false, true);\n+\t\tif (ret) {\n+\t\t\tPMD_DRV_LOG(ERR, \"Fail to enable Tx config queue.\");\n+\t\t\treturn ret;\n+\t\t}\n+\t}\n+\n+\tfor (i = 0; i < CPFL_RX_CFGQ_NUM; i++) {\n+\t\tret = idpf_vc_queue_switch(&adapter->ctrl_vport.base, i, true, true);\n+\t\tif (ret) {\n+\t\t\tPMD_DRV_LOG(ERR, \"Fail to enable Rx config queue.\");\n+\t\t\treturn ret;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+cpfl_remove_cfgqs(struct cpfl_adapter_ext *adapter)\n+{\n+\tstruct idpf_hw *hw = (struct idpf_hw *)(&adapter->base.hw);\n+\tstruct cpfl_ctlq_create_info *create_cfgq_info;\n+\tint i;\n+\n+\tcreate_cfgq_info = adapter->cfgq_info;\n+\n+\tfor (i = 0; i < CPFL_CFGQ_NUM; i++) {\n+\t\tcpfl_vport_ctlq_remove(hw, adapter->ctlqp[i]);\n+\t\tif (create_cfgq_info[i].ring_mem.va)\n+\t\t\tidpf_free_dma_mem(&adapter->base.hw, &create_cfgq_info[i].ring_mem);\n+\t\tif (create_cfgq_info[i].buf_mem.va)\n+\t\t\tidpf_free_dma_mem(&adapter->base.hw, &create_cfgq_info[i].buf_mem);\n+\t}\n+}\n+\n+static int\n+cpfl_add_cfgqs(struct cpfl_adapter_ext *adapter)\n+{\n+\tstruct idpf_ctlq_info *cfg_cq;\n+\tint ret = 0;\n+\tint i = 0;\n+\n+\tfor (i = 0; i < CPFL_CFGQ_NUM; i++) {\n+\t\tret = cpfl_vport_ctlq_add((struct idpf_hw *)(&adapter->base.hw),\n+\t\t\t\t\t  &adapter->cfgq_info[i],\n+\t\t\t\t\t  &cfg_cq);\n+\t\tif (ret || !cfg_cq) {\n+\t\t\tPMD_DRV_LOG(ERR, \"ctlq add failed for queue id: %d\",\n+\t\t\t\t    adapter->cfgq_info[i].id);\n+\t\t\tcpfl_remove_cfgqs(adapter);\n+\t\t\treturn ret;\n+\t\t}\n+\t\tPMD_DRV_LOG(INFO, \"added cfgq to hw. queue id: %d\",\n+\t\t\t    adapter->cfgq_info[i].id);\n+\t\tadapter->ctlqp[i] = cfg_cq;\n+\t}\n+\n+\treturn ret;\n+}\n+\n+#define CPFL_CFGQ_RING_LEN\t\t512\n+#define CPFL_CFGQ_DESCRIPTOR_SIZE\t32\n+#define CPFL_CFGQ_BUFFER_SIZE\t\t256\n+#define CPFL_CFGQ_RING_SIZE\t\t512\n+\n+static int\n+cpfl_cfgq_setup(struct cpfl_adapter_ext *adapter)\n+{\n+\tstruct cpfl_ctlq_create_info *create_cfgq_info;\n+\tstruct cpfl_vport *vport;\n+\tint i, err;\n+\tuint32_t ring_size = CPFL_CFGQ_RING_SIZE * sizeof(struct idpf_ctlq_desc);\n+\tuint32_t buf_size = CPFL_CFGQ_RING_SIZE * CPFL_CFGQ_BUFFER_SIZE;\n+\n+\tvport = &adapter->ctrl_vport;\n+\tcreate_cfgq_info = adapter->cfgq_info;\n+\n+\tfor (i = 0; i < CPFL_CFGQ_NUM; i++) {\n+\t\tif (i % 2 == 0) {\n+\t\t\t/* Setup Tx config queue */\n+\t\t\tcreate_cfgq_info[i].id = vport->base.chunks_info.tx_start_qid + i / 2;\n+\t\t\tcreate_cfgq_info[i].type = IDPF_CTLQ_TYPE_CONFIG_TX;\n+\t\t\tcreate_cfgq_info[i].len = CPFL_CFGQ_RING_SIZE;\n+\t\t\tcreate_cfgq_info[i].buf_size = CPFL_CFGQ_BUFFER_SIZE;\n+\t\t\tmemset(&create_cfgq_info[i].reg, 0, sizeof(struct idpf_ctlq_reg));\n+\t\t\tcreate_cfgq_info[i].reg.tail = vport->base.chunks_info.tx_qtail_start +\n+\t\t\t\ti / 2 * vport->base.chunks_info.tx_qtail_spacing;\n+\t\t} else {\n+\t\t\t/* Setup Rx config queue */\n+\t\t\tcreate_cfgq_info[i].id = vport->base.chunks_info.rx_start_qid + i / 2;\n+\t\t\tcreate_cfgq_info[i].type = IDPF_CTLQ_TYPE_CONFIG_RX;\n+\t\t\tcreate_cfgq_info[i].len = CPFL_CFGQ_RING_SIZE;\n+\t\t\tcreate_cfgq_info[i].buf_size = CPFL_CFGQ_BUFFER_SIZE;\n+\t\t\tmemset(&create_cfgq_info[i].reg, 0, sizeof(struct idpf_ctlq_reg));\n+\t\t\tcreate_cfgq_info[i].reg.tail = vport->base.chunks_info.rx_qtail_start +\n+\t\t\t\ti / 2 * vport->base.chunks_info.rx_qtail_spacing;\n+\t\t\tif (!idpf_alloc_dma_mem(&adapter->base.hw, &create_cfgq_info[i].buf_mem,\n+\t\t\t\t\t\tbuf_size)) {\n+\t\t\t\terr = -ENOMEM;\n+\t\t\t\tgoto free_mem;\n+\t\t\t}\n+\t\t}\n+\t\tif (!idpf_alloc_dma_mem(&adapter->base.hw, &create_cfgq_info[i].ring_mem,\n+\t\t\t\t\tring_size)) {\n+\t\t\terr = -ENOMEM;\n+\t\t\tgoto free_mem;\n+\t\t}\n+\t}\n+\treturn 0;\n+free_mem:\n+\tfor (i = 0; i < CPFL_CFGQ_NUM; i++) {\n+\t\tif (create_cfgq_info[i].ring_mem.va)\n+\t\t\tidpf_free_dma_mem(&adapter->base.hw, &create_cfgq_info[i].ring_mem);\n+\t\tif (create_cfgq_info[i].buf_mem.va)\n+\t\t\tidpf_free_dma_mem(&adapter->base.hw, &create_cfgq_info[i].buf_mem);\n+\t}\n+\treturn err;\n+}\n+\n+static int\n+cpfl_init_ctrl_vport(struct cpfl_adapter_ext *adapter)\n+{\n+\tstruct cpfl_vport *vport = &adapter->ctrl_vport;\n+\tstruct virtchnl2_create_vport *vport_info =\n+\t\t(struct virtchnl2_create_vport *)adapter->ctrl_vport_recv_info;\n+\tint i;\n+\n+\tvport->itf.adapter = adapter;\n+\tvport->base.adapter = &adapter->base;\n+\tvport->base.vport_id = vport_info->vport_id;\n+\n+\tfor (i = 0; i < vport_info->chunks.num_chunks; i++) {\n+\t\tif (vport_info->chunks.chunks[i].type == VIRTCHNL2_QUEUE_TYPE_TX) {\n+\t\t\tvport->base.chunks_info.tx_start_qid =\n+\t\t\t\tvport_info->chunks.chunks[i].start_queue_id;\n+\t\t\tvport->base.chunks_info.tx_qtail_start =\n+\t\t\tvport_info->chunks.chunks[i].qtail_reg_start;\n+\t\t\tvport->base.chunks_info.tx_qtail_spacing =\n+\t\t\tvport_info->chunks.chunks[i].qtail_reg_spacing;\n+\t\t} else if (vport_info->chunks.chunks[i].type == VIRTCHNL2_QUEUE_TYPE_RX) {\n+\t\t\tvport->base.chunks_info.rx_start_qid =\n+\t\t\t\tvport_info->chunks.chunks[i].start_queue_id;\n+\t\t\tvport->base.chunks_info.rx_qtail_start =\n+\t\t\tvport_info->chunks.chunks[i].qtail_reg_start;\n+\t\t\tvport->base.chunks_info.rx_qtail_spacing =\n+\t\t\tvport_info->chunks.chunks[i].qtail_reg_spacing;\n+\t\t} else {\n+\t\t\tPMD_INIT_LOG(ERR, \"Unsupported chunk type\");\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+cpfl_ctrl_path_close(struct cpfl_adapter_ext *adapter)\n+{\n+\tcpfl_remove_cfgqs(adapter);\n+\tcpfl_stop_cfgqs(adapter);\n+\tidpf_vc_vport_destroy(&adapter->ctrl_vport.base);\n+}\n+\n+static int\n+cpfl_ctrl_path_open(struct cpfl_adapter_ext *adapter)\n+{\n+\tint ret;\n+\n+\tret = cpfl_vc_create_ctrl_vport(adapter);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(ERR, \"Failed to create control vport\");\n+\t\treturn ret;\n+\t}\n+\n+\tret = cpfl_init_ctrl_vport(adapter);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(ERR, \"Failed to init control vport\");\n+\t\tgoto err_init_ctrl_vport;\n+\t}\n+\n+\tret = cpfl_cfgq_setup(adapter);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(ERR, \"Failed to setup control queues\");\n+\t\tgoto err_cfgq_setup;\n+\t}\n+\n+\tret = cpfl_add_cfgqs(adapter);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(ERR, \"Failed to add control queues\");\n+\t\tgoto err_add_cfgq;\n+\t}\n+\n+\tret = cpfl_start_cfgqs(adapter);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(ERR, \"Failed to start control queues\");\n+\t\tgoto err_start_cfgqs;\n+\t}\n+\n+\treturn 0;\n+\n+err_start_cfgqs:\n+\tcpfl_stop_cfgqs(adapter);\n+err_add_cfgq:\n+\tcpfl_remove_cfgqs(adapter);\n+err_cfgq_setup:\n+err_init_ctrl_vport:\n+\tidpf_vc_vport_destroy(&adapter->ctrl_vport.base);\n+\n+\treturn ret;\n+}\n+\n static struct virtchnl2_get_capabilities req_caps = {\n \t.csum_caps =\n \tVIRTCHNL2_CAP_TX_CSUM_L3_IPV4          |\n@@ -2150,6 +2405,12 @@ cpfl_adapter_ext_init(struct rte_pci_device *pci_dev, struct cpfl_adapter_ext *a\n \t\tgoto err_vports_alloc;\n \t}\n \n+\tret = cpfl_ctrl_path_open(adapter);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(ERR, \"Failed to setup control path\");\n+\t\tgoto err_create_ctrl_vport;\n+\t}\n+\n \tadapter->cur_vports = 0;\n \tadapter->cur_vport_nb = 0;\n \n@@ -2157,6 +2418,8 @@ cpfl_adapter_ext_init(struct rte_pci_device *pci_dev, struct cpfl_adapter_ext *a\n \n \treturn ret;\n \n+err_create_ctrl_vport:\n+\trte_free(adapter->vports);\n err_vports_alloc:\n \trte_eal_alarm_cancel(cpfl_dev_alarm_handler, adapter);\n \tcpfl_repr_whitelist_uninit(adapter);\n@@ -2450,6 +2713,7 @@ cpfl_find_adapter_ext(struct rte_pci_device *pci_dev)\n static void\n cpfl_adapter_ext_deinit(struct cpfl_adapter_ext *adapter)\n {\n+\tcpfl_ctrl_path_close(adapter);\n \trte_eal_alarm_cancel(cpfl_dev_alarm_handler, adapter);\n \tcpfl_vport_map_uninit(adapter);\n \tidpf_adapter_deinit(&adapter->base);\ndiff --git a/drivers/net/cpfl/cpfl_ethdev.h b/drivers/net/cpfl/cpfl_ethdev.h\nindex cf989a29b3..2e9480ffc1 100644\n--- a/drivers/net/cpfl/cpfl_ethdev.h\n+++ b/drivers/net/cpfl/cpfl_ethdev.h\n@@ -22,6 +22,7 @@\n #include \"cpfl_logs.h\"\n #include \"cpfl_cpchnl.h\"\n #include \"cpfl_representor.h\"\n+#include \"cpfl_controlq.h\"\n \n /* Currently, backend supports up to 8 vports */\n #define CPFL_MAX_VPORT_NUM\t8\n@@ -89,6 +90,10 @@\n \n #define CPFL_FLOW_FILE_LEN 100\n \n+#define CPFL_RX_CFGQ_NUM\t4\n+#define CPFL_TX_CFGQ_NUM\t4\n+#define CPFL_CFGQ_NUM\t\t8\n+\n struct cpfl_vport_param {\n \tstruct cpfl_adapter_ext *adapter;\n \tuint16_t devarg_id; /* arg id from user */\n@@ -216,10 +221,19 @@ struct cpfl_adapter_ext {\n \n \trte_spinlock_t repr_lock;\n \tstruct rte_hash *repr_whitelist_hash;\n+\n+\t/* ctrl vport and ctrl queues. */\n+\tstruct cpfl_vport ctrl_vport;\n+\tuint8_t ctrl_vport_recv_info[IDPF_DFLT_MBX_BUF_SIZE];\n+\tstruct idpf_ctlq_info *ctlqp[CPFL_CFGQ_NUM];\n+\tstruct cpfl_ctlq_create_info cfgq_info[CPFL_CFGQ_NUM];\n };\n \n TAILQ_HEAD(cpfl_adapter_list, cpfl_adapter_ext);\n \n+int cpfl_vc_create_ctrl_vport(struct cpfl_adapter_ext *adapter);\n+int cpfl_config_ctlq_rx(struct cpfl_adapter_ext *adapter);\n+int cpfl_config_ctlq_tx(struct cpfl_adapter_ext *adapter);\n int cpfl_vport_info_create(struct cpfl_adapter_ext *adapter,\n \t\t\t   struct cpfl_vport_id *vport_identity,\n \t\t\t   struct cpchnl2_vport_info *vport_info);\ndiff --git a/drivers/net/cpfl/cpfl_vchnl.c b/drivers/net/cpfl/cpfl_vchnl.c\nindex a21a4a451f..932840a972 100644\n--- a/drivers/net/cpfl/cpfl_vchnl.c\n+++ b/drivers/net/cpfl/cpfl_vchnl.c\n@@ -70,3 +70,147 @@ cpfl_cc_vport_info_get(struct cpfl_adapter_ext *adapter,\n \n \treturn 0;\n }\n+\n+int\n+cpfl_vc_create_ctrl_vport(struct cpfl_adapter_ext *adapter)\n+{\n+\tstruct virtchnl2_create_vport vport_msg;\n+\tstruct idpf_cmd_info args;\n+\tint err = -1;\n+\n+\tmemset(&vport_msg, 0, sizeof(struct virtchnl2_create_vport));\n+\tvport_msg.vport_type = rte_cpu_to_le_16(VIRTCHNL2_VPORT_TYPE_DEFAULT);\n+\tvport_msg.txq_model = rte_cpu_to_le_16(VIRTCHNL2_QUEUE_MODEL_SINGLE);\n+\tvport_msg.rxq_model = rte_cpu_to_le_16(VIRTCHNL2_QUEUE_MODEL_SINGLE);\n+\tvport_msg.num_tx_q = CPFL_TX_CFGQ_NUM;\n+\tvport_msg.num_tx_complq = 0;\n+\tvport_msg.num_rx_q = CPFL_RX_CFGQ_NUM;\n+\tvport_msg.num_rx_bufq = 0;\n+\n+\tmemset(&args, 0, sizeof(args));\n+\targs.ops = VIRTCHNL2_OP_CREATE_VPORT;\n+\targs.in_args = (uint8_t *)&vport_msg;\n+\targs.in_args_size = sizeof(vport_msg);\n+\targs.out_buffer = adapter->base.mbx_resp;\n+\targs.out_size = IDPF_DFLT_MBX_BUF_SIZE;\n+\n+\terr = idpf_vc_cmd_execute(&adapter->base, &args);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR,\n+\t\t\t    \"Failed to execute command of VIRTCHNL2_OP_CREATE_VPORT\");\n+\t\treturn err;\n+\t}\n+\n+\trte_memcpy(adapter->ctrl_vport_recv_info, args.out_buffer,\n+\t\t   IDPF_DFLT_MBX_BUF_SIZE);\n+\treturn err;\n+}\n+\n+int\n+cpfl_config_ctlq_rx(struct cpfl_adapter_ext *adapter)\n+{\n+\tstruct cpfl_vport *vport = &adapter->ctrl_vport;\n+\tstruct virtchnl2_config_rx_queues *vc_rxqs = NULL;\n+\tstruct virtchnl2_rxq_info *rxq_info;\n+\tstruct idpf_cmd_info args;\n+\tuint16_t num_qs;\n+\tint size, err, i;\n+\n+\tif (vport->base.rxq_model != VIRTCHNL2_QUEUE_MODEL_SINGLE) {\n+\t\tPMD_DRV_LOG(ERR, \"This rxq model isn't supported.\");\n+\t\terr = -EINVAL;\n+\t\treturn err;\n+\t}\n+\n+\tnum_qs = CPFL_RX_CFGQ_NUM;\n+\tsize = sizeof(*vc_rxqs) + (num_qs - 1) *\n+\t\tsizeof(struct virtchnl2_rxq_info);\n+\tvc_rxqs = rte_zmalloc(\"cfg_rxqs\", size, 0);\n+\tif (!vc_rxqs) {\n+\t\tPMD_DRV_LOG(ERR, \"Failed to allocate virtchnl2_config_rx_queues\");\n+\t\terr = -ENOMEM;\n+\t\treturn err;\n+\t}\n+\tvc_rxqs->vport_id = vport->base.vport_id;\n+\tvc_rxqs->num_qinfo = num_qs;\n+\n+\tfor (i = 0; i < num_qs; i++) {\n+\t\trxq_info = &vc_rxqs->qinfo[i];\n+\t\trxq_info->dma_ring_addr = adapter->ctlqp[2 * i + 1]->desc_ring.pa;\n+\t\trxq_info->type = VIRTCHNL2_QUEUE_TYPE_CONFIG_RX;\n+\t\trxq_info->queue_id = adapter->cfgq_info[2 * i + 1].id;\n+\t\trxq_info->model = VIRTCHNL2_QUEUE_MODEL_SINGLE;\n+\t\trxq_info->data_buffer_size = adapter->cfgq_info[2 * i + 1].buf_size;\n+\t\trxq_info->max_pkt_size = vport->base.max_pkt_len;\n+\t\trxq_info->desc_ids = VIRTCHNL2_RXDID_2_FLEX_SQ_NIC_M;\n+\t\trxq_info->qflags |= VIRTCHNL2_RX_DESC_SIZE_32BYTE;\n+\t\trxq_info->ring_len = adapter->cfgq_info[2 * i + 1].len;\n+\t}\n+\n+\tmemset(&args, 0, sizeof(args));\n+\targs.ops = VIRTCHNL2_OP_CONFIG_RX_QUEUES;\n+\targs.in_args = (uint8_t *)vc_rxqs;\n+\targs.in_args_size = size;\n+\targs.out_buffer = adapter->base.mbx_resp;\n+\targs.out_size = IDPF_DFLT_MBX_BUF_SIZE;\n+\n+\terr = idpf_vc_cmd_execute(&adapter->base, &args);\n+\trte_free(vc_rxqs);\n+\tif (err)\n+\t\tPMD_DRV_LOG(ERR, \"Failed to execute command of VIRTCHNL2_OP_CONFIG_RX_QUEUES\");\n+\n+\treturn err;\n+}\n+\n+int\n+cpfl_config_ctlq_tx(struct cpfl_adapter_ext *adapter)\n+{\n+\tstruct cpfl_vport *vport = &adapter->ctrl_vport;\n+\tstruct virtchnl2_config_tx_queues *vc_txqs = NULL;\n+\tstruct virtchnl2_txq_info *txq_info;\n+\tstruct idpf_cmd_info args;\n+\tuint16_t num_qs;\n+\tint size, err, i;\n+\n+\tif (vport->base.txq_model != VIRTCHNL2_QUEUE_MODEL_SINGLE) {\n+\t\tPMD_DRV_LOG(ERR, \"This txq model isn't supported.\");\n+\t\terr = -EINVAL;\n+\t\treturn err;\n+\t}\n+\n+\tnum_qs = CPFL_TX_CFGQ_NUM;\n+\tsize = sizeof(*vc_txqs) + (num_qs - 1) *\n+\t\tsizeof(struct virtchnl2_txq_info);\n+\tvc_txqs = rte_zmalloc(\"cfg_txqs\", size, 0);\n+\tif (!vc_txqs) {\n+\t\tPMD_DRV_LOG(ERR, \"Failed to allocate virtchnl2_config_tx_queues\");\n+\t\terr = -ENOMEM;\n+\t\treturn err;\n+\t}\n+\tvc_txqs->vport_id = vport->base.vport_id;\n+\tvc_txqs->num_qinfo = num_qs;\n+\n+\tfor (i = 0; i < num_qs; i++) {\n+\t\ttxq_info = &vc_txqs->qinfo[i];\n+\t\ttxq_info->dma_ring_addr = adapter->ctlqp[2 * i]->desc_ring.pa;\n+\t\ttxq_info->type = VIRTCHNL2_QUEUE_TYPE_CONFIG_TX;\n+\t\ttxq_info->queue_id = adapter->cfgq_info[2 * i].id;\n+\t\ttxq_info->model = VIRTCHNL2_QUEUE_MODEL_SINGLE;\n+\t\ttxq_info->sched_mode = VIRTCHNL2_TXQ_SCHED_MODE_QUEUE;\n+\t\ttxq_info->ring_len = adapter->cfgq_info[2 * i].len;\n+\t}\n+\n+\tmemset(&args, 0, sizeof(args));\n+\targs.ops = VIRTCHNL2_OP_CONFIG_TX_QUEUES;\n+\targs.in_args = (uint8_t *)vc_txqs;\n+\targs.in_args_size = size;\n+\targs.out_buffer = adapter->base.mbx_resp;\n+\targs.out_size = IDPF_DFLT_MBX_BUF_SIZE;\n+\n+\terr = idpf_vc_cmd_execute(&adapter->base, &args);\n+\trte_free(vc_txqs);\n+\tif (err)\n+\t\tPMD_DRV_LOG(ERR, \"Failed to execute command of VIRTCHNL2_OP_CONFIG_TX_QUEUES\");\n+\n+\treturn err;\n+}\n",
    "prefixes": [
        "4/4"
    ]
}