Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935846AbcJQQKs (ORCPT ); Mon, 17 Oct 2016 12:10:48 -0400 Received: from mail-by2nam03on0067.outbound.protection.outlook.com ([104.47.42.67]:2880 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S935724AbcJQQKN (ORCPT ); Mon, 17 Oct 2016 12:10:13 -0400 Authentication-Results: spf=fail (sender IP is 66.35.236.236) 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: 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 , Michal Simek , Jonathan Corbet , "Cyril Chemparathy" , Matthew Gerlach , Dinh Nguyen , , , , , , Alan Tull Subject: [PATCH v20 09/10] fpga: add altera freeze bridge support Date: Mon, 17 Oct 2016 11:09:40 -0500 Message-ID: <20161017160941.4205-10-atull@opensource.altera.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20161017160941.4205-1-atull@opensource.altera.com> References: <20161017160941.4205-1-atull@opensource.altera.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [64.129.157.38] X-ClientProxiedBy: BLUPR16CA0005.namprd16.prod.outlook.com (10.164.14.15) To BN3PR03MB1512.namprd03.prod.outlook.com (10.163.35.150) X-MS-Office365-Filtering-Correlation-Id: 2d3b3236-3ebf-4bcd-acab-08d3f6a81208 X-Microsoft-Exchange-Diagnostics-untrusted: 1;BN3PR03MB1512;2:og6eJB5d2Hxcjtdy2QaZLxtmJx/KbQXP8P6UFQ/MpCaKs6k8MJhzZ9ZAR/12pr4CBLfnrWpcH/Nxcn9r59xaL7D8FO/vF2BxJXbJrkSOLU+1RlNswun/M0tMctgl74ameSaLDixm7jOIGWSsP6VM6PwbRacEkR6BEPkYdYTR5XT0oZ4FLbz9FBTDJ1FyepSMtM29xcupSonZ2+1uAXjbFA==;3:JZkj+8HNZZITjzhSbciULroZ/po0BhyUsTxKhmtIDA246Z7y+JU+hiwGMi69AS1/KaYw5mrIIwRU1HcsEf7GsnPOSMwu/ys8xmCM4Ywb0MgaS95AYE535AGE9hTi3qwpBj84wRL8+OqFGwtnYx3wLw== X-Microsoft-Antispam-Untrusted: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN3PR03MB1512; X-Microsoft-Exchange-Diagnostics-untrusted: 1;BN3PR03MB1512;25:tB0gYrKWE97OZYnBvQlXuqaBYSHH7RvxoLXZq/dqS4e+9w0XPCQ6ISGo9JrdEZhh7jSQrENtRJ5qgdGTvDoOp69X8ljm6u18WbYwpAuuutDkdSAAjWy2xk0X41bai8+73N0L2PhIN2lQDITaWcfGcX5I7v8QaTNmTa+PhcEZTXnOeeIKBsfzKRTZgnMNGVijir7wSsEOSwxKahaO2GX+14A73RGDohYyGE++r/GoIU7Di/72vq7wkUFOh7dNkK4nGnV2mH6hB3MrcySXhtyF7DPrF5oxb/Im82w5t2n+MNKIOCGcT9U7nc2xp/E2jdvU1LHjgl226fANEiJpWsXCK4Z3QVj0APz0OU8wPQ4s9ke2f2nm0Ee1yGXmVDNRTGEm3IzBDYY7EWWJ4IDR7Dl/+FfpQfxu6PROycE1qh7a54ZTdHL7fCuV+XxUctiSS52s0R9BSj8rWHVVpzDsloz0Kp7GWxeGKC9RId/UMj9Sv9+diX18RcgO3jRhZu4bh+Qfy9eCFKZlyoAXG1Y7aRZwnXC7UPK9N5oIuf9hnfYXxBIAcDOaOvDMnNJ3rGjI0pAQjjXQzOfcJTz03vdK8+eLIANDIeKrqjuxDvGYIi1vS6CJX7qbnAd7C9XPAuCaS7/OfQ2ibe+VHFLK8VSZFeSsMrqLp3BfVo70QBvmQ4fIAbXV06s+PogST25VW5fEMSa4FeDHD6bO2n8NdC/LdaiCbd57oy1p3EB1SdwJxC5KzjTDuitrLyMph6D9G3iWQ1WwNpJ6ek3m6efArYMi4uQttx0z7mRuLURe8icFPOAYChSLHAh+LdoF5pa71u3JTh1aFIgGLyYW+4xBPQ3ciembxfFLYJqQ9vW+dRbCggUGOsbCA3DP7MXdPRSv+kxcyqlz X-Microsoft-Exchange-Diagnostics-untrusted: 1;BN3PR03MB1512;31:VodpNQv6hxWV4oIYrj8GQNfw2FTaFt8qMXU3z05KBEtnpRpjTalZ28c/0dR0du6N3Y+t2KuWcQ38DjkZEFeekb3/fUWIgyWoHJj8ZTC6hYTmHe1nia323O1YUgd/G54w/C7SV9ntZoLwiYi2uwdn1bEvMsqEc8WqeQ1G92WwkSa0jKsvxBp9fBsTx8vCGGvW1pUMmjTDnouBQ8eRqujNO2CnVZijSHHnDmDhpLnh4KUqSQfJigq0EQqRl76qkAZE5nyi5dTs5gsg54BhzXQYgw==;20:gdEiFFmlxta+ojui7XNfQsE/7WCxUOoOKMfZ3LxPzw3ODmvQ2rdyfnydxzzEvxBNXF3bklv9e+VhIKvGdZYaUnkAn+D8aqRP0VuXrY+/WXLDjbMdTQ+IiOAIpIEp5BxsGhRaDJKP7u5jWL4gujjU4OhClEJQjS3huP7EYy1gnyY= 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:BN3PR03MB1512;BCL:0;PCL:0;RULEID:;SRVR:BN3PR03MB1512;BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(13015025)(13024025)(13018025)(13017025)(13023025)(5005006)(8121501046)(3002001)(10201501046)(6055026);SRVR:BLUPR03MB261;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB261; X-Microsoft-Exchange-Diagnostics-untrusted: 1;BN3PR03MB1512;4:EqKCAC7ZxBwKzjR2WYa8GACB9XOpI8dQRLTEjmQaB0FzIFfLS8WWAcVMEKBmMMvCcqqy8505x5sx3X3Djbloqjxgz/bltdfrfEx17dpd9vexBUJFa7lNCUzv/ea+Qp8az1pH43Xity/8VLVE8d92jN8fQSGWsoNDWccNo0WwDmuZOeZBHXZ/EgO5rrcp7wRcJMqcLAZ4ZvssPXiAGiPY0Iou2wgx8A3i4g3k1uBL5n/FaBLDFWFbSoZz73NsSrp7J+FQXkNkZyIJuqxe5mdF4U6Ks5GshBjTlziTpFEgBK+//C8q/HtVlsMVAbEJY2oOmOWQufVyR4oAram1zGILcLZ4+fP0gYbejjn4B61zjY0wuDesB1SpZSekLP84KLuUMNA4qxrHKNe/T0H2eiWD+FDxiDyJzryTuJeQ6B1YexUOLx3eNXRte1bVYY+N6LMvx8bXJuqTdFkINAfK9OFYsAlzGwqH6cM3xBZGXoJ3cOC/Y0EtjoL6pMMOeX9+YZjBNvc7CubGGXdHglC7EP+faMAnYe/xPd3QC3qt2xRgAFg= X-Forefront-PRVS: 0098BA6C6C X-Forefront-Antispam-Report-Untrusted: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(7916002)(199003)(189002)(4326007)(8666005)(5660300001)(53416004)(8676002)(48376002)(50466002)(86362001)(110136003)(42186005)(50226002)(50986999)(76176999)(4001430100002)(101416001)(33646002)(6666003)(2950100002)(42882006)(5003940100001)(229853001)(15975445007)(106356001)(77096005)(68736007)(66066001)(97736004)(7846002)(107886002)(7416002)(189998001)(7736002)(47776003)(92566002)(105586002)(586003)(6116002)(19580405001)(19580395003)(2906002)(81166006)(305945005)(1076002)(69596002)(3846002)(81156014)(7059030)(2004002);DIR:OUT;SFP:1101;SCL:1;SRVR:BN3PR03MB1512;H:linuxheads99.altera.com;FPR:;SPF:None;PTR:InfoNoRecords;A:0;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics-untrusted: =?us-ascii?Q?1;BN3PR03MB1512;23:HN4CcCzmB8iDRs2fNSGG0mhT3xmN2Um72M67WfO79?= =?us-ascii?Q?JAP0IXloPoONspOm4o/FTZayS7ZlNlv8VslBycZ1NfZ5cdll9XxmbfNGWn6K?= =?us-ascii?Q?gnXlKFCeC/wTZIpRMeNvq91GBfBJkXTQqdcd4DIZfYPSZFbeIxAsq40JjGda?= =?us-ascii?Q?6OJKzdeFddXUkNU3+XwcLgOXoJ3dunhk0gs9hE9zeSRMEfZQ19tLClTAJKSN?= =?us-ascii?Q?1wTnX++qvyFkdRI9it408GjsbxfOe/aONU2LBDjxdiiPETUFvk++jwznZnSK?= =?us-ascii?Q?SPaIX3IEfD0fAQXRtEyxZd1oPazA0DGIIaXvLD5shnBJxY40fJemnznK3FIT?= =?us-ascii?Q?zzwAfjhx9Yw7hkIq6iJWB4MXO5EDPpgmfhyeI/hU3v1fvGu+5CdZpX0NSdVs?= =?us-ascii?Q?eUVZlkX2HbVj04mWghlp51m9ewh2VZ8qLZAJqnHDZad3Y4NqdwOQuAiGac3d?= =?us-ascii?Q?PGQVRSvPBh0wZ/45b8nN7N7+TNGzfk8Z2R4/VGgFxYHe9iA3RmCqR39tgjCS?= =?us-ascii?Q?ajy7a6Mtd1NWk/CcfhbbvrDSV9Aum0kPPk9vtOUJT6IpK6Fe+jTWqqv66gOv?= =?us-ascii?Q?yrDhmuJEyhyC937fIaew+woLwyIdp8jNSf697k6oGJ41QpN+X7ZGNmRgq5/Q?= =?us-ascii?Q?tmxaWIUVsLv/DfWOzmYRPVJYooQGTzVq/hbyTGgwg8nylQTKUv6GcwFpSf/M?= =?us-ascii?Q?M8WOQcJEWnEJ5BPQ1MwYPtgT+G8ZhFXpBAF5iwUqbwGIsGYAqprnVz7e/o47?= =?us-ascii?Q?xcrN9yq2ne6MgRdYIGw/fL2/pd8PYmrxIh1nycmM2ZMGk7ZIgqMNYEZT/sa4?= =?us-ascii?Q?lBl296D0Wa8BXjDi1QkrtQLI1FQQ3x73BKrCWotM2ByilmJ3/QW98doCG0xv?= =?us-ascii?Q?0o7X2lpNPCHS2je7FuQApaMyKaZOqfc7J57+puCDcNvMb+5c3f1hE9u2smLq?= =?us-ascii?Q?JKEE7evNscMaLJpTTEHB5rYsYpkLAB336TczRAStscgE9nZbH1lwrp+s7Row?= =?us-ascii?Q?pM/KYc7tkf8YrMrPCegA50t8EHmnacdgH3izAxP3vYCJ0e11su+0+iB8g3SC?= =?us-ascii?Q?/JjZWJvPeKtYk5xbwnQLUN6D1a+1kj2mB+HV8zXNccpaEooSTG5btg8+pQoh?= =?us-ascii?Q?Nobm2/maFHiwPgvhrK2ppbDheRbKswp508iF32XJ4rkHx/PI18/5e6AbLL0+?= =?us-ascii?Q?bm/558noTY3NjQX1jdYX5kpXGfsYHFk8VxEapzaEAMIoLSvaANzFuYliiI4z?= =?us-ascii?Q?50IvZdrB9ZJx7ymizqU2ZNH6Xv5p55nNrJ3ipqF?= X-Microsoft-Exchange-Diagnostics-untrusted: 1;BN3PR03MB1512;6:8xi9hrgQafmwz5JhIdD1RqC7I0SNpFg75CGdI2uO6Y95jO6rtbBpVilppns0GkPQX61jjNHEiMR4tAhlQ5maLDNwn5R5724WLCsdQADDXVU26X8LrDnVjtqoktnFkrBXw39HYY9OD2qxFNsMV18FWU5IITgvAbPvwNFBhgQhOlYrualmg4hawTYfSaM+I4zDBjHK7nOGIi1MmRjVcdWcCygbA9OSfJeTZAqLHsCFxwn8xGNCLmVVbPjHwNHiGvXn/0fD7lK1OKLt/PvBVICroFMyXfemqIETiYgCPci/7V1MtoBKMlISGmZxxKz8y+Gp9mhlKZVjgtbNmRDQNc4AnQcmaOaNwslBz92lR76jQV8=;5:9lDvbXT4qcqHW55q1lzzyp3kRJdXSknLIvxJyGaOvU76ZuwUaU33fI0/z0kjX//jaQe4EwQ36D8oy/qyJKjcDoV30E/Z0URIXk9MHoi9IBGO/VBUrQN+jmAxJ3vIxHUZ2qCOrkPiLIBakn6QNZwjvQ==;24:3MWogIU6y7zzCUmVbnXkspwHrvdW5+N6i664Kba/TLKmoZAsvfjX8UWDloE5CCsNXokULooOc7owWB/xWZl2nnDn+YH7pmBFZMac9LBd6cI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics-untrusted: 1;BN3PR03MB1512;7:m/THlXGXOmqi3XkL7reJotDmvaoViqQvZt/DDjdZfS3hPuGi/MZJafIS3pqjT/sfbnZA7w4Vx1bAQA8CTvljA81+6WEscq3K2NMTFuk4lijnht9cEWHgrCtqdf52gIvlZPru7qUFJCH6lIRPq1jYNddLj16/lHPzfm+oKT/ayrHDuhKu2nmcSXSlmRMUNQq420FqFLupT26Ei+X2vhp9tx+/Aek1P7aG3RAs2E8GnMob0RsNLbn+4a4f++rXkMFOzg44AbF+lC4YmI7FGT05TlEFXzMDidrVrGp2Um1i5whjG1PYYVPKMS2CkH2QqaiWoiKk65bKsGm3AL2k5mDAtTyaz5oT/63DegJqS0kqsTw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR03MB1512 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)(189002)(199003)(33646002)(336002)(3846002)(110136003)(107886002)(8676002)(105606002)(68736007)(586003)(87936001)(11100500001)(4001430100002)(86362001)(5003940100001)(3720700001)(66066001)(81166006)(81156014)(50226002)(85426001)(8936002)(53416004)(47776003)(956001)(97736004)(19580405001)(48376002)(19580395003)(305945005)(6070500001)(15975445007)(92566002)(8666005)(1076002)(4326007)(106466001)(6666003)(2950100002)(76176999)(229853001)(50986999)(7846002)(7736002)(50466002)(2906002)(189998001)(5660300001)(42882006)(7416002)(356003)(6116002)(626004)(77096005)(7099028)(7059030)(2004002);DIR:OUT;SFP:1101;SCL:1;SRVR:BLUPR03MB261;H:sj-itexedge04.altera.priv.altera.com;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:0;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD027;1:mTXbf3cZqj49YP3J3aeXHyAJL0tKL/PH7VUKxPD2jZ6FU5BpgpD4IsQ/ZhM6pIN+UbCbd/DT20IJ0ePZm7rB329IxZnGOAjr4EKpQnxIgJzM6Pz+XVoJrqP2s7fO5aB3V2WusegvMxQnvSX9fm/5jzm7rVY3SDtbF0mkl09dvGeCQVfXHWzs1KBVt2MYOmylo/hAuuzU9OLSlMLD4YQ+LI8M7AjarcuYfH/8wf/5xA/MCt4isnxlrqmMcbPoztNVNh9V20xmeOVBo9p4lSllEgnDmqBACHBTdpgwa/h/N1iwXdDwvFxITjRNKaAKkPUpps/KFjjcxmjoNR1RerrDjLX8fPZ/c73LzX6GQaV9EIfZT3lpM6sn1gIT+4IocS7iL5SGxzg0W6UX+PsZ/QldU5g65NDbqS3CbAHbPXoBU7M3e2q41ZttbTh+Q92qCy7owL6Hp+HEffmgsL67BVj3PemrU4fbPIdQeTQhw5fxaX/JuE9gNUCGSZj0zqntByFX6HL/IMyjwtg/Xf+z1PCEjCn46Ldplrk0tiHQblkgxQjf6sqfGk1YP0R0DdQG8CuaX66RCCBG30aQTLK7MY4n8KYZfCTspgtHbqy+sbxWZoQAqkUVKzjYTIn8antKnj1s X-MS-Exchange-Transport-CrossTenantHeadersStripped: BN1AFFO11FD027.protection.gbl X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB261;2:mq2EfxvvH8udwvOL2D5lussUa3r0fiUpEojpr5+g2mI64c+FR4czvKIr9vfNAjYJr1bjc1pGaRhSbZXgJCr7bZrOYArfACBKvdABj8d+Z2GDU0mjeT65gHFLdj84QicOc35RkEOajuIShCkgBC5ecwOIKYzq4qo4D1L6hsQq/g4y+dLD60jJOO7BdIpb0g9Qou+xdu5KhkSBPMw2xAomAg==;3:+VjLFnmUtTsc5C0U0kHC64f6B32KWoaj1Aa+gG8V1GnH3OQnwaRrLGriF1wL1zEnc9C02C7cbQVeGATk0yg2Q4ccO6/VMObw7nevnP11sYLCKs21tuYXaO9eKdYueJ2ifhZi34b4IQkgLdWQ0GelMKCocA9LIrUJpfccw8ntVzHZRT0OmAtf+h/6r7oaztr8s4wwAzn5XCGrLRs4q5T6TGH9dQkvzwWooSLv88yvIbVI2B2D8qalM50+MAMUBNOeXAw9XPdN9Nhp9X4DkBzJWw==;25:xE8w94fq/m6pj1hx0dJye3MLQ7u46eHQ518w686EIglvWta9NyyPjY9ZLF+7mxbpASL7bM9JrrKZZZ4iq8l3OizIRbmEXAjTjhlRMkMWeo0W2QAJyexsm1gxzNzTz5V2AJoFJ60SpcSJ52JSNpxDGr7LSCv4CexaQkxV/2S/x4IKUxXG2WszidNTyiu06FscCC6bh+5V7VRq51Zb+SISHuiv02ensxxQt5s641ErrVoFjEpizV6WwH/ICBuFPQj0G1n75PK8b/tnV1UD1BIlVlAgvh7N00NUeVu9w69jv2i3YY0wy/Dv+KLU0/2cFH9o2TCnkrOucm0c0RQ6pIo1Cy+aYJXzxjtOsaoqeRaM+lh4kPQJHCTlAlgnS73IbdKBCgilFw8uAWYh8hPoyD77FSJURnWI0dZ4yOk1krKCqREuZZwHby0p37jGDPHrPBRo2kBmAPCqaLZEuwPfokh1nA== X-DkimResult-Test: Passed X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(3001016);SRVR:BLUPR03MB261; X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB261;31:BHEwflBWNnKxAkzO7ZmO7Qsrq2bdT39PHNSnlPdrPkNP+XI8X0WgbicbPCEMCGQUJ+diNBHgQrKpe/6b5ICAxJYR6nGIPuUrzTNnqefn85/zEU3kvFenBsXbI79HX9g74W32SoU8AztlWLaKdb/Q/fvK6mMgZZzXWu00UGB8gnrcs9hah4ue2wldEGBJrrwp8rn4PXj4MPjbDeMrKXk+F5R3Y82RdtpcRd/t8d3ZEl9XEaL9+8DohZD65V91eHlz5TZUDq3ARfVA0opMtbYBdfRtZc+BSIFVn8F50jI6NUI=;20:J3kvkWRmfbp44BaChsp2/9jIf/3ZERRoVZ4MhtqhhZVgn43euujKl5UPEd4/dIZwocGF8kytpRqX4Zzj/2OFR4CFArOKg1zYQU7VJPkLdJNKk7bcHmVtyjYZoro3bKBUwPZieotzRiSCiXUCtgONlutc/oCa9BnC/xI/Ca81eNM= X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB261;4:bCxNHUQGbXkxEidk6M2Smd963/RDjKp5NjipBI5QI7QABJLyABiQZPc1o7Nj5JaeHGg3zHUy2qJWR3+5ZXq5gWzoT6yDwjOTN1pvIPjWgwUXbqZ6+GiL1pHGamszSSEmo33KPT2BS6jxgIVLCO8r3mkiFbNl4j4zOQHU+xrTtbwSMK3omTlzKhip5zugyrW4YvfPvZLu/9FFbPS4q904drZ01r+ZpmtfGGaBVYglLIkkGUmWu+tqUFmlNkfg8mBD3ETrs3ZBbiczzWghPWC5oeSmY3Mb8RipcB5l0x+a94/q5nf9vnvPxHCmOOGkQ0t1OyFLoM7geh4WVrd5bARTfS1Cx0Fby3U957BIt2eHEIyLjLPCyNQ/17is0LJOje7wpYHK+g8N6DxoCwgfVEi8kv3vTF0BgDch0jUpSrvAsD69gYCAE32Abf/QH//++6rWtHuhzFyDAoCfAZ72wC/Y74PAk/yTZSWIA6gEf/WBPQqd//oA+nhtRnOMNB3MeWgOdbnkk9Nu2kPvFxr+L5pBMjO2D2xm8spJF3DagYlvuTdNLY1lSOukF8Ibl0Zpd9Hius+4EJxxKl5CrrOH8UDYAbwpteqZu0+SeMCRPjZXcBgBhXRnBJ3mvw3NeSmw/qLI X-Forefront-PRVS: 0098BA6C6C X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BLUPR03MB261;23:GhwVsrp2QT8XGl2WrxNyE3kARFjYTLvZtSGHCuQLt+?= =?us-ascii?Q?l2CCGNS7p7LpFjmDGkG0rtbzde3PTc9f8R0x1SG8uVgkiqy4zRl/1Yl3MPqf?= =?us-ascii?Q?UHRHt5bV2PHFBb62xv8C4erITvNwxulRzaTsu7/d5fIAXqRcjjWBwG++au7j?= =?us-ascii?Q?p7sRmWsilj6RTDvJSw/Yl37y1cMgrn4MJ0nFYiUnK0JpAOg7m3oxiSqpsCgP?= =?us-ascii?Q?CKsA81Wj+NVTQ84z3Pf11FXPxPG2lLdDr/ZVHrdqwydygXCN6nak42RHhfw6?= =?us-ascii?Q?+RcZ9Q3mkaUFACztwdm6V6uX0bBvzbaFgg7U7vippMe/Jv92J3FYP3Pq7zTS?= =?us-ascii?Q?K/0a1ATI85AX5+BP1HtN/HdLLSkYtBLK6no+z8NDI/cVm6lxn7uvBF6grjn/?= =?us-ascii?Q?6QVYyyPl5ecwkwuOJ65JXny4rctBokngNW8mIcGeyigpyJ2EwDkLCvvYIoTF?= =?us-ascii?Q?OoxknVggsaKY0+J1xj5mOV2mqapkA6rXBwlsg7VeBoLsUUbZNxM1oxQ1qOUL?= =?us-ascii?Q?ag4Bdboe0j85j0bBg4MJv0pk1hIVzEUYe/xbMzN46OstSpOENfJ95taXmexM?= =?us-ascii?Q?VPLKPp4jv+N8OPzDuYkVK+ZL0W4dbIXgxu5IBVu+sSjG3FrWqVVzueXoKXZB?= =?us-ascii?Q?SsSSklo1PAnvZQIZay2g/Zt8Nn/QrxwUBwjzYzsKoLkUIr6r7jJSpBYClocF?= =?us-ascii?Q?UKJKlz/pt6jVKtnbp8VaD9/Da0ZGQV+ySpavrXHaHvdEBBYIy+bFvmch06iq?= =?us-ascii?Q?M6Q6URBgXHe9NjjGpJ7geWCPmTxvZdikh6QDX32/iOLXbvDJ+YzPp2HrzgqP?= =?us-ascii?Q?r/UYDErW8He4+TK0zR25chi4ixt1iDxnVavHnFaG8Hcg/hAQI12D6kXEludW?= =?us-ascii?Q?qzJxSVcUH6nL5wep/5bdgNOA8e01Jdh7lt/HrSaPTLFjzcY6T9QeZL8iXGwo?= =?us-ascii?Q?agWERAJSJNbFke46ItRmmi6QX5276vCAJfslWepOCnZ84+XgHXuq2SV2+dab?= =?us-ascii?Q?QaiHagDxw6Yz0W+rPF9G+suymqLj4y+ODRIhgjbwGzFIjVfOPm3mdDOmeobe?= =?us-ascii?Q?vhSb7SZURrct4zP2Kpc5npmj9OsgwRB3pMbNEutmAxxDFv3KuBhU62lyXLAm?= =?us-ascii?Q?WY9mDX5kvomYCTyZ5Am+xyxFUA0qQd4LdXsiUlXKcc33yKCVQJySsJNpAAm2?= =?us-ascii?Q?abjVC+Em3N1m9AZ+7h8ZTJCfjrQWcmLoZHW7gx/mM02omTlsAUmTQG0sHcju?= =?us-ascii?Q?3SAMqgyLgjBPr7B/FXei+tTvXixh/OffdJsgeYeYEElQIoGUr3sCB9n2u0dz?= =?us-ascii?Q?b10uw+3tHisdAocGJxhELZc93bBSiBRvn0iDFZlvR8JViNRNtEu0p9g/Qcze?= =?us-ascii?Q?mDRE4Rw6L1u+E+6bIFD+SXZHdHDt4moNbtN03jVX1AsXk1ILs4iRigjei/fr?= =?us-ascii?Q?HlOD8VCFxgkATh+GOSnKYsQPnUbWWqzrCmt6Q9TUXaM+9n3O5Bnpid326lZ9?= =?us-ascii?Q?UmUarGpGFeFg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB261;6:P53PFDw4fzPep5L3v5/DLvBEH6HcaT/1MxhPdV5FTFy+AhzLS/6pQu5PTuhUmEZR+VvGs8ezv+Sq/GgJiOF0A7BdXM3dxsJZuBOM3/u2MxPYMx+1dneX/QfFjHqtnXOL8C0lDzUA79gMT40G89hCx6SDf8ohzoJds0NF6OSzJ23Fdj1HBYDKXdzd5qeJBruDkx4CPO2syB5xVfZC92b9c30gsCcsg+lmGYgEQ86Ub6KIFugqSw6hw0kTc7Ha154SNrH0MkQ4Sc7802FV4qSg6KExq0e6oA/WOo1y63sfRSUAXQp/MX9edScPXQJKGVcPXhVtQCkjlox6IjClhXoRLJmDmcfma3VR4OmNWhG2Bbc=;5:7fGSXygBycOEJHA33juLwQCJeqLxoFeyN8uHlxUq6e87sqGjuntQPxTE3CgxIT9yYxY0W0pzhjA8EVLdMnD8WNprL5UOXfkMwR05AylcGn+S1qjiS4yMjNjbTBWqeovSoN0JDw8v5WNAlZ1PPz8lDQ==;24:qHp0BV5foLz+t/9DnUG4nbBdTFLNjRPHSnkIJFToGChLjlsYlsfgr/CVmAtLMBjNRhCX12+tHNtJV03dibRoui2tXWhMdRlWrBJKd6JjfFo= X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB261;7:sPkkcSraA45l8GDIMNzngXQjKPunXMZJYPbaTfnAYfNK9w8ipA5wpVDYnPfAK9IsICu7woorP13zXxJMfJRzVATxPSoJsLdRxYV/Px4eKja+NBlbLXVw/f9qA/wAqxlEJC7VHBcasNRXjNWAjNiG+sWQxipXEXVRjx04YKMRSDbi3RGF7dhNOmpg1wffz6SzH5tGKW7RJIJzv89Q4RsfotjOzoNm9uZWctncJ4df1qpq3z5RkuSkW9ccfW3QUnqYiilBuZbDMNJMNs9Zse+xntlfFckREBQVqJTJ0rv33WmNJVJS7GTGX2RtDkBoGLOxdFJqzTuw0uhdtoniWkLczw== X-OriginatorOrg: opensource.altera.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Oct 2016 16:10:10.2032 (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: BLUPR03MB261 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 9509 Lines: 330 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 --- 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