diff --git a/arch/x86/configs/goldfish_defconfig b/arch/x86/configs/goldfish_defconfig
index 37a575b27fb9fdc0ce179c216dd2b390338f5287..91533cc8ac8abb7bdfdc56968b24413c7657d840 100644
--- a/arch/x86/configs/goldfish_defconfig
+++ b/arch/x86/configs/goldfish_defconfig
@@ -1461,7 +1461,7 @@ CONFIG_FB_TILEBLITTING=y
 # CONFIG_FB_PM3 is not set
 # CONFIG_FB_CARMINE is not set
 # CONFIG_FB_GEODE is not set
-# CONFIG_FB_GOLDFISH is not set
+CONFIG_FB_GOLDFISH=y
 # CONFIG_FB_VIRTUAL is not set
 # CONFIG_FB_METRONOME is not set
 # CONFIG_FB_MB862XX is not set
diff --git a/drivers/video/goldfishfb.c b/drivers/video/goldfishfb.c
index 9090758f936318b454856f6ff61305b33ceed51d..45d1fe36a23c72c5d2399637e8198ff51646441a 100644
--- a/drivers/video/goldfishfb.c
+++ b/drivers/video/goldfishfb.c
@@ -30,7 +30,11 @@
 #include <linux/android_power.h>
 #endif
 
+#ifdef	CONFIG_X86
+#include <asm/mtrr.h>
+#else
 #include <mach/hardware.h>
+#endif
 
 enum {
 	FB_GET_WIDTH        = 0x00,
@@ -48,7 +52,7 @@ enum {
 };
 
 struct goldfish_fb {
-	uint32_t reg_base;
+	void __iomem *reg_base;
 	int irq;
 	spinlock_t lock;
 	wait_queue_head_t wait;
@@ -208,7 +212,11 @@ static int goldfish_fb_probe(struct platform_device *pdev)
 		ret = -ENODEV;
 		goto err_no_io_base;
 	}
-	fb->reg_base = IO_ADDRESS(r->start - IO_START);
+#ifdef CONFIG_ARM
+	fb->reg_base = (void __iomem *)IO_ADDRESS(r->start - IO_START);
+#elif CONFIG_X86
+	fb->reg_base = ioremap(r->start, PAGE_SIZE);
+#endif
 
 	fb->irq = platform_get_irq(pdev, 0);
 	if(fb->irq < 0) {
@@ -237,6 +245,7 @@ static int goldfish_fb_probe(struct platform_device *pdev)
 	fb->fb.var.activate	= FB_ACTIVATE_NOW;
 	fb->fb.var.height	= readl(fb->reg_base + FB_GET_PHYS_HEIGHT);
 	fb->fb.var.width	= readl(fb->reg_base + FB_GET_PHYS_WIDTH);
+	fb->fb.var.pixclock	= 10000;
 
 	fb->fb.var.red.offset = 11;
 	fb->fb.var.red.length = 5;
@@ -246,13 +255,21 @@ static int goldfish_fb_probe(struct platform_device *pdev)
 	fb->fb.var.blue.length = 5;
 
 	framesize = width * height * 2 * 2;
+#ifdef CONFIG_ARM
 	fb->fb.screen_base = dma_alloc_writecombine(&pdev->dev, framesize,
 	                                            &fbpaddr, GFP_KERNEL);
+#elif	CONFIG_X86
+	fb->fb.screen_base = dma_alloc_coherent(NULL, framesize,
+						&fbpaddr, GFP_KERNEL);
+#endif
 	printk("allocating frame buffer %d * %d, got %p\n", width, height, fb->fb.screen_base);
 	if(fb->fb.screen_base == 0) {
 		ret = -ENOMEM;
 		goto err_alloc_screen_base_failed;
 	}
+#ifdef CONFIG_X86
+	mtrr_add(fbpaddr, framesize, MTRR_TYPE_WRBACK, 1);
+#endif
 	fb->fb.fix.smem_start = fbpaddr;
 	fb->fb.fix.smem_len = framesize;
 
@@ -284,9 +301,16 @@ err_register_framebuffer_failed:
 	free_irq(fb->irq, fb);
 err_request_irq_failed:
 err_fb_set_var_failed:
+#ifdef	CONFIG_ARM
 	dma_free_writecombine(&pdev->dev, framesize, fb->fb.screen_base, fb->fb.fix.smem_start);
+#elif	CONFIG_X86
+	dma_free_coherent(NULL, framesize, fb->fb.screen_base, fb->fb.fix.smem_start);
+#endif
 err_alloc_screen_base_failed:
 err_no_irq:
+#ifdef	CONFIG_X86
+	iounmap(fb->reg_base);
+#endif
 err_no_io_base:
 	kfree(fb);
 err_fb_alloc_failed:
@@ -305,8 +329,13 @@ static int goldfish_fb_remove(struct platform_device *pdev)
 #endif
 	unregister_framebuffer(&fb->fb);
 	free_irq(fb->irq, fb);
+#ifdef	CONFIG_ARM
 	dma_free_writecombine(&pdev->dev, framesize, fb->fb.screen_base, fb->fb.fix.smem_start);
 	kfree(fb);
+#elif	CONFIG_X86
+	dma_free_coherent(NULL, framesize, fb->fb.screen_base, fb->fb.fix.smem_start);
+	iounmap(fb->reg_base);
+#endif
 	return 0;
 }