1/*
2 * Copyright 2014, General Dynamics C4 Systems
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6
7#pragma once
8
9#include <machine.h>
10#include <plat/machine/hardware.h>
11#include <arch/types.h>
12#include <util.h>
13
14#ifndef __ASSEMBLER__
15
16int get_num_avail_p_regs(void);
17const p_region_t *get_avail_p_regs(void);
18int get_num_dev_p_regs(void);
19p_region_t get_dev_p_reg(word_t i);
20void map_kernel_devices(void);
21
22void initL2Cache(void);
23
24void initIRQController(void);
25void cpu_initLocalIRQController(void);
26void setIRQTrigger(irq_t irq, bool_t trigger);
27#ifdef ENABLE_SMP_SUPPORT
28void setIRQTarget(irq_t irq, seL4_Word target);
29#endif
30
31static inline void plat_cleanL2Range(paddr_t start, paddr_t end);
32static inline void plat_invalidateL2Range(paddr_t start, paddr_t end);
33static inline void plat_cleanInvalidateL2Range(paddr_t start, paddr_t end);
34static inline void plat_cleanInvalidateL2Cache(void);
35
36void cleanInvalidateCacheRange_RAM(word_t start, word_t end, paddr_t pstart);
37void cleanCacheRange_RAM(word_t start, word_t end, paddr_t pstart);
38void cleanCacheRange_PoU(word_t start, word_t end, paddr_t pstart);
39void invalidateCacheRange_RAM(word_t start, word_t end, paddr_t pstart);
40void invalidateCacheRange_I(word_t start, word_t end, paddr_t pstart);
41void branchFlushRange(word_t start, word_t end, paddr_t pstart);
42
43void clean_D_PoU(void);
44void cleanInvalidate_D_PoC(void);
45void cleanInvalidate_L1D(void);
46void cleanCaches_PoU(void);
47void cleanInvalidateL1Caches(void);
48
49/* Cleaning memory before user-level access */
50static inline void clearMemory(word_t *ptr, word_t bits)
51{
52    memzero(ptr, BIT(bits));
53    cleanCacheRange_PoU((word_t)ptr, (word_t)ptr + BIT(bits) - 1,
54                        addrFromPPtr(ptr));
55}
56
57static inline void clearMemoryRAM(word_t *ptr, word_t bits)
58{
59    memzero(ptr, BIT(bits));
60    cleanCacheRange_RAM((word_t)ptr, (word_t)ptr + BIT(bits) - 1,
61                        addrFromPPtr(ptr));
62}
63
64#ifdef ENABLE_SMP_SUPPORT
65static inline void arch_pause(void)
66{
67    /* TODO */
68}
69#endif /* ENABLE_SMP_SUPPORT */
70
71static inline void Arch_finaliseInterrupt(void)
72{
73}
74
75/* Update the value of the actual regsiter to hold the expected value */
76static inline exception_t Arch_setTLSRegister(word_t tls_base)
77{
78    /* This register is saved and restored on kernel exit and entry so
79     * we only update it in the saved context. */
80    setRegister(NODE_STATE(ksCurThread), TLS_BASE, tls_base);
81    return EXCEPTION_NONE;
82}
83
84#endif /* __ASSEMBLER__ */
85
86