/*
 * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved.
 *
 * Created in Samsung Ukraine R&D Center (SRK) under a contract between
 * LLC "Samsung Electronics Ukraine Company" (Kiev, Ukraine)
 * and "Samsung Electronics Co", Ltd (Seoul, Republic of Korea)
 */

/**
 * @file TzwSerialNumber.c
 * @brief Functionality to get public chip serial number, defined by each silicon provider.
 * @author Konstyantyn Volobuyev <k.volobuyev@samsung.com>
 * @date Created Jun 26, 2017
 */

#include "TzwSerialNumber.h"

#include "TzwMacros.h"
#include "TzwString.h"

#if defined(TZ_MODEL_BLOWFISH) /*TZ_MODEL_BLOWFISH*/
#include <driver/mem/phys.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/mman.h>

#elif defined(TZ_MODEL_QCOM) /*TZ_MODEL_QCOM*/
#include <qsee_core.h>

#elif defined(TZ_MODEL_Kinibi) /*TZ_MODEL_Kinibi*/
#endif

TzwErrorCode_t tzwReadSerialNumber(TzwSerialNumber_t* apSerialNumber) {
    CHECK_FUNCTION_ARGUMENT_RETURN(apSerialNumber != NULL);

#if defined(TZ_MODEL_BLOWFISH) /*TZ_MODEL_BLOWFISH*/
    const size_t regionSize = sizeof(TEE_UUID);
    char serials[48];
    TEE_UUID deviceId;
    TEE_GetPropertyAsUUID(TEE_PROPSET_TEE_IMPLEMENTATION, "gpd.tee.deviceID", &deviceId);
    tzwMemMove((uint8_t*)&apSerialNumber->uuid, (uint8_t*)&deviceId, regionSize);
    uuid_unparse(&apSerialNumber->uuid, serials);

    LOG_DEV("apSerialNumber->uuid: %s", serials);

    apSerialNumber->size = regionSize;

#elif defined(TZ_MODEL_QCOM) /*TZ_MODEL_QCOM*/
    apSerialNumber->uuid = qsee_read_serial_num();
    apSerialNumber->size = 4;
#elif defined(TZ_MODEL_Kinibi) /*TZ_MODEL_Kinibi*/

    //Get the System on Chip Universal Identifier
    mcSuid_t suid;
    tlApiResult_t ret = tlApiGetSuid(&suid);
    if(TLAPI_OK != ret){
        LOG_E("Fail to tlApiGetSuid, ret = 0x%08x", ret);
        apSerialNumber->size = 0;
        return ret;
    }

    tzwMemMove((uint8_t*)&apSerialNumber->uuid, (uint8_t*)&suid, sizeof(mcSuid_t));
    apSerialNumber->size = sizeof(mcSuid_t);
#endif

#ifdef __DEV_DEBUG__
    logByteArrayHex((uint8_t*)apSerialNumber->serial,apSerialNumber->size , "Serial Number");
#endif

    return TEE_SUCCESS;
}
