diff options
Diffstat (limited to 'c/src/lib/libbsp/powerpc/qoriq/startup/mmu.c')
-rw-r--r-- | c/src/lib/libbsp/powerpc/qoriq/startup/mmu.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/c/src/lib/libbsp/powerpc/qoriq/startup/mmu.c b/c/src/lib/libbsp/powerpc/qoriq/startup/mmu.c index 0e52f0ab32..e2a0188c80 100644 --- a/c/src/lib/libbsp/powerpc/qoriq/startup/mmu.c +++ b/c/src/lib/libbsp/powerpc/qoriq/startup/mmu.c @@ -7,10 +7,10 @@ */ /* - * Copyright (c) 2011 embedded brains GmbH. All rights reserved. + * Copyright (c) 2011-2015 embedded brains GmbH. All rights reserved. * * embedded brains GmbH - * Obere Lagerstr. 30 + * Dornierstr. 4 * 82178 Puchheim * Germany * <rtems@embedded-brains.de> @@ -40,6 +40,21 @@ static uint32_t TEXT power_of_two(uint32_t val) return power; } +static uint32_t TEXT max_power_of_two(uint32_t val) +{ + uint32_t test_power = QORIQ_MMU_MIN_POWER; + uint32_t power = test_power; + uint32_t max = 1U << test_power; + + do { + power = test_power; + max <<= QORIQ_MMU_POWER_STEP; + test_power += QORIQ_MMU_POWER_STEP; + } while (test_power <= QORIQ_MMU_MAX_POWER && max <= val); + + return power; +} + void TEXT qoriq_mmu_context_init(qoriq_mmu_context *self) { int *cur = (int *) self; @@ -150,7 +165,7 @@ static void TEXT align(qoriq_mmu_context *self, uint32_t alignment) static bool TEXT is_full(qoriq_mmu_context *self) { - return self->count >= QORIQ_MMU_ENTRY_COUNT; + return self->count >= QORIQ_TLB1_ENTRY_COUNT; } static void TEXT append(qoriq_mmu_context *self, const qoriq_mmu_entry *new_entry) @@ -208,9 +223,8 @@ static bool TEXT split(qoriq_mmu_context *self, qoriq_mmu_entry *cur) uint32_t end = cur->last + 1; uint32_t size = end - begin; uint32_t begin_power = power_of_two(begin); - uint32_t end_power = power_of_two(end); - uint32_t size_power = power_of_two(size); - uint32_t power = min(begin_power, min(end_power, size_power)); + uint32_t size_power = max_power_of_two(size); + uint32_t power = min(begin_power, size_power); uint32_t split_size = power < 32 ? (1U << power) : 0; uint32_t split_pos = begin + split_size; |