12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- /*
- * Copyright (C) 2015 Regents of the University of California
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation, version 2.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
- #ifndef _ASM_RISCV_CACHEFLUSH_H
- #define _ASM_RISCV_CACHEFLUSH_H
- #include <asm-generic/cacheflush.h>
- #undef flush_icache_range
- #undef flush_icache_user_range
- #undef flush_dcache_page
- static inline void local_flush_icache_all(void)
- {
- asm volatile ("fence.i" ::: "memory");
- }
- #define PG_dcache_clean PG_arch_1
- static inline void flush_dcache_page(struct page *page)
- {
- if (test_bit(PG_dcache_clean, &page->flags))
- clear_bit(PG_dcache_clean, &page->flags);
- }
- /*
- * RISC-V doesn't have an instruction to flush parts of the instruction cache,
- * so instead we just flush the whole thing.
- */
- #define flush_icache_range(start, end) flush_icache_all()
- #define flush_icache_user_range(vma, pg, addr, len) flush_icache_all()
- #ifndef CONFIG_SMP
- #define flush_icache_all() local_flush_icache_all()
- #define flush_icache_mm(mm, local) flush_icache_all()
- #else /* CONFIG_SMP */
- #define flush_icache_all() sbi_remote_fence_i(0)
- void flush_icache_mm(struct mm_struct *mm, bool local);
- #endif /* CONFIG_SMP */
- #endif /* _ASM_RISCV_CACHEFLUSH_H */
|