Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966013AbcJYPMW (ORCPT ); Tue, 25 Oct 2016 11:12:22 -0400 Received: from mail-by2nam01on0062.outbound.protection.outlook.com ([104.47.34.62]:19540 "EHLO NAM01-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S965936AbcJYPL5 (ORCPT ); Tue, 25 Oct 2016 11:11:57 -0400 Authentication-Results: spf=fail (sender IP is 66.35.236.227) smtp.mailfrom=opensource.altera.com; ettus.com; dkim=pass (signature was verified) header.d=altera.onmicrosoft.com;ettus.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 , Joel Holdsworth , Ian Campbell , "Jon Masters" , Julia Cartwright , Michal Simek , Jonathan Corbet , "Cyril Chemparathy" , Matthew Gerlach , Dinh Nguyen , , , , , , Alan Tull Subject: [PATCH v21 8/9] fpga: add altera freeze bridge support Date: Tue, 25 Oct 2016 09:55:39 -0500 Message-ID: <20161025145540.3722-9-atull@opensource.altera.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20161025145540.3722-1-atull@opensource.altera.com> References: <20161025145540.3722-1-atull@opensource.altera.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [64.129.157.38] X-ClientProxiedBy: BY2PR11CA0017.namprd11.prod.outlook.com (10.163.150.27) To CY1PR03MB1518.namprd03.prod.outlook.com (10.163.17.24) X-MS-Office365-Filtering-Correlation-Id: 76c34a7c-5de6-4b67-c902-08d3fce71890 X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1518;2:mQUUaBdgzeZdv/WT66fhcw7cuKBdqKBWGuPAOCkNQNXG1kqqDp7FCMPYE/3RmOfLcE2rUvZoVWPUyBoJdolRKBMuyOvYwFH5ZoBRtP+nXD2pw53bD0oiCSnnU0b6fzWC/+wwnhSIo/y3enbzU8CpXCwSGFkiIWVrxfOJUDmpdmtja348ONEj4bW5Rc+tNyQkLbngjP1Vwq1rr2qSeGag2w==;3:MUga3WfitDC6t9B0b2PKA4XbJH/F2fG6ZaynHofowgafMza0IBtHifJB54knOgNAE979obc4LTiFx/oiI1Jg1mZndBv2BVI755OnSfxF3K2S3WqyDt4pTcnjTvzJuXHt7KHBfMrCe1DwZvI/W+RGmg== X-Microsoft-Antispam-Untrusted: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR03MB1518; X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1518;25:ux8wBPDunk0LAt49ujO6iUtFf2uEEVAbrEEu5DvQ/t1f4P2T0hZEetQ9qQrkVzR1tNrG5xUHLnnLOZpi79fXfVZsSoIfb+j4fjIdHyS13Rdrzu5l2NjKf6EzLN5PRil2bIoQxYLYxjR49gC8Yr8e+2hdwopghj/NiL1PxCrdMUlENe0mSBJQaJdLQwZ9xZim0gkEQ/q67RNXxdCHPqFsUyb9M4fRDK4keQ7lLbcllzh2znaz4ZtVuZXt1uzGFL+dPTLTlcHXlbujbir8s4vCOsqld1ka5J0L4Ol8D/gNXhXEFFIXRVB9GDr9YuxyJwW9GndHlpu/ud+R5fp8xqrdR57kmcNMXsQV0CLIukFtwGgB8gZpIfRwjZiEZjT9wnnsSmV9a7rk43sZkYIMrDtT/gVsUzLnYqZcpBZWvDSQa4OdZnFqM9n8ijMZeTXnkzK/taAoJUfBThu16+5RCkiy3v6EMy0VDQNuUoagZdUMRNRLmX6kMc0BFbP6Gu+vcbSUCFRvcVUHKtFx3CMlhvullIjab73L0JWDMMRyXiKV8UgbuRcRp6x1imzKUTSD3psWeJ2bq/GXDEKjQ5LrDrH64R2NbiJD+geRa6KmfdJ+KU0dY3wlp5w2FYw+/Te5fNKq8lDKBKxtEqaNE/ZLnk4K12T0V0eJ2tudP+jQcteLYgZ3g3qRW8/DpLSRD7gHY4UEH65tCta+LNIONHmILpJRQ9vjX7pobmrQbSBBvXpWq7Y21wwsVF0PUPVXmC0V69pAo6Wi0Kc7Moq5nGada41qbFoBZhh/UGArIM58ck0MmCa77Iij4B8VkSp/4nM6kh7J4UmSquQO7GCKIX60h5pUZF+88q7iarI9j6IneS0xekfK16AhaVspanXSFhUMd4MG X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1518;31:m5SR/fk4T7Uwo5X117FkJa9NFVv/8m1ciXz5HX/oFBc3AogZvO7ARjHSD1OngZRkt+5UrprEGwWhqSyvhswb3NPpbXZW1qEM8dxbvIA+AHN9zYNSF51YWxS94/wwa/wfQUZyicH1FUtqaKYRz9PcDj+fqUg7+SZHq7LLoZqeqUilRVpNA5A+E6hgCtV6D+XMhoGjAKi0DatLcyRz7PSWgu/xhB9ZnbgoaQ+eDaXUxjolHXtTo0EodP53CBcx5sAsSBPPPZud5/mri773MtHPmg==;20:jJDiiHWeFMhTohIDf0eyUMfpAOFkkelprUtOsRO5si/4KRkMpDfN5Y6NfSmAWbjl+ldUUJ4VwnfbjaFRz2gpvhyVKm7Cy6H3OC72luMi+Sqz9ZI3t9ZEI4ZL0/nV5Bzpbr7QVVtZgycstaecJA29EocOCM67xYUy1R8uPA+MxbY= 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)(5005006)(8121501046)(3002001)(10201501046)(6055026);SRVR:CY1PR03MB1518;BCL:0;PCL:0;RULEID:;SRVR:CY1PR03MB1518;BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(13023025)(13024025)(13015025)(13018025)(13017025)(8121501046)(5005006)(3002001)(10201501046)(6055026)(6072056);SRVR:BLUPR03MB280;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB280; X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1518;4:v7XAxVf1QuAg7hwdOZLPB3IUpp9IPmbDBdatT84RjH9Te6GRQ/DCACqF43ZZpzUJBYsmL7fS8uUXxvwyzaBd6zIIhnxYVtZpYjYL5HxOS3q+pAY0EoRw1KdOy4gvwQ3xUwiiL2gYeJMqBm66t54HFKP/Vu4Jbs/uQd1FKiLjp3cpHUz6nyzpuA+ZPPo00vkpAZBhzRfv0maIxY+fo3Wtx07LvUs1brQ3/h1UAtTUsBDapiXVz++PfChov5iDtgIYHgiG/QzkEnsk41cJU2p0cPDwjGv+u4KwCVjGJd9R6H6YibE7mLuvLmSYnPHmw4KCpKXC+ujD5OCfeJXEVNTpjvri2o9JejNwzpuHBMtAxN0bu2DUSdvAgCJRWnn0QbQI3+FCaTaEEAMvkfBSNI4sA3w1tLDm0zPWoa+Tt2kfMDtU+qwZVqG5w5Tx9z8hnVzDuw5smup68r0tyddTr9r6eoI5tKci0SDSI7TgbgMeGwH2mu859vkjhTN2wZmjV9aOAY+ElGTJd/PiOUy7H79s5uL+Y5t98ha3vpg7rKGmSRs= X-Forefront-PRVS: 01068D0A20 X-Forefront-Antispam-Report-Untrusted: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(7916002)(189002)(199003)(189998001)(4001430100002)(42186005)(7846002)(81166006)(8676002)(229853001)(106356001)(50226002)(69596002)(5660300001)(2950100002)(7416002)(1076002)(586003)(6666003)(107886002)(7736002)(68736007)(97736004)(42882006)(3846002)(81156014)(6116002)(305945005)(53416004)(2906002)(86362001)(77096005)(66066001)(33646002)(19580395003)(19580405001)(50466002)(15975445007)(76176999)(110136003)(47776003)(5003940100001)(48376002)(50986999)(92566002)(4326007)(105586002)(101416001)(8666005)(7059030)(2004002);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR03MB1518;H:linuxheads99.altera.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:0;LANG:en; X-Microsoft-Exchange-Diagnostics-untrusted: =?us-ascii?Q?1;CY1PR03MB1518;23:Squ1rnx3pB41zllTX+jnYtx0WLVIoOTUzY3yp7heH?= =?us-ascii?Q?a/c5xY7pVrSIKkjREJZZ+sod1wPnq+pIUat8W3oCiIh09kJVaIjWUWE5y6sW?= =?us-ascii?Q?9IMyOOcIKavC5teJmVtYfcYaJtOwf8p6eotb0h2TLuN2VA93wHea9f8k1f2z?= =?us-ascii?Q?sJh1SjZ/CSyG5yO0VVqdpAwNnKMG7eZJmQ4Bvh/LKZYYf3VpEIAtpQj0aNN0?= =?us-ascii?Q?qa5++IZ9haiOGPfwSAoTn2v0ie0SFCIQ+oowUCvGP8YUaG5g4xCetpPxpIMh?= =?us-ascii?Q?6xPcqMLKft0VKkeTdPrAHpUfNl+pJr0hcZMn+Ra42y4qZzeDmn0YqvJuNd7P?= =?us-ascii?Q?uznh70ulf3pRUbE+XouAe5t/gL1u6RbruFjxOU6vN59BbCE3EEZMbawuMrkX?= =?us-ascii?Q?z2k+bB8QBv2feuVLnWjTtozbZbTGTeD6a4fLCANiUgdhR0audoZEY4rhrNfs?= =?us-ascii?Q?h91HZ5uerYpQevlAOwcjK7iWZZm3ovd9Hs/crNLVkRYMzQ0KKfq0CwbRE+et?= =?us-ascii?Q?pm1KGu3LnRbGVEbfYX/jieOUZoRqg95z0kXuxSARJEOwP52DQNHu+PyTWJrG?= =?us-ascii?Q?/KktTuXUhARRgrqPvyyH4tdp+fR07RWFHNs+4JD4xtDIQFp2RRCWecBOca+j?= =?us-ascii?Q?TDiWK2TMkaXM9BSKsWWWf6yJVRBxJt4yguzqEpHa0eAfZXyZJ6+pkohe/ROV?= =?us-ascii?Q?1tX5V6tudnm0bm/j1np4exQYYHj+tEF92xQN6NZ7EkGiPpSizeYJS77Bnqyq?= =?us-ascii?Q?oVPvRhw8e8+OUd2rHB2NEaygtEkmb/QJcCNlQD9IeUvrG2iltHJoRC4WCVfV?= =?us-ascii?Q?c2/A0J8rbdSnOORkSJTUa1/TI8eRGHzuV/C7h3WNaFENp1LQA3FDSKliRL9p?= =?us-ascii?Q?GejgW71ZvecGX7gvE8/a6k1o2J28F1vQkaqcI0U+blwOboqvQkNmF721X1zo?= =?us-ascii?Q?jSXknefI5OKpW31QvDR9ShKKLB9K5u2KhUbw0M4latvOMmK7j01S0VjdP4qc?= =?us-ascii?Q?tcHINmydWqnGF4msFntnyeEgC3Z2yY2Be38wOX4gaGS+ZkCj71N+wCyRPw/u?= =?us-ascii?Q?dOUHEG/qBuBJYr7SZkRdgAtqfeHb+BZKw9GXUo9EkiFq/rGCRK2lIjMf6jvP?= =?us-ascii?Q?dVkdQj/mFqlRt9Ikc5bK9stbqHFCWEeLQP+hzRmH/5HHE33iELHz/dJHMPul?= =?us-ascii?Q?Epy2wZ3js+4HhYT9aderraFQ0qGMafaVYMMNw7TrNMFKnEVDToDUOGgXk304?= =?us-ascii?Q?M0/Mc6HGzOBZ8io0FB9Lh/3zF78CUb2QPU1/veE?= X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1518;6:NBQBJEqar7cXCDpcj3SdTOiBXsZHm8fxn+czEKBdgEPzPuc1LMW8iakdlmDP6L75Ko9k1I9pYc/VOhxyxZA235tFXIvPwIYJFCF4wsGv1RqNkspGrKpNQ8xqNBVsJjPWBK46pEpFM0Eti/ZPM5nLr0l/gKeu0JS53bVm0eTsPQOqWPWjCYM5uSWRzky89sedtFt0WDpSPVwbxhBTZG1BtaKNXI4CNzHtQcZ6JiW7SZm+nVkKK5+GUKrXsHUadvUycME3Xup/hcQrpV5geAAaF0Ouuly76w8GXW5Ndnw1A0J/GQQrSTEdXIUrsktYmUNSwsW3W48msh07N1GX3L9MeYcy23GzPkHanEo9Y9M2gIk=;5:8nVEnQnQrzEcjL2W2GhfnSQ5AvOLrZ/TnAVDJ4ap2+X6iPbte0tasiwluPFLhbvf4v7nO6KMCPV1ZEVFc3XluAy/WjumcNKBDzg04mp8TvFJJuuPh4hAC9yIOUlB/eB67NztT8OntVsbaixLyBMH0ATLC2seC48yNDWN9HqLlwM=;24:gJONeX6Zib2IieV3UEoKE6ePOD7gFC0X0FrMlQNj5ZgRZ1yPjaDX2jYcLBEFg74oW8uhyDG2+h94lcypq64PsBCO7UM51JpAdcwg3GxOvkU= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1518;7:pj6A0VNL/818Q441dQvmNjLyg5tSVMZIP61WBwWSjwIgGCQYaTWmuZ+yezh+5NwQ+TksWxaJbSuux7tlaY/47zbx+L44Bjvm/ohpBkqRvKXiqK/xQQtuicIE8fVAgH63/B41sHMu7Hetk5Zx3WmzhohDYpz+jT7cnOawxqwgUjNy6JgN1sbtAL5YerdO7cW2mRxMVb8PeaXpBmjqdUyMbcG+UgGhHPO7hwMKw4dKmH9Aiw6v2ec9NUhfRrQuydhBDwDhWQncLSUQMEAZhlD+ErSNSL9MgoIVXqeZJJh9iaaD/PVwltJ9Ys5onKnw5QE/WfITi/2WGH/JWH0bfoOzqwm8sRFfvFD4pN3PKCg+O+o= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR03MB1518 X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: BL2FFO11FD028.protection.gbl X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:66.35.236.227;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(2950100002)(956001)(336002)(50466002)(8676002)(86362001)(42882006)(81156014)(3720700001)(106466001)(53416004)(97736004)(105606002)(68736007)(1076002)(110136003)(50986999)(6070500001)(50226002)(5660300001)(76176999)(189998001)(229853001)(19580405001)(92566002)(107886002)(6666003)(4001430100002)(305945005)(7736002)(356003)(11100500001)(66066001)(8936002)(5003940100001)(15975445007)(2906002)(47776003)(7416002)(8666005)(77096005)(85426001)(87936001)(626004)(7846002)(586003)(81166006)(4326007)(33646002)(6116002)(3846002)(48376002)(19580395003)(7099028)(7059030)(2004002);DIR:OUT;SFP:1101;SCL:1;SRVR:BLUPR03MB280;H:sj-itexedge03.altera.priv.altera.com;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:0;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11FD028;1:FZuPRT8E+4H7EPi9z+AxLTrx8nyatuNTI9jxJR/t2jG6vgz/JKhbuF/iWeLgPttXhyO1HrXDY12+5Zqo0UvAV78c3K7/fOKy9Sgyq80m1n1DbofkchPqgEXd8SoD7SeEU8zXNriPUhKFKDu57cumSkDsLCzO5ikfVB0EhGLt5ht5xHf5bEPF+28Qiz/daGAxcTqf/6yG87sdLNN25RauoL5iRT6AGN75GLK8Qlt9i0MRQYkWVK0/frru2y/y3rKyX7OKmB6EGKN0HMuTe7FekUkbB7pw0hhFlAFu2Hb/8z9kwoAD4TXYWsibESdZ6FG1KKzRUB3ZRzdPUAZ4m1YF7Q/05BP+ClTaZao36KOtBhqTKnD2td6mLF7VeMmUtz5WaRxeIyDMc6wKkDXDOO+9QXkxab3d19QStVOaw13AQl5HXLR+tQrfTfdg6orhirl8a0eD6ntwZM8JHT8ZqvuyWr3XOtR19ZqV3wIDb0J+NmaFC+vllp3h6pA7+iFnw1NqlmfxqLIBSpCWgKuDsRefvyWBjKdiXvPMntEtqcRPqjUb6/u82Jsott7ENJXICxi/74TEK3mUz4aDA2MOdgGchMtacpZuWLb9IRaTQBfdg7EkApFwiasu/MftIRIDeaMQ X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB280;2:2e9Spo2CuUJPmrUS1CCG4IqJhqNkRXRdgGo8H9NPbkypFwGgisVCbreVbXd3noiacemUkRMgXV0fKZcOkwRVNuwI4qDD3YZgH5N7a4Gcfwf7/ad/yHo8CzcDkgox/SQ1aNqy9whCrS9sjSKu0VLU8vIfrLJZiR6TEgAwcgZwmkLl44YHb1sakJ85hY0aOfs6oF/VoEVyzx8id9ZUtdZUAA==;3:5JWCJF6tPRfKMkv6sVsH5aSGlvxR5uSpGQlE0YbB7cSVhclsKXu0ln0BbU7uiZqXeGHEgSIE4vhzwokS4IveVwZWdcjrbZTedYTEphdGcMWxmsNy4lx368zDg7agKZM9h/76/LuIQWwRc1o+DgwmB27zzVTLRLXmpmLJzb3NVpRNTH6Wvg3i+b237C94U2wwASylmJMmf+XyF18Fwq/gLZi+zwGgm91nOf+BAZbUe72vQXipj8KYdvOsF+MDIsUQbgzXX3FzJnHRkXshOpFuYA==;25:8xc8pN8UEAS7C6XyKGPTvakh/zhCAEx/wgPKoBl7Mhw1srtb5YsydRkOaBcdM+mgITZRyHZ+eFGSW4bYZMmx5MXa4Epzsche28swAKrmqsVLzVqAAqwtWkRnLOsb/AG+OBBjDZD4+tCciaKl3OR4w0ju2qeVhNP1kMhvcEDhXkFYsFMyvD13vs7ZufpkyrC7Nwcx17k/FFRtx+hxbZKN2GRPrKUadZcYivVpVFor16jxPc5T/s74S9Djzsm+/d7/6pjNgscx2F9UC/e2oI8NEX17H4B90YSIx6QSvf4G0aR/aGh0XISfpkorwWGipJ4u3Hnaxu5Ombb4PAQ/ZvMV0aiy6viP4GKRtX0BUEu+vO+Pf0IWBFaO/kFrEn/798t4t4W6k6gm9xBJyEeF0b3eUakrxViByUm82K6t3xfRbaomZjEpwhVYqAVyZUdyDxYgE2J4U03FmGQFuh/oBDdtpA== X-DkimResult-Test: Passed X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(3001016);SRVR:BLUPR03MB280; X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB280;31:hy2d4ZNy6aDQAbM2NH6V/8DakgVqWley5nwTyXs+499EZb7VxM23mnE3W2tykeZNxU1zIKb4yZNQ+wJbGQ1htdn5tYoXIZKjxsQ5NZ7hjh+qgS3IFpBLgqdoRxIwOb3CfamDPfsOoL7HXloikI/p5QIQCxfu3Cdg6qKIn/pE8XtOZUGbU8AWucqfi45xoCfN7eeLqlk9+ikyPoQLrDtyj2epsVdl2iii9S7Vj29SOSgypOt1S8nVz7DMcIvNCSpKlBlDkuK10buzocJ7XvTk1wjNVCho8hxJ3KmEGwSRp1g=;20:J05QblmsulUJsueR/9xuPIMMfo89nDZHRZMd08/5thPMFRQSy9QgmOjre0ZnYujtSegUN3163PzC9s8sR2qX/kpLGS2vcS7SRPRFOsn/dVYdDfxOhA4GDQkU28oUhf3aQBEdpYcOBY7QqFTZiPD5MuIcY39uBge+p1rk1i5hWvk= X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB280;4:d1k9PgYcfAbb7QaIY2Cw6VplT5IzwZxfgkbucJG6Iwt+QKvnk7evWkPPMd8gBd2/ZK46d8Medxm/o8fGGn8JloTh+9dh3vaBr9JdaZold2KfX4UB/4wSb2G2sxbyVyfuhTpCt1hbb8Dfcpk+J+kSd4tqlSJijVvGt8CQAD0yKRP4yW+RzjvjyBN5p/nQ1SF25fFDKTrRjfrDV/xlIpTRmBTK2X2ZlJjhgCNAWdres1Z8itOaBJhxnEL2rmhOs9IBL4j71Bxel528EMZdP+No6uPP58FcaNp1kEu9bQoYKg9UHK1GFPKhlvYEnH4rV5EgLH7MxhSDCNK2DA+qE1wpmewy5EOrnlbPYG4xDiCtwtt/gmG+iuETJ3/E8zY2Jv58Kb+IyxzistP+GU+46o9rFspz9ZdnpQpNN8g2LxSYTFmyWcmzzkeNn1MeNgH2CVqn47Aa4G/jRchoefBO1CT8r+NXVQnsKPv94BiVRQLCHfC9JxT3/7WB6AhPhxqIyax3ITyjLsGlrs3Hd8Z5J85DBo/u0syx8/W7+jSkPPxaUq1M1KWYOW/blIUniBoh6kTtV8YWKFqhe14prHK4YfAwBkO9hGxz65d68Fnt+DSHQGgNH+AchnlgblCY5R5r/F47u/ZmNgmd3z3lhikIBxHe3w== X-Forefront-PRVS: 01068D0A20 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BLUPR03MB280;23:RcjcvH8SkGNhBtVLsaLHy550LQk4qE+6+a6CibuGRY?= =?us-ascii?Q?BQ1pSJGol3OBAeDRhnHbEokBEXzL57SKoE8XMiGUDYhtflXXk47u8fXWSwsU?= =?us-ascii?Q?Y22PcVwuLMQhNXiwxn+YdgcEZLjT+xkHR+Qn+xaz+vKwTKcsNoAVHeaRo+qS?= =?us-ascii?Q?htDeNJvyP5Waj+4nkhWkp0+QKm15mIIYfKd3dc28O87b9BMJ8Xk5Kc75MDs/?= =?us-ascii?Q?y43iLDZ7RatMOnQq9FX2gL8clJs/Z/Rm3LKbceT2zV5Q2R3aAJ70nLudJsRt?= =?us-ascii?Q?3i+uqgDqSKGpeq547RxPtg3YFjVmWvNkHqPPkc+PMVEcc3VvvHkfEHjyd1ob?= =?us-ascii?Q?/Rum33u4IjLsKwCXUpCduSJ/q517y0GW7OfYmw5doW6hDsfWDB8EpLon5KV9?= =?us-ascii?Q?Cw8KSDxfMiNHa4ofLxzA56nXXc8n9uWFbbFKcwCQmKUHUHUAGFQw0lHgCI62?= =?us-ascii?Q?0BP7esxgV7sTwyAc1xoql2Jlt6nbEsQIusTt4NtIPitUPqNDCGQdmv2H//PV?= =?us-ascii?Q?xfIPlSUQjzxF2O3Dy/c3JrVWYgV4EYNP6sh5lvDDApjwnSdq5qLTrjqLeZP6?= =?us-ascii?Q?sQq/8qw/ERziGpcVnk3lRI9LY+veF9OoqDXlSVJ/9pCAZG9XPqpz1jHtYTwH?= =?us-ascii?Q?UWAU7i+az9U9snFIljD8ux3exSScvuVXGHOqIOo7CO9GWwpMAwXOwNg8/pVi?= =?us-ascii?Q?RYG3Dp6fmGsV13bTywnrdNyuI131HvCG90au6nZOHjqVXSvUuBwMI10tzZXv?= =?us-ascii?Q?XbWoT9Z+C5ug98ALmrT7WYUaC/y4LNslpEv6d+OOyUmsllTUvTlOTWwD0Zu2?= =?us-ascii?Q?Tl4H2PdmkScmLmhVrZ8aaNTS99k3icjTE+bgVMwwR+xv9jT8L1vdqn3VtGGk?= =?us-ascii?Q?pM3NoJYxawNtl1L0lzKX9lclg3s6d2wim9mGDgx/Dl76T03e63r7dPSl3l//?= =?us-ascii?Q?VU/aWCwkpxdNRU6TD21+um8JWAAPFPBlPXGsA2TUIWZRhUG0WCy82gGNti4c?= =?us-ascii?Q?NPmKTv8YoFuAXiO9CUSbreXiEKGzIGKJ8QB3IUKzNa9YaHl1yiAGI87GPtv1?= =?us-ascii?Q?pIyHSYpJb98ZfiGUMKzcpmGG70kHGPzwvLbKkC2rPR1Y8mucA7bFmOOrgmI8?= =?us-ascii?Q?DMPR9Qqlydm96o6FeCzTqXprltpFK2kulDgeHeKRTid+yj9/3wMuOolt7IRS?= =?us-ascii?Q?WI6rht99FQHtMGb94bDeLC5mun2d+Uuhc1utNItXolzW1sfw2m2nIXwWrL9L?= =?us-ascii?Q?drzXUO74zoQNkdH+zbPxU1KBK2BcF+igdzya66UMM/kR9DufIj1FcBOTK0ge?= =?us-ascii?Q?Cdf7bSDH3Sq1eoKiq0FmBvxBk8pzl6jreRSVGY0YPshS/e51NTNROQEt7cmf?= =?us-ascii?Q?yyb8ReG6+vIMRgXWPMf7l9wlLmcvq6QIMsN2zQYbo8+uj948AtBlYQZ91tHT?= =?us-ascii?Q?ZAe826FZKlOWur+e+GLt9C34amK/EeP9BXcggwb22Aan4nmQH5uk+B2B91f7?= =?us-ascii?Q?63ADuYRec0vw=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB280;6:EViFkIbsdkYp+HHPOYHIBtSB9SOGSXiKCDEBtNh9X7wJQLrEN5XMTj//L7rRUdWM1AauuwY4KNCBC753ZroicRZqblakZ8w85nxDwq+92z9QoyLIbamlQ3DilJjPAvvc5Y7IBW9A3DuXa72Y74FswDIR0GWcnVa4jcH6uXEWBQIsMp/+3GMeF4V61eJPyWm93A1UTUeOBQFF04ujtXmRVD3ey0/+KZY7Rva2y/Y6bnJ0al8NzkFABLr6LIL3FciumRA8SK+AVMCs7/vcSPp447XLepI17E8HDcuMwxh8zFK4jgalQBaTr9fnVLq5MlXSKaCqIWve9ZHwOxLHr4yZVvCnIQLVPBUIcUZQcQXKefg=;5:JLApEveFoBDq/U57XLo0AfeRuinjBMoqaB0iw3uNhd7oL/QZNqWR4DAFqiR+5J2FsKuUzTkm5OK9mz+OKpbfCg/Aszwv5I/cxJv1//5jseDMfZbfvoi11kDaj6OGuqkoCRLVMGdBcTXeEEdIuI+VmglWQy8QClI8AL2lT7T9d4E=;24:lKFovz5QQcQco7YXO8ERr/jkyxswGAPWRXL50wgj+Pu/UWtFilXVWhPcRGJjGcxovRbI2FedNcpY7xWV8imEs1Tm03J/q5EiWba/jH00GS4= X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB280;7:5bD2AhzmT/2c4JZomBT603zGp14PAJrYJiGDttNmdUkZtRSp7MKDZqv1fRnFd2jn5oNua1b19rHgz0uobFlsVar+TsAOXUQUxFuJkqF7cTZsHrkeRtsjB74BfQK5sEC7PEaXS20uyqABC/i1opJXUEMEMSO4eVj/2HQ9ngWV9dT0cfO3SqfdDDpnbM5OZbxqK7A+d3hYM/o5wHOEvDWOh0XFMqF0OAJaK0fy1q0NqG5wtTxjLHiVDr9GnSPAQKpKH8kxP2SJVMgaapSiiiSjnsLeTK4oiEEP6jjpLS5JS5nxLY5EZpKQ5bPSeQfjtsdbYEoHhsIgl8q7qWDo9ZOcUw== X-OriginatorOrg: opensource.altera.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Oct 2016 14:56:26.4322 (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: BLUPR03MB280 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 9558 Lines: 331 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 v20: No change for this patch in v20 of patchset v21: No change for this patch in v21 of patchset --- 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 5605ad6..8fe6a84 100644 --- a/drivers/fpga/Kconfig +++ b/drivers/fpga/Kconfig @@ -47,6 +47,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.10.1