summaryrefslogtreecommitdiff
path: root/src/soc/intel/apollolake/car.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc/intel/apollolake/car.c')
-rw-r--r--src/soc/intel/apollolake/car.c25
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();
}