> -----Original Message----- > From: Jani Nikula <jani.nikula@xxxxxxxxx> > Sent: Tuesday, November 26, 2019 7:13 PM > To: intel-gfx@xxxxxxxxxxxxxxxxxxxxx > Cc: Nikula, Jani <jani.nikula@xxxxxxxxx>; Kulkarni, Vandita > <vandita.kulkarni@xxxxxxxxx>; Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > Subject: [PATCH v3 02/13] drm/i915/bios: parse compression parameters > block > > Check for child devices that specify compression, and store the device > specific compression parameters in the display device data struct for later > use. Warn if compression is requested but not available. > > Use fairly rigid checks for compression data for starters. These can be made > more dynamic later. > > Log about DSC presence in DDI port parse, though this is not universal across > platforms or port types (DSI). > > v2: amended debug logging > > Bspec: 29885 > Cc: Vandita Kulkarni <vandita.kulkarni@xxxxxxxxx> > Cc: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > Signed-off-by: Jani Nikula <jani.nikula@xxxxxxxxx> Looks good to me. Reviewed-by: Vandita Kulkarni <vandita.kulkarni@xxxxxxxxx> Thanks, Vandita > --- > drivers/gpu/drm/i915/display/intel_bios.c | 61 ++++++++++++++++++- > drivers/gpu/drm/i915/display/intel_vbt_defs.h | 2 +- > 2 files changed, 60 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_bios.c > b/drivers/gpu/drm/i915/display/intel_bios.c > index 127933f12454..9ac6c657a05e 100644 > --- a/drivers/gpu/drm/i915/display/intel_bios.c > +++ b/drivers/gpu/drm/i915/display/intel_bios.c > @@ -61,6 +61,7 @@ > /* Wrapper for VBT child device config */ struct display_device_data { > struct child_device_config child; > + struct dsc_compression_parameters_entry *dsc; > struct list_head node; > }; > > @@ -1337,6 +1338,57 @@ parse_mipi_sequence(struct drm_i915_private > *dev_priv, > memset(dev_priv->vbt.dsi.sequence, 0, sizeof(dev_priv- > >vbt.dsi.sequence)); > } > > +static void > +parse_compression_parameters(struct drm_i915_private *i915, > + const struct bdb_header *bdb) > +{ > + const struct bdb_compression_parameters *params; > + struct display_device_data *devdata; > + const struct child_device_config *child; > + u16 block_size; > + int index; > + > + if (bdb->version < 198) > + return; > + > + params = find_section(bdb, BDB_COMPRESSION_PARAMETERS); > + if (params) { > + /* Sanity checks */ > + if (params->entry_size != sizeof(params->data[0])) { > + DRM_DEBUG_KMS("VBT: unsupported compression > param entry size\n"); > + return; > + } > + > + block_size = get_blocksize(params); > + if (block_size < sizeof(*params)) { > + DRM_DEBUG_KMS("VBT: expected 16 compression > param entries\n"); > + return; > + } > + } > + > + list_for_each_entry(devdata, &i915->vbt.display_devices, node) { > + child = &devdata->child; > + > + if (!child->compression_enable) > + continue; > + > + if (!params) { > + DRM_DEBUG_KMS("VBT: compression params not > available\n"); > + continue; > + } > + > + if (child->compression_method_cps) { > + DRM_DEBUG_KMS("VBT: CPS compression not > supported\n"); > + continue; > + } > + > + index = child->compression_structure_index; > + > + devdata->dsc = kmemdup(¶ms->data[index], > + sizeof(*devdata->dsc), GFP_KERNEL); > + } > +} > + > static u8 translate_iboost(u8 val) > { > static const u8 mapping[] = { 1, 3, 7 }; /* See VBT spec */ @@ - > 1569,10 +1621,11 @@ static void parse_ddi_port(struct drm_i915_private > *dev_priv, > if (bdb_version >= 209) > info->supports_tbt = child->tbt; > > - DRM_DEBUG_KMS("Port %c VBT info: CRT:%d DVI:%d HDMI:%d DP:%d > eDP:%d LSPCON:%d USB-Type-C:%d TBT:%d\n", > + DRM_DEBUG_KMS("Port %c VBT info: CRT:%d DVI:%d HDMI:%d DP:%d > eDP:%d > +LSPCON:%d USB-Type-C:%d TBT:%d DSC:%d\n", > port_name(port), is_crt, is_dvi, is_hdmi, is_dp, is_edp, > HAS_LSPCON(dev_priv) && child->lspcon, > - info->supports_typec_usb, info->supports_tbt); > + info->supports_typec_usb, info->supports_tbt, > + devdata->dsc != NULL); > > if (is_edp && is_dvi) > DRM_DEBUG_KMS("Internal DP port %c is TMDS > compatible\n", @@ -1979,6 +2032,9 @@ void intel_bios_init(struct > drm_i915_private *dev_priv) > parse_mipi_config(dev_priv, bdb); > parse_mipi_sequence(dev_priv, bdb); > > + /* Depends on child device list */ > + parse_compression_parameters(dev_priv, bdb); > + > /* Further processing on pre-parsed data */ > parse_sdvo_device_mapping(dev_priv, bdb->version); > parse_ddi_ports(dev_priv, bdb->version); @@ -2003,6 +2059,7 @@ > void intel_bios_driver_remove(struct drm_i915_private *dev_priv) > > list_for_each_entry_safe(devdata, n, &dev_priv->vbt.display_devices, > node) { > list_del(&devdata->node); > + kfree(devdata->dsc); > kfree(devdata); > } > > diff --git a/drivers/gpu/drm/i915/display/intel_vbt_defs.h > b/drivers/gpu/drm/i915/display/intel_vbt_defs.h > index f0338da3a82a..b1ef7f00eb11 100644 > --- a/drivers/gpu/drm/i915/display/intel_vbt_defs.h > +++ b/drivers/gpu/drm/i915/display/intel_vbt_defs.h > @@ -369,7 +369,7 @@ struct child_device_config { > u16 dtd_buf_ptr; /* 161 */ > u8 edidless_efp:1; /* 161 */ > u8 compression_enable:1; /* 198 */ > - u8 compression_method:1; /* 198 */ > + u8 compression_method_cps:1; /* > 198 */ > u8 ganged_edp:1; /* 202 */ > u8 reserved0:4; > u8 compression_structure_index:4; /* 198 */ > -- > 2.20.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx