linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RESEND PATCH v6 00/10] A bunch of fix and optimization patches in spmi-pmic-arb.c
@ 2022-06-12  3:24 Fenglin Wu
  2022-06-12  3:24 ` [RESEND PATCH v6 01/10] spmi: pmic-arb: add a print in cleanup_irq Fenglin Wu
                   ` (9 more replies)
  0 siblings, 10 replies; 23+ messages in thread
From: Fenglin Wu @ 2022-06-12  3:24 UTC (permalink / raw)
  To: linux-arm-msm, linux-kernel, sboyd
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz

Changes in v6:
  Rebased [v5 08/10] on 
    https://lore.kernel.org/linux-arm-msm/20211227170151.73116-1-david@ixit.cz/#t

Changes in v5:
  Drop [v4 11/11] because of a similar change is under review:
    https://lore.kernel.org/linux-arm-msm/YdRJcv2kpp1vgUTb@robh.at.kernel.org/T/#t

Changes in v4:
  In [v4 02/11], separated spurious interrupt handling.
  In [v4 03/11], added Fixes tag for ("spmi: pmic-arb: do not ack and clear peripheral").
  In [v4 11/11], updated the binding to address few warnings in "make dtbs_check"

Changes in v3:
  Drop [v2 07/10] as this is no longer needed after this change:
		50fc4c8cd240 ("spmi: spmi-pmic-arb: fix irq_set_type race condition")
  In [v3 07/10], updated the author email to match with Signed-off-by.
  In [v3 10/10], added the binding change in this series, and addressed issues in "make dt_binding_check"

Changes in v2:
  In [v2 01/10], added code to handle spurious interrupt.
  In [v2 03/10], adressed minor comments to update the code logic.
  In [v2 04/10], minor update to detect spurious interrupt.
  In [v2 05/10], added Fixes tag.
  In [v2 07/10], added Fixes tag and updated commit text to explain the problem.
  In [v2 08/10], added binding change to make interrupt properties as optional.
  In [v2 09/10], updated to check presence of "interrupt-controller" property.


Abhijeet Dharmapurikar (1):
  spmi: pmic-arb: add a print in cleanup_irq

Ashay Jaiswal (1):
  spmi: pmic-arb: add support to dispatch interrupt based on IRQ status

David Collins (6):
  spmi: pmic-arb: check apid against limits before calling irq handler
  spmi: pmic-arb: correct duplicate APID to PPID mapping logic
  spmi: pmic-arb: block access for invalid PMIC arbiter v5 SPMI writes
  dt-bindings: spmi: spmi-pmic-arb: make interrupt properties as
    optional
  spmi: pmic-arb: make interrupt support optional
  spmi: pmic-arb: increase SPMI transaction timeout delay

Fenglin Wu (1):
  spmi: pmic-arb: handle spurious interrupt

Subbaraman Narayanamurthy (1):
  spmi: pmic-arb: do not ack and clear peripheral interrupts in
    cleanup_irq

 .../bindings/spmi/qcom,spmi-pmic-arb.yaml          |   3 -
 drivers/spmi/spmi-pmic-arb.c                       | 136 +++++++++++++++------
 2 files changed, 96 insertions(+), 43 deletions(-)

-- 
2.7.4


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

* [RESEND PATCH v6 01/10] spmi: pmic-arb: add a print in cleanup_irq
  2022-06-12  3:24 [RESEND PATCH v6 00/10] A bunch of fix and optimization patches in spmi-pmic-arb.c Fenglin Wu
@ 2022-06-12  3:24 ` Fenglin Wu
  2022-08-31 17:39   ` Stephen Boyd
  2022-06-12  3:24 ` [RESEND PATCH v6 02/10] spmi: pmic-arb: handle spurious interrupt Fenglin Wu
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 23+ messages in thread
From: Fenglin Wu @ 2022-06-12  3:24 UTC (permalink / raw)
  To: linux-arm-msm, linux-kernel, sboyd
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz,
	Abhijeet Dharmapurikar, David Collins

From: Abhijeet Dharmapurikar <adharmap@codeaurora.org>

The cleanup_irq() was meant to clear and mask interrupts that were
left enabled in the hardware but there was no interrupt handler
registered for it. Add an error print when it gets invoked.

Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
Signed-off-by: David Collins <collinsd@codeaurora.org>
Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
---
 drivers/spmi/spmi-pmic-arb.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c
index 2113be4..5a99723 100644
--- a/drivers/spmi/spmi-pmic-arb.c
+++ b/drivers/spmi/spmi-pmic-arb.c
@@ -590,6 +590,8 @@ static void cleanup_irq(struct spmi_pmic_arb *pmic_arb, u16 apid, int id)
 	u8 per = ppid & 0xFF;
 	u8 irq_mask = BIT(id);
 
+	dev_err_ratelimited(&pmic_arb->spmic->dev, "%s apid=%d sid=0x%x per=0x%x irq=%d\n",
+			__func__, apid, sid, per, id);
 	writel_relaxed(irq_mask, pmic_arb->ver_ops->irq_clear(pmic_arb, apid));
 
 	if (pmic_arb_write_cmd(pmic_arb->spmic, SPMI_CMD_EXT_WRITEL, sid,
-- 
2.7.4


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

* [RESEND PATCH v6 02/10] spmi: pmic-arb: handle spurious interrupt
  2022-06-12  3:24 [RESEND PATCH v6 00/10] A bunch of fix and optimization patches in spmi-pmic-arb.c Fenglin Wu
  2022-06-12  3:24 ` [RESEND PATCH v6 01/10] spmi: pmic-arb: add a print in cleanup_irq Fenglin Wu
@ 2022-06-12  3:24 ` Fenglin Wu
  2022-08-31 17:39   ` Stephen Boyd
  2022-06-12  3:24 ` [RESEND PATCH v6 03/10] spmi: pmic-arb: do not ack and clear peripheral interrupts in cleanup_irq Fenglin Wu
                   ` (7 subsequent siblings)
  9 siblings, 1 reply; 23+ messages in thread
From: Fenglin Wu @ 2022-06-12  3:24 UTC (permalink / raw)
  To: linux-arm-msm, linux-kernel, sboyd
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz

Call handle_bad_irq() when the summary interrupt is fired spuriously.

Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
---
 drivers/spmi/spmi-pmic-arb.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c
index 5a99723..719bd73 100644
--- a/drivers/spmi/spmi-pmic-arb.c
+++ b/drivers/spmi/spmi-pmic-arb.c
@@ -605,10 +605,11 @@ static void cleanup_irq(struct spmi_pmic_arb *pmic_arb, u16 apid, int id)
 				irq_mask, ppid);
 }
 
-static void periph_interrupt(struct spmi_pmic_arb *pmic_arb, u16 apid)
+static int periph_interrupt(struct spmi_pmic_arb *pmic_arb, u16 apid)
 {
 	unsigned int irq;
 	u32 status, id;
+	int handled = 0;
 	u8 sid = (pmic_arb->apid_data[apid].ppid >> 8) & 0xF;
 	u8 per = pmic_arb->apid_data[apid].ppid & 0xFF;
 
@@ -623,7 +624,10 @@ static void periph_interrupt(struct spmi_pmic_arb *pmic_arb, u16 apid)
 			continue;
 		}
 		generic_handle_irq(irq);
+		handled++;
 	}
