Commit 54935663 authored by Nicholas Kazlauskas's avatar Nicholas Kazlauskas Committed by Alex Deucher
Browse files

drm/amd/display: Add new IPS config mode



[Why]
We don't have a way to specify IPS2 for display off but RCG only for
static screen and local video playback.

[How]
Add a new setting that allows RCG only when displays are active but
IPS2 when all displays are off.

Reviewed-by: default avatarOvidiu Bunea <ovidiu.bunea@amd.com>
Acked-by: default avatarTom Chung <chiahsuan.chung@amd.com>
Signed-off-by: default avatarNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent a13ad819
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -1201,6 +1201,20 @@ bool dc_dmub_srv_is_hw_pwr_up(struct dc_dmub_srv *dc_dmub_srv, bool wait)
	return true;
}

static int count_active_streams(const struct dc *dc)
{
	int i, count = 0;

	for (i = 0; i < dc->current_state->stream_count; ++i) {
		struct dc_stream_state *stream = dc->current_state->streams[i];

		if (stream && !stream->dpms_off)
			count += 1;
	}

	return count;
}

static void dc_dmub_srv_notify_idle(const struct dc *dc, bool allow_idle)
{
	volatile const struct dmub_shared_state_ips_fw *ips_fw;
@@ -1255,6 +1269,21 @@ static void dc_dmub_srv_notify_idle(const struct dc *dc, bool allow_idle)
			new_signals.bits.allow_pg = 1;
			new_signals.bits.allow_ips1 = 1;
			new_signals.bits.allow_ips2 = 1;
		} else if (dc->config.disable_ips == DMUB_IPS_RCG_IN_ACTIVE_IPS2_IN_OFF) {
			/* TODO: Move this logic out to hwseq */
			if (count_active_streams(dc) == 0) {
				/* IPS2 - Display off */
				new_signals.bits.allow_pg = 1;
				new_signals.bits.allow_ips1 = 1;
				new_signals.bits.allow_ips2 = 1;
				new_signals.bits.allow_z10 = 1;
			} else {
				/* RCG only */
				new_signals.bits.allow_pg = 0;
				new_signals.bits.allow_ips1 = 1;
				new_signals.bits.allow_ips2 = 0;
				new_signals.bits.allow_z10 = 0;
			}
		}

		ips_driver->signals = new_signals;
+1 −0
Original line number Diff line number Diff line
@@ -624,6 +624,7 @@ enum dmub_ips_disable_type {
	DMUB_IPS_DISABLE_IPS2 = 3,
	DMUB_IPS_DISABLE_IPS2_Z10 = 4,
	DMUB_IPS_DISABLE_DYNAMIC = 5,
	DMUB_IPS_RCG_IN_ACTIVE_IPS2_IN_OFF = 6,
};

#define DMUB_IPS1_ALLOW_MASK 0x00000001