Commit 30a24318 authored by Harry Wentland's avatar Harry Wentland Committed by Alex Deucher

drm/amd/display: Skip writeback connector when we get amdgpu_dm_connector

[WHY]
Writeback connectors are based on a different object:
drm_writeback_connector, and are therefore different from
amdgpu_dm_connector. We need to be careful to ensure code
designed for amdgpu_dm_connector doesn't inadvertently try
to operate on a drm_writeback_connector.

[HOW]
Skip them when connector type is DRM_MODE_CONNECTOR_WRITEBACK.
Reviewed-by: default avatarAlex Hung <alex.hung@amd.com>
Signed-off-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Hung <alex.hung@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 19349072
...@@ -726,6 +726,10 @@ static void dmub_hpd_callback(struct amdgpu_device *adev, ...@@ -726,6 +726,10 @@ static void dmub_hpd_callback(struct amdgpu_device *adev,
drm_connector_list_iter_begin(dev, &iter); drm_connector_list_iter_begin(dev, &iter);
drm_for_each_connector_iter(connector, &iter) { drm_for_each_connector_iter(connector, &iter) {
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
aconnector = to_amdgpu_dm_connector(connector); aconnector = to_amdgpu_dm_connector(connector);
if (link && aconnector->dc_link == link) { if (link && aconnector->dc_link == link) {
if (notify->type == DMUB_NOTIFICATION_HPD) if (notify->type == DMUB_NOTIFICATION_HPD)
...@@ -950,6 +954,10 @@ static int amdgpu_dm_audio_component_get_eld(struct device *kdev, int port, ...@@ -950,6 +954,10 @@ static int amdgpu_dm_audio_component_get_eld(struct device *kdev, int port,
drm_connector_list_iter_begin(dev, &conn_iter); drm_connector_list_iter_begin(dev, &conn_iter);
drm_for_each_connector_iter(connector, &conn_iter) { drm_for_each_connector_iter(connector, &conn_iter) {
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
aconnector = to_amdgpu_dm_connector(connector); aconnector = to_amdgpu_dm_connector(connector);
if (aconnector->audio_inst != port) if (aconnector->audio_inst != port)
continue; continue;
...@@ -2291,6 +2299,10 @@ static int detect_mst_link_for_all_connectors(struct drm_device *dev) ...@@ -2291,6 +2299,10 @@ static int detect_mst_link_for_all_connectors(struct drm_device *dev)
drm_connector_list_iter_begin(dev, &iter); drm_connector_list_iter_begin(dev, &iter);
drm_for_each_connector_iter(connector, &iter) { drm_for_each_connector_iter(connector, &iter) {
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
aconnector = to_amdgpu_dm_connector(connector); aconnector = to_amdgpu_dm_connector(connector);
if (aconnector->dc_link->type == dc_connection_mst_branch && if (aconnector->dc_link->type == dc_connection_mst_branch &&
aconnector->mst_mgr.aux) { aconnector->mst_mgr.aux) {
...@@ -2419,6 +2431,10 @@ static void s3_handle_mst(struct drm_device *dev, bool suspend) ...@@ -2419,6 +2431,10 @@ static void s3_handle_mst(struct drm_device *dev, bool suspend)
drm_connector_list_iter_begin(dev, &iter); drm_connector_list_iter_begin(dev, &iter);
drm_for_each_connector_iter(connector, &iter) { drm_for_each_connector_iter(connector, &iter) {
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
aconnector = to_amdgpu_dm_connector(connector); aconnector = to_amdgpu_dm_connector(connector);
if (aconnector->dc_link->type != dc_connection_mst_branch || if (aconnector->dc_link->type != dc_connection_mst_branch ||
aconnector->mst_root) aconnector->mst_root)
...@@ -2945,6 +2961,10 @@ static int dm_resume(void *handle) ...@@ -2945,6 +2961,10 @@ static int dm_resume(void *handle)
/* Do detection*/ /* Do detection*/
drm_connector_list_iter_begin(ddev, &iter); drm_connector_list_iter_begin(ddev, &iter);
drm_for_each_connector_iter(connector, &iter) { drm_for_each_connector_iter(connector, &iter) {
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
aconnector = to_amdgpu_dm_connector(connector); aconnector = to_amdgpu_dm_connector(connector);
if (!aconnector->dc_link) if (!aconnector->dc_link)
...@@ -3518,6 +3538,9 @@ static void register_hpd_handlers(struct amdgpu_device *adev) ...@@ -3518,6 +3538,9 @@ static void register_hpd_handlers(struct amdgpu_device *adev)
list_for_each_entry(connector, list_for_each_entry(connector,
&dev->mode_config.connector_list, head) { &dev->mode_config.connector_list, head) {
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
aconnector = to_amdgpu_dm_connector(connector); aconnector = to_amdgpu_dm_connector(connector);
dc_link = aconnector->dc_link; dc_link = aconnector->dc_link;
...@@ -5556,10 +5579,13 @@ static void fill_stream_properties_from_drm_display_mode( ...@@ -5556,10 +5579,13 @@ static void fill_stream_properties_from_drm_display_mode(
{ {
struct dc_crtc_timing *timing_out = &stream->timing; struct dc_crtc_timing *timing_out = &stream->timing;
const struct drm_display_info *info = &connector->display_info; const struct drm_display_info *info = &connector->display_info;
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); struct amdgpu_dm_connector *aconnector = NULL;
struct hdmi_vendor_infoframe hv_frame; struct hdmi_vendor_infoframe hv_frame;
struct hdmi_avi_infoframe avi_frame; struct hdmi_avi_infoframe avi_frame;
if (connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK)
aconnector = to_amdgpu_dm_connector(connector);
memset(&hv_frame, 0, sizeof(hv_frame)); memset(&hv_frame, 0, sizeof(hv_frame));
memset(&avi_frame, 0, sizeof(avi_frame)); memset(&avi_frame, 0, sizeof(avi_frame));
...@@ -6999,6 +7025,9 @@ static int dm_update_mst_vcpi_slots_for_dsc(struct drm_atomic_state *state, ...@@ -6999,6 +7025,9 @@ static int dm_update_mst_vcpi_slots_for_dsc(struct drm_atomic_state *state,
for_each_new_connector_in_state(state, connector, new_con_state, i) { for_each_new_connector_in_state(state, connector, new_con_state, i) {
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
aconnector = to_amdgpu_dm_connector(connector); aconnector = to_amdgpu_dm_connector(connector);
if (!aconnector->mst_output_port) if (!aconnector->mst_output_port)
...@@ -8555,6 +8584,9 @@ static void amdgpu_dm_commit_audio(struct drm_device *dev, ...@@ -8555,6 +8584,9 @@ static void amdgpu_dm_commit_audio(struct drm_device *dev,
if (!drm_atomic_crtc_needs_modeset(new_crtc_state)) if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
continue; continue;
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
notify: notify:
aconnector = to_amdgpu_dm_connector(connector); aconnector = to_amdgpu_dm_connector(connector);
...@@ -8588,6 +8620,9 @@ static void amdgpu_dm_commit_audio(struct drm_device *dev, ...@@ -8588,6 +8620,9 @@ static void amdgpu_dm_commit_audio(struct drm_device *dev,
if (!status) if (!status)
continue; continue;
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
aconnector = to_amdgpu_dm_connector(connector); aconnector = to_amdgpu_dm_connector(connector);
mutex_lock(&adev->dm.audio_lock); mutex_lock(&adev->dm.audio_lock);
...@@ -8811,7 +8846,12 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state) ...@@ -8811,7 +8846,12 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) { for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) {
struct dm_connector_state *dm_new_con_state = to_dm_connector_state(new_con_state); struct dm_connector_state *dm_new_con_state = to_dm_connector_state(new_con_state);
struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc); struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc);
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); struct amdgpu_dm_connector *aconnector;
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
aconnector = to_amdgpu_dm_connector(connector);
if (!adev->dm.hdcp_workqueue) if (!adev->dm.hdcp_workqueue)
continue; continue;
...@@ -9205,10 +9245,15 @@ static int dm_force_atomic_commit(struct drm_connector *connector) ...@@ -9205,10 +9245,15 @@ static int dm_force_atomic_commit(struct drm_connector *connector)
void dm_restore_drm_connector_state(struct drm_device *dev, void dm_restore_drm_connector_state(struct drm_device *dev,
struct drm_connector *connector) struct drm_connector *connector)
{ {
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); struct amdgpu_dm_connector *aconnector;
struct amdgpu_crtc *disconnected_acrtc; struct amdgpu_crtc *disconnected_acrtc;
struct dm_crtc_state *acrtc_state; struct dm_crtc_state *acrtc_state;
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
return;
aconnector = to_amdgpu_dm_connector(connector);
if (!aconnector->dc_sink || !connector->state || !connector->encoder) if (!aconnector->dc_sink || !connector->state || !connector->encoder)
return; return;
...@@ -9285,12 +9330,16 @@ static void get_freesync_config_for_crtc( ...@@ -9285,12 +9330,16 @@ static void get_freesync_config_for_crtc(
struct dm_connector_state *new_con_state) struct dm_connector_state *new_con_state)
{ {
struct mod_freesync_config config = {0}; struct mod_freesync_config config = {0};
struct amdgpu_dm_connector *aconnector = struct amdgpu_dm_connector *aconnector;
to_amdgpu_dm_connector(new_con_state->base.connector);
struct drm_display_mode *mode = &new_crtc_state->base.mode; struct drm_display_mode *mode = &new_crtc_state->base.mode;
int vrefresh = drm_mode_vrefresh(mode); int vrefresh = drm_mode_vrefresh(mode);
bool fs_vid_mode = false; bool fs_vid_mode = false;
if (new_con_state->base.connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
return;
aconnector = to_amdgpu_dm_connector(new_con_state->base.connector);
new_crtc_state->vrr_supported = new_con_state->freesync_capable && new_crtc_state->vrr_supported = new_con_state->freesync_capable &&
vrefresh >= aconnector->min_vfreq && vrefresh >= aconnector->min_vfreq &&
vrefresh <= aconnector->max_vfreq; vrefresh <= aconnector->max_vfreq;
...@@ -10084,6 +10133,9 @@ static int add_affected_mst_dsc_crtcs(struct drm_atomic_state *state, struct drm ...@@ -10084,6 +10133,9 @@ static int add_affected_mst_dsc_crtcs(struct drm_atomic_state *state, struct drm
if (conn_state->crtc != crtc) if (conn_state->crtc != crtc)
continue; continue;
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
aconnector = to_amdgpu_dm_connector(connector); aconnector = to_amdgpu_dm_connector(connector);
if (!aconnector->mst_output_port || !aconnector->mst_root) if (!aconnector->mst_output_port || !aconnector->mst_root)
aconnector = NULL; aconnector = NULL;
......
...@@ -326,6 +326,9 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name) ...@@ -326,6 +326,9 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name)
if (!connector->state || connector->state->crtc != crtc) if (!connector->state || connector->state->crtc != crtc)
continue; continue;
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
aconn = to_amdgpu_dm_connector(connector); aconn = to_amdgpu_dm_connector(connector);
break; break;
} }
......
...@@ -894,10 +894,15 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev) ...@@ -894,10 +894,15 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
drm_connector_list_iter_begin(dev, &iter); drm_connector_list_iter_begin(dev, &iter);
drm_for_each_connector_iter(connector, &iter) { drm_for_each_connector_iter(connector, &iter) {
struct amdgpu_dm_connector *amdgpu_dm_connector = struct amdgpu_dm_connector *amdgpu_dm_connector;
to_amdgpu_dm_connector(connector); const struct dc_link *dc_link;
const struct dc_link *dc_link = amdgpu_dm_connector->dc_link; if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
amdgpu_dm_connector = to_amdgpu_dm_connector(connector);
dc_link = amdgpu_dm_connector->dc_link;
if (dc_link->irq_source_hpd != DC_IRQ_SOURCE_INVALID) { if (dc_link->irq_source_hpd != DC_IRQ_SOURCE_INVALID) {
dc_interrupt_set(adev->dm.dc, dc_interrupt_set(adev->dm.dc,
...@@ -930,9 +935,14 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev) ...@@ -930,9 +935,14 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev)
drm_connector_list_iter_begin(dev, &iter); drm_connector_list_iter_begin(dev, &iter);
drm_for_each_connector_iter(connector, &iter) { drm_for_each_connector_iter(connector, &iter) {
struct amdgpu_dm_connector *amdgpu_dm_connector = struct amdgpu_dm_connector *amdgpu_dm_connector;
to_amdgpu_dm_connector(connector); const struct dc_link *dc_link;
const struct dc_link *dc_link = amdgpu_dm_connector->dc_link;
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
amdgpu_dm_connector = to_amdgpu_dm_connector(connector);
dc_link = amdgpu_dm_connector->dc_link;
if (dc_link->irq_source_hpd != DC_IRQ_SOURCE_INVALID) { if (dc_link->irq_source_hpd != DC_IRQ_SOURCE_INVALID) {
dc_interrupt_set(adev->dm.dc, dc_interrupt_set(adev->dm.dc,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment