Date: Mon, 28 Sep 2020 18:29:56 -0700 From: Mark Millard <marklmi@yahoo.com> To: Robert Crowston <crowston@protonmail.com>, freebsd-arm <freebsd-arm@freebsd.org> Subject: RPi4B's DMA11 (DMA4 engine example) vs. xHCI/pcie Message-ID: <8C6DE44F-6CE2-4C74-8748-3BBFB54AE183@yahoo.com> References: <8C6DE44F-6CE2-4C74-8748-3BBFB54AE183.ref@yahoo.com>
next in thread | previous in thread | raw e-mail | index | archive | help
[Be warned that the material is not familiar so I may need educating. THis is based ont he example context that I happen to have around.] In the u-boot fdt print / output there are 2 distinct sets of dma = channel information, 1 for soc and 1 for scb, where the dma_tag values for the = two sets should be distinct as far as I can tell: U-Boot> fdt address 0x7ef1000 U-Boot> fdt print / =20 / { . . . soc { dma@7e007000 { compatible =3D "brcm,bcm2835-dma"; reg =3D <0x7e007000 0x00000b00>; interrupts =3D * 0x0000000007ef645c = [0x00000084]; interrupt-names =3D "dma0", "dma1", "dma2", = "dma3", "dma4", "dma5", "dma6", "dma7", "dma8", "dma9", "dma10"; #dma-cells =3D <0x00000001>; brcm,dma-channel-mask =3D <0x000001f5>; phandle =3D <0x0000000b>; }; scb { . . . dma@7e007b00 { compatible =3D "brcm,bcm2711-dma"; reg =3D <0x00000000 0x7e007b00 0x00000000 = 0x00000400>; interrupts =3D <0x00000000 0x00000059 0x00000004 = 0x00000000 0x0000005a 0x00000004 0x00000000 0x0000005b 0x00000004 = 0x00000000 0x0000005c 0x00000004>; interrupt-names =3D "dma11", "dma12", "dma13", = "dma14"; #dma-cells =3D <0x00000001>; brcm,dma-channel-mask =3D <0x00007000>; phandle =3D <0x0000003d>; }; . . . So, 0 through 10 need the soc criteria (mix of DMA and DMA LITE engine = criteria) and 11 through 14 need the scb criteria (DMA4 engine criteria). (I'm = ignore dma-channel-mask's at this point.) I'll here note the code has: #define BCM_DMA_CH_MAX 12 for use in code like: /* setup initial settings */ for (i =3D 0; i < BCM_DMA_CH_MAX; i++) { ch =3D &sc->sc_dma_ch[i]; bzero(ch, sizeof(struct bcm_dma_ch)); ch->ch =3D i; ch->flags =3D BCM_DMA_CH_UNMAP; if ((bcm_dma_channel_mask & (1 << i)) =3D=3D 0) continue; . . . It looks to me like the only scb/DMA4-engine "dma11" is covered by such loops and that the "brcm,dma-channel-mask =3D <0x00007000>" means that dma11 will not be used. So: No scb/DMA4 engine will be used??? (That could explain the 1 GiByte limit?) rpi_DATA_2711_1p0.pdf reports that soc/0-10 have 2 types (0-6 vs. 7-10 as it turns out) as well as the scb/DM4-engines (11-14): QUOTE (with omitted marked by ". . .") . . . The BCM2711 DMA Controller provides a total of 16 DMA channels. Four of = these are DMA Lite channels (with reduced performance and features), and = four of them are DMA4 channels (with increased performance and a wider = address range). . . . 4.5. DMA LITE Engines Several of the DMA engines are of the LITE design. This is a reduced = specification engine designed to save space. The engine behaves in the = same way as a normal DMA engine except for the following differences: . . . =E2=80=A2 The DMA length register is now 16 bits, limiting the = maximum transferable length to 65536 bytes. . . . 4.6. DMA4 Engines Several of the DMA engines are of the DMA4 design. These have higher = performance due to their uncoupled read/write design and can access up = to 40 address bits. Unlike the other DMA engines they are also capable = of performing write bursts. Note that they directly access the full = 35-bit address bus of the BCM2711 and so bypass the paging registers of = the DMA and DMA Lite engines. DMA channel 11 is additionally able to access the PCIe interface. END QUOTE The register map indicates (with some extra notes added): 0-6: DMA 7-10: DMA LITE (65536 bytes limit, for example) 11-14: DMA4 (11 is special relative to "PCIe interface") ("DMA Channel 15 is exclusively used by the VPU.") Yet what I see in the head -r365932 code is: #define BCM_DMA_CH_MAX 12 . . . struct bcm_dma_softc { device_t sc_dev; struct mtx sc_mtx; struct resource * sc_mem; struct resource * sc_irq[BCM_DMA_CH_MAX]; void * sc_intrhand[BCM_DMA_CH_MAX]; struct bcm_dma_ch sc_dma_ch[BCM_DMA_CH_MAX]; bus_dma_tag_t sc_dma_tag; }; . . . err =3D bus_dma_tag_create(bus_get_dma_tag(dev), 1, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, sizeof(struct bcm_dma_cb), 1, sizeof(struct bcm_dma_cb), BUS_DMA_ALLOCNOW, NULL, NULL, &sc->sc_dma_tag); As an example: does that deal with the likes of DMA LITE (so 7-10) = "limiting the maximum transferable length to 65536 bytes"? As another example: Does it deal with the DMA4 (11-14) distinctions (if such were in use anyway)? For reference from the fdt print / : / { . . . #address-cells =3D <0x00000002>; #size-cells =3D <0x00000001>; . . . soc { compatible =3D "simple-bus"; #address-cells =3D <0x00000001>; #size-cells =3D <0x00000001>; . . . dma-ranges =3D <0xc0000000 0x00000000 0x00000000 = 0x40000000>; . . . firmware { compatible =3D "raspberrypi,bcm2835-firmware", = "simple-bus"; mboxes =3D <0x0000001c>; dma-ranges; . . . emmc2bus { compatible =3D "simple-bus"; #address-cells =3D <0x00000002>; #size-cells =3D <0x00000001>; . . . dma-ranges =3D <0x00000000 0xc0000000 0x00000000 = 0x00000000 0x40000000>; . . . scb { compatible =3D "simple-bus"; #address-cells =3D <0x00000002>; #size-cells =3D <0x00000002>; . . . dma-ranges =3D <0x00000000 0x00000000 0x00000000 = 0x00000000 0x00000000 0xfc000000 0x00000001 0x00000000 0x00000001 = 0x00000000 0x00000001 0x00000000>; . . . pcie@7d500000 { compatible =3D "brcm,bcm2711-pcie"; . . . #address-cells =3D <0x00000003>; . . . #size-cells =3D <0x00000002>; . . . dma-ranges =3D <0x02000000 0x00000000 0x00000000 = 0x00000000 0x00000000 0x00000000 0xc0000000>; . . . v3dbus { compatible =3D "simple-bus"; #address-cells =3D <0x00000001>; #size-cells =3D <0x00000002>; . . . dma-ranges =3D <0x00000000 0x00000000 0x00000000 = 0x00000004 0x00000000>; . . . =3D=3D=3D Mark Millard marklmi at yahoo.com ( dsl-only.net went away in early 2018-Mar)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?8C6DE44F-6CE2-4C74-8748-3BBFB54AE183>