/*
 * Copyright (c) 2018 The Fuchsia Authors
 *
 * SPDX-License-Identifier:	BSD-3-Clause
 */

#include <asm/arch/secure_apb.h>
#include <asm/arch/timer.h>
#include <command.h>
#include <asm/arch/reboot.h>
#include <asm/arch/secure_apb.h>
#include <asm/io.h>
#include <common.h>
#include <dm/uclass.h>
#include <fs.h>
#include <version.h>
#include <wdt.h>
#include <zircon/zircon.h>
#include <zircon/boot_args.h>

#ifndef CONFIG_FACTORY_BOOT_KVS
#error "Factory_boot KVS has to be enabled for this board!!!"
#endif

#include <factory_boot_kvs.h>
#include <tee/ta_vx_helper.h>

// bitmask for determining whether the RNG_USR_DATA register is ready.
// // This mask should be applied to the RNG_USR_STS register.
// // 0: The RNG_USR_DATA register is not ready to be read from.
// // 1: The RNG_USR_DATA register is ready to be read from.
#define USR_RAND32_RDY 0x1

#define PDEV_VID_GOOGLE		3
#define PDEV_PID_LUIS    12

#define NVRAM_LENGTH		(8 * 1024)

// Size of the CMDLINE entropy string.
#define CMDLINE_ENTROPY_SIZE        1024

// Random bits to pass to zircon.
#define CMDLINE_ENTROPY_BITS        256

// Deadline for time waiting for the RNG_USR_STS register to be ready.
// This is a very generous value, given that after reading from
// the hw rng, we should expect it to be available after
// HW_RNG_RESEEDING_INTERVAL_MICROS.
#define ENTROPY_COLLECTION_DEADLINE_MICROS 100000

// HW RNG is reseeded every 40 microseconds.
#define HW_RNG_RESEEDING_INTERVAL_MICROS 40

#define ENTROPY_BITS_PER_CHAR 4

static const char zircon_entropy_arg[] = "kernel.entropy-mixin=";
static char entropy_cmdline[CMDLINE_ENTROPY_SIZE] = {0};

_Static_assert(CMDLINE_ENTROPY_BITS % 32 == 0, \
               "Requested entropy must be a multiple of 32");

_Static_assert((CMDLINE_ENTROPY_BITS/ENTROPY_BITS_PER_CHAR) \
               + sizeof(zircon_entropy_arg) < CMDLINE_ENTROPY_SIZE,
               "Requested entropy doesn't fit in cmdline.");

static const zbi_mem_range_t mem_config[] = {
	{
		.type = ZBI_MEM_RANGE_RAM,
		.length = 0x80000000, // 2 GB
	},
	{
		.type = ZBI_MEM_RANGE_PERIPHERAL,
		.paddr = 0xf5800000,
		.length = 0x0a800000,
	},
	/* secmon_reserved:linux,secmon */
	{
		.type = ZBI_MEM_RANGE_RESERVED,
		.paddr = 0x05000000,
		.length = 0x2400000,
	},
	/* logo_reserved:linux,meson-fb */
	{
		.type = ZBI_MEM_RANGE_RESERVED,
		.paddr = 0x76800000,
		.length = 0x800000,
	},
	/* linux,usable-memory */
        {
		.type = ZBI_MEM_RANGE_RESERVED,
		.paddr = 0x00000000,
		.length = 0x100000,
	},
};

static const dcfg_simple_t uart_driver = {
	.mmio_phys = 0xff803000,
	.irq = 225,
};

static const dcfg_arm_gicv2_driver_t gicv2_driver = {
	.mmio_phys = 0xffc00000,
	.gicd_offset = 0x1000,
	.gicc_offset = 0x2000,
	.gich_offset = 0x4000,
	.gicv_offset = 0x6000,
	.ipi_base = 0,
};

static const dcfg_arm_psci_driver_t psci_driver = {
	.use_hvc = false,
	.reboot_args = { 1, 0, 0 },
	.reboot_bootloader_args = { 4, 0, 0 },
	.reboot_recovery_args = { 2, 0, 0 },
};

static const dcfg_arm_generic_timer_driver_t timer_driver = {
	.irq_phys = 30,
};

static const dcfg_amlogic_rng_driver_t rng_driver = {
	.rng_data_phys = (uint64_t)P_RNG_USR_DATA,
	.rng_status_phys = (uint64_t)P_RNG_USR_STS,
	.rng_refresh_interval_usec = HW_RNG_RESEEDING_INTERVAL_MICROS,
};

