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: 2068371 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Original-To: patchwork-linux-pci@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id F36853FD1A for ; Wed, 30 Jan 2013 15:19:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751438Ab3A3PTz (ORCPT ); Wed, 30 Jan 2013 10:19:55 -0500 Received: from caramon.arm.linux.org.uk ([78.32.30.218]:59082 "EHLO caramon.arm.linux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751124Ab3A3PTy (ORCPT ); Wed, 30 Jan 2013 10:19:54 -0500 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 Cc: Thomas Petazzoni , Andrew Lunn , Jason Cooper , Arnd Bergmann , Maen Suleiman , linux-pci@vger.kernel.org, Stephen Warren , Eran Ben-Avi , Nadav Haklai , Gregory Clement , Lior Amsalem , Shadi Ammouri , Bjorn Helgaas , Tawfik Bayouk , linux-arm-kernel@lists.infradead.org, Jason Gunthorpe 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) Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.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(-) --- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html 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