+
+	return handled;
 }
 
 static void pmic_arb_chained_irq(struct irq_desc *desc)
@@ -634,7 +638,7 @@ static void pmic_arb_chained_irq(struct irq_desc *desc)
 	int first = pmic_arb->min_apid >> 5;
 	int last = pmic_arb->max_apid >> 5;
 	u8 ee = pmic_arb->ee;
-	u32 status, enable;
+	u32 status, enable, handled = 0;
 	int i, id, apid;
 
 	chained_irq_enter(chip, desc);
@@ -649,10 +653,14 @@ static void pmic_arb_chained_irq(struct irq_desc *desc)
 			enable = readl_relaxed(
 					ver_ops->acc_enable(pmic_arb, apid));
 			if (enable & SPMI_PIC_ACC_ENABLE_BIT)
-				periph_interrupt(pmic_arb, apid);
+				if (periph_interrupt(pmic_arb, apid) != 0)
+					handled++;
 		}
 	}
 
+	if (handled == 0)
+		handle_bad_irq(desc);
+
 	chained_irq_exit(chip, desc);
 }
 
-- 
2.7.4


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

* [RESEND PATCH v6 03/10] spmi: pmic-arb: do not ack and clear peripheral interrupts in cleanup_irq
  2022-06-12  3:24 [RESEND PATCH v6 00/10] A bunch of fix and optimization patches in spmi-pmic-arb.c Fenglin Wu
  2022-06-12  3:24 ` [RESEND PATCH v6 01/10] spmi: pmic-arb: add a print in cleanup_irq Fenglin Wu
  2022-06-12  3:24 ` [RESEND PATCH v6 02/10] spmi: pmic-arb: handle spurious interrupt Fenglin Wu
@ 2022-06-12  3:24 ` Fenglin Wu
  2022-08-31 17:39   ` Stephen Boyd
  2022-06-12  3:24 ` [RESEND PATCH v6 04/10] spmi: pmic-arb: check apid against limits before calling irq handler Fenglin Wu
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 23+ messages in thread
From: Fenglin Wu @ 2022-06-12  3:24 UTC (permalink / raw)
  To: linux-arm-msm, linux-kernel, sboyd, Greg Kroah-Hartman,
	Abhijeet Dharmapurikar, Kiran Gunda
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz,
	Subbaraman Narayanamurthy, David Collins

From: Subbaraman Narayanamurthy <subbaram@codeaurora.org>

Currently, cleanup_irq() is invoked when a peripheral's interrupt
fires and there is no mapping present in the interrupt domain of
spmi interrupt controller.

The cleanup_irq clears the arbiter bit, clears the pmic interrupt
and disables it at the pmic in that order. The last disable in
cleanup_irq races with request_irq() in that it stomps over the
enable issued by request_irq. Fix this by not writing to the pmic
in cleanup_irq. The latched bit will be left set in the pmic,
which will not send us more interrupts even if the enable bit
stays enabled.

When a client wants to request an interrupt, use the activate
callback on the irq_domain to clear latched bit. This ensures
that the latched, if set due to the above changes in cleanup_irq
or when the bootloader leaves it set, gets cleaned up, paving way
for upcoming interrupts to trigger.

With this, there is a possibility of unwanted triggering of
interrupt right after the latched bit is cleared - the interrupt
may be left enabled too. To avoid that, clear the enable first
followed by clearing the latched bit in the activate callback.

Fixes: 6bc546e71e50 ("spmi: pmic-arb: cleanup unrequested irqs")
Fixes: 02abec3616c1 ("spmi: pmic-arb: rename pa_xx to pmic_arb_xx and other cleanup")
Signed-off-by: Subbaraman Narayanamurthy <subbaram@codeaurora.org>
[collinsd@codeaurora.org: fix merge conflict]
Signed-off-by: David Collins <collinsd@codeaurora.org>
Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
---
 drivers/spmi/spmi-pmic-arb.c | 15 +++++----------
 1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c
index 719bd73..2bc3b88 100644
--- a/drivers/spmi/spmi-pmic-arb.c
+++ b/drivers/spmi/spmi-pmic-arb.c
@@ -593,16 +593,6 @@ static void cleanup_irq(struct spmi_pmic_arb *pmic_arb, u16 apid, int id)
 	dev_err_ratelimited(&pmic_arb->spmic->dev, "%s apid=%d sid=0x%x per=0x%x irq=%d\n",
 			__func__, apid, sid, per, id);
 	writel_relaxed(irq_mask, pmic_arb->ver_ops->irq_clear(pmic_arb, apid));
-
-	if (pmic_arb_write_cmd(pmic_arb->spmic, SPMI_CMD_EXT_WRITEL, sid,
-			(per << 8) + QPNPINT_REG_LATCHED_CLR, &irq_mask, 1))
-		dev_err_ratelimited(&pmic_arb->spmic->dev, "failed to ack irq_mask = 0x%x for ppid = %x\n",
-				irq_mask, ppid);
-
-	if (pmic_arb_write_cmd(pmic_arb->spmic, SPMI_CMD_EXT_WRITEL, sid,
-			       (per << 8) + QPNPINT_REG_EN_CLR, &irq_mask, 1))
-		dev_err_ratelimited(&pmic_arb->spmic->dev, "failed to ack irq_mask = 0x%x for ppid = %x\n",
-				irq_mask, ppid);
 }
 
 static int periph_interrupt(struct spmi_pmic_arb *pmic_arb, u16 apid)
@@ -780,6 +770,7 @@ static int qpnpint_irq_domain_activate(struct irq_domain *domain,
 	u16 apid = hwirq_to_apid(d->hwirq);
 	u16 sid = hwirq_to_sid(d->hwirq);
 	u16 irq = hwirq_to_irq(d->hwirq);
+	u8 buf;
 
 	if (pmic_arb->apid_data[apid].irq_ee != pmic_arb->ee) {
 		dev_err(&pmic_arb->spmic->dev, "failed to xlate sid = %#x, periph = %#x, irq = %u: ee=%u but owner=%u\n",
@@ -788,6 +779,10 @@ static int qpnpint_irq_domain_activate(struct irq_domain *domain,
 		return -ENODEV;
 	}
 
+	buf = BIT(irq);
+	qpnpint_spmi_write(d, QPNPINT_REG_EN_CLR, &buf, 1);
+	qpnpint_spmi_write(d, QPNPINT_REG_LATCHED_CLR, &buf, 1);
+
 	return 0;
 }
 
-- 
2.7.4


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

* [RESEND PATCH v6 04/10] spmi: pmic-arb: check apid against limits before calling irq handler
  2022-06-12  3:24 [RESEND PATCH v6 00/10] A bunch of fix and optimization patches in spmi-pmic-arb.c Fenglin Wu
                   ` (2 preceding siblings ...)
  2022-06-12  3:24 ` [RESEND PATCH v6 03/10] spmi: pmic-arb: do not ack and clear peripheral interrupts in cleanup_irq Fenglin Wu
@ 2022-06-12  3:24 ` Fenglin Wu
  2022-08-31 17:40   ` Stephen Boyd
  2022-06-12  3:24 ` [RESEND PATCH v6 05/10] spmi: pmic-arb: add support to dispatch interrupt based on IRQ status Fenglin Wu
                   ` (5 subsequent siblings)
  9 siblings, 1 reply; 23+ messages in thread
From: Fenglin Wu @ 2022-06-12  3:24 UTC (permalink / raw)
  To: linux-arm-msm, linux-kernel, sboyd
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz, David Collins

From: David Collins <collinsd@codeaurora.org>

Check that the apid for an SPMI interrupt falls between the
min_apid and max_apid that can be handled by the APPS processor
before invoking the per-apid interrupt handler:
periph_interrupt().

This avoids an access violation in rare cases where the status
bit is set for an interrupt that is not owned by the APPS
processor.

Signed-off-by: David Collins <collinsd@codeaurora.org>
Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
---
 drivers/spmi/spmi-pmic-arb.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c
index 2bc3b88..e19eaec 100644
--- a/drivers/spmi/spmi-pmic-arb.c
+++ b/drivers/spmi/spmi-pmic-arb.c
@@ -625,21 +625,26 @@ static void pmic_arb_chained_irq(struct irq_desc *desc)
 	struct spmi_pmic_arb *pmic_arb = irq_desc_get_handler_data(desc);
 	const struct pmic_arb_ver_ops *ver_ops = pmic_arb->ver_ops;
 	struct irq_chip *chip = irq_desc_get_chip(desc);
-	int first = pmic_arb->min_apid >> 5;
-	int last = pmic_arb->max_apid >> 5;
+	int first = pmic_arb->min_apid;
+	int last = pmic_arb->max_apid;
 	u8 ee = pmic_arb->ee;
 	u32 status, enable, handled = 0;
 	int i, id, apid;
 
 	chained_irq_enter(chip, desc);
 
-	for (i = first; i <= last; ++i) {
+	for (i = first >> 5; i <= last >> 5; ++i) {
 		status = readl_relaxed(
 				ver_ops->owner_acc_status(pmic_arb, ee, i));
 		while (status) {
 			id = ffs(status) - 1;
 			status &= ~BIT(id);
 			apid = id + i * 32;
+			if (apid < first || apid > last) {
+				WARN_ONCE(true, "spurious spmi irq received for apid=%d\n",
+					apid);
+				continue;
+			}
 			enable = readl_relaxed(
 					ver_ops->acc_enable(pmic_arb, apid));
 			if (enable & SPMI_PIC_ACC_ENABLE_BIT)
-- 
2.7.4


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

* [RESEND PATCH v6 05/10] spmi: pmic-arb: add support to dispatch interrupt based on IRQ status
  2022-06-12  3:24 [RESEND PATCH v6 00/10] A bunch of fix and optimization patches in spmi-pmic-arb.c Fenglin Wu
                   ` (3 preceding siblings ...)
  2022-06-12  3:24 ` [RESEND PATCH v6 04/10] spmi: pmic-arb: check apid against limits before calling irq handler Fenglin Wu
@ 2022-06-12  3:24 ` Fenglin Wu
  2022-08-31 17:40   ` Stephen Boyd
  2022-06-12  3:24 ` [RESEND PATCH v6 06/10] spmi: pmic-arb: correct duplicate APID to PPID mapping logic Fenglin Wu
                   ` (4 subsequent siblings)
  9 siblings, 1 reply; 23+ messages in thread
From: Fenglin Wu @ 2022-06-12  3:24 UTC (permalink / raw)
  To: linux-arm-msm, linux-kernel, sboyd
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz,
	Ashay Jaiswal, David Collins

From: Ashay Jaiswal <ashayj@codeaurora.org>

Current implementation of SPMI arbiter dispatches interrupt based on the
Arbiter's accumulator status, in some cases the accumulator status may
remain zero and the interrupt remains un-handled. Add logic to dispatch
interrupts based Arbiter's IRQ status if the accumulator status is zero.

Signed-off-by: Ashay Jaiswal <ashayj@codeaurora.org>
Signed-off-by: David Collins <collinsd@codeaurora.org>
Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
---
 drivers/spmi/spmi-pmic-arb.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c
index e19eaec..56f2294 100644
--- a/drivers/spmi/spmi-pmic-arb.c
+++ b/drivers/spmi/spmi-pmic-arb.c
@@ -630,12 +630,18 @@ static void pmic_arb_chained_irq(struct irq_desc *desc)
 	u8 ee = pmic_arb->ee;
 	u32 status, enable, handled = 0;
 	int i, id, apid;
+	/* status based dispatch */
+	bool acc_valid = false;
+	u32 irq_status = 0;
 
 	chained_irq_enter(chip, desc);
 
 	for (i = first >> 5; i <= last >> 5; ++i) {
 		status = readl_relaxed(
 				ver_ops->owner_acc_status(pmic_arb, ee, i));
+		if (status)
+			acc_valid = true;
+
 		while (status) {
 			id = ffs(status) - 1;
 			status &= ~BIT(id);
@@ -653,6 +659,29 @@ static void pmic_arb_chained_irq(struct irq_desc *desc)
 		}
 	}
 
+	/* ACC_STATUS is empty but IRQ fired check IRQ_STATUS */
+	if (!acc_valid) {
+		for (i = first; i <= last; i++) {
+			/* skip if APPS is not irq owner */
+			if (pmic_arb->apid_data[i].irq_ee != pmic_arb->ee)
+				continue;
+
+			irq_status = readl_relaxed(
+					     ver_ops->irq_status(pmic_arb, i));
+			if (irq_status) {
+				enable = readl_relaxed(
+					     ver_ops->acc_enable(pmic_arb, i));
+				if (enable & SPMI_PIC_ACC_ENABLE_BIT) {
+					dev_dbg(&pmic_arb->spmic->dev,
+						"Dispatching IRQ for apid=%d status=%x\n",
+						i, irq_status);
+					if (periph_interrupt(pmic_arb, i) != 0)
+						handled++;
+				}
+			}
+		}
+	}
+
 	if (handled == 0)
 		handle_bad_irq(desc);
 
-- 
2.7.4


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

* [RESEND PATCH v6 06/10] spmi: pmic-arb: correct duplicate APID to PPID mapping logic
  2022-06-12  3:24 [RESEND PATCH v6 00/10] A bunch of fix and optimization patches in spmi-pmic-arb.c Fenglin Wu
                   ` (4 preceding siblings ...)
  2022-06-12  3:24 ` [RESEND PATCH v6 05/10] spmi: pmic-arb: add support to dispatch interrupt based on IRQ status Fenglin Wu
@ 2022-06-12  3:24 ` Fenglin Wu
  2022-08-31 17:40   ` Stephen Boyd
  2022-06-12  3:24 ` [RESEND PATCH v6 07/10] spmi: pmic-arb: block access for invalid PMIC arbiter v5 SPMI writes Fenglin Wu
                   ` (3 subsequent siblings)
  9 siblings, 1 reply; 23+ messages in thread
From: Fenglin Wu @ 2022-06-12  3:24 UTC (permalink / raw)
  To: linux-arm-msm, linux-kernel, sboyd, David Collins, Kiran Gunda,
	Greg Kroah-Hartman
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz

From: David Collins <collinsd@codeaurora.org>

Correct the way that duplicate PPID mappings are handled for PMIC
arbiter v5.  The final APID mapped to a given PPID should be the
one which has write owner = APPS EE, if it exists, or if not
that, then the first APID mapped to the PPID, if it exists.

Fixes: 40f318f0ed67 ("spmi: pmic-arb: add support for HW version 5")
Signed-off-by: David Collins <collinsd@codeaurora.org>
Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
---
 drivers/spmi/spmi-pmic-arb.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c
index 56f2294..cf92abc 100644
--- a/drivers/spmi/spmi-pmic-arb.c
+++ b/drivers/spmi/spmi-pmic-arb.c
@@ -1031,7 +1031,8 @@ static int pmic_arb_read_apid_map_v5(struct spmi_pmic_arb *pmic_arb)
 	 * version 5, there is more than one APID mapped to each PPID.
 	 * The owner field for each of these mappings specifies the EE which is
 	 * allowed to write to the APID.  The owner of the last (highest) APID
-	 * for a given PPID will receive interrupts from the PPID.
+	 * which has the IRQ owner bit set for a given PPID will receive
+	 * interrupts from the PPID.
 	 */
 	for (i = 0; ; i++, apidd++) {
 		offset = pmic_arb->ver_ops->apid_map_offset(i);
@@ -1054,16 +1055,16 @@ static int pmic_arb_read_apid_map_v5(struct spmi_pmic_arb *pmic_arb)
 		apid = pmic_arb->ppid_to_apid[ppid] & ~PMIC_ARB_APID_VALID;
 		prev_apidd = &pmic_arb->apid_data[apid];
 
-		if (valid && is_irq_ee &&
-				prev_apidd->write_ee == pmic_arb->ee) {
+		if (!valid || apidd->write_ee == pmic_arb->ee) {
+			/* First PPID mapping or one for this EE */
+			pmic_arb->ppid_to_apid[ppid] = i | PMIC_ARB_APID_VALID;
+		} else if (valid && is_irq_ee &&
+			   prev_apidd->write_ee == pmic_arb->ee) {
 			/*
 			 * Duplicate PPID mapping after the one for this EE;
 			 * override the irq owner
 			 */
 			prev_apidd->irq_ee = apidd->irq_ee;
-		} else if (!valid || is_irq_ee) {
-			/* First PPID mapping or duplicate for another EE */
-			pmic_arb->ppid_to_apid[ppid] = i | PMIC_ARB_APID_VALID;
 		}
 
 		apidd->ppid = ppid;
-- 
2.7.4


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

* [RESEND PATCH v6 07/10] spmi: pmic-arb: block access for invalid PMIC arbiter v5 SPMI writes
  2022-06-12  3:24 [RESEND PATCH v6 00/10] A bunch of fix and optimization patches in spmi-pmic-arb.c Fenglin Wu
                   ` (5 preceding siblings ...)
  2022-06-12  3:24 ` [RESEND PATCH v6 06/10] spmi: pmic-arb: correct duplicate APID to PPID mapping logic Fenglin Wu
@ 2022-06-12  3:24 ` Fenglin Wu
  2022-08-31 17:40   ` Stephen Boyd
  2022-06-12  3:24 ` [RESEND PATCH v6 08/10] dt-bindings: spmi: spmi-pmic-arb: make interrupt properties as optional Fenglin Wu
                   ` (2 subsequent siblings)
  9 siblings, 1 reply; 23+ messages in thread
From: Fenglin Wu @ 2022-06-12  3:24 UTC (permalink / raw)
  To: linux-arm-msm, linux-kernel, sboyd
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz, David Collins

From: David Collins <collinsd@codeaurora.org>

The system crashes due to an access permission violation when
writing to a PMIC peripheral which is not owned by the current
ee.  Add a check for PMIC arbiter version 5 for such invalid
write requests and return an error instead of crashing the
system.

Signed-off-by: David Collins <collinsd@codeaurora.org>
Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
---
 drivers/spmi/spmi-pmic-arb.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c
index cf92abc..39f25bc 100644
--- a/drivers/spmi/spmi-pmic-arb.c
+++ b/drivers/spmi/spmi-pmic-arb.c
@@ -1133,6 +1133,11 @@ static int pmic_arb_offset_v5(struct spmi_pmic_arb *pmic_arb, u8 sid, u16 addr,
 		offset = 0x10000 * pmic_arb->ee + 0x80 * apid;
 		break;
 	case PMIC_ARB_CHANNEL_RW:
+		if (pmic_arb->apid_data[apid].write_ee != pmic_arb->ee) {
+			dev_err(&pmic_arb->spmic->dev, "disallowed SPMI write to sid=%u, addr=0x%04X\n",
+				sid, addr);
+			return -EPERM;
+		}
 		offset = 0x10000 * apid;
 		break;
 	}
-- 
2.7.4


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

* [RESEND PATCH v6 08/10] dt-bindings: spmi: spmi-pmic-arb: make interrupt properties as optional
  2022-06-12  3:24 [RESEND PATCH v6 00/10] A bunch of fix and optimization patches in spmi-pmic-arb.c Fenglin Wu
                   ` (6 preceding siblings ...)
  2022-06-12  3:24 ` [RESEND PATCH v6 07/10] spmi: pmic-arb: block access for invalid PMIC arbiter v5 SPMI writes Fenglin Wu
@ 2022-06-12  3:24 ` Fenglin Wu
  2022-08-31 17:36   ` Stephen Boyd
  2022-06-12  3:24 ` [RESEND PATCH v6 09/10] spmi: pmic-arb: make interrupt support optional Fenglin Wu
  2022-06-12  3:24 ` [RESEND PATCH v6 10/10] spmi: pmic-arb: increase SPMI transaction timeout delay Fenglin Wu
  9 siblings, 1 reply; 23+ messages in thread
From: Fenglin Wu @ 2022-06-12  3:24 UTC (permalink / raw)
  To: linux-arm-msm, linux-kernel, sboyd, Andy Gross, Bjorn Andersson,
	Rob Herring, devicetree
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz, David Collins

From: David Collins <collinsd@codeaurora.org>

Make all interrupt related properties as optional instead of
required.  Some boards do not required PMIC IRQ support and it
isn't needed to handle SPMI bus transactions, so specify it as
optional.

Signed-off-by: David Collins <collinsd@codeaurora.org>
Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
Acked-by: Rob Herring <robh@kernel.org>
---
 Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml b/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml
index 55d379c..fee4f0e 100644
--- a/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml
+++ b/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml
@@ -88,9 +88,6 @@ properties:
 required:
   - compatible
   - reg-names
-  - interrupts
-  - interrupt-names
-  - '#interrupt-cells'
   - qcom,ee
   - qcom,channel
 
-- 
2.7.4


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

* [RESEND PATCH v6 09/10] spmi: pmic-arb: make interrupt support optional
  2022-06-12  3:24 [RESEND PATCH v6 00/10] A bunch of fix and optimization patches in spmi-pmic-arb.c Fenglin Wu
                   ` (7 preceding siblings ...)
  2022-06-12  3:24 ` [RESEND PATCH v6 08/10] dt-bindings: spmi: spmi-pmic-arb: make interrupt properties as optional Fenglin Wu
@ 2022-06-12  3:24 ` Fenglin Wu
  2022-08-30 23:38   ` Stephen Boyd
  2022-06-12  3:24 ` [RESEND PATCH v6 10/10] spmi: pmic-arb: increase SPMI transaction timeout delay Fenglin Wu
  9 siblings, 1 reply; 23+ messages in thread
