Lines Matching refs:node
183 #define is_fe_node(node) (((node)->id) >= FE_OUT0) argument
184 #define is_csi2_node(node) (!is_fe_node(node)) argument
186 #define node_supports_image_output(node) \ argument
187 (node_desc[(node)->id].caps & V4L2_CAP_VIDEO_CAPTURE)
188 #define node_supports_meta_output(node) \ argument
189 (node_desc[(node)->id].caps & V4L2_CAP_META_CAPTURE)
190 #define node_supports_image_input(node) \ argument
191 (node_desc[(node)->id].caps & V4L2_CAP_VIDEO_OUTPUT)
192 #define node_supports_meta_input(node) \ argument
193 (node_desc[(node)->id].caps & V4L2_CAP_META_OUTPUT)
194 #define node_supports_image(node) \ argument
195 (node_supports_image_output(node) || node_supports_image_input(node))
196 #define node_supports_meta(node) \ argument
197 (node_supports_meta_output(node) || node_supports_meta_input(node))
199 #define is_image_output_node(node) \ argument
200 ((node)->buffer_queue.type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
201 #define is_image_input_node(node) \ argument
202 ((node)->buffer_queue.type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
203 #define is_image_node(node) \ argument
204 (is_image_output_node(node) || is_image_input_node(node))
205 #define is_meta_output_node(node) \ argument
206 ((node)->buffer_queue.type == V4L2_BUF_TYPE_META_CAPTURE)
207 #define is_meta_input_node(node) \ argument
208 ((node)->buffer_queue.type == V4L2_BUF_TYPE_META_OUTPUT)
209 #define is_meta_node(node) \ argument
210 (is_meta_output_node(node) || is_meta_input_node(node))
299 struct cfe_node node[NUM_NODES]; member
529 struct cfe_node *node = &cfe->node[i]; in cfe_schedule_next_csi2_job() local
535 buf = list_first_entry(&node->dma_queue, struct cfe_buffer, in cfe_schedule_next_csi2_job()
537 node->next_frm = buf; in cfe_schedule_next_csi2_job()
540 trace_cfe_csi2_schedule(node->id, &buf->vb.vb2_buf); in cfe_schedule_next_csi2_job()
542 if (is_meta_node(node)) { in cfe_schedule_next_csi2_job()
543 size = node->meta_fmt.fmt.meta.buffersize; in cfe_schedule_next_csi2_job()
547 size = node->vid_fmt.fmt.pix.sizeimage; in cfe_schedule_next_csi2_job()
548 stride = node->vid_fmt.fmt.pix.bytesperline; in cfe_schedule_next_csi2_job()
552 csi2_set_buffer(&cfe->csi2, node->id, addr, stride, size); in cfe_schedule_next_csi2_job()
563 struct cfe_node *node = &cfe->node[i]; in cfe_schedule_next_pisp_job() local
568 buf = list_first_entry(&node->dma_queue, struct cfe_buffer, in cfe_schedule_next_pisp_job()
571 trace_cfe_fe_schedule(node->id, &buf->vb.vb2_buf); in cfe_schedule_next_pisp_job()
573 node->next_frm = buf; in cfe_schedule_next_pisp_job()
578 config_buf = to_cfe_config_buffer(cfe->node[FE_CONFIG].next_frm); in cfe_schedule_next_pisp_job()
585 struct cfe_node *node = &cfe->node[i]; in cfe_check_job_ready() local
590 if (list_empty(&node->dma_queue)) in cfe_check_job_ready()
610 static void cfe_process_buffer_complete(struct cfe_node *node, in cfe_process_buffer_complete() argument
613 trace_cfe_buffer_complete(node->id, &node->cur_frm->vb); in cfe_process_buffer_complete()
615 node->cur_frm->vb.sequence = node->fs_count - 1; in cfe_process_buffer_complete()
616 vb2_buffer_done(&node->cur_frm->vb.vb2_buf, state); in cfe_process_buffer_complete()
619 static void cfe_queue_event_sof(struct cfe_node *node) in cfe_queue_event_sof() argument
623 .u.frame_sync.frame_sequence = node->fs_count - 1, in cfe_queue_event_sof()
626 v4l2_event_queue(&node->video_dev, &event); in cfe_queue_event_sof()
629 static void cfe_sof_isr(struct cfe_node *node) in cfe_sof_isr() argument
631 struct cfe_device *cfe = node->cfe; in cfe_sof_isr()
634 trace_cfe_frame_start(node->id, node->fs_count); in cfe_sof_isr()
643 if (WARN(node->cur_frm, "%s: [%s] Orphaned frame at seq %u\n", in cfe_sof_isr()
644 __func__, node_desc[node->id].name, node->fs_count)) in cfe_sof_isr()
645 cfe_process_buffer_complete(node, VB2_BUF_STATE_ERROR); in cfe_sof_isr()
647 node->cur_frm = node->next_frm; in cfe_sof_isr()
648 node->next_frm = NULL; in cfe_sof_isr()
649 node->fs_count++; in cfe_sof_isr()
651 node->ts = ktime_get_ns(); in cfe_sof_isr()
653 if (!check_state(cfe, NODE_STREAMING, i) || i == node->id) in cfe_sof_isr()
659 if (cfe->node[i].fs_count >= node->fs_count) in cfe_sof_isr()
660 node->ts = cfe->node[i].ts; in cfe_sof_isr()
665 if (matching_fs && cfe->node[i].fs_count != node->fs_count) in cfe_sof_isr()
672 if (node->cur_frm) in cfe_sof_isr()
673 node->cur_frm->vb.vb2_buf.timestamp = node->ts; in cfe_sof_isr()
675 set_state(cfe, FS_INT, node->id); in cfe_sof_isr()
676 clear_state(cfe, FE_INT, node->id); in cfe_sof_isr()
678 if (is_image_output_node(node)) in cfe_sof_isr()
679 cfe_queue_event_sof(node); in cfe_sof_isr()
682 static void cfe_eof_isr(struct cfe_node *node) in cfe_eof_isr() argument
684 struct cfe_device *cfe = node->cfe; in cfe_eof_isr()
686 trace_cfe_frame_end(node->id, node->fs_count - 1); in cfe_eof_isr()
688 if (node->cur_frm) in cfe_eof_isr()
689 cfe_process_buffer_complete(node, VB2_BUF_STATE_DONE); in cfe_eof_isr()
691 node->cur_frm = NULL; in cfe_eof_isr()
692 set_state(cfe, FE_INT, node->id); in cfe_eof_isr()
693 clear_state(cfe, FS_INT, node->id); in cfe_eof_isr()
714 struct cfe_node *node = &cfe->node[i]; in cfe_isr() local
742 cfe_sof_isr(node); in cfe_isr()
746 cfe_eof_isr(node); in cfe_isr()
758 if (check_state(cfe, FS_INT, node->id) && in cfe_isr()
759 !check_state(cfe, FE_INT, node->id)) { in cfe_isr()
761 __func__, node_desc[node->id].name); in cfe_isr()
762 cfe_eof_isr(node); in cfe_isr()
765 cfe_sof_isr(node); in cfe_isr()
851 static int cfe_start_channel(struct cfe_node *node) in cfe_start_channel() argument
853 struct cfe_device *cfe = node->cfe; in cfe_start_channel()
861 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_start_channel()
903 if (is_csi2_node(node)) { in cfe_start_channel()
907 ret = cfe_get_vc_dt(cfe, node->id, &vc, &dt); in cfe_start_channel()
921 node_desc[node->id].link_pad); in cfe_start_channel()
927 if (is_image_output_node(node)) { in cfe_start_channel()
933 pixfmt = node->vid_fmt.fmt.pix.pixelformat; in cfe_start_channel()
939 csi2_set_compression(&cfe->csi2, node->id, in cfe_start_channel()
945 csi2_start_channel(&cfe->csi2, node->id, in cfe_start_channel()
950 is_meta_node(node) ? true : false, in cfe_start_channel()
962 static void cfe_stop_channel(struct cfe_node *node, bool fe_stop) in cfe_stop_channel() argument
964 struct cfe_device *cfe = node->cfe; in cfe_stop_channel()
967 node_desc[node->id].name, fe_stop); in cfe_stop_channel()
974 if (is_csi2_node(node)) in cfe_stop_channel()
975 csi2_stop_channel(&cfe->csi2, node->id); in cfe_stop_channel()
978 static void cfe_return_buffers(struct cfe_node *node, in cfe_return_buffers() argument
981 struct cfe_device *cfe = node->cfe; in cfe_return_buffers()
985 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_return_buffers()
988 list_for_each_entry_safe(buf, tmp, &node->dma_queue, list) { in cfe_return_buffers()
990 trace_cfe_return_buffer(node->id, buf->vb.vb2_buf.index, 2); in cfe_return_buffers()
994 if (node->cur_frm) { in cfe_return_buffers()
995 trace_cfe_return_buffer(node->id, in cfe_return_buffers()
996 node->cur_frm->vb.vb2_buf.index, 0); in cfe_return_buffers()
997 vb2_buffer_done(&node->cur_frm->vb.vb2_buf, state); in cfe_return_buffers()
999 if (node->next_frm && node->cur_frm != node->next_frm) { in cfe_return_buffers()
1000 trace_cfe_return_buffer(node->id, in cfe_return_buffers()
1001 node->next_frm->vb.vb2_buf.index, 1); in cfe_return_buffers()
1002 vb2_buffer_done(&node->next_frm->vb.vb2_buf, state); in cfe_return_buffers()
1005 node->cur_frm = NULL; in cfe_return_buffers()
1006 node->next_frm = NULL; in cfe_return_buffers()
1018 struct cfe_node *node = vb2_get_drv_priv(vq); in cfe_queue_setup() local
1019 struct cfe_device *cfe = node->cfe; in cfe_queue_setup()
1020 unsigned int size = is_image_node(node) ? in cfe_queue_setup()
1021 node->vid_fmt.fmt.pix.sizeimage : in cfe_queue_setup()
1022 node->meta_fmt.fmt.meta.buffersize; in cfe_queue_setup()
1024 cfe_dbg(cfe, "%s: [%s] type:%u\n", __func__, node_desc[node->id].name, in cfe_queue_setup()
1025 node->buffer_queue.type); in cfe_queue_setup()
1043 struct cfe_node *node = vb2_get_drv_priv(vb->vb2_queue); in cfe_buffer_prepare() local
1044 struct cfe_device *cfe = node->cfe; in cfe_buffer_prepare()
1048 trace_cfe_buffer_prepare(node->id, vb); in cfe_buffer_prepare()
1050 size = is_image_node(node) ? node->vid_fmt.fmt.pix.sizeimage : in cfe_buffer_prepare()
1051 node->meta_fmt.fmt.meta.buffersize; in cfe_buffer_prepare()
1060 if (node->id == FE_CONFIG) { in cfe_buffer_prepare()
1066 &cfe->node[FE_OUT0].vid_fmt, in cfe_buffer_prepare()
1067 &cfe->node[FE_OUT1].vid_fmt); in cfe_buffer_prepare()
1075 struct cfe_node *node = vb2_get_drv_priv(vb->vb2_queue); in cfe_buffer_queue() local
1076 struct cfe_device *cfe = node->cfe; in cfe_buffer_queue()
1083 list_add_tail(&buf->list, &node->dma_queue); in cfe_buffer_queue()
1091 trace_cfe_buffer_queue(node->id, vb, schedule_now); in cfe_buffer_queue()
1149 struct cfe_node *node = vb2_get_drv_priv(vq); in cfe_start_streaming() local
1150 struct cfe_device *cfe = node->cfe; in cfe_start_streaming()
1156 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_start_streaming()
1158 if (!check_state(cfe, NODE_ENABLED, node->id)) { in cfe_start_streaming()
1160 node_desc[node->id].name); in cfe_start_streaming()
1173 !check_state(cfe, NODE_ENABLED, cfe->node[FE_CONFIG].id)) { in cfe_start_streaming()
1179 ret = media_pipeline_start(&node->pad, &cfe->pipe); in cfe_start_streaming()
1187 clear_state(cfe, FS_INT | FE_INT, node->id); in cfe_start_streaming()
1188 set_state(cfe, NODE_STREAMING, node->id); in cfe_start_streaming()
1189 node->fs_count = 0; in cfe_start_streaming()
1191 ret = cfe_start_channel(node); in cfe_start_streaming()
1252 cfe_stop_channel(node, in cfe_start_streaming()
1257 media_pipeline_stop(&node->pad); in cfe_start_streaming()
1261 cfe_return_buffers(node, VB2_BUF_STATE_QUEUED); in cfe_start_streaming()
1262 clear_state(cfe, NODE_STREAMING, node->id); in cfe_start_streaming()
1269 struct cfe_node *node = vb2_get_drv_priv(vq); in cfe_stop_streaming() local
1270 struct cfe_device *cfe = node->cfe; in cfe_stop_streaming()
1274 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_stop_streaming()
1281 clear_state(cfe, NODE_STREAMING, node->id); in cfe_stop_streaming()
1284 cfe_stop_channel(node, fe_stop); in cfe_stop_streaming()
1307 media_pipeline_stop(&node->pad); in cfe_stop_streaming()
1310 cfe_return_buffers(node, VB2_BUF_STATE_ERROR); in cfe_stop_streaming()
1342 struct cfe_node *node = video_drvdata(file); in cfe_enum_fmt_vid_cap() local
1343 struct cfe_device *cfe = node->cfe; in cfe_enum_fmt_vid_cap()
1346 if (!node_supports_image_output(node)) in cfe_enum_fmt_vid_cap()
1349 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_enum_fmt_vid_cap()
1359 if (is_fe_node(node) && in cfe_enum_fmt_vid_cap()
1376 struct cfe_node *node = video_drvdata(file); in cfe_g_fmt() local
1378 if (!node_supports_image(node)) in cfe_g_fmt()
1381 *f = node->vid_fmt; in cfe_g_fmt()
1386 static int cfe_validate_fmt_vid_cap(struct cfe_node *node, in cfe_validate_fmt_vid_cap() argument
1389 struct cfe_device *cfe = node->cfe; in cfe_validate_fmt_vid_cap()
1393 node_desc[node->id].name, f->fmt.pix.width, f->fmt.pix.height, in cfe_validate_fmt_vid_cap()
1396 if (!node_supports_image_output(node)) in cfe_validate_fmt_vid_cap()
1408 if (is_fe_node(node) && fmt->remap[CFE_REMAP_16BIT]) { in cfe_validate_fmt_vid_cap()
1423 struct cfe_node *node = video_drvdata(file); in cfe_s_fmt_vid_cap() local
1424 struct cfe_device *cfe = node->cfe; in cfe_s_fmt_vid_cap()
1425 struct vb2_queue *q = &node->buffer_queue; in cfe_s_fmt_vid_cap()
1431 ret = cfe_validate_fmt_vid_cap(node, f); in cfe_s_fmt_vid_cap()
1435 node->vid_fmt = *f; in cfe_s_fmt_vid_cap()
1438 node->vid_fmt.fmt.pix.width, node->vid_fmt.fmt.pix.height, in cfe_s_fmt_vid_cap()
1439 &node->vid_fmt.fmt.pix.pixelformat); in cfe_s_fmt_vid_cap()
1447 struct cfe_node *node = video_drvdata(file); in cfe_try_fmt_vid_cap() local
1448 struct cfe_device *cfe = node->cfe; in cfe_try_fmt_vid_cap()
1450 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_try_fmt_vid_cap()
1452 return cfe_validate_fmt_vid_cap(node, f); in cfe_try_fmt_vid_cap()
1458 struct cfe_node *node = video_drvdata(file); in cfe_enum_fmt_meta() local
1459 struct cfe_device *cfe = node->cfe; in cfe_enum_fmt_meta()
1461 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_enum_fmt_meta()
1463 if (!node_supports_meta(node)) in cfe_enum_fmt_meta()
1466 switch (node->id) { in cfe_enum_fmt_meta()
1490 switch (node->id) { in cfe_enum_fmt_meta()
1502 static int cfe_validate_fmt_meta(struct cfe_node *node, struct v4l2_format *f) in cfe_validate_fmt_meta() argument
1504 struct cfe_device *cfe = node->cfe; in cfe_validate_fmt_meta()
1507 switch (node->id) { in cfe_validate_fmt_meta()
1510 node_desc[node->id].name, f->fmt.meta.width, in cfe_validate_fmt_meta()
1516 node_desc[node->id].name, f->fmt.meta.buffersize, in cfe_validate_fmt_meta()
1523 if (!node_supports_meta(node)) in cfe_validate_fmt_meta()
1526 switch (node->id) { in cfe_validate_fmt_meta()
1552 struct cfe_node *node = video_drvdata(file); in cfe_g_fmt_meta() local
1553 struct cfe_device *cfe = node->cfe; in cfe_g_fmt_meta()
1555 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_g_fmt_meta()
1557 if (!node_supports_meta(node)) in cfe_g_fmt_meta()
1560 *f = node->meta_fmt; in cfe_g_fmt_meta()
1567 struct cfe_node *node = video_drvdata(file); in cfe_s_fmt_meta() local
1568 struct cfe_device *cfe = node->cfe; in cfe_s_fmt_meta()
1569 struct vb2_queue *q = &node->buffer_queue; in cfe_s_fmt_meta()
1572 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_s_fmt_meta()
1577 if (!node_supports_meta(node)) in cfe_s_fmt_meta()
1580 ret = cfe_validate_fmt_meta(node, f); in cfe_s_fmt_meta()
1584 node->meta_fmt = *f; in cfe_s_fmt_meta()
1587 &node->meta_fmt.fmt.meta.dataformat); in cfe_s_fmt_meta()
1595 struct cfe_node *node = video_drvdata(file); in cfe_try_fmt_meta() local
1596 struct cfe_device *cfe = node->cfe; in cfe_try_fmt_meta()
1598 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_try_fmt_meta()
1599 return cfe_validate_fmt_meta(node, f); in cfe_try_fmt_meta()
1605 struct cfe_node *node = video_drvdata(file); in cfe_enum_framesizes() local
1606 struct cfe_device *cfe = node->cfe; in cfe_enum_framesizes()
1609 cfe_dbg(cfe, "%s [%s]\n", __func__, node_desc[node->id].name); in cfe_enum_framesizes()
1638 struct cfe_node *node = video_get_drvdata(vdev); in cfe_vb2_ioctl_reqbufs() local
1639 struct cfe_device *cfe = node->cfe; in cfe_vb2_ioctl_reqbufs()
1642 cfe_dbg(cfe, "%s: [%s] type:%u\n", __func__, node_desc[node->id].name, in cfe_vb2_ioctl_reqbufs()
1661 struct cfe_node *node = video_get_drvdata(vdev); in cfe_vb2_ioctl_create_bufs() local
1662 struct cfe_device *cfe = node->cfe; in cfe_vb2_ioctl_create_bufs()
1665 cfe_dbg(cfe, "%s: [%s] type:%u\n", __func__, node_desc[node->id].name, in cfe_vb2_ioctl_create_bufs()
1683 struct cfe_node *node = video_get_drvdata(fh->vdev); in cfe_subscribe_event() local
1687 if (!node_supports_image_output(node)) in cfe_subscribe_event()
1692 if (!node_supports_image_output(node) && in cfe_subscribe_event()
1693 !node_supports_meta_output(node)) in cfe_subscribe_event()
1743 struct cfe_node *node = &cfe->node[i]; in cfe_notify() local
1748 v4l2_event_queue(&node->video_dev, arg); in cfe_notify()
1770 struct cfe_node *node = container_of(vd, struct cfe_node, video_dev); in cfe_video_link_validate() local
1771 struct cfe_device *cfe = node->cfe; in cfe_video_link_validate()
1778 node_desc[node->id].name, in cfe_video_link_validate()
1797 if (is_image_output_node(node)) { in cfe_video_link_validate()
1798 struct v4l2_pix_format *pix_fmt = &node->vid_fmt.fmt.pix; in cfe_video_link_validate()
1817 } else if (is_csi2_node(node) && is_meta_output_node(node)) { in cfe_video_link_validate()
1818 struct v4l2_meta_format *meta_fmt = &node->meta_fmt.fmt.meta; in cfe_video_link_validate()
1868 if (link->sink->entity != &cfe->node[i].video_dev.entity && in cfe_video_link_notify()
1869 link->source->entity != &cfe->node[i].video_dev.entity) in cfe_video_link_notify()
1936 struct cfe_node *node = video_get_drvdata(vdev); in cfe_node_release() local
1938 cfe_put(node->cfe); in cfe_node_release()
1946 struct cfe_node *node = &cfe->node[id]; in cfe_register_node() local
1949 node->cfe = cfe; in cfe_register_node()
1950 node->id = id; in cfe_register_node()
1952 if (node_supports_image(node)) { in cfe_register_node()
1953 if (node_supports_image_output(node)) in cfe_register_node()
1954 node->vid_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in cfe_register_node()
1956 node->vid_fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; in cfe_register_node()
1964 node->vid_fmt.fmt.pix.pixelformat = fmt->fourcc; in cfe_register_node()
1965 v4l2_fill_pix_format(&node->vid_fmt.fmt.pix, in cfe_register_node()
1968 ret = cfe_validate_fmt_vid_cap(node, &node->vid_fmt); in cfe_register_node()
1973 if (node_supports_meta(node)) { in cfe_register_node()
1974 if (node_supports_meta_output(node)) in cfe_register_node()
1975 node->meta_fmt.type = V4L2_BUF_TYPE_META_CAPTURE; in cfe_register_node()
1977 node->meta_fmt.type = V4L2_BUF_TYPE_META_OUTPUT; in cfe_register_node()
1979 ret = cfe_validate_fmt_meta(node, &node->meta_fmt); in cfe_register_node()
1984 mutex_init(&node->lock); in cfe_register_node()
1986 q = &node->buffer_queue; in cfe_register_node()
1987 q->type = node_supports_image(node) ? node->vid_fmt.type : in cfe_register_node()
1988 node->meta_fmt.type; in cfe_register_node()
1990 q->drv_priv = node; in cfe_register_node()
1996 q->lock = &node->lock; in cfe_register_node()
2007 INIT_LIST_HEAD(&node->dma_queue); in cfe_register_node()
2009 vdev = &node->video_dev; in cfe_register_node()
2015 vdev->vfl_dir = (node_supports_image_output(node) || in cfe_register_node()
2016 node_supports_meta_output(node)) ? in cfe_register_node()
2020 vdev->lock = &node->lock; in cfe_register_node()
2028 video_set_drvdata(vdev, node); in cfe_register_node()
2029 node->pad.flags = node_desc[id].pad_flags; in cfe_register_node()
2030 media_entity_pads_init(&vdev->entity, 1, &node->pad); in cfe_register_node()
2032 if (!node_supports_image(node)) { in cfe_register_node()
2033 v4l2_disable_ioctl(&node->video_dev, in cfe_register_node()
2035 v4l2_disable_ioctl(&node->video_dev, VIDIOC_ENUM_FRAMESIZES); in cfe_register_node()
2062 struct cfe_node *node = &cfe->node[i]; in cfe_unregister_nodes() local
2066 video_unregister_device(&node->video_dev); in cfe_unregister_nodes()
2098 struct cfe_node *node = &cfe->node[i]; in cfe_link_node_pads() local
2106 &node->video_dev.entity, 0, 0); in cfe_link_node_pads()
2110 if (node_supports_image(node)) { in cfe_link_node_pads()
2122 struct cfe_node *node = &cfe->node[i]; in cfe_link_node_pads() local
2130 dst = &node->video_dev.entity; in cfe_link_node_pads()
2136 src = &node->video_dev.entity; in cfe_link_node_pads()