From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM03-CO1-obe.outbound.protection.outlook.com (mail-co1nam03on0077.outbound.protection.outlook.com [104.47.40.77]) by dpdk.org (Postfix) with ESMTP id 62907FA3C for ; Sun, 4 Dec 2016 13:44:16 +0100 (CET) Received: from CY1PR03CA0017.namprd03.prod.outlook.com (10.174.128.27) by DM2PR0301MB0751.namprd03.prod.outlook.com (10.160.97.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.734.8; Sun, 4 Dec 2016 12:44:14 +0000 Received: from BL2FFO11OLC015.protection.gbl (2a01:111:f400:7c09::128) by CY1PR03CA0017.outlook.office365.com (2603:10b6:600::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.761.9 via Frontend Transport; Sun, 4 Dec 2016 12:44:14 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com;nxp.com; dkim=none (message not signed) header.d=none; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BL2FFO11OLC015.mail.protection.outlook.com (10.173.160.81) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.734.4 via Frontend Transport; Sun, 4 Dec 2016 12:44:13 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:; UpperCasedChecksum:; SizeAsReceived:704; Count:10 Received: from bf-netperf1.idc ([10.232.134.28]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id uB4ChXbH032240; Sun, 4 Dec 2016 05:44:11 -0700 From: Hemant Agrawal To: CC: , , , Hemant Agrawal Date: Sun, 4 Dec 2016 23:47:09 +0530 Message-ID: <1480875447-23680-15-git-send-email-hemant.agrawal@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1480875447-23680-1-git-send-email-hemant.agrawal@nxp.com> References: <1480875447-23680-1-git-send-email-hemant.agrawal@nxp.com> X-IncomingHeaderCount: 10 X-EOPAttributedMessage: 0 X-Matching-Connectors: 131253290537986337; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(7916002)(2980300002)(1109001)(1110001)(339900001)(336004)(189002)(199003)(305945005)(85426001)(2950100002)(5660300001)(8676002)(106466001)(38730400001)(356003)(2906002)(6916009)(81166006)(39450400002)(8666005)(77096006)(7846002)(39380400001)(575784001)(39400400001)(104016004)(626004)(81156014)(39410400001)(110136003)(50226002)(92566002)(4326007)(97736004)(76176999)(36756003)(50466002)(86362001)(68736007)(47776003)(105606002)(189998001)(33646002)(5003940100001)(50986999)(2351001)(551934003)(8936002)(48376002)(7059030); DIR:OUT; SFP:1101; SCL:1; SRVR:DM2PR0301MB0751; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11OLC015; 1:o7hWNAIveGclwMYaY23ziFW6yMW8uso2FcE+KT+NsbUjZ7WMrclQLXixQaRl0hUa6D98Nnym5+1KDk6rKswVDmzg9mz+C0wGMibSt6Mx6d/cUe5wCU8oetXSW69vIb5s0PiAWjZl2OUwkcn7PnTS7KP+fTmNDLpEkzcc4fjk6KPy5ZjIjc0ap2fiwkmPY7U2VrWYAdX6URfPePs1hMkoenL9f5qGAV7qqfjxlkgbni9RQYZT0cniTbezrNoYfjS+UR+vewtbjOGm7VVc/NOgiIhHkyKidQn023YP6erBaycLUEj4k4eYZBzn7nqmY2+LG5/nfTnw5nSA0RSMrLojRgBR0dgvv8H7PQH0hmE9Bd5kBDmL5m/wHYxX97MImGqITeAdXkrMRnaOXpBNxjNuJq0sbh9SHcnnFCvv8XJ8xRkT5XIH7g8BuZ0wAfeVdoj+ErjFlVyh5u1D0joU4BbOhRnQAEb3jMUC1nAR8R8cn/0ucGPcvnCddMq1YkxWclGVzH7hh5Re/iYnBpeG2fEgVpX1eKPIZ503D+axrKUtiP2t3JhcpmTBb6MnhOheeP62uQ3ZHNIhf79PldEOx5YcKVKWJ4o/hpGTO0BA1+i18Uowr75f0hXSOPpfY36sjP6v8VZp5hbsikbewRpVh4QDaIge97eCbmmWByTLbtGSuiUgwxjMc84VRwKj5eDYs9zmrwoqfRyWMJlPbIivCGswZX/CBsU9n7X7nECjm/6UrpMyJodHcMo7nxMqzjTMnz74xErUxCdo5lwglA5g1O4zLA== MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0751; 2:WZb+OsnIQMZaIkbkVeGz3hFkktetQF+v+I4kyr5ZPANy3buL1hOTSABAvdpTEUtpBN2afiMXjNWw57x3j/byvTLmyCXs5Ok3Un4wEOD9sqS+JAM2xvJ7aVRWTWtl4UNqqdXjmB6tm9W7VlvrGl+HXHH5O9A84AWUmK1OVYjk5PE=; 3:hvBXhChH5VXlnaY6iRDsjh9z5L5xA+cKSzzrS+p7dN2crjZADvCoBkumpIit3SEMOT+SLwpy+4DBM2NoLifvAbhOqhNcC22j5xOehDv7UUlPRMkZBpcoH4MWg3v3kXAHd+GQHcjU7MJAT4nWiBSk1cccP0UTc5IRPVYo+dQKn+t3Iha7n8jOK926xS+/rgkBuVaLF+SpAbKaAu/6QBj+wjAXy1vOR30a9/xtPAq5fwqgr8LzYrvaINZmZve4knOqhWHF2G8DcwRpsFbJxyieVQ== X-MS-Office365-Filtering-Correlation-Id: 8089db53-adfc-48d1-c7c4-08d41c434092 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:DM2PR0301MB0751; X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0751; 25:dDCFCqHHCoYhlHETF9Ep6HlslGlmSZHc4t4u97Tgov3sezuaN/iXCLp2TRqYceWRBPTin0R/S6iTxJxsBd/TkxUEnAttrTYDg1uwOz/o9D+FrG+HpNcG7ZC22K7PAM8g0sAkAEJKhM1BKknW1k8xQLbSrD0XKzaicNDe5iMyUm5Lmp7Ww5h4MtaN3bCkRjhFoqNBGOH09EBV29VjZL/CLdMHO9cTwoV86kLhG+03mHupUy9/lSumyvFyGtbKhy/44HSCkXB4IHYDGdZ5YPIti+6AMfnFqaBsxe7OeLflaQUKk4W40z3KbNfDTsjGSnf+6dLHJ/9swNdeH/X/CDX9n4xoeshVFyGyGJLdK1J9AFbxFlpVKAjp+lca0FNWkwpKtshd1Bc7oQWe2fPfxr7Ruhgu7DfP3mY7rBWhOl8XOm57m/bToD5FpgZEFVtH/4eTZicgqENmCOXBnDsqzHDBYUAwH9BJGxeJ4zd155KI0kGzwzb8pxiUGdYBI64Ka/fSsJodHTzHX1bApVypalas++fIU57sBYn8fbWn0O52ceIu62hEjmhoe21/r2CW+v2uMoiNujrxBDS6/uQc60xFULnYxmTCIRzknK+RooYv0IshPjPTBALgzYYIQotzRpDR6mnOewPOMcm0pum+uqu2vwn7CmUqzWBeRLrwQ+/2oDKmOMyw5RLfAQcZG38l0gAaoaQksGlWObBC8N/r79rGFVshBVVwha5ohtgu89WskUOCZ6xO4sB4+CKmnIESVZt242qT0sv9lDzCdTC1EAxNSw== X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0751; 31:cPUtpds0auTvBhaqHgHReG9mAQ0cm9R8A7PM66xums6THfJ5vkBkWCryu1wQqYCjtvgjnHdW+uBXjKf7N0/xQIWxUpyEGaGEaYWie6Czts9id4xCyW3xmo3biEeO7tkuLnZApkuzIsqaDu+4iidkdhT0gdDbbEUpMb9d0tItqj/8o6JTRa9pbvsB9+5M0Ns4ceTverdcQElNI6ws4X6liOB7Y/1RBH9gnRPMwUaqSY0z8nq1RK/41jINK5YuUknc7Yp6ioPACR88l1Q+8yIKBkpodJule8gl9dDYrFi+tQU= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(275809806118684); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095060)(601004)(2401047)(13017025)(13018025)(13023025)(13015025)(5005006)(13024025)(8121501046)(10201501046)(3002001)(6055026)(6096035)(20161123559025)(20161123565025)(20161123563025)(20161123556025)(20161123561025); SRVR:DM2PR0301MB0751; BCL:0; PCL:0; RULEID:(400006); SRVR:DM2PR0301MB0751; X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0751; 4:seu1ADgJOIzQB//QQK9KybvI/aAPci2f/cftYbrsuQH5ISB7Xm6n9fkRBGt2zGPx7/rmC90zut/bujomc7paRYamJDSCenmv1W5vxbr7vuqfg8Z0X31cKMAEHxEQn16/OrTChwQV5cDng9hStUVtzuPLZ8UHCQQn/KJtRn5c8hJpTpRIN4TmpWhm3sDJhpjz2jC4B+CKutcioi/SqjtWzpm7olqnVKPnu/Aoe9yo4cmMPnj154COjtNBW12yIw1HMiN7ijIAeFGExyHnJvt1ST1lNTKJ08H3dkByqhuuUhi5hr4oLyVQoYi5dmBxyNkubYYovXQ/a79zo+kDaNBW71bNo8PEj0uoBQVJyi9RukEuy1rIKhnwudBfcXYSJpsd7W+WPiRfmEJoXNVHkjJkCjhi903Ik2FWd8dFbBeFLW4RK6bW/Jj6Pd4LMtfahKO3moYYoozw9No38hBUrDX/h6XXFtEXJU30gGZp1DL++GGx1QBNBWqWugd2eJAhVF2sFZ6pL3B70f4JXbiaWXZEDtniEs0bK/vjRd1YG9TQ6dUiRJ6bo7t62c11/UE1cdu9YytL3sXCloUE1XO901aO4paHv66JyKOOH6J+I0Ue6X+Bbpc/sHcYC4DwqIMcSMh+7AVlsXjh5UkEvLR/Fw5xh3TjrQWqPbdWGOjNDmI3GA6IerU5yX3fzh/xOYyGsMF/PIueRKyZsaj8MfnQ2sf7kWentvdrtfNV/RiX+sdXSoP/CnunEyK2XOTTDIFavgWNf0PsJHWpdP8NOCUUZf1PUg== X-Forefront-PRVS: 014617085B X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM2PR0301MB0751; 23:mRU4RGtRteAtqg0kxNVkX5XxRHHe5ic/50kpK33?= =?us-ascii?Q?WeA8SmMnN623AswMAV/auJWGX3m63VBv9NfnTk28DzeilSsTxOKi2q/TzKmv?= =?us-ascii?Q?n9YqbuTRwx+C2mf06vgLH283EMmnTUg3ry9XJb0/NZOw0UGZXU3dgWEcJ1VJ?= =?us-ascii?Q?aycKBfgozYqi72qlxtJbGk1+8Bp8j1b7oeao+EF0IeOPwlis2MllxZ+iTR+3?= =?us-ascii?Q?UNAovu2bJIpGSUCZyshNkMc9G4R6ey0EtWbcTl15uL9CtMvkCNA1DhyWhilE?= =?us-ascii?Q?f7AGod5Jw7XpwyZJpTsfrvbepoY1BhQq2Akej7E/0uCwAxNRhcnvvc72++f9?= =?us-ascii?Q?4gLYhV3GDJhgjqaR6zckIWrjusPtdovaHtJ6efxnWXGIeeSsTbAu1OgKiTXn?= =?us-ascii?Q?bmqwWwuqMONWXxorfWJOYkaCSznQsEpnE7Py9iRBFFc0MSw44Z2RNN/EY5++?= =?us-ascii?Q?luWGCm/2CM9JMr6gOJCxeVWQ12qay6VgAPyfTNmrXlR69F90rErgZ19bYIxV?= =?us-ascii?Q?Oiv6iA4sUVsG6gqP0SrImWQOBPKgdZOq16lpjAwrw8Dh545IT28WWYUOSFKc?= =?us-ascii?Q?/HvCVG7BdtNfTuMlooFFXJYHweMO/4ZqlITFLoG5hhZWKaK4MCODmfd3KJ0a?= =?us-ascii?Q?ng6W8gAV6Z38RcYdTvPvun2PmZJ/tWODrpe2n+ijeI7f92xsJzEHXGJPrljx?= =?us-ascii?Q?2t5Ik9QGNDgBe7Uo+bdfTZrVTYoDLc/EV3ApwEto1aoP70Otc1DpSte3cJY9?= =?us-ascii?Q?gQj0aSydjVRLa/EjNQH6AYbi7PUYe3E7Yq0Dl62BXXznPzy7ajwaZhDpG3Rj?= =?us-ascii?Q?NpSg3WaTM6zSIen5Wkhs6M7M0/clEXdAd/hE8+KleDnifJz/PnfuzkAbYuIQ?= =?us-ascii?Q?LqOfoOm2490BravUHEnFpUx+FIFatfBzIXbumbap8QigrmQhfZcgEz0c1POA?= =?us-ascii?Q?MNI0rkLcjFWlOgbqh+p8tBTW0rVMAQZZdoUq/DqnixPFabIZgprM0ySPWjlu?= =?us-ascii?Q?KSMBLVQuXRVlzVOtr1JSK8m2L7Wnmaak2NWAKjkKDq48jJHi9jppDdIIedmo?= =?us-ascii?Q?B2bUnI7PuhI86hBQiABryiCFvf77yPfZ1Px5FQqRMs852mWh5H3umlehMMa9?= =?us-ascii?Q?bDs14KUOBd3MMB3shxeks5W8HyLmAbd933rtdujrjsgJifVxpUaNHj7lrxwL?= =?us-ascii?Q?crhm+YhjQJiyy2uwxAKndqokrS1TYxJ6TAqyazi2qMptL66FwJS89LRkwWlc?= =?us-ascii?Q?jNm11HVHVjOawSKdandI=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0751; 6:aL/iyTMGyZTnMWgOaxRTryN8t2xykfC9/iAA1Iwq+R7mVmLuJdiQTG7s45LTNf0QeF2qIo98PNDUqp5sswhg48X/+iF7/Yrxqexu46QUTPr3LJ4XtWvo8+Tsh2RXxZ8WenYXj3vHuVw6rLcPtdogB+BDJSGryMGAVUFgXlvj1rx0E66skuiBj1zC6OfU+o6WrvXHT7U6r1izeQAjUhD3tqk9m9XCtc4kXHUf+W9DTlvN4Yi4ZuOr7odp2c1XFn/7THFFeY50LurnqpAcczKIDdXvaKfYeGKXN+2S44WnHPAgnmK8sNzvENoE74t4fWqTCjMNc4ISIAXXsYtClBF+Tg==; 5:Djn3usC+XoN2KjoLbxGEbeqdjnpSp6Qs5AmGk3fq4rl3sXq8wivuofg12DHq+XgzOdscBcfP9D1UUB/Wd1DctfVXhmK5NY+VyGq+piBg0ORj5h7hYQAAFXy8SuYmFXigCBkC6H6oqo2myxSf+phTrq9JyT7V2Quy5PbpLWWD14MYzbRNflB8SiCgSrT2cyEP; 24:heVbHSAZa+MaC622unMBor+VM7UwGW8+fPxhJo+1HST+Zge06EFw1LipZHK62bMRvPnGS3UM1BAH8WMC7V+gx8OY+SNpESjA+s/TMt+7hkI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0751; 7:Qk7sOBBo24YwEU5cPq7IT4qmMjCbSrPvH7eeFiWVzYIsrWIn4XInYTn3u11/4D0jmxtsyOKU84y5LjtaZjRz534b5+qx4VzZRvLs2/UBMohg1njN8UGMH/VcekONLbBlJWKdZpc3wHXgAjXQKN0LQRD9RIBlwqJPalLkkaTqyvzEVllg9LYvNL+JGo+o3sWRaKuVRkD0mHKit+hPCNvTIIAh2zjD7NyX7BouSQlfFwfkPY+3pv10UXxqkKkgJZyxUG8pOWd9ouP0sMzfsHnA2Ck72saluF8qY26YOZcQbHf0JRlQzmJ6juXtoSL1RxURT4DwMq9Ymqv8Fdowb6zXVvPc+rT6Twa1O0WToN4i6+E= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Dec 2016 12:44:13.6114 (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.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR0301MB0751 Subject: [dpdk-dev] [PATCH 14/32] net/dpaa2: dpio object driver 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: Sun, 04 Dec 2016 12:44:17 -0000 Signed-off-by: Hemant Agrawal --- drivers/net/dpaa2/Makefile | 4 +- drivers/net/dpaa2/base/dpaa2_hw_dpio.c | 362 +++++++++++++++++++++++++++++++++ drivers/net/dpaa2/base/dpaa2_hw_dpio.h | 65 ++++++ drivers/net/dpaa2/base/dpaa2_hw_pvt.h | 68 +++++++ drivers/net/dpaa2/dpaa2_vfio.c | 39 +++- 5 files changed, 536 insertions(+), 2 deletions(-) create mode 100644 drivers/net/dpaa2/base/dpaa2_hw_dpio.c create mode 100644 drivers/net/dpaa2/base/dpaa2_hw_dpio.h create mode 100644 drivers/net/dpaa2/base/dpaa2_hw_pvt.h diff --git a/drivers/net/dpaa2/Makefile b/drivers/net/dpaa2/Makefile index 3032708..b04c3d2 100644 --- a/drivers/net/dpaa2/Makefile +++ b/drivers/net/dpaa2/Makefile @@ -44,6 +44,8 @@ CFLAGS += $(WERROR_FLAGS) endif CFLAGS += -I$(RTE_SDK)/drivers/net/dpaa2 +CFLAGS += -I$(RTE_SDK)/drivers/common/dpaa2/mc +CFLAGS += -I$(RTE_SDK)/drivers/common/dpaa2/qbman/include CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common/ CFLAGS += -I$(RTE_SDK)/lib/librte_eal/linuxapp/eal @@ -53,7 +55,7 @@ EXPORT_MAP := rte_pmd_dpaa2_version.map # library version LIBABIVER := 1 - +SRCS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += base/dpaa2_hw_dpio.c SRCS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += dpaa2_vfio.c # Interfaces with DPDK SRCS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += dpaa2_bus.c diff --git a/drivers/net/dpaa2/base/dpaa2_hw_dpio.c b/drivers/net/dpaa2/base/dpaa2_hw_dpio.c new file mode 100644 index 0000000..4a0a638 --- /dev/null +++ b/drivers/net/dpaa2/base/dpaa2_hw_dpio.c @@ -0,0 +1,362 @@ +/*- + * BSD LICENSE + * + * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. + * Copyright (c) 2016 NXP. All rights reserved. + * + * 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 Freescale Semiconductor, Inc nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 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 + * OWNER 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dpaa2_logs.h" +#include +#include + +#define NUM_HOST_CPUS RTE_MAX_LCORE + +struct dpaa2_io_portal_t dpaa2_io_portal[RTE_MAX_LCORE]; +RTE_DEFINE_PER_LCORE(struct dpaa2_io_portal_t, _dpaa2_io); + +TAILQ_HEAD(dpio_device_list, dpaa2_dpio_dev); +static struct dpio_device_list *dpio_dev_list; /*!< DPIO device list */ +static uint32_t io_space_count; + +/*Stashing Macros default for LS208x*/ +static int dpaa2_core_cluster_base = 0x04; +static int dpaa2_cluster_sz = 2; + +/* For LS208X platform There are four clusters with following mapping: + * Cluster 1 (ID = x04) : CPU0, CPU1; + * Cluster 2 (ID = x05) : CPU2, CPU3; + * Cluster 3 (ID = x06) : CPU4, CPU5; + * Cluster 4 (ID = x07) : CPU6, CPU7; + */ +/* For LS108X platform There are two clusters with following mapping: + * Cluster 1 (ID = x02) : CPU0, CPU1, CPU2, CPU3; + * Cluster 2 (ID = x03) : CPU4, CPU5, CPU6, CPU7; + */ + +/* Set the STASH Destination depending on Current CPU ID. + e.g. Valid values of SDEST are 4,5,6,7. Where, + CPU 0-1 will have SDEST 4 + CPU 2-3 will have SDEST 5.....and so on. +*/ +static int +dpaa2_core_cluster_sdest(int cpu_id) +{ + int x = cpu_id / dpaa2_cluster_sz; + + if (x > 3) + x = 3; + + return dpaa2_core_cluster_base + x; +} + +static int +configure_dpio_qbman_swp(struct dpaa2_dpio_dev *dpio_dev) +{ + struct qbman_swp_desc p_des; + struct dpio_attr attr; + + dpio_dev->dpio = malloc(sizeof(struct fsl_mc_io)); + if (!dpio_dev->dpio) { + PMD_INIT_LOG(ERR, "Memory allocation failure\n"); + return -1; + } + + PMD_DRV_LOG(DEBUG, "\t Allocated DPIO Portal[%p]", dpio_dev->dpio); + dpio_dev->dpio->regs = dpio_dev->mc_portal; + if (dpio_open(dpio_dev->dpio, CMD_PRI_LOW, dpio_dev->hw_id, + &dpio_dev->token)) { + PMD_INIT_LOG(ERR, "Failed to allocate IO space\n"); + free(dpio_dev->dpio); + return -1; + } + + if (dpio_reset(dpio_dev->dpio, CMD_PRI_LOW, dpio_dev->token)) { + PMD_INIT_LOG(ERR, "Failed to reset dpio\n"); + dpio_close(dpio_dev->dpio, CMD_PRI_LOW, dpio_dev->token); + free(dpio_dev->dpio); + return -1; + } + + if (dpio_enable(dpio_dev->dpio, CMD_PRI_LOW, dpio_dev->token)) { + PMD_INIT_LOG(ERR, "Failed to Enable dpio\n"); + dpio_close(dpio_dev->dpio, CMD_PRI_LOW, dpio_dev->token); + free(dpio_dev->dpio); + return -1; + } + + if (dpio_get_attributes(dpio_dev->dpio, CMD_PRI_LOW, + dpio_dev->token, &attr)) { + PMD_INIT_LOG(ERR, "DPIO Get attribute failed\n"); + dpio_disable(dpio_dev->dpio, CMD_PRI_LOW, dpio_dev->token); + dpio_close(dpio_dev->dpio, CMD_PRI_LOW, dpio_dev->token); + free(dpio_dev->dpio); + return -1; + } + + PMD_INIT_LOG(DEBUG, "Qbman Portal ID %d", attr.qbman_portal_id); + PMD_INIT_LOG(DEBUG, "Portal CE adr 0x%lX", attr.qbman_portal_ce_offset); + PMD_INIT_LOG(DEBUG, "Portal CI adr 0x%lX", attr.qbman_portal_ci_offset); + + /* Configure & setup SW portal */ + p_des.block = NULL; + p_des.idx = attr.qbman_portal_id; + p_des.cena_bar = (void *)(dpio_dev->qbman_portal_ce_paddr); + p_des.cinh_bar = (void *)(dpio_dev->qbman_portal_ci_paddr); + p_des.irq = -1; + p_des.qman_version = attr.qbman_version; + + dpio_dev->sw_portal = qbman_swp_init(&p_des); + if (dpio_dev->sw_portal == NULL) { + PMD_DRV_LOG(ERR, " QBMan SW Portal Init failed\n"); + dpio_close(dpio_dev->dpio, CMD_PRI_LOW, dpio_dev->token); + free(dpio_dev->dpio); + return -1; + } + + PMD_INIT_LOG(DEBUG, "QBMan SW Portal 0x%p\n", dpio_dev->sw_portal); + + return 0; +} + +static int +dpaa2_configure_stashing(struct dpaa2_dpio_dev *dpio_dev) +{ + int sdest; + int cpu_id, ret; + + /* Set the Stashing Destination */ + cpu_id = rte_lcore_id(); + if (cpu_id < 0) { + cpu_id = rte_get_master_lcore(); + if (cpu_id < 0) { + RTE_LOG(ERR, PMD, "\tGetting CPU Index failed\n"); + return -1; + } + } + /* Set the STASH Destination depending on Current CPU ID. + Valid values of SDEST are 4,5,6,7. Where, + CPU 0-1 will have SDEST 4 + CPU 2-3 will have SDEST 5.....and so on. + */ + + sdest = dpaa2_core_cluster_sdest(cpu_id); + PMD_DRV_LOG(DEBUG, "Portal= %d CPU= %u SDEST= %d", + dpio_dev->index, cpu_id, sdest); + + ret = dpio_set_stashing_destination(dpio_dev->dpio, CMD_PRI_LOW, + dpio_dev->token, sdest); + if (ret) { + PMD_DRV_LOG(ERR, "%d ERROR in SDEST\n", ret); + return -1; + } + + return 0; +} + +static inline struct dpaa2_dpio_dev *dpaa2_get_qbman_swp(void) +{ + struct dpaa2_dpio_dev *dpio_dev = NULL; + int ret; + + /* Get DPIO dev handle from list using index */ + TAILQ_FOREACH(dpio_dev, dpio_dev_list, next) { + if (dpio_dev && rte_atomic16_test_and_set(&dpio_dev->ref_count)) + break; + } + if (!dpio_dev) + return NULL; + + PMD_DRV_LOG(DEBUG, "New Portal=0x%x (%d) affined thread - %lu", + dpio_dev, dpio_dev->index, syscall(SYS_gettid)); + + ret = dpaa2_configure_stashing(dpio_dev); + if (ret) + PMD_DRV_LOG(ERR, "dpaa2_configure_stashing failed"); + + return dpio_dev; +} + +int +dpaa2_affine_qbman_swp(void) +{ + unsigned lcore_id = rte_lcore_id(); + uint64_t tid = syscall(SYS_gettid); + + if (lcore_id == LCORE_ID_ANY) + lcore_id = rte_get_master_lcore(); + /* if the core id is not supported */ + else if (lcore_id >= RTE_MAX_LCORE) + return -1; + + if (dpaa2_io_portal[lcore_id].dpio_dev) { + PMD_DRV_LOG(INFO, "DPAA Portal=0x%x (%d) is being shared" + " between thread %lu and current %lu", + dpaa2_io_portal[lcore_id].dpio_dev, + dpaa2_io_portal[lcore_id].dpio_dev->index, + dpaa2_io_portal[lcore_id].net_tid, + tid); + RTE_PER_LCORE(_dpaa2_io).dpio_dev + = dpaa2_io_portal[lcore_id].dpio_dev; + rte_atomic16_inc(&dpaa2_io_portal + [lcore_id].dpio_dev->ref_count); + dpaa2_io_portal[lcore_id].net_tid = tid; + + PMD_DRV_LOG(DEBUG, "Old Portal=0x%x (%d) affined thread - %lu", + dpaa2_io_portal[lcore_id].dpio_dev, + dpaa2_io_portal[lcore_id].dpio_dev->index, + tid); + return 0; + } + + /* Populate the dpaa2_io_portal structure */ + dpaa2_io_portal[lcore_id].dpio_dev = dpaa2_get_qbman_swp(); + + if (dpaa2_io_portal[lcore_id].dpio_dev) { + RTE_PER_LCORE(_dpaa2_io).dpio_dev + = dpaa2_io_portal[lcore_id].dpio_dev; + dpaa2_io_portal[lcore_id].net_tid = tid; + + return 0; + } else { + return -1; + } +} + +int +dpaa2_create_dpio_device(struct dpaa2_vfio_device *vdev, + struct vfio_device_info *obj_info, + int object_id) +{ + struct dpaa2_dpio_dev *dpio_dev; + struct vfio_region_info reg_info = { .argsz = sizeof(reg_info)}; + + if (obj_info->num_regions < NUM_DPIO_REGIONS) { + PMD_INIT_LOG(ERR, "ERROR, Not sufficient number " + "of DPIO regions.\n"); + return -1; + } + + if (!dpio_dev_list) { + dpio_dev_list = malloc(sizeof(struct dpio_device_list)); + if (NULL == dpio_dev_list) { + PMD_INIT_LOG(ERR, "Memory alloc failed in DPIO list\n"); + return -1; + } + + /* Initialize the DPIO List */ + TAILQ_INIT(dpio_dev_list); + } + + dpio_dev = malloc(sizeof(struct dpaa2_dpio_dev)); + if (!dpio_dev) { + PMD_INIT_LOG(ERR, "Memory allocation failed for DPIO Device\n"); + return -1; + } + + PMD_DRV_LOG(INFO, "\t Aloocated DPIO [%p]", dpio_dev); + dpio_dev->dpio = NULL; + dpio_dev->hw_id = object_id; + dpio_dev->vfio_fd = vdev->fd; + rte_atomic16_init(&dpio_dev->ref_count); + /* Using single portal for all devices */ + dpio_dev->mc_portal = mcp_ptr_list[MC_PORTAL_INDEX]; + + reg_info.index = 0; + if (ioctl(dpio_dev->vfio_fd, VFIO_DEVICE_GET_REGION_INFO, ®_info)) { + PMD_INIT_LOG(ERR, "vfio: error getting region info\n"); + return -1; + } + + PMD_DRV_LOG(DEBUG, "\t Region Offset = %llx", reg_info.offset); + PMD_DRV_LOG(DEBUG, "\t Region Size = %llx", reg_info.size); + dpio_dev->ce_size = reg_info.size; + dpio_dev->qbman_portal_ce_paddr = (uint64_t)mmap(NULL, reg_info.size, + PROT_WRITE | PROT_READ, MAP_SHARED, + dpio_dev->vfio_fd, reg_info.offset); + + /* Create Mapping for QBMan Cache Enabled area. This is a fix for + SMMU fault for DQRR statshing transaction. */ + if (vfio_dmamap_mem_region(dpio_dev->qbman_portal_ce_paddr, + reg_info.offset, reg_info.size)) { + PMD_INIT_LOG(ERR, "DMAMAP for Portal CE area failed.\n"); + return -1; + } + + reg_info.index = 1; + if (ioctl(dpio_dev->vfio_fd, VFIO_DEVICE_GET_REGION_INFO, ®_info)) { + PMD_INIT_LOG(ERR, "vfio: error getting region info\n"); + return -1; + } + + PMD_DRV_LOG(DEBUG, "\t Region Offset = %llx", reg_info.offset); + PMD_DRV_LOG(DEBUG, "\t Region Size = %llx", reg_info.size); + dpio_dev->ci_size = reg_info.size; + dpio_dev->qbman_portal_ci_paddr = (uint64_t)mmap(NULL, reg_info.size, + PROT_WRITE | PROT_READ, MAP_SHARED, + dpio_dev->vfio_fd, reg_info.offset); + + if (configure_dpio_qbman_swp(dpio_dev)) { + PMD_INIT_LOG(ERR, + "Fail to configure the dpio qbman portal for %d\n", + dpio_dev->hw_id); + return -1; + } + + io_space_count++; + dpio_dev->index = io_space_count; + TAILQ_INSERT_HEAD(dpio_dev_list, dpio_dev, next); + + return 0; +} diff --git a/drivers/net/dpaa2/base/dpaa2_hw_dpio.h b/drivers/net/dpaa2/base/dpaa2_hw_dpio.h new file mode 100644 index 0000000..d90b900 --- /dev/null +++ b/drivers/net/dpaa2/base/dpaa2_hw_dpio.h @@ -0,0 +1,65 @@ +/*- + * BSD LICENSE + * + * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. + * Copyright (c) 2016 NXP. All rights reserved. + * + * 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 Freescale Semiconductor, Inc nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 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 + * OWNER 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 _DPAA2_HW_DPIO_H_ +#define _DPAA2_HW_DPIO_H_ + +#include +#include +#include + +struct dpaa2_io_portal_t { + struct dpaa2_dpio_dev *dpio_dev; + struct dpaa2_dpio_dev *sec_dpio_dev; + uint64_t net_tid; + uint64_t sec_tid; +}; + +/*! Global per thread DPIO portal */ +RTE_DECLARE_PER_LCORE(struct dpaa2_io_portal_t, _dpaa2_io); + +#define DPAA2_PER_LCORE_DPIO RTE_PER_LCORE(_dpaa2_io).dpio_dev +#define DPAA2_PER_LCORE_PORTAL DPAA2_PER_LCORE_DPIO->sw_portal + +#define DPAA2_PER_LCORE_SEC_DPIO RTE_PER_LCORE(_dpaa2_io).sec_dpio_dev +#define DPAA2_PER_LCORE_SEC_PORTAL DPAA2_PER_LCORE_SEC_DPIO->sw_portal + +/* Affine a DPIO portal to current processing thread */ +int dpaa2_affine_qbman_swp(void); + +/* create dpio device */ +int dpaa2_create_dpio_device(struct dpaa2_vfio_device *vdev, + struct vfio_device_info *obj_info, + int object_id); + +#endif /* _DPAA2_HW_DPIO_H_ */ diff --git a/drivers/net/dpaa2/base/dpaa2_hw_pvt.h b/drivers/net/dpaa2/base/dpaa2_hw_pvt.h new file mode 100644 index 0000000..7dffd5d --- /dev/null +++ b/drivers/net/dpaa2/base/dpaa2_hw_pvt.h @@ -0,0 +1,68 @@ +/*- + * BSD LICENSE + * + * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. + * Copyright (c) 2016 NXP. All rights reserved. + * + * 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 Freescale Semiconductor, Inc nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 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 + * OWNER 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 _DPAA2_HW_PVT_H_ +#define _DPAA2_HW_PVT_H_ + +#include +#include + + +#define MC_PORTAL_INDEX 0 +#define NUM_DPIO_REGIONS 2 + +struct dpaa2_dpio_dev { + TAILQ_ENTRY(dpaa2_dpio_dev) next; + /**< Pointer to Next device instance */ + uint16_t index; /**< Index of a instance in the list */ + rte_atomic16_t ref_count; + /**< How many thread contexts are sharing this.*/ + struct fsl_mc_io *dpio; /** handle to DPIO portal object */ + uint16_t token; + struct qbman_swp *sw_portal; /** SW portal object */ + const struct qbman_result *dqrr[4]; + /**< DQRR Entry for this SW portal */ + void *mc_portal; /**< MC Portal for configuring this device */ + uintptr_t qbman_portal_ce_paddr; + /**< Physical address of Cache Enabled Area */ + uintptr_t ce_size; /**< Size of the CE region */ + uintptr_t qbman_portal_ci_paddr; + /**< Physical address of Cache Inhibit Area */ + uintptr_t ci_size; /**< Size of the CI region */ + int32_t vfio_fd; /**< File descriptor received via VFIO */ + int32_t hw_id; /**< An unique ID of this DPIO device instance */ +}; + +/*! Global MCP list */ +extern void *(*mcp_ptr_list); +#endif diff --git a/drivers/net/dpaa2/dpaa2_vfio.c b/drivers/net/dpaa2/dpaa2_vfio.c index 58c77c9..71b491b 100644 --- a/drivers/net/dpaa2/dpaa2_vfio.c +++ b/drivers/net/dpaa2/dpaa2_vfio.c @@ -62,6 +62,8 @@ #include #include "dpaa2_vfio.h" +#include + #define VFIO_MAX_CONTAINERS 1 #define DPAA2_VFIO_LOG(level, fmt, args...) \ @@ -145,6 +147,30 @@ static int vfio_connect_container(struct dpaa2_vfio_group *vfio_group) return 0; } +int vfio_dmamap_mem_region(uint64_t vaddr, + uint64_t iova, + uint64_t size) +{ + struct dpaa2_vfio_group *group; + struct vfio_iommu_type1_dma_map dma_map = { + .argsz = sizeof(dma_map), + .flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE, + }; + + dma_map.vaddr = vaddr; + dma_map.size = size; + dma_map.iova = iova; + + /* SET DMA MAP for IOMMU */ + group = &vfio_groups[0]; + if (ioctl(group->container->fd, VFIO_IOMMU_MAP_DMA, &dma_map)) { + DPAA2_VFIO_LOG(ERR, "SWP: VFIO_IOMMU_MAP_DMA API" + " Error %d", errno); + return -1; + } + return 0; +} + static int64_t vfio_map_mcp_obj(struct dpaa2_vfio_group *group, char *mcp_obj) { int64_t v_addr = (int64_t)MAP_FAILED; @@ -240,12 +266,13 @@ int dpaa2_vfio_process_group(struct rte_bus *bus) struct dpaa2_vfio_device *vdev; struct vfio_device_info device_info = { .argsz = sizeof(device_info) }; char *temp_obj, *object_type, *mcp_obj, *dev_name; - int32_t object_id, i, dev_fd; + int32_t object_id, i, dev_fd, ret; DIR *d; struct dirent *dir; char path[PATH_MAX]; int64_t v_addr; int ndev_count; + int dpio_count = 0; struct dpaa2_vfio_group *group = &vfio_groups[0]; static int process_once; @@ -389,9 +416,19 @@ int dpaa2_vfio_process_group(struct rte_bus *bus) dpaa2_bus_add_device(bus, dev); } + if (!strcmp(object_type, "dpio")) { + ret = dpaa2_create_dpio_device(vdev, + &device_info, + object_id); + if (!ret) + dpio_count++; + } } closedir(d); + ret = dpaa2_affine_qbman_swp(); + if (ret) + DPAA2_VFIO_LOG(DEBUG, "Error in affining qbman swp %d", ret); return 0; FAILURE: -- 1.9.1