summaryrefslogtreecommitdiff
path: root/src/arch/arm64/armv8
diff options
context:
space:
mode:
authorT Michael Turney <mturney@codeaurora.org>2018-04-25 14:49:49 -0700
committerPatrick Georgi <pgeorgi@google.com>2018-04-30 06:25:15 +0000
commit6e0f0f7f9c91f41eb40f4ef6979937caee168bdf (patch)
treeead474907ea6f7b4bd0af1cf65d01803d4ec8d2a /src/arch/arm64/armv8
parent7850b5836bfe250f31cc32ca3cde70077fcbd887 (diff)
downloadcoreboot-6e0f0f7f9c91f41eb40f4ef6979937caee168bdf.tar.xz
arm64: Add mmu context save/restore APIs
New API required by sdm845 DDR init/training protocol TEST=build & run Change-Id: I8442442c0588dd6fb5e461b399e48a761f7bbf29 Signed-off-by: T Michael Turney <mturney@codeaurora.org> Reviewed-on: https://review.coreboot.org/25818 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Julius Werner <jwerner@chromium.org>
Diffstat (limited to 'src/arch/arm64/armv8')
-rw-r--r--src/arch/arm64/armv8/mmu.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/arch/arm64/armv8/mmu.c b/src/arch/arm64/armv8/mmu.c
index a24e7c6fdd..48f77ace83 100644
--- a/src/arch/arm64/armv8/mmu.c
+++ b/src/arch/arm64/armv8/mmu.c
@@ -274,6 +274,40 @@ void mmu_init(void)
TCR_TBI_USED);
}
+/* Func : mmu_save_context
+ * Desc : Save mmu context (registers and ttbr base).
+ */
+void mmu_save_context(struct mmu_context *mmu_context)
+{
+ assert(mmu_context);
+
+ /* Back-up MAIR_ATTRIBUTES */
+ mmu_context->mair = raw_read_mair_el3();
+
+ /* Back-up TCR value */
+ mmu_context->tcr = raw_read_tcr_el3();
+}
+
+/* Func : mmu_restore_context
+ * Desc : Restore mmu context using input backed-up context
+ */
+void mmu_restore_context(const struct mmu_context *mmu_context)
+{
+ assert(mmu_context);
+
+ /* Restore TTBR */
+ raw_write_ttbr0_el3((uintptr_t)_ttb);
+
+ /* Restore MAIR indices */
+ raw_write_mair_el3(mmu_context->mair);
+
+ /* Restore TCR flags */
+ raw_write_tcr_el3(mmu_context->tcr);
+
+ /* invalidate tlb since ttbr is updated. */
+ tlb_invalidate_all();
+}
+
void mmu_enable(void)
{
if (((get_pte(_ttb) >> BLOCK_INDEX_SHIFT) & BLOCK_INDEX_MASK)