xlat lib v2: Expose *_ctx() APIs
authorSandrine Bailleux <sandrine.bailleux@arm.com>
Tue, 18 Jul 2017 12:26:36 +0000 (13:26 +0100)
committerSandrine Bailleux <sandrine.bailleux@arm.com>
Wed, 26 Jul 2017 08:20:05 +0000 (09:20 +0100)
In a previous patch, the xlat_ctx_t type has been made public.
This patch now makes the *_ctx() APIs public.

Each API now has a *_ctx() variant. Most of them were already implemented
and this patch just makes them public. However, some of them were missing
so this patch introduces them.

Now that all these APIs are public, there's no good reason for splitting
them accross 2 files (xlat_tables_internal.c and xlat_tables_common.c).
Therefore, this patch moves all code into xlat_tables_internal.c and
removes xlat_tables_common.c. It removes it from the library's makefile
as well.

This last change introduces a compatibility break for platform ports
that specifically include the xlat_tables_common.c file instead of
including the library's Makefile. The UniPhier platform makefile has
been updated to now omit this file from the list of source files.

The prototype of mmap_add_region_ctx() has been slightly changed. The
mmap_region_t passed in argument needs to be constant because it gets
called from map_add(), which receives a constant region. The former
implementation of mmap_add() used to cast the const qualifier away,
which is not a good practice.

Also remove init_xlation_table(), which was a sub-function of
init_xlat_tables(). Now there's just init_xlat_tables() (and
init_xlat_tables_ctx()). Both names were too similar, which was
confusing. Besides, now that all the code is in a single file,
it's no longer needed to have 2 functions for that.

Change-Id: I4ed88c68e44561c3902fbebb89cb197279c5293b
Signed-off-by: Sandrine Bailleux <sandrine.bailleux@arm.com>
include/lib/xlat_tables/xlat_tables_v2.h
lib/xlat_tables_v2/xlat_tables.mk
lib/xlat_tables_v2/xlat_tables_common.c [deleted file]
lib/xlat_tables_v2/xlat_tables_internal.c
lib/xlat_tables_v2/xlat_tables_private.h
plat/socionext/uniphier/platform.mk

index a5cdfee8d7fcdc2990cb5fba966510915c379171..288a8e0be196e04e50364af4ffc90a69c839789a 100644 (file)
@@ -121,7 +121,13 @@ typedef struct xlat_ctx xlat_ctx_t;
        _REGISTER_XLAT_CONTEXT(_ctx_name, _mmap_count, _xlat_tables_count,      \
                _virt_addr_space_size, _phy_addr_space_size)
 
-/* Generic translation table APIs */
+/******************************************************************************
+ * Generic translation table APIs.
+ * Each API comes in 2 variants:
+ * - one that acts on the current translation context for this BL image
+ * - another that acts on the given translation context instead. This variant
+ *   is named after the 1st version, with an additional '_ctx' suffix.
+ *****************************************************************************/
 
 /*
  * Initialize translation tables from the current list of mmap regions. Calling
@@ -129,6 +135,7 @@ typedef struct xlat_ctx xlat_ctx_t;
  * longer be added.
  */
 void init_xlat_tables(void);
+void init_xlat_tables_ctx(xlat_ctx_t *ctx);
 
 /*
  * Add a static region with defined base PA and base VA. This function can only
@@ -137,7 +144,18 @@ void init_xlat_tables(void);
  */
 void mmap_add_region(unsigned long long base_pa, uintptr_t base_va,
                                size_t size, mmap_attr_t attr);
+void mmap_add_region_ctx(xlat_ctx_t *ctx, const mmap_region_t *mm);
 
+/*
+ * Add an array of static regions with defined base PA and base VA. This
+ * function can only be used before initializing the translation tables. The
+ * regions cannot be removed afterwards.
+ */
+void mmap_add(const mmap_region_t *mm);
+void mmap_add_ctx(xlat_ctx_t *ctx, const mmap_region_t *mm);
+
+
+#if PLAT_XLAT_TABLES_DYNAMIC
 /*
  * Add a dynamic region with defined base PA and base VA. This type of region
  * can be added and removed even after the translation tables are initialized.
@@ -151,13 +169,7 @@ void mmap_add_region(unsigned long long base_pa, uintptr_t base_va,
  */
 int mmap_add_dynamic_region(unsigned long long base_pa, uintptr_t base_va,
                                size_t size, mmap_attr_t attr);
-
-/*
- * Add an array of static regions with defined base PA and base VA. This
- * function can only be used before initializing the translation tables. The
- * regions cannot be removed afterwards.
- */
-void mmap_add(const mmap_region_t *mm);
+int mmap_add_dynamic_region_ctx(xlat_ctx_t *ctx, mmap_region_t *mm);
 
 /*
  * Remove a region with the specified base VA and size. Only dynamic regions can
@@ -170,6 +182,11 @@ void mmap_add(const mmap_region_t *mm);
  *    EPERM: Trying to remove a static region.
  */
 int mmap_remove_dynamic_region(uintptr_t base_va, size_t size);
