On Wed, May 22, 2024 at 08:33:42PM +0300, Jani Nikula wrote: > We'll need to start identifying the platforms independently in display > code in order to break free from the i915 and xe IS_<PLATFORM>() > macros. This is fairly straightforward, as we already identify most > platforms by PCI ID in display probe anyway. > > As the first step, add platform descriptors with pointers to display > info. We'll have more platforms than display info, so minimize > duplication: > > - Add separate skl/kbl/cfl/cml descriptors while they share the display > info. > > - Add separate jsl/ehl descriptors while they share the display info. > > Identify ADL-P (and derivatives) and DG2 descriptors by their names even > though their display info is Xe LPD or HPD. > > Signed-off-by: Jani Nikula <jani.nikula@xxxxxxxxx> > --- > .../drm/i915/display/intel_display_device.c | 558 ++++++++++-------- > 1 file changed, 326 insertions(+), 232 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_display_device.c b/drivers/gpu/drm/i915/display/intel_display_device.c > index 56b27546d1b3..d1e03437abb3 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_device.c > +++ b/drivers/gpu/drm/i915/display/intel_display_device.c > @@ -20,6 +20,10 @@ > __diag_push(); > __diag_ignore_all("-Woverride-init", "Allow field initialization overrides for display info"); > > +struct platform_desc { > + const struct intel_display_device_info *info; > +}; I had to jump to the latest patch to understand why this single item in a new struct... later it makes sense... > + > static const struct intel_display_device_info no_display = {}; > > #define PIPE_A_OFFSET 0x70000 > @@ -200,33 +204,41 @@ static const struct intel_display_device_info no_display = {}; > .__runtime_defaults.pipe_mask = BIT(PIPE_A), \ > .__runtime_defaults.cpu_transcoder_mask = BIT(TRANSCODER_A) > > -static const struct intel_display_device_info i830_display = { > - I830_DISPLAY, > +static const struct platform_desc i830_desc = { > + .info = &(const struct intel_display_device_info) { > + I830_DISPLAY, > > - .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C), /* DVO A/B/C */ > + .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C), /* DVO A/B/C */ > + }, > }; > > -static const struct intel_display_device_info i845_display = { > - I845_DISPLAY, > +static const struct platform_desc i845_desc = { > + .info = &(const struct intel_display_device_info) { > + I845_DISPLAY, > > - .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* DVO B/C */ > + .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* DVO B/C */ > + }, > }; > > -static const struct intel_display_device_info i85x_display = { > - I830_DISPLAY, > +static const struct platform_desc i85x_desc = { > + .info = &(const struct intel_display_device_info) { > + I830_DISPLAY, > > - .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* DVO B/C */ > - .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* DVO B/C */ > + .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + }, > }; > > -static const struct intel_display_device_info i865g_display = { > - I845_DISPLAY, > +static const struct platform_desc i865g_desc = { > + .info = &(const struct intel_display_device_info) { > + I845_DISPLAY, > > - .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* DVO B/C */ > - .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* DVO B/C */ > + .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + }, > }; > > -#define GEN3_DISPLAY \ > +#define GEN3_DISPLAY \ I had noticed a trend in all of your recent series, to replace the long tab or space before '\' with a single space. But then here you change the single space to multiple spaces. Intentional? > .has_gmch = 1, \ > .has_overlay = 1, \ > I9XX_PIPE_OFFSETS, \ > @@ -238,52 +250,64 @@ static const struct intel_display_device_info i865g_display = { > BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \ > .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C) /* SDVO B/C */ > > -static const struct intel_display_device_info i915g_display = { > - GEN3_DISPLAY, > - I845_COLORS, > - .cursor_needs_physical = 1, > - .overlay_needs_physical = 1, > +static const struct platform_desc i915g_desc = { > + .info = &(const struct intel_display_device_info) { > + GEN3_DISPLAY, > + I845_COLORS, > + .cursor_needs_physical = 1, > + .overlay_needs_physical = 1, > + }, > }; > > -static const struct intel_display_device_info i915gm_display = { > - GEN3_DISPLAY, > - I9XX_COLORS, > - .cursor_needs_physical = 1, > - .overlay_needs_physical = 1, > - .supports_tv = 1, > +static const struct platform_desc i915gm_desc = { > + .info = &(const struct intel_display_device_info) { > + GEN3_DISPLAY, > + I9XX_COLORS, > + .cursor_needs_physical = 1, > + .overlay_needs_physical = 1, > + .supports_tv = 1, > > - .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + }, > }; > > -static const struct intel_display_device_info i945g_display = { > - GEN3_DISPLAY, > - I845_COLORS, > - .has_hotplug = 1, > - .cursor_needs_physical = 1, > - .overlay_needs_physical = 1, > +static const struct platform_desc i945g_desc = { > + .info = &(const struct intel_display_device_info) { > + GEN3_DISPLAY, > + I845_COLORS, > + .has_hotplug = 1, > + .cursor_needs_physical = 1, > + .overlay_needs_physical = 1, > + }, > }; > > -static const struct intel_display_device_info i945gm_display = { > - GEN3_DISPLAY, > - I9XX_COLORS, > - .has_hotplug = 1, > - .cursor_needs_physical = 1, > - .overlay_needs_physical = 1, > - .supports_tv = 1, > - > - .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > +static const struct platform_desc i945gm_desc = { > + .info = &(const struct intel_display_device_info) { > + GEN3_DISPLAY, > + I9XX_COLORS, > + .has_hotplug = 1, > + .cursor_needs_physical = 1, > + .overlay_needs_physical = 1, > + .supports_tv = 1, > + > + .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + }, > }; > > -static const struct intel_display_device_info g33_display = { > - GEN3_DISPLAY, > - I845_COLORS, > - .has_hotplug = 1, > +static const struct platform_desc g33_desc = { > + .info = &(const struct intel_display_device_info) { > + GEN3_DISPLAY, > + I845_COLORS, > + .has_hotplug = 1, > + }, > }; > > -static const struct intel_display_device_info pnv_display = { > - GEN3_DISPLAY, > - I9XX_COLORS, > - .has_hotplug = 1, > +static const struct platform_desc pnv_desc = { > + .info = &(const struct intel_display_device_info) { > + GEN3_DISPLAY, > + I9XX_COLORS, > + .has_hotplug = 1, > + }, > }; > > #define GEN4_DISPLAY \ > @@ -298,34 +322,42 @@ static const struct intel_display_device_info pnv_display = { > .__runtime_defaults.cpu_transcoder_mask = \ > BIT(TRANSCODER_A) | BIT(TRANSCODER_B) > > -static const struct intel_display_device_info i965g_display = { > - GEN4_DISPLAY, > - .has_overlay = 1, > +static const struct platform_desc i965g_desc = { > + .info = &(const struct intel_display_device_info) { > + GEN4_DISPLAY, > + .has_overlay = 1, > > - .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* SDVO B/C */ > + .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* SDVO B/C */ > + }, > }; > > -static const struct intel_display_device_info i965gm_display = { > - GEN4_DISPLAY, > - .has_overlay = 1, > - .supports_tv = 1, > +static const struct platform_desc i965gm_desc = { > + .info = &(const struct intel_display_device_info) { > + GEN4_DISPLAY, > + .has_overlay = 1, > + .supports_tv = 1, > > - .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* SDVO B/C */ > - .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* SDVO B/C */ > + .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + }, > }; > > -static const struct intel_display_device_info g45_display = { > - GEN4_DISPLAY, > +static const struct platform_desc g45_desc = { > + .info = &(const struct intel_display_device_info) { > + GEN4_DISPLAY, > > - .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D), /* SDVO/HDMI/DP B/C, DP D */ > + .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D), /* SDVO/HDMI/DP B/C, DP D */ > + }, > }; > > -static const struct intel_display_device_info gm45_display = { > - GEN4_DISPLAY, > - .supports_tv = 1, > +static const struct platform_desc gm45_desc = { > + .info = &(const struct intel_display_device_info) { > + GEN4_DISPLAY, > + .supports_tv = 1, > > - .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D), /* SDVO/HDMI/DP B/C, DP D */ > - .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D), /* SDVO/HDMI/DP B/C, DP D */ > + .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + }, > }; > > #define ILK_DISPLAY \ > @@ -340,112 +372,128 @@ static const struct intel_display_device_info gm45_display = { > BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \ > .__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 */ > > -static const struct intel_display_device_info ilk_d_display = { > - ILK_DISPLAY, > +static const struct platform_desc ilk_d_desc = { > + .info = &(const struct intel_display_device_info) { > + ILK_DISPLAY, > + }, > }; > > -static const struct intel_display_device_info ilk_m_display = { > - ILK_DISPLAY, > +static const struct platform_desc ilk_m_desc = { > + .info = &(const struct intel_display_device_info) { > + ILK_DISPLAY, > > - .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + }, > }; > > -static const struct intel_display_device_info snb_display = { > - .has_hotplug = 1, > - I9XX_PIPE_OFFSETS, > - I9XX_CURSOR_OFFSETS, > - ILK_COLORS, > +static const struct platform_desc snb_desc = { > + .info = &(const struct intel_display_device_info) { > + .has_hotplug = 1, > + I9XX_PIPE_OFFSETS, > + I9XX_CURSOR_OFFSETS, > + ILK_COLORS, > > - .__runtime_defaults.ip.ver = 6, > - .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), > - .__runtime_defaults.cpu_transcoder_mask = > + .__runtime_defaults.ip.ver = 6, > + .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), > + .__runtime_defaults.cpu_transcoder_mask = > BIT(TRANSCODER_A) | BIT(TRANSCODER_B), > - .__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 */ > - .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + .__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 */ > + .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + }, > }; > > -static const struct intel_display_device_info ivb_display = { > - .has_hotplug = 1, > - IVB_PIPE_OFFSETS, > - IVB_CURSOR_OFFSETS, > - IVB_COLORS, > +static const struct platform_desc ivb_desc = { > + .info = &(const struct intel_display_device_info) { > + .has_hotplug = 1, > + IVB_PIPE_OFFSETS, > + IVB_CURSOR_OFFSETS, > + IVB_COLORS, > > - .__runtime_defaults.ip.ver = 7, > - .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), > - .__runtime_defaults.cpu_transcoder_mask = > + .__runtime_defaults.ip.ver = 7, > + .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), > + .__runtime_defaults.cpu_transcoder_mask = > BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C), > - .__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 */ > - .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + .__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 */ > + .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + }, > }; > > -static const struct intel_display_device_info vlv_display = { > - .has_gmch = 1, > - .has_hotplug = 1, > - .mmio_offset = VLV_DISPLAY_BASE, > - I9XX_PIPE_OFFSETS, > - I9XX_CURSOR_OFFSETS, > - I9XX_COLORS, > - > - .__runtime_defaults.ip.ver = 7, > - .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), > - .__runtime_defaults.cpu_transcoder_mask = > +static const struct platform_desc vlv_desc = { > + .info = &(const struct intel_display_device_info) { > + .has_gmch = 1, > + .has_hotplug = 1, > + .mmio_offset = VLV_DISPLAY_BASE, > + I9XX_PIPE_OFFSETS, > + I9XX_CURSOR_OFFSETS, > + I9XX_COLORS, > + > + .__runtime_defaults.ip.ver = 7, > + .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), > + .__runtime_defaults.cpu_transcoder_mask = > BIT(TRANSCODER_A) | BIT(TRANSCODER_B), > - .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* HDMI/DP B/C */ > + .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C), /* HDMI/DP B/C */ > + }, > }; > > -static const struct intel_display_device_info hsw_display = { > - .has_ddi = 1, > - .has_dp_mst = 1, > - .has_fpga_dbg = 1, > - .has_hotplug = 1, > - .has_psr = 1, > - .has_psr_hw_tracking = 1, > - HSW_PIPE_OFFSETS, > - IVB_CURSOR_OFFSETS, > - IVB_COLORS, > - > - .__runtime_defaults.ip.ver = 7, > - .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), > - .__runtime_defaults.cpu_transcoder_mask = > +static const struct platform_desc hsw_desc = { > + .info = &(const struct intel_display_device_info) { > + .has_ddi = 1, > + .has_dp_mst = 1, > + .has_fpga_dbg = 1, > + .has_hotplug = 1, > + .has_psr = 1, > + .has_psr_hw_tracking = 1, > + HSW_PIPE_OFFSETS, > + IVB_CURSOR_OFFSETS, > + IVB_COLORS, > + > + .__runtime_defaults.ip.ver = 7, > + .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), > + .__runtime_defaults.cpu_transcoder_mask = > BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | > BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP), > - .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D) | BIT(PORT_E), > - .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D) | BIT(PORT_E), > + .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + }, > }; > > -static const struct intel_display_device_info bdw_display = { > - .has_ddi = 1, > - .has_dp_mst = 1, > - .has_fpga_dbg = 1, > - .has_hotplug = 1, > - .has_psr = 1, > - .has_psr_hw_tracking = 1, > - HSW_PIPE_OFFSETS, > - IVB_CURSOR_OFFSETS, > - IVB_COLORS, > - > - .__runtime_defaults.ip.ver = 8, > - .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), > - .__runtime_defaults.cpu_transcoder_mask = > +static const struct platform_desc bdw_desc = { > + .info = &(const struct intel_display_device_info) { > + .has_ddi = 1, > + .has_dp_mst = 1, > + .has_fpga_dbg = 1, > + .has_hotplug = 1, > + .has_psr = 1, > + .has_psr_hw_tracking = 1, > + HSW_PIPE_OFFSETS, > + IVB_CURSOR_OFFSETS, > + IVB_COLORS, > + > + .__runtime_defaults.ip.ver = 8, > + .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), > + .__runtime_defaults.cpu_transcoder_mask = > BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | > BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP), > - .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D) | BIT(PORT_E), > - .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D) | BIT(PORT_E), > + .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > + }, > }; > > -static const struct intel_display_device_info chv_display = { > - .has_hotplug = 1, > - .has_gmch = 1, > - .mmio_offset = VLV_DISPLAY_BASE, > - CHV_PIPE_OFFSETS, > - CHV_CURSOR_OFFSETS, > - CHV_COLORS, > - > - .__runtime_defaults.ip.ver = 8, > - .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), > - .__runtime_defaults.cpu_transcoder_mask = > +static const struct platform_desc chv_desc = { > + .info = &(const struct intel_display_device_info) { > + .has_hotplug = 1, > + .has_gmch = 1, > + .mmio_offset = VLV_DISPLAY_BASE, > + CHV_PIPE_OFFSETS, > + CHV_CURSOR_OFFSETS, > + CHV_COLORS, > + > + .__runtime_defaults.ip.ver = 8, > + .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), > + .__runtime_defaults.cpu_transcoder_mask = > BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C), > - .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D), /* HDMI/DP B/C/D */ > + .__runtime_defaults.port_mask = BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D), /* HDMI/DP B/C/D */ > + }, > }; > > static const struct intel_display_device_info skl_display = { > @@ -467,13 +515,29 @@ static const struct intel_display_device_info skl_display = { > .__runtime_defaults.has_hdcp = 1, > .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), > .__runtime_defaults.cpu_transcoder_mask = > - BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | > - BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP), > + BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | > + BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP), > .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D) | BIT(PORT_E), > .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A), > }; > > -#define GEN9_LP_DISPLAY \ > +static const struct platform_desc skl_desc = { > + .info = &skl_display, > +}; > + > +static const struct platform_desc kbl_desc = { > + .info = &skl_display, > +}; > + > +static const struct platform_desc cfl_desc = { > + .info = &skl_display, > +}; > + > +static const struct platform_desc cml_desc = { > + .info = &skl_display, > +}; > + > +#define GEN9_LP_DISPLAY \ > .dbuf.slice_mask = BIT(DBUF_S1), \ > .has_dp_mst = 1, \ > .has_ddi = 1, \ > @@ -496,19 +560,23 @@ static const struct intel_display_device_info skl_display = { > BIT(TRANSCODER_DSI_A) | BIT(TRANSCODER_DSI_C), \ > .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) > > -static const struct intel_display_device_info bxt_display = { > - GEN9_LP_DISPLAY, > - .dbuf.size = 512 - 4, /* 4 blocks for bypass path allocation */ > +static const struct platform_desc bxt_desc = { > + .info = &(const struct intel_display_device_info) { > + GEN9_LP_DISPLAY, > + .dbuf.size = 512 - 4, /* 4 blocks for bypass path allocation */ > > - .__runtime_defaults.ip.ver = 9, > + .__runtime_defaults.ip.ver = 9, > + }, > }; > > -static const struct intel_display_device_info glk_display = { > - GEN9_LP_DISPLAY, > - .dbuf.size = 1024 - 4, /* 4 blocks for bypass path allocation */ > - GLK_COLORS, > +static const struct platform_desc glk_desc = { > + .info = &(const struct intel_display_device_info) { > + GEN9_LP_DISPLAY, > + .dbuf.size = 1024 - 4, /* 4 blocks for bypass path allocation */ > + GLK_COLORS, > > - .__runtime_defaults.ip.ver = 10, > + .__runtime_defaults.ip.ver = 10, > + }, > }; > > #define ICL_DISPLAY \ > @@ -552,10 +620,12 @@ static const struct intel_display_device_info glk_display = { > BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \ > .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A) > > -static const struct intel_display_device_info icl_display = { > - ICL_DISPLAY, > +static const struct platform_desc icl_desc = { > + .info = &(const struct intel_display_device_info) { > + ICL_DISPLAY, > > - .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D) | BIT(PORT_E), > + .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D) | BIT(PORT_E), > + }, > }; > > static const struct intel_display_device_info jsl_ehl_display = { > @@ -564,6 +634,14 @@ static const struct intel_display_device_info jsl_ehl_display = { > .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | BIT(PORT_C) | BIT(PORT_D), > }; > > +static const struct platform_desc jsl_desc = { > + .info = &jsl_ehl_display, > +}; > + > +static const struct platform_desc ehl_desc = { > + .info = &jsl_ehl_display, > +}; > + > #define XE_D_DISPLAY \ > .abox_mask = GENMASK(2, 1), \ > .dbuf.size = 2048, \ > @@ -607,44 +685,52 @@ static const struct intel_display_device_info jsl_ehl_display = { > BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \ > .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A) > > -static const struct intel_display_device_info tgl_display = { > - XE_D_DISPLAY, > +static const struct platform_desc tgl_desc = { > + .info = &(const struct intel_display_device_info) { > + XE_D_DISPLAY, > > - /* > - * FIXME DDI C/combo PHY C missing due to combo PHY > - * code making a mess on SKUs where the PHY is missing. > - */ > - .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | > + /* > + * FIXME DDI C/combo PHY C missing due to combo PHY > + * code making a mess on SKUs where the PHY is missing. > + */ > + .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | > BIT(PORT_TC1) | BIT(PORT_TC2) | BIT(PORT_TC3) | BIT(PORT_TC4) | BIT(PORT_TC5) | BIT(PORT_TC6), > + }, > }; > > -static const struct intel_display_device_info dg1_display = { > - XE_D_DISPLAY, > +static const struct platform_desc dg1_desc = { > + .info = &(const struct intel_display_device_info) { > + XE_D_DISPLAY, > > - .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | > + .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | > BIT(PORT_TC1) | BIT(PORT_TC2), > + }, > }; > > -static const struct intel_display_device_info rkl_display = { > - XE_D_DISPLAY, > - .abox_mask = BIT(0), > - .has_hti = 1, > - .has_psr_hw_tracking = 0, > +static const struct platform_desc rkl_desc = { > + .info = &(const struct intel_display_device_info) { > + XE_D_DISPLAY, > + .abox_mask = BIT(0), > + .has_hti = 1, > + .has_psr_hw_tracking = 0, > > - .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), > - .__runtime_defaults.cpu_transcoder_mask = > + .__runtime_defaults.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), > + .__runtime_defaults.cpu_transcoder_mask = > BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C), > - .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | > + .__runtime_defaults.port_mask = BIT(PORT_A) | BIT(PORT_B) | > BIT(PORT_TC1) | BIT(PORT_TC2), > + }, > }; > > -static const struct intel_display_device_info adl_s_display = { > - XE_D_DISPLAY, > - .has_hti = 1, > - .has_psr_hw_tracking = 0, > +static const struct platform_desc adl_s_desc = { > + .info = &(const struct intel_display_device_info) { > + XE_D_DISPLAY, > + .has_hti = 1, > + .has_psr_hw_tracking = 0, > > - .__runtime_defaults.port_mask = BIT(PORT_A) | > + .__runtime_defaults.port_mask = BIT(PORT_A) | > BIT(PORT_TC1) | BIT(PORT_TC2) | BIT(PORT_TC3) | BIT(PORT_TC4), > + }, > }; > > #define XE_LPD_FEATURES \ > @@ -703,6 +789,10 @@ static const struct intel_display_device_info xe_lpd_display = { > BIT(PORT_TC1) | BIT(PORT_TC2) | BIT(PORT_TC3) | BIT(PORT_TC4), > }; > > +static const struct platform_desc adl_p_desc = { > + .info = &xe_lpd_display, > +}; > + > static const struct intel_display_device_info xe_hpd_display = { > XE_LPD_FEATURES, > .has_cdclk_squash = 1, > @@ -714,6 +804,10 @@ static const struct intel_display_device_info xe_hpd_display = { > BIT(PORT_TC1), > }; > > +static const struct platform_desc dg2_desc = { > + .info = &xe_hpd_display, > +}; > + > #define XE_LPDP_FEATURES \ > .abox_mask = GENMASK(1, 0), \ > .color = { \ > @@ -795,54 +889,54 @@ static bool has_no_display(struct pci_dev *pdev) > return pci_match_id(ids, pdev); > } > > -#define INTEL_DISPLAY_DEVICE(_id, _info) { .devid = (_id), .info = (_info) } > +#define INTEL_DISPLAY_DEVICE(_id, _desc) { .devid = (_id), .desc = (_desc) } > > static const struct { > u32 devid; > - const struct intel_display_device_info *info; > + const struct platform_desc *desc; > } intel_display_ids[] = { > - INTEL_I830_IDS(INTEL_DISPLAY_DEVICE, &i830_display), > - INTEL_I845G_IDS(INTEL_DISPLAY_DEVICE, &i845_display), > - INTEL_I85X_IDS(INTEL_DISPLAY_DEVICE, &i85x_display), > - INTEL_I865G_IDS(INTEL_DISPLAY_DEVICE, &i865g_display), > - INTEL_I915G_IDS(INTEL_DISPLAY_DEVICE, &i915g_display), > - INTEL_I915GM_IDS(INTEL_DISPLAY_DEVICE, &i915gm_display), > - INTEL_I945G_IDS(INTEL_DISPLAY_DEVICE, &i945g_display), > - INTEL_I945GM_IDS(INTEL_DISPLAY_DEVICE, &i945gm_display), > - INTEL_I965G_IDS(INTEL_DISPLAY_DEVICE, &i965g_display), > - INTEL_G33_IDS(INTEL_DISPLAY_DEVICE, &g33_display), > - INTEL_I965GM_IDS(INTEL_DISPLAY_DEVICE, &i965gm_display), > - INTEL_GM45_IDS(INTEL_DISPLAY_DEVICE, &gm45_display), > - INTEL_G45_IDS(INTEL_DISPLAY_DEVICE, &g45_display), > - INTEL_PNV_IDS(INTEL_DISPLAY_DEVICE, &pnv_display), > - INTEL_ILK_D_IDS(INTEL_DISPLAY_DEVICE, &ilk_d_display), > - INTEL_ILK_M_IDS(INTEL_DISPLAY_DEVICE, &ilk_m_display), > - INTEL_SNB_IDS(INTEL_DISPLAY_DEVICE, &snb_display), > - INTEL_IVB_IDS(INTEL_DISPLAY_DEVICE, &ivb_display), > - INTEL_HSW_IDS(INTEL_DISPLAY_DEVICE, &hsw_display), > - INTEL_VLV_IDS(INTEL_DISPLAY_DEVICE, &vlv_display), > - INTEL_BDW_IDS(INTEL_DISPLAY_DEVICE, &bdw_display), > - INTEL_CHV_IDS(INTEL_DISPLAY_DEVICE, &chv_display), > - INTEL_SKL_IDS(INTEL_DISPLAY_DEVICE, &skl_display), > - INTEL_BXT_IDS(INTEL_DISPLAY_DEVICE, &bxt_display), > - INTEL_GLK_IDS(INTEL_DISPLAY_DEVICE, &glk_display), > - INTEL_KBL_IDS(INTEL_DISPLAY_DEVICE, &skl_display), > - INTEL_CFL_IDS(INTEL_DISPLAY_DEVICE, &skl_display), > - INTEL_WHL_IDS(INTEL_DISPLAY_DEVICE, &skl_display), > - INTEL_CML_IDS(INTEL_DISPLAY_DEVICE, &skl_display), > - INTEL_ICL_IDS(INTEL_DISPLAY_DEVICE, &icl_display), > - INTEL_EHL_IDS(INTEL_DISPLAY_DEVICE, &jsl_ehl_display), > - INTEL_JSL_IDS(INTEL_DISPLAY_DEVICE, &jsl_ehl_display), > - INTEL_TGL_IDS(INTEL_DISPLAY_DEVICE, &tgl_display), > - INTEL_DG1_IDS(INTEL_DISPLAY_DEVICE, &dg1_display), > - INTEL_RKL_IDS(INTEL_DISPLAY_DEVICE, &rkl_display), > - INTEL_ADLS_IDS(INTEL_DISPLAY_DEVICE, &adl_s_display), > - INTEL_RPLS_IDS(INTEL_DISPLAY_DEVICE, &adl_s_display), > - INTEL_ADLP_IDS(INTEL_DISPLAY_DEVICE, &xe_lpd_display), > - INTEL_ADLN_IDS(INTEL_DISPLAY_DEVICE, &xe_lpd_display), > - INTEL_RPLU_IDS(INTEL_DISPLAY_DEVICE, &xe_lpd_display), > - INTEL_RPLP_IDS(INTEL_DISPLAY_DEVICE, &xe_lpd_display), > - INTEL_DG2_IDS(INTEL_DISPLAY_DEVICE, &xe_hpd_display), > + INTEL_I830_IDS(INTEL_DISPLAY_DEVICE, &i830_desc), But here is what I'm not sure if I completely understand/agree... before this patch is a display device with a display struct but then it becomes a display device with a platform description but a platform that is not used by the driver... I'm probably missing some later jump there. > + INTEL_I845G_IDS(INTEL_DISPLAY_DEVICE, &i845_desc), > + INTEL_I85X_IDS(INTEL_DISPLAY_DEVICE, &i85x_desc), > + INTEL_I865G_IDS(INTEL_DISPLAY_DEVICE, &i865g_desc), > + INTEL_I915G_IDS(INTEL_DISPLAY_DEVICE, &i915g_desc), > + INTEL_I915GM_IDS(INTEL_DISPLAY_DEVICE, &i915gm_desc), > + INTEL_I945G_IDS(INTEL_DISPLAY_DEVICE, &i945g_desc), > + INTEL_I945GM_IDS(INTEL_DISPLAY_DEVICE, &i945gm_desc), > + INTEL_I965G_IDS(INTEL_DISPLAY_DEVICE, &i965g_desc), > + INTEL_G33_IDS(INTEL_DISPLAY_DEVICE, &g33_desc), > + INTEL_I965GM_IDS(INTEL_DISPLAY_DEVICE, &i965gm_desc), > + INTEL_GM45_IDS(INTEL_DISPLAY_DEVICE, &gm45_desc), > + INTEL_G45_IDS(INTEL_DISPLAY_DEVICE, &g45_desc), > + INTEL_PNV_IDS(INTEL_DISPLAY_DEVICE, &pnv_desc), > + INTEL_ILK_D_IDS(INTEL_DISPLAY_DEVICE, &ilk_d_desc), > + INTEL_ILK_M_IDS(INTEL_DISPLAY_DEVICE, &ilk_m_desc), > + INTEL_SNB_IDS(INTEL_DISPLAY_DEVICE, &snb_desc), > + INTEL_IVB_IDS(INTEL_DISPLAY_DEVICE, &ivb_desc), > + INTEL_HSW_IDS(INTEL_DISPLAY_DEVICE, &hsw_desc), > + INTEL_VLV_IDS(INTEL_DISPLAY_DEVICE, &vlv_desc), > + INTEL_BDW_IDS(INTEL_DISPLAY_DEVICE, &bdw_desc), > + INTEL_CHV_IDS(INTEL_DISPLAY_DEVICE, &chv_desc), > + INTEL_SKL_IDS(INTEL_DISPLAY_DEVICE, &skl_desc), > + INTEL_BXT_IDS(INTEL_DISPLAY_DEVICE, &bxt_desc), > + INTEL_GLK_IDS(INTEL_DISPLAY_DEVICE, &glk_desc), > + INTEL_KBL_IDS(INTEL_DISPLAY_DEVICE, &kbl_desc), > + INTEL_CFL_IDS(INTEL_DISPLAY_DEVICE, &cfl_desc), > + INTEL_WHL_IDS(INTEL_DISPLAY_DEVICE, &cfl_desc), > + INTEL_CML_IDS(INTEL_DISPLAY_DEVICE, &cml_desc), > + INTEL_ICL_IDS(INTEL_DISPLAY_DEVICE, &icl_desc), > + INTEL_EHL_IDS(INTEL_DISPLAY_DEVICE, &ehl_desc), > + INTEL_JSL_IDS(INTEL_DISPLAY_DEVICE, &jsl_desc), > + INTEL_TGL_IDS(INTEL_DISPLAY_DEVICE, &tgl_desc), > + INTEL_DG1_IDS(INTEL_DISPLAY_DEVICE, &dg1_desc), > + INTEL_RKL_IDS(INTEL_DISPLAY_DEVICE, &rkl_desc), > + INTEL_ADLS_IDS(INTEL_DISPLAY_DEVICE, &adl_s_desc), > + INTEL_RPLS_IDS(INTEL_DISPLAY_DEVICE, &adl_s_desc), > + INTEL_ADLP_IDS(INTEL_DISPLAY_DEVICE, &adl_p_desc), > + INTEL_ADLN_IDS(INTEL_DISPLAY_DEVICE, &adl_p_desc), > + INTEL_RPLU_IDS(INTEL_DISPLAY_DEVICE, &adl_p_desc), > + INTEL_RPLP_IDS(INTEL_DISPLAY_DEVICE, &adl_p_desc), > + INTEL_DG2_IDS(INTEL_DISPLAY_DEVICE, &dg2_desc), > > /* > * Do not add any GMD_ID-based platforms to this list. They will > @@ -909,7 +1003,7 @@ probe_display(struct drm_i915_private *i915) > > for (i = 0; i < ARRAY_SIZE(intel_display_ids); i++) { > if (intel_display_ids[i].devid == pdev->device) > - return intel_display_ids[i].info; > + return intel_display_ids[i].desc->info; > } > > drm_dbg(&i915->drm, "No display ID found for device ID %04x; disabling display.\n", > -- > 2.39.2 >