summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntti Laakso <antti.laakso@linux.intel.com>2026-08-27 15:33:02 +0300
committerSakari Ailus <sakari.ailus@linux.intel.com>2026-09-04 14:46:50 +0300
commit7aa505f2bf653a088ae4e112b5bc6fbc3f842eba (patch)
treed7cf3cae72720eb71336476672b1375b9b8270e2
parent59b96c5ef2b9b20328d740bfe6bad20f34933b18 (diff)
downloadlinux-next-7aa505f2bf653a088ae4e112b5bc6fbc3f842eba.tar.gz
linux-next-7aa505f2bf653a088ae4e112b5bc6fbc3f842eba.zip
media: ipu6: Use single struct for registers
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> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
-rw-r--r--drivers/media/pci/intel/ipu6/ipu6-buttress.c86
-rw-r--r--drivers/media/pci/intel/ipu6/ipu6-buttress.h17
-rw-r--r--drivers/media/pci/intel/ipu6/ipu6.c13
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");
}