Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754988AbbFKTyN (ORCPT ); Thu, 11 Jun 2015 15:54:13 -0400 Received: from mail-bn1on0142.outbound.protection.outlook.com ([157.56.110.142]:34495 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752280AbbFKTyI (ORCPT ); Thu, 11 Jun 2015 15:54:08 -0400 Authentication-Results: spf=none (sender IP is 165.204.84.221) smtp.mailfrom=amd.com; apm.com; dkim=none (message not signed) header.d=none; X-WSS-ID: 0NPSPY0-07-KVQ-02 X-M-MSG: Message-ID: <5579E74A.3000808@amd.com> Date: Thu, 11 Jun 2015 14:53:46 -0500 From: Suravee Suthikulanit User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Lorenzo Pieralisi , , CC: Ralf Baechle , "James E.J. Bottomley" , Michael Ellerman , Bjorn Helgaas , Richard Henderson , "Benjamin Herrenschmidt" , David Howells , Russell King , Tony Luck , "David S. Miller" , Ingo Molnar , Guenter Roeck , Michal Simek , Chris Zankel , Arnd Bergmann , Krzysztof Halasa , Phil Edworthy , Jason Gunthorpe , Jingoo Han , "Lucas Stach" , Simon Horman , "Minghuan Lian" , Murali Karicheri , Tanmay Inamdar , Kishon Vijay Abraham I , Thierry Reding , Thomas Petazzoni , Will Deacon , Jayachandran C Subject: Re: [RFC/RFT PATCH v2] PCI: move pci_read_bridge_bases to the generic PCI layer References: <1433840506-20083-1-git-send-email-lorenzo.pieralisi@arm.com> In-Reply-To: <1433840506-20083-1-git-send-email-lorenzo.pieralisi@arm.com> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11OLC014;1:/QY6oAGt3YJEXMNY0mbfGmmDqiskuXTgUXSooVBBxOZHGtDE5YJHUvsbhZ2qtjh1jcEloy9VaGUy5nyPFGuVf5ndx8ZBpHnkOa2DQhZ0LfQb7lKjzJ2GFoZKi8o1RkjCT7+tPRcZ8Ib4yJNXoy+A9CE3Hr5qrirpYWT2WRBVjLE0fK7S2tqgsrODj02vL9Ca3QDiGsSF0nXoiriMlSov1vs9T4OsooZMPmLYpVsrY3IpxSi5L1lyDs3DPs0CbNyM7mtxIsX3rVt9Tlqs1N3K+f8cmZ2hQAAwZTqReGRMCUgel6ZYS1dwrfF5e/4Uj2wkOAq+rF29bNi/398zdUejHgqtdmnZTqiBIie3DxJkXYQ= X-Forefront-Antispam-Report: CIP:165.204.84.221;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(428002)(51704005)(189002)(199003)(479174004)(377454003)(24454002)(33656002)(59896002)(5001770100001)(4001350100001)(83506001)(120886001)(23746002)(106466001)(46102003)(65956001)(47776003)(189998001)(2950100001)(64126003)(15975445007)(77096005)(87936001)(2201001)(86362001)(575784001)(50986999)(92566002)(87266999)(54356999)(101416001)(36756003)(76176999)(19580405001)(19580395003)(77156002)(105586002)(62966003)(7059030)(41533002)(2101003)(217873001);DIR:OUT;SFP:1102;SCL:1;SRVR:BN3PR02MB1110;H:atltwp01.amd.com;FPR:;SPF:None;MLV:sfv;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN3PR02MB1110;2:1W48BGxwoXH6w3n3Zr8oUOjW60TstwixDamluCkwWJIQYuOujZYHWtu/LZPxeD0i;2:X3f5tvd2s/gTq6NHUQizhA75fiHqNOdCOchhSPUzCFPlnZWBuTTt/mY65Vhd7grKkDzLhCEObKsCAMRfodX72xj/BYbyXUE0knQhFfkyRkWZTbgYItf3NBOY2lrcDWObSDHGmHPRggcXgl3MGLpKdoUmtd4zTuAk77cXKpf6L5nOXHuuhA+dEafjlA6NSTM2B1Jpu/K6P0ZC2sLOXDAZWx49q6zcfaSeRTqcAvLASn85mTAa8F7lq2L03ZUVj2yf;6:hVQmlVeZiHnqNS9DP+iddbyjwJGMmXkw7tPqYNiUmNpoBNbiNkyAT9ghL6GzYi+d/fAx7R+Uyc2JCI7yD6bDr+InLLgoxK7SX56LLZ9SuRQQCl9FFjFHcMMx2slOMnUGSgJ9Ac4UGVMDqkfU2LZqPIJoqlja2huVtbRRtPdJLZa4Pbp/x/DJmdWv+XBEXlcI97BWpKqdTOieIvXazkRkS2rGAlU8ljs4lDApzclSu1tZzA1x7GRrqXbJzKLAYDh1sEetlrw5eZOOihBV5rSO13m6tHCb//ct7HK9AdPDSkZNNBsBCVF55XFy9oYBN7gtnxpUicn8xQZZs8IJPbVC2ji2Cik4IRJ71qmS1d1L53tViJuv3dOYoGdx/DW/J1RCAiDvmIlRfv0e+lEAyU6PHu32yMrVpZa3XAj5TXx32DxsqEbelX3XUY+u4zi6zO35JdcmKF03Yf/dUvGlLHpJCc4rTClmY1jdbvayRlW4hTxDoQBOzDCynpc5yZr8xsvX X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN3PR02MB1110; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(520003)(5005006)(3002001);SRVR:BN3PR02MB1110;BCL:0;PCL:0;RULEID:;SRVR:BN3PR02MB1110; X-Microsoft-Exchange-Diagnostics: 1;BN3PR02MB1110;3:US0i3T4ZvR4/4wu/6ErVcUXQORcjB8fNsThuQOshK2TsF5hOU16xl0rA1ICfE8fvgp8gjhVvbfMBUPw4XHJyQnC+yQJbMQHlXgFyENvc8hRfhyEumPb5ltfoUgEM4RzEoMj4S1uO9buBe3XQggk9q3ucKkOsbM3Txr4K/2adYPM8ctlI8HWp9xJ1ac3EVoUC6ANZ9xY8DTUKF0+aGCHsecbmWur9SPNATEFJLo7wY436WDhX2vsL0S4lAre0wrBUFGvcyNP5vwR9dtJHDDec+XbByE5JWMOupVvKSS/txqMrJNA76SOh8hnKMUOGe7MZ X-Forefront-PRVS: 0604AFA86B X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1;BN3PR02MB1110;9:dM4Gif8uxxPJiKmH0rKl/IwuxZyS/ycjtEV6V/?= =?Windows-1252?Q?05KIiG9hwu+F/c1RG3Oapg/Rzkx9hD9q0sIxKfQMSMSq+B8xwGL9IYu4?= =?Windows-1252?Q?pI+MU4+Hf07L6JeyFh6NuhnbpbsUA4S/A2wUIOQGVQ7oNpG1m4butxLe?= =?Windows-1252?Q?tbbtioPToA/9kdNrs4knlOijtdIGZUTGBASAL5EugNngwkpd43TbNRBD?= =?Windows-1252?Q?03QzYHjknCLejzChTpWZJxn8FW2mTCXtsWG/3pKDsWtbwyvtA97CEMnV?= =?Windows-1252?Q?12gt3H0oUFZgcBuXegprClkrGQvZ7R2aQkxqKNMPES/wD9GXGb9pAVT+?= =?Windows-1252?Q?gPjcTjIPuSxqopScW8EaHlvB9AZvx3TlL6wXhYBQOc+Me7UTgGbZmiDK?= =?Windows-1252?Q?K04Uzp+uAd7EEZaC8Apkvht9wyUVsFaU8Xa2prh5x4oXOkwHbSb8hDZP?= =?Windows-1252?Q?qTGj2s9UCBmWX/5xtYbQoLtiV400DHoJb87Rc5nXgIJHxdcdVcMqazkU?= =?Windows-1252?Q?4QKEwFzum3a1EwUDvTD7zZqsNTpjf3YPZOhnF9M0LHG/9OEmuvPcUt+w?= =?Windows-1252?Q?bmV2fqDh70cjis2lXI1LYIAA/5UcZaRFYlTOWW2mBof0BvunUfQKw7HF?= =?Windows-1252?Q?IpIela5/weteqPZekNthwRsUwainofd3pP+r7PsoW93V6ZrE6wUq5eJU?= =?Windows-1252?Q?6MGWTvKHEY6eI6l5eySASjdVG927JuqJUdh5jDDM7c6WOyFrtafRCRpA?= =?Windows-1252?Q?+togrFRmo3JBApsd6VuNR1HSJJT38S7+AJoJ+4sGMpTeGEodJi+HSmxc?= =?Windows-1252?Q?xmJDfRhBecv0PqT1Ue1+3YSU4xdOMEuV0g0IPO3UY+MaYqt9+W1vkmmo?= =?Windows-1252?Q?FzZWY1kl+BhsZZMsb1dRYe61IzgYd272PW3q2xXr1GZXFyyJS+99v6mJ?= =?Windows-1252?Q?shuJE2VaUIz9XYy3WLi/af3heWXhh8vJUI53Ra9L/rx+AoCIsH7nMn5t?= =?Windows-1252?Q?+qUaVJCYQ2gUzQjZspf34olhdCsSmL7o0LDdj2RT04qcHk1M3bakKY3U?= =?Windows-1252?Q?PI1CaKg0jxJv6hqnrqCafDOLGBSd8M1jCgzf7NidiimkHepPcbIAXq5s?= =?Windows-1252?Q?w7b+Cg0D+HVMLs2g198tvUluaIQ/XPJEAFZaAGTUl2wWmrBYIRxcOInq?= =?Windows-1252?Q?76A0CSKI9kBG/kwXARiwqx6z5z3YQ=3D?= X-Microsoft-Exchange-Diagnostics: 1;BN3PR02MB1110;3:ayoe/iJKzuuzPwWporXL7LlOAN81GpxRK+nkYs5xreVTS6M56YRr0TGxSFu7rmZUI+mTxaquBvXe1yeVya/4KA2BR/l4kf2gw2R3dNgKWaylguR2Jh5MUkNNEpYwrobP+vfOj7MBu3uiqMOc97Qo5Q==;10:JVIoZQ0MJoIm39LkTODIIwTI9EDV8eHWoT/5CvhkcSY3A+aap5EmVEYkGXdjmSHEZzp2S/CdpHr1h465YE6XIhSePBafG5RD53kLO/WfFXY=;6:eWfzhNRKhs4Yb4SQUyq9mOBE3KANTwIwaoC8LFnZjl9TWiKJe3N+fHPnvhpdQyzU X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Jun 2015 19:54:03.0323 (UTC) X-MS-Exchange-CrossTenant-Id: fde4dada-be84-483f-92cc-e026cbee8e96 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=fde4dada-be84-483f-92cc-e026cbee8e96;Ip=[165.204.84.221];Helo=[atltwp01.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR02MB1110 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 10513 Lines: 307 For ARM64 PROBE_ONLY and non-PROBE_ONLY modes: Reviewed and Tested-by: Suravee Suthikulpanit Please see minor comments below. On 6/9/2015 4:01 AM, Lorenzo Pieralisi wrote: > When a PCI bus is scanned, upon PCI bridge detection the kernel > has to read the bridge registers to set-up its resources so that > the PCI resource hierarchy can be validated properly. > > Most if not all architectures read PCI bridge registers in the > pcibios_fixup_bus hook, that is called by the PCI generic layer > whenever a PCI bus is scanned. > > Since pci_read_bridge_bases is an arch agnostic operation (and it > is carried out on all architectures) it can be moved to the generic > PCI layer in order to consolidate code and remove the respective > calls from the architectures back-ends. > > The PCI_PROBE_ONLY flag is not checked before calling > pci_read_bridge_buses in the generic layer since reading the bridge > bases is not related to resources assignment; this implies that it > can be carried out safely on PCI_PROBE_ONLY systems too and should > not affect architectures (alpha, mips) that check the PCI_PROBE_ONLY > flag before reading the bridge bases. > > In order to validate the resource hierarchy as soon as the resources > themselves are probed (ie read from the bridge), this patch also adds > code to pci_read_bridge_bases that claims the bridge resources, so that > they are validated and inserted in the resource hierarchy as soon as > the bridge bases are probed. > > Signed-off-by: Lorenzo Pieralisi > Cc: Ralf Baechle > Cc: James E.J. Bottomley > Cc: Michael Ellerman > Cc: Bjorn Helgaas > Cc: Richard Henderson > Cc: Benjamin Herrenschmidt > Cc: David Howells > Cc: Russell King > Cc: Tony Luck > Cc: David S. Miller > Cc: Ingo Molnar > Cc: Guenter Roeck > Cc: Michal Simek > Cc: Chris Zankel > --- > v1->v2: > > - Moved pci_read_bridge_bases call to pci_scan_bridge to read bases before > scanning devices > - Added bridge resources claiming > > v1: https://lkml.org/lkml/2015/5/21/359 > > arch/alpha/kernel/pci.c | 7 +------ > arch/frv/mb93090-mb00/pci-vdk.c | 2 -- > arch/ia64/pci/pci.c | 1 - > arch/microblaze/pci/pci-common.c | 9 +-------- > arch/mips/pci/pci.c | 6 ------ > arch/mn10300/unit-asb2305/pci.c | 1 - > arch/powerpc/kernel/pci-common.c | 8 +------- > arch/x86/pci/common.c | 1 - > arch/xtensa/kernel/pci.c | 4 ---- > drivers/parisc/dino.c | 3 --- > drivers/parisc/lba_pci.c | 1 - > drivers/pci/probe.c | 26 ++++++++++++++++++++++++++ > 12 files changed, 29 insertions(+), 40 deletions(-) > > diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c > index 82f738e..cded02c 100644 > --- a/arch/alpha/kernel/pci.c > +++ b/arch/alpha/kernel/pci.c > @@ -242,12 +242,7 @@ pci_restore_srm_config(void) > > void pcibios_fixup_bus(struct pci_bus *bus) > { > - struct pci_dev *dev = bus->self; > - > - if (pci_has_flag(PCI_PROBE_ONLY) && dev && > - (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { > - pci_read_bridge_bases(bus); > - } > + struct pci_dev *dev; > > list_for_each_entry(dev, &bus->devices, bus_list) { > pdev_save_srm_config(dev); > diff --git a/arch/frv/mb93090-mb00/pci-vdk.c b/arch/frv/mb93090-mb00/pci-vdk.c > index f211839..f9c86c4 100644 > --- a/arch/frv/mb93090-mb00/pci-vdk.c > +++ b/arch/frv/mb93090-mb00/pci-vdk.c > @@ -294,8 +294,6 @@ void pcibios_fixup_bus(struct pci_bus *bus) > printk("### PCIBIOS_FIXUP_BUS(%d)\n",bus->number); > #endif > > - pci_read_bridge_bases(bus); > - > if (bus->number == 0) { > struct pci_dev *dev; > list_for_each_entry(dev, &bus->devices, bus_list) { > diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c > index 7cc3be9..563228b 100644 > --- a/arch/ia64/pci/pci.c > +++ b/arch/ia64/pci/pci.c > @@ -534,7 +534,6 @@ void pcibios_fixup_bus(struct pci_bus *b) > struct pci_dev *dev; > > if (b->self) { > - pci_read_bridge_bases(b); > pcibios_fixup_bridge_resources(b->self); > } > list_for_each_entry(dev, &b->devices, bus_list) > diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c > index ae838ed..6b8b752 100644 > --- a/arch/microblaze/pci/pci-common.c > +++ b/arch/microblaze/pci/pci-common.c > @@ -863,14 +863,7 @@ void pcibios_setup_bus_devices(struct pci_bus *bus) > > void pcibios_fixup_bus(struct pci_bus *bus) > { > - /* When called from the generic PCI probe, read PCI<->PCI bridge > - * bases. This is -not- called when generating the PCI tree from > - * the OF device-tree. > - */ > - if (bus->self != NULL) > - pci_read_bridge_bases(bus); > - > - /* Now fixup the bus bus */ > + /* Fixup the bus */ > pcibios_setup_bus_self(bus); > > /* Now fixup devices on that bus */ > diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c > index b8a0bf5..c6996cf 100644 > --- a/arch/mips/pci/pci.c > +++ b/arch/mips/pci/pci.c > @@ -311,12 +311,6 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) > > void pcibios_fixup_bus(struct pci_bus *bus) > { > - struct pci_dev *dev = bus->self; > - > - if (pci_has_flag(PCI_PROBE_ONLY) && dev && > - (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { > - pci_read_bridge_bases(bus); > - } > } > > EXPORT_SYMBOL(PCIBIOS_MIN_IO); > diff --git a/arch/mn10300/unit-asb2305/pci.c b/arch/mn10300/unit-asb2305/pci.c > index 3dfe2d3..deaa893 100644 > --- a/arch/mn10300/unit-asb2305/pci.c > +++ b/arch/mn10300/unit-asb2305/pci.c > @@ -324,7 +324,6 @@ void pcibios_fixup_bus(struct pci_bus *bus) > struct pci_dev *dev; > > if (bus->self) { > - pci_read_bridge_bases(bus); > pcibios_fixup_bridge_resources(bus->self); > } > > diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c > index 0d05406..722dd5f 100644 > --- a/arch/powerpc/kernel/pci-common.c > +++ b/arch/powerpc/kernel/pci-common.c > @@ -1043,13 +1043,7 @@ void pcibios_set_master(struct pci_dev *dev) > > void pcibios_fixup_bus(struct pci_bus *bus) > { > - /* When called from the generic PCI probe, read PCI<->PCI bridge > - * bases. This is -not- called when generating the PCI tree from > - * the OF device-tree. > - */ > - pci_read_bridge_bases(bus); > - > - /* Now fixup the bus bus */ > + /* Fixup the bus */ > pcibios_setup_bus_self(bus); > > /* Now fixup devices on that bus */ > diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c > index 8fd6f44..3bff244 100644 > --- a/arch/x86/pci/common.c > +++ b/arch/x86/pci/common.c > @@ -166,7 +166,6 @@ void pcibios_fixup_bus(struct pci_bus *b) > { > struct pci_dev *dev; > > - pci_read_bridge_bases(b); > list_for_each_entry(dev, &b->devices, bus_list) > pcibios_fixup_device_resources(dev); > } > diff --git a/arch/xtensa/kernel/pci.c b/arch/xtensa/kernel/pci.c > index b848cc3..d27b4dc 100644 > --- a/arch/xtensa/kernel/pci.c > +++ b/arch/xtensa/kernel/pci.c > @@ -210,10 +210,6 @@ subsys_initcall(pcibios_init); > > void pcibios_fixup_bus(struct pci_bus *bus) > { > - if (bus->parent) { > - /* This is a subordinate bridge */ > - pci_read_bridge_bases(bus); > - } > } > > void pcibios_set_master(struct pci_dev *dev) > diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c > index a0580af..baec33c 100644 > --- a/drivers/parisc/dino.c > +++ b/drivers/parisc/dino.c > @@ -560,9 +560,6 @@ dino_fixup_bus(struct pci_bus *bus) > } else if (bus->parent) { > int i; > > - pci_read_bridge_bases(bus); > - > - > for(i = PCI_BRIDGE_RESOURCES; i < PCI_NUM_RESOURCES; i++) { > if((bus->self->resource[i].flags & > (IORESOURCE_IO | IORESOURCE_MEM)) == 0) > diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c > index dceb9dd..901e1a3 100644 > --- a/drivers/parisc/lba_pci.c > +++ b/drivers/parisc/lba_pci.c > @@ -693,7 +693,6 @@ lba_fixup_bus(struct pci_bus *bus) > if (bus->parent) { > int i; > /* PCI-PCI Bridge */ > - pci_read_bridge_bases(bus); > for (i = PCI_BRIDGE_RESOURCES; i < PCI_NUM_RESOURCES; i++) > pci_claim_bridge_resource(bus->self, i); > } else { > diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c > index 6675a7a..1913e1b 100644 > --- a/drivers/pci/probe.c > +++ b/drivers/pci/probe.c > @@ -332,6 +332,21 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom) > } > } > > +static void pci_claim_bridge_resources(struct pci_bus *bus) > +{ > + struct pci_dev *dev = bus->self; > + int idx; > + > + for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) { > + struct resource *r = &dev->resource[idx]; > + > + if (!r->flags || r->parent) > + continue; > + > + pci_claim_bridge_resource(dev, idx); > + } > +} > + Nitpicking: Since pci_claim_bridge_resources() is small, and only called once from pci_read_brdige_bases(), should we just put the loop inside the function? > static void pci_read_bridge_io(struct pci_bus *child) > { > struct pci_dev *dev = child->self; > @@ -479,6 +494,8 @@ void pci_read_bridge_bases(struct pci_bus *child) > } > } > } > + > + pci_claim_bridge_resources(child); > } > > static struct pci_bus *pci_alloc_bus(struct pci_bus *parent) > @@ -826,6 +843,11 @@ int pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, int pass) > child->bridge_ctl = bctl; > } > > + /* > + * Read and initialize bridge resources. > + */ > + pci_read_bridge_bases(child); > + > cmax = pci_scan_child_bus(child); > if (cmax > subordinate) > dev_warn(&dev->dev, "bridge has subordinate %02x but max busn %02x\n", > @@ -886,6 +908,10 @@ int pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, int pass) > > if (!is_cardbus) { > child->bridge_ctl = bctl; > + /* > + * Read and initialize bridge resources. > + */ > + pci_read_bridge_bases(child); > max = pci_scan_child_bus(child); > } else { > /* > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/