From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752010AbdGEOXG (ORCPT ); Wed, 5 Jul 2017 10:23:06 -0400 Received: from mail-dm2gcc01on0115.outbound.protection.outlook.com ([23.103.201.115]:47836 "EHLO gcc01-dm2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751659AbdGEOWc (ORCPT ); Wed, 5 Jul 2017 10:22:32 -0400 Authentication-Results: spf=pass (sender IP is 131.225.12.125) smtp.mailfrom=fnal.gov; cern.ch; dkim=none (message not signed) header.d=none;cern.ch; dmarc=pass action=none header.from=fnal.gov; From: Pat Riehecky To: CC: , , , , Pat Riehecky Subject: [PATCH v2 03/05] drivers/fmc: The only way to dump the SDB is from debugfs Date: Wed, 5 Jul 2017 09:22:08 -0500 Message-ID: <1499264530-5859-4-git-send-email-riehecky@fnal.gov> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499264530-5859-1-git-send-email-riehecky@fnal.gov> References: <20170705102713.GA20907@mail.gnudd.com> <1499264530-5859-1-git-send-email-riehecky@fnal.gov> X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:131.225.12.125;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(39840400002)(39410400002)(39400400002)(39450400003)(39850400002)(39860400002)(2980300002)(438002)(189002)(199003)(48376002)(50466002)(4326008)(36756003)(478600001)(626005)(110136004)(54906002)(5003940100001)(6266002)(107886003)(47776003)(575784001)(38730400002)(86362001)(50986999)(50226002)(7636002)(2906002)(356003)(104016004)(8936002)(106466001)(305945005)(33646002)(7596002)(2351001)(2950100002)(6916009)(189998001)(6666003)(4720700003)(5660300001)(53416004)(8676002)(76176999)(43043002);DIR:OUT;SFP:1102;SCL:1;SRVR:MWHPR09MB1485;H:smtp-ux-prd3.fnal.gov;FPR:;SPF:Pass;MLV:sfv;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11FD003;1:TFo61seVTN8wkArYJVTJI9p5dfT272+vM94BXThF/vhYhKX1no6crbhwlAGy6hsuKHrb7xDWByE/qwW7zOQ1CqBqguLxUbqJkUcTBMSAGgBGmliatYTPV5LKYjRMkEcljgqO6UG0Y5ups26jD3PrG1xr61fdB4igVA1/zn3x0n3P7ijBv1oL2L95FeeCowZ2MdDW4HCMwzwJnPOm7u4+Su1I+6Km6przR8Mgy99OabmmeVHEqXglVxWrpqCCPX4sMC1RE4VBVXt+NjCag+qdt6IHLCC/qaPu10UjfJf7eXGZZ85cn342P20c/Cwy3W6Zl9+ku2StK/UHgUfto699pW7Bl+XlEarEUIbPn4XGYsLAuLhTIRYQEywgocUJK96FXVNlmKQ8a9wGTevDBeWozppiGtPljvJdTwyeYfBTwZq8jr2l12/Y9kaJb5FpCICRNGLZ4oWLTs0rlUJtvn9CMJ4j4eZB7Os99aa+38FppyeJK1i88cZhtIqjm6l+FqAVeDSEXbKj7mcL/5gNf5Y64N+PSwZVi/m//42NMKBUfqA+PmQyzhkuWNHVOnIX/FWL4DNvIqDKEClE1qhXkJ2EaQYCxJN2AIFZvYboW/ibkTXBSMlCiBoEyXf3d3JLB49daRpPbdhxLlN6OZIxxVS/JqUgLTT9q9JkG3T4X4pMF1KevPwY5/eNG2As4wCvw0Zr7LvbwnvMp49KdASRRRmjxaGOyjbg0TXISyIlAjU2TXw8ULeiBLfqQGKgU6c4W8RxHC2KMq0vy9wdEkW98SDmBoXqINmmB4B3OaqlTmr5lKUd6zrub6ph3NxdMdaW6Ms3ONkdBaGpF/czQO7tAZvEedJnOJHxJPSyTiM6EOeJXB1ndd7T6bVcDiXLAu7LhP4+x2rT+QDOIQBCfBj96YQLwQ== MIME-Version: 1.0 Content-Type: text/plain X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d9d0b100-f01f-4d2a-bbfe-08d4c3b143cb X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(8251501002)(2017030254075)(300000503095)(300135400095)(2017052603031)(201703131423075)(201703031133081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:MWHPR09MB1485; X-Microsoft-Exchange-Diagnostics: 1;MWHPR09MB1485;3:zHP5TgaaWUg6ZPTA41MnEZZ4sLguybYYfBMLoefG5XAOzMK2lE0a3cCPVXyJOfa9WLbz2mgFOXgQCgtmWTmaZj7CtOx8w9ZPD4IqT5dcp6Id9+8WFV/8Os4zpM5qdJl6oGrsaFBYFqx1eeFSKOEkxSBtDb1toimmvUtEBBW/gBRmanFrHscQ61+e93NxNXoVWkdjPwyn76X2qmmT+FEq+BJ5cNKqId4KnLp1xXZYP6fFypgCyjhbZRQmkp8uOx0Xnm/Czrkydy8q3Lkf5K35TmplhftrNaDzV4MtK68VMC7TeNLuNirk3M0EEOjuROODCQVo2eXUs0KKm5+G320XfWXe1JxDctEHFOL2zCwXYUQhyT0GsYfYMDNmLJyTI70XyNyniA9QchXVgnkGQfFeMnYjnvm1bmc6byTLHbim/12GgVeCzpsnbyWDezg39T3e0zIg8GWtBiRcZEHQwF2oTdagMN/ho4QlgSjfdwD4FksymRupZq+W876lI4RGS/smCV8Llk/4Lbsx6BBhe5hjVVg4/WHWaCrGmbL/8O152N32/SMm+Iw9sDVKuqRIOdIe8CRVdTB8cknkyx8hmFJIPyWySXyz/Z0PJAWiPF71oQiHz4y2r9GAaZ6xJTRXkFifSVcfdpIGVyd+JMeMncizJQejCISj2sZ/AZMGWQpzOTxG5ENhS7aDij6rnvb7NeiN8qmk2GqSRW/DcqFaoZcmWz7AoxYLwRC9hBdh2M+hF/7j+D1mXuSa/5l3a2t/xvNqvZV7eCegd1eEZ1/65km+O2GOOa0q/SFNHw7nMx1CZ5C429cNgyknHJq++zttaex11AJUg+DrgfVkmde5jV3KJp73oc4qcylFpUDlG96aeh3rGtHFmmhH94xIFRg7QF3PXDCUYX9Ar31QDrTmiljU/nihe2wNzYQD1wud/KTK1w4/M8unynY8MwhuJiSzdW+3 X-MS-TrafficTypeDiagnostic: MWHPR09MB1485:|MWHPR09MB1485: X-Microsoft-Exchange-Diagnostics: 1;MWHPR09MB1485;25:5kxW6FxL2CEyNsjUz7/LpPOQhJ7v8fwmV6HtGYo797e0Dp95lfypvk0RtI2ugh3yhtKiEedil2krLx9WdVF7B4PF3xjTS7/uR/ot4GhthzLU1GqlO8GjY9aiPlNUaOwdYXkU5Bx3mkB27966spnqUdsa1qBg1DBab1tIzvdtgceg9n066rQ2IzhIbQ0Ymjs2+sQMJxs/3CDJ7lOquLGgXxBtMwHOhijGc2whan8FntAiY7Qz097UNicBuh6HUFErDHB+aG7iHnCIkVei21TxX/u9ebkxhzd1vRJnGt0U/3F2W4aG4TEv5rUSXOQXwIwCq+Tgv7Md0NBGAiizJNw1gbtLacrkU7s1TQozqTuV+LGO1rzSKu4DQtS+BMDHSey02bd+v7cUrv9wq/K4Vx5zl9JMJR0fWyXdd0iaV8QEygiTV019S4YCOrjaKxYpM8OjUPWeuJbh6PV2WAX7h8+I28GEum6KW6yhaeX+jNsaKlg7suKtbmnz3JmKTup+LW9F9+zakU+Dqoq2NsnTZL2fysJUEKm4NnegKtFTcpaMEquVL1QV8pTgwpGq1VFNjJ+R//GxmMUf7a1G1hVB1vVVDptd+bCtvHVQIx2s6df6Oy4dliHLdJYRaEsUP6KIdJLKjFJvn2+PU16kGqrR62B9rntmwj9y+TcjDZzgRwvhDaU6HtZ/3NGdAU95e9u7HgA6+OHIn9b6Vy/EETfb4ioxpP94Ov+Jl3VmV0Cl9zC+0nqj3am/8cpuwJW61Uo3ZfPsTzH64hz0NTcsrSaJGK7LquE6PiPSaVvSB1IfjJwHVXTuQAA5MBc2nChonY7RDimU3GAZvPyY/YL7M2qgG0/ZLJ2Kk9DJDG9WFmow50ZUoB/pvZWZqdzlqz3/rviAgpKR+btaByneiXkQxCFlphR7bHzUr2aUE4YF5my+U32btGo= X-Microsoft-Exchange-Diagnostics: 1;MWHPR09MB1485;31:wsS4FNhv3+ruabemzB4kX0adSv8+WoG1V1TvXabAcGc34ysUv+Tr2ovyJnTiZOzfSMC/jRAmh4fSt6VxgaKrA8y/cWjsV1NzE2LmBls2+poXiGMja+/Jv0oTRlRhoriRm2BIuxz7zIA30eHluyRIqomVF1eB7ttLNQQkW4fFNvgN2We804KbHShJxVShl4h4XSk6lSxr0oVuoLTDfeKrHK1LLzzvj5L01zfPIexfepYvl6VcxteLFX8nY2OHtfBPBRWhBqwTvtqRzlDSY4WJQ/eIfzw32OMSATVNC6H3oa9LnItkVmg82ZvOPO4HKh+BlLiVTjB/ILOpJJgIxGw4XbQS6spoCygDd+yV3HSGwHO0yiBAN3pLB0IDF88MqAUTrGnQqd8Evr99YrN4c2O15k/ovabJ5TFxG8H4RKVp4QUh1DtwED4L4MXBeGYpgJm2WZ3Rkwj6CG4VkG6jOj0Uh1VY626F40iuBOBjuaYXZiHmKlkWkh3nx5TaYM+sS/ir2DeK0A0Th6nv16ktmX8N0zmhN5vUxJ03M47OwlFDZRQzXAQbhad+fvVhOvzN9RKTKhDQT/XOGlD7VUqCyymv1UN/orijVJzAmp2sBkAqgEBDiMg5RgYkdQWqZGRTMx/65K334jonhrQJjd0BtqLxgNOJCAZq2Mrb28eTDf5J23Y= X-Microsoft-Exchange-Diagnostics: 1;MWHPR09MB1485;20:a+qys5jBKgidYpxctY3zztaU9HRi+p58QlODv1p/6ruhB4hYksjfo2Q1ezXsLjjZF7IxP+WRB1ZqE9fBQD1Qw984k0AHzgn9U6uHoznJ5zhlPfVB/Qhn5wfTFNjJhuZi3G1ReVehho/5Au2g3aT2FA04R93nuCo0eZ83AsUCq6ogK/khSNiz7kvlBvhnPybc1oV5w5cK6B2jOWP0y93m9cHIFisxnehisJvei+nKAh7mwspmzd0noJHixwJA3tkrnGEZ8lwGyrfqhZouvixcUJW/0RyuuOaKhnvmazeWz/Pz/mjkr5l5Llbtjrol6LaOgrTOILy6px8Hj1WXKpfv6YiR4jtBZRC2Tskb4xYlUIYS+2bYs6mNf1pxhPWbpXBwqsyQUNfMizawusSnqp0Vk46W1YVjURUT6y0ISu4eG0sZhfWvAnAM5GrI13nycN4GpI7EXTQ0WDJ2rmNPxik/wNxrF7E3FEGO0PCz3TObB3zQAOXUvvNjBokXqQVJNNoF X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(133145235818549)(236129657087228)(40475595445134)(148574349560750); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(13016025)(5005006)(2017060910033)(13018025)(93006095)(93004095)(10201501046)(100000703101)(100105400095)(3002001)(6055026)(6041248)(20161123560025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123564025)(20161123555025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:MWHPR09MB1485;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:MWHPR09MB1485; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR09MB1485;4:0izWjAsaR+W91NY6keqHHmDUyz3Uxxcyde32yB87A6?= =?us-ascii?Q?JRSgpyc18wVCRCTbqPFrbcpRYw6YfG6ZFgHo2fbo1cYCYbpY7AsJCHTrvaBO?= =?us-ascii?Q?SXcYguwtAMtIwwS8pHQfEhls+IFHiFetvqZYKXhfMvJhtN2qoN9RVnQBcLN1?= =?us-ascii?Q?vP4ojnHy6G6HlPyFoNVaYglka9lfaJPthuvxi7iB32bXxXKGAKc3ceNhtFzA?= =?us-ascii?Q?IDLAtvAZOGm63aRbhiahkXn6DX+4CJn9hp7UXr11qbx+R0Q3NuIvZ3E9uyj5?= =?us-ascii?Q?E+rjX29AoD70aixaUfETjXNaL1G1vGfA1+APc/MbaWzKQjZzGMVN7qgePQLy?= =?us-ascii?Q?xLlmhMshqR13E1uZCIvLcHhnDOfhBzhGg7/L523XaWfUhScEZ3BU6DM6QhEI?= =?us-ascii?Q?BDSpWNaOLMsDtvaoql33dxfrEPJF8YSqiXzJLkfH4/vnV3AiPcwFsoD2UhLh?= =?us-ascii?Q?UVlyMQ2b5CGjPFIZlXh5X48VOtAtyVTzLDcJfu9Vn8auqqm3SjLerPRmSXqR?= =?us-ascii?Q?5oWy6Qa0of2rvmLa7+atuObU3MR3Wtp8rpxNI/59dI7nG0FLgnUQ0UxrVt8F?= =?us-ascii?Q?FmEmVRqYnihBgfcSu5oIg0ZZdsWWAbnJ67PzOqdtJ7fvk5LLI+1LLErCy1r7?= =?us-ascii?Q?O+J4KPgkBwORfmlJXkSzfLNwODm1FxgH+qZzFkXOMJLqTSQBsjTeD/0h1SaH?= =?us-ascii?Q?GNMb1X+XPgoojq5uhoRF63Tw8XruxcdcnWJ4JLsAXHljL6sv3jls6eioDC6W?= =?us-ascii?Q?vNg+vCKbbKTMP4YdPTlkJAcAmI4DC6YoXKkftkwJ4BomrOfMMGJBr79brXCc?= =?us-ascii?Q?f4gtX2m6Nmd6bLd1CTzyEa/a450/haMzyvujI4HKZZGcdHx2PCnMOb1ZlwMW?= =?us-ascii?Q?WnMIGd2x1WFdXFW8qIuxUtaK//cZ6Sm5xK1ljM5UU7DXE1fX/Gko611Laj3x?= =?us-ascii?Q?9fNTBYYe9IWv/BLJLPAKqbmv73PNYQRK+1KFtXHJjcINbifie+ZSvrtAgh88?= =?us-ascii?Q?zQJrCclKc87QxDI4w/Uj76Lp+FyCBSCR7XYAgUS392Wfjiu99omPJ/Un4ywP?= =?us-ascii?Q?VmQa0hByJNsRCpr69Oohu8fL8zwVBObu/n27PsGVpZKW9ZBfgZxmB6HYwxQs?= =?us-ascii?Q?QKb+NbOMOjrmDEqeYbKTBpVTu4QGQglvZkGx+SXnwHQsQgePRix6SFw0YfZA?= =?us-ascii?Q?jzKuZcHlJ46GqXqocwgbvuDWaWrrew8I++T9t4/73p9VbRFgG0Kjct6v58Tp?= =?us-ascii?Q?u998ssqEW6j2l9rfsqwIdwow9ea6gA4IryolIkP05I1+EUjeeVoF1YYjm0fa?= =?us-ascii?Q?7DYNVTzHhXRJ7gdEuaLxIljPWbBRy+pog/l1Q810X+pT3o6WOuAlRMENwFFo?= =?us-ascii?Q?1j7gOZhyUn9EX7X63MKifYz44=3D?= X-Forefront-PRVS: 0359162B6D X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR09MB1485;23:wdpLWmAglKyVZw8FHhoxXZhbww10a40vJX8sRnRgP?= =?us-ascii?Q?pklfq7YZHNr9a920WdY4dckHWvopPvqON3RzpVhnru7jaVxI5Hobs0MiDMMS?= =?us-ascii?Q?X61qka3/gMFjiDI654LCF3VyonRtJjslTsH9wwZcV+hs+48xAzcHlrv/ksZy?= =?us-ascii?Q?AjE1Px/WfROcF8hN1IxeYoFKEXGHo1kcTRH99x4vDtw/L9heIKiJZafHCIJz?= =?us-ascii?Q?Sq8vB11WE5UzrZeEFs3IuvZBRlwrZw/ZtdgkOGsG7Pf/zXlLzBClBlbKcZVy?= =?us-ascii?Q?9/KFyQ1kCcUbiIrqOM/N4vsW/SyjbaSip9NPK3M0tMNYkPHVja1aSVlJP74v?= =?us-ascii?Q?yOeE0UJymaM4l5sBTcipSFKNFWUP2cBCuD0YkxKasUOhQbWAforQ0VfLr/Sa?= =?us-ascii?Q?cwgvhCLRwbiH5YOoZULrmgFfUxZDmGPjiT0q278KFDkTp86EIb3Ux78AmehG?= =?us-ascii?Q?Lzb2Gbq3jxT4rW/EXnJRp0HoH1Gk76X9omADLe0m5g9576TEictIAAVHwDp5?= =?us-ascii?Q?SR8Fad25XDyL93o7AbIFM854+p19zvwqmffAVxW1vuCoKqe8PMcsGdBfe2+0?= =?us-ascii?Q?CAleWRgSE/ZX5/COaQ5OPcPBc+vYu1nJZS6DNfmQyDTNF6kILeRDEL1J8Xfc?= =?us-ascii?Q?6taRT6TWPgM8m/Rj/MSKu5sYz+QVq2wC4CbXy5U0V+h+kg/ALySFFVmlVUkz?= =?us-ascii?Q?TBRHZaWESkGrSDNsZXvLDpEXG/zNXQYa+p577w+qhYow+D0DIoeJIsIonaKo?= =?us-ascii?Q?ZaXXk/ewfzRHCpyqV8g2gxt/vWk5aJd4FtxZH015SR4lr2vSNSDA1cQzZc55?= =?us-ascii?Q?M0sUEOngWFx8Svqf6Q3I9wUnDk+6XaM71ivwisJrCgVYD/BO+ncP+7xv9Ejx?= =?us-ascii?Q?+tX4ilfsukpvxIqCp2Im6t2r0ms7rFknYxNNFzCC5Aux/u3Xyn5Lfqe2QP2p?= =?us-ascii?Q?NDwcrNICgrYYwXSc5UtlcSQNC1PxrGZQ3ywgqVOYYAgZU/765vZ2l5Bqpc3D?= =?us-ascii?Q?vpLK7uUNyEbW8+YtkUJvZIK/BDvF4BcHbijSIrl8bzV4j0nNyHVNDnmGN+d6?= =?us-ascii?Q?GxIDb6uiVrFJbeoxdIYPf3Kj5RwPwiTFCTQvcYirfpE1l02bhNJuDVOqp2md?= =?us-ascii?Q?JyFSo/Alt8BD+3kkbADZr59YR2SlRk9ltA5fyB/pdaZVoaLwOvsh68qCjQmy?= =?us-ascii?Q?BcnRi4oNFm4R5I=3D?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR09MB1485;6:PG4mUuyC0lbznRXPZxxFzJ9WsmUPKTera9f1kYVV+R?= =?us-ascii?Q?JtMdUDgCQ7aXvfhFUJ1n8PUZFX3ftpjpgzxwrT8hODBIE1GZnSly88JfUrfh?= =?us-ascii?Q?/32MH3UyjKBKxBwGo/mJMmx0P/foEToNz6MlbANc4FF38gQf0DxmPucsMcbn?= =?us-ascii?Q?1VElWzxGSwKEip7zLh5dkFKVrHOYR+23ZnbOBmbaoZgXKruuqfd+iHIny+Hs?= =?us-ascii?Q?lmU4ditUrGMsLCjzJw8zuzs4Azoq9dEQD3MA8oueCpnF4n17iQXhsYfZ+JbX?= =?us-ascii?Q?fi0M5a9QbOmM29cNjNnObjgOpMhPMVB6Wc+jFgw+3QV7+pB+3GI13i9jj6x9?= =?us-ascii?Q?ncni8HbHDMh2te2jqScOMDF02d14w3PbSpziyxJ0MDDMbEjKTcOga3VsCKLk?= =?us-ascii?Q?O2W/kTeSJiW6gF13dcMORExRaagH0Ybqx8A1Z1KO7WOBFxLJ8xV3TGBrgThO?= =?us-ascii?Q?IGnTvkYUYPz1qfZUCjxmtX7jBJ+jlVu5KnSHDDQcSniVQUFG2XswjykOKd3Y?= =?us-ascii?Q?iAq2S+9bMpEOtFj/7Zy/SkXFBKLzg2ehf5xPY8GfPTfiPnD+7+6wCgDK4zck?= =?us-ascii?Q?Qz83c79ER35X2lqkBTA4DtOmsAtIUgsVgVmd9LItX/vCSEafcBYmv8MP3+Cs?= =?us-ascii?Q?L5B9KjckUbF6NYi4Juz2uYH6e+2XCHVc8enZefvxPZdu0C6maMvjrhhHCbQ5?= =?us-ascii?Q?xMgvIM5RZYGZ1HGiGBvXZ/56WNkZFOJX+KepAR+i2pheW0ieaySwYL2L1EGr?= =?us-ascii?Q?TyxgWDvcM14fMjsC9Q7Z9py+MfJ/USp2I4wud5zl7LMc+QSvEL1I2UmdxF+7?= =?us-ascii?Q?AUC+R8bbjbl0CFe6g0ggjvUbB2vweX4Whsf6f3aJ7DPz4JA6wltTxIIKYSkV?= =?us-ascii?Q?bbNVe8INTJWQVhXzAKKJRBy5Rg7Rs2eqQitQUu04+392p+yiNcVOvkMMdktP?= =?us-ascii?Q?PeW9ZApUxNONhChY+Yal8vIXG/JsKaDazCE5A4atprmHR5JzSid+Fs1i/JbR?= =?us-ascii?Q?UnHLQRGolochNt4sm+IXhl?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR09MB1485;5:hBsjdXue1n4UnWvdqs79pgzcDgdeeLlBYQLQdn0gFDUE3Zd1gSC47qVVwSR+MnObgZMEhoFU0IQjuh54aTwUNxiV7rL5p3oDYn0SOrSqdNCY/0gLHCJ3IPk+qw+v/R1F0+J7ZvHp/+VcVhCAEg0Q0AS7TOAMbE5i41ObmMnvE4YPh40W91hB2RVM7/eOdaAz8jd+tVQR5AvEKZsRCjTVXd/FWonWhId2QX5IP3bvvk31H/TPZyIN7bOuAXgxVX+0RLrc5mwkMmeTvqnGyA/p8JIEXJRXyr1dnD7tPtnRik53IGZ2/ilpiqgvFNwBNPkrbL6N+VgoYT2wDLrwoPLmVPEfU0G694fDOSIi7OnUQCSN6SFoxL3OMk1OtlTvB59vjCladOHOP1OejlX4NgAKkCRHn4JCCFruTm9hxwXbQG47/q4UHS25CqXwc8wFvBHm1ameVLdLc/IuapVA5l+gH0+vW8GW/Mt00SxKICmDRHoEWODOjFEzwjxo21l2qfRw;24:LalW6ZKoSl/m8r/o13qR/Z7Aie0uB2Oh/gJ6S6eS4YHSySVWC6TvUSXXfDSPtG2BVjC2jnS1B/SkIRsX/to4YfZff2aQ+AacSeVG9QvU6A4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;MWHPR09MB1485;7:5dCf4Z+kfyLCzPxDVOs/WtZ4UNyk1384Z4JGE5HAxTDHPDbPgMDb/U93UzNOYofSXuDjghFkcUVX/HuJSR4o/57GYinMKv9rAczxr3QftMGzesRefJ1UsClVVSyo06Er3T5YNro8BMhRhyxP0fYpAYSryCb33aCufy3aYMPrzHJKv3ypJkMbtzn2TaOsP+unIpzVCI+wSM2NFh+/jbn7QpoxpR7QDjoODtLS+58YdvGJiVa2s7a7nQ3TDXgYHJ00O+YQg2OxokZ65wtLMU+MGKWvnKKzPAXmfiqVyRPYpYO51ckZ8fCk+4iIhkDTGCZRWvU12YL1Z8cMrSoVpDmn9j8Xa7l3gpsC489bowehMGljp1WYnqockOdWFImz/r0tE5G2Yz9q6ar4mLdDfZpjK7G2HFPgC+Y78i/3PwC4QIk+nKRQcBb4qceryjK9Z8FmzNl7idLIg+UAlUr6GlOOvvD84YdAVpK0HLB4Rxy9Mo1VLoRBOmfiZh4F5+0tOOr1g6na2cTRUiylWJhtmbLyOBjnQ+fJ+BnZfWuldz0EjV3KJQ0RsL53w2X3hEY4oarSwhyCFXKKORJMbOK32LnxXEpMidcmYBXMeQXICEpD5QboRNCYBc7Ai/USDQh4jZPjDzk3kVAx746lCmUDvijL+z23ixTY7ATyBENw5v9eRz+qIHVFLLKfftQxkF1BMQnVPeEjTbItyVThxy+fvvKOQ24nbqp8peTbNDxl4hP1BUdafLBIzpX4URm9xBvniTme70UIvkcquXOpxKhyAg0GuK7KQs8mnSrqdhtdIY5CfOY= X-OriginatorOrg: fnal.gov X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Jul 2017 14:22:27.8731 (UTC) X-MS-Exchange-CrossTenant-Id: 9d5f83d3-d338-4fd3-b1c9-b7d94d70255a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=9d5f83d3-d338-4fd3-b1c9-b7d94d70255a;Ip=[131.225.12.125];Helo=[smtp-ux-prd3.fnal.gov] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR09MB1485 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Driver should not call fmc_sdb_dump() anymore. (actually they can but the operation is not supported, so it will print an error message) From: Federico Vaga Signed-off-by: Federico Vaga Tested-by: Pat Riehecky --- drivers/fmc/Makefile | 2 + drivers/fmc/fmc-core.c | 7 +- drivers/fmc/fmc-debug.c | 171 +++++++++++++++++++++++++++++++++++++++++ drivers/fmc/fmc-dump.c | 41 ---------- drivers/fmc/fmc-private.h | 9 +++ drivers/fmc/fmc-sdb.c | 99 +----------------------- include/linux/fmc-sdb.h | 1 + include/linux/fmc.h | 4 +- 8 files changed, 195 insertions(+), 139 deletions(-) create mode 100644 drivers/fmc/fmc-debug.c create mode 100644 drivers/fmc/fmc-private.h diff --git a/drivers/fmc/Makefile b/drivers/fmc/Makefile index bb6efcd..6e2ad7b 100644 --- a/drivers/fmc/Makefile +++ b/drivers/fmc/Makefile @@ -6,6 +6,7 @@ fmc-y += fmc-match.o fmc-y += fmc-sdb.o fmc-y += fru-parse.o fmc-y += fmc-dump.o +fmc-y += fmc-debug.o obj-$(CONFIG_FMC_FAKEDEV) += fmc-fakedev.o obj-$(CONFIG_FMC_TRIVIAL) += fmc-trivial.o diff --git a/drivers/fmc/fmc-core.c b/drivers/fmc/fmc-core.c index 60e568d..50e18ba 100644 --- a/drivers/fmc/fmc-core.c +++ b/drivers/fmc/fmc-core.c @@ -13,6 +13,9 @@ #include #include #include +#include + +#include "fmc-private.h" static int fmc_check_version(unsigned long version, const char *name) { @@ -289,7 +292,7 @@ int fmc_device_register_n(struct fmc_device **devs, int n) } /* This device went well, give information to the user */ fmc_dump_eeprom(fmc); - fmc_dump_sdb(fmc); + fmc_debug_init(fmc); } return 0; @@ -301,6 +304,7 @@ out: kfree(devarray); for (i--; i >= 0; i--) { + fmc_debug_exit(devs[i]); sysfs_remove_bin_file(&devs[i]->dev.kobj, &fmc_eeprom_attr); device_del(&devs[i]->dev); fmc_free_id_info(devs[i]); @@ -328,6 +332,7 @@ void fmc_device_unregister_n(struct fmc_device **devs, int n) kfree(devs[0]->devarray); for (i = 0; i < n; i++) { + fmc_debug_exit(devs[i]); sysfs_remove_bin_file(&devs[i]->dev.kobj, &fmc_eeprom_attr); device_del(&devs[i]->dev); fmc_free_id_info(devs[i]); diff --git a/drivers/fmc/fmc-debug.c b/drivers/fmc/fmc-debug.c new file mode 100644 index 0000000..33fca9c --- /dev/null +++ b/drivers/fmc/fmc-debug.c @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2015 CERN (www.cern.ch) + * Author: Federico Vaga + * + * Released according to the GNU GPL, version 2 or any later version. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define FMC_DBG_SDB_DUMP "dump_sdb" + +static char *__strip_trailing_space(char *buf, char *str, int len) +{ + int i = len - 1; + + memcpy(buf, str, len); + buf[len] = '\0'; + while (i >= 0 && buf[i] == ' ') + buf[i--] = '\0'; + return buf; +} + +#define __sdb_string(buf, field) ({ \ + BUILD_BUG_ON(sizeof(buf) < sizeof(field)); \ + __strip_trailing_space(buf, (void *)(field), sizeof(field)); \ + }) + +/** + * We do not check seq_printf() errors because we want to see things in any case + */ +static void fmc_sdb_dump_recursive(struct fmc_device *fmc, struct seq_file *s, + const struct sdb_array *arr) +{ + unsigned long base = arr->baseaddr; + int i, j, n = arr->len, level = arr->level; + char tmp[64]; + + for (i = 0; i < n; i++) { + union sdb_record *r; + struct sdb_product *p; + struct sdb_component *c; + + r = &arr->record[i]; + c = &r->dev.sdb_component; + p = &c->product; + + for (j = 0; j < level; j++) + seq_printf(s, " "); + switch (r->empty.record_type) { + case sdb_type_interconnect: + seq_printf(s, "%08llx:%08x %.19s\n", + __be64_to_cpu(p->vendor_id), + __be32_to_cpu(p->device_id), + p->name); + break; + case sdb_type_device: + seq_printf(s, "%08llx:%08x %.19s (%08llx-%08llx)\n", + __be64_to_cpu(p->vendor_id), + __be32_to_cpu(p->device_id), + p->name, + __be64_to_cpu(c->addr_first) + base, + __be64_to_cpu(c->addr_last) + base); + break; + case sdb_type_bridge: + seq_printf(s, "%08llx:%08x %.19s (bridge: %08llx)\n", + __be64_to_cpu(p->vendor_id), + __be32_to_cpu(p->device_id), + p->name, + __be64_to_cpu(c->addr_first) + base); + if (IS_ERR(arr->subtree[i])) { + seq_printf(s, "SDB: (bridge error %li)\n", + PTR_ERR(arr->subtree[i])); + break; + } + fmc_sdb_dump_recursive(fmc, s, arr->subtree[i]); + break; + case sdb_type_integration: + seq_printf(s, "integration\n"); + break; + case sdb_type_repo_url: + seq_printf(s, "Synthesis repository: %s\n", + __sdb_string(tmp, r->repo_url.repo_url)); + break; + case sdb_type_synthesis: + seq_printf(s, "Bitstream '%s' ", + __sdb_string(tmp, r->synthesis.syn_name)); + seq_printf(s, "synthesized %08x by %s ", + __be32_to_cpu(r->synthesis.date), + __sdb_string(tmp, r->synthesis.user_name)); + seq_printf(s, "(%s version %x), ", + __sdb_string(tmp, r->synthesis.tool_name), + __be32_to_cpu(r->synthesis.tool_version)); + seq_printf(s, "commit %pm\n", + r->synthesis.commit_id); + break; + case sdb_type_empty: + seq_printf(s, "empty\n"); + break; + default: + seq_printf(s, "UNKNOWN TYPE 0x%02x\n", + r->empty.record_type); + break; + } + } +} + +static int fmc_sdb_dump(struct seq_file *s, void *offset) +{ + struct fmc_device *fmc = s->private; + + if (!fmc->sdb) { + seq_printf(s, "no SDB information\n"); + return 0; + } + + seq_printf(s, "FMC: %s (%s), slot %i, device %s\n", dev_name(fmc->hwdev), + fmc->carrier_name, fmc->slot_id, dev_name(&fmc->dev)); + /* Dump SDB information */ + fmc_sdb_dump_recursive(fmc, s, fmc->sdb); + + return 0; +} + + +static int fmc_sdb_dump_open(struct inode *inode, struct file *file) +{ + struct fmc_device *fmc = inode->i_private; + + return single_open(file, fmc_sdb_dump, fmc); +} + + +const struct file_operations fmc_dbgfs_sdb_dump = { + .owner = THIS_MODULE, + .open = fmc_sdb_dump_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +int fmc_debug_init(struct fmc_device *fmc) +{ + fmc->dbg_dir = debugfs_create_dir(dev_name(&fmc->dev), NULL); + if (IS_ERR_OR_NULL(fmc->dbg_dir)) { + pr_err("FMC: Cannot create debugfs\n"); + return PTR_ERR(fmc->dbg_dir); + } + + fmc->dbg_sdb_dump = debugfs_create_file(FMC_DBG_SDB_DUMP, 0444, + fmc->dbg_dir, fmc, + &fmc_dbgfs_sdb_dump); + if (IS_ERR_OR_NULL(fmc->dbg_sdb_dump)) + pr_err("FMC: Cannot create debugfs file %s\n", + FMC_DBG_SDB_DUMP); + + return 0; +} + +void fmc_debug_exit(struct fmc_device *fmc) +{ + if (fmc->dbg_dir) + debugfs_remove_recursive(fmc->dbg_dir); +} diff --git a/drivers/fmc/fmc-dump.c b/drivers/fmc/fmc-dump.c index c91afd6..cd1df47 100644 --- a/drivers/fmc/fmc-dump.c +++ b/drivers/fmc/fmc-dump.c @@ -15,8 +15,6 @@ static int fmc_must_dump_eeprom; module_param_named(dump_eeprom, fmc_must_dump_eeprom, int, 0644); -static int fmc_must_dump_sdb; -module_param_named(dump_sdb, fmc_must_dump_sdb, int, 0644); #define LINELEN 16 @@ -59,42 +57,3 @@ void fmc_dump_eeprom(const struct fmc_device *fmc) for (i = 0; i < fmc->eeprom_len; i += LINELEN, line += LINELEN) prev = dump_line(i, line, prev); } - -void fmc_dump_sdb(const struct fmc_device *fmc) -{ - const uint8_t *line, *prev; - int i, len; - - if (!fmc->sdb) - return; - if (!fmc_must_dump_sdb) - return; - - /* If the argument is not-zero, do simple dump (== show) */ - if (fmc_must_dump_sdb > 0) - fmc_show_sdb_tree(fmc); - - if (fmc_must_dump_sdb == 1) - return; - - /* If bigger than 1, dump it seriously, to help debugging */ - - /* - * Here we should really use libsdbfs (which is designed to - * work in kernel space as well) , but it doesn't support - * directories yet, and it requires better intergration (it - * should be used instead of fmc-specific code). - * - * So, lazily, just dump the top-level array - */ - pr_info("FMC: %s (%s), slot %i, device %s\n", dev_name(fmc->hwdev), - fmc->carrier_name, fmc->slot_id, dev_name(&fmc->dev)); - pr_info("FMC: poor dump of sdb first level:\n"); - - len = fmc->sdb->len * sizeof(union sdb_record); - line = (void *)fmc->sdb->record; - prev = NULL; - for (i = 0; i < len; i += LINELEN, line += LINELEN) - prev = dump_line(i, line, prev); - return; -} diff --git a/drivers/fmc/fmc-private.h b/drivers/fmc/fmc-private.h new file mode 100644 index 0000000..1e51366 --- /dev/null +++ b/drivers/fmc/fmc-private.h @@ -0,0 +1,9 @@ +/* + * Copyright (C) 2015 CERN (www.cern.ch) + * Author: Federico Vaga + * + * Released according to the GNU GPL, version 2 or any later version. + */ + +extern int fmc_debug_init(struct fmc_device *fmc); +extern void fmc_debug_exit(struct fmc_device *fmc); diff --git a/drivers/fmc/fmc-sdb.c b/drivers/fmc/fmc-sdb.c index 4603fdb..89e37a6 100644 --- a/drivers/fmc/fmc-sdb.c +++ b/drivers/fmc/fmc-sdb.c @@ -145,108 +145,15 @@ int fmc_reprogram(struct fmc_device *fmc, struct fmc_driver *d, char *gw, sdb_entry); return -ENODEV; } - fmc_dump_sdb(fmc); + return 0; } EXPORT_SYMBOL(fmc_reprogram); -static char *__strip_trailing_space(char *buf, char *str, int len) -{ - int i = len - 1; - - memcpy(buf, str, len); - while(i >= 0 && buf[i] == ' ') - buf[i--] = '\0'; - return buf; -} - -#define __sdb_string(buf, field) ({ \ - BUILD_BUG_ON(sizeof(buf) < sizeof(field)); \ - __strip_trailing_space(buf, (void *)(field), sizeof(field)); \ - }) - -static void __fmc_show_sdb_tree(const struct fmc_device *fmc, - const struct sdb_array *arr) -{ - unsigned long base = arr->baseaddr; - int i, j, n = arr->len, level = arr->level; - char buf[64]; - - for (i = 0; i < n; i++) { - union sdb_record *r; - struct sdb_product *p; - struct sdb_component *c; - r = &arr->record[i]; - c = &r->dev.sdb_component; - p = &c->product; - - dev_info(&fmc->dev, "SDB: "); - - for (j = 0; j < level; j++) - printk(KERN_CONT " "); - switch (r->empty.record_type) { - case sdb_type_interconnect: - printk(KERN_CONT "%08llx:%08x %.19s\n", - __be64_to_cpu(p->vendor_id), - __be32_to_cpu(p->device_id), - p->name); - break; - case sdb_type_device: - printk(KERN_CONT "%08llx:%08x %.19s (%08llx-%08llx)\n", - __be64_to_cpu(p->vendor_id), - __be32_to_cpu(p->device_id), - p->name, - __be64_to_cpu(c->addr_first) + base, - __be64_to_cpu(c->addr_last) + base); - break; - case sdb_type_bridge: - printk(KERN_CONT "%08llx:%08x %.19s (bridge: %08llx)\n", - __be64_to_cpu(p->vendor_id), - __be32_to_cpu(p->device_id), - p->name, - __be64_to_cpu(c->addr_first) + base); - if (IS_ERR(arr->subtree[i])) { - dev_info(&fmc->dev, "SDB: (bridge error %li)\n", - PTR_ERR(arr->subtree[i])); - break; - } - __fmc_show_sdb_tree(fmc, arr->subtree[i]); - break; - case sdb_type_integration: - printk(KERN_CONT "integration\n"); - break; - case sdb_type_repo_url: - printk(KERN_CONT "Synthesis repository: %s\n", - __sdb_string(buf, r->repo_url.repo_url)); - break; - case sdb_type_synthesis: - printk(KERN_CONT "Bitstream '%s' ", - __sdb_string(buf, r->synthesis.syn_name)); - printk(KERN_CONT "synthesized %08x by %s ", - __be32_to_cpu(r->synthesis.date), - __sdb_string(buf, r->synthesis.user_name)); - printk(KERN_CONT "(%s version %x), ", - __sdb_string(buf, r->synthesis.tool_name), - __be32_to_cpu(r->synthesis.tool_version)); - printk(KERN_CONT "commit %pm\n", - r->synthesis.commit_id); - break; - case sdb_type_empty: - printk(KERN_CONT "empty\n"); - break; - default: - printk(KERN_CONT "UNKNOWN TYPE 0x%02x\n", - r->empty.record_type); - break; - } - } -} - void fmc_show_sdb_tree(const struct fmc_device *fmc) { - if (!fmc->sdb) - return; - __fmc_show_sdb_tree(fmc, fmc->sdb); + pr_err("%s: not supported anymore, use debugfs to dump SDB\n", + __func__); } EXPORT_SYMBOL(fmc_show_sdb_tree); diff --git a/include/linux/fmc.h b/include/linux/fmc.h index 8bb4a15..5c8df0c 100644 --- a/include/linux/fmc.h +++ b/include/linux/fmc.h @@ -180,6 +180,9 @@ struct fmc_device { uint32_t device_id; /* Filled by the device */ char *mezzanine_name; /* Defaults to ``fmc'' */ void *mezzanine_data; + + struct dentry *dbg_dir; + struct dentry *dbg_sdb_dump; }; #define to_fmc_device(x) container_of((x), struct fmc_device, dev) @@ -232,7 +235,6 @@ extern int fmc_match(struct device *dev, struct device_driver *drv); extern int fmc_fill_id_info(struct fmc_device *fmc); extern void fmc_free_id_info(struct fmc_device *fmc); extern void fmc_dump_eeprom(const struct fmc_device *fmc); -extern void fmc_dump_sdb(const struct fmc_device *fmc); /* helpers for FMC operations */ extern int fmc_irq_request(struct fmc_device *fmc, irq_handler_t h, -- 1.8.3.1