* [PATCH 1/7] media: ipu6: Fix media entity names for different ipu versions
2026-10-01 12:45 [PATCH 0/7] Make ipu7 fw boot code subsystem agnostic Antti Laakso
@ 2026-10-01 12:45 ` Antti Laakso
2026-10-01 12:45 ` [PATCH 2/7] media: ipu6: Forward declare struct ipu6_mmu Antti Laakso
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Antti Laakso @ 2026-10-01 12:45 UTC (permalink / raw)
To: linux-media, sakari.ailus, sarang.sapre, divyamani.tripathi; +Cc: manik.bajpai
The media entity name prefix is ipu6 for all the hardware, fix it.
Signed-off-by: Antti Laakso <antti.laakso@linux.intel.com>
---
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 3 ++-
drivers/media/pci/intel/ipu6/ipu6-isys.c | 3 ++-
drivers/media/pci/intel/ipu6/ipu6-isys.h | 18 +++++++++++++++++-
3 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
index 4a2b3d460782..152545427930 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
@@ -937,7 +937,8 @@ int ipu6_isys_csi2_init(struct ipu6_isys_csi2 *csi2,
csi2->asd.source = IPU6_FW_ISYS_STREAM_SRC_CSI2_PORT0 + index;
csi2->asd.supported_codes = csi2_supported_codes;
snprintf(csi2->asd.sd.name, sizeof(csi2->asd.sd.name),
- IPU6_ISYS_ENTITY_PREFIX " CSI2 %u", index);
+ "Intel IPU%s CSI2 %u",
+ ipu6_isys_entity_version(isys->adev->isp), index);
v4l2_set_subdevdata(&csi2->asd.sd, &csi2->asd);
ret = v4l2_subdev_init_finalize(&csi2->asd.sd);
if (ret) {
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys.c b/drivers/media/pci/intel/ipu6/ipu6-isys.c
index a6b79a7be871..094a98e31c06 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys.c
@@ -263,7 +263,8 @@ static int isys_register_video_devices(struct ipu6_isys *isys)
struct ipu6_isys_video *av = &isys->csi2[i].av[j];
snprintf(av->vdev.name, sizeof(av->vdev.name),
- IPU6_ISYS_ENTITY_PREFIX " ISYS Capture %u",
+ "Intel IPU%s ISYS Capture %u",
+ ipu6_isys_entity_version(isys->adev->isp),
i * NR_OF_CSI2_SRC_PADS + j);
av->isys = isys;
av->aq.vbq.buf_struct_size =
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys.h b/drivers/media/pci/intel/ipu6/ipu6-isys.h
index c5c8ede8e64e..f4d00f763eba 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys.h
@@ -25,7 +25,23 @@
struct ipu6_bus_device;
-#define IPU6_ISYS_ENTITY_PREFIX "Intel IPU6"
+#define IPU6_ISYS_ENTITY_VERSION "6"
+#define IPU7_ISYS_ENTITY_VERSION "7"
+#define IPU7P5_ISYS_ENTITY_VERSION "7.5"
+#define IPU8_ISYS_ENTITY_VERSION "8"
+
+static inline const char *ipu6_isys_entity_version(struct ipu6_device *isp)
+{
+ if (IS_IPU8(isp))
+ return IPU8_ISYS_ENTITY_VERSION;
+ if (IS_IPU7P5(isp))
+ return IPU7P5_ISYS_ENTITY_VERSION;
+ if (IS_IPU7_MTL(isp))
+ return IPU7_ISYS_ENTITY_VERSION;
+
+ return IPU6_ISYS_ENTITY_VERSION;
+}
+
/* FW support max 16 streams */
#define IPU6_ISYS_MAX_STREAMS 16
#define ISYS_UNISPART_IRQS (IPU6_ISYS_UNISPART_IRQ_SW | \
--
2.55.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 2/7] media: ipu6: Forward declare struct ipu6_mmu
2026-10-01 12:45 [PATCH 0/7] Make ipu7 fw boot code subsystem agnostic Antti Laakso
2026-10-01 12:45 ` [PATCH 1/7] media: ipu6: Fix media entity names for different ipu versions Antti Laakso
@ 2026-10-01 12:45 ` Antti Laakso
2026-10-01 12:45 ` [PATCH 3/7] media: ipu6: Pass the fw context to the ipu7 boot helpers Antti Laakso
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Antti Laakso @ 2026-10-01 12:45 UTC (permalink / raw)
To: linux-media, sakari.ailus, sarang.sapre, divyamani.tripathi; +Cc: manik.bajpai
The struct ipu6_mmu is used by ipu6_mmu_hw_ops, but the latter is
defined before former. Including ipu6-mmu.h on its own would not work,
add a forward declaration.
Signed-off-by: Antti Laakso <antti.laakso@linux.intel.com>
---
drivers/media/pci/intel/ipu6/ipu6-mmu.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/media/pci/intel/ipu6/ipu6-mmu.h b/drivers/media/pci/intel/ipu6/ipu6-mmu.h
index 44880478d242..ff113384c126 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-mmu.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-mmu.h
@@ -11,6 +11,7 @@
#include "ipu7-mmu-hw.h"
struct device;
+struct ipu6_mmu;
struct page;
struct ipu6_mmu_info {
--
2.55.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 3/7] media: ipu6: Pass the fw context to the ipu7 boot helpers
2026-10-01 12:45 [PATCH 0/7] Make ipu7 fw boot code subsystem agnostic Antti Laakso
2026-10-01 12:45 ` [PATCH 1/7] media: ipu6: Fix media entity names for different ipu versions Antti Laakso
2026-10-01 12:45 ` [PATCH 2/7] media: ipu6: Forward declare struct ipu6_mmu Antti Laakso
@ 2026-10-01 12:45 ` Antti Laakso
2026-10-01 12:45 ` [PATCH 4/7] media: ipu6: Make ipu7 fw config subsystem agnostic Antti Laakso
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Antti Laakso @ 2026-10-01 12:45 UTC (permalink / raw)
To: linux-media, sakari.ailus, sarang.sapre, divyamani.tripathi; +Cc: manik.bajpai
Keep the ipu7 boot helpers sub-system agnostic by passing the
firmware context explicitly. No functional change.
Assisted-by: LLM
Signed-off-by: Antti Laakso <antti.laakso@linux.intel.com>
---
drivers/media/pci/intel/ipu6/ipu7-boot.c | 26 +++++++--------------
drivers/media/pci/intel/ipu6/ipu7-boot.h | 7 ++++--
drivers/media/pci/intel/ipu6/ipu7-fw-isys.c | 9 ++++---
3 files changed, 18 insertions(+), 24 deletions(-)
diff --git a/drivers/media/pci/intel/ipu6/ipu7-boot.c b/drivers/media/pci/intel/ipu6/ipu7-boot.c
index 952c73efd237..f695d668d46b 100644
--- a/drivers/media/pci/intel/ipu6/ipu7-boot.c
+++ b/drivers/media/pci/intel/ipu6/ipu7-boot.c
@@ -12,7 +12,6 @@
#include "ipu6-bus.h"
#include "ipu6-buttress.h"
#include "ipu6-dma.h"
-#include "ipu6-isys.h"
#include "ipu6-platform-buttress-regs.h"
#include "ipu7-boot.h"
#include "ipu7-platform-regs.h"
@@ -163,11 +162,10 @@ static void ipu7_boot_cell_stop(const struct ipu6_bus_device *adev)
writel(val, base + regs->status_ctrl_reg);
}
-static int ipu7_boot_cell_init(const struct ipu6_bus_device *adev)
+static int ipu7_boot_cell_init(const struct ipu6_bus_device *adev,
+ const struct ipu7_fw_com_context *fwctx)
{
const struct boot_regs *regs = &boot_regs[adev->ctrl->subsys_id];
- struct ipu6_isys *isys = ipu6_bus_get_drvdata(adev);
- struct ipu7_fw_com_context *fwctx = isys->fwctx;
void __iomem *base = adev->isp->base;
writel(fwctx->fw_entry, base + regs->fw_start_address_reg);
@@ -191,12 +189,11 @@ static void init_cfg_versions(struct ipu7_boot_abi_cfg *boot_cfg, u32 length, u8
}
int ipu6_ipu7_init_boot_config(struct ipu6_bus_device *adev,
+ struct ipu7_fw_com_context *fwctx,
struct ipu7_fw_com_queue_config *qconfigs,
int num_queues, u32 uc_freq,
dma_addr_t subsys_config, u8 major)
{
- struct ipu6_isys *isys = ipu6_bus_get_drvdata(adev);
- struct ipu7_fw_com_context *fwctx = isys->fwctx;
struct ipu7_boot_abi_cfg *boot_config;
struct ipu7_fw_com_queue_params_config *cfgs;
struct device *dev = &adev->auxdev.dev;
@@ -269,16 +266,12 @@ int ipu6_ipu7_init_boot_config(struct ipu6_bus_device *adev,
}
EXPORT_SYMBOL_NS_GPL(ipu6_ipu7_init_boot_config, "INTEL_IPU6");
-void ipu6_ipu7_release_boot_config(struct ipu6_bus_device *adev)
+void ipu6_ipu7_release_boot_config(struct ipu6_bus_device *adev,
+ struct ipu7_fw_com_context *fwctx)
{
- struct ipu6_isys *isys = ipu6_bus_get_drvdata(adev);
- struct ipu7_fw_com_context *fwctx;
-
- if (!isys || !isys->fwctx)
+ if (!fwctx)
return;
- fwctx = isys->fwctx;
-
if (fwctx->queue_mem) {
ipu6_dma_free(adev, fwctx->queue_mem_size,
fwctx->queue_mem,
@@ -297,18 +290,17 @@ void ipu6_ipu7_release_boot_config(struct ipu6_bus_device *adev)
}
EXPORT_SYMBOL_NS_GPL(ipu6_ipu7_release_boot_config, "INTEL_IPU6");
-int ipu6_ipu7_boot_start_fw(const struct ipu6_bus_device *adev)
+int ipu6_ipu7_boot_start_fw(const struct ipu6_bus_device *adev,
+ struct ipu7_fw_com_context *fwctx)
{
const struct device *dev = &adev->auxdev.dev;
- struct ipu6_isys *isys = ipu6_bus_get_drvdata(adev);
- struct ipu7_fw_com_context *fwctx = isys->fwctx;
u32 timeout = IPU7_FW_START_STOP_TIMEOUT;
void __iomem *base = adev->isp->base;
u32 boot_state, last_boot_state;
u32 indices_addr, msg_ver, id;
int ret;
- ret = ipu7_boot_cell_init(adev);
+ ret = ipu7_boot_cell_init(adev, fwctx);
if (ret)
return ret;
diff --git a/drivers/media/pci/intel/ipu6/ipu7-boot.h b/drivers/media/pci/intel/ipu6/ipu7-boot.h
index f2172b53bed5..48b7cbbde3d3 100644
--- a/drivers/media/pci/intel/ipu6/ipu7-boot.h
+++ b/drivers/media/pci/intel/ipu6/ipu7-boot.h
@@ -36,11 +36,14 @@ struct ipu7_boot_abi_cfg {
} __packed;
int ipu6_ipu7_init_boot_config(struct ipu6_bus_device *adev,
+ struct ipu7_fw_com_context *fwctx,
struct ipu7_fw_com_queue_config *qconfigs,
int num_queues, u32 uc_freq,
dma_addr_t subsys_config, u8 major);
-void ipu6_ipu7_release_boot_config(struct ipu6_bus_device *adev);
-int ipu6_ipu7_boot_start_fw(const struct ipu6_bus_device *adev);
+void ipu6_ipu7_release_boot_config(struct ipu6_bus_device *adev,
+ struct ipu7_fw_com_context *fwctx);
+int ipu6_ipu7_boot_start_fw(const struct ipu6_bus_device *adev,
+ struct ipu7_fw_com_context *fwctx);
int ipu6_ipu7_boot_stop_fw(const struct ipu6_bus_device *adev);
#endif
diff --git a/drivers/media/pci/intel/ipu6/ipu7-fw-isys.c b/drivers/media/pci/intel/ipu6/ipu7-fw-isys.c
index ae8f40f94cc9..b22a01cf6f1b 100644
--- a/drivers/media/pci/intel/ipu6/ipu7-fw-isys.c
+++ b/drivers/media/pci/intel/ipu6/ipu7-fw-isys.c
@@ -25,7 +25,7 @@ static void ipu7_fw_isys_cleanup(struct ipu6_isys *isys)
if (!fwctx)
return;
- ipu6_ipu7_release_boot_config(adev);
+ ipu6_ipu7_release_boot_config(adev, fwctx);
if (fwctx->fw_config) {
ipu6_dma_free(adev, sizeof(*fwctx->fw_config), fwctx->fw_config,
@@ -41,7 +41,7 @@ static void ipu7_fw_isys_cleanup(struct ipu6_isys *isys)
static int ipu7_fw_isys_open(struct ipu6_isys *isys)
{
- return ipu6_ipu7_boot_start_fw(isys->adev);
+ return ipu6_ipu7_boot_start_fw(isys->adev, isys->fwctx);
}
static int ipu7_fw_isys_close(struct ipu6_isys *isys)
@@ -133,9 +133,8 @@ static int ipu7_fw_isys_init(struct ipu6_isys *isys, unsigned int num_streams)
isys->fwctx = fwctx;
- /* IPU8 firmware expects boot-message major version 2, not 1 */
- ret = ipu6_ipu7_init_boot_config(adev, queue_configs, num_queues,
- freq, fw_config_dma_addr,
+ ret = ipu6_ipu7_init_boot_config(adev, fwctx, queue_configs,
+ num_queues, freq, fw_config_dma_addr,
IS_IPU8(adev->isp) ? 2U : 1U);
if (ret) {
ipu7_fw_isys_cleanup(isys);
--
2.55.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 4/7] media: ipu6: Make ipu7 fw config subsystem agnostic
2026-10-01 12:45 [PATCH 0/7] Make ipu7 fw boot code subsystem agnostic Antti Laakso
` (2 preceding siblings ...)
2026-10-01 12:45 ` [PATCH 3/7] media: ipu6: Pass the fw context to the ipu7 boot helpers Antti Laakso
@ 2026-10-01 12:45 ` Antti Laakso
2026-10-01 12:45 ` [PATCH 5/7] media: ipu6: Export the ipu7 firmware boot state Antti Laakso
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Antti Laakso @ 2026-10-01 12:45 UTC (permalink / raw)
To: linux-media, sakari.ailus, sarang.sapre, divyamani.tripathi; +Cc: manik.bajpai
The fw_config holds the subsystem configuration blob handed to the
firmware at boot. Make it subsystem agnostic by using void pointer.
No functional change.
Assisted-by: LLM
Signed-off-by: Antti Laakso <antti.laakso@linux.intel.com>
---
drivers/media/pci/intel/ipu6/ipu7-fw-com.h | 2 +-
drivers/media/pci/intel/ipu6/ipu7-fw-isys.c | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/media/pci/intel/ipu6/ipu7-fw-com.h b/drivers/media/pci/intel/ipu6/ipu7-fw-com.h
index 097eaab99547..a98f476a8be1 100644
--- a/drivers/media/pci/intel/ipu6/ipu7-fw-com.h
+++ b/drivers/media/pci/intel/ipu6/ipu7-fw-com.h
@@ -25,7 +25,7 @@ struct ipu7_fw_com_context {
dma_addr_t boot_config_dma_addr;
u32 boot_config_size;
u32 fw_entry;
- struct ipu7_insys_config *fw_config;
+ void *fw_config;
dma_addr_t fw_config_dma_addr;
};
diff --git a/drivers/media/pci/intel/ipu6/ipu7-fw-isys.c b/drivers/media/pci/intel/ipu6/ipu7-fw-isys.c
index b22a01cf6f1b..00780dfa4912 100644
--- a/drivers/media/pci/intel/ipu6/ipu7-fw-isys.c
+++ b/drivers/media/pci/intel/ipu6/ipu7-fw-isys.c
@@ -28,8 +28,8 @@ static void ipu7_fw_isys_cleanup(struct ipu6_isys *isys)
ipu6_ipu7_release_boot_config(adev, fwctx);
if (fwctx->fw_config) {
- ipu6_dma_free(adev, sizeof(*fwctx->fw_config), fwctx->fw_config,
- fwctx->fw_config_dma_addr, 0);
+ ipu6_dma_free(adev, sizeof(struct ipu7_insys_config),
+ fwctx->fw_config, fwctx->fw_config_dma_addr, 0);
fwctx->fw_config = NULL;
fwctx->fw_config_dma_addr = 0;
}
--
2.55.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 5/7] media: ipu6: Export the ipu7 firmware boot state
2026-10-01 12:45 [PATCH 0/7] Make ipu7 fw boot code subsystem agnostic Antti Laakso
` (3 preceding siblings ...)
2026-10-01 12:45 ` [PATCH 4/7] media: ipu6: Make ipu7 fw config subsystem agnostic Antti Laakso
@ 2026-10-01 12:45 ` Antti Laakso
2026-10-01 12:45 ` [PATCH 6/7] media: ipu6: Add the ipu7 psys buttress support Antti Laakso
2026-10-01 12:45 ` [PATCH 7/7] media: ipu6: Move ipu7 fw logger and watchdog configuration Antti Laakso
6 siblings, 0 replies; 8+ messages in thread
From: Antti Laakso @ 2026-10-01 12:45 UTC (permalink / raw)
To: linux-media, sakari.ailus, sarang.sapre, divyamani.tripathi; +Cc: manik.bajpai
Export a boot state accessor, so subsystem interrupt handler can detect
a firmware error state.
Assisted-by: LLM
Signed-off-by: Antti Laakso <antti.laakso@linux.intel.com>
---
drivers/media/pci/intel/ipu6/ipu7-boot.c | 9 ++++++---
drivers/media/pci/intel/ipu6/ipu7-boot.h | 5 +++++
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/drivers/media/pci/intel/ipu6/ipu7-boot.c b/drivers/media/pci/intel/ipu6/ipu7-boot.c
index f695d668d46b..965783fd50d2 100644
--- a/drivers/media/pci/intel/ipu6/ipu7-boot.c
+++ b/drivers/media/pci/intel/ipu6/ipu7-boot.c
@@ -18,9 +18,6 @@
#define IPU7_FW_START_STOP_TIMEOUT 2000
#define IPU7_BOOT_CELL_RESET_TIMEOUT (2 * USEC_PER_SEC)
-#define IPU7_BOOT_STATE_CRITICAL(s) (((s) & 0xffff0000U) == 0xdead0000U)
-#define IPU7_BOOT_STATE_READY(s) ((s) == 0x57a7e100U)
-#define IPU7_BOOT_STATE_INACTIVE(s) ((s) == 0x57a7e300U)
#define IPU7_BUTTRESS_REG_FW_BOOT_PARAMS0 0x4000
#define IPU7_BUTTRESS_FW_BOOT_PARAMS_ENTRY(i) \
(IPU7_BUTTRESS_REG_FW_BOOT_PARAMS0 + ((i) * 4U))
@@ -395,3 +392,9 @@ int ipu6_ipu7_boot_stop_fw(const struct ipu6_bus_device *adev)
return 0;
}
EXPORT_SYMBOL_NS_GPL(ipu6_ipu7_boot_stop_fw, "INTEL_IPU6");
+
+u32 ipu6_ipu7_boot_get_state(const struct ipu6_bus_device *adev)
+{
+ return read_fw_boot_param(adev, IPU7_FW_BOOT_STATE_ID);
+}
+EXPORT_SYMBOL_NS_GPL(ipu6_ipu7_boot_get_state, "INTEL_IPU6");
diff --git a/drivers/media/pci/intel/ipu6/ipu7-boot.h b/drivers/media/pci/intel/ipu6/ipu7-boot.h
index 48b7cbbde3d3..a7e59067b3eb 100644
--- a/drivers/media/pci/intel/ipu6/ipu7-boot.h
+++ b/drivers/media/pci/intel/ipu6/ipu7-boot.h
@@ -8,6 +8,10 @@
#define IPU7_BOOT_MSG_VER_MAX_ENTRIES 3U
+#define IPU7_BOOT_STATE_CRITICAL(s) (((s) & 0xffff0000U) == 0xdead0000U)
+#define IPU7_BOOT_STATE_READY(s) ((s) == 0x57a7e100U)
+#define IPU7_BOOT_STATE_INACTIVE(s) ((s) == 0x57a7e300U)
+
struct ipu7_boot_abi_version {
u8 patch;
u8 subminor;
@@ -45,5 +49,6 @@ void ipu6_ipu7_release_boot_config(struct ipu6_bus_device *adev,
int ipu6_ipu7_boot_start_fw(const struct ipu6_bus_device *adev,
struct ipu7_fw_com_context *fwctx);
int ipu6_ipu7_boot_stop_fw(const struct ipu6_bus_device *adev);
+u32 ipu6_ipu7_boot_get_state(const struct ipu6_bus_device *adev);
#endif
--
2.55.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 6/7] media: ipu6: Add the ipu7 psys buttress support
2026-10-01 12:45 [PATCH 0/7] Make ipu7 fw boot code subsystem agnostic Antti Laakso
` (4 preceding siblings ...)
2026-10-01 12:45 ` [PATCH 5/7] media: ipu6: Export the ipu7 firmware boot state Antti Laakso
@ 2026-10-01 12:45 ` Antti Laakso
2026-10-01 12:45 ` [PATCH 7/7] media: ipu6: Move ipu7 fw logger and watchdog configuration Antti Laakso
6 siblings, 0 replies; 8+ messages in thread
From: Antti Laakso @ 2026-10-01 12:45 UTC (permalink / raw)
To: linux-media, sakari.ailus, sarang.sapre, divyamani.tripathi; +Cc: manik.bajpai
Add buttress psys helpers, needed by ipu7 psys driver.
Assisted-by: LLM
Signed-off-by: Antti Laakso <antti.laakso@linux.intel.com>
---
drivers/media/pci/intel/ipu6/ipu6-buttress.c | 22 +++++++++++++++++++
drivers/media/pci/intel/ipu6/ipu6-buttress.h | 2 ++
.../intel/ipu6/ipu6-platform-buttress-regs.h | 4 ++++
.../media/pci/intel/ipu6/ipu7-platform-regs.h | 12 ++++++++++
4 files changed, 40 insertions(+)
diff --git a/drivers/media/pci/intel/ipu6/ipu6-buttress.c b/drivers/media/pci/intel/ipu6/ipu6-buttress.c
index 00d504647c29..f1d236054cf7 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-buttress.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-buttress.c
@@ -1055,6 +1055,28 @@ u32 ipu7_buttress_get_isys_freq(struct ipu6_device *isp)
}
EXPORT_SYMBOL_NS_GPL(ipu7_buttress_get_isys_freq, "INTEL_IPU6");
+/* trigger uc control to wakeup fw */
+void ipu7_buttress_wakeup_psys(const struct ipu6_device *isp)
+{
+ u32 val;
+
+ val = readl(isp->base + IPU7_BUTTRESS_REG_PSYS_UCX_CTRL_STATUS);
+ val |= IPU7_UCX_CTL_WAKEUP;
+ writel(val, isp->base + IPU7_BUTTRESS_REG_PSYS_UCX_CTRL_STATUS);
+}
+EXPORT_SYMBOL_NS_GPL(ipu7_buttress_wakeup_psys, "INTEL_IPU6");
+
+u32 ipu7_buttress_get_psys_freq(struct ipu6_device *isp)
+{
+ u32 val;
+
+ val = readl(isp->base + IPU7_BUTTRESS_REG_PS_WORKPOINT_REQ);
+ val &= IPU7_BUTTRESS_PS_FREQ_CTL_RATIO_MASK;
+
+ return val * IPU7_BUTTRESS_PS_FREQ_RATIO_STEP;
+}
+EXPORT_SYMBOL_NS_GPL(ipu7_buttress_get_psys_freq, "INTEL_IPU6");
+
static const struct x86_cpu_id ipu7_misc_cfg_exclusion[] = {
X86_MATCH_VFM_STEPS(INTEL_PANTHERLAKE_L, 0x1, 0x1, 0),
{},
diff --git a/drivers/media/pci/intel/ipu6/ipu6-buttress.h b/drivers/media/pci/intel/ipu6/ipu6-buttress.h
index 79d8f5893686..39c2951c5370 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-buttress.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-buttress.h
@@ -108,4 +108,6 @@ void ipu6_buttress_csi_port_config(struct ipu6_device *isp,
void ipu6_buttress_restore(struct ipu6_device *isp);
void ipu7_buttress_wakeup_isys(const struct ipu6_device *isp);
u32 ipu7_buttress_get_isys_freq(struct ipu6_device *isp);
+void ipu7_buttress_wakeup_psys(const struct ipu6_device *isp);
+u32 ipu7_buttress_get_psys_freq(struct ipu6_device *isp);
#endif /* IPU6_BUTTRESS_H */
diff --git a/drivers/media/pci/intel/ipu6/ipu6-platform-buttress-regs.h b/drivers/media/pci/intel/ipu6/ipu6-platform-buttress-regs.h
index 04d196c49c60..4c4ca95c7d54 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-platform-buttress-regs.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-platform-buttress-regs.h
@@ -237,6 +237,8 @@ enum {
#define IPU7_BUTTRESS_REG_PB_TIMESTAMP_VALID 0x2038
#define IPU7_BUTTRESS_REG_IS_WORKPOINT_REQ 0x2104
#define IPU7_BUTTRESS_REG_PS_WORKPOINT_REQ 0x2100
+#define IPU7_BUTTRESS_REG_PS_WORKPOINT_DOMAIN_REQ 0x2108
+#define IPU7_BUTTRESS_REG_PS_DOMAINS_STATUS 0x2110
#define IPU7_BUTTRESS_REG_IDLE_WDT 0x218c
#define IPU7_BUTTRESS_REG_ISYS_UCX_CTRL_STATUS 0x2200
#define IPU7_BUTTRESS_REG_ISYS_UCX_START_ADDR 0x2204
@@ -280,6 +282,8 @@ enum {
#define IPU7_FREQ_CTL_CDYN 0x80
#define IPU7_FREQ_CTL_CDYN_SHIFT 8
#define IPU7_BUTTRESS_IS_FREQ_CTL_RATIO_MASK GENMASK(7, 0)
+#define IPU7_BUTTRESS_PS_FREQ_CTL_RATIO_MASK GENMASK(7, 0)
+#define IPU7_BUTTRESS_PS_FREQ_RATIO_STEP 25U
#define IPU7_IS_FREQ_CTL_DEFAULT_RATIO 0x1b
#define IPU7_PS_FREQ_CTL_DEFAULT_RATIO 0x14
/* IS: 400MHz, PS: 400MHz */
diff --git a/drivers/media/pci/intel/ipu6/ipu7-platform-regs.h b/drivers/media/pci/intel/ipu6/ipu7-platform-regs.h
index 39cd5c0890e5..3493e0efe24d 100644
--- a/drivers/media/pci/intel/ipu6/ipu7-platform-regs.h
+++ b/drivers/media/pci/intel/ipu6/ipu7-platform-regs.h
@@ -4,6 +4,8 @@
#ifndef IPU7_PLATFORM_REGS_H
#define IPU7_PLATFORM_REGS_H
+#include <linux/bits.h>
+
#define IPU7_IS_UC_CTRL_BASE 0x230000
#define IPU7_ISYS_DMEM_OFFSET 0x200000
#define IPU7_PS_UC_CTRL_BASE 0x130000
@@ -29,4 +31,14 @@
#define IPU7_TO_SW_IRQ_FW BIT(0)
#define IPU7_REG_PRINTF_AXI_CNTL 0x301c
+/* psys subdomain power request positions in PS_WORKPOINT_DOMAIN_REQ */
+enum ipu7_psys_subdomain_pos {
+ IPU7_PSYS_SUBDOMAIN_LB = 0,
+ IPU7_PSYS_SUBDOMAIN_BB = 1,
+};
+
+#define IPU7_PSYS_DOMAIN_POWER_MASK (BIT(IPU7_PSYS_SUBDOMAIN_LB) | \
+ BIT(IPU7_PSYS_SUBDOMAIN_BB))
+#define IPU7_PSYS_DOMAIN_POWER_IN_PROGRESS BIT(31)
+
#endif
--
2.55.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 7/7] media: ipu6: Move ipu7 fw logger and watchdog configuration
2026-10-01 12:45 [PATCH 0/7] Make ipu7 fw boot code subsystem agnostic Antti Laakso
` (5 preceding siblings ...)
2026-10-01 12:45 ` [PATCH 6/7] media: ipu6: Add the ipu7 psys buttress support Antti Laakso
@ 2026-10-01 12:45 ` Antti Laakso
6 siblings, 0 replies; 8+ messages in thread
From: Antti Laakso @ 2026-10-01 12:45 UTC (permalink / raw)
To: linux-media, sakari.ailus, sarang.sapre, divyamani.tripathi; +Cc: manik.bajpai
The logger and watchdog configurations are not isys specific, move them
to ipu7-boot.h. No functional change.
Assisted-by: LLM
Signed-off-by: Antti Laakso <antti.laakso@linux.intel.com>
---
drivers/media/pci/intel/ipu6/ipu7-boot.h | 22 +++++++++++++++++++++
drivers/media/pci/intel/ipu6/ipu7-fw-isys.h | 19 ++----------------
2 files changed, 24 insertions(+), 17 deletions(-)
diff --git a/drivers/media/pci/intel/ipu6/ipu7-boot.h b/drivers/media/pci/intel/ipu6/ipu7-boot.h
index a7e59067b3eb..e7a21b16f41b 100644
--- a/drivers/media/pci/intel/ipu6/ipu7-boot.h
+++ b/drivers/media/pci/intel/ipu6/ipu7-boot.h
@@ -4,6 +4,8 @@
#ifndef IPU7_BOOT_H
#define IPU7_BOOT_H
+#include <linux/bits.h>
+
#include "ipu7-fw-com.h"
#define IPU7_BOOT_MSG_VER_MAX_ENTRIES 3U
@@ -12,6 +14,26 @@
#define IPU7_BOOT_STATE_READY(s) ((s) == 0x57a7e100U)
#define IPU7_BOOT_STATE_INACTIVE(s) ((s) == 0x57a7e300U)
+#define IPU7_FWLOG_MAX_LOGGER_SOURCES (64U)
+
+#define IPU7_LOGGER_CFG_CHANNEL_ENABLE_SYSCOM BIT(1)
+
+/* Shared by the insys and psys subsystem configurations */
+struct ipu7_fw_logger_config {
+ u8 use_source_severity;
+ u8 source_severity[IPU7_FWLOG_MAX_LOGGER_SOURCES];
+ u8 use_channels_enable_bitmask;
+ u8 channels_enable_bitmask;
+ u8 padding[1];
+ u32 hw_printf_buffer_base_addr;
+ u32 hw_printf_buffer_size_bytes;
+};
+
+struct ipu7_wdt_abi {
+ u32 wdt_timer1_us;
+ u32 wdt_timer2_us;
+};
+
struct ipu7_boot_abi_version {
u8 patch;
u8 subminor;
diff --git a/drivers/media/pci/intel/ipu6/ipu7-fw-isys.h b/drivers/media/pci/intel/ipu6/ipu7-fw-isys.h
index 30289d73be6c..2536f15a4962 100644
--- a/drivers/media/pci/intel/ipu6/ipu7-fw-isys.h
+++ b/drivers/media/pci/intel/ipu6/ipu7-fw-isys.h
@@ -4,9 +4,9 @@
#ifndef IPU7_FW_ISYS_H
#define IPU7_FW_ISYS_H
+#include "ipu7-boot.h"
#include <linux/limits.h>
-#define IPU7_FWLOG_MAX_LOGGER_SOURCES (64U)
#define IPU7_INSYS_MAX_OUTPUT_QUEUES 3U
#define IPU7_INSYS_STREAM_ID_MAX 16U
#define IPU7_INSYS_MAX_INPUT_QUEUES (IPU7_INSYS_STREAM_ID_MAX + 1U)
@@ -158,24 +158,9 @@ enum insys_msg_err_groups {
INSYS_MSG_ERR_GROUP_N,
};
-struct ipu7_fw_isys_logger_config {
- u8 use_source_severity;
- u8 source_severity[IPU7_FWLOG_MAX_LOGGER_SOURCES];
- u8 use_channels_enable_bitmask;
- u8 channels_enable_bitmask;
- u8 padding[1];
- u32 hw_printf_buffer_base_addr;
- u32 hw_printf_buffer_size_bytes;
-};
-
-struct ipu7_wdt_abi {
- u32 wdt_timer1_us;
- u32 wdt_timer2_us;
-};
-
struct ipu7_insys_config {
u32 timeout_val_ms;
- struct ipu7_fw_isys_logger_config logger_config;
+ struct ipu7_fw_logger_config logger_config;
struct ipu7_wdt_abi wdt_config;
};
--
2.55.0
^ permalink raw reply related [flat|nested] 8+ messages in thread