Haven't looked at these quite yet, but I just wanted to say ahead of time that from a quick glance these look like a big step in the right direction :). Awesome work!
I will review this ASAP
On Wed, 2019-09-18 at 16:26 -0400, mikita.lipski@amd.com wrote:
From: Mikita Lipski mikita.lipski@amd.com
[why] In order to comply with new MST atomic check we have to find and add VCPI slots to the state during atomic check whenever their is a change on mode or connector. [how]
- Verify that it is a MST connection
- Convert new stream's clock and bpp
- Calculate PBN based on stream parameters
- Find and add VCPI slots to the state
Cc: Lyude Paul lyude@redhat.com Signed-off-by: Mikita Lipski mikita.lipski@amd.com
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 7b0ca2e1ed8b..d700b962d338 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -4432,6 +4432,65 @@ static int dm_encoder_helper_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state) {
- struct drm_atomic_state *state = crtc_state->state;
- struct drm_connector *connector = conn_state->connector;
- struct amdgpu_dm_connector *aconnector =
to_amdgpu_dm_connector(connector);
- struct dm_crtc_state *dm_new_crtc_state =
to_dm_crtc_state(crtc_state);
- const struct drm_display_mode *adjusted_mode = &crtc_state-
adjusted_mode;
- struct drm_dp_mst_topology_mgr *mst_mgr;
- struct drm_dp_mst_port *mst_port;
- int pbn, slots,clock, bpp = 0;
- if (!dm_new_crtc_state)
return 0;
- if (!aconnector || !aconnector->port)
return 0;
- mst_port = aconnector->port;
- mst_mgr = &aconnector->mst_port->mst_mgr;
- if (!mst_mgr->mst_state)
return 0;
- if (!crtc_state->connectors_changed && !crtc_state->mode_changed)
return 0;
- switch (convert_color_depth_from_display_info(connector, conn_state))
{
- case COLOR_DEPTH_666:
bpp = 6;
break;
- case COLOR_DEPTH_888:
bpp = 8;
break;
- case COLOR_DEPTH_101010:
bpp = 10;
break;
- case COLOR_DEPTH_121212:
bpp = 12;
break;
- case COLOR_DEPTH_141414:
bpp = 14;
break;
- case COLOR_DEPTH_161616:
bpp = 16;
break;
- default:
ASSERT(bpp != 0);
break;
- }
- bpp *= 3;
- clock = adjusted_mode->clock;
- pbn = drm_dp_calc_pbn_mode(clock, bpp);
- slots = drm_dp_atomic_find_vcpi_slots(state,
mst_mgr,
mst_port,
pbn);
- if (slots < 0) {
DRM_DEBUG_KMS("failed finding vcpi slots:%d\n", slots);
return slots;
- } return 0;
}