Skip to contentSkip to conversation

irqchip/mbigen: bugfixs

PATCH In review Hanjun Guo 4 participants 9 messages May 12, 2017 irqchip drivers

lore
Share & tools
lore

Hanjun Guo

author
#0 lore raw

v2 cover irqchip/mbigen: bugfixs

From: Hanjun Guo <[email protected]>

Here are 3 bugfixes for mbigen:

Patch 1 is a critical bugfix which to fix the mbigen probe failure, commit 216646e4d82e ("irqchip/mbigen: Fix return value check in mbigen_device_probe()") introduced this breakage;

Patch 2 fixes a potential NULL dereferencing;

Patch 3 fixes a wrong clear register offset;

v1 -> v2:
- Rebase on top of lastest Linus tree (09d79d1 Merge tag 'docs-4.12-2' of git://git.lwn.net/linux);

- Fix a checkpatch error.

Thanks
Hanjun

Hanjun Guo (2):
irqchip/mbigen: Fix memory mapping code irqchip/mbigen: Fix potential NULL dereferencing

MaJun (1):
irqchip/mbigen: Fix the clear register offset

 drivers/irqchip/irq-mbigen.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)
Signature · 1 line
1.7.12.4
author
#1 lore raw

PATCH v2 1/3 irqchip/mbigen: Fix memory mapping code

From: Hanjun Guo <[email protected]>

Some mbigens share memory regions, and devm_ioremap_resource does not allow to share resources which will break the probe of mbigen, in opposition to devm_ioremap.

This patch restores back usage of devm_ioremap function, but with proper error handling and logging.

Fixes 216646e4d82e ("irqchip/mbigen: Fix return value check in mbigen_device_probe()")
---
 drivers/irqchip/irq-mbigen.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/irqchip/irq-mbigen.c +6 -3
index d2306c8..0f5e66e 100644
@@ -337,9 +337,12 @@ static int mbigen_device_probe(struct platform_device *pdev)
 	mgn_chip->pdev = pdev;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	mgn_chip->base = devm_ioremap_resource(&pdev->dev, res);
-	if (IS_ERR(mgn_chip->base))
-		return PTR_ERR(mgn_chip->base);
+	mgn_chip->base = devm_ioremap(&pdev->dev, res->start,
+				      resource_size(res));
+	if (!mgn_chip->base) {
+		dev_err(&pdev->dev, "failed to ioremap %pR\n", res);
+		return -ENOMEM;
+	}
 
 	if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node)
 		err = mbigen_of_create_domain(pdev, mgn_chip);
Signature · 1 line
1.7.12.4
#2 lore raw

[tip:irq/urgent] irqchip/mbigen: Fix memory mapping code

irqchip/mbigen: Fix memory mapping code
Commit-ID:  5ba9b0a14132d0b8d97affe909f324045a968d03
Gitweb:     http://git.kernel.org/tip/5ba9b0a14132d0b8d97affe909f324045a968d03
Author:     Hanjun Guo <[email protected]>
AuthorDate: Fri, 12 May 2017 11:55:26 +0800
Committer:  Thomas Gleixner <[email protected]>
CommitDate: Fri, 12 May 2017 10:25:37 +0200

irqchip/mbigen: Fix memory mapping code

Some mbigens share memory regions, and devm_ioremap_resource does not allow to share resources which will break the probe of mbigen, in opposition to devm_ioremap.

This patch restores back usage of devm_ioremap function, but with proper error handling and logging.

Fixes 216646e4d82e ("irqchip/mbigen: Fix return value check in mbigen_device_probe()")
Cc Kefeng Wang <[email protected]>
Cc Wei Yongjun <[email protected]>
---
 drivers/irqchip/irq-mbigen.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/irqchip/irq-mbigen.c +6 -3
index d2306c8..0f5e66e 100644
@@ -337,9 +337,12 @@ static int mbigen_device_probe(struct platform_device *pdev)
 	mgn_chip->pdev = pdev;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	mgn_chip->base = devm_ioremap_resource(&pdev->dev, res);
-	if (IS_ERR(mgn_chip->base))
-		return PTR_ERR(mgn_chip->base);
+	mgn_chip->base = devm_ioremap(&pdev->dev, res->start,
+				      resource_size(res));
+	if (!mgn_chip->base) {
+		dev_err(&pdev->dev, "failed to ioremap %pR\n", res);
+		return -ENOMEM;
+	}
 
 	if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node)
 		err = mbigen_of_create_domain(pdev, mgn_chip);
author
#3 lore raw

PATCH v2 2/3 irqchip/mbigen: Fix potential NULL dereferencing

In reply to Hanjun Guo

From: Hanjun Guo <[email protected]>

platform_get_resource() may return NULL, add proper check to avoid potential NULL dereferencing.

---
 drivers/irqchip/irq-mbigen.c | 3 +++
 1 file changed, 3 insertions(+)
drivers/irqchip/irq-mbigen.c +3 -0
index 0f5e66e..2fa1e45 100644
@@ -337,6 +337,9 @@ static int mbigen_device_probe(struct platform_device *pdev)
 	mgn_chip->pdev = pdev;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res)
+		return -EINVAL;
+
 	mgn_chip->base = devm_ioremap(&pdev->dev, res->start,
 				      resource_size(res));
 	if (!mgn_chip->base) {
Signature · 1 line
1.7.12.4
#4 lore raw

[tip:irq/urgent] irqchip/mbigen: Fix potential NULL dereferencing

irqchip/mbigen: Fix potential NULL dereferencing
Commit-ID:  ad7cc3c0c57d77b442db323056354d0e49833569
Gitweb:     http://git.kernel.org/tip/ad7cc3c0c57d77b442db323056354d0e49833569
Author:     Hanjun Guo <[email protected]>
AuthorDate: Fri, 12 May 2017 11:55:27 +0800
Committer:  Thomas Gleixner <[email protected]>
CommitDate: Fri, 12 May 2017 10:25:37 +0200

irqchip/mbigen: Fix potential NULL dereferencing

platform_get_resource() may return NULL, add proper check to avoid potential NULL dereferencing.

---
 drivers/irqchip/irq-mbigen.c | 3 +++
 1 file changed, 3 insertions(+)
drivers/irqchip/irq-mbigen.c +3 -0
index 0f5e66e..2fa1e45 100644
@@ -337,6 +337,9 @@ static int mbigen_device_probe(struct platform_device *pdev)
 	mgn_chip->pdev = pdev;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res)
+		return -EINVAL;
+
 	mgn_chip->base = devm_ioremap(&pdev->dev, res->start,
 				      resource_size(res));
 	if (!mgn_chip->base) {
author
#5 lore raw

PATCH v2 3/3 irqchip/mbigen: Fix the clear register offset

In reply to Hanjun Guo

From: MaJun <[email protected]>

Don't minus reserved interrupts (64) when get the clear register offset, because the clear register space includes the space of these 64 interrupts.

This bug wasn't discovered until we running the driver on a new platform with an updated firmware. It turns out that there is a timeout mechanism to clear the register in the mbigen which is for debug purpose and should be turned off, but because of configuration mistake in firmware, this function was turned on and covered up the bug in clear offset calculate, it's time to fix it now.

Fixes a6c2f87b8820 ("irqchip/mbigen: Implement the mbigen irq chip operation functions")
---
 drivers/irqchip/irq-mbigen.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)
drivers/irqchip/irq-mbigen.c +1 -4
index 2fa1e45..57a860c 100644
@@ -106,10 +106,7 @@ static inline void get_mbigen_type_reg(irq_hw_number_t hwirq,
 static inline void get_mbigen_clear_reg(irq_hw_number_t hwirq,
 					u32 *mask, u32 *addr)
 {
-	unsigned int ofst;
-
-	hwirq -= RESERVED_IRQ_PER_MBIGEN_CHIP;
-	ofst = hwirq / 32 * 4;
+	unsigned int ofst = hwirq / 32 * 4;
 
 	*mask = 1 << (hwirq % 32);
 	*addr = ofst + REG_MBIGEN_CLEAR_OFFSET;
Signature · 1 line
1.7.12.4
#6 lore raw

[tip:irq/urgent] irqchip/mbigen: Fix the clear register offset calculation

irqchip/mbigen: Fix the clear register offset calculation
Commit-ID:  9459a04b6a5a09967eec94a1b66f0a74312819d9
Gitweb:     http://git.kernel.org/tip/9459a04b6a5a09967eec94a1b66f0a74312819d9
Author:     MaJun <[email protected]>
AuthorDate: Fri, 12 May 2017 11:55:28 +0800
Committer:  Thomas Gleixner <[email protected]>
CommitDate: Fri, 12 May 2017 10:25:38 +0200

irqchip/mbigen: Fix the clear register offset calculation

The register array offset for clearing an interrupt is calculated by:

    offset = (hwirq - RESERVED_IRQ_PER_MBIGEN_CHIP) / 32;

This is wrong because the clear register array includes the reserved interrupts. So the clear operation ends up in the wrong register.

This went unnoticed so far, because the hardware clears the real bit through a timeout mechanism when the hardware is configured in debug mode. That debug mode was enabled on early generations of the hardware, so the problem was papered over.

On newer hardware with updated firmware the debug mode was disabled, so the bits did not get cleared which causes the system to malfunction.

Remove the subtraction of RESERVED_IRQ_PER_MBIGEN_CHIP, so the correct register is accessed.

[ tglx: Rewrote changelog ]

Fixes a6c2f87b8820 ("irqchip/mbigen: Implement the mbigen irq chip operation functions")
Cc Kefeng Wang <[email protected]>
Cc Wei Yongjun <[email protected]>
---
 drivers/irqchip/irq-mbigen.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)
drivers/irqchip/irq-mbigen.c +1 -4
index 2fa1e45..31d6b5a 100644
@@ -106,10 +106,7 @@ static inline void get_mbigen_type_reg(irq_hw_number_t hwirq,
 static inline void get_mbigen_clear_reg(irq_hw_number_t hwirq,
 					u32 *mask, u32 *addr)
 {
-	unsigned int ofst;
-
-	hwirq -= RESERVED_IRQ_PER_MBIGEN_CHIP;
-	ofst = hwirq / 32 * 4;
+	unsigned int ofst = (hwirq / 32) * 4;
 
 	*mask = 1 << (hwirq % 32);
 	*addr = ofst + REG_MBIGEN_CLEAR_OFFSET;
Tested-by on the v2 series
#7 lore raw
In reply to Hanjun Guo

Hi Hanjun,
This patchset is fine to me and make my
D05 machine work again.So,

Thanks
Majun

Quoted 31 lines · Hanjun Guo

From: Hanjun Guo <[email protected]>

Here are 3 bugfixes for mbigen:

Patch 1 is a critical bugfix which to fix the mbigen probe failure, commit 216646e4d82e ("irqchip/mbigen: Fix return value check in mbigen_device_probe()") introduced this breakage;

Patch 2 fixes a potential NULL dereferencing;

Patch 3 fixes a wrong clear register offset;

v1 -> v2:
- Rebase on top of lastest Linus tree (09d79d1 Merge tag 'docs-4.12-2' of git://git.lwn.net/linux);

- Fix a checkpatch error.

Thanks
Hanjun

Hanjun Guo (2):
irqchip/mbigen: Fix memory mapping code irqchip/mbigen: Fix potential NULL dereferencing

MaJun (1):
irqchip/mbigen: Fix the clear register offset

 drivers/irqchip/irq-mbigen.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)
Acked-by on the v2 series
#8 lore raw
In reply to Hanjun Guo
Quoted 25 lines · Hanjun Guo

From: Hanjun Guo <[email protected]>

Here are 3 bugfixes for mbigen:

Patch 1 is a critical bugfix which to fix the mbigen probe failure, commit 216646e4d82e ("irqchip/mbigen: Fix return value check in mbigen_device_probe()") introduced this breakage;

Patch 2 fixes a potential NULL dereferencing;

Patch 3 fixes a wrong clear register offset;

v1 -> v2:
- Rebase on top of lastest Linus tree (09d79d1 Merge tag 'docs-4.12-2' of git://git.lwn.net/linux);

- Fix a checkpatch error.

Thanks
Hanjun

Hanjun Guo (2):
irqchip/mbigen: Fix memory mapping code irqchip/mbigen: Fix potential NULL dereferencing

Quoted 6 lines

MaJun (1):
irqchip/mbigen: Fix the clear register offset

 drivers/irqchip/irq-mbigen.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

For the whole series:

	M.
Signature · 1 line
Jazz is not dead. It just smells funny...