diff options
Diffstat (limited to 'src/soc')
-rw-r--r-- | src/soc/intel/apollolake/car.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/src/soc/intel/apollolake/car.c b/src/soc/intel/apollolake/car.c index ff4603ca48..68bcb31eb1 100644 --- a/src/soc/intel/apollolake/car.c +++ b/src/soc/intel/apollolake/car.c @@ -16,6 +16,7 @@ */ #include <arch/cpu.h> +#include <assert.h> #include <program_loading.h> #include <soc/cpu.h> @@ -31,11 +32,27 @@ static void flush_l1d_to_l2(void) wrmsr(MSR_POWER_MISC, msr); } +static inline int is_car_addr(uintptr_t addr) +{ + return ((addr >= CONFIG_DCACHE_RAM_BASE) && + (addr < (CONFIG_DCACHE_RAM_BASE + CONFIG_DCACHE_RAM_SIZE))); +} + void platform_segment_loaded(uintptr_t start, size_t size, int flags) { - /* TODO: filter on address to see if L1D flushing required. */ + /* Bail out if this is not the final segment. */ + if (!(flags & SEG_FINAL)) + return; + + char start_car_check = is_car_addr(start); + char end_car_check = is_car_addr(start + size - 1); + + /* Bail out if loaded program segment does not lie in CAR region. */ + if (!start_car_check && !end_car_check) + return; + + /* Loaded program segment should lie entirely within CAR region. */ + assert (start_car_check && end_car_check); - /* Flush L1D cache to L2 on final segment loaded */ - if (flags & SEG_FINAL) - flush_l1d_to_l2(); + flush_l1d_to_l2(); } |