From patchwork Fri Apr 8 00:16:01 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yinghai Lu X-Patchwork-Id: 8778621 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Original-To: patchwork-linux-pci@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 300EC9F36E for ; Fri, 8 Apr 2016 00:23:46 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2E8B02024F for ; Fri, 8 Apr 2016 00:23:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 42D932020F for ; Fri, 8 Apr 2016 00:23:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932742AbcDHAWh (ORCPT ); Thu, 7 Apr 2016 20:22:37 -0400 Received: from userp1040.oracle.com ([156.151.31.81]:36665 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932568AbcDHAWe (ORCPT ); Thu, 7 Apr 2016 20:22:34 -0400 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u380H27h003534 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 8 Apr 2016 00:17:02 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u380H1BF004014 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 8 Apr 2016 00:17:02 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u380H1O7026345; Fri, 8 Apr 2016 00:17:01 GMT Received: from aserv0022.oracle.com (/10.132.126.127) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 07 Apr 2016 17:17:01 -0700 From: Yinghai Lu To: Bjorn Helgaas , David Miller , Benjamin Herrenschmidt , Linus Torvalds Cc: Wei Yang , TJ , Yijing Wang , Khalid Aziz , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, Yinghai Lu Subject: [PATCH v11 48/60] PCI: Move ISA io port align out of calculate_iosize() Date: Thu, 7 Apr 2016 17:16:01 -0700 Message-Id: <1460074573-7481-49-git-send-email-yinghai@kernel.org> X-Mailer: git-send-email 1.8.4.5 In-Reply-To: <1460074573-7481-1-git-send-email-yinghai@kernel.org> References: <1460074573-7481-1-git-send-email-yinghai@kernel.org> X-Source-IP: userv0022.oracle.com [156.151.31.74] Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org X-Spam-Status: No, score=-7.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, 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 We need to move ISA io port align out of calculate_iosize(), so we could unify calculate_iosize and calculate_memsize later. That extra aligning or offset is to work around ISA devices: When one bridge have several children devices, and every device has several io port resources and resource size < 0x400. We need to check size, and add extra size to make sure bit8/9 to be zero. Also need to apply same checking for optional size path. Signed-off-by: Yinghai Lu --- drivers/pci/setup-bus.c | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 11a4c1d..c202854 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -1113,11 +1113,6 @@ static resource_size_t calculate_iosize(resource_size_t size, size = min_size; if (old_size == 1) old_size = 0; - /* To be fixed in 2.5: we should have sort of HAVE_ISA - flag in the struct pci_bus. */ -#if defined(CONFIG_ISA) || defined(CONFIG_EISA) - size = (size & 0xff) + ((size & ~0xffUL) << 2); -#endif size = ALIGN(size + size1, align); if (size < old_size) size = old_size; @@ -1171,6 +1166,18 @@ static resource_size_t window_alignment(struct pci_bus *bus, return max(align, arch_align); } +static resource_size_t size_aligned_for_isa(resource_size_t size) +{ + /* + * To be fixed in 2.5: we should have sort of HAVE_ISA + * flag in the struct pci_bus. + */ +#if defined(CONFIG_ISA) || defined(CONFIG_EISA) + size = (size & 0xff) + ((size & ~0xffUL) << 2); +#endif + return size; +} + /** * pbus_size_io() - size the io window of a given bus * @@ -1188,11 +1195,10 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size, { struct pci_dev *dev; resource_size_t min_sum_size = 0; - resource_size_t sum_add_size; struct resource *b_res = find_free_bus_resource(bus, IORESOURCE_IO, IORESOURCE_IO); resource_size_t size = 0, size0 = 0, size1 = 0; - resource_size_t children_add_size = 0; + resource_size_t sum_add_size = 0, sum_add_size1 = 0; resource_size_t min_align, align; if (!b_res) @@ -1209,7 +1215,7 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size, for (i = 0; i < PCI_NUM_RESOURCES; i++) { struct resource *r = &dev->resource[i]; - unsigned long r_size; + unsigned long r_size, r_add_size; if (r->parent || !(r->flags & IORESOURCE_IO)) continue; @@ -1225,18 +1231,27 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size, if (align > min_align) min_align = align; - if (realloc_head) - children_add_size += get_res_add_size(realloc_head, r); + if (realloc_head) { + r_add_size = get_res_add_size(realloc_head, r); + r_add_size += r_size; + if (r_add_size < 0x400) + /* Might be re-aligned for ISA */ + sum_add_size += r_add_size; + else + sum_add_size1 += r_add_size; + } } } + size = size_aligned_for_isa(size); size0 = calculate_iosize(size, min_size, size1, resource_size(b_res), min_align); - sum_add_size = children_add_size + size + size1; + sum_add_size = size_aligned_for_isa(sum_add_size); + sum_add_size += sum_add_size1; if (sum_add_size < min_sum_size) sum_add_size = min_sum_size; size1 = !realloc_head ? size0 : - calculate_iosize(size, min_size, sum_add_size - size, + calculate_iosize(sum_add_size, min_size, 0, resource_size(b_res), min_align); if (!size0 && !size1) { if (b_res->start || b_res->end)