Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754277AbcKATQa (ORCPT ); Tue, 1 Nov 2016 15:16:30 -0400 Received: from mail-cys01nam02on0059.outbound.protection.outlook.com ([104.47.37.59]:37024 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753273AbcKATP0 (ORCPT ); Tue, 1 Nov 2016 15:15:26 -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: Greg Kroah-Hartman CC: Rob Herring , , "Moritz Fischer" , Dinh Nguyen , , Alan Tull , Matthew Gerlach Subject: [[PATCH repost v21] 10/11] fpga: add altera freeze bridge support Date: Tue, 1 Nov 2016 14:14:31 -0500 Message-ID: <1478027672-4857-11-git-send-email-atull@opensource.altera.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1478027672-4857-1-git-send-email-atull@opensource.altera.com> References: <1478027672-4857-1-git-send-email-atull@opensource.altera.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [67.164.136.211] X-ClientProxiedBy: CO2PR06CA030.namprd06.prod.outlook.com (10.141.242.30) To CY1PR03MB1519.namprd03.prod.outlook.com (10.163.17.25) X-MS-Office365-Filtering-Correlation-Id: fa3390c4-47c7-415d-3b73-08d4028b6d5c X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1519;2:ePGGzAZGpoR27ia70gWwwMqa3feBTzAEQN8WXifWpE7AcwoTrzK+cOH5sC46N0pkh6FV6BC1/cQMDsOmJ9vkqfAW8s1QELGVOxKXqDLkQ4Rckg/czThI+uuXQu+hmv+r5oBF9dRh5K37Bv8Aw4mmHtIujndDpyEB77OSuv08D1mThgP2UneM3Hkw6fH3slicnnjCmRZam6PxxlQ4kVGfJw==;3:YEDEc5fJieGBFFLkm6/qDrAzOBaBA8c38kBM7G+8tI97IBtzYS7Re/GXtACnEwxyxxS83ZHPBQCgd3s0Tq1mblNEjnyOKuF9gCZXNewrSuv5W+kmPvZyWIaEJMs66hia/dFnC/2gVGbjA4UwjZ/0hg==;25:WtcaxPgvlmRz4y/G5mhWJl1B+mh5dSrRrVFXE7ybSm7hAJPqHb9PTMBRZ6jhcrnooS3lsn/iQ6LBta+S4JGFRjvDNOsPRuMdId5DVW0B8jAn0eY8z2sq192VcmEchW9Zo941R41baFmDjFJ/i0sgRSEKPz/DRQIwZEZwOYlcfCejdtcbtuZBgWDQgGenQWMRo/fLa2zitrOI/oupymb7UEEegvstgtqJlb2LIa58d/cM+x+zVEf1apnZQ/0lEc0ONZ3NqUuaBx9xc1dbOMpU6Z0uy+Zl3BqRWS5+GK90E14AGOFXYDLg9kpRh+KHxThIlzsM2CpqpZV8a6oP6a3xHRsXw3t5bcoNTOGU/R5WS+i8Ka71SPzzfsEpwZ/iuHf1RmHoaS5DHinmjwuYzW0MCvq3xQdgNCKSU4gGImn3TXO270IjWRgO07zbzg17EL38nNCPlN93rtWRSGuAkO3ZDw== X-Microsoft-Antispam-Untrusted: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR03MB1519; X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1519;31:/Am9/FmOwJj6TAFcfxLnDe1Y74cadAf5mTTVw2xqpcXaquXJU5kCllBmG5UJ+sbEu2D2xNNoYEFt6bPnwWMWfiu2GYGAGiAirAPzBYtKX/cRFh3S7z3kA16tH9DRRINuJi1K82dd0SfYomTLT6mHEHwZeDje0iLkzJaSEwPlNIPTr8h8VMC7QN0JQUWJnh8Xhosxalsz8F6EIh0qzqk+55XwhWydMHHaT2/C6ZUurpI2KK06WEQzTFQ21e2mAsdB/AeNYpld09AX5ldb/pemh7cBdwr8/JI5Fupr01jvIA8=;20:QcLzPdqi/nl5QTJtgvB7aQH3vFvDFXBpAOry2dXoySsw9tQY1kOXSUM0UxekFDgVKurGBP6RCY2J/5rnu6vkReK837AbqfeXfBT5wFnoN2RuWzUn+KFPvCiUxsSiDuKFjYZEvWnuAVka4badZ1nR2q5tkfQROcpJ11bKvm46WLA= 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)(6045074)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6055026)(6046074)(6072074);SRVR:CY1PR03MB1519;BCL:0;PCL:0;RULEID:;SRVR:CY1PR03MB1519;BCL:0;PCL:0;RULEID:(6040176)(6045074)(601004)(2401047)(13018025)(5005006)(13017025)(13015025)(13024025)(13023025)(8121501046)(10201501046)(3002001)(6055026)(6046074)(6072074);SRVR:DM5PR03MB2492;BCL:0;PCL:0;RULEID:;SRVR:DM5PR03MB2492; X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1519;4:bzC3lj1z0V9TJYI1PjKWvk3HJZsU+4MdkwO6GQgqPfPx84bdWON5W/V1H4iaM1GFdRHevbGcoxbm/KSswYgwjCZyttOdZsk1nWo3xg5UKYPSuSotGjvQCu9YdsFu/FPw+dCH+7Q1/jDl6on4XDDdk3g5RDXX1uuh5Bg1UajZhHW+FSdCoF1KR4ruvFsDBIeHdlcNTmRIEY/KZvtDtGhBm7Tja7i1re9TKXqSMdsHf7XI6zoIY+LNe2kE3gLzMZkxmH9u6rYrBc9Lw0K8muQfxD6Iuhk4vBqFELugBMdciONijnvp9hj/BSZXZwc0069TgO1UlVtzVe1NCKeVcj+VtqqLOx+FlxKfEckAALT32qyzCoAm8XJ967MKVGzedrG/sxp8OfJhP0crG1S3baF+HcuufP7HV0+Jee8heCZFMCpZu6QPSFOsKmhKyXh6qK3/j9BaQUgERXVhcdqApY/9jFYxwjWwnuJc9qarwi2oSdH0iPle3SrZ+8aedpcaE1j06tzADUBB3zyYuh5ZI1mPvIZytYem8tUK3DoYE9rZAmlXpBYc4i/HdQ+kJvFa6WZYvXeA18DKLLnaZX5AeBLzGQ== X-Forefront-PRVS: 01136D2D90 X-Forefront-Antispam-Report-Untrusted: SFV:NSPM;SFS:(10009020)(4630300001)(979002)(6009001)(7916002)(189002)(199003)(92566002)(3846002)(77096005)(7846002)(19580395003)(19580405001)(6666003)(68736007)(81156014)(81166006)(4001430100002)(101416001)(86362001)(8676002)(5660300001)(76176999)(6116002)(305945005)(50986999)(2906002)(7736002)(33646002)(110136003)(66066001)(42882006)(42186005)(105586002)(47776003)(107886002)(5003940100001)(2950100002)(586003)(6916009)(229853001)(4326007)(15975445007)(48376002)(106356001)(50466002)(189998001)(50226002)(97736004)(2004002)(969003)(989001)(999001)(1009001)(1019001);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR03MB1519;H:atull-VirtualBox.hsd1.nm.comcast.net;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:0;LANG:en; X-Microsoft-Exchange-Diagnostics-untrusted: =?us-ascii?Q?1;CY1PR03MB1519;23:FlykQ6Hp+JJf7cUYRZi4QG/MnN9LcQckq3tILvOSd?= =?us-ascii?Q?0r8WmT1qlyupMkrXqnQIe3ButuT/cmfLr2qIZeC6Dn2avcalHTxXmeZyikrk?= =?us-ascii?Q?vz7MwnFHUyDLauRl1G03WrfqVZUVkKdLwd3u7fFi6u6msUGQ3quFTVgX7v7k?= =?us-ascii?Q?TvfTCVoOcdSSFUmVcYGmbdtcLnutjlQxFnv31RYDEAOM1j2r2VJTdZyTpgk9?= =?us-ascii?Q?RsoDI+t6n5mChAizOkXSfIcv6l5QuAsJO/kDoQIT+ruwG0dqGKUHDm9/es42?= =?us-ascii?Q?H1S51KqwrqZsw5Y+j9/fZeOCnjktRj++r+mJggrCAQkaQ+fgMeGr90qnpUOH?= =?us-ascii?Q?Hp3VupIjjQJ2sfbrPR7NuCZuDoaU8Skj8ssUQBnD5H8mPuKeaeNUEilHphsu?= =?us-ascii?Q?EOj6wtuJFJqvrirZUxb2BchPTjNXv/L7kw0txC0XiH4DaYpAC6r2VYGapsix?= =?us-ascii?Q?npyv5xv9AG/lSVChvi0DtIo+OeS+QR9gmcKyf4jR6YhqayEJqK33PeaQcEFZ?= =?us-ascii?Q?dcy1GHr8WsJ3JVihrG535wiEV8VQii58gz8y58kTAnWYSc6RweJ8/CeuuQt8?= =?us-ascii?Q?WNtH2tf9OwO+udSUPELIIjVkJ+UW//3x07j3FQ87zEIpOI4/UKujsZokxQ58?= =?us-ascii?Q?LpGM8S5z8a8rFCgE1MF2F4gUPYE2I9ZCs0MdKRjdyWp8O/avJuVBvzZLqJwI?= =?us-ascii?Q?xHQ3ECX71fY47e3MX2raaF02/dSDproJKGoGu5/Cx4lLnGyoZQWsS1aYPyuK?= =?us-ascii?Q?h0RUk3d5qy8GJalSLwkoxW3+Qv9APcDnkH+WHMLKazkAHaJySdBMo00tol9M?= =?us-ascii?Q?/+nMa3++gct4KJGX+aYU6Z3m16n3y2Y6nr1ATxGsHEj2FOg86OOxnqQRj8Uf?= =?us-ascii?Q?ng1uKcdFujRJckEiku9HXNdQME0qDOifgd4WJII6GhjF7UY4vKl794OLpfTV?= =?us-ascii?Q?LfSqVKO1ZAIYGa6zWWOtebWfF+/vK77AnXUc6ereCzP6KjjGgMSWH/f08amP?= =?us-ascii?Q?DFgBCCArd7ScSktoHSf7LPnF2mKLq4ddm2RdbVzjYFthx5i5Agi4G5Mhjjk6?= =?us-ascii?Q?1zq2NadAz93w+VM9KWw981aMUL0xgI9l908yOiQyEuqCIavC5K7QaSx20Do+?= =?us-ascii?Q?o6HRAnA7DZj+SqCVVJCmsVGYrEDA8/iFIC87jQtp5fCClDdsgk6jseiCH1g4?= =?us-ascii?Q?TN+/qfdoOCKN2Qnv7J4Kh7S1kwzwiq2dNThHeQx0QvLEQL/A6zr9GL8dclKY?= =?us-ascii?Q?3JeQJ71tfbGL9r/MSKhFD46vrf5lEpSoikk0UYz?= X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1519;6:sjqpHhgBBCk7Fu2HSuwYjwE9V9YbDDWIndJABxlkzyrih/0QceB49DihLVr+eHph4U0NiGlJCO2W5JQd1Yqe2mCovriIKwEM1vcvdm12w/00HMc4KjGWH5BPVPOympQzlJEacRMlDtDhhFCdCXcJo1SDgFqXkWorASmKHsiVQLZEqhgj3Zec1oUvte8whG42om0gk5qT+/YupbiTD2mgqj/5Iy4ukjJ36NrcoaBOcjm5gvh5eSXBmiadKCNsdyWSdgMG91it2p+GBVOvCCrdtkJK/kSXIVsRdEXBnBU3gYUDGKq7XmQpKHxzu0l0CC8UFPM+g8TqAc3UGLA1TCoqG0K8XP6Mxuq6FI75BEqSMXX0StK3OBm/nxhEBjl9Vk+E;5:ThA059xiswrAZO1K8LOK4LpI7kqPXhFLyGbKwQDX+a0xR8wo5nruMPJHMQWvLC499WvvNozVOMduhU3BC3RzbfBrCMYRRd/g1HHhXrW1L1FYbYLYjvTmFiVgtPXCfDXo0nmTV1ZDaqbkGYRvw1oFzg==;24:FOh69E1na+8+X3EAyT2g/3fF8NgtvRuuZPMAt6Owp3SW+13+nkhp3ArqExBMeI+alDyh6T17PcMJ1RdVaLOeIIRdNpJoDQav5h4uoTx5Ofk= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1519;7:0bLUQ6wMjkOcwVo+KMamP5hDQr3A4vtgF6cK7M2daL0Ad2xV+YgbtVEHjkxKpDI5hTzCj9KETc8qoj29p81DYyScYwuc2Up2k/yIuHBYXEo6Eagmrsa3I2prKvh8BqZXu/IWfFFkOQYhWglP1EgmSrZ3MQ1ZbiFr682x7xPZQozqrZxErJ8+OUnzvM3luQJZpyrGdPuKe4KPcbZczwSBbNLCDXusNMKDZpChsksXG9dvGxKtvgkVAnxfyBOHKrOwbtbW62y8pZC3FbzSIe+p1bICzmGPDRXsDqIxzh3FvJktNBpfeOt2c0KGo5o/32rmhDQuVbKSv7NJlEsrulcc/M1NC6UAdzhLejDSjlSjQDU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR03MB1519 X-EOPAttributedMessage: 0 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)(979002)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(105606002)(97736004)(4326007)(229853001)(6070500001)(48376002)(107886002)(8676002)(189998001)(66066001)(81156014)(33646002)(76176999)(81166006)(87936001)(2950100002)(42882006)(7846002)(6916009)(2906002)(19580395003)(50986999)(19580405001)(86362001)(336002)(106466001)(305945005)(626004)(7736002)(110136003)(15975445007)(3720700001)(956001)(5660300001)(50466002)(5003940100001)(92566002)(4001430100002)(50226002)(77096005)(85426001)(6666003)(6116002)(47776003)(356003)(8936002)(586003)(68736007)(3846002)(7099028)(2004002)(969003)(989001)(999001)(1009001)(1019001);DIR:OUT;SFP:1101;SCL:1;SRVR:DM5PR03MB2492;H:sj-itexedge03.altera.priv.altera.com;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:0;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11OLC008;1:QUqkI3J16rhNPbBPcb2vjHYvxn++1OGcgOIKzM0zF27kWxAIrIf6OR0TkbespMSxjX9k3s6PdWJ9Gh0+I4/OjfqxEr7/x4O2GwXIDGFMVa87MGBINFVmDOyZzVX3m53SQK+1dtZ5GNe9zw2v/d7i0Wr1PXGIdtSZXdm5tbPOVRj8BKjG4ClFMOk2wKAF9J1QdzXV1P+bH5wHRF2YIzbMVzT78sRfeiPla2hqZYntdo+OGcc91oswbp89nKfwtoKWqEImGex51vYPhIN8r8dobwuCxVdzqoml3SBZIi/6/r9vRGgtgGJnmm5HQH1RYb/TrQPBdZSc7iMDjBmOzLPorYB40qvoN5i/dkJU7qy/2CuIB4cda2b4eTeToRmViSr3uBLpIPytRFI6ANBdDqX7swwviccUawwNOzHsh2xOBx7G/x+ID6mlMu8n7exOXwnPCK8ruW9OzWU97inCrRXYOFwI0LQCiHAgWIlUksjMciD3lNUsm0MyI2/sgOY86G0takXyS5VhZAOkWAPtqu/653QvVVSnd9Id5X9lC9DgTZks9HEBvAG2F+6qhLyiIpZspbCTrOT1vzqt5MQcNWIkhg== X-MS-Exchange-Transport-CrossTenantHeadersStripped: BY2FFO11OLC008.protection.gbl X-Microsoft-Exchange-Diagnostics: 1;DM5PR03MB2492;2:DMZwr4tiG7oZT3DHPZqLNt9D9dNxMnOLx3xyrfXO44VeoFzvouNrXCRCTLfuJjl3E8n4nlffBUM8oInpP8oV5fAvxxkIhggVbZWair1Vks+2RJnaFxGSXzMHxpPpH8sG67tbGKzVDLD4raR7xLSEaTRDIKZvmhkdl5BXTB440DGTDiG+pdGzIhf42UgrWy8PVQgdtcJkrvSLdXilrycNOw==;3:/Fyl4DQs9fovxN2ouJtJQz2tX0nBxegzzopQ4697eP8wjlUj2fCvTZJfDAzxNL/wOJAWZ5mCDNhI/L0O1I7OnBUoFnnjF4Gs+ZDjMdAKCwXn5U9bAsyDJcs5XjUW4IgFD86jBxNDqdQFkRpQJZAfic7Y3pnnVi9i7Vps3PWp9IjZZuMA+WQTZ3YQ9xIoHx1+yMib4geiBCm3dRxN/vx9nVC222rilPtyMUbnzYMVPYwcwSgrBa3KSeWB+/ZWQnI+qB3aQygxOOVhOV+n72+lcQ== X-DkimResult-Test: Passed X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(3001016);SRVR:DM5PR03MB2492; X-Microsoft-Exchange-Diagnostics: 1;DM5PR03MB2492;25:H3qdl8llN0yWss+W36JbB8/EPCOxMqj3xJ4cFmVHi/OjCUMgteBaymBF7YHs9WzHN0VjM4aoLsKX0ryY/jwMXEPz9xNdQL3CPYdcyRFrZAzvNjJwbvHijG10EENviC5mSOhY3i7JMrH6V322+3PyC3XndRYFtl/wKZEkaPH+cCRueVzRG22NdtLUOYQNtW1UjZJjQ+Iq1ejSl4BV0DqhBF1e7Tc/BodZjJ5J9pNps9nLFxKpYmjeKnKBINXzNODb74bnMcXkr8TkdPKQH8lonUIcaRxWodu8fRi47j1c70kILL3+DfTRiI1tuscrFX3DrTKPgsAT6tCU2g59QME+uL5Xe5UShdHEi+TU5zF+Bm9kRPF5OfsVxig5jw3fc8uSIaQNMzaXuCkYVhFfAAQdf2JTt1GmJrxSPXE9bcW8uQpI19RY94Tg7sFtXYdY5S+H+OIhjvh38lO1iQ2fLyeqfQ==;31:HUd2LjvxO3ET++JbErB5ViB6ASz2EfEhvkIWkqcYLqepTqXAc8ibefJa1123WI+f5DmGOFJNXWszGENi5ih36cuJ/rTbWAe0WWohDjm1AKTJaVx2LgGfLRQyOXo/xeuBOGNFJejfxOdRFZqSsGFZ8cdoYex7WJKKGLYKG1ZlMhU1wgb09bWHpC+6hlRKm2DvIMJ6qM90tGUzFHez3/nAY2AAhqJDN4+4f3iM76k52zzZ9sNhHzYXMDOKPsc26KXpnslxqHlp+bLfxQLNwZagaDux0Z2M2/onJ6TOH55OdZU= X-Microsoft-Exchange-Diagnostics: 1;DM5PR03MB2492;20:vRvwrBnQdZYsHwKekTjvIARGF73yoB5/6ab5hEVVDdjom19+xJm1vF616KYpwIQ7p73lFEec+ytCKKcYrl9aJt7mH9sAJ5NP01l/UwXR/Ijd1kW2B33Qmn8xpveWt58+x0pkcrUo7BmwO+sl5Q67NLOtB7C8n05iRsng+IrtqGY=;4:IVXQKW4VDtmJkOXMJH+NIjSgvw4/qOaE4Pb999NL1iRF0TuVbi7hL7jb/1VuVnYQj7O06zdeY2n4g9fHRvFzNRfn21/kVPqZ3C2F16Vj+8pg4IUEniekgy/g3P/ECpwCaIL53fNKUpDTlGDkOGftX5M+dpD6tVTmHnYbRU18yX77JwDzcW1/MSmalcFLWjqDLUKWjudt/smtiilItAWgnDQh4fYkCj+kzXhVoPuG92OrS0nos9HzHc3osj1hjhrBZxxR9tObeheufCVoiN8d21mRZwyLNbZQffuWYz9OZnCJpKYgO2oPEsj/HwCwQJ6eEwQ3/qNk/Wv348nR3UO4txdQa8cxfZMP8Ij4XoA1cYEI1OAVmSUCxFyppY3S6Q3qfZpMIu8QXWO3RadUCZODrDT88bqu29e/wgJpINyd0BK7c/B0r5iOJbG778h+fzMc4CI6C3MTY/E0z0A/VLQyiO0ujCNEvQ1HLoE3Bh5xTiok2VIAPOtD9c4jfjst2ocH7UkgHOENFD1KEWuElfSKQc/REOjUuXdV4YAMVfttzhiy/vjOpXa/RhQ5MdrqqvvZCbPOtgk94WaHIofcabMEGIP/S6+ymqA+d2icyBMiuLvUODlJ/rtlr4qGsS16/pkr/DuSWtlufHiJG7/IffpUOz8xhyciftRhVctPv02b44rNhwHruhKSE2TABiYrSqAF X-Forefront-PRVS: 01136D2D90 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DM5PR03MB2492;23:b+Aib7dUwhtGGgLaIDCefCQvDdAquxxDGbUr9fOZQ?= =?us-ascii?Q?/r2oTG+WVq4eDtddBU6VTZvZ/CTnlMTz/IXd3YZCwUMyhFdS5K9ueWrTqm2A?= =?us-ascii?Q?FGGMW4LNfYm6mmg2zIgy/LDzYks5q78jkGmND2uBGTBgH+Gk/ROT8xuBCOKT?= =?us-ascii?Q?ycDxEajfxLur6MJJ5lL7ow9h3hmMhtnjTcUrnJDT2Vrb3smShukp/aWtUdI3?= =?us-ascii?Q?TBzJ+KVjhEiACxopd0anz2cKmVlWCQQxd2vaUAY6qqMR182zb/kDg3Y0/YlF?= =?us-ascii?Q?nzj65bkZy0Rkl4/K0y6s8gOVGvo4whS1GTy8kHgjDeCCAKy0RoTALB3aeV7G?= =?us-ascii?Q?ylE7L5W7hqFMIDwtc3keVFkI4G65TSX1u9BZGApBe+hE86+4Fd4n/o4VqCe9?= =?us-ascii?Q?npVk2/qKkEZdjIt7mHd76YZGN8kDHpZ+fhvM7A70nEbmKeUPb6IVFOKEqyzh?= =?us-ascii?Q?S8BIfZacF/b8+syQpuMVhxSEN9IygT/mKo575KKIXf8lcckbGhu0dWdSQPCA?= =?us-ascii?Q?Eap0aK+61od79UjpWgSJ55GWwcVKpG11nSCwInsOVA4Hzi2T632QsqTNwub8?= =?us-ascii?Q?U2tUseqD0bbf1sxNMjRar/m4MMYfyyxLYLhhtp7xDkAg/GhrvKFhzbssYEMm?= =?us-ascii?Q?fYd0EbDsVTwOU3+UXJikkWlPzPHoxk4MNqd+KC9h2YSRFrIG8aMbjClnYWlf?= =?us-ascii?Q?hjHm1Kq9m1W3+UdjX3uM/b3q3+DQ3HYVS4TtWnbxY3i4LFADL+hitxYRyJq+?= =?us-ascii?Q?PkajvnHxfpkpfSQyLk0xyIqr6angdXLIgV2pyqnsuFXHP/3Pis4SATjjKMKV?= =?us-ascii?Q?jsSTW3jbw7gfVeNDyqS3pX7AFemd95HDXtLG/ELhtokqRk0n8ktWJL+sIzkP?= =?us-ascii?Q?1k9zboTlXeKGsifudbj0Gzcy8kgKIbTUbG2WF7y73GCWUIh3TLalLXVwkKF8?= =?us-ascii?Q?dLWfhounz/sQfLLRjPHIPQchUDZrChGzLQToU6jx/e/PA9bg68vAgozDgE/Z?= =?us-ascii?Q?0jfKTwHoU5Q3gw3ZFbDuP+KNQPQshDDB4GwgesTG8KNm3BlDSVND2DyF8p0A?= =?us-ascii?Q?XpEzLu7Y2bj01Pdz+4txwXtQx0pwO8Xv8LXy8kjlQhaQu45g+uAw/bBp9j4p?= =?us-ascii?Q?EO3bURdcbythkhERTh/2ianKPoim2ZKHhGGpKuUCsY40yriIstQiFNUAHurY?= =?us-ascii?Q?kmgTM7ndtcSywOEnk+80F0ALz9yt5SXS+fMqDEPUsQ+PTI58dPKRxH6mKEMF?= =?us-ascii?Q?BBy4YiXOXIQ+XMojvlpXNjr5pn+asV6oCam6ytitQXT43tXMCBuRyMD7eTWL?= =?us-ascii?Q?HUmKqPX+E2MhPyLrVIYteLXsauzGfyS+1vZ9QjOZjEzjR3zigiihkonYk6hZ?= =?us-ascii?Q?CbSlvgqRqNPgejc566EWIvQLr5l/R+wXK51otYqumNkCGvGNzJkmtruLTt4Y?= =?us-ascii?Q?M/JujFGSXzgMepDJZIdaqGpTWvV1jPo7VVOztTwetNenaa2mQCnkwj4FhFry?= =?us-ascii?Q?HGrfd9/UGsaVg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;DM5PR03MB2492;6:C6qmxQ7faRci+6TxQKqEMtrWh6fSCrGMsA1f8y3vVk4Gs+N/qeLzTBC1tNUERKJIepmT7ZaawKbrruNI1Aq7py9E9MyUu3gXtrHVPM8hmS7s54l3ankGmev9LRFmMi0xmI59hOKzSCKP7zlN5VABmjurxzYvJaLp2J/DqSMMHmpbzTE/O0zHcblDefTyjWrOtJ/q/vI3aWqdjcQPTGiALsgEXnQ/XG1sn8RH2Dpyb08rBbqv7Lfz0YVTiO/lkDi10s3GgSOJRtskmgkGV9bwH8hScLGVkUw7TSEnwnp+3geRMAdGH6vI7saffwaVwxYMvj4Ft8GosDKJvSQywQCCHumXSiy35J7W4MjQczd+LnF9eX8ZTNM0qYFHFC5lT4ss;5:InVPdoZlMNBBupTRHOFJU6TW7O/06d+os0XFDXe/V9rHRVE3mMsf8HbUiT6stjd1zdV10/RQB6rRXlF6SstlrId+9VDVfz/FQedw0sppGAUp0A6k0fdJcy6bOitU8oo1yr00F6Bz8+zriKCFqMCS6A==;24:R4BMCKxaKrRRHsODDf8bRCnO/jESDZS8tfwwj8sEnzbYq/REH3TO0r/wOx0brxJrYt0rf6NjLTgpvmIoutWLe+LWFj1j55HDrTe3XeRGpeo= X-Microsoft-Exchange-Diagnostics: 1;DM5PR03MB2492;7:RmbdfSA6d6G8dDO6/Bvq2eGqvpxP0VVjSRtOpC78hfYmuaOfz1ZjOoMk7CAJ+XTKszUjKbkEUBASVOh5oWP5Z7jY8E71PQlE6bhuqMDBZpqwXoa4JchiXCv8IN7YMGxaiJVnzlMzGcHAGbE7bNW6Ga4w/xdyr9OTlmUuD9daP9dEDJorAZTxcxAAvf1q1tqHG00oOm7MLvG8VvcsVzvkUap2F14xlL61Rh1yMeZp4P8DqA08pNMtsmYSXnK3zsSMmP2keX6XNx1IuKihal09MejrEpaETAw94b6Xct+mz2p48IZQJl4u3bHbnxDzguwxLkuvDlNPCSiX2LhCDDufgg== X-OriginatorOrg: opensource.altera.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Nov 2016 19:15:21.9873 (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: DM5PR03MB2492 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 9455 Lines: 328 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 Signed-off-by: Greg Kroah-Hartman --- 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"); -- 1.9.1