summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/i915/i915_driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/i915_driver.c')
-rw-r--r--drivers/gpu/drm/i915/i915_driver.c77
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);