drivers/media/platform/qcom/iris/iris_vidc.c
Source file repositories/reference/linux-study-clean/drivers/media/platform/qcom/iris/iris_vidc.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/platform/qcom/iris/iris_vidc.c- Extension
.c- Size
- 20110 bytes
- Lines
- 720
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/pm_runtime.hmedia/v4l2-event.hmedia/v4l2-ioctl.hmedia/v4l2-mem2mem.hmedia/videobuf2-dma-contig.hiris_vidc.hiris_instance.hiris_vdec.hiris_venc.hiris_vb2.hiris_vpu_buffer.hiris_platform_common.h
Detected Declarations
function Copyrightfunction iris_v4l2_fh_deinitfunction iris_add_sessionfunction iris_remove_sessionfunction iris_m2m_device_runfunction iris_m2m_queue_initfunction iris_openfunction iris_session_closefunction iris_check_num_queued_internal_buffersfunction iris_closefunction iris_enum_fmtfunction iris_try_fmt_vid_mplanefunction iris_s_fmt_vid_mplanefunction iris_g_fmt_vid_mplanefunction iris_enum_framesizesfunction iris_enum_frameintervalsfunction iris_querycapfunction iris_g_selectionfunction iris_s_selectionfunction iris_subscribe_eventfunction iris_s_parmfunction iris_g_parmfunction iris_dec_cmdfunction iris_enc_cmdfunction iris_init_ops
Annotated Snippet
if (iter->session_id == inst->session_id) {
list_del_init(&iter->list);
break;
}
}
mutex_unlock(&core->lock);
}
static inline struct iris_inst *iris_get_inst(struct file *filp)
{
return container_of(file_to_v4l2_fh(filp), struct iris_inst, fh);
}
static void iris_m2m_device_run(void *priv)
{
}
static void iris_m2m_job_abort(void *priv)
{
struct iris_inst *inst = priv;
struct v4l2_m2m_ctx *m2m_ctx = inst->m2m_ctx;
v4l2_m2m_job_finish(inst->m2m_dev, m2m_ctx);
}
static const struct v4l2_m2m_ops iris_m2m_ops = {
.device_run = iris_m2m_device_run,
.job_abort = iris_m2m_job_abort,
};
static int
iris_m2m_queue_init(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_vq)
{
struct iris_inst *inst = priv;
int ret;
src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
src_vq->io_modes = VB2_MMAP | VB2_DMABUF;
src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
src_vq->ops = inst->core->iris_vb2_ops;
src_vq->mem_ops = &vb2_dma_contig_memops;
src_vq->drv_priv = inst;
src_vq->buf_struct_size = sizeof(struct iris_buffer);
src_vq->min_reqbufs_allocation = MIN_BUFFERS;
src_vq->dev = inst->core->dev;
src_vq->lock = &inst->ctx_q_lock;
ret = vb2_queue_init(src_vq);
if (ret)
return ret;
dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
dst_vq->io_modes = VB2_MMAP | VB2_DMABUF;
dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
dst_vq->ops = inst->core->iris_vb2_ops;
dst_vq->mem_ops = &vb2_dma_contig_memops;
dst_vq->drv_priv = inst;
dst_vq->buf_struct_size = sizeof(struct iris_buffer);
dst_vq->min_reqbufs_allocation = MIN_BUFFERS;
dst_vq->dev = inst->core->dev;
dst_vq->lock = &inst->ctx_q_lock;
return vb2_queue_init(dst_vq);
}
int iris_open(struct file *filp)
{
struct iris_core *core = video_drvdata(filp);
struct video_device *vdev;
struct iris_inst *inst;
u32 session_type;
int ret;
vdev = video_devdata(filp);
if (strcmp(vdev->name, "qcom-iris-decoder") == 0)
session_type = DECODER;
else if (strcmp(vdev->name, "qcom-iris-encoder") == 0)
session_type = ENCODER;
else
return -EINVAL;
ret = pm_runtime_resume_and_get(core->dev);
if (ret < 0)
return ret;
ret = iris_core_init(core);
if (ret) {
dev_err(core->dev, "core init failed\n");
pm_runtime_put_sync(core->dev);
return ret;
}
Annotation
- Immediate include surface: `linux/pm_runtime.h`, `media/v4l2-event.h`, `media/v4l2-ioctl.h`, `media/v4l2-mem2mem.h`, `media/videobuf2-dma-contig.h`, `iris_vidc.h`, `iris_instance.h`, `iris_vdec.h`.
- Detected declarations: `function Copyright`, `function iris_v4l2_fh_deinit`, `function iris_add_session`, `function iris_remove_session`, `function iris_m2m_device_run`, `function iris_m2m_queue_init`, `function iris_open`, `function iris_session_close`, `function iris_check_num_queued_internal_buffers`, `function iris_close`.
- Atlas domain: Driver Families / drivers/media.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- 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.