From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754245AbcI1S0f (ORCPT ); Wed, 28 Sep 2016 14:26:35 -0400 Received: from mail-bn3nam01on0068.outbound.protection.outlook.com ([104.47.33.68]:9670 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932607AbcI1SXA (ORCPT ); Wed, 28 Sep 2016 14:23:00 -0400 Authentication-Results: spf=fail (sender IP is 66.35.236.236) smtp.mailfrom=opensource.altera.com; ni.com; dkim=pass (signature was verified) header.d=altera.onmicrosoft.com;ni.com; dmarc=none action=none header.from=opensource.altera.com; Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=atull@opensource.altera.com; From: Alan Tull To: Rob Herring CC: Frank Rowand , Mark Rutland , Greg Kroah-Hartman , Moritz Fischer , Ian Campbell , Jon Masters , "Walter Goossens" , Michal Simek , Cyril Chemparathy , Josh Cartwright , Matthew Gerlach , Dinh Nguyen , , , , , Alan Tull Subject: [PATCH v19 11/12] fpga: add altera freeze bridge support Date: Wed, 28 Sep 2016 13:21:59 -0500 Message-ID: <20160928182200.15800-12-atull@opensource.altera.com> X-Mailer: git-send-email 2.10.0 In-Reply-To: <20160928182200.15800-1-atull@opensource.altera.com> References: <20160928182200.15800-1-atull@opensource.altera.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [64.129.157.38] X-ClientProxiedBy: BY2PR1001CA0078.namprd10.prod.outlook.com (10.164.163.46) To BLUPR03MB1508.namprd03.prod.outlook.com (10.163.81.26) X-MS-Office365-Filtering-Correlation-Id: 7e3eaae7-0cae-4fff-3f0f-08d3e7cc76fc X-Microsoft-Exchange-Diagnostics-untrusted: 1;BLUPR03MB1508;2:GrTsFX2g3ctqNoYIvYC1CeKIGBs8Pfk/6xHmf1ZHZt3qYTQy6SZ8DPSMitlfhzPGajVTa17xiONLknYIDTRMzcKfMb1+mbGqKHIhIQIJAz1sRDxNtiuWFsA1DrBGc25DWaoyVFutp5Ih8XqOeU+mcn1EGkUdK1B9zHSzOnNEhmQACVCO/y/JPp2XUy8Y2vbi;3:hJU0vKf2j+4gZYYxcA9ymTZYUFJQ7mx+z2TTRHof9v8KpeRqKp31D38wXoutzCNxgxEwZJP7PP0dZbKfZ5a/olHA+GOmoGeiX56hB1Iu5ukfvFXXMJVLawsUremftHY6;25:cwLbpMY2bMaq3mfHVGVkkQqoT9DR1rfnza1ZiJsp4vnlJvI5/cbGlL5uYetpEKw9mmV/imUTiiPZindK+5bj1xRtUcFHU3micVQEuWfxGr+DOAp15xYb9gY9UwMPBw5ZV7D1EF1s3o3RxxaF1Muytb7YAb7IAITlEUGRU5hcolOUzaSrp8PGe5Ok6CfDi/oBFbrjKUgsacpLQE0YHrku0il5XPYyJPWm/gpagLu8Sl7psaJu6GMcj7NLEmj0VOnQTgafmvXcVnzd0mSI1hw4jYzFqTgJYq+Otu3KgXC2zzqzgL1KJuAfxKodCP+NqSfDt3+YD2Qu/thkeezDvqGw4y+uIrDg/vMdr2EZ0TTvSEmzwG6OuuiNvltKytS2hyrD+qq+O8D+VtTKjbq+y4M7HnGgP0xzQCAiPfNBCCOk/qw= X-Microsoft-Antispam-Untrusted: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB1508; X-Microsoft-Exchange-Diagnostics-untrusted: 1;BLUPR03MB1508;31:dfb6QaJkGXyImM+iBFVrTMtMtwPOHuq6MIM14zdpAJXXKf6mQXKUOE8DkiAq96tx15nEr4hckMeuChLPKvdNTFkKeeRGFQP8OHiSSy2E8jkCcajkigsIpFzFiKPTey4aBpyIUyYD36v/QsRhwDb0gKIG723eTvIL/kYZ7ZIeEYyvAO8WRTl4CE6IB1gXIOAJ1PG4q5fpFL9hvPdGUZOU2C8prEeNa6f9FCMgFGuwAvc=;20:KOqJOi3lfOhLXU/glRDV0fU+4a5nv+aSeKkv+cYbQj3ke9FmSbQyEHuJs0jLhR9nJqDcbPJpC02/bwrFPnIYfI+sDHVA35SspVgcU21mQKbg2y2g1KwQnVN46JCHZs0kPUQrmMovctyhLs4dClln0Za72jJVeDNxr/BXQCFU9oE=;4:aXk8Vh49OPgdRg+qTLBCgf/6G0DISzMMuhzcI8moWk8LMOmMAH4qZO4l2NvFZVtEeQ1Ocyt8OMVbh3k3mhVa95C4ZnWrOkxuYK3MNnvSxX3UiAyOEIVU4hhE1u+4d/p2q8aFGYMYWZbO4Ds7WusgYbwNalGRwy3VhsW2+Sv3M76h0gaT9SdmuqXe6mn+MQRNciD5jGFglwWytfkLNND5Y2ixXSxKU/CQ7rUpdPJTfBCoAPs2nziDfsK1zjkS/MLTh2DtHg2N18Eok6KM3haXYHRjMEDxqO5TVNtAK/KtDAGjbIxqItPLruWjCGi8lU9oDs/CdNt51cHmPEbDphtZvECSq9dc9XJ2uYcGGXxDSEXpVMBAN2cYW8iaLIWG/zh7s57A4xCvEoZdMESWnXOqNd+ek3VpJ0zrChoOrnBB7PlDMt+dUrYDEPRsUNYC+609n2DJ0OtSXI5zL+a20VED3KKR/pWcCjAu+wIAIrQaGU5C48oT5YAzx+DZOhu4/4ExmKIaA9O542ynkLpzV4v16g== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(250305191791016)(22074186197030)(80048183373757);UriScan:(250305191791016)(22074186197030)(80048183373757); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6055026);SRVR:BLUPR03MB1508;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB1508;BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(13024025)(13023025)(13015025)(13017025)(13018025)(5005006)(8121501046)(3002001)(10201501046)(6055026);SRVR:BY1PR0301MB1271;BCL:0;PCL:0;RULEID:;SRVR:BY1PR0301MB1271; X-Forefront-PRVS: 0079056367 X-Forefront-Antispam-Report-Untrusted: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(7916002)(199003)(189002)(53416004)(97736004)(189998001)(107886002)(19580405001)(86362001)(33646002)(19580395003)(5660300001)(7416002)(2950100002)(42882006)(76176999)(110136003)(15975445007)(101416001)(77096005)(5003940100001)(4326007)(106356001)(92566002)(50986999)(66066001)(2906002)(42186005)(48376002)(1076002)(105586002)(50466002)(47776003)(586003)(6116002)(3846002)(50226002)(229853001)(69596002)(4001430100002)(81156014)(81166006)(7736002)(7846002)(305945005)(8676002)(8666005)(68736007)(7059030)(2004002);DIR:OUT;SFP:1101;SCL:1;SRVR:BLUPR03MB1508;H:linuxheads99.altera.com;FPR:;SPF:None;PTR:InfoNoRecords;A:0;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics-untrusted: =?us-ascii?Q?1;BLUPR03MB1508;23:BwI6VolmY2vhWa+oUPvKhG1JmVCNG1/qXqo8/D1N2?= =?us-ascii?Q?TmlTkcgSNMILX16AkJagJFtABZuzCMrbdaSZ7O3COmIttSv7tCWDE0JFmftx?= =?us-ascii?Q?GO6wjAx2jbswK1fsdv9MJg5vL/P15Qif7NbK2rYTGIK9nLanWu8dEncD6LpQ?= =?us-ascii?Q?psnB/dAXAWz/mIQxeFjYEGVU5zhdmuPhxClkm7tfihFI4NgS7CLiWqeN4G5j?= =?us-ascii?Q?AOisSKufvaf/olsCjc/1AQKgiC9YbE31wEbtiHUTInE7lXDKVDg0aycHIP4Q?= =?us-ascii?Q?3zgwO71C9ZADLZhV1AAcx6a0OyWMbcxeJ35IJrTx8peGByqEBu+Y3AnYBIQZ?= =?us-ascii?Q?umCs4NCCYOl72Uvn4DXUDr5fxeE8YU/tyNtuDr4MbcxRQQRY6W4fymR10Rrc?= =?us-ascii?Q?O621M3Fy60fvXAavSVwA3AYvcnbSfbyFjvkoPlZ00X34+5Bg6nOnBd+yFbR1?= =?us-ascii?Q?Q5fkhEEih95N+BE36J1S/8dpS3k4aBPKByqtuToFuW3AkJE3YLUibtgpP+Wf?= =?us-ascii?Q?o3nM0ARXnJodP+UW9xgsf0CGoj2Bu5ZC342RueQ4P8qgqvPi5UPQGRlLJIjt?= =?us-ascii?Q?fvhWMOpzRNSxfAxfIYrxHLWVZSl5g7GMOAEeVIIokbfz9uVZ2fsbmaf9Q25b?= =?us-ascii?Q?eG1/fY7n/WE5HhtG5VYwMHPs6qDvjPneDZP9/ySCZfLGigs21gC6/mniH+2i?= =?us-ascii?Q?nBiY9QTTPtZceUvlmTLA/4GI6ydEHtWgAxU7nAN+Pt1N9Ycwj0eZhSDRJwnw?= =?us-ascii?Q?9QJWNlyBmOGC7iRrGr1kP3y5NuGD84NSIhtN9WkVMA8KMdRnari+LBp1YCmW?= =?us-ascii?Q?uYHbPYNUS4mqG5op8MCV55nQhCMOcSXN90Ug8QMCcZh0Y6RuR2h7jQTs6fOn?= =?us-ascii?Q?UZVGz7loVqMxAkGAzlp/aGjybdnTdLgSD50VSCxV3YnWY1p3zi4omQaXDY/I?= =?us-ascii?Q?LA8xmJ6sP9nSsLDZEoDTsNcreEYICVc9L5T7tUZfPCLl+6r+wjPYgu4626q1?= =?us-ascii?Q?N9fzNWv7yojjMoATb4j99+V8CNhDKpDcdD2YJNAcCyADL4zNMznJ34M/q9Eh?= =?us-ascii?Q?eJQGKdfGbsCV33sMoRJUNYwGkdQrevwYO/bav196dSF7DCuaarTxZ8q5U9L2?= =?us-ascii?Q?ciuep2CfvXbDsvHFF+Npxwm+CXvkUUpeuhEarXIcbQSgX5xW050PcjzWE/8B?= =?us-ascii?Q?KsP3OTXUenKPEc/m/IPhM9bcsmlHBIe/q6l1RqYxE9sNZu0OtF9T73E9fHRi?= =?us-ascii?Q?A9JVyDL9kYIDgSMWZU=3D?= X-Microsoft-Exchange-Diagnostics-untrusted: 1;BLUPR03MB1508;6:IKE5e7UUPyK7yaf3dCfYL/UEhgCBce9Ztd8mR9NKKyH2HGyYc2YDV34KJMOspDQbJpLJ0aMxZh2/6OZ2U9nH1tHAPCbJu1ZmiFEAqw5D4/02GXpK4GBsl9WkmUyNxaSddQp4Uxv+hupcgFoibll6QYQWmSL+mecug3Ohq/VA2stzzlYCBwPVchLIrHXCB93yz+ijnnhelOJsl2EH4tURm8qY1xeufNUttDDJEHZfHuR72RRMAO4beG136dVhyHl7jKKWpfjBdsX3mD4OA2jwVGLwzM7Zj7ou8nBfmbGpi9PJO291+ncc8juzI//+IZh4CLHN9a23U5UxOdy73R3C0g==;5:UX+i7fOOXud3HZJoJ5yoLUk7NVy/jJ8k5OwyCA4tqv3EJI7hCVb+deXs6tqS1pOZ8oZVrC0FsSGsEixko10qkUbzWU3cPeEVWseYn7Ni1wIv08at7/2wsTfC4r/QqRjmMiSnEhx2xSBaXjws5DO7hg==;24:59pI7q0/K/G+z56DOBS09IWfRc0CCWPRXpsnMfuJdV7bQsg02vrYf+QPgoT6usnhcHZHfIh4JZzFQS6FUxx5iNCjhk9AYLZDyP5LArGmE7E=;7:Q+aiPlp+jhBRbLA0nIVuW75zKPLpjgM1JeClN6Tx9IpIZ8pxpCkI8QcylC9kSHyRB31QQ1eD18YwJHzj6+Sz5+ixDTUWUsBMxYRFC/Ez8jjor6JutLZET2OwQS6WdNZ3xCdd/Z7dZYdm6Ifr+MrIvZK1Gv/lS8z6/QX3r/qZ7t6QTitWaUCuSPoQdek8WJ0sRJANOgAmagYQVd9gOf9gPgsmge756W/n9HbB+xvF3wyuJSXZAlewaVPyUCMlzCg1KXr8REwSLYsEGBGP1XYbzHrtnlaqY260KCyfYIv9y4Yt1oOCtGOR/RJE26FVf9xj SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR03MB1508 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:66.35.236.236;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(50986999)(626004)(110136003)(2906002)(33646002)(76176999)(5660300001)(19580395003)(19580405001)(50226002)(305945005)(3720700001)(5003940100001)(48376002)(4326007)(86362001)(16796002)(7416002)(50466002)(229853001)(53416004)(85426001)(68736007)(4001430100002)(92566002)(66066001)(106466001)(189998001)(1076002)(8666005)(87936001)(15975445007)(336002)(81166006)(77096005)(47776003)(586003)(356003)(97736004)(105606002)(2950100002)(107886002)(8676002)(8936002)(42882006)(3846002)(7736002)(6116002)(956001)(7846002)(81156014)(6070500001)(7099028)(7059030)(2004002);DIR:OUT;SFP:1101;SCL:1;SRVR:BY1PR0301MB1271;H:sj-itexedge04.altera.priv.altera.com;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:0;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11FD040;1:OJW0GO/v0ceHIXyjswni5euB9/SWjTvp50C9q1VBdCnBMmN5AHgEi7AjBquvbXZWTE2obgByhrfgmrzbfuhjuQyVKJwWwvu8u46zLrp9XDvDeekxmoyuvoq0ZVdqjfvt5RssoypRC0TNs9aRlqqCk0usoIPxxVURE48gQQpxfhBWF2ewegKZ8m7BJ6nElMvx1fZBgW0Eta27KUtFqzkTMttnVKMFkU6Kad4vWPELc7fLBa1IDTisZMAKNpTpXX2vWnFJpo3ybhxyicWCKSxzfiT8Umq49FlMPhSc2vSEqtTWOU99CSn0ZAugw0kHm9piUeQM/R7VN+VUT45mWBl7N/SYj4Q38mvpImRwCO9afm2c01QurdviDW249KiFUNrYt9CgfugqfzNAqSMG2yZuXIwQGWpLiS3ZuOdqvMAv6V7uLH6A0LvW3NVqy6m0GJMYynhJAm3HdoKq11zfX8b9PTdqkKBTpuxa93ca2bp8PooyFWvW3EzTrAhBRKmUL13wjJw2L/zm3VfKd2YitM7NOO2BHCEdXsUgGhNnkAdJ4eCcjkjKQ0EHSbkCBG14VxEQcPLow+sa6tKVA74BU9Z9GFU+e9ao4MyR2mTlB3rKP50= X-MS-Exchange-Transport-CrossTenantHeadersStripped: BY2FFO11FD040.protection.gbl X-Microsoft-Exchange-Diagnostics: 1;BY1PR0301MB1271;2:Nm5BEYXlkC+IwEJPYR7/8JN9ksMGWKWrQ1HEBX9Ejkns9W6IUZWjQkkSPR1uUM0oOjfx8wpK/EWUF+qIcL/mFjV2zJ3dM4L5JiDyPT26jPwvdEkVs28xsdjUZ7NG/PrnJaL+qa2xcF8ROgROBRKp4qKF1jZQYU4adKIEE9nnHVXuLkYOuVg7GeGAs31URYlR;3:eWzXlJ1NEcZJFG3But63fGS6wzqKDLYcEOceTcLr/nlaR5JedflWEdLzEWWxyuAN3Kwg75MRKYQBU6doo9P1kmoAt1i06dSPcQS0qiMCpFdYToyhVqnpSI/6tKekNABmIrLebYM6zXT3p2ATbHgwjl1VyvBadVAjQMPpZM+80fVbhswprDilTFq/ZFkrzzoBHyokbW3TXQzxiTDc4yyRm2aSoYTIdm7Kzr5af0Ea8DO1Glyf8Oox4Y1zHLN+vXjf X-DkimResult-Test: Passed X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(3001016);SRVR:BY1PR0301MB1271; X-Microsoft-Exchange-Diagnostics: 1;BY1PR0301MB1271;25:Y28Q4z0HcFH9fWunhoMla+ZSe7YZ0kb0QgbHbu5AN2hqrpeSrYHXpnMwHPfakU9NeNKchmkRgfSyVI82Zztk7GDEPgOGksMU08FnCUaxVpslL1vyteqTl3Z9dPFIPy1KtHFpE5Wsxy4J3wrdmmfZfzNVAa/VsX5+dGbfOIbGpwKu2eJ9ApT8w59nqfI74jzoTMxr7nHgt9m3euTfRVj2fVcq1doERyN308KtfdCWwR/SQUIb2m0PUZJdh2H6Ze0bH5ZOUIYAm2pnvBY5HT6ckSV0ojHRfyk9KzYodbpVGHMwR8jdhJ5iSd1CfqANHY80qZ2157nYF4om3cDUn5vANnpNkOjmddTZ84cDf9LBUhcMvhiXPAT6eQU6XqBbO1Ta0KIMA7dkp1zh8ZEpLPydX4K3ejKUIsHlQ7ekJ8yUuzgiY25fCZxjSuKAlzmYC+FRotJ/vq2ynUlh+Hi0Tln35hNt6rMycqCFB1aZ2+PbKRyZ7fsVmWoYpCAVCyfgSoRoJKIxjSeWueDRASaP4e5RmWKsFEe3f3UZAmnGUoWTjmbYqgvfwkgnCo0xAbgQJis7Sd+tSLaZU+NYc5XtrYClY4p7sMEDFZxOAYFP8W95esJ9WbR8+1NICZshSgihgbw7ieLIU+tpDICvSnCsNhU0hpSVhPOsmZ4a+pBY5UJhkP44zGl2RMLJQaDAf14EKaUk+r7rOp9vXkzazSCmj3ZDiPlwGjWYIbrPYOFiULCB/PF2i31DMTHvQqe54/ahAQMa1YfJvcJQdr6szACdMpme/yN24KMERNiCfARCcIlPtjxjEDLrzMVDW0omsT6hjmrMkGonBlID1V3yiEif+sHwz5xwl9HFfGFe6HcmjluncOs= X-Microsoft-Exchange-Diagnostics: 1;BY1PR0301MB1271;31:mtX3K2O1XkU84tu++oeKMzkWGFfafxg/Eo3dbRiEp8HdysNQ446c3thUF7K5ZKPh97pN7s7868la3J27r0i8LqZTc0FeaUEiexwxdaLqglhB8y+TkuPTkUcWSTeH/pqYeLSpVrUJe2rm0f5ILfo9zq+2ARFh4z6Z1xpC0Lbc51gzr55cvpkzqLc6TGxU4WzLWeYmVbllIyRVJTdlWCLAj49LlJ/aA0DP0aKk6SuGsXE=;20:24w6Sj1G9K1PFqGNulc0eEVuqjTuRUGnd1QSM7ZkoOqf2GS3DW2sJsceuZPKyZJ00xOdLGL4xNHDOzIgey4ly8QPgGWZg2D7iMlNdyttuiQTE71+abUZxfVQUflYKl2eRfctgtSmLOBFx33SyEowyut1duWWe2pa9VozP3+akt0= X-Microsoft-Exchange-Diagnostics: 1;BY1PR0301MB1271;4:6jm0N8l8mpU8GyAUgOAp3Jaq93epgKh4yXOqjB3vlJd02geqyK3iyO1yD2T0K+C64O1r7ioWm5e71TDb9TmF1UBkcivW9zpPTOurbXK+XFN7TXAnPKUDH9FUTf1VIqXzGbf+Mgf4rucJ67Kp0cGB3BAkKsiTIa5OxwIRRDyr/veNeh2narwktXEuQNNWVoacTf7jAsNHpBDTlvZugpy81hX+MyyzRY839nFO5m3lAym7cshGGYmghBFAd8YPmW4oSasyL1lWh0cQC0+vVFrXTvfbNm8Cp8FZTMc06qVldVpDVu0l1oBqelC39MDdkjTj9fCtLP6o1L+WWO9yExCUllKHkC7MR6yQD/m7zQ7A9jcQxqAp60wJbntdK8P5OUePrRScKMqnpdNDgxog20u3kObc96UvcHuAaVhtH8VjqVJiV5Glol87shBqGinxGD0o9FKT3kfVaB0vdP0X5iGQKuprkI7xHJdnHcubdv52SNXNm6BhVO1afD4k9w4rT6d1SKSVM9HDfmiJATMjghsFuALQPk/nR2im8J1098X0zHY6cvXQ9Xs07NrgIm2XBgoB5hEeS2uE65RnlldnvM7rC7nqv+ii11qU2yZ01R/wF98= X-Forefront-PRVS: 0079056367 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY1PR0301MB1271;23:EmiCA58ngo2LlzQ5+GQTcW6G3IWuq/ObGq8jjzX?= =?us-ascii?Q?tQzujF9j0hro1QRec5JmtpUna199tORy47DjcwFbtCfc6GTgsVIK49qAqzmM?= =?us-ascii?Q?Hx47HjzdL/kvY1D5i1EZ4f04z+wTKG3qGgf953eKtMlOBZ7mhWQ0pelPj46z?= =?us-ascii?Q?ec9n02yOZUqRAJiTBtZHngRwyzksD8dy4s4513KeOKHd/EaVWLOpcnNVjYHM?= =?us-ascii?Q?boipqPidlSatO0i2Jj3ZrWtHA+IJTqrPhwc92+k5TNiYWSIQrWUmVL0VzuuE?= =?us-ascii?Q?0zHuvKIAopbOGrMy0PtT1tk7K77niVYeNHJvVDTJhtkZxpr+I52sY0IXxhly?= =?us-ascii?Q?YlOHvdFPKN+uPckRmCF19KiSHxrFCnWbDba0Jv3H3Oh1ex8pv2sEn9vA7i9c?= =?us-ascii?Q?BDs44DYmGH9YIutwqMMEy9qVZ1jrET26k3irXsG+mUKyvBJNCayggexwxrbF?= =?us-ascii?Q?/E49HOFhkfaxeT+6hixzsLUvGIqTSsYBb5UPaKmDnFFc3Hx/5+uafHB+yPVb?= =?us-ascii?Q?DyKUZueuoA21fV/aWOefhFsexvB5TxaM124HKq1ERyqfru2RknjrERNGrfAs?= =?us-ascii?Q?6ZlQIsq2aaFkmlHDIvfSSb99Z4ufYvKWj/sZxq1/YJMfEoh6IAI3GGifuZrS?= =?us-ascii?Q?JrAs4Zs3pPFwv1M5XdcvDx1zK9xartRQfR6qdf4k1D/hp5/FRquyct7BHMMF?= =?us-ascii?Q?kSFstD/P3xoZevak9dzHqhQq13MiGPKyi1I7FTXWt63awX9a8aRnwiUsDZP+?= =?us-ascii?Q?jI4gFu3XWwnh2wpkfS3/KwyJ9pGnx1zSQltPw5LdhFlT+VUTM0jYa46dI1ym?= =?us-ascii?Q?oSdhsbaCAjZb+wL92cAEP8hin3KFhI41PEu6Ss19RlXjHCCR6pZhEwMlvNTx?= =?us-ascii?Q?cFF2AmZjBYClKL+XdDDyNtwwKfe30gwvh4w10UU8RBAnLKTXPHoepWx0Fs5W?= =?us-ascii?Q?WPJt9SbTc+h7q9vDqkZBHECP5iO3+h8h1jUVgqpht+Gteo80KUe9XiPxoVKn?= =?us-ascii?Q?RRLpgnBa8nEfJDZdg6Lzl7xW5Az3Afbtv4JnphaudTfLT8j0okohT3synY/W?= =?us-ascii?Q?OzW4dhdPVDCN3ZIlVJ7hc2LQQTANfUC5KL53H8IQaSB0W/1eT9Nd/8y+Ok2+?= =?us-ascii?Q?OE7Eojrgmh8GytNQIfsrrVC/MaCeOBq6Xsp7ottMqYDNbC8ULRLJ6eR2FSmT?= =?us-ascii?Q?pOF5NfwZumo0vUPYhMWUp4MlyXVPXSVAvRTk8Lqa9lJ4JSg9rXkjSkKUf/U6?= =?us-ascii?Q?MRzsz1oxL2AxWOcwcqhsIMMCAY/+TmxG/+6R8/QG/MBmG98rwuH8/YOL/OAj?= =?us-ascii?Q?iw9e2i6SvAC5NP4ge181UrmuLDkqbt77AltrnWeLwaQkTuHOA6ECKRrjXajH?= =?us-ascii?Q?RgSppL40w9tMXB+KdsELUbWs7xLCe4ZeNKDWR6823BU37TYs7uncyravP4KB?= =?us-ascii?Q?hDKVet1mrORw2M8j0HTuXr5QGCuy6JpFzTRwX+ELdHf2vbm3gXTFE?= X-Microsoft-Exchange-Diagnostics: 1;BY1PR0301MB1271;6:GJfUJhwi+VxVfV9Zv4ivCTcHhfar0o556w9TB1G4kdfIvM9E0KerzzeUucOGRykJC3/R6ihq6GItJl4UBvzoq9pI8fV4B+ASMOo0STis8ejgX4agOz1bFjVFCVcYjyuVuFTYUw56gPzNlADem3WpxllNkvrZr4DtuwSmqjzYrMHWcVYgkvc75XfjRA/Y67McAYZ6WyklBL8VgUjfx0usV0M/KJE45nWKZuBRrAYejXwopm/WsooKlpzEZQZe/scXlrtAg0sX6fJLCE+hZQ+IAN+ubMCAwc3RPWmMV9fyedfysrpK0WKMozg3DD2+H30B1erpBAxyGhPjrrDLrYmx+w==;5:dqI5clyqeherBVh+luYuxFEnGfABAG11AHzjSEfePvViKCDA/HZ+s9ykC82O/jIdZDyrToofjr7rdedUI9cGUs2uPNwR1B2zwK+KZCJe1Pz+/F47qtf/pXpuDY7rLo2p2j42WMcHh5lyXBfbaxYQbA==;24:jZ2F3c/veupx8XijnUqVL0OI2aeQocXxshzbrSs+jklYpfmmYNLORqGirus+6O54NllPqqnlCYF0nc+hXVgkfT17RlUbHZORMAWgyAls80I=;7:iWVeK2daxT8z8E7f9eXmgAJktkxeeq2fCnhFhGoJNKorT5MK/3UKSHVVCAfLSn4Nm9Vus+qpZiE4NAmWR8vQsZGBVycfL0onnXio9rYN1B/A2uwjPZHJ/FyNGLDyPp6T/WFzXUJGgwhzT93UJuMOtPzUIGREecLOUcZ1JbRdaiWIAxy5nt0peTXfywzPsX2oEmj/v2zJdnwagrvaXPr6TowcsPTcFEgMbvmgNOT7HouQ5COHT/mFqwQUAOHE6Rmn1LRG2wAxunISedlPxhdN0w== X-OriginatorOrg: opensource.altera.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Sep 2016 18:22:48.8485 (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.236];Helo=[sj-itexedge04.altera.priv.altera.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR0301MB1271 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add a low level driver for Altera Freeze Bridges to the FPGA Bridge framework. A freeze bridge is a bridge that exists in the FPGA fabric to isolate one region of the FPGA from the busses while that one region is being reprogrammed. Signed-off-by: Alan Tull Signed-off-by: Matthew Gerlach --- v19: added in v19 of patchset as it needs for fpga info struct --- drivers/fpga/Kconfig | 9 ++ drivers/fpga/Makefile | 1 + drivers/fpga/altera-freeze-bridge.c | 273 ++++++++++++++++++++++++++++++++++++ 3 files changed, 283 insertions(+) create mode 100644 drivers/fpga/altera-freeze-bridge.c diff --git a/drivers/fpga/Kconfig b/drivers/fpga/Kconfig index 55d97d2..0d1887f 100644 --- a/drivers/fpga/Kconfig +++ b/drivers/fpga/Kconfig @@ -46,6 +46,15 @@ config SOCFPGA_FPGA_BRIDGE Say Y to enable drivers for FPGA bridges for Altera SOCFPGA devices. +config ALTERA_FREEZE_BRIDGE + tristate "Altera FPGA Freeze Bridge" + depends on ARCH_SOCFPGA && FPGA_BRIDGE + help + Say Y to enable drivers for Altera FPGA Freeze bridges. A + freeze bridge is a bridge that exists in the FPGA fabric to + isolate one region of the FPGA from the busses while that + region is being reprogrammed. + endif # FPGA endmenu diff --git a/drivers/fpga/Makefile b/drivers/fpga/Makefile index e658436..a6f874d 100644 --- a/drivers/fpga/Makefile +++ b/drivers/fpga/Makefile @@ -12,6 +12,7 @@ obj-$(CONFIG_FPGA_MGR_ZYNQ_FPGA) += zynq-fpga.o # FPGA Bridge Drivers obj-$(CONFIG_FPGA_BRIDGE) += fpga-bridge.o obj-$(CONFIG_SOCFPGA_FPGA_BRIDGE) += altera-hps2fpga.o altera-fpga2sdram.o +obj-$(CONFIG_ALTERA_FREEZE_BRIDGE) += altera-freeze-bridge.o # High Level Interfaces obj-$(CONFIG_FPGA_REGION) += fpga-region.o diff --git a/drivers/fpga/altera-freeze-bridge.c b/drivers/fpga/altera-freeze-bridge.c new file mode 100644 index 0000000..8dcd9fb --- /dev/null +++ b/drivers/fpga/altera-freeze-bridge.c @@ -0,0 +1,273 @@ +/* + * FPGA Freeze Bridge Controller + * + * Copyright (C) 2016 Altera Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +#include +#include +#include +#include +#include +#include + +#define FREEZE_CSR_STATUS_OFFSET 0 +#define FREEZE_CSR_CTRL_OFFSET 4 +#define FREEZE_CSR_ILLEGAL_REQ_OFFSET 8 +#define FREEZE_CSR_REG_VERSION 12 + +#define FREEZE_CSR_SUPPORTED_VERSION 2 + +#define FREEZE_CSR_STATUS_FREEZE_REQ_DONE BIT(0) +#define FREEZE_CSR_STATUS_UNFREEZE_REQ_DONE BIT(1) + +#define FREEZE_CSR_CTRL_FREEZE_REQ BIT(0) +#define FREEZE_CSR_CTRL_RESET_REQ BIT(1) +#define FREEZE_CSR_CTRL_UNFREEZE_REQ BIT(2) + +#define FREEZE_BRIDGE_NAME "freeze" + +struct altera_freeze_br_data { + struct device *dev; + void __iomem *base_addr; + bool enable; +}; + +/* + * Poll status until status bit is set or we have a timeout. + */ +static int altera_freeze_br_req_ack(struct altera_freeze_br_data *priv, + u32 timeout, u32 req_ack) +{ + struct device *dev = priv->dev; + void __iomem *csr_illegal_req_addr = priv->base_addr + + FREEZE_CSR_ILLEGAL_REQ_OFFSET; + u32 status, illegal, ctrl; + int ret = -ETIMEDOUT; + + do { + illegal = readl(csr_illegal_req_addr); + if (illegal) { + dev_err(dev, "illegal request detected 0x%x", illegal); + + writel(1, csr_illegal_req_addr); + + illegal = readl(csr_illegal_req_addr); + if (illegal) + dev_err(dev, "illegal request not cleared 0x%x", + illegal); + + ret = -EINVAL; + break; + } + + status = readl(priv->base_addr + FREEZE_CSR_STATUS_OFFSET); + dev_dbg(dev, "%s %x %x\n", __func__, status, req_ack); + status &= req_ack; + if (status) { + ctrl = readl(priv->base_addr + FREEZE_CSR_CTRL_OFFSET); + dev_dbg(dev, "%s request %x acknowledged %x %x\n", + __func__, req_ack, status, ctrl); + ret = 0; + break; + } + + udelay(1); + } while (timeout--); + + if (ret == -ETIMEDOUT) + dev_err(dev, "%s timeout waiting for 0x%x\n", + __func__, req_ack); + + return ret; +} + +static int altera_freeze_br_do_freeze(struct altera_freeze_br_data *priv, + u32 timeout) +{ + struct device *dev = priv->dev; + void __iomem *csr_ctrl_addr = priv->base_addr + + FREEZE_CSR_CTRL_OFFSET; + u32 status; + int ret; + + status = readl(priv->base_addr + FREEZE_CSR_STATUS_OFFSET); + + dev_dbg(dev, "%s %d %d\n", __func__, status, readl(csr_ctrl_addr)); + + if (status & FREEZE_CSR_STATUS_FREEZE_REQ_DONE) { + dev_dbg(dev, "%s bridge already disabled %d\n", + __func__, status); + return 0; + } else if (!(status & FREEZE_CSR_STATUS_UNFREEZE_REQ_DONE)) { + dev_err(dev, "%s bridge not enabled %d\n", __func__, status); + return -EINVAL; + } + + writel(FREEZE_CSR_CTRL_FREEZE_REQ, csr_ctrl_addr); + + ret = altera_freeze_br_req_ack(priv, timeout, + FREEZE_CSR_STATUS_FREEZE_REQ_DONE); + + if (ret) + writel(0, csr_ctrl_addr); + else + writel(FREEZE_CSR_CTRL_RESET_REQ, csr_ctrl_addr); + + return ret; +} + +static int altera_freeze_br_do_unfreeze(struct altera_freeze_br_data *priv, + u32 timeout) +{ + struct device *dev = priv->dev; + void __iomem *csr_ctrl_addr = priv->base_addr + + FREEZE_CSR_CTRL_OFFSET; + u32 status; + int ret; + + writel(0, csr_ctrl_addr); + + status = readl(priv->base_addr + FREEZE_CSR_STATUS_OFFSET); + + dev_dbg(dev, "%s %d %d\n", __func__, status, readl(csr_ctrl_addr)); + + if (status & FREEZE_CSR_STATUS_UNFREEZE_REQ_DONE) { + dev_dbg(dev, "%s bridge already enabled %d\n", + __func__, status); + return 0; + } else if (!(status & FREEZE_CSR_STATUS_FREEZE_REQ_DONE)) { + dev_err(dev, "%s bridge not frozen %d\n", __func__, status); + return -EINVAL; + } + + writel(FREEZE_CSR_CTRL_UNFREEZE_REQ, csr_ctrl_addr); + + ret = altera_freeze_br_req_ack(priv, timeout, + FREEZE_CSR_STATUS_UNFREEZE_REQ_DONE); + + status = readl(priv->base_addr + FREEZE_CSR_STATUS_OFFSET); + + dev_dbg(dev, "%s %d %d\n", __func__, status, readl(csr_ctrl_addr)); + + writel(0, csr_ctrl_addr); + + return ret; +} + +/* + * enable = 1 : allow traffic through the bridge + * enable = 0 : disable traffic through the bridge + */ +static int altera_freeze_br_enable_set(struct fpga_bridge *bridge, + bool enable) +{ + struct altera_freeze_br_data *priv = bridge->priv; + struct fpga_image_info *info = bridge->info; + u32 timeout = 0; + int ret; + + if (enable) { + if (info) + timeout = info->enable_timeout_us; + + ret = altera_freeze_br_do_unfreeze(bridge->priv, timeout); + } else { + if (info) + timeout = info->disable_timeout_us; + + ret = altera_freeze_br_do_freeze(bridge->priv, timeout); + } + + if (!ret) + priv->enable = enable; + + return ret; +} + +static int altera_freeze_br_enable_show(struct fpga_bridge *bridge) +{ + struct altera_freeze_br_data *priv = bridge->priv; + + return priv->enable; +} + +static struct fpga_bridge_ops altera_freeze_br_br_ops = { + .enable_set = altera_freeze_br_enable_set, + .enable_show = altera_freeze_br_enable_show, +}; + +static const struct of_device_id altera_freeze_br_of_match[] = { + { .compatible = "altr,freeze-bridge-controller", }, + {}, +}; +MODULE_DEVICE_TABLE(of, altera_freeze_br_of_match); + +static int altera_freeze_br_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct device_node *np = pdev->dev.of_node; + struct altera_freeze_br_data *priv; + struct resource *res; + u32 status, revision; + + if (!np) + return -ENODEV; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->dev = dev; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + priv->base_addr = devm_ioremap_resource(dev, res); + if (IS_ERR(priv->base_addr)) + return PTR_ERR(priv->base_addr); + + status = readl(priv->base_addr + FREEZE_CSR_STATUS_OFFSET); + if (status & FREEZE_CSR_STATUS_UNFREEZE_REQ_DONE) + priv->enable = 1; + + revision = readl(priv->base_addr + FREEZE_CSR_REG_VERSION); + if (revision != FREEZE_CSR_SUPPORTED_VERSION) + dev_warn(dev, + "%s Freeze Controller unexpected revision %d != %d\n", + __func__, revision, FREEZE_CSR_SUPPORTED_VERSION); + + return fpga_bridge_register(dev, FREEZE_BRIDGE_NAME, + &altera_freeze_br_br_ops, priv); +} + +static int altera_freeze_br_remove(struct platform_device *pdev) +{ + fpga_bridge_unregister(&pdev->dev); + + return 0; +} + +static struct platform_driver altera_freeze_br_driver = { + .probe = altera_freeze_br_probe, + .remove = altera_freeze_br_remove, + .driver = { + .name = "altera_freeze_br", + .of_match_table = of_match_ptr(altera_freeze_br_of_match), + }, +}; + +module_platform_driver(altera_freeze_br_driver); + +MODULE_DESCRIPTION("Altera Freeze Bridge"); +MODULE_AUTHOR("Alan Tull "); +MODULE_LICENSE("GPL v2"); -- 2.9.3