diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_driver.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_driver.c | 77 |
1 files changed, 57 insertions, 20 deletions
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index c97b76771917..f0105c5b49a7 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -59,6 +59,7 @@ #include "display/intel_dmc.h" #include "display/intel_dp.h" #include "display/intel_dpt.h" +#include "display/intel_dram.h" #include "display/intel_encoder.h" #include "display/intel_fbdev.h" #include "display/intel_gmbus.h" @@ -81,25 +82,29 @@ #include "gt/intel_gt_pm.h" #include "gt/intel_gt_print.h" #include "gt/intel_rc6.h" +#include "gt/intel_rps.h" #include "pxp/intel_pxp.h" #include "pxp/intel_pxp_debugfs.h" #include "pxp/intel_pxp_pm.h" -#include "soc/intel_dram.h" -#include "soc/intel_gmch.h" - #include "i915_debugfs.h" +#include "i915_display_pc8.h" #include "i915_driver.h" #include "i915_drm_client.h" #include "i915_drv.h" +#include "i915_edram.h" #include "i915_file_private.h" #include "i915_getparam.h" +#include "i915_gmch.h" +#include "i915_hdcp_gsc.h" #include "i915_hwmon.h" +#include "i915_initial_plane.h" #include "i915_ioc32.h" #include "i915_ioctl.h" #include "i915_irq.h" #include "i915_memcpy.h" +#include "i915_panic.h" #include "i915_perf.h" #include "i915_query.h" #include "i915_reg.h" @@ -224,9 +229,6 @@ static int i915_driver_early_probe(struct drm_i915_private *dev_priv) struct intel_display *display = dev_priv->display; int ret = 0; - if (i915_inject_probe_failure(dev_priv)) - return -ENODEV; - intel_device_info_runtime_init_early(dev_priv); intel_step_init(dev_priv); @@ -262,7 +264,7 @@ static int i915_driver_early_probe(struct drm_i915_private *dev_priv) intel_irq_init(dev_priv); intel_display_driver_early_probe(display); - intel_clock_gating_hooks_init(dev_priv); + intel_clock_gating_hooks_init(&dev_priv->drm); intel_detect_preproduction_hw(dev_priv); @@ -276,6 +278,7 @@ err_workqueues: i915_workqueues_cleanup(dev_priv); return ret; } +ALLOW_ERROR_INJECTION(i915_driver_early_probe, ERRNO); /** * i915_driver_late_release - cleanup the setup done in @@ -318,10 +321,7 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv) struct intel_gt *gt; int ret, i; - if (i915_inject_probe_failure(dev_priv)) - return -ENODEV; - - ret = intel_gmch_bridge_setup(dev_priv); + ret = i915_gmch_bridge_setup(dev_priv); if (ret < 0) return ret; @@ -338,7 +338,7 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv) } /* Try to make sure MCHBAR is enabled before poking at it */ - intel_gmch_bar_setup(dev_priv); + i915_gmch_bar_setup(dev_priv); intel_device_info_runtime_init(dev_priv); intel_display_device_info_runtime_init(display); @@ -354,10 +354,11 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv) return 0; err_uncore: - intel_gmch_bar_teardown(dev_priv); + i915_gmch_bar_teardown(dev_priv); return ret; } +ALLOW_ERROR_INJECTION(i915_driver_mmio_probe, ERRNO); /** * i915_driver_mmio_release - cleanup the setup done in i915_driver_mmio_probe() @@ -365,7 +366,7 @@ err_uncore: */ static void i915_driver_mmio_release(struct drm_i915_private *dev_priv) { - intel_gmch_bar_teardown(dev_priv); + i915_gmch_bar_teardown(dev_priv); } /** @@ -465,9 +466,6 @@ static int i915_driver_hw_probe(struct drm_i915_private *dev_priv) struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev); int ret; - if (i915_inject_probe_failure(dev_priv)) - return -ENODEV; - if (HAS_PPGTT(dev_priv)) { if (intel_vgpu_active(dev_priv) && !intel_vgpu_has_full_ppgtt(dev_priv)) { @@ -492,7 +490,7 @@ static int i915_driver_hw_probe(struct drm_i915_private *dev_priv) } /* needs to be done before ggtt probe */ - intel_dram_edram_detect(dev_priv); + i915_edram_detect(dev_priv); ret = i915_set_dma_info(dev_priv); if (ret) @@ -572,7 +570,7 @@ static int i915_driver_hw_probe(struct drm_i915_private *dev_priv) * Fill the dram structure to get the system dram info. This will be * used for memory latency calculation. */ - ret = intel_dram_detect(dev_priv); + ret = intel_dram_detect(display); if (ret) goto err_opregion; @@ -595,6 +593,7 @@ err_perf: i915_perf_fini(dev_priv); return ret; } +ALLOW_ERROR_INJECTION(i915_driver_hw_probe, ERRNO); /** * i915_driver_hw_remove - cleanup the setup done in i915_driver_hw_probe() @@ -739,8 +738,45 @@ static void i915_welcome_messages(struct drm_i915_private *dev_priv) "DRM_I915_DEBUG_RUNTIME_PM enabled\n"); } +static void fence_priority_display(struct dma_fence *fence) +{ + if (dma_fence_is_i915(fence)) + i915_gem_fence_wait_priority_display(fence); +} + +static bool has_auxccs(struct drm_device *drm) +{ + struct drm_i915_private *i915 = to_i915(drm); + + return IS_GRAPHICS_VER(i915, 9, 12) || + IS_ALDERLAKE_P(i915) || + IS_METEORLAKE(i915); +} + +static bool has_fenced_regions(struct drm_device *drm) +{ + return intel_gt_support_legacy_fencing(to_gt(to_i915(drm))); +} + +static bool vgpu_active(struct drm_device *drm) +{ + return intel_vgpu_active(to_i915(drm)); +} + static const struct intel_display_parent_interface parent = { + .hdcp = &i915_display_hdcp_interface, + .initial_plane = &i915_display_initial_plane_interface, + .irq = &i915_display_irq_interface, + .panic = &i915_display_panic_interface, + .pc8 = &i915_display_pc8_interface, .rpm = &i915_display_rpm_interface, + .rps = &i915_display_rps_interface, + .stolen = &i915_display_stolen_interface, + + .fence_priority_display = fence_priority_display, + .has_auxccs = has_auxccs, + .has_fenced_regions = has_fenced_regions, + .vgpu_active = vgpu_active, }; const struct intel_display_parent_interface *i915_driver_parent_interface(void) @@ -890,6 +926,7 @@ out_cleanup_hw: i915_gem_drain_freed_objects(i915); i915_ggtt_driver_late_release(i915); out_cleanup_mmio: + intel_gvt_driver_remove(i915); i915_driver_mmio_release(i915); out_runtime_pm_put: enable_rpm_wakeref_asserts(&i915->runtime_pm); @@ -1254,7 +1291,7 @@ static int i915_drm_resume(struct drm_device *dev) intel_display_driver_init_hw(display); - intel_clock_gating_init(dev_priv); + intel_clock_gating_init(&dev_priv->drm); if (intel_display_device_present(display)) intel_display_driver_resume_access(display); |
