From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754522AbdFWQHW (ORCPT ); Fri, 23 Jun 2017 12:07:22 -0400 Received: from mail-bn3nam01on0069.outbound.protection.outlook.com ([104.47.33.69]:49048 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754352AbdFWQHA (ORCPT ); Fri, 23 Jun 2017 12:07:00 -0400 Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=amd.com; From: Brijesh Singh To: linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org Cc: thomas.lendacky@amd.com, gary.hook@amd.com, herbert@gondor.apana.org.au, davem@davemloft.net, Brijesh Singh Subject: [PATCH v2 3/3] crypto: cpp - Abstract interrupt registeration Date: Fri, 23 Jun 2017 11:06:30 -0500 Message-Id: <20170623160630.63292-4-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170623160630.63292-1-brijesh.singh@amd.com> References: <20170623160630.63292-1-brijesh.singh@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: BN6PR14CA0010.namprd14.prod.outlook.com (10.173.157.148) To CY1PR12MB0149.namprd12.prod.outlook.com (10.161.173.19) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c22a4807-5294-497e-78a4-08d4ba51dcbc X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500067)(300135000095)(300000501067)(300135300095)(22001)(300000502067)(300135100095)(300000503067)(300135400095)(48565401081)(201703131423075)(201703031133081)(300000504067)(300135200095)(300000505067)(300135600095)(300000506055)(300135500095);SRVR:CY1PR12MB0149; X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0149;3:7+3+4s4FcL2dJE7puka4M+2UVigDpFNO2iozidJU0//c1ycPPry6+WvgoARuvdLMKLQNjAWwZbCXoKUQPyncNa61IzkPmmfw1P2AMCDxUI6rujpHb2NzYxxt7pdj3IBEzjQtO9e3gKAnwRdtpplG5rKTNyT7HwE2rOq4cyF6bVpjc/HLNWVb8P0x4WwiHp6v9jHSlI5dvVy3EIlcEHI5WQhWTxbHS6d7dQQz7h7gxFD2GOJVjHCTiCtis5HTq1D6uhxS2yUi9XAIc+JtPYexPQoxGAJibf8hPGXb+bGBjiYsEVfkRoyeMPG9mEoglWaAqWoT0uc9ezo7wxpPXppMsDEEkyKRFZhnNE9pfqToOC1c1K19IhHWzuREKjxC3P3sRraf8bhK5Bkf0TPdYFSN9RxwlsPqc4q6tJODrvc2GQ5njGx27sMMOj+m/dD6uKJBOQh+15Rj/FK6u+w7f8ByxIW4/o1W9BXkaEATTptnlYD97ixiayxVuK0/dr6IJ6nrddi68M53XC2j7T96On9N3X16EToYScyjismakEl2wYMxobcNYingNOpN9oi7WMX9o1cGst2kZCqt3zWmoCtvOZ/6wKBLltCnX+B+n6fqgQ2czrthrGV3+jos9Gg25+HJbp2r8Xeq4vGL6csVOoGEIYbqP/jgvAflOaCv4Slc5n8YykuHgAzSHSujSmdwvnN7AJcXmv7oG6i2DarjRghqikIzIAjyBM0W4i7qbCsasVcFvdbSS2eOM1eFeZQA4By1ADTsGWyJQn8vwTpHu8N+aQ== X-MS-TrafficTypeDiagnostic: CY1PR12MB0149: X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0149;25:/HjNyXTNW/YBI2QiJ2N7Y1kw1Tu2lkmcKb13Uqq+XD/c1aMlXYvbBS7l5jITCu0fZ60gCzhngB8sqzvMpMEGx2DtJcRdjNxuqi12rkUzeNKNv9LAvr0ovgSzP17N/2xVOQ2eCO7QS1UBk3WafUX9vSWE/HuYygH1LXrLpnqHvqOd9ZGoanNC5NRgpePd9QKGvRGj1G286HdggxJC65V28GW2LwRl1ZsRWhv+AfiLUdTIdSumAhIZvVcvWR8ro57bE5jZBP1BE7MGZdmBkUwDgZJQLh6UX9rZFzk+w0u8NbeQ0l6zTYTCnWP8ca25TjPA/TW9OBjsSBeZ/dzxnmAN2nyAx/OU5w78gefUY5Wu7Hgowyr0XlQKSRj4v1HIXAEgjX3EZm3jY7YYWb+2BDfWkYY6P4ccqgJmc9WPN2Mv1xalNti/aLD6tadom5T4ML7rU+6Rc3o8DMHODQKA9JP3B0IBWVzPmzZp7jXpnY/XdsUB9w7na8VXyICQXOvg1JvBiT7FuYNnBWomQzq0FRT0PF+aCX9z/6soOGYRolDtB4BYJ5KdHgKYkdVDkNGkczb/aRCGY77ELhBfEa2CCMbpZPAlgy+aeZLMU6o3Ted8EJQNYTvHV5DdxB8osHoLgBXfGBqro3Pvus8TzAbZNO8d1hNg6xWcg+BBL14OkrNrlwCdg7cVHTb0EfvUhr9XMn8ygIARvXjNXKiyMmcNwM8YZNhIb1INXkssubGSxNpBK7TyNXQTGoCfGQGPmZ/x/MsIVQBiXtKTk59aoqxTQQPc6us1KSWrL8hidHP7oSSxg3qaTtazZBWKrqclzdRHqaUXekqYDyxvDUDE+A9BswpdEXrFAVCwQLUi64XZ01kbxd/bbpBG1Z4iHWufv6yjRdXtZG5nYSgmp9Jjc1DUokLx8YIwS8lz/wQnpoIhQvnqBa4= X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0149;31:keKZe9uW1MwJXWXxVNzjDfg+EQDFEGaVs2tKt9mqjB1tEM6cqAEJ5BEUfej7yXfYhPu+Htgm8AxBIjf7Nl5Qo+8gDUjpdv+2LizreVEDoteamEW0ckAW9DogCqGxmdyGxg+oTKOd74LqBa/BZrc+xwdKUMwYLINtE/QNI51cody16xGLUqGGia3Rgw7SoUlDYZn3SVuqOPWQHBEfKyfcqLieaAwr8PqdzjcfOeEKP9TFWamwn7nd+PgSIu6n4ss2VUAeBBfoai0FCO2Z5YvQJy2Lw31QJuTM7rgARf6z6fo/LIxfwHX0njao215fw2QJTekhccD15+2oPrK7h+gjW/EZFe71xbMOgYGEq9g8OMJacikRU8Q2qLKD6WJQ3DNsSkHUSKOlsceFnLNzz5QotwTaZh3sKKmszZJ0Kryiad5NE41n9tVHA+5ymIQnQtwoCYbVTplnBiE5HYXSj6ch0UvFPHiK2ROhZlIOfZOG+L1W6KVkPnpUrZS4wXBA9YFIzRI96NKRTVDukJwUtLu/V4dqUMQKCKmtR7U0WyGl1JU+nJ1pORI1litrhRvnJd0TmfGeWaf0pohUdp4Yv26lXzPZQQrvNntSFR0v0r477BrhgYN1nQVEa9D8Tl2JAd29f0AiVCt5DKH2VTfIC/8IpWsZguaIWqOACKDAa3TYzlI= X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0149;20:SOd3Q9WU3nzpmUhLoutVogvXHlt21G2C7PVWtS4IIjUSciBVFn3gVN2GLLu3EPROLppwmLEUsBeLTspNxSpNABanxMON5aj77klliAXcU5I3VJI4O9gim5oXxOZEbSJa3ADTHk8pLCY16VIqbkwheOUGLx4LEA7PTkzzOXkwr0JbQglmk1yZyTybIFI16h31bdZcfjGgLupy0sA94EypXwrMdF2NPz0y0PPbfjfTAMaNDFOfHvfU7poaoHOvNPsSOwAiDkVwtwkyGaAsEDg7jVEbvv469SRvZYaF3HI5hFeGlBMrdvXpry166CjUt/zNqFsjPrDGzcin+6XmODyUCn334OOgr9bAD55DoWLnpWC12KZQ3Z96ucYeTsC69jnwXEYqo21n9XhX8BVL3UN4g49mrBizEBYA3LNlda+Ri17tIpeUMo81uiJlQ69tqD6jMyZwRYtqsS/ecgmVFZE5fuaptbbkTLP6uV8CECHn+WxhNCclnFV6dR0392kRcHnR X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(93006095)(93001095)(3002001)(100000703101)(100105400095)(10201501046)(6055026)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(20161123560025)(20161123555025)(20161123558100)(20161123562025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:CY1PR12MB0149;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:CY1PR12MB0149; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR12MB0149;4:O8S1259mi1hUybMGRp55/bEkkauR+Ykg/Cu1DIgn/0?= =?us-ascii?Q?fsY2mrfT9dsjdGCdCk/cgmxSiurzGZywWbBhrC+cIGN5RUpmOBSpBklEqcUY?= =?us-ascii?Q?+EGTu4CV1Idjty8ss9w1b2KPbv649CQ0JsAfwZcKRQ13GUyLES2lCT48a0Lc?= =?us-ascii?Q?JJHcCO/X6E1eCrkXerbgENEQsqvc1cm1Njd5C8p5ND4H4yGKNf9DKXHKnc4h?= =?us-ascii?Q?nPM8UZ6Itjabzg1onuzRgzwmgDrXInJtNLU8iMegcuITCRUdWey81P0SSViT?= =?us-ascii?Q?/+B+B35b6HKmHqrB74sfWPFq1JCwwpfQpmGGE8VgWA0LFrwPbyP1D12cFSVM?= =?us-ascii?Q?2d0R3/mLmOXCZLuEObExOzxGoJZvvUdbjrhUgAhmCUVaY2I/EhakYdGMA/Sc?= =?us-ascii?Q?LROO4OuFETJp5HNzcURR7hFUcbzghB9JNirbeTXLtmGsDRxVy6MzNpcAOs2G?= =?us-ascii?Q?p0XVoWUvdLvP+4o9AKv3/YC3a7kfd3PkLQRpsfiGFe1VcCWIAdhxrQgN1G8A?= =?us-ascii?Q?1nIFjhl6evGOxAPqZi5LDnnEgwtqFGlL8bSxNVcfVlXkXAGQBRkmQ/qDORjF?= =?us-ascii?Q?02o5sUxXw1mR/quVdkZfKQvTqgOzkaK5auForeunp3nYpqozXjerTUfjlXjv?= =?us-ascii?Q?fnjvyiAyKqMSw3una0BIJkwRepB01ZZn3EPjIdKdna8jcwYPs0x5kPE5ZKkj?= =?us-ascii?Q?zngT3M+QgiWSnBKHKr9HEMUTtQeqp2wAYKpQyMV1DDEpEUrYD13YnX892yWb?= =?us-ascii?Q?Yb+KfVpbSlYrvnhdultTmJITZnMmkGoS7SeSQNKZPPlFtFwfvIwguTCqfocx?= =?us-ascii?Q?D4MXh1oCNjudHeIj1gdYloqvY72LyfIUYSVVPGjXV+DlZLjVgjw5vZ+QFkhX?= =?us-ascii?Q?/6n/eiJ7mgn/be4alLaBlEsumaue1mnVuyo0RgB6OTg9KQLsuVZLDksWBFjF?= =?us-ascii?Q?IUNU5bl+zvL4XCocKI5CJbdAailfGDH2YVN0hMlVxzyHOtOuKvVRSWeWGISZ?= =?us-ascii?Q?H6EcDvlU6d9uZavWCLhnpSpEMueqvq44GPTXTOoVBagrdFCYQpp46GLdV7mI?= =?us-ascii?Q?X8U20NqdLJU4C8XB6XaXAtIA2l3/pNf8kYtBbFGDcSYF62DQS94us65ZdQUj?= =?us-ascii?Q?RCrDBu2z7+6w9ePgDjL7W+9UjmaQbs0I2VF5J+YRoPfjfu30b8baHtodX/A5?= =?us-ascii?Q?AtBwSP5nUhLBpv56iPxEYBidPC4Zw1f1l9?= X-Forefront-PRVS: 0347410860 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(39840400002)(39850400002)(39450400003)(39400400002)(39410400002)(50986999)(76176999)(47776003)(66066001)(33646002)(86362001)(36756003)(53416004)(48376002)(42186005)(305945005)(50466002)(5660300001)(478600001)(81166006)(50226002)(8676002)(1076002)(6116002)(3846002)(2906002)(4326008)(25786009)(53936002)(6486002)(110136004)(2950100002)(189998001)(6666003)(38730400002);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR12MB0149;H:ubuntu-010236106000.amd.com;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR12MB0149;23:W5d3KwrGQFAa9sboAUE9P8STSbgXkVljHGmsjkluq?= =?us-ascii?Q?X1xBRAX+NO0O/bF9J5QuV0V6ePlCzFGJ6wzPLPn5hgwMD5OZHEg5kx5n93Q5?= =?us-ascii?Q?LyBbmTAICjKZ71WL5E0FzOg7+XlJo6prLtdS3V3GuuuQk7O+CAxdXR+eBdUB?= =?us-ascii?Q?hZObGpuzL86aiYGUDBTrwe9igDaspe1SNHk4iTqv0T95VC+ScU83iqp9I7VV?= =?us-ascii?Q?Ls8tI9sMOiZyaKSB1P9clLUvwDvvBZ6QvBh1Y7bvIN5JqdgHhvmpwTBrz4qr?= =?us-ascii?Q?yLf90jiIxyYhe/MLIXF7UIdv4fll2LJssjZsDa5CZPq2/ItIWs9FyaoE+cPs?= =?us-ascii?Q?3W9Vo7bwEl6geXXpF7IRDkh3oMkoO3cfZTMrqIWzCnpt/KqTAuWD5grdfaj9?= =?us-ascii?Q?pewPugqWfeb1BWxuGLe7ne9+ppxGSW2GEh6m1N1UB7k0XXvkm26ehiQJwTSS?= =?us-ascii?Q?88GncTSRNPnSJYR/21cs0ONvJL3AsV2k+7hwlPfIi6hueiJooo73/+lOQRZ+?= =?us-ascii?Q?LmMkE0TR/FqBnMKMygbVNxMXCsaT9KJ2uP0To5PDoW+5+M/7r/Nv4IByoiON?= =?us-ascii?Q?4pmg4G6NUol88ipVNm4zgfK884/IYEURj7Myhm/LHi5itbmm6rTnyj07vs/8?= =?us-ascii?Q?NgXRnCvbTAVvoeH5qzaeAWS/wNfCULT4NdKOw5VuelH7W3xNDQYRqcXQslXB?= =?us-ascii?Q?kzuPWeRIIFDmTjBe0HPGYRPuBbiJFgx4qGM6I+FN01FFk+wE5ZyLfBn36MJU?= =?us-ascii?Q?FrNq/Z36admc94ihFUchCgrqzntqgYiIwB5srpFXnEMU/zFMjN/rB0U8cr9K?= =?us-ascii?Q?V/a8LHGWAN1ZvB/hi/7ghPpi0K3LruIg3VekLyD46IL2dQdyu199ywz4aBXn?= =?us-ascii?Q?WV2+LDCA0liFxmFh54epaUyo1kV3e7+ASKTF6w4KBdW8L5rTSmrfwI7hlPi4?= =?us-ascii?Q?/81+LHwVMv27L5Ri33hv6UxPPtFjWx9e+MmaWmxcw=3D=3D?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR12MB0149;6:ycZDuVE1XyorBwJ2AoHJSBcau9FSVZ+z2Cmkq7N6gk?= =?us-ascii?Q?EazwAVKnublxbR0cSV61f57QrGbbimfZ7MxEfJ5S9DacCtjwTiQpdQIDfcyk?= =?us-ascii?Q?rEGQvyj3eodqPLKDCmWgAmoy9WlhajlD99NJrFvHEY1PavuVFDfkWoFuLJSj?= =?us-ascii?Q?8xqCSUqmfo13//3OHAh3RNKRxznO7C9Y2vdO6LriIaqrGIAFGdszuGIWrgHA?= =?us-ascii?Q?kCymv9xIvyO0jGpJGQBMhUuc3Y8g5VDoQRIAzzY6d7TgM5q4z0xoJ6rs33q4?= =?us-ascii?Q?gqgw8971AS6QUWzZcgxY5punuOPz5Uh0AeTRyg9iuHn0IIARYM+42ns4aS5p?= =?us-ascii?Q?TxO5g9au/xbPbb1YmpHAqlZPCbsXZ1VIpRNZrET1yfxwZnEEI6UNWVlcv36H?= =?us-ascii?Q?vFbpPA3lr8OGSIVkMnOGSd3fAh3cXroCPGHVurPyR5SEWXTa3frGEYPm6pJJ?= =?us-ascii?Q?xIcjS6FtdCPw+kRl/DnSw+nMcM/JAIRjZBoc8ZFIwraDxHgAhHESHlQk8Uy3?= =?us-ascii?Q?S+Mo26YNgfshU+3tznqHZpxKutb1IgoklPtu9lb27XLLN8mAAdGszvCNRar7?= =?us-ascii?Q?Nk49FC2MKcn+aZ9hwuNJdiycqspObyEUalBPCPU7uNh7vO6hpaSZk0kjg83N?= =?us-ascii?Q?qjTRgh3MCGAo8QxWydGHv3sEY4cO1zfqctMezrcqmg/4b+WTJf2YrN2/AKGm?= =?us-ascii?Q?JivCgAow9Zl+3qqdKXLC7vIYB4NikJnK6HhGA2SgDm/NSz+8NvS5kEa5OzKD?= =?us-ascii?Q?5v7tPUp8LZ6uWVwtVEH2Ug5Z2RVFf/fzOsEfEzKK8poUHltLelumGtFX9SkE?= =?us-ascii?Q?PkXs+RjYV3wQZw/p0k0xxs8zRqzF6WC4GYbLlR5RlENpN5chQXz+uXHBfX2G?= =?us-ascii?Q?blT2Kw3NZmWkoxVraecTJXrM6X8DTauPm14I9LtuhU6iwI6xFHQPb/3hNM7o?= =?us-ascii?Q?OCDcGQGblmjrDkZwiEtzPpLOmkQSVWtDa5PRF/h3nH1ZhSqGG+DxKKfIwPIG?= =?us-ascii?Q?VwJOt+oDtJB7TEUvB1z275?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0149;5:iihMCaxCjyDo90MI73eXQWjglIRn1UZ4pqct+Nqqj/tB5ySiLWCX2c4fBsp9cp6S/Uqx2z3Sex22vE8jUulqkE2oyFWuOGB7xsctTo7OT6NwjiRzgcaLVYR0hmKAEmkRLGza18omokyUl9N9NtLbhQUmYdoj6sbhqy2C0g2vH7rVTquv2xTFFO/tjTZswJLr3yGZQtQ+8BuTMP2DYB9VkI60byl7eOJt9xRzY+lWwIAorVLxT+rcfW2cpA63JZvwAzKnNWFzLIKiW/hJ21q8b5XRQZl0b3x2l4ycEBkWn8I4toF7wRgLpuA7bd3ecXfdjjhMMNiGatnQvVJLpx41SID/KO9KfCn/7NP1YAsL4l5o6M8DFZwAlwxzq1EbATyZLgsItL3APpFCvKKczBZ5aXBDqtrwefsL2T09RUiIMaBOJEC9vRkQ8ypEmqn41hC2KcFb1FNSsHoPOTIdtwdnQ/POAv7RNxl1GtJYDPZh4JLsm3hLDXV70oFSMZAeVxQ8;24:3VMCY8MP5IjqEgB3RapTSitmnO8sevcGsqy0gspq4uNDjyxadNVPAMsKKwc4xahtVMwHdf0xzhTmVx4KTNPRS2vBDjvo7mIa7bBfPYFQ1LI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0149;7:e/SNE9n3cMaJiZOhw1RWLpbWiEhVJoQLnkqkpEVJkT8kWdL7UnJqJAvLAIeHmmKWBQx7iRD8QH342F1/pdbgF5BEYfeF8NNeuPW1oj18Q7YNsJ30FGAa5k99GPQGcyv84wrz78JBs8bW5j4UisdR0wRITPSMNxK5Yyxr9ybpfLrH7juKeUu3GgTdZ/cWEalYWSkqqf6AXS2N+S1/9GTzORkwOL2JVEcR3U3NCnUhblYLg8WonQKyFRyMHsIfugqMjUBmUzeIYdmt1DyzC1l4pSyxDs7hLZwAVvk1z/L44ZcXG2RIfnd5sjnlHdVXhKLfty5C4Kp4gqst6j9XJTSxF0TeCG38q6jMPiZABt2nC4fSM4Zw8rPzeD0VDrWqBKhdNuH7bk4W78/5TIOmqbfUgPMk5XJDpsJBWcYH1i7s+Qr04LMH3slgz+lzY0rlzApi7CoKdaW2NPgPRIN65HgjB9KxYuiLT8ZWR2CgYDlfS8N8HalhuVLBJeanEya5Iv7Uq5s+zHPzX9QwLRJtDEccUUt8dS6xh0sqJvpHWKbbxNLHw+G8n3yJOiIwMrDKIfWE96ZagzG0VVsVuj2hKds5ZSG54qdofoepVuaQw0iQcnTTc/AHhPZnNJZNNtOnKJMzsMrS1z5NHDU/eLVWJ7HJRNNPsd0Ly4/XnAEiLv7jvl5y/TXoOGKaXZ+YO4FwwwbIs3Bh7en8HDhdBeHw/76jwJLnTjjZh/YasFUZwGrk5lUQ/U1X6xANP3IYiAQs9BHhlGevrEExBYz5RTcukpQvqkinXaOgia35goEoljk961o= X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0149;20:2eoH9Lm/ZKZ8WGPc3k8DK98d29dWxXx65ROXtTxt5DZCjX9W66fmG9Q3F2YP6L59Fh7j8nUt6Mtp1FbK4F/LaT8dn6NAkjGel1psIfaUHZS9Q8pkxU3iMaDY9R51f9M/RCCjbBkoQsxjhSWMBHcLED0stNCf+xB3S/R9THxRkxEit2OwqMp3ub0rXsSoi2gJpci3cSXaRC7v5aSUyJSi10e3hFn6f1zkgUqSfEyQfXXu7Q0lVpIzSY/Q/a/IzM2e X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jun 2017 16:06:51.6570 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB0149 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The CCP and PSP devices part of AMD Secure Procesor may share the same interrupt. Hence we expand the SP device to register a common interrupt handler and provide functions to CCP and PSP devices to register their interrupt callback which will be invoked upon interrupt. Signed-off-by: Brijesh Singh --- drivers/crypto/ccp/ccp-dev-v3.c | 6 +-- drivers/crypto/ccp/ccp-dev-v5.c | 7 ++- drivers/crypto/ccp/ccp-dev.c | 3 +- drivers/crypto/ccp/ccp-dev.h | 2 - drivers/crypto/ccp/ccp-pci.c | 103 +++++++++++------------------------- drivers/crypto/ccp/ccp-platform.c | 57 ++++++++++---------- drivers/crypto/ccp/sp-dev.c | 107 ++++++++++++++++++++++++++++++++++++++ drivers/crypto/ccp/sp-dev.h | 17 +++++- 8 files changed, 187 insertions(+), 115 deletions(-) diff --git a/drivers/crypto/ccp/ccp-dev-v3.c b/drivers/crypto/ccp/ccp-dev-v3.c index 57179034..695fde8 100644 --- a/drivers/crypto/ccp/ccp-dev-v3.c +++ b/drivers/crypto/ccp/ccp-dev-v3.c @@ -453,7 +453,7 @@ static int ccp_init(struct ccp_device *ccp) iowrite32(ccp->qim, ccp->io_regs + IRQ_STATUS_REG); /* Request an irq */ - ret = ccp->get_irq(ccp); + ret = sp_request_ccp_irq(ccp->sp, ccp_irq_handler, ccp->name, ccp); if (ret) { dev_err(dev, "unable to allocate an IRQ\n"); goto e_pool; @@ -510,7 +510,7 @@ static int ccp_init(struct ccp_device *ccp) if (ccp->cmd_q[i].kthread) kthread_stop(ccp->cmd_q[i].kthread); - ccp->free_irq(ccp); + sp_free_ccp_irq(ccp->sp, ccp); e_pool: for (i = 0; i < ccp->cmd_q_count; i++) @@ -549,7 +549,7 @@ static void ccp_destroy(struct ccp_device *ccp) if (ccp->cmd_q[i].kthread) kthread_stop(ccp->cmd_q[i].kthread); - ccp->free_irq(ccp); + sp_free_ccp_irq(ccp->sp, ccp); for (i = 0; i < ccp->cmd_q_count; i++) dma_pool_destroy(ccp->cmd_q[i].dma_pool); diff --git a/drivers/crypto/ccp/ccp-dev-v5.c b/drivers/crypto/ccp/ccp-dev-v5.c index 8ed2b37..b0391f0 100644 --- a/drivers/crypto/ccp/ccp-dev-v5.c +++ b/drivers/crypto/ccp/ccp-dev-v5.c @@ -880,7 +880,7 @@ static int ccp5_init(struct ccp_device *ccp) dev_dbg(dev, "Requesting an IRQ...\n"); /* Request an irq */ - ret = ccp->get_irq(ccp); + ret = sp_request_ccp_irq(ccp->sp, ccp5_irq_handler, ccp->name, ccp); if (ret) { dev_err(dev, "unable to allocate an IRQ\n"); goto e_pool; @@ -986,7 +986,7 @@ static int ccp5_init(struct ccp_device *ccp) kthread_stop(ccp->cmd_q[i].kthread); e_irq: - ccp->free_irq(ccp); + sp_free_ccp_irq(ccp->sp, ccp); e_pool: for (i = 0; i < ccp->cmd_q_count; i++) @@ -1036,7 +1036,7 @@ static void ccp5_destroy(struct ccp_device *ccp) if (ccp->cmd_q[i].kthread) kthread_stop(ccp->cmd_q[i].kthread); - ccp->free_irq(ccp); + sp_free_ccp_irq(ccp->sp, ccp); for (i = 0; i < ccp->cmd_q_count; i++) { cmd_q = &ccp->cmd_q[i]; @@ -1105,7 +1105,6 @@ static const struct ccp_actions ccp5_actions = { .init = ccp5_init, .destroy = ccp5_destroy, .get_free_slots = ccp5_get_free_slots, - .irqhandler = ccp5_irq_handler, }; const struct ccp_vdata ccpv5a = { diff --git a/drivers/crypto/ccp/ccp-dev.c b/drivers/crypto/ccp/ccp-dev.c index 8a1674a..7c751bf 100644 --- a/drivers/crypto/ccp/ccp-dev.c +++ b/drivers/crypto/ccp/ccp-dev.c @@ -599,8 +599,7 @@ int ccp_dev_init(struct sp_device *sp) goto e_err; } - ccp->get_irq = sp->get_irq; - ccp->free_irq = sp->free_irq; + ccp->use_tasklet = sp->use_tasklet; ccp->io_regs = sp->io_map + ccp->vdata->offset; if (ccp->vdata->setup) diff --git a/drivers/crypto/ccp/ccp-dev.h b/drivers/crypto/ccp/ccp-dev.h index ca44821..193f309 100644 --- a/drivers/crypto/ccp/ccp-dev.h +++ b/drivers/crypto/ccp/ccp-dev.h @@ -351,8 +351,6 @@ struct ccp_device { /* Bus specific device information */ void *dev_specific; - int (*get_irq)(struct ccp_device *ccp); - void (*free_irq)(struct ccp_device *ccp); unsigned int qim; unsigned int irq; bool use_tasklet; diff --git a/drivers/crypto/ccp/ccp-pci.c b/drivers/crypto/ccp/ccp-pci.c index 7eab3c6..f6b9858 100644 --- a/drivers/crypto/ccp/ccp-pci.c +++ b/drivers/crypto/ccp/ccp-pci.c @@ -28,67 +28,37 @@ #define MSIX_VECTORS 2 -struct ccp_msix { - u32 vector; - char name[16]; -}; - struct ccp_pci { int msix_count; - struct ccp_msix msix[MSIX_VECTORS]; + struct msix_entry msix_entry[MSIX_VECTORS]; }; -static int ccp_get_msix_irqs(struct ccp_device *ccp) +static int ccp_get_msix_irqs(struct sp_device *sp) { - struct sp_device *sp = ccp->sp; struct ccp_pci *ccp_pci = sp->dev_specific; - struct device *dev = ccp->dev; + struct device *dev = sp->dev; struct pci_dev *pdev = to_pci_dev(dev); - struct msix_entry msix_entry[MSIX_VECTORS]; - unsigned int name_len = sizeof(ccp_pci->msix[0].name) - 1; int v, ret; - for (v = 0; v < ARRAY_SIZE(msix_entry); v++) - msix_entry[v].entry = v; + for (v = 0; v < ARRAY_SIZE(ccp_pci->msix_entry); v++) + ccp_pci->msix_entry[v].entry = v; - ret = pci_enable_msix_range(pdev, msix_entry, 1, v); + ret = pci_enable_msix_range(pdev, ccp_pci->msix_entry, 1, v); if (ret < 0) return ret; ccp_pci->msix_count = ret; - for (v = 0; v < ccp_pci->msix_count; v++) { - /* Set the interrupt names and request the irqs */ - snprintf(ccp_pci->msix[v].name, name_len, "%s-%u", - sp->name, v); - ccp_pci->msix[v].vector = msix_entry[v].vector; - ret = request_irq(ccp_pci->msix[v].vector, - ccp->vdata->perform->irqhandler, - 0, ccp_pci->msix[v].name, ccp); - if (ret) { - dev_notice(dev, "unable to allocate MSI-X IRQ (%d)\n", - ret); - goto e_irq; - } - } - ccp->use_tasklet = true; + sp->use_tasklet = true; + sp->psp_irq = ccp_pci->msix_entry[0].vector; + sp->ccp_irq = (ccp_pci->msix_count > 1) ? ccp_pci->msix_entry[1].vector + : ccp_pci->msix_entry[0].vector; return 0; - -e_irq: - while (v--) - free_irq(ccp_pci->msix[v].vector, dev); - - pci_disable_msix(pdev); - - ccp_pci->msix_count = 0; - - return ret; } -static int ccp_get_msi_irq(struct ccp_device *ccp) +static int ccp_get_msi_irq(struct sp_device *sp) { - struct sp_device *sp = ccp->sp; - struct device *dev = ccp->dev; + struct device *dev = sp->dev; struct pci_dev *pdev = to_pci_dev(dev); int ret; @@ -96,35 +66,24 @@ static int ccp_get_msi_irq(struct ccp_device *ccp) if (ret) return ret; - ccp->irq = pdev->irq; - ret = request_irq(ccp->irq, ccp->vdata->perform->irqhandler, 0, - sp->name, ccp); - if (ret) { - dev_notice(dev, "unable to allocate MSI IRQ (%d)\n", ret); - goto e_msi; - } - ccp->use_tasklet = true; + sp->ccp_irq = pdev->irq; + sp->psp_irq = pdev->irq; return 0; - -e_msi: - pci_disable_msi(pdev); - - return ret; } -static int ccp_get_irqs(struct ccp_device *ccp) +static int ccp_get_irqs(struct sp_device *sp) { - struct device *dev = ccp->dev; + struct device *dev = sp->dev; int ret; - ret = ccp_get_msix_irqs(ccp); + ret = ccp_get_msix_irqs(sp); if (!ret) return 0; /* Couldn't get MSI-X vectors, try MSI */ dev_notice(dev, "could not enable MSI-X (%d), trying MSI\n", ret); - ret = ccp_get_msi_irq(ccp); + ret = ccp_get_msi_irq(sp); if (!ret) return 0; @@ -134,23 +93,19 @@ static int ccp_get_irqs(struct ccp_device *ccp) return ret; } -static void ccp_free_irqs(struct ccp_device *ccp) +static void ccp_free_irqs(struct sp_device *sp) { - struct sp_device *sp = ccp->sp; struct ccp_pci *ccp_pci = sp->dev_specific; - struct device *dev = ccp->dev; + struct device *dev = sp->dev; struct pci_dev *pdev = to_pci_dev(dev); - if (ccp_pci->msix_count) { - while (ccp_pci->msix_count--) - free_irq(ccp_pci->msix[ccp_pci->msix_count].vector, - ccp); + if (ccp_pci->msix_count) pci_disable_msix(pdev); - } else if (ccp->irq) { - free_irq(ccp->irq, ccp); + else if (sp->psp_irq) pci_disable_msi(pdev); - } - ccp->irq = 0; + + sp->ccp_irq = 0; + sp->psp_irq = 0; } static int ccp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) @@ -178,8 +133,6 @@ static int ccp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) dev_err(dev, "missing driver data\n"); goto e_err; } - sp->get_irq = ccp_get_irqs; - sp->free_irq = ccp_free_irqs; ret = pcim_enable_device(pdev); if (ret) { @@ -208,6 +161,10 @@ static int ccp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) goto e_err; } + ret = ccp_get_irqs(sp); + if (ret) + goto e_err; + pci_set_master(pdev); ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(48)); @@ -245,6 +202,8 @@ static void ccp_pci_remove(struct pci_dev *pdev) sp_destroy(sp); + ccp_free_irqs(sp); + dev_notice(dev, "disabled\n"); } diff --git a/drivers/crypto/ccp/ccp-platform.c b/drivers/crypto/ccp/ccp-platform.c index 568178f..1cea657 100644 --- a/drivers/crypto/ccp/ccp-platform.c +++ b/drivers/crypto/ccp/ccp-platform.c @@ -30,6 +30,7 @@ struct ccp_platform { int coherent; + unsigned int irq_count; }; static const struct acpi_device_id ccp_acpi_match[]; @@ -59,45 +60,39 @@ static struct sp_dev_vdata *ccp_get_acpi_version(struct platform_device *pdev) return NULL; } -static int ccp_get_irq(struct ccp_device *ccp) +static int ccp_get_irqs(struct sp_device *sp) { - struct device *dev = ccp->dev; + struct ccp_platform *ccp_platform = sp->dev_specific; + struct device *dev = sp->dev; struct platform_device *pdev = to_platform_device(dev); + unsigned int i, count; int ret; - ret = platform_get_irq(pdev, 0); - if (ret < 0) - return ret; + for (i = 0, count = 0; i < pdev->num_resources; i++) { + struct resource *res = &pdev->resource[i]; - ccp->irq = ret; - ret = request_irq(ccp->irq, ccp->vdata->perform->irqhandler, 0, - ccp->name, ccp); - if (ret) { - dev_notice(dev, "unable to allocate IRQ (%d)\n", ret); - return ret; + if (resource_type(res) == IORESOURCE_IRQ) + count++; } - return 0; -} + ccp_platform->irq_count = count; -static int ccp_get_irqs(struct ccp_device *ccp) -{ - struct device *dev = ccp->dev; - int ret; - - ret = ccp_get_irq(ccp); - if (!ret) - return 0; + ret = platform_get_irq(pdev, 0); + if (ret < 0) + return ret; - /* Couldn't get an interrupt */ - dev_notice(dev, "could not enable interrupts (%d)\n", ret); + sp->psp_irq = ret; + if (count == 1) { + sp->ccp_irq = ret; + } else { + ret = platform_get_irq(pdev, 1); + if (ret < 0) + return ret; - return ret; -} + sp->ccp_irq = ret; + } -static void ccp_free_irqs(struct ccp_device *ccp) -{ - free_irq(ccp->irq, ccp); + return 0; } static int ccp_platform_probe(struct platform_device *pdev) @@ -126,8 +121,6 @@ static int ccp_platform_probe(struct platform_device *pdev) dev_err(dev, "missing driver data\n"); goto e_err; } - sp->get_irq = ccp_get_irqs; - sp->free_irq = ccp_free_irqs; ior = platform_get_resource(pdev, IORESOURCE_MEM, 0); sp->io_map = devm_ioremap_resource(dev, ior); @@ -154,6 +147,10 @@ static int ccp_platform_probe(struct platform_device *pdev) goto e_err; } + ret = ccp_get_irqs(sp); + if (ret) + goto e_err; + dev_set_drvdata(dev, sp); ret = sp_init(sp); diff --git a/drivers/crypto/ccp/sp-dev.c b/drivers/crypto/ccp/sp-dev.c index d1dda38..44e76e5 100644 --- a/drivers/crypto/ccp/sp-dev.c +++ b/drivers/crypto/ccp/sp-dev.c @@ -64,6 +64,113 @@ static void sp_del_device(struct sp_device *sp) write_unlock_irqrestore(&sp_unit_lock, flags); } +static irqreturn_t sp_irq_handler(int irq, void *data) +{ + struct sp_device *sp = data; + + if (sp->ccp_irq_handler) + sp->ccp_irq_handler(irq, sp->ccp_irq_data); + + if (sp->psp_irq_handler) + sp->psp_irq_handler(irq, sp->psp_irq_data); + + return IRQ_HANDLED; +} + +int sp_request_ccp_irq(struct sp_device *sp, irq_handler_t handler, + const char *name, void *data) +{ + int ret; + + if ((sp->psp_irq == sp->ccp_irq) && sp->dev_vdata->psp_vdata) { + /* Need a common routine to manage all interrupts */ + sp->ccp_irq_data = data; + sp->ccp_irq_handler = handler; + + if (!sp->irq_registered) { + ret = request_irq(sp->ccp_irq, sp_irq_handler, 0, + sp->name, sp); + if (ret) + return ret; + + sp->irq_registered = true; + } + } else { + /* Each sub-device can manage it's own interrupt */ + ret = request_irq(sp->ccp_irq, handler, 0, name, data); + if (ret) + return ret; + } + + return 0; +} + +int sp_request_psp_irq(struct sp_device *sp, irq_handler_t handler, + const char *name, void *data) +{ + int ret; + + if ((sp->psp_irq == sp->ccp_irq) && sp->dev_vdata->ccp_vdata) { + /* Need a common routine to manage all interrupts */ + sp->psp_irq_data = data; + sp->psp_irq_handler = handler; + + if (!sp->irq_registered) { + ret = request_irq(sp->psp_irq, sp_irq_handler, 0, + sp->name, sp); + if (ret) + return ret; + + sp->irq_registered = true; + } + } else { + /* Each sub-device can manage it's own interrupt */ + ret = request_irq(sp->psp_irq, handler, 0, name, data); + if (ret) + return ret; + } + + return 0; +} + +void sp_free_ccp_irq(struct sp_device *sp, void *data) +{ + if ((sp->psp_irq == sp->ccp_irq) && sp->dev_vdata->psp_vdata) { + /* Using common routine to manage all interrupts */ + if (!sp->psp_irq_handler) { + /* Nothing else using it, so free it */ + free_irq(sp->ccp_irq, sp); + + sp->irq_registered = false; + } + + sp->ccp_irq_handler = NULL; + sp->ccp_irq_data = NULL; + } else { + /* Each sub-device can manage it's own interrupt */ + free_irq(sp->ccp_irq, data); + } +} + +void sp_free_psp_irq(struct sp_device *sp, void *data) +{ + if ((sp->psp_irq == sp->ccp_irq) && sp->dev_vdata->ccp_vdata) { + /* Using common routine to manage all interrupts */ + if (!sp->ccp_irq_handler) { + /* Nothing else using it, so free it */ + free_irq(sp->psp_irq, sp); + + sp->irq_registered = false; + } + + sp->psp_irq_handler = NULL; + sp->psp_irq_data = NULL; + } else { + /* Each sub-device can manage it's own interrupt */ + free_irq(sp->psp_irq, data); + } +} + /** * sp_alloc_struct - allocate and initialize the sp_device struct * diff --git a/drivers/crypto/ccp/sp-dev.h b/drivers/crypto/ccp/sp-dev.h index b958ef9..77f3735 100644 --- a/drivers/crypto/ccp/sp-dev.h +++ b/drivers/crypto/ccp/sp-dev.h @@ -68,9 +68,15 @@ struct sp_device { unsigned int axcache; bool irq_registered; + bool use_tasklet; - int (*get_irq)(struct ccp_device *ccp); - void (*free_irq)(struct ccp_device *ccp); + unsigned int ccp_irq; + irq_handler_t ccp_irq_handler; + void *ccp_irq_data; + + unsigned int psp_irq; + irq_handler_t psp_irq_handler; + void *psp_irq_data; void *ccp_data; void *psp_data; @@ -91,6 +97,13 @@ struct sp_device *sp_get_master(void); int sp_suspend(struct sp_device *sp, pm_message_t state); int sp_resume(struct sp_device *sp); +int sp_request_ccp_irq(struct sp_device *sp, irq_handler_t handler, + const char *name, void *data); +void sp_free_ccp_irq(struct sp_device *sp, void *data); +int sp_request_psp_irq(struct sp_device *sp, irq_handler_t handler, + const char *name, void *data); +void sp_free_psp_irq(struct sp_device *sp, void *data); + #ifdef CONFIG_CRYPTO_DEV_CCP int ccp_dev_init(struct sp_device *sp); -- 2.9.4