void __glue(_CACHE, _dma_map_area)(const void *start, size_t sz, int direction) { if (direction == DMA_FROM_DEVICE) l4_cache_inv_data((unsigned long)start, (unsigned long)start + sz); else l4_cache_clean_data((unsigned long)start, (unsigned long)start + sz); }
void __glue(_CACHE, _coherent_user_range)(unsigned long start, unsigned long end) { pgd_t *pgd; if (current->mm) pgd = (pgd_t *)current->mm->pgd; else if (current->active_mm) pgd = (pgd_t *)current->active_mm->pgd; else { printk("active_mm: No mm... %lx-%lx\n", start, end); return; } for (start &= PAGE_MASK; start < end; start += PAGE_SIZE) { pte_t *ptep = lookup_pte(pgd, start); if (ptep && pte_present(*ptep) && pte_mapped(*ptep)) { unsigned long k = pte_pfn(*ptep) << PAGE_SHIFT; unsigned long e = k + PAGE_SIZE; l4_cache_clean_data(k, e); } } }
void cpu_dcache_clean_area(void *addr, int sz) { l4_cache_clean_data((unsigned long)addr, (unsigned long)addr + sz - 1); }
void __glue(_CACHE, _flush_kern_dcache_area)(void *x, size_t size) { l4_cache_clean_data((unsigned long)x, (unsigned long)x + size - 1); }