/* cache.c - d-cache support for ARC CPUs */

/*
 * Copyright (c) 2016 Synopsys, Inc. All rights reserved.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief d-cache manipulation
 *
 * This module contains functions for manipulation of the d-cache.
 */

#include <kernel.h>
#include <arch/cpu.h>
#include <misc/util.h>
#include <toolchain.h>
#include <cache.h>
#include <linker/linker-defs.h>
#include <arch/arc/v2/aux_regs.h>
#include <kernel_internal.h>
#include <misc/__assert.h>
#include <init.h>
#include <stdbool.h>

#if defined(CONFIG_CACHE_FLUSHING)

#if (CONFIG_CACHE_LINE_SIZE == 0) && !defined(CONFIG_CACHE_LINE_SIZE_DETECT)
#error Cannot use this implementation with a cache line size of 0
#endif

#if defined(CONFIG_CACHE_LINE_SIZE_DETECT)
#define DCACHE_LINE_SIZE sys_cache_line_size
#else
#define DCACHE_LINE_SIZE CONFIG_CACHE_LINE_SIZE
#endif

#define DC_CTRL_DC_ENABLE            0x0  /* enable d-cache */
#define DC_CTRL_DC_DISABLE           0x1  /* disable d-cache */
#define DC_CTRL_INVALID_ONLY         0x0  /* invalid d-cache only */
#define DC_CTRL_INVALID_FLUSH        0x40 /* invalid and flush d-cache */
#define DC_CTRL_ENABLE_FLUSH_LOCKED  0x80 /* locked d-cache can be flushed */
#define DC_CTRL_DISABLE_FLUSH_LOCKED 0x0  /* locked d-cache cannot be flushed */
#define DC_CTRL_FLUSH_STATUS         0x100/* flush status */
#define DC_CTRL_DIRECT_ACCESS        0x0  /* direct access mode  */
#define DC_CTRL_INDIRECT_ACCESS      0x20 /* indirect access mode */
#define DC_CTRL_OP_SUCCEEDED         0x4  /* d-cache operation succeeded */


static bool dcache_available(void)
{
	unsigned long val = z_arc_v2_aux_reg_read(_ARC_V2_D_CACHE_BUILD);

	val &= 0xff; /* extract version */
	return (val == 0) ? false : true;
}

static void dcache_dc_ctrl(u32_t dcache_en_mask)
{
	if (dcache_available()) {
		z_arc_v2_aux_reg_write(_ARC_V2_DC_CTRL, dcache_en_mask);
	}
}

static void dcache_enable(void)
{
	dcache_dc_ctrl(DC_CTRL_DC_ENABLE);
}


/**
 *
 * @brief Flush multiple d-cache lines to memory
 *
 * No alignment is required for either <start_addr> or <size>, but since
 * dcache_flush_mlines() iterates on the d-cache lines, a cache line
 * alignment for both is optimal.
 *
 * The d-cache line size is specified either via the CONFIG_CACHE_LINE_SIZE
 * kconfig option or it is detected at runtime.
 *
 * @param start_addr the pointer to start the multi-line flush
 * @param size the number of bytes that are to be flushed
 *
 * @return N/A
 */
static void dcache_flush_mlines(u32_t start_addr, u32_t size)
{
	u32_t end_addr;
	unsigned int key;

	if (!dcache_available() || (size == 0)) {
		return;
	}

	end_addr = start_addr + size - 1;
	start_addr &= (u32_t)(~(DCACHE_LINE_SIZE - 1));

	key = irq_lock(); /* --enter critical section-- */

	do {
		z_arc_v2_aux_reg_write(_ARC_V2_DC_FLDL, start_addr);
		__asm__ volatile("nop_s");
		__asm__ volatile("nop_s");
		__asm__ volatile("nop_s");
		/* wait for flush completion */
		do {
			if ((z_arc_v2_aux_reg_read(_ARC_V2_DC_CTRL) &
			     DC_CTRL_FLUSH_STATUS) == 0) {
				break;
			}
		} while (1);
		start_addr += DCACHE_LINE_SIZE;
	} while (start_addr <= end_addr);

	irq_unlock(key); /* --exit critical section-- */

}


/**
 *
 * @brief Flush d-cache lines to main memory
 *
 * No alignment is required for either <virt> or <size>, but since
 * sys_cache_flush() iterates on the d-cache lines, a d-cache line alignment for
 * both is optimal.
 *
 * The d-cache line size is specified either via the CONFIG_CACHE_LINE_SIZE
 * kconfig option or it is detected at runtime.
 *
 * @param start_addr the pointer to start the multi-line flush
 * @param size the number of bytes that are to be flushed
 *
 * @return N/A
 */

void sys_cache_flush(vaddr_t start_addr, size_t size)
{
	dcache_flush_mlines((u32_t)start_addr, (u32_t)size);
}


#if defined(CONFIG_CACHE_LINE_SIZE_DETECT)
size_t sys_cache_line_size;
static void init_dcache_line_size(void)
{
	u32_t val;

	val = z_arc_v2_aux_reg_read(_ARC_V2_D_CACHE_BUILD);
	__ASSERT((val&0xff) != 0, "d-cache is not present");
	val = ((val>>16) & 0xf) + 1;
	val *= 16;
	sys_cache_line_size = (size_t) val;
}
#endif

static int init_dcache(struct device *unused)
{
	ARG_UNUSED(unused);

	dcache_enable();

#if defined(CONFIG_CACHE_LINE_SIZE_DETECT)
	init_dcache_line_size();
#endif

	return 0;
}

SYS_INIT(init_dcache, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT);

#endif /* CONFIG_CACHE_FLUSHING */

