get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 66467,
    "url": "http://patches.dpdk.org/api/patches/66467/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200309141437.11800-4-haiyue.wang@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patches.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": "<20200309141437.11800-4-haiyue.wang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200309141437.11800-4-haiyue.wang@intel.com",
    "date": "2020-03-09T14:14:36",
    "name": "[v1,3/4] net/ice: add the DCF framework",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "cb5ca515bac5c9a88434ac38b9e022c11bc24c20",
    "submitter": {
        "id": 1044,
        "url": "http://patches.dpdk.org/api/people/1044/?format=api",
        "name": "Wang, Haiyue",
        "email": "haiyue.wang@intel.com"
    },
    "delegate": {
        "id": 31221,
        "url": "http://patches.dpdk.org/api/users/31221/?format=api",
        "username": "yexl",
        "first_name": "xiaolong",
        "last_name": "ye",
        "email": "xiaolong.ye@intel.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20200309141437.11800-4-haiyue.wang@intel.com/mbox/",
    "series": [
        {
            "id": 8851,
            "url": "http://patches.dpdk.org/api/series/8851/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=8851",
            "date": "2020-03-09T14:14:33",
            "name": "add Intel DCF PMD support",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/8851/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/66467/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/66467/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 14D78A052E;\n\tMon,  9 Mar 2020 15:22:54 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id CC1761C0BC;\n\tMon,  9 Mar 2020 15:22:32 +0100 (CET)",
            "from mga03.intel.com (mga03.intel.com [134.134.136.65])\n by dpdk.org (Postfix) with ESMTP id DC17B1C0BC\n for <dev@dpdk.org>; Mon,  9 Mar 2020 15:22:29 +0100 (CET)",
            "from orsmga008.jf.intel.com ([10.7.209.65])\n by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n 09 Mar 2020 07:22:29 -0700",
            "from npg-dpdk-haiyue-1.sh.intel.com ([10.67.119.213])\n by orsmga008.jf.intel.com with ESMTP; 09 Mar 2020 07:22:25 -0700"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.70,533,1574150400\"; d=\"scan'208\";a=\"235704334\"",
        "From": "Haiyue Wang <haiyue.wang@intel.com>",
        "To": "dev@dpdk.org, xiaolong.ye@intel.com, qi.z.zhang@intel.com,\n qiming.yang@intel.com, beilei.xing@intel.com",
        "Cc": "wei.zhao1@intel.com,\n\tHaiyue Wang <haiyue.wang@intel.com>",
        "Date": "Mon,  9 Mar 2020 22:14:36 +0800",
        "Message-Id": "<20200309141437.11800-4-haiyue.wang@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20200309141437.11800-1-haiyue.wang@intel.com>",
        "References": "<20200309141437.11800-1-haiyue.wang@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v1 3/4] net/ice: add the DCF framework",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "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",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "The DCF (Device Config Function) feature works as a standalone PMD, its\nhardware entity is the trusted VF with ID 0, and the software function\nis to control the flow setting of other VFs by the mailbox with PF.\n\nIt doesn't handle packet Rx/Tx related things. This PMD needs the iAVF\nvirtchnl to send the ICE PF's AdminQ command.\n\nAlso for security, it needs to acquire the DCF capability from PF. The\nflow related things will be added later, it shares most of the ICE flow\nfunction. This mainly handles hardware initialization etc.\n\n                               .-------------.\n                             .-|             |\n                           .-| |             |\n                           | | |  iAVF PMD   |\n                           | | |             |\n                           | | |             |\n                           | | '-------------'\n                           | '-------------'\n                           '-------------'\n                          ^   Other VFs\n                         /\n                        / Flow Distribution\n  .------------------. /\n  |                  |/  DCF cap req   .-------------.\n  |      CVL         .  <----------    |             |\n  |     Kernel       |  ---------->    |             |\n  .                  .   DCF cap rsp   |   DCF PMD   |\n  |                  |                 |             |\n  '------------------'  <-----------   |             |\n                          rte_flow     '-------------'\n                                             VF0\n\nSigned-off-by: Haiyue Wang <haiyue.wang@intel.com>\n---\n doc/guides/nics/ice.rst          |  47 +++\n doc/guides/nics/img/ice_dcf.png  | Bin 0 -> 39168 bytes\n drivers/common/Makefile          |   1 +\n drivers/net/ice/Makefile         |   6 +\n drivers/net/ice/ice_dcf.c        | 651 +++++++++++++++++++++++++++++++\n drivers/net/ice/ice_dcf.h        |  61 +++\n drivers/net/ice/ice_dcf_ethdev.c | 319 +++++++++++++++\n drivers/net/ice/ice_dcf_ethdev.h |  33 ++\n drivers/net/ice/ice_dcf_parent.c | 348 +++++++++++++++++\n drivers/net/ice/meson.build      |   8 +-\n mk/rte.app.mk                    |   1 +\n 11 files changed, 1473 insertions(+), 2 deletions(-)\n create mode 100644 doc/guides/nics/img/ice_dcf.png\n create mode 100644 drivers/net/ice/ice_dcf.c\n create mode 100644 drivers/net/ice/ice_dcf.h\n create mode 100644 drivers/net/ice/ice_dcf_ethdev.c\n create mode 100644 drivers/net/ice/ice_dcf_ethdev.h\n create mode 100644 drivers/net/ice/ice_dcf_parent.c",
    "diff": "diff --git a/doc/guides/nics/ice.rst b/doc/guides/nics/ice.rst\nindex 8af32dabf..2639ae239 100644\n--- a/doc/guides/nics/ice.rst\n+++ b/doc/guides/nics/ice.rst\n@@ -240,6 +240,53 @@ report a MDD event and drop the packets.\n \n The APPs based on DPDK should avoid providing such packets.\n \n+Device Config Function (DCF)\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+This section demonstrates ICE DCF PMD, which shares the core module with ICE\n+PMD and iAVF PMD.\n+\n+A DCF (Device Config Function) PMD bounds to the device's trusted VF with ID 0,\n+it can act as a sole controlling entity to exercise advance functionality (such\n+as switch, ACL) for the rest VFs.\n+\n+The DCF PMD needs to advertise and acquire DCF capability which allows DCF to\n+send AdminQ commands that it would like to execute over to the PF and receive\n+responses for the same from PF.\n+\n+.. _figure_ice_dcf:\n+\n+.. figure:: img/ice_dcf.*\n+\n+   DCF Communication flow.\n+\n+#. Create the VFs::\n+\n+      echo 4 > /sys/bus/pci/devices/0000\\:18\\:00.0/sriov_numvfs\n+\n+#. Enable the VF0 trust on::\n+\n+      ip link set dev enp24s0f0 vf 0 trust on\n+\n+#. Bind the VF0,  and run testpmd with 'cap=dcf' devarg::\n+\n+      testpmd -l 22-25 -n 4 -w 18:01.0,cap=dcf -- -i\n+\n+#. Monitor the VF2 interface network traffic::\n+\n+      tcpdump -e -nn -i enp24s1f2\n+\n+#. Create one flow to redirect the traffic to VF2 by DCF::\n+\n+      flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 \\\n+      dst is 192.168.0.3 / end actions vf id 2 / end\n+\n+#. Send the packet, and it should be displayed on tcpdump::\n+\n+      sendp(Ether(src='3c:fd:fe:aa:bb:78', dst='00:00:00:01:02:03')/IP(src=' \\\n+      192.168.0.2', dst=\"192.168.0.3\")/TCP(flags='S')/Raw(load='XXXXXXXXXX'), \\\n+      iface=\"enp24s0f0\", count=10)\n+\n Sample Application Notes\n ------------------------\n \ndiff --git a/doc/guides/nics/img/ice_dcf.png b/doc/guides/nics/img/ice_dcf.png\nnew file mode 100644\nindex 0000000000000000000000000000000000000000..540823c4a05e9ea9d558d233fea77016d1ae5df3\nGIT binary patch\nliteral 39168\n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\n\nliteral 0\nHcmV?d00001\n\ndiff --git a/drivers/common/Makefile b/drivers/common/Makefile\nindex 96bd7ac6e..df2e840cf 100644\n--- a/drivers/common/Makefile\n+++ b/drivers/common/Makefile\n@@ -31,6 +31,7 @@ DIRS-y += dpaax\n endif\n \n IAVF-y := $(CONFIG_RTE_LIBRTE_IAVF_PMD)\n+IAVF-y += $(CONFIG_RTE_LIBRTE_ICE_PMD)\n ifneq (,$(findstring y,$(IAVF-y)))\n DIRS-y += iavf\n endif\ndiff --git a/drivers/net/ice/Makefile b/drivers/net/ice/Makefile\nindex e22c34287..643639a50 100644\n--- a/drivers/net/ice/Makefile\n+++ b/drivers/net/ice/Makefile\n@@ -11,9 +11,11 @@ LIB = librte_pmd_ice.a\n CFLAGS += -O3\n CFLAGS += $(WERROR_FLAGS)\n CFLAGS += -DALLOW_EXPERIMENTAL_API\n+CFLAGS += -I$(RTE_SDK)/drivers/common/iavf\n \n LDLIBS += -lrte_eal -lrte_mbuf -lrte_ethdev -lrte_kvargs\n LDLIBS += -lrte_bus_pci -lrte_mempool -lrte_hash\n+LDLIBS += -lrte_net -lrte_common_iavf\n \n EXPORT_MAP := rte_pmd_ice_version.map\n \n@@ -84,6 +86,10 @@ ifeq ($(CC_AVX2_SUPPORT), 1)\n endif\n SRCS-$(CONFIG_RTE_LIBRTE_ICE_PMD) += ice_generic_flow.c\n \n+SRCS-$(CONFIG_RTE_LIBRTE_ICE_PMD) += ice_dcf.c\n+SRCS-$(CONFIG_RTE_LIBRTE_ICE_PMD) += ice_dcf_parent.c\n+SRCS-$(CONFIG_RTE_LIBRTE_ICE_PMD) += ice_dcf_ethdev.c\n+\n # install this header file\n SYMLINK-$(CONFIG_RTE_LIBRTE_ICE_PMD)-include := rte_pmd_ice.h\n \ndiff --git a/drivers/net/ice/ice_dcf.c b/drivers/net/ice/ice_dcf.c\nnew file mode 100644\nindex 000000000..669122331\n--- /dev/null\n+++ b/drivers/net/ice/ice_dcf.c\n@@ -0,0 +1,651 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2019 Intel Corporation\n+ */\n+\n+#include <sys/queue.h>\n+#include <stdio.h>\n+#include <errno.h>\n+#include <stdint.h>\n+#include <string.h>\n+#include <unistd.h>\n+#include <stdarg.h>\n+#include <inttypes.h>\n+#include <rte_byteorder.h>\n+#include <rte_common.h>\n+\n+#include <rte_pci.h>\n+#include <rte_atomic.h>\n+#include <rte_eal.h>\n+#include <rte_ether.h>\n+#include <rte_ethdev_driver.h>\n+#include <rte_ethdev_pci.h>\n+#include <rte_malloc.h>\n+#include <rte_memzone.h>\n+#include <rte_dev.h>\n+\n+#include \"ice_dcf.h\"\n+\n+#define ICE_DCF_AQ_LEN     32\n+#define ICE_DCF_AQ_BUF_SZ  4096\n+\n+#define ICE_DCF_ARQ_MAX_RETRIES 200\n+#define ICE_DCF_ARQ_CHECK_TIME  2   /* msecs */\n+\n+#define ICE_DCF_VF_RES_BUF_SZ\t\\\n+\t(sizeof(struct virtchnl_vf_resource) +\t\\\n+\t\tIAVF_MAX_VF_VSI * sizeof(struct virtchnl_vsi_resource))\n+\n+static __rte_always_inline int\n+ice_dcf_send_cmd_req_no_irq(struct ice_dcf_hw *hw, enum virtchnl_ops op,\n+\t\t\t    uint8_t *req_msg, uint16_t req_msglen)\n+{\n+\treturn iavf_aq_send_msg_to_pf(&hw->avf, op, IAVF_SUCCESS,\n+\t\t\t\t      req_msg, req_msglen, NULL);\n+}\n+\n+static int\n+ice_dcf_recv_cmd_rsp_no_irq(struct ice_dcf_hw *hw, enum virtchnl_ops op,\n+\t\t\t    uint8_t *rsp_msgbuf, uint16_t rsp_buflen,\n+\t\t\t    uint16_t *rsp_msglen)\n+{\n+\tstruct iavf_arq_event_info event;\n+\tenum virtchnl_ops v_op;\n+\tint i = 0;\n+\tint err;\n+\n+\tevent.buf_len = rsp_buflen;\n+\tevent.msg_buf = rsp_msgbuf;\n+\n+\tdo {\n+\t\terr = iavf_clean_arq_element(&hw->avf, &event, NULL);\n+\t\tif (err != IAVF_SUCCESS)\n+\t\t\tgoto again;\n+\n+\t\tv_op = rte_le_to_cpu_32(event.desc.cookie_high);\n+\t\tif (v_op != op)\n+\t\t\tgoto again;\n+\n+\t\tif (rsp_msglen != NULL)\n+\t\t\t*rsp_msglen = event.msg_len;\n+\t\treturn rte_le_to_cpu_32(event.desc.cookie_low);\n+\n+again:\n+\t\trte_delay_ms(ICE_DCF_ARQ_CHECK_TIME);\n+\t} while (i++ < ICE_DCF_ARQ_MAX_RETRIES);\n+\n+\treturn -EIO;\n+}\n+\n+static __rte_always_inline void\n+ice_dcf_aq_cmd_clear(struct ice_dcf_hw *hw, struct dcf_virtchnl_cmd *cmd)\n+{\n+\trte_spinlock_lock(&hw->vc_cmd_queue_lock);\n+\n+\tTAILQ_REMOVE(&hw->vc_cmd_queue, cmd, next);\n+\n+\trte_spinlock_unlock(&hw->vc_cmd_queue_lock);\n+}\n+\n+static __rte_always_inline void\n+ice_dcf_vc_cmd_set(struct ice_dcf_hw *hw, struct dcf_virtchnl_cmd *cmd)\n+{\n+\tcmd->v_ret = IAVF_ERR_NOT_READY;\n+\tcmd->rsp_msglen = 0;\n+\tcmd->pending = 1;\n+\n+\trte_spinlock_lock(&hw->vc_cmd_queue_lock);\n+\n+\tTAILQ_INSERT_TAIL(&hw->vc_cmd_queue, cmd, next);\n+\n+\trte_spinlock_unlock(&hw->vc_cmd_queue_lock);\n+}\n+\n+static __rte_always_inline int\n+ice_dcf_vc_cmd_send(struct ice_dcf_hw *hw, struct dcf_virtchnl_cmd *cmd)\n+{\n+\treturn iavf_aq_send_msg_to_pf(&hw->avf,\n+\t\t\t\t      cmd->v_op, IAVF_SUCCESS,\n+\t\t\t\t      cmd->req_msg, cmd->req_msglen, NULL);\n+}\n+\n+static __rte_always_inline void\n+ice_dcf_aq_cmd_handle(struct ice_dcf_hw *hw, struct iavf_arq_event_info *info)\n+{\n+\tstruct dcf_virtchnl_cmd *cmd;\n+\tenum virtchnl_ops v_op;\n+\tenum iavf_status v_ret;\n+\tuint16_t aq_op;\n+\n+\taq_op = rte_le_to_cpu_16(info->desc.opcode);\n+\tif (unlikely(aq_op != iavf_aqc_opc_send_msg_to_vf)) {\n+\t\tPMD_DRV_LOG(ERR,\n+\t\t\t    \"Request %u is not supported yet\", aq_op);\n+\t\treturn;\n+\t}\n+\n+\tv_op = rte_le_to_cpu_32(info->desc.cookie_high);\n+\tif (unlikely(v_op == VIRTCHNL_OP_EVENT)) {\n+\t\tif (hw->vc_event_msg_cb != NULL)\n+\t\t\thw->vc_event_msg_cb(hw,\n+\t\t\t\t\t    info->msg_buf,\n+\t\t\t\t\t    info->msg_len);\n+\t\treturn;\n+\t}\n+\n+\tv_ret = rte_le_to_cpu_32(info->desc.cookie_low);\n+\n+\trte_spinlock_lock(&hw->vc_cmd_queue_lock);\n+\n+\tTAILQ_FOREACH(cmd, &hw->vc_cmd_queue, next) {\n+\t\tif (cmd->v_op == v_op && cmd->pending) {\n+\t\t\tcmd->v_ret = v_ret;\n+\t\t\tcmd->rsp_msglen = RTE_MIN(info->msg_len,\n+\t\t\t\t\t\t  cmd->rsp_buflen);\n+\t\t\tif (likely(cmd->rsp_msglen != 0))\n+\t\t\t\trte_memcpy(cmd->rsp_msgbuf, info->msg_buf,\n+\t\t\t\t\t   cmd->rsp_msglen);\n+\n+\t\t\t/* prevent compiler reordering */\n+\t\t\trte_compiler_barrier();\n+\t\t\tcmd->pending = 0;\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\trte_spinlock_unlock(&hw->vc_cmd_queue_lock);\n+}\n+\n+static void\n+ice_dcf_handle_virtchnl_msg(struct ice_dcf_hw *hw)\n+{\n+\tstruct iavf_arq_event_info info;\n+\tuint16_t pending = 1;\n+\tint ret;\n+\n+\tinfo.buf_len = ICE_DCF_AQ_BUF_SZ;\n+\tinfo.msg_buf = hw->arq_buf;\n+\n+\twhile (pending) {\n+\t\tret = iavf_clean_arq_element(&hw->avf, &info, &pending);\n+\t\tif (ret != IAVF_SUCCESS)\n+\t\t\tbreak;\n+\n+\t\tice_dcf_aq_cmd_handle(hw, &info);\n+\t}\n+}\n+\n+static int\n+ice_dcf_init_check_api_version(struct ice_dcf_hw *hw)\n+{\n+#define ICE_CPF_VIRTCHNL_VERSION_MAJOR_START\t1\n+#define ICE_CPF_VIRTCHNL_VERSION_MINOR_START\t1\n+\tstruct virtchnl_version_info version, *pver;\n+\tint err;\n+\n+\tversion.major = VIRTCHNL_VERSION_MAJOR;\n+\tversion.minor = VIRTCHNL_VERSION_MINOR;\n+\terr = ice_dcf_send_cmd_req_no_irq(hw, VIRTCHNL_OP_VERSION,\n+\t\t\t\t\t  (uint8_t *)&version, sizeof(version));\n+\tif (err) {\n+\t\tPMD_INIT_LOG(ERR, \"Fail to send OP_VERSION\");\n+\t\treturn err;\n+\t}\n+\n+\tpver = &hw->virtchnl_version;\n+\terr = ice_dcf_recv_cmd_rsp_no_irq(hw, VIRTCHNL_OP_VERSION,\n+\t\t\t\t\t  (uint8_t *)pver, sizeof(*pver), NULL);\n+\tif (err) {\n+\t\tPMD_INIT_LOG(ERR, \"Fail to get response of OP_VERSION\");\n+\t\treturn -1;\n+\t}\n+\n+\tPMD_DRV_LOG(DEBUG,\n+\t\t    \"Peer PF API version: %u.%u\", pver->major, pver->minor);\n+\n+\tif (pver->major < ICE_CPF_VIRTCHNL_VERSION_MAJOR_START ||\n+\t    (pver->major == ICE_CPF_VIRTCHNL_VERSION_MAJOR_START &&\n+\t     pver->minor < ICE_CPF_VIRTCHNL_VERSION_MINOR_START)) {\n+\t\tPMD_INIT_LOG(ERR,\n+\t\t\t     \"VIRTCHNL API version should not be lower than (%u.%u)\",\n+\t\t\t     ICE_CPF_VIRTCHNL_VERSION_MAJOR_START,\n+\t\t\t     ICE_CPF_VIRTCHNL_VERSION_MAJOR_START);\n+\t\treturn -1;\n+\t} else if (pver->major > VIRTCHNL_VERSION_MAJOR ||\n+\t\t   (pver->major == VIRTCHNL_VERSION_MAJOR &&\n+\t\t    pver->minor > VIRTCHNL_VERSION_MINOR)) {\n+\t\tPMD_INIT_LOG(ERR,\n+\t\t\t     \"PF/VF API version mismatch:(%u.%u)-(%u.%u)\",\n+\t\t\t     pver->major, pver->minor,\n+\t\t\t     VIRTCHNL_VERSION_MAJOR, VIRTCHNL_VERSION_MINOR);\n+\t\treturn -1;\n+\t}\n+\n+\tPMD_DRV_LOG(DEBUG, \"Peer is supported PF host\");\n+\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_get_vf_resource(struct ice_dcf_hw *hw)\n+{\n+\tuint32_t caps;\n+\tint err, i;\n+\n+\tcaps = VIRTCHNL_VF_OFFLOAD_WB_ON_ITR | VIRTCHNL_VF_OFFLOAD_RX_POLLING |\n+\t       VIRTCHNL_VF_CAP_ADV_LINK_SPEED | VIRTCHNL_VF_CAP_DCF |\n+\t       VF_BASE_MODE_OFFLOADS;\n+\n+\terr = ice_dcf_send_cmd_req_no_irq(hw, VIRTCHNL_OP_GET_VF_RESOURCES,\n+\t\t\t\t\t  (uint8_t *)&caps, sizeof(caps));\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"Fail to send msg OP_GET_VF_RESOURCE\");\n+\t\treturn err;\n+\t}\n+\n+\terr = ice_dcf_recv_cmd_rsp_no_irq(hw, VIRTCHNL_OP_GET_VF_RESOURCES,\n+\t\t\t\t\t  (uint8_t *)hw->vf_res,\n+\t\t\t\t\t  ICE_DCF_VF_RES_BUF_SZ, NULL);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"Fail to get response of OP_GET_VF_RESOURCE\");\n+\t\treturn -1;\n+\t}\n+\n+\tiavf_vf_parse_hw_config(&hw->avf, hw->vf_res);\n+\n+\thw->vsi_res = NULL;\n+\tfor (i = 0; i < hw->vf_res->num_vsis; i++) {\n+\t\tif (hw->vf_res->vsi_res[i].vsi_type == VIRTCHNL_VSI_SRIOV)\n+\t\t\thw->vsi_res = &hw->vf_res->vsi_res[i];\n+\t}\n+\n+\tif (!hw->vsi_res) {\n+\t\tPMD_DRV_LOG(ERR, \"no LAN VSI found\");\n+\t\treturn -1;\n+\t}\n+\n+\thw->vsi_id = hw->vsi_res->vsi_id;\n+\tPMD_DRV_LOG(DEBUG, \"VSI ID is %u\", hw->vsi_id);\n+\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_get_vf_vsi_map(struct ice_dcf_hw *hw)\n+{\n+\tstruct virtchnl_dcf_vsi_map *vsi_map;\n+\tuint16_t len;\n+\tint err;\n+\n+\terr = ice_dcf_send_cmd_req_no_irq(hw, VIRTCHNL_OP_DCF_GET_VSI_MAP,\n+\t\t\t\t\t  NULL, 0);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"Fail to send msg OP_DCF_GET_VSI_MAP\");\n+\t\treturn err;\n+\t}\n+\n+\terr = ice_dcf_recv_cmd_rsp_no_irq(hw, VIRTCHNL_OP_DCF_GET_VSI_MAP,\n+\t\t\t\t\t  hw->arq_buf, ICE_DCF_AQ_BUF_SZ,\n+\t\t\t\t\t  &len);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"Fail to get response of OP_DCF_GET_VSI_MAP\");\n+\t\treturn err;\n+\t}\n+\n+\tvsi_map = (struct virtchnl_dcf_vsi_map *)hw->arq_buf;\n+\tif (len < sizeof(*vsi_map) || !vsi_map->num_vfs ||\n+\t    len < sizeof(*vsi_map) +\n+\t\t\t(vsi_map->num_vfs - 1) * sizeof(vsi_map->vf_vsi[0])) {\n+\t\tPMD_DRV_LOG(ERR, \"invalid vf vsi map response with length %u\",\n+\t\t\t    len);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (hw->num_vfs != 0 && hw->num_vfs != vsi_map->num_vfs) {\n+\t\tPMD_DRV_LOG(ERR, \"The number VSI map (%u) doesn't match the number of VFs (%u)\",\n+\t\t\t    vsi_map->num_vfs, hw->num_vfs);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tlen = vsi_map->num_vfs * sizeof(vsi_map->vf_vsi[0]);\n+\tif (!hw->vf_vsi_map) {\n+\t\thw->num_vfs = vsi_map->num_vfs;\n+\t\thw->vf_vsi_map = rte_zmalloc(\"vf_vsi_ctx\", len, 0);\n+\t}\n+\n+\tif (!hw->vf_vsi_map) {\n+\t\tPMD_DRV_LOG(ERR, \"Fail to alloc memory for VSI context\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tif (!memcmp(hw->vf_vsi_map, vsi_map->vf_vsi, len)) {\n+\t\tPMD_DRV_LOG(DEBUG, \"VF VSI map doesn't change\");\n+\t\treturn 1;\n+\t}\n+\n+\trte_memcpy(hw->vf_vsi_map, vsi_map->vf_vsi, len);\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_mode_disable(struct ice_dcf_hw *hw)\n+{\n+\tint err;\n+\n+\terr = ice_dcf_send_cmd_req_no_irq(hw, VIRTCHNL_OP_DCF_DISABLE,\n+\t\t\t\t\t  NULL, 0);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"Fail to send msg OP_DCF_DISABLE\");\n+\t\treturn err;\n+\t}\n+\n+\terr = ice_dcf_recv_cmd_rsp_no_irq(hw, VIRTCHNL_OP_DCF_DISABLE,\n+\t\t\t\t\t  (uint8_t *)hw->arq_buf,\n+\t\t\t\t\t  ICE_DCF_AQ_BUF_SZ, NULL);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR,\n+\t\t\t    \"Fail to get response of OP_DCF_DISABLE %d\",\n+\t\t\t    err);\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_check_reset_done(struct ice_dcf_hw *hw)\n+{\n+#define ICE_DCF_RESET_WAIT_CNT       50\n+\tstruct iavf_hw *avf = &hw->avf;\n+\tint i, reset;\n+\n+\tfor (i = 0; i < ICE_DCF_RESET_WAIT_CNT; i++) {\n+\t\treset = IAVF_READ_REG(avf, IAVF_VFGEN_RSTAT) &\n+\t\t\t\t\tIAVF_VFGEN_RSTAT_VFR_STATE_MASK;\n+\t\treset = reset >> IAVF_VFGEN_RSTAT_VFR_STATE_SHIFT;\n+\n+\t\tif (reset == VIRTCHNL_VFR_VFACTIVE ||\n+\t\t    reset == VIRTCHNL_VFR_COMPLETED)\n+\t\t\tbreak;\n+\n+\t\trte_delay_ms(20);\n+\t}\n+\n+\tif (i >= ICE_DCF_RESET_WAIT_CNT)\n+\t\treturn -1;\n+\n+\treturn 0;\n+}\n+\n+static inline void\n+ice_dcf_enable_irq0(struct ice_dcf_hw *hw)\n+{\n+\tstruct iavf_hw *avf = &hw->avf;\n+\n+\t/* Enable admin queue interrupt trigger */\n+\tIAVF_WRITE_REG(avf, IAVF_VFINT_ICR0_ENA1,\n+\t\t       IAVF_VFINT_ICR0_ENA1_ADMINQ_MASK);\n+\tIAVF_WRITE_REG(avf, IAVF_VFINT_DYN_CTL01,\n+\t\t       IAVF_VFINT_DYN_CTL01_INTENA_MASK |\n+\t\t       IAVF_VFINT_DYN_CTL01_CLEARPBA_MASK |\n+\t\t       IAVF_VFINT_DYN_CTL01_ITR_INDX_MASK);\n+\n+\tIAVF_WRITE_FLUSH(avf);\n+}\n+\n+static inline void\n+ice_dcf_disable_irq0(struct ice_dcf_hw *hw)\n+{\n+\tstruct iavf_hw *avf = &hw->avf;\n+\n+\t/* Disable all interrupt types */\n+\tIAVF_WRITE_REG(avf, IAVF_VFINT_ICR0_ENA1, 0);\n+\tIAVF_WRITE_REG(avf, IAVF_VFINT_DYN_CTL01,\n+\t\t       IAVF_VFINT_DYN_CTL01_ITR_INDX_MASK);\n+\n+\tIAVF_WRITE_FLUSH(avf);\n+}\n+\n+static void\n+ice_dcf_dev_interrupt_handler(void *param)\n+{\n+\tstruct ice_dcf_hw *hw = param;\n+\n+\tice_dcf_disable_irq0(hw);\n+\n+\tice_dcf_handle_virtchnl_msg(hw);\n+\n+\tice_dcf_enable_irq0(hw);\n+}\n+\n+int\n+ice_dcf_execute_virtchnl_cmd(struct ice_dcf_hw *hw,\n+\t\t\t     struct dcf_virtchnl_cmd *cmd)\n+{\n+\tint i = 0;\n+\tint err;\n+\n+\tif ((cmd->req_msg && !cmd->req_msglen) ||\n+\t    (!cmd->req_msg && cmd->req_msglen) ||\n+\t    (cmd->rsp_msgbuf && !cmd->rsp_buflen) ||\n+\t    (!cmd->rsp_msgbuf && cmd->rsp_buflen))\n+\t\treturn -EINVAL;\n+\n+\trte_spinlock_lock(&hw->vc_cmd_send_lock);\n+\tice_dcf_vc_cmd_set(hw, cmd);\n+\n+\terr = ice_dcf_vc_cmd_send(hw, cmd);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"fail to send cmd %d\", cmd->v_op);\n+\t\tgoto ret;\n+\t}\n+\n+\tdo {\n+\t\tif (!cmd->pending)\n+\t\t\tbreak;\n+\n+\t\trte_delay_ms(ICE_DCF_ARQ_CHECK_TIME);\n+\t} while (i++ < ICE_DCF_ARQ_MAX_RETRIES);\n+\n+\tif (cmd->v_ret != IAVF_SUCCESS) {\n+\t\terr = -1;\n+\t\tPMD_DRV_LOG(ERR,\n+\t\t\t    \"No response (%d times) or return failure (%d) for cmd %d\",\n+\t\t\t    i, cmd->v_ret, cmd->v_op);\n+\t}\n+\n+ret:\n+\tice_dcf_aq_cmd_clear(hw, cmd);\n+\trte_spinlock_unlock(&hw->vc_cmd_send_lock);\n+\treturn err;\n+}\n+\n+int\n+ice_dcf_send_aq_cmd(void *dcf_hw, struct ice_aq_desc *desc,\n+\t\t    void *buf, uint16_t buf_size)\n+{\n+\tstruct dcf_virtchnl_cmd desc_cmd, buff_cmd;\n+\tstruct ice_dcf_hw *hw = dcf_hw;\n+\tint err = 0;\n+\tint i = 0;\n+\n+\tif ((buf && !buf_size) || (!buf && buf_size) ||\n+\t    buf_size > ICE_DCF_AQ_BUF_SZ)\n+\t\treturn -EINVAL;\n+\n+\tdesc_cmd.v_op = VIRTCHNL_OP_DCF_CMD_DESC;\n+\tdesc_cmd.req_msglen = sizeof(*desc);\n+\tdesc_cmd.req_msg = (uint8_t *)desc;\n+\tdesc_cmd.rsp_buflen = sizeof(*desc);\n+\tdesc_cmd.rsp_msgbuf = (uint8_t *)desc;\n+\n+\tif (buf == NULL)\n+\t\treturn ice_dcf_execute_virtchnl_cmd(hw, &desc_cmd);\n+\n+\tdesc->flags |= rte_cpu_to_le_16(ICE_AQ_FLAG_BUF);\n+\n+\tbuff_cmd.v_op = VIRTCHNL_OP_DCF_CMD_BUFF;\n+\tbuff_cmd.req_msglen = buf_size;\n+\tbuff_cmd.req_msg = buf;\n+\tbuff_cmd.rsp_buflen = buf_size;\n+\tbuff_cmd.rsp_msgbuf = buf;\n+\n+\trte_spinlock_lock(&hw->vc_cmd_send_lock);\n+\tice_dcf_vc_cmd_set(hw, &desc_cmd);\n+\tice_dcf_vc_cmd_set(hw, &buff_cmd);\n+\n+\tif (ice_dcf_vc_cmd_send(hw, &desc_cmd) ||\n+\t    ice_dcf_vc_cmd_send(hw, &buff_cmd)) {\n+\t\terr = -1;\n+\t\tPMD_DRV_LOG(ERR, \"fail to send OP_DCF_CMD_DESC/BUFF\");\n+\t\tgoto ret;\n+\t}\n+\n+\tdo {\n+\t\tif ((!desc_cmd.pending && !buff_cmd.pending) ||\n+\t\t    (!desc_cmd.pending && desc_cmd.v_ret != IAVF_SUCCESS) ||\n+\t\t    (!buff_cmd.pending && buff_cmd.v_ret != IAVF_SUCCESS))\n+\t\t\tbreak;\n+\n+\t\trte_delay_ms(ICE_DCF_ARQ_CHECK_TIME);\n+\t} while (i++ < ICE_DCF_ARQ_MAX_RETRIES);\n+\n+\tif (desc_cmd.v_ret != IAVF_SUCCESS || buff_cmd.v_ret != IAVF_SUCCESS) {\n+\t\terr = -1;\n+\t\tPMD_DRV_LOG(ERR,\n+\t\t\t    \"No response (%d times) or return failure (desc: %d / buff: %d)\",\n+\t\t\t    i, desc_cmd.v_ret, buff_cmd.v_ret);\n+\t}\n+\n+ret:\n+\tice_dcf_aq_cmd_clear(hw, &desc_cmd);\n+\tice_dcf_aq_cmd_clear(hw, &buff_cmd);\n+\trte_spinlock_unlock(&hw->vc_cmd_send_lock);\n+\n+\treturn err;\n+}\n+\n+int\n+ice_dcf_handle_vsi_update_event(struct ice_dcf_hw *hw)\n+{\n+\tint err = 0;\n+\n+\trte_spinlock_lock(&hw->vc_cmd_send_lock);\n+\tice_dcf_disable_irq0(hw);\n+\n+\tif (ice_dcf_get_vf_resource(hw) || ice_dcf_get_vf_vsi_map(hw))\n+\t\terr = -1;\n+\n+\tice_dcf_enable_irq0(hw);\n+\trte_spinlock_unlock(&hw->vc_cmd_send_lock);\n+\n+\treturn err;\n+}\n+\n+int\n+ice_dcf_init_hw(struct rte_eth_dev *eth_dev, struct ice_dcf_hw *hw)\n+{\n+\tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);\n+\tint ret;\n+\n+\thw->avf.hw_addr = pci_dev->mem_resource[0].addr;\n+\thw->avf.back = hw;\n+\n+\thw->avf.bus.bus_id = pci_dev->addr.bus;\n+\thw->avf.bus.device = pci_dev->addr.devid;\n+\thw->avf.bus.func = pci_dev->addr.function;\n+\n+\thw->avf.device_id = pci_dev->id.device_id;\n+\thw->avf.vendor_id = pci_dev->id.vendor_id;\n+\thw->avf.subsystem_device_id = pci_dev->id.subsystem_device_id;\n+\thw->avf.subsystem_vendor_id = pci_dev->id.subsystem_vendor_id;\n+\n+\thw->avf.aq.num_arq_entries = ICE_DCF_AQ_LEN;\n+\thw->avf.aq.num_asq_entries = ICE_DCF_AQ_LEN;\n+\thw->avf.aq.arq_buf_size = ICE_DCF_AQ_BUF_SZ;\n+\thw->avf.aq.asq_buf_size = ICE_DCF_AQ_BUF_SZ;\n+\n+\trte_spinlock_init(&hw->vc_cmd_send_lock);\n+\trte_spinlock_init(&hw->vc_cmd_queue_lock);\n+\tTAILQ_INIT(&hw->vc_cmd_queue);\n+\n+\thw->arq_buf = rte_zmalloc(\"arq_buf\", ICE_DCF_AQ_BUF_SZ, 0);\n+\tif (hw->arq_buf == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"unable to allocate AdminQ buffer memory\");\n+\t\tgoto err;\n+\t}\n+\n+\tret = iavf_set_mac_type(&hw->avf);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(ERR, \"set_mac_type failed: %d\", ret);\n+\t\tgoto err;\n+\t}\n+\n+\tret = ice_dcf_check_reset_done(hw);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(ERR, \"VF is still resetting\");\n+\t\tgoto err;\n+\t}\n+\n+\tret = iavf_init_adminq(&hw->avf);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(ERR, \"init_adminq failed: %d\", ret);\n+\t\tgoto err;\n+\t}\n+\n+\tif (ice_dcf_init_check_api_version(hw)) {\n+\t\tPMD_INIT_LOG(ERR, \"check_api version failed\");\n+\t\tgoto err_api;\n+\t}\n+\n+\thw->vf_res = rte_zmalloc(\"vf_res\", ICE_DCF_VF_RES_BUF_SZ, 0);\n+\tif (hw->vf_res == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"unable to allocate vf_res memory\");\n+\t\tgoto err_api;\n+\t}\n+\n+\tif (ice_dcf_get_vf_resource(hw)) {\n+\t\tPMD_INIT_LOG(ERR, \"Failed to get VF resource\");\n+\t\tgoto err_alloc;\n+\t}\n+\n+\tif (ice_dcf_get_vf_vsi_map(hw) < 0) {\n+\t\tPMD_INIT_LOG(ERR, \"Failed to get VF VSI map\");\n+\t\tice_dcf_mode_disable(hw);\n+\t\tgoto err_alloc;\n+\t}\n+\n+\trte_intr_callback_register(&pci_dev->intr_handle,\n+\t\t\t\t   ice_dcf_dev_interrupt_handler, hw);\n+\trte_intr_enable(&pci_dev->intr_handle);\n+\tice_dcf_enable_irq0(hw);\n+\n+\treturn 0;\n+\n+err_alloc:\n+\trte_free(hw->vf_res);\n+err_api:\n+\tiavf_shutdown_adminq(&hw->avf);\n+err:\n+\trte_free(hw->arq_buf);\n+\n+\treturn -1;\n+}\n+\n+void\n+ice_dcf_uninit_hw(struct rte_eth_dev *eth_dev, struct ice_dcf_hw *hw)\n+{\n+\tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);\n+\tstruct rte_intr_handle *intr_handle = &pci_dev->intr_handle;\n+\n+\tice_dcf_disable_irq0(hw);\n+\trte_intr_disable(intr_handle);\n+\trte_intr_callback_unregister(intr_handle,\n+\t\t\t\t     ice_dcf_dev_interrupt_handler, hw);\n+\n+\tice_dcf_mode_disable(hw);\n+\tiavf_shutdown_adminq(&hw->avf);\n+\n+\trte_free(hw->arq_buf);\n+\trte_free(hw->vf_vsi_map);\n+\trte_free(hw->vf_res);\n+}\ndiff --git a/drivers/net/ice/ice_dcf.h b/drivers/net/ice/ice_dcf.h\nnew file mode 100644\nindex 000000000..58647d87f\n--- /dev/null\n+++ b/drivers/net/ice/ice_dcf.h\n@@ -0,0 +1,61 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2019 Intel Corporation\n+ */\n+\n+#ifndef _ICE_DCF_H_\n+#define _ICE_DCF_H_\n+\n+#include <rte_ethdev_driver.h>\n+\n+#include <iavf_prototype.h>\n+#include <iavf_adminq_cmd.h>\n+#include <iavf_type.h>\n+\n+#include \"base/ice_type.h\"\n+#include \"ice_logs.h\"\n+\n+struct dcf_virtchnl_cmd {\n+\tTAILQ_ENTRY(dcf_virtchnl_cmd) next;\n+\n+\tenum virtchnl_ops v_op;\n+\tenum iavf_status v_ret;\n+\n+\tuint16_t req_msglen;\n+\tuint8_t *req_msg;\n+\n+\tuint16_t rsp_msglen;\n+\tuint16_t rsp_buflen;\n+\tuint8_t *rsp_msgbuf;\n+\n+\tvolatile int pending;\n+};\n+\n+struct ice_dcf_hw {\n+\tstruct iavf_hw avf;\n+\n+\trte_spinlock_t vc_cmd_send_lock;\n+\trte_spinlock_t vc_cmd_queue_lock;\n+\tTAILQ_HEAD(, dcf_virtchnl_cmd) vc_cmd_queue;\n+\tvoid (*vc_event_msg_cb)(struct ice_dcf_hw *dcf_hw,\n+\t\t\t\tuint8_t *msg, uint16_t msglen);\n+\n+\tuint8_t *arq_buf;\n+\n+\tuint16_t num_vfs;\n+\tuint16_t *vf_vsi_map;\n+\n+\tstruct virtchnl_version_info virtchnl_version;\n+\tstruct virtchnl_vf_resource *vf_res; /* VF resource */\n+\tstruct virtchnl_vsi_resource *vsi_res; /* LAN VSI */\n+\tuint16_t vsi_id;\n+};\n+\n+int ice_dcf_execute_virtchnl_cmd(struct ice_dcf_hw *hw,\n+\t\t\t\t struct dcf_virtchnl_cmd *cmd);\n+int ice_dcf_send_aq_cmd(void *dcf_hw, struct ice_aq_desc *desc,\n+\t\t\tvoid *buf, uint16_t buf_size);\n+int ice_dcf_handle_vsi_update_event(struct ice_dcf_hw *hw);\n+int ice_dcf_init_hw(struct rte_eth_dev *eth_dev, struct ice_dcf_hw *hw);\n+void ice_dcf_uninit_hw(struct rte_eth_dev *eth_dev, struct ice_dcf_hw *hw);\n+\n+#endif /* _ICE_DCF_H_ */\ndiff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c\nnew file mode 100644\nindex 000000000..f65b962d4\n--- /dev/null\n+++ b/drivers/net/ice/ice_dcf_ethdev.c\n@@ -0,0 +1,319 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2019 Intel Corporation\n+ */\n+\n+#include <errno.h>\n+#include <stdbool.h>\n+#include <sys/types.h>\n+#include <sys/ioctl.h>\n+#include <unistd.h>\n+\n+#include <rte_interrupts.h>\n+#include <rte_debug.h>\n+#include <rte_pci.h>\n+#include <rte_atomic.h>\n+#include <rte_eal.h>\n+#include <rte_ether.h>\n+#include <rte_ethdev_pci.h>\n+#include <rte_kvargs.h>\n+#include <rte_malloc.h>\n+#include <rte_memzone.h>\n+#include <rte_dev.h>\n+\n+#include <iavf_devids.h>\n+\n+#include \"ice_generic_flow.h\"\n+#include \"ice_dcf_ethdev.h\"\n+\n+static uint16_t\n+ice_dcf_recv_pkts(__rte_unused void *rx_queue,\n+\t\t  __rte_unused struct rte_mbuf **bufs,\n+\t\t  __rte_unused uint16_t nb_pkts)\n+{\n+\treturn 0;\n+}\n+\n+static uint16_t\n+ice_dcf_xmit_pkts(__rte_unused void *tx_queue,\n+\t\t  __rte_unused struct rte_mbuf **bufs,\n+\t\t  __rte_unused uint16_t nb_pkts)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_dev_start(struct rte_eth_dev *dev)\n+{\n+\tdev->data->dev_link.link_status = ETH_LINK_UP;\n+\n+\treturn 0;\n+}\n+\n+static void\n+ice_dcf_dev_stop(struct rte_eth_dev *dev)\n+{\n+\tdev->data->dev_link.link_status = ETH_LINK_DOWN;\n+}\n+\n+static int\n+ice_dcf_dev_configure(__rte_unused struct rte_eth_dev *dev)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_dev_info_get(struct rte_eth_dev *dev,\n+\t\t     struct rte_eth_dev_info *dev_info)\n+{\n+\tstruct ice_dcf_adapter *adapter = dev->data->dev_private;\n+\n+\tdev_info->max_mac_addrs = 1;\n+\tdev_info->max_rx_pktlen = (uint32_t)-1;\n+\tdev_info->max_rx_queues = RTE_DIM(adapter->rxqs);\n+\tdev_info->max_tx_queues = RTE_DIM(adapter->txqs);\n+\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_stats_get(__rte_unused struct rte_eth_dev *dev,\n+\t\t  __rte_unused struct rte_eth_stats *igb_stats)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_stats_reset(__rte_unused struct rte_eth_dev *dev)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_dev_promiscuous_enable(__rte_unused struct rte_eth_dev *dev)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_dev_promiscuous_disable(__rte_unused struct rte_eth_dev *dev)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_dev_allmulticast_enable(__rte_unused struct rte_eth_dev *dev)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_dev_allmulticast_disable(__rte_unused struct rte_eth_dev *dev)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_dev_filter_ctrl(struct rte_eth_dev *dev,\n+\t\t\tenum rte_filter_type filter_type,\n+\t\t\t__rte_unused enum rte_filter_op filter_op,\n+\t\t\t__rte_unused void *arg)\n+{\n+\tint ret = 0;\n+\n+\tif (!dev)\n+\t\treturn -EINVAL;\n+\n+\tswitch (filter_type) {\n+\tdefault:\n+\t\tPMD_DRV_LOG(WARNING, \"Filter type (%d) not supported\",\n+\t\t\t    filter_type);\n+\t\tret = -EINVAL;\n+\t\tbreak;\n+\t}\n+\n+\treturn ret;\n+}\n+\n+static void\n+ice_dcf_dev_close(struct rte_eth_dev *dev)\n+{\n+\tstruct ice_dcf_adapter *adapter = dev->data->dev_private;\n+\n+\tif (rte_eal_process_type() != RTE_PROC_PRIMARY)\n+\t\treturn;\n+\n+\tdev->dev_ops = NULL;\n+\tdev->rx_pkt_burst = NULL;\n+\tdev->tx_pkt_burst = NULL;\n+\n+\tice_dcf_uninit_parent_adapter(dev);\n+\tice_dcf_uninit_hw(dev, &adapter->real_hw);\n+}\n+\n+static void\n+ice_dcf_queue_release(__rte_unused void *q)\n+{\n+}\n+\n+static int\n+ice_dcf_link_update(__rte_unused struct rte_eth_dev *dev,\n+\t\t    __rte_unused int wait_to_complete)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_rx_queue_setup(struct rte_eth_dev *dev,\n+\t\t       uint16_t rx_queue_id,\n+\t\t       __rte_unused uint16_t nb_rx_desc,\n+\t\t       __rte_unused unsigned int socket_id,\n+\t\t       __rte_unused const struct rte_eth_rxconf *rx_conf,\n+\t\t       __rte_unused struct rte_mempool *mb_pool)\n+{\n+\tstruct ice_dcf_adapter *adapter = dev->data->dev_private;\n+\n+\tdev->data->rx_queues[rx_queue_id] = &adapter->rxqs[rx_queue_id];\n+\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_tx_queue_setup(struct rte_eth_dev *dev,\n+\t\t       uint16_t tx_queue_id,\n+\t\t       __rte_unused uint16_t nb_tx_desc,\n+\t\t       __rte_unused unsigned int socket_id,\n+\t\t       __rte_unused const struct rte_eth_txconf *tx_conf)\n+{\n+\tstruct ice_dcf_adapter *adapter = dev->data->dev_private;\n+\n+\tdev->data->tx_queues[tx_queue_id] = &adapter->txqs[tx_queue_id];\n+\n+\treturn 0;\n+}\n+\n+static const struct eth_dev_ops ice_dcf_eth_dev_ops = {\n+\t.dev_start               = ice_dcf_dev_start,\n+\t.dev_stop                = ice_dcf_dev_stop,\n+\t.dev_close               = ice_dcf_dev_close,\n+\t.dev_configure           = ice_dcf_dev_configure,\n+\t.dev_infos_get           = ice_dcf_dev_info_get,\n+\t.rx_queue_setup          = ice_dcf_rx_queue_setup,\n+\t.tx_queue_setup          = ice_dcf_tx_queue_setup,\n+\t.rx_queue_release        = ice_dcf_queue_release,\n+\t.tx_queue_release        = ice_dcf_queue_release,\n+\t.link_update             = ice_dcf_link_update,\n+\t.stats_get               = ice_dcf_stats_get,\n+\t.stats_reset             = ice_dcf_stats_reset,\n+\t.promiscuous_enable      = ice_dcf_dev_promiscuous_enable,\n+\t.promiscuous_disable     = ice_dcf_dev_promiscuous_disable,\n+\t.allmulticast_enable     = ice_dcf_dev_allmulticast_enable,\n+\t.allmulticast_disable    = ice_dcf_dev_allmulticast_disable,\n+\t.filter_ctrl             = ice_dcf_dev_filter_ctrl,\n+};\n+\n+static int\n+ice_dcf_dev_init(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct ice_dcf_adapter *adapter = eth_dev->data->dev_private;\n+\n+\teth_dev->dev_ops = &ice_dcf_eth_dev_ops;\n+\teth_dev->rx_pkt_burst = ice_dcf_recv_pkts;\n+\teth_dev->tx_pkt_burst = ice_dcf_xmit_pkts;\n+\n+\tif (rte_eal_process_type() != RTE_PROC_PRIMARY)\n+\t\treturn 0;\n+\n+\teth_dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE;\n+\n+\tadapter->real_hw.vc_event_msg_cb = ice_dcf_handle_pf_event_msg;\n+\tif (ice_dcf_init_hw(eth_dev, &adapter->real_hw) != 0) {\n+\t\tPMD_DRV_LOG(ERR, \"Failed to init DCF hardware\");\n+\t\treturn -1;\n+\t}\n+\n+\tif (ice_dcf_init_parent_adapter(eth_dev) != 0) {\n+\t\tPMD_DRV_LOG(ERR, \"Failed to init DCF parent adapter\");\n+\t\tice_dcf_uninit_hw(eth_dev, &adapter->real_hw);\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+ice_dcf_dev_uninit(struct rte_eth_dev *eth_dev)\n+{\n+\tice_dcf_dev_close(eth_dev);\n+\n+\treturn 0;\n+}\n+\n+static int\n+handle_dcf_arg(__rte_unused const char *key, const char *value,\n+\t       __rte_unused void *arg)\n+{\n+\tbool *dcf = arg;\n+\n+\tif (arg == NULL || value == NULL)\n+\t\treturn -EINVAL;\n+\n+\tif (strcmp(value, \"dcf\") == 0)\n+\t\t*dcf = true;\n+\telse\n+\t\t*dcf = false;\n+\n+\treturn 0;\n+}\n+\n+static bool\n+check_cap_dcf_enable(struct rte_devargs *devargs)\n+{\n+\tstruct rte_kvargs *kvlist;\n+\tbool enable = false;\n+\n+\tif (devargs == NULL)\n+\t\treturn false;\n+\n+\tkvlist = rte_kvargs_parse(devargs->args, NULL);\n+\tif (kvlist == NULL)\n+\t\treturn false;\n+\n+\trte_kvargs_process(kvlist, \"cap\", handle_dcf_arg, &enable);\n+\n+\trte_kvargs_free(kvlist);\n+\n+\treturn enable;\n+}\n+\n+static int eth_ice_dcf_pci_probe(__rte_unused struct rte_pci_driver *pci_drv,\n+\t\t\t     struct rte_pci_device *pci_dev)\n+{\n+\tif (!check_cap_dcf_enable(pci_dev->device.devargs))\n+\t\treturn 1; /* continue to probe */\n+\n+\treturn rte_eth_dev_pci_generic_probe(pci_dev,\n+\t\t\t\t\t     sizeof(struct ice_dcf_adapter),\n+\t\t\t\t\t     ice_dcf_dev_init);\n+}\n+\n+static int eth_ice_dcf_pci_remove(struct rte_pci_device *pci_dev)\n+{\n+\treturn rte_eth_dev_pci_generic_remove(pci_dev, ice_dcf_dev_uninit);\n+}\n+\n+static const struct rte_pci_id pci_id_ice_dcf_map[] = {\n+\t{ RTE_PCI_DEVICE(IAVF_INTEL_VENDOR_ID, IAVF_DEV_ID_ADAPTIVE_VF) },\n+\t{ .vendor_id = 0, /* sentinel */ },\n+};\n+\n+static struct rte_pci_driver rte_ice_dcf_pmd = {\n+\t.id_table = pci_id_ice_dcf_map,\n+\t.drv_flags = RTE_PCI_DRV_NEED_MAPPING,\n+\t.probe = eth_ice_dcf_pci_probe,\n+\t.remove = eth_ice_dcf_pci_remove,\n+};\n+\n+RTE_PMD_REGISTER_PCI(net_ice_dcf, rte_ice_dcf_pmd);\n+RTE_PMD_REGISTER_PCI_TABLE(net_ice_dcf, pci_id_ice_dcf_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_ice_dcf, \"* igb_uio | vfio-pci\");\n+RTE_PMD_REGISTER_PARAM_STRING(net_ice_dcf, \"cap=dcf\");\ndiff --git a/drivers/net/ice/ice_dcf_ethdev.h b/drivers/net/ice/ice_dcf_ethdev.h\nnew file mode 100644\nindex 000000000..e95266599\n--- /dev/null\n+++ b/drivers/net/ice/ice_dcf_ethdev.h\n@@ -0,0 +1,33 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2019 Intel Corporation\n+ */\n+\n+#ifndef _ICE_DCF_ETHDEV_H_\n+#define _ICE_DCF_ETHDEV_H_\n+\n+#include \"base/ice_common.h\"\n+#include \"base/ice_adminq_cmd.h\"\n+\n+#include \"ice_ethdev.h\"\n+#include \"ice_dcf.h\"\n+\n+#define ICE_DCF_MAX_RINGS  1\n+\n+struct ice_dcf_queue {\n+\tuint64_t dummy;\n+};\n+\n+struct ice_dcf_adapter {\n+\tstruct ice_adapter parent; /* Must be first */\n+\n+\tstruct ice_dcf_hw real_hw;\n+\tstruct ice_dcf_queue rxqs[ICE_DCF_MAX_RINGS];\n+\tstruct ice_dcf_queue txqs[ICE_DCF_MAX_RINGS];\n+};\n+\n+void ice_dcf_handle_pf_event_msg(struct ice_dcf_hw *dcf_hw,\n+\t\t\t\t uint8_t *msg, uint16_t msglen);\n+int ice_dcf_init_parent_adapter(struct rte_eth_dev *eth_dev);\n+void ice_dcf_uninit_parent_adapter(struct rte_eth_dev *eth_dev);\n+\n+#endif /* _ICE_DCF_ETHDEV_H_ */\ndiff --git a/drivers/net/ice/ice_dcf_parent.c b/drivers/net/ice/ice_dcf_parent.c\nnew file mode 100644\nindex 000000000..bca9cd34a\n--- /dev/null\n+++ b/drivers/net/ice/ice_dcf_parent.c\n@@ -0,0 +1,348 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2019 Intel Corporation\n+ */\n+#include <sys/types.h>\n+#include <sys/stat.h>\n+#include <unistd.h>\n+\n+#include <rte_alarm.h>\n+\n+#include \"ice_dcf_ethdev.h\"\n+#include \"ice_generic_flow.h\"\n+\n+#define ICE_DCF_VSI_UPDATE_SERVICE_INTERVAL\t100000 /* us */\n+\n+static __rte_always_inline void\n+ice_dcf_update_vsi_ctx(struct ice_hw *hw, uint16_t vsi_handle,\n+\t\t       uint16_t vsi_map)\n+{\n+\tstruct ice_vsi_ctx *vsi_ctx;\n+\n+\tif (unlikely(vsi_handle >= ICE_MAX_VSI)) {\n+\t\tPMD_DRV_LOG(ERR, \"Invalid vsi handle %u\", vsi_handle);\n+\t\treturn;\n+\t}\n+\n+\tvsi_ctx = hw->vsi_ctx[vsi_handle];\n+\n+\tif (vsi_map & VIRTCHNL_DCF_VF_VSI_VALID) {\n+\t\tif (!vsi_ctx)\n+\t\t\tvsi_ctx = ice_malloc(hw, sizeof(*vsi_ctx));\n+\n+\t\tif (!vsi_ctx) {\n+\t\t\tPMD_DRV_LOG(ERR, \"No memory for vsi context %u\",\n+\t\t\t\t    vsi_handle);\n+\t\t\treturn;\n+\t\t}\n+\n+\t\tvsi_ctx->vsi_num = (vsi_map & VIRTCHNL_DCF_VF_VSI_ID_M) >>\n+\t\t\t\t\t      VIRTCHNL_DCF_VF_VSI_ID_S;\n+\t\thw->vsi_ctx[vsi_handle] = vsi_ctx;\n+\n+\t\tPMD_DRV_LOG(DEBUG, \"VF%u is assigned with vsi number %u\",\n+\t\t\t    vsi_handle, vsi_ctx->vsi_num);\n+\t} else {\n+\t\thw->vsi_ctx[vsi_handle] = NULL;\n+\n+\t\tif (vsi_ctx)\n+\t\t\tice_free(hw, vsi_ctx);\n+\n+\t\tPMD_DRV_LOG(NOTICE, \"VF%u is disabled\", vsi_handle);\n+\t}\n+}\n+\n+static void\n+ice_dcf_update_vf_vsi_map(struct ice_hw *hw, uint16_t num_vfs,\n+\t\t\t  uint16_t *vf_vsi_map)\n+{\n+\tuint16_t vf_id;\n+\n+\tfor (vf_id = 0; vf_id < num_vfs; vf_id++)\n+\t\tice_dcf_update_vsi_ctx(hw, vf_id, vf_vsi_map[vf_id]);\n+}\n+\n+static void\n+ice_dcf_vsi_update_service_handler(void *param)\n+{\n+\tstruct ice_dcf_hw *hw = param;\n+\n+\tif (!ice_dcf_handle_vsi_update_event(hw)) {\n+\t\tstruct ice_dcf_adapter *dcf_ad =\n+\t\t\tcontainer_of(hw, struct ice_dcf_adapter, real_hw);\n+\n+\t\tice_dcf_update_vf_vsi_map(&dcf_ad->parent.hw,\n+\t\t\t\t\t  hw->num_vfs, hw->vf_vsi_map);\n+\t}\n+}\n+\n+void\n+ice_dcf_handle_pf_event_msg(struct ice_dcf_hw *dcf_hw,\n+\t\t\t    uint8_t *msg, uint16_t msglen)\n+{\n+\tstruct virtchnl_pf_event *pf_msg = (struct virtchnl_pf_event *)msg;\n+\n+\tif (msglen < sizeof(struct virtchnl_pf_event)) {\n+\t\tPMD_DRV_LOG(DEBUG, \"Invalid event message length : %u\", msglen);\n+\t\treturn;\n+\t}\n+\n+\tswitch (pf_msg->event) {\n+\tcase VIRTCHNL_EVENT_RESET_IMPENDING:\n+\t\tPMD_DRV_LOG(DEBUG, \"VIRTCHNL_EVENT_RESET_IMPENDING event\");\n+\t\trte_eal_alarm_set(ICE_DCF_VSI_UPDATE_SERVICE_INTERVAL * 2,\n+\t\t\t\t  ice_dcf_vsi_update_service_handler, dcf_hw);\n+\t\tbreak;\n+\tcase VIRTCHNL_EVENT_LINK_CHANGE:\n+\t\tPMD_DRV_LOG(DEBUG, \"VIRTCHNL_EVENT_LINK_CHANGE event\");\n+\t\tbreak;\n+\tcase VIRTCHNL_EVENT_PF_DRIVER_CLOSE:\n+\t\tPMD_DRV_LOG(DEBUG, \"VIRTCHNL_EVENT_PF_DRIVER_CLOSE event\");\n+\t\tbreak;\n+\tcase VIRTCHNL_EVENT_DCF_VSI_MAP_UPDATE:\n+\t\tPMD_DRV_LOG(DEBUG, \"VIRTCHNL_EVENT_DCF_VSI_MAP_UPDATE event : VF%u with VSI num %u\",\n+\t\t\t    pf_msg->event_data.vf_vsi_map.vf_id,\n+\t\t\t    pf_msg->event_data.vf_vsi_map.vsi_id);\n+\t\trte_eal_alarm_set(ICE_DCF_VSI_UPDATE_SERVICE_INTERVAL,\n+\t\t\t\t  ice_dcf_vsi_update_service_handler, dcf_hw);\n+\t\tbreak;\n+\tdefault:\n+\t\tPMD_DRV_LOG(ERR, \"Unknown event received %u\", pf_msg->event);\n+\t\tbreak;\n+\t}\n+}\n+\n+static int\n+ice_dcf_init_parent_hw(struct ice_hw *hw)\n+{\n+\tstruct ice_aqc_get_phy_caps_data *pcaps;\n+\tenum ice_status status;\n+\n+\tstatus = ice_aq_get_fw_ver(hw, NULL);\n+\tif (status)\n+\t\treturn status;\n+\n+\tstatus = ice_get_caps(hw);\n+\tif (status)\n+\t\treturn status;\n+\n+\thw->port_info = (struct ice_port_info *)\n+\t\t\tice_malloc(hw, sizeof(*hw->port_info));\n+\tif (!hw->port_info)\n+\t\treturn ICE_ERR_NO_MEMORY;\n+\n+\t/* set the back pointer to HW */\n+\thw->port_info->hw = hw;\n+\n+\t/* Initialize port_info struct with switch configuration data */\n+\tstatus = ice_get_initial_sw_cfg(hw);\n+\tif (status)\n+\t\tgoto err_unroll_alloc;\n+\n+\tpcaps = (struct ice_aqc_get_phy_caps_data *)\n+\t\tice_malloc(hw, sizeof(*pcaps));\n+\tif (!pcaps) {\n+\t\tstatus = ICE_ERR_NO_MEMORY;\n+\t\tgoto err_unroll_alloc;\n+\t}\n+\n+\t/* Initialize port_info struct with PHY capabilities */\n+\tstatus = ice_aq_get_phy_caps(hw->port_info, false,\n+\t\t\t\t     ICE_AQC_REPORT_TOPO_CAP, pcaps, NULL);\n+\tice_free(hw, pcaps);\n+\tif (status)\n+\t\tgoto err_unroll_alloc;\n+\n+\t/* Initialize port_info struct with link information */\n+\tstatus = ice_aq_get_link_info(hw->port_info, false, NULL, NULL);\n+\tif (status)\n+\t\tgoto err_unroll_alloc;\n+\n+\tstatus = ice_init_fltr_mgmt_struct(hw);\n+\tif (status)\n+\t\tgoto err_unroll_alloc;\n+\n+\tstatus = ice_init_hw_tbls(hw);\n+\tif (status)\n+\t\tgoto err_unroll_fltr_mgmt_struct;\n+\n+\tPMD_DRV_LOG(INFO,\n+\t\t    \"firmware %d.%d.%d api %d.%d.%d build 0x%08x\",\n+\t\t    hw->fw_maj_ver, hw->fw_min_ver, hw->fw_patch,\n+\t\t    hw->api_maj_ver, hw->api_min_ver, hw->api_patch,\n+\t\t    hw->fw_build);\n+\n+\treturn ICE_SUCCESS;\n+\n+err_unroll_fltr_mgmt_struct:\n+\tice_cleanup_fltr_mgmt_struct(hw);\n+err_unroll_alloc:\n+\tice_free(hw, hw->port_info);\n+\thw->port_info = NULL;\n+\n+\treturn status;\n+}\n+\n+static void ice_dcf_uninit_parent_hw(struct ice_hw *hw)\n+{\n+\tice_cleanup_fltr_mgmt_struct(hw);\n+\n+\tice_free_seg(hw);\n+\tice_free_hw_tbls(hw);\n+\n+\tif (hw->port_info) {\n+\t\tice_free(hw, hw->port_info);\n+\t\thw->port_info = NULL;\n+\t}\n+\n+\tice_clear_all_vsi_ctx(hw);\n+}\n+\n+static int\n+ice_dcf_request_pkg_name(struct ice_hw *hw, char *pkg_name)\n+{\n+\tstruct ice_dcf_adapter *dcf_adapter =\n+\t\t\tcontainer_of(hw, struct ice_dcf_adapter, parent.hw);\n+\n+\t/* TODO: check with DSN firstly by iAVF */\n+\tPMD_DRV_LOG(DEBUG,\n+\t\t    \"DCF VSI_ID = %u\",\n+\t\t    dcf_adapter->real_hw.vsi_id);\n+\n+\tsnprintf(pkg_name,\n+\t\t ICE_MAX_PKG_FILENAME_SIZE, \"%s\", ICE_PKG_FILE_UPDATES);\n+\tif (!access(pkg_name, 0))\n+\t\treturn 0;\n+\n+\tsnprintf(pkg_name,\n+\t\t ICE_MAX_PKG_FILENAME_SIZE, \"%s\", ICE_PKG_FILE_DEFAULT);\n+\tif (!access(pkg_name, 0))\n+\t\treturn 0;\n+\n+\treturn -1;\n+}\n+\n+static int\n+ice_dcf_load_pkg(struct ice_hw *hw)\n+{\n+\tchar pkg_name[ICE_MAX_PKG_FILENAME_SIZE];\n+\tuint8_t *pkg_buf;\n+\tuint32_t buf_len;\n+\tstruct stat st;\n+\tFILE *fp;\n+\tint err;\n+\n+\tif (ice_dcf_request_pkg_name(hw, pkg_name)) {\n+\t\tPMD_INIT_LOG(ERR, \"failed to locate the package file\");\n+\t\treturn -ENOENT;\n+\t}\n+\n+\tPMD_INIT_LOG(DEBUG, \"DDP package name: %s\", pkg_name);\n+\n+\terr = stat(pkg_name, &st);\n+\tif (err) {\n+\t\tPMD_INIT_LOG(ERR, \"failed to get file status\");\n+\t\treturn err;\n+\t}\n+\n+\tbuf_len = st.st_size;\n+\tpkg_buf = rte_malloc(NULL, buf_len, 0);\n+\tif (!pkg_buf) {\n+\t\tPMD_INIT_LOG(ERR, \"failed to allocate buffer of size %u for package\",\n+\t\t\t     buf_len);\n+\t\treturn -1;\n+\t}\n+\n+\tfp = fopen(pkg_name, \"rb\");\n+\tif (!fp)  {\n+\t\tPMD_INIT_LOG(ERR, \"failed to open file: %s\", pkg_name);\n+\t\terr = -1;\n+\t\tgoto ret;\n+\t}\n+\n+\terr = fread(pkg_buf, buf_len, 1, fp);\n+\tfclose(fp);\n+\tif (err != 1) {\n+\t\tPMD_INIT_LOG(ERR, \"failed to read package data\");\n+\t\terr = -1;\n+\t\tgoto ret;\n+\t}\n+\n+\terr = ice_copy_and_init_pkg(hw, pkg_buf, buf_len);\n+\tif (err)\n+\t\tPMD_INIT_LOG(ERR, \"ice_copy_and_init_hw failed: %d\", err);\n+\n+ret:\n+\trte_free(pkg_buf);\n+\treturn err;\n+}\n+\n+int\n+ice_dcf_init_parent_adapter(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct ice_dcf_adapter *adapter = eth_dev->data->dev_private;\n+\tstruct ice_adapter *parent_adapter = &adapter->parent;\n+\tstruct ice_hw *parent_hw = &parent_adapter->hw;\n+\tstruct ice_dcf_hw *hw = &adapter->real_hw;\n+\tconst struct rte_ether_addr *mac;\n+\tint err;\n+\n+\tparent_adapter->eth_dev = eth_dev;\n+\tparent_adapter->pf.adapter = parent_adapter;\n+\tparent_adapter->pf.dev_data = eth_dev->data;\n+\tparent_hw->back = parent_adapter;\n+\tparent_hw->mac_type = ICE_MAC_GENERIC;\n+\tparent_hw->vendor_id = ICE_INTEL_VENDOR_ID;\n+\n+\tice_init_lock(&parent_hw->adminq.sq_lock);\n+\tice_init_lock(&parent_hw->adminq.rq_lock);\n+\tparent_hw->aq_send_cmd_fn = ice_dcf_send_aq_cmd;\n+\tparent_hw->aq_send_cmd_param = &adapter->real_hw;\n+\tparent_hw->dcf_enabled = true;\n+\n+\terr = ice_dcf_init_parent_hw(parent_hw);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"failed to init the DCF parent hardware with error %d\",\n+\t\t\t    err);\n+\t\treturn err;\n+\t}\n+\n+\terr = ice_dcf_load_pkg(parent_hw);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"failed to load package with error %d\",\n+\t\t\t    err);\n+\t\tgoto uninit_hw;\n+\t}\n+\tparent_adapter->active_pkg_type = ice_load_pkg_type(parent_hw);\n+\n+\tice_dcf_update_vf_vsi_map(parent_hw,\n+\t\t\t\t  hw->num_vfs, hw->vf_vsi_map);\n+\n+\tmac = (const struct rte_ether_addr *)hw->avf.mac.addr;\n+\tif (rte_is_valid_assigned_ether_addr(mac))\n+\t\trte_ether_addr_copy(mac, &parent_adapter->pf.dev_addr);\n+\telse\n+\t\trte_eth_random_addr(parent_adapter->pf.dev_addr.addr_bytes);\n+\n+\teth_dev->data->mac_addrs = &parent_adapter->pf.dev_addr;\n+\n+\treturn 0;\n+\n+uninit_hw:\n+\tice_dcf_uninit_parent_hw(parent_hw);\n+\treturn err;\n+}\n+\n+void\n+ice_dcf_uninit_parent_adapter(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct ice_dcf_adapter *adapter = eth_dev->data->dev_private;\n+\tstruct ice_adapter *parent_adapter = &adapter->parent;\n+\tstruct ice_hw *parent_hw = &parent_adapter->hw;\n+\n+\teth_dev->data->mac_addrs = NULL;\n+\n+\trte_eal_alarm_cancel(ice_dcf_vsi_update_service_handler,\n+\t\t\t     &adapter->real_hw);\n+\n+\tice_dcf_uninit_parent_hw(parent_hw);\n+}\ndiff --git a/drivers/net/ice/meson.build b/drivers/net/ice/meson.build\nindex f9e897bbc..0df8ddc0f 100644\n--- a/drivers/net/ice/meson.build\n+++ b/drivers/net/ice/meson.build\n@@ -15,8 +15,8 @@ sources = files(\n \t'ice_hash.c'\n \t)\n \n-deps += ['hash']\n-includes += include_directories('base')\n+deps += ['hash', 'net', 'common_iavf']\n+includes += include_directories('base', '../../common/iavf')\n \n if arch_subdir == 'x86'\n \tsources += files('ice_rxtx_vec_sse.c')\n@@ -37,4 +37,8 @@ if arch_subdir == 'x86'\n \tendif\n endif\n \n+sources += files('ice_dcf.c',\n+\t\t 'ice_dcf_parent.c',\n+\t\t 'ice_dcf_ethdev.c')\n+\n install_headers('rte_pmd_ice.h')\ndiff --git a/mk/rte.app.mk b/mk/rte.app.mk\nindex d295ca0a5..f3798a09f 100644\n--- a/mk/rte.app.mk\n+++ b/mk/rte.app.mk\n@@ -185,6 +185,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_I40E_PMD)       += -lrte_pmd_i40e\n _LDLIBS-$(CONFIG_RTE_LIBRTE_IAVF_PMD)       += -lrte_pmd_iavf\n _LDLIBS-$(CONFIG_RTE_LIBRTE_ICE_PMD)        += -lrte_pmd_ice\n IAVF-y := $(CONFIG_RTE_LIBRTE_IAVF_PMD)\n+IAVF-y += $(CONFIG_RTE_LIBRTE_ICE_PMD)\n ifeq ($(findstring y,$(IAVF-y)),y)\n _LDLIBS-y += -lrte_common_iavf\n endif\n",
    "prefixes": [
        "v1",
        "3/4"
    ]
}