aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/agp
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/agp')
-rw-r--r--drivers/char/agp/intel-gtt.c105
1 files changed, 13 insertions, 92 deletions
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c
index 44722c6790b2..bb222d5f322b 100644
--- a/drivers/char/agp/intel-gtt.c
+++ b/drivers/char/agp/intel-gtt.c
@@ -69,20 +69,6 @@ static struct gatt_mask intel_i810_masks[] =
69#define INTEL_AGP_CACHED_MEMORY_LLC_MLC 3 69#define INTEL_AGP_CACHED_MEMORY_LLC_MLC 3
70#define INTEL_AGP_CACHED_MEMORY_LLC_MLC_GFDT 4 70#define INTEL_AGP_CACHED_MEMORY_LLC_MLC_GFDT 4
71 71
72static struct gatt_mask intel_gen6_masks[] =
73{
74 {.mask = I810_PTE_VALID | GEN6_PTE_UNCACHED,
75 .type = INTEL_AGP_UNCACHED_MEMORY },
76 {.mask = I810_PTE_VALID | GEN6_PTE_LLC,
77 .type = INTEL_AGP_CACHED_MEMORY_LLC },
78 {.mask = I810_PTE_VALID | GEN6_PTE_LLC | GEN6_PTE_GFDT,
79 .type = INTEL_AGP_CACHED_MEMORY_LLC_GFDT },
80 {.mask = I810_PTE_VALID | GEN6_PTE_LLC_MLC,
81 .type = INTEL_AGP_CACHED_MEMORY_LLC_MLC },
82 {.mask = I810_PTE_VALID | GEN6_PTE_LLC_MLC | GEN6_PTE_GFDT,
83 .type = INTEL_AGP_CACHED_MEMORY_LLC_MLC_GFDT },
84};
85
86struct intel_gtt_driver { 72struct intel_gtt_driver {
87 unsigned int gen : 8; 73 unsigned int gen : 8;
88 unsigned int is_g33 : 1; 74 unsigned int is_g33 : 1;
@@ -287,34 +273,6 @@ static void i8xx_destroy_pages(struct page *page)
287 atomic_dec(&agp_bridge->current_memory_agp); 273 atomic_dec(&agp_bridge->current_memory_agp);
288} 274}
289 275
290static int intel_i830_type_to_mask_type(struct agp_bridge_data *bridge,
291 int type)
292{
293 if (type < AGP_USER_TYPES)
294 return type;
295 else if (type == AGP_USER_CACHED_MEMORY)
296 return INTEL_AGP_CACHED_MEMORY;
297 else
298 return 0;
299}
300
301static int intel_gen6_type_to_mask_type(struct agp_bridge_data *bridge,
302 int type)
303{
304 unsigned int type_mask = type & ~AGP_USER_CACHED_MEMORY_GFDT;
305 unsigned int gfdt = type & AGP_USER_CACHED_MEMORY_GFDT;
306
307 if (type_mask == AGP_USER_UNCACHED_MEMORY)
308 return INTEL_AGP_UNCACHED_MEMORY;
309 else if (type_mask == AGP_USER_CACHED_MEMORY_LLC_MLC)
310 return gfdt ? INTEL_AGP_CACHED_MEMORY_LLC_MLC_GFDT :
311 INTEL_AGP_CACHED_MEMORY_LLC_MLC;
312 else /* set 'normal'/'cached' to LLC by default */
313 return gfdt ? INTEL_AGP_CACHED_MEMORY_LLC_GFDT :
314 INTEL_AGP_CACHED_MEMORY_LLC;
315}
316
317
318static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start, 276static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start,
319 int type) 277 int type)
320{ 278{
@@ -1290,35 +1248,6 @@ static int i9xx_setup(void)
1290 return 0; 1248 return 0;
1291} 1249}
1292 1250
1293/*
1294 * The i965 supports 36-bit physical addresses, but to keep
1295 * the format of the GTT the same, the bits that don't fit
1296 * in a 32-bit word are shifted down to bits 4..7.
1297 *
1298 * Gcc is smart enough to notice that "(addr >> 28) & 0xf0"
1299 * is always zero on 32-bit architectures, so no need to make
1300 * this conditional.
1301 */
1302static unsigned long intel_i965_mask_memory(struct agp_bridge_data *bridge,
1303 dma_addr_t addr, int type)
1304{
1305 /* Shift high bits down */
1306 addr |= (addr >> 28) & 0xf0;
1307
1308 /* Type checking must be done elsewhere */
1309 return addr | bridge->driver->masks[type].mask;
1310}
1311
1312static unsigned long intel_gen6_mask_memory(struct agp_bridge_data *bridge,
1313 dma_addr_t addr, int type)
1314{
1315 /* gen6 has bit11-4 for physical addr bit39-32 */
1316 addr |= (addr >> 28) & 0xff0;
1317
1318 /* Type checking must be done elsewhere */
1319 return addr | bridge->driver->masks[type].mask;
1320}
1321
1322static const struct agp_bridge_driver intel_810_driver = { 1251static const struct agp_bridge_driver intel_810_driver = {
1323 .owner = THIS_MODULE, 1252 .owner = THIS_MODULE,
1324 .aperture_sizes = intel_i810_sizes, 1253 .aperture_sizes = intel_i810_sizes,
@@ -1353,8 +1282,6 @@ static const struct agp_bridge_driver intel_830_driver = {
1353 .configure = intel_fake_agp_configure, 1282 .configure = intel_fake_agp_configure,
1354 .fetch_size = intel_fake_agp_fetch_size, 1283 .fetch_size = intel_fake_agp_fetch_size,
1355 .cleanup = intel_gtt_cleanup, 1284 .cleanup = intel_gtt_cleanup,
1356 .mask_memory = intel_i810_mask_memory,
1357 .masks = intel_i810_masks,
1358 .agp_enable = intel_fake_agp_enable, 1285 .agp_enable = intel_fake_agp_enable,
1359 .cache_flush = global_cache_flush, 1286 .cache_flush = global_cache_flush,
1360 .create_gatt_table = intel_fake_agp_create_gatt_table, 1287 .create_gatt_table = intel_fake_agp_create_gatt_table,
@@ -1367,7 +1294,6 @@ static const struct agp_bridge_driver intel_830_driver = {
1367 .agp_alloc_pages = agp_generic_alloc_pages, 1294 .agp_alloc_pages = agp_generic_alloc_pages,
1368 .agp_destroy_page = agp_generic_destroy_page, 1295 .agp_destroy_page = agp_generic_destroy_page,
1369 .agp_destroy_pages = agp_generic_destroy_pages, 1296 .agp_destroy_pages = agp_generic_destroy_pages,
1370 .agp_type_to_mask_type = intel_i830_type_to_mask_type,
1371 .chipset_flush = intel_i830_chipset_flush, 1297 .chipset_flush = intel_i830_chipset_flush,
1372}; 1298};
1373 1299
@@ -1379,8 +1305,6 @@ static const struct agp_bridge_driver intel_915_driver = {
1379 .configure = intel_fake_agp_configure, 1305 .configure = intel_fake_agp_configure,
1380 .fetch_size = intel_fake_agp_fetch_size, 1306 .fetch_size = intel_fake_agp_fetch_size,
1381 .cleanup = intel_gtt_cleanup, 1307 .cleanup = intel_gtt_cleanup,
1382 .mask_memory = intel_i810_mask_memory,
1383 .masks = intel_i810_masks,
1384 .agp_enable = intel_fake_agp_enable, 1308 .agp_enable = intel_fake_agp_enable,
1385 .cache_flush = global_cache_flush, 1309 .cache_flush = global_cache_flush,
1386 .create_gatt_table = intel_fake_agp_create_gatt_table, 1310 .create_gatt_table = intel_fake_agp_create_gatt_table,
@@ -1393,7 +1317,6 @@ static const struct agp_bridge_driver intel_915_driver = {
1393 .agp_alloc_pages = agp_generic_alloc_pages, 1317 .agp_alloc_pages = agp_generic_alloc_pages,
1394 .agp_destroy_page = agp_generic_destroy_page, 1318 .agp_destroy_page = agp_generic_destroy_page,
1395 .agp_destroy_pages = agp_generic_destroy_pages, 1319 .agp_destroy_pages = agp_generic_destroy_pages,
1396 .agp_type_to_mask_type = intel_i830_type_to_mask_type,
1397 .chipset_flush = intel_i915_chipset_flush, 1320 .chipset_flush = intel_i915_chipset_flush,
1398}; 1321};
1399 1322
@@ -1405,8 +1328,6 @@ static const struct agp_bridge_driver intel_i965_driver = {
1405 .configure = intel_fake_agp_configure, 1328 .configure = intel_fake_agp_configure,
1406 .fetch_size = intel_fake_agp_fetch_size, 1329 .fetch_size = intel_fake_agp_fetch_size,
1407 .cleanup = intel_gtt_cleanup, 1330 .cleanup = intel_gtt_cleanup,
1408 .mask_memory = intel_i965_mask_memory,
1409 .masks = intel_i810_masks,
1410 .agp_enable = intel_fake_agp_enable, 1331 .agp_enable = intel_fake_agp_enable,
1411 .cache_flush = global_cache_flush, 1332 .cache_flush = global_cache_flush,
1412 .create_gatt_table = intel_fake_agp_create_gatt_table, 1333 .create_gatt_table = intel_fake_agp_create_gatt_table,
@@ -1419,7 +1340,6 @@ static const struct agp_bridge_driver intel_i965_driver = {
1419 .agp_alloc_pages = agp_generic_alloc_pages, 1340 .agp_alloc_pages = agp_generic_alloc_pages,
1420 .agp_destroy_page = agp_generic_destroy_page, 1341 .agp_destroy_page = agp_generic_destroy_page,
1421 .agp_destroy_pages = agp_generic_destroy_pages, 1342 .agp_destroy_pages = agp_generic_destroy_pages,
1422 .agp_type_to_mask_type = intel_i830_type_to_mask_type,
1423 .chipset_flush = intel_i915_chipset_flush, 1343 .chipset_flush = intel_i915_chipset_flush,
1424}; 1344};
1425 1345
@@ -1431,8 +1351,6 @@ static const struct agp_bridge_driver intel_gen6_driver = {
1431 .configure = intel_fake_agp_configure, 1351 .configure = intel_fake_agp_configure,
1432 .fetch_size = intel_fake_agp_fetch_size, 1352 .fetch_size = intel_fake_agp_fetch_size,
1433 .cleanup = intel_gtt_cleanup, 1353 .cleanup = intel_gtt_cleanup,
1434 .mask_memory = intel_gen6_mask_memory,
1435 .masks = intel_gen6_masks,
1436 .agp_enable = intel_fake_agp_enable, 1354 .agp_enable = intel_fake_agp_enable,
1437 .cache_flush = global_cache_flush, 1355 .cache_flush = global_cache_flush,
1438 .create_gatt_table = intel_fake_agp_create_gatt_table, 1356 .create_gatt_table = intel_fake_agp_create_gatt_table,
@@ -1445,7 +1363,6 @@ static const struct agp_bridge_driver intel_gen6_driver = {
1445 .agp_alloc_pages = agp_generic_alloc_pages, 1363 .agp_alloc_pages = agp_generic_alloc_pages,
1446 .agp_destroy_page = agp_generic_destroy_page, 1364 .agp_destroy_page = agp_generic_destroy_page,
1447 .agp_destroy_pages = agp_generic_destroy_pages, 1365 .agp_destroy_pages = agp_generic_destroy_pages,
1448 .agp_type_to_mask_type = intel_gen6_type_to_mask_type,
1449 .chipset_flush = intel_i915_chipset_flush, 1366 .chipset_flush = intel_i915_chipset_flush,
1450}; 1367};
1451 1368
@@ -1457,8 +1374,6 @@ static const struct agp_bridge_driver intel_g33_driver = {
1457 .configure = intel_fake_agp_configure, 1374 .configure = intel_fake_agp_configure,
1458 .fetch_size = intel_fake_agp_fetch_size, 1375 .fetch_size = intel_fake_agp_fetch_size,
1459 .cleanup = intel_gtt_cleanup, 1376 .cleanup = intel_gtt_cleanup,
1460 .mask_memory = intel_i965_mask_memory,
1461 .masks = intel_i810_masks,
1462 .agp_enable = intel_fake_agp_enable, 1377 .agp_enable = intel_fake_agp_enable,
1463 .cache_flush = global_cache_flush, 1378 .cache_flush = global_cache_flush,
1464 .create_gatt_table = intel_fake_agp_create_gatt_table, 1379 .create_gatt_table = intel_fake_agp_create_gatt_table,
@@ -1471,10 +1386,12 @@ static const struct agp_bridge_driver intel_g33_driver = {
1471 .agp_alloc_pages = agp_generic_alloc_pages, 1386 .agp_alloc_pages = agp_generic_alloc_pages,
1472 .agp_destroy_page = agp_generic_destroy_page, 1387 .agp_destroy_page = agp_generic_destroy_page,
1473 .agp_destroy_pages = agp_generic_destroy_pages, 1388 .agp_destroy_pages = agp_generic_destroy_pages,
1474 .agp_type_to_mask_type = intel_i830_type_to_mask_type,
1475 .chipset_flush = intel_i915_chipset_flush, 1389 .chipset_flush = intel_i915_chipset_flush,
1476}; 1390};
1477 1391
1392static const struct intel_gtt_driver i81x_gtt_driver = {
1393 .gen = 1,
1394};
1478static const struct intel_gtt_driver i8xx_gtt_driver = { 1395static const struct intel_gtt_driver i8xx_gtt_driver = {
1479 .gen = 2, 1396 .gen = 2,
1480 .setup = i830_setup, 1397 .setup = i830_setup,
@@ -1538,10 +1455,14 @@ static const struct intel_gtt_driver_description {
1538 const struct agp_bridge_driver *gmch_driver; 1455 const struct agp_bridge_driver *gmch_driver;
1539 const struct intel_gtt_driver *gtt_driver; 1456 const struct intel_gtt_driver *gtt_driver;
1540} intel_gtt_chipsets[] = { 1457} intel_gtt_chipsets[] = {
1541 { PCI_DEVICE_ID_INTEL_82810_IG1, "i810", &intel_810_driver , NULL}, 1458 { PCI_DEVICE_ID_INTEL_82810_IG1, "i810", &intel_810_driver,
1542 { PCI_DEVICE_ID_INTEL_82810_IG3, "i810", &intel_810_driver , NULL}, 1459 &i81x_gtt_driver},
1543 { PCI_DEVICE_ID_INTEL_82810E_IG, "i810", &intel_810_driver , NULL}, 1460 { PCI_DEVICE_ID_INTEL_82810_IG3, "i810", &intel_810_driver,
1544 { PCI_DEVICE_ID_INTEL_82815_CGC, "i815", &intel_810_driver , NULL}, 1461 &i81x_gtt_driver},
1462 { PCI_DEVICE_ID_INTEL_82810E_IG, "i810", &intel_810_driver,
1463 &i81x_gtt_driver},
1464 { PCI_DEVICE_ID_INTEL_82815_CGC, "i815", &intel_810_driver,
1465 &i81x_gtt_driver},
1545 { PCI_DEVICE_ID_INTEL_82830_CGC, "830M", 1466 { PCI_DEVICE_ID_INTEL_82830_CGC, "830M",
1546 &intel_830_driver , &i8xx_gtt_driver}, 1467 &intel_830_driver , &i8xx_gtt_driver},
1547 { PCI_DEVICE_ID_INTEL_82845G_IG, "830M", 1468 { PCI_DEVICE_ID_INTEL_82845G_IG, "830M",
@@ -1664,9 +1585,9 @@ int intel_gmch_probe(struct pci_dev *pdev,
1664 1585
1665 dev_info(&pdev->dev, "Intel %s Chipset\n", intel_gtt_chipsets[i].name); 1586 dev_info(&pdev->dev, "Intel %s Chipset\n", intel_gtt_chipsets[i].name);
1666 1587
1667 if (bridge->driver->mask_memory == intel_gen6_mask_memory) 1588 if (intel_private.driver->write_entry == gen6_write_entry)
1668 mask = 40; 1589 mask = 40;
1669 else if (bridge->driver->mask_memory == intel_i965_mask_memory) 1590 else if (intel_private.driver->write_entry == i965_write_entry)
1670 mask = 36; 1591 mask = 36;
1671 else 1592 else
1672 mask = 32; 1593 mask = 32;