Workaround: skip DPMS handling if there is no mode change 97/272797/2
authorMarek Szyprowski <m.szyprowski@samsung.com>
Thu, 24 Mar 2022 12:32:55 +0000 (13:32 +0100)
committerMarek Szyprowski <m.szyprowski@samsung.com>
Fri, 25 Mar 2022 08:33:19 +0000 (09:33 +0100)
Setting DPMS properties causes VC4 to timeout on waiting for the vblank
on HDMI port 0 on RaspberriPi4b with the latest firmware. This is a known
firmware bug, but until it gets fixed, simply skip setting DPMS property
if there is no DPMS mode change.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Change-Id: I00c255c811700070e4d5a86c336cdbc130a0a23e

src/libhal-backend-tdm-vc4/tdm_vc4_display.c
src/libtdm-vc4/tdm_vc4_display.c

index eb92ecf..3db50bb 100644 (file)
@@ -1733,6 +1733,7 @@ hal_tdm_error
 vc4_output_set_dpms(hal_tdm_output *output, hal_tdm_output_dpms dpms_value)
 {
        tdm_vc4_output *output_data = output;
+       hal_tdm_output_dpms cur_dpms_value;
        tdm_vc4_display *display_data;
        int ret;
 
@@ -1743,6 +1744,14 @@ vc4_output_set_dpms(hal_tdm_output *output, hal_tdm_output_dpms dpms_value)
                return HAL_TDM_ERROR_OPERATION_FAILED;
        }
 
+       /*
+        * Workaround for the RPi4 firmware bug, call drmModeObjectSetProperty
+        * only if there is a real DPMS mode change to avoid vblank timeout.
+        */
+       if (vc4_output_get_dpms(output, &cur_dpms_value) == HAL_TDM_ERROR_NONE &&
+           cur_dpms_value == dpms_value)
+               return HAL_TDM_ERROR_NONE;
+
        display_data = output_data->display_data;
        ret = drmModeObjectSetProperty(display_data->drm_fd,
                                                                   output_data->connector_id, DRM_MODE_OBJECT_CONNECTOR,
index 49ab114..4fbad9d 100644 (file)
@@ -1775,6 +1775,7 @@ tdm_error
 vc4_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value)
 {
        tdm_vc4_output_data *output_data = output;
+       tdm_output_dpms cur_dpms_value;
        tdm_vc4_data *vc4_data;
        int ret;
 
@@ -1785,6 +1786,14 @@ vc4_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value)
                return TDM_ERROR_OPERATION_FAILED;
        }
 
+       /*
+        * Workaround for the RPi4 firmware bug, call drmModeObjectSetProperty
+        * only if there is a real DPMS mode change to avoid vblank timeout.
+        */
+       if (vc4_output_get_dpms(output, &cur_dpms_value) == TDM_ERROR_NONE &&
+           cur_dpms_value == dpms_value)
+               return TDM_ERROR_NONE;
+
        vc4_data = output_data->vc4_data;
        ret = drmModeObjectSetProperty(vc4_data->drm_fd,
                                                                   output_data->connector_id, DRM_MODE_OBJECT_CONNECTOR,