<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/building-tyr-in-rust-csf-architecture-and-booting-the-mcu-zxrjotjjz" -->

---
title: Building Tyr in Rust: CSF architecture and booting the MCU
description: A deep technical walkthrough of how Tyr, a Rust-based Linux kernel-mode GPU driver, maps Vulkan queue submissions onto Mali CSF (Command Stream Frontend)...
canonical: https://daily.dev/posts/building-tyr-in-rust-csf-architecture-and-booting-the-mcu-zxrjotjjz
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Building Tyr in Rust: CSF architecture and booting the MCU | daily.dev
og:description: A deep technical walkthrough of how Tyr, a Rust-based Linux kernel-mode GPU driver, maps Vulkan queue submissions onto Mali CSF (Command Stream Frontend)...
og:url: https://daily.dev/posts/building-tyr-in-rust-csf-architecture-and-booting-the-mcu-zxrjotjjz
og:image: https://api.daily.dev/og/posts/ZXrJotjjz.png
og:image:alt: Building Tyr in Rust: CSF architecture and booting the MCU
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Building Tyr in Rust: CSF architecture and booting the MCU

**[Collabora Blog](https://daily.dev/sources/collabora)** · 13 min read · 0 upvotes · 0 comments

## Summary

A deep technical walkthrough of how Tyr, a Rust-based Linux kernel-mode GPU driver, maps Vulkan queue submissions onto Mali CSF (Command Stream Frontend) hardware. Covers the full path from VkQueue creation through panvk, down to KMD group/queue objects, firmware-visible CSG/CS slots, MCU firmware boot, and the CPU-MCU shared memory communication protocol. Explains why the MCU firmware must boot before scheduling is possible, how vm_id enforces GPU address space isolation, and why all pieces (firmware, VM, groups, queues, event handling) must be in place for a complete Vulkan execution path.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.collabora.com/news-and-blog/blog/2026/05/14/building-tyr-in-rust-csf-architecture-and-booting-the-mcu>

## Questions this post answers

### What is the difference between a CSG and a CS in Mali CSF firmware?

A CSG (Command Stream Group) is the firmware-visible container for a set of command streams that share scheduling state and a GPU address space. Inside a CSG, one or more CS (Command Stream) interfaces each consume CSF instructions from a ring buffer. The KMD maps its internal Group objects to CSG slots and Queue objects to CS slots within those CSGs. A CSG slot can only host one group at a time.

_Developers working on Mali GPU drivers or CSF-based systems track driver progress like Tyr's on daily.dev._

### How does the Mali CSF MCU firmware communicate with the host CPU in a Linux GPU driver?

Communication happens through shared memory regions split into Control, Input, and Output sections. The KMD reads the Control region to discover firmware version, feature bits, group counts, and interface addresses. It writes requests into the Input region and rings a doorbell. The MCU processes the request, writes acknowledgments and status into the Output region, and raises an interrupt when the CPU must react — forming a lockless, ownership-defined channel.

_Engineers building or studying CSF-based GPU drivers find related deep-dives on daily.dev._

### Why does a Panthor/Tyr group require a vm_id when created via DRM_IOCTL_PANTHOR_GROUP_CREATE?

Command streams submitted through a group contain GPU virtual addresses, and those addresses must be resolved in a specific GPU virtual address space. The vm_id ties the group to a particular VM so the GPU MMU translates addresses through the correct page tables. This also enforces isolation: one client cannot read another client's memory by guessing addresses, because the GPU MMU only maps the owning VM's pages.

_Developers navigating GPU memory isolation and DRM VM binding find relevant driver discussions on daily.dev._

## Similar posts on daily.dev

- [Building Tyr in Rust, part 3: Managing GPU memory](https://daily.dev/posts/building-tyr-in-rust-part-3-managing-gpu-memory-pi8jvzwe4) · Collabora Blog · 4 upvotes · 0 comments
- [The future for Tyr](https://daily.dev/posts/the-future-for-tyr-xdzk3dk6f) · Hacker News · 1 upvotes · 0 comments
- [Rust-Based Arm GPU Kernel Driver "Tyr" Begins Running GNOME & Basic Games](https://daily.dev/posts/rust-based-arm-gpu-kernel-driver-tyr-begins-running-gnome-basic-games-8w2bxxznp) · Phoronix · 0 upvotes · 0 comments
- [Building GPU Drivers in Rust: Tyr at RustConf 2026](https://daily.dev/posts/building-gpu-drivers-in-rust-tyr-at-rustconf-2026-db6pg3qtl) · Collabora Blog · 13 upvotes · 2 comments

---

Tags: [#linux](https://daily.dev/tags/linux), [#rust](https://daily.dev/tags/rust), [#vulkan](https://daily.dev/tags/vulkan)

[View this post on daily.dev](https://daily.dev/posts/building-tyr-in-rust-csf-architecture-and-booting-the-mcu-zxrjotjjz)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Building Tyr in Rust: CSF architecture and booting the MCU","url":"https://daily.dev/posts/building-tyr-in-rust-csf-architecture-and-booting-the-mcu-zxrjotjjz","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/building-tyr-in-rust-csf-architecture-and-booting-the-mcu-zxrjotjjz"},"datePublished":"2026-08-11T08:55:48.423Z","dateModified":"2026-08-11T09:26:57.880Z","description":"A deep technical walkthrough of how Tyr, a Rust-based Linux kernel-mode GPU driver, maps Vulkan queue submissions onto Mali CSF (Command Stream Frontend)...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/700d390ca66d5885dbf6ffa7f1d0559f?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/700d390ca66d5885dbf6ffa7f1d0559f?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Collabora Blog","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Collabora Blog","logo":"https://media.daily.dev/image/upload/s--ZGZ0FjqS--/f_auto,q_auto/v1786438306/logos/collabora?_a=BAMAMicg0","url":"https://daily.dev/sources/collabora"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/building-tyr-in-rust-csf-architecture-and-booting-the-mcu-zxrjotjjz","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"linux,rust,vulkan","timeRequired":"PT13M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Collabora Blog","item":"https://daily.dev/sources/collabora"},{"@type":"ListItem","position":3,"name":"Building Tyr in Rust: CSF architecture and booting the MCU"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/building-tyr-in-rust-csf-architecture-and-booting-the-mcu-zxrjotjjz#faq","mainEntity":[{"@type":"Question","name":"What is the difference between a CSG and a CS in Mali CSF firmware?","acceptedAnswer":{"@type":"Answer","text":"A CSG (Command Stream Group) is the firmware-visible container for a set of command streams that share scheduling state and a GPU address space. Inside a CSG, one or more CS (Command Stream) interfaces each consume CSF instructions from a ring buffer. The KMD maps its internal Group objects to CSG slots and Queue objects to CS slots within those CSGs. A CSG slot can only host one group at a time. Developers working on Mali GPU drivers or CSF-based systems track driver progress like Tyr's on daily.dev."}},{"@type":"Question","name":"How does the Mali CSF MCU firmware communicate with the host CPU in a Linux GPU driver?","acceptedAnswer":{"@type":"Answer","text":"Communication happens through shared memory regions split into Control, Input, and Output sections. The KMD reads the Control region to discover firmware version, feature bits, group counts, and interface addresses. It writes requests into the Input region and rings a doorbell. The MCU processes the request, writes acknowledgments and status into the Output region, and raises an interrupt when the CPU must react — forming a lockless, ownership-defined channel. Engineers building or studying CSF-based GPU drivers find related deep-dives on daily.dev."}},{"@type":"Question","name":"Why does a Panthor/Tyr group require a vm_id when created via DRM_IOCTL_PANTHOR_GROUP_CREATE?","acceptedAnswer":{"@type":"Answer","text":"Command streams submitted through a group contain GPU virtual addresses, and those addresses must be resolved in a specific GPU virtual address space. The vm_id ties the group to a particular VM so the GPU MMU translates addresses through the correct page tables. This also enforces isolation: one client cannot read another client's memory by guessing addresses, because the GPU MMU only maps the owning VM's pages. Developers navigating GPU memory isolation and DRM VM binding find relevant driver discussions on daily.dev."}}]}
```

