Rev 3298 | Rev 3482 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3298 | Rev 3480 | ||
---|---|---|---|
Line 995... | Line 995... | ||
995 | value = 1; |
995 | value = 1; |
996 | break; |
996 | break; |
997 | case I915_PARAM_HAS_PINNED_BATCHES: |
997 | case I915_PARAM_HAS_PINNED_BATCHES: |
998 | value = 1; |
998 | value = 1; |
999 | break; |
999 | break; |
- | 1000 | case I915_PARAM_HAS_EXEC_NO_RELOC: |
|
- | 1001 | value = 1; |
|
- | 1002 | break; |
|
- | 1003 | case I915_PARAM_HAS_EXEC_HANDLE_LUT: |
|
- | 1004 | value = 1; |
|
- | 1005 | break; |
|
1000 | default: |
1006 | default: |
1001 | DRM_DEBUG_DRIVER("Unknown parameter %d\n", |
1007 | DRM_DEBUG_DRIVER("Unknown parameter %d\n", |
1002 | param->param); |
1008 | param->param); |
1003 | return -EINVAL; |
1009 | return -EINVAL; |
1004 | } |
1010 | } |
Line 1049... | Line 1055... | ||
1049 | return 0; |
1055 | return 0; |
1050 | } |
1056 | } |
1051 | #endif |
1057 | #endif |
Line 1052... | Line -... | ||
1052 | - | ||
1053 | - | ||
1054 | static int i915_set_status_page(struct drm_device *dev, void *data, |
- | |
1055 | struct drm_file *file_priv) |
- | |
1056 | { |
- | |
1057 | drm_i915_private_t *dev_priv = dev->dev_private; |
- | |
1058 | drm_i915_hws_addr_t *hws = data; |
- | |
1059 | struct intel_ring_buffer *ring; |
- | |
1060 | - | ||
1061 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
- | |
1062 | return -ENODEV; |
- | |
1063 | - | ||
1064 | if (!I915_NEED_GFX_HWS(dev)) |
- | |
1065 | return -EINVAL; |
- | |
1066 | - | ||
1067 | if (!dev_priv) { |
- | |
1068 | DRM_ERROR("called with no initialization\n"); |
- | |
1069 | return -EINVAL; |
- | |
1070 | } |
- | |
1071 | - | ||
1072 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { |
- | |
1073 | WARN(1, "tried to set status page when mode setting active\n"); |
- | |
1074 | return 0; |
- | |
1075 | } |
- | |
1076 | - | ||
1077 | DRM_DEBUG_DRIVER("set status page addr 0x%08x\n", (u32)hws->addr); |
- | |
1078 | - | ||
1079 | ring = LP_RING(dev_priv); |
- | |
1080 | ring->status_page.gfx_addr = hws->addr & (0x1ffff<<12); |
- | |
1081 | - | ||
1082 | dev_priv->dri1.gfx_hws_cpu_addr = |
- | |
1083 | ioremap(dev_priv->mm.gtt_base_addr + hws->addr, 4096); |
- | |
1084 | if (dev_priv->dri1.gfx_hws_cpu_addr == NULL) { |
- | |
1085 | i915_dma_cleanup(dev); |
- | |
1086 | ring->status_page.gfx_addr = 0; |
- | |
1087 | DRM_ERROR("can not ioremap virtual address for" |
- | |
1088 | " G33 hw status page\n"); |
- | |
1089 | return -ENOMEM; |
- | |
1090 | } |
- | |
1091 | - | ||
1092 | memset(dev_priv->dri1.gfx_hws_cpu_addr, 0, PAGE_SIZE); |
- | |
1093 | I915_WRITE(HWS_PGA, ring->status_page.gfx_addr); |
- | |
1094 | - | ||
1095 | DRM_DEBUG_DRIVER("load hws HWS_PGA with gfx mem 0x%x\n", |
- | |
1096 | ring->status_page.gfx_addr); |
- | |
1097 | DRM_DEBUG_DRIVER("load hws at %p\n", |
- | |
1098 | ring->status_page.page_addr); |
- | |
Line 1099... | Line 1058... | ||
1099 | return 0; |
1058 | |
1100 | } |
1059 | |
1101 | 1060 | ||
Line 1198... | Line 1157... | ||
1198 | */ |
1157 | */ |
1199 | ret = i915_gem_init_stolen(dev); |
1158 | ret = i915_gem_init_stolen(dev); |
1200 | if (ret) |
1159 | if (ret) |
1201 | goto cleanup_vga_switcheroo; |
1160 | goto cleanup_vga_switcheroo; |
Line -... | Line 1161... | ||
- | 1161 | ||
- | 1162 | ret = drm_irq_install(dev); |
|
- | 1163 | if (ret) |
|
- | 1164 | goto cleanup_gem_stolen; |
|
- | 1165 | ||
- | 1166 | /* Important: The output setup functions called by modeset_init need |
|
1202 | 1167 | * working irqs for e.g. gmbus and dp aux transfers. */ |
|
Line 1203... | Line 1168... | ||
1203 | intel_modeset_init(dev); |
1168 | intel_modeset_init(dev); |
1204 | 1169 | ||
1205 | ret = i915_gem_init(dev); |
1170 | ret = i915_gem_init(dev); |
Line 1206... | Line -... | ||
1206 | if (ret) |
- | |
Line 1207... | Line 1171... | ||
1207 | goto cleanup_gem_stolen; |
1171 | if (ret) |
1208 | - | ||
1209 | intel_modeset_gem_init(dev); |
- | |
Line 1210... | Line 1172... | ||
1210 | 1172 | goto cleanup_irq; |
|
1211 | ret = drm_irq_install(dev); |
1173 | |
1212 | if (ret) |
1174 | |
Line 1213... | Line 1175... | ||
1213 | goto cleanup_gem; |
1175 | intel_modeset_gem_init(dev); |
1214 | 1176 | ||
1215 | /* Always safe in the mode setting case. */ |
1177 | /* Always safe in the mode setting case. */ |
Line -... | Line 1178... | ||
- | 1178 | /* FIXME: do pre/post-mode set stuff in core KMS code */ |
|
- | 1179 | dev->vblank_disable_allowed = 1; |
|
- | 1180 | ||
- | 1181 | ret = intel_fbdev_init(dev); |
|
- | 1182 | if (ret) |
|
- | 1183 | goto cleanup_gem; |
|
- | 1184 | ||
- | 1185 | /* Only enable hotplug handling once the fbdev is fully set up. */ |
|
- | 1186 | intel_hpd_init(dev); |
|
- | 1187 | ||
- | 1188 | /* |
|
- | 1189 | * Some ports require correctly set-up hpd registers for detection to |
|
- | 1190 | * work properly (leading to ghost connected connector status), e.g. VGA |
|
- | 1191 | * on gm45. Hence we can only set up the initial fbdev config after hpd |
|
- | 1192 | * irqs are fully enabled. Now we should scan for the initial config |
|
- | 1193 | * only once hotplug handling is enabled, but due to screwed-up locking |
|
- | 1194 | * around kms/fbdev init we can't protect the fdbev initial config |
|
- | 1195 | * scanning against hotplug events. Hence do this first and ignore the |
|
1216 | /* FIXME: do pre/post-mode set stuff in core KMS code */ |
1196 | * tiny window where we will loose hotplug notifactions. |
Line 1217... | Line 1197... | ||
1217 | dev->vblank_disable_allowed = 1; |
1197 | */ |
1218 | 1198 | intel_fbdev_initial_config(dev); |
|
Line 1219... | Line 1199... | ||
1219 | ret = intel_fbdev_init(dev); |
1199 | |
Line -... | Line 1200... | ||
- | 1200 | /* Only enable hotplug handling once the fbdev is fully set up. */ |
|
- | 1201 | dev_priv->enable_hotplug_processing = true; |
|
- | 1202 | ||
- | 1203 | drm_kms_helper_poll_init(dev); |
|
- | 1204 | ||
1220 | if (ret) |
1205 | /* We're off and running w/KMS */ |
1221 | goto cleanup_irq; |
1206 | dev_priv->mm.suspended = 0; |
1222 | - | ||
1223 | // drm_kms_helper_poll_init(dev); |
- | |
1224 | - | ||
1225 | /* We're off and running w/KMS */ |
- | |
1226 | dev_priv->mm.suspended = 0; |
- | |
1227 | 1207 | ||
1228 | return 0; |
1208 | return 0; |
1229 | 1209 | ||
1230 | cleanup_irq: |
1210 | cleanup_gem: |
1231 | // drm_irq_uninstall(dev); |
1211 | mutex_lock(&dev->struct_mutex); |
Line 1334... | Line 1314... | ||
1334 | DRM_ERROR("failed to map registers\n"); |
1314 | DRM_ERROR("failed to map registers\n"); |
1335 | ret = -EIO; |
1315 | ret = -EIO; |
1336 | goto put_gmch; |
1316 | goto put_gmch; |
1337 | } |
1317 | } |
Line 1338... | Line 1318... | ||
1338 | 1318 | ||
1339 | aperture_size = dev_priv->mm.gtt->gtt_mappable_entries << PAGE_SHIFT; |
- | |
Line 1340... | Line 1319... | ||
1340 | dev_priv->mm.gtt_base_addr = dev_priv->mm.gtt->gma_bus_addr; |
1319 | aperture_size = dev_priv->gtt.mappable_end; |
1341 | 1320 | ||
Line 1387... | Line 1366... | ||
1387 | * be lost or delayed, but we use them anyways to avoid |
1366 | * be lost or delayed, but we use them anyways to avoid |
1388 | * stuck interrupts on some machines. |
1367 | * stuck interrupts on some machines. |
1389 | */ |
1368 | */ |
Line 1390... | Line 1369... | ||
1390 | 1369 | ||
1391 | spin_lock_init(&dev_priv->irq_lock); |
1370 | spin_lock_init(&dev_priv->irq_lock); |
1392 | spin_lock_init(&dev_priv->error_lock); |
1371 | spin_lock_init(&dev_priv->gpu_error.lock); |
1393 | spin_lock_init(&dev_priv->rps.lock); |
1372 | spin_lock_init(&dev_priv->rps.lock); |
Line 1394... | Line 1373... | ||
1394 | spin_lock_init(&dev_priv->dpio_lock); |
1373 | mutex_init(&dev_priv->dpio_lock); |
- | 1374 | ||
Line 1395... | Line 1375... | ||
1395 | 1375 | mutex_init(&dev_priv->rps.hw_lock); |
|
1396 | mutex_init(&dev_priv->rps.hw_lock); |
1376 | mutex_init(&dev_priv->modeset_restore_lock); |
1397 | 1377 | ||
1398 | if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) |
1378 | if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) |
Line 1442... | Line 1422... | ||
1442 | // } |
1422 | // } |
1443 | // io_mapping_free(dev_priv->mm.gtt_mapping); |
1423 | // io_mapping_free(dev_priv->mm.gtt_mapping); |
1444 | out_rmmap: |
1424 | out_rmmap: |
1445 | pci_iounmap(dev->pdev, dev_priv->regs); |
1425 | pci_iounmap(dev->pdev, dev_priv->regs); |
1446 | put_gmch: |
1426 | put_gmch: |
1447 | // intel_gmch_remove(); |
1427 | // dev_priv->gtt.gtt_remove(dev); |
1448 | put_bridge: |
1428 | put_bridge: |
1449 | // pci_dev_put(dev_priv->bridge_dev); |
1429 | // pci_dev_put(dev_priv->bridge_dev); |
1450 | free_priv: |
1430 | free_priv: |
1451 | kfree(dev_priv); |
1431 | kfree(dev_priv); |
1452 | return ret; |
1432 | return ret; |
Line 1474... | Line 1454... | ||
1474 | mutex_unlock(&dev->struct_mutex); |
1454 | mutex_unlock(&dev->struct_mutex); |
Line 1475... | Line 1455... | ||
1475 | 1455 | ||
1476 | /* Cancel the retire work handler, which should be idle now. */ |
1456 | /* Cancel the retire work handler, which should be idle now. */ |
Line 1477... | Line 1457... | ||
1477 | cancel_delayed_work_sync(&dev_priv->mm.retire_work); |
1457 | cancel_delayed_work_sync(&dev_priv->mm.retire_work); |
1478 | 1458 | ||
1479 | io_mapping_free(dev_priv->mm.gtt_mapping); |
1459 | io_mapping_free(dev_priv->gtt.mappable); |
1480 | if (dev_priv->mm.gtt_mtrr >= 0) { |
1460 | if (dev_priv->mm.gtt_mtrr >= 0) { |
1481 | mtrr_del(dev_priv->mm.gtt_mtrr, |
1461 | mtrr_del(dev_priv->mm.gtt_mtrr, |
1482 | dev_priv->mm.gtt_base_addr, |
1462 | dev_priv->gtt.mappable_base, |
1483 | dev_priv->mm.gtt->gtt_mappable_entries * PAGE_SIZE); |
1463 | dev_priv->gtt.mappable_end); |
Line 1484... | Line 1464... | ||
1484 | dev_priv->mm.gtt_mtrr = -1; |
1464 | dev_priv->mm.gtt_mtrr = -1; |
Line 1504... | Line 1484... | ||
1504 | vga_switcheroo_unregister_client(dev->pdev); |
1484 | vga_switcheroo_unregister_client(dev->pdev); |
1505 | vga_client_register(dev->pdev, NULL, NULL, NULL); |
1485 | vga_client_register(dev->pdev, NULL, NULL, NULL); |
1506 | } |
1486 | } |
Line 1507... | Line 1487... | ||
1507 | 1487 | ||
1508 | /* Free error state after interrupts are fully disabled. */ |
1488 | /* Free error state after interrupts are fully disabled. */ |
1509 | del_timer_sync(&dev_priv->hangcheck_timer); |
1489 | del_timer_sync(&dev_priv->gpu_error.hangcheck_timer); |
1510 | cancel_work_sync(&dev_priv->error_work); |
1490 | cancel_work_sync(&dev_priv->gpu_error.work); |
Line 1511... | Line 1491... | ||
1511 | i915_destroy_error_state(dev); |
1491 | i915_destroy_error_state(dev); |
1512 | 1492 | ||
Line 1524... | Line 1504... | ||
1524 | i915_gem_cleanup_ringbuffer(dev); |
1504 | i915_gem_cleanup_ringbuffer(dev); |
1525 | i915_gem_context_fini(dev); |
1505 | i915_gem_context_fini(dev); |
1526 | mutex_unlock(&dev->struct_mutex); |
1506 | mutex_unlock(&dev->struct_mutex); |
1527 | i915_gem_cleanup_aliasing_ppgtt(dev); |
1507 | i915_gem_cleanup_aliasing_ppgtt(dev); |
1528 | i915_gem_cleanup_stolen(dev); |
1508 | i915_gem_cleanup_stolen(dev); |
1529 | drm_mm_takedown(&dev_priv->mm.stolen); |
- | |
1530 | - | ||
1531 | intel_cleanup_overlay(dev); |
- | |
Line 1532... | Line 1509... | ||
1532 | 1509 | ||
1533 | if (!I915_NEED_GFX_HWS(dev)) |
1510 | if (!I915_NEED_GFX_HWS(dev)) |
1534 | i915_free_hws(dev); |
1511 | i915_free_hws(dev); |
Line 1539... | Line 1516... | ||
1539 | 1516 | ||
1540 | intel_teardown_gmbus(dev); |
1517 | intel_teardown_gmbus(dev); |
Line 1541... | Line 1518... | ||
1541 | intel_teardown_mchbar(dev); |
1518 | intel_teardown_mchbar(dev); |
- | 1519 | ||
- | 1520 | destroy_workqueue(dev_priv->wq); |
|
- | 1521 | pm_qos_remove_request(&dev_priv->pm_qos); |
|
- | 1522 | ||
Line 1542... | Line 1523... | ||
1542 | 1523 | if (dev_priv->slab) |
|
1543 | destroy_workqueue(dev_priv->wq); |
1524 | kmem_cache_destroy(dev_priv->slab); |
Line 1544... | Line 1525... | ||
1544 | 1525 |