Re: RPi4B's DMA11 (DMA4 engine example) vs. xHCI/pcie

Mark Millard via freebsd-arm <[email protected]>
Newsgroups gmane.os.freebsd.devel.arm
Message-ID <[email protected]>
On 2020-Sep-30, at 15:40, Mark Millard <marklmi at yahoo.com> wrote:

> On 2020-Sep-30, at 14:15, Robert Crowston <crowston at protonmail.com> wrote:
> 
>> Very interesting analysis. Certainly uncovered a few things I wasn't aware of.
>> 
>> By default sc->sc_bus.dma_bits in xhci_init is 64 bits; I toggle it back to 32 bits in the xhci shim I wrote for the Pi 4. You can see that output in a verbose dmesg.
>> 
> 
> My biggest worry from all that material, for things as they currently
> are, is that it appears that FreeBSD could try to use a RPi4B DMA LITE
> engine but not follow its limitations when doing so. For example,
> ending up using a smaller size DMA transfer than intended (just 16 bits
> for size). (Other RPi's might have the same issue?)

So I looked at BCM2835-ARM-Peripherals.pdf, comparing to
rpi_DATA_2711_1p0.pdf and:

BCM2835-ARM-Peripherals.pdf indicated DMA engines 7-14 are all
DMA LITE engines for the context it was covering. DMA 0-6 are
normal DMA engines.

So the RPi4B reduced the number of DMA LITE engines (now only 7-10)
and filled the removed slots (11-14) with the new type DMA4 engines.

So I learn from this some about how to interpret "brcm,bcm2835-dma"
as shown by what the RPi4B is doing:

                dma@7e007000 {
                        compatible = "brcm,bcm2835-dma";
                        reg = <0x7e007000 0x00000b00>;
                        interrupts = * 0x0000000007ef645c [0x00000084];
                        interrupt-names = "dma0", "dma1", "dma2", "dma3", "dma4", "dma5", "dma6", "dma7", "dma8", "dma9", "dma10";
                        #dma-cells = <0x00000001>;
                        brcm,dma-channel-mask = <0x000001f5>;
                        phandle = <0x0000000b>;
                };

The brcm,dma-channel-mask value and name list is different than in prior
examples of "brcm,bcm2835-dma" but the subset that is present follows the
original protocol. For example, how to tell DMA (normal) from DMA LITE
works the same [a debug register bit to check] --but only within the subset
present.

Seeing "brcm,bcm2835-dma" should not lead to presuming some fixed number of
interrupts or dma-channels to process.

The protocol for DMA (normal) vs. DMA LITE does not even apply to
the new RPi4B DMA4 engines (11-14):

                dma@7e007b00 {
                        compatible = "brcm,bcm2711-dma";
                        reg = <0x00000000 0x7e007b00 0x00000000 0x00000400>;
                        interrupts = <0x00000000 0x00000059 0x00000004 0x00000000 0x0000005a 0x00000004 0x00000000 0x0000005b 0x00000004 0x00000000 0x0000005c 0x00000004>;
                        interrupt-names = "dma11", "dma12", "dma13", "dma14";
                        #dma-cells = <0x00000001>;
                        brcm,dma-channel-mask = <0x00007000>;
                        phandle = <0x0000003d>;
                };

11-14 have a new, distinct protocol in various respects.


===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)

_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-arm
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.