Lines Matching +full:top +full:- +full:left
1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright 2005-2012 Freescale Semiconductor, Inc. All Rights Reserved.
11 #include "ipu-prv.h"
95 struct ipu_cpmem *cpmem = ch->ipu->cpmem_priv; in ipu_get_cpmem()
97 return cpmem->base + ch->num; in ipu_get_cpmem()
108 u32 mask = (1 << size) - 1; in ipu_ch_param_write_field()
113 val = readl(&base->word[word].data[i]); in ipu_ch_param_write_field()
116 writel(val, &base->word[word].data[i]); in ipu_ch_param_write_field()
118 if ((bit + size - 1) / 32 > i) { in ipu_ch_param_write_field()
119 val = readl(&base->word[word].data[i + 1]); in ipu_ch_param_write_field()
120 val &= ~(mask >> (ofs ? (32 - ofs) : 0)); in ipu_ch_param_write_field()
121 val |= v >> (ofs ? (32 - ofs) : 0); in ipu_ch_param_write_field()
122 writel(val, &base->word[word].data[i + 1]); in ipu_ch_param_write_field()
134 u32 mask = (1 << size) - 1; in ipu_ch_param_read_field()
139 val = (readl(&base->word[word].data[i]) >> ofs) & mask; in ipu_ch_param_read_field()
141 if ((bit + size - 1) / 32 > i) { in ipu_ch_param_read_field()
144 tmp = readl(&base->word[word].data[i + 1]); in ipu_ch_param_read_field()
145 tmp &= mask >> (ofs ? (32 - ofs) : 0); in ipu_ch_param_read_field()
146 val |= tmp << (ofs ? (32 - ofs) : 0); in ipu_ch_param_read_field()
154 * point of view of the IPU corresponds to little-endian words with the first
159 * https://linuxtv.org/downloads/v4l-dvb-apis/packed-rgb.html
168 * little-endian 16-bit word with the red component at the most in v4l2_pix_fmt_to_drm_fourcc()
225 return -EINVAL; in v4l2_pix_fmt_to_drm_fourcc()
241 ipu_ch_param_write_field(ch, IPU_FIELD_FW, xres - 1); in ipu_cpmem_set_resolution()
242 ipu_ch_param_write_field(ch, IPU_FIELD_FH, yres - 1); in ipu_cpmem_set_resolution()
254 ipu_ch_param_write_field(ch, IPU_FIELD_SLY, stride - 1); in ipu_cpmem_set_stride()
260 struct ipu_soc *ipu = ch->ipu; in ipu_cpmem_set_high_priority()
263 if (ipu->ipu_type == IPUV3EX) in ipu_cpmem_set_high_priority()
266 val = ipu_idmac_read(ipu, IDMAC_CHA_PRI(ch->num)); in ipu_cpmem_set_high_priority()
267 val |= 1 << (ch->num % 32); in ipu_cpmem_set_high_priority()
268 ipu_idmac_write(ipu, val, IDMAC_CHA_PRI(ch->num)); in ipu_cpmem_set_high_priority()
298 stride = -stride; in ipu_cpmem_interlaced_scan()
299 ilo = 0x100000 - (stride / 8); in ipu_cpmem_interlaced_scan()
304 sly = (stride * 2) - 1; in ipu_cpmem_interlaced_scan()
309 sluv = stride / 2 - 1; in ipu_cpmem_interlaced_scan()
312 sluv = stride - 1; in ipu_cpmem_interlaced_scan()
315 sluv = stride - 1; in ipu_cpmem_interlaced_scan()
318 sluv = stride * 2 - 1; in ipu_cpmem_interlaced_scan()
342 ipu_ch_param_write_field(ch, IPU_FIELD_NPB, burstsize - 1); in ipu_cpmem_set_burstsize()
366 ro = rgb->bits_per_pixel - rgb->red.length - rgb->red.offset; in ipu_cpmem_set_format_rgb()
367 go = rgb->bits_per_pixel - rgb->green.length - rgb->green.offset; in ipu_cpmem_set_format_rgb()
368 bo = rgb->bits_per_pixel - rgb->blue.length - rgb->blue.offset; in ipu_cpmem_set_format_rgb()
369 to = rgb->bits_per_pixel - rgb->transp.length - rgb->transp.offset; in ipu_cpmem_set_format_rgb()
371 ipu_ch_param_write_field(ch, IPU_FIELD_WID0, rgb->red.length - 1); in ipu_cpmem_set_format_rgb()
373 ipu_ch_param_write_field(ch, IPU_FIELD_WID1, rgb->green.length - 1); in ipu_cpmem_set_format_rgb()
375 ipu_ch_param_write_field(ch, IPU_FIELD_WID2, rgb->blue.length - 1); in ipu_cpmem_set_format_rgb()
378 if (rgb->transp.length) { in ipu_cpmem_set_format_rgb()
380 rgb->transp.length - 1); in ipu_cpmem_set_format_rgb()
385 rgb->bits_per_pixel); in ipu_cpmem_set_format_rgb()
388 switch (rgb->bits_per_pixel) { in ipu_cpmem_set_format_rgb()
406 return -EINVAL; in ipu_cpmem_set_format_rgb()
438 return -EINVAL; in ipu_cpmem_set_format_passthrough()
455 ipu_ch_param_write_field(ch, IPU_FIELD_SLUV, uv_stride - 1); in ipu_cpmem_set_yuv_planar_full()
565 #define Y_OFFSET(pix, x, y) ((x) + pix->bytesperline * (y))
566 #define U_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
567 (pix->bytesperline * ((y) / 2) / 2) + (x) / 2)
568 #define V_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
569 (pix->bytesperline * pix->height / 4) + \
570 (pix->bytesperline * ((y) / 2) / 2) + (x) / 2)
571 #define U2_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
572 (pix->bytesperline * (y) / 2) + (x) / 2)
573 #define V2_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
574 (pix->bytesperline * pix->height / 2) + \
575 (pix->bytesperline * (y) / 2) + (x) / 2)
576 #define UV_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
577 (pix->bytesperline * ((y) / 2)) + (x))
578 #define UV2_OFFSET(pix, x, y) ((pix->bytesperline * pix->height) + \
579 (pix->bytesperline * y) + (x))
583 /* See Table 37-12. Alpha channels mapping. */
595 return -EINVAL; in ipu_channel_albm()
601 struct ipu_soc *ipu = ch->ipu; in ipu_cpmem_set_separate_alpha()
605 albm = ipu_channel_albm(ch->num); in ipu_cpmem_set_separate_alpha()
614 val |= BIT(ch->num); in ipu_cpmem_set_separate_alpha()
720 return -EINVAL; in ipu_cpmem_set_fmt()
743 struct v4l2_pix_format *pix = &image->pix; in ipu_cpmem_set_image()
748 __func__, pix->width, pix->height, in ipu_cpmem_set_image()
749 pix->bytesperline); in ipu_cpmem_set_image()
751 ipu_cpmem_set_resolution(ch, image->rect.width, image->rect.height); in ipu_cpmem_set_image()
752 ipu_cpmem_set_stride(ch, pix->bytesperline); in ipu_cpmem_set_image()
754 ipu_cpmem_set_fmt(ch, v4l2_pix_fmt_to_drm_fourcc(pix->pixelformat)); in ipu_cpmem_set_image()
756 switch (pix->pixelformat) { in ipu_cpmem_set_image()
758 offset = Y_OFFSET(pix, image->rect.left, image->rect.top); in ipu_cpmem_set_image()
759 u_offset = image->u_offset ? in ipu_cpmem_set_image()
760 image->u_offset : U_OFFSET(pix, image->rect.left, in ipu_cpmem_set_image()
761 image->rect.top) - offset; in ipu_cpmem_set_image()
762 v_offset = image->v_offset ? in ipu_cpmem_set_image()
763 image->v_offset : V_OFFSET(pix, image->rect.left, in ipu_cpmem_set_image()
764 image->rect.top) - offset; in ipu_cpmem_set_image()
766 ipu_cpmem_set_yuv_planar_full(ch, pix->bytesperline / 2, in ipu_cpmem_set_image()
770 offset = Y_OFFSET(pix, image->rect.left, image->rect.top); in ipu_cpmem_set_image()
771 u_offset = image->u_offset ? in ipu_cpmem_set_image()
772 image->u_offset : V_OFFSET(pix, image->rect.left, in ipu_cpmem_set_image()
773 image->rect.top) - offset; in ipu_cpmem_set_image()
774 v_offset = image->v_offset ? in ipu_cpmem_set_image()
775 image->v_offset : U_OFFSET(pix, image->rect.left, in ipu_cpmem_set_image()
776 image->rect.top) - offset; in ipu_cpmem_set_image()
778 ipu_cpmem_set_yuv_planar_full(ch, pix->bytesperline / 2, in ipu_cpmem_set_image()
782 offset = Y_OFFSET(pix, image->rect.left, image->rect.top); in ipu_cpmem_set_image()
783 u_offset = image->u_offset ? in ipu_cpmem_set_image()
784 image->u_offset : U2_OFFSET(pix, image->rect.left, in ipu_cpmem_set_image()
785 image->rect.top) - offset; in ipu_cpmem_set_image()
786 v_offset = image->v_offset ? in ipu_cpmem_set_image()
787 image->v_offset : V2_OFFSET(pix, image->rect.left, in ipu_cpmem_set_image()
788 image->rect.top) - offset; in ipu_cpmem_set_image()
790 ipu_cpmem_set_yuv_planar_full(ch, pix->bytesperline / 2, in ipu_cpmem_set_image()
794 offset = Y_OFFSET(pix, image->rect.left, image->rect.top); in ipu_cpmem_set_image()
795 u_offset = image->u_offset ? in ipu_cpmem_set_image()
796 image->u_offset : UV_OFFSET(pix, image->rect.left, in ipu_cpmem_set_image()
797 image->rect.top) - offset; in ipu_cpmem_set_image()
798 v_offset = image->v_offset ? image->v_offset : 0; in ipu_cpmem_set_image()
800 ipu_cpmem_set_yuv_planar_full(ch, pix->bytesperline, in ipu_cpmem_set_image()
804 offset = Y_OFFSET(pix, image->rect.left, image->rect.top); in ipu_cpmem_set_image()
805 u_offset = image->u_offset ? in ipu_cpmem_set_image()
806 image->u_offset : UV2_OFFSET(pix, image->rect.left, in ipu_cpmem_set_image()
807 image->rect.top) - offset; in ipu_cpmem_set_image()
808 v_offset = image->v_offset ? image->v_offset : 0; in ipu_cpmem_set_image()
810 ipu_cpmem_set_yuv_planar_full(ch, pix->bytesperline, in ipu_cpmem_set_image()
816 offset = image->rect.left * 2 + in ipu_cpmem_set_image()
817 image->rect.top * pix->bytesperline; in ipu_cpmem_set_image()
829 offset = image->rect.left * 4 + in ipu_cpmem_set_image()
830 image->rect.top * pix->bytesperline; in ipu_cpmem_set_image()
834 offset = image->rect.left * 3 + in ipu_cpmem_set_image()
835 image->rect.top * pix->bytesperline; in ipu_cpmem_set_image()
842 offset = image->rect.left + image->rect.top * pix->bytesperline; in ipu_cpmem_set_image()
849 offset = image->rect.left * 2 + in ipu_cpmem_set_image()
850 image->rect.top * pix->bytesperline; in ipu_cpmem_set_image()
856 ret = -EINVAL; in ipu_cpmem_set_image()
859 ipu_cpmem_set_buffer(ch, 0, image->phys0 + offset); in ipu_cpmem_set_image()
860 ipu_cpmem_set_buffer(ch, 1, image->phys1 + offset); in ipu_cpmem_set_image()
869 struct ipu_soc *ipu = ch->ipu; in ipu_cpmem_dump()
870 int chno = ch->num; in ipu_cpmem_dump()
872 dev_dbg(ipu->dev, "ch %d word 0 - %08X %08X %08X %08X %08X\n", chno, in ipu_cpmem_dump()
873 readl(&p->word[0].data[0]), in ipu_cpmem_dump()
874 readl(&p->word[0].data[1]), in ipu_cpmem_dump()
875 readl(&p->word[0].data[2]), in ipu_cpmem_dump()
876 readl(&p->word[0].data[3]), in ipu_cpmem_dump()
877 readl(&p->word[0].data[4])); in ipu_cpmem_dump()
878 dev_dbg(ipu->dev, "ch %d word 1 - %08X %08X %08X %08X %08X\n", chno, in ipu_cpmem_dump()
879 readl(&p->word[1].data[0]), in ipu_cpmem_dump()
880 readl(&p->word[1].data[1]), in ipu_cpmem_dump()
881 readl(&p->word[1].data[2]), in ipu_cpmem_dump()
882 readl(&p->word[1].data[3]), in ipu_cpmem_dump()
883 readl(&p->word[1].data[4])); in ipu_cpmem_dump()
884 dev_dbg(ipu->dev, "PFS 0x%x, ", in ipu_cpmem_dump()
886 dev_dbg(ipu->dev, "BPP 0x%x, ", in ipu_cpmem_dump()
888 dev_dbg(ipu->dev, "NPB 0x%x\n", in ipu_cpmem_dump()
891 dev_dbg(ipu->dev, "FW %d, ", in ipu_cpmem_dump()
893 dev_dbg(ipu->dev, "FH %d, ", in ipu_cpmem_dump()
895 dev_dbg(ipu->dev, "EBA0 0x%x\n", in ipu_cpmem_dump()
897 dev_dbg(ipu->dev, "EBA1 0x%x\n", in ipu_cpmem_dump()
899 dev_dbg(ipu->dev, "Stride %d\n", in ipu_cpmem_dump()
901 dev_dbg(ipu->dev, "scan_order %d\n", in ipu_cpmem_dump()
903 dev_dbg(ipu->dev, "uv_stride %d\n", in ipu_cpmem_dump()
905 dev_dbg(ipu->dev, "u_offset 0x%x\n", in ipu_cpmem_dump()
907 dev_dbg(ipu->dev, "v_offset 0x%x\n", in ipu_cpmem_dump()
910 dev_dbg(ipu->dev, "Width0 %d+1, ", in ipu_cpmem_dump()
912 dev_dbg(ipu->dev, "Width1 %d+1, ", in ipu_cpmem_dump()
914 dev_dbg(ipu->dev, "Width2 %d+1, ", in ipu_cpmem_dump()
916 dev_dbg(ipu->dev, "Width3 %d+1, ", in ipu_cpmem_dump()
918 dev_dbg(ipu->dev, "Offset0 %d, ", in ipu_cpmem_dump()
920 dev_dbg(ipu->dev, "Offset1 %d, ", in ipu_cpmem_dump()
922 dev_dbg(ipu->dev, "Offset2 %d, ", in ipu_cpmem_dump()
924 dev_dbg(ipu->dev, "Offset3 %d\n", in ipu_cpmem_dump()
935 return -ENOMEM; in ipu_cpmem_init()
937 ipu->cpmem_priv = cpmem; in ipu_cpmem_init()
939 spin_lock_init(&cpmem->lock); in ipu_cpmem_init()
940 cpmem->base = devm_ioremap(dev, base, SZ_128K); in ipu_cpmem_init()
941 if (!cpmem->base) in ipu_cpmem_init()
942 return -ENOMEM; in ipu_cpmem_init()
945 base, cpmem->base); in ipu_cpmem_init()
946 cpmem->ipu = ipu; in ipu_cpmem_init()