From patchwork Thu Sep 28 18:03:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Volodymyr Babchuk X-Patchwork-Id: 9976609 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 1A5646034B for ; Thu, 28 Sep 2017 18:05:30 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0D2A3296D2 for ; Thu, 28 Sep 2017 18:05:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 015D1296E5; Thu, 28 Sep 2017 18:05:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED, DKIM_VALID, RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 1D668296D2 for ; Thu, 28 Sep 2017 18:05:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=XK1nZeVdhn5qrL7/4tBfs0fhZRWe4RO1Z/RxrPnERZ0=; b=u+sSjSuzc1w1eA 1OecZir8z5ogDXcQ5Y6LX2RwnVOOZkNuu8lZfkhFEmfhLOtRlgHnToncd+krNUmBDid+LazKJb7vp eNRYuJk2zHuwQOxZP104nZF7+P/ZnkckkRe//KY81wMq6JrNmBTAzhRJFsD4NL6AKVPT71Ugxesxd YVvBlrLwVpUY9myLgAh0HEsd/oX4V3vPklWChTY/MmQiuZIdScjCBlluk8ht57teTomXTvTtwzWwe WvbRuP3ntxatt+wnun+c8yj2dlwXSZGIParAX8YP/h4dz7Fv8rnJumWMhRe1w2RxXnO00W+y3llwt eYTNSHw7ywakmUwQzi3g==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1dxdBc-0004zu-5t; Thu, 28 Sep 2017 18:05:24 +0000 Received: from mail-eopbgr10062.outbound.protection.outlook.com ([40.107.1.62] helo=EUR02-HE1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1dxdBJ-0003L5-1D for linux-arm-kernel@lists.infradead.org; Thu, 28 Sep 2017 18:05:14 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=EPAM.onmicrosoft.com; s=selector1-epam-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=iZi+k3+kTkx4OCmJLCfoAMxvHXdbv50DUKvYGWWi974=; b=ECKO9/KMeOY8pQF3hr789RRapqIn7uQj6i+ytlTxGchBI7B580CYG5PP+OYGtr1R1DoC8W3f2op6v1tZgg370JuS25V+ZlioP3jLy8BykxvRkHu9gNOnYn/mE0PE2dgukW8fdd1mM19FqRaTw2egBNX5MTPIPHw2wA0bf8TL7mw= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Volodymyr_Babchuk@epam.com; Received: from EPUAKYIW2556.kyiv.epam.com (85.223.209.59) by HE1PR0301MB2137.eurprd03.prod.outlook.com (2603:10a6:3:21::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.77.7; Thu, 28 Sep 2017 18:04:39 +0000 Received: by EPUAKYIW2556.kyiv.epam.com (sSMTP sendmail emulation); Thu, 28 Sep 2017 21:04:27 +0300 From: Volodymyr Babchuk To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, tee-dev@lists.linaro.org, Jens Wiklander Subject: [PATCH v1 01/14] tee: flexible shared memory pool creation Date: Thu, 28 Sep 2017 21:03:58 +0300 Message-Id: <1506621851-6929-2-git-send-email-volodymyr_babchuk@epam.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1506621851-6929-1-git-send-email-volodymyr_babchuk@epam.com> References: <1506621851-6929-1-git-send-email-volodymyr_babchuk@epam.com> MIME-Version: 1.0 X-Originating-IP: [85.223.209.59] X-ClientProxiedBy: AM5PR0502CA0023.eurprd05.prod.outlook.com (2603:10a6:203:91::33) To HE1PR0301MB2137.eurprd03.prod.outlook.com (2603:10a6:3:21::14) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 81ab58a0-92a3-4a07-9228-08d5069b636c X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254152)(2017052603199)(201703131423075)(201703031133081)(201702281549075); SRVR:HE1PR0301MB2137; X-Microsoft-Exchange-Diagnostics: 1; HE1PR0301MB2137; 3:mWO/g/i8w4MjT9sQEz3xOPPNBdXfhe7Sd6EdaPhYX7V3vKrhIxkHobIScilEkVcVo6w9Bh7B5adDg+GMV0cKymnWNxMbsNCFkxosl1x7/2qYQLEkKVLDuLU2V+hYI4+mzm3zKZc5twsMlFuJhG9VJ6QYIzdFh74tIm48IpUgNQd8hgBwX3OnO8kqdX/qcCxDgtxoQw5D8OTCmUiwgGCjcsScguRUywEvDZVv/NVUlJ86N38KuioZhDhu/lZ75u14; 25:+3k07d+mmIXj2oWi013mNNsjOf+AZ7It9EztSNlacTd4+8YLnd5nbdUM6FpIgkX3cT75nNt3I9p1qqPRzjDdA/A8TYlO1WpB+P2QN7NakPwK7Xetyuh1mxjHkcmaHU0qaDbJ78W7CfhJKHR9hydVfcu0W4CNweLnhH0rQHU22VGISwS9MRe7Cavr2ejWQ/iaBYjgtyC7Da6R1x5M25Hb2qv4jWQ7mSYTjMy1XuTYUQHwnwOYqlkSG8Zjxl2geovsYSVA3psj71X6NZl2ITGecYrcMNL6G+wyDuBDo9xqjh4osvT4Cbrral0fLHL7dmT8SB4yIU6Q6wMKkx2TFp6srw==; 31:NpCfUyQ3R/i0wWcU0IOfVwm4oW731eyZo69trIRlo3Fmkc27IPF++y0g4kwR5SctG7OashImcKqyl5G+wmTW5GeFyjeVBWCROuex8dor/s30jrWILYrR+Orpfxi59pt8DKWvGUTEI5/xKBSDSdAJ7e9Ggz69jgJE1XuMxIAOrrSRTUspa0aQgLYlk2pf+N+BGD5cBuWYNbazmF8I2ENRoXmXK+KR6cTy8jl9Aa1W6D0= X-MS-TrafficTypeDiagnostic: HE1PR0301MB2137: X-Microsoft-Exchange-Diagnostics: 1; HE1PR0301MB2137; 20:oLRFiK+Aw7wb5hDAE1hEa+byb9/FwFAnaRpwOu7Ds7/u9v8ZjcURH/xc+PXxiC7Z4Kj4pR6bl1Cs8X5yj/IZNWKmRt2WgwOO6Rrm3YxrdqEiRqoC6t3bXKEM9UszdajyNh4Og7cCTWEDSAXNd4GnVzz7xQr4G/Lp+i6E+JlfzkbdJ4cPwxPHdcS0OZHHRzkJ/RG0pB7pB4kQGTzawHfQwdMsXr48K7W+p3oLME5T+JT1qAleBGpfjjrrY/uGLvs+a/z56gZIAAQmGAwDCqJx0dGDOmrvFRIFRwWSESUle1yFZuUZUaID60YK2GjbszP/qTpxhNoQMWv4hqXlWwEgViKdNMHIrwuc5pO3SUium1clSFi4L7qaNiw4ZR67u3doRvqeVOh7XIQbo1hMBBQTGtTEyprYBKfVF2856kPHEINkQtmIYwTR77Tlgm+DOo2/EiIKvnxF9LjmavYLZ13sj6ztG03njPr9cQSPjX+T2WpfwegcY5GPpFzSdx48RhuQ; 4:/mDkfSyMKXczF+U1vJqjtBtHlvR2jQmPF6P+HwVr4WNv8ZLGPUPcFNbStIUzwrWoMLMQUSj5PrLHZbCakIs/0yhLzcA4BUt98yQ2aTCJLsjkNR15sfNjZ2eAeo1z5ZGyHm44Tw5ZxlNFuaeWvtRsH9/K3s2PXC9s8pbEKr/J6LzcMepFnvu7WX8iQffXBvL0jEW7BLWh2XuIydgONHRVK32qorQA0YlEKRL91LgSDRHZAzTiN+sKySY+4NhHBDF2 X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(100000703101)(100105400095)(3002001)(10201501046)(93006095)(93001095)(6041248)(20161123560025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(20161123558100)(20161123562025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:HE1PR0301MB2137; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:HE1PR0301MB2137; X-Forefront-PRVS: 0444EB1997 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(376002)(346002)(199003)(189002)(86362001)(305945005)(47776003)(5660300001)(48376002)(80792005)(97736004)(122856001)(7736002)(316002)(16586007)(2906002)(42186006)(66066001)(81166006)(106356001)(50226002)(105586002)(6666003)(5003940100001)(8936002)(50986999)(68736007)(6916009)(36756003)(81156014)(8676002)(2950100002)(53936002)(4326008)(76176999)(189998001)(478600001)(50466002)(39060400002)(3846002)(72206003)(33646002)(6116002)(101416001); DIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR0301MB2137; H:EPUAKYIW2556.kyiv.epam.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: epam.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR0301MB2137; 23:+cen7687vbyRS0ZrveF16c0tacy8cjZxUP1KVrX?= =?us-ascii?Q?Srx0aZCD7RCcao2t9GP/EKzQlWT4wspruy02TwcszME+oFW1j5z9E4SxY03Q?= =?us-ascii?Q?YALJxp0rAZA/fAE5Lw/bT7bN3FxnmMPBlOxn0ynClqkSU1Joh+gJ2OsOaYo/?= =?us-ascii?Q?5RMgE4aemuor1KlgmYyF+l+/jadkCxjboZ8cm61EXwIGiUlgUK9PnHwdpt7O?= =?us-ascii?Q?8NvvUjz8qW0DFE1tYits2Ucu3sIxak2EP7950ZcC8ZUleOs7x79GXXeHxzpV?= =?us-ascii?Q?Zoo9t+hNUkPBkwC1TTltMXDdUwOI1aT6TYCxxx5cm5f7T3Z7Rjph1X7Nr2LK?= =?us-ascii?Q?WpzSJ22ul4nhPgi9Dh2NcwR0Xm7NYOOd1gvsIdxnfN8OmEgYa0nuNpkHNO6O?= =?us-ascii?Q?9Bw3/njhKWvtS2Xo7xi02wxXz7i47sGRLYdmS8AEbyQzGN7vc/GjhESfInnG?= =?us-ascii?Q?6RVVoRoGP0FgKQbcHIsartH3VnDr8PJc+TaqRpfMfKoiRtknS4etQl0QZk6K?= =?us-ascii?Q?TtnIy6dWo7S4JQTyxwxuaY/4WNNU5DAbM5hY8KhAIlu49sE3BJKe++EkklhL?= =?us-ascii?Q?F4ToTiRFZie/wtXPBs2JOnF8nLE2ibASadMEa63Oetj11ZdB/sJUYNwDOrMR?= =?us-ascii?Q?j8DvuHGtL5sOPFup123AuEf/t8d9KoSd+t3MVYoqcTgPkaRpOOYT2Ubfggh9?= =?us-ascii?Q?L19ulBQRzEam8QU4YJMfNoJa9v3GYlz0UexV1ZWmH/QRpghxTUm1fePnRmxy?= =?us-ascii?Q?VZN93g9Kb9QjQ3txaVN4RCoJ0itWu8qxfM7Iyj4GTGP3ECNRx9+ITrIz+crg?= =?us-ascii?Q?Wiwp1zymjTOiXMSHBaINGjJV8qJ6l7zDp4D7euCImCrWtTT8XNmwH4Ua6lYT?= =?us-ascii?Q?TVnNodjK82RGpengLZ38tYIyGMsVIWSQm0PXGhoI3M5wD1aEjWeTNCL1fPtq?= =?us-ascii?Q?5m1zTNYO0owaAzDGGWrrdMQBv0FqPjmL7mrxD6tW9s7HsZBRfB/VJB/DKTx2?= =?us-ascii?Q?fPuWFAL5rQtHnuzQOXrcw2V4K1YF7Mh3eOcZcPxgmhv+9hsKRAOE6R2tiMq/?= =?us-ascii?Q?HdKV9umBiaeYl6X3AnACiFXITrqCh?= X-Microsoft-Exchange-Diagnostics: 1; HE1PR0301MB2137; 6:Mgz/CaLvReR/bWYmVP5RM7iVkGkvEPTpT3rBbGCHRv/ZZhuj2lZ6miLHS8DE/gdZBAa/uM+BwBlhbT2k/qt4VEwCxXrz/ZaWLWBT5KywxNnUY0n6LfHmnIvHyUenOB0xq0y0+7l7HvmsnzW+dIlQyZDZ5Q7pN3EcA5NVA91VqyKAbHK/vNXJyXNNGS0mLhwxEeM9U5dGn6HLQE2YHK0YybXObCK97vJ2mdf8wBG8BJrfGghI+UNoGgAvs3bAnvn5k8d6COx3Cwdil8UckVnx1wtawAdaM/3yJMVI4bO6diwJfv0a9iqGy48ZZg5baqFsMhLxrIOodB7NOpi/aXyKgg==; 5:awrhNNJ2gwhUUw2iRG4DCo1MlwH51pcAMjnqcUZhJgTZ6HqB3qLn1WK5jragH5hEsScoRWS8DYEiSCFhyoIZmE7hAhmRBLbu8cKHTGZfkHz9Has4NTQ5xGsVwEe59l+ml6lE3KLvDYnNKZLjrq05WA==; 24:C07dxMNiTVfXQpd5LcM5cITvRtJSoxy3wZ2pfLamk6pmHRtt4sw5kP//oyuMcEk97om1lXkdVEZQB9sPq0y7Mks5mUQo8eamPnh2GLKsXl4=; 7:WCgK7DyDboSn2TXijbKd/oLke03/EbxnzF/7gLNUYEQYG/PNh95O/n3dirPbNmi6W65745zQkIc0vo2IAuovBQ4XGlAZ+0sFFOZ9zYFo+MDZyXE77briOu9Fh3y3QES5KFQVChh8uCmYfPfmTNUObLOlqxwF0KRXiNuC+W/kFzkBpkzTGcSeaLh0bEtW7d8dvrof2fqVaJKbem9ubE3Cmc/thlQ3jrduX5n43dqIJQY= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: epam.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Sep 2017 18:04:39.5237 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: b41b72d0-4e9f-4c26-8a69-f949f367c91d X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0301MB2137 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170928_110506_076499_2A111A77 X-CRM114-Status: GOOD ( 17.55 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Volodymyr Babchuk Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP From: Jens Wiklander Makes creation of shm pools more flexible by adding new more primitive functions to allocate a shm pool. This makes it easier to add driver specific shm pool management. Signed-off-by: Jens Wiklander Signed-off-by: Volodymyr Babchuk --- drivers/tee/tee_private.h | 57 +--------------- drivers/tee/tee_shm.c | 8 +-- drivers/tee/tee_shm_pool.c | 165 ++++++++++++++++++++++++++++----------------- include/linux/tee_drv.h | 91 +++++++++++++++++++++++++ 4 files changed, 199 insertions(+), 122 deletions(-) diff --git a/drivers/tee/tee_private.h b/drivers/tee/tee_private.h index 21cb6be..2bc2b5a 100644 --- a/drivers/tee/tee_private.h +++ b/drivers/tee/tee_private.h @@ -21,68 +21,15 @@ #include #include -struct tee_device; - -/** - * struct tee_shm - shared memory object - * @teedev: device used to allocate the object - * @ctx: context using the object, if NULL the context is gone - * @link link element - * @paddr: physical address of the shared memory - * @kaddr: virtual address of the shared memory - * @size: size of shared memory - * @dmabuf: dmabuf used to for exporting to user space - * @flags: defined by TEE_SHM_* in tee_drv.h - * @id: unique id of a shared memory object on this device - */ -struct tee_shm { - struct tee_device *teedev; - struct tee_context *ctx; - struct list_head link; - phys_addr_t paddr; - void *kaddr; - size_t size; - struct dma_buf *dmabuf; - u32 flags; - int id; -}; - -struct tee_shm_pool_mgr; - -/** - * struct tee_shm_pool_mgr_ops - shared memory pool manager operations - * @alloc: called when allocating shared memory - * @free: called when freeing shared memory - */ -struct tee_shm_pool_mgr_ops { - int (*alloc)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm, - size_t size); - void (*free)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm); -}; - -/** - * struct tee_shm_pool_mgr - shared memory manager - * @ops: operations - * @private_data: private data for the shared memory manager - */ -struct tee_shm_pool_mgr { - const struct tee_shm_pool_mgr_ops *ops; - void *private_data; -}; - /** * struct tee_shm_pool - shared memory pool * @private_mgr: pool manager for shared memory only between kernel * and secure world * @dma_buf_mgr: pool manager for shared memory exported to user space - * @destroy: called when destroying the pool - * @private_data: private data for the pool */ struct tee_shm_pool { - struct tee_shm_pool_mgr private_mgr; - struct tee_shm_pool_mgr dma_buf_mgr; - void (*destroy)(struct tee_shm_pool *pool); - void *private_data; + struct tee_shm_pool_mgr *private_mgr; + struct tee_shm_pool_mgr *dma_buf_mgr; }; #define TEE_DEVICE_FLAG_REGISTERED 0x1 diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c index 4bc7956..fdda89e 100644 --- a/drivers/tee/tee_shm.c +++ b/drivers/tee/tee_shm.c @@ -32,9 +32,9 @@ static void tee_shm_release(struct tee_shm *shm) mutex_unlock(&teedev->mutex); if (shm->flags & TEE_SHM_DMA_BUF) - poolm = &teedev->pool->dma_buf_mgr; + poolm = teedev->pool->dma_buf_mgr; else - poolm = &teedev->pool->private_mgr; + poolm = teedev->pool->private_mgr; poolm->ops->free(poolm, shm); kfree(shm); @@ -139,9 +139,9 @@ struct tee_shm *tee_shm_alloc(struct tee_context *ctx, size_t size, u32 flags) shm->teedev = teedev; shm->ctx = ctx; if (flags & TEE_SHM_DMA_BUF) - poolm = &teedev->pool->dma_buf_mgr; + poolm = teedev->pool->dma_buf_mgr; else - poolm = &teedev->pool->private_mgr; + poolm = teedev->pool->private_mgr; rc = poolm->ops->alloc(poolm, shm, size); if (rc) { diff --git a/drivers/tee/tee_shm_pool.c b/drivers/tee/tee_shm_pool.c index fb4f852..e6d4b9e 100644 --- a/drivers/tee/tee_shm_pool.c +++ b/drivers/tee/tee_shm_pool.c @@ -44,49 +44,18 @@ static void pool_op_gen_free(struct tee_shm_pool_mgr *poolm, shm->kaddr = NULL; } +static void pool_op_gen_destroy_poolmgr(struct tee_shm_pool_mgr *poolm) +{ + gen_pool_destroy(poolm->private_data); + kfree(poolm); +} + static const struct tee_shm_pool_mgr_ops pool_ops_generic = { .alloc = pool_op_gen_alloc, .free = pool_op_gen_free, + .destroy_poolmgr = pool_op_gen_destroy_poolmgr, }; -static void pool_res_mem_destroy(struct tee_shm_pool *pool) -{ - gen_pool_destroy(pool->private_mgr.private_data); - gen_pool_destroy(pool->dma_buf_mgr.private_data); -} - -static int pool_res_mem_mgr_init(struct tee_shm_pool_mgr *mgr, - struct tee_shm_pool_mem_info *info, - int min_alloc_order) -{ - size_t page_mask = PAGE_SIZE - 1; - struct gen_pool *genpool = NULL; - int rc; - - /* - * Start and end must be page aligned - */ - if ((info->vaddr & page_mask) || (info->paddr & page_mask) || - (info->size & page_mask)) - return -EINVAL; - - genpool = gen_pool_create(min_alloc_order, -1); - if (!genpool) - return -ENOMEM; - - gen_pool_set_algo(genpool, gen_pool_best_fit, NULL); - rc = gen_pool_add_virt(genpool, info->vaddr, info->paddr, info->size, - -1); - if (rc) { - gen_pool_destroy(genpool); - return rc; - } - - mgr->private_data = genpool; - mgr->ops = &pool_ops_generic; - return 0; -} - /** * tee_shm_pool_alloc_res_mem() - Create a shared memory pool from reserved * memory range @@ -104,42 +73,109 @@ struct tee_shm_pool * tee_shm_pool_alloc_res_mem(struct tee_shm_pool_mem_info *priv_info, struct tee_shm_pool_mem_info *dmabuf_info) { - struct tee_shm_pool *pool = NULL; - int ret; - - pool = kzalloc(sizeof(*pool), GFP_KERNEL); - if (!pool) { - ret = -ENOMEM; - goto err; - } + struct tee_shm_pool_mgr *priv_mgr; + struct tee_shm_pool_mgr *dmabuf_mgr; + void *rc; /* * Create the pool for driver private shared memory */ - ret = pool_res_mem_mgr_init(&pool->private_mgr, priv_info, - 3 /* 8 byte aligned */); - if (ret) - goto err; + rc = tee_shm_pool_mgr_alloc_res_mem(priv_info->vaddr, priv_info->paddr, + priv_info->size, + 3 /* 8 byte aligned */); + if (IS_ERR(rc)) + return rc; + priv_mgr = rc; /* * Create the pool for dma_buf shared memory */ - ret = pool_res_mem_mgr_init(&pool->dma_buf_mgr, dmabuf_info, - PAGE_SHIFT); - if (ret) + rc = tee_shm_pool_mgr_alloc_res_mem(dmabuf_info->vaddr, + dmabuf_info->paddr, + dmabuf_info->size, PAGE_SHIFT); + if (IS_ERR(rc)) + goto err_free_priv_mgr; + dmabuf_mgr = rc; + + rc = tee_shm_pool_alloc(priv_mgr, dmabuf_mgr); + if (IS_ERR(rc)) + goto err_free_dmabuf_mgr; + + return rc; + +err_free_dmabuf_mgr: + tee_shm_pool_mgr_destroy(dmabuf_mgr); +err_free_priv_mgr: + tee_shm_pool_mgr_destroy(priv_mgr); + + return rc; +} +EXPORT_SYMBOL_GPL(tee_shm_pool_alloc_res_mem); + +struct tee_shm_pool_mgr *tee_shm_pool_mgr_alloc_res_mem(unsigned long vaddr, + phys_addr_t paddr, + size_t size, + int min_alloc_order) +{ + const size_t page_mask = PAGE_SIZE - 1; + struct tee_shm_pool_mgr *mgr; + int rc; + + /* Start and end must be page aligned */ + if (vaddr & page_mask || paddr & page_mask || size & page_mask) + return ERR_PTR(-EINVAL); + + mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); + if (!mgr) + return ERR_PTR(-ENOMEM); + + mgr->private_data = gen_pool_create(min_alloc_order, -1); + if (!mgr->private_data) { + rc = -ENOMEM; goto err; + } - pool->destroy = pool_res_mem_destroy; - return pool; + gen_pool_set_algo(mgr->private_data, gen_pool_best_fit, NULL); + rc = gen_pool_add_virt(mgr->private_data, vaddr, paddr, size, -1); + if (rc) { + gen_pool_destroy(mgr->private_data); + goto err; + } + + mgr->ops = &pool_ops_generic; + + return mgr; err: - if (ret == -ENOMEM) - pr_err("%s: can't allocate memory for res_mem shared memory pool\n", __func__); - if (pool && pool->private_mgr.private_data) - gen_pool_destroy(pool->private_mgr.private_data); - kfree(pool); - return ERR_PTR(ret); + kfree(mgr); + + return ERR_PTR(rc); } -EXPORT_SYMBOL_GPL(tee_shm_pool_alloc_res_mem); +EXPORT_SYMBOL_GPL(tee_shm_pool_mgr_alloc_res_mem); + +static bool check_mgr_ops(struct tee_shm_pool_mgr *mgr) +{ + return mgr && mgr->ops && mgr->ops->alloc && mgr->ops->free && + mgr->ops->destroy_poolmgr; +} + +struct tee_shm_pool *tee_shm_pool_alloc(struct tee_shm_pool_mgr *priv_mgr, + struct tee_shm_pool_mgr *dmabuf_mgr) +{ + struct tee_shm_pool *pool; + + if (!check_mgr_ops(priv_mgr) || !check_mgr_ops(dmabuf_mgr)) + return ERR_PTR(-EINVAL); + + pool = kzalloc(sizeof(*pool), GFP_KERNEL); + if (!pool) + return ERR_PTR(-ENOMEM); + + pool->private_mgr = priv_mgr; + pool->dma_buf_mgr = dmabuf_mgr; + + return pool; +} +EXPORT_SYMBOL_GPL(tee_shm_pool_alloc); /** * tee_shm_pool_free() - Free a shared memory pool @@ -150,7 +186,10 @@ EXPORT_SYMBOL_GPL(tee_shm_pool_alloc_res_mem); */ void tee_shm_pool_free(struct tee_shm_pool *pool) { - pool->destroy(pool); + if (pool->private_mgr) + tee_shm_pool_mgr_destroy(pool->private_mgr); + if (pool->dma_buf_mgr) + tee_shm_pool_mgr_destroy(pool->dma_buf_mgr); kfree(pool); } EXPORT_SYMBOL_GPL(tee_shm_pool_free); diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h index cb889af..e9be4a4 100644 --- a/include/linux/tee_drv.h +++ b/include/linux/tee_drv.h @@ -150,6 +150,97 @@ int tee_device_register(struct tee_device *teedev); void tee_device_unregister(struct tee_device *teedev); /** + * struct tee_shm - shared memory object + * @teedev: device used to allocate the object + * @ctx: context using the object, if NULL the context is gone + * @link link element + * @paddr: physical address of the shared memory + * @kaddr: virtual address of the shared memory + * @size: size of shared memory + * @offset: offset of buffer in user space + * @pages: locked pages from userspace + * @num_pages: number of locked pages + * @dmabuf: dmabuf used to for exporting to user space + * @flags: defined by TEE_SHM_* in tee_drv.h + * @id: unique id of a shared memory object on this device + * + * This pool is only supposed to be accessed directly from the TEE + * subsystem and from drivers that implements their own shm pool manager. + */ +struct tee_shm { + struct tee_device *teedev; + struct tee_context *ctx; + struct list_head link; + phys_addr_t paddr; + void *kaddr; + size_t size; + unsigned int offset; + struct page **pages; + size_t num_pages; + struct dma_buf *dmabuf; + u32 flags; + int id; +}; + +/** + * struct tee_shm_pool_mgr - shared memory manager + * @ops: operations + * @private_data: private data for the shared memory manager + */ +struct tee_shm_pool_mgr { + const struct tee_shm_pool_mgr_ops *ops; + void *private_data; +}; + +/** + * struct tee_shm_pool_mgr_ops - shared memory pool manager operations + * @alloc: called when allocating shared memory + * @free: called when freeing shared memory + * @destroy_poolmgr: called when destroying the pool manager + */ +struct tee_shm_pool_mgr_ops { + int (*alloc)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm, + size_t size); + void (*free)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm); + void (*destroy_poolmgr)(struct tee_shm_pool_mgr *poolmgr); +}; + +/** + * tee_shm_pool_alloc() - Create a shared memory pool from shm managers + * @priv_mgr: manager for driver private shared memory allocations + * @dmabuf_mgr: manager for dma-buf shared memory allocations + * + * Allocation with the flag TEE_SHM_DMA_BUF set will use the range supplied + * in @dmabuf, others will use the range provided by @priv. + * + * @returns pointer to a 'struct tee_shm_pool' or an ERR_PTR on failure. + */ +struct tee_shm_pool *tee_shm_pool_alloc(struct tee_shm_pool_mgr *priv_mgr, + struct tee_shm_pool_mgr *dmabuf_mgr); + +/* + * tee_shm_pool_mgr_alloc_res_mem() - Create a shm manager for reserved + * memory + * @vaddr: Virtual address of start of pool + * @paddr: Physical address of start of pool + * @size: Size in bytes of the pool + * + * @returns pointer to a 'struct tee_shm_pool_mgr' or an ERR_PTR on failure. + */ +struct tee_shm_pool_mgr *tee_shm_pool_mgr_alloc_res_mem(unsigned long vaddr, + phys_addr_t paddr, + size_t size, + int min_alloc_order); + +/** + * tee_shm_pool_mgr_destroy() - Free a shared memory manager + */ +static inline void tee_shm_pool_mgr_destroy(struct tee_shm_pool_mgr *poolm) +{ + poolm->ops->destroy_poolmgr(poolm); +} + +/** * struct tee_shm_pool_mem_info - holds information needed to create a shared * memory pool * @vaddr: Virtual address of start of pool