diff options
author | Aidan MacDonald <amachronic@protonmail.com> | 2021-03-08 10:59:53 +0000 |
---|---|---|
committer | Aidan MacDonald <amachronic@protonmail.com> | 2021-03-09 20:04:30 +0000 |
commit | 777f63d5292df98253bbb00db9362ddbe55b778e (patch) | |
tree | be227688fb0dea649604a2dab7ac7b5a352c9855 | |
parent | 4e6609e9f2388a2f855b53b7bbff903de1f26644 (diff) |
Move MIPS cache management functions to IRAM
Previously these were placed in DRAM, which is overwritten by RoLo
when it loads a new image, but RoLo must call commit_discard_idcache()
after loading the image.
Change-Id: I5dcc4ca711b774166f83c668695edbcabfab2604
-rw-r--r-- | firmware/target/mips/mmu-mips.h | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/firmware/target/mips/mmu-mips.h b/firmware/target/mips/mmu-mips.h index f96ddcc28d..b54807f060 100644 --- a/firmware/target/mips/mmu-mips.h +++ b/firmware/target/mips/mmu-mips.h @@ -24,29 +24,37 @@ #include "system-target.h" +/* By default the cache management functions go in .icode so they can be + * called safely eg. by the bootloader or RoLo, which need to flush the + * cache before jumping to the loaded binary. + */ +#ifndef MIPS_CACHEFUNC_ATTR +# define MIPS_CACHEFUNC_ATTR __attribute__((section(".icode"))) +#endif + void map_address(unsigned long virtual, unsigned long physical, unsigned long length, unsigned int cache_flags); void mmu_init(void); /* Commits entire DCache */ -void commit_dcache(void); +void commit_dcache(void) MIPS_CACHEFUNC_ATTR; /* Commit and discard entire DCache, will do writeback */ -void commit_discard_dcache(void); +void commit_discard_dcache(void) MIPS_CACHEFUNC_ATTR; /* Write DCache back to RAM for the given range and remove cache lines * from DCache afterwards */ -void commit_discard_dcache_range(const void *base, unsigned int size); +void commit_discard_dcache_range(const void *base, unsigned int size) MIPS_CACHEFUNC_ATTR; /* Write DCache back to RAM for the given range */ -void commit_dcache_range(const void *base, unsigned int size); +void commit_dcache_range(const void *base, unsigned int size) MIPS_CACHEFUNC_ATTR; /* * Remove cache lines for the given range from DCache * will *NOT* do write back except for buffer edges not on a line boundary */ -void discard_dcache_range(const void *base, unsigned int size); +void discard_dcache_range(const void *base, unsigned int size) MIPS_CACHEFUNC_ATTR; /* Discards the entire ICache, and commit+discards the entire DCache */ -void commit_discard_idcache(void); +void commit_discard_idcache(void) MIPS_CACHEFUNC_ATTR; #endif /* __MMU_MIPS_INCLUDE_H */ |