use Atomic Property for setting crtc 52/256352/2
authorChangyeon Lee <cyeon.lee@samsung.com>
Thu, 1 Apr 2021 08:44:37 +0000 (17:44 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Thu, 1 Apr 2021 10:42:30 +0000 (19:42 +0900)
Change-Id: I0659084a21eb8c45fb4f01cd303d980485b84351

src/libhal-backend-tdm-vc4/tdm_backend_vc4_types.h
src/libhal-backend-tdm-vc4/tdm_vc4_display.c
src/libtdm-vc4/tdm_vc4_display.c
src/libtdm-vc4/tdm_vc4_types.h

index 232b135..ed45909 100644 (file)
@@ -197,6 +197,7 @@ struct _tdm_vc4_output {
 
        int mode_changed;
        const hal_tdm_output_mode *current_mode;
+       unsigned int current_mode_blob_id;
 
        tbm_surface_h crtc_buffer;
        int crtc_enabled;
index 47b59e5..6a9c5a5 100644 (file)
@@ -1596,49 +1596,85 @@ _vc4_layer_make_atomic_request(tdm_vc4_layer *layer_data, drmModeAtomicReqPtr re
 }
 
 static hal_tdm_error
-_vc4_output_atomic_commit(hal_tdm_output *output, int sync, void *user_data)
+_vc4_output_make_atomic_request(tdm_vc4_output *output_data, drmModeAtomicReqPtr request,
+                                                               int *out_fence_fd, uint32_t *flags)
 {
-       tdm_vc4_output *output_data = output;
-       tdm_vc4_layer *layer_data = NULL;
-       tdm_vc4_event *event_data;
-       drmModeAtomicReqPtr request;
-       uint32_t flags =  0;
-       hal_tdm_error ret;
-       int out_fence_fd = -1;
-
-       TDM_BACKEND_RETURN_VAL_IF_FAIL(output_data, HAL_TDM_ERROR_INVALID_PARAMETER);
+       drmModeModeInfoPtr current_mode;
+       int ret;
 
        if (!output_data->crtc_enabled || output_data->mode_changed) {
-               ret = _tdm_vc4_display_set_crtc(output_data->display_data, output_data, 1);
-               if (ret != HAL_TDM_ERROR_NONE) {
-                       TDM_BACKEND_ERR("fail to set crtc.");
-                       return HAL_TDM_ERROR_OPERATION_FAILED;
+               current_mode = _tdm_vc4_display_get_mode(output_data);
+               if (!current_mode) {
+                       TDM_BACKEND_ERR("couldn't find proper mode");
+                       drmModeAtomicFree(request);
+                       return HAL_TDM_ERROR_BAD_REQUEST;
                }
 
-               output_data->crtc_enabled = 1;
-#if 0//TODO: do set crtc with atomic pageflip
-               flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
-               drmModeModeInfoPtr mode;
-               uint32_t blob_id;
+               if (output_data->current_mode_blob_id > 0)
+                       drmModeDestroyPropertyBlob(output_data->display_data->drm_fd, output_data->current_mode_blob_id);
 
-               mode = _tdm_vc4_display_get_mode(output_data);
-               if (!mode) {
-                       TDM_BACKEND_ERR("fail to find the drm mode.");
+               if (drmModeCreatePropertyBlob(output_data->display_data->drm_fd, current_mode,
+                                       sizeof(drmModeModeInfo), &output_data->current_mode_blob_id)) {
+                       TDM_BACKEND_ERR("fail to drmModeCreatePropertyBlob mode");
                        return HAL_TDM_ERROR_OPERATION_FAILED;
                }
 
-               if (drmModeCreatePropertyBlob(output_data->display_data->drm_fd, mode, sizeof(*mode), &blob_id) != 0) {
-                       TDM_BACKEND_ERR("fail to create the Mode PropertyBlob.");
-                       return HAL_TDM_ERROR_OPERATION_FAILED;
+               ret = drmModeAtomicAddProperty(request, output_data->connector_id,
+                                       output_data->atomic_props_ids.crtc_id, output_data->crtc_id);
+               if (ret < 0) {
+                       TDM_BACKEND_ERR("fail to set crtc error:%d", errno);
+                       drmModeAtomicFree(request);
+                       return ret;
                }
 
-               drmModeAtomicAddProperty(request, output_data->output_plane, output_data->props.plane_fb_id,
-                               layer_data->display_buffer->fb_id);
+               ret = drmModeAtomicAddProperty(request, output_data->crtc_id,
+                                       output_data->atomic_props_ids.crtc_mode_id, output_data->current_mode_blob_id);
+               if (ret < 0) {
+                       TDM_BACKEND_ERR("fail to set mode error:%d", errno);
+                       drmModeAtomicFree(request);
+                       return ret;
+               }
+
+               ret = drmModeAtomicAddProperty(request, output_data->crtc_id,
+                                       output_data->atomic_props_ids.crtc_active, 1);
+               if (ret < 0) {
+                       TDM_BACKEND_ERR("fail to set active error:%d", errno);
+                       drmModeAtomicFree(request);
+                       return ret;
+               }
 
                output_data->crtc_enabled = 1;
-#endif
+               output_data->mode_changed = 0;
+
+               _tdm_vc4_output_update_status(output_data, HAL_TDM_OUTPUT_CONN_STATUS_MODE_SETTED);
+
+               *flags |= DRM_MODE_ATOMIC_ALLOW_MODESET;
        }
 
+       ret = drmModeAtomicAddProperty(request, output_data->crtc_id,
+                               output_data->atomic_props_ids.out_fence_ptr, (uintptr_t)out_fence_fd);
+       if (ret < 0) {
+               TDM_BACKEND_ERR("fail to out fence ptr error:%d", errno);
+               drmModeAtomicFree(request);
+               return ret;
+       }
+
+       return HAL_TDM_ERROR_NONE;
+}
+
+static hal_tdm_error
+_vc4_output_atomic_commit(hal_tdm_output *output, int sync, void *user_data)
+{
+       tdm_vc4_output *output_data = output;
+       tdm_vc4_layer *layer_data = NULL;
+       tdm_vc4_event *event_data;
+       drmModeAtomicReqPtr request;
+       uint32_t flags =  0;
+       hal_tdm_error ret;
+       int out_fence_fd = -1;
+
+       TDM_BACKEND_RETURN_VAL_IF_FAIL(output_data, HAL_TDM_ERROR_INVALID_PARAMETER);
+
        request = drmModeAtomicAlloc();
        if (!request) {
                TDM_BACKEND_ERR("drmModeAtomicAlloc failed.");
@@ -1647,9 +1683,9 @@ _vc4_output_atomic_commit(hal_tdm_output *output, int sync, void *user_data)
 
        flags |= DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK;
 
-       ret = drmModeAtomicAddProperty(request, output_data->crtc_id, output_data->atomic_props_ids.out_fence_ptr, (uintptr_t)&out_fence_fd);
-       if (ret < 0) {
-               TDM_BACKEND_ERR("fail to out fence ptr error:%d", errno);
+       ret = _vc4_output_make_atomic_request(output_data, request, &out_fence_fd, &flags);
+       if (ret != HAL_TDM_ERROR_NONE) {
+               TDM_BACKEND_ERR("_vc4_output_make_atomic_request failed.");
                drmModeAtomicFree(request);
                return ret;
        }
index dce6eab..a76f3c0 100644 (file)
@@ -1657,49 +1657,85 @@ _vc4_layer_make_atomic_request(tdm_vc4_layer_data *layer_data, drmModeAtomicReqP
 }
 
 static tdm_error
-_vc4_output_atomic_commit(tdm_output *output, int sync, void *user_data)
+_vc4_output_make_atomic_request(tdm_vc4_output_data *output_data, drmModeAtomicReqPtr request,
+                                                               int *out_fence_fd, uint32_t *flags)
 {
-       tdm_vc4_output_data *output_data = output;
-       tdm_vc4_layer_data *layer_data = NULL;
-       tdm_vc4_event_data *event_data;
-       drmModeAtomicReqPtr request;
-       uint32_t flags =  0;
-       tdm_error ret;
-       int out_fence_fd = -1;
-
-       RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+       drmModeModeInfoPtr current_mode;
+       int ret;
 
        if (!output_data->crtc_enabled || output_data->mode_changed) {
-               ret = _tdm_vc4_display_set_crtc(output_data->vc4_data, output_data, 1);
-               if (ret != TDM_ERROR_NONE) {
-                       TDM_ERR("fail to set crtc.");
-                       return TDM_ERROR_OPERATION_FAILED;
+               current_mode = _tdm_vc4_display_get_mode(output_data);
+               if (!current_mode) {
+                       TDM_ERR("couldn't find proper mode");
+                       drmModeAtomicFree(request);
+                       return TDM_ERROR_BAD_REQUEST;
                }
 
-               output_data->crtc_enabled = 1;
-#if 0//TODO: do set crtc with atomic pageflip
-               flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
-               drmModeModeInfoPtr mode;
-               uint32_t blob_id;
+               if (output_data->current_mode_blob_id > 0)
+                       drmModeDestroyPropertyBlob(output_data->vc4_data->drm_fd, output_data->current_mode_blob_id);
 
-               mode = _tdm_vc4_display_get_mode(output_data);
-               if (!mode) {
-                       TDM_ERR("fail to find the drm mode.");
+               if (drmModeCreatePropertyBlob(output_data->vc4_data->drm_fd, current_mode,
+                                       sizeof(drmModeModeInfo), &output_data->current_mode_blob_id)) {
+                       TDM_ERR("fail to drmModeCreatePropertyBlob mode");
                        return TDM_ERROR_OPERATION_FAILED;
                }
 
-               if (drmModeCreatePropertyBlob(output_data->vc4_data->drm_fd, mode, sizeof(*mode), &blob_id) != 0) {
-                       TDM_ERR("fail to create the Mode PropertyBlob.");
-                       return TDM_ERROR_OPERATION_FAILED;
+               ret = drmModeAtomicAddProperty(request, output_data->connector_id,
+                                       output_data->atomic_props_ids.crtc_id, output_data->crtc_id);
+               if (ret < 0) {
+                       TDM_ERR("fail to set crtc error:%d", errno);
+                       drmModeAtomicFree(request);
+                       return ret;
                }
 
-               drmModeAtomicAddProperty(request, output_data->output_plane, output_data->props.plane_fb_id,
-                               layer_data->display_buffer->fb_id);
+               ret = drmModeAtomicAddProperty(request, output_data->crtc_id,
+                                       output_data->atomic_props_ids.crtc_mode_id, output_data->current_mode_blob_id);
+               if (ret < 0) {
+                       TDM_ERR("fail to set mode error:%d", errno);
+                       drmModeAtomicFree(request);
+                       return ret;
+               }
+
+               ret = drmModeAtomicAddProperty(request, output_data->crtc_id,
+                                       output_data->atomic_props_ids.crtc_active, 1);
+               if (ret < 0) {
+                       TDM_ERR("fail to set active error:%d", errno);
+                       drmModeAtomicFree(request);
+                       return ret;
+               }
 
                output_data->crtc_enabled = 1;
-#endif
+               output_data->mode_changed = 0;
+
+               _tdm_vc4_output_update_status(output_data, TDM_OUTPUT_CONN_STATUS_MODE_SETTED);
+
+               *flags |= DRM_MODE_ATOMIC_ALLOW_MODESET;
        }
 
+       ret = drmModeAtomicAddProperty(request, output_data->crtc_id,
+                               output_data->atomic_props_ids.out_fence_ptr, (uintptr_t)out_fence_fd);
+       if (ret < 0) {
+               TDM_ERR("fail to out fence ptr error:%d", errno);
+               drmModeAtomicFree(request);
+               return ret;
+       }
+
+       return TDM_ERROR_NONE;
+}
+
+static tdm_error
+_vc4_output_atomic_commit(tdm_output *output, int sync, void *user_data)
+{
+       tdm_vc4_output_data *output_data = output;
+       tdm_vc4_layer_data *layer_data = NULL;
+       tdm_vc4_event_data *event_data;
+       drmModeAtomicReqPtr request;
+       uint32_t flags =  0;
+       tdm_error ret;
+       int out_fence_fd = -1;
+
+       RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+
        request = drmModeAtomicAlloc();
        if (!request) {
                TDM_ERR("drmModeAtomicAlloc failed.");
@@ -1708,9 +1744,9 @@ _vc4_output_atomic_commit(tdm_output *output, int sync, void *user_data)
 
        flags |= DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK;
 
-       ret = drmModeAtomicAddProperty(request, output_data->crtc_id, output_data->atomic_props_ids.out_fence_ptr, (uintptr_t)&out_fence_fd);
-       if (ret < 0) {
-               TDM_ERR("fail to out fence ptr error:%d", errno);
+       ret = _vc4_output_make_atomic_request(output_data, request, &out_fence_fd, &flags);
+       if (ret != TDM_ERROR_NONE) {
+               TDM_ERR("_vc4_output_make_atomic_request failed.");
                drmModeAtomicFree(request);
                return ret;
        }
index 040be6e..537ba23 100644 (file)
@@ -208,6 +208,7 @@ struct _tdm_vc4_output_data {
 
        int mode_changed;
        const tdm_output_mode *current_mode;
+       unsigned int current_mode_blob_id;
 
        tbm_surface_h crtc_buffer;
        int crtc_enabled;