From patchwork Sat Nov 10 21:06:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Grygorii Strashko X-Patchwork-Id: 150749 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp1413402ljp; Sat, 10 Nov 2018 13:08:23 -0800 (PST) X-Google-Smtp-Source: AJdET5c2Qd8CvHNLb62KJQF82p/5huIb8cCO+GmbMeHU+L9020QNae2Sbo/G9CK2GjTWFNfgotIo X-Received: by 2002:aa7:c994:: with SMTP id c20-v6mr7004756edt.165.1541884102980; Sat, 10 Nov 2018 13:08:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541884102; cv=none; d=google.com; s=arc-20160816; b=SUSytDdv2udsg/etBVHUb6UeTpEZhWE5SVtNGHVgKU5E2saQXM1LKJAvGgfq4IjKn9 v2JyTowccwdXb/otqLDDqW2zqGq2BDpBykyVAY5eFYn6QbLuR55Fo7JuEdxNAHNsgd2E dSd4WFq+XOwkaAzjjN6VpnvemVSScn/0UnCOFXaMHviK2O7t0dckwJDu/IcicjmGNZFX 21CxGnZ707mq1FuTP+4EwX+UXJzxOOa2iz89QUnBaTXv+/s1ne3jkxIhvgCGIkCqoU5V hS3LvnLxCEITHap5D5mPYlPOWR1v+wiIe/6uKJXoYDLvPVKECvjC8suecZAUhyX6kHcj rKNg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:list-subscribe:list-help :list-post:list-archive:list-unsubscribe:list-id:precedence:subject :cc:mime-version:message-id:date:to:from:dkim-signature; bh=hK7+zTITiGwQG7YQANKwS7JXRiOeLlX/qBs5AmejpXQ=; b=m+SECFkZ1cJF/09OoUq6NJy7Zl6EefmjvBreK4ER/B1KlbAT2h6VqfU2IRKaIWvIQk wgs+3njD5ia5ctIu9rQz79cX9rNiIimwdv6/7fYUyBUqlVpdIfpWGg3fb7zE4CI4BSme aRjthQ/Wpa2EFRafRSkgqdH0ci67mY/vH2WtIMWUo+2jpylPfdO8aniwHEhmkly///ak c6CdJfkjUug2yg4z0+X6CXaMhYPNFOHYg1nHwIsw6kv/XWv8qQiK2LW6lYV6HxF66/4M aQNrqYAYDvaZ0hYW4+lw04CHrihLn52c+qf/xiNcJ2jzzMdjkPsd/rKHGg9wFLMW5gNg Q+bg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@ti.com header.s=ti-com-17Q1 header.b=vWBN1pfa; spf=pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=fail (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Return-Path: Received: from lists.denx.de (dione.denx.de. [81.169.180.215]) by mx.google.com with ESMTP id 29-v6si2391257ejk.274.2018.11.10.13.08.22; Sat, 10 Nov 2018 13:08:22 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) client-ip=81.169.180.215; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@ti.com header.s=ti-com-17Q1 header.b=vWBN1pfa; spf=pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=fail (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: by lists.denx.de (Postfix, from userid 105) id 88336C222B4; Sat, 10 Nov 2018 21:08:14 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RCVD_IN_DNSWL_BLOCKED, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id D16C2C22281; Sat, 10 Nov 2018 21:06:57 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 7098BC21E47; Sat, 10 Nov 2018 21:06:54 +0000 (UTC) Received: from fllv0015.ext.ti.com (fllv0015.ext.ti.com [198.47.19.141]) by lists.denx.de (Postfix) with ESMTPS id 93D21C21E47 for ; Sat, 10 Nov 2018 21:06:53 +0000 (UTC) Received: from fllv0034.itg.ti.com ([10.64.40.246]) by fllv0015.ext.ti.com (8.15.2/8.15.2) with ESMTP id wAAL6oJ1021968; Sat, 10 Nov 2018 15:06:50 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1541884010; bh=f/kg++4v6O7lK8G0EL1STpYOL0/Z79RohdaIyQDny4s=; h=From:To:CC:Subject:Date; b=vWBN1pfaeUAeE1BlGZWagcfz3tYzQKEP4Y08xYNNeqHAkJ758cJx/leNPTiLRnTKw 0o3Q11UjyxRpY9TbcTg17FvxFwkZR1qq4k3nmuwp/nHqXDbr7ZrFe3cpJIcHAQfQNi lMoWvCYIltyTe/gzgkrlld4qIt7zFVSNzO6Ys+1s= Received: from DFLE111.ent.ti.com (dfle111.ent.ti.com [10.64.6.32]) by fllv0034.itg.ti.com (8.15.2/8.15.2) with ESMTPS id wAAL6orP080316 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Sat, 10 Nov 2018 15:06:50 -0600 Received: from DFLE111.ent.ti.com (10.64.6.32) by DFLE111.ent.ti.com (10.64.6.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1466.3; Sat, 10 Nov 2018 15:06:50 -0600 Received: from dflp32.itg.ti.com (10.64.6.15) by DFLE111.ent.ti.com (10.64.6.32) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1466.3 via Frontend Transport; Sat, 10 Nov 2018 15:06:50 -0600 Received: from legion.dal.design.ti.com (legion.dal.design.ti.com [128.247.22.53]) by dflp32.itg.ti.com (8.14.3/8.13.8) with ESMTP id wAAL6o7N029804; Sat, 10 Nov 2018 15:06:50 -0600 Received: from localhost (uda0226610.dhcp.ti.com [128.247.59.147]) by legion.dal.design.ti.com (8.11.7p1+Sun/8.11.7) with ESMTP id wAAL6ox25829; Sat, 10 Nov 2018 15:06:50 -0600 (CST) From: Grygorii Strashko To: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= , Joe Hershberger , Lokesh Vutla , Tom Rini , Simon Glass Date: Sat, 10 Nov 2018 15:06:44 -0600 Message-ID: <20181110210649.8992-1-grygorii.strashko@ti.com> X-Mailer: git-send-email 2.10.5 MIME-Version: 1.0 X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Cc: Jagan Teki , u-boot@lists.denx.de Subject: [U-Boot] [PATCH v7 0/5] dma: add channels support X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Hi All, This series is the next try to add DMA channels support for DMA controllers which last version was posted by Álvaro Fernández Rojas [1]. i've kept version numbering. Comparing to the original post I've added few changes: - added possibility to pass DMA driver/channel's specific data per each transfer using additional parameter "metadata" in dma_send/dma_receive() API. For example, port number for network packets to be directed to the specific port on multi port ethernet controllers. - added new dma_prepare_rcv_buf() API which allows to implement zero-copy DEV_TO_MEM transfer using DMA streaming channels which is usual case for Networking. - added dma-uclass test - removed unused function dma_get_by_index_platdata() - updated comments Hence, originally DMA channels support was introduced to add support for "bmips: add bcm6348-enet support" - that series can be easily updated following DMA channels API changes (if still actual). Patches 5-6 - Here I'm providing DMA and networking drivers for the new TI AM65x SoC [2] as an illustration of DMA channels API usage only. Unfortunately, those drivers are still under development so NOT-FOR-MERGE (!will not build!) - we'd like code/bindings to be accepted in LKML first. Full sources can be found at [3]. [1] https://patchwork.ozlabs.org/cover/881642/ [2] http://www.ti.com/lit/ug/spruid7b/spruid7b.pdf [3] git@git.ti.com:~gragst/ti-u-boot/gragsts-ti-u-boot.git branch: master-am6-dma-wip === A DMA is a feature of computer systems that allows certain hardware subsystems to access main system memory, independent of the CPU. DMA channels are typically generated externally to the HW module consuming them, by an entity this API calls a DMA provider. This API provides a standard means for drivers to enable and disable DMAs, and to copy, send and receive data using DMA. DMA channel API: dma_get_by_index() dma_get_by_name() dma_request() dma_free() dma_enable() dma_disable() dma_prepare_rcv_buf() dma_receive() dma_send() A driver that implements UCLASS_DMA is a DMA provider. A provider will often implement multiple separate DMAs channels, since the hardware it manages often has this capability. dma_uclass.h describes the interface which DMA providers must implement. DMA consumers/clients are the HW modules driven by the DMA channels. DMA consumer DMA_MEM_TO_DEV (transmit) usage example (based on networking). Note. In u-boot dma_send() is sync operation always - it'll start transfer and will poll for it to complete: - get/request dma channel struct dma dma_tx; ret = dma_get_by_name(common->dev, "tx0", &dma_tx); if (ret) ... - enable dma channel ret = dma_enable(&dma_tx); if (ret) ... - dma transmit DMA_MEM_TO_DEV. struct ti_drv_packet_data packet_data; packet_data.opt1 = val1; packet_data.opt2 = val2; ret = dma_send(&dma_tx, packet, length, &packet_data); if (ret) .. DMA consumer DMA_DEV_TO_MEM (receive) usage example (based on networking). Note. dma_receive() is sync operation always - it'll start transfer (if required) and will poll for it to complete (or for any previously configured dev2mem transfer to complete): - get/request dma channel struct dma dma_rx; ret = dma_get_by_name(common->dev, "rx0", &dma_rx); if (ret) ... - enable dma channel ret = dma_enable(&dma_rx); if (ret) ... - dma receive DMA_DEV_TO_MEM. struct ti_drv_packet_data packet_data; len = dma_receive(&dma_rx, (void **)packet, &packet_data); if (ret < 0) ... DMA consumer DMA_DEV_TO_MEM (receive) zero-copy usage example (based on networking). Networking subsystem allows to configure and use few receive buffers (dev2mem), as Networking RX DMA channels usually implemented as streaming interface - get/request dma channel struct dma dma_rx; ret = dma_get_by_name(common->dev, "rx0", &dma_rx); if (ret) ... for (i = 0; i < RX_DESC_NUM; i++) { ret = dma_prepare_rcv_buf(&dma_rx, net_rx_packets[i], RX_BUF_SIZE); if (ret) ... } - enable dma channel ret = dma_enable(&dma_rx); if (ret) ... - dma receive DMA_DEV_TO_MEM. struct ti_drv_packet_data packet_data; void *packet; len = dma_receive(&dma_rx, &packet, &packet_data); if (ret < 0) .. /* packet - points on buffer prepared by dma_prepare_rcv_buf(). process packet*/ - return buffer back to DAM channel ret = dma_prepare_rcv_buf(&dma_rx, net_rx_packets[rx_next], RX_BUF_SIZE); changes in v7: - copyright fixed as suggested by Tom Rini - added "Reviewed-by" tags v1: http://patchwork.ozlabs.org/cover/987948/ Grygorii Strashko (2): test: dma: add dma-uclass test net: ethernet: ti: introduce am654 gigabit eth switch subsystem driver Vignesh R (1): dma: ti: add driver to K3 UDMA Álvaro Fernández Rojas (2): dma: move dma_ops to dma-uclass.h dma: add channels support arch/sandbox/dts/test.dts | 8 + configs/sandbox_defconfig | 3 + drivers/dma/Kconfig | 16 + drivers/dma/Makefile | 3 + drivers/dma/dma-uclass.c | 183 +++- drivers/dma/sandbox-dma-test.c | 282 +++++++ drivers/dma/ti-edma3.c | 2 +- drivers/dma/ti/Kconfig | 14 + drivers/dma/ti/Makefile | 3 + drivers/dma/ti/k3-udma-hwdef.h | 184 ++++ drivers/dma/ti/k3-udma.c | 1679 +++++++++++++++++++++++++++++++++++++ drivers/net/Kconfig | 8 + drivers/net/Makefile | 1 + drivers/net/am65-cpsw-nuss.c | 962 +++++++++++++++++++++ include/dma-uclass.h | 128 +++ include/dma.h | 282 ++++++- include/dt-bindings/dma/k3-udma.h | 26 + include/linux/soc/ti/ti-udma.h | 24 + test/dm/Makefile | 1 + test/dm/dma.c | 123 +++ 20 files changed, 3902 insertions(+), 30 deletions(-) create mode 100644 drivers/dma/sandbox-dma-test.c create mode 100644 drivers/dma/ti/Kconfig create mode 100644 drivers/dma/ti/Makefile create mode 100644 drivers/dma/ti/k3-udma-hwdef.h create mode 100644 drivers/dma/ti/k3-udma.c create mode 100644 drivers/net/am65-cpsw-nuss.c create mode 100644 include/dma-uclass.h create mode 100644 include/dt-bindings/dma/k3-udma.h create mode 100644 include/linux/soc/ti/ti-udma.h create mode 100644 test/dm/dma.c