From 0ff10c3e064fce52c20dd81765fdcdd3763f1759 Mon Sep 17 00:00:00 2001 From: Ondrej Kosta Date: Fri, 1 Sep 2023 18:27:04 +0200 Subject: [PATCH] feat(esp_eth): added IRAM optimization option for internal EMAC --- components/esp_eth/CMakeLists.txt | 2 ++ components/esp_eth/Kconfig | 7 +++++++ components/esp_eth/linker.lf | 19 +++++++++++++++++++ examples/ethernet/iperf/sdkconfig.defaults | 3 +++ 4 files changed, 31 insertions(+) create mode 100644 components/esp_eth/linker.lf diff --git a/components/esp_eth/CMakeLists.txt b/components/esp_eth/CMakeLists.txt index 7701396bb5..bb42bb1395 100644 --- a/components/esp_eth/CMakeLists.txt +++ b/components/esp_eth/CMakeLists.txt @@ -2,6 +2,7 @@ idf_build_get_property(components_to_build BUILD_COMPONENTS) set(srcs) set(include) +set(ld_fragments linker.lf) # As CONFIG_ETH_ENABLED comes from Kconfig, it is not evaluated yet # when components are being registered. # Thus, always add the (private) requirements, regardless of Kconfig @@ -51,6 +52,7 @@ endif() idf_component_register(SRCS "${srcs}" INCLUDE_DIRS ${include} + LDFRAGMENTS ${ld_fragments} REQUIRES esp_event # For using "ESP_EVENT_DECLARE_BASE" in header file PRIV_REQUIRES ${priv_requires}) if(CONFIG_ETH_ENABLED) diff --git a/components/esp_eth/Kconfig b/components/esp_eth/Kconfig index 8f85800a04..7b896711af 100644 --- a/components/esp_eth/Kconfig +++ b/components/esp_eth/Kconfig @@ -111,6 +111,13 @@ menu "Ethernet" cause obvious performance loss. endif + config ETH_IRAM_OPTIMIZATION + bool "Enable IRAM optimization" + default n + help + If enabled, functions related to RX/TX are placed into IRAM. It can improve Ethernet throughput. + If disabled, all functions are placed into FLASH. + endif # ETH_USE_ESP32_EMAC menuconfig ETH_USE_SPI_ETHERNET diff --git a/components/esp_eth/linker.lf b/components/esp_eth/linker.lf new file mode 100644 index 0000000000..aab1b42294 --- /dev/null +++ b/components/esp_eth/linker.lf @@ -0,0 +1,19 @@ +[mapping:esp_eth] +archive: libesp_eth.a +entries: + if ETH_IRAM_OPTIMIZATION = y: + esp_eth:esp_eth_transmit (noflash_text) + esp_eth:esp_eth_transmit_vargs (noflash_text) + esp_eth_mac_esp:emac_esp32_transmit (noflash_text) + esp_eth_mac_esp:emac_esp32_transmit_multiple_bufs (noflash_text) + esp_eth_mac_esp:emac_esp32_receive (noflash_text) + esp_eth_mac_esp:emac_esp32_rx_task (noflash_text) + +[mapping:esp_eth_hal] +archive: libhal.a +entries: + if ETH_IRAM_OPTIMIZATION = y: + emac_hal:emac_hal_transmit_frame (noflash) + emac_hal:emac_hal_transmit_multiple_buf_frame (noflash) + emac_hal:emac_hal_alloc_recv_buf (noflash) + emac_hal:emac_hal_receive_frame (noflash) diff --git a/examples/ethernet/iperf/sdkconfig.defaults b/examples/ethernet/iperf/sdkconfig.defaults index 17bd3fe137..efd490ca6d 100644 --- a/examples/ethernet/iperf/sdkconfig.defaults +++ b/examples/ethernet/iperf/sdkconfig.defaults @@ -21,3 +21,6 @@ CONFIG_ESP_TASK_WDT_EN=n # Enable lwIP IRAM optimization CONFIG_LWIP_IRAM_OPTIMIZATION=y + +# Enable Ethernet IRAM optimization +CONFIG_ETH_IRAM_OPTIMIZATION=y