From b32c52874d4dd7bad957141bd63c72f69eaa6fb8 Mon Sep 17 00:00:00 2001
From: Dong Heng <dongheng@espressif.com>
Date: Tue, 31 Jul 2018 10:23:15 +0800
Subject: [PATCH] feat(esp8266): Add full icache mode

Use full 32 KB iram as icache.
---
 .../subproject/main/esp8266.bootloader.ld     |   2 +-
 components/esp8266/Kconfig                    |   7 ++++
 .../esp8266/include/esp8266/rom_functions.h   |   1 +
 components/esp8266/lib/VERSION                |   2 +-
 components/esp8266/lib/libcore.a              | Bin 74920 -> 74260 bytes
 components/esp8266/source/chip_boot.c         |   5 +--
 components/esp8266/source/esp_cache.c         |  39 ++++++++++++++++++
 components/freertos/port/esp8266/heap_5.c     |   4 ++
 8 files changed, 55 insertions(+), 5 deletions(-)
 create mode 100644 components/esp8266/source/esp_cache.c

diff --git a/components/bootloader/subproject/main/esp8266.bootloader.ld b/components/bootloader/subproject/main/esp8266.bootloader.ld
index df37355d..122dfd33 100644
--- a/components/bootloader/subproject/main/esp8266.bootloader.ld
+++ b/components/bootloader/subproject/main/esp8266.bootloader.ld
@@ -16,7 +16,7 @@ MEMORY
   dram_seg  :    org = 0x3FFE8000, len = 0x18000
 
   /* Functions which are critical should be put in this segment. */
-  iram_seg  :    org = 0x40100000, len = 0xC000
+  iram_seg  :    org = 0x40100000, len = 0x8000
 }
 
 /*  Default entry point:  */
diff --git a/components/esp8266/Kconfig b/components/esp8266/Kconfig
index d2c9655a..0ce6ee46 100644
--- a/components/esp8266/Kconfig
+++ b/components/esp8266/Kconfig
@@ -28,6 +28,13 @@ config NEWLIB_STDOUT_LINE_ENDING_CR
     bool "CR"
 endchoice
 
+config SOC_FULL_ICACHE
+    bool "Enable full cache mode"
+    default n
+    help
+        Enable this option, full 32 KB iram instead of 16 KB iram will be used as icache, so the heap use can use
+        may reduce a lot.
+
 endmenu
 
 menu WIFI
diff --git a/components/esp8266/include/esp8266/rom_functions.h b/components/esp8266/include/esp8266/rom_functions.h
index 5f847846..c1f20370 100644
--- a/components/esp8266/include/esp8266/rom_functions.h
+++ b/components/esp8266/include/esp8266/rom_functions.h
@@ -33,5 +33,6 @@ int SPI_read_status(esp_spi_flash_chip_t *chip, uint32_t *status);
 int Enable_QMode(esp_spi_flash_chip_t *chip);
 
 void Cache_Read_Disable();
+void Cache_Read_Enable(uint8_t map, uint8_t p, uint8_t v);
 
 #endif
diff --git a/components/esp8266/lib/VERSION b/components/esp8266/lib/VERSION
index 5bdda5a0..6a00e507 100644
--- a/components/esp8266/lib/VERSION
+++ b/components/esp8266/lib/VERSION
@@ -1,7 +1,7 @@
 gwen:
     crypto:     8943c89
     espnow:     8943c89
-    core:       2f2b0ef
+    core:       f4f0d3d
     net80211:   80fc165
     pp:         06e0988
     pwm:        0181338
diff --git a/components/esp8266/lib/libcore.a b/components/esp8266/lib/libcore.a
index 7ead303180d7b8b8db02a3a1d66956094b7df264..a7165fe09d64a852f6008460a1074aa88773c3a6 100644
GIT binary patch
delta 3899
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
Mq#ACy5)JkL03q?hf&c&j

delta 4425
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
TB@}GGl7e}CyS%*@{Eq%_SA)a|

diff --git a/components/esp8266/source/chip_boot.c b/components/esp8266/source/chip_boot.c
index 9cc08586..7e9020a9 100644
--- a/components/esp8266/source/chip_boot.c
+++ b/components/esp8266/source/chip_boot.c
@@ -52,9 +52,8 @@ void chip_boot(size_t start_addr, size_t map)
 
     extern esp_spi_flash_chip_t flashchip;
     extern void phy_get_bb_evm(void);
-    extern void cache_init(uint32_t , uint32_t, uint32_t);
+    extern void cache_init(uint8_t);
     extern void user_spi_flash_dio_to_qio_pre_init(void);
-    extern int esp_get_boot_param(uint32_t, uint32_t, void *, uint32_t);
 
     phy_get_bb_evm();
 
@@ -93,7 +92,7 @@ void chip_boot(size_t start_addr, size_t map)
     SET_PERI_REG_BITS(PERIPHS_SPI_FLASH_CTRL, 0xfff, freqbits, 0);
 
     ESP_EARLY_LOGD(TAG, "SPI flash cache map is %d\n", map);
-    cache_init(map, 0, 0);
+    cache_init(map);
 
     if (fhdr.spi_mode == ESP_IMAGE_SPI_MODE_QIO) {
         ESP_EARLY_LOGD(TAG, "SPI flash enable QIO mode\n");
diff --git a/components/esp8266/source/esp_cache.c b/components/esp8266/source/esp_cache.c
new file mode 100644
index 00000000..411b7a19
--- /dev/null
+++ b/components/esp8266/source/esp_cache.c
@@ -0,0 +1,39 @@
+// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "sdkconfig.h"
+#include <stdint.h>
+#include "esp_attr.h"
+#include "esp8266/rom_functions.h"
+
+#ifdef CONFIG_SOC_FULL_ICACHE
+#define SOC_CACHE_SIZE 1 // 32KB
+#else
+#define SOC_CACHE_SIZE 0 // 16KB
+#endif
+
+static uint8_t s_cache_map;
+static uint8_t s_cache_size = SOC_CACHE_SIZE;
+
+void IRAM_ATTR Cache_Read_Enable_New(void)
+{
+    Cache_Read_Enable(s_cache_map, 0, s_cache_size);
+}
+
+void cache_init(int map)
+{
+    s_cache_map = map;
+
+    Cache_Read_Enable_New();
+}
diff --git a/components/freertos/port/esp8266/heap_5.c b/components/freertos/port/esp8266/heap_5.c
index 0e94d843..f2ce1f39 100644
--- a/components/freertos/port/esp8266/heap_5.c
+++ b/components/freertos/port/esp8266/heap_5.c
@@ -105,6 +105,8 @@
  * Note 0x80000000 is the lower address so appears in the array first.
  *
  */
+#include "sdkconfig.h"
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -363,8 +365,10 @@ static bool is_inited = false;
         xHeapRegions[0].pucStartAddress = ( uint8_t * )&_heap_start;
         xHeapRegions[0].xSizeInBytes = (( size_t)( 0x40000000 - (uint32_t)&_heap_start));
         
+#ifndef CONFIG_SOC_FULL_ICACHE
         xHeapRegions[1].pucStartAddress = ( uint8_t * )&_lit4_end;
         xHeapRegions[1].xSizeInBytes = (( size_t)( 0x4010C000 - (uint32_t)&_lit4_end));
+#endif
 
         is_inited = true;
         vPortDefineHeapRegions(xHeapRegions);