Skip to contentSkip to conversation

irqchip/sg2042-msi: Set irq type according to DT configuration

PATCH Superseded Chen Wang 3 participants 8 messages Aug 25, 2025

Subsystems (4)

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore

Chen Wang

author
#0 lore raw

cover irqchip/sg2042-msi: Set irq type according to DT configuration

From: Chen Wang <[email protected]>

The original MSI interrupt type was hard-coded, which was not a good idea. Now it is changed to read the device tree configuration and then set the interrupt type.

Also improve the code to obtain msi-ranges parameters in this patchset.

This patchset is based on irq/drivers branch of tip.

Chen Wang (4):
irqchip/sg2042-msi: Improve the logic of obtaining msi-ranges
parameters
irqchip/sg2042-msi: Set irq type according to DT configuration
riscv: sophgo: dts: sg2042: change msi irq type to
IRQ_TYPE_EDGE_RISING
riscv: sophgo: dts: sg2044: change msi irq type to
IRQ_TYPE_EDGE_RISING

 arch/riscv/boot/dts/sophgo/sg2042.dtsi |  2 +-
 arch/riscv/boot/dts/sophgo/sg2044.dtsi |  2 +-
 drivers/irqchip/irq-sg2042-msi.c       | 21 ++++++++-------------
 3 files changed, 10 insertions(+), 15 deletions(-)

base-commit: 8ff1c16c753e293c3ba20583cb64f81ea7b9a451

Signature · 1 line
2.34.1
author
#1 lore raw

PATCH 1/4 irqchip/sg2042-msi: Improve the logic of obtaining msi-ranges parameters

From: Chen Wang <[email protected]>

Get the arguments of msi-ranges by specifying nargs directly instead of using nargs_prop. This only takes one step, unlike the previous two steps to get the values of all the arguments.

---
 drivers/irqchip/irq-sg2042-msi.c | 14 +++-----------
 1 file changed, 3 insertions(+), 11 deletions(-)
drivers/irqchip/irq-sg2042-msi.c +3 -11
index 3b13dbbfdb51..5249afd93b4a 100644
@@ -276,17 +276,9 @@ static int sg2042_msi_probe(struct platform_device *pdev)
 	data->doorbell_addr = res->start;
 
 	ret = fwnode_property_get_reference_args(dev_fwnode(dev), "msi-ranges",
-						 "#interrupt-cells", 0, 0, &args);
+						 NULL, 3, 0, &args);
 	if (ret) {
-		dev_err(dev, "Unable to parse MSI vec base\n");
-		return ret;
-	}
-	fwnode_handle_put(args.fwnode);
-
-	ret = fwnode_property_get_reference_args(dev_fwnode(dev), "msi-ranges", NULL,
-						 args.nargs + 1, 0, &args);
-	if (ret) {
-		dev_err(dev, "Unable to parse MSI vec number\n");
+		dev_err(dev, "Unable to parse MSI Ranges\n");
 		return ret;
 	}
 
@@ -298,7 +290,7 @@ static int sg2042_msi_probe(struct platform_device *pdev)
 	}
 
 	data->irq_first = (u32)args.args[0];
-	data->num_irqs = (u32)args.args[args.nargs - 1];
+	data->num_irqs = (u32)args.args[2];
 
 	mutex_init(&data->msi_map_lock);
 
Signature · 1 line
2.34.1
maintainer
#2 lore raw

Re: [PATCH 1/4] irqchip/sg2042-msi: Improve the logic of obtaining msi-ranges parameters

Quoted 16 lines · Chen Wang

From: Chen Wang <[email protected]>

Get the arguments of msi-ranges by specifying nargs directly instead of using nargs_prop. This only takes one step, unlike the previous two steps to get the values of all the arguments.

---
 drivers/irqchip/irq-sg2042-msi.c | 14 +++-----------
 1 file changed, 3 insertions(+), 11 deletions(-)
drivers/irqchip/irq-sg2042-msi.c +0 -0
index 3b13dbbfdb51..5249afd93b4a 100644

drivers/irqchip/irq-sg2042-msi.c static int sg2042_msi_probe(struct platform_device *pdev) · line 280

Quoted 6 lines
drivers/irqchip/irq-sg2042-msi.c +1 -1
@@ -276,17 +276,9 @@ static int sg2042_msi_probe(struct platform_device *pdev)
 	data->doorbell_addr = res->start;
 
 
 	ret = fwnode_property_get_reference_args(dev_fwnode(dev), "msi-ranges",
-						 "#interrupt-cells", 0, 0, &args);
+						 NULL, 3, 0, &args);

Why using a fixed range here? I see no improvement. I think using #interrupt-cells is just OK.

