From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124])
	by inbox.dpdk.org (Postfix) with ESMTP id D207D425A3;
	Fri, 15 Sep 2023 11:19:41 +0200 (CEST)
Received: from mails.dpdk.org (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id 916DB42D97;
	Fri, 15 Sep 2023 11:17:13 +0200 (CEST)
Received: from NAM12-BN8-obe.outbound.protection.outlook.com
 (mail-bn8nam12on2113.outbound.protection.outlook.com [40.107.237.113])
 by mails.dpdk.org (Postfix) with ESMTP id 664F442DBE
 for <dev@dpdk.org>; Fri, 15 Sep 2023 11:17:11 +0200 (CEST)
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;
 b=JpH588b6wWjE+D6RvWxKZCFyM1glo4xLlCI63O1WNwQOm1kZ8kga7pUv6qtj+bi2s4tOUjfSBiAg24KD4lQ5x9YaGjnxFca10pUQRaf1pJ4XLxqdUIB417oPXR2DtyYaC07gmANEFaUTRbQMj4cTgmMro4tcWBvQRVzFhSPrliw+d525BENklsaWdXXwBwKR5qt5WCxrCZuYBj+zFeEaR9ubBL97D7LW6Is/8kGfdRV90CWodRXluOInCADv5ABB0ITDNjDiRMcS3OxN1OJkxd0YagK1MVdL0dMgxHUzguEAzr22SOGYz2QRJjc5tcojAGPhglXhHJAENcOlhGkvsA==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; 
 s=arcselector9901;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;
 bh=uZx7TA5hLGeRgP+x6yqCEsLnPuM6R5oi9H79M1chK94=;
 b=lP6pWMcrI9PzwTgjsI6N+bicB8/TOGXC4nknHjLlSExz3t8vKDRU1OxiCWN4Bz3kcf+KQPevJekrIaDjOLxDQ7jgOyrcBdtHifuAMoPJDm9yZa22KExWMdNaggMxm35GRR0QJrzfg2zIo0X3s/PyTLgo7SSUlRvs0JZBEycG3qSaY62jEVeIpPkzg1DkxitscB+NzzFYRji8fjcSWl5QQb7YHf/eaIlF8ePMSQgD1lu059XM3a76vB4p6uI7kuIaZjHijxZDb04T4i+NA874Ke+YLo1wQa1qrKIXqK5fdl5lgXHhS+znUaEccJtcpNceC+1iTYVaUrHRHo9+GhY9Zw==
ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass
 smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com;
 dkim=pass header.d=corigine.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=uZx7TA5hLGeRgP+x6yqCEsLnPuM6R5oi9H79M1chK94=;
 b=kJX4narVzbqphgudiWlfSbovGS1PVN1wbRWXKzDXx3aUKiR7MDeDVIOLMTdRIyJ6+tLf/qAYBZ4cc9CVw44TT/qVjRGtrGmYtQuMXIBCJ9qjep8MUIzvcpwqegnDo+xi/2fXKAGPykTicMwmxmw9WAKrupoSJqd0tZVugt2dCRs=
Authentication-Results: dkim=none (message not signed)
 header.d=none;dmarc=none action=none header.from=corigine.com;
Received: from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)
 by CO1PR13MB4773.namprd13.prod.outlook.com (2603:10b6:303:fb::6) with
 Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6792.21; Fri, 15 Sep
 2023 09:17:09 +0000
Received: from SJ0PR13MB5545.namprd13.prod.outlook.com
 ([fe80::c05c:6915:1628:70c4]) by SJ0PR13MB5545.namprd13.prod.outlook.com
 ([fe80::c05c:6915:1628:70c4%7]) with mapi id 15.20.6768.029; Fri, 15 Sep 2023
 09:17:09 +0000
From: Chaoyong He <chaoyong.he@corigine.com>
To: dev@dpdk.org
Cc: oss-drivers@corigine.com, Chaoyong He <chaoyong.he@corigine.com>,
 =?UTF-8?q?Niklas=20S=C3=B6derlund?= <niklas.soderlund@corigine.com>
Subject: [PATCH v3 26/27] net/nfp: refact the cppcore and PCIe module
Date: Fri, 15 Sep 2023 17:15:50 +0800
Message-Id: <20230915091551.1459606-27-chaoyong.he@corigine.com>
X-Mailer: git-send-email 2.39.1
In-Reply-To: <20230915091551.1459606-1-chaoyong.he@corigine.com>
References: <20230830021457.2064750-1-chaoyong.he@corigine.com>
 <20230915091551.1459606-1-chaoyong.he@corigine.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-ClientProxiedBy: PH7PR10CA0017.namprd10.prod.outlook.com
 (2603:10b6:510:23d::10) To SJ0PR13MB5545.namprd13.prod.outlook.com
 (2603:10b6:a03:424::5)
MIME-Version: 1.0
X-MS-PublicTrafficType: Email
X-MS-TrafficTypeDiagnostic: SJ0PR13MB5545:EE_|CO1PR13MB4773:EE_
X-MS-Office365-Filtering-Correlation-Id: ed4a1fc4-2445-42a1-36f8-08dbb5cc89ea
X-MS-Exchange-SenderADCheck: 1
X-MS-Exchange-AntiSpam-Relay: 0
X-Microsoft-Antispam: BCL:0;
X-Microsoft-Antispam-Message-Info: g7U7lXnTln93ESXOCRm5bS8KceGNmfTxUoHj/p7NVp1VN32kGhVyiiqS1kI6LDWjkyGMG3Evyss1ZkiGw0rLpB5fnRazLIzPCjZFZlNI5VQ42Mglxiv8gJnBGYM8PMqEItPd1DV50qeUmKR6EnPRFPq5qYAADR6TN526yz4FdkkuGzo7NNrNzfC877y0S7YlM1gTRCwL1I2ilkgCe3eg2eXt8ZOHRqgvpkc1pEfxt+15J5ysyrN3vUN5aYcCP4j9+Um2X6OokJFK0qDNGVfXYvpH3ODLX29GOcgGG1nWkXJaAsGVrzH0IkBXPeTnVaDJknuifDyLfuWlBUkej0CdK9/daZicGqrSdRJ/7OSpBxBPbE63oMdM5LmZ4dLN31MQVF+UxbyzZEeyyXL5nkfs6rYqautI1qSEa5wPdkhoRFfrEsMxRQV67l8INdqh7j6PDbw0EbgtZiTcFrtq8peyVIPnPHKSCzXgsXiS2J7yYjwb7GxU9xyHw6thSiIoMo4ltkHNyw+nfqz7TwOFUuI4C9aIFl8WN1+jvcmsiz2GXVkcknnjOzWNvmSG7CL9u825KqBEwcCZSzF3iDDRnc//GnjJD5XcOk5tv4wAAR6amhHKqLQiGwIvu/YKKBf6Htpgt5CWDo9t4QLirGCfg8TSi4mm48PaGLnGrURFdezs0Vk=
X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;
 IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE;
 SFS:(13230031)(39840400004)(346002)(136003)(376002)(396003)(366004)(451199024)(186009)(1800799009)(6512007)(107886003)(1076003)(2616005)(6666004)(52116002)(6506007)(6486002)(66946007)(26005)(316002)(41300700001)(66476007)(66556008)(6916009)(54906003)(5660300002)(4326008)(8676002)(38350700002)(8936002)(38100700002)(478600001)(66574015)(83380400001)(36756003)(44832011)(30864003)(86362001)(2906002);
 DIR:OUT; SFP:1102; 
