// SPDX-License-Identifier: MIT /* * Copyright © 2022-2023 Intel Corporation * * High level display driver entry points. This is a layer between top level * driver code and low level display functionality; no low level display code or * details here. */ #include <linux/vga_switcheroo.h> #include <acpi/video.h> #include <drm/display/drm_dp_mst_helper.h> #include <drm/drm_atomic_helper.h> #include <drm/drm_client.h> #include <drm/drm_mode_config.h> #include <drm/drm_privacy_screen_consumer.h> #include <drm/drm_probe_helper.h> #include <drm/drm_vblank.h> #include "i915_drv.h" #include "i9xx_wm.h" #include "intel_acpi.h" #include "intel_atomic.h" #include "intel_audio.h" #include "intel_bios.h" #include "intel_bw.h" #include "intel_cdclk.h" #include "intel_color.h" #include "intel_crtc.h" #include "intel_display_debugfs.h" #include "intel_display_driver.h" #include "intel_display_irq.h" #include "intel_display_power.h" #include "intel_display_types.h" #include "intel_display_wa.h" #include "intel_dkl_phy.h" #include "intel_dmc.h" #include "intel_dp.h" #include "intel_dp_tunnel.h" #include "intel_dpll.h" #include "intel_dpll_mgr.h" #include "intel_fb.h" #include "intel_fbc.h" #include "intel_fbdev.h" #include "intel_fdi.h" #include "intel_gmbus.h" #include "intel_hdcp.h" #include "intel_hotplug.h" #include "intel_hti.h" #include "intel_modeset_lock.h" #include "intel_modeset_setup.h" #include "intel_opregion.h" #include "intel_overlay.h" #include "intel_plane_initial.h" #include "intel_pmdemand.h" #include "intel_pps.h" #include "intel_quirks.h" #include "intel_vga.h" #include "intel_wm.h" #include "skl_watermark.h" bool intel_display_driver_probe_defer(struct pci_dev *pdev) { … } void intel_display_driver_init_hw(struct drm_i915_private *i915) { … } static const struct drm_mode_config_funcs intel_mode_funcs = …; static const struct drm_mode_config_helper_funcs intel_mode_config_funcs = …; static void intel_mode_config_init(struct drm_i915_private *i915) { … } static void intel_mode_config_cleanup(struct drm_i915_private *i915) { … } static void intel_plane_possible_crtcs_init(struct drm_i915_private *dev_priv) { … } void intel_display_driver_early_probe(struct drm_i915_private *i915) { … } /* part #1: call before irq install */ int intel_display_driver_probe_noirq(struct drm_i915_private *i915) { … } static void set_display_access(struct drm_i915_private *i915, bool any_task_allowed, struct task_struct *allowed_task) { … } /** * intel_display_driver_enable_user_access - Enable display HW access for all threads * @i915: i915 device instance * * Enable the display HW access for all threads. Examples for such accesses * are modeset commits and connector probing. * * This function should be called during driver loading and system resume once * all the HW initialization steps are done. */ void intel_display_driver_enable_user_access(struct drm_i915_private *i915) { … } /** * intel_display_driver_disable_user_access - Disable display HW access for user threads * @i915: i915 device instance * * Disable the display HW access for user threads. Examples for such accesses * are modeset commits and connector probing. For the current thread the * access is still enabled, which should only perform HW init/deinit * programming (as the initial modeset during driver loading or the disabling * modeset during driver unloading and system suspend/shutdown). This function * should be followed by calling either intel_display_driver_enable_user_access() * after completing the HW init programming or * intel_display_driver_suspend_access() after completing the HW deinit * programming. * * This function should be called during driver loading/unloading and system * suspend/shutdown before starting the HW init/deinit programming. */ void intel_display_driver_disable_user_access(struct drm_i915_private *i915) { … } /** * intel_display_driver_suspend_access - Suspend display HW access for all threads * @i915: i915 device instance * * Disable the display HW access for all threads. Examples for such accesses * are modeset commits and connector probing. This call should be either * followed by calling intel_display_driver_resume_access(), or the driver * should be unloaded/shutdown. * * This function should be called during driver unloading and system * suspend/shutdown after completing the HW deinit programming. */ void intel_display_driver_suspend_access(struct drm_i915_private *i915) { … } /** * intel_display_driver_resume_access - Resume display HW access for the resume thread * @i915: i915 device instance * * Enable the display HW access for the current resume thread, keeping the * access disabled for all other (user) threads. Examples for such accesses * are modeset commits and connector probing. The resume thread should only * perform HW init programming (as the restoring modeset). This function * should be followed by calling intel_display_driver_enable_user_access(), * after completing the HW init programming steps. * * This function should be called during system resume before starting the HW * init steps. */ void intel_display_driver_resume_access(struct drm_i915_private *i915) { … } /** * intel_display_driver_check_access - Check if the current thread has disaplay HW access * @i915: i915 device instance * * Check whether the current thread has display HW access, print a debug * message if it doesn't. Such accesses are modeset commits and connector * probing. If the function returns %false any HW access should be prevented. * * Returns %true if the current thread has display HW access, %false * otherwise. */ bool intel_display_driver_check_access(struct drm_i915_private *i915) { … } /* part #2: call after irq install, but before gem init */ int intel_display_driver_probe_nogem(struct drm_i915_private *i915) { … } /* part #3: call after gem init */ int intel_display_driver_probe(struct drm_i915_private *i915) { … } void intel_display_driver_register(struct drm_i915_private *i915) { … } /* part #1: call before irq uninstall */ void intel_display_driver_remove(struct drm_i915_private *i915) { … } /* part #2: call after irq uninstall */ void intel_display_driver_remove_noirq(struct drm_i915_private *i915) { … } /* part #3: call after gem init */ void intel_display_driver_remove_nogem(struct drm_i915_private *i915) { … } void intel_display_driver_unregister(struct drm_i915_private *i915) { … } /* * turn all crtc's off, but do not adjust state * This has to be paired with a call to intel_modeset_setup_hw_state. */ int intel_display_driver_suspend(struct drm_i915_private *i915) { … } int __intel_display_driver_resume(struct drm_i915_private *i915, struct drm_atomic_state *state, struct drm_modeset_acquire_ctx *ctx) { … } void intel_display_driver_resume(struct drm_i915_private *i915) { … }