From patchwork Thu Dec 10 19:07:12 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Scott Wood X-Patchwork-Id: 555297 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 068CE140134 for ; Fri, 11 Dec 2015 06:08:31 +1100 (AEDT) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id E0C931A1140 for ; Fri, 11 Dec 2015 06:08:30 +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-bn1on0118.outbound.protection.outlook.com [157.56.110.118]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3AB721A087B for ; Fri, 11 Dec 2015 06:07:30 +1100 (AEDT) Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=scottwood@freescale.com; Received: from snotra.buserror.net (50.157.106.250) by CY1PR03MB1487.namprd03.prod.outlook.com (10.163.17.17) with Microsoft SMTP Server (TLS) id 15.1.337.19; Thu, 10 Dec 2015 19:07:22 +0000 From: Scott Wood To: , Subject: [PATCH v3] EDAC, mpc85xx: Make mpc85xx-pci-edac a platform device Date: Thu, 10 Dec 2015 13:07:12 -0600 Message-ID: <1449774432-18593-1-git-send-email-scottwood@freescale.com> X-Mailer: git-send-email 2.5.0 MIME-Version: 1.0 X-Originating-IP: [50.157.106.250] X-ClientProxiedBy: BN3PR0401CA0008.namprd04.prod.outlook.com (25.162.159.146) To CY1PR03MB1487.namprd03.prod.outlook.com (25.163.17.17) X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB1487; 2:YBzVqVzO1M41MM+Krvr83a10YpJJRc/El0oppTkLdCflcmZtUVCHL1QE+8bOx01X9ZM/dlXKeQjIRNLs9L7Z6hBAPuyHzI5jkai7BLqo0IZDZjANxZEfQuJMPcgkGyGGqxNSAdM5otTDyD5MXHJfHA==; 3:mDCrSdH6P2g/TBTG0PInM8yBRwkXVyIujD3GyHL3p113CBko/Sd1XO7cr4SWAgA0NQrq08EeBLDUKG3ulnddnjTM2/eCjFSwFatphu9boNVjuudyZCJ9NblVwvCWYO0m; 25:OxYB6uW25ele5kX0DJjyaIvdsxymgUMQaoU9Rcg4ysM6ESd7oSo/LFNabdT7XnZdssQv3sbiai6juJtzP//Biy/3ZpSF5MwzU9d2QLDxc5j4ijAOaC/886Vb/BQSqgZ2G/VJY/ywtWgULiLXNCQcNxobqNthk70Je35hIOa9cQlsSgFXiIzO82Rtnk+ELx32Z+t5rSdxZaMxfTbHSifhuPcW0JN47EoYg7fnvx40Ew8t26L2v3G3I/COY7GBrzhP X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR03MB1487; X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB1487; 20:BvGryQxv544224LhURs//CGDz8vyjCeaxcXCzZ9jOA3S88TT0FGe8nsrOJGwHKRBmQkzPM92L6x1S0GQ6UuLO4ejzy21ZHtcVafJhmQhiVbOSq+zJH3MIoJAiiCRygmX725wNKnVeIyATUoOAtjeTeob8Ds3xu81OwBtKgeiKf/UukDz2trQymtu3Amz2huKFdwxOe8q0VwEiG0qvvb+VMCtvVXG8LPyOLnWGCeVU0mopyMBq6UKFdtAMMWoCaUb/GiolAO87CbghSf4K85gNpQh+Ba+oEYat/WtCq+YLqa1yKgcMJxoBIaok1VpLEmRJ7QW0A+oK3A8nd1UNx5ihf6OPVRyAmPSicqr2j00oHYWWflEyrsQSJE+tiHWYz+uv2mL9AGdERUbz4Dy+4MKUJQ4qxaJYRMmvPz8Q8hKD2oJCKsLHKGnvs2jGZknzNZNFlTzntZNhtB2JgtJlaupR1kqNpk5glWmMo+KrspFfujH3S5m09rkbnHZRhQ79ZWV; 4:m7B5erg1eINiRmK7pO5D2+52tHkH2KcDEzhPTJkih1EcBnBLrLvj1nz65s43XMsa+pTVE11lv3uHRqa+//6mFuS/s6/8kx9p510NurasLhAfFT0XhPWyMOIN8q2JgQ4kbNQG9rQCzkxjnaywFGyNRiEsJg/P+PLCs+VLGYF+7TMw+eO/8XcQyNhG4YLv33cYyTvSnFNEpSLRIfoEtz/RvsefCHY5UJuoS07KCu5hT9G98Wg5v4QRX3zehaVgbPdY+yit7RvebLoo3GJXSrKqStU8d6cEZvdIM9/HHJwZ5yc0SblYB+ZYA8G8gNCS9z0lgN8/tURp7Wb14hw1e4r7tO8UDb07cJOm5H9PJ+/85tsfgjy+fc9HhbL1QBj0by03w6vN/IwzvSgoloOQnuM5l1IG+nQgdBylDXr23GRMDmc= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(5005006)(520078)(8121501046)(3002001)(10201501046); SRVR:CY1PR03MB1487; BCL:0; PCL:0; RULEID:; SRVR:CY1PR03MB1487; X-Forefront-PRVS: 078693968A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6009001)(199003)(189002)(50466002)(5004730100002)(5003940100001)(19580395003)(81156007)(229853001)(33646002)(105586002)(106356001)(53416004)(50986999)(87976001)(47776003)(5008740100001)(19580405001)(66066001)(36756003)(69596002)(230783001)(77096005)(86362001)(97736004)(50226001)(101416001)(189998001)(586003)(5001960100002)(122386002)(1096002)(92566002)(3846002)(48376002)(40100003)(5001770100001)(42186005)(6116002)(2101003); DIR:OUT; SFP:1102; SCL:1; SRVR:CY1PR03MB1487; H:snotra.buserror.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; CY1PR03MB1487; 23:BndfddnjhNLD1eVLaYJ5re7qI/IdTXlN/rQtkJIir?= =?us-ascii?Q?AcwB8FQegSyB6zV6zGxQSbbdbIeGdT4MoneBs97ZeWOKNWtSXvXXOYB/1RjE?= =?us-ascii?Q?QLZ50I+cUlY05kw+z25xREa8BzrwDRg+EniyDEsE0BcpQhIJXknPmfmTHv4/?= =?us-ascii?Q?4zzDlLykIKF5xvHgrkEN0HDKnJO7pMEpXdrkRXq4I4PTt1b74lKs19gZ6qZC?= =?us-ascii?Q?ejidz3pXjegqU9o+oXom30/V5bAz+X+0sfANTa5Zd2Q3FeIM+bODQaWK+nWV?= =?us-ascii?Q?XfsAkqmeTXElbpoDVX7Rx29UhIfgCMM9xMsN0XgKOc5rYhZbKY7uX0+Ad9fL?= =?us-ascii?Q?huSNSmYFvMtkW7FfT0hv9bRk1RCqmyDKUduRHldZ1jjRowYbkoC1xY7KmGbs?= =?us-ascii?Q?fcqC1UG5YEDx+lwe7/sEY0Q5toYZucvQE6/Dr166h7q+OJywtM52Ux4R5WWs?= =?us-ascii?Q?2jUOrv42txFM4+I4zxxZB3fTNhtk0NFPMsPeCH0lZb9gF/TNMS4JKAf9Lr5N?= =?us-ascii?Q?nfHs9/7a4+syj/ReSX4VjS/CqiN0Vy1rTvAJiZVEmP2JHEcu+ZBRpl7sClHg?= =?us-ascii?Q?GW2vUTaAdj8dqibBa0oHLLjOFNF1fR4G0l5Ta15Zbfty1SAyMJjbaeVTX9l3?= =?us-ascii?Q?NXvjuV3VzM6aTXNIeWKu2guAtLtGVzO/6Ju8F6eGH2beeAM4nHnm/QTLgRvq?= =?us-ascii?Q?Trz56UkHdd7ogt5zwonZmzvVBapAwgj6hyT3TB+cQLaWGWwI4Un7r8E23OkF?= =?us-ascii?Q?LRGQ0QjVyWumUFbhqFY8O6olMh0Itps/+8mqI9tqJzscZ+5Zy0FqIQ99z7A0?= =?us-ascii?Q?HysxAKmYjszCPlvlb1llaX41Rn+tDEHV3H27nPBcA2SS0s3V545FZlvgyS4R?= =?us-ascii?Q?1q66q/sADx4tq4b4ya1KC97xKX+Ark47QhDZFin8oTcNbk+oUdsrSxYwbro8?= =?us-ascii?Q?Elku3KiXJa79YPhJhp1ZvePAQUGDVr1J/T5elOb0VLaPcjXQO/zDQUUdpGZX?= =?us-ascii?Q?ZMpAL0z133GONPoB5gveZovWdWNdehoygVDxOLnwku5WKLJA445B+qRFqkVc?= =?us-ascii?Q?zqGuF25uDW1JTCp1UyOfkhJ8TUd?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB1487; 5:eqEknh0QPDg4vyiWzKXKed7QNFloTH49+zCAA/DJ7q29mZZ1ft2wIESIBY9+rL/V6MGrPra11oXl6kwVczJckLc6qf8IZtA6z0aZvXkBXovpm4nAW6LZ9G3BLgHRG79+18yNh8cO/mHdg9k8Tw4ijw==; 24:ery3q8xx5TWEwicGjEm/kI2T3FC2u0Y7pI4pi+Hg2LZq2v9QXTlb/I+3sBZvEpcr7XWRq2gv6uls0WbiUm1FKOBq6TyS9pFc2TXD4/as37g= X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Dec 2015 19:07:22.6852 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR03MB1487 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 --- v3: Fix build with CONFIG_PCI disabled arch/powerpc/sysdev/fsl_pci.c | 28 +++++++++++++++++++++++++++- arch/powerpc/sysdev/fsl_pci.h | 9 --------- drivers/edac/mpc85xx_edac.c | 38 +++++++++++++++++++++++++++++++++----- include/linux/fsl/edac.h | 8 ++++++++ 4 files changed, 68 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..b7139c1 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,9 @@ static void __init mpc85xx_mc_clear_rfxe(void *data) static struct platform_driver * const drivers[] = { &mpc85xx_mc_err_driver, &mpc85xx_l2_err_driver, +#ifdef CONFIG_PCI + &mpc85xx_pci_err_driver, +#endif }; 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