Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp199800pxb; Thu, 12 Nov 2020 01:10:01 -0800 (PST) X-Google-Smtp-Source: ABdhPJwUP3qt1V+Uz7Skd4LkkpSto9iGL2yi7k65ufX3Pe3KNGrZoDVRv2YOg67qvKH1C1RIVliF X-Received: by 2002:a17:906:7cc:: with SMTP id m12mr27822348ejc.365.1605172201100; Thu, 12 Nov 2020 01:10:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1605172201; cv=none; d=google.com; s=arc-20160816; b=JkNjeArRIYTW/NEkOiMdrjF1DcruCWpcdc1jpwBh40vrGMLQVSEz4WAGqqCEb4wheZ PQj22TWsgMTCNCWj42+E6SqYKyslKKzEdbxndw+qqACXkCfUBZNIcUY+9tnfAW+zz4cC BNZCKeH01rXpBDzLTiaRkwdyZd+mMxs8MtCschNXlBqYuxE7zz/v6qjJiEFcOt+egwnd y9eBi3DhKFVkqQaGxNcHRoG3ACxTum9UVeeY7Qxo6WXapNzRIfhz9hsXJsjAOp/RR6Xc kaLGCphQCHxXDn0c7W846oNKwceOl8DZpxCmywmhjnOVdNyRD+UY9oJ+g58D1v97obM8 jN1A== 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=+tSNb6oIFq/wP6vyAvztrBRqUIZCBD3fB7TYYlQAzhQ=; b=DA8ikhJETlCMlltcCrxX59Ox4H/VIkJgGrGplDe0vr5HjPZoj+3OOzByX814042FTh eSltfXiK0lnmoYZ4iaD5L3lCamS+sdCVxD+uGKHHDvU4O1G7DIC2BAk/435Efxqo/3MU X1oCJNpq4sTlLxzAgNPQEPZtLj5fSndN2NFqfY6BWluO4MKOW5qBZsvYFoONdjCAiRFA b26a7LQkQ5aCyYpKVYbYtwoqL2tG5JOHQ/PnDzsuq/M8IYJP1Xf808b6OTqF5xX+36qg g2Vu3OcYyWXfziWSBaR/7lKbtXy76egkQ3ipeXRWL+Zn8irTxrdDSH1SNHd2g5TWKiXE M1ZA== 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 u24si3093178eje.619.2020.11.12.01.09.37; Thu, 12 Nov 2020 01:10:01 -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 S1727851AbgKLJHK (ORCPT + 99 others); Thu, 12 Nov 2020 04:07:10 -0500 Received: from mga05.intel.com ([192.55.52.43]:38735 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727824AbgKLJHD (ORCPT ); Thu, 12 Nov 2020 04:07:03 -0500 IronPort-SDR: ATAPrvJ6UB+bUMs0344j97PQ4CaVPS/MEJCz/Lie/Vp4ohql90c98Qo/WMQ4ztxdgQX8zY9BfP qF+rlj1axhTw== X-IronPort-AV: E=McAfee;i="6000,8403,9802"; a="254988321" X-IronPort-AV: E=Sophos;i="5.77,471,1596524400"; d="scan'208";a="254988321" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Nov 2020 01:07:02 -0800 IronPort-SDR: BS+rzKEkbXCIX6m5w6yOLs2j0L/2Roh7LAqSq39ZxZHOEFCiHQ9ZIxONeYJmu7WrgaCU9epKRZ JRHZgjiu2XPQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.77,471,1596524400"; d="scan'208";a="360911739" Received: from jsia-hp-z620-workstation.png.intel.com ([10.221.118.135]) by fmsmga002.fm.intel.com with ESMTP; 12 Nov 2020 01:06:59 -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 v3 13/15] dmaengine: dw-axi-dmac: Add Intel KeemBay AxiDMA handshake Date: Thu, 12 Nov 2020 16:49:51 +0800 Message-Id: <20201112084953.21629-14-jee.heng.sia@intel.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20201112084953.21629-1-jee.heng.sia@intel.com> References: <20201112084953.21629-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 daea1fb43bef..df85f8289f05 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 @@ -629,6 +671,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: @@ -690,6 +735,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: @@ -965,6 +1013,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