#define WDT_CTRL 0xffd0f0d0
#define WDT_PET  0xffd0f0dc

#define WATCHDOG_TIMEOUT_SECONDS 5
#define SECONDS_TO_NANOSECONDS 1000000000LL

static dcfg_generic_32bit_watchdog_t watchdog_driver = {
	.pet_action = {
		.addr = WDT_PET,
		.clr_mask = 0xffffffff,
		.set_mask = 0x00000000,
	},
	.enable_action = {
		.addr = WDT_CTRL,
		.clr_mask = 0x00000000,
		.set_mask = 0x00040000,
	},
	.disable_action = {
		.addr = WDT_CTRL,
		.clr_mask = 0x00040000,
		.set_mask = 0x00000000,
	},
	.watchdog_period_nsec =
		WATCHDOG_TIMEOUT_SECONDS * SECONDS_TO_NANOSECONDS,
	.flags = KDRV_GENERIC_32BIT_WATCHDOG_FLAG_ENABLED,
};

/**
 * disable_watchdog_petting() - disable petting of watchdog
 *
 * The function disables the petting function of watchdog driver by
 * faking a pet_action.addr and setting the set_mask anc clr_mask
 * field to be 0.
 *
 * It is mainly used for testing watchdog after booting into zircon.
 * i.e., whether it triggers a reboot if zircon is not able to pet it in time
 */
void disable_watchdog_petting(void)
{
	watchdog_driver.pet_action.addr = watchdog_driver.enable_action.addr;
	watchdog_driver.pet_action.set_mask = 0; // no set
	watchdog_driver.pet_action.clr_mask = 0; // no clear
}

static const zbi_platform_id_t platform_id = {
	.vid = PDEV_VID_GOOGLE,
	.pid = PDEV_PID_LUIS,
	.board_name = "luis",
};

enum {
	PART_TPL,
	PART_FTS,
	PART_FACTORY,
	PART_ZIRCON_B,
	PART_ZIRCON_A,
	PART_ZIRCON_R,
	PART_FVM,
	PART_SYS_CONFIG,
	PART_MIGRATION,
	PART_COUNT,
};

static void* mandatory_memset(void* dst, int c, size_t n) {
	volatile unsigned char* out = dst;
	size_t i = 0;

	for (i = 0; i < n; ++i) {
	out[i] = (unsigned char)c;
	}
	return dst;
}

#define MAC_ADDR_KEY_1 "mac_addr1"
#define MAC_ADDR_KEY_2 "mac_addr2"
static int add_mac_addresses(zbi_header_t* zbi) {
	u64 fullmac[2];
	u8 mac_addr[6];
	int mac_num, i;

	FbKvsResult ret = FbKvsGetULong(MAC_ADDR_KEY_1, &fullmac[0]);
	if (ret != kFbKvsResultOk) {
		printf("%s: ERROR: FbKvsGetULong() failed to read MAC ADDR 1\n", __func__);
		return -1;
	}

	ret = FbKvsGetULong(MAC_ADDR_KEY_2, &fullmac[1]);
	if (ret != kFbKvsResultOk) {
		printf("%s: ERROR: FbKvsGetULong() failed to read MAC ADDR 2\n", __func__);
		return -1;
	}

	for (mac_num = 0; mac_num < ARRAY_SIZE(fullmac); mac_num++) {
		for (i = ARRAY_SIZE(mac_addr)-1; i >= 0; i--) {
			mac_addr[i] = (u8) (fullmac[mac_num] & 0xff);
			fullmac[mac_num] >>= 8;
		}
		zircon_append_boot_item(zbi, ZBI_TYPE_DRV_MAC_ADDRESS, mac_num,
				        mac_addr, sizeof(mac_addr));
	}

	return 0;
}

static void add_serial_number(zbi_header_t* zbi) {
	char* s;
	if (!(s = env_get("serial#")) || (*s == '\0')) {
		printf("%s: Failed to retrieve serial number.\n", __func__);
		return;
	}
	zircon_append_boot_item(zbi, ZBI_TYPE_SERIAL_NUMBER, 0, s, strlen(s));
}

static void add_board_info(zbi_header_t* zbi)
{
	zbi_board_info_t board_info = {};
	char* s;
	if (((s = env_get("hw_id")) != NULL) && (*s != '\0')) {
		uint32_t hw_id = simple_strtoul(s, NULL, 16);
		board_info.revision = hw_id;
	} else {
		printf("Failed to retrieve Board Revision\n");
	}

	zircon_append_boot_item(zbi, ZBI_TYPE_DRV_BOARD_INFO, 0, &board_info,
				sizeof(board_info));
}

