linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/6] soundwire: cadence: better logs and error handling
@ 2020-01-10 21:57 Pierre-Louis Bossart
  2020-01-10 21:57 ` [PATCH 1/6] soundwire: cadence_master: filter out bad interrupts Pierre-Louis Bossart
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: Pierre-Louis Bossart @ 2020-01-10 21:57 UTC (permalink / raw)
  To: alsa-devel
  Cc: linux-kernel, tiwai, broonie, vkoul, gregkh, jank,
	srinivas.kandagatla, slawomir.blauciak, Bard liao, Rander Wang,
	Ranjani Sridharan, Pierre-Louis Bossart

This is a stand-alone set of patches to improve error handling and
provide better information to the platform integrator.

As suggested by Vinod, these patches are shared first - with the risk
that they are separated from the actual steps where they are needed.

For reference, the complete set of 100+ patches required for SoundWire
on Intel platforms is available here:

https://github.com/thesofproject/linux/pull/1692

Pierre-Louis Bossart (4):
  soundwire: cadence_master: filter out bad interrupts
  soundwire: cadence_master: log more useful information during timeouts
  soundwire: cadence_master: handle multiple status reports per Slave
  soundwire: bus: check first if Slaves become UNATTACHED

Rander Wang (2):
  soundwire: cadence_master: clear interrupt status before enabling
    interrupt
  soundwire: cadence_master: remove config update for interrupt setting

 drivers/soundwire/bus.c            | 18 +++++++++
 drivers/soundwire/cadence_master.c | 60 +++++++++++++++++++++++++-----
 2 files changed, 68 insertions(+), 10 deletions(-)


base-commit: b637124800a157c4df3699d1137d8533394f7678
-- 
2.20.1


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

* [PATCH 1/6] soundwire: cadence_master: filter out bad interrupts
  2020-01-10 21:57 [PATCH 0/6] soundwire: cadence: better logs and error handling Pierre-Louis Bossart
@ 2020-01-10 21:57 ` Pierre-Louis Bossart
  2020-01-10 21:57 ` [PATCH 2/6] soundwire: cadence_master: clear interrupt status before enabling interrupt Pierre-Louis Bossart
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Pierre-Louis Bossart @ 2020-01-10 21:57 UTC (permalink / raw)
  To: alsa-devel
  Cc: linux-kernel, tiwai, broonie, vkoul, gregkh, jank,
	srinivas.kandagatla, slawomir.blauciak, Bard liao, Rander Wang,
	Ranjani Sridharan, Pierre-Louis Bossart, Sanyog Kale

If somehow we read the interrupt status while the IP is not powered
the result is probably undefined or 0xffffffff. We do know that some
of the bits are reserved and read as zero, so use as a filter to
discard invalid configurations.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
---
 drivers/soundwire/cadence_master.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c
index fed21e2b2277..a0ec21b64d42 100644
--- a/drivers/soundwire/cadence_master.c
+++ b/drivers/soundwire/cadence_master.c
@@ -74,6 +74,7 @@ MODULE_PARM_DESC(cdns_mcp_int_mask, "Cadence MCP IntMask");
 #define CDNS_MCP_INTMASK			0x48
 
 #define CDNS_MCP_INT_IRQ			BIT(31)
+#define CDNS_MCP_INT_RESERVED1			GENMASK(30, 17)
 #define CDNS_MCP_INT_WAKEUP			BIT(16)
 #define CDNS_MCP_INT_SLAVE_RSVD			BIT(15)
 #define CDNS_MCP_INT_SLAVE_ALERT		BIT(14)
@@ -85,10 +86,12 @@ MODULE_PARM_DESC(cdns_mcp_int_mask, "Cadence MCP IntMask");
 #define CDNS_MCP_INT_DATA_CLASH			BIT(9)
 #define CDNS_MCP_INT_PARITY			BIT(8)
 #define CDNS_MCP_INT_CMD_ERR			BIT(7)
+#define CDNS_MCP_INT_RESERVED2			GENMASK(6, 4)
 #define CDNS_MCP_INT_RX_NE			BIT(3)
 #define CDNS_MCP_INT_RX_WL			BIT(2)
 #define CDNS_MCP_INT_TXE			BIT(1)
 #define CDNS_MCP_INT_TXF			BIT(0)
+#define CDNS_MCP_INT_RESERVED (CDNS_MCP_INT_RESERVED1 | CDNS_MCP_INT_RESERVED2)
 
 #define CDNS_MCP_INTSET				0x4C
 
@@ -705,6 +708,10 @@ irqreturn_t sdw_cdns_irq(int irq, void *dev_id)
 
 	int_status = cdns_readl(cdns, CDNS_MCP_INTSTAT);
 
+	/* check for reserved values read as zero */
+	if (int_status & CDNS_MCP_INT_RESERVED)
+		return IRQ_NONE;
+
 	if (!(int_status & CDNS_MCP_INT_IRQ))
 		return IRQ_NONE;
 
-- 
2.20.1


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

* [PATCH 2/6] soundwire: cadence_master: clear interrupt status before enabling interrupt
  2020-01-10 21:57 [PATCH 0/6] soundwire: cadence: better logs and error handling Pierre-Louis Bossart
  2020-01-10 21:57 ` [PATCH 1/6] soundwire: cadence_master: filter out bad interrupts Pierre-Louis Bossart
