get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 116340,
    "url": "http://patches.dpdk.org/api/patches/116340/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1663238669-12244-6-git-send-email-chaoyong.he@corigine.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": "<1663238669-12244-6-git-send-email-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1663238669-12244-6-git-send-email-chaoyong.he@corigine.com",
    "date": "2022-09-15T10:44:22",
    "name": "[v9,05/12] net/nfp: add flower PF setup logic",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "52eb89170316636710666be8d0122afd940b40d8",
    "submitter": {
        "id": 2554,
        "url": "http://patches.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1663238669-12244-6-git-send-email-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 24678,
            "url": "http://patches.dpdk.org/api/series/24678/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=24678",
            "date": "2022-09-15T10:44:17",
            "name": "preparation for the rte_flow offload of nfp PMD",
            "version": 9,
            "mbox": "http://patches.dpdk.org/series/24678/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/116340/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/116340/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 2B4A2A00C5;\n\tThu, 15 Sep 2022 12:45:26 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id BAB5E42B6C;\n\tThu, 15 Sep 2022 12:45:02 +0200 (CEST)",
            "from NAM11-CO1-obe.outbound.protection.outlook.com\n (mail-co1nam11on2139.outbound.protection.outlook.com [40.107.220.139])\n by mails.dpdk.org (Postfix) with ESMTP id E9258427F9\n for <dev@dpdk.org>; Thu, 15 Sep 2022 12:45:00 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by SA0PR13MB4158.namprd13.prod.outlook.com (2603:10b6:806:9b::9) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5654.5; Thu, 15 Sep\n 2022 10:44:59 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::819:38c:6513:bf15]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::819:38c:6513:bf15%4]) with mapi id 15.20.5632.012; Thu, 15 Sep 2022\n 10:44:59 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=Y4x2hu1Bmh0V9ZmcLZ+wBp6cpTaaGAHdLP/L14kgXGJAOsiL9Rprd39holGUcoGoSYNb8nX+vBbZ0LyxuzF1Km5Y4n+ba8rqEdiRZQ51qrx6jDKA7tPY+ZlyR9y2ng7LuN6NQB0aMSBZWAa47zuv46g0p+iVs7NlonaDwCREQRVLlBlvhBaKJSmH88BeALlwC4YqZPYBIuCqqyIhC2zUg889zJHCe+cDXTv1IymUh8bzp+S7a3QAVdrjl3cL4yIvrQ2Uj4HE79LkciBpFbdgmNNt0mZRjUs0GNxnSbPootAhcMB7LqVoQWcsN+Fe1eldlKy8iXGGqga8vX9UaeMlxg==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=5/r66El63F913JmN4r7GK3hVH73nAEp20IMYIghF9lM=;\n b=C+rnlnAlrcnqYjCQse3woGIQu5SdhZK1Qs01jEaBP+T3nSp3keR0pX1cN5rctLjLtCbEaKiUTMATURm/ebq8WxyIGaEdKMyNZvk06ra4WvbRoxpquHkePaQjX95ObMlFEwUTwH97t9MJQYmAeAPhsFPZMD+9rzV1Q1wiWcDVbizoHG3SZ97UgsjuDKF122Rg2ZOxZAPlolKACgcyUTSuDBBLdyZpGggoPxXP3Ncb1VxcH/eXALN82kqC/zbu9OV3QAy7K6WqPmBpesATM42yxmil0tf+3KcxINq5+iyPLLEOKarNkUGDralPWY0CSHJEt1yoTZ+AubnxNC5lummW7g==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com;\n dkim=pass header.d=corigine.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=5/r66El63F913JmN4r7GK3hVH73nAEp20IMYIghF9lM=;\n b=X/FcCE6drHbwdJd50udvQcHDMJ/ZajGaiyO19SZK/LiaxTD4wAeoy9oS5Mb6sbkVnyfKJp0nbFMzQAStzCNWJ1F7f5u2qzO3eZa0961Bb19q1m+NJmvpmZOvW4gAmiqUhHdX6SUNVinRkAJczkfZjGlIEEfVmqnJtNMKDEbRZE0=",
        "Authentication-Results": "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=corigine.com;",
        "From": "Chaoyong He <chaoyong.he@corigine.com>",
        "To": "dev@dpdk.org",
        "Cc": "oss-drivers@corigine.com, niklas.soderlund@corigine.com,\n Chaoyong He <chaoyong.he@corigine.com>",
        "Subject": "[PATCH v9 05/12] net/nfp: add flower PF setup logic",
        "Date": "Thu, 15 Sep 2022 18:44:22 +0800",
        "Message-Id": "<1663238669-12244-6-git-send-email-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1663238669-12244-1-git-send-email-chaoyong.he@corigine.com>",
        "References": "<1663238669-12244-1-git-send-email-chaoyong.he@corigine.com>",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-ClientProxiedBy": "BYAPR11CA0071.namprd11.prod.outlook.com\n (2603:10b6:a03:80::48) To SJ0PR13MB5545.namprd13.prod.outlook.com\n (2603:10b6:a03:424::5)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "SJ0PR13MB5545:EE_|SA0PR13MB4158:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "979f61e2-e739-439f-1921-08da97075659",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n ssef3qQkLjiEFMG4jAtl7pQiEA5IpSXKheu+9RkJGpH8thvrJLlr73suEsTG3kTzsZyp0WKtsFfexBNB94vdqEkCSWWMHu8VFWZv3hdXUpwi6wKNmiUkx34oNwU+ob31uvpnzH1cHNSH/FpafxGCOD428xoqTjQwDWZ0TD3/IVSz2n2N2Kc3gjSZ6ggzZHbuY0DFKWuaRvKq98UXuU+dfDY2zcFiiNzyzbTQ50U/PdK+qXSxTL6NOi5+JuA1YTwK9vikhYbgV9T220Ui/FwXnPsOafURgQmBhyh2iJq3tWexSl/FSvGwLynEJ/EfMIfXTpRgQ9jCX9s10mtYcpey9u+FQWujg+O1/IzBR/ctP2jiup/LKBCdmxLrkyKjGQwAEDExM7TGAZfLPghXXT4bX8gaYUv76W64Tw8bU2wTvevK/9oJYEssQ+9ImSUwaIWz8meolsV+AnAt6CsPQ9NXS9SoCTow/bgTVYjBLnl5Nl3XRN/EzSa7Aca5Oj0p9hAICIYIxXR0jiYSky6hr47uLrzJj9aZVLgvIhN26Vm76ICE+4pZl2RryPrr1gSSPRVcdOIYpVHW/IpTTSGVKt2s6RbZ6bSZVoIeuzP1CYHjIP/dR/uCpX5Pw4OMWD89jbRxpAbAlRvqt6isiJ2Pw3u8eInIt5M7hEAtKneaip9FfPBR73PmKdIWj1fCcTNhvT+LmC2uYDpFH6a8BKBQuHjxmd3QqABgCew0hjlrkINrhKPz3uDuLkLXhOoz0pZmZy52QujdWUptlw9chmUy6c/vIA==",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230022)(4636009)(396003)(346002)(366004)(376002)(39840400004)(136003)(451199015)(2616005)(66574015)(38350700002)(38100700002)(186003)(86362001)(83380400001)(107886003)(8676002)(66946007)(66476007)(4326008)(66556008)(44832011)(8936002)(41300700001)(2906002)(5660300002)(6506007)(478600001)(6666004)(316002)(30864003)(6512007)(26005)(6486002)(52116002)(6916009)(36756003);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "=?utf-8?q?elCJ95xBv9R1dw0zlO8ymqeksZYw?=\n\t=?utf-8?q?40zgwTe3IY3NdIPWQ/sdyRNgh6+JI1iYd34dIX5r4t2rCAQIBX/DcaTkyjyr4Rrf/?=\n\t=?utf-8?q?QTVr4oGqK781MfCQY9hdarFGdcl3y+R+b674/SUhkVvq3Z4+PJEctxFoSdC7TcibG?=\n\t=?utf-8?q?yHfDInvcLz2fQc9KSYaH1S0HTvlZFS3ouEX4+yd9RBICan5Uas6Zk9m+Zeb7vmZcq?=\n\t=?utf-8?q?JpoS7dCnM4OCP3zw/S87buuvNLnS2t4j5n9gFXnw9WnreLKsaaGvsObuXAwPH7X+7?=\n\t=?utf-8?q?8cKbewCAtIkSYwqvp0DfigtNdZ6zwPLPJiOr5uenwcOeKjjIUHPuYzSIsT5tP4U6M?=\n\t=?utf-8?q?+rjQ+lTzCyfwhyw6pxrAlqgpoRH1/dyUsa/4suT1fqbMz266Lsh4RClIdC4oWmxFm?=\n\t=?utf-8?q?rXI4eeiQfLgKIT/o+l9SZEA7lIaLpb3YzGI7uVtCurWt//yZSWtQOxAWInv+t3jT+?=\n\t=?utf-8?q?lTSK+Aw2Z+NIN3INlyKw6Lq5qXQgiE9TduDZMCY0R2Db9/xqBEyL5oRtn3rS87aWs?=\n\t=?utf-8?q?axnMReqkPkXHt18Z5ydv7QRy6d4+k8MCp/DKqNMuT8DT2kv/F3FO5amZ/NwQXZPq4?=\n\t=?utf-8?q?AqUvBgS+MhDntTQ3jcLGWdOCPc1A05RrUBJIS+CxjIoq/X23EmzyTM4+ZwvIykPOY?=\n\t=?utf-8?q?munHRFdvZi+EuqN1riDw14fItWsO83dEvEg2FxlPmL+ZDxSPA5jlKq8xUn5RtZXwH?=\n\t=?utf-8?q?odg1EsA5PGgY36LxlPZ4BLnzlOxZ8Bp28TRpzu/n11RPdQfnHsV/Fd8tET6qlDFiU?=\n\t=?utf-8?q?DKBBt1OgIGSJbjpowGcVG8PcYVzpF7VkfL4A5XTVT1x5I+sR6L7fyzhoBViU26Q5t?=\n\t=?utf-8?q?+cUEAQGABzQKOo2A4mfwJ7UGEQP4a/NRBQMRXeyAEzD6X16auLqcsGgT4uj6AOKdf?=\n\t=?utf-8?q?2FNh5ETrw9Axz101B2Q6qvleS8+kutZdsUzxcrTcCqKmUaNnHHEKqOvvpCK5CNt1H?=\n\t=?utf-8?q?My7VEEytf/JtbqBkGyhJUJDSmODUbgmHxRtGH0EJB5HogMA9OI7waR8DMyjeArs0n?=\n\t=?utf-8?q?TG7BVFdlgCUB4gNC6aY5gYzFSQlpohreccGa9dMw2UQLRG1ttZRYgbVJ5kxGLw2ti?=\n\t=?utf-8?q?+VwqbgShZYSEpbODJcT23LXhDn0J7icmYadwUO3AIY4suS32mHBoYdLiazDEOv5c2?=\n\t=?utf-8?q?pzk7KYPmEOXrKSE8CSn+r+gGQn3TmKeYputgcxZ3phZF9pcGXH8zf683Yi4yb+Uk4?=\n\t=?utf-8?q?22RarjKpJbDCnT/99AEDYvtxSuVVE7HB6KnP8gkrRHAwLrvIuaT+WhYU2jAh7au2Z?=\n\t=?utf-8?q?dR3imOcWmuPczoz8TGXUCH0BR9DCi4GL9vQc/hdDF+tX4G46TS595kMojd65rTxqm?=\n\t=?utf-8?q?FIUoWEzSw0gd/o+rinBD10P2NusTK6311ymdrNeHsVt83kSkhrkGp8Srod2sZIdvD?=\n\t=?utf-8?q?Q/Ho0GdbOgAYtNc1X/5qBzWjcckEjTgNVyX/dS6PlXyoHtLWP6ImGDKDYZnKgLqnr?=\n\t=?utf-8?q?TQSENTapT6YBb53vWDfAngUKxUR7h+tbt4XGly0Ks7axEn7fiwaaMctyngLOXU3/t?=\n\t=?utf-8?q?aT78f7ZMWV7FjLC3vXSaKqiduQPqS13+1w=3D=3D?=",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "SA0PR13MB4158",
        "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": "Adds the vNIC initialization logic for the flower PF vNIC. The flower\nfirmware application exposes this vNIC for the purposes of fallback\ntraffic in the switchdev use-case.\n\nAdds minimal dev_ops for this PF vNIC device. Because the device is\nbeing exposed externally to DPDK it needs to implements a minimal set\nof dev_ops.\n\nSigned-off-by: Chaoyong He <chaoyong.he@corigine.com>\nReviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>\n---\n drivers/net/nfp/flower/nfp_flower.c | 369 +++++++++++++++++++++++++++++++++++-\n drivers/net/nfp/flower/nfp_flower.h |   8 +\n drivers/net/nfp/nfp_common.h        |   3 +\n 3 files changed, 377 insertions(+), 3 deletions(-)",
    "diff": "diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c\nindex 87cb922..34e60f8 100644\n--- a/drivers/net/nfp/flower/nfp_flower.c\n+++ b/drivers/net/nfp/flower/nfp_flower.c\n@@ -14,12 +14,312 @@\n #include \"../nfp_logs.h\"\n #include \"../nfp_ctrl.h\"\n #include \"../nfp_cpp_bridge.h\"\n+#include \"../nfp_rxtx.h\"\n+#include \"../nfpcore/nfp_mip.h\"\n+#include \"../nfpcore/nfp_rtsym.h\"\n+#include \"../nfpcore/nfp_nsp.h\"\n #include \"nfp_flower.h\"\n \n+#define MAX_PKT_BURST 32\n+#define MBUF_PRIV_SIZE 128\n+#define MEMPOOL_CACHE_SIZE 512\n+#define DEFAULT_FLBUF_SIZE 9216\n+\n+#define PF_VNIC_NB_DESC 1024\n+\n+static const struct rte_eth_rxconf rx_conf = {\n+\t.rx_free_thresh = DEFAULT_RX_FREE_THRESH,\n+\t.rx_drop_en = 1,\n+};\n+\n+static const struct rte_eth_txconf tx_conf = {\n+\t.tx_thresh = {\n+\t\t.pthresh  = DEFAULT_TX_PTHRESH,\n+\t\t.hthresh = DEFAULT_TX_HTHRESH,\n+\t\t.wthresh = DEFAULT_TX_WTHRESH,\n+\t},\n+\t.tx_free_thresh = DEFAULT_TX_FREE_THRESH,\n+};\n+\n+static const struct eth_dev_ops nfp_flower_pf_vnic_ops = {\n+\t.dev_infos_get          = nfp_net_infos_get,\n+};\n+\n+struct dp_packet {\n+\tstruct rte_mbuf mbuf;\n+\tuint32_t source;\n+};\n+\n+static void\n+nfp_flower_pf_mp_init(__rte_unused struct rte_mempool *mp,\n+\t\t__rte_unused void *opaque_arg,\n+\t\tvoid *packet,\n+\t\t__rte_unused unsigned int i)\n+{\n+\tstruct dp_packet *pkt = packet;\n+\t/* Indicate that this pkt is from DPDK */\n+\tpkt->source = 3;\n+}\n+\n+static struct rte_mempool *\n+nfp_flower_pf_mp_create(void)\n+{\n+\tuint32_t nb_mbufs;\n+\tunsigned int numa_node;\n+\tstruct rte_mempool *pktmbuf_pool;\n+\tuint32_t n_rxd = PF_VNIC_NB_DESC;\n+\tuint32_t n_txd = PF_VNIC_NB_DESC;\n+\n+\tnb_mbufs = RTE_MAX(n_rxd + n_txd + MAX_PKT_BURST + MEMPOOL_CACHE_SIZE, 81920U);\n+\n+\tnuma_node = rte_socket_id();\n+\tpktmbuf_pool = rte_pktmbuf_pool_create(\"flower_pf_mbuf_pool\", nb_mbufs,\n+\t\t\tMEMPOOL_CACHE_SIZE, MBUF_PRIV_SIZE,\n+\t\t\tRTE_MBUF_DEFAULT_BUF_SIZE, numa_node);\n+\tif (pktmbuf_pool == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"Cannot init pf vnic mbuf pool\");\n+\t\treturn NULL;\n+\t}\n+\n+\trte_mempool_obj_iter(pktmbuf_pool, nfp_flower_pf_mp_init, NULL);\n+\n+\treturn pktmbuf_pool;\n+}\n+\n+static int\n+nfp_flower_init_vnic_common(struct nfp_net_hw *hw, const char *vnic_type)\n+{\n+\tuint32_t start_q;\n+\tuint64_t rx_bar_off;\n+\tuint64_t tx_bar_off;\n+\tconst int stride = 4;\n+\tstruct nfp_pf_dev *pf_dev;\n+\tstruct rte_pci_device *pci_dev;\n+\n+\tpf_dev = hw->pf_dev;\n+\tpci_dev = hw->pf_dev->pci_dev;\n+\n+\t/* NFP can not handle DMA addresses requiring more than 40 bits */\n+\tif (rte_mem_check_dma_mask(40)) {\n+\t\tPMD_INIT_LOG(ERR, \"Device %s can not be used: restricted dma mask to 40 bits!\\n\",\n+\t\t\t\tpci_dev->device.name);\n+\t\treturn -ENODEV;\n+\t};\n+\n+\thw->device_id = pci_dev->id.device_id;\n+\thw->vendor_id = pci_dev->id.vendor_id;\n+\thw->subsystem_device_id = pci_dev->id.subsystem_device_id;\n+\thw->subsystem_vendor_id = pci_dev->id.subsystem_vendor_id;\n+\n+\tPMD_INIT_LOG(DEBUG, \"%s vNIC ctrl bar: %p\", vnic_type, hw->ctrl_bar);\n+\n+\t/* Read the number of available rx/tx queues from hardware */\n+\thw->max_rx_queues = nn_cfg_readl(hw, NFP_NET_CFG_MAX_RXRINGS);\n+\thw->max_tx_queues = nn_cfg_readl(hw, NFP_NET_CFG_MAX_TXRINGS);\n+\n+\t/* Work out where in the BAR the queues start */\n+\tstart_q = nn_cfg_readl(hw, NFP_NET_CFG_START_TXQ);\n+\ttx_bar_off = (uint64_t)start_q * NFP_QCP_QUEUE_ADDR_SZ;\n+\tstart_q = nn_cfg_readl(hw, NFP_NET_CFG_START_RXQ);\n+\trx_bar_off = (uint64_t)start_q * NFP_QCP_QUEUE_ADDR_SZ;\n+\n+\thw->tx_bar = pf_dev->hw_queues + tx_bar_off;\n+\thw->rx_bar = pf_dev->hw_queues + rx_bar_off;\n+\n+\t/* Get some of the read-only fields from the config BAR */\n+\thw->ver = nn_cfg_readl(hw, NFP_NET_CFG_VERSION);\n+\thw->cap = nn_cfg_readl(hw, NFP_NET_CFG_CAP);\n+\thw->max_mtu = nn_cfg_readl(hw, NFP_NET_CFG_MAX_MTU);\n+\t/* Set the current MTU to the maximum supported */\n+\thw->mtu = hw->max_mtu;\n+\thw->flbufsz = DEFAULT_FLBUF_SIZE;\n+\n+\t/* read the Rx offset configured from firmware */\n+\tif (NFD_CFG_MAJOR_VERSION_of(hw->ver) < 2)\n+\t\thw->rx_offset = NFP_NET_RX_OFFSET;\n+\telse\n+\t\thw->rx_offset = nn_cfg_readl(hw, NFP_NET_CFG_RX_OFFSET_ADDR);\n+\n+\thw->ctrl = 0;\n+\thw->stride_rx = stride;\n+\thw->stride_tx = stride;\n+\n+\t/* Reuse cfg queue setup function */\n+\tnfp_net_cfg_queue_setup(hw);\n+\n+\tPMD_INIT_LOG(INFO, \"%s vNIC max_rx_queues: %u, max_tx_queues: %u\",\n+\t\t\tvnic_type, hw->max_rx_queues, hw->max_tx_queues);\n+\n+\t/* Initializing spinlock for reconfigs */\n+\trte_spinlock_init(&hw->reconfig_lock);\n+\n+\treturn 0;\n+}\n+\n+static int\n+nfp_flower_init_pf_vnic(struct nfp_net_hw *hw)\n+{\n+\tint ret;\n+\tuint16_t i;\n+\tuint16_t n_txq;\n+\tuint16_t n_rxq;\n+\tunsigned int numa_node;\n+\tstruct rte_mempool *mp;\n+\tstruct nfp_pf_dev *pf_dev;\n+\tstruct rte_eth_dev *eth_dev;\n+\tstruct nfp_app_fw_flower *app_fw_flower;\n+\n+\tstatic const struct rte_eth_conf port_conf = {\n+\t\t.rxmode = {\n+\t\t\t.mq_mode  = RTE_ETH_MQ_RX_RSS,\n+\t\t\t.offloads = RTE_ETH_RX_OFFLOAD_CHECKSUM,\n+\t\t},\n+\t};\n+\n+\t/* Set up some pointers here for ease of use */\n+\tpf_dev = hw->pf_dev;\n+\tapp_fw_flower = NFP_PRIV_TO_APP_FW_FLOWER(pf_dev->app_fw_priv);\n+\n+\t/*\n+\t * Perform the \"common\" part of setting up a flower vNIC.\n+\t * Mostly reading configuration from hardware.\n+\t */\n+\tret = nfp_flower_init_vnic_common(hw, \"pf_vnic\");\n+\tif (ret != 0) {\n+\t\tPMD_INIT_LOG(ERR, \"Could not init pf vnic\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\thw->eth_dev = rte_eth_dev_allocate(\"nfp_pf_vnic\");\n+\tif (hw->eth_dev == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"Could not allocate pf vnic\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\t/* Grab the pointer to the newly created rte_eth_dev here */\n+\teth_dev = hw->eth_dev;\n+\n+\tnuma_node = rte_socket_id();\n+\n+\t/* Create a mbuf pool for the PF */\n+\tapp_fw_flower->pf_pktmbuf_pool = nfp_flower_pf_mp_create();\n+\tif (app_fw_flower->pf_pktmbuf_pool == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"Could not create mempool for pf vnic\");\n+\t\tret = -ENOMEM;\n+\t\tgoto port_release;\n+\t}\n+\n+\tmp = app_fw_flower->pf_pktmbuf_pool;\n+\n+\t/* Add Rx/Tx functions */\n+\teth_dev->dev_ops = &nfp_flower_pf_vnic_ops;\n+\n+\t/* PF vNIC gets a random MAC */\n+\teth_dev->data->mac_addrs = rte_zmalloc(\"mac_addr\", RTE_ETHER_ADDR_LEN, 0);\n+\tif (eth_dev->data->mac_addrs == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"Could not allocate mac addr\");\n+\t\tret = -ENOMEM;\n+\t\tgoto mempool_cleanup;\n+\t}\n+\n+\trte_eth_random_addr(eth_dev->data->mac_addrs->addr_bytes);\n+\trte_eth_dev_probing_finish(eth_dev);\n+\n+\t/* Configure the PF device now */\n+\tn_rxq = hw->max_rx_queues;\n+\tn_txq = hw->max_tx_queues;\n+\tmemcpy(&eth_dev->data->dev_conf, &port_conf, sizeof(struct rte_eth_conf));\n+\teth_dev->data->rx_queues = rte_zmalloc(\"ethdev->rx_queues\",\n+\t\tsizeof(eth_dev->data->rx_queues[0]) * n_rxq, RTE_CACHE_LINE_SIZE);\n+\tif (eth_dev->data->rx_queues == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"rte_zmalloc failed for PF vNIC rx queues\");\n+\t\tret = -ENOMEM;\n+\t\tgoto mac_cleanup;\n+\t}\n+\n+\teth_dev->data->tx_queues = rte_zmalloc(\"ethdev->tx_queues\",\n+\t\tsizeof(eth_dev->data->tx_queues[0]) * n_txq, RTE_CACHE_LINE_SIZE);\n+\tif (eth_dev->data->tx_queues == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"rte_zmalloc failed for PF vNIC tx queues\");\n+\t\tret = -ENOMEM;\n+\t\tgoto rx_queue_free;\n+\t}\n+\n+\t/* Fill in some of the eth_dev fields */\n+\teth_dev->device = &pf_dev->pci_dev->device;\n+\teth_dev->data->nb_tx_queues = n_rxq;\n+\teth_dev->data->nb_rx_queues = n_txq;\n+\teth_dev->data->dev_private = hw;\n+\teth_dev->data->dev_configured = 1;\n+\n+\t/* Set up the Rx queues */\n+\tfor (i = 0; i < n_rxq; i++) {\n+\t\tret = nfp_net_rx_queue_setup(eth_dev, i, PF_VNIC_NB_DESC, numa_node,\n+\t\t\t\t&rx_conf, mp);\n+\t\tif (ret != 0) {\n+\t\t\tPMD_INIT_LOG(ERR, \"Configure flower PF vNIC Rx queue %d failed\", i);\n+\t\t\tgoto rx_queue_cleanup;\n+\t\t}\n+\t}\n+\n+\t/* Set up the Tx queues */\n+\tfor (i = 0; i < n_txq; i++) {\n+\t\tret = nfp_net_nfd3_tx_queue_setup(eth_dev, i, PF_VNIC_NB_DESC, numa_node,\n+\t\t\t\t&tx_conf);\n+\t\tif (ret != 0) {\n+\t\t\tPMD_INIT_LOG(ERR, \"Configure flower PF vNIC Tx queue %d failed\", i);\n+\t\t\tgoto tx_queue_cleanup;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+\n+tx_queue_cleanup:\n+\tfor (i = 0; i < n_txq; i++)\n+\t\tnfp_net_tx_queue_release(eth_dev, i);\n+rx_queue_cleanup:\n+\tfor (i = 0; i < n_rxq; i++)\n+\t\tnfp_net_rx_queue_release(eth_dev, i);\n+\trte_free(eth_dev->data->tx_queues);\n+rx_queue_free:\n+\trte_free(eth_dev->data->rx_queues);\n+mac_cleanup:\n+\trte_free(eth_dev->data->mac_addrs);\n+mempool_cleanup:\n+\trte_mempool_free(mp);\n+port_release:\n+\trte_eth_dev_release_port(hw->eth_dev);\n+\n+\treturn ret;\n+}\n+\n+__rte_unused static void\n+nfp_flower_cleanup_pf_vnic(struct nfp_net_hw *hw)\n+{\n+\tuint16_t i;\n+\tstruct nfp_app_fw_flower *app_fw_flower;\n+\n+\tapp_fw_flower = NFP_PRIV_TO_APP_FW_FLOWER(hw->pf_dev->app_fw_priv);\n+\n+\tfor (i = 0; i < hw->max_tx_queues; i++)\n+\t\tnfp_net_tx_queue_release(hw->eth_dev, i);\n+\n+\tfor (i = 0; i < hw->max_tx_queues; i++)\n+\t\tnfp_net_rx_queue_release(hw->eth_dev, i);\n+\n+\trte_free(hw->eth_dev->data->tx_queues);\n+\trte_free(hw->eth_dev->data->rx_queues);\n+\trte_free(hw->eth_dev->data->mac_addrs);\n+\trte_mempool_free(app_fw_flower->pf_pktmbuf_pool);\n+\trte_eth_dev_release_port(hw->eth_dev);\n+}\n+\n int\n nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev)\n {\n+\tint ret;\n \tunsigned int numa_node;\n+\tstruct nfp_net_hw *pf_hw;\n \tstruct nfp_app_fw_flower *app_fw_flower;\n \n \tnuma_node = rte_socket_id();\n@@ -34,12 +334,75 @@\n \n \tpf_dev->app_fw_priv = app_fw_flower;\n \n+\t/* Allocate memory for the PF AND ctrl vNIC here (hence the * 2) */\n+\tpf_hw = rte_zmalloc_socket(\"nfp_pf_vnic\", 2 * sizeof(struct nfp_net_adapter),\n+\t\t\tRTE_CACHE_LINE_SIZE, numa_node);\n+\tif (pf_hw == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"Could not malloc nfp pf vnic\");\n+\t\tret = -ENOMEM;\n+\t\tgoto app_cleanup;\n+\t}\n+\n+\t/* Grab the number of physical ports present on hardware */\n+\tapp_fw_flower->nfp_eth_table = nfp_eth_read_ports(pf_dev->cpp);\n+\tif (app_fw_flower->nfp_eth_table == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"error reading nfp ethernet table\");\n+\t\tret = -EIO;\n+\t\tgoto vnic_cleanup;\n+\t}\n+\n+\t/* Map the PF ctrl bar */\n+\tpf_dev->ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, \"_pf0_net_bar0\",\n+\t\t\t32768, &pf_dev->ctrl_area);\n+\tif (pf_dev->ctrl_bar == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"Cloud not map the PF vNIC ctrl bar\");\n+\t\tret = -ENODEV;\n+\t\tgoto eth_tbl_cleanup;\n+\t}\n+\n+\t/* Fill in the PF vNIC and populate app struct */\n+\tapp_fw_flower->pf_hw = pf_hw;\n+\tpf_hw->ctrl_bar = pf_dev->ctrl_bar;\n+\tpf_hw->pf_dev = pf_dev;\n+\tpf_hw->cpp = pf_dev->cpp;\n+\n+\tret = nfp_flower_init_pf_vnic(app_fw_flower->pf_hw);\n+\tif (ret != 0) {\n+\t\tPMD_INIT_LOG(ERR, \"Could not initialize flower PF vNIC\");\n+\t\tgoto pf_cpp_area_cleanup;\n+\t}\n+\n \treturn 0;\n+\n+pf_cpp_area_cleanup:\n+\tnfp_cpp_area_free(pf_dev->ctrl_area);\n+eth_tbl_cleanup:\n+\tfree(app_fw_flower->nfp_eth_table);\n+vnic_cleanup:\n+\trte_free(pf_hw);\n+app_cleanup:\n+\trte_free(app_fw_flower);\n+\n+\treturn ret;\n }\n \n int\n-nfp_secondary_init_app_fw_flower(__rte_unused struct nfp_cpp *cpp)\n+nfp_secondary_init_app_fw_flower(struct nfp_cpp *cpp)\n {\n-\tPMD_INIT_LOG(ERR, \"Flower firmware not supported\");\n-\treturn -ENOTSUP;\n+\tstruct rte_eth_dev *eth_dev;\n+\tconst char *port_name = \"pf_vnic_eth_dev\";\n+\n+\tPMD_INIT_LOG(DEBUG, \"Secondary attaching to port %s\", port_name);\n+\n+\teth_dev = rte_eth_dev_attach_secondary(port_name);\n+\tif (eth_dev == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"Secondary process attach to port %s failed\", port_name);\n+\t\treturn -ENODEV;\n+\t}\n+\n+\teth_dev->process_private = cpp;\n+\teth_dev->dev_ops = &nfp_flower_pf_vnic_ops;\n+\trte_eth_dev_probing_finish(eth_dev);\n+\n+\treturn 0;\n }\ndiff --git a/drivers/net/nfp/flower/nfp_flower.h b/drivers/net/nfp/flower/nfp_flower.h\nindex 8b9ef95..981d88d 100644\n--- a/drivers/net/nfp/flower/nfp_flower.h\n+++ b/drivers/net/nfp/flower/nfp_flower.h\n@@ -8,6 +8,14 @@\n \n /* The flower application's private structure */\n struct nfp_app_fw_flower {\n+\t/* Pointer to a mempool for the PF vNIC */\n+\tstruct rte_mempool *pf_pktmbuf_pool;\n+\n+\t/* Pointer to the PF vNIC */\n+\tstruct nfp_net_hw *pf_hw;\n+\n+\t/* the eth table as reported by firmware */\n+\tstruct nfp_eth_table *nfp_eth_table;\n };\n \n int nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev);\ndiff --git a/drivers/net/nfp/nfp_common.h b/drivers/net/nfp/nfp_common.h\nindex cefe717..aa6fdd4 100644\n--- a/drivers/net/nfp/nfp_common.h\n+++ b/drivers/net/nfp/nfp_common.h\n@@ -446,6 +446,9 @@ int nfp_net_rss_hash_conf_get(struct rte_eth_dev *dev,\n #define NFP_PRIV_TO_APP_FW_NIC(app_fw_priv)\\\n \t((struct nfp_app_fw_nic *)app_fw_priv)\n \n+#define NFP_PRIV_TO_APP_FW_FLOWER(app_fw_priv)\\\n+\t((struct nfp_app_fw_flower *)app_fw_priv)\n+\n #endif /* _NFP_COMMON_H_ */\n /*\n  * Local variables:\n",
    "prefixes": [
        "v9",
        "05/12"
    ]
}