Hi Conor, Thank you for the review. On Fri, Mar 31, 2023 at 1:24 PM Conor Dooley <conor.dooley@xxxxxxxxxxxxx> wrote: > > Hey, > > I think most of what I wanted to talk about has been raised by Arnd or > Geert, so I kinda only have a couple of small comments for you here. > > On Thu, Mar 30, 2023 at 09:42:12PM +0100, Prabhakar wrote: > > From: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx> > > > > Currently, selecting which CMOs to use on a given platform is done using > > and ALTERNATIVE_X() macro. This was manageable when there were just two > > CMO implementations, but now that there are more and more platforms coming > > needing custom CMOs, the use of the ALTERNATIVE_X() macro is unmanageable. > > > > To avoid such issues this patch switches to use of function pointers > > instead of ALTERNATIVE_X() macro for cache management (the only drawback > > being performance over the previous approach). > > > > void (*clean_range)(unsigned long addr, unsigned long size); > > void (*inv_range)(unsigned long addr, unsigned long size); > > void (*flush_range)(unsigned long addr, unsigned long size); > > So, given Arnd has renamed the generic helpers, should we use the > writeback/invalidate/writeback & invalidate terminology here too? > I think it'd be nice to make the "driver" functions match the generic > implementations's names (even though that means not making the > instruction naming). > > > The above function pointers are provided to be overridden for platforms > > needing CMO. > > > > Convert ZICBOM and T-HEAD CMO to use function pointers. > > > > Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx> > > --- > > v6->v7 > > * Updated commit description > > * Fixed build issues when CONFIG_ERRATA_THEAD_CMO=n > > * Used static const struct ptr to register CMO ops > > * Dropped riscv_dma_noncoherent_cmo_ops > > > * Moved ZICBOM CMO setup to setup.c > > Why'd you do that? > What is the reason that the Zicbom stuff cannot live in > dma-noncoherent.[ch] and only expose, say: > void riscv_cbom_register_cmo_ops(void) > { > riscv_noncoherent_register_cache_ops(&zicbom_cmo_ops); > } > which you then call from setup.c? > Commit abcc445acd ("riscv: move riscv_noncoherent_supported() out of ZICBOM probe) moved the zicbom the setup to setup.c hence I moved the CMO stuff here. Said that, now I am defaulting to zicbom ops so I have mode the functions to dma-noncoherent.c . > > v5->v6 > > * New patch > > --- > > arch/riscv/errata/thead/errata.c | 76 ++++++++++++++++++++++++ > > arch/riscv/include/asm/dma-noncoherent.h | 73 +++++++++++++++++++++++ > > arch/riscv/include/asm/errata_list.h | 53 ----------------- > > arch/riscv/kernel/setup.c | 49 ++++++++++++++- > > arch/riscv/mm/dma-noncoherent.c | 25 ++++++-- > > arch/riscv/mm/pmem.c | 6 +- > > 6 files changed, 221 insertions(+), 61 deletions(-) > > create mode 100644 arch/riscv/include/asm/dma-noncoherent.h > > > +#ifdef CONFIG_RISCV_ISA_ZICBOM > > + > > +#define ZICBOM_CMO_OP(_op, _start, _size, _cachesize) \ > > + asm volatile("mv a0, %1\n\t" \ > > + "j 2f\n\t" \ > > + "3:\n\t" \ > > + CBO_##_op(a0) \ > > + "add a0, a0, %0\n\t" \ > > + "2:\n\t" \ > > + "bltu a0, %2, 3b\n\t" \ > > + : : "r"(_cachesize), \ > > + "r"((unsigned long)(_start) & ~((_cachesize) - 1UL)), \ > > + "r"((unsigned long)(_start) + (_size)) \ > > + : "a0") > > + > > +static void zicbom_cmo_clean_range(unsigned long addr, unsigned long size) > > +{ > > + ZICBOM_CMO_OP(clean, addr, size, riscv_cbom_block_size); > > +} > > + > > +static void zicbom_cmo_flush_range(unsigned long addr, unsigned long size) > > +{ > > + ZICBOM_CMO_OP(flush, addr, size, riscv_cbom_block_size); > > +} > > + > > +static void zicbom_cmo_inval_range(unsigned long addr, unsigned long size) > > +{ > > + ZICBOM_CMO_OP(inval, addr, size, riscv_cbom_block_size); > > +} > > + > > +const struct riscv_cache_ops zicbom_cmo_ops = { > > + .clean_range = &zicbom_cmo_clean_range, > > + .inv_range = &zicbom_cmo_inval_range, > > + .flush_range = &zicbom_cmo_flush_range, > > +}; > > + > > +static void zicbom_register_cmo_ops(void) > > +{ > > + riscv_noncoherent_register_cache_ops(&zicbom_cmo_ops); > > +} > > +#else > > +static void zicbom_register_cmo_ops(void) {} > > +#endif > > I think all of the above should be prefixed with riscv_cbom to match the > other riscv_cbom stuff we already have. Just to clarify, the riscv_cbom prefix should just be applied to the ZICOM functions and not to T-HEAD? Cheers, Prabhakar