On Wed, Jan 4, 2023, at 12:56, Conor Dooley wrote: > On Wed, Jan 04, 2023 at 11:19:44AM +0100, Arnd Bergmann wrote: >> On Wed, Jan 4, 2023, at 10:23, Conor Dooley wrote: >> I would try to replace both of these indirections and instead >> handle it all from C code in arch_sync_dma_for_device() directly, >> for the purpose of readability and maintainability. >> static inline void dma_cache_clean(void *vaddr, size_t size) >> { >> if (!cache_maint_ops.clean) >> zicbom_cache_clean(vaddr, size, riscv_cbom_block_size); > > And I figure that this function is effectively a wrapper around ALT_CMO_OP()? > >> else >> cache_maint_ops.clean(vaddr, size, riscv_cbom_block_size); > > And this one gets registered by the driver using an interface like the > one I already proposed, just with the cache_maint_ops struct expanded? Yes, exactly. > Extrapolating, with these changes having an errata would not even be > needed in order to do cache maintenance. > Since the ALT_CMO_OP() version would only be used inside > zicbom_cache_clean(), assuming I understood correctly, a driver could > just register cache_maint_ops for a given platform without having to > muck around with errata. That is the idea, and ALT_CMO_OP() itself can just go away as by just putting the inline asm without the alternative into the zicbom_cache_clean() version, making the THEAD branch yet another cache_maint_ops instance. >> which then makes it very clear what the actual code path >> is, while leaving the zicbom case free of indirect function >> calls. You can still use a static_branch() to optimize the >> conditional, but I would try to avoid any extra indirection >> levels or errata checks. > > The other thing that I like about this is we can then remove the various > calls to ALT_CMO_OP() that are scattered around arch/riscv now & replace > them with functions that have more understandable names. I only see them in arch/riscv/mm/dma-noncoherent.c and arch/riscv/mm/pmem.c, but yes, both of these should just call the new functions, whatever the calling conventions end up being. Arnd