Add pre-DMA-write barrier after data is stored to memory
authorratchov <ratchov@openbsd.org>
Tue, 18 May 2021 10:02:00 +0000 (10:02 +0000)
committerratchov <ratchov@openbsd.org>
Tue, 18 May 2021 10:02:00 +0000 (10:02 +0000)
commitc48a03f1dc8ce161a6e680c6ea64ba3754ed572f
tree92f9ccf953f9e929f44238a1f191deb263714684
parenta177c6b81a3ae8747833ac143bf883b7d6f03d32
Add pre-DMA-write barrier after data is stored to memory

There's already such a barrier in usbd_transfer() code-path, but this
one is called when the frames are queued to the HC ring. The audio
samples are stored in memory by userland later, *after* the frames are
scheduled (but before they are sent on the wire) so a barrier is
needed there. Without this change, the data produced by userland may
stay in the CPU caches and is not "seen" by the HC's DMA engine, in
turn the device plays noise on certain arm64 machines (RPI4, for
instance).

Fix mostly from Luca Castagnini with few tweaks from me. OK patrick@
sys/dev/usb/uaudio.c