linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/4] add support for MBIGEN generating message based SPIs
@ 2018-10-26  7:51 Yang Yingliang
  2018-10-26  7:51 ` [PATCH v2 1/4] irqchip/gic-v3-mbi: fix uninitialized mbi_lock Yang Yingliang
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Yang Yingliang @ 2018-10-26  7:51 UTC (permalink / raw)
  To: linux-arm-kernel, linux-kernel
  Cc: marc.zyngier, tglx, guohanjun, yangyingliang

Now MBIGENs have pins that used to generate SPIs,
with
5052875 ("irqchip/gic-v3: Add support for Message Based Interrupts as an MSI controller"),
we can support MBIGEN to generate message based SPIs by writing
GICD_SETSPIR. This patchset add support for MBIGEN generating
message based SPIs and a bugfix for MBI driver.


Patch #1 is a bugfix for MBI driver.
Pathc #2 ~ #4 is support for MBIGEN generating message based SPIs.

v2:
Move the doorbell address comments to the top.

Yang Yingliang (4):
  irqchip/gic-v3-mbi: fix uninitialized mbi_lock
  irqchip/mbigen: rename register marcros
  irqchip/mbigen: add support for a MBIGEN generating SPIs
  dt-bindings/irqchip/mbigen: add example of MBIGEN generate SPIs

 .../interrupt-controller/hisilicon,mbigen-v2.txt   | 17 +++++++-
 drivers/irqchip/irq-gic-v3-mbi.c                   |  2 +-
 drivers/irqchip/irq-mbigen.c                       | 47 +++++++++++++++-------
 3 files changed, 50 insertions(+), 16 deletions(-)

-- 
1.8.3



^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 1/4] irqchip/gic-v3-mbi: fix uninitialized mbi_lock
  2018-10-26  7:51 [PATCH v2 0/4] add support for MBIGEN generating message based SPIs Yang Yingliang
@ 2018-10-26  7:51 ` Yang Yingliang
  2018-10-26  7:51 ` [PATCH v2 2/4] irqchip/mbigen: rename register marcros Yang Yingliang
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Yang Yingliang @ 2018-10-26  7:51 UTC (permalink / raw)
  To: linux-arm-kernel, linux-kernel
  Cc: marc.zyngier, tglx, guohanjun, yangyingliang

mbi_lock is uninitialized, use marco DEFINE_MUTEX
to initialize it.

Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
---
 drivers/irqchip/irq-gic-v3-mbi.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/irqchip/irq-gic-v3-mbi.c b/drivers/irqchip/irq-gic-v3-mbi.c
index ad70e7c..fbfa7ff 100644
--- a/drivers/irqchip/irq-gic-v3-mbi.c
+++ b/drivers/irqchip/irq-gic-v3-mbi.c
@@ -24,7 +24,7 @@ struct mbi_range {
 	unsigned long		*bm;
 };
 
-static struct mutex		mbi_lock;
+static DEFINE_MUTEX(mbi_lock);
 static phys_addr_t		mbi_phys_base;
 static struct mbi_range		*mbi_ranges;
 static unsigned int		mbi_range_nr;
-- 
1.8.3



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 2/4] irqchip/mbigen: rename register marcros
  2018-10-26  7:51 [PATCH v2 0/4] add support for MBIGEN generating message based SPIs Yang Yingliang
  2018-10-26  7:51 ` [PATCH v2 1/4] irqchip/gic-v3-mbi: fix uninitialized mbi_lock Yang Yingliang
@ 2018-10-26  7:51 ` Yang Yingliang
  2018-10-26  7:51 ` [PATCH v2 3/4] irqchip/mbigen: add support for a MBIGEN generating SPIs Yang Yingliang
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Yang Yingliang @ 2018-10-26  7:51 UTC (permalink / raw)
  To: linux-arm-kernel, linux-kernel
  Cc: marc.zyngier, tglx, guohanjun, yangyingliang

A MBIGEN can also be used for generating SPIs, so let's
rename register macros to make them more resonable.

The first 64-pins of MBIGEN is used by SPIs, so rename
RESERVED_IRQ_PER_MBIGEN_CHIP to SPI_NUM_PER_MBIGEN_CHIP
and change the comment for this marcro.

Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
---
 drivers/irqchip/irq-mbigen.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/irqchip/irq-mbigen.c b/drivers/irqchip/irq-mbigen.c
index 567b29c..f05998f 100644
--- a/drivers/irqchip/irq-mbigen.c
+++ b/drivers/irqchip/irq-mbigen.c
@@ -30,14 +30,14 @@
 /* Interrupt numbers per mbigen node supported */
 #define IRQS_PER_MBIGEN_NODE		128
 
-/* 64 irqs (Pin0-pin63) are reserved for each mbigen chip */
-#define RESERVED_IRQ_PER_MBIGEN_CHIP	64
+/* 64 irqs (Pin0-pin63) are used for SPIs on each mbigen chip */
+#define SPI_NUM_PER_MBIGEN_CHIP	64
 
 /* The maximum IRQ pin number of mbigen chip(start from 0) */
 #define MAXIMUM_IRQ_PIN_NUM		1407
 
 /**
- * In mbigen vector register
+ * In mbigen lpi vector register
  * bit[21:12]:	event id value
  * bit[11:0]:	device id
  */
@@ -48,7 +48,7 @@
 #define MBIGEN_NODE_OFFSET		0x1000
 
 /* offset of vector register in mbigen node */
-#define REG_MBIGEN_VEC_OFFSET		0x200
+#define REG_MBIGEN_LPI_VEC_OFFSET	0x200
 
 /**
  * offset of clear register in mbigen node
@@ -62,7 +62,7 @@
  * This register is used to configure interrupt
  * trigger type
  */
