So one of the sources seem to be nouveau_exa_prepare_access performing operations directly on the bo, which works but screws up due to tiling. The fix would be to do similar to nouveau_exa_download_from_screen and nouveau_exa_upload_to_screen with a scratch bo to fix up tiling. In this case it would be possible without the extra memcpy since the scratch bo could be operated on directly.
So one of the sources seem to be nouveau_ exa_prepare_ access performing operations directly on the bo, which works but screws up due to tiling. The fix would be to do similar to nouveau_ exa_download_ from_screen and nouveau_ exa_upload_ to_screen with a scratch bo to fix up tiling. In this case it would be possible without the extra memcpy since the scratch bo could be operated on directly.