*/
 
 #include <common.h>
+#include <errno.h>
 #include <stdio_dev.h>
 #include <linux/ctype.h>
 #include <linux/types.h>
        return 0;
 }
 
+int armv7_apply_memory_carveout(u64 *start, u64 *size)
+{
+#ifdef CONFIG_ARMV7_SECURE_RESERVE_SIZE
+       if (*start + *size < CONFIG_ARMV7_SECURE_BASE ||
+           *start >= (u64)CONFIG_ARMV7_SECURE_BASE +
+                     CONFIG_ARMV7_SECURE_RESERVE_SIZE)
+               return 0;
+
+       /* carveout must be at the beginning or the end of the bank */
+       if (*start == CONFIG_ARMV7_SECURE_BASE ||
+           *start + *size == (u64)CONFIG_ARMV7_SECURE_BASE +
+                             CONFIG_ARMV7_SECURE_RESERVE_SIZE) {
+               if (*size < CONFIG_ARMV7_SECURE_RESERVE_SIZE) {
+                       debug("Secure monitor larger than RAM bank!?\n");
+                       return -EINVAL;
+               }
+               *size -= CONFIG_ARMV7_SECURE_RESERVE_SIZE;
+               if (*start == CONFIG_ARMV7_SECURE_BASE)
+                       *start += CONFIG_ARMV7_SECURE_RESERVE_SIZE;
+               return 0;
+       }
+       debug("Secure monitor not located at beginning or end of RAM bank\n");
+       return -EINVAL;
+#else /* !CONFIG_ARMV7_SECURE_RESERVE_SIZE */
+       return 0;
+#endif
+}
+
 int psci_update_dt(void *fdt)
 {
 #ifdef CONFIG_ARMV7_NONSEC
 
 #ifdef CONFIG_ARMV7_NONSEC
 
 int armv7_init_nonsec(void);
+int armv7_apply_memory_carveout(u64 *start, u64 *size);
 bool armv7_boot_nonsec(void);
 
 /* defined in assembly file */
 
 
 #include <common.h>
 #include <fdt_support.h>
+#include <asm/armv7.h>
 #include <asm/psci.h>
 
 DECLARE_GLOBAL_DATA_PTR;
        for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
                start[bank] = bd->bi_dram[bank].start;
                size[bank] = bd->bi_dram[bank].size;
+#ifdef CONFIG_ARMV7_NONSEC
+               ret = armv7_apply_memory_carveout(&start[bank], &size[bank]);
+               if (ret)
+                       return ret;
+#endif
        }
 
        ret = fdt_fixup_memory_banks(blob, start, size, CONFIG_NR_DRAM_BANKS);