From patchwork Fri Jun 19 04:53:30 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yuanshen Cao X-Patchwork-Id: 2446 Return-Path: X-Original-To: noreply@patchwork.local Delivered-To: noreply@patchwork.local Received: from sto.lore.kernel.org (sto.lore.kernel.org [172.232.135.74]) by mxe881.netcup.net (Postfix) with ESMTPS id C80931C00CA for ; Fri, 19 Jun 2026 06:54:39 +0200 (CEST) Authentication-Results: mxe881; dkim=pass header.d=gmail.com; spf=pass (sender IP is 172.232.135.74) smtp.mailfrom=linux-sunxi+bounces-23871-noreply=patchwork.local@lists.linux.dev smtp.helo=sto.lore.kernel.org Received-SPF: pass (mxe881: domain of lists.linux.dev designates 172.232.135.74 as permitted sender) client-ip=172.232.135.74; envelope-from=linux-sunxi+bounces-23871-noreply=patchwork.local@lists.linux.dev; helo=sto.lore.kernel.org; Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sto.lore.kernel.org (Postfix) with ESMTP id 732B6302D745 for ; Fri, 19 Jun 2026 04:54:34 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0C813334695; Fri, 19 Jun 2026 04:54:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="sozTw4zl" X-Original-To: linux-sunxi@lists.linux.dev Received: from mail-qv1-f50.google.com (mail-qv1-f50.google.com [209.85.219.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 69A4E330656 for ; Fri, 19 Jun 2026 04:54:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781844871; cv=none; b=mSIt4oRUl+NyVJNdN00lkfZ6LYV2bMLdzlodhZL0Emq3LT/Ak1LiIHBtA0ewmDTTox2VtkHoFxFcFdvUa7QjQV8LRHzuYtYKn42lGaQ8UcnY2nshdTKDflymyfy01XAxdSyusJ5NTWmHmZBHB7mlKDlTsfmSBeZbTJD4VVRDW8k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781844871; c=relaxed/simple; bh=7jkweAVlDub3sDgn0UmgLN1vsZX1f1ymTmCOlDqSb5M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q/4Z43JMGACciMujjgvNhD0p9lQLxjetvCMADV0QZgpWB2i6fKTrrYuec/fmyCArf5FZXcNiCZYG6zJ2kWaSCwJA81dJiBWPlXkI1/U7YiFeHyUUo3NR4V90Es5jyr2GnxAES8OZCok4ZhJ0v84jQwzBnKxZnXJoW2SDoWrNBhk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=sozTw4zl; arc=none smtp.client-ip=209.85.219.50 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 Received: by mail-qv1-f50.google.com with SMTP id 6a1803df08f44-8dc09919aa2so28912256d6.3 for ; Thu, 18 Jun 2026 21:54:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781844869; x=1782449669; darn=lists.linux.dev; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=rCbRPFVxEt0WZgFCBiNC0T/3UAfEsH3DPRtt1y+Tp+Y=; b=sozTw4zlb0pX7F/R9gqQ8bOsv2CfgfM2PanctLGCQCQp52KOZVSlADLF3eBR0rYCGk hV4edncGK49kpUfmLko/E291oZWyE3ITcxjRrQ1iovgZ8PGl3D7FDC6ubC8Q8xTSlXhK rJASpM5ItXyHPWEqTswcdN5qlFCM86CAmXjK3jSHevmDlsZ/6MBKcvg+qePFWJageB+3 0JwirajS5GF6M4vGzqBaXYiiANT5BY2yLQ+xCwG3Y4jssHyNz/7bNas89TbJQ0PWye6g CoA6kHgcof67561EetFOuK0iHykDLXYpNd6VgI95TnRu6AhEhxii49O1mFqknUnkqXOB K5dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781844869; x=1782449669; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=rCbRPFVxEt0WZgFCBiNC0T/3UAfEsH3DPRtt1y+Tp+Y=; b=rXbQGAnePJcWlDFml3OBV6/lkIkDqxxPt1vIqfliNeZbdPeCVWB2TA8sZUCaA/UC3e rm0updz94jRvyb1AFrI6Ht0Xpvgx+14+iKYZpAod+lgDlYcgqOscRQXhS0qREOivrKC7 l5ab86EeWSnii3Gn0Ri4MzHXRCDbhq0oGLc1nqMTSfisz4fl9HCzGpgB8gmdDmYcmnlz UbwFvm4OM+HikPqv85cKAOaoelbJ9u4jSdRa+8wc3VjIoZAlvEHgWZk2ZPet2v42cQHD ZDuwH1lUqjWupcMimgTLV2+Hrg5AeIo2JpcAEonzf+MAciqjwYC6iIFQ0MM8ulE89gz/ YqPQ== X-Forwarded-Encrypted: i=1; AFNElJ9g7A2+VjmMZwlyhOSYlGX44wvGjvg2USEcsb9zXDK1/7r9BM0PhBAIWj/Wn75TPUKnYbOHpSvIuE1fTA==@lists.linux.dev X-Gm-Message-State: AOJu0YwlDgJpq/YxkunIiRrY56zm59GyH3IzB0XI8dpl7KGUchIuqf3C PpvslV7xp1vmIB2NOzRkMo75+gid1wYs57SmyM9TyLh1fp3WJuVZYC8j X-Gm-Gg: AfdE7ckqVZrxtxnDHxJvBMediBTXA2gNIdo3iNLFPobhTjAh2z1BO64OtTPMweXIyjL C/12pJ//dENRhGTqwKkrMt7bfmhRcUwmgovDNUb10B2APhw45XT0qArKYWUtAFOVAWzV4rhnUq7 cvMqq3BzX20/n1pVpBTwWIesXZOjAWfEkok5ccRweFgKUKsozJ/C/0/DjSQGU8ydit383MbrjQ3 W9pomMcetUrYO3RqipHHWqGrVQz4n8M/kgOUPKKeBQTIw96SBbBqiqtEOZ9eVmqJJH7U2GP/liL jPv109DaJAOtd451YKHW+ydCKbEwxHlwMk6g0Spa+maHpwXeybYuAO2y9kTHFTJ8SgqiZa15yWi z2k0bntu8CXHQYc7MKkKxQDX6t/Gwu+heDP2V+/l7mE2nR6Tt7yrhnD1n83sYaS3pBIwpSUbiGB RwsFGLMsM5XMtoxg== X-Received: by 2002:a05:620a:2592:b0:915:efa6:d714 with SMTP id af79cd13be357-92092b3e2efmr316863785a.52.1781844869229; Thu, 18 Jun 2026 21:54:29 -0700 (PDT) Received: from [172.17.0.2] ([138.28.231.64]) by smtp.gmail.com with ESMTPSA id af79cd13be357-920a425448asm134464485a.23.2026.06.18.21.54.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Jun 2026 21:54:28 -0700 (PDT) From: Yuanshen Cao Date: Fri, 19 Jun 2026 04:53:30 +0000 Subject: [PATCH 1/5] dmaengine: sun6i-dma: Refactor to support A733 interrupt and register handling Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20260619-sun60i-a733-dma-v1-1-da4b649fc72a@gmail.com> References: <20260619-sun60i-a733-dma-v1-0-da4b649fc72a@gmail.com> In-Reply-To: <20260619-sun60i-a733-dma-v1-0-da4b649fc72a@gmail.com> To: Vinod Koul , Frank Li , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Maxime Ripard Cc: dmaengine@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Yuanshen Cao X-Mailer: b4 0.15.2 X-Rspamd-Server: rspamd-worker-8404 X-Spamd-Result: default: False [-1.16 / 15.00]; BAYES_HAM(-5.50)[100.00%]; RBL_SENDERSCORE(2.00)[172.232.135.74:from]; SUSPICIOUS_RECIPS(1.50)[]; DMARC_POLICY_SOFTFAIL(1.00)[gmail.com : SPF not aligned (relaxed), No valid DKIM,none]; MAILLIST(-0.15)[generic]; BAD_REP_POLICIES(0.10)[]; MIME_GOOD(-0.10)[text/plain]; HAS_LIST_UNSUB(-0.01)[]; TAGGED_RCPT(0.00)[dt]; PRECEDENCE_BULK(0.00)[]; RCPT_COUNT_TWELVE(0.00)[15]; FUZZY_BLOCKED(0.00)[rspamd.com]; FORGED_SENDER_MAILLIST(0.00)[]; DBL_BLOCKED_OPENRESOLVER(0.00)[sto.lore.kernel.org:rdns,sto.lore.kernel.org:helo]; FREEMAIL_CC(0.00)[vger.kernel.org,lists.infradead.org,lists.linux.dev,gmail.com]; TO_DN_SOME(0.00)[]; R_SPF_ALLOW(0.00)[+ip4:172.232.135.74]; ARC_ALLOW(0.00)[subspace.kernel.org:s=arc-20240116:i=1]; FREEMAIL_FROM(0.00)[gmail.com]; MIME_TRACE(0.00)[0:+]; RCVD_TLS_LAST(0.00)[]; FORGED_RECIPIENTS_MAILLIST(0.00)[]; FREEMAIL_TO(0.00)[kernel.org,gmail.com,sholland.org]; FROM_HAS_DN(0.00)[]; MID_RHS_MATCH_FROM(0.00)[]; ASN(0.00)[asn:63949, ipnet:172.232.128.0/19, country:SG]; TAGGED_FROM(0.00)[bounces-23871-noreply=patchwork.local]; RCVD_COUNT_FIVE(0.00)[6]; FROM_NEQ_ENVFROM(0.00)[alexcaoys@gmail.com,linux-sunxi@lists.linux.dev]; RCVD_VIA_SMTP_AUTH(0.00)[] X-Rspamd-Queue-Id: C80931C00CA X-MORS-Enabled: yes X-MORS-DOMAIN: patchwork.local X-MORS-HOSTING: hosting172546 X-MORS-USER: hosting172546 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= This patch is the first step in a refactoring effort to support the Allwinner A733 DMA controller. Currently, the `sun6i-dma` driver has several functions related to interrupt handling (reading/writing interrupt enable and status registers) and register dumping that are hardcoded. To support the A733, which has different register layouts and interrupt handling logic, these functions are being moved into the `sun6i_dma_config` structure as function pointers. This allows the driver to use a polymorphic approach where the specific implementation is determined by the hardware configuration assigned during device probing. Changes: - Added function pointers to `struct sun6i_dma_config` for: - `dump_com_regs` - `read_irq_en` - `write_irq_en` - `read_irq_stat` - `write_irq_stat` - Implemented generic `sun6i_read/write_irq_*` functions for existing hardware. - Updated existing `sun6i_dma_config` instances (A31, A23, H3, A64, A100, H6, V3S) to use these new function pointers. Signed-off-by: Yuanshen Cao --- drivers/dma/sun6i-dma.c | 74 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 5 deletions(-) diff --git a/drivers/dma/sun6i-dma.c b/drivers/dma/sun6i-dma.c index a9a254dbf8cb..d92e702320d9 100644 --- a/drivers/dma/sun6i-dma.c +++ b/drivers/dma/sun6i-dma.c @@ -138,6 +138,11 @@ struct sun6i_dma_config { void (*set_burst_length)(u32 *p_cfg, s8 src_burst, s8 dst_burst); void (*set_drq)(u32 *p_cfg, s8 src_drq, s8 dst_drq); void (*set_mode)(u32 *p_cfg, s8 src_mode, s8 dst_mode); + void (*dump_com_regs)(struct sun6i_dma_dev *sdev); + u32 (*read_irq_en)(struct sun6i_dma_dev *sdev, u32 chan_num); + void (*write_irq_en)(struct sun6i_dma_dev *sdev, u32 chan_num, u32 irq_val); + u32 (*read_irq_stat)(struct sun6i_dma_dev *sdev, u32 chan_num); + void (*write_irq_stat)(struct sun6i_dma_dev *sdev, u32 chan_num, u32 status); u32 src_burst_lengths; u32 dst_burst_lengths; u32 src_addr_widths; @@ -347,6 +352,25 @@ static void sun6i_set_mode_h6(u32 *p_cfg, s8 src_mode, s8 dst_mode) DMA_CHAN_CFG_DST_MODE_H6(dst_mode); } +static u32 sun6i_read_irq_en(struct sun6i_dma_dev *sdev, u32 chan_num) +{ + return readl(sdev->base + DMA_IRQ_EN(chan_num)); +} + +static void sun6i_write_irq_en(struct sun6i_dma_dev *sdev, u32 chan_num, u32 irq_val) +{ + writel(irq_val, sdev->base + DMA_IRQ_EN(chan_num)); +} +static u32 sun6i_read_irq_stat(struct sun6i_dma_dev *sdev, u32 chan_num) +{ + return readl(sdev->base + DMA_IRQ_STAT(chan_num)); +} + +static void sun6i_write_irq_stat(struct sun6i_dma_dev *sdev, u32 chan_num, u32 status) +{ + writel(status, sdev->base + DMA_IRQ_STAT(chan_num)); +} + static size_t sun6i_get_chan_size(struct sun6i_pchan *pchan) { struct sun6i_desc *txd = pchan->desc; @@ -460,16 +484,16 @@ static int sun6i_dma_start_desc(struct sun6i_vchan *vchan) vchan->irq_type = vchan->cyclic ? DMA_IRQ_PKG : DMA_IRQ_QUEUE; - irq_val = readl(sdev->base + DMA_IRQ_EN(irq_reg)); + irq_val = sdev->cfg->read_irq_en(sdev, irq_reg); irq_val &= ~((DMA_IRQ_HALF | DMA_IRQ_PKG | DMA_IRQ_QUEUE) << (irq_offset * DMA_IRQ_CHAN_WIDTH)); irq_val |= vchan->irq_type << (irq_offset * DMA_IRQ_CHAN_WIDTH); - writel(irq_val, sdev->base + DMA_IRQ_EN(irq_reg)); + sdev->cfg->write_irq_en(sdev, irq_reg, irq_val); writel(pchan->desc->p_lli, pchan->base + DMA_CHAN_LLI_ADDR); writel(DMA_CHAN_ENABLE_START, pchan->base + DMA_CHAN_ENABLE); - sun6i_dma_dump_com_regs(sdev); + sdev->cfg->dump_com_regs(sdev); sun6i_dma_dump_chan_regs(sdev, pchan); return 0; @@ -549,14 +573,14 @@ static irqreturn_t sun6i_dma_interrupt(int irq, void *dev_id) u32 status; for (i = 0; i < sdev->num_pchans / DMA_IRQ_CHAN_NR; i++) { - status = readl(sdev->base + DMA_IRQ_STAT(i)); + status = sdev->cfg->read_irq_stat(sdev, i); if (!status) continue; dev_dbg(sdev->slave.dev, "DMA irq status %s: 0x%x\n", str_high_low(i), status); - writel(status, sdev->base + DMA_IRQ_STAT(i)); + sdev->cfg->write_irq_stat(sdev, i, status); for (j = 0; (j < DMA_IRQ_CHAN_NR) && status; j++) { pchan = sdev->pchans + j; @@ -1124,6 +1148,11 @@ static struct sun6i_dma_config sun6i_a31_dma_cfg = { .set_burst_length = sun6i_set_burst_length_a31, .set_drq = sun6i_set_drq_a31, .set_mode = sun6i_set_mode_a31, + .dump_com_regs = sun6i_dma_dump_com_regs, + .read_irq_en = sun6i_read_irq_en, + .write_irq_en = sun6i_write_irq_en, + .read_irq_stat = sun6i_read_irq_stat, + .write_irq_stat = sun6i_write_irq_stat, .src_burst_lengths = BIT(1) | BIT(8), .dst_burst_lengths = BIT(1) | BIT(8), .src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | @@ -1147,6 +1176,11 @@ static struct sun6i_dma_config sun8i_a23_dma_cfg = { .set_burst_length = sun6i_set_burst_length_a31, .set_drq = sun6i_set_drq_a31, .set_mode = sun6i_set_mode_a31, + .dump_com_regs = sun6i_dma_dump_com_regs, + .read_irq_en = sun6i_read_irq_en, + .write_irq_en = sun6i_write_irq_en, + .read_irq_stat = sun6i_read_irq_stat, + .write_irq_stat = sun6i_write_irq_stat, .src_burst_lengths = BIT(1) | BIT(8), .dst_burst_lengths = BIT(1) | BIT(8), .src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | @@ -1165,6 +1199,11 @@ static struct sun6i_dma_config sun8i_a83t_dma_cfg = { .set_burst_length = sun6i_set_burst_length_a31, .set_drq = sun6i_set_drq_a31, .set_mode = sun6i_set_mode_a31, + .dump_com_regs = sun6i_dma_dump_com_regs, + .read_irq_en = sun6i_read_irq_en, + .write_irq_en = sun6i_write_irq_en, + .read_irq_stat = sun6i_read_irq_stat, + .write_irq_stat = sun6i_write_irq_stat, .src_burst_lengths = BIT(1) | BIT(8), .dst_burst_lengths = BIT(1) | BIT(8), .src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | @@ -1190,6 +1229,11 @@ static struct sun6i_dma_config sun8i_h3_dma_cfg = { .set_burst_length = sun6i_set_burst_length_h3, .set_drq = sun6i_set_drq_a31, .set_mode = sun6i_set_mode_a31, + .dump_com_regs = sun6i_dma_dump_com_regs, + .read_irq_en = sun6i_read_irq_en, + .write_irq_en = sun6i_write_irq_en, + .read_irq_stat = sun6i_read_irq_stat, + .write_irq_stat = sun6i_write_irq_stat, .src_burst_lengths = BIT(1) | BIT(4) | BIT(8) | BIT(16), .dst_burst_lengths = BIT(1) | BIT(4) | BIT(8) | BIT(16), .src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | @@ -1211,6 +1255,11 @@ static struct sun6i_dma_config sun50i_a64_dma_cfg = { .set_burst_length = sun6i_set_burst_length_h3, .set_drq = sun6i_set_drq_a31, .set_mode = sun6i_set_mode_a31, + .dump_com_regs = sun6i_dma_dump_com_regs, + .read_irq_en = sun6i_read_irq_en, + .write_irq_en = sun6i_write_irq_en, + .read_irq_stat = sun6i_read_irq_stat, + .write_irq_stat = sun6i_write_irq_stat, .src_burst_lengths = BIT(1) | BIT(4) | BIT(8) | BIT(16), .dst_burst_lengths = BIT(1) | BIT(4) | BIT(8) | BIT(16), .src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | @@ -1232,6 +1281,11 @@ static struct sun6i_dma_config sun50i_a100_dma_cfg = { .set_burst_length = sun6i_set_burst_length_h3, .set_drq = sun6i_set_drq_h6, .set_mode = sun6i_set_mode_h6, + .dump_com_regs = sun6i_dma_dump_com_regs, + .read_irq_en = sun6i_read_irq_en, + .write_irq_en = sun6i_write_irq_en, + .read_irq_stat = sun6i_read_irq_stat, + .write_irq_stat = sun6i_write_irq_stat, .src_burst_lengths = BIT(1) | BIT(4) | BIT(8) | BIT(16), .dst_burst_lengths = BIT(1) | BIT(4) | BIT(8) | BIT(16), .src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | @@ -1255,6 +1309,11 @@ static struct sun6i_dma_config sun50i_h6_dma_cfg = { .set_burst_length = sun6i_set_burst_length_h3, .set_drq = sun6i_set_drq_h6, .set_mode = sun6i_set_mode_h6, + .dump_com_regs = sun6i_dma_dump_com_regs, + .read_irq_en = sun6i_read_irq_en, + .write_irq_en = sun6i_write_irq_en, + .read_irq_stat = sun6i_read_irq_stat, + .write_irq_stat = sun6i_write_irq_stat, .src_burst_lengths = BIT(1) | BIT(4) | BIT(8) | BIT(16), .dst_burst_lengths = BIT(1) | BIT(4) | BIT(8) | BIT(16), .src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | @@ -1281,6 +1340,11 @@ static struct sun6i_dma_config sun8i_v3s_dma_cfg = { .set_burst_length = sun6i_set_burst_length_a31, .set_drq = sun6i_set_drq_a31, .set_mode = sun6i_set_mode_a31, + .dump_com_regs = sun6i_dma_dump_com_regs, + .read_irq_en = sun6i_read_irq_en, + .write_irq_en = sun6i_write_irq_en, + .read_irq_stat = sun6i_read_irq_stat, + .write_irq_stat = sun6i_write_irq_stat, .src_burst_lengths = BIT(1) | BIT(8), .dst_burst_lengths = BIT(1) | BIT(8), .src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | From patchwork Fri Jun 19 04:53:31 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yuanshen Cao X-Patchwork-Id: 2448 Return-Path: X-Original-To: noreply@patchwork.local Delivered-To: noreply@patchwork.local Received: from tor.lore.kernel.org (tor.lore.kernel.org [172.105.105.114]) by mxe881.netcup.net (Postfix) with ESMTPS id 04C8D1C00CA for ; Fri, 19 Jun 2026 06:55:10 +0200 (CEST) Authentication-Results: mxe881; dkim=pass header.d=gmail.com; spf=pass (sender IP is 172.105.105.114) smtp.mailfrom=linux-sunxi+bounces-23872-noreply=patchwork.local@lists.linux.dev smtp.helo=tor.lore.kernel.org Received-SPF: pass (mxe881: domain of lists.linux.dev designates 172.105.105.114 as permitted sender) client-ip=172.105.105.114; envelope-from=linux-sunxi+bounces-23872-noreply=patchwork.local@lists.linux.dev; helo=tor.lore.kernel.org; Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by tor.lore.kernel.org (Postfix) with ESMTP id 658D130953F8 for ; Fri, 19 Jun 2026 04:54:38 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A63F233689D; Fri, 19 Jun 2026 04:54:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="EcyMIiM1" X-Original-To: linux-sunxi@lists.linux.dev Received: from mail-qk1-f176.google.com (mail-qk1-f176.google.com [209.85.222.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 13D9D3346A0 for ; Fri, 19 Jun 2026 04:54:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781844873; cv=none; b=UIvJtVDwehHcSbxC7uxnPiiTg40Csj4EUj7J9rlAXo7/y9D31HZ/l/bkL7xwhCh8UsUHBTDxqbiwTBw478OBPhDC3r5Ta6pe6DPkXHBl4tmtibkrSVPaKEitlK8XKrkKGPLHwfh7EsB8EED72+39j905dbDqHPD6kmpLjkQxoFk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781844873; c=relaxed/simple; bh=dgeGyS+sC8NkGMnX16tGpIauM/4socL5tcePF9QgX6U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SVqOps3OK95bqhJqxSIdqm8JX8pUYh9WY1KpvplYXdIGRUtjoxqR/6vBGAJVkKCSvrOyKvIEE48lHYhjTR/4Mpxggn6ji+9egwHl2CIbOrhNMcKo9dDrvjuD/MONjptEqi2pkvPQSIXtt/aNf6fbRRXv8qd3Fu4Pi7bO2bUf+D4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=EcyMIiM1; arc=none smtp.client-ip=209.85.222.176 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 Received: by mail-qk1-f176.google.com with SMTP id af79cd13be357-9158643e538so156246885a.1 for ; Thu, 18 Jun 2026 21:54:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781844871; x=1782449671; darn=lists.linux.dev; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Nu3ld+/x/4fnowny6tKRb6y8649sFddF48H2SIfvkLE=; b=EcyMIiM1lr365KnSvCGECX7FBYLV/MhJ4ct6zxJi4fqxAEjrRu7GZeALTQ7utM8BFq vboJK0O3OkQHvn5Vyr/D34XHLeOcvqTTK5shyU3sGOG/x5qCRqiGmHfpoVwn/S3HZAQ1 vCLhd/WOTNU3A9NrZXIvc3N29N6oiJOvc+UMehopNGanrZct6zfYyqBAtRm7/AFJUK5Q AKJ0pwRKR/wb7dtKP6Y5+yDn2YH2PAiijcyA13HXTYKsp31h3O2xZpGOapjjSiL9nrgC jsNOQUUHfpCKNMGq2rAd0Yfa98HxfNvs1mqXhzma2nabr7WE0v5/p4ATwlOncVmaZFmc e61Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781844871; x=1782449671; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Nu3ld+/x/4fnowny6tKRb6y8649sFddF48H2SIfvkLE=; b=MlHJoW4mBeEQk4OcYCr/Kp8v7tQgF/Bd7BF5QecrYHuHTWFAXFy7TZpdwnhDiID4GN Bmbzj8Qye7FjpmwS9TDAt93qVaJ72VjAPgCGk6CCufuKsd4KVD+plmHhu6J/HY0f33Em wVrPs9qkO3prlsChMOuu8v52lycxZMksUtSe6hSJkoJn1eNmsxxsNB9xbqmT3gOIMktT hLJSQbfANdOgozVVzjkLuilz+s/bi20+yPlha2+1D8nP9ec8cSzK37lIzlr+u/251hnR m8jkky2lr32QBy17e2Hln8qRZ1fP0rhJ/CqGJxbDtYxmNyDITzu1m39TFvRYHC3IgU3b Xv2A== X-Forwarded-Encrypted: i=1; AFNElJ8UlqsIWfP0IMOdPALiI0ZhWudPtKktlpRI85TqOQU+aNxQHktWogaa7ksbF2zmE+rQ5G+m9KxPiNj/8A==@lists.linux.dev X-Gm-Message-State: AOJu0YyCb5Mpn7cgyVwLqcpC69ryQ2vw3VbWm8zxo7eZ2FiVeJu5VXXB 640rQMtQgpXjjHQMjhPmIkiP/QqgIgn9uvl/5FJlXpVBrCaTlekbDcXT X-Gm-Gg: AfdE7ckrPCpne9kOh8EgwMMIqJZjqD5dMSIgHMe202kCHRHZb+a8wJWA5G1HqeOdvKq 87YdY2CUNf2NjK4w9zjRuNG5i3Kq82Hin3ry/iQdovE8mzGeEJjVmxyJ+fXGYLEvwC1NNASXM31 c3iVNGC0CFjyXl7/QdPfuvoGZ8dwQngPk9BTi6o3cVUSwJq2apJc2sd6HQNuco4GvHL2nFiFWP5 VqjbRUW4/XlgvR878U0i/xc5af329naNLjt9vwGEc8RJ4RU1Z5PHFA3MrMxftcxdHn2qhNgzmVu zoEwXTPZXjI8yiuI4oFMPIBqN/EKxtUwUAjv0O0Z6j+eNg26BGSC/UZ35dm1kZtbn1DnQ/Bhinb /FwktG+8hYMxQNS9n16CGIg2CxOEw8yFqJZcS0ArQLD1oTMTxCXxNVGx2KuNm3r8nMsbtm8vRiJ qNTNgMPWPERybSqw== X-Received: by 2002:a05:620a:4590:b0:915:a6ca:f12a with SMTP id af79cd13be357-920d480da3bmr150184285a.54.1781844870874; Thu, 18 Jun 2026 21:54:30 -0700 (PDT) Received: from [172.17.0.2] ([138.28.231.64]) by smtp.gmail.com with ESMTPSA id af79cd13be357-920a425448asm134464485a.23.2026.06.18.21.54.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Jun 2026 21:54:30 -0700 (PDT) From: Yuanshen Cao Date: Fri, 19 Jun 2026 04:53:31 +0000 Subject: [PATCH 2/5] dmaengine: sun6i-dma: Add set_addr function pointer for variable address widths Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20260619-sun60i-a733-dma-v1-2-da4b649fc72a@gmail.com> References: <20260619-sun60i-a733-dma-v1-0-da4b649fc72a@gmail.com> In-Reply-To: <20260619-sun60i-a733-dma-v1-0-da4b649fc72a@gmail.com> To: Vinod Koul , Frank Li , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Maxime Ripard Cc: dmaengine@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Yuanshen Cao X-Mailer: b4 0.15.2 X-MORS-Enabled: yes X-MORS-DOMAIN: patchwork.local X-MORS-HOSTING: hosting172546 X-MORS-USER: hosting172546 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= The A733 DMA controller supports higher address (up to 32G) compared to previous generations. The existing `sun6i_dma_set_addr` function uses a hardcoded logic for setting the high-address bits in the LLI parameters. By moving `set_addr` into the `sun6i_dma_config` structure, we can provide specialized implementations for different hardware. This allows the A733 to use a version of `set_addr` that correctly handles its specific `SRC_HIGH_ADDR_32G` and `DST_HIGH_ADDR_32G` in the `set_addr` register later in the series. Changes: - Added `set_addr` function pointer to `struct sun6i_dma_config`. - Refactored `sun6i_dma_set_addr` and introduced `sun6i_dma_set_addr_a100` (keeping the logic for high address support). - Updated all existing configuration structs to include the new `set_addr` pointer. - Removed `has_high_addr` since the logic is replaced by `sun6i_dma_set_addr_a100`. Signed-off-by: Yuanshen Cao --- drivers/dma/sun6i-dma.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/drivers/dma/sun6i-dma.c b/drivers/dma/sun6i-dma.c index d92e702320d9..059455425e19 100644 --- a/drivers/dma/sun6i-dma.c +++ b/drivers/dma/sun6i-dma.c @@ -112,6 +112,7 @@ /* forward declaration */ struct sun6i_dma_dev; +struct sun6i_dma_lli; /* * Hardware channels / ports representation @@ -138,6 +139,8 @@ struct sun6i_dma_config { void (*set_burst_length)(u32 *p_cfg, s8 src_burst, s8 dst_burst); void (*set_drq)(u32 *p_cfg, s8 src_drq, s8 dst_drq); void (*set_mode)(u32 *p_cfg, s8 src_mode, s8 dst_mode); + void (*set_addr)(struct sun6i_dma_dev *sdev, struct sun6i_dma_lli *v_lli, + dma_addr_t src, dma_addr_t dst); void (*dump_com_regs)(struct sun6i_dma_dev *sdev); u32 (*read_irq_en)(struct sun6i_dma_dev *sdev, u32 chan_num); void (*write_irq_en)(struct sun6i_dma_dev *sdev, u32 chan_num, u32 irq_val); @@ -147,7 +150,6 @@ struct sun6i_dma_config { u32 dst_burst_lengths; u32 src_addr_widths; u32 dst_addr_widths; - bool has_high_addr; bool has_mbus_clk; }; @@ -675,13 +677,20 @@ static int set_config(struct sun6i_dma_dev *sdev, static inline void sun6i_dma_set_addr(struct sun6i_dma_dev *sdev, struct sun6i_dma_lli *v_lli, dma_addr_t src, dma_addr_t dst) +{ + v_lli->src = lower_32_bits(src); + v_lli->dst = lower_32_bits(dst); +} + +static inline void sun6i_dma_set_addr_a100(struct sun6i_dma_dev *sdev, + struct sun6i_dma_lli *v_lli, + dma_addr_t src, dma_addr_t dst) { v_lli->src = lower_32_bits(src); v_lli->dst = lower_32_bits(dst); - if (sdev->cfg->has_high_addr) - v_lli->para |= SRC_HIGH_ADDR(upper_32_bits(src)) | - DST_HIGH_ADDR(upper_32_bits(dst)); + v_lli->para |= SRC_HIGH_ADDR(upper_32_bits(src)) | + DST_HIGH_ADDR(upper_32_bits(dst)); } static struct dma_async_tx_descriptor *sun6i_dma_prep_dma_memcpy( @@ -714,7 +723,7 @@ static struct dma_async_tx_descriptor *sun6i_dma_prep_dma_memcpy( v_lli->len = len; v_lli->para = NORMAL_WAIT; - sun6i_dma_set_addr(sdev, v_lli, src, dest); + sdev->cfg->set_addr(sdev, v_lli, src, dest); burst = convert_burst(8); width = convert_buswidth(DMA_SLAVE_BUSWIDTH_4_BYTES); @@ -773,7 +782,7 @@ static struct dma_async_tx_descriptor *sun6i_dma_prep_slave_sg( v_lli->para = NORMAL_WAIT; if (dir == DMA_MEM_TO_DEV) { - sun6i_dma_set_addr(sdev, v_lli, + sdev->cfg->set_addr(sdev, v_lli, sg_dma_address(sg), sconfig->dst_addr); v_lli->cfg = lli_cfg; @@ -787,7 +796,7 @@ static struct dma_async_tx_descriptor *sun6i_dma_prep_slave_sg( sg_dma_len(sg), flags); } else { - sun6i_dma_set_addr(sdev, v_lli, + sdev->cfg->set_addr(sdev, v_lli, sconfig->src_addr, sg_dma_address(sg)); v_lli->cfg = lli_cfg; @@ -858,7 +867,7 @@ static struct dma_async_tx_descriptor *sun6i_dma_prep_dma_cyclic( v_lli->para = NORMAL_WAIT; if (dir == DMA_MEM_TO_DEV) { - sun6i_dma_set_addr(sdev, v_lli, + sdev->cfg->set_addr(sdev, v_lli, buf_addr + period_len * i, sconfig->dst_addr); v_lli->cfg = lli_cfg; @@ -870,7 +879,7 @@ static struct dma_async_tx_descriptor *sun6i_dma_prep_dma_cyclic( &sconfig->dst_addr, &buf_addr, buf_len, flags); } else { - sun6i_dma_set_addr(sdev, v_lli, + sdev->cfg->set_addr(sdev, v_lli, sconfig->src_addr, buf_addr + period_len * i); v_lli->cfg = lli_cfg; @@ -1148,6 +1157,7 @@ static struct sun6i_dma_config sun6i_a31_dma_cfg = { .set_burst_length = sun6i_set_burst_length_a31, .set_drq = sun6i_set_drq_a31, .set_mode = sun6i_set_mode_a31, + .set_addr = sun6i_dma_set_addr, .dump_com_regs = sun6i_dma_dump_com_regs, .read_irq_en = sun6i_read_irq_en, .write_irq_en = sun6i_write_irq_en, @@ -1176,6 +1186,7 @@ static struct sun6i_dma_config sun8i_a23_dma_cfg = { .set_burst_length = sun6i_set_burst_length_a31, .set_drq = sun6i_set_drq_a31, .set_mode = sun6i_set_mode_a31, + .set_addr = sun6i_dma_set_addr, .dump_com_regs = sun6i_dma_dump_com_regs, .read_irq_en = sun6i_read_irq_en, .write_irq_en = sun6i_write_irq_en, @@ -1199,6 +1210,7 @@ static struct sun6i_dma_config sun8i_a83t_dma_cfg = { .set_burst_length = sun6i_set_burst_length_a31, .set_drq = sun6i_set_drq_a31, .set_mode = sun6i_set_mode_a31, + .set_addr = sun6i_dma_set_addr, .dump_com_regs = sun6i_dma_dump_com_regs, .read_irq_en = sun6i_read_irq_en, .write_irq_en = sun6i_write_irq_en, @@ -1229,6 +1241,7 @@ static struct sun6i_dma_config sun8i_h3_dma_cfg = { .set_burst_length = sun6i_set_burst_length_h3, .set_drq = sun6i_set_drq_a31, .set_mode = sun6i_set_mode_a31, + .set_addr = sun6i_dma_set_addr, .dump_com_regs = sun6i_dma_dump_com_regs, .read_irq_en = sun6i_read_irq_en, .write_irq_en = sun6i_write_irq_en, @@ -1255,6 +1268,7 @@ static struct sun6i_dma_config sun50i_a64_dma_cfg = { .set_burst_length = sun6i_set_burst_length_h3, .set_drq = sun6i_set_drq_a31, .set_mode = sun6i_set_mode_a31, + .set_addr = sun6i_dma_set_addr, .dump_com_regs = sun6i_dma_dump_com_regs, .read_irq_en = sun6i_read_irq_en, .write_irq_en = sun6i_write_irq_en, @@ -1281,6 +1295,7 @@ static struct sun6i_dma_config sun50i_a100_dma_cfg = { .set_burst_length = sun6i_set_burst_length_h3, .set_drq = sun6i_set_drq_h6, .set_mode = sun6i_set_mode_h6, + .set_addr = sun6i_dma_set_addr_a100, .dump_com_regs = sun6i_dma_dump_com_regs, .read_irq_en = sun6i_read_irq_en, .write_irq_en = sun6i_write_irq_en, @@ -1296,7 +1311,6 @@ static struct sun6i_dma_config sun50i_a100_dma_cfg = { BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_4_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_8_BYTES), - .has_high_addr = true, .has_mbus_clk = true, }; @@ -1309,6 +1323,7 @@ static struct sun6i_dma_config sun50i_h6_dma_cfg = { .set_burst_length = sun6i_set_burst_length_h3, .set_drq = sun6i_set_drq_h6, .set_mode = sun6i_set_mode_h6, + .set_addr = sun6i_dma_set_addr, .dump_com_regs = sun6i_dma_dump_com_regs, .read_irq_en = sun6i_read_irq_en, .write_irq_en = sun6i_write_irq_en, @@ -1340,6 +1355,7 @@ static struct sun6i_dma_config sun8i_v3s_dma_cfg = { .set_burst_length = sun6i_set_burst_length_a31, .set_drq = sun6i_set_drq_a31, .set_mode = sun6i_set_mode_a31, + .set_addr = sun6i_dma_set_addr, .dump_com_regs = sun6i_dma_dump_com_regs, .read_irq_en = sun6i_read_irq_en, .write_irq_en = sun6i_write_irq_en, From patchwork Fri Jun 19 04:53:32 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yuanshen Cao X-Patchwork-Id: 2447 Return-Path: X-Original-To: noreply@patchwork.local Delivered-To: noreply@patchwork.local Received: from sto.lore.kernel.org (sto.lore.kernel.org [172.232.135.74]) by mxe881.netcup.net (Postfix) with ESMTPS id C222F1C00CA for ; Fri, 19 Jun 2026 06:54:51 +0200 (CEST) Authentication-Results: mxe881; dkim=pass header.d=gmail.com; spf=pass (sender IP is 172.232.135.74) smtp.mailfrom=linux-sunxi+bounces-23873-noreply=patchwork.local@lists.linux.dev smtp.helo=sto.lore.kernel.org Received-SPF: pass (mxe881: domain of lists.linux.dev designates 172.232.135.74 as permitted sender) client-ip=172.232.135.74; envelope-from=linux-sunxi+bounces-23873-noreply=patchwork.local@lists.linux.dev; helo=sto.lore.kernel.org; Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sto.lore.kernel.org (Postfix) with ESMTP id F1EFE302D91A for ; Fri, 19 Jun 2026 04:54:42 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 187F233AD9D; Fri, 19 Jun 2026 04:54:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Kg4MUS/k" X-Original-To: linux-sunxi@lists.linux.dev Received: from mail-qv1-f52.google.com (mail-qv1-f52.google.com [209.85.219.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 632B032B9A8 for ; Fri, 19 Jun 2026 04:54:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781844875; cv=none; b=SOVBbO/VFETkK3NWQg5IUsdHf/Fm/MZLY6OJMywwZWgVZQZQ+erGS+kkhiy24ueX3l85prfGZ86DCgfqXEIojmSWMdL8Vv4uNMOuPHzf9dsJEvJcEQLbn/xecgrsI+DXFXJnQGGqjmQxf5Nyzy6K386TlU416Y0/pl+YWGoFe2w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781844875; c=relaxed/simple; bh=aSajCbsbFZZ1xQwTPnErZJbWQK1/5h9xY/tXmk98wvc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gSgQTOwGcUnmUbwjgwUvQdyzDKGwklJIrgsO9dycCR7soT9paukZ1KCcW0jjhfJGLOEq4HqyTWt1xKyQnCEwDBJUJWpZJhEi6UIXWLDvEVUhJOLc0yU41CDczd+2A55mhIuxUACzCVi5fzj2Q+Ud/tpUx8nGzEBqT8wBb9BfVzc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Kg4MUS/k; arc=none smtp.client-ip=209.85.219.52 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 Received: by mail-qv1-f52.google.com with SMTP id 6a1803df08f44-8cce87d7995so15736236d6.0 for ; Thu, 18 Jun 2026 21:54:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781844872; x=1782449672; darn=lists.linux.dev; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Q55XUG3Ko0ecxcUOCYiIDN/X4N3ed40r7B6RThXSSPU=; b=Kg4MUS/kjfeR/rYpLD2v+mua8t/z9an0AwSHWUN2dmcZQL3UzdP65UNmDG9QHXFS+P nxl56WNB/uKC+JRFMSbw+vxWzqrp8Pu6dbKyIlHVkkEjKLVwMhVk7guSpG+YvAmWqdUT GZGHzJ2nNqNpabrC5ZZIH75eUe8MgH9kR45ZzVNLJXzR3Bg74H2y5B4G1QirZiDaAui6 V0oC4EX/5HgmjEt9zznK7JLg0GM33wCAXA8a5CV3uuB90BmUfp40pi3ZKl7mDEb64s8B eW5WKKafbt5kVEFxfpCuUMbXuxmJQ+g4cWH80V9/8hGZ8ym4fJ0LyZCKDvMWHrwfvkxW +RHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781844872; x=1782449672; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Q55XUG3Ko0ecxcUOCYiIDN/X4N3ed40r7B6RThXSSPU=; b=Nj5M4X2dZ2uLXFyViQ4VeuU1VR7A3YYtt9luVzOVc5RvyLTKw/jPW/A6ZUNY/3p1sB 9xjDC9geNFmR4K9ohJiJs7qCRFHdpBJZX2BzqSNb/lN5vIqKlCA7BRzGVonz9CMP+5J8 XTI7ge1pi/K1CGsi98k/+QL+uC2M0Egpm7imZReIwAbW4bwBEc+hvRtOh93COcVna2KQ vZW0u25++AFctrf7KW4oX8Cl6J+QUyGsbDZCvysurubTULSJHbIKAZNocns0zclUGmjo pAJdLpPZdPa41v3/kiMOZhOnMrhbi2rENIaWyERPGk5j2uHZkPIAJp3Jsg00AW5IlN4V EtaQ== X-Forwarded-Encrypted: i=1; AFNElJ+jdbBP/BEIVm/OGAu5+jSkHa3dQ+esLXAtRnRMYy8or+dm2GJU1BO/l6nOnt5KDo3Prps5rNe3GMZ9vg==@lists.linux.dev X-Gm-Message-State: AOJu0YweMmmvPC/Q7px96DhjcNO9Xsf2Q8WHq9lPIRt0d7KhpkwyNrcS UOQl1GiDKJvLSJz7njI2KxSjm+Sc+jHH30UFo51c8cNnh1/DpV4tGRCP X-Gm-Gg: AfdE7cl+/dbLwugJdEfq9ZDDgPBcKBKPwKqidJvtCd7LIH2p160Uz2WQmsSQDy+4VyQ ovTuykb6sl6CKRbcQZVezyF3fZWXrOU8ExmB6oRt3l0M36Dq2JX3FQ45oca4swZxdOiJjqh+tdw 2sOR/NPmvkE6R1v4MzfLc/B6HIRgrBmvso61AxwwjPgZUCIDEHiPI+DySbWFKfGskS4IsyO4JYS W+RNYbxYbR3CyBQDGCcyL4qS08csVSqhPN9dnv12Lb0Fg1dge6cONkXLffFtLjimNtZWSFhVP/h sU3h9ZukyVqKeUknEUVouLMwEkWCuvPxzCk8V+xZukScWfxpPkI+2qx7G9+pxx3QZbQmL1wjEzy Jn35c0rV8eUFUmqilGooZdigiKdKzCUk8dDSLkoMvMGlQn338vh12EuepH30KGRGL1A4OShGrIu 4ditMTPaPvASjjKw== X-Received: by 2002:a05:620a:298c:b0:915:afa5:754 with SMTP id af79cd13be357-9208e982356mr322872985a.2.1781844872251; Thu, 18 Jun 2026 21:54:32 -0700 (PDT) Received: from [172.17.0.2] ([138.28.231.64]) by smtp.gmail.com with ESMTPSA id af79cd13be357-920a425448asm134464485a.23.2026.06.18.21.54.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Jun 2026 21:54:31 -0700 (PDT) From: Yuanshen Cao Date: Fri, 19 Jun 2026 04:53:32 +0000 Subject: [PATCH 3/5] dmaengine: sun6i-dma: Add num_channels_per_reg for flexible interrupt mapping Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20260619-sun60i-a733-dma-v1-3-da4b649fc72a@gmail.com> References: <20260619-sun60i-a733-dma-v1-0-da4b649fc72a@gmail.com> In-Reply-To: <20260619-sun60i-a733-dma-v1-0-da4b649fc72a@gmail.com> To: Vinod Koul , Frank Li , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Maxime Ripard Cc: dmaengine@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Yuanshen Cao X-Mailer: b4 0.15.2 X-Rspamd-Server: rspamd-worker-8404 X-Spamd-Result: default: False [-1.16 / 15.00]; BAYES_HAM(-5.50)[100.00%]; RBL_SENDERSCORE(2.00)[172.232.135.74:from]; SUSPICIOUS_RECIPS(1.50)[]; DMARC_POLICY_SOFTFAIL(1.00)[gmail.com : SPF not aligned (relaxed), No valid DKIM,none]; MAILLIST(-0.15)[generic]; BAD_REP_POLICIES(0.10)[]; MIME_GOOD(-0.10)[text/plain]; HAS_LIST_UNSUB(-0.01)[]; TAGGED_RCPT(0.00)[dt]; PRECEDENCE_BULK(0.00)[]; RCPT_COUNT_TWELVE(0.00)[15]; FUZZY_BLOCKED(0.00)[rspamd.com]; FORGED_SENDER_MAILLIST(0.00)[]; DBL_BLOCKED_OPENRESOLVER(0.00)[sto.lore.kernel.org:rdns,sto.lore.kernel.org:helo]; FREEMAIL_CC(0.00)[vger.kernel.org,lists.infradead.org,lists.linux.dev,gmail.com]; TO_DN_SOME(0.00)[]; FREEMAIL_FROM(0.00)[gmail.com]; ARC_ALLOW(0.00)[subspace.kernel.org:s=arc-20240116:i=1]; R_SPF_ALLOW(0.00)[+ip4:172.232.135.74:c]; MIME_TRACE(0.00)[0:+]; RCVD_TLS_LAST(0.00)[]; FORGED_RECIPIENTS_MAILLIST(0.00)[]; FREEMAIL_TO(0.00)[kernel.org,gmail.com,sholland.org]; FROM_HAS_DN(0.00)[]; MID_RHS_MATCH_FROM(0.00)[]; ASN(0.00)[asn:63949, ipnet:172.232.128.0/19, country:SG]; TAGGED_FROM(0.00)[bounces-23873-noreply=patchwork.local]; RCVD_COUNT_FIVE(0.00)[6]; FROM_NEQ_ENVFROM(0.00)[alexcaoys@gmail.com,linux-sunxi@lists.linux.dev]; RCVD_VIA_SMTP_AUTH(0.00)[] X-Rspamd-Queue-Id: C222F1C00CA X-MORS-Enabled: yes X-MORS-DOMAIN: patchwork.local X-MORS-HOSTING: hosting172546 X-MORS-USER: hosting172546 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= The previous implementation of `sun6i-dma` had some implicit assumptions about the number of channels per interrupt register. Specifically, functions like `sun6i_kill_tasklet` were hardcoded to only disable interrupts for IRQ 0 and 1. `DMA_MAX_CHANNELS` is also not in used in the past, and the old SoCs never has more than 16 channels. The A733 has a different interrupt structure where the number of channels per register may differ. This patch introduces `num_channels_per_reg` to the `sun6i_dma_config`, similar to BSP, to make the interrupt handling logic hardware-agnostic. It also sets `DMA_MAX_CHANNELS` to 16 to align with the new BSP code and ensure loops over interrupts are correctly bounded. Changes: - Change `DMA_MAX_CHANNELS` definition to 16. - Added `num_channels_per_reg` to `struct sun6i_dma_config`. - Replaced hardcoded IRQ register calculations with values from `sdev->cfg->num_channels_per_reg`. - Updated `sun6i_kill_tasklet` to loop through all possible interrupt registers based on `DMA_MAX_CHANNELS` and the configuration. Signed-off-by: Yuanshen Cao --- drivers/dma/sun6i-dma.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/drivers/dma/sun6i-dma.c b/drivers/dma/sun6i-dma.c index 059455425e19..fb1c1a28744b 100644 --- a/drivers/dma/sun6i-dma.c +++ b/drivers/dma/sun6i-dma.c @@ -41,7 +41,7 @@ #define DMA_STAT 0x30 /* Offset between DMA_IRQ_EN and DMA_IRQ_STAT limits number of channels */ -#define DMA_MAX_CHANNELS (DMA_IRQ_CHAN_NR * 0x10 / 4) +#define DMA_MAX_CHANNELS 16 /* * sun8i specific registers @@ -151,6 +151,7 @@ struct sun6i_dma_config { u32 src_addr_widths; u32 dst_addr_widths; bool has_mbus_clk; + u32 num_channels_per_reg; }; /* @@ -481,8 +482,8 @@ static int sun6i_dma_start_desc(struct sun6i_vchan *vchan) sun6i_dma_dump_lli(vchan, pchan->desc->v_lli, pchan->desc->p_lli); - irq_reg = pchan->idx / DMA_IRQ_CHAN_NR; - irq_offset = pchan->idx % DMA_IRQ_CHAN_NR; + irq_reg = pchan->idx / sdev->cfg->num_channels_per_reg; + irq_offset = pchan->idx % sdev->cfg->num_channels_per_reg; vchan->irq_type = vchan->cyclic ? DMA_IRQ_PKG : DMA_IRQ_QUEUE; @@ -574,7 +575,7 @@ static irqreturn_t sun6i_dma_interrupt(int irq, void *dev_id) int i, j, ret = IRQ_NONE; u32 status; - for (i = 0; i < sdev->num_pchans / DMA_IRQ_CHAN_NR; i++) { + for (i = 0; i < sdev->num_pchans / sdev->cfg->num_channels_per_reg; i++) { status = sdev->cfg->read_irq_stat(sdev, i); if (!status) continue; @@ -584,7 +585,7 @@ static irqreturn_t sun6i_dma_interrupt(int irq, void *dev_id) sdev->cfg->write_irq_stat(sdev, i, status); - for (j = 0; (j < DMA_IRQ_CHAN_NR) && status; j++) { + for (j = 0; (j < sdev->cfg->num_channels_per_reg) && status; j++) { pchan = sdev->pchans + j; vchan = pchan->vchan; if (vchan && (status & vchan->irq_type)) { @@ -1108,9 +1109,11 @@ static struct dma_chan *sun6i_dma_of_xlate(struct of_phandle_args *dma_spec, static inline void sun6i_kill_tasklet(struct sun6i_dma_dev *sdev) { + int i; + /* Disable all interrupts from DMA */ - writel(0, sdev->base + DMA_IRQ_EN(0)); - writel(0, sdev->base + DMA_IRQ_EN(1)); + for (i = 0; i < DMA_MAX_CHANNELS / sdev->cfg->num_channels_per_reg; i++) + sdev->cfg->write_irq_en(sdev, i, 0); /* Prevent spurious interrupts from scheduling the tasklet */ atomic_inc(&sdev->tasklet_shutdown); @@ -1171,6 +1174,7 @@ static struct sun6i_dma_config sun6i_a31_dma_cfg = { .dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_4_BYTES), + .num_channels_per_reg = DMA_IRQ_CHAN_NR, }; /* @@ -1200,6 +1204,7 @@ static struct sun6i_dma_config sun8i_a23_dma_cfg = { .dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_4_BYTES), + .num_channels_per_reg = DMA_IRQ_CHAN_NR, }; static struct sun6i_dma_config sun8i_a83t_dma_cfg = { @@ -1224,6 +1229,7 @@ static struct sun6i_dma_config sun8i_a83t_dma_cfg = { .dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_4_BYTES), + .num_channels_per_reg = DMA_IRQ_CHAN_NR, }; /* @@ -1257,6 +1263,7 @@ static struct sun6i_dma_config sun8i_h3_dma_cfg = { BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_4_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_8_BYTES), + .num_channels_per_reg = DMA_IRQ_CHAN_NR, }; /* @@ -1284,6 +1291,7 @@ static struct sun6i_dma_config sun50i_a64_dma_cfg = { BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_4_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_8_BYTES), + .num_channels_per_reg = DMA_IRQ_CHAN_NR, }; /* @@ -1311,6 +1319,7 @@ static struct sun6i_dma_config sun50i_a100_dma_cfg = { BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_4_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_8_BYTES), + .num_channels_per_reg = DMA_IRQ_CHAN_NR, .has_mbus_clk = true, }; @@ -1339,6 +1348,7 @@ static struct sun6i_dma_config sun50i_h6_dma_cfg = { BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_4_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_8_BYTES), + .num_channels_per_reg = DMA_IRQ_CHAN_NR, .has_mbus_clk = true, }; @@ -1369,6 +1379,7 @@ static struct sun6i_dma_config sun8i_v3s_dma_cfg = { .dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_4_BYTES), + .num_channels_per_reg = DMA_IRQ_CHAN_NR, }; static const struct of_device_id sun6i_dma_match[] = { From patchwork Fri Jun 19 04:53:33 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yuanshen Cao X-Patchwork-Id: 2449 Return-Path: X-Original-To: noreply@patchwork.local Delivered-To: noreply@patchwork.local Received: from sto.lore.kernel.org (sto.lore.kernel.org [172.232.135.74]) by mxe881.netcup.net (Postfix) with ESMTPS id 6411F1C079E for ; Fri, 19 Jun 2026 06:55:10 +0200 (CEST) Authentication-Results: mxe881; dkim=pass header.d=gmail.com; spf=pass (sender IP is 172.232.135.74) smtp.mailfrom=linux-sunxi+bounces-23874-noreply=patchwork.local@lists.linux.dev smtp.helo=sto.lore.kernel.org Received-SPF: pass (mxe881: domain of lists.linux.dev designates 172.232.135.74 as permitted sender) client-ip=172.232.135.74; envelope-from=linux-sunxi+bounces-23874-noreply=patchwork.local@lists.linux.dev; helo=sto.lore.kernel.org; Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sto.lore.kernel.org (Postfix) with ESMTP id 9F8EC303F3CC for ; Fri, 19 Jun 2026 04:54:53 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id CCA6F33F5A5; Fri, 19 Jun 2026 04:54:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XP5SEs3T" X-Original-To: linux-sunxi@lists.linux.dev Received: from mail-qv1-f50.google.com (mail-qv1-f50.google.com [209.85.219.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DED7A33A9E1 for ; Fri, 19 Jun 2026 04:54:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781844877; cv=none; b=jYBD1jHWHM5GxIIlnsp6wsCCavqpD1Xjz9jJLLo+jXxvtTJrkptmrEJcA1YOoIRTF0n2IVy8QUi9dL0mXn2todSoKRA1GjG6eYKZSnTcEk/EwnV7I6yxedvd8zHABbRaqoyXcjgven7R+fgf92l+jOWvVEjQUUw3n9ufNb7nOGA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781844877; c=relaxed/simple; bh=VOexrRFGp20ecE+6PIt5Ha4e+SrvSRe6cb3CbcfWHzQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VtXhnDSPJ7UgjWdLNH6eF9CNpE+l0SwQkWifHdBelX4XAnpOz+iuN07sAbcfW4SNonXlOQvPdZ7yefR4Ov2LXKLmzVzXLXXGPzg56cprUrwq9Ns8XkmdUMZ1d71BMhIdFFp4aqmkwFvl04uT69KI1e72N1B3CcaNDZ3L05IPNrs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XP5SEs3T; arc=none smtp.client-ip=209.85.219.50 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 Received: by mail-qv1-f50.google.com with SMTP id 6a1803df08f44-8cc0ef7c306so19106816d6.3 for ; Thu, 18 Jun 2026 21:54:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781844874; x=1782449674; darn=lists.linux.dev; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=EN7WKbhfeumQPMyegObyH/92wLelx5H5tDsCdrLnzyo=; b=XP5SEs3Tk/U9L4hk7SgfbX5ySk6YpwyIjrTq09hSVXtHNYWfCzdeVGUhzXfB2WIW+9 nYFAwluinV0tPdRCMohmKrH2jKzCwEfZdNiTLs7ncwlYDezVCAesiMzudCcQK6sBewNj CTZ4nC9bollU4hoDDELpbD5GfhG0ZOm7rKrM4gOXLoTiTGpG5M23S3QHvpte/gnEzB29 m3cm2aVr46AP7LYVJ9Wn8Ox0WOTOi8gd8va7yWIupnheDOEqQwUvBa29QCVY8PyGVlNI XS86A6V0hkiue4SkAM7FopC4OisO+5Hu04sNZg2l1rbjVm16gCtvizDfflZu4I2Q13Wb zGmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781844874; x=1782449674; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=EN7WKbhfeumQPMyegObyH/92wLelx5H5tDsCdrLnzyo=; b=JOuYt087PlLt1rgHFBYZLF3nYuh3fKwRcyhk9FGa/VOv43g2GbMH2v69H1KV3dW+0E ZWaeFQGHgmpa2+nXVxaVPBzOa6bgkstbU0AuhddmisISSzeFJOic5oEWc/R/ZJ1qtlYj z2aQL+7UCXyO+IhgCf+cnfa8mM/YMvq7iNw/p+BHLJoZZtN75nwffXpBsFOcNZJV/Jdm AuJhmxFmqemCILrlA1PeWeQ1IC37BWpwXbYKbz43W3Z5+9DwSSy5mFbQWVOC5ZHFhc5r ofq1vUV/FVQ5naRAyVr7ytM/Km+JFVa4gIkL+QsVeid8/by3eI3A0HZEc8nYvLFKu98j 6GIA== X-Forwarded-Encrypted: i=1; AFNElJ93uBjBV7OYmdyW/MHLdDpZ4TTaCIqQdgsT27rjQ8GMXjHi2Tlyd+7QS9k5x4PfaUQAdix0lXpsH3vR2g==@lists.linux.dev X-Gm-Message-State: AOJu0Yx34bv+fsF8EW5UkKLSW1u+hULkGOMSj8FotYXjVPNLiqNaZ/hW mBooUxNGs11uo8bLqr0AqrgsjyN2FXOsYW8WBfe0XtvhpFL2vdLwtZjQ X-Gm-Gg: AfdE7clqGz0DYwAHerxmAUpPWJCngVZcL/IGk64nabXttkczTovoB58qReMx7cMDgqR nXXY0wtnRaJZ5ZaMD2n4U+R4DvzDvbEuDbId78aziXsGBGEqxVIz+u7NkWWEzYVtfPp87GZJyBM rh6t/z52FaUMROQ/0SWRY0SZBfQAE0d1wlQjQrWlqUzDz5pXxLY8ukXbtmHSP4m6pFDsksV7S7x lWrUjDoXmzCDNVNYMBOF4Qw8nfK9+zefss5ggokX0i3uMVr1sADJ3Fz9vM5n8vCqftO4QBIvP8x Tmh7XSXbwHYUM5u1qFHtQpa5lPSgZwibMFhSZOlUp9taDp0r4SnagLmKB5Tvm/i1S9UaUa09v7x SyTEyWrokx2Akt9XYf6e6DwYpq6snZtmu/0Iyeat3QJMXsy8IhnGebKrMyGhgrnf0MVKCBe+SW7 h0Exstcm/SPKBFUg== X-Received: by 2002:a05:620a:c45:b0:915:9f28:6748 with SMTP id af79cd13be357-9208ff01e88mr299770985a.23.1781844873790; Thu, 18 Jun 2026 21:54:33 -0700 (PDT) Received: from [172.17.0.2] ([138.28.231.64]) by smtp.gmail.com with ESMTPSA id af79cd13be357-920a425448asm134464485a.23.2026.06.18.21.54.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Jun 2026 21:54:33 -0700 (PDT) From: Yuanshen Cao Date: Fri, 19 Jun 2026 04:53:33 +0000 Subject: [PATCH 4/5] dmaengine: sun6i-dma: Implement support for Allwinner A733 DMA controller Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20260619-sun60i-a733-dma-v1-4-da4b649fc72a@gmail.com> References: <20260619-sun60i-a733-dma-v1-0-da4b649fc72a@gmail.com> In-Reply-To: <20260619-sun60i-a733-dma-v1-0-da4b649fc72a@gmail.com> To: Vinod Koul , Frank Li , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Maxime Ripard Cc: dmaengine@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Yuanshen Cao X-Mailer: b4 0.15.2 X-MORS-Enabled: yes X-MORS-DOMAIN: patchwork.local X-MORS-HOSTING: hosting172546 X-MORS-USER: hosting172546 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= This patch implements the actual support for the Allwinner A733 DMA controller. It defines the new register offsets and bitfield mappings required for the A733, which slightly differs from the older `sun6i` series. Changes: - New register macros for A733 interrupt enable `DMA_IRQ_EN_A733` and status `DMA_IRQ_STAT_A733`. - New `SRC_HIGH_ADDR_32G` and `DST_HIGH_ADDR_32G` macro to handle the 32G high-address field in the LLI. - Implemented `sun6i_dma_set_addr_a733` and A733-specific interrupt register accessors. - Added `sun60i_a733_dma_config`, which ties all the refactored functionality together for this specific hardware. Signed-off-by: Yuanshen Cao --- drivers/dma/sun6i-dma.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/drivers/dma/sun6i-dma.c b/drivers/dma/sun6i-dma.c index fb1c1a28744b..9585b4a9e00d 100644 --- a/drivers/dma/sun6i-dma.c +++ b/drivers/dma/sun6i-dma.c @@ -52,6 +52,15 @@ #define SUNXI_H3_SECURE_REG 0x20 #define SUNXI_H3_DMA_GATE 0x28 #define SUNXI_H3_DMA_GATE_ENABLE 0x4 + +/* + * sun60i specific registers + */ +#define DMA_IRQ_EN_A733(x) ((x) * 0x40 + 0x134) +#define DMA_IRQ_STAT_A733(x) ((x) * 0x40 + 0x138) + +#define DMA_IRQ_CHAN_NR_A733 1 + /* * Channels specific registers */ @@ -100,6 +109,8 @@ */ #define SRC_HIGH_ADDR(x) (((x) & 0x3U) << 16) #define DST_HIGH_ADDR(x) (((x) & 0x3U) << 18) +#define SRC_HIGH_ADDR_32G(x) (((x) & 0x7U) << 11) +#define DST_HIGH_ADDR_32G(x) (((x) & 0x7U) << 15) /* * Various hardware related defines @@ -257,6 +268,23 @@ static inline void sun6i_dma_dump_com_regs(struct sun6i_dma_dev *sdev) DMA_STAT, readl(sdev->base + DMA_STAT)); } +static inline void sun6i_dma_dump_com_regs_a733(struct sun6i_dma_dev *sdev) +{ + int i; + + for (i = 0; i < sdev->num_pchans / sdev->cfg->num_channels_per_reg; i++) { + dev_dbg(sdev->slave.dev, "Common register:\n" + "chan num %d\n" + "\tmask(%04x): 0x%08x\n" + "\tpend(%04x): 0x%08x\n" + "\tstats(%04x): 0x%08x\n", + i, + DMA_IRQ_EN_A733(i), readl(sdev->base + DMA_IRQ_EN_A733(i)), + DMA_IRQ_STAT_A733(i), readl(sdev->base + DMA_IRQ_STAT_A733(i)), + DMA_STAT, readl(sdev->base + DMA_STAT)); + } +} + static inline void sun6i_dma_dump_chan_regs(struct sun6i_dma_dev *sdev, struct sun6i_pchan *pchan) { @@ -360,20 +388,41 @@ static u32 sun6i_read_irq_en(struct sun6i_dma_dev *sdev, u32 chan_num) return readl(sdev->base + DMA_IRQ_EN(chan_num)); } +static u32 sun6i_read_irq_en_a733(struct sun6i_dma_dev *sdev, u32 chan_num) +{ + return readl(sdev->base + DMA_IRQ_EN_A733(chan_num)); +} + static void sun6i_write_irq_en(struct sun6i_dma_dev *sdev, u32 chan_num, u32 irq_val) { writel(irq_val, sdev->base + DMA_IRQ_EN(chan_num)); } + +static void sun6i_write_irq_en_a733(struct sun6i_dma_dev *sdev, u32 chan_num, u32 irq_val) +{ + writel(irq_val, sdev->base + DMA_IRQ_EN_A733(chan_num)); +} + static u32 sun6i_read_irq_stat(struct sun6i_dma_dev *sdev, u32 chan_num) { return readl(sdev->base + DMA_IRQ_STAT(chan_num)); } +static u32 sun6i_read_irq_stat_a733(struct sun6i_dma_dev *sdev, u32 chan_num) +{ + return readl(sdev->base + DMA_IRQ_STAT_A733(chan_num)); +} + static void sun6i_write_irq_stat(struct sun6i_dma_dev *sdev, u32 chan_num, u32 status) { writel(status, sdev->base + DMA_IRQ_STAT(chan_num)); } +static void sun6i_write_irq_stat_a733(struct sun6i_dma_dev *sdev, u32 chan_num, u32 status) +{ + writel(status, sdev->base + DMA_IRQ_STAT_A733(chan_num)); +} + static size_t sun6i_get_chan_size(struct sun6i_pchan *pchan) { struct sun6i_desc *txd = pchan->desc; @@ -694,6 +743,17 @@ static inline void sun6i_dma_set_addr_a100(struct sun6i_dma_dev *sdev, DST_HIGH_ADDR(upper_32_bits(dst)); } +static inline void sun6i_dma_set_addr_a733(struct sun6i_dma_dev *sdev, + struct sun6i_dma_lli *v_lli, + dma_addr_t src, dma_addr_t dst) +{ + v_lli->src = lower_32_bits(src); + v_lli->dst = lower_32_bits(dst); + + v_lli->para |= SRC_HIGH_ADDR_32G(upper_32_bits(src)) | + DST_HIGH_ADDR_32G(upper_32_bits(dst)); +} + static struct dma_async_tx_descriptor *sun6i_dma_prep_dma_memcpy( struct dma_chan *chan, dma_addr_t dest, dma_addr_t src, size_t len, unsigned long flags) @@ -1352,6 +1412,33 @@ static struct sun6i_dma_config sun50i_h6_dma_cfg = { .has_mbus_clk = true, }; +/* + * The A733 binding uses the number of dma channels from the + * device tree node. + */ +static struct sun6i_dma_config sun60i_a733_dma_cfg = { + .clock_autogate_enable = sun6i_enable_clock_autogate_h3, + .set_burst_length = sun6i_set_burst_length_h3, + .set_drq = sun6i_set_drq_h6, + .set_mode = sun6i_set_mode_h6, + .set_addr = sun6i_dma_set_addr_a733, + .dump_com_regs = sun6i_dma_dump_com_regs_a733, + .read_irq_en = sun6i_read_irq_en_a733, + .write_irq_en = sun6i_write_irq_en_a733, + .read_irq_stat = sun6i_read_irq_stat_a733, + .write_irq_stat = sun6i_write_irq_stat_a733, + .src_burst_lengths = BIT(1) | BIT(4) | BIT(8) | BIT(16), + .dst_burst_lengths = BIT(1) | BIT(4) | BIT(8) | BIT(16), + .src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | + BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | + BIT(DMA_SLAVE_BUSWIDTH_4_BYTES), + .dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | + BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | + BIT(DMA_SLAVE_BUSWIDTH_4_BYTES), + .num_channels_per_reg = DMA_IRQ_CHAN_NR_A733, + .has_mbus_clk = true, +}; + /* * The V3s have only 8 physical channels, a maximum DRQ port id of 23, * and a total of 24 usable source and destination endpoints. @@ -1392,6 +1479,7 @@ static const struct of_device_id sun6i_dma_match[] = { { .compatible = "allwinner,sun50i-a64-dma", .data = &sun50i_a64_dma_cfg }, { .compatible = "allwinner,sun50i-a100-dma", .data = &sun50i_a100_dma_cfg }, { .compatible = "allwinner,sun50i-h6-dma", .data = &sun50i_h6_dma_cfg }, + { .compatible = "allwinner,sun60i-a733-dma", .data = &sun60i_a733_dma_cfg }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, sun6i_dma_match); From patchwork Fri Jun 19 04:53:34 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yuanshen Cao X-Patchwork-Id: 2450 Return-Path: X-Original-To: noreply@patchwork.local Delivered-To: noreply@patchwork.local Received: from tor.lore.kernel.org (tor.lore.kernel.org [172.105.105.114]) by mxe881.netcup.net (Postfix) with ESMTPS id 4158D1C00CA for ; Fri, 19 Jun 2026 06:56:07 +0200 (CEST) Authentication-Results: mxe881; dkim=pass header.d=gmail.com; spf=pass (sender IP is 172.105.105.114) smtp.mailfrom=linux-sunxi+bounces-23875-noreply=patchwork.local@lists.linux.dev smtp.helo=tor.lore.kernel.org Received-SPF: pass (mxe881: domain of lists.linux.dev designates 172.105.105.114 as permitted sender) client-ip=172.105.105.114; envelope-from=linux-sunxi+bounces-23875-noreply=patchwork.local@lists.linux.dev; helo=tor.lore.kernel.org; Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by tor.lore.kernel.org (Postfix) with ESMTP id 3A45230D3BC5 for ; Fri, 19 Jun 2026 04:54:54 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DD15733F5B3; Fri, 19 Jun 2026 04:54:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ShR4sK3v" X-Original-To: linux-sunxi@lists.linux.dev Received: from mail-qk1-f181.google.com (mail-qk1-f181.google.com [209.85.222.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 44C791E4AF for ; Fri, 19 Jun 2026 04:54:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781844877; cv=none; b=hURQY3KL9EyNF+6UYSdQQyJeWLh7gC+pda4tnEu10raZksvEiSAjX1JOhuh6gur/m1HcQd8jxaa/v7T97Hdh3+J/tjEfYlhfWXdmzvfCF/mdnCMZvhsLXFCfx1RSFdvjUie45ak0C3a2EInYCYAFSVvLc9lrsWjsLYl9LO8GNAk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781844877; c=relaxed/simple; bh=1/J1QDc8wYS4aTyB2hGxeW2e18b7qy0uZ1pmyFz9DR4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=p/L2OkwQg/I8YXnFPQ8IAq9b19afPtA8V0so/f51LsYRT36PQ+IbKoq1BW7OCHsCYvw/juUMNdID1Bw0m9eJC/mJV3fPmNud9eZzoczhKoGP4/qcV/oRmmcJ3xbHRI+W0pgvk2praOmEpNPK77kUw741mcwCCxcg3yejnxvxMqA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ShR4sK3v; arc=none smtp.client-ip=209.85.222.181 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 Received: by mail-qk1-f181.google.com with SMTP id af79cd13be357-915ab38ac14so236830285a.0 for ; Thu, 18 Jun 2026 21:54:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781844875; x=1782449675; darn=lists.linux.dev; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=des/YMvzXKFvsVSBqNlCoInqunzXPQ6/th3snijZ9DY=; b=ShR4sK3vXQcHqi2B5FFu9jk3zf99a2+Mx8mkX6lTOvrp5Jz6KCJaHAMxinn+++wjCn TLhrmLGrsWveMiKA9zQ2wPlEZKeqdQC1bAVaAGwhfBPOitISX2WS35RKnHd2yaih3YpP ooMk9PbpxgUC3f87Pfq/TX0hCEQdvVUFawOY8ZPQgjNSDeKOasw8M+xrVmrNL/hAwctb 8JTO+elJ8JA7Ch6RhUN+Cawdw2TD6DxrJNFE/yuZiKkI4OOcthtBvwFExqr+ThxH/w91 65OlA10AohHVgXrUCj+Dfb9ASMaLv4D8Q2JeMGriN7j9YBi+p7sjf2g+wi73hBy8TUuC YC+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781844875; x=1782449675; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=des/YMvzXKFvsVSBqNlCoInqunzXPQ6/th3snijZ9DY=; b=ItnlkXMiz3y+qur/bsB9B5+d3J61gz/LtPg9M7EoBT+KzmIwErW/mQzq+S37cMewdw loVtsC+NOXlzaD+iw3Ih4n7+26+11HqQZMa2scZnSRoVguKuWuGx4aKHGyptQKh9cIeW dINX/Pq+R1imlrRY3fjazRcEQDSB7k3ekawCH5zjljAckU/AOAnZD6CIrU2J1sGen9cB 6QhUCnRmZUMdWGbLN6O0ZFagRumjMTU0T5stqk4v3nylWxB1B8OhB6ix5B7THJh3+7NT XwwZDFreiq88IP0GzkpnZ3a9EQ3HZUsgq3QZdRyZGsR5A9WIu7lUIi6F6Pt8EfKlVKXf m7iw== X-Forwarded-Encrypted: i=1; AFNElJ+U7sSZr4WmV5BWlfV9jYU5qCbEr3gx8BW1gqvK2DOYYu/LDd9hNYSwUBG2pRl/gvXx+JN7Q4aLay06Kw==@lists.linux.dev X-Gm-Message-State: AOJu0YwsH0pi8b2p4nn2/DUy/o9MGQEGOyN6v4UOt6Z3doKFXdF1j8FO dEJ81PHh/z7ClTh4lMT+BEiMGycjI5pjPhyTA8BWgXKh18nGZmpenhSH X-Gm-Gg: AfdE7cmpMbxtx3JuxRUZa5LY5tBDU/ZeBIMLOQbSv1YYfmcIJMBcXk8irpERxfgMBLD qDpxL7tZ4HXITjcq0x+YEpAX/h3WiXZAtsWx5+diJUe5Tc9bOgiLj5D1RYhlOjC9CXSJbFR50kr hsuqccnjqC5FIXfOxdkdQTJppXQIMqE6c1XtGA8xxdI0yFCQpAGR2r/s9Ds+G9GzJ4ONus4kA6t mEQduGzhPDaUQSvvyJK5AtPVgNGVAvoU0wjVrW1Yuqfu/HvZpPJlw559qsXj07Gw0EtDxQkdOMN aPArlMLBmSs77BNs9sndkdm0aonWkwooBHyGSGChBgF/SIzACRF1ivvWcB21a+WZD/Cdu5USM+X 0owwPcOCeB+oZzbePu3Ho6X/GP3Ez9O+1gtElTPsa08o1pqHuqUJYdY+EcjvCUiZeXM5mxwgZrQ uPtsVZBvh3sMS77g== X-Received: by 2002:a05:620a:284c:b0:915:422b:fb49 with SMTP id af79cd13be357-92091397994mr303581385a.28.1781844875147; Thu, 18 Jun 2026 21:54:35 -0700 (PDT) Received: from [172.17.0.2] ([138.28.231.64]) by smtp.gmail.com with ESMTPSA id af79cd13be357-920a425448asm134464485a.23.2026.06.18.21.54.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Jun 2026 21:54:34 -0700 (PDT) From: Yuanshen Cao Date: Fri, 19 Jun 2026 04:53:34 +0000 Subject: [PATCH 5/5] dt-bindings: dma: sun50i-a64-dma: Update device tree bindings documentation for A733 Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20260619-sun60i-a733-dma-v1-5-da4b649fc72a@gmail.com> References: <20260619-sun60i-a733-dma-v1-0-da4b649fc72a@gmail.com> In-Reply-To: <20260619-sun60i-a733-dma-v1-0-da4b649fc72a@gmail.com> To: Vinod Koul , Frank Li , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Maxime Ripard Cc: dmaengine@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Yuanshen Cao X-Mailer: b4 0.15.2 X-MORS-Enabled: yes X-MORS-DOMAIN: patchwork.local X-MORS-HOSTING: hosting172546 X-MORS-USER: hosting172546 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= To complete the support for the A733 DMA controller, added `allwinner,sun60i-a733-dma` to the list of compatible strings for `allwinner,sun50i-a64-dma` dt-binding documentations.. Signed-off-by: Yuanshen Cao --- Documentation/devicetree/bindings/dma/allwinner,sun50i-a64-dma.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/dma/allwinner,sun50i-a64-dma.yaml b/Documentation/devicetree/bindings/dma/allwinner,sun50i-a64-dma.yaml index c3e14eb6cfff..1cc3304b7414 100644 --- a/Documentation/devicetree/bindings/dma/allwinner,sun50i-a64-dma.yaml +++ b/Documentation/devicetree/bindings/dma/allwinner,sun50i-a64-dma.yaml @@ -25,6 +25,7 @@ properties: - allwinner,sun50i-a64-dma - allwinner,sun50i-a100-dma - allwinner,sun50i-h6-dma + - allwinner,sun60i-a733-dma - items: - const: allwinner,sun8i-r40-dma - const: allwinner,sun50i-a64-dma @@ -70,6 +71,7 @@ if: - allwinner,sun20i-d1-dma - allwinner,sun50i-a100-dma - allwinner,sun50i-h6-dma + - allwinner,sun60i-a733-dma then: properties: