Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 8 Oct 2020 13:15:49 -0700
From:      Mark Millard <marklmi@yahoo.com>
To:        Kyle Evans <kevans@freebsd.org>
Cc:        freebsd-arm <freebsd-arm@freebsd.org>
Subject:   Re: RPi4B: emmc2bus dma-range handling does not track the boot-time-FDT (u-boot based booting)
Message-ID:  <68AC0E4E-0469-46AE-BD68-058DCB6B078F@yahoo.com>
In-Reply-To: <CACNAnaHwAyw=6tiOC12WH9BBcj5FDZzDGxoh0UJw9KL0HE206g@mail.gmail.com>
References:  <D8BDF95A-D6A8-4E95-A0CE-D53068E8355B.ref@yahoo.com> <D8BDF95A-D6A8-4E95-A0CE-D53068E8355B@yahoo.com> <CACNAnaG3CKTiXdXNUO1Jgr34=XGF4wYRuUnuiJRhNb1J9XaGbw@mail.gmail.com> <CACNAnaEZP=Gxs4cbvCOFzM8MZB6-2Ny0N7KEW-nYoDw22_Jzwg@mail.gmail.com> <CACNAnaFXpJcA5Xyw%2BPR6iem3U2nvpog53hsnCFKiGWiO6OgKKA@mail.gmail.com> <32A8A046-56DF-4998-9C3D-8630ACCE4951@yahoo.com> <CACNAnaHwAyw=6tiOC12WH9BBcj5FDZzDGxoh0UJw9KL0HE206g@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help


On 2020-Oct-8, at 12:32, Kyle Evans <kevans at freebsd.org> wrote:

> On Thu, Oct 8, 2020 at 2:28 PM Mark Millard <marklmi at yahoo.com> =
wrote:
>>=20
>>=20
>>=20
>> On 2020-Oct-8, at 11:34, Kyle Evans <kevans at freebsd.org> wrote:
>>=20
>>> On Thu, Oct 8, 2020 at 12:38 PM Kyle Evans <kevans@freebsd.org> =
wrote:
>>>>=20
>>>> On Thu, Oct 8, 2020 at 11:33 AM Kyle Evans <kevans@freebsd.org> =
wrote:
>>>>>=20
>>>>> On Thu, Oct 8, 2020 at 4:01 AM Mark Millard via freebsd-arm
>>>>> <freebsd-arm@freebsd.org> wrote:
>>>>>>=20
>>>>>> sys/gnu/dts/arm/bcm2711.dtsi reports:
>>>>>>=20
>>>>>>       /*
>>>>>>        * 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.
>>>>>>        */
>>>>>> [... snip ...]
>>>>>=20
>>>>> I have no words for how annoying this is.
>>>>>=20
>>>>=20
>>>> For a slightly more helpful response:
>>>>=20
>>>> We can fix this, and it ends up being much cleaner than my current
>>>> hack. Basically, in bcm2835_vcbus.c, we should eradicate the
>>>> busdma_lowaddr from bcm283x_memory_soc_cfg.
>>>>=20
>>>> bcm283x_dmabus_peripheral_lowaddr should instead take a device_t =
and
>>>> grab the bus's dma-ranges. It /looks/ to be valid on all the DTS I =
see
>>>> for the RPi boards we support, so we can just unconditionally use =
that
>>>> and things will just work for the newer RPi4 models.
>>>>=20
>>>> =46rom my discussion (with an assist Ian on address interpretation) =
on
>>>> IRC, so I don't forget:
>>>>=20
>>>> dma-ranges is three-value: <dma_addr cpu_addr max_len>
>>=20
>> Note: For the below I looked at 3 separate RPi4B
>> examples, using u-boot print fdt / when I could
>> or translating the dtb to a dts otherwise. One
>> of the examples is from one of ubuntu 2020.04.1's
>> RPi4B specific builds. The others I use with FreeBSD,
>> one for u-boot and one for uefi/ACPI.
>>=20
>> (
>>=20
>> cpu_addr is sized via the global:
>>=20
>> /  {
>>=20
>>        #address-cells =3D <0x2>;
>>=20
>> and the dma_addr and max_len by more local definitions,
>> such as in:
>>=20
>>                #address-cells =3D <0x1>;
>>                #size-cells =3D <0x1>;
>>                compatible =3D "simple-bus";
>>                dma-ranges =3D <0xc0000000 0x0 0x0 0x40000000>;
>>=20
>> and:
>>=20
>>                #address-cells =3D <0x2>;
>>                #size-cells =3D <0x2>;
>>                compatible =3D "simple-bus";
>>                dma-ranges =3D <0x0 0x0 0x0 0x0 0x4 0x0>;
>>=20
>> Note that the above has #size-cells varying when:
>> 4 <=3D number of cells in dma-range . There will be
>> worse cases later, below.
>>=20
>> and:
>>=20
>>                        #address-cells =3D <0x3>;
>>                        #interrupt-cells =3D <0x1>;
>>                        #size-cells =3D <0x2>;
>>                        . . .
>>                        dma-ranges =3D <0x2000000 0x0 0x0 0x0 0x0 0x0 =
0xc0000000>;
>>=20
>> (The #address-cells being 3 indicates a bit mask as the first of the =
3,
>> the bit mask indicating extra information about the context.)
>>=20
>> and:
>>=20
>>                #address-cells =3D <0x2>;
>>                #size-cells =3D <0x1>;
>>                compatible =3D "simple-bus";
>>                dma-ranges =3D <0x0 0xc0000000 0x0 0x0 0x40000000>;
>>=20
>> and:
>>=20
>>                #address-cells =3D <0x1>;
>>                #size-cells =3D <0x2>;
>>                compatible =3D "simple-bus";
>>                dma-ranges =3D <0x0 0x0 0x0 0x4 0x0>;
>>=20
>> Note that for the last 2 examples above the number of cells
>> in the dma-range (5) is not sufficient to indicate the value
>> for #size-cells or #(dma-addr-cells) without presuming some
>> other context to disambiguate.
>>=20
>>=20
>> There is also an example of just:
>>=20
>>                        dma-ranges;
>>=20
>> (in firmware { . . . }).
>>=20
>>>> We'll see 4 and 5 value variants of this because 64-bit addresses =
are
>>>> described with pairs of 32-bit values.
>>>>=20
>>>> 4-value variant: dma_addr will be 32-bit, cpu_addr will be 64-bit
>>>> 5-value variant: both are 64-bit
>>=20
>> There is an example shown above with 5-value having #size_cells
>> being 1 (32-bit) [and dma-addr being 64 bit (cells 2)] instead of
>> #size_cells being 2 (64-bit) [and dma_addr being 32-bit (cells 1)].
>>=20
>>>> Note that bcm283x_dmabus_peripheral_lowaddr() will be returning
>>>> cpu_addr + (max_len - 1)
>>>>=20
>>>> This won't match perfectly with what we currently return, but it =
will
>>>> be more accurate.
>>>=20
>>> Here's a patch that I hacked out and can't test for quite a while =
yet,
>>> feel free to give it a shot:
>>> https://people.freebsd.org/~kevans/bcm2835_vcbus.diff  -- the best
>>> guarantee I can give you is that it builds. We'll need to test it on
>>> both RPi4 models with the separate bus and the original RPi4s, as =
well
>>> as an RPi3 and RPi2/0w.
>>=20
>> See above about trying to use the number of cells in a dma-ranges
>> to figure out the sizes of #size-cells or #(dma-addr-cells).
>>=20
>=20
> Yeah, Ian pointed out just a little bit ago the way this should be
> done correctly. The hacky patch should at least get it correct enough
> for now, then I can write a more generic version of dma-ranges parsing
> that does it correctly.

Okay.

Another type of overall issue (that may not apply to
the specific context here) is dtb content like:

        scb {
                compatible =3D "simple-bus";
                #address-cells =3D <0x00000002>;
                #size-cells =3D <0x00000002>;
                ranges =3D * 0x0000000007ef8a18 [0x00000060];
                dma-ranges =3D <0x00000000 0x00000000 0x00000000 =
0x00000000 0x00000000 0xfc000000 0x00000001 0x00000000 0x00000001 =
0x00000000 0x00000001 0x00000000>;
                phandle =3D <0x000000d0>;
                pcie@7d500000 {
                        compatible =3D "brcm,bcm2711-pcie";
                        . . .
                        #address-cells =3D <0x00000003>;
                        #interrupt-cells =3D <0x00000001>;
                        #size-cells =3D <0x00000002>;
                        . . .
                        dma-ranges =3D <0x02000000 0x00000000 0x00000000 =
0x00000000 0x00000000 0x00000000 0xc0000000>;
                        . . .
                };
                . . .

where the inner most dma-ranges is not from the just-surrounding
context (parent) but is strictly local (despite the parent
potentially also having dma-ranges). I think that only pcie@...
is that way so far for the RPi4 --but notationally it seems to
be generally allowed.

=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?68AC0E4E-0469-46AE-BD68-058DCB6B078F>