{"id":805234,"url":"http://patchwork.ozlabs.org/api/1.2/patches/805234/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-pci/patch/1503551066-23212-4-git-send-email-oza.oza@broadcom.com/","project":{"id":28,"url":"http://patchwork.ozlabs.org/api/1.2/projects/28/?format=json","name":"Linux PCI development","link_name":"linux-pci","list_id":"linux-pci.vger.kernel.org","list_email":"linux-pci@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<1503551066-23212-4-git-send-email-oza.oza@broadcom.com>","list_archive_url":null,"date":"2017-08-24T05:04:26","name":"[v8,3/3] PCI: iproc: add device shutdown for PCI RC","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"8081338f1c97eab424cfdf6c7c34ee5a58de19d9","submitter":{"id":71219,"url":"http://patchwork.ozlabs.org/api/1.2/people/71219/?format=json","name":"Oza Pawandeep","email":"oza.oza@broadcom.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-pci/patch/1503551066-23212-4-git-send-email-oza.oza@broadcom.com/mbox/","series":[],"comments":"http://patchwork.ozlabs.org/api/patches/805234/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/805234/checks/","tags":{},"related":[],"headers":{"Return-Path":"<linux-pci-owner@vger.kernel.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=linux-pci-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)","ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=broadcom.com header.i=@broadcom.com\n\theader.b=\"aLpZSUNf\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xdC0R5whmz9s8P\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 24 Aug 2017 15:05:11 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751319AbdHXFE4 (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tThu, 24 Aug 2017 01:04:56 -0400","from mail-wm0-f46.google.com ([74.125.82.46]:36825 \"EHLO\n\tmail-wm0-f46.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751318AbdHXFEx (ORCPT\n\t<rfc822; linux-pci@vger.kernel.org>); Thu, 24 Aug 2017 01:04:53 -0400","by mail-wm0-f46.google.com with SMTP id x128so12218849wmg.1\n\tfor <linux-pci@vger.kernel.org>; Wed, 23 Aug 2017 22:04:52 -0700 (PDT)","from anjanavk-OptiPlex-7010.dhcp.avagotech.net ([192.19.237.250])\n\tby smtp.gmail.com with ESMTPSA id\n\tn67sm3602691wmi.43.2017.08.23.22.04.44\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tWed, 23 Aug 2017 22:04:51 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=broadcom.com; s=google;\n\th=from:to:subject:date:message-id:in-reply-to:references;\n\tbh=Kb/QryCzir9/u0J0kFUj7eT/cpvKVGubZ7lzISsPyYA=;\n\tb=aLpZSUNfedNab5i9yV8cJYSsZSR7n+jGVCazMQaWa1HxY5ti2l2Ft1umhbX7sj+Qba\n\t8U4tV6NGuNuTf02Ml0Np0yo/FI1/77wkELPQ6t91ZBxP83w4/fD1nvpCkDdo//Vj5rYI\n\t/X3ATN+7Y/+xVFDROvjGGUUt6eZjh2Nju5qH8=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=Kb/QryCzir9/u0J0kFUj7eT/cpvKVGubZ7lzISsPyYA=;\n\tb=IetSk483PW8RvlmHmxL8Svq8iMcfeUxSnhUNoFIpyGMUwB+T35OT3K3ePF2l0IcrjH\n\tSnZJHt7TznyzjZxOlA9qM7qAU5TLoWu0LByKfDTqEI2uSEiQ2VTirg/wYovEA8638A9k\n\tB29U4CQxBv5Xxn5SJVYniPjUkA/l6IfclrxD49gnoL4q5c+tleY3C2EwwetmAlRTRWpP\n\tO+Jc6DU0NFQTnfrZwxgRDDUE97TqEO2PvTKBX7j6wEoNflTw7emu+4lCf9MbsqH7K3Sq\n\tsVJN1Hpo/HypQbUPeeO5QhHDzxv0AGBl7dM08K5i22yU9na79x/pcsN4DhWut5MGXyR2\n\tbT0w==","X-Gm-Message-State":"AHYfb5gUDUhBIBRaGsz88xBngdwa7jCoRK+4pBl7LGvV+MPSdmKz0ahR\n\tYg9RBVdHhil3DXC4","X-Received":"by 10.28.23.79 with SMTP id 76mr2668501wmx.149.1503551091857;\n\tWed, 23 Aug 2017 22:04:51 -0700 (PDT)","From":"Oza Pawandeep <oza.oza@broadcom.com>","To":"Bjorn Helgaas <bhelgaas@google.com>, <helgaas@kernel.org>,\n\tRob Herring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>,\n\tRay Jui <rjui@broadcom.com>, Scott Branden <sbranden@broadcom.com>,\n\tJon Mason <jonmason@broadcom.com>, bcm-kernel-feedback-list@broadcom.com,\n\tOza Pawandeep <oza.oza@broadcom.com>,\n\tAndy Gospodarek <gospo@broadcom.com>,\n\tlinux-pci@vger.kernel.org, devicetree@vger.kernel.org,\n\tlinux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org,\n\tOza Pawandeep <oza.pawandeep@gmail.com>","Subject":"[PATCH v8 3/3] PCI: iproc: add device shutdown for PCI RC","Date":"Thu, 24 Aug 2017 10:34:26 +0530","Message-Id":"<1503551066-23212-4-git-send-email-oza.oza@broadcom.com>","X-Mailer":"git-send-email 1.9.1","In-Reply-To":"<1503551066-23212-1-git-send-email-oza.oza@broadcom.com>","References":"<1503551066-23212-1-git-send-email-oza.oza@broadcom.com>","Sender":"linux-pci-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<linux-pci.vger.kernel.org>","X-Mailing-List":"linux-pci@vger.kernel.org"},"content":"PERST must be asserted around ~500ms before the reboot is applied.\n\nDuring soft reset (e.g., \"reboot\" from Linux) on some iproc based SOCs\nLCPLL clock and PERST both goes off simultaneously.\nThis will cause certain Endpoints Intel NVMe not get detected, upon\nnext boot sequence.\n\nThis is specifically happening with Intel P3700 400GB series.\nEndpoint is expecting the clock for some amount of time after PERST is\nasserted, which is not happening in Stingray (iproc based SOC).\nThis causes NVMe to behave in undefined way.\n\nOn the contrary, Intel x86 boards will have ref clock running, so we\ndo not see this behavior there.\n\nBesides, PCI spec does not stipulate about such timings.\nIn-fact it does not tell us, whether PCIe device should consider\nrefclk to be available or not to be.\n\nIt is completely up to vendor to design their EP the way they want\nwith respect to ref clock availability.\n\n500ms is just based on the observation and taken as safe margin.\nThis patch adds platform shutdown where it should be\ncalled in device_shutdown while reboot command is issued.\nSo in sequence first Endpoint Shutdown (e.g. nvme_shutdown)\nfollowed by RC shutdown, which issues safe PERST assertion.\n\nSigned-off-by: Oza Pawandeep <oza.oza@broadcom.com>\nReviewed-by: Ray Jui <ray.jui@broadcom.com>\nReviewed-by: Scott Branden <scott.branden@broadcom.com>","diff":"diff --git a/drivers/pci/host/pcie-iproc-platform.c b/drivers/pci/host/pcie-iproc-platform.c\nindex 2253119..a5073a9 100644\n--- a/drivers/pci/host/pcie-iproc-platform.c\n+++ b/drivers/pci/host/pcie-iproc-platform.c\n@@ -134,6 +134,13 @@ static int iproc_pcie_pltfm_remove(struct platform_device *pdev)\n \treturn iproc_pcie_remove(pcie);\n }\n \n+static void iproc_pcie_pltfm_shutdown(struct platform_device *pdev)\n+{\n+\tstruct iproc_pcie *pcie = platform_get_drvdata(pdev);\n+\n+\tiproc_pcie_shutdown(pcie);\n+}\n+\n static struct platform_driver iproc_pcie_pltfm_driver = {\n \t.driver = {\n \t\t.name = \"iproc-pcie\",\n@@ -141,6 +148,7 @@ static int iproc_pcie_pltfm_remove(struct platform_device *pdev)\n \t},\n \t.probe = iproc_pcie_pltfm_probe,\n \t.remove = iproc_pcie_pltfm_remove,\n+\t.shutdown = iproc_pcie_pltfm_shutdown,\n };\n module_platform_driver(iproc_pcie_pltfm_driver);\n \ndiff --git a/drivers/pci/host/pcie-iproc.c b/drivers/pci/host/pcie-iproc.c\nindex 37f4adf..cbdabe8 100644\n--- a/drivers/pci/host/pcie-iproc.c\n+++ b/drivers/pci/host/pcie-iproc.c\n@@ -659,7 +659,7 @@ static int iproc_pcie_config_write32(struct pci_bus *bus, unsigned int devfn,\n \t.write = iproc_pcie_config_write32,\n };\n \n-static void iproc_pcie_reset(struct iproc_pcie *pcie)\n+static void iproc_pcie_perst_ctrl(struct iproc_pcie *pcie, bool assert)\n {\n \tu32 val;\n \n@@ -671,19 +671,26 @@ static void iproc_pcie_reset(struct iproc_pcie *pcie)\n \tif (pcie->ep_is_internal)\n \t\treturn;\n \n-\t/*\n-\t * Select perst_b signal as reset source. Put the device into reset,\n-\t * and then bring it out of reset\n-\t */\n-\tval = iproc_pcie_read_reg(pcie, IPROC_PCIE_CLK_CTRL);\n-\tval &= ~EP_PERST_SOURCE_SELECT & ~EP_MODE_SURVIVE_PERST &\n-\t\t~RC_PCIE_RST_OUTPUT;\n-\tiproc_pcie_write_reg(pcie, IPROC_PCIE_CLK_CTRL, val);\n-\tudelay(250);\n-\n-\tval |= RC_PCIE_RST_OUTPUT;\n-\tiproc_pcie_write_reg(pcie, IPROC_PCIE_CLK_CTRL, val);\n-\tmsleep(100);\n+\tif (assert) {\n+\t\tval = iproc_pcie_read_reg(pcie, IPROC_PCIE_CLK_CTRL);\n+\t\tval &= ~EP_PERST_SOURCE_SELECT & ~EP_MODE_SURVIVE_PERST &\n+\t\t\t~RC_PCIE_RST_OUTPUT;\n+\t\tiproc_pcie_write_reg(pcie, IPROC_PCIE_CLK_CTRL, val);\n+\t\tudelay(250);\n+\t} else {\n+\t\tval = iproc_pcie_read_reg(pcie, IPROC_PCIE_CLK_CTRL);\n+\t\tval |= RC_PCIE_RST_OUTPUT;\n+\t\tiproc_pcie_write_reg(pcie, IPROC_PCIE_CLK_CTRL, val);\n+\t\tmsleep(100);\n+\t}\n+}\n+\n+int iproc_pcie_shutdown(struct iproc_pcie *pcie)\n+{\n+\tiproc_pcie_perst_ctrl(pcie, true);\n+\tmsleep(500);\n+\n+\treturn 0;\n }\n \n static int iproc_pcie_check_link(struct iproc_pcie *pcie)\n@@ -1365,7 +1372,8 @@ int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)\n \t\tgoto err_exit_phy;\n \t}\n \n-\tiproc_pcie_reset(pcie);\n+\tiproc_pcie_perst_ctrl(pcie, true);\n+\tiproc_pcie_perst_ctrl(pcie, false);\n \n \tif (pcie->need_ob_cfg) {\n \t\tret = iproc_pcie_map_ranges(pcie, res);\ndiff --git a/drivers/pci/host/pcie-iproc.h b/drivers/pci/host/pcie-iproc.h\nindex 0bbe2ea..a6b55ce 100644\n--- a/drivers/pci/host/pcie-iproc.h\n+++ b/drivers/pci/host/pcie-iproc.h\n@@ -110,6 +110,7 @@ struct iproc_pcie {\n \n int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res);\n int iproc_pcie_remove(struct iproc_pcie *pcie);\n+int iproc_pcie_shutdown(struct iproc_pcie *pcie);\n \n #ifdef CONFIG_PCIE_IPROC_MSI\n int iproc_msi_init(struct iproc_pcie *pcie, struct device_node *node);\n","prefixes":["v8","3/3"]}