+int mmap_remove_dynamic_region_ctx(xlat_ctx_t *ctx,
+                               uintptr_t base_va,
+                               size_t size);
+
+#endif /* PLAT_XLAT_TABLES_DYNAMIC */
 
 #endif /*__ASSEMBLY__*/
 #endif /* __XLAT_TABLES_V2_H__ */
index 4f804341f5cab3d85cbe7833d6fcf0b13dc4aacf..b94ce5d07b65837cc7279a796ba9024cb1e00a3d 100644 (file)
@@ -6,5 +6,4 @@
 
 XLAT_TABLES_LIB_SRCS   :=      $(addprefix lib/xlat_tables_v2/,        \
                                ${ARCH}/xlat_tables_arch.c              \
-                               xlat_tables_common.c                    \
                                xlat_tables_internal.c)
diff --git a/lib/xlat_tables_v2/xlat_tables_common.c b/lib/xlat_tables_v2/xlat_tables_common.c
deleted file mode 100644 (file)
index f214e5c..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <arch.h>
-#include <arch_helpers.h>
-#include <assert.h>
-#include <common_def.h>
-#include <debug.h>
-#include <errno.h>
-#include <platform_def.h>
-#include <string.h>
-#include <types.h>
-#include <utils.h>
-#include <xlat_tables_arch.h>
-#include <xlat_tables_v2.h>
-
-#include "xlat_tables_private.h"
-
-/*
- * Each platform can define the size of its physical and virtual address spaces.
- * If the platform hasn't defined one or both of them, default to
- * ADDR_SPACE_SIZE. The latter is deprecated, though.
- */
-#if ERROR_DEPRECATED
-# ifdef ADDR_SPACE_SIZE
-#  error "ADDR_SPACE_SIZE is deprecated. Use PLAT_xxx_ADDR_SPACE_SIZE instead."
-# endif
-#elif defined(ADDR_SPACE_SIZE)
-# ifndef PLAT_PHY_ADDR_SPACE_SIZE
-#  define PLAT_PHY_ADDR_SPACE_SIZE     ADDR_SPACE_SIZE
-# endif
-# ifndef PLAT_VIRT_ADDR_SPACE_SIZE
-#  define PLAT_VIRT_ADDR_SPACE_SIZE    ADDR_SPACE_SIZE
-# endif
-#endif
-
-/*
- * Allocate and initialise the default translation context for the BL image
- * currently executing.
- */
-REGISTER_XLAT_CONTEXT(tf, MAX_MMAP_REGIONS, MAX_XLAT_TABLES,
-               PLAT_VIRT_ADDR_SPACE_SIZE, PLAT_PHY_ADDR_SPACE_SIZE);
-
-void mmap_add_region(unsigned long long base_pa, uintptr_t base_va,
-                       size_t size, mmap_attr_t attr)
-{
-       mmap_region_t mm = {
-               .base_va = base_va,
-               .base_pa = base_pa,
-               .size = size,
-               .attr = attr,
-       };
-       mmap_add_region_ctx(&tf_xlat_ctx, (mmap_region_t *)&mm);
-}
-
-void mmap_add(const mmap_region_t *mm)
-{
-       while (mm->size) {
-               mmap_add_region_ctx(&tf_xlat_ctx, (mmap_region_t *)mm);
-               mm++;
-       }
-}
-
-#if PLAT_XLAT_TABLES_DYNAMIC
-
-int mmap_add_dynamic_region(unsigned long long base_pa,
-                           uintptr_t base_va, size_t size, mmap_attr_t attr)
-{
-       mmap_region_t mm = {
-               .base_va = base_va,
-               .base_pa = base_pa,
-               .size = size,
-               .attr = attr,
-       };
-       return mmap_add_dynamic_region_ctx(&tf_xlat_ctx, &mm);
-}
-
-int mmap_remove_dynamic_region(uintptr_t base_va, size_t size)
-{
-       return mmap_remove_dynamic_region_ctx(&tf_xlat_ctx, base_va, size);
-}
-
-#endif /* PLAT_XLAT_TABLES_DYNAMIC */
-
-void init_xlat_tables(void)
-{
-       assert(!is_mmu_enabled());
-       assert(!tf_xlat_ctx.initialized);
-       print_mmap(tf_xlat_ctx.mmap);
-       tf_xlat_ctx.execute_never_mask =
-                       xlat_arch_get_xn_desc(xlat_arch_current_el());
-       init_xlation_table(&tf_xlat_ctx);
-       xlat_tables_print(&tf_xlat_ctx);
-
-       assert(tf_xlat_ctx.max_va <= tf_xlat_ctx.va_max_address);
-       assert(tf_xlat_ctx.max_pa <= tf_xlat_ctx.pa_max_address);
-
-       init_xlat_tables_arch(tf_xlat_ctx.max_pa);
-}
-
-#ifdef AARCH32
-
-void enable_mmu_secure(unsigned int flags)
-{
-       enable_mmu_arch(flags, tf_xlat_ctx.base_table);
-}
-
-#else
-
-void enable_mmu_el1(unsigned int flags)
-{
-       enable_mmu_arch(flags, tf_xlat_ctx.base_table);
-}
-
-void enable_mmu_el3(unsigned int flags)
-{
-       enable_mmu_arch(flags, tf_xlat_ctx.base_table);
-}
-
-#endif /* AARCH32 */
index a3a98d1970a9d14efa657ce74b0ded4eb8cad53f..82b3489c40d1a736ba5e94d8ba5cf12e7a8b1161 100644 (file)
@@ -7,7 +7,6 @@
 #include <arch.h>
 #include <arch_helpers.h>
 #include <assert.h>
