diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-01-21 05:54:32 -0500 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-01-24 13:26:25 -0500 |
commit | bee4a186c16bed0d7e91425ca9356c2e8c015f8d (patch) | |
tree | 66d01e18c48fb0dfd9970c169d0f5baa0adaa0fe /drivers/char | |
parent | 934f992c763ae1e5eefcce8af769c16444085df7 (diff) |
drm/i915,agp/intel: Do not clear stolen entries
We can only utilize the stolen portion of the GTT if we are in sole
charge of the hardware. This is only true if using GEM and KMS,
otherwise VESA continues to access stolen memory.
Reported-by: Arnd Bergmann <arnd@arndb.de>
Reported-by: Frederic Weisbecker <fweisbec@gmail.com>
Tested-by: Jiri Olsa <jolsa@redhat.com>
Tested-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/agp/intel-gtt.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c index 826ab0939a12..fab3d3265adb 100644 --- a/drivers/char/agp/intel-gtt.c +++ b/drivers/char/agp/intel-gtt.c | |||
@@ -68,6 +68,7 @@ static struct _intel_private { | |||
68 | phys_addr_t gma_bus_addr; | 68 | phys_addr_t gma_bus_addr; |
69 | u32 PGETBL_save; | 69 | u32 PGETBL_save; |
70 | u32 __iomem *gtt; /* I915G */ | 70 | u32 __iomem *gtt; /* I915G */ |
71 | bool clear_fake_agp; /* on first access via agp, fill with scratch */ | ||
71 | int num_dcache_entries; | 72 | int num_dcache_entries; |
72 | union { | 73 | union { |
73 | void __iomem *i9xx_flush_page; | 74 | void __iomem *i9xx_flush_page; |
@@ -869,21 +870,12 @@ static int intel_fake_agp_free_gatt_table(struct agp_bridge_data *bridge) | |||
869 | 870 | ||
870 | static int intel_fake_agp_configure(void) | 871 | static int intel_fake_agp_configure(void) |
871 | { | 872 | { |
872 | int i; | ||
873 | |||
874 | if (!intel_enable_gtt()) | 873 | if (!intel_enable_gtt()) |
875 | return -EIO; | 874 | return -EIO; |
876 | 875 | ||
876 | intel_private.clear_fake_agp = true; | ||
877 | agp_bridge->gart_bus_addr = intel_private.gma_bus_addr; | 877 | agp_bridge->gart_bus_addr = intel_private.gma_bus_addr; |
878 | 878 | ||
879 | for (i = 0; i < intel_private.base.gtt_total_entries; i++) { | ||
880 | intel_private.driver->write_entry(intel_private.scratch_page_dma, | ||
881 | i, 0); | ||
882 | } | ||
883 | readl(intel_private.gtt+i-1); /* PCI Posting. */ | ||
884 | |||
885 | global_cache_flush(); | ||
886 | |||
887 | return 0; | 879 | return 0; |
888 | } | 880 | } |
889 | 881 | ||
@@ -945,6 +937,13 @@ static int intel_fake_agp_insert_entries(struct agp_memory *mem, | |||
945 | { | 937 | { |
946 | int ret = -EINVAL; | 938 | int ret = -EINVAL; |
947 | 939 | ||
940 | if (intel_private.clear_fake_agp) { | ||
941 | int start = intel_private.base.stolen_size / PAGE_SIZE; | ||
942 | int end = intel_private.base.gtt_mappable_entries; | ||
943 | intel_gtt_clear_range(start, end - start); | ||
944 | intel_private.clear_fake_agp = false; | ||
945 | } | ||
946 | |||
948 | if (INTEL_GTT_GEN == 1 && type == AGP_DCACHE_MEMORY) | 947 | if (INTEL_GTT_GEN == 1 && type == AGP_DCACHE_MEMORY) |
949 | return i810_insert_dcache_entries(mem, pg_start, type); | 948 | return i810_insert_dcache_entries(mem, pg_start, type); |
950 | 949 | ||