From: Fenglin Wu @ 2022-06-12  3:24 UTC (permalink / raw)
  To: linux-arm-msm, linux-kernel, sboyd
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz, David Collins

From: David Collins <collinsd@codeaurora.org>

Make the support of PMIC peripheral interrupts optional for
spmi-pmic-arb devices.  This is useful in situations where
SPMI address mapping is required without the need for IRQ
support.

Signed-off-by: David Collins <collinsd@codeaurora.org>
Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
---
 drivers/spmi/spmi-pmic-arb.c | 45 +++++++++++++++++++++++++++-----------------
 1 file changed, 28 insertions(+), 17 deletions(-)

diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c
index 39f25bc..0496e5d 100644
--- a/drivers/spmi/spmi-pmic-arb.c
+++ b/drivers/spmi/spmi-pmic-arb.c
@@ -1386,10 +1386,12 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)
 		goto err_put_ctrl;
 	}
 
-	pmic_arb->irq = platform_get_irq_byname(pdev, "periph_irq");
-	if (pmic_arb->irq < 0) {
-		err = pmic_arb->irq;
-		goto err_put_ctrl;
+	if (of_find_property(pdev->dev.of_node, "interrupt-controller", NULL)) {
+		pmic_arb->irq = platform_get_irq_byname(pdev, "periph_irq");
+		if (pmic_arb->irq < 0) {
+			err = pmic_arb->irq;
+			goto err_put_ctrl;
+		}
 	}
 
 	err = of_property_read_u32(pdev->dev.of_node, "qcom,channel", &channel);
@@ -1449,17 +1451,22 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)
 		}
 	}
 