-#include <cassert.h>
 #include <common_def.h>
 #include <debug.h>
 #include <errno.h>
 
 #include "xlat_tables_private.h"
 
+/*
+ * Each platform can define the size of its physical and virtual address spaces.
+ * If the platform hasn't defined one or both of them, default to
+ * ADDR_SPACE_SIZE. The latter is deprecated, though.
+ */
+#if ERROR_DEPRECATED
+# ifdef ADDR_SPACE_SIZE
+#  error "ADDR_SPACE_SIZE is deprecated. Use PLAT_xxx_ADDR_SPACE_SIZE instead."
+# endif
+#elif defined(ADDR_SPACE_SIZE)
+# ifndef PLAT_PHY_ADDR_SPACE_SIZE
+#  define PLAT_PHY_ADDR_SPACE_SIZE     ADDR_SPACE_SIZE
+# endif
+# ifndef PLAT_VIRT_ADDR_SPACE_SIZE
+#  define PLAT_VIRT_ADDR_SPACE_SIZE    ADDR_SPACE_SIZE
+# endif
+#endif
+
+/*
+ * Allocate and initialise the default translation context for the BL image
+ * currently executing.
+ */
+REGISTER_XLAT_CONTEXT(tf, MAX_MMAP_REGIONS, MAX_XLAT_TABLES,
+               PLAT_VIRT_ADDR_SPACE_SIZE, PLAT_PHY_ADDR_SPACE_SIZE);
+
 #if PLAT_XLAT_TABLES_DYNAMIC
 
 /*
@@ -664,7 +688,7 @@ static int mmap_add_region_check(xlat_ctx_t *ctx, unsigned long long base_pa,
        return 0;
 }
 
-void mmap_add_region_ctx(xlat_ctx_t *ctx, mmap_region_t *mm)
+void mmap_add_region_ctx(xlat_ctx_t *ctx, const mmap_region_t *mm)
 {
        mmap_region_t *mm_cursor = ctx->mmap;
        mmap_region_t *mm_last = mm_cursor + ctx->mmap_num;
@@ -741,6 +765,34 @@ void mmap_add_region_ctx(xlat_ctx_t *ctx, mmap_region_t *mm)
                ctx->max_va = end_va;
 }
 
+void mmap_add_region(unsigned long long base_pa,
+                               uintptr_t base_va,
+                               size_t size,
+                               mmap_attr_t attr)
+{
+       mmap_region_t mm = {
+               .base_va = base_va,
+               .base_pa = base_pa,
+               .size = size,
+               .attr = attr,
+       };
+       mmap_add_region_ctx(&tf_xlat_ctx, &mm);
+}
+
+
+void mmap_add_ctx(xlat_ctx_t *ctx, const mmap_region_t *mm)
+{
+       while (mm->size) {
+               mmap_add_region_ctx(ctx, mm);
+               mm++;
+       }
+}
+
+void mmap_add(const mmap_region_t *mm)
+{
+       mmap_add_ctx(&tf_xlat_ctx, mm);
+}
+
 #if PLAT_XLAT_TABLES_DYNAMIC
 
 int mmap_add_dynamic_region_ctx(xlat_ctx_t *ctx, mmap_region_t *mm)
@@ -837,6 +889,18 @@ int mmap_add_dynamic_region_ctx(xlat_ctx_t *ctx, mmap_region_t *mm)
        return 0;
 }
 
+int mmap_add_dynamic_region(unsigned long long base_pa,
+                           uintptr_t base_va, size_t size, mmap_attr_t attr)
+{
+       mmap_region_t mm = {
+               .base_va = base_va,
+               .base_pa = base_pa,
+               .size = size,
+               .attr = attr,
+       };
+       return mmap_add_dynamic_region_ctx(&tf_xlat_ctx, &mm);
+}
+
 /*
  * Removes the region with given base Virtual Address and size from the given
  * context.
@@ -912,6 +976,12 @@ int mmap_remove_dynamic_region_ctx(xlat_ctx_t *ctx, uintptr_t base_va,
        return 0;
 }
 
+int mmap_remove_dynamic_region(uintptr_t base_va, size_t size)
+{
+       return mmap_remove_dynamic_region_ctx(&tf_xlat_ctx,
+                                       base_va, size);
+}
+
 #endif /* PLAT_XLAT_TABLES_DYNAMIC */
 
 #if LOG_LEVEL >= LOG_LEVEL_VERBOSE
