24584eb3c6
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().
678 lines
38 KiB
Markdown
678 lines
38 KiB
Markdown
# 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**: 24–40 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 (1–2 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 (4–6 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, 4–8 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** (2–3 weeks)
|
||
- Full capability chain walking for MSI/MSI-X
|
||
- Config space read/write through `/scheme/pci/` scheme
|
||
- Power state management
|
||
|
||
3. **DMA scatter-gather** (2–3 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** (1–2 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** (1–2 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 10–20 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 (6–10 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 30–50 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 2–4 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 (4–6 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 (4–6 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 (4–8 weeks, overlaps Phases 2–4)
|
||
|
||
**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 (4–6 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** | 24–40 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 10–20x more implementation work. Not recommended as the primary path.
|