|
|
@@ -664,6 +664,50 @@ parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+parse_psr(struct drm_i915_private *dev_priv, struct bdb_header *bdb)
|
|
|
+{
|
|
|
+ struct bdb_psr *psr;
|
|
|
+ struct psr_table *psr_table;
|
|
|
+
|
|
|
+ psr = find_section(bdb, BDB_PSR);
|
|
|
+ if (!psr) {
|
|
|
+ DRM_DEBUG_KMS("No PSR BDB found.\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ psr_table = &psr->psr_table[panel_type];
|
|
|
+
|
|
|
+ dev_priv->vbt.psr.full_link = psr_table->full_link;
|
|
|
+ dev_priv->vbt.psr.require_aux_wakeup = psr_table->require_aux_to_wakeup;
|
|
|
+
|
|
|
+ /* Allowed VBT values goes from 0 to 15 */
|
|
|
+ dev_priv->vbt.psr.idle_frames = psr_table->idle_frames < 0 ? 0 :
|
|
|
+ psr_table->idle_frames > 15 ? 15 : psr_table->idle_frames;
|
|
|
+
|
|
|
+ switch (psr_table->lines_to_wait) {
|
|
|
+ case 0:
|
|
|
+ dev_priv->vbt.psr.lines_to_wait = PSR_0_LINES_TO_WAIT;
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ dev_priv->vbt.psr.lines_to_wait = PSR_1_LINE_TO_WAIT;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ dev_priv->vbt.psr.lines_to_wait = PSR_4_LINES_TO_WAIT;
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ dev_priv->vbt.psr.lines_to_wait = PSR_8_LINES_TO_WAIT;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ DRM_DEBUG_KMS("VBT has unknown PSR lines to wait %u\n",
|
|
|
+ psr_table->lines_to_wait);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ dev_priv->vbt.psr.tp1_wakeup_time = psr_table->tp1_wakeup_time;
|
|
|
+ dev_priv->vbt.psr.tp2_tp3_wakeup_time = psr_table->tp2_tp3_wakeup_time;
|
|
|
+}
|
|
|
+
|
|
|
static u8 *goto_next_sequence(u8 *data, int *size)
|
|
|
{
|
|
|
u16 len;
|
|
|
@@ -1241,6 +1285,7 @@ intel_parse_bios(struct drm_device *dev)
|
|
|
parse_device_mapping(dev_priv, bdb);
|
|
|
parse_driver_features(dev_priv, bdb);
|
|
|
parse_edp(dev_priv, bdb);
|
|
|
+ parse_psr(dev_priv, bdb);
|
|
|
parse_mipi(dev_priv, bdb);
|
|
|
parse_ddi_ports(dev_priv, bdb);
|
|
|
|