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 21/44] media: ipu6: Add isys firmware ops
Date: Fri, 21 Aug 2026 14:42:39 +0300 [thread overview]
Message-ID: <20260821114302.365532-22-antti.laakso@linux.intel.com> (raw)
In-Reply-To: <20260821114302.365532-1-antti.laakso@linux.intel.com>
Add struct for ipu6 firmware ops. This is a preparation to
add support for ipu7 firmware communication.
Signed-off-by: Antti Laakso <antti.laakso@linux.intel.com>
---
drivers/media/pci/intel/ipu6/ipu6-bus.h | 3 +
drivers/media/pci/intel/ipu6/ipu6-fw-isys.c | 71 +++++++++++--------
drivers/media/pci/intel/ipu6/ipu6-fw-isys.h | 38 +---------
.../media/pci/intel/ipu6/ipu6-isys-queue.c | 24 ++++---
.../media/pci/intel/ipu6/ipu6-isys-video.c | 35 +++++----
drivers/media/pci/intel/ipu6/ipu6-isys.c | 1 +
drivers/media/pci/intel/ipu6/ipu6-isys.h | 32 +++++++++
7 files changed, 116 insertions(+), 88 deletions(-)
diff --git a/drivers/media/pci/intel/ipu6/ipu6-bus.h b/drivers/media/pci/intel/ipu6/ipu6-bus.h
index a08c5468d536..62aa2b090699 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-bus.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-bus.h
@@ -37,6 +37,7 @@ struct ipu6_auxdrv_data {
irqreturn_t (*isr)(struct ipu6_bus_device *adev);
irqreturn_t (*isr_threaded)(struct ipu6_bus_device *adev);
bool wake_isr_thread;
+ const struct ipu6_fw_isys_ops *fw_ops;
};
#define to_ipu6_bus_device(_dev) \
@@ -45,6 +46,8 @@ struct ipu6_auxdrv_data {
container_of(_auxdev, struct ipu6_bus_device, auxdev)
#define ipu6_bus_get_drvdata(adev) dev_get_drvdata(&(adev)->auxdev.dev)
+extern const struct ipu6_fw_isys_ops ipu6_fw_isys_ops;
+
struct ipu6_bus_device *
ipu6_bus_initialize_device(struct pci_dev *pdev, struct device *parent,
void *pdata, const struct ipu6_buttress_ctrl *ctrl,
diff --git a/drivers/media/pci/intel/ipu6/ipu6-fw-isys.c b/drivers/media/pci/intel/ipu6/ipu6-fw-isys.c
index 9256ea3b68c1..4ee5137f310e 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-fw-isys.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-fw-isys.c
@@ -126,7 +126,7 @@ static int ipu6_fw_isys_complex_cmd(struct ipu6_isys *isys,
return 0;
}
-int ipu6_fw_isys_close(struct ipu6_isys *isys)
+static int ipu6_fw_isys_close(struct ipu6_isys *isys)
{
struct device *dev = &isys->adev->auxdev.dev;
int retry = IPU6_ISYS_CLOSE_RETRY;
@@ -165,7 +165,7 @@ int ipu6_fw_isys_close(struct ipu6_isys *isys)
return ret;
}
-void ipu6_fw_isys_cleanup(struct ipu6_isys *isys)
+static void ipu6_fw_isys_cleanup(struct ipu6_isys *isys)
{
int ret;
@@ -316,7 +316,7 @@ static int ipu6_isys_fwcom_cfg_init(struct ipu6_isys *isys,
return 0;
}
-int ipu6_fw_isys_init(struct ipu6_isys *isys, unsigned int num_streams)
+static int ipu6_fw_isys_init(struct ipu6_isys *isys, unsigned int num_streams)
{
struct device *dev = &isys->adev->auxdev.dev;
int retry = IPU6_ISYS_OPEN_RETRY;
@@ -358,18 +358,19 @@ int ipu6_fw_isys_init(struct ipu6_isys *isys, unsigned int num_streams)
return ret;
}
-struct ipu6_fw_isys_resp_info_abi *
+static struct ipu6_fw_isys_resp_info_abi *
ipu6_fw_isys_get_resp(struct ipu6_isys *isys)
{
return ipu6_recv_get_token(isys->fwctx, IPU6_BASE_MSG_RECV_QUEUES);
}
-void ipu6_fw_isys_put_resp(struct ipu6_isys *isys)
+static 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 isys_fw_msgs *msg)
+static 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;
@@ -446,9 +447,9 @@ void ipu6_fw_isys_dump_stream_cfg(struct device *dev, struct isys_fw_msgs *msg)
dev_dbg(dev, "-----------------------------------------------------\n");
}
-void
-ipu6_fw_isys_dump_frame_buff_set(struct device *dev, struct isys_fw_msgs *msg,
- unsigned int outputs)
+static void
+ipu6_fw_isys_dump_frame_buf_set(struct device *dev, struct isys_fw_msgs *msg,
+ unsigned int outputs)
{
struct ipu6_fw_isys_frame_buff_set_abi *buf;
unsigned int i;
@@ -820,8 +821,8 @@ static int ipu6_isys_fw_pin_cfg(struct ipu6_isys_video *av,
return 0;
}
-int ipu6_fw_isys_prepare_stream_cfg(struct ipu6_isys_video *av,
- struct isys_fw_msgs *msg)
+static 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;
@@ -850,9 +851,9 @@ int ipu6_fw_isys_prepare_stream_cfg(struct ipu6_isys_video *av,
return 0;
}
-int ipu6_fw_isys_stream_open(struct ipu6_isys *isys,
- const unsigned int stream_handle,
- struct isys_fw_msgs *msg)
+static 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,
@@ -860,23 +861,23 @@ int ipu6_fw_isys_stream_open(struct ipu6_isys *isys,
IPU6_FW_ISYS_SEND_TYPE_STREAM_OPEN);
}
-int ipu6_fw_isys_stream_close(struct ipu6_isys *isys,
- const unsigned int stream_handle)
+static 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)
+static 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)
+static 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;
@@ -890,9 +891,9 @@ int ipu6_fw_isys_stream_start(struct ipu6_isys *isys,
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)
+static 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,
@@ -918,10 +919,9 @@ ipu6_isys_buf_to_fw_frame_buf_pin(struct vb2_buffer *vb,
* 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)
+static 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;
@@ -952,3 +952,18 @@ ipu6_fw_isys_prepare_buf_set(struct isys_fw_msgs *msg,
ipu6_isys_buf_to_fw_frame_buf_pin(vb, set);
}
}
+
+const struct ipu6_fw_isys_ops ipu6_fw_isys_ops = {
+ .init = ipu6_fw_isys_init,
+ .close = ipu6_fw_isys_close,
+ .cleanup = ipu6_fw_isys_cleanup,
+ .prepare_stream_cfg = ipu6_fw_isys_prepare_stream_cfg,
+ .prepare_buf_set = ipu6_fw_isys_prepare_buf_set,
+ .stream_open = ipu6_fw_isys_stream_open,
+ .stream_start = ipu6_fw_isys_stream_start,
+ .stream_capture = ipu6_fw_isys_stream_capture,
+ .stream_flush = ipu6_fw_isys_stream_flush,
+ .stream_close = ipu6_fw_isys_stream_close,
+ .dump_stream_cfg = ipu6_fw_isys_dump_stream_cfg,
+ .dump_frame_buf_set = ipu6_fw_isys_dump_frame_buf_set,
+};
diff --git a/drivers/media/pci/intel/ipu6/ipu6-fw-isys.h b/drivers/media/pci/intel/ipu6/ipu6-fw-isys.h
index b589ae7fbd4e..2a679d995961 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-fw-isys.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-fw-isys.h
@@ -559,42 +559,10 @@ struct ipu6_fw_proxy_send_queue_token {
u32 value;
};
-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_send_proxy_token(struct ipu6_isys *isys,
- unsigned int req_id,
- unsigned int index,
- unsigned int offset, u32 value);
-void ipu6_fw_isys_cleanup(struct ipu6_isys *isys);
-struct ipu6_fw_isys_resp_info_abi *
-ipu6_fw_isys_get_resp(struct ipu6_isys *isys);
-void ipu6_fw_isys_put_resp(struct ipu6_isys *isys);
+int ipu6_fw_isys_send_proxy_token(struct ipu6_isys *isys, unsigned int req_id,
+ unsigned int index, unsigned int offset,
+ u32 value);
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 9f6f283600c8..4cb1741445c6 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c
@@ -237,8 +237,10 @@ static int buffer_list_get(struct ipu6_isys_stream *stream,
static int ipu6_isys_stream_start(struct ipu6_isys_video *av,
struct ipu6_isys_buffer_list *bl)
{
+ struct ipu6_bus_device *adev = av->isys->adev;
+ const struct ipu6_fw_isys_ops *fw_ops = adev->auxdrv_data->fw_ops;
struct ipu6_isys_stream *stream = av->stream;
- struct device *dev = &stream->isys->adev->auxdev.dev;
+ struct device *dev = &adev->auxdev.dev;
struct ipu6_isys_buffer_list __bl;
int ret;
@@ -262,14 +264,13 @@ static int ipu6_isys_stream_start(struct ipu6_isys_video *av,
if (!msg)
return -ENOMEM;
- ipu6_fw_isys_prepare_buf_set(msg, stream, bl);
- ipu6_fw_isys_dump_frame_buff_set(dev, msg,
- stream->nr_output_pins);
+ fw_ops->prepare_buf_set(msg, stream, bl);
+ fw_ops->dump_frame_buf_set(dev, msg, stream->nr_output_pins);
ipu6_isys_buffer_list_queue(bl, IPU6_ISYS_BUFFER_LIST_FL_ACTIVE,
0);
- ret = ipu6_fw_isys_stream_capture(stream->isys,
- stream->stream_handle, msg);
+ ret = fw_ops->stream_capture(stream->isys,
+ stream->stream_handle, msg);
} while (!WARN_ON(ret));
return 0;
@@ -288,11 +289,13 @@ static void buf_queue(struct vb2_buffer *vb)
{
struct ipu6_isys_queue *aq = vb2_queue_to_isys_queue(vb->vb2_queue);
struct ipu6_isys_video *av = ipu6_isys_queue_to_video(aq);
+ struct ipu6_bus_device *adev = av->isys->adev;
+ const struct ipu6_fw_isys_ops *fw_ops = adev->auxdrv_data->fw_ops;
struct vb2_v4l2_buffer *vvb = to_vb2_v4l2_buffer(vb);
struct ipu6_isys_video_buffer *ivb =
vb2_buffer_to_ipu6_isys_video_buffer(vvb);
struct ipu6_isys_buffer *ib = &ivb->ib;
- struct device *dev = &av->isys->adev->auxdev.dev;
+ struct device *dev = &adev->auxdev.dev;
struct ipu6_isys_stream *stream = av->stream;
struct ipu6_isys_buffer_list bl;
struct isys_fw_msgs *msg;
@@ -339,8 +342,8 @@ static void buf_queue(struct vb2_buffer *vb)
goto out;
}
- ipu6_fw_isys_prepare_buf_set(msg, stream, &bl);
- ipu6_fw_isys_dump_frame_buff_set(dev, msg, stream->nr_output_pins);
+ fw_ops->prepare_buf_set(msg, stream, &bl);
+ fw_ops->dump_frame_buf_set(dev, msg, stream->nr_output_pins);
/*
* We must queue the buffers in the buffer list to the
@@ -350,8 +353,7 @@ 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_stream_capture(stream->isys, stream->stream_handle,
- msg);
+ ret = fw_ops->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-video.c b/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
index a6e50263f8da..803450b0156e 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
@@ -453,8 +453,10 @@ static void put_stream_opened(struct ipu6_isys_video *av)
static int start_stream_firmware(struct ipu6_isys_video *av,
struct ipu6_isys_buffer_list *bl)
{
+ struct ipu6_bus_device *adev = av->isys->adev;
+ const struct ipu6_fw_isys_ops *fw_ops = adev->auxdrv_data->fw_ops;
struct ipu6_isys_stream *stream = av->stream;
- struct device *dev = &av->isys->adev->auxdev.dev;
+ struct device *dev = &adev->auxdev.dev;
struct isys_fw_msgs *msg = NULL;
int ret, retout, tout;
bool capture = bl ? true : false;
@@ -463,7 +465,7 @@ static int start_stream_firmware(struct ipu6_isys_video *av,
if (!msg)
return -ENOMEM;
- ret = ipu6_fw_isys_prepare_stream_cfg(av, msg);
+ ret = fw_ops->prepare_stream_cfg(av, msg);
if (ret < 0) {
ipu6_put_fw_msg_buf(av->isys, msg);
return ret;
@@ -471,7 +473,7 @@ static int start_stream_firmware(struct ipu6_isys_video *av,
reinit_completion(&stream->stream_open_completion);
- ret = ipu6_fw_isys_stream_open(av->isys, stream->stream_handle, msg);
+ ret = fw_ops->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);
@@ -504,15 +506,15 @@ static int start_stream_firmware(struct ipu6_isys_video *av,
goto out_put_stream_opened;
}
- ipu6_fw_isys_prepare_buf_set(msg, stream, bl);
+ fw_ops->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);
- ret = ipu6_fw_isys_stream_start(av->isys, stream->stream_handle, msg,
- capture);
+ ret = fw_ops->stream_start(av->isys, stream->stream_handle, msg,
+ capture);
if (ret < 0) {
dev_err(dev, "can't start streaming (%d)\n", ret);
@@ -538,7 +540,7 @@ static int start_stream_firmware(struct ipu6_isys_video *av,
out_stream_close:
reinit_completion(&stream->stream_close_completion);
- retout = ipu6_fw_isys_stream_close(av->isys, stream->stream_handle);
+ retout = fw_ops->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;
@@ -561,13 +563,15 @@ static int start_stream_firmware(struct ipu6_isys_video *av,
static void stop_streaming_firmware(struct ipu6_isys_video *av)
{
- struct device *dev = &av->isys->adev->auxdev.dev;
+ struct ipu6_bus_device *adev = av->isys->adev;
+ const struct ipu6_fw_isys_ops *fw_ops = adev->auxdrv_data->fw_ops;
+ struct device *dev = &adev->auxdev.dev;
struct ipu6_isys_stream *stream = av->stream;
int ret, tout;
reinit_completion(&stream->stream_stop_completion);
- ret = ipu6_fw_isys_stream_flush(av->isys, stream->stream_handle);
+ ret = fw_ops->stream_flush(av->isys, stream->stream_handle);
if (ret < 0) {
dev_err(dev, "can't stop stream (%d)\n", ret);
return;
@@ -585,13 +589,15 @@ static void stop_streaming_firmware(struct ipu6_isys_video *av)
static void close_streaming_firmware(struct ipu6_isys_video *av)
{
+ struct ipu6_bus_device *adev = av->isys->adev;
+ const struct ipu6_fw_isys_ops *fw_ops = adev->auxdrv_data->fw_ops;
struct ipu6_isys_stream *stream = av->stream;
- struct device *dev = &av->isys->adev->auxdev.dev;
+ struct device *dev = &adev->auxdev.dev;
int ret, tout;
reinit_completion(&stream->stream_close_completion);
- ret = ipu6_fw_isys_stream_close(av->isys, stream->stream_handle);
+ ret = fw_ops->stream_close(av->isys, stream->stream_handle);
if (ret < 0) {
dev_err(dev, "can't close stream (%d)\n", ret);
return;
@@ -990,6 +996,7 @@ static const struct v4l2_file_operations isys_fops = {
int ipu6_isys_fw_open(struct ipu6_isys *isys)
{
struct ipu6_bus_device *adev = isys->adev;
+ const struct ipu6_fw_isys_ops *fw_ops = adev->auxdrv_data->fw_ops;
const struct ipu6_isys_internal_pdata *ipdata = isys->pdata->ipdata;
int ret;
@@ -1018,10 +1025,10 @@ int ipu6_isys_fw_open(struct ipu6_isys *isys)
* restarting isys we can safely delete old context.
*/
dev_warn(&adev->auxdev.dev, "clearing old context\n");
- ipu6_fw_isys_cleanup(isys);
+ fw_ops->cleanup(isys);
}
- ret = ipu6_fw_isys_init(isys, ipdata->num_parallel_streams);
+ ret = fw_ops->init(isys, ipdata->num_parallel_streams);
if (ret < 0)
goto out;
@@ -1044,7 +1051,7 @@ void ipu6_isys_fw_close(struct ipu6_isys *isys)
isys->ref_count--;
if (!isys->ref_count) {
- ipu6_fw_isys_close(isys);
+ isys->adev->auxdrv_data->fw_ops->close(isys);
if (isys->fwctx) {
isys->need_reset = true;
dev_warn(&isys->adev->auxdev.dev,
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys.c b/drivers/media/pci/intel/ipu6/ipu6-isys.c
index bb3c0d6bc6c9..159e769931b7 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys.c
@@ -1068,6 +1068,7 @@ static const struct ipu6_auxdrv_data ipu6_isys_auxdrv_data = {
.isr = ipu6_isys_isr,
.isr_threaded = NULL,
.wake_isr_thread = false,
+ .fw_ops = &ipu6_fw_isys_ops,
};
static const struct auxiliary_device_id ipu6_isys_id_table[] = {
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys.h b/drivers/media/pci/intel/ipu6/ipu6-isys.h
index f39566513a87..fa9bc2730d64 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys.h
@@ -174,6 +174,38 @@ struct isys_fw_msgs {
dma_addr_t dma_addr;
};
+struct ipu6_fw_isys_ops {
+ int (*init)(struct ipu6_isys *isys, unsigned int num_streams);
+ int (*close)(struct ipu6_isys *isys);
+ int (*send_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);
+ void (*cleanup)(struct ipu6_isys *isys);
+ int (*prepare_stream_cfg)(struct ipu6_isys_video *av,
+ struct isys_fw_msgs *msg);
+ void (*prepare_buf_set)(struct isys_fw_msgs *msg,
+ struct ipu6_isys_stream *stream,
+ struct ipu6_isys_buffer_list *bl);
+ int (*stream_open)(struct ipu6_isys *isys,
+ const unsigned int stream_handle,
+ struct isys_fw_msgs *msg);
+ int (*stream_start)(struct ipu6_isys *isys,
+ const unsigned int stream_handle,
+ struct isys_fw_msgs *msg, bool capture);
+ int (*stream_capture)(struct ipu6_isys *isys,
+ const unsigned int stream_handle,
+ struct isys_fw_msgs *msg);
+ int (*stream_flush)(struct ipu6_isys *isys,
+ const unsigned int stream_handle);
+ int (*stream_close)(struct ipu6_isys *isys,
+ const unsigned int stream_handle);
+ void (*dump_stream_cfg)(struct device *dev, struct isys_fw_msgs *msg);
+ void (*dump_frame_buf_set)(struct device *dev, struct isys_fw_msgs *msg,
+ unsigned int outputs);
+};
+
struct isys_fw_msgs *ipu6_get_fw_msg_buf(struct ipu6_isys_stream *stream);
void ipu6_put_fw_msg_buf(struct ipu6_isys *isys, struct isys_fw_msgs *msg);
void ipu6_cleanup_fw_msg_bufs(struct ipu6_isys *isys);
--
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 ` [PATCH v2 20/44] media: ipu6: Isolate hw specific buffer handling Antti Laakso
2026-08-21 11:42 ` Antti Laakso [this message]
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-22-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