-#define REG_MBIGEN_TYPE_OFFSET		0x0
+#define REG_MBIGEN_LPI_TYPE_OFFSET	0x0
 
 /**
  * struct mbigen_device - holds the information of mbigen device.
@@ -79,12 +79,12 @@ static inline unsigned int get_mbigen_vec_reg(irq_hw_number_t hwirq)
 {
 	unsigned int nid, pin;
 
-	hwirq -= RESERVED_IRQ_PER_MBIGEN_CHIP;
+	hwirq -= SPI_NUM_PER_MBIGEN_CHIP;
 	nid = hwirq / IRQS_PER_MBIGEN_NODE + 1;
 	pin = hwirq % IRQS_PER_MBIGEN_NODE;
 
 	return pin * 4 + nid * MBIGEN_NODE_OFFSET
-			+ REG_MBIGEN_VEC_OFFSET;
+			+ REG_MBIGEN_LPI_VEC_OFFSET;
 }
 
 static inline void get_mbigen_type_reg(irq_hw_number_t hwirq,
@@ -92,7 +92,7 @@ static inline void get_mbigen_type_reg(irq_hw_number_t hwirq,
 {
 	unsigned int nid, irq_ofst, ofst;
 
-	hwirq -= RESERVED_IRQ_PER_MBIGEN_CHIP;
+	hwirq -= SPI_NUM_PER_MBIGEN_CHIP;
 	nid = hwirq / IRQS_PER_MBIGEN_NODE + 1;
 	irq_ofst = hwirq % IRQS_PER_MBIGEN_NODE;
 
@@ -100,7 +100,7 @@ static inline void get_mbigen_type_reg(irq_hw_number_t hwirq,
 	ofst = irq_ofst / 32 * 4;
 
 	*addr = ofst + nid * MBIGEN_NODE_OFFSET
-		+ REG_MBIGEN_TYPE_OFFSET;
+		+ REG_MBIGEN_LPI_TYPE_OFFSET;
 }
 
 static inline void get_mbigen_clear_reg(irq_hw_number_t hwirq,
@@ -183,7 +183,7 @@ static int mbigen_domain_translate(struct irq_domain *d,
 			return -EINVAL;
 
 		if ((fwspec->param[0] > MAXIMUM_IRQ_PIN_NUM) ||
-			(fwspec->param[0] < RESERVED_IRQ_PER_MBIGEN_CHIP))
+			(fwspec->param[0] < SPI_NUM_PER_MBIGEN_CHIP))
 			return -EINVAL;
 		else
 			*hwirq = fwspec->param[0];
-- 
1.8.3



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 3/4] irqchip/mbigen: add support for a MBIGEN generating SPIs
  2018-10-26  7:51 [PATCH v2 0/4] add support for MBIGEN generating message based SPIs Yang Yingliang
  2018-10-26  7:51 ` [PATCH v2 1/4] irqchip/gic-v3-mbi: fix uninitialized mbi_lock Yang Yingliang
  2018-10-26  7:51 ` [PATCH v2 2/4] irqchip/mbigen: rename register marcros Yang Yingliang
@ 2018-10-26  7:51 ` Yang Yingliang
  2018-10-26  7:51 ` [PATCH v2 4/4] dt-bindings/irqchip/mbigen: add example of MBIGEN generate SPIs Yang Yingliang
  2019-01-09 10:18 ` [PATCH v2 0/4] add support for MBIGEN generating message based SPIs Hanjun Guo
  4 siblings, 0 replies; 8+ messages in thread
From: Yang Yingliang @ 2018-10-26  7:51 UTC (permalink / raw)
  To: linux-arm-kernel, linux-kernel
  Cc: marc.zyngier, tglx, guohanjun, yangyingliang

Now with
5052875 ("irqchip/gic-v3: Add support for Message Based Interrupts as an MSI controller"),
we can support MBIGEN to generate message based SPIs by writing GICD_SETSPIR.

The first 64-pins of each MBIGEN chip is used to generate SPIs, and each
MBIGEN chip has several MBIGEN nodes, every node has 128 pins for generating
LPIs. The total pins are: 64(SPIs) + 128 * node_nr(LPIs). So we can translate
the pin index in a unified way in mbigen_domain_translate().

Also Add TYPE and VEC registers that used by generating SPIs, the driver can
access them when MBIGEN is used to generate SPIs.

Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
---
 drivers/irqchip/irq-mbigen.c | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/drivers/irqchip/irq-mbigen.c b/drivers/irqchip/irq-mbigen.c
index f05998f..72db969 100644
--- a/drivers/irqchip/irq-mbigen.c
+++ b/drivers/irqchip/irq-mbigen.c
@@ -48,6 +48,7 @@
 #define MBIGEN_NODE_OFFSET		0x1000
 
 /* offset of vector register in mbigen node */
+#define REG_MBIGEN_SPI_VEC_OFFSET	0x500
 #define REG_MBIGEN_LPI_VEC_OFFSET	0x200
 
 /**
@@ -62,6 +63,7 @@
  * This register is used to configure interrupt
  * trigger type
  */