-	dev_dbg(&pdev->dev, "adding irq domain\n");
-	pmic_arb->domain = irq_domain_add_tree(pdev->dev.of_node,
-					 &pmic_arb_irq_domain_ops, pmic_arb);
-	if (!pmic_arb->domain) {
-		dev_err(&pdev->dev, "unable to create irq_domain\n");
-		err = -ENOMEM;
-		goto err_put_ctrl;
+	if (pmic_arb->irq > 0) {
+		dev_dbg(&pdev->dev, "adding irq domain\n");
+		pmic_arb->domain = irq_domain_add_tree(pdev->dev.of_node,
+					    &pmic_arb_irq_domain_ops, pmic_arb);
+		if (!pmic_arb->domain) {
+			dev_err(&pdev->dev, "unable to create irq_domain\n");
+			err = -ENOMEM;
+			goto err_put_ctrl;
+		}
+
+		irq_set_chained_handler_and_data(pmic_arb->irq,
+						pmic_arb_chained_irq, pmic_arb);
+	} else {
+		dev_dbg(&pdev->dev, "not supporting PMIC interrupts\n");
 	}
 
-	irq_set_chained_handler_and_data(pmic_arb->irq, pmic_arb_chained_irq,
-					pmic_arb);
 	err = spmi_controller_add(ctrl);
 	if (err)
 		goto err_domain_remove;
@@ -1467,8 +1474,10 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)
 	return 0;
 
 err_domain_remove:
-	irq_set_chained_handler_and_data(pmic_arb->irq, NULL, NULL);
-	irq_domain_remove(pmic_arb->domain);
+	if (pmic_arb->irq > 0) {
+		irq_set_chained_handler_and_data(pmic_arb->irq, NULL, NULL);
+		irq_domain_remove(pmic_arb->domain);
+	}
 err_put_ctrl:
 	spmi_controller_put(ctrl);
 	return err;
@@ -1479,8 +1488,10 @@ static int spmi_pmic_arb_remove(struct platform_device *pdev)
 	struct spmi_controller *ctrl = platform_get_drvdata(pdev);
 	struct spmi_pmic_arb *pmic_arb = spmi_controller_get_drvdata(ctrl);
 	spmi_controller_remove(ctrl);
-	irq_set_chained_handler_and_data(pmic_arb->irq, NULL, NULL);
-	irq_domain_remove(pmic_arb->domain);
+	if (pmic_arb->irq > 0) {
+		irq_set_chained_handler_and_data(pmic_arb->irq, NULL, NULL);
+		irq_domain_remove(pmic_arb->domain);
+	}
 	spmi_controller_put(ctrl);
 	return 0;
 }
-- 
2.7.4


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

* [RESEND PATCH v6 10/10] spmi: pmic-arb: increase SPMI transaction timeout delay
  2022-06-12  3:24 [RESEND PATCH v6 00/10] A bunch of fix and optimization patches in spmi-pmic-arb.c Fenglin Wu
                   ` (8 preceding siblings ...)
  2022-06-12  3:24 ` [RESEND PATCH v6 09/10] spmi: pmic-arb: make interrupt support optional Fenglin Wu
@ 2022-06-12  3:24 ` Fenglin Wu
  2022-08-31 17:41   ` Stephen Boyd
  9 siblings, 1 reply; 23+ messages in thread
From: Fenglin Wu @ 2022-06-12  3:24 UTC (permalink / raw)
  To: linux-arm-msm, linux-kernel, sboyd
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz, David Collins

From: David Collins <collinsd@codeaurora.org>

Increase the SPMI transaction timeout delay from 100 us to
1000 us in order to account for the slower execution time
found on some simulator targets.

Signed-off-by: David Collins <collinsd@codeaurora.org>
Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
---
 drivers/spmi/spmi-pmic-arb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c
index 0496e5d..45f9344 100644
--- a/drivers/spmi/spmi-pmic-arb.c
+++ b/drivers/spmi/spmi-pmic-arb.c
@@ -91,7 +91,7 @@ enum pmic_arb_channel {
 
 /* Maximum number of support PMIC peripherals */
 #define PMIC_ARB_MAX_PERIPHS		512
-#define PMIC_ARB_TIMEOUT_US		100
+#define PMIC_ARB_TIMEOUT_US		1000
 #define PMIC_ARB_MAX_TRANS_BYTES	(8)
 
 #define PMIC_ARB_APID_MASK		0xFF
-- 
2.7.4


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

* Re: [RESEND PATCH v6 09/10] spmi: pmic-arb: make interrupt support optional
  2022-06-12  3:24 ` [RESEND PATCH v6 09/10] spmi: pmic-arb: make interrupt support optional Fenglin Wu
@ 2022-08-30 23:38   ` Stephen Boyd
  0 siblings, 0 replies; 23+ messages in thread
From: Stephen Boyd @ 2022-08-30 23:38 UTC (permalink / raw)
  To: Fenglin Wu, linux-arm-msm, linux-kernel
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz, David Collins

Quoting Fenglin Wu (2022-06-11 20:24:45)
> From: David Collins <collinsd@codeaurora.org>
> 
> Make the support of PMIC peripheral interrupts optional for
> spmi-pmic-arb devices.  This is useful in situations where
> SPMI address mapping is required without the need for IRQ
> support.
> 
> Signed-off-by: David Collins <collinsd@codeaurora.org>
> Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>

This needs a binding update so that interrupt-controller is forbidden
when the device doesn't support it.

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

* Re: [RESEND PATCH v6 08/10] dt-bindings: spmi: spmi-pmic-arb: make interrupt properties as optional
  2022-06-12  3:24 ` [RESEND PATCH v6 08/10] dt-bindings: spmi: spmi-pmic-arb: make interrupt properties as optional Fenglin Wu
@ 2022-08-31 17:36   ` Stephen Boyd
  2022-09-02 11:41     ` Fenglin Wu
  0 siblings, 1 reply; 23+ messages in thread
From: Stephen Boyd @ 2022-08-31 17:36 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Fenglin Wu, Rob Herring, devicetree,
	linux-arm-msm, linux-kernel
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz, David Collins

Quoting Fenglin Wu (2022-06-11 20:24:44)
> From: David Collins <collinsd@codeaurora.org>
> 
> Make all interrupt related properties as optional instead of
> required.  Some boards do not required PMIC IRQ support and it
> isn't needed to handle SPMI bus transactions, so specify it as
> optional.
> 
> Signed-off-by: David Collins <collinsd@codeaurora.org>
> Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
> Acked-by: Rob Herring <robh@kernel.org>
> ---
>  Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml | 3 ---
>  1 file changed, 3 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml b/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml
> index 55d379c..fee4f0e 100644
> --- a/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml
> +++ b/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml
> @@ -88,9 +88,6 @@ properties:
>  required:
>    - compatible
>    - reg-names
> -  - interrupts
> -  - interrupt-names
> -  - '#interrupt-cells'

Let me clarify my comment on the next driver patch here. It looks like
we're making the properties optional here so that the driver can choose
to create or not create the irqchip based on the presence of the
property. Are there PMIC arbiters that don't have irq support? Or is it
only that some board designs don't use interrupt support of the PMIC,
because all the devices that use interrupts on the PMIC aren't enabled
(status = "okay")?

We shouldn't get into a situation where we're removing the interrupt
properties because we want the driver to skip creating the irqchip. That
makes the binding too loose, where we can't validate existing DT files.
It also makes it confusing to include the DTS files when the device
always supports interrupt capabilities, just we don't want to use it.

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

* Re: [RESEND PATCH v6 01/10] spmi: pmic-arb: add a print in cleanup_irq
  2022-06-12  3:24 ` [RESEND PATCH v6 01/10] spmi: pmic-arb: add a print in cleanup_irq Fenglin Wu
@ 2022-08-31 17:39   ` Stephen Boyd
  0 siblings, 0 replies; 23+ messages in thread
From: Stephen Boyd @ 2022-08-31 17:39 UTC (permalink / raw)
  To: Fenglin Wu, linux-arm-msm, linux-kernel
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz,
	Abhijeet Dharmapurikar, David Collins

Quoting Fenglin Wu (2022-06-11 20:24:37)
> From: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
> 
> The cleanup_irq() was meant to clear and mask interrupts that were
> left enabled in the hardware but there was no interrupt handler
> registered for it. Add an error print when it gets invoked.
> 
> Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
> Signed-off-by: David Collins <collinsd@codeaurora.org>
> Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
> ---

Applied to spmi-next

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

* Re: [RESEND PATCH v6 02/10] spmi: pmic-arb: handle spurious interrupt
  2022-06-12  3:24 ` [RESEND PATCH v6 02/10] spmi: pmic-arb: handle spurious interrupt Fenglin Wu
@ 2022-08-31 17:39   ` Stephen Boyd
  0 siblings, 0 replies; 23+ messages in thread
From: Stephen Boyd @ 2022-08-31 17:39 UTC (permalink / raw)
  To: Fenglin Wu, linux-arm-msm, linux-kernel
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz

Quoting Fenglin Wu (2022-06-11 20:24:38)
> Call handle_bad_irq() when the summary interrupt is fired spuriously.
> 
> Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
> ---

Applied to spmi-next

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

* Re: [RESEND PATCH v6 03/10] spmi: pmic-arb: do not ack and clear peripheral interrupts in cleanup_irq
  2022-06-12  3:24 ` [RESEND PATCH v6 03/10] spmi: pmic-arb: do not ack and clear peripheral interrupts in cleanup_irq Fenglin Wu
@ 2022-08-31 17:39   ` Stephen Boyd
  0 siblings, 0 replies; 23+ messages in thread
From: Stephen Boyd @ 2022-08-31 17:39 UTC (permalink / raw)
  To: Abhijeet Dharmapurikar, Fenglin Wu, Greg Kroah-Hartman,
	Kiran Gunda, linux-arm-msm, linux-kernel
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz,
	Subbaraman Narayanamurthy, David Collins

Quoting Fenglin Wu (2022-06-11 20:24:39)
> From: Subbaraman Narayanamurthy <subbaram@codeaurora.org>
> 
> Currently, cleanup_irq() is invoked when a peripheral's interrupt
> fires and there is no mapping present in the interrupt domain of
> spmi interrupt controller.
> 
> The cleanup_irq clears the arbiter bit, clears the pmic interrupt
> and disables it at the pmic in that order. The last disable in
> cleanup_irq races with request_irq() in that it stomps over the
> enable issued by request_irq. Fix this by not writing to the pmic
> in cleanup_irq. The latched bit will be left set in the pmic,
> which will not send us more interrupts even if the enable bit
> stays enabled.
> 
> When a client wants to request an interrupt, use the activate
> callback on the irq_domain to clear latched bit. This ensures
> that the latched, if set due to the above changes in cleanup_irq
> or when the bootloader leaves it set, gets cleaned up, paving way
> for upcoming interrupts to trigger.
> 
> With this, there is a possibility of unwanted triggering of
> interrupt right after the latched bit is cleared - the interrupt
> may be left enabled too. To avoid that, clear the enable first
> followed by clearing the latched bit in the activate callback.
> 
> Fixes: 6bc546e71e50 ("spmi: pmic-arb: cleanup unrequested irqs")
> Fixes: 02abec3616c1 ("spmi: pmic-arb: rename pa_xx to pmic_arb_xx and other cleanup")
> Signed-off-by: Subbaraman Narayanamurthy <subbaram@codeaurora.org>
> [collinsd@codeaurora.org: fix merge conflict]
> Signed-off-by: David Collins <collinsd@codeaurora.org>
> Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
> ---

Applied to spmi-next

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

* Re: [RESEND PATCH v6 04/10] spmi: pmic-arb: check apid against limits before calling irq handler
  2022-06-12  3:24 ` [RESEND PATCH v6 04/10] spmi: pmic-arb: check apid against limits before calling irq handler Fenglin Wu
@ 2022-08-31 17:40   ` Stephen Boyd
  0 siblings, 0 replies; 23+ messages in thread
From: Stephen Boyd @ 2022-08-31 17:40 UTC (permalink / raw)
  To: Fenglin Wu, linux-arm-msm, linux-kernel
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz, David Collins

Quoting Fenglin Wu (2022-06-11 20:24:40)
> From: David Collins <collinsd@codeaurora.org>
> 
> Check that the apid for an SPMI interrupt falls between the
> min_apid and max_apid that can be handled by the APPS processor
> before invoking the per-apid interrupt handler:
> periph_interrupt().
> 
> This avoids an access violation in rare cases where the status
> bit is set for an interrupt that is not owned by the APPS
> processor.
> 
> Signed-off-by: David Collins <collinsd@codeaurora.org>
> Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
> ---

Applied to spmi-next

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

* Re: [RESEND PATCH v6 05/10] spmi: pmic-arb: add support to dispatch interrupt based on IRQ status
  2022-06-12  3:24 ` [RESEND PATCH v6 05/10] spmi: pmic-arb: add support to dispatch interrupt based on IRQ status Fenglin Wu
@ 2022-08-31 17:40   ` Stephen Boyd
  0 siblings, 0 replies; 23+ messages in thread
From: Stephen Boyd @ 2022-08-31 17:40 UTC (permalink / raw)
  To: Fenglin Wu, linux-arm-msm, linux-kernel
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz,
	Ashay Jaiswal, David Collins

Quoting Fenglin Wu (2022-06-11 20:24:41)
> From: Ashay Jaiswal <ashayj@codeaurora.org>
> 
> Current implementation of SPMI arbiter dispatches interrupt based on the
> Arbiter's accumulator status, in some cases the accumulator status may
> remain zero and the interrupt remains un-handled. Add logic to dispatch
> interrupts based Arbiter's IRQ status if the accumulator status is zero.
> 
> Signed-off-by: Ashay Jaiswal <ashayj@codeaurora.org>
> Signed-off-by: David Collins <collinsd@codeaurora.org>
> Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
> ---

Applied to spmi-next

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

* Re: [RESEND PATCH v6 06/10] spmi: pmic-arb: correct duplicate APID to PPID mapping logic
  2022-06-12  3:24 ` [RESEND PATCH v6 06/10] spmi: pmic-arb: correct duplicate APID to PPID mapping logic Fenglin Wu
@ 2022-08-31 17:40   ` Stephen Boyd
  0 siblings, 0 replies; 23+ messages in thread
From: Stephen Boyd @ 2022-08-31 17:40 UTC (permalink / raw)
  To: David Collins, Fenglin Wu, Greg Kroah-Hartman, Kiran Gunda,
	linux-arm-msm, linux-kernel
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz

Quoting Fenglin Wu (2022-06-11 20:24:42)
> From: David Collins <collinsd@codeaurora.org>
> 
> Correct the way that duplicate PPID mappings are handled for PMIC
> arbiter v5.  The final APID mapped to a given PPID should be the
> one which has write owner = APPS EE, if it exists, or if not
> that, then the first APID mapped to the PPID, if it exists.
> 
> Fixes: 40f318f0ed67 ("spmi: pmic-arb: add support for HW version 5")
> Signed-off-by: David Collins <collinsd@codeaurora.org>
> Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
> ---

Applied to spmi-next

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

* Re: [RESEND PATCH v6 07/10] spmi: pmic-arb: block access for invalid PMIC arbiter v5 SPMI writes
  2022-06-12  3:24 ` [RESEND PATCH v6 07/10] spmi: pmic-arb: block access for invalid PMIC arbiter v5 SPMI writes Fenglin Wu
@ 2022-08-31 17:40   ` Stephen Boyd
  0 siblings, 0 replies; 23+ messages in thread
From: Stephen Boyd @ 2022-08-31 17:40 UTC (permalink / raw)
  To: Fenglin Wu, linux-arm-msm, linux-kernel
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz, David Collins

Quoting Fenglin Wu (2022-06-11 20:24:43)
> From: David Collins <collinsd@codeaurora.org>
> 
> The system crashes due to an access permission violation when
> writing to a PMIC peripheral which is not owned by the current
> ee.  Add a check for PMIC arbiter version 5 for such invalid
> write requests and return an error instead of crashing the
> system.
> 
> Signed-off-by: David Collins <collinsd@codeaurora.org>
> Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
> ---

Applied to spmi-next

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

* Re: [RESEND PATCH v6 10/10] spmi: pmic-arb: increase SPMI transaction timeout delay
  2022-06-12  3:24 ` [RESEND PATCH v6 10/10] spmi: pmic-arb: increase SPMI transaction timeout delay Fenglin Wu
@ 2022-08-31 17:41   ` Stephen Boyd
  0 siblings, 0 replies; 23+ messages in thread
From: Stephen Boyd @ 2022-08-31 17:41 UTC (permalink / raw)
  To: Fenglin Wu, linux-arm-msm, linux-kernel
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz, David Collins

Quoting Fenglin Wu (2022-06-11 20:24:46)
> From: David Collins <collinsd@codeaurora.org>
> 
> Increase the SPMI transaction timeout delay from 100 us to
> 1000 us in order to account for the slower execution time
> found on some simulator targets.
> 
> Signed-off-by: David Collins <collinsd@codeaurora.org>
> Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
> ---

Applied to spmi-next

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

* Re: [RESEND PATCH v6 08/10] dt-bindings: spmi: spmi-pmic-arb: make interrupt properties as optional
  2022-08-31 17:36   ` Stephen Boyd
@ 2022-09-02 11:41     ` Fenglin Wu
  0 siblings, 0 replies; 23+ messages in thread
From: Fenglin Wu @ 2022-09-02 11:41 UTC (permalink / raw)
  To: Stephen Boyd, Andy Gross, Bjorn Andersson, Rob Herring,
	devicetree, linux-arm-msm, linux-kernel
  Cc: quic_collinsd, quic_subbaram, tglx, maz, David Collins



On 2022/9/1 1:36, Stephen Boyd wrote:
> Quoting Fenglin Wu (2022-06-11 20:24:44)
>> From: David Collins <collinsd@codeaurora.org>
>>
>> Make all interrupt related properties as optional instead of
>> required.  Some boards do not required PMIC IRQ support and it
>> isn't needed to handle SPMI bus transactions, so specify it as
>> optional.
>>
>> Signed-off-by: David Collins <collinsd@codeaurora.org>
>> Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
>> Acked-by: Rob Herring <robh@kernel.org>
>> ---
>>   Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml | 3 ---
>>   1 file changed, 3 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml b/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml
>> index 55d379c..fee4f0e 100644
>> --- a/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml
>> +++ b/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml
>> @@ -88,9 +88,6 @@ properties:
>>   required:
>>     - compatible
>>     - reg-names
>> -  - interrupts
>> -  - interrupt-names
>> -  - '#interrupt-cells'
> 
> Let me clarify my comment on the next driver patch here. It looks like
> we're making the properties optional here so that the driver can choose
> to create or not create the irqchip based on the presence of the
> property. Are there PMIC arbiters that don't have irq support? Or is it
> only that some board designs don't use interrupt support of the PMIC,
> because all the devices that use interrupts on the PMIC aren't enabled
> (status = "okay")?
> 
> We shouldn't get into a situation where we're removing the interrupt
> properties because we want the driver to skip creating the irqchip. That
> makes the binding too loose, where we can't validate existing DT files.
> It also makes it confusing to include the DTS files when the device
> always supports interrupt capabilities, just we don't want to use it.

Thanks for reviewing the changes Stephen.

I discussed with the change author David, he mentioned that these two 
changes were made for supporting trust VM features. In the design, there 
are two SPMI arbiter device instances, one is in non-secure world (with 
Linux Android) and the other is in secure world (with LE), both 
instances use the same SPMI arbiter driver but only the LA system 
handles the interrupt, and the irqchip will not be created for LE system 
to prevent any interrupt being fired and routed to the LA system.

There are actually two other changes in SPMI driver made for the same 
secure VM feature. The driver exports a new API which would translate 
the SPMI address (SID+PID+OFFSET) into the SoC physical register address 
range that handles the SPMI write to the corresponding SPMI registers, 
and the secure system would do some protection on these registers to 
block any SPMI write from non-secure world when the secure feature is 
enabled.

There will be 4 changes related in total, I will send them together with 
a new topic next time and you can help to review them after that.
Thank you!

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

* [RESEND PATCH V6 09/10] spmi: pmic-arb: make interrupt support optional
  2022-04-28  1:12 [RESEND PATCH V6 00/10] A bunch of fix and optimization patches in spmi-pmic-arb.c Fenglin Wu
@ 2022-04-28  1:12 ` Fenglin Wu
  0 siblings, 0 replies; 23+ messages in thread
From: Fenglin Wu @ 2022-04-28  1:12 UTC (permalink / raw)
  To: linux-arm-msm, linux-kernel, sboyd
  Cc: quic_collinsd, quic_subbaram, quic_fenglinw, tglx, maz, David Collins

From: David Collins <collinsd@codeaurora.org>

Make the support of PMIC peripheral interrupts optional for
spmi-pmic-arb devices.  This is useful in situations where
SPMI address mapping is required without the need for IRQ
support.

Signed-off-by: David Collins <collinsd@codeaurora.org>
Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com>
---
 drivers/spmi/spmi-pmic-arb.c | 45 +++++++++++++++++++++++++++-----------------
 1 file changed, 28 insertions(+), 17 deletions(-)

diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c
index 39f25bc..0496e5d 100644
--- a/drivers/spmi/spmi-pmic-arb.c
+++ b/drivers/spmi/spmi-pmic-arb.c
@@ -1386,10 +1386,12 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)
 		goto err_put_ctrl;
 	}
 
-	pmic_arb->irq = platform_get_irq_byname(pdev, "periph_irq");
-	if (pmic_arb->irq < 0) {
-		err = pmic_arb->irq;
-		goto err_put_ctrl;
+	if (of_find_property(pdev->dev.of_node, "interrupt-controller", NULL)) {
+		pmic_arb->irq = platform_get_irq_byname(pdev, "periph_irq");
+		if (pmic_arb->irq < 0) {
+			err = pmic_arb->irq;
+			goto err_put_ctrl;
+		}
 	}
 
 	err = of_property_read_u32(pdev->dev.of_node, "qcom,channel", &channel);
@@ -1449,17 +1451,22 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)
 		}
 	}
 
-	dev_dbg(&pdev->dev, "adding irq domain\n");
-	pmic_arb->domain = irq_domain_add_tree(pdev->dev.of_node,
-					 &pmic_arb_irq_domain_ops, pmic_arb);
-	if (!pmic_arb->domain) {
-		dev_err(&pdev->dev, "unable to create irq_domain\n");
-		err = -ENOMEM;
-		goto err_put_ctrl;
+	if (pmic_arb->irq > 0) {
+		dev_dbg(&pdev->dev, "adding irq domain\n");
+		pmic_arb->domain = irq_domain_add_tree(pdev->dev.of_node,
+					    &pmic_arb_irq_domain_ops, pmic_arb);
+		if (!pmic_arb->domain) {
+			dev_err(&pdev->dev, "unable to create irq_domain\n");
+			err = -ENOMEM;
+			goto err_put_ctrl;
+		}
+
+		irq_set_chained_handler_and_data(pmic_arb->irq,
+						pmic_arb_chained_irq, pmic_arb);
+	} else {
+		dev_dbg(&pdev->dev, "not supporting PMIC interrupts\n");
 	}
 
-	irq_set_chained_handler_and_data(pmic_arb->irq, pmic_arb_chained_irq,
-					pmic_arb);
 	err = spmi_controller_add(ctrl);
 	if (err)
 		goto err_domain_remove;
@@ -1467,8 +1474,10 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)
 	return 0;
 
 err_domain_remove:
-	irq_set_chained_handler_and_data(pmic_arb->irq, NULL, NULL);
-	irq_domain_remove(pmic_arb->domain);
+	if (pmic_arb->irq > 0) {
+		irq_set_chained_handler_and_data(pmic_arb->irq, NULL, NULL);
+		irq_domain_remove(pmic_arb->domain);
+	}
 err_put_ctrl:
 	spmi_controller_put(ctrl);
 	return err;
@@ -1479,8 +1488,10 @@ static int spmi_pmic_arb_remove(struct platform_device *pdev)
 	struct spmi_controller *ctrl = platform_get_drvdata(pdev);
 	struct spmi_pmic_arb *pmic_arb = spmi_controller_get_drvdata(ctrl);
 	spmi_controller_remove(ctrl);
-	irq_set_chained_handler_and_data(pmic_arb->irq, NULL, NULL);
-	irq_domain_remove(pmic_arb->domain);
+	if (pmic_arb->irq > 0) {
+		irq_set_chained_handler_and_data(pmic_arb->irq, NULL, NULL);
+		irq_domain_remove(pmic_arb->domain);
+	}
 	spmi_controller_put(ctrl);
 	return 0;
 }
-- 
2.7.4


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

end of thread, other threads:[~2022-09-02 11:43 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-12  3:24 [RESEND PATCH v6 00/10] A bunch of fix and optimization patches in spmi-pmic-arb.c Fenglin Wu
2022-06-12  3:24 ` [RESEND PATCH v6 01/10] spmi: pmic-arb: add a print in cleanup_irq Fenglin Wu
2022-08-31 17:39   ` Stephen Boyd
2022-06-12  3:24 ` [RESEND PATCH v6 02/10] spmi: pmic-arb: handle spurious interrupt Fenglin Wu
2022-08-31 17:39   ` Stephen Boyd
2022-06-12  3:24 ` [RESEND PATCH v6 03/10] spmi: pmic-arb: do not ack and clear peripheral interrupts in cleanup_irq Fenglin Wu
2022-08-31 17:39   ` Stephen Boyd
2022-06-12  3:24 ` [RESEND PATCH v6 04/10] spmi: pmic-arb: check apid against limits before calling irq handler Fenglin Wu
2022-08-31 17:40   ` Stephen Boyd
2022-06-12  3:24 ` [RESEND PATCH v6 05/10] spmi: pmic-arb: add support to dispatch interrupt based on IRQ status Fenglin Wu
2022-08-31 17:40   ` Stephen Boyd
2022-06-12  3:24 ` [RESEND PATCH v6 06/10] spmi: pmic-arb: correct duplicate APID to PPID mapping logic Fenglin Wu
2022-08-31 17:40   ` Stephen Boyd
2022-06-12  3:24 ` [RESEND PATCH v6 07/10] spmi: pmic-arb: block access for invalid PMIC arbiter v5 SPMI writes Fenglin Wu
2022-08-31 17:40   ` Stephen Boyd
2022-06-12  3:24 ` [RESEND PATCH v6 08/10] dt-bindings: spmi: spmi-pmic-arb: make interrupt properties as optional Fenglin Wu
2022-08-31 17:36   ` Stephen Boyd
2022-09-02 11:41     ` Fenglin Wu
2022-06-12  3:24 ` [RESEND PATCH v6 09/10] spmi: pmic-arb: make interrupt support optional Fenglin Wu
2022-08-30 23:38   ` Stephen Boyd
2022-06-12  3:24 ` [RESEND PATCH v6 10/10] spmi: pmic-arb: increase SPMI transaction timeout delay Fenglin Wu
2022-08-31 17:41   ` Stephen Boyd
  -- strict thread matches above, loose matches on Subject: below --
2022-04-28  1:12 [RESEND PATCH V6 00/10] A bunch of fix and optimization patches in spmi-pmic-arb.c Fenglin Wu
2022-04-28  1:12 ` [RESEND PATCH V6 09/10] spmi: pmic-arb: make interrupt support optional Fenglin Wu

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).