From: Wayne Lin <Wayne.Lin@amd.com>
To: <dri-devel@lists.freedesktop.org>, <amd-gfx@lists.freedesktop.org>
Cc: jani.nikula@intel.com, imre.deak@intel.com, jerry.zuo@amd.com,
Wayne Lin <Wayne.Lin@amd.com>,
harry.wentland@amd.com, ville.syrjala@linux.intel.com
Subject: [PATCH 3/3] drm/mst: adjust the function drm_dp_remove_payload_part2()
Date: Fri, 4 Aug 2023 14:20:29 +0800 [thread overview]
Message-ID: <20230804062029.5686-4-Wayne.Lin@amd.com> (raw)
In-Reply-To: <20230804062029.5686-1-Wayne.Lin@amd.com>
[Why]
Now in drm_dp_remove_payload_part2(), it utilizes the time slot number
of the payload in old state to represent the one in the payload table
at the moment.
It would be better to clarify the idea by using the latest allocated
time slot number for the port at the moment instead and which info is
already included in new mst_state. By this, we can also remove redundant
workaround for amdgpu driver.
[How]
Remove "old_payload" input of drm_dp_remove_payload_part2() and get the
latest number of allocated time slot for the port from new mst_state
instead.
Signed-off-by: Wayne Lin <Wayne.Lin@amd.com>
---
.../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 70 ++++---------------
drivers/gpu/drm/display/drm_dp_mst_topology.c | 32 ++++++---
drivers/gpu/drm/i915/display/intel_dp_mst.c | 7 +-
drivers/gpu/drm/nouveau/dispnv50/disp.c | 6 +-
include/drm/display/drm_dp_mst_helper.h | 9 ++-
5 files changed, 40 insertions(+), 84 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
index 9ad509279b0a..e852da686c26 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
@@ -203,40 +203,6 @@ 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_part2()
- */
- for (i = 0; i < current_link_table.stream_count; i++) {
- dc_alloc =
- ¤t_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.
*/
@@ -248,7 +214,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 *target_payload, *new_payload, old_payload;
+ struct drm_dp_mst_atomic_payload *payload;
struct drm_dp_mst_topology_mgr *mst_mgr;
aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
@@ -262,27 +228,20 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
mst_mgr = &aconnector->mst_root->mst_mgr;
mst_state = to_drm_dp_mst_topology_state(mst_mgr->base.state);
- new_payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
-
- if (enable) {
- target_payload = new_payload;
+ payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
+ if (enable)
/* It's OK for this to fail */
- 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_add_payload_part1(mst_mgr, mst_state, payload);
+ else
- drm_dp_remove_payload_part1(mst_mgr, mst_state, new_payload);
- }
+ drm_dp_remove_payload_part1(mst_mgr, mst_state, 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, target_payload, proposed_table);
+ fill_dc_mst_payload_table_from_drm(stream->link, enable, payload, proposed_table);
return true;
}
@@ -341,7 +300,7 @@ bool dm_helpers_dp_mst_send_payload_allocation(
struct amdgpu_dm_connector *aconnector;
struct drm_dp_mst_topology_state *mst_state;
struct drm_dp_mst_topology_mgr *mst_mgr;
- struct drm_dp_mst_atomic_payload *new_payload, *old_payload;
+ struct drm_dp_mst_atomic_payload *payload;
enum mst_progress_status set_flag = MST_ALLOCATE_NEW_PAYLOAD;
enum mst_progress_status clr_flag = MST_CLEAR_ALLOCATED_PAYLOAD;
int ret = 0;
@@ -354,20 +313,17 @@ bool dm_helpers_dp_mst_send_payload_allocation(
mst_mgr = &aconnector->mst_root->mst_mgr;
mst_state = to_drm_dp_mst_topology_state(mst_mgr->base.state);
- new_payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
+ payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
if (!enable) {
set_flag = MST_CLEAR_ALLOCATED_PAYLOAD;
clr_flag = MST_ALLOCATE_NEW_PAYLOAD;
}
- if (enable) {
- ret = drm_dp_add_payload_part2(mst_mgr, mst_state->base.state, new_payload);
- } else {
- dm_helpers_construct_old_payload(stream->link, mst_state->pbn_div,
- new_payload, old_payload);
- drm_dp_remove_payload_part2(mst_mgr, mst_state, old_payload, new_payload);
- }
+ if (enable)
+ ret = drm_dp_add_payload_part2(mst_mgr, mst_state->base.state, payload);
+ else
+ drm_dp_remove_payload_part2(mst_mgr, mst_state, payload);
if (ret) {
amdgpu_dm_set_mst_status(&aconnector->mst_status,
diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c b/drivers/gpu/drm/display/drm_dp_mst_topology.c
index e04f87ff755a..4270178f95f6 100644
--- a/drivers/gpu/drm/display/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c
@@ -3382,8 +3382,7 @@ EXPORT_SYMBOL(drm_dp_remove_payload_part1);
* drm_dp_remove_payload_part2() - Remove an MST payload locally
* @mgr: Manager to use.
* @mst_state: The MST atomic state
- * @old_payload: The payload with its old state
- * @new_payload: The payload with its latest state
+ * @payload: The payload with its latest state
*
* Updates the starting time slots of all other payloads which would have been shifted towards
* the start of the payload ID table as a result of removing a payload. Driver should call this
@@ -3392,25 +3391,36 @@ EXPORT_SYMBOL(drm_dp_remove_payload_part1);
*/
void drm_dp_remove_payload_part2(struct drm_dp_mst_topology_mgr *mgr,
struct drm_dp_mst_topology_state *mst_state,
- const struct drm_dp_mst_atomic_payload *old_payload,
- struct drm_dp_mst_atomic_payload *new_payload)
+ struct drm_dp_mst_atomic_payload *payload)
{
struct drm_dp_mst_atomic_payload *pos;
+ u8 time_slots_to_remove;
+ u8 next_payload_vc_start = mgr->next_start_slot;
+
+ /* Find the current allocated time slot number of the payload */
+ list_for_each_entry(pos, &mst_state->payloads, next) {
+ if (pos != payload &&
+ pos->vc_start_slot > payload->vc_start_slot &&
+ pos->vc_start_slot < next_payload_vc_start)
+ next_payload_vc_start = pos->vc_start_slot;
+ }
+
+ time_slots_to_remove = next_payload_vc_start - payload->vc_start_slot;
/* Remove local payload allocation */
list_for_each_entry(pos, &mst_state->payloads, next) {
- if (pos != new_payload && pos->vc_start_slot > new_payload->vc_start_slot)
- pos->vc_start_slot -= old_payload->time_slots;
+ if (pos != payload && pos->vc_start_slot > payload->vc_start_slot)
+ pos->vc_start_slot -= time_slots_to_remove;
}
- new_payload->vc_start_slot = -1;
+ payload->vc_start_slot = -1;
mgr->payload_count--;
- mgr->next_start_slot -= old_payload->time_slots;
+ mgr->next_start_slot -= time_slots_to_remove;
- if (new_payload->delete)
- drm_dp_mst_put_port_malloc(new_payload->port);
+ if (payload->delete)
+ drm_dp_mst_put_port_malloc(payload->port);
- new_payload->payload_allocation_status = DRM_DP_MST_PAYLOAD_ALLOCATION_NONE;
+ payload->payload_allocation_status = DRM_DP_MST_PAYLOAD_ALLOCATION_NONE;
}
EXPORT_SYMBOL(drm_dp_remove_payload_part2);
/**
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 5f73cdabe7a1..91750c1dfc48 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -583,12 +583,8 @@ static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
struct intel_dp *intel_dp = &dig_port->dp;
struct intel_connector *connector =
to_intel_connector(old_conn_state->connector);
- struct drm_dp_mst_topology_state *old_mst_state =
- drm_atomic_get_old_mst_topology_state(&state->base, &intel_dp->mst_mgr);
struct drm_dp_mst_topology_state *new_mst_state =
drm_atomic_get_new_mst_topology_state(&state->base, &intel_dp->mst_mgr);
- const struct drm_dp_mst_atomic_payload *old_payload =
- drm_atomic_get_mst_payload_state(old_mst_state, connector->port);
struct drm_dp_mst_atomic_payload *new_payload =
drm_atomic_get_mst_payload_state(new_mst_state, connector->port);
struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
@@ -611,8 +607,7 @@ static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
wait_for_act_sent(encoder, old_crtc_state);
- drm_dp_remove_payload_part2(&intel_dp->mst_mgr, new_mst_state,
- old_payload, new_payload);
+ drm_dp_remove_payload_part2(&intel_dp->mst_mgr, new_mst_state, new_payload);
intel_ddi_disable_transcoder_func(old_crtc_state);
diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c
index 6f1b7fcb98e6..63e2a286fffc 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
@@ -889,17 +889,13 @@ nv50_msto_cleanup(struct drm_atomic_state *state,
struct nouveau_drm *drm = nouveau_drm(msto->encoder.dev);
struct drm_dp_mst_atomic_payload *new_payload =
drm_atomic_get_mst_payload_state(new_mst_state, msto->mstc->port);
- struct drm_dp_mst_topology_state *old_mst_state =
- drm_atomic_get_old_mst_topology_state(state, mgr);
- const struct drm_dp_mst_atomic_payload *old_payload =
- drm_atomic_get_mst_payload_state(old_mst_state, msto->mstc->port);
NV_ATOMIC(drm, "%s: msto cleanup\n", msto->encoder.name);
if (msto->disabled) {
msto->mstc = NULL;
msto->disabled = false;
- drm_dp_remove_payload_part2(mgr, new_mst_state, old_payload, new_payload);
+ drm_dp_remove_payload_part2(mgr, new_mst_state, new_payload);
} else if (msto->enabled) {
drm_dp_add_payload_part2(mgr, state, new_payload);
msto->enabled = false;
diff --git a/include/drm/display/drm_dp_mst_helper.h b/include/drm/display/drm_dp_mst_helper.h
index 4429d3b1745b..3f8ad28c77b1 100644
--- a/include/drm/display/drm_dp_mst_helper.h
+++ b/include/drm/display/drm_dp_mst_helper.h
@@ -853,12 +853,11 @@ int drm_dp_add_payload_part2(struct drm_dp_mst_topology_mgr *mgr,
struct drm_atomic_state *state,
struct drm_dp_mst_atomic_payload *payload);
void drm_dp_remove_payload_part1(struct drm_dp_mst_topology_mgr *mgr,
- struct drm_dp_mst_topology_state *mst_state,
- struct drm_dp_mst_atomic_payload *payload);
+ struct drm_dp_mst_topology_state *mst_state,
+ struct drm_dp_mst_atomic_payload *payload);
void drm_dp_remove_payload_part2(struct drm_dp_mst_topology_mgr *mgr,
- struct drm_dp_mst_topology_state *mst_state,
- const struct drm_dp_mst_atomic_payload *old_payload,
- struct drm_dp_mst_atomic_payload *new_payload);
+ struct drm_dp_mst_topology_state *mst_state,
+ struct drm_dp_mst_atomic_payload *payload);
int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr);
--
2.37.3
WARNING: multiple messages have this Message-ID (diff)
From: Wayne Lin <Wayne.Lin@amd.com>
To: <dri-devel@lists.freedesktop.org>, <amd-gfx@lists.freedesktop.org>
Cc: jani.nikula@intel.com, jerry.zuo@amd.com, Wayne Lin <Wayne.Lin@amd.com>
Subject: [PATCH 3/3] drm/mst: adjust the function drm_dp_remove_payload_part2()
Date: Fri, 4 Aug 2023 14:20:29 +0800 [thread overview]
Message-ID: <20230804062029.5686-4-Wayne.Lin@amd.com> (raw)
In-Reply-To: <20230804062029.5686-1-Wayne.Lin@amd.com>
[Why]
Now in drm_dp_remove_payload_part2(), it utilizes the time slot number
of the payload in old state to represent the one in the payload table
at the moment.
It would be better to clarify the idea by using the latest allocated
time slot number for the port at the moment instead and which info is
already included in new mst_state. By this, we can also remove redundant
workaround for amdgpu driver.
[How]
Remove "old_payload" input of drm_dp_remove_payload_part2() and get the
latest number of allocated time slot for the port from new mst_state
instead.
Signed-off-by: Wayne Lin <Wayne.Lin@amd.com>
---
.../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 70 ++++---------------
drivers/gpu/drm/display/drm_dp_mst_topology.c | 32 ++++++---
drivers/gpu/drm/i915/display/intel_dp_mst.c | 7 +-
drivers/gpu/drm/nouveau/dispnv50/disp.c | 6 +-
include/drm/display/drm_dp_mst_helper.h | 9 ++-
5 files changed, 40 insertions(+), 84 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
index 9ad509279b0a..e852da686c26 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
@@ -203,40 +203,6 @@ 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_part2()
- */
- for (i = 0; i < current_link_table.stream_count; i++) {
- dc_alloc =
- ¤t_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.
*/
@@ -248,7 +214,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 *target_payload, *new_payload, old_payload;
+ struct drm_dp_mst_atomic_payload *payload;
struct drm_dp_mst_topology_mgr *mst_mgr;
aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
@@ -262,27 +228,20 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
mst_mgr = &aconnector->mst_root->mst_mgr;
mst_state = to_drm_dp_mst_topology_state(mst_mgr->base.state);
- new_payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
-
- if (enable) {
- target_payload = new_payload;
+ payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
+ if (enable)
/* It's OK for this to fail */
- 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_add_payload_part1(mst_mgr, mst_state, payload);
+ else
- drm_dp_remove_payload_part1(mst_mgr, mst_state, new_payload);
- }
+ drm_dp_remove_payload_part1(mst_mgr, mst_state, 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, target_payload, proposed_table);
+ fill_dc_mst_payload_table_from_drm(stream->link, enable, payload, proposed_table);
return true;
}
@@ -341,7 +300,7 @@ bool dm_helpers_dp_mst_send_payload_allocation(
struct amdgpu_dm_connector *aconnector;
struct drm_dp_mst_topology_state *mst_state;
struct drm_dp_mst_topology_mgr *mst_mgr;
- struct drm_dp_mst_atomic_payload *new_payload, *old_payload;
+ struct drm_dp_mst_atomic_payload *payload;
enum mst_progress_status set_flag = MST_ALLOCATE_NEW_PAYLOAD;
enum mst_progress_status clr_flag = MST_CLEAR_ALLOCATED_PAYLOAD;
int ret = 0;
@@ -354,20 +313,17 @@ bool dm_helpers_dp_mst_send_payload_allocation(
mst_mgr = &aconnector->mst_root->mst_mgr;
mst_state = to_drm_dp_mst_topology_state(mst_mgr->base.state);
- new_payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
+ payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
if (!enable) {
set_flag = MST_CLEAR_ALLOCATED_PAYLOAD;
clr_flag = MST_ALLOCATE_NEW_PAYLOAD;
}
- if (enable) {
- ret = drm_dp_add_payload_part2(mst_mgr, mst_state->base.state, new_payload);
- } else {
- dm_helpers_construct_old_payload(stream->link, mst_state->pbn_div,
- new_payload, old_payload);
- drm_dp_remove_payload_part2(mst_mgr, mst_state, old_payload, new_payload);
- }
+ if (enable)
+ ret = drm_dp_add_payload_part2(mst_mgr, mst_state->base.state, payload);
+ else
+ drm_dp_remove_payload_part2(mst_mgr, mst_state, payload);
if (ret) {
amdgpu_dm_set_mst_status(&aconnector->mst_status,
diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c b/drivers/gpu/drm/display/drm_dp_mst_topology.c
index e04f87ff755a..4270178f95f6 100644
--- a/drivers/gpu/drm/display/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c
@@ -3382,8 +3382,7 @@ EXPORT_SYMBOL(drm_dp_remove_payload_part1);
* drm_dp_remove_payload_part2() - Remove an MST payload locally
* @mgr: Manager to use.
* @mst_state: The MST atomic state
- * @old_payload: The payload with its old state
- * @new_payload: The payload with its latest state
+ * @payload: The payload with its latest state
*
* Updates the starting time slots of all other payloads which would have been shifted towards
* the start of the payload ID table as a result of removing a payload. Driver should call this
@@ -3392,25 +3391,36 @@ EXPORT_SYMBOL(drm_dp_remove_payload_part1);
*/
void drm_dp_remove_payload_part2(struct drm_dp_mst_topology_mgr *mgr,
struct drm_dp_mst_topology_state *mst_state,
- const struct drm_dp_mst_atomic_payload *old_payload,
- struct drm_dp_mst_atomic_payload *new_payload)
+ struct drm_dp_mst_atomic_payload *payload)
{
struct drm_dp_mst_atomic_payload *pos;
+ u8 time_slots_to_remove;
+ u8 next_payload_vc_start = mgr->next_start_slot;
+
+ /* Find the current allocated time slot number of the payload */
+ list_for_each_entry(pos, &mst_state->payloads, next) {
+ if (pos != payload &&
+ pos->vc_start_slot > payload->vc_start_slot &&
+ pos->vc_start_slot < next_payload_vc_start)
+ next_payload_vc_start = pos->vc_start_slot;
+ }
+
+ time_slots_to_remove = next_payload_vc_start - payload->vc_start_slot;
/* Remove local payload allocation */
list_for_each_entry(pos, &mst_state->payloads, next) {
- if (pos != new_payload && pos->vc_start_slot > new_payload->vc_start_slot)
- pos->vc_start_slot -= old_payload->time_slots;
+ if (pos != payload && pos->vc_start_slot > payload->vc_start_slot)
+ pos->vc_start_slot -= time_slots_to_remove;
}
- new_payload->vc_start_slot = -1;
+ payload->vc_start_slot = -1;
mgr->payload_count--;
- mgr->next_start_slot -= old_payload->time_slots;
+ mgr->next_start_slot -= time_slots_to_remove;
- if (new_payload->delete)
- drm_dp_mst_put_port_malloc(new_payload->port);
+ if (payload->delete)
+ drm_dp_mst_put_port_malloc(payload->port);
- new_payload->payload_allocation_status = DRM_DP_MST_PAYLOAD_ALLOCATION_NONE;
+ payload->payload_allocation_status = DRM_DP_MST_PAYLOAD_ALLOCATION_NONE;
}
EXPORT_SYMBOL(drm_dp_remove_payload_part2);
/**
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 5f73cdabe7a1..91750c1dfc48 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -583,12 +583,8 @@ static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
struct intel_dp *intel_dp = &dig_port->dp;
struct intel_connector *connector =
to_intel_connector(old_conn_state->connector);
- struct drm_dp_mst_topology_state *old_mst_state =
- drm_atomic_get_old_mst_topology_state(&state->base, &intel_dp->mst_mgr);
struct drm_dp_mst_topology_state *new_mst_state =
drm_atomic_get_new_mst_topology_state(&state->base, &intel_dp->mst_mgr);
- const struct drm_dp_mst_atomic_payload *old_payload =
- drm_atomic_get_mst_payload_state(old_mst_state, connector->port);
struct drm_dp_mst_atomic_payload *new_payload =
drm_atomic_get_mst_payload_state(new_mst_state, connector->port);
struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
@@ -611,8 +607,7 @@ static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
wait_for_act_sent(encoder, old_crtc_state);
- drm_dp_remove_payload_part2(&intel_dp->mst_mgr, new_mst_state,
- old_payload, new_payload);
+ drm_dp_remove_payload_part2(&intel_dp->mst_mgr, new_mst_state, new_payload);
intel_ddi_disable_transcoder_func(old_crtc_state);
diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c
index 6f1b7fcb98e6..63e2a286fffc 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
@@ -889,17 +889,13 @@ nv50_msto_cleanup(struct drm_atomic_state *state,
struct nouveau_drm *drm = nouveau_drm(msto->encoder.dev);
struct drm_dp_mst_atomic_payload *new_payload =
drm_atomic_get_mst_payload_state(new_mst_state, msto->mstc->port);
- struct drm_dp_mst_topology_state *old_mst_state =
- drm_atomic_get_old_mst_topology_state(state, mgr);
- const struct drm_dp_mst_atomic_payload *old_payload =
- drm_atomic_get_mst_payload_state(old_mst_state, msto->mstc->port);
NV_ATOMIC(drm, "%s: msto cleanup\n", msto->encoder.name);
if (msto->disabled) {
msto->mstc = NULL;
msto->disabled = false;
- drm_dp_remove_payload_part2(mgr, new_mst_state, old_payload, new_payload);
+ drm_dp_remove_payload_part2(mgr, new_mst_state, new_payload);
} else if (msto->enabled) {
drm_dp_add_payload_part2(mgr, state, new_payload);
msto->enabled = false;
diff --git a/include/drm/display/drm_dp_mst_helper.h b/include/drm/display/drm_dp_mst_helper.h
index 4429d3b1745b..3f8ad28c77b1 100644
--- a/include/drm/display/drm_dp_mst_helper.h
+++ b/include/drm/display/drm_dp_mst_helper.h
@@ -853,12 +853,11 @@ int drm_dp_add_payload_part2(struct drm_dp_mst_topology_mgr *mgr,
struct drm_atomic_state *state,
struct drm_dp_mst_atomic_payload *payload);
void drm_dp_remove_payload_part1(struct drm_dp_mst_topology_mgr *mgr,
- struct drm_dp_mst_topology_state *mst_state,
- struct drm_dp_mst_atomic_payload *payload);
+ struct drm_dp_mst_topology_state *mst_state,
+ struct drm_dp_mst_atomic_payload *payload);
void drm_dp_remove_payload_part2(struct drm_dp_mst_topology_mgr *mgr,
- struct drm_dp_mst_topology_state *mst_state,
- const struct drm_dp_mst_atomic_payload *old_payload,
- struct drm_dp_mst_atomic_payload *new_payload);
+ struct drm_dp_mst_topology_state *mst_state,
+ struct drm_dp_mst_atomic_payload *payload);
int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr);
--
2.37.3
next prev parent reply other threads:[~2023-08-04 6:22 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-04 6:20 [PATCH 0/3] Refactor and clean up codes of mst Wayne Lin
2023-08-04 6:20 ` Wayne Lin
2023-08-04 6:20 ` [PATCH 1/3] drm/mst: delete unnecessary case in drm_dp_add_payload_part2() Wayne Lin
2023-08-04 6:20 ` Wayne Lin
2023-08-04 6:20 ` [PATCH 2/3] drm/mst: Refactor the flow for payload allocation/removement Wayne Lin
2023-08-04 6:20 ` Wayne Lin
2023-08-04 9:19 ` kernel test robot
2023-08-04 9:19 ` kernel test robot
2023-08-04 14:47 ` kernel test robot
2023-08-04 14:47 ` kernel test robot
2023-08-04 6:20 ` Wayne Lin [this message]
2023-08-04 6:20 ` [PATCH 3/3] drm/mst: adjust the function drm_dp_remove_payload_part2() Wayne Lin
2023-08-04 15:31 ` Imre Deak
2023-08-04 15:31 ` Imre Deak
2023-08-07 2:43 ` Lin, Wayne
2023-08-07 2:43 ` Lin, Wayne
2023-08-07 15:59 ` Imre Deak
2023-08-07 15:59 ` Imre Deak
2023-08-08 3:47 ` Lin, Wayne
2023-08-08 3:47 ` Lin, Wayne
2023-08-18 17:46 ` Imre Deak
2023-08-18 17:46 ` Imre Deak
2023-08-23 3:16 ` Lin, Wayne
2023-08-23 3:16 ` Lin, Wayne
2023-08-25 13:55 ` Imre Deak
2023-08-25 13:55 ` Imre Deak
2023-09-07 3:44 ` Lin, Wayne
2023-09-07 3:44 ` Lin, Wayne
2023-09-08 19:18 ` Imre Deak
2023-09-08 19:18 ` Imre Deak
2023-09-12 7:26 ` Lin, Wayne
2023-09-12 7:26 ` Lin, Wayne
2023-09-12 11:18 ` Imre Deak
2023-09-12 11:18 ` Imre Deak
2023-09-14 3:29 ` Lin, Wayne
2023-09-14 3:29 ` Lin, Wayne
2023-08-17 21:38 ` Lyude Paul
2023-08-17 21:38 ` Lyude Paul
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230804062029.5686-4-Wayne.Lin@amd.com \
--to=wayne.lin@amd.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=harry.wentland@amd.com \
--cc=imre.deak@intel.com \
--cc=jani.nikula@intel.com \
--cc=jerry.zuo@amd.com \
--cc=ville.syrjala@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.