Lines Matching refs:node
184 #define is_fe_node(node) (((node)->id) >= FE_OUT0) argument
185 #define is_csi2_node(node) (!is_fe_node(node)) argument
187 #define node_supports_image_output(node) \ argument
188 (node_desc[(node)->id].caps & V4L2_CAP_VIDEO_CAPTURE)
189 #define node_supports_meta_output(node) \ argument
190 (node_desc[(node)->id].caps & V4L2_CAP_META_CAPTURE)
191 #define node_supports_image_input(node) \ argument
192 (node_desc[(node)->id].caps & V4L2_CAP_VIDEO_OUTPUT)
193 #define node_supports_meta_input(node) \ argument
194 (node_desc[(node)->id].caps & V4L2_CAP_META_OUTPUT)
195 #define node_supports_image(node) \ argument
196 (node_supports_image_output(node) || node_supports_image_input(node))
197 #define node_supports_meta(node) \ argument
198 (node_supports_meta_output(node) || node_supports_meta_input(node))
200 #define is_image_output_node(node) \ argument
201 ((node)->buffer_queue.type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
202 #define is_image_input_node(node) \ argument
203 ((node)->buffer_queue.type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
204 #define is_image_node(node) \ argument
205 (is_image_output_node(node) || is_image_input_node(node))
206 #define is_meta_output_node(node) \ argument
207 ((node)->buffer_queue.type == V4L2_BUF_TYPE_META_CAPTURE)
208 #define is_meta_input_node(node) \ argument
209 ((node)->buffer_queue.type == V4L2_BUF_TYPE_META_OUTPUT)
210 #define is_meta_node(node) \ argument
211 (is_meta_output_node(node) || is_meta_input_node(node))
300 struct cfe_node node[NUM_NODES]; member
530 struct cfe_node *node = &cfe->node[i]; in cfe_schedule_next_csi2_job() local
536 buf = list_first_entry(&node->dma_queue, struct cfe_buffer, in cfe_schedule_next_csi2_job()
538 node->next_frm = buf; in cfe_schedule_next_csi2_job()
541 trace_cfe_csi2_schedule(node->id, &buf->vb.vb2_buf); in cfe_schedule_next_csi2_job()
543 if (is_meta_node(node)) { in cfe_schedule_next_csi2_job()
544 size = node->meta_fmt.fmt.meta.buffersize; in cfe_schedule_next_csi2_job()
548 size = node->vid_fmt.fmt.pix.sizeimage; in cfe_schedule_next_csi2_job()
549 stride = node->vid_fmt.fmt.pix.bytesperline; in cfe_schedule_next_csi2_job()
553 csi2_set_buffer(&cfe->csi2, node->id, addr, stride, size); in cfe_schedule_next_csi2_job()
564 struct cfe_node *node = &cfe->node[i]; in cfe_schedule_next_pisp_job() local
569 buf = list_first_entry(&node->dma_queue, struct cfe_buffer, in cfe_schedule_next_pisp_job()
572 trace_cfe_fe_schedule(node->id, &buf->vb.vb2_buf); in cfe_schedule_next_pisp_job()
574 node->next_frm = buf; in cfe_schedule_next_pisp_job()
579 config_buf = to_cfe_config_buffer(cfe->node[FE_CONFIG].next_frm); in cfe_schedule_next_pisp_job()
586 struct cfe_node *node = &cfe->node[i]; in cfe_check_job_ready() local
591 if (list_empty(&node->dma_queue)) in cfe_check_job_ready()
611 static void cfe_process_buffer_complete(struct cfe_node *node, in cfe_process_buffer_complete() argument
614 trace_cfe_buffer_complete(node->id, &node->cur_frm->vb); in cfe_process_buffer_complete()
616 node->cur_frm->vb.sequence = node->fs_count - 1; in cfe_process_buffer_complete()
617 vb2_buffer_done(&node->cur_frm->vb.vb2_buf, state); in cfe_process_buffer_complete()
620 static void cfe_queue_event_sof(struct cfe_node *node) in cfe_queue_event_sof() argument
624 .u.frame_sync.frame_sequence = node->fs_count - 1, in cfe_queue_event_sof()
627 v4l2_event_queue(&node->video_dev, &event); in cfe_queue_event_sof()
630 static void cfe_sof_isr(struct cfe_node *node) in cfe_sof_isr() argument
632 struct cfe_device *cfe = node->cfe; in cfe_sof_isr()
635 trace_cfe_frame_start(node->id, node->fs_count); in cfe_sof_isr()
644 if (WARN(node->cur_frm, "%s: [%s] Orphaned frame at seq %u\n", in cfe_sof_isr()
645 __func__, node_desc[node->id].name, node->fs_count)) in cfe_sof_isr()
646 cfe_process_buffer_complete(node, VB2_BUF_STATE_ERROR); in cfe_sof_isr()
648 node->cur_frm = node->next_frm; in cfe_sof_isr()
649 node->next_frm = NULL; in cfe_sof_isr()
650 node->fs_count++; in cfe_sof_isr()
652 node->ts = ktime_get_ns(); in cfe_sof_isr()
654 if (!check_state(cfe, NODE_STREAMING, i) || i == node->id) in cfe_sof_isr()
660 if (cfe->node[i].fs_count >= node->fs_count) in cfe_sof_isr()
661 node->ts = cfe->node[i].ts; in cfe_sof_isr()
666 if (matching_fs && cfe->node[i].fs_count != node->fs_count) in cfe_sof_isr()
673 if (node->cur_frm) in cfe_sof_isr()
674 node->cur_frm->vb.vb2_buf.timestamp = node->ts; in cfe_sof_isr()
676 set_state(cfe, FS_INT, node->id); in cfe_sof_isr()
677 clear_state(cfe, FE_INT, node->id); in cfe_sof_isr()
679 if (is_image_output_node(node)) in cfe_sof_isr()
680 cfe_queue_event_sof(node); in cfe_sof_isr()
683 static void cfe_eof_isr(struct cfe_node *node) in cfe_eof_isr() argument
685 struct cfe_device *cfe = node->cfe; in cfe_eof_isr()
687 trace_cfe_frame_end(node->id, node->fs_count - 1); in cfe_eof_isr()
689 if (node->cur_frm) in cfe_eof_isr()
690 cfe_process_buffer_complete(node, VB2_BUF_STATE_DONE); in cfe_eof_isr()
692 node->cur_frm = NULL; in cfe_eof_isr()
693 set_state(cfe, FE_INT, node->id); in cfe_eof_isr()
694 clear_state(cfe, FS_INT, node->id); in cfe_eof_isr()
715 struct cfe_node *node = &cfe->node[i]; in cfe_isr() local
743 cfe_sof_isr(node); in cfe_isr()
747 cfe_eof_isr(node); in cfe_isr()
759 if (check_state(cfe, FS_INT, node->id) && in cfe_isr()
760 !check_state(cfe, FE_INT, node->id)) { in cfe_isr()
762 __func__, node_desc[node->id].name); in cfe_isr()
763 cfe_eof_isr(node); in cfe_isr()
766 cfe_sof_isr(node); in cfe_isr()
852 static int cfe_start_channel(struct cfe_node *node) in cfe_start_channel() argument
854 struct cfe_device *cfe = node->cfe; in cfe_start_channel()
862 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_start_channel()
904 if (is_csi2_node(node)) { in cfe_start_channel()
908 ret = cfe_get_vc_dt(cfe, node->id, &vc, &dt); in cfe_start_channel()
922 node_desc[node->id].link_pad); in cfe_start_channel()
928 if (is_image_output_node(node)) { in cfe_start_channel()
934 pixfmt = node->vid_fmt.fmt.pix.pixelformat; in cfe_start_channel()
940 csi2_set_compression(&cfe->csi2, node->id, in cfe_start_channel()
946 csi2_start_channel(&cfe->csi2, node->id, in cfe_start_channel()
951 is_meta_node(node) ? true : false, in cfe_start_channel()
963 static void cfe_stop_channel(struct cfe_node *node, bool fe_stop) in cfe_stop_channel() argument
965 struct cfe_device *cfe = node->cfe; in cfe_stop_channel()
968 node_desc[node->id].name, fe_stop); in cfe_stop_channel()
975 if (is_csi2_node(node)) in cfe_stop_channel()
976 csi2_stop_channel(&cfe->csi2, node->id); in cfe_stop_channel()
979 static void cfe_return_buffers(struct cfe_node *node, in cfe_return_buffers() argument
982 struct cfe_device *cfe = node->cfe; in cfe_return_buffers()
986 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_return_buffers()
989 list_for_each_entry_safe(buf, tmp, &node->dma_queue, list) { in cfe_return_buffers()
991 trace_cfe_return_buffer(node->id, buf->vb.vb2_buf.index, 2); in cfe_return_buffers()
995 if (node->cur_frm) { in cfe_return_buffers()
996 trace_cfe_return_buffer(node->id, in cfe_return_buffers()
997 node->cur_frm->vb.vb2_buf.index, 0); in cfe_return_buffers()
998 vb2_buffer_done(&node->cur_frm->vb.vb2_buf, state); in cfe_return_buffers()
1000 if (node->next_frm && node->cur_frm != node->next_frm) { in cfe_return_buffers()
1001 trace_cfe_return_buffer(node->id, in cfe_return_buffers()
1002 node->next_frm->vb.vb2_buf.index, 1); in cfe_return_buffers()
1003 vb2_buffer_done(&node->next_frm->vb.vb2_buf, state); in cfe_return_buffers()
1006 node->cur_frm = NULL; in cfe_return_buffers()
1007 node->next_frm = NULL; in cfe_return_buffers()
1019 struct cfe_node *node = vb2_get_drv_priv(vq); in cfe_queue_setup() local
1020 struct cfe_device *cfe = node->cfe; in cfe_queue_setup()
1021 unsigned int size = is_image_node(node) ? in cfe_queue_setup()
1022 node->vid_fmt.fmt.pix.sizeimage : in cfe_queue_setup()
1023 node->meta_fmt.fmt.meta.buffersize; in cfe_queue_setup()
1025 cfe_dbg(cfe, "%s: [%s] type:%u\n", __func__, node_desc[node->id].name, in cfe_queue_setup()
1026 node->buffer_queue.type); in cfe_queue_setup()
1047 struct cfe_node *node = vb2_get_drv_priv(vb->vb2_queue); in cfe_buffer_prepare() local
1048 struct cfe_device *cfe = node->cfe; in cfe_buffer_prepare()
1052 trace_cfe_buffer_prepare(node->id, vb); in cfe_buffer_prepare()
1054 size = is_image_node(node) ? node->vid_fmt.fmt.pix.sizeimage : in cfe_buffer_prepare()
1055 node->meta_fmt.fmt.meta.buffersize; in cfe_buffer_prepare()
1064 if (node->id == FE_CONFIG) { in cfe_buffer_prepare()
1070 &cfe->node[FE_OUT0].vid_fmt, in cfe_buffer_prepare()
1071 &cfe->node[FE_OUT1].vid_fmt); in cfe_buffer_prepare()
1079 struct cfe_node *node = vb2_get_drv_priv(vb->vb2_queue); in cfe_buffer_queue() local
1080 struct cfe_device *cfe = node->cfe; in cfe_buffer_queue()
1087 list_add_tail(&buf->list, &node->dma_queue); in cfe_buffer_queue()
1095 trace_cfe_buffer_queue(node->id, vb, schedule_now); in cfe_buffer_queue()
1153 struct cfe_node *node = vb2_get_drv_priv(vq); in cfe_start_streaming() local
1154 struct cfe_device *cfe = node->cfe; in cfe_start_streaming()
1160 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_start_streaming()
1162 if (!check_state(cfe, NODE_ENABLED, node->id)) { in cfe_start_streaming()
1164 node_desc[node->id].name); in cfe_start_streaming()
1177 !check_state(cfe, NODE_ENABLED, cfe->node[FE_CONFIG].id)) { in cfe_start_streaming()
1183 ret = media_pipeline_start(&node->pad, &cfe->pipe); in cfe_start_streaming()
1191 clear_state(cfe, FS_INT | FE_INT, node->id); in cfe_start_streaming()
1192 set_state(cfe, NODE_STREAMING, node->id); in cfe_start_streaming()
1193 node->fs_count = 0; in cfe_start_streaming()
1195 ret = cfe_start_channel(node); in cfe_start_streaming()
1256 cfe_stop_channel(node, in cfe_start_streaming()
1261 media_pipeline_stop(&node->pad); in cfe_start_streaming()
1265 cfe_return_buffers(node, VB2_BUF_STATE_QUEUED); in cfe_start_streaming()
1266 clear_state(cfe, NODE_STREAMING, node->id); in cfe_start_streaming()
1273 struct cfe_node *node = vb2_get_drv_priv(vq); in cfe_stop_streaming() local
1274 struct cfe_device *cfe = node->cfe; in cfe_stop_streaming()
1278 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_stop_streaming()
1285 clear_state(cfe, NODE_STREAMING, node->id); in cfe_stop_streaming()
1288 cfe_stop_channel(node, fe_stop); in cfe_stop_streaming()
1311 media_pipeline_stop(&node->pad); in cfe_stop_streaming()
1314 cfe_return_buffers(node, VB2_BUF_STATE_ERROR); in cfe_stop_streaming()
1346 struct cfe_node *node = video_drvdata(file); in cfe_enum_fmt_vid_cap() local
1347 struct cfe_device *cfe = node->cfe; in cfe_enum_fmt_vid_cap()
1350 if (!node_supports_image_output(node)) in cfe_enum_fmt_vid_cap()
1353 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_enum_fmt_vid_cap()
1363 if (is_fe_node(node) && in cfe_enum_fmt_vid_cap()
1380 struct cfe_node *node = video_drvdata(file); in cfe_g_fmt() local
1382 if (!node_supports_image(node)) in cfe_g_fmt()
1385 *f = node->vid_fmt; in cfe_g_fmt()
1390 static int cfe_validate_fmt_vid_cap(struct cfe_node *node, in cfe_validate_fmt_vid_cap() argument
1393 struct cfe_device *cfe = node->cfe; in cfe_validate_fmt_vid_cap()
1397 node_desc[node->id].name, f->fmt.pix.width, f->fmt.pix.height, in cfe_validate_fmt_vid_cap()
1400 if (!node_supports_image_output(node)) in cfe_validate_fmt_vid_cap()
1412 if (is_fe_node(node) && fmt->remap[CFE_REMAP_16BIT]) { in cfe_validate_fmt_vid_cap()
1427 struct cfe_node *node = video_drvdata(file); in cfe_s_fmt_vid_cap() local
1428 struct cfe_device *cfe = node->cfe; in cfe_s_fmt_vid_cap()
1429 struct vb2_queue *q = &node->buffer_queue; in cfe_s_fmt_vid_cap()
1435 ret = cfe_validate_fmt_vid_cap(node, f); in cfe_s_fmt_vid_cap()
1439 node->vid_fmt = *f; in cfe_s_fmt_vid_cap()
1442 node->vid_fmt.fmt.pix.width, node->vid_fmt.fmt.pix.height, in cfe_s_fmt_vid_cap()
1443 &node->vid_fmt.fmt.pix.pixelformat); in cfe_s_fmt_vid_cap()
1451 struct cfe_node *node = video_drvdata(file); in cfe_try_fmt_vid_cap() local
1452 struct cfe_device *cfe = node->cfe; in cfe_try_fmt_vid_cap()
1454 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_try_fmt_vid_cap()
1456 return cfe_validate_fmt_vid_cap(node, f); in cfe_try_fmt_vid_cap()
1462 struct cfe_node *node = video_drvdata(file); in cfe_enum_fmt_meta() local
1463 struct cfe_device *cfe = node->cfe; in cfe_enum_fmt_meta()
1465 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_enum_fmt_meta()
1467 if (!node_supports_meta(node)) in cfe_enum_fmt_meta()
1470 switch (node->id) { in cfe_enum_fmt_meta()
1494 switch (node->id) { in cfe_enum_fmt_meta()
1506 static int cfe_validate_fmt_meta(struct cfe_node *node, struct v4l2_format *f) in cfe_validate_fmt_meta() argument
1508 struct cfe_device *cfe = node->cfe; in cfe_validate_fmt_meta()
1511 switch (node->id) { in cfe_validate_fmt_meta()
1514 node_desc[node->id].name, f->fmt.meta.width, in cfe_validate_fmt_meta()
1520 node_desc[node->id].name, f->fmt.meta.buffersize, in cfe_validate_fmt_meta()
1527 if (!node_supports_meta(node)) in cfe_validate_fmt_meta()
1530 switch (node->id) { in cfe_validate_fmt_meta()
1556 struct cfe_node *node = video_drvdata(file); in cfe_g_fmt_meta() local
1557 struct cfe_device *cfe = node->cfe; in cfe_g_fmt_meta()
1559 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_g_fmt_meta()
1561 if (!node_supports_meta(node)) in cfe_g_fmt_meta()
1564 *f = node->meta_fmt; in cfe_g_fmt_meta()
1571 struct cfe_node *node = video_drvdata(file); in cfe_s_fmt_meta() local
1572 struct cfe_device *cfe = node->cfe; in cfe_s_fmt_meta()
1573 struct vb2_queue *q = &node->buffer_queue; in cfe_s_fmt_meta()
1576 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_s_fmt_meta()
1581 if (!node_supports_meta(node)) in cfe_s_fmt_meta()
1584 ret = cfe_validate_fmt_meta(node, f); in cfe_s_fmt_meta()
1588 node->meta_fmt = *f; in cfe_s_fmt_meta()
1591 &node->meta_fmt.fmt.meta.dataformat); in cfe_s_fmt_meta()
1599 struct cfe_node *node = video_drvdata(file); in cfe_try_fmt_meta() local
1600 struct cfe_device *cfe = node->cfe; in cfe_try_fmt_meta()
1602 cfe_dbg(cfe, "%s: [%s]\n", __func__, node_desc[node->id].name); in cfe_try_fmt_meta()
1603 return cfe_validate_fmt_meta(node, f); in cfe_try_fmt_meta()
1609 struct cfe_node *node = video_drvdata(file); in cfe_enum_framesizes() local
1610 struct cfe_device *cfe = node->cfe; in cfe_enum_framesizes()
1613 cfe_dbg(cfe, "%s [%s]\n", __func__, node_desc[node->id].name); in cfe_enum_framesizes()
1642 struct cfe_node *node = video_get_drvdata(vdev); in cfe_vb2_ioctl_reqbufs() local
1643 struct cfe_device *cfe = node->cfe; in cfe_vb2_ioctl_reqbufs()
1646 cfe_dbg(cfe, "%s: [%s] type:%u\n", __func__, node_desc[node->id].name, in cfe_vb2_ioctl_reqbufs()
1665 struct cfe_node *node = video_get_drvdata(vdev); in cfe_vb2_ioctl_create_bufs() local
1666 struct cfe_device *cfe = node->cfe; in cfe_vb2_ioctl_create_bufs()
1669 cfe_dbg(cfe, "%s: [%s] type:%u\n", __func__, node_desc[node->id].name, in cfe_vb2_ioctl_create_bufs()
1687 struct cfe_node *node = video_get_drvdata(fh->vdev); in cfe_subscribe_event() local
1691 if (!node_supports_image_output(node)) in cfe_subscribe_event()
1696 if (!node_supports_image_output(node) && in cfe_subscribe_event()
1697 !node_supports_meta_output(node)) in cfe_subscribe_event()
1747 struct cfe_node *node = &cfe->node[i]; in cfe_notify() local
1752 v4l2_event_queue(&node->video_dev, arg); in cfe_notify()
1774 struct cfe_node *node = container_of(vd, struct cfe_node, video_dev); in cfe_video_link_validate() local
1775 struct cfe_device *cfe = node->cfe; in cfe_video_link_validate()
1782 node_desc[node->id].name, in cfe_video_link_validate()
1801 if (is_image_output_node(node)) { in cfe_video_link_validate()
1802 struct v4l2_pix_format *pix_fmt = &node->vid_fmt.fmt.pix; in cfe_video_link_validate()
1821 } else if (is_csi2_node(node) && is_meta_output_node(node)) { in cfe_video_link_validate()
1822 struct v4l2_meta_format *meta_fmt = &node->meta_fmt.fmt.meta; in cfe_video_link_validate()
1872 if (link->sink->entity != &cfe->node[i].video_dev.entity && in cfe_video_link_notify()
1873 link->source->entity != &cfe->node[i].video_dev.entity) in cfe_video_link_notify()
1940 struct cfe_node *node = video_get_drvdata(vdev); in cfe_node_release() local
1942 cfe_put(node->cfe); in cfe_node_release()
1950 struct cfe_node *node = &cfe->node[id]; in cfe_register_node() local
1953 node->cfe = cfe; in cfe_register_node()
1954 node->id = id; in cfe_register_node()
1956 if (node_supports_image(node)) { in cfe_register_node()
1957 if (node_supports_image_output(node)) in cfe_register_node()
1958 node->vid_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in cfe_register_node()
1960 node->vid_fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; in cfe_register_node()
1968 node->vid_fmt.fmt.pix.pixelformat = fmt->fourcc; in cfe_register_node()
1969 v4l2_fill_pix_format(&node->vid_fmt.fmt.pix, in cfe_register_node()
1972 ret = cfe_validate_fmt_vid_cap(node, &node->vid_fmt); in cfe_register_node()
1977 if (node_supports_meta(node)) { in cfe_register_node()
1978 if (node_supports_meta_output(node)) in cfe_register_node()
1979 node->meta_fmt.type = V4L2_BUF_TYPE_META_CAPTURE; in cfe_register_node()
1981 node->meta_fmt.type = V4L2_BUF_TYPE_META_OUTPUT; in cfe_register_node()
1983 ret = cfe_validate_fmt_meta(node, &node->meta_fmt); in cfe_register_node()
1988 mutex_init(&node->lock); in cfe_register_node()
1990 q = &node->buffer_queue; in cfe_register_node()
1991 q->type = node_supports_image(node) ? node->vid_fmt.type : in cfe_register_node()
1992 node->meta_fmt.type; in cfe_register_node()
1994 q->drv_priv = node; in cfe_register_node()
2000 q->lock = &node->lock; in cfe_register_node()
2010 INIT_LIST_HEAD(&node->dma_queue); in cfe_register_node()
2012 vdev = &node->video_dev; in cfe_register_node()
2018 vdev->vfl_dir = (node_supports_image_output(node) || in cfe_register_node()
2019 node_supports_meta_output(node)) ? in cfe_register_node()
2023 vdev->lock = &node->lock; in cfe_register_node()
2031 video_set_drvdata(vdev, node); in cfe_register_node()
2032 node->pad.flags = node_desc[id].pad_flags; in cfe_register_node()
2033 media_entity_pads_init(&vdev->entity, 1, &node->pad); in cfe_register_node()
2035 if (!node_supports_image(node)) { in cfe_register_node()
2036 v4l2_disable_ioctl(&node->video_dev, in cfe_register_node()
2038 v4l2_disable_ioctl(&node->video_dev, VIDIOC_ENUM_FRAMESIZES); in cfe_register_node()
2065 struct cfe_node *node = &cfe->node[i]; in cfe_unregister_nodes() local
2069 video_unregister_device(&node->video_dev); in cfe_unregister_nodes()
2101 struct cfe_node *node = &cfe->node[i]; in cfe_link_node_pads() local
2109 &node->video_dev.entity, 0, 0); in cfe_link_node_pads()
2113 if (node_supports_image(node)) { in cfe_link_node_pads()
2125 struct cfe_node *node = &cfe->node[i]; in cfe_link_node_pads() local
2133 dst = &node->video_dev.entity; in cfe_link_node_pads()
2139 src = &node->video_dev.entity; in cfe_link_node_pads()