1 /*
2  * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #include <stddef.h>
7 
8 #include <bootloader_flash_priv.h>
9 #include <esp_log.h>
10 #include <esp_flash_encrypt.h>
11 #include "sdkconfig.h"
12 #include "soc/soc_caps.h"
13 #include "hal/efuse_ll.h"
14 #include "hal/efuse_hal.h"
15 
16 #if CONFIG_IDF_TARGET_ESP32
17 #   include "soc/spi_struct.h"
18 #   include "soc/spi_reg.h"
19     /* SPI flash controller */
20 #   define SPIFLASH SPI1
21 #else
22 #   include "soc/spi_mem_struct.h"
23 #   include "soc/spi_mem_reg.h"
24     /* SPI flash controller */
25 #   define SPIFLASH SPIMEM1
26 #endif
27 
28 // This dependency will be removed in the future.  IDF-5025
29 #include "esp_flash.h"
30 
31 #include "esp_rom_spiflash.h"
32 
33 #ifdef CONFIG_EFUSE_VIRTUAL_KEEP_IN_FLASH
34 #define ENCRYPTION_IS_VIRTUAL (!efuse_hal_flash_encryption_enabled())
35 #else
36 #define ENCRYPTION_IS_VIRTUAL 0
37 #endif
38 
39 #define BYTESHIFT(VAR, IDX)    (((VAR) >> ((IDX) * 8)) & 0xFF)
40 #define ISSI_ID                0x9D
41 #define MXIC_ID                0xC2
42 #define GD_Q_ID_HIGH           0xC8
43 #define GD_Q_ID_MID            0x40
44 #define GD_Q_ID_LOW            0x16
45 
46 #define ESP_BOOTLOADER_SPIFLASH_BP_MASK_ISSI    (BIT7 | BIT5 | BIT4 | BIT3 | BIT2)
47 #define ESP_BOOTLOADER_SPIFLASH_QE_GD_SR2        BIT1   // QE position when you write 8 bits(for SR2) at one time.
48 #define ESP_BOOTLOADER_SPIFLASH_QE_SR1_2BYTE     BIT9   // QE position when you write 16 bits at one time.
49 
50 static const char *TAG = "bootloader_flash";
51 
52 static spi_flash_mmap_handle_t map;
53 
bootloader_mmap_get_free_pages(void)54 uint32_t bootloader_mmap_get_free_pages(void)
55 {
56     return spi_flash_mmap_get_free_pages(SPI_FLASH_MMAP_DATA);
57 }
58 
bootloader_mmap(uint32_t src_addr,uint32_t size)59 const void *bootloader_mmap(uint32_t src_addr, uint32_t size)
60 {
61     if (map) {
62         ESP_EARLY_LOGE(TAG, "tried to bootloader_mmap twice");
63         return NULL; /* existing mapping in use... */
64     }
65     const void *result = NULL;
66     uint32_t src_page = src_addr & ~(SPI_FLASH_MMU_PAGE_SIZE - 1);
67     size += (src_addr - src_page);
68     esp_err_t err = spi_flash_mmap(src_page, size, SPI_FLASH_MMAP_DATA, &result, &map);
69     if (err != ESP_OK) {
70         ESP_EARLY_LOGE(TAG, "spi_flash_mmap failed: 0x%x", err);
71         return NULL;
72     }
73     return (void *)((intptr_t)result + (src_addr - src_page));
74 }
75 
bootloader_munmap(const void * mapping)76 void bootloader_munmap(const void *mapping)
77 {
78     if (mapping && map) {
79         spi_flash_munmap(map);
80     }
81     map = 0;
82 }
83 
bootloader_flash_read(size_t src,void * dest,size_t size,bool allow_decrypt)84 esp_err_t bootloader_flash_read(size_t src, void *dest, size_t size, bool allow_decrypt)
85 {
86     if (allow_decrypt && esp_flash_encryption_enabled()) {
87         return esp_flash_read_encrypted(NULL, src, dest, size);
88     } else {
89         return esp_flash_read(NULL, dest, src, size);
90     }
91 }
92 
bootloader_flash_write(size_t dest_addr,void * src,size_t size,bool write_encrypted)93 esp_err_t bootloader_flash_write(size_t dest_addr, void *src, size_t size, bool write_encrypted)
94 {
95     if (write_encrypted && !ENCRYPTION_IS_VIRTUAL) {
96         return esp_flash_write_encrypted(NULL, dest_addr, src, size);
97     } else {
98         return esp_flash_write(NULL, src, dest_addr, size);
99     }
100 }
101 
bootloader_flash_erase_sector(size_t sector)102 esp_err_t bootloader_flash_erase_sector(size_t sector)
103 {
104     // Will de-dependency IDF-5025
105     return esp_flash_erase_region(NULL, sector * SPI_FLASH_SEC_SIZE, SPI_FLASH_SEC_SIZE);
106 }
107 
bootloader_flash_erase_range(uint32_t start_addr,uint32_t size)108 esp_err_t bootloader_flash_erase_range(uint32_t start_addr, uint32_t size)
109 {
110     // Will de-dependency IDF-5025
111     return esp_flash_erase_region(NULL, start_addr, size);
112 }
113 
114 /* Bootloader version, uses ROM functions only */
115 #if CONFIG_IDF_TARGET_ESP32
116 #include "esp32/rom/cache.h"
117 #endif
118 #include "esp_rom_spiflash.h"
119 #include "esp_rom_sys.h"
120 #include "hal/mmu_hal.h"
121 #include "hal/mmu_ll.h"
122 #include "hal/cache_hal.h"
123 #if CONFIG_IDF_TARGET_ESP32S3
124 #include "esp32s3/rom/opi_flash.h"
125 #endif
126 
127 #if CONFIG_IDF_TARGET_ESP32
128 /* Use first 50 blocks in MMU for bootloader_mmap,
129    50th block for bootloader_flash_read
130 */
131 #define MMU_BLOCK0_VADDR  SOC_DROM_LOW
132 #define MMAP_MMU_SIZE     (0x320000)
133 #define MMU_BLOCK50_VADDR (MMU_BLOCK0_VADDR + MMAP_MMU_SIZE)
134 #define FLASH_READ_VADDR  MMU_BLOCK50_VADDR
135 
136 #else // !CONFIG_IDF_TARGET_ESP32
137 
138 /* Use first 63 blocks in MMU for bootloader_mmap,
139    63th block for bootloader_flash_read
140 */
141 #define MMU_BLOCK0_VADDR  SOC_DROM_LOW
142 #define MMAP_MMU_SIZE     (DRAM0_CACHE_ADDRESS_HIGH - DRAM0_CACHE_ADDRESS_LOW) // This mmu size means that the mmu size to be mapped
143 #define MMU_BLOCK63_VADDR (MMU_BLOCK0_VADDR + MMAP_MMU_SIZE - SPI_FLASH_MMU_PAGE_SIZE)
144 #define FLASH_READ_VADDR MMU_BLOCK63_VADDR
145 #endif
146 
147 #define MMU_FREE_PAGES    (MMAP_MMU_SIZE / CONFIG_MMU_PAGE_SIZE)
148 
149 static bool mapped;
150 
151 // Current bootloader mapping (ab)used for bootloader_read()
152 static uint32_t current_read_mapping = UINT32_MAX;
153 
esp_rom_flash_mmap_get_free_pages(void)154 uint32_t esp_rom_flash_mmap_get_free_pages(void)
155 {
156     /**
157      * Allow mapping up to 50 of the 51 available MMU blocks (last one used for reads)
158      * Since, bootloader_mmap function below assumes it to be 0x320000 (50 pages), we can safely do this.
159      */
160     return MMU_FREE_PAGES;
161 }
162 
esp_rom_flash_mmap(uint32_t src_paddr,uint32_t size)163 const void *esp_rom_flash_mmap(uint32_t src_paddr, uint32_t size)
164 {
165     if (mapped) {
166         ESP_EARLY_LOGE(TAG, "tried to bootloader_mmap twice");
167         return NULL; /* can't map twice */
168     }
169     if (size > MMAP_MMU_SIZE) {
170         ESP_EARLY_LOGE(TAG, "bootloader_mmap excess size %x", size);
171         return NULL;
172     }
173 
174     uint32_t src_paddr_aligned = src_paddr & MMU_FLASH_MASK;
175     //The addr is aligned, so we add the mask off length to the size, to make sure the corresponding buses are enabled.
176     uint32_t size_after_paddr_aligned = (src_paddr - src_paddr_aligned) + size;
177     /**
178      * @note 1
179      * Will add here a check to make sure the vaddr is on read-only and executable buses, since we use others for psram
180      * Now simply check if it's valid vaddr, didn't check if it's readable, writable or executable.
181      * TODO: IDF-4710
182      */
183     if (mmu_ll_check_valid_ext_vaddr_region(0, MMU_BLOCK0_VADDR, size_after_paddr_aligned, MMU_VADDR_DATA | MMU_VADDR_INSTRUCTION) == 0) {
184         ESP_EARLY_LOGE(TAG, "vaddr not valid");
185         return NULL;
186     }
187 
188     //-------------stop cache to do the MMU mapping--------------
189 #if CONFIG_IDF_TARGET_ESP32
190     Cache_Read_Disable(0);
191     Cache_Flush(0);
192 #else
193     cache_hal_disable(CACHE_TYPE_ALL);
194 #endif
195 
196     //---------------Do mapping------------------------
197     ESP_EARLY_LOGD(TAG, "rodata starts from paddr=0x%08x, size=0x%x, will be mapped to vaddr=0x%08x", src_paddr, size, MMU_BLOCK0_VADDR);
198 #if CONFIG_IDF_TARGET_ESP32
199     uint32_t count = GET_REQUIRED_MMU_PAGES(size, src_paddr);
200     int e = cache_flash_mmu_set(0, 0, MMU_BLOCK0_VADDR, src_paddr_aligned, 64, count);
201     ESP_EARLY_LOGV(TAG, "after mapping, starting from paddr=0x%08x and vaddr=0x%08x, 0x%x bytes are mapped", src_paddr_aligned, MMU_BLOCK0_VADDR, count * SPI_FLASH_MMU_PAGE_SIZE);
202     if (e != 0) {
203         ESP_EARLY_LOGE(TAG, "cache_flash_mmu_set failed: %d\n", e);
204         Cache_Read_Enable(0);
205         return NULL;
206     }
207 #else
208     /**
209      * This hal won't return error, it assumes the inputs are valid. The related check should be done in `bootloader_mmap()`.
210      * See above comments (note 1) about IDF-4710
211      */
212     uint32_t actual_mapped_len = 0;
213     mmu_hal_map_region(0, MMU_TARGET_FLASH0, MMU_BLOCK0_VADDR, src_paddr_aligned, size_after_paddr_aligned, &actual_mapped_len);
214     ESP_EARLY_LOGV(TAG, "after mapping, starting from paddr=0x%08x and vaddr=0x%08x, 0x%x bytes are mapped", src_paddr_aligned, MMU_BLOCK0_VADDR, actual_mapped_len);
215 #endif
216 
217     /**
218      * If after mapping, your code stucks, it possibly means that some of the buses are not enabled, check `cache_ll_l1_enable_bus()`
219      * For now, keep this unchanged.
220      */
221 
222     //-------------enable cache--------------
223 #if CONFIG_IDF_TARGET_ESP32
224     Cache_Read_Enable(0);
225 #else
226     cache_hal_enable(CACHE_TYPE_ALL);
227 #endif
228 
229     mapped = true;
230 
231     return (void *)(MMU_BLOCK0_VADDR + (src_paddr - src_paddr_aligned));
232 }
233 
esp_rom_flash_unmmap(const void * mapping)234 void esp_rom_flash_unmmap(const void *mapping)
235 {
236     if (mapped)  {
237 #if CONFIG_IDF_TARGET_ESP32
238         /* Full MMU reset */
239         Cache_Read_Disable(0);
240         Cache_Flush(0);
241         mmu_init(0);
242 #else
243         cache_hal_disable(CACHE_TYPE_ALL);
244         mmu_hal_unmap_all();
245 #endif
246         mapped = false;
247         current_read_mapping = UINT32_MAX;
248     }
249 }
250 
spi_to_esp_err(esp_rom_spiflash_result_t r)251 static esp_err_t spi_to_esp_err(esp_rom_spiflash_result_t r)
252 {
253     switch (r) {
254     case ESP_ROM_SPIFLASH_RESULT_OK:
255         return ESP_OK;
256     case ESP_ROM_SPIFLASH_RESULT_ERR:
257         return ESP_ERR_FLASH_OP_FAIL;
258     case ESP_ROM_SPIFLASH_RESULT_TIMEOUT:
259         return ESP_ERR_FLASH_OP_TIMEOUT;
260     default:
261         return ESP_FAIL;
262     }
263 }
264 
bootloader_flash_read_no_decrypt(size_t src_addr,void * dest,size_t size)265 static esp_err_t bootloader_flash_read_no_decrypt(size_t src_addr, void *dest, size_t size)
266 {
267 #if CONFIG_IDF_TARGET_ESP32
268     Cache_Read_Disable(0);
269     Cache_Flush(0);
270 #else
271     cache_hal_disable(CACHE_TYPE_ALL);
272 #endif
273 
274     esp_rom_spiflash_result_t r = esp_rom_spiflash_read(src_addr, dest, size);
275 
276 #if CONFIG_IDF_TARGET_ESP32
277     Cache_Read_Enable(0);
278 #else
279     cache_hal_enable(CACHE_TYPE_ALL);
280 #endif
281 
282     return spi_to_esp_err(r);
283 }
284 
bootloader_flash_read_allow_decrypt(size_t src_addr,void * dest,size_t size)285 static esp_err_t bootloader_flash_read_allow_decrypt(size_t src_addr, void *dest, size_t size)
286 {
287     uint32_t *dest_words = (uint32_t *)dest;
288 
289     for (size_t word = 0; word < size / 4; word++) {
290         uint32_t word_src = src_addr + word * 4;  /* Read this offset from flash */
291         uint32_t map_at = word_src & MMU_FLASH_MASK; /* Map this 64KB block from flash */
292         uint32_t *map_ptr;
293 
294         /* Move the 64KB mmu mapping window to fit map_at */
295         if (map_at != current_read_mapping) {
296 
297             //----------Stop cache for mapping----------------
298 #if CONFIG_IDF_TARGET_ESP32
299             Cache_Read_Disable(0);
300             Cache_Flush(0);
301 #else
302             cache_hal_disable(CACHE_TYPE_ALL);
303 #endif
304 
305             //---------------Do mapping------------------------
306             ESP_EARLY_LOGD(TAG, "mmu set block paddr=0x%08x (was 0x%08x)", map_at, current_read_mapping);
307 #if CONFIG_IDF_TARGET_ESP32
308             //Should never fail if we only map a SPI_FLASH_MMU_PAGE_SIZE to the vaddr starting from FLASH_READ_VADDR
309             int e = cache_flash_mmu_set(0, 0, FLASH_READ_VADDR, map_at, 64, 1);
310             if (e != 0) {
311                 ESP_EARLY_LOGE(TAG, "cache_flash_mmu_set failed: error=%d\n", e);
312                 Cache_Read_Enable(0);
313                 return ESP_FAIL;
314             }
315 #else
316             uint32_t actual_mapped_len = 0;
317             mmu_hal_map_region(0, MMU_TARGET_FLASH0, FLASH_READ_VADDR, map_at, SPI_FLASH_MMU_PAGE_SIZE - 1, &actual_mapped_len);
318 #endif
319             current_read_mapping = map_at;
320 
321             //-------------enable cache-------------------------
322 #if CONFIG_IDF_TARGET_ESP32
323             Cache_Read_Enable(0);
324 #else
325             cache_hal_enable(CACHE_TYPE_ALL);
326 #endif
327         }
328         map_ptr = (uint32_t *)(FLASH_READ_VADDR + (word_src - map_at));
329         dest_words[word] = *map_ptr;
330     }
331     return ESP_OK;
332 }
333 
esp_rom_flash_read(size_t src_addr,void * dest,size_t size,bool allow_decrypt)334 esp_err_t esp_rom_flash_read(size_t src_addr, void *dest, size_t size, bool allow_decrypt)
335 {
336     if (src_addr & 3) {
337         ESP_EARLY_LOGE(TAG, "bootloader_flash_read src_addr 0x%x not 4-byte aligned", src_addr);
338         return ESP_FAIL;
339     }
340     if (size & 3) {
341         ESP_EARLY_LOGE(TAG, "bootloader_flash_read size 0x%x not 4-byte aligned", size);
342         return ESP_FAIL;
343     }
344     if ((intptr_t)dest & 3) {
345         ESP_EARLY_LOGE(TAG, "bootloader_flash_read dest 0x%x not 4-byte aligned", (intptr_t)dest);
346         return ESP_FAIL;
347     }
348 
349     if (allow_decrypt) {
350         return bootloader_flash_read_allow_decrypt(src_addr, dest, size);
351     } else {
352         return bootloader_flash_read_no_decrypt(src_addr, dest, size);
353     }
354 }
355 
esp_rom_flash_write(size_t dest_addr,void * src,size_t size,bool write_encrypted)356 esp_err_t esp_rom_flash_write(size_t dest_addr, void *src, size_t size, bool write_encrypted)
357 {
358     esp_err_t err;
359     size_t alignment = write_encrypted ? 32 : 4;
360     if ((dest_addr % alignment) != 0) {
361         ESP_EARLY_LOGE(TAG, "bootloader_flash_write dest_addr 0x%x not %d-byte aligned", dest_addr, alignment);
362         return ESP_FAIL;
363     }
364     if ((size % alignment) != 0) {
365         ESP_EARLY_LOGE(TAG, "bootloader_flash_write size 0x%x not %d-byte aligned", size, alignment);
366         return ESP_FAIL;
367     }
368     if (((intptr_t)src % 4) != 0) {
369         ESP_EARLY_LOGE(TAG, "bootloader_flash_write src 0x%x not 4 byte aligned", (intptr_t)src);
370         return ESP_FAIL;
371     }
372 
373     err = bootloader_flash_unlock();
374     if (err != ESP_OK) {
375         return err;
376     }
377 
378     if (write_encrypted && !ENCRYPTION_IS_VIRTUAL) {
379         return spi_to_esp_err(esp_rom_spiflash_write_encrypted(dest_addr, src, size));
380     } else {
381         return spi_to_esp_err(esp_rom_spiflash_write(dest_addr, src, size));
382     }
383 }
384 
esp_rom_flash_erase_sector(size_t sector)385 esp_err_t esp_rom_flash_erase_sector(size_t sector)
386 {
387     return spi_to_esp_err(esp_rom_spiflash_erase_sector(sector));
388 }
389 
esp_rom_flash_erase_range(uint32_t start_addr,uint32_t size)390 esp_err_t esp_rom_flash_erase_range(uint32_t start_addr, uint32_t size)
391 {
392     if (start_addr % FLASH_SECTOR_SIZE != 0) {
393         return ESP_ERR_INVALID_ARG;
394     }
395     if (size % FLASH_SECTOR_SIZE != 0) {
396         return ESP_ERR_INVALID_SIZE;
397     }
398     size_t start = start_addr / FLASH_SECTOR_SIZE;
399     size_t end = start + size / FLASH_SECTOR_SIZE;
400     const size_t sectors_per_block = FLASH_BLOCK_SIZE / FLASH_SECTOR_SIZE;
401 
402     esp_rom_spiflash_result_t rc = ESP_ROM_SPIFLASH_RESULT_OK;
403     for (size_t sector = start; sector != end && rc == ESP_ROM_SPIFLASH_RESULT_OK; ) {
404         if (sector % sectors_per_block == 0 && end - sector >= sectors_per_block) {
405             rc = esp_rom_spiflash_erase_block(sector / sectors_per_block);
406             sector += sectors_per_block;
407         } else {
408             rc = esp_rom_spiflash_erase_sector(sector);
409             ++sector;
410         }
411     }
412     return spi_to_esp_err(rc);
413 }
414 
415 #if CONFIG_BOOTLOADER_CACHE_32BIT_ADDR_OCTAL_FLASH
bootloader_flash_32bits_address_map_enable(esp_rom_spiflash_read_mode_t flash_mode)416 void bootloader_flash_32bits_address_map_enable(esp_rom_spiflash_read_mode_t flash_mode)
417 {
418     esp_rom_opiflash_spi0rd_t cache_rd = {};
419     switch (flash_mode) {
420     case ESP_ROM_SPIFLASH_FASTRD_MODE:
421         cache_rd.addr_bit_len = 32;
422         cache_rd.dummy_bit_len = 8;
423         cache_rd.cmd = CMD_FASTRD_4B;
424         cache_rd.cmd_bit_len = 8;
425         break;
426      case ESP_ROM_SPIFLASH_SLOWRD_MODE:
427         cache_rd.addr_bit_len = 32;
428         cache_rd.dummy_bit_len = 0;
429         cache_rd.cmd = CMD_SLOWRD_4B;
430         cache_rd.cmd_bit_len = 8;
431         break;
432     default:
433         assert(false);
434         break;
435     }
436     cache_hal_disable(CACHE_TYPE_ALL);
437     esp_rom_opiflash_cache_mode_config(flash_mode, &cache_rd);
438     cache_hal_enable(CACHE_TYPE_ALL);
439 }
440 #endif
441 
is_issi_chip(const esp_rom_spiflash_chip_t * chip)442 FORCE_INLINE_ATTR bool is_issi_chip(const esp_rom_spiflash_chip_t* chip)
443 {
444     return BYTESHIFT(chip->device_id, 2) == ISSI_ID;
445 }
446 
447 // For GD25Q32, GD25Q64, GD25Q127C, GD25Q128, which use single command to read/write different SR.
is_gd_q_chip(const esp_rom_spiflash_chip_t * chip)448 FORCE_INLINE_ATTR bool is_gd_q_chip(const esp_rom_spiflash_chip_t* chip)
449 {
450     return BYTESHIFT(chip->device_id, 2) == GD_Q_ID_HIGH && BYTESHIFT(chip->device_id, 1) == GD_Q_ID_MID && BYTESHIFT(chip->device_id, 0) >= GD_Q_ID_LOW;
451 }
452 
is_mxic_chip(const esp_rom_spiflash_chip_t * chip)453 FORCE_INLINE_ATTR bool is_mxic_chip(const esp_rom_spiflash_chip_t* chip)
454 {
455     return BYTESHIFT(chip->device_id, 2) == MXIC_ID;
456 }
457 
bootloader_flash_unlock(void)458 esp_err_t IRAM_ATTR __attribute__((weak)) bootloader_flash_unlock(void)
459 {
460     // At the beginning status == new_status == status_sr2 == new_status_sr2 == 0.
461     // If the register doesn't need to be updated, keep them the same (0), so that no command will be actually sent.
462     uint16_t status = 0;    // status for SR1 or SR1+SR2 if writing SR with 01H + 2Bytes.
463     uint16_t new_status = 0;
464     uint8_t status_sr2 = 0;    // status_sr2 for SR2.
465     uint8_t new_status_sr2 = 0;
466     uint8_t sr1_bit_num = 0;
467     esp_err_t err = ESP_OK;
468 
469     esp_rom_spiflash_wait_idle(&g_rom_flashchip);
470     if (is_issi_chip(&g_rom_flashchip) || is_mxic_chip(&g_rom_flashchip)) {
471         // Currently ISSI & MXIC share the same command and register layout, which is different from the default model.
472         // If any code here needs to be modified, check both chips.
473         status = bootloader_execute_flash_command(CMD_RDSR, 0, 0, 8);
474 
475         /* Clear all bits in the mask.
476         (This is different from ROM esp_rom_spiflash_unlock, which keeps all bits as-is.)
477         */
478         sr1_bit_num = 8;
479         new_status = status & (~ESP_BOOTLOADER_SPIFLASH_BP_MASK_ISSI);
480     } else if (is_gd_q_chip(&g_rom_flashchip)) {
481         /* The GD chips behaviour is to clear all bits in SR1 and clear bits in SR2 except QE bit.
482            Use 01H to write SR1 and 31H to write SR2.
483         */
484         status = bootloader_execute_flash_command(CMD_RDSR, 0, 0, 8);
485         sr1_bit_num = 8;
486         new_status = 0;
487 
488         status_sr2 = bootloader_execute_flash_command(CMD_RDSR2, 0, 0, 8);
489         new_status_sr2 = status_sr2 & ESP_BOOTLOADER_SPIFLASH_QE_GD_SR2;
490     } else {
491         /* For common behaviour, like XMC chips, Use 01H+2Bytes to write both SR1 and SR2*/
492         status = bootloader_execute_flash_command(CMD_RDSR, 0, 0, 8) | (bootloader_execute_flash_command(CMD_RDSR2, 0, 0, 8) << 8);
493 
494         /* Clear all bits except QE, if it is set.
495         (This is different from ROM esp_rom_spiflash_unlock, which keeps all bits as-is.)
496         */
497         sr1_bit_num = 16;
498         new_status = status & ESP_BOOTLOADER_SPIFLASH_QE_SR1_2BYTE;
499     }
500 
501     // When SR is written, set to true to indicate that WRDI need to be sent to ensure the protection is ON before return.
502     bool status_written = false;
503     // Skip if nothing needs to be changed. Meaningless writing to SR increases the risk during write and wastes time.
504     if (status != new_status) {
505         esp_rom_spiflash_wait_idle(&g_rom_flashchip);
506         bootloader_execute_flash_command(CMD_WREN, 0, 0, 0);
507         bootloader_execute_flash_command(CMD_WRSR, new_status, sr1_bit_num, 0);
508         status_written = true;
509     }
510 
511     if (status_sr2 != new_status_sr2) {
512         esp_rom_spiflash_wait_idle(&g_rom_flashchip);
513         bootloader_execute_flash_command(CMD_WREN, 0, 0, 0);
514         bootloader_execute_flash_command(CMD_WRSR2, new_status_sr2, 8, 0);
515         status_written = true;
516     }
517 
518     if (status_written) {
519         //Call esp_rom_spiflash_wait_idle to make sure previous WRSR is completed.
520         esp_rom_spiflash_wait_idle(&g_rom_flashchip);
521         bootloader_execute_flash_command(CMD_WRDI, 0, 0, 0);
522     }
523 
524     return err;
525 }
526 
bootloader_flash_execute_command_common(uint8_t command,uint32_t addr_len,uint32_t address,uint8_t dummy_len,uint8_t mosi_len,uint32_t mosi_data,uint8_t miso_len)527 IRAM_ATTR uint32_t bootloader_flash_execute_command_common(
528     uint8_t command,
529     uint32_t addr_len, uint32_t address,
530     uint8_t dummy_len,
531     uint8_t mosi_len, uint32_t mosi_data,
532     uint8_t miso_len)
533 {
534     assert(mosi_len <= 32);
535     assert(miso_len <= 32);
536     uint32_t old_ctrl_reg = SPIFLASH.ctrl.val;
537     uint32_t old_user_reg = SPIFLASH.user.val;
538     uint32_t old_user1_reg = SPIFLASH.user1.val;
539 #if CONFIG_IDF_TARGET_ESP32
540     SPIFLASH.ctrl.val = SPI_WP_REG_M; // keep WP high while idle, otherwise leave DIO mode
541 #else
542     SPIFLASH.ctrl.val = SPI_MEM_WP_REG_M; // keep WP high while idle, otherwise leave DIO mode
543 #endif
544     //command phase
545     SPIFLASH.user.usr_command = 1;
546     SPIFLASH.user2.usr_command_bitlen = 7;
547     SPIFLASH.user2.usr_command_value = command;
548     //addr phase
549     SPIFLASH.user.usr_addr = addr_len > 0;
550     SPIFLASH.user1.usr_addr_bitlen = addr_len - 1;
551 #if CONFIG_IDF_TARGET_ESP32
552     SPIFLASH.addr = (addr_len > 0)? (address << (32-addr_len)) : 0;
553 #else
554     SPIFLASH.addr = address;
555 #endif
556     //dummy phase
557     uint32_t total_dummy = dummy_len;
558     if (miso_len > 0) {
559         total_dummy += g_rom_spiflash_dummy_len_plus[1];
560     }
561     SPIFLASH.user.usr_dummy = total_dummy > 0;
562     SPIFLASH.user1.usr_dummy_cyclelen = total_dummy - 1;
563     //output data
564     SPIFLASH.user.usr_mosi = mosi_len > 0;
565 #if CONFIG_IDF_TARGET_ESP32
566     SPIFLASH.mosi_dlen.usr_mosi_dbitlen = mosi_len ? (mosi_len - 1) : 0;
567 #else
568     SPIFLASH.mosi_dlen.usr_mosi_bit_len = mosi_len ? (mosi_len - 1) : 0;
569 #endif
570     SPIFLASH.data_buf[0] = mosi_data;
571     //input data
572     SPIFLASH.user.usr_miso = miso_len > 0;
573 #if CONFIG_IDF_TARGET_ESP32
574     SPIFLASH.miso_dlen.usr_miso_dbitlen = miso_len ? (miso_len - 1) : 0;
575 #else
576     SPIFLASH.miso_dlen.usr_miso_bit_len = miso_len ? (miso_len - 1) : 0;
577 #endif
578 
579     SPIFLASH.cmd.usr = 1;
580     while (SPIFLASH.cmd.usr != 0) {
581     }
582     SPIFLASH.ctrl.val = old_ctrl_reg;
583     SPIFLASH.user.val = old_user_reg;
584     SPIFLASH.user1.val = old_user1_reg;
585 
586     uint32_t ret = SPIFLASH.data_buf[0];
587     if (miso_len < 32) {
588         //set unused bits to 0
589         ret &= ~(UINT32_MAX << miso_len);
590     }
591     return ret;
592 }
593 
bootloader_execute_flash_command(uint8_t command,uint32_t mosi_data,uint8_t mosi_len,uint8_t miso_len)594 uint32_t IRAM_ATTR bootloader_execute_flash_command(uint8_t command, uint32_t mosi_data, uint8_t mosi_len, uint8_t miso_len)
595 {
596     const uint8_t addr_len = 0;
597     const uint8_t address = 0;
598     const uint8_t dummy_len = 0;
599 
600     return bootloader_flash_execute_command_common(command, addr_len, address,
601             dummy_len, mosi_len, mosi_data, miso_len);
602 }
603 
604 // cmd(0x5A) + 24bit address + 8 cycles dummy
bootloader_flash_read_sfdp(uint32_t sfdp_addr,unsigned int miso_byte_num)605 uint32_t IRAM_ATTR bootloader_flash_read_sfdp(uint32_t sfdp_addr, unsigned int miso_byte_num)
606 {
607     assert(miso_byte_num <= 4);
608     const uint8_t command = CMD_RDSFDP;
609     const uint8_t addr_len = 24;
610     const uint8_t dummy_len = 8;
611     const uint8_t mosi_len = 0;
612     const uint32_t mosi_data = 0;
613     const uint8_t miso_len = miso_byte_num * 8;
614 
615     return bootloader_flash_execute_command_common(command, addr_len, sfdp_addr,
616             dummy_len, mosi_len, mosi_data, miso_len);
617 }
618 
bootloader_enable_wp(void)619 void bootloader_enable_wp(void)
620 {
621     bootloader_execute_flash_command(CMD_WRDI, 0, 0, 0);   /* Exit OTP mode */
622 }
623 
bootloader_read_flash_id(void)624 uint32_t IRAM_ATTR bootloader_read_flash_id(void)
625 {
626     uint32_t id = bootloader_execute_flash_command(CMD_RDID, 0, 0, 24);
627     id = ((id & 0xff) << 16) | ((id >> 16) & 0xff) | (id & 0xff00);
628     return id;
629 }
630 
bootloader_spi_flash_reset(void)631 void bootloader_spi_flash_reset(void)
632 {
633     bootloader_execute_flash_command(CMD_RESETEN, 0, 0, 0);
634     bootloader_execute_flash_command(CMD_RESET, 0, 0, 0);
635 }
636 
637 /*******************************************************************************
638  * XMC startup flow
639  ******************************************************************************/
640 
641 #define XMC_SUPPORT CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT
642 #define XMC_VENDOR_ID 0x20
643 
644 static DRAM_ATTR char bootloader_flash_tag[] = "bootloader_flash";
645 #define BOOTLOADER_FLASH_LOG(level, ...)    ESP_DRAM_LOG##level(bootloader_flash_tag, ##__VA_ARGS__)
646 
647 #if XMC_SUPPORT
648 //strictly check the model
is_xmc_chip_strict(uint32_t rdid)649 static IRAM_ATTR bool is_xmc_chip_strict(uint32_t rdid)
650 {
651     uint32_t vendor_id = BYTESHIFT(rdid, 2);
652     uint32_t mfid = BYTESHIFT(rdid, 1);
653     uint32_t cpid = BYTESHIFT(rdid, 0);
654 
655     if (vendor_id != XMC_VENDOR_ID) {
656         return false;
657     }
658 
659     bool matched = false;
660     if (mfid == 0x40) {
661         if (cpid >= 0x13 && cpid <= 0x20) {
662             matched = true;
663         }
664     } else if (mfid == 0x41) {
665         if (cpid >= 0x17 && cpid <= 0x20) {
666             matched = true;
667         }
668     } else if (mfid == 0x50) {
669         if (cpid >= 0x15 && cpid <= 0x16) {
670             matched =  true;
671         }
672     }
673     return matched;
674 }
675 
bootloader_flash_xmc_startup(void)676 esp_err_t IRAM_ATTR bootloader_flash_xmc_startup(void)
677 {
678     // If the RDID value is a valid XMC one, may skip the flow
679     const bool fast_check = true;
680     if (fast_check && is_xmc_chip_strict(g_rom_flashchip.device_id)) {
681         BOOTLOADER_FLASH_LOG(D, "XMC chip detected by RDID (%08X), skip.", g_rom_flashchip.device_id);
682         return ESP_OK;
683     }
684 
685     // Check the Manufacturer ID in SFDP registers (JEDEC standard). If not XMC chip, no need to run the flow
686     const int sfdp_mfid_addr = 0x10;
687     uint8_t mf_id = (bootloader_flash_read_sfdp(sfdp_mfid_addr, 1) & 0xff);
688     if (mf_id != XMC_VENDOR_ID) {
689         BOOTLOADER_FLASH_LOG(D, "non-XMC chip detected by SFDP Read (%02X), skip.", mf_id);
690         return ESP_OK;
691     }
692 
693     BOOTLOADER_FLASH_LOG(I, "XM25QHxxC startup flow");
694     // Enter DPD
695     bootloader_execute_flash_command(0xB9, 0, 0, 0);
696     // Enter UDPD
697     bootloader_execute_flash_command(0x79, 0, 0, 0);
698     // Exit UDPD
699     bootloader_execute_flash_command(0xFF, 0, 0, 0);
700     // Delay tXUDPD
701     esp_rom_delay_us(2000);
702     // Release Power-down
703     bootloader_execute_flash_command(0xAB, 0, 0, 0);
704     esp_rom_delay_us(20);
705     // Read flash ID and check again
706     g_rom_flashchip.device_id = bootloader_read_flash_id();
707     if (!is_xmc_chip_strict(g_rom_flashchip.device_id)) {
708         BOOTLOADER_FLASH_LOG(E, "XMC flash startup fail");
709         return ESP_FAIL;
710     }
711 
712     return ESP_OK;
713 }
714 
715 #else
716 //only compare the vendor id
is_xmc_chip(uint32_t rdid)717 static IRAM_ATTR bool is_xmc_chip(uint32_t rdid)
718 {
719     uint32_t vendor_id = (rdid >> 16) & 0xFF;
720     return (vendor_id == XMC_VENDOR_ID);
721 }
722 
bootloader_flash_xmc_startup(void)723 esp_err_t IRAM_ATTR bootloader_flash_xmc_startup(void)
724 {
725     if (is_xmc_chip(g_rom_flashchip.device_id)) {
726         BOOTLOADER_FLASH_LOG(E, "XMC chip detected (%08X) while support disabled.", g_rom_flashchip.device_id);
727         return ESP_FAIL;
728     }
729     return ESP_OK;
730 }
731 
732 #endif //XMC_SUPPORT
733 
bootloader_mspi_reset(void)734 FORCE_INLINE_ATTR void bootloader_mspi_reset(void)
735 {
736 #if CONFIG_IDF_TARGET_ESP32
737     SPI1.slave.sync_reset = 0;
738     SPI0.slave.sync_reset = 0;
739     SPI1.slave.sync_reset = 1;
740     SPI0.slave.sync_reset = 1;
741     SPI1.slave.sync_reset = 0;
742     SPI0.slave.sync_reset = 0;
743 #else
744     SPIMEM1.ctrl2.sync_reset = 0;
745     SPIMEM0.ctrl2.sync_reset = 0;
746     SPIMEM1.ctrl2.sync_reset = 1;
747     SPIMEM0.ctrl2.sync_reset = 1;
748     SPIMEM1.ctrl2.sync_reset = 0;
749     SPIMEM0.ctrl2.sync_reset = 0;
750 #endif
751 }
752 
bootloader_flash_reset_chip(void)753 esp_err_t IRAM_ATTR bootloader_flash_reset_chip(void)
754 {
755     bootloader_mspi_reset();
756     // Seems that sync_reset cannot make host totally idle.'
757     // Sending an extra(useless) command to make the host idle in order to send reset command.
758     bootloader_execute_flash_command(0x05, 0, 0, 0);
759 #if CONFIG_IDF_TARGET_ESP32
760     if (SPI1.ext2.st != 0)
761 #else
762     if (!spimem_flash_ll_host_idle(&SPIMEM1))
763 #endif
764     {
765         return ESP_FAIL;
766     }
767     bootloader_execute_flash_command(0x66, 0, 0, 0);
768     bootloader_execute_flash_command(0x99, 0, 0, 0);
769 
770     return ESP_OK;
771 }
772 
bootloader_flash_is_octal_mode_enabled(void)773 bool IRAM_ATTR bootloader_flash_is_octal_mode_enabled(void)
774 {
775 #if SOC_SPI_MEM_SUPPORT_OPI_MODE
776     return efuse_ll_get_flash_type();
777 #else
778     return false;
779 #endif
780 }
781 
bootloader_flash_get_spi_mode(void)782 esp_rom_spiflash_read_mode_t bootloader_flash_get_spi_mode(void)
783 {
784     esp_rom_spiflash_read_mode_t spi_mode = ESP_ROM_SPIFLASH_FASTRD_MODE;
785 #if CONFIG_IDF_TARGET_ESP32
786     uint32_t spi_ctrl = REG_READ(SPI_CTRL_REG(0));
787     if (spi_ctrl & SPI_FREAD_QIO) {
788         spi_mode = ESP_ROM_SPIFLASH_QIO_MODE;
789     } else if (spi_ctrl & SPI_FREAD_QUAD) {
790         spi_mode = ESP_ROM_SPIFLASH_QOUT_MODE;
791     } else if (spi_ctrl & SPI_FREAD_DIO) {
792         spi_mode = ESP_ROM_SPIFLASH_DIO_MODE;
793     } else if (spi_ctrl & SPI_FREAD_DUAL) {
794         spi_mode = ESP_ROM_SPIFLASH_DOUT_MODE;
795     } else if (spi_ctrl & SPI_FASTRD_MODE) {
796         spi_mode = ESP_ROM_SPIFLASH_FASTRD_MODE;
797     } else {
798         spi_mode = ESP_ROM_SPIFLASH_SLOWRD_MODE;
799     }
800 #else
801     uint32_t spi_ctrl = REG_READ(SPI_MEM_CTRL_REG(0));
802     if (spi_ctrl & SPI_MEM_FREAD_QIO) {
803         spi_mode = ESP_ROM_SPIFLASH_QIO_MODE;
804     } else if (spi_ctrl & SPI_MEM_FREAD_QUAD) {
805         spi_mode = ESP_ROM_SPIFLASH_QOUT_MODE;
806     } else if (spi_ctrl & SPI_MEM_FREAD_DIO) {
807         spi_mode = ESP_ROM_SPIFLASH_DIO_MODE;
808     } else if (spi_ctrl & SPI_MEM_FREAD_DUAL) {
809         spi_mode = ESP_ROM_SPIFLASH_DOUT_MODE;
810     } else if (spi_ctrl & SPI_MEM_FASTRD_MODE) {
811         spi_mode = ESP_ROM_SPIFLASH_FASTRD_MODE;
812     } else {
813         spi_mode = ESP_ROM_SPIFLASH_SLOWRD_MODE;
814     }
815 #endif
816     return spi_mode;
817 }
818