+#define REG_MBIGEN_SPI_TYPE_OFFSET	0x400
 #define REG_MBIGEN_LPI_TYPE_OFFSET	0x0
 
 /**
@@ -79,6 +81,9 @@ static inline unsigned int get_mbigen_vec_reg(irq_hw_number_t hwirq)
 {
 	unsigned int nid, pin;
 
+	if (hwirq < SPI_NUM_PER_MBIGEN_CHIP)
+		return (hwirq * 4 + REG_MBIGEN_SPI_VEC_OFFSET);
+
 	hwirq -= SPI_NUM_PER_MBIGEN_CHIP;
 	nid = hwirq / IRQS_PER_MBIGEN_NODE + 1;
 	pin = hwirq % IRQS_PER_MBIGEN_NODE;
@@ -92,6 +97,13 @@ static inline void get_mbigen_type_reg(irq_hw_number_t hwirq,
 {
 	unsigned int nid, irq_ofst, ofst;
 
+	if (hwirq < SPI_NUM_PER_MBIGEN_CHIP) {
+		*mask = 1 << (hwirq % 32);
+		ofst = hwirq / 32 * 4;
+		*addr = ofst + REG_MBIGEN_SPI_TYPE_OFFSET;
+		return;
+	}
+
 	hwirq -= SPI_NUM_PER_MBIGEN_CHIP;
 	nid = hwirq / IRQS_PER_MBIGEN_NODE + 1;
 	irq_ofst = hwirq % IRQS_PER_MBIGEN_NODE;
@@ -162,14 +174,22 @@ static void mbigen_write_msg(struct msi_desc *desc, struct msi_msg *msg)
 	u32 val;
 
 	base += get_mbigen_vec_reg(d->hwirq);
+
+	/*
+	 * The address of GICD_SETSPI_NSR and GITS_TRANSLATER
+	 * is encoded in mbigen register by default. So,we don't
+	 * need to program the doorbell address at here.
+	 */
+	if (d->hwirq < SPI_NUM_PER_MBIGEN_CHIP) {
+		writel_relaxed(msg->data, base);
+		return;
+	}
+
 	val = readl_relaxed(base);
 
 	val &= ~(IRQ_EVENT_ID_MASK << IRQ_EVENT_ID_SHIFT);
 	val |= (msg->data << IRQ_EVENT_ID_SHIFT);
 
-	/* The address of doorbell is encoded in mbigen register by default
-	 * So,we don't need to program the doorbell address at here
-	 */
 	writel_relaxed(val, base);
 }
 
@@ -182,8 +202,7 @@ static int mbigen_domain_translate(struct irq_domain *d,
 		if (fwspec->param_count != 2)
 			return -EINVAL;
 
-		if ((fwspec->param[0] > MAXIMUM_IRQ_PIN_NUM) ||
-			(fwspec->param[0] < SPI_NUM_PER_MBIGEN_CHIP))
+		if (fwspec->param[0] > MAXIMUM_IRQ_PIN_NUM)
 			return -EINVAL;
 		else
 			*hwirq = fwspec->param[0];
-- 
1.8.3



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 4/4] dt-bindings/irqchip/mbigen: add example of MBIGEN generate SPIs
  2018-10-26  7:51 [PATCH v2 0/4] add support for MBIGEN generating message based SPIs Yang Yingliang
                   ` (2 preceding siblings ...)
  2018-10-26  7:51 ` [PATCH v2 3/4] irqchip/mbigen: add support for a MBIGEN generating SPIs Yang Yingliang
