|
@@ -2648,6 +2648,9 @@ static int sde_kms_check_vm_request(struct msm_kms *kms,
|
|
|
vm_ops->vm_owns_hw(sde_kms), rc);
|
|
|
goto end;
|
|
|
}
|
|
|
+
|
|
|
+ if (vm_ops->vm_resource_init)
|
|
|
+ rc = vm_ops->vm_resource_init(sde_kms, state);
|
|
|
}
|
|
|
|
|
|
end:
|
|
@@ -3048,7 +3051,44 @@ static int sde_kms_vm_trusted_cont_splash_res_init(struct sde_kms *sde_kms)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int sde_kms_cont_splash_config(struct msm_kms *kms)
|
|
|
+static struct drm_display_mode *_sde_kms_get_splash_mode(
|
|
|
+ struct sde_kms *sde_kms, struct drm_connector *connector,
|
|
|
+ struct drm_atomic_state *state)
|
|
|
+{
|
|
|
+ struct drm_display_mode *mode, *cur_mode = NULL;
|
|
|
+ struct drm_crtc *crtc;
|
|
|
+ struct drm_crtc_state *new_cstate, *old_cstate;
|
|
|
+ u32 i = 0;
|
|
|
+
|
|
|
+ if (sde_kms->splash_data.type == SDE_SPLASH_HANDOFF) {
|
|
|
+ list_for_each_entry(mode, &connector->modes, head) {
|
|
|
+ if (mode->type & DRM_MODE_TYPE_PREFERRED) {
|
|
|
+ cur_mode = mode;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (state) {
|
|
|
+ /* get the mode from first atomic_check phase for trusted_vm*/
|
|
|
+ for_each_oldnew_crtc_in_state(state, crtc, old_cstate,
|
|
|
+ new_cstate, i) {
|
|
|
+
|
|
|
+ if (!new_cstate->active && !old_cstate->active)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ list_for_each_entry(mode, &connector->modes, head) {
|
|
|
+ if (drm_mode_equal(&new_cstate->mode, mode)) {
|
|
|
+ cur_mode = mode;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return cur_mode;
|
|
|
+}
|
|
|
+
|
|
|
+static int sde_kms_cont_splash_config(struct msm_kms *kms,
|
|
|
+ struct drm_atomic_state *state)
|
|
|
{
|
|
|
void *display;
|
|
|
struct dsi_display *dsi_display;
|
|
@@ -3163,12 +3203,16 @@ static int sde_kms_cont_splash_config(struct msm_kms *kms)
|
|
|
|
|
|
crtc->state->encoder_mask = (1 << drm_encoder_index(encoder));
|
|
|
|
|
|
- /* currently consider modes[0] as the preferred mode */
|
|
|
- drm_mode = list_first_entry(&connector->modes,
|
|
|
- struct drm_display_mode, head);
|
|
|
- SDE_DEBUG("drm_mode->name = %s, type=0x%x, flags=0x%x\n",
|
|
|
+ drm_mode = _sde_kms_get_splash_mode(sde_kms, connector, state);
|
|
|
+ if (!drm_mode) {
|
|
|
+ SDE_ERROR("drm_mode not found; handoff_type:%d\n",
|
|
|
+ sde_kms->splash_data.type);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ SDE_DEBUG(
|
|
|
+ "drm_mode->name:%s, type:0x%x, flags:0x%x, handoff_type:%d\n",
|
|
|
drm_mode->name, drm_mode->type,
|
|
|
- drm_mode->flags);
|
|
|
+ drm_mode->flags, sde_kms->splash_data.type);
|
|
|
|
|
|
/* Update CRTC drm structure */
|
|
|
crtc->state->active = true;
|
|
@@ -4550,7 +4594,8 @@ void sde_kms_vm_trusted_resource_deinit(struct sde_kms *sde_kms)
|
|
|
memset(&sde_kms->splash_data, 0, sizeof(struct sde_splash_data));
|
|
|
}
|
|
|
|
|
|
-int sde_kms_vm_trusted_resource_init(struct sde_kms *sde_kms)
|
|
|
+int sde_kms_vm_trusted_resource_init(struct sde_kms *sde_kms,
|
|
|
+ struct drm_atomic_state *state)
|
|
|
{
|
|
|
struct drm_device *dev;
|
|
|
struct msm_drm_private *priv;
|
|
@@ -4591,7 +4636,7 @@ int sde_kms_vm_trusted_resource_init(struct sde_kms *sde_kms)
|
|
|
goto error;
|
|
|
}
|
|
|
|
|
|
- ret = sde_kms_cont_splash_config(&sde_kms->base);
|
|
|
+ ret = sde_kms_cont_splash_config(&sde_kms->base, state);
|
|
|
if (ret) {
|
|
|
SDE_ERROR("error in setting handoff configs\n");
|
|
|
goto error;
|
|
@@ -4606,8 +4651,6 @@ int sde_kms_vm_trusted_resource_init(struct sde_kms *sde_kms)
|
|
|
return 0;
|
|
|
|
|
|
error:
|
|
|
- sde_kms_vm_trusted_resource_deinit(sde_kms);
|
|
|
-
|
|
|
return ret;
|
|
|
}
|
|
|
|