X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1
X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TzUxTHQ2K0ppQWFGK21kV0tJMjQ0NWw0OFh3NHgzQzN0UVpXRnVzV3ZXcVh5?=
 =?utf-8?B?OFlwNGxvNW9EVE9vaE9TWHBkNlNFeEEzekFSVi9YbFJiZ1hUZ1BQS2Zvd0xr?=
 =?utf-8?B?eVZuS0RKWTB3NXNlZlVjZ1owVDNmdURKdjVhUWF1SGJicGJyK1RqMlRXSWpP?=
 =?utf-8?B?Rnl1Y3JLUFRzanZ3TlRuaDFneGdOQU0wZS9OQ21IcFZxWGdzUzhMK2Fia1hM?=
 =?utf-8?B?V0RGeCtDMS83VjlNMHJsYVZPcHp1eklycWZKYUM1Q3kvN1lBZTYvbTNTNWJp?=
 =?utf-8?B?QTEranI1Smd6U3Q3d3dvSFNCNEhJNll5T28rODhlS09HNHlNY2ZyZFluY3B6?=
 =?utf-8?B?TTRBbU9VMVhrc1MwbHpaa3J1UkxhSkdxVHRWQ0UyQW5BMmdXMm90K3VMODZG?=
 =?utf-8?B?c21ET0xaL0lSN2QwSDhrQ2pRQ05LM0lLSWpxNUVjWHFHWWdEZXlvUFBsOENW?=
 =?utf-8?B?enA0NmowbGxleC9lMG5IWHZMZjc5bUdla2ZxN01kdGl5aVJnLyt5V2NMajlx?=
 =?utf-8?B?Ym9hS0pKclZKKzh0ZlVUaXp6RWtYNWlobm4zZE41OGc2bHc4REx2eXZ3K21D?=
 =?utf-8?B?YUlKRWpqbEhGSjR2bERDZnhGVzJBT09RbWRtbm5OdmdjM3IzeENncW1EOStH?=
 =?utf-8?B?bDN5YVhjVThnaWM2VEV4UHJaQktmdWUwWG9ZS0RCYmpvd0VkRVpBWlI3RTg3?=
 =?utf-8?B?Y2Z2U0dCRTYyNDJYQU9jeTg4QkJZNllhc0l0V3MwQTBMTks1K2toSUloeGdH?=
 =?utf-8?B?aTVZVzMySXlUbHVhSVBkUmFtUGwwWGNxbzN4VDB3dFZYTDgxMi9rL0wrR3NX?=
 =?utf-8?B?QjM5dmxKOU5pT29STmJtUkNhN09mbUk4NUs4bitVbTZFd0JCWlRTNUpmZzBu?=
 =?utf-8?B?c3RFanY5RTNTOS8zU0oxdVVtZkFQYUlHaXU4anpxMjFieUhqKyswbkdTajFz?=
 =?utf-8?B?MmkrZUlvZlM2YkFoQkpPb3A4ZXRCci9GSXhzKzhibVpLYjQzZWFCYVBoa21R?=
 =?utf-8?B?bjI3YXIzeHo5WDZHRGd0MHd5MVBvSjdHQkRsOVU5MG5WTm55aXRxK0VpUExV?=
 =?utf-8?B?eEZqSTJVM2wrQ016N3h4M0Rzd3k3Vy9ocjh0RWNrdWduWkVOYm05Mit4VWRV?=
 =?utf-8?B?dWp4TVRBcWluZnAxVnZlTTN0V0ZaWVE0MEszYXY2V2hUY01PQ2UrRWFLNW9X?=
 =?utf-8?B?M2U1ZStiQVJ0bmFMdUs5NXhNY2RyRmp1NUIzS1FZMWY0VURkVkZZQkgvcjMz?=
 =?utf-8?B?dWFNR0duMTBZSVkwVW11UXNjTlh4MUl3NTh1c2MwT0grNmFHSjlnSGRTSkw0?=
 =?utf-8?B?LzFSbDlJUHV2eXJSZURKVjlsc2dCTTY0K2Y1RVhqK0ZYT2lEZ1BJaTgyTTE4?=
 =?utf-8?B?YkpxMlh1ZDRqOW9PNDBBRFU3VnhCSWJ4cDBqdHdFcTBWTWw3bEpvQ25PZzlJ?=
 =?utf-8?B?S29tbDRqaHFJdTIwOXBNZzhJQTZIR0VCK24rNXNtTW0xaUhaTFYwemRyR3BX?=
 =?utf-8?B?Wnp0cnVOdEhtRWZkQnBXNFpsOWhoL2tuRWxtMEdIMnZ2VzhQZG92anBNS2Jq?=
 =?utf-8?B?WE9UTmNHUDV3Qjgwb2FtbGlMbUFIVC91OWZuQnBEOEJIOHpxWHgyVm55TjZI?=
 =?utf-8?B?VnVvdDhwek8ySGJUVW9hd0ZveFJjcndCUXhObFdhU2MxRk5GRSthc1hqVnFL?=
 =?utf-8?B?SnV3VVByYzlHZytuSE1GZUp1TDgyRk5YRE90NzhETEEvbjdNQnhqWmZVTFB2?=
 =?utf-8?B?eGpKQ2RkeWJlQUZQRS9wd0JLS09DdndOR3JSY2JUNVdteVp5cUJBOU82cGJC?=
 =?utf-8?B?M3VaQi9zOTl0U3Y3N3Qya0lIVVhYMi9GVm5jbEMrOTlNcHVXd0s4RFpEY1NI?=
 =?utf-8?B?UXNCR1VtWFQrMWs5L1puWWVKVE9iZm9JZVBjN0lPSEFJcVVtMFg4Q0hZRXpJ?=
 =?utf-8?B?amMzMUw2eWFkaXNzUzV3L1RMOGxUQk5GejVFUW9FcmNxMmpJaU1EeWdyMGYx?=
 =?utf-8?B?NGlQUWpQbEZHWit0VGM1TDJEek03d1dxZmdFbis4NURiK0YwVUhZMU1kZnJh?=
 =?utf-8?B?SXlleFllZE4xb2ptbHZTRGdGaDN4SUJkdDdZTEdWT21jWlNqUkJLTEcyc3Zt?=
 =?utf-8?B?dHNsTFk4cWFGK3FNNEJMYmpRekNMY1luM0xxVXlrcUhReXBWR1FPOWNSZnBX?=
 =?utf-8?B?aEE9PQ==?=
