From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6B77DA0C4B; Sat, 30 Oct 2021 12:41:28 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B41694111B; Sat, 30 Oct 2021 12:41:05 +0200 (CEST) Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by mails.dpdk.org (Postfix) with ESMTP id ED1E6410E4 for ; Sat, 30 Oct 2021 12:40:52 +0200 (CEST) Received: from dggemv704-chm.china.huawei.com (unknown [172.30.72.56]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4HhG141wQQzbnNW; Sat, 30 Oct 2021 18:36:08 +0800 (CST) Received: from dggpeml500024.china.huawei.com (7.185.36.10) by dggemv704-chm.china.huawei.com (10.3.19.47) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.15; Sat, 30 Oct 2021 18:40:49 +0800 Received: from localhost.localdomain (10.67.165.24) by dggpeml500024.china.huawei.com (7.185.36.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.15; Sat, 30 Oct 2021 18:40:49 +0800 From: Chengwen Feng To: CC: Date: Sat, 30 Oct 2021 18:36:14 +0800 Message-ID: <20211030103619.29924-2-fengchengwen@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211030103619.29924-1-fengchengwen@huawei.com> References: <20211030103619.29924-1-fengchengwen@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.67.165.24] X-ClientProxiedBy: dggems705-chm.china.huawei.com (10.3.19.182) To dggpeml500024.china.huawei.com (7.185.36.10) X-CFilter-Loop: Reflected Subject: [dpdk-dev] [PATCH 1/6] dma/hisilicon: add device probe and remove functions 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 Sender: "dev" Add the basic device probe and remove functions and initial documentation for new hisilicon DMA drivers. Maintainers update is also included in this patch. Signed-off-by: Chengwen Feng --- MAINTAINERS | 5 ++ doc/guides/dmadevs/hisilicon.rst | 21 +++++ doc/guides/dmadevs/index.rst | 1 + doc/guides/rel_notes/release_21_11.rst | 4 + drivers/dma/hisilicon/hisi_dmadev.c | 119 +++++++++++++++++++++++++ drivers/dma/hisilicon/hisi_dmadev.h | 24 +++++ drivers/dma/hisilicon/meson.build | 7 ++ drivers/dma/hisilicon/version.map | 3 + drivers/dma/meson.build | 1 + 9 files changed, 185 insertions(+) create mode 100644 doc/guides/dmadevs/hisilicon.rst create mode 100644 drivers/dma/hisilicon/hisi_dmadev.c create mode 100644 drivers/dma/hisilicon/hisi_dmadev.h create mode 100644 drivers/dma/hisilicon/meson.build create mode 100644 drivers/dma/hisilicon/version.map diff --git a/MAINTAINERS b/MAINTAINERS index 0e5951f8f1..1567f7b695 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1206,6 +1206,11 @@ M: Conor Walsh F: drivers/dma/ioat/ F: doc/guides/dmadevs/ioat.rst +Hisilicon DMA +M: Chengwen Feng +F: drivers/dma/hisilicon +F: doc/guides/dmadevs/hisilicon.rst + RegEx Drivers ------------- diff --git a/doc/guides/dmadevs/hisilicon.rst b/doc/guides/dmadevs/hisilicon.rst new file mode 100644 index 0000000000..4cbaac4204 --- /dev/null +++ b/doc/guides/dmadevs/hisilicon.rst @@ -0,0 +1,21 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2021 HiSilicon Limited. + +HISILICON Kunpeng DMA Driver +============================ + +Kunpeng SoC has an internal DMA unit which can be used by application to +accelerate data copies. The DMA PF function supports multiple DMA channels. + + +Supported Kunpeng SoCs +---------------------- + +* Kunpeng 920 + + +Device Setup +------------- + +Kunpeng DMA devices will need to be bound to a suitable DPDK-supported +user-space IO driver such as ``vfio-pci`` in order to be used by DPDK. diff --git a/doc/guides/dmadevs/index.rst b/doc/guides/dmadevs/index.rst index 20476039a5..6b04276524 100644 --- a/doc/guides/dmadevs/index.rst +++ b/doc/guides/dmadevs/index.rst @@ -13,3 +13,4 @@ an application through DMA API. idxd ioat + hisilicon diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index 502cc5ceb2..00a45475be 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -86,6 +86,10 @@ New Features driver for Intel IOAT devices such as Crystal Beach DMA (CBDMA) on Ice Lake, Skylake and Broadwell. This device driver can be used through the generic dmadev API. +* **Added hisilicon dmadev driver implementation.** + The hisilicon dmadev driver provide device drivers for the Kunpeng's DMA devices. + This device driver can be used through the generic dmadev API. + * **Added support to get all MAC addresses of a device.** Added ``rte_eth_macaddrs_get`` to allow user to retrieve all Ethernet diff --git a/drivers/dma/hisilicon/hisi_dmadev.c b/drivers/dma/hisilicon/hisi_dmadev.c new file mode 100644 index 0000000000..e6fb8a0fc8 --- /dev/null +++ b/drivers/dma/hisilicon/hisi_dmadev.c @@ -0,0 +1,119 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2021 HiSilicon Limited + */ + +#include +#include + +#include +#include +#include +#include +#include + +#include "hisi_dmadev.h" + +RTE_LOG_REGISTER_DEFAULT(hisi_dma_logtype, INFO); +#define HISI_DMA_LOG(level, fmt, args...) \ + rte_log(RTE_LOG_ ## level, hisi_dma_logtype, \ + "%s(): " fmt "\n", __func__, ##args) +#define HISI_DMA_LOG_RAW(hw, level, fmt, args...) \ + rte_log(RTE_LOG_ ## level, hisi_dma_logtype, \ + "%s %s(): " fmt "\n", (hw)->data->dev_name, \ + __func__, ##args) +#define HISI_DMA_DEBUG(hw, fmt, args...) \ + HISI_DMA_LOG_RAW(hw, DEBUG, fmt, ## args) +#define HISI_DMA_INFO(hw, fmt, args...) \ + HISI_DMA_LOG_RAW(hw, INFO, fmt, ## args) +#define HISI_DMA_WARN(hw, fmt, args...) \ + HISI_DMA_LOG_RAW(hw, WARNING, fmt, ## args) +#define HISI_DMA_ERR(hw, fmt, args...) \ + HISI_DMA_LOG_RAW(hw, ERR, fmt, ## args) + +static uint8_t +hisi_dma_reg_layout(uint8_t revision) +{ + if (revision == HISI_DMA_REVISION_HIP08B) + return HISI_DMA_REG_LAYOUT_HIP08; + else + return HISI_DMA_REG_LAYOUT_INVALID; +} + +static void +hisi_dma_gen_pci_device_name(const struct rte_pci_device *pci_dev, + char *name, size_t size) +{ + memset(name, 0, size); + (void)snprintf(name, size, "%x:%x.%x", + pci_dev->addr.bus, pci_dev->addr.devid, + pci_dev->addr.function); +} + +static int +hisi_dma_check_revision(struct rte_pci_device *pci_dev, const char *name, + uint8_t *out_revision) +{ + uint8_t revision; + int ret; + + ret = rte_pci_read_config(pci_dev, &revision, 1, + HISI_DMA_PCI_REVISION_ID_REG); + if (ret != 1) { + HISI_DMA_LOG(ERR, "%s read PCI revision failed!", name); + return -EINVAL; + } + if (hisi_dma_reg_layout(revision) == HISI_DMA_REG_LAYOUT_INVALID) { + HISI_DMA_LOG(ERR, "%s revision: 0x%x not supported!", + name, revision); + return -EINVAL; + } + + *out_revision = revision; + return 0; +} + +static int +hisi_dma_probe(struct rte_pci_driver *pci_drv __rte_unused, + struct rte_pci_device *pci_dev) +{ + char name[RTE_DEV_NAME_MAX_LEN] = { 0 }; + uint8_t revision; + int ret; + + hisi_dma_gen_pci_device_name(pci_dev, name, sizeof(name)); + + if (pci_dev->mem_resource[2].addr == NULL) { + HISI_DMA_LOG(ERR, "%s BAR2 is NULL!\n", name); + return -ENODEV; + } + + ret = hisi_dma_check_revision(pci_dev, name, &revision); + if (ret) + return ret; + HISI_DMA_LOG(DEBUG, "%s read PCI revision: 0x%x", name, revision); + + return ret; +} + +static int +hisi_dma_remove(struct rte_pci_device *pci_dev) +{ + RTE_SET_USED(pci_dev); + return 0; +} + +static const struct rte_pci_id pci_id_hisi_dma_map[] = { + { RTE_PCI_DEVICE(PCI_VENDOR_ID_HUAWEI, HISI_DMA_DEVICE_ID) }, + { .vendor_id = 0, }, /* sentinel */ +}; + +static struct rte_pci_driver hisi_dma_pmd_drv = { + .id_table = pci_id_hisi_dma_map, + .drv_flags = RTE_PCI_DRV_NEED_MAPPING, + .probe = hisi_dma_probe, + .remove = hisi_dma_remove, +}; + +RTE_PMD_REGISTER_PCI(dma_hisilicon, hisi_dma_pmd_drv); +RTE_PMD_REGISTER_PCI_TABLE(dma_hisilicon, pci_id_hisi_dma_map); +RTE_PMD_REGISTER_KMOD_DEP(dma_hisilicon, "vfio-pci"); diff --git a/drivers/dma/hisilicon/hisi_dmadev.h b/drivers/dma/hisilicon/hisi_dmadev.h new file mode 100644 index 0000000000..114b9dcb5b --- /dev/null +++ b/drivers/dma/hisilicon/hisi_dmadev.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2021 HiSilicon Limited + */ + +#ifndef HISI_DMADEV_H +#define HISI_DMADEV_H + +#define PCI_VENDOR_ID_HUAWEI 0x19e5 +#define HISI_DMA_DEVICE_ID 0xA122 +#define HISI_DMA_PCI_REVISION_ID_REG 0x08 +#define HISI_DMA_REVISION_HIP08B 0x21 + +/** + * The HIP08B(HiSilicon IP08) and later Chip(e.g. HiSilicon IP09) are DMA iEPs, + * they have the same pci device id but with different pci revision. + * Unfortunately, they have different register layouts, so the layout + * enumerations are defined. + */ +enum { + HISI_DMA_REG_LAYOUT_INVALID = 0, + HISI_DMA_REG_LAYOUT_HIP08 +}; + +#endif /* HISI_DMADEV_H */ diff --git a/drivers/dma/hisilicon/meson.build b/drivers/dma/hisilicon/meson.build new file mode 100644 index 0000000000..9e31b47141 --- /dev/null +++ b/drivers/dma/hisilicon/meson.build @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2021 HiSilicon Limited + +deps += ['bus_pci', 'dmadev'] +sources = files( + 'hisi_dmadev.c', +) diff --git a/drivers/dma/hisilicon/version.map b/drivers/dma/hisilicon/version.map new file mode 100644 index 0000000000..c2e0723b4c --- /dev/null +++ b/drivers/dma/hisilicon/version.map @@ -0,0 +1,3 @@ +DPDK_22 { + local: *; +}; diff --git a/drivers/dma/meson.build b/drivers/dma/meson.build index a69418ce9b..6d6c054f51 100644 --- a/drivers/dma/meson.build +++ b/drivers/dma/meson.build @@ -4,6 +4,7 @@ drivers = [ 'idxd', 'ioat', + 'hisilicon', 'skeleton', ] std_deps = ['dmadev'] -- 2.33.0