From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755656AbcEYQ1Z (ORCPT ); Wed, 25 May 2016 12:27:25 -0400 Received: from mail-bl2on0058.outbound.protection.outlook.com ([65.55.169.58]:36992 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752375AbcEYQ1U (ORCPT ); Wed, 25 May 2016 12:27:20 -0400 Authentication-Results: spf=fail (sender IP is 66.35.236.227) smtp.mailfrom=opensource.altera.com; vger.kernel.org; dkim=pass (signature was verified) header.d=altera.onmicrosoft.com;vger.kernel.org; dmarc=none action=none header.from=opensource.altera.com; Authentication-Results: alien8.de; dkim=none (message not signed) header.d=none;alien8.de; dmarc=none action=none header.from=opensource.altera.com; From: To: , , , , , , , , , , CC: , , , , , , Subject: [PATCH 2/5] EDAC, altera: ECC Manager IRQ controller support Date: Wed, 25 May 2016 11:29:40 -0500 Message-ID: <1464193783-5071-3-git-send-email-tthayer@opensource.altera.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1464193783-5071-1-git-send-email-tthayer@opensource.altera.com> References: <1464193783-5071-1-git-send-email-tthayer@opensource.altera.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [64.129.157.38] X-ClientProxiedBy: BY2PR1001CA0055.namprd10.prod.outlook.com (10.164.163.23) To BN3PR03MB1480.namprd03.prod.outlook.com (10.163.35.143) X-MS-Office365-Filtering-Correlation-Id: 7d6355b7-f061-40f4-b1ee-08d384b96f25 X-Microsoft-Exchange-Diagnostics-untrusted: 1;BN3PR03MB1480;2:QGXnIQsqfxj9wmoQ/QHvgVpkbelAa5wh9G3B9aHrcuCfaFv3FlTiNDd2AglWDkmYNHXCcAIiEFXdSm9DOZIvQk/fJyfsgZp7fESfLjcLDYhZ6X9l5s5xMtPC+YccnnlnXpaLoXVSuAp99Lc80+EMtUUzepqVdxPMEY2DaENRlzdQ48GeXrUHV9lw8YnDAj4R;3:RJ391xbMpicI7C+j8QW5vAOPPRzcpUT8nnOrSsr5CpXR+8z5dpxOpGtfKRLW7od6M1xuU+hG2L8Rclrud30u0k+5ebPXkUz3jIFFOaMiPLOKri00+OuID0eeg4L5YKLS;25:zp0wCSMO0pNAQ88jpPsaXH8/QnwFdVZ6kAxZqESYhyFSDCzJ+bNTgYFl2xjN0JQyUJlvij7CuEJQ0esR+cnGZP8p8oQ8ZydC6Tl+RJUM+ux8upmvdfdxpl5olXgC4QWdr19ymeD30r1d4+c+/u9pYYU/83o2CNRlsmJNVZUlqw3G99yrqWZjhJtjSi1+PqUYz8sJyOsjc6oLPS8v7BydBjottUAQbrQLGDUohJDFFK3oQ5PQIXkN53n/LcSQUVbWIsSV0Zgy2OiUQl5ga3iwurQYfGCop8ysl46LaJiQabTXDUVEDfBekWyGmGfkxxp70S8uYP+ijBIWK8T+xrsl6Yex8b0UgLUG4m3H8t5/wYloHRFloWoBj7oSgRf9CPy3VTbJilyfBTQHHS3bcdE/gx2FYEF7eF2jC4Yns+m8Frc=;20:xlWf7Kg8Uw4VAF21VXvTXxY3OVHglTDKmMJa/OZP4+XgoB5JujJKTHxMBk2RRrvpp3rzq/k6cpTlL4BC3AqJhV0H7dmzTTnO38hPYqjFsRUWycB9wlOmfVDMib4Q8/fD+q8KXwCc55i+YOPAwCPGnbVZ+yzBpMtJdfY/4jJXaW8= X-Microsoft-Antispam-Untrusted: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN3PR03MB1480; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:;UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6055026);SRVR:BN3PR03MB1480;BCL:0;PCL:0;RULEID:;SRVR:BN3PR03MB1480;BCL:0;PCL:0;RULEID:(601004)(2401047)(13023025)(13015025)(13018025)(13024025)(8121501046)(5005006)(13017025)(3002001)(10201501046)(6055026);SRVR:BL2PR03MB515;BCL:0;PCL:0;RULEID:;SRVR:BL2PR03MB515; X-Microsoft-Exchange-Diagnostics-untrusted: 1;BN3PR03MB1480;4:UV++ClxiB3c2TN5hkiXwKZ2lC8FzzSAtzjPGEikXxyuyXFnZKUo6WpRisjqaABqZIuz2VoBtj1u9tG6aujGlWaQ5Lz0ZUQpbtCiYl42NKcD8KsQftCJ8Afob5qTDxVS/1HXi4noHIgSAx/4SuDSnqVvGvNbsNmNJ0Fcv7QDziRIHabWA363sj2q50y3/kRAONVGR84/pY8DVa6MX19xWxXUWCo/lFVYpZGYyaGlxsrToVhbNQBPDwmvzs25/gAEchJF/qqazFuB5hn3J5YIKWd0rkVnTpKlOFFMkNumbz7LvcRcDHTQvYk1kFKotuTTWWa6hMD/sI5qwhgWs+Kqh/ZiuQWMTq15b7APgWkNLE1NCf0UF2+i2ul1WqxayMgG8Ysiwq/W4ZXIi0rcYEDCaVw== X-Forefront-PRVS: 09538D3531 X-Forefront-Antispam-Report-Untrusted: SFV:NSPM;SFS:(10009020)(4630300001)(6049001)(6009001)(5001770100001)(76176999)(48376002)(92566002)(50986999)(50466002)(5004730100002)(6116002)(575784001)(19580395003)(3846002)(2201001)(586003)(86362001)(86152002)(107886002)(77096005)(229853001)(42186005)(189998001)(2950100001)(33646002)(19580405001)(47776003)(66066001)(5003940100001)(2876002)(50226002)(2906002)(4326007)(5008740100001)(81166006)(8676002)(921003)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:BN3PR03MB1480;H:tthayer-HP-Z620-Ubuntu.137.57.187.33;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics-untrusted: =?us-ascii?Q?1;BN3PR03MB1480;23:h9SgEyvFKoXMIoOqJ3IBZXe7ImjizpU1N+NzrHLYE?= =?us-ascii?Q?YyBr7Ew4Z5TJCKZqksSngqzqG2h3DSbUXYGVtA6FimgyWp1+zg1wIalGjO2y?= =?us-ascii?Q?tCo7MmSSfJIR0tWFRrytPSoUJbn+Ao7v2l7AqmTCwBpmA2umytD4/5UGip8p?= =?us-ascii?Q?Yu4grqyLI6nN9jhqCpSS7G5Ql/hGJLwWlIvPZl/m9IuGVaOOE9cgLKqC8I8J?= =?us-ascii?Q?dFIoyYWAY7O5xdN5eD+YXj/VMUv4/nxgKwnkbWwcZyUJEKBb8sHd4OSAMxPA?= =?us-ascii?Q?JCyjZxVus1iWxVyRHVKMr9bVmvcSJs8/KmRJ7cjaHzDGerIlcDzUFMm+qLJK?= =?us-ascii?Q?kA+1ixHgNImpVCgH1tKbXOlPvCf0yoJBH570KNoTTnnTSLgfVMGOSAxr72v/?= =?us-ascii?Q?RupfH7W9CGrIUYVw0qfd6VXazZTV2As9DShq3HaYlcaTmMf870hQI2115CJd?= =?us-ascii?Q?itipDoUuxnLDfbk6LQ/vk4ZPI4VF5jSgwCbIImSTCSv0GZ0siXuiPLQqEBnv?= =?us-ascii?Q?6dS+n7uc830Z5Tu27H6ydnMDOdi7VVQA1rwggGevzTsTtY/NyQrPorF78pVH?= =?us-ascii?Q?lFDqT/qGom3Gx3s2rrSrMX2gsk9DSzshewyTZvJlTvyWjL55ERCEXb5HzQC2?= =?us-ascii?Q?gqgj0eHVZZ6XrV+yjIHtUHxx+7E/qbE6GN+MkyL3vS/1QZ2winIad6af6Bp5?= =?us-ascii?Q?/BX35cMSmsontIhBWmDXZBVXJ1CBFJK5uR/NedOguhjwK/S9YEMSmuzHdrI7?= =?us-ascii?Q?r4MFF1zhFQk/VMa1EmAkGN7Fi+8fEyP6u2Oa0siXamBX1HtO/0n0g14i/ji/?= =?us-ascii?Q?HSDaa5a5ZEQoRiOWR3vGFbw5lxN0e13awKVAP9Ej8gxrrOgWPnDGbs0pcG4I?= =?us-ascii?Q?a6fWLWvcqsRKnZPj1+dibU26grUcH4S7DHlawdlOXxvbInE+EQbcSYnl6aTs?= =?us-ascii?Q?adILvVKFNEn0OZy7zL15bs8Xv2d5qp7MRdztXGgN6wAZlxYTSD+92c6NpDqL?= =?us-ascii?Q?EceoQmwGzu0pRd5pbAdFsEW?= X-Microsoft-Exchange-Diagnostics-untrusted: 1;BN3PR03MB1480;5:WlCYRxgSLc9Pd03x2Dfb9KH3DqMx+HEj+rzhS4oCi5+8LZlSvnPumlBUfH9jJrmCk0y+FpMggPJ4gyJMTUOQ5+8VJPupKHyrHYIFpNJ1cEc8GGB11ikfqyOKVP7u3zygIJ6V9lG2j73bAirY7b52FQ==;24:uTh5A6ABmRvZldxoIgm+rUiDe2ytLU84Ve9QN8yLuQFZD6/pb7RANUw6GIWSqX0aHMtQUe2k2jSOpI3kSMWued4LvG5N/DSCCT4RnSD0xlU=;7:l97alRFRTWBWod611amHjr8hftpWjtW8E4A8mRpICuuYUKCYgNgq9oOvwgD/emSYEnKnWu683OWFt0l2BAeUXLZGEBcxDVfqfVKBno3X6cddDVybrVqYmDvLkKwq2bhVqrnYVYPRp9Fsn8HZKcW2y25nJsoQ/aRcCCH1XtslGjA+j+/tmkAjXAGp6whii/WN;20:dfqOBdgeOBqOKR54zc8kU6z48wHu5x6LoV6DDyfl7721whGI2P9TvZV/rBDGd6GfgebzG4/cj83aLT4f4T25uTP6KUmYnHjjghLGOJXjS6quWLLNXlatCsPa21RSAlmefO/Z6QG3idZiI7HaYVaXZHmg3biOtDjJo1Jp7j1EicA= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR03MB1480 X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: BN1AFFO11FD012.protection.gbl X-Forefront-Antispam-Report: CIP:66.35.236.227;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(9170700003)(2876002)(16796002)(19580395003)(5003940100001)(76176999)(21840400001)(189998001)(81166006)(4326007)(33646002)(92566002)(5004730100002)(5001770100001)(8936002)(2201001)(11100500001)(8676002)(6806005)(3846002)(3720700001)(47776003)(5008740100001)(229853001)(1220700001)(6116002)(19580405001)(66066001)(86362001)(586003)(106466001)(50986999)(50226002)(2906002)(86152002)(107886002)(2950100001)(575784001)(48376002)(87936001)(956001)(105606002)(85426001)(77096005)(50466002)(7099028)(921003)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:BL2PR03MB515;H:sj-itexedge03.altera.priv.altera.com;FPR:;SPF:Fail;MLV:sfv;MX:1;A:0;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD012;1:Ik6qlafKTSHqd6clFk0+gNXd63eNP7XHPg+PA8AeeWcGOX4/qFYVoq8PSYWsS8YyRBp4V7Hm491IMxTw5DmZTVQ/072UL6+d4DMRU+WNrkHHacRr2nU9spFaQEaC69eueM+erdCTZT+a18YY7bGg62lhrxwCpqDG5QQpD4SHWcAlkcge/Vtipk7w/hXs5ufR4rlMvqTkykFC9A8Vs0vdNM9CAV3ZgAyBDnPE2QYK2NJDjBNrl5W26zm+Hzc4w0h2Y7jXXgV+GhAlc5lzcyXO2QUgMiSvhkB1ED2ovNtH8562W+wGAM0+TARilcAlarqU6bLGbEdLKgy+6dFIejTxQ+uV5d4t5+2AhSJw1lrPoVlm4LScTF6DCNxRbeJE6QyEbPW/CDZzagweWnals6pwvKGRZc92ZYe+ApVkh6ic5eS/RZq88dw/XPijPiEgZzwDaqS0n9o87YjsgEbPld6+8GvDEyx8AwyeNUHGQcQmVZrFDy+VDjWN3cEODhgnhTC+zNs2dSETNo3GJG9pVLb/fLxEXXwhLOFPUgs3DPncysY= X-Microsoft-Exchange-Diagnostics: 1;BL2PR03MB515;2:adq3jk5k4gREyhJNOQ/zflv0YSdFlY3lLA5zvV0xnSsZYt3RjsFqPscJM/PQoi3RrvACaRzB19IPcS3hYGzmduJH9WQ8vQMKaWKdeQ0nfhPWhSpn/u9KEzkEtPFUgM4gKmYrucZvA+7YAqStAJS+bVdyk/9lewHTLpo6ED3fqiQYXmggAOOCLCY1UqEwoIBq;3:WIfKd9TwF0CqdHDxKjzHYiCzDxB/D8lH1jS3+VsTNgwB92m0fX/dkOHLMTE6FzvJV4vZBRpASjCMD9s+ghabuO6QIba4uxvo8tr8GNLu2iR0UBK2eyFEViUfriTfYncfvSaUuO2AQtd1eRmhTkBUfN86eHx7PwK/j6Oz+TQJV4Ps50gfFakjIMHusSKDnULCyeujq7IfVLeryndD/wlozKsra2EK84r1KLKn2pz0vXjDqaPzFwcECxOKCyL7Bkq/;25:jnCTJ30efjsbYgKV4YvyH9cSkoEbowZthGjHSr+oUjaClvre7olw/kKM4xVarHTdfb/GRGIojhbI8a0UMI4hcjwjy5jfbRbxSh3ykpWFORA0UX10+u4886qosTDm7+QGnZWkBYpUZECcEuFI6V1CMeSiiZ81w71HJZfNPF3qok7YrAhnq6sggMX9e3bJNIBgbj2i/7fRmj/fLTNege6hndB+7HS/fXPsuZCN8Huf9KlHe2iKK7RoqHPPda2i0cBGnHr0IcjhrMlDBV/rFtsq/8evWJFonbdBMKqCqA4PBjN0QQeMbSQvsvgccDlJfyI9yONUSwUkMRRyT6MNVC8xQ1/T/+/1/i0nbitkQneBNQKrNGrxR9gKupScNP7aItq5YnY4kB3u/gcIpupNioOJBBLnMXq4Ts69CaMAYeCWqws= X-DkimResult-Test: Passed X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(3001016);SRVR:BL2PR03MB515; X-Microsoft-Exchange-Diagnostics: 1;BL2PR03MB515;20:Xf7PbMqH94qr19N9louN8JyPx5Uso0JeSb4LDXXE2n5ot2x1gTqJOVyLjHD1zq3J/bNfoK6JsG8CTP/LguS56frPuNT9qhnsWLV2UZCho8Ww9uuhlG5ZPa7XNN1j5ShPr+jIomWH2IbB8X34MQPVIr6YT6kIL5SHKiPuJVwEuRs=;4:hm63V4l2bOm8EtJTyQLo2YeJE6f9htBw/cKFa8GOkeF6ubTBkyBIHuBnzue8qN6rkvflmDySufh5sOxPxseulgmzQexOIxoXBr6yE1cKbaIKp8nRo3KfjvMH2i5r4Bl7UW/7CVKQYNeye1hxxoRNdam6SSK742HSKqJvPaEgcUkdGwo71FdvVIGfXv3fEs2qJ1gWhsx0CHoQclIkByoU5e4mDBHGlIgMrMvj/iZLXtKUyENk16gFzdvsigu5S52JDu7wNpqDY4YUfx/qL4HDoLJoL0oFJr/fJKRtZt1HUe8PVA7xbFssQplLy/P4xxuYPnoYQn3HymWciEUH1976LnThg97Z9Ad1OKJBMrpBKZ8pRqVE79OEgUUu6qjue2odse0wXA1cpwvsfrxueL2+5h7cVd4GM06uHU7C1iv1p3q9xMXi+rdnRQe00sCrgRXmNiEHuQ3qUlU+NigsR5ONwTZ8PtOXsr5uI3MHTDd+DZQ= X-Forefront-PRVS: 09538D3531 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BL2PR03MB515;23:Yhxb4HYiLzhvBzE/tbIaYoo6yhYzO0VlL5rGH7Vo23?= =?us-ascii?Q?+zctVwqF192ZfgDmrJLmisGDcz+9ytCUk0VQkh73g3WgaGNMo6Kmu7YY5TK6?= =?us-ascii?Q?ARNpYyEjO0FDdwb0HHmt7RRAl58AXO5WzQWlHHtK8xjH7jk46FBsPsZQYOLf?= =?us-ascii?Q?+NhLou2K0kPL8QZf49HAqawtc5aO9xe3DLEqb1jxSrSnqrXGYkmtbq+Cw8de?= =?us-ascii?Q?ItmkbYolhfGPnTUv16/weKP2UP+ja6vklTYjszWpzaAhFOYcCmTl+SnRD+Z9?= =?us-ascii?Q?7MlGSlFhfdPr0SyPzYBe8iAEUb9WUrBhl8oDariOu9sEGaMX/v0BiI4jLGet?= =?us-ascii?Q?WWhFDUXG7210M89067pGzIus+mRI4f3WbEyJJ+xJbfIdAOw+BXIQXKFPexdT?= =?us-ascii?Q?PbBiMcGv/34OUAcOf0x5fkaUrcd47rWDiunkUCKOtr+4CZdnBLYE7S7eI7tQ?= =?us-ascii?Q?eFA82a/OZgPdDKiqS8+WQslNTmBOHRR0KgZwjCJXPMGeHz8HI4HwIq6znVzB?= =?us-ascii?Q?4EbSAuzZCsrWRkwFriFEgItusjFS+0qBhMEhFBZqX93IYTa8akR745Ju9kNq?= =?us-ascii?Q?CQLuoLIs2m3HyhrE8mZGnymxcYmpxpH7vY5QRgCVBb+RhokVzFZyFFBfQ02F?= =?us-ascii?Q?2TIXZLyXZ73Kp6BK3EhdNCWv9bVzh3giBUD+5js4MBZiIrZB84gAsA/2nR7C?= =?us-ascii?Q?zbW1n+y3KKyVcp0RWRV+4WhKDl4Hr0DT9A839WsfH5CAdqUHyNOw9L8/OCTn?= =?us-ascii?Q?YNL66eDxbip1/Yl04JdCdXMxZQaOkFiL670F6ak6QmHTOB9YB+9HjvEp1OD/?= =?us-ascii?Q?UJuAeC0ZQpE4yyYZBtcDuf7c704rQ41Dx5PMDW32+vIv2BXxAxl9AwgduXch?= =?us-ascii?Q?ZMXzpgWxFbpgner205llSPtL/XpbUCVbnN7RvyT5YHdaNtRZMqTRlzpB+tA6?= =?us-ascii?Q?7abHp/Izd8R8YCA6mzguEmceHDpYTzy8x34eBotShJbKyxwQeyttth5O8g6J?= =?us-ascii?Q?6wps2rVJA8PJCC/tPTy0buJ59WXWtBWdmBLN3Hmm1fnPf/CH5AaHsaAF3MRq?= =?us-ascii?Q?NwpYbjF+eIpTBtmyi5aDx1/h1/9TgdMjY1C1x32ZLfNwT80Bcy8maUV+vywe?= =?us-ascii?Q?i/dDiMW1p21CIHTL8DtyzDMng2VyRAW9vi/9oRTuI81zdqxvwNH17Wf4Uj9B?= =?us-ascii?Q?N4+3+OB4ANzgjlei5mp8UHk8ULfYKE/F8ne0LOw0x+keVNII5x7YCdNfy+ih?= =?us-ascii?Q?fKjyuffFoAtXKXDi/zOJkgAqxYOMpS/f3FxcnfEYvIifnuG0lmsqydTFLf+U?= =?us-ascii?Q?Is4Tk4tTsuv33GmSsX6tTF9CTaOBY2dQJ260s7jxdhewqfBocr4HMwidcu9i?= =?us-ascii?Q?T42VAWiVAe6sUu8PIIQfawhBo=3D?= X-Microsoft-Exchange-Diagnostics: 1;BL2PR03MB515;5:6gtRQrqwJ9alLrKbrHGGXRHosBwG/S0c/8KpwdDphGAcMWr7dHV0N5H0Ns8qA25HZ2gTilFCHFH7SUEmXHBCNIH2S0t2+h26VvsX5hWGcAzZczpWFIYr6dkH8lrBAFAueW7PU5zRFsCI0+asXbdr6w==;24:ovEB8mODCib87uXM1nCPu0W2XhMGG8txePE9O7ZEodAcJDN5c5N9aLEAhDjDm+P3kM0XZ86mlqKq+2JUF/L2+Xq6aWmUjg4E9VmPZqgX1rE=;7:lNMunemsGVb2W0QWmOkIPVl/fWuWN1VyGUQ2bdufff5E8CiuaEmrrDiwd3jtE8CrDMATC4qVOVqmA43jymVnPIOey+j0NSDKjviP0yYywxxgY7+WX8r66TJSju3FiVxjHVNAFQHtKi9qimsl2OS8Ppxk9eEdjz14v7YTbHa/Ir8=;20:EUsqhLBoNT94fQk4c5R8FbXOlUsQrhBeZP5/rbOQbrKKHTtqdgbvBL1dQgevidS5wS3CSLpVo0wlaVAIX8ASkZmvc7bGeXVKfy5/BMhHxo+0rwq+B3tAw7uvh2fCjTLr/U3YJugtTGiLzGAw4KeFOb/NG1NJyyR30Qp1Chq+vP8= X-OriginatorOrg: opensource.altera.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 May 2016 16:27:15.4185 (UTC) X-MS-Exchange-CrossTenant-Id: fbd72e03-d4a5-4110-adce-614d51f2077a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=fbd72e03-d4a5-4110-adce-614d51f2077a;Ip=[66.35.236.227];Helo=[sj-itexedge03.altera.priv.altera.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL2PR03MB515 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Thor Thayer To better support child devices, the ECC manager needs to be implemented as an IRQ controller. Signed-off-by: Thor Thayer --- drivers/edac/altera_edac.c | 162 +++++++++++++++++++++++++++++++++----------- drivers/edac/altera_edac.h | 5 +- 2 files changed, 125 insertions(+), 42 deletions(-) diff --git a/drivers/edac/altera_edac.c b/drivers/edac/altera_edac.c index 5b4d223..3eb73bc 100644 --- a/drivers/edac/altera_edac.c +++ b/drivers/edac/altera_edac.c @@ -22,9 +22,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -882,22 +884,27 @@ static void ocram_free_mem(void *p, size_t size, void *other) gen_pool_free((struct gen_pool *)other, (u32)p, size); } -static irqreturn_t altr_edac_a10_ecc_irq(struct altr_edac_device_dev *dci, - bool sberr) +static irqreturn_t altr_edac_a10_ecc_irq(int irq, void *dev_id) { + irqreturn_t ret_value = IRQ_NONE; + struct altr_edac_device_dev *dci = dev_id; void __iomem *base = dci->base; - if (sberr) { + if (irq == dci->sb_irq) { + ret_value = IRQ_HANDLED; writel(ALTR_A10_ECC_SERRPENA, base + ALTR_A10_ECC_INTSTAT_OFST); edac_device_handle_ce(dci->edac_dev, 0, 0, dci->edac_dev_name); - } else { + } else if (irq == dci->db_irq) { + ret_value = IRQ_HANDLED; writel(ALTR_A10_ECC_DERRPENA, base + ALTR_A10_ECC_INTSTAT_OFST); edac_device_handle_ue(dci->edac_dev, 0, 0, dci->edac_dev_name); panic("\nEDAC:ECC_DEVICE[Uncorrectable errors]\n"); + } else { + WARN_ON(1); } - return IRQ_HANDLED; + return ret_value; } const struct edac_device_prv_data ocramecc_data = { @@ -988,22 +995,28 @@ static int altr_l2_check_deps(struct altr_edac_device_dev *device) return -ENODEV; } -static irqreturn_t altr_edac_a10_l2_irq(struct altr_edac_device_dev *dci, - bool sberr) +static irqreturn_t altr_edac_a10_l2_irq(int irq, void *dev_id) { - if (sberr) { + irqreturn_t ret_value = IRQ_NONE; + struct altr_edac_device_dev *dci = dev_id; + + if (irq == dci->sb_irq) { + ret_value = IRQ_HANDLED; regmap_write(dci->edac->ecc_mgr_map, A10_SYSGMR_MPU_CLEAR_L2_ECC_OFST, A10_SYSGMR_MPU_CLEAR_L2_ECC_SB); edac_device_handle_ce(dci->edac_dev, 0, 0, dci->edac_dev_name); - } else { + } else if (irq == dci->db_irq) { + ret_value = IRQ_HANDLED; regmap_write(dci->edac->ecc_mgr_map, A10_SYSGMR_MPU_CLEAR_L2_ECC_OFST, A10_SYSGMR_MPU_CLEAR_L2_ECC_MB); edac_device_handle_ue(dci->edac_dev, 0, 0, dci->edac_dev_name); panic("\nEDAC:ECC_DEVICE[Uncorrectable errors]\n"); + } else { + WARN_ON(1); } - return IRQ_HANDLED; + return ret_value; } const struct edac_device_prv_data l2ecc_data = { @@ -1075,28 +1088,27 @@ static ssize_t altr_edac_a10_device_trig(struct file *file, return count; } -static irqreturn_t altr_edac_a10_irq_handler(int irq, void *dev_id) +static void altr_edac_a10_irq_handler(struct irq_desc *desc) { - irqreturn_t rc = IRQ_NONE; - struct altr_arria10_edac *edac = dev_id; - struct altr_edac_device_dev *dci; - int irq_status; - bool sberr = (irq == edac->sb_irq) ? 1 : 0; - int sm_offset = sberr ? A10_SYSMGR_ECC_INTSTAT_SERR_OFST : - A10_SYSMGR_ECC_INTSTAT_DERR_OFST; + int dberr, bit, sm_offset, irq_status; + struct altr_arria10_edac *edac = irq_desc_get_handler_data(desc); + struct irq_chip *chip = irq_desc_get_chip(desc); + int irq = irq_desc_get_irq(desc); + + chained_irq_enter(chip, desc); + dberr = (irq == edac->db_irq) ? 1 : 0; + sm_offset = dberr ? A10_SYSMGR_ECC_INTSTAT_DERR_OFST : + A10_SYSMGR_ECC_INTSTAT_SERR_OFST; regmap_read(edac->ecc_mgr_map, sm_offset, &irq_status); - if ((irq != edac->sb_irq) && (irq != edac->db_irq)) { - WARN_ON(1); - } else { - list_for_each_entry(dci, &edac->a10_ecc_devices, next) { - if (irq_status & dci->data->irq_status_mask) - rc = dci->data->ecc_irq_handler(dci, sberr); - } + for_each_set_bit(bit, (unsigned long *)&irq_status, 32) { + irq = irq_linear_revmap(edac->domain, dberr * 32 + bit); + if (irq) + generic_handle_irq(irq); } - return rc; + chained_irq_exit(chip, desc); } static int altr_edac_a10_device_add(struct altr_arria10_edac *edac, @@ -1168,6 +1180,34 @@ static int altr_edac_a10_device_add(struct altr_arria10_edac *edac, goto err_release_group1; } + altdev->sb_irq = irq_of_parse_and_map(np, 0); + if (!altdev->sb_irq) { + edac_printk(KERN_ERR, EDAC_DEVICE, "Error allocating SBIRQ\n"); + rc = -ENODEV; + goto err_release_group1; + } + rc = devm_request_irq(edac->dev, altdev->sb_irq, + prv->ecc_irq_handler, + IRQF_SHARED, ecc_name, altdev); + if (rc) { + edac_printk(KERN_ERR, EDAC_DEVICE, "No DBERR IRQ resource\n"); + goto err_release_group1; + } + + altdev->db_irq = irq_of_parse_and_map(np, 1); + if (!altdev->db_irq) { + edac_printk(KERN_ERR, EDAC_DEVICE, "Error allocating DBIRQ\n"); + rc = -ENODEV; + goto err_release_group1; + } + rc = devm_request_irq(edac->dev, altdev->db_irq, + prv->ecc_irq_handler, + IRQF_SHARED, ecc_name, altdev); + if (rc) { + edac_printk(KERN_ERR, EDAC_DEVICE, "No DBERR IRQ resource\n"); + goto err_release_group1; + } + rc = edac_device_add_device(dci); if (rc) { dev_err(edac->dev, "edac_device_add_device failed\n"); @@ -1186,7 +1226,6 @@ static int altr_edac_a10_device_add(struct altr_arria10_edac *edac, err_release_group1: edac_device_free_ctl_info(dci); err_release_group: - edac_printk(KERN_ALERT, EDAC_DEVICE, "%s: %d\n", __func__, __LINE__); devres_release_group(edac->dev, NULL); edac_printk(KERN_ERR, EDAC_DEVICE, "%s:Error setting up EDAC device: %d\n", ecc_name, rc); @@ -1194,11 +1233,43 @@ err_release_group: return rc; } +static void a10_eccmgr_irq_mask(struct irq_data *d) +{ + struct altr_arria10_edac *edac = irq_data_get_irq_chip_data(d); + + regmap_write(edac->ecc_mgr_map, A10_SYSMGR_ECC_INTMASK_SET_OFST, + BIT(d->hwirq)); +} + +static void a10_eccmgr_irq_unmask(struct irq_data *d) +{ + struct altr_arria10_edac *edac = irq_data_get_irq_chip_data(d); + + regmap_write(edac->ecc_mgr_map, A10_SYSMGR_ECC_INTMASK_CLR_OFST, + BIT(d->hwirq)); +} + +static int a10_eccmgr_irqdomain_map(struct irq_domain *d, unsigned int irq, + irq_hw_number_t hwirq) +{ + struct altr_arria10_edac *edac = d->host_data; + + irq_set_chip_and_handler(irq, &edac->irq_chip, handle_simple_irq); + irq_set_chip_data(irq, edac); + irq_set_noprobe(irq); + + return 0; +} + +struct irq_domain_ops a10_eccmgr_ic_ops = { + .map = a10_eccmgr_irqdomain_map, + .xlate = irq_domain_xlate_twocell, +}; + static int altr_edac_a10_probe(struct platform_device *pdev) { struct altr_arria10_edac *edac; struct device_node *child; - int rc; edac = devm_kzalloc(&pdev->dev, sizeof(*edac), GFP_KERNEL); if (!edac) @@ -1216,23 +1287,34 @@ static int altr_edac_a10_probe(struct platform_device *pdev) return PTR_ERR(edac->ecc_mgr_map); } + edac->irq_chip.name = pdev->dev.of_node->name; + edac->irq_chip.irq_mask = a10_eccmgr_irq_mask; + edac->irq_chip.irq_unmask = a10_eccmgr_irq_unmask; + edac->domain = irq_domain_add_linear(pdev->dev.of_node, 64, + &a10_eccmgr_ic_ops, edac); + if (!edac->domain) { + dev_err(&pdev->dev, "Error adding IRQ domain\n"); + return -ENOMEM; + } + edac->sb_irq = platform_get_irq(pdev, 0); - rc = devm_request_irq(&pdev->dev, edac->sb_irq, - altr_edac_a10_irq_handler, - IRQF_SHARED, dev_name(&pdev->dev), edac); - if (rc) { - edac_printk(KERN_ERR, EDAC_DEVICE, "No SBERR IRQ resource\n"); - return rc; + if (edac->sb_irq < 0) { + dev_err(&pdev->dev, "No SBERR IRQ resource\n"); + return edac->sb_irq; } + irq_set_chained_handler_and_data(edac->sb_irq, + altr_edac_a10_irq_handler, + edac); + edac->db_irq = platform_get_irq(pdev, 1); - rc = devm_request_irq(&pdev->dev, edac->db_irq, - altr_edac_a10_irq_handler, - IRQF_SHARED, dev_name(&pdev->dev), edac); - if (rc) { - edac_printk(KERN_ERR, EDAC_DEVICE, "No DBERR IRQ resource\n"); - return rc; + if (edac->db_irq < 0) { + dev_err(&pdev->dev, "No DBERR IRQ resource\n"); + return edac->db_irq; } + irq_set_chained_handler_and_data(edac->db_irq, + altr_edac_a10_irq_handler, + edac); for_each_child_of_node(pdev->dev.of_node, child) { if (!of_device_is_available(child)) diff --git a/drivers/edac/altera_edac.h b/drivers/edac/altera_edac.h index 42090f3..62b0fa0 100644 --- a/drivers/edac/altera_edac.h +++ b/drivers/edac/altera_edac.h @@ -295,8 +295,7 @@ struct edac_device_prv_data { int ce_set_mask; int ue_set_mask; int set_err_ofst; - irqreturn_t (*ecc_irq_handler)(struct altr_edac_device_dev *dci, - bool sb); + irqreturn_t (*ecc_irq_handler)(int irq, void *dev_id); int trig_alloc_sz; const struct file_operations *inject_fops; }; @@ -320,6 +319,8 @@ struct altr_arria10_edac { struct regmap *ecc_mgr_map; int sb_irq; int db_irq; + struct irq_domain *domain; + struct irq_chip irq_chip; struct list_head a10_ecc_devices; }; -- 1.7.9.5