From patchwork Tue Oct 27 20:55:40 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yinghai Lu X-Patchwork-Id: 7502541 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 3C4809F327 for ; Tue, 27 Oct 2015 21:06:52 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 55E8720987 for ; Tue, 27 Oct 2015 21:06:51 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 651282097E for ; Tue, 27 Oct 2015 21:06:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965521AbbJ0VGR (ORCPT ); Tue, 27 Oct 2015 17:06:17 -0400 Received: from aserp1040.oracle.com ([141.146.126.69]:40073 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965768AbbJ0VCP (ORCPT ); Tue, 27 Oct 2015 17:02:15 -0400 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t9RKuwAn003167 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 27 Oct 2015 20:56:59 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t9RKuwTw003715 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 27 Oct 2015 20:56:58 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t9RKuwr6002463; Tue, 27 Oct 2015 20:56:58 GMT Received: from aserv0021.oracle.com (/10.132.126.176) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 27 Oct 2015 13:56:57 -0700 From: Yinghai Lu To: Bjorn Helgaas , David Miller , Benjamin Herrenschmidt , Wei Yang , TJ , Yijing Wang , Khalid Aziz Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, Yinghai Lu Subject: [PATCH v8 48/61] PCI: Move ISA io port align out of calculate_iosize() Date: Tue, 27 Oct 2015 13:55:40 -0700 Message-Id: <1445979353-1728-49-git-send-email-yinghai@kernel.org> X-Mailer: git-send-email 1.8.4.5 In-Reply-To: <1445979353-1728-1-git-send-email-yinghai@kernel.org> References: <1445979353-1728-1-git-send-email-yinghai@kernel.org> X-Source-IP: userv0021.oracle.com [156.151.31.71] Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org X-Spam-Status: No, score=-6.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 d4aeedc..4e7f0aa 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -1114,11 +1114,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; @@ -1172,6 +1167,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 * @@ -1189,11 +1196,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) @@ -1210,7 +1216,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; @@ -1226,18 +1232,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)