From patchwork Tue Oct 20 23:04:39 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Daney X-Patchwork-Id: 533549 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 B4BC114110C for ; Wed, 21 Oct 2015 10:07:31 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=n0k7dsBJ; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752547AbbJTXHa (ORCPT ); Tue, 20 Oct 2015 19:07:30 -0400 Received: from mail-ig0-f182.google.com ([209.85.213.182]:35752 "EHLO mail-ig0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753268AbbJTXEv (ORCPT ); Tue, 20 Oct 2015 19:04:51 -0400 Received: by igbkq10 with SMTP id kq10so86438723igb.0; Tue, 20 Oct 2015 16:04:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HONZO8+IY9nvrpYQRGdjRJQJnKYmyfrVj2X03NvFufY=; b=n0k7dsBJ9VGQRb6VOuY+Mjm7kYF12qpAP3QGgOz1StWHb+ijVWsN4WOo7clakU8TY1 ZKuH3PCGUVT9GFBxHk2u0b9Ks0VAhUaWSQ0IShaA1aWZiOsLKupTxY2FTqY68MNn2Y35 5TeLcyvNOrk3GFFC4tD32m/8e+iS+I/rtByJrT00LVw1F1sUU4gUDnugp+4GLJiHDMJK FZrUayWXWbL2HwuDTbsxbcH4y2oguIRazoyzHIKEbPJisdDzNHps9/2Vzrr6tsMIQcPK yrzPbjQOWTY+XtgIckG+Pg6tsX5GTBCMnDgY/lUOs5ZavVOUZyXouoWWpZNzJQThS+BE ut9g== X-Received: by 10.50.61.166 with SMTP id q6mr27611398igr.12.1445382290790; Tue, 20 Oct 2015 16:04:50 -0700 (PDT) Received: from dl.caveonetworks.com (64.2.3.194.ptr.us.xo.net. [64.2.3.194]) by smtp.gmail.com with ESMTPSA id je7sm2463544igb.4.2015.10.20.16.04.46 (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 20 Oct 2015 16:04:48 -0700 (PDT) Received: from dl.caveonetworks.com (localhost.localdomain [127.0.0.1]) by dl.caveonetworks.com (8.14.5/8.14.5) with ESMTP id t9KN4jZg002443; Tue, 20 Oct 2015 16:04:45 -0700 Received: (from ddaney@localhost) by dl.caveonetworks.com (8.14.5/8.14.5/Submit) id t9KN4j0a002442; Tue, 20 Oct 2015 16:04:45 -0700 From: David Daney To: linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, Bjorn Helgaas , "Michael S. Tsirkin" , =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= , linux-api@vger.kernel.org, "Sean O. Stalley" , yinghai@kernel.org, rajatxjain@gmail.com, gong.chen@linux.intel.com Cc: David Daney Subject: [PATCH v6 2/5] PCI: Handle IORESOURCE_PCI_FIXED when assigning resources. Date: Tue, 20 Oct 2015 16:04:39 -0700 Message-Id: <1445382282-2396-3-git-send-email-ddaney.cavm@gmail.com> X-Mailer: git-send-email 1.7.11.7 In-Reply-To: <1445382282-2396-1-git-send-email-ddaney.cavm@gmail.com> References: <1445382282-2396-1-git-send-email-ddaney.cavm@gmail.com> Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org From: David Daney The new Enhanced Allocation (EA) capability support (patches to follow) creates resources with the IORESOURCE_PCI_FIXED set. During resource assignment in pci_bus_assign_resources(), IORESOURCE_PCI_FIXED resources are not given a parent. This, in turn, causes pci_enable_resources() to fail with a "not claimed" error. So, In __pci_bus_assign_resources(), for IORESOURCE_PCI_FIXED resources, try to request the resource from a parent bus. Acked-by: Sean O. Stalley Signed-off-by: David Daney --- drivers/pci/setup-bus.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 4dfef10..7239a2c 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -1341,6 +1341,47 @@ void pci_bus_size_bridges(struct pci_bus *bus) } EXPORT_SYMBOL(pci_bus_size_bridges); +static void assign_fixed_resource_on_bus(struct pci_bus *b, struct resource *r) +{ + int i; + struct resource *parent_r; + unsigned long mask = IORESOURCE_IO | IORESOURCE_MEM | + IORESOURCE_PREFETCH; + + pci_bus_for_each_resource(b, parent_r, i) { + if (!parent_r) + continue; + + if ((r->flags & mask) == (parent_r->flags & mask) && + resource_contains(parent_r, r)) + request_resource(parent_r, r); + } +} + +/* + * Try to assign any resources marked as IORESOURCE_PCI_FIXED, as they + * are skipped by pbus_assign_resources_sorted(). + */ +static void pdev_assign_fixed_resources(struct pci_dev *dev) +{ + int i; + + for (i = 0; i < PCI_NUM_RESOURCES; i++) { + struct pci_bus *b; + struct resource *r = &dev->resource[i]; + + if (r->parent || !(r->flags & IORESOURCE_PCI_FIXED) || + !(r->flags & (IORESOURCE_IO | IORESOURCE_MEM))) + continue; + + b = dev->bus; + while (b && !r->parent) { + assign_fixed_resource_on_bus(b, r); + b = b->parent; + } + } +} + void __pci_bus_assign_resources(const struct pci_bus *bus, struct list_head *realloc_head, struct list_head *fail_head) @@ -1351,6 +1392,8 @@ void __pci_bus_assign_resources(const struct pci_bus *bus, pbus_assign_resources_sorted(bus, realloc_head, fail_head); list_for_each_entry(dev, &bus->devices, bus_list) { + pdev_assign_fixed_resources(dev); + b = dev->subordinate; if (!b) continue;