@ 2020-01-10 21:57 ` Pierre-Louis Bossart
  2020-01-10 21:57 ` [PATCH 3/6] soundwire: cadence_master: log more useful information during timeouts Pierre-Louis Bossart
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Pierre-Louis Bossart @ 2020-01-10 21:57 UTC (permalink / raw)
  To: alsa-devel
  Cc: linux-kernel, tiwai, broonie, vkoul, gregkh, jank,
	srinivas.kandagatla, slawomir.blauciak, Bard liao, Rander Wang,
	Ranjani Sridharan, Rander Wang, Pierre-Louis Bossart,
	Sanyog Kale

From: Rander Wang <rander.wang@intel.com>

make sure all interrupts status are cleared before enabling interrupt
so that there is no unexpected interrupt triggered.

Signed-off-by: Rander Wang <rander.wang@intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
---
 drivers/soundwire/cadence_master.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c
index a0ec21b64d42..847b8f5f0a32 100644
--- a/drivers/soundwire/cadence_master.c
+++ b/drivers/soundwire/cadence_master.c
@@ -856,6 +856,16 @@ int sdw_cdns_enable_interrupt(struct sdw_cdns *cdns, bool state)
 		mask = interrupt_mask;
 
 update_masks:
+	/* clear slave interrupt status before enabling interrupt */
+	if (state) {
+		u32 slave_state;
+
+		slave_state = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT0);
+		cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT0, slave_state);
+		slave_state = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT1);
+		cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT1, slave_state);
+	}
+
 	cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK0, slave_intmask0);
 	cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK1, slave_intmask1);
 	cdns_writel(cdns, CDNS_MCP_INTMASK, mask);
-- 
2.20.1


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

* [PATCH 3/6] soundwire: cadence_master: log more useful information during timeouts
  2020-01-10 21:57 [PATCH 0/6] soundwire: cadence: better logs and error handling Pierre-Louis Bossart
  2020-01-10 21:57 ` [PATCH 1/6] soundwire: cadence_master: filter out bad interrupts Pierre-Louis Bossart
  2020-01-10 21:57 ` [PATCH 2/6] soundwire: cadence_master: clear interrupt status before enabling interrupt Pierre-Louis Bossart
