Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755436AbbHNOnd (ORCPT ); Fri, 14 Aug 2015 10:43:33 -0400 Received: from mail-bn1on0060.outbound.protection.outlook.com ([157.56.110.60]:30138 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755195AbbHNOn3 (ORCPT ); Fri, 14 Aug 2015 10:43:29 -0400 Authentication-Results: spf=fail (sender IP is 66.35.236.227) smtp.mailfrom=opensource.altera.com; davemloft.net; dkim=none (message not signed) header.d=none; Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=atull@opensource.altera.com; Date: Fri, 14 Aug 2015 09:38:02 -0500 From: atull X-X-Sender: atull@linuxheads99 To: Moritz Fischer CC: Greg KH , Jason Gunthorpe , , Michal Simek , Michal Simek , , , , Pantelis Antoniou , , Grant Likely , , , , , "Philip Balister" , , , , , Nicolas Pitre , , , David Brown , Rob Landley , , , , , Linus Walleij , , , , Kumar Gala , , Petr Cvek , Alan Tull , Subject: Re: [PATCH v10 1/8] usage documentation for FPGA manager core In-Reply-To: Message-ID: References: <1439487452-23977-1-git-send-email-atull@opensource.altera.com> <1439487452-23977-3-git-send-email-atull@opensource.altera.com> User-Agent: Alpine 2.02 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" X-Originating-IP: [64.129.157.38] X-ClientProxiedBy: BY1PR20CA0005.namprd20.prod.outlook.com (25.162.140.15) To BLUPR03MB1505.namprd03.prod.outlook.com (25.163.81.23) X-Microsoft-Exchange-Diagnostics-untrusted: 1;BLUPR03MB1505;2:GrduEU4wmfUDc6ey0XMX2WPNjHXN7RGBwjB1wKrTejQAZL5ZzBgsv8UC40XhNwYDz7wuxazvfXUiS0QsYE17pyUJVK5zliavKxJUI9Y0jEZLhxUM47G/jRLFp9Hs/whKY9Cy7fZfwQjZMC1oGVrJMEWEqzuOmQbOTgAiuCnQCmg=;3:CpRx5/arEWrpLRjPaY8QYosyJmoWzt4ywYOHgR+OGk2uwxzNPczNrz9FMfgOXFO2jp60rBDupXYC077KrvxRIKSatyhLhqYx8WetS3LdhUJ1e+ckqlejTTRtitiW0TEO55Jh6sEWr0h0yPRHLvlPZQ==;25:aulnNX2fn3Ub4/YrbqrAXVpsFqlBXry6wo9gYYIKRRzAjeqy8Tt6YdmJm82KfbcRoM+5kn1y1Y868gMb1PSOolRRmbBvCKtEkLGWGv12Tu4s3dXrxSHeXpgFyLXCg5MO2vMHMTECNDUpTlfw5dy5z1tM5BHTdeE5OL8lMiXRXj4znYposWIocoOr44b89RdWrAGH4nC3VOl8r9xxMDK/cYyzbIdTVX94ouVnhxpLQVXLyIKq3U2i2xfedXGJst/0mHHyVDWfKjHXlINAv6XhoQ==;20:K4x4QToY1ykgeuKDCT//kkuoPjCDfUitQNGfLghrlcDlW0JOT6QgkyDrpmtdHVTkuFV9JLw6YCRLrrmZ4xE0ui1GiRfSlzeR46ypt3/jTV1+befujFWrkf3bWnQSBlvDOcsLR+esNGKXzyg+vguKQMNNZNLMuJ3Dlo7hoACvVvE= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB1505;UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB486;UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN2PR03MB047; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:;UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(5005006)(3002001);SRVR:BLUPR03MB1505;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB1505;BCL:0;PCL:0;RULEID:(601004)(5005006)(3002001);SRVR:SN2PR03MB047;BCL:0;PCL:0;RULEID:;SRVR:SN2PR03MB047; X-Microsoft-Exchange-Diagnostics-untrusted: 1;BLUPR03MB1505;4:W3zhDYbpRzNonDNC/Wc6MQVDK0+Thy/Ln1SXZWpgVMaS6TOeUmpz79n+CvTd1KbHQu6Ksge188SOopFCCKRGftzkvWHUIUkNIAnm4/YA7MPbxUqinVjA7ND+LDMOCTapgSD0pE0SQG5YY9HUk4SZceSZc6HKJa2LLxECPGmduGUB/qLIAmQCWuocop3PxkuWHu6lyTGzN8c5gl4KROIVm/wTCnMiVSJn4mpGR+EQhrKIkDHv+DI2/j/etgrDwwIu3efL6g3z+2BSRjvFiyZxsDZQIeDZiYRZyz4hxT4FWtI= X-Forefront-PRVS: 066898046A X-Forefront-Antispam-Report-Untrusted: SFV:NSPM;SFS:(10009020)(6009001)(52604005)(377454003)(199003)(51914003)(24454002)(189002)(23726002)(46406003)(68736005)(101416001)(86152002)(77096005)(86362001)(105586002)(50986999)(40100003)(5001960100002)(46102003)(69596002)(54356999)(2950100001)(122386002)(107886002)(77156002)(106356001)(62966003)(110136002)(66066001)(53416004)(33716001)(47776003)(19580395003)(42186005)(76176999)(19580405001)(4001350100001)(92566002)(97736004)(50466002)(5001860100001)(5001830100001)(87976001)(83506001)(4001540100001)(81156007)(189998001)(64706001)(7059030)(4001430100001);DIR:OUT;SFP:1101;SCL:1;SRVR:BLUPR03MB1505;H:linuxheads99.altera.com;FPR:;SPF:None;PTR:InfoNoRecords;A:3;MX:3;LANG:en; X-Microsoft-Exchange-Diagnostics-untrusted: =?us-ascii?Q?1;BLUPR03MB1505;23:mOlN6exhbxD29em3kEgj/mcWE7MAoVbBO2nduyFwT?= =?us-ascii?Q?Yad/tayBma7dw/ut+n5LzobPSFNMgCJQcGA0nTootMQKDRfqh6qnGAXnm3sj?= =?us-ascii?Q?/E22SKnTh/037VUHKP7flw/PJgQcv0wbceHlFsq1fnQS4qhyTj/Q9lLRim52?= =?us-ascii?Q?OXP0X1mpfedMP5lY6kn0D4mP/x80fqeoErfpcjq91FNiipwz+rdGFzqlJmFU?= =?us-ascii?Q?Xvy2k64e57OF5jqSBQHwUPfjozsJNAQAJ2l4dB3EiFMvt+gXXJogrycwmQmu?= =?us-ascii?Q?OmxFVLBswGAJC4aNLUtbRPbFkc+K9/drAIgio1qCtc7t+i7XDahXH16yR5j4?= =?us-ascii?Q?pHeYF+RObxo5IXaI/XZAcx+tsS8rDiD2G91qDSXp1vOwuEr35R+bOiN5lKoH?= =?us-ascii?Q?zBCPpT5eLY415W6U1ZEYpZzybC1vStBqNHNTDqzo0sr7nX9YBgJ0ihsu24rg?= =?us-ascii?Q?2vL3jdfqtDMfRlZE0sRISZNNnjVaeD9UpywwFX+KPkrg9M871T87vgvm4j+C?= =?us-ascii?Q?OMnqIkH2x4Af1U6cTEkFXYN/RQfSQhEFNJn0TLIc1BTJoWAILCeeJEYnfzcX?= =?us-ascii?Q?HD2v0jZpuywdat3r8+UaaoeaBTinbmfpxb3bkofKWgzYcQFTyqjDO1gcnamX?= =?us-ascii?Q?PMSF8YDodzbzzoMg8kBdbdcrQQXWHZhKsf70rk6ibhSk1/Y53OFuaeKQ99Hk?= =?us-ascii?Q?QSnq3IjBxhCrWeh7//5nj8C/x8cLBXP000QoGFvNzCHfF72Towvys3vof2BA?= =?us-ascii?Q?FVNrvmb1S4q0cs7c5HKDXgz2DSBUKdLmLHd+hZhBgAZQv3efsLJEjjtn08Uy?= =?us-ascii?Q?Zu3/FsSs8bUnGzYbGIhjLLaK6oOTgLl9Fkaploen2eVc3yBwAQ33eVsvOy9B?= =?us-ascii?Q?2GbbqIgq12JlLYEUx8wdiyJn3x4I1IM49Y/JByXNuCY9uffCLqb00T7o1PCn?= =?us-ascii?Q?c/+RVs0I71t2RD7WM7ToQvDLMdLMZwurmh9XYUkq1kRA9xykyKvTJf6KRW0U?= =?us-ascii?Q?g/HDYEWQDfb05ZTxJpPAsmLaZo2MKZH1a2wxi3mcWro8XT4Zxb33Ba8+Y3Kc?= =?us-ascii?Q?JjpeVpF7IJUbVWYI7DhdStZGxsnokPFQrsN68t+dtkQa8zn7z7deVoJ/2asr?= =?us-ascii?Q?gzeNOnpVOXTyBR1+MSSd5vBuPkG/TEFS4MdXjRGUbELeP04PB/6xraUYiHA9?= =?us-ascii?Q?tjTehpJmXQ+Ej8WbxDJRO+ZSaULrJJOnCfaqoygkJt5pE48VoVK+krHCXWjX?= =?us-ascii?Q?80i3pfEtFebTWszj2v+ZaYQZNkNYFx5wVtSPOhQuDgsgHl8AH0TCSk5EH16/?= =?us-ascii?B?UT09?= X-Microsoft-Exchange-Diagnostics-untrusted: 1;BLUPR03MB1505;5:p+oO0ho2W4j/gOrpBXQzFo1rVxfLkN8J83716TfTNfuaglkG7Lsac5c5yRhhz4xYVgKdOP1T2vRVhXbIb1lJjwDCrvdjfFsT16JBOzabFv0DSaT1NhNdNs5S+mTM41H794lx/ea+cUFzuv6McED+Qg==;24:rlngjVfkY9qULWFYE1IYJrn2ld7u68aRIC4Cq76jctqjSlsL40CM2JMDyPNZ9rDLBhdQxaAn6jqOQo8rEwwCcqK5mJWKAqcH7fBFbV36tCA=;20:D8EPUUFc0NBaRSOsTywa/Meq84ql6hcC9mPoc0dmh73EETURtl1LDCs5hPoF9JFCvY/Ckwn2XLWg6L6IrPw3Dsute+JDyt1KAlWUFParPp7Arr+hDYhZpWdV8WIlR3YURZlTrtxKbDfpqKMFYpTCC+ivK4304sqxgymwL1gJbYA= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR03MB1505 X-Microsoft-Exchange-Diagnostics-untrusted: 1;BLUPR03MB486;2:eWOCKJn7YXy3sNV5oCJgbWmYW/ciUAjaQhr+qUliY6YIK7zpGIPKOVQm6SYKWJdX5NEBF6pIzkbyMOsLMmryXk9Gsdv4zYviWDpvWdRcZhQqqiS7WvaHE5SmwMQhovdBWX7FzL9J4UUDCoAbdKa0t3XTcnca0GGjw1QIYRM9EBI=;3:t3sHesThtrACMIKS6IiuYpuAURvAxZizlx9ie6qH/zZIJPijpqFAUScNLb3ztosGTLsRY0eEDAO/Luo2SNY6aDZTkOI25T3rkC27rJSwbcEAFaZk2h2ywKwLRSJnrEVV+zhfXIKQv+9n+89kK0vrcg==;25:fEct+OdRXhbgWCFt5KU4WlmqTsMuMJmDdudfGeD3xPtxOg5oOjRPTqbzTtMyGyA0/ETGgbGmIUqgp+Su8RvJna/OaJsQPMbD112StVXeNc/nGXZTHJ5xWEyTs7pyAPMzEasn5UDoPTkeU6PByeYlAm454/LzK9sYyvM+U93d2xlltpahxYTCHb/W98j+6XPzFsEy0mkZB7mlo2mqSVUm05qOjkBqcftQ/q3vE615JrCPBUyzHOiqSfxOpsHJRkc3mErUY8ftbSKsPIzlrzHSdw==;23:d3fWIRngqLi4OaCKJjBcoZgtxhPF//M7hcc1XhU80x/iaZsEE9egNftCWqxAIu7uvSOGMUulai1v8cn9q/DyqC5kObsfPAbCEdUq0VFt/gtdFcZ1lk/RkgMxBYN8qUUzyC401XfwRYM72+iS/Mvje+QOiXgTY5gBcNSWarat30TsqP/qrvm1LNSaZgCs9/JU X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: BY2FFO11FD002.protection.gbl X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11FD002;1:3rkiH5b3sKMb72FrfK9r7jfu1U2dQnHchCHQ8N6600QacqiNV9m5WkA3BFguVt7RkC3j4B0PP6In0gev8oY+BrC8TY4z7NvB3Eq2YGKYkyE6iXnYM1wGGIKhx66DI+MTnqzUhAn4Av9ZjI/AKZprdKe5zGQoTwp3+/8RsiIELco1EgRaochg0Fe/5qxPAfLuU7cHw9PeWh+oMqDCPyNRB630O7rd0QfLdqjw5ZI88OvCJVSVTSmw2jRgONMLUyUDC1KYWAiNp4PSizsF5nBmHRDxAqNSdpmWRAWA/OpmqahIBF+ItnBNee2aqNqJmXylWjwqEQmtghn6RzJKZ0y38cb2ovDONAnG1F4c0zF9Lcf6rJa6bIi2CU8228BYCvUmfT4svNSyofPrIcfmgrAAbg== X-Forefront-Antispam-Report: CIP:66.35.236.227;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(3050300001)(339900001)(189002)(51914003)(199003)(52604005)(24454002)(377454003)(110136002)(107886002)(5001960100002)(66066001)(23726002)(81156007)(2950100001)(4001540100001)(189998001)(19580395003)(54356999)(19580405001)(47776003)(64706001)(50986999)(6806004)(53416004)(97736004)(68736005)(92566002)(50466002)(77096005)(5001830100001)(5001860100001)(6070500001)(4001350100001)(62966003)(77156002)(83506001)(33716001)(76176999)(106466001)(85426001)(86152002)(105606002)(40100003)(122386002)(46406003)(86362001)(87936001)(46102003)(7099028)(7059030)(4001430100001);DIR:OUT;SFP:1101;SCL:1;SRVR:SN2PR03MB047;H:sj-itexedge03.altera.priv.altera.com;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:0;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;SN2PR03MB047;2:oepjhF1YQQam+JbYV/jePNzkw0CNQDVFVG+9SrWu0YTXUzoVuqZ+B8aLasd/fM9bW7eQVa30BeuIrmANywsp0DKlOJn6RP2QlYjm5XyXN9a8iykMhqs3Ldpu1yN/rmb6hP5hBik/dOQwo/ZKHtad9Gt+Bo+q2YG0Tc+aGstscfM=;3:IGHrxaZnwm1eXxA5rCSEsXo8pSG6/pTxGvcEWKPB6Gjnfgs2j+8bO3HaqrzwNa5PGLBJaC5VFf16zxRpV5IJOvxno6o3ZIBkYvxm9DpGH+Kl2Hp+7ObSQl1KUOrWRX9rljM2qvV9SwWd9/psYA1FvramO/Yd/C5gGNGYgrY5L/EfpQCHsB6WWe27W/XajWAAYQH+r4zLYtKURJvOciTShx0j68VCA9NwvYILewSvybM=;25:KRRQwS4HEm4dPszCS9OMhWe37WEoHzjvSEczgwcxBVmaLCny9ZZX/mxoFXbDW8ZLxK35uKUj6CCeej//kA3KxGA3ZDRp7OopfSHWM6JHUZfwGeEvMNSUbyIOF48U1v8VX15af2s+w10eFRf4uAtIs2HIgmZublqu8+3ZySq0sgmZs6YncLyzYhdN0pyVObszah7ddiA7IdoP5sVRPjwMsHoB4fuxiiT+qNg4MfJZMXcfIPzn2dT/KSZLm9coIWx2LLq7wa1j5h7Og8Er91rgjg==;20:ZM0yR2E02yTGFqcRzuWjJhe0SWj/kTWnnJgXy9y47TNqS2lOGPUvbTetOcs4KX8yvxvOy6kw+KdOx/cTYAZzPSpzyhDyxh5NkltlzA7K2P3FnBAb2gJ6j6uQY4/SFKBdx5ih5+Nf8XX4LnpRUrvCHc8NFnfrA4u4QptB5Te+s1w= SN2PR03MB047: X-MS-Exchange-Organization-RulesExecuted X-Microsoft-Exchange-Diagnostics: 1;SN2PR03MB047;4:4cuIfkmSEvRammeTfw9IHWSp5DB33cmHOEw707ppYsVNTzfP7xTRh9HFSjm7958E2p/D05xsEUFbcvtGe56BejTbxTRBGuhRL0wmlD0MSETFzXww3EHXS+kARTkQKY6oFEx/KZr2cezhQjZJu59hHxyZfCO1NjgnVbTfqAe2Kbl7Js8zVhm/zGDBhfjJNMoZKuIw7+2FXDF3soEBrtXOnCs5vh4xRbvytvragdLVXPOPUs3e8iZF7MUpJ6szGZbLDtuen9aQLQwAiVOfuprh25+xQhKuK04wcgzJO/2UaAs= X-Forefront-PRVS: 066898046A X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN2PR03MB047;23:5Q/MZ0cKm4q/DdO23oQQwrCd3qSxPbBQPfcN+xRMKG?= =?us-ascii?Q?3H9S5RF7v+4obBExPFs0L/qlKa+6Mf5fageTpsO23tbp4OOUsTJAOTkNXLqF?= =?us-ascii?Q?o6X4T0Am02i0MyukTcG8Wb5xPTwnVRPYFq2ViEX730QXCH7OWwAJv+xPjDfh?= =?us-ascii?Q?7mmh+9Ofvl8Ic++iqXMzty7dbQgdMJt3bTzNz8tgveJABMEtceLZEvtMmJYv?= =?us-ascii?Q?tOe3b27GPTpvKKMCA6HtnM17MXhcjXTvIR9mRMY+Fqin2viDmaZdDNn9vhgX?= =?us-ascii?Q?Wo5U1RI4vTfkVFzgqCG5KFhLKzlglrKw+gL1jyI4vsrUJYU1Vg4hBFghft30?= =?us-ascii?Q?/L3lFk9gVGKXhxtyOJHOF4H5QEznC0pPAMRt3jDDmpGU9TUexkf74Gru1ZEa?= =?us-ascii?Q?jfdN6zfZNahViVUOG0JW2B/jIX9gYyEYgCZD8/iI0tcXclKIMJoejg5zbhU0?= =?us-ascii?Q?cFTV3UJyGR/JTbgVaKoD+N3n3atCyv9yeciaCGkz+oTcqVd2wB5vbbU5nCgO?= =?us-ascii?Q?jV5T+d7w5qlt4YfLexJ8E6ecE6bvN6fmf6mzV0xn6zIbBpwDWOufuhicNezK?= =?us-ascii?Q?TQFF5KPzpvfl9HF+61WUMQMvCNIlX1Qd/UjkuoajyUoPsCgOquXgu9JPlRtt?= =?us-ascii?Q?/PwvZemHufExe9HUC75FXiAMxa721/4UD5QOfOAhtq10FOZ5zWhUBUI1DaUf?= =?us-ascii?Q?aPS/HaCHHA5NOy1SX/yFX8hmWxAtpoFArHxPf2oTVE7YIdpelNpvC2ZMuFwN?= =?us-ascii?Q?gOITWsudiBEtYr74w37wdKg5f2/8o0TDANHElcW4xoqBljWnKYSFH85MI+XE?= =?us-ascii?Q?eEo5MpVbOYlmfu5tlptfP8U/UW27uHod+PeTeM/Rhc4iuzkqunsrDr09PyyV?= =?us-ascii?Q?MMazk+bGCWXTdOWcyjTFbsBiz5JhhozIHzWdweSQQ1PRgvj+H7IMblDoAP24?= =?us-ascii?Q?pcRST5rv0X2cU/kT6l+iwK2Eor557itFCMtGraW/nAUkXpTV9ZM1E6BjowhM?= =?us-ascii?Q?mz+ihtSp09D+gnU83yO7c1yoD8fCSm9VLTTBggcGZdpX1p7V6xP0dOLkslK7?= =?us-ascii?Q?1v+kL1T4chNHora4dyqsD244F8fxzEklW6VHk1BwhZet6B8zSa7L9M2SnxiT?= =?us-ascii?Q?uls+fveLVsBXPvfh5uQESRIx5nBkoCdjVF9xgemREJWmXcQVpspNKQB9qu1S?= =?us-ascii?Q?bOLxSPAryFC++PsLt+XV9XMzMCExqkm8JZdCGFyhPudLkhu3UIMidYSTDtQZ?= =?us-ascii?Q?fyg+AAYlf93PEQMskytSbZsq3bqaPhJOglqkPJ/c5JSZndLSVJvFrQCzb/cr?= =?us-ascii?Q?x89cXglgimoFP+YgLCR+dLQZMjhBXBZZBRiZujzq4gKcRS+PQf93iMNvrxHA?= =?us-ascii?Q?CyLqLOcHQFvH6JFimgMJh9E8Iih357E7cVVu04EYpkwTUF?= X-Microsoft-Exchange-Diagnostics: 1;SN2PR03MB047;5:7fHTfhUqoIIEWxuT12zhKjCqnxhXGvvltp3qn857Q/IRWyIxq/wfMM6d48qmppAz1E3JdI4rZibtu3Artj4fMK483H/ZN0VMzc9Tm9tfdEuDt1O2Lq8t8RUD/19zSPmMhCmEYLHVZCRxJVseVH9Kaw==;24:WbHjqSvXgGW/G4qLpiXyChLwY8Xsdpz+zx8vLls4/Tum4H5j8knz2Hjh/Vn5WEpuXjgFFYpEOr/0L7g0A85xp2SNJ6MU0eB1B2yGAb1ZyNY=;20:HUAvuhvRSh1gdcVq0d/BbESAldnsvU4oFXRgaJA3z9Q7xYZqYDRtp/sLTVUO62XWmpog+pCq/8AoG7bXWgCYKRfdyuVlfWywNAG2pvYHVnPiriHxB8Z+yE8Qig1osZqahYw+z3pXX5CzwqJSlwlNpMdMh+gd9iJFWDWsawVW0+w= X-OriginatorOrg: opensource.altera.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Aug 2015 14:43:24.2793 (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: SN2PR03MB047 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 7825 Lines: 227 On Thu, 13 Aug 2015, Moritz Fischer wrote: Hi Moritz, Thanks for the review. Will include your two nits in v11. > Hi Alan, > > thanks for continuing to work on this :) A couple of minor nits ... > > On Thu, Aug 13, 2015 at 10:37 AM, wrote: > > From: Alan Tull > > > > Add a document on the new FPGA manager core. > > > > Signed-off-by: Alan Tull > > --- > > v9: initial version where this patch was added > > > > v10: requested cleanups to formatting and otherwise > > s/fpga/FPGA/g > > rewrite implementation section to not reference socfpga.c by name > > other rewrites > > Moved to Documentation/fpga/ > > --- > > Documentation/fpga/fpga-mgr.txt | 171 +++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 171 insertions(+) > > create mode 100644 Documentation/fpga/fpga-mgr.txt > > > > diff --git a/Documentation/fpga/fpga-mgr.txt b/Documentation/fpga/fpga-mgr.txt > > new file mode 100644 > > index 0000000..c5259e4 > > --- /dev/null > > +++ b/Documentation/fpga/fpga-mgr.txt > > @@ -0,0 +1,171 @@ > > +FPGA Manager Core > > + > > +Alan Tull 2015 > > + > > +Overview > > +======== > > + > > +The FPGA manager core exports a set of functions for programming an FPGA with > > +image. The API is manufacturer agnostic. All manufacturer specifics are > ... with an image ? Yes > > +hidden away in a low level driver which registers a set of ops with the core. > > +The FPGA image data itself is very manufacturer specific, but for our purposes > > +it's just binary data. The FPGA manager core won't parse it. > > + > > + > > +API Functions: > > +============== > > + > > +To program the FPGA from a file or from a buffer: > > +------------------------------------------------- > > + > > + int fpga_mgr_buf_load(struct fpga_manager *mgr, u32 flags, > > + const char *buf, size_t count); > > + > > +Load the FPGA from an image which exists as a buffer in memory. > > + > > + int fpga_mgr_firmware_load(struct fpga_manager *mgr, u32 flags, > > + const char *image_name); > > + > > +Load the FPGA from an image which exists as a file. The image file must be on > > +the firmware search path (see the firmware class documentation). > > + > > +For both these functions, flags == 0 for normal full reconfiguration or > > +FPGA_MGR_PARTIAL_RECONFIG for partial reconfiguration. If successful, the FPGA > > +ends up in operating mode. Return 0 on success or a negative error code. > > + > > + > > +To get/put a reference to a FPGA manager: > > +----------------------------------------- > > + > > + struct fpga_manager *of_fpga_mgr_get(struct device_node *node); > > + > > + void fpga_mgr_put(struct fpga_manager *mgr); > > + > > +Given a DT node, get an exclusive reference to a FPGA manager or release > > +the reference. > > + > > + > > +To register or unregister the low level FPGA-specific driver: > > +------------------------------------------------------------- > > + > > + int fpga_mgr_register(struct device *dev, const char *name, > > + const struct fpga_manager_ops *mops, > > + void *priv); > > + > > + void fpga_mgr_unregister(struct device *dev); > > + > > +Use of these two functions is described below in "How To Support a new FPGA > > +device." > > + > > + > > +How to write an image buffer to a supported FPGA > > +================================================ > > +/* Include to get the API */ > > +#include > > + > > +/* device node that specifies the FPGA manager to use */ > > +struct device_node *mgr_node = ... > > + > > +/* FPGA image is in this buffer. count is size of the buffer. */ > > +char *buf = ... > > +int count = ... > > + > > +/* flags indicates whether to do full or partial reconfiguration */ > > +int flags = 0; > > + > > +int ret; > > + > > +/* Get exclusive control of FPGA manager */ > > +struct fpga_manager *mgr = of_fpga_mgr_get(mgr_node); > > + > > +/* Load the buffer to the FPGA */ > > +ret = fpga_mgr_buf_load(mgr, flags, buf, count); > > + > > +/* Release the FPGA manager */ > > +fpga_mgr_put(mgr); > > + > > + > > +How to write an image file to a supported FPGA > > +============================================== > > +/* Include to get the API */ > > +#include > > + > > +/* device node that specifies the FPGA manager to use */ > > +struct device_node *mgr_node = ... > > + > > +/* FPGA image is in this file which is on the firmware search path */ > ... in the firmware search path .. not sure if that's better though :) I think on or in are pretty equally good here, but I'll go with 'in'. > > +const char *path = "fpga-image-9.rbf" > > + > > +/* flags indicates whether to do full or partial reconfiguration */ > > +int flags = 0; > > + > > +int ret; > > + > > +/* Get exclusive control of FPGA manager */ > > +struct fpga_manager *mgr = of_fpga_mgr_get(mgr_node); > > + > > +/* Get the firmware image (path) and load it to the FPGA */ > > +ret = fpga_mgr_firmware_load(mgr, flags, path); > > + > > +/* Release the FPGA manager */ > > +fpga_mgr_put(mgr); > > + > > + > > +How to support a new FPGA device > > +================================ > > +To add another FPGA manager, write a driver that implements a set of ops. The > > +probe function calls fpga_mgr_register(), such as: > > + > > +static const struct fpga_manager_ops socfpga_fpga_ops = { > > + .write_init = socfpga_fpga_ops_configure_init, > > + .write = socfpga_fpga_ops_configure_write, > > + .write_complete = socfpga_fpga_ops_configure_complete, > > + .state = socfpga_fpga_ops_state, > > +}; > > + > > +static int socfpga_fpga_probe(struct platform_device *pdev) > > +{ > > + struct device *dev = &pdev->dev; > > + struct socfpga_fpga_priv *priv; > > + int ret; > > + > > + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); > > + if (!priv) > > + return -ENOMEM; > > + > > + /* ... do ioremaps, get interrupts, etc. and save > > + them in priv... */ > > + > > + return fpga_mgr_register(dev, "Altera SOCFPGA FPGA Manager", > > + &socfpga_fpga_ops, priv); > > +} > > + > > +static int socfpga_fpga_remove(struct platform_device *pdev) > > +{ > > + fpga_mgr_unregister(&pdev->dev); > > + > > + return 0; > > +} > > + > > + > > +The ops will implement whatever device specific register writes are needed to > > +do the programming sequence for this particular FPGA. These ops return 0 for > > +success or negative error codes otherwise. > > + > > +The programming sequence is: > > + 1. .write_init > > + 2. .write (may be called once or multiple times) > > + 3. .write_complete > > + > > +The .write_init function will prepare the FPGA to receive the image data. > > + > > +The .write function writes a buffer to the FPGA. The buffer may be contain the > > +whole FPGA image or may be a smaller chunk of an FPGA image. In the latter > > +case, this function is called multiple times for successive chunks. > > + > > +The .write_complete function is called after all the image has been written > > +to put the FPGA into operating mode. > > + > > +The ops include a .state function which will read the hardware FPGA manager and > > +return a code of type enum fpga_mgr_states. It doesn't result in a change in > > +hardware state. > > -- > > 1.7.9.5 > > > > Cheers, > > Moritz > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/