static int mdss_mdp_overlay_rotator_setup(struct msm_fb_data_type *mfd, struct mdp_overlay *req) { struct mdss_mdp_rotator_session *rot; struct mdss_mdp_format_params *fmt; int ret = 0; pr_debug("rot ctl=%u req id=%x\n", mfd->ctl->num, req->id); fmt = mdss_mdp_get_format_params(req->src.format); if (!fmt) { pr_err("invalid rot format %d\n", req->src.format); return -EINVAL; } ret = mdss_mdp_overlay_req_check(mfd, req, fmt); if (ret) return ret; if (req->id == MSMFB_NEW_REQUEST) { rot = mdss_mdp_rotator_session_alloc(); if (!rot) { pr_err("unable to allocate rotator session\n"); return -ENOMEM; } } else if (req->id & MDSS_MDP_ROT_SESSION_MASK) { rot = mdss_mdp_rotator_session_get(req->id); if (!rot) { pr_err("rotator session=%x not found\n", req->id); return -ENODEV; } } else { pr_err("invalid rotator session id=%x\n", req->id); return -EINVAL; } rot->rotations = req->flags & (MDP_ROT_90 | MDP_FLIP_LR | MDP_FLIP_UD); rot->format = fmt->format; rot->img_width = req->src.width; rot->img_height = req->src.height; rot->src_rect.x = req->src_rect.x; rot->src_rect.y = req->src_rect.y; rot->src_rect.w = req->src_rect.w; rot->src_rect.h = req->src_rect.h; rot->params_changed++; req->id = rot->session_id; return ret; }
struct msm_sync_pt_data *mdss_mdp_rotator_sync_pt_get( struct msm_fb_data_type *mfd, const struct mdp_buf_sync *buf_sync) { struct mdss_mdp_rotator_session *rot; rot = mdss_mdp_rotator_session_get(buf_sync->session_id); if (!rot) return NULL; if (!rot->rot_sync_pt_data) rot->rot_sync_pt_data = mdss_mdp_rotator_sync_pt_create(rot); if (rot->rot_sync_pt_data) rot->use_sync_pt = true; return rot->rot_sync_pt_data; }
static int mdss_mdp_overlay_unset(struct msm_fb_data_type *mfd, int ndx) { struct mdss_mdp_pipe *pipe; struct mdss_mdp_pipe *cleanup_pipes[MDSS_MDP_MAX_SSPP]; int i, ret = 0, clean_cnt = 0; u32 pipe_ndx, unset_ndx = 0; if (!mfd || !mfd->ctl) return -ENODEV; pr_debug("unset ndx=%x\n", ndx); if (ndx & MDSS_MDP_ROT_SESSION_MASK) { struct mdss_mdp_rotator_session *rot; rot = mdss_mdp_rotator_session_get(ndx); if (rot) { mdss_mdp_rotator_finish(rot); } else { pr_warn("unknown session id=%x\n", ndx); ret = -ENODEV; } return ret; } for (i = 0; unset_ndx != ndx && i < MDSS_MDP_MAX_SSPP; i++) { pipe_ndx = BIT(i); if (pipe_ndx & ndx) { unset_ndx |= pipe_ndx; pipe = mdss_mdp_pipe_get_locked(pipe_ndx); if (pipe) { mdss_mdp_mixer_pipe_unstage(pipe); cleanup_pipes[clean_cnt++] = pipe; } else { pr_warn("unknown pipe ndx=%x\n", pipe_ndx); } } } if (clean_cnt) { ret = mfd->kickoff_fnc(mfd->ctl); for (i = 0; i < clean_cnt; i++) mdss_mdp_pipe_destroy(cleanup_pipes[i]); } return ret; }
static int mdss_mdp_overlay_rotate(struct msmfb_overlay_data *req, struct mdss_mdp_data *src_data, struct mdss_mdp_data *dst_data) { struct mdss_mdp_rotator_session *rot; int ret; rot = mdss_mdp_rotator_session_get(req->id); if (!rot) { pr_err("invalid session id=%x\n", req->id); return -ENODEV; } ret = mdss_mdp_rotator_queue(rot, src_data, dst_data); if (ret) { pr_err("rotator queue error session id=%x\n", req->id); return ret; } return 0; }