Lines Matching full:vpu
9 #include "mtk-mdp3-vpu.h"
14 static inline struct mdp_dev *vpu_to_mdp(struct mdp_vpu_dev *vpu) in vpu_to_mdp() argument
16 return container_of(vpu, struct mdp_dev, vpu); in vpu_to_mdp()
19 static int mdp_vpu_shared_mem_alloc(struct mdp_vpu_dev *vpu) in mdp_vpu_shared_mem_alloc() argument
23 if (IS_ERR_OR_NULL(vpu)) in mdp_vpu_shared_mem_alloc()
26 dev = scp_get_device(vpu->scp); in mdp_vpu_shared_mem_alloc()
28 if (!vpu->param) { in mdp_vpu_shared_mem_alloc()
29 vpu->param = dma_alloc_wc(dev, vpu->param_size, in mdp_vpu_shared_mem_alloc()
30 &vpu->param_addr, GFP_KERNEL); in mdp_vpu_shared_mem_alloc()
31 if (!vpu->param) in mdp_vpu_shared_mem_alloc()
35 if (!vpu->work) { in mdp_vpu_shared_mem_alloc()
36 vpu->work = dma_alloc_wc(dev, vpu->work_size, in mdp_vpu_shared_mem_alloc()
37 &vpu->work_addr, GFP_KERNEL); in mdp_vpu_shared_mem_alloc()
38 if (!vpu->work) in mdp_vpu_shared_mem_alloc()
42 if (!vpu->config) { in mdp_vpu_shared_mem_alloc()
43 vpu->config = dma_alloc_wc(dev, vpu->config_size, in mdp_vpu_shared_mem_alloc()
44 &vpu->config_addr, GFP_KERNEL); in mdp_vpu_shared_mem_alloc()
45 if (!vpu->config) in mdp_vpu_shared_mem_alloc()
52 dma_free_wc(dev, vpu->work_size, vpu->work, vpu->work_addr); in mdp_vpu_shared_mem_alloc()
53 vpu->work = NULL; in mdp_vpu_shared_mem_alloc()
55 dma_free_wc(dev, vpu->param_size, vpu->param, vpu->param_addr); in mdp_vpu_shared_mem_alloc()
56 vpu->param = NULL; in mdp_vpu_shared_mem_alloc()
61 void mdp_vpu_shared_mem_free(struct mdp_vpu_dev *vpu) in mdp_vpu_shared_mem_free() argument
65 if (IS_ERR_OR_NULL(vpu)) in mdp_vpu_shared_mem_free()
68 dev = scp_get_device(vpu->scp); in mdp_vpu_shared_mem_free()
70 if (vpu->param && vpu->param_addr) in mdp_vpu_shared_mem_free()
71 dma_free_wc(dev, vpu->param_size, vpu->param, vpu->param_addr); in mdp_vpu_shared_mem_free()
73 if (vpu->work && vpu->work_addr) in mdp_vpu_shared_mem_free()
74 dma_free_wc(dev, vpu->work_size, vpu->work, vpu->work_addr); in mdp_vpu_shared_mem_free()
76 if (vpu->config && vpu->config_addr) in mdp_vpu_shared_mem_free()
77 dma_free_wc(dev, vpu->config_size, vpu->config, vpu->config_addr); in mdp_vpu_shared_mem_free()
84 struct mdp_vpu_dev *vpu = in mdp_vpu_ipi_handle_init_ack() local
87 if (!vpu->work_size) in mdp_vpu_ipi_handle_init_ack()
88 vpu->work_size = msg->work_size; in mdp_vpu_ipi_handle_init_ack()
90 vpu->status = msg->status; in mdp_vpu_ipi_handle_init_ack()
91 complete(&vpu->ipi_acked); in mdp_vpu_ipi_handle_init_ack()
98 struct mdp_vpu_dev *vpu = in mdp_vpu_ipi_handle_deinit_ack() local
101 vpu->status = msg->status; in mdp_vpu_ipi_handle_deinit_ack()
102 complete(&vpu->ipi_acked); in mdp_vpu_ipi_handle_deinit_ack()
111 struct mdp_vpu_dev *vpu = in mdp_vpu_ipi_handle_frame_ack() local
115 struct mdp_dev *mdp = vpu_to_mdp(vpu); in mdp_vpu_ipi_handle_frame_ack()
117 dev_err(&mdp->pdev->dev, "VPU MDP failure:%d\n", param->state); in mdp_vpu_ipi_handle_frame_ack()
119 vpu->status = param->state; in mdp_vpu_ipi_handle_frame_ack()
120 complete(&vpu->ipi_acked); in mdp_vpu_ipi_handle_frame_ack()
165 static int mdp_vpu_sendmsg(struct mdp_vpu_dev *vpu, enum scp_ipi_id id, in mdp_vpu_sendmsg() argument
168 struct mdp_dev *mdp = vpu_to_mdp(vpu); in mdp_vpu_sendmsg()
172 if (!vpu->scp) { in mdp_vpu_sendmsg()
173 dev_dbg(&mdp->pdev->dev, "vpu scp is NULL"); in mdp_vpu_sendmsg()
176 ret = scp_ipi_send(vpu->scp, id, buf, len, 2000); in mdp_vpu_sendmsg()
182 ret = wait_for_completion_timeout(&vpu->ipi_acked, in mdp_vpu_sendmsg()
186 else if (vpu->status) in mdp_vpu_sendmsg()
193 int mdp_vpu_dev_init(struct mdp_vpu_dev *vpu, struct mtk_scp *scp, in mdp_vpu_dev_init() argument
197 .drv_data = (unsigned long)vpu, in mdp_vpu_dev_init()
199 struct mdp_dev *mdp = vpu_to_mdp(vpu); in mdp_vpu_dev_init()
202 init_completion(&vpu->ipi_acked); in mdp_vpu_dev_init()
203 vpu->scp = scp; in mdp_vpu_dev_init()
204 vpu->lock = lock; in mdp_vpu_dev_init()
205 vpu->work_size = 0; in mdp_vpu_dev_init()
206 err = mdp_vpu_sendmsg(vpu, SCP_IPI_MDP_INIT, &msg, sizeof(msg)); in mdp_vpu_dev_init()
209 /* vpu work_size was set in mdp_vpu_ipi_handle_init_ack */ in mdp_vpu_dev_init()
211 mutex_lock(vpu->lock); in mdp_vpu_dev_init()
212 vpu->work_size = ALIGN(vpu->work_size, 64); in mdp_vpu_dev_init()
213 vpu->param_size = ALIGN(sizeof(struct img_ipi_frameparam), 64); in mdp_vpu_dev_init()
214 vpu->config_size = ALIGN(sizeof(struct img_config), 64); in mdp_vpu_dev_init()
215 err = mdp_vpu_shared_mem_alloc(vpu); in mdp_vpu_dev_init()
216 mutex_unlock(vpu->lock); in mdp_vpu_dev_init()
218 dev_err(&mdp->pdev->dev, "VPU memory alloc fail!"); in mdp_vpu_dev_init()
223 "VPU param:%pK pa:%pad sz:%zx, work:%pK pa:%pad sz:%zx, config:%pK pa:%pad sz:%zx", in mdp_vpu_dev_init()
224 vpu->param, &vpu->param_addr, vpu->param_size, in mdp_vpu_dev_init()
225 vpu->work, &vpu->work_addr, vpu->work_size, in mdp_vpu_dev_init()
226 vpu->config, &vpu->config_addr, vpu->config_size); in mdp_vpu_dev_init()
228 msg.work_addr = vpu->work_addr; in mdp_vpu_dev_init()
229 msg.work_size = vpu->work_size; in mdp_vpu_dev_init()
230 err = mdp_vpu_sendmsg(vpu, SCP_IPI_MDP_INIT, &msg, sizeof(msg)); in mdp_vpu_dev_init()
237 switch (vpu->status) { in mdp_vpu_dev_init()
250 int mdp_vpu_dev_deinit(struct mdp_vpu_dev *vpu) in mdp_vpu_dev_deinit() argument
253 .drv_data = (unsigned long)vpu, in mdp_vpu_dev_deinit()
254 .work_addr = vpu->work_addr, in mdp_vpu_dev_deinit()
257 return mdp_vpu_sendmsg(vpu, SCP_IPI_MDP_DEINIT, &msg, sizeof(msg)); in mdp_vpu_dev_deinit()
260 int mdp_vpu_process(struct mdp_vpu_dev *vpu, struct img_ipi_frameparam *param) in mdp_vpu_process() argument
262 struct mdp_dev *mdp = vpu_to_mdp(vpu); in mdp_vpu_process()
265 mutex_lock(vpu->lock); in mdp_vpu_process()
266 if (mdp_vpu_shared_mem_alloc(vpu)) { in mdp_vpu_process()
267 dev_err(&mdp->pdev->dev, "VPU memory alloc fail!"); in mdp_vpu_process()
268 mutex_unlock(vpu->lock); in mdp_vpu_process()
272 memset(vpu->param, 0, vpu->param_size); in mdp_vpu_process()
273 memset(vpu->work, 0, vpu->work_size); in mdp_vpu_process()
274 memset(vpu->config, 0, vpu->config_size); in mdp_vpu_process()
276 param->self_data.va = (unsigned long)vpu->work; in mdp_vpu_process()
277 param->self_data.pa = vpu->work_addr; in mdp_vpu_process()
278 param->config_data.va = (unsigned long)vpu->config; in mdp_vpu_process()
279 param->config_data.pa = vpu->config_addr; in mdp_vpu_process()
280 param->drv_data = (unsigned long)vpu; in mdp_vpu_process()
281 memcpy(vpu->param, param, sizeof(*param)); in mdp_vpu_process()
283 addr.pa = vpu->param_addr; in mdp_vpu_process()
284 addr.va = (unsigned long)vpu->param; in mdp_vpu_process()
285 mutex_unlock(vpu->lock); in mdp_vpu_process()
286 return mdp_vpu_sendmsg(vpu, SCP_IPI_MDP_FRAME, &addr, sizeof(addr)); in mdp_vpu_process()