ARM, Device Tree, ACPI, vc4, Grafikbeschleunigung, wie bitte?

0 views
Skip to first unread message

Marc Haber

unread,
Jun 15, 2021, 8:57:58 AM6/15/21
to
Hallo,

ich habe ein wenig Erfahrung mit dem Banana Pi und dem Raspberry Pi.
Das sind bislang meine einzigen Linuxe mit ARM-Prozessor (wenn man vom
Telefon und dem Tablet mal absieht, die zähle ich jetzt mal nicht
mit). Als Betriebssystem verwende ist Raspbian und Debian. Der Banana
Pi bootet über das von der SD-Karte eingelesene U-boot; beimRaspberry
Pi liest die GPU direkt den Linux-Kernel und das initramfs von der
SD-Karte in den Speicher und bootet von dort.

Wenn ich das richtig verstanden habe, nutzen beide Plattformen neben
dem Kernel liegende .dtb-Dateien, um einen zur Hardware passenden,
sogenannten Device Tree einzulesen, damit die zum Linux gehörenden
Treiber die von ihnen zu bedienende Hardware finden.

Für den Raspberry Pi 4 gibt es nun eine EFI-Firmware, so dass man die
vom PC gewöhnte Boot-Chain EFI => grub => Linux-Kernel verwenden kann.
das ist sowohl flexibler (weil man den Bootprozess kontrollieren kann)
als auch "schöner", weil man für die Installation von Debian den ganz
normalen Debian-Installer verwenden kann und nicht auf abenteuerliche
Methoden zur Erstellung klonbarer Images zurückgreifen muss. Die dafür
anwendbare Anleitung findet man unter
https://www.raspberrypi.org/forums/viewtopic.php?f=50&t=282839&start=75

