get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 45055,
    "url": "https://patches.dpdk.org/api/patches/45055/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1537465276-77264-2-git-send-email-nikhil.rao@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": "<1537465276-77264-2-git-send-email-nikhil.rao@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1537465276-77264-2-git-send-email-nikhil.rao@intel.com",
    "date": "2018-09-20T17:41:13",
    "name": "[v4,2/5] eventdev: add caps API and PMD callbacks for eth Tx adapter",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "94feb865f3beadee3fb58d0918c0b64c69659ddc",
    "submitter": {
        "id": 528,
        "url": "https://patches.dpdk.org/api/people/528/?format=api",
        "name": "Rao, Nikhil",
        "email": "nikhil.rao@intel.com"
    },
    "delegate": {
        "id": 310,
        "url": "https://patches.dpdk.org/api/users/310/?format=api",
        "username": "jerin",
        "first_name": "Jerin",
        "last_name": "Jacob",
        "email": "jerinj@marvell.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1537465276-77264-2-git-send-email-nikhil.rao@intel.com/mbox/",
    "series": [
        {
            "id": 1426,
            "url": "https://patches.dpdk.org/api/series/1426/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=1426",
            "date": "2018-09-20T17:41:12",
            "name": "[v4,1/5] eventdev: add eth Tx adapter APIs",
            "version": 4,
            "mbox": "https://patches.dpdk.org/series/1426/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/45055/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/45055/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 389691B128;\n\tThu, 20 Sep 2018 19:42:31 +0200 (CEST)",
            "from mga18.intel.com (mga18.intel.com [134.134.136.126])\n\tby dpdk.org (Postfix) with ESMTP id 1D66E1B123\n\tfor <dev@dpdk.org>; Thu, 20 Sep 2018 19:42:28 +0200 (CEST)",
            "from orsmga006.jf.intel.com ([10.7.209.51])\n\tby orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t20 Sep 2018 10:42:28 -0700",
            "from unknown (HELO localhost.localdomain.localdomain)\n\t([10.224.122.193])\n\tby orsmga006.jf.intel.com with ESMTP; 20 Sep 2018 10:42:23 -0700"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.54,281,1534834800\"; d=\"scan'208\";a=\"75970105\"",
        "From": "Nikhil Rao <nikhil.rao@intel.com>",
        "To": "jerin.jacob@caviumnetworks.com, olivier.matz@6wind.com,\n\tmarko.kovacevic@intel.com, john.mcnamara@intel.com",
        "Cc": "dev@dpdk.org,\n\tNikhil Rao <nikhil.rao@intel.com>",
        "Date": "Thu, 20 Sep 2018 23:11:13 +0530",
        "Message-Id": "<1537465276-77264-2-git-send-email-nikhil.rao@intel.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1537465276-77264-1-git-send-email-nikhil.rao@intel.com>",
        "References": "<1535694069-88757-1-git-send-email-nikhil.rao@intel.com>\n\t<1537465276-77264-1-git-send-email-nikhil.rao@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v4 2/5] eventdev: add caps API and PMD callbacks\n\tfor eth Tx adapter",
        "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\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "The caps API allows the application to query if the transmit\nstage is implemented in the eventdev PMD or uses the common\nrte_service function. The PMD callbacks support the\neventdev PMD implementation of the adapter.\n\nSigned-off-by: Nikhil Rao <nikhil.rao@intel.com>\nAcked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>\n---\n lib/librte_eventdev/rte_event_eth_tx_adapter.h |   8 +-\n lib/librte_eventdev/rte_eventdev.h             |  33 +++-\n lib/librte_eventdev/rte_eventdev_pmd.h         | 200 +++++++++++++++++++++++++\n lib/librte_eventdev/rte_eventdev.c             |  36 +++++\n 4 files changed, 272 insertions(+), 5 deletions(-)",
    "diff": "diff --git a/lib/librte_eventdev/rte_event_eth_tx_adapter.h b/lib/librte_eventdev/rte_event_eth_tx_adapter.h\nindex 3e0d5c6..0f378a6 100644\n--- a/lib/librte_eventdev/rte_event_eth_tx_adapter.h\n+++ b/lib/librte_eventdev/rte_event_eth_tx_adapter.h\n@@ -39,14 +39,14 @@\n  * rte_event_eth_tx_adapter_create() or rte_event_eth_tx_adapter_create_ext().\n  *\n  * The adapter will use the common implementation when the eventdev PMD\n- * does not have the RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT capability.\n+ * does not have the #RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT capability.\n  * The common implementation uses an event port that is created using the port\n  * configuration parameter passed to rte_event_eth_tx_adapter_create(). The\n  * application can get the port identifier using\n  * rte_event_eth_tx_adapter_event_port_get() and must link an event queue to\n  * this port.\n  *\n- * If the eventdev PMD has the RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT\n+ * If the eventdev PMD has the #RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT\n  * flags set, Tx adapter events should be enqueued using the\n  * rte_event_eth_tx_adapter_enqueue() function, else the application should\n  * use rte_event_enqueue_burst().\n@@ -329,7 +329,7 @@ struct rte_event_eth_tx_adapter_stats {\n  * @b EXPERIMENTAL: this API may change without prior notice\n  *\n  * Retrieve the adapter event port. The adapter creates an event port if\n- * the RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT is not set in the\n+ * the #RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT is not set in the\n  * ethernet Tx capabilities of the event device.\n  *\n  * @param id\n@@ -347,7 +347,7 @@ struct rte_event_eth_tx_adapter_stats {\n  * Enqueue a burst of events objects or an event object supplied in *rte_event*\n  * structure on an  event device designated by its *dev_id* through the event\n  * port specified by *port_id*. This function is supported if the eventdev PMD\n- * has the RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT capability flag set.\n+ * has the #RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT capability flag set.\n  *\n  * The *nb_events* parameter is the number of event objects to enqueue which are\n  * supplied in the *ev* array of *rte_event* structure.\ndiff --git a/lib/librte_eventdev/rte_eventdev.h b/lib/librte_eventdev/rte_eventdev.h\nindex b6fd6ee..4717292 100644\n--- a/lib/librte_eventdev/rte_eventdev.h\n+++ b/lib/librte_eventdev/rte_eventdev.h\n@@ -1186,6 +1186,32 @@ struct rte_event {\n rte_event_crypto_adapter_caps_get(uint8_t dev_id, uint8_t cdev_id,\n \t\t\t\t  uint32_t *caps);\n \n+/* Ethdev Tx adapter capability bitmap flags */\n+#define RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT\t0x1\n+/**< This flag is sent when the PMD supports a packet transmit callback\n+ */\n+\n+/**\n+ * Retrieve the event device's eth Tx adapter capabilities\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ *\n+ * @param eth_port_id\n+ *   The identifier of the ethernet device.\n+ *\n+ * @param[out] caps\n+ *   A pointer to memory filled with eth Tx adapter capabilities.\n+ *\n+ * @return\n+ *   - 0: Success, driver provides eth Tx adapter capabilities.\n+ *   - <0: Error code returned by the driver function.\n+ *\n+ */\n+int __rte_experimental\n+rte_event_eth_tx_adapter_caps_get(uint8_t dev_id, uint16_t eth_port_id,\n+\t\t\t\tuint32_t *caps);\n+\n struct rte_eventdev_ops;\n struct rte_eventdev;\n \n@@ -1204,6 +1230,10 @@ typedef uint16_t (*event_dequeue_burst_t)(void *port, struct rte_event ev[],\n \t\tuint16_t nb_events, uint64_t timeout_ticks);\n /**< @internal Dequeue burst of events from port of a device */\n \n+typedef uint16_t (*event_tx_adapter_enqueue)(void *port,\n+\t\t\t\tstruct rte_event ev[], uint16_t nb_events);\n+/**< @internal Enqueue burst of events on port of a device */\n+\n #define RTE_EVENTDEV_NAME_MAX_LEN\t(64)\n /**< @internal Max length of name of event PMD */\n \n@@ -1266,7 +1296,8 @@ struct rte_eventdev {\n \t/**< Pointer to PMD dequeue function. */\n \tevent_dequeue_burst_t dequeue_burst;\n \t/**< Pointer to PMD dequeue burst function. */\n-\n+\tevent_tx_adapter_enqueue txa_enqueue;\n+\t/**< Pointer to PMD eth Tx adapter enqueue function. */\n \tstruct rte_eventdev_data *data;\n \t/**< Pointer to device data */\n \tstruct rte_eventdev_ops *dev_ops;\ndiff --git a/lib/librte_eventdev/rte_eventdev_pmd.h b/lib/librte_eventdev/rte_eventdev_pmd.h\nindex 3fbb4d2..cd7145a 100644\n--- a/lib/librte_eventdev/rte_eventdev_pmd.h\n+++ b/lib/librte_eventdev/rte_eventdev_pmd.h\n@@ -789,6 +789,186 @@ typedef int (*eventdev_crypto_adapter_stats_reset)\n \t\t\t(const struct rte_eventdev *dev,\n \t\t\t const struct rte_cryptodev *cdev);\n \n+/**\n+ * Retrieve the event device's eth Tx adapter capabilities.\n+ *\n+ * @param dev\n+ *   Event device pointer\n+ *\n+ * @param eth_dev\n+ *   Ethernet device pointer\n+ *\n+ * @param[out] caps\n+ *   A pointer to memory filled with eth Tx adapter capabilities.\n+ *\n+ * @return\n+ *   - 0: Success, driver provides eth Tx adapter capabilities\n+ *   - <0: Error code returned by the driver function.\n+ *\n+ */\n+typedef int (*eventdev_eth_tx_adapter_caps_get_t)\n+\t\t\t\t\t(const struct rte_eventdev *dev,\n+\t\t\t\t\tconst struct rte_eth_dev *eth_dev,\n+\t\t\t\t\tuint32_t *caps);\n+\n+/**\n+ * Create adapter callback.\n+ *\n+ * @param id\n+ *   Adapter identifier\n+ *\n+ * @param dev\n+ *   Event device pointer\n+ *\n+ * @return\n+ *   - 0: Success.\n+ *   - <0: Error code on failure.\n+ */\n+typedef int (*eventdev_eth_tx_adapter_create_t)(uint8_t id,\n+\t\t\t\t\tconst struct rte_eventdev *dev);\n+\n+/**\n+ * Free adapter callback.\n+ *\n+ * @param id\n+ *   Adapter identifier\n+ *\n+ * @param dev\n+ *   Event device pointer\n+ *\n+ * @return\n+ *   - 0: Success.\n+ *   - <0: Error code on failure.\n+ */\n+typedef int (*eventdev_eth_tx_adapter_free_t)(uint8_t id,\n+\t\t\t\t\tconst struct rte_eventdev *dev);\n+\n+/**\n+ * Add a Tx queue to the adapter.\n+ * A queue value of -1 is used to indicate all\n+ * queues within the device.\n+ *\n+ * @param id\n+ *   Adapter identifier\n+ *\n+ * @param dev\n+ *   Event device pointer\n+ *\n+ * @param eth_dev\n+ *   Ethernet device pointer\n+ *\n+ * @param tx_queue_id\n+ *   Transmt queue index\n+ *\n+ * @return\n+ *   - 0: Success.\n+ *   - <0: Error code on failure.\n+ */\n+typedef int (*eventdev_eth_tx_adapter_queue_add_t)(\n+\t\t\t\t\tuint8_t id,\n+\t\t\t\t\tconst struct rte_eventdev *dev,\n+\t\t\t\t\tconst struct rte_eth_dev *eth_dev,\n+\t\t\t\t\tint32_t tx_queue_id);\n+\n+/**\n+ * Delete a Tx queue from the adapter.\n+ * A queue value of -1 is used to indicate all\n+ * queues within the device, that have been added to this\n+ * adapter.\n+ *\n+ * @param id\n+ *   Adapter identifier\n+ *\n+ * @param dev\n+ *   Event device pointer\n+ *\n+ * @param eth_dev\n+ *   Ethernet device pointer\n+ *\n+ * @param tx_queue_id\n+ *   Transmit queue index\n+ *\n+ * @return\n+ *  - 0: Success, Queues deleted successfully.\n+ *  - <0: Error code on failure.\n+ */\n+typedef int (*eventdev_eth_tx_adapter_queue_del_t)(\n+\t\t\t\t\tuint8_t id,\n+\t\t\t\t\tconst struct rte_eventdev *dev,\n+\t\t\t\t\tconst struct rte_eth_dev *eth_dev,\n+\t\t\t\t\tint32_t tx_queue_id);\n+\n+/**\n+ * Start the adapter.\n+ *\n+ * @param id\n+ *   Adapter identifier\n+ *\n+ * @param dev\n+ *   Event device pointer\n+ *\n+ * @return\n+ *  - 0: Success, Adapter started correctly.\n+ *  - <0: Error code on failure.\n+ */\n+typedef int (*eventdev_eth_tx_adapter_start_t)(uint8_t id,\n+\t\t\t\t\tconst struct rte_eventdev *dev);\n+\n+/**\n+ * Stop the adapter.\n+ *\n+ * @param id\n+ *  Adapter identifier\n+ *\n+ * @param dev\n+ *   Event device pointer\n+ *\n+ * @return\n+ *  - 0: Success.\n+ *  - <0: Error code on failure.\n+ */\n+typedef int (*eventdev_eth_tx_adapter_stop_t)(uint8_t id,\n+\t\t\t\t\tconst struct rte_eventdev *dev);\n+\n+struct rte_event_eth_tx_adapter_stats;\n+\n+/**\n+ * Retrieve statistics for an adapter\n+ *\n+ * @param id\n+ *  Adapter identifier\n+ *\n+ * @param dev\n+ *   Event device pointer\n+ *\n+ * @param [out] stats\n+ *  A pointer to structure used to retrieve statistics for an adapter\n+ *\n+ * @return\n+ *  - 0: Success, statistics retrieved successfully.\n+ *  - <0: Error code on failure.\n+ */\n+typedef int (*eventdev_eth_tx_adapter_stats_get_t)(\n+\t\t\t\tuint8_t id,\n+\t\t\t\tconst struct rte_eventdev *dev,\n+\t\t\t\tstruct rte_event_eth_tx_adapter_stats *stats);\n+\n+/**\n+ * Reset statistics for an adapter\n+ *\n+ * @param id\n+ *  Adapter identifier\n+ *\n+ * @param dev\n+ *   Event device pointer\n+ *\n+ * @return\n+ *  - 0: Success, statistics retrieved successfully.\n+ *  - <0: Error code on failure.\n+ */\n+typedef int (*eventdev_eth_tx_adapter_stats_reset_t)(uint8_t id,\n+\t\t\t\t\tconst struct rte_eventdev *dev);\n+\n /** Event device operations function pointer table */\n struct rte_eventdev_ops {\n \teventdev_info_get_t dev_infos_get;\t/**< Get device info. */\n@@ -862,6 +1042,26 @@ struct rte_eventdev_ops {\n \teventdev_crypto_adapter_stats_reset crypto_adapter_stats_reset;\n \t/**< Reset crypto stats */\n \n+\teventdev_eth_tx_adapter_caps_get_t eth_tx_adapter_caps_get;\n+\t/**< Get ethernet Tx adapter capabilities */\n+\n+\teventdev_eth_tx_adapter_create_t eth_tx_adapter_create;\n+\t/**< Create adapter callback */\n+\teventdev_eth_tx_adapter_free_t eth_tx_adapter_free;\n+\t/**< Free adapter callback */\n+\teventdev_eth_tx_adapter_queue_add_t eth_tx_adapter_queue_add;\n+\t/**< Add Tx queues to the eth Tx adapter */\n+\teventdev_eth_tx_adapter_queue_del_t eth_tx_adapter_queue_del;\n+\t/**< Delete Tx queues from the eth Tx adapter */\n+\teventdev_eth_tx_adapter_start_t eth_tx_adapter_start;\n+\t/**< Start eth Tx adapter */\n+\teventdev_eth_tx_adapter_stop_t eth_tx_adapter_stop;\n+\t/**< Stop eth Tx adapter */\n+\teventdev_eth_tx_adapter_stats_get_t eth_tx_adapter_stats_get;\n+\t/**< Get eth Tx adapter statistics */\n+\teventdev_eth_tx_adapter_stats_reset_t eth_tx_adapter_stats_reset;\n+\t/**< Reset eth Tx adapter statistics */\n+\n \teventdev_selftest dev_selftest;\n \t/**< Start eventdev Selftest */\n \ndiff --git a/lib/librte_eventdev/rte_eventdev.c b/lib/librte_eventdev/rte_eventdev.c\nindex 801810e..c4decd5 100644\n--- a/lib/librte_eventdev/rte_eventdev.c\n+++ b/lib/librte_eventdev/rte_eventdev.c\n@@ -175,6 +175,31 @@\n \t\t(dev, cdev, caps) : -ENOTSUP;\n }\n \n+int __rte_experimental\n+rte_event_eth_tx_adapter_caps_get(uint8_t dev_id, uint16_t eth_port_id,\n+\t\t\t\tuint32_t *caps)\n+{\n+\tstruct rte_eventdev *dev;\n+\tstruct rte_eth_dev *eth_dev;\n+\n+\tRTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);\n+\tRTE_ETH_VALID_PORTID_OR_ERR_RET(eth_port_id, -EINVAL);\n+\n+\tdev = &rte_eventdevs[dev_id];\n+\teth_dev = &rte_eth_devices[eth_port_id];\n+\n+\tif (caps == NULL)\n+\t\treturn -EINVAL;\n+\n+\t*caps = 0;\n+\n+\treturn dev->dev_ops->eth_tx_adapter_caps_get ?\n+\t\t\t(*dev->dev_ops->eth_tx_adapter_caps_get)(dev,\n+\t\t\t\t\t\t\t\teth_dev,\n+\t\t\t\t\t\t\t\tcaps)\n+\t\t\t: 0;\n+}\n+\n static inline int\n rte_event_dev_queue_config(struct rte_eventdev *dev, uint8_t nb_queues)\n {\n@@ -1275,6 +1300,15 @@ int rte_event_dev_selftest(uint8_t dev_id)\n \treturn RTE_EVENT_MAX_DEVS;\n }\n \n+static uint16_t\n+rte_event_tx_adapter_enqueue(__rte_unused void *port,\n+\t\t\t__rte_unused struct rte_event ev[],\n+\t\t\t__rte_unused uint16_t nb_events)\n+{\n+\trte_errno = ENOTSUP;\n+\treturn 0;\n+}\n+\n struct rte_eventdev *\n rte_event_pmd_allocate(const char *name, int socket_id)\n {\n@@ -1295,6 +1329,8 @@ struct rte_eventdev *\n \n \teventdev = &rte_eventdevs[dev_id];\n \n+\teventdev->txa_enqueue = rte_event_tx_adapter_enqueue;\n+\n \tif (eventdev->data == NULL) {\n \t\tstruct rte_eventdev_data *eventdev_data = NULL;\n \n",
    "prefixes": [
        "v4",
        "2/5"
    ]
}