/*
 * 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 "TzwMacro.h"
#include "TzwString.h"

#if defined(TZ_MODEL_BLOWFISH)
#include <driver/mem/phys.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/mman.h>
#endif

#if defined(TZ_MODEL_QCOM)
#include <qsee_core.h>
#endif

#define SIZE_4KB (4*1024)

const uintptr_t PHY_ADDR = (uintptr_t) 0x10206140;
/*extern const uint32_t PHY_ADDR;*/

TzwErrorCode_t tzwReadSerialNumber(TzwSerialNumber_t* apSerialNumber) {
    CHECK_FUNCTION_ARGUMENT_RETURN(apSerialNumber != NULL);

#if 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_D("apSerialNumber->uuid: %s", serials);*/
    apSerialNumber->size = regionSize;

#else
    apSerialNumber->uuid = qsee_read_serial_num();
    apSerialNumber->size = 4;
#endif

    /*logByteArrayHex((uint8_t*)apSerialNumber->serial,apSerialNumber->size , "Serial Number");*/

    return TEE_SUCCESS;
}
