Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp117586pxb; Thu, 21 Jan 2021 02:54:15 -0800 (PST) X-Google-Smtp-Source: ABdhPJzJts+ThIyzYuY+Ag9X9QrkQeAXvYbNunWfRsnI9wMTiMQAsC1soDoeT2l8MT9Gzh3OqXRL X-Received: by 2002:aa7:d7c8:: with SMTP id e8mr6398837eds.355.1611226455266; Thu, 21 Jan 2021 02:54:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1611226455; cv=none; d=google.com; s=arc-20160816; b=Ao4ejgx4o6VPlQQpV94DMu+fPHTxNMZWHFv+DTQnct+3Pb7ufeRd6fTSIUow/UJ01y fGQ+VVKJ+ahSWvunoEhr2IvDBfOQX5EwVYMVxxeSKhwWtowIPafEDBHf2N82edlN5zRR LNsMRktYOeeERVTxa5bqruoQDEiJNnMCLYZXda7ivKGedegO2derHhxH2TG5e4VWmBfd TWHgg2U1toLKjVQvE2048HtddIUxZlR7dtjBFNM+npI37yd1hNmKDRkZU/v/H2E3rXsB Vu9Edt6B8tpWIYQ0w1/8Kyk+8qZ8a8T4mOacu/qyAbavAtooHCGpvq7ti9w4jU53hvBJ 28jA== 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=YYoZ8c8crgSurvZ89T26nUGzPJNV3LvcDZgRTopaW2o=; b=y4xeCn7ah3sglKiJW9mZfmVNBLr/w7qb8u77nWNL1AFSOWhzXMtIPyX1C5YV3RWwkp han0IcwGitsGhvClMAmvXCVqffqVX61k9Olq6q/imTwRUidffJ6Is+toWhd0LBc9q7Mi U5nySo3SwczPiDUUUQPEJodNXQHHghtiIf3fmE1EuKh1xeT4YPp+jjTNUxdOQhEUPDSp BoLcKLPc+iwPYrY9KAgwF/8mlg/cFYUO6AETmfqekk/Tk47qURhimDgJVbAenedd6Ldl fOEi35ptTTu2E1F55YkYxAltLVU5eTOCs+UExbXgxr7oRjM0hjxzoHOdgIegcgpcPEa1 YLcg== 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 m26si2035613edp.592.2021.01.21.02.53.51; Thu, 21 Jan 2021 02:54:15 -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 S1729907AbhAUKwT (ORCPT + 99 others); Thu, 21 Jan 2021 05:52:19 -0500 Received: from mga06.intel.com ([134.134.136.31]:36494 "EHLO mga06.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729549AbhAUKsC (ORCPT ); Thu, 21 Jan 2021 05:48:02 -0500 IronPort-SDR: +rHKiSyVZBObLbq324vIlJyKlaAENt35zvvc+XLV9TE1vowIjcjkEbFe+avknnoKsrCQhzUV2T 28Uo9cn30c3w== X-IronPort-AV: E=McAfee;i="6000,8403,9870"; a="240790313" X-IronPort-AV: E=Sophos;i="5.79,363,1602572400"; d="scan'208";a="240790313" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Jan 2021 02:45:30 -0800 IronPort-SDR: 7cQScfLmupPtJURhvd89FTXyH5ZHsxXyYwAmkDZ8G5NKs1ClUaaJkoT/sn/y8DKVB1ygHV41+x yAIHzSyhLOgg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.79,363,1602572400"; d="scan'208";a="356417764" Received: from jsia-hp-z620-workstation.png.intel.com ([10.221.118.135]) by fmsmga008.fm.intel.com with ESMTP; 21 Jan 2021 02:45:28 -0800 From: Sia Jee Heng To: vkoul@kernel.org, Eugeniy.Paltsev@synopsys.com, robh+dt@kernel.org Cc: andriy.shevchenko@linux.intel.com, jee.heng.sia@intel.com, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Subject: [PATCH v11 13/16] dmaengine: dw-axi-dmac: Add Intel KeemBay AxiDMA handshake Date: Thu, 21 Jan 2021 18:27:23 +0800 Message-Id: <20210121102726.22805-14-jee.heng.sia@intel.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20210121102726.22805-1-jee.heng.sia@intel.com> References: <20210121102726.22805-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. Signed-off-by: Sia Jee Heng Reviewed-by: Andy Shevchenko Reviewed-by: Eugeniy Paltsev Tested-by: Eugeniy Paltsev --- .../dma/dw-axi-dmac/dw-axi-dmac-platform.c | 50 +++++++++++++++++++ 1 file changed, 50 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..e19369f9365a 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 void 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) { + dev_dbg(chip->dev, "apb_regs not initialized\n"); + return; + } + + /* + * 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; + } + } +} + /* * 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,8 @@ dw_axi_dma_chan_prep_cyclic(struct dma_chan *dchan, dma_addr_t dma_addr, llp = hw_desc->llp; } while (num_periods); + dw_axi_dma_set_hw_channel(chan->chip, chan->hw_handshake_num, true); + return vchan_tx_prep(&chan->vc, &desc->vd, flags); err_desc_get: @@ -684,6 +728,8 @@ dw_axi_dma_chan_prep_slave_sg(struct dma_chan *dchan, struct scatterlist *sgl, llp = hw_desc->llp; } while (sg_len); + dw_axi_dma_set_hw_channel(chan->chip, chan->hw_handshake_num, true); + return vchan_tx_prep(&chan->vc, &desc->vd, flags); err_desc_get: @@ -959,6 +1005,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