13acae62cSMarouene Boubakri /* SPDX-License-Identifier: BSD-2-Clause */
23acae62cSMarouene Boubakri /*
33acae62cSMarouene Boubakri * Copyright (c) 2016, Linaro Limited
43acae62cSMarouene Boubakri * Copyright (c) 2014, STMicroelectronics International N.V.
53acae62cSMarouene Boubakri */
6fbe66cf8SEtienne Carriere #ifndef __MM_CORE_MEMPROT_H
7fbe66cf8SEtienne Carriere #define __MM_CORE_MEMPROT_H
83acae62cSMarouene Boubakri
93acae62cSMarouene Boubakri #include <mm/core_mmu.h>
103acae62cSMarouene Boubakri #include <types_ext.h>
113acae62cSMarouene Boubakri
123acae62cSMarouene Boubakri /*
133acae62cSMarouene Boubakri * "pbuf_is" support.
143acae62cSMarouene Boubakri *
153acae62cSMarouene Boubakri * core_vbuf_is()/core_pbuf_is() can be used to check if a teecore mapped
163acae62cSMarouene Boubakri * virtual address or a physical address is "Secure", "Unsecure", "external
173acae62cSMarouene Boubakri * RAM" and some other fancy attributes.
183acae62cSMarouene Boubakri *
193acae62cSMarouene Boubakri * DO NOT use 'buf_is(Secure, buffer)==false' as a assumption that buffer is
203acae62cSMarouene Boubakri * UnSecured ! This is NOT a valid asumption ! A buffer is certified UnSecured
213acae62cSMarouene Boubakri * only if 'buf_is(UnSecure, buffer)==true'.
223acae62cSMarouene Boubakri */
233acae62cSMarouene Boubakri
243acae62cSMarouene Boubakri /* memory atttributes */
253acae62cSMarouene Boubakri enum buf_is_attr {
263acae62cSMarouene Boubakri CORE_MEM_CACHED,
273acae62cSMarouene Boubakri CORE_MEM_NSEC_SHM,
283acae62cSMarouene Boubakri CORE_MEM_NON_SEC,
293acae62cSMarouene Boubakri CORE_MEM_SEC,
303acae62cSMarouene Boubakri CORE_MEM_TEE_RAM,
313acae62cSMarouene Boubakri CORE_MEM_SDP_MEM,
323acae62cSMarouene Boubakri CORE_MEM_REG_SHM,
333acae62cSMarouene Boubakri };
343acae62cSMarouene Boubakri
353acae62cSMarouene Boubakri /* redirect legacy tee_vbuf_is() and tee_pbuf_is() to our routines */
363acae62cSMarouene Boubakri #define tee_pbuf_is core_pbuf_is
373acae62cSMarouene Boubakri #define tee_vbuf_is core_vbuf_is
383acae62cSMarouene Boubakri
393acae62cSMarouene Boubakri /* Convenience macros */
403acae62cSMarouene Boubakri #define tee_pbuf_is_non_sec(buf, len) \
413acae62cSMarouene Boubakri core_pbuf_is(CORE_MEM_NON_SEC, (paddr_t)(buf), (len))
423acae62cSMarouene Boubakri
433acae62cSMarouene Boubakri #define tee_pbuf_is_sec(buf, len) \
443acae62cSMarouene Boubakri core_pbuf_is(CORE_MEM_SEC, (paddr_t)(buf), (len))
453acae62cSMarouene Boubakri
463acae62cSMarouene Boubakri #define tee_vbuf_is_non_sec(buf, len) \
473acae62cSMarouene Boubakri core_vbuf_is(CORE_MEM_NON_SEC, (void *)(buf), (len))
483acae62cSMarouene Boubakri
493acae62cSMarouene Boubakri #define tee_vbuf_is_sec(buf, len) \
503acae62cSMarouene Boubakri core_vbuf_is(CORE_MEM_SEC, (void *)(buf), (len))
513acae62cSMarouene Boubakri
523acae62cSMarouene Boubakri /*
533acae62cSMarouene Boubakri * This function return true if the buf complies with supplied flags.
543acae62cSMarouene Boubakri * If this function returns false buf doesn't comply with supplied flags
553acae62cSMarouene Boubakri * or something went wrong.
563acae62cSMarouene Boubakri *
573acae62cSMarouene Boubakri * Note that returning false doesn't guarantee that buf complies with
583acae62cSMarouene Boubakri * the complement of the supplied flags.
593acae62cSMarouene Boubakri */
603acae62cSMarouene Boubakri bool core_pbuf_is(uint32_t flags, paddr_t pbuf, size_t len);
613acae62cSMarouene Boubakri
623acae62cSMarouene Boubakri /*
633acae62cSMarouene Boubakri * Translates the supplied virtual address to a physical address and uses
643acae62cSMarouene Boubakri * tee_phys_buf_is() to check the compliance of the buffer.
653acae62cSMarouene Boubakri */
663acae62cSMarouene Boubakri bool core_vbuf_is(uint32_t flags, const void *vbuf, size_t len);
673acae62cSMarouene Boubakri
683acae62cSMarouene Boubakri /*
69c2e4eb43SAnton Rybakov * Translate physical address to virtual address using specified mapping.
70c2e4eb43SAnton Rybakov * Also tries to find proper mapping which have counterpart translation
71c2e4eb43SAnton Rybakov * for specified length of data starting from given physical address.
72c2e4eb43SAnton Rybakov * Len parameter can be set to 1 if caller knows that requested (pa + len)
73c2e4eb43SAnton Rybakov * doesn`t cross mapping granule boundary.
743acae62cSMarouene Boubakri * Returns NULL on failure or a valid virtual address on success.
753acae62cSMarouene Boubakri */
76c2e4eb43SAnton Rybakov void *phys_to_virt(paddr_t pa, enum teecore_memtypes m, size_t len);
773acae62cSMarouene Boubakri
783acae62cSMarouene Boubakri /*
793acae62cSMarouene Boubakri * Translate physical address to virtual address trying MEM_AREA_IO_SEC
80c2e4eb43SAnton Rybakov * first then MEM_AREA_IO_NSEC if not found. Like phys_to_virt() tries
81c2e4eb43SAnton Rybakov * to find proper mapping relying on length parameter.
823acae62cSMarouene Boubakri * Returns NULL on failure or a valid virtual address on success.
833acae62cSMarouene Boubakri */
84c2e4eb43SAnton Rybakov void *phys_to_virt_io(paddr_t pa, size_t len);
853acae62cSMarouene Boubakri
863acae62cSMarouene Boubakri /*
873acae62cSMarouene Boubakri * Translate virtual address to physical address
883acae62cSMarouene Boubakri * Returns 0 on failure or a valid physical address on success.
893acae62cSMarouene Boubakri */
903acae62cSMarouene Boubakri paddr_t virt_to_phys(void *va);
913acae62cSMarouene Boubakri
vaddr_to_phys(vaddr_t va)92*041b1fa2SJens Wiklander static inline paddr_t vaddr_to_phys(vaddr_t va)
93*041b1fa2SJens Wiklander {
94*041b1fa2SJens Wiklander return virt_to_phys((void *)va);
95*041b1fa2SJens Wiklander }
96*041b1fa2SJens Wiklander
973acae62cSMarouene Boubakri /*
983acae62cSMarouene Boubakri * Return runtime usable address, irrespective of whether
99c2e4eb43SAnton Rybakov * the MMU is enabled or not. In case of MMU enabled also will be performed
100c2e4eb43SAnton Rybakov * check for requested amount of data is present in found mapping.
1013acae62cSMarouene Boubakri */
102c2e4eb43SAnton Rybakov vaddr_t core_mmu_get_va(paddr_t pa, enum teecore_memtypes type, size_t len);
1033acae62cSMarouene Boubakri
104ba4f5940SJens Wiklander /*
105ba4f5940SJens Wiklander * is_unpaged() - report unpaged status of an address
106ba4f5940SJens Wiklander * @va: virtual address
107ba4f5940SJens Wiklander *
108ba4f5940SJens Wiklander * Returns true if the @va is non-NULL and is in the unpaged area if paging
109ba4f5940SJens Wiklander * is enabled, else false.
110ba4f5940SJens Wiklander */
111ba4f5940SJens Wiklander #ifdef CFG_WITH_PAGER
112ba4f5940SJens Wiklander bool is_unpaged(const void *va);
113ba4f5940SJens Wiklander #else
is_unpaged(const void * va)114ba4f5940SJens Wiklander static inline bool is_unpaged(const void *va) { return va; }
115ba4f5940SJens Wiklander #endif
116ba4f5940SJens Wiklander
117ba4f5940SJens Wiklander /*
118ba4f5940SJens Wiklander * is_nexus() - report nexus status of an address
119ba4f5940SJens Wiklander * @va: virtual address
120ba4f5940SJens Wiklander *
121ba4f5940SJens Wiklander * Returns true if the @va is non-NULL and is in the nexus memory area
122ba4f5940SJens Wiklander * if ns-virtualization is enabled, else false.
123ba4f5940SJens Wiklander */
124ba4f5940SJens Wiklander #ifdef CFG_NS_VIRTUALIZATION
125ba4f5940SJens Wiklander bool is_nexus(const void *va);
126ba4f5940SJens Wiklander #else
is_nexus(const void * va)127ba4f5940SJens Wiklander static inline bool is_nexus(const void *va) { return va; }
128ba4f5940SJens Wiklander #endif
1293acae62cSMarouene Boubakri
1303acae62cSMarouene Boubakri struct io_pa_va {
1313acae62cSMarouene Boubakri paddr_t pa;
1323acae62cSMarouene Boubakri vaddr_t va;
1333acae62cSMarouene Boubakri };
1343acae62cSMarouene Boubakri
1353acae62cSMarouene Boubakri /*
1363acae62cSMarouene Boubakri * Helper function to return a physical or virtual address for a device,
1373acae62cSMarouene Boubakri * depending on whether the MMU is enabled or not
1383acae62cSMarouene Boubakri * io_pa_or_va() uses secure mapped IO memory if found or fallback to
1393acae62cSMarouene Boubakri * non-secure mapped IO memory.
1403acae62cSMarouene Boubakri */
141c2e4eb43SAnton Rybakov vaddr_t io_pa_or_va_secure(struct io_pa_va *p, size_t len);
142c2e4eb43SAnton Rybakov vaddr_t io_pa_or_va_nsec(struct io_pa_va *p, size_t len);
143c2e4eb43SAnton Rybakov vaddr_t io_pa_or_va(struct io_pa_va *p, size_t len);
1443acae62cSMarouene Boubakri
145fbe66cf8SEtienne Carriere #endif /* __MM_CORE_MEMPROT_H */
146