@ 2018-10-26  7:51 ` Yang Yingliang
  2019-01-09 10:48   ` Marc Zyngier
  2019-01-09 10:18 ` [PATCH v2 0/4] add support for MBIGEN generating message based SPIs Hanjun Guo
  4 siblings, 1 reply; 8+ messages in thread
From: Yang Yingliang @ 2018-10-26  7:51 UTC (permalink / raw)
  To: linux-arm-kernel, linux-kernel
  Cc: marc.zyngier, tglx, guohanjun, yangyingliang

Now MBIGEN can support to generate SPIs by writing
GICD_SETSPIR. Add dt example to help document.

Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
---
 .../interrupt-controller/hisilicon,mbigen-v2.txt        | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/interrupt-controller/hisilicon,mbigen-v2.txt b/Documentation/devicetree/bindings/interrupt-controller/hisilicon,mbigen-v2.txt
index a6813a0..298c033 100644
--- a/Documentation/devicetree/bindings/interrupt-controller/hisilicon,mbigen-v2.txt
+++ b/Documentation/devicetree/bindings/interrupt-controller/hisilicon,mbigen-v2.txt
@@ -10,7 +10,7 @@ Hisilicon designed mbigen to collect and generate interrupt.
 
 
 Non-pci devices can connect to mbigen and generate the
-interrupt by writing ITS register.
+interrupt by writing GICD or ITS register.
 
 The mbigen chip and devices connect to mbigen have the following properties:
 
@@ -64,6 +64,13 @@ Examples:
 				num-pins = <2>;
 				#interrupt-cells = <2>;
 			};
+
+			mbigen_spi_example:spi_example {
+				interrupt-controller;
+				msi-parent = <&gic>;
+				num-pins = <2>;
+				#interrupt-cells = <2>;
+			};
 	};
 
 Devices connect to mbigen required properties:
@@ -82,3 +89,11 @@ Examples:
 		interrupts =	<656 1>,
 				<657 1>;
 	};
+
+	spi_example: spi0@0 {
+		compatible = "spi,example";
+		reg = <0 0 0 0>;
+		interrupt-parent = <&mbigen_spi_example>;
+		interrupts = <13 4>,
+			     <14 4>;
+	};
-- 
1.8.3



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 0/4] add support for MBIGEN generating message based SPIs
  2018-10-26  7:51 [PATCH v2 0/4] add support for MBIGEN generating message based SPIs Yang Yingliang
                   ` (3 preceding siblings ...)
  2018-10-26  7:51 ` [PATCH v2 4/4] dt-bindings/irqchip/mbigen: add example of MBIGEN generate SPIs Yang Yingliang
@ 2019-01-09 10:18 ` Hanjun Guo
  2019-01-09 10:33   ` Marc Zyngier
  4 siblings, 1 reply; 8+ messages in thread
From: Hanjun Guo @ 2019-01-09 10:18 UTC (permalink / raw)
  To: Yang Yingliang, linux-arm-kernel, linux-kernel
  Cc: marc.zyngier, tglx, Linuxarm

Hi Marc,

Sorry for ping you...

On 2018/10/26 15:51, Yang Yingliang wrote:
> Now MBIGENs have pins that used to generate SPIs,
> with
> 5052875 ("irqchip/gic-v3: Add support for Message Based Interrupts as an MSI controller"),
> we can support MBIGEN to generate message based SPIs by writing
> GICD_SETSPIR. This patchset add support for MBIGEN generating
> message based SPIs and a bugfix for MBI driver.

What's you suggestion for this patch set? We would like your input
for next steps.

> 
> 
> Patch #1 is a bugfix for MBI driver.

At least this patch can be merged first as it's an obvious bug,
without this patch, the MBI dirver can't work I think because
the mutex lock is not initialized.

Thanks
Hanjun


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 0/4] add support for MBIGEN generating message based SPIs
  2019-01-09 10:18 ` [PATCH v2 0/4] add support for MBIGEN generating message based SPIs Hanjun Guo
@ 2019-01-09 10:33   ` Marc Zyngier
  0 siblings, 0 replies; 8+ messages in thread
From: Marc Zyngier @ 2019-01-09 10:33 UTC (permalink / raw)
  To: Hanjun Guo, Yang Yingliang, linux-arm-kernel, linux-kernel; +Cc: tglx, Linuxarm

Hi Hanjun,

On 09/01/2019 10:18, Hanjun Guo wrote:
> Hi Marc,
> 
> Sorry for ping you...
> 
> On 2018/10/26 15:51, Yang Yingliang wrote:
>> Now MBIGENs have pins that used to generate SPIs,
>> with
>> 5052875 ("irqchip/gic-v3: Add support for Message Based Interrupts as an MSI controller"),
>> we can support MBIGEN to generate message based SPIs by writing
>> GICD_SETSPIR. This patchset add support for MBIGEN generating
>> message based SPIs and a bugfix for MBI driver.
> 
> What's you suggestion for this patch set? We would like your input
> for next steps.
> 
>>
>>
>> Patch #1 is a bugfix for MBI driver.
> 
> At least this patch can be merged first as it's an obvious bug,
> without this patch, the MBI dirver can't work I think because
> the mutex lock is not initialized.

I dropped the ball on that one. Let me have a quick look.

Thanks,

	M.
-- 
Jazz is not dead. It just smells funny...

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 4/4] dt-bindings/irqchip/mbigen: add example of MBIGEN generate SPIs
  2018-10-26  7:51 ` [PATCH v2 4/4] dt-bindings/irqchip/mbigen: add example of MBIGEN generate SPIs Yang Yingliang
