Commit 551fb93d authored by José Roberto de Souza's avatar José Roberto de Souza
Browse files

drm/i915/vbt: Parse power conservation features block



From VBT 228+ this is block that PSR and other power saving
features configuration should be read from.

v3:
Using DRRS from this new block

v4:
Using BIT()
Fixing DRRS comment in parse_power_conservation_features()

Cc: Matt Roper <matthew.d.roper@intel.com>
Cc: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
Reviewed-by: default avatarMatt Roper <matthew.d.roper@intel.com>
Signed-off-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191128014852.214135-5-jose.souza@intel.com
parent ba0af30d
Loading
Loading
Loading
Loading
+34 −4
Original line number Diff line number Diff line
@@ -659,6 +659,7 @@ parse_driver_features(struct drm_i915_private *dev_priv,
			dev_priv->vbt.int_lvds_support = 0;
	}

	if (bdb->version < 228) {
		DRM_DEBUG_KMS("DRRS State Enabled:%d\n", driver->drrs_enabled);
		/*
		 * If DRRS is not supported, drrs_type has to be set to 0.
@@ -668,8 +669,36 @@ parse_driver_features(struct drm_i915_private *dev_priv,
		 */
		if (!driver->drrs_enabled)
			dev_priv->vbt.drrs_type = DRRS_NOT_SUPPORTED;

		dev_priv->vbt.psr.enable = driver->psr_enabled;
	}
}

static void
parse_power_conservation_features(struct drm_i915_private *dev_priv,
				  const struct bdb_header *bdb)
{
	const struct bdb_lfp_power *power;
	u8 panel_type = dev_priv->vbt.panel_type;

	if (bdb->version < 228)
		return;

	power = find_section(bdb, BDB_LVDS_POWER);
	if (!power)
		return;

	dev_priv->vbt.psr.enable = power->psr & BIT(panel_type);

	/*
	 * If DRRS is not supported, drrs_type has to be set to 0.
	 * This is because, VBT is configured in such a way that
	 * static DRRS is 0 and DRRS not supported is represented by
	 * power->drrs & BIT(panel_type)=false
	 */
	if (!(power->drrs & BIT(panel_type)))
		dev_priv->vbt.drrs_type = DRRS_NOT_SUPPORTED;
}

static void
parse_edp(struct drm_i915_private *dev_priv, const struct bdb_header *bdb)
@@ -1973,6 +2002,7 @@ void intel_bios_init(struct drm_i915_private *dev_priv)
	parse_lfp_backlight(dev_priv, bdb);
	parse_sdvo_panel_data(dev_priv, bdb);
	parse_driver_features(dev_priv, bdb);
	parse_power_conservation_features(dev_priv, bdb);
	parse_edp(dev_priv, bdb);
	parse_psr(dev_priv, bdb);
	parse_mipi_config(dev_priv, bdb);
+29 −0
Original line number Diff line number Diff line
@@ -793,6 +793,35 @@ struct bdb_lfp_backlight_data {
	struct lfp_backlight_control_method backlight_control[16];
} __packed;

/*
 * Block 44 - LFP Power Conservation Features Block
 */

struct als_data_entry {
	u16 backlight_adjust;
	u16 lux;
} __packed;

struct agressiveness_profile_entry {
	u8 dpst_agressiveness : 4;
	u8 lace_agressiveness : 4;
} __packed;

struct bdb_lfp_power {
	u8 lfp_feature_bits;
	struct als_data_entry als[5];
	u8 lace_aggressiveness_profile;
	u16 dpst;
	u16 psr;
	u16 drrs;
	u16 lace_support;
	u16 adt;
	u16 dmrrs;
	u16 adb;
	u16 lace_enabled_status;
	struct agressiveness_profile_entry aggressivenes[16];
} __packed;

/*
 * Block 52 - MIPI Configuration Block
 */