diff options
Diffstat (limited to 'drivers/char/agp/intel-gtt.c')
| -rw-r--r-- | drivers/char/agp/intel-gtt.c | 66 |
1 files changed, 48 insertions, 18 deletions
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c index d22ffb811bf2..75e0a3497888 100644 --- a/drivers/char/agp/intel-gtt.c +++ b/drivers/char/agp/intel-gtt.c | |||
| @@ -49,6 +49,26 @@ static struct gatt_mask intel_i810_masks[] = | |||
| 49 | .type = INTEL_AGP_CACHED_MEMORY} | 49 | .type = INTEL_AGP_CACHED_MEMORY} |
| 50 | }; | 50 | }; |
| 51 | 51 | ||
| 52 | #define INTEL_AGP_UNCACHED_MEMORY 0 | ||
| 53 | #define INTEL_AGP_CACHED_MEMORY_LLC 1 | ||
| 54 | #define INTEL_AGP_CACHED_MEMORY_LLC_GFDT 2 | ||
| 55 | #define INTEL_AGP_CACHED_MEMORY_LLC_MLC 3 | ||
| 56 | #define INTEL_AGP_CACHED_MEMORY_LLC_MLC_GFDT 4 | ||
| 57 | |||
| 58 | static struct gatt_mask intel_gen6_masks[] = | ||
| 59 | { | ||
| 60 | {.mask = I810_PTE_VALID | GEN6_PTE_UNCACHED, | ||
| 61 | .type = INTEL_AGP_UNCACHED_MEMORY }, | ||
| 62 | {.mask = I810_PTE_VALID | GEN6_PTE_LLC, | ||
| 63 | .type = INTEL_AGP_CACHED_MEMORY_LLC }, | ||
| 64 | {.mask = I810_PTE_VALID | GEN6_PTE_LLC | GEN6_PTE_GFDT, | ||
| 65 | .type = INTEL_AGP_CACHED_MEMORY_LLC_GFDT }, | ||
| 66 | {.mask = I810_PTE_VALID | GEN6_PTE_LLC_MLC, | ||
| 67 | .type = INTEL_AGP_CACHED_MEMORY_LLC_MLC }, | ||
| 68 | {.mask = I810_PTE_VALID | GEN6_PTE_LLC_MLC | GEN6_PTE_GFDT, | ||
| 69 | .type = INTEL_AGP_CACHED_MEMORY_LLC_MLC_GFDT }, | ||
| 70 | }; | ||
| 71 | |||
| 52 | static struct _intel_private { | 72 | static struct _intel_private { |
| 53 | struct pci_dev *pcidev; /* device one */ | 73 | struct pci_dev *pcidev; /* device one */ |
| 54 | u8 __iomem *registers; | 74 | u8 __iomem *registers; |
| @@ -178,13 +198,6 @@ static void intel_agp_insert_sg_entries(struct agp_memory *mem, | |||
| 178 | off_t pg_start, int mask_type) | 198 | off_t pg_start, int mask_type) |
| 179 | { | 199 | { |
| 180 | int i, j; | 200 | int i, j; |
| 181 | u32 cache_bits = 0; | ||
| 182 | |||
| 183 | if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB || | ||
| 184 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB) | ||
| 185 | { | ||
| 186 | cache_bits = GEN6_PTE_LLC_MLC; | ||
| 187 | } | ||
| 188 | 201 | ||
| 189 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 202 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { |
| 190 | writel(agp_bridge->driver->mask_memory(agp_bridge, | 203 | writel(agp_bridge->driver->mask_memory(agp_bridge, |
| @@ -317,6 +330,23 @@ static int intel_i830_type_to_mask_type(struct agp_bridge_data *bridge, | |||
| 317 | return 0; | 330 | return 0; |
| 318 | } | 331 | } |
| 319 | 332 | ||
| 333 | static int intel_gen6_type_to_mask_type(struct agp_bridge_data *bridge, | ||
| 334 | int type) | ||
| 335 | { | ||
| 336 | unsigned int type_mask = type & ~AGP_USER_CACHED_MEMORY_GFDT; | ||
| 337 | unsigned int gfdt = type & AGP_USER_CACHED_MEMORY_GFDT; | ||
| 338 | |||
| 339 | if (type_mask == AGP_USER_UNCACHED_MEMORY) | ||
| 340 | return INTEL_AGP_UNCACHED_MEMORY; | ||
| 341 | else if (type_mask == AGP_USER_CACHED_MEMORY_LLC_MLC) | ||
| 342 | return gfdt ? INTEL_AGP_CACHED_MEMORY_LLC_MLC_GFDT : | ||
| 343 | INTEL_AGP_CACHED_MEMORY_LLC_MLC; | ||
| 344 | else /* set 'normal'/'cached' to LLC by default */ | ||
| 345 | return gfdt ? INTEL_AGP_CACHED_MEMORY_LLC_GFDT : | ||
| 346 | INTEL_AGP_CACHED_MEMORY_LLC; | ||
| 347 | } | ||
| 348 | |||
| 349 | |||
| 320 | static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start, | 350 | static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start, |
| 321 | int type) | 351 | int type) |
| 322 | { | 352 | { |
| @@ -588,8 +618,7 @@ static void intel_i830_init_gtt_entries(void) | |||
| 588 | gtt_entries = 0; | 618 | gtt_entries = 0; |
| 589 | break; | 619 | break; |
| 590 | } | 620 | } |
| 591 | } else if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB || | 621 | } else if (IS_SNB) { |
| 592 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB) { | ||
| 593 | /* | 622 | /* |
| 594 | * SandyBridge has new memory control reg at 0x50.w | 623 | * SandyBridge has new memory control reg at 0x50.w |
| 595 | */ | 624 | */ |
| @@ -1068,11 +1097,11 @@ static void intel_i9xx_setup_flush(void) | |||
| 1068 | intel_i915_setup_chipset_flush(); | 1097 | intel_i915_setup_chipset_flush(); |
| 1069 | } | 1098 | } |
| 1070 | 1099 | ||
| 1071 | if (intel_private.ifp_resource.start) { | 1100 | if (intel_private.ifp_resource.start) |
| 1072 | intel_private.i9xx_flush_page = ioremap_nocache(intel_private.ifp_resource.start, PAGE_SIZE); | 1101 | intel_private.i9xx_flush_page = ioremap_nocache(intel_private.ifp_resource.start, PAGE_SIZE); |
| 1073 | if (!intel_private.i9xx_flush_page) | 1102 | if (!intel_private.i9xx_flush_page) |
| 1074 | dev_info(&intel_private.pcidev->dev, "can't ioremap flush page - no chipset flushing"); | 1103 | dev_err(&intel_private.pcidev->dev, |
| 1075 | } | 1104 | "can't ioremap flush page - no chipset flushing\n"); |
| 1076 | } | 1105 | } |
| 1077 | 1106 | ||
| 1078 | static int intel_i9xx_configure(void) | 1107 | static int intel_i9xx_configure(void) |
| @@ -1163,7 +1192,7 @@ static int intel_i915_insert_entries(struct agp_memory *mem, off_t pg_start, | |||
| 1163 | 1192 | ||
| 1164 | mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type); | 1193 | mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type); |
| 1165 | 1194 | ||
| 1166 | if (mask_type != 0 && mask_type != AGP_PHYS_MEMORY && | 1195 | if (!IS_SNB && mask_type != 0 && mask_type != AGP_PHYS_MEMORY && |
| 1167 | mask_type != INTEL_AGP_CACHED_MEMORY) | 1196 | mask_type != INTEL_AGP_CACHED_MEMORY) |
| 1168 | goto out_err; | 1197 | goto out_err; |
| 1169 | 1198 | ||
| @@ -1333,8 +1362,8 @@ static unsigned long intel_i965_mask_memory(struct agp_bridge_data *bridge, | |||
| 1333 | static unsigned long intel_gen6_mask_memory(struct agp_bridge_data *bridge, | 1362 | static unsigned long intel_gen6_mask_memory(struct agp_bridge_data *bridge, |
| 1334 | dma_addr_t addr, int type) | 1363 | dma_addr_t addr, int type) |
| 1335 | { | 1364 | { |
| 1336 | /* Shift high bits down */ | 1365 | /* gen6 has bit11-4 for physical addr bit39-32 */ |
| 1337 | addr |= (addr >> 28) & 0xff; | 1366 | addr |= (addr >> 28) & 0xff0; |
| 1338 | 1367 | ||
| 1339 | /* Type checking must be done elsewhere */ | 1368 | /* Type checking must be done elsewhere */ |
| 1340 | return addr | bridge->driver->masks[type].mask; | 1369 | return addr | bridge->driver->masks[type].mask; |
| @@ -1359,6 +1388,7 @@ static void intel_i965_get_gtt_range(int *gtt_offset, int *gtt_size) | |||
| 1359 | break; | 1388 | break; |
| 1360 | case PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB: | 1389 | case PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB: |
| 1361 | case PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB: | 1390 | case PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB: |
| 1391 | case PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_HB: | ||
| 1362 | *gtt_offset = MB(2); | 1392 | *gtt_offset = MB(2); |
| 1363 | 1393 | ||
| 1364 | pci_read_config_word(intel_private.pcidev, SNB_GMCH_CTRL, &snb_gmch_ctl); | 1394 | pci_read_config_word(intel_private.pcidev, SNB_GMCH_CTRL, &snb_gmch_ctl); |
| @@ -1563,7 +1593,7 @@ static const struct agp_bridge_driver intel_gen6_driver = { | |||
| 1563 | .fetch_size = intel_i9xx_fetch_size, | 1593 | .fetch_size = intel_i9xx_fetch_size, |
| 1564 | .cleanup = intel_i915_cleanup, | 1594 | .cleanup = intel_i915_cleanup, |
| 1565 | .mask_memory = intel_gen6_mask_memory, | 1595 | .mask_memory = intel_gen6_mask_memory, |
| 1566 | .masks = intel_i810_masks, | 1596 | .masks = intel_gen6_masks, |
| 1567 | .agp_enable = intel_i810_agp_enable, | 1597 | .agp_enable = intel_i810_agp_enable, |
| 1568 | .cache_flush = global_cache_flush, | 1598 | .cache_flush = global_cache_flush, |
| 1569 | .create_gatt_table = intel_i965_create_gatt_table, | 1599 | .create_gatt_table = intel_i965_create_gatt_table, |
| @@ -1576,7 +1606,7 @@ static const struct agp_bridge_driver intel_gen6_driver = { | |||
| 1576 | .agp_alloc_pages = agp_generic_alloc_pages, | 1606 | .agp_alloc_pages = agp_generic_alloc_pages, |
| 1577 | .agp_destroy_page = agp_generic_destroy_page, | 1607 | .agp_destroy_page = agp_generic_destroy_page, |
| 1578 | .agp_destroy_pages = agp_generic_destroy_pages, | 1608 | .agp_destroy_pages = agp_generic_destroy_pages, |
| 1579 | .agp_type_to_mask_type = intel_i830_type_to_mask_type, | 1609 | .agp_type_to_mask_type = intel_gen6_type_to_mask_type, |
| 1580 | .chipset_flush = intel_i915_chipset_flush, | 1610 | .chipset_flush = intel_i915_chipset_flush, |
| 1581 | #ifdef USE_PCI_DMA_API | 1611 | #ifdef USE_PCI_DMA_API |
| 1582 | .agp_map_page = intel_agp_map_page, | 1612 | .agp_map_page = intel_agp_map_page, |
