1 // SPDX-License-Identifier: MIT
3 * Copyright © 2022-2023 Intel Corporation
5 * High level display driver entry points. This is a layer between top level
6 * driver code and low level display functionality; no low level display code or
10 #include <linux/vga_switcheroo.h>
11 #include <acpi/video.h>
12 #include <drm/display/drm_dp_mst_helper.h>
13 #include <drm/drm_atomic_helper.h>
14 #include <drm/drm_mode_config.h>
15 #include <drm/drm_privacy_screen_consumer.h>
16 #include <drm/drm_probe_helper.h>
17 #include <drm/drm_vblank.h>
21 #include "intel_acpi.h"
22 #include "intel_atomic.h"
23 #include "intel_audio.h"
24 #include "intel_bios.h"
26 #include "intel_cdclk.h"
27 #include "intel_color.h"
28 #include "intel_crtc.h"
29 #include "intel_display_debugfs.h"
30 #include "intel_display_driver.h"
31 #include "intel_display_irq.h"
32 #include "intel_display_power.h"
33 #include "intel_display_types.h"
34 #include "intel_display_wa.h"
35 #include "intel_dkl_phy.h"
36 #include "intel_dmc.h"
38 #include "intel_dpll.h"
39 #include "intel_dpll_mgr.h"
41 #include "intel_fbc.h"
42 #include "intel_fbdev.h"
43 #include "intel_fdi.h"
44 #include "intel_gmbus.h"
45 #include "intel_hdcp.h"
46 #include "intel_hotplug.h"
47 #include "intel_hti.h"
48 #include "intel_modeset_setup.h"
49 #include "intel_opregion.h"
50 #include "intel_overlay.h"
51 #include "intel_plane_initial.h"
52 #include "intel_pmdemand.h"
53 #include "intel_pps.h"
54 #include "intel_quirks.h"
55 #include "intel_vga.h"
57 #include "skl_watermark.h"
59 bool intel_display_driver_probe_defer(struct pci_dev
*pdev
)
61 struct drm_privacy_screen
*privacy_screen
;
64 * apple-gmux is needed on dual GPU MacBook Pro
65 * to probe the panel if we're the inactive GPU.
67 if (vga_switcheroo_client_probe_defer(pdev
))
70 /* If the LCD panel has a privacy-screen, wait for it */
71 privacy_screen
= drm_privacy_screen_get(&pdev
->dev
, NULL
);
72 if (IS_ERR(privacy_screen
) && PTR_ERR(privacy_screen
) == -EPROBE_DEFER
)
75 drm_privacy_screen_put(privacy_screen
);
80 void intel_display_driver_init_hw(struct drm_i915_private
*i915
)
82 struct intel_cdclk_state
*cdclk_state
;
84 if (!HAS_DISPLAY(i915
))
87 cdclk_state
= to_intel_cdclk_state(i915
->display
.cdclk
.obj
.state
);
89 intel_update_cdclk(i915
);
90 intel_cdclk_dump_config(i915
, &i915
->display
.cdclk
.hw
, "Current CDCLK");
91 cdclk_state
->logical
= cdclk_state
->actual
= i915
->display
.cdclk
.hw
;
93 intel_display_wa_apply(i915
);
96 static const struct drm_mode_config_funcs intel_mode_funcs
= {
97 .fb_create
= intel_user_framebuffer_create
,
98 .get_format_info
= intel_fb_get_format_info
,
99 .output_poll_changed
= intel_fbdev_output_poll_changed
,
100 .mode_valid
= intel_mode_valid
,
101 .atomic_check
= intel_atomic_check
,
102 .atomic_commit
= intel_atomic_commit
,
103 .atomic_state_alloc
= intel_atomic_state_alloc
,
104 .atomic_state_clear
= intel_atomic_state_clear
,
105 .atomic_state_free
= intel_atomic_state_free
,
108 static const struct drm_mode_config_helper_funcs intel_mode_config_funcs
= {
109 .atomic_commit_setup
= drm_dp_mst_atomic_setup_commit
,
112 static void intel_mode_config_init(struct drm_i915_private
*i915
)
114 struct drm_mode_config
*mode_config
= &i915
->drm
.mode_config
;
116 drm_mode_config_init(&i915
->drm
);
117 INIT_LIST_HEAD(&i915
->display
.global
.obj_list
);
119 mode_config
->min_width
= 0;
120 mode_config
->min_height
= 0;
122 mode_config
->preferred_depth
= 24;
123 mode_config
->prefer_shadow
= 1;
125 mode_config
->funcs
= &intel_mode_funcs
;
126 mode_config
->helper_private
= &intel_mode_config_funcs
;
128 mode_config
->async_page_flip
= HAS_ASYNC_FLIPS(i915
);
131 * Maximum framebuffer dimensions, chosen to match
132 * the maximum render engine surface size on gen4+.
134 if (DISPLAY_VER(i915
) >= 7) {
135 mode_config
->max_width
= 16384;
136 mode_config
->max_height
= 16384;
137 } else if (DISPLAY_VER(i915
) >= 4) {
138 mode_config
->max_width
= 8192;
139 mode_config
->max_height
= 8192;
140 } else if (DISPLAY_VER(i915
) == 3) {
141 mode_config
->max_width
= 4096;
142 mode_config
->max_height
= 4096;
144 mode_config
->max_width
= 2048;
145 mode_config
->max_height
= 2048;
148 if (IS_I845G(i915
) || IS_I865G(i915
)) {
149 mode_config
->cursor_width
= IS_I845G(i915
) ? 64 : 512;
150 mode_config
->cursor_height
= 1023;
151 } else if (IS_I830(i915
) || IS_I85X(i915
) ||
152 IS_I915G(i915
) || IS_I915GM(i915
)) {
153 mode_config
->cursor_width
= 64;
154 mode_config
->cursor_height
= 64;
156 mode_config
->cursor_width
= 256;
157 mode_config
->cursor_height
= 256;
161 static void intel_mode_config_cleanup(struct drm_i915_private
*i915
)
163 intel_atomic_global_obj_cleanup(i915
);
164 drm_mode_config_cleanup(&i915
->drm
);
167 static void intel_plane_possible_crtcs_init(struct drm_i915_private
*dev_priv
)
169 struct intel_plane
*plane
;
171 for_each_intel_plane(&dev_priv
->drm
, plane
) {
172 struct intel_crtc
*crtc
= intel_crtc_for_pipe(dev_priv
,
175 plane
->base
.possible_crtcs
= drm_crtc_mask(&crtc
->base
);
179 void intel_display_driver_early_probe(struct drm_i915_private
*i915
)
181 if (!HAS_DISPLAY(i915
))
184 spin_lock_init(&i915
->display
.fb_tracking
.lock
);
185 mutex_init(&i915
->display
.backlight
.lock
);
186 mutex_init(&i915
->display
.audio
.mutex
);
187 mutex_init(&i915
->display
.wm
.wm_mutex
);
188 mutex_init(&i915
->display
.pps
.mutex
);
189 mutex_init(&i915
->display
.hdcp
.hdcp_mutex
);
191 intel_display_irq_init(i915
);
192 intel_dkl_phy_init(i915
);
193 intel_color_init_hooks(i915
);
194 intel_init_cdclk_hooks(i915
);
195 intel_audio_hooks_init(i915
);
196 intel_dpll_init_clock_hook(i915
);
197 intel_init_display_hooks(i915
);
198 intel_fdi_init_hook(i915
);
201 /* part #1: call before irq install */
202 int intel_display_driver_probe_noirq(struct drm_i915_private
*i915
)
206 if (i915_inject_probe_failure(i915
))
209 if (HAS_DISPLAY(i915
)) {
210 ret
= drm_vblank_init(&i915
->drm
,
211 INTEL_NUM_PIPES(i915
));
216 intel_bios_init(i915
);
218 ret
= intel_vga_register(i915
);
222 /* FIXME: completely on the wrong abstraction layer */
223 ret
= intel_power_domains_init(i915
);
227 intel_pmdemand_init_early(i915
);
229 intel_power_domains_init_hw(i915
, false);
231 if (!HAS_DISPLAY(i915
))
234 intel_dmc_init(i915
);
236 i915
->display
.wq
.modeset
= alloc_ordered_workqueue("i915_modeset", 0);
237 i915
->display
.wq
.flip
= alloc_workqueue("i915_flip", WQ_HIGHPRI
|
238 WQ_UNBOUND
, WQ_UNBOUND_MAX_ACTIVE
);
240 intel_mode_config_init(i915
);
242 ret
= intel_cdclk_init(i915
);
244 goto cleanup_vga_client_pw_domain_dmc
;
246 ret
= intel_color_init(i915
);
248 goto cleanup_vga_client_pw_domain_dmc
;
250 ret
= intel_dbuf_init(i915
);
252 goto cleanup_vga_client_pw_domain_dmc
;
254 ret
= intel_bw_init(i915
);
256 goto cleanup_vga_client_pw_domain_dmc
;
258 ret
= intel_pmdemand_init(i915
);
260 goto cleanup_vga_client_pw_domain_dmc
;
262 intel_init_quirks(i915
);
264 intel_fbc_init(i915
);
268 cleanup_vga_client_pw_domain_dmc
:
269 intel_dmc_fini(i915
);
270 intel_power_domains_driver_remove(i915
);
272 intel_vga_unregister(i915
);
274 intel_bios_driver_remove(i915
);
279 /* part #2: call after irq install, but before gem init */
280 int intel_display_driver_probe_nogem(struct drm_i915_private
*i915
)
282 struct drm_device
*dev
= &i915
->drm
;
284 struct intel_crtc
*crtc
;
287 if (!HAS_DISPLAY(i915
))
292 intel_panel_sanitize_ssc(i915
);
294 intel_pps_setup(i915
);
296 intel_gmbus_setup(i915
);
298 drm_dbg_kms(&i915
->drm
, "%d display pipe%s available.\n",
299 INTEL_NUM_PIPES(i915
),
300 INTEL_NUM_PIPES(i915
) > 1 ? "s" : "");
302 for_each_pipe(i915
, pipe
) {
303 ret
= intel_crtc_init(i915
, pipe
);
305 intel_mode_config_cleanup(i915
);
310 intel_plane_possible_crtcs_init(i915
);
311 intel_shared_dpll_init(i915
);
312 intel_fdi_pll_freq_update(i915
);
314 intel_update_czclk(i915
);
315 intel_display_driver_init_hw(i915
);
316 intel_dpll_update_ref_clks(i915
);
318 intel_hdcp_component_init(i915
);
320 if (i915
->display
.cdclk
.max_cdclk_freq
== 0)
321 intel_update_max_cdclk(i915
);
323 intel_hti_init(i915
);
325 /* Just disable it once at startup */
326 intel_vga_disable(i915
);
327 intel_setup_outputs(i915
);
329 drm_modeset_lock_all(dev
);
330 intel_modeset_setup_hw_state(i915
, dev
->mode_config
.acquire_ctx
);
331 intel_acpi_assign_connector_fwnodes(i915
);
332 drm_modeset_unlock_all(dev
);
334 for_each_intel_crtc(dev
, crtc
) {
335 if (!to_intel_crtc_state(crtc
->base
.state
)->uapi
.active
)
337 intel_crtc_initial_plane_config(crtc
);
341 * Make sure hardware watermarks really match the state we read out.
342 * Note that we need to do this after reconstructing the BIOS fb's
343 * since the watermark calculation done here will use pstate->fb.
346 ilk_wm_sanitize(i915
);
351 /* part #3: call after gem init */
352 int intel_display_driver_probe(struct drm_i915_private
*i915
)
356 if (!HAS_DISPLAY(i915
))
360 * Force all active planes to recompute their states. So that on
361 * mode_setcrtc after probe, all the intel_plane_state variables
362 * are already calculated and there is no assert_plane warnings
365 ret
= intel_initial_commit(&i915
->drm
);
367 drm_dbg_kms(&i915
->drm
, "Initial modeset failed, %d\n", ret
);
369 intel_overlay_setup(i915
);
371 ret
= intel_fbdev_init(&i915
->drm
);
375 /* Only enable hotplug handling once the fbdev is fully set up. */
376 intel_hpd_init(i915
);
377 intel_hpd_poll_disable(i915
);
379 skl_watermark_ipc_init(i915
);
384 void intel_display_driver_register(struct drm_i915_private
*i915
)
386 struct drm_printer p
= drm_debug_printer("i915 display info:");
388 if (!HAS_DISPLAY(i915
))
391 /* Must be done after probing outputs */
392 intel_opregion_register(i915
);
393 intel_acpi_video_register(i915
);
395 intel_audio_init(i915
);
397 intel_display_debugfs_register(i915
);
400 * Some ports require correctly set-up hpd registers for
401 * detection to work properly (leading to ghost connected
402 * connector status), e.g. VGA on gm45. Hence we can only set
403 * up the initial fbdev config after hpd irqs are fully
404 * enabled. We do it last so that the async config cannot run
405 * before the connectors are registered.
407 intel_fbdev_initial_config_async(i915
);
410 * We need to coordinate the hotplugs with the asynchronous
411 * fbdev configuration, for which we use the
412 * fbdev->async_cookie.
414 drm_kms_helper_poll_init(&i915
->drm
);
416 intel_display_device_info_print(DISPLAY_INFO(i915
),
417 DISPLAY_RUNTIME_INFO(i915
), &p
);
420 /* part #1: call before irq uninstall */
421 void intel_display_driver_remove(struct drm_i915_private
*i915
)
423 if (!HAS_DISPLAY(i915
))
426 flush_workqueue(i915
->display
.wq
.flip
);
427 flush_workqueue(i915
->display
.wq
.modeset
);
430 * MST topology needs to be suspended so we don't have any calls to
431 * fbdev after it's finalized. MST will be destroyed later as part of
432 * drm_mode_config_cleanup()
434 intel_dp_mst_suspend(i915
);
437 /* part #2: call after irq uninstall */
438 void intel_display_driver_remove_noirq(struct drm_i915_private
*i915
)
440 if (!HAS_DISPLAY(i915
))
444 * Due to the hpd irq storm handling the hotplug work can re-arm the
445 * poll handlers. Hence disable polling after hpd handling is shut down.
447 intel_hpd_poll_fini(i915
);
449 /* poll work can call into fbdev, hence clean that up afterwards */
450 intel_fbdev_fini(i915
);
452 intel_unregister_dsm_handler();
454 /* flush any delayed tasks or pending work */
455 flush_workqueue(i915
->unordered_wq
);
457 intel_hdcp_component_fini(i915
);
459 intel_mode_config_cleanup(i915
);
461 intel_overlay_cleanup(i915
);
463 intel_gmbus_teardown(i915
);
465 destroy_workqueue(i915
->display
.wq
.flip
);
466 destroy_workqueue(i915
->display
.wq
.modeset
);
468 intel_fbc_cleanup(i915
);
471 /* part #3: call after gem init */
472 void intel_display_driver_remove_nogem(struct drm_i915_private
*i915
)
474 intel_dmc_fini(i915
);
476 intel_power_domains_driver_remove(i915
);
478 intel_vga_unregister(i915
);
480 intel_bios_driver_remove(i915
);
483 void intel_display_driver_unregister(struct drm_i915_private
*i915
)
485 if (!HAS_DISPLAY(i915
))
488 intel_fbdev_unregister(i915
);
489 intel_audio_deinit(i915
);
492 * After flushing the fbdev (incl. a late async config which
493 * will have delayed queuing of a hotplug event), then flush
494 * the hotplug events.
496 drm_kms_helper_poll_fini(&i915
->drm
);
497 drm_atomic_helper_shutdown(&i915
->drm
);
499 acpi_video_unregister();
500 intel_opregion_unregister(i915
);
504 * turn all crtc's off, but do not adjust state
505 * This has to be paired with a call to intel_modeset_setup_hw_state.
507 int intel_display_driver_suspend(struct drm_i915_private
*i915
)
509 struct drm_atomic_state
*state
;
512 if (!HAS_DISPLAY(i915
))
515 state
= drm_atomic_helper_suspend(&i915
->drm
);
516 ret
= PTR_ERR_OR_ZERO(state
);
518 drm_err(&i915
->drm
, "Suspending crtc's failed with %i\n",
521 i915
->display
.restore
.modeset_state
= state
;
526 __intel_display_driver_resume(struct drm_i915_private
*i915
,
527 struct drm_atomic_state
*state
,
528 struct drm_modeset_acquire_ctx
*ctx
)
530 struct drm_crtc_state
*crtc_state
;
531 struct drm_crtc
*crtc
;
534 intel_modeset_setup_hw_state(i915
, ctx
);
535 intel_vga_redisable(i915
);
541 * We've duplicated the state, pointers to the old state are invalid.
543 * Don't attempt to use the old state until we commit the duplicated state.
545 for_each_new_crtc_in_state(state
, crtc
, crtc_state
, i
) {
547 * Force recalculation even if we restore
548 * current state. With fast modeset this may not result
549 * in a modeset when the state is compatible.
551 crtc_state
->mode_changed
= true;
554 /* ignore any reset values/BIOS leftovers in the WM registers */
556 to_intel_atomic_state(state
)->skip_intermediate_wm
= true;
558 ret
= drm_atomic_helper_commit_duplicated_state(state
, ctx
);
560 drm_WARN_ON(&i915
->drm
, ret
== -EDEADLK
);
565 void intel_display_driver_resume(struct drm_i915_private
*i915
)
567 struct drm_atomic_state
*state
= i915
->display
.restore
.modeset_state
;
568 struct drm_modeset_acquire_ctx ctx
;
571 if (!HAS_DISPLAY(i915
))
574 i915
->display
.restore
.modeset_state
= NULL
;
576 state
->acquire_ctx
= &ctx
;
578 drm_modeset_acquire_init(&ctx
, 0);
581 ret
= drm_modeset_lock_all_ctx(&i915
->drm
, &ctx
);
585 drm_modeset_backoff(&ctx
);
589 ret
= __intel_display_driver_resume(i915
, state
, &ctx
);
591 skl_watermark_ipc_update(i915
);
592 drm_modeset_drop_locks(&ctx
);
593 drm_modeset_acquire_fini(&ctx
);
597 "Restoring old state failed with %i\n", ret
);
599 drm_atomic_state_put(state
);