diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_drv.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 113 |
1 files changed, 59 insertions, 54 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 44e2c0f5ec50..b1d23c73c147 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -345,7 +345,7 @@ static int i915_getparam_ioctl(struct drm_device *dev, void *data, | |||
345 | value = HAS_WT(dev_priv); | 345 | value = HAS_WT(dev_priv); |
346 | break; | 346 | break; |
347 | case I915_PARAM_HAS_ALIASING_PPGTT: | 347 | case I915_PARAM_HAS_ALIASING_PPGTT: |
348 | value = USES_PPGTT(dev_priv); | 348 | value = min_t(int, INTEL_PPGTT(dev_priv), I915_GEM_PPGTT_FULL); |
349 | break; | 349 | break; |
350 | case I915_PARAM_HAS_SEMAPHORES: | 350 | case I915_PARAM_HAS_SEMAPHORES: |
351 | value = HAS_LEGACY_SEMAPHORES(dev_priv); | 351 | value = HAS_LEGACY_SEMAPHORES(dev_priv); |
@@ -645,6 +645,13 @@ static int i915_load_modeset_init(struct drm_device *dev) | |||
645 | if (i915_inject_load_failure()) | 645 | if (i915_inject_load_failure()) |
646 | return -ENODEV; | 646 | return -ENODEV; |
647 | 647 | ||
648 | if (INTEL_INFO(dev_priv)->num_pipes) { | ||
649 | ret = drm_vblank_init(&dev_priv->drm, | ||
650 | INTEL_INFO(dev_priv)->num_pipes); | ||
651 | if (ret) | ||
652 | goto out; | ||
653 | } | ||
654 | |||
648 | intel_bios_init(dev_priv); | 655 | intel_bios_init(dev_priv); |
649 | 656 | ||
650 | /* If we have > 1 VGA cards, then we need to arbitrate access | 657 | /* If we have > 1 VGA cards, then we need to arbitrate access |
@@ -687,7 +694,7 @@ static int i915_load_modeset_init(struct drm_device *dev) | |||
687 | if (ret) | 694 | if (ret) |
688 | goto cleanup_modeset; | 695 | goto cleanup_modeset; |
689 | 696 | ||
690 | intel_setup_overlay(dev_priv); | 697 | intel_overlay_setup(dev_priv); |
691 | 698 | ||
692 | if (INTEL_INFO(dev_priv)->num_pipes == 0) | 699 | if (INTEL_INFO(dev_priv)->num_pipes == 0) |
693 | return 0; | 700 | return 0; |
@@ -699,6 +706,8 @@ static int i915_load_modeset_init(struct drm_device *dev) | |||
699 | /* Only enable hotplug handling once the fbdev is fully set up. */ | 706 | /* Only enable hotplug handling once the fbdev is fully set up. */ |
700 | intel_hpd_init(dev_priv); | 707 | intel_hpd_init(dev_priv); |
701 | 708 | ||
709 | intel_init_ipc(dev_priv); | ||
710 | |||
702 | return 0; | 711 | return 0; |
703 | 712 | ||
704 | cleanup_gem: | 713 | cleanup_gem: |
@@ -1030,6 +1039,7 @@ static int i915_driver_init_mmio(struct drm_i915_private *dev_priv) | |||
1030 | 1039 | ||
1031 | err_uncore: | 1040 | err_uncore: |
1032 | intel_uncore_fini(dev_priv); | 1041 | intel_uncore_fini(dev_priv); |
1042 | i915_mmio_cleanup(dev_priv); | ||
1033 | err_bridge: | 1043 | err_bridge: |
1034 | pci_dev_put(dev_priv->bridge_dev); | 1044 | pci_dev_put(dev_priv->bridge_dev); |
1035 | 1045 | ||
@@ -1049,17 +1059,6 @@ static void i915_driver_cleanup_mmio(struct drm_i915_private *dev_priv) | |||
1049 | 1059 | ||
1050 | static void intel_sanitize_options(struct drm_i915_private *dev_priv) | 1060 | static void intel_sanitize_options(struct drm_i915_private *dev_priv) |
1051 | { | 1061 | { |
1052 | /* | ||
1053 | * i915.enable_ppgtt is read-only, so do an early pass to validate the | ||
1054 | * user's requested state against the hardware/driver capabilities. We | ||
1055 | * do this now so that we can print out any log messages once rather | ||
1056 | * than every time we check intel_enable_ppgtt(). | ||
1057 | */ | ||
1058 | i915_modparams.enable_ppgtt = | ||
1059 | intel_sanitize_enable_ppgtt(dev_priv, | ||
1060 | i915_modparams.enable_ppgtt); | ||
1061 | DRM_DEBUG_DRIVER("ppgtt mode: %i\n", i915_modparams.enable_ppgtt); | ||
1062 | |||
1063 | intel_gvt_sanitize_options(dev_priv); | 1062 | intel_gvt_sanitize_options(dev_priv); |
1064 | } | 1063 | } |
1065 | 1064 | ||
@@ -1175,8 +1174,6 @@ skl_dram_get_channels_info(struct drm_i915_private *dev_priv) | |||
1175 | return -EINVAL; | 1174 | return -EINVAL; |
1176 | } | 1175 | } |
1177 | 1176 | ||
1178 | dram_info->valid_dimm = true; | ||
1179 | |||
1180 | /* | 1177 | /* |
1181 | * If any of the channel is single rank channel, worst case output | 1178 | * If any of the channel is single rank channel, worst case output |
1182 | * will be same as if single rank memory, so consider single rank | 1179 | * will be same as if single rank memory, so consider single rank |
@@ -1193,8 +1190,7 @@ skl_dram_get_channels_info(struct drm_i915_private *dev_priv) | |||
1193 | return -EINVAL; | 1190 | return -EINVAL; |
1194 | } | 1191 | } |
1195 | 1192 | ||
1196 | if (ch0.is_16gb_dimm || ch1.is_16gb_dimm) | 1193 | dram_info->is_16gb_dimm = ch0.is_16gb_dimm || ch1.is_16gb_dimm; |
1197 | dram_info->is_16gb_dimm = true; | ||
1198 | 1194 | ||
1199 | dev_priv->dram_info.symmetric_memory = intel_is_dram_symmetric(val_ch0, | 1195 | dev_priv->dram_info.symmetric_memory = intel_is_dram_symmetric(val_ch0, |
1200 | val_ch1, | 1196 | val_ch1, |
@@ -1314,7 +1310,6 @@ bxt_get_dram_info(struct drm_i915_private *dev_priv) | |||
1314 | return -EINVAL; | 1310 | return -EINVAL; |
1315 | } | 1311 | } |
1316 | 1312 | ||
1317 | dram_info->valid_dimm = true; | ||
1318 | dram_info->valid = true; | 1313 | dram_info->valid = true; |
1319 | return 0; | 1314 | return 0; |
1320 | } | 1315 | } |
@@ -1327,19 +1322,24 @@ intel_get_dram_info(struct drm_i915_private *dev_priv) | |||
1327 | int ret; | 1322 | int ret; |
1328 | 1323 | ||
1329 | dram_info->valid = false; | 1324 | dram_info->valid = false; |
1330 | dram_info->valid_dimm = false; | ||
1331 | dram_info->is_16gb_dimm = false; | ||
1332 | dram_info->rank = I915_DRAM_RANK_INVALID; | 1325 | dram_info->rank = I915_DRAM_RANK_INVALID; |
1333 | dram_info->bandwidth_kbps = 0; | 1326 | dram_info->bandwidth_kbps = 0; |
1334 | dram_info->num_channels = 0; | 1327 | dram_info->num_channels = 0; |
1335 | 1328 | ||
1329 | /* | ||
1330 | * Assume 16Gb DIMMs are present until proven otherwise. | ||
1331 | * This is only used for the level 0 watermark latency | ||
1332 | * w/a which does not apply to bxt/glk. | ||
1333 | */ | ||
1334 | dram_info->is_16gb_dimm = !IS_GEN9_LP(dev_priv); | ||
1335 | |||
1336 | if (INTEL_GEN(dev_priv) < 9 || IS_GEMINILAKE(dev_priv)) | 1336 | if (INTEL_GEN(dev_priv) < 9 || IS_GEMINILAKE(dev_priv)) |
1337 | return; | 1337 | return; |
1338 | 1338 | ||
1339 | /* Need to calculate bandwidth only for Gen9 */ | 1339 | /* Need to calculate bandwidth only for Gen9 */ |
1340 | if (IS_BROXTON(dev_priv)) | 1340 | if (IS_BROXTON(dev_priv)) |
1341 | ret = bxt_get_dram_info(dev_priv); | 1341 | ret = bxt_get_dram_info(dev_priv); |
1342 | else if (INTEL_GEN(dev_priv) == 9) | 1342 | else if (IS_GEN9(dev_priv)) |
1343 | ret = skl_get_dram_info(dev_priv); | 1343 | ret = skl_get_dram_info(dev_priv); |
1344 | else | 1344 | else |
1345 | ret = skl_dram_get_channels_info(dev_priv); | 1345 | ret = skl_dram_get_channels_info(dev_priv); |
@@ -1374,6 +1374,15 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv) | |||
1374 | 1374 | ||
1375 | intel_device_info_runtime_init(mkwrite_device_info(dev_priv)); | 1375 | intel_device_info_runtime_init(mkwrite_device_info(dev_priv)); |
1376 | 1376 | ||
1377 | if (HAS_PPGTT(dev_priv)) { | ||
1378 | if (intel_vgpu_active(dev_priv) && | ||
1379 | !intel_vgpu_has_full_48bit_ppgtt(dev_priv)) { | ||
1380 | i915_report_error(dev_priv, | ||
1381 | "incompatible vGPU found, support for isolated ppGTT required\n"); | ||
1382 | return -ENXIO; | ||
1383 | } | ||
1384 | } | ||
1385 | |||
1377 | intel_sanitize_options(dev_priv); | 1386 | intel_sanitize_options(dev_priv); |
1378 | 1387 | ||
1379 | i915_perf_init(dev_priv); | 1388 | i915_perf_init(dev_priv); |
@@ -1629,14 +1638,16 @@ i915_driver_create(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1629 | (struct intel_device_info *)ent->driver_data; | 1638 | (struct intel_device_info *)ent->driver_data; |
1630 | struct intel_device_info *device_info; | 1639 | struct intel_device_info *device_info; |
1631 | struct drm_i915_private *i915; | 1640 | struct drm_i915_private *i915; |
1641 | int err; | ||
1632 | 1642 | ||
1633 | i915 = kzalloc(sizeof(*i915), GFP_KERNEL); | 1643 | i915 = kzalloc(sizeof(*i915), GFP_KERNEL); |
1634 | if (!i915) | 1644 | if (!i915) |
1635 | return NULL; | 1645 | return ERR_PTR(-ENOMEM); |
1636 | 1646 | ||
1637 | if (drm_dev_init(&i915->drm, &driver, &pdev->dev)) { | 1647 | err = drm_dev_init(&i915->drm, &driver, &pdev->dev); |
1648 | if (err) { | ||
1638 | kfree(i915); | 1649 | kfree(i915); |
1639 | return NULL; | 1650 | return ERR_PTR(err); |
1640 | } | 1651 | } |
1641 | 1652 | ||
1642 | i915->drm.pdev = pdev; | 1653 | i915->drm.pdev = pdev; |
@@ -1649,8 +1660,8 @@ i915_driver_create(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1649 | device_info->device_id = pdev->device; | 1660 | device_info->device_id = pdev->device; |
1650 | 1661 | ||
1651 | BUILD_BUG_ON(INTEL_MAX_PLATFORMS > | 1662 | BUILD_BUG_ON(INTEL_MAX_PLATFORMS > |
1652 | sizeof(device_info->platform_mask) * BITS_PER_BYTE); | 1663 | BITS_PER_TYPE(device_info->platform_mask)); |
1653 | BUG_ON(device_info->gen > sizeof(device_info->gen_mask) * BITS_PER_BYTE); | 1664 | BUG_ON(device_info->gen > BITS_PER_TYPE(device_info->gen_mask)); |
1654 | 1665 | ||
1655 | return i915; | 1666 | return i915; |
1656 | } | 1667 | } |
@@ -1685,8 +1696,8 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1685 | int ret; | 1696 | int ret; |
1686 | 1697 | ||
1687 | dev_priv = i915_driver_create(pdev, ent); | 1698 | dev_priv = i915_driver_create(pdev, ent); |
1688 | if (!dev_priv) | 1699 | if (IS_ERR(dev_priv)) |
1689 | return -ENOMEM; | 1700 | return PTR_ERR(dev_priv); |
1690 | 1701 | ||
1691 | /* Disable nuclear pageflip by default on pre-ILK */ | 1702 | /* Disable nuclear pageflip by default on pre-ILK */ |
1692 | if (!i915_modparams.nuclear_pageflip && match_info->gen < 5) | 1703 | if (!i915_modparams.nuclear_pageflip && match_info->gen < 5) |
@@ -1710,26 +1721,12 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1710 | if (ret < 0) | 1721 | if (ret < 0) |
1711 | goto out_cleanup_mmio; | 1722 | goto out_cleanup_mmio; |
1712 | 1723 | ||
1713 | /* | ||
1714 | * TODO: move the vblank init and parts of modeset init steps into one | ||
1715 | * of the i915_driver_init_/i915_driver_register functions according | ||
1716 | * to the role/effect of the given init step. | ||
1717 | */ | ||
1718 | if (INTEL_INFO(dev_priv)->num_pipes) { | ||
1719 | ret = drm_vblank_init(&dev_priv->drm, | ||
1720 | INTEL_INFO(dev_priv)->num_pipes); | ||
1721 | if (ret) | ||
1722 | goto out_cleanup_hw; | ||
1723 | } | ||
1724 | |||
1725 | ret = i915_load_modeset_init(&dev_priv->drm); | 1724 | ret = i915_load_modeset_init(&dev_priv->drm); |
1726 | if (ret < 0) | 1725 | if (ret < 0) |
1727 | goto out_cleanup_hw; | 1726 | goto out_cleanup_hw; |
1728 | 1727 | ||
1729 | i915_driver_register(dev_priv); | 1728 | i915_driver_register(dev_priv); |
1730 | 1729 | ||
1731 | intel_init_ipc(dev_priv); | ||
1732 | |||
1733 | enable_rpm_wakeref_asserts(dev_priv); | 1730 | enable_rpm_wakeref_asserts(dev_priv); |
1734 | 1731 | ||
1735 | i915_welcome_messages(dev_priv); | 1732 | i915_welcome_messages(dev_priv); |
@@ -1781,7 +1778,6 @@ void i915_driver_unload(struct drm_device *dev) | |||
1781 | i915_reset_error_state(dev_priv); | 1778 | i915_reset_error_state(dev_priv); |
1782 | 1779 | ||
1783 | i915_gem_fini(dev_priv); | 1780 | i915_gem_fini(dev_priv); |
1784 | intel_fbc_cleanup_cfb(dev_priv); | ||
1785 | 1781 | ||
1786 | intel_power_domains_fini_hw(dev_priv); | 1782 | intel_power_domains_fini_hw(dev_priv); |
1787 | 1783 | ||
@@ -1919,9 +1915,7 @@ static int i915_drm_suspend(struct drm_device *dev) | |||
1919 | i915_save_state(dev_priv); | 1915 | i915_save_state(dev_priv); |
1920 | 1916 | ||
1921 | opregion_target_state = suspend_to_idle(dev_priv) ? PCI_D1 : PCI_D3cold; | 1917 | opregion_target_state = suspend_to_idle(dev_priv) ? PCI_D1 : PCI_D3cold; |
1922 | intel_opregion_notify_adapter(dev_priv, opregion_target_state); | 1918 | intel_opregion_suspend(dev_priv, opregion_target_state); |
1923 | |||
1924 | intel_opregion_unregister(dev_priv); | ||
1925 | 1919 | ||
1926 | intel_fbdev_set_suspend(dev, FBINFO_STATE_SUSPENDED, true); | 1920 | intel_fbdev_set_suspend(dev, FBINFO_STATE_SUSPENDED, true); |
1927 | 1921 | ||
@@ -1962,7 +1956,7 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation) | |||
1962 | get_suspend_mode(dev_priv, hibernation)); | 1956 | get_suspend_mode(dev_priv, hibernation)); |
1963 | 1957 | ||
1964 | ret = 0; | 1958 | ret = 0; |
1965 | if (IS_GEN9_LP(dev_priv)) | 1959 | if (INTEL_GEN(dev_priv) >= 11 || IS_GEN9_LP(dev_priv)) |
1966 | bxt_enable_dc9(dev_priv); | 1960 | bxt_enable_dc9(dev_priv); |
1967 | else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) | 1961 | else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) |
1968 | hsw_enable_pc8(dev_priv); | 1962 | hsw_enable_pc8(dev_priv); |
@@ -2040,7 +2034,6 @@ static int i915_drm_resume(struct drm_device *dev) | |||
2040 | 2034 | ||
2041 | i915_restore_state(dev_priv); | 2035 | i915_restore_state(dev_priv); |
2042 | intel_pps_unlock_regs_wa(dev_priv); | 2036 | intel_pps_unlock_regs_wa(dev_priv); |
2043 | intel_opregion_setup(dev_priv); | ||
2044 | 2037 | ||
2045 | intel_init_pch_refclk(dev_priv); | 2038 | intel_init_pch_refclk(dev_priv); |
2046 | 2039 | ||
@@ -2082,12 +2075,10 @@ static int i915_drm_resume(struct drm_device *dev) | |||
2082 | * */ | 2075 | * */ |
2083 | intel_hpd_init(dev_priv); | 2076 | intel_hpd_init(dev_priv); |
2084 | 2077 | ||
2085 | intel_opregion_register(dev_priv); | 2078 | intel_opregion_resume(dev_priv); |
2086 | 2079 | ||
2087 | intel_fbdev_set_suspend(dev, FBINFO_STATE_RUNNING, false); | 2080 | intel_fbdev_set_suspend(dev, FBINFO_STATE_RUNNING, false); |
2088 | 2081 | ||
2089 | intel_opregion_notify_adapter(dev_priv, PCI_D0); | ||
2090 | |||
2091 | intel_power_domains_enable(dev_priv); | 2082 | intel_power_domains_enable(dev_priv); |
2092 | 2083 | ||
2093 | enable_rpm_wakeref_asserts(dev_priv); | 2084 | enable_rpm_wakeref_asserts(dev_priv); |
@@ -2155,7 +2146,7 @@ static int i915_drm_resume_early(struct drm_device *dev) | |||
2155 | 2146 | ||
2156 | intel_uncore_resume_early(dev_priv); | 2147 | intel_uncore_resume_early(dev_priv); |
2157 | 2148 | ||
2158 | if (IS_GEN9_LP(dev_priv)) { | 2149 | if (INTEL_GEN(dev_priv) >= 11 || IS_GEN9_LP(dev_priv)) { |
2159 | gen9_sanitize_dc_state(dev_priv); | 2150 | gen9_sanitize_dc_state(dev_priv); |
2160 | bxt_disable_dc9(dev_priv); | 2151 | bxt_disable_dc9(dev_priv); |
2161 | } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { | 2152 | } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { |
@@ -2922,7 +2913,10 @@ static int intel_runtime_suspend(struct device *kdev) | |||
2922 | intel_uncore_suspend(dev_priv); | 2913 | intel_uncore_suspend(dev_priv); |
2923 | 2914 | ||
2924 | ret = 0; | 2915 | ret = 0; |
2925 | if (IS_GEN9_LP(dev_priv)) { | 2916 | if (INTEL_GEN(dev_priv) >= 11) { |
2917 | icl_display_core_uninit(dev_priv); | ||
2918 | bxt_enable_dc9(dev_priv); | ||
2919 | } else if (IS_GEN9_LP(dev_priv)) { | ||
2926 | bxt_display_core_uninit(dev_priv); | 2920 | bxt_display_core_uninit(dev_priv); |
2927 | bxt_enable_dc9(dev_priv); | 2921 | bxt_enable_dc9(dev_priv); |
2928 | } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { | 2922 | } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { |
@@ -3007,7 +3001,18 @@ static int intel_runtime_resume(struct device *kdev) | |||
3007 | if (intel_uncore_unclaimed_mmio(dev_priv)) | 3001 | if (intel_uncore_unclaimed_mmio(dev_priv)) |
3008 | DRM_DEBUG_DRIVER("Unclaimed access during suspend, bios?\n"); | 3002 | DRM_DEBUG_DRIVER("Unclaimed access during suspend, bios?\n"); |
3009 | 3003 | ||
3010 | if (IS_GEN9_LP(dev_priv)) { | 3004 | if (INTEL_GEN(dev_priv) >= 11) { |
3005 | bxt_disable_dc9(dev_priv); | ||
3006 | icl_display_core_init(dev_priv, true); | ||
3007 | if (dev_priv->csr.dmc_payload) { | ||
3008 | if (dev_priv->csr.allowed_dc_mask & | ||
3009 | DC_STATE_EN_UPTO_DC6) | ||
3010 | skl_enable_dc6(dev_priv); | ||
3011 | else if (dev_priv->csr.allowed_dc_mask & | ||
3012 | DC_STATE_EN_UPTO_DC5) | ||
3013 | gen9_enable_dc5(dev_priv); | ||
3014 | } | ||
3015 | } else if (IS_GEN9_LP(dev_priv)) { | ||
3011 | bxt_disable_dc9(dev_priv); | 3016 | bxt_disable_dc9(dev_priv); |
3012 | bxt_display_core_init(dev_priv, true); | 3017 | bxt_display_core_init(dev_priv, true); |
3013 | if (dev_priv->csr.dmc_payload && | 3018 | if (dev_priv->csr.dmc_payload && |