From patchwork Wed Jan 30 15:19:34 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Russell King - ARM Linux X-Patchwork-Id: 2068381 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by patchwork1.kernel.org (Postfix) with ESMTP id 3D3733FD1A for ; Wed, 30 Jan 2013 15:25:07 +0000 (UTC) Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1U0ZUl-0000Kv-6Z; Wed, 30 Jan 2013 15:22:39 +0000 Received: from [2002:4e20:1eda::1] (helo=caramon.arm.linux.org.uk) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1U0ZUg-0000BI-OA for linux-arm-kernel@lists.infradead.org; Wed, 30 Jan 2013 15:22:37 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=arm.linux.org.uk; s=caramon; h=Sender:In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=sy3mNKdkfwqKNviegCiCKK3OZ6UzCccGbM2XA2fzD0s=; b=jKbU68DtpUE0WqbaNY7JAmrKlP9KDiFcUmQ5b/UHVt3z8y6zkO8ZIJq2vn+VQHoShHTdjhcu7UkUFlvCg2EaNgeW+5WQPPFp5ALrAQ6vA9lprM+7nsBIzjjB0QQiGm/EqGVXeS8LQp1opJuk3YsCNDCi092lb77OvXXiPw9sAQI=; Received: from n2100.arm.linux.org.uk ([2002:4e20:1eda:1:214:fdff:fe10:4f86]:38656) by caramon.arm.linux.org.uk with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.76) (envelope-from ) id 1U0ZRn-0001Ud-W3; Wed, 30 Jan 2013 15:19:36 +0000 Received: from linux by n2100.arm.linux.org.uk with local (Exim 4.76) (envelope-from ) id 1U0ZRm-0007UA-KP; Wed, 30 Jan 2013 15:19:34 +0000 Date: Wed, 30 Jan 2013 15:19:34 +0000 From: Russell King - ARM Linux To: Thierry Reding Subject: Re: [PATCH v2 19/27] pci: PCIe driver for Marvell Armada 370/XP systems Message-ID: <20130130151934.GK23505@n2100.arm.linux.org.uk> References: <1359399397-29729-1-git-send-email-thomas.petazzoni@free-electrons.com> <1359399397-29729-20-git-send-email-thomas.petazzoni@free-electrons.com> <20130130113245.GH23505@n2100.arm.linux.org.uk> <20130130120344.GA29490@avionic-0098.mockup.avionic-design.de> <20130130150856.GJ23505@n2100.arm.linux.org.uk> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20130130150856.GJ23505@n2100.arm.linux.org.uk> User-Agent: Mutt/1.5.19 (2009-01-05) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130130_102235_268077_285D327C X-CRM114-Status: GOOD ( 27.78 ) X-Spam-Score: 1.8 (+) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (1.8 points) pts rule name description ---- ---------------------- -------------------------------------------------- 3.0 KHOP_BIG_TO_CC Sent to 10+ recipients instaed of Bcc or a list -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.8 RDNS_NONE Delivered to internal network by a host with no rDNS Cc: Thomas Petazzoni , Andrew Lunn , Jason Cooper , Arnd Bergmann , Stephen Warren , linux-pci@vger.kernel.org, Eran Ben-Avi , Nadav Haklai , Maen Suleiman , Lior Amsalem , Shadi Ammouri , Gregory Clement , Tawfik Bayouk , Bjorn Helgaas , linux-arm-kernel@lists.infradead.org, Jason Gunthorpe X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-arm-kernel-bounces@lists.infradead.org Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org On Wed, Jan 30, 2013 at 03:08:56PM +0000, Russell King - ARM Linux wrote: > On Wed, Jan 30, 2013 at 01:03:44PM +0100, Thierry Reding wrote: > > On Wed, Jan 30, 2013 at 11:32:46AM +0000, Russell King - ARM Linux wrote: > > > On Mon, Jan 28, 2013 at 07:56:28PM +0100, Thomas Petazzoni wrote: > > > > +static resource_size_t mvebu_pcie_align_resource(struct pci_dev *dev, > > > > + const struct resource *res, > > > > + resource_size_t start, > > > > + resource_size_t size, > > > > + resource_size_t align) > > > > +{ > > > > + if (!(res->flags & IORESOURCE_IO)) > > > > + return start; > > > > + > > > > + /* > > > > + * The I/O regions must be 64K aligned, because the > > > > + * granularity of PCIe I/O address decoding windows is 64 K > > > > + */ > > > > + return round_up(start, SZ_64K); > > > > +} > > > > > > You do realise that this will result in all PCI I/O BARs being rounded > > > up to 64K. > > > > > > I've just been digging through the PCI code and have come across a > > > function - pcibios_window_alignment() - which the PCI code allows to be > > > overriden which allows you to increase the alignment requirement of > > > bridge windows. It takes the PCI bus and window type as arguments. > > > > > > I'd suggest using that, and checking whether the bus which is passed > > > corresponds with a bus which gives you problems, so that you don't > > > impose the 64K requirement on downstream bridges. > > > > That approach isn't going to work very well with multi-platform, though, > > since the function can only be overridden on a per-architecture basis. > > The same can be said of all the various other functions which the PCI > stuff expects the arch to provide, yet we seem to cope just fine... And this (untested) is how it's done: arch/arm/include/asm/mach/pci.h | 1 + arch/arm/kernel/bios32.c | 8 ++++++++ 2 files changed, 9 insertions(+), 0 deletions(-) diff --git a/arch/arm/include/asm/mach/pci.h b/arch/arm/include/asm/mach/pci.h index db9fedb..bba0cf3 100644 --- a/arch/arm/include/asm/mach/pci.h +++ b/arch/arm/include/asm/mach/pci.h @@ -29,6 +29,7 @@ struct hw_pci { void (*postinit)(void); u8 (*swizzle)(struct pci_dev *dev, u8 *pin); int (*map_irq)(const struct pci_dev *dev, u8 slot, u8 pin); + resource_size_t (*window_align)(struct pci_bus *, unsigned long); }; /* diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index 379cf32..32c3bd9 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c @@ -581,6 +581,14 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res, return start; } +resource_size_t pcibios_window_alignment(struct pci_bus *bus, + unsigned long type) +{ + struct pci_sys_data *sys = bus->sysdata; + + return sys->window_alignment ? sys->window_alignment(bus, type) : 1; +} + /** * pcibios_enable_device - Enable I/O and memory. * @dev: PCI device to be enabled