diff options
Diffstat (limited to 'drivers/char/agp/intel-gtt.c')
| -rw-r--r-- | drivers/char/agp/intel-gtt.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c index 6b6760ea2435..29ac6d499fa6 100644 --- a/drivers/char/agp/intel-gtt.c +++ b/drivers/char/agp/intel-gtt.c | |||
| @@ -812,8 +812,10 @@ static int intel_fake_agp_fetch_size(void) | |||
| 812 | 812 | ||
| 813 | static void i830_cleanup(void) | 813 | static void i830_cleanup(void) |
| 814 | { | 814 | { |
| 815 | kunmap(intel_private.i8xx_page); | 815 | if (intel_private.i8xx_flush_page) { |
| 816 | intel_private.i8xx_flush_page = NULL; | 816 | kunmap(intel_private.i8xx_flush_page); |
| 817 | intel_private.i8xx_flush_page = NULL; | ||
| 818 | } | ||
| 817 | 819 | ||
| 818 | __free_page(intel_private.i8xx_page); | 820 | __free_page(intel_private.i8xx_page); |
| 819 | intel_private.i8xx_page = NULL; | 821 | intel_private.i8xx_page = NULL; |
| @@ -1190,12 +1192,19 @@ static void i9xx_chipset_flush(void) | |||
| 1190 | writel(1, intel_private.i9xx_flush_page); | 1192 | writel(1, intel_private.i9xx_flush_page); |
| 1191 | } | 1193 | } |
| 1192 | 1194 | ||
| 1193 | static void i965_write_entry(dma_addr_t addr, unsigned int entry, | 1195 | static void i965_write_entry(dma_addr_t addr, |
| 1196 | unsigned int entry, | ||
| 1194 | unsigned int flags) | 1197 | unsigned int flags) |
| 1195 | { | 1198 | { |
| 1199 | u32 pte_flags; | ||
| 1200 | |||
| 1201 | pte_flags = I810_PTE_VALID; | ||
| 1202 | if (flags == AGP_USER_CACHED_MEMORY) | ||
| 1203 | pte_flags |= I830_PTE_SYSTEM_CACHED; | ||
| 1204 | |||
| 1196 | /* Shift high bits down */ | 1205 | /* Shift high bits down */ |
| 1197 | addr |= (addr >> 28) & 0xf0; | 1206 | addr |= (addr >> 28) & 0xf0; |
| 1198 | writel(addr | I810_PTE_VALID, intel_private.gtt + entry); | 1207 | writel(addr | pte_flags, intel_private.gtt + entry); |
| 1199 | } | 1208 | } |
| 1200 | 1209 | ||
| 1201 | static bool gen6_check_flags(unsigned int flags) | 1210 | static bool gen6_check_flags(unsigned int flags) |
| @@ -1210,14 +1219,14 @@ static void gen6_write_entry(dma_addr_t addr, unsigned int entry, | |||
| 1210 | unsigned int gfdt = flags & AGP_USER_CACHED_MEMORY_GFDT; | 1219 | unsigned int gfdt = flags & AGP_USER_CACHED_MEMORY_GFDT; |
| 1211 | u32 pte_flags; | 1220 | u32 pte_flags; |
| 1212 | 1221 | ||
| 1213 | if (type_mask == AGP_USER_UNCACHED_MEMORY) | 1222 | if (type_mask == AGP_USER_MEMORY) |
| 1214 | pte_flags = GEN6_PTE_UNCACHED | I810_PTE_VALID; | 1223 | pte_flags = GEN6_PTE_UNCACHED | I810_PTE_VALID; |
| 1215 | else if (type_mask == AGP_USER_CACHED_MEMORY_LLC_MLC) { | 1224 | else if (type_mask == AGP_USER_CACHED_MEMORY_LLC_MLC) { |
| 1216 | pte_flags = GEN6_PTE_LLC | I810_PTE_VALID; | 1225 | pte_flags = GEN6_PTE_LLC_MLC | I810_PTE_VALID; |
| 1217 | if (gfdt) | 1226 | if (gfdt) |
| 1218 | pte_flags |= GEN6_PTE_GFDT; | 1227 | pte_flags |= GEN6_PTE_GFDT; |
| 1219 | } else { /* set 'normal'/'cached' to LLC by default */ | 1228 | } else { /* set 'normal'/'cached' to LLC by default */ |
| 1220 | pte_flags = GEN6_PTE_LLC_MLC | I810_PTE_VALID; | 1229 | pte_flags = GEN6_PTE_LLC | I810_PTE_VALID; |
| 1221 | if (gfdt) | 1230 | if (gfdt) |
| 1222 | pte_flags |= GEN6_PTE_GFDT; | 1231 | pte_flags |= GEN6_PTE_GFDT; |
| 1223 | } | 1232 | } |
