Received: by 10.223.164.202 with SMTP id h10csp3820578wrb; Mon, 20 Nov 2017 05:38:32 -0800 (PST) X-Google-Smtp-Source: AGs4zMYsvaQ/pQW+WxodQ7J4b15OIZmU9wg418+4ejwTMFjFhH2gLJAPHjJ60DTgMXrm50LN2UO4 X-Received: by 10.99.113.91 with SMTP id b27mr13530828pgn.351.1511185112870; Mon, 20 Nov 2017 05:38:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511185112; cv=none; d=google.com; s=arc-20160816; b=oLXrpH0nVvXsCDw5nviLgs5hYmSRtZIliGSe3wLg3CMfuZe1UERTNhUhggB2DuKnaS wVLID98ndBbkkudz1QRg/gQtKPw6k6WsOAwg2UulaWRpEMeZFk3KcsZwcztsf0JuhL0u GTq1kt+WB2h/HtbJzJpzJCYWTzBNJoWy8F1kLjl24+9Nm6Y+PCgV7Y6OAzQ/ajSWEP9I v8U0WGvTdDrBCWV9oaMnJNlLrTGEHYPVqXYR9UWY5iNhwI7Fin5SsAHpghORkVQwAm1R twbX4BQ3F4xnrHju2yxRzWhsL0oXP7OZRMiYsBU5FK5Vu5IYo52QhAN3I0D+LyFEjaY9 R1cA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=LXB43xZQF9NRykNSw1kR8xmU1g5DvvAOdyiBv8A1tHU=; b=sYBxbiJZouXD5EBJrxbqI6se67kCOYegb5VF76d6K8C4vZCcrf6trja4cxy3sTbSHl n3vHqL10h+9sLO0iqMJ7c9l3lLHiM46EKLyQlx3QpqSXC+Natc+YCwnGhHB2qPP2Hf8G hRI5A3c1iAERp4HqLIVj7OyIC5nFuslETTmQo1DL21Yq1cjQF7axgYvorBg1V4ccdJAp pmyOil474+ruQHfQaSUhzNuvXBW7VHnsMrCF08voi/eiNwquU1MjtrtkEUyvpehvZpej JzHwoDz5v5stBGwhGiIsJaCdVQmtGS7YVfzfQJyZ46jAwVFP1Veoc2sndDjrtM0dqbnV O0vw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m15si8174818pga.189.2017.11.20.05.38.22; Mon, 20 Nov 2017 05:38:32 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751338AbdKTNhF (ORCPT + 66 others); Mon, 20 Nov 2017 08:37:05 -0500 Received: from bastet.se.axis.com ([195.60.68.11]:39491 "EHLO bastet.se.axis.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751116AbdKTNco (ORCPT ); Mon, 20 Nov 2017 08:32:44 -0500 Received: from localhost (localhost [127.0.0.1]) by bastet.se.axis.com (Postfix) with ESMTP id 3D418183B0; Mon, 20 Nov 2017 14:32:43 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at bastet.se.axis.com Received: from bastet.se.axis.com ([IPv6:::ffff:127.0.0.1]) by localhost (bastet.se.axis.com [::ffff:127.0.0.1]) (amavisd-new, port 10024) with LMTP id uC4BYVyPp939; Mon, 20 Nov 2017 14:32:41 +0100 (CET) Received: from boulder03.se.axis.com (boulder03.se.axis.com [10.0.8.17]) by bastet.se.axis.com (Postfix) with ESMTPS id 9F6A7183B1; Mon, 20 Nov 2017 14:32:40 +0100 (CET) Received: from boulder03.se.axis.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 800011E07E; Mon, 20 Nov 2017 14:32:40 +0100 (CET) Received: from boulder03.se.axis.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 73DDF1E07C; Mon, 20 Nov 2017 14:32:40 +0100 (CET) Received: from thoth.se.axis.com (unknown [10.0.2.173]) by boulder03.se.axis.com (Postfix) with ESMTP; Mon, 20 Nov 2017 14:32:40 +0100 (CET) Received: from lnxartpec1.se.axis.com (lnxartpec1.se.axis.com [10.88.4.10]) by thoth.se.axis.com (Postfix) with ESMTP id 66B19192E; Mon, 20 Nov 2017 14:32:40 +0100 (CET) Received: by lnxartpec1.se.axis.com (Postfix, from userid 20283) id 62375400FE; Mon, 20 Nov 2017 14:32:40 +0100 (CET) From: Niklas Cassel To: Jingoo Han , Joao Pinto , Lorenzo Pieralisi , Bjorn Helgaas Cc: Niklas Cassel , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 01/18] PCI: dwc: Use the DMA-API to get the MSI address Date: Mon, 20 Nov 2017 14:32:04 +0100 Message-Id: <20171120133222.27771-2-niklas.cassel@axis.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20171120133222.27771-1-niklas.cassel@axis.com> References: <20171120133222.27771-1-niklas.cassel@axis.com> X-TM-AS-GCONF: 00 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Use the DMA-API to get the MSI address. This address will be written to our PCI config space and to the register which determines which AXI address the DWC IP will spoof for incoming MSI irqs. Since it is a PCIe endpoint device, rather than the CPU, that is supposed to write to the MSI address, the proper way to get the MSI address is by using the DMA API, not by using virt_to_phys(). Using virt_to_phys() might work on some systems, but using the DMA API should work on all systems. This is essentially the same thing as allocating a buffer in a driver to which the endpoint will write to. To do this, we use the DMA API. Signed-off-by: Niklas Cassel --- drivers/pci/dwc/pcie-designware-host.c | 15 ++++++++++++--- drivers/pci/dwc/pcie-designware.h | 3 ++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/pci/dwc/pcie-designware-host.c b/drivers/pci/dwc/pcie-designware-host.c index 81e2157a7cfb..33b52fe98a01 100644 --- a/drivers/pci/dwc/pcie-designware-host.c +++ b/drivers/pci/dwc/pcie-designware-host.c @@ -83,10 +83,19 @@ irqreturn_t dw_handle_msi_irq(struct pcie_port *pp) void dw_pcie_msi_init(struct pcie_port *pp) { + struct dw_pcie *pci = to_dw_pcie_from_pp(pp); + struct device *dev = pci->dev; + struct page *page; u64 msi_target; - pp->msi_data = __get_free_pages(GFP_KERNEL, 0); - msi_target = virt_to_phys((void *)pp->msi_data); + page = alloc_page(GFP_KERNEL | GFP_DMA32); + pp->msi_data = dma_map_page(dev, page, 0, PAGE_SIZE, DMA_FROM_DEVICE); + if (dma_mapping_error(dev, pp->msi_data)) { + dev_err(dev, "failed to map MSI data\n"); + __free_page(page); + return; + } + msi_target = (u64)pp->msi_data; /* program the msi_data */ dw_pcie_wr_own_conf(pp, PCIE_MSI_ADDR_LO, 4, @@ -187,7 +196,7 @@ static void dw_msi_setup_msg(struct pcie_port *pp, unsigned int irq, u32 pos) if (pp->ops->get_msi_addr) msi_target = pp->ops->get_msi_addr(pp); else - msi_target = virt_to_phys((void *)pp->msi_data); + msi_target = (u64)pp->msi_data; msg.address_lo = (u32)(msi_target & 0xffffffff); msg.address_hi = (u32)(msi_target >> 32 & 0xffffffff); diff --git a/drivers/pci/dwc/pcie-designware.h b/drivers/pci/dwc/pcie-designware.h index e5d9d77b778e..ecdede68522a 100644 --- a/drivers/pci/dwc/pcie-designware.h +++ b/drivers/pci/dwc/pcie-designware.h @@ -14,6 +14,7 @@ #ifndef _PCIE_DESIGNWARE_H #define _PCIE_DESIGNWARE_H +#include #include #include #include @@ -168,7 +169,7 @@ struct pcie_port { const struct dw_pcie_host_ops *ops; int msi_irq; struct irq_domain *irq_domain; - unsigned long msi_data; + dma_addr_t msi_data; DECLARE_BITMAP(msi_irq_in_use, MAX_MSI_IRQS); }; -- 2.14.2 From 1585904442037038642@xxx Tue Dec 05 01:12:14 +0000 2017 X-GM-THRID: 1585904442037038642 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread