Lines Matching refs:ipu_plane
23 #define to_ipu_plane(x) container_of(x, struct ipu_plane, base)
38 int ipu_plane_irq(struct ipu_plane *ipu_plane) in ipu_plane_irq() argument
40 return ipu_idmac_channel_irq(ipu_plane->ipu, ipu_plane->ipu_ch, in ipu_plane_irq()
62 int ipu_plane_set_base(struct ipu_plane *ipu_plane, struct drm_framebuffer *fb, in ipu_plane_set_base() argument
75 dev_dbg(ipu_plane->base.dev->dev, "phys = %pad, x = %d, y = %d", in ipu_plane_set_base()
81 if (ipu_plane->enabled) { in ipu_plane_set_base()
82 active = ipu_idmac_get_current_buffer(ipu_plane->ipu_ch); in ipu_plane_set_base()
83 ipu_cpmem_set_buffer(ipu_plane->ipu_ch, !active, eba); in ipu_plane_set_base()
84 ipu_idmac_select_buffer(ipu_plane->ipu_ch, !active); in ipu_plane_set_base()
86 ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 0, eba); in ipu_plane_set_base()
87 ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 1, eba); in ipu_plane_set_base()
91 ipu_plane->x = x; in ipu_plane_set_base()
92 ipu_plane->y = y; in ipu_plane_set_base()
97 int ipu_plane_mode_set(struct ipu_plane *ipu_plane, struct drm_crtc *crtc, in ipu_plane_mode_set() argument
104 struct device *dev = ipu_plane->base.dev->dev; in ipu_plane_mode_set()
141 if (crtc_w < 13 && (ipu_plane->dp_flow != IPU_DP_FLOW_SYNC_FG)) in ipu_plane_mode_set()
150 if (ipu_plane->enabled) { in ipu_plane_mode_set()
151 if (src_w != ipu_plane->w || src_h != ipu_plane->h || in ipu_plane_mode_set()
152 fb->pixel_format != ipu_plane->base.fb->pixel_format) in ipu_plane_mode_set()
155 return ipu_plane_set_base(ipu_plane, fb, src_x, src_y); in ipu_plane_mode_set()
158 switch (ipu_plane->dp_flow) { in ipu_plane_mode_set()
160 ret = ipu_dp_setup_channel(ipu_plane->dp, in ipu_plane_mode_set()
169 ipu_dp_set_global_alpha(ipu_plane->dp, true, 0, true); in ipu_plane_mode_set()
172 ipu_dp_setup_channel(ipu_plane->dp, in ipu_plane_mode_set()
175 ipu_dp_set_window_pos(ipu_plane->dp, crtc_x, crtc_y); in ipu_plane_mode_set()
180 ipu_dp_set_global_alpha(ipu_plane->dp, false, 0, false); in ipu_plane_mode_set()
187 ret = ipu_dmfc_init_channel(ipu_plane->dmfc, crtc_w); in ipu_plane_mode_set()
193 ret = ipu_dmfc_alloc_bandwidth(ipu_plane->dmfc, in ipu_plane_mode_set()
201 ipu_cpmem_zero(ipu_plane->ipu_ch); in ipu_plane_mode_set()
202 ipu_cpmem_set_resolution(ipu_plane->ipu_ch, src_w, src_h); in ipu_plane_mode_set()
203 ret = ipu_cpmem_set_fmt(ipu_plane->ipu_ch, fb->pixel_format); in ipu_plane_mode_set()
209 ipu_cpmem_set_high_priority(ipu_plane->ipu_ch); in ipu_plane_mode_set()
210 ipu_idmac_set_double_buffer(ipu_plane->ipu_ch, 1); in ipu_plane_mode_set()
211 ipu_cpmem_set_stride(ipu_plane->ipu_ch, fb->pitches[0]); in ipu_plane_mode_set()
213 ret = ipu_plane_set_base(ipu_plane, fb, src_x, src_y); in ipu_plane_mode_set()
217 ipu_cpmem_interlaced_scan(ipu_plane->ipu_ch, fb->pitches[0]); in ipu_plane_mode_set()
219 ipu_plane->w = src_w; in ipu_plane_mode_set()
220 ipu_plane->h = src_h; in ipu_plane_mode_set()
225 void ipu_plane_put_resources(struct ipu_plane *ipu_plane) in ipu_plane_put_resources() argument
227 if (!IS_ERR_OR_NULL(ipu_plane->dp)) in ipu_plane_put_resources()
228 ipu_dp_put(ipu_plane->dp); in ipu_plane_put_resources()
229 if (!IS_ERR_OR_NULL(ipu_plane->dmfc)) in ipu_plane_put_resources()
230 ipu_dmfc_put(ipu_plane->dmfc); in ipu_plane_put_resources()
231 if (!IS_ERR_OR_NULL(ipu_plane->ipu_ch)) in ipu_plane_put_resources()
232 ipu_idmac_put(ipu_plane->ipu_ch); in ipu_plane_put_resources()
235 int ipu_plane_get_resources(struct ipu_plane *ipu_plane) in ipu_plane_get_resources() argument
239 ipu_plane->ipu_ch = ipu_idmac_get(ipu_plane->ipu, ipu_plane->dma); in ipu_plane_get_resources()
240 if (IS_ERR(ipu_plane->ipu_ch)) { in ipu_plane_get_resources()
241 ret = PTR_ERR(ipu_plane->ipu_ch); in ipu_plane_get_resources()
246 ipu_plane->dmfc = ipu_dmfc_get(ipu_plane->ipu, ipu_plane->dma); in ipu_plane_get_resources()
247 if (IS_ERR(ipu_plane->dmfc)) { in ipu_plane_get_resources()
248 ret = PTR_ERR(ipu_plane->dmfc); in ipu_plane_get_resources()
253 if (ipu_plane->dp_flow >= 0) { in ipu_plane_get_resources()
254 ipu_plane->dp = ipu_dp_get(ipu_plane->ipu, ipu_plane->dp_flow); in ipu_plane_get_resources()
255 if (IS_ERR(ipu_plane->dp)) { in ipu_plane_get_resources()
256 ret = PTR_ERR(ipu_plane->dp); in ipu_plane_get_resources()
264 ipu_plane_put_resources(ipu_plane); in ipu_plane_get_resources()
269 void ipu_plane_enable(struct ipu_plane *ipu_plane) in ipu_plane_enable() argument
271 if (ipu_plane->dp) in ipu_plane_enable()
272 ipu_dp_enable(ipu_plane->ipu); in ipu_plane_enable()
273 ipu_dmfc_enable_channel(ipu_plane->dmfc); in ipu_plane_enable()
274 ipu_idmac_enable_channel(ipu_plane->ipu_ch); in ipu_plane_enable()
275 if (ipu_plane->dp) in ipu_plane_enable()
276 ipu_dp_enable_channel(ipu_plane->dp); in ipu_plane_enable()
278 ipu_plane->enabled = true; in ipu_plane_enable()
281 void ipu_plane_disable(struct ipu_plane *ipu_plane) in ipu_plane_disable() argument
283 ipu_plane->enabled = false; in ipu_plane_disable()
285 ipu_idmac_wait_busy(ipu_plane->ipu_ch, 50); in ipu_plane_disable()
287 if (ipu_plane->dp) in ipu_plane_disable()
288 ipu_dp_disable_channel(ipu_plane->dp); in ipu_plane_disable()
289 ipu_idmac_disable_channel(ipu_plane->ipu_ch); in ipu_plane_disable()
290 ipu_dmfc_disable_channel(ipu_plane->dmfc); in ipu_plane_disable()
291 if (ipu_plane->dp) in ipu_plane_disable()
292 ipu_dp_disable(ipu_plane->ipu); in ipu_plane_disable()
305 struct ipu_plane *ipu_plane = to_ipu_plane(plane); in ipu_update_plane() local
310 if (!ipu_plane->enabled) in ipu_update_plane()
311 ret = ipu_plane_get_resources(ipu_plane); in ipu_update_plane()
315 ret = ipu_plane_mode_set(ipu_plane, crtc, &crtc->hwmode, fb, in ipu_update_plane()
320 ipu_plane_put_resources(ipu_plane); in ipu_update_plane()
329 if (!ipu_plane->enabled) in ipu_update_plane()
330 ipu_plane_enable(ipu_plane); in ipu_update_plane()
337 struct ipu_plane *ipu_plane = to_ipu_plane(plane); in ipu_disable_plane() local
341 if (ipu_plane->enabled) in ipu_disable_plane()
342 ipu_plane_disable(ipu_plane); in ipu_disable_plane()
344 ipu_plane_put_resources(ipu_plane); in ipu_disable_plane()
351 struct ipu_plane *ipu_plane = to_ipu_plane(plane); in ipu_plane_destroy() local
357 kfree(ipu_plane); in ipu_plane_destroy()
366 struct ipu_plane *ipu_plane_init(struct drm_device *dev, struct ipu_soc *ipu, in ipu_plane_init()
370 struct ipu_plane *ipu_plane; in ipu_plane_init() local
376 ipu_plane = kzalloc(sizeof(*ipu_plane), GFP_KERNEL); in ipu_plane_init()
377 if (!ipu_plane) { in ipu_plane_init()
382 ipu_plane->ipu = ipu; in ipu_plane_init()
383 ipu_plane->dma = dma; in ipu_plane_init()
384 ipu_plane->dp_flow = dp; in ipu_plane_init()
386 ret = drm_plane_init(dev, &ipu_plane->base, possible_crtcs, in ipu_plane_init()
392 kfree(ipu_plane); in ipu_plane_init()
396 return ipu_plane; in ipu_plane_init()