From patchwork Thu Dec 10 00:02:54 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Scott Wood X-Patchwork-Id: 554913 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 [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 309FA140DAA for ; Thu, 10 Dec 2015 11:04:12 +1100 (AEDT) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 15FEB1A065B for ; Thu, 10 Dec 2015 11:04:12 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from na01-by2-obe.outbound.protection.outlook.com (mail-by2on0114.outbound.protection.outlook.com [207.46.100.114]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 1D5F31A05C8 for ; Thu, 10 Dec 2015 11:03:14 +1100 (AEDT) Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=scottwood@freescale.com; Received: from snotra.am.freescale.net (192.88.168.50) by BY1PR03MB1482.namprd03.prod.outlook.com (10.162.210.140) with Microsoft SMTP Server (TLS) id 15.1.337.19; Thu, 10 Dec 2015 00:03:07 +0000 From: Scott Wood To: , Subject: [PATCH v2] EDAC, mpc85xx: Make mpc85xx-pci-edac a platform device Date: Wed, 9 Dec 2015 18:02:54 -0600 Message-ID: <1449705774-12811-1-git-send-email-scottwood@freescale.com> X-Mailer: git-send-email 2.5.0 MIME-Version: 1.0 X-Originating-IP: [192.88.168.50] X-ClientProxiedBy: BY2PR1001CA0035.namprd10.prod.outlook.com (25.164.163.173) To BY1PR03MB1482.namprd03.prod.outlook.com (25.162.210.140) X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1482; 2:kJVoR/7+UIhB/L5JAvQy5y8h61X1yOCjOy8zIsGjPiE/D0wCcdGE+KVlff6UVCgi8No3izoofR2m/OlwEUsQgg+eyGQPVLZYWvA2U4clTAB2jxct6k0sIAQsN0rQIckKqjy9P0wpK6a96r6tQbZuIA==; 3:K36cDPcJFSzCev05LOs7McWX7eU/pYRxMDuxkzU24HkHYWOMYNymDG9EyQbmJpCq1O0zivkQdDbSAlSkQ13AzdEgSVU03zRmKfiUYs9g2BOkHBKVcTVIU7kUAEXm/Xso; 25:9BPWFR8kDVzOiP/CvovPK7woJQesodfV2MtFGOuWwVgy9Eax5jZyu5Tp6RSMzh8bdvNwEGNluuWLstlcJ6I91BY0ROMOw9b/vYLVEvqKdUU6nBfDlTsGZbKF5D19ep12fnNN3kTsdoKymPPq/o73jmcbsDDLt/WumlLdgvVLBSY7OiPuSRiGzo3wMov43LF83+AvEThko7vCnl7MZBeaLDEtPR+kSeyU5rNhLpv3C6z3asUzfzqi6XoLY25LuKLW X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY1PR03MB1482; X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1482; 20:JaX2rmNEvauMUvLnZVMmLOSPNWGRlJEh8CbFFuw8BhVIZIjn8OhxGbCbLpUCh4IlQ7Tzweh5osui7psN3UazljWYyU7PguLw6t6MPHMx0hIg1uAY+7AUrpLpRDYvaam3AYpaRs3ug6pM+j6UfeMKLCNeRFE1P3uAOSNQmkaxiC5TdjKGGS34gQGQFkLMKvapO/wvngibodjRaa8hlr/F24OCuxfOsWZVs7BB5u+VvylFR84dNBkflHFK4ZxG4UC8pmrnkakubeBzP8l1EvjmMfHCUBCq+fV+RzVLJq4muq5c7Y0ylryBY2Kd4vmKeSaec9cOhqnBvSazRA8U4/ow88dGguzuGgMkuIaYvhdL4tGzsN8L8Mbn1aLe7u6qUEpxGoSNTaS2Obz8v8hQ4UeWgdidPchxzTqk1/kCmPhvzu4qRBJ/x2GzAIWgJpSdmMt4FB967Ua9Q4q4XO2xqYBATMNSQ9w21v9EzAnmZfJtDjHMtqZxczaSqlR2YDDF3YgrPqY8tBO6a7owSr4jTcvsVty6uX/Dwu8sOMbwktcfRR7IRNlxKhYAxaK5i0Tw2r6sC9Iii7iqew8lmx3NbHTsYWjiAE4OaD9xBRw53RoStNk= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(5005006)(520078)(10201501046)(3002001); SRVR:BY1PR03MB1482; BCL:0; PCL:0; RULEID:; SRVR:BY1PR03MB1482; X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1482; 4:ajlyMqTBJUx1Dgpjgrmvgj6XGhGjtf9yhPKcexyA5qOEjDm5cRa2IZYxBNdcHwB7N9RWR/Wz3/tquR54ZRR3VEvQJf8MlVnjn3ISRzxJqin9TuDzJQCzhZAODn7sTVcCR3DZAYUGd8ABf3aiI+75Z3Mr26wkt3fFGUrUKK4O30nyOOW9CGElONpNoRRMeJ7XxJZdscCcMOLeBsE5rN+yLmi25fJ3j7pubtxDKGvGrTdQhvkw4P4bCo6NqHEnTOnExXPS4IiosQ0HT9nO6BRFx+sPK9xmZLLhA2eQHLEI0F/PQ3R8URZ2LJzO8Ng6fETuOQwMvj5dBanqQJJz6E0y9B6bJfe4l1Ms8/jYfB17G49vRJnquow+fCgeMGpG7SYvjiWZc/LvNDsAz9fgSVmbYCYSApecaKBJQ2ccxgjs7KY= X-Forefront-PRVS: 078693968A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6009001)(199003)(189002)(5001770100001)(5001960100002)(229853001)(86362001)(36756003)(106356001)(189998001)(50226001)(33646002)(87976001)(101416001)(230783001)(48376002)(97736004)(66066001)(47776003)(42186005)(105586002)(77096005)(92566002)(40100003)(5008740100001)(50466002)(19580405001)(5003940100001)(81156007)(1096002)(50986999)(122386002)(6116002)(5004730100002)(586003)(19580395003)(3846002)(2101003); DIR:OUT; SFP:1102; SCL:1; SRVR:BY1PR03MB1482; 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; BY1PR03MB1482; 23:DfxqVb72J1GtrND4UsNngeE5cpOVXCBvAabCCPpw8?= =?us-ascii?Q?ifCo9FEFkxCf3LLJrHFfXRBZybHbMCR6i7TmDdOhD6AizG9r38ktwN0tovEB?= =?us-ascii?Q?/RygeKdbqOd4Tx4uomjsS8J/fvYpYAZ+9afTnbhNQpzfWkYlCsGK4ZDW2RCx?= =?us-ascii?Q?5fMcGH4ItWzWFyISz1Zbs9ODmgYIQQu3qBGfTc+zlbCpbPvFcuV+t357sjXQ?= =?us-ascii?Q?tqACmuCRODIPrzUQ/EiAyAGsDq1LWcoOww8QOL9EOE63Xx+ouJ7bpyFBlDaF?= =?us-ascii?Q?iOy4MY91CgxZyEV7LD/K9kIQ0eMYHtKOoB8vtWhSGf1xBdx6XNMKiNsh2hXl?= =?us-ascii?Q?StVcGFtEnNcizSyllhhpUsK4yTnsu0evDdAuOtwCfDiQkFBBxnNF6ZMFVmDv?= =?us-ascii?Q?oz3WVfAFgGFNh0fXd7U9z8rDvIlb+Nz1y+TD1Cib2qqBpbnaE7S7wsSi8IpY?= =?us-ascii?Q?TOibrLg0aU3dSo6GK3iDve1XVNdB/3TKzjDVUNk0j3PjnBC12lAJcVoyDXsQ?= =?us-ascii?Q?sjypoNyVfc/WqWwUMRSToJ0YpaMEmI+BBztw1WGX9yWqlXJDKdWXxMRH+2Wz?= =?us-ascii?Q?Z9eiMZ64KChT4xryAlLmbusF+XX2iP6cD1obLYjkaT2NQYusoDWviyBVA6u4?= =?us-ascii?Q?ilSBuAyHVMnsz89EwScNcg9XKGYEmpBgl88gwxR0UneABbC3LFPSQJs8GK1f?= =?us-ascii?Q?aX3PdOLqvdFn8zFQFA09iDdrcuxF9Qb/7QtG2zIOJ5SkrUVyGaboAeH+Qg+1?= =?us-ascii?Q?SHAIwpQR9z9ajDNL7ShcPk3ElfpBsZgJJV/pd3zuqG6Xm1ynyix3O9j1yBJt?= =?us-ascii?Q?VCBj46UvlgBVcXallHlH4TnGPRoi7AiuxaSSgIes+YAxffDLSqA+0FRrcW1i?= =?us-ascii?Q?fO/vLdc5izOcBSnOjA2JFaONIFXPNw7qJef5oZwYP0rrP4xRjPVyjEamaxek?= =?us-ascii?Q?bCO2chXteH8OHWHbLV9hFOVWvxZ0smzJA97EIOCqBfesxTgz4zj28AbmVgdE?= =?us-ascii?Q?XDK8EZcAb3qFMpYq31zJwUqO66vYG6Hk24uBuXwQRtyyA=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1482; 5:le3uLlLryAPMa8Gwv9b30jebgTlDtletx6gfDb6j221zmG4DQM1CDCeXY6HUFYATceqBDZTCJ+HAjJ02Vng3fyheUDkXOz7ysde6fx9zAvMyuSYFrG2sKzYTX9bghhf80VQ8qIlFMdoPzXzsNxv0gA==; 24:KrVoNLiw1+U3d5issKQQWiKQXlgr17tGswUTIIAB8BnWIu/J99K8rVxl3RIRpowwOxzaqv7Z2/KWi5Wkmti5/61ehWPQATzazRpSslUrsqk= X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Dec 2015 00:03:07.5352 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR03MB1482 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 , Borislav Petkov , Johannes Thumshirn , Jia Hongtao Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Originally the mpc85xx-pci-edac driver bound directly to the PCI controller node. Commit 905e75c46dba5f30 ("powerpc/fsl-pci: Unify pci/pcie initialization code") turned the PCI controller code into a platform device. Since we can't have two drivers binding to the same device, the edac code was changed to be called into as a library-style submodule. However, this doesn't work if the edac driver is built as a module. Commit 8d8fcba6d1eab ("EDAC: Rip out the edac_subsys reference counting") exposed another problem with this approach -- mpc85xx_pci_err_probe() was being called in the same early boot phase that the PCI controller is initialized, rather than in the device_initcall phase that the EDAC layer expects. This caused a crash on boot. To fix this, the PCI controller code now creates a child platform device specifically for EDAC, which the mpc85xx-pci-edac driver binds to. Signed-off-by: Scott Wood Cc: Jia Hongtao Cc: Borislav Petkov Cc: Johannes Thumshirn Cc: Michael Ellerman Reviewed-by: Johannes Thumshirn --- v2: Make mpc85xx_pci_err_probe() static again. arch/powerpc/sysdev/fsl_pci.c | 28 +++++++++++++++++++++++++++- arch/powerpc/sysdev/fsl_pci.h | 9 --------- drivers/edac/mpc85xx_edac.c | 36 +++++++++++++++++++++++++++++++----- include/linux/fsl/edac.h | 8 ++++++++ 4 files changed, 66 insertions(+), 15 deletions(-) create mode 100644 include/linux/fsl/edac.h diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index 610f472..a1ac80b 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c @@ -21,10 +21,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -1255,6 +1257,25 @@ void fsl_pcibios_fixup_phb(struct pci_controller *phb) #endif } +static int add_err_dev(struct platform_device *pdev) +{ + struct platform_device *errdev; + struct mpc85xx_edac_pci_plat_data pd = { + .of_node = pdev->dev.of_node + }; + + errdev = platform_device_register_resndata(&pdev->dev, + "mpc85xx-pci-edac", + PLATFORM_DEVID_AUTO, + pdev->resource, + pdev->num_resources, + &pd, sizeof(pd)); + if (IS_ERR(errdev)) + return PTR_ERR(errdev); + + return 0; +} + static int fsl_pci_probe(struct platform_device *pdev) { struct device_node *node; @@ -1262,8 +1283,13 @@ static int fsl_pci_probe(struct platform_device *pdev) node = pdev->dev.of_node; ret = fsl_add_bridge(pdev, fsl_pci_primary == node); + if (ret) + return ret; - mpc85xx_pci_err_probe(pdev); + ret = add_err_dev(pdev); + if (ret) + dev_err(&pdev->dev, "couldn't register error device: %d\n", + ret); return 0; } diff --git a/arch/powerpc/sysdev/fsl_pci.h b/arch/powerpc/sysdev/fsl_pci.h index c1cec77..1515885 100644 --- a/arch/powerpc/sysdev/fsl_pci.h +++ b/arch/powerpc/sysdev/fsl_pci.h @@ -130,15 +130,6 @@ void fsl_pci_assign_primary(void); static inline void fsl_pci_assign_primary(void) {} #endif -#ifdef CONFIG_EDAC_MPC85XX -int mpc85xx_pci_err_probe(struct platform_device *op); -#else -static inline int mpc85xx_pci_err_probe(struct platform_device *op) -{ - return -ENOTSUPP; -} -#endif - #ifdef CONFIG_FSL_PCI extern int fsl_pci_mcheck_exception(struct pt_regs *); #else diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c index 3eab063..406d75a 100644 --- a/drivers/edac/mpc85xx_edac.c +++ b/drivers/edac/mpc85xx_edac.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -238,10 +239,12 @@ static irqreturn_t mpc85xx_pci_isr(int irq, void *dev_id) return IRQ_HANDLED; } -int mpc85xx_pci_err_probe(struct platform_device *op) +static int mpc85xx_pci_err_probe(struct platform_device *op) { struct edac_pci_ctl_info *pci; struct mpc85xx_pci_pdata *pdata; + struct mpc85xx_edac_pci_plat_data *plat_data; + struct device_node *of_node; struct resource r; int res = 0; @@ -266,7 +269,15 @@ int mpc85xx_pci_err_probe(struct platform_device *op) pdata->name = "mpc85xx_pci_err"; pdata->irq = NO_IRQ; - if (mpc85xx_pcie_find_capability(op->dev.of_node) > 0) + plat_data = op->dev.platform_data; + if (!plat_data) { + dev_err(&op->dev, "no platform data"); + res = -ENXIO; + goto err; + } + of_node = plat_data->of_node; + + if (mpc85xx_pcie_find_capability(of_node) > 0) pdata->is_pcie = true; dev_set_drvdata(&op->dev, pci); @@ -284,7 +295,7 @@ int mpc85xx_pci_err_probe(struct platform_device *op) pdata->edac_idx = edac_pci_idx++; - res = of_address_to_resource(op->dev.of_node, 0, &r); + res = of_address_to_resource(of_node, 0, &r); if (res) { printk(KERN_ERR "%s: Unable to get resource for " "PCI err regs\n", __func__); @@ -339,7 +350,7 @@ int mpc85xx_pci_err_probe(struct platform_device *op) } if (edac_op_state == EDAC_OPSTATE_INT) { - pdata->irq = irq_of_parse_and_map(op->dev.of_node, 0); + pdata->irq = irq_of_parse_and_map(of_node, 0); res = devm_request_irq(&op->dev, pdata->irq, mpc85xx_pci_isr, IRQF_SHARED, @@ -386,8 +397,22 @@ err: devres_release_group(&op->dev, mpc85xx_pci_err_probe); return res; } -EXPORT_SYMBOL(mpc85xx_pci_err_probe); +static const struct platform_device_id mpc85xx_pci_err_match[] = { + { + .name = "mpc85xx-pci-edac" + }, + {} +}; + +static struct platform_driver mpc85xx_pci_err_driver = { + .probe = mpc85xx_pci_err_probe, + .id_table = mpc85xx_pci_err_match, + .driver = { + .name = "mpc85xx_pci_err", + .suppress_bind_attrs = true, + }, +}; #endif /* CONFIG_PCI */ /**************************** L2 Err device ***************************/ @@ -1211,6 +1236,7 @@ static void __init mpc85xx_mc_clear_rfxe(void *data) static struct platform_driver * const drivers[] = { &mpc85xx_mc_err_driver, &mpc85xx_l2_err_driver, + &mpc85xx_pci_err_driver, }; static int __init mpc85xx_mc_init(void) diff --git a/include/linux/fsl/edac.h b/include/linux/fsl/edac.h new file mode 100644 index 0000000..90d64d4 --- /dev/null +++ b/include/linux/fsl/edac.h @@ -0,0 +1,8 @@ +#ifndef FSL_EDAC_H +#define FSL_EDAC_H + +struct mpc85xx_edac_pci_plat_data { + struct device_node *of_node; +}; + +#endif