===== arch/ia64/kernel/efi.c 1.39 vs edited ===== --- 1.39/arch/ia64/kernel/efi.c 2004-10-26 16:43:15 -07:00 +++ edited/arch/ia64/kernel/efi.c 2005-01-19 13:39:56 -08:00 @@ -751,6 +751,27 @@ return 0; } +/** + * efi_range_is_wc - check the WC bit on an address range + * @start: starting kvirt address + * @len: length of range + * + * Consult the EFI memory map and make sure it's ok to set this range WC. + * Returns true or false. + */ +int efi_range_is_wc(unsigned long start, unsigned long len) +{ + int i; + + for (i = 0; i < len; i++) { + unsigned long paddr = __pa(start + i); + if (!(efi_mem_attributes(paddr) & EFI_MEMORY_WC)) + return 0; + } + /* The range checked out */ + return 1; +} + int valid_phys_addr_range (unsigned long phys_addr, unsigned long *size) { ===== arch/ia64/pci/pci.c 1.65 vs edited ===== --- 1.65/arch/ia64/pci/pci.c 2005-01-12 10:08:48 -08:00 +++ edited/arch/ia64/pci/pci.c 2005-01-19 11:09:32 -08:00 @@ -539,7 +539,8 @@ */ vma->vm_flags |= (VM_SHM | VM_RESERVED | VM_IO); - if (write_combine) + if (write_combine && efi_range_is_wc(vma->vm_start, + vma->vm_end - vma->vm_start)) vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); else vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); ===== drivers/video/fbmem.c 1.148 vs edited ===== --- 1.148/drivers/video/fbmem.c 2005-01-05 15:46:41 -08:00 +++ edited/drivers/video/fbmem.c 2005-01-19 11:12:48 -08:00 @@ -35,6 +35,7 @@ #include #include #include +#include #if defined(__mc68000__) || defined(CONFIG_APUS) #include @@ -950,9 +951,14 @@ vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); #elif defined(__hppa__) pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE; -#elif defined(__ia64__) || defined(__arm__) || defined(__sh__) || \ +#elif defined(__arm__) || defined(__sh__) || \ defined(__m32r__) vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); +#elif defined(__ia64) + if (efi_range_is_wc(vma->vm_start, vma->vm_end - vma->vm_start)) + pgprot_writecombine(vma->vm_page_prot); + else + pgprot_noncached(vma->vm_page_prot); #else #warning What do we have to do here?? #endif ===== include/linux/efi.h 1.12 vs edited ===== --- 1.12/include/linux/efi.h 2004-11-18 23:03:10 -08:00 +++ edited/include/linux/efi.h 2005-01-19 11:09:25 -08:00 @@ -304,6 +304,7 @@ extern unsigned long __init efi_get_time(void); extern int __init efi_set_rtc_mmss(unsigned long nowtime); extern struct efi_memory_map memmap; +extern int efi_range_is_wc(unsigned long start, unsigned long len); #ifdef CONFIG_EFI_PCDP extern int __init efi_setup_pcdp_console(char *);