From nobody Sat Feb 7 23:12:24 2026 Received: from mail-ej1-f47.google.com (mail-ej1-f47.google.com [209.85.218.47]) (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 B834D45024 for ; Wed, 13 Mar 2024 14:08:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338933; cv=none; b=ascSbe5WZW9j2V+fd27stVvAx+mxQSida2wV5FS5zQ9e42BA44L2xoRQco8SwFy0BWLshFNcaM1U5mYK0p0c96F44cbiN2Qc7ul+QUt5oXqFgrNHiWAJL2uyK7dj5dFI6y7Iv6hMjmRsGUl6V4eIDzUBJLCZvx8+X+8R8Jnzm6s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338933; c=relaxed/simple; bh=TiV/x+MwIO7f4UmnRKt0r41hVI84TqUvspuBnnt5QWk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MDj/QRQDNzPy9oSTzKSIK72dP+Wn5qss3WZr5umb6Hdvv02MSRLDwO5cyX/G3Pku7D+FFkRA9djjDJLAUxXUuOODdDaPIifX1qekq1aXWMgZqwEDyZmlU8wsclOB+ETRjyFqtoaCx6kluStVawXpRdw3amv4yYT5dAlxI/I3Gsc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=PSoErHgR; arc=none smtp.client-ip=209.85.218.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="PSoErHgR" Received: by mail-ej1-f47.google.com with SMTP id a640c23a62f3a-a44e3176120so873967966b.1 for ; Wed, 13 Mar 2024 07:08:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1710338928; x=1710943728; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=DCjY7yma+RGAhMTh4u8gj7GTqPRw3rlJG0cUBmglS1Q=; b=PSoErHgRquG1TaVd3zofyHG2xgdk6ql+NlCYCN7r9W/Po7T48X3x3oyZYCX7d0HPKX a5a8yGAWvQgd0gJ9ItccnB8fSBAm4+7NP48TqAe6IKtvw9K3djJE+foTvIjKtXtyYscZ rVLXNh6Bbmag08XcfkOC66HLRofXiI3egEQZ2V/3dJajXW2BlvdsIpePXTeUNESB2zRk CiNIYqK11258EwIDiwsr4CEqJ6NGbALwMMqYJHTlByE6lWe2jpnTK9y7hBnELs3bu+K7 pXpEuEHs/K3OXrdmIV4/YbEV9krX4/ixuQyzbNlVNJSJdvVcQ0B5MnQoTJ9RKaCka9GI NPGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710338928; x=1710943728; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=DCjY7yma+RGAhMTh4u8gj7GTqPRw3rlJG0cUBmglS1Q=; b=Z7bqurCLi868FnuJuDP1y98/EQnuWt+1k50Cc8qIchvrAgxw9Nv9Bo5HXBiNrzn35n M1OfPuqXi2vWef9L82rFxdzS2O+Sjcc5XYJ2dayXQFT5yV0v037/18DVNDEC55a+AU7d jBmUaLz/XtCpJUcZtWi5TkH7Im9ey3m0l41FOGwJ9oyV9DC45pDhYHMmW2GZyw2cAFo7 dKbjJuU9E/1KkY8c4sy3gjQUA/7a6Kc8fGtk0D7DBrzzbNcoejRRNobMhJW7DSV0IJZs Znpz3mu5eUnv8ahxa0Fja8SsXILH4cbyxz/el8nnAEG1gU7wl67hfYL8qkSUrPR9aawf w3tw== X-Forwarded-Encrypted: i=1; AJvYcCU+rV0POSTWu4WaS/lDwLxfbOYsnX7QW09zb7B7IoHDN6QS4pWiLjnjABm6WKC6IGwlM8fP2LEtWsCxLUr3QZpgW+YWyynESB4Tzp7M X-Gm-Message-State: AOJu0YxWU9inbCCTCDiwez3nwhkdlKxPoK7r43CgifwIniR5vY9fiVmE ZB8qalBFRAYLPlN2CwdbFRvFxunPv/WIoH7deJphCVh/1ahuXCMl/gUxiewxBlQ= X-Google-Smtp-Source: AGHT+IFJLbfeGtbha0JVbIZTeiai8FTB/X6n+UdCuNQI1XT7w/ymHZH+kptfqSeAe/qiMeK3y/y/zQ== X-Received: by 2002:a17:906:b153:b0:a43:dae8:d43c with SMTP id bt19-20020a170906b15300b00a43dae8d43cmr8570426ejb.32.1710338927934; Wed, 13 Mar 2024 07:08:47 -0700 (PDT) Received: from localhost (host-82-56-173-172.retail.telecomitalia.it. [82.56.173.172]) by smtp.gmail.com with ESMTPSA id 1-20020a170906308100b00a458d52a5f7sm4848776ejv.28.2024.03.13.07.08.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Mar 2024 07:08:47 -0700 (PDT) From: Andrea della Porta To: Vinod Koul , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list , Saenz Julienne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dave.stevenson@raspberrypi.com Cc: Phil Elwell , Maxime Ripard , Stefan Wahren , Dom Cobley , Andrea della Porta Subject: [PATCH v2 01/15] dmaengine: bcm2835: Fix several spellos Date: Wed, 13 Mar 2024 15:08:26 +0100 Message-ID: X-Mailer: git-send-email 2.44.0 In-Reply-To: References: 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 Content-Type: text/plain; charset="utf-8" Fixed Codespell reported warnings about spelling and coding convention violations, among which there are also a couple potential operator precedence issue in macroes. Signed-off-by: Andrea della Porta --- drivers/dma/bcm2835-dma.c | 96 +++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c index 9d74fe97452e..428253b468ac 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -51,13 +51,13 @@ struct bcm2835_dmadev { }; =20 struct bcm2835_dma_cb { - uint32_t info; - uint32_t src; - uint32_t dst; - uint32_t length; - uint32_t stride; - uint32_t next; - uint32_t pad[2]; + u32 info; + u32 src; + u32 dst; + u32 length; + u32 stride; + u32 next; + u32 pad[2]; }; =20 struct bcm2835_cb_entry { @@ -116,8 +116,8 @@ struct bcm2835_desc { * AXI-write to ack */ #define BCM2835_DMA_ERR BIT(8) -#define BCM2835_DMA_PRIORITY(x) ((x & 15) << 16) /* AXI priority */ -#define BCM2835_DMA_PANIC_PRIORITY(x) ((x & 15) << 20) /* panic priority */ +#define BCM2835_DMA_PRIORITY(x) (((x) & 15) << 16) /* AXI priority */ +#define BCM2835_DMA_PANIC_PRIORITY(x) (((x) & 15) << 20) /* panic priority= */ /* current value of TI.BCM2835_DMA_WAIT_RESP */ #define BCM2835_DMA_WAIT_FOR_WRITES BIT(28) #define BCM2835_DMA_DIS_DEBUG BIT(29) /* disable debug pause signal */ @@ -136,9 +136,9 @@ struct bcm2835_desc { #define BCM2835_DMA_S_WIDTH BIT(9) /* 128bit writes if set */ #define BCM2835_DMA_S_DREQ BIT(10) /* enable SREQ for source */ #define BCM2835_DMA_S_IGNORE BIT(11) /* ignore source reads - read 0 */ -#define BCM2835_DMA_BURST_LENGTH(x) ((x & 15) << 12) -#define BCM2835_DMA_PER_MAP(x) ((x & 31) << 16) /* REQ source */ -#define BCM2835_DMA_WAIT(x) ((x & 31) << 21) /* add DMA-wait cycles */ +#define BCM2835_DMA_BURST_LENGTH(x) (((x) & 15) << 12) +#define BCM2835_DMA_PER_MAP(x) (((x) & 31) << 16) /* REQ source */ +#define BCM2835_DMA_WAIT(x) (((x) & 31) << 21) /* add DMA-wait cycles */ #define BCM2835_DMA_NO_WIDE_BURSTS BIT(26) /* no 2 beat write bursts */ =20 /* debug register bits */ @@ -214,17 +214,15 @@ static void bcm2835_dma_free_cb_chain(struct bcm2835_= desc *desc) =20 static void bcm2835_dma_desc_free(struct virt_dma_desc *vd) { - bcm2835_dma_free_cb_chain( - container_of(vd, struct bcm2835_desc, vd)); + bcm2835_dma_free_cb_chain(container_of(vd, struct bcm2835_desc, vd)); } =20 -static void bcm2835_dma_create_cb_set_length( - struct bcm2835_chan *chan, - struct bcm2835_dma_cb *control_block, - size_t len, - size_t period_len, - size_t *total_len, - u32 finalextrainfo) +static void bcm2835_dma_create_cb_set_length(struct bcm2835_chan *chan, + struct bcm2835_dma_cb *control_block, + size_t len, + size_t period_len, + size_t *total_len, + u32 finalextrainfo) { size_t max_len =3D bcm2835_dma_max_frame_length(chan); =20 @@ -260,10 +258,9 @@ static void bcm2835_dma_create_cb_set_length( control_block->info |=3D finalextrainfo; } =20 -static inline size_t bcm2835_dma_count_frames_for_sg( - struct bcm2835_chan *c, - struct scatterlist *sgl, - unsigned int sg_len) +static inline size_t bcm2835_dma_count_frames_for_sg(struct bcm2835_chan *= c, + struct scatterlist *sgl, + unsigned int sg_len) { size_t frames =3D 0; struct scatterlist *sgent; @@ -271,8 +268,8 @@ static inline size_t bcm2835_dma_count_frames_for_sg( size_t plength =3D bcm2835_dma_max_frame_length(c); =20 for_each_sg(sgl, sgent, sg_len, i) - frames +=3D bcm2835_dma_frames_for_length( - sg_dma_len(sgent), plength); + frames +=3D bcm2835_dma_frames_for_length(sg_dma_len(sgent), + plength); =20 return frames; } @@ -298,10 +295,13 @@ static inline size_t bcm2835_dma_count_frames_for_sg( * @gfp: the GFP flag to use for allocation */ static struct bcm2835_desc *bcm2835_dma_create_cb_chain( - struct dma_chan *chan, enum dma_transfer_direction direction, - bool cyclic, u32 info, u32 finalextrainfo, size_t frames, - dma_addr_t src, dma_addr_t dst, size_t buf_len, - size_t period_len, gfp_t gfp) + struct dma_chan *chan, + enum dma_transfer_direction direction, + bool cyclic, u32 info, + u32 finalextrainfo, + size_t frames, dma_addr_t src, + dma_addr_t dst, size_t buf_len, + size_t period_len, gfp_t gfp) { struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); size_t len =3D buf_len, total_len; @@ -343,10 +343,10 @@ static struct bcm2835_desc *bcm2835_dma_create_cb_cha= in( /* set up length in control_block if requested */ if (buf_len) { /* calculate length honoring period_length */ - bcm2835_dma_create_cb_set_length( - c, control_block, - len, period_len, &total_len, - cyclic ? finalextrainfo : 0); + bcm2835_dma_create_cb_set_length(c, control_block, + len, period_len, + &total_len, + cyclic ? finalextrainfo : 0); =20 /* calculate new remaining length */ len -=3D control_block->length; @@ -369,8 +369,8 @@ static struct bcm2835_desc *bcm2835_dma_create_cb_chain( /* the last frame requires extra flags */ d->cb_list[d->frames - 1].cb->info |=3D finalextrainfo; =20 - /* detect a size missmatch */ - if (buf_len && (d->size !=3D buf_len)) + /* detect a size mismatch */ + if (buf_len && d->size !=3D buf_len) goto error_cb; =20 return d; @@ -410,7 +410,7 @@ static void bcm2835_dma_fill_cb_chain_with_sg( static void bcm2835_dma_abort(struct bcm2835_chan *c) { void __iomem *chan_base =3D c->chan_base; - long int timeout =3D 10000; + long timeout =3D 10000; =20 /* * A zero control block address means the channel is idle. @@ -438,7 +438,6 @@ static void bcm2835_dma_abort(struct bcm2835_chan *c) static void bcm2835_dma_start_desc(struct bcm2835_chan *c) { struct virt_dma_desc *vd =3D vchan_next_desc(&c->vc); - struct bcm2835_desc *d; =20 if (!vd) { c->desc =3D NULL; @@ -447,9 +446,9 @@ static void bcm2835_dma_start_desc(struct bcm2835_chan = *c) =20 list_del(&vd->node); =20 - c->desc =3D d =3D to_bcm2835_dma_desc(&vd->tx); + c->desc =3D to_bcm2835_dma_desc(&vd->tx); =20 - writel(d->cb_list[0].paddr, c->chan_base + BCM2835_DMA_ADDR); + writel(c->desc->cb_list[0].paddr, c->chan_base + BCM2835_DMA_ADDR); writel(BCM2835_DMA_ACTIVE, c->chan_base + BCM2835_DMA_CS); } =20 @@ -560,7 +559,8 @@ static size_t bcm2835_dma_desc_size_pos(struct bcm2835_= desc *d, dma_addr_t addr) } =20 static enum dma_status bcm2835_dma_tx_status(struct dma_chan *chan, - dma_cookie_t cookie, struct dma_tx_state *txstate) + dma_cookie_t cookie, + struct dma_tx_state *txstate) { struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct virt_dma_desc *vd; @@ -860,7 +860,7 @@ static const struct of_device_id bcm2835_dma_of_match[]= =3D { MODULE_DEVICE_TABLE(of, bcm2835_dma_of_match); =20 static struct dma_chan *bcm2835_dma_xlate(struct of_phandle_args *spec, - struct of_dma *ofdma) + struct of_dma *ofdma) { struct bcm2835_dmadev *d =3D ofdma->of_dma_data; struct dma_chan *chan; @@ -883,7 +883,7 @@ static int bcm2835_dma_probe(struct platform_device *pd= ev) int i, j; int irq[BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED + 1]; int irq_flags; - uint32_t chans_available; + u32 chans_available; char chan_name[BCM2835_DMA_CHAN_NAME_SIZE]; =20 if (!pdev->dev.dma_mask) @@ -942,8 +942,8 @@ static int bcm2835_dma_probe(struct platform_device *pd= ev) =20 /* Request DMA channel mask from device tree */ if (of_property_read_u32(pdev->dev.of_node, - "brcm,dma-channel-mask", - &chans_available)) { + "brcm,dma-channel-mask", + &chans_available)) { dev_err(&pdev->dev, "Failed to get channel mask\n"); rc =3D -EINVAL; goto err_no_dma; @@ -982,7 +982,7 @@ static int bcm2835_dma_probe(struct platform_device *pd= ev) /* check if there are other channels that also use this irq */ irq_flags =3D 0; for (j =3D 0; j <=3D BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED; j++) - if ((i !=3D j) && (irq[j] =3D=3D irq[i])) { + if (i !=3D j && irq[j] =3D=3D irq[i]) { irq_flags =3D IRQF_SHARED; break; } @@ -997,7 +997,7 @@ static int bcm2835_dma_probe(struct platform_device *pd= ev) =20 /* Device-tree DMA controller registration */ rc =3D of_dma_controller_register(pdev->dev.of_node, - bcm2835_dma_xlate, od); + bcm2835_dma_xlate, od); if (rc) { dev_err(&pdev->dev, "Failed to register DMA controller\n"); goto err_no_dma; --=20 2.35.3 From nobody Sat Feb 7 23:12:25 2026 Received: from mail-ed1-f41.google.com (mail-ed1-f41.google.com [209.85.208.41]) (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 572394597F for ; Wed, 13 Mar 2024 14:08:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338934; cv=none; b=FWmYzpYTByfzLbkWpcl38xNumXZcn/NaP/ad2dwLqyXqD750DsdleMOoZLmjYHnynlVbqk1gBbyuaGExzBHxBLM+4evyVw9uZtU1OHFjGdMU4b1UAuDoAdZ5YUSGt3LKd5HEZpzTok+nMKLNc3F5zWQi2iPipGT3NfqXlTxjzVU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338934; c=relaxed/simple; bh=jjis7xsIFrLu1sl29w85XAmU74ruhJPA4C3PFk6UMzg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pSpZdpHVwlyGFMyBPtyHkE5MUobS9DLtHo1oUH/9MD69kNKnRQs7vSdbiHJDSKuZXh4MrRODslt2WdvxR20l49MsPw+TREW4cPfEm8d9uIMYxaZ5J3x3D5vgI4y24MFfarYsNcMaxT+efrKcA3Y102EITt3wfpl5f5eqFmS7bmk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=NuC5oEb8; arc=none smtp.client-ip=209.85.208.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="NuC5oEb8" Received: by mail-ed1-f41.google.com with SMTP id 4fb4d7f45d1cf-5684ea117a3so6302494a12.0 for ; Wed, 13 Mar 2024 07:08:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1710338930; x=1710943730; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=1+qHX7SxjysW+WBJacqKls7OusP1dBurz/GxAdGzZn4=; b=NuC5oEb8vzIMVS7FoXIilQf3/9z7y+Wul5g9pUQVPsZd9lxh4GMS9TB3VT3TQd1rJh 7rgjNPrmoRhOjMiZPjFpDvCA9y1HA2I0Esc9bqSzgJFSYpqSR9sreANzEsfXQ83MnClq DIBcIKcptvzlKzE1M5dCPm/+CHbHEe9cRh1BA0evQ45Tn2DPQMXIysrU8J9Rm4dL9xHi vE9KNa2D14rr9LSlcMPzj9G4jjQ8eKeWcHCMqS9yPIKaysFa+9swh5n3PZTTETatd3ER 1IkzPTxioeYUr/uw2hc7m+5DRHe6luqBzgxVCN0Vx9mQnmPNITc904h7HyzdgZCx4ePg qbpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710338930; x=1710943730; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=1+qHX7SxjysW+WBJacqKls7OusP1dBurz/GxAdGzZn4=; b=PRkamW7h5rHaRx4q7qL+42t2/wTFfKpF+0guM5IfxXpwG9D7vGaESfwrHYsIlPL7Qh ep5qIg2liOCTCkLBfGULZWM4uh1ErcgRN79zwJKyJ7iVcJULXbM30JV5OxGOQQW476n9 BDlTfQhyewPMOJGGLEPOWbf3pnnE4dqDcQtp5mxOBsVcRNIVPKgUx7KV7NRjLvvfXW1C FkOs3yDMv0l7K006XQR01rAklkvOP4za8jbVhCgaojCkNOL5Nnb9Rytry4dzOQU3JfDk b44T789oC0V09px9X1BJ0qfe6SHg+XdNYL8WZ1pXni5cL3CksvRBUqZMVCQHxNkuSrkD +fNw== X-Forwarded-Encrypted: i=1; AJvYcCWbHy0vO+c59M1IivJ4zkWATIrPVzPojYL4U2+xlJ+JNgv6bpsWQ3ZIA7qn9libNmlQIEHXV5O2ZIaFLi4cxsunhvsJD1lePiymv+kl X-Gm-Message-State: AOJu0YxA6v/4GDfFq5gdDigj/DLNkzeS9IQFLFEwvdk1Cl95y/jccM4+ f30Kmhdp8Yw1vfrM9m9gTrqhh6GQYE3U4idImx+UA3AMTFpyFx8mFgpS65CQVds= X-Google-Smtp-Source: AGHT+IEQhY1LzZrqKG46nbukNSNTyWGekHoM+pNHxFUDfOcSbMTklqa6OdRjNge+Unwg8hREwyz0mg== X-Received: by 2002:a17:907:c30a:b0:a45:84e7:b265 with SMTP id tl10-20020a170907c30a00b00a4584e7b265mr2885296ejc.7.1710338929747; Wed, 13 Mar 2024 07:08:49 -0700 (PDT) Received: from localhost (host-82-56-173-172.retail.telecomitalia.it. [82.56.173.172]) by smtp.gmail.com with ESMTPSA id o13-20020a17090611cd00b00a45ff1fe8dasm4792514eja.115.2024.03.13.07.08.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Mar 2024 07:08:49 -0700 (PDT) From: Andrea della Porta To: Vinod Koul , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list , Saenz Julienne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dave.stevenson@raspberrypi.com Cc: Phil Elwell , Maxime Ripard , Stefan Wahren , Dom Cobley , Andrea della Porta Subject: [PATCH v2 02/15] dmaengine: bcm2835: Add support for per-channel flags Date: Wed, 13 Mar 2024 15:08:27 +0100 Message-ID: X-Mailer: git-send-email 2.44.0 In-Reply-To: References: 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 Content-Type: text/plain; charset="utf-8" From: Phil Elwell Add the ability to interpret the high bits of the dreq specifier as flags to be included in the DMA_CS register. The motivation for this change is the ability to set the DISDEBUG flag for SD card transfers to avoid corruption when using the VPU debugger. Signed-off-by: Phil Elwell Signed-off-by: Andrea della Porta --- drivers/dma/bcm2835-dma.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c index 428253b468ac..3d9973dd041d 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -137,6 +137,10 @@ struct bcm2835_desc { #define BCM2835_DMA_S_DREQ BIT(10) /* enable SREQ for source */ #define BCM2835_DMA_S_IGNORE BIT(11) /* ignore source reads - read 0 */ #define BCM2835_DMA_BURST_LENGTH(x) (((x) & 15) << 12) +#define BCM2835_DMA_CS_FLAGS(x) ((x) & (BCM2835_DMA_PRIORITY(15) | \ + BCM2835_DMA_PANIC_PRIORITY(15) | \ + BCM2835_DMA_WAIT_FOR_WRITES | \ + BCM2835_DMA_DIS_DEBUG)) #define BCM2835_DMA_PER_MAP(x) (((x) & 31) << 16) /* REQ source */ #define BCM2835_DMA_WAIT(x) (((x) & 31) << 21) /* add DMA-wait cycles */ #define BCM2835_DMA_NO_WIDE_BURSTS BIT(26) /* no 2 beat write bursts */ @@ -449,7 +453,8 @@ static void bcm2835_dma_start_desc(struct bcm2835_chan = *c) c->desc =3D to_bcm2835_dma_desc(&vd->tx); =20 writel(c->desc->cb_list[0].paddr, c->chan_base + BCM2835_DMA_ADDR); - writel(BCM2835_DMA_ACTIVE, c->chan_base + BCM2835_DMA_CS); + writel(BCM2835_DMA_ACTIVE | BCM2835_DMA_CS_FLAGS(c->dreq), + c->chan_base + BCM2835_DMA_CS); } =20 static irqreturn_t bcm2835_dma_callback(int irq, void *data) @@ -476,7 +481,8 @@ static irqreturn_t bcm2835_dma_callback(int irq, void *= data) * if this IRQ handler is threaded.) If the channel is finished, it * will remain idle despite the ACTIVE flag being set. */ - writel(BCM2835_DMA_INT | BCM2835_DMA_ACTIVE, + writel(BCM2835_DMA_INT | BCM2835_DMA_ACTIVE | + BCM2835_DMA_CS_FLAGS(c->dreq), c->chan_base + BCM2835_DMA_CS); =20 d =3D c->desc; --=20 2.35.3 From nobody Sat Feb 7 23:12:25 2026 Received: from mail-ej1-f50.google.com (mail-ej1-f50.google.com [209.85.218.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 A86B545022 for ; Wed, 13 Mar 2024 14:08:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338934; cv=none; b=MI+Db50UXlQfwF4p47rJh6KTctnqAc3QqJ8b8mYQgegg3cH+kvCNHOR9T/Qlq8mYQ9AxSh8HJ3YUAIbf+wORqELBlqSus03XJ75rZOYIMYART4xN+SUUmpoksvRLp0SsSx+eeaQ3GIBmql2ynIxbq5g4k2aJeMlpg6IJBoTTgKY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338934; c=relaxed/simple; bh=VoefusMX7Ytod/wgz/c8WF/mjN+oMfRNOX8FE9P8irY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UlbRmdOemLiAzZckFHJ/oYXtv1ZayDvLUC97exzoA3uJjXU/KbpW1BmEbWu5Fmilyf3dnQlwWBNmt8uw/ENcXVBbzYqYemu9BaPof+p5BIhOeYfbUPHqDelcVWn/jP4gG1pN7azl3M/B1S3GBlsNe+pyZZoCqNWoA3Edq9Bq8k8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=ClGAc5JM; arc=none smtp.client-ip=209.85.218.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="ClGAc5JM" Received: by mail-ej1-f50.google.com with SMTP id a640c23a62f3a-a45ecef71deso632327466b.2 for ; Wed, 13 Mar 2024 07:08:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1710338931; x=1710943731; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7L2vUwfipr2gKOB26ZSV+Vf7Bi2o+2MhICmn4R7KPa0=; b=ClGAc5JMtY+aNJ6AxXFoanQBROAcg5+EYNSdibz3tFRSsRX1eyWyKcr+Fdp6HvxaXA a4Cyw5tVrzOlNXHvOQ8dv0z2gcF2/TRyMXSNE5HItLqwN6eF4wLz1Z+iY+1aY2NQh3bm S2q2I4Vjd06r4cP5Dp3zVVan+9AFJL6ZBLph8iXl+ZUlf07c1U4Dkn/yKmgHQLoh5HFk caFnJ07eZqF3DnAMAv54oFYvx7fGijrqgjEOBw7RPUoJPiwVlRyE+Gn1zv/sh1NZ9L2D SbrpliJnU2u8Y2AM/bae/9pXWmWnCLZq3JecfQfHSViV8g6En4MsnjW2Y6b8D4Lpcufd D7Kg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710338931; x=1710943731; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7L2vUwfipr2gKOB26ZSV+Vf7Bi2o+2MhICmn4R7KPa0=; b=dHspXB1Jdbjo7AqI5D0Z3Twkom+nVGxZY/TPqxWEnPMZLlhBIMAUYM9X4V13Uhzrud jhnT3omzyoEaoyq7d2jTOxwDsahZJP+mfB6KY4xyyNbjO5QVg3U3BYJWAWKi3p7FsD/G oTvAdE3rtXX9Wjhux81tErQw+694Wc8QQh6lHd5fVvId+iY4aLMNfq9JqVPSb3D3Wa5G MTB2UJ2kZauRsRsrECQnjpXpXS7oiObTVRqyX1DjLh3U8NBhAGYgG2qa4gvkLVEbGQeV qWVtz4MEOr9BhQP2pCPDNHk6PrVYwq3yLZbwKHWYt9M7AGdd9qZErg59DvockTZeFS5z hLDQ== X-Forwarded-Encrypted: i=1; AJvYcCXN5d3wSN4r8IlHgqPht7A9V6DkTIdEZQKbcrXbFsnKEWc98O1cOSxoIGdTMgXwAg+vFYfv7CFGHnq8qrHc+RCGCn6Esl17iMdyQjcm X-Gm-Message-State: AOJu0YzhbVU5wwsF38zJmxQqxSflZ/5800WkRs9ordSNv3K8yuYIa/Nt SYrc5RnIUb9dtqMnMxjTdoL5vDC8DI+E6Ut2xBqb/L2diNoNhMSvXz7S35tOO3E= X-Google-Smtp-Source: AGHT+IFuoxBmQfVemyQzXiLcXvQk5/Bj3gVOpZYZDujxntAraTAYvlG61Hp66sCW3jmCCSgQmgCMXA== X-Received: by 2002:a17:906:c784:b0:a46:61ef:2846 with SMTP id cw4-20020a170906c78400b00a4661ef2846mr871027ejb.66.1710338931040; Wed, 13 Mar 2024 07:08:51 -0700 (PDT) Received: from localhost (host-82-56-173-172.retail.telecomitalia.it. [82.56.173.172]) by smtp.gmail.com with ESMTPSA id a21-20020a170906469500b00a4667190a35sm88005ejr.37.2024.03.13.07.08.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Mar 2024 07:08:50 -0700 (PDT) From: Andrea della Porta To: Vinod Koul , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list , Saenz Julienne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dave.stevenson@raspberrypi.com Cc: Phil Elwell , Maxime Ripard , Stefan Wahren , Dom Cobley , Phil Elwell , Andrea della Porta Subject: [PATCH v2 03/15] dmaengine: bcm2835: Add NO_WAIT_RESP, DMA_WIDE_SOURCE and DMA_WIDE_DEST flag Date: Wed, 13 Mar 2024 15:08:28 +0100 Message-ID: X-Mailer: git-send-email 2.44.0 In-Reply-To: References: 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 Content-Type: text/plain; charset="utf-8" From: Phil Elwell Use bit 27 of the dreq value (the second cell of the DT DMA descriptor) to request that the WAIT_RESP bit is not set. Use (reserved) bits 24 and 25 of the dreq value (the second cell of the DT DMA descriptor) to request that wide source reads or wide dest writes are required Originally-by: Dom Cobley Originally-by: Phil Elwell Signed-off-by: Andrea della Porta --- drivers/dma/bcm2835-dma.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c index 3d9973dd041d..69a77caf78cc 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -145,6 +145,21 @@ struct bcm2835_desc { #define BCM2835_DMA_WAIT(x) (((x) & 31) << 21) /* add DMA-wait cycles */ #define BCM2835_DMA_NO_WIDE_BURSTS BIT(26) /* no 2 beat write bursts */ =20 +/* A fake bit to request that the driver doesn't set the WAIT_RESP bit. */ +#define BCM2835_DMA_NO_WAIT_RESP BIT(27) +#define WAIT_RESP(x) (((x) & BCM2835_DMA_NO_WAIT_RESP) ? \ + 0 : BCM2835_DMA_WAIT_RESP) + +/* A fake bit to request that the driver requires wide reads */ +#define BCM2835_DMA_WIDE_SOURCE BIT(24) +#define WIDE_SOURCE(x) (((x) & BCM2835_DMA_WIDE_SOURCE) ? \ + BCM2835_DMA_S_WIDTH : 0) + +/* A fake bit to request that the driver requires wide writes */ +#define BCM2835_DMA_WIDE_DEST BIT(25) +#define WIDE_DEST(x) (((x) & BCM2835_DMA_WIDE_DEST) ? \ + BCM2835_DMA_D_WIDTH : 0) + /* debug register bits */ #define BCM2835_DMA_DEBUG_LAST_NOT_SET_ERR BIT(0) #define BCM2835_DMA_DEBUG_FIFO_ERR BIT(1) @@ -621,8 +636,9 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _dma_memcpy( { struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; - u32 info =3D BCM2835_DMA_D_INC | BCM2835_DMA_S_INC; - u32 extra =3D BCM2835_DMA_INT_EN | BCM2835_DMA_WAIT_RESP; + u32 info =3D BCM2835_DMA_D_INC | BCM2835_DMA_S_INC | + WAIT_RESP(c->dreq) | WIDE_SOURCE(c->dreq) | WIDE_DEST(c->dreq); + u32 extra =3D BCM2835_DMA_INT_EN; size_t max_len =3D bcm2835_dma_max_frame_length(c); size_t frames; =20 @@ -652,7 +668,8 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _slave_sg( struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; dma_addr_t src =3D 0, dst =3D 0; - u32 info =3D BCM2835_DMA_WAIT_RESP; + u32 info =3D WAIT_RESP(c->dreq) | + WIDE_SOURCE(c->dreq) | WIDE_DEST(c->dreq); u32 extra =3D BCM2835_DMA_INT_EN; size_t frames; =20 @@ -704,7 +721,7 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _dma_cyclic( struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; dma_addr_t src, dst; - u32 info =3D BCM2835_DMA_WAIT_RESP; + u32 info =3D WAIT_RESP(c->dreq) | WIDE_SOURCE(c->dreq) | WIDE_DEST(c->dre= q); u32 extra =3D 0; size_t max_len =3D bcm2835_dma_max_frame_length(c); size_t frames; --=20 2.35.3 From nobody Sat Feb 7 23:12:25 2026 Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.44]) (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 67AC047772 for ; Wed, 13 Mar 2024 14:08:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338936; cv=none; b=raPEainJQmjRtx0ArH8Lq7Anp4kAOxqgJfKKeBQYCV2gL1uXfp50UqJrQpuD86nTxB1OMNERumDTv08qLIn0hvULf64U19D1bLlFez9O8iEn7R5m2ufd771CyF98l7m9UrnfCneQ6Z6P4GXFtEJsh5h4jfmelL8ULd+ev98vdwY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338936; c=relaxed/simple; bh=mJw+46Z541uz+efuQnIUyj6yNxXFxaa2MsAksiuK++o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=a7UHngd3PdXVdQ6KbF1CIeqsXqBS0qW9OoV/JVEETzpLFaC+dt2vAwuWeLoaZ8pA4U4b2U7apNVedaGeAre5VuDFu/tDy9vn2MDy/m3woFh8wZDLcyWIPZh4kiwZUXUNKawIb6cVvtAji/omPhdHcpuieaFF8fSL6SUKj9R0WI4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=fF3e3cVY; arc=none smtp.client-ip=209.85.208.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="fF3e3cVY" Received: by mail-ed1-f44.google.com with SMTP id 4fb4d7f45d1cf-568307fe62eso7246413a12.1 for ; Wed, 13 Mar 2024 07:08:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1710338933; x=1710943733; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=I53kioFtQ9+NV3RahDpOPJUiNDTHamWrrm2d7gZ/rPs=; b=fF3e3cVY1Tu1XDBdM+Sqb/7j2yk4JeLRfz9BvbG5RGklo2y/TfQ0WZqczQR0zte0AX ZBF455QUcH+OfFSoBTCYsH8a+FL4CVGh7d3oeBiJcc0pu0+noYXBVHMMm4ity1uQw/m1 3ly0pgVnen51TbUXzOZspC93n3LMPB4kmGEQdQqiVJ2FikCh1Sm10cWxgmm6X59amc5g ke27mhk9eNlfyaVM+39C4xYkY9nMQeMfv5Xr4AX+W8fUzNuinypSeTAU3ZklmOEGQuZr SXmlbEd4SDw/4Nr+3/eA/DgOVnsdVQVU+hdrFmB7TDcfyMV6HQEOQH0fPcdJzgJb+UUy UVfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710338933; x=1710943733; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=I53kioFtQ9+NV3RahDpOPJUiNDTHamWrrm2d7gZ/rPs=; b=j83IsYoq41xIdnD1eXWZNRHZuGyt7RfR82jCFTiKNBTMP6OmmsYjC2L7BiWxtL0dpE eWd6uOGRVVPxnyMDTmbGZl7huZUFgkAQJ30oFys7HTcWUYUw8p3SZ5ZJgmHBAL6pDcP1 yKAMeMh8f6qu7fpsD/bqJxVrygl5N6Fdb5bx9rpDPPQNB1jFG/9x37fZNP84/cVIQTyO ULd4ktAZCGp+y2HB/InW3sYGhdCijFlc/NVivzxObD9VYJAn2ZVumSrMa3RuEo07YivI r6EE/ya9KbZ+RkMIOe7DQPDb7ADMY8cDf81OOsiJ//c1i7AHBB5aXb3JT3t/3n9HaFDm 6S/A== X-Forwarded-Encrypted: i=1; AJvYcCXH5rfl0h71hQWj+HKrgSX02/AaH+gT8rOFSYubD34EaK//uclKml+MZFaAYezuBxKmWBmYW0Ycz5aHMEvfhNzdMJSjR9R2s6qUwzuV X-Gm-Message-State: AOJu0YyyaUHNzqGBI7IwpSOSaO3VtbKGsBEvqe58ZAC1Q5kZnvaS6U0K koVAXPf/WWkoZOpiqilU6EHibxgtm+qCgp71j0ru4kq71T0FjQjRBRuKYYEqEys= X-Google-Smtp-Source: AGHT+IHCQaImo5LItH4gVnqRjfNB/SPNM2IFdvzY8VY0xNFroLrYEX7IIpdpQjosUbug1fHTnON4rw== X-Received: by 2002:a50:9ee2:0:b0:566:131b:5b5f with SMTP id a89-20020a509ee2000000b00566131b5b5fmr8554418edf.26.1710338932962; Wed, 13 Mar 2024 07:08:52 -0700 (PDT) Received: from localhost (host-82-56-173-172.retail.telecomitalia.it. [82.56.173.172]) by smtp.gmail.com with ESMTPSA id co25-20020a0564020c1900b00567f6310010sm5081840edb.59.2024.03.13.07.08.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Mar 2024 07:08:52 -0700 (PDT) From: Andrea della Porta To: Vinod Koul , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list , Saenz Julienne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dave.stevenson@raspberrypi.com Cc: Phil Elwell , Maxime Ripard , Stefan Wahren , Dom Cobley , Andrea della Porta Subject: [PATCH v2 04/15] dmaengine: bcm2835: Support dma flags for multi-beat burst Date: Wed, 13 Mar 2024 15:08:29 +0100 Message-ID: <897f4540ad1268f3a560a48de8667a6327ce6b7f.1710226514.git.andrea.porta@suse.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: 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 Content-Type: text/plain; charset="utf-8" From: Dom Cobley Add a control bit to enable a multi-beat burst on a DMA. This improves DMA performance and is required for HDMI audio. Signed-off-by: Dom Cobley Signed-off-by: Andrea della Porta --- drivers/dma/bcm2835-dma.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c index 69a77caf78cc..d442f8728c05 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -137,6 +137,7 @@ struct bcm2835_desc { #define BCM2835_DMA_S_DREQ BIT(10) /* enable SREQ for source */ #define BCM2835_DMA_S_IGNORE BIT(11) /* ignore source reads - read 0 */ #define BCM2835_DMA_BURST_LENGTH(x) (((x) & 15) << 12) +#define BCM2835_DMA_GET_BURST_LENGTH(x) (((x) >> 12) & 15) #define BCM2835_DMA_CS_FLAGS(x) ((x) & (BCM2835_DMA_PRIORITY(15) | \ BCM2835_DMA_PANIC_PRIORITY(15) | \ BCM2835_DMA_WAIT_FOR_WRITES | \ @@ -160,6 +161,11 @@ struct bcm2835_desc { #define WIDE_DEST(x) (((x) & BCM2835_DMA_WIDE_DEST) ? \ BCM2835_DMA_D_WIDTH : 0) =20 +/* A fake bit to request that the driver requires multi-beat burst */ +#define BCM2835_DMA_BURST BIT(30) +#define BURST_LENGTH(x) (((x) & BCM2835_DMA_BURST) ? \ + BCM2835_DMA_BURST_LENGTH(3) : 0) + /* debug register bits */ #define BCM2835_DMA_DEBUG_LAST_NOT_SET_ERR BIT(0) #define BCM2835_DMA_DEBUG_FIFO_ERR BIT(1) @@ -637,7 +643,8 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _dma_memcpy( struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; u32 info =3D BCM2835_DMA_D_INC | BCM2835_DMA_S_INC | - WAIT_RESP(c->dreq) | WIDE_SOURCE(c->dreq) | WIDE_DEST(c->dreq); + WAIT_RESP(c->dreq) | WIDE_SOURCE(c->dreq) | + WIDE_DEST(c->dreq) | BURST_LENGTH(c->dreq); u32 extra =3D BCM2835_DMA_INT_EN; size_t max_len =3D bcm2835_dma_max_frame_length(c); size_t frames; @@ -668,8 +675,8 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _slave_sg( struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; dma_addr_t src =3D 0, dst =3D 0; - u32 info =3D WAIT_RESP(c->dreq) | - WIDE_SOURCE(c->dreq) | WIDE_DEST(c->dreq); + u32 info =3D WAIT_RESP(c->dreq) | WIDE_SOURCE(c->dreq) | + WIDE_DEST(c->dreq) | BURST_LENGTH(c->dreq); u32 extra =3D BCM2835_DMA_INT_EN; size_t frames; =20 @@ -721,7 +728,8 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _dma_cyclic( struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; dma_addr_t src, dst; - u32 info =3D WAIT_RESP(c->dreq) | WIDE_SOURCE(c->dreq) | WIDE_DEST(c->dre= q); + u32 info =3D WAIT_RESP(c->dreq) | WIDE_SOURCE(c->dreq) | + WIDE_DEST(c->dreq) | BURST_LENGTH(c->dreq); u32 extra =3D 0; size_t max_len =3D bcm2835_dma_max_frame_length(c); size_t frames; --=20 2.35.3 From nobody Sat Feb 7 23:12:25 2026 Received: from mail-ej1-f54.google.com (mail-ej1-f54.google.com [209.85.218.54]) (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 B777E47A73 for ; Wed, 13 Mar 2024 14:08:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338937; cv=none; b=b05wkq6CbqxuTuGl38xtmGVZWkTC9V7xzocWqPv15TfoBaLrmHBdrf6V46W3t6JRMsX9YVeWquOuKlPUFRzLg7T3+sOVZQePoq1+B5+eX9oP+bAT4mqjB1uoBcT2GiNojWkMpfUEbEnaZY5pFr4dyohqvNNaD6P/knK3BDEQTfU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338937; c=relaxed/simple; bh=Ynq2F2bMfhoLu2FW/bFjh5jnZcIj/QLxPgEvfGRr8J8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AmR1xJLHHnJN88c/boFMYsMtFAzRaxUIpkPSDF72zqcxzGXOOIlG4Vdm1vzFrm6UEvytoSAT3fdaNitOehOf8u+VMDPSNmG9C3T1b4Qa0Or6+SzjFfTNJqpbNLHozR8opS5AKc5KLCZCufn3vZtBv2Tnl/6Ty6InuteGC6jgMx8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=II4BFqX6; arc=none smtp.client-ip=209.85.218.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="II4BFqX6" Received: by mail-ej1-f54.google.com with SMTP id a640c23a62f3a-a4429c556efso594533066b.0 for ; Wed, 13 Mar 2024 07:08:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1710338934; x=1710943734; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Cdk6dXpjlqfTsKeP/epQp+Lh/qATka/VT0PX0aJnoDc=; b=II4BFqX6+9qRW3LXpSuY8OgyNOWSMxaskfDkKvhoUsHAoz4c9fhNL9ZfTJHSP30mIU /wjYWHsuNYpUFNnJZxwYb78t1u7gZwItTnIx+tZTlx9xQdyMfRd6JAihjFfvTe19Cj1E Qr40/QcJsEKxTZWh3rgcQKwSZ8Hug0ie9EVKrrTFVkDMLS85Pykf/BKaXIu6dbVvtJ27 U/cL/2fAn0BCwG0ez5rf6MD4YM8dhXWnQw8GUhFo0z+v8MYt8vBzQfUnm8Rae1gmUxwy qtI1Sj9Q6NMqrsVloXTA2HJzFvgiJoEPJYOe6jXnRFSaQCTH0gpMClQmt8aF8Fw+UTCG +pyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710338934; x=1710943734; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Cdk6dXpjlqfTsKeP/epQp+Lh/qATka/VT0PX0aJnoDc=; b=CGROC8qkLlIxIPppp88XGoa4SzamVQKZloKEmvRlzHdv4rtcc5vUpb4LOZcRe7Jwdr I7e5XD85quhw5cC2wwzj56tQkFuEDVprqhcvfi4+B0zv7bRdiQDXz4cvHvTYez6rGGeA SFuyJZ4mtMsZNKPxks/wF2ng1LOHF894RSiZ84MQbGmueKCyijvydnPTvOk0eEB7sBTJ 9mn9l3zBKdzC54Mk/U9C64MkGKN1+HkaMwveQk0TnNwPedYXh4G54N+uahe9kJeZIAwx nF9+8fdgmZ/fqvmJ/reIiSe142CYzUcb+G4RGKdPKXeARO4lQdgIiuWdmKUNPNpDJjsh jy9g== X-Forwarded-Encrypted: i=1; AJvYcCWF+ALFIqzwj8zLrk/qVZLCIdozMTduLNz2t4UlOVh3VHp7gDcenDp+Iw75y4rQD1rMvbpk+8JnLhA4siXSlU4Xoaw7h8BkncJWvDl+ X-Gm-Message-State: AOJu0YxWpUkEwA+JTZYNmP6qYOd1lLAecdeUXj9PKWswoK+Z1kDni8Bs 9C4jwm4zt9emPyrzT44IAN4+oNZZ3WWCmvvj+Yk0jHbXQYZgF54kEiGaHBlgPzQ= X-Google-Smtp-Source: AGHT+IGTRwgng8S9k6d0RlgfwcavmOY9mY6e0rpOTny7I0uyb3DtRPz/SPE6JA7TCCokGu/curyFDg== X-Received: by 2002:a17:906:40d4:b0:a46:63af:b1aa with SMTP id a20-20020a17090640d400b00a4663afb1aamr700791ejk.55.1710338934158; Wed, 13 Mar 2024 07:08:54 -0700 (PDT) Received: from localhost (host-82-56-173-172.retail.telecomitalia.it. [82.56.173.172]) by smtp.gmail.com with ESMTPSA id ku16-20020a170907789000b00a4655513f0bsm730365ejc.88.2024.03.13.07.08.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Mar 2024 07:08:53 -0700 (PDT) From: Andrea della Porta To: Vinod Koul , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list , Saenz Julienne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dave.stevenson@raspberrypi.com Cc: Phil Elwell , Maxime Ripard , Stefan Wahren , Dom Cobley , Andrea della Porta Subject: [PATCH v2 05/15] dmaengine: bcm2835: Fixes for dma_abort Date: Wed, 13 Mar 2024 15:08:30 +0100 Message-ID: X-Mailer: git-send-email 2.44.0 In-Reply-To: References: 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 Content-Type: text/plain; charset="utf-8" From: Dom Cobley There is a problem with the current abort scheme when dma is blocked on a DREQ which prevents halting. This is triggered by SPI driver which aborts dma in this state and so leads to a halt timeout. We attempt to abort the channel, which will work if there is no blocked DREQ. It it times out, we can assume there is no AXI transfer in progress and reset anyway. The length of the timeout is observed at ~20us. Signed-off-by: Dom Cobley Signed-off-by: Andrea della Porta --- drivers/dma/bcm2835-dma.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c index d442f8728c05..6b8e7461efaf 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -435,7 +435,7 @@ static void bcm2835_dma_fill_cb_chain_with_sg( static void bcm2835_dma_abort(struct bcm2835_chan *c) { void __iomem *chan_base =3D c->chan_base; - long timeout =3D 10000; + long timeout =3D 100; =20 /* * A zero control block address means the channel is idle. @@ -444,19 +444,33 @@ static void bcm2835_dma_abort(struct bcm2835_chan *c) if (!readl(chan_base + BCM2835_DMA_ADDR)) return; =20 - /* Write 0 to the active bit - Pause the DMA */ - writel(0, chan_base + BCM2835_DMA_CS); + /* We need to clear the next DMA block pending */ + writel(0, chan_base + BCM2835_DMA_NEXTCB); + + /* Abort the DMA, which needs to be enabled to complete */ + writel(readl(chan_base + BCM2835_DMA_CS) | BCM2835_DMA_ABORT | BCM2835_DM= A_ACTIVE, + chan_base + BCM2835_DMA_CS); =20 - /* Wait for any current AXI transfer to complete */ - while ((readl(chan_base + BCM2835_DMA_CS) & - BCM2835_DMA_WAITING_FOR_WRITES) && --timeout) + /* wait for DMA to be aborted */ + while ((readl(chan_base + BCM2835_DMA_CS) & BCM2835_DMA_ABORT) && --timeo= ut) cpu_relax(); =20 - /* Peripheral might be stuck and fail to signal AXI write responses */ - if (!timeout) + /* Write 0 to the active bit - Pause the DMA */ + writel(readl(chan_base + BCM2835_DMA_CS) & ~BCM2835_DMA_ACTIVE, + chan_base + BCM2835_DMA_CS); + + /* + * Peripheral might be stuck and fail to complete + * This is expected when dreqs are enabled but not asserted + * so only report error in non dreq case + */ + if (!timeout && !(readl(chan_base + BCM2835_DMA_TI) & + (BCM2835_DMA_S_DREQ | BCM2835_DMA_D_DREQ))) dev_err(c->vc.chan.device->dev, - "failed to complete outstanding writes\n"); + "failed to complete pause on dma %d (CS:%08x)\n", c->ch, + readl(chan_base + BCM2835_DMA_CS)); =20 + /* Set CS back to default state and reset the DMA */ writel(BCM2835_DMA_RESET, chan_base + BCM2835_DMA_CS); } =20 --=20 2.35.3 From nobody Sat Feb 7 23:12:25 2026 Received: from mail-ed1-f45.google.com (mail-ed1-f45.google.com [209.85.208.45]) (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 6C253482DA for ; Wed, 13 Mar 2024 14:08:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338939; cv=none; b=jE1h3eHlIxuwxogVtmtKnoDklbe8/gF3J/uJsxdBJbAf9JdFrKkCv57bhmy/4YrlSsgI5n+J4nRQzgjCz2gEGsv4cHj+BZNsIQyT2z/6M67Rlbtjg/GSUNiYTsjR2SaKdc40As2eDrGFCshEwfKDCEo5DpezW0YSlmMOfrRqzvM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338939; c=relaxed/simple; bh=xti/oKwQScDc9qv8BINO2ll3pJ6JN65BhusLnK1Mk28=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DSpM0RiTZP/gM4PV1FWn1+nmznd6uobAyBakN6CCVSb60JGCy/Q8OVO6pb2BBjec/iQxF7NTzI30qnUHy7NBYmVK+m+HgxmT5mZLUuEesqurJ1Y+ipOGg/rLgnRRSv1vnYycXdHtLHhvbUpEOsUmGUuNcKFKNg2xWE9MF5YbDIo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=ObjMiWsP; arc=none smtp.client-ip=209.85.208.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="ObjMiWsP" Received: by mail-ed1-f45.google.com with SMTP id 4fb4d7f45d1cf-563bb51c36eso7905948a12.2 for ; Wed, 13 Mar 2024 07:08:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1710338936; x=1710943736; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=sxhFutbq+Y+6CXRWNL6/WkO0dcfzVUrgph3wJP5gbgo=; b=ObjMiWsPaucYxmbdOMzrpFDWzzoqeFdz1nl8qMn0KCwwZ8AFyg6ncUmYmzNV1IUnoA YnO9ni+W1BdgbXVTSW2XUBGrUMAqwj8SnY3ta2IgEBtPfgP8JHrbuK2uMiNj/yXBLNwA GgtMPVtzrHL/2kLsMYXwdUeKddxxqjkwVvbWap5zeZv3I4IwBjXUQ+Qr0QizrbD/YiJO jtZMomOESuwR/ZYrUG+IJdALR+t8DkV9ezds3j6MlCtjkmwPvls3o0QAWsfXoju3VZNi SsTl6upO+BVLAKsxmmGEGSXs5h5ln47zNqnZIOwnKqAL/aDO6zoSzuKiwYYJKwuU0LHG xsrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710338936; x=1710943736; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=sxhFutbq+Y+6CXRWNL6/WkO0dcfzVUrgph3wJP5gbgo=; b=l6KdexGxKYO9jcphO9IvKqklPYMbtfhY8j+/H5nQolGIxp+Tf5mHJpS2cUMtMl13Tj PXpAveNen2g0IlcuhUkl1ObSb3pPoN7w01RVmIo8PIfjqcrAMZ7k8asvJnvQ3S7ViE28 qYgBUtveIq8WSbCjM7ZBZbjiceJB8ywWeX87HIXSybQ2nuj6y9dMkfZ7B/JGvvZ25HLK qcT9zF5gyJ3AIllQ7ZuGC0qZakL0Pz0riivekpnnWguDlsLs+wVm7dqcIygbuNNpI+nI jboOKsiezBa8h6fMMquyemg6B+R06GG1HGJwy2TZMFn7uC9Oq0ZWu8Y9h2qhJCLYm7F9 CS4A== X-Forwarded-Encrypted: i=1; AJvYcCUxQ5T5LgrDRm6FylGhEQSOu7Ezfp/KoGbHeF8MPaM0CkMD+y30wTzkB+Nh5GTnMKv4viRQOslYmqVR3I0G7uQbJEeU0qhzZjIHhMCj X-Gm-Message-State: AOJu0YwoHH+SQ+ppC0n5a3ip48NDirMfPOSKWbOA4yj/7kaBwuv8HpQo F8716s8848sxb9TWUeQ9vpKbDCwJ0vz3VegGTqgyAsCeQRQaAbJSBTgPCWxED6E= X-Google-Smtp-Source: AGHT+IHGhXmShKjT2bgraHVp5n3iw9VUmNLl0npsFuV9YOWwmAyXpR7Lt4bTH+kxGpjAq2xtbLLcbw== X-Received: by 2002:a17:906:55cf:b0:a46:5fd2:f26a with SMTP id z15-20020a17090655cf00b00a465fd2f26amr1116133ejp.65.1710338935915; Wed, 13 Mar 2024 07:08:55 -0700 (PDT) Received: from localhost (host-82-56-173-172.retail.telecomitalia.it. [82.56.173.172]) by smtp.gmail.com with ESMTPSA id ku2-20020a170907788200b00a44936527b5sm4907081ejc.99.2024.03.13.07.08.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Mar 2024 07:08:55 -0700 (PDT) From: Andrea della Porta To: Vinod Koul , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list , Saenz Julienne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dave.stevenson@raspberrypi.com Cc: Phil Elwell , Maxime Ripard , Stefan Wahren , Dom Cobley , Andrea della Porta Subject: [PATCH v2 06/15] dmaengine: bcm2835: Support common dma-channel-mask Date: Wed, 13 Mar 2024 15:08:31 +0100 Message-ID: <33415530388855ba8964c1f32dd126cb173e191d.1710226514.git.andrea.porta@suse.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: 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 Content-Type: text/plain; charset="utf-8" Nowadays there is a generic property for dma-channel-mask in the DMA controller binding. So prefer this one instead of the old vendor specific one. Print a warning in case the old one is used. Btw use the result of of_property_read_u32() as return code in error case. Signed-off-by: Stefan Wahren Signed-off-by: Andrea della Porta --- drivers/dma/bcm2835-dma.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c index 6b8e7461efaf..88aaf7769864 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -986,12 +986,19 @@ static int bcm2835_dma_probe(struct platform_device *= pdev) } =20 /* Request DMA channel mask from device tree */ - if (of_property_read_u32(pdev->dev.of_node, - "brcm,dma-channel-mask", - &chans_available)) { - dev_err(&pdev->dev, "Failed to get channel mask\n"); - rc =3D -EINVAL; - goto err_no_dma; + rc =3D of_property_read_u32(pdev->dev.of_node, "dma-channel-mask", + &chans_available); + + if (rc) { + /* Try deprecated property */ + if (of_property_read_u32(pdev->dev.of_node, + "brcm,dma-channel-mask", + &chans_available)) { + dev_err(&pdev->dev, "Failed to get channel mask\n"); + goto err_no_dma; + } + + dev_warn(&pdev->dev, "Please update DT blob\n"); } =20 /* get irqs for each channel that we support */ --=20 2.35.3 From nobody Sat Feb 7 23:12:25 2026 Received: from mail-ej1-f46.google.com (mail-ej1-f46.google.com [209.85.218.46]) (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 2B17B4AEFD for ; Wed, 13 Mar 2024 14:08:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338941; cv=none; b=jvOW3km5TINZS+1vPkWXQjrgIvHQYxHt43fH1nFWje7HLR9sXvY3IFPf3JLjZccVcaK1veprqEstYHNmP7eblNMey9Mk0dxLsBiY4aBzDaoGmgaP/VMTHv3A+pOoW2XdiJ6CevrTKtiXwtjhWmiY7x5OsRNN3gJ4ouJJc+FqG64= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338941; c=relaxed/simple; bh=Q1WIk6CPB8+nC5PxADAz/f8d11T7ZlVqHzr3q9+xO00=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gm9lCNd1JpepsVcTKRpoTeQe5X8PskD9q+LzF3aSM2sWvcrU1IUBSy3eQHexXw7dZpWlZulJeq6U+w9soxcmJaQUqwuRL6LdgGS0055SlTjb+so95YzEkiTlseyTb6w6LHeRrkxSQhpfN0p3dSM/K278LjEqMPWZKPM5X74PDjY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=eJ6yNPuH; arc=none smtp.client-ip=209.85.218.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="eJ6yNPuH" Received: by mail-ej1-f46.google.com with SMTP id a640c23a62f3a-a44f2d894b7so140304166b.1 for ; Wed, 13 Mar 2024 07:08:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1710338937; x=1710943737; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=3F4XzmOcl2eqQO65zKyWh9Neo+d3tuBvcb7/Ztq+tSY=; b=eJ6yNPuHNnWgZvjI2kfaGwKTrkeohWo2z1XUchPP0f+A3fGLiceAdsu2AwPBgXp7Wt TMeAlW+E9bEnETEu3Wqgq8x6CxexelTv5ru14h6soOWIbwfhn1V0Nu93JiHgOGBFzbmR SHK7CXByXVXFxrnS3vwXLc3TWLHo8UAZzCGMJVN7dAAt8PsAoQ/j5UxMy2gSIRdN8vix USt+TVN1JuWfr9uKd+IHCgKlbz6+3EQeRs6ym4xfJDnk36cue0/Sa4H/X8Jz3VmsTRfu y7Zvgo/4NBtrqAK/Si8Ettjj3EUC4q2tp7UaU8pkudM/OboAxBxIRDOot3OGHnLhvPf2 e7jQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710338937; x=1710943737; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=3F4XzmOcl2eqQO65zKyWh9Neo+d3tuBvcb7/Ztq+tSY=; b=THChAC39MmAlS/Dqv0uSayChC2ny/EmWzykqndqFT6irTNIYVqm1ybkW2zwCDPJtEr d0eMDffWk2tlTloC26z8MkoEGjKFJmymwfspsj9LCApglMBtzIvtVmw+ZsfCjKQCfbGf s/+dZJmoOFWxlm0d35yVRTMqcsg7HscyuFIQpY1cCY0leWii89S42M5qzAZgWKekBBIO e9c9HbHkF3CVBIpTpIZ9cG7eN0nKmR3dP6LjwA+4UvP/xXCMeoFFlwfXAkYzx2y1jtb2 8hQN/fJ8P7fYuqyONw93Fv4V4s7oqQG6Litw6kLgpPeuTh+FPfFDDZm2t6qLNxCzgJKP yJow== X-Forwarded-Encrypted: i=1; AJvYcCXCIBJ0ePM2gzv6W4d6xlqv1VjFvZHM4GoglJBpCClB/7MDdWpOW55HuJddv85HqVHXErTk49M1Fs+fMucTSky/Luk97JRAcJ+m6vhy X-Gm-Message-State: AOJu0YxS6Z4DC2N6n7IQYmwGoxEszeddf6DDuCIUlCi4D+y1C4w/OjLj yzJkEpmcHhujpYq0C6sg77MywZPRzK13pEzxu3FklBWWQeBIWyTl2N2i/VTbFKQ= X-Google-Smtp-Source: AGHT+IE8tL/2CfRwwCWl2jMt8A+KoeR6AlHoKDrFlsgIUe1IIcy432WK1cZ7EUwNcepsH6VYKsKJTQ== X-Received: by 2002:a17:907:94c1:b0:a46:181f:c1c3 with SMTP id dn1-20020a17090794c100b00a46181fc1c3mr5229336ejc.70.1710338937681; Wed, 13 Mar 2024 07:08:57 -0700 (PDT) Received: from localhost (host-82-56-173-172.retail.telecomitalia.it. [82.56.173.172]) by smtp.gmail.com with ESMTPSA id le13-20020a170906ae0d00b00a461d26713fsm3587962ejb.103.2024.03.13.07.08.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Mar 2024 07:08:57 -0700 (PDT) From: Andrea della Porta To: Vinod Koul , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list , Saenz Julienne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dave.stevenson@raspberrypi.com Cc: Phil Elwell , Maxime Ripard , Stefan Wahren , Dom Cobley , Andrea della Porta Subject: [PATCH v2 07/15] dmaengine: bcm2835: move CB info generation into separate function Date: Wed, 13 Mar 2024 15:08:32 +0100 Message-ID: <1336c1bc9d7076080f101e530068030640aff8e5.1710226514.git.andrea.porta@suse.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: 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 Content-Type: text/plain; charset="utf-8" Actually the generation of the Control Block info follows some simple rules. So handle this with a separate function to avoid open coding for every DMA operation. Another advantage is that we can easier introduce other platforms with different info bits. Signed-off-by: Stefan Wahren Signed-off-by: Andrea della Porta --- drivers/dma/bcm2835-dma.c | 54 +++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c index 88aaf7769864..c651aca363c2 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -226,6 +226,34 @@ static inline struct bcm2835_desc *to_bcm2835_dma_desc( return container_of(t, struct bcm2835_desc, vd.tx); } =20 +static u32 bcm2835_dma_prepare_cb_info(struct bcm2835_chan *c, + enum dma_transfer_direction direction, + bool zero_page) +{ + u32 result =3D WAIT_RESP(c->dreq) | WIDE_SOURCE(c->dreq) | + WIDE_DEST(c->dreq) | BURST_LENGTH(c->dreq); + + if (direction =3D=3D DMA_MEM_TO_MEM) + return result | BCM2835_DMA_D_INC | BCM2835_DMA_S_INC; + + /* Setup DREQ channel */ + if (c->dreq !=3D 0) + result |=3D BCM2835_DMA_PER_MAP(c->dreq); + + if (direction =3D=3D DMA_DEV_TO_MEM) { + result |=3D BCM2835_DMA_S_DREQ | BCM2835_DMA_D_INC; + } else { + result |=3D BCM2835_DMA_D_DREQ | BCM2835_DMA_S_INC; + + /* non-lite channels can write zeroes w/o accessing memory */ + if (zero_page && !c->is_lite_channel) { + result |=3D BCM2835_DMA_S_IGNORE; + } + } + + return result; +} + static void bcm2835_dma_free_cb_chain(struct bcm2835_desc *desc) { size_t i; @@ -656,9 +684,7 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _dma_memcpy( { struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; - u32 info =3D BCM2835_DMA_D_INC | BCM2835_DMA_S_INC | - WAIT_RESP(c->dreq) | WIDE_SOURCE(c->dreq) | - WIDE_DEST(c->dreq) | BURST_LENGTH(c->dreq); + u32 info =3D bcm2835_dma_prepare_cb_info(c, DMA_MEM_TO_MEM, false); u32 extra =3D BCM2835_DMA_INT_EN; size_t max_len =3D bcm2835_dma_max_frame_length(c); size_t frames; @@ -689,8 +715,7 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _slave_sg( struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; dma_addr_t src =3D 0, dst =3D 0; - u32 info =3D WAIT_RESP(c->dreq) | WIDE_SOURCE(c->dreq) | - WIDE_DEST(c->dreq) | BURST_LENGTH(c->dreq); + u32 info =3D bcm2835_dma_prepare_cb_info(c, direction, false); u32 extra =3D BCM2835_DMA_INT_EN; size_t frames; =20 @@ -700,19 +725,14 @@ static struct dma_async_tx_descriptor *bcm2835_dma_pr= ep_slave_sg( return NULL; } =20 - if (c->dreq !=3D 0) - info |=3D BCM2835_DMA_PER_MAP(c->dreq); - if (direction =3D=3D DMA_DEV_TO_MEM) { if (c->cfg.src_addr_width !=3D DMA_SLAVE_BUSWIDTH_4_BYTES) return NULL; src =3D c->cfg.src_addr; - info |=3D BCM2835_DMA_S_DREQ | BCM2835_DMA_D_INC; } else { if (c->cfg.dst_addr_width !=3D DMA_SLAVE_BUSWIDTH_4_BYTES) return NULL; dst =3D c->cfg.dst_addr; - info |=3D BCM2835_DMA_D_DREQ | BCM2835_DMA_S_INC; } =20 /* count frames in sg list */ @@ -742,8 +762,8 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _dma_cyclic( struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; dma_addr_t src, dst; - u32 info =3D WAIT_RESP(c->dreq) | WIDE_SOURCE(c->dreq) | - WIDE_DEST(c->dreq) | BURST_LENGTH(c->dreq); + u32 info =3D bcm2835_dma_prepare_cb_info(c, direction, + buf_addr =3D=3D od->zero_page); u32 extra =3D 0; size_t max_len =3D bcm2835_dma_max_frame_length(c); size_t frames; @@ -774,26 +794,16 @@ static struct dma_async_tx_descriptor *bcm2835_dma_pr= ep_dma_cyclic( "%s: buffer_length (%zd) is not a multiple of period_len (%zd)\n", __func__, buf_len, period_len); =20 - /* Setup DREQ channel */ - if (c->dreq !=3D 0) - info |=3D BCM2835_DMA_PER_MAP(c->dreq); - if (direction =3D=3D DMA_DEV_TO_MEM) { if (c->cfg.src_addr_width !=3D DMA_SLAVE_BUSWIDTH_4_BYTES) return NULL; src =3D c->cfg.src_addr; dst =3D buf_addr; - info |=3D BCM2835_DMA_S_DREQ | BCM2835_DMA_D_INC; } else { if (c->cfg.dst_addr_width !=3D DMA_SLAVE_BUSWIDTH_4_BYTES) return NULL; dst =3D c->cfg.dst_addr; src =3D buf_addr; - info |=3D BCM2835_DMA_D_DREQ | BCM2835_DMA_S_INC; - - /* non-lite channels can write zeroes w/o accessing memory */ - if (buf_addr =3D=3D od->zero_page && !c->is_lite_channel) - info |=3D BCM2835_DMA_S_IGNORE; } =20 /* calculate number of frames */ --=20 2.35.3 From nobody Sat Feb 7 23:12:25 2026 Received: from mail-lj1-f175.google.com (mail-lj1-f175.google.com [209.85.208.175]) (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 9EE054CDE0 for ; Wed, 13 Mar 2024 14:09:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338942; cv=none; b=Meky1OTzHUldMd3jOjZ4azDY/IzEF2Ih/DyfwXzsOIro8tx11Gee8pjmTP06ScUzLz1zDfx6pKsHx2h4p2XQfMpLFkL2MwTwx5/DScCfI1iDF+4bnrCsWVdCmqNzbHixxPasd7w5mpV90HaQH9+/UdzLRgPZdbNJJ7M9kmAFHK8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338942; c=relaxed/simple; bh=4andNj366bp0pW3FwTiCNyJleT43bWmvqce9qbK9mVQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=m5mSswbqjxno8DFEfyLgu1mz3i/YNSglbseAaZqidzKuQj21yBlrnbQ+5d0dhurWk3y/TkHQp3C6ID0oWPHJ0j49XQfM+4jReJnmCu4e092G0ORQ0GtuhCR5uUNXzohK1zH/dCs69t5ItwXdWT/r2KU+2SQB6ERm1VLew4e+vrQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=fKI9P0R6; arc=none smtp.client-ip=209.85.208.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="fKI9P0R6" Received: by mail-lj1-f175.google.com with SMTP id 38308e7fff4ca-2d4360ab3daso51737481fa.3 for ; Wed, 13 Mar 2024 07:09:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1710338939; x=1710943739; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/xE94iw3mEagAF+/7KUdjRC+1ga8rdDd3hiFvVOScHQ=; b=fKI9P0R6HbzhTRBfyWlx5THtNo7ELRPAK/a88LLFRYZmsfEDx2PUiatvESQw5U7H+P yyNSmvR7L14DcuLoqNxh51YH4yAShqmcgRFn7bkZlx1QrD0xJIphGLo075pZPMHRmJHJ UVUKyFGV4YFTX3tzRw3b6D6ABxQhYotEdNGmhXXM+FcQMsFABaeBH6vCRr+WduZ+jkKU JNhtN8u9xYle5GxScd2MJwZmv+md15fsts636/J1g7pCgkSHOz1YAgmt8GJpOMxvUTfE tZEFlPi1qGaNdmBk5k12DVb8GPEEtW8BMDZuXaD119bAMd9ZpioO2gpXhNQEY5ryAXl8 BVZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710338939; x=1710943739; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/xE94iw3mEagAF+/7KUdjRC+1ga8rdDd3hiFvVOScHQ=; b=FVppcOHOhSod3cdK8dakjo3YMU1wMHRdlRahXRAWls7q92X0y/KY3g/HlZ1fB33ioX DANzhpQJefs+cSUWpuXp1TE+TKXg06VvLgv43dU57auWIb3uw1a0iycukX3ZyHcFOlvv KUHq1Is8+8MvPbtqpfb0C83Kf+4gQpwwnFG223LDZZZwek4+Ga9BTVyjX3TEkL4t1mEw HMpptPyBWzlF5VGLou8wiA8PefYEvkeKmK+HY7QjWVs3LifWSXAa5624KbeKHxNrCUKg QOC+N/w+LUgrldwqYaOFwS59yDUsziYWgz7KNEmEQKLXU3fLyJrSVDicdhKtuUqOEF6o pAkw== X-Forwarded-Encrypted: i=1; AJvYcCX0/oPmupZMo3B4R4I/1JbG/Z109Tl0UHqrsXgytCzWUIATmXDTQNgr16LUC6EvGGMV+hpEoM1gXjvQ2mkQ+uWzz1PUK5cPHE75tBWL X-Gm-Message-State: AOJu0Yz/GBk/aGSSKf0CV2IMmTI9F5NC/1uwsqjS77HgDC7oRoju305B XvWASbruWGkSGfrvHVrnq0YYNfDPCN68tZ183sjSJSvF7sYnc11/FNmicwr5LaM= X-Google-Smtp-Source: AGHT+IGXCM0cKznBWGqJ434M1t+ZyGCueMZWhnfsJta91SqnLtQTo1W4zmpjpEXIYq8BRQy0a3lQ5w== X-Received: by 2002:a05:651c:222b:b0:2d2:751f:abb2 with SMTP id y43-20020a05651c222b00b002d2751fabb2mr4008668ljq.3.1710338938746; Wed, 13 Mar 2024 07:08:58 -0700 (PDT) Received: from localhost (host-82-56-173-172.retail.telecomitalia.it. [82.56.173.172]) by smtp.gmail.com with ESMTPSA id ck14-20020a0564021c0e00b0056857c89045sm3228556edb.60.2024.03.13.07.08.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Mar 2024 07:08:58 -0700 (PDT) From: Andrea della Porta To: Vinod Koul , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list , Saenz Julienne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dave.stevenson@raspberrypi.com Cc: Phil Elwell , Maxime Ripard , Stefan Wahren , Dom Cobley , Andrea della Porta Subject: [PATCH v2 08/15] dmaengine: bcm2835: move CB final extra info generation into function Date: Wed, 13 Mar 2024 15:08:33 +0100 Message-ID: X-Mailer: git-send-email 2.44.0 In-Reply-To: References: 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 Content-Type: text/plain; charset="utf-8" Similar to the info generation, generate the final extra info with a separate function. This is necessary to introduce other platforms with different info bits. Signed-off-by: Stefan Wahren Signed-off-by: Andrea della Porta --- drivers/dma/bcm2835-dma.c | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c index c651aca363c2..b633c40142fe 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -254,6 +254,26 @@ static u32 bcm2835_dma_prepare_cb_info(struct bcm2835_= chan *c, return result; } =20 +static u32 bcm2835_dma_prepare_cb_extra(struct bcm2835_chan *c, + enum dma_transfer_direction direction, + bool cyclic, bool final, + unsigned long flags) +{ + u32 result =3D 0; + + if (cyclic) { + if (flags & DMA_PREP_INTERRUPT) + result |=3D BCM2835_DMA_INT_EN; + } else { + if (!final) + return 0; + + result |=3D BCM2835_DMA_INT_EN; + } + + return result; +} + static void bcm2835_dma_free_cb_chain(struct bcm2835_desc *desc) { size_t i; @@ -685,7 +705,8 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _dma_memcpy( struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; u32 info =3D bcm2835_dma_prepare_cb_info(c, DMA_MEM_TO_MEM, false); - u32 extra =3D BCM2835_DMA_INT_EN; + u32 extra =3D bcm2835_dma_prepare_cb_extra(c, DMA_MEM_TO_MEM, false, + true, 0); size_t max_len =3D bcm2835_dma_max_frame_length(c); size_t frames; =20 @@ -716,7 +737,7 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _slave_sg( struct bcm2835_desc *d; dma_addr_t src =3D 0, dst =3D 0; u32 info =3D bcm2835_dma_prepare_cb_info(c, direction, false); - u32 extra =3D BCM2835_DMA_INT_EN; + u32 extra =3D bcm2835_dma_prepare_cb_extra(c, direction, false, true, 0); size_t frames; =20 if (!is_slave_direction(direction)) { @@ -764,7 +785,7 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _dma_cyclic( dma_addr_t src, dst; u32 info =3D bcm2835_dma_prepare_cb_info(c, direction, buf_addr =3D=3D od->zero_page); - u32 extra =3D 0; + u32 extra =3D bcm2835_dma_prepare_cb_extra(c, direction, true, true, 0); size_t max_len =3D bcm2835_dma_max_frame_length(c); size_t frames; =20 @@ -780,9 +801,7 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _dma_cyclic( return NULL; } =20 - if (flags & DMA_PREP_INTERRUPT) - extra |=3D BCM2835_DMA_INT_EN; - else + if (!(flags & DMA_PREP_INTERRUPT)) period_len =3D buf_len; =20 /* --=20 2.35.3 From nobody Sat Feb 7 23:12:25 2026 Received: from mail-ej1-f45.google.com (mail-ej1-f45.google.com [209.85.218.45]) (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 6F2524D134 for ; Wed, 13 Mar 2024 14:09:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338943; cv=none; b=G3btPkfVtnbV+3zHGfWHbBKukHnTHtr9nnk8clDxt0ouSgkxy1na2587+uPSzb984TbaxxiTLppENIRAqvrIEUq829IGLazomFum/ekX1928FEAhFc5fvzccG2vX8tKN/tsAk3kGrXAu9BkKykvbhiLS1znsqYeoVlsG7k23X7c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338943; c=relaxed/simple; bh=cxjZSR8LRDYJ/W/QF37SUMynPidomrXSkI+hkRn0XJk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dfFP5MB21SH6XrgymHq4oXHv2hBOZgqItVDb2AQ1jNyNYzKF7MqueVi8zphc7Gtr3NEtDfhNe1aEBZNXgd8MrHnwT0D1rK8VBL6e0ApN2Xgv58fMLs46Na0f00UHaMKk/tto1xf6zwHU8KvapCHPHdkJnLW05/EzCPdgAGmtKS0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=CPdAylgc; arc=none smtp.client-ip=209.85.218.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="CPdAylgc" Received: by mail-ej1-f45.google.com with SMTP id a640c23a62f3a-a45c006ab82so145160966b.3 for ; Wed, 13 Mar 2024 07:09:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1710338940; x=1710943740; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2aA326qloufGfA/9FJeIrf9CjXOtqN0+M89y+6rWqCo=; b=CPdAylgchuHZicfW3zJDNEgvIO3Z4iq+PaefWzT5AfmAnMWOP70oHgXi8J2rSqC6Xy LOkp22dpQhEmSCs0Dl+CYVZWQ2NHMIHZbJT8TsH7pEFIWR2ixgTO2bk1eKe6fMeYu/2i TIi+sAocolWuiVLCVD86rvJKm+ZxWtyiGNq2oTyxIqH/yo2vMI4rY5GsFzTLtbkWIsfd fS72wQGVgv7Pbk2As6TEf2+XPZvElAtSggs+vxXc1oHFzG9azCwBLbOzorc7vd5g3aVh GaQiC98UCZ4wwXnjopvQaKJ/8jc9Wif3eUsXu35u7vROZzfQCsUDoQ1n6BLWs6Nv6hC9 dqVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710338940; x=1710943740; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2aA326qloufGfA/9FJeIrf9CjXOtqN0+M89y+6rWqCo=; b=rcHBPEkn8TW9GZu6qcoE4qFjeUM/p8dUUHu5DFva1sBCnPNykkFUdSQMm4i4HPgpBi ULyIaN9IIozudASVf/H7xXtK9lUqCcqoNxoxsnli5OI+W57W/QCaj2niBBW84Ow/4RUU yaBa8pCl3ZZZLyWyPpgr6zRQQ9VZTbVp8t6nazumd0ve57IZMomAjGEPTWp97ax40e5R acckyBNodAhbEDjajTdgjpNthr/JjCoWiK4KkzTvBj4tAPlT6dFWHptEHhsm0AB97QGX 7DSUFontIqevFrGHX2VfJSZGeg55WvDdN72PRhsnZoVBJH6hulA3zEsBwyEtxb7nDdT2 /xNQ== X-Forwarded-Encrypted: i=1; AJvYcCXBQsV30uNshaR01PpK8OUmaUCL+FMOHeYX/MI5JxnAtRI/l9BMBFgq04syTPogO1eDsXq7t5CFZ/pVWJLhwLINOTUp6XHokTgy0Wu8 X-Gm-Message-State: AOJu0Ywu+BRxC11oVm4KWq6G49MdyJyNXutZc/U9Da+ld8xgtTctqjZJ 0dEXhA5e+CNBRTsb2HpNjJ4faVRzXf8e0uPchQpHlmSO+7499YtSTPTU2tBKK7U= X-Google-Smtp-Source: AGHT+IEctktss/OIn1LKfmqGYndGaQjoPtQ3Zxp8D5LODaIB3jm5ZeIbTiROFzeL2/JTnhkfLCvRuQ== X-Received: by 2002:a17:907:94c1:b0:a46:181f:c1c3 with SMTP id dn1-20020a17090794c100b00a46181fc1c3mr5229468ejc.70.1710338939952; Wed, 13 Mar 2024 07:08:59 -0700 (PDT) Received: from localhost (host-82-56-173-172.retail.telecomitalia.it. [82.56.173.172]) by smtp.gmail.com with ESMTPSA id l23-20020a170906a41700b00a440ec600e3sm4885228ejz.121.2024.03.13.07.08.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Mar 2024 07:08:59 -0700 (PDT) From: Andrea della Porta To: Vinod Koul , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list , Saenz Julienne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dave.stevenson@raspberrypi.com Cc: Phil Elwell , Maxime Ripard , Stefan Wahren , Dom Cobley , Andrea della Porta Subject: [PATCH v2 09/15] dmaengine: bcm2835: make address increment platform independent Date: Wed, 13 Mar 2024 15:08:34 +0100 Message-ID: <0bf87ad0dc970c34199fd6bc6dbd19b47d382066.1710226514.git.andrea.porta@suse.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: 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 Content-Type: text/plain; charset="utf-8" Actually the criteria to increment source & destination address doesn't based on platform specific bits. It's just the DMA transfer direction which is translated into the info bits. So introduce two new helper functions and get the rid of these platform specifics. Signed-off-by: Stefan Wahren Signed-off-by: Andrea della Porta --- drivers/dma/bcm2835-dma.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c index b633c40142fe..6f896bb1a4fe 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -274,6 +274,24 @@ static u32 bcm2835_dma_prepare_cb_extra(struct bcm2835= _chan *c, return result; } =20 +static inline bool need_src_incr(enum dma_transfer_direction direction) +{ + return direction !=3D DMA_DEV_TO_MEM; +} + +static inline bool need_dst_incr(enum dma_transfer_direction direction) +{ + switch (direction) { + case DMA_MEM_TO_MEM: + case DMA_DEV_TO_MEM: + return true; + default: + break; + } + + return false; +} + static void bcm2835_dma_free_cb_chain(struct bcm2835_desc *desc) { size_t i; @@ -355,10 +373,8 @@ static inline size_t bcm2835_dma_count_frames_for_sg(s= truct bcm2835_chan *c, * @cyclic: it is a cyclic transfer * @info: the default info bits to apply per controlblock * @frames: number of controlblocks to allocate - * @src: the src address to assign (if the S_INC bit is set - * in @info, then it gets incremented) - * @dst: the dst address to assign (if the D_INC bit is set - * in @info, then it gets incremented) + * @src: the src address to assign + * @dst: the dst address to assign * @buf_len: the full buffer length (may also be 0) * @period_len: the period length when to apply @finalextrainfo * in addition to the last transfer @@ -430,9 +446,9 @@ static struct bcm2835_desc *bcm2835_dma_create_cb_chain( d->cb_list[frame - 1].cb->next =3D cb_entry->paddr; =20 /* update src and dst and length */ - if (src && (info & BCM2835_DMA_S_INC)) + if (src && need_src_incr(direction)) src +=3D control_block->length; - if (dst && (info & BCM2835_DMA_D_INC)) + if (dst && need_dst_incr(direction)) dst +=3D control_block->length; =20 /* Length of total transfer */ --=20 2.35.3 From nobody Sat Feb 7 23:12:25 2026 Received: from mail-ej1-f49.google.com (mail-ej1-f49.google.com [209.85.218.49]) (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 01BA14DA0F for ; Wed, 13 Mar 2024 14:09:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338945; cv=none; b=PpSXLmWrByPD8LbYpbhP/AsIhaex+7H7MQ926auesgHcdteq9V9sFZaIGVfZwntgbYSH0FgWjcJs5qQIlrK0bze8vveP6SRE4Irfn/R4B3YHlMHfQ5FlYuhFq6C9cPPMjLLdV2VULV+vagXuH4Kcse7anF4nq7vwMMg3f2fgRLo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338945; c=relaxed/simple; bh=vIs76kYyjwJXw/ha/aHUzP99GhVmGXrKseYwAg7s1m4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ND2JZIIamy+2jBXHFdK8tWwxfRIxJQ0J3F+28I+DtpfZi29yW0xkP3yVsZz9Fe5BypIFnVEBnEu0mU5izD/lQBajvF45qHzIYqmmaZV8ss9K98/Oc+x6a036Jgbl8g86RVZc/dBDeUNJwSE5HVRFzs5FX08RpCrRqhyotJ/vbjw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=QCikcQLC; arc=none smtp.client-ip=209.85.218.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="QCikcQLC" Received: by mail-ej1-f49.google.com with SMTP id a640c23a62f3a-a45c006ab82so145165266b.3 for ; Wed, 13 Mar 2024 07:09:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1710338941; x=1710943741; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=aQCAxLcWayDk9E0aIZHof0VU6EySMCm0kMz7fVOHPV4=; b=QCikcQLCd2a5sr8cgtxc8d0dPTECENlYFLNq0EqvKr2awLoEV+/6TJ4dhDHowbr6O8 EJWNnBMI7AlFaw9SrnSgQ7tBfn74wr3KVdgZ5Z9MXgwUpapNpzLr770aoLgW6WOXmtTH hohwDCLp/wfq56g42jRtplc6QgO0JeYGQY8fpB4FYzteo5Kp89Wmq7w+71gGaHlY5RDt Wvhv8D7GHX4pkRgut1BOSqjVYeorAveGa5UHGbBSk1sCl2VkqngsYfw9ysV3a36Wg5P9 Y0KsJRSZH2EKFfqEmyk2keF1JdngdWjqFGN4WTTmsGPp9OWbFEgD80+yXeOmkSoEO3Uk UnaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710338941; x=1710943741; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=aQCAxLcWayDk9E0aIZHof0VU6EySMCm0kMz7fVOHPV4=; b=lQ652alA0A+sWgXuH2tKhcYuItxapGBUxCfHOIM+PKRm3FISA95YFBmjmGlKdGVT5X nHplLqrxT2TykusQ1E7HA787dk06nEyRB1IKrFXDrzJ4LcBglZFd7+uKYzMUAEUbCyse aP9OnBRMg+Xx0ty2LhpLYY00XHn1xpa3SdzI5Y5arax7M1Oxp4Q0pxz5ki5PfCeqxgv7 TOA/cz8570oOlB9KU8VQ9WrUlgsNfwZzX8q/cP6BADWXKLx5RZVPhgjUPrd1oveQM6iL sm3beV/hpissF1hNLAJi3mrOwWow7pQEwcHvcbdwVJKiILj0H57s664eJkamwxpWHabg mQkA== X-Forwarded-Encrypted: i=1; AJvYcCU29dy1pXeJdygCtanEZ/cTlrr7BL7YnR2pBxV9MRn85HBJVwwLXoqAd3+WJ3ubz+Je/bt04/7l5cKRv0pS2ucplY00h8i4q6S58Oun X-Gm-Message-State: AOJu0YxCGr3Mo8AsjLuLCpau0uBe0tSJxLmSlq5heqTyodtsCMr3h/Ed IffDuDwAEvAvJOUjMeuwyZoNf/sZJyQL0fUg4E3jTkFlUpxhXOktp0cKWSYvYrU= X-Google-Smtp-Source: AGHT+IGz+F3N9s1yqpgvtHwiw7lZ8mJ6jYatA61Yu9YqH5ShW7KVEDKZi1EDxzexoGOUe2u3CrXDzw== X-Received: by 2002:a17:907:c783:b0:a46:37db:b57d with SMTP id tz3-20020a170907c78300b00a4637dbb57dmr149485ejc.15.1710338941200; Wed, 13 Mar 2024 07:09:01 -0700 (PDT) Received: from localhost (host-82-56-173-172.retail.telecomitalia.it. [82.56.173.172]) by smtp.gmail.com with ESMTPSA id h10-20020a170906718a00b00a4658d3e405sm691966ejk.196.2024.03.13.07.09.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Mar 2024 07:09:00 -0700 (PDT) From: Andrea della Porta To: Vinod Koul , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list , Saenz Julienne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dave.stevenson@raspberrypi.com Cc: Phil Elwell , Maxime Ripard , Stefan Wahren , Dom Cobley , Andrea della Porta Subject: [PATCH v2 10/15] dmaengine: bcm2385: drop info parameters Date: Wed, 13 Mar 2024 15:08:35 +0100 Message-ID: <27e4028259c6c70b6439e198f62873bf12975b63.1710226514.git.andrea.porta@suse.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: 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 Content-Type: text/plain; charset="utf-8" The parameters info and finalextrainfo are platform specific. So drop them by generating them within bcm2835_dma_create_cb_chain(). Signed-off-by: Stefan Wahren Signed-off-by: Andrea della Porta --- drivers/dma/bcm2835-dma.c | 80 +++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 41 deletions(-) diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c index 6f896bb1a4fe..03d97312a3f8 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -308,12 +308,11 @@ static void bcm2835_dma_desc_free(struct virt_dma_des= c *vd) bcm2835_dma_free_cb_chain(container_of(vd, struct bcm2835_desc, vd)); } =20 -static void bcm2835_dma_create_cb_set_length(struct bcm2835_chan *chan, +static bool bcm2835_dma_create_cb_set_length(struct bcm2835_chan *chan, struct bcm2835_dma_cb *control_block, size_t len, size_t period_len, - size_t *total_len, - u32 finalextrainfo) + size_t *total_len) { size_t max_len =3D bcm2835_dma_max_frame_length(chan); =20 @@ -322,7 +321,7 @@ static void bcm2835_dma_create_cb_set_length(struct bcm= 2835_chan *chan, =20 /* finished if we have no period_length */ if (!period_len) - return; + return false; =20 /* * period_len means: that we need to generate @@ -336,7 +335,7 @@ static void bcm2835_dma_create_cb_set_length(struct bcm= 2835_chan *chan, if (*total_len + control_block->length < period_len) { /* update number of bytes in this period so far */ *total_len +=3D control_block->length; - return; + return false; } =20 /* calculate the length that remains to reach period_length */ @@ -345,8 +344,7 @@ static void bcm2835_dma_create_cb_set_length(struct bcm= 2835_chan *chan, /* reset total_length for next period */ *total_len =3D 0; =20 - /* add extrainfo bits in info */ - control_block->info |=3D finalextrainfo; + return true; } =20 static inline size_t bcm2835_dma_count_frames_for_sg(struct bcm2835_chan *= c, @@ -371,7 +369,6 @@ static inline size_t bcm2835_dma_count_frames_for_sg(st= ruct bcm2835_chan *c, * @chan: the @dma_chan for which we run this * @direction: the direction in which we transfer * @cyclic: it is a cyclic transfer - * @info: the default info bits to apply per controlblock * @frames: number of controlblocks to allocate * @src: the src address to assign * @dst: the dst address to assign @@ -379,25 +376,27 @@ static inline size_t bcm2835_dma_count_frames_for_sg(= struct bcm2835_chan *c, * @period_len: the period length when to apply @finalextrainfo * in addition to the last transfer * this will also break some control-blocks early - * @finalextrainfo: additional bits in last controlblock - * (or when period_len is reached in case of cyclic) * @gfp: the GFP flag to use for allocation + * @flags */ static struct bcm2835_desc *bcm2835_dma_create_cb_chain( struct dma_chan *chan, enum dma_transfer_direction direction, - bool cyclic, u32 info, - u32 finalextrainfo, - size_t frames, dma_addr_t src, - dma_addr_t dst, size_t buf_len, - size_t period_len, gfp_t gfp) + bool cyclic, size_t frames, + dma_addr_t src, dma_addr_t dst, + size_t buf_len, size_t period_len, + gfp_t gfp, unsigned long flags) { + struct bcm2835_dmadev *od =3D to_bcm2835_dma_dev(chan->device); struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); size_t len =3D buf_len, total_len; size_t frame; struct bcm2835_desc *d; struct bcm2835_cb_entry *cb_entry; struct bcm2835_dma_cb *control_block; + u32 extrainfo =3D bcm2835_dma_prepare_cb_extra(c, direction, cyclic, + false, flags); + bool zero_page =3D false; =20 if (!frames) return NULL; @@ -411,6 +410,14 @@ static struct bcm2835_desc *bcm2835_dma_create_cb_chai= n( d->dir =3D direction; d->cyclic =3D cyclic; =20 + switch (direction) { + case DMA_MEM_TO_MEM: + case DMA_DEV_TO_MEM: + break; + default: + zero_page =3D src =3D=3D od->zero_page; + } + /* * Iterate over all frames, create a control block * for each frame and link them together. @@ -424,7 +431,8 @@ static struct bcm2835_desc *bcm2835_dma_create_cb_chain( =20 /* fill in the control block */ control_block =3D cb_entry->cb; - control_block->info =3D info; + control_block->info =3D bcm2835_dma_prepare_cb_info(c, direction, + zero_page); control_block->src =3D src; control_block->dst =3D dst; control_block->stride =3D 0; @@ -432,10 +440,12 @@ static struct bcm2835_desc *bcm2835_dma_create_cb_cha= in( /* set up length in control_block if requested */ if (buf_len) { /* calculate length honoring period_length */ - bcm2835_dma_create_cb_set_length(c, control_block, - len, period_len, - &total_len, - cyclic ? finalextrainfo : 0); + if (bcm2835_dma_create_cb_set_length( + c, control_block, + len, period_len, &total_len)) { + /* add extrainfo bits in info */ + control_block->info |=3D extrainfo; + } =20 /* calculate new remaining length */ len -=3D control_block->length; @@ -456,7 +466,9 @@ static struct bcm2835_desc *bcm2835_dma_create_cb_chain( } =20 /* the last frame requires extra flags */ - d->cb_list[d->frames - 1].cb->info |=3D finalextrainfo; + extrainfo =3D bcm2835_dma_prepare_cb_extra(c, direction, cyclic, true, + flags); + d->cb_list[d->frames - 1].cb->info |=3D extrainfo; =20 /* detect a size mismatch */ if (buf_len && d->size !=3D buf_len) @@ -720,9 +732,6 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _dma_memcpy( { struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; - u32 info =3D bcm2835_dma_prepare_cb_info(c, DMA_MEM_TO_MEM, false); - u32 extra =3D bcm2835_dma_prepare_cb_extra(c, DMA_MEM_TO_MEM, false, - true, 0); size_t max_len =3D bcm2835_dma_max_frame_length(c); size_t frames; =20 @@ -734,9 +743,8 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _dma_memcpy( frames =3D bcm2835_dma_frames_for_length(len, max_len); =20 /* allocate the CB chain - this also fills in the pointers */ - d =3D bcm2835_dma_create_cb_chain(chan, DMA_MEM_TO_MEM, false, - info, extra, frames, - src, dst, len, 0, GFP_KERNEL); + d =3D bcm2835_dma_create_cb_chain(chan, DMA_MEM_TO_MEM, false, frames, + src, dst, len, 0, GFP_KERNEL, 0); if (!d) return NULL; =20 @@ -752,8 +760,6 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _slave_sg( struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; dma_addr_t src =3D 0, dst =3D 0; - u32 info =3D bcm2835_dma_prepare_cb_info(c, direction, false); - u32 extra =3D bcm2835_dma_prepare_cb_extra(c, direction, false, true, 0); size_t frames; =20 if (!is_slave_direction(direction)) { @@ -776,10 +782,8 @@ static struct dma_async_tx_descriptor *bcm2835_dma_pre= p_slave_sg( frames =3D bcm2835_dma_count_frames_for_sg(c, sgl, sg_len); =20 /* allocate the CB chain */ - d =3D bcm2835_dma_create_cb_chain(chan, direction, false, - info, extra, - frames, src, dst, 0, 0, - GFP_NOWAIT); + d =3D bcm2835_dma_create_cb_chain(chan, direction, false, frames, src, + dst, 0, 0, GFP_NOWAIT, 0); if (!d) return NULL; =20 @@ -795,13 +799,9 @@ static struct dma_async_tx_descriptor *bcm2835_dma_pre= p_dma_cyclic( size_t period_len, enum dma_transfer_direction direction, unsigned long flags) { - struct bcm2835_dmadev *od =3D to_bcm2835_dma_dev(chan->device); struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; dma_addr_t src, dst; - u32 info =3D bcm2835_dma_prepare_cb_info(c, direction, - buf_addr =3D=3D od->zero_page); - u32 extra =3D bcm2835_dma_prepare_cb_extra(c, direction, true, true, 0); size_t max_len =3D bcm2835_dma_max_frame_length(c); size_t frames; =20 @@ -852,10 +852,8 @@ static struct dma_async_tx_descriptor *bcm2835_dma_pre= p_dma_cyclic( * note that we need to use GFP_NOWAIT, as the ALSA i2s dmaengine * implementation calls prep_dma_cyclic with interrupts disabled. */ - d =3D bcm2835_dma_create_cb_chain(chan, direction, true, - info, extra, - frames, src, dst, buf_len, - period_len, GFP_NOWAIT); + d =3D bcm2835_dma_create_cb_chain(chan, direction, true, frames, src, dst, + buf_len, period_len, GFP_NOWAIT, flags); if (!d) return NULL; =20 --=20 2.35.3 From nobody Sat Feb 7 23:12:25 2026 Received: from mail-ej1-f52.google.com (mail-ej1-f52.google.com [209.85.218.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 017894F8B1 for ; Wed, 13 Mar 2024 14:09:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338946; cv=none; b=rh3+JgxDHtAwdrmdQVlfEOTk852MXWfRNNLnlkpuoBxZo754kJhMCvqf8FgVl76CBeTIEvpDqy3g6zInXGXjkcIkv0jJVcWw/dDWgJjR2jtMk1B4pWJWWkmuOqy8dHUQu2hqrFG8J0dC7w+ifzKVPlqMwkyrqyhGzDBYIsWR+1s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338946; c=relaxed/simple; bh=9UBZzqJurtY0u7fZf0OUMVFrBl93Pr0uetCSdgjkIi4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IZFkUdoirAW0/hYwf8MVIQt7gz1jDFlMpfi8cIJ7TOpV6R7sKg6d+GLcSRjrG0YXei+lUsZB/NMrEm/NZIGEHj8gVBG0g4mevnQcywRIHu7nUW43dgErWSXj831ygfL4fJrrPvOAvW69GRuUogSGlHGvAYWdy2QEIg80qHWS/3I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=Yskxdo81; arc=none smtp.client-ip=209.85.218.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="Yskxdo81" Received: by mail-ej1-f52.google.com with SMTP id a640c23a62f3a-a4645485da6so262790066b.1 for ; Wed, 13 Mar 2024 07:09:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1710338942; x=1710943742; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9F0Go8/yyuHye8yt6k5vc23oD+JipLNS/6TGYAxgmkY=; b=Yskxdo814Hx6Vpcvz0DpKkotdDA+kf3atgPONI2J3Gjpw+739QTFta39h/RfsdMRsv iscEMGZpHulS+xOgpLSwbgC7adw/3KcREq6ATsFJV2TgHRuEhNgD4LvO52lIyra1AQ9B F958Fs2Yo9JB/KlMrKWugdNyDh4SsTbtpqdRuGpCXvTCfHmarhcn4NNhi92IwS9OrXA5 9rGX2VJ+suIEa84uAu80FkwAJuXLzlS0dl+N+KfrNU7W8MBCc4CodaqKhkUwdBKT4A1l enD0KjzFSk6Kl31Zi/PBTacJ9Ss4ShZGEvZY8G9XKpcQIkfjI+jn0/AL0tvoVrjCL5P8 dMHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710338942; x=1710943742; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9F0Go8/yyuHye8yt6k5vc23oD+JipLNS/6TGYAxgmkY=; b=b/JH4LwzqSu6TOa20lUcoSmbziRFZjeu9IsZ+umJnTlljHLd7QPgfyOR/ZB8bxo9sh j1qM9lCtu/pGLcZHTZdT6jRAHCS10iHiqxR4F7STaqgGsZ8rGlrMgB+Lt7h8npEefwIJ uTq1YWsIrRr4IwUqYyG97WjBV4pOMJHPZeUSCDNkJRSFTkLmlbBnRsqGx/HjrKpbJeMK 7tWmS1K7hqkrcR3tLMZj5Pra65ja9fnPXjhxWDO8IKHu84U8jlJ9n8AQKFdBXgQ/tj5Y fHnkx5hbZExUZPGzW/dnSYccwUfCEkunJ9us0JVEMuo/2FUjCg5OenH5+Nfp1bh6o7hG U0Uw== X-Forwarded-Encrypted: i=1; AJvYcCV4COXxsv4i3cGs5v8BKcQHGJfxiTUgzWVbA974KlPc+uNTWy8offYRH0w+8rMAZpFNJ0H5BVG2Kjqx8Hja0+moAeok6Dxh9uYCs64D X-Gm-Message-State: AOJu0YxQI9Pc/cmpS3ap2AoNmugnm9VxJTR4M8cDyg/gV5o1UOzUV5/c 5pI2Y3Kl2smt8tWa20QpZi5h8SPUsNAKCUMc0AFzr1MHWPcBrdJTq2YFewTs5Hk= X-Google-Smtp-Source: AGHT+IEGWqP8QxjwPa6JxODEFxxNSr59dthiRT8AGN4nj6MeDLalxq+7j6Caf6aztQx6EziAU4lTLw== X-Received: by 2002:a17:906:fb81:b0:a43:29e1:6db8 with SMTP id lr1-20020a170906fb8100b00a4329e16db8mr8168617ejb.9.1710338942448; Wed, 13 Mar 2024 07:09:02 -0700 (PDT) Received: from localhost (host-82-56-173-172.retail.telecomitalia.it. [82.56.173.172]) by smtp.gmail.com with ESMTPSA id t5-20020a170906064500b00a45ff821e09sm4778473ejb.150.2024.03.13.07.09.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Mar 2024 07:09:02 -0700 (PDT) From: Andrea della Porta To: Vinod Koul , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list , Saenz Julienne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dave.stevenson@raspberrypi.com Cc: Phil Elwell , Maxime Ripard , Stefan Wahren , Dom Cobley , Andrea della Porta Subject: [PATCH v2 11/15] dmaengine: bcm2835: pass dma_chan to generic functions Date: Wed, 13 Mar 2024 15:08:36 +0100 Message-ID: <2dedf0428cbc5229ea563a571d297a64c8e09c03.1710226514.git.andrea.porta@suse.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: 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 Content-Type: text/plain; charset="utf-8" In preparation to support more platforms pass the dma_chan to the generic functions. This provides access to the DMA device and possible platform specific data. Signed-off-by: Stefan Wahren Signed-off-by: Andrea della Porta --- drivers/dma/bcm2835-dma.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c index 03d97312a3f8..88ae5d05402e 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -308,13 +308,14 @@ static void bcm2835_dma_desc_free(struct virt_dma_des= c *vd) bcm2835_dma_free_cb_chain(container_of(vd, struct bcm2835_desc, vd)); } =20 -static bool bcm2835_dma_create_cb_set_length(struct bcm2835_chan *chan, +static bool bcm2835_dma_create_cb_set_length(struct dma_chan *chan, struct bcm2835_dma_cb *control_block, size_t len, size_t period_len, size_t *total_len) { - size_t max_len =3D bcm2835_dma_max_frame_length(chan); + struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); + size_t max_len =3D bcm2835_dma_max_frame_length(c); =20 /* set the length taking lite-channel limitations into account */ control_block->length =3D min_t(u32, len, max_len); @@ -441,7 +442,7 @@ static struct bcm2835_desc *bcm2835_dma_create_cb_chain( if (buf_len) { /* calculate length honoring period_length */ if (bcm2835_dma_create_cb_set_length( - c, control_block, + chan, control_block, len, period_len, &total_len)) { /* add extrainfo bits in info */ control_block->info |=3D extrainfo; @@ -508,8 +509,9 @@ static void bcm2835_dma_fill_cb_chain_with_sg( } } =20 -static void bcm2835_dma_abort(struct bcm2835_chan *c) +static void bcm2835_dma_abort(struct dma_chan *chan) { + struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); void __iomem *chan_base =3D c->chan_base; long timeout =3D 100; =20 @@ -550,8 +552,9 @@ static void bcm2835_dma_abort(struct bcm2835_chan *c) writel(BCM2835_DMA_RESET, chan_base + BCM2835_DMA_CS); } =20 -static void bcm2835_dma_start_desc(struct bcm2835_chan *c) +static void bcm2835_dma_start_desc(struct dma_chan *chan) { + struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct virt_dma_desc *vd =3D vchan_next_desc(&c->vc); =20 if (!vd) { @@ -570,7 +573,8 @@ static void bcm2835_dma_start_desc(struct bcm2835_chan = *c) =20 static irqreturn_t bcm2835_dma_callback(int irq, void *data) { - struct bcm2835_chan *c =3D data; + struct dma_chan *chan =3D data; + struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; unsigned long flags; =20 @@ -604,7 +608,7 @@ static irqreturn_t bcm2835_dma_callback(int irq, void *= data) vchan_cyclic_callback(&d->vd); } else if (!readl(c->chan_base + BCM2835_DMA_ADDR)) { vchan_cookie_complete(&c->desc->vd); - bcm2835_dma_start_desc(c); + bcm2835_dma_start_desc(chan); } } =20 @@ -632,7 +636,7 @@ static int bcm2835_dma_alloc_chan_resources(struct dma_= chan *chan) } =20 return request_irq(c->irq_number, bcm2835_dma_callback, - c->irq_flags, "DMA IRQ", c); + c->irq_flags, "DMA IRQ", chan); } =20 static void bcm2835_dma_free_chan_resources(struct dma_chan *chan) @@ -721,7 +725,7 @@ static void bcm2835_dma_issue_pending(struct dma_chan *= chan) =20 spin_lock_irqsave(&c->vc.lock, flags); if (vchan_issue_pending(&c->vc) && !c->desc) - bcm2835_dma_start_desc(c); + bcm2835_dma_start_desc(chan); =20 spin_unlock_irqrestore(&c->vc.lock, flags); } @@ -885,7 +889,7 @@ static int bcm2835_dma_terminate_all(struct dma_chan *c= han) if (c->desc) { vchan_terminate_vdesc(&c->desc->vd); c->desc =3D NULL; - bcm2835_dma_abort(c); + bcm2835_dma_abort(chan); } =20 vchan_get_all_descriptors(&c->vc, &head); --=20 2.35.3 From nobody Sat Feb 7 23:12:25 2026 Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.44]) (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 5182F51037 for ; Wed, 13 Mar 2024 14:09:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338948; cv=none; b=kqQiEvihdSwXb49JptJfX32m5lyVTkeYDrfsUwwvxu1thrzdARJMj4/GTYXp7+QpNNmZ/tzj969yzH/arZDhTthG8jNV5g1zA8tgkZI5NaHDjF0fuv32w/3f5sgkLGSdmhc/TcIhJtVuGGIrvZpOF+HBQJhHrBvWEnYhfo4Yx40= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338948; c=relaxed/simple; bh=L37rUKFEbasMDg96hf5hsL3mh5NhUZlnllLeo3/S3Q0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o4nEt4wHAPCj/1EhuVSXo7ZCPd9JxAPcXRMBA6jAbsHhZ+1o3J6vrzG4bn0JBtbDxJY/h2VX15/B6V1DZLEyEQ/l5pFV5Tt42ep3m20BsX1uRP8lvouZbhNRI47R3+CWhXrl7/inoQ7qWDLq962CGE1gSV9JEMCIAT5sAlfvuTI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=THPZjIPt; arc=none smtp.client-ip=209.85.208.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="THPZjIPt" Received: by mail-ed1-f44.google.com with SMTP id 4fb4d7f45d1cf-5684f95cc9bso1668047a12.1 for ; Wed, 13 Mar 2024 07:09:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1710338943; x=1710943743; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mCm/hrhQ6mByy3ZheArz8BA+9C2P6vrL3jyQtBljgzk=; b=THPZjIPtVZ/Tq4iHJkCQLzSBuWFCrupabUZaz5WRtNgQQuZGhksboThTt5+47ywTmd EB0GFG6zKM4NR0YW45NDsgsqWR8HOPjElo067hdDtphKhxQSBaB4Q939m6mMci5gLIYU 1jzCh8aelhjlGsvVq1IXfy+cx2Ua/qn4HnbYgD8vnVrCij8OaXYpSCnW1TupF3kCHKrN whFTwKsRG3WoZuSG+PBG2rF3Q4OMtEw6DealPct1nyJWghv4OflrIr8uqmspQMNPgZRZ KaJFmwWWJDoDR1Ctw7ziNSYUbBvCNSBHSQW+U5XLeuQRYq8QzK/rSxEbywcYkUpNElQW BW0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710338943; x=1710943743; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mCm/hrhQ6mByy3ZheArz8BA+9C2P6vrL3jyQtBljgzk=; b=shRFo5P5djU20fNZar2KPWS38EnsMd/T7eCGewN+YMcXqXK2W/5TsZKjzZoCGYYSDa cxvr8Ehl+gz2Tbj/1Let+xgAB/b16++lurP1FoDjeD6a/dP4apAfbht7ca7NY1jtkdC4 fpRP3z8AHd5p+Oh2FntfG50FA0rYZ8v/v5gdw/lurhRUWx8AD18IFoF7S924ovwzixvn 49EDkjXNxRnF3ZbeTncuUBAq8DYeojLgsxsHD87AuqrTJM8MRT2zGZc7C6FBDKxPiFoe TF1t+mzNGUWwqRIn4vaChidsj5NzZD4KzufWjrUwe6Mq7UIns7mvSamkVGTvxGtz8QTZ 1zkQ== X-Forwarded-Encrypted: i=1; AJvYcCVeDv73GcPbNv01feJI+dPwg3n6M+V9EgI5nv/QjQnwm4Ot/2rZKzcBSeqSSUyMtn5FGD3lKUXtVGzop6UoX9fiJTi9xm4MyzluqgnR X-Gm-Message-State: AOJu0YwAdvOKxz3K3IMCItV7jSjys12vf+pSRM3cwdZUYu/kWvMeEhF5 eh/NtJFmx/3q236by4OVvQHKeRuUPFCnTL4aEMufnFa3kSQ0+OaOfQfQhStUfi1L9lccUyJZUSs W X-Google-Smtp-Source: AGHT+IHySWWWSB+Vk+u+Z/lfcofhEFncK/Fb/h9io/fpqSb/D9VRgNiFm/EFELA+fDnMdkYiPJmEWQ== X-Received: by 2002:a50:bb47:0:b0:566:abbd:c390 with SMTP id y65-20020a50bb47000000b00566abbdc390mr2643130ede.6.1710338943679; Wed, 13 Mar 2024 07:09:03 -0700 (PDT) Received: from localhost (host-82-56-173-172.retail.telecomitalia.it. [82.56.173.172]) by smtp.gmail.com with ESMTPSA id da17-20020a056402177100b005684fc23524sm3890492edb.49.2024.03.13.07.09.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Mar 2024 07:09:03 -0700 (PDT) From: Andrea della Porta To: Vinod Koul , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list , Saenz Julienne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dave.stevenson@raspberrypi.com Cc: Phil Elwell , Maxime Ripard , Stefan Wahren , Dom Cobley , Andrea della Porta Subject: [PATCH v2 12/15] dmaengine: bcm2835: introduce multi platform support Date: Wed, 13 Mar 2024 15:08:37 +0100 Message-ID: <5826eba6ab78b9cdba21c12853a85d5f9a6aab76.1710226514.git.andrea.porta@suse.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: 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 Content-Type: text/plain; charset="utf-8" This finally moves all platform specific stuff into a separate structure, which is initialized on the OF compatible during probing. Since the DMA control block is different on the BCM2711 platform, we introduce a common control block to reserve the necessary space and adequate methods for access. Signed-off-by: Stefan Wahren Signed-off-by: Andrea della Porta --- drivers/dma/bcm2835-dma.c | 336 +++++++++++++++++++++++++++++--------- 1 file changed, 260 insertions(+), 76 deletions(-) diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c index 88ae5d05402e..b015eae29b08 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -48,6 +48,11 @@ struct bcm2835_dmadev { struct dma_device ddev; void __iomem *base; dma_addr_t zero_page; + const struct bcm2835_dma_cfg *cfg; +}; + +struct bcm_dma_cb { + uint32_t rsvd[8]; }; =20 struct bcm2835_dma_cb { @@ -61,7 +66,7 @@ struct bcm2835_dma_cb { }; =20 struct bcm2835_cb_entry { - struct bcm2835_dma_cb *cb; + struct bcm_dma_cb *cb; dma_addr_t paddr; }; =20 @@ -82,6 +87,44 @@ struct bcm2835_chan { bool is_lite_channel; }; =20 +struct bcm2835_dma_cfg { + dma_addr_t addr_offset; + u32 cs_reg; + u32 cb_reg; + u32 next_reg; + u32 ti_reg; + + u32 wait_mask; + u32 reset_mask; + u32 int_mask; + u32 active_mask; + u32 abort_mask; + u32 s_dreq_mask; + u32 d_dreq_mask; + + u32 (*cb_get_length)(void *data); + dma_addr_t (*cb_get_addr)(void *data, enum dma_transfer_direction); + + void (*cb_init)(void *data, struct bcm2835_chan *c, + enum dma_transfer_direction, u32 src, u32 dst, + bool zero_page); + void (*cb_set_src)(void *data, enum dma_transfer_direction, u32 src); + void (*cb_set_dst)(void *data, enum dma_transfer_direction, u32 dst); + void (*cb_set_next)(void *data, u32 next); + void (*cb_set_length)(void *data, u32 length); + void (*cb_append_extra)(void *data, + struct bcm2835_chan *c, + enum dma_transfer_direction direction, + bool cyclic, bool final, unsigned long flags); + + dma_addr_t (*to_cb_addr)(dma_addr_t addr); + + void (*chan_plat_init)(struct bcm2835_chan *c); + dma_addr_t (*read_addr)(struct bcm2835_chan *c, + enum dma_transfer_direction); + u32 (*cs_flags)(struct bcm2835_chan *c); +}; + struct bcm2835_desc { struct bcm2835_chan *c; struct virt_dma_desc vd; @@ -215,6 +258,13 @@ static inline struct bcm2835_dmadev *to_bcm2835_dma_de= v(struct dma_device *d) return container_of(d, struct bcm2835_dmadev, ddev); } =20 +static inline const struct bcm2835_dma_cfg *to_bcm2835_cfg(struct dma_devi= ce *d) +{ + struct bcm2835_dmadev *od =3D container_of(d, struct bcm2835_dmadev, ddev= ); + + return od->cfg; +} + static inline struct bcm2835_chan *to_bcm2835_dma_chan(struct dma_chan *c) { return container_of(c, struct bcm2835_chan, vc.chan); @@ -292,6 +342,109 @@ static inline bool need_dst_incr(enum dma_transfer_di= rection direction) return false; } =20 +static inline u32 bcm2835_dma_cb_get_length(void *data) +{ + struct bcm2835_dma_cb *cb =3D data; + + return cb->length; +} + +static inline dma_addr_t +bcm2835_dma_cb_get_addr(void *data, enum dma_transfer_direction direction) +{ + struct bcm2835_dma_cb *cb =3D data; + + if (direction =3D=3D DMA_DEV_TO_MEM) + return cb->dst; + + return cb->src; +} + +static inline void +bcm2835_dma_cb_init(void *data, struct bcm2835_chan *c, + enum dma_transfer_direction direction, u32 src, u32 dst, + bool zero_page) +{ + struct bcm2835_dma_cb *cb =3D data; + + cb->info =3D bcm2835_dma_prepare_cb_info(c, direction, zero_page); + cb->src =3D src; + cb->dst =3D dst; + cb->stride =3D 0; + cb->next =3D 0; +} + +static inline void +bcm2835_dma_cb_set_src(void *data, enum dma_transfer_direction direction, + u32 src) +{ + struct bcm2835_dma_cb *cb =3D data; + + cb->src =3D src; +} + +static inline void +bcm2835_dma_cb_set_dst(void *data, enum dma_transfer_direction direction, + u32 dst) +{ + struct bcm2835_dma_cb *cb =3D data; + + cb->dst =3D dst; +} + +static inline void bcm2835_dma_cb_set_next(void *data, u32 next) +{ + struct bcm2835_dma_cb *cb =3D data; + + cb->next =3D next; +} + +static inline void bcm2835_dma_cb_set_length(void *data, u32 length) +{ + struct bcm2835_dma_cb *cb =3D data; + + cb->length =3D length; +} + +static inline void +bcm2835_dma_cb_append_extra(void *data, struct bcm2835_chan *c, + enum dma_transfer_direction direction, + bool cyclic, bool final, unsigned long flags) +{ + struct bcm2835_dma_cb *cb =3D data; + + cb->info |=3D bcm2835_dma_prepare_cb_extra(c, direction, cyclic, final, + flags); +} + +static inline dma_addr_t bcm2835_dma_to_cb_addr(dma_addr_t addr) +{ + return addr; +} + +static void bcm2835_dma_chan_plat_init(struct bcm2835_chan *c) +{ + /* check in DEBUG register if this is a LITE channel */ + if (readl(c->chan_base + BCM2835_DMA_DEBUG) & BCM2835_DMA_DEBUG_LITE) + c->is_lite_channel =3D true; +} + +static dma_addr_t bcm2835_dma_read_addr(struct bcm2835_chan *c, + enum dma_transfer_direction direction) +{ + if (direction =3D=3D DMA_MEM_TO_DEV) + return readl(c->chan_base + BCM2835_DMA_SOURCE_AD); + else if (direction =3D=3D DMA_DEV_TO_MEM) + return readl(c->chan_base + BCM2835_DMA_DEST_AD); + + return 0; +} + +static u32 bcm2835_dma_cs_flags(struct bcm2835_chan *c) +{ + return BCM2835_DMA_CS_FLAGS(c->dreq); +} + static void bcm2835_dma_free_cb_chain(struct bcm2835_desc *desc) { size_t i; @@ -309,16 +462,19 @@ static void bcm2835_dma_desc_free(struct virt_dma_des= c *vd) } =20 static bool bcm2835_dma_create_cb_set_length(struct dma_chan *chan, - struct bcm2835_dma_cb *control_block, + void *data, size_t len, size_t period_len, size_t *total_len) { + const struct bcm2835_dma_cfg *cfg =3D to_bcm2835_cfg(chan->device); struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); size_t max_len =3D bcm2835_dma_max_frame_length(c); =20 /* set the length taking lite-channel limitations into account */ - control_block->length =3D min_t(u32, len, max_len); + u32 length =3D min_t(u32, len, max_len); + + cfg->cb_set_length(data, length); =20 /* finished if we have no period_length */ if (!period_len) @@ -333,14 +489,14 @@ static bool bcm2835_dma_create_cb_set_length(struct d= ma_chan *chan, */ =20 /* have we filled in period_length yet? */ - if (*total_len + control_block->length < period_len) { + if (*total_len + length < period_len) { /* update number of bytes in this period so far */ - *total_len +=3D control_block->length; + *total_len +=3D length; return false; } =20 /* calculate the length that remains to reach period_length */ - control_block->length =3D period_len - *total_len; + cfg->cb_set_length(data, period_len - *total_len); =20 /* reset total_length for next period */ *total_len =3D 0; @@ -388,15 +544,14 @@ static struct bcm2835_desc *bcm2835_dma_create_cb_cha= in( size_t buf_len, size_t period_len, gfp_t gfp, unsigned long flags) { + const struct bcm2835_dma_cfg *cfg =3D to_bcm2835_cfg(chan->device); struct bcm2835_dmadev *od =3D to_bcm2835_dma_dev(chan->device); struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); size_t len =3D buf_len, total_len; size_t frame; struct bcm2835_desc *d; struct bcm2835_cb_entry *cb_entry; - struct bcm2835_dma_cb *control_block; - u32 extrainfo =3D bcm2835_dma_prepare_cb_extra(c, direction, cyclic, - false, flags); + struct bcm_dma_cb *control_block; bool zero_page =3D false; =20 if (!frames) @@ -432,12 +587,7 @@ static struct bcm2835_desc *bcm2835_dma_create_cb_chai= n( =20 /* fill in the control block */ control_block =3D cb_entry->cb; - control_block->info =3D bcm2835_dma_prepare_cb_info(c, direction, - zero_page); - control_block->src =3D src; - control_block->dst =3D dst; - control_block->stride =3D 0; - control_block->next =3D 0; + cfg->cb_init(control_block, c, src, dst, direction, zero_page); /* set up length in control_block if requested */ if (buf_len) { /* calculate length honoring period_length */ @@ -445,31 +595,33 @@ static struct bcm2835_desc *bcm2835_dma_create_cb_cha= in( chan, control_block, len, period_len, &total_len)) { /* add extrainfo bits in info */ - control_block->info |=3D extrainfo; + bcm2835_dma_cb_append_extra(control_block, c, + direction, cyclic, + false, flags); } =20 /* calculate new remaining length */ - len -=3D control_block->length; + len -=3D cfg->cb_get_length(control_block); } =20 /* link this the last controlblock */ if (frame) - d->cb_list[frame - 1].cb->next =3D cb_entry->paddr; + cfg->cb_set_next(d->cb_list[frame - 1].cb, + cb_entry->paddr); =20 /* update src and dst and length */ if (src && need_src_incr(direction)) - src +=3D control_block->length; + src +=3D cfg->cb_get_length(control_block); if (dst && need_dst_incr(direction)) - dst +=3D control_block->length; + dst +=3D cfg->cb_get_length(control_block); =20 /* Length of total transfer */ - d->size +=3D control_block->length; + d->size +=3D cfg->cb_get_length(control_block); } =20 /* the last frame requires extra flags */ - extrainfo =3D bcm2835_dma_prepare_cb_extra(c, direction, cyclic, true, - flags); - d->cb_list[d->frames - 1].cb->info |=3D extrainfo; + cfg->cb_append_extra(d->cb_list[d->frames - 1].cb, c, direction, cyclic, + true, flags); =20 /* detect a size mismatch */ if (buf_len && d->size !=3D buf_len) @@ -489,6 +641,7 @@ static void bcm2835_dma_fill_cb_chain_with_sg( struct scatterlist *sgl, unsigned int sg_len) { + const struct bcm2835_dma_cfg *cfg =3D to_bcm2835_cfg(chan->device); struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); size_t len, max_len; unsigned int i; @@ -499,18 +652,19 @@ static void bcm2835_dma_fill_cb_chain_with_sg( for_each_sg(sgl, sgent, sg_len, i) { for (addr =3D sg_dma_address(sgent), len =3D sg_dma_len(sgent); len > 0; - addr +=3D cb->cb->length, len -=3D cb->cb->length, cb++) { + addr +=3D cfg->cb_get_length(cb->cb), len -=3D cfg->cb_get_length(c= b->cb), cb++) { if (direction =3D=3D DMA_DEV_TO_MEM) - cb->cb->dst =3D addr; + cfg->cb_set_dst(cb->cb, direction, addr); else - cb->cb->src =3D addr; - cb->cb->length =3D min(len, max_len); + cfg->cb_set_src(cb->cb, direction, addr); + cfg->cb_set_length(cb->cb, min(len, max_len)); } } } =20 static void bcm2835_dma_abort(struct dma_chan *chan) { + const struct bcm2835_dma_cfg *cfg =3D to_bcm2835_cfg(chan->device); struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); void __iomem *chan_base =3D c->chan_base; long timeout =3D 100; @@ -519,41 +673,42 @@ static void bcm2835_dma_abort(struct dma_chan *chan) * A zero control block address means the channel is idle. * (The ACTIVE flag in the CS register is not a reliable indicator.) */ - if (!readl(chan_base + BCM2835_DMA_ADDR)) + if (!readl(chan_base + cfg->cb_reg)) return; =20 /* We need to clear the next DMA block pending */ - writel(0, chan_base + BCM2835_DMA_NEXTCB); + writel(0, chan_base + cfg->next_reg); =20 /* Abort the DMA, which needs to be enabled to complete */ - writel(readl(chan_base + BCM2835_DMA_CS) | BCM2835_DMA_ABORT | BCM2835_DM= A_ACTIVE, - chan_base + BCM2835_DMA_CS); + writel(readl(chan_base + cfg->cs_reg) | cfg->abort_mask | cfg->active_mas= k, + chan_base + cfg->cs_reg); =20 /* wait for DMA to be aborted */ - while ((readl(chan_base + BCM2835_DMA_CS) & BCM2835_DMA_ABORT) && --timeo= ut) + while ((readl(chan_base + cfg->cs_reg) & cfg->abort_mask) && --timeout) cpu_relax(); =20 /* Write 0 to the active bit - Pause the DMA */ - writel(readl(chan_base + BCM2835_DMA_CS) & ~BCM2835_DMA_ACTIVE, - chan_base + BCM2835_DMA_CS); + writel(readl(chan_base + cfg->cs_reg) & ~cfg->active_mask, + chan_base + cfg->cs_reg); =20 /* * Peripheral might be stuck and fail to complete * This is expected when dreqs are enabled but not asserted * so only report error in non dreq case */ - if (!timeout && !(readl(chan_base + BCM2835_DMA_TI) & - (BCM2835_DMA_S_DREQ | BCM2835_DMA_D_DREQ))) + if (!timeout && !(readl(chan_base + cfg->ti_reg) & + (cfg->s_dreq_mask | cfg->d_dreq_mask))) dev_err(c->vc.chan.device->dev, "failed to complete pause on dma %d (CS:%08x)\n", c->ch, - readl(chan_base + BCM2835_DMA_CS)); + readl(chan_base + cfg->cs_reg)); =20 /* Set CS back to default state and reset the DMA */ - writel(BCM2835_DMA_RESET, chan_base + BCM2835_DMA_CS); + writel(cfg->reset_mask, chan_base + cfg->cs_reg); } =20 static void bcm2835_dma_start_desc(struct dma_chan *chan) { + const struct bcm2835_dma_cfg *cfg =3D to_bcm2835_cfg(chan->device); struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct virt_dma_desc *vd =3D vchan_next_desc(&c->vc); =20 @@ -566,14 +721,15 @@ static void bcm2835_dma_start_desc(struct dma_chan *c= han) =20 c->desc =3D to_bcm2835_dma_desc(&vd->tx); =20 - writel(c->desc->cb_list[0].paddr, c->chan_base + BCM2835_DMA_ADDR); - writel(BCM2835_DMA_ACTIVE | BCM2835_DMA_CS_FLAGS(c->dreq), - c->chan_base + BCM2835_DMA_CS); + writel(cfg->to_cb_addr(c->desc->cb_list[0].paddr), c->chan_base + cfg->cb= _reg); + writel(cfg->active_mask | cfg->cs_flags(c), + c->chan_base + cfg->cs_reg); } =20 static irqreturn_t bcm2835_dma_callback(int irq, void *data) { struct dma_chan *chan =3D data; + const struct bcm2835_dma_cfg *cfg =3D to_bcm2835_cfg(chan->device); struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; unsigned long flags; @@ -581,9 +737,9 @@ static irqreturn_t bcm2835_dma_callback(int irq, void *= data) /* check the shared interrupt */ if (c->irq_flags & IRQF_SHARED) { /* check if the interrupt is enabled */ - flags =3D readl(c->chan_base + BCM2835_DMA_CS); + flags =3D readl(c->chan_base + cfg->cs_reg); /* if not set then we are not the reason for the irq */ - if (!(flags & BCM2835_DMA_INT)) + if (!(flags & cfg->int_mask)) return IRQ_NONE; } =20 @@ -596,9 +752,7 @@ static irqreturn_t bcm2835_dma_callback(int irq, void *= data) * if this IRQ handler is threaded.) If the channel is finished, it * will remain idle despite the ACTIVE flag being set. */ - writel(BCM2835_DMA_INT | BCM2835_DMA_ACTIVE | - BCM2835_DMA_CS_FLAGS(c->dreq), - c->chan_base + BCM2835_DMA_CS); + writel(cfg->int_mask | cfg->active_mask | cfg->cs_flags(c), c->chan_base = + cfg->cs_reg); =20 d =3D c->desc; =20 @@ -606,7 +760,7 @@ static irqreturn_t bcm2835_dma_callback(int irq, void *= data) if (d->cyclic) { /* call the cyclic callback */ vchan_cyclic_callback(&d->vd); - } else if (!readl(c->chan_base + BCM2835_DMA_ADDR)) { + } else if (!readl(c->chan_base + cfg->cb_reg)) { vchan_cookie_complete(&c->desc->vd); bcm2835_dma_start_desc(chan); } @@ -629,7 +783,7 @@ static int bcm2835_dma_alloc_chan_resources(struct dma_= chan *chan) * (32 byte) aligned address (BCM2835 ARM Peripherals, sec. 4.2.1.1). */ c->cb_pool =3D dma_pool_create(dev_name(dev), dev, - sizeof(struct bcm2835_dma_cb), 32, 0); + sizeof(struct bcm_dma_cb), 32, 0); if (!c->cb_pool) { dev_err(dev, "unable to allocate descriptor pool\n"); return -ENOMEM; @@ -655,20 +809,16 @@ static size_t bcm2835_dma_desc_size(struct bcm2835_de= sc *d) return d->size; } =20 -static size_t bcm2835_dma_desc_size_pos(struct bcm2835_desc *d, dma_addr_t= addr) +static size_t bcm2835_dma_desc_size_pos(const struct bcm2835_dma_cfg *cfg, + struct bcm2835_desc *d, dma_addr_t addr) { unsigned int i; size_t size; =20 for (size =3D i =3D 0; i < d->frames; i++) { - struct bcm2835_dma_cb *control_block =3D d->cb_list[i].cb; - size_t this_size =3D control_block->length; - dma_addr_t dma; - - if (d->dir =3D=3D DMA_DEV_TO_MEM) - dma =3D control_block->dst; - else - dma =3D control_block->src; + struct bcm_dma_cb *control_block =3D d->cb_list[i].cb; + size_t this_size =3D cfg->cb_get_length(control_block); + dma_addr_t dma =3D cfg->cb_get_addr(control_block, d->dir); =20 if (size) size +=3D this_size; @@ -683,6 +833,7 @@ static enum dma_status bcm2835_dma_tx_status(struct dma= _chan *chan, dma_cookie_t cookie, struct dma_tx_state *txstate) { + const struct bcm2835_dma_cfg *cfg =3D to_bcm2835_cfg(chan->device); struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct virt_dma_desc *vd; enum dma_status ret; @@ -701,14 +852,8 @@ static enum dma_status bcm2835_dma_tx_status(struct dm= a_chan *chan, struct bcm2835_desc *d =3D c->desc; dma_addr_t pos; =20 - if (d->dir =3D=3D DMA_MEM_TO_DEV) - pos =3D readl(c->chan_base + BCM2835_DMA_SOURCE_AD); - else if (d->dir =3D=3D DMA_DEV_TO_MEM) - pos =3D readl(c->chan_base + BCM2835_DMA_DEST_AD); - else - pos =3D 0; - - txstate->residue =3D bcm2835_dma_desc_size_pos(d, pos); + pos =3D cfg->read_addr(c, d->dir); + txstate->residue =3D bcm2835_dma_desc_size_pos(cfg, d, pos); } else { txstate->residue =3D 0; } @@ -761,6 +906,7 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _slave_sg( enum dma_transfer_direction direction, unsigned long flags, void *context) { + const struct bcm2835_dma_cfg *cfg =3D to_bcm2835_cfg(chan->device); struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; dma_addr_t src =3D 0, dst =3D 0; @@ -775,11 +921,11 @@ static struct dma_async_tx_descriptor *bcm2835_dma_pr= ep_slave_sg( if (direction =3D=3D DMA_DEV_TO_MEM) { if (c->cfg.src_addr_width !=3D DMA_SLAVE_BUSWIDTH_4_BYTES) return NULL; - src =3D c->cfg.src_addr; + src =3D cfg->addr_offset + c->cfg.src_addr; } else { if (c->cfg.dst_addr_width !=3D DMA_SLAVE_BUSWIDTH_4_BYTES) return NULL; - dst =3D c->cfg.dst_addr; + dst =3D cfg->addr_offset + c->cfg.dst_addr; } =20 /* count frames in sg list */ @@ -803,6 +949,7 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep= _dma_cyclic( size_t period_len, enum dma_transfer_direction direction, unsigned long flags) { + const struct bcm2835_dma_cfg *cfg =3D to_bcm2835_cfg(chan->device); struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); struct bcm2835_desc *d; dma_addr_t src, dst; @@ -836,12 +983,12 @@ static struct dma_async_tx_descriptor *bcm2835_dma_pr= ep_dma_cyclic( if (direction =3D=3D DMA_DEV_TO_MEM) { if (c->cfg.src_addr_width !=3D DMA_SLAVE_BUSWIDTH_4_BYTES) return NULL; - src =3D c->cfg.src_addr; + src =3D cfg->addr_offset + c->cfg.src_addr; dst =3D buf_addr; } else { if (c->cfg.dst_addr_width !=3D DMA_SLAVE_BUSWIDTH_4_BYTES) return NULL; - dst =3D c->cfg.dst_addr; + dst =3D cfg->addr_offset + c->cfg.dst_addr; src =3D buf_addr; } =20 @@ -862,7 +1009,8 @@ static struct dma_async_tx_descriptor *bcm2835_dma_pre= p_dma_cyclic( return NULL; =20 /* wrap around into a loop */ - d->cb_list[d->frames - 1].cb->next =3D d->cb_list[0].paddr; + cfg->cb_set_next(d->cb_list[d->frames - 1].cb, + cfg->to_cb_addr(d->cb_list[0].paddr)); =20 return vchan_tx_prep(&c->vc, &d->vd, flags); } @@ -923,10 +1071,7 @@ static int bcm2835_dma_chan_init(struct bcm2835_dmade= v *d, int chan_id, c->irq_number =3D irq; c->irq_flags =3D irq_flags; =20 - /* check in DEBUG register if this is a LITE channel */ - if (readl(c->chan_base + BCM2835_DMA_DEBUG) & - BCM2835_DMA_DEBUG_LITE) - c->is_lite_channel =3D true; + d->cfg->chan_plat_init(c); =20 return 0; } @@ -945,8 +1090,40 @@ static void bcm2835_dma_free(struct bcm2835_dmadev *o= d) DMA_TO_DEVICE, DMA_ATTR_SKIP_CPU_SYNC); } =20 +static const struct bcm2835_dma_cfg bcm2835_data =3D { + .addr_offset =3D 0, + + .cs_reg =3D BCM2835_DMA_CS, + .cb_reg =3D BCM2835_DMA_ADDR, + .next_reg =3D BCM2835_DMA_NEXTCB, + .ti_reg =3D BCM2835_DMA_TI, + + .wait_mask =3D BCM2835_DMA_WAITING_FOR_WRITES, + .reset_mask =3D BCM2835_DMA_RESET, + .int_mask =3D BCM2835_DMA_INT, + .active_mask =3D BCM2835_DMA_ACTIVE, + .abort_mask =3D BCM2835_DMA_ABORT, + .s_dreq_mask =3D BCM2835_DMA_S_DREQ, + .d_dreq_mask =3D BCM2835_DMA_D_DREQ, + + .cb_get_length =3D bcm2835_dma_cb_get_length, + .cb_get_addr =3D bcm2835_dma_cb_get_addr, + .cb_init =3D bcm2835_dma_cb_init, + .cb_set_src =3D bcm2835_dma_cb_set_src, + .cb_set_dst =3D bcm2835_dma_cb_set_dst, + .cb_set_next =3D bcm2835_dma_cb_set_next, + .cb_set_length =3D bcm2835_dma_cb_set_length, + .cb_append_extra =3D bcm2835_dma_cb_append_extra, + + .to_cb_addr =3D bcm2835_dma_to_cb_addr, + + .chan_plat_init =3D bcm2835_dma_chan_plat_init, + .read_addr =3D bcm2835_dma_read_addr, + .cs_flags =3D bcm2835_dma_cs_flags, +}; + static const struct of_device_id bcm2835_dma_of_match[] =3D { - { .compatible =3D "brcm,bcm2835-dma", }, + { .compatible =3D "brcm,bcm2835-dma", .data =3D &bcm2835_data }, {}, }; MODULE_DEVICE_TABLE(of, bcm2835_dma_of_match); @@ -978,6 +1155,12 @@ static int bcm2835_dma_probe(struct platform_device *= pdev) u32 chans_available; char chan_name[BCM2835_DMA_CHAN_NAME_SIZE]; =20 + const void *cfg_data =3D device_get_match_data(&pdev->dev); + if (!cfg_data) { + dev_err(&pdev->dev, "Failed to match compatible string\n"); + return -EINVAL; + } + if (!pdev->dev.dma_mask) pdev->dev.dma_mask =3D &pdev->dev.coherent_dma_mask; =20 @@ -998,6 +1181,7 @@ static int bcm2835_dma_probe(struct platform_device *p= dev) return PTR_ERR(base); =20 od->base =3D base; + od->cfg =3D cfg_data; =20 dma_cap_set(DMA_SLAVE, od->ddev.cap_mask); dma_cap_set(DMA_PRIVATE, od->ddev.cap_mask); --=20 2.35.3 From nobody Sat Feb 7 23:12:25 2026 Received: from mail-ej1-f43.google.com (mail-ej1-f43.google.com [209.85.218.43]) (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 DE633537F1 for ; Wed, 13 Mar 2024 14:09:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338949; cv=none; b=HlksgNceUpUZPdE+jy5FN/Gj/1Wod0rCFZlpP8Ds7EqxzEfr2OFNTmE0MkEmArEbzphVjos9oDHs1c01+Z9fg3wpzcnV4L5Lu2nhBWQ4ljkb6JYhlGX3zU0JsC+iJPYpj+7ECfqjmHH/8VJlY6942TyQRPl7qn29ntHeT2e8+MY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338949; c=relaxed/simple; bh=VqvyhpLImrEEWUqrm8LqdGsOX7rFQEk5APKWIx4SW5A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jVQMYBScP8c4g/gVk6ZN0pZ+oXLtFCl6dh/01fgzILrGBWduQSNseT+dw0re9f7XyjNLw/1RPUqU4t1tzIQxNPkt9tNytIC3VijGNlYEwxmVFI3LTF4PffLOngQ+zuCdyRxaGo88LRrakbv/H8MFFtXgNWXPFnAK9IjIDHZCRfM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=dqcKrQG6; arc=none smtp.client-ip=209.85.218.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="dqcKrQG6" Received: by mail-ej1-f43.google.com with SMTP id a640c23a62f3a-a44d084bfe1so646011066b.1 for ; Wed, 13 Mar 2024 07:09:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1710338945; x=1710943745; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=iC5hRkZE8XydpjuCjvZ54lBNe2FsAX8ONZyCD9caIGw=; b=dqcKrQG6GZlDHC94DESDNEXdZQmYsLRUlYwlrISa96pHNcvKqVf6z8njAV/JZ3w0o5 jDRnQUGz8IepZRJ23228wV25B9jgsIx6S3Wl500SWVzNsBUa5ATtSUtsuPyzp6TIyNz6 EvS9U55Jd59c2gv1A7q7/y4yPwPIqIbUQygpcz2RFsZhwuQHm1sD8gPUa25zCatAN2Sh fkWy1KoZvW1AboDh+reNltaEktPQPiK0SCmLK5bQZulr5HHkim/mVeSkHgazVOi/el1W L0tUk8s+tQ7oWcyuMbauvGl9oB4r8SjXoBiaRWDf6leQrm38ZyPHE7FRwlJQ6AVgZmjQ yYCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710338945; x=1710943745; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=iC5hRkZE8XydpjuCjvZ54lBNe2FsAX8ONZyCD9caIGw=; b=lJDDY40oOiYji/kg6a44aZ8ivccjVdYL/7+gk38vljkhgqynrZyjoxVusIM4NViOee zgDbFExZFh99iz+dUT8i/9lkbXoaoWQL4F0Uy8WT+DOx41aFTj/bKf6YKKfPjo/6F7e8 bOEldW367Ggn9JzLFWNkNOS+tF9AMbSLHhNcX/XxCISuBNTOIt+EtmtpxAcM7j9VmML8 n7udvHOKDWzqjGt0VpQrL9OAov6eveG6jZulE9hiSNOC52RlIbDqob6VFR52wwv0Got+ Ou0YdZ6eld/1mpMfk1g2Qy3DUw1IyYqCMQmuSzBVb77RKJ75D9+iv3tQrpzDxG0sGf1H 7V2w== X-Forwarded-Encrypted: i=1; AJvYcCUBs9UmYOuzOcAoPp3ltiwDVjDsnHzu6TXgn7Ce1V5qbQQeR1xAq8na0N2g1wpRYfeOFHzqRbMKGWxss4wZdMcTe9Prp1lv0kI+Jdha X-Gm-Message-State: AOJu0Yy8cNV5R8YcC+5bu3eLQQox9QyR8ksmIxGF1dg5sBidHf70HAfM RAWH+87WP5UIY3AqnYVzB4/DqPSH23nr/aKLnJRnxv+78bXVaOo1uBtHBqAxAbk= X-Google-Smtp-Source: AGHT+IFyuIjwtvgpdhhj/173HsZkPpiyLzXxHYape6PR7U0HW2/2V4AAAxMeCUd7QbQujytsrNhvVg== X-Received: by 2002:a17:907:7e83:b0:a3e:792f:3955 with SMTP id qb3-20020a1709077e8300b00a3e792f3955mr3050129ejc.62.1710338945176; Wed, 13 Mar 2024 07:09:05 -0700 (PDT) Received: from localhost (host-82-56-173-172.retail.telecomitalia.it. [82.56.173.172]) by smtp.gmail.com with ESMTPSA id lg12-20020a170906f88c00b00a4432543b21sm4858324ejb.198.2024.03.13.07.09.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Mar 2024 07:09:04 -0700 (PDT) From: Andrea della Porta To: Vinod Koul , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list , Saenz Julienne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dave.stevenson@raspberrypi.com Cc: Phil Elwell , Maxime Ripard , Stefan Wahren , Dom Cobley , Andrea della Porta Subject: [PATCH v2 13/15] dt-bindings: dma: Added bcm2711-dma Date: Wed, 13 Mar 2024 15:08:38 +0100 Message-ID: <346611b3ec6f47cb10e538d6cbe52056f535f965.1710226514.git.andrea.porta@suse.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: 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 Content-Type: text/plain; charset="utf-8" Add BCM2711 dma engine compatible. Signed-off-by: Andrea della Porta Acked-by: Krzysztof Kozlowski --- Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.yaml b/= Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.yaml index c9b9a5490826..4271a6fedf54 100644 --- a/Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.yaml +++ b/Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.yaml @@ -20,7 +20,9 @@ allOf: =20 properties: compatible: - const: brcm,bcm2835-dma + enum: + - brcm,bcm2835-dma + - brcm,bcm2711-dma =20 reg: maxItems: 1 --=20 2.35.3 From nobody Sat Feb 7 23:12:25 2026 Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.44]) (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 84F3A54725 for ; Wed, 13 Mar 2024 14:09:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338951; cv=none; b=fRBdX42pOaMxC2HuePWHPCUEjgn3U06vmh3VzUqQuN8q4kFbvEN1WZFGrUeJb5nF4Ctsb3aERz1y97MpL+IP51tffMTqNumXqrhvz88BY2xhRX/zUgEj60D4H8YeFyOstArbIDzBOxzvV3HpdSWl2qvZhjk45f7Ud+iXjkO5pJ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338951; c=relaxed/simple; bh=ydMyNKlgJjwenSdKz23pqgfrZw8hKMeYS+sXWLgsu20=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uPo0Nep+ye2X8x1mUk3R6oBK904Z+TjWUDDMaNloP86eh8Ph8w3VKnEqbBaUUY9sIXCIC4AbbVedAu4do5ZIng3WxKa1XOrLp5yD6i5jY/ZM8hehQkXGDZfk1+fbQorYvcXJtJxCEKl+0ToKQ1PIWIw6v8ICGmbcsX5S6IA62xo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=d0N9Wa5y; arc=none smtp.client-ip=209.85.208.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="d0N9Wa5y" Received: by mail-ed1-f44.google.com with SMTP id 4fb4d7f45d1cf-5658082d2c4so1501279a12.1 for ; Wed, 13 Mar 2024 07:09:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1710338947; x=1710943747; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=FHhJLSPwlFyN1v47/5LFzL8wYfsbaOex6ckiVXFurW8=; b=d0N9Wa5y5sjTOnBo9sCYT1phDUcaKpF1yaHfxWy4wwBuqXtFlGheVHtvqyGXTR4PNB D+FCjmmuOq34D8weCwsVKKpkkKJ1K5ECSA/PBGd8VBPIJ1gZ1O21oHArHVy4mzuHRGE1 fkwWou+JMcUTadJ6ZV/ifbA7R4gRD58+BVowuPtXSRQJBMIqolCFKif1QOBOSaexukc1 VlHvLPOaHCZusSfvSiSHNCsiUe/wXOKLWCbPD/yPaZLdAzyc2FLqsceiUUeMlBAIgNEu Q9smUMvkwFgLvKqNYrQrbdeARsr+FfvIM93BUDd/tpNAT4e8wnGx88Kvgxg/1qj/vtQj /DXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710338947; x=1710943747; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FHhJLSPwlFyN1v47/5LFzL8wYfsbaOex6ckiVXFurW8=; b=Xgfzzkb4RYyGS6Yf3zUC2g/7p+sId3y6fWVHMpuImUavDy84FMumVQkXQNuTJZ2AeI ddY1WT3291LhyLYi4s14T2ZLbwLGvSKBasNK1ErioDjatDXxAg3YV3KiEcq+cYfypCX5 T5IOHnBcPoBYlV/WV4WvFUxC8HmQUjkNozpCY9FbE9w+GdtYRelSCJZYIsdWlekm/wiC GxrN5hHv9KPAQJk8i0DJbp9MeEuSowLfhKCbwEN/4AbSQFrPGPEgO5o+xNDRb/3QynUO BKmU19q+Q/3aJgajIjqFro1rTkf193p+M6DsN/rrHLS3E+z4++n9lj1dD42gMKSc0Fa9 ynmA== X-Forwarded-Encrypted: i=1; AJvYcCXokVpysg08SPL3wV8gqLQxL6HjTiBZqxN3hs97GsSSM6sFYSiJ61mmzhk4uK/XSXrnQNC56zMvpzvWznzCILaLTaOY9CxE/6lg0psV X-Gm-Message-State: AOJu0YxQ3zcRmmkd0pzWA51rDOAGw7a41xyV8xUU6DuxU3VXSG+FnC5p 9Y7LJ42ncu/XMHLgypQMXgzEmkgoh1o2TS5xLt67dPX6Kms1jm3mK4MzNI4IwxdWYDgD9ShcuRB T X-Google-Smtp-Source: AGHT+IFZfUFO6ec8Hx97O9B1PZ+LLxyMeP2rh4T4+M4aVsshiF4u+OjXLBBsFevavT315MEjdHrngA== X-Received: by 2002:a50:ab19:0:b0:565:7edf:41b0 with SMTP id s25-20020a50ab19000000b005657edf41b0mr2660468edc.6.1710338946596; Wed, 13 Mar 2024 07:09:06 -0700 (PDT) Received: from localhost (host-82-56-173-172.retail.telecomitalia.it. [82.56.173.172]) by smtp.gmail.com with ESMTPSA id s21-20020a50ab15000000b00568699d4b83sm2404091edc.44.2024.03.13.07.09.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Mar 2024 07:09:06 -0700 (PDT) From: Andrea della Porta To: Vinod Koul , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list , Saenz Julienne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dave.stevenson@raspberrypi.com Cc: Phil Elwell , Maxime Ripard , Stefan Wahren , Dom Cobley , Andrea della Porta Subject: [PATCH v2 14/15] dmaengine: bcm2835: Add BCM2711 40-bit DMA support Date: Wed, 13 Mar 2024 15:08:39 +0100 Message-ID: <8e4dceada017ea4804d7dac16c2a4974807a2c01.1710226514.git.andrea.porta@suse.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: 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 Content-Type: text/plain; charset="utf-8" BCM2711 has 4 DMA channels with a 40-bit address range, allowing them to access the full 4GB of memory on a Pi 4. Assume every channel is capable of 40-bit address range. Originally-by: Phil Elwell Originally-by: Maxime Ripard Originally-by: Stefan Wahren Signed-off-by: Andrea della Porta --- drivers/dma/bcm2835-dma.c | 553 ++++++++++++++++++++++++++++++++------ 1 file changed, 466 insertions(+), 87 deletions(-) diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c index b015eae29b08..5c8dde8b07cd 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -36,13 +36,15 @@ =20 #define BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED 14 #define BCM2835_DMA_CHAN_NAME_SIZE 8 +#define BCM2711_DMA40_PHYS_ADDR 0x400000000ULL +#define BCM2835_DMA_ABORT_TIMEOUT 100 =20 /** * struct bcm2835_dmadev - BCM2835 DMA controller * @ddev: DMA device * @base: base address of register map * @zero_page: bus address of zero page (to detect transactions copying fr= om - * zero page and avoid accessing memory if so) + * zero page and avoid accessing memory if so) */ struct bcm2835_dmadev { struct dma_device ddev; @@ -52,7 +54,7 @@ struct bcm2835_dmadev { }; =20 struct bcm_dma_cb { - uint32_t rsvd[8]; + u32 rsvd[8]; }; =20 struct bcm2835_dma_cb { @@ -65,6 +67,17 @@ struct bcm2835_dma_cb { u32 pad[2]; }; =20 +struct bcm2711_dma40_scb { + u32 ti; + u32 src; + u32 srci; + u32 dst; + u32 dsti; + u32 len; + u32 next_cb; + u32 rsvd; +}; + struct bcm2835_cb_entry { struct bcm_dma_cb *cb; dma_addr_t paddr; @@ -102,14 +115,16 @@ struct bcm2835_dma_cfg { u32 s_dreq_mask; u32 d_dreq_mask; =20 + u64 dma_mask; + u32 (*cb_get_length)(void *data); dma_addr_t (*cb_get_addr)(void *data, enum dma_transfer_direction); =20 void (*cb_init)(void *data, struct bcm2835_chan *c, - enum dma_transfer_direction, u32 src, u32 dst, + enum dma_transfer_direction, dma_addr_t src, dma_addr_t dst, bool zero_page); - void (*cb_set_src)(void *data, enum dma_transfer_direction, u32 src); - void (*cb_set_dst)(void *data, enum dma_transfer_direction, u32 dst); + void (*cb_set_src)(void *data, enum dma_transfer_direction, dma_addr_t sr= c); + void (*cb_set_dst)(void *data, enum dma_transfer_direction, dma_addr_t ds= t); void (*cb_set_next)(void *data, u32 next); void (*cb_set_length)(void *data, u32 length); void (*cb_append_extra)(void *data, @@ -123,6 +138,7 @@ struct bcm2835_dma_cfg { dma_addr_t (*read_addr)(struct bcm2835_chan *c, enum dma_transfer_direction); u32 (*cs_flags)(struct bcm2835_chan *c); + void (*dma_abort)(struct bcm2835_chan *c, const struct bcm2835_dma_cfg *c= fg); }; =20 struct bcm2835_desc { @@ -233,13 +249,110 @@ struct bcm2835_desc { #define BCM2835_DMA_DATA_TYPE_S128 16 =20 /* Valid only for channels 0 - 14, 15 has its own base address */ -#define BCM2835_DMA_CHAN(n) ((n) << 8) /* Base address */ +#define BCM2835_DMA_CHAN_SIZE 0x100 +#define BCM2835_DMA_CHAN(n) ((n) * BCM2835_DMA_CHAN_SIZE) /* Base address = */ #define BCM2835_DMA_CHANIO(base, n) ((base) + BCM2835_DMA_CHAN(n)) =20 +/* 40-bit DMA support */ +#define BCM2711_DMA40_CS 0x00 +#define BCM2711_DMA40_CB 0x04 +#define BCM2711_DMA40_DEBUG 0x0c +#define BCM2711_DMA40_TI 0x10 +#define BCM2711_DMA40_SRC 0x14 +#define BCM2711_DMA40_SRCI 0x18 +#define BCM2711_DMA40_DEST 0x1c +#define BCM2711_DMA40_DESTI 0x20 +#define BCM2711_DMA40_LEN 0x24 +#define BCM2711_DMA40_NEXT_CB 0x28 +#define BCM2711_DMA40_DEBUG2 0x2c + +#define BCM2711_DMA40_ACTIVE BIT(0) +#define BCM2711_DMA40_END BIT(1) +#define BCM2711_DMA40_INT BIT(2) +#define BCM2711_DMA40_DREQ BIT(3) /* DREQ state */ +#define BCM2711_DMA40_RD_PAUSED BIT(4) /* Reading is paused */ +#define BCM2711_DMA40_WR_PAUSED BIT(5) /* Writing is paused */ +#define BCM2711_DMA40_DREQ_PAUSED BIT(6) /* Is paused by DREQ flow c= ontrol */ +#define BCM2711_DMA40_WAITING_FOR_WRITES BIT(7) /* Waiting for last write= */ +#define BCM2711_DMA40_ERR BIT(10) +#define BCM2711_DMA40_QOS(x) FIELD_PREP(GENMASK(19, 16), x) +#define BCM2711_DMA40_PANIC_QOS(x) FIELD_PREP(GENMASK(23, 20), x) +#define BCM2711_DMA40_WAIT_FOR_WRITES BIT(28) +#define BCM2711_DMA40_DISDEBUG BIT(29) +#define BCM2711_DMA40_ABORT BIT(30) +#define BCM2711_DMA40_HALT BIT(31) +// we always want to run in supervisor mode +#define BCM2711_DMA40_PROT (BIT(8) | BIT(9)) +#define BCM2711_DMA40_TRANSACTIONS BIT(25) +#define BCM2711_DMA40_CS_FLAGS(x) ((x) & (BCM2711_DMA40_QOS(15) | \ + BCM2711_DMA40_PANIC_QOS(15) | \ + BCM2711_DMA40_WAIT_FOR_WRITES | \ + BCM2711_DMA40_DISDEBUG)) + +/* Transfer information bits */ +#define BCM2711_DMA40_INTEN BIT(0) +#define BCM2711_DMA40_TDMODE BIT(1) /* 2D-Mode */ +#define BCM2711_DMA40_WAIT_RESP BIT(2) /* wait for AXI write to be = acked */ +#define BCM2711_DMA40_WAIT_RD_RESP BIT(3) /* wait for AXI read to comp= lete */ +#define BCM2711_DMA40_PER_MAP(x) (((x) & 31) << 9) /* REQ source */ +#define BCM2711_DMA40_S_DREQ BIT(14) /* enable SREQ for source */ +#define BCM2711_DMA40_D_DREQ BIT(15) /* enable DREQ for destinat= ion */ +#define BCM2711_DMA40_S_WAIT(x) FIELD_PREP(GENMASK(23, 16), x) /* a= dd DMA read-wait cycles */ +#define BCM2711_DMA40_D_WAIT(x) FIELD_PREP(GENMASK(31, 24), x) /* a= dd DMA write-wait cycles */ + +#define BCM2711_DMA40_INC BIT(12) +#define BCM2711_DMA40_IGNORE BIT(15) + /* the max dma length for different channels */ #define MAX_DMA_LEN SZ_1G #define MAX_LITE_DMA_LEN (SZ_64K - 4) =20 +/* debug register bits */ +#define BCM2711_DMA40_DEBUG_WRITE_ERR BIT(0) +#define BCM2711_DMA40_DEBUG_FIFO_ERR BIT(1) +#define BCM2711_DMA40_DEBUG_READ_ERR BIT(2) +#define BCM2711_DMA40_DEBUG_READ_CB_ERR BIT(3) +#define BCM2711_DMA40_DEBUG_IN_ON_ERR BIT(8) +#define BCM2711_DMA40_DEBUG_ABORT_ON_ERR BIT(9) +#define BCM2711_DMA40_DEBUG_HALT_ON_ERR BIT(10) +#define BCM2711_DMA40_DEBUG_DISABLE_CLK_GATE BIT(11) +#define BCM2711_DMA40_DEBUG_RSTATE_SHIFT 14 +#define BCM2711_DMA40_DEBUG_RSTATE_BITS 4 +#define BCM2711_DMA40_DEBUG_WSTATE_SHIFT 18 +#define BCM2711_DMA40_DEBUG_WSTATE_BITS 4 +#define BCM2711_DMA40_DEBUG_RESET BIT(23) +#define BCM2711_DMA40_DEBUG_ID_SHIFT 24 +#define BCM2711_DMA40_DEBUG_ID_BITS 4 +#define BCM2711_DMA40_DEBUG_VERSION_SHIFT 28 +#define BCM2711_DMA40_DEBUG_VERSION_BITS 4 + +/* Valid only for channels 0 - 3 (11 - 14) */ +#define BCM2711_DMA40_CHAN(n) (((n) + 11) << 8) /* Base address */ +#define BCM2711_DMA40_CHANIO(base, n) ((base) + BCM2711_DMA_CHAN(n)) + +/* the max dma length for different channels */ +#define MAX_DMA40_LEN SZ_1G + +#define BCM2711_DMA40_BURST_LEN(x) (((x) & 15) << 8) +#define BCM2711_DMA40_INC BIT(12) +#define BCM2711_DMA40_SIZE_32 (0 << 13) +#define BCM2711_DMA40_SIZE_64 (1 << 13) +#define BCM2711_DMA40_SIZE_128 (2 << 13) +#define BCM2711_DMA40_SIZE_256 (3 << 13) +#define BCM2711_DMA40_IGNORE BIT(15) +#define BCM2711_DMA40_STRIDE(x) ((x) << 16) /* For 2D mode */ + +#define BCM2711_DMA40_MEMCPY_FLAGS \ + (BCM2711_DMA40_QOS(0) | \ + BCM2711_DMA40_PANIC_QOS(0) | \ + BCM2711_DMA40_WAIT_FOR_WRITES | \ + BCM2711_DMA40_DISDEBUG) + +#define BCM2711_DMA40_MEMCPY_XFER_INFO \ + (BCM2711_DMA40_SIZE_128 | \ + BCM2711_DMA40_INC | \ + BCM2711_DMA40_BURST_LEN(16)) + static inline size_t bcm2835_dma_max_frame_length(struct bcm2835_chan *c) { /* lite and normal channels have different max frame length */ @@ -270,8 +383,7 @@ static inline struct bcm2835_chan *to_bcm2835_dma_chan(= struct dma_chan *c) return container_of(c, struct bcm2835_chan, vc.chan); } =20 -static inline struct bcm2835_desc *to_bcm2835_dma_desc( - struct dma_async_tx_descriptor *t) +static inline struct bcm2835_desc *to_bcm2835_dma_desc(struct dma_async_tx= _descriptor *t) { return container_of(t, struct bcm2835_desc, vd.tx); } @@ -296,9 +408,8 @@ static u32 bcm2835_dma_prepare_cb_info(struct bcm2835_c= han *c, result |=3D BCM2835_DMA_D_DREQ | BCM2835_DMA_S_INC; =20 /* non-lite channels can write zeroes w/o accessing memory */ - if (zero_page && !c->is_lite_channel) { + if (zero_page && !c->is_lite_channel) result |=3D BCM2835_DMA_S_IGNORE; - } } =20 return result; @@ -324,6 +435,66 @@ static u32 bcm2835_dma_prepare_cb_extra(struct bcm2835= _chan *c, return result; } =20 +static inline uint32_t to_bcm2711_ti(uint32_t info) +{ + return ((info & BCM2835_DMA_INT_EN) ? BCM2711_DMA40_INTEN : 0) | + ((info & BCM2835_DMA_WAIT_RESP) ? BCM2711_DMA40_WAIT_RESP : 0) | + ((info & BCM2835_DMA_S_DREQ) ? + (BCM2711_DMA40_S_DREQ | BCM2711_DMA40_WAIT_RD_RESP) : 0) | + ((info & BCM2835_DMA_D_DREQ) ? BCM2711_DMA40_D_DREQ : 0) | + BCM2711_DMA40_PER_MAP((info >> 16) & 0x1f); +} + +static inline uint32_t to_bcm2711_srci(uint32_t info) +{ + return ((info & BCM2835_DMA_S_INC) ? BCM2711_DMA40_INC : 0) | + ((info & BCM2835_DMA_S_WIDTH) ? BCM2711_DMA40_SIZE_128 : 0) | + BCM2711_DMA40_BURST_LEN(BCM2835_DMA_GET_BURST_LENGTH(info)); +} + +static inline uint32_t to_bcm2711_dsti(uint32_t info) +{ + return ((info & BCM2835_DMA_D_INC) ? BCM2711_DMA40_INC : 0) | + ((info & BCM2835_DMA_D_WIDTH) ? BCM2711_DMA40_SIZE_128 : 0) | + BCM2711_DMA40_BURST_LEN(BCM2835_DMA_GET_BURST_LENGTH(info)); +} + +static u32 bcm2711_dma_prepare_cb_info(struct bcm2835_chan *c, + enum dma_transfer_direction direction, + bool zero_page) +{ + u32 result =3D 0; + u32 info; + + info =3D bcm2835_dma_prepare_cb_info(c, direction, zero_page); + result =3D to_bcm2711_ti(info); + + return result; +} + +static u32 bcm2711_dma_prepare_cb_extra(struct bcm2835_chan *c, + enum dma_transfer_direction direction, + bool cyclic, bool final, + unsigned long flags) +{ + u32 result =3D 0; + + if (cyclic) { + if (flags & DMA_PREP_INTERRUPT) + result |=3D BCM2711_DMA40_INTEN; + } else { + if (!final) + return 0; + + result |=3D BCM2711_DMA40_INTEN; + + if (direction =3D=3D DMA_MEM_TO_MEM) + result |=3D BCM2711_DMA40_WAIT_RESP; + } + + return result; +} + static inline bool need_src_incr(enum dma_transfer_direction direction) { return direction !=3D DMA_DEV_TO_MEM; @@ -342,6 +513,12 @@ static inline bool need_dst_incr(enum dma_transfer_dir= ection direction) return false; } =20 +static inline uint32_t to_bcm2711_cbaddr(dma_addr_t addr) +{ + WARN_ON_ONCE(addr & 0x1f); + return (addr >> 5); +} + static inline u32 bcm2835_dma_cb_get_length(void *data) { struct bcm2835_dma_cb *cb =3D data; @@ -362,7 +539,7 @@ bcm2835_dma_cb_get_addr(void *data, enum dma_transfer_d= irection direction) =20 static inline void bcm2835_dma_cb_init(void *data, struct bcm2835_chan *c, - enum dma_transfer_direction direction, u32 src, u32 dst, + enum dma_transfer_direction direction, dma_addr_t src, dma_addr_t ds= t, bool zero_page) { struct bcm2835_dma_cb *cb =3D data; @@ -376,7 +553,7 @@ bcm2835_dma_cb_init(void *data, struct bcm2835_chan *c, =20 static inline void bcm2835_dma_cb_set_src(void *data, enum dma_transfer_direction direction, - u32 src) + dma_addr_t src) { struct bcm2835_dma_cb *cb =3D data; =20 @@ -385,7 +562,7 @@ bcm2835_dma_cb_set_src(void *data, enum dma_transfer_di= rection direction, =20 static inline void bcm2835_dma_cb_set_dst(void *data, enum dma_transfer_direction direction, - u32 dst) + dma_addr_t dst) { struct bcm2835_dma_cb *cb =3D data; =20 @@ -445,6 +622,124 @@ static u32 bcm2835_dma_cs_flags(struct bcm2835_chan *= c) return BCM2835_DMA_CS_FLAGS(c->dreq); } =20 +static inline u32 bcm2711_dma_cb_get_length(void *data) +{ + struct bcm2711_dma40_scb *scb =3D data; + + return scb->len; +} + +static inline dma_addr_t +bcm2711_dma_cb_get_addr(void *data, enum dma_transfer_direction direction) +{ + struct bcm2711_dma40_scb *scb =3D data; + + if (direction =3D=3D DMA_DEV_TO_MEM) + return (dma_addr_t)scb->dst + ((dma_addr_t)(scb->dsti & 0xff) << 32); + + return (dma_addr_t)scb->src + ((dma_addr_t)(scb->srci & 0xff) << 32); +} + +static inline void +bcm2711_dma_cb_init(void *data, struct bcm2835_chan *c, + enum dma_transfer_direction direction, dma_addr_t src, dma_addr_t ds= t, + bool zero_page) +{ + struct bcm2711_dma40_scb *scb =3D data; + u32 info =3D bcm2835_dma_prepare_cb_info(c, direction, zero_page); + + scb->ti =3D bcm2711_dma_prepare_cb_info(c, direction, zero_page); + + scb->src =3D lower_32_bits(src); + scb->srci =3D upper_32_bits(src); + scb->srci |=3D to_bcm2711_srci(info); + + scb->dst =3D lower_32_bits(dst); + scb->dsti =3D upper_32_bits(dst); + scb->dsti |=3D to_bcm2711_dsti(info); + + scb->next_cb =3D 0; +} + +static inline void +bcm2711_dma_cb_set_src(void *data, enum dma_transfer_direction direction, + dma_addr_t src) +{ + struct bcm2711_dma40_scb *scb =3D data; + + scb->src =3D lower_32_bits(src); + scb->srci =3D upper_32_bits(src); + + if (need_src_incr(direction)) + scb->srci |=3D BCM2711_DMA40_INC; +} + +static inline void +bcm2711_dma_cb_set_dst(void *data, enum dma_transfer_direction direction, + dma_addr_t dst) +{ + struct bcm2711_dma40_scb *scb =3D data; + + scb->dst =3D lower_32_bits(dst); + scb->dsti =3D upper_32_bits(dst); + + if (need_dst_incr(direction)) + scb->dsti |=3D BCM2711_DMA40_INC; +} + +static inline void bcm2711_dma_cb_set_next(void *data, u32 next) +{ + struct bcm2711_dma40_scb *scb =3D data; + + scb->next_cb =3D next; +} + +static inline void bcm2711_dma_cb_set_length(void *data, u32 length) +{ + struct bcm2711_dma40_scb *scb =3D data; + + scb->len =3D length; +} + +static inline void +bcm2711_dma_cb_append_extra(void *data, struct bcm2835_chan *c, + enum dma_transfer_direction direction, + bool cyclic, bool final, unsigned long flags) +{ + struct bcm2711_dma40_scb *scb =3D data; + + scb->ti |=3D bcm2711_dma_prepare_cb_extra(c, direction, cyclic, final, + flags); +} + +static inline dma_addr_t bcm2711_dma_to_cb_addr(dma_addr_t addr) +{ + WARN_ON_ONCE(addr & 0x1f); + return (addr >> 5); +} + +static void bcm2711_dma_chan_plat_init(struct bcm2835_chan *c) +{ +} + +static dma_addr_t bcm2711_dma_read_addr(struct bcm2835_chan *c, + enum dma_transfer_direction direction) +{ + if (direction =3D=3D DMA_MEM_TO_DEV) + return (dma_addr_t)readl(c->chan_base + BCM2711_DMA40_SRC) + + ((dma_addr_t)(readl(c->chan_base + BCM2711_DMA40_SRCI) & 0xff) << = 32); + else if (direction =3D=3D DMA_DEV_TO_MEM) + return (dma_addr_t)readl(c->chan_base + BCM2711_DMA40_DEST) + + ((dma_addr_t)(readl(c->chan_base + BCM2711_DMA40_DESTI) & 0xff) <<= 32); + + return 0; +} + +static u32 bcm2711_dma_cs_flags(struct bcm2835_chan *c) +{ + return BCM2711_DMA40_CS_FLAGS(c->dreq) | BCM2711_DMA40_PROT; +} + static void bcm2835_dma_free_cb_chain(struct bcm2835_desc *desc) { size_t i; @@ -470,36 +765,34 @@ static bool bcm2835_dma_create_cb_set_length(struct d= ma_chan *chan, const struct bcm2835_dma_cfg *cfg =3D to_bcm2835_cfg(chan->device); struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); size_t max_len =3D bcm2835_dma_max_frame_length(c); + u32 cb_len; =20 /* set the length taking lite-channel limitations into account */ - u32 length =3D min_t(u32, len, max_len); + cb_len =3D min_t(u32, len, max_len); =20 - cfg->cb_set_length(data, length); + if (period_len) { + /* + * period_len means: that we need to generate + * transfers that are terminating at every + * multiple of period_len - this is typically + * used to set the interrupt flag in info + * which is required during cyclic transfers + */ =20 - /* finished if we have no period_length */ - if (!period_len) - return false; + /* have we filled in period_length yet? */ + if (*total_len + cb_len < period_len) { + /* update number of bytes in this period so far */ + *total_len +=3D cb_len; + } else { + /* calculate the length that remains to reach period_len */ + cb_len =3D period_len - *total_len; =20 - /* - * period_len means: that we need to generate - * transfers that are terminating at every - * multiple of period_len - this is typically - * used to set the interrupt flag in info - * which is required during cyclic transfers - */ - - /* have we filled in period_length yet? */ - if (*total_len + length < period_len) { - /* update number of bytes in this period so far */ - *total_len +=3D length; - return false; + /* reset total_length for next period */ + *total_len =3D 0; + } } =20 - /* calculate the length that remains to reach period_length */ - cfg->cb_set_length(data, period_len - *total_len); - - /* reset total_length for next period */ - *total_len =3D 0; + cfg->cb_set_length(data, cb_len); =20 return true; } @@ -523,7 +816,7 @@ static inline size_t bcm2835_dma_count_frames_for_sg(st= ruct bcm2835_chan *c, /** * bcm2835_dma_create_cb_chain - create a control block and fills data in * - * @chan: the @dma_chan for which we run this + * @c: the @bcm2835_chan for which we run this * @direction: the direction in which we transfer * @cyclic: it is a cyclic transfer * @frames: number of controlblocks to allocate @@ -587,17 +880,19 @@ static struct bcm2835_desc *bcm2835_dma_create_cb_cha= in( =20 /* fill in the control block */ control_block =3D cb_entry->cb; - cfg->cb_init(control_block, c, src, dst, direction, zero_page); + + cfg->cb_init(control_block, c, direction, src, dst, zero_page); + /* set up length in control_block if requested */ if (buf_len) { /* calculate length honoring period_length */ - if (bcm2835_dma_create_cb_set_length( - chan, control_block, - len, period_len, &total_len)) { - /* add extrainfo bits in info */ - bcm2835_dma_cb_append_extra(control_block, c, - direction, cyclic, - false, flags); + if (bcm2835_dma_create_cb_set_length(chan, control_block, + len, period_len, + &total_len)) { + /* add extrainfo bits in info */ + bcm2835_dma_cb_append_extra(control_block, c, + direction, cyclic, + false, flags); } =20 /* calculate new remaining length */ @@ -607,11 +902,12 @@ static struct bcm2835_desc *bcm2835_dma_create_cb_cha= in( /* link this the last controlblock */ if (frame) cfg->cb_set_next(d->cb_list[frame - 1].cb, - cb_entry->paddr); + cfg->to_cb_addr(cb_entry->paddr)); =20 /* update src and dst and length */ if (src && need_src_incr(direction)) src +=3D cfg->cb_get_length(control_block); + if (dst && need_dst_incr(direction)) dst +=3D cfg->cb_get_length(control_block); =20 @@ -621,7 +917,7 @@ static struct bcm2835_desc *bcm2835_dma_create_cb_chain( =20 /* the last frame requires extra flags */ cfg->cb_append_extra(d->cb_list[d->frames - 1].cb, c, direction, cyclic, - true, flags); + true, flags); =20 /* detect a size mismatch */ if (buf_len && d->size !=3D buf_len) @@ -650,7 +946,8 @@ static void bcm2835_dma_fill_cb_chain_with_sg( =20 max_len =3D bcm2835_dma_max_frame_length(c); for_each_sg(sgl, sgent, sg_len, i) { - for (addr =3D sg_dma_address(sgent), len =3D sg_dma_len(sgent); + for (addr =3D sg_dma_address(sgent), + len =3D sg_dma_len(sgent); len > 0; addr +=3D cfg->cb_get_length(cb->cb), len -=3D cfg->cb_get_length(c= b->cb), cb++) { if (direction =3D=3D DMA_DEV_TO_MEM) @@ -662,48 +959,81 @@ static void bcm2835_dma_fill_cb_chain_with_sg( } } =20 -static void bcm2835_dma_abort(struct dma_chan *chan) +static void bcm2835_abort(struct bcm2835_chan *c, const struct bcm2835_dma= _cfg *cfg) { - const struct bcm2835_dma_cfg *cfg =3D to_bcm2835_cfg(chan->device); - struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); - void __iomem *chan_base =3D c->chan_base; - long timeout =3D 100; + long timeout =3D BCM2835_DMA_ABORT_TIMEOUT; =20 - /* - * A zero control block address means the channel is idle. - * (The ACTIVE flag in the CS register is not a reliable indicator.) - */ - if (!readl(chan_base + cfg->cb_reg)) - return; + /* Pause the current DMA */ + writel(readl(c->chan_base + cfg->cs_reg) & ~cfg->active_mask, + c->chan_base + cfg->cs_reg); + + /* wait for outstanding transactions to complete */ + while ((readl(c->chan_base + cfg->cs_reg) & BCM2711_DMA40_TRANSACTIONS) && + --timeout) + cpu_relax(); + + /* Peripheral might be stuck and fail to complete */ + if (!timeout) + dev_err(c->vc.chan.device->dev, + "failed to complete pause on dma %d (CS:%08x)\n", c->ch, + readl(c->chan_base + cfg->cs_reg)); + + /* Set CS back to default state */ + writel(BCM2711_DMA40_PROT, c->chan_base + cfg->cs_reg); + + /* Reset the DMA */ + writel(readl(c->chan_base + BCM2711_DMA40_DEBUG) | BCM2711_DMA40_DEBUG_RE= SET, + c->chan_base + BCM2711_DMA40_DEBUG); +} + +static void bcm2711_abort(struct bcm2835_chan *c, const struct bcm2835_dma= _cfg *cfg) +{ + long timeout =3D BCM2835_DMA_ABORT_TIMEOUT; =20 /* We need to clear the next DMA block pending */ - writel(0, chan_base + cfg->next_reg); + writel(0, c->chan_base + cfg->next_reg); =20 /* Abort the DMA, which needs to be enabled to complete */ - writel(readl(chan_base + cfg->cs_reg) | cfg->abort_mask | cfg->active_mas= k, - chan_base + cfg->cs_reg); + writel(readl(c->chan_base + cfg->cs_reg) | cfg->abort_mask | cfg->active_= mask, + c->chan_base + cfg->cs_reg); =20 /* wait for DMA to be aborted */ - while ((readl(chan_base + cfg->cs_reg) & cfg->abort_mask) && --timeout) + while ((readl(c->chan_base + cfg->cs_reg) & cfg->abort_mask) && --timeout) cpu_relax(); =20 /* Write 0 to the active bit - Pause the DMA */ - writel(readl(chan_base + cfg->cs_reg) & ~cfg->active_mask, - chan_base + cfg->cs_reg); + writel(readl(c->chan_base + cfg->cs_reg) & ~cfg->active_mask, + c->chan_base + cfg->cs_reg); =20 /* * Peripheral might be stuck and fail to complete * This is expected when dreqs are enabled but not asserted * so only report error in non dreq case */ - if (!timeout && !(readl(chan_base + cfg->ti_reg) & + if (!timeout && !(readl(c->chan_base + cfg->ti_reg) & (cfg->s_dreq_mask | cfg->d_dreq_mask))) dev_err(c->vc.chan.device->dev, "failed to complete pause on dma %d (CS:%08x)\n", c->ch, - readl(chan_base + cfg->cs_reg)); + readl(c->chan_base + cfg->cs_reg)); =20 /* Set CS back to default state and reset the DMA */ - writel(cfg->reset_mask, chan_base + cfg->cs_reg); + writel(cfg->reset_mask, c->chan_base + cfg->cs_reg); +} + +static void bcm2835_dma_abort(struct dma_chan *chan) +{ + const struct bcm2835_dma_cfg *cfg =3D to_bcm2835_cfg(chan->device); + struct bcm2835_chan *c =3D to_bcm2835_dma_chan(chan); + void __iomem *chan_base =3D c->chan_base; + + /* + * A zero control block address means the channel is idle. + * (The ACTIVE flag in the CS register is not a reliable indicator.) + */ + if (!readl(chan_base + cfg->cb_reg)) + return; + + cfg->dma_abort(c, cfg); } =20 static void bcm2835_dma_start_desc(struct dma_chan *chan) @@ -722,8 +1052,7 @@ static void bcm2835_dma_start_desc(struct dma_chan *ch= an) c->desc =3D to_bcm2835_dma_desc(&vd->tx); =20 writel(cfg->to_cb_addr(c->desc->cb_list[0].paddr), c->chan_base + cfg->cb= _reg); - writel(cfg->active_mask | cfg->cs_flags(c), - c->chan_base + cfg->cs_reg); + writel(cfg->active_mask | cfg->cs_flags(c), c->chan_base + cfg->cs_reg); } =20 static irqreturn_t bcm2835_dma_callback(int irq, void *data) @@ -1106,6 +1435,8 @@ static const struct bcm2835_dma_cfg bcm2835_data =3D { .s_dreq_mask =3D BCM2835_DMA_S_DREQ, .d_dreq_mask =3D BCM2835_DMA_D_DREQ, =20 + .dma_mask =3D DMA_BIT_MASK(32), + .cb_get_length =3D bcm2835_dma_cb_get_length, .cb_get_addr =3D bcm2835_dma_cb_get_addr, .cb_init =3D bcm2835_dma_cb_init, @@ -1120,10 +1451,47 @@ static const struct bcm2835_dma_cfg bcm2835_data = =3D { .chan_plat_init =3D bcm2835_dma_chan_plat_init, .read_addr =3D bcm2835_dma_read_addr, .cs_flags =3D bcm2835_dma_cs_flags, + .dma_abort =3D bcm2835_abort, +}; + +static const struct bcm2835_dma_cfg bcm2711_data =3D { + .addr_offset =3D BCM2711_DMA40_PHYS_ADDR, + + .cs_reg =3D BCM2711_DMA40_CS, + .cb_reg =3D BCM2711_DMA40_CB, + .next_reg =3D BCM2711_DMA40_NEXT_CB, + .ti_reg =3D BCM2711_DMA40_TI, + + .wait_mask =3D BCM2711_DMA40_WAITING_FOR_WRITES, + .reset_mask =3D BCM2711_DMA40_HALT, + .int_mask =3D BCM2711_DMA40_INTEN, + .active_mask =3D BCM2711_DMA40_ACTIVE, + .abort_mask =3D BCM2711_DMA40_ABORT, + .s_dreq_mask =3D BCM2711_DMA40_S_DREQ, + .d_dreq_mask =3D BCM2711_DMA40_D_DREQ, + + .dma_mask =3D DMA_BIT_MASK(36), + + .cb_get_length =3D bcm2711_dma_cb_get_length, + .cb_get_addr =3D bcm2711_dma_cb_get_addr, + .cb_init =3D bcm2711_dma_cb_init, + .cb_set_src =3D bcm2711_dma_cb_set_src, + .cb_set_dst =3D bcm2711_dma_cb_set_dst, + .cb_set_next =3D bcm2711_dma_cb_set_next, + .cb_set_length =3D bcm2711_dma_cb_set_length, + .cb_append_extra =3D bcm2711_dma_cb_append_extra, + + .to_cb_addr =3D bcm2711_dma_to_cb_addr, + + .chan_plat_init =3D bcm2711_dma_chan_plat_init, + .read_addr =3D bcm2711_dma_read_addr, + .cs_flags =3D bcm2711_dma_cs_flags, + .dma_abort =3D bcm2711_abort, }; =20 static const struct of_device_id bcm2835_dma_of_match[] =3D { { .compatible =3D "brcm,bcm2835-dma", .data =3D &bcm2835_data }, + { .compatible =3D "brcm,bcm2711-dma", .data =3D &bcm2711_data }, {}, }; MODULE_DEVICE_TABLE(of, bcm2835_dma_of_match); @@ -1147,6 +1515,7 @@ static struct dma_chan *bcm2835_dma_xlate(struct of_p= handle_args *spec, static int bcm2835_dma_probe(struct platform_device *pdev) { struct bcm2835_dmadev *od; + struct resource *res; void __iomem *base; int rc; int i, j; @@ -1154,34 +1523,38 @@ static int bcm2835_dma_probe(struct platform_device= *pdev) int irq_flags; u32 chans_available; char chan_name[BCM2835_DMA_CHAN_NAME_SIZE]; + int chan_count, chan_start, chan_end; =20 - const void *cfg_data =3D device_get_match_data(&pdev->dev); - if (!cfg_data) { - dev_err(&pdev->dev, "Failed to match compatible string\n"); - return -EINVAL; - } + od =3D devm_kzalloc(&pdev->dev, sizeof(*od), GFP_KERNEL); + if (!od) + return -ENOMEM; =20 - if (!pdev->dev.dma_mask) - pdev->dev.dma_mask =3D &pdev->dev.coherent_dma_mask; + od->cfg =3D device_get_match_data(&pdev->dev); + if (!od->cfg) { + dev_err(&pdev->dev, "Failed to match compatible string\n"); + return -EINVAL; + } =20 - rc =3D dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); + rc =3D dma_set_mask_and_coherent(&pdev->dev, od->cfg->dma_mask); if (rc) { dev_err(&pdev->dev, "Unable to set DMA mask\n"); return rc; } =20 - od =3D devm_kzalloc(&pdev->dev, sizeof(*od), GFP_KERNEL); - if (!od) - return -ENOMEM; - dma_set_max_seg_size(&pdev->dev, 0x3FFFFFFF); =20 - base =3D devm_platform_ioremap_resource(pdev, 0); + base =3D devm_platform_get_and_ioremap_resource(pdev, 0, &res); if (IS_ERR(base)) return PTR_ERR(base); =20 + /* The set of channels can be split across multiple instances. */ + chan_start =3D ((u32)(uintptr_t)base / BCM2835_DMA_CHAN_SIZE) & 0xf; + base -=3D BCM2835_DMA_CHAN(chan_start); + chan_count =3D resource_size(res) / BCM2835_DMA_CHAN_SIZE; + chan_end =3D min(chan_start + chan_count, + BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED + 1); + od->base =3D base; - od->cfg =3D cfg_data; =20 dma_cap_set(DMA_SLAVE, od->ddev.cap_mask); dma_cap_set(DMA_PRIVATE, od->ddev.cap_mask); @@ -1233,7 +1606,7 @@ static int bcm2835_dma_probe(struct platform_device *= pdev) } =20 /* get irqs for each channel that we support */ - for (i =3D 0; i <=3D BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED; i++) { + for (i =3D chan_start; i < chan_end; i++) { /* skip masked out channels */ if (!(chans_available & (1 << i))) { irq[i] =3D -1; @@ -1256,13 +1629,18 @@ static int bcm2835_dma_probe(struct platform_device= *pdev) irq[i] =3D platform_get_irq(pdev, i < 11 ? i : 11); } =20 + chan_count =3D 0; + /* get irqs for each channel */ - for (i =3D 0; i <=3D BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED; i++) { + for (i =3D chan_start; i < chan_end; i++) { /* skip channels without irq */ if (irq[i] < 0) continue; =20 /* check if there are other channels that also use this irq */ + /* FIXME: This will fail if interrupts are shared across + * instances + */ irq_flags =3D 0; for (j =3D 0; j <=3D BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED; j++) if (i !=3D j && irq[j] =3D=3D irq[i]) { @@ -1274,9 +1652,10 @@ static int bcm2835_dma_probe(struct platform_device = *pdev) rc =3D bcm2835_dma_chan_init(od, i, irq[i], irq_flags); if (rc) goto err_no_dma; + chan_count++; } =20 - dev_dbg(&pdev->dev, "Initialized %i DMA channels\n", i); + dev_dbg(&pdev->dev, "Initialized %i DMA channels\n", chan_count); =20 /* Device-tree DMA controller registration */ rc =3D of_dma_controller_register(pdev->dev.of_node, --=20 2.35.3 From nobody Sat Feb 7 23:12:25 2026 Received: from mail-ed1-f47.google.com (mail-ed1-f47.google.com [209.85.208.47]) (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 85F4254F8D for ; Wed, 13 Mar 2024 14:09:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338952; cv=none; b=q0TG9Ow1lGVV4zbH7POph7cPm1laYBeJOZp0EmFstrO6Q5ByPdhi7ftZvyTYWUE755UbtQwVOd6AQ1z03Rjirw+ioHhwl0IqTL5CUCGKzLQOPb7+vlAUfbKwaQvgFHWwEdoJeMLnZk4bYBgRb4d26HYS0Ckukfv3KnS5r98KGj8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710338952; c=relaxed/simple; bh=kVdZlNo+N/KnAT/Z2kOTskJN7eca2zSo5mLfoyTSMUY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fpjUd8GYpnrpyPwaYj7Ko6/gHdGmJZhrVbr25xCOznusESek8IejOi5YP0iA2YOhYzo93w/vGmsSP4L0tAdeMf/1OUhhNPUEbpo32IbIiWIyrGVtlqFJ8mD6v8RFPKdPo/U5JWIVmNYrwY9JdW/C3xXVTh+rcfN4iuKn/BIJFAk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=V30hA1Qa; arc=none smtp.client-ip=209.85.208.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="V30hA1Qa" Received: by mail-ed1-f47.google.com with SMTP id 4fb4d7f45d1cf-568307fe62eso7246721a12.1 for ; Wed, 13 Mar 2024 07:09:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1710338948; x=1710943748; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=GZRpUUNRnIq77pI2eAogF8VwCXAgFL/1g3LqDmhWq/Q=; b=V30hA1QaJl/pohCPP2spu8V8TnfLYQFGL9b5M9aaNJn6LFvmUsA9B6YAtWeBA/dpx7 Vgnay6FkJdGmznWb7C6LELOEq4djOfr/bORVf0z0Lxvu0kAS7Cbex0ToFx7BP9xlzq6k qlA/e706OyPG50TN2g/FJltK6NmkIXaQX73OqD8brHKlAuiLXi9WJ8o6hO2YYNRZlmsu wSxn5fxKAnwD/PE3LdxDv4R6qHoIaaO0niz0pt6dF4i9j/knuKyQHVj7G/zV1ypnEUgk C3XfUud7yj/AAOhUJBRuXmLs/TXr8ohGaMa+eh4R7oxRIaViMGFTWwqKWiywZLvbkDuJ BWLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710338948; x=1710943748; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=GZRpUUNRnIq77pI2eAogF8VwCXAgFL/1g3LqDmhWq/Q=; b=duaVrwrFJ/JPH8iAq+sZFa4Dqtp3Py/m//kX3ooFMnHSuT+wTRkdLJjyMH+IpK6++h khu4MciQZiqTQbPig6WqGReXL654jLxES29IDltv++MiR43HACVvtPo3UT3L8Iw1TmVG 510VrMQ/VHI42CSWZhZ0EMOEnrTdk9kEY4nRiBT0GOT402Fr6SGKTWsfs09Fn3mf0gpC lHO27i0ivIYpQH6l3yoxgiZfpGvgv9/81mM91MQtnLMPn/UO4kuIKuuzNmAIIwXBmftM K+xJ+pnuKI/JesRzlu+BKZGnLYU1sQLpKCwnmwv0LEbj7NtdeHX8Kmv3fnWVSSBPUpSN 6yPg== X-Forwarded-Encrypted: i=1; AJvYcCXyTN8i5/lb0+Ti2CtLMzSurj4XevbTrecS0Y/OfAjR22mckrw71fFML5S/YAY0sA8MJQMSHd9gvMaUTnWjyu/pl38Pk92BLAuEYLZd X-Gm-Message-State: AOJu0YxE4gcsGzIrRy/y/ADtFeXNHVBcPfZTYao1/fdGaATkf8hAfp2P MEHF/OqGBvZj79XU4s7p/WnmWs3vhFDHzOio/hnVDqmOuqphlbDHBKuf830gDuc= X-Google-Smtp-Source: AGHT+IHXP//swNkKDNyDphpeA3YlUW8pirt81Yn5DGc/hQTDcD01ShGZgqiYGBU6e4PUzoyKglVJzQ== X-Received: by 2002:a17:907:1819:b0:a46:5941:8927 with SMTP id lg25-20020a170907181900b00a4659418927mr1199309ejc.68.1710338947965; Wed, 13 Mar 2024 07:09:07 -0700 (PDT) Received: from localhost (host-82-56-173-172.retail.telecomitalia.it. [82.56.173.172]) by smtp.gmail.com with ESMTPSA id lf8-20020a170906ae4800b00a4657cad7e8sm701392ejb.127.2024.03.13.07.09.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Mar 2024 07:09:07 -0700 (PDT) From: Andrea della Porta To: Vinod Koul , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list , Saenz Julienne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, dave.stevenson@raspberrypi.com Cc: Phil Elwell , Maxime Ripard , Stefan Wahren , Dom Cobley , Andrea della Porta Subject: [PATCH v2 15/15] ARM: dts: bcm2711: add bcm2711-dma node Date: Wed, 13 Mar 2024 15:08:40 +0100 Message-ID: X-Mailer: git-send-email 2.44.0 In-Reply-To: References: 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 Content-Type: text/plain; charset="utf-8" BCM2711 has 4 DMA channels with a 40-bit address range, allowing them to access the full 4GB of memory on a Pi 4. Adding a new node to make use of the DMA channels capable of 40 bit addressing. Signed-off-by: Stefan Wahren Signed-off-by: Andrea della Porta --- arch/arm/boot/dts/broadcom/bcm2711.dtsi | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/arch/arm/boot/dts/broadcom/bcm2711.dtsi b/arch/arm/boot/dts/br= oadcom/bcm2711.dtsi index 22c7f1561344..d98e3cf0c569 100644 --- a/arch/arm/boot/dts/broadcom/bcm2711.dtsi +++ b/arch/arm/boot/dts/broadcom/bcm2711.dtsi @@ -552,6 +552,22 @@ scb { ranges =3D <0x0 0x7c000000 0x0 0xfc000000 0x03800000>, <0x6 0x00000000 0x6 0x00000000 0x40000000>; =20 + dma40: dma-controller@7e007b00 { + compatible =3D "brcm,bcm2711-dma"; + reg =3D <0x0 0x7e007b00 0x400>; + interrupts =3D , /* dma4 11 */ + , /* dma4 12 */ + , /* dma4 13 */ + ; /* dma4 14 */ + interrupt-names =3D "dma11", + "dma12", + "dma13", + "dma14"; + #dma-cells =3D <1>; + /* The VPU firmware uses DMA channel 11 for VCHIQ */ + brcm,dma-channel-mask =3D <0x7000>; + }; + pcie0: pcie@7d500000 { compatible =3D "brcm,bcm2711-pcie"; reg =3D <0x0 0x7d500000 0x9310>; --=20 2.35.3