Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp9554260pxu; Mon, 28 Dec 2020 21:08:46 -0800 (PST) X-Google-Smtp-Source: ABdhPJynFATURYSPOwW4/EgabfR26mM/1UVpQYTG4iiZp3Jpezig4nsPpiMpigKCacTM6GUOJq6o X-Received: by 2002:a05:6402:94c:: with SMTP id h12mr44883366edz.268.1609218526271; Mon, 28 Dec 2020 21:08:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609218526; cv=none; d=google.com; s=arc-20160816; b=K+t7EP+YKLFdddo69wZIOd5nNIKof//+DByXyoFOVs29TB8N4a35xpMSBgmM8GBc3z PkP7Cxy+GF91QZlGbR2Nmu5YTE5SOFiA/pWVgDP6aOHqYddR0FIH3kHXeNcI14rjU9di mE7J0Mc1ffCMqOTfNa/IiNE8fWfMuVcrX6J4+pouapn/J0zvDgFQ6p4nevJHFE9Oz5I/ EOAPRIwCCKtBzVsI8RzMnLVeUeb2+DYrebkhrlcVFifOmVrVlEChub8hGOaN2wQ9/dDW U0TvPcNDEQMVMVYw2W9N/iPI/aXYqHes9fiT8CPU6IrlWXVPKXRZysw7IihhoOITN8G8 liHw== 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=sOUPZk+xART+jlGqCx+xANgDl3tfzKuSONzwFTxakeY=; b=NfupkeDG/QHReZEA05t7ybnz60i2xyiTFXKDvOZNR2la7wN3hIcu1KD1Gm3k/OiDQ9 077xAaNz3YmBnemzLeuqT7T+i9CgufRiY7vMnDRZBDQf74WHyS6rpkxPc5fMRunrmaDA gw6cshh+CAfEf7rXEApRpMu/1C/S0eXrTaEN9Cdegc1yfPOhCXSmbGw/N9iAzewhPSvQ W5W62u2h7GwmxE3It9njgVB8AdiTMBDjKQB1pkjaBRGY/WA2z9UwM39SMEhi+gGRfh8b WK1sBacWEvzO6BA8+CSbenQKXrLO48EHqGQe82SpsXDJyUl9VtqTE6yy7tbh1UlzacQA s5Og== 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 lx6si19900645ejb.550.2020.12.28.21.08.24; Mon, 28 Dec 2020 21:08:46 -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 S1726713AbgL2FF5 (ORCPT + 99 others); Tue, 29 Dec 2020 00:05:57 -0500 Received: from mga03.intel.com ([134.134.136.65]:37340 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726060AbgL2FFz (ORCPT ); Tue, 29 Dec 2020 00:05:55 -0500 IronPort-SDR: GhoJMlCdpTn7x3WVOq3M9heyiMQoC/wiWjyOoB7mJGx5HlXC1PIN4ea/gVMJ9ZGFgltwY30c8u Hv+B/Gm04Tvw== X-IronPort-AV: E=McAfee;i="6000,8403,9848"; a="176554722" X-IronPort-AV: E=Sophos;i="5.78,457,1599548400"; d="scan'208";a="176554722" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Dec 2020 21:04:47 -0800 IronPort-SDR: 3K1QTBGHbAfA56ZQtW8v6tLSikamw5PIB2Xh/I5+Tl8inLcEpCwmenGAbzHnFiHrzLv53NeRD3 xyo3fHlA7rbQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,457,1599548400"; d="scan'208";a="347249841" Received: from jsia-hp-z620-workstation.png.intel.com ([10.221.118.135]) by fmsmga008.fm.intel.com with ESMTP; 28 Dec 2020 21:04:45 -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 v8 13/16] dmaengine: dw-axi-dmac: Add Intel KeemBay AxiDMA handshake Date: Tue, 29 Dec 2020 12:47:10 +0800 Message-Id: <20201229044713.28464-14-jee.heng.sia@intel.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20201229044713.28464-1-jee.heng.sia@intel.com> References: <20201229044713.28464-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 062d27c61983..5e77eb3d040f 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