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? > 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. Although, given the discussion elsewhere about just falling back to zicbom in the absence of specific ops, most of these functions will probably disappear (if not all of them). Cheers, Conor.
Attachment:
signature.asc
Description: PGP signature