Skip to content

Commit

Permalink
Make precache() cleaner and more efficient (#8903)
Browse files Browse the repository at this point in the history
No need to issue a MEMW instrunction per load from each cache line.
Only once after the last load is sufficient.

  MEMW ensures that all previous load, store, acquire, release, prefetch,
  and cache instructions perform before performing any subsequent load,
  store, acquire, release, prefetch, or cache instructions.

    -- MEMW (Memory Wait), 6. Instruction Descriptions,
                                      Xtensa ISA Reference Manual (p.409)
  • Loading branch information
jjsuwa-sys3175 committed Apr 5, 2023
1 parent a76ef29 commit 65579d2
Showing 1 changed file with 7 additions and 7 deletions.
14 changes: 7 additions & 7 deletions cores/esp8266/core_esp8266_features.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,13 @@ void precache(void *f, uint32_t bytes) {
// page (ie 1 word in 8) for this to work.
#define CACHE_PAGE_SIZE 32

uint32_t a0;
__asm__("mov.n %0, a0" : "=r"(a0));
uint32_t lines = (bytes/CACHE_PAGE_SIZE)+2;
volatile uint32_t *p = (uint32_t*)((f ? (uint32_t)f : a0) & ~0x03);
uint32_t x;
for (uint32_t i=0; i<lines; i++, p+=CACHE_PAGE_SIZE/sizeof(uint32_t)) x=*p;
(void)x;
uint32_t lines = (bytes / CACHE_PAGE_SIZE) + 2;
uint32_t *p = (uint32_t*)((uint32_t)(f ? f : __builtin_return_address(0)) & ~0x03);
do {
__asm__ volatile ("" : : "r"(*p)); // guarantee that the value of *p will be in some register (forced load)
p += CACHE_PAGE_SIZE / sizeof(uint32_t);
} while (--lines);
__sync_synchronize(); // full memory barrier, mapped to MEMW in Xtensa
}

/** based on efuse data, we could determine what type of chip this is
Expand Down

0 comments on commit 65579d2

Please sign in to comment.