RPi4B: emmc2bus dma-range handling does not track the boot-time-FDT (u-boot based booting)

Mark Millard via freebsd-arm <[email protected]>
Newsgroups gmane.os.freebsd.devel.arm
Message-ID <[email protected]>
sys/gnu/dts/arm/bcm2711.dtsi reports:

        /*
         * emmc2 has different DMA constraints based on SoC revisions. It was
         * moved into its own bus, so as for RPi4's firmware to update them.
         * The firmware will find whether the emmc2bus alias is defined, and if
         * so, it'll edit the dma-ranges property below accordingly.
         */
        emmc2bus: emmc2bus {
                compatible = "simple-bus";
                #address-cells = <2>;
                #size-cells = <1>;
                
                ranges = <0x0 0x7e000000  0x0 0xfe000000  0x01800000>;
                dma-ranges = <0x0 0xc0000000  0x0 0x00000000  0x40000000>;
                        
                emmc2: emmc2@7e340000 {
                        compatible = "brcm,bcm2711-emmc2";
                        reg = <0x0 0x7e340000 0x100>;
                        interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&clocks BCM2711_CLOCK_EMMC2>;
                        status = "disabled";
                };
        };


The old u-boot/DTB combination in use does not have emmc2bus.
And, even if it did, FreeBSD would not use the dma-ranges
content, expecting it to not vary within the RPi4B family.
Relative to "lowaddr", for example, there is:

#define       BCM2838_PERIPH_MAXADDR          0x3fffffff

(the emmc2bus dma-ranges' size_cell_value-1 for the text
above).

sys/arm/broadcom/bcm2835/bcm2835_sdhci.c does list brcm,bcm2711-emmc2 in
its compat_data:

static struct ofw_compat_data compat_data[] = {
        {"broadcom,bcm2835-sdhci",      (uintptr_t)&bcm2835_sdhci_conf},
        {"brcm,bcm2835-sdhci",          (uintptr_t)&bcm2835_sdhci_conf},
        {"brcm,bcm2835-mmc",            (uintptr_t)&bcm2835_sdhci_conf},
        {"brcm,bcm2711-emmc2",          (uintptr_t)&bcm2838_emmc2_conf},
        {"brcm,bcm2838-emmc2",          (uintptr_t)&bcm2838_emmc2_conf},
        {NULL,                          0}
};

where BCM2838_PERIPH_MAXADDR is picked out based on:
(from sys/arm/broadcom/bcm2835/bcm2835_vcbus.c)

static struct bcm283x_memory_soc_cfg {
        struct bcm283x_memory_mapping   *memmap;
        const char                      *soc_compat;
        bus_addr_t                       busdma_lowaddr;
} bcm283x_memory_configs[] = {
. . .
        {
                .memmap = bcm2838_memmap,
                .soc_compat = "brcm,bcm2711",
                .busdma_lowaddr = BCM2838_PERIPH_MAXADDR,
        },
        {
                .memmap = bcm2838_memmap,
                .soc_compat = "brcm,bcm2838",
                .busdma_lowaddr = BCM2838_PERIPH_MAXADDR,
        },
};

(I've not found tracking of SoC revisions. But I also do
not know what varies across which SoC revisions. So far
as I know, the few I have access to have a uniform
structure.)

===
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.