From patchwork Wed Dec 12 05:46:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srinath Mannam X-Patchwork-Id: 1011581 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pci-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=broadcom.com header.i=@broadcom.com header.b="clm6fJBQ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43F5R22xjZz9s47 for ; Wed, 12 Dec 2018 16:46:38 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726501AbeLLFqh (ORCPT ); Wed, 12 Dec 2018 00:46:37 -0500 Received: from mail-wm1-f67.google.com ([209.85.128.67]:55608 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726239AbeLLFqg (ORCPT ); Wed, 12 Dec 2018 00:46:36 -0500 Received: by mail-wm1-f67.google.com with SMTP id y139so4412140wmc.5 for ; Tue, 11 Dec 2018 21:46:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=TjZzoCV1HwcD3kCkPdW3dsnMfVHtjGYXi/74QDWB40A=; b=clm6fJBQpEqaNOrghAtBGe5lA/Ey3ak+GaomIJPn0+oIBqBXekIw6y/VKEUV43ii3E 7ygSkwgZOkNu3pqv6zcu7wwsHeY0a9dj8lB1QXoNclqQLeY2Qm5moIpYjPFZMq+xmAY8 8SWRfaoLIb+bHtcw9pH2i7eqPvwheNOfWsaWE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=TjZzoCV1HwcD3kCkPdW3dsnMfVHtjGYXi/74QDWB40A=; b=FkftG7SvD8nP0wn9fhw78BzYaDdQ5gCCmdci8N8HVHCmei8Q6S4Ejsiv5OyEIw3cZQ UnWOj+Kzf5i5CegkuS7ToP7nYF6JmXI/exDnrM+P+Ojvg6qBVP606hKgIcTraSVEqcIK /08/6OZUKSfctNiWqFvaVFse/x/OY8ZDrXQba5En/cW4GxT6aaLHGC1a5QdpkQRr4sCU FiPHgV+rKpw4YpwiTPE1BDUQaI3a6XRt+qMX61zXrhZ8L6ebtOrzcHTMyxf0w7opKwMB bNMDYzvpHSccDbXq1NiLU8TwnaO/B0U1icyFL/PTz0Iot1dB7Gev44yHVVWyzdHJkCYA FVpA== X-Gm-Message-State: AA+aEWZdu/u6pwry7i5axsZUpXBh5o5IabepCeNLNrY68YqNjYmVqaCC GCgG2hTP2L4PO2brmCBpcVk/og== X-Google-Smtp-Source: AFSGD/W+p9w7CY/mPn0iivWBiYRS5RWFY0nfliz6PahBvNEVx9zk1h6sOct5iclAuj2cuTV2iHvLoQ== X-Received: by 2002:a1c:2314:: with SMTP id j20mr4916307wmj.142.1544593594210; Tue, 11 Dec 2018 21:46:34 -0800 (PST) Received: from mannams-OptiPlex-7010.dhcp.broadcom.net ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id z206sm2015947wmc.18.2018.12.11.21.46.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 11 Dec 2018 21:46:33 -0800 (PST) From: Srinath Mannam To: Bjorn Helgaas , Robin Murphy , Joerg Roedel , Lorenzo Pieralisi , Ray Jui Cc: bcm-kernel-feedback-list@broadcom.com, linux-pci@vger.kernel.org, iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, Srinath Mannam Subject: [RFC PATCH 1/3] PCI: Add dma-resv window list Date: Wed, 12 Dec 2018 11:16:07 +0530 Message-Id: <1544593569-8923-2-git-send-email-srinath.mannam@broadcom.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1544593569-8923-1-git-send-email-srinath.mannam@broadcom.com> References: <1544593569-8923-1-git-send-email-srinath.mannam@broadcom.com> Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org Add a dma_resv parameter in pci host bridge structure to hold resource entries list of memory regions for which IOVAs has to reserve. IOMMU framework reserve IOVA for this list of address range while initializing IOMMU domain of corresponding PCI EP connected to the HOST. PCIe host driver will add resource entries to this list based on requirements. Few hosts can't use all inbound address, so those address regions will be add to this list to avoid IOMMU mapping. Signed-off-by: Srinath Mannam --- drivers/pci/probe.c | 3 +++ include/linux/pci.h | 1 + 2 files changed, 4 insertions(+) diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index ec78400..bbed0e7 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -544,6 +544,7 @@ struct pci_host_bridge *pci_alloc_host_bridge(size_t priv) return NULL; INIT_LIST_HEAD(&bridge->windows); + INIT_LIST_HEAD(&bridge->dma_resv); bridge->dev.release = pci_release_host_bridge_dev; /* @@ -572,6 +573,7 @@ struct pci_host_bridge *devm_pci_alloc_host_bridge(struct device *dev, return NULL; INIT_LIST_HEAD(&bridge->windows); + INIT_LIST_HEAD(&bridge->dma_resv); bridge->dev.release = devm_pci_release_host_bridge_dev; return bridge; @@ -581,6 +583,7 @@ EXPORT_SYMBOL(devm_pci_alloc_host_bridge); void pci_free_host_bridge(struct pci_host_bridge *bridge) { pci_free_resource_list(&bridge->windows); + pci_free_resource_list(&bridge->dma_resv); kfree(bridge); } diff --git a/include/linux/pci.h b/include/linux/pci.h index e72ca8d..1f0a32a 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -472,6 +472,7 @@ struct pci_host_bridge { void *sysdata; int busnr; struct list_head windows; /* resource_entry */ + struct list_head dma_resv; /* reserv dma ranges */ u8 (*swizzle_irq)(struct pci_dev *, u8 *); /* Platform IRQ swizzler */ int (*map_irq)(const struct pci_dev *, u8, u8); void (*release_fn)(struct pci_host_bridge *); From patchwork Wed Dec 12 05:46:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srinath Mannam X-Patchwork-Id: 1011582 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pci-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=broadcom.com header.i=@broadcom.com header.b="hNkJ0s9N"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43F5RH3hKDz9s3Z for ; Wed, 12 Dec 2018 16:46:51 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726492AbeLLFqt (ORCPT ); Wed, 12 Dec 2018 00:46:49 -0500 Received: from mail-wm1-f68.google.com ([209.85.128.68]:52001 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726434AbeLLFqm (ORCPT ); Wed, 12 Dec 2018 00:46:42 -0500 Received: by mail-wm1-f68.google.com with SMTP id s14so4471502wmh.1 for ; Tue, 11 Dec 2018 21:46:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=4aT+lpIc+NJpqnZ6pq48JRajzcrSuiEPbqJBDas7aFM=; b=hNkJ0s9Nm8OfkASjOtmSpBDFwguWfVpT0QPfrdhUguj4qkvQj62N0NNuETViSSyqrA iU1mq/wR8sHku5gV8M6kcIsL2XYszCnuFGjD5VUwdl283ynfCIT1PuWrOdPvXDwjcDPK H1pkccsxROjIe65x2bT3DEB1wXzUD3pofvqcw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=4aT+lpIc+NJpqnZ6pq48JRajzcrSuiEPbqJBDas7aFM=; b=sJjCmTKgxSh3CiRpj/Ssx9V2WKjTvW979zBU0v29OJC/GtWJTkPccYKE5V+Lo//0Za XIieV9z6bORAC1dFKctTq4SvTCfI3xxVpCg8CLGFwkuluLc//P5KF5PH7WWluNs2GbIr v9QosjnLMlCh/fmWKwxnluclfqVpHzGgX5NbiqRhhr4Bb+8x45HgdlEHikZJ+M8ADPjU PUzDTDW2tIQP701ZeLuW7iXQvVyi+/Ugq4ZckPHVuNErPq9WO1V0wNVHvLzPkI/ad5uA CGuaZpSXgVS/X+FgH2eLr3j46FZWyhn6l16ONLu/MfwyIQ4T/wryEO6WBKCCqZ/fjKBX gpUg== X-Gm-Message-State: AA+aEWaF0xU7BoURdW4fzP3Jc8JQXR+NiObKNCoZAj5lbc8NTXUf0R9r 0GcrUW1siXBgos91t9B68CTzDw== X-Google-Smtp-Source: AFSGD/WC/pO8MUYC1vKvP8mhgQKOmFpXuOmOPa5/1MOXw37ADAW+FKEBCzvjBAVaelSkEYb8dEh1Lw== X-Received: by 2002:a1c:888d:: with SMTP id k135mr5166553wmd.137.1544593600964; Tue, 11 Dec 2018 21:46:40 -0800 (PST) Received: from mannams-OptiPlex-7010.dhcp.broadcom.net ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id z206sm2015947wmc.18.2018.12.11.21.46.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 11 Dec 2018 21:46:40 -0800 (PST) From: Srinath Mannam To: Bjorn Helgaas , Robin Murphy , Joerg Roedel , Lorenzo Pieralisi , Ray Jui Cc: bcm-kernel-feedback-list@broadcom.com, linux-pci@vger.kernel.org, iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, Srinath Mannam Subject: [RFC PATCH 2/3] iommu/dma: IOVA reserve for PCI host reserve address list Date: Wed, 12 Dec 2018 11:16:08 +0530 Message-Id: <1544593569-8923-3-git-send-email-srinath.mannam@broadcom.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1544593569-8923-1-git-send-email-srinath.mannam@broadcom.com> References: <1544593569-8923-1-git-send-email-srinath.mannam@broadcom.com> Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org PCI host has list of resource entries contain memory address range for which IOVA address mapping has to be reserve. These address ranges are the address holes in dma-ranges property. It is similar to PCI IO resources address range reserving in IOMMU for each EP connected to corresponding host. Signed-off-by: Srinath Mannam --- drivers/iommu/dma-iommu.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index 511ff9a..346da81 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -220,6 +220,14 @@ static void iova_reserve_pci_windows(struct pci_dev *dev, hi = iova_pfn(iovad, window->res->end - window->offset); reserve_iova(iovad, lo, hi); } + + /* Get reserved DMA windows from host bridge */ + resource_list_for_each_entry(window, &bridge->dma_resv) { + + lo = iova_pfn(iovad, window->res->start - window->offset); + hi = iova_pfn(iovad, window->res->end - window->offset); + reserve_iova(iovad, lo, hi); + } } static int iova_reserve_iommu_regions(struct device *dev, From patchwork Wed Dec 12 05:46:09 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srinath Mannam X-Patchwork-Id: 1011583 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pci-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=broadcom.com header.i=@broadcom.com header.b="QlIG4Ltx"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43F5RJ1pf1z9s47 for ; Wed, 12 Dec 2018 16:46:52 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726547AbeLLFqu (ORCPT ); Wed, 12 Dec 2018 00:46:50 -0500 Received: from mail-wr1-f68.google.com ([209.85.221.68]:41772 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726500AbeLLFqu (ORCPT ); Wed, 12 Dec 2018 00:46:50 -0500 Received: by mail-wr1-f68.google.com with SMTP id x10so16325421wrs.8 for ; Tue, 11 Dec 2018 21:46:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=o9zOKa7UZo6O1oSXPaMqPu6Fib6WbxYaMCsnJYZwlo8=; b=QlIG4Ltxek1NO4qTDSHC89YHHCe0sh1RmxOpdVMF0Otf8WCvUKyW9zfoBCzj5jJy1Z aRmRd7aLNA5vekwKNUtlK0IaM9Yv/gj9MEwrtjTg+JdtdrFOaDTMLbeauVSbxDKj1Syb HMgN+e8vXZT0sbLe38HQRH5SZ36vVljbjYyMw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=o9zOKa7UZo6O1oSXPaMqPu6Fib6WbxYaMCsnJYZwlo8=; b=RGdTOPBXjHdhNVVOWIi1aq7Po/r4mebvgQTH0DcbPxqinl04c+JxNW3uLnRqtP53Yb OunUG5CwW0n4HrCrM/AWHnM9BVpGcCxRuC3xFKyCeQmGQQBZzXJMe4qltkJ16evbL8iE kCsfLziKdzuyO0AaU9Nhnk0Q3KEqR89FIF0o/dRG92PNwSPFa6/As5S001T5fBJeW7Oj /K1TNkDy+JGS51RjRpvST7K+JtHgJJduWxYUC7RnEcgefrsDVg7+5Zzr3R46CG3gegqs ildf1jyvBz42LD0qIRAtrwIYtzOZ9P2WxcgRb/jPUFt64c6vKiVvk9XvvI3ycPbk6lsI GFdQ== X-Gm-Message-State: AA+aEWa/1E6e/LmBXyfkFF9HYb8l7PPl+9jMos0DfCbmumC+YqdVTd4+ pHj9CPANAGoxpqU60tLBIl1iJw== X-Google-Smtp-Source: AFSGD/W5fvf+7cGlVD1coGF/72gVx5nYO/sHP4U40r0vjs5KfAPR1WO+tTEdFzJ7o4gqCxb6UJXG6g== X-Received: by 2002:adf:ae41:: with SMTP id u1mr15101050wrd.20.1544593608138; Tue, 11 Dec 2018 21:46:48 -0800 (PST) Received: from mannams-OptiPlex-7010.dhcp.broadcom.net ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id z206sm2015947wmc.18.2018.12.11.21.46.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 11 Dec 2018 21:46:47 -0800 (PST) From: Srinath Mannam To: Bjorn Helgaas , Robin Murphy , Joerg Roedel , Lorenzo Pieralisi , Ray Jui Cc: bcm-kernel-feedback-list@broadcom.com, linux-pci@vger.kernel.org, iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, Srinath Mannam Subject: [RFC PATCH 3/3] PCI: iproc: Add dma reserve resources to host Date: Wed, 12 Dec 2018 11:16:09 +0530 Message-Id: <1544593569-8923-4-git-send-email-srinath.mannam@broadcom.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1544593569-8923-1-git-send-email-srinath.mannam@broadcom.com> References: <1544593569-8923-1-git-send-email-srinath.mannam@broadcom.com> Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org IPROC host has the limitation that it can use only those address ranges given by dma-ranges property as inbound address. So that the memory address holes in dma-ranges should be reserved to allocate as DMA address. All such reserved addresses are created as resource entries and add to dma_resv list of pci host bridge. These dma reserve resources created by parsing dma-ranges parameter. Ex: dma-ranges = < \ 0x43000000 0x00 0x80000000 0x00 0x80000000 0x00 0x80000000 \ 0x43000000 0x08 0x00000000 0x08 0x00000000 0x08 0x00000000 \ 0x43000000 0x80 0x00000000 0x80 0x00000000 0x40 0x00000000> In the above example of dma-ranges, memory address from 0x0 - 0x80000000, 0x100000000 - 0x800000000, 0x1000000000 - 0x8000000000 and 0x10000000000 - 0xffffffffffffffff. are not allowed to use as inbound addresses. So that we need to add these address range to dma_resv list to reserve their IOVA address ranges. Signed-off-by: Srinath Mannam --- drivers/pci/controller/pcie-iproc.c | 49 +++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/drivers/pci/controller/pcie-iproc.c b/drivers/pci/controller/pcie-iproc.c index 3160e93..43e465a 100644 --- a/drivers/pci/controller/pcie-iproc.c +++ b/drivers/pci/controller/pcie-iproc.c @@ -1154,25 +1154,74 @@ static int iproc_pcie_setup_ib(struct iproc_pcie *pcie, return ret; } +static int +iproc_pcie_add_dma_resv_range(struct device *dev, struct list_head *resources, + uint64_t start, uint64_t end) +{ + struct resource *res; + + res = devm_kzalloc(dev, sizeof(struct resource), GFP_KERNEL); + if (!res) + return -ENOMEM; + + res->start = (resource_size_t)start; + res->end = (resource_size_t)end; + pci_add_resource_offset(resources, res, 0); + + return 0; +} + static int iproc_pcie_map_dma_ranges(struct iproc_pcie *pcie) { + struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie); struct of_pci_range range; struct of_pci_range_parser parser; int ret; + uint64_t start, end; + LIST_HEAD(resources); /* Get the dma-ranges from DT */ ret = of_pci_dma_range_parser_init(&parser, pcie->dev->of_node); if (ret) return ret; + start = 0; for_each_of_pci_range(&parser, &range) { + end = range.pci_addr; + /* dma-ranges list expected in sorted order */ + if (end < start) { + ret = -EINVAL; + goto out; + } /* Each range entry corresponds to an inbound mapping region */ ret = iproc_pcie_setup_ib(pcie, &range, IPROC_PCIE_IB_MAP_MEM); if (ret) return ret; + + if (end - start) { + ret = iproc_pcie_add_dma_resv_range(pcie->dev, + &resources, + start, end); + if (ret) + goto out; + } + start = range.pci_addr + range.size; } + end = ~0; + if (end - start) { + ret = iproc_pcie_add_dma_resv_range(pcie->dev, &resources, + start, end); + if (ret) + goto out; + } + + list_splice_init(&resources, &host->dma_resv); + return 0; +out: + pci_free_resource_list(&resources); + return ret; } static int iproce_pcie_get_msi(struct iproc_pcie *pcie,