Hello Yann,

On 03.03.21 10:33, Yann Sionneau wrote:
> On 03/03/2021 10:14, Lucas Stach wrote:
>>> Right now we aren't using any driver that require dma_alloc_coherent,
>>> but we use drivers that requires dma_alloc and dma_map_single instead.
>> I would vote for a BUILD_BUG_ON_MSG in this function, so you get a
>> compile time error and you can state what needs to be done in order to
>> get rid of the failure.
> 
> If we define the function and put a BUILD_BUG_ON_MSG() inside, I am guessing 
> that all builds will fail, right?
> 
> But we only want the builds that actually call this function to fail.
> 
> Maybe we can just define dma_alloc_coherent() as being a macro, to 
> BUILD_BUG_ON_MSG.
> 
> Like:
> 
> #define dma_alloc_coherent(a, b) BUILD_BUG_ON_MSG(1, "dma_alloc_coherent is 
> not supported yet on KVX. You would need to add MMU support to be able to map 
> uncached pages")

If the macro is expanded, it will fail. Even if the code is ultimately unused 
because
of linker section garbage collection. You could define dma_alloc_coherent with 
following
body:

{
        extern void *coherent_allocation_not_implemented_on_kvx(void);
        /* You would need to add MMU support to be able to map uncached pages */
        return coherent_allocation_not_implemented_on_kvx();
}

If after linker GC, a reference to dma_alloc_coherent remains, you will get a 
linker
error explaining why.

Cheers,
Ahmad

> 
> What do you think?
> 
>>
>>>>>> +/*
>>>>>> + * The implementation of arch should follow the following rules:
>>>>>> + *        map        for_cpu        for_device    unmap
>>>>>> + * TO_DEV    writeback    none        writeback    none
>>>>>> + * FROM_DEV    invalidate    invalidate(*)    invalidate    
>>>>>> invalidate(*)
>>>>>> + * BIDIR    writeback    invalidate    writeback    invalidate
>>>>>> + *
>>>>>> + * (*) - only necessary if the CPU speculatively prefetches.
>>>>>> + *
>>>>>> + * (see https://lkml.org/lkml/2018/5/18/979)
>>>>>> + */
>>>>>> +
>>>>>> +void dma_sync_single_for_device(dma_addr_t addr, size_t size,
>>>>>> +                enum dma_data_direction dir)
>>>>>> +{
>>>>>> +    switch (dir) {
>>>>>> +    case DMA_FROM_DEVICE:
>>>>>> +        kvx_dcache_invalidate_mem_area(addr, size);
>>>> Why do you need to explicitly invalidate, but not flush? Even if the
>>>> CPU speculatively prefetches, the coherency protocol should make sure
>>>> to invalidate the speculatively loaded lines, right?
>>> Since we don't have a coherent memory, here we need to invalidate L1
>>> dcache to let the CPU see deivce's writes in memory.
>>> Also every write goes through the cache, flush is not required.
>> Ah, if all your caches are write-through that makes sense. Can you add
>> a comment somewhere stating that this implementation assumes WT caches
>> on KVX? This way we can avoid the confusion Ahamd and myself fell into
>> when glancing over the code.
>>
>> Regards,
>> Lucas
>>
>>
> 
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to