Port-arm archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Raspberry Pi 4 support on 32 bit earmv7hf GENERIC kernel
> tsutsui%ceres.dti.ne.jp@localhost (Izumi Tsutsui) writes:
>
> >> >I'm not familiar FDT or Raspberry Pi firmware, but ofctl says:
> >>
> >> Yes. It has been deleted in "our" dtb file.
>
> >Sorry, I don't see your point. What's your actual suggestion?
> >To revert some NetBSD's change in dts files??
>
>
> My point is that with a suitable fdt, you already have support
> for the framebuffer. That's the easiest way and works since
> many years.
>
> % ofctl -p /soc/fb
> [Caching 235 nodes and 1235 properties]
> compatible 6272636d 2c62636d 32383335 2d666200 "brcm,bcm2835-fb"
> name 666200.. ........ ........ ........ "fb"
> phandle 0000008f ........ ........ ........ ....
> status 6f6b00.. ........ ........ ........ ok.
>
> genfb0 at simplebus1: switching to framebuffer console
I think there may still be two different framebuffer paths mixed
together here.
I understand the point about /soc/fb and brcm,bcm2835-fb, but
when I look at the current DTS files in src/sys/external/gpl2/dts,
"brcm,bcm2835-fb" comes only from bcm2835-common.dtsi:
---
% grep bcm2835-fb *
bcm2835-common.dtsi: compatible = "brcm,bcm2835-fb";
mirage-% grep bcm2835-common.dtsi *
bcm2835.dtsi:#include "bcm2835-common.dtsi"
bcm2836.dtsi:#include "bcm2835-common.dtsi"
bcm2837.dtsi:#include "bcm2835-common.dtsi"
mirage-% egrep 'bcm283[567]\.dtsi' *
bcm2835-rpi-a-plus.dts:#include "bcm2835.dtsi"
bcm2835-rpi-a.dts:#include "bcm2835.dtsi"
bcm2835-rpi-b-plus.dts:#include "bcm2835.dtsi"
bcm2835-rpi-b-rev2.dts:#include "bcm2835.dtsi"
bcm2835-rpi-b.dts:#include "bcm2835.dtsi"
bcm2835-rpi-cm1.dtsi:#include "bcm2835.dtsi"
bcm2835-rpi-zero-w.dts:#include "bcm2835.dtsi"
bcm2835-rpi-zero.dts:#include "bcm2835.dtsi"
bcm2836-rpi-2-b.dts:#include "bcm2836.dtsi"
bcm2837-rpi-3-a-plus.dts:#include "bcm2837.dtsi"
bcm2837-rpi-3-b-plus.dts:#include "bcm2837.dtsi"
bcm2837-rpi-3-b.dts:#include "bcm2837.dtsi"
bcm2837-rpi-cm3.dtsi:#include "bcm2837.dtsi"
bcm2837-rpi-zero-2-w.dts:#include "bcm2837.dtsi"
bcm283x.dtsi: * bcm2835.dtsi and bcm2836.dtsi.
%
---
For Raspberry Pi 4 (with BCM2711):
- bcm2711-rpi-4-b.dts includes bcm2711.dtsi
- bcm2711-rpi-400.dts includes bcm2711-rpi-4-b.dts
- bcm2711-rpi-cm4.dtsi includes bcm2711.dtsi
- bcm2711-rpi-cm4-io.dts includes bcm2711-rpi-cm4.dtsi
I do not see any "brcm,bcm2835-fb" node in that bcm2711 DTS paths.
There is no override .dts file for rpi-4/bcm2711 variants in
src/sys/arch/arm/dts/ either:
https://nxr.netbsd.org/xref/src/sys/arch/arm/dts/
So, at least from what I can see in the current tree,
this still looks like a separate /chosen/simple-framebuffer
enumeration issue on RPi4. What I am tryingto handle in this
thread is this simple-framebuffer case.
As noted in my past post, Raspberry Pi 4 firmware (start4.elf)
populates /chosen dynamically, places "simple-framebuffer" under it,
and also gives "/chosen" node the non-standard compatible string
"simple_bus".
Currently fdt_match() in src/sys/dev/fdt/fdtbus.c matches
compatible "simple-bus" or "/chosen node without a compatible property"
so "/chosen" with compatible string "simple_bus" in this rpi-4 case
is not attached as simplebus.
That is why the patch below only extends the existing /chosen
special case to cover /chosen with compatible "simple_bus".
https://github.com/NetBSD/src/commit/8d680e0d7b993a09afb7234286cf48554f824e24
---
diff --git a/sys/dev/fdt/fdtbus.c b/sys/dev/fdt/fdtbus.c
index e557b0c6479a..828b673353a8 100644
--- a/sys/dev/fdt/fdtbus.c
+++ b/sys/dev/fdt/fdtbus.c
@@ -93,6 +93,11 @@ static const struct device_compatible_entry compat_data[] = {
DEVICE_COMPAT_EOL
};
+static const struct device_compatible_entry chosen_compat_data[] = {
+ { .compat = "simple_bus" },
+ DEVICE_COMPAT_EOL
+};
+
CFATTACH_DECL2_NEW(simplebus, sizeof(struct fdt_softc),
fdt_match, fdt_attach, NULL, NULL, fdt_rescan, fdt_childdet);
@@ -116,6 +121,15 @@ fdt_match(device_t parent, cfdata_t cf, void *aux)
return 1;
}
+ /*
+ * Raspberry Pi 4 firmware (start4.elf) may populate /chosen node
+ * dynamically and set a non-standard compatible string "simple_bus".
+ * Treat that case like the existing /chosen special case above.
+ */
+ if (OF_finddevice("/chosen") == phandle &&
+ of_compatible_match(phandle, chosen_compat_data))
+ return 1;
+
/* Always match the root node */
return OF_finddevice("/") == phandle;
}
---
If there is another bcm2711-side framebuffer path I should be
looking at instead, I would appreciate a pointer. Otherwise,
unless there are objections, I am inclined to proceed with
this narrow /chosen-specific workaround.
Thanks,
---
Izumi Tsutsui
Home |
Main Index |
Thread Index |
Old Index