@ 2020-01-10 21:57 ` Pierre-Louis Bossart
  2020-01-10 21:57 ` [PATCH 4/6] soundwire: cadence_master: remove config update for interrupt setting Pierre-Louis Bossart
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Pierre-Louis Bossart @ 2020-01-10 21:57 UTC (permalink / raw)
  To: alsa-devel
  Cc: linux-kernel, tiwai, broonie, vkoul, gregkh, jank,
	srinivas.kandagatla, slawomir.blauciak, Bard liao, Rander Wang,
	Ranjani Sridharan, Pierre-Louis Bossart, Sanyog Kale

Add the type of command, device number, register offset and length to
reverse engineer what caused the issue.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
---
 drivers/soundwire/cadence_master.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c
index 847b8f5f0a32..6ef2f759310d 100644
--- a/drivers/soundwire/cadence_master.c
+++ b/drivers/soundwire/cadence_master.c
@@ -447,7 +447,8 @@ _cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd,
 	time = wait_for_completion_timeout(&cdns->tx_complete,
 					   msecs_to_jiffies(CDNS_TX_TIMEOUT));
 	if (!time) {
-		dev_err(cdns->dev, "IO transfer timed out\n");
+		dev_err(cdns->dev, "IO transfer timed out, cmd %d device %d addr %x len %d\n",
+			cmd, msg->dev_num, msg->addr, msg->len);
 		msg->len = 0;
 		return SDW_CMD_TIMEOUT;
 	}
-- 
2.20.1


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

* [PATCH 4/6] soundwire: cadence_master: remove config update for interrupt setting
  2020-01-10 21:57 [PATCH 0/6] soundwire: cadence: better logs and error handling Pierre-Louis Bossart
                   ` (2 preceding siblings ...)
  2020-01-10 21:57 ` [PATCH 3/6] soundwire: cadence_master: log more useful information during timeouts Pierre-Louis Bossart
@ 2020-01-10 21:57 ` Pierre-Louis Bossart
  2020-01-10 21:57 ` [PATCH 5/6] soundwire: cadence_master: handle multiple status reports per Slave Pierre-Louis Bossart
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Pierre-Louis Bossart @ 2020-01-10 21:57 UTC (permalink / raw)
  To: alsa-devel
  Cc: linux-kernel, tiwai, broonie, vkoul, gregkh, jank,
	srinivas.kandagatla, slawomir.blauciak, Bard liao, Rander Wang,
	Ranjani Sridharan, Rander Wang, Pierre-Louis Bossart,
	Sanyog Kale

From: Rander Wang <rander.wang@intel.com>

Config only needs to be updated when setting MCP_Config, MCP_Control
and MCP_CmdCtrl to make these register setting effective. When updating
config in master, master will communicate with slave to update status.
Communication will be failed when masters and slaves are in clock stop
state, and this unnecessary config update makes interrupt setting failed.

Tested on Comet Lake with soundwire enabled

Signed-off-by: Rander Wang <rander.wang@intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
---
 drivers/soundwire/cadence_master.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c
index 6ef2f759310d..19b4862e8cce 100644
--- a/drivers/soundwire/cadence_master.c
+++ b/drivers/soundwire/cadence_master.c
@@ -820,7 +820,7 @@ int sdw_cdns_exit_reset(struct sdw_cdns *cdns)
 EXPORT_SYMBOL(sdw_cdns_exit_reset);
 
 /**
- * sdw_cdns_enable_interrupt() - Enable SDW interrupts and update config
+ * sdw_cdns_enable_interrupt() - Enable SDW interrupts
  * @cdns: Cadence instance
  */
 int sdw_cdns_enable_interrupt(struct sdw_cdns *cdns, bool state)
@@ -871,8 +871,7 @@ int sdw_cdns_enable_interrupt(struct sdw_cdns *cdns, bool state)
 	cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK1, slave_intmask1);
 	cdns_writel(cdns, CDNS_MCP_INTMASK, mask);
 
-	/* commit changes */
-	return cdns_update_config(cdns);
+	return 0;
 }
 EXPORT_SYMBOL(sdw_cdns_enable_interrupt);
 
-- 
2.20.1


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

* [PATCH 5/6] soundwire: cadence_master: handle multiple status reports per Slave
  2020-01-10 21:57 [PATCH 0/6] soundwire: cadence: better logs and error handling Pierre-Louis Bossart
                   ` (3 preceding siblings ...)
  2020-01-10 21:57 ` [PATCH 4/6] soundwire: cadence_master: remove config update for interrupt setting Pierre-Louis Bossart
@ 2020-01-10 21:57 ` Pierre-Louis Bossart
  2020-01-10 21:57 ` [PATCH 6/6] soundwire: bus: check first if Slaves become UNATTACHED Pierre-Louis Bossart
  2020-01-14  6:24 ` [PATCH 0/6] soundwire: cadence: better logs and error handling Vinod Koul
  6 siblings, 0 replies; 8+ messages in thread
From: Pierre-Louis Bossart @ 2020-01-10 21:57 UTC (permalink / raw)
  To: alsa-devel
  Cc: linux-kernel, tiwai, broonie, vkoul, gregkh, jank,
	srinivas.kandagatla, slawomir.blauciak, Bard liao, Rander Wang,
	Ranjani Sridharan, Pierre-Louis Bossart, Sanyog Kale

When a Slave reports multiple status in the sticky bits, find the
latest configuration from the mirror of the PING frame status and
update the status directly.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
---
 drivers/soundwire/cadence_master.c | 35 +++++++++++++++++++++++++-----
 1 file changed, 29 insertions(+), 6 deletions(-)

diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c
index 19b4862e8cce..b0de7d752bdb 100644
--- a/drivers/soundwire/cadence_master.c
+++ b/drivers/soundwire/cadence_master.c
@@ -676,13 +676,36 @@ static int cdns_update_slave_status(struct sdw_cdns *cdns,
 
 		/* first check if Slave reported multiple status */
 		if (set_status > 1) {
+			u32 val;
+
 			dev_warn_ratelimited(cdns->dev,
-					     "Slave reported multiple Status: %d\n",
-					     mask);
-			/*
-			 * TODO: we need to reread the status here by
-			 * issuing a PING cmd
-			 */
+					     "Slave %d reported multiple Status: %d\n",
+					     i, mask);
+
+			/* check latest status extracted from PING commands */
+			val = cdns_readl(cdns, CDNS_MCP_SLAVE_STAT);
+			val >>= (i * 2);
+
+			switch (val & 0x3) {
+			case 0:
+				status[i] = SDW_SLAVE_UNATTACHED;
+				break;
+			case 1:
+				status[i] = SDW_SLAVE_ATTACHED;
+				break;
+			case 2:
+				status[i] = SDW_SLAVE_ALERT;
+				break;
+			case 3:
+			default:
+				status[i] = SDW_SLAVE_RESERVED;
+				break;
+			}
+
+			dev_warn_ratelimited(cdns->dev,
+					     "Slave %d status updated to %d\n",
+					     i, status[i]);
+
 		}
 	}
 
-- 
2.20.1


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

* [PATCH 6/6] soundwire: bus: check first if Slaves become UNATTACHED
  2020-01-10 21:57 [PATCH 0/6] soundwire: cadence: better logs and error handling Pierre-Louis Bossart
                   ` (4 preceding siblings ...)
  2020-01-10 21:57 ` [PATCH 5/6] soundwire: cadence_master: handle multiple status reports per Slave Pierre-Louis Bossart
@ 2020-01-10 21:57 ` Pierre-Louis Bossart
  2020-01-14  6:24 ` [PATCH 0/6] soundwire: cadence: better logs and error handling Vinod Koul
  6 siblings, 0 replies; 8+ messages in thread
From: Pierre-Louis Bossart @ 2020-01-10 21:57 UTC (permalink / raw)
  To: alsa-devel
  Cc: linux-kernel, tiwai, broonie, vkoul, gregkh, jank,
	srinivas.kandagatla, slawomir.blauciak, Bard liao, Rander Wang,
	Ranjani Sridharan, Pierre-Louis Bossart, Sanyog Kale

Before checking for the presence of Device0, we first need to clean-up
the internal state of Slaves that are no longer attached.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
---
 drivers/soundwire/bus.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c
index be5d437058ed..66fd09e36b73 100644
--- a/drivers/soundwire/bus.c
+++ b/drivers/soundwire/bus.c
@@ -979,6 +979,24 @@ int sdw_handle_slave_status(struct sdw_bus *bus,
 	struct sdw_slave *slave;
 	int i, ret = 0;
 
+	/* first check if any Slaves fell off the bus */
+	for (i = 1; i <= SDW_MAX_DEVICES; i++) {
+		mutex_lock(&bus->bus_lock);
+		if (test_bit(i, bus->assigned) == false) {
+			mutex_unlock(&bus->bus_lock);
+			continue;
+		}
+		mutex_unlock(&bus->bus_lock);
+
+		slave = sdw_get_slave(bus, i);
+		if (!slave)
+			continue;
+
+		if (status[i] == SDW_SLAVE_UNATTACHED &&
+		    slave->status != SDW_SLAVE_UNATTACHED)
+			sdw_modify_slave_status(slave, SDW_SLAVE_UNATTACHED);
+	}
+
 	if (status[0] == SDW_SLAVE_ATTACHED) {
 		dev_dbg(bus->dev, "Slave attached, programming device number\n");
 		ret = sdw_program_device_num(bus);
-- 
2.20.1


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

* Re: [PATCH 0/6] soundwire: cadence: better logs and error handling
  2020-01-10 21:57 [PATCH 0/6] soundwire: cadence: better logs and error handling Pierre-Louis Bossart
                   ` (5 preceding siblings ...)
  2020-01-10 21:57 ` [PATCH 6/6] soundwire: bus: check first if Slaves become UNATTACHED Pierre-Louis Bossart
@ 2020-01-14  6:24 ` Vinod Koul
  6 siblings, 0 replies; 8+ messages in thread
