Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp532291pxu; Fri, 11 Dec 2020 08:04:46 -0800 (PST) X-Google-Smtp-Source: ABdhPJzM9xsU4R8FGPkWkwOP26Ob9JWNGgQzq3Fu91Uqff2J++rALDKOzb3tFuGGH+gAzLB9Upz6 X-Received: by 2002:a17:907:a8a:: with SMTP id by10mr11351063ejc.423.1607702685959; Fri, 11 Dec 2020 08:04:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1607702685; cv=none; d=google.com; s=arc-20160816; b=AARYaBtpRlwmmbD4Bskdz0QTsIz1dnCn5hmLu7/o0Zx0vwKAx33nfoSRIEiY86bYMg AKqLQwH5fO68g/eAYssBRntGlyCvmBy6m5A6c/QTmQ5zyQa3DYN1gC1oMe9W7zNt/x1Z QrC4u1nC7uVNlIlP8UOdyMa6pgnEmpUOO/Y0CQyYWQYsfK6NxPLpmdSwM2O5fdC9oFiC n8kouOh6ojPGcA03NUHdT97Y018mJ4Q/ujA27HqUNNqVXf0rl/4psNS3eayNqr5K5d1v Pbv7nUsUosqMyjg+Uy2Zm1DThHSTHhaDSD/bZq5uEgYyYHIZAomoaKUiPpHIxphCZDtO 0Rpw== 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=HnVvypbqWaM0J5qsCVQ6UhabCm9UFoosBFJQVsVXNsk=; b=FlXAC5PomFDESDbBwIJ+F7+oZ5tV9AuIJ6EWrj5j7fuUwiFP4Slr+5KZAd9pTt/TfR BkbzaSwmVIpTgSFhX8a9OBlGGfvN5G34k7Z4av34l++RpfNXQO+yLou+zhDVtcHx8JaL U9vwSaIDJZ/SPGvh7jFCZVAjzyVhBXMV4hhReabzoW3y0TSTycSdd5WkOldMRDLNrOZP nW1xdWtHpGW3VNbhtKYealYdLnnA+RtdtZc/vq4SCEh4r3LaLRSv2m4qg/TejCA8pux+ HcSJc0Jq1qWKVV6RM2KxvkIJdGi1qNTmiUTU6CbiGkXHsxjZu3BTwqmF1PSR+P+HWCow I0NA== 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 q9si4783725ejm.460.2020.12.11.08.04.06; Fri, 11 Dec 2020 08:04:45 -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 S2394491AbgLKBGF (ORCPT + 99 others); Thu, 10 Dec 2020 20:06:05 -0500 Received: from mga14.intel.com ([192.55.52.115]:12004 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2394379AbgLKBF4 (ORCPT ); Thu, 10 Dec 2020 20:05:56 -0500 IronPort-SDR: C2nEL0ScqylnJ3iife4xamJH/trTXZIa83bywrDG1115tD4kxAvVT7Ty5iw4PrWJ9YnUDbXqMN XPC7/Q/m19KA== X-IronPort-AV: E=McAfee;i="6000,8403,9831"; a="173596143" X-IronPort-AV: E=Sophos;i="5.78,409,1599548400"; d="scan'208";a="173596143" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Dec 2020 17:04:52 -0800 IronPort-SDR: aYIgnIQyuShr3Dym0/9nyCoYkANihZpkXx/MAZFZHHVNMozmmw1muWg9EHqwkZ812gN0l3JCBj 58C1SHwAF79g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,409,1599548400"; d="scan'208";a="320965866" Received: from jsia-hp-z620-workstation.png.intel.com ([10.221.118.135]) by fmsmga007.fm.intel.com with ESMTP; 10 Dec 2020 17:04:50 -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 v6 13/16] dmaengine: dw-axi-dmac: Add Intel KeemBay AxiDMA handshake Date: Fri, 11 Dec 2020 08:46:39 +0800 Message-Id: <20201211004642.25393-14-jee.heng.sia@intel.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20201211004642.25393-1-jee.heng.sia@intel.com> References: <20201211004642.25393-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 8135b827b47a..440f9a8b25da 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