From patchwork Thu Feb 4 17:28:53 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tomasz Nowicki X-Patchwork-Id: 579054 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id A28371409B7 for ; Fri, 5 Feb 2016 04:33:37 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=semihalf-com.20150623.gappssmtp.com header.i=@semihalf-com.20150623.gappssmtp.com header.b=S4KUETmH; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964901AbcBDRd2 (ORCPT ); Thu, 4 Feb 2016 12:33:28 -0500 Received: from mail-wm0-f53.google.com ([74.125.82.53]:36906 "EHLO mail-wm0-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S966176AbcBDR33 (ORCPT ); Thu, 4 Feb 2016 12:29:29 -0500 Received: by mail-wm0-f53.google.com with SMTP id g62so15064913wme.0 for ; Thu, 04 Feb 2016 09:29:28 -0800 (PST) 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=SyfuP48cIaxSgvn0xadgZIvgyn9vxLOODKR1gOd8yZc=; b=S4KUETmHSb1toXMLSg7OL53bE4JqXzkpHyLg2aWsFSgxdCMtV8FlQZBcPOJ+/Ow1yo GHr6g8UzykTYCcH/hlBEMjCoI1q/7E2lqUJQFf8QOtFyVfFwtKhuPXyKfVWGnsbfbvT2 AHHVwE0fMJepsLEES/qyAFvs8bNeHxCa0fjBVRGhILe7CH0djjLysHQHvooMoJu/rxxA Z+FtW767aJFPGZfglkqeWmPirtHqfDUZvH/JVs2impD0dz77UUW03ltRiySAeWAxyBnO RaxrJaa0Cyt8CDWu6INEaNta2dUb7dVWVMCQc2oHZsD9XN6R8NccW7pecdkFdqhGtcyB DJ6Q== 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=SyfuP48cIaxSgvn0xadgZIvgyn9vxLOODKR1gOd8yZc=; b=dNeLNCdJ8N4gvsDD1ro7i6qeJok4yyPtoh1oCjj5h3SNsVpy5TfneKeRIIhAm3EfET yFGckPgt4GOcO3Zd3BZkF12GI/yquVIArnGCDKLHci3+y2ENASLze2y+NuoE7mMCgx0i ahylMP0itwHhnQD+5nmmR/bAF2jCAgJepDXYzuonDa/wTytd4PKQ7Cex3V/K/AQMxzOC YKjKRQ0KUtB8sShkMB0/F8ZT4yzEHXRN9Iy3LEtUgQZT7ET/KVzeFgVWF5UOpXdsmrvH e5P1lmirW4rnYB1oTwwxV1xPBpXH0dHRCEtgZQOI2O4Bb3TENxBR59c5sEFKOwEO/qwf jgLw== X-Gm-Message-State: AG10YOS+PP8Mh0AC38AklHMu5nUPCAjBuJGBJ1lHmFbO9q65PsHr6h/T9vkAhCvXXjyOsQ== X-Received: by 10.194.21.101 with SMTP id u5mr10957584wje.53.1454606967888; Thu, 04 Feb 2016 09:29:27 -0800 (PST) Received: from tn-HP-4.semihalf.local (cardhu.semihalf.com. [213.17.239.108]) by smtp.gmail.com with ESMTPSA id w8sm12238889wjx.21.2016.02.04.09.29.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 04 Feb 2016 09:29:27 -0800 (PST) From: Tomasz Nowicki To: bhelgaas@google.com, arnd@arndb.de, will.deacon@arm.com, catalin.marinas@arm.com, rjw@rjwysocki.net, hanjun.guo@linaro.org, Lorenzo.Pieralisi@arm.com, okaya@codeaurora.org, jiang.liu@linux.intel.com, Stefano.Stabellini@eu.citrix.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, jchandra@broadcom.com, jcm@redhat.com, Tomasz Nowicki Subject: [PATCH V4 15/23] acpi, mcfg: Implement two calls that might be used to inject/remove MCFG region. Date: Thu, 4 Feb 2016 18:28:53 +0100 Message-Id: <1454606941-9523-16-git-send-email-tn@semihalf.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1454606941-9523-1-git-send-email-tn@semihalf.com> References: <1454606941-9523-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 Lets abstract two calls which allow to inject and remove MCFG regions which may come from DSDT table. These calls will be used for x86 and ARM64 PCI host bridge driver in the later patches. Signed-off-by: Tomasz Nowicki Tested-by: Duc Dang Tested-by: Dongdong Liu Tested-by: Hanjun Guo Tested-by: Graeme Gregory Tested-by: Sinan Kaya --- drivers/acpi/mcfg.c | 38 ++++++++++++++++++++++++++++++++++++++ include/linux/pci-acpi.h | 9 +++++++++ 2 files changed, 47 insertions(+) diff --git a/drivers/acpi/mcfg.c b/drivers/acpi/mcfg.c index 3e1e7be..dca4c4e 100644 --- a/drivers/acpi/mcfg.c +++ b/drivers/acpi/mcfg.c @@ -10,6 +10,7 @@ #include #include #include +#include #define PREFIX "MCFG: " @@ -77,6 +78,43 @@ int __init acpi_parse_mcfg(struct acpi_table_header *header) return 0; } +int pci_mmcfg_setup_map(struct acpi_pci_root_info *ci) +{ + struct pci_mmcfg_region *cfg; + struct acpi_pci_root *root; + int seg, start, end, err; + + root = ci->root; + seg = root->segment; + start = root->secondary.start; + end = root->secondary.end; + + cfg = pci_mmconfig_lookup(seg, start); + if (cfg) + return 0; + + cfg = pci_mmconfig_alloc(seg, start, end, root->mcfg_addr); + if (!cfg) + return -ENOMEM; + + err = pci_mmconfig_inject(cfg); + return err; +} + +void pci_mmcfg_teardown_map(struct acpi_pci_root_info *ci) +{ + struct acpi_pci_root *root = ci->root; + struct pci_mmcfg_region *cfg; + + cfg = pci_mmconfig_lookup(root->segment, root->secondary.start); + if (!cfg) + return; + + if (cfg->hot_added) + pci_mmconfig_delete(root->segment, root->secondary.start, + root->secondary.end); +} + int __init __weak acpi_mcfg_check_entry(struct acpi_table_mcfg *mcfg, struct acpi_mcfg_allocation *cfg) { diff --git a/include/linux/pci-acpi.h b/include/linux/pci-acpi.h index a72e22d..65b91f3 100644 --- a/include/linux/pci-acpi.h +++ b/include/linux/pci-acpi.h @@ -80,6 +80,15 @@ extern struct pci_bus *acpi_pci_root_create(struct acpi_pci_root *root, void acpi_pci_add_bus(struct pci_bus *bus); void acpi_pci_remove_bus(struct pci_bus *bus); +#ifdef CONFIG_PCI_MMCONFIG +int pci_mmcfg_setup_map(struct acpi_pci_root_info *ci); +void pci_mmcfg_teardown_map(struct acpi_pci_root_info *ci); +#else +static inline int pci_mmcfg_setup_map(struct acpi_pci_root_info *ci) +{ return 0; } +static inline void pci_mmcfg_teardown_map(struct acpi_pci_root_info *ci) { } +#endif + #ifdef CONFIG_ACPI_PCI_SLOT void acpi_pci_slot_init(void); void acpi_pci_slot_enumerate(struct pci_bus *bus);