| From b478c93c33ddcd3798a8662732b33bf430a54107 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 16 Feb 2021 17:13:42 -0700 |
| Subject: dmaengine: idxd: Fix clobbering of SWERR overflow bit on writeback |
| |
| From: Dave Jiang <dave.jiang@intel.com> |
| |
| [ Upstream commit ea941ac294d75d0ace50797aebf0056f6f8f7a7f ] |
| |
| Current code blindly writes over the SWERR and the OVERFLOW bits. Write |
| back the bits actually read instead so the driver avoids clobbering the |
| OVERFLOW bit that comes after the register is read. |
| |
| Fixes: bfe1d56091c1 ("dmaengine: idxd: Init and probe for Intel data accelerators") |
| Reported-by: Sanjay Kumar <sanjay.k.kumar@intel.com> |
| Signed-off-by: Dave Jiang <dave.jiang@intel.com> |
| Link: https://lore.kernel.org/r/161352082229.3511254.1002151220537623503.stgit@djiang5-desk3.ch.intel.com |
| Signed-off-by: Vinod Koul <vkoul@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/dma/idxd/irq.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/dma/idxd/irq.c b/drivers/dma/idxd/irq.c |
| index a60ca11a5784..f1463fc58112 100644 |
| --- a/drivers/dma/idxd/irq.c |
| +++ b/drivers/dma/idxd/irq.c |
| @@ -124,7 +124,9 @@ static int process_misc_interrupts(struct idxd_device *idxd, u32 cause) |
| for (i = 0; i < 4; i++) |
| idxd->sw_err.bits[i] = ioread64(idxd->reg_base + |
| IDXD_SWERR_OFFSET + i * sizeof(u64)); |
| - iowrite64(IDXD_SWERR_ACK, idxd->reg_base + IDXD_SWERR_OFFSET); |
| + |
| + iowrite64(idxd->sw_err.bits[0] & IDXD_SWERR_ACK, |
| + idxd->reg_base + IDXD_SWERR_OFFSET); |
| |
| if (idxd->sw_err.valid && idxd->sw_err.wq_idx_valid) { |
| int id = idxd->sw_err.wq_idx; |
| -- |
| 2.30.2 |
| |