/* * __inval_cache_range(start, end) * - start - start address of region * - end - end address of region */ ENTRY(__inval_cache_range) dcache_line_size x2, x3 sub x3, x2, #1 tst x1, x3 // end cache line aligned? bic x1, x1, x3 b.eq 1f dc civac, x1 // clean & invalidate D / U line 1: tst x0, x3 // start cache line aligned? bic x0, x0, x3 b.eq 2f dc civac, x0 // clean & invalidate D / U line b 3f 2: dc ivac, x0 // invalidate D / U line 3: add x0, x0, x2 cmp x0, x1 b.lo 2b dsb sy ret ENDPIPROC(__inval_cache_range)
好家伙,死在cache里。
看下临近的sdhci_pre_dma_transfer:
staticintsdhci_pre_dma_transfer(struct sdhci_host *host, struct mmc_data *data, int cookie) { int sg_count;
/* * If the data buffers are already mapped, return the previous * dma_map_sg() result. */ if (data->host_cookie == COOKIE_PRE_MAPPED) return data->sg_count;