From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=209.85.160.43 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793744784; b=FU67Lmu4QSS+GU9MK0IFoOwZJRaBVKK68WpGlRgCA293HMhdRFzG64nE02bOo+60pFwf KwPXHsQHqcx6XRbzjSNfhHPhCiOxcHY6GF5hFzwVzJuaNYIgNHuuZCM9+HL9rLeouI51C jhAyHBq/b9m0rGmVjIksjSTj4TT7P7sXrQUO7VzcyKfYnNRXj0lie0wTL2r05gSNwAJXh smSNd5WG7ugI9yXDv2gkk/qYMjIu9jNMjYNigfXUjsWNcRyDJGIPyJhfrxHKKVnvkyvzH 28X7gVgqDbJQQANrxBGKh+DnFV+ZevM66FQil6nhde3+PHFurRdt4umoUbzcxsV+xDw== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793744784; h=DMARC-Filter:Received:DKIM-Signature:X-Google-DKIM-Signature: X-Forwarded-Encrypted:X-Gm-Message-State:X-Gm-Gg:X-Received:Received: From:Date:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding: Message-Id:References:In-Reply-To:To:Cc:X-Mailer; bh=++8WqsJMyURRJ440LK5USP3Z9FP1iHwW4W3cxDaZhko=; b=LRIjVR9jQD+Ahw3yhXc6lDVJYHIAI70PRMV1cSGqeIleAzd+o4gUl2Byk0uYA+Am6rSH 0da1rKAaBI7CObK2Np3RfJhoTz9q2PvNf1KnvItGpp4pg/Z+MD90S5xQ0Xzr6BWCXReZ4 HArKVXA2qxZCFA/uveg3J2BgZYG2GYTKZR3PKQla+1xLIltlhFFIlzHaQlTgfNElmud/H 5sYAZmWNJlbiIRkdqkmEeE4Ti2RgbculgAlZw9okczpVhi6Iyg3IiK+NOG2EFjN9/OF0C bmRdBVG8cLnGRkGQCN+QTsMVlQVe+0QOsE8C7dGKOHjW+xfPgqhA1ke3NFVZFWDqYzQ== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20260707 header.b=xMwBvpYu; arc=none smtp.remote-ip=209.85.160.43 Received: from mail-oa1-f43.google.com (mail-oa1-f43.google.com [209.85.160.43]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2349A606EE80 for ; Tue, 3 Nov 2026 22:26:23 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 2349A606EE80 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20260707 header.b=xMwBvpYu Received: by mail-oa1-f43.google.com with SMTP id 586e51a60fabf-4a6f2825dd6so45794fac.2 for ; Tue, 03 Nov 2026 14:26:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20260707; t=1793744783; x=1794349583; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=++8WqsJMyURRJ440LK5USP3Z9FP1iHwW4W3cxDaZhko=; b=xMwBvpYuuEO3tDh6hIParK5xjv1SMp0/9tL0d2NHizCm9pjh+vvgxIwExphwSXncKM PdA0ZDgFNfcWhXn2bez7lsvpwzAAi0dlDPM9O//+3lslT8rxjbVxFGHYH4ndfPBJwUkl +Q3PB40ZzFoJGgRWJ7mVwcAXSuDvzhAT9GS/QCMSNjXHe1uy3YSh8bSi4eFHKKTUAx7g oHqVbeIhuDMrGU5XN7y6ek6d/c6DP4o6qpE284c4StQQ7iYJRHh10Qb2Lf6VIX732m0M Joa9k5DjiDpCXsQKHM/FSeL5hODEXYwKdsiEsDab3zQyUCBOXUjjg9YYKr+4mTaG8ZIz kOpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1793744783; x=1794349583; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=++8WqsJMyURRJ440LK5USP3Z9FP1iHwW4W3cxDaZhko=; b=I5nyH8ag555kcwk80z1Nfwds6I59Oi3KXKbiVvfoVLnjiFiW7P2UxwmG8nTayyjAIc O8OjwoR2XuIAY1zgN0Nbi8bMawYfyJnmx85u/P10acNE1uZKQkCeozvrKE6iscQxDweu oT7ZWQYDVpep5QrtaMVLVBkmuVLu2uujcisiy/ZRP2H686je04Qa+pW/eJMxoQSlo2Fv dgUNJ5DpAavr83qgv8NcI+67kn3h7FbyPsMz7bwkzsr2NS6lDoVoKPUf+RafeU0uIj2F QQa4fkExS5hv30OceJuPMpDnMHP3kU/uM70p8Y3hBX6QCAdUoxnw74jDgH5ILhvhFMHD ZoRQ== X-Forwarded-Encrypted: i=1; AKwUvBzT4mYo2zeQl677adOxzXSsj+G2U57JmZkihcT8KeRLMmnUHbOftkBESyhbUGSOkJDulAuq6qWryPZ4x4k=@vger.kernel.org X-Gm-Message-State: APuU4Z8HVxlphX0jREkDhL8VltccHq170DhUeGvcGawKzZUzJAq0zbCa wR2VOrokQBjWSjCwehVqPtyKe9z2WdE2d4DlBYdbJDWj0OgqcGy4zu97 X-Gm-Gg: AYBFou1SvF30aOasy0L4U2lwwotmJU1eoV4pyisiMbB+ZfGMOswDmDzED3g+StkbISE DT4S3khRvGyHdwHM2s1NfQtK3bNnv+/pt3AKlQxKBI5CqGdZIVQy3EJJhK4dvUqTcu9UQm281G6 a7pmvItYMm+J0OM4kc24tF9AWe7uXVTMwmzfw3AZ85UcN0Fuv7DcoRZQvjbgUcpQO1+SLA0QN1l q9uvPQ6MJd2utmpma0D/fh2aDQQPHOWqfloVUNZEXZ7In+RlHX619iWnCfbDhncqlay6H6GEhVa 86qSTtqZbj1ItYuQ8b5+bvpqmiTL+8mhIfCM+8OLVS436KmF8xTgC1mBJ2/fB84PQGddr1e+y7G 62MWOXJRKopQVRrtudYEUbkdPt9pW8viZZ6vCqgc9ps3VYcOu7ZMcHyli6Q1Cm8sOuhhJbVFTGB Clfoslev7DZskdAwUWEpgfoAL43MOBK/Tk7XIfgwbTx2JmLlVrMIJotGO+IhA4IvSagAd0uE5RE WN+TxFN4YVa3Yo1nLmffQhUTT9uXWxxk+sk9VLL+RSprLspNXuHFx0plyPXb6uRjXbPMcEaSxuI 5Do5/ecGef2QVPlNvVGeJ9k4M6YTvXeUvSCT4iPDhui3Gh6r9G1Zbr6DlakS8D9YIcmjmlwWCAv yHnwuEINUrjTAtwWQz+oS75R+xsc2TEqI5FEZ603kjhuk2MOgN3b0oK0RW7+6FFBii2A29+79gx 0JG8q6nGjs26SzmHnZmkeY1bFimZpVBw0Hlk9/V8OR8+adWZpnrvzR X-Received: by 2002:a05:6808:6415:b0:564:b24:af6a with SMTP id 5614622812f47-5640dde8044mr9712839b6e.38.1793744783016; Tue, 03 Nov 2026 14:26:23 -0800 (PST) Received: from [127.0.1.1] (174-29-1-49.hlrn.qwest.net. [174.29.1.49]) by smtp.gmail.com with ESMTPSA id 5614622812f47-567a9ef58b1sm128435b6e.3.2026.11.03.14.26.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Nov 2026 14:26:22 -0800 (PST) From: James Hilliard Date: Tue, 03 Nov 2026 15:26:08 -0700 Subject: [PATCH v6 06/10] dmaengine: dw: simplify transfer-complete handling X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261103-submit-dw-dma-synchronize-v1-v6-6-2ee0c348224d@gmail.com> References: <20261103-submit-dw-dma-synchronize-v1-v6-0-2ee0c348224d@gmail.com> In-Reply-To: <20261103-submit-dw-dma-synchronize-v1-v6-0-2ee0c348224d@gmail.com> To: Viresh Kumar , Andy Shevchenko , Vinod Koul , Frank Li , Dan Williams Cc: Serge Semin , Greg Kroah-Hartman , Jiri Slaby , =?utf-8?q?Ilpo_J=C3=A4rvinen?= , dmaengine@vger.kernel.org, linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, Sashiko , Lars-Peter Clausen , James Hilliard X-Mailer: b4 0.15.2 With hardware-LLP residue handled by the status getter, the descriptor scanner only needs to process transfer-complete events. Return through a common unlock path when no event or active descriptor remains, and flatten the completion handling. Only one transaction is active on a channel. Detach that descriptor before starting the next queued transfer, keeping cookie completion under the channel lock and client notification outside it. Preserve software-LLP block advancement before completing the transaction. Signed-off-by: James Hilliard --- drivers/dma/dw/core.c | 92 +++++++++++++++++++++------------------------------ 1 file changed, 38 insertions(+), 54 deletions(-) diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c index d9127337c849..3cc8579f8829 100644 --- a/drivers/dma/dw/core.c +++ b/drivers/dma/dw/core.c @@ -297,74 +297,58 @@ static void dwc_scan_descriptors(struct dw_dma *dw, struct dw_dma_chan *dwc) { struct dw_desc *desc, *_desc; struct dw_desc *child; - u32 status_xfer; unsigned long flags; LIST_HEAD(list); spin_lock_irqsave(&dwc->lock, flags); - status_xfer = dma_readl(dw, RAW.XFER); - - if (status_xfer & dwc->mask) { - /* Everything we've submitted is done */ - dma_writel(dw, CLEAR.XFER, dwc->mask); - if (list_empty(&dwc->active_list)) { - spin_unlock_irqrestore(&dwc->lock, flags); - return; - } - - if (test_bit(DW_DMA_IS_SOFT_LLP, &dwc->flags)) { - struct list_head *head, *active = dwc->tx_node_active; - - /* - * We are inside first active descriptor. - * Otherwise something is really wrong. - */ - desc = dwc_first_active(dwc); - - head = &desc->tx_list; - if (active != head) { - /* Update residue to reflect last sent descriptor */ - if (active == head->next) - desc->residue -= desc->len; - else - desc->residue -= to_dw_desc(active->prev)->len; - child = to_dw_desc(active); - - /* Submit next block */ - dwc_do_single_block(dwc, child); + if (!(dma_readl(dw, RAW.XFER) & dwc->mask)) + goto unlock; - spin_unlock_irqrestore(&dwc->lock, flags); - return; - } + dma_writel(dw, CLEAR.XFER, dwc->mask); + if (list_empty(&dwc->active_list)) + goto unlock; - /* We are done here */ - clear_bit(DW_DMA_IS_SOFT_LLP, &dwc->flags); + desc = dwc_first_active(dwc); + if (test_bit(DW_DMA_IS_SOFT_LLP, &dwc->flags)) { + struct list_head *head = &desc->tx_list; + struct list_head *active = dwc->tx_node_active; + + if (active != head) { + /* Update residue to reflect last sent descriptor. */ + if (active == head->next) + desc->residue -= desc->len; + else + desc->residue -= to_dw_desc(active->prev)->len; + + child = to_dw_desc(active); + + /* Submit next block, including for polled transfers. */ + dwc_do_single_block(dwc, child); + goto unlock; } - if (dma_readl(dw, CH_EN) & dwc->mask) { - dev_err(dmaengine_chan_dev(&dwc->chan), - "BUG: XFER bit set, but channel not idle!\n"); - - /* Try to continue after resetting the channel... */ - dwc_chan_disable(dw, dwc); - } + clear_bit(DW_DMA_IS_SOFT_LLP, &dwc->flags); + } - /* Detach the completed transfer before starting queued work. */ - list_splice_init(&dwc->active_list, &list); - list_for_each_entry(desc, &list, desc_node) - dma_cookie_complete(&desc->txd); - dwc_dostart_first_queued(dwc); - spin_unlock_irqrestore(&dwc->lock, flags); + if (dma_readl(dw, CH_EN) & dwc->mask) { + dev_err(dmaengine_chan_dev(&dwc->chan), + "BUG: XFER bit set, but channel not idle!\n"); - list_for_each_entry_safe(desc, _desc, &list, desc_node) { - list_del_init(&desc->desc_node); - dwc_descriptor_free(dwc, desc, true); - } - return; + /* Try to continue after resetting the channel... */ + dwc_chan_disable(dw, dwc); } + dma_cookie_complete(&desc->txd); + list_move_tail(&desc->desc_node, &list); + dwc_dostart_first_queued(dwc); +unlock: spin_unlock_irqrestore(&dwc->lock, flags); + + list_for_each_entry_safe(desc, _desc, &list, desc_node) { + list_del_init(&desc->desc_node); + dwc_descriptor_free(dwc, desc, true); + } } static inline void dwc_dump_lli(struct dw_dma_chan *dwc, struct dw_desc *desc) -- 2.53.0