From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03on0081.outbound.protection.outlook.com [104.47.41.81]) by dpdk.org (Postfix) with ESMTP id 6B86258CB for ; Wed, 15 Feb 2017 20:06:44 +0100 (CET) Received: from BN3PR0301CA0042.namprd03.prod.outlook.com (10.160.180.180) by CY4PR03MB2949.namprd03.prod.outlook.com (10.175.116.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.888.16; Wed, 15 Feb 2017 19:06:42 +0000 Received: from BY2FFO11OLC012.protection.gbl (2a01:111:f400:7c0c::199) by BN3PR0301CA0042.outlook.office365.com (2a01:111:e400:4000::52) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.888.16 via Frontend Transport; Wed, 15 Feb 2017 19:06:42 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; caviumnetworks.com; dkim=none (message not signed) header.d=none;caviumnetworks.com; dmarc=fail action=none header.from=nxp.com;caviumnetworks.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 BY2FFO11OLC012.mail.protection.outlook.com (10.1.15.23) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.904.16 via Frontend Transport; Wed, 15 Feb 2017 19:06:42 +0000 Received: from bf-netperf1.idc ([10.232.134.28]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v1FJ5fLn020023; Wed, 15 Feb 2017 12:06:38 -0700 From: Hemant Agrawal To: CC: , , , , , Date: Thu, 16 Feb 2017 06:09:18 +0530 Message-ID: <1487205586-6785-20-git-send-email-hemant.agrawal@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1487205586-6785-1-git-send-email-hemant.agrawal@nxp.com> References: <1485172803-17288-1-git-send-email-hemant.agrawal@nxp.com> <1487205586-6785-1-git-send-email-hemant.agrawal@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131316592023482217; (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)(336005)(39850400002)(39400400002)(39840400002)(39410400002)(39860400002)(39450400003)(39380400002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(50466002)(8676002)(92566002)(626004)(81156014)(2906002)(106466001)(81166006)(77096006)(54906002)(50226002)(105606002)(305945005)(68736007)(33646002)(86362001)(53936002)(4326007)(5003940100001)(551934003)(2351001)(575784001)(47776003)(5660300001)(38730400002)(356003)(97736004)(85426001)(8936002)(48376002)(110136004)(8656002)(2950100002)(104016004)(6916009)(6666003)(76176999)(50986999)(36756003)(189998001)(389900002); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR03MB2949; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11OLC012; 1:sl4vw/KSMl5Ud7cmodF0PM7k+fcqEvCC2MutL5T3gZ4qVt2R/T1nUR8CARSix7rZvcHpmoH9qjk76MyS9QQcnBzpjcRFIFIepfPQTFURqmTiwwXC9Cms8BC5M9YUbhTRfsnrNEU8HkPauTV5wL1PzeBBinGo0vmQpgNqyDnlb+IqFo9HtALcEuoC7Alh20Zc/IiD9MXoZLIoaI59vITArxjdvkpBtQm14+F/QjCXVdRAGmgI4Zbe7g/atbfMYnp308zA9GlVhnMtE95d/VaYoLq/lEnlA1eRu4+5GdaBXirp4VZycIoOoh5stakiQ82eltANOiqAI0d2SxQbHwpQBRQrKGg5ZTT2df7v4sNlIQkH93QLR0bsirGKA4i8CCOCa3u8C9K2zvzRXV1USmxrlL7WhlD6LwG4TzLyWYfBlpkFDatj0CsH08wV2J9GK3cFxgFDUzRaWCuZR50OwCmF3ebcQ0yWSsQ+4SV3sNLxty4DmwfrRXVERTCyT8jmDOyYNEAXggBeFe7BNq6dhjb0yzl9JqLobEa38Px7QoQDadZa8jlNxJ9FzbtHUw5a7VJHRQIEFCHMyQxp96n2NPC3Nnbs8LCz9AfZKYQfA7HuZavA1v98OcZfAwANPnhZMwneJ1wx8kYXsjD6W0kaxNLgsg== MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 8d7f8ac0-d66c-4317-af69-08d455d5c723 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:CY4PR03MB2949; X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2949; 3:zUUECKCEwzAMNwkDbVW6RTfpXVuAiTbdh/iIASW3gUtCmej9sSBpaubTQwlMUfrszQM3WPpP9Aw+9s++dHpXVZZ68Hf+LldmP+K/Wq2MgPWNk/ZTa6jXOqjfKG6aPLhcf+NwNZdGeyyujYlmZX5VEa8tuRm7Hoi5ukx+brRlTpTFOixGpc5u0jfAPLKW8uwtwu94TeLX6Owx+k/iqhM5CHJ/yzzY1jpleDz4xkxhVqsjUO8QNi/d9R3hr7q0n2+/y6bUt1TBEGo1f2x52VBvGmQoySSH0/0lK6vDvm0jGhf4TOe3yPf0Rkk5F/KR5wpiZEamM9v6JZERrrwWKoLzHlF6bAC3NWHJTw5GGNmu9ntnBW5nCSBj3Y2dd9Q5gK0d; 25:CH/hb/EzHyqT3puJgDY/nzLT52waEtYqk7VjHwtkm+wxpKWqK65P831UwpR4fXmgCjaoaa/ICJ2JWokpDW9IHvziz+8DUfIukRFkUejBv1nVqiCsbk3KuhtOy9GBfvJr85191d8saRLGPZv3HyeeuPJEk/4xHsmaZD9FSGQe4+AaSZji38tllf9EJndhPn3VxDcD3AxSbUEqIaPodN8MNz5Zr1CmFQf7FqF1qJay9byEWYw5jTD5Fr588KFYlBp05rZZYidpsA/C5vzX49pdhZ506+D6CLk23GRICXWNbEXPSVXbwiXFkUJo5eR0oxEP9juvC32TlpvpN1xFA4yQnDwWeLiViER+o6Ja0uTJjjqU7bho4O0lHM/bq6CBIEA6bIU4S0c3oNxVOObf+bXQdXc6zpd7GtISynJzXMP0sf+a4FTtbVyU/dg2Idu63WLjphlUOvxrh26GeuYyKp0F+w== X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2949; 31:5y8KlYFo5zJgnHe4SQntAuIKgjSeOGk4X3w/r0pS6TPMcnoG//iXV80uRrVENvMBtAdkGpGw6o5gwvJjbcI79UtcL36h1+GrhhHCnqNwGo0WR9jPokBHL0YZEQ4hMhq15zFfc7cieKNC8lpwDXmtEy01ZYr7MzQ6EoUhg5nMWM6zTUTEewz6E72QkKqZY2dhMARTvJjYqSuUHMOLDUUTMhOz9p9fIVZZgCwY4pNKBliPHH9WCove9W8Q8sK3DwGKe4AxMaqGog+s5aBKBwou4A== 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)(13024025)(13018025)(13023025)(13015025)(8121501046)(5005006)(3002001)(10201501046)(6055026)(6096035)(20161123556025)(20161123559025)(20161123563025)(20161123565025)(20161123561025); SRVR:CY4PR03MB2949; BCL:0; PCL:0; RULEID:(400006); SRVR:CY4PR03MB2949; X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2949; 4:c86gP9FhbJG7Jc16xJ1knMDyrGwdluRI9kgw66tcV4qVrLhzQPMBM3xqhSOTwvbM3AhIEwIW49F2cGQ5IbZuzhyegTzcHN2scBHsER8qYvWGQOGIGDL+GUuyDDLj3iBjhFcJavpypNnibU19XiI/JknRL6YV5bKjSIIijKVvPVvJUsIm2vOWk6aFakEjRypdNX4iQ+nrSKiYzJIpCeDR9I6zGRSec1UI0caCm8WvYUB6qP0PZyr57kZcCcjFATAxwrhaKeg/EylD1G19PA8ZVxbgiOfNbJyeuVyTvron348J9Js6muWKtRSFayLStjMGZpnvY24IAmlnqPRZ3peAzkRrU0C0rkcwhxewJELVQ10xi9Bv2liMHH+xEVVSzjW6LcZMCE1HDhLj34Hk7XD6MGfv3Gcm0QLdkGAGG01qXd3UCE2AhHrpBzSD3EhDx/GyyiBkodY0tzRzQsQZHJxIogwY5Cf58accwP0LsCKWAJUu8tsupctpWm3GXhxci1M7KzBpSXuBurbLuIS7HdsfQgGy03RYYDtBQbZsSwU7OEO7ba87d7gJ6ASXqMZ3X+IoX50xJsSrEPJM9jJvYjVuMlYZju0wVZw2Iyz32wbz/ToAKfei9kYHPphHDYWwiZKQkFgYd4c0Vzru2fMyLc1PRlMjdToO1zSpgCvTb/xe842is1GQj8aX1Mjzin/+SFf6h8jfe+rz83ivTQ+J12wQeDJc2JvNrLDMtObj1IFoQQlf96ArwRzC8Ee6iPvED6loqpgbIzgvtwRCKroYgshuQA== X-Forefront-PRVS: 021975AE46 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY4PR03MB2949; 23:QNT2VcCFsjIS27xFfcNZzXbN3YFhn0zomNy5/kGMd?= =?us-ascii?Q?c0LvqorQq6AoWgh9HyqmiRTbrlGJPGE/ppWFyeK5/ANlcjrQlSuXDS6GxEMR?= =?us-ascii?Q?qMxxRQSHb6IZpu5l8tKd9vwfQmB/1rUlIH6BJr1UW9kfHWi5GyW9UO6Px14c?= =?us-ascii?Q?73YY5o37mxGzbyxUN2Yjv2xgfnx9IAWSuS1xiv9a1bwmJhVZt+vQyU4L1nrc?= =?us-ascii?Q?b5icEWOXE1trLG09+lBr+htCqqF7/j6DjykrmPWQ3r7iRC2hFuGYJMmPpyo2?= =?us-ascii?Q?rK85LuTm3CNOohwluwoV8lgUM0xQo8GTETEQxFs+e1aVWx5ufONt4i/p0tcl?= =?us-ascii?Q?hVRHBnAKFCIvGjITSS85FX53/SKtkZ0h0Dj8Lwe1nsN3v3lrZgWIz82j1zPv?= =?us-ascii?Q?eUS43ZSOn7ynLY9D/tzWDySJboYdztGmv/h5EiytUiqMrJmF0EcaKZF/30ZB?= =?us-ascii?Q?rK9bMwxPUxPSaQ+lGxkNoYc8sRSSIoPjV4XUJeIuZxKxaE3baoirsnVa+huW?= =?us-ascii?Q?5GobyWFdGcQV868Mes7cFwo+phQJ3lxgGi5uuFrxa4Myiikoq42ko/rvm+ay?= =?us-ascii?Q?Akih8mUWUhv9ML5chu3I7zbSIXf+jarLX+Yl+rdVjsRgboAMXBbTUwNOk5cm?= =?us-ascii?Q?SzEzmRdsT7teSqJ57QXAL7ZRgbLcbs8ibypV9uWaBLCSOTwJHeWYFQ3dFLKq?= =?us-ascii?Q?vJAxUiqgTgIme3hKHvSxXgl95kkfL3fpdPdKa/JQvqZyZLUv4YQyyqxnQ/YO?= =?us-ascii?Q?MmpaI3TYbOBkKotuz7Gq+8W5foF34us5kECxg0XjhCxAvkernuir0ag0ch8q?= =?us-ascii?Q?8cIExiCIYhZRUjvCnIwHiegna1uxnEgtiMIxZyVnKofg79/T7bcIQns1Rg+F?= =?us-ascii?Q?60gwbwRl0IsVWOV2EkjCJoOz6WVa+IQEcXllCIrsjom8SyQ/7aozKAS5ezB2?= =?us-ascii?Q?UCbXDI80Lh3D9pcQA6A9Ydl/JGRg1HHoVyzL3ZYksXNJxjU5tbMl31UCCWdP?= =?us-ascii?Q?SnlNsCzextv1yR1oLJv1k+RMnl3+tt3Z90gURVJfQhz9MxZ1+OYUxSZQpzmd?= =?us-ascii?Q?CyMOAEsYe/WKZvdTKt1vFpmiDmyZV7v9GVkDBPVkY9opOsBX2fZoSX9k3uaf?= =?us-ascii?Q?NiSbjkABLHi3i9ZuIQcW0Bs0aBiQGb4YbQYyq1cVmRRJj63htxTfyWS26BSw?= =?us-ascii?Q?7db1Fdg1CU/Txjbcg76srjBAcfezvjhl9Sn2Dp1ws1Pq1HY/TTmEQRSVecnJ?= =?us-ascii?Q?3mXb5YIK6OxzLmgaluqXg1LhSsHnsgs+vzphikh0gCCnuLOnVqLjk4R3GcWl?= =?us-ascii?Q?UB0hRIyf5ptHjy8buxF2vgMoXnkipYi9PpBTtjRbwIGjs8+WaDDl3ZmMbRIK?= =?us-ascii?Q?dw0E/QDXVjA2Mu/S37+kIhF96o=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2949; 6:RF+SepBS36julItXcesGAVxma1wuMjEDZW9Vm/DSH3Y6aenYx5ZhFhSGZ3Fkru9/rSvjzH62jFAq5mCAaic8myRvpbd2Q/RidXQObIdt6LLoOSUUmvkZgX8L3ZtqIBvIvBQj8CR0GXdVQ6/EEeqo9n87o/9GEPdM9dA+sNNiBNLQKSOEGfEgJ1/BSccB1x089xqkUqAg6N99V86ucgRqaFYLc2dI81UdJEgu3xnSuVnLvv9OkvBMmS1vXIrDfx2HCCR/mkP/Vx5N0G+zjxAoWAnMKYimYL7LAxx0GxunqDD3Vx2MWmeR+CY43OoiwPGngojKL2QYYdi2cgklVNjZ4HY80JDZAYT/wJWAiooWmOjIH3gncV0MWP98mMbDIW3pd9oKyBpxzc2yWKC/ryIQcbpncfW3lulv3qX8Wz5F6OA=; 5:tpr2EhXN4apbZuc7GgHYzi4ieLZtsHeF97oGpHf2y/fcdqpdOVJAgN4GSKt+n1RjhU+2EYb4l2ll74Q8FlN7zJE8Q5sCF5mdcmAlTFxxCrEI1U5Efb3lvdNLB5chQQsE7tI9T5QEZWlLqA1LuGPguBJmkRs0Njimjm3SAW62rkjhSbx728vDDnfGrbv7jToP; 24:fl/+mEez8FPlu5TxiIVaMqPY4ul3hxB3TsC9eSzDnHWI8SkKlzZcDG8+LVU2cw+AD6FJtr2Y94civ0f8MuNiONFeiA2xEeTTqlY7mGL3Z20= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2949; 7:hNCuVsny9y0YcXEHGFFHd7biweDDPCEOiwz0EqAS03nJ9dqssaZbxhsULt0JC0lGJzraIbq+HMWdmdeGOAM08UiJBA4BuRrODAh+dQEIGEwtbiM5au0rvFVBFtsxprWUoNopxa6/DSDs2loFj0m2TZFVPDEYhnze1zMNrKM7Edk7hvtGSx2ob4NSJEyv9u7R/CbjEUsUjNtqB7p07Ng63NGKVB21LKYa27WrJx9AxiLMpTrSsv1WN08ScEXr0prw+62OcgcSBf09Efbc01TuIgqUSoAHOQmaUzUSq9tf8cqU6U/M8KXTuIJwhA+6Uenw24XG1A6DTA/eXhOkH6Jn6w== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Feb 2017 19:06:42.1454 (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: CY4PR03MB2949 Subject: [dpdk-dev] [PATCHv7 19/47] bus/fslmc: dpio portal 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: Wed, 15 Feb 2017 19:06:45 -0000 The portal driver is bound to DPIO objects discovered on the fsl-mc bus and provides services that: - allow other drivers, such as the Ethernet driver, to enqueue and dequeue frames for their respective objects A system will typically allocate 1 DPIO object per CPU to allow queuing operations to happen simultaneously across all CPUs. Signed-off-by: Hemant Agrawal --- drivers/bus/fslmc/Makefile | 5 + drivers/bus/fslmc/fslmc_vfio.c | 17 +- drivers/bus/fslmc/fslmc_vfio.h | 5 + drivers/bus/fslmc/portal/dpaa2_hw_dpio.c | 364 ++++++++++++++++++++++++++++ drivers/bus/fslmc/portal/dpaa2_hw_dpio.h | 60 +++++ drivers/bus/fslmc/portal/dpaa2_hw_pvt.h | 68 ++++++ drivers/bus/fslmc/rte_bus_fslmc_version.map | 2 + 7 files changed, 520 insertions(+), 1 deletion(-) create mode 100644 drivers/bus/fslmc/portal/dpaa2_hw_dpio.c create mode 100644 drivers/bus/fslmc/portal/dpaa2_hw_dpio.h create mode 100644 drivers/bus/fslmc/portal/dpaa2_hw_pvt.h diff --git a/drivers/bus/fslmc/Makefile b/drivers/bus/fslmc/Makefile index 77e0a1b..a26ba20 100644 --- a/drivers/bus/fslmc/Makefile +++ b/drivers/bus/fslmc/Makefile @@ -50,6 +50,7 @@ CFLAGS += "-Wno-strict-aliasing" CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/mc +CFLAGS += -I$(RTE_SDK)/drivers/common/dpaa2/qbman/include CFLAGS += -I$(RTE_SDK)/lib/librte_eal/linuxapp/eal # versioning export map @@ -65,10 +66,14 @@ SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += \ mc/dpio.c \ mc/mc_sys.c +SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += portal/dpaa2_hw_dpio.c SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += fslmc_vfio.c SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += fslmc_bus.c # library dependencies DEPDIRS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += lib/librte_eal +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += drivers/common/dpaa2 + +LDLIBS += -lrte_common_dpaa2_qbman include $(RTE_SDK)/mk/rte.lib.mk diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c index 0d4c0a2..2d7bcd9 100644 --- a/drivers/bus/fslmc/fslmc_vfio.c +++ b/drivers/bus/fslmc/fslmc_vfio.c @@ -61,6 +61,9 @@ #include "rte_fslmc.h" #include "fslmc_vfio.h" +#include "portal/dpaa2_hw_pvt.h" +#include "portal/dpaa2_hw_dpio.h" + #define VFIO_MAX_CONTAINERS 1 #define FSLMC_VFIO_LOG(level, fmt, args...) \ @@ -261,12 +264,13 @@ int fslmc_vfio_process_group(void) struct fslmc_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 fslmc_vfio_group *group = &vfio_groups[0]; static int process_once; @@ -409,9 +413,20 @@ int fslmc_vfio_process_group(void) fslmc_bus_add_device(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) + FSLMC_VFIO_LOG(DEBUG, "Error in affining qbman swp %d", ret); + return 0; FAILURE: diff --git a/drivers/bus/fslmc/fslmc_vfio.h b/drivers/bus/fslmc/fslmc_vfio.h index 5e58211..39994dd 100644 --- a/drivers/bus/fslmc/fslmc_vfio.h +++ b/drivers/bus/fslmc/fslmc_vfio.h @@ -71,4 +71,9 @@ int vfio_dmamap_mem_region( int fslmc_vfio_setup_group(void); int fslmc_vfio_process_group(void); +/* create dpio device */ +int dpaa2_create_dpio_device(struct fslmc_vfio_device *vdev, + struct vfio_device_info *obj_info, + int object_id); + #endif /* _FSLMC_VFIO_H_ */ diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c new file mode 100644 index 0000000..dd6de4c --- /dev/null +++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c @@ -0,0 +1,364 @@ +/*- + * 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 +#include +#include "dpaa2_hw_pvt.h" +#include "dpaa2_hw_dpio.h" + +#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 int 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 fslmc_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 (!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 = rte_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/bus/fslmc/portal/dpaa2_hw_dpio.h b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.h new file mode 100644 index 0000000..682f3fa --- /dev/null +++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.h @@ -0,0 +1,60 @@ +/*- + * 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 + +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); + + +#endif /* _DPAA2_HW_DPIO_H_ */ diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h b/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h new file mode 100644 index 0000000..6b44314 --- /dev/null +++ b/drivers/bus/fslmc/portal/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 *(*rte_mcp_ptr_list); +#endif diff --git a/drivers/bus/fslmc/rte_bus_fslmc_version.map b/drivers/bus/fslmc/rte_bus_fslmc_version.map index 23aff2e..48d776e 100644 --- a/drivers/bus/fslmc/rte_bus_fslmc_version.map +++ b/drivers/bus/fslmc/rte_bus_fslmc_version.map @@ -1,6 +1,7 @@ DPDK_17.02 { global: + dpaa2_affine_qbman_swp; dpbp_disable; dpbp_enable; dpbp_get_attributes; @@ -45,6 +46,7 @@ DPDK_17.02 { dpseci_open; dpseci_reset; dpseci_set_rx_queue; + per_lcore__dpaa2_io; rte_fslmc_driver_register; rte_fslmc_driver_unregister; rte_mcp_ptr_list; -- 1.9.1