Daniel Almeida, Videocodec-Entwickler bei Collabora, hat auf der Linux-Kernel-Entwickler-Mailingliste eine erste Implementierung des Tyr-Treibers für ARM Mali-GPUs mit Command Stream Frontend (CSF)-Technologie, wie die Mali G310, G510 und G710, veröffentlicht. Der Treibercode ist in Rust geschrieben und umfasst etwas mehr als 600 Zeilen. Der Tyr-Treiber wird gemeinsam von Collabora, Arm und Google entwickelt.
Das Framework zur Erstellung des neuen Treibers verwendet Komponenten des abstrakten rust_platform_driver-Treibers und des Nova-Treibers, der für NVIDIA-GPUs entwickelt, in Rust geschrieben und teilweise dem 6.15-Kernel hinzugefügt wurde. Die Funktionalität für die Interaktion mit der Mali-GPU wird vom bestehenden Panthor (Direct Rendering Manager) DRM-Treiber portiert, der in C geschrieben ist. Die uAPI des Tyr-Treibers ist identisch mit der uAPI des Panthor-Treibers, was die Verwendung vorhandener Userspace-Komponenten ermöglicht.
Die CSF-Technologie, die seit der 10. Generation der Mali-GPUs eingesetzt wird, zeichnet sich durch die Verlagerung einiger Treiberfunktionen auf die Firmware und die Verwendung eines neuen Modells zur Organisation der Arbeitsausführung auf der GPU aus. Bei GPUs mit CSF-Schnittstelle wird anstelle eines auf der Übermittlung einer Arbeitskette basierenden Modells ein auf einem Befehlsfluss basierendes Modell mit Planung der Befehlsflusswarteschlange auf der Firmware-Seite verwendet. Zur Organisation der Arbeit des Schedulers ist ein separater Cortex-M7-Mikrocontroller in die GPU integriert, und eine spezielle Befehlsausführungseinheit (Command Execution Unit) dient zur Ausführung von CSF-Anweisungen.
Die Funktionalität von Tyr hinkt dem Panthor-Treiber noch hinterher, die Entwickler beabsichtigen jedoch, diese Lücke schrittweise zu schließen, bis Gleichheit in den Treiberfunktionen erreicht ist. Die fehlenden Funktionen erfordern die Integration zusätzlicher Abstraktionen in den Kernel, um Treiber in Rust zu erstellen. Daher wird die Entwicklung des Tyr-Treibers mit der Einführung dieser Abstraktionen in den Kernel synchronisiert. Beispielsweise verfügt der Kernel noch nicht über die Funktionen für das Speichermapping in Rust-Treibern für GPUs, die im noch nicht übernommenen GPUVM-Patch-Set entwickelt werden.
Source: opennet.ru
