From patchwork Tue Jan 12 08:43:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jorge Ramirez-Ortiz, Foundries" X-Patchwork-Id: 1425031 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=foundries.io Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=foundries.io header.i=@foundries.io header.a=rsa-sha256 header.s=google header.b=PVoE6wAw; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DFPK16Fr7z9sX5 for ; Tue, 12 Jan 2021 19:44:53 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id BEB58825D0; Tue, 12 Jan 2021 09:44:19 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=foundries.io Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=foundries.io header.i=@foundries.io header.b="PVoE6wAw"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 5B6578278A; Tue, 12 Jan 2021 09:44:07 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 1FDAD8278A for ; Tue, 12 Jan 2021 09:44:00 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=foundries.io Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=jorge@foundries.io Received: by mail-wr1-x42b.google.com with SMTP id m4so182826wrx.9 for ; Tue, 12 Jan 2021 00:44:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foundries.io; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=wQHRYBVHFIRy/eWMW6YE6w5enlksn0P7BLaE+2TV8R0=; b=PVoE6wAwPQHuDTrVOccyORIIxhz2dY77tKfGPVZ+cv+wCEMKrwziNWbY74ausB2MtK fZUvAM+DafAKLt6+QFaOxuztgSYrCz3Cc1Pe3twXYp4oItzH9Rt2VIPR0v68/gWLQHFZ E+FEvxfX8UXFykEGtkHykBH1soSz4Rh+IWxrIMGwxnhSXJg5vJCc8iyaB3LXcxcU5RdB pJn9+tTbGw/Q/mSTGek8w2zMrnEVB5DaFDIwa1FzP/yKM1h3Nx8+nQrMorTCFOFZZEp5 egJCiYP/67oxRY5M01FnyiuiHuqUwjH/h1xC/qZVj9w0Y8tuLTJa9eLgcdAhdx6J7VC5 WrqA== 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=wQHRYBVHFIRy/eWMW6YE6w5enlksn0P7BLaE+2TV8R0=; b=IdsLJNoyGBXYmIzh6+ttLV3XBOxq+/BXUR3qfP/4NzIipFpfXIKcK/JB0gEQFBWhHb 9jT0fdyc1n8Onyvm1CyAutr2F0FuG86Me+a/PVW+JVkM66/JezqWt3T83KQaMaqOJgVh RuM3hH8RGNzH3Z61PJqW56Z2JefPTfWr44Rv7ZNE2ZDnCgxHv+7a8PrMNhZLehT3j8Cz ZhuZF2mNl6CBJEP9b7ahioAdbHPXemgEnt0AYdXxoKOnk1vj3zZpS/YEoO3SnH6Lh2q8 JD9IPe6dGGYMrzEnm2Q32z0aeTJazFg5Wm+DFI+CNcQlBzOkjUhjZ860zKZ6rz8kvcIp uWTw== X-Gm-Message-State: AOAM533NcZJsdozOkZjT4weI/UNiS4Cv9SU/A8ZB/G4aZS/RUZ1s5OoS WwBWBZZAoJg/gqEr69LU4tkHxg== X-Google-Smtp-Source: ABdhPJzBrF9t9ImO4ID/aZPRbAbPgJyUtVw2Yaqx9DWGA0JRQgdiOMOanj0Vt5t6gaRCJlYCh/85wQ== X-Received: by 2002:adf:84c1:: with SMTP id 59mr3146295wrg.409.1610441039687; Tue, 12 Jan 2021 00:43:59 -0800 (PST) Received: from localhost.localdomain (240.red-95-121-89.dynamicip.rima-tde.net. [95.121.89.240]) by smtp.gmail.com with ESMTPSA id z63sm2714487wme.8.2021.01.12.00.43.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Jan 2021 00:43:59 -0800 (PST) From: Jorge Ramirez-Ortiz To: jorge@foundries.io, jens.wiklander@linaro.org, sjg@chromium.org, igor.opaniuk@foundries.io Cc: u-boot@lists.denx.de, seanga2@gmail.com, vikas.gupta@broadcom.com, trini@konsulko.com, mike@foundries.io, ricardo@foundries.io Subject: [PATCHv3 4/4] test: dm: tee: extend with RPC test Date: Tue, 12 Jan 2021 09:43:40 +0100 Message-Id: <20210112084340.23858-5-jorge@foundries.io> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210112084340.23858-1-jorge@foundries.io> References: <20210112084340.23858-1-jorge@foundries.io> X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean From: Igor Opaniuk Extend existing DM tee tests adding test coverage for reverse RPC calls. Currently this commit only adds tests for I2C requests from TEE driver to TEE supplicant, for instance reading/writing data to emulated i2c eeprom defines in standard sandbox test device tree (arch/sandbox/dts/test.dtb): => i2c bus Bus 0: i2c@0 (active 0) 2c: eeprom@2c, offset len 1, flags 0 ... Running TEE tests: => ut dm tee Test: dm_test_tee: tee.c Test: dm_test_tee: tee.c (flat tree) Failures: 0 Signed-off-by: Igor Opaniuk Reviewed-by: Simon Glass --- test/dm/tee.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 104 insertions(+), 5 deletions(-) diff --git a/test/dm/tee.c b/test/dm/tee.c index ddbdcfb0cf..2cb54c68fb 100644 --- a/test/dm/tee.c +++ b/test/dm/tee.c @@ -13,11 +13,12 @@ #include #include #include +#include -static int open_session(struct udevice *dev, u32 *session) +static int open_session(struct udevice *dev, u32 *session, + struct tee_optee_ta_uuid uuid) { struct tee_open_session_arg arg; - const struct tee_optee_ta_uuid uuid = TA_AVB_UUID; int rc; memset(&arg, 0, sizeof(arg)); @@ -32,7 +33,7 @@ static int open_session(struct udevice *dev, u32 *session) return 0; } -static int invoke_func(struct udevice *dev, u32 session) +static int invoke_func_avb(struct udevice *dev, u32 session) { struct tee_param param = { .attr = TEE_PARAM_ATTR_TYPE_VALUE_OUTPUT }; struct tee_invoke_arg arg; @@ -47,6 +48,47 @@ static int invoke_func(struct udevice *dev, u32 session) return 0; } +static int invoke_func_rpc_test(struct udevice *dev, u32 session, + u64 op, u64 busnum, u64 chip_addr, + u8 *buf, size_t buf_size) +{ + struct tee_param param[2]; + struct tee_invoke_arg arg; + struct tee_shm *shm_buf; + int rc; + + memset(&arg, 0, sizeof(arg)); + arg.session = session; + arg.func = op; + + rc = tee_shm_alloc(dev, buf_size, + TEE_SHM_ALLOC, &shm_buf); + if (rc) + return rc; + + if (op == TA_RPC_TEST_CMD_I2C_WRITE) + memcpy(shm_buf->addr, buf, buf_size); + + memset(param, 0, sizeof(param)); + param[0].attr = TEE_PARAM_ATTR_TYPE_VALUE_INPUT; + param[0].u.value.a = busnum; + param[0].u.value.b = chip_addr; + param[1].attr = TEE_PARAM_ATTR_TYPE_MEMREF_INOUT; + param[1].u.memref.shm = shm_buf; + param[1].u.memref.size = buf_size; + + if (tee_invoke_func(dev, &arg, 2, param) || arg.ret) { + goto out; + rc = -1; + } + + if (op == TA_RPC_TEST_CMD_I2C_READ) + memcpy(buf, shm_buf->addr, buf_size); +out: + tee_shm_free(shm_buf); + return rc; +} + static int match(struct tee_version_data *vers, const void *data) { return vers->gen_caps & TEE_GEN_CAP_GP; @@ -62,6 +104,7 @@ static int test_tee(struct unit_test_state *uts, struct test_tee_vars *vars) struct tee_version_data vers; struct udevice *dev; struct sandbox_tee_state *state; + struct tee_optee_ta_uuid avb_uuid = TA_AVB_UUID; u32 session = 0; int rc; u8 data[128]; @@ -71,11 +114,11 @@ static int test_tee(struct unit_test_state *uts, struct test_tee_vars *vars) state = dev_get_priv(dev); ut_assert(!state->session); - rc = open_session(dev, &session); + rc = open_session(dev, &session, avb_uuid); ut_assert(!rc); ut_assert(session == state->session); - rc = invoke_func(dev, session); + rc = invoke_func_avb(dev, session); ut_assert(!rc); rc = tee_close_session(dev, session); @@ -103,11 +146,67 @@ static int test_tee(struct unit_test_state *uts, struct test_tee_vars *vars) return 0; } +#ifdef CONFIG_OPTEE_TA_RPC_TEST +#define BUF_SIZE 64 +static int test_tee_rpc(struct unit_test_state *uts) +{ + struct tee_version_data vers; + struct udevice *dev; + struct sandbox_tee_state *state; + struct tee_optee_ta_uuid rpc_test_uuid = TA_RPC_TEST_UUID; + u32 session = 0; + int rc; + + char *test_str = "Test string"; + u8 data[BUF_SIZE] = {0}; + u8 data_from_eeprom[BUF_SIZE] = {0}; + + /* Use sandbox I2C EEPROM emulation; bus: 0, chip: 0x2c */ + u64 bus = 0; + u64 chip = 0x2c; + + dev = tee_find_device(NULL, match, NULL, &vers); + ut_assert(dev); + state = dev_get_priv(dev); + ut_assert(!state->session); + + /* Test RPC call asking for I2C sevice */ + rc = open_session(dev, &session, rpc_test_uuid); + ut_assert(!rc); + ut_assert(session == state->session); + + /* Write buffer */ + strncpy((char *)data, test_str, strlen(test_str)); + rc = invoke_func_rpc_test(dev, session, TA_RPC_TEST_CMD_I2C_WRITE, + bus, chip, data, sizeof(data)); + ut_assert(!rc); + + /* Read buffer */ + rc = invoke_func_rpc_test(dev, session, TA_RPC_TEST_CMD_I2C_READ, + bus, chip, data_from_eeprom, + sizeof(data_from_eeprom)); + ut_assert(!rc); + + /* Compare */ + ut_assert(!memcmp(data, data_from_eeprom, BUF_SIZE)); + + rc = tee_close_session(dev, session); + ut_assert(!rc); + ut_assert(!state->session); + + return 0; +} +#endif /* CONFIG_OPTEE_TA_RPC_TEST */ + static int dm_test_tee(struct unit_test_state *uts) { struct test_tee_vars vars = { NULL, NULL }; int rc = test_tee(uts, &vars); +#ifdef CONFIG_OPTEE_TA_RPC_TEST + rc = test_tee_rpc(uts); +#endif /* CONFIG_OPTEE_TA_RPC_TEST */ + /* In case test_tee() asserts these may still remain allocated */ tee_shm_free(vars.reg_shm); tee_shm_free(vars.alloc_shm);