From 3de804bde168ea7ac6f3584d71fca43eddb1dd7a Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Apr 20 2023 11:00:23 +0000 Subject: dmaengine: apple-admac: Handle 'global' interrupt flags (bsc#1012628). --- diff --git a/patches.kernel.org/6.2.12-044-dmaengine-apple-admac-Handle-global-interrupt-.patch b/patches.kernel.org/6.2.12-044-dmaengine-apple-admac-Handle-global-interrupt-.patch new file mode 100644 index 0000000..e8e7f0f --- /dev/null +++ b/patches.kernel.org/6.2.12-044-dmaengine-apple-admac-Handle-global-interrupt-.patch @@ -0,0 +1,73 @@ +From: =?UTF-8?q?Martin=20Povi=C5=A1er?= +Date: Fri, 24 Feb 2023 16:22:20 +0100 +Subject: [PATCH] dmaengine: apple-admac: Handle 'global' interrupt flags +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +References: bsc#1012628 +Patch-mainline: 6.2.12 +Git-commit: a288fd158fbf85c06a9ac01cecabf97ac5d962e7 + +[ Upstream commit a288fd158fbf85c06a9ac01cecabf97ac5d962e7 ] + +In addition to TX channel and RX channel interrupt flags there's +another class of 'global' interrupt flags with unknown semantics. Those +weren't being handled up to now, and they are the suspected cause of +stuck IRQ states that have been sporadically occurring. Check the global +flags and clear them if raised. + +Fixes: b127315d9a78 ("dmaengine: apple-admac: Add Apple ADMAC driver") +Signed-off-by: Martin PoviĊĦer +Link: https://lore.kernel.org/r/20230224152222.26732-1-povik+lin@cutebit.org +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +Signed-off-by: Jiri Slaby +--- + drivers/dma/apple-admac.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +diff --git a/drivers/dma/apple-admac.c b/drivers/dma/apple-admac.c +index 90f28bda..00cbfafe 100644 +--- a/drivers/dma/apple-admac.c ++++ b/drivers/dma/apple-admac.c +@@ -75,6 +75,7 @@ + + #define REG_TX_INTSTATE(idx) (0x0030 + (idx) * 4) + #define REG_RX_INTSTATE(idx) (0x0040 + (idx) * 4) ++#define REG_GLOBAL_INTSTATE(idx) (0x0050 + (idx) * 4) + #define REG_CHAN_INTSTATUS(ch, idx) (0x8010 + (ch) * 0x200 + (idx) * 4) + #define REG_CHAN_INTMASK(ch, idx) (0x8020 + (ch) * 0x200 + (idx) * 4) + +@@ -672,13 +673,14 @@ static void admac_handle_chan_int(struct admac_data *ad, int no) + static irqreturn_t admac_interrupt(int irq, void *devid) + { + struct admac_data *ad = devid; +- u32 rx_intstate, tx_intstate; ++ u32 rx_intstate, tx_intstate, global_intstate; + int i; + + rx_intstate = readl_relaxed(ad->base + REG_RX_INTSTATE(ad->irq_index)); + tx_intstate = readl_relaxed(ad->base + REG_TX_INTSTATE(ad->irq_index)); ++ global_intstate = readl_relaxed(ad->base + REG_GLOBAL_INTSTATE(ad->irq_index)); + +- if (!tx_intstate && !rx_intstate) ++ if (!tx_intstate && !rx_intstate && !global_intstate) + return IRQ_NONE; + + for (i = 0; i < ad->nchannels; i += 2) { +@@ -693,6 +695,12 @@ static irqreturn_t admac_interrupt(int irq, void *devid) + rx_intstate >>= 1; + } + ++ if (global_intstate) { ++ dev_warn(ad->dev, "clearing unknown global interrupt flag: %x\n", ++ global_intstate); ++ writel_relaxed(~(u32) 0, ad->base + REG_GLOBAL_INTSTATE(ad->irq_index)); ++ } ++ + return IRQ_HANDLED; + } + +-- +2.35.3 + diff --git a/series.conf b/series.conf index 10dfcb9..1d8a475 100644 --- a/series.conf +++ b/series.conf @@ -2271,6 +2271,7 @@ patches.kernel.org/6.2.12-041-RDMA-cma-Allow-UD-qp_type-to-join-multicast-on.patch patches.kernel.org/6.2.12-042-bpf-tcp-Use-sock_gen_put-instead-of-sock_put-i.patch patches.kernel.org/6.2.12-043-LoongArch-bpf-Fix-jit-to-skip-speculation-barr.patch + patches.kernel.org/6.2.12-044-dmaengine-apple-admac-Handle-global-interrupt-.patch ######################################################## # Build fixes that apply to the vanilla kernel too.