Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp742736ybz; Wed, 15 Apr 2020 18:00:05 -0700 (PDT) X-Google-Smtp-Source: APiQypJPrNm/Zl10w6QeqNLGnRDDwWqWOexk8rxl5m6KP24EAQwrc+k4rC1F9G2xx5XBNNVmRVgd X-Received: by 2002:aa7:cf15:: with SMTP id a21mr19846338edy.349.1586998804897; Wed, 15 Apr 2020 18:00:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1586998804; cv=none; d=google.com; s=arc-20160816; b=M7c2hmdtPsk5Mq51XPw9VTo2HukDsmWXtF4W6ci/UEUkdM6Kj9GIRoxwg4G+zJi7BK QF3iuxXG73JXN6IOSlo5k5H55LrCmDlnlmORDzU358k8KFPDSDrpXAtEbDHuUOMnqCK2 GXjt5wC9nPpnj0DoIY0A4qiPTos/0J/w7irZwl3uQIEhByAgfa+RiZopsensKwWCWdEa +b1WYeOKkQDUGBHncqeDUo0IBZ+BMb2+cLROIJ72eKak0FL5RBiwgkPtLz2sZ+CaO4TJ 9VEhNIy7eCM0gz3/ydlrWbr7QJkf6qSOo7YsMcPYhukStIYqO67/nM/Na7a7L+4z+nqO by6g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=PAL4FT8oI0mRZyF3YfLl8XwS0XvdpC5f2FhsnqKXQQ4=; b=cR+d9wqFqb12KRaJui6EWl8fVplcZTpLa4o7qYY2GKJIC9NBCubBBXpTtVBGvFEo7L sDriJyt6K6faeUOgxucdchA7WPDb+GnmiJrbU+quxKx4tOL4KfPg/GPnBKj12C6YFzmU ynS3CuYbi/QyMm5S7F3Id1xtUcDFVFEtfaVQRFryOrss3Ck351ZYZf6ejLTye6iBgPuF IUHeYinkBTCZ4BL79cTZob+dDJIHC1igyPhTyg0ps9YYkgD/v8ysTDHcW+dMAN/NN6SO iFINoaC9C3+XPUFkjrs/4kMyCLCjGfvbgQA5gNXIcQ72PJlTlTi26vf2cT8nJaVAP3s7 OHvA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sifive.com header.s=google header.b=GSqy2qK9; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id p12si11030933eju.367.2020.04.15.17.59.41; Wed, 15 Apr 2020 18:00:04 -0700 (PDT) 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; dkim=pass header.i=@sifive.com header.s=google header.b=GSqy2qK9; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2441767AbgDOTPG (ORCPT + 99 others); Wed, 15 Apr 2020 15:15:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54290 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S2441597AbgDOTJq (ORCPT ); Wed, 15 Apr 2020 15:09:46 -0400 Received: from mail-lj1-x242.google.com (mail-lj1-x242.google.com [IPv6:2a00:1450:4864:20::242]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F3A8EC061A0E for ; Wed, 15 Apr 2020 12:02:41 -0700 (PDT) Received: by mail-lj1-x242.google.com with SMTP id l14so4927370ljj.5 for ; Wed, 15 Apr 2020 12:02:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=PAL4FT8oI0mRZyF3YfLl8XwS0XvdpC5f2FhsnqKXQQ4=; b=GSqy2qK9ju2LPM8Q8WZSWDGak8bYygVT0fC/+xYkRBU8FR41raa0/9NdjN4NtbABLs nkUhwBBBputEWOf6wDfR8p7bgjYOoTEH+VVO0mf44Xp2Tt/mYkTtmDPEx/QX7YAQMywF V+ktG+8DRhYB4b+7AC5/0vpih7661me0Do1Vk/XJDycKxyYey6D9xuRkIQPS3Tiz1cKD d45kVCmQ40qJnCgsNgIQP+2FW2+dhl/n+GO4EJV7E55XK+mitMnkyGV0YT7QNVLLDLMg 55eReRmR8eQUO3f7OcRFJ8lGLUCORi+WE4IolpIdsYyqZTH+a1iUrsNAObCyeKicfy2D Z8rA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=PAL4FT8oI0mRZyF3YfLl8XwS0XvdpC5f2FhsnqKXQQ4=; b=XX2/cdoNtuGRlo9g2rk66eJGKEDo+yGCpWGcTX7MvhPBbHwSMia/T8u9ozTfItxrwT iv4CGHnM+9aOhIpd0T9RbXBva0dzbfC/dA3FogemxxjTAgi/ttEIdadQILlFf6rnXPHg 4uon25kCpTcHp8OgeGgr49AnrbFfhufg7TKlUbIA8226+bgg69IueC3P+ziIhyc9KKlI w1k2qYDdJjuln4UF4dJu4+SDzQzOv/Cx7hzGeAKvTseQPpshSTvfBiCkMhIoCIUECHhy GqEBPCfJhxj8j7RbEFmVk8hNu9/tr4ZrnXklkUDi9mpzAdX9sCuNkP0lIUX6uv2VDB2c rMJQ== X-Gm-Message-State: AGi0PuZLUT/42o6/zpVN+xhbHi4u9FCcE8URsU4VEuseGadtSaqKtlpY r71XqGFMGPz+EJcAQzJgiN4lujR+580GKrRy23tkDw== X-Received: by 2002:a2e:a548:: with SMTP id e8mr4133522ljn.151.1586977360244; Wed, 15 Apr 2020 12:02:40 -0700 (PDT) MIME-Version: 1.0 References: <1586971629-30196-1-git-send-email-alan.mikhak@sifive.com> In-Reply-To: <1586971629-30196-1-git-send-email-alan.mikhak@sifive.com> From: Alan Mikhak Date: Wed, 15 Apr 2020 12:02:29 -0700 Message-ID: Subject: Re: [PATCH v2] dmaengine: dw-edma: Decouple dw-edma-core.c from struct pci_dev To: dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pci , Gustavo Pimentel , dan.j.williams@intel.com, Vinod Koul , Kishon Vijay Abraham I , Paul Walmsley Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Apr 15, 2020 at 10:27 AM Alan Mikhak wrote: > > From: Alan Mikhak > > Decouple dw-edma-core.c from struct pci_dev as a step toward integration > of dw-edma with pci-epf-test so the latter can initiate dma operations > locally from the endpoint side. A barrier to such integration is the > dependency of dw_edma_probe() and other functions in dw-edma-core.c on > struct pci_dev. > > The Synopsys DesignWare dw-edma driver was designed to run on host side > of PCIe link to initiate DMA operations remotely using eDMA channels of > PCIe controller on the endpoint side. This can be inferred from seeing > that dw-edma uses struct pci_dev and accesses hardware registers of dma > channels across the bus using BAR0 and BAR2. > > The ops field of struct dw_edma in dw-edma-core.h is currenty undefined: > > const struct dw_edma_core_ops *ops; > > However, the kernel builds without failure even when dw-edma driver is > enabled. Instead of removing the currently undefined and usued ops field, > define struct dw_edma_core_ops and use the ops field to decouple > dw-edma-core.c from struct pci_dev. > > Signed-off-by: Alan Mikhak Adding the ACK from RFC patch Acked-by: Gustavo Pimentel > --- > drivers/dma/dw-edma/dw-edma-core.c | 29 ++++++++++++++++++++--------- > drivers/dma/dw-edma/dw-edma-core.h | 4 ++++ > drivers/dma/dw-edma/dw-edma-pcie.c | 10 ++++++++++ > 3 files changed, 34 insertions(+), 9 deletions(-) > > diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-edma-core.c > index ff392c01bad1..db401eb11322 100644 > --- a/drivers/dma/dw-edma/dw-edma-core.c > +++ b/drivers/dma/dw-edma/dw-edma-core.c > @@ -14,7 +14,7 @@ > #include > #include > #include > -#include > +#include > > #include "dw-edma-core.h" > #include "dw-edma-v0-core.h" > @@ -781,7 +781,7 @@ static int dw_edma_irq_request(struct dw_edma_chip *chip, > > if (dw->nr_irqs == 1) { > /* Common IRQ shared among all channels */ > - err = request_irq(pci_irq_vector(to_pci_dev(dev), 0), > + err = request_irq(dw->ops->irq_vector(dev, 0), > dw_edma_interrupt_common, > IRQF_SHARED, dw->name, &dw->irq[0]); > if (err) { > @@ -789,7 +789,7 @@ static int dw_edma_irq_request(struct dw_edma_chip *chip, > return err; > } > > - get_cached_msi_msg(pci_irq_vector(to_pci_dev(dev), 0), > + get_cached_msi_msg(dw->ops->irq_vector(dev, 0), > &dw->irq[0].msi); > } else { > /* Distribute IRQs equally among all channels */ > @@ -804,7 +804,7 @@ static int dw_edma_irq_request(struct dw_edma_chip *chip, > dw_edma_add_irq_mask(&rd_mask, *rd_alloc, dw->rd_ch_cnt); > > for (i = 0; i < (*wr_alloc + *rd_alloc); i++) { > - err = request_irq(pci_irq_vector(to_pci_dev(dev), i), > + err = request_irq(dw->ops->irq_vector(dev, i), > i < *wr_alloc ? > dw_edma_interrupt_write : > dw_edma_interrupt_read, > @@ -815,7 +815,7 @@ static int dw_edma_irq_request(struct dw_edma_chip *chip, > return err; > } > > - get_cached_msi_msg(pci_irq_vector(to_pci_dev(dev), i), > + get_cached_msi_msg(dw->ops->irq_vector(dev, i), > &dw->irq[i].msi); > } > > @@ -827,12 +827,23 @@ static int dw_edma_irq_request(struct dw_edma_chip *chip, > > int dw_edma_probe(struct dw_edma_chip *chip) > { > - struct device *dev = chip->dev; > - struct dw_edma *dw = chip->dw; > + struct device *dev; > + struct dw_edma *dw; > u32 wr_alloc = 0; > u32 rd_alloc = 0; > int i, err; > > + if (!chip) > + return -EINVAL; > + > + dev = chip->dev; > + if (!dev) > + return -EINVAL; > + > + dw = chip->dw; > + if (!dw || !dw->irq || !dw->ops || !dw->ops->irq_vector) > + return -EINVAL; > + > raw_spin_lock_init(&dw->lock); > > /* Find out how many write channels are supported by hardware */ > @@ -884,7 +895,7 @@ int dw_edma_probe(struct dw_edma_chip *chip) > > err_irq_free: > for (i = (dw->nr_irqs - 1); i >= 0; i--) > - free_irq(pci_irq_vector(to_pci_dev(dev), i), &dw->irq[i]); > + free_irq(dw->ops->irq_vector(dev, i), &dw->irq[i]); > > dw->nr_irqs = 0; > > @@ -904,7 +915,7 @@ int dw_edma_remove(struct dw_edma_chip *chip) > > /* Free irqs */ > for (i = (dw->nr_irqs - 1); i >= 0; i--) > - free_irq(pci_irq_vector(to_pci_dev(dev), i), &dw->irq[i]); > + free_irq(dw->ops->irq_vector(dev, i), &dw->irq[i]); > > /* Power management */ > pm_runtime_disable(dev); > diff --git a/drivers/dma/dw-edma/dw-edma-core.h b/drivers/dma/dw-edma/dw-edma-core.h > index 4e5f9f6e901b..31fc50d31792 100644 > --- a/drivers/dma/dw-edma/dw-edma-core.h > +++ b/drivers/dma/dw-edma/dw-edma-core.h > @@ -103,6 +103,10 @@ struct dw_edma_irq { > struct dw_edma *dw; > }; > > +struct dw_edma_core_ops { > + int (*irq_vector)(struct device *dev, unsigned int nr); > +}; > + > struct dw_edma { > char name[20]; > > diff --git a/drivers/dma/dw-edma/dw-edma-pcie.c b/drivers/dma/dw-edma/dw-edma-pcie.c > index dc85f55e1bb8..1eafc602e17e 100644 > --- a/drivers/dma/dw-edma/dw-edma-pcie.c > +++ b/drivers/dma/dw-edma/dw-edma-pcie.c > @@ -54,6 +54,15 @@ static const struct dw_edma_pcie_data snps_edda_data = { > .irqs = 1, > }; > > +static int dw_edma_pcie_irq_vector(struct device *dev, unsigned int nr) > +{ > + return pci_irq_vector(to_pci_dev(dev), nr); > +} > + > +static const struct dw_edma_core_ops dw_edma_pcie_core_ops = { > + .irq_vector = dw_edma_pcie_irq_vector, > +}; > + > static int dw_edma_pcie_probe(struct pci_dev *pdev, > const struct pci_device_id *pid) > { > @@ -151,6 +160,7 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev, > dw->version = pdata->version; > dw->mode = pdata->mode; > dw->nr_irqs = nr_irqs; > + dw->ops = &dw_edma_pcie_core_ops; > > /* Debug info */ > pci_dbg(pdev, "Version:\t%u\n", dw->version); > -- > 2.7.4 >