From patchwork Tue Oct 15 16:06:40 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Vasut X-Patchwork-Id: 3046561 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 4ABEA9F3E2 for ; Tue, 15 Oct 2013 16:10:45 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 109B920415 for ; Tue, 15 Oct 2013 16:10:44 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4F476203FB for ; Tue, 15 Oct 2013 16:10:37 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1VW7BF-0003cp-3g; Tue, 15 Oct 2013 16:09:10 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1VW7Ai-0005L8-1X; Tue, 15 Oct 2013 16:08:36 +0000 Received: from mail-out.m-online.net ([212.18.0.9]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1VW79u-0005F4-IL for linux-arm-kernel@lists.infradead.org; Tue, 15 Oct 2013 16:07:50 +0000 Received: from frontend1.mail.m-online.net (unknown [192.168.8.180]) by mail-out.m-online.net (Postfix) with ESMTP id 3czhNT1X5vz4KK7v; Tue, 15 Oct 2013 18:07:05 +0200 (CEST) X-Auth-Info: tFu7mINPXOobE9Ztx5m407qInReI+ZWSYf0ZP6I18hY= Received: from chi.lan (host-82-135-33-74.customer.m-online.net [82.135.33.74]) by smtp-auth.mnet-online.de (Postfix) with ESMTPA id 3czhNS31vPzbbl1; Tue, 15 Oct 2013 18:07:04 +0200 (CEST) From: Marek Vasut To: linux-pci@vger.kernel.org Subject: [PATCH 6/6] PCI: designware: Fix DT resource retrieval Date: Tue, 15 Oct 2013 18:06:40 +0200 Message-Id: <1381853200-5534-7-git-send-email-marex@denx.de> X-Mailer: git-send-email 1.8.4.rc3 In-Reply-To: <1381853200-5534-1-git-send-email-marex@denx.de> References: <1381853200-5534-1-git-send-email-marex@denx.de> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20131015_120746_991148_4738B3CC X-CRM114-Status: GOOD ( 10.40 ) X-Spam-Score: 1.1 (+) Cc: Marek Vasut , Pratyush Anand , Richard Zhu , Siva Reddy Kallam , Mohit KUMAR , Sascha Hauer , Jingoo Han , Troy Kisky , Frank Li , Srikanth T Shivanand , Bjorn Helgaas , Sean Cross , Shawn Guo , Yinghai Lu , Tim Harvey , linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,KHOP_BIG_TO_CC, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=no 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 The resource retrieval from the DT was not done right. This resulted in bogus values in the IO/MEM window configuration. I re-used the code implementation from pci-tegra.c to do the resource retrieval correctly. This in turn resulted in very strange behavior on two different kinds of setup: Setup #1: ,-------> Intel i210 (igb driver) i.MX6 root port -----> PCIe switch `-------> Empty slot Setup #2: ,-------> Marvell Yukon (sky2 driver) i.MX6 root port -----> PCIe switch `-------> Empty slot Both setups expressed the same behavior. The system booted and the ethernet controllers were properly detected. After the controllers were configured and just after they reported "Ethernet Link Up", the entire system froze. It is now clear this happened because the resources were incorrectly configured, which in turn means the iATU was also not configured correctly. Signed-off-by: Marek Vasut Cc: Bjorn Helgaas Cc: Frank Li Cc: Jingoo Han Cc: Mohit KUMAR Cc: Pratyush Anand Cc: Richard Zhu Cc: Sascha Hauer Cc: Sean Cross Cc: Shawn Guo Cc: Siva Reddy Kallam Cc: Srikanth T Shivanand Cc: Tim Harvey Cc: Troy Kisky Cc: Yinghai Lu --- drivers/pci/host/pcie-designware.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c index 5d183ae..97c5951 100644 --- a/drivers/pci/host/pcie-designware.c +++ b/drivers/pci/host/pcie-designware.c @@ -370,6 +370,7 @@ int __init dw_pcie_host_init(struct pcie_port *pp) struct device_node *np = pp->dev->of_node; struct of_pci_range range; struct of_pci_range_parser parser; + struct resource res; u32 val; struct irq_domain *irq_domain; @@ -381,28 +382,22 @@ int __init dw_pcie_host_init(struct pcie_port *pp) /* Get the I/O and memory ranges from DT */ for_each_of_pci_range(&parser, &range) { - unsigned long restype = range.flags & IORESOURCE_TYPE_BITS; + of_pci_range_to_resource(&range, np, &res); + unsigned long restype = res.flags & IORESOURCE_TYPE_BITS; if (restype == IORESOURCE_IO) { - of_pci_range_to_resource(&range, np, &pp->io); + memcpy(&pp->io, &res, sizeof(res)); pp->io.name = "I/O"; - pp->io.start = max_t(resource_size_t, - PCIBIOS_MIN_IO, - range.pci_addr + global_io_offset); - pp->io.end = min_t(resource_size_t, - IO_SPACE_LIMIT, - range.pci_addr + range.size - + global_io_offset); pp->config.io_size = resource_size(&pp->io); pp->config.io_bus_addr = range.pci_addr; } if (restype == IORESOURCE_MEM) { - of_pci_range_to_resource(&range, np, &pp->mem); + memcpy(&pp->mem, &res, sizeof(res)); pp->mem.name = "MEM"; pp->config.mem_size = resource_size(&pp->mem); pp->config.mem_bus_addr = range.pci_addr; } if (restype == 0) { - of_pci_range_to_resource(&range, np, &pp->cfg); + memcpy(&pp->cfg, &res, sizeof(res)); pp->config.cfg0_size = resource_size(&pp->cfg)/2; pp->config.cfg1_size = resource_size(&pp->cfg)/2; }