aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/agp/intel-gtt.c
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2010-08-29 11:35:30 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2010-09-08 16:20:18 -0400
commit2d2430cf9bf9e8b0ad9ea34a103625f4fe7e4477 (patch)
tree2beac383272109a7db261b88fd3de664f4b5348b /drivers/char/agp/intel-gtt.c
parent73800422a30e9b8b6e0e49c27af9e9d196e52fd9 (diff)
intel-gtt: consolidate i9xx setup
The only difference between i915 and i965 was the calculation of the gtt address. So merge these two paths into one. Otherwise the same changes as in the i830 setup consolidation. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers/char/agp/intel-gtt.c')
-rw-r--r--drivers/char/agp/intel-gtt.c154
1 files changed, 61 insertions, 93 deletions
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c
index fd977aa4a17d..7ac7d5cb3dc1 100644
--- a/drivers/char/agp/intel-gtt.c
+++ b/drivers/char/agp/intel-gtt.c
@@ -903,7 +903,13 @@ static void intel_enable_gtt(void)
903 903
904 ptetbl_addr = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000; 904 ptetbl_addr = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000;
905 905
906 pci_read_config_dword(intel_private.pcidev, I810_GMADDR, &gma_addr); 906 if (INTEL_GTT_GEN == 2)
907 pci_read_config_dword(intel_private.pcidev, I810_GMADDR,
908 &gma_addr);
909 else
910 pci_read_config_dword(intel_private.pcidev, I915_GMADDR,
911 &gma_addr);
912
907 intel_private.gma_bus_addr = (gma_addr & PCI_BASE_ADDRESS_MEM_MASK); 913 intel_private.gma_bus_addr = (gma_addr & PCI_BASE_ADDRESS_MEM_MASK);
908 914
909 pci_read_config_word(intel_private.bridge_dev, I830_GMCH_CTRL, &gmch_ctrl); 915 pci_read_config_word(intel_private.bridge_dev, I830_GMCH_CTRL, &gmch_ctrl);
@@ -1165,23 +1171,11 @@ static void intel_i9xx_setup_flush(void)
1165 1171
1166static int intel_i9xx_configure(void) 1172static int intel_i9xx_configure(void)
1167{ 1173{
1168 struct aper_size_info_fixed *current_size;
1169 u32 temp;
1170 u16 gmch_ctrl;
1171 int i; 1174 int i;
1172 1175
1173 current_size = A_SIZE_FIX(agp_bridge->current_size); 1176 intel_enable_gtt();
1174
1175 pci_read_config_dword(intel_private.pcidev, I915_GMADDR, &temp);
1176
1177 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1178
1179 pci_read_config_word(intel_private.bridge_dev, I830_GMCH_CTRL, &gmch_ctrl);
1180 gmch_ctrl |= I830_GMCH_ENABLED;
1181 pci_write_config_word(intel_private.bridge_dev, I830_GMCH_CTRL, gmch_ctrl);
1182 1177
1183 writel(agp_bridge->gatt_bus_addr|I810_PGETBL_ENABLED, intel_private.registers+I810_PGETBL_CTL); 1178 agp_bridge->gart_bus_addr = intel_private.gma_bus_addr;
1184 readl(intel_private.registers+I810_PGETBL_CTL); /* PCI Posting. */
1185 1179
1186 if (agp_bridge->driver->needs_scratch_page) { 1180 if (agp_bridge->driver->needs_scratch_page) {
1187 for (i = intel_private.base.gtt_stolen_entries; i < 1181 for (i = intel_private.base.gtt_stolen_entries; i <
@@ -1193,8 +1187,6 @@ static int intel_i9xx_configure(void)
1193 1187
1194 global_cache_flush(); 1188 global_cache_flush();
1195 1189
1196 intel_i9xx_setup_flush();
1197
1198 return 0; 1190 return 0;
1199} 1191}
1200 1192
@@ -1291,40 +1283,62 @@ static int intel_i915_remove_entries(struct agp_memory *mem, off_t pg_start,
1291 return 0; 1283 return 0;
1292} 1284}
1293 1285
1294/* The intel i915 automatically initializes the agp aperture during POST. 1286static int i9xx_setup(void)
1295 * Use the memory already set aside for in the GTT.
1296 */
1297static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge)
1298{ 1287{
1299 int page_order, ret; 1288 u32 reg_addr;
1300 struct aper_size_info_fixed *size;
1301 int num_entries;
1302 u32 temp, temp2;
1303
1304 size = agp_bridge->current_size;
1305 page_order = size->page_order;
1306 num_entries = size->num_entries;
1307 agp_bridge->gatt_table_real = NULL;
1308 1289
1309 pci_read_config_dword(intel_private.pcidev, I915_MMADDR, &temp); 1290 pci_read_config_dword(intel_private.pcidev, I915_MMADDR, &reg_addr);
1310 pci_read_config_dword(intel_private.pcidev, I915_PTEADDR, &temp2);
1311 1291
1312 temp &= 0xfff80000; 1292 reg_addr &= 0xfff80000;
1313 1293
1314 intel_private.registers = ioremap(temp, 128 * 4096); 1294 intel_private.registers = ioremap(reg_addr, 128 * 4096);
1315 if (!intel_private.registers) 1295 if (!intel_private.registers)
1316 return -ENOMEM; 1296 return -ENOMEM;
1317 1297
1318 intel_private.gtt_bus_addr = temp2; 1298 if (INTEL_GTT_GEN == 3) {
1319 temp = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000; 1299 u32 gtt_addr;
1300 pci_read_config_dword(intel_private.pcidev,
1301 I915_PTEADDR, &gtt_addr);
1302 intel_private.gtt_bus_addr = gtt_addr;
1303 } else {
1304 u32 gtt_offset;
1305
1306 switch (INTEL_GTT_GEN) {
1307 case 5:
1308 case 6:
1309 gtt_offset = MB(2);
1310 break;
1311 case 4:
1312 default:
1313 gtt_offset = KB(512);
1314 break;
1315 }
1316 intel_private.gtt_bus_addr = reg_addr + gtt_offset;
1317 }
1318
1319 intel_i9xx_setup_flush();
1320
1321 return 0;
1322}
1323
1324/* The intel i915 automatically initializes the agp aperture during POST.
1325 * Use the memory already set aside for in the GTT.
1326 */
1327static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge)
1328{
1329 int ret;
1330
1331 ret = intel_private.driver->setup();
1332 if (ret != 0)
1333 return ret;
1320 1334
1321 ret = intel_gtt_init(); 1335 ret = intel_gtt_init();
1322 if (ret != 0) 1336 if (ret != 0)
1323 return ret; 1337 return ret;
1324 1338
1339 agp_bridge->gatt_table_real = NULL;
1325 agp_bridge->gatt_table = NULL; 1340 agp_bridge->gatt_table = NULL;
1326 1341 agp_bridge->gatt_bus_addr = 0;
1327 agp_bridge->gatt_bus_addr = temp;
1328 1342
1329 return 0; 1343 return 0;
1330} 1344}
@@ -1358,59 +1372,6 @@ static unsigned long intel_gen6_mask_memory(struct agp_bridge_data *bridge,
1358 return addr | bridge->driver->masks[type].mask; 1372 return addr | bridge->driver->masks[type].mask;
1359} 1373}
1360 1374
1361static void intel_i965_get_gtt_range(int *gtt_offset)
1362{
1363 switch (INTEL_GTT_GEN) {
1364 case 5:
1365 case 6:
1366 *gtt_offset = MB(2);
1367 break;
1368 case 4:
1369 default:
1370 *gtt_offset = KB(512);
1371 break;
1372 }
1373}
1374
1375/* The intel i965 automatically initializes the agp aperture during POST.
1376 * Use the memory already set aside for in the GTT.
1377 */
1378static int intel_i965_create_gatt_table(struct agp_bridge_data *bridge)
1379{
1380 int page_order, ret;
1381 struct aper_size_info_fixed *size;
1382 int num_entries;
1383 u32 temp;
1384 int gtt_offset;
1385
1386 size = agp_bridge->current_size;
1387 page_order = size->page_order;
1388 num_entries = size->num_entries;
1389 agp_bridge->gatt_table_real = NULL;
1390
1391 pci_read_config_dword(intel_private.pcidev, I915_MMADDR, &temp);
1392
1393 temp &= 0xfff00000;
1394
1395 intel_private.registers = ioremap(temp, 128 * 4096);
1396 if (!intel_private.registers)
1397 return -ENOMEM;
1398
1399 intel_i965_get_gtt_range(&gtt_offset);
1400 intel_private.gtt_bus_addr = temp + gtt_offset;
1401 temp = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000;
1402
1403 ret = intel_gtt_init();
1404 if (ret != 0)
1405 return ret;
1406
1407 agp_bridge->gatt_table = NULL;
1408
1409 agp_bridge->gatt_bus_addr = temp;
1410
1411 return 0;
1412}
1413
1414static const struct agp_bridge_driver intel_810_driver = { 1375static const struct agp_bridge_driver intel_810_driver = {
1415 .owner = THIS_MODULE, 1376 .owner = THIS_MODULE,
1416 .aperture_sizes = intel_i810_sizes, 1377 .aperture_sizes = intel_i810_sizes,
@@ -1510,7 +1471,7 @@ static const struct agp_bridge_driver intel_i965_driver = {
1510 .masks = intel_i810_masks, 1471 .masks = intel_i810_masks,
1511 .agp_enable = intel_fake_agp_enable, 1472 .agp_enable = intel_fake_agp_enable,
1512 .cache_flush = global_cache_flush, 1473 .cache_flush = global_cache_flush,
1513 .create_gatt_table = intel_i965_create_gatt_table, 1474 .create_gatt_table = intel_i915_create_gatt_table,
1514 .free_gatt_table = intel_fake_agp_free_gatt_table, 1475 .free_gatt_table = intel_fake_agp_free_gatt_table,
1515 .insert_memory = intel_i915_insert_entries, 1476 .insert_memory = intel_i915_insert_entries,
1516 .remove_memory = intel_i915_remove_entries, 1477 .remove_memory = intel_i915_remove_entries,
@@ -1543,7 +1504,7 @@ static const struct agp_bridge_driver intel_gen6_driver = {
1543 .masks = intel_gen6_masks, 1504 .masks = intel_gen6_masks,
1544 .agp_enable = intel_fake_agp_enable, 1505 .agp_enable = intel_fake_agp_enable,
1545 .cache_flush = global_cache_flush, 1506 .cache_flush = global_cache_flush,
1546 .create_gatt_table = intel_i965_create_gatt_table, 1507 .create_gatt_table = intel_i915_create_gatt_table,
1547 .free_gatt_table = intel_fake_agp_free_gatt_table, 1508 .free_gatt_table = intel_fake_agp_free_gatt_table,
1548 .insert_memory = intel_i915_insert_entries, 1509 .insert_memory = intel_i915_insert_entries,
1549 .remove_memory = intel_i915_remove_entries, 1510 .remove_memory = intel_i915_remove_entries,
@@ -1602,27 +1563,34 @@ static const struct intel_gtt_driver i8xx_gtt_driver = {
1602}; 1563};
1603static const struct intel_gtt_driver i915_gtt_driver = { 1564static const struct intel_gtt_driver i915_gtt_driver = {
1604 .gen = 3, 1565 .gen = 3,
1566 .setup = i9xx_setup,
1605}; 1567};
1606static const struct intel_gtt_driver g33_gtt_driver = { 1568static const struct intel_gtt_driver g33_gtt_driver = {
1607 .gen = 3, 1569 .gen = 3,
1608 .is_g33 = 1, 1570 .is_g33 = 1,
1571 .setup = i9xx_setup,
1609}; 1572};
1610static const struct intel_gtt_driver pineview_gtt_driver = { 1573static const struct intel_gtt_driver pineview_gtt_driver = {
1611 .gen = 3, 1574 .gen = 3,
1612 .is_pineview = 1, .is_g33 = 1, 1575 .is_pineview = 1, .is_g33 = 1,
1576 .setup = i9xx_setup,
1613}; 1577};
1614static const struct intel_gtt_driver i965_gtt_driver = { 1578static const struct intel_gtt_driver i965_gtt_driver = {
1615 .gen = 4, 1579 .gen = 4,
1580 .setup = i9xx_setup,
1616}; 1581};
1617static const struct intel_gtt_driver g4x_gtt_driver = { 1582static const struct intel_gtt_driver g4x_gtt_driver = {
1618 .gen = 5, 1583 .gen = 5,
1584 .setup = i9xx_setup,
1619}; 1585};
1620static const struct intel_gtt_driver ironlake_gtt_driver = { 1586static const struct intel_gtt_driver ironlake_gtt_driver = {
1621 .gen = 5, 1587 .gen = 5,
1622 .is_ironlake = 1, 1588 .is_ironlake = 1,
1589 .setup = i9xx_setup,
1623}; 1590};
1624static const struct intel_gtt_driver sandybridge_gtt_driver = { 1591static const struct intel_gtt_driver sandybridge_gtt_driver = {
1625 .gen = 6, 1592 .gen = 6,
1593 .setup = i9xx_setup,
1626}; 1594};
1627 1595
1628/* Table to describe Intel GMCH and AGP/PCIE GART drivers. At least one of 1596/* Table to describe Intel GMCH and AGP/PCIE GART drivers. At least one of