参照元†
返り値†
/*
* v7_dma_inv_range(start,end)
*
* Invalidate the data cache within the specified region; we will
* be performing a DMA operation in this region and we want to
* purge old data in the cache.
*
* - start - virtual start address of region
* - end - virtual end address of region
*/
v7_dma_inv_range:
dcache_line_size r2, r3
sub r3, r2, #1
tst r0, r3
bic r0, r0, r3
#ifdef CONFIG_ARM_ERRATA_764369
ALT_SMP(W(dsb))
ALT_UP(W(nop))
#endif
mcrne p15, 0, r0, c7, c14, 1 @ clean & invalidate D / U line
- cp15 CRn=c7, opc1=0, CRm=c14, opc2=1, DCCIMVAC レジスタ
- データまたは統一キャッシュを clean & invalidate する。
- つまり Dirty なら書き出してからキャッシュを破棄。Clean なら破棄。
- レジスタのデータ(このコードは r0 を渡している)は仮想アドレスとして解釈される。
tst r1, r3
bic r1, r1, r3
mcrne p15, 0, r1, c7, c14, 1 @ clean & invalidate D / U line
1:
mcr p15, 0, r0, c7, c6, 1 @ invalidate D / U line
- cp15 CRn=c7, opc1=0, CRm=c6, opc2=1, DCIMVAC レジスタ
- データまたは統一キャッシュを invalidate する。
- つまり Dirty でも Clean でも破棄。
- レジスタのデータ(このコードは r0 を渡している)は仮想アドレスとして解釈される。
add r0, r0, r2
cmp r0, r1
blo 1b
dsb st
ret lr
ENDPROC(v7_dma_inv_range)
コメント†