From: Antti Laakso <antti.laakso@linux.intel.com>
To: linux-media@vger.kernel.org, mchehab@kernel.org,
sakari.ailus@linux.intel.com
Cc: daxing.li@intel.com, ong.hock.yu@intel.com, antti.laakso@linux.intel.com
Subject: [PATCH v2 20/44] media: ipu6: Isolate hw specific buffer handling
Date: Fri, 21 Aug 2026 14:42:38 +0300 [thread overview]
Message-ID: <20260821114302.365532-21-antti.laakso@linux.intel.com> (raw)
In-Reply-To: <20260821114302.365532-1-antti.laakso@linux.intel.com>
Move ipu6 specific buffer and stream handling down to
hardware specific file, to make it possible to add ipu7
specific functionality.
Signed-off-by: Antti Laakso <antti.laakso@linux.intel.com>
---
drivers/media/pci/intel/ipu6/ipu6-fw-isys.c | 241 ++++++++++++++++--
drivers/media/pci/intel/ipu6/ipu6-fw-isys.h | 42 ++-
.../media/pci/intel/ipu6/ipu6-isys-queue.c | 77 +-----
.../media/pci/intel/ipu6/ipu6-isys-queue.h | 4 -
.../media/pci/intel/ipu6/ipu6-isys-video.c | 128 +---------
5 files changed, 270 insertions(+), 222 deletions(-)
diff --git a/drivers/media/pci/intel/ipu6/ipu6-fw-isys.c b/drivers/media/pci/intel/ipu6/ipu6-fw-isys.c
index 8906727ca84b..9256ea3b68c1 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-fw-isys.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-fw-isys.c
@@ -90,11 +90,11 @@ int ipu6_fw_isys_send_proxy_token(struct ipu6_isys *isys,
return ret;
}
-int ipu6_fw_isys_complex_cmd(struct ipu6_isys *isys,
- const unsigned int stream_handle,
- void *cpu_mapped_buf,
- dma_addr_t dma_mapped_buf,
- size_t size, u16 send_type)
+static int ipu6_fw_isys_complex_cmd(struct ipu6_isys *isys,
+ const unsigned int stream_handle,
+ void *cpu_mapped_buf,
+ dma_addr_t dma_mapped_buf,
+ size_t size, u16 send_type)
{
struct ipu6_fw_com_context *ctx = isys->fwctx;
struct device *dev = &isys->adev->auxdev.dev;
@@ -126,13 +126,6 @@ int ipu6_fw_isys_complex_cmd(struct ipu6_isys *isys,
return 0;
}
-int ipu6_fw_isys_simple_cmd(struct ipu6_isys *isys,
- const unsigned int stream_handle, u16 send_type)
-{
- return ipu6_fw_isys_complex_cmd(isys, stream_handle, NULL, 0, 0,
- send_type);
-}
-
int ipu6_fw_isys_close(struct ipu6_isys *isys)
{
struct device *dev = &isys->adev->auxdev.dev;
@@ -376,9 +369,9 @@ void ipu6_fw_isys_put_resp(struct ipu6_isys *isys)
ipu6_recv_put_token(isys->fwctx, IPU6_BASE_MSG_RECV_QUEUES);
}
-void ipu6_fw_isys_dump_stream_cfg(struct device *dev,
- struct ipu6_fw_isys_stream_cfg_data_abi *cfg)
+void ipu6_fw_isys_dump_stream_cfg(struct device *dev, struct isys_fw_msgs *msg)
{
+ struct ipu6_fw_isys_stream_cfg_data_abi *cfg = &msg->ipu6.stream;
unsigned int i;
dev_dbg(dev, "-----------------------------------------------------\n");
@@ -454,12 +447,14 @@ void ipu6_fw_isys_dump_stream_cfg(struct device *dev,
}
void
-ipu6_fw_isys_dump_frame_buff_set(struct device *dev,
- struct ipu6_fw_isys_frame_buff_set_abi *buf,
+ipu6_fw_isys_dump_frame_buff_set(struct device *dev, struct isys_fw_msgs *msg,
unsigned int outputs)
{
+ struct ipu6_fw_isys_frame_buff_set_abi *buf;
unsigned int i;
+ buf = &msg->ipu6.frame;
+
dev_dbg(dev, "-----------------------------------------------------\n");
dev_dbg(dev, "IPU6_FW_ISYS_FRAME_BUFF_SET\n");
@@ -596,16 +591,17 @@ int ipu6_isys_isr_one(struct ipu6_bus_device *adev)
break;
case IPU6_FW_ISYS_RESP_TYPE_PIN_DATA_READY:
/*
- * firmware only release the capture msg until software
+ * firmware only release the capture message until software
* get pin_data_ready event
*/
- if (!resp->buf_id)
+ if (!resp->buf_id) {
dev_warn(&adev->auxdev.dev, "%d: Invalid buf ID\n",
resp->stream_handle);
- else
- isys_fw_msg =
- container_of((void *)(uintptr_t)resp->buf_id,
- struct isys_fw_msgs, ipu6.dummy);
+ goto leave_put_stream;
+ }
+
+ isys_fw_msg = container_of((void *)(uintptr_t)resp->buf_id,
+ struct isys_fw_msgs, ipu6.dummy);
ipu6_put_fw_msg_buf(ipu6_bus_get_drvdata(adev), isys_fw_msg);
if (resp->pin_id < IPU6_ISYS_OUTPUT_PINS &&
@@ -652,6 +648,7 @@ int ipu6_isys_isr_one(struct ipu6_bus_device *adev)
break;
}
+leave_put_stream:
ipu6_isys_put_stream(stream);
leave:
ipu6_fw_isys_put_resp(isys);
@@ -755,3 +752,203 @@ irqreturn_t ipu6_isys_isr(struct ipu6_bus_device *adev)
return IRQ_HANDLED;
}
+
+static int ipu6_isys_fw_pin_cfg(struct ipu6_isys_video *av,
+ struct ipu6_fw_isys_stream_cfg_data_abi *cfg)
+{
+ struct media_pad *src_pad = media_pad_remote_pad_first(&av->pad);
+ struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(src_pad->entity);
+ struct v4l2_subdev_state *state = v4l2_subdev_get_locked_active_state(sd);
+ struct ipu6_fw_isys_input_pin_info_abi *input_pin;
+ struct ipu6_fw_isys_output_pin_info_abi *output_pin;
+ struct ipu6_isys_stream *stream = av->stream;
+ struct ipu6_isys_queue *aq = &av->aq;
+ struct v4l2_mbus_framefmt fmt;
+ const struct ipu6_isys_pixelformat *pfmt =
+ ipu6_isys_get_isys_format(ipu6_isys_get_format(av), 0);
+ struct v4l2_rect v4l2_crop;
+ struct ipu6_isys *isys = av->isys;
+ int input_pins = cfg->nof_input_pins++;
+ int output_pins;
+ u32 src_stream;
+
+ src_stream = ipu6_isys_get_src_stream_by_src_pad(sd, src_pad->index);
+ fmt = *v4l2_subdev_state_get_format(state, src_pad->index, src_stream);
+ v4l2_crop = *v4l2_subdev_state_get_crop(state, src_pad->index, src_stream);
+
+ input_pin = &cfg->input_pins[input_pins];
+ input_pin->input_res.width = fmt.width;
+ input_pin->input_res.height = fmt.height;
+ input_pin->dt = av->dt;
+ input_pin->bits_per_pix = pfmt->bpp_packed;
+ input_pin->mapped_dt = 0x40; /* invalid mipi data type */
+ input_pin->mipi_decompression = 0;
+ input_pin->capture_mode = IPU6_FW_ISYS_CAPTURE_MODE_REGULAR;
+ input_pin->mipi_store_mode = pfmt->bpp == pfmt->bpp_packed ?
+ IPU6_FW_ISYS_MIPI_STORE_MODE_DISCARD_LONG_HEADER :
+ IPU6_FW_ISYS_MIPI_STORE_MODE_NORMAL;
+ input_pin->crop_first_and_last_lines = v4l2_crop.top & 1;
+
+ output_pins = cfg->nof_output_pins++;
+ aq->fw_output = output_pins;
+ stream->output_pins_queue[output_pins] = aq;
+
+ output_pin = &cfg->output_pins[output_pins];
+ output_pin->input_pin_id = input_pins;
+ output_pin->output_res.width = ipu6_isys_get_frame_width(av);
+ output_pin->output_res.height = ipu6_isys_get_frame_height(av);
+
+ output_pin->stride = ipu6_isys_get_bytes_per_line(av);
+ if (pfmt->bpp != pfmt->bpp_packed)
+ output_pin->pt = IPU6_FW_ISYS_PIN_TYPE_RAW_SOC;
+ else
+ output_pin->pt = IPU6_FW_ISYS_PIN_TYPE_MIPI;
+ output_pin->ft = pfmt->css_pixelformat;
+ output_pin->send_irq = 1;
+ memset(output_pin->ts_offsets, 0, sizeof(output_pin->ts_offsets));
+ output_pin->s2m_pixel_soc_pixel_remapping =
+ S2M_PIXEL_SOC_PIXEL_REMAPPING_FLAG_NO_REMAPPING;
+ output_pin->csi_be_soc_pixel_remapping =
+ CSI_BE_SOC_PIXEL_REMAPPING_FLAG_NO_REMAPPING;
+
+ output_pin->snoopable = true;
+ output_pin->error_handling_enable = false;
+ output_pin->sensor_type = isys->sensor_type++;
+ if (isys->sensor_type > isys->pdata->ipdata->sensor_type_end)
+ isys->sensor_type = isys->pdata->ipdata->sensor_type_start;
+
+ return 0;
+}
+
+int ipu6_fw_isys_prepare_stream_cfg(struct ipu6_isys_video *av,
+ struct isys_fw_msgs *msg)
+{
+ struct ipu6_fw_isys_stream_cfg_data_abi *stream_cfg;
+ struct device *dev = &av->isys->adev->auxdev.dev;
+ struct ipu6_isys_stream *stream = av->stream;
+ struct ipu6_isys_queue *aq;
+
+ stream_cfg = &msg->ipu6.stream;
+ stream_cfg->src = stream->stream_source;
+ stream_cfg->vc = stream->vc;
+ stream_cfg->isl_use = 0;
+ stream_cfg->sensor_type = IPU6_FW_ISYS_SENSOR_MODE_NORMAL;
+
+ list_for_each_entry(aq, &stream->queues, node) {
+ struct ipu6_isys_video *__av = ipu6_isys_queue_to_video(aq);
+ int ret;
+
+ ret = ipu6_isys_fw_pin_cfg(__av, stream_cfg);
+ if (ret < 0)
+ return ret;
+ }
+
+ ipu6_fw_isys_dump_stream_cfg(dev, msg);
+
+ stream->nr_output_pins = stream_cfg->nof_output_pins;
+
+ return 0;
+}
+
+int ipu6_fw_isys_stream_open(struct ipu6_isys *isys,
+ const unsigned int stream_handle,
+ struct isys_fw_msgs *msg)
+{
+ return ipu6_fw_isys_complex_cmd(isys, stream_handle,
+ &msg->ipu6.stream, msg->dma_addr,
+ sizeof(msg->ipu6.stream),
+ IPU6_FW_ISYS_SEND_TYPE_STREAM_OPEN);
+}
+
+int ipu6_fw_isys_stream_close(struct ipu6_isys *isys,
+ const unsigned int stream_handle)
+{
+ return ipu6_fw_isys_complex_cmd(isys, stream_handle, NULL, 0, 0,
+ IPU6_FW_ISYS_SEND_TYPE_STREAM_CLOSE);
+}
+
+int ipu6_fw_isys_stream_flush(struct ipu6_isys *isys,
+ const unsigned int stream_handle)
+{
+ return ipu6_fw_isys_complex_cmd(isys, stream_handle, NULL, 0, 0,
+ IPU6_FW_ISYS_SEND_TYPE_STREAM_FLUSH);
+}
+
+int ipu6_fw_isys_stream_start(struct ipu6_isys *isys,
+ const unsigned int stream_handle,
+ struct isys_fw_msgs *msg, bool capture)
+{
+ u16 cmd_type;
+
+ if (capture)
+ cmd_type = IPU6_FW_ISYS_SEND_TYPE_STREAM_START_AND_CAPTURE;
+ else
+ cmd_type = IPU6_FW_ISYS_SEND_TYPE_STREAM_START;
+
+ return ipu6_fw_isys_complex_cmd(isys, stream_handle,
+ &msg->ipu6.stream, msg->dma_addr,
+ sizeof(msg->ipu6.stream), cmd_type);
+}
+
+int ipu6_fw_isys_stream_capture(struct ipu6_isys *isys,
+ const unsigned int stream_handle,
+ struct isys_fw_msgs *msg)
+{
+ return ipu6_fw_isys_complex_cmd(isys, stream_handle,
+ &msg->ipu6.stream, msg->dma_addr,
+ sizeof(msg->ipu6.stream),
+ IPU6_FW_ISYS_SEND_TYPE_STREAM_CAPTURE);
+}
+
+static void
+ipu6_isys_buf_to_fw_frame_buf_pin(struct vb2_buffer *vb,
+ struct ipu6_fw_isys_frame_buff_set_abi *set)
+{
+ struct ipu6_isys_queue *aq = vb2_queue_to_isys_queue(vb->vb2_queue);
+ struct vb2_v4l2_buffer *vvb = to_vb2_v4l2_buffer(vb);
+ struct ipu6_isys_video_buffer *ivb =
+ vb2_buffer_to_ipu6_isys_video_buffer(vvb);
+
+ set->output_pins[aq->fw_output].addr = ivb->dma_addr;
+ set->output_pins[aq->fw_output].out_buf_id = vb->index + 1;
+}
+
+/*
+ * Convert a buffer list to a isys fw ABI framebuffer set. The
+ * buffer list is not modified.
+ */
+#define IPU6_ISYS_FRAME_NUM_THRESHOLD (30)
+void
+ipu6_fw_isys_prepare_buf_set(struct isys_fw_msgs *msg,
+ struct ipu6_isys_stream *stream,
+ struct ipu6_isys_buffer_list *bl)
+{
+ struct ipu6_fw_isys_frame_buff_set_abi *set = &msg->ipu6.frame;
+ struct ipu6_isys_buffer *ib;
+
+ WARN_ON(!bl->nbufs);
+
+ set->send_irq_sof = 1;
+ set->send_resp_sof = 1;
+ set->send_irq_eof = 0;
+ set->send_resp_eof = 0;
+
+ if (stream->streaming)
+ set->send_irq_capture_ack = 0;
+ else
+ set->send_irq_capture_ack = 1;
+ set->send_irq_capture_done = 0;
+
+ set->send_resp_capture_ack = 1;
+ set->send_resp_capture_done = 1;
+ if (atomic_read(&stream->sequence) >= IPU6_ISYS_FRAME_NUM_THRESHOLD) {
+ set->send_resp_capture_ack = 0;
+ set->send_resp_capture_done = 0;
+ }
+
+ list_for_each_entry(ib, &bl->head, head) {
+ struct vb2_buffer *vb = ipu6_isys_buffer_to_vb2_buffer(ib);
+
+ ipu6_isys_buf_to_fw_frame_buf_pin(vb, set);
+ }
+}
diff --git a/drivers/media/pci/intel/ipu6/ipu6-fw-isys.h b/drivers/media/pci/intel/ipu6/ipu6-fw-isys.h
index f65461a4c907..b589ae7fbd4e 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-fw-isys.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-fw-isys.h
@@ -8,6 +8,10 @@
struct device;
struct ipu6_isys;
+struct ipu6_isys_video;
+struct isys_fw_msgs;
+struct ipu6_isys_stream;
+struct ipu6_isys_buffer_list;
/* Max number of Input/Output Pins */
#define IPU6_MAX_IPINS 4
@@ -555,21 +559,8 @@ struct ipu6_fw_proxy_send_queue_token {
u32 value;
};
-void
-ipu6_fw_isys_dump_stream_cfg(struct device *dev,
- struct ipu6_fw_isys_stream_cfg_data_abi *cfg);
-void
-ipu6_fw_isys_dump_frame_buff_set(struct device *dev,
- struct ipu6_fw_isys_frame_buff_set_abi *buf,
- unsigned int outputs);
int ipu6_fw_isys_init(struct ipu6_isys *isys, unsigned int num_streams);
int ipu6_fw_isys_close(struct ipu6_isys *isys);
-int ipu6_fw_isys_simple_cmd(struct ipu6_isys *isys,
- const unsigned int stream_handle, u16 send_type);
-int ipu6_fw_isys_complex_cmd(struct ipu6_isys *isys,
- const unsigned int stream_handle,
- void *cpu_mapped_buf, dma_addr_t dma_mapped_buf,
- size_t size, u16 send_type);
int ipu6_fw_isys_send_proxy_token(struct ipu6_isys *isys,
unsigned int req_id,
unsigned int index,
@@ -581,4 +572,29 @@ void ipu6_fw_isys_put_resp(struct ipu6_isys *isys);
int ipu6_isys_isr_one(struct ipu6_bus_device *adev);
irqreturn_t ipu6_isys_isr(struct ipu6_bus_device *adev);
+int ipu6_fw_isys_stream_open(struct ipu6_isys *isys,
+ const unsigned int stream_handle,
+ struct isys_fw_msgs *msg);
+int ipu6_fw_isys_stream_close(struct ipu6_isys *isys,
+ const unsigned int stream_handle);
+int ipu6_fw_isys_stream_flush(struct ipu6_isys *isys,
+ const unsigned int stream_handle);
+int ipu6_fw_isys_stream_start(struct ipu6_isys *isys,
+ const unsigned int stream_handle,
+ struct isys_fw_msgs *msg, bool capture);
+int ipu6_fw_isys_stream_capture(struct ipu6_isys *isys,
+ const unsigned int stream_handle,
+ struct isys_fw_msgs *msg);
+int ipu6_fw_isys_prepare_stream_cfg(struct ipu6_isys_video *av,
+ struct isys_fw_msgs *msg);
+void
+ipu6_fw_isys_prepare_buf_set(struct isys_fw_msgs *msg,
+ struct ipu6_isys_stream *stream,
+ struct ipu6_isys_buffer_list *bl);
+void
+ipu6_fw_isys_dump_stream_cfg(struct device *dev, struct isys_fw_msgs *set);
+void
+ipu6_fw_isys_dump_frame_buff_set(struct device *dev, struct isys_fw_msgs *set,
+ unsigned int outputs);
+
#endif
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c b/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c
index 529973860e9e..9f6f283600c8 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c
@@ -233,58 +233,6 @@ static int buffer_list_get(struct ipu6_isys_stream *stream,
return 0;
}
-static void
-ipu6_isys_buf_to_fw_frame_buf_pin(struct vb2_buffer *vb,
- struct ipu6_fw_isys_frame_buff_set_abi *set)
-{
- struct ipu6_isys_queue *aq = vb2_queue_to_isys_queue(vb->vb2_queue);
- struct vb2_v4l2_buffer *vvb = to_vb2_v4l2_buffer(vb);
- struct ipu6_isys_video_buffer *ivb =
- vb2_buffer_to_ipu6_isys_video_buffer(vvb);
-
- set->output_pins[aq->fw_output].addr = ivb->dma_addr;
- set->output_pins[aq->fw_output].out_buf_id = vb->index + 1;
-}
-
-/*
- * Convert a buffer list to a isys fw ABI framebuffer set. The
- * buffer list is not modified.
- */
-#define IPU6_ISYS_FRAME_NUM_THRESHOLD (30)
-void
-ipu6_isys_buf_to_fw_frame_buf(struct ipu6_fw_isys_frame_buff_set_abi *set,
- struct ipu6_isys_stream *stream,
- struct ipu6_isys_buffer_list *bl)
-{
- struct ipu6_isys_buffer *ib;
-
- WARN_ON(!bl->nbufs);
-
- set->send_irq_sof = 1;
- set->send_resp_sof = 1;
- set->send_irq_eof = 0;
- set->send_resp_eof = 0;
-
- if (stream->streaming)
- set->send_irq_capture_ack = 0;
- else
- set->send_irq_capture_ack = 1;
- set->send_irq_capture_done = 0;
-
- set->send_resp_capture_ack = 1;
- set->send_resp_capture_done = 1;
- if (atomic_read(&stream->sequence) >= IPU6_ISYS_FRAME_NUM_THRESHOLD) {
- set->send_resp_capture_ack = 0;
- set->send_resp_capture_done = 0;
- }
-
- list_for_each_entry(ib, &bl->head, head) {
- struct vb2_buffer *vb = ipu6_isys_buffer_to_vb2_buffer(ib);
-
- ipu6_isys_buf_to_fw_frame_buf_pin(vb, set);
- }
-}
-
/* Start streaming for real. The buffer list must be available. */
static int ipu6_isys_stream_start(struct ipu6_isys_video *av,
struct ipu6_isys_buffer_list *bl)
@@ -304,9 +252,7 @@ static int ipu6_isys_stream_start(struct ipu6_isys_video *av,
bl = &__bl;
do {
- struct ipu6_fw_isys_frame_buff_set_abi *buf = NULL;
struct isys_fw_msgs *msg;
- u16 send_type = IPU6_FW_ISYS_SEND_TYPE_STREAM_CAPTURE;
ret = buffer_list_get(stream, bl);
if (ret < 0)
@@ -316,16 +262,14 @@ static int ipu6_isys_stream_start(struct ipu6_isys_video *av,
if (!msg)
return -ENOMEM;
- buf = &msg->ipu6.frame;
- ipu6_isys_buf_to_fw_frame_buf(buf, stream, bl);
- ipu6_fw_isys_dump_frame_buff_set(dev, buf,
+ ipu6_fw_isys_prepare_buf_set(msg, stream, bl);
+ ipu6_fw_isys_dump_frame_buff_set(dev, msg,
stream->nr_output_pins);
ipu6_isys_buffer_list_queue(bl, IPU6_ISYS_BUFFER_LIST_FL_ACTIVE,
0);
- ret = ipu6_fw_isys_complex_cmd(stream->isys,
- stream->stream_handle, buf,
- msg->dma_addr, sizeof(*buf),
- send_type);
+
+ ret = ipu6_fw_isys_stream_capture(stream->isys,
+ stream->stream_handle, msg);
} while (!WARN_ON(ret));
return 0;
@@ -349,7 +293,6 @@ static void buf_queue(struct vb2_buffer *vb)
vb2_buffer_to_ipu6_isys_video_buffer(vvb);
struct ipu6_isys_buffer *ib = &ivb->ib;
struct device *dev = &av->isys->adev->auxdev.dev;
- struct ipu6_fw_isys_frame_buff_set_abi *buf = NULL;
struct ipu6_isys_stream *stream = av->stream;
struct ipu6_isys_buffer_list bl;
struct isys_fw_msgs *msg;
@@ -396,9 +339,8 @@ static void buf_queue(struct vb2_buffer *vb)
goto out;
}
- buf = &msg->ipu6.frame;
- ipu6_isys_buf_to_fw_frame_buf(buf, stream, &bl);
- ipu6_fw_isys_dump_frame_buff_set(dev, buf, stream->nr_output_pins);
+ ipu6_fw_isys_prepare_buf_set(msg, stream, &bl);
+ ipu6_fw_isys_dump_frame_buff_set(dev, msg, stream->nr_output_pins);
/*
* We must queue the buffers in the buffer list to the
@@ -408,9 +350,8 @@ static void buf_queue(struct vb2_buffer *vb)
*/
ipu6_isys_buffer_list_queue(&bl, IPU6_ISYS_BUFFER_LIST_FL_ACTIVE, 0);
- ret = ipu6_fw_isys_complex_cmd(stream->isys, stream->stream_handle,
- buf, msg->dma_addr, sizeof(*buf),
- IPU6_FW_ISYS_SEND_TYPE_STREAM_CAPTURE);
+ ret = ipu6_fw_isys_stream_capture(stream->isys, stream->stream_handle,
+ msg);
if (ret < 0)
dev_err(dev, "send stream capture failed\n");
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-queue.h b/drivers/media/pci/intel/ipu6/ipu6-isys-queue.h
index dec1fed44dd2..51de14183ccf 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-queue.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-queue.h
@@ -60,10 +60,6 @@ struct ipu6_isys_buffer_list {
void ipu6_isys_buffer_list_queue(struct ipu6_isys_buffer_list *bl,
unsigned long op_flags,
enum vb2_buffer_state state);
-void
-ipu6_isys_buf_to_fw_frame_buf(struct ipu6_fw_isys_frame_buff_set_abi *set,
- struct ipu6_isys_stream *stream,
- struct ipu6_isys_buffer_list *bl);
void ipu6_isys_queue_buf_ready(struct ipu6_isys_stream *stream,
struct ipu6_fw_isys_resp_info_abi *info);
int ipu6_isys_queue_init(struct ipu6_isys_queue *aq);
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-video.c b/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
index fabea6a75d7d..a6e50263f8da 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
@@ -450,115 +450,28 @@ static void put_stream_opened(struct ipu6_isys_video *av)
spin_unlock_irqrestore(&av->isys->streams_lock, flags);
}
-static int ipu6_isys_fw_pin_cfg(struct ipu6_isys_video *av,
- struct ipu6_fw_isys_stream_cfg_data_abi *cfg)
-{
- struct media_pad *src_pad = media_pad_remote_pad_first(&av->pad);
- struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(src_pad->entity);
- struct v4l2_subdev_state *state = v4l2_subdev_get_locked_active_state(sd);
- struct ipu6_fw_isys_input_pin_info_abi *input_pin;
- struct ipu6_fw_isys_output_pin_info_abi *output_pin;
- struct ipu6_isys_stream *stream = av->stream;
- struct ipu6_isys_queue *aq = &av->aq;
- struct v4l2_mbus_framefmt fmt;
- const struct ipu6_isys_pixelformat *pfmt =
- ipu6_isys_get_isys_format(ipu6_isys_get_format(av), 0);
- struct v4l2_rect v4l2_crop;
- struct ipu6_isys *isys = av->isys;
- int input_pins = cfg->nof_input_pins++;
- int output_pins;
- u32 src_stream;
-
- src_stream = ipu6_isys_get_src_stream_by_src_pad(sd, src_pad->index);
- fmt = *v4l2_subdev_state_get_format(state, src_pad->index, src_stream);
- v4l2_crop = *v4l2_subdev_state_get_crop(state, src_pad->index, src_stream);
-
- input_pin = &cfg->input_pins[input_pins];
- input_pin->input_res.width = fmt.width;
- input_pin->input_res.height = fmt.height;
- input_pin->dt = av->dt;
- input_pin->bits_per_pix = pfmt->bpp_packed;
- input_pin->mapped_dt = 0x40; /* invalid mipi data type */
- input_pin->mipi_decompression = 0;
- input_pin->capture_mode = IPU6_FW_ISYS_CAPTURE_MODE_REGULAR;
- input_pin->mipi_store_mode = pfmt->bpp == pfmt->bpp_packed ?
- IPU6_FW_ISYS_MIPI_STORE_MODE_DISCARD_LONG_HEADER :
- IPU6_FW_ISYS_MIPI_STORE_MODE_NORMAL;
- input_pin->crop_first_and_last_lines = v4l2_crop.top & 1;
-
- output_pins = cfg->nof_output_pins++;
- aq->fw_output = output_pins;
- stream->output_pins_queue[output_pins] = aq;
-
- output_pin = &cfg->output_pins[output_pins];
- output_pin->input_pin_id = input_pins;
- output_pin->output_res.width = ipu6_isys_get_frame_width(av);
- output_pin->output_res.height = ipu6_isys_get_frame_height(av);
-
- output_pin->stride = ipu6_isys_get_bytes_per_line(av);
- if (pfmt->bpp != pfmt->bpp_packed)
- output_pin->pt = IPU6_FW_ISYS_PIN_TYPE_RAW_SOC;
- else
- output_pin->pt = IPU6_FW_ISYS_PIN_TYPE_MIPI;
- output_pin->ft = pfmt->css_pixelformat;
- output_pin->send_irq = 1;
- memset(output_pin->ts_offsets, 0, sizeof(output_pin->ts_offsets));
- output_pin->s2m_pixel_soc_pixel_remapping =
- S2M_PIXEL_SOC_PIXEL_REMAPPING_FLAG_NO_REMAPPING;
- output_pin->csi_be_soc_pixel_remapping =
- CSI_BE_SOC_PIXEL_REMAPPING_FLAG_NO_REMAPPING;
-
- output_pin->snoopable = true;
- output_pin->error_handling_enable = false;
- output_pin->sensor_type = isys->sensor_type++;
- if (isys->sensor_type > isys->pdata->ipdata->sensor_type_end)
- isys->sensor_type = isys->pdata->ipdata->sensor_type_start;
-
- return 0;
-}
-
static int start_stream_firmware(struct ipu6_isys_video *av,
struct ipu6_isys_buffer_list *bl)
{
- struct ipu6_fw_isys_stream_cfg_data_abi *stream_cfg;
- struct ipu6_fw_isys_frame_buff_set_abi *buf = NULL;
struct ipu6_isys_stream *stream = av->stream;
struct device *dev = &av->isys->adev->auxdev.dev;
struct isys_fw_msgs *msg = NULL;
- struct ipu6_isys_queue *aq;
int ret, retout, tout;
- u16 send_type;
+ bool capture = bl ? true : false;
msg = ipu6_get_fw_msg_buf(stream);
if (!msg)
return -ENOMEM;
- stream_cfg = &msg->ipu6.stream;
- stream_cfg->src = stream->stream_source;
- stream_cfg->vc = stream->vc;
- stream_cfg->isl_use = 0;
- stream_cfg->sensor_type = IPU6_FW_ISYS_SENSOR_MODE_NORMAL;
-
- list_for_each_entry(aq, &stream->queues, node) {
- struct ipu6_isys_video *__av = ipu6_isys_queue_to_video(aq);
-
- ret = ipu6_isys_fw_pin_cfg(__av, stream_cfg);
- if (ret < 0) {
- ipu6_put_fw_msg_buf(av->isys, msg);
- return ret;
- }
+ ret = ipu6_fw_isys_prepare_stream_cfg(av, msg);
+ if (ret < 0) {
+ ipu6_put_fw_msg_buf(av->isys, msg);
+ return ret;
}
- ipu6_fw_isys_dump_stream_cfg(dev, stream_cfg);
-
- stream->nr_output_pins = stream_cfg->nof_output_pins;
-
reinit_completion(&stream->stream_open_completion);
- ret = ipu6_fw_isys_complex_cmd(av->isys, stream->stream_handle,
- stream_cfg, msg->dma_addr,
- sizeof(*stream_cfg),
- IPU6_FW_ISYS_SEND_TYPE_STREAM_OPEN);
+ ret = ipu6_fw_isys_stream_open(av->isys, stream->stream_handle, msg);
if (ret < 0) {
dev_err(dev, "can't open stream (%d)\n", ret);
ipu6_put_fw_msg_buf(av->isys, msg);
@@ -590,26 +503,16 @@ static int start_stream_firmware(struct ipu6_isys_video *av,
ret = -ENOMEM;
goto out_put_stream_opened;
}
- buf = &msg->ipu6.frame;
- ipu6_isys_buf_to_fw_frame_buf(buf, stream, bl);
+
+ ipu6_fw_isys_prepare_buf_set(msg, stream, bl);
ipu6_isys_buffer_list_queue(bl,
IPU6_ISYS_BUFFER_LIST_FL_ACTIVE, 0);
}
reinit_completion(&stream->stream_start_completion);
- if (bl) {
- send_type = IPU6_FW_ISYS_SEND_TYPE_STREAM_START_AND_CAPTURE;
- ipu6_fw_isys_dump_frame_buff_set(dev, buf,
- stream_cfg->nof_output_pins);
- ret = ipu6_fw_isys_complex_cmd(av->isys, stream->stream_handle,
- buf, msg->dma_addr,
- sizeof(*buf), send_type);
- } else {
- send_type = IPU6_FW_ISYS_SEND_TYPE_STREAM_START;
- ret = ipu6_fw_isys_simple_cmd(av->isys, stream->stream_handle,
- send_type);
- }
+ ret = ipu6_fw_isys_stream_start(av->isys, stream->stream_handle, msg,
+ capture);
if (ret < 0) {
dev_err(dev, "can't start streaming (%d)\n", ret);
@@ -635,9 +538,7 @@ static int start_stream_firmware(struct ipu6_isys_video *av,
out_stream_close:
reinit_completion(&stream->stream_close_completion);
- retout = ipu6_fw_isys_simple_cmd(av->isys,
- stream->stream_handle,
- IPU6_FW_ISYS_SEND_TYPE_STREAM_CLOSE);
+ retout = ipu6_fw_isys_stream_close(av->isys, stream->stream_handle);
if (retout < 0) {
dev_dbg(dev, "can't close stream (%d)\n", retout);
goto out_put_stream_opened;
@@ -666,9 +567,7 @@ static void stop_streaming_firmware(struct ipu6_isys_video *av)
reinit_completion(&stream->stream_stop_completion);
- ret = ipu6_fw_isys_simple_cmd(av->isys, stream->stream_handle,
- IPU6_FW_ISYS_SEND_TYPE_STREAM_FLUSH);
-
+ ret = ipu6_fw_isys_stream_flush(av->isys, stream->stream_handle);
if (ret < 0) {
dev_err(dev, "can't stop stream (%d)\n", ret);
return;
@@ -692,8 +591,7 @@ static void close_streaming_firmware(struct ipu6_isys_video *av)
reinit_completion(&stream->stream_close_completion);
- ret = ipu6_fw_isys_simple_cmd(av->isys, stream->stream_handle,
- IPU6_FW_ISYS_SEND_TYPE_STREAM_CLOSE);
+ ret = ipu6_fw_isys_stream_close(av->isys, stream->stream_handle);
if (ret < 0) {
dev_err(dev, "can't close stream (%d)\n", ret);
return;
--
2.55.0
next prev parent reply other threads:[~2026-08-21 11:44 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-21 11:42 [PATCH v2 00/44] media: ipu6: Add support for ipu7 hardware Antti Laakso
2026-08-21 11:42 ` [PATCH v2 01/44] media: ipu6: Add helpers for IPU runtime variation Antti Laakso
2026-08-21 11:42 ` [PATCH v2 02/44] media: ipu6: Rename pointer to firmware context Antti Laakso
2026-08-21 11:42 ` [PATCH v2 03/44] media: ipu6: Rename buttress_ipc pointer Antti Laakso
2026-08-21 11:42 ` [PATCH v2 04/44] media: ipu6: Remove duplicate warnings in cpd validation Antti Laakso
2026-08-21 11:42 ` [PATCH v2 05/44] media: ipu6: Remove unused ipu6 firmware struct Antti Laakso
2026-08-21 11:42 ` [PATCH v2 06/44] media: ipu6: Cleanup ipu6_mmu_init() Antti Laakso
2026-08-21 11:42 ` [PATCH v2 07/44] media: ipu6: Simplify firmware com arguments Antti Laakso
2026-08-21 11:42 ` [PATCH v2 08/44] media: ipu6: Add helper to identify ipu7 Antti Laakso
2026-08-21 11:42 ` [PATCH v2 09/44] media: ipu6: Prepare buttress for ipu7 support Antti Laakso
2026-08-21 11:42 ` [PATCH v2 10/44] media: ipu6: Use single struct for registers Antti Laakso
2026-08-21 11:42 ` [PATCH v2 11/44] media: ipu6: Rename IPU subsys ID Antti Laakso
2026-08-21 11:42 ` [PATCH v2 12/44] media: ipu6: Add ipu7 buttress support Antti Laakso
2026-08-21 11:42 ` [PATCH v2 13/44] media: ipu6: Prepare mmu driver for hw variation Antti Laakso
2026-08-21 11:42 ` [PATCH v2 14/44] media: ipu6: Add ipu7 mmu support Antti Laakso
2026-08-21 11:42 ` [PATCH v2 15/44] media: ipu6: Add ipu7 cpd handling Antti Laakso
2026-08-21 11:42 ` [PATCH v2 16/44] media: ipu6: Add check for pkg_dir before freeing Antti Laakso
2026-08-21 11:42 ` [PATCH v2 17/44] media: ipu6: Rename isys fw msg union Antti Laakso
2026-08-21 11:42 ` [PATCH v2 18/44] media: ipu6: Move isys isr handlers to fw file Antti Laakso
2026-08-21 11:42 ` [PATCH v2 19/44] media: ipu6: Move hw specific buffer handling down Antti Laakso
2026-08-21 11:42 ` Antti Laakso [this message]
2026-08-21 11:42 ` [PATCH v2 21/44] media: ipu6: Add isys firmware ops Antti Laakso
2026-08-21 11:42 ` [PATCH v2 22/44] media: ipu6: Add ipu7 fw start/stop functionality Antti Laakso
2026-08-21 11:42 ` [PATCH v2 23/44] media: ipu6: Add ipu7 fw com methods Antti Laakso
2026-08-21 11:42 ` [PATCH v2 24/44] media: ipu6: Add ipu7 fw isys ops Antti Laakso
2026-08-21 11:42 ` [PATCH v2 25/44] media: ipu6: Add ipu7 csi2 register definitions Antti Laakso
2026-08-21 11:42 ` [PATCH v2 26/44] media: ipu6: Add ipu7 isr handler Antti Laakso
2026-08-21 11:42 ` [PATCH v2 27/44] media: ipu6: Add ipu7 csi phy driver Antti Laakso
2026-08-21 11:42 ` [PATCH v2 28/44] media: ipu6: Split ipu6 csi2 stream enable/disable Antti Laakso
2026-08-21 11:42 ` [PATCH v2 29/44] media: ipu6: Add support for ipu7 csi2 receiver Antti Laakso
2026-08-21 11:42 ` [PATCH v2 30/44] media: ipu6: Parse bus type for ipu7 Antti Laakso
2026-08-21 11:42 ` [PATCH v2 31/44] media: ipu6: Enable ipu7 isys interrupts Antti Laakso
2026-08-21 11:42 ` [PATCH v2 32/44] media: ipu6: Skip watermark configuration for ipu7 Antti Laakso
2026-08-21 11:42 ` [PATCH v2 33/44] media: ipu6: The SPC init is valid only for ipu6 Antti Laakso
2026-08-21 11:42 ` [PATCH v2 34/44] media: ipu6: The VC arbitration mechanism is ipu6 only Antti Laakso
2026-08-21 11:42 ` [PATCH v2 35/44] media: ipu6: Move buttress mem alloc out from probe Antti Laakso
2026-08-21 11:42 ` [PATCH v2 36/44] media: ipu6: Read correct SKU ID for ipu7 Antti Laakso
2026-08-21 11:42 ` [PATCH v2 37/44] media: ipu6: Add support for fixed iova region Antti Laakso
2026-08-21 11:42 ` [PATCH v2 38/44] media: ipu6: Make fw mapping function reusable Antti Laakso
2026-08-21 11:42 ` [PATCH v2 39/44] media: ipu6: Move isys fw mapping to pci_probe Antti Laakso
2026-08-21 18:17 ` Sakari Ailus
2026-08-21 11:42 ` [PATCH v2 40/44] media: ipu6: Map ipu7 firmware Antti Laakso
2026-08-21 18:23 ` Sakari Ailus
2026-08-21 11:42 ` [PATCH v2 41/44] media: ipu6: Set model name for ipu7 Antti Laakso
2026-08-21 11:43 ` [PATCH v2 42/44] media: ipu6: Add ipu7.5 buttress support Antti Laakso
2026-08-21 11:43 ` [PATCH v2 43/44] media: ipu6: Add ipu7.5 mmu initialization data Antti Laakso
2026-08-21 11:43 ` [PATCH v2 44/44] media: ipu6: Enable ipu7 and ipu7.5 Antti Laakso
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260821114302.365532-21-antti.laakso@linux.intel.com \
--to=antti.laakso@linux.intel.com \
--cc=daxing.li@intel.com \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=ong.hock.yu@intel.com \
--cc=sakari.ailus@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox