[PATCH 09/10] drm/i915/display: add support for subplatforms
Rodrigo Vivi
rodrigo.vivi at intel.com
Thu May 23 18:37:36 UTC 2024
On Wed, May 22, 2024 at 08:33:46PM +0300, Jani Nikula wrote:
> Add support for subplatforms. This is similar to what the xe driver is
> doing. The subplatform is an enum and it's exclusive, i.e. only one
> subplatform can match, and it completely identifies the platform and
> subplatform. This is different from i915 core, and is notable in the
> handling of ULT/ULX and RPL/RPL-U.
Only used to print information in the next patch?
But I guess other future use in mind as well?
anyway it is a good organization by itself.
Reviewed-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
>
> Signed-off-by: Jani Nikula <jani.nikula at intel.com>
> ---
> .../drm/i915/display/intel_display_device.c | 204 ++++++++++++++++++
> .../drm/i915/display/intel_display_device.h | 26 +++
> 2 files changed, 230 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_device.c b/drivers/gpu/drm/i915/display/intel_display_device.c
> index 7c5cead1fe15..59b8ca174ef8 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_device.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_device.c
> @@ -20,9 +20,16 @@
> __diag_push();
> __diag_ignore_all("-Woverride-init", "Allow field initialization overrides for display info");
>
> +struct subplatform_desc {
> + enum intel_display_subplatform subplatform;
> + const char *name;
> + const u16 *pciidlist;
> +};
> +
> struct platform_desc {
> enum intel_display_platform platform;
> const char *name;
> + const struct subplatform_desc *subplatforms;
> const struct intel_display_device_info *info; /* NULL for GMD ID */
> };
>
> @@ -30,6 +37,8 @@ struct platform_desc {
> .platform = (INTEL_DISPLAY_##_platform), \
> .name = #_platform
>
> +#define ID(id) (id)
> +
> static const struct intel_display_device_info no_display = {};
>
> #define PIPE_A_OFFSET 0x70000
> @@ -460,8 +469,26 @@ static const struct platform_desc vlv_desc = {
> },
> };
>
> +static const u16 hsw_ult_ids[] = {
> + INTEL_HSW_ULT_GT1_IDS(ID),
> + INTEL_HSW_ULT_GT2_IDS(ID),
> + INTEL_HSW_ULT_GT3_IDS(ID),
> + 0
> +};
> +
> +static const u16 hsw_ulx_ids[] = {
> + INTEL_HSW_ULX_GT1_IDS(ID),
> + INTEL_HSW_ULX_GT2_IDS(ID),
> + 0
> +};
> +
> static const struct platform_desc hsw_desc = {
> PLATFORM(HASWELL),
> + .subplatforms = (const struct subplatform_desc[]) {
> + { INTEL_DISPLAY_HASWELL_ULT, "ULT", hsw_ult_ids },
> + { INTEL_DISPLAY_HASWELL_ULX, "ULX", hsw_ulx_ids },
> + {},
> + },
> .info = &(const struct intel_display_device_info) {
> .has_ddi = 1,
> .has_dp_mst = 1,
> @@ -483,8 +510,29 @@ static const struct platform_desc hsw_desc = {
> },
> };
>
> +static const u16 bdw_ult_ids[] = {
> + INTEL_BDW_ULT_GT1_IDS(ID),
> + INTEL_BDW_ULT_GT2_IDS(ID),
> + INTEL_BDW_ULT_GT3_IDS(ID),
> + INTEL_BDW_ULT_RSVD_IDS(ID),
> + 0
> +};
> +
> +static const u16 bdw_ulx_ids[] = {
> + INTEL_BDW_ULX_GT1_IDS(ID),
> + INTEL_BDW_ULX_GT2_IDS(ID),
> + INTEL_BDW_ULX_GT3_IDS(ID),
> + INTEL_BDW_ULX_RSVD_IDS(ID),
> + 0
> +};
> +
> static const struct platform_desc bdw_desc = {
> PLATFORM(BROADWELL),
> + .subplatforms = (const struct subplatform_desc[]) {
> + { INTEL_DISPLAY_BROADWELL_ULT, "ULT", bdw_ult_ids },
> + { INTEL_DISPLAY_BROADWELL_ULX, "ULX", bdw_ulx_ids },
> + {},
> + },
> .info = &(const struct intel_display_device_info) {
> .has_ddi = 1,
> .has_dp_mst = 1,
> @@ -549,23 +597,89 @@ static const struct intel_display_device_info skl_display = {
> .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A),
> };
>
> +static const u16 skl_ult_ids[] = {
> + INTEL_SKL_ULT_GT1_IDS(ID),
> + INTEL_SKL_ULT_GT2_IDS(ID),
> + INTEL_SKL_ULT_GT3_IDS(ID),
> + 0
> +};
> +
> +static const u16 skl_ulx_ids[] = {
> + INTEL_SKL_ULX_GT1_IDS(ID),
> + INTEL_SKL_ULX_GT2_IDS(ID),
> + 0
> +};
> +
> static const struct platform_desc skl_desc = {
> PLATFORM(SKYLAKE),
> + .subplatforms = (const struct subplatform_desc[]) {
> + { INTEL_DISPLAY_SKYLAKE_ULT, "ULT", skl_ult_ids },
> + { INTEL_DISPLAY_SKYLAKE_ULX, "ULX", skl_ulx_ids },
> + {},
> + },
> .info = &skl_display,
> };
>
> +static const u16 kbl_ult_ids[] = {
> + INTEL_KBL_ULT_GT1_IDS(ID),
> + INTEL_KBL_ULT_GT2_IDS(ID),
> + INTEL_KBL_ULT_GT3_IDS(ID),
> + 0
> +};
> +
> +static const u16 kbl_ulx_ids[] = {
> + INTEL_KBL_ULX_GT1_IDS(ID),
> + INTEL_KBL_ULX_GT2_IDS(ID),
> + INTEL_AML_KBL_GT2_IDS(ID),
> + 0
> +};
> +
> static const struct platform_desc kbl_desc = {
> PLATFORM(KABYLAKE),
> + .subplatforms = (const struct subplatform_desc[]) {
> + { INTEL_DISPLAY_KABYLAKE_ULT, "ULT", kbl_ult_ids },
> + { INTEL_DISPLAY_KABYLAKE_ULX, "ULX", kbl_ulx_ids },
> + {},
> + },
> .info = &skl_display,
> };
>
> +static const u16 cfl_ult_ids[] = {
> + INTEL_CFL_U_GT2_IDS(ID),
> + INTEL_CFL_U_GT3_IDS(ID),
> + INTEL_WHL_U_GT1_IDS(ID),
> + INTEL_WHL_U_GT2_IDS(ID),
> + INTEL_WHL_U_GT3_IDS(ID),
> + 0
> +};
> +
> +static const u16 cfl_ulx_ids[] = {
> + INTEL_AML_CFL_GT2_IDS(ID),
> + 0
> +};
> +
> static const struct platform_desc cfl_desc = {
> PLATFORM(COFFEELAKE),
> + .subplatforms = (const struct subplatform_desc[]) {
> + { INTEL_DISPLAY_COFFEELAKE_ULT, "ULT", cfl_ult_ids },
> + { INTEL_DISPLAY_COFFEELAKE_ULX, "ULX", cfl_ulx_ids },
> + {},
> + },
> .info = &skl_display,
> };
>
> +static const u16 cml_ult_ids[] = {
> + INTEL_CML_U_GT1_IDS(ID),
> + INTEL_CML_U_GT2_IDS(ID),
> + 0
> +};
> +
> static const struct platform_desc cml_desc = {
> PLATFORM(COMETLAKE),
> + .subplatforms = (const struct subplatform_desc[]) {
> + { INTEL_DISPLAY_COMETLAKE_ULT, "ULT", cml_ult_ids },
> + {},
> + },
> .info = &skl_display,
> };
>
> @@ -654,8 +768,17 @@ static const struct platform_desc glk_desc = {
> BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \
> .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A)
>
> +static const u16 icl_port_f_ids[] = {
> + INTEL_ICL_PORT_F_IDS(ID),
> + 0
> +};
> +
> static const struct platform_desc icl_desc = {
> PLATFORM(ICELAKE),
> + .subplatforms = (const struct subplatform_desc[]) {
> + { INTEL_DISPLAY_ICELAKE_PORT_F, "Port F", icl_port_f_ids },
> + {},
> + },
> .info = &(const struct intel_display_device_info) {
> ICL_DISPLAY,
>
> @@ -722,8 +845,17 @@ static const struct platform_desc ehl_desc = {
> BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \
> .__runtime_defaults.fbc_mask = BIT(INTEL_FBC_A)
>
> +static const u16 tgl_uy_ids[] = {
> + INTEL_TGL_GT2_IDS(ID),
> + 0
> +};
> +
> static const struct platform_desc tgl_desc = {
> PLATFORM(TIGERLAKE),
> + .subplatforms = (const struct subplatform_desc[]) {
> + { INTEL_DISPLAY_TIGERLAKE_UY, "UY", tgl_uy_ids },
> + {},
> + },
> .info = &(const struct intel_display_device_info) {
> XE_D_DISPLAY,
>
> @@ -762,8 +894,17 @@ static const struct platform_desc rkl_desc = {
> },
> };
>
> +static const u16 adls_rpls_ids[] = {
> + INTEL_RPLS_IDS(ID),
> + 0
> +};
> +
> static const struct platform_desc adl_s_desc = {
> PLATFORM(ALDERLAKE_S),
> + .subplatforms = (const struct subplatform_desc[]) {
> + { INTEL_DISPLAY_ALDERLAKE_S_RAPTORLAKE_S, "RPL-S", adls_rpls_ids },
> + {},
> + },
> .info = &(const struct intel_display_device_info) {
> XE_D_DISPLAY,
> .has_hti = 1,
> @@ -830,8 +971,29 @@ static const struct intel_display_device_info xe_lpd_display = {
> BIT(PORT_TC1) | BIT(PORT_TC2) | BIT(PORT_TC3) | BIT(PORT_TC4),
> };
>
> +static const u16 adlp_adln_ids[] = {
> + INTEL_ADLN_IDS(ID),
> + 0
> +};
> +
> +static const u16 adlp_rplu_ids[] = {
> + INTEL_RPLU_IDS(ID),
> + 0
> +};
> +
> +static const u16 adlp_rplp_ids[] = {
> + INTEL_RPLP_IDS(ID),
> + 0
> +};
> +
> static const struct platform_desc adl_p_desc = {
> PLATFORM(ALDERLAKE_P),
> + .subplatforms = (const struct subplatform_desc[]) {
> + { INTEL_DISPLAY_ALDERLAKE_P_ALDERLAKE_N, "ADL-N", adlp_adln_ids },
> + { INTEL_DISPLAY_ALDERLAKE_P_RAPTORLAKE_U, "RPL-U", adlp_rplu_ids },
> + { INTEL_DISPLAY_ALDERLAKE_P_RAPTORLAKE_P, "RPL-P", adlp_rplp_ids },
> + {},
> + },
> .info = &xe_lpd_display,
> };
>
> @@ -846,8 +1008,29 @@ static const struct intel_display_device_info xe_hpd_display = {
> BIT(PORT_TC1),
> };
>
> +static const u16 dg2_g10_ids[] = {
> + INTEL_DG2_G10_IDS(ID),
> + 0
> +};
> +
> +static const u16 dg2_g11_ids[] = {
> + INTEL_DG2_G11_IDS(ID),
> + 0
> +};
> +
> +static const u16 dg2_g12_ids[] = {
> + INTEL_DG2_G12_IDS(ID),
> + 0
> +};
> +
> static const struct platform_desc dg2_desc = {
> PLATFORM(DG2),
> + .subplatforms = (const struct subplatform_desc[]) {
> + { INTEL_DISPLAY_DG2_G10, "G10", dg2_g10_ids },
> + { INTEL_DISPLAY_DG2_G11, "G11", dg2_g11_ids },
> + { INTEL_DISPLAY_DG2_G12, "G12", dg2_g12_ids },
> + {},
> + },
> .info = &xe_hpd_display,
> };
>
> @@ -1059,12 +1242,27 @@ static const struct platform_desc *find_platform_desc(struct pci_dev *pdev)
> return NULL;
> }
>
> +static const struct subplatform_desc *
> +find_subplatform_desc(struct pci_dev *pdev, const struct platform_desc *desc)
> +{
> + const struct subplatform_desc *sp;
> + const u16 *id;
> +
> + for (sp = desc->subplatforms; sp && sp->subplatform; sp++)
> + for (id = sp->pciidlist; *id; id++)
> + if (*id == pdev->device)
> + return sp;
> +
> + return NULL;
> +}
> +
> void intel_display_device_probe(struct drm_i915_private *i915)
> {
> struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
> const struct intel_display_device_info *info;
> struct intel_display_ip_ver ip_ver = {};
> const struct platform_desc *desc;
> + const struct subplatform_desc *subdesc;
>
> /* Add drm device backpointer as early as possible. */
> i915->display.drm = &i915->drm;
> @@ -1098,6 +1296,12 @@ void intel_display_device_probe(struct drm_i915_private *i915)
> drm_WARN_ON(&i915->drm, !desc->platform || !desc->name);
> DISPLAY_RUNTIME_INFO(i915)->platform = desc->platform;
>
> + subdesc = find_subplatform_desc(pdev, desc);
> + if (subdesc) {
> + drm_WARN_ON(&i915->drm, !subdesc->subplatform || !subdesc->name);
> + DISPLAY_RUNTIME_INFO(i915)->subplatform = subdesc->subplatform;
> + }
> +
> if (ip_ver.ver || ip_ver.rel || ip_ver.step)
> DISPLAY_RUNTIME_INFO(i915)->ip = ip_ver;
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_device.h b/drivers/gpu/drm/i915/display/intel_display_device.h
> index 8accd680a61e..e1d9947394dc 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_device.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_device.h
> @@ -70,6 +70,31 @@ enum intel_display_platform {
> INTEL_DISPLAY_LUNARLAKE,
> };
>
> +enum intel_display_subplatform {
> + INTEL_DISPLAY_SUBPLATFORM_UNINITIALIZED = 0,
> + INTEL_DISPLAY_HASWELL_ULT,
> + INTEL_DISPLAY_HASWELL_ULX,
> + INTEL_DISPLAY_BROADWELL_ULT,
> + INTEL_DISPLAY_BROADWELL_ULX,
> + INTEL_DISPLAY_SKYLAKE_ULT,
> + INTEL_DISPLAY_SKYLAKE_ULX,
> + INTEL_DISPLAY_KABYLAKE_ULT,
> + INTEL_DISPLAY_KABYLAKE_ULX,
> + INTEL_DISPLAY_COFFEELAKE_ULT,
> + INTEL_DISPLAY_COFFEELAKE_ULX,
> + INTEL_DISPLAY_COMETLAKE_ULT,
> + INTEL_DISPLAY_COMETLAKE_ULX,
> + INTEL_DISPLAY_ICELAKE_PORT_F,
> + INTEL_DISPLAY_TIGERLAKE_UY,
> + INTEL_DISPLAY_ALDERLAKE_S_RAPTORLAKE_S,
> + INTEL_DISPLAY_ALDERLAKE_P_ALDERLAKE_N,
> + INTEL_DISPLAY_ALDERLAKE_P_RAPTORLAKE_P,
> + INTEL_DISPLAY_ALDERLAKE_P_RAPTORLAKE_U,
> + INTEL_DISPLAY_DG2_G10,
> + INTEL_DISPLAY_DG2_G11,
> + INTEL_DISPLAY_DG2_G12,
> +};
> +
> #define DEV_INFO_DISPLAY_FOR_EACH_FLAG(func) \
> /* Keep in alphabetical order */ \
> func(cursor_needs_physical); \
> @@ -168,6 +193,7 @@ enum intel_display_platform {
>
> struct intel_display_runtime_info {
> enum intel_display_platform platform;
> + enum intel_display_subplatform subplatform;
>
> struct intel_display_ip_ver {
> u16 ver;
> --
> 2.39.2
>
More information about the Intel-xe
mailing list