#ifndef _ASM_CACHEFLUSH_H_
#define _ASM_CACHEFLUSH_H_
#include <asm/special_insns.h>
#include <vm/pmap.h>
#include <vm/vm_page.h>
static inline int
set_memory_uc(unsigned long addr, int numpages)
{
pmap_change_attr(addr, numpages, PAT_UNCACHED);
return 0;
}
static inline int set_memory_wc(unsigned long vaddr, int numpages)
{
pmap_change_attr(vaddr, numpages, PAT_WRITE_COMBINING);
return 0;
}
static inline int set_memory_wb(unsigned long vaddr, int numpages)
{
pmap_change_attr(vaddr, numpages, PAT_WRITE_BACK);
return 0;
}
static inline int set_pages_uc(struct page *page, int num_pages)
{
struct vm_page *p = (struct vm_page *)page;
pmap_change_attr(PHYS_TO_DMAP(VM_PAGE_TO_PHYS(p)),
num_pages, PAT_UNCACHED);
return 0;
}
static inline int set_pages_wb(struct page *page, int num_pages)
{
struct vm_page *p = (struct vm_page *)page;
pmap_change_attr(PHYS_TO_DMAP(VM_PAGE_TO_PHYS(p)),
num_pages, PAT_WRITE_BACK);
return 0;
}
static inline int
set_pages_array_uc(struct page **pages, int addrinarray)
{
for (int i = 0; i < addrinarray; i++)
pmap_page_set_memattr((struct vm_page *)pages[i], VM_MEMATTR_UNCACHEABLE);
return 0;
}
static inline int
set_pages_array_wb(struct page **pages, int addrinarray)
{
for (int i = 0; i < addrinarray; i++)
pmap_page_set_memattr((struct vm_page *)pages[i], VM_MEMATTR_WRITE_BACK);
return 0;
}
static inline int
set_pages_array_wc(struct page **pages, int addrinarray)
{
for (int i = 0; i < addrinarray; i++)
pmap_page_set_memattr((struct vm_page *)pages[i], VM_MEMATTR_WRITE_COMBINING);
return 0;
}
#endif