// Define a cpu topology for the system that captures how all of the cores are
// connected and grouped. Since this is a GICv2 system we include the ID for the
// cores, especially since it is a tricky one with a gap between the little and
// big clusters.
static void add_cpu_topology(zbi_header_t* zbi)
{
	int index = 0;
	int logical_processor = 0;
	int big_cluster = 0, little_cluster = 0;

	zbi_topology_node_t nodes[8];

	little_cluster = index++;
	nodes[little_cluster] = (zbi_topology_node_t){
		.entity_type = ZBI_TOPOLOGY_ENTITY_CLUSTER,
		.parent_index = ZBI_TOPOLOGY_NO_PARENT,
		.entity = {
			.cluster = {
				.performance_class = 0, // low performance cluster
			}
		}
	};

	nodes[index++] = (zbi_topology_node_t){
		.entity_type = ZBI_TOPOLOGY_ENTITY_PROCESSOR,
		.parent_index = little_cluster,
		.entity = {
			.processor = {
				.logical_ids = {logical_processor++},
				.logical_id_count = 1,
				.flags = ZBI_TOPOLOGY_PROCESSOR_PRIMARY,
				.architecture = ZBI_TOPOLOGY_ARCH_ARM,
				.architecture_info = {
					.arm = {
						.cluster_1_id = 0,
						.cpu_id = 0,
						.gic_id = 0,
					}
				}
			}
		}
	};
	nodes[index++] = (zbi_topology_node_t){
		.entity_type = ZBI_TOPOLOGY_ENTITY_PROCESSOR,
		.parent_index = little_cluster,
		.entity = {
			.processor = {
				.logical_ids = {logical_processor++},
				.logical_id_count = 1,
				.flags = 0,
				.architecture = ZBI_TOPOLOGY_ARCH_ARM,
				.architecture_info = {
					.arm = {
						.cluster_1_id = 0,
						.cpu_id = 1,
						.gic_id = 1,
					}
				}
			}
		}
	};

	big_cluster = index++;
	nodes[big_cluster] = (zbi_topology_node_t){
		.entity_type = ZBI_TOPOLOGY_ENTITY_CLUSTER,
		.parent_index = ZBI_TOPOLOGY_NO_PARENT,
		.entity = {
			.cluster = {
				.performance_class = 1, // high performance cluster
			}
		}
	};

	nodes[index++] = (zbi_topology_node_t){
		.entity_type = ZBI_TOPOLOGY_ENTITY_PROCESSOR,
		.parent_index = big_cluster,
		.entity = {
			.processor = {
				.logical_ids = {logical_processor++},
				.logical_id_count = 1,
				.flags = 0,
				.architecture = ZBI_TOPOLOGY_ARCH_ARM,
				.architecture_info = {
					.arm = {
						.cluster_1_id = 1,
						.cpu_id = 0,
						.gic_id = 4,
					}
				}
			}
		}
	};
	nodes[index++] = (zbi_topology_node_t){
		.entity_type = ZBI_TOPOLOGY_ENTITY_PROCESSOR,
		.parent_index = big_cluster,
		.entity = {
			.processor = {
				.logical_ids = {logical_processor++},
				.logical_id_count = 1,
				.flags = 0,
				.architecture = ZBI_TOPOLOGY_ARCH_ARM,
				.architecture_info = {
					.arm = {
						.cluster_1_id = 1,
						.cpu_id = 1,
						.gic_id = 5,
					}
				}
			}
		}
	};
	nodes[index++] = (zbi_topology_node_t){
		.entity_type = ZBI_TOPOLOGY_ENTITY_PROCESSOR,
		.parent_index = big_cluster,
		.entity = {
			.processor = {
				.logical_ids = {logical_processor++},
				.logical_id_count = 1,
				.flags = 0,
				.architecture = ZBI_TOPOLOGY_ARCH_ARM,
				.architecture_info = {
					.arm = {
						.cluster_1_id = 1,
						.cpu_id = 2,
						.gic_id = 6,
					}
				}
			}
		}
	};
	nodes[index++] = (zbi_topology_node_t){
		.entity_type = ZBI_TOPOLOGY_ENTITY_PROCESSOR,
		.parent_index = big_cluster,
		.entity = {
			.processor = {
				.logical_ids = {logical_processor++},
				.logical_id_count = 1,
				.flags = 0,
				.architecture = ZBI_TOPOLOGY_ARCH_ARM,
				.architecture_info = {
					.arm = {
						.cluster_1_id = 1,
						.cpu_id = 3,
						.gic_id = 7,
					}
				}
			}
		}
	};

	zircon_append_boot_item(zbi, ZBI_TYPE_CPU_TOPOLOGY, sizeof(zbi_topology_node_t),
				&nodes, sizeof(zbi_topology_node_t) * index);
}