From: Vinod Koul @ 2020-01-14  6:24 UTC (permalink / raw)
  To: Pierre-Louis Bossart
  Cc: alsa-devel, linux-kernel, tiwai, broonie, gregkh, jank,
	srinivas.kandagatla, slawomir.blauciak, Bard liao, Rander Wang,
	Ranjani Sridharan

On 10-01-20, 15:57, Pierre-Louis Bossart wrote:
> This is a stand-alone set of patches to improve error handling and
> provide better information to the platform integrator.
> 
> As suggested by Vinod, these patches are shared first - with the risk
> that they are separated from the actual steps where they are needed.
> 
> For reference, the complete set of 100+ patches required for SoundWire
> on Intel platforms is available here:

Applied all, thanks

-- 
~Vinod

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

end of thread, other threads:[~2020-01-14  6:24 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-10 21:57 [PATCH 0/6] soundwire: cadence: better logs and error handling Pierre-Louis Bossart
2020-01-10 21:57 ` [PATCH 1/6] soundwire: cadence_master: filter out bad interrupts Pierre-Louis Bossart
2020-01-10 21:57 ` [PATCH 2/6] soundwire: cadence_master: clear interrupt status before enabling interrupt Pierre-Louis Bossart
2020-01-10 21:57 ` [PATCH 3/6] soundwire: cadence_master: log more useful information during timeouts Pierre-Louis Bossart
2020-01-10 21:57 ` [PATCH 4/6] soundwire: cadence_master: remove config update for interrupt setting Pierre-Louis Bossart
2020-01-10 21:57 ` [PATCH 5/6] soundwire: cadence_master: handle multiple status reports per Slave Pierre-Louis Bossart
2020-01-10 21:57 ` [PATCH 6/6] soundwire: bus: check first if Slaves become UNATTACHED Pierre-Louis Bossart
2020-01-14  6:24 ` [PATCH 0/6] soundwire: cadence: better logs and error handling Vinod Koul

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