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>
This commit is contained in:
parent
7850b5836b
commit
6e0f0f7f9c
|
@ -274,6 +274,40 @@ void mmu_init(void)
|
||||||
TCR_TBI_USED);
|
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)
|
void mmu_enable(void)
|
||||||
{
|
{
|
||||||
if (((get_pte(_ttb) >> BLOCK_INDEX_SHIFT) & BLOCK_INDEX_MASK)
|
if (((get_pte(_ttb) >> BLOCK_INDEX_SHIFT) & BLOCK_INDEX_MASK)
|
||||||
|
|
|
@ -148,8 +148,17 @@
|
||||||
#define TCR_TBI_USED (0x0 << TCR_TBI_SHIFT)
|
#define TCR_TBI_USED (0x0 << TCR_TBI_SHIFT)
|
||||||
#define TCR_TBI_IGNORED (0x1 << TCR_TBI_SHIFT)
|
#define TCR_TBI_IGNORED (0x1 << TCR_TBI_SHIFT)
|
||||||
|
|
||||||
|
struct mmu_context {
|
||||||
|
uint64_t mair; /* MAIR attributes */
|
||||||
|
uint64_t tcr; /* TCR Attributes */
|
||||||
|
};
|
||||||
|
|
||||||
/* Initialize MMU registers and page table memory region. */
|
/* Initialize MMU registers and page table memory region. */
|
||||||
void mmu_init(void);
|
void mmu_init(void);
|
||||||
|
/* Desc : Save mmu context (registers and ttbr base/size). */
|
||||||
|
void mmu_save_context(struct mmu_context *mmu_context);
|
||||||
|
/* Desc : Restore mmu context using input backed-up context */
|
||||||
|
void mmu_restore_context(const struct mmu_context *mmu_context);
|
||||||
/* Change a memory type for a range of bytes at runtime. */
|
/* Change a memory type for a range of bytes at runtime. */
|
||||||
void mmu_config_range(void *start, size_t size, uint64_t tag);
|
void mmu_config_range(void *start, size_t size, uint64_t tag);
|
||||||
/* Enable the MMU (need previous mmu_init() and configured ranges!). */
|
/* Enable the MMU (need previous mmu_init() and configured ranges!). */
|
||||||
|
|
Loading…
Reference in New Issue