static void add_reboot_reason(zbi_header_t* zbi) {
	// See cmd/amlogic/cmd_reboot.c
	const uint32_t reboot_mode_val = ((readl(AO_SEC_SD_CFG15) >> 12) & 0xf);

	zbi_hw_reboot_reason_t reboot_reason;
	switch (reboot_mode_val) {
	case AMLOGIC_COLD_BOOT:
		reboot_reason = ZBI_HW_REBOOT_COLD;
		break;
	case AMLOGIC_NORMAL_BOOT:
	case AMLOGIC_FACTORY_RESET_REBOOT:
	case AMLOGIC_UPDATE_REBOOT:
	case AMLOGIC_FASTBOOT_REBOOT:
	case AMLOGIC_SUSPEND_REBOOT:
	case AMLOGIC_HIBERNATE_REBOOT:
	case AMLOGIC_BOOTLOADER_REBOOT:
	case AMLOGIC_SHUTDOWN_REBOOT:
	case AMLOGIC_RPMBP_REBOOT:
	case AMLOGIC_QUIESCENT_REBOOT:
	case AMLOGIC_CRASH_REBOOT:
	case AMLOGIC_KERNEL_PANIC:
	case AMLOGIC_RECOVERY_QUIESCENT_REBOOT:
		reboot_reason = ZBI_HW_REBOOT_WARM;
		break;
	case AMLOGIC_WATCHDOG_REBOOT:
		reboot_reason = ZBI_HW_REBOOT_WATCHDOG;
		break;
	default:
		reboot_reason = ZBI_HW_REBOOT_UNDEFINED;
		break;
	}

	zircon_append_boot_item(zbi, ZBI_TYPE_HW_REBOOT_REASON, 0,
				&reboot_reason, sizeof(reboot_reason));
}

#define WATCHDOG_DEV_NAME	"watchdog"
static void start_meson_watchdog(void) {
	struct udevice *wdt_dev;
	int ret = uclass_get_device_by_name(
		UCLASS_WDT, WATCHDOG_DEV_NAME, &wdt_dev);
	if (ret < 0) {
		printf("failed to get meson watchdog\n");
		return;
	}

	printf("starting meson watchdog\n");
	// Note: the watchdog uclass expects a timeout in milliseconds, but the
	// Amlogic code uses seconds instead.
	wdt_start(wdt_dev, WATCHDOG_TIMEOUT_SECONDS, 0);
	wdt_reset(wdt_dev);
}

// fills an 8 char buffer with the lowercase hex representation of the given
// value.
// WARNING this does not add a '\0' to the end of the buffer.
static inline void uint32_to_hex(uint32_t val, char buf[static 8]) {
	static const char hex[] = "0123456789abcdef";
	int i = 0;

	for (i = 7; i >= 0; i--) {
		buf[i] = hex[val & 0xF];
	val >>= 4;
	}
}

// Reads a value from the userspace hardware random number generator.
//
// This assumes that the drng has been previously seeded. Callers should
// poll P_RNG_USR_STS beforehand to make sure that a reseed occurred.
static inline uint32_t read_hw_rng(void) {
	return readl(P_RNG_USR_DATA);
}

// Gathers CMDLINE_ENTROPY_BITS bits of entropy from the hardware random
// number generator and appends it as a ZBI_TYPE_CMDLINE for zircon to seed
// its cprng.
//
// This function will sleep a maximum of HW_RNG_RESEEDING_INTERVAL_MICROS *
// (CMDLINE_ENTROPY_BITS / 32) + ENTROPY_COLLECTION_DEADLINE_MICROS.
// If the function can't gather enough entropy after after exceeding
// the deadline, it will return -1 and the cmdline zbi will not be added.
static int add_cmdline_entropy(zbi_header_t* zbi) {
	strcpy(entropy_cmdline, zircon_entropy_arg);
	char *entropy = entropy_cmdline + strlen(zircon_entropy_arg);
	uint32_t elapsed_time_us = 0;
	int i = 0;

	for (i = 0; i < CMDLINE_ENTROPY_BITS; i += 32) {
		// Reading a 1 in the RNG_USR_STS means that the
		// hw rng has been reseeded. Wait until we see a 1,
		// without exceeding the global deadline.
		while ((readl(P_RNG_USR_STS) & USR_RAND32_RDY) != 1) {
			udelay(1);
			elapsed_time_us++;
			if (elapsed_time_us
			    > ENTROPY_COLLECTION_DEADLINE_MICROS) {
				return -1;
			}
		}

		uint32_to_hex(read_hw_rng(), entropy);
		entropy += 8;

		// According to the docs, this should guarantee a reseed.
		udelay(HW_RNG_RESEEDING_INTERVAL_MICROS);
	}
	*entropy = '\0';

	zircon_append_boot_item(zbi, ZBI_TYPE_CMDLINE, 0, entropy_cmdline,
				sizeof(entropy_cmdline));

	mandatory_memset(entropy_cmdline, '\0', sizeof(entropy_cmdline));
	return 0;
}

