mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Merge pull request #13175 from Patater/remove-tfm-kvstore-adapter
psa: Remove not needed TF-M ITS KVStore adapterpull/13188/head
						commit
						846fbfb0fd
					
				| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
{
 | 
			
		||||
    "target_overrides": {
 | 
			
		||||
        "*": {
 | 
			
		||||
             "target.features_add": [
 | 
			
		||||
                 "EXPERIMENTAL_API"
 | 
			
		||||
             ]
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,157 +0,0 @@
 | 
			
		|||
/* Copyright (c) 2018 ARM Limited
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include "KVStore.h"
 | 
			
		||||
#include "TDBStore.h"
 | 
			
		||||
#include "psa/internal_trusted_storage.h"
 | 
			
		||||
#include "pits_impl.h"
 | 
			
		||||
#include "mbed_error.h"
 | 
			
		||||
#include "mbed_toolchain.h"
 | 
			
		||||
#include "FlashIAP.h"
 | 
			
		||||
#include "FlashIAPBlockDevice.h"
 | 
			
		||||
 | 
			
		||||
using namespace mbed;
 | 
			
		||||
 | 
			
		||||
static KVStore *internal_store = NULL;
 | 
			
		||||
static bool is_tfm_kv_initialized = false;
 | 
			
		||||
 | 
			
		||||
static inline uint32_t align_up(uint64_t val, uint64_t size)
 | 
			
		||||
{
 | 
			
		||||
    return (((val - 1) / size) + 1) * size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint32_t align_down(uint64_t val, uint64_t size)
 | 
			
		||||
{
 | 
			
		||||
    return (((val) / size)) * size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static BlockDevice *_get_blockdevice(bd_addr_t start_address, bd_size_t size)
 | 
			
		||||
{
 | 
			
		||||
    int ret = MBED_SUCCESS;
 | 
			
		||||
    bd_addr_t flash_end_address;
 | 
			
		||||
    bd_addr_t flash_start_address;
 | 
			
		||||
    bd_addr_t aligned_start_address;
 | 
			
		||||
    bd_addr_t aligned_end_address;
 | 
			
		||||
    bd_addr_t end_address;
 | 
			
		||||
    FlashIAP flash;
 | 
			
		||||
 | 
			
		||||
    ret = flash.init();
 | 
			
		||||
    if (ret != 0) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //Get flash parameters before starting
 | 
			
		||||
    flash_start_address = flash.get_flash_start();
 | 
			
		||||
    flash_end_address = flash_start_address + flash.get_flash_size();;
 | 
			
		||||
 | 
			
		||||
    aligned_start_address = align_down(start_address, flash.get_sector_size(start_address));
 | 
			
		||||
    if (start_address != aligned_start_address) {
 | 
			
		||||
        flash.deinit();
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    end_address = start_address + size;
 | 
			
		||||
    if (end_address > flash_end_address) {
 | 
			
		||||
        flash.deinit();
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    aligned_end_address = align_up(end_address, flash.get_sector_size(end_address - 1));
 | 
			
		||||
    if (end_address != aligned_end_address) {
 | 
			
		||||
        flash.deinit();
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static FlashIAPBlockDevice bd(start_address, size);
 | 
			
		||||
    flash.deinit();
 | 
			
		||||
    return &bd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int _calculate_blocksize_match_tdbstore(BlockDevice *bd)
 | 
			
		||||
{
 | 
			
		||||
    bd_size_t size = bd->size();
 | 
			
		||||
    bd_size_t erase_size = bd->get_erase_size();
 | 
			
		||||
    bd_size_t number_of_sector = size / erase_size;
 | 
			
		||||
 | 
			
		||||
    if (number_of_sector < 2) {
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int tfm_kv_init(void)
 | 
			
		||||
{
 | 
			
		||||
    int ret = MBED_SUCCESS;
 | 
			
		||||
    bd_size_t internal_size = MBED_CONF_STORAGE_TDB_INTERNAL_INTERNAL_SIZE;
 | 
			
		||||
    bd_addr_t internal_start_address = MBED_CONF_STORAGE_TDB_INTERNAL_INTERNAL_BASE_ADDRESS;
 | 
			
		||||
 | 
			
		||||
    //Get internal memory FLASHIAP block device.
 | 
			
		||||
    BlockDevice *internal_bd = _get_blockdevice(internal_start_address, internal_size);
 | 
			
		||||
    if (internal_bd == NULL) {
 | 
			
		||||
        return -1; // TODO: Error code
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = internal_bd->init();
 | 
			
		||||
    if (ret != 0) {
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //Check that internal flash has 2 or more sectors
 | 
			
		||||
    if (_calculate_blocksize_match_tdbstore(internal_bd) != 0) {
 | 
			
		||||
        return -1; // TODO: Error code
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //Deinitialize internal block device and TDB will reinitialize and take control on it.
 | 
			
		||||
    ret = internal_bd->deinit();
 | 
			
		||||
    if (ret != 0) {
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //Create a TDBStore in the internal FLASHIAP block device.
 | 
			
		||||
    static TDBStore tdb_internal(internal_bd);
 | 
			
		||||
    internal_store = &tdb_internal;
 | 
			
		||||
 | 
			
		||||
    ret = internal_store->init();
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * \brief Get default KVStore instance for internal flesh storage
 | 
			
		||||
 *
 | 
			
		||||
 * \return valid pointer to KVStore
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
KVStore *get_its_kvstore_instance(void)
 | 
			
		||||
{
 | 
			
		||||
    return internal_store;
 | 
			
		||||
}
 | 
			
		||||
extern "C" int kv_init_storage_config()
 | 
			
		||||
{
 | 
			
		||||
    int ret = MBED_SUCCESS;
 | 
			
		||||
 | 
			
		||||
    if (!is_tfm_kv_initialized) {
 | 
			
		||||
        ret = tfm_kv_init();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    is_tfm_kv_initialized = (ret == MBED_SUCCESS) ? true : false;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue