Message ID | 20210722054338.12891-7-jose.souza@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/10] drm/i915/bios: Allow DSI ports to be parsed by parse_ddi_port() | expand |
On Wed, Jul 21, 2021 at 10:43:35PM -0700, José Roberto de Souza wrote: > Continuing the conversion from single integrated VBT data to two, now > handling DSI data. > > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > Cc: Jani Nikula <jani.nikula@intel.com> > Signed-off-by: José Roberto de Souza <jose.souza@intel.com> Reviewed-by: Matt Atwood <matthew.s.atwood@intel.com> > --- > drivers/gpu/drm/i915/display/icl_dsi.c | 12 +- > drivers/gpu/drm/i915/display/intel_bios.c | 163 ++++++++++--------- > drivers/gpu/drm/i915/display/intel_bios.h | 1 + > drivers/gpu/drm/i915/display/intel_dsi.c | 8 +- > drivers/gpu/drm/i915/display/intel_dsi_vbt.c | 58 ++++--- > drivers/gpu/drm/i915/display/intel_panel.c | 3 +- > drivers/gpu/drm/i915/display/vlv_dsi.c | 14 +- > drivers/gpu/drm/i915/i915_drv.h | 30 ++-- > 8 files changed, 161 insertions(+), 128 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c > index 43ec7fcd3f5d2..0a8360d196cc7 100644 > --- a/drivers/gpu/drm/i915/display/icl_dsi.c > +++ b/drivers/gpu/drm/i915/display/icl_dsi.c > @@ -1846,7 +1846,8 @@ static void icl_dphy_param_init(struct intel_dsi *intel_dsi) > { > struct drm_device *dev = intel_dsi->base.base.dev; > struct drm_i915_private *dev_priv = to_i915(dev); > - struct mipi_config *mipi_config = dev_priv->vbt.dsi.config; > + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); > + struct mipi_config *mipi_config = vbt_dsi_info->config; > u32 tlpx_ns; > u32 prepare_cnt, exit_zero_cnt, clk_zero_cnt, trail_cnt; > u32 ths_prepare_ns, tclk_trail_ns; > @@ -1977,6 +1978,7 @@ void icl_dsi_init(struct drm_i915_private *dev_priv) > struct intel_connector *intel_connector; > struct drm_connector *connector; > struct drm_display_mode *fixed_mode; > + const struct vbt_dsi_info *vbt_dsi_info; > enum port port; > > if (!intel_bios_is_dsi_present(dev_priv, &port)) > @@ -2044,13 +2046,15 @@ void icl_dsi_init(struct drm_i915_private *dev_priv) > intel_panel_init(&intel_connector->panel, fixed_mode, NULL); > intel_panel_setup_backlight(connector, INVALID_PIPE); > > - if (dev_priv->vbt.dsi.config->dual_link) > + vbt_dsi_info = intel_bios_dsi_info(encoder); > + > + if (vbt_dsi_info->config->dual_link) > intel_dsi->ports = BIT(PORT_A) | BIT(PORT_B); > else > intel_dsi->ports = BIT(port); > > - intel_dsi->dcs_backlight_ports = dev_priv->vbt.dsi.bl_ports; > - intel_dsi->dcs_cabc_ports = dev_priv->vbt.dsi.cabc_ports; > + intel_dsi->dcs_backlight_ports = vbt_dsi_info->bl_ports; > + intel_dsi->dcs_cabc_ports = vbt_dsi_info->cabc_ports; > > for_each_dsi_port(port, intel_dsi->ports) { > struct intel_dsi_host *host; > diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c > index de690e96de723..a1a1cc0c462fd 100644 > --- a/drivers/gpu/drm/i915/display/intel_bios.c > +++ b/drivers/gpu/drm/i915/display/intel_bios.c > @@ -1022,55 +1022,56 @@ parse_psr(struct drm_i915_private *i915, const struct bdb_header *bdb, > } > > static void parse_dsi_backlight_ports(struct drm_i915_private *i915, > - u16 version, enum port port) > + u16 version, enum port port, > + struct ddi_vbt_port_info *info) > { > - if (!i915->vbt.dsi.config->dual_link || version < 197) { > - i915->vbt.dsi.bl_ports = BIT(port); > - if (i915->vbt.dsi.config->cabc_supported) > - i915->vbt.dsi.cabc_ports = BIT(port); > + if (!info->dsi.config->dual_link || version < 197) { > + info->dsi.bl_ports = BIT(port); > + if (info->dsi.config->cabc_supported) > + info->dsi.cabc_ports = BIT(port); > > return; > } > > - switch (i915->vbt.dsi.config->dl_dcs_backlight_ports) { > + switch (info->dsi.config->dl_dcs_backlight_ports) { > case DL_DCS_PORT_A: > - i915->vbt.dsi.bl_ports = BIT(PORT_A); > + info->dsi.bl_ports = BIT(PORT_A); > break; > case DL_DCS_PORT_C: > - i915->vbt.dsi.bl_ports = BIT(PORT_C); > + info->dsi.bl_ports = BIT(PORT_C); > break; > default: > case DL_DCS_PORT_A_AND_C: > - i915->vbt.dsi.bl_ports = BIT(PORT_A) | BIT(PORT_C); > + info->dsi.bl_ports = BIT(PORT_A) | BIT(PORT_C); > break; > } > > - if (!i915->vbt.dsi.config->cabc_supported) > + if (!info->dsi.config->cabc_supported) > return; > > - switch (i915->vbt.dsi.config->dl_dcs_cabc_ports) { > + switch (info->dsi.config->dl_dcs_cabc_ports) { > case DL_DCS_PORT_A: > - i915->vbt.dsi.cabc_ports = BIT(PORT_A); > + info->dsi.cabc_ports = BIT(PORT_A); > break; > case DL_DCS_PORT_C: > - i915->vbt.dsi.cabc_ports = BIT(PORT_C); > + info->dsi.cabc_ports = BIT(PORT_C); > break; > default: > case DL_DCS_PORT_A_AND_C: > - i915->vbt.dsi.cabc_ports = > - BIT(PORT_A) | BIT(PORT_C); > + info->dsi.cabc_ports = BIT(PORT_A) | BIT(PORT_C); > break; > } > } > > static void > parse_mipi_config(struct drm_i915_private *i915, > - const struct bdb_header *bdb) > + const struct bdb_header *bdb, > + struct ddi_vbt_port_info *info, > + int panel_index) > { > const struct bdb_mipi_config *start; > const struct mipi_config *config; > const struct mipi_pps_data *pps; > - int panel_type = i915->vbt.panel_type; > enum port port; > > /* parse MIPI blocks only if LFP type is MIPI */ > @@ -1078,14 +1079,14 @@ parse_mipi_config(struct drm_i915_private *i915, > return; > > /* Initialize this to undefined indicating no generic MIPI support */ > - i915->vbt.dsi.panel_id = MIPI_DSI_UNDEFINED_PANEL_ID; > + info->dsi.panel_id = MIPI_DSI_UNDEFINED_PANEL_ID; > > /* Block #40 is already parsed and panel_fixed_mode is > * stored in i915->lfp_lvds_vbt_mode > * resuse this when needed > */ > > - /* Parse #52 for panel index used from panel_type already > + /* Parse #52 for panel index used from panel_index already > * parsed > */ > start = find_section(bdb, BDB_MIPI_CONFIG); > @@ -1095,27 +1096,27 @@ parse_mipi_config(struct drm_i915_private *i915, > } > > drm_dbg(&i915->drm, "Found MIPI Config block, panel index = %d\n", > - panel_type); > + panel_index); > > /* > * get hold of the correct configuration block and pps data as per > - * the panel_type as index > + * the panel_index as index > */ > - config = &start->config[panel_type]; > - pps = &start->pps[panel_type]; > + config = &start->config[panel_index]; > + pps = &start->pps[panel_index]; > > /* store as of now full data. Trim when we realise all is not needed */ > - i915->vbt.dsi.config = kmemdup(config, sizeof(struct mipi_config), GFP_KERNEL); > - if (!i915->vbt.dsi.config) > + info->dsi.config = kmemdup(config, sizeof(struct mipi_config), GFP_KERNEL); > + if (!info->dsi.config) > return; > > - i915->vbt.dsi.pps = kmemdup(pps, sizeof(struct mipi_pps_data), GFP_KERNEL); > - if (!i915->vbt.dsi.pps) { > - kfree(i915->vbt.dsi.config); > + info->dsi.pps = kmemdup(pps, sizeof(struct mipi_pps_data), GFP_KERNEL); > + if (!info->dsi.pps) { > + kfree(info->dsi.config); > return; > } > > - parse_dsi_backlight_ports(i915, bdb->version, port); > + parse_dsi_backlight_ports(i915, bdb->version, port, info); > > /* FIXME is the 90 vs. 270 correct? */ > switch (config->rotation) { > @@ -1124,25 +1125,25 @@ parse_mipi_config(struct drm_i915_private *i915, > * Most (all?) VBTs claim 0 degrees despite having > * an upside down panel, thus we do not trust this. > */ > - i915->vbt.dsi.orientation = > + info->dsi.orientation = > DRM_MODE_PANEL_ORIENTATION_UNKNOWN; > break; > case ENABLE_ROTATION_90: > - i915->vbt.dsi.orientation = > + info->dsi.orientation = > DRM_MODE_PANEL_ORIENTATION_RIGHT_UP; > break; > case ENABLE_ROTATION_180: > - i915->vbt.dsi.orientation = > + info->dsi.orientation = > DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP; > break; > case ENABLE_ROTATION_270: > - i915->vbt.dsi.orientation = > + info->dsi.orientation = > DRM_MODE_PANEL_ORIENTATION_LEFT_UP; > break; > } > > /* We have mandatory mipi config blocks. Initialize as generic panel */ > - i915->vbt.dsi.panel_id = MIPI_DSI_GENERIC_PANEL_ID; > + info->dsi.panel_id = MIPI_DSI_GENERIC_PANEL_ID; > } > > /* Find the sequence block and size for the given panel. */ > @@ -1305,13 +1306,14 @@ static int goto_next_sequence_v3(const u8 *data, int index, int total) > * Get len of pre-fixed deassert fragment from a v1 init OTP sequence, > * skip all delay + gpio operands and stop at the first DSI packet op. > */ > -static int get_init_otp_deassert_fragment_len(struct drm_i915_private *i915) > +static int get_init_otp_deassert_fragment_len(struct drm_i915_private *i915, > + struct ddi_vbt_port_info *info) > { > - const u8 *data = i915->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP]; > + const u8 *data = info->dsi.sequence[MIPI_SEQ_INIT_OTP]; > int index, len; > > if (drm_WARN_ON(&i915->drm, > - !data || i915->vbt.dsi.seq_version != 1)) > + !data || info->dsi.seq_version != 1)) > return 0; > > /* index = 1 to skip sequence byte */ > @@ -1339,7 +1341,8 @@ static int get_init_otp_deassert_fragment_len(struct drm_i915_private *i915) > * these devices we split the init OTP sequence into a deassert sequence and > * the actual init OTP part. > */ > -static void fixup_mipi_sequences(struct drm_i915_private *i915) > +static void fixup_mipi_sequences(struct drm_i915_private *i915, > + struct ddi_vbt_port_info *info) > { > u8 *init_otp; > int len; > @@ -1349,18 +1352,18 @@ static void fixup_mipi_sequences(struct drm_i915_private *i915) > return; > > /* Limit this to v1 vid-mode sequences */ > - if (i915->vbt.dsi.config->is_cmd_mode || > - i915->vbt.dsi.seq_version != 1) > + if (info->dsi.config->is_cmd_mode || > + info->dsi.seq_version != 1) > return; > > /* Only do this if there are otp and assert seqs and no deassert seq */ > - if (!i915->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP] || > - !i915->vbt.dsi.sequence[MIPI_SEQ_ASSERT_RESET] || > - i915->vbt.dsi.sequence[MIPI_SEQ_DEASSERT_RESET]) > + if (!info->dsi.sequence[MIPI_SEQ_INIT_OTP] || > + !info->dsi.sequence[MIPI_SEQ_ASSERT_RESET] || > + info->dsi.sequence[MIPI_SEQ_DEASSERT_RESET]) > return; > > /* The deassert-sequence ends at the first DSI packet */ > - len = get_init_otp_deassert_fragment_len(i915); > + len = get_init_otp_deassert_fragment_len(i915, info); > if (!len) > return; > > @@ -1368,26 +1371,27 @@ static void fixup_mipi_sequences(struct drm_i915_private *i915) > "Using init OTP fragment to deassert reset\n"); > > /* Copy the fragment, update seq byte and terminate it */ > - init_otp = (u8 *)i915->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP]; > - i915->vbt.dsi.deassert_seq = kmemdup(init_otp, len + 1, GFP_KERNEL); > - if (!i915->vbt.dsi.deassert_seq) > + init_otp = (u8 *)info->dsi.sequence[MIPI_SEQ_INIT_OTP]; > + info->dsi.deassert_seq = kmemdup(init_otp, len + 1, GFP_KERNEL); > + if (!info->dsi.deassert_seq) > return; > - i915->vbt.dsi.deassert_seq[0] = MIPI_SEQ_DEASSERT_RESET; > - i915->vbt.dsi.deassert_seq[len] = MIPI_SEQ_ELEM_END; > + info->dsi.deassert_seq[0] = MIPI_SEQ_DEASSERT_RESET; > + info->dsi.deassert_seq[len] = MIPI_SEQ_ELEM_END; > /* Use the copy for deassert */ > - i915->vbt.dsi.sequence[MIPI_SEQ_DEASSERT_RESET] = > - i915->vbt.dsi.deassert_seq; > + info->dsi.sequence[MIPI_SEQ_DEASSERT_RESET] = > + info->dsi.deassert_seq; > /* Replace the last byte of the fragment with init OTP seq byte */ > init_otp[len - 1] = MIPI_SEQ_INIT_OTP; > /* And make MIPI_MIPI_SEQ_INIT_OTP point to it */ > - i915->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP] = init_otp + len - 1; > + info->dsi.sequence[MIPI_SEQ_INIT_OTP] = init_otp + len - 1; > } > > static void > parse_mipi_sequence(struct drm_i915_private *i915, > - const struct bdb_header *bdb) > + const struct bdb_header *bdb, > + struct ddi_vbt_port_info *info, > + int panel_index) > { > - int panel_type = i915->vbt.panel_type; > const struct bdb_mipi_sequence *sequence; > const u8 *seq_data; > u32 seq_size; > @@ -1395,7 +1399,7 @@ parse_mipi_sequence(struct drm_i915_private *i915, > int index = 0; > > /* Only our generic panel driver uses the sequence block. */ > - if (i915->vbt.dsi.panel_id != MIPI_DSI_GENERIC_PANEL_ID) > + if (info->dsi.panel_id != MIPI_DSI_GENERIC_PANEL_ID) > return; > > sequence = find_section(bdb, BDB_MIPI_SEQUENCE); > @@ -1416,7 +1420,7 @@ parse_mipi_sequence(struct drm_i915_private *i915, > drm_dbg(&i915->drm, "Found MIPI sequence block v%u\n", > sequence->version); > > - seq_data = find_panel_sequence_block(sequence, panel_type, &seq_size); > + seq_data = find_panel_sequence_block(sequence, panel_index, &seq_size); > if (!seq_data) > return; > > @@ -1441,7 +1445,7 @@ parse_mipi_sequence(struct drm_i915_private *i915, > drm_dbg_kms(&i915->drm, > "Unsupported sequence %u\n", seq_id); > > - i915->vbt.dsi.sequence[seq_id] = data + index; > + info->dsi.sequence[seq_id] = data + index; > > if (sequence->version >= 3) > index = goto_next_sequence_v3(data, index, seq_size); > @@ -1454,18 +1458,18 @@ parse_mipi_sequence(struct drm_i915_private *i915, > } > } > > - i915->vbt.dsi.data = data; > - i915->vbt.dsi.size = seq_size; > - i915->vbt.dsi.seq_version = sequence->version; > + info->dsi.data = data; > + info->dsi.size = seq_size; > + info->dsi.seq_version = sequence->version; > > - fixup_mipi_sequences(i915); > + fixup_mipi_sequences(i915, info); > > drm_dbg(&i915->drm, "MIPI related VBT parsing complete\n"); > return; > > err: > kfree(data); > - memset(i915->vbt.dsi.sequence, 0, sizeof(i915->vbt.dsi.sequence)); > + memset(info->dsi.sequence, 0, sizeof(info->dsi.sequence)); > } > > static void > @@ -1990,6 +1994,8 @@ static void parse_integrated_panel(struct drm_i915_private *i915, > parse_lfp_backlight(i915, bdb, info, panel_index); > parse_edp(i915, bdb, info, panel_index); > parse_psr(i915, bdb, info, panel_index); > + parse_mipi_config(i915, bdb, info, panel_index); > + parse_mipi_sequence(i915, bdb, info, panel_index); > } > > static void parse_ddi_port(struct drm_i915_private *i915, > @@ -2486,8 +2492,6 @@ void intel_bios_init(struct drm_i915_private *i915) > parse_panel_type(i915, bdb); > parse_sdvo_panel_data(i915, bdb); > parse_driver_features(i915, bdb); > - parse_mipi_config(i915, bdb); > - parse_mipi_sequence(i915, bdb); > > /* Depends on child device list */ > parse_compression_parameters(i915, bdb); > @@ -2522,20 +2526,23 @@ void intel_bios_driver_remove(struct drm_i915_private *i915) > } > > for (i = 0; i < I915_MAX_PORTS; i++) { > - kfree(i915->vbt.ddi_port_info[i].lfp_lvds_vbt_mode); > - i915->vbt.ddi_port_info[i].lfp_lvds_vbt_mode = NULL; > + struct ddi_vbt_port_info *info = &i915->vbt.ddi_port_info[i]; > + > + kfree(info->lfp_lvds_vbt_mode); > + info->lfp_lvds_vbt_mode = NULL; > + > + kfree(info->dsi.data); > + info->dsi.data = NULL; > + kfree(info->dsi.pps); > + info->dsi.pps = NULL; > + kfree(info->dsi.config); > + info->dsi.config = NULL; > + kfree(info->dsi.deassert_seq); > + info->dsi.deassert_seq = NULL; > } > > kfree(i915->vbt.sdvo_lvds_vbt_mode); > i915->vbt.sdvo_lvds_vbt_mode = NULL; > - kfree(i915->vbt.dsi.data); > - i915->vbt.dsi.data = NULL; > - kfree(i915->vbt.dsi.pps); > - i915->vbt.dsi.pps = NULL; > - kfree(i915->vbt.dsi.config); > - i915->vbt.dsi.config = NULL; > - kfree(i915->vbt.dsi.deassert_seq); > - i915->vbt.dsi.deassert_seq = NULL; > } > > /** > @@ -3149,3 +3156,11 @@ intel_bios_psr_info(struct intel_dp *intel_dp) > > return &i915->vbt.ddi_port_info[encoder->port].psr; > } > + > +const struct vbt_dsi_info * > +intel_bios_dsi_info(struct intel_encoder *encoder) > +{ > + struct drm_i915_private *i915 = to_i915(encoder->base.dev); > + > + return &i915->vbt.ddi_port_info[encoder->port].dsi; > +} > diff --git a/drivers/gpu/drm/i915/display/intel_bios.h b/drivers/gpu/drm/i915/display/intel_bios.h > index c701871d9a74d..6e953a89c84cb 100644 > --- a/drivers/gpu/drm/i915/display/intel_bios.h > +++ b/drivers/gpu/drm/i915/display/intel_bios.h > @@ -272,5 +272,6 @@ const struct drm_display_mode *intel_bios_lfp_lvds_info(struct intel_encoder *en > const struct vbt_backlight_info *intel_bios_backlight_info(struct intel_encoder *encoder); > struct vbt_edp_info *intel_bios_edp_info(struct intel_encoder *encoder); > const struct vbt_psr_info *intel_bios_psr_info(struct intel_dp *intel_dp); > +const struct vbt_dsi_info *intel_bios_dsi_info(struct intel_encoder *encoder); > > #endif /* _INTEL_BIOS_H_ */ > diff --git a/drivers/gpu/drm/i915/display/intel_dsi.c b/drivers/gpu/drm/i915/display/intel_dsi.c > index f453ceb8d1494..2cd819a7f9dd6 100644 > --- a/drivers/gpu/drm/i915/display/intel_dsi.c > +++ b/drivers/gpu/drm/i915/display/intel_dsi.c > @@ -115,14 +115,10 @@ struct intel_dsi_host *intel_dsi_host_init(struct intel_dsi *intel_dsi, > enum drm_panel_orientation > intel_dsi_get_panel_orientation(struct intel_connector *connector) > { > - struct drm_i915_private *dev_priv = to_i915(connector->base.dev); > + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(connector->encoder); > enum drm_panel_orientation orientation; > > - orientation = dev_priv->vbt.dsi.orientation; > - if (orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) > - return orientation; > - > - orientation = dev_priv->vbt.orientation; > + orientation = vbt_dsi_info->orientation; > if (orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) > return orientation; > > diff --git a/drivers/gpu/drm/i915/display/intel_dsi_vbt.c b/drivers/gpu/drm/i915/display/intel_dsi_vbt.c > index 2218de0773bf0..24de775ee7b30 100644 > --- a/drivers/gpu/drm/i915/display/intel_dsi_vbt.c > +++ b/drivers/gpu/drm/i915/display/intel_dsi_vbt.c > @@ -225,9 +225,11 @@ static const u8 *mipi_exec_delay(struct intel_dsi *intel_dsi, const u8 *data) > return data; > } > > -static void vlv_exec_gpio(struct drm_i915_private *dev_priv, > +static void vlv_exec_gpio(struct intel_dsi *intel_dsi, > u8 gpio_source, u8 gpio_index, bool value) > { > + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); > + struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev); > struct gpio_map *map; > u16 pconf0, padval; > u32 tmp; > @@ -241,7 +243,7 @@ static void vlv_exec_gpio(struct drm_i915_private *dev_priv, > > map = &vlv_gpio_table[gpio_index]; > > - if (dev_priv->vbt.dsi.seq_version >= 3) { > + if (vbt_dsi_info->seq_version >= 3) { > /* XXX: this assumes vlv_gpio_table only has NC GPIOs. */ > port = IOSF_PORT_GPIO_NC; > } else { > @@ -272,14 +274,16 @@ static void vlv_exec_gpio(struct drm_i915_private *dev_priv, > vlv_iosf_sb_put(dev_priv, BIT(VLV_IOSF_SB_GPIO)); > } > > -static void chv_exec_gpio(struct drm_i915_private *dev_priv, > +static void chv_exec_gpio(struct intel_dsi *intel_dsi, > u8 gpio_source, u8 gpio_index, bool value) > { > + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); > + struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev); > u16 cfg0, cfg1; > u16 family_num; > u8 port; > > - if (dev_priv->vbt.dsi.seq_version >= 3) { > + if (vbt_dsi_info->seq_version >= 3) { > if (gpio_index >= CHV_GPIO_IDX_START_SE) { > /* XXX: it's unclear whether 255->57 is part of SE. */ > gpio_index -= CHV_GPIO_IDX_START_SE; > @@ -325,9 +329,10 @@ static void chv_exec_gpio(struct drm_i915_private *dev_priv, > vlv_iosf_sb_put(dev_priv, BIT(VLV_IOSF_SB_GPIO)); > } > > -static void bxt_exec_gpio(struct drm_i915_private *dev_priv, > +static void bxt_exec_gpio(struct intel_dsi *intel_dsi, > u8 gpio_source, u8 gpio_index, bool value) > { > + struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev); > /* XXX: this table is a quick ugly hack. */ > static struct gpio_desc *bxt_gpio_table[U8_MAX + 1]; > struct gpio_desc *gpio_desc = bxt_gpio_table[gpio_index]; > @@ -351,14 +356,17 @@ static void bxt_exec_gpio(struct drm_i915_private *dev_priv, > gpiod_set_value(gpio_desc, value); > } > > -static void icl_exec_gpio(struct drm_i915_private *dev_priv, > +static void icl_exec_gpio(struct intel_dsi *intel_dsi, > u8 gpio_source, u8 gpio_index, bool value) > { > - drm_dbg_kms(&dev_priv->drm, "Skipping ICL GPIO element execution\n"); > + struct drm_device *drm = intel_dsi->base.base.dev; > + > + drm_dbg_kms(drm, "Skipping ICL GPIO element execution\n"); > } > > static const u8 *mipi_exec_gpio(struct intel_dsi *intel_dsi, const u8 *data) > { > + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); > struct drm_device *dev = intel_dsi->base.base.dev; > struct drm_i915_private *dev_priv = to_i915(dev); > u8 gpio_source, gpio_index = 0, gpio_number; > @@ -366,13 +374,13 @@ static const u8 *mipi_exec_gpio(struct intel_dsi *intel_dsi, const u8 *data) > > drm_dbg_kms(&dev_priv->drm, "\n"); > > - if (dev_priv->vbt.dsi.seq_version >= 3) > + if (vbt_dsi_info->seq_version >= 3) > gpio_index = *data++; > > gpio_number = *data++; > > /* gpio source in sequence v2 only */ > - if (dev_priv->vbt.dsi.seq_version == 2) > + if (vbt_dsi_info->seq_version == 2) > gpio_source = (*data >> 1) & 3; > else > gpio_source = 0; > @@ -381,13 +389,13 @@ static const u8 *mipi_exec_gpio(struct intel_dsi *intel_dsi, const u8 *data) > value = *data++ & 1; > > if (DISPLAY_VER(dev_priv) >= 11) > - icl_exec_gpio(dev_priv, gpio_source, gpio_index, value); > + icl_exec_gpio(intel_dsi, gpio_source, gpio_index, value); > else if (IS_VALLEYVIEW(dev_priv)) > - vlv_exec_gpio(dev_priv, gpio_source, gpio_number, value); > + vlv_exec_gpio(intel_dsi, gpio_source, gpio_number, value); > else if (IS_CHERRYVIEW(dev_priv)) > - chv_exec_gpio(dev_priv, gpio_source, gpio_number, value); > + chv_exec_gpio(intel_dsi, gpio_source, gpio_number, value); > else > - bxt_exec_gpio(dev_priv, gpio_source, gpio_index, value); > + bxt_exec_gpio(intel_dsi, gpio_source, gpio_index, value); > > return data; > } > @@ -577,15 +585,16 @@ static const char *sequence_name(enum mipi_seq seq_id) > static void intel_dsi_vbt_exec(struct intel_dsi *intel_dsi, > enum mipi_seq seq_id) > { > + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); > struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev); > const u8 *data; > fn_mipi_elem_exec mipi_elem_exec; > > if (drm_WARN_ON(&dev_priv->drm, > - seq_id >= ARRAY_SIZE(dev_priv->vbt.dsi.sequence))) > + seq_id >= ARRAY_SIZE(vbt_dsi_info->sequence))) > return; > > - data = dev_priv->vbt.dsi.sequence[seq_id]; > + data = vbt_dsi_info->sequence[seq_id]; > if (!data) > return; > > @@ -598,7 +607,7 @@ static void intel_dsi_vbt_exec(struct intel_dsi *intel_dsi, > data++; > > /* Skip Size of Sequence. */ > - if (dev_priv->vbt.dsi.seq_version >= 3) > + if (vbt_dsi_info->seq_version >= 3) > data += 4; > > while (1) { > @@ -614,7 +623,7 @@ static void intel_dsi_vbt_exec(struct intel_dsi *intel_dsi, > mipi_elem_exec = NULL; > > /* Size of Operation. */ > - if (dev_priv->vbt.dsi.seq_version >= 3) > + if (vbt_dsi_info->seq_version >= 3) > operation_size = *data++; > > if (mipi_elem_exec) { > @@ -662,10 +671,10 @@ void intel_dsi_vbt_exec_sequence(struct intel_dsi *intel_dsi, > > void intel_dsi_msleep(struct intel_dsi *intel_dsi, int msec) > { > - struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev); > + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); > > /* For v3 VBTs in vid-mode the delays are part of the VBT sequences */ > - if (is_vid_mode(intel_dsi) && dev_priv->vbt.dsi.seq_version >= 3) > + if (is_vid_mode(intel_dsi) && vbt_dsi_info->seq_version >= 3) > return; > > msleep(msec); > @@ -727,8 +736,9 @@ bool intel_dsi_vbt_init(struct intel_dsi *intel_dsi, u16 panel_id) > { > struct drm_device *dev = intel_dsi->base.base.dev; > struct drm_i915_private *dev_priv = to_i915(dev); > - struct mipi_config *mipi_config = dev_priv->vbt.dsi.config; > - struct mipi_pps_data *pps = dev_priv->vbt.dsi.pps; > + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); > + struct mipi_config *mipi_config = vbt_dsi_info->config; > + struct mipi_pps_data *pps = vbt_dsi_info->pps; > const struct drm_display_mode *mode = intel_bios_lfp_lvds_info(&intel_dsi->base); > u16 burst_mode_ratio; > enum port port; > @@ -870,7 +880,8 @@ void intel_dsi_vbt_gpio_init(struct intel_dsi *intel_dsi, bool panel_is_on) > { > struct drm_device *dev = intel_dsi->base.base.dev; > struct drm_i915_private *dev_priv = to_i915(dev); > - struct mipi_config *mipi_config = dev_priv->vbt.dsi.config; > + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); > + struct mipi_config *mipi_config = vbt_dsi_info->config; > enum gpiod_flags flags = panel_is_on ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW; > bool want_backlight_gpio = false; > bool want_panel_gpio = false; > @@ -925,7 +936,8 @@ void intel_dsi_vbt_gpio_cleanup(struct intel_dsi *intel_dsi) > { > struct drm_device *dev = intel_dsi->base.base.dev; > struct drm_i915_private *dev_priv = to_i915(dev); > - struct mipi_config *mipi_config = dev_priv->vbt.dsi.config; > + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); > + struct mipi_config *mipi_config = vbt_dsi_info->config; > > if (intel_dsi->gpio_panel) { > gpiod_put(intel_dsi->gpio_panel); > diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c > index 9c892476d8621..92d93ddf28140 100644 > --- a/drivers/gpu/drm/i915/display/intel_panel.c > +++ b/drivers/gpu/drm/i915/display/intel_panel.c > @@ -1924,6 +1924,7 @@ cnp_setup_backlight(struct intel_connector *connector, enum pipe unused) > static int ext_pwm_setup_backlight(struct intel_connector *connector, > enum pipe pipe) > { > + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(connector->encoder); > struct drm_device *dev = connector->base.dev; > struct drm_i915_private *dev_priv = to_i915(dev); > struct intel_panel *panel = &connector->panel; > @@ -1931,7 +1932,7 @@ static int ext_pwm_setup_backlight(struct intel_connector *connector, > u32 level; > > /* Get the right PWM chip for DSI backlight according to VBT */ > - if (dev_priv->vbt.dsi.config->pwm_blc == PPS_BLC_PMIC) { > + if (vbt_dsi_info->config->pwm_blc == PPS_BLC_PMIC) { > panel->backlight.pwm = pwm_get(dev->dev, "pwm_pmic_backlight"); > desc = "PMIC"; > } else { > diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c b/drivers/gpu/drm/i915/display/vlv_dsi.c > index 0ee4ff341e25d..0758726fa19bd 100644 > --- a/drivers/gpu/drm/i915/display/vlv_dsi.c > +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c > @@ -780,6 +780,7 @@ static void intel_dsi_pre_enable(struct intel_atomic_state *state, > const struct drm_connector_state *conn_state) > { > struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); > + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); > struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc); > struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); > enum pipe pipe = crtc->pipe; > @@ -837,7 +838,7 @@ static void intel_dsi_pre_enable(struct intel_atomic_state *state, > * the delay in that case. If there is no deassert-seq, then an > * unconditional msleep is used to give the panel time to power-on. > */ > - if (dev_priv->vbt.dsi.sequence[MIPI_SEQ_DEASSERT_RESET]) { > + if (vbt_dsi_info->sequence[MIPI_SEQ_DEASSERT_RESET]) { > intel_dsi_msleep(intel_dsi, intel_dsi->panel_on_delay); > intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DEASSERT_RESET); > } else { > @@ -1665,7 +1666,8 @@ static void vlv_dphy_param_init(struct intel_dsi *intel_dsi) > { > struct drm_device *dev = intel_dsi->base.base.dev; > struct drm_i915_private *dev_priv = to_i915(dev); > - struct mipi_config *mipi_config = dev_priv->vbt.dsi.config; > + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); > + struct mipi_config *mipi_config = vbt_dsi_info->config; > u32 tlpx_ns, extra_byte_count, tlpx_ui; > u32 ui_num, ui_den; > u32 prepare_cnt, exit_zero_cnt, clk_zero_cnt, trail_cnt; > @@ -1835,6 +1837,7 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv) > struct intel_connector *intel_connector; > struct drm_connector *connector; > struct drm_display_mode *current_mode, *fixed_mode; > + const struct vbt_dsi_info *vbt_dsi_info; > enum port port; > enum pipe pipe; > > @@ -1898,14 +1901,15 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv) > intel_encoder->pipe_mask = BIT(PIPE_B); > > intel_dsi->panel_power_off_time = ktime_get_boottime(); > + vbt_dsi_info = intel_bios_dsi_info(intel_encoder); > > - if (dev_priv->vbt.dsi.config->dual_link) > + if (vbt_dsi_info->config->dual_link) > intel_dsi->ports = BIT(PORT_A) | BIT(PORT_C); > else > intel_dsi->ports = BIT(port); > > - intel_dsi->dcs_backlight_ports = dev_priv->vbt.dsi.bl_ports; > - intel_dsi->dcs_cabc_ports = dev_priv->vbt.dsi.cabc_ports; > + intel_dsi->dcs_backlight_ports = vbt_dsi_info->bl_ports; > + intel_dsi->dcs_cabc_ports = vbt_dsi_info->cabc_ports; > > /* Create a DSI host (and a device) for each port. */ > for_each_dsi_port(port, intel_dsi->ports) { > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 233dfcf854b52..adcacb8cb248a 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -699,6 +699,21 @@ struct ddi_vbt_port_info { > int tp2_tp3_wakeup_time_us; > int psr2_tp2_tp3_wakeup_time_us; > } psr; > + > + /* MIPI DSI */ > + struct vbt_dsi_info { > + u16 panel_id; > + struct mipi_config *config; > + struct mipi_pps_data *pps; > + u16 bl_ports; > + u16 cabc_ports; > + u8 seq_version; > + u32 size; > + u8 *data; > + const u8 *sequence[MIPI_SEQ_MAX]; > + u8 *deassert_seq; /* Used by fixup_mipi_sequences() */ > + enum drm_panel_orientation orientation; > + } dsi; > }; > > struct intel_vbt_data { > @@ -719,21 +734,6 @@ struct intel_vbt_data { > unsigned int bios_lvds_val; /* initial [PCH_]LVDS reg val in VBIOS */ > enum drm_panel_orientation orientation; > > - /* MIPI DSI */ > - struct { > - u16 panel_id; > - struct mipi_config *config; > - struct mipi_pps_data *pps; > - u16 bl_ports; > - u16 cabc_ports; > - u8 seq_version; > - u32 size; > - u8 *data; > - const u8 *sequence[MIPI_SEQ_MAX]; > - u8 *deassert_seq; /* Used by fixup_mipi_sequences() */ > - enum drm_panel_orientation orientation; > - } dsi; > - > int crt_ddc_pin; > > struct list_head display_devices; > -- > 2.32.0 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c index 43ec7fcd3f5d2..0a8360d196cc7 100644 --- a/drivers/gpu/drm/i915/display/icl_dsi.c +++ b/drivers/gpu/drm/i915/display/icl_dsi.c @@ -1846,7 +1846,8 @@ static void icl_dphy_param_init(struct intel_dsi *intel_dsi) { struct drm_device *dev = intel_dsi->base.base.dev; struct drm_i915_private *dev_priv = to_i915(dev); - struct mipi_config *mipi_config = dev_priv->vbt.dsi.config; + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); + struct mipi_config *mipi_config = vbt_dsi_info->config; u32 tlpx_ns; u32 prepare_cnt, exit_zero_cnt, clk_zero_cnt, trail_cnt; u32 ths_prepare_ns, tclk_trail_ns; @@ -1977,6 +1978,7 @@ void icl_dsi_init(struct drm_i915_private *dev_priv) struct intel_connector *intel_connector; struct drm_connector *connector; struct drm_display_mode *fixed_mode; + const struct vbt_dsi_info *vbt_dsi_info; enum port port; if (!intel_bios_is_dsi_present(dev_priv, &port)) @@ -2044,13 +2046,15 @@ void icl_dsi_init(struct drm_i915_private *dev_priv) intel_panel_init(&intel_connector->panel, fixed_mode, NULL); intel_panel_setup_backlight(connector, INVALID_PIPE); - if (dev_priv->vbt.dsi.config->dual_link) + vbt_dsi_info = intel_bios_dsi_info(encoder); + + if (vbt_dsi_info->config->dual_link) intel_dsi->ports = BIT(PORT_A) | BIT(PORT_B); else intel_dsi->ports = BIT(port); - intel_dsi->dcs_backlight_ports = dev_priv->vbt.dsi.bl_ports; - intel_dsi->dcs_cabc_ports = dev_priv->vbt.dsi.cabc_ports; + intel_dsi->dcs_backlight_ports = vbt_dsi_info->bl_ports; + intel_dsi->dcs_cabc_ports = vbt_dsi_info->cabc_ports; for_each_dsi_port(port, intel_dsi->ports) { struct intel_dsi_host *host; diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c index de690e96de723..a1a1cc0c462fd 100644 --- a/drivers/gpu/drm/i915/display/intel_bios.c +++ b/drivers/gpu/drm/i915/display/intel_bios.c @@ -1022,55 +1022,56 @@ parse_psr(struct drm_i915_private *i915, const struct bdb_header *bdb, } static void parse_dsi_backlight_ports(struct drm_i915_private *i915, - u16 version, enum port port) + u16 version, enum port port, + struct ddi_vbt_port_info *info) { - if (!i915->vbt.dsi.config->dual_link || version < 197) { - i915->vbt.dsi.bl_ports = BIT(port); - if (i915->vbt.dsi.config->cabc_supported) - i915->vbt.dsi.cabc_ports = BIT(port); + if (!info->dsi.config->dual_link || version < 197) { + info->dsi.bl_ports = BIT(port); + if (info->dsi.config->cabc_supported) + info->dsi.cabc_ports = BIT(port); return; } - switch (i915->vbt.dsi.config->dl_dcs_backlight_ports) { + switch (info->dsi.config->dl_dcs_backlight_ports) { case DL_DCS_PORT_A: - i915->vbt.dsi.bl_ports = BIT(PORT_A); + info->dsi.bl_ports = BIT(PORT_A); break; case DL_DCS_PORT_C: - i915->vbt.dsi.bl_ports = BIT(PORT_C); + info->dsi.bl_ports = BIT(PORT_C); break; default: case DL_DCS_PORT_A_AND_C: - i915->vbt.dsi.bl_ports = BIT(PORT_A) | BIT(PORT_C); + info->dsi.bl_ports = BIT(PORT_A) | BIT(PORT_C); break; } - if (!i915->vbt.dsi.config->cabc_supported) + if (!info->dsi.config->cabc_supported) return; - switch (i915->vbt.dsi.config->dl_dcs_cabc_ports) { + switch (info->dsi.config->dl_dcs_cabc_ports) { case DL_DCS_PORT_A: - i915->vbt.dsi.cabc_ports = BIT(PORT_A); + info->dsi.cabc_ports = BIT(PORT_A); break; case DL_DCS_PORT_C: - i915->vbt.dsi.cabc_ports = BIT(PORT_C); + info->dsi.cabc_ports = BIT(PORT_C); break; default: case DL_DCS_PORT_A_AND_C: - i915->vbt.dsi.cabc_ports = - BIT(PORT_A) | BIT(PORT_C); + info->dsi.cabc_ports = BIT(PORT_A) | BIT(PORT_C); break; } } static void parse_mipi_config(struct drm_i915_private *i915, - const struct bdb_header *bdb) + const struct bdb_header *bdb, + struct ddi_vbt_port_info *info, + int panel_index) { const struct bdb_mipi_config *start; const struct mipi_config *config; const struct mipi_pps_data *pps; - int panel_type = i915->vbt.panel_type; enum port port; /* parse MIPI blocks only if LFP type is MIPI */ @@ -1078,14 +1079,14 @@ parse_mipi_config(struct drm_i915_private *i915, return; /* Initialize this to undefined indicating no generic MIPI support */ - i915->vbt.dsi.panel_id = MIPI_DSI_UNDEFINED_PANEL_ID; + info->dsi.panel_id = MIPI_DSI_UNDEFINED_PANEL_ID; /* Block #40 is already parsed and panel_fixed_mode is * stored in i915->lfp_lvds_vbt_mode * resuse this when needed */ - /* Parse #52 for panel index used from panel_type already + /* Parse #52 for panel index used from panel_index already * parsed */ start = find_section(bdb, BDB_MIPI_CONFIG); @@ -1095,27 +1096,27 @@ parse_mipi_config(struct drm_i915_private *i915, } drm_dbg(&i915->drm, "Found MIPI Config block, panel index = %d\n", - panel_type); + panel_index); /* * get hold of the correct configuration block and pps data as per - * the panel_type as index + * the panel_index as index */ - config = &start->config[panel_type]; - pps = &start->pps[panel_type]; + config = &start->config[panel_index]; + pps = &start->pps[panel_index]; /* store as of now full data. Trim when we realise all is not needed */ - i915->vbt.dsi.config = kmemdup(config, sizeof(struct mipi_config), GFP_KERNEL); - if (!i915->vbt.dsi.config) + info->dsi.config = kmemdup(config, sizeof(struct mipi_config), GFP_KERNEL); + if (!info->dsi.config) return; - i915->vbt.dsi.pps = kmemdup(pps, sizeof(struct mipi_pps_data), GFP_KERNEL); - if (!i915->vbt.dsi.pps) { - kfree(i915->vbt.dsi.config); + info->dsi.pps = kmemdup(pps, sizeof(struct mipi_pps_data), GFP_KERNEL); + if (!info->dsi.pps) { + kfree(info->dsi.config); return; } - parse_dsi_backlight_ports(i915, bdb->version, port); + parse_dsi_backlight_ports(i915, bdb->version, port, info); /* FIXME is the 90 vs. 270 correct? */ switch (config->rotation) { @@ -1124,25 +1125,25 @@ parse_mipi_config(struct drm_i915_private *i915, * Most (all?) VBTs claim 0 degrees despite having * an upside down panel, thus we do not trust this. */ - i915->vbt.dsi.orientation = + info->dsi.orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN; break; case ENABLE_ROTATION_90: - i915->vbt.dsi.orientation = + info->dsi.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP; break; case ENABLE_ROTATION_180: - i915->vbt.dsi.orientation = + info->dsi.orientation = DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP; break; case ENABLE_ROTATION_270: - i915->vbt.dsi.orientation = + info->dsi.orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP; break; } /* We have mandatory mipi config blocks. Initialize as generic panel */ - i915->vbt.dsi.panel_id = MIPI_DSI_GENERIC_PANEL_ID; + info->dsi.panel_id = MIPI_DSI_GENERIC_PANEL_ID; } /* Find the sequence block and size for the given panel. */ @@ -1305,13 +1306,14 @@ static int goto_next_sequence_v3(const u8 *data, int index, int total) * Get len of pre-fixed deassert fragment from a v1 init OTP sequence, * skip all delay + gpio operands and stop at the first DSI packet op. */ -static int get_init_otp_deassert_fragment_len(struct drm_i915_private *i915) +static int get_init_otp_deassert_fragment_len(struct drm_i915_private *i915, + struct ddi_vbt_port_info *info) { - const u8 *data = i915->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP]; + const u8 *data = info->dsi.sequence[MIPI_SEQ_INIT_OTP]; int index, len; if (drm_WARN_ON(&i915->drm, - !data || i915->vbt.dsi.seq_version != 1)) + !data || info->dsi.seq_version != 1)) return 0; /* index = 1 to skip sequence byte */ @@ -1339,7 +1341,8 @@ static int get_init_otp_deassert_fragment_len(struct drm_i915_private *i915) * these devices we split the init OTP sequence into a deassert sequence and * the actual init OTP part. */ -static void fixup_mipi_sequences(struct drm_i915_private *i915) +static void fixup_mipi_sequences(struct drm_i915_private *i915, + struct ddi_vbt_port_info *info) { u8 *init_otp; int len; @@ -1349,18 +1352,18 @@ static void fixup_mipi_sequences(struct drm_i915_private *i915) return; /* Limit this to v1 vid-mode sequences */ - if (i915->vbt.dsi.config->is_cmd_mode || - i915->vbt.dsi.seq_version != 1) + if (info->dsi.config->is_cmd_mode || + info->dsi.seq_version != 1) return; /* Only do this if there are otp and assert seqs and no deassert seq */ - if (!i915->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP] || - !i915->vbt.dsi.sequence[MIPI_SEQ_ASSERT_RESET] || - i915->vbt.dsi.sequence[MIPI_SEQ_DEASSERT_RESET]) + if (!info->dsi.sequence[MIPI_SEQ_INIT_OTP] || + !info->dsi.sequence[MIPI_SEQ_ASSERT_RESET] || + info->dsi.sequence[MIPI_SEQ_DEASSERT_RESET]) return; /* The deassert-sequence ends at the first DSI packet */ - len = get_init_otp_deassert_fragment_len(i915); + len = get_init_otp_deassert_fragment_len(i915, info); if (!len) return; @@ -1368,26 +1371,27 @@ static void fixup_mipi_sequences(struct drm_i915_private *i915) "Using init OTP fragment to deassert reset\n"); /* Copy the fragment, update seq byte and terminate it */ - init_otp = (u8 *)i915->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP]; - i915->vbt.dsi.deassert_seq = kmemdup(init_otp, len + 1, GFP_KERNEL); - if (!i915->vbt.dsi.deassert_seq) + init_otp = (u8 *)info->dsi.sequence[MIPI_SEQ_INIT_OTP]; + info->dsi.deassert_seq = kmemdup(init_otp, len + 1, GFP_KERNEL); + if (!info->dsi.deassert_seq) return; - i915->vbt.dsi.deassert_seq[0] = MIPI_SEQ_DEASSERT_RESET; - i915->vbt.dsi.deassert_seq[len] = MIPI_SEQ_ELEM_END; + info->dsi.deassert_seq[0] = MIPI_SEQ_DEASSERT_RESET; + info->dsi.deassert_seq[len] = MIPI_SEQ_ELEM_END; /* Use the copy for deassert */ - i915->vbt.dsi.sequence[MIPI_SEQ_DEASSERT_RESET] = - i915->vbt.dsi.deassert_seq; + info->dsi.sequence[MIPI_SEQ_DEASSERT_RESET] = + info->dsi.deassert_seq; /* Replace the last byte of the fragment with init OTP seq byte */ init_otp[len - 1] = MIPI_SEQ_INIT_OTP; /* And make MIPI_MIPI_SEQ_INIT_OTP point to it */ - i915->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP] = init_otp + len - 1; + info->dsi.sequence[MIPI_SEQ_INIT_OTP] = init_otp + len - 1; } static void parse_mipi_sequence(struct drm_i915_private *i915, - const struct bdb_header *bdb) + const struct bdb_header *bdb, + struct ddi_vbt_port_info *info, + int panel_index) { - int panel_type = i915->vbt.panel_type; const struct bdb_mipi_sequence *sequence; const u8 *seq_data; u32 seq_size; @@ -1395,7 +1399,7 @@ parse_mipi_sequence(struct drm_i915_private *i915, int index = 0; /* Only our generic panel driver uses the sequence block. */ - if (i915->vbt.dsi.panel_id != MIPI_DSI_GENERIC_PANEL_ID) + if (info->dsi.panel_id != MIPI_DSI_GENERIC_PANEL_ID) return; sequence = find_section(bdb, BDB_MIPI_SEQUENCE); @@ -1416,7 +1420,7 @@ parse_mipi_sequence(struct drm_i915_private *i915, drm_dbg(&i915->drm, "Found MIPI sequence block v%u\n", sequence->version); - seq_data = find_panel_sequence_block(sequence, panel_type, &seq_size); + seq_data = find_panel_sequence_block(sequence, panel_index, &seq_size); if (!seq_data) return; @@ -1441,7 +1445,7 @@ parse_mipi_sequence(struct drm_i915_private *i915, drm_dbg_kms(&i915->drm, "Unsupported sequence %u\n", seq_id); - i915->vbt.dsi.sequence[seq_id] = data + index; + info->dsi.sequence[seq_id] = data + index; if (sequence->version >= 3) index = goto_next_sequence_v3(data, index, seq_size); @@ -1454,18 +1458,18 @@ parse_mipi_sequence(struct drm_i915_private *i915, } } - i915->vbt.dsi.data = data; - i915->vbt.dsi.size = seq_size; - i915->vbt.dsi.seq_version = sequence->version; + info->dsi.data = data; + info->dsi.size = seq_size; + info->dsi.seq_version = sequence->version; - fixup_mipi_sequences(i915); + fixup_mipi_sequences(i915, info); drm_dbg(&i915->drm, "MIPI related VBT parsing complete\n"); return; err: kfree(data); - memset(i915->vbt.dsi.sequence, 0, sizeof(i915->vbt.dsi.sequence)); + memset(info->dsi.sequence, 0, sizeof(info->dsi.sequence)); } static void @@ -1990,6 +1994,8 @@ static void parse_integrated_panel(struct drm_i915_private *i915, parse_lfp_backlight(i915, bdb, info, panel_index); parse_edp(i915, bdb, info, panel_index); parse_psr(i915, bdb, info, panel_index); + parse_mipi_config(i915, bdb, info, panel_index); + parse_mipi_sequence(i915, bdb, info, panel_index); } static void parse_ddi_port(struct drm_i915_private *i915, @@ -2486,8 +2492,6 @@ void intel_bios_init(struct drm_i915_private *i915) parse_panel_type(i915, bdb); parse_sdvo_panel_data(i915, bdb); parse_driver_features(i915, bdb); - parse_mipi_config(i915, bdb); - parse_mipi_sequence(i915, bdb); /* Depends on child device list */ parse_compression_parameters(i915, bdb); @@ -2522,20 +2526,23 @@ void intel_bios_driver_remove(struct drm_i915_private *i915) } for (i = 0; i < I915_MAX_PORTS; i++) { - kfree(i915->vbt.ddi_port_info[i].lfp_lvds_vbt_mode); - i915->vbt.ddi_port_info[i].lfp_lvds_vbt_mode = NULL; + struct ddi_vbt_port_info *info = &i915->vbt.ddi_port_info[i]; + + kfree(info->lfp_lvds_vbt_mode); + info->lfp_lvds_vbt_mode = NULL; + + kfree(info->dsi.data); + info->dsi.data = NULL; + kfree(info->dsi.pps); + info->dsi.pps = NULL; + kfree(info->dsi.config); + info->dsi.config = NULL; + kfree(info->dsi.deassert_seq); + info->dsi.deassert_seq = NULL; } kfree(i915->vbt.sdvo_lvds_vbt_mode); i915->vbt.sdvo_lvds_vbt_mode = NULL; - kfree(i915->vbt.dsi.data); - i915->vbt.dsi.data = NULL; - kfree(i915->vbt.dsi.pps); - i915->vbt.dsi.pps = NULL; - kfree(i915->vbt.dsi.config); - i915->vbt.dsi.config = NULL; - kfree(i915->vbt.dsi.deassert_seq); - i915->vbt.dsi.deassert_seq = NULL; } /** @@ -3149,3 +3156,11 @@ intel_bios_psr_info(struct intel_dp *intel_dp) return &i915->vbt.ddi_port_info[encoder->port].psr; } + +const struct vbt_dsi_info * +intel_bios_dsi_info(struct intel_encoder *encoder) +{ + struct drm_i915_private *i915 = to_i915(encoder->base.dev); + + return &i915->vbt.ddi_port_info[encoder->port].dsi; +} diff --git a/drivers/gpu/drm/i915/display/intel_bios.h b/drivers/gpu/drm/i915/display/intel_bios.h index c701871d9a74d..6e953a89c84cb 100644 --- a/drivers/gpu/drm/i915/display/intel_bios.h +++ b/drivers/gpu/drm/i915/display/intel_bios.h @@ -272,5 +272,6 @@ const struct drm_display_mode *intel_bios_lfp_lvds_info(struct intel_encoder *en const struct vbt_backlight_info *intel_bios_backlight_info(struct intel_encoder *encoder); struct vbt_edp_info *intel_bios_edp_info(struct intel_encoder *encoder); const struct vbt_psr_info *intel_bios_psr_info(struct intel_dp *intel_dp); +const struct vbt_dsi_info *intel_bios_dsi_info(struct intel_encoder *encoder); #endif /* _INTEL_BIOS_H_ */ diff --git a/drivers/gpu/drm/i915/display/intel_dsi.c b/drivers/gpu/drm/i915/display/intel_dsi.c index f453ceb8d1494..2cd819a7f9dd6 100644 --- a/drivers/gpu/drm/i915/display/intel_dsi.c +++ b/drivers/gpu/drm/i915/display/intel_dsi.c @@ -115,14 +115,10 @@ struct intel_dsi_host *intel_dsi_host_init(struct intel_dsi *intel_dsi, enum drm_panel_orientation intel_dsi_get_panel_orientation(struct intel_connector *connector) { - struct drm_i915_private *dev_priv = to_i915(connector->base.dev); + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(connector->encoder); enum drm_panel_orientation orientation; - orientation = dev_priv->vbt.dsi.orientation; - if (orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) - return orientation; - - orientation = dev_priv->vbt.orientation; + orientation = vbt_dsi_info->orientation; if (orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) return orientation; diff --git a/drivers/gpu/drm/i915/display/intel_dsi_vbt.c b/drivers/gpu/drm/i915/display/intel_dsi_vbt.c index 2218de0773bf0..24de775ee7b30 100644 --- a/drivers/gpu/drm/i915/display/intel_dsi_vbt.c +++ b/drivers/gpu/drm/i915/display/intel_dsi_vbt.c @@ -225,9 +225,11 @@ static const u8 *mipi_exec_delay(struct intel_dsi *intel_dsi, const u8 *data) return data; } -static void vlv_exec_gpio(struct drm_i915_private *dev_priv, +static void vlv_exec_gpio(struct intel_dsi *intel_dsi, u8 gpio_source, u8 gpio_index, bool value) { + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); + struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev); struct gpio_map *map; u16 pconf0, padval; u32 tmp; @@ -241,7 +243,7 @@ static void vlv_exec_gpio(struct drm_i915_private *dev_priv, map = &vlv_gpio_table[gpio_index]; - if (dev_priv->vbt.dsi.seq_version >= 3) { + if (vbt_dsi_info->seq_version >= 3) { /* XXX: this assumes vlv_gpio_table only has NC GPIOs. */ port = IOSF_PORT_GPIO_NC; } else { @@ -272,14 +274,16 @@ static void vlv_exec_gpio(struct drm_i915_private *dev_priv, vlv_iosf_sb_put(dev_priv, BIT(VLV_IOSF_SB_GPIO)); } -static void chv_exec_gpio(struct drm_i915_private *dev_priv, +static void chv_exec_gpio(struct intel_dsi *intel_dsi, u8 gpio_source, u8 gpio_index, bool value) { + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); + struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev); u16 cfg0, cfg1; u16 family_num; u8 port; - if (dev_priv->vbt.dsi.seq_version >= 3) { + if (vbt_dsi_info->seq_version >= 3) { if (gpio_index >= CHV_GPIO_IDX_START_SE) { /* XXX: it's unclear whether 255->57 is part of SE. */ gpio_index -= CHV_GPIO_IDX_START_SE; @@ -325,9 +329,10 @@ static void chv_exec_gpio(struct drm_i915_private *dev_priv, vlv_iosf_sb_put(dev_priv, BIT(VLV_IOSF_SB_GPIO)); } -static void bxt_exec_gpio(struct drm_i915_private *dev_priv, +static void bxt_exec_gpio(struct intel_dsi *intel_dsi, u8 gpio_source, u8 gpio_index, bool value) { + struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev); /* XXX: this table is a quick ugly hack. */ static struct gpio_desc *bxt_gpio_table[U8_MAX + 1]; struct gpio_desc *gpio_desc = bxt_gpio_table[gpio_index]; @@ -351,14 +356,17 @@ static void bxt_exec_gpio(struct drm_i915_private *dev_priv, gpiod_set_value(gpio_desc, value); } -static void icl_exec_gpio(struct drm_i915_private *dev_priv, +static void icl_exec_gpio(struct intel_dsi *intel_dsi, u8 gpio_source, u8 gpio_index, bool value) { - drm_dbg_kms(&dev_priv->drm, "Skipping ICL GPIO element execution\n"); + struct drm_device *drm = intel_dsi->base.base.dev; + + drm_dbg_kms(drm, "Skipping ICL GPIO element execution\n"); } static const u8 *mipi_exec_gpio(struct intel_dsi *intel_dsi, const u8 *data) { + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); struct drm_device *dev = intel_dsi->base.base.dev; struct drm_i915_private *dev_priv = to_i915(dev); u8 gpio_source, gpio_index = 0, gpio_number; @@ -366,13 +374,13 @@ static const u8 *mipi_exec_gpio(struct intel_dsi *intel_dsi, const u8 *data) drm_dbg_kms(&dev_priv->drm, "\n"); - if (dev_priv->vbt.dsi.seq_version >= 3) + if (vbt_dsi_info->seq_version >= 3) gpio_index = *data++; gpio_number = *data++; /* gpio source in sequence v2 only */ - if (dev_priv->vbt.dsi.seq_version == 2) + if (vbt_dsi_info->seq_version == 2) gpio_source = (*data >> 1) & 3; else gpio_source = 0; @@ -381,13 +389,13 @@ static const u8 *mipi_exec_gpio(struct intel_dsi *intel_dsi, const u8 *data) value = *data++ & 1; if (DISPLAY_VER(dev_priv) >= 11) - icl_exec_gpio(dev_priv, gpio_source, gpio_index, value); + icl_exec_gpio(intel_dsi, gpio_source, gpio_index, value); else if (IS_VALLEYVIEW(dev_priv)) - vlv_exec_gpio(dev_priv, gpio_source, gpio_number, value); + vlv_exec_gpio(intel_dsi, gpio_source, gpio_number, value); else if (IS_CHERRYVIEW(dev_priv)) - chv_exec_gpio(dev_priv, gpio_source, gpio_number, value); + chv_exec_gpio(intel_dsi, gpio_source, gpio_number, value); else - bxt_exec_gpio(dev_priv, gpio_source, gpio_index, value); + bxt_exec_gpio(intel_dsi, gpio_source, gpio_index, value); return data; } @@ -577,15 +585,16 @@ static const char *sequence_name(enum mipi_seq seq_id) static void intel_dsi_vbt_exec(struct intel_dsi *intel_dsi, enum mipi_seq seq_id) { + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev); const u8 *data; fn_mipi_elem_exec mipi_elem_exec; if (drm_WARN_ON(&dev_priv->drm, - seq_id >= ARRAY_SIZE(dev_priv->vbt.dsi.sequence))) + seq_id >= ARRAY_SIZE(vbt_dsi_info->sequence))) return; - data = dev_priv->vbt.dsi.sequence[seq_id]; + data = vbt_dsi_info->sequence[seq_id]; if (!data) return; @@ -598,7 +607,7 @@ static void intel_dsi_vbt_exec(struct intel_dsi *intel_dsi, data++; /* Skip Size of Sequence. */ - if (dev_priv->vbt.dsi.seq_version >= 3) + if (vbt_dsi_info->seq_version >= 3) data += 4; while (1) { @@ -614,7 +623,7 @@ static void intel_dsi_vbt_exec(struct intel_dsi *intel_dsi, mipi_elem_exec = NULL; /* Size of Operation. */ - if (dev_priv->vbt.dsi.seq_version >= 3) + if (vbt_dsi_info->seq_version >= 3) operation_size = *data++; if (mipi_elem_exec) { @@ -662,10 +671,10 @@ void intel_dsi_vbt_exec_sequence(struct intel_dsi *intel_dsi, void intel_dsi_msleep(struct intel_dsi *intel_dsi, int msec) { - struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev); + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); /* For v3 VBTs in vid-mode the delays are part of the VBT sequences */ - if (is_vid_mode(intel_dsi) && dev_priv->vbt.dsi.seq_version >= 3) + if (is_vid_mode(intel_dsi) && vbt_dsi_info->seq_version >= 3) return; msleep(msec); @@ -727,8 +736,9 @@ bool intel_dsi_vbt_init(struct intel_dsi *intel_dsi, u16 panel_id) { struct drm_device *dev = intel_dsi->base.base.dev; struct drm_i915_private *dev_priv = to_i915(dev); - struct mipi_config *mipi_config = dev_priv->vbt.dsi.config; - struct mipi_pps_data *pps = dev_priv->vbt.dsi.pps; + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); + struct mipi_config *mipi_config = vbt_dsi_info->config; + struct mipi_pps_data *pps = vbt_dsi_info->pps; const struct drm_display_mode *mode = intel_bios_lfp_lvds_info(&intel_dsi->base); u16 burst_mode_ratio; enum port port; @@ -870,7 +880,8 @@ void intel_dsi_vbt_gpio_init(struct intel_dsi *intel_dsi, bool panel_is_on) { struct drm_device *dev = intel_dsi->base.base.dev; struct drm_i915_private *dev_priv = to_i915(dev); - struct mipi_config *mipi_config = dev_priv->vbt.dsi.config; + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); + struct mipi_config *mipi_config = vbt_dsi_info->config; enum gpiod_flags flags = panel_is_on ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW; bool want_backlight_gpio = false; bool want_panel_gpio = false; @@ -925,7 +936,8 @@ void intel_dsi_vbt_gpio_cleanup(struct intel_dsi *intel_dsi) { struct drm_device *dev = intel_dsi->base.base.dev; struct drm_i915_private *dev_priv = to_i915(dev); - struct mipi_config *mipi_config = dev_priv->vbt.dsi.config; + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); + struct mipi_config *mipi_config = vbt_dsi_info->config; if (intel_dsi->gpio_panel) { gpiod_put(intel_dsi->gpio_panel); diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c index 9c892476d8621..92d93ddf28140 100644 --- a/drivers/gpu/drm/i915/display/intel_panel.c +++ b/drivers/gpu/drm/i915/display/intel_panel.c @@ -1924,6 +1924,7 @@ cnp_setup_backlight(struct intel_connector *connector, enum pipe unused) static int ext_pwm_setup_backlight(struct intel_connector *connector, enum pipe pipe) { + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(connector->encoder); struct drm_device *dev = connector->base.dev; struct drm_i915_private *dev_priv = to_i915(dev); struct intel_panel *panel = &connector->panel; @@ -1931,7 +1932,7 @@ static int ext_pwm_setup_backlight(struct intel_connector *connector, u32 level; /* Get the right PWM chip for DSI backlight according to VBT */ - if (dev_priv->vbt.dsi.config->pwm_blc == PPS_BLC_PMIC) { + if (vbt_dsi_info->config->pwm_blc == PPS_BLC_PMIC) { panel->backlight.pwm = pwm_get(dev->dev, "pwm_pmic_backlight"); desc = "PMIC"; } else { diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c b/drivers/gpu/drm/i915/display/vlv_dsi.c index 0ee4ff341e25d..0758726fa19bd 100644 --- a/drivers/gpu/drm/i915/display/vlv_dsi.c +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c @@ -780,6 +780,7 @@ static void intel_dsi_pre_enable(struct intel_atomic_state *state, const struct drm_connector_state *conn_state) { struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc); struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); enum pipe pipe = crtc->pipe; @@ -837,7 +838,7 @@ static void intel_dsi_pre_enable(struct intel_atomic_state *state, * the delay in that case. If there is no deassert-seq, then an * unconditional msleep is used to give the panel time to power-on. */ - if (dev_priv->vbt.dsi.sequence[MIPI_SEQ_DEASSERT_RESET]) { + if (vbt_dsi_info->sequence[MIPI_SEQ_DEASSERT_RESET]) { intel_dsi_msleep(intel_dsi, intel_dsi->panel_on_delay); intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DEASSERT_RESET); } else { @@ -1665,7 +1666,8 @@ static void vlv_dphy_param_init(struct intel_dsi *intel_dsi) { struct drm_device *dev = intel_dsi->base.base.dev; struct drm_i915_private *dev_priv = to_i915(dev); - struct mipi_config *mipi_config = dev_priv->vbt.dsi.config; + const struct vbt_dsi_info *vbt_dsi_info = intel_bios_dsi_info(&intel_dsi->base); + struct mipi_config *mipi_config = vbt_dsi_info->config; u32 tlpx_ns, extra_byte_count, tlpx_ui; u32 ui_num, ui_den; u32 prepare_cnt, exit_zero_cnt, clk_zero_cnt, trail_cnt; @@ -1835,6 +1837,7 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv) struct intel_connector *intel_connector; struct drm_connector *connector; struct drm_display_mode *current_mode, *fixed_mode; + const struct vbt_dsi_info *vbt_dsi_info; enum port port; enum pipe pipe; @@ -1898,14 +1901,15 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv) intel_encoder->pipe_mask = BIT(PIPE_B); intel_dsi->panel_power_off_time = ktime_get_boottime(); + vbt_dsi_info = intel_bios_dsi_info(intel_encoder); - if (dev_priv->vbt.dsi.config->dual_link) + if (vbt_dsi_info->config->dual_link) intel_dsi->ports = BIT(PORT_A) | BIT(PORT_C); else intel_dsi->ports = BIT(port); - intel_dsi->dcs_backlight_ports = dev_priv->vbt.dsi.bl_ports; - intel_dsi->dcs_cabc_ports = dev_priv->vbt.dsi.cabc_ports; + intel_dsi->dcs_backlight_ports = vbt_dsi_info->bl_ports; + intel_dsi->dcs_cabc_ports = vbt_dsi_info->cabc_ports; /* Create a DSI host (and a device) for each port. */ for_each_dsi_port(port, intel_dsi->ports) { diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 233dfcf854b52..adcacb8cb248a 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -699,6 +699,21 @@ struct ddi_vbt_port_info { int tp2_tp3_wakeup_time_us; int psr2_tp2_tp3_wakeup_time_us; } psr; + + /* MIPI DSI */ + struct vbt_dsi_info { + u16 panel_id; + struct mipi_config *config; + struct mipi_pps_data *pps; + u16 bl_ports; + u16 cabc_ports; + u8 seq_version; + u32 size; + u8 *data; + const u8 *sequence[MIPI_SEQ_MAX]; + u8 *deassert_seq; /* Used by fixup_mipi_sequences() */ + enum drm_panel_orientation orientation; + } dsi; }; struct intel_vbt_data { @@ -719,21 +734,6 @@ struct intel_vbt_data { unsigned int bios_lvds_val; /* initial [PCH_]LVDS reg val in VBIOS */ enum drm_panel_orientation orientation; - /* MIPI DSI */ - struct { - u16 panel_id; - struct mipi_config *config; - struct mipi_pps_data *pps; - u16 bl_ports; - u16 cabc_ports; - u8 seq_version; - u32 size; - u8 *data; - const u8 *sequence[MIPI_SEQ_MAX]; - u8 *deassert_seq; /* Used by fixup_mipi_sequences() */ - enum drm_panel_orientation orientation; - } dsi; - int crt_ddc_pin; struct list_head display_devices;
Continuing the conversion from single integrated VBT data to two, now handling DSI data. Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Jani Nikula <jani.nikula@intel.com> Signed-off-by: José Roberto de Souza <jose.souza@intel.com> --- drivers/gpu/drm/i915/display/icl_dsi.c | 12 +- drivers/gpu/drm/i915/display/intel_bios.c | 163 ++++++++++--------- drivers/gpu/drm/i915/display/intel_bios.h | 1 + drivers/gpu/drm/i915/display/intel_dsi.c | 8 +- drivers/gpu/drm/i915/display/intel_dsi_vbt.c | 58 ++++--- drivers/gpu/drm/i915/display/intel_panel.c | 3 +- drivers/gpu/drm/i915/display/vlv_dsi.c | 14 +- drivers/gpu/drm/i915/i915_drv.h | 30 ++-- 8 files changed, 161 insertions(+), 128 deletions(-)