Add OP-TEE test swuit

Fix patman cc_file output
 Minor sandbox/pinctrl changes
 -----BEGIN PGP SIGNATURE-----
 
 iQFFBAABCgAvFiEEslwAIq+Gp8wWVbYnfxc6PpAIreYFAl3NiIMRHHNqZ0BjaHJv
 bWl1bS5vcmcACgkQfxc6PpAIreYC2gf8DE+un/xHxyRwxCdnWuDI4dhC0Reffp3z
 5cyYv10du8t5fAkqbNHVodx/nG+P339x3Dvz8+4wJaJXJH9tdm04q28uE/iG89T1
 yf6pHRmeyp8FoveeScMAtx7OFgyG2l93K/sqhEQQKvnNadMDXjJPcmixgU4igNha
 JaPb6n4Hd04tSHyDgfeYz6kXW5Bxlp37t0UwKHSLfYMk4CH0hsydRV4FDoGRFups
 HAhT43B8b2Ml1MfQG+jgcrLfwGCRr+a6PamzmR1KW/LxhiVLl+XU8hfCBXnO9CXy
 Em/aJasNA6Wl4GaXy46UjM6xeUL2irENU5NvW5F+gTJ31tuoj+Movg==
 =y/5J
 -----END PGP SIGNATURE-----

Merge tag 'dm-pull-14nov19' of git://git.denx.de/u-boot-dm

Add OP-TEE test swuit
Fix patman cc_file output
Minor sandbox/pinctrl changes
This commit is contained in:
Tom Rini 2019-11-17 21:15:23 -05:00
commit fd8adc33b8
23 changed files with 426 additions and 40 deletions

View File

@ -770,6 +770,7 @@ libs-$(CONFIG_API) += api/
libs-$(CONFIG_HAS_POST) += post/
libs-$(CONFIG_UNIT_TEST) += test/ test/dm/
libs-$(CONFIG_UT_ENV) += test/env/
libs-$(CONFIG_UT_OPTEE) += test/optee/
libs-$(CONFIG_UT_OVERLAY) += test/overlay/
libs-y += $(if $(BOARDDIR),board/$(BOARDDIR)/)

View File

@ -816,10 +816,10 @@ void *os_find_text_base(void)
char *end = memchr(line, '-', len);
if (end) {
unsigned long long addr;
uintptr_t addr;
*end = '\0';
if (sscanf(line, "%llx", &addr) == 1)
if (sscanf(line, "%zx", &addr) == 1)
base = (void *)addr;
}
}

View File

