Lines Matching +full:top +full:- +full:left

1 // SPDX-License-Identifier: GPL-2.0+
3 * vsp1_rpf.c -- R-Car VSP1 Read Pixel Formatter
5 * Copyright (C) 2013-2014 Renesas Electronics Corporation
12 #include <media/v4l2-subdev.h>
35 /* -----------------------------------------------------------------------------
42 vsp1_dl_body_write(dlb, reg + rpf->entity.index * VI6_RPF_OFFSET, in vsp1_rpf_write()
46 /* -----------------------------------------------------------------------------
54 /* -----------------------------------------------------------------------------
63 struct vsp1_rwpf *rpf = to_rwpf(&entity->subdev); in rpf_configure_stream()
64 const struct vsp1_format_info *fmtinfo = rpf->fmtinfo; in rpf_configure_stream()
65 const struct v4l2_pix_format_mplane *format = &rpf->format; in rpf_configure_stream()
68 unsigned int left = 0; in rpf_configure_stream() local
69 unsigned int top = 0; in rpf_configure_stream() local
74 pstride = format->plane_fmt[0].bytesperline in rpf_configure_stream()
76 if (format->num_planes > 1) in rpf_configure_stream()
77 pstride |= format->plane_fmt[1].bytesperline in rpf_configure_stream()
85 if (pipe->interlaced) in rpf_configure_stream()
91 sink_format = vsp1_entity_get_pad_format(&rpf->entity, in rpf_configure_stream()
92 rpf->entity.config, in rpf_configure_stream()
94 source_format = vsp1_entity_get_pad_format(&rpf->entity, in rpf_configure_stream()
95 rpf->entity.config, in rpf_configure_stream()
99 | (fmtinfo->hwfmt << VI6_RPF_INFMT_RDFMT_SHIFT); in rpf_configure_stream()
101 if (fmtinfo->swap_yc) in rpf_configure_stream()
103 if (fmtinfo->swap_uv) in rpf_configure_stream()
106 if (sink_format->code != source_format->code) in rpf_configure_stream()
110 vsp1_rpf_write(rpf, dlb, VI6_RPF_DSWAP, fmtinfo->swap); in rpf_configure_stream()
113 if (pipe->brx) { in rpf_configure_stream()
116 compose = vsp1_entity_get_pad_selection(pipe->brx, in rpf_configure_stream()
117 pipe->brx->config, in rpf_configure_stream()
118 rpf->brx_input, in rpf_configure_stream()
120 left = compose->left; in rpf_configure_stream()
121 top = compose->top; in rpf_configure_stream()
124 if (pipe->interlaced) in rpf_configure_stream()
125 top /= 2; in rpf_configure_stream()
128 (left << VI6_RPF_LOC_HCOORD_SHIFT) | in rpf_configure_stream()
129 (top << VI6_RPF_LOC_VCOORD_SHIFT)); in rpf_configure_stream()
155 (fmtinfo->alpha ? VI6_RPF_ALPH_SEL_ASEL_PACKED in rpf_configure_stream()
158 if (entity->vsp1->info->gen == 3) { in rpf_configure_stream()
161 if (fmtinfo->alpha) { in rpf_configure_stream()
170 bool premultiplied = format->flags in rpf_configure_stream()
188 rpf->mult_alpha = mult; in rpf_configure_stream()
199 const struct v4l2_pix_format_mplane *format = &rpf->format; in vsp1_rpf_configure_autofld()
208 /* Re-index our auto_fld to match the current RPF. */ in vsp1_rpf_configure_autofld()
209 auto_fld = cmd->data; in vsp1_rpf_configure_autofld()
210 auto_fld = &auto_fld[rpf->entity.index]; in vsp1_rpf_configure_autofld()
212 auto_fld->top_y0 = rpf->mem.addr[0]; in vsp1_rpf_configure_autofld()
213 auto_fld->top_c0 = rpf->mem.addr[1]; in vsp1_rpf_configure_autofld()
214 auto_fld->top_c1 = rpf->mem.addr[2]; in vsp1_rpf_configure_autofld()
216 offset_y = format->plane_fmt[0].bytesperline; in vsp1_rpf_configure_autofld()
217 offset_c = format->plane_fmt[1].bytesperline; in vsp1_rpf_configure_autofld()
219 auto_fld->bottom_y0 = rpf->mem.addr[0] + offset_y; in vsp1_rpf_configure_autofld()
220 auto_fld->bottom_c0 = rpf->mem.addr[1] + offset_c; in vsp1_rpf_configure_autofld()
221 auto_fld->bottom_c1 = rpf->mem.addr[2] + offset_c; in vsp1_rpf_configure_autofld()
223 cmd->flags |= VI6_DL_EXT_AUTOFLD_INT | BIT(16 + rpf->entity.index); in vsp1_rpf_configure_autofld()
231 struct vsp1_rwpf *rpf = to_rwpf(&entity->subdev); in rpf_configure_frame()
234 rpf->alpha << VI6_RPF_VRTCOL_SET_LAYA_SHIFT); in rpf_configure_frame()
235 vsp1_rpf_write(rpf, dlb, VI6_RPF_MULT_ALPHA, rpf->mult_alpha | in rpf_configure_frame()
236 (rpf->alpha << VI6_RPF_MULT_ALPHA_RATIO_SHIFT)); in rpf_configure_frame()
238 vsp1_pipeline_propagate_alpha(pipe, dlb, rpf->alpha); in rpf_configure_frame()
246 struct vsp1_rwpf *rpf = to_rwpf(&entity->subdev); in rpf_configure_partition()
247 struct vsp1_rwpf_memory mem = rpf->mem; in rpf_configure_partition()
248 struct vsp1_device *vsp1 = rpf->entity.vsp1; in rpf_configure_partition()
249 const struct vsp1_format_info *fmtinfo = rpf->fmtinfo; in rpf_configure_partition()
250 const struct v4l2_pix_format_mplane *format = &rpf->format; in rpf_configure_partition()
257 * rectangle top left corner in the plane buffer. Only two in rpf_configure_partition()
261 crop = *vsp1_rwpf_get_crop(rpf, rpf->entity.config); in rpf_configure_partition()
269 * To achieve this, we adjust our crop to provide a 'sub-crop' in rpf_configure_partition()
270 * matching the expected partition window. Only 'left' and in rpf_configure_partition()
273 if (pipe->partitions > 1) { in rpf_configure_partition()
274 crop.width = pipe->partition->rpf.width; in rpf_configure_partition()
275 crop.left += pipe->partition->rpf.left; in rpf_configure_partition()
278 if (pipe->interlaced) { in rpf_configure_partition()
279 crop.height = round_down(crop.height / 2, fmtinfo->vsub); in rpf_configure_partition()
280 crop.top = round_down(crop.top / 2, fmtinfo->vsub); in rpf_configure_partition()
290 mem.addr[0] += crop.top * format->plane_fmt[0].bytesperline in rpf_configure_partition()
291 + crop.left * fmtinfo->bpp[0] / 8; in rpf_configure_partition()
293 if (format->num_planes > 1) { in rpf_configure_partition()
296 offset = crop.top * format->plane_fmt[1].bytesperline in rpf_configure_partition()
297 + crop.left / fmtinfo->hsub in rpf_configure_partition()
298 * fmtinfo->bpp[1] / 8; in rpf_configure_partition()
304 * On Gen3 hardware the SPUVS bit has no effect on 3-planar in rpf_configure_partition()
307 if (vsp1->info->gen == 3 && format->num_planes == 3 && in rpf_configure_partition()
308 fmtinfo->swap_uv) in rpf_configure_partition()
312 * Interlaced pipelines will use the extended pre-cmd to process in rpf_configure_partition()
315 if (pipe->interlaced) { in rpf_configure_partition()
330 partition->rpf = *window; in rpf_partition()
340 /* -----------------------------------------------------------------------------
350 rpf = devm_kzalloc(vsp1->dev, sizeof(*rpf), GFP_KERNEL); in vsp1_rpf_create()
352 return ERR_PTR(-ENOMEM); in vsp1_rpf_create()
354 rpf->max_width = RPF_MAX_WIDTH; in vsp1_rpf_create()
355 rpf->max_height = RPF_MAX_HEIGHT; in vsp1_rpf_create()
357 rpf->entity.ops = &rpf_entity_ops; in vsp1_rpf_create()
358 rpf->entity.type = VSP1_ENTITY_RPF; in vsp1_rpf_create()
359 rpf->entity.index = index; in vsp1_rpf_create()
362 ret = vsp1_entity_init(vsp1, &rpf->entity, name, 2, &rpf_ops, in vsp1_rpf_create()
370 dev_err(vsp1->dev, "rpf%u: failed to initialize controls\n", in vsp1_rpf_create()
375 v4l2_ctrl_handler_setup(&rpf->ctrls); in vsp1_rpf_create()
380 vsp1_entity_destroy(&rpf->entity); in vsp1_rpf_create()