From nobody Tue Apr 7 01:34:19 2026 Received: from mx.nabladev.com (mx.nabladev.com [178.251.229.89]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AD88932B989; Mon, 16 Mar 2026 22:25:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=178.251.229.89 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773699936; cv=none; b=qr9ihrfBBUd0Rc8oJPLS3W5m0sDD8yq5+DlpuTVtW+2jt1gSh6JmX/mLeLDuuKMtH/dKRGotpRZNNxfrDCY9aEBA3XxrUwTwCm0c9dAEOj+KDpyXOyf3h5Q9CVi+RDtWtGOB+tHz2N2h2CmRDoKi4Umf4oWpcQvzyFgDMDtbvhQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773699936; c=relaxed/simple; bh=cPNvEvxHxameKKNzF8eiKWQjW9PXSmlz8namd2mC1TQ=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=MYyVaPdOiIRESS6IA6RGLhuATOH4XDPPHYvMSkG1TTgmsCdWZ5q8F5ezltwe4ZKNcVsEs1nMEyvbwoJDAA6iuu6o8vva2Q30vRmfmihsWvxkKdTqeZNjOb4jroiHzblgV/78uFKOESp1ae1aOVz8q9PiNXy9Vwn8lpAJqJk0YBo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nabladev.com; spf=pass smtp.mailfrom=nabladev.com; dkim=pass (2048-bit key) header.d=nabladev.com header.i=@nabladev.com header.b=OD5qwL8v; arc=none smtp.client-ip=178.251.229.89 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nabladev.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nabladev.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nabladev.com header.i=@nabladev.com header.b="OD5qwL8v" Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 1B30110B833; Mon, 16 Mar 2026 23:25:31 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nabladev.com; s=dkim; t=1773699932; h=from:subject:date:message-id:to:cc:mime-version: content-transfer-encoding; bh=yesz3TLnlVcpzCTRtmZKcz16YVTRA/sjUd1tdRoIf5k=; b=OD5qwL8vL4+FKjs+8oJ/v/K668ZcXnGbLdVGAvQOgeD6r4R4pncUXU6CY9lEtVG7RboCsw 4/k2Vyh1SrCzYLbjfffTk7Hjx4j3vLFZ2visF3HuwL2p/pM5JSK45+4Gc2LvmJ8aPOwzG4 ZqDMAZTHptjw0h6uB4iC2uJFbX5Foj3hQbBCIkKQfdDJ6Meez/jrFPaCRshE2yfdiql1/9 okgNhFQGYl2rID/PKdLvfd7GFIkBLSlpHEPkCf4NzEMN4TWeJ0QNTJJkGg7lC9MdAR1zpp Xlm6iSDClHYM1XgOgLwrn6n5F+KdMFUzE5+HlGUgzek6c+te2xVh/tFMmpGhqQ== From: Marek Vasut To: dmaengine@vger.kernel.org Cc: Marek Vasut , Michal Simek , Radhey Shyam Pandey , Rahul Navale , Sasha Levin , Suraj Gupta , Thomas Gessler , Vinod Koul , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH] dmaengine: xilinx: xilinx_dma: Fix unmasked residue subtraction Date: Mon, 16 Mar 2026 23:25:24 +0100 Message-ID: <20260316222530.163815-1-marex@nabladev.com> X-Mailer: git-send-email 2.51.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Last-TLS-Session-Version: TLSv1.3 Content-Type: text/plain; charset="utf-8" The segment .control and .status fields both contain top bits which are not part of the buffer size, the buffer size is located only in the bottom max_buffer_len bits. To avoid interference from those top bits, mask out the size using max_buffer_len first, and only then subtract the values. Fixes: a575d0b4e663 ("dmaengine: xilinx_dma: Introduce xilinx_dma_get_resid= ue") Signed-off-by: Marek Vasut --- Cc: Michal Simek Cc: Radhey Shyam Pandey Cc: Rahul Navale Cc: Sasha Levin Cc: Suraj Gupta Cc: Thomas Gessler Cc: Vinod Koul Cc: dmaengine@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org --- drivers/dma/xilinx/xilinx_dma.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dm= a.c index 6e8e348973a9e..4f88ba92bd2d8 100644 --- a/drivers/dma/xilinx/xilinx_dma.c +++ b/drivers/dma/xilinx/xilinx_dma.c @@ -997,16 +997,16 @@ static u32 xilinx_dma_get_residue(struct xilinx_dma_c= han *chan, struct xilinx_cdma_tx_segment, node); cdma_hw =3D &cdma_seg->hw; - residue +=3D (cdma_hw->control - cdma_hw->status) & - chan->xdev->max_buffer_len; + residue +=3D (cdma_hw->control & chan->xdev->max_buffer_len) - + (cdma_hw->status & chan->xdev->max_buffer_len); } else if (chan->xdev->dma_config->dmatype =3D=3D XDMA_TYPE_AXIDMA) { axidma_seg =3D list_entry(entry, struct xilinx_axidma_tx_segment, node); axidma_hw =3D &axidma_seg->hw; - residue +=3D (axidma_hw->control - axidma_hw->status) & - chan->xdev->max_buffer_len; + residue +=3D (axidma_hw->control & chan->xdev->max_buffer_len) - + (axidma_hw->status & chan->xdev->max_buffer_len); } else { aximcdma_seg =3D list_entry(entry, @@ -1014,8 +1014,8 @@ static u32 xilinx_dma_get_residue(struct xilinx_dma_c= han *chan, node); aximcdma_hw =3D &aximcdma_seg->hw; residue +=3D - (aximcdma_hw->control - aximcdma_hw->status) & - chan->xdev->max_buffer_len; + (aximcdma_hw->control & chan->xdev->max_buffer_len) - + (aximcdma_hw->status & chan->xdev->max_buffer_len); } } =20 --=20 2.51.0