/*
 * app_initData.c
 */

#include <qsee_heap.h> // qsee_malloc
#include <qsee_oem_buffer.h> // qsee_write_oem_buffer

#include "app_main.h"
#include "app_core.h"

#include "tz_iccc_comdef.h"

uint32_t init_iccc_mem(size_t offset, uint8_t val, size_t size)
{
    int ret;
    int status = 0;
    char error_string[ERROR_STRING_LENGTH];
    void* data;

#if DEBUG_ICCC
    ICCC_LOG("TZ_ICCC: %s: offset:%#x, val:%#x, size:%lu", __func__, offset, val, size);
#endif

    data = qsee_malloc(size);
    if (data == NULL) {
        status = ICCC_FAILURE;
        goto exit;
    }

    memset((void*)data, val, size);

    ret = qsee_write_oem_buffer(offset, (void*)data, size);
    if (ret != QSEE_OEM_BUFFER_SUCCESS) {
        ICCC_LOG("TZ_ICCC: %s: qsee_write_oem_buffer failure:%d", __func__, ret);
        status = ICCC_FAILURE;
        goto free;
    }

    status = ICCC_SUCCESS;

free:
    if (data != NULL) {
        qsee_free(data);
    }

exit:
    if (status != ICCC_SUCCESS) {
        generate_iccc_error_string(error_string, ERROR_STRING_LENGTH, status);
        ICCC_LOG("TZ_ICCC: %s: error:%s(%d)", __func__, error_string, status);
    }

#if DEBUG_ICCC
    ICCC_LOG("TZ_ICCC: %s: ret:%d", __func__, status);
#endif

    return status;
}

uint32_t Iccc_Core_InitData_TA(uint8_t val)
{
    uint32_t ret = 0;

#if DEBUG_ICCC
    ICCC_LOG("TZ_ICCC: %s: value:%#x", __func__, val);
#endif

    if ((ret = init_iccc_mem(ICCC_BL_DATA_OFFSET, val, ICCC_BL_DATA_SIZE)))
        return ret;
    else if ((ret = init_iccc_mem(ICCC_TA_DATA_OFFSET, val, ICCC_TA_DATA_SIZE)))
        return ret;
    else if ((ret = init_iccc_mem(ICCC_KERN_DATA_OFFSET, val, ICCC_KERN_DATA_SIZE)))
        return ret;
    else if ((ret = init_iccc_mem(ICCC_SYS_DATA_OFFSET, val, ICCC_SYS_DATA_SIZE)))
        return ret;
    else if ((ret = init_iccc_mem(ICCC_ROT_DATA_OFFSET, val, ICCC_ROT_DATA_SIZE)))
        return ret;
    else if ((ret = init_iccc_mem(ICCC_LOCK_FLAG_OFFSET, 0x00, ICCC_LOCK_FLAG_SIZE)))
        return ret;

    ICCC_LOG("TZ_ICCC: %s: ret:%#x", __func__, ret);

    return ret;
}
