From patchwork Wed Oct 7 03:48:08 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Scott Wood X-Patchwork-Id: 527095 X-Patchwork-Delegate: scottwood@freescale.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 24E5C140D88 for ; Wed, 7 Oct 2015 14:54:28 +1100 (AEDT) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 0A0271A05EB for ; Wed, 7 Oct 2015 14:54:28 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from na01-bn1-obe.outbound.protection.outlook.com (mail-bn1on0130.outbound.protection.outlook.com [157.56.110.130]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4BFDD1A0026 for ; Wed, 7 Oct 2015 14:48:40 +1100 (AEDT) Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=scottwood@freescale.com; Received: from snotra.am.freescale.net (192.88.168.49) by BY1PR03MB1483.namprd03.prod.outlook.com (10.162.210.141) with Microsoft SMTP Server (TLS) id 15.1.286.20; Wed, 7 Oct 2015 03:48:34 +0000 From: Scott Wood To: Subject: [PATCH v2 04/18] powerpc/fsl_pci: Don't set up inbound windows in kdump crash kernel Date: Tue, 6 Oct 2015 22:48:08 -0500 Message-ID: <1444189702-17241-5-git-send-email-scottwood@freescale.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1444189702-17241-1-git-send-email-scottwood@freescale.com> References: <1444189702-17241-1-git-send-email-scottwood@freescale.com> MIME-Version: 1.0 X-Originating-IP: [192.88.168.49] X-ClientProxiedBy: BLUPR08CA0034.namprd08.prod.outlook.com (10.141.200.14) To BY1PR03MB1483.namprd03.prod.outlook.com (25.162.210.141) X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1483; 2:/O7ATt4FEAofbzwJeFmRDtQNZFbtrAirkLgSFiFFFpJYiPm4yx8nySECUzvMqK2PHfRO5sUZf5CU4zswJBLl05fY4Mzp6TpbTkSGIE6ixsMBlmrJB53w0gvkvGt7+l2lUvIqPCVCxukHX9kwhML/4jPtr7+dgSEGPFjV3kkmHiE=; 3:ICHVVufWTGUmXaGHT0MDUP9Y4r/xa3x9lEVNWIV7pw8YVOIBTdGkBKk1C0OzBOZCZjawYn8ulklHjj1zVajRt6Qusx3skMr4Sqb/RUifJsBKchpH9PnrrQlaUh5fqWKMDQSeRCRNK5v1k/qUBxzJ4A==; 25:OclR9Ly2hLZt97tYX0Wp8UNp+yxPyk7nmFhRbeJmIdROCjmgHKPWdAGPAFmZ/MLLHNKfJggI5hhaL4676rgZFC/MeTCrlQ+FX35lktIrC1XAk9MLG1T/Y07q0S46VrWboyM6Ck4oN44uCN6LjMC6bF0Oakrpvv0jcRoLUrKkrzEUZUAzvX4nNO/y9LiHaIy8YnD5WODU9xkfvSo+hvFKSMF44yaA4dfyZ0p4x8xUxmUAEYxaZOBsjwTQ1XX4NGCZ X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY1PR03MB1483; X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1483; 20:rtXuYgUhsnaRYwVBG7iRhM5x2zMbapLj76Ne9W5yXJnVKiflQJPJq34+gE+32KuVcBPnVKhxg6a6CQcelpErNaGQWUjW0Z5Z67yP8EoRqSJX3/CIQ4sRFrgxFD3E6LAMl4j/mgmb8xrXlxAVQpnmbb+Bd1J2p9diSA+OtpFysEngX5Z/+WgnR5QtR131nvMF++mYvvHfaI+m1SuZ/iR8C1rHWvNpqG+ffSOoRfeg0ztMmnG+BnPxBwqnIwOFfeGvZzHMu40v08Ef3NEkzGZn8MUG2RKsoTO5jhrmM+JSgHDXp5kLyyFg5eNhDj7rSor+5da8ZIlCMkx5IduQ0gVTd/QeGNXE/Nqify4MxjrVboUmOSljmcaYir3BOpZ/dmBo57fmwj/1NfzH2eqOZmsjCvi80Bblv26AJ6wS39jTKxhXQnWhu3z5N1WHheF7aoBefsZ68ts69DM3nPGHJ8Mwv/SR0x1beu0l0Ww6vH5zhBhG7lO7w5bQuRGrwNe0STij; 4:Ut5lRZ8o/ILztLskuVv9hCwcMD9FcMaGZsxOVFyJ3is959ACxYZxi9650fvud/T8zK6vHaiYAvtJJmYMhsDsPbV16Hang4jPOVLBxsEKM91Sp9Jr+dJSNiDNrZhho7tzvguAGo7TOYidbd4dbKMaq1SLzLIgqGEE2iwTpKBcTmly0U/oFE4DcCcLqYf9zd1M6G64mKjOs1+qB8poBbQTGLq1eUpnaMr0Iy4gPp3l1YrCekA1DW2WjnzCRSQzsT8IjfOgRNefdqseBo5pdVeC7U4Dt4Ep+Y7FByOAlWB+xXinX0dFBGJ5ujaROuty+zLn7zMIQNsEO0lRpFEp7IPL+OBgn1ImB5hfNIzLBjk7Xkw= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(5005006)(520078)(8121501046)(3002001); SRVR:BY1PR03MB1483; BCL:0; PCL:0; RULEID:; SRVR:BY1PR03MB1483; X-Forefront-PRVS: 0722981D2A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6009001)(199003)(189002)(122386002)(19580395003)(5007970100001)(5003940100001)(189998001)(19580405001)(107886002)(105586002)(46102003)(106356001)(50466002)(77096005)(40100003)(2351001)(110136002)(50986999)(64706001)(42186005)(87976001)(86362001)(5004730100002)(47776003)(5001960100002)(76176999)(229853001)(101416001)(50226001)(92566002)(5008740100001)(2950100001)(66066001)(33646002)(36756003)(81156007)(5001920100001)(97736004)(48376002)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:BY1PR03MB1483; H:snotra.am.freescale.net; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: freescale.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY1PR03MB1483; 23:VjRo+SRc7FLBAnLSHCnZ9WRWSJxlNrYnZkZmrr1Xf?= =?us-ascii?Q?1FdD2SqdNESdeaYsiVWMst3SO56KkRsbg9X6W01vKpyucX30viftNb5PQwZw?= =?us-ascii?Q?km0lyATABWTiC91WalO1XH2QQullGSdnyHeMGVtKqgmiYUXYF8Qc700BxcFU?= =?us-ascii?Q?ZSfWDZlK1jg4h8oyjGe7ovLBx+575jbYNIFh8NsuTjh5hDXAkETSNGv7kzkY?= =?us-ascii?Q?Zy7SXuKyZPjFOFYOfPFuTRx6QG0/T1Mt+hiB2i1EG5vRYtSRNY/c36jZt14x?= =?us-ascii?Q?GOxPPUPGU2COQ5/t55PvHekBSK23Xt4vLCD51psL5kovpagVf8cmaxCqm5St?= =?us-ascii?Q?C5ewxYZNGwlyV7lp6Qpyf4BHXHOFaZo3Zu9hJGTNh/1tdFoRFk/MwGXv3p49?= =?us-ascii?Q?GUGsmmx0+n48eiEimk/ThJ4Ez8mWpaUBLdt3SPZQ+71fMWuzDRq8U7USStNx?= =?us-ascii?Q?RLzQeUcT5qQZUeKGaJDEk9cJ9hcjfRNK2yepT9Y85SkaeO9WjlAB1J9Icdyj?= =?us-ascii?Q?uOExnV9eExxwwsO8h7Gvl9Iut24Fjcmq5Renf+n7I0U2WSrp75V2ezxKIRrV?= =?us-ascii?Q?aDsuSlGoBJSOj8OwvcF0p0V7SEnkIrVaALaEO8AXjrY02NOBmSZPfOzlKPSC?= =?us-ascii?Q?igRHKasV+TlsEbrf/gUtItZuVV/tXcc/t0gsvcEpEIFu+bCh5YekjcOFxsMQ?= =?us-ascii?Q?Ub3Mq0DiZUqQOJwGMmlP1XEV7TQ0w8BkUL9UjEHTbYHisnktW5qa4BhWsj5/?= =?us-ascii?Q?LzpGz8jQskreJjYB18iEndzsDc86IdDHFlifBkc4CB+87W1IyXqTbqPwge42?= =?us-ascii?Q?tzKzWWGd04W8k9I2NzovsarBC1Aa5HT13Qoj84HR+/78dzbn0YnHhzGqp/UT?= =?us-ascii?Q?N2nfKH/nhtUS0XX8ef16o5UFjc8xt5kIhrKhgDfCgpyUuBwgvn9CM5CHhVq6?= =?us-ascii?Q?mhNTJAFpK7SDJ/m9AmmSa0MImgg4qm7xZS3xKB9IHvlD+OLh96g8/ccvyPYS?= =?us-ascii?Q?+s0B+jGdogw2cFiVMt+VBYc/wtUTyMYjulBhhmoXGhODlOLahmdkYE1WsYOG?= =?us-ascii?Q?6wjbYvfRWULjV16tX1d5yBEjA7TjqCi0hCSr03MmolmMuQZW9gGj02vByFP5?= =?us-ascii?Q?b/6T8G6cro=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1483; 5:Hl/EbKQ1aZa0T7KcS1xfzoYuR6oCGPMJeKo5JFSKn4lO5gCpfG/xjVH1IpZhFSVk4C6roTXIXDQfrvIeNS4roMW5a35lKQw3Z55qmZtNJXsXzJiJxGvDG9PtLqVcTur+FKUwLmOOpdODsL0f8FTTwA==; 24:8JaBys4AhlbQHLlzXDKzH4RfN969cXiGuHkRTNaF55DMHCwKSoRguY7HrSlap/Ox+lRsYy+dErLfU1sXWkvIyNNMB3iFEokIWLCnRBYVhEg=; 20:lS4oFyBTlLGG2hSBBHZRnx0OBHi2z9uwCHONAXJEA9yNUpRMcFw265qbOi8bALUS0rIG88rM7rLi3ZFBVdZMEw== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Oct 2015 03:48:34.2163 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR03MB1483 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Scott Wood , Tiejun Chen , Mingkai Hu , kexec@lists.infradead.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Otherwise, because the top end of the crash kernel is treated as the absolute top of memory rather than the beginning of a reserved region, in-flight DMA from the previous kernel that targets areas above the crash kernel can trigger a storm of PCI errors. We only do this for kdump, not normal kexec, in case kexec is being used to upgrade to a kernel that wants a different inbound memory map. Signed-off-by: Scott Wood Cc: Mingkai Hu --- v2: new patch arch/powerpc/sysdev/fsl_pci.c | 84 +++++++++++++++++++++++++++++++------------ 1 file changed, 61 insertions(+), 23 deletions(-) diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index ebc1f412..98d671c 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c @@ -179,6 +179,19 @@ static int setup_one_atmu(struct ccsr_pci __iomem *pci, return i; } +static bool is_kdump(void) +{ + struct device_node *node; + + node = of_find_node_by_type(NULL, "memory"); + if (!node) { + WARN_ON_ONCE(1); + return false; + } + + return of_property_read_bool(node, "linux,usable-memory"); +} + /* atmu setup for fsl pci/pcie controller */ static void setup_pci_atmu(struct pci_controller *hose) { @@ -192,6 +205,16 @@ static void setup_pci_atmu(struct pci_controller *hose) const char *name = hose->dn->full_name; const u64 *reg; int len; + bool setup_inbound; + + /* + * If this is kdump, we don't want to trigger a bunch of PCI + * errors by closing the window on in-flight DMA. + * + * We still run most of the function's logic so that things like + * hose->dma_window_size still get set. + */ + setup_inbound = !is_kdump(); if (early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP)) { if (in_be32(&pci->block_rev1) >= PCIE_IP_REV_2_2) { @@ -204,8 +227,11 @@ static void setup_pci_atmu(struct pci_controller *hose) /* Disable all windows (except powar0 since it's ignored) */ for(i = 1; i < 5; i++) out_be32(&pci->pow[i].powar, 0); - for (i = start_idx; i < end_idx; i++) - out_be32(&pci->piw[i].piwar, 0); + + if (setup_inbound) { + for (i = start_idx; i < end_idx; i++) + out_be32(&pci->piw[i].piwar, 0); + } /* Setup outbound MEM window */ for(i = 0, j = 1; i < 3; i++) { @@ -278,6 +304,7 @@ static void setup_pci_atmu(struct pci_controller *hose) /* Setup inbound mem window */ mem = memblock_end_of_DRAM(); + pr_info("%s: end of DRAM %llx\n", __func__, mem); /* * The msi-address-64 property, if it exists, indicates the physical @@ -320,12 +347,14 @@ static void setup_pci_atmu(struct pci_controller *hose) piwar |= ((mem_log - 1) & PIWAR_SZ_MASK); - /* Setup inbound memory window */ - out_be32(&pci->piw[win_idx].pitar, 0x00000000); - out_be32(&pci->piw[win_idx].piwbar, 0x00000000); - out_be32(&pci->piw[win_idx].piwar, piwar); - win_idx--; + if (setup_inbound) { + /* Setup inbound memory window */ + out_be32(&pci->piw[win_idx].pitar, 0x00000000); + out_be32(&pci->piw[win_idx].piwbar, 0x00000000); + out_be32(&pci->piw[win_idx].piwar, piwar); + } + win_idx--; hose->dma_window_base_cur = 0x00000000; hose->dma_window_size = (resource_size_t)sz; @@ -343,13 +372,15 @@ static void setup_pci_atmu(struct pci_controller *hose) piwar = (piwar & ~PIWAR_SZ_MASK) | (mem_log - 1); - /* Setup inbound memory window */ - out_be32(&pci->piw[win_idx].pitar, 0x00000000); - out_be32(&pci->piw[win_idx].piwbear, - pci64_dma_offset >> 44); - out_be32(&pci->piw[win_idx].piwbar, - pci64_dma_offset >> 12); - out_be32(&pci->piw[win_idx].piwar, piwar); + if (setup_inbound) { + /* Setup inbound memory window */ + out_be32(&pci->piw[win_idx].pitar, 0x00000000); + out_be32(&pci->piw[win_idx].piwbear, + pci64_dma_offset >> 44); + out_be32(&pci->piw[win_idx].piwbar, + pci64_dma_offset >> 12); + out_be32(&pci->piw[win_idx].piwar, piwar); + } /* * install our own dma_set_mask handler to fixup dma_ops @@ -362,12 +393,15 @@ static void setup_pci_atmu(struct pci_controller *hose) } else { u64 paddr = 0; - /* Setup inbound memory window */ - out_be32(&pci->piw[win_idx].pitar, paddr >> 12); - out_be32(&pci->piw[win_idx].piwbar, paddr >> 12); - out_be32(&pci->piw[win_idx].piwar, (piwar | (mem_log - 1))); - win_idx--; + if (setup_inbound) { + /* Setup inbound memory window */ + out_be32(&pci->piw[win_idx].pitar, paddr >> 12); + out_be32(&pci->piw[win_idx].piwbar, paddr >> 12); + out_be32(&pci->piw[win_idx].piwar, + (piwar | (mem_log - 1))); + } + win_idx--; paddr += 1ull << mem_log; sz -= 1ull << mem_log; @@ -375,11 +409,15 @@ static void setup_pci_atmu(struct pci_controller *hose) mem_log = ilog2(sz); piwar |= (mem_log - 1); - out_be32(&pci->piw[win_idx].pitar, paddr >> 12); - out_be32(&pci->piw[win_idx].piwbar, paddr >> 12); - out_be32(&pci->piw[win_idx].piwar, piwar); - win_idx--; + if (setup_inbound) { + out_be32(&pci->piw[win_idx].pitar, + paddr >> 12); + out_be32(&pci->piw[win_idx].piwbar, + paddr >> 12); + out_be32(&pci->piw[win_idx].piwar, piwar); + } + win_idx--; paddr += 1ull << mem_log; }