@ -17,6 +17,7 @@
#include <linux/libfdt.h>
#include <mapmem.h>
#include <asm/io.h>
#include <tee/optee.h>
#ifndef CONFIG_SYS_FDT_PAD
#define CONFIG_SYS_FDT_PAD 0x3000
@ -561,6 +562,13 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
}
}
fdt_ret = optee_copy_fdt_nodes(gd->fdt_blob, blob);
if (fdt_ret) {
printf("ERROR: transfer of optee nodes to new fdt failed: %s\n",
fdt_strerror(fdt_ret));
goto err;
}
/* Delete the old LMB reservation */
if (lmb)
lmb_free(lmb, (phys_addr_t)(u32)(uintptr_t)blob,

View File

@ -15,18 +15,6 @@
DECLARE_GLOBAL_DATA_PTR;
int pinctrl_decode_pin_config(const void *blob, int node)
{
int flags = 0;
if (fdtdec_get_bool(blob, node, "bias-pull-up"))
flags |= 1 << PIN_CONFIG_BIAS_PULL_UP;
else if (fdtdec_get_bool(blob, node, "bias-pull-down"))
flags |= 1 << PIN_CONFIG_BIAS_PULL_DOWN;
return flags;
}
#if CONFIG_IS_ENABLED(PINCTRL_FULL)
/**
* pinctrl_config_one() - apply pinctrl settings for a single node

View File

@ -369,19 +369,6 @@ int pinctrl_request_noflags(struct udevice *dev, int func);
*/
int pinctrl_get_periph_id(struct udevice *dev, struct udevice *periph);
/**
* pinctrl_decode_pin_config() - decode pin configuration flags
*
* This decodes some of the PIN_CONFIG values into flags, with each value
* being (1 << pin_cfg). This does not support things with values like the
* slew rate.
*
* @blob: Device tree blob
* @node: Node containing the PIN_CONFIG values
* @return decoded flag value, or -ve on error
*/
int pinctrl_decode_pin_config(const void *blob, int node);
/**
* pinctrl_get_gpio_mux() - get the mux value for a particular GPIO
*

View File

@ -1061,6 +1061,7 @@ static inline int fdtdec_set_phandle(void *blob, int node, uint32_t phandle)
* @param basename base name of the node to create
* @param carveout information about the carveout region
* @param phandlep return location for the phandle of the carveout region
* can be NULL if no phandle should be added
* @return 0 on success or a negative error code on failure
*/
int fdtdec_add_reserved_memory(void *blob, const char *basename,

View File

@ -67,4 +67,13 @@ static inline int optee_verify_bootm_image(unsigned long image_addr,
}
#endif
#if defined(CONFIG_OPTEE) && defined(CONFIG_OF_LIBFDT)
int optee_copy_fdt_nodes(const void *old_blob, void *new_blob);
#else
static inline int optee_copy_fdt_nodes(const void *old_blob, void *new_blob)
{
return 0;
}
#endif
#endif /* _OPTEE_H */

14
include/test/optee.h Normal file
View File

@ -0,0 +1,14 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* Copyright (C) 2019, Theobroma Systems Design und Consulting GmbH
*/
#ifndef __TEST_OPTEE_H__
#define __TEST_OPTEE_H__
#include <test/test.h>
/* Declare a new environment test */
#define OPTEE_TEST(_name, _flags) UNIT_TEST(_name, _flags, optee_test)
#endif /* __TEST_OPTEE_H__ */

View File

@ -28,6 +28,7 @@ int do_ut_compression(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]);
int do_ut_dm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
int do_ut_env(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
int do_ut_lib(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
int do_ut_optee(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
int do_ut_overlay(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
int do_ut_time(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
int do_ut_unicode(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);

View File

@ -1309,7 +1309,8 @@ int fdtdec_add_reserved_memory(void *blob, const char *basename,
}
if (addr == carveout->start && (addr + size) == carveout->end) {
*phandlep = fdt_get_phandle(blob, node);
if (phandlep)
*phandlep = fdt_get_phandle(blob, node);
return 0;
}
}
@ -1338,13 +1339,15 @@ int fdtdec_add_reserved_memory(void *blob, const char *basename,
if (node < 0)
return node;
err = fdt_generate_phandle(blob, &phandle);
if (err < 0)
return err;
if (phandlep) {
err = fdt_generate_phandle(blob, &phandle);
if (err < 0)
return err;
err = fdtdec_set_phandle(blob, node, phandle);
if (err < 0)
return err;
err = fdtdec_set_phandle(blob, node, phandle);
if (err < 0)
return err;
}
/* store one or two address cells */
if (na > 1)

View File

@ -5,6 +5,8 @@
*/
#include <common.h>
#include <malloc.h>
#include <linux/libfdt.h>
#include <tee/optee.h>
#define optee_hdr_err_msg \
@ -63,3 +65,141 @@ error:
return ret;
}
#if defined(CONFIG_OF_LIBFDT)
static int optee_copy_firmware_node(const void *old_blob, void *fdt_blob)
{
int old_offs, offs, ret, len;
const void *prop;
old_offs = fdt_path_offset(old_blob, "/firmware/optee");
if (old_offs < 0) {
debug("Original OP-TEE Device Tree node not found");
return old_offs;
}
offs = fdt_path_offset(fdt_blob, "/firmware");
if (offs < 0) {
offs = fdt_path_offset(fdt_blob, "/");
if (offs < 0)
return offs;
offs = fdt_add_subnode(fdt_blob, offs, "firmware");
if (offs < 0)
return offs;
}
offs = fdt_add_subnode(fdt_blob, offs, "optee");
if (offs < 0)
return ret;
/* copy the compatible property */
prop = fdt_getprop(old_blob, old_offs, "compatible", &len);
if (!prop) {
debug("missing OP-TEE compatible property");
return -EINVAL;
}
ret = fdt_setprop(fdt_blob, offs, "compatible", prop, len);
if (ret < 0)
return ret;
/* copy the method property */
prop = fdt_getprop(old_blob, old_offs, "method", &len);
if (!prop) {
debug("missing OP-TEE method property");
return -EINVAL;
}
ret = fdt_setprop(fdt_blob, offs, "method", prop, len);
if (ret < 0)
return ret;
return 0;
}
int optee_copy_fdt_nodes(const void *old_blob, void *new_blob)
{
int nodeoffset, subnode, ret;
struct fdt_resource res;
if (fdt_check_header(old_blob))
return -EINVAL;
if (fdt_check_header(new_blob))
return -EINVAL;
/* only proceed if there is an /firmware/optee node */
if (fdt_path_offset(old_blob, "/firmware/optee") < 0) {
debug("No OP-TEE firmware node in old fdt, nothing to do");
return 0;
}
/*
* Do not proceed if the target dt already has an OP-TEE node.
* In this case assume that the system knows better somehow,
* so do not interfere.
*/
if (fdt_path_offset(new_blob, "/firmware/optee") >= 0) {
debug("OP-TEE Device Tree node already exists in target");
return 0;
}
ret = optee_copy_firmware_node(old_blob, new_blob);
if (ret < 0) {
printf("Failed to add OP-TEE firmware node\n");
return ret;
}
/* optee inserts its memory regions as reserved-memory nodes */
nodeoffset = fdt_subnode_offset(old_blob, 0, "reserved-memory");
if (nodeoffset >= 0) {
subnode = fdt_first_subnode(old_blob, nodeoffset);
while (subnode >= 0) {
const char *name = fdt_get_name(old_blob,
subnode, NULL);
if (!name)
return -EINVAL;
/* only handle optee reservations */
if (strncmp(name, "optee", 5))
continue;
/* check if this subnode has a reg property */
ret = fdt_get_resource(old_blob, subnode, "reg", 0,
&res);
if (!ret) {
struct fdt_memory carveout = {
.start = res.start,
.end = res.end,
};
char *oldname, *nodename, *tmp;
oldname = strdup(name);
if (!oldname)
return -ENOMEM;
tmp = oldname;
nodename = strsep(&tmp, "@");
if (!nodename) {
free(oldname);
return -EINVAL;
}
ret = fdtdec_add_reserved_memory(new_blob,
nodename,
&carveout,
NULL);
free(oldname);
if (ret < 0)
return ret;
}
subnode = fdt_next_subnode(old_blob, subnode);
}
}
return 0;
}
#endif

View File

@ -33,4 +33,5 @@ config UT_UNICODE
source "test/dm/Kconfig"
source "test/env/Kconfig"
source "test/optee/Kconfig"
source "test/overlay/Kconfig"

View File

@ -43,6 +43,9 @@ static cmd_tbl_t cmd_ut_sub[] = {
#if defined(CONFIG_UT_ENV)
U_BOOT_CMD_MKENT(env, CONFIG_SYS_MAXARGS, 1, do_ut_env, "", ""),
#endif
#ifdef CONFIG_UT_OPTEE
U_BOOT_CMD_MKENT(optee, CONFIG_SYS_MAXARGS, 1, do_ut_optee, "", ""),
#endif
#ifdef CONFIG_UT_OVERLAY
U_BOOT_CMD_MKENT(overlay, CONFIG_SYS_MAXARGS, 1, do_ut_overlay, "", ""),
#endif
@ -114,6 +117,9 @@ static char ut_help_text[] =
#ifdef CONFIG_UT_LIB
"ut lib [test-name] - test library functions\n"
#endif
#ifdef CONFIG_UT_OPTEE
"ut optee [test-name]\n"
#endif
#ifdef CONFIG_UT_OVERLAY
"ut overlay [test-name]\n"
#endif

7
test/optee/Kconfig Normal file
View File

@ -0,0 +1,7 @@
config UT_OPTEE
bool "Enable OP-TEE Unit Tests"
depends on UNIT_TEST && OF_CONTROL && OPTEE
default y
help
This enables the 'ut optee' command which runs a series of unit
tests on the optee library code..

13
test/optee/Makefile Normal file
View File

@ -0,0 +1,13 @@
# SPDX-License-Identifier: GPL-2.0+
#
# Copyright (C) 2019, Theobroma Systems Design und Consulting GmbH
# Test files
obj-y += cmd_ut_optee.o
DTC_FLAGS += -@
# DT overlays
obj-y += test-optee-base.dtb.o
obj-y += test-optee-optee.dtb.o
obj-y += test-optee-no-optee.dtb.o

149
test/optee/cmd_ut_optee.c Normal file
View File

@ -0,0 +1,149 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2019, Theobroma Systems Design und Consulting GmbH
*/
#include <common.h>
#include <command.h>
#include <errno.h>
#include <fdt_support.h>
#include <malloc.h>
#include <tee/optee.h>
#include <linux/sizes.h>
#include <test/ut.h>
#include <test/optee.h>
#include <test/suites.h>
/* 4k ought to be enough for anybody */
#define FDT_COPY_SIZE (4 * SZ_1K)
extern u32 __dtb_test_optee_base_begin;
extern u32 __dtb_test_optee_optee_begin;
extern u32 __dtb_test_optee_no_optee_begin;
static void *fdt;
static bool expect_success;
static int optee_fdt_firmware(struct unit_test_state *uts)
{
const void *prop;
int offs, len;
offs = fdt_path_offset(fdt, "/firmware/optee");
ut_assert(expect_success ? offs >= 0 : offs < 0);
/* only continue if we have an optee node */
if (offs < 0)
return CMD_RET_SUCCESS;
prop = fdt_getprop(fdt, offs, "compatible", &len);
ut_assertok(strncmp((const char *)prop, "linaro,optee-tz", len));
prop = fdt_getprop(fdt, offs, "method", &len);
ut_assert(strncmp(prop, "hvc", 3) == 0 || strncmp(prop, "smc", 3) == 0);
return CMD_RET_SUCCESS;
}
OPTEE_TEST(optee_fdt_firmware, 0);
static int optee_fdt_protected_memory(struct unit_test_state *uts)
{
int offs, subnode;
bool found;
offs = fdt_path_offset(fdt, "/firmware/optee");
ut_assert(expect_success ? offs >= 0 : offs < 0);
/* only continue if we have an optee node */
if (offs < 0)
return CMD_RET_SUCCESS;
/* optee inserts its memory regions as reserved-memory nodes */
offs = fdt_subnode_offset(fdt, 0, "reserved-memory");
ut_assert(offs >= 0);
subnode = fdt_first_subnode(fdt, offs);
ut_assert(subnode);
found = 0;
while (subnode >= 0) {
const char *name = fdt_get_name(fdt, subnode, NULL);
struct fdt_resource res;
ut_assert(name);
/* only handle optee reservations */
if (strncmp(name, "optee", 5))
continue;
found = true;
/* check if this subnode has a reg property */
ut_assertok(fdt_get_resource(fdt, subnode, "reg", 0, &res));
subnode = fdt_next_subnode(fdt, subnode);
}
ut_assert(found);
return CMD_RET_SUCCESS;
}
OPTEE_TEST(optee_fdt_protected_memory, 0);
int do_ut_optee(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
struct unit_test *tests = ll_entry_start(struct unit_test,
optee_test);
const int n_ents = ll_entry_count(struct unit_test, optee_test);
struct unit_test_state *uts;
void *fdt_optee = &__dtb_test_optee_optee_begin;
void *fdt_no_optee = &__dtb_test_optee_no_optee_begin;
void *fdt_base = &__dtb_test_optee_base_begin;
int ret = -ENOMEM;
uts = calloc(1, sizeof(*uts));
if (!uts)
return -ENOMEM;
ut_assertok(fdt_check_header(fdt_base));
ut_assertok(fdt_check_header(fdt_optee));
ut_assertok(fdt_check_header(fdt_no_optee));
fdt = malloc(FDT_COPY_SIZE);
if (!fdt)
return ret;
/*
* Resize the FDT to 4k so that we have room to operate on
*
* (and relocate it since the memory might be mapped
* read-only)
*/
ut_assertok(fdt_open_into(fdt_base, fdt, FDT_COPY_SIZE));
/*
* (1) Try to copy optee nodes from empty dt.
* This should still run successfully.
*/
ut_assertok(optee_copy_fdt_nodes(fdt_no_optee, fdt));
expect_success = false;
ret = cmd_ut_category("optee", tests, n_ents, argc, argv);
/* (2) Try to copy optee nodes from prefilled dt */
ut_assertok(optee_copy_fdt_nodes(fdt_optee, fdt));
expect_success = true;
ret = cmd_ut_category("optee", tests, n_ents, argc, argv);
/* (3) Try to copy OP-TEE nodes into a already filled DT */
ut_assertok(fdt_open_into(fdt_optee, fdt, FDT_COPY_SIZE));
ut_assertok(optee_copy_fdt_nodes(fdt_optee, fdt));
expect_success = true;
ret = cmd_ut_category("optee", tests, n_ents, argc, argv);
free(fdt);
return ret;
}

View File

@ -0,0 +1,13 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2019, Theobroma Systems Design und Consulting GmbH
*/
/dts-v1/;
/ {
#address-cells = <2>;
#size-cells = <2>;
};

View File

@ -0,0 +1,13 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2019, Theobroma Systems Design und Consulting GmbH
*/
/dts-v1/;
/ {
#address-cells = <2>;
#size-cells = <2>;
};

View File

@ -0,0 +1,32 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2019, Theobroma Systems Design und Consulting GmbH
*/
/dts-v1/;
/ {
#address-cells = <2>;
#size-cells = <2>;
firmware {
optee {
compatible = "linaro,optee-tz";
method = "smc";
};
};
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
optee_shm@32000000 {
reg = <0x00 0x32000000 0x00 0x400000>;
};
optee_core@30000000 {
reg = <0x00 0x30000000 0x00 0x2000000>;
};
};
};

View File

@ -6,11 +6,11 @@
# Licensed to PSF under a Contributor Agreement.
# See http://www.python.org/2.4/license for licensing details.
"""Subprocress execution
"""Subprocess execution
This module holds a subclass of subprocess.Popen with our own required
features, mainly that we get access to the subprocess output while it
is running rather than just at the end. This makes it easiler to show
is running rather than just at the end. This makes it easier to show
progress information and filter output in real time.
"""

View File

@ -23,7 +23,7 @@ def LogCmd(commit_range, git_dir=None, oneline=False, reverse=False,
Args:
commit_range: Range expression to use for log, None for none
git_dir: Path to git repositiory (None to use default)
git_dir: Path to git repository (None to use default)
oneline: True to use --oneline, else False
reverse: True to reverse the log (--reverse)
count: Number of commits to list, or None for no limit
@ -166,7 +166,7 @@ def CountCommitsInRange(git_dir, range_expr):
git_dir: Directory containing git repo
range_expr: Range to check
Return:
Number of patches that exist in the supplied rangem or None if none
Number of patches that exist in the supplied range or None if none
were found
"""
pipe = [LogCmd(range_expr, git_dir=git_dir, oneline=True)]

View File

@ -251,7 +251,7 @@ class Series(dict):
cover_cc = [tools.FromUnicode(m) for m in cover_cc]
cc_list = '\0'.join([tools.ToUnicode(x)
for x in sorted(set(cover_cc + all_ccs))])
print(cover_fname, cc_list.encode('utf-8'), file=fd)
print(cover_fname, cc_list, file=fd)
fd.close()
return fname

View File

@ -128,7 +128,7 @@ class Color(object):
return ''
def Stop(self):
"""Retruns a stop color code.
"""Returns a stop color code.
Returns:
If color is enabled, returns an ANSI color reset sequence,