/*
 * arch/arm/cpu/armv8/cpu_id.c
 *
 * Copyright (C) 2015 Amlogic, Inc. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/

#include <common.h>
#include <asm/cpu_id.h>
#include <asm/arch/secure_apb.h>
#include <asm/arch/io.h>

/**
 * TODO: This should be moved to a RO region of registers or SRAM that
 * provides static system information that's needed across all software
 *
 * Chip ID copy to avoid unnecessary message exchange.
 */
chip_id_t aml_chip_id = { 0, { 0 } };

cpu_id_t get_cpu_id(void)
{
	cpu_id_t cpu_id;
	unsigned int cpu_id_reg = readl(P_AO_SEC_SD_CFG8);

	memset(&cpu_id, 0, sizeof(cpu_id_t));
	cpu_id.family_id = (cpu_id_reg >> 24) & (0XFF);
	cpu_id.package_id = (cpu_id_reg >> 16) & (0XF0);
	cpu_id.chip_rev = (cpu_id_reg >> 8) & (0XFF);
	cpu_id.layout_ver = (cpu_id_reg) & (0XF);
	return cpu_id;
}

int get_chip_id(unsigned char *buff, unsigned int size)
{
	int rc = 0;

	if (buff == NULL || size < 16)
		return -1;

	if (aml_chip_id.version == 0) {
		/* Chip ID has not been fetched yet */
		rc = __get_chip_id(&aml_chip_id.chipid[0], 16);

		/* Mark version if chip ID is fetched successfully */
		if (rc == 0)
			aml_chip_id.version = 2;
	}

	memcpy(buff, &aml_chip_id.chipid[0], 16);
	return rc;
}
