Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp1386720pxx; Tue, 27 Oct 2020 15:58:18 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwXpT+bh9HOy3jcbm5aLQT/xVu16rKEDRQV0C0/BIM93F/36Ek79kXIrcorp36y+KMH6PIw X-Received: by 2002:a05:6402:b66:: with SMTP id cb6mr4516206edb.110.1603839498492; Tue, 27 Oct 2020 15:58:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603839498; cv=none; d=google.com; s=arc-20160816; b=QtlcdYSZe0SkRztiyfflMaTHtsYVztx7rP6j5+/HK77+2f5annxuAmx009kbnYin4n LlOfTWCaBkOZgmfnFyU+iFXnyc8AzBXrXeM5JD2eDFrWaXgpBVwoV87+YaGMjB1TxS/m QV2IBg8CWVVeEeQV7/8ph42OD8X1YtAMm+Keb02fhu/EPB3HiVYejGTYEEH2FDNcfHNQ iFelMIOFZ3YIBrM6XjxR/QCdeRSG6eZag7DbrcXqJPzKuBr0a/6qo93izF3B11lprurD AeEwgKJ8FsM5a9t1CfNGngevew2/KKdcinTiX11dN+HUgV6wL26+LIKXtkaZw8aAVo1t b52w== 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=rOtyU+s+IIWZLxKoPP/npyv9k6pFF2g/nOhDal7S1W0=; b=kdj9D9nV8BapkyGye9b5+DGwHz0VyDxaQnTpaVvq4euV1kvconNyMoVty6RpfH3pp5 7Kx/l23FqeEaYk1RLNEJgyzDSnRQBjCVnE2kr5zKn6wf25NhxVONnYafhLr+rof7o2tN RTE5AED7/GESbhDUq+0uLwaRDAY/ZcgblGO2atKbVhc1ofR4PdwPieWEq32biUskSIWV ysnJL2cTb4anTegSvU3Kfft1uYQ6DWOxTbuuE0xGi3Bnx9JInIsRvTBCTtmG6g4kknjg 0XWX9Loojg6Um/QGTEKwtYe1PJJNhs1dUtNNLW1azo9b3Gf2pNbaC1e/BOG99MyAydcW RENA== 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 t12si2173380edt.285.2020.10.27.15.57.47; Tue, 27 Oct 2020 15:58:18 -0700 (PDT) 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 S2507027AbgJ0G4S (ORCPT + 99 others); Tue, 27 Oct 2020 02:56:18 -0400 Received: from mga17.intel.com ([192.55.52.151]:5231 "EHLO mga17.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2507018AbgJ0G4Q (ORCPT ); Tue, 27 Oct 2020 02:56:16 -0400 IronPort-SDR: Z/NJyBiEtJMLDJNh/FHoifhuLBB2zdYUrTFFU5qXltVUKZIIbkCEiHSkbkJXVdyPvvgtx2PxXq hrpPPqIi45xg== X-IronPort-AV: E=McAfee;i="6000,8403,9786"; a="147890916" X-IronPort-AV: E=Sophos;i="5.77,422,1596524400"; d="scan'208";a="147890916" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Oct 2020 23:56:16 -0700 IronPort-SDR: 9k5TyAgCTB3aeCct9PW77nfWZfKmu1au5BD7f+SYhk+MlCUKNXWx3u1gzX/id1TgnYb2AvTSBV OBWET23ISxxA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.77,422,1596524400"; d="scan'208";a="350175991" Received: from jsia-hp-z620-workstation.png.intel.com ([10.221.118.135]) by orsmga008.jf.intel.com with ESMTP; 26 Oct 2020 23:56:14 -0700 From: Sia Jee Heng To: vkoul@kernel.org, Eugeniy.Paltsev@synopsys.com Cc: andriy.shevchenko@linux.intel.com, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 13/15] dmaengine: dw-axi-dmac: Add Intel KeemBay AxiDMA handshake Date: Tue, 27 Oct 2020 14:38:56 +0800 Message-Id: <20201027063858.4877-14-jee.heng.sia@intel.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20201027063858.4877-1-jee.heng.sia@intel.com> References: <20201027063858.4877-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 19806c586e81..0f40b41fd5c0 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 hs_number, + 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 = hs_number; + } else { + reg_set = hs_number; + 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 @@ -725,6 +767,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_hs_num, true)) + goto err_desc_get; + return vchan_tx_prep(&chan->vc, &desc->vd, flags); err_desc_get: @@ -851,6 +896,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_hs_num, true)) + goto err_desc_get; + return vchan_tx_prep(&chan->vc, &desc->vd, flags); err_desc_get: @@ -1019,6 +1067,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_hs_num, false); + spin_lock_irqsave(&chan->vc.lock, flags); vchan_get_all_descriptors(&chan->vc, &head); -- 2.18.0