Regards,
Inochi

Quoted 26 lines
drivers/irqchip/irq-sg2042-msi.c +2 -10
 	if (ret) {
-		dev_err(dev, "Unable to parse MSI vec base\n");
-		return ret;
-	}
-	fwnode_handle_put(args.fwnode);
-
-	ret = fwnode_property_get_reference_args(dev_fwnode(dev), "msi-ranges", NULL,
-						 args.nargs + 1, 0, &args);
-	if (ret) {
-		dev_err(dev, "Unable to parse MSI vec number\n");
+		dev_err(dev, "Unable to parse MSI Ranges\n");
 		return ret;
 	}
@@ -298,7 +290,7 @@ static int sg2042_msi_probe(struct platform_device *pdev)
 	}
 
 	data->irq_first = (u32)args.args[0];
-	data->num_irqs = (u32)args.args[args.nargs - 1];
+	data->num_irqs = (u32)args.args[2];
 
 	mutex_init(&data->msi_map_lock);
 
Signature · 1 line
2.34.1
#3 lore raw

Re: [PATCH 1/4] irqchip/sg2042-msi: Improve the logic of obtaining msi-ranges parameters

Quoted 19 lines · Inochi Amaoto
Quoted 18 lines · Chen Wang

From: Chen Wang <[email protected]>

Get the arguments of msi-ranges by specifying nargs directly instead of using nargs_prop. This only takes one step, unlike the previous two steps to get the values of all the arguments.

---
  drivers/irqchip/irq-sg2042-msi.c | 14 +++-----------
  1 file changed, 3 insertions(+), 11 deletions(-)
drivers/irqchip/irq-sg2042-msi.c +0 -0
index 3b13dbbfdb51..5249afd93b4a 100644
@@ -276,17 +276,9 @@ static int sg2042_msi_probe(struct platform_device *pdev)
  	data->doorbell_addr = res->start;
 
Quoted 5 lines

drivers/irqchip/irq-sg2042-msi.c static int sg2042_msi_probe(struct platform_device *pdev) · line 279

Quoted 3 lines
drivers/irqchip/irq-sg2042-msi.c +1 -1
  	ret = fwnode_property_get_reference_args(dev_fwnode(dev), "msi-ranges",
-						 "#interrupt-cells", 0, 0, &args);
+						 NULL, 3, 0, &args);

Why using a fixed range here? I see no improvement. I think using #interrupt-cells is just OK.

Ok, I will revert this change.

Quoted 29 lines

Regards,
Inochi

Quoted 26 lines
drivers/irqchip/irq-sg2042-msi.c +2 -10
  	if (ret) {
-		dev_err(dev, "Unable to parse MSI vec base\n");
-		return ret;
-	}
-	fwnode_handle_put(args.fwnode);
-
-	ret = fwnode_property_get_reference_args(dev_fwnode(dev), "msi-ranges", NULL,
-						 args.nargs + 1, 0, &args);
-	if (ret) {
-		dev_err(dev, "Unable to parse MSI vec number\n");
+		dev_err(dev, "Unable to parse MSI Ranges\n");
  		return ret;
  	}
 
@@ -298,7 +290,7 @@ static int sg2042_msi_probe(struct platform_device *pdev)
  	}
 
  	data->irq_first = (u32)args.args[0];
-	data->num_irqs = (u32)args.args[args.nargs - 1];
+	data->num_irqs = (u32)args.args[2];
 
  	mutex_init(&data->msi_map_lock);
 
Signature · 1 line
2.34.1
author
#4 lore raw

PATCH 2/4 irqchip/sg2042-msi: Set irq type according to DT configuration

In reply to Chen Wang

From: Chen Wang <[email protected]>

The original MSI interrupt type was hard-coded, which was not a good idea. Now it is changed to read the device tree configuration and then set the interrupt type.

---
 drivers/irqchip/irq-sg2042-msi.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/irqchip/irq-sg2042-msi.c +5 -2
index 5249afd93b4a..be47c038386c 100644
@@ -30,6 +30,7 @@ struct sg204x_msi_chip_info {
  * @doorbell_addr:	see TRM, 10.1.32, GP_INTR0_SET
  * @irq_first:		First vectors number that MSIs starts
  * @num_irqs:		Number of vectors for MSIs
+ * @irq_type:		IRQ type for MSIs
  * @msi_map:		mapping for allocated MSI vectors.
  * @msi_map_lock:	Lock for msi_map
  * @chip_info:		chip specific infomations
@@ -41,6 +42,7 @@ struct sg204x_msi_chipdata {
 
 	u32					irq_first;
 	u32					num_irqs;
+	unsigned int				irq_type;
 
 	unsigned long				*msi_map;
 	struct mutex				msi_map_lock;
@@ -137,14 +139,14 @@ static int sg204x_msi_parent_domain_alloc(struct irq_domain *domain, unsigned in
 	fwspec.fwnode = domain->parent->fwnode;
 	fwspec.param_count = 2;
 	fwspec.param[0] = data->irq_first + hwirq;
-	fwspec.param[1] = IRQ_TYPE_EDGE_RISING;
+	fwspec.param[1] = data->irq_type;
 
 	ret = irq_domain_alloc_irqs_parent(domain, virq, 1, &fwspec);
 	if (ret)
 		return ret;
 
 	d = irq_domain_get_irq_data(domain->parent, virq);
-	return d->chip->irq_set_type(d, IRQ_TYPE_EDGE_RISING);
+	return d->chip->irq_set_type(d, data->irq_type);
 }
 
 static int sg204x_msi_middle_domain_alloc(struct irq_domain *domain, unsigned int virq,
@@ -290,6 +292,7 @@ static int sg2042_msi_probe(struct platform_device *pdev)
 	}
 
 	data->irq_first = (u32)args.args[0];
+	data->irq_type = (unsigned int)args.args[1];
 	data->num_irqs = (u32)args.args[2];
 
 	mutex_init(&data->msi_map_lock);
Signature · 1 line
2.34.1
author
#5 lore raw

PATCH 3/4 riscv: sophgo: dts: sg2042: change msi irq type to IRQ_TYPE_EDGE_RISING

In reply to Chen Wang

From: Chen Wang <[email protected]>

The latest MSI driver will read the DTS configuration to set the IRQ type, so correct the IRQ type in the DTS to the correct value.

This field in the DTS was not used before.

---
 arch/riscv/boot/dts/sophgo/sg2042.dtsi | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/boot/dts/sophgo/sg2042.dtsi +1 -1
index b3e4d3c18fdc..6430c6e25c00 100644
@@ -190,7 +190,7 @@ msi: msi-controller@7030010304 {
 			reg-names = "clr", "doorbell";
 			msi-controller;
 			#msi-cells = <0>;
-			msi-ranges = <&intc 64 IRQ_TYPE_LEVEL_HIGH 32>;
+			msi-ranges = <&intc 64 IRQ_TYPE_EDGE_RISING 32>;
 		};
 
 		rpgate: clock-controller@7030010368 {
Signature · 1 line
2.34.1
author
#6 lore raw

PATCH 4/4 riscv: sophgo: dts: sg2044: change msi irq type to IRQ_TYPE_EDGE_RISING

In reply to Chen Wang

From: Chen Wang <[email protected]>

The latest MSI driver will read the DTS configuration to set the IRQ type, so correct the IRQ type in the DTS to the correct value.

This field in the DTS was not used before.

---
 arch/riscv/boot/dts/sophgo/sg2044.dtsi | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/boot/dts/sophgo/sg2044.dtsi +1 -1
index 6ec955744b0c..320c4d1d08e6 100644
@@ -214,7 +214,7 @@ msi: msi-controller@6d50000000 {
 			reg-names = "clr", "doorbell";
 			#msi-cells = <0>;
 			msi-controller;
-			msi-ranges = <&intc 352 IRQ_TYPE_LEVEL_HIGH 512>;
+			msi-ranges = <&intc 352 IRQ_TYPE_EDGE_RISING 512>;
 			status = "disabled";
 		};
 
Signature · 1 line
2.34.1
#7 lore raw

Re: [PATCH 4/4] riscv: sophgo: dts: sg2044: change msi irq type to IRQ_TYPE_EDGE_RISING

Hi, Inochi,

Please help review and test this with SG2044 board, I only have pioneerbox/SG2042 and it's tested and works.

Thanks,

Chen

Quoted 25 lines · Chen Wang

From: Chen Wang <[email protected]>

The latest MSI driver will read the DTS configuration to set the IRQ type, so correct the IRQ type in the DTS to the correct value.

This field in the DTS was not used before.

---
  arch/riscv/boot/dts/sophgo/sg2044.dtsi | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/boot/dts/sophgo/sg2044.dtsi +1 -1
index 6ec955744b0c..320c4d1d08e6 100644
@@ -214,7 +214,7 @@ msi: msi-controller@6d50000000 {
  			reg-names = "clr", "doorbell";
  			#msi-cells = <0>;
  			msi-controller;
-			msi-ranges = <&intc 352 IRQ_TYPE_LEVEL_HIGH 512>;
+			msi-ranges = <&intc 352 IRQ_TYPE_EDGE_RISING 512>;
  			status = "disabled";
  		};