get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 122652,
    "url": "http://patchwork.dpdk.org/api/patches/122652/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20230130062642.3337239-2-junfeng.guo@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": "<20230130062642.3337239-2-junfeng.guo@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230130062642.3337239-2-junfeng.guo@intel.com",
    "date": "2023-01-30T06:26:34",
    "name": "[RFC,v2,1/9] net/gve: add Tx queue setup for DQO",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "ad4470ffc4c1138f7f19b4a505758e6b252a3d22",
    "submitter": {
        "id": 1785,
        "url": "http://patchwork.dpdk.org/api/people/1785/?format=api",
        "name": "Junfeng Guo",
        "email": "junfeng.guo@intel.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patchwork.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20230130062642.3337239-2-junfeng.guo@intel.com/mbox/",
    "series": [
        {
            "id": 26684,
            "url": "http://patchwork.dpdk.org/api/series/26684/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=26684",
            "date": "2023-01-30T06:26:33",
            "name": "gve PMD enhancement",
            "version": 2,
            "mbox": "http://patchwork.dpdk.org/series/26684/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/122652/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/122652/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 4B2E0424BA;\n\tMon, 30 Jan 2023 07:32:22 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id CB38340EE7;\n\tMon, 30 Jan 2023 07:32:18 +0100 (CET)",
            "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n by mails.dpdk.org (Postfix) with ESMTP id 1FB2540EE2\n for <dev@dpdk.org>; Mon, 30 Jan 2023 07:32:16 +0100 (CET)",
            "from orsmga004.jf.intel.com ([10.7.209.38])\n by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 29 Jan 2023 22:32:16 -0800",
            "from dpdk-jf-ntb-one.sh.intel.com ([10.67.111.104])\n by orsmga004.jf.intel.com with ESMTP; 29 Jan 2023 22:32:12 -0800"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1675060337; x=1706596337;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=ayWp9Vdd1lDbUhyWk9xDz5BVc711kzbtowy9RABLu24=;\n b=oCes7OBTqe7Wh6+7Caa3XzmIOm/qqaRUvQ928+Xj/nqDMKI8Lfi2eWtA\n EpLwouDPabrExx+sY+IMkQ7eRt2pA5rM5zZb5AZnes+OY6Ctktw83fOw5\n LjPTZKsKTmS0j7TEofEs9r/ehp+KPUZm8RL3648KwL0DEdYyVbhG9wVkB\n 2QCXJS3hNfTRvwJ1qTchUXNHosP0nZ0fVbqR+i1Azw7uNQHZINYYwUB86\n +oyJ9L/kBlXzUaIWa8yKurVGDkDn5q5uzEm3MetUY9t2AB0iA/oUTDnqW\n P9/rzgTizgmzjKoijmOypPSWnqJGoSKY0/9l7LXgd8IdGTX3dw8I0mSXq Q==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6500,9779,10605\"; a=\"392035651\"",
            "E=Sophos;i=\"5.97,257,1669104000\"; d=\"scan'208\";a=\"392035651\"",
            "E=McAfee;i=\"6500,9779,10605\"; a=\"787906423\"",
            "E=Sophos;i=\"5.97,257,1669104000\"; d=\"scan'208\";a=\"787906423\""
        ],
        "X-ExtLoop1": "1",
        "From": "Junfeng Guo <junfeng.guo@intel.com>",
        "To": "qi.z.zhang@intel.com, jingjing.wu@intel.com, ferruh.yigit@amd.com,\n beilei.xing@intel.com",
        "Cc": "dev@dpdk.org, xiaoyun.li@intel.com, helin.zhang@intel.com,\n Junfeng Guo <junfeng.guo@intel.com>, Rushil Gupta <rushilg@google.com>,\n Jordan Kimbrough <jrkim@google.com>, Jeroen de Borst <jeroendb@google.com>",
        "Subject": "[RFC v2 1/9] net/gve: add Tx queue setup for DQO",
        "Date": "Mon, 30 Jan 2023 14:26:34 +0800",
        "Message-Id": "<20230130062642.3337239-2-junfeng.guo@intel.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20230130062642.3337239-1-junfeng.guo@intel.com>",
        "References": "<20230118025347.1567078-1-junfeng.guo@intel.com>\n <20230130062642.3337239-1-junfeng.guo@intel.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "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": "Add support for tx_queue_setup_dqo ops.\n\nDQO format has submission and completion queue pair for each Tx/Rx\nqueue. Note that with DQO format all descriptors and doorbells, as\nwell as counters are written in little-endian.\n\nSigned-off-by: Junfeng Guo <junfeng.guo@intel.com>\nSigned-off-by: Rushil Gupta <rushilg@google.com>\nSigned-off-by: Jordan Kimbrough <jrkim@google.com>\nSigned-off-by: Jeroen de Borst <jeroendb@google.com>\n---\n .mailmap                            |   3 +\n MAINTAINERS                         |   3 +\n drivers/net/gve/base/gve.h          |   1 +\n drivers/net/gve/base/gve_desc_dqo.h |   4 -\n drivers/net/gve/base/gve_osdep.h    |   4 +\n drivers/net/gve/gve_ethdev.c        |  16 ++-\n drivers/net/gve/gve_ethdev.h        |  33 +++++-\n drivers/net/gve/gve_tx_dqo.c        | 178 ++++++++++++++++++++++++++++\n drivers/net/gve/meson.build         |   1 +\n 9 files changed, 235 insertions(+), 8 deletions(-)\n create mode 100644 drivers/net/gve/gve_tx_dqo.c",
    "diff": "diff --git a/.mailmap b/.mailmap\nindex 452267a567..553b9ce3ca 100644\n--- a/.mailmap\n+++ b/.mailmap\n@@ -578,6 +578,7 @@ Jens Freimann <jfreimann@redhat.com> <jfreiman@redhat.com>\n Jeremy Plsek <jplsek@iol.unh.edu>\n Jeremy Spewock <jspewock@iol.unh.edu>\n Jerin Jacob <jerinj@marvell.com> <jerin.jacob@caviumnetworks.com> <jerinjacobk@gmail.com>\n+Jeroen de Borst <jeroendb@google.com>\n Jerome Jutteau <jerome.jutteau@outscale.com>\n Jerry Hao OS <jerryhao@os.amperecomputing.com>\n Jerry Lilijun <jerry.lilijun@huawei.com>\n@@ -642,6 +643,7 @@ Jonathan Erb <jonathan.erb@banduracyber.com>\n Jon DeVree <nuxi@vault24.org>\n Jon Loeliger <jdl@netgate.com>\n Joongi Kim <joongi@an.kaist.ac.kr>\n+Jordan Kimbrough <jrkim@google.com>\n Jørgen Østergaard Sloth <jorgen.sloth@xci.dk>\n Jörg Thalheim <joerg@thalheim.io>\n Joseph Richard <joseph.richard@windriver.com>\n@@ -1145,6 +1147,7 @@ Roy Franz <roy.franz@cavium.com>\n Roy Pledge <roy.pledge@nxp.com>\n Roy Shterman <roy.shterman@vastdata.com>\n Ruifeng Wang <ruifeng.wang@arm.com>\n+Rushil Gupta <rushilg@google.com>\n Ryan E Hall <ryan.e.hall@intel.com>\n Sabyasachi Sengupta <sabyasg@hpe.com>\n Sachin Saxena <sachin.saxena@nxp.com> <sachin.saxena@oss.nxp.com>\ndiff --git a/MAINTAINERS b/MAINTAINERS\nindex 9a0f416d2e..7ffa709b3b 100644\n--- a/MAINTAINERS\n+++ b/MAINTAINERS\n@@ -703,6 +703,9 @@ F: doc/guides/nics/features/enic.ini\n \n Google Virtual Ethernet\n M: Junfeng Guo <junfeng.guo@intel.com>\n+M: Jeroen de Borst <jeroendb@google.com>\n+M: Rushil Gupta <rushilg@google.com>\n+M: Jordan Kimbrough <jrkim@google.com>\n F: drivers/net/gve/\n F: doc/guides/nics/gve.rst\n F: doc/guides/nics/features/gve.ini\ndiff --git a/drivers/net/gve/base/gve.h b/drivers/net/gve/base/gve.h\nindex 2dc4507acb..2b7cf7d99b 100644\n--- a/drivers/net/gve/base/gve.h\n+++ b/drivers/net/gve/base/gve.h\n@@ -7,6 +7,7 @@\n #define _GVE_H_\n \n #include \"gve_desc.h\"\n+#include \"gve_desc_dqo.h\"\n \n #define GVE_VERSION\t\t\"1.3.0\"\n #define GVE_VERSION_PREFIX\t\"GVE-\"\ndiff --git a/drivers/net/gve/base/gve_desc_dqo.h b/drivers/net/gve/base/gve_desc_dqo.h\nindex ee1afdecb8..bb4a18d4d1 100644\n--- a/drivers/net/gve/base/gve_desc_dqo.h\n+++ b/drivers/net/gve/base/gve_desc_dqo.h\n@@ -13,10 +13,6 @@\n #define GVE_TX_MAX_HDR_SIZE_DQO 255\n #define GVE_TX_MIN_TSO_MSS_DQO 88\n \n-#ifndef __LITTLE_ENDIAN_BITFIELD\n-#error \"Only little endian supported\"\n-#endif\n-\n /* Basic TX descriptor (DTYPE 0x0C) */\n struct gve_tx_pkt_desc_dqo {\n \t__le64 buf_addr;\ndiff --git a/drivers/net/gve/base/gve_osdep.h b/drivers/net/gve/base/gve_osdep.h\nindex 7cb73002f4..abf3d379ae 100644\n--- a/drivers/net/gve/base/gve_osdep.h\n+++ b/drivers/net/gve/base/gve_osdep.h\n@@ -35,6 +35,10 @@ typedef rte_be16_t __be16;\n typedef rte_be32_t __be32;\n typedef rte_be64_t __be64;\n \n+typedef rte_le16_t __le16;\n+typedef rte_le32_t __le32;\n+typedef rte_le64_t __le64;\n+\n typedef rte_iova_t dma_addr_t;\n \n #define ETH_MIN_MTU\tRTE_ETHER_MIN_MTU\ndiff --git a/drivers/net/gve/gve_ethdev.c b/drivers/net/gve/gve_ethdev.c\nindex 97781f0ed3..d03f2fba92 100644\n--- a/drivers/net/gve/gve_ethdev.c\n+++ b/drivers/net/gve/gve_ethdev.c\n@@ -299,6 +299,7 @@ gve_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n \n \tdev_info->default_txconf = (struct rte_eth_txconf) {\n \t\t.tx_free_thresh = GVE_DEFAULT_TX_FREE_THRESH,\n+\t\t.tx_rs_thresh = GVE_DEFAULT_TX_RS_THRESH,\n \t\t.offloads = 0,\n \t};\n \n@@ -360,6 +361,13 @@ static const struct eth_dev_ops gve_eth_dev_ops = {\n \t.mtu_set              = gve_dev_mtu_set,\n };\n \n+static void\n+gve_eth_dev_ops_override(struct eth_dev_ops *local_eth_dev_ops)\n+{\n+\t/* override eth_dev ops for DQO */\n+\tlocal_eth_dev_ops->tx_queue_setup = gve_tx_queue_setup_dqo;\n+}\n+\n static void\n gve_free_counter_array(struct gve_priv *priv)\n {\n@@ -595,6 +603,7 @@ gve_teardown_priv_resources(struct gve_priv *priv)\n static int\n gve_dev_init(struct rte_eth_dev *eth_dev)\n {\n+\tstatic struct eth_dev_ops gve_local_eth_dev_ops = gve_eth_dev_ops;\n \tstruct gve_priv *priv = eth_dev->data->dev_private;\n \tint max_tx_queues, max_rx_queues;\n \tstruct rte_pci_device *pci_dev;\n@@ -602,8 +611,6 @@ gve_dev_init(struct rte_eth_dev *eth_dev)\n \trte_be32_t *db_bar;\n \tint err;\n \n-\teth_dev->dev_ops = &gve_eth_dev_ops;\n-\n \tif (rte_eal_process_type() != RTE_PROC_PRIMARY)\n \t\treturn 0;\n \n@@ -642,9 +649,12 @@ gve_dev_init(struct rte_eth_dev *eth_dev)\n \t\teth_dev->rx_pkt_burst = gve_rx_burst;\n \t\teth_dev->tx_pkt_burst = gve_tx_burst;\n \t} else {\n-\t\tPMD_DRV_LOG(ERR, \"DQO_RDA is not implemented and will be added in the future\");\n+\t\t/* override Tx/Rx setup/release eth_dev ops */\n+\t\tgve_eth_dev_ops_override(&gve_local_eth_dev_ops);\n \t}\n \n+\teth_dev->dev_ops = &gve_local_eth_dev_ops;\n+\n \teth_dev->data->mac_addrs = &priv->dev_addr;\n \n \treturn 0;\ndiff --git a/drivers/net/gve/gve_ethdev.h b/drivers/net/gve/gve_ethdev.h\nindex 235e55899e..2dfcef6893 100644\n--- a/drivers/net/gve/gve_ethdev.h\n+++ b/drivers/net/gve/gve_ethdev.h\n@@ -11,6 +11,9 @@\n \n #include \"base/gve.h\"\n \n+/* TODO: this is a workaround to ensure that Tx complq is enough */\n+#define DQO_TX_MULTIPLIER 4\n+\n /*\n  * Following macros are derived from linux/pci_regs.h, however,\n  * we can't simply include that header here, as there is no such\n@@ -25,7 +28,8 @@\n #define PCI_MSIX_FLAGS_QSIZE\t0x07FF\t/* Table size */\n \n #define GVE_DEFAULT_RX_FREE_THRESH  512\n-#define GVE_DEFAULT_TX_FREE_THRESH  256\n+#define GVE_DEFAULT_TX_FREE_THRESH   32\n+#define GVE_DEFAULT_TX_RS_THRESH     32\n #define GVE_TX_MAX_FREE_SZ          512\n \n #define GVE_MIN_BUF_SIZE\t    1024\n@@ -50,6 +54,13 @@ union gve_tx_desc {\n \tstruct gve_tx_seg_desc seg; /* subsequent descs for a packet */\n };\n \n+/* Tx desc for DQO format */\n+union gve_tx_desc_dqo {\n+\tstruct gve_tx_pkt_desc_dqo pkt;\n+\tstruct gve_tx_tso_context_desc_dqo tso_ctx;\n+\tstruct gve_tx_general_context_desc_dqo general_ctx;\n+};\n+\n /* Offload features */\n union gve_tx_offload {\n \tuint64_t data;\n@@ -78,8 +89,10 @@ struct gve_tx_queue {\n \tuint32_t tx_tail;\n \tuint16_t nb_tx_desc;\n \tuint16_t nb_free;\n+\tuint16_t nb_used;\n \tuint32_t next_to_clean;\n \tuint16_t free_thresh;\n+\tuint16_t rs_thresh;\n \n \t/* Only valid for DQO_QPL queue format */\n \tuint16_t sw_tail;\n@@ -102,6 +115,17 @@ struct gve_tx_queue {\n \tconst struct rte_memzone *qres_mz;\n \tstruct gve_queue_resources *qres;\n \n+\t/* newly added for DQO*/\n+\tvolatile union gve_tx_desc_dqo *tx_ring;\n+\tstruct gve_tx_compl_desc *compl_ring;\n+\tconst struct rte_memzone *compl_ring_mz;\n+\tuint64_t compl_ring_phys_addr;\n+\tuint32_t complq_tail;\n+\tuint16_t sw_size;\n+\tuint8_t cur_gen_bit;\n+\tuint32_t last_desc_cleaned;\n+\tvoid **txqs;\n+\n \t/* Only valid for DQO_RDA queue format */\n \tstruct gve_tx_queue *complq;\n \n@@ -308,4 +332,11 @@ gve_rx_burst(void *rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts);\n uint16_t\n gve_tx_burst(void *txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);\n \n+/* Below functions are used for DQO */\n+\n+int\n+gve_tx_queue_setup_dqo(struct rte_eth_dev *dev, uint16_t queue_id,\n+\t\t       uint16_t nb_desc, unsigned int socket_id,\n+\t\t       const struct rte_eth_txconf *conf);\n+\n #endif /* _GVE_ETHDEV_H_ */\ndiff --git a/drivers/net/gve/gve_tx_dqo.c b/drivers/net/gve/gve_tx_dqo.c\nnew file mode 100644\nindex 0000000000..4f8bad31bb\n--- /dev/null\n+++ b/drivers/net/gve/gve_tx_dqo.c\n@@ -0,0 +1,178 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(C) 2022 Intel Corporation\n+ */\n+\n+#include \"gve_ethdev.h\"\n+#include \"base/gve_adminq.h\"\n+\n+static int\n+check_tx_thresh_dqo(uint16_t nb_desc, uint16_t tx_rs_thresh,\n+\t\t    uint16_t tx_free_thresh)\n+{\n+\tif (tx_rs_thresh >= (nb_desc - 2)) {\n+\t\tPMD_DRV_LOG(ERR, \"tx_rs_thresh (%u) must be less than the \"\n+\t\t\t    \"number of TX descriptors (%u) minus 2\",\n+\t\t\t    tx_rs_thresh, nb_desc);\n+\t\treturn -EINVAL;\n+\t}\n+\tif (tx_free_thresh >= (nb_desc - 3)) {\n+\t\tPMD_DRV_LOG(ERR, \"tx_free_thresh (%u) must be less than the \"\n+\t\t\t    \"number of TX descriptors (%u) minus 3.\",\n+\t\t\t    tx_free_thresh, nb_desc);\n+\t\treturn -EINVAL;\n+\t}\n+\tif (tx_rs_thresh > tx_free_thresh) {\n+\t\tPMD_DRV_LOG(ERR, \"tx_rs_thresh (%u) must be less than or \"\n+\t\t\t    \"equal to tx_free_thresh (%u).\",\n+\t\t\t    tx_rs_thresh, tx_free_thresh);\n+\t\treturn -EINVAL;\n+\t}\n+\tif ((nb_desc % tx_rs_thresh) != 0) {\n+\t\tPMD_DRV_LOG(ERR, \"tx_rs_thresh (%u) must be a divisor of the \"\n+\t\t\t    \"number of TX descriptors (%u).\",\n+\t\t\t    tx_rs_thresh, nb_desc);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+gve_reset_txq_dqo(struct gve_tx_queue *txq)\n+{\n+\tstruct rte_mbuf **sw_ring;\n+\tuint32_t size, i;\n+\n+\tif (txq == NULL) {\n+\t\tPMD_DRV_LOG(DEBUG, \"Pointer to txq is NULL\");\n+\t\treturn;\n+\t}\n+\n+\tsize = txq->nb_tx_desc * sizeof(union gve_tx_desc_dqo);\n+\tfor (i = 0; i < size; i++)\n+\t\t((volatile char *)txq->tx_ring)[i] = 0;\n+\n+\tsize = txq->sw_size * sizeof(struct gve_tx_compl_desc);\n+\tfor (i = 0; i < size; i++)\n+\t\t((volatile char *)txq->compl_ring)[i] = 0;\n+\n+\tsw_ring = txq->sw_ring;\n+\tfor (i = 0; i < txq->sw_size; i++)\n+\t\tsw_ring[i] = NULL;\n+\n+\ttxq->tx_tail = 0;\n+\ttxq->nb_used = 0;\n+\n+\ttxq->last_desc_cleaned = 0;\n+\ttxq->sw_tail = 0;\n+\ttxq->nb_free = txq->nb_tx_desc - 1;\n+\n+\ttxq->complq_tail = 0;\n+\ttxq->cur_gen_bit = 1;\n+}\n+\n+int\n+gve_tx_queue_setup_dqo(struct rte_eth_dev *dev, uint16_t queue_id,\n+\t\t       uint16_t nb_desc, unsigned int socket_id,\n+\t\t       const struct rte_eth_txconf *conf)\n+{\n+\tstruct gve_priv *hw = dev->data->dev_private;\n+\tconst struct rte_memzone *mz;\n+\tstruct gve_tx_queue *txq;\n+\tuint16_t free_thresh;\n+\tuint16_t rs_thresh;\n+\tuint16_t sw_size;\n+\tint err = 0;\n+\n+\tif (nb_desc != hw->tx_desc_cnt) {\n+\t\tPMD_DRV_LOG(WARNING, \"gve doesn't support nb_desc config, use hw nb_desc %u.\",\n+\t\t\t    hw->tx_desc_cnt);\n+\t}\n+\tnb_desc = hw->tx_desc_cnt;\n+\n+\t/* Allocate the TX queue data structure. */\n+\ttxq = rte_zmalloc_socket(\"gve txq\",\n+\t\t\t\t sizeof(struct gve_tx_queue),\n+\t\t\t\t RTE_CACHE_LINE_SIZE, socket_id);\n+\tif (txq == NULL) {\n+\t\tPMD_DRV_LOG(ERR, \"Failed to allocate memory for tx queue structure\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\t/* need to check free_thresh here */\n+\tfree_thresh = conf->tx_free_thresh ?\n+\t\t\tconf->tx_free_thresh : GVE_DEFAULT_TX_FREE_THRESH;\n+\trs_thresh = conf->tx_rs_thresh ?\n+\t\t\tconf->tx_rs_thresh : GVE_DEFAULT_TX_RS_THRESH;\n+\tif (check_tx_thresh_dqo(nb_desc, rs_thresh, free_thresh))\n+\t\treturn -EINVAL;\n+\n+\ttxq->nb_tx_desc = nb_desc;\n+\ttxq->free_thresh = free_thresh;\n+\ttxq->rs_thresh = rs_thresh;\n+\ttxq->queue_id = queue_id;\n+\ttxq->port_id = dev->data->port_id;\n+\ttxq->ntfy_id = queue_id;\n+\ttxq->hw = hw;\n+\ttxq->ntfy_addr = &hw->db_bar2[rte_be_to_cpu_32(hw->irq_dbs[txq->ntfy_id].id)];\n+\n+\t/* Allocate software ring */\n+\tsw_size = nb_desc * DQO_TX_MULTIPLIER;\n+\ttxq->sw_ring = rte_zmalloc_socket(\"gve tx sw ring\",\n+\t\t\t\t\t  sw_size * sizeof(struct rte_mbuf *),\n+\t\t\t\t\t  RTE_CACHE_LINE_SIZE, socket_id);\n+\tif (txq->sw_ring == NULL) {\n+\t\tPMD_DRV_LOG(ERR, \"Failed to allocate memory for SW TX ring\");\n+\t\terr = -ENOMEM;\n+\t\tgoto err_txq;\n+\t}\n+\ttxq->sw_size = sw_size;\n+\n+\t/* Allocate TX hardware ring descriptors. */\n+\tmz = rte_eth_dma_zone_reserve(dev, \"tx_ring\", queue_id,\n+\t\t\t\t      nb_desc * sizeof(union gve_tx_desc_dqo),\n+\t\t\t\t      PAGE_SIZE, socket_id);\n+\tif (mz == NULL) {\n+\t\tPMD_DRV_LOG(ERR, \"Failed to reserve DMA memory for TX\");\n+\t\terr = -ENOMEM;\n+\t\tgoto err_txq;\n+\t}\n+\ttxq->tx_ring = (union gve_tx_desc_dqo *)mz->addr;\n+\ttxq->tx_ring_phys_addr = mz->iova;\n+\ttxq->mz = mz;\n+\n+\t/* Allocate TX completion ring descriptors. */\n+\tmz = rte_eth_dma_zone_reserve(dev, \"tx_compl_ring\", queue_id,\n+\t\t\t\t      sw_size * sizeof(struct gve_tx_compl_desc),\n+\t\t\t\t      PAGE_SIZE, socket_id);\n+\tif (mz == NULL) {\n+\t\tPMD_DRV_LOG(ERR, \"Failed to reserve DMA memory for TX completion queue\");\n+\t\terr = -ENOMEM;\n+\t\tgoto err_txq;\n+\t}\n+\ttxq->compl_ring = (struct gve_tx_compl_desc *)mz->addr;\n+\ttxq->compl_ring_phys_addr = mz->iova;\n+\ttxq->compl_ring_mz = mz;\n+\ttxq->txqs = dev->data->tx_queues;\n+\n+\tmz = rte_eth_dma_zone_reserve(dev, \"txq_res\", queue_id,\n+\t\t\t\t      sizeof(struct gve_queue_resources),\n+\t\t\t\t      PAGE_SIZE, socket_id);\n+\tif (mz == NULL) {\n+\t\tPMD_DRV_LOG(ERR, \"Failed to reserve DMA memory for TX resource\");\n+\t\terr = -ENOMEM;\n+\t\tgoto err_txq;\n+\t}\n+\ttxq->qres = (struct gve_queue_resources *)mz->addr;\n+\ttxq->qres_mz = mz;\n+\n+\tgve_reset_txq_dqo(txq);\n+\n+\tdev->data->tx_queues[queue_id] = txq;\n+\n+\treturn 0;\n+\n+err_txq:\n+\trte_free(txq);\n+\treturn err;\n+}\ndiff --git a/drivers/net/gve/meson.build b/drivers/net/gve/meson.build\nindex af0010c01c..2ddb0cbf9e 100644\n--- a/drivers/net/gve/meson.build\n+++ b/drivers/net/gve/meson.build\n@@ -11,6 +11,7 @@ sources = files(\n         'base/gve_adminq.c',\n         'gve_rx.c',\n         'gve_tx.c',\n+        'gve_tx_dqo.c',\n         'gve_ethdev.c',\n )\n includes += include_directories('base')\n",
    "prefixes": [
        "RFC",
        "v2",
        "1/9"
    ]
}