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.

Dependency Surface

Detected Declarations

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

Implementation Notes