| // SPDX-License-Identifier: GPL-2.0+ | |
| /* | |
| * (C) Copyright 2021, Foundries.IO | |
| * | |
| */ | |
| #include <scp03.h> | |
| #include <tee.h> | |
| #include <tee/optee_ta_scp03.h> | |
| #include <linux/errno.h> | |
| #include <linux/string.h> | |
| static int scp03_enable(bool provision) | |
| { | |
| const struct tee_optee_ta_uuid uuid = PTA_SCP03_UUID; | |
| struct tee_open_session_arg session; | |
| struct tee_invoke_arg invoke; | |
| struct tee_param param; | |
| struct udevice *tee = NULL; | |
| tee = tee_find_device(tee, NULL, NULL, NULL); | |
| if (!tee) | |
| return -ENODEV; | |
| memset(&session, 0, sizeof(session)); | |
| tee_optee_ta_uuid_to_octets(session.uuid, &uuid); | |
| if (tee_open_session(tee, &session, 0, NULL)) | |
| return -ENXIO; | |
| memset(¶m, 0, sizeof(param)); | |
| param.attr = TEE_PARAM_ATTR_TYPE_VALUE_INPUT; | |
| param.u.value.a = provision; | |
| memset(&invoke, 0, sizeof(invoke)); | |
| invoke.func = PTA_CMD_ENABLE_SCP03; | |
| invoke.session = session.session; | |
| if (tee_invoke_func(tee, &invoke, 1, ¶m)) | |
| return -EIO; | |
| tee_close_session(tee, session.session); | |
| return 0; | |
| } | |
| int tee_enable_scp03(void) | |
| { | |
| return scp03_enable(false); | |
| } | |
| int tee_provision_scp03(void) | |
| { | |
| return scp03_enable(true); | |
| } |