| /* | |
| * Copyright (C) 2016 The Android Open Source Project | |
| * Copyright NXP 2018 | |
| * | |
| * Permission is hereby granted, free of charge, to any person | |
| * obtaining a copy of this software and associated documentation | |
| * files (the "Software"), to deal in the Software without | |
| * restriction, including without limitation the rights to use, copy, | |
| * modify, merge, publish, distribute, sublicense, and/or sell copies | |
| * of the Software, and to permit persons to whom the Software is | |
| * furnished to do so, subject to the following conditions: | |
| * | |
| * The above copyright notice and this permission notice shall be | |
| * included in all copies or substantial portions of the Software. | |
| * | |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
| * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | |
| * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | |
| * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
| * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
| * SOFTWARE. | |
| */ | |
| #include <common.h> | |
| #include <trusty/avb.h> | |
| #include <trusty/hwcrypto.h> | |
| #include <trusty/keymaster.h> | |
| #include <trusty/rpmb.h> | |
| #include <trusty/trusty_dev.h> | |
| #include <trusty/trusty_ipc.h> | |
| #include <trusty/util.h> | |
| #define LOCAL_LOG 0 | |
| typedef uintptr_t vaddr_t; | |
| static struct trusty_ipc_dev *_ipc_dev; | |
| static struct trusty_dev _tdev; /* There should only be one trusty device */ | |
| static void *rpmb_ctx; | |
| #ifndef CONFIG_AVB_ATX | |
| bool rpmbkey_is_set(void); | |
| #endif | |
| void rpmb_storage_put_ctx(void *dev); | |
| void trusty_ipc_shutdown(void) | |
| { | |
| (void)rpmb_storage_proxy_shutdown(_ipc_dev); | |
| (void)rpmb_storage_put_ctx(rpmb_ctx); | |
| (void)avb_tipc_shutdown(_ipc_dev); | |
| (void)km_tipc_shutdown(_ipc_dev); | |
| #ifndef CONFIG_AVB_ATX | |
| (void)hwcrypto_tipc_shutdown(_ipc_dev); | |
| #endif | |
| /* shutdown Trusty IPC device */ | |
| (void)trusty_ipc_dev_shutdown(_ipc_dev); | |
| /* shutdown Trusty device */ | |
| (void)trusty_dev_shutdown(&_tdev); | |
| } | |
| int trusty_ipc_init(void) | |
| { | |
| int rc; | |
| /* init Trusty device */ | |
| trusty_info("Initializing Trusty device\n"); | |
| rc = trusty_dev_init(&_tdev, NULL); | |
| if (rc != 0) { | |
| trusty_error("Initializing Trusty device failed (%d)\n", rc); | |
| return rc; | |
| } | |
| /* create Trusty IPC device */ | |
| trusty_info("Initializing Trusty IPC device\n"); | |
| rc = trusty_ipc_dev_create(&_ipc_dev, &_tdev, PAGE_SIZE); | |
| if (rc != 0) { | |
| trusty_error("Initializing Trusty IPC device failed (%d)\n", rc); | |
| return rc; | |
| } | |
| /* get storage rpmb */ | |
| rpmb_ctx = rpmb_storage_get_ctx(); | |
| /* start secure storage proxy service */ | |
| trusty_info("Initializing RPMB storage proxy service\n"); | |
| rc = rpmb_storage_proxy_init(_ipc_dev, rpmb_ctx); | |
| if (rc != 0) { | |
| trusty_error("Initlializing RPMB storage proxy service failed (%d)\n", | |
| rc); | |
| #ifndef CONFIG_AVB_ATX | |
| /* check if rpmb key has been fused. */ | |
| if(rpmbkey_is_set()) { | |
| /* Go to hang if the key has been destroyed. */ | |
| trusty_error("RPMB key was destroyed!\n"); | |
| hang(); | |
| } | |
| #else | |
| return rc; | |
| #endif | |
| } else { | |
| /* secure storage service init ok, use trusty backed keystore */ | |
| env_set("keystore", "trusty"); | |
| trusty_info("Initializing Trusty AVB client\n"); | |
| rc = avb_tipc_init(_ipc_dev); | |
| if (rc != 0) { | |
| trusty_error("Initlializing Trusty AVB client failed (%d)\n", rc); | |
| return rc; | |
| } | |
| trusty_info("Initializing Trusty Keymaster client\n"); | |
| rc = km_tipc_init(_ipc_dev); | |
| if (rc != 0) { | |
| trusty_error("Initlializing Trusty Keymaster client failed (%d)\n", rc); | |
| return rc; | |
| } | |
| } | |
| #ifndef CONFIG_AVB_ATX | |
| trusty_info("Initializing Trusty Hardware Crypto client\n"); | |
| rc = hwcrypto_tipc_init(_ipc_dev); | |
| if (rc != 0) { | |
| trusty_error("Initlializing Trusty Keymaster client failed (%d)\n", rc); | |
| return rc; | |
| } | |
| #endif | |
| return TRUSTY_ERR_NONE; | |
| } |