drivers/media/platform/qcom/iris/iris_buffer.c
Source file repositories/reference/linux-study-clean/drivers/media/platform/qcom/iris/iris_buffer.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/platform/qcom/iris/iris_buffer.c- Extension
.c- Size
- 31769 bytes
- Lines
- 994
- Domain
- Driver Families
- Bucket
- drivers/media
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
media/v4l2-event.hmedia/v4l2-mem2mem.hiris_buffer.hiris_instance.hiris_power.hiris_vpu_buffer.h
Detected Declarations
function Copyrightfunction iris_yuv_buffer_size_p010function iris_yuv_buffer_size_qc08cfunction iris_yuv_buffer_size_qc10cfunction iris_dec_bitstream_buffer_sizefunction iris_enc_bitstream_buffer_sizefunction iris_get_buffer_sizefunction iris_fill_internal_buf_infofunction iris_get_internal_buffersfunction iris_create_internal_bufferfunction iris_create_internal_buffersfunction iris_queue_bufferfunction iris_queue_internal_deferred_buffersfunction iris_queue_internal_buffersfunction list_for_each_entry_safefunction iris_destroy_internal_bufferfunction iris_destroy_internal_buffersfunction list_for_each_entry_safefunction list_for_each_entry_safefunction iris_destroy_all_internal_buffersfunction iris_destroy_dequeued_internal_buffersfunction iris_release_internal_buffersfunction list_for_each_entry_safefunction iris_release_input_internal_buffersfunction iris_alloc_and_queue_persist_bufsfunction list_for_each_entry_safefunction iris_alloc_and_queue_input_int_bufsfunction iris_queue_deferred_buffersfunction v4l2_m2m_for_each_dst_buf_safefunction iris_vb2_queue_errorfunction iris_helper_find_buffunction iris_get_ts_metadatafunction iris_vb2_buffer_done
Annotated Snippet
switch (buffer_type) {
case BUF_INPUT:
return iris_dec_bitstream_buffer_size(inst);
case BUF_OUTPUT:
if (inst->fmt_dst->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_QC08C)
return iris_yuv_buffer_size_qc08c(inst);
else if (inst->fmt_dst->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_QC10C)
return iris_yuv_buffer_size_qc10c(inst);
else if (inst->fmt_dst->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_P010)
return iris_yuv_buffer_size_p010(inst);
else
return iris_yuv_buffer_size_nv12(inst);
case BUF_DPB:
if (iris_fmt_is_10bit(inst->fmt_dst->fmt.pix_mp.pixelformat))
return iris_yuv_buffer_size_qc10c(inst);
else
return iris_yuv_buffer_size_qc08c(inst);
default:
return 0;
}
} else {
switch (buffer_type) {
case BUF_INPUT:
if (inst->fmt_src->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_QC08C)
return iris_yuv_buffer_size_qc08c(inst);
else
return iris_yuv_buffer_size_nv12(inst);
case BUF_OUTPUT:
return iris_enc_bitstream_buffer_size(inst);
default:
return 0;
}
}
}
static void iris_fill_internal_buf_info(struct iris_inst *inst,
enum iris_buffer_type buffer_type)
{
struct iris_buffers *buffers = &inst->buffers[buffer_type];
buffers->size = inst->core->iris_firmware_desc->get_vpu_buffer_size(inst, buffer_type);
buffers->min_count = iris_vpu_buf_count(inst, buffer_type);
}
void iris_get_internal_buffers(struct iris_inst *inst, u32 plane)
{
const struct iris_firmware_data *firmware_data = inst->core->iris_firmware_data;
const u32 *internal_buf_type;
u32 internal_buffer_count, i;
if (inst->domain == DECODER) {
if (V4L2_TYPE_IS_OUTPUT(plane)) {
internal_buf_type = firmware_data->dec_ip_int_buf_tbl;
internal_buffer_count = firmware_data->dec_ip_int_buf_tbl_size;
for (i = 0; i < internal_buffer_count; i++)
iris_fill_internal_buf_info(inst, internal_buf_type[i]);
} else {
internal_buf_type = firmware_data->dec_op_int_buf_tbl;
internal_buffer_count = firmware_data->dec_op_int_buf_tbl_size;
for (i = 0; i < internal_buffer_count; i++)
iris_fill_internal_buf_info(inst, internal_buf_type[i]);
}
} else {
if (V4L2_TYPE_IS_OUTPUT(plane)) {
internal_buf_type = firmware_data->enc_ip_int_buf_tbl;
internal_buffer_count = firmware_data->enc_ip_int_buf_tbl_size;
for (i = 0; i < internal_buffer_count; i++)
iris_fill_internal_buf_info(inst, internal_buf_type[i]);
} else {
internal_buf_type = firmware_data->enc_op_int_buf_tbl;
internal_buffer_count = firmware_data->enc_op_int_buf_tbl_size;
for (i = 0; i < internal_buffer_count; i++)
iris_fill_internal_buf_info(inst, internal_buf_type[i]);
}
}
}
static int iris_create_internal_buffer(struct iris_inst *inst,
enum iris_buffer_type buffer_type, u32 index)
{
struct iris_buffers *buffers = &inst->buffers[buffer_type];
struct iris_core *core = inst->core;
struct iris_buffer *buffer;
if (!buffers->size)
return 0;
buffer = kzalloc_obj(*buffer);
if (!buffer)
return -ENOMEM;
Annotation
- Immediate include surface: `media/v4l2-event.h`, `media/v4l2-mem2mem.h`, `iris_buffer.h`, `iris_instance.h`, `iris_power.h`, `iris_vpu_buffer.h`.
- Detected declarations: `function Copyright`, `function iris_yuv_buffer_size_p010`, `function iris_yuv_buffer_size_qc08c`, `function iris_yuv_buffer_size_qc10c`, `function iris_dec_bitstream_buffer_size`, `function iris_enc_bitstream_buffer_size`, `function iris_get_buffer_size`, `function iris_fill_internal_buf_info`, `function iris_get_internal_buffers`, `function iris_create_internal_buffer`.
- Atlas domain: Driver Families / drivers/media.
- Implementation status: source implementation candidate.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.