Dort wird auch erwähnt, dass ein so gestarteter Linux-Kernel die
Hardware nicht über eine dtb-Datei sieht, sondern sie "ganz normal"
wie in der PC-Welt auch über ACPI präsentiert bekommt. Damit das
funktioniert, müssen die verwendeten Treiber passende ACPI-Bindings
haben (was auch immer das heißt), sonst sehen sie die Hardware nicht
(siehe im obigen Dokument, nach "What about other Pi 4 devices that
aren't supported yet" suchen).

Was genau bedeutet das? Wie kann ich feststellen, ob ein Treiber, der
bei einem konventionell gebooteten Raspberry Pi 4 funktoniert, auf
einem via EFI gebooteten jedoch nicht, ACPI Bindings hat oder nicht?
Wenn er keine hat, wie kompliziert ist es, welche hineinzupatchen?

Dummerweise ist der Treiber, der auf meinem Raspi 4 herumzickt
ausgerechnet der vc4-Treiber für dei Grafikbeschleunigung; mein Raspi
startet ohne den vc4-Treiber kein X11.

Grüße
Marc
--
-------------------------------------- !! No courtesy copies, please !! -----
Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " |
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834

Tim Ritberg

unread,
Jun 15, 2021, 1:17:20 PM6/15/21
to
Am 15.06.21 um 14:57 schrieb Marc Haber:
> Was genau bedeutet das? Wie kann ich feststellen, ob ein Treiber, der
> bei einem konventionell gebooteten Raspberry Pi 4 funktoniert, auf
> einem via EFI gebooteten jedoch nicht, ACPI Bindings hat oder nicht?
> Wenn er keine hat, wie kompliziert ist es, welche hineinzupatchen?
Ohne ganz groß Ahnung zu haben, vielleicht so:
find -name "*.c" -exec grep -l "ACPI_HANDLE" {} \;

Das Ergebnis hier: https://pastebin.com/L5yvZVvL
In der Tat scheint vc4 zu fehlen.

s. auch: https://www.kernel.org/doc/html/v5.6/arm64/arm-acpi.html

#include <linux/acpi.h> könnte auch ein Hinweis sein.

Tim

Marc Haber

unread,
Jun 17, 2021, 1:09:52 PM6/17/21
to
Tim Ritberg <t...@server.invalid> wrote:
>Am 15.06.21 um 14:57 schrieb Marc Haber:
>> Was genau bedeutet das? Wie kann ich feststellen, ob ein Treiber, der
>> bei einem konventionell gebooteten Raspberry Pi 4 funktoniert, auf
>> einem via EFI gebooteten jedoch nicht, ACPI Bindings hat oder nicht?
>> Wenn er keine hat, wie kompliziert ist es, welche hineinzupatchen?
>Ohne ganz groß Ahnung zu haben, vielleicht so:
>find -name "*.c" -exec grep -l "ACPI_HANDLE" {} \;

So einfach ist das leider nicht.

>Das Ergebnis hier: https://pastebin.com/L5yvZVvL
>In der Tat scheint vc4 zu fehlen.

Andererseits wird auch nichts im Verzeichnis
drivers/net/ethernet/broadcom/genet gefunden, obwohl der Treiber
bcmgenet (genet.ko) sogar automatisch geladen wird. Und funktioniert.

Ganz so einfach ist das wohl auch nicht.

>s. auch: https://www.kernel.org/doc/html/v5.6/arm64/arm-acpi.html

Das ist leider weit über meinem Niveau. Ich kann keinen Treiber
schreiben, und es geht auch über meine Kenntnisse hinaus, die
DT-Eigenschaften von dem Gerät aus den Treibersourcen herauszukratzen
und eine passende ACPI Table (sagt man das so?) zu schreiben. Die
einzige Sache, die ich aus dem Dokument lernen kann, ist, das man ich
mal acpi=off probieren könnte, in der Hoffnung, dass der Kernel dann
die Device Table nimmt, woraus direkt die Frage entsteht, wie ich dem
Kernel zeige, wo die DT liegt.

Bei einem "klassisch" bootenden RPi 4 muss das irgendwie "magisch"
durch die Firmware passieren, denn die dtb-Dateien sind in keiner der
Konfigurationsfiles in /etc/firmware erwähnt.

>#include <linux/acpi.h> könnte auch ein Hinweis sein.

Worauf?

Sieghard Schicktanz

unread,
Jun 17, 2021, 6:13:08 PM6/17/21
to
Hallo Marc,

Du schriebst am Thu, 17 Jun 2021 19:09:50 +0200:

> >In der Tat scheint vc4 zu fehlen.
>
> Andererseits wird auch nichts im Verzeichnis
> drivers/net/ethernet/broadcom/genet gefunden, obwohl der Treiber
> bcmgenet (genet.ko) sogar automatisch geladen wird. Und funktioniert.

Ist er evtl. in /lib/modules/<kver>/modules.builtin zu finden?
Das deutete darauf hin, daß er schon "vorgeladen" wäre.

--
(Weitergabe von Adressdaten, Telefonnummern u.ä. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder ähnlichem)
-----------------------------------------------------------
Mit freundlichen Grüßen, S. Schicktanz
-----------------------------------------------------------

Marc Haber

unread,
Jun 18, 2021, 2:04:25 AM6/18/21
to
Sieghard Schicktanz <Sieghard....@SchS.de> wrote:
>Du schriebst am Thu, 17 Jun 2021 19:09:50 +0200:
>> >In der Tat scheint vc4 zu fehlen.
>>
>> Andererseits wird auch nichts im Verzeichnis
>> drivers/net/ethernet/broadcom/genet gefunden, obwohl der Treiber
>> bcmgenet (genet.ko) sogar automatisch geladen wird. Und funktioniert.
>
>Ist er evtl. in /lib/modules/<kver>/modules.builtin zu finden?
>Das deutete darauf hin, daß er schon "vorgeladen" wäre.

Beide Module sind als .ko vorhanden und deswegen nicht in
modules.builtin gelistet. bcmgenet wird auch im ACPI-gebooteten System
automatisch geladen und funktioniert in beiden Systemen. vc4 wird auch
auf dem DT-System nicht automatisch geladen, funktioniert aber, wenn
man es manuell lädt. Auf dem ACPI-System wird das Modul geladen, loggt
nichts und funktioniert auch nicht.

Tim Ritberg

unread,
Jun 18, 2021, 2:58:16 AM6/18/21
to
Am 18.06.21 um 08:04 schrieb Marc Haber:

> Beide Module sind als .ko vorhanden und deswegen nicht in
> modules.builtin gelistet. bcmgenet wird auch im ACPI-gebooteten System
> automatisch geladen und funktioniert in beiden Systemen. vc4 wird auch
> auf dem DT-System nicht automatisch geladen, funktioniert aber, wenn
> man es manuell lädt. Auf dem ACPI-System wird das Modul geladen, loggt
> nichts und funktioniert auch nicht.
>

Ich nehme mal an vc4 kennt acpi nicht, die Header (acpi.h) sind ja auch
nicht eingebunden. Ich will mich da nicht festlegen.

Im Fall von genet wurde ein Eintrag in den AcpiTables gemacht, in Dsdt.asl


Tim

Marc Haber

unread,
Jun 27, 2021, 4:00:42 PM6/27/21
to
Tim Ritberg <t...@server.invalid> wrote:
>Am 18.06.21 um 08:04 schrieb Marc Haber:
>> Beide Module sind als .ko vorhanden und deswegen nicht in
>> modules.builtin gelistet. bcmgenet wird auch im ACPI-gebooteten System
>> automatisch geladen und funktioniert in beiden Systemen. vc4 wird auch
>> auf dem DT-System nicht automatisch geladen, funktioniert aber, wenn
>> man es manuell lädt. Auf dem ACPI-System wird das Modul geladen, loggt
>> nichts und funktioniert auch nicht.
>>
>
>Ich nehme mal an vc4 kennt acpi nicht, die Header (acpi.h) sind ja auch
>nicht eingebunden. Ich will mich da nicht festlegen.

Das kann ich inzwischen dank eines hardwarenäher arbeitenden Bekannten
bestätigen:
|./drivers/gpu/drm/vc4/vc4_drv.c
|
|static struct platform_driver vc4_platform_driver = {
|...
| .driver = {
| .name = "vc4-drm",
| .of_match_table = vc4_of_match,
| },
|};

Wenn ich das richtig verstanden habe, ist der DT-Eintrag für vc4 auch
nur ein Einzeiler:
|&vc4 {
| status = "okay";
|};
Oder arch/arm/boot/dts/bcm2711-rpi-4-b.dts ist der flasche Ort.
>Im Fall von genet wurde ein Eintrag in den AcpiTables gemacht, in Dsdt.asl
|static struct platform_driver bcmgenet_driver = {
|...
| .driver = {
| .name = "bcmgenet",
| .of_match_table = bcmgenet_match,
| .pm = &bcmgenet_pm_ops,
| .acpi_match_table = genet_acpi_match,
| },
|};

Jetzt müsste man nur noch jemanden kennen, der ACPI gut genug
beherrscht um einen ACPI-Eintrag für vc4 zu machen.
Reply all
Reply to author
Forward
0 new messages