From 17c8bc378f2d840d182828da552f8269ec36d822 Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Thu, 3 Oct 2013 23:29:57 +0200 Subject: [PATCH] * grub-core/kern/arm/cache.c: Add v5 write-through cache support. --- ChangeLog | 4 ++++ grub-core/kern/arm/cache.c | 25 +++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7314426a6..0a3da2a46 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2013-10-03 Vladimir Serbinenko + + * grub-core/kern/arm/cache.c: Add v5 write-through cache support. + 2013-10-03 Vladimir Serbinenko * po/exclude.pot: Add several strings to exclude. diff --git a/grub-core/kern/arm/cache.c b/grub-core/kern/arm/cache.c index 88054f3fc..e9271049b 100644 --- a/grub-core/kern/arm/cache.c +++ b/grub-core/kern/arm/cache.c @@ -7,6 +7,7 @@ static enum { ARCH_UNKNOWN, + ARCH_ARMV5_WRITE_THROUGH, ARCH_ARMV6, ARCH_ARMV6_UNIFIED, ARCH_ARMV7 @@ -29,14 +30,30 @@ probe_caches (void) /* Read main ID Register */ asm volatile ("mrc p15, 0, %0, c0, c0, 0": "=r"(main_id)); - if (((main_id >> 16) & 0x7) != 0x7) - grub_fatal ("Unsupported ARM ID 0x%x", main_id); + switch ((main_id >> 16) & 0xf) + { + case 0x3: + case 0x4: + case 0x5: + case 0x6: + case 0x7: + case 0xf: + break; + default: + grub_fatal ("Unsupported ARM ID 0x%x", main_id); + } /* Read Cache Type Register */ asm volatile ("mrc p15, 0, %0, c0, c0, 1": "=r"(cache_type)); switch (cache_type >> 24) { + case 0x00: + case 0x01: + grub_arch_cache_dlinesz = 8 << ((cache_type >> 12) & 3); + grub_arch_cache_ilinesz = 8 << (cache_type & 3); + type = ARCH_ARMV5_WRITE_THROUGH; + break; case 0x04: case 0x0a: case 0x0c: @@ -79,6 +96,7 @@ grub_arch_sync_caches (void *address, grub_size_t len) grub_arch_sync_caches_armv7 (address, len); break; /* Nothing to do. */ + case ARCH_ARMV5_WRITE_THROUGH: case ARCH_ARMV6_UNIFIED: break; /* Pacify GCC. */ @@ -100,6 +118,9 @@ grub_arm_disable_caches_mmu (void) break; case ARCH_ARMV7: grub_arm_disable_caches_mmu_armv7 (); + break; + /* Nothing to do. */ + case ARCH_ARMV5_WRITE_THROUGH: break; /* Pacify GCC. */ case ARCH_UNKNOWN: