Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
From 90cbd8c0f39a2f9863c6b2b3bacc1d44fc2356bf Mon Sep 17 00:00:00 2001
From: linya14x <linx.yang@intel.com>
Date: Fri, 24 Oct 2025 12:44:25 +0800
Subject: [PATCH 1/7] staging: ipu7: Use DPHY as the default PHY mode

Signed-off-by: Bingbu Cao <bingbu.cao@intel.com>
---
drivers/staging/media/ipu7/ipu7-isys.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/media/ipu7/ipu7-isys.c b/drivers/staging/media/ipu7/ipu7-isys.c
index cb2f49f3e0fa..dd481f9d848d 100644
--- a/drivers/staging/media/ipu7/ipu7-isys.c
+++ b/drivers/staging/media/ipu7/ipu7-isys.c
@@ -81,10 +81,10 @@ isys_complete_ext_device_registration(struct ipu7_isys *isys,
}

isys->csi2[csi2->port].nlanes = csi2->nlanes;
- if (csi2->bus_type == V4L2_MBUS_CSI2_DPHY)
- isys->csi2[csi2->port].phy_mode = PHY_MODE_DPHY;
- else
+ if (csi2->bus_type == V4L2_MBUS_CSI2_CPHY)
isys->csi2[csi2->port].phy_mode = PHY_MODE_CPHY;
+ else
+ isys->csi2[csi2->port].phy_mode = PHY_MODE_DPHY;

return 0;

--
2.43.0

270 changes: 270 additions & 0 deletions patch/v7.0.0/0002-staging-ipu7-Add-IPU7-debugfs.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,270 @@
From 394a1a7002677bcbbe8f3e1f053a65d001040cc9 Mon Sep 17 00:00:00 2001
From: linya14x <linx.yang@intel.com>
Date: Mon, 20 Oct 2025 12:36:12 +0800
Subject: [PATCH 2/7] staging: ipu7: Add IPU7 debugfs

Signed-off-by: Hao Yao <hao.yao@intel.com>
---
drivers/staging/media/ipu7/ipu7-isys.c | 84 ++++++++++++++++++++++++++
drivers/staging/media/ipu7/ipu7-isys.h | 7 +++
drivers/staging/media/ipu7/ipu7.c | 60 ++++++++++++++++++
drivers/staging/media/ipu7/ipu7.h | 3 +
4 files changed, 154 insertions(+)

diff --git a/drivers/staging/media/ipu7/ipu7-isys.c b/drivers/staging/media/ipu7/ipu7-isys.c
index dd481f9d848d..b81ba4e7f786 100644
--- a/drivers/staging/media/ipu7/ipu7-isys.c
+++ b/drivers/staging/media/ipu7/ipu7-isys.c
@@ -9,6 +9,9 @@
#include <linux/bug.h>
#include <linux/completion.h>
#include <linux/container_of.h>
+#ifdef CONFIG_DEBUG_FS
+#include <linux/debugfs.h>
+#endif
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/dma-mapping.h>
@@ -576,6 +579,10 @@ static void isys_remove(struct auxiliary_device *auxdev)
struct isys_fw_msgs *fwmsg, *safe;
struct ipu7_bus_device *adev = auxdev_to_adev(auxdev);

+#ifdef CONFIG_DEBUG_FS
+ if (adev->isp->ipu7_dir)
+ debugfs_remove_recursive(isys->debugfsdir);
+#endif
for (int i = 0; i < IPU_ISYS_MAX_STREAMS; i++)
mutex_destroy(&isys->streams[i].mutex);

@@ -596,6 +603,78 @@ static void isys_remove(struct auxiliary_device *auxdev)
mutex_destroy(&isys->mutex);
}

+#ifdef CONFIG_DEBUG_FS
+static ssize_t fwlog_read(struct file *file, char __user *userbuf, size_t size,
+ loff_t *pos)
+{
+ struct ipu7_isys *isys = file->private_data;
+ struct isys_fw_log *fw_log = isys->fw_log;
+ struct device *dev = &isys->adev->auxdev.dev;
+ u32 log_size;
+ int ret = 0;
+ void *buf;
+
+ if (!fw_log)
+ return 0;
+
+ buf = kvzalloc(FW_LOG_BUF_SIZE, GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+
+ mutex_lock(&fw_log->mutex);
+ if (!fw_log->size) {
+ dev_warn(dev, "no available fw log\n");
+ mutex_unlock(&fw_log->mutex);
+ goto free_and_return;
+ }
+
+ if (fw_log->size > FW_LOG_BUF_SIZE)
+ log_size = FW_LOG_BUF_SIZE;
+ else
+ log_size = fw_log->size;
+
+ memcpy(buf, fw_log->addr, log_size);
+ dev_info(dev, "copy %d bytes fw log to user...\n", log_size);
+ mutex_unlock(&fw_log->mutex);
+
+ ret = simple_read_from_buffer(userbuf, size, pos, buf,
+ log_size);
+free_and_return:
+ kvfree(buf);
+
+ return ret;
+}
+
+static const struct file_operations isys_fw_log_fops = {
+ .open = simple_open,
+ .owner = THIS_MODULE,
+ .read = fwlog_read,
+ .llseek = default_llseek,
+};
+
+static int ipu7_isys_init_debugfs(struct ipu7_isys *isys)
+{
+ struct dentry *file;
+ struct dentry *dir;
+
+ dir = debugfs_create_dir("isys", isys->adev->isp->ipu7_dir);
+ if (IS_ERR(dir))
+ return -ENOMEM;
+
+ file = debugfs_create_file("fwlog", 0400,
+ dir, isys, &isys_fw_log_fops);
+ if (IS_ERR(file))
+ goto err;
+
+ isys->debugfsdir = dir;
+
+ return 0;
+err:
+ debugfs_remove_recursive(dir);
+ return -ENOMEM;
+}
+#endif
+
static int alloc_fw_msg_bufs(struct ipu7_isys *isys, int amount)
{
struct ipu7_bus_device *adev = isys->adev;
@@ -750,6 +829,11 @@ static int isys_probe(struct auxiliary_device *auxdev,

isys_stream_init(isys);

+#ifdef CONFIG_DEBUG_FS
+ /* Debug fs failure is not fatal. */
+ ipu7_isys_init_debugfs(isys);
+#endif
+
cpu_latency_qos_add_request(&isys->pm_qos, PM_QOS_DEFAULT_VALUE);
ret = alloc_fw_msg_bufs(isys, 20);
if (ret < 0)
diff --git a/drivers/staging/media/ipu7/ipu7-isys.h b/drivers/staging/media/ipu7/ipu7-isys.h
index ef1ab1b42f6c..2579669c21a9 100644
--- a/drivers/staging/media/ipu7/ipu7-isys.h
+++ b/drivers/staging/media/ipu7/ipu7-isys.h
@@ -25,6 +25,10 @@
#include "ipu7-isys-csi2.h"
#include "ipu7-isys-video.h"

+#ifdef CONFIG_DEBUG_FS
+struct dentry;
+
+#endif
#define IPU_ISYS_ENTITY_PREFIX "Intel IPU7"

/* FW support max 16 streams */
@@ -92,6 +96,9 @@ struct ipu7_isys {
unsigned int ref_count;
unsigned int stream_opened;

+#ifdef CONFIG_DEBUG_FS
+ struct dentry *debugfsdir;
+#endif
struct mutex mutex; /* Serialise isys video open/release related */
struct mutex stream_mutex; /* Stream start, stop, queueing reqs */

diff --git a/drivers/staging/media/ipu7/ipu7.c b/drivers/staging/media/ipu7/ipu7.c
index 5cddc09c72bf..a4b0264cc5c7 100644
--- a/drivers/staging/media/ipu7/ipu7.c
+++ b/drivers/staging/media/ipu7/ipu7.c
@@ -7,6 +7,9 @@
#include <linux/bitfield.h>
#include <linux/bits.h>
#include <linux/bug.h>
+#ifdef CONFIG_DEBUG_FS
+#include <linux/debugfs.h>
+#endif
#include <linux/dma-mapping.h>
#include <linux/err.h>
#include <linux/firmware.h>
@@ -2247,6 +2250,49 @@ void ipu7_dump_fw_error_log(const struct ipu7_bus_device *adev)
}
EXPORT_SYMBOL_NS_GPL(ipu7_dump_fw_error_log, "INTEL_IPU7");

+#ifdef CONFIG_DEBUG_FS
+static struct debugfs_blob_wrapper isys_fw_error;
+static struct debugfs_blob_wrapper psys_fw_error;
+
+static int ipu7_init_debugfs(struct ipu7_device *isp)
+{
+ struct dentry *file;
+ struct dentry *dir;
+
+ dir = debugfs_create_dir(pci_name(isp->pdev), NULL);
+ if (!dir)
+ return -ENOMEM;
+
+ isys_fw_error.data = &fw_error_log[IPU_IS];
+ isys_fw_error.size = sizeof(fw_error_log[IPU_IS]);
+ file = debugfs_create_blob("is_fw_error", 0400, dir, &isys_fw_error);
+ if (!file)
+ goto err;
+ psys_fw_error.data = &fw_error_log[IPU_PS];
+ psys_fw_error.size = sizeof(fw_error_log[IPU_PS]);
+ file = debugfs_create_blob("ps_fw_error", 0400, dir, &psys_fw_error);
+ if (!file)
+ goto err;
+
+ isp->ipu7_dir = dir;
+
+ return 0;
+err:
+ debugfs_remove_recursive(dir);
+ return -ENOMEM;
+}
+
+static void ipu7_remove_debugfs(struct ipu7_device *isp)
+{
+ /*
+ * Since isys and psys debugfs dir will be created under ipu root dir,
+ * mark its dentry to NULL to avoid duplicate removal.
+ */
+ debugfs_remove_recursive(isp->ipu7_dir);
+ isp->ipu7_dir = NULL;
+}
+#endif /* CONFIG_DEBUG_FS */
+
static void ipu7_pci_config_setup(struct pci_dev *dev)
{
u16 pci_command;
@@ -2603,6 +2649,13 @@ static int ipu7_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
pm_runtime_put(&isp->psys->auxdev.dev);
}

+#ifdef CONFIG_DEBUG_FS
+ ret = ipu7_init_debugfs(isp);
+ if (ret) {
+ dev_err_probe(dev, ret, "Failed to initialize debugfs\n");
+ goto out_ipu_bus_del_devices;
+ }
+#endif
pm_runtime_put_noidle(dev);
pm_runtime_allow(dev);

@@ -2615,6 +2668,10 @@ static int ipu7_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
ipu7_unmap_fw_code_region(isp->isys);
if (!IS_ERR_OR_NULL(isp->psys) && isp->psys->fw_sgt.nents)
ipu7_unmap_fw_code_region(isp->psys);
+#ifdef CONFIG_DEBUG_FS
+ if (!IS_ERR_OR_NULL(isp->fw_code_region))
+ vfree(isp->fw_code_region);
+#endif
if (!IS_ERR_OR_NULL(isp->psys) && !IS_ERR_OR_NULL(isp->psys->mmu))
ipu7_mmu_cleanup(isp->psys->mmu);
if (!IS_ERR_OR_NULL(isp->isys) && !IS_ERR_OR_NULL(isp->isys->mmu))
@@ -2635,6 +2692,9 @@ static void ipu7_pci_remove(struct pci_dev *pdev)
{
struct ipu7_device *isp = pci_get_drvdata(pdev);

+#ifdef CONFIG_DEBUG_FS
+ ipu7_remove_debugfs(isp);
+#endif
if (!IS_ERR_OR_NULL(isp->isys) && isp->isys->fw_sgt.nents)
ipu7_unmap_fw_code_region(isp->isys);
if (!IS_ERR_OR_NULL(isp->psys) && isp->psys->fw_sgt.nents)
diff --git a/drivers/staging/media/ipu7/ipu7.h b/drivers/staging/media/ipu7/ipu7.h
index ac8ac0689468..3b3ea5fb613f 100644
--- a/drivers/staging/media/ipu7/ipu7.h
+++ b/drivers/staging/media/ipu7/ipu7.h
@@ -81,6 +81,9 @@ struct ipu7_device {

void __iomem *base;
void __iomem *pb_base;
+#ifdef CONFIG_DEBUG_FS
+ struct dentry *ipu7_dir;
+#endif
u8 hw_ver;
bool ipc_reinit;
bool secure_mode;
--
2.43.0

Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
From 87b28eaee6e463bc40abe782a3fe81b62a57e3c0 Mon Sep 17 00:00:00 2001
From: linya14x <linx.yang@intel.com>
Date: Fri, 14 Nov 2025 18:41:08 +0800
Subject: [PATCH 4/7] staging: ipu7: Update IPU7 firmware ABI version to
1.2.1.20251215_224531

Signed-off-by: Hao Yao <hao.yao@intel.com>
---
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 a1519c4fe661..4ce304f54e4b 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 = 0xdead1013U,
IA_GOFO_FW_BOOT_STATE_CRIT_SHARED_BUFFER_FAILURE = 0xdead1014U,
IA_GOFO_FW_BOOT_STATE_CRIT_CMEM_FAILURE = 0xdead1015U,
+ IA_GOFO_FW_BOOT_STATE_CRIT_SYSCOM_CONTEXT_FAILURE = 0xDEAD1016U,
IA_GOFO_FW_BOOT_STATE_SHUTDOWN_CMD = 0x57a7f001U,
IA_GOFO_FW_BOOT_STATE_SHUTDOWN_START = 0x57a7e200U,
IA_GOFO_FW_BOOT_STATE_INACTIVE = 0x57a7e300U,
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 8a78dd0936df..1319f0eb6319 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

Loading
Loading