From patchwork Wed Nov 8 09:28:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Vasut X-Patchwork-Id: 835742 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pci-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="UeSxHRDS"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yX1Hn1pJlz9s7c for ; Wed, 8 Nov 2017 20:30:45 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751599AbdKHJal (ORCPT ); Wed, 8 Nov 2017 04:30:41 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:55287 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751650AbdKHJ2V (ORCPT ); Wed, 8 Nov 2017 04:28:21 -0500 Received: by mail-wm0-f66.google.com with SMTP id r68so9285921wmr.3; Wed, 08 Nov 2017 01:28:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=Pkf+Ayq302cLAsRMHEEOUYg4kIxD67V/XBh4y0lDRJc=; b=UeSxHRDSPf4HbNZkHAhnxzMBgGSKM5ueM3qY6ooWn5WTGEKbyFk22CodkwVhBz6JCn eIYAbhMcHFsoFibjDhuEU/bkpQjQNLYEUzjrAqbvIWggwfqCP1ryNEU6Mu0sV0n1/62U v2HNWg5PGRXtioUm96HoDT1+oSnoqXb+em4ac/VDrKM53wr9dWIuFcO+tF8shtUiNPtd Bbb+O+vc2eZEO5ePUy5MUsi3s5XTwzdBG1eagdY/gNOUe8uuHq5YzgkpMQnwFtzn+YzL 5lXcCdlYVDSSAfkO5zFU16tYE3BtrcXszCy+ww/zBRpUc58xilQ4yiuKmCKo4F99V/W5 4k8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=Pkf+Ayq302cLAsRMHEEOUYg4kIxD67V/XBh4y0lDRJc=; b=QhcR9O3FGEd47DUVbao4VlGSRLsGpU48WiRBdEnSjutUDk82VGX/YbjaM17VZTDLm4 Y+j4ebVb5tKdv7A/EMiWw4IA0X/yBgq6Ok/oaz5jkXFIUeQGJeuJ6iirsuxfkr4w0npY CIG7r2MZmyZKr2sq5KNQHqxf4T8xPC7unwhy5FulDEKXU9b5KVgCeOCwLh8SZ+bMjgmi VpKn2Wij0E8YXWKJH72YgACbWKH89RpUze4L1fjhl8SyJJyRgMEVP5FxOfUJCCg73BJ3 aAx6fEDQBPkQnYJqk9fi5xND2t7lLTRkH/PfE4burVW9VLg9bC+gP664alBjAd3sWMU1 F6WQ== X-Gm-Message-State: AJaThX6Y+iQ2yBV+pFMAotn4uH0FBdjgxptzUy+zM4aZNFR8Z4YrpVGp lGjjUcH3pkVtwKZr2g4a7OELjcI3 X-Google-Smtp-Source: ABhQp+Susm3cGiKx3GgTfK5/OKMla0NfG8jyu/cczaiY36G/K8eLEqu9pBqdPF7ZbvbzNSzbd311HQ== X-Received: by 10.28.31.76 with SMTP id f73mr1586188wmf.139.1510133299582; Wed, 08 Nov 2017 01:28:19 -0800 (PST) Received: from kurokawa.lan (ip-86-49-107-50.net.upcbroadband.cz. [86.49.107.50]) by smtp.gmail.com with ESMTPSA id o135sm4489691wmg.1.2017.11.08.01.28.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 08 Nov 2017 01:28:18 -0800 (PST) From: Marek Vasut X-Google-Original-From: Marek Vasut To: linux-pci@vger.kernel.org Cc: Kazufumi Ikeda , Gaku Inami , Marek Vasut , Geert Uytterhoeven , Simon Horman , Wolfram Sang , linux-renesas-soc@vger.kernel.org Subject: [PATCH 1/3] PCI: rcar: Add the initialization of PCIe link in resume_noirq Date: Wed, 8 Nov 2017 10:28:04 +0100 Message-Id: <20171108092806.10335-1-marek.vasut+renesas@gmail.com> X-Mailer: git-send-email 2.11.0 Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org From: Kazufumi Ikeda Reestablish the PCIe link very early in the resume process in case it went down to prevent PCI accesses from hanging the bus. Such accesses can happen early in the PCI resume process, in the resume_noirq, thus the link must be reestablished in the resume_noirq callback of the driver. Signed-off-by: Kazufumi Ikeda Signed-off-by: Gaku Inami Signed-off-by: Marek Vasut Cc: Geert Uytterhoeven Cc: Simon Horman Cc: Wolfram Sang Cc: linux-renesas-soc@vger.kernel.org --- drivers/pci/host/pcie-rcar.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/drivers/pci/host/pcie-rcar.c b/drivers/pci/host/pcie-rcar.c index 889603783f01..aa588a7d4811 100644 --- a/drivers/pci/host/pcie-rcar.c +++ b/drivers/pci/host/pcie-rcar.c @@ -43,6 +43,7 @@ /* Transfer control */ #define PCIETCTLR 0x02000 +#define DL_DOWN (1 << 3) #define CFINIT 1 #define PCIETSTR 0x02004 #define DATA_LINK_ACTIVE 1 @@ -529,7 +530,7 @@ static void phy_write_reg(struct rcar_pcie *pcie, phy_wait_for_ack(pcie); } -static int rcar_pcie_wait_for_dl(struct rcar_pcie *pcie) +static int rcar_pcie_wait_for_dl(struct rcar_pcie *pcie, int atomic) { unsigned int timeout = 10; @@ -537,7 +538,10 @@ static int rcar_pcie_wait_for_dl(struct rcar_pcie *pcie) if ((rcar_pci_read_reg(pcie, PCIETSTR) & DATA_LINK_ACTIVE)) return 0; - msleep(5); + if (atomic) + mdelay(5); + else + msleep(5); } return -ETIMEDOUT; @@ -595,7 +599,7 @@ static int rcar_pcie_hw_init(struct rcar_pcie *pcie) rcar_pci_write_reg(pcie, CFINIT, PCIETCTLR); /* This will timeout if we don't have a link. */ - err = rcar_pcie_wait_for_dl(pcie); + err = rcar_pcie_wait_for_dl(pcie, 0); if (err) return err; @@ -1110,6 +1114,7 @@ static int rcar_pcie_probe(struct platform_device *pdev) pcie = pci_host_bridge_priv(bridge); pcie->dev = dev; + platform_set_drvdata(pdev, pcie); INIT_LIST_HEAD(&pcie->resources); @@ -1173,10 +1178,30 @@ static int rcar_pcie_probe(struct platform_device *pdev) return err; } +static int rcar_pcie_resume_noirq(struct device *dev) +{ + struct rcar_pcie *pcie = dev_get_drvdata(dev); + u32 val = rcar_pci_read_reg(pcie, PMSR); + int ret = 0; + + if ((val == 0) || (rcar_pci_read_reg(pcie, PCIETCTLR) & DL_DOWN)) { + /* Re-establish the PCIe link */ + rcar_pci_write_reg(pcie, CFINIT, PCIETCTLR); + ret = rcar_pcie_wait_for_dl(pcie, 1); + } + + return ret; +} + +static const struct dev_pm_ops rcar_pcie_pm_ops = { + .resume_noirq = rcar_pcie_resume_noirq, +}; + static struct platform_driver rcar_pcie_driver = { .driver = { .name = "rcar-pcie", .of_match_table = rcar_pcie_of_match, + .pm = &rcar_pcie_pm_ops, .suppress_bind_attrs = true, }, .probe = rcar_pcie_probe, From patchwork Wed Nov 8 09:28:05 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Vasut X-Patchwork-Id: 835740 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pci-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="tPoC1Zsx"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yX1FG2gqKz9s7c for ; Wed, 8 Nov 2017 20:28:34 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751944AbdKHJ20 (ORCPT ); Wed, 8 Nov 2017 04:28:26 -0500 Received: from mail-wr0-f196.google.com ([209.85.128.196]:56138 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751900AbdKHJ2W (ORCPT ); Wed, 8 Nov 2017 04:28:22 -0500 Received: by mail-wr0-f196.google.com with SMTP id l8so1763330wre.12; Wed, 08 Nov 2017 01:28:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=XvEodv5rCJKoTH1awI1RrNGsrC87UyNr0MnA5Uk33XU=; b=tPoC1ZsxydSibSroqZRiPN9Wbrgg5Oty9gGemk9NoXekQtuavMjrVeb9S2DuejtgGr vdtmeMF3KHlxJmn2Pov7xhej/Ftv6NVftcSI+YGiaZ5W2O4+b+fHfTPWr97RI9zSSHVt koi8plj1lDdVKTmDlE+CILZC/6i9mcjX7Hb8k9FTPjMO7G2R7JbbfghQwt73zoCgSsc+ DNu+NdGj2MZcFfP4XE4vBhejj26x3RatVex+g2tDDKMK4IAqW6IHqu0Z4rWLn/YdXGjf OCBQNdbyCRbAbnpZFXeJP5lhE3MGcOLuszHNzGi8OHXSH99QTIaXxYZLICn1+JK/JVDB 4w5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=XvEodv5rCJKoTH1awI1RrNGsrC87UyNr0MnA5Uk33XU=; b=b5s7LJzejJ5K1BdSHpsEHrdJwxoKF3Kmadma5cAEl8o1yROFMZAr6fwJKlcKrsyeTU fKxs/Nuo+JDsKtiu7bM3antZdujTNr7PnDwHLifMoeVnw1P1JrBeNOrJm0Qiw3zYvmxN PP2S9N29+BTdWzfovAgS5ZM8YTIIahrSlDWMK485m9EJOqPusaS3Jwp1vQ9J8H2T380m it7maM9OEKNTXYbPs8fg1forj10D6hwmUqwjrTOEldMAPqiTQg80dvuuZyk+hksOF6Iq x4AI3U0dBDdS+xu4slL4/gdcZgBJM8E4gvUensY9WPMG+/bsgNCiBME7prZbRxl5Nrct RIeg== X-Gm-Message-State: AJaThX59axND6yv/DgYx8nQ80W5SVErJ5RF115I9Ax4Z7HFFpn4oGmNn am5F+lm6D1PmjQAgf93Zv9w6Z4uU X-Google-Smtp-Source: ABhQp+Sq26Dg/mWeQdJhL88P68b1L8hVEowthOkCs6SMuPSFjYz5o21qpRNnm75EibpI3yHsShEePw== X-Received: by 10.223.150.68 with SMTP id c4mr352872wra.255.1510133300716; Wed, 08 Nov 2017 01:28:20 -0800 (PST) Received: from kurokawa.lan (ip-86-49-107-50.net.upcbroadband.cz. [86.49.107.50]) by smtp.gmail.com with ESMTPSA id o135sm4489691wmg.1.2017.11.08.01.28.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 08 Nov 2017 01:28:19 -0800 (PST) From: Marek Vasut X-Google-Original-From: Marek Vasut To: linux-pci@vger.kernel.org Cc: Phil Edworthy , Marek Vasut , Geert Uytterhoeven , Simon Horman , Wolfram Sang , linux-renesas-soc@vger.kernel.org Subject: [PATCH 2/3] PCI: rcar: Support runtime PM, link state L1 handling Date: Wed, 8 Nov 2017 10:28:05 +0100 Message-Id: <20171108092806.10335-2-marek.vasut+renesas@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171108092806.10335-1-marek.vasut+renesas@gmail.com> References: <20171108092806.10335-1-marek.vasut+renesas@gmail.com> Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org From: Phil Edworthy Most PCIe host controllers support L0s and L1 power states via ASPM. The R-Car hardware only supports L0s, so when the system suspends and resumes we have to manually handle L1. When the system suspends, cards can put themselves into L1 and send a PM_ENTER_L1 DLLP to the host controller. At this point, we can no longer access the card's config registers. The R-Car host controller will handle taking cards out of L1 as long as the host controller has also been transitioned to L1 link state. Ideally, we would detect the PM_ENTER_L1 DLLP using an interrupt and transition the host to L1 immediately. However, this patch just ensures that we can talk to cards after they have gone into L1. When attempting a config access, it checks to see if the card has gone into L1, and if so, does the same for the host controller. This is based on a patch by Hien Dang Signed-off-by: Phil Edworthy Signed-off-by: Marek Vasut Cc: Geert Uytterhoeven Cc: Simon Horman Cc: Wolfram Sang Cc: linux-renesas-soc@vger.kernel.org Acked-by: Simon Horman --- drivers/pci/host/pcie-rcar.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/pci/host/pcie-rcar.c b/drivers/pci/host/pcie-rcar.c index aa588a7d4811..2b28292de93a 100644 --- a/drivers/pci/host/pcie-rcar.c +++ b/drivers/pci/host/pcie-rcar.c @@ -92,6 +92,13 @@ #define MACCTLR 0x011058 #define SPEED_CHANGE (1 << 24) #define SCRAMBLE_DISABLE (1 << 27) +#define PMSR 0x01105c +#define L1FAEG (1 << 31) +#define PM_ENTER_L1RX (1 << 23) +#define PMSTATE (7 << 16) +#define PMSTATE_L1 (3 << 16) +#define PMCTLR 0x011060 +#define L1_INIT (1 << 31) #define MACS2R 0x011078 #define MACCGSPSETR 0x011084 #define SPCNGRSN (1 << 31) @@ -191,6 +198,7 @@ static int rcar_pcie_config_access(struct rcar_pcie *pcie, unsigned int devfn, int where, u32 *data) { int dev, func, reg, index; + u32 val; dev = PCI_SLOT(devfn); func = PCI_FUNC(devfn); @@ -232,6 +240,22 @@ static int rcar_pcie_config_access(struct rcar_pcie *pcie, if (pcie->root_bus_nr < 0) return PCIBIOS_DEVICE_NOT_FOUND; + /* + * If we are not in L1 link state and we have received PM_ENTER_L1 DLLP, + * transition to L1 link state. The HW will handle coming of of L1. + */ + val = rcar_pci_read_reg(pcie, PMSR); + if ((val & PM_ENTER_L1RX) && ((val & PMSTATE) != PMSTATE_L1)) { + rcar_pci_write_reg(pcie, L1_INIT, PMCTLR); + + /* Wait until we are in L1 */ + while (!(val & L1FAEG)) + val = rcar_pci_read_reg(pcie, PMSR); + + /* Clear flags indicating link has transitioned to L1 */ + rcar_pci_write_reg(pcie, L1FAEG | PM_ENTER_L1RX, PMSR); + } + /* Clear errors */ rcar_pci_write_reg(pcie, rcar_pci_read_reg(pcie, PCIEERRFR), PCIEERRFR); From patchwork Wed Nov 8 09:28:06 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Vasut X-Patchwork-Id: 835741 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pci-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="kIEUQ7tl"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yX1FH6NF7z9s7c for ; Wed, 8 Nov 2017 20:28:35 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751350AbdKHJ2b (ORCPT ); Wed, 8 Nov 2017 04:28:31 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:44455 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751278AbdKHJ2X (ORCPT ); Wed, 8 Nov 2017 04:28:23 -0500 Received: by mail-wm0-f67.google.com with SMTP id n74so17280909wmi.1; Wed, 08 Nov 2017 01:28:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+ozX7fCHlXESqhZgwAG0jECJhUvbPkHOff4iNvCHAyc=; b=kIEUQ7tljBWL1bdO6jvxgW87H5DbdxV9eIMEFBvAhaZJMC1RKZmYAgD/bUY/HpzRvC C+COznYmSLBY8Q3t6a7o90+nMtMUFKimtKSMxE8/c3Ww8Rw5gCfYWbn8TkjgV4+frzI3 xqY/XpJzml9V1C9BGdIu4tmJUOm9COMzifRnQh84cd7D/FtvMkuz5B7avChJvcWG0QC8 I6UsAlPhaksm6HlkO3yPnpGF/B09A+1X8RzPPg/iIZiA+P8/O2jN0vBC4APWmLsqTdsb YL6OTWY3KvLGfKe4OJXzwIqN2IWfl1NxidDHa+X3jU4gNRisgRiioHTz0N3bFfSqWpi8 mDvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=+ozX7fCHlXESqhZgwAG0jECJhUvbPkHOff4iNvCHAyc=; b=YYHkJ1Ud0gATORvcvIXQQuep+1chMNUsW3PoA/81QY4yVJa2fxz/EIJC6cKCaBpEXW JyrdrS6jwvdWIapUN62ZKnJ+DmFXQBdGDzr78MymPSViRztYjbU0NfR85cyge8m9DJdT f3levaGjrft5UtEivaA/quxGLbragt7Q57BxAiW2PWc/lJVV7HMFCYi/9sKc1ChtPQv1 3fLyqny5nLAj180m37rFvLdWuTjTAauP6wEBF5R8je6NlH5Tt/g6OR9fJxYIeWtoX2mR japthFExMQ+5ISEXg1zDP3kADfiIiijIfQQXfyVVFOHxRM2wZ/xjo74Ool6fS9CxoZIM PVSw== X-Gm-Message-State: AJaThX4qwPZZ3RlOu1fRt1PC2qYuLPWoGilwUc1Zu5GHbLo/V0AmunzT 771gvEe2+dX6cTEHtqaQVdB7ZhEk X-Google-Smtp-Source: ABhQp+Rjq/PP74THr4wiE9mfFh9iq2af5dSKItUj/wzccglaNq3pWVz/IDXq6zWXt4dHgDLIIIBJrA== X-Received: by 10.28.1.199 with SMTP id 190mr1561236wmb.51.1510133301941; Wed, 08 Nov 2017 01:28:21 -0800 (PST) Received: from kurokawa.lan (ip-86-49-107-50.net.upcbroadband.cz. [86.49.107.50]) by smtp.gmail.com with ESMTPSA id o135sm4489691wmg.1.2017.11.08.01.28.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 08 Nov 2017 01:28:21 -0800 (PST) From: Marek Vasut X-Google-Original-From: Marek Vasut To: linux-pci@vger.kernel.org Cc: Kazufumi Ikeda , Gaku Inami , Marek Vasut , Geert Uytterhoeven , Simon Horman , Wolfram Sang , linux-renesas-soc@vger.kernel.org Subject: [PATCH 3/3] PCI: rcar: Add the suspend/resume for pcie-rcar driver Date: Wed, 8 Nov 2017 10:28:06 +0100 Message-Id: <20171108092806.10335-3-marek.vasut+renesas@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171108092806.10335-1-marek.vasut+renesas@gmail.com> References: <20171108092806.10335-1-marek.vasut+renesas@gmail.com> Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org From: Kazufumi Ikeda This adds the suspend/resume supports for pcie-rcar. The resume handler reprogram the hardware based on the software state kept in specific device structures. Also it doesn't need to save any registers. Signed-off-by: Kazufumi Ikeda Signed-off-by: Gaku Inami Signed-off-by: Marek Vasut Cc: Geert Uytterhoeven Cc: Simon Horman Cc: Wolfram Sang Cc: linux-renesas-soc@vger.kernel.org --- drivers/pci/host/pcie-rcar.c | 86 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 78 insertions(+), 8 deletions(-) diff --git a/drivers/pci/host/pcie-rcar.c b/drivers/pci/host/pcie-rcar.c index 2b28292de93a..7a9e30185c79 100644 --- a/drivers/pci/host/pcie-rcar.c +++ b/drivers/pci/host/pcie-rcar.c @@ -471,6 +471,36 @@ static void rcar_pcie_force_speedup(struct rcar_pcie *pcie) (macsr & LINK_SPEED) == LINK_SPEED_5_0GTS ? "5" : "2.5"); } +static int rcar_pcie_hw_enable(struct rcar_pcie *pcie) +{ + struct resource_entry *win; + LIST_HEAD(res); + int i = 0; + + /* Try setting 5 GT/s link speed */ + rcar_pcie_force_speedup(pcie); + + /* Setup PCI resources */ + resource_list_for_each_entry(win, &pcie->resources) { + struct resource *res = win->res; + + if (!res->flags) + continue; + + switch (resource_type(res)) { + case IORESOURCE_IO: + case IORESOURCE_MEM: + rcar_pcie_setup_window(i, pcie, res); + i++; + break; + default: + continue; + } + } + + return 0; +} + static int rcar_pcie_enable(struct rcar_pcie *pcie) { struct device *dev = pcie->dev; @@ -872,11 +902,25 @@ static const struct irq_domain_ops msi_domain_ops = { .map = rcar_msi_map, }; +static void rcar_pcie_hw_enable_msi(struct rcar_pcie *pcie) +{ + struct rcar_msi *msi = &pcie->msi; + unsigned long base; + + /* setup MSI data target */ + base = virt_to_phys((void *)msi->pages); + + rcar_pci_write_reg(pcie, base | MSIFE, PCIEMSIALR); + rcar_pci_write_reg(pcie, 0, PCIEMSIAUR); + + /* enable all MSI interrupts */ + rcar_pci_write_reg(pcie, 0xffffffff, PCIEMSIIER); +} + static int rcar_pcie_enable_msi(struct rcar_pcie *pcie) { struct device *dev = pcie->dev; struct rcar_msi *msi = &pcie->msi; - unsigned long base; int err, i; mutex_init(&msi->lock); @@ -915,13 +959,7 @@ static int rcar_pcie_enable_msi(struct rcar_pcie *pcie) /* setup MSI data target */ msi->pages = __get_free_pages(GFP_KERNEL, 0); - base = virt_to_phys((void *)msi->pages); - - rcar_pci_write_reg(pcie, base | MSIFE, PCIEMSIALR); - rcar_pci_write_reg(pcie, 0, PCIEMSIAUR); - - /* enable all MSI interrupts */ - rcar_pci_write_reg(pcie, 0xffffffff, PCIEMSIIER); + rcar_pcie_hw_enable_msi(pcie); return 0; @@ -1202,6 +1240,37 @@ static int rcar_pcie_probe(struct platform_device *pdev) return err; } +static int rcar_pcie_resume(struct device *dev) +{ + struct rcar_pcie *pcie = dev_get_drvdata(dev); + unsigned int data; + int err; + int (*hw_init_fn)(struct rcar_pcie *); + + err = rcar_pcie_parse_map_dma_ranges(pcie, dev->of_node); + if (err) + return 0; + + /* Failure to get a link might just be that no cards are inserted */ + hw_init_fn = of_device_get_match_data(dev); + err = hw_init_fn(pcie); + if (err) { + dev_info(dev, "PCIe link down\n"); + return 0; + } + + data = rcar_pci_read_reg(pcie, MACSR); + dev_info(dev, "PCIe x%d: link up\n", (data >> 20) & 0x3f); + + /* Enable MSI */ + if (IS_ENABLED(CONFIG_PCI_MSI)) + rcar_pcie_hw_enable_msi(pcie); + + rcar_pcie_hw_enable(pcie); + + return 0; +} + static int rcar_pcie_resume_noirq(struct device *dev) { struct rcar_pcie *pcie = dev_get_drvdata(dev); @@ -1218,6 +1287,7 @@ static int rcar_pcie_resume_noirq(struct device *dev) } static const struct dev_pm_ops rcar_pcie_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(NULL, rcar_pcie_resume) .resume_noirq = rcar_pcie_resume_noirq, };