X-OriginatorOrg: corigine.com
X-MS-Exchange-CrossTenant-Network-Message-Id: ed4a1fc4-2445-42a1-36f8-08dbb5cc89ea
X-MS-Exchange-CrossTenant-AuthSource: SJ0PR13MB5545.namprd13.prod.outlook.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Sep 2023 09:17:09.8034 (UTC)
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
X-MS-Exchange-CrossTenant-Id: fe128f2c-073b-4c20-818e-7246a585940c
X-MS-Exchange-CrossTenant-MailboxType: HOSTED
X-MS-Exchange-CrossTenant-UserPrincipalName: n3tK5oVy/pj7kqqnp3AZz3WIsTyQ7fpMlQNF40WNCbGa2bI8HlOqMJ8gNxzJijMHdRYixiWzpDoQroRwDyUoGAtHXXhWK1AER9w4kF+wzXA=
X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR13MB4773
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org

Sync the logic from kernel driver, use the new entry function from the
PCIe module instead of the cppcore module.

Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>
---
 drivers/net/nfp/nfp_ethdev.c           |   9 +-
 drivers/net/nfp/nfpcore/nfp6000_pcie.c | 197 ++++++++++---------------
 drivers/net/nfp/nfpcore/nfp6000_pcie.h |   6 +
 drivers/net/nfp/nfpcore/nfp_cpp.h      |  36 +----
 drivers/net/nfp/nfpcore/nfp_cppcore.c  |  68 ++++++---
 5 files changed, 141 insertions(+), 175 deletions(-)

diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index 5d129d0ad3..6eefec3836 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -23,6 +23,7 @@
 #include "nfpcore/nfp_mip.h"
 #include "nfpcore/nfp_rtsym.h"
 #include "nfpcore/nfp_nsp.h"
+#include "nfpcore/nfp6000_pcie.h"
 
 #include "nfp_common.h"
 #include "nfp_ctrl.h"
@@ -917,9 +918,9 @@ nfp_pf_init(struct rte_pci_device *pci_dev)
 	 * use a lock file if UIO is being used.
 	 */
 	if (pci_dev->kdrv == RTE_PCI_KDRV_VFIO)
-		cpp = nfp_cpp_from_device_name(pci_dev, 0);
+		cpp = nfp_cpp_from_nfp6000_pcie(pci_dev, false);
 	else
