Lines Matching +full:layer +full:- +full:primary

1 // SPDX-License-Identifier: GPL-2.0-only
6 * Author: Boris BREZILLON <boris.brezillon@free-electrons.com>
10 #include <linux/mfd/atmel-hlcdc.h>
23 * struct atmel_hlcdc_plane_state - Atmel HLCDC Plane state structure.
189 return -ENOTSUPP; in atmel_hlcdc_format_to_plane_mode()
264 factor = (256 * ((8 * (srcsize - 1)) - phidef)) / (dstsize - 1); in atmel_hlcdc_plane_phiscaler_get_factor()
265 max_memsize = ((factor * (dstsize - 1)) + (256 * phidef)) / 2048; in atmel_hlcdc_plane_phiscaler_get_factor()
267 if (max_memsize > srcsize - 1) in atmel_hlcdc_plane_phiscaler_get_factor()
268 factor--; in atmel_hlcdc_plane_phiscaler_get_factor()
281 atmel_hlcdc_layer_write_cfg(&plane->layer, cfg_offs + i, in atmel_hlcdc_plane_scaler_set_phicoeff()
288 const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc; in atmel_hlcdc_plane_setup_scaler()
291 if (!desc->layout.scaler_config) in atmel_hlcdc_plane_setup_scaler()
294 if (state->crtc_w == state->src_w && state->crtc_h == state->src_h) { in atmel_hlcdc_plane_setup_scaler()
295 atmel_hlcdc_layer_write_cfg(&plane->layer, in atmel_hlcdc_plane_setup_scaler()
296 desc->layout.scaler_config, 0); in atmel_hlcdc_plane_setup_scaler()
300 if (desc->layout.phicoeffs.x) { in atmel_hlcdc_plane_setup_scaler()
301 xfactor = atmel_hlcdc_plane_phiscaler_get_factor(state->src_w, in atmel_hlcdc_plane_setup_scaler()
302 state->crtc_w, in atmel_hlcdc_plane_setup_scaler()
305 yfactor = atmel_hlcdc_plane_phiscaler_get_factor(state->src_h, in atmel_hlcdc_plane_setup_scaler()
306 state->crtc_h, in atmel_hlcdc_plane_setup_scaler()
310 state->crtc_w < state->src_w ? in atmel_hlcdc_plane_setup_scaler()
314 desc->layout.phicoeffs.x); in atmel_hlcdc_plane_setup_scaler()
317 state->crtc_h < state->src_h ? in atmel_hlcdc_plane_setup_scaler()
321 desc->layout.phicoeffs.y); in atmel_hlcdc_plane_setup_scaler()
323 xfactor = (1024 * state->src_w) / state->crtc_w; in atmel_hlcdc_plane_setup_scaler()
324 yfactor = (1024 * state->src_h) / state->crtc_h; in atmel_hlcdc_plane_setup_scaler()
327 atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.scaler_config, in atmel_hlcdc_plane_setup_scaler()
337 const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc; in atmel_hlcdc_plane_update_pos_and_size()
339 if (desc->layout.size) in atmel_hlcdc_plane_update_pos_and_size()
340 atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.size, in atmel_hlcdc_plane_update_pos_and_size()
341 ATMEL_HLCDC_LAYER_SIZE(state->crtc_w, in atmel_hlcdc_plane_update_pos_and_size()
342 state->crtc_h)); in atmel_hlcdc_plane_update_pos_and_size()
344 if (desc->layout.memsize) in atmel_hlcdc_plane_update_pos_and_size()
345 atmel_hlcdc_layer_write_cfg(&plane->layer, in atmel_hlcdc_plane_update_pos_and_size()
346 desc->layout.memsize, in atmel_hlcdc_plane_update_pos_and_size()
347 ATMEL_HLCDC_LAYER_SIZE(state->src_w, in atmel_hlcdc_plane_update_pos_and_size()
348 state->src_h)); in atmel_hlcdc_plane_update_pos_and_size()
350 if (desc->layout.pos) in atmel_hlcdc_plane_update_pos_and_size()
351 atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.pos, in atmel_hlcdc_plane_update_pos_and_size()
352 ATMEL_HLCDC_LAYER_POS(state->crtc_x, in atmel_hlcdc_plane_update_pos_and_size()
353 state->crtc_y)); in atmel_hlcdc_plane_update_pos_and_size()
362 unsigned int cfg = ATMEL_HLCDC_LAYER_DMA_BLEN_INCR16 | state->ahb_id; in atmel_hlcdc_plane_update_general_settings()
363 const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc; in atmel_hlcdc_plane_update_general_settings()
364 const struct drm_format_info *format = state->base.fb->format; in atmel_hlcdc_plane_update_general_settings()
370 if (format->format == DRM_FORMAT_RGB888) in atmel_hlcdc_plane_update_general_settings()
373 atmel_hlcdc_layer_write_cfg(&plane->layer, ATMEL_HLCDC_LAYER_DMA_CFG, in atmel_hlcdc_plane_update_general_settings()
378 if (plane->base.type != DRM_PLANE_TYPE_PRIMARY) { in atmel_hlcdc_plane_update_general_settings()
382 if (format->has_alpha) in atmel_hlcdc_plane_update_general_settings()
386 ATMEL_HLCDC_LAYER_GA(state->base.alpha); in atmel_hlcdc_plane_update_general_settings()
389 if (state->disc_h && state->disc_w) in atmel_hlcdc_plane_update_general_settings()
392 atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.general_config, in atmel_hlcdc_plane_update_general_settings()
402 ret = atmel_hlcdc_format_to_plane_mode(state->base.fb->format->format, in atmel_hlcdc_plane_update_format()
407 if ((state->base.fb->format->format == DRM_FORMAT_YUV422 || in atmel_hlcdc_plane_update_format()
408 state->base.fb->format->format == DRM_FORMAT_NV61) && in atmel_hlcdc_plane_update_format()
409 drm_rotation_90_or_270(state->base.rotation)) in atmel_hlcdc_plane_update_format()
412 atmel_hlcdc_layer_write_cfg(&plane->layer, in atmel_hlcdc_plane_update_format()
419 struct drm_crtc *crtc = state->base.crtc; in atmel_hlcdc_plane_update_clut()
423 if (!crtc || !crtc->state) in atmel_hlcdc_plane_update_clut()
426 if (!crtc->state->color_mgmt_changed || !crtc->state->gamma_lut) in atmel_hlcdc_plane_update_clut()
429 lut = (struct drm_color_lut *)crtc->state->gamma_lut->data; in atmel_hlcdc_plane_update_clut()
432 u32 val = ((lut->red << 8) & 0xff0000) | in atmel_hlcdc_plane_update_clut()
433 (lut->green & 0xff00) | in atmel_hlcdc_plane_update_clut()
434 (lut->blue >> 8); in atmel_hlcdc_plane_update_clut()
436 atmel_hlcdc_layer_write_clut(&plane->layer, idx, val); in atmel_hlcdc_plane_update_clut()
443 const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc; in atmel_hlcdc_plane_update_buffers()
444 struct drm_framebuffer *fb = state->base.fb; in atmel_hlcdc_plane_update_buffers()
448 sr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHSR); in atmel_hlcdc_plane_update_buffers()
450 for (i = 0; i < state->nplanes; i++) { in atmel_hlcdc_plane_update_buffers()
453 state->dscrs[i]->addr = gem->dma_addr + state->offsets[i]; in atmel_hlcdc_plane_update_buffers()
455 atmel_hlcdc_layer_write_reg(&plane->layer, in atmel_hlcdc_plane_update_buffers()
457 state->dscrs[i]->self); in atmel_hlcdc_plane_update_buffers()
460 atmel_hlcdc_layer_write_reg(&plane->layer, in atmel_hlcdc_plane_update_buffers()
462 state->dscrs[i]->addr); in atmel_hlcdc_plane_update_buffers()
463 atmel_hlcdc_layer_write_reg(&plane->layer, in atmel_hlcdc_plane_update_buffers()
465 state->dscrs[i]->ctrl); in atmel_hlcdc_plane_update_buffers()
466 atmel_hlcdc_layer_write_reg(&plane->layer, in atmel_hlcdc_plane_update_buffers()
468 state->dscrs[i]->self); in atmel_hlcdc_plane_update_buffers()
471 if (desc->layout.xstride[i]) in atmel_hlcdc_plane_update_buffers()
472 atmel_hlcdc_layer_write_cfg(&plane->layer, in atmel_hlcdc_plane_update_buffers()
473 desc->layout.xstride[i], in atmel_hlcdc_plane_update_buffers()
474 state->xstride[i]); in atmel_hlcdc_plane_update_buffers()
476 if (desc->layout.pstride[i]) in atmel_hlcdc_plane_update_buffers()
477 atmel_hlcdc_layer_write_cfg(&plane->layer, in atmel_hlcdc_plane_update_buffers()
478 desc->layout.pstride[i], in atmel_hlcdc_plane_update_buffers()
479 state->pstride[i]); in atmel_hlcdc_plane_update_buffers()
494 plane_s = drm_atomic_get_plane_state(c_state->state, plane); in atmel_hlcdc_plane_prepare_ahb_routing()
501 pixels = (plane_state->src_w * plane_state->src_h) - in atmel_hlcdc_plane_prepare_ahb_routing()
502 (plane_state->disc_w * plane_state->disc_h); in atmel_hlcdc_plane_prepare_ahb_routing()
504 for (i = 0; i < plane_state->nplanes; i++) in atmel_hlcdc_plane_prepare_ahb_routing()
505 load += pixels * plane_state->bpp[i]; in atmel_hlcdc_plane_prepare_ahb_routing()
508 plane_state->ahb_id = 0; in atmel_hlcdc_plane_prepare_ahb_routing()
510 plane_state->ahb_id = 1; in atmel_hlcdc_plane_prepare_ahb_routing()
512 ahb_load[plane_state->ahb_id] += load; in atmel_hlcdc_plane_prepare_ahb_routing()
525 struct atmel_hlcdc_plane *primary; in atmel_hlcdc_plane_prepare_disc_area() local
528 primary = drm_plane_to_atmel_hlcdc_plane(c_state->crtc->primary); in atmel_hlcdc_plane_prepare_disc_area()
529 layout = &primary->layer.desc->layout; in atmel_hlcdc_plane_prepare_disc_area()
530 if (!layout->disc_pos || !layout->disc_size) in atmel_hlcdc_plane_prepare_disc_area()
533 primary_s = drm_atomic_get_plane_state(c_state->state, in atmel_hlcdc_plane_prepare_disc_area()
534 &primary->base); in atmel_hlcdc_plane_prepare_disc_area()
544 if (ovl == c_state->crtc->primary) in atmel_hlcdc_plane_prepare_disc_area()
547 ovl_s = drm_atomic_get_plane_state(c_state->state, ovl); in atmel_hlcdc_plane_prepare_disc_area()
553 if (!ovl_s->visible || in atmel_hlcdc_plane_prepare_disc_area()
554 !ovl_s->fb || in atmel_hlcdc_plane_prepare_disc_area()
555 ovl_s->fb->format->has_alpha || in atmel_hlcdc_plane_prepare_disc_area()
556 ovl_s->alpha != DRM_BLEND_ALPHA_OPAQUE) in atmel_hlcdc_plane_prepare_disc_area()
560 if (ovl_state->crtc_h * ovl_state->crtc_w < disc_h * disc_w) in atmel_hlcdc_plane_prepare_disc_area()
563 disc_x = ovl_state->crtc_x; in atmel_hlcdc_plane_prepare_disc_area()
564 disc_y = ovl_state->crtc_y; in atmel_hlcdc_plane_prepare_disc_area()
565 disc_h = ovl_state->crtc_h; in atmel_hlcdc_plane_prepare_disc_area()
566 disc_w = ovl_state->crtc_w; in atmel_hlcdc_plane_prepare_disc_area()
569 primary_state->disc_x = disc_x; in atmel_hlcdc_plane_prepare_disc_area()
570 primary_state->disc_y = disc_y; in atmel_hlcdc_plane_prepare_disc_area()
571 primary_state->disc_w = disc_w; in atmel_hlcdc_plane_prepare_disc_area()
572 primary_state->disc_h = disc_h; in atmel_hlcdc_plane_prepare_disc_area()
583 layout = &plane->layer.desc->layout; in atmel_hlcdc_plane_update_disc_area()
584 if (!layout->disc_pos || !layout->disc_size) in atmel_hlcdc_plane_update_disc_area()
587 atmel_hlcdc_layer_write_cfg(&plane->layer, layout->disc_pos, in atmel_hlcdc_plane_update_disc_area()
588 ATMEL_HLCDC_LAYER_DISC_POS(state->disc_x, in atmel_hlcdc_plane_update_disc_area()
589 state->disc_y)); in atmel_hlcdc_plane_update_disc_area()
591 atmel_hlcdc_layer_write_cfg(&plane->layer, layout->disc_size, in atmel_hlcdc_plane_update_disc_area()
592 ATMEL_HLCDC_LAYER_DISC_SIZE(state->disc_w, in atmel_hlcdc_plane_update_disc_area()
593 state->disc_h)); in atmel_hlcdc_plane_update_disc_area()
603 const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc; in atmel_hlcdc_plane_atomic_check()
604 struct drm_framebuffer *fb = hstate->base.fb; in atmel_hlcdc_plane_atomic_check()
610 if (!hstate->base.crtc || WARN_ON(!fb)) in atmel_hlcdc_plane_atomic_check()
613 crtc_state = drm_atomic_get_existing_crtc_state(state, s->crtc); in atmel_hlcdc_plane_atomic_check()
614 mode = &crtc_state->adjusted_mode; in atmel_hlcdc_plane_atomic_check()
619 if (ret || !s->visible) in atmel_hlcdc_plane_atomic_check()
622 hstate->src_x = s->src.x1; in atmel_hlcdc_plane_atomic_check()
623 hstate->src_y = s->src.y1; in atmel_hlcdc_plane_atomic_check()
624 hstate->src_w = drm_rect_width(&s->src); in atmel_hlcdc_plane_atomic_check()
625 hstate->src_h = drm_rect_height(&s->src); in atmel_hlcdc_plane_atomic_check()
626 hstate->crtc_x = s->dst.x1; in atmel_hlcdc_plane_atomic_check()
627 hstate->crtc_y = s->dst.y1; in atmel_hlcdc_plane_atomic_check()
628 hstate->crtc_w = drm_rect_width(&s->dst); in atmel_hlcdc_plane_atomic_check()
629 hstate->crtc_h = drm_rect_height(&s->dst); in atmel_hlcdc_plane_atomic_check()
631 if ((hstate->src_x | hstate->src_y | hstate->src_w | hstate->src_h) & in atmel_hlcdc_plane_atomic_check()
633 return -EINVAL; in atmel_hlcdc_plane_atomic_check()
635 hstate->src_x >>= 16; in atmel_hlcdc_plane_atomic_check()
636 hstate->src_y >>= 16; in atmel_hlcdc_plane_atomic_check()
637 hstate->src_w >>= 16; in atmel_hlcdc_plane_atomic_check()
638 hstate->src_h >>= 16; in atmel_hlcdc_plane_atomic_check()
640 hstate->nplanes = fb->format->num_planes; in atmel_hlcdc_plane_atomic_check()
641 if (hstate->nplanes > ATMEL_HLCDC_LAYER_MAX_PLANES) in atmel_hlcdc_plane_atomic_check()
642 return -EINVAL; in atmel_hlcdc_plane_atomic_check()
644 for (i = 0; i < hstate->nplanes; i++) { in atmel_hlcdc_plane_atomic_check()
646 int xdiv = i ? fb->format->hsub : 1; in atmel_hlcdc_plane_atomic_check()
647 int ydiv = i ? fb->format->vsub : 1; in atmel_hlcdc_plane_atomic_check()
649 hstate->bpp[i] = fb->format->cpp[i]; in atmel_hlcdc_plane_atomic_check()
650 if (!hstate->bpp[i]) in atmel_hlcdc_plane_atomic_check()
651 return -EINVAL; in atmel_hlcdc_plane_atomic_check()
653 switch (hstate->base.rotation & DRM_MODE_ROTATE_MASK) { in atmel_hlcdc_plane_atomic_check()
655 offset = (hstate->src_y / ydiv) * in atmel_hlcdc_plane_atomic_check()
656 fb->pitches[i]; in atmel_hlcdc_plane_atomic_check()
657 offset += ((hstate->src_x + hstate->src_w - 1) / in atmel_hlcdc_plane_atomic_check()
658 xdiv) * hstate->bpp[i]; in atmel_hlcdc_plane_atomic_check()
659 hstate->xstride[i] = -(((hstate->src_h - 1) / ydiv) * in atmel_hlcdc_plane_atomic_check()
660 fb->pitches[i]) - in atmel_hlcdc_plane_atomic_check()
661 (2 * hstate->bpp[i]); in atmel_hlcdc_plane_atomic_check()
662 hstate->pstride[i] = fb->pitches[i] - hstate->bpp[i]; in atmel_hlcdc_plane_atomic_check()
665 offset = ((hstate->src_y + hstate->src_h - 1) / in atmel_hlcdc_plane_atomic_check()
666 ydiv) * fb->pitches[i]; in atmel_hlcdc_plane_atomic_check()
667 offset += ((hstate->src_x + hstate->src_w - 1) / in atmel_hlcdc_plane_atomic_check()
668 xdiv) * hstate->bpp[i]; in atmel_hlcdc_plane_atomic_check()
669 hstate->xstride[i] = ((((hstate->src_w - 1) / xdiv) - 1) * in atmel_hlcdc_plane_atomic_check()
670 hstate->bpp[i]) - fb->pitches[i]; in atmel_hlcdc_plane_atomic_check()
671 hstate->pstride[i] = -2 * hstate->bpp[i]; in atmel_hlcdc_plane_atomic_check()
674 offset = ((hstate->src_y + hstate->src_h - 1) / in atmel_hlcdc_plane_atomic_check()
675 ydiv) * fb->pitches[i]; in atmel_hlcdc_plane_atomic_check()
676 offset += (hstate->src_x / xdiv) * hstate->bpp[i]; in atmel_hlcdc_plane_atomic_check()
677 hstate->xstride[i] = ((hstate->src_h - 1) / ydiv) * in atmel_hlcdc_plane_atomic_check()
678 fb->pitches[i]; in atmel_hlcdc_plane_atomic_check()
679 hstate->pstride[i] = -fb->pitches[i] - hstate->bpp[i]; in atmel_hlcdc_plane_atomic_check()
683 offset = (hstate->src_y / ydiv) * fb->pitches[i]; in atmel_hlcdc_plane_atomic_check()
684 offset += (hstate->src_x / xdiv) * hstate->bpp[i]; in atmel_hlcdc_plane_atomic_check()
685 hstate->xstride[i] = fb->pitches[i] - in atmel_hlcdc_plane_atomic_check()
686 ((hstate->src_w / xdiv) * in atmel_hlcdc_plane_atomic_check()
687 hstate->bpp[i]); in atmel_hlcdc_plane_atomic_check()
688 hstate->pstride[i] = 0; in atmel_hlcdc_plane_atomic_check()
692 hstate->offsets[i] = offset + fb->offsets[i]; in atmel_hlcdc_plane_atomic_check()
698 if (drm_rotation_90_or_270(hstate->base.rotation)) { in atmel_hlcdc_plane_atomic_check()
699 swap(hstate->src_w, hstate->src_h); in atmel_hlcdc_plane_atomic_check()
702 if (!desc->layout.size && in atmel_hlcdc_plane_atomic_check()
703 (mode->hdisplay != hstate->crtc_w || in atmel_hlcdc_plane_atomic_check()
704 mode->vdisplay != hstate->crtc_h)) in atmel_hlcdc_plane_atomic_check()
705 return -EINVAL; in atmel_hlcdc_plane_atomic_check()
707 if ((hstate->crtc_h != hstate->src_h || hstate->crtc_w != hstate->src_w) && in atmel_hlcdc_plane_atomic_check()
708 (!desc->layout.memsize || in atmel_hlcdc_plane_atomic_check()
709 hstate->base.fb->format->has_alpha)) in atmel_hlcdc_plane_atomic_check()
710 return -EINVAL; in atmel_hlcdc_plane_atomic_check()
721 atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_IDR, in atmel_hlcdc_plane_atomic_disable()
724 /* Disable the layer */ in atmel_hlcdc_plane_atomic_disable()
725 atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHDR, in atmel_hlcdc_plane_atomic_disable()
731 atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_ISR); in atmel_hlcdc_plane_atomic_disable()
744 if (!new_s->crtc || !new_s->fb) in atmel_hlcdc_plane_atomic_update()
747 if (!hstate->base.visible) { in atmel_hlcdc_plane_atomic_update()
760 atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_IER, in atmel_hlcdc_plane_atomic_update()
766 sr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHSR); in atmel_hlcdc_plane_atomic_update()
767 atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHER, in atmel_hlcdc_plane_atomic_update()
775 const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc; in atmel_hlcdc_plane_init_properties()
777 if (desc->type == ATMEL_HLCDC_OVERLAY_LAYER || in atmel_hlcdc_plane_init_properties()
778 desc->type == ATMEL_HLCDC_CURSOR_LAYER) { in atmel_hlcdc_plane_init_properties()
781 ret = drm_plane_create_alpha_property(&plane->base); in atmel_hlcdc_plane_init_properties()
786 if (desc->layout.xstride[0] && desc->layout.pstride[0]) { in atmel_hlcdc_plane_init_properties()
789 ret = drm_plane_create_rotation_property(&plane->base, in atmel_hlcdc_plane_init_properties()
799 if (desc->layout.csc) { in atmel_hlcdc_plane_init_properties()
801 * TODO: decare a "yuv-to-rgb-conv-factors" property to let in atmel_hlcdc_plane_init_properties()
804 atmel_hlcdc_layer_write_cfg(&plane->layer, in atmel_hlcdc_plane_init_properties()
805 desc->layout.csc, in atmel_hlcdc_plane_init_properties()
807 atmel_hlcdc_layer_write_cfg(&plane->layer, in atmel_hlcdc_plane_init_properties()
808 desc->layout.csc + 1, in atmel_hlcdc_plane_init_properties()
810 atmel_hlcdc_layer_write_cfg(&plane->layer, in atmel_hlcdc_plane_init_properties()
811 desc->layout.csc + 2, in atmel_hlcdc_plane_init_properties()
820 const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc; in atmel_hlcdc_plane_irq()
823 isr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_ISR); in atmel_hlcdc_plane_irq()
833 dev_dbg(plane->base.dev->dev, "overrun on plane %s\n", in atmel_hlcdc_plane_irq()
834 desc->name); in atmel_hlcdc_plane_irq()
846 struct atmel_hlcdc_dc *dc = p->dev->dev_private; in atmel_hlcdc_plane_alloc_dscrs()
849 for (i = 0; i < ARRAY_SIZE(state->dscrs); i++) { in atmel_hlcdc_plane_alloc_dscrs()
853 dscr = dma_pool_alloc(dc->dscrpool, GFP_KERNEL, &dscr_dma); in atmel_hlcdc_plane_alloc_dscrs()
857 dscr->addr = 0; in atmel_hlcdc_plane_alloc_dscrs()
858 dscr->next = dscr_dma; in atmel_hlcdc_plane_alloc_dscrs()
859 dscr->self = dscr_dma; in atmel_hlcdc_plane_alloc_dscrs()
860 dscr->ctrl = ATMEL_HLCDC_LAYER_DFETCH; in atmel_hlcdc_plane_alloc_dscrs()
862 state->dscrs[i] = dscr; in atmel_hlcdc_plane_alloc_dscrs()
868 for (i--; i >= 0; i--) { in atmel_hlcdc_plane_alloc_dscrs()
869 dma_pool_free(dc->dscrpool, state->dscrs[i], in atmel_hlcdc_plane_alloc_dscrs()
870 state->dscrs[i]->self); in atmel_hlcdc_plane_alloc_dscrs()
873 return -ENOMEM; in atmel_hlcdc_plane_alloc_dscrs()
880 if (p->state) { in atmel_hlcdc_plane_reset()
881 state = drm_plane_state_to_atmel_hlcdc_plane_state(p->state); in atmel_hlcdc_plane_reset()
883 if (state->base.fb) in atmel_hlcdc_plane_reset()
884 drm_framebuffer_put(state->base.fb); in atmel_hlcdc_plane_reset()
887 p->state = NULL; in atmel_hlcdc_plane_reset()
894 dev_err(p->dev->dev, in atmel_hlcdc_plane_reset()
898 __drm_atomic_helper_plane_reset(p, &state->base); in atmel_hlcdc_plane_reset()
906 drm_plane_state_to_atmel_hlcdc_plane_state(p->state); in atmel_hlcdc_plane_atomic_duplicate_state()
918 if (copy->base.fb) in atmel_hlcdc_plane_atomic_duplicate_state()
919 drm_framebuffer_get(copy->base.fb); in atmel_hlcdc_plane_atomic_duplicate_state()
921 return &copy->base; in atmel_hlcdc_plane_atomic_duplicate_state()
929 struct atmel_hlcdc_dc *dc = p->dev->dev_private; in atmel_hlcdc_plane_atomic_destroy_state()
932 for (i = 0; i < ARRAY_SIZE(state->dscrs); i++) { in atmel_hlcdc_plane_atomic_destroy_state()
933 dma_pool_free(dc->dscrpool, state->dscrs[i], in atmel_hlcdc_plane_atomic_destroy_state()
934 state->dscrs[i]->self); in atmel_hlcdc_plane_atomic_destroy_state()
937 if (s->fb) in atmel_hlcdc_plane_atomic_destroy_state()
938 drm_framebuffer_put(s->fb); in atmel_hlcdc_plane_atomic_destroy_state()
955 struct atmel_hlcdc_dc *dc = dev->dev_private; in atmel_hlcdc_plane_create()
960 plane = devm_kzalloc(dev->dev, sizeof(*plane), GFP_KERNEL); in atmel_hlcdc_plane_create()
962 return -ENOMEM; in atmel_hlcdc_plane_create()
964 atmel_hlcdc_layer_init(&plane->layer, desc, dc->hlcdc->regmap); in atmel_hlcdc_plane_create()
966 if (desc->type == ATMEL_HLCDC_BASE_LAYER) in atmel_hlcdc_plane_create()
968 else if (desc->type == ATMEL_HLCDC_CURSOR_LAYER) in atmel_hlcdc_plane_create()
973 ret = drm_universal_plane_init(dev, &plane->base, 0, in atmel_hlcdc_plane_create()
975 desc->formats->formats, in atmel_hlcdc_plane_create()
976 desc->formats->nformats, in atmel_hlcdc_plane_create()
981 drm_plane_helper_add(&plane->base, in atmel_hlcdc_plane_create()
989 dc->layers[desc->id] = &plane->layer; in atmel_hlcdc_plane_create()
996 struct atmel_hlcdc_dc *dc = dev->dev_private; in atmel_hlcdc_create_planes()
997 const struct atmel_hlcdc_layer_desc *descs = dc->desc->layers; in atmel_hlcdc_create_planes()
998 int nlayers = dc->desc->nlayers; in atmel_hlcdc_create_planes()
1001 dc->dscrpool = dmam_pool_create("atmel-hlcdc-dscr", dev->dev, in atmel_hlcdc_create_planes()
1004 if (!dc->dscrpool) in atmel_hlcdc_create_planes()
1005 return -ENOMEM; in atmel_hlcdc_create_planes()