aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/agp
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/agp')
-rw-r--r--drivers/char/agp/intel-agp.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
index c17291715031..e8dc75fc33cc 100644
--- a/drivers/char/agp/intel-agp.c
+++ b/drivers/char/agp/intel-agp.c
@@ -682,23 +682,39 @@ static void intel_i830_setup_flush(void)
682 if (!intel_private.i8xx_page) 682 if (!intel_private.i8xx_page)
683 return; 683 return;
684 684
685 /* make page uncached */
686 map_page_into_agp(intel_private.i8xx_page);
687
688 intel_private.i8xx_flush_page = kmap(intel_private.i8xx_page); 685 intel_private.i8xx_flush_page = kmap(intel_private.i8xx_page);
689 if (!intel_private.i8xx_flush_page) 686 if (!intel_private.i8xx_flush_page)
690 intel_i830_fini_flush(); 687 intel_i830_fini_flush();
691} 688}
692 689
690static void
691do_wbinvd(void *null)
692{
693 wbinvd();
694}
695
696/* The chipset_flush interface needs to get data that has already been
697 * flushed out of the CPU all the way out to main memory, because the GPU
698 * doesn't snoop those buffers.
699 *
700 * The 8xx series doesn't have the same lovely interface for flushing the
701 * chipset write buffers that the later chips do. According to the 865
702 * specs, it's 64 octwords, or 1KB. So, to get those previous things in
703 * that buffer out, we just fill 1KB and clflush it out, on the assumption
704 * that it'll push whatever was in there out. It appears to work.
705 */
693static void intel_i830_chipset_flush(struct agp_bridge_data *bridge) 706static void intel_i830_chipset_flush(struct agp_bridge_data *bridge)
694{ 707{
695 unsigned int *pg = intel_private.i8xx_flush_page; 708 unsigned int *pg = intel_private.i8xx_flush_page;
696 int i;
697 709
698 for (i = 0; i < 256; i += 2) 710 memset(pg, 0, 1024);
699 *(pg + i) = i;
700 711
701 wmb(); 712 if (cpu_has_clflush) {
713 clflush_cache_range(pg, 1024);
714 } else {
715 if (on_each_cpu(do_wbinvd, NULL, 1) != 0)
716 printk(KERN_ERR "Timed out waiting for cache flush.\n");
717 }
702} 718}
703 719
704/* The intel i830 automatically initializes the agp aperture during POST. 720/* The intel i830 automatically initializes the agp aperture during POST.