Commit b8ca445f authored by Wayne Lin's avatar Wayne Lin Committed by Alex Deucher
Browse files

drm/amd/display: Pass the right info to drm_dp_remove_payload



[Why & How]
drm_dp_remove_payload() interface was changed. Correct amdgpu dm code
to pass the right parameter to the drm helper function.

Reviewed-by: default avatarJerry Zuo <Jerry.Zuo@amd.com>
Acked-by: default avatarQingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: default avatarWayne Lin <Wayne.Lin@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 09a9639e
Loading
Loading
Loading
Loading
+50 −7
Original line number Diff line number Diff line
@@ -177,6 +177,40 @@ void dm_helpers_dp_update_branch_info(
	const struct dc_link *link)
{}

static void dm_helpers_construct_old_payload(
			struct dc_link *link,
			int pbn_per_slot,
			struct drm_dp_mst_atomic_payload *new_payload,
			struct drm_dp_mst_atomic_payload *old_payload)
{
	struct link_mst_stream_allocation_table current_link_table =
									link->mst_stream_alloc_table;
	struct link_mst_stream_allocation *dc_alloc;
	int i;

	*old_payload = *new_payload;

	/* Set correct time_slots/PBN of old payload.
	 * other fields (delete & dsc_enabled) in
	 * struct drm_dp_mst_atomic_payload are don't care fields
	 * while calling drm_dp_remove_payload()
	 */
	for (i = 0; i < current_link_table.stream_count; i++) {
		dc_alloc =
			&current_link_table.stream_allocations[i];

		if (dc_alloc->vcp_id == new_payload->vcpi) {
			old_payload->time_slots = dc_alloc->slot_count;
			old_payload->pbn = dc_alloc->slot_count * pbn_per_slot;
			break;
		}
	}

	/* make sure there is an old payload*/
	ASSERT(i != current_link_table.stream_count);

}

/*
 * Writes payload allocation table in immediate downstream device.
 */
@@ -188,7 +222,7 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
{
	struct amdgpu_dm_connector *aconnector;
	struct drm_dp_mst_topology_state *mst_state;
	struct drm_dp_mst_atomic_payload *payload;
	struct drm_dp_mst_atomic_payload *target_payload, *new_payload, old_payload;
	struct drm_dp_mst_topology_mgr *mst_mgr;

	aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
@@ -204,17 +238,26 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
	mst_state = to_drm_dp_mst_topology_state(mst_mgr->base.state);

	/* It's OK for this to fail */
	payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
	if (enable)
		drm_dp_add_payload_part1(mst_mgr, mst_state, payload);
	else
		drm_dp_remove_payload(mst_mgr, mst_state, payload, payload);
	new_payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);

	if (enable) {
		target_payload = new_payload;

		drm_dp_add_payload_part1(mst_mgr, mst_state, new_payload);
	} else {
		/* construct old payload by VCPI*/
		dm_helpers_construct_old_payload(stream->link, mst_state->pbn_div,
						new_payload, &old_payload);
		target_payload = &old_payload;

		drm_dp_remove_payload(mst_mgr, mst_state, &old_payload, new_payload);
	}

	/* mst_mgr->->payloads are VC payload notify MST branch using DPCD or
	 * AUX message. The sequence is slot 1-63 allocated sequence for each
	 * stream. AMD ASIC stream slot allocation should follow the same
	 * sequence. copy DRM MST allocation to dc */
	fill_dc_mst_payload_table_from_drm(stream->link, enable, payload, proposed_table);
	fill_dc_mst_payload_table_from_drm(stream->link, enable, target_payload, proposed_table);

	return true;
}