Lines Matching refs:vc4_state
146 struct vc4_plane_state *vc4_state; in vc4_plane_duplicate_state() local
151 vc4_state = kmemdup(plane->state, sizeof(*vc4_state), GFP_KERNEL); in vc4_plane_duplicate_state()
152 if (!vc4_state) in vc4_plane_duplicate_state()
155 memset(&vc4_state->lbm, 0, sizeof(vc4_state->lbm)); in vc4_plane_duplicate_state()
157 __drm_atomic_helper_plane_duplicate_state(plane, &vc4_state->base); in vc4_plane_duplicate_state()
159 if (vc4_state->dlist) { in vc4_plane_duplicate_state()
160 vc4_state->dlist = kmemdup(vc4_state->dlist, in vc4_plane_duplicate_state()
161 vc4_state->dlist_count * 4, in vc4_plane_duplicate_state()
163 if (!vc4_state->dlist) { in vc4_plane_duplicate_state()
164 kfree(vc4_state); in vc4_plane_duplicate_state()
167 vc4_state->dlist_size = vc4_state->dlist_count; in vc4_plane_duplicate_state()
170 return &vc4_state->base; in vc4_plane_duplicate_state()
177 struct vc4_plane_state *vc4_state = to_vc4_plane_state(state); in vc4_plane_destroy_state() local
179 if (vc4_state->lbm.allocated) { in vc4_plane_destroy_state()
183 drm_mm_remove_node(&vc4_state->lbm); in vc4_plane_destroy_state()
187 kfree(vc4_state->dlist); in vc4_plane_destroy_state()
188 __drm_atomic_helper_plane_destroy_state(&vc4_state->base); in vc4_plane_destroy_state()
195 struct vc4_plane_state *vc4_state; in vc4_plane_reset() local
199 vc4_state = kzalloc(sizeof(*vc4_state), GFP_KERNEL); in vc4_plane_reset()
200 if (!vc4_state) in vc4_plane_reset()
203 plane->state = &vc4_state->base; in vc4_plane_reset()
205 vc4_state->base.plane = plane; in vc4_plane_reset()
208 static void vc4_dlist_write(struct vc4_plane_state *vc4_state, u32 val) in vc4_dlist_write() argument
210 if (vc4_state->dlist_count == vc4_state->dlist_size) { in vc4_dlist_write()
211 u32 new_size = max(4u, vc4_state->dlist_count * 2); in vc4_dlist_write()
216 memcpy(new_dlist, vc4_state->dlist, vc4_state->dlist_count * 4); in vc4_dlist_write()
218 kfree(vc4_state->dlist); in vc4_dlist_write()
219 vc4_state->dlist = new_dlist; in vc4_dlist_write()
220 vc4_state->dlist_size = new_size; in vc4_dlist_write()
223 vc4_state->dlist[vc4_state->dlist_count++] = val; in vc4_dlist_write()
233 struct vc4_plane_state *vc4_state = to_vc4_plane_state(state); in vc4_get_scl_field() local
235 switch (vc4_state->x_scaling[plane] << 2 | vc4_state->y_scaling[plane]) { in vc4_get_scl_field()
264 struct vc4_plane_state *vc4_state = to_vc4_plane_state(state); in vc4_plane_setup_clipping_and_scaling() local
275 vc4_state->offsets[i] = bo->paddr + fb->offsets[i]; in vc4_plane_setup_clipping_and_scaling()
285 vc4_state->src_x = state->src_x >> 16; in vc4_plane_setup_clipping_and_scaling()
286 vc4_state->src_y = state->src_y >> 16; in vc4_plane_setup_clipping_and_scaling()
287 vc4_state->src_w[0] = state->src_w >> 16; in vc4_plane_setup_clipping_and_scaling()
288 vc4_state->src_h[0] = state->src_h >> 16; in vc4_plane_setup_clipping_and_scaling()
290 vc4_state->crtc_x = state->crtc_x; in vc4_plane_setup_clipping_and_scaling()
291 vc4_state->crtc_y = state->crtc_y; in vc4_plane_setup_clipping_and_scaling()
292 vc4_state->crtc_w = state->crtc_w; in vc4_plane_setup_clipping_and_scaling()
293 vc4_state->crtc_h = state->crtc_h; in vc4_plane_setup_clipping_and_scaling()
295 vc4_state->x_scaling[0] = vc4_get_scaling_mode(vc4_state->src_w[0], in vc4_plane_setup_clipping_and_scaling()
296 vc4_state->crtc_w); in vc4_plane_setup_clipping_and_scaling()
297 vc4_state->y_scaling[0] = vc4_get_scaling_mode(vc4_state->src_h[0], in vc4_plane_setup_clipping_and_scaling()
298 vc4_state->crtc_h); in vc4_plane_setup_clipping_and_scaling()
300 vc4_state->is_unity = (vc4_state->x_scaling[0] == VC4_SCALING_NONE && in vc4_plane_setup_clipping_and_scaling()
301 vc4_state->y_scaling[0] == VC4_SCALING_NONE); in vc4_plane_setup_clipping_and_scaling()
304 vc4_state->is_yuv = true; in vc4_plane_setup_clipping_and_scaling()
308 vc4_state->src_w[1] = vc4_state->src_w[0] / h_subsample; in vc4_plane_setup_clipping_and_scaling()
309 vc4_state->src_h[1] = vc4_state->src_h[0] / v_subsample; in vc4_plane_setup_clipping_and_scaling()
311 vc4_state->x_scaling[1] = in vc4_plane_setup_clipping_and_scaling()
312 vc4_get_scaling_mode(vc4_state->src_w[1], in vc4_plane_setup_clipping_and_scaling()
313 vc4_state->crtc_w); in vc4_plane_setup_clipping_and_scaling()
314 vc4_state->y_scaling[1] = in vc4_plane_setup_clipping_and_scaling()
315 vc4_get_scaling_mode(vc4_state->src_h[1], in vc4_plane_setup_clipping_and_scaling()
316 vc4_state->crtc_h); in vc4_plane_setup_clipping_and_scaling()
322 if (vc4_state->is_unity) in vc4_plane_setup_clipping_and_scaling()
323 vc4_state->x_scaling[0] = VC4_SCALING_PPF; in vc4_plane_setup_clipping_and_scaling()
325 vc4_state->x_scaling[1] = VC4_SCALING_NONE; in vc4_plane_setup_clipping_and_scaling()
326 vc4_state->y_scaling[1] = VC4_SCALING_NONE; in vc4_plane_setup_clipping_and_scaling()
333 if (plane->type == DRM_PLANE_TYPE_CURSOR && !vc4_state->is_unity) in vc4_plane_setup_clipping_and_scaling()
339 if (vc4_state->crtc_x < 0) { in vc4_plane_setup_clipping_and_scaling()
344 vc4_state->offsets[i] += (cpp * in vc4_plane_setup_clipping_and_scaling()
345 (-vc4_state->crtc_x) / subs); in vc4_plane_setup_clipping_and_scaling()
347 vc4_state->src_w[0] += vc4_state->crtc_x; in vc4_plane_setup_clipping_and_scaling()
348 vc4_state->src_w[1] += vc4_state->crtc_x / h_subsample; in vc4_plane_setup_clipping_and_scaling()
349 vc4_state->crtc_x = 0; in vc4_plane_setup_clipping_and_scaling()
352 if (vc4_state->crtc_y < 0) { in vc4_plane_setup_clipping_and_scaling()
356 vc4_state->offsets[i] += (fb->pitches[i] * in vc4_plane_setup_clipping_and_scaling()
357 (-vc4_state->crtc_y) / subs); in vc4_plane_setup_clipping_and_scaling()
359 vc4_state->src_h[0] += vc4_state->crtc_y; in vc4_plane_setup_clipping_and_scaling()
360 vc4_state->src_h[1] += vc4_state->crtc_y / v_subsample; in vc4_plane_setup_clipping_and_scaling()
361 vc4_state->crtc_y = 0; in vc4_plane_setup_clipping_and_scaling()
367 static void vc4_write_tpz(struct vc4_plane_state *vc4_state, u32 src, u32 dst) in vc4_write_tpz() argument
378 vc4_dlist_write(vc4_state, in vc4_write_tpz()
381 vc4_dlist_write(vc4_state, in vc4_write_tpz()
385 static void vc4_write_ppf(struct vc4_plane_state *vc4_state, u32 src, u32 dst) in vc4_write_ppf() argument
389 vc4_dlist_write(vc4_state, in vc4_write_ppf()
397 struct vc4_plane_state *vc4_state = to_vc4_plane_state(state); in vc4_lbm_size() local
401 u32 pix_per_line = max(vc4_state->src_w[0], (u32)vc4_state->crtc_w); in vc4_lbm_size()
404 if (!vc4_state->is_yuv) { in vc4_lbm_size()
405 if (vc4_state->is_unity) in vc4_lbm_size()
407 else if (vc4_state->y_scaling[0] == VC4_SCALING_TPZ) in vc4_lbm_size()
429 struct vc4_plane_state *vc4_state = to_vc4_plane_state(state); in vc4_write_scaling_parameters() local
432 if (vc4_state->x_scaling[channel] == VC4_SCALING_PPF) { in vc4_write_scaling_parameters()
433 vc4_write_ppf(vc4_state, in vc4_write_scaling_parameters()
434 vc4_state->src_w[channel], vc4_state->crtc_w); in vc4_write_scaling_parameters()
438 if (vc4_state->y_scaling[channel] == VC4_SCALING_PPF) { in vc4_write_scaling_parameters()
439 vc4_write_ppf(vc4_state, in vc4_write_scaling_parameters()
440 vc4_state->src_h[channel], vc4_state->crtc_h); in vc4_write_scaling_parameters()
441 vc4_dlist_write(vc4_state, 0xc0c0c0c0); in vc4_write_scaling_parameters()
445 if (vc4_state->x_scaling[channel] == VC4_SCALING_TPZ) { in vc4_write_scaling_parameters()
446 vc4_write_tpz(vc4_state, in vc4_write_scaling_parameters()
447 vc4_state->src_w[channel], vc4_state->crtc_w); in vc4_write_scaling_parameters()
451 if (vc4_state->y_scaling[channel] == VC4_SCALING_TPZ) { in vc4_write_scaling_parameters()
452 vc4_write_tpz(vc4_state, in vc4_write_scaling_parameters()
453 vc4_state->src_h[channel], vc4_state->crtc_h); in vc4_write_scaling_parameters()
454 vc4_dlist_write(vc4_state, 0xc0c0c0c0); in vc4_write_scaling_parameters()
465 struct vc4_plane_state *vc4_state = to_vc4_plane_state(state); in vc4_plane_mode_set() local
467 u32 ctl0_offset = vc4_state->dlist_count; in vc4_plane_mode_set()
488 if (!vc4_state->lbm.allocated) { in vc4_plane_mode_set()
491 &vc4_state->lbm, in vc4_plane_mode_set()
495 WARN_ON_ONCE(lbm_size != vc4_state->lbm.size); in vc4_plane_mode_set()
589 vc4_dlist_write(vc4_state, in vc4_plane_mode_set()
595 (vc4_state->is_unity ? SCALER_CTL0_UNITY : 0) | in vc4_plane_mode_set()
600 vc4_state->pos0_offset = vc4_state->dlist_count; in vc4_plane_mode_set()
601 vc4_dlist_write(vc4_state, in vc4_plane_mode_set()
603 VC4_SET_FIELD(vc4_state->crtc_x, SCALER_POS0_START_X) | in vc4_plane_mode_set()
604 VC4_SET_FIELD(vc4_state->crtc_y, SCALER_POS0_START_Y)); in vc4_plane_mode_set()
607 if (!vc4_state->is_unity) { in vc4_plane_mode_set()
608 vc4_dlist_write(vc4_state, in vc4_plane_mode_set()
609 VC4_SET_FIELD(vc4_state->crtc_w, in vc4_plane_mode_set()
611 VC4_SET_FIELD(vc4_state->crtc_h, in vc4_plane_mode_set()
623 vc4_state->pos2_offset = vc4_state->dlist_count; in vc4_plane_mode_set()
624 vc4_dlist_write(vc4_state, in vc4_plane_mode_set()
631 VC4_SET_FIELD(vc4_state->src_w[0], SCALER_POS2_WIDTH) | in vc4_plane_mode_set()
632 VC4_SET_FIELD(vc4_state->src_h[0], SCALER_POS2_HEIGHT)); in vc4_plane_mode_set()
635 vc4_dlist_write(vc4_state, 0xc0c0c0c0); in vc4_plane_mode_set()
642 vc4_state->ptr0_offset = vc4_state->dlist_count; in vc4_plane_mode_set()
644 vc4_dlist_write(vc4_state, vc4_state->offsets[i]); in vc4_plane_mode_set()
648 vc4_dlist_write(vc4_state, 0xc0c0c0c0); in vc4_plane_mode_set()
651 vc4_dlist_write(vc4_state, pitch0); in vc4_plane_mode_set()
656 vc4_dlist_write(vc4_state, in vc4_plane_mode_set()
660 vc4_dlist_write(vc4_state, pitch0); in vc4_plane_mode_set()
665 if (vc4_state->is_yuv) { in vc4_plane_mode_set()
666 vc4_dlist_write(vc4_state, SCALER_CSC0_ITR_R_601_5); in vc4_plane_mode_set()
667 vc4_dlist_write(vc4_state, SCALER_CSC1_ITR_R_601_5); in vc4_plane_mode_set()
668 vc4_dlist_write(vc4_state, SCALER_CSC2_ITR_R_601_5); in vc4_plane_mode_set()
671 if (vc4_state->x_scaling[0] != VC4_SCALING_NONE || in vc4_plane_mode_set()
672 vc4_state->x_scaling[1] != VC4_SCALING_NONE || in vc4_plane_mode_set()
673 vc4_state->y_scaling[0] != VC4_SCALING_NONE || in vc4_plane_mode_set()
674 vc4_state->y_scaling[1] != VC4_SCALING_NONE) { in vc4_plane_mode_set()
676 if (vc4_state->y_scaling[0] != VC4_SCALING_NONE || in vc4_plane_mode_set()
677 vc4_state->y_scaling[1] != VC4_SCALING_NONE) { in vc4_plane_mode_set()
678 vc4_dlist_write(vc4_state, vc4_state->lbm.start); in vc4_plane_mode_set()
693 if (vc4_state->x_scaling[0] == VC4_SCALING_PPF || in vc4_plane_mode_set()
694 vc4_state->y_scaling[0] == VC4_SCALING_PPF || in vc4_plane_mode_set()
695 vc4_state->x_scaling[1] == VC4_SCALING_PPF || in vc4_plane_mode_set()
696 vc4_state->y_scaling[1] == VC4_SCALING_PPF) { in vc4_plane_mode_set()
701 vc4_dlist_write(vc4_state, kernel); in vc4_plane_mode_set()
703 vc4_dlist_write(vc4_state, kernel); in vc4_plane_mode_set()
705 vc4_dlist_write(vc4_state, kernel); in vc4_plane_mode_set()
707 vc4_dlist_write(vc4_state, kernel); in vc4_plane_mode_set()
711 vc4_state->dlist[ctl0_offset] |= in vc4_plane_mode_set()
712 VC4_SET_FIELD(vc4_state->dlist_count, SCALER_CTL0_SIZE); in vc4_plane_mode_set()
715 covers_screen = vc4_state->crtc_x == 0 && vc4_state->crtc_y == 0 && in vc4_plane_mode_set()
716 vc4_state->crtc_w == state->crtc->mode.hdisplay && in vc4_plane_mode_set()
717 vc4_state->crtc_h == state->crtc->mode.vdisplay; in vc4_plane_mode_set()
722 vc4_state->needs_bg_fill = fb->format->has_alpha || !covers_screen || in vc4_plane_mode_set()
738 struct vc4_plane_state *vc4_state = to_vc4_plane_state(state); in vc4_plane_atomic_check() local
740 vc4_state->dlist_count = 0; in vc4_plane_atomic_check()
760 struct vc4_plane_state *vc4_state = to_vc4_plane_state(plane->state); in vc4_plane_write_dlist() local
763 vc4_state->hw_dlist = dlist; in vc4_plane_write_dlist()
766 for (i = 0; i < vc4_state->dlist_count; i++) in vc4_plane_write_dlist()
767 writel(vc4_state->dlist[i], &dlist[i]); in vc4_plane_write_dlist()
769 return vc4_state->dlist_count; in vc4_plane_write_dlist()
774 const struct vc4_plane_state *vc4_state = in vc4_plane_dlist_size() local
775 container_of(state, typeof(*vc4_state), base); in vc4_plane_dlist_size()
777 return vc4_state->dlist_count; in vc4_plane_dlist_size()
785 struct vc4_plane_state *vc4_state = to_vc4_plane_state(plane->state); in vc4_plane_async_set_fb() local
799 writel(addr, &vc4_state->hw_dlist[vc4_state->ptr0_offset]); in vc4_plane_async_set_fb()
805 vc4_state->dlist[vc4_state->ptr0_offset] = addr; in vc4_plane_async_set_fb()
811 struct vc4_plane_state *vc4_state = to_vc4_plane_state(plane->state); in vc4_plane_atomic_async_update() local
838 writel(vc4_state->dlist[vc4_state->pos0_offset], in vc4_plane_atomic_async_update()
839 &vc4_state->hw_dlist[vc4_state->pos0_offset]); in vc4_plane_atomic_async_update()
840 writel(vc4_state->dlist[vc4_state->pos2_offset], in vc4_plane_atomic_async_update()
841 &vc4_state->hw_dlist[vc4_state->pos2_offset]); in vc4_plane_atomic_async_update()
842 writel(vc4_state->dlist[vc4_state->ptr0_offset], in vc4_plane_atomic_async_update()
843 &vc4_state->hw_dlist[vc4_state->ptr0_offset]); in vc4_plane_atomic_async_update()