From patchwork Tue May 10 15:19:55 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tomasz Nowicki X-Patchwork-Id: 9059421 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Original-To: patchwork-linux-pci@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id EAC50BF29F for ; Tue, 10 May 2016 15:23:39 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 0F1FD20160 for ; Tue, 10 May 2016 15:23:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3EE3320154 for ; Tue, 10 May 2016 15:23:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752800AbcEJPXd (ORCPT ); Tue, 10 May 2016 11:23:33 -0400 Received: from mail-lf0-f41.google.com ([209.85.215.41]:33181 "EHLO mail-lf0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752543AbcEJPUH (ORCPT ); Tue, 10 May 2016 11:20:07 -0400 Received: by mail-lf0-f41.google.com with SMTP id y84so18911461lfc.0 for ; Tue, 10 May 2016 08:20:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=MhjazSsLFMlokqv8h2IPUIAcPpC/ocSX28+vwZP0J3E=; b=aN1BkwcfungB4+J199hm8o3uCUC7+ECHvGJbVqACeCffuRQT3p+jFGjQ4ffHMtjGJo BMNC8/BKung9b4mUuOQj22IyDELjhi325kniF3EU9HvEgJSlFR+7fMpXydJfNOjaujdi gdXyCx8bJqaTSvDAGBs5KrZEVsjMIXyZPbN/38w9BfTU7qoHP3jvC9xZslH9t0XF5glo sQI7gmjV6rUIy3dgB+HIhb5cKRVYTzJ1XDAn2rHUhtH3IUuNRzZAoMNnTTWLhm3tLxpK Z7MELLSsMX7n47YwGihJQo1UkGh8G8fpfFoPNbxtw0RPI2ZhITTCc/abnp/HcG5TdBxI MMRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=MhjazSsLFMlokqv8h2IPUIAcPpC/ocSX28+vwZP0J3E=; b=A6+rJB/By1aV1VT+3aUWP3Dk0h7b3LlDfmG5LAOfY5dWJ9+mgp/A0ZPav4TfZZnFdo I+b4M4plfBQlnuIV7Vsw/86GmsxXYiLPcXTNZoKFZRVc6nlVmLj9JovRe0e/bp3/mZam Gpj+Okr07SH/QsogNuSkzuYSXVIBl6Sq3vrTqr7vTWS5bYHJjVpo5u1Bw2dlQFNZAZXP 4XUHIwBhPxisSotv5aJY61wdDtkXl6qzcQ24JiIMDwqfVgoSnqXwPn9FnKp6YANfr2Tf uZ5k6p4jOl0c55DKN99wbIuRVDFtBG4jpv1ToxXiF4i/NRuBsabMIm/zMktAiYiasbYo C7Dg== X-Gm-Message-State: AOPr4FXSfpZjz87cHyWSAlCDItLojOkllfob0YLea8nJ3uQq9ZboFbMmHXgyF1CMePvZ1w== X-Received: by 10.112.169.65 with SMTP id ac1mr17149026lbc.92.1462893605581; Tue, 10 May 2016 08:20:05 -0700 (PDT) Received: from tn-HP-4.semihalf.local (cardhu.semihalf.com. [213.17.239.108]) by smtp.gmail.com with ESMTPSA id s194sm468002lfs.40.2016.05.10.08.20.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 10 May 2016 08:20:04 -0700 (PDT) From: Tomasz Nowicki To: helgaas@kernel.org, arnd@arndb.de, will.deacon@arm.com, catalin.marinas@arm.com, rafael@kernel.org, hanjun.guo@linaro.org, Lorenzo.Pieralisi@arm.com, okaya@codeaurora.org, jchandra@broadcom.com Cc: robert.richter@caviumnetworks.com, mw@semihalf.com, Liviu.Dudau@arm.com, ddaney@caviumnetworks.com, wangyijing@huawei.com, Suravee.Suthikulpanit@amd.com, msalter@redhat.com, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org, linaro-acpi@lists.linaro.org, jcm@redhat.com, andrea.gallo@linaro.org, dhdang@apm.com, jeremy.linton@arm.com, liudongdong3@huawei.com, cov@codeaurora.org, Tomasz Nowicki Subject: [PATCH V7 05/11] acpi, pci: Support IO resources when parsing PCI host bridge resources. Date: Tue, 10 May 2016 17:19:55 +0200 Message-Id: <1462893601-8937-6-git-send-email-tn@semihalf.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1462893601-8937-1-git-send-email-tn@semihalf.com> References: <1462893601-8937-1-git-send-email-tn@semihalf.com> Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org X-Spam-Status: No, score=-8.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Platforms that have memory mapped IO port (such as ARM64) need special handling for PCI I/O resources. For host bridge's resource probing case these resources need to be fixed up with pci_register_io_range/pci_remap_iospace etc. The same I/O resources need to be released after hotplug removal so that it can be re-added back by the pci_remap_iospace function during insertion. As a consequence we unmap I/O resources with pci_unmap_iospace when we release host bridge resources. Signed-off-by: Jayachandran C Signed-off-by: Sinan Kaya Signed-off-by: Tomasz Nowicki --- drivers/acpi/pci_root.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index ae3fe4e..cb3071d 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c @@ -719,6 +719,34 @@ next: resource_list_add_tail(entry, resources); } } +static void acpi_pci_root_remap_iospace(struct resource_entry *entry) +{ +#ifdef PCI_IOBASE + struct resource *res = entry->res; + resource_size_t cpu_addr = res->start; + resource_size_t pci_addr = cpu_addr - entry->offset; + resource_size_t length = resource_size(res); + unsigned long port; + + if (pci_register_io_range(cpu_addr, length)) + goto err; + + port = pci_address_to_pio(cpu_addr); + if (port == (unsigned long)-1) + goto err; + + res->start = port; + res->end = port + length - 1; + entry->offset = port - pci_addr; + + if (pci_remap_iospace(res, cpu_addr) < 0) + goto err; + pr_info("Remapped I/O %pa to %pR\n", &cpu_addr, res); + return; +err: + res->flags |= IORESOURCE_DISABLED; +#endif +} int acpi_pci_probe_root_resources(struct acpi_pci_root_info *info) { @@ -740,6 +768,9 @@ int acpi_pci_probe_root_resources(struct acpi_pci_root_info *info) "no IO and memory resources present in _CRS\n"); else { resource_list_for_each_entry_safe(entry, tmp, list) { + if (entry->res->flags & IORESOURCE_IO) + acpi_pci_root_remap_iospace(entry); + if (entry->res->flags & IORESOURCE_DISABLED) resource_list_destroy_entry(entry); else @@ -811,6 +842,8 @@ static void acpi_pci_root_release_info(struct pci_host_bridge *bridge) resource_list_for_each_entry(entry, &bridge->windows) { res = entry->res; + if (res->flags & IORESOURCE_IO) + pci_unmap_iospace(res); if (res->parent && (res->flags & (IORESOURCE_MEM | IORESOURCE_IO))) release_resource(res);