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 10/44] media: ipu6: Use single struct for registers
Date: Fri, 21 Aug 2026 14:42:28 +0300 [thread overview]
Message-ID: <20260821114302.365532-11-antti.laakso@linux.intel.com> (raw)
In-Reply-To: <20260821114302.365532-1-antti.laakso@linux.intel.com>
Move register values from ipu6_buttress_ipc struct to
ipu6_buttress_registers as these are different in future
hardware versions as well.
Signed-off-by: Antti Laakso <antti.laakso@linux.intel.com>
---
drivers/media/pci/intel/ipu6/ipu6-buttress.c | 86 +++++++++-----------
drivers/media/pci/intel/ipu6/ipu6-buttress.h | 17 ++--
drivers/media/pci/intel/ipu6/ipu6.c | 13 +--
3 files changed, 54 insertions(+), 62 deletions(-)
diff --git a/drivers/media/pci/intel/ipu6/ipu6-buttress.c b/drivers/media/pci/intel/ipu6/ipu6-buttress.c
index 3c5f4e407b7c..e77a569bb97e 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-buttress.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-buttress.c
@@ -55,11 +55,11 @@
#define BUTTRESS_MAX_CONSECUTIVE_IRQS 100
-int ipu6_buttress_ipc_reset(struct ipu6_device *isp,
- struct ipu6_buttress_ipc *ipc)
+int ipu6_buttress_ipc_reset(struct ipu6_device *isp)
{
unsigned int retries = BUTTRESS_IPC_RESET_RETRY;
struct ipu6_buttress *b = &isp->buttress;
+ const struct ipu6_buttress_registers *regs = b->regs;
u32 val = 0, csr_in_clr;
if (!isp->secure_mode) {
@@ -70,11 +70,11 @@ int ipu6_buttress_ipc_reset(struct ipu6_device *isp,
mutex_lock(&b->ipc_mutex);
/* Clear-by-1 CSR (all bits), corresponding internal states. */
- val = readl(isp->base + ipc->csr_in);
- writel(val, isp->base + ipc->csr_in);
+ val = readl(isp->base + regs->csr_in);
+ writel(val, isp->base + regs->csr_in);
/* Set peer CSR bit IPC_PEER_COMP_ACTIONS_RST_PHASE1 */
- writel(ENTRY, isp->base + ipc->csr_out);
+ writel(ENTRY, isp->base + regs->csr_out);
/*
* Clear-by-1 all CSR bits EXCEPT following
* bits:
@@ -89,7 +89,7 @@ int ipu6_buttress_ipc_reset(struct ipu6_device *isp,
do {
usleep_range(400, 500);
- val = readl(isp->base + ipc->csr_in);
+ val = readl(isp->base + regs->csr_in);
switch (val) {
case ENTRY | EXIT:
case ENTRY | EXIT | QUERY:
@@ -100,8 +100,8 @@ int ipu6_buttress_ipc_reset(struct ipu6_device *isp,
* 2) Set peer CSR bit
* IPC_PEER_QUERIED_IP_COMP_ACTIONS_RST_PHASE.
*/
- writel(ENTRY | EXIT, isp->base + ipc->csr_in);
- writel(QUERY, isp->base + ipc->csr_out);
+ writel(ENTRY | EXIT, isp->base + regs->csr_in);
+ writel(QUERY, isp->base + regs->csr_out);
break;
case ENTRY:
case ENTRY | QUERY:
@@ -112,8 +112,8 @@ int ipu6_buttress_ipc_reset(struct ipu6_device *isp,
* 2) Set peer CSR bit
* IPC_PEER_COMP_ACTIONS_RST_PHASE1.
*/
- writel(ENTRY | QUERY, isp->base + ipc->csr_in);
- writel(ENTRY, isp->base + ipc->csr_out);
+ writel(ENTRY | QUERY, isp->base + regs->csr_in);
+ writel(ENTRY, isp->base + regs->csr_out);
break;
case EXIT:
case EXIT | QUERY:
@@ -130,17 +130,17 @@ int ipu6_buttress_ipc_reset(struct ipu6_device *isp,
* 3) Set peer CSR bit
* IPC_PEER_COMP_ACTIONS_RST_PHASE2.
*/
- writel(EXIT, isp->base + ipc->csr_in);
- writel(0, isp->base + ipc->db0_in);
- writel(csr_in_clr, isp->base + ipc->csr_in);
- writel(EXIT, isp->base + ipc->csr_out);
+ writel(EXIT, isp->base + regs->csr_in);
+ writel(0, isp->base + regs->db0_in);
+ writel(csr_in_clr, isp->base + regs->csr_in);
+ writel(EXIT, isp->base + regs->csr_out);
/*
* Read csr_in again to make sure if RST_PHASE2 is done.
* If csr_in is QUERY, it should be handled again.
*/
usleep_range(200, 300);
- val = readl(isp->base + ipc->csr_in);
+ val = readl(isp->base + regs->csr_in);
if (val & QUERY) {
dev_dbg(&isp->pdev->dev,
"RST_PHASE2 retry csr_in = %x\n", val);
@@ -155,8 +155,8 @@ int ipu6_buttress_ipc_reset(struct ipu6_device *isp,
* 2) Set peer CSR bit
* IPC_PEER_COMP_ACTIONS_RST_PHASE1
*/
- writel(QUERY, isp->base + ipc->csr_in);
- writel(ENTRY, isp->base + ipc->csr_out);
+ writel(QUERY, isp->base + regs->csr_in);
+ writel(ENTRY, isp->base + regs->csr_out);
break;
default:
dev_dbg_ratelimited(&isp->pdev->dev,
@@ -171,42 +171,42 @@ int ipu6_buttress_ipc_reset(struct ipu6_device *isp,
return -ETIMEDOUT;
}
-static void ipu6_buttress_ipc_validity_close(struct ipu6_device *isp,
- struct ipu6_buttress_ipc *ipc)
+static void ipu6_buttress_ipc_validity_close(struct ipu6_device *isp)
{
writel(BUTTRESS_IU2CSECSR_IPC_PEER_DEASSERTED_REG_VALID_REQ,
- isp->base + ipc->csr_out);
+ isp->base + isp->buttress.regs->csr_out);
}
static int
-ipu6_buttress_ipc_validity_open(struct ipu6_device *isp,
- struct ipu6_buttress_ipc *ipc)
+ipu6_buttress_ipc_validity_open(struct ipu6_device *isp)
{
unsigned int mask = BUTTRESS_IU2CSECSR_IPC_PEER_ACKED_REG_VALID;
+ const struct ipu6_buttress_registers *regs = isp->buttress.regs;
void __iomem *addr;
int ret;
u32 val;
writel(BUTTRESS_IU2CSECSR_IPC_PEER_ASSERTED_REG_VALID_REQ,
- isp->base + ipc->csr_out);
+ isp->base + regs->csr_out);
- addr = isp->base + ipc->csr_in;
+ addr = isp->base + regs->csr_in;
ret = readl_poll_timeout(addr, val, val & mask, 200,
BUTTRESS_IPC_VALIDITY_TIMEOUT_US);
if (ret) {
dev_err(&isp->pdev->dev, "CSE validity timeout 0x%x\n", val);
- ipu6_buttress_ipc_validity_close(isp, ipc);
+ ipu6_buttress_ipc_validity_close(isp);
}
return ret;
}
-static void ipu6_buttress_ipc_recv(struct ipu6_device *isp,
- struct ipu6_buttress_ipc *ipc, u32 *ipc_msg)
+static void ipu6_buttress_ipc_recv(struct ipu6_device *isp, u32 *ipc_msg)
{
+ const struct ipu6_buttress_registers *regs = isp->buttress.regs;
+
if (ipc_msg)
- *ipc_msg = readl(isp->base + ipc->data0_in);
- writel(0, isp->base + ipc->db0_in);
+ *ipc_msg = readl(isp->base + regs->data0_in);
+ writel(0, isp->base + regs->db0_in);
}
static int ipu6_buttress_ipc_send_bulk(struct ipu6_device *isp,
@@ -217,13 +217,14 @@ static int ipu6_buttress_ipc_send_bulk(struct ipu6_device *isp,
unsigned int i, retry = BUTTRESS_IPC_CMD_SEND_RETRY;
struct ipu6_buttress *b = &isp->buttress;
struct ipu6_buttress_ipc *ipc = &b->ipc;
+ const struct ipu6_buttress_registers *regs = b->regs;
u32 val;
int ret;
int tout;
mutex_lock(&b->ipc_mutex);
- ret = ipu6_buttress_ipc_validity_open(isp, ipc);
+ ret = ipu6_buttress_ipc_validity_open(isp);
if (ret) {
dev_err(&isp->pdev->dev, "IPC validity open failed\n");
goto out;
@@ -239,9 +240,9 @@ static int ipu6_buttress_ipc_send_bulk(struct ipu6_device *isp,
dev_dbg(&isp->pdev->dev, "bulk IPC command: 0x%x\n",
msgs[i].cmd);
- writel(msgs[i].cmd, isp->base + ipc->data0_out);
+ writel(msgs[i].cmd, isp->base + regs->data0_out);
val = BUTTRESS_IU2CSEDB0_BUSY | msgs[i].cmd_size;
- writel(val, isp->base + ipc->db0_out);
+ writel(val, isp->base + regs->db0_out);
tout = wait_for_completion_timeout(&ipc->send_complete,
tx_timeout_jiffies);
@@ -253,7 +254,7 @@ static int ipu6_buttress_ipc_send_bulk(struct ipu6_device *isp,
}
/* Try again if CSE is not responding on first try */
- writel(0, isp->base + ipc->db0_out);
+ writel(0, isp->base + regs->db0_out);
i--;
continue;
}
@@ -271,8 +272,8 @@ static int ipu6_buttress_ipc_send_bulk(struct ipu6_device *isp,
goto out;
}
- if (ipc->nack_mask &&
- (ipc->recv_data & ipc->nack_mask) == ipc->nack) {
+ if ((ipc->recv_data & BUTTRESS_CSE2IUDATA0_IPC_NACK_MASK) ==
+ BUTTRESS_CSE2IUDATA0_IPC_NACK) {
dev_err(&isp->pdev->dev,
"IPC NACK for cmd 0x%x\n", msgs[i].cmd);
ret = -EIO;
@@ -291,7 +292,7 @@ static int ipu6_buttress_ipc_send_bulk(struct ipu6_device *isp,
dev_dbg(&isp->pdev->dev, "bulk IPC commands done\n");
out:
- ipu6_buttress_ipc_validity_close(isp, ipc);
+ ipu6_buttress_ipc_validity_close(isp);
mutex_unlock(&b->ipc_mutex);
return ret;
}
@@ -375,7 +376,7 @@ irqreturn_t ipu6_buttress_isr(int irq, void *isp_ptr)
dev_dbg(&isp->pdev->dev,
"BUTTRESS_ISR_IPC_FROM_CSE_IS_WAITING\n");
- ipu6_buttress_ipc_recv(isp, &b->ipc, &b->ipc.recv_data);
+ ipu6_buttress_ipc_recv(isp, &b->ipc.recv_data);
complete(&b->ipc.recv_complete);
}
@@ -836,15 +837,6 @@ int ipu6_buttress_init(struct ipu6_device *isp)
init_completion(&b->ipc.send_complete);
init_completion(&b->ipc.recv_complete);
- b->ipc.nack = BUTTRESS_CSE2IUDATA0_IPC_NACK;
- b->ipc.nack_mask = BUTTRESS_CSE2IUDATA0_IPC_NACK_MASK;
- b->ipc.csr_in = BUTTRESS_REG_CSE2IUCSR;
- b->ipc.csr_out = BUTTRESS_REG_IU2CSECSR;
- b->ipc.db0_in = BUTTRESS_REG_CSE2IUDB0;
- b->ipc.db0_out = BUTTRESS_REG_IU2CSEDB0;
- b->ipc.data0_in = BUTTRESS_REG_CSE2IUDATA0;
- b->ipc.data0_out = BUTTRESS_REG_IU2CSEDATA0;
-
INIT_LIST_HEAD(&b->constraints);
isp->secure_mode = ipu6_buttress_get_secure_mode(isp);
@@ -880,7 +872,7 @@ int ipu6_buttress_init(struct ipu6_device *isp)
/* Retry couple of times in case of CSE initialization is delayed */
do {
- ret = ipu6_buttress_ipc_reset(isp, &b->ipc);
+ ret = ipu6_buttress_ipc_reset(isp);
if (ret) {
dev_warn(&isp->pdev->dev,
"IPC reset protocol failed, retrying\n");
diff --git a/drivers/media/pci/intel/ipu6/ipu6-buttress.h b/drivers/media/pci/intel/ipu6/ipu6-buttress.h
index 68586a32fda3..a3c23adede7b 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-buttress.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-buttress.h
@@ -31,15 +31,7 @@ struct ipu6_buttress_ctrl {
struct ipu6_buttress_ipc {
struct completion send_complete;
struct completion recv_complete;
- u32 nack;
- u32 nack_mask;
u32 recv_data;
- u32 csr_out;
- u32 csr_in;
- u32 db0_in;
- u32 db0_out;
- u32 data0_out;
- u32 data0_in;
};
struct ipu6_buttress_registers {
@@ -55,6 +47,12 @@ struct ipu6_buttress_registers {
u32 tsc_lo;
u32 wdt;
u32 btrs_ctrl;
+ u32 csr_in;
+ u32 csr_out;
+ u32 db0_in;
+ u32 db0_out;
+ u32 data0_in;
+ u32 data0_out;
/* Bitmasks */
u32 irq_is;
@@ -83,8 +81,7 @@ struct ipu6_ipc_buttress_bulk_msg {
u8 cmd_size;
};
-int ipu6_buttress_ipc_reset(struct ipu6_device *isp,
- struct ipu6_buttress_ipc *ipc);
+int ipu6_buttress_ipc_reset(struct ipu6_device *isp);
int ipu6_buttress_map_fw_image(struct ipu6_bus_device *sys,
const struct firmware *fw,
struct sg_table *sgt);
diff --git a/drivers/media/pci/intel/ipu6/ipu6.c b/drivers/media/pci/intel/ipu6/ipu6.c
index 55e660fda421..7ac9c92744c0 100644
--- a/drivers/media/pci/intel/ipu6/ipu6.c
+++ b/drivers/media/pci/intel/ipu6/ipu6.c
@@ -241,6 +241,12 @@ static const struct ipu6_buttress_registers ipu6_buttress_regs = {
.tsc_lo = BUTTRESS_REG_TSC_LO,
.wdt = BUTTRESS_REG_WDT,
.btrs_ctrl = BUTTRESS_REG_BTRS_CTRL,
+ .csr_in = BUTTRESS_REG_CSE2IUCSR,
+ .csr_out = BUTTRESS_REG_IU2CSECSR,
+ .db0_in = BUTTRESS_REG_CSE2IUDB0,
+ .db0_out = BUTTRESS_REG_IU2CSEDB0,
+ .data0_in = BUTTRESS_REG_CSE2IUDATA0,
+ .data0_out = BUTTRESS_REG_IU2CSEDATA0,
/* Bitmasks */
.irq_is = BUTTRESS_ISR_IS_IRQ,
@@ -779,7 +785,6 @@ static int ipu6_resume(struct device *dev)
{
struct pci_dev *pdev = to_pci_dev(dev);
struct ipu6_device *isp = pci_get_drvdata(pdev);
- struct ipu6_buttress *b = &isp->buttress;
int ret;
/* Configure the arbitration mechanisms for VC requests */
@@ -791,7 +796,7 @@ static int ipu6_resume(struct device *dev)
ipu6_buttress_restore(isp);
- ret = ipu6_buttress_ipc_reset(isp, &b->ipc);
+ ret = ipu6_buttress_ipc_reset(isp);
if (ret)
dev_err(&isp->pdev->dev, "IPC reset protocol failed!\n");
@@ -820,10 +825,8 @@ static int ipu6_runtime_resume(struct device *dev)
ipu6_buttress_restore(isp);
if (isp->need_ipc_reset) {
- struct ipu6_buttress *b = &isp->buttress;
-
isp->need_ipc_reset = false;
- ret = ipu6_buttress_ipc_reset(isp, &b->ipc);
+ ret = ipu6_buttress_ipc_reset(isp);
if (ret)
dev_err(&isp->pdev->dev, "IPC reset protocol failed\n");
}
--
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 ` Antti Laakso [this message]
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 ` [PATCH v2 21/44] media: ipu6: Add isys firmware ops Antti Laakso
2026-08-21 11:42 ` [PATCH v2 22/44] media: ipu6: Add ipu7 fw start/stop functionality Antti Laakso
2026-08-21 11:42 ` [PATCH v2 23/44] media: ipu6: Add ipu7 fw com methods Antti Laakso
2026-08-21 11:42 ` [PATCH v2 24/44] media: ipu6: Add ipu7 fw isys ops Antti Laakso
2026-08-21 11:42 ` [PATCH v2 25/44] media: ipu6: Add ipu7 csi2 register definitions Antti Laakso
2026-08-21 11:42 ` [PATCH v2 26/44] media: ipu6: Add ipu7 isr handler Antti Laakso
2026-08-21 11:42 ` [PATCH v2 27/44] media: ipu6: Add ipu7 csi phy driver Antti Laakso
2026-08-21 11:42 ` [PATCH v2 28/44] media: ipu6: Split ipu6 csi2 stream enable/disable Antti Laakso
2026-08-21 11:42 ` [PATCH v2 29/44] media: ipu6: Add support for ipu7 csi2 receiver Antti Laakso
2026-08-21 11:42 ` [PATCH v2 30/44] media: ipu6: Parse bus type for ipu7 Antti Laakso
2026-08-21 11:42 ` [PATCH v2 31/44] media: ipu6: Enable ipu7 isys interrupts Antti Laakso
2026-08-21 11:42 ` [PATCH v2 32/44] media: ipu6: Skip watermark configuration for ipu7 Antti Laakso
2026-08-21 11:42 ` [PATCH v2 33/44] media: ipu6: The SPC init is valid only for ipu6 Antti Laakso
2026-08-21 11:42 ` [PATCH v2 34/44] media: ipu6: The VC arbitration mechanism is ipu6 only Antti Laakso
2026-08-21 11:42 ` [PATCH v2 35/44] media: ipu6: Move buttress mem alloc out from probe Antti Laakso
2026-08-21 11:42 ` [PATCH v2 36/44] media: ipu6: Read correct SKU ID for ipu7 Antti Laakso
2026-08-21 11:42 ` [PATCH v2 37/44] media: ipu6: Add support for fixed iova region Antti Laakso
2026-08-21 11:42 ` [PATCH v2 38/44] media: ipu6: Make fw mapping function reusable Antti Laakso
2026-08-21 11:42 ` [PATCH v2 39/44] media: ipu6: Move isys fw mapping to pci_probe Antti Laakso
2026-08-21 18:17 ` Sakari Ailus
2026-08-21 11:42 ` [PATCH v2 40/44] media: ipu6: Map ipu7 firmware Antti Laakso
2026-08-21 18:23 ` Sakari Ailus
2026-08-21 11:42 ` [PATCH v2 41/44] media: ipu6: Set model name for ipu7 Antti Laakso
2026-08-21 11:43 ` [PATCH v2 42/44] media: ipu6: Add ipu7.5 buttress support Antti Laakso
2026-08-21 11:43 ` [PATCH v2 43/44] media: ipu6: Add ipu7.5 mmu initialization data Antti Laakso
2026-08-21 11:43 ` [PATCH v2 44/44] media: ipu6: Enable ipu7 and ipu7.5 Antti Laakso
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260821114302.365532-11-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