On Wed, 19 Jun 2024 at 15:36, Heinrich Schuchardt <heinrich.schucha...@canonical.com> wrote: > > On 19.06.24 14:23, Ilias Apalodimas wrote: > > On Sun, 16 Jun 2024 at 20:31, Heinrich Schuchardt > > <heinrich.schucha...@canonical.com> wrote: > >> > >> If we have multiple weak implementations of functions, the linker might > >> choose any of these. ARM and RISC-V already provide a weak implementation > >> of flush_dcache_all(). > >> > >> Signed-off-by: Heinrich Schuchardt <heinrich.schucha...@canonical.com> > >> --- > >> cmd/cache.c | 3 +++ > >> 1 file changed, 3 insertions(+) > >> > >> diff --git a/cmd/cache.c b/cmd/cache.c > >> index 0254ff17f9b..16fa0f7c652 100644 > >> --- a/cmd/cache.c > >> +++ b/cmd/cache.c > >> @@ -52,11 +52,14 @@ static int do_icache(struct cmd_tbl *cmdtp, int flag, > >> int argc, > >> return 0; > >> } > >> > >> +/* ARM and RISC-V define a weak flush_dcache_all() themselves. */ > >> +#if !defined(CONFIG_ARM) && !defined(CONFIG_RISCV) > >> void __weak flush_dcache_all(void) > >> { > >> puts("No arch specific flush_dcache_all available!\n"); > >> /* please define arch specific flush_dcache_all */ > >> } > > > > Aren't we supposed to add a single __weak function so the linker can > > replace it? IOW why is the declaration for Arm/riscv a weak one? > > Some sub-architectures override the architecture specific weak > implementation, e.g. > > arch/riscv/cpu/andes/cache.c:44: > void flush_dcache_all(void) > > arch/arm/cpu/arm926ejs/cache.c:17: > void flush_dcache_all(void)
Ok, this does fix a problem, but afaict this is a band-aid and the cache management is a mess overall -- e.g invalidate_icache_all() will suffer from the same issue if a sub-architecture decides to define its own in the future. Would it be less bad to define static inline __weak flush_dcache_all(void) { } static inline __weak flush_icache_all(void) { } in include/cpu_func.h instead of a random cmd file? We can only define those if !CONFIG_ARM && !!CONFIG_RISCV and add a comment on why. It's kind of putting lipstick on a pig, but at least we'll have them gathered in a single header file and know what we have to fix. Cheers /Ilias > > Best regards > > Heinrich > > > > > Thanks > > /Ilias > >> +#endif > >> > >> static int do_dcache(struct cmd_tbl *cmdtp, int flag, int argc, > >> char *const argv[]) > >> -- > >> 2.43.0 > >> >