static bool intel_dsi_compute_config(struct intel_encoder *encoder, struct intel_crtc_config *config) { struct intel_dsi *intel_dsi = container_of(encoder, struct intel_dsi, base); struct intel_connector *intel_connector = intel_dsi->attached_connector; struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode; struct drm_display_mode *adjusted_mode = &config->adjusted_mode; struct drm_display_mode *mode = &config->requested_mode; struct intel_crtc *intel_crtc = encoder->new_crtc; struct drm_device *dev = encoder->base.dev; DRM_DEBUG_KMS("\n"); if (fixed_mode) intel_fixed_panel_mode(fixed_mode, adjusted_mode); if (IS_VALLEYVIEW(dev)) { intel_gmch_panel_fitting(intel_crtc, config, intel_connector->panel.fitting_mode); } if (intel_dsi->dev.dev_ops->mode_fixup) return intel_dsi->dev.dev_ops->mode_fixup(&intel_dsi->dev, mode, adjusted_mode); return true; }
static int intel_dsi_set_property(struct drm_connector *connector, struct drm_property *property, uint64_t val) { struct intel_dsi *intel_dsi = intel_attached_dsi(connector); struct drm_i915_private *dev_priv = connector->dev->dev_private; struct intel_connector *intel_connector = to_intel_connector(connector); struct intel_encoder *encoder = intel_connector->encoder; struct intel_crtc *intel_crtc = encoder->new_crtc; int ret; ret = drm_object_property_set_value(&connector->base, property, val); if (ret) return ret; if (property == dev_priv->force_pfit_property) { if (intel_connector->panel.fitting_mode == val) return 0; intel_connector->panel.fitting_mode = val; if (IS_VALLEYVIEW(dev_priv->dev)) { /* In case of BYT_CR platform with the panasonic panel of * resolution 19x10, panel fitter needs to be enabled always * becoz we simulate the 12x8 mode due to memory limitation */ if ((dev_priv->scaling_reqd) || (BYT_CR_CONFIG && (i915_mipi_panel_id == MIPI_DSI_PANASONIC_VXX09F006A00_PANEL_ID))) { if (intel_connector->panel.fitting_mode == PFIT_OFF) return 0; } intel_gmch_panel_fitting(intel_crtc, &intel_crtc->config, intel_connector->panel.fitting_mode); DRM_DEBUG_DRIVER("panel fitting mode = %x", intel_connector->panel.fitting_mode); return 0; } else goto done; } if (property == dev_priv->scaling_src_size_property) { intel_crtc->scaling_src_size = val; DRM_DEBUG_DRIVER("src size = %x", intel_crtc->scaling_src_size); return 0; } done: if (intel_dsi->base.base.crtc) intel_crtc_restore_mode(intel_dsi->base.base.crtc); return 0; }
static bool intel_dsi_compute_config(struct intel_encoder *encoder, struct intel_crtc_config *config) { struct intel_dsi *intel_dsi = container_of(encoder, struct intel_dsi, base); struct intel_connector *intel_connector = intel_dsi->attached_connector; struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode; struct drm_display_mode *adjusted_mode = &config->adjusted_mode; struct drm_display_mode *mode = &config->requested_mode; struct intel_crtc *intel_crtc = encoder->new_crtc; struct drm_device *dev = encoder->base.dev; struct drm_i915_private *dev_priv = dev->dev_private; DRM_DEBUG_KMS("\n"); if (fixed_mode) intel_fixed_panel_mode(fixed_mode, adjusted_mode); /* Panel native resolution and desired mode can be different in these two cases: 1. Generic driver specifies scaling reqd flag. 2. Static driver for Panasonic panel with BYT_CR Fixme: Remove static driver's panel ID check as we are planning to enable generic driver by default */ if ((dev_priv->scaling_reqd) || (BYT_CR_CONFIG && (i915_mipi_panel_id == MIPI_DSI_PANASONIC_VXX09F006A00_PANEL_ID))) { intel_connector->panel.fitting_mode = AUTOSCALE; DRM_DEBUG_DRIVER("Enabling panel fitter as scaling required flag set\n"); } if (IS_VALLEYVIEW(dev)) { intel_gmch_panel_fitting(intel_crtc, config, intel_connector->panel.fitting_mode); } if (intel_dsi->dev.dev_ops->mode_fixup) return intel_dsi->dev.dev_ops->mode_fixup(&intel_dsi->dev, mode, adjusted_mode); config->dither = config->pipe_bpp == 18 ? 1 : 0; return true; }
static int intel_dsi_set_property(struct drm_connector *connector, struct drm_property *property, uint64_t val) { struct intel_dsi *intel_dsi = intel_attached_dsi(connector); struct drm_i915_private *dev_priv = connector->dev->dev_private; struct intel_connector *intel_connector = to_intel_connector(connector); struct intel_encoder *encoder = intel_connector->encoder; struct intel_crtc *intel_crtc = encoder->new_crtc; int ret; ret = drm_object_property_set_value(&connector->base, property, val); if (ret) return ret; if (property == dev_priv->force_pfit_property) { if (intel_connector->panel.fitting_mode == val) return 0; intel_connector->panel.fitting_mode = val; if (IS_VALLEYVIEW(dev_priv->dev)) { intel_gmch_panel_fitting(intel_crtc, &intel_crtc->config, intel_connector->panel.fitting_mode); DRM_DEBUG_DRIVER("panel fitting mode = %x", intel_connector->panel.fitting_mode); return 0; } else goto done; } if (property == dev_priv->scaling_src_size_property) { intel_crtc->scaling_src_size = val; DRM_DEBUG_DRIVER("src size = %x", intel_crtc->scaling_src_size); return 0; } done: if (intel_dsi->base.base.crtc) intel_crtc_restore_mode(intel_dsi->base.base.crtc); return 0; }