Loading msm/msm_drv.c +1 −1 Original line number Diff line number Diff line Loading @@ -897,7 +897,7 @@ static int msm_drm_component_init(struct device *dev) drm_mode_config_reset(ddev); if (kms && kms->funcs && kms->funcs->cont_splash_config) { ret = kms->funcs->cont_splash_config(kms); ret = kms->funcs->cont_splash_config(kms, NULL); if (ret) { dev_err(dev, "kms cont_splash config failed.\n"); goto fail; Loading msm/msm_kms.h +2 −1 Original line number Diff line number Diff line Loading @@ -121,7 +121,8 @@ struct msm_kms_funcs { /* destroys debugfs */ void (*debugfs_destroy)(struct msm_kms *kms); /* handle continuous splash */ int (*cont_splash_config)(struct msm_kms *kms); int (*cont_splash_config)(struct msm_kms *kms, struct drm_atomic_state *state); /* check for continuous splash status */ bool (*check_for_splash)(struct msm_kms *kms); /* topology lm information */ Loading msm/sde/sde_kms.c +53 −10 Original line number Diff line number Diff line Loading @@ -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: Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; } Loading msm/sde/sde_kms.h +3 −1 Original line number Diff line number Diff line Loading @@ -704,9 +704,11 @@ int sde_kms_get_io_resources(struct sde_kms *kms, struct msm_io_res *io_res); /** * sde_kms_vm_trusted_resource_init - reserve/initialize the HW/SW resources * @sde_kms: poiner to sde_kms structure * @state: current update atomic commit state * return: 0 on success; error code otherwise */ 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); /** * sde_kms_vm_trusted_resource_deinit - release the HW/SW resources Loading msm/sde/sde_vm.h +9 −0 Original line number Diff line number Diff line Loading @@ -166,6 +166,15 @@ struct sde_vm_ops { * @return - 0 on success, errorcode otherwise */ int (*vm_msg_send)(struct sde_vm *sde_vm, void *msg, size_t msg_size); /** * vm_resource_init - hook to the handler when resource * accept/reclaim fails. * @sde_kms - handle to sde_kms * @state: current update atomic commit state */ int (*vm_resource_init)(struct sde_kms *sde_kms, struct drm_atomic_state *state); }; /** Loading Loading
msm/msm_drv.c +1 −1 Original line number Diff line number Diff line Loading @@ -897,7 +897,7 @@ static int msm_drm_component_init(struct device *dev) drm_mode_config_reset(ddev); if (kms && kms->funcs && kms->funcs->cont_splash_config) { ret = kms->funcs->cont_splash_config(kms); ret = kms->funcs->cont_splash_config(kms, NULL); if (ret) { dev_err(dev, "kms cont_splash config failed.\n"); goto fail; Loading
msm/msm_kms.h +2 −1 Original line number Diff line number Diff line Loading @@ -121,7 +121,8 @@ struct msm_kms_funcs { /* destroys debugfs */ void (*debugfs_destroy)(struct msm_kms *kms); /* handle continuous splash */ int (*cont_splash_config)(struct msm_kms *kms); int (*cont_splash_config)(struct msm_kms *kms, struct drm_atomic_state *state); /* check for continuous splash status */ bool (*check_for_splash)(struct msm_kms *kms); /* topology lm information */ Loading
msm/sde/sde_kms.c +53 −10 Original line number Diff line number Diff line Loading @@ -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: Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; } Loading
msm/sde/sde_kms.h +3 −1 Original line number Diff line number Diff line Loading @@ -704,9 +704,11 @@ int sde_kms_get_io_resources(struct sde_kms *kms, struct msm_io_res *io_res); /** * sde_kms_vm_trusted_resource_init - reserve/initialize the HW/SW resources * @sde_kms: poiner to sde_kms structure * @state: current update atomic commit state * return: 0 on success; error code otherwise */ 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); /** * sde_kms_vm_trusted_resource_deinit - release the HW/SW resources Loading
msm/sde/sde_vm.h +9 −0 Original line number Diff line number Diff line Loading @@ -166,6 +166,15 @@ struct sde_vm_ops { * @return - 0 on success, errorcode otherwise */ int (*vm_msg_send)(struct sde_vm *sde_vm, void *msg, size_t msg_size); /** * vm_resource_init - hook to the handler when resource * accept/reclaim fails. * @sde_kms - handle to sde_kms * @state: current update atomic commit state */ int (*vm_resource_init)(struct sde_kms *sde_kms, struct drm_atomic_state *state); }; /** Loading