From patchwork Fri Dec 21 09:51:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sumit Garg X-Patchwork-Id: 154385 Delivered-To: patches@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp712454ljp; Fri, 21 Dec 2018 01:52:22 -0800 (PST) X-Received: by 2002:a17:902:20c6:: with SMTP id v6mr1856281plg.156.1545385942853; Fri, 21 Dec 2018 01:52:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1545385942; cv=none; d=google.com; s=arc-20160816; b=0Ljksdy7QhnLolhdDaFxGFzX4B0gTurYXXpDao2dWijUENOfILYT3Ids+c9Rrzbrpl dEaSur8/NEHq67bPnReDy1/p71t25lJtV8vaynFVIgacq3zSPybinX/e8otbp19aOIB0 z7ZujuQUKd5UdPVWizhrjihoE4VQfWHKg85e3fjJ02G7dtkLPTXsUYdpahKX86BfW9jl Q01Xq0ZYuKBR5rGCddCMH4RUzTqaIde3ZWL/KZp7xWsNMVk9Tniq6xXg34WNDK032oIU EoTDuMgEjtd25qDcVS1Vxhvnb4+AP9MXfB2K5wMS78aAWuvbQR2qgeAxe0f7KsBx2TCA 9Alg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=uuHGIoyqQtttS9xE06KahrWzGw46xmUc9M7qxbxCq40=; b=0lN5vBFJFsBrR97ToV47/KHh8URoA30HP0JKZg8UUDCZXrFpHmfYoPpIDzIP+tgTEO h3KHzTm3tHsneBYYqE0jjn/s3Ub6uSa3UoLz0ro+Nb9iGr24NmvR4drIg9wtjWK/iMyH i2vpRhPdwzHrQOFdobJw65+ZEgnacqW17pNDix6WnwIgJfYvgycLyqsjddkC3sX43hxa 2O3lmHZ4zOfoYWtrk5fijgyWsZnCMelv2qZUnF5bh1DVfa0EXgAjG+TmJl9o94gKcY/W 6BNx+vOmtSM2frdZ+i7xcRYy/Sip+Zr7ydX1wYDK+jdJwXfoY76j31gfbccsg3yawUJy 3jkQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="kQBFb/aM"; spf=pass (google.com: domain of sumit.garg@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=sumit.garg@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id j15sor39674059pgc.41.2018.12.21.01.52.22 for (Google Transport Security); Fri, 21 Dec 2018 01:52:22 -0800 (PST) Received-SPF: pass (google.com: domain of sumit.garg@linaro.org designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="kQBFb/aM"; spf=pass (google.com: domain of sumit.garg@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=sumit.garg@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=uuHGIoyqQtttS9xE06KahrWzGw46xmUc9M7qxbxCq40=; b=kQBFb/aMkryjTyjcVoMT9ycPjrtKT+XnD99IENUluzN0ajQNd7FIFxf/WgOGLlO6Na vOdaUGkKd1Mr7V5gDqpS3j9JZMLK0gwz5WmK/vp16kjSVJb+N/7P9pu7VRMl3XWpaH3I zTWigG3Es8RHlbCzvbnV6qBH/PP89rDTehVa4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=uuHGIoyqQtttS9xE06KahrWzGw46xmUc9M7qxbxCq40=; b=XIervI/dzaym3/RTSf15mzr7v1HswOL7E/8THhRWTVRbz1Y2eCVjSn5U6SHmu4WJkV XqJ5obd2UOXc+HA9vKE+6f8++mUV0QKlSZ8m+GfEsGM0OxVkLRzPXHog8sC3ebIm5I+2 jVPqZaBCb6sAUvazwxtoSoZvAhacUOSyOER2W+zP4U/vlMFsz1ttnUCBbbWSdS4G5f3y /zubDIUJ6PUjc+LZs4ttIZMJC8+QBMAPP900JX0asD8wYb2nOsO6SssCBO4lHy/sNLmr v7OaVw1Cb8w2IxUuovdWvlhxHeKv9RUmq7o5CA2941SS1Sz057aTQlHmlcM9qCO5KvA/ 7yeA== X-Gm-Message-State: AJcUukfytP+a+cv8E813CXuKBNMXRsUOWDmNPgI4/CYVDQTcTQEsPZ90 InO+iYoaimWv6Jrhf1CuoFOeFSSm X-Google-Smtp-Source: ALg8bN5AegeKMJ5KPF7uAN5pUnUbp1yk6mk5TKaXuMm0/2WmbMugDn034hN30TPs+hGddcbi85VgWA== X-Received: by 2002:a63:2744:: with SMTP id n65mr1700262pgn.65.1545385942409; Fri, 21 Dec 2018 01:52:22 -0800 (PST) Return-Path: Received: from localhost.localdomain ([117.196.232.175]) by smtp.gmail.com with ESMTPSA id u29sm30605908pgn.23.2018.12.21.01.52.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 21 Dec 2018 01:52:21 -0800 (PST) From: Sumit Garg To: daniel.thompson@linaro.org Cc: patches@linaro.org, Sumit Garg Subject: [PATCH v3 1/2] dt/bindings: add bindings for optional optee rng-uuid property Date: Fri, 21 Dec 2018 15:21:51 +0530 Message-Id: <1545385912-19068-2-git-send-email-sumit.garg@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545385912-19068-1-git-send-email-sumit.garg@linaro.org> References: <1545385912-19068-1-git-send-email-sumit.garg@linaro.org> Add bindings for OP-TEE based optional hardware random number generator identifier property. It could be used on ARM based devices where entropy source is not accessible to normal world (linux in this case). Signed-off-by: Sumit Garg --- Documentation/devicetree/bindings/arm/firmware/linaro,optee-tz.txt | 4 ++++ 1 file changed, 4 insertions(+) -- 2.7.4 diff --git a/Documentation/devicetree/bindings/arm/firmware/linaro,optee-tz.txt b/Documentation/devicetree/bindings/arm/firmware/linaro,optee-tz.txt index d38834c..e3a4c35 100644 --- a/Documentation/devicetree/bindings/arm/firmware/linaro,optee-tz.txt +++ b/Documentation/devicetree/bindings/arm/firmware/linaro,optee-tz.txt @@ -20,6 +20,9 @@ the reference implementation maintained by Linaro. "hvc" : HVC #0, with the register assignments specified in drivers/tee/optee/optee_smc.h +- rng-uuid : Optional OP-TEE based RNG service identifier in case + hardware entropy source is not accesible to normal world + (Linux). Example: @@ -27,5 +30,6 @@ Example: optee { compatible = "linaro,optee-tz"; method = "smc"; + rng-uuid = "ab7a617c-b8e7-4d8f-8301-d09b61036b64"; }; }; From patchwork Fri Dec 21 09:51:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sumit Garg X-Patchwork-Id: 154386 Delivered-To: patches@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp712492ljp; Fri, 21 Dec 2018 01:52:26 -0800 (PST) X-Received: by 2002:a63:a41:: with SMTP id z1mr1709361pgk.117.1545385945923; Fri, 21 Dec 2018 01:52:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1545385945; cv=none; d=google.com; s=arc-20160816; b=r3ltI40MDmwfpPLZXw2r7trTy+Plgl80/N9haOWoD6efd3BsW7yKwWkTPlTycZCc/w LlswQ4qzOIq4vjYnmIvIuqZRqIBH5CNNRemZbl6KXdSQaLs0d8BY2fLVI+oPO2F2iNis bHUSZsllDGLVZCjLOTNGKMpXXGdci5bha/yIwMUus3vBEI01g83BA4g4KbhkJMC0fkLO z/uJasJgUAlsGWEkKCRg9crGE4OL/HmBuR1siTDWCvRA+HpXlJqMMC5z9wmyGKXvHOni GIQS25JbfpH4kIWJPTlP9BG74oJ4fJ9cp3zGUPJplM+a1WfoSqWBinCvrDmym+OtNnAL 24qw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=lEV1sQIjeJ8vtxMw/gLYYroGy1n8/nbUQr7aTOoZJo4=; b=T7KpK/tGir/23/4bburDneXZjKIDmzpNWwFx/MCpnWIWzd06cI0aLVCKIOw2qmac9H +nSHZH8IkJYcK1sohsCaBr/ZE79hwOEMe9rt4MzSnFUGgDNUYqobglCm23gOnnw8IzPG 7gtvKXiOVFqdM5/5mEQcAe4gRTTcDPsvfLVHZtoyMzz5Zlz4D7h0OHMaTqCV69GDZI4L CTg6xAnFYlBMA52KswUV/OBDwT2146RYruBmT0NfOsFotNXvRFeQmS8DeD1WulmzreKk m0nJ5jwLwG+51y8Xfs7EbCj4LIacKwtmHJDhyZ4qESO3bDE6Q52V4vpFvJr89GiIyvb0 5sPg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="KR/DL1+t"; spf=pass (google.com: domain of sumit.garg@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=sumit.garg@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id j6sor38053870pgq.46.2018.12.21.01.52.25 for (Google Transport Security); Fri, 21 Dec 2018 01:52:25 -0800 (PST) Received-SPF: pass (google.com: domain of sumit.garg@linaro.org designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="KR/DL1+t"; spf=pass (google.com: domain of sumit.garg@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=sumit.garg@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=lEV1sQIjeJ8vtxMw/gLYYroGy1n8/nbUQr7aTOoZJo4=; b=KR/DL1+tZgcwnI62qhEUdLsh8TNOvdN3xNFquwSBWyDuRIV9gmqkl+PBe1e+AFJhZS 6hm0eUXzlwquJ+n6SEpYyThfKuy6hgqwPzE83tpkQCnSgSr+Vh/dwxckO+ptjZywK05W QqiDSjvnh3FogLiaSiBDvMJVmb01FyhAtg1rg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=lEV1sQIjeJ8vtxMw/gLYYroGy1n8/nbUQr7aTOoZJo4=; b=gKHg9abZqFmFZKuSI9jzzhizt3LZngkp5UFmFwgQ9TalvsVjNqrTxeum04tiuEXTIP JjTRUERELTvCqQwLGrLbBehYVVQyTugEhY+0KNFGo2nq4A9VAt/sFw1mTyKeKxPPz88+ Qs3bT6sEN6lUWJO2pQFDqFXora78KSZ7TETHo9qmC6Y3zKn3HTwfFoMGSn1R7jjeKfju j+USYFWO1SH1bh7cPqeZpVnpgsqenMzvuRZB18ffRctpUdHNevZ7zKq4i3MONQApe7WP nqtN/0pn0y3cYIUTijJLWGzB5mNAhYDJv4xOLYyo2aJRAydbFUktKxmvECLbvwCvNhQP NxMQ== X-Gm-Message-State: AJcUukf3OHR4IC+M7dr9QTNXt2j8+tb62M92GHoOOd6aBRxfHzxa3z9+ bf8u2W0t6BqgP3SOKtiKPcgd9w/Y X-Google-Smtp-Source: ALg8bN7u6PmF7NfXNokhTP5DSlfQXXusDCEw7RfI/43bNzNcLWpCalDQxLaXiveGlwN7eNytlKhW8Q== X-Received: by 2002:a63:5207:: with SMTP id g7mr1729056pgb.253.1545385945324; Fri, 21 Dec 2018 01:52:25 -0800 (PST) Return-Path: Received: from localhost.localdomain ([117.196.232.175]) by smtp.gmail.com with ESMTPSA id u29sm30605908pgn.23.2018.12.21.01.52.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 21 Dec 2018 01:52:24 -0800 (PST) From: Sumit Garg To: daniel.thompson@linaro.org Cc: patches@linaro.org, Sumit Garg Subject: [PATCH v3 2/2] hwrng: add OP-TEE based rng driver Date: Fri, 21 Dec 2018 15:21:52 +0530 Message-Id: <1545385912-19068-3-git-send-email-sumit.garg@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545385912-19068-1-git-send-email-sumit.garg@linaro.org> References: <1545385912-19068-1-git-send-email-sumit.garg@linaro.org> On ARM SoC's with TrustZone enabled, peripherals like entropy sources might not be accessible to normal world (linux in this case) and rather accessible to secure world (OP-TEE in this case) only. So this driver aims to provides a generic interface to OP-TEE based random number generator service. Signed-off-by: Sumit Garg --- MAINTAINERS | 5 + drivers/char/hw_random/Kconfig | 15 ++ drivers/char/hw_random/Makefile | 1 + drivers/char/hw_random/optee-rng.c | 273 +++++++++++++++++++++++++++++++++++++ 4 files changed, 294 insertions(+) create mode 100644 drivers/char/hw_random/optee-rng.c -- 2.7.4 diff --git a/MAINTAINERS b/MAINTAINERS index 0767f1d..fe0fb74 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -11100,6 +11100,11 @@ M: Jens Wiklander S: Maintained F: drivers/tee/optee/ +OP-TEE RANDOM NUMBER GENERATOR (RNG) DRIVER +M: Sumit Garg +S: Maintained +F: drivers/char/hw_random/optee-rng.c + OPA-VNIC DRIVER M: Dennis Dalessandro M: Niranjana Vishwanathapura diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig index dac895d..25a7d8f 100644 --- a/drivers/char/hw_random/Kconfig +++ b/drivers/char/hw_random/Kconfig @@ -424,6 +424,21 @@ config HW_RANDOM_EXYNOS will be called exynos-trng. If unsure, say Y. + +config HW_RANDOM_OPTEE + tristate "OP-TEE based Random Number Generator support" + depends on OPTEE + default HW_RANDOM + help + This driver provides support for OP-TEE based Random Number + Generator on ARM SoCs where hardware entropy sources are not + accessible to normal world (Linux). + + To compile this driver as a module, choose M here: the module + will be called optee-rng. + + If unsure, say Y. + endif # HW_RANDOM config UML_RANDOM diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile index e35ec3c..7c9ef4a 100644 --- a/drivers/char/hw_random/Makefile +++ b/drivers/char/hw_random/Makefile @@ -38,3 +38,4 @@ obj-$(CONFIG_HW_RANDOM_CAVIUM) += cavium-rng.o cavium-rng-vf.o obj-$(CONFIG_HW_RANDOM_MTK) += mtk-rng.o obj-$(CONFIG_HW_RANDOM_S390) += s390-trng.o obj-$(CONFIG_HW_RANDOM_KEYSTONE) += ks-sa-rng.o +obj-$(CONFIG_HW_RANDOM_OPTEE) += optee-rng.o diff --git a/drivers/char/hw_random/optee-rng.c b/drivers/char/hw_random/optee-rng.c new file mode 100644 index 0000000..8c63730 --- /dev/null +++ b/drivers/char/hw_random/optee-rng.c @@ -0,0 +1,273 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2018 Linaro Ltd. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define TEE_ERROR_HEALTH_TEST_FAIL 0x00000001 + +/* + * TA_CMD_GET_ENTROPY - Get Entropy from RNG + * + * param[0] (inout memref) - Entropy buffer memory reference + * param[1] unused + * param[2] unused + * param[3] unused + * + * Result: + * TEE_SUCCESS - Invoke command success + * TEE_ERROR_BAD_PARAMETERS - Incorrect input param + * TEE_ERROR_NOT_SUPPORTED - Requested entropy size greater than size of pool + * TEE_ERROR_HEALTH_TEST_FAIL - Continuous health testing failed + */ +#define TA_CMD_GET_ENTROPY 0x0 + +/* + * TA_CMD_GET_RNG_INFO - Get RNG information + * + * param[0] (out value) - value.a: RNG data-rate in bytes per second + * value.b: Quality/Entropy per 1024 bit of data + * param[1] unused + * param[2] unused + * param[3] unused + * + * Result: + * TEE_SUCCESS - Invoke command success + * TEE_ERROR_BAD_PARAMETERS - Incorrect input param + */ +#define TA_CMD_GET_RNG_INFO 0x1 + +#define MAX_ENTROPY_REQ_SZ (4 * 1024) + +static struct tee_context *ctx; +static struct tee_shm *entropy_shm_pool; +static u32 ta_rng_data_rate; +static u32 ta_rng_seesion_id; + +static size_t get_optee_rng_data(void *buf, size_t req_size) +{ + u32 ret = 0; + u8 *rng_data = NULL; + size_t rng_size = 0; + struct tee_ioctl_invoke_arg inv_arg = {0}; + struct tee_param param[4] = {0}; + + /* Invoke TA_CMD_GET_RNG function of Trusted App */ + inv_arg.func = TA_CMD_GET_ENTROPY; + inv_arg.session = ta_rng_seesion_id; + inv_arg.num_params = 4; + + /* Fill invoke cmd params */ + param[0].attr = TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INOUT; + param[0].u.memref.shm = entropy_shm_pool; + param[0].u.memref.size = req_size; + param[0].u.memref.shm_offs = 0; + + ret = tee_client_invoke_func(ctx, &inv_arg, param); + if ((ret < 0) || (inv_arg.ret != 0)) { + pr_err("TA_CMD_GET_ENTROPY invoke function error: %x\n", + inv_arg.ret); + return 0; + } + + rng_data = tee_shm_get_va(entropy_shm_pool, 0); + if (IS_ERR(rng_data)) { + pr_err("tee_shm_get_va failed\n"); + return 0; + } + + rng_size = param[0].u.memref.size; + memcpy(buf, rng_data, rng_size); + + return rng_size; +} + +static int optee_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait) +{ + u8 *data = buf; + size_t read = 0, rng_size = 0; + int timeout = 1; + + if (max > MAX_ENTROPY_REQ_SZ) + max = MAX_ENTROPY_REQ_SZ; + + while (read == 0) { + rng_size = get_optee_rng_data(data, (max - read)); + + data += rng_size; + read += rng_size; + + if (wait) { + if (timeout-- == 0) + return read; + msleep((1000 * (max - read)) / ta_rng_data_rate); + } else { + return read; + } + } + + return read; +} + +static int optee_rng_init(struct hwrng *rng) +{ + entropy_shm_pool = tee_shm_alloc(ctx, MAX_ENTROPY_REQ_SZ, + TEE_SHM_MAPPED | TEE_SHM_DMA_BUF); + if (IS_ERR(entropy_shm_pool)) { + pr_err("tee_shm_alloc failed\n"); + return PTR_ERR(entropy_shm_pool); + } + + return 0; +} + +static void optee_rng_cleanup(struct hwrng *rng) +{ + tee_shm_free(entropy_shm_pool); +} + +static struct hwrng optee_rng = { + .name = "optee-rng", + .init = optee_rng_init, + .cleanup = optee_rng_cleanup, + .read = optee_rng_read, +}; + +static const struct of_device_id optee_match[] = { + { .compatible = "linaro,optee-tz" }, + {}, +}; + +static int get_optee_rng_uuid(uuid_t *ta_rng_uuid) +{ + struct device_node *fw_np; + struct device_node *np; + const char *uuid; + + /* Node is supposed to be below /firmware */ + fw_np = of_find_node_by_name(NULL, "firmware"); + if (!fw_np) + return -ENODEV; + + np = of_find_matching_node(fw_np, optee_match); + if (!np || !of_device_is_available(np)) + return -ENODEV; + + if (of_property_read_string(np, "rng-uuid", &uuid)) { + pr_warn("missing \"uuid\" property\n"); + return -ENXIO; + } + + if (uuid_parse(uuid, ta_rng_uuid)) { + pr_warn("incorrect rng ta uuid\n"); + return -EINVAL; + } + + return 0; +} + +static int get_optee_rng_info(void) +{ + u32 ret = 0; + struct tee_ioctl_invoke_arg inv_arg = {0}; + struct tee_param param[4] = {0}; + + /* Invoke TA_CMD_GET_RNG function of Trusted App */ + inv_arg.func = TA_CMD_GET_RNG_INFO; + inv_arg.session = ta_rng_seesion_id; + inv_arg.num_params = 4; + + /* Fill invoke cmd params */ + param[0].attr = TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_OUTPUT; + + ret = tee_client_invoke_func(ctx, &inv_arg, param); + if ((ret < 0) || (inv_arg.ret != 0)) { + pr_err("TA_CMD_GET_RNG_INFO invoke function error: %x\n", + inv_arg.ret); + return -EINVAL; + } + + ta_rng_data_rate = param[0].u.value.a; + optee_rng.quality = param[0].u.value.b; + + return 0; +} + +static int optee_ctx_match(struct tee_ioctl_version_data *ver, const void *data) +{ + if (ver->impl_id == TEE_IMPL_ID_OPTEE) + return 1; + else + return 0; +} + +static int __init mod_init(void) +{ + int ret = 0, err = -ENODEV; + struct tee_ioctl_open_session_arg sess_arg = {0}; + uuid_t ta_rng_uuid = {0}; + + err = get_optee_rng_uuid(&ta_rng_uuid); + if (err) + return err; + + /* Open context with TEE driver */ + ctx = tee_client_open_context(NULL, optee_ctx_match, NULL, NULL); + if (IS_ERR(ctx)) + return -ENODEV; + + /* Open session with hwrng Trusted App */ + memcpy(sess_arg.uuid, ta_rng_uuid.b, TEE_IOCTL_UUID_LEN); + sess_arg.clnt_login = TEE_IOCTL_LOGIN_PUBLIC; + sess_arg.num_params = 0; + + ret = tee_client_open_session(ctx, &sess_arg, NULL); + if ((ret < 0) || (sess_arg.ret != 0)) { + pr_err("tee_client_open_session failed, error: %x\n", + sess_arg.ret); + err = -EINVAL; + goto out_ctx; + } + ta_rng_seesion_id = sess_arg.session; + + err = get_optee_rng_info(); + if (err) + goto out_sess; + + err = hwrng_register(&optee_rng); + if (err) { + pr_err("registering failed (%d)\n", err); + goto out_sess; + } + + return 0; + +out_sess: + tee_client_close_session(ctx, ta_rng_seesion_id); +out_ctx: + tee_client_close_context(ctx); + + return err; +} + +static void __exit mod_exit(void) +{ + tee_client_close_session(ctx, ta_rng_seesion_id); + tee_client_close_context(ctx); + hwrng_unregister(&optee_rng); +} + +module_init(mod_init); +module_exit(mod_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Sumit Garg "); +MODULE_DESCRIPTION("OP-TEE based random number generator driver"); +MODULE_SOFTDEP("pre: optee");