diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_pci.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_pci.c | 129 | 
1 files changed, 71 insertions, 58 deletions
diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c index 169837de395d..261294df535c 100644 --- a/drivers/gpu/drm/i915/i915_pci.c +++ b/drivers/gpu/drm/i915/i915_pci.c @@ -22,18 +22,17 @@   *   */ -#include <linux/vga_switcheroo.h> -  #include <drm/drm_drv.h>  #include <drm/i915_pciids.h> +#include "i915_driver.h"  #include "i915_drv.h"  #include "i915_pci.h"  #define PLATFORM(x) .platform = (x)  #define GEN(x) \ -	.graphics_ver = (x), \ -	.media_ver = (x), \ +	.graphics.ver = (x), \ +	.media.ver = (x), \  	.display.ver = (x)  #define I845_PIPE_OFFSETS \ @@ -145,6 +144,12 @@  		   .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING | \  					DRM_COLOR_LUT_EQUAL_CHANNELS, \  	} +#define ICL_COLORS \ +	.color = { .degamma_lut_size = 33, .gamma_lut_size = 262145, \ +		   .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING | \ +					DRM_COLOR_LUT_EQUAL_CHANNELS, \ +		   .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \ +	}  /* Keep in gen based order, and chronological order within a gen */ @@ -157,8 +162,8 @@  #define I830_FEATURES \  	GEN(2), \  	.is_mobile = 1, \ -	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \ -	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \ +	.display.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \ +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \  	.display.has_overlay = 1, \  	.display.cursor_needs_physical = 1, \  	.display.overlay_needs_physical = 1, \ @@ -178,8 +183,8 @@  #define I845_FEATURES \  	GEN(2), \ -	.pipe_mask = BIT(PIPE_A), \ -	.cpu_transcoder_mask = BIT(TRANSCODER_A), \ +	.display.pipe_mask = BIT(PIPE_A), \ +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A), \  	.display.has_overlay = 1, \  	.display.overlay_needs_physical = 1, \  	.display.has_gmch = 1, \ @@ -220,8 +225,8 @@ static const struct intel_device_info i865g_info = {  #define GEN3_FEATURES \  	GEN(3), \ -	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \ -	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \ +	.display.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \ +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \  	.display.has_gmch = 1, \  	.gpu_reset_clobbers_display = true, \  	.platform_engine_mask = BIT(RCS0), \ @@ -310,8 +315,8 @@ static const struct intel_device_info pnv_m_info = {  #define GEN4_FEATURES \  	GEN(4), \ -	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \ -	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \ +	.display.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \ +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \  	.display.has_hotplug = 1, \  	.display.has_gmch = 1, \  	.gpu_reset_clobbers_display = true, \ @@ -363,8 +368,8 @@ static const struct intel_device_info gm45_info = {  #define GEN5_FEATURES \  	GEN(5), \ -	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \ -	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \ +	.display.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \ +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \  	.display.has_hotplug = 1, \  	.platform_engine_mask = BIT(RCS0) | BIT(VCS0), \  	.has_snoop = true, \ @@ -393,8 +398,8 @@ static const struct intel_device_info ilk_m_info = {  #define GEN6_FEATURES \  	GEN(6), \ -	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \ -	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \ +	.display.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \ +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \  	.display.has_hotplug = 1, \  	.display.has_fbc = 1, \  	.platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \ @@ -444,8 +449,8 @@ static const struct intel_device_info snb_m_gt2_info = {  #define GEN7_FEATURES  \  	GEN(7), \ -	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \ -	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C), \ +	.display.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \ +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C), \  	.display.has_hotplug = 1, \  	.display.has_fbc = 1, \  	.platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \ @@ -499,8 +504,8 @@ static const struct intel_device_info ivb_q_info = {  	GEN7_FEATURES,  	PLATFORM(INTEL_IVYBRIDGE),  	.gt = 2, -	.pipe_mask = 0, /* legal, last one wins */ -	.cpu_transcoder_mask = 0, +	.display.pipe_mask = 0, /* legal, last one wins */ +	.display.cpu_transcoder_mask = 0,  	.has_l3_dpf = 1,  }; @@ -508,8 +513,8 @@ static const struct intel_device_info vlv_info = {  	PLATFORM(INTEL_VALLEYVIEW),  	GEN(7),  	.is_lp = 1, -	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), -	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), +	.display.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B),  	.has_runtime_pm = 1,  	.has_rc6 = 1,  	.has_reset_engine = true, @@ -533,7 +538,7 @@ static const struct intel_device_info vlv_info = {  #define G75_FEATURES  \  	GEN7_FEATURES, \  	.platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \ -	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \ +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \  		BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP), \  	.display.has_ddi = 1, \  	.display.has_fpga_dbg = 1, \ @@ -603,8 +608,8 @@ static const struct intel_device_info bdw_gt3_info = {  static const struct intel_device_info chv_info = {  	PLATFORM(INTEL_CHERRYVIEW),  	GEN(8), -	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), -	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C), +	.display.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C),  	.display.has_hotplug = 1,  	.is_lp = 1,  	.platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), @@ -681,8 +686,8 @@ static const struct intel_device_info skl_gt4_info = {  	.dbuf.slice_mask = BIT(DBUF_S1), \  	.display.has_hotplug = 1, \  	.platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \ -	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \ -	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \ +	.display.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \ +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \  		BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP) | \  		BIT(TRANSCODER_DSI_A) | BIT(TRANSCODER_DSI_C), \  	.has_64bit_reloc = 1, \ @@ -790,8 +795,8 @@ static const struct intel_device_info cml_gt2_info = {  #define GEN11_FEATURES \  	GEN9_FEATURES, \  	GEN11_DEFAULT_PAGE_SIZES, \ -	.abox_mask = BIT(0), \ -	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \ +	.display.abox_mask = BIT(0), \ +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \  		BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP) | \  		BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \  	.pipe_offsets = { \ @@ -811,7 +816,7 @@ static const struct intel_device_info cml_gt2_info = {  		[TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \  	}, \  	GEN(11), \ -	.color = { .degamma_lut_size = 33, .gamma_lut_size = 262145 }, \ +	ICL_COLORS, \  	.dbuf.size = 2048, \  	.dbuf.slice_mask = BIT(DBUF_S1) | BIT(DBUF_S2), \  	.display.has_dsc = 1, \ @@ -842,9 +847,9 @@ static const struct intel_device_info jsl_info = {  #define GEN12_FEATURES \  	GEN11_FEATURES, \  	GEN(12), \ -	.abox_mask = GENMASK(2, 1), \ -	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D), \ -	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \ +	.display.abox_mask = GENMASK(2, 1), \ +	.display.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D), \ +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \  		BIT(TRANSCODER_C) | BIT(TRANSCODER_D) | \  		BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \  	.pipe_offsets = { \ @@ -866,7 +871,7 @@ static const struct intel_device_info jsl_info = {  	TGL_CURSOR_OFFSETS, \  	.has_global_mocs = 1, \  	.has_pxp = 1, \ -	.display.has_dsb = 1 +	.display.has_dsb = 0 /* FIXME: LUT load is broken with DSB */  static const struct intel_device_info tgl_info = {  	GEN12_FEATURES, @@ -879,9 +884,9 @@ static const struct intel_device_info tgl_info = {  static const struct intel_device_info rkl_info = {  	GEN12_FEATURES,  	PLATFORM(INTEL_ROCKETLAKE), -	.abox_mask = BIT(0), -	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), -	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | +	.display.abox_mask = BIT(0), +	.display.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |  		BIT(TRANSCODER_C),  	.display.has_hti = 1,  	.display.has_psr_hw_tracking = 0, @@ -899,9 +904,9 @@ static const struct intel_device_info rkl_info = {  static const struct intel_device_info dg1_info = {  	GEN12_FEATURES,  	DGFX_FEATURES, -	.graphics_rel = 10, +	.graphics.rel = 10,  	PLATFORM(INTEL_DG1), -	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D), +	.display.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D),  	.require_force_probe = 1,  	.platform_engine_mask =  		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | @@ -913,7 +918,7 @@ static const struct intel_device_info dg1_info = {  static const struct intel_device_info adl_s_info = {  	GEN12_FEATURES,  	PLATFORM(INTEL_ALDERLAKE_S), -	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D), +	.display.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D),  	.display.has_hti = 1,  	.display.has_psr_hw_tracking = 0,  	.platform_engine_mask = @@ -930,10 +935,11 @@ static const struct intel_device_info adl_s_info = {  	}  #define XE_LPD_FEATURES \ -	.abox_mask = GENMASK(1, 0),						\ -	.color = { .degamma_lut_size = 0, .gamma_lut_size = 0 },		\ -	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |		\ -		BIT(TRANSCODER_C) | BIT(TRANSCODER_D),				\ +	.display.abox_mask = GENMASK(1, 0),					\ +	.color = { .degamma_lut_size = 128, .gamma_lut_size = 1024,		\ +		   .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING |		\ +					DRM_COLOR_LUT_EQUAL_CHANNELS,		\ +	},									\  	.dbuf.size = 4096,							\  	.dbuf.slice_mask = BIT(DBUF_S1) | BIT(DBUF_S2) | BIT(DBUF_S3) |		\  		BIT(DBUF_S4),							\ @@ -949,18 +955,22 @@ static const struct intel_device_info adl_s_info = {  	.display.has_ipc = 1,							\  	.display.has_psr = 1,							\  	.display.ver = 13,							\ -	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D),	\ +	.display.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D),	\  	.pipe_offsets = {							\  		[TRANSCODER_A] = PIPE_A_OFFSET,					\  		[TRANSCODER_B] = PIPE_B_OFFSET,					\  		[TRANSCODER_C] = PIPE_C_OFFSET,					\  		[TRANSCODER_D] = PIPE_D_OFFSET,					\ +		[TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET,				\ +		[TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET,				\  	},									\  	.trans_offsets = {							\  		[TRANSCODER_A] = TRANSCODER_A_OFFSET,				\  		[TRANSCODER_B] = TRANSCODER_B_OFFSET,				\  		[TRANSCODER_C] = TRANSCODER_C_OFFSET,				\  		[TRANSCODER_D] = TRANSCODER_D_OFFSET,				\ +		[TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET,			\ +		[TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET,			\  	},									\  	XE_LPD_CURSOR_OFFSETS @@ -968,7 +978,9 @@ static const struct intel_device_info adl_p_info = {  	GEN12_FEATURES,  	XE_LPD_FEATURES,  	PLATFORM(INTEL_ALDERLAKE_P), -	.require_force_probe = 1, +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | +			       BIT(TRANSCODER_C) | BIT(TRANSCODER_D) | +			       BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1),  	.display.has_cdclk_crawl = 1,  	.display.has_modular_fia = 1,  	.display.has_psr_hw_tracking = 0, @@ -986,8 +998,8 @@ static const struct intel_device_info adl_p_info = {  		      I915_GTT_PAGE_SIZE_2M  #define XE_HP_FEATURES \ -	.graphics_ver = 12, \ -	.graphics_rel = 50, \ +	.graphics.ver = 12, \ +	.graphics.rel = 50, \  	XE_HP_PAGE_SIZES, \  	.dma_mask_size = 46, \  	.has_64bit_reloc = 1, \ @@ -1005,8 +1017,8 @@ static const struct intel_device_info adl_p_info = {  	.ppgtt_type = INTEL_PPGTT_FULL  #define XE_HPM_FEATURES \ -	.media_ver = 12, \ -	.media_rel = 50 +	.media.ver = 12, \ +	.media.rel = 50  __maybe_unused  static const struct intel_device_info xehpsdv_info = { @@ -1015,7 +1027,7 @@ static const struct intel_device_info xehpsdv_info = {  	DGFX_FEATURES,  	PLATFORM(INTEL_XEHPSDV),  	.display = { }, -	.pipe_mask = 0, +	.has_64k_pages = 1,  	.platform_engine_mask =  		BIT(RCS0) | BIT(BCS0) |  		BIT(VECS0) | BIT(VECS1) | BIT(VECS2) | BIT(VECS3) | @@ -1030,14 +1042,17 @@ static const struct intel_device_info dg2_info = {  	XE_HPM_FEATURES,  	XE_LPD_FEATURES,  	DGFX_FEATURES, -	.graphics_rel = 55, -	.media_rel = 55, +	.graphics.rel = 55, +	.media.rel = 55,  	PLATFORM(INTEL_DG2), +	.has_64k_pages = 1,  	.platform_engine_mask =  		BIT(RCS0) | BIT(BCS0) |  		BIT(VECS0) | BIT(VECS1) |  		BIT(VCS0) | BIT(VCS2),  	.require_force_probe = 1, +	.display.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | +			       BIT(TRANSCODER_C) | BIT(TRANSCODER_D),  };  #undef PLATFORM @@ -1117,6 +1132,7 @@ static const struct pci_device_id pciidlist[] = {  	INTEL_ADLS_IDS(&adl_s_info),  	INTEL_ADLP_IDS(&adl_p_info),  	INTEL_DG1_IDS(&dg1_info), +	INTEL_RPLS_IDS(&adl_s_info),  	{0, 0, 0}  };  MODULE_DEVICE_TABLE(pci, pciidlist); @@ -1189,11 +1205,8 @@ static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	if (PCI_FUNC(pdev->devfn))  		return -ENODEV; -	/* -	 * apple-gmux is needed on dual GPU MacBook Pro -	 * to probe the panel if we're the inactive GPU. -	 */ -	if (vga_switcheroo_client_probe_defer(pdev)) +	/* Detect if we need to wait for other drivers early on */ +	if (intel_modeset_probe_defer(pdev))  		return -EPROBE_DEFER;  	err = i915_driver_probe(pdev, ent);  |