Lines Matching refs:ipu_plane
23 #define to_ipu_plane(x) container_of(x, struct ipu_plane, base)
47 int ipu_plane_irq(struct ipu_plane *ipu_plane) in ipu_plane_irq() argument
49 return ipu_idmac_channel_irq(ipu_plane->ipu, ipu_plane->ipu_ch, in ipu_plane_irq()
71 int ipu_plane_set_base(struct ipu_plane *ipu_plane, struct drm_framebuffer *fb, in ipu_plane_set_base() argument
84 dev_dbg(ipu_plane->base.dev->dev, "phys = %pad, x = %d, y = %d", in ipu_plane_set_base()
90 if (ipu_plane->enabled) { in ipu_plane_set_base()
91 active = ipu_idmac_get_current_buffer(ipu_plane->ipu_ch); in ipu_plane_set_base()
92 ipu_cpmem_set_buffer(ipu_plane->ipu_ch, !active, eba); in ipu_plane_set_base()
93 ipu_idmac_select_buffer(ipu_plane->ipu_ch, !active); in ipu_plane_set_base()
95 ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 0, eba); in ipu_plane_set_base()
96 ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 1, eba); in ipu_plane_set_base()
100 ipu_plane->x = x; in ipu_plane_set_base()
101 ipu_plane->y = y; in ipu_plane_set_base()
106 int ipu_plane_mode_set(struct ipu_plane *ipu_plane, struct drm_crtc *crtc, in ipu_plane_mode_set() argument
113 struct device *dev = ipu_plane->base.dev->dev; in ipu_plane_mode_set()
150 if (crtc_w < 13 && (ipu_plane->dp_flow != IPU_DP_FLOW_SYNC_FG)) in ipu_plane_mode_set()
159 if (ipu_plane->enabled) { in ipu_plane_mode_set()
160 if (src_w != ipu_plane->w || src_h != ipu_plane->h || in ipu_plane_mode_set()
161 fb->pixel_format != ipu_plane->base.fb->pixel_format) in ipu_plane_mode_set()
164 return ipu_plane_set_base(ipu_plane, fb, src_x, src_y); in ipu_plane_mode_set()
167 switch (ipu_plane->dp_flow) { in ipu_plane_mode_set()
169 ret = ipu_dp_setup_channel(ipu_plane->dp, in ipu_plane_mode_set()
178 ipu_dp_set_global_alpha(ipu_plane->dp, true, 0, true); in ipu_plane_mode_set()
181 ipu_dp_setup_channel(ipu_plane->dp, in ipu_plane_mode_set()
184 ipu_dp_set_window_pos(ipu_plane->dp, crtc_x, crtc_y); in ipu_plane_mode_set()
196 ipu_dp_set_global_alpha(ipu_plane->dp, false, 0, false); in ipu_plane_mode_set()
203 ret = ipu_dmfc_init_channel(ipu_plane->dmfc, crtc_w); in ipu_plane_mode_set()
209 ret = ipu_dmfc_alloc_bandwidth(ipu_plane->dmfc, in ipu_plane_mode_set()
217 ipu_cpmem_zero(ipu_plane->ipu_ch); in ipu_plane_mode_set()
218 ipu_cpmem_set_resolution(ipu_plane->ipu_ch, src_w, src_h); in ipu_plane_mode_set()
219 ret = ipu_cpmem_set_fmt(ipu_plane->ipu_ch, fb->pixel_format); in ipu_plane_mode_set()
225 ipu_cpmem_set_high_priority(ipu_plane->ipu_ch); in ipu_plane_mode_set()
226 ipu_idmac_set_double_buffer(ipu_plane->ipu_ch, 1); in ipu_plane_mode_set()
227 ipu_cpmem_set_stride(ipu_plane->ipu_ch, fb->pitches[0]); in ipu_plane_mode_set()
229 ret = ipu_plane_set_base(ipu_plane, fb, src_x, src_y); in ipu_plane_mode_set()
233 ipu_cpmem_interlaced_scan(ipu_plane->ipu_ch, fb->pitches[0]); in ipu_plane_mode_set()
235 ipu_plane->w = src_w; in ipu_plane_mode_set()
236 ipu_plane->h = src_h; in ipu_plane_mode_set()
241 void ipu_plane_put_resources(struct ipu_plane *ipu_plane) in ipu_plane_put_resources() argument
243 if (!IS_ERR_OR_NULL(ipu_plane->dp)) in ipu_plane_put_resources()
244 ipu_dp_put(ipu_plane->dp); in ipu_plane_put_resources()
245 if (!IS_ERR_OR_NULL(ipu_plane->dmfc)) in ipu_plane_put_resources()
246 ipu_dmfc_put(ipu_plane->dmfc); in ipu_plane_put_resources()
247 if (!IS_ERR_OR_NULL(ipu_plane->ipu_ch)) in ipu_plane_put_resources()
248 ipu_idmac_put(ipu_plane->ipu_ch); in ipu_plane_put_resources()
251 int ipu_plane_get_resources(struct ipu_plane *ipu_plane) in ipu_plane_get_resources() argument
255 ipu_plane->ipu_ch = ipu_idmac_get(ipu_plane->ipu, ipu_plane->dma); in ipu_plane_get_resources()
256 if (IS_ERR(ipu_plane->ipu_ch)) { in ipu_plane_get_resources()
257 ret = PTR_ERR(ipu_plane->ipu_ch); in ipu_plane_get_resources()
262 ipu_plane->dmfc = ipu_dmfc_get(ipu_plane->ipu, ipu_plane->dma); in ipu_plane_get_resources()
263 if (IS_ERR(ipu_plane->dmfc)) { in ipu_plane_get_resources()
264 ret = PTR_ERR(ipu_plane->dmfc); in ipu_plane_get_resources()
269 if (ipu_plane->dp_flow >= 0) { in ipu_plane_get_resources()
270 ipu_plane->dp = ipu_dp_get(ipu_plane->ipu, ipu_plane->dp_flow); in ipu_plane_get_resources()
271 if (IS_ERR(ipu_plane->dp)) { in ipu_plane_get_resources()
272 ret = PTR_ERR(ipu_plane->dp); in ipu_plane_get_resources()
280 ipu_plane_put_resources(ipu_plane); in ipu_plane_get_resources()
285 void ipu_plane_enable(struct ipu_plane *ipu_plane) in ipu_plane_enable() argument
287 if (ipu_plane->dp) in ipu_plane_enable()
288 ipu_dp_enable(ipu_plane->ipu); in ipu_plane_enable()
289 ipu_dmfc_enable_channel(ipu_plane->dmfc); in ipu_plane_enable()
290 ipu_idmac_enable_channel(ipu_plane->ipu_ch); in ipu_plane_enable()
291 if (ipu_plane->dp) in ipu_plane_enable()
292 ipu_dp_enable_channel(ipu_plane->dp); in ipu_plane_enable()
294 ipu_plane->enabled = true; in ipu_plane_enable()
297 void ipu_plane_disable(struct ipu_plane *ipu_plane) in ipu_plane_disable() argument
299 ipu_plane->enabled = false; in ipu_plane_disable()
301 ipu_idmac_wait_busy(ipu_plane->ipu_ch, 50); in ipu_plane_disable()
303 if (ipu_plane->dp) in ipu_plane_disable()
304 ipu_dp_disable_channel(ipu_plane->dp); in ipu_plane_disable()
305 ipu_idmac_disable_channel(ipu_plane->ipu_ch); in ipu_plane_disable()
306 ipu_dmfc_disable_channel(ipu_plane->dmfc); in ipu_plane_disable()
307 if (ipu_plane->dp) in ipu_plane_disable()
308 ipu_dp_disable(ipu_plane->ipu); in ipu_plane_disable()
321 struct ipu_plane *ipu_plane = to_ipu_plane(plane); in ipu_update_plane() local
326 if (!ipu_plane->enabled) in ipu_update_plane()
327 ret = ipu_plane_get_resources(ipu_plane); in ipu_update_plane()
331 ret = ipu_plane_mode_set(ipu_plane, crtc, &crtc->hwmode, fb, in ipu_update_plane()
336 ipu_plane_put_resources(ipu_plane); in ipu_update_plane()
345 if (!ipu_plane->enabled) in ipu_update_plane()
346 ipu_plane_enable(ipu_plane); in ipu_update_plane()
353 struct ipu_plane *ipu_plane = to_ipu_plane(plane); in ipu_disable_plane() local
357 if (ipu_plane->enabled) in ipu_disable_plane()
358 ipu_plane_disable(ipu_plane); in ipu_disable_plane()
360 ipu_plane_put_resources(ipu_plane); in ipu_disable_plane()
367 struct ipu_plane *ipu_plane = to_ipu_plane(plane); in ipu_plane_destroy() local
373 kfree(ipu_plane); in ipu_plane_destroy()
382 struct ipu_plane *ipu_plane_init(struct drm_device *dev, struct ipu_soc *ipu, in ipu_plane_init()
386 struct ipu_plane *ipu_plane; in ipu_plane_init() local
392 ipu_plane = kzalloc(sizeof(*ipu_plane), GFP_KERNEL); in ipu_plane_init()
393 if (!ipu_plane) { in ipu_plane_init()
398 ipu_plane->ipu = ipu; in ipu_plane_init()
399 ipu_plane->dma = dma; in ipu_plane_init()
400 ipu_plane->dp_flow = dp; in ipu_plane_init()
402 ret = drm_universal_plane_init(dev, &ipu_plane->base, possible_crtcs, in ipu_plane_init()
407 kfree(ipu_plane); in ipu_plane_init()
411 return ipu_plane; in ipu_plane_init()