1700ef31fSMarouene Boubakri /* SPDX-License-Identifier: BSD-2-Clause */
2700ef31fSMarouene Boubakri /*
3700ef31fSMarouene Boubakri * Copyright (c) 2016, Linaro Limited
4700ef31fSMarouene Boubakri */
5d50fee03SEtienne Carriere #ifndef __MM_PGT_CACHE_H
6d50fee03SEtienne Carriere #define __MM_PGT_CACHE_H
7700ef31fSMarouene Boubakri
8*f15052a2SEtienne Carriere #include <assert.h>
9*f15052a2SEtienne Carriere #include <kernel/tee_ta_manager.h>
10*f15052a2SEtienne Carriere #include <sys/queue.h>
11*f15052a2SEtienne Carriere #include <types_ext.h>
12*f15052a2SEtienne Carriere #include <util.h>
13*f15052a2SEtienne Carriere
14700ef31fSMarouene Boubakri #ifdef CFG_WITH_LPAE
15700ef31fSMarouene Boubakri #define PGT_SIZE (4 * 1024)
16700ef31fSMarouene Boubakri #define PGT_NUM_PGT_PER_PAGE 1
17700ef31fSMarouene Boubakri #else
18700ef31fSMarouene Boubakri #define PGT_SIZE (1 * 1024)
19700ef31fSMarouene Boubakri #define PGT_NUM_PGT_PER_PAGE 4
20700ef31fSMarouene Boubakri #endif
21700ef31fSMarouene Boubakri
22700ef31fSMarouene Boubakri struct ts_ctx;
23700ef31fSMarouene Boubakri
24700ef31fSMarouene Boubakri struct pgt {
25700ef31fSMarouene Boubakri void *tbl;
26700ef31fSMarouene Boubakri vaddr_t vabase;
27bfdeae23SJens Wiklander #if !defined(CFG_CORE_PREALLOC_EL0_TBLS)
28700ef31fSMarouene Boubakri struct ts_ctx *ctx;
29bfdeae23SJens Wiklander #endif
307aa2bec8SJens Wiklander bool populated;
317aa2bec8SJens Wiklander #if defined(CFG_PAGED_USER_TA)
327aa2bec8SJens Wiklander uint16_t num_used_entries;
33700ef31fSMarouene Boubakri #endif
34bfdeae23SJens Wiklander #if defined(CFG_CORE_PREALLOC_EL0_TBLS) || \
35bfdeae23SJens Wiklander (defined(CFG_WITH_PAGER) && !defined(CFG_WITH_LPAE))
36700ef31fSMarouene Boubakri struct pgt_parent *parent;
37700ef31fSMarouene Boubakri #endif
38700ef31fSMarouene Boubakri SLIST_ENTRY(pgt) link;
39700ef31fSMarouene Boubakri };
40700ef31fSMarouene Boubakri
41700ef31fSMarouene Boubakri SLIST_HEAD(pgt_cache, pgt);
4283ad3cdbSJens Wiklander struct user_mode_ctx;
43700ef31fSMarouene Boubakri
4483ad3cdbSJens Wiklander bool pgt_check_avail(struct user_mode_ctx *uctx);
45700ef31fSMarouene Boubakri
46d6e33310SJens Wiklander /*
47d6e33310SJens Wiklander * pgt_get_all() - makes all needed translation tables available
4883ad3cdbSJens Wiklander * @uctx: the context to own the tables
49d6e33310SJens Wiklander *
50d6e33310SJens Wiklander * Guaranteed to succeed, but may need to sleep for a while to get all the
51d6e33310SJens Wiklander * needed translation tables.
52d6e33310SJens Wiklander */
53bfdeae23SJens Wiklander #if defined(CFG_CORE_PREALLOC_EL0_TBLS)
pgt_get_all(struct user_mode_ctx * uctx __unused)5483ad3cdbSJens Wiklander static inline void pgt_get_all(struct user_mode_ctx *uctx __unused) { }
55bfdeae23SJens Wiklander #else
5683ad3cdbSJens Wiklander void pgt_get_all(struct user_mode_ctx *uctx);
57bfdeae23SJens Wiklander #endif
58d6e33310SJens Wiklander
59d6e33310SJens Wiklander /*
60d6e33310SJens Wiklander * pgt_put_all() - informs the translation table manager that these tables
61d6e33310SJens Wiklander * will not be needed for a while
6283ad3cdbSJens Wiklander * @uctx: the context owning the tables to make inactive
63d6e33310SJens Wiklander */
64bfdeae23SJens Wiklander #if defined(CFG_CORE_PREALLOC_EL0_TBLS)
pgt_put_all(struct user_mode_ctx * uctx __unused)6583ad3cdbSJens Wiklander static inline void pgt_put_all(struct user_mode_ctx *uctx __unused) { }
66bfdeae23SJens Wiklander #else
6783ad3cdbSJens Wiklander void pgt_put_all(struct user_mode_ctx *uctx);
68bfdeae23SJens Wiklander #endif
69700ef31fSMarouene Boubakri
7083ad3cdbSJens Wiklander void pgt_clear_range(struct user_mode_ctx *uctx, vaddr_t begin, vaddr_t end);
7183ad3cdbSJens Wiklander void pgt_flush_range(struct user_mode_ctx *uctx, vaddr_t begin, vaddr_t last);
727aa2bec8SJens Wiklander
73bfdeae23SJens Wiklander #if defined(CFG_CORE_PREALLOC_EL0_TBLS)
pgt_pop_from_cache_list(vaddr_t vabase __unused,struct ts_ctx * ctx __unused)74bfdeae23SJens Wiklander static inline struct pgt *pgt_pop_from_cache_list(vaddr_t vabase __unused,
75bfdeae23SJens Wiklander struct ts_ctx *ctx __unused)
76bfdeae23SJens Wiklander { return NULL; }
pgt_push_to_cache_list(struct pgt * pgt __unused)77bfdeae23SJens Wiklander static inline void pgt_push_to_cache_list(struct pgt *pgt __unused) { }
78bfdeae23SJens Wiklander #else
797aa2bec8SJens Wiklander struct pgt *pgt_pop_from_cache_list(vaddr_t vabase, struct ts_ctx *ctx);
807aa2bec8SJens Wiklander void pgt_push_to_cache_list(struct pgt *pgt);
81bfdeae23SJens Wiklander #endif
82700ef31fSMarouene Boubakri
83bfdeae23SJens Wiklander #if defined(CFG_CORE_PREALLOC_EL0_TBLS)
pgt_init(void)84bfdeae23SJens Wiklander static inline void pgt_init(void) { }
85bfdeae23SJens Wiklander #else
86700ef31fSMarouene Boubakri void pgt_init(void);
87bfdeae23SJens Wiklander #endif
88700ef31fSMarouene Boubakri
8983ad3cdbSJens Wiklander void pgt_flush(struct user_mode_ctx *uctx);
90700ef31fSMarouene Boubakri
917aa2bec8SJens Wiklander #if defined(CFG_PAGED_USER_TA)
pgt_inc_used_entries(struct pgt * pgt)92700ef31fSMarouene Boubakri static inline void pgt_inc_used_entries(struct pgt *pgt)
93700ef31fSMarouene Boubakri {
94700ef31fSMarouene Boubakri pgt->num_used_entries++;
95700ef31fSMarouene Boubakri assert(pgt->num_used_entries);
96700ef31fSMarouene Boubakri }
97700ef31fSMarouene Boubakri
pgt_dec_used_entries(struct pgt * pgt)98700ef31fSMarouene Boubakri static inline void pgt_dec_used_entries(struct pgt *pgt)
99700ef31fSMarouene Boubakri {
100700ef31fSMarouene Boubakri assert(pgt->num_used_entries);
101700ef31fSMarouene Boubakri pgt->num_used_entries--;
102700ef31fSMarouene Boubakri }
103700ef31fSMarouene Boubakri
pgt_set_used_entries(struct pgt * pgt,size_t val)104700ef31fSMarouene Boubakri static inline void pgt_set_used_entries(struct pgt *pgt, size_t val)
105700ef31fSMarouene Boubakri {
106700ef31fSMarouene Boubakri pgt->num_used_entries = val;
107700ef31fSMarouene Boubakri }
108700ef31fSMarouene Boubakri
109700ef31fSMarouene Boubakri #else
pgt_inc_used_entries(struct pgt * pgt __unused)110700ef31fSMarouene Boubakri static inline void pgt_inc_used_entries(struct pgt *pgt __unused)
111700ef31fSMarouene Boubakri {
112700ef31fSMarouene Boubakri }
113700ef31fSMarouene Boubakri
pgt_dec_used_entries(struct pgt * pgt __unused)114700ef31fSMarouene Boubakri static inline void pgt_dec_used_entries(struct pgt *pgt __unused)
115700ef31fSMarouene Boubakri {
116700ef31fSMarouene Boubakri }
117700ef31fSMarouene Boubakri
pgt_set_used_entries(struct pgt * pgt __unused,size_t val __unused)118700ef31fSMarouene Boubakri static inline void pgt_set_used_entries(struct pgt *pgt __unused,
119700ef31fSMarouene Boubakri size_t val __unused)
120700ef31fSMarouene Boubakri {
121700ef31fSMarouene Boubakri }
122700ef31fSMarouene Boubakri
123700ef31fSMarouene Boubakri #endif
124700ef31fSMarouene Boubakri
125d50fee03SEtienne Carriere #endif /*__MM_PGT_CACHE_H*/
126