@@ -1069,10 +1139,18 @@ void xlat_tables_print(xlat_ctx_t *ctx)
 #endif /* LOG_LEVEL >= LOG_LEVEL_VERBOSE */
 }
 
-void init_xlation_table(xlat_ctx_t *ctx)
+void init_xlat_tables_ctx(xlat_ctx_t *ctx)
 {
        mmap_region_t *mm = ctx->mmap;
 
+       assert(!is_mmu_enabled());
+       assert(!ctx->initialized);
+
+       print_mmap(mm);
+
+       ctx->execute_never_mask =
+                       xlat_arch_get_xn_desc(xlat_arch_current_el());
+
        /* All tables must be zeroed before mapping any region. */
 
        for (unsigned int i = 0; i < ctx->base_table_entries; i++)
@@ -1101,4 +1179,37 @@ void init_xlation_table(xlat_ctx_t *ctx)
        }
 
        ctx->initialized = 1;
+
+       xlat_tables_print(ctx);
+
+       assert(ctx->max_va <= ctx->va_max_address);
+       assert(ctx->max_pa <= ctx->pa_max_address);
+
+       init_xlat_tables_arch(ctx->max_pa);
+}
+
+void init_xlat_tables(void)
+{
+       init_xlat_tables_ctx(&tf_xlat_ctx);
 }
+
+#ifdef AARCH32
+
+void enable_mmu_secure(unsigned int flags)
+{
+       enable_mmu_arch(flags, tf_xlat_ctx.base_table);
+}
+
+#else
+
+void enable_mmu_el1(unsigned int flags)
+{
+       enable_mmu_arch(flags, tf_xlat_ctx.base_table);
+}
+
+void enable_mmu_el3(unsigned int flags)
+{
+       enable_mmu_arch(flags, tf_xlat_ctx.base_table);
+}
+
+#endif /* AARCH32 */
index 45eaf55d2cf0cdb02b0dc19cc8fcdc708879e4e8..9ff1bdb3c5db808f7eaa28a7c1b10d9191b1152a 100644 (file)
@@ -47,13 +47,6 @@ void xlat_arch_tlbi_va(uintptr_t va);
  */
 void xlat_arch_tlbi_va_sync(void);
 
-/* Add a dynamic region to the specified context. */
-int mmap_add_dynamic_region_ctx(xlat_ctx_t *ctx, mmap_region_t *mm);
-
-/* Remove a dynamic region from the specified context. */
-int mmap_remove_dynamic_region_ctx(xlat_ctx_t *ctx, uintptr_t base_va,
-                       size_t size);
-
 #endif /* PLAT_XLAT_TABLES_DYNAMIC */
 
 /* Print VA, PA, size and attributes of all regions in the mmap array. */
@@ -65,15 +58,6 @@ void print_mmap(mmap_region_t *const mmap);
  */
 void xlat_tables_print(xlat_ctx_t *ctx);
 
-/*
- * Initialize the translation tables by mapping all regions added to the
- * specified context.
- */
-void init_xlation_table(xlat_ctx_t *ctx);
-
-/* Add a static region to the specified context. */
-void mmap_add_region_ctx(xlat_ctx_t *ctx, mmap_region_t *mm);
-
 /*
  * Architecture-specific initialization code.
  */
index 7ea0f1080a5ceb4821bc96614db51cd7511a4400..72792f8a927624e2f63c925650a60b20875c83e6 100644 (file)
@@ -38,7 +38,6 @@ IO_SOURCES            :=      drivers/io/io_block.c                   \
 # common sources for BL1, BL2, BL31
 PLAT_BL_COMMON_SOURCES +=      drivers/console/aarch64/console.S       \
                                lib/xlat_tables_v2/aarch64/xlat_tables_arch.c \
-                               lib/xlat_tables_v2/xlat_tables_common.c \
                                lib/xlat_tables_v2/xlat_tables_internal.c \
                                $(PLAT_PATH)/uniphier_console.S         \
                                $(PLAT_PATH)/uniphier_helpers.S         \