From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03on0076.outbound.protection.outlook.com [104.47.41.76]) by dpdk.org (Postfix) with ESMTP id 5B1737CF0 for ; Tue, 4 Jul 2017 16:35:55 +0200 (CEST) Received: from BN3PR03CA0109.namprd03.prod.outlook.com (10.174.66.27) by BN1PR0301MB0595.namprd03.prod.outlook.com (10.160.170.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1220.11; Tue, 4 Jul 2017 14:35:53 +0000 Received: from BL2FFO11OLC006.protection.gbl (2a01:111:f400:7c09::134) by BN3PR03CA0109.outlook.office365.com (2603:10b6:400:4::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1220.11 via Frontend Transport; Tue, 4 Jul 2017 14:35:53 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BL2FFO11OLC006.mail.protection.outlook.com (10.173.160.95) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1199.9 via Frontend Transport; Tue, 4 Jul 2017 14:35:52 +0000 Received: from Tophie.ap.freescale.net ([10.232.14.39]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id v64EZM6u016426; Tue, 4 Jul 2017 07:35:50 -0700 From: Shreyansh Jain To: CC: , 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> <1499179471-19145-1-git-send-email-shreyansh.jain@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131436525528957798; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.158.2; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(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); DIR:OUT; SFP:1101; SCL:1; SRVR:BN1PR0301MB0595; H:az84smr01.freescale.net; FPR:; SPF:Fail; MLV:ovrnspm; A:1; MX:1; PTR:InfoDomainNonexistent; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BL2FFO11OLC006; 1:ZA5mwEJ8KA0lSut/xNw8AXCpG8g1n2LnE7OJtqCtG?= =?us-ascii?Q?AQ8cnHI+ZpktGYxvdQI7TnkjaGbz3yLyd2rocUjAVq6iapsuVq1KdLciLygG?= =?us-ascii?Q?02IcsMh52g8drZ34aVPq3JvnwHFjK5GqM5PWJueTMNhvAei290th3oBxFDNq?= =?us-ascii?Q?ENQLpNtb7N26OluT1nbbVlVscA7AsFFBSeTFxZKLB7zj+Sm908dHnTVOf80M?= =?us-ascii?Q?stCPe+ES5hhGtLEFFVZxZ2P6/hn3ZQCm5idMT04gyjbyM8RW+xD13MN7GxVs?= =?us-ascii?Q?1qno4LVIl6V7yOgkXEnX6rIOrZ2NFoFFTwNXjTLgoGHujgNHPfa6elcQvdu3?= =?us-ascii?Q?p+GBvTyGI4P5adM6xIRzAVwj8VExwhJaQ/BcT25mJZ3/Je2I5TMQrDAsdNRK?= =?us-ascii?Q?+JMKCmsra5IgdP/VPYkabxF5FhFx6B/80iQMRmpsDJciNlfjmxE4KHFP0/Ii?= =?us-ascii?Q?TVdnGB1WaeQ2anpq1izEvHicJzf6Q/AEsjP15VHf5j44g6JFJ9AEa1ZGetf+?= =?us-ascii?Q?MVupmUXSuAodKENe9E3paexJ+Y6uizLbhFPYR+kivRDEnu4QQYFI34WMT1cg?= =?us-ascii?Q?nbQfEAJj5AW8he2f3NeCn8sflh30uWUh71ZmTpwx6YyMuJ11bdhhIyxHfzzM?= =?us-ascii?Q?7WiEyN9G5RLerbZxuAPWK87263e6tC0XTAJedHestv2Ri8LcfhALR/cueOEG?= =?us-ascii?Q?uMp2+TkR7Y6MksSI8MuGUKPiQ5K6VllgKzFp07PfJc+UYqrEhrfU4TEVp5m4?= =?us-ascii?Q?+gXRcG0lIU3Q3fV3+FGvJCI+qvhNI22Ay2A7FfRyb74S6Qu3BoQoHvWVvIG+?= =?us-ascii?Q?FO7e2DezNEaB5sxJuk3M9bJX6Ud2YER79iP3WS1ZipBubMBJtW2uHbV8M1Em?= =?us-ascii?Q?YvvOW1xv8ft3fOLZzR81MHg651M5Vq4nb8Wl1ai9hjbPxA5LFBtYJZ77/uyP?= =?us-ascii?Q?0Ql7FQ9jBHimaP7bxkOX7eVLe4MoAFQG3PaHdtmFtNToGaZiTn3TkHQHU8pZ?= =?us-ascii?Q?ZvQD/baYxjPzkW2crUbaOSDOYgZ0iBiPzLGWonDjLFqrrL5zQkHG6oEsoW3o?= =?us-ascii?Q?09qfz4YSCEu8vK20ujKDHSlNElnOigrKJV+gI+tAwA2G3EC5g=3D=3D?= 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; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(300000503095)(300135400095)(2017052603031)(201703131430075)(201703131517081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:BN1PR0301MB0595; X-Microsoft-Exchange-Diagnostics: 1; BN1PR0301MB0595; 3: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 X-MS-TrafficTypeDiagnostic: BN1PR0301MB0595: X-Microsoft-Exchange-Diagnostics: 1; BN1PR0301MB0595; 25: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= X-Microsoft-Exchange-Diagnostics: 1; BN1PR0301MB0595; 31: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== X-Microsoft-Antispam-PRVS: 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; RULEID:(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); SRVR:BN1PR0301MB0595; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:BN1PR0301MB0595; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN1PR0301MB0595; 4:W8bgyoML3ER4Jp786BN0UcdWzu2RQhTVctjUgueN?= =?us-ascii?Q?EM/E9t9dr6e/nsqH427rgxGKdxbFv7kCHEY4C+4O1UlYuuGsj2zYGjUXQs5o?= =?us-ascii?Q?lk0rD0bF7XJzHCvx0Brjg5vJIw37tkMFFpppdZbSw7CWHdTHBRifwAFzQSdM?= =?us-ascii?Q?kUSGIAUzBe1c6+Ah2WmojBnPgNg2UuypvU43i+ixIp37alMAfh7DJJUrJLcQ?= =?us-ascii?Q?5nqzf1gby/8fMqbAGh2bAlxGlEiFY5NiYOke+LJPyVgTH7oWfGh2LJjhd4P5?= =?us-ascii?Q?xgG9AWrCLe7tgavWfLj+Nc03u8tRS3ijk3A2VBuMeFqT8AjW6JajrAdpZToR?= =?us-ascii?Q?87bvoY95Y05AD+tG/e+krTZ94puX6zcgDSi7bCNk5Bne4xYRzrY7bFJG9Hm5?= =?us-ascii?Q?uRfZa3zcBcNNDVGAmDariTF4UB8bjTrm7F976kM4GGOIwG3N0/WOrm5t2nTs?= =?us-ascii?Q?qEHrhysCSCx3Mn98tPsGZ0lTXxokLhV6cDm6wkUvcxs1OCAI+pAiBdebbQ49?= =?us-ascii?Q?f8qPBmaEO2MBIgovk9KxpuiiDuVrygU5qBn7OBv5zsMcSFxCmpI8ZFuAp9UZ?= =?us-ascii?Q?8KU4W+pD5ThcdSo5DNMnQh/ztSI+nR7MtD6qLb6p0sXpPHlgtk6LYI0tKkvA?= =?us-ascii?Q?0KSCPANC9REPUSimVFP/7FMCiO+e3Zz+69Od/jClcthmyUsMS2Kv7Nt0zrry?= =?us-ascii?Q?kKr5ogUHKR4EhlAQKKPIPVXZEZjQUcHiJhpTdZajHNnYYCdx94OXzLW/J9mP?= =?us-ascii?Q?o6OeQe3gJBchvS6n8Zh2f/T60gVpGSC/zddg1Iey8XLK9Rc18ez1JLfb8nxA?= =?us-ascii?Q?Ra4CFLI2AvkFEH/O7GclP8snToWsnjY47thUqVes4phNtTs9C0hCm7AIuezz?= =?us-ascii?Q?aLQ+ZHOgrliMJm5yUg7e3Bv5GQuttfMmCytHUmVff6si8ireASmyPUcWflPQ?= =?us-ascii?Q?uYmeKsTwn3vp9b0hs7/aGkoAVHEQjmSWiB0KcWFCoSvNMypOMiBOT4ENLOTJ?= =?us-ascii?Q?P3JhiANrCRR5/xHsc00F1T5GulTfG7fHiHaids3wQkxP7gKmIdRbMvKyA1nu?= =?us-ascii?Q?v3C47CgzR6G9R5XeX+F96imWePQ5VDr476xQjff7bz/zw3MD+I+G8CdBmeV7?= =?us-ascii?Q?3a2cip1tco0Exau+Ba81z6BvYHxqDkEuct+4y0n+uMbBMt6pQHV3SHI/GZjw?= =?us-ascii?Q?8bHRtoeQ9qpdr+qzMvDPkN9xVBqxdZlp2zEVwf+jOn4fqcKCzkE35KEGb3j2?= =?us-ascii?Q?SVF2Us/M2Au3A2S4ZJaCNsk3PInfMvKMZWT9bmrXdyyqdtBQwJp+BXHPJO0R?= =?us-ascii?Q?xr5W27lcMF+Rzzd9NzpF5P9mrVGzXrxXjHcgxSZO/cUfoTeKwDKOWpfEQNGW?= =?us-ascii?Q?piU3cd4FIGGifNJDj7XT3zd+IAudu5/2tJJEz7tsniU6sL7EhHOoIsvKFZ1A?= =?us-ascii?Q?0kjYxAx0aqammEJRM/AAe2U493r1qAYsgVXSIBIFHI92Stq+WB1sDl+Xis0o?= =?us-ascii?Q?8Ys5C45Iyl0L2SQiSL867dV5gMXf+mx/Uts2Vzx6WxqTGDQ5SXjvXbAg0XC2?= =?us-ascii?Q?7C5W/VbSsBXZqPyZGA=3D=3D?= X-Forefront-PRVS: 0358535363 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN1PR0301MB0595; 23:4LR1fKRmDP8xUQrgmXYwFygY4ZDiu1IOA3oJJ23?= =?us-ascii?Q?Uk1cauC6VRjuwKfEFytLCrc2NYSjqJ8dHBw6khvUXTTB3dlhWucJkqRPEyDe?= =?us-ascii?Q?0jvktAJJkpHT10E5OuD3JzHMJsy2U8ld/fK77dnB6L0axlCkoem+dZyqQ3KT?= =?us-ascii?Q?kefq5SmGMCfNUCYn7sTmTNTT8LqLz3ECZ32DHhd1AGZm9La5GeNspDKVphxh?= =?us-ascii?Q?9oDpEwTvp0nJUtVq4uQKVEUc6ICULWq9CdlBqQs0LN6PMbHPNfUAFM7SQdG4?= =?us-ascii?Q?gbbE2Gka07w0SkJxZE0lz1E8sE9Qk0Gcfhy5qq4lP6E24by2wvCNzP0OsxA+?= =?us-ascii?Q?Dlid6kAu+x0SsEAir2Fxq+mHSXbDWGwtgNWvhsqHHMrA1nqmPsGqEUkWsi7P?= =?us-ascii?Q?ysvtJy1FogVisnRUPeAdVWl6jdiqc5EC4MgsZwjxE6YN8rftKxs2i1/Wead5?= =?us-ascii?Q?4smzjvGGO64nYS//DvtBvTw7Di1pmW60qH8TxHM651qUjfoSL/SSHnXtCngz?= =?us-ascii?Q?zO9Cyqsws4NGi2A5NtEbHsT6oDwkn+F0RsYgYMeATgQWtt0Y0GH+nyeHtb5V?= =?us-ascii?Q?aoEwyrMmO5sl25YfoU4t5wLTUMIOU2W5mejUEpDfeQouVsQeNJRu6xOtaV/k?= =?us-ascii?Q?eoXKmgYyk0r5XRk6PsaOzwgXnkPoqQ7LkPwFVwBf7xuzA5Uu8nHoGLyB4lUv?= =?us-ascii?Q?quRQT+qoZSs/QMyhIbLz0LnjfuAs4R3SLS0Fz54HBFmgfPTtDk4Xh9mQbROx?= =?us-ascii?Q?iRHUy6QIjdqD1zOv+I2V9uyc1aMFxDxoWaoyHgZ0qRRUT9vtc+O//xujojF6?= =?us-ascii?Q?vHg3hCtqnDeF2EHjxt3GgNW9vIL3yOS7RKr81Oq0uXp/8O+AhuNtCNWK2u7h?= =?us-ascii?Q?/4efzQtRmdKCbe4JWfUZorjWYQFVPLcud2NxIxmlP34Y3fct9jDrOiX+Asu8?= =?us-ascii?Q?V8871m6WI1u3scnZxrsFQ49/kdVLQmpfN8EFn6DOQ64SlBCfrRlJTMKbzGIG?= =?us-ascii?Q?0c3ohnEYtZKteizA+MBkv3XzQDLuXQn9XW93qS+lcsO5Szfe//HezTjYqUvD?= =?us-ascii?Q?R52ClktSeYHyO0L6IFFmBdO3equE0IISx+7OYFv3tRQsbV3qyo3A0D9krqcW?= =?us-ascii?Q?DTftRt9EEgCe/7GWXM1jSQSWDOCJJxakz9CAX7R6D7n35l1rqGYIvjcwQebX?= =?us-ascii?Q?YD6ZBPGELp0Prj86+ydk7QHw4z8/jx2mYRQOtEa1wL50JTm0/KNnHWeBALOj?= =?us-ascii?Q?y+yy0bsHUe87Hhg+yID5I5jWrwA4X/6WtdDf1fRoLHTh6fN0DqF/qVdnQpda?= =?us-ascii?Q?54bCdHrk2ZClYJPQx6PtdARaP4+PV18JreRDv3MjncZfotCFQtvWHVUC5xD8?= =?us-ascii?Q?6EDqf4g=3D=3D?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN1PR0301MB0595; 6:BJhBhf/3AdyC3KyBLKXyykF5imZhCwAvFp7Vd6fQ?= =?us-ascii?Q?jVhCRPDkeo3CMvDXkIE4CtuOw/s1wjW9g1+JNdqV9rKnGFmJHLaExKHr695o?= =?us-ascii?Q?fNmjbL33bwBFvcNACUhGrafvmJJ+CCHDt0ISieVll58qD9i2UZTY7re9cXyZ?= =?us-ascii?Q?CTryqiw+sNxjTsLr54zVNFKkUKbQp9TI2WpRV/jlwd28omfg7fOOXUTx+pWw?= =?us-ascii?Q?K5wwNm+NCay9e5YW+cWgWWLLdszBDx424UuOfLLwQ4jH0SuYykESM5F2m+1R?= =?us-ascii?Q?WTzzof5tMAKP5SaeKcZH7nZvjOBznDlLxvxrhvlPKzoePaZxte1zyfxxyH5Y?= =?us-ascii?Q?RVZjkUoGXxctGnmnolqk9/1lvlShJagyABeRyyVTl2I7DhF/d+wdFJzA1vsw?= =?us-ascii?Q?hYVR7lsIdHREQPflUfDTt+gAZ/AkgJcKaGVGgpFRBnhWfL19O1pO2K+kYt+A?= =?us-ascii?Q?nPS/TBCfTd0UW1NYGKcFN0pFbRQ8IlrGXx8WNlokPovZ9ob3TDGuiVz526uf?= =?us-ascii?Q?J+kpKJJ+fcX/+BGt3pw8kNujacUVQJMiNL3jbTpT1n2alRknVl/MCB2FTtUh?= =?us-ascii?Q?8ZxCxwbYgr4Rh3EqO3wVESr3UwtkJcyNbxwVNTCphCtqFyl5EwTNrKW1PUeU?= =?us-ascii?Q?zlHwjvIqOiUkDL4XmoI2XsxEsmWM0ZgS9RWMlHFqUkajonFe+pVjJIt3to8Z?= =?us-ascii?Q?A4U+Jr4CeoAjmR0NoMxOSPn48zZypXiSZ2ODrTRlZMO8KXhNDqVrkyDD+MhG?= =?us-ascii?Q?D8gy6swMdB/mgSWHMswqo5kkdlKih1BGcAx8cSrt6mtpmox0x72cLFFhBlEV?= =?us-ascii?Q?gF5IhwmK0AbnaisJxKk+71p1EdtKPO09emnMZmLxT7cx4AoPZZ6CpFnlkPVg?= =?us-ascii?Q?DJf55OOMYCxcAKzgLuVwaIMwE+V1mAXXTr/uILMQDxtkWgulpLTQSQXAO2n0?= =?us-ascii?Q?xfRD1GrUHP6TK5jaK2dvhdTHFEdFcj9mIEVXypqPAQ=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; BN1PR0301MB0595; 5:oDgopbwLASTQ+vbE5Dadv1C8Lsb/lC4tP8qR5N5aQS7w000ugjsCXO9a6L6Ri6GTy5xlmWZM/bN3u3RSZG+0/QSQDNG0FaAcjNwHsERRH5UbawMfp3wlCjCfJ/7z2f7b5ImD7jD7wrVu+qehjP60ZrC2+gCKm0ehY1hqGhU5jpVwIcmuUk6TRyZZnt0DQn4P2OlvjbQ8LSHuun585qeF8ao8ePDSskzOPsP7RoudDjq2bdRAz2KMHuZe2RlBnh1hOwtHqDmtNIda7zng2a5D8IzovxtWZ5h5dCnqGslkBTd8EjkMVzah+54Pt6H1afjT7RYSzEPYz+bm+Yl6SjUqDdXBwFXzZ5ao6eA0nbUlM2YMh7YscFrGzJxpYvmhoqhYlX44OrtdhY9oefrteG9t1cBF3Y3wb2kp9jw2pGVqqHuoGjvyXAl/GQ8OEgWrAP3tCK7GNGjgO+VUEwKoMVqck0+s/SYDAytaRibI6LvoFb/ikagbGO+LJzMdu+QF4ncgUW6neT3QRuQ9ZYl67j7QVw==; 24:iezDxuxxQuJtM+rv0BGx1785d3KvuZOHaOdQgyqcapmWIKo92fSdWFuqwPsIZgrGAhfcR1+9zBtnbtxnoYeGaVHHvct6Ens3eU53hRupzwk= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BN1PR0301MB0595; 7:4OeXr/io5XZWF//89gubgO9cgKvyxYJQXo6aEArdewBujIzMErmc2w/keatlu1rNv8JmT92LrPMjR/lo+vkBxRcgGVi91Z9OONEaridSm6SL2EkZ1ZMYw2yS55LbUlqE1qIlfSfjJSSxMbTID04GRovTsPbiAIfsfJuRZ52SfXAPQVAtT/2gXloCJuQToNarBfPBdgDieJV9BFqu675fU70N04WSQWtHZBWHDkhzhCPr9u94HNHmeL6kNxSmxOHDuzRrNmGgN91E6shxhwuGVfmUq5yPoYHh/LMjj8OtB/yuHCgB8501Bs2v6TyJKLbStRImUDI661hbOmTa0hdAfqkhXu05DZIwZET/q4UGQ21BCgGf25U43nSFsuKQ7g9oPrqT9+hD/lJmvPV0JNEt+sVPqwCLZXTib8btYIH4FcMbsrXvJgw0tmZzLwwLHAXQoSATgdCBAm27+DxAkX/xi4KukfcGTBPDWM64rFqA11yQWZT37usHTsjzm1lO4pnf1pCtPL+D+icqeLfXiBSy1IPLrsqQZKMqOMFoJi1vVuzKVJfi3FzwCYeuPkn3t4i0x6goXDpSyaQofVhA/SMyl/gLN/wZSXy527m17AdF/5BDtxY3tsTS7XlaY73lBp1Yv3s9QepK22l4tEuYHyR7CdgIX8JM7WXdbKMPoamLcCjdtZ14djgGeI34bv0I9lYNKoP0yPKcbFlOoEpXyhNcXQAYrqz4nWXofNhyAdmNrRzospTWt1htgcoUsfD9a8HpyskQQMcyg3TwfdGxmqebu+x0hqXrcns5dZfYZuk33w4= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Jul 2017 14:35:52.5213 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.158.2]; Helo=[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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 Jul 2017 14:35:56 -0000 The Buffer Manager (BMan) is a hardware buffer pool management block that allows software and accelerators on the datapath to acquire and release buffers in order to build frames. This patch adds the core routines. Signed-off-by: Geoff Thorpe Signed-off-by: Roy Pledge Signed-off-by: Hemant Agrawal Signed-off-by: Shreyansh Jain --- drivers/bus/dpaa/Makefile | 1 + drivers/bus/dpaa/base/qbman/bman_driver.c | 311 +++++++++++++++++++++++++ drivers/bus/dpaa/base/qbman/bman_priv.h | 125 ++++++++++ drivers/bus/dpaa/include/fsl_bman.h | 375 ++++++++++++++++++++++++++++++ drivers/bus/dpaa/include/fsl_usd.h | 5 + 5 files changed, 817 insertions(+) create mode 100644 drivers/bus/dpaa/base/qbman/bman_driver.c create mode 100644 drivers/bus/dpaa/base/qbman/bman_priv.h create mode 100644 drivers/bus/dpaa/include/fsl_bman.h diff --git a/drivers/bus/dpaa/Makefile b/drivers/bus/dpaa/Makefile index ad68828..24dfa13 100644 --- a/drivers/bus/dpaa/Makefile +++ b/drivers/bus/dpaa/Makefile @@ -71,6 +71,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_DPAA_BUS) += \ base/fman/of.c \ base/fman/netcfg_layer.c \ base/qbman/process.c \ + base/qbman/bman_driver.c \ base/qbman/qman.c \ base/qbman/qman_driver.c \ base/qbman/dpaa_alloc.c \ diff --git a/drivers/bus/dpaa/base/qbman/bman_driver.c b/drivers/bus/dpaa/base/qbman/bman_driver.c new file mode 100644 index 0000000..fb3c50e --- /dev/null +++ b/drivers/bus/dpaa/base/qbman/bman_driver.c @@ -0,0 +1,311 @@ +/*- + * This file is provided under a dual BSD/GPLv2 license. When using or + * redistributing this file, you may do so under either license. + * + * BSD LICENSE + * + * Copyright 2008-2016 Freescale Semiconductor Inc. + * Copyright 2017 NXP. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the above-listed copyright holders nor the + * names of any contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * GPL LICENSE SUMMARY + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include +#include +#include "bman_priv.h" +#include + +/* + * Global variables of the max portal/pool number this bman version supported + */ +u16 bman_ip_rev; +u16 bman_pool_max; +void *bman_ccsr_map; + +/*****************/ +/* Portal driver */ +/*****************/ + +static __thread int fd = -1; +static __thread struct bm_portal_config pcfg; +static __thread struct dpaa_ioctl_portal_map map = { + .type = dpaa_portal_bman +}; + +static int fsl_bman_portal_init(uint32_t idx, int is_shared) +{ + cpu_set_t cpuset; + int loop, ret; + struct dpaa_ioctl_irq_map irq_map; + + /* Verify the thread's cpu-affinity */ + ret = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), + &cpuset); + if (ret) { + error(0, ret, "pthread_getaffinity_np()"); + return ret; + } + pcfg.cpu = -1; + for (loop = 0; loop < CPU_SETSIZE; loop++) + if (CPU_ISSET(loop, &cpuset)) { + if (pcfg.cpu != -1) { + pr_err("Thread is not affine to 1 cpu"); + return -EINVAL; + } + pcfg.cpu = loop; + } + if (pcfg.cpu == -1) { + pr_err("Bug in getaffinity handling!"); + return -EINVAL; + } + /* Allocate and map a bman portal */ + map.index = idx; + ret = process_portal_map(&map); + if (ret) { + error(0, ret, "process_portal_map()"); + return ret; + } + /* Make the portal's cache-[enabled|inhibited] regions */ + pcfg.addr_virt[DPAA_PORTAL_CE] = map.addr.cena; + pcfg.addr_virt[DPAA_PORTAL_CI] = map.addr.cinh; + pcfg.is_shared = is_shared; + pcfg.index = map.index; + bman_depletion_fill(&pcfg.mask); + + fd = open(BMAN_PORTAL_IRQ_PATH, O_RDONLY); + if (fd == -1) { + pr_err("BMan irq init failed"); + process_portal_unmap(&map.addr); + return -EBUSY; + } + /* Use the IRQ FD as a unique IRQ number */ + pcfg.irq = fd; + + /* Set the IRQ number */ + irq_map.type = dpaa_portal_bman; + irq_map.portal_cinh = map.addr.cinh; + process_portal_irq_map(fd, &irq_map); + return 0; +} + +static int fsl_bman_portal_finish(void) +{ + int ret; + + process_portal_irq_unmap(fd); + + ret = process_portal_unmap(&map.addr); + if (ret) + error(0, ret, "process_portal_unmap()"); + return ret; +} + +int bman_thread_init(void) +{ + /* Convert from contiguous/virtual cpu numbering to real cpu when + * calling into the code that is dependent on the device naming. + */ + return fsl_bman_portal_init(QBMAN_ANY_PORTAL_IDX, 0); +} + +int bman_thread_finish(void) +{ + return fsl_bman_portal_finish(); +} + +void bman_thread_irq(void) +{ + qbman_invoke_irq(pcfg.irq); + /* Now we need to uninhibit interrupts. This is the only code outside + * the regular portal driver that manipulates any portal register, so + * rather than breaking that encapsulation I am simply hard-coding the + * offset to the inhibit register here. + */ + out_be32(pcfg.addr_virt[DPAA_PORTAL_CI] + 0xe0c, 0); +} + +int bman_init_ccsr(const struct device_node *node) +{ + static int ccsr_map_fd; + uint64_t phys_addr; + const uint32_t *bman_addr; + uint64_t regs_size; + + bman_addr = of_get_address(node, 0, ®s_size, NULL); + if (!bman_addr) { + pr_err("of_get_address cannot return BMan address"); + return -EINVAL; + } + phys_addr = of_translate_address(node, bman_addr); + if (!phys_addr) { + pr_err("of_translate_address failed"); + return -EINVAL; + } + + ccsr_map_fd = open(BMAN_CCSR_MAP, O_RDWR); + if (unlikely(ccsr_map_fd < 0)) { + pr_err("Can not open /dev/mem for BMan CCSR map"); + return ccsr_map_fd; + } + + bman_ccsr_map = mmap(NULL, regs_size, PROT_READ | + PROT_WRITE, MAP_SHARED, ccsr_map_fd, phys_addr); + if (bman_ccsr_map == MAP_FAILED) { + pr_err("Can not map BMan CCSR base Bman: " + "0x%x Phys: 0x%lx size 0x%lx", + *bman_addr, phys_addr, regs_size); + return -EINVAL; + } + + return 0; +} + +int bman_global_init(void) +{ + const struct device_node *dt_node; + static int done; + + if (done) + return -EBUSY; + /* Use the device-tree to determine IP revision until something better + * is devised. + */ + dt_node = of_find_compatible_node(NULL, NULL, "fsl,bman-portal"); + if (!dt_node) { + pr_err("No bman portals available for any CPU\n"); + return -ENODEV; + } + if (of_device_is_compatible(dt_node, "fsl,bman-portal-1.0") || + of_device_is_compatible(dt_node, "fsl,bman-portal-1.0.0")) { + bman_ip_rev = BMAN_REV10; + bman_pool_max = 64; + } else if (of_device_is_compatible(dt_node, "fsl,bman-portal-2.0") || + of_device_is_compatible(dt_node, "fsl,bman-portal-2.0.8")) { + bman_ip_rev = BMAN_REV20; + bman_pool_max = 8; + } else if (of_device_is_compatible(dt_node, "fsl,bman-portal-2.1.0") || + of_device_is_compatible(dt_node, "fsl,bman-portal-2.1.1") || + of_device_is_compatible(dt_node, "fsl,bman-portal-2.1.2") || + of_device_is_compatible(dt_node, "fsl,bman-portal-2.1.3")) { + bman_ip_rev = BMAN_REV21; + bman_pool_max = 64; + } else { + pr_warn("unknown BMan version in portal node,default " + "to rev1.0"); + bman_ip_rev = BMAN_REV10; + bman_pool_max = 64; + } + + if (!bman_ip_rev) { + pr_err("Unknown bman portal version\n"); + return -ENODEV; + } + { + const struct device_node *dn = of_find_compatible_node(NULL, + NULL, "fsl,bman"); + if (!dn) + pr_err("No bman device node available"); + + if (bman_init_ccsr(dn)) + pr_err("BMan CCSR map failed."); + } + + done = 1; + return 0; +} + +#define BMAN_POOL_CONTENT(n) (0x0600 + ((n) * 0x04)) +u32 bm_pool_free_buffers(u32 bpid) +{ + return in_be32(bman_ccsr_map + BMAN_POOL_CONTENT(bpid)); +} + +static u32 __generate_thresh(u32 val, int roundup) +{ + u32 e = 0; /* co-efficient, exponent */ + int oddbit = 0; + + while (val > 0xff) { + oddbit = val & 1; + val >>= 1; + e++; + if (roundup && oddbit) + val++; + } + DPAA_ASSERT(e < 0x10); + return (val | (e << 8)); +} + +#define POOL_SWDET(n) (0x0000 + ((n) * 0x04)) +#define POOL_HWDET(n) (0x0100 + ((n) * 0x04)) +#define POOL_SWDXT(n) (0x0200 + ((n) * 0x04)) +#define POOL_HWDXT(n) (0x0300 + ((n) * 0x04)) +int bm_pool_set(u32 bpid, const u32 *thresholds) +{ + if (!bman_ccsr_map) + return -ENODEV; + if (bpid >= bman_pool_max) + return -EINVAL; + out_be32(bman_ccsr_map + POOL_SWDET(bpid), + __generate_thresh(thresholds[0], 0)); + out_be32(bman_ccsr_map + POOL_SWDXT(bpid), + __generate_thresh(thresholds[1], 1)); + out_be32(bman_ccsr_map + POOL_HWDET(bpid), + __generate_thresh(thresholds[2], 0)); + out_be32(bman_ccsr_map + POOL_HWDXT(bpid), + __generate_thresh(thresholds[3], 1)); + return 0; +} + +#define BMAN_LOW_DEFAULT_THRESH 0x40 +#define BMAN_HIGH_DEFAULT_THRESH 0x80 +int bm_pool_set_hw_threshold(u32 bpid, const u32 low_thresh, + const u32 high_thresh) +{ + if (!bman_ccsr_map) + return -ENODEV; + if (bpid >= bman_pool_max) + return -EINVAL; + if (low_thresh && high_thresh) { + out_be32(bman_ccsr_map + POOL_HWDET(bpid), + __generate_thresh(low_thresh, 0)); + out_be32(bman_ccsr_map + POOL_HWDXT(bpid), + __generate_thresh(high_thresh, 1)); + } else { + out_be32(bman_ccsr_map + POOL_HWDET(bpid), + __generate_thresh(BMAN_LOW_DEFAULT_THRESH, 0)); + out_be32(bman_ccsr_map + POOL_HWDXT(bpid), + __generate_thresh(BMAN_HIGH_DEFAULT_THRESH, 1)); + } + return 0; +} diff --git a/drivers/bus/dpaa/base/qbman/bman_priv.h b/drivers/bus/dpaa/base/qbman/bman_priv.h new file mode 100644 index 0000000..07d9cec --- /dev/null +++ b/drivers/bus/dpaa/base/qbman/bman_priv.h @@ -0,0 +1,125 @@ +/*- + * This file is provided under a dual BSD/GPLv2 license. When using or + * redistributing this file, you may do so under either license. + * + * BSD LICENSE + * + * Copyright 2008-2016 Freescale Semiconductor Inc. + * Copyright 2017 NXP. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the above-listed copyright holders nor the + * names of any contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * GPL LICENSE SUMMARY + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __BMAN_PRIV_H +#define __BMAN_PRIV_H + +#include "dpaa_sys.h" +#include + +/* Revision info (for errata and feature handling) */ +#define BMAN_REV10 0x0100 +#define BMAN_REV20 0x0200 +#define BMAN_REV21 0x0201 + +#define BMAN_PORTAL_IRQ_PATH "/dev/fsl-usdpaa-irq" +#define BMAN_CCSR_MAP "/dev/mem" + +/* This mask contains all the "irqsource" bits visible to API users */ +#define BM_PIRQ_VISIBLE (BM_PIRQ_RCRI | BM_PIRQ_BSCN) + +/* These are bm__(). So for example, bm_disable_write() means "write + * the disable register" rather than "disable the ability to write". + */ +#define bm_isr_status_read(bm) __bm_isr_read(bm, bm_isr_status) +#define bm_isr_status_clear(bm, m) __bm_isr_write(bm, bm_isr_status, m) +#define bm_isr_enable_read(bm) __bm_isr_read(bm, bm_isr_enable) +#define bm_isr_enable_write(bm, v) __bm_isr_write(bm, bm_isr_enable, v) +#define bm_isr_disable_read(bm) __bm_isr_read(bm, bm_isr_disable) +#define bm_isr_disable_write(bm, v) __bm_isr_write(bm, bm_isr_disable, v) +#define bm_isr_inhibit(bm) __bm_isr_write(bm, bm_isr_inhibit, 1) +#define bm_isr_uninhibit(bm) __bm_isr_write(bm, bm_isr_inhibit, 0) + +/* + * Global variables of the max portal/pool number this bman version supported + */ +extern u16 bman_pool_max; + +/* used by CCSR and portal interrupt code */ +enum bm_isr_reg { + bm_isr_status = 0, + bm_isr_enable = 1, + bm_isr_disable = 2, + bm_isr_inhibit = 3 +}; + +struct bm_portal_config { + /* + * Corenet portal addresses; + * [0]==cache-enabled, [1]==cache-inhibited. + */ + void __iomem *addr_virt[2]; + /* Allow these to be joined in lists */ + struct list_head list; + /* User-visible portal configuration settings */ + /* This is used for any "core-affine" portals, ie. default portals + * associated to the corresponding cpu. -1 implies that there is no + * core affinity configured. + */ + int cpu; + /* portal interrupt line */ + int irq; + /* the unique index of this portal */ + u32 index; + /* Is this portal shared? (If so, it has coarser locking and demuxes + * processing on behalf of other CPUs.). + */ + int is_shared; + /* These are the buffer pool IDs that may be used via this portal. */ + struct bman_depletion mask; + +}; + +int bman_init_ccsr(const struct device_node *node); + +struct bman_portal *bman_create_affine_portal( + const struct bm_portal_config *config); +const struct bm_portal_config *bman_destroy_affine_portal(void); + +/* Set depletion thresholds associated with a buffer pool. Requires that the + * operating system have access to Bman CCSR (ie. compiled in support and + * run-time access courtesy of the device-tree). + */ +int bm_pool_set(u32 bpid, const u32 *thresholds); + +/* Read the free buffer count for a given buffer */ +u32 bm_pool_free_buffers(u32 bpid); + +#endif /* __BMAN_PRIV_H */ diff --git a/drivers/bus/dpaa/include/fsl_bman.h b/drivers/bus/dpaa/include/fsl_bman.h new file mode 100644 index 0000000..383106b --- /dev/null +++ b/drivers/bus/dpaa/include/fsl_bman.h @@ -0,0 +1,375 @@ +/*- + * This file is provided under a dual BSD/GPLv2 license. When using or + * redistributing this file, you may do so under either license. + * + * BSD LICENSE + * + * Copyright 2008-2012 Freescale Semiconductor, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the above-listed copyright holders nor the + * names of any contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * GPL LICENSE SUMMARY + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __FSL_BMAN_H +#define __FSL_BMAN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* This wrapper represents a bit-array for the depletion state of the 64 Bman + * buffer pools. + */ +struct bman_depletion { + u32 state[2]; +}; + +static inline void bman_depletion_init(struct bman_depletion *c) +{ + c->state[0] = c->state[1] = 0; +} + +static inline void bman_depletion_fill(struct bman_depletion *c) +{ + c->state[0] = c->state[1] = ~0; +} + +/* --- Bman data structures (and associated constants) --- */ + +/* Represents s/w corenet portal mapped data structures */ +struct bm_rcr_entry; /* RCR (Release Command Ring) entries */ +struct bm_mc_command; /* MC (Management Command) command */ +struct bm_mc_result; /* MC result */ + +/* Code-reduction, define a wrapper for 48-bit buffers. In cases where a buffer + * pool id specific to this buffer is needed (BM_RCR_VERB_CMD_BPID_MULTI, + * BM_MCC_VERB_ACQUIRE), the 'bpid' field is used. + */ +struct bm_buffer { + union { + struct { +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + u8 __reserved1; + u8 bpid; + u16 hi; /* High 16-bits of 48-bit address */ + u32 lo; /* Low 32-bits of 48-bit address */ +#else + u32 lo; + u16 hi; + u8 bpid; + u8 __reserved; +#endif + }; + struct { +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + u64 __notaddress:16; + u64 addr:48; +#else + u64 addr:48; + u64 __notaddress:16; +#endif + }; + u64 opaque; + }; +} __attribute__((aligned(8))); +static inline u64 bm_buffer_get64(const struct bm_buffer *buf) +{ + return buf->addr; +} + +static inline dma_addr_t bm_buf_addr(const struct bm_buffer *buf) +{ + return (dma_addr_t)buf->addr; +} + +#define bm_buffer_set64(buf, v) \ + do { \ + struct bm_buffer *__buf931 = (buf); \ + __buf931->hi = upper_32_bits(v); \ + __buf931->lo = lower_32_bits(v); \ + } while (0) + +/* See 1.5.3.5.4: "Release Command" */ +struct bm_rcr_entry { + union { + struct { + u8 __dont_write_directly__verb; + u8 bpid; /* used with BM_RCR_VERB_CMD_BPID_SINGLE */ + u8 __reserved1[62]; + }; + struct bm_buffer bufs[8]; + }; +} __packed; +#define BM_RCR_VERB_VBIT 0x80 +#define BM_RCR_VERB_CMD_MASK 0x70 /* one of two values; */ +#define BM_RCR_VERB_CMD_BPID_SINGLE 0x20 +#define BM_RCR_VERB_CMD_BPID_MULTI 0x30 +#define BM_RCR_VERB_BUFCOUNT_MASK 0x0f /* values 1..8 */ + +/* See 1.5.3.1: "Acquire Command" */ +/* See 1.5.3.2: "Query Command" */ +struct bm_mcc_acquire { + u8 bpid; + u8 __reserved1[62]; +} __packed; +struct bm_mcc_query { + u8 __reserved2[63]; +} __packed; +struct bm_mc_command { + u8 __dont_write_directly__verb; + union { + struct bm_mcc_acquire acquire; + struct bm_mcc_query query; + }; +} __packed; +#define BM_MCC_VERB_VBIT 0x80 +#define BM_MCC_VERB_CMD_MASK 0x70 /* where the verb contains; */ +#define BM_MCC_VERB_CMD_ACQUIRE 0x10 +#define BM_MCC_VERB_CMD_QUERY 0x40 +#define BM_MCC_VERB_ACQUIRE_BUFCOUNT 0x0f /* values 1..8 go here */ + +/* See 1.5.3.3: "Acquire Response" */ +/* See 1.5.3.4: "Query Response" */ +struct bm_pool_state { + u8 __reserved1[32]; + /* "availability state" and "depletion state" */ + struct { + u8 __reserved1[8]; + /* Access using bman_depletion_***() */ + struct bman_depletion state; + } as, ds; +}; + +struct bm_mc_result { + union { + struct { + u8 verb; + u8 __reserved1[63]; + }; + union { + struct { + u8 __reserved1; + u8 bpid; + u8 __reserved2[62]; + }; + struct bm_buffer bufs[8]; + } acquire; + struct bm_pool_state query; + }; +} __packed; +#define BM_MCR_VERB_VBIT 0x80 +#define BM_MCR_VERB_CMD_MASK BM_MCC_VERB_CMD_MASK +#define BM_MCR_VERB_CMD_ACQUIRE BM_MCC_VERB_CMD_ACQUIRE +#define BM_MCR_VERB_CMD_QUERY BM_MCC_VERB_CMD_QUERY +#define BM_MCR_VERB_CMD_ERR_INVALID 0x60 +#define BM_MCR_VERB_CMD_ERR_ECC 0x70 +#define BM_MCR_VERB_ACQUIRE_BUFCOUNT BM_MCC_VERB_ACQUIRE_BUFCOUNT /* 0..8 */ + +/* Portal and Buffer Pools */ +/* Represents a managed portal */ +struct bman_portal; + +/* This object type represents Bman buffer pools. */ +struct bman_pool; + +/* This struct specifies parameters for a bman_pool object. */ +struct bman_pool_params { + /* index of the buffer pool to encapsulate (0-63), ignored if + * BMAN_POOL_FLAG_DYNAMIC_BPID is set. + */ + u32 bpid; + /* bit-mask of BMAN_POOL_FLAG_*** options */ + u32 flags; + /* depletion-entry/exit thresholds, if BMAN_POOL_FLAG_THRESH is set. NB: + * this is only allowed if BMAN_POOL_FLAG_DYNAMIC_BPID is used *and* + * when run in the control plane (which controls Bman CCSR). This array + * matches the definition of bm_pool_set(). + */ + u32 thresholds[4]; +}; + +/* Flags to bman_new_pool() */ +#define BMAN_POOL_FLAG_NO_RELEASE 0x00000001 /* can't release to pool */ +#define BMAN_POOL_FLAG_ONLY_RELEASE 0x00000002 /* can only release to pool */ +#define BMAN_POOL_FLAG_DYNAMIC_BPID 0x00000008 /* (de)allocate bpid */ +#define BMAN_POOL_FLAG_THRESH 0x00000010 /* set depletion thresholds */ + +/* Flags to bman_release() */ +#define BMAN_RELEASE_FLAG_NOW 0x00000008 /* issue immediate release */ + + +/** + * bman_get_portal_index - get portal configuration index + */ +int bman_get_portal_index(void); + +/** + * bman_rcr_is_empty - Determine if portal's RCR is empty + * + * For use in situations where a cpu-affine caller needs to determine when all + * releases for the local portal have been processed by Bman but can't use the + * BMAN_RELEASE_FLAG_WAIT_SYNC flag to do this from the final bman_release(). + * The function forces tracking of RCR consumption (which normally doesn't + * happen until release processing needs to find space to put new release + * commands), and returns zero if the ring still has unprocessed entries, + * non-zero if it is empty. + */ +int bman_rcr_is_empty(void); + +/** + * bman_alloc_bpid_range - Allocate a contiguous range of BPIDs + * @result: is set by the API to the base BPID of the allocated range + * @count: the number of BPIDs required + * @align: required alignment of the allocated range + * @partial: non-zero if the API can return fewer than @count BPIDs + * + * Returns the number of buffer pools allocated, or a negative error code. If + * @partial is non zero, the allocation request may return a smaller range of + * BPs than requested (though alignment will be as requested). If @partial is + * zero, the return value will either be 'count' or negative. + */ +int bman_alloc_bpid_range(u32 *result, u32 count, u32 align, int partial); +static inline int bman_alloc_bpid(u32 *result) +{ + int ret = bman_alloc_bpid_range(result, 1, 0, 0); + + return (ret > 0) ? 0 : ret; +} + +/** + * bman_release_bpid_range - Release the specified range of buffer pool IDs + * @bpid: the base BPID of the range to deallocate + * @count: the number of BPIDs in the range + * + * This function can also be used to seed the allocator with ranges of BPIDs + * that it can subsequently allocate from. + */ +void bman_release_bpid_range(u32 bpid, unsigned int count); +static inline void bman_release_bpid(u32 bpid) +{ + bman_release_bpid_range(bpid, 1); +} + +int bman_reserve_bpid_range(u32 bpid, unsigned int count); +static inline int bman_reserve_bpid(u32 bpid) +{ + return bman_reserve_bpid_range(bpid, 1); +} + +void bman_seed_bpid_range(u32 bpid, unsigned int count); + +int bman_shutdown_pool(u32 bpid); + +/** + * bman_new_pool - Allocates a Buffer Pool object + * @params: parameters specifying the buffer pool ID and behaviour + * + * Creates a pool object for the given @params. A portal and the depletion + * callback field of @params are only used if the BMAN_POOL_FLAG_DEPLETION flag + * is set. NB, the fields from @params are copied into the new pool object, so + * the structure provided by the caller can be released or reused after the + * function returns. + */ +struct bman_pool *bman_new_pool(const struct bman_pool_params *params); + +/** + * bman_free_pool - Deallocates a Buffer Pool object + * @pool: the pool object to release + */ +void bman_free_pool(struct bman_pool *pool); + +/** + * bman_get_params - Returns a pool object's parameters. + * @pool: the pool object + * + * The returned pointer refers to state within the pool object so must not be + * modified and can no longer be read once the pool object is destroyed. + */ +const struct bman_pool_params *bman_get_params(const struct bman_pool *pool); + +/** + * bman_release - Release buffer(s) to the buffer pool + * @pool: the buffer pool object to release to + * @bufs: an array of buffers to release + * @num: the number of buffers in @bufs (1-8) + * @flags: bit-mask of BMAN_RELEASE_FLAG_*** options + * + */ +int bman_release(struct bman_pool *pool, const struct bm_buffer *bufs, u8 num, + u32 flags); + +/** + * bman_acquire - Acquire buffer(s) from a buffer pool + * @pool: the buffer pool object to acquire from + * @bufs: array for storing the acquired buffers + * @num: the number of buffers desired (@bufs is at least this big) + * + * Issues an "Acquire" command via the portal's management command interface. + * The return value will be the number of buffers obtained from the pool, or a + * negative error code if a h/w error or pool starvation was encountered. + */ +int bman_acquire(struct bman_pool *pool, struct bm_buffer *bufs, u8 num, + u32 flags); + +/** + * bman_query_pools - Query all buffer pool states + * @state: storage for the queried availability and depletion states + */ +int bman_query_pools(struct bm_pool_state *state); + +/** + * bman_query_free_buffers - Query how many free buffers are in buffer pool + * @pool: the buffer pool object to query + * + * Return the number of the free buffers + */ +u32 bman_query_free_buffers(struct bman_pool *pool); + +/** + * bman_update_pool_thresholds - Change the buffer pool's depletion thresholds + * @pool: the buffer pool object to which the thresholds will be set + * @thresholds: the new thresholds + */ +int bman_update_pool_thresholds(struct bman_pool *pool, const u32 *thresholds); + +/** + * bm_pool_set_hw_threshold - Change the buffer pool's thresholds + * @pool: Pool id + * @low_thresh: low threshold + * @high_thresh: high threshold + */ +int bm_pool_set_hw_threshold(u32 bpid, const u32 low_thresh, + const u32 high_thresh); + +#ifdef __cplusplus +} +#endif + +#endif /* __FSL_BMAN_H */ diff --git a/drivers/bus/dpaa/include/fsl_usd.h b/drivers/bus/dpaa/include/fsl_usd.h index a4897b0..a3243af 100644 --- a/drivers/bus/dpaa/include/fsl_usd.h +++ b/drivers/bus/dpaa/include/fsl_usd.h @@ -50,7 +50,9 @@ extern "C" { /* Thread-entry/exit hooks; */ int qman_thread_init(void); +int bman_thread_init(void); int qman_thread_finish(void); +int bman_thread_finish(void); #define QBMAN_ANY_PORTAL_IDX 0xffffffff @@ -92,9 +94,12 @@ int bman_free_raw_portal(struct dpaa_raw_portal *portal); * into another blocking read/select/poll. */ void qman_thread_irq(void); +void bman_thread_irq(void); /* Global setup */ int qman_global_init(void); +int bman_global_init(void); + #ifdef __cplusplus } #endif -- 2.7.4