xref: /openbmc/linux/drivers/gpu/drm/i915/display/intel_display_device.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
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