#include <linux/module.h>
 #include <linux/io.h>
 
-#ifdef CONFIG_X86
-#include <asm/mtrr.h>
-#endif
 #ifdef CONFIG_MIPS
 #include <asm/addrspace.h>
 #endif
 
        if (gbe_mem_phys) {
                /* memory was allocated at boot time */
-               gbe_mem = devm_ioremap_nocache(&p_dev->dev, gbe_mem_phys,
-                                              gbe_mem_size);
+               gbe_mem = devm_ioremap_wc(&p_dev->dev, gbe_mem_phys,
+                                         gbe_mem_size);
                if (!gbe_mem) {
                        printk(KERN_ERR "gbefb: couldn't map framebuffer\n");
                        ret = -ENOMEM;
        } else {
                /* try to allocate memory with the classical allocator
                 * this has high chance to fail on low memory machines */
-               gbe_mem = dma_alloc_coherent(NULL, gbe_mem_size, &gbe_dma_addr,
-                                            GFP_KERNEL);
+               gbe_mem = dma_alloc_writecombine(NULL, gbe_mem_size,
+                                                &gbe_dma_addr, GFP_KERNEL);
                if (!gbe_mem) {
                        printk(KERN_ERR "gbefb: couldn't allocate framebuffer memory\n");
                        ret = -ENOMEM;
        }
 
        par = info->par;
-#ifdef CONFIG_X86
-       par->wc_cookie = mtrr_add(gbe_mem_phys, gbe_mem_size,
-                                  MTRR_TYPE_WRCOMB, 1);
-#endif
+       par->wc_cookie = arch_phys_wc_add(gbe_mem_phys, gbe_mem_size);
 
        /* map framebuffer memory into tiles table */
        for (i = 0; i < (gbe_mem_size >> TILE_SHIFT); i++)
        return 0;
 
 out_gbe_unmap:
-#ifdef CONFIG_MTRR
-       if (par->wc_cookie >= 0)
-               mtrr_del(par->wc_cookie, 0, 0);
-#endif
+       arch_phys_wc_del(par->wc_cookie);
        if (gbe_dma_addr)
-               dma_free_coherent(NULL, gbe_mem_size, gbe_mem, gbe_mem_phys);
+               dma_free_writecombine(NULL, gbe_mem_size, gbe_mem, gbe_mem_phys);
 out_tiles_free:
        dma_free_coherent(NULL, GBE_TLB_SIZE * sizeof(uint16_t),
                          (void *)gbe_tiles.cpu, gbe_tiles.dma);
 
        unregister_framebuffer(info);
        gbe_turn_off();
-#ifdef CONFIG_MTRR
-       if (par->wc_cookie >= 0)
-               mtrr_del(par->wc_cookie, 0, 0);
-#endif
+       arch_phys_wc_del(par->wc_cookie);
        if (gbe_dma_addr)
-               dma_free_coherent(NULL, gbe_mem_size, gbe_mem, gbe_mem_phys);
+               dma_free_writecombine(NULL, gbe_mem_size, gbe_mem, gbe_mem_phys);
        dma_free_coherent(NULL, GBE_TLB_SIZE * sizeof(uint16_t),
                          (void *)gbe_tiles.cpu, gbe_tiles.dma);
        release_mem_region(GBE_BASE, sizeof(struct sgi_gbe));