get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 26392,
    "url": "https://patches.dpdk.org/api/patches/26392/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1499179471-19145-13-git-send-email-shreyansh.jain@nxp.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": "<1499179471-19145-13-git-send-email-shreyansh.jain@nxp.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1499179471-19145-13-git-send-email-shreyansh.jain@nxp.com",
    "date": "2017-07-04T14:44:03",
    "name": "[dpdk-dev,v2,12/40] bus/dpaa: add BMAN driver core",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "da19c812913eb14e1abf14892dee719095479aab",
    "submitter": {
        "id": 497,
        "url": "https://patches.dpdk.org/api/people/497/?format=api",
        "name": "Shreyansh Jain",
        "email": "shreyansh.jain@nxp.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1499179471-19145-13-git-send-email-shreyansh.jain@nxp.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/26392/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/26392/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 [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id B190E7D00;\n\tTue,  4 Jul 2017 16:35:57 +0200 (CEST)",
            "from NAM03-DM3-obe.outbound.protection.outlook.com\n\t(mail-dm3nam03on0076.outbound.protection.outlook.com [104.47.41.76])\n\tby dpdk.org (Postfix) with ESMTP id 5B1737CF0\n\tfor <dev@dpdk.org>; Tue,  4 Jul 2017 16:35:55 +0200 (CEST)",
            "from BN3PR03CA0109.namprd03.prod.outlook.com (10.174.66.27) by\n\tBN1PR0301MB0595.namprd03.prod.outlook.com (10.160.170.22) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id\n\t15.1.1220.11; Tue, 4 Jul 2017 14:35:53 +0000",
            "from BL2FFO11OLC006.protection.gbl (2a01:111:f400:7c09::134) by\n\tBN3PR03CA0109.outlook.office365.com (2603:10b6:400:4::27) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id\n\t15.1.1220.11 via Frontend Transport; Tue, 4 Jul 2017 14:35:53 +0000",
            "from az84smr01.freescale.net (192.88.158.2) by\n\tBL2FFO11OLC006.mail.protection.outlook.com (10.173.160.95) with\n\tMicrosoft\n\tSMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id\n\t15.1.1199.9 via Frontend Transport; Tue, 4 Jul 2017 14:35:52 +0000",
            "from Tophie.ap.freescale.net ([10.232.14.39])\n\tby az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id\n\tv64EZM6u016426; Tue, 4 Jul 2017 07:35:50 -0700"
        ],
        "Authentication-Results": "spf=fail (sender IP is 192.88.158.2)\n\tsmtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed)\n\theader.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com;",
        "Received-SPF": "Fail (protection.outlook.com: domain of nxp.com does not\n\tdesignate 192.88.158.2 as permitted sender)\n\treceiver=protection.outlook.com; \n\tclient-ip=192.88.158.2; helo=az84smr01.freescale.net;",
        "From": "Shreyansh Jain <shreyansh.jain@nxp.com>",
        "To": "<dev@dpdk.org>",
        "CC": "<ferruh.yigit@intel.com>, <hemant.agrawal@nxp.com>",
        "Date": "Tue, 4 Jul 2017 20:14:03 +0530",
        "Message-ID": "<1499179471-19145-13-git-send-email-shreyansh.jain@nxp.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1499179471-19145-1-git-send-email-shreyansh.jain@nxp.com>",
        "References": "<1497591668-3320-1-git-send-email-shreyansh.jain@nxp.com>\n\t<1499179471-19145-1-git-send-email-shreyansh.jain@nxp.com>",
        "X-EOPAttributedMessage": "0",
        "X-Matching-Connectors": "131436525528957798;\n\t(91ab9b29-cfa4-454e-5278-08d120cd25b8); ()",
        "X-Forefront-Antispam-Report": "CIP:192.88.158.2; IPV:NLI; CTRY:US; EFV:NLI;\n\tSFV:NSPM;\n\tSFS:(10009020)(6009001)(336005)(39400400002)(39410400002)(39860400002)(39840400002)(39380400002)(39850400002)(39450400003)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(9170700003)(50986999)(6666003)(53936002)(8656002)(105606002)(6916009)(76176999)(2950100002)(53946003)(8936002)(106466001)(38730400002)(33646002)(110136004)(2351001)(54906002)(81166006)(8676002)(48376002)(47776003)(2906002)(498600001)(50466002)(104016004)(50226002)(189998001)(305945005)(36756003)(356003)(626005)(86362001)(85426001)(5003940100001)(68736007)(69596002)(4326008)(5660300001)(575784001)(77096006)(2004002);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:BN1PR0301MB0595;\n\tH:az84smr01.freescale.net; \n\tFPR:; SPF:Fail; MLV:ovrnspm; A:1; MX:1; PTR:InfoDomainNonexistent;\n\tLANG:en; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "=?us-ascii?Q?1; BL2FFO11OLC006;\n\t1:ZA5mwEJ8KA0lSut/xNw8AXCpG8g1n2LnE7OJtqCtG?=\n\tAQ8cnHI+ZpktGYxvdQI7TnkjaGbz3yLyd2rocUjAVq6iapsuVq1KdLciLygG02IcsMh52g8drZ34aVPq3JvnwHFjK5GqM5PWJueTMNhvAei290th3oBxFDNqENQLpNtb7N26OluT1nbbVlVscA7AsFFBSeTFxZKLB7zj+Sm908dHnTVOf80MstCPe+ES5hhGtLEFFVZxZ2P6/hn3ZQCm5idMT04gyjbyM8RW+xD13MN7GxVs1qno4LVIl6V7yOgkXEnX6rIOrZ2NFoFFTwNXjTLgoGHujgNHPfa6elcQvdu3p+GBvTyGI4P5adM6xIRzAVwj8VExwhJaQ/BcT25mJZ3/Je2I5TMQrDAsdNRK+JMKCmsra5IgdP/VPYkabxF5FhFx6B/80iQMRmpsDJciNlfjmxE4KHFP0/IiTVdnGB1WaeQ2anpq1izEvHicJzf6Q/AEsjP15VHf5j44g6JFJ9AEa1ZGetf+MVupmUXSuAodKENe9E3paexJ+Y6uizLbhFPYR+kivRDEnu4QQYFI34WMT1cgnbQfEAJj5AW8he2f3NeCn8sflh30uWUh71ZmTpwx6YyMuJ11bdhhIyxHfzzM7WiEyN9G5RLerbZxuAPWK87263e6tC0XTAJedHestv2Ri8LcfhALR/cueOEGuMp2+TkR7Y6MksSI8MuGUKPiQ5K6VllgKzFp07PfJc+UYqrEhrfU4TEVp5m4+gXRcG0lIU3Q3fV3+FGvJCI+qvhNI22Ay2A7FfRyb74S6Qu3BoQoHvWVvIG+FO7e2DezNEaB5sxJuk3M9bJX6Ud2YER79iP3WS1ZipBubMBJtW2uHbV8M1EmYvvOW1xv8ft3fOLZzR81MHg651M5Vq4nb8Wl1ai9hjbPxA5LFBtYJZ77/uyP0Ql7FQ9jBHimaP7bxkOX7eVLe4MoAFQG3PaHdtmFtNToGaZiTn3TkHQHU8pZZvQD/baYxjPzkW2crUbaOSDOYgZ0iBiPzLGWonDjLFqrrL5zQkHG6oEsoW3o09qfz4YSCEu8vK20ujKDHSlNElnOigrKJV+gI+tAwA2G3EC5g==",
            "1; BN1PR0301MB0595;\n\t3:b9iWvpVl5pP8n+HwLJTEihdN9Qy5pGCP7FXsrdxnVkqnTNMo1Z5pckAz58UtfX4BS/3iU01ckuCWwrU4ifuEmCbgy/BZvCRMSggndB14G13GcuWglbuN21p7oM50tUYNxeU9RqxvrKLofBW6x96aopj/JcXI9rMq5vAeeqzblLLwocEzAxni0tuII8/SNjc1QUdvFRRdvd01rxaWN+aq09U1Gb6KRhf+q/rtV7iDsbZsqUV5iq4HqAeJwgMV8JKr5PfyybsDormxjkxLEkLplqmiq5KOY7U9431MWIsENhQ7OUl+TJrlX+m6s6OH+xoQAcloiF+8yOn0eSQu3lskiwA1OYnWx3tfKPMJy9LO65QAhYGiKS4y13/mt0UPDyXBg+lUCTlCQnWn0mvmyEZ1dSWWelFEQ8XKq5GVJufFPcuAe5zvlKcbi3jFYwNYqxfoMSvywxXuLqjwTmpzN4/vOjoFye1FbUfVkbKm6CVP0zx2cUdpkCIjThqll7VCt99wP3hPtFHDQJ5u7GI7HGHApLfiqOeD8LtCBiAijTEXjQhYDAOPAqj/PGuGZEclZRvi6s45yWg0StlPAiYaQ/NduPK37xpeShcnUmVdCFXfgpH/lBbw/6sbMpHLOLDFOqShyCl1kbmFaSigDSX3YuaJv7ZhrNITac3tlLgd5dwAyqEXznWP5E4R5xyXc4fc1XAPl2+AEBYuLg9IrN/GtOfxRvtX358yzb6ESVeuKaePnDW9VJYd3rh+QwqTXhL2xnVBl+zE3aPThFjdNGdWX2w/qxlG6n6AkEo8875KBiPuo7k8jf8v6pT1fJSmo5+lGp0QvYmLhCI9NBFNZ0oWfwCOHKofUxpuet2JJFJmsQ2gSehfWmlXFSn23HypC04yjMN8",
            "1; BN1PR0301MB0595;\n\t25:cC8w1EC4u/8Xr+UvVVLsX/c8vdEawaSPa9deBcuEkCixiv94XArOAANAV5MLLYOIqFFx7uk9qNDhBXKh75AJTs2WRAKO6QyVlbyBdpzMBziEcKgi1fQw5j7iXVaGkE4XUqFVAiprNBdk2MEELOdT0UpV5NtUjZk8ctYv472sebliYnXePCI2767erTEKAEPxRsCHRtV7o8XLbE9uqhReX5fHjIdJ4aMAqIKVlg4tcnwFgRL/m8XWi4XzLHy/C8GOk98YONXiK87TYG+m0TbMnLqx0u1GyZwmIfhZhRqihVWQJYVutwPfX+EyN0NyGQgFCPPsUAYW2LZnLhe+dXQq5MlG4CcYLo8FXZVllrMw6E5LvRWRO2DH2VJV3F70PqcuvEvNPzHua8wkFTrh6Q0SthlOUwgpO8HyEPajb+/lKkoLkLi+8sRd80LoX6BH+3R344jh59pDZZRtQgj6ID9mWxrI7fMKMORfSh0M0eqYBDgEDdOhVdClBBlO8hScnwFZCaN49Qy6EiJwxTdqfWB9ZfIkKJ7NGGl/Fkusbqpai0JjBeOYxSTEVEOdc9nSi9La28ALw9XsaaPBPC8Mp84ZyUYjoJdLL0qhkX1XQb59uCAzk5P/11DlkZ+inaM29QuY0ZYsypKBaPyIx+NJpKao9NYphnwqxHQ1TtCwMCZ6zsJPolsV84haBM6nvI3IQnHyIheKyZqQHLn+N+iGBmk2Ty7Wf9SY9xsFbz3D6Wird6/Mi6s2Qgpei1RC+dVtYOvHG7vkctaoBIxgStHNas/xRJp6a6wCpDWcP4CDAb1KXsbv8O0bRu81kuipx7Ecp+XHKI4YGboo/bABMEQTqeNQO8342BPVeZwj3qvkSZ+kjP/iyzx7o2WG+wLWugDnm/gRC3J4KY6A6GVXHXBKbMPuiizVW6bhVcpsJP1So6xrmS0=",
            "1; BN1PR0301MB0595;\n\t31:zf7qTLg7++Ka7zVAL80H7jrntz0tWqsaqmgyg7JbudUuPoU7c3ipVuXvt2vbzRJih86vHhWSRyes5AI7AX8ehFa2wGqLwYCsmTyC0SKsa7PhUCvRF3afsZnGewilGM1YbhAhH/FU4eICJptj+TUGzl8BxNSihv3U6cV+DEdrp5e860Fa7y8XCQAIfsZd5Xrs3RSv7FkboiHfInabJAeahdFoD8tMKSoMea308POjFr3ADeqQWVgKfg6Zq6/XJ1rfM+mMwZN/bn7b391p30fxFnTLVbiKceBIBrr5DoH3+h7Ht2wu0Nlv7Y2DwQrI3Y/gl+rNCO+ufKDjED/aTBd+FlXTqCNSMDwqMRNXzmxjKrVvYF5IaQvyixzYQAXdC/w6w6gYsK+p6dZgTk3wg6YR7GrM6EAbs7+pUn4PVWNWwskYcIWOwYBl2rwJ1fkiyFs05D7oIYPckepyw5MkN/l0+4V5VP8BhGGooG0ciJqVNDc5g/g1pHbl6haHcmcaph2K3LTegc7VE1VB55RfeY6YN/RX2dHqdO+o4XNaBwyle/ak/pqls2Lq0/9MMEdsY4So5ABKzZmUaPOg6GuZSnojUMjWAnDZrToocJyq/4DA2vaZKKLWdUTekDzZpopLbzP1Z8rQOrvhlVZwKEUmpG4zc0K4Cx9HeEX4bgx/W8RdrDWdQqimusum+8n0jX2k4p1pjDkQq6284uTCGVx/fUtLWA==",
            "=?us-ascii?Q?1; BN1PR0301MB0595;\n\t4:W8bgyoML3ER4Jp786BN0UcdWzu2RQhTVctjUgueN?=\n\tEM/E9t9dr6e/nsqH427rgxGKdxbFv7kCHEY4C+4O1UlYuuGsj2zYGjUXQs5olk0rD0bF7XJzHCvx0Brjg5vJIw37tkMFFpppdZbSw7CWHdTHBRifwAFzQSdMkUSGIAUzBe1c6+Ah2WmojBnPgNg2UuypvU43i+ixIp37alMAfh7DJJUrJLcQ5nqzf1gby/8fMqbAGh2bAlxGlEiFY5NiYOke+LJPyVgTH7oWfGh2LJjhd4P5xgG9AWrCLe7tgavWfLj+Nc03u8tRS3ijk3A2VBuMeFqT8AjW6JajrAdpZToR87bvoY95Y05AD+tG/e+krTZ94puX6zcgDSi7bCNk5Bne4xYRzrY7bFJG9Hm5uRfZa3zcBcNNDVGAmDariTF4UB8bjTrm7F976kM4GGOIwG3N0/WOrm5t2nTsqEHrhysCSCx3Mn98tPsGZ0lTXxokLhV6cDm6wkUvcxs1OCAI+pAiBdebbQ49f8qPBmaEO2MBIgovk9KxpuiiDuVrygU5qBn7OBv5zsMcSFxCmpI8ZFuAp9UZ8KU4W+pD5ThcdSo5DNMnQh/ztSI+nR7MtD6qLb6p0sXpPHlgtk6LYI0tKkvA0KSCPANC9REPUSimVFP/7FMCiO+e3Zz+69Od/jClcthmyUsMS2Kv7Nt0zrrykKr5ogUHKR4EhlAQKKPIPVXZEZjQUcHiJhpTdZajHNnYYCdx94OXzLW/J9mPo6OeQe3gJBchvS6n8Zh2f/T60gVpGSC/zddg1Iey8XLK9Rc18ez1JLfb8nxARa4CFLI2AvkFEH/O7GclP8snToWsnjY47thUqVes4phNtTs9C0hCm7AIuezzaLQ+ZHOgrliMJm5yUg7e3Bv5GQuttfMmCytHUmVff6si8ireASmyPUcWflPQuYmeKsTwn3vp9b0hs7/aGkoAVHEQjmSWiB0KcWFCoSvNMypOMiBOT4ENLOTJP3JhiANrCRR5/xHsc00F1T5GulTfG7fHiHaids3wQkxP7gKmIdRbMvKyA1nuv3C47CgzR6G9R5XeX+F96imWePQ5VDr476xQjff7bz/zw3MD+I+G8CdBmeV73a2cip1tco0Exau+Ba81z6BvYHxqDkEuct+4y0n+uMbBMt6pQHV3SHI/GZjw8bHRtoeQ9qpdr+qzMvDPkN9xVBqxdZlp2zEVwf+jOn4fqcKCzkE35KEGb3j2SVF2Us/M2Au3A2S4ZJaCNsk3PInfMvKMZWT9bmrXdyyqdtBQwJp+BXHPJO0Rxr5W27lcMF+Rzzd9NzpF5P9mrVGzXrxXjHcgxSZO/cUfoTeKwDKOWpfEQNGWpiU3cd4FIGGifNJDj7XT3zd+IAudu5/2tJJEz7tsniU6sL7EhHOoIsvKFZ1A0kjYxAx0aqammEJRM/AAe2U493r1qAYsgVXSIBIFHI92Stq+WB1sDl+Xis0o8Ys5C45Iyl0L2SQiSL867dV5gMXf+mx/Uts2Vzx6WxqTGDQ5SXjvXbAg0XC27C5W/VbSsBXZqPyZGA==",
            "=?us-ascii?Q?1; BN1PR0301MB0595;\n\t23:4LR1fKRmDP8xUQrgmXYwFygY4ZDiu1IOA3oJJ23?=\n\tUk1cauC6VRjuwKfEFytLCrc2NYSjqJ8dHBw6khvUXTTB3dlhWucJkqRPEyDe0jvktAJJkpHT10E5OuD3JzHMJsy2U8ld/fK77dnB6L0axlCkoem+dZyqQ3KTkefq5SmGMCfNUCYn7sTmTNTT8LqLz3ECZ32DHhd1AGZm9La5GeNspDKVphxh9oDpEwTvp0nJUtVq4uQKVEUc6ICULWq9CdlBqQs0LN6PMbHPNfUAFM7SQdG4gbbE2Gka07w0SkJxZE0lz1E8sE9Qk0Gcfhy5qq4lP6E24by2wvCNzP0OsxA+Dlid6kAu+x0SsEAir2Fxq+mHSXbDWGwtgNWvhsqHHMrA1nqmPsGqEUkWsi7PysvtJy1FogVisnRUPeAdVWl6jdiqc5EC4MgsZwjxE6YN8rftKxs2i1/Wead54smzjvGGO64nYS//DvtBvTw7Di1pmW60qH8TxHM651qUjfoSL/SSHnXtCngzzO9Cyqsws4NGi2A5NtEbHsT6oDwkn+F0RsYgYMeATgQWtt0Y0GH+nyeHtb5VaoEwyrMmO5sl25YfoU4t5wLTUMIOU2W5mejUEpDfeQouVsQeNJRu6xOtaV/keoXKmgYyk0r5XRk6PsaOzwgXnkPoqQ7LkPwFVwBf7xuzA5Uu8nHoGLyB4lUvquRQT+qoZSs/QMyhIbLz0LnjfuAs4R3SLS0Fz54HBFmgfPTtDk4Xh9mQbROxiRHUy6QIjdqD1zOv+I2V9uyc1aMFxDxoWaoyHgZ0qRRUT9vtc+O//xujojF6vHg3hCtqnDeF2EHjxt3GgNW9vIL3yOS7RKr81Oq0uXp/8O+AhuNtCNWK2u7h/4efzQtRmdKCbe4JWfUZorjWYQFVPLcud2NxIxmlP34Y3fct9jDrOiX+Asu8V8871m6WI1u3scnZxrsFQ49/kdVLQmpfN8EFn6DOQ64SlBCfrRlJTMKbzGIG0c3ohnEYtZKteizA+MBkv3XzQDLuXQn9XW93qS+lcsO5Szfe//HezTjYqUvDR52ClktSeYHyO0L6IFFmBdO3equE0IISx+7OYFv3tRQsbV3qyo3A0D9krqcWDTftRt9EEgCe/7GWXM1jSQSWDOCJJxakz9CAX7R6D7n35l1rqGYIvjcwQebXYD6ZBPGELp0Prj86+ydk7QHw4z8/jx2mYRQOtEa1wL50JTm0/KNnHWeBALOjy+yy0bsHUe87Hhg+yID5I5jWrwA4X/6WtdDf1fRoLHTh6fN0DqF/qVdnQpda54bCdHrk2ZClYJPQx6PtdARaP4+PV18JreRDv3MjncZfotCFQtvWHVUC5xD86EDqf4g==",
            "=?us-ascii?Q?1; BN1PR0301MB0595;\n\t6:BJhBhf/3AdyC3KyBLKXyykF5imZhCwAvFp7Vd6fQ?=\n\tjVhCRPDkeo3CMvDXkIE4CtuOw/s1wjW9g1+JNdqV9rKnGFmJHLaExKHr695ofNmjbL33bwBFvcNACUhGrafvmJJ+CCHDt0ISieVll58qD9i2UZTY7re9cXyZCTryqiw+sNxjTsLr54zVNFKkUKbQp9TI2WpRV/jlwd28omfg7fOOXUTx+pWwK5wwNm+NCay9e5YW+cWgWWLLdszBDx424UuOfLLwQ4jH0SuYykESM5F2m+1RWTzzof5tMAKP5SaeKcZH7nZvjOBznDlLxvxrhvlPKzoePaZxte1zyfxxyH5YRVZjkUoGXxctGnmnolqk9/1lvlShJagyABeRyyVTl2I7DhF/d+wdFJzA1vswhYVR7lsIdHREQPflUfDTt+gAZ/AkgJcKaGVGgpFRBnhWfL19O1pO2K+kYt+AnPS/TBCfTd0UW1NYGKcFN0pFbRQ8IlrGXx8WNlokPovZ9ob3TDGuiVz526ufJ+kpKJJ+fcX/+BGt3pw8kNujacUVQJMiNL3jbTpT1n2alRknVl/MCB2FTtUh8ZxCxwbYgr4Rh3EqO3wVESr3UwtkJcyNbxwVNTCphCtqFyl5EwTNrKW1PUeUzlHwjvIqOiUkDL4XmoI2XsxEsmWM0ZgS9RWMlHFqUkajonFe+pVjJIt3to8ZA4U+Jr4CeoAjmR0NoMxOSPn48zZypXiSZ2ODrTRlZMO8KXhNDqVrkyDD+MhGD8gy6swMdB/mgSWHMswqo5kkdlKih1BGcAx8cSrt6mtpmox0x72cLFFhBlEVgF5IhwmK0AbnaisJxKk+71p1EdtKPO09emnMZmLxT7cx4AoPZZ6CpFnlkPVgDJf55OOMYCxcAKzgLuVwaIMwE+V1mAXXTr/uILMQDxtkWgulpLTQSQXAO2n0xfRD1GrUHP6TK5jaK2dvhdTHFEdFcj9mIEVXypqPAQ==",
            "1; BN1PR0301MB0595;\n\t5:oDgopbwLASTQ+vbE5Dadv1C8Lsb/lC4tP8qR5N5aQS7w000ugjsCXO9a6L6Ri6GTy5xlmWZM/bN3u3RSZG+0/QSQDNG0FaAcjNwHsERRH5UbawMfp3wlCjCfJ/7z2f7b5ImD7jD7wrVu+qehjP60ZrC2+gCKm0ehY1hqGhU5jpVwIcmuUk6TRyZZnt0DQn4P2OlvjbQ8LSHuun585qeF8ao8ePDSskzOPsP7RoudDjq2bdRAz2KMHuZe2RlBnh1hOwtHqDmtNIda7zng2a5D8IzovxtWZ5h5dCnqGslkBTd8EjkMVzah+54Pt6H1afjT7RYSzEPYz+bm+Yl6SjUqDdXBwFXzZ5ao6eA0nbUlM2YMh7YscFrGzJxpYvmhoqhYlX44OrtdhY9oefrteG9t1cBF3Y3wb2kp9jw2pGVqqHuoGjvyXAl/GQ8OEgWrAP3tCK7GNGjgO+VUEwKoMVqck0+s/SYDAytaRibI6LvoFb/ikagbGO+LJzMdu+QF4ncgUW6neT3QRuQ9ZYl67j7QVw==;\n\t24:iezDxuxxQuJtM+rv0BGx1785d3KvuZOHaOdQgyqcapmWIKo92fSdWFuqwPsIZgrGAhfcR1+9zBtnbtxnoYeGaVHHvct6Ens3eU53hRupzwk=",
            "1; BN1PR0301MB0595;\n\t7:4OeXr/io5XZWF//89gubgO9cgKvyxYJQXo6aEArdewBujIzMErmc2w/keatlu1rNv8JmT92LrPMjR/lo+vkBxRcgGVi91Z9OONEaridSm6SL2EkZ1ZMYw2yS55LbUlqE1qIlfSfjJSSxMbTID04GRovTsPbiAIfsfJuRZ52SfXAPQVAtT/2gXloCJuQToNarBfPBdgDieJV9BFqu675fU70N04WSQWtHZBWHDkhzhCPr9u94HNHmeL6kNxSmxOHDuzRrNmGgN91E6shxhwuGVfmUq5yPoYHh/LMjj8OtB/yuHCgB8501Bs2v6TyJKLbStRImUDI661hbOmTa0hdAfqkhXu05DZIwZET/q4UGQ21BCgGf25U43nSFsuKQ7g9oPrqT9+hD/lJmvPV0JNEt+sVPqwCLZXTib8btYIH4FcMbsrXvJgw0tmZzLwwLHAXQoSATgdCBAm27+DxAkX/xi4KukfcGTBPDWM64rFqA11yQWZT37usHTsjzm1lO4pnf1pCtPL+D+icqeLfXiBSy1IPLrsqQZKMqOMFoJi1vVuzKVJfi3FzwCYeuPkn3t4i0x6goXDpSyaQofVhA/SMyl/gLN/wZSXy527m17AdF/5BDtxY3tsTS7XlaY73lBp1Yv3s9QepK22l4tEuYHyR7CdgIX8JM7WXdbKMPoamLcCjdtZ14djgGeI34bv0I9lYNKoP0yPKcbFlOoEpXyhNcXQAYrqz4nWXofNhyAdmNrRzospTWt1htgcoUsfD9a8HpyskQQMcyg3TwfdGxmqebu+x0hqXrcns5dZfYZuk33w4="
        ],
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "8f108ab0-5a78-459e-387e-08d4c2e9f90e",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0;\n\tRULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(300000503095)(300135400095)(2017052603031)(201703131430075)(201703131517081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);\n\tSRVR:BN1PR0301MB0595; ",
        "X-MS-TrafficTypeDiagnostic": "BN1PR0301MB0595:",
        "X-Microsoft-Antispam-PRVS": "<BN1PR0301MB0595287751D0317358495C1690D70@BN1PR0301MB0595.namprd03.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:(133145235818549)(236129657087228)(185117386973197)(227817650892897)(48057245064654)(148574349560750)(275809806118684)(158140799945019)(247924648384137);",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6095135)(601004)(2401047)(13018025)(8121501046)(5005006)(13016025)(93006095)(93001095)(100000703101)(100105400095)(10201501046)(3002001)(6055026)(6096035)(20161123559100)(20161123563025)(201703131430075)(201703131433075)(201703131448075)(201703161259150)(201703151042153)(20161123556025)(20161123561025)(20161123565025)(100000704101)(100105200095)(100000705101)(100105500095);\n\tSRVR:BN1PR0301MB0595; BCL:0; PCL:0;\n\tRULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095);\n\tSRVR:BN1PR0301MB0595; ",
        "X-Forefront-PRVS": "0358535363",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "04 Jul 2017 14:35:52.5213\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Id": "5afe0b00-7697-4969-b663-5eab37d5f47e",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;\n\tIp=[192.88.158.2]; \n\tHelo=[az84smr01.freescale.net]",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "BN1PR0301MB0595",
        "Subject": "[dpdk-dev] [PATCH v2 12/40] bus/dpaa: add BMAN driver core",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/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 Buffer Manager (BMan) is a hardware buffer pool management block that\nallows software and accelerators on the datapath to acquire and release\nbuffers in order to build frames.\n\nThis patch adds the core routines.\n\nSigned-off-by: Geoff Thorpe <geoff.thorpe@nxp.com>\nSigned-off-by: Roy Pledge <roy.pledge@nxp.com>\nSigned-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>\nSigned-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>\n---\n drivers/bus/dpaa/Makefile                 |   1 +\n drivers/bus/dpaa/base/qbman/bman_driver.c | 311 +++++++++++++++++++++++++\n drivers/bus/dpaa/base/qbman/bman_priv.h   | 125 ++++++++++\n drivers/bus/dpaa/include/fsl_bman.h       | 375 ++++++++++++++++++++++++++++++\n drivers/bus/dpaa/include/fsl_usd.h        |   5 +\n 5 files changed, 817 insertions(+)\n create mode 100644 drivers/bus/dpaa/base/qbman/bman_driver.c\n create mode 100644 drivers/bus/dpaa/base/qbman/bman_priv.h\n create mode 100644 drivers/bus/dpaa/include/fsl_bman.h",
    "diff": "diff --git a/drivers/bus/dpaa/Makefile b/drivers/bus/dpaa/Makefile\nindex ad68828..24dfa13 100644\n--- a/drivers/bus/dpaa/Makefile\n+++ b/drivers/bus/dpaa/Makefile\n@@ -71,6 +71,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_DPAA_BUS) += \\\n \tbase/fman/of.c \\\n \tbase/fman/netcfg_layer.c \\\n \tbase/qbman/process.c \\\n+\tbase/qbman/bman_driver.c \\\n \tbase/qbman/qman.c \\\n \tbase/qbman/qman_driver.c \\\n \tbase/qbman/dpaa_alloc.c \\\ndiff --git a/drivers/bus/dpaa/base/qbman/bman_driver.c b/drivers/bus/dpaa/base/qbman/bman_driver.c\nnew file mode 100644\nindex 0000000..fb3c50e\n--- /dev/null\n+++ b/drivers/bus/dpaa/base/qbman/bman_driver.c\n@@ -0,0 +1,311 @@\n+/*-\n+ * This file is provided under a dual BSD/GPLv2 license. When using or\n+ * redistributing this file, you may do so under either license.\n+ *\n+ *   BSD LICENSE\n+ *\n+ * Copyright 2008-2016 Freescale Semiconductor Inc.\n+ * Copyright 2017 NXP.\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are met:\n+ * * Redistributions of source code must retain the above copyright\n+ * notice, this list of conditions and the following disclaimer.\n+ * * Redistributions in binary form must reproduce the above copyright\n+ * notice, this list of conditions and the following disclaimer in the\n+ * documentation and/or other materials provided with the distribution.\n+ * * Neither the name of the above-listed copyright holders nor the\n+ * names of any contributors may be used to endorse or promote products\n+ * derived from this software without specific prior written permission.\n+ *\n+ *   GPL LICENSE SUMMARY\n+ *\n+ * ALTERNATIVELY, this software may be distributed under the terms of the\n+ * GNU General Public License (\"GPL\") as published by the Free Software\n+ * Foundation, either version 2 of that License or (at your option) any\n+ * later version.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE\n+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n+ * POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+#include <rte_branch_prediction.h>\n+\n+#include <fsl_usd.h>\n+#include <process.h>\n+#include \"bman_priv.h\"\n+#include <sys/ioctl.h>\n+\n+/*\n+ * Global variables of the max portal/pool number this bman version supported\n+ */\n+u16 bman_ip_rev;\n+u16 bman_pool_max;\n+void *bman_ccsr_map;\n+\n+/*****************/\n+/* Portal driver */\n+/*****************/\n+\n+static __thread int fd = -1;\n+static __thread struct bm_portal_config pcfg;\n+static __thread struct dpaa_ioctl_portal_map map = {\n+\t.type = dpaa_portal_bman\n+};\n+\n+static int fsl_bman_portal_init(uint32_t idx, int is_shared)\n+{\n+\tcpu_set_t cpuset;\n+\tint loop, ret;\n+\tstruct dpaa_ioctl_irq_map irq_map;\n+\n+\t/* Verify the thread's cpu-affinity */\n+\tret = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t),\n+\t\t\t\t     &cpuset);\n+\tif (ret) {\n+\t\terror(0, ret, \"pthread_getaffinity_np()\");\n+\t\treturn ret;\n+\t}\n+\tpcfg.cpu = -1;\n+\tfor (loop = 0; loop < CPU_SETSIZE; loop++)\n+\t\tif (CPU_ISSET(loop, &cpuset)) {\n+\t\t\tif (pcfg.cpu != -1) {\n+\t\t\t\tpr_err(\"Thread is not affine to 1 cpu\");\n+\t\t\t\treturn -EINVAL;\n+\t\t\t}\n+\t\t\tpcfg.cpu = loop;\n+\t\t}\n+\tif (pcfg.cpu == -1) {\n+\t\tpr_err(\"Bug in getaffinity handling!\");\n+\t\treturn -EINVAL;\n+\t}\n+\t/* Allocate and map a bman portal */\n+\tmap.index = idx;\n+\tret = process_portal_map(&map);\n+\tif (ret) {\n+\t\terror(0, ret, \"process_portal_map()\");\n+\t\treturn ret;\n+\t}\n+\t/* Make the portal's cache-[enabled|inhibited] regions */\n+\tpcfg.addr_virt[DPAA_PORTAL_CE] = map.addr.cena;\n+\tpcfg.addr_virt[DPAA_PORTAL_CI] = map.addr.cinh;\n+\tpcfg.is_shared = is_shared;\n+\tpcfg.index = map.index;\n+\tbman_depletion_fill(&pcfg.mask);\n+\n+\tfd = open(BMAN_PORTAL_IRQ_PATH, O_RDONLY);\n+\tif (fd == -1) {\n+\t\tpr_err(\"BMan irq init failed\");\n+\t\tprocess_portal_unmap(&map.addr);\n+\t\treturn -EBUSY;\n+\t}\n+\t/* Use the IRQ FD as a unique IRQ number */\n+\tpcfg.irq = fd;\n+\n+\t/* Set the IRQ number */\n+\tirq_map.type = dpaa_portal_bman;\n+\tirq_map.portal_cinh = map.addr.cinh;\n+\tprocess_portal_irq_map(fd, &irq_map);\n+\treturn 0;\n+}\n+\n+static int fsl_bman_portal_finish(void)\n+{\n+\tint ret;\n+\n+\tprocess_portal_irq_unmap(fd);\n+\n+\tret = process_portal_unmap(&map.addr);\n+\tif (ret)\n+\t\terror(0, ret, \"process_portal_unmap()\");\n+\treturn ret;\n+}\n+\n+int bman_thread_init(void)\n+{\n+\t/* Convert from contiguous/virtual cpu numbering to real cpu when\n+\t * calling into the code that is dependent on the device naming.\n+\t */\n+\treturn fsl_bman_portal_init(QBMAN_ANY_PORTAL_IDX, 0);\n+}\n+\n+int bman_thread_finish(void)\n+{\n+\treturn fsl_bman_portal_finish();\n+}\n+\n+void bman_thread_irq(void)\n+{\n+\tqbman_invoke_irq(pcfg.irq);\n+\t/* Now we need to uninhibit interrupts. This is the only code outside\n+\t * the regular portal driver that manipulates any portal register, so\n+\t * rather than breaking that encapsulation I am simply hard-coding the\n+\t * offset to the inhibit register here.\n+\t */\n+\tout_be32(pcfg.addr_virt[DPAA_PORTAL_CI] + 0xe0c, 0);\n+}\n+\n+int bman_init_ccsr(const struct device_node *node)\n+{\n+\tstatic int ccsr_map_fd;\n+\tuint64_t phys_addr;\n+\tconst uint32_t *bman_addr;\n+\tuint64_t regs_size;\n+\n+\tbman_addr = of_get_address(node, 0, &regs_size, NULL);\n+\tif (!bman_addr) {\n+\t\tpr_err(\"of_get_address cannot return BMan address\");\n+\t\treturn -EINVAL;\n+\t}\n+\tphys_addr = of_translate_address(node, bman_addr);\n+\tif (!phys_addr) {\n+\t\tpr_err(\"of_translate_address failed\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tccsr_map_fd = open(BMAN_CCSR_MAP, O_RDWR);\n+\tif (unlikely(ccsr_map_fd < 0)) {\n+\t\tpr_err(\"Can not open /dev/mem for BMan CCSR map\");\n+\t\treturn ccsr_map_fd;\n+\t}\n+\n+\tbman_ccsr_map = mmap(NULL, regs_size, PROT_READ |\n+\t\t\t     PROT_WRITE, MAP_SHARED, ccsr_map_fd, phys_addr);\n+\tif (bman_ccsr_map == MAP_FAILED) {\n+\t\tpr_err(\"Can not map BMan CCSR base Bman: \"\n+\t\t       \"0x%x Phys: 0x%lx size 0x%lx\",\n+\t\t       *bman_addr, phys_addr, regs_size);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int bman_global_init(void)\n+{\n+\tconst struct device_node *dt_node;\n+\tstatic int done;\n+\n+\tif (done)\n+\t\treturn -EBUSY;\n+\t/* Use the device-tree to determine IP revision until something better\n+\t * is devised.\n+\t */\n+\tdt_node = of_find_compatible_node(NULL, NULL, \"fsl,bman-portal\");\n+\tif (!dt_node) {\n+\t\tpr_err(\"No bman portals available for any CPU\\n\");\n+\t\treturn -ENODEV;\n+\t}\n+\tif (of_device_is_compatible(dt_node, \"fsl,bman-portal-1.0\") ||\n+\t    of_device_is_compatible(dt_node, \"fsl,bman-portal-1.0.0\")) {\n+\t\tbman_ip_rev = BMAN_REV10;\n+\t\tbman_pool_max = 64;\n+\t} else if (of_device_is_compatible(dt_node, \"fsl,bman-portal-2.0\") ||\n+\t\tof_device_is_compatible(dt_node, \"fsl,bman-portal-2.0.8\")) {\n+\t\tbman_ip_rev = BMAN_REV20;\n+\t\tbman_pool_max = 8;\n+\t} else if (of_device_is_compatible(dt_node, \"fsl,bman-portal-2.1.0\") ||\n+\t\tof_device_is_compatible(dt_node, \"fsl,bman-portal-2.1.1\") ||\n+\t\tof_device_is_compatible(dt_node, \"fsl,bman-portal-2.1.2\") ||\n+\t\tof_device_is_compatible(dt_node, \"fsl,bman-portal-2.1.3\")) {\n+\t\tbman_ip_rev = BMAN_REV21;\n+\t\tbman_pool_max = 64;\n+\t} else {\n+\t\tpr_warn(\"unknown BMan version in portal node,default \"\n+\t\t\t\"to rev1.0\");\n+\t\tbman_ip_rev = BMAN_REV10;\n+\t\tbman_pool_max = 64;\n+\t}\n+\n+\tif (!bman_ip_rev) {\n+\t\tpr_err(\"Unknown bman portal version\\n\");\n+\t\treturn -ENODEV;\n+\t}\n+\t{\n+\t\tconst struct device_node *dn = of_find_compatible_node(NULL,\n+\t\t\t\t\t\t\tNULL, \"fsl,bman\");\n+\t\tif (!dn)\n+\t\t\tpr_err(\"No bman device node available\");\n+\n+\t\tif (bman_init_ccsr(dn))\n+\t\t\tpr_err(\"BMan CCSR map failed.\");\n+\t}\n+\n+\tdone = 1;\n+\treturn 0;\n+}\n+\n+#define BMAN_POOL_CONTENT(n) (0x0600 + ((n) * 0x04))\n+u32 bm_pool_free_buffers(u32 bpid)\n+{\n+\treturn in_be32(bman_ccsr_map + BMAN_POOL_CONTENT(bpid));\n+}\n+\n+static u32 __generate_thresh(u32 val, int roundup)\n+{\n+\tu32 e = 0;      /* co-efficient, exponent */\n+\tint oddbit = 0;\n+\n+\twhile (val > 0xff) {\n+\t\toddbit = val & 1;\n+\t\tval >>= 1;\n+\t\te++;\n+\t\tif (roundup && oddbit)\n+\t\t\tval++;\n+\t}\n+\tDPAA_ASSERT(e < 0x10);\n+\treturn (val | (e << 8));\n+}\n+\n+#define POOL_SWDET(n)       (0x0000 + ((n) * 0x04))\n+#define POOL_HWDET(n)       (0x0100 + ((n) * 0x04))\n+#define POOL_SWDXT(n)       (0x0200 + ((n) * 0x04))\n+#define POOL_HWDXT(n)       (0x0300 + ((n) * 0x04))\n+int bm_pool_set(u32 bpid, const u32 *thresholds)\n+{\n+\tif (!bman_ccsr_map)\n+\t\treturn -ENODEV;\n+\tif (bpid >= bman_pool_max)\n+\t\treturn -EINVAL;\n+\tout_be32(bman_ccsr_map + POOL_SWDET(bpid),\n+\t\t __generate_thresh(thresholds[0], 0));\n+\tout_be32(bman_ccsr_map + POOL_SWDXT(bpid),\n+\t\t __generate_thresh(thresholds[1], 1));\n+\tout_be32(bman_ccsr_map + POOL_HWDET(bpid),\n+\t\t __generate_thresh(thresholds[2], 0));\n+\tout_be32(bman_ccsr_map + POOL_HWDXT(bpid),\n+\t\t __generate_thresh(thresholds[3], 1));\n+\treturn 0;\n+}\n+\n+#define BMAN_LOW_DEFAULT_THRESH\t\t0x40\n+#define BMAN_HIGH_DEFAULT_THRESH\t\t0x80\n+int bm_pool_set_hw_threshold(u32 bpid, const u32 low_thresh,\n+\t\t\t     const u32 high_thresh)\n+{\n+\tif (!bman_ccsr_map)\n+\t\treturn -ENODEV;\n+\tif (bpid >= bman_pool_max)\n+\t\treturn -EINVAL;\n+\tif (low_thresh && high_thresh) {\n+\t\tout_be32(bman_ccsr_map + POOL_HWDET(bpid),\n+\t\t\t __generate_thresh(low_thresh, 0));\n+\t\tout_be32(bman_ccsr_map + POOL_HWDXT(bpid),\n+\t\t\t __generate_thresh(high_thresh, 1));\n+\t} else {\n+\t\tout_be32(bman_ccsr_map + POOL_HWDET(bpid),\n+\t\t\t __generate_thresh(BMAN_LOW_DEFAULT_THRESH, 0));\n+\t\tout_be32(bman_ccsr_map + POOL_HWDXT(bpid),\n+\t\t\t __generate_thresh(BMAN_HIGH_DEFAULT_THRESH, 1));\n+\t}\n+\treturn 0;\n+}\ndiff --git a/drivers/bus/dpaa/base/qbman/bman_priv.h b/drivers/bus/dpaa/base/qbman/bman_priv.h\nnew file mode 100644\nindex 0000000..07d9cec\n--- /dev/null\n+++ b/drivers/bus/dpaa/base/qbman/bman_priv.h\n@@ -0,0 +1,125 @@\n+/*-\n+ * This file is provided under a dual BSD/GPLv2 license. When using or\n+ * redistributing this file, you may do so under either license.\n+ *\n+ *   BSD LICENSE\n+ *\n+ * Copyright 2008-2016 Freescale Semiconductor Inc.\n+ * Copyright 2017 NXP.\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are met:\n+ * * Redistributions of source code must retain the above copyright\n+ * notice, this list of conditions and the following disclaimer.\n+ * * Redistributions in binary form must reproduce the above copyright\n+ * notice, this list of conditions and the following disclaimer in the\n+ * documentation and/or other materials provided with the distribution.\n+ * * Neither the name of the above-listed copyright holders nor the\n+ * names of any contributors may be used to endorse or promote products\n+ * derived from this software without specific prior written permission.\n+ *\n+ *   GPL LICENSE SUMMARY\n+ *\n+ * ALTERNATIVELY, this software may be distributed under the terms of the\n+ * GNU General Public License (\"GPL\") as published by the Free Software\n+ * Foundation, either version 2 of that License or (at your option) any\n+ * later version.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE\n+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n+ * POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+#ifndef __BMAN_PRIV_H\n+#define __BMAN_PRIV_H\n+\n+#include \"dpaa_sys.h\"\n+#include <fsl_bman.h>\n+\n+/* Revision info (for errata and feature handling) */\n+#define BMAN_REV10 0x0100\n+#define BMAN_REV20 0x0200\n+#define BMAN_REV21 0x0201\n+\n+#define BMAN_PORTAL_IRQ_PATH \"/dev/fsl-usdpaa-irq\"\n+#define BMAN_CCSR_MAP \"/dev/mem\"\n+\n+/* This mask contains all the \"irqsource\" bits visible to API users */\n+#define BM_PIRQ_VISIBLE\t(BM_PIRQ_RCRI | BM_PIRQ_BSCN)\n+\n+/* These are bm_<reg>_<verb>(). So for example, bm_disable_write() means \"write\n+ * the disable register\" rather than \"disable the ability to write\".\n+ */\n+#define bm_isr_status_read(bm)\t\t__bm_isr_read(bm, bm_isr_status)\n+#define bm_isr_status_clear(bm, m)\t__bm_isr_write(bm, bm_isr_status, m)\n+#define bm_isr_enable_read(bm)\t\t__bm_isr_read(bm, bm_isr_enable)\n+#define bm_isr_enable_write(bm, v)\t__bm_isr_write(bm, bm_isr_enable, v)\n+#define bm_isr_disable_read(bm)\t\t__bm_isr_read(bm, bm_isr_disable)\n+#define bm_isr_disable_write(bm, v)\t__bm_isr_write(bm, bm_isr_disable, v)\n+#define bm_isr_inhibit(bm)\t\t__bm_isr_write(bm, bm_isr_inhibit, 1)\n+#define bm_isr_uninhibit(bm)\t\t__bm_isr_write(bm, bm_isr_inhibit, 0)\n+\n+/*\n+ * Global variables of the max portal/pool number this bman version supported\n+ */\n+extern u16 bman_pool_max;\n+\n+/* used by CCSR and portal interrupt code */\n+enum bm_isr_reg {\n+\tbm_isr_status = 0,\n+\tbm_isr_enable = 1,\n+\tbm_isr_disable = 2,\n+\tbm_isr_inhibit = 3\n+};\n+\n+struct bm_portal_config {\n+\t/*\n+\t * Corenet portal addresses;\n+\t * [0]==cache-enabled, [1]==cache-inhibited.\n+\t */\n+\tvoid __iomem *addr_virt[2];\n+\t/* Allow these to be joined in lists */\n+\tstruct list_head list;\n+\t/* User-visible portal configuration settings */\n+\t/* This is used for any \"core-affine\" portals, ie. default portals\n+\t * associated to the corresponding cpu. -1 implies that there is no\n+\t * core affinity configured.\n+\t */\n+\tint cpu;\n+\t/* portal interrupt line */\n+\tint irq;\n+\t/* the unique index of this portal */\n+\tu32 index;\n+\t/* Is this portal shared? (If so, it has coarser locking and demuxes\n+\t * processing on behalf of other CPUs.).\n+\t */\n+\tint is_shared;\n+\t/* These are the buffer pool IDs that may be used via this portal. */\n+\tstruct bman_depletion mask;\n+\n+};\n+\n+int bman_init_ccsr(const struct device_node *node);\n+\n+struct bman_portal *bman_create_affine_portal(\n+\t\t\tconst struct bm_portal_config *config);\n+const struct bm_portal_config *bman_destroy_affine_portal(void);\n+\n+/* Set depletion thresholds associated with a buffer pool. Requires that the\n+ * operating system have access to Bman CCSR (ie. compiled in support and\n+ * run-time access courtesy of the device-tree).\n+ */\n+int bm_pool_set(u32 bpid, const u32 *thresholds);\n+\n+/* Read the free buffer count for a given buffer */\n+u32 bm_pool_free_buffers(u32 bpid);\n+\n+#endif /* __BMAN_PRIV_H */\ndiff --git a/drivers/bus/dpaa/include/fsl_bman.h b/drivers/bus/dpaa/include/fsl_bman.h\nnew file mode 100644\nindex 0000000..383106b\n--- /dev/null\n+++ b/drivers/bus/dpaa/include/fsl_bman.h\n@@ -0,0 +1,375 @@\n+/*-\n+ * This file is provided under a dual BSD/GPLv2 license. When using or\n+ * redistributing this file, you may do so under either license.\n+ *\n+ *   BSD LICENSE\n+ *\n+ * Copyright 2008-2012 Freescale Semiconductor, Inc.\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are met:\n+ * * Redistributions of source code must retain the above copyright\n+ * notice, this list of conditions and the following disclaimer.\n+ * * Redistributions in binary form must reproduce the above copyright\n+ * notice, this list of conditions and the following disclaimer in the\n+ * documentation and/or other materials provided with the distribution.\n+ * * Neither the name of the above-listed copyright holders nor the\n+ * names of any contributors may be used to endorse or promote products\n+ * derived from this software without specific prior written permission.\n+ *\n+ *   GPL LICENSE SUMMARY\n+ *\n+ * ALTERNATIVELY, this software may be distributed under the terms of the\n+ * GNU General Public License (\"GPL\") as published by the Free Software\n+ * Foundation, either version 2 of that License or (at your option) any\n+ * later version.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE\n+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n+ * POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+#ifndef __FSL_BMAN_H\n+#define __FSL_BMAN_H\n+\n+#ifdef __cplusplus\n+extern \"C\" {\n+#endif\n+\n+/* This wrapper represents a bit-array for the depletion state of the 64 Bman\n+ * buffer pools.\n+ */\n+struct bman_depletion {\n+\tu32 state[2];\n+};\n+\n+static inline void bman_depletion_init(struct bman_depletion *c)\n+{\n+\tc->state[0] = c->state[1] = 0;\n+}\n+\n+static inline void bman_depletion_fill(struct bman_depletion *c)\n+{\n+\tc->state[0] = c->state[1] = ~0;\n+}\n+\n+/* --- Bman data structures (and associated constants) --- */\n+\n+/* Represents s/w corenet portal mapped data structures */\n+struct bm_rcr_entry;\t/* RCR (Release Command Ring) entries */\n+struct bm_mc_command;\t/* MC (Management Command) command */\n+struct bm_mc_result;\t/* MC result */\n+\n+/* Code-reduction, define a wrapper for 48-bit buffers. In cases where a buffer\n+ * pool id specific to this buffer is needed (BM_RCR_VERB_CMD_BPID_MULTI,\n+ * BM_MCC_VERB_ACQUIRE), the 'bpid' field is used.\n+ */\n+struct bm_buffer {\n+\tunion {\n+\t\tstruct {\n+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__\n+\t\t\tu8 __reserved1;\n+\t\t\tu8 bpid;\n+\t\t\tu16 hi; /* High 16-bits of 48-bit address */\n+\t\t\tu32 lo; /* Low 32-bits of 48-bit address */\n+#else\n+\t\t\tu32 lo;\n+\t\t\tu16 hi;\n+\t\t\tu8 bpid;\n+\t\t\tu8 __reserved;\n+#endif\n+\t\t};\n+\t\tstruct {\n+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__\n+\t\t\tu64 __notaddress:16;\n+\t\t\tu64 addr:48;\n+#else\n+\t\t\tu64 addr:48;\n+\t\t\tu64 __notaddress:16;\n+#endif\n+\t\t};\n+\t\tu64 opaque;\n+\t};\n+} __attribute__((aligned(8)));\n+static inline u64 bm_buffer_get64(const struct bm_buffer *buf)\n+{\n+\treturn buf->addr;\n+}\n+\n+static inline dma_addr_t bm_buf_addr(const struct bm_buffer *buf)\n+{\n+\treturn (dma_addr_t)buf->addr;\n+}\n+\n+#define bm_buffer_set64(buf, v) \\\n+\tdo { \\\n+\t\tstruct bm_buffer *__buf931 = (buf); \\\n+\t\t__buf931->hi = upper_32_bits(v); \\\n+\t\t__buf931->lo = lower_32_bits(v); \\\n+\t} while (0)\n+\n+/* See 1.5.3.5.4: \"Release Command\" */\n+struct bm_rcr_entry {\n+\tunion {\n+\t\tstruct {\n+\t\t\tu8 __dont_write_directly__verb;\n+\t\t\tu8 bpid; /* used with BM_RCR_VERB_CMD_BPID_SINGLE */\n+\t\t\tu8 __reserved1[62];\n+\t\t};\n+\t\tstruct bm_buffer bufs[8];\n+\t};\n+} __packed;\n+#define BM_RCR_VERB_VBIT\t\t0x80\n+#define BM_RCR_VERB_CMD_MASK\t\t0x70\t/* one of two values; */\n+#define BM_RCR_VERB_CMD_BPID_SINGLE\t0x20\n+#define BM_RCR_VERB_CMD_BPID_MULTI\t0x30\n+#define BM_RCR_VERB_BUFCOUNT_MASK\t0x0f\t/* values 1..8 */\n+\n+/* See 1.5.3.1: \"Acquire Command\" */\n+/* See 1.5.3.2: \"Query Command\" */\n+struct bm_mcc_acquire {\n+\tu8 bpid;\n+\tu8 __reserved1[62];\n+} __packed;\n+struct bm_mcc_query {\n+\tu8 __reserved2[63];\n+} __packed;\n+struct bm_mc_command {\n+\tu8 __dont_write_directly__verb;\n+\tunion {\n+\t\tstruct bm_mcc_acquire acquire;\n+\t\tstruct bm_mcc_query query;\n+\t};\n+} __packed;\n+#define BM_MCC_VERB_VBIT\t\t0x80\n+#define BM_MCC_VERB_CMD_MASK\t\t0x70\t/* where the verb contains; */\n+#define BM_MCC_VERB_CMD_ACQUIRE\t\t0x10\n+#define BM_MCC_VERB_CMD_QUERY\t\t0x40\n+#define BM_MCC_VERB_ACQUIRE_BUFCOUNT\t0x0f\t/* values 1..8 go here */\n+\n+/* See 1.5.3.3: \"Acquire Response\" */\n+/* See 1.5.3.4: \"Query Response\" */\n+struct bm_pool_state {\n+\tu8 __reserved1[32];\n+\t/* \"availability state\" and \"depletion state\" */\n+\tstruct {\n+\t\tu8 __reserved1[8];\n+\t\t/* Access using bman_depletion_***() */\n+\t\tstruct bman_depletion state;\n+\t} as, ds;\n+};\n+\n+struct bm_mc_result {\n+\tunion {\n+\t\tstruct {\n+\t\t\tu8 verb;\n+\t\t\tu8 __reserved1[63];\n+\t\t};\n+\t\tunion {\n+\t\t\tstruct {\n+\t\t\t\tu8 __reserved1;\n+\t\t\t\tu8 bpid;\n+\t\t\t\tu8 __reserved2[62];\n+\t\t\t};\n+\t\t\tstruct bm_buffer bufs[8];\n+\t\t} acquire;\n+\t\tstruct bm_pool_state query;\n+\t};\n+} __packed;\n+#define BM_MCR_VERB_VBIT\t\t0x80\n+#define BM_MCR_VERB_CMD_MASK\t\tBM_MCC_VERB_CMD_MASK\n+#define BM_MCR_VERB_CMD_ACQUIRE\t\tBM_MCC_VERB_CMD_ACQUIRE\n+#define BM_MCR_VERB_CMD_QUERY\t\tBM_MCC_VERB_CMD_QUERY\n+#define BM_MCR_VERB_CMD_ERR_INVALID\t0x60\n+#define BM_MCR_VERB_CMD_ERR_ECC\t\t0x70\n+#define BM_MCR_VERB_ACQUIRE_BUFCOUNT\tBM_MCC_VERB_ACQUIRE_BUFCOUNT /* 0..8 */\n+\n+/* Portal and Buffer Pools */\n+/* Represents a managed portal */\n+struct bman_portal;\n+\n+/* This object type represents Bman buffer pools. */\n+struct bman_pool;\n+\n+/* This struct specifies parameters for a bman_pool object. */\n+struct bman_pool_params {\n+\t/* index of the buffer pool to encapsulate (0-63), ignored if\n+\t * BMAN_POOL_FLAG_DYNAMIC_BPID is set.\n+\t */\n+\tu32 bpid;\n+\t/* bit-mask of BMAN_POOL_FLAG_*** options */\n+\tu32 flags;\n+\t/* depletion-entry/exit thresholds, if BMAN_POOL_FLAG_THRESH is set. NB:\n+\t * this is only allowed if BMAN_POOL_FLAG_DYNAMIC_BPID is used *and*\n+\t * when run in the control plane (which controls Bman CCSR). This array\n+\t * matches the definition of bm_pool_set().\n+\t */\n+\tu32 thresholds[4];\n+};\n+\n+/* Flags to bman_new_pool() */\n+#define BMAN_POOL_FLAG_NO_RELEASE    0x00000001 /* can't release to pool */\n+#define BMAN_POOL_FLAG_ONLY_RELEASE  0x00000002 /* can only release to pool */\n+#define BMAN_POOL_FLAG_DYNAMIC_BPID  0x00000008 /* (de)allocate bpid */\n+#define BMAN_POOL_FLAG_THRESH        0x00000010 /* set depletion thresholds */\n+\n+/* Flags to bman_release() */\n+#define BMAN_RELEASE_FLAG_NOW        0x00000008 /* issue immediate release */\n+\n+\n+/**\n+ * bman_get_portal_index - get portal configuration index\n+ */\n+int bman_get_portal_index(void);\n+\n+/**\n+ * bman_rcr_is_empty - Determine if portal's RCR is empty\n+ *\n+ * For use in situations where a cpu-affine caller needs to determine when all\n+ * releases for the local portal have been processed by Bman but can't use the\n+ * BMAN_RELEASE_FLAG_WAIT_SYNC flag to do this from the final bman_release().\n+ * The function forces tracking of RCR consumption (which normally doesn't\n+ * happen until release processing needs to find space to put new release\n+ * commands), and returns zero if the ring still has unprocessed entries,\n+ * non-zero if it is empty.\n+ */\n+int bman_rcr_is_empty(void);\n+\n+/**\n+ * bman_alloc_bpid_range - Allocate a contiguous range of BPIDs\n+ * @result: is set by the API to the base BPID of the allocated range\n+ * @count: the number of BPIDs required\n+ * @align: required alignment of the allocated range\n+ * @partial: non-zero if the API can return fewer than @count BPIDs\n+ *\n+ * Returns the number of buffer pools allocated, or a negative error code. If\n+ * @partial is non zero, the allocation request may return a smaller range of\n+ * BPs than requested (though alignment will be as requested). If @partial is\n+ * zero, the return value will either be 'count' or negative.\n+ */\n+int bman_alloc_bpid_range(u32 *result, u32 count, u32 align, int partial);\n+static inline int bman_alloc_bpid(u32 *result)\n+{\n+\tint ret = bman_alloc_bpid_range(result, 1, 0, 0);\n+\n+\treturn (ret > 0) ? 0 : ret;\n+}\n+\n+/**\n+ * bman_release_bpid_range - Release the specified range of buffer pool IDs\n+ * @bpid: the base BPID of the range to deallocate\n+ * @count: the number of BPIDs in the range\n+ *\n+ * This function can also be used to seed the allocator with ranges of BPIDs\n+ * that it can subsequently allocate from.\n+ */\n+void bman_release_bpid_range(u32 bpid, unsigned int count);\n+static inline void bman_release_bpid(u32 bpid)\n+{\n+\tbman_release_bpid_range(bpid, 1);\n+}\n+\n+int bman_reserve_bpid_range(u32 bpid, unsigned int count);\n+static inline int bman_reserve_bpid(u32 bpid)\n+{\n+\treturn bman_reserve_bpid_range(bpid, 1);\n+}\n+\n+void bman_seed_bpid_range(u32 bpid, unsigned int count);\n+\n+int bman_shutdown_pool(u32 bpid);\n+\n+/**\n+ * bman_new_pool - Allocates a Buffer Pool object\n+ * @params: parameters specifying the buffer pool ID and behaviour\n+ *\n+ * Creates a pool object for the given @params. A portal and the depletion\n+ * callback field of @params are only used if the BMAN_POOL_FLAG_DEPLETION flag\n+ * is set. NB, the fields from @params are copied into the new pool object, so\n+ * the structure provided by the caller can be released or reused after the\n+ * function returns.\n+ */\n+struct bman_pool *bman_new_pool(const struct bman_pool_params *params);\n+\n+/**\n+ * bman_free_pool - Deallocates a Buffer Pool object\n+ * @pool: the pool object to release\n+ */\n+void bman_free_pool(struct bman_pool *pool);\n+\n+/**\n+ * bman_get_params - Returns a pool object's parameters.\n+ * @pool: the pool object\n+ *\n+ * The returned pointer refers to state within the pool object so must not be\n+ * modified and can no longer be read once the pool object is destroyed.\n+ */\n+const struct bman_pool_params *bman_get_params(const struct bman_pool *pool);\n+\n+/**\n+ * bman_release - Release buffer(s) to the buffer pool\n+ * @pool: the buffer pool object to release to\n+ * @bufs: an array of buffers to release\n+ * @num: the number of buffers in @bufs (1-8)\n+ * @flags: bit-mask of BMAN_RELEASE_FLAG_*** options\n+ *\n+ */\n+int bman_release(struct bman_pool *pool, const struct bm_buffer *bufs, u8 num,\n+\t\t u32 flags);\n+\n+/**\n+ * bman_acquire - Acquire buffer(s) from a buffer pool\n+ * @pool: the buffer pool object to acquire from\n+ * @bufs: array for storing the acquired buffers\n+ * @num: the number of buffers desired (@bufs is at least this big)\n+ *\n+ * Issues an \"Acquire\" command via the portal's management command interface.\n+ * The return value will be the number of buffers obtained from the pool, or a\n+ * negative error code if a h/w error or pool starvation was encountered.\n+ */\n+int bman_acquire(struct bman_pool *pool, struct bm_buffer *bufs, u8 num,\n+\t\t u32 flags);\n+\n+/**\n+ * bman_query_pools - Query all buffer pool states\n+ * @state: storage for the queried availability and depletion states\n+ */\n+int bman_query_pools(struct bm_pool_state *state);\n+\n+/**\n+ * bman_query_free_buffers - Query how many free buffers are in buffer pool\n+ * @pool: the buffer pool object to query\n+ *\n+ * Return the number of the free buffers\n+ */\n+u32 bman_query_free_buffers(struct bman_pool *pool);\n+\n+/**\n+ * bman_update_pool_thresholds - Change the buffer pool's depletion thresholds\n+ * @pool: the buffer pool object to which the thresholds will be set\n+ * @thresholds: the new thresholds\n+ */\n+int bman_update_pool_thresholds(struct bman_pool *pool, const u32 *thresholds);\n+\n+/**\n+ * bm_pool_set_hw_threshold - Change the buffer pool's thresholds\n+ * @pool: Pool id\n+ * @low_thresh: low threshold\n+ * @high_thresh: high threshold\n+ */\n+int bm_pool_set_hw_threshold(u32 bpid, const u32 low_thresh,\n+\t\t\t     const u32 high_thresh);\n+\n+#ifdef __cplusplus\n+}\n+#endif\n+\n+#endif /* __FSL_BMAN_H */\ndiff --git a/drivers/bus/dpaa/include/fsl_usd.h b/drivers/bus/dpaa/include/fsl_usd.h\nindex a4897b0..a3243af 100644\n--- a/drivers/bus/dpaa/include/fsl_usd.h\n+++ b/drivers/bus/dpaa/include/fsl_usd.h\n@@ -50,7 +50,9 @@ extern \"C\" {\n \n /* Thread-entry/exit hooks; */\n int qman_thread_init(void);\n+int bman_thread_init(void);\n int qman_thread_finish(void);\n+int bman_thread_finish(void);\n \n #define QBMAN_ANY_PORTAL_IDX 0xffffffff\n \n@@ -92,9 +94,12 @@ int bman_free_raw_portal(struct dpaa_raw_portal *portal);\n  * into another blocking read/select/poll.\n  */\n void qman_thread_irq(void);\n+void bman_thread_irq(void);\n \n /* Global setup */\n int qman_global_init(void);\n+int bman_global_init(void);\n+\n #ifdef __cplusplus\n }\n #endif\n",
    "prefixes": [
        "dpdk-dev",
        "v2",
        "12/40"
    ]
}