get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 120214,
    "url": "https://patches.dpdk.org/api/patches/120214/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20221128231940.15961-3-nicolas.chautru@intel.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<20221128231940.15961-3-nicolas.chautru@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20221128231940.15961-3-nicolas.chautru@intel.com",
    "date": "2022-11-28T23:19:39",
    "name": "[v4,2/3] doc: simplify the binding steps",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "f8568671e18b25676ac07d29743ef281f6ac3513",
    "submitter": {
        "id": 1314,
        "url": "https://patches.dpdk.org/api/people/1314/?format=api",
        "name": "Chautru, Nicolas",
        "email": "nicolas.chautru@intel.com"
    },
    "delegate": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20221128231940.15961-3-nicolas.chautru@intel.com/mbox/",
    "series": [
        {
            "id": 25908,
            "url": "https://patches.dpdk.org/api/series/25908/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=25908",
            "date": "2022-11-28T23:19:38",
            "name": "doc: simplify bbdev PMD steps",
            "version": 4,
            "mbox": "https://patches.dpdk.org/series/25908/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/120214/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/120214/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 648FDA0093;\n\tTue, 29 Nov 2022 00:20:19 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 6CBD242D11;\n\tTue, 29 Nov 2022 00:20:09 +0100 (CET)",
            "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n by mails.dpdk.org (Postfix) with ESMTP id 1BB8E4021E\n for <dev@dpdk.org>; Tue, 29 Nov 2022 00:20:05 +0100 (CET)",
            "from orsmga003.jf.intel.com ([10.7.209.27])\n by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 28 Nov 2022 15:20:03 -0800",
            "from unknown (HELO icx-npg-scs1-cp1.localdomain) ([10.233.180.245])\n by orsmga003.jf.intel.com with ESMTP; 28 Nov 2022 15:20:03 -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=1669677606; x=1701213606;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=hvEqtgYRv0XtqtECU4HMGY1c8FLWXyDuEoYE9lGZpQU=;\n b=JA++QMNzA3cO9bhGy13bQ5MPX+BXBRjw23Qkkqo35+P6qEJwzr68WBjF\n /Q/z1i3/QQA6VMpPdDfzZ+9+KFIMXhNWhslv/0yLX8XsNc/w7unT/NI0/\n nZ+dGH4RETEcDkPhEkbI0lSP1Ze8f8DitXs3bMv0+fJBR1SFAFsPw4vOY\n xAFSsFyITaoxFNDzwhDNhhQZ8XpdSjptmCkUprleX8zlq0/OWA1MNWQm+\n IUsHcoekuvGr7IqMGdb8sF0E0JKTQBtPtXo4reDEa0PsP+IWMVS4aIEIA\n HUvYt0nVc5085tiZQZwbkAD16ihMRfhk1T0yvRizqsE+0EJqiARgU6vyj w==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6500,9779,10545\"; a=\"379231960\"",
            "E=Sophos;i=\"5.96,201,1665471600\"; d=\"scan'208\";a=\"379231960\"",
            "E=McAfee;i=\"6500,9779,10545\"; a=\"594049131\"",
            "E=Sophos;i=\"5.96,201,1665471600\"; d=\"scan'208\";a=\"594049131\""
        ],
        "X-ExtLoop1": "1",
        "From": "Nicolas Chautru <nicolas.chautru@intel.com>",
        "To": "dev@dpdk.org,\n\tthomas@monjalon.net",
        "Cc": "maxime.coquelin@redhat.com, hernan.vargas@intel.com,\n Nicolas Chautru <nicolas.chautru@intel.com>",
        "Subject": "[PATCH v4 2/3] doc: simplify the binding steps",
        "Date": "Mon, 28 Nov 2022 15:19:39 -0800",
        "Message-Id": "<20221128231940.15961-3-nicolas.chautru@intel.com>",
        "X-Mailer": "git-send-email 2.37.1",
        "In-Reply-To": "<20221128231940.15961-1-nicolas.chautru@intel.com>",
        "References": "<20221128231940.15961-1-nicolas.chautru@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": "The steps for binding to kernel modules which are\ngeneric are now only implicit and pointing towards\ncommon documentation.\n\nSigned-off-by: Nicolas Chautru <nicolas.chautru@intel.com>\n---\n doc/guides/bbdevs/acc100.rst        | 78 ++++-------------------------\n doc/guides/bbdevs/acc200.rst        | 74 ++++-----------------------\n doc/guides/bbdevs/fpga_5gnr_fec.rst | 77 ++++------------------------\n doc/guides/bbdevs/fpga_lte_fec.rst  | 77 ++++------------------------\n 4 files changed, 36 insertions(+), 270 deletions(-)",
    "diff": "diff --git a/doc/guides/bbdevs/acc100.rst b/doc/guides/bbdevs/acc100.rst\nindex 8a275dcdd4..60fccd3bc8 100644\n--- a/doc/guides/bbdevs/acc100.rst\n+++ b/doc/guides/bbdevs/acc100.rst\n@@ -101,77 +101,15 @@ commands for ACC100 and ACC101 respectively:\n   sudo lspci -vd8086:0d5c\n   sudo lspci -vd8086:57c4\n \n-The physical and virtual functions are compatible with Linux UIO drivers:\n-``vfio`` and ``igb_uio``. However, in order to work the 5G/4G\n-FEC device first needs to be bound to one of these linux drivers through DPDK.\n \n+Binding and Virtual Functions enablement\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n \n-Bind PF UIO driver(s)\n-~~~~~~~~~~~~~~~~~~~~~\n-\n-Install the DPDK igb_uio driver, bind it with the PF PCI device ID and use\n-``lspci`` to confirm the PF device is under use by ``igb_uio`` DPDK UIO driver.\n-\n-The igb_uio driver may be bound to the PF PCI device using one of two methods for ACC100\n-(for ACC101 the device id ``57c4`` should be used in lieu of ``0d5c``):\n-\n-\n-1. PCI functions (physical or virtual, depending on the use case) can be bound to\n-the UIO driver by repeating this command for every function.\n-\n-.. code-block:: console\n-\n-  cd <dpdk-top-level-directory>\n-  insmod ./build/kmod/igb_uio.ko\n-  echo \"8086 0d5c\" > /sys/bus/pci/drivers/igb_uio/new_id\n-  lspci -vd8086:0d5c\n-\n-\n-2. Another way to bind PF with DPDK UIO driver is by using the ``dpdk-devbind.py`` tool\n-\n-.. code-block:: console\n-\n-  cd <dpdk-top-level-directory>\n-  ./usertools/dpdk-devbind.py -b igb_uio 0000:06:00.0\n-\n-where the PCI device ID (example: 0000:06:00.0) is obtained using lspci -vd8086:0d5c\n-\n-\n-In a similar way the 5G/4G FEC PF may be bound with vfio-pci as any PCIe device.\n-\n-\n-Enable Virtual Functions\n-~~~~~~~~~~~~~~~~~~~~~~~~\n-\n-Now, it should be visible in the printouts that PCI PF is under igb_uio control\n-\"``Kernel driver in use: igb_uio``\"\n-\n-To show the number of available VFs on the device, read ``sriov_totalvfs`` file..\n-\n-.. code-block:: console\n-\n-  cat /sys/bus/pci/devices/0000\\:<b>\\:<d>.<f>/sriov_totalvfs\n-\n-  where 0000\\:<b>\\:<d>.<f> is the PCI device ID\n-\n-\n-To enable VFs via igb_uio, echo the number of virtual functions intended to\n-enable to ``max_vfs`` file..\n-\n-.. code-block:: console\n-\n-  echo <num-of-vfs> > /sys/bus/pci/devices/0000\\:<b>\\:<d>.<f>/max_vfs\n-\n-\n-Afterwards, all VFs must be bound to appropriate UIO drivers as required, same\n-way it was done with the physical function previously.\n-\n-Enabling SR-IOV via vfio driver is pretty much the same, except that the file\n-name is different:\n-\n-.. code-block:: console\n-\n-  echo <num-of-vfs> > /sys/bus/pci/devices/0000\\:<b>\\:<d>.<f>/sriov_numvfs\n+The PMD relies on kernel modules to interface with the device: both UIO and VFIO kernel modules\n+are supported.\n+See :ref:`linux_gsg_binding_kernel` section for more details, notably with regards to\n+generic kernel modules binding and VF enablement.\n+More details on usage model is captured in the :ref:`pf_bb_config_acc100` section.\n \n \n Configure the VFs through PF\n@@ -232,6 +170,8 @@ of these tests will depend on the device 5G/4G FEC capabilities which may cause\n testcases to be skipped, but no failure should be reported.\n \n \n+.. _pf_bb_config_acc100:\n+\n Alternate Baseband Device configuration tool\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n \ndiff --git a/doc/guides/bbdevs/acc200.rst b/doc/guides/bbdevs/acc200.rst\nindex 012b3870a8..410f18d9bc 100644\n--- a/doc/guides/bbdevs/acc200.rst\n+++ b/doc/guides/bbdevs/acc200.rst\n@@ -110,73 +110,15 @@ can be listed through these commands for ACC200:\n \n    sudo lspci -vd8086:57c0\n \n-The physical and virtual functions are compatible with Linux UIO drivers:\n-``vfio`` and ``igb_uio``.\n-However, in order to work the 5G/4G FEC device first needs to be bound\n-to one of these Linux drivers through DPDK.\n \n+Binding and Virtual Functions enablement\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n \n-Bind PF UIO driver(s)\n-~~~~~~~~~~~~~~~~~~~~~\n-\n-Install the DPDK igb_uio driver, bind it with the PF PCI device ID and use\n-``lspci`` to confirm the PF device is under use by ``igb_uio`` DPDK UIO driver.\n-\n-The igb_uio driver may be bound to the PF PCI device using one of two methods\n-for ACC200:\n-\n-#. PCI functions (physical or virtual, depending on the use case) can be bound\n-to the UIO driver by repeating this command for every function.\n-\n-.. code-block:: console\n-\n-   cd <dpdk-top-level-directory>\n-   insmod build/kmod/igb_uio.ko\n-   echo \"8086 57c0\" > /sys/bus/pci/drivers/igb_uio/new_id\n-   lspci -vd8086:57c0\n-\n-#. Another way to bind PF with DPDK UIO driver is by using the ``dpdk-devbind.py`` tool\n-\n-.. code-block:: console\n-\n-   cd <dpdk-top-level-directory>\n-   usertools/dpdk-devbind.py -b igb_uio 0000:f7:00.0\n-\n-where the PCI device ID (example: 0000:f7:00.0) is obtained using ``lspci -vd8086:57c0``.\n-\n-In a similar way the PF may be bound with vfio-pci as any PCIe device.\n-\n-\n-Enable Virtual Functions\n-~~~~~~~~~~~~~~~~~~~~~~~~\n-\n-Now, it should be visible in the printouts that PCI PF is under igb_uio control\n-\"``Kernel driver in use: igb_uio``\"\n-\n-To show the number of available VFs on the device, read ``sriov_totalvfs`` file.\n-\n-.. code-block:: console\n-\n-   cat /sys/bus/pci/devices/0000\\:<b>\\:<d>.<f>/sriov_totalvfs\n-\n-where ``0000\\:<b>\\:<d>.<f>`` is the PCI device ID\n-\n-To enable VFs via igb_uio, echo the number of virtual functions intended\n-to enable to ``max_vfs`` file.\n-\n-.. code-block:: console\n-\n-   echo <num-of-vfs> > /sys/bus/pci/devices/0000\\:<b>\\:<d>.<f>/max_vfs\n-\n-Afterwards, all VFs must be bound to appropriate UIO drivers as required,\n-same way it was done with the physical function previously.\n-\n-Enabling SR-IOV via VFIO driver is pretty much the same,\n-except that the file name is different:\n-\n-.. code-block:: console\n-\n-   echo <num-of-vfs> > /sys/bus/pci/devices/0000\\:<b>\\:<d>.<f>/sriov_numvfs\n+The PMD relies on kernel modules to interface with the device: both UIO and VFIO kernel modules\n+are supported.\n+See :ref:`linux_gsg_binding_kernel` section for more details, notably with regards to\n+generic kernel modules binding and VF enablement.\n+More details on usage model is captured in the :ref:`pf_bb_config_acc200` section.\n \n \n Configure the VFs through PF\n@@ -241,6 +183,8 @@ The results of these tests will depend on the device capabilities which may\n cause some test cases to be skipped, but no failure should be reported.\n \n \n+.. _pf_bb_config_acc200:\n+\n Alternate Baseband Device configuration tool\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n \ndiff --git a/doc/guides/bbdevs/fpga_5gnr_fec.rst b/doc/guides/bbdevs/fpga_5gnr_fec.rst\nindex 9d71585e9e..b2afd1bb2a 100644\n--- a/doc/guides/bbdevs/fpga_5gnr_fec.rst\n+++ b/doc/guides/bbdevs/fpga_5gnr_fec.rst\n@@ -71,76 +71,15 @@ When the device first powers up, its PCI Physical Functions (PF) can be listed t\n \n   sudo lspci -vd8086:0d8f\n \n-The physical and virtual functions are compatible with Linux UIO drivers:\n-``vfio`` and ``igb_uio``. However, in order to work the FPGA 5GNR FEC device firstly needs\n-to be bound to one of these linux drivers through DPDK.\n \n+Binding and Virtual Functions enablement\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n \n-Bind PF UIO driver(s)\n-~~~~~~~~~~~~~~~~~~~~~\n-\n-Install the DPDK igb_uio driver, bind it with the PF PCI device ID and use\n-``lspci`` to confirm the PF device is under use by ``igb_uio`` DPDK UIO driver.\n-\n-The igb_uio driver may be bound to the PF PCI device using one of two methods:\n-\n-\n-1. PCI functions (physical or virtual, depending on the use case) can be bound to\n-the UIO driver by repeating this command for every function.\n-\n-.. code-block:: console\n-\n-  insmod igb_uio.ko\n-  echo \"8086 0d8f\" > /sys/bus/pci/drivers/igb_uio/new_id\n-  lspci -vd8086:0d8f\n-\n-\n-2. Another way to bind PF with DPDK UIO driver is by using the ``dpdk-devbind.py`` tool\n-\n-.. code-block:: console\n-\n-  cd <dpdk-top-level-directory>\n-  ./usertools/dpdk-devbind.py -b igb_uio 0000:06:00.0\n-\n-where the PCI device ID (example: 0000:06:00.0) is obtained using lspci -vd8086:0d8f\n-\n-\n-In the same way the FPGA 5GNR FEC PF can be bound with vfio, but vfio driver does not\n-support SR-IOV configuration right out of the box, so it will need to be patched.\n-\n-\n-Enable Virtual Functions\n-~~~~~~~~~~~~~~~~~~~~~~~~\n-\n-Now, it should be visible in the printouts that PCI PF is under igb_uio control\n-\"``Kernel driver in use: igb_uio``\"\n-\n-To show the number of available VFs on the device, read ``sriov_totalvfs`` file..\n-\n-.. code-block:: console\n-\n-  cat /sys/bus/pci/devices/0000\\:<b>\\:<d>.<f>/sriov_totalvfs\n-\n-  where 0000\\:<b>\\:<d>.<f> is the PCI device ID\n-\n-\n-To enable VFs via igb_uio, echo the number of virtual functions intended to\n-enable to ``max_vfs`` file..\n-\n-.. code-block:: console\n-\n-  echo <num-of-vfs> > /sys/bus/pci/devices/0000\\:<b>\\:<d>.<f>/max_vfs\n-\n-\n-Afterwards, all VFs must be bound to appropriate UIO drivers as required, same\n-way it was done with the physical function previously.\n-\n-Enabling SR-IOV via vfio driver is pretty much the same, except that the file\n-name is different:\n-\n-.. code-block:: console\n-\n-  echo <num-of-vfs> > /sys/bus/pci/devices/0000\\:<b>\\:<d>.<f>/sriov_numvfs\n+The PMD relies on kernel modules to interface with the device: both UIO and VFIO kernel modules\n+are supported.\n+See :ref:`linux_gsg_binding_kernel` section for more details, notably with regards to\n+generic kernel modules binding and VF enablement.\n+More details on usage model is captured in the :ref:`pf_bb_config_fpga_5gnr` section.\n \n \n Configure the VFs through PF\n@@ -274,6 +213,8 @@ a range of additional tests under the test_vectors folder, which may be useful.\n of these tests will depend on the FPGA 5GNR FEC capabilities.\n \n \n+.. _pf_bb_config_fpga_5gnr:\n+\n Alternate Baseband Device configuration tool\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n \ndiff --git a/doc/guides/bbdevs/fpga_lte_fec.rst b/doc/guides/bbdevs/fpga_lte_fec.rst\nindex c3379c24e3..5e867c6bbd 100644\n--- a/doc/guides/bbdevs/fpga_lte_fec.rst\n+++ b/doc/guides/bbdevs/fpga_lte_fec.rst\n@@ -70,76 +70,15 @@ When the device first powers up, its PCI Physical Functions (PF) can be listed t\n \n   sudo lspci -vd1172:5052\n \n-The physical and virtual functions are compatible with Linux UIO drivers:\n-``vfio`` and ``igb_uio``. However, in order to work the FPGA LTE FEC device firstly needs\n-to be bound to one of these linux drivers through DPDK.\n \n+Binding and Virtual Functions enablement\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n \n-Bind PF UIO driver(s)\n-~~~~~~~~~~~~~~~~~~~~~\n-\n-Install the DPDK igb_uio driver, bind it with the PF PCI device ID and use\n-``lspci`` to confirm the PF device is under use by ``igb_uio`` DPDK UIO driver.\n-\n-The igb_uio driver may be bound to the PF PCI device using one of two methods:\n-\n-\n-1. PCI functions (physical or virtual, depending on the use case) can be bound to\n-the UIO driver by repeating this command for every function.\n-\n-.. code-block:: console\n-\n-  insmod igb_uio.ko\n-  echo \"1172 5052\" > /sys/bus/pci/drivers/igb_uio/new_id\n-  lspci -vd1172:\n-\n-\n-2. Another way to bind PF with DPDK UIO driver is by using the ``dpdk-devbind.py`` tool\n-\n-.. code-block:: console\n-\n-  cd <dpdk-top-level-directory>\n-  ./usertools/dpdk-devbind.py -b igb_uio 0000:06:00.0\n-\n-where the PCI device ID (example: 0000:06:00.0) is obtained using lspci -vd1172:\n-\n-\n-In the same way the FPGA LTE FEC PF can be bound with vfio, but vfio driver does not\n-support SR-IOV configuration right out of the box, so it will need to be patched.\n-\n-\n-Enable Virtual Functions\n-~~~~~~~~~~~~~~~~~~~~~~~~\n-\n-Now, it should be visible in the printouts that PCI PF is under igb_uio control\n-\"``Kernel driver in use: igb_uio``\"\n-\n-To show the number of available VFs on the device, read ``sriov_totalvfs`` file..\n-\n-.. code-block:: console\n-\n-  cat /sys/bus/pci/devices/0000\\:<b>\\:<d>.<f>/sriov_totalvfs\n-\n-  where 0000\\:<b>\\:<d>.<f> is the PCI device ID\n-\n-\n-To enable VFs via igb_uio, echo the number of virtual functions intended to\n-enable to ``max_vfs`` file..\n-\n-.. code-block:: console\n-\n-  echo <num-of-vfs> > /sys/bus/pci/devices/0000\\:<b>\\:<d>.<f>/max_vfs\n-\n-\n-Afterwards, all VFs must be bound to appropriate UIO drivers as required, same\n-way it was done with the physical function previously.\n-\n-Enabling SR-IOV via vfio driver is pretty much the same, except that the file\n-name is different:\n-\n-.. code-block:: console\n-\n-  echo <num-of-vfs> > /sys/bus/pci/devices/0000\\:<b>\\:<d>.<f>/sriov_numvfs\n+The PMD relies on kernel modules to interface with the device: both UIO and VFIO kernel modules\n+are supported.\n+See :ref:`linux_gsg_binding_kernel` section for more details, notably with regards to\n+generic kernel modules binding and VF enablement.\n+More details on usage model is captured in the :ref:`pf_bb_config_fpga_lte` section.\n \n \n Configure the VFs through PF\n@@ -293,6 +232,8 @@ of these tests will depend on the FPGA LTE FEC capabilities:\n    - ``turbo_enc_c4_k4800_r2_e14412_crc24b.data``\n \n \n+.. _pf_bb_config_fpga_lte:\n+\n Alternate Baseband Device configuration tool\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n \n",
    "prefixes": [
        "v4",
        "2/3"
    ]
}