/*
 * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <assert.h>
#include <errno.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>

#include <common/debug.h>
#include <lib/utils_def.h>
#include <lib/xlat_tables/xlat_tables_defs.h>
#include <lib/xlat_tables/xlat_tables_v2.h>
#include "xlat_mpu_private.h"

#include <fvp_r_arch_helpers.h>
#include <platform_def.h>

#warning "xlat_mpu library is currently experimental and its API may change in future."


void xlat_mmap_print(__unused const mmap_region_t *mmap)
{
	/* Empty */
}

#if LOG_LEVEL < LOG_LEVEL_VERBOSE

void xlat_tables_print(__unused xlat_ctx_t *ctx)
{
	/* Empty */
}

#else /* if LOG_LEVEL >= LOG_LEVEL_VERBOSE */

static void xlat_tables_print_internal(__unused xlat_ctx_t *ctx)
{
	int region_to_use = 0;
	uintptr_t region_base;
	size_t region_size;
	uint64_t prenr_el2_value = 0U;

	/*
	 * Keep track of how many invalid descriptors are counted in a row.
	 * Whenever multiple invalid descriptors are found, only the first one
	 * is printed, and a line is added to inform about how many descriptors
	 * have been omitted.
	 */

	/*
	 * TODO:  Remove this WARN() and comment when these API calls are more
	 *        completely implemented and tested!
	 */
	WARN("%s in this early version of xlat_mpu library may not produce reliable results!",
	     __func__);

	/*
	 * Sequence through all regions and print those in-use (PRENR has an
	 * enable bit for each MPU region, 1 for in-use or 0 for unused):
	 */
	prenr_el2_value = read_prenr_el2();
	for (region_to_use = 0;  region_to_use < N_MPU_REGIONS;
	     region_to_use++) {
		if (((prenr_el2_value >> region_to_use) & 1U) == 0U) {
			continue;
		}
		region_base = read_prbar_el2() & PRBAR_PRLAR_ADDR_MASK;
		region_size = read_prlar_el2() & PRBAR_PRLAR_ADDR_MASK;
		printf("Address:  0x%llx, size:  0x%llx ",
			(long long) region_base,
			(long long) region_size);
	}
}

void xlat_tables_print(__unused xlat_ctx_t *ctx)
{
	xlat_tables_print_internal(ctx);
}

#endif /* LOG_LEVEL >= LOG_LEVEL_VERBOSE */