-		cpp = nfp_cpp_from_device_name(pci_dev, 1);
+		cpp = nfp_cpp_from_nfp6000_pcie(pci_dev, true);
 
 	if (cpp == NULL) {
 		PMD_INIT_LOG(ERR, "A CPP handle can not be obtained");
@@ -1120,9 +1121,9 @@ nfp_pf_secondary_init(struct rte_pci_device *pci_dev)
 	 * use a lock file if UIO is being used.
 	 */
 	if (pci_dev->kdrv == RTE_PCI_KDRV_VFIO)
-		cpp = nfp_cpp_from_device_name(pci_dev, 0);
+		cpp = nfp_cpp_from_nfp6000_pcie(pci_dev, false);
 	else
-		cpp = nfp_cpp_from_device_name(pci_dev, 1);
+		cpp = nfp_cpp_from_nfp6000_pcie(pci_dev, true);
 
 	if (cpp == NULL) {
 		PMD_INIT_LOG(ERR, "A CPP handle can not be obtained");
diff --git a/drivers/net/nfp/nfpcore/nfp6000_pcie.c b/drivers/net/nfp/nfpcore/nfp6000_pcie.c
index 4f453f19a9..e32ac1107c 100644
--- a/drivers/net/nfp/nfpcore/nfp6000_pcie.c
+++ b/drivers/net/nfp/nfpcore/nfp6000_pcie.c
@@ -98,6 +98,24 @@ struct nfp_pcie_user {
 	char *cfg;
 };
 
+/* Generic CPP bus access interface. */
+struct nfp6000_area_priv {
+	struct nfp_bar *bar;
+	uint32_t bar_offset;
+
+	int target;
+	int action;
+	int token;
+	uint64_t offset;
+	struct {
+		int read;
+		int write;
+		int bar;
+	} width;
+	size_t size;
+	char *iomem;
+};
+
 static uint32_t
 nfp_bar_maptype(struct nfp_bar *bar)
 {
@@ -334,24 +352,6 @@ nfp_disable_bars(struct nfp_pcie_user *nfp)
 	}
 }
 
-/* Generic CPP bus access interface. */
-struct nfp6000_area_priv {
-	struct nfp_bar *bar;
-	uint32_t bar_offset;
-
-	uint32_t target;
-	uint32_t action;
-	uint32_t token;
-	uint64_t offset;
-	struct {
-		int read;
-		int write;
-		int bar;
-	} width;
-	size_t size;
-	char *iomem;
-};
-
 static int
 nfp6000_area_init(struct nfp_cpp_area *area,
 		uint32_t dest,
@@ -624,87 +624,6 @@ nfp_acquire_process_lock(struct nfp_pcie_user *desc)
 	return 0;
 }
 
-static int
-nfp6000_set_model(struct rte_pci_device *dev,
-		struct nfp_cpp *cpp)
-{
-	uint32_t model;
-
-	if (rte_pci_read_config(dev, &model, 4, 0x2e) < 0) {
-		PMD_DRV_LOG(ERR, "nfp set model failed");
-		return -1;
-	}
-
-	model  = model << 16;
-	nfp_cpp_model_set(cpp, model);
-
-	return 0;
-}
-
-static int
-nfp6000_set_interface(struct rte_pci_device *dev,
-		struct nfp_cpp *cpp)
-{
-	uint16_t interface;
-
-	if (rte_pci_read_config(dev, &interface, 2, 0x154) < 0) {
-		PMD_DRV_LOG(ERR, "nfp set interface failed");
-		return -1;
-	}
-
-	nfp_cpp_interface_set(cpp, interface);
-
-	return 0;
-}
-
-static int
-nfp6000_set_serial(struct rte_pci_device *dev,
-		struct nfp_cpp *cpp)
-{
-	off_t pos;
-	uint16_t tmp;
-	uint8_t serial[6];
-	int serial_len = 6;
-
-	pos = rte_pci_find_ext_capability(dev, RTE_PCI_EXT_CAP_ID_DSN);
-	if (pos <= 0) {
-		PMD_DRV_LOG(ERR, "PCI_EXT_CAP_ID_DSN not found. nfp set serial failed");
-		return -1;
-	} else {
-		pos += 6;
-	}
-
-	if (rte_pci_read_config(dev, &tmp, 2, pos) < 0) {
-		PMD_DRV_LOG(ERR, "nfp set serial failed");
-		return -1;
-	}
-
-	serial[4] = (uint8_t)((tmp >> 8) & 0xff);
-	serial[5] = (uint8_t)(tmp & 0xff);
-
-	pos += 2;
-	if (rte_pci_read_config(dev, &tmp, 2, pos) < 0) {
-		PMD_DRV_LOG(ERR, "nfp set serial failed");
-		return -1;
-	}
-
-	serial[2] = (uint8_t)((tmp >> 8) & 0xff);
-	serial[3] = (uint8_t)(tmp & 0xff);
-
-	pos += 2;
-	if (rte_pci_read_config(dev, &tmp, 2, pos) < 0) {
-		PMD_DRV_LOG(ERR, "nfp set serial failed");
-		return -1;
-	}
-
-	serial[0] = (uint8_t)((tmp >> 8) & 0xff);
-	serial[1] = (uint8_t)(tmp & 0xff);
-
-	nfp_cpp_serial_set(cpp, serial, serial_len);
-
-	return 0;
-}
-
 static int
 nfp6000_get_dsn(struct rte_pci_device *pci_dev,
 		uint64_t *dsn)
@@ -795,12 +714,7 @@ nfp6000_init(struct nfp_cpp *cpp,
 		struct rte_pci_device *dev)
 {
 	int ret = 0;
-	struct nfp_pcie_user *desc;
-
-	desc = malloc(sizeof(*desc));
-	if (desc == NULL)
-		return -1;
-
+	struct nfp_pcie_user *desc = nfp_cpp_priv(cpp);
 
 	memset(desc->busdev, 0, BUSDEV_SZ);
 	strlcpy(desc->busdev, dev->device.name, sizeof(desc->busdev));
@@ -809,17 +723,11 @@ nfp6000_init(struct nfp_cpp *cpp,
 			nfp_cpp_driver_need_lock(cpp)) {
 		ret = nfp_acquire_process_lock(desc);
 		if (ret != 0)
-			goto error;
+			return -1;
 	}
 
-	if (nfp6000_set_model(dev, cpp) < 0)
-		goto error;
-	if (nfp6000_set_interface(dev, cpp) < 0)
-		goto error;
-	if (nfp6000_set_serial(dev, cpp) < 0)
-		goto error;
 	if (nfp6000_set_barsz(dev, desc) < 0)
-		goto error;
+		return -1;
 
 	desc->cfg = dev->mem_resource[0].addr;
 	desc->dev_id = dev->addr.function & 0x7;
@@ -830,13 +738,7 @@ nfp6000_init(struct nfp_cpp *cpp,
 		return -1;
 	}
 
-	nfp_cpp_priv_set(cpp, desc);
-
 	return 0;
-
-error:
-	free(desc);
-	return -1;
 }
 
 static void
@@ -848,7 +750,7 @@ nfp6000_free(struct nfp_cpp *cpp)
 	if (nfp_cpp_driver_need_lock(cpp))
 		close(desc->lock);
 	close(desc->device);
-	free(desc);
+	rte_free(desc);
 }
 
 static const struct nfp_cpp_operations nfp6000_pcie_ops = {
@@ -873,3 +775,58 @@ nfp_cpp_operations *nfp_cpp_transport_operations(void)
 {
 	return &nfp6000_pcie_ops;
 }
+
+/**
+ * Build a NFP CPP bus from a NFP6000 PCI device
+ *
+ * @param pdev
+ *   NFP6000 PCI device
+ * @param driver_lock_needed
+ *   driver lock flag
+ *
+ * @return
+ *   NFP CPP handle or NULL
+ */
+struct nfp_cpp *
+nfp_cpp_from_nfp6000_pcie(struct rte_pci_device *pci_dev,
+		bool driver_lock_needed)
+{
+	int ret;
+	struct nfp_cpp *cpp;
+	uint16_t interface = 0;
+	struct nfp_pcie_user *nfp;
+
+	nfp = rte_zmalloc(NULL, sizeof(*nfp), 0);
+	if (nfp == NULL)
+		return NULL;
+
+	ret = nfp6000_get_interface(pci_dev, &interface);
+	if (ret != 0) {
+		PMD_DRV_LOG(ERR, "Get interface failed.");
+		rte_free(nfp);
+		return NULL;
+	}
+
+	if (NFP_CPP_INTERFACE_TYPE_of(interface) != NFP_CPP_INTERFACE_TYPE_PCI) {
+		PMD_DRV_LOG(ERR, "Interface type is not right.");
+		rte_free(nfp);
+		return NULL;
+	}
+
+	if (NFP_CPP_INTERFACE_CHANNEL_of(interface) !=
+			NFP_CPP_INTERFACE_CHANNEL_PEROPENER) {
+		PMD_DRV_LOG(ERR, "Interface channel is not right");
+		rte_free(nfp);
+		return NULL;
+	}
+
+	/* Probe for all the common NFP devices */
+	cpp = nfp_cpp_from_device_name(pci_dev, nfp, driver_lock_needed);
+	if (cpp == NULL) {
+		PMD_DRV_LOG(ERR, "Get cpp from operation failed");
+		rte_free(nfp);
+		return NULL;
+	}
+
+	return cpp;
+}
diff --git a/drivers/net/nfp/nfpcore/nfp6000_pcie.h b/drivers/net/nfp/nfpcore/nfp6000_pcie.h
index e126457d45..8847f6f946 100644
--- a/drivers/net/nfp/nfpcore/nfp6000_pcie.h
+++ b/drivers/net/nfp/nfpcore/nfp6000_pcie.h
@@ -6,8 +6,14 @@
 #ifndef __NFP6000_PCIE_H__
 #define __NFP6000_PCIE_H__
 
+#include <ethdev_pci.h>
+
 #include "nfp_cpp.h"
+#include "nfp_dev.h"
 
 const struct nfp_cpp_operations *nfp_cpp_transport_operations(void);
 
+struct nfp_cpp *nfp_cpp_from_nfp6000_pcie(struct rte_pci_device *pci_dev,
+		bool driver_lock_needed);
+
 #endif /* __NFP6000_PCIE_H__ */
diff --git a/drivers/net/nfp/nfpcore/nfp_cpp.h b/drivers/net/nfp/nfpcore/nfp_cpp.h
index 0f36ba0b50..e879c7c920 100644
--- a/drivers/net/nfp/nfpcore/nfp_cpp.h
+++ b/drivers/net/nfp/nfpcore/nfp_cpp.h
@@ -226,40 +226,12 @@ uint32_t nfp_cpp_model_autodetect(struct nfp_cpp *cpp, uint32_t *model);
 
 /* NFP CPP core interface for CPP clients */
 struct nfp_cpp *nfp_cpp_from_device_name(struct rte_pci_device *dev,
-		int driver_lock_needed);
+		void *priv, bool driver_lock_needed);
 
 void nfp_cpp_free(struct nfp_cpp *cpp);
 
 #define NFP_CPP_MODEL_INVALID   0xffffffff
 
-/**
- * Retrieve the chip ID from the model ID
- *
- * The chip ID is a 16-bit BCD+A-F encoding for the chip type.
- *
- * @param model
- *   NFP CPP model id
- *
- * @return
- *   NFP CPP chip id
- */
-#define NFP_CPP_MODEL_CHIP_of(model)        (((model) >> 16) & 0xffff)
-
-/**
- * Check for the NFP6000 family of devices
- *
- * NOTE: The NFP4000 series is considered as a NFP6000 series variant.
- *
- * @param model
- *   NFP CPP model id
- *
- * @return
- *   true if model is in the NFP6000 family, false otherwise.
- */
-#define NFP_CPP_MODEL_IS_6000(model)                         \
-		((NFP_CPP_MODEL_CHIP_of(model) >= 0x3800) && \
-		(NFP_CPP_MODEL_CHIP_of(model) < 0x7000))
-
 uint32_t nfp_cpp_model(struct nfp_cpp *cpp);
 
 /*
@@ -330,6 +302,12 @@ uint32_t nfp_cpp_model(struct nfp_cpp *cpp);
  */
 #define NFP_CPP_INTERFACE_CHANNEL_of(interface)	(((interface) >>  0) & 0xff)
 
+/*
+ * Use this channel ID for multiple virtual channel interfaces
+ * (ie ARM and PCIe) when setting up the interface field.
+ */
+#define NFP_CPP_INTERFACE_CHANNEL_PEROPENER    255
+
 uint16_t nfp_cpp_interface(struct nfp_cpp *cpp);
 
 uint32_t nfp_cpp_serial(struct nfp_cpp *cpp, const uint8_t **serial);
diff --git a/drivers/net/nfp/nfpcore/nfp_cppcore.c b/drivers/net/nfp/nfpcore/nfp_cppcore.c
index 0c1a03b0ab..d70c8cd44a 100644
--- a/drivers/net/nfp/nfpcore/nfp_cppcore.c
+++ b/drivers/net/nfp/nfpcore/nfp_cppcore.c
@@ -909,10 +909,13 @@ nfp_xpb_readl(struct nfp_cpp *cpp,
 }
 
 static struct nfp_cpp *
-nfp_cpp_alloc(struct rte_pci_device *dev,
-		int driver_lock_needed)
+nfp_cpp_alloc(struct rte_pci_device *pci_dev,
+		void *priv,
+		bool driver_lock_needed)
 {
 	int err;
+	size_t target;
+	uint32_t xpb_addr;
 	struct nfp_cpp *cpp;
 	const struct nfp_cpp_operations *ops;
 
@@ -925,32 +928,50 @@ nfp_cpp_alloc(struct rte_pci_device *dev,
 		return NULL;
 
 	cpp->op = ops;
+	cpp->priv = priv;
 	cpp->driver_lock_needed = driver_lock_needed;
 
-	if (cpp->op->init) {
-		err = cpp->op->init(cpp, dev);
+	err = ops->get_interface(pci_dev, &cpp->interface);
+	if (err != 0) {
+		rte_free(cpp);
+		return NULL;
+	}
+
+	err = ops->get_serial(pci_dev, cpp->serial, NFP_SERIAL_LEN);
+	if (err != 0) {
+		rte_free(cpp);
+		return NULL;
+	}
+
+	/*
+	 * NOTE: cpp_lock is NOT locked for op->init,
+	 * since it may call NFP CPP API operations
+	 */
+	err = cpp->op->init(cpp, pci_dev);
+	if (err < 0) {
+		PMD_DRV_LOG(ERR, "NFP interface initialization failed");
+		rte_free(cpp);
+		return NULL;
+	}
+
+	err = nfp_cpp_model_autodetect(cpp, &cpp->model);
+	if (err < 0) {
+		PMD_DRV_LOG(ERR, "NFP model detection failed");
+		rte_free(cpp);
+		return NULL;
+	}
+
+	for (target = 0; target < RTE_DIM(cpp->imb_cat_table); target++) {
+		/* Hardcoded XPB IMB Base, island 0 */
+		xpb_addr = 0x000a0000 + (target * 4);
+		err = nfp_xpb_readl(cpp, xpb_addr, &cpp->imb_cat_table[target]);
 		if (err < 0) {
+			PMD_DRV_LOG(ERR, "Can't read CPP mapping from device");
 			rte_free(cpp);
 			return NULL;
 		}
 	}
 
-	if (NFP_CPP_MODEL_IS_6000(nfp_cpp_model(cpp))) {
-		uint32_t xpb_addr;
-		size_t target;
-
-		for (target = 0; target < RTE_DIM(cpp->imb_cat_table); target++) {
-			/* Hardcoded XPB IMB Base, island 0 */
-			xpb_addr = 0x000a0000 + (target * 4);
-			err = nfp_xpb_readl(cpp, xpb_addr,
-					(uint32_t *)&cpp->imb_cat_table[target]);
-			if (err < 0) {
-				rte_free(cpp);
-				return NULL;
-			}
-		}
-	}
-
 	err = nfp_cpp_set_mu_locality_lsb(cpp);
 	if (err < 0) {
 		PMD_DRV_LOG(ERR, "Can't calculate MU locality bit offset");
@@ -981,6 +1002,8 @@ nfp_cpp_free(struct nfp_cpp *cpp)
  *
  * @param dev
  *   PCI device
+ * @param priv
+ *   Private data of low-level implementation
  * @param driver_lock_needed
  *   Driver lock flag
  *
@@ -991,9 +1014,10 @@ nfp_cpp_free(struct nfp_cpp *cpp)
  */
 struct nfp_cpp *
 nfp_cpp_from_device_name(struct rte_pci_device *dev,
-		int driver_lock_needed)
+		void *priv,
+		bool driver_lock_needed)
 {
-	return nfp_cpp_alloc(dev, driver_lock_needed);
+	return nfp_cpp_alloc(dev, priv, driver_lock_needed);
 }
 
 /**
-- 
2.39.1