169d43981SMatt Roper // SPDX-License-Identifier: MIT
269d43981SMatt Roper /*
369d43981SMatt Roper * Copyright © 2023 Intel Corporation
469d43981SMatt Roper */
569d43981SMatt Roper
669d43981SMatt Roper #include <drm/i915_pciids.h>
769d43981SMatt Roper #include <drm/drm_color_mgmt.h>
812e6f6dcSMatt Roper #include <linux/pci.h>
969d43981SMatt Roper
1012e6f6dcSMatt Roper #include "i915_drv.h"
1112e6f6dcSMatt Roper #include "i915_reg.h"
122d0cdf60SMatt Roper #include "intel_de.h"
132d0cdf60SMatt Roper #include "intel_display.h"
1469d43981SMatt Roper #include "intel_display_device.h"
1569d43981SMatt Roper #include "intel_display_power.h"
1669d43981SMatt Roper #include "intel_display_reg_defs.h"
1769d43981SMatt Roper #include "intel_fbc.h"
1869d43981SMatt Roper
1969d43981SMatt Roper static const struct intel_display_device_info no_display = {};
2069d43981SMatt Roper
2169d43981SMatt Roper #define PIPE_A_OFFSET 0x70000
2269d43981SMatt Roper #define PIPE_B_OFFSET 0x71000
2369d43981SMatt Roper #define PIPE_C_OFFSET 0x72000
2469d43981SMatt Roper #define PIPE_D_OFFSET 0x73000
2569d43981SMatt Roper #define CHV_PIPE_C_OFFSET 0x74000
2669d43981SMatt Roper /*
2769d43981SMatt Roper * There's actually no pipe EDP. Some pipe registers have
2869d43981SMatt Roper * simply shifted from the pipe to the transcoder, while
2969d43981SMatt Roper * keeping their original offset. Thus we need PIPE_EDP_OFFSET
3069d43981SMatt Roper * to access such registers in transcoder EDP.
3169d43981SMatt Roper */
3269d43981SMatt Roper #define PIPE_EDP_OFFSET 0x7f000
3369d43981SMatt Roper
3469d43981SMatt Roper /* ICL DSI 0 and 1 */
3569d43981SMatt Roper #define PIPE_DSI0_OFFSET 0x7b000
3669d43981SMatt Roper #define PIPE_DSI1_OFFSET 0x7b800
3769d43981SMatt Roper
3869d43981SMatt Roper #define TRANSCODER_A_OFFSET 0x60000
3969d43981SMatt Roper #define TRANSCODER_B_OFFSET 0x61000
4069d43981SMatt Roper #define TRANSCODER_C_OFFSET 0x62000
4169d43981SMatt Roper #define CHV_TRANSCODER_C_OFFSET 0x63000
4269d43981SMatt Roper #define TRANSCODER_D_OFFSET 0x63000
4369d43981SMatt Roper #define TRANSCODER_EDP_OFFSET 0x6f000
4469d43981SMatt Roper #define TRANSCODER_DSI0_OFFSET 0x6b000
4569d43981SMatt Roper #define TRANSCODER_DSI1_OFFSET 0x6b800
4669d43981SMatt Roper
4769d43981SMatt Roper #define CURSOR_A_OFFSET 0x70080
4869d43981SMatt Roper #define CURSOR_B_OFFSET 0x700c0
4969d43981SMatt Roper #define CHV_CURSOR_C_OFFSET 0x700e0
5069d43981SMatt Roper #define IVB_CURSOR_B_OFFSET 0x71080
5169d43981SMatt Roper #define IVB_CURSOR_C_OFFSET 0x72080
5269d43981SMatt Roper #define TGL_CURSOR_D_OFFSET 0x73080
5369d43981SMatt Roper
5469d43981SMatt Roper #define I845_PIPE_OFFSETS \
5569d43981SMatt Roper .pipe_offsets = { \
5669d43981SMatt Roper [TRANSCODER_A] = PIPE_A_OFFSET, \
5769d43981SMatt Roper }, \
5869d43981SMatt Roper .trans_offsets = { \
5969d43981SMatt Roper [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
6069d43981SMatt Roper }
6169d43981SMatt Roper
6269d43981SMatt Roper #define I9XX_PIPE_OFFSETS \
6369d43981SMatt Roper .pipe_offsets = { \
6469d43981SMatt Roper [TRANSCODER_A] = PIPE_A_OFFSET, \
6569d43981SMatt Roper [TRANSCODER_B] = PIPE_B_OFFSET, \
6669d43981SMatt Roper }, \
6769d43981SMatt Roper .trans_offsets = { \
6869d43981SMatt Roper [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
6969d43981SMatt Roper [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
7069d43981SMatt Roper }
7169d43981SMatt Roper
7269d43981SMatt Roper #define IVB_PIPE_OFFSETS \
7369d43981SMatt Roper .pipe_offsets = { \
7469d43981SMatt Roper [TRANSCODER_A] = PIPE_A_OFFSET, \
7569d43981SMatt Roper [TRANSCODER_B] = PIPE_B_OFFSET, \
7669d43981SMatt Roper [TRANSCODER_C] = PIPE_C_OFFSET, \
7769d43981SMatt Roper }, \
7869d43981SMatt Roper .trans_offsets = { \
7969d43981SMatt Roper [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
8069d43981SMatt Roper [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
8169d43981SMatt Roper [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
8269d43981SMatt Roper }
8369d43981SMatt Roper
8469d43981SMatt Roper #define HSW_PIPE_OFFSETS \
8569d43981SMatt Roper .pipe_offsets = { \
8669d43981SMatt Roper [TRANSCODER_A] = PIPE_A_OFFSET, \
8769d43981SMatt Roper [TRANSCODER_B] = PIPE_B_OFFSET, \
8869d43981SMatt Roper [TRANSCODER_C] = PIPE_C_OFFSET, \
8969d43981SMatt Roper [TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
9069d43981SMatt Roper }, \
9169d43981SMatt Roper .trans_offsets = { \
9269d43981SMatt Roper [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
9369d43981SMatt Roper [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
9469d43981SMatt Roper [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
9569d43981SMatt Roper [TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
9669d43981SMatt Roper }
9769d43981SMatt Roper
9869d43981SMatt Roper #define CHV_PIPE_OFFSETS \
9969d43981SMatt Roper .pipe_offsets = { \
10069d43981SMatt Roper [TRANSCODER_A] = PIPE_A_OFFSET, \
10169d43981SMatt Roper [TRANSCODER_B] = PIPE_B_OFFSET, \
10269d43981SMatt Roper [TRANSCODER_C] = CHV_PIPE_C_OFFSET, \
10369d43981SMatt Roper }, \
10469d43981SMatt Roper .trans_offsets = { \
10569d43981SMatt Roper [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
10669d43981SMatt Roper [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
10769d43981SMatt Roper [TRANSCODER_C] = CHV_TRANSCODER_C_OFFSET, \
10869d43981SMatt Roper }
10969d43981SMatt Roper
11069d43981SMatt Roper #define I845_CURSOR_OFFSETS \
11169d43981SMatt Roper .cursor_offsets = { \
11269d43981SMatt Roper [PIPE_A] = CURSOR_A_OFFSET, \
11369d43981SMatt Roper }
11469d43981SMatt Roper
11569d43981SMatt Roper #define I9XX_CURSOR_OFFSETS \
11669d43981SMatt Roper .cursor_offsets = { \
11769d43981SMatt Roper [PIPE_A] = CURSOR_A_OFFSET, \
11869d43981SMatt Roper [PIPE_B] = CURSOR_B_OFFSET, \
11969d43981SMatt Roper }
12069d43981SMatt Roper
12169d43981SMatt Roper #define CHV_CURSOR_OFFSETS \
12269d43981SMatt Roper .cursor_offsets = { \
12369d43981SMatt Roper [PIPE_A] = CURSOR_A_OFFSET, \
12469d43981SMatt Roper [PIPE_B] = CURSOR_B_OFFSET, \
12569d43981SMatt Roper [PIPE_C] = CHV_CURSOR_C_OFFSET, \
12669d43981SMatt Roper }
12769d43981SMatt Roper
12869d43981SMatt Roper #define IVB_CURSOR_OFFSETS \
12969d43981SMatt Roper .cursor_offsets = { \
13069d43981SMatt Roper [PIPE_A] = CURSOR_A_OFFSET, \
13169d43981SMatt Roper [PIPE_B] = IVB_CURSOR_B_OFFSET, \
13269d43981SMatt Roper [PIPE_C] = IVB_CURSOR_C_OFFSET, \
13369d43981SMatt Roper }
13469d43981SMatt Roper
13569d43981SMatt Roper #define TGL_CURSOR_OFFSETS \
13669d43981SMatt Roper .cursor_offsets = { \
13769d43981SMatt Roper [PIPE_A] = CURSOR_A_OFFSET, \
13869d43981SMatt Roper [PIPE_B] = IVB_CURSOR_B_OFFSET, \
13969d43981SMatt Roper [PIPE_C] = IVB_CURSOR_C_OFFSET, \
14069d43981SMatt Roper [PIPE_D] = TGL_CURSOR_D_OFFSET, \
14169d43981SMatt Roper }
14269d43981SMatt Roper
14369d43981SMatt Roper #define I845_COLORS \
14469d43981SMatt Roper .color = { .gamma_lut_size = 256 }
14569d43981SMatt Roper #define I9XX_COLORS \
14669d43981SMatt Roper .color = { .gamma_lut_size = 129, \
14769d43981SMatt Roper .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
14869d43981SMatt Roper }
14969d43981SMatt Roper #define ILK_COLORS \
15069d43981SMatt Roper .color = { .gamma_lut_size = 1024 }
15169d43981SMatt Roper #define IVB_COLORS \
15269d43981SMatt Roper .color = { .degamma_lut_size = 1024, .gamma_lut_size = 1024 }
15369d43981SMatt Roper #define CHV_COLORS \
15469d43981SMatt Roper .color = { \
15569d43981SMatt Roper .degamma_lut_size = 65, .gamma_lut_size = 257, \
15669d43981SMatt Roper .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
15769d43981SMatt Roper .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
15869d43981SMatt Roper }
15969d43981SMatt Roper #define GLK_COLORS \
16069d43981SMatt Roper .color = { \
16169d43981SMatt Roper .degamma_lut_size = 33, .gamma_lut_size = 1024, \
16269d43981SMatt Roper .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING | \
16369d43981SMatt Roper DRM_COLOR_LUT_EQUAL_CHANNELS, \
16469d43981SMatt Roper }
16569d43981SMatt Roper #define ICL_COLORS \
16669d43981SMatt Roper .color = { \
16769d43981SMatt Roper .degamma_lut_size = 33, .gamma_lut_size = 262145, \
16869d43981SMatt Roper .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING | \
16969d43981SMatt Roper DRM_COLOR_LUT_EQUAL_CHANNELS, \
17069d43981SMatt Roper .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
17169d43981SMatt Roper }
17269d43981SMatt Roper
17369d43981SMatt Roper #define I830_DISPLAY \
17469d43981SMatt Roper .has_overlay = 1, \
17569d43981SMatt Roper .cursor_needs_physical = 1, \
17669d43981SMatt Roper .overlay_needs_physical = 1, \
17769d43981SMatt Roper .has_gmch = 1, \
17869d43981SMatt Roper I9XX_PIPE_OFFSETS, \
17969d43981SMatt Roper I9XX_CURSOR_OFFSETS, \
18069d43981SMatt Roper I9XX_COLORS, \
18169d43981SMatt Roper \
18269d43981SMatt Roper .__runtime_defaults.ip.ver = 2, \
18369d43981SMatt Roper .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
18469d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask = \
18569d43981SMatt Roper BIT(TRANSCODER_A) | BIT(TRANSCODER_B)
18669d43981SMatt Roper
18769d43981SMatt Roper #define I845_DISPLAY \
18869d43981SMatt Roper .has_overlay = 1, \
18969d43981SMatt Roper .overlay_needs_physical = 1, \
19069d43981SMatt Roper .has_gmch = 1, \
19169d43981SMatt Roper I845_PIPE_OFFSETS, \
19269d43981SMatt Roper I845_CURSOR_OFFSETS, \
19369d43981SMatt Roper I845_COLORS, \
19469d43981SMatt Roper \
19569d43981SMatt Roper .__runtime_defaults.ip.ver = 2, \
19669d43981SMatt Roper .__runtime_defaults.pipe_mask = BIT(PIPE_A), \
19769d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask = BIT(TRANSCODER_A)
19869d43981SMatt Roper
1992798e4d1SVille Syrjälä static const struct intel_display_device_info i830_display = {
2002798e4d1SVille Syrjälä I830_DISPLAY,
2012798e4d1SVille Syrjälä
2022798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C), /* DVO A/B/C */
2032798e4d1SVille Syrjälä };
2042798e4d1SVille Syrjälä
20569d43981SMatt Roper static const struct intel_display_device_info i845_display = {
20669d43981SMatt Roper I845_DISPLAY,
2072798e4d1SVille Syrjälä
2082798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* DVO B/C */
20969d43981SMatt Roper };
21069d43981SMatt Roper
21169d43981SMatt Roper static const struct intel_display_device_info i85x_display = {
21269d43981SMatt Roper I830_DISPLAY,
21369d43981SMatt Roper
2142798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* DVO B/C */
21569d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A),
21669d43981SMatt Roper };
21769d43981SMatt Roper
21869d43981SMatt Roper static const struct intel_display_device_info i865g_display = {
21969d43981SMatt Roper I845_DISPLAY,
22069d43981SMatt Roper
2212798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* DVO B/C */
22269d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A),
22369d43981SMatt Roper };
22469d43981SMatt Roper
22569d43981SMatt Roper #define GEN3_DISPLAY \
22669d43981SMatt Roper .has_gmch = 1, \
22769d43981SMatt Roper .has_overlay = 1, \
22869d43981SMatt Roper I9XX_PIPE_OFFSETS, \
22969d43981SMatt Roper I9XX_CURSOR_OFFSETS, \
23069d43981SMatt Roper \
23169d43981SMatt Roper .__runtime_defaults.ip.ver = 3, \
23269d43981SMatt Roper .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
23369d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask = \
2342798e4d1SVille Syrjälä BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
2352798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C) /* SDVO B/C */
23669d43981SMatt Roper
23769d43981SMatt Roper static const struct intel_display_device_info i915g_display = {
23869d43981SMatt Roper GEN3_DISPLAY,
23919db2062SVille Syrjälä I845_COLORS,
24069d43981SMatt Roper .cursor_needs_physical = 1,
24169d43981SMatt Roper .overlay_needs_physical = 1,
24269d43981SMatt Roper };
24369d43981SMatt Roper
24469d43981SMatt Roper static const struct intel_display_device_info i915gm_display = {
24569d43981SMatt Roper GEN3_DISPLAY,
24619db2062SVille Syrjälä I9XX_COLORS,
24769d43981SMatt Roper .cursor_needs_physical = 1,
24869d43981SMatt Roper .overlay_needs_physical = 1,
24969d43981SMatt Roper .supports_tv = 1,
25069d43981SMatt Roper
25169d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A),
25269d43981SMatt Roper };
25369d43981SMatt Roper
25469d43981SMatt Roper static const struct intel_display_device_info i945g_display = {
25569d43981SMatt Roper GEN3_DISPLAY,
25619db2062SVille Syrjälä I845_COLORS,
25769d43981SMatt Roper .has_hotplug = 1,
25869d43981SMatt Roper .cursor_needs_physical = 1,
25969d43981SMatt Roper .overlay_needs_physical = 1,
26069d43981SMatt Roper };
26169d43981SMatt Roper
26269d43981SMatt Roper static const struct intel_display_device_info i945gm_display = {
26369d43981SMatt Roper GEN3_DISPLAY,
26419db2062SVille Syrjälä I9XX_COLORS,
26569d43981SMatt Roper .has_hotplug = 1,
26669d43981SMatt Roper .cursor_needs_physical = 1,
26769d43981SMatt Roper .overlay_needs_physical = 1,
26869d43981SMatt Roper .supports_tv = 1,
26969d43981SMatt Roper
27069d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A),
27169d43981SMatt Roper };
27269d43981SMatt Roper
27369d43981SMatt Roper static const struct intel_display_device_info g33_display = {
27469d43981SMatt Roper GEN3_DISPLAY,
27519db2062SVille Syrjälä I845_COLORS,
27619db2062SVille Syrjälä .has_hotplug = 1,
27719db2062SVille Syrjälä };
27819db2062SVille Syrjälä
27919db2062SVille Syrjälä static const struct intel_display_device_info pnv_display = {
28019db2062SVille Syrjälä GEN3_DISPLAY,
28119db2062SVille Syrjälä I9XX_COLORS,
28269d43981SMatt Roper .has_hotplug = 1,
28369d43981SMatt Roper };
28469d43981SMatt Roper
28569d43981SMatt Roper #define GEN4_DISPLAY \
28669d43981SMatt Roper .has_hotplug = 1, \
28769d43981SMatt Roper .has_gmch = 1, \
28869d43981SMatt Roper I9XX_PIPE_OFFSETS, \
28969d43981SMatt Roper I9XX_CURSOR_OFFSETS, \
29069d43981SMatt Roper I9XX_COLORS, \
29169d43981SMatt Roper \
29269d43981SMatt Roper .__runtime_defaults.ip.ver = 4, \
29369d43981SMatt Roper .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
29469d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask = \
29569d43981SMatt Roper BIT(TRANSCODER_A) | BIT(TRANSCODER_B)
29669d43981SMatt Roper
29769d43981SMatt Roper static const struct intel_display_device_info i965g_display = {
29869d43981SMatt Roper GEN4_DISPLAY,
29969d43981SMatt Roper .has_overlay = 1,
3002798e4d1SVille Syrjälä
3012798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* SDVO B/C */
30269d43981SMatt Roper };
30369d43981SMatt Roper
30469d43981SMatt Roper static const struct intel_display_device_info i965gm_display = {
30569d43981SMatt Roper GEN4_DISPLAY,
30669d43981SMatt Roper .has_overlay = 1,
30769d43981SMatt Roper .supports_tv = 1,
30869d43981SMatt Roper
3092798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* SDVO B/C */
31069d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A),
31169d43981SMatt Roper };
31269d43981SMatt Roper
31369d43981SMatt Roper static const struct intel_display_device_info g45_display = {
31469d43981SMatt Roper GEN4_DISPLAY,
3152798e4d1SVille Syrjälä
3162798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D), /* SDVO/HDMI/DP B/C, DP D */
31769d43981SMatt Roper };
31869d43981SMatt Roper
31969d43981SMatt Roper static const struct intel_display_device_info gm45_display = {
32069d43981SMatt Roper GEN4_DISPLAY,
32169d43981SMatt Roper .supports_tv = 1,
32269d43981SMatt Roper
3232798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D), /* SDVO/HDMI/DP B/C, DP D */
32469d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A),
32569d43981SMatt Roper };
32669d43981SMatt Roper
32769d43981SMatt Roper #define ILK_DISPLAY \
32869d43981SMatt Roper .has_hotplug = 1, \
32969d43981SMatt Roper I9XX_PIPE_OFFSETS, \
33069d43981SMatt Roper I9XX_CURSOR_OFFSETS, \
33169d43981SMatt Roper ILK_COLORS, \
33269d43981SMatt Roper \
33369d43981SMatt Roper .__runtime_defaults.ip.ver = 5, \
33469d43981SMatt Roper .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
33569d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask = \
3362798e4d1SVille Syrjälä BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
3372798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D) /* DP A, SDVO/HDMI/DP B, HDMI/DP C/D */
33869d43981SMatt Roper
33969d43981SMatt Roper static const struct intel_display_device_info ilk_d_display = {
34069d43981SMatt Roper ILK_DISPLAY,
34169d43981SMatt Roper };
34269d43981SMatt Roper
34369d43981SMatt Roper static const struct intel_display_device_info ilk_m_display = {
34469d43981SMatt Roper ILK_DISPLAY,
34569d43981SMatt Roper
34669d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A),
34769d43981SMatt Roper };
34869d43981SMatt Roper
34969d43981SMatt Roper static const struct intel_display_device_info snb_display = {
35069d43981SMatt Roper .has_hotplug = 1,
35169d43981SMatt Roper I9XX_PIPE_OFFSETS,
35269d43981SMatt Roper I9XX_CURSOR_OFFSETS,
35369d43981SMatt Roper ILK_COLORS,
35469d43981SMatt Roper
35569d43981SMatt Roper .__runtime_defaults.ip.ver = 6,
35669d43981SMatt Roper .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B),
35769d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask =
35869d43981SMatt Roper BIT(TRANSCODER_A) | BIT(TRANSCODER_B),
3592798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D), /* DP A, SDVO/HDMI/DP B, HDMI/DP C/D */
36069d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A),
36169d43981SMatt Roper };
36269d43981SMatt Roper
36369d43981SMatt Roper static const struct intel_display_device_info ivb_display = {
36469d43981SMatt Roper .has_hotplug = 1,
36569d43981SMatt Roper IVB_PIPE_OFFSETS,
36669d43981SMatt Roper IVB_CURSOR_OFFSETS,
36769d43981SMatt Roper IVB_COLORS,
36869d43981SMatt Roper
36969d43981SMatt Roper .__runtime_defaults.ip.ver = 7,
37069d43981SMatt Roper .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
37169d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask =
37269d43981SMatt Roper BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C),
3732798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D), /* DP A, SDVO/HDMI/DP B, HDMI/DP C/D */
37469d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A),
37569d43981SMatt Roper };
37669d43981SMatt Roper
37769d43981SMatt Roper static const struct intel_display_device_info vlv_display = {
37869d43981SMatt Roper .has_gmch = 1,
37969d43981SMatt Roper .has_hotplug = 1,
38069d43981SMatt Roper .mmio_offset = VLV_DISPLAY_BASE,
38169d43981SMatt Roper I9XX_PIPE_OFFSETS,
38269d43981SMatt Roper I9XX_CURSOR_OFFSETS,
38369d43981SMatt Roper I9XX_COLORS,
38469d43981SMatt Roper
38569d43981SMatt Roper .__runtime_defaults.ip.ver = 7,
38669d43981SMatt Roper .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B),
38769d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask =
38869d43981SMatt Roper BIT(TRANSCODER_A) | BIT(TRANSCODER_B),
3892798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* HDMI/DP B/C */
39069d43981SMatt Roper };
39169d43981SMatt Roper
39269d43981SMatt Roper static const struct intel_display_device_info hsw_display = {
39369d43981SMatt Roper .has_ddi = 1,
39469d43981SMatt Roper .has_dp_mst = 1,
39569d43981SMatt Roper .has_fpga_dbg = 1,
39669d43981SMatt Roper .has_hotplug = 1,
397783d8b80SVille Syrjälä .has_psr = 1,
398783d8b80SVille Syrjälä .has_psr_hw_tracking = 1,
39969d43981SMatt Roper HSW_PIPE_OFFSETS,
40069d43981SMatt Roper IVB_CURSOR_OFFSETS,
40169d43981SMatt Roper IVB_COLORS,
40269d43981SMatt Roper
40369d43981SMatt Roper .__runtime_defaults.ip.ver = 7,
40469d43981SMatt Roper .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
40569d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask =
40669d43981SMatt Roper BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
40769d43981SMatt Roper BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP),
4082798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D) | BIT(PORT_E),
40969d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A),
41069d43981SMatt Roper };
41169d43981SMatt Roper
41269d43981SMatt Roper static const struct intel_display_device_info bdw_display = {
41369d43981SMatt Roper .has_ddi = 1,
41469d43981SMatt Roper .has_dp_mst = 1,
41569d43981SMatt Roper .has_fpga_dbg = 1,
41669d43981SMatt Roper .has_hotplug = 1,
417783d8b80SVille Syrjälä .has_psr = 1,
418783d8b80SVille Syrjälä .has_psr_hw_tracking = 1,
41969d43981SMatt Roper HSW_PIPE_OFFSETS,
42069d43981SMatt Roper IVB_CURSOR_OFFSETS,
42169d43981SMatt Roper IVB_COLORS,
42269d43981SMatt Roper
42369d43981SMatt Roper .__runtime_defaults.ip.ver = 8,
42469d43981SMatt Roper .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
42569d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask =
42669d43981SMatt Roper BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
42769d43981SMatt Roper BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP),
4282798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D) | BIT(PORT_E),
42969d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A),
43069d43981SMatt Roper };
43169d43981SMatt Roper
43269d43981SMatt Roper static const struct intel_display_device_info chv_display = {
43369d43981SMatt Roper .has_hotplug = 1,
43469d43981SMatt Roper .has_gmch = 1,
43569d43981SMatt Roper .mmio_offset = VLV_DISPLAY_BASE,
43669d43981SMatt Roper CHV_PIPE_OFFSETS,
43769d43981SMatt Roper CHV_CURSOR_OFFSETS,
43869d43981SMatt Roper CHV_COLORS,
43969d43981SMatt Roper
44069d43981SMatt Roper .__runtime_defaults.ip.ver = 8,
44169d43981SMatt Roper .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
44269d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask =
44369d43981SMatt Roper BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C),
4442798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D), /* HDMI/DP B/C/D */
44569d43981SMatt Roper };
44669d43981SMatt Roper
44769d43981SMatt Roper static const struct intel_display_device_info skl_display = {
44869d43981SMatt Roper .dbuf.size = 896 - 4, /* 4 blocks for bypass path allocation */
44969d43981SMatt Roper .dbuf.slice_mask = BIT(DBUF_S1),
45069d43981SMatt Roper .has_ddi = 1,
45169d43981SMatt Roper .has_dp_mst = 1,
45269d43981SMatt Roper .has_fpga_dbg = 1,
45369d43981SMatt Roper .has_hotplug = 1,
45469d43981SMatt Roper .has_ipc = 1,
45569d43981SMatt Roper .has_psr = 1,
45669d43981SMatt Roper .has_psr_hw_tracking = 1,
45769d43981SMatt Roper HSW_PIPE_OFFSETS,
45869d43981SMatt Roper IVB_CURSOR_OFFSETS,
45969d43981SMatt Roper IVB_COLORS,
46069d43981SMatt Roper
46169d43981SMatt Roper .__runtime_defaults.ip.ver = 9,
46269d43981SMatt Roper .__runtime_defaults.has_dmc = 1,
46369d43981SMatt Roper .__runtime_defaults.has_hdcp = 1,
46469d43981SMatt Roper .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
46569d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask =
46669d43981SMatt Roper BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
46769d43981SMatt Roper BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP),
4682798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D) | BIT(PORT_E),
46969d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A),
47069d43981SMatt Roper };
47169d43981SMatt Roper
47269d43981SMatt Roper #define GEN9_LP_DISPLAY \
47369d43981SMatt Roper .dbuf.slice_mask = BIT(DBUF_S1), \
47469d43981SMatt Roper .has_dp_mst = 1, \
47569d43981SMatt Roper .has_ddi = 1, \
47669d43981SMatt Roper .has_fpga_dbg = 1, \
47769d43981SMatt Roper .has_hotplug = 1, \
47869d43981SMatt Roper .has_ipc = 1, \
47969d43981SMatt Roper .has_psr = 1, \
48069d43981SMatt Roper .has_psr_hw_tracking = 1, \
48169d43981SMatt Roper HSW_PIPE_OFFSETS, \
48269d43981SMatt Roper IVB_CURSOR_OFFSETS, \
48369d43981SMatt Roper IVB_COLORS, \
48469d43981SMatt Roper \
48569d43981SMatt Roper .__runtime_defaults.has_dmc = 1, \
48669d43981SMatt Roper .__runtime_defaults.has_hdcp = 1, \
48769d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), \
48869d43981SMatt Roper .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \
48969d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask = \
49069d43981SMatt Roper BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
49169d43981SMatt Roper BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP) | \
4922798e4d1SVille Syrjälä BIT(TRANSCODER_DSI_A) | BIT(TRANSCODER_DSI_C), \
4932798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C)
49469d43981SMatt Roper
49569d43981SMatt Roper static const struct intel_display_device_info bxt_display = {
49669d43981SMatt Roper GEN9_LP_DISPLAY,
49769d43981SMatt Roper .dbuf.size = 512 - 4, /* 4 blocks for bypass path allocation */
49869d43981SMatt Roper
49969d43981SMatt Roper .__runtime_defaults.ip.ver = 9,
50069d43981SMatt Roper };
50169d43981SMatt Roper
50269d43981SMatt Roper static const struct intel_display_device_info glk_display = {
50369d43981SMatt Roper GEN9_LP_DISPLAY,
50469d43981SMatt Roper .dbuf.size = 1024 - 4, /* 4 blocks for bypass path allocation */
50569d43981SMatt Roper GLK_COLORS,
50669d43981SMatt Roper
50769d43981SMatt Roper .__runtime_defaults.ip.ver = 10,
50869d43981SMatt Roper };
50969d43981SMatt Roper
5102798e4d1SVille Syrjälä #define ICL_DISPLAY \
5112798e4d1SVille Syrjälä .abox_mask = BIT(0), \
5122798e4d1SVille Syrjälä .dbuf.size = 2048, \
5132798e4d1SVille Syrjälä .dbuf.slice_mask = BIT(DBUF_S1) | BIT(DBUF_S2), \
5142798e4d1SVille Syrjälä .has_ddi = 1, \
5152798e4d1SVille Syrjälä .has_dp_mst = 1, \
5162798e4d1SVille Syrjälä .has_fpga_dbg = 1, \
5172798e4d1SVille Syrjälä .has_hotplug = 1, \
5182798e4d1SVille Syrjälä .has_ipc = 1, \
5192798e4d1SVille Syrjälä .has_psr = 1, \
5202798e4d1SVille Syrjälä .has_psr_hw_tracking = 1, \
5212798e4d1SVille Syrjälä .pipe_offsets = { \
5222798e4d1SVille Syrjälä [TRANSCODER_A] = PIPE_A_OFFSET, \
5232798e4d1SVille Syrjälä [TRANSCODER_B] = PIPE_B_OFFSET, \
5242798e4d1SVille Syrjälä [TRANSCODER_C] = PIPE_C_OFFSET, \
5252798e4d1SVille Syrjälä [TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
5262798e4d1SVille Syrjälä [TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
5272798e4d1SVille Syrjälä [TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
5282798e4d1SVille Syrjälä }, \
5292798e4d1SVille Syrjälä .trans_offsets = { \
5302798e4d1SVille Syrjälä [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
5312798e4d1SVille Syrjälä [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
5322798e4d1SVille Syrjälä [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
5332798e4d1SVille Syrjälä [TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
5342798e4d1SVille Syrjälä [TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
5352798e4d1SVille Syrjälä [TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
5362798e4d1SVille Syrjälä }, \
5372798e4d1SVille Syrjälä IVB_CURSOR_OFFSETS, \
5382798e4d1SVille Syrjälä ICL_COLORS, \
5392798e4d1SVille Syrjälä \
5402798e4d1SVille Syrjälä .__runtime_defaults.ip.ver = 11, \
5412798e4d1SVille Syrjälä .__runtime_defaults.has_dmc = 1, \
5422798e4d1SVille Syrjälä .__runtime_defaults.has_dsc = 1, \
5432798e4d1SVille Syrjälä .__runtime_defaults.has_hdcp = 1, \
5442798e4d1SVille Syrjälä .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \
5452798e4d1SVille Syrjälä .__runtime_defaults.cpu_transcoder_mask = \
5462798e4d1SVille Syrjälä BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
5472798e4d1SVille Syrjälä BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP) | \
5482798e4d1SVille Syrjälä BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \
5492798e4d1SVille Syrjälä .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A)
55069d43981SMatt Roper
5512798e4d1SVille Syrjälä static const struct intel_display_device_info icl_display = {
5522798e4d1SVille Syrjälä ICL_DISPLAY,
5532798e4d1SVille Syrjälä
5542798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D) | BIT(PORT_E),
5552798e4d1SVille Syrjälä };
5562798e4d1SVille Syrjälä
5572798e4d1SVille Syrjälä static const struct intel_display_device_info jsl_ehl_display = {
5582798e4d1SVille Syrjälä ICL_DISPLAY,
5592798e4d1SVille Syrjälä
5602798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D),
56169d43981SMatt Roper };
56269d43981SMatt Roper
56369d43981SMatt Roper #define XE_D_DISPLAY \
56469d43981SMatt Roper .abox_mask = GENMASK(2, 1), \
56569d43981SMatt Roper .dbuf.size = 2048, \
56669d43981SMatt Roper .dbuf.slice_mask = BIT(DBUF_S1) | BIT(DBUF_S2), \
56769d43981SMatt Roper .has_ddi = 1, \
56869d43981SMatt Roper .has_dp_mst = 1, \
56969d43981SMatt Roper .has_dsb = 1, \
57069d43981SMatt Roper .has_fpga_dbg = 1, \
57169d43981SMatt Roper .has_hotplug = 1, \
57269d43981SMatt Roper .has_ipc = 1, \
57369d43981SMatt Roper .has_psr = 1, \
57469d43981SMatt Roper .has_psr_hw_tracking = 1, \
57569d43981SMatt Roper .pipe_offsets = { \
57669d43981SMatt Roper [TRANSCODER_A] = PIPE_A_OFFSET, \
57769d43981SMatt Roper [TRANSCODER_B] = PIPE_B_OFFSET, \
57869d43981SMatt Roper [TRANSCODER_C] = PIPE_C_OFFSET, \
57969d43981SMatt Roper [TRANSCODER_D] = PIPE_D_OFFSET, \
58069d43981SMatt Roper [TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
58169d43981SMatt Roper [TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
58269d43981SMatt Roper }, \
58369d43981SMatt Roper .trans_offsets = { \
58469d43981SMatt Roper [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
58569d43981SMatt Roper [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
58669d43981SMatt Roper [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
58769d43981SMatt Roper [TRANSCODER_D] = TRANSCODER_D_OFFSET, \
58869d43981SMatt Roper [TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
58969d43981SMatt Roper [TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
59069d43981SMatt Roper }, \
59169d43981SMatt Roper TGL_CURSOR_OFFSETS, \
59269d43981SMatt Roper ICL_COLORS, \
59369d43981SMatt Roper \
59469d43981SMatt Roper .__runtime_defaults.ip.ver = 12, \
59569d43981SMatt Roper .__runtime_defaults.has_dmc = 1, \
59669d43981SMatt Roper .__runtime_defaults.has_dsc = 1, \
59769d43981SMatt Roper .__runtime_defaults.has_hdcp = 1, \
59869d43981SMatt Roper .__runtime_defaults.pipe_mask = \
59969d43981SMatt Roper BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D), \
60069d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask = \
60169d43981SMatt Roper BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
60269d43981SMatt Roper BIT(TRANSCODER_C) | BIT(TRANSCODER_D) | \
60369d43981SMatt Roper BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \
60469d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A)
60569d43981SMatt Roper
60669d43981SMatt Roper static const struct intel_display_device_info tgl_display = {
60769d43981SMatt Roper XE_D_DISPLAY,
6082798e4d1SVille Syrjälä
6092798e4d1SVille Syrjälä /*
6102798e4d1SVille Syrjälä * FIXME DDI C/combo PHY C missing due to combo PHY
6112798e4d1SVille Syrjälä * code making a mess on SKUs where the PHY is missing.
6122798e4d1SVille Syrjälä */
6132798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) |
6142798e4d1SVille Syrjälä BIT(PORT_TC1) | BIT(PORT_TC2) | BIT(PORT_TC3) | BIT(PORT_TC4) | BIT(PORT_TC5) | BIT(PORT_TC6),
6152798e4d1SVille Syrjälä };
6162798e4d1SVille Syrjälä
6172798e4d1SVille Syrjälä static const struct intel_display_device_info dg1_display = {
6182798e4d1SVille Syrjälä XE_D_DISPLAY,
6192798e4d1SVille Syrjälä
6202798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) |
6212798e4d1SVille Syrjälä BIT(PORT_TC1) | BIT(PORT_TC2),
62269d43981SMatt Roper };
62369d43981SMatt Roper
62469d43981SMatt Roper static const struct intel_display_device_info rkl_display = {
62569d43981SMatt Roper XE_D_DISPLAY,
62669d43981SMatt Roper .abox_mask = BIT(0),
62769d43981SMatt Roper .has_hti = 1,
62869d43981SMatt Roper .has_psr_hw_tracking = 0,
62969d43981SMatt Roper
63069d43981SMatt Roper .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
63169d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask =
63269d43981SMatt Roper BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C),
6332798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) |
6342798e4d1SVille Syrjälä BIT(PORT_TC1) | BIT(PORT_TC2),
63569d43981SMatt Roper };
63669d43981SMatt Roper
63769d43981SMatt Roper static const struct intel_display_device_info adl_s_display = {
63869d43981SMatt Roper XE_D_DISPLAY,
63969d43981SMatt Roper .has_hti = 1,
64069d43981SMatt Roper .has_psr_hw_tracking = 0,
6412798e4d1SVille Syrjälä
6422798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) |
6432798e4d1SVille Syrjälä BIT(PORT_TC1) | BIT(PORT_TC2) | BIT(PORT_TC3) | BIT(PORT_TC4),
64469d43981SMatt Roper };
64569d43981SMatt Roper
64669d43981SMatt Roper #define XE_LPD_FEATURES \
64769d43981SMatt Roper .abox_mask = GENMASK(1, 0), \
64869d43981SMatt Roper .color = { \
64969d43981SMatt Roper .degamma_lut_size = 129, .gamma_lut_size = 1024, \
65069d43981SMatt Roper .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING | \
65169d43981SMatt Roper DRM_COLOR_LUT_EQUAL_CHANNELS, \
65269d43981SMatt Roper }, \
65369d43981SMatt Roper .dbuf.size = 4096, \
65469d43981SMatt Roper .dbuf.slice_mask = BIT(DBUF_S1) | BIT(DBUF_S2) | BIT(DBUF_S3) | \
65569d43981SMatt Roper BIT(DBUF_S4), \
65669d43981SMatt Roper .has_ddi = 1, \
65769d43981SMatt Roper .has_dp_mst = 1, \
65869d43981SMatt Roper .has_dsb = 1, \
65969d43981SMatt Roper .has_fpga_dbg = 1, \
66069d43981SMatt Roper .has_hotplug = 1, \
66169d43981SMatt Roper .has_ipc = 1, \
66269d43981SMatt Roper .has_psr = 1, \
66369d43981SMatt Roper .pipe_offsets = { \
66469d43981SMatt Roper [TRANSCODER_A] = PIPE_A_OFFSET, \
66569d43981SMatt Roper [TRANSCODER_B] = PIPE_B_OFFSET, \
66669d43981SMatt Roper [TRANSCODER_C] = PIPE_C_OFFSET, \
66769d43981SMatt Roper [TRANSCODER_D] = PIPE_D_OFFSET, \
66869d43981SMatt Roper [TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
66969d43981SMatt Roper [TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
67069d43981SMatt Roper }, \
67169d43981SMatt Roper .trans_offsets = { \
67269d43981SMatt Roper [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
67369d43981SMatt Roper [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
67469d43981SMatt Roper [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
67569d43981SMatt Roper [TRANSCODER_D] = TRANSCODER_D_OFFSET, \
67669d43981SMatt Roper [TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
67769d43981SMatt Roper [TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
67869d43981SMatt Roper }, \
67969d43981SMatt Roper TGL_CURSOR_OFFSETS, \
68069d43981SMatt Roper \
68169d43981SMatt Roper .__runtime_defaults.ip.ver = 13, \
68269d43981SMatt Roper .__runtime_defaults.has_dmc = 1, \
68369d43981SMatt Roper .__runtime_defaults.has_dsc = 1, \
68469d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), \
68569d43981SMatt Roper .__runtime_defaults.has_hdcp = 1, \
68669d43981SMatt Roper .__runtime_defaults.pipe_mask = \
68769d43981SMatt Roper BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D)
68869d43981SMatt Roper
68969d43981SMatt Roper static const struct intel_display_device_info xe_lpd_display = {
69069d43981SMatt Roper XE_LPD_FEATURES,
69169d43981SMatt Roper .has_cdclk_crawl = 1,
69269d43981SMatt Roper .has_psr_hw_tracking = 0,
69369d43981SMatt Roper
69469d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask =
69569d43981SMatt Roper BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
69669d43981SMatt Roper BIT(TRANSCODER_C) | BIT(TRANSCODER_D) |
69769d43981SMatt Roper BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1),
6982798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) |
6992798e4d1SVille Syrjälä BIT(PORT_TC1) | BIT(PORT_TC2) | BIT(PORT_TC3) | BIT(PORT_TC4),
70069d43981SMatt Roper };
70169d43981SMatt Roper
70269d43981SMatt Roper static const struct intel_display_device_info xe_hpd_display = {
70369d43981SMatt Roper XE_LPD_FEATURES,
70469d43981SMatt Roper .has_cdclk_squash = 1,
70569d43981SMatt Roper
70669d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask =
70769d43981SMatt Roper BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
70869d43981SMatt Roper BIT(TRANSCODER_C) | BIT(TRANSCODER_D),
7092798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D_XELPD) |
7102798e4d1SVille Syrjälä BIT(PORT_TC1),
71169d43981SMatt Roper };
71269d43981SMatt Roper
71369d43981SMatt Roper static const struct intel_display_device_info xe_lpdp_display = {
71469d43981SMatt Roper XE_LPD_FEATURES,
71569d43981SMatt Roper .has_cdclk_crawl = 1,
71669d43981SMatt Roper .has_cdclk_squash = 1,
71769d43981SMatt Roper
71869d43981SMatt Roper .__runtime_defaults.ip.ver = 14,
71969d43981SMatt Roper .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A) | BIT(INTEL_FBC_B),
72069d43981SMatt Roper .__runtime_defaults.cpu_transcoder_mask =
72169d43981SMatt Roper BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
72269d43981SMatt Roper BIT(TRANSCODER_C) | BIT(TRANSCODER_D),
7232798e4d1SVille Syrjälä .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) |
7242798e4d1SVille Syrjälä BIT(PORT_TC1) | BIT(PORT_TC2) | BIT(PORT_TC3) | BIT(PORT_TC4),
72569d43981SMatt Roper };
72669d43981SMatt Roper
72714351883SJani Nikula /*
72814351883SJani Nikula * Separate detection for no display cases to keep the display id array simple.
72914351883SJani Nikula *
73014351883SJani Nikula * IVB Q requires subvendor and subdevice matching to differentiate from IVB D
73114351883SJani Nikula * GT2 server.
73214351883SJani Nikula */
has_no_display(struct pci_dev * pdev)73314351883SJani Nikula static bool has_no_display(struct pci_dev *pdev)
73414351883SJani Nikula {
73514351883SJani Nikula static const struct pci_device_id ids[] = {
73614351883SJani Nikula INTEL_IVB_Q_IDS(0),
73714351883SJani Nikula {}
73814351883SJani Nikula };
73914351883SJani Nikula
74014351883SJani Nikula return pci_match_id(ids, pdev);
74114351883SJani Nikula }
74214351883SJani Nikula
74369d43981SMatt Roper #undef INTEL_VGA_DEVICE
74469d43981SMatt Roper #define INTEL_VGA_DEVICE(id, info) { id, info }
74569d43981SMatt Roper
74669d43981SMatt Roper static const struct {
74769d43981SMatt Roper u32 devid;
74869d43981SMatt Roper const struct intel_display_device_info *info;
74969d43981SMatt Roper } intel_display_ids[] = {
75069d43981SMatt Roper INTEL_I830_IDS(&i830_display),
75169d43981SMatt Roper INTEL_I845G_IDS(&i845_display),
75269d43981SMatt Roper INTEL_I85X_IDS(&i85x_display),
75369d43981SMatt Roper INTEL_I865G_IDS(&i865g_display),
75469d43981SMatt Roper INTEL_I915G_IDS(&i915g_display),
75569d43981SMatt Roper INTEL_I915GM_IDS(&i915gm_display),
75669d43981SMatt Roper INTEL_I945G_IDS(&i945g_display),
75769d43981SMatt Roper INTEL_I945GM_IDS(&i945gm_display),
75869d43981SMatt Roper INTEL_I965G_IDS(&i965g_display),
75969d43981SMatt Roper INTEL_G33_IDS(&g33_display),
76069d43981SMatt Roper INTEL_I965GM_IDS(&i965gm_display),
76169d43981SMatt Roper INTEL_GM45_IDS(&gm45_display),
76269d43981SMatt Roper INTEL_G45_IDS(&g45_display),
76319db2062SVille Syrjälä INTEL_PINEVIEW_G_IDS(&pnv_display),
76419db2062SVille Syrjälä INTEL_PINEVIEW_M_IDS(&pnv_display),
76569d43981SMatt Roper INTEL_IRONLAKE_D_IDS(&ilk_d_display),
76669d43981SMatt Roper INTEL_IRONLAKE_M_IDS(&ilk_m_display),
76769d43981SMatt Roper INTEL_SNB_D_IDS(&snb_display),
76869d43981SMatt Roper INTEL_SNB_M_IDS(&snb_display),
76969d43981SMatt Roper INTEL_IVB_M_IDS(&ivb_display),
77069d43981SMatt Roper INTEL_IVB_D_IDS(&ivb_display),
77169d43981SMatt Roper INTEL_HSW_IDS(&hsw_display),
77269d43981SMatt Roper INTEL_VLV_IDS(&vlv_display),
77369d43981SMatt Roper INTEL_BDW_IDS(&bdw_display),
77469d43981SMatt Roper INTEL_CHV_IDS(&chv_display),
77569d43981SMatt Roper INTEL_SKL_IDS(&skl_display),
77669d43981SMatt Roper INTEL_BXT_IDS(&bxt_display),
77769d43981SMatt Roper INTEL_GLK_IDS(&glk_display),
77869d43981SMatt Roper INTEL_KBL_IDS(&skl_display),
77969d43981SMatt Roper INTEL_CFL_IDS(&skl_display),
7802798e4d1SVille Syrjälä INTEL_ICL_11_IDS(&icl_display),
7812798e4d1SVille Syrjälä INTEL_EHL_IDS(&jsl_ehl_display),
7822798e4d1SVille Syrjälä INTEL_JSL_IDS(&jsl_ehl_display),
78369d43981SMatt Roper INTEL_TGL_12_IDS(&tgl_display),
7842798e4d1SVille Syrjälä INTEL_DG1_IDS(&dg1_display),
78569d43981SMatt Roper INTEL_RKL_IDS(&rkl_display),
78669d43981SMatt Roper INTEL_ADLS_IDS(&adl_s_display),
78769d43981SMatt Roper INTEL_RPLS_IDS(&adl_s_display),
78869d43981SMatt Roper INTEL_ADLP_IDS(&xe_lpd_display),
78969d43981SMatt Roper INTEL_ADLN_IDS(&xe_lpd_display),
79069d43981SMatt Roper INTEL_RPLP_IDS(&xe_lpd_display),
79169d43981SMatt Roper INTEL_DG2_IDS(&xe_hpd_display),
79269d43981SMatt Roper
79312e6f6dcSMatt Roper /*
79412e6f6dcSMatt Roper * Do not add any GMD_ID-based platforms to this list. They will
79512e6f6dcSMatt Roper * be probed automatically based on the IP version reported by
79612e6f6dcSMatt Roper * the hardware.
79712e6f6dcSMatt Roper */
79869d43981SMatt Roper };
79969d43981SMatt Roper
80012e6f6dcSMatt Roper static const struct {
80112e6f6dcSMatt Roper u16 ver;
80212e6f6dcSMatt Roper u16 rel;
80312e6f6dcSMatt Roper const struct intel_display_device_info *display;
80412e6f6dcSMatt Roper } gmdid_display_map[] = {
80512e6f6dcSMatt Roper { 14, 0, &xe_lpdp_display },
80612e6f6dcSMatt Roper };
80712e6f6dcSMatt Roper
80812e6f6dcSMatt Roper static const struct intel_display_device_info *
probe_gmdid_display(struct drm_i915_private * i915,u16 * ver,u16 * rel,u16 * step)80912e6f6dcSMatt Roper probe_gmdid_display(struct drm_i915_private *i915, u16 *ver, u16 *rel, u16 *step)
81069d43981SMatt Roper {
81112e6f6dcSMatt Roper struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
81212e6f6dcSMatt Roper void __iomem *addr;
81312e6f6dcSMatt Roper u32 val;
81469d43981SMatt Roper int i;
81569d43981SMatt Roper
816757b90bbSLuca Coelho /* The caller expects to ver, rel and step to be initialized
817757b90bbSLuca Coelho * here, and there's no good way to check when there was a
818757b90bbSLuca Coelho * failure and no_display was returned. So initialize all these
819757b90bbSLuca Coelho * values here zero, to be sure.
820757b90bbSLuca Coelho */
821757b90bbSLuca Coelho *ver = 0;
822757b90bbSLuca Coelho *rel = 0;
823757b90bbSLuca Coelho *step = 0;
824757b90bbSLuca Coelho
82512e6f6dcSMatt Roper addr = pci_iomap_range(pdev, 0, i915_mmio_reg_offset(GMD_ID_DISPLAY), sizeof(u32));
82612e6f6dcSMatt Roper if (!addr) {
82712e6f6dcSMatt Roper drm_err(&i915->drm, "Cannot map MMIO BAR to read display GMD_ID\n");
82812e6f6dcSMatt Roper return &no_display;
82912e6f6dcSMatt Roper }
83012e6f6dcSMatt Roper
83112e6f6dcSMatt Roper val = ioread32(addr);
83212e6f6dcSMatt Roper pci_iounmap(pdev, addr);
83312e6f6dcSMatt Roper
834*bf9e1bdaSJani Nikula if (val == 0) {
835*bf9e1bdaSJani Nikula drm_dbg_kms(&i915->drm, "Device doesn't have display\n");
83612e6f6dcSMatt Roper return &no_display;
837*bf9e1bdaSJani Nikula }
83812e6f6dcSMatt Roper
83912e6f6dcSMatt Roper *ver = REG_FIELD_GET(GMD_ID_ARCH_MASK, val);
84012e6f6dcSMatt Roper *rel = REG_FIELD_GET(GMD_ID_RELEASE_MASK, val);
84112e6f6dcSMatt Roper *step = REG_FIELD_GET(GMD_ID_STEP, val);
84212e6f6dcSMatt Roper
84312e6f6dcSMatt Roper for (i = 0; i < ARRAY_SIZE(gmdid_display_map); i++)
84412e6f6dcSMatt Roper if (*ver == gmdid_display_map[i].ver &&
84512e6f6dcSMatt Roper *rel == gmdid_display_map[i].rel)
84612e6f6dcSMatt Roper return gmdid_display_map[i].display;
84712e6f6dcSMatt Roper
84812e6f6dcSMatt Roper drm_err(&i915->drm, "Unrecognized display IP version %d.%02d; disabling display.\n",
84912e6f6dcSMatt Roper *ver, *rel);
85012e6f6dcSMatt Roper return &no_display;
85112e6f6dcSMatt Roper }
85212e6f6dcSMatt Roper
85312e6f6dcSMatt Roper const struct intel_display_device_info *
intel_display_device_probe(struct drm_i915_private * i915,bool has_gmdid,u16 * gmdid_ver,u16 * gmdid_rel,u16 * gmdid_step)85412e6f6dcSMatt Roper intel_display_device_probe(struct drm_i915_private *i915, bool has_gmdid,
85512e6f6dcSMatt Roper u16 *gmdid_ver, u16 *gmdid_rel, u16 *gmdid_step)
85612e6f6dcSMatt Roper {
85712e6f6dcSMatt Roper struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
85812e6f6dcSMatt Roper int i;
85912e6f6dcSMatt Roper
86012e6f6dcSMatt Roper if (has_gmdid)
86112e6f6dcSMatt Roper return probe_gmdid_display(i915, gmdid_ver, gmdid_rel, gmdid_step);
86212e6f6dcSMatt Roper
86314351883SJani Nikula if (has_no_display(pdev)) {
86414351883SJani Nikula drm_dbg_kms(&i915->drm, "Device doesn't have display\n");
86514351883SJani Nikula return &no_display;
86614351883SJani Nikula }
86714351883SJani Nikula
86869d43981SMatt Roper for (i = 0; i < ARRAY_SIZE(intel_display_ids); i++) {
86912e6f6dcSMatt Roper if (intel_display_ids[i].devid == pdev->device)
87069d43981SMatt Roper return intel_display_ids[i].info;
87169d43981SMatt Roper }
87269d43981SMatt Roper
87312e6f6dcSMatt Roper drm_dbg(&i915->drm, "No display ID found for device ID %04x; disabling display.\n",
87412e6f6dcSMatt Roper pdev->device);
87512e6f6dcSMatt Roper
87669d43981SMatt Roper return &no_display;
87769d43981SMatt Roper }
8782d0cdf60SMatt Roper
intel_display_device_info_runtime_init(struct drm_i915_private * i915)8792d0cdf60SMatt Roper void intel_display_device_info_runtime_init(struct drm_i915_private *i915)
8802d0cdf60SMatt Roper {
8812d0cdf60SMatt Roper struct intel_display_runtime_info *display_runtime = DISPLAY_RUNTIME_INFO(i915);
8822d0cdf60SMatt Roper enum pipe pipe;
8832d0cdf60SMatt Roper
884ce6ea7eeSVille Syrjälä BUILD_BUG_ON(BITS_PER_TYPE(display_runtime->pipe_mask) < I915_MAX_PIPES);
885ce6ea7eeSVille Syrjälä BUILD_BUG_ON(BITS_PER_TYPE(display_runtime->cpu_transcoder_mask) < I915_MAX_TRANSCODERS);
886ce6ea7eeSVille Syrjälä BUILD_BUG_ON(BITS_PER_TYPE(display_runtime->port_mask) < I915_MAX_PORTS);
887ce6ea7eeSVille Syrjälä
8882d0cdf60SMatt Roper /* Wa_14011765242: adl-s A0,A1 */
8892aa01e4dSDnyaneshwar Bhadane if (IS_ALDERLAKE_S(i915) && IS_DISPLAY_STEP(i915, STEP_A0, STEP_A2))
8902d0cdf60SMatt Roper for_each_pipe(i915, pipe)
8912d0cdf60SMatt Roper display_runtime->num_scalers[pipe] = 0;
8922d0cdf60SMatt Roper else if (DISPLAY_VER(i915) >= 11) {
8932d0cdf60SMatt Roper for_each_pipe(i915, pipe)
8942d0cdf60SMatt Roper display_runtime->num_scalers[pipe] = 2;
8952d0cdf60SMatt Roper } else if (DISPLAY_VER(i915) >= 9) {
8962d0cdf60SMatt Roper display_runtime->num_scalers[PIPE_A] = 2;
8972d0cdf60SMatt Roper display_runtime->num_scalers[PIPE_B] = 2;
8982d0cdf60SMatt Roper display_runtime->num_scalers[PIPE_C] = 1;
8992d0cdf60SMatt Roper }
9002d0cdf60SMatt Roper
9012d0cdf60SMatt Roper if (DISPLAY_VER(i915) >= 13 || HAS_D12_PLANE_MINIMIZATION(i915))
9022d0cdf60SMatt Roper for_each_pipe(i915, pipe)
9032d0cdf60SMatt Roper display_runtime->num_sprites[pipe] = 4;
9042d0cdf60SMatt Roper else if (DISPLAY_VER(i915) >= 11)
9052d0cdf60SMatt Roper for_each_pipe(i915, pipe)
9062d0cdf60SMatt Roper display_runtime->num_sprites[pipe] = 6;
9072d0cdf60SMatt Roper else if (DISPLAY_VER(i915) == 10)
9082d0cdf60SMatt Roper for_each_pipe(i915, pipe)
9092d0cdf60SMatt Roper display_runtime->num_sprites[pipe] = 3;
9102d0cdf60SMatt Roper else if (IS_BROXTON(i915)) {
9112d0cdf60SMatt Roper /*
9122d0cdf60SMatt Roper * Skylake and Broxton currently don't expose the topmost plane as its
9132d0cdf60SMatt Roper * use is exclusive with the legacy cursor and we only want to expose
9142d0cdf60SMatt Roper * one of those, not both. Until we can safely expose the topmost plane
9152d0cdf60SMatt Roper * as a DRM_PLANE_TYPE_CURSOR with all the features exposed/supported,
9162d0cdf60SMatt Roper * we don't expose the topmost plane at all to prevent ABI breakage
9172d0cdf60SMatt Roper * down the line.
9182d0cdf60SMatt Roper */
9192d0cdf60SMatt Roper
9202d0cdf60SMatt Roper display_runtime->num_sprites[PIPE_A] = 2;
9212d0cdf60SMatt Roper display_runtime->num_sprites[PIPE_B] = 2;
9222d0cdf60SMatt Roper display_runtime->num_sprites[PIPE_C] = 1;
9232d0cdf60SMatt Roper } else if (IS_VALLEYVIEW(i915) || IS_CHERRYVIEW(i915)) {
9242d0cdf60SMatt Roper for_each_pipe(i915, pipe)
9252d0cdf60SMatt Roper display_runtime->num_sprites[pipe] = 2;
9262d0cdf60SMatt Roper } else if (DISPLAY_VER(i915) >= 5 || IS_G4X(i915)) {
9272d0cdf60SMatt Roper for_each_pipe(i915, pipe)
9282d0cdf60SMatt Roper display_runtime->num_sprites[pipe] = 1;
9292d0cdf60SMatt Roper }
9302d0cdf60SMatt Roper
9312d0cdf60SMatt Roper if ((IS_DGFX(i915) || DISPLAY_VER(i915) >= 14) &&
9322d0cdf60SMatt Roper !(intel_de_read(i915, GU_CNTL_PROTECTED) & DEPRESENT)) {
9332d0cdf60SMatt Roper drm_info(&i915->drm, "Display not present, disabling\n");
9342d0cdf60SMatt Roper goto display_fused_off;
9352d0cdf60SMatt Roper }
9362d0cdf60SMatt Roper
9372d0cdf60SMatt Roper if (IS_GRAPHICS_VER(i915, 7, 8) && HAS_PCH_SPLIT(i915)) {
9382d0cdf60SMatt Roper u32 fuse_strap = intel_de_read(i915, FUSE_STRAP);
9392d0cdf60SMatt Roper u32 sfuse_strap = intel_de_read(i915, SFUSE_STRAP);
9402d0cdf60SMatt Roper
9412d0cdf60SMatt Roper /*
9422d0cdf60SMatt Roper * SFUSE_STRAP is supposed to have a bit signalling the display
9432d0cdf60SMatt Roper * is fused off. Unfortunately it seems that, at least in
9442d0cdf60SMatt Roper * certain cases, fused off display means that PCH display
9452d0cdf60SMatt Roper * reads don't land anywhere. In that case, we read 0s.
9462d0cdf60SMatt Roper *
9472d0cdf60SMatt Roper * On CPT/PPT, we can detect this case as SFUSE_STRAP_FUSE_LOCK
9482d0cdf60SMatt Roper * should be set when taking over after the firmware.
9492d0cdf60SMatt Roper */
9502d0cdf60SMatt Roper if (fuse_strap & ILK_INTERNAL_DISPLAY_DISABLE ||
9512d0cdf60SMatt Roper sfuse_strap & SFUSE_STRAP_DISPLAY_DISABLED ||
9522d0cdf60SMatt Roper (HAS_PCH_CPT(i915) &&
9532d0cdf60SMatt Roper !(sfuse_strap & SFUSE_STRAP_FUSE_LOCK))) {
9542d0cdf60SMatt Roper drm_info(&i915->drm,
9552d0cdf60SMatt Roper "Display fused off, disabling\n");
9562d0cdf60SMatt Roper goto display_fused_off;
9572d0cdf60SMatt Roper } else if (fuse_strap & IVB_PIPE_C_DISABLE) {
9582d0cdf60SMatt Roper drm_info(&i915->drm, "PipeC fused off\n");
9592d0cdf60SMatt Roper display_runtime->pipe_mask &= ~BIT(PIPE_C);
9602d0cdf60SMatt Roper display_runtime->cpu_transcoder_mask &= ~BIT(TRANSCODER_C);
9612d0cdf60SMatt Roper }
9622d0cdf60SMatt Roper } else if (DISPLAY_VER(i915) >= 9) {
9632d0cdf60SMatt Roper u32 dfsm = intel_de_read(i915, SKL_DFSM);
9642d0cdf60SMatt Roper
9652d0cdf60SMatt Roper if (dfsm & SKL_DFSM_PIPE_A_DISABLE) {
9662d0cdf60SMatt Roper display_runtime->pipe_mask &= ~BIT(PIPE_A);
9672d0cdf60SMatt Roper display_runtime->cpu_transcoder_mask &= ~BIT(TRANSCODER_A);
9682d0cdf60SMatt Roper display_runtime->fbc_mask &= ~BIT(INTEL_FBC_A);
9692d0cdf60SMatt Roper }
9702d0cdf60SMatt Roper if (dfsm & SKL_DFSM_PIPE_B_DISABLE) {
9712d0cdf60SMatt Roper display_runtime->pipe_mask &= ~BIT(PIPE_B);
9722d0cdf60SMatt Roper display_runtime->cpu_transcoder_mask &= ~BIT(TRANSCODER_B);
9732d0cdf60SMatt Roper }
9742d0cdf60SMatt Roper if (dfsm & SKL_DFSM_PIPE_C_DISABLE) {
9752d0cdf60SMatt Roper display_runtime->pipe_mask &= ~BIT(PIPE_C);
9762d0cdf60SMatt Roper display_runtime->cpu_transcoder_mask &= ~BIT(TRANSCODER_C);
9772d0cdf60SMatt Roper }
9782d0cdf60SMatt Roper
9792d0cdf60SMatt Roper if (DISPLAY_VER(i915) >= 12 &&
9802d0cdf60SMatt Roper (dfsm & TGL_DFSM_PIPE_D_DISABLE)) {
9812d0cdf60SMatt Roper display_runtime->pipe_mask &= ~BIT(PIPE_D);
9822d0cdf60SMatt Roper display_runtime->cpu_transcoder_mask &= ~BIT(TRANSCODER_D);
9832d0cdf60SMatt Roper }
9842d0cdf60SMatt Roper
9852d0cdf60SMatt Roper if (!display_runtime->pipe_mask)
9862d0cdf60SMatt Roper goto display_fused_off;
9872d0cdf60SMatt Roper
9882d0cdf60SMatt Roper if (dfsm & SKL_DFSM_DISPLAY_HDCP_DISABLE)
9892d0cdf60SMatt Roper display_runtime->has_hdcp = 0;
9902d0cdf60SMatt Roper
9912d0cdf60SMatt Roper if (dfsm & SKL_DFSM_DISPLAY_PM_DISABLE)
9922d0cdf60SMatt Roper display_runtime->fbc_mask = 0;
9932d0cdf60SMatt Roper
9942d0cdf60SMatt Roper if (DISPLAY_VER(i915) >= 11 && (dfsm & ICL_DFSM_DMC_DISABLE))
9952d0cdf60SMatt Roper display_runtime->has_dmc = 0;
9962d0cdf60SMatt Roper
9972d0cdf60SMatt Roper if (IS_DISPLAY_VER(i915, 10, 12) &&
9982d0cdf60SMatt Roper (dfsm & GLK_DFSM_DISPLAY_DSC_DISABLE))
9992d0cdf60SMatt Roper display_runtime->has_dsc = 0;
10002d0cdf60SMatt Roper }
10012d0cdf60SMatt Roper
10022d0cdf60SMatt Roper return;
10032d0cdf60SMatt Roper
10042d0cdf60SMatt Roper display_fused_off:
10052d0cdf60SMatt Roper memset(display_runtime, 0, sizeof(*display_runtime));
10062d0cdf60SMatt Roper }
10074ae7eb92SJani Nikula
intel_display_device_info_print(const struct intel_display_device_info * info,const struct intel_display_runtime_info * runtime,struct drm_printer * p)10084ae7eb92SJani Nikula void intel_display_device_info_print(const struct intel_display_device_info *info,
10094ae7eb92SJani Nikula const struct intel_display_runtime_info *runtime,
10104ae7eb92SJani Nikula struct drm_printer *p)
10114ae7eb92SJani Nikula {
10124ae7eb92SJani Nikula if (runtime->ip.rel)
10134ae7eb92SJani Nikula drm_printf(p, "display version: %u.%02u\n",
10144ae7eb92SJani Nikula runtime->ip.ver,
10154ae7eb92SJani Nikula runtime->ip.rel);
10164ae7eb92SJani Nikula else
10174ae7eb92SJani Nikula drm_printf(p, "display version: %u\n",
10184ae7eb92SJani Nikula runtime->ip.ver);
10194ae7eb92SJani Nikula
10204ae7eb92SJani Nikula #define PRINT_FLAG(name) drm_printf(p, "%s: %s\n", #name, str_yes_no(info->name))
10214ae7eb92SJani Nikula DEV_INFO_DISPLAY_FOR_EACH_FLAG(PRINT_FLAG);
10224ae7eb92SJani Nikula #undef PRINT_FLAG
10234ae7eb92SJani Nikula
10244ae7eb92SJani Nikula drm_printf(p, "has_hdcp: %s\n", str_yes_no(runtime->has_hdcp));
10254ae7eb92SJani Nikula drm_printf(p, "has_dmc: %s\n", str_yes_no(runtime->has_dmc));
10264ae7eb92SJani Nikula drm_printf(p, "has_dsc: %s\n", str_yes_no(runtime->has_dsc));
10274ae7eb92SJani Nikula }
1028