Lines Matching full:vpu

9 #include "mtk-mdp3-vpu.h"
15 static inline struct mdp_dev *vpu_to_mdp(struct mdp_vpu_dev *vpu) in vpu_to_mdp() argument
17 return container_of(vpu, struct mdp_dev, vpu); in vpu_to_mdp()
20 static int mdp_vpu_shared_mem_alloc(struct mdp_vpu_dev *vpu) in mdp_vpu_shared_mem_alloc() argument
22 if (vpu->work && vpu->work_addr) in mdp_vpu_shared_mem_alloc()
25 vpu->work = dma_alloc_coherent(scp_get_device(vpu->scp), vpu_alloc_size, in mdp_vpu_shared_mem_alloc()
26 &vpu->work_addr, GFP_KERNEL); in mdp_vpu_shared_mem_alloc()
28 if (!vpu->work) in mdp_vpu_shared_mem_alloc()
34 void mdp_vpu_shared_mem_free(struct mdp_vpu_dev *vpu) in mdp_vpu_shared_mem_free() argument
36 if (vpu->work && vpu->work_addr) in mdp_vpu_shared_mem_free()
37 dma_free_coherent(scp_get_device(vpu->scp), vpu_alloc_size, in mdp_vpu_shared_mem_free()
38 vpu->work, vpu->work_addr); in mdp_vpu_shared_mem_free()
45 struct mdp_vpu_dev *vpu = in mdp_vpu_ipi_handle_init_ack() local
48 if (!vpu->work_size) in mdp_vpu_ipi_handle_init_ack()
49 vpu->work_size = msg->work_size; in mdp_vpu_ipi_handle_init_ack()
51 vpu->status = msg->status; in mdp_vpu_ipi_handle_init_ack()
52 complete(&vpu->ipi_acked); in mdp_vpu_ipi_handle_init_ack()
59 struct mdp_vpu_dev *vpu = in mdp_vpu_ipi_handle_deinit_ack() local
62 vpu->status = msg->status; in mdp_vpu_ipi_handle_deinit_ack()
63 complete(&vpu->ipi_acked); in mdp_vpu_ipi_handle_deinit_ack()
78 dev_err(&mdp->pdev->dev, "VPU MDP failure:%d\n", param->state); in mdp_vpu_ipi_handle_frame_ack()
126 static int mdp_vpu_sendmsg(struct mdp_vpu_dev *vpu, enum scp_ipi_id id, in mdp_vpu_sendmsg() argument
129 struct mdp_dev *mdp = vpu_to_mdp(vpu); in mdp_vpu_sendmsg()
133 if (!vpu->scp) { in mdp_vpu_sendmsg()
134 dev_dbg(&mdp->pdev->dev, "vpu scp is NULL"); in mdp_vpu_sendmsg()
137 ret = scp_ipi_send(vpu->scp, id, buf, len, 2000); in mdp_vpu_sendmsg()
143 ret = wait_for_completion_timeout(&vpu->ipi_acked, in mdp_vpu_sendmsg()
147 else if (vpu->status) in mdp_vpu_sendmsg()
154 int mdp_vpu_dev_init(struct mdp_vpu_dev *vpu, struct mtk_scp *scp, in mdp_vpu_dev_init() argument
158 .drv_data = (unsigned long)vpu, in mdp_vpu_dev_init()
163 struct mdp_dev *mdp = vpu_to_mdp(vpu); in mdp_vpu_dev_init()
166 init_completion(&vpu->ipi_acked); in mdp_vpu_dev_init()
167 vpu->scp = scp; in mdp_vpu_dev_init()
168 vpu->lock = lock; in mdp_vpu_dev_init()
169 vpu->work_size = 0; in mdp_vpu_dev_init()
170 err = mdp_vpu_sendmsg(vpu, SCP_IPI_MDP_INIT, &msg, sizeof(msg)); in mdp_vpu_dev_init()
173 /* vpu work_size was set in mdp_vpu_ipi_handle_init_ack */ in mdp_vpu_dev_init()
176 err = mdp_vpu_shared_mem_alloc(vpu); in mdp_vpu_dev_init()
178 dev_err(&mdp->pdev->dev, "VPU memory alloc fail!"); in mdp_vpu_dev_init()
182 pool = ALIGN((uintptr_t)vpu->work + vpu->work_size, 8); in mdp_vpu_dev_init()
183 if (pool + pool_size - (uintptr_t)vpu->work > mem_size) { in mdp_vpu_dev_init()
185 "VPU memory insufficient: %zx + %zx > %zx", in mdp_vpu_dev_init()
186 vpu->work_size, pool_size, mem_size); in mdp_vpu_dev_init()
192 "VPU work:%pK pa:%pad sz:%zx pool:%pa sz:%zx (mem sz:%zx)", in mdp_vpu_dev_init()
193 vpu->work, &vpu->work_addr, vpu->work_size, in mdp_vpu_dev_init()
195 vpu->pool = (struct mdp_config_pool *)(uintptr_t)pool; in mdp_vpu_dev_init()
196 msg.work_addr = vpu->work_addr; in mdp_vpu_dev_init()
197 msg.work_size = vpu->work_size; in mdp_vpu_dev_init()
198 err = mdp_vpu_sendmsg(vpu, SCP_IPI_MDP_INIT, &msg, sizeof(msg)); in mdp_vpu_dev_init()
202 memset(vpu->pool, 0, sizeof(*vpu->pool)); in mdp_vpu_dev_init()
206 switch (vpu->status) { in mdp_vpu_dev_init()
220 int mdp_vpu_dev_deinit(struct mdp_vpu_dev *vpu) in mdp_vpu_dev_deinit() argument
223 .drv_data = (unsigned long)vpu, in mdp_vpu_dev_deinit()
224 .work_addr = vpu->work_addr, in mdp_vpu_dev_deinit()
227 return mdp_vpu_sendmsg(vpu, SCP_IPI_MDP_DEINIT, &msg, sizeof(msg)); in mdp_vpu_dev_deinit()
230 static struct img_config *mdp_config_get(struct mdp_vpu_dev *vpu, in mdp_config_get() argument
238 mutex_lock(vpu->lock); in mdp_config_get()
239 vpu->pool->cfg_count[id]++; in mdp_config_get()
240 config = &vpu->pool->configs[id]; in mdp_config_get()
241 *addr = vpu->work_addr + ((uintptr_t)config - (uintptr_t)vpu->work); in mdp_config_get()
242 mutex_unlock(vpu->lock); in mdp_config_get()
247 static int mdp_config_put(struct mdp_vpu_dev *vpu, in mdp_config_put() argument
255 if (vpu->lock) in mdp_config_put()
256 mutex_lock(vpu->lock); in mdp_config_put()
257 if (!vpu->pool->cfg_count[id] || config != &vpu->pool->configs[id]) in mdp_config_put()
260 vpu->pool->cfg_count[id]--; in mdp_config_put()
261 if (vpu->lock) in mdp_config_put()
262 mutex_unlock(vpu->lock); in mdp_config_put()
266 int mdp_vpu_ctx_init(struct mdp_vpu_ctx *ctx, struct mdp_vpu_dev *vpu, in mdp_vpu_ctx_init() argument
269 ctx->config = mdp_config_get(vpu, id, &ctx->inst_addr); in mdp_vpu_ctx_init()
277 ctx->vpu_dev = vpu; in mdp_vpu_ctx_init()
293 struct mdp_vpu_dev *vpu = ctx->vpu_dev; in mdp_vpu_process() local
294 struct mdp_dev *mdp = vpu_to_mdp(vpu); in mdp_vpu_process()
298 if (mdp_vpu_shared_mem_alloc(vpu)) { in mdp_vpu_process()
299 dev_err(&mdp->pdev->dev, "VPU memory alloc fail!"); in mdp_vpu_process()