blob: ab6da243cd84fe28e2895e5ac89b08df453bd30d [file] [log] [blame]
Sylvio Alvesbbd40b82023-01-02 09:15:18 -03001/*
2 * Copyright (c) 2022 Espressif Systems (Shanghai) Co., Ltd.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#include <zephyr/kernel.h>
8#include <soc.h>
9#include <zephyr/storage/flash_map.h>
10#include <esp_log.h>
Marek Matej47967462023-05-09 11:10:05 +020011#include <stdlib.h>
Sylvio Alvesbbd40b82023-01-02 09:15:18 -030012
13#include <esp32s3/rom/cache.h>
Marek Matej47967462023-05-09 11:10:05 +020014#include "esp32s3/dport_access.h"
15#include "soc/cache_memory.h"
Sylvio Alvesbbd40b82023-01-02 09:15:18 -030016#include <soc/dport_reg.h>
Marek Matej47967462023-05-09 11:10:05 +020017#include "soc/extmem_reg.h"
Sylvio Alvesbbd40b82023-01-02 09:15:18 -030018#include <bootloader_flash_priv.h>
19
20#ifdef CONFIG_BOOTLOADER_MCUBOOT
Marek Matej47967462023-05-09 11:10:05 +020021
22#define BOOT_LOG_INF(_fmt, ...) \
Almir Okatoe946a132023-08-13 11:15:16 -030023 ets_printf("[" CONFIG_SOC_SERIES "] [INF] " _fmt "\n\r", ##__VA_ARGS__)
Marek Matej47967462023-05-09 11:10:05 +020024
Sylvio Alvesbbd40b82023-01-02 09:15:18 -030025#define HDR_ATTR __attribute__((section(".entry_addr"))) __attribute__((used))
26
27extern uint32_t _image_irom_start, _image_irom_size, _image_irom_vaddr;
28extern uint32_t _image_drom_start, _image_drom_size, _image_drom_vaddr;
29
30void __start(void);
31
32static HDR_ATTR void (*_entry_point)(void) = &__start;
33
34static int map_rom_segments(void)
35{
36 int rc = 0;
37 size_t _partition_offset = FIXED_PARTITION_OFFSET(slot0_partition);
Marek Matej47967462023-05-09 11:10:05 +020038 uint32_t _app_irom_start = _partition_offset + (uint32_t)&_image_irom_start;
Sylvio Alvesbbd40b82023-01-02 09:15:18 -030039 uint32_t _app_irom_size = (uint32_t)&_image_irom_size;
40 uint32_t _app_irom_vaddr = (uint32_t)&_image_irom_vaddr;
41
Marek Matej47967462023-05-09 11:10:05 +020042 uint32_t _app_drom_start = _partition_offset + (uint32_t)&_image_drom_start;
Sylvio Alvesbbd40b82023-01-02 09:15:18 -030043 uint32_t _app_drom_size = (uint32_t)&_image_drom_size;
44 uint32_t _app_drom_vaddr = (uint32_t)&_image_drom_vaddr;
45
Marek Matej47967462023-05-09 11:10:05 +020046 uint32_t autoload = Cache_Suspend_DCache();
47
48 Cache_Invalidate_DCache_All();
49
Sylvio Alvesbbd40b82023-01-02 09:15:18 -030050 /* Clear the MMU entries that are already set up,
51 * so the new app only has the mappings it creates.
52 */
Marek Matej47967462023-05-09 11:10:05 +020053 for (size_t i = 0; i < FLASH_MMU_TABLE_SIZE; i++) {
54 FLASH_MMU_TABLE[i] = MMU_TABLE_INVALID_VAL;
Sylvio Alvesbbd40b82023-01-02 09:15:18 -030055 }
56
Marek Matej47967462023-05-09 11:10:05 +020057 uint32_t drom_page_count = bootloader_cache_pages_to_map(_app_drom_size, _app_drom_vaddr);
Sylvio Alvesbbd40b82023-01-02 09:15:18 -030058
Marek Matej47967462023-05-09 11:10:05 +020059 rc |= esp_rom_Cache_Dbus_MMU_Set(MMU_ACCESS_FLASH,
60 _app_drom_vaddr & MMU_FLASH_MASK,
61 _app_drom_start & MMU_FLASH_MASK,
62 64, drom_page_count, 0);
Sylvio Alvesbbd40b82023-01-02 09:15:18 -030063
Marek Matej47967462023-05-09 11:10:05 +020064 uint32_t irom_page_count = bootloader_cache_pages_to_map(_app_irom_size, _app_irom_vaddr);
Sylvio Alvesbbd40b82023-01-02 09:15:18 -030065
Marek Matej47967462023-05-09 11:10:05 +020066 rc |= esp_rom_Cache_Ibus_MMU_Set(MMU_ACCESS_FLASH,
67 _app_irom_vaddr & MMU_FLASH_MASK,
68 _app_irom_start & MMU_FLASH_MASK,
69 64, irom_page_count, 0);
Sylvio Alvesbbd40b82023-01-02 09:15:18 -030070
Marek Matej47967462023-05-09 11:10:05 +020071 REG_CLR_BIT(EXTMEM_DCACHE_CTRL1_REG, EXTMEM_DCACHE_SHUT_CORE0_BUS);
72 REG_CLR_BIT(EXTMEM_DCACHE_CTRL1_REG, EXTMEM_DCACHE_SHUT_CORE1_BUS);
73
74 Cache_Resume_DCache(autoload);
75
76 /* Show map segments continue using same log format as during MCUboot phase */
77 BOOT_LOG_INF("DROM segment: paddr=%08Xh, vaddr=%08Xh, size=%05Xh (%6d) map",
78 _app_drom_start, _app_drom_vaddr, _app_drom_size, _app_drom_size);
79 BOOT_LOG_INF("IROM segment: paddr=%08Xh, vaddr=%08Xh, size=%05Xh (%6d) map\r\n",
80 _app_irom_start, _app_irom_vaddr, _app_irom_size, _app_irom_size);
81 esp_rom_uart_tx_wait_idle(0);
82
Sylvio Alvesbbd40b82023-01-02 09:15:18 -030083 return rc;
84}
Marek Matej47967462023-05-09 11:10:05 +020085#endif /* CONFIG_BOOTLOADER_MCUBOOT */
Sylvio Alvesbbd40b82023-01-02 09:15:18 -030086
87void __start(void)
88{
89#ifdef CONFIG_BOOTLOADER_MCUBOOT
90 int err = map_rom_segments();
91
92 if (err != 0) {
93 ets_printf("Failed to setup XIP, aborting\n");
94 abort();
95 }
96#endif
97 __esp_platform_start();
98}