Skip site navigation (1)Skip section navigation (2)
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>