Partial cacheline flush problems on ARM and MIPS
Warner Losh
imp at bsdimp.com
Sun Aug 26 23:15:30 UTC 2012
On Aug 26, 2012, at 12:53 PM, Tim Kientzle wrote:
>
> On Sun, Aug 26, 2012 at 12:42 PM, Ian Lepore
> <freebsd at damnhippie.dyndns.org> wrote:
>> On Thu, 2012-08-23 at 22:00 -0600, Warner Losh wrote:
>>> The bottom line is that you can't mix things like that when cache
>>> lines are involved.
>>>
>> …. I think we should more explicitly spell out
>> what the appropriate sequences are.
>
>
> As someone who is just tinkering with driver code for
> the first time, I applaud any attempts to better document
> this area! ;-)
>
>> In particular:
>>
>> * The PRE and POST operations must occur in pairs; a PREREAD must
>> be followed eventually by a POSTREAD and a PREWRITE must be
>> followed by a POSTWRITE.
>> * The CPU is not allowed to access the mapped memory after a PRE
>> sync and before the corresponding POST sync.
>> * The DMA hardware is not allowed to access the mapped memory
>> after a POST sync and before the next PRE sync.
>
>
> These rules sound reasonable. Good documentation might
> also give examples of what the PRE/POST operations might entail
> (e.g., from the preceding discussion, it sounds like PREREAD
> and PREWRITE require at least a partial cache flush on ARM).
> That helps folks who are coming to the docs with some hardware
> background.
>
>> * Read and write sync operators may be combined in a single call,
>> PRE and POST operators may not be. E.G., PREREAD|PREWRITE is
>> allowed, PREREAD|POSTREAD is not. We should note that while
>> read and write operations may be combined, on some platforms
>> PREREAD|PREWRITE is needlessly expensive when only a read is
>> being performed.
>
>
> PREREAD|POSTREAD doesn't sound useful to me, but
> why would it be explicitly forbidden?
It could be useful when DMAing from multiple devices. Let's say I have a buffer that I want to get data from two different DMA operations. Wouldn't this be how you'd specify it?
> Would you also forbid POSTREAD|PREWRITE?
> (For a buffer that has just completed a DMA read
> and is going to be immediately used for a DMA write?)
This could be useful for some zero-copy things, no?
Warner
> Tim
>
> _______________________________________________
> freebsd-arm at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-arm
> To unsubscribe, send any mail to "freebsd-arm-unsubscribe at freebsd.org"
More information about the freebsd-arm
mailing list