@ 2019-01-09 10:48   ` Marc Zyngier
  0 siblings, 0 replies; 8+ messages in thread
From: Marc Zyngier @ 2019-01-09 10:48 UTC (permalink / raw)
  To: Yang Yingliang, linux-arm-kernel, linux-kernel
  Cc: tglx, guohanjun, Rob Herring

On 26/10/2018 08:51, Yang Yingliang wrote:
> Now MBIGEN can support to generate SPIs by writing
> GICD_SETSPIR. Add dt example to help document.
> 
> Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
> ---
>  .../interrupt-controller/hisilicon,mbigen-v2.txt        | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/Documentation/devicetree/bindings/interrupt-controller/hisilicon,mbigen-v2.txt b/Documentation/devicetree/bindings/interrupt-controller/hisilicon,mbigen-v2.txt
> index a6813a0..298c033 100644
> --- a/Documentation/devicetree/bindings/interrupt-controller/hisilicon,mbigen-v2.txt
> +++ b/Documentation/devicetree/bindings/interrupt-controller/hisilicon,mbigen-v2.txt
> @@ -10,7 +10,7 @@ Hisilicon designed mbigen to collect and generate interrupt.
>  
>  
>  Non-pci devices can connect to mbigen and generate the
> -interrupt by writing ITS register.
> +interrupt by writing GICD or ITS register.
>  
>  The mbigen chip and devices connect to mbigen have the following properties:
>  
> @@ -64,6 +64,13 @@ Examples:
>  				num-pins = <2>;
>  				#interrupt-cells = <2>;
>  			};
> +
> +			mbigen_spi_example:spi_example {
> +				interrupt-controller;
> +				msi-parent = <&gic>;
> +				num-pins = <2>;
> +				#interrupt-cells = <2>;
> +			};
>  	};
>  
>  Devices connect to mbigen required properties:
> @@ -82,3 +89,11 @@ Examples:
>  		interrupts =	<656 1>,
>  				<657 1>;
>  	};
> +
> +	spi_example: spi0@0 {
> +		compatible = "spi,example";
> +		reg = <0 0 0 0>;
> +		interrupt-parent = <&mbigen_spi_example>;
> +		interrupts = <13 4>,
> +			     <14 4>;
> +	};
> 

I'd like an Ack of some sort from one of the DT maintainer. Rob?

Thanks,
	
	M.
-- 
Jazz is not dead. It just smells funny...

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2019-01-09 10:48 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-26  7:51 [PATCH v2 0/4] add support for MBIGEN generating message based SPIs Yang Yingliang
2018-10-26  7:51 ` [PATCH v2 1/4] irqchip/gic-v3-mbi: fix uninitialized mbi_lock Yang Yingliang
2018-10-26  7:51 ` [PATCH v2 2/4] irqchip/mbigen: rename register marcros Yang Yingliang
2018-10-26  7:51 ` [PATCH v2 3/4] irqchip/mbigen: add support for a MBIGEN generating SPIs Yang Yingliang
2018-10-26  7:51 ` [PATCH v2 4/4] dt-bindings/irqchip/mbigen: add example of MBIGEN generate SPIs Yang Yingliang
2019-01-09 10:48   ` Marc Zyngier
2019-01-09 10:18 ` [PATCH v2 0/4] add support for MBIGEN generating message based SPIs Hanjun Guo
2019-01-09 10:33   ` Marc Zyngier

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).