Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp2724839pxb; Sun, 24 Jan 2021 18:28:31 -0800 (PST) X-Google-Smtp-Source: ABdhPJynYkyWWcm9Fq7uoQL+j2O0bLbI+FzojPhq3iv3hB5iu49O5K/CdIYLKtvearoQc0F0peii X-Received: by 2002:a17:906:c08e:: with SMTP id f14mr628319ejz.388.1611541711724; Sun, 24 Jan 2021 18:28:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1611541711; cv=none; d=google.com; s=arc-20160816; b=ra4KUr++6k+E50rQynv/jhou5weyb8mbtIPO+CiORWIlEqSiklXw8mAmDvF15Blojj +UQJUJ2WTXmz6lTjktVq7zVWgkyTRc5TVt0hWlJkKG5VhzYbPtbYRIrau5aGdrtY6yhN V7F4zKcdW0IyUX33PHSdO5Bs/FO+dt6tmRHCn6XH3QpwmtRZSAjbRwG1l7e1pFAHKbE1 leiyOIA9LIRUELzmfmShjpVlkuigLzZlOs0RSeQv9M5FVEXcJl9DC/eTXXywjqshbzpz uQ4RXoFsPx+utSq0erFrC3LK/jqsr7PCH7LJp0rueqeUrpRR4H9Lvp3wlr3fApvhF7ZH 3CWA== 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=kTbgOIwObIaVIsGFWZwnmxTdrHTxJXA34qg7azwF7ZfXxWTp41uT9ZX0HpOP3yujPw DHpUqw2U16Lw/FABEXcUXYul7sf/6zaeW5PD/OhdGXKqRcpWvwBUaSUg4aAGZ8Iw3ELm PaFokhf6PxHIHEomQZr86ZtXYtR44qh65tdwxRV9pajN9ZgRB8WxD7wxo2FS7h75FcSC dqP+OY+EmoAAe0lglLDkBfTBZp2sdStHEuIH4iFBpYhJiRDc5ThesieJLtt1URXxflfc 12XmewuwRklEyLsak/ntM4V/ODNKbn/2PgD9u9NICvCEzcPXXUMxhpwlzmj5HEJDS8Qf VtTg== 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 op5si5491042ejb.378.2021.01.24.18.28.08; Sun, 24 Jan 2021 18:28:31 -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 S1726886AbhAYC0M (ORCPT + 99 others); Sun, 24 Jan 2021 21:26:12 -0500 Received: from mga11.intel.com ([192.55.52.93]:4255 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726841AbhAYBxn (ORCPT ); Sun, 24 Jan 2021 20:53:43 -0500 IronPort-SDR: E6XsHixd2jQ8IhHJSmhmqUH6ivfzWt/TMXNdPDZeZ6o3km1STRtlS/H80m09LGZCRSsFucJEkF /52qPUSv+BVw== X-IronPort-AV: E=McAfee;i="6000,8403,9874"; a="176137834" X-IronPort-AV: E=Sophos;i="5.79,372,1602572400"; d="scan'208";a="176137834" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2021 17:51:04 -0800 IronPort-SDR: ISiChugD/Pq6vPHu0zkPJTT4exEKjkvjY2egayXXJF9P2Yvq0EWiDNiLZxTFToYji+I2WaYoxa Jm3+m03WmavA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.79,372,1602572400"; d="scan'208";a="352796001" Received: from jsia-hp-z620-workstation.png.intel.com ([10.221.118.135]) by orsmga003.jf.intel.com with ESMTP; 24 Jan 2021 17:51:01 -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 v12 14/17] dmaengine: dw-axi-dmac: Add Intel KeemBay AxiDMA handshake Date: Mon, 25 Jan 2021 09:32:52 +0800 Message-Id: <20210125013255.25799-15-jee.heng.sia@intel.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20210125013255.25799-1-jee.heng.sia@intel.com> References: <20210125013255.25799-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