Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp544115pxu; Sun, 22 Nov 2020 18:55:51 -0800 (PST) X-Google-Smtp-Source: ABdhPJzpxr8VseTjoigWYmA0SUIggWtznCFWUvZY3NdGj1AgkP77H+NZKCSCwEW+CyekL0t+daKI X-Received: by 2002:a50:eb0a:: with SMTP id y10mr47878044edp.342.1606100150935; Sun, 22 Nov 2020 18:55:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1606100150; cv=none; d=google.com; s=arc-20160816; b=L2MSUWsHYC4AljCXCMA+H0/8pf2abPM9GIz0RvPSFnMZoyydCVGpq+46Ihdg3moh0D U5Vlt2LzHkGdCFpvvcD+Zua0xh80ZwEU3qg/ePg9Alr0KRh+/m/Fs2Yh+ina08zv7Gi0 5LHkq6fv/BIB8XqBaMfpZnPsTyr8jK4YQ85O8K0gNS2AjDMXjibioktR8MUhsnID9CFH xj9iPVWsJnVA/pNL7ObV1yFgtHvBBpL6dcCULRVElYQys7uujBFhoWDpmGq/aZUIo1qz 8cHk4oJHfSe5ejiFx2oKwXInxX1kSjRJAsZsDUXlzSdiW8ukM4ItxxXfhfAnkAwjDG55 p1Og== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:ironport-sdr:ironport-sdr; bh=HnVvypbqWaM0J5qsCVQ6UhabCm9UFoosBFJQVsVXNsk=; b=mJO4dUjZHrBXwdHOP13o/EhECYBHJno8ZqVANZGqiyFk7Tx+v6+Xt1j05FvYUjWqYT GgMD2jmth9asIC+rELwhtTrXSw4Gm0kSCR3U0nmXQJuWCbBHm+AHYJwgza3KcpuVdnLz RiFRayK6LpZEdxIODO+MTpgBbHkoV7NNaJktEP1hyaMcGGeJFpFSay160exo6w04UZKk arKbqVuV6J4YvXqNYDhRdD6x3KMf0LKB+0u+6qmLoL3pN9dn0j9T6/rNQLHT131JwtMD QQg3fipBFsnOAzx12eKQFCU4lObUUXBYBlPPcNsKAIBoETiwavttFK40JlcdsAwdFFbE VbWA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id mj1si5920049ejb.54.2020.11.22.18.55.28; Sun, 22 Nov 2020 18:55:50 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727804AbgKWCwP (ORCPT + 99 others); Sun, 22 Nov 2020 21:52:15 -0500 Received: from mga18.intel.com ([134.134.136.126]:60192 "EHLO mga18.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727711AbgKWCwM (ORCPT ); Sun, 22 Nov 2020 21:52:12 -0500 IronPort-SDR: bUT2bLkGNvyotOeySxfIMOU3h+0PfgmloRcQ/phAtTvhBCbJCDVR9hVqhsavAeO0pGr7XUGLwK Bd51/cGjxtzQ== X-IronPort-AV: E=McAfee;i="6000,8403,9813"; a="159460045" X-IronPort-AV: E=Sophos;i="5.78,361,1599548400"; d="scan'208";a="159460045" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Nov 2020 18:52:11 -0800 IronPort-SDR: vr22tHLJXy/Gl2vOtsxZ+79i2jg6euK2ppxbxSe+9u6z+KfAhRVJRse8n7JPe8//J6So6c/GHu WM11h7W+tb1A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,361,1599548400"; d="scan'208";a="369879930" Received: from jsia-hp-z620-workstation.png.intel.com ([10.221.118.135]) by FMSMGA003.fm.intel.com with ESMTP; 22 Nov 2020 18:52:09 -0800 From: Sia Jee Heng To: vkoul@kernel.org, Eugeniy.Paltsev@synopsys.com, robh+dt@kernel.org Cc: andriy.shevchenko@linux.intel.com, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Subject: [PATCH v5 13/16] dmaengine: dw-axi-dmac: Add Intel KeemBay AxiDMA handshake Date: Mon, 23 Nov 2020 10:34:49 +0800 Message-Id: <20201123023452.7894-14-jee.heng.sia@intel.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20201123023452.7894-1-jee.heng.sia@intel.com> References: <20201123023452.7894-1-jee.heng.sia@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support for Intel KeemBay AxiDMA device handshake programming. Device handshake number passed in to the AxiDMA shall be written to the Intel KeemBay AxiDMA hardware handshake registers before DMA operations are started. Reviewed-by: Andy Shevchenko Signed-off-by: Sia Jee Heng --- .../dma/dw-axi-dmac/dw-axi-dmac-platform.c | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c b/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c index 8135b827b47a..440f9a8b25da 100644 --- a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c +++ b/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c @@ -445,6 +445,48 @@ static void dma_chan_free_chan_resources(struct dma_chan *dchan) pm_runtime_put(chan->chip->dev); } +static int dw_axi_dma_set_hw_channel(struct axi_dma_chip *chip, + u32 handshake_num, bool set) +{ + unsigned long start = 0; + unsigned long reg_value; + unsigned long reg_mask; + unsigned long reg_set; + unsigned long mask; + unsigned long val; + + if (!chip->apb_regs) + return -ENODEV; + + /* + * An unused DMA channel has a default value of 0x3F. + * Lock the DMA channel by assign a handshake number to the channel. + * Unlock the DMA channel by assign 0x3F to the channel. + */ + if (set) { + reg_set = UNUSED_CHANNEL; + val = handshake_num; + } else { + reg_set = handshake_num; + val = UNUSED_CHANNEL; + } + + reg_value = lo_hi_readq(chip->apb_regs + DMAC_APB_HW_HS_SEL_0); + + for_each_set_clump8(start, reg_mask, ®_value, 64) { + if (reg_mask == reg_set) { + mask = GENMASK_ULL(start + 7, start); + reg_value &= ~mask; + reg_value |= rol64(val, start); + lo_hi_writeq(reg_value, + chip->apb_regs + DMAC_APB_HW_HS_SEL_0); + break; + } + } + + return 0; +} + /* * If DW_axi_dmac sees CHx_CTL.ShadowReg_Or_LLI_Last bit of the fetched LLI * as 1, it understands that the current block is the final block in the @@ -626,6 +668,9 @@ dw_axi_dma_chan_prep_cyclic(struct dma_chan *dchan, dma_addr_t dma_addr, llp = hw_desc->llp; } while (num_periods); + if (dw_axi_dma_set_hw_channel(chan->chip, chan->hw_handshake_num, true)) + goto err_desc_get; + return vchan_tx_prep(&chan->vc, &desc->vd, flags); err_desc_get: @@ -684,6 +729,9 @@ dw_axi_dma_chan_prep_slave_sg(struct dma_chan *dchan, struct scatterlist *sgl, llp = hw_desc->llp; } while (sg_len); + if (dw_axi_dma_set_hw_channel(chan->chip, chan->hw_handshake_num, true)) + goto err_desc_get; + return vchan_tx_prep(&chan->vc, &desc->vd, flags); err_desc_get: @@ -959,6 +1007,10 @@ static int dma_chan_terminate_all(struct dma_chan *dchan) dev_warn(dchan2dev(dchan), "%s failed to stop\n", axi_chan_name(chan)); + if (chan->direction != DMA_MEM_TO_MEM) + dw_axi_dma_set_hw_channel(chan->chip, + chan->hw_handshake_num, false); + spin_lock_irqsave(&chan->vc.lock, flags); vchan_get_all_descriptors(&chan->vc, &head); -- 2.18.0