Files
RedBear-OS/local/docs/AMDGPU-LINUX-KPI-FULL-INTEGRATION-PLAN.md
T
vasilito 24584eb3c6 fix: remove garbled lines in AMD hotplug IRQ handler
Lines 649-651 had VramManager and info!() calls that don't belong
in handle_irq(). These were likely from a bad merge. The variables
fb_phys and fb_size are local to new() and don't exist in handle_irq().
2026-05-31 23:12:56 +03:00

678 lines
38 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AMDGPU Full Integration Plan — linux-kpi → Mesa → Wayland
**Created:** 2026-05-30 · **Updated:** 2026-05-31 (636 errors — 96.8% reduced from 19,652. 181 headers, 0 fatals. atomic_long_t + bitmap functions added.)
**Milestones achieved:**
- Phase 0: ✅ Complete — amdgpu-source Linux 7.1 (970 C files)
- Phase 1: ✅ Complete — 180 linux-kpi headers, 0 fatal errors across all 12 core files
- Phase 2: 🔄 926 non-fatal errors (95.3% reduced from 19,652 peak)
**Milestones achieved:**
- Phase 0: ✅ Complete — amdgpu-source Linux 7.1 (970 C files)
- Phase 1: ✅ Complete — 177 linux-kpi headers, 0 fatal "file not found" errors across all 12 core files
- Phase 2: 🔄 In progress — ~1,700 non-fatal errors (92% reduced from 19,652 peak)
**Quality fixes delivered:**
- `-std=gnu11` in recipe CFLAGS (matches Linux 7.1 build standard)
- `__UNIQUE_ID` / `__PASTE` macro infrastructure in compiler.h
- `auto → __auto_type` mapping for C23 compatibility
- `typeof_member` / `typeof_unqual` for cleanup.h lock guard macros
- Proper `linux/cleanup.h` replacement (no auto/typeof dependency)
- Sparse annotations as no-ops (`__acquires`/`__releases`)
- `IS_ENABLED(CONFIG_*)` system in kconfig.h — eliminated ~17,800 errors
- Type system: `__s8`/`__s16`/`umode_t`/`fmode_t`/`BITS_PER_LONG`/`typeof()`/`rcuref_t`/`initcall_entry_t`/`locale_t`
- `<stdio.h>` removed from kernel.h (POSIX type pollution fix)
- `bitops.h → bitmap.h` include chain for DECLARE_BITMAP visibility
- Strategy: `-I${TOP_INC}` (real Linux 7.1 DRM headers) + linux-kpi shims blocking problematic imported headers
**Remaining 1,700 errors** are deep type/struct incompleteness in the imported include tree: `FILE` (54), `nodemask_t` (40), `__gnuc_va_list` (12), `__extension__` (9), `__attribute__` parse issues (6). These require either:
1. More linux-kpi shims to override problematic imported headers
2. Stub headers for `asm/` and `uapi/` chains that the imported tree expects
3. Or accepting that the imported `include/linux/` tree is too deep for full compatibility
**Authority:** This document is the canonical execution plan for full AMD GPU enablement on Red Bear OS through linux-kpi, covering kernel driver compilation, Mesa integration, and Wayland/KWin compositing.
**Position in doc set:** Beneath `CONSOLE-TO-KDE-DESKTOP-PLAN.md` and `DRM-MODERNIZATION-EXECUTION-PLAN.md` (Workstream B — AMD track).
## Executive Summary
| Component | Current State | Target State |
|---|---|---|
| **linux-kpi** | 148 C headers (+109 from original 39). Complete DRM KMS framework, TTM, core Linux subsystem shims. DRM atomic helpers declared. bitops/bitmap/DECLARE_BITMAP working. UAPI types (__u32/__u64). | Full Linux kernel API surface needed by amdgpu. Estimated +20-40 more headers + DRM atomic helper implementations. |
| **amdgpu kernel driver** | 970 C files imported (Linux 7.1). 12 core files compile through linux-kpi with 0 fatal errors. 280-1540 non-fatal errors per file (struct field + implicit decl). | 970 files compiled through linux-kpi, producing functional `libamdgpu_dc_redox.so`. |
| **libdrm amdgpu** | 12 files compiled via meson (`-Damdgpu=enabled`). DRM ioctl bridge patches applied. | Full libdrm_amdgpu with BO management, CS submission, VM management, GPU info queries — all through redox-drm scheme. |
| **Mesa radeonsi** | Not compiled (`-Dgallium-drivers` excludes radeonsi). | Cross-compiled for Redox target, linked against libdrm_amdgpu, rendering through redox-drm scheme. |
| **Mesa RADV** | Not compiled (`-Dvulkan-drivers=swrast` only). | Cross-compiled for Redox target. Deferred to Phase 4. |
| **Wayland/KWin** | DRM master via `/scheme/drm/card0`. Intel display path wired. AMD path uses synthetic EDID. | AMD display registered as DRM master through redox-drm. Atomic modeset, page flip, GBM buffer allocation via radeonsi. |
| **Hardware validation** | None. | Real AMD GPU output proven on at least one Navi/RDNA generation. |
**Total estimated effort**: 2440 weeks with AMD GPU hardware access.
**Critical path**: linux-kpi gap filling → amdgpu core compilation → display output proof → Mesa radeonsi → KWin compositing.
---
## 1. Existing Infrastructure Assessment
### 1.1 linux-kpi Rust Implementation (7,464 lines)
The linux-kpi Rust crate provides real implementations (not stubs) for all major Linux kernel subsystems needed by GPU drivers:
| Module | Lines | Coverage |
|---|---|---|
| `pci.rs` | 777 | Full PCI: device enumeration via `enumerate_pci_all()`, BAR mapping via `/scheme/memory/physical`, MSI/MSI-X allocation, config space read/write, resource management |
| `irq.rs` | 228 | Full IRQ: threaded handler dispatch, masking, cancel, per-IRQ table with `scheme:irq` backed file descriptors |
| `dma.rs` | 434 | Full DMA: `virt_to_phys` via `/scheme/memory/translation`, DMA pools, GFP_DMA32 with retry, boundary-crossing detection, coherent allocation |
| `memory.rs` | 271 | Full memory: `kmalloc`/`kfree`/`vmalloc`/`vfree`/`krealloc`, GFP_DMA32 tracking with retries for sub-4GB allocations, allocation tracker |
| `firmware.rs` | 277 | Firmware: `request_firmware` via `/scheme/firmware/`, `release_firmware`, firmware cache |
| `workqueue.rs` | 372 | Workqueues: `schedule_work`, `schedule_delayed_work`, `flush_workqueue`, `cancel_work_sync`, threaded worker pool |
| `timer.rs` | 424 | Timers: `mod_timer`, `del_timer`, `del_timer_sync`, `setup_timer`, `msleep`/`udelay`/`mdelay`, jiffies tracking |
| `wait.rs` | 318 | Wait/completion: `init_completion`, `wait_for_completion`, `wait_for_completion_timeout`, `complete`, `reinit_completion` |
| `sync.rs` | 416 | Synchronization: `spin_lock`/`unlock`, `mutex_lock`/`unlock`, `atomic_read`/`set`/`inc`/`dec`/`cmpxchg`, `rcu_read_lock`/`unlock` stubs |
| `drm_shim.rs` | 374 | DRM shim: connector, CRTC, encoder, framebuffer structs, `drm_dev_register`, `drm_mode_config_init`, `drm_connector_init`, `drm_crtc_init_with_planes` |
| `io.rs` | 191 | I/O: `ioremap` via `/scheme/memory/physical` with `mmap`, `readl`/`writel`/`readb`/`writeb` via volatile pointers, `pci_iomap` |
| `idr.rs` | 243 | IDR: `idr_alloc`, `idr_find`, `idr_remove`, `idr_for_each_entry` |
| `list.rs` | 197 | Lists: `list_add`, `list_del`, `list_empty`, `list_for_each`, `list_for_each_entry` |
| `device.rs` | 155 | Device model: `struct device`, `dev_get_drvdata`, `dev_set_drvdata`, `dev_err`/`dev_warn`/`dev_info` logging |
| `net.rs` | 809 | Networking: `netdev_alloc`, `alloc_etherdev`, `register_netdev`, `sk_buff`, NAPI polling |
| `wireless.rs` | 1,002 | Wireless: `wiphy`/`ieee80211_hw` allocation, `wiphy_register`, `cfg80211_*` operations |
| `mac80211.rs` | 959 | mac80211: `ieee80211_register_hw`, `ieee80211_rx`, `ieee80211_tx`, `ieee80211_scan_*` |
**Key observation**: The linux-kpi already implements the infrastructure that the amdgpu C driver would call through C FFI. The C headers in `c_headers/` declare these functions, and the Rust implementations provide the runtime behavior. This is NOT a stub layer — it's a functional Linux kernel compatibility runtime.
### 1.2 C Header Compatibility Layer (39 headers)
The `c_headers/` directory provides `#include`-compatible declarations for the Linux kernel API. When the amdgpu C source is compiled with `-I${LINUX_KPI}`, it sees Linux kernel headers that resolve to the Rust implementations at link time.
### 1.3 libdrm amdgpu (12 files compiled)
The libdrm amdgpu backend compiles via meson with `-Damdgpu=enabled`. It provides the userspace side:
- BO (Buffer Object) allocation/management (`amdgpu_bo.c`)
- Command submission (`amdgpu_cs.c`)
- VM management (`amdgpu_vm.c`, `amdgpu_vamgr.c`)
- GPU info queries (`amdgpu_gpu_info.c`, `amdgpu_asic_id.c`)
- Device initialization (`amdgpu_device.c`)
The DRM ioctl bridge (`P1-drm-ioctl-bridge.patch`) translates libdrm's `drmIoctl()` calls to redox-drm scheme operations.
### 1.4 Missing radeonsi in Mesa
The Mesa recipe builds `-Dgallium-drivers=swrast,virgl,iris` — radeonsi is not included. Adding it requires:
1. Functional libdrm_amdgpu (✅ already compiles)
2. Functional amdgpu kernel driver providing `/scheme/drm/card0` with AMD GPU
3. LLVM AMDGPU target for shader compilation (LLVM 21 is built — need to verify AMDGPU target)
4. Cross-compilation of radeonsi's LLVM IR generation for Redox target
### 1.5 AMD Source Tree Already Imported
The full Linux 7.1 AMD source (from the in-tree reference `local/reference/linux-7.1/`) is at `amdgpu-source/gpu/drm/amd/`:
- `amdgpu/` — ~300 C files (core driver)
- `display/` — ~510 C files (Display Core, including DCN 4.2 / RDNA4)
- `pm/` — ~85 C files (power management)
- `amdkfd/` — ~42 C files (compute)
- `ras/` — ~26 C files (reliability)
- Plus `drm/ttm/` and `include/` directories
The recipe's include paths, config defines, and compiler flags are already set up. The Stage 2-4 mechanism (`DISPLAY_SRCS=""`, `TTM_SRCS=""`, `CORE_SRCS=""`) is designed for progressive activation.
---
## 2. Implementation Phases
### Phase 0: Update amdgpu Imported Source to Linux 7.1 (12 days)
**Goal:** Replace the current imported amdgpu source (Linux 7.0-rc7 snapshot, 941 files) with the in-tree Linux 7.1 reference (`local/reference/linux-7.1/drivers/gpu/drm/amd/`, 970 files). This brings RDNA4 (DCN 4.2) support, SMU 15.0.8, and 7.0→7.1 bug fixes.
**Why:** The Linux 7.1 reference source is already present in the tree at `local/reference/linux-7.1/`. The imported source at `local/recipes/gpu/amdgpu-source/gpu/drm/amd/` is from an earlier Linux 7.0-rc7 snapshot. Using the in-tree reference ensures we compile the latest available driver code.
**Delta between 7.0-rc7 and 7.1 (74 new files):**
| Category | New files | What they provide |
|---|---|---|
| **DCN 4.2 (RDNA4)** | 24 | Full DCN 4.2 display engine: `dcn42_clk_mgr`, `dcn42_hubbub`, `dcn42_hubp`, `dcn42_dpp`, `dcn42_mpc`, `dcn42_optc`, `dcn42_hwseq`, `dcn42_resource`, `dcn42_dio_link_encoder`, `dcn42_dio_stream_encoder`, `dcn42_hpo_dp_link_encoder`, `dcn42_mmhubbub`, `dcn42_irq_service`, `dcn42_gpio`, `dcn42_pg_cntl` |
| **DMUB DCN 4.2** | 1 | `dmub_dcn42.c` — microcontroller firmware interface for RDNA4 |
| **DML 2.1 for DCN 4.2** | 2 | `dml2_mcg_dcn42.c`, `dml2_pmo_dcn42.c` — display mode library calculations for RDNA4 |
| **Display core ISM** | 1 | `amdgpu_dm_ism.c` — Integrated System Management for display |
| **SMU 15.0.8** | 1 | `smu_v15_0_8_ppt.c` — power management tables for RDNA4 |
| **GPU codecs** | 3 | `jpeg_v5_0_2.c`, `vcn_v5_0_2.c`, `lsdma_v7_1.c` — hardware video encode/decode + DMA |
| **GPU reg access** | 1 | `amdgpu_reg_access.c` — register access helpers |
| **Other headers/assorted** | 41 | Updated headers, includes, and minor 7.1 changes |
**Procedure:**
```bash
# 1. Back up current import
cp -a local/recipes/gpu/amdgpu-source local/recipes/gpu/amdgpu-source.bak-7.0-rc7
# 2. Copy 7.1 amdgpu tree over the import
rsync -av --delete \
local/reference/linux-7.1/drivers/gpu/drm/amd/ \
local/recipes/gpu/amdgpu-source/gpu/drm/amd/
# 3. Also update TTM and DRM headers if needed
rsync -av \
local/reference/linux-7.1/drivers/gpu/drm/ttm/ \
local/recipes/gpu/amdgpu-source/drm/ttm/
# 4. Update include/ directory (DRM, display, bridge headers)
rsync -av \
local/reference/linux-7.1/include/drm/ \
local/recipes/gpu/amdgpu-source/include/drm/
# 5. Verify the update
echo "Files in updated import: $(find local/recipes/gpu/amdgpu-source/gpu/drm/amd -name '*.c' | wc -l)"
# Expected: 970
# 6. Git commit the update
git add local/recipes/gpu/amdgpu-source/
git commit -m "amdgpu-source: update imported AMD GPU tree to Linux 7.1 reference
- Replaces Linux 7.0-rc7 snapshot (941 C files) with Linux 7.1 (970 C files)
- Adds DCN 4.2 (RDNA4 / Radeon RX 9000 series) display engine support
- Adds SMU 15.0.8 power management tables
- Adds JPEG/VCN 5.0.2 hardware codec support
- 74 new files, various 7.0→7.1 fixes
- Source: local/reference/linux-7.1/drivers/gpu/drm/amd/"
```
**Impact on the plan:**
- The recipe's include paths and config defines in `amdgpu/recipe.toml` remain unchanged — they reference the `amdgpu-source/` tree which is now updated
- The linux-kpi gap audit (Phase 1) must account for any new Linux kernel APIs used by the 74 new DCN 4.2 files
- The minimum DC subset for Phase 2B should target DCN 3.1 (RDNA2/RDNA3) first, then add DCN 4.2 later — this avoids expanding the compilation scope before the base path works
**Exit criteria:**
- `local/recipes/gpu/amdgpu-source/gpu/drm/amd/` contains 970 C files matching Linux 7.1
- File count verification passes
- Git commit recorded
---
### Phase 1: linux-kpi Gap Filling (46 weeks) — **~85% COMPLETE**
**Status (2026-05-30):** All 12 core amdgpu files pass through linux-kpi without fatal "file not found" errors. 148 C headers created. 280-1540 non-fatal errors per file remain — predominantly from incomplete `struct amdgpu_device` sub-fields that require Linux kernel CONFIG_* option matching, plus ~50 implicit function declarations.
**Headers created (109 new beyond original 39):**
- **DRM KMS framework** (27): drm_drv, drm_crtc, drm_plane, drm_encoder, drm_connector, drm_framebuffer, drm_modes, drm_edid, drm_vblank, drm_atomic, drm_atomic_helper, drm_syncobj, drm_file, drm_gem, drm_gem_ttm_helper, drm_exec, drm_gpu_scheduler, drm_print, drm_probe_helper, drm_suballoc, drm_fbdev_generic, drm_fbdev_ttm, drm_client, drm_client_setup, drm_panic, drm_cache, drm_mm
- **TTM** (6): ttm_device, ttm_resource, ttm_range_manager, ttm_tt, ttm_bo, ttm_placement
- **Core Linux** (42): completion, dma-fence, dma-fence-array, kref, rbtree, hashtable, ktime, pm_runtime, kthread, iommu, irqdomain, mmu_notifier, bitmap, bitops, seq_file, pagemap, interval_tree, nospec, cc_platform, dynamic_debug, console, aperture, power_supply, suspend, delay, vmalloc, device, mutex, spinlock, workqueue, wait, etc.
- **Types** (8): __u32, __u64, __s32, __s64, __u16, __u8, __kernel_size_t, resource_size_t, __bitwise
- **Misc** (26): asm/bug, asm/linkage, asm/io, dt-bindings, uapi/sched, video/nomodeset, various platform stubs
**Compilation strategy validated:** linux-kpi-only includes (no imported Linux `include/` tree — avoids infinite dependency chains). Added include paths for amdgpu internal headers: `display/include/`, `amdgpu/`.
**Next for Phase 1 completion:**
1. Fix ~50 implicit function declarations (add missing function stubs to existing headers)
2. Match Linux CONFIG_* options so conditional struct fields are present (CONFIG_DRM_AMDGPU_VIRT, CONFIG_DRM_AMD_DC_DCN, etc.)
3. Complete DRM atomic helper implementations (currently declared-only)
**Goal:** Expand linux-kpi C headers and Rust implementations to cover all Linux kernel APIs that the amdgpu driver calls. Without this, the 941 C files will fail to compile.
#### 1A: Audit amdgpu API requirements
Method: Attempt to compile a subset of amdgpu C files through linux-kpi, collect errors, prioritize by frequency.
**Initial compile target** (smallest useful subset):
```
amdgpu_drv.c — PCI probe entry point
amdgpu_device.c — GPU device init
amdgpu_kms.c — KMS integration
amdgpu_irq.c — Interrupt handling
amdgpu_fence.c — GPU fence/synchronization
amdgpu_bo.c — Buffer object management
amdgpu_gem.c — GEM integration
amdgpu_gtt_mgr.c — GTT management
amdgpu_vm.c — Virtual memory (page tables)
amdgpu_ih.c — Interrupt Handler ring
```
**Likely gap categories:**
| API Category | Missing Functions (expected) | Implementation Complexity |
|---|---|---|
| **PCI config space** | `pci_read_config_dword`, `pci_write_config_dword`, `pci_find_capability`, `pci_save_state`, `pci_restore_state`, `pci_set_power_state` | LOW — exist as declarations, need full impl |
| **MSI/MSI-X** | Full capability walking for MSI-X table offset/BIR | MEDIUM — needs PCIe capability chain parsing |
| **MMIO** | `pci_iomap_range`, `ioremap_wc`, `ioremap_np`, `memcpy_toio`, `memset_io` | LOW — mostly exist or are trivial |
| **DMA** | `dma_set_mask_and_coherent`, scatter-gather mapping (`dma_map_sg`, `dma_unmap_sg`), `dma_sync_sg_for_cpu/device`, streaming DMA | HIGH — scatter-gather is complex |
| **Power management** | `pm_runtime_get_sync`, `pm_runtime_put_autosuspend`, `pm_runtime_allow`, system suspend/resume callbacks | LOW — can be stubs returning success |
| **Regmap / IO** | `regmap_read`, `regmap_write`, `regmap_update_bits` | MEDIUM — need regmap implementation |
| **Clock / delay** | `usleep_range`, `msleep_interruptible`, `ktime_get`, `ktime_get_real` | LOW — mostly exist |
| **Random** | `get_random_bytes`, `prandom_u32` | LOW — host random |
| **Debug** | `WARN_ON`, `BUG_ON`, `dump_stack`, `dev_dbg` | LOW — already have equivalents |
| **ACPI** | Full ACPI stubs — amdgpu calls ACPI for backlight, power, platform info | LOW — all stubs returning "not found" |
| **DRM framework** | `drm_dev_alloc`, `drm_dev_register`, `drm_dev_unregister`, `drm_connector_list_iter_begin`, `drm_mode_config_reset`, `drm_atomic_helper_check`, `drm_atomic_helper_commit`, `drm_atomic_helper_swap_state`, `drm_atomic_state_alloc`, `drm_atomic_get_crtc_state`, `drm_atomic_get_plane_state`, `drm_atomic_get_connector_state`, `drm_crtc_vblank_get`, `drm_crtc_vblank_put`, `drm_crtc_handle_vblank`, `drm_crtc_send_vblank_event`, `drm_crtc_arm_vblank_event`, `drm_crtc_vblank_count`, `drm_atomic_crtc_set_property` | VERY HIGH — the DRM atomic modeset framework is the largest gap. The `drm_shim.rs` (374 lines) provides basic structs but NO atomic helper implementation. |
**DRM atomic helpers are the single biggest missing piece.** AMD DC (Display Core) uses the DRM atomic modesetting framework extensively. Without it, the display path cannot function.
#### 1B: Implement critical missing APIs
Priority order:
1. **DRM atomic helper shim** (largest, 48 weeks alone)
- `drm_atomic_helper_check` — validate atomic state
- `drm_atomic_helper_commit` — apply atomic state
- `drm_atomic_state_alloc/swap_state`
- `drm_atomic_get_crtc_state`, `drm_atomic_get_connector_state`, `drm_atomic_get_plane_state`
- `drm_crtc_vblank_get/put/handle_vblank/send_vblank_event/arm_vblank_event`
- `drm_mode_config_reset`
- CRTC/connector/plane helper registration
2. **PCI config space** (23 weeks)
- Full capability chain walking for MSI/MSI-X
- Config space read/write through `/scheme/pci/` scheme
- Power state management
3. **DMA scatter-gather** (23 weeks)
- `struct scatterlist`, `sg_table`
- `dma_map_sg`, `dma_unmap_sg`, `dma_sync_sg_for_cpu/device`
- `sg_alloc_table`, `sg_free_table`, `for_each_sg`
4. **Regmap** (12 weeks)
- `regmap_init_mmio` — register map backed by MMIO
- `regmap_read`, `regmap_write`, `regmap_update_bits`
- `regmap_set_bits`, `regmap_clear_bits`
5. **Additional DRM/KMS helpers** (12 weeks)
- `drm_connector_list_iter_begin/end/next`
- `drm_edid_read`, `drm_add_edid_modes`, `drm_edid_is_valid`
- `drm_dp_dpcd_read`, `drm_dp_dpcd_write`, `drm_dp_link_train_channel_eq_delay`
#### 1C: C header declarations
For each implemented Rust function, add the corresponding C declaration to the `c_headers/` tree. Ensure header include chains are correct (e.g., `linux/pci.h` includes `linux/types.h` includes `linux/compiler.h`).
**Exit criteria:**
- `bash compile-test.sh` compiles a test set of 1020 amdgpu C files through linux-kpi with zero "implicit declaration" or "undefined reference" errors
- DRM atomic helper shim passes a basic "allocate state → add connector → add CRTC → check → commit" test
---
### Phase 2: amdgpu Core Compilation (610 weeks)
**Goal:** Compile the full amdgpu core driver (excluding Display Core initially) through linux-kpi and produce a functional `libamdgpu_dc_redox.so`. Prove basic GPU initialization on real hardware.
#### 2A: GPU device initialization path
**Target files (from `amdgpu/` directory):**
```
amdgpu_drv.c — PCI probe, driver registration
amdgpu_device.c — Device init, IP block discovery, GPU reset
amdgpu_kms.c — DRM KMS integration
amdgpu_irq.c — Interrupt handler registration, IH ring
amdgpu_fence.c — Fence/sync timeline
amdgpu_bo.c — Buffer object (alloc/free/map/unmap)
amdgpu_gem.c — GEM integration (PRIME, mmap)
amdgpu_gtt_mgr.c — GTT memory manager
amdgpu_vram_mgr.c — VRAM memory manager (optional)
amdgpu_vm.c — GPU virtual memory (page tables)
amdgpu_ih.c — Interrupt Handler ring buffer
amdgpu_ucode.c — Microcode/firmware loading
amdgpu_psp.c — Platform Security Processor firmware
amdgpu_smu.c — System Management Unit (power)
amdgpu_gmc.c — Graphics Memory Controller (GART, VM)
```
**Compilation strategy:**
1. Add files one by one to `CORE_SRCS` in the recipe
2. For each compilation error, either:
- Add the missing linux-kpi function (preferred)
- Add a `#ifndef __redox__` guard around unsupported code paths
- Add a stub implementation in `redox_stubs.c`
3. Keep a running list of "deferred files" that have too many dependencies
**Expected challenges:**
- The amdgpu driver uses Linux kernel idioms extensively (container_of, linked lists, IDR, kref, workqueues, completion, mutex/spinlock, atomic ops, bitops, io read/write, DMA mapping, PCI config, module params, sysfs/debugfs, kernel threads)
- GPU registers are accessed through abstractions that assume Linux MMIO APIs
- Interrupt handling assumes Linux's `request_irq`/`free_irq` with `IRQF_SHARED`
- Firmware loading assumes `request_firmware` with `/lib/firmware` path
- Power management assumes Linux PM framework
- GPU reset assumes Linux workqueue + completion
#### 2B: Display Core (DC) compilation
**This is the largest and most complex subsystem.** The AMD Display Core (~510 C files, including DCN 4.2 from Linux 7.1) implements:
- DCN hardware abstraction (dcn10/dcn20/dcn21/dcn30/dcn301/dcn31/dcn32/dcn35)
- Display pipe configuration (OPP, DPP, MPC, HUBP)
- Link training (DP, HDMI)
- DSC (Display Stream Compression)
- DMUB (microcontroller firmware)
- HDCP content protection
- FreeSync / Adaptive Sync
- HDR / color management
**Strategy for DC**: DO NOT attempt to compile all 487 files at once. Instead:
1. **Identify the minimum DC subset for basic display output** (likely 3050 files):
- `dc.c` — DC core (init, create, destroy)
- `dc_link.c` — link management
- `dcn10/dcn10_hw_sequencer.c` or `dcn20/dcn20_hw_sequencer.c` — hardware sequencing
- `dcn10/dcn10_hubbub.c` — display buffer hub
- `dcn10/dcn10_hubp.c` — display pipe
- `dcn10/dcn10_dpp.c` — display pipe processing
- `dcn10/dcn10_opp.c` — output pixel processing
- `dcn10/dcn10_mpc.c` — multi-plane compositor
- `dcn10/dcn10_hw_sequencer_debug.c`
- `dce/dce_clock_source.c` or `dcn10/dcn10_clk_mgr.c` — clock management
- `core/dc_resource.c` — resource management
- `core/dc_link_dp.c` — DP link management
- `core/dc_link_hwss.c` — link hardware sequencing
- `core/dc_link_ddc.c` — DDC I2C for EDID
- `dc_edid_parser.c` — EDID parsing
- `dmub/*` — DMUB firmware interface
- One DCN generation's register headers
2. **Compile the minimum subset through linux-kpi**
3. **Target DCN 3.1 (RDNA2/RDNA3) first** — this is the most mature and well-tested DCN generation in Linux 7.1. DCN 4.2 (RDNA4) was added in 7.1 and may have more linux-kpi dependencies. Once DCN 3.1 works, expand to DCN 3.2, 3.5, then 4.2.
4. **Prove display output on real hardware** (this is the critical validation gate)
4. **Incrementally expand** to multi-display, HDR, FreeSync, DSC, etc.
#### 2C: Recipe activation
Update the `amdgpu/recipe.toml` Stages 24 to include compiled files:
```bash
# Stage 2: AMD Display Core
DISPLAY_SRCS="${AMD_SRC}/display/dc/core/dc.c
${AMD_SRC}/display/dc/core/dc_resource.c
..."
# Stage 3: TTM
TTM_SRCS="${TTM_SRC}/ttm_bo.c ..."
# Stage 4: amdgpu core
CORE_SRCS="amdgpu_drv.c amdgpu_device.c amdgpu_kms.c ..."
```
#### 2D: Redox-specific glue for amdgpu internals
Some Linux kernel APIs used by amdgpu have no direct Redox equivalent and cannot be shimmed trivially. These need Redox-native alternatives:
| Linux API | Redox Alternative |
|---|---|
| `/sys/kernel/debug/dri/` (debugfs) | Log to stderr, skip debug output |
| `/sys/class/drm/` (sysfs) | Skip entirely |
| `MODULE_PARM_DESC(name, desc)` | Already no-op |
| Kernel threads (`kthread_run`) | `std::thread::spawn` |
| `synchronize_rcu()` / RCU | No-op (single-threaded GPU ops) |
| `pci_save_state` / `pci_restore_state` | No-op (Redox kernel handles this) |
| ACPI (`acpi_evaluate_object`, `acpi_get_table`) | Stub returning "not found" |
| `drm_dp_mst_topology_mgr` (DP MST) | Skip for Phase 2, add later |
| `drm_hdcp_*` (HDCP) | Skip for Phase 2, add later |
**Exit criteria:**
- `libamdgpu_dc_redox.so` links successfully with all core amdgpu files + minimum DC subset
- GPU device init succeeds on real AMD hardware: MMIO mapped, GPU ID read, firmware loaded, ring buffers initialized
- Basic display output proven: single CRTC, single connector, at least one resolution
---
### Phase 3: Mesa radeonsi Cross-Compilation (46 weeks)
**Goal:** Cross-compile the radeonsi Gallium driver for the Redox target, link against libdrm_amdgpu, and prove software-rendered OpenGL through the AMD GPU path.
#### 3A: LLVM AMDGPU target verification
Mesa radeonsi requires LLVM with the AMDGPU target for shader compilation.
```bash
# Check if the Redox toolchain's LLVM includes AMDGPU target
${TARGET}-llvm-config --targets-built
# Should include "AMDGPU" in the output
# If not, rebuild LLVM with AMDGPU target
```
The current mesa recipe uses `llvm21` as a dependency. Verify:
1. LLVM 21 is built with the AMDGPU target
2. The target's `llvm-config` reports AMDGPU support
3. The mesa build can find the LLVM AMDGPU libraries
If AMDGPU target is missing, rebuild LLVM:
```bash
# In the LLVM recipe or toolchain build:
-DLLVM_TARGETS_TO_BUILD="X86;AMDGPU"
```
#### 3B: Mesa recipe modification
Add radeonsi to the Gallium drivers list:
```diff
- -Dgallium-drivers=swrast,virgl,iris \
+ -Dgallium-drivers=swrast,virgl,iris,radeonsi \
```
Additional meson flags needed:
```bash
-Dvulkan-drivers=swrast \ # Keep swrast only for now (RADV deferred)
-Dllvm=enabled \ # Already enabled
-Dgallium-va=disabled \ # Disable VA-API (no AMD video accel yet)
-Dgallium-vdpau=disabled \ # Disable VDPAU
-Dgallium-omx=disabled \ # Disable OpenMAX
-Dgallium-nine=false \ # Disable Direct3D 9
-Dgallium-opencl=disabled \ # Disable OpenCL (needs ROCm)
-Dvideo-codecs=[] \ # No hardware video codecs yet
```
#### 3C: libdrm_amdgpu runtime validation
Verify libdrm_amdgpu works with redox-drm scheme:
1. `amdgpu_device_initialize()` — opens `/scheme/drm/card0`, reads GPU info
2. `amdgpu_bo_alloc()` — allocates GEM buffer via `DRM_IOCTL_AMDGPU_GEM_CREATE`
3. `amdgpu_bo_cpu_map()` — mmaps GEM buffer via redox-drm scheme
4. `amdgpu_cs_submit()` — submits command buffer via `DRM_IOCTL_AMDGPU_CS`
These ioctls must flow through the DRM ioctl bridge patch (`P1-drm-ioctl-bridge.patch`) to the redox-drm scheme. The scheme must understand AMD GPU ioctl codes and dispatch them to the amdgpu kernel driver.
#### 3D: radeonsi winsys integration
The radeonsi winsys (`src/gallium/winsys/radeon/drm/`) must be adapted:
1. `radeon_drm_winsys.c` — opens DRM fd, queries GPU info
2. `radeon_drm_bo.c` — buffer allocation/free/map
3. `radeon_drm_cs.c` — command stream submission
Since Redox uses a scheme-based DRM (not Linux ioctls), the winsys needs to:
1. Open `/scheme/drm/card0` instead of `/dev/dri/card0`
2. Use `call()` scheme messages instead of `ioctl()` syscalls
3. Map GEM buffers through scheme mmap path
The existing libdrm ioctl bridge patch (`P1-drm-ioctl-bridge.patch`) handles this translation in libdrm. mesa's radeonsi winsys calls libdrm_amdgpu functions (not raw ioctl), so the bridge should work transparently IF libdrm_amdgpu functions are correctly implemented.
**Exit criteria:**
- Mesa compiles with `-Dgallium-drivers=...radeonsi` for Redox target
- `radeonsi_dri.so` produced in `usr/lib/dri/`
- `glxinfo` (or equivalent) reports radeonsi as the renderer
- Software rendering through radeonsi produces correct output (e.g., glxgears runs)
---
### Phase 4: Wayland/KWin Compositing (46 weeks, parallel with Phase 3)
**Goal:** KWin Wayland compositor uses AMD GPU for display output and OpenGL rendering through radeonsi.
#### 4A: AMD as DRM master
When redox-drm detects an AMD GPU on the PCI bus, it must:
1. Initialize the amdgpu kernel driver (call into `libamdgpu_dc_redox.so`)
2. Register `/scheme/drm/card0` with the AMD backend
3. Expose the AMD connector/CRTC/encoder topology through KMS ioctls
4. Handle page flip events from AMD display interrupts
The current `redox-drm/src/drivers/amd/mod.rs` provides connector detection and modesetting via the C FFI. This must be expanded to use the full amdgpu Display Core once compiled.
#### 4B: GBM buffer allocation
GBM (Generic Buffer Manager) needs to allocate buffers on the AMD GPU:
1. `gbm_create_device()` — opens `/scheme/drm/card0` (AMD)
2. `gbm_bo_create()` — allocates via `amdgpu_bo_alloc()``DRM_IOCTL_AMDGPU_GEM_CREATE`
3. `gbm_bo_map()` — mmaps via scheme
4. `gbm_bo_get_fd()` — exports PRIME fd (needs PRIME support in redox-drm)
The Mesa GBM backend (`src/gbm/backends/dri/gbm_dri.c`) uses libdrm — if libdrm_amdgpu is functional, GBM should work transparently.
#### 4C: KWin DRM backend
KWin's DRM backend (`src/plugins/drm/`) needs:
1. Open `/scheme/drm/card0` as the primary DRM device
2. Enumerate connectors/modes via libdrm
3. Create framebuffers via GBM
4. Perform atomic modeset via `drmModeAtomicCommit()`
5. Handle page flip events
The `KWIN_DRM_DEVICES=/scheme/drm/card0` environment variable is already set in `redbear-full.toml`. KWin must be able to open this path and use it as a DRM fd.
**Challenge**: KWin's DRM backend expects Linux `/dev/dri/card0` semantics. The libdrm patches translate ioctls, but the fd must behave like a DRM device node (select/poll for events, mmap for buffers). The redox-drm scheme already handles this — verified with Intel display path.
**Exit criteria:**
- KWin opens `/scheme/drm/card0` on AMD hardware
- Connector enumeration shows AMD display outputs
- KWin compositor renders at native resolution with radeonsi OpenGL
- Page flip events trigger frame scheduling
- Hardware cursor visible
---
### Phase 5: Hardware Validation (48 weeks, overlaps Phases 24)
**Goal:** Prove the full stack works on real AMD GPU hardware.
#### 5A: Test hardware requirements
- AMD GPU with Display Core support: Navi 1x (RDNA1), Navi 2x (RDNA2), or Navi 3x (RDNA3)
- PCIe x16 connection (desktop) or internal eDP (laptop)
- Display connected via DP or HDMI
- Red Bear OS bootable via UEFI
#### 5B: Validation gates
| Gate | What to check | Tools |
|---|---|---|
| **G1: GPU probe** | `lspci` shows AMD GPU. `redox-drm` logs "AMD driver ready" with device ID. | `redbear-hwutils phase5-gpu-check` |
| **G2: Firmware load** | amdgpu firmware blobs loaded via `scheme:firmware`. DMCUB firmware uploaded to GPU. | `redbear-info` firmware section |
| **G3: Display init** | DC initializes. Connectors enumerated. EDID read from real monitor. | `cat /scheme/drm/card0/connectors` |
| **G4: Modeset** | CRTC set to native resolution. Display shows Red Bear framebuffer. | Visible output on monitor |
| **G5: Page flip** | Smooth framebuffer transitions. No tearing. | `redbear-phase5-gpu-check --page-flip` |
| **G6: OpenGL render** | Mesa radeonsi renders OpenGL triangle. Output visible on display. | `glxgears` or equivalent |
| **G7: KWin compositor** | KWin starts on AMD GPU. Desktop visible. Window management works. | Boot to desktop |
| **G8: KDE Plasma** | Plasma desktop runs with OpenGL compositing on AMD GPU. | Full desktop session |
#### 5C: Test scripts
Create `local/scripts/test-amdgpu-full.sh`:
```bash
#!/bin/bash
# Full amdgpu validation harness
# Phases: probe → firmware → display → modeset → pageflip → opengl → kwin → plasma
```
**Exit criteria:**
- Gate G4 (modeset) minimum for Phase 2 completion
- Gate G6 (OpenGL) minimum for Phase 3 completion
- Gate G7 (KWin) minimum for Phase 4 completion
---
### Phase 6: Optimization and Polish (46 weeks)
**Goal:** Production-quality AMD GPU support.
#### 6A: Performance
- Enable GPU power management (DPM, clock gating)
- Enable DC states (DC5/DC6) for power saving
- Enable display compression (DSC) for high-resolution displays
- Optimize buffer allocation (VRAM vs GTT placement)
#### 6B: Multi-display
- Enable multi-CRTC support (multiple monitors)
- Test different connector types (DP, HDMI, eDP)
- Test hotplug (connect/disconnect while running)
#### 6C: Full feature set
- Hardware cursor (already have cursor infrastructure)
- Gamma/degamma color correction
- FreeSync/Adaptive Sync (if display supports it)
- Backlight control (for laptop panels)
#### 6D: Mesa RADV (Vulkan)
- Add `-Dvulkan-drivers=swrast,amd` to Mesa recipe
- Cross-compile RADV for Redox target
- Test Vulkan applications through KWin
---
## 3. Dependency Graph
```
linux-kpi gap filling (Phase 1)
|
v
amdgpu core compilation (Phase 2A)
|
v
amdgpu DC minimum subset (Phase 2B) ──────────────────────┐
| |
v v
amdgpu display output proof (Phase 2B gate) Mesa radeonsi (Phase 3)
| |
v v
libdrm_amdgpu runtime validation (Phase 3C) radeonsi winsys adapt (Phase 3D)
| |
+────────────────────┬─────────────────────────────+
|
v
KWin DRM backend (Phase 4)
|
v
Hardware validation (Phase 5)
|
v
Optimization & RADV (Phase 6)
```
## 4. Resource Requirements
| Resource | Need |
|---|---|
| **AMD GPU hardware** | Navi/RDNA GPU (RX 5000/6000/7000 series). Desktop preferred for PCIe debugging. |
| **Developer time** | 2440 weeks full-time. Can parallelize: Phase 1 + Phase 2A by one developer, Phase 3 + Phase 4 by another once Phase 2 gate passes. |
| **Linux reference** | `local/reference/linux-7.1/drivers/gpu/drm/amd/` — already present |
| **Test infrastructure** | QEMU with VFIO GPU passthrough (for early bringup without bare metal) |
## 5. Risk Register
| Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|
| DRM atomic helpers too large to shim | HIGH | Blocker for Phase 2B | Consider implementing a minimal "non-atomic to atomic" adapter that satisfies DC's atomic API calls without full atomic infrastructure |
| AMD DC depends on undocumented HW behavior | MEDIUM | Display corruption or no output | Use Linux as reference; test on exactly the GPU generation documented in Linux DC source |
| linux-kpi API surface too large | HIGH | Phase 1 drags beyond 6 weeks | Aggressively stub non-critical paths (debugfs, sysfs, ACPI, HDCP, FreeSync). Only implement what compilation demands. |
| Mesa radeonsi won't cross-compile | MEDIUM | Phase 3 blocked | LLVM AMDGPU target must be in toolchain. Fallback: use `swrast` only and focus on display path first. |
| No AMD GPU hardware available | HIGH | Cannot validate | Prioritize QEMU VFIO passthrough as intermediate step. Acquire hardware early in Phase 1. |
| libdrm_amdgpu ioctl bridge incomplete | MEDIUM | Mesa can't talk to AMD GPU | Extend `P1-drm-ioctl-bridge.patch` with missing AMD-specific ioctls as needed during Phase 3C. |
## 6. Success Criteria
- [ ] `libamdgpu_dc_redox.so` links all core amdgpu files + minimum DC subset
- [ ] Red Bear OS boots on AMD GPU hardware and detects the GPU via PCI
- [ ] AMD Display Core initializes and enumerates connected displays
- [ ] At least one display mode is set and visible output is produced
- [ ] Mesa radeonsi cross-compiles for Redox target
- [ ] OpenGL application renders through radeonsi on AMD GPU
- [ ] KWin Wayland compositor runs with DRM master on AMD GPU
- [ ] KDE Plasma desktop session functions with AMD GPU compositing
- [ ] Hotplug detection works (connect/disconnect monitor)
- [ ] System is stable for >1 hour of desktop use
## 7. Alternative Approaches
### 7A: Skip DC, use simple display
Instead of compiling the full AMD Display Core, use the existing bounded display glue path (`amdgpu_redox_main.c`) and expand it incrementally. This avoids the DRM atomic helper dependency entirely for display, while still enabling GPU compute/render through the core driver.
**Tradeoff**: No multi-display, no HDR, no FreeSync, no DSC. But gets basic display + 3D rendering working faster.
### 7B: Use virtio-gpu passthrough
For initial Mesa validation without real AMD hardware: pass through a physical AMD GPU to a QEMU VM via VFIO, then run Red Bear OS inside QEMU with the passed-through GPU. This avoids bare-metal boot debugging overhead.
### 7C: Rust-native AMD driver (longer-term)
Instead of compiling Linux amdgpu through linux-kpi, write a Rust-native AMD GPU driver using the same pattern as the Intel driver. This avoids the linux-kpi compatibility tax entirely but requires reimplementing the entire 941-file codebase in Rust.
**Tradeoff**: Much cleaner architecture, better safety, no C dependency. But 1020x more implementation work. Not recommended as the primary path.