From: Yipeng Zou <zouyipeng@huawei.com>
To: <tglx@linutronix.de>, <maz@kernel.org>, <majun258@huawei.com>,
<guohanjun@huawei.com>, <wangwudi@hisilicon.com>,
<liaochang1@huawei.com>, <linux-kernel@vger.kernel.org>
Cc: <zouyipeng@huawei.com>
Subject: [PATCH] irqchip/mbigen: Fix mbigen node address layout
Date: Sat, 20 Jul 2024 09:35:38 +0800 [thread overview]
Message-ID: <20240720013538.3251995-1-zouyipeng@huawei.com> (raw)
Mbigen chip contains several mbigen nodes, and mapped address space per
nodes one by one.
mbigen chip
|-----------------|------------|--------------|
mgn_node_0 mgn_node_1 ... mgn_node_i
|--------------| |--------------| |----------------------|
[0x0000, 0x1000) [0x1000, 0x2000) [i*0x1000, (i+1)*0x1000)
Mbigen also defined a clear register with all other mbigen nodes in
uniform address space.
mbigen chip
|-----------|--------|--------|---------------|--------|
mgn_node_0 mgn_node_1 ... mgn_clear_register ... mgn_node_i
|-----------------|
[0xA000, 0xB000)
Everything is OK for now, when the mbigen nodes number less than 10,
there is no conflict with clear register.
Once we defined mbigen node more than 10, it's going to touch clear
register in unexpected way.
There should have a gap of 0x1000 between mgn_node9 and mgn_node10.
The simplest solution is directly skip clear register when access to
more than 10 mbigen nodes.
Fixes: a6c2f87b8820 ("irqchip/mbigen: Implement the mbigen irq chip operation functions")
Signed-off-by: Yipeng Zou <zouyipeng@huawei.com>
---
drivers/irqchip/irq-mbigen.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/drivers/irqchip/irq-mbigen.c b/drivers/irqchip/irq-mbigen.c
index 58881d313979..b600637f5cd7 100644
--- a/drivers/irqchip/irq-mbigen.c
+++ b/drivers/irqchip/irq-mbigen.c
@@ -64,6 +64,20 @@ struct mbigen_device {
void __iomem *base;
};
+static inline unsigned int get_mbigen_node_offset(unsigned int nid)
+{
+ unsigned int offset = nid * MBIGEN_NODE_OFFSET;
+
+ /**
+ * To avoid touched clear register in unexpected way, we need to directly
+ * skip clear register when access to more than 10 mbigen nodes.
+ */
+ if (nid >= (REG_MBIGEN_CLEAR_OFFSET / MBIGEN_NODE_OFFSET))
+ offset += MBIGEN_NODE_OFFSET;
+
+ return offset;
+}
+
static inline unsigned int get_mbigen_vec_reg(irq_hw_number_t hwirq)
{
unsigned int nid, pin;
@@ -72,7 +86,7 @@ static inline unsigned int get_mbigen_vec_reg(irq_hw_number_t hwirq)
nid = hwirq / IRQS_PER_MBIGEN_NODE + 1;
pin = hwirq % IRQS_PER_MBIGEN_NODE;
- return pin * 4 + nid * MBIGEN_NODE_OFFSET
+ return pin * 4 + get_mbigen_node_offset(nid)
+ REG_MBIGEN_VEC_OFFSET;
}
@@ -88,7 +102,7 @@ static inline void get_mbigen_type_reg(irq_hw_number_t hwirq,
*mask = 1 << (irq_ofst % 32);
ofst = irq_ofst / 32 * 4;
- *addr = ofst + nid * MBIGEN_NODE_OFFSET
+ *addr = ofst + get_mbigen_node_offset(nid)
+ REG_MBIGEN_TYPE_OFFSET;
}
--
2.34.1
next reply other threads:[~2024-07-20 1:30 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-20 1:35 Yipeng Zou [this message]
2024-07-29 10:15 ` Thomas Gleixner
2024-07-30 1:43 ` Yipeng Zou
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=20240720013538.3251995-1-zouyipeng@huawei.com \
--to=zouyipeng@huawei.com \
--cc=guohanjun@huawei.com \
--cc=liaochang1@huawei.com \
--cc=linux-kernel@vger.kernel.org \
--cc=majun258@huawei.com \
--cc=maz@kernel.org \
--cc=tglx@linutronix.de \
--cc=wangwudi@hisilicon.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
all inboxes | Powered by JetHome®