/*
 * Copyright (c) 2018 Alexander Wachter
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <soc.h>
#include <zephyr/drivers/hwinfo.h>
#include <string.h>
#include <hal/nrf_ficr.h>
#include <zephyr/sys/byteorder.h>
#ifndef CONFIG_BOARD_QEMU_CORTEX_M0
#include <helpers/nrfx_reset_reason.h>
#endif
#include <soc_secure.h>
struct nrf_uid {
	uint32_t id[2];
};

ssize_t z_impl_hwinfo_get_device_id(uint8_t *buffer, size_t length)
{
	struct nrf_uid dev_id;
	uint32_t deviceid[2];

	soc_secure_read_deviceid(deviceid);

	dev_id.id[0] = sys_cpu_to_be32(deviceid[1]);
	dev_id.id[1] = sys_cpu_to_be32(deviceid[0]);

	if (length > sizeof(dev_id.id)) {
		length = sizeof(dev_id.id);
	}

	memcpy(buffer, dev_id.id, length);

	return length;
}

#ifndef CONFIG_BOARD_QEMU_CORTEX_M0
int z_impl_hwinfo_get_reset_cause(uint32_t *cause)
{
	uint32_t flags = 0;

	uint32_t reason = nrfx_reset_reason_get();

	if (reason & NRFX_RESET_REASON_RESETPIN_MASK) {
		flags |= RESET_PIN;
	}
	if (reason & NRFX_RESET_REASON_DOG_MASK) {
		flags |= RESET_WATCHDOG;
	}
	if (reason & NRFX_RESET_REASON_LOCKUP_MASK) {
		flags |= RESET_CPU_LOCKUP;
	}
	if (reason & NRFX_RESET_REASON_OFF_MASK) {
		flags |= RESET_LOW_POWER_WAKE;
	}
	if (reason & NRFX_RESET_REASON_DIF_MASK) {
		flags |= RESET_DEBUG;
	}
	if (reason & NRFX_RESET_REASON_SREQ_MASK) {
		flags |= RESET_SOFTWARE;
	}

#if NRFX_RESET_REASON_HAS_CTRLAP
	if (reason & NRFX_RESET_REASON_CTRLAP_MASK) {
		flags |= RESET_DEBUG;
	}
#endif
#if NRFX_RESET_REASON_HAS_LPCOMP
	if (reason & NRFX_RESET_REASON_LPCOMP_MASK) {
		flags |= RESET_LOW_POWER_WAKE;
	}
#endif
#if NRFX_RESET_REASON_HAS_NFC
	if (reason & NRFX_RESET_REASON_NFC_MASK) {
		flags |= RESET_LOW_POWER_WAKE;
	}
#endif
#if NRFX_RESET_REASON_HAS_VBUS
	if (reason & NRFX_RESET_REASON_VBUS_MASK) {
		flags |= RESET_POR;
	}
#endif
#if NRFX_RESET_REASON_HAS_CTRLAPSOFT
	if (reason & NRFX_RESET_REASON_CTRLAPSOFT_MASK) {
		flags |= RESET_DEBUG;
	}
#endif
#if NRFX_RESET_REASON_HAS_CTRLAPHARD
	if (reason & NRFX_RESET_REASON_CTRLAPHARD_MASK) {
		flags |= RESET_DEBUG;
	}
#endif
#if NRFX_RESET_REASON_HAS_CTRLAPPIN
	if (reason & NRFX_RESET_REASON_CTRLAPPIN_MASK) {
		flags |= RESET_DEBUG;
	}
#endif
#if !NRF_POWER_HAS_RESETREAS
	if (reason & NRFX_RESET_REASON_DOG1_MASK) {
		flags |= RESET_WATCHDOG;
	}
#endif
#if NRFX_RESET_REASON_HAS_GRTC
	if (reason & NRFX_RESET_REASON_GRTC_MASK) {
		flags |= RESET_CLOCK;
	}
#endif
#if NRFX_RESET_REASON_HAS_NETWORK
	if (reason & NRFX_RESET_REASON_LSREQ_MASK) {
		flags |= RESET_SOFTWARE;
	}
	if (reason & NRFX_RESET_REASON_LLOCKUP_MASK) {
		flags |= RESET_CPU_LOCKUP;
	}
	if (reason & NRFX_RESET_REASON_LDOG_MASK) {
		flags |= RESET_WATCHDOG;
	}
	if (reason & NRFX_RESET_REASON_LCTRLAP_MASK) {
		flags |= RESET_DEBUG;
	}
#endif
#if defined(NRFX_RESET_REASON_TAMPC_MASK)
	if (reason & NRFX_RESET_REASON_TAMPC_MASK) {
		flags |= RESET_SECURITY;
	}
#endif
#if defined(NRFX_RESET_REASON_SECTAMPER_MASK)
	if (reason & NRFX_RESET_REASON_SECTAMPER_MASK) {
		flags |= RESET_SECURITY;
	}
#endif

	*cause = flags;

	return 0;
}

int z_impl_hwinfo_clear_reset_cause(void)
{
	uint32_t reason = -1;

	nrfx_reset_reason_clear(reason);

	return 0;
}

int z_impl_hwinfo_get_supported_reset_cause(uint32_t *supported)
{
	*supported = (RESET_PIN
		      | RESET_WATCHDOG
		      | RESET_SOFTWARE
		      | RESET_CPU_LOCKUP
		      | RESET_LOW_POWER_WAKE
		      | RESET_DEBUG);

	return 0;
}
#endif
