Lines Matching refs:css

9 #include "ipu3-css.h"
10 #include "ipu3-css-fw.h"
11 #include "ipu3-css-params.h"
173 /******************* css hw *******************/
217 /* Reset the css */
298 /* wait for css idle signal */
301 dev_warn(dev, "wait css idle timeout\n");
303 /* do halt-halted handshake with css */
307 dev_warn(dev, "failed to halt css");
313 static void imgu_css_hw_enable_irq(struct imgu_css *css)
315 void __iomem *const base = css->base;
361 static int imgu_css_hw_init(struct imgu_css *css)
412 struct device *dev = css->dev;
413 void __iomem *const base = css->base;
419 &css->fwp->binary_header[css->fw_sp[i]];
421 writel(css->binary[css->fw_sp[i]].daddr,
427 writel(css->binary[css->fw_bl].daddr, base + IMGU_REG_ISP_ICACHE_ADDR);
469 static int imgu_css_hw_start_sp(struct imgu_css *css, int sp)
471 void __iomem *const base = css->base;
472 struct imgu_fw_info *bi = &css->fwp->binary_header[css->fw_sp[sp]];
474 .ddr_data_addr = css->binary[css->fw_sp[sp]].daddr
491 if (imgu_hw_wait(css->base, IMGU_REG_SP_DMEM_BASE(sp)
500 static int imgu_css_hw_start(struct imgu_css *css)
516 void __iomem *const base = css->base;
517 struct imgu_fw_info *bi, *bl = &css->fwp->binary_header[css->fw_bl];
532 &css->fwp->binary_header[css->fw_sp[j]];
534 .src_addr = css->binary[css->fw_sp[j]].daddr
550 if (imgu_hw_wait(css->base, IMGU_REG_ISP_DMEM_BASE
553 dev_err(css->dev, "failed to start bootloader\n");
559 memset(css->xmem_sp_group_ptrs.vaddr, 0,
562 bi = &css->fwp->binary_header[css->fw_sp[0]];
564 writel(css->xmem_sp_group_ptrs.daddr,
571 if (imgu_css_hw_start_sp(css, 0))
593 bi = &css->fwp->binary_header[css->fw_sp[1]];
598 if (imgu_css_hw_start_sp(css, 1))
607 static void imgu_css_hw_stop(struct imgu_css *css)
609 void __iomem *const base = css->base;
610 struct imgu_fw_info *bi = &css->fwp->binary_header[css->fw_sp[0]];
616 if (imgu_hw_wait(css->base, IMGU_REG_SP_CTRL(0),
618 dev_err(css->dev, "wait sp0 idle timeout.\n");
621 dev_err(css->dev, "sp0 is not terminated.\n");
622 if (imgu_hw_wait(css->base, IMGU_REG_ISP_CTRL,
624 dev_err(css->dev, "wait isp idle timeout\n");
627 static void imgu_css_hw_cleanup(struct imgu_css *css)
629 void __iomem *const base = css->base;
638 if (imgu_hw_wait(css->base, IMGU_REG_STATE, IMGU_STATE_IDLE_STS,
640 dev_err(css->dev, "failed to shut down hw cleanly\n");
642 /* Reset the css */
649 static void imgu_css_pipeline_cleanup(struct imgu_css *css, unsigned int pipe)
651 struct imgu_device *imgu = dev_get_drvdata(css->dev);
652 struct imgu_css_pipe *css_pipe = &css->pipes[pipe];
668 static int imgu_css_pipeline_init(struct imgu_css *css, unsigned int pipe)
686 struct imgu_css_pipe *css_pipe = &css->pipes[pipe];
694 &css->fwp->binary_header[css_pipe->bindex];
697 struct imgu_fw_config_memory_offsets *cofs = (void *)css->fwp +
699 struct imgu_fw_state_memory_offsets *sofs = (void *)css->fwp +
717 struct imgu_device *imgu = dev_get_drvdata(css->dev);
719 dev_dbg(css->dev, "%s for pipe %d", __func__, pipe);
723 cfg_iter = imgu_css_fw_pipeline_params(css, pipe, cfg, m0,
772 cfg_ref = imgu_css_fw_pipeline_params(css, pipe, cfg, m0,
802 cfg_dvs = imgu_css_fw_pipeline_params(css, pipe, cfg, m0,
818 cfg_tnr = imgu_css_fw_pipeline_params(css, pipe, cfg, m0,
849 cfg_ref_state = imgu_css_fw_pipeline_params(css, pipe, cfg, m0,
862 imgu_css_fw_pipeline_params(css, pipe, cfg, m0,
884 (char *)css->fwp + bi->blob.prog_name_offset,
994 sp_stage->xmem_bin_addr = css->binary[css_pipe->bindex].daddr;
1001 sp_group = css->xmem_sp_group_ptrs.vaddr;
1036 &css->fwp->binary_header[css_pipe->bindex])))
1049 imgu_css_pipeline_cleanup(css, pipe);
1053 imgu_css_pipeline_cleanup(css, pipe);
1057 static u8 imgu_css_queue_pos(struct imgu_css *css, int queue, int thread)
1060 void __iomem *const base = css->base;
1061 struct imgu_fw_info *bi = &css->fwp->binary_header[css->fw_sp[sp]];
1070 static int imgu_css_queue_data(struct imgu_css *css,
1074 void __iomem *const base = css->base;
1075 struct imgu_fw_info *bi = &css->fwp->binary_header[css->fw_sp[sp]];
1109 static int imgu_css_dequeue_data(struct imgu_css *css, int queue, u32 *data)
1112 void __iomem *const base = css->base;
1113 struct imgu_fw_info *bi = &css->fwp->binary_header[css->fw_sp[sp]];
1146 r = imgu_css_queue_data(css, queue, 0,
1156 static void imgu_css_binary_cleanup(struct imgu_css *css, unsigned int pipe)
1158 struct imgu_device *imgu = dev_get_drvdata(css->dev);
1161 struct imgu_css_pipe *css_pipe = &css->pipes[pipe];
1179 static int imgu_css_binary_preallocate(struct imgu_css *css, unsigned int pipe)
1181 struct imgu_device *imgu = dev_get_drvdata(css->dev);
1184 struct imgu_css_pipe *css_pipe = &css->pipes[pipe];
1209 imgu_css_binary_cleanup(css, pipe);
1214 static int imgu_css_binary_setup(struct imgu_css *css, unsigned int pipe)
1216 struct imgu_css_pipe *css_pipe = &css->pipes[pipe];
1217 struct imgu_fw_info *bi = &css->fwp->binary_header[css_pipe->bindex];
1218 struct imgu_device *imgu = dev_get_drvdata(css->dev);
1280 imgu_css_binary_cleanup(css, pipe);
1284 int imgu_css_start_streaming(struct imgu_css *css)
1289 if (css->streaming)
1292 for_each_set_bit(pipe, css->enabled_pipes, IMGU_MAX_PIPE_NUM) {
1293 r = imgu_css_binary_setup(css, pipe);
1298 r = imgu_css_hw_init(css);
1302 r = imgu_css_hw_start(css);
1306 for_each_set_bit(pipe, css->enabled_pipes, IMGU_MAX_PIPE_NUM) {
1307 r = imgu_css_pipeline_init(css, pipe);
1312 css->streaming = true;
1314 imgu_css_hw_enable_irq(css);
1317 for_each_set_bit(pipe, css->enabled_pipes, IMGU_MAX_PIPE_NUM) {
1318 r = imgu_css_set_parameters(css, pipe, NULL);
1323 while (!(r = imgu_css_dequeue_data(css, IMGU_ABI_QUEUE_A_ID, &data)))
1328 while (!(r = imgu_css_dequeue_data(css, IMGU_ABI_QUEUE_B_ID, &data)))
1333 for_each_set_bit(pipe, css->enabled_pipes, IMGU_MAX_PIPE_NUM) {
1334 r = imgu_css_queue_data(css, IMGU_ABI_QUEUE_EVENT_ID, pipe,
1344 css->streaming = false;
1345 imgu_css_hw_cleanup(css);
1346 for_each_set_bit(pipe, css->enabled_pipes, IMGU_MAX_PIPE_NUM) {
1347 imgu_css_pipeline_cleanup(css, pipe);
1348 imgu_css_binary_cleanup(css, pipe);
1354 void imgu_css_stop_streaming(struct imgu_css *css)
1359 for_each_set_bit(pipe, css->enabled_pipes, IMGU_MAX_PIPE_NUM) {
1360 r = imgu_css_queue_data(css, IMGU_ABI_QUEUE_EVENT_ID, pipe,
1363 dev_warn(css->dev, "failed on stop stream event\n");
1366 if (!css->streaming)
1369 imgu_css_hw_stop(css);
1371 imgu_css_hw_cleanup(css);
1373 for_each_set_bit(pipe, css->enabled_pipes, IMGU_MAX_PIPE_NUM) {
1374 struct imgu_css_pipe *css_pipe = &css->pipes[pipe];
1376 imgu_css_pipeline_cleanup(css, pipe);
1389 css->streaming = false;
1392 bool imgu_css_pipe_queue_empty(struct imgu_css *css, unsigned int pipe)
1395 struct imgu_css_pipe *css_pipe = &css->pipes[pipe];
1405 bool imgu_css_queue_empty(struct imgu_css *css)
1411 ret &= imgu_css_pipe_queue_empty(css, pipe);
1416 bool imgu_css_is_streaming(struct imgu_css *css)
1418 return css->streaming;
1421 static int imgu_css_map_init(struct imgu_css *css, unsigned int pipe)
1423 struct imgu_device *imgu = dev_get_drvdata(css->dev);
1424 struct imgu_css_pipe *css_pipe = &css->pipes[pipe];
1455 if (imgu_css_binary_preallocate(css, pipe)) {
1456 imgu_css_binary_cleanup(css, pipe);
1463 static void imgu_css_pipe_cleanup(struct imgu_css *css, unsigned int pipe)
1465 struct imgu_device *imgu = dev_get_drvdata(css->dev);
1466 struct imgu_css_pipe *css_pipe = &css->pipes[pipe];
1469 imgu_css_binary_cleanup(css, pipe);
1488 void imgu_css_cleanup(struct imgu_css *css)
1490 struct imgu_device *imgu = dev_get_drvdata(css->dev);
1493 imgu_css_stop_streaming(css);
1495 imgu_css_pipe_cleanup(css, pipe);
1496 imgu_dmamap_free(imgu, &css->xmem_sp_group_ptrs);
1497 imgu_css_fw_cleanup(css);
1500 int imgu_css_init(struct device *dev, struct imgu_css *css,
1507 css->dev = dev;
1508 css->base = base;
1509 css->iomem_length = length;
1512 struct imgu_css_pipe *css_pipe = &css->pipes[pipe];
1523 r = imgu_css_map_init(css, pipe);
1525 imgu_css_cleanup(css);
1529 if (!imgu_dmamap_alloc(imgu, &css->xmem_sp_group_ptrs,
1533 r = imgu_css_fw_init(css);
1548 static int imgu_css_find_binary(struct imgu_css *css,
1553 const int binary_nr = css->fwp->file_header.binary_nr;
1555 (css->pipes[pipe].pipe_id == IPU3_CSS_PIPE_ID_CAPTURE) ?
1572 struct imgu_fw_info *bi = &css->fwp->binary_header[i];
1586 struct imgu_fw_info *bi = &css->fwp->binary_header[i];
1589 name = (void *)css->fwp + bi->blob.prog_name_offset;
1656 dev_dbg(css->dev, "using binary %s id = %u\n", name,
1672 int imgu_css_fmt_try(struct imgu_css *css,
1715 dev_dbg(css->dev, "%s %s: (%i,%i) fmt 0x%x\n", __func__,
1719 dev_dbg(css->dev, "%s %s: (not set)\n", __func__,
1723 dev_notice(css->dev, "can not initialize queue %s\n",
1731 dev_dbg(css->dev, "%s %s: (%i,%i)\n", __func__,
1736 dev_dbg(css->dev, "%s %s: (not set)\n", __func__,
1747 dev_warn(css->dev, "required queues are disabled\n");
1787 ret = imgu_css_find_binary(css, pipe, q, r);
1789 dev_err(css->dev, "failed to find suitable binary\n");
1793 css->pipes[pipe].bindex = ret;
1795 dev_dbg(css->dev, "Binary index %d for pipe %d found.",
1796 css->pipes[pipe].bindex, pipe);
1803 dev_err(css->dev,
1816 dev_dbg(css->dev,
1828 int imgu_css_fmt_set(struct imgu_css *css,
1836 struct imgu_css_pipe *css_pipe = &css->pipes[pipe];
1845 r = imgu_css_fmt_try(css, fmts, all_rects, pipe);
1891 int imgu_css_buf_queue(struct imgu_css *css, unsigned int pipe,
1898 struct imgu_css_pipe *css_pipe = &css->pipes[pipe];
1900 if (!css->streaming)
1906 b->queue_pos = imgu_css_queue_pos(css, imgu_css_queues[b->queue].qid,
1909 if (b->queue_pos >= ARRAY_SIZE(css->pipes[pipe].abi_buffers[b->queue]))
1911 abi_buf = css->pipes[pipe].abi_buffers[b->queue][b->queue_pos].vaddr;
1935 data = css->pipes[pipe].abi_buffers[b->queue][b->queue_pos].daddr;
1936 r = imgu_css_queue_data(css, imgu_css_queues[b->queue].qid,
1943 r = imgu_css_queue_data(css, IMGU_ABI_QUEUE_EVENT_ID, pipe, data);
1947 dev_dbg(css->dev, "queued buffer %p to css queue %i in pipe %d\n",
1965 struct imgu_css_buffer *imgu_css_buf_dequeue(struct imgu_css *css)
1978 if (!css->streaming)
1981 r = imgu_css_dequeue_data(css, IMGU_ABI_QUEUE_EVENT_ID, &event);
2001 dev_err(css->dev, "Invalid pipe: %i\n", pipe);
2006 dev_err(css->dev, "Invalid qid: %i\n", qid);
2009 css_pipe = &css->pipes[pipe];
2010 dev_dbg(css->dev,
2014 r = imgu_css_dequeue_data(css, qid, &daddr);
2016 dev_err(css->dev, "failed to dequeue buffer\n");
2021 r = imgu_css_queue_data(css, IMGU_ABI_QUEUE_EVENT_ID, pipe,
2024 dev_err(css->dev, "failed to queue event\n");
2031 dev_err(css->dev, "event on empty queue\n");
2040 dev_err(css->dev, "dequeued bad buffer 0x%x\n", daddr);
2044 dev_dbg(css->dev, "buffer 0x%8x done from pipe %d\n", daddr, pipe);
2054 dev_err(css->dev, "Invalid pipe: %i\n", pipe);
2058 css_pipe = &css->pipes[pipe];
2059 dev_dbg(css->dev, "event: pipeline done 0x%8x for pipe %d\n",
2063 r = imgu_css_dequeue_data(css, IMGU_ABI_QUEUE_EVENT_ID, &event);
2069 dev_dbg(css->dev, "event: timer\n");
2071 dev_warn(css->dev, "half of timer event missing\n");
2074 dev_warn(css->dev, "event: firmware warning 0x%x\n", event);
2077 dev_err(css->dev,
2086 dev_warn(css->dev, "received unknown event 0x%x\n", event);
2098 * Return index to css->parameter_set_info which has the newly created
2101 int imgu_css_set_parameters(struct imgu_css *css, unsigned int pipe,
2105 struct imgu_css_pipe *css_pipe = &css->pipes[pipe];
2124 if (!css->streaming)
2127 dev_dbg(css->dev, "%s for pipe %d", __func__, pipe);
2129 bi = &css->fwp->binary_header[css_pipe->bindex];
2171 r = imgu_css_cfg_acc(css, pipe, use, acc, map->vaddr,
2181 r = imgu_css_cfg_vmem0(css, pipe, use, vmem0,
2190 r = imgu_css_cfg_dmem0(css, pipe, use, dmem0,
2255 r = imgu_css_queue_data(css, queue_id, pipe, map->daddr);
2259 r = imgu_css_queue_data(css, IMGU_ABI_QUEUE_EVENT_ID, pipe,
2270 r = imgu_css_dequeue_data(css, queue_id, &daddr);
2275 r = imgu_css_queue_data(css, IMGU_ABI_QUEUE_EVENT_ID, pipe,
2279 dev_err(css->dev, "failed to queue parameter event\n");
2313 int imgu_css_irq_ack(struct imgu_css *css)
2316 struct imgu_fw_info *bi = &css->fwp->binary_header[css->fw_sp[0]];
2317 void __iomem *const base = css->base;
2335 dev_dbg(css->dev, "%s: swirq %i cnt %i val 0x%x\n",
2347 dev_dbg(css->dev, "%s: imgu 0x%x main 0x%x sp0 0x%x sp1 0x%x\n",