int zircon_preboot(zbi_header_t *zbi)
{
	/*
	 * allocate crashlog save area before 0x5f800000-0x60000000
	 * reserved area
	 */
	zbi_nvram_t nvram;

	nvram.base = 0x5f800000 - NVRAM_LENGTH;
	nvram.length = NVRAM_LENGTH;
	zircon_append_boot_item(zbi, ZBI_TYPE_NVRAM, 0, &nvram, sizeof(nvram));

	/* add memory configuration */
	zircon_append_boot_item(zbi, ZBI_TYPE_MEM_CONFIG, 0, &mem_config,
				sizeof(mem_config));

	/* add kernel drivers */
	zircon_append_boot_item(zbi, ZBI_TYPE_KERNEL_DRIVER, KDRV_AMLOGIC_UART,
				&uart_driver, sizeof(uart_driver));
	zircon_append_boot_item(zbi, ZBI_TYPE_KERNEL_DRIVER, KDRV_ARM_GIC_V2,
				&gicv2_driver, sizeof(gicv2_driver));
	zircon_append_boot_item(zbi, ZBI_TYPE_KERNEL_DRIVER, KDRV_ARM_PSCI,
				&psci_driver, sizeof(psci_driver));
	zircon_append_boot_item(zbi, ZBI_TYPE_KERNEL_DRIVER,
				KDRV_ARM_GENERIC_TIMER,
				&timer_driver, sizeof(timer_driver));
	zircon_append_boot_item(zbi, ZBI_TYPE_KERNEL_DRIVER,
				KDRV_GENERIC_32BIT_WATCHDOG,
				&watchdog_driver, sizeof(watchdog_driver));
	zircon_append_boot_item(zbi, ZBI_TYPE_KERNEL_DRIVER, KDRV_AMLOGIC_RNG,
				&rng_driver, sizeof(rng_driver));

	char uboot_ver[] = "bootloader.name=" U_BOOT_VERSION_STRING;
	// Zircon's cmdline parameters cannot contain spaces so
	// convert spaces in autogenerated U-boot version string
	// to underscores.
	// See zircon/docs/kernel_cmdline.md
	int i;
	int len = strlen(uboot_ver);
	for (i = 0; i < len; i++) {
		if (uboot_ver[i] == ' ') {
			uboot_ver[i] = '_';
		}
	}

	zircon_append_boot_item(zbi, ZBI_TYPE_CMDLINE, 0, uboot_ver, len + 1);

	add_serial_number(zbi);

	/* Add board-specific information */
	add_board_info(zbi);

	/* add platform ID */
	zircon_append_boot_item(zbi, ZBI_TYPE_PLATFORM_ID, 0, &platform_id,
				sizeof(platform_id));

	add_cpu_topology(zbi);

	int ret = add_cmdline_entropy(zbi);
	if (ret < 0) {
		panic("ERROR: unable to gather enough entropy to pass via cmdline!\n");
	}

	ret = add_mac_addresses(zbi);
	if (ret < 0) {
		printf("ERROR: unable to read MAC addresses from the"
		       " factory_boot partition!\n");
	}

	// Only append extra cmdline args if unlocked
	bool unlocked;
	if (zircon_vboot_is_unlocked(&unlocked)) {
		fprintf(stderr, "Error: unable to get unlock status\n");
	} else if (unlocked) {
		if (zircon_append_cmdline(zbi)) {
			fprintf(stderr, "ERROR: unable to append boot_args.\n");
		}
	}

	add_reboot_reason(zbi);

	if (watchdog_driver.flags & KDRV_GENERIC_32BIT_WATCHDOG_FLAG_ENABLED) {
		start_meson_watchdog();
	}

	return 0;
}
