From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752621AbdFVLmw (ORCPT ); Thu, 22 Jun 2017 07:42:52 -0400 Received: from mail-bl2nam02on0054.outbound.protection.outlook.com ([104.47.38.54]:58080 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751920AbdFVLmn (ORCPT ); Thu, 22 Jun 2017 07:42:43 -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: gary.hook@amd.com, thomas.lendacky@amd.com, herbert@gondor.apana.org.au, davem@davemloft.net, Brijesh Singh Subject: [PATCH 3/3] crypto: cpp - Abstract interrupt registeration Date: Thu, 22 Jun 2017 06:42:04 -0500 Message-Id: <20170622114204.4361-4-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170622114204.4361-1-brijesh.singh@amd.com> References: <20170622114204.4361-1-brijesh.singh@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: SN1PR19CA0031.namprd19.prod.outlook.com (10.163.220.41) To BY2PR12MB0146.namprd12.prod.outlook.com (10.162.82.19) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: db6c60be-df11-4fe5-a703-08d4b963c6f2 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500055)(300135000095)(300000501055)(300135300095)(22001)(300000502055)(300135100095)(48565401081)(300000503055)(300135400095)(201703131423075)(201703031133081)(300000504055)(300135200095)(300000505055)(300135600095);SRVR:BY2PR12MB0146; X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0146;3:YtzogpUGlmILTwp+JbMxhPZGyn1GNLNdtu2j+uVArpUsbFLc78sREaREe5ILc4eq7YuyR0QN/Ga+GPrBxa4nsa8a490E05YdY1lGDL5p2ECiM0yOiqi4DJGDhwLAG+pWpauv+lbSLNO5sGGqtQ71+hzSAkDZ1RX9Xm6zaHY3dT5y6werWdwB8YnHrGaSaxySrnW0Lefm0d9OdpykgM/ztLdfMyJQdX3BYh1wTGPp3Cy6LxHm1tB1WrwzD8cwnsOI83iNpCJWs1u2JfbK+AMfC9L39shbbuDDcJnU1QnkRpLf29fXf3kqCSRNn+9QMETnCIM3dfsRlzCZCNSArgNneoUhDH8W5ILdYAU5O4RBMGXbMPUopUePpOa9hpo5mXYm1z3QzejBBWjRCPabdDqAEW8RVqFA09bTt364O2P5Jv4fBFYg492+tt3hAAPSjeibuQrSOhHQ6cCAand/gPnvSqtc4nD1hpNqw7GvThMcj5MH8eKYdLqhp/8lOJbxR9mnqzDuGE/JiEXb0r3vckkRHHZZneoKg2pg+Y4A8pSRc6YPMmJf2NUcMpDHXHBjOq27jzICMUre8R9/MmIP2HHxOdDWck1sCkHtdJpL7x1fzGZQWRHbdcrK9OEuU8cjNPOrApWbvbXTu/QjbMNWI7EhLBxsKMZoNb1eGJfLifPzadpQKFlePVCFu/x79BagMmsJwVVKS1yesxJHvQmKOrAXeA== X-MS-TrafficTypeDiagnostic: BY2PR12MB0146: X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0146;25:AHn7F7aqXymdE9MPSNp4wsqkr04A9iLqAGV0HqfyTy3EIRbj/UHRaIHGWkLTPtZdZnYzSnoOfBgCRQHvsZX2cvz14owwvVK3/5yJiNuNO+ukexICSsS6/3pr3BQGN45LSju4Nw+y6L+xbsg+kIJAMFw4kmnTW+5eYIJqCcKEiBsUSdEdoSSPXgfnewdLTXbd+RzbuvkQHyzYxErb1jfF81lpy0rJTKKjxau17q+dWvY2dM7alqr702lxmw96U0IvoDLePrNoHV1Tw8wtTn2e0hfL8VjfO05qd2lu3IXCK4+iuvK7yDSFqDEiXHXc64wmu0uaXUOKHJ/BObYGugN03wZR5yoDpSzYYuj3a6Pw9CK72mpwi8sdvB8pR0L1LTvJFCjx9i6JsOy0Hz52wULTJEd7tTXplVPtj82ZdjP1XXUKr0t9FWo4XnbKVriQ2rAvry73F5FsqALI0wNkc9tH9g16OTbcJPKD/ffcgI7rF6KwAAjhmNY8QE3pVKjiamlvCQ19YKVNa4ZjuLR4RLkX6BLzZYKg2K17eGNq3tIS3JVB5nvXcoTprHi53dRc++w9EYEDn057sIP8Si3p6a08SqSjgzwt5iKpNyencB9g+owU+PfG+dkd6oKXUxB8w+Z8t8kdsrqTajwe/jU/RDj/HP3O/b7d9iBhnrOQzeSwK9Ebk7kQIfkcDaDcS7/8B4iPRcYQWsOlcT8TFxWT62t/M7TmQapB04GYz40255irQyd5qVVxyahVkVLw9gPkCpbdVS7q0GWl7DvY0ISGWEa285Hnz4wloAgEjoCxfHPFQWAAhdeRN05RSMqQBYGyro3u3hRIb4n06V35rRuF7LvLO4M+JliX/a62W72MY2EGmizkkCJw+XTPyw6WHGonz14FUr00naMA/ZWlreP9kHCfCXZgvBGFpN3fPEd4Dk2PdJI= X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0146;31:dmV1T/U+vAfhEonp/aTa0OkIsvKTJ1UGdDv9dw61gbKZjnOa21oNSbFHbTZUqKaV74qNMkYXGLwvaor9ieTHYkRXsDNb5FLbX8/dhcOtKcYgMml87MNrmmhriO7j9QKGLckC5FekLiS5rbfB/+HPLECQEfrohwxjYZOFlggkj4/NPrh5WgCsQ4XIPe7xFgkxqp7pcVkpF0hAcKpY3cArOHC48NQLn5XpNK4vL2rdBzMP+B50WojkfFu32B9hSAJUH/j1wGqTt4BW3RowsGOHJTyR5Y7mtfRAouBBPTCUYKA1gytr9PBRFYvP2LzCU5VghR+sY0YNjIvPKg6b14wX2jfTqzXB4NVAwIRVfxK7Vm77UbEAX6q9hEsA9532gzDLShkpxWwkB51ASu+B0AKbvl1QerOfX1KoCemAUWzz7z5wiM2E485KgzDuToIu455Joj5EK78Kh0k1Dp/CppqS/YCUgfKKURVf30dTiTs/MFVMJ6G3eq5gVN33atFQba/ZYqjDaxFefTl9MiykA8OeEHmH/NdY4gltrffGyOT7oMHDfneh6wh43Aayli4RZjdNOnNmx7IfeK4FXinvj3FRbBJeSf4UXuqqIy/mHwbq6W7+M7YA4QI5Ssr0MLteFZOfgbVqJYW617z0EvNTUsDANPRf5IDbsjMdJ+IvbWOwymk= X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0146;20:F6AjDKzq61QZpeNPQniakMiZWG5L6TOn9lkeERg6idTdvkjtr8QYCS5TL3wyDtZwyD7huAqvoiTTSdgrnJK5oFbXS/CKm5Z6dp4iuL8merWFM+aSqucQm2KOdpn/x85+oRPbGcTETHSaI8V27W7VPG0WbpL3Qc2e8xdsyC+QX2O2hAO9WC7h0eFNwU83Q6WTfXQzkLkbEWTENfPbfhCJjCzpbo78dLsOyRRgp97MAh7jZgwoRXVjRqOd/2cLhiPeZY4z4nqO/AHFdYE4YoG3lL0+BPBziXlLgwvtwXbOtzKQw80+XLlxAQhwgebXYiA6XARqyUCZvEUlryo2qIpCgBMOcFTCrYWLVmNB9L1YGLXfLUwAFJBsxBCHPfmLn4Qme0oSSMjuz7MkIpJZKA30dnc3vT0/ru3kBdMJk2tGhSfx5KWszgDfWRB1aNsAfNCLAVpDqR9PrMWPLpnG3RF6nf626BpyXD03JwN5ROxsr1d/Gyq+uAw+Gep6+mT4xrZp 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)(8121501046)(5005006)(10201501046)(3002001)(100000703101)(100105400095)(93006095)(93001095)(6055026)(6041248)(20161123564025)(20161123562025)(20161123558100)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:BY2PR12MB0146;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:BY2PR12MB0146; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR12MB0146;4:KI6VccW9iEXqhISMuEQLZ5Lm2A0AKBgOYEKhErZAsG?= =?us-ascii?Q?zlZcVrz54+QR9ejWmxu045q92v1NCM2SlI/XDMzeS7ypEkm0ErkMXtX/6sJ9?= =?us-ascii?Q?14T20zhNaOs+Zn0PPpxLB/Cvgu8/IhfHJR4j4jhAD/Tm11LkJMNmUQ74sWmr?= =?us-ascii?Q?EGa+l+WZDRdqrBHkTdsxt19hwHUfc8WWKYe+7NBzeE2XZ14vJC/jf5UQ0MKe?= =?us-ascii?Q?xmmjhAb4iXnX+dPAy5MtmuqHXFzjtKuof3+oSwZ/BrvRCf9nThGAeGYR9StQ?= =?us-ascii?Q?ijEyG1QTQCg/PRKuybqQCquvKwHheiE3k8Mrq5QuJO0BnxBQFTBAm+Zc2Mxh?= =?us-ascii?Q?WWEGWUrf6sYvIXinagDg2JVdZEsqdfPUZnCgW0RdMrv7+mMfwH4814kba3hd?= =?us-ascii?Q?nNZbenSAiQPAFqw4N0jvykrzrZAChd18GqbZqgz4r4+Hus6Sr4r1tq8jGGB4?= =?us-ascii?Q?Uid5L6EiuTsykhLEuIk8LIBl3Im77LPRIXMZQQfmz2kp1zsgrUaHgtN6abMO?= =?us-ascii?Q?L7Oz3q6JLhbBJ8upYuNP/Qx/CkhjllhTPDlUvSKCPnGJNGEsk2evnFaVKSKv?= =?us-ascii?Q?RO2dbx1D5g7vH9xGEwVascsyhkhI7vtA6dRyLMK8BvYMf42HuhagSfvQl7ee?= =?us-ascii?Q?m1+jX47q3dLLam9hszpHLoWHYllksS7ey1aRXqXL8LzNiP6TImAH4f7xz3Vi?= =?us-ascii?Q?DHQKH8QvpPP/t78H2qR56b/5ThebWxOpcNKnuIOE8zpIA8YxxaC3G3iaGjpl?= =?us-ascii?Q?ISss5YypQB4k240NH6Wg9VLgbGQaaaAiq0E3m7cQrC7Edxj5C8SMwZzWww8o?= =?us-ascii?Q?xuF7mMekcK+J82HInNCz4HFMFxDia55j4L7HP8UAintPSlteRquMkmaGDygs?= =?us-ascii?Q?AEwidBz6IrpHs8lgLg0DmGmnX0M5LlP+rcxSh7r1d2ARNzMOal0ngTNNiL8q?= =?us-ascii?Q?pzpSkFoIUxhSS9XvOi1+aICCx3GbFjn3gBSJpsmvUHvqxQwe0Wg2OkIw8kb2?= =?us-ascii?Q?/qu8RcLa2o1DHd644AVyxKW8P6t/s0agBovEgPTv/J2jqlwjwyoxb7qRIzxZ?= =?us-ascii?Q?IMNoWglObbP49C1EZSd94qY6DsKJSaOXTycMmqYYR2W9lt1FZ71LQvGbGAPE?= =?us-ascii?Q?0raMPX26qXtuG4B0yOzMG7DaUTFzJNGXN6maJkxCpY4ThgCway6D1fbBlmxF?= =?us-ascii?Q?EVaFZKMNyZ041vqDVT1sFC/0QXZM6BwE6M?= X-Forefront-PRVS: 03468CBA43 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(39400400002)(39850400002)(39410400002)(39860400002)(39840400002)(39450400003)(6666003)(25786009)(81166006)(7736002)(110136004)(86362001)(38730400002)(48376002)(50466002)(5003940100001)(66066001)(8676002)(3846002)(4326008)(47776003)(6116002)(2906002)(36756003)(189998001)(53416004)(478600001)(76176999)(50986999)(6486002)(5660300001)(305945005)(42186005)(2950100002)(53936002)(50226002)(33646002);DIR:OUT;SFP:1101;SCL:1;SRVR:BY2PR12MB0146;H:ubuntu-010236106000.amd.com;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR12MB0146;23:rEOORiBhzcJ9WAN4ENZRsQNklPa/HQsA+eFvCUh6l?= =?us-ascii?Q?awm3GSRtd92Vnp1G373ZaFV6MtD9hGt/gnJlchk3psWI5z47J5kn32LEhC0Z?= =?us-ascii?Q?1SmWbeHw2zleqRG3Cxxi9Br2aeRuHC2t6oCC47GkOaZ5838rKItVUBOQyIPi?= =?us-ascii?Q?+pqtg1utOH5V7jci88lLNR2c0TBRtLNVV0dHldbgl6qdV0lbVcTbJQBcez6Z?= =?us-ascii?Q?c5tuFnuOi5aA8EKqHhm400XHkBFv7mktakbqDQ2cANliHCgfOo9qAYzlBCF1?= =?us-ascii?Q?f1wGogHdQhKF3moH9neyKSXdDGYJx1hbtrV/0ARSIcZClSZeVttmxd9zecCU?= =?us-ascii?Q?5bmn1ogwC3qRa3Nv6Ff3WK9kkHMK6j/oZ2PYzTY79soWWWLqNGWKqeTqbsfn?= =?us-ascii?Q?H4ZXunovfNyt1cGxDkV1dOnheKtdVNLPh4QgCNVMukiRfrro8J18shGzLaY3?= =?us-ascii?Q?1Vrq7NXKKs65SIRCB9HVHkV/GiAD+9lhZHMFZ2GRNwdnAs1i3Q+TU2jBm1uR?= =?us-ascii?Q?vGMYslCIbsGbwcmUNr3pj8bneNOWR8j0biZWCbPfwDXjDRkZyvSpyaWp9Avy?= =?us-ascii?Q?/RMjjEkkIJCh3wLvA9+GkCxz8lHjQAHrOWRMneGuddAXZwglgMv0tP+/cFxr?= =?us-ascii?Q?VHsaazJHrPe+RzZm6GKOvyhQ0W8V9Fiz7g8ztM49Lv+Cg7Rde/ga+0QB60X5?= =?us-ascii?Q?VGy9e4TjL+6AuJMwFR8aEOt+cYcPMVuxYKHz0XPGYGb4KD8FDX8QgqxZDxcJ?= =?us-ascii?Q?343dP/lFJW2e2QQi7LGe/M/Mdx8vSchIrbIjd50e4BVKak0ZLIlHloNZPIP3?= =?us-ascii?Q?fK7fDKoFo9pvyJiVxGis93K/qwZIAt5NkBo4QfEs5A96yELGxkmahVMDvnVe?= =?us-ascii?Q?ogtuNEe86CE4tvgmqmzgVyjOvurG24fS8oWBFz1wdh7fbhu2sQL1QDcjqYZ1?= =?us-ascii?Q?KCTVL5Fs9hHNF1JdpxVD4w+XIg973rYq9caaC7yYdbVWjZhaWJ79hYMARup0?= =?us-ascii?Q?I0dqFxduWw/Csh/tSpWcHRJ?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR12MB0146;6:2V1eOi6aW7VMeyl+XzeTi9s15x5ou6BrrqC+dxZ7wu?= =?us-ascii?Q?pHFqDS+ZQ2ENLvRCCBUzGzeLbxxLHI4swnX2ISZ1cC8SrmBZ2f4WzG3XAuvr?= =?us-ascii?Q?UCen0AoF9tnzXmVPcKS0vvGx1a/W8eU6RLAakkE9Cid8Qy+7do6vt4y7BZ+N?= =?us-ascii?Q?fpBm3XtyYrJjA0piNkgTkE55/dpZOQ76CcBX/sh/qTZjJ6uU6QUUVTF12ofC?= =?us-ascii?Q?aY4vhvvzkPf9jZ9UFdW2uD0MPdJ1LpyeFVy7QwlGPXt5jQIJ7F+dPxqXi1qi?= =?us-ascii?Q?/7ZdwppM0JFALDYlAv+8JHHz9PKcdaRXHd84PWtTTjedObwNsMEn5e8gYAWi?= =?us-ascii?Q?Eet7xljzDOT97SUeQUpVDscvpPpSmOu4Cgx6EQrOgNs3mceG5lmBoWp+miAo?= =?us-ascii?Q?lurNe9NlqWmZ/mt4PuLEshjbg3Te2wX1KOF+2F5iBmD1KgYvl5AFEATwWhxv?= =?us-ascii?Q?Ml2q0TTq6NGJuZgkmCIUPilw3CXivXrvHYz7aBKDfiiN2V3CNtIOVvyKwbyq?= =?us-ascii?Q?jDpV8CJraBXwjTOKV6KmO6HWgOFT/16uzeiLAq8npp91+wwRt04Y21ju9XLh?= =?us-ascii?Q?DrrY2ugsBmNrg5mW+0QHaLUebm4aUBF+S1RPj3C6op0S8yHDDwHTKleG5afg?= =?us-ascii?Q?IvnGc5tEFKAH/92CKk65XMdd81LL0enI/2jm8xkluPuFkreCplgtJ3dbFFaI?= =?us-ascii?Q?zi9m8JOWX88tVYvIMJx5jY32htNT+v9ub0IquZT4EWOQ7fmJEr1FaLYcxhIc?= =?us-ascii?Q?5lpComxTycMyBc8SYbDnYHwJvoE9QABxcU9Xts8rwekxYNKBdOjGAFt0BXXl?= =?us-ascii?Q?e5yn4TeZFdVVGBfWSUJkwpfwGPADgeFTyRmdWEm/f0ZXtr+brC38if3rTP16?= =?us-ascii?Q?N+DoMotF9jpdC2muIca2SsS0nM2yPvh+L7maVcZHCpgzk2s2jLIU+IfOUA+V?= =?us-ascii?Q?ffaDPQbqtfj09kWA3LNNmsuffEKDSq5NiaKGK14G6CDSsRzAHN0Z8YDl/5qO?= =?us-ascii?Q?VXFpPAtTqelUZf9S1SWQMt?= X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0146;5:m9Tf9xeNiC/c7QJ6bNq0dMBPkfbMjoaRkV9E6SfESPr826IXSdRT8gugcLHaBn3dKGTEIFBONdQpQCaUUVpzPDnxSEanMIYPZxlkNJUYKKh8KXd0FswEwIT7KdgPITcUmlb1CKnDvVH98SFl6sYj6YS0ed2daX0PqjUYgY5zIu4Aa1mLl0BVlO20ivZNxhQB+xUAj6Vz+LTJBkvYl+I8XrlIuXsg9RSJgNygoa1YxS3XJA2uF1E1wx++JLjCZy3RITnygrAJsWRnV40vLaeTaGBG56LzcMl+RWwYwz2l+z1r5g6zjLUKiCQpD+dwhYtkC4jPeoLbFIBAHQlCW6VlRBMsf5L12FchrQMG3EYyhgWYVPNY2rkUg64qRrWUrF6crFbluVZA0+TXsXyT1XBIAoQnLdz9KFfDZISPeIzrKFu6tiYekn5XztVn84L4NcsgGuEK6sIAG0KkldUQgjP5QnsW9UKkgf9ZUQH50reNFzxrACoNeiBGpBw6/4zJyMvw;24:Xf7Dr+HwdTgR9DqSad36bfRS/KWLb83UNfI3zV3N9h+wZcIv3qfDhw58ooYKlff+qB1D9jjjbNlnCroJT/L+8hRfpL12SecMmDW5tz+pHsA= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0146;7:WXZw690IzR4Z7e20cDlz60AAGAdDmLgEbTWvkKq9Y4bvyjURsg457DVp+mYk7mN+Qi99tlYhKDVXbXvihklcvb+qK3Z++3mLyC4sl/QEKNOrnZuy91e6rMvqCXQwgXzM5tM1nKNpp9A1rGHU5aKltYVxlKOnYsvRqbGz+jMJhoRaXF3XPozDkYv7QoeRzZ8zzQRRAi6rrBjebfQxxa1hF4Hg/no2YRaxwLsxp6bq8d1IcRuf+8pVveOAr5n+2BMH9d7b8l4jWa572+oGjtUxaUSwhK+MIc9DVYj4Hd/5jvEiGR8EkzFtND1pNUbBm930xNF1NOtneonGQfzpdHHNBDaXpMYPcHqu4ADl4Qug3zTbnmhm71Ajjsro+1N33IkKPe5V17FEXoCIE9tqlH9+kNkAPjb2DFMuSxdWorrT0dR2BrsIAux1H9pj5lwBSKkRDmx+WpvLarj0Pq8ykEB6uk5i3PWloY5JnofpVjzVduPrLjO2O3wAxhd9j65l63Ut+79DNGfUrrHeFEs2wb3l5qdnjuX/8+r6K+gDUeFAbvEHJAqDcqf2Ny1a0EKXYuK+9rWQ1Lm2jAu806ydXsP/DzQo1HFiGSgvICOWwFT9gxSB5ScbeArPW7VU3xYc6Utk2DomULKA95o2R2U8OTmkp6KXJP3QmjCvw+SCBM0vKRxnIzVc9uh+nrEO+w6f4jb8GfOcs5kHjGcIAMJsrcroHkOlZqYL0Cfd5qSipCIyO3BOWvodiuLg4he+J4d0MjHdt/nAsFGDRWMVGGAGwWLpGXWFZ8kV3YJ70NuvdKVY34A= X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0146;20:Xw1oLoaypY6ENyZFxUiKl8Qlh81IhA9OQz2Stem7Fm+KN8rlPx8sWIoLuxvgKFFAQ+0OS0qUntw0tJ8t+9CSyVsMZdlmQf6PO4PraWEwDnuzBS9sPiatAXYkzE9oKiEigZYvy0whESWmwyJbwHymZV7u5eIaR3z25CatUSG2kBO7pXd5oU12evvGaTlJCRQbd4oqkE8ty8y3PuXhl7UVYNnGOchgdWNbCmn4e+55CGsDXhrqhom5WNrqdBRZWY9Q X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jun 2017 11:42:35.1931 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR12MB0146 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 ca5fb3f..a77d2b9 100644 --- a/drivers/crypto/ccp/sp-dev.c +++ b/drivers/crypto/ccp/sp-dev.c @@ -82,6 +82,113 @@ struct sp_device *sp_get_device(void) return sp; } +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