diff --git a/patch/v7.2.3/0004-staging-ipu7-Update-IPU7-firmware-ABI-version-to-1.2.patch b/patch/v7.2.3/0004-staging-ipu7-Update-IPU7-firmware-ABI-version-to-1.2.patch new file mode 100644 index 0000000..e3bbb49 --- /dev/null +++ b/patch/v7.2.3/0004-staging-ipu7-Update-IPU7-firmware-ABI-version-to-1.2.patch @@ -0,0 +1,85 @@ +From 26c7c65e9ebb17fd1458fbc28467051f5eaa6570 Mon Sep 17 00:00:00 2001 +From: "Mishra, Saras" +Date: Mon, 21 Sep 2026 11:19:47 +0300 +Subject: [PATCH] staging: ipu7: Update IPU7 firmware ABI version to 1.2 + (recreated for ToT) + +--- + drivers/staging/media/ipu7/abi/ipu7_fw_boot_abi.h | 1 + + drivers/staging/media/ipu7/abi/ipu7_fw_isys_abi.h | 11 +++++++---- + drivers/staging/media/ipu7/abi/ipu7_fw_msg_abi.h | 2 +- + 3 files changed, 9 insertions(+), 5 deletions(-) + +diff --git a/drivers/staging/media/ipu7/abi/ipu7_fw_boot_abi.h b/drivers/staging/media/ipu7/abi/ipu7_fw_boot_abi.h +index 56b90aab83ea..82e14e59100b 100644 +--- a/drivers/staging/media/ipu7/abi/ipu7_fw_boot_abi.h ++++ b/drivers/staging/media/ipu7/abi/ipu7_fw_boot_abi.h +@@ -153,6 +153,7 @@ enum ia_gofo_boot_state { + IA_GOFO_FW_BOOT_STATE_CRIT_MPU_CONFIG_FAILURE = 0xdead1013, + IA_GOFO_FW_BOOT_STATE_CRIT_SHARED_BUFFER_FAILURE = 0xdead1014, + IA_GOFO_FW_BOOT_STATE_CRIT_CMEM_FAILURE = 0xdead1015, ++ IA_GOFO_FW_BOOT_STATE_CRIT_SYSCOM_CONTEXT_FAILURE = 0xdead1016, + IA_GOFO_FW_BOOT_STATE_SHUTDOWN_CMD = 0x57a7f001, + IA_GOFO_FW_BOOT_STATE_SHUTDOWN_START = 0x57a7e200, + IA_GOFO_FW_BOOT_STATE_INACTIVE = 0x57a7e300, +diff --git a/drivers/staging/media/ipu7/abi/ipu7_fw_isys_abi.h b/drivers/staging/media/ipu7/abi/ipu7_fw_isys_abi.h +index c42d0b7a2627..7f622bfe9af6 100644 +--- a/drivers/staging/media/ipu7/abi/ipu7_fw_isys_abi.h ++++ b/drivers/staging/media/ipu7/abi/ipu7_fw_isys_abi.h +@@ -47,7 +47,6 @@ enum ipu7_insys_resp_type { + IPU_INSYS_RESP_TYPE_FRAME_EOF = 8, + IPU_INSYS_RESP_TYPE_STREAM_START_AND_CAPTURE_DONE = 9, + IPU_INSYS_RESP_TYPE_STREAM_CAPTURE_DONE = 10, +- IPU_INSYS_RESP_TYPE_PWM_IRQ = 11, + N_IPU_INSYS_RESP_TYPE + }; + +@@ -201,7 +200,8 @@ enum ipu7_insys_mipi_dt_rename_mode { + enum ipu7_insys_output_link_dest { + IPU_INSYS_OUTPUT_LINK_DEST_MEM = 0, + IPU_INSYS_OUTPUT_LINK_DEST_PSYS = 1, +- IPU_INSYS_OUTPUT_LINK_DEST_IPU_EXTERNAL = 2 ++ IPU_INSYS_OUTPUT_LINK_DEST_IPU_EXTERNAL = 2, ++ N_IPU_INSYS_OUTPUT_LINK_DEST + }; + + enum ipu7_insys_dpcm_type { +@@ -220,9 +220,12 @@ enum ipu7_insys_dpcm_predictor { + + enum ipu7_insys_send_queue_token_flag { + IPU_INSYS_SEND_QUEUE_TOKEN_FLAG_NONE = 0, +- IPU_INSYS_SEND_QUEUE_TOKEN_FLAG_FLUSH_FORCE = 1 ++ IPU_INSYS_SEND_QUEUE_TOKEN_FLAG_FLUSH_FORCE = 1, ++ N_IPU_INSYS_SEND_QUEUE_TOKEN_FLAG + }; + ++#define IPU_INSYS_MIPI_FRAME_NUMBER_DONT_CARE UINT16_MAX ++ + #pragma pack(push, 1) + struct ipu7_insys_resolution { + u32 width; +@@ -312,7 +315,7 @@ struct ipu7_insys_resp { + u8 pin_id; + u8 frame_id; + u8 skip_frame; +- u8 pad[2]; ++ u16 mipi_fn; + }; + + struct ipu7_insys_resp_queue_token { +diff --git a/drivers/staging/media/ipu7/abi/ipu7_fw_msg_abi.h b/drivers/staging/media/ipu7/abi/ipu7_fw_msg_abi.h +index 311248385993..9d96ba675cf0 100644 +--- a/drivers/staging/media/ipu7/abi/ipu7_fw_msg_abi.h ++++ b/drivers/staging/media/ipu7/abi/ipu7_fw_msg_abi.h +@@ -217,7 +217,7 @@ struct ipu7_msg_task { + u8 frag_id; + u8 req_done_msg; + u8 req_done_irq; +- u8 reserved[1]; ++ u8 disable_save; + ipu7_msg_teb_t payload_reuse_bm; + ia_gofo_addr_t term_buffers[IPU_MSG_MAX_NODE_TERMS]; + }; +-- +2.43.0 + diff --git a/patch/v7.2.3/0005-staging-ipu7-Support-IPU8-PCI-ID.patch b/patch/v7.2.3/0005-staging-ipu7-Support-IPU8-PCI-ID.patch new file mode 100644 index 0000000..5422412 --- /dev/null +++ b/patch/v7.2.3/0005-staging-ipu7-Support-IPU8-PCI-ID.patch @@ -0,0 +1,24 @@ +From a9293142696d2742c8d69cd58d0f44b5c89a10ee Mon Sep 17 00:00:00 2001 +From: "Mishra, Saras" +Date: Mon, 21 Sep 2026 11:19:48 +0300 +Subject: [PATCH] staging: ipu7: Support IPU8 PCI ID + +--- + drivers/staging/media/ipu7/ipu7.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/staging/media/ipu7/ipu7.c b/drivers/staging/media/ipu7/ipu7.c +index 310e3f24e571..bf20e74ff6e9 100644 +--- a/drivers/staging/media/ipu7/ipu7.c ++++ b/drivers/staging/media/ipu7/ipu7.c +@@ -2745,6 +2745,7 @@ static const struct dev_pm_ops ipu7_pm_ops = { + static const struct pci_device_id ipu7_pci_tbl[] = { + {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IPU7_PCI_ID)}, + {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IPU7P5_PCI_ID)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, IPU8_PCI_ID)}, + {0,} + }; + MODULE_DEVICE_TABLE(pci, ipu7_pci_tbl); +-- +2.43.0 + diff --git a/patch/v7.2.3/0006-staging-ipu7-Add-IPU8-ABI-version-1.0.12.patch b/patch/v7.2.3/0006-staging-ipu7-Add-IPU8-ABI-version-1.0.12.patch new file mode 100644 index 0000000..6421789 --- /dev/null +++ b/patch/v7.2.3/0006-staging-ipu7-Add-IPU8-ABI-version-1.0.12.patch @@ -0,0 +1,271 @@ +From 0f8b181239a86b9a83b09e85115203e219c8ab31 Mon Sep 17 00:00:00 2001 +From: "Mishra, Saras" +Date: Mon, 21 Sep 2026 11:22:07 +0300 +Subject: [PATCH] staging: ipu7: Add IPU8 ABI version 1.0.12 (recreated for + ToT) + +--- + .../staging/media/ipu7/abi/ipu7_fw_boot_abi.h | 15 +++-- + .../staging/media/ipu7/abi/ipu7_fw_isys_abi.h | 60 +++++++++++++++++++ + drivers/staging/media/ipu7/ipu7-fw-isys.c | 29 +++++++++ + drivers/staging/media/ipu7/ipu7-isys-queue.c | 6 ++ + drivers/staging/media/ipu7/ipu7-isys-video.c | 17 ++++++ + 5 files changed, 122 insertions(+), 5 deletions(-) + +diff --git a/drivers/staging/media/ipu7/abi/ipu7_fw_boot_abi.h b/drivers/staging/media/ipu7/abi/ipu7_fw_boot_abi.h +index 82e14e59100b..0b2b18ec8ab4 100644 +--- a/drivers/staging/media/ipu7/abi/ipu7_fw_boot_abi.h ++++ b/drivers/staging/media/ipu7/abi/ipu7_fw_boot_abi.h +@@ -113,14 +113,19 @@ struct ia_gofo_secondary_boot_config { + #define IA_GOFO_DOUBLE_EXCEPTION_ERR 0xdead0806 + #define IA_GOFO_BIST_DMEM_FAULT_DETECTION_ERR 0xdead1000 + #define IA_GOFO_BIST_DATA_INTEGRITY_FAILURE 0xdead1010 ++#define IA_GOFO_BOOT_STATE_UNINIT 0x57a7e000 ++#define IA_GOFO_BOOT_STATE_STARTING_0 0x57a7d000 ++#define IA_GOFO_BOOT_STATE_CACHE_INIT_DONE 0x57a7d010 ++#define IA_GOFO_BOOT_STATE_MEM_INIT_DONE 0x57a7d020 ++#define IA_GOFO_BOOT_STATE_STACK_INIT_DONE 0x57a7d030 + + enum ia_gofo_boot_state { + IA_GOFO_FW_BOOT_STATE_SECONDARY_BOOT_CONFIG_READY = 0x57a7b000, +- IA_GOFO_FW_BOOT_STATE_UNINIT = 0x57a7e000, +- IA_GOFO_FW_BOOT_STATE_STARTING_0 = 0x57a7d000, +- IA_GOFO_FW_BOOT_STATE_CACHE_INIT_DONE = 0x57a7d010, +- IA_GOFO_FW_BOOT_STATE_MEM_INIT_DONE = 0x57a7d020, +- IA_GOFO_FW_BOOT_STATE_STACK_INIT_DONE = 0x57a7d030, ++ IA_GOFO_FW_BOOT_STATE_UNINIT = IA_GOFO_BOOT_STATE_UNINIT, ++ IA_GOFO_FW_BOOT_STATE_STARTING_0 = IA_GOFO_BOOT_STATE_STARTING_0, ++ IA_GOFO_FW_BOOT_STATE_CACHE_INIT_DONE = IA_GOFO_BOOT_STATE_CACHE_INIT_DONE, ++ IA_GOFO_FW_BOOT_STATE_MEM_INIT_DONE = IA_GOFO_BOOT_STATE_MEM_INIT_DONE, ++ IA_GOFO_FW_BOOT_STATE_STACK_INIT_DONE = IA_GOFO_BOOT_STATE_STACK_INIT_DONE, + IA_GOFO_FW_BOOT_STATE_EARLY_BOOT_DONE = 0x57a7d100, + IA_GOFO_FW_BOOT_STATE_BOOT_CONFIG_START = 0x57a7d200, + IA_GOFO_FW_BOOT_STATE_QUEUE_INIT_DONE = 0x57a7d300, +diff --git a/drivers/staging/media/ipu7/abi/ipu7_fw_isys_abi.h b/drivers/staging/media/ipu7/abi/ipu7_fw_isys_abi.h +index 7f622bfe9af6..f32674f081d2 100644 +--- a/drivers/staging/media/ipu7/abi/ipu7_fw_isys_abi.h ++++ b/drivers/staging/media/ipu7/abi/ipu7_fw_isys_abi.h +@@ -254,6 +254,10 @@ struct ipu7_insys_output_link { + struct ipu7_insys_output_cropping { + u16 line_top; + u16 line_bottom; ++#ifdef IPU8_INSYS_NEW_ABI ++ u16 column_left; ++ u16 column_right; ++#endif + }; + + struct ipu7_insys_output_dpcm { +@@ -263,16 +267,55 @@ struct ipu7_insys_output_dpcm { + u8 pad; + }; + ++#ifdef IPU8_INSYS_NEW_ABI ++enum ipu_insys_cfa_dim { ++ IPU_INSYS_CFA_DIM_2x2 = 0, ++ IPU_INSYS_CFA_DIM_4x4 = 1, ++ N_IPU_INSYS_CFA_DIM ++}; ++ ++#define IPU_INSYS_MAX_BINNING_FACTOR (4U) ++#define IPU_INSYS_UPIPE_MAX_OUTPUTS (2U) ++#define IPU_INSYS_UPIPE_MAX_UOB_FIFO_ALLOC (4U) ++#define IPU_INSYS_UPIPE_STREAM_CFG_BUF_SIZE (32U) ++#define IPU_INSYS_UPIPE_FRAME_CFG_BUF_SIZE (36U) ++ ++struct ipu7_insys_upipe_output_pin { ++ ia_gofo_addr_t opaque_pin_cfg; ++ u16 plane_offset_1; ++ u16 plane_offset_2; ++ u8 single_uob_fifo; ++ u8 shared_uob_fifo; ++ u8 pad[2]; ++}; ++ ++struct ipu7_insys_capture_output_pin_cfg { ++ struct ipu7_insys_capture_output_pin_payload pin_payload; ++ ia_gofo_addr_t upipe_capture_cfg; ++}; ++ ++#endif + struct ipu7_insys_output_pin { + struct ipu7_insys_output_link link; + struct ipu7_insys_output_cropping crop; + struct ipu7_insys_output_dpcm dpcm; ++#ifdef IPU8_INSYS_NEW_ABI ++ struct ipu7_insys_upipe_output_pin upipe_pin_cfg; ++#endif + u32 stride; + u16 ft; ++#ifdef IPU8_INSYS_NEW_ABI ++ u8 upipe_enable; ++#endif + u8 send_irq; + u8 input_pin_id; + u8 early_ack_en; ++#ifdef IPU8_INSYS_NEW_ABI ++ u8 cfa_dim; ++ u8 binning_factor; ++#else + u8 pad[3]; ++#endif + }; + + struct ipu7_insys_input_pin { +@@ -297,7 +340,11 @@ struct ipu7_insys_stream_cfg { + }; + + struct ipu7_insys_buffset { ++#ifdef IPU8_INSYS_NEW_ABI ++ struct ipu7_insys_capture_output_pin_cfg output_pins[4]; ++#else + struct ipu7_insys_capture_output_pin_payload output_pins[4]; ++#endif + u8 capture_msg_map; + u8 frame_id; + u8 skip_frame; +@@ -309,13 +356,18 @@ struct ipu7_insys_resp { + struct ipu7_insys_capture_output_pin_payload pin; + struct ia_gofo_msg_err error_info; + u32 timestamp[2]; ++#ifdef IPU8_INSYS_NEW_ABI ++ u16 mipi_fn; ++#endif + u8 type; + u8 msg_link_streaming_mode; + u8 stream_id; + u8 pin_id; + u8 frame_id; + u8 skip_frame; ++#ifndef IPU8_INSYS_NEW_ABI + u16 mipi_fn; ++#endif + }; + + struct ipu7_insys_resp_queue_token { +@@ -372,6 +424,14 @@ enum insys_msg_err_stream { + INSYS_MSG_ERR_STREAM_INSUFFICIENT_RESOURCES_OUTPUT = 36, + INSYS_MSG_ERR_STREAM_WIDTH_OUTPUT_SIZE = 37, + INSYS_MSG_ERR_STREAM_CLOSED = 38, ++#ifdef IPU8_INSYS_NEW_ABI ++ INSYS_MSG_ERR_STREAM_BINNING_FACTOR_NOT_SUPPORTED = 39, ++ INSYS_MSG_ERR_STREAM_CFA_DIM_NOT_SUPPORTED = 40, ++ INSYS_MSG_ERR_STREAM_INVALID_UPIPE_ENABLE = 41, ++ INSYS_MSG_ERR_STREAM_INVALID_UPIPE_UOB_SINGLE = 42, ++ INSYS_MSG_ERR_STREAM_INVALID_UPIPE_UOB_SHARED = 43, ++ INSYS_MSG_ERR_STREAM_INVALID_UPIPE_OPAQUE_PIN_CFG = 44, ++#endif + INSYS_MSG_ERR_STREAM_N + }; + +diff --git a/drivers/staging/media/ipu7/ipu7-fw-isys.c b/drivers/staging/media/ipu7/ipu7-fw-isys.c +index e4b9c364572b..c98326bd9fee 100644 +--- a/drivers/staging/media/ipu7/ipu7-fw-isys.c ++++ b/drivers/staging/media/ipu7/ipu7-fw-isys.c +@@ -268,6 +268,12 @@ void ipu7_fw_isys_dump_stream_cfg(struct device *dev, + cfg->output_pins[i].crop.line_top); + dev_dbg(dev, "\t.crop.line_bottom = %d\n", + cfg->output_pins[i].crop.line_bottom); ++#ifdef IPU8_INSYS_NEW_ABI ++ dev_dbg(dev, "\t.crop.column_left = %d\n", ++ cfg->output_pins[i].crop.column_left); ++ dev_dbg(dev, "\t.crop.colunm_right = %d\n", ++ cfg->output_pins[i].crop.column_right); ++#endif + + dev_dbg(dev, "\t.dpcm_enable = %d\n", + cfg->output_pins[i].dpcm.enable); +@@ -275,6 +281,20 @@ void ipu7_fw_isys_dump_stream_cfg(struct device *dev, + cfg->output_pins[i].dpcm.type); + dev_dbg(dev, "\t.dpcm.predictor = %d\n", + cfg->output_pins[i].dpcm.predictor); ++#ifdef IPU8_INSYS_NEW_ABI ++ dev_dbg(dev, "\t.upipe_enable = %d\n", ++ cfg->output_pins[i].upipe_enable); ++ dev_dbg(dev, "\t.upipe_pin_cfg.opaque_pin_cfg = %d\n", ++ cfg->output_pins[i].upipe_pin_cfg.opaque_pin_cfg); ++ dev_dbg(dev, "\t.upipe_pin_cfg.plane_offset_1 = %d\n", ++ cfg->output_pins[i].upipe_pin_cfg.plane_offset_1); ++ dev_dbg(dev, "\t.upipe_pin_cfg.plane_offset_2 = %d\n", ++ cfg->output_pins[i].upipe_pin_cfg.plane_offset_2); ++ dev_dbg(dev, "\t.upipe_pin_cfg.singel_uob_fifo = %d\n", ++ cfg->output_pins[i].upipe_pin_cfg.single_uob_fifo); ++ dev_dbg(dev, "\t.upipe_pin_cfg.shared_uob_fifo = %d\n", ++ cfg->output_pins[i].upipe_pin_cfg.shared_uob_fifo); ++#endif + } + dev_dbg(dev, "---------------------------\n"); + } +@@ -293,9 +313,18 @@ void ipu7_fw_isys_dump_frame_buff_set(struct device *dev, + + for (i = 0; i < outputs; i++) { + dev_dbg(dev, ".output_pin[%d]:\n", i); ++#ifndef IPU8_INSYS_NEW_ABI + dev_dbg(dev, "\t.user_token = %llx\n", + buf->output_pins[i].user_token); + dev_dbg(dev, "\t.addr = 0x%x\n", buf->output_pins[i].addr); ++#else ++ dev_dbg(dev, "\t.pin_payload.user_token = %llx\n", ++ buf->output_pins[i].pin_payload.user_token); ++ dev_dbg(dev, "\t.pin_payload.addr = 0x%x\n", ++ buf->output_pins[i].pin_payload.addr); ++ dev_dbg(dev, "\t.pin_payload.upipe_capture_cfg = 0x%x\n", ++ buf->output_pins[i].upipe_capture_cfg); ++#endif + } + dev_dbg(dev, "---------------------------\n"); + } +diff --git a/drivers/staging/media/ipu7/ipu7-isys-queue.c b/drivers/staging/media/ipu7/ipu7-isys-queue.c +index 434d9d9c7158..eed46243df43 100644 +--- a/drivers/staging/media/ipu7/ipu7-isys-queue.c ++++ b/drivers/staging/media/ipu7/ipu7-isys-queue.c +@@ -248,8 +248,14 @@ static void ipu7_isys_buf_to_fw_frame_buf_pin(struct vb2_buffer *vb, + struct ipu7_isys_video_buffer *ivb = + vb2_buffer_to_ipu7_isys_video_buffer(vvb); + ++#ifndef IPU8_INSYS_NEW_ABI + set->output_pins[aq->fw_output].addr = ivb->dma_addr; + set->output_pins[aq->fw_output].user_token = (uintptr_t)set; ++#else ++ set->output_pins[aq->fw_output].pin_payload.addr = ivb->dma_addr; ++ set->output_pins[aq->fw_output].pin_payload.user_token = (uintptr_t)set; ++ set->output_pins[aq->fw_output].upipe_capture_cfg = 0; ++#endif + } + + /* +diff --git a/drivers/staging/media/ipu7/ipu7-isys-video.c b/drivers/staging/media/ipu7/ipu7-isys-video.c +index 8c6730833f24..7d76d28871d6 100644 +--- a/drivers/staging/media/ipu7/ipu7-isys-video.c ++++ b/drivers/staging/media/ipu7/ipu7-isys-video.c +@@ -413,10 +413,27 @@ static int ipu7_isys_fw_pin_cfg(struct ipu7_isys_video *av, + /* output pin crop */ + output_pin->crop.line_top = 0; + output_pin->crop.line_bottom = 0; ++#ifdef IPU8_INSYS_NEW_ABI ++ output_pin->crop.column_left = 0; ++ output_pin->crop.column_right = 0; ++#endif + + /* output de-compression */ + output_pin->dpcm.enable = 0; + ++#ifdef IPU8_INSYS_NEW_ABI ++ /* upipe_cfg */ ++ output_pin->upipe_pin_cfg.opaque_pin_cfg = 0; ++ output_pin->upipe_pin_cfg.plane_offset_1 = 0; ++ output_pin->upipe_pin_cfg.plane_offset_2 = 0; ++ output_pin->upipe_pin_cfg.single_uob_fifo = 0; ++ output_pin->upipe_pin_cfg.shared_uob_fifo = 0; ++ output_pin->upipe_enable = 0; ++ output_pin->binning_factor = 0; ++ /* stupid setting, even unused, SW still need to set a valid value */ ++ output_pin->cfa_dim = IPU_INSYS_CFA_DIM_2x2; ++#endif ++ + /* frame format type */ + pfmt = ipu7_isys_get_isys_format(av->pix_fmt.pixelformat); + output_pin->ft = (u16)pfmt->css_pixelformat; +-- +2.43.0 + diff --git a/patch/v7.2.3/0007-staging-ipu7-Define-gpreg_stride-for-different-IPU-v.patch b/patch/v7.2.3/0007-staging-ipu7-Define-gpreg_stride-for-different-IPU-v.patch new file mode 100644 index 0000000..c5789b5 --- /dev/null +++ b/patch/v7.2.3/0007-staging-ipu7-Define-gpreg_stride-for-different-IPU-v.patch @@ -0,0 +1,78 @@ +From f023cf969531c2adab8371be7afa736a8b1c8abc Mon Sep 17 00:00:00 2001 +From: "Mishra, Saras" +Date: Mon, 21 Sep 2026 11:22:18 +0300 +Subject: [PATCH] staging: ipu7: Define gpreg_stride for different IPU versions + +--- + drivers/staging/media/ipu7/ipu7-isys-csi-phy.c | 6 ++++-- + drivers/staging/media/ipu7/ipu7.c | 3 +++ + drivers/staging/media/ipu7/ipu7.h | 1 + + 3 files changed, 8 insertions(+), 2 deletions(-) + +diff --git a/drivers/staging/media/ipu7/ipu7-isys-csi-phy.c b/drivers/staging/media/ipu7/ipu7-isys-csi-phy.c +index 3f15af3b4c79..0886a78def6e 100644 +--- a/drivers/staging/media/ipu7/ipu7-isys-csi-phy.c ++++ b/drivers/staging/media/ipu7/ipu7-isys-csi-phy.c +@@ -168,7 +168,8 @@ static void gpreg_write(struct ipu7_isys *isys, u32 id, u32 addr, u32 data) + { + void __iomem *isys_base = isys->pdata->base; + u32 gpreg = isys->pdata->ipdata->csi2.gpreg; +- void __iomem *base = isys_base + gpreg + 0x1000 * id; ++ void __iomem *base = isys_base + gpreg + ++ isys->pdata->ipdata->csi2.gpreg_stride * id; + struct device *dev = &isys->adev->auxdev.dev; + + dev_dbg(dev, "gpreg write: reg 0x%zx = data 0x%08x", +@@ -345,7 +346,8 @@ static int ipu7_isys_phy_ready(struct ipu7_isys *isys, u32 id) + { + void __iomem *isys_base = isys->pdata->base; + u32 gpreg_offset = isys->pdata->ipdata->csi2.gpreg; +- void __iomem *gpreg = isys_base + gpreg_offset + 0x1000 * id; ++ void __iomem *gpreg = isys_base + gpreg_offset + ++ isys->pdata->ipdata->csi2.gpreg_stride * id; + struct device *dev = &isys->adev->auxdev.dev; + unsigned int i; + u32 phy_ready; +diff --git a/drivers/staging/media/ipu7/ipu7.c b/drivers/staging/media/ipu7/ipu7.c +index bf20e74ff6e9..0f8ac2b6e436 100644 +--- a/drivers/staging/media/ipu7/ipu7.c ++++ b/drivers/staging/media/ipu7/ipu7.c +@@ -49,6 +49,7 @@ static const unsigned int ipu7_csi_offsets[] = { + static struct ipu_isys_internal_pdata ipu7p5_isys_ipdata = { + .csi2 = { + .gpreg = IS_IO_CSI2_GPREGS_BASE, ++ .gpreg_stride = 0x1000, + }, + .hw_variant = { + .offset = IPU_UNIFIED_OFFSET, +@@ -789,6 +790,7 @@ static struct ipu_psys_internal_pdata ipu7p5_psys_ipdata = { + static struct ipu_isys_internal_pdata ipu7_isys_ipdata = { + .csi2 = { + .gpreg = IS_IO_CSI2_GPREGS_BASE, ++ .gpreg_stride = 0x1000, + }, + .hw_variant = { + .offset = IPU_UNIFIED_OFFSET, +@@ -1306,6 +1308,7 @@ static struct ipu_psys_internal_pdata ipu7_psys_ipdata = { + static struct ipu_isys_internal_pdata ipu8_isys_ipdata = { + .csi2 = { + .gpreg = IPU8_IS_IO_CSI2_GPREGS_BASE, ++ .gpreg_stride = 0x2000, + }, + .hw_variant = { + .offset = IPU_UNIFIED_OFFSET, +diff --git a/drivers/staging/media/ipu7/ipu7.h b/drivers/staging/media/ipu7/ipu7.h +index ac8ac0689468..29e55e2fbaa2 100644 +--- a/drivers/staging/media/ipu7/ipu7.h ++++ b/drivers/staging/media/ipu7/ipu7.h +@@ -201,6 +201,7 @@ struct ipu7_isys_internal_csi2_pdata { + u32 nports; + u32 const *offsets; + u32 gpreg; ++ u32 gpreg_stride; + }; + + struct ipu7_hw_variants { +-- +2.43.0 + diff --git a/patch/v7.2.3/0008-staging-ipu7-Add-IPU8-ABI-version-1.0.14-and-select-.patch b/patch/v7.2.3/0008-staging-ipu7-Add-IPU8-ABI-version-1.0.14-and-select-.patch new file mode 100644 index 0000000..a482363 --- /dev/null +++ b/patch/v7.2.3/0008-staging-ipu7-Add-IPU8-ABI-version-1.0.14-and-select-.patch @@ -0,0 +1,535 @@ +From 2d15665cd91be58beebdff23b08fbcb51c88f7b3 Mon Sep 17 00:00:00 2001 +From: "Mishra, Saras" +Date: Fri, 25 Sep 2026 08:50:47 +0300 +Subject: [PATCH] staging: ipu7: Add IPU8 ABI version 1.0.14 and select it at + runtime + +--- + .../staging/media/ipu7/abi/ipu7_fw_isys_abi.h | 82 ++++++--- + drivers/staging/media/ipu7/ipu7-fw-isys.c | 155 ++++++++++++++++-- + drivers/staging/media/ipu7/ipu7-isys-queue.c | 10 +- + drivers/staging/media/ipu7/ipu7-isys-video.c | 32 ++-- + drivers/staging/media/ipu7/ipu7-isys.h | 9 + + 5 files changed, 225 insertions(+), 63 deletions(-) + +diff --git a/drivers/staging/media/ipu7/abi/ipu7_fw_isys_abi.h b/drivers/staging/media/ipu7/abi/ipu7_fw_isys_abi.h +index f32674f081d2..5d1e23a9403b 100644 +--- a/drivers/staging/media/ipu7/abi/ipu7_fw_isys_abi.h ++++ b/drivers/staging/media/ipu7/abi/ipu7_fw_isys_abi.h +@@ -125,6 +125,15 @@ enum ipu7_insys_frame_format_type { + IPU_INSYS_FRAME_FORMAT_ARGB888 = 31, + IPU_INSYS_FRAME_FORMAT_BGRA888 = 32, + IPU_INSYS_FRAME_FORMAT_ABGR888 = 33, ++ IPU_INSYS_FRAME_FORMAT_RGB888 = 34, ++ IPU_INSYS_FRAME_FORMAT_YUV420_LEGACY = 35, ++ IPU_INSYS_FRAME_FORMAT_RAW6 = 36, ++ IPU_INSYS_FRAME_FORMAT_RAW7 = 37, ++ IPU_INSYS_FRAME_FORMAT_RGB444 = 38, ++ IPU_INSYS_FRAME_FORMAT_RGB666 = 39, ++ IPU_INSYS_FRAME_FORMAT_RAW20 = 40, ++ IPU_INSYS_FRAME_FORMAT_P010 = 41, ++ IPU_INSYS_FRAME_FORMAT_RGB555 = 42, + N_IPU_INSYS_FRAME_FORMAT + }; + +@@ -251,13 +260,16 @@ struct ipu7_insys_output_link { + u8 pad[2]; + }; + ++struct ipu7_insys_output_cropping_v1 { ++ u16 line_top; ++ u16 line_bottom; ++}; ++ + struct ipu7_insys_output_cropping { + u16 line_top; + u16 line_bottom; +-#ifdef IPU8_INSYS_NEW_ABI + u16 column_left; + u16 column_right; +-#endif + }; + + struct ipu7_insys_output_dpcm { +@@ -267,7 +279,6 @@ struct ipu7_insys_output_dpcm { + u8 pad; + }; + +-#ifdef IPU8_INSYS_NEW_ABI + enum ipu_insys_cfa_dim { + IPU_INSYS_CFA_DIM_2x2 = 0, + IPU_INSYS_CFA_DIM_4x4 = 1, +@@ -294,28 +305,31 @@ struct ipu7_insys_capture_output_pin_cfg { + ia_gofo_addr_t upipe_capture_cfg; + }; + +-#endif ++struct ipu7_insys_output_pin_v1 { ++ struct ipu7_insys_output_link link; ++ struct ipu7_insys_output_cropping_v1 crop; ++ struct ipu7_insys_output_dpcm dpcm; ++ u32 stride; ++ u16 ft; ++ u8 send_irq; ++ u8 input_pin_id; ++ u8 early_ack_en; ++ u8 pad[3]; ++}; ++ + struct ipu7_insys_output_pin { + struct ipu7_insys_output_link link; + struct ipu7_insys_output_cropping crop; + struct ipu7_insys_output_dpcm dpcm; +-#ifdef IPU8_INSYS_NEW_ABI + struct ipu7_insys_upipe_output_pin upipe_pin_cfg; +-#endif + u32 stride; + u16 ft; +-#ifdef IPU8_INSYS_NEW_ABI + u8 upipe_enable; +-#endif + u8 send_irq; + u8 input_pin_id; + u8 early_ack_en; +-#ifdef IPU8_INSYS_NEW_ABI + u8 cfa_dim; + u8 binning_factor; +-#else +- u8 pad[3]; +-#endif + }; + + struct ipu7_insys_input_pin { +@@ -328,6 +342,17 @@ struct ipu7_insys_input_pin { + u8 pad[2]; + }; + ++struct ipu7_insys_stream_cfg_v1 { ++ struct ipu7_insys_input_pin input_pins[4]; ++ struct ipu7_insys_output_pin_v1 output_pins[4]; ++ u16 stream_msg_map; ++ u8 port_id; ++ u8 vc; ++ u8 nof_input_pins; ++ u8 nof_output_pins; ++ u8 pad[2]; ++}; ++ + struct ipu7_insys_stream_cfg { + struct ipu7_insys_input_pin input_pins[4]; + struct ipu7_insys_output_pin output_pins[4]; +@@ -339,35 +364,48 @@ struct ipu7_insys_stream_cfg { + u8 pad[2]; + }; + ++struct ipu7_insys_buffset_v1 { ++ struct ipu7_insys_capture_output_pin_payload output_pins[4]; ++ u8 capture_msg_map; ++ u8 frame_id; ++ u8 skip_frame; ++ u8 pad[5]; ++}; ++ + struct ipu7_insys_buffset { +-#ifdef IPU8_INSYS_NEW_ABI + struct ipu7_insys_capture_output_pin_cfg output_pins[4]; +-#else +- struct ipu7_insys_capture_output_pin_payload output_pins[4]; +-#endif + u8 capture_msg_map; + u8 frame_id; + u8 skip_frame; + u8 pad[5]; + }; + +-struct ipu7_insys_resp { ++struct ipu7_insys_resp_v1 { + u64 buf_id; + struct ipu7_insys_capture_output_pin_payload pin; + struct ia_gofo_msg_err error_info; + u32 timestamp[2]; +-#ifdef IPU8_INSYS_NEW_ABI ++ u8 type; ++ u8 msg_link_streaming_mode; ++ u8 stream_id; ++ u8 pin_id; ++ u8 frame_id; ++ u8 skip_frame; + u16 mipi_fn; +-#endif ++}; ++ ++struct ipu7_insys_resp { ++ u64 buf_id; ++ struct ipu7_insys_capture_output_pin_payload pin; ++ struct ia_gofo_msg_err error_info; ++ u32 timestamp[2]; + u8 type; + u8 msg_link_streaming_mode; + u8 stream_id; + u8 pin_id; + u8 frame_id; + u8 skip_frame; +-#ifndef IPU8_INSYS_NEW_ABI + u16 mipi_fn; +-#endif + }; + + struct ipu7_insys_resp_queue_token { +@@ -424,14 +462,12 @@ enum insys_msg_err_stream { + INSYS_MSG_ERR_STREAM_INSUFFICIENT_RESOURCES_OUTPUT = 36, + INSYS_MSG_ERR_STREAM_WIDTH_OUTPUT_SIZE = 37, + INSYS_MSG_ERR_STREAM_CLOSED = 38, +-#ifdef IPU8_INSYS_NEW_ABI + INSYS_MSG_ERR_STREAM_BINNING_FACTOR_NOT_SUPPORTED = 39, + INSYS_MSG_ERR_STREAM_CFA_DIM_NOT_SUPPORTED = 40, + INSYS_MSG_ERR_STREAM_INVALID_UPIPE_ENABLE = 41, + INSYS_MSG_ERR_STREAM_INVALID_UPIPE_UOB_SINGLE = 42, + INSYS_MSG_ERR_STREAM_INVALID_UPIPE_UOB_SHARED = 43, + INSYS_MSG_ERR_STREAM_INVALID_UPIPE_OPAQUE_PIN_CFG = 44, +-#endif + INSYS_MSG_ERR_STREAM_N + }; + +diff --git a/drivers/staging/media/ipu7/ipu7-fw-isys.c b/drivers/staging/media/ipu7/ipu7-fw-isys.c +index c98326bd9fee..841bfc36f4f7 100644 +--- a/drivers/staging/media/ipu7/ipu7-fw-isys.c ++++ b/drivers/staging/media/ipu7/ipu7-fw-isys.c +@@ -31,6 +31,119 @@ static const char * const send_msg_types[N_IPU_INSYS_SEND_TYPE] = { + "STREAM_CLOSE" + }; + ++static void isys_stream_cfg_to_v1(struct ipu7_insys_stream_cfg_v1 *dst, ++ const struct ipu7_insys_stream_cfg *src) ++{ ++ unsigned int i; ++ ++ memset(dst, 0, sizeof(*dst)); ++ memcpy(dst->input_pins, src->input_pins, sizeof(dst->input_pins)); ++ dst->stream_msg_map = src->stream_msg_map; ++ dst->port_id = src->port_id; ++ dst->vc = src->vc; ++ dst->nof_input_pins = src->nof_input_pins; ++ dst->nof_output_pins = src->nof_output_pins; ++ ++ for (i = 0; i < ARRAY_SIZE(dst->output_pins); i++) { ++ dst->output_pins[i].link = src->output_pins[i].link; ++ dst->output_pins[i].crop.line_top = ++ src->output_pins[i].crop.line_top; ++ dst->output_pins[i].crop.line_bottom = ++ src->output_pins[i].crop.line_bottom; ++ dst->output_pins[i].dpcm = src->output_pins[i].dpcm; ++ dst->output_pins[i].stride = src->output_pins[i].stride; ++ dst->output_pins[i].ft = src->output_pins[i].ft; ++ dst->output_pins[i].send_irq = src->output_pins[i].send_irq; ++ dst->output_pins[i].input_pin_id = ++ src->output_pins[i].input_pin_id; ++ dst->output_pins[i].early_ack_en = ++ src->output_pins[i].early_ack_en; ++ } ++} ++ ++static void isys_buffset_to_v1(struct ipu7_insys_buffset_v1 *dst, ++ const struct ipu7_insys_buffset *src) ++{ ++ unsigned int i; ++ ++ memset(dst, 0, sizeof(*dst)); ++ for (i = 0; i < ARRAY_SIZE(dst->output_pins); i++) ++ dst->output_pins[i] = src->output_pins[i].pin_payload; ++ ++ dst->capture_msg_map = src->capture_msg_map; ++ dst->frame_id = src->frame_id; ++ dst->skip_frame = src->skip_frame; ++} ++ ++static size_t isys_prepare_fw_payload_v1(void *cpu_mapped_buf, ++ u16 send_type, size_t size) ++{ ++ if (!cpu_mapped_buf) ++ return 0; ++ ++ switch (send_type) { ++ case IPU_INSYS_SEND_TYPE_STREAM_OPEN: { ++ struct ipu7_insys_stream_cfg cfg; ++ ++ memcpy(&cfg, cpu_mapped_buf, sizeof(cfg)); ++ isys_stream_cfg_to_v1(cpu_mapped_buf, &cfg); ++ return sizeof(struct ipu7_insys_stream_cfg_v1); ++ } ++ case IPU_INSYS_SEND_TYPE_STREAM_START_AND_CAPTURE: ++ case IPU_INSYS_SEND_TYPE_STREAM_CAPTURE: { ++ struct ipu7_insys_buffset set; ++ ++ memcpy(&set, cpu_mapped_buf, sizeof(set)); ++ isys_buffset_to_v1(cpu_mapped_buf, &set); ++ return sizeof(struct ipu7_insys_buffset_v1); ++ } ++ default: ++ return size; ++ } ++} ++ ++static size_t isys_prepare_fw_payload(void *cpu_mapped_buf, ++ u16 send_type, size_t size) ++{ ++ if (!cpu_mapped_buf) ++ return 0; ++ ++ switch (send_type) { ++ case IPU_INSYS_SEND_TYPE_STREAM_OPEN: ++ return sizeof(struct ipu7_insys_stream_cfg); ++ case IPU_INSYS_SEND_TYPE_STREAM_START_AND_CAPTURE: ++ case IPU_INSYS_SEND_TYPE_STREAM_CAPTURE: ++ return sizeof(struct ipu7_insys_buffset); ++ default: ++ return size; ++ } ++} ++ ++static __maybe_unused void isys_decode_resp_v1(struct ipu7_insys_resp *dst, ++ const void *token) ++{ ++ const struct ipu7_insys_resp_v1 *src = token; ++ ++ memset(dst, 0, sizeof(*dst)); ++ dst->buf_id = src->buf_id; ++ dst->pin = src->pin; ++ dst->error_info = src->error_info; ++ dst->timestamp[0] = src->timestamp[0]; ++ dst->timestamp[1] = src->timestamp[1]; ++ dst->type = src->type; ++ dst->msg_link_streaming_mode = src->msg_link_streaming_mode; ++ dst->stream_id = src->stream_id; ++ dst->pin_id = src->pin_id; ++ dst->frame_id = src->frame_id; ++ dst->skip_frame = src->skip_frame; ++ dst->mipi_fn = src->mipi_fn; ++} ++ ++static void isys_decode_resp(struct ipu7_insys_resp *dst, const void *token) ++{ ++ memcpy(dst, token, sizeof(*dst)); ++} ++ + int ipu7_fw_isys_complex_cmd(struct ipu7_isys *isys, + const unsigned int stream_handle, + void *cpu_mapped_buf, +@@ -50,8 +163,11 @@ int ipu7_fw_isys_complex_cmd(struct ipu7_isys *isys, + * Time to flush cache in case we have some payload. Not all messages + * have that + */ +- if (cpu_mapped_buf) ++ if (cpu_mapped_buf) { ++ size = isys->abi_ops.prepare_payload(cpu_mapped_buf, ++ send_type, size); + clflush_cache_range(cpu_mapped_buf, size); ++ } + + token = ipu7_syscom_get_token(ctx, stream_handle + + IPU_INSYS_INPUT_MSG_QUEUE); +@@ -97,6 +213,14 @@ int ipu7_fw_isys_init(struct ipu7_isys *isys) + if (!syscom) + return -ENOMEM; + ++ if (is_ipu8(adev->isp->hw_ver)) ++ isys->abi_ops.prepare_payload = isys_prepare_fw_payload; ++ else ++ isys->abi_ops.prepare_payload = isys_prepare_fw_payload_v1; ++ ++ isys->abi_ops.decode_resp = isys_decode_resp; ++ isys->abi_ops.resp_queue_token_size = sizeof(struct ipu7_insys_resp); ++ + adev->syscom = syscom; + syscom->num_input_queues = IPU_INSYS_MAX_INPUT_QUEUES; + syscom->num_output_queues = IPU_INSYS_MAX_OUTPUT_QUEUES; +@@ -111,11 +235,11 @@ int ipu7_fw_isys_init(struct ipu7_isys *isys) + queue_configs[IPU_INSYS_OUTPUT_MSG_QUEUE].max_capacity = + IPU_ISYS_SIZE_RECV_QUEUE; + queue_configs[IPU_INSYS_OUTPUT_MSG_QUEUE].token_size_in_bytes = +- sizeof(struct ipu7_insys_resp); ++ isys->abi_ops.resp_queue_token_size; + queue_configs[IPU_INSYS_OUTPUT_LOG_QUEUE].max_capacity = + IPU_ISYS_SIZE_LOG_QUEUE; + queue_configs[IPU_INSYS_OUTPUT_LOG_QUEUE].token_size_in_bytes = +- sizeof(struct ipu7_insys_resp); ++ isys->abi_ops.resp_queue_token_size; + queue_configs[IPU_INSYS_OUTPUT_RESERVED_QUEUE].max_capacity = 0; + queue_configs[IPU_INSYS_OUTPUT_RESERVED_QUEUE].token_size_in_bytes = 0; + +@@ -195,9 +319,15 @@ int ipu7_fw_isys_close(struct ipu7_isys *isys) + + struct ipu7_insys_resp *ipu7_fw_isys_get_resp(struct ipu7_isys *isys) + { +- return (struct ipu7_insys_resp *) +- ipu7_syscom_get_token(isys->adev->syscom, +- IPU_INSYS_OUTPUT_MSG_QUEUE); ++ void *token = ipu7_syscom_get_token(isys->adev->syscom, ++ IPU_INSYS_OUTPUT_MSG_QUEUE); ++ ++ if (!token) ++ return NULL; ++ ++ isys->abi_ops.decode_resp(&isys->resp, token); ++ ++ return &isys->resp; + } + + void ipu7_fw_isys_put_resp(struct ipu7_isys *isys) +@@ -268,20 +398,16 @@ void ipu7_fw_isys_dump_stream_cfg(struct device *dev, + cfg->output_pins[i].crop.line_top); + dev_dbg(dev, "\t.crop.line_bottom = %d\n", + cfg->output_pins[i].crop.line_bottom); +-#ifdef IPU8_INSYS_NEW_ABI + dev_dbg(dev, "\t.crop.column_left = %d\n", + cfg->output_pins[i].crop.column_left); +- dev_dbg(dev, "\t.crop.colunm_right = %d\n", ++ dev_dbg(dev, "\t.crop.column_right = %d\n", + cfg->output_pins[i].crop.column_right); +-#endif +- + dev_dbg(dev, "\t.dpcm_enable = %d\n", + cfg->output_pins[i].dpcm.enable); + dev_dbg(dev, "\t.dpcm.type = %d\n", + cfg->output_pins[i].dpcm.type); + dev_dbg(dev, "\t.dpcm.predictor = %d\n", + cfg->output_pins[i].dpcm.predictor); +-#ifdef IPU8_INSYS_NEW_ABI + dev_dbg(dev, "\t.upipe_enable = %d\n", + cfg->output_pins[i].upipe_enable); + dev_dbg(dev, "\t.upipe_pin_cfg.opaque_pin_cfg = %d\n", +@@ -294,7 +420,6 @@ void ipu7_fw_isys_dump_stream_cfg(struct device *dev, + cfg->output_pins[i].upipe_pin_cfg.single_uob_fifo); + dev_dbg(dev, "\t.upipe_pin_cfg.shared_uob_fifo = %d\n", + cfg->output_pins[i].upipe_pin_cfg.shared_uob_fifo); +-#endif + } + dev_dbg(dev, "---------------------------\n"); + } +@@ -313,18 +438,12 @@ void ipu7_fw_isys_dump_frame_buff_set(struct device *dev, + + for (i = 0; i < outputs; i++) { + dev_dbg(dev, ".output_pin[%d]:\n", i); +-#ifndef IPU8_INSYS_NEW_ABI +- dev_dbg(dev, "\t.user_token = %llx\n", +- buf->output_pins[i].user_token); +- dev_dbg(dev, "\t.addr = 0x%x\n", buf->output_pins[i].addr); +-#else + dev_dbg(dev, "\t.pin_payload.user_token = %llx\n", + buf->output_pins[i].pin_payload.user_token); + dev_dbg(dev, "\t.pin_payload.addr = 0x%x\n", + buf->output_pins[i].pin_payload.addr); + dev_dbg(dev, "\t.pin_payload.upipe_capture_cfg = 0x%x\n", + buf->output_pins[i].upipe_capture_cfg); +-#endif + } + dev_dbg(dev, "---------------------------\n"); + } +diff --git a/drivers/staging/media/ipu7/ipu7-isys-queue.c b/drivers/staging/media/ipu7/ipu7-isys-queue.c +index eed46243df43..c319d1e5d937 100644 +--- a/drivers/staging/media/ipu7/ipu7-isys-queue.c ++++ b/drivers/staging/media/ipu7/ipu7-isys-queue.c +@@ -19,6 +19,7 @@ + + #include "abi/ipu7_fw_isys_abi.h" + ++#include "ipu7.h" + #include "ipu7-bus.h" + #include "ipu7-dma.h" + #include "ipu7-fw-isys.h" +@@ -247,15 +248,12 @@ static void ipu7_isys_buf_to_fw_frame_buf_pin(struct vb2_buffer *vb, + struct vb2_v4l2_buffer *vvb = to_vb2_v4l2_buffer(vb); + struct ipu7_isys_video_buffer *ivb = + vb2_buffer_to_ipu7_isys_video_buffer(vvb); ++ struct ipu7_isys_video *av = ipu7_isys_queue_to_video(aq); + +-#ifndef IPU8_INSYS_NEW_ABI +- set->output_pins[aq->fw_output].addr = ivb->dma_addr; +- set->output_pins[aq->fw_output].user_token = (uintptr_t)set; +-#else + set->output_pins[aq->fw_output].pin_payload.addr = ivb->dma_addr; + set->output_pins[aq->fw_output].pin_payload.user_token = (uintptr_t)set; +- set->output_pins[aq->fw_output].upipe_capture_cfg = 0; +-#endif ++ if (is_ipu8(av->isys->adev->isp->hw_ver)) ++ set->output_pins[aq->fw_output].upipe_capture_cfg = 0; + } + + /* +diff --git a/drivers/staging/media/ipu7/ipu7-isys-video.c b/drivers/staging/media/ipu7/ipu7-isys-video.c +index 7d76d28871d6..538e9538bf31 100644 +--- a/drivers/staging/media/ipu7/ipu7-isys-video.c ++++ b/drivers/staging/media/ipu7/ipu7-isys-video.c +@@ -413,26 +413,26 @@ static int ipu7_isys_fw_pin_cfg(struct ipu7_isys_video *av, + /* output pin crop */ + output_pin->crop.line_top = 0; + output_pin->crop.line_bottom = 0; +-#ifdef IPU8_INSYS_NEW_ABI +- output_pin->crop.column_left = 0; +- output_pin->crop.column_right = 0; +-#endif ++ if (is_ipu8(isys->adev->isp->hw_ver)) { ++ output_pin->crop.column_left = 0; ++ output_pin->crop.column_right = 0; ++ } + + /* output de-compression */ + output_pin->dpcm.enable = 0; + +-#ifdef IPU8_INSYS_NEW_ABI +- /* upipe_cfg */ +- output_pin->upipe_pin_cfg.opaque_pin_cfg = 0; +- output_pin->upipe_pin_cfg.plane_offset_1 = 0; +- output_pin->upipe_pin_cfg.plane_offset_2 = 0; +- output_pin->upipe_pin_cfg.single_uob_fifo = 0; +- output_pin->upipe_pin_cfg.shared_uob_fifo = 0; +- output_pin->upipe_enable = 0; +- output_pin->binning_factor = 0; +- /* stupid setting, even unused, SW still need to set a valid value */ +- output_pin->cfa_dim = IPU_INSYS_CFA_DIM_2x2; +-#endif ++ if (is_ipu8(isys->adev->isp->hw_ver)) { ++ /* upipe_cfg */ ++ output_pin->upipe_pin_cfg.opaque_pin_cfg = 0; ++ output_pin->upipe_pin_cfg.plane_offset_1 = 0; ++ output_pin->upipe_pin_cfg.plane_offset_2 = 0; ++ output_pin->upipe_pin_cfg.single_uob_fifo = 0; ++ output_pin->upipe_pin_cfg.shared_uob_fifo = 0; ++ output_pin->upipe_enable = 0; ++ output_pin->binning_factor = 0; ++ /* even unused, SW still needs to set a valid value */ ++ output_pin->cfa_dim = IPU_INSYS_CFA_DIM_2x2; ++ } + + /* frame format type */ + pfmt = ipu7_isys_get_isys_format(av->pix_fmt.pixelformat); +diff --git a/drivers/staging/media/ipu7/ipu7-isys.h b/drivers/staging/media/ipu7/ipu7-isys.h +index ef1ab1b42f6c..0559aa133c5e 100644 +--- a/drivers/staging/media/ipu7/ipu7-isys.h ++++ b/drivers/staging/media/ipu7/ipu7-isys.h +@@ -55,6 +55,13 @@ struct isys_fw_log { + u32 size; /* actual size of log content, in bits */ + }; + ++struct ipu7_isys_abi_ops { ++ size_t (*prepare_payload)(void *cpu_mapped_buf, u16 send_type, ++ size_t size); ++ void (*decode_resp)(struct ipu7_insys_resp *dst, const void *token); ++ size_t resp_queue_token_size; ++}; ++ + /* + * struct ipu7_isys + * +@@ -106,6 +113,8 @@ struct ipu7_isys { + struct list_head framebuflist; + struct list_head framebuflist_fw; + struct v4l2_async_notifier notifier; ++ struct ipu7_isys_abi_ops abi_ops; ++ struct ipu7_insys_resp resp; + + struct ipu7_insys_config *subsys_config; + dma_addr_t subsys_config_dma_addr; +-- +2.43.0 +