Lines Matching +full:- +full:y
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
6 #include <media/v4l2-event.h>
7 #include <media/v4l2-mem2mem.h>
28 * YUV 4:2:0 image with a plane of 8 bit Y samples followed
32 * <-Y/UV_Stride (aligned to 128)->
33 * <------- Width ------->
34 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . ^ ^
35 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | |
36 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . Height |
37 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | y_scanlines (aligned to 32)
38 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | |
39 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | |
40 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | |
41 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . V |
52 * . . . . . . . . . . . . . . . . --> Buffer size aligned to 4K
66 struct v4l2_format *f = inst->fmt_dst; in iris_yuv_buffer_size_nv12()
68 y_stride = ALIGN(f->fmt.pix_mp.width, Y_STRIDE_ALIGN); in iris_yuv_buffer_size_nv12()
69 uv_stride = ALIGN(f->fmt.pix_mp.width, UV_STRIDE_ALIGN); in iris_yuv_buffer_size_nv12()
70 y_scanlines = ALIGN(f->fmt.pix_mp.height, Y_SCANLINE_ALIGN); in iris_yuv_buffer_size_nv12()
71 uv_scanlines = ALIGN((f->fmt.pix_mp.height + 1) >> 1, UV_SCANLINE_ALIGN); in iris_yuv_buffer_size_nv12()
80 * Compressed Macro-tile format for NV12.
81 * Contains 4 planes in the following order -
89 * Y_UBWC_Plane consists of Y data in compressed macro-tile format.
91 * Y_UBWC_Plane data to produce loss-less uncompressed 8 bit Y samples.
95 * UV_UBWC_Plane consists of UV data in compressed macro-tile format.
97 * UV_UBWC_Plane data to produce loss-less uncompressed 8 bit 2x2
103 * <----- y_meta_stride ----> (aligned to 64)
104 * <-------- Width ------>
115 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
117 * <--Compressed tile y_stride---> (aligned to 128)
118 * <------- Width ------->
119 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^
120 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
121 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Height |
122 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile y_scanlines (aligned to 32)
123 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
124 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
125 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
126 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . V |
129 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
131 * <----- uv_meta_stride ----> (aligned to 64)
138 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
139 * <--Compressed tile uv_stride---> (aligned to 128)
146 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
169 struct v4l2_format *f = inst->fmt_dst; in iris_yuv_buffer_size_qc08c()
173 y_meta_stride = ALIGN(DIV_ROUND_UP(f->fmt.pix_mp.width, META_STRIDE_ALIGNED >> 1), in iris_yuv_buffer_size_qc08c()
175 y_meta_plane = y_meta_stride * ALIGN(DIV_ROUND_UP(f->fmt.pix_mp.height, in iris_yuv_buffer_size_qc08c()
180 y_stride = ALIGN(f->fmt.pix_mp.width, Y_STRIDE_ALIGN); in iris_yuv_buffer_size_qc08c()
181 y_plane = ALIGN(y_stride * ALIGN(f->fmt.pix_mp.height, Y_SCANLINE_ALIGN), PIXELS_4K); in iris_yuv_buffer_size_qc08c()
183 uv_meta_stride = ALIGN(DIV_ROUND_UP(f->fmt.pix_mp.width / 2, META_STRIDE_ALIGNED >> 2), in iris_yuv_buffer_size_qc08c()
185 uv_meta_plane = uv_meta_stride * ALIGN(DIV_ROUND_UP(f->fmt.pix_mp.height / 2, in iris_yuv_buffer_size_qc08c()
190 uv_stride = ALIGN(f->fmt.pix_mp.width, UV_STRIDE_ALIGN); in iris_yuv_buffer_size_qc08c()
191 uv_plane = ALIGN(uv_stride * ALIGN(f->fmt.pix_mp.height / 2, UV_SCANLINE_ALIGN_QC08C), in iris_yuv_buffer_size_qc08c()
199 struct platform_inst_caps *caps = inst->core->iris_platform_data->inst_caps; in iris_bitstream_buffer_size()
207 base_res_mbs = caps->max_mbpf; in iris_bitstream_buffer_size()
237 struct iris_buffers *buffers = &inst->buffers[buffer_type]; in iris_fill_internal_buf_info()
239 buffers->size = iris_vpu_buf_size(inst, buffer_type); in iris_fill_internal_buf_info()
240 buffers->min_count = iris_vpu_buf_count(inst, buffer_type); in iris_fill_internal_buf_info()
245 const struct iris_platform_data *platform_data = inst->core->iris_platform_data; in iris_get_internal_buffers()
250 internal_buf_type = platform_data->dec_ip_int_buf_tbl; in iris_get_internal_buffers()
251 internal_buffer_count = platform_data->dec_ip_int_buf_tbl_size; in iris_get_internal_buffers()
255 internal_buf_type = platform_data->dec_op_int_buf_tbl; in iris_get_internal_buffers()
256 internal_buffer_count = platform_data->dec_op_int_buf_tbl_size; in iris_get_internal_buffers()
265 struct iris_buffers *buffers = &inst->buffers[buffer_type]; in iris_create_internal_buffer()
266 struct iris_core *core = inst->core; in iris_create_internal_buffer()
269 if (!buffers->size) in iris_create_internal_buffer()
274 return -ENOMEM; in iris_create_internal_buffer()
276 INIT_LIST_HEAD(&buffer->list); in iris_create_internal_buffer()
277 buffer->type = buffer_type; in iris_create_internal_buffer()
278 buffer->index = index; in iris_create_internal_buffer()
279 buffer->buffer_size = buffers->size; in iris_create_internal_buffer()
280 buffer->dma_attrs = DMA_ATTR_WRITE_COMBINE | DMA_ATTR_NO_KERNEL_MAPPING; in iris_create_internal_buffer()
281 list_add_tail(&buffer->list, &buffers->list); in iris_create_internal_buffer()
283 buffer->kvaddr = dma_alloc_attrs(core->dev, buffer->buffer_size, in iris_create_internal_buffer()
284 &buffer->device_addr, GFP_KERNEL, buffer->dma_attrs); in iris_create_internal_buffer()
285 if (!buffer->kvaddr) in iris_create_internal_buffer()
286 return -ENOMEM; in iris_create_internal_buffer()
293 const struct iris_platform_data *platform_data = inst->core->iris_platform_data; in iris_create_internal_buffers()
300 internal_buf_type = platform_data->dec_ip_int_buf_tbl; in iris_create_internal_buffers()
301 internal_buffer_count = platform_data->dec_ip_int_buf_tbl_size; in iris_create_internal_buffers()
303 internal_buf_type = platform_data->dec_op_int_buf_tbl; in iris_create_internal_buffers()
304 internal_buffer_count = platform_data->dec_op_int_buf_tbl_size; in iris_create_internal_buffers()
308 buffers = &inst->buffers[internal_buf_type[i]]; in iris_create_internal_buffers()
309 for (j = 0; j < buffers->min_count; j++) { in iris_create_internal_buffers()
321 const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops; in iris_queue_buffer()
324 ret = hfi_ops->session_queue_buf(inst, buf); in iris_queue_buffer()
328 buf->attr &= ~BUF_ATTR_DEFERRED; in iris_queue_buffer()
329 buf->attr |= BUF_ATTR_QUEUED; in iris_queue_buffer()
336 const struct iris_platform_data *platform_data = inst->core->iris_platform_data; in iris_queue_internal_buffers()
344 internal_buf_type = platform_data->dec_ip_int_buf_tbl; in iris_queue_internal_buffers()
345 internal_buffer_count = platform_data->dec_ip_int_buf_tbl_size; in iris_queue_internal_buffers()
347 internal_buf_type = platform_data->dec_op_int_buf_tbl; in iris_queue_internal_buffers()
348 internal_buffer_count = platform_data->dec_op_int_buf_tbl_size; in iris_queue_internal_buffers()
352 buffers = &inst->buffers[internal_buf_type[i]]; in iris_queue_internal_buffers()
353 list_for_each_entry_safe(buffer, next, &buffers->list, list) { in iris_queue_internal_buffers()
354 if (buffer->attr & BUF_ATTR_PENDING_RELEASE) in iris_queue_internal_buffers()
356 if (buffer->attr & BUF_ATTR_QUEUED) in iris_queue_internal_buffers()
369 struct iris_core *core = inst->core; in iris_destroy_internal_buffer()
371 list_del(&buffer->list); in iris_destroy_internal_buffer()
372 dma_free_attrs(core->dev, buffer->buffer_size, buffer->kvaddr, in iris_destroy_internal_buffer()
373 buffer->device_addr, buffer->dma_attrs); in iris_destroy_internal_buffer()
381 const struct iris_platform_data *platform_data = inst->core->iris_platform_data; in iris_destroy_internal_buffers()
389 internal_buf_type = platform_data->dec_ip_int_buf_tbl; in iris_destroy_internal_buffers()
390 len = platform_data->dec_ip_int_buf_tbl_size; in iris_destroy_internal_buffers()
392 internal_buf_type = platform_data->dec_op_int_buf_tbl; in iris_destroy_internal_buffers()
393 len = platform_data->dec_op_int_buf_tbl_size; in iris_destroy_internal_buffers()
397 buffers = &inst->buffers[internal_buf_type[i]]; in iris_destroy_internal_buffers()
398 list_for_each_entry_safe(buf, next, &buffers->list, list) { in iris_destroy_internal_buffers()
411 const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops; in iris_release_internal_buffers()
412 struct iris_buffers *buffers = &inst->buffers[buffer_type]; in iris_release_internal_buffers()
416 list_for_each_entry_safe(buffer, next, &buffers->list, list) { in iris_release_internal_buffers()
417 if (buffer->attr & BUF_ATTR_PENDING_RELEASE) in iris_release_internal_buffers()
419 if (!(buffer->attr & BUF_ATTR_QUEUED)) in iris_release_internal_buffers()
421 ret = hfi_ops->session_release_buf(inst, buffer); in iris_release_internal_buffers()
424 buffer->attr |= BUF_ATTR_PENDING_RELEASE; in iris_release_internal_buffers()
432 const struct iris_platform_data *platform_data = inst->core->iris_platform_data; in iris_release_input_internal_buffers()
437 internal_buf_type = platform_data->dec_ip_int_buf_tbl; in iris_release_input_internal_buffers()
438 internal_buffer_count = platform_data->dec_ip_int_buf_tbl_size; in iris_release_input_internal_buffers()
451 struct iris_buffers *buffers = &inst->buffers[BUF_PERSIST]; in iris_alloc_and_queue_persist_bufs()
456 if (!list_empty(&buffers->list)) in iris_alloc_and_queue_persist_bufs()
461 for (i = 0; i < buffers->min_count; i++) { in iris_alloc_and_queue_persist_bufs()
467 list_for_each_entry_safe(buffer, next, &buffers->list, list) { in iris_alloc_and_queue_persist_bufs()
468 if (buffer->attr & BUF_ATTR_PENDING_RELEASE) in iris_alloc_and_queue_persist_bufs()
470 if (buffer->attr & BUF_ATTR_QUEUED) in iris_alloc_and_queue_persist_bufs()
499 struct v4l2_m2m_ctx *m2m_ctx = inst->m2m_ctx; in iris_queue_deferred_buffers()
508 buf = to_iris_buffer(&buffer->vb); in iris_queue_deferred_buffers()
509 if (!(buf->attr & BUF_ATTR_DEFERRED)) in iris_queue_deferred_buffers()
517 buf = to_iris_buffer(&buffer->vb); in iris_queue_deferred_buffers()
518 if (!(buf->attr & BUF_ATTR_DEFERRED)) in iris_queue_deferred_buffers()
531 struct v4l2_m2m_ctx *m2m_ctx = inst->m2m_ctx; in iris_vb2_queue_error()
543 struct v4l2_m2m_ctx *m2m_ctx = inst->m2m_ctx; in iris_helper_find_buf()
557 for (i = 0; i < ARRAY_SIZE(inst->tss); ++i) { in iris_get_ts_metadata()
558 if (inst->tss[i].ts_ns != timestamp_ns) in iris_get_ts_metadata()
561 vbuf->flags &= ~mask; in iris_get_ts_metadata()
562 vbuf->flags |= inst->tss[i].flags; in iris_get_ts_metadata()
563 vbuf->timecode = inst->tss[i].tc; in iris_get_ts_metadata()
567 vbuf->flags &= ~mask; in iris_get_ts_metadata()
568 vbuf->flags |= inst->tss[inst->metadata_idx].flags; in iris_get_ts_metadata()
569 vbuf->timecode = inst->tss[inst->metadata_idx].tc; in iris_get_ts_metadata()
574 struct v4l2_m2m_ctx *m2m_ctx = inst->m2m_ctx; in iris_vb2_buffer_done()
579 switch (buf->type) { in iris_vb2_buffer_done()
590 vbuf = iris_helper_find_buf(inst, type, buf->index); in iris_vb2_buffer_done()
592 return -EINVAL; in iris_vb2_buffer_done()
594 vb2 = &vbuf->vb2_buf; in iris_vb2_buffer_done()
596 if (buf->flags & V4L2_BUF_FLAG_ERROR) in iris_vb2_buffer_done()
601 vbuf->flags |= buf->flags; in iris_vb2_buffer_done()
604 vb2_set_plane_payload(vb2, 0, buf->data_size); in iris_vb2_buffer_done()
605 vbuf->sequence = inst->sequence_cap++; in iris_vb2_buffer_done()
606 iris_get_ts_metadata(inst, buf->timestamp, vbuf); in iris_vb2_buffer_done()
608 vbuf->sequence = inst->sequence_out++; in iris_vb2_buffer_done()
611 if (vbuf->flags & V4L2_BUF_FLAG_LAST) { in iris_vb2_buffer_done()
615 v4l2_event_queue_fh(&inst->fh, &ev); in iris_vb2_buffer_done()
619 vb2->timestamp = buf->timestamp; in iris_vb2_buffer_done()