From patchwork Fri Oct 7 17:43:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Boyer, Andrew" X-Patchwork-Id: 117593 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 46B8CA04FD; Fri, 7 Oct 2022 19:45:51 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9F1C7427F7; Fri, 7 Oct 2022 19:44:44 +0200 (CEST) Received: from NAM04-MW2-obe.outbound.protection.outlook.com (mail-mw2nam04on2051.outbound.protection.outlook.com [40.107.101.51]) by mails.dpdk.org (Postfix) with ESMTP id F280142B93 for ; Fri, 7 Oct 2022 19:44:40 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mDGvIbPdfpMpFBy2kTR9Q1T3qnhhUuFZty68F0TxtE77m5i1RQYgNzYr4ke5Ew/1oZDTGtttsZpXH3bAqG5dDZzRiegMHcUc9bUc3bIKsjHLKSGz7FUGC+rT1YhxrxjQ7rijiv6UILS+mnxiKp6RKeDOPF9RfKtkFpCtODOPKJWftiJh86vPRBg6stED6KnG5wqDf19g6cLMbUowXS/XoHe5e6GXPkRPgv7HyGoHYlfv89OfwGHWB9OWgjQh0xPaa5izQ1JKml9CchXUwDMW4H3kFhvZUJGYzB5tTyLk7XikmmS2LhcxFLwSlpw3PJG/nP8j6BFKGomr8y50NmzGnw== 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=hWE7I8qgxoToYDQT8j6pVt6TGWqbaJh8yr7CudC5aug=; b=Fs54WT6eIR5rH4wLyOlyAy2Zn0bp50vfUMRo5j0OIvBqH2bbYoTmN6fAdoMcTauxkcGrl3XxIvhr4Whg8oR0zi4oDDp7KLjQsUopqnSYznvby7Qz9t7Y2tnyZD7z/e83/rAjPtXwBvyo2lkzLizk2KfZ12ln4lN2xxMT4owz+RRz06tOl9XECYYTURZD+XcsJB+Zg3yDBFFEfzwxKxziXO3uECu2ING0YjsWpYlgSmlTKFisdLVdJAWhxC80TeG97yhbU0j+nGPCbS3l1u43fDcNs9xSJzbXW2sWONRLQ+dfN5GjHMhrWBe1tYJ2y/bbsQSboOSNUY1LuhtsfZUkjw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=dpdk.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=hWE7I8qgxoToYDQT8j6pVt6TGWqbaJh8yr7CudC5aug=; b=WIeeGP+GT6HJqembxrECYDTM+h/rIHS9XNo87WxkLZfWQ5J3/PcEuflRtRjDdMoGpTCO16gUPAM8PYsDtjfe5rd7RKDBL43oL8j/OLjhHH2Gm820Vi6VwqCrdBK9rs32ifLiJdjX9zqjw1mZc52Fp5k3OT6IsUC3owH8SJ97Z5w= Received: from MW3PR05CA0026.namprd05.prod.outlook.com (2603:10b6:303:2b::31) by DM4PR12MB5102.namprd12.prod.outlook.com (2603:10b6:5:391::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5676.24; Fri, 7 Oct 2022 17:44:38 +0000 Received: from CO1NAM11FT015.eop-nam11.prod.protection.outlook.com (2603:10b6:303:2b:cafe::e8) by MW3PR05CA0026.outlook.office365.com (2603:10b6:303:2b::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5723.13 via Frontend Transport; Fri, 7 Oct 2022 17:44:38 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by CO1NAM11FT015.mail.protection.outlook.com (10.13.175.130) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.5709.10 via Frontend Transport; Fri, 7 Oct 2022 17:44:37 +0000 Received: from driver-dev1.pensando.io (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.28; Fri, 7 Oct 2022 12:44:35 -0500 From: Andrew Boyer To: CC: Andrew Boyer , Neel Patel , "R Mohamed Shah" Subject: [PATCH 12/35] net/ionic: move PCI-specific code to a separate file Date: Fri, 7 Oct 2022 10:43:13 -0700 Message-ID: <20221007174336.54354-13-andrew.boyer@amd.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20221007174336.54354-1-andrew.boyer@amd.com> References: <20221007174336.54354-1-andrew.boyer@amd.com> MIME-Version: 1.0 X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1NAM11FT015:EE_|DM4PR12MB5102:EE_ X-MS-Office365-Filtering-Correlation-Id: 71623af8-f1d9-47ba-6729-08daa88b9ac1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: wq/0ljY41SIO0YjmU+qXO38hPurpxeOVDNyEZ4XrdKQUpjUWsTkSe6LuvjhnvGA18n4VPXqyvQFCi3RqgSHfTJC4E1a9hJxE1eEDHGtWVfbEszYlLgbAHxUi85jxxVskBKSYEHON/5lrKR5HoZpy9WM/1epXzXKQbRVUV5OqSM3I/q1UOCeAInPtu5+gBMAV+AR/hKXK37mOPWeyxb9R28iC4Aq+lQxWu7muRv7RFkKIcFVxiVDSL4jKX1JACvVK8Im8Qq721HJY8A4N/6agkdKYR7rEv6hP1T0VF7C1V/y72N3v4CA90OV8hJnxzvQrvpLdgBg7kY5cp0C8XV+eMh5+VfVhA491z7dZWB6+dKRqCC42Fzkmr3F0fLUtykM26Q/wzBo+l9C/939qiYu+gWc7abrZpTGtG9kaFEjK+QrDbJZw1o+ol2R83LXq/SACaElle+V9IQsLPvemhhQX9uhEdhCtVefnwKi/VEo/e05GqQ9fyHvnxgchHkoNlKqHdKmze8Im5DQjWSW/Uv7LyLrLt0fyX5kP4LaEoSlulX/pNwvNJzcWXG/K748XDiNPJhUXPPNiQEIsMTNhYE0QKiWyRTehmgniSj+qxFCtPkneJ/w3Y/MxuFGY7XXL0H1gmQW2FE6DjECwjxSpRi74mrLTU/RUBJzb8cX1gBfZQ7gxbz+oI5xqfUUyAZz+i/eh22JVmmZM1RsAjEsdLfJnZ5tSUOiUDarJEoCMbySMYqmxpp5kKsGMM+uhEUB1VT1xDWyO//3ezLeyMfWM9cjzenvLnW3tz1qVtVqNAbzGrK0/6k2IdZ6cJvbhathYfhZ/ X-Forefront-Antispam-Report: CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:SATLEXMB04.amd.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230022)(4636009)(346002)(376002)(136003)(39860400002)(396003)(451199015)(36840700001)(40470700004)(46966006)(44832011)(30864003)(5660300002)(2906002)(41300700001)(8936002)(70206006)(6916009)(36860700001)(316002)(54906003)(6666004)(4326008)(36756003)(8676002)(70586007)(478600001)(40460700003)(86362001)(26005)(83380400001)(82740400003)(82310400005)(2616005)(426003)(81166007)(40480700001)(356005)(16526019)(336012)(186003)(1076003)(47076005)(36900700001); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Oct 2022 17:44:37.4914 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 71623af8-f1d9-47ba-6729-08daa88b9ac1 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT015.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB5102 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org For future support of virtual devices, move the PCI code to its own file. Create a new device interface, struct ionic_dev_intf, to plug in to common code. Signed-off-by: Andrew Boyer Signed-off-by: Neel Patel Signed-off-by: R Mohamed Shah --- drivers/net/ionic/ionic.h | 13 +- drivers/net/ionic/ionic_dev.c | 62 --------- drivers/net/ionic/ionic_dev.h | 13 +- drivers/net/ionic/ionic_dev_pci.c | 216 ++++++++++++++++++++++++++++++ drivers/net/ionic/ionic_ethdev.c | 161 ++++++---------------- drivers/net/ionic/ionic_ethdev.h | 9 ++ drivers/net/ionic/ionic_main.c | 2 +- drivers/net/ionic/meson.build | 1 + 8 files changed, 286 insertions(+), 191 deletions(-) create mode 100644 drivers/net/ionic/ionic_dev_pci.c diff --git a/drivers/net/ionic/ionic.h b/drivers/net/ionic/ionic.h index ebe23ad4e6..6bfab623f7 100644 --- a/drivers/net/ionic/ionic.h +++ b/drivers/net/ionic/ionic.h @@ -8,8 +8,6 @@ #include #include -#include - #include "ionic_dev.h" #include "ionic_if.h" #include "ionic_osdep.h" @@ -42,6 +40,11 @@ struct ionic_hw { uint16_t vendor_id; }; +struct ionic_bars { + struct ionic_dev_bar bar[IONIC_BARS_MAX]; + uint32_t num_bars; +}; + /* * Structure to store private data for each driver instance (for each adapter). */ @@ -49,10 +52,10 @@ struct ionic_adapter { struct ionic_hw hw; struct ionic_dev idev; const char *name; - struct ionic_dev_bar bars[IONIC_BARS_MAX]; + struct ionic_bars bars; + const struct ionic_dev_intf *intf; struct ionic_identity ident; struct ionic_lif *lif; - uint32_t num_bars; uint32_t max_ntxqs_per_lif; uint32_t max_nrxqs_per_lif; uint32_t max_mac_addrs; @@ -61,7 +64,7 @@ struct ionic_adapter { bool intrs[IONIC_INTR_CTRL_REGS_MAX]; bool link_up; char fw_version[IONIC_DEVINFO_FWVERS_BUFLEN]; - struct rte_pci_device *pci_dev; + void *bus_dev; }; /** ionic_admin_ctx - Admin command context. diff --git a/drivers/net/ionic/ionic_dev.c b/drivers/net/ionic/ionic_dev.c index a631523e59..d0d2ab1b17 100644 --- a/drivers/net/ionic/ionic_dev.c +++ b/drivers/net/ionic/ionic_dev.c @@ -10,68 +10,6 @@ #include "ionic_lif.h" #include "ionic.h" -int -ionic_dev_setup(struct ionic_adapter *adapter) -{ - struct ionic_dev_bar *bar = adapter->bars; - unsigned int num_bars = adapter->num_bars; - struct ionic_dev *idev = &adapter->idev; - uint32_t sig; - u_char *bar0_base; - unsigned int i; - - /* BAR0: dev_cmd and interrupts */ - if (num_bars < 1) { - IONIC_PRINT(ERR, "No bars found, aborting"); - return -EFAULT; - } - - if (bar->len < IONIC_BAR0_SIZE) { - IONIC_PRINT(ERR, - "Resource bar size %lu too small, aborting", - bar->len); - return -EFAULT; - } - - bar0_base = bar->vaddr; - idev->dev_info = (union ionic_dev_info_regs *) - &bar0_base[IONIC_BAR0_DEV_INFO_REGS_OFFSET]; - idev->dev_cmd = (union ionic_dev_cmd_regs *) - &bar0_base[IONIC_BAR0_DEV_CMD_REGS_OFFSET]; - idev->intr_status = (struct ionic_intr_status *) - &bar0_base[IONIC_BAR0_INTR_STATUS_OFFSET]; - idev->intr_ctrl = (struct ionic_intr *) - &bar0_base[IONIC_BAR0_INTR_CTRL_OFFSET]; - - sig = ioread32(&idev->dev_info->signature); - if (sig != IONIC_DEV_INFO_SIGNATURE) { - IONIC_PRINT(ERR, "Incompatible firmware signature %" PRIx32 "", - sig); - return -EFAULT; - } - - for (i = 0; i < IONIC_DEVINFO_FWVERS_BUFLEN; i++) - adapter->fw_version[i] = - ioread8(&idev->dev_info->fw_version[i]); - adapter->fw_version[IONIC_DEVINFO_FWVERS_BUFLEN - 1] = '\0'; - - adapter->name = adapter->pci_dev->device.name; - - IONIC_PRINT(DEBUG, "%s firmware version: %s", - adapter->name, adapter->fw_version); - - /* BAR1: doorbells */ - bar++; - if (num_bars < 2) { - IONIC_PRINT(ERR, "Doorbell bar missing, aborting"); - return -EFAULT; - } - - idev->db_pages = bar->vaddr; - - return 0; -} - /* Devcmd Interface */ uint8_t diff --git a/drivers/net/ionic/ionic_dev.h b/drivers/net/ionic/ionic_dev.h index 600d8f4abd..3b8e9fc3c2 100644 --- a/drivers/net/ionic/ionic_dev.h +++ b/drivers/net/ionic/ionic_dev.h @@ -173,14 +173,23 @@ struct ionic_cq { struct ionic_lif; struct ionic_adapter; struct ionic_qcq; +struct rte_mempool; +struct rte_eth_dev; + +struct ionic_dev_intf { + int (*setup)(struct ionic_adapter *adapter); + void (*copy_bus_info)(struct ionic_adapter *adapter, + struct rte_eth_dev *eth_dev); + int (*configure_intr)(struct ionic_adapter *adapter); + void (*unconfigure_intr)(struct ionic_adapter *adapter); + void (*unmap_bars)(struct ionic_adapter *adapter); +}; void ionic_intr_init(struct ionic_dev *idev, struct ionic_intr_info *intr, unsigned long index); const char *ionic_opcode_to_str(enum ionic_cmd_opcode opcode); -int ionic_dev_setup(struct ionic_adapter *adapter); - void ionic_dev_cmd_go(struct ionic_dev *idev, union ionic_dev_cmd *cmd); uint8_t ionic_dev_cmd_status(struct ionic_dev *idev); bool ionic_dev_cmd_done(struct ionic_dev *idev); diff --git a/drivers/net/ionic/ionic_dev_pci.c b/drivers/net/ionic/ionic_dev_pci.c new file mode 100644 index 0000000000..1735fa9b17 --- /dev/null +++ b/drivers/net/ionic/ionic_dev_pci.c @@ -0,0 +1,216 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2018-2022 Advanced Micro Devices, Inc. All Rights Reserved. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ionic.h" +#include "ionic_if.h" +#include "ionic_dev.h" +#include "ionic_ethdev.h" +#include "ionic_logs.h" + +static const struct rte_pci_id pci_id_ionic_map[] = { + { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_PF) }, + { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_VF) }, + { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_MGMT) }, + { .vendor_id = 0, /* sentinel */ }, +}; + +static int +ionic_pci_setup(struct ionic_adapter *adapter) +{ + struct ionic_dev_bar *bar = adapter->bars.bar; + unsigned int num_bars = adapter->bars.num_bars; + struct ionic_dev *idev = &adapter->idev; + struct rte_pci_device *bus_dev = adapter->bus_dev; + uint32_t sig; + u_char *bar0_base; + unsigned int i; + + /* BAR0: dev_cmd and interrupts */ + if (num_bars < 1) { + IONIC_PRINT(ERR, "No bars found, aborting\n"); + return -EFAULT; + } + + if (bar->len < IONIC_BAR0_SIZE) { + IONIC_PRINT(ERR, + "Resource bar size %lu too small, aborting\n", + bar->len); + return -EFAULT; + } + + bar0_base = bar->vaddr; + idev->dev_info = (union ionic_dev_info_regs *) + &bar0_base[IONIC_BAR0_DEV_INFO_REGS_OFFSET]; + idev->dev_cmd = (union ionic_dev_cmd_regs *) + &bar0_base[IONIC_BAR0_DEV_CMD_REGS_OFFSET]; + idev->intr_status = (struct ionic_intr_status *) + &bar0_base[IONIC_BAR0_INTR_STATUS_OFFSET]; + idev->intr_ctrl = (struct ionic_intr *) + &bar0_base[IONIC_BAR0_INTR_CTRL_OFFSET]; + + sig = ioread32(&idev->dev_info->signature); + if (sig != IONIC_DEV_INFO_SIGNATURE) { + IONIC_PRINT(ERR, "Incompatible firmware signature %#x", + sig); + return -EFAULT; + } + + for (i = 0; i < IONIC_DEVINFO_FWVERS_BUFLEN; i++) + adapter->fw_version[i] = + ioread8(&idev->dev_info->fw_version[i]); + adapter->fw_version[IONIC_DEVINFO_FWVERS_BUFLEN - 1] = '\0'; + + adapter->name = bus_dev->device.name; + + IONIC_PRINT(DEBUG, "%s firmware version: %s", + adapter->name, adapter->fw_version); + + /* BAR1: doorbells */ + bar++; + if (num_bars < 2) { + IONIC_PRINT(ERR, "Doorbell bar missing, aborting\n"); + return -EFAULT; + } + + idev->db_pages = bar->vaddr; + + return 0; +} + +static void +ionic_pci_copy_bus_info(struct ionic_adapter *adapter, + struct rte_eth_dev *eth_dev) +{ + rte_eth_copy_pci_info(eth_dev, adapter->bus_dev); +} + +static int +ionic_pci_configure_intr(struct ionic_adapter *adapter) +{ + struct rte_pci_device *pci_dev = + (struct rte_pci_device *)(adapter->bus_dev); + struct rte_intr_handle *intr_handle = pci_dev->intr_handle; + int err; + + IONIC_PRINT(ERR, "Configuring %u intrs", adapter->nintrs); + + if (rte_intr_efd_enable(intr_handle, adapter->nintrs)) { + IONIC_PRINT(ERR, "Fail to create eventfd"); + return -1; + } + + if (rte_intr_dp_is_en(intr_handle)) { + IONIC_PRINT(NOTICE, + "Packet I/O interrupt on datapath is enabled"); + if (rte_intr_vec_list_alloc(intr_handle, "intr_vec", + adapter->nintrs)) { + IONIC_PRINT(ERR, "Failed to allocate %u vectors", + adapter->nintrs); + return -ENOMEM; + } + } + + err = rte_intr_callback_register(intr_handle, + ionic_dev_interrupt_handler, + adapter); + if (err) { + IONIC_PRINT(ERR, + "Failure registering interrupts handler (%d)", err); + return err; + } + + /* enable intr mapping */ + err = rte_intr_enable(intr_handle); + if (err) { + IONIC_PRINT(ERR, "Failure enabling interrupts (%d)", err); + return err; + } + + return 0; +} + +static void +ionic_pci_unconfigure_intr(struct ionic_adapter *adapter) +{ + struct rte_pci_device *pci_dev = + (struct rte_pci_device *)(adapter->bus_dev); + struct rte_intr_handle *intr_handle = pci_dev->intr_handle; + + rte_intr_disable(intr_handle); + + rte_intr_callback_unregister(intr_handle, + ionic_dev_interrupt_handler, + adapter); +} + +static const struct ionic_dev_intf ionic_pci_intf = { + .setup = ionic_pci_setup, + .copy_bus_info = ionic_pci_copy_bus_info, + .configure_intr = ionic_pci_configure_intr, + .unconfigure_intr = ionic_pci_unconfigure_intr, +}; + +static int +eth_ionic_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, + struct rte_pci_device *pci_dev) +{ + struct rte_mem_resource *resource; + struct ionic_bars bars; + unsigned long i; + + IONIC_PRINT(NOTICE, "Initializing device %s %s", + pci_dev->device.name, + rte_eal_process_type() == RTE_PROC_SECONDARY ? + "[SECONDARY]" : ""); + + bars.num_bars = 0; + for (i = 0; i < PCI_MAX_RESOURCE && i < IONIC_BARS_MAX; i++) { + resource = &pci_dev->mem_resource[i]; + if (resource->phys_addr == 0 || resource->len == 0) + continue; + + bars.bar[bars.num_bars].vaddr = resource->addr; + bars.bar[bars.num_bars].bus_addr = resource->phys_addr; + bars.bar[bars.num_bars].len = resource->len; + bars.num_bars++; + } + + return eth_ionic_dev_probe((void *)pci_dev, + &pci_dev->device, + &bars, + &ionic_pci_intf, + pci_dev->id.device_id, + pci_dev->id.vendor_id); +} + +static int +eth_ionic_pci_remove(struct rte_pci_device *pci_dev) +{ + return eth_ionic_dev_remove(&pci_dev->device); +} + +static struct rte_pci_driver rte_pci_ionic_pmd = { + .id_table = pci_id_ionic_map, + .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC, + .probe = eth_ionic_pci_probe, + .remove = eth_ionic_pci_remove, +}; + +RTE_PMD_REGISTER_PCI(net_ionic_pci, rte_pci_ionic_pmd); +RTE_PMD_REGISTER_PCI_TABLE(net_ionic_pci, pci_id_ionic_map); +RTE_PMD_REGISTER_KMOD_DEP(net_ionic_pci, "* igb_uio | uio_pci_generic | vfio-pci"); diff --git a/drivers/net/ionic/ionic_ethdev.c b/drivers/net/ionic/ionic_ethdev.c index efea691b8f..186cde8330 100644 --- a/drivers/net/ionic/ionic_ethdev.c +++ b/drivers/net/ionic/ionic_ethdev.c @@ -2,12 +2,9 @@ * Copyright 2018-2022 Advanced Micro Devices, Inc. All Rights Reserved. */ -#include -#include #include #include #include -#include #include "ionic_logs.h" #include "ionic.h" @@ -57,13 +54,6 @@ static int ionic_dev_xstats_get_names_by_id(struct rte_eth_dev *dev, static int ionic_dev_fw_version_get(struct rte_eth_dev *eth_dev, char *fw_version, size_t fw_size); -static const struct rte_pci_id pci_id_ionic_map[] = { - { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_PF) }, - { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_VF) }, - { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_MGMT) }, - { .vendor_id = 0, /* sentinel */ }, -}; - static const struct rte_eth_desc_lim rx_desc_lim = { .nb_max = IONIC_MAX_RING_DESC, .nb_min = IONIC_MIN_RING_DESC, @@ -328,7 +318,7 @@ ionic_dev_link_update(struct rte_eth_dev *eth_dev, * @return * void */ -static void +void ionic_dev_interrupt_handler(void *param) { struct ionic_adapter *adapter = (struct ionic_adapter *)param; @@ -946,8 +936,6 @@ ionic_dev_stop(struct rte_eth_dev *eth_dev) return 0; } -static void ionic_unconfigure_intr(struct ionic_adapter *adapter); - /* * Reset and stop device. */ @@ -966,22 +954,24 @@ ionic_dev_close(struct rte_eth_dev *eth_dev) ionic_lif_free_queues(lif); IONIC_PRINT(NOTICE, "Removing device %s", eth_dev->device->name); - ionic_unconfigure_intr(adapter); + if (adapter->intf->unconfigure_intr) + (*adapter->intf->unconfigure_intr)(adapter); rte_eth_dev_destroy(eth_dev, eth_ionic_dev_uninit); ionic_port_reset(adapter); ionic_reset(adapter); + if (adapter->intf->unmap_bars) + (*adapter->intf->unmap_bars)(adapter); rte_free(adapter); return 0; } -static int +int eth_ionic_dev_init(struct rte_eth_dev *eth_dev, void *init_params) { - struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); struct ionic_adapter *adapter = (struct ionic_adapter *)init_params; int err; @@ -997,7 +987,8 @@ eth_ionic_dev_init(struct rte_eth_dev *eth_dev, void *init_params) if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; - rte_eth_copy_pci_info(eth_dev, pci_dev); + if (adapter->intf->copy_bus_info) + (*adapter->intf->copy_bus_info)(adapter, eth_dev); eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; lif->eth_dev = eth_dev; @@ -1068,73 +1059,12 @@ eth_ionic_dev_uninit(struct rte_eth_dev *eth_dev) return 0; } -static int -ionic_configure_intr(struct ionic_adapter *adapter) -{ - struct rte_pci_device *pci_dev = adapter->pci_dev; - struct rte_intr_handle *intr_handle = pci_dev->intr_handle; - int err; - - IONIC_PRINT(DEBUG, "Configuring %u intrs", adapter->nintrs); - - if (rte_intr_efd_enable(intr_handle, adapter->nintrs)) { - IONIC_PRINT(ERR, "Fail to create eventfd"); - return -1; - } - - if (rte_intr_dp_is_en(intr_handle)) { - IONIC_PRINT(DEBUG, - "Packet I/O interrupt on datapath is enabled"); - - if (rte_intr_vec_list_alloc(intr_handle, "intr_vec", - adapter->nintrs)) { - IONIC_PRINT(ERR, "Failed to allocate %u vectors", - adapter->nintrs); - return -ENOMEM; - } - } - - err = rte_intr_callback_register(intr_handle, - ionic_dev_interrupt_handler, - adapter); - - if (err) { - IONIC_PRINT(ERR, - "Failure registering interrupts handler (%d)", - err); - return err; - } - - /* enable intr mapping */ - err = rte_intr_enable(intr_handle); - - if (err) { - IONIC_PRINT(ERR, "Failure enabling interrupts (%d)", err); - return err; - } - - return 0; -} - -static void -ionic_unconfigure_intr(struct ionic_adapter *adapter) -{ - struct rte_pci_device *pci_dev = adapter->pci_dev; - struct rte_intr_handle *intr_handle = pci_dev->intr_handle; - - rte_intr_disable(intr_handle); - - rte_intr_callback_unregister(intr_handle, - ionic_dev_interrupt_handler, - adapter); -} - -static int -eth_ionic_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, - struct rte_pci_device *pci_dev) +int +eth_ionic_dev_probe(void *bus_dev, struct rte_device *rte_dev, + struct ionic_bars *bars, const struct ionic_dev_intf *intf, + uint16_t device_id, uint16_t vendor_id) { char name[RTE_ETH_NAME_MAX_LEN]; - struct rte_mem_resource *resource; struct ionic_adapter *adapter; struct ionic_hw *hw; unsigned long i; @@ -1149,9 +1079,6 @@ eth_ionic_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, goto err; } - IONIC_PRINT(DEBUG, "Initializing device %s", - pci_dev->device.name); - adapter = rte_zmalloc("ionic", sizeof(*adapter), 0); if (!adapter) { IONIC_PRINT(ERR, "OOM"); @@ -1159,11 +1086,12 @@ eth_ionic_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, goto err; } - adapter->pci_dev = pci_dev; + adapter->bus_dev = bus_dev; hw = &adapter->hw; - hw->device_id = pci_dev->id.device_id; - hw->vendor_id = pci_dev->id.vendor_id; + /* Vendor and Device ID need to be set before init of shared code */ + hw->device_id = device_id; + hw->vendor_id = vendor_id; err = ionic_init_mac(hw); if (err != 0) { @@ -1172,19 +1100,21 @@ eth_ionic_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, goto err_free_adapter; } - adapter->num_bars = 0; - for (i = 0; i < PCI_MAX_RESOURCE && i < IONIC_BARS_MAX; i++) { - resource = &pci_dev->mem_resource[i]; - if (resource->phys_addr == 0 || resource->len == 0) - continue; - adapter->bars[adapter->num_bars].vaddr = resource->addr; - adapter->bars[adapter->num_bars].bus_addr = resource->phys_addr; - adapter->bars[adapter->num_bars].len = resource->len; - adapter->num_bars++; + adapter->bars.num_bars = bars->num_bars; + for (i = 0; i < bars->num_bars; i++) { + adapter->bars.bar[i].vaddr = bars->bar[i].vaddr; + adapter->bars.bar[i].bus_addr = bars->bar[i].bus_addr; + adapter->bars.bar[i].len = bars->bar[i].len; } - /* Discover ionic dev resources */ + if (intf->setup == NULL) { + IONIC_PRINT(ERR, "Device setup function is mandatory"); + goto err_free_adapter; + } + + adapter->intf = intf; + /* Discover ionic dev resources */ err = ionic_setup(adapter); if (err) { IONIC_PRINT(ERR, "Cannot setup device: %d, aborting", err); @@ -1241,20 +1171,20 @@ eth_ionic_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, goto err_free_adapter; } - snprintf(name, sizeof(name), "%s_lif", pci_dev->device.name); - err = rte_eth_dev_create(&pci_dev->device, - name, sizeof(struct ionic_lif), + snprintf(name, sizeof(name), "%s_lif", rte_dev->name); + err = rte_eth_dev_create(rte_dev, name, sizeof(struct ionic_lif), NULL, NULL, eth_ionic_dev_init, adapter); if (err) { IONIC_PRINT(ERR, "Cannot create eth device for %s", name); goto err_free_adapter; } - err = ionic_configure_intr(adapter); - - if (err) { - IONIC_PRINT(ERR, "Failed to configure interrupts"); - goto err_free_adapter; + if (adapter->intf->configure_intr) { + err = (*adapter->intf->configure_intr)(adapter); + if (err) { + IONIC_PRINT(ERR, "Failed to configure interrupts"); + goto err_free_adapter; + } } return 0; @@ -1265,33 +1195,22 @@ eth_ionic_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, return err; } -static int -eth_ionic_pci_remove(struct rte_pci_device *pci_dev) +int +eth_ionic_dev_remove(struct rte_device *rte_dev) { char name[RTE_ETH_NAME_MAX_LEN]; struct rte_eth_dev *eth_dev; /* Adapter lookup is using the eth_dev name */ - snprintf(name, sizeof(name), "%s_lif", pci_dev->device.name); + snprintf(name, sizeof(name), "%s_lif", rte_dev->name); eth_dev = rte_eth_dev_allocated(name); if (eth_dev) ionic_dev_close(eth_dev); else - IONIC_PRINT(DEBUG, "Cannot find device %s", - pci_dev->device.name); + IONIC_PRINT(DEBUG, "Cannot find device %s", rte_dev->name); return 0; } -static struct rte_pci_driver rte_ionic_pmd = { - .id_table = pci_id_ionic_map, - .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC, - .probe = eth_ionic_pci_probe, - .remove = eth_ionic_pci_remove, -}; - -RTE_PMD_REGISTER_PCI(net_ionic, rte_ionic_pmd); -RTE_PMD_REGISTER_PCI_TABLE(net_ionic, pci_id_ionic_map); -RTE_PMD_REGISTER_KMOD_DEP(net_ionic, "* igb_uio | uio_pci_generic | vfio-pci"); RTE_LOG_REGISTER_DEFAULT(ionic_logtype, NOTICE); diff --git a/drivers/net/ionic/ionic_ethdev.h b/drivers/net/ionic/ionic_ethdev.h index f4a4276d33..c5726408de 100644 --- a/drivers/net/ionic/ionic_ethdev.h +++ b/drivers/net/ionic/ionic_ethdev.h @@ -18,6 +18,15 @@ #define IONIC_ETH_DEV_TO_LIF(eth_dev) ((struct ionic_lif *) \ (eth_dev)->data->dev_private) +struct ionic_bars; +struct ionic_dev_intf; + +int eth_ionic_dev_probe(void *bus_dev, struct rte_device *rte_dev, + struct ionic_bars *bars, const struct ionic_dev_intf *intf, + uint16_t device_id, uint16_t vendor_id); +int eth_ionic_dev_remove(struct rte_device *rte_dev); + +void ionic_dev_interrupt_handler(void *param); int ionic_dev_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete); #endif /* _IONIC_ETHDEV_H_ */ diff --git a/drivers/net/ionic/ionic_main.c b/drivers/net/ionic/ionic_main.c index b42430713c..996af0a51f 100644 --- a/drivers/net/ionic/ionic_main.c +++ b/drivers/net/ionic/ionic_main.c @@ -336,7 +336,7 @@ ionic_dev_cmd_wait_check(struct ionic_dev *idev, unsigned long max_wait) int ionic_setup(struct ionic_adapter *adapter) { - return ionic_dev_setup(adapter); + return (*adapter->intf->setup)(adapter); } int diff --git a/drivers/net/ionic/meson.build b/drivers/net/ionic/meson.build index e251e7cbe0..2869e0027c 100644 --- a/drivers/net/ionic/meson.build +++ b/drivers/net/ionic/meson.build @@ -9,6 +9,7 @@ endif sources = files( 'ionic_dev.c', + 'ionic_dev_pci.c', 'ionic_ethdev.c', 'ionic_lif.c', 'ionic_mac_api.c',