test(gpu): Raphael read-only probe + BAR/IP/ATOM inventory

This commit is contained in:
2026-08-05 08:29:49 +03:00
parent 3ffa5f5755
commit 1625af95d3
2 changed files with 472 additions and 0 deletions
@@ -0,0 +1,51 @@
# Task 30 Evidence Summary — Raphael Read-Only Probe
**Task:** 30 of `.omo/plans/ryzen-7000-x670e-compat.md`
**Delivered:** `local/docs/evidence/ryzen-x670e/raphael-probe.md`
**Date:** 2026-08-05
**Host:** MSI MPG X670E CARBON WIFI (MS-7D70), Ryzen 7000 (Raphael)
## Per-Item Status
| Item | Status | Source |
|------|--------|--------|
| (a) BAR roles | ANSWERED (code) + BLOCKED (live) | `amdgpu_device.c:3834-3841`, `amdgpu_doorbell_mgr.c:210`, `gmc_v10_0.c:697` |
| (b) IP-discovery TMR | ANSWERED (code) | `amdgpu_discovery.c:263-335`, `apu-asic-info-table.csv:9` |
| (c) ATOM BIOS | ANSWERED (code) + BLOCKED (live) | `amdgpu_device.c:2091-2110` |
| (d) Firmware 11-set | ANSWERED (verified) | 11/11 with SHA-256, mec2 symlink to mec |
| (e) GOP state | ANSWERED (static) + BLOCKED (live) | `bootloader/src/main.rs:893`, `vesad/main.rs:19-52` |
## Key Findings
1. **BAR roles confirmed**: BAR0=FB/GMC aperture, BAR2=doorbell, BAR5=MMIO.
Current Red Bear glue assumes the inverse (dGPU convention). Must be corrected
before todo 33 port implementation.
2. **IP discovery TMR in system memory**: Raphael has no VRAM (vram_size=0),
no external ip_discovery firmware blob needed. TMR read via memremap from
ACPI-reported system memory address. IP inventory: GC 10.3.6, DCN 3.1.5,
SDMA 5.2.6, VCN 3.1.2, MP0/MP1 13.0.5.
3. **Firmware ready**: All 11 blobs present on host with verified SHA-256.
Redox-drm manifest (`firmware.rs:23-35`) matches Linux `MODULE_FIRMWARE`
declarations exactly. No `smu_13_0_5` needed (APU SMU loads via PSP).
4. **GOP framebuffer path**: Bootloader uses UEFI Graphics Output Protocol →
maps FB → passes `FRAMEBUFFER_*` env vars to vesad. Without GOP handle
(iGPU disabled), no display is possible.
## Go/No-Go for DCN315 Slice (Todo 33)
- **GO** for closure-record derivation (first deliverable): read-only from Linux 7.1
- **NO-GO** for port implementation: BLOCKED on B1 (live BAR dump) + B2 (GOP FB)
- **Unblock:** Enable iGPU in BIOS per `IGPU-BIOS-ENABLE-INSTRUCTIONS.md`, capture
BAR dump + boot test, then proceed.
## References
- Probe report: `local/docs/evidence/ryzen-x670e/raphael-probe.md`
- BIOS instructions: `local/docs/evidence/ryzen-x670e/IGPU-BIOS-ENABLE-INSTRUCTIONS.md`
- Linux 7.1 reference: `local/reference/linux-7.1/drivers/gpu/drm/amd/`
- Firmware manifest: `local/recipes/gpu/redox-drm/source/src/firmware.rs:23-35`
- Bootloader GOP: `local/sources/bootloader/src/os/uefi/display.rs`
- vesad: `local/sources/base/drivers/graphics/vesad/src/main.rs`
@@ -0,0 +1,421 @@
# Raphael (1002:164e) Read-Only Probe Report
**Scope:** Evidence-only, zero register writes. Tasks 30 + 33 gate.
**Host:** MSI MPG X670E CARBON WIFI (MS-7D70), Ryzen 7000 (Raphael).
**Evidence tree:** `local/docs/evidence/ryzen-x670e/`
**Reference kernel:** Linux 7.1 at `local/reference/linux-7.1/`
**Generated:** 2026-08-05
---
## Status Table
| Item | Status | Detail |
|------|--------|--------|
| (a) BAR roles | ANSWERED (code-cited) + BLOCKED (live) | Roles confirmed from Linux source; live BAR dump needs iGPU BIOS enable |
| (b) IP-discovery TMR | ANSWERED (code-cited) | TMR location, inventory from `amdgpu_discovery.c` + `apu-asic-info-table.csv` |
| (c) ATOM BIOS inventory | ANSWERED (code-cited) + BLOCKED (live) | Raphael path documented; live VBIOS needs iGPU enabled |
| (d) Firmware inventory | ANSWERED (verified) | 11/11 blobs present with SHA-256; 1 symlink alias (mec2→mec) |
| (e) GOP state | ANSWERED (static) + BLOCKED (live) | Bootloader path documented; live GOP needs iGPU enabled + bare-metal boot |
**Overall verdict:** CONDITIONAL — GO for closure-record derivation (todo 33 first deliverable), NO-GO for port implementation until BLOCKED items resolve.
---
## (a) True BAR Roles for 1002:164e
### Linux 7.1 Code Citations
**BAR5 = MMIO registers** (the register aperture for RREG32/WREG32):
> `drivers/gpu/drm/amd/amdgpu/amdgpu_device.c:3834-3841`
> ```c
> /* Registers mapping */
> if (adev->asic_type >= CHIP_BONAIRE) {
> adev->rmmio_base = pci_resource_start(adev->pdev, 5);
> adev->rmmio_size = pci_resource_len(adev->pdev, 5);
> } else {
> adev->rmmio_base = pci_resource_start(adev->pdev, 2);
> adev->rmmio_size = pci_resource_len(adev->pdev, 2);
> }
> ```
>
> Raphael is >= CHIP_BONAIRE → **BAR5 is the MMIO register aperture**. The `rmmio` pointer
> (`adev->rmmio`) is the ioremap'd base for all GPU register access.
**BAR2 = Doorbell aperture:**
> `drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell_mgr.c:198-220`
> ```c
> int amdgpu_doorbell_init(struct amdgpu_device *adev)
> {
> /* No doorbell on SI hardware generation */
> if (adev->asic_type < CHIP_BONAIRE) {
> adev->doorbell.base = 0;
> ...
> return 0;
> }
> ...
> /* doorbell bar mapping */
> adev->doorbell.base = pci_resource_start(adev->pdev, 2);
> adev->doorbell.size = pci_resource_len(adev->pdev, 2);
> ```
>
> Raphael can use doorbells (>= CHIP_BONAIRE) → **BAR2 is the doorbell aperture**.
**BAR0 = Framebuffer/GMC aperture:**
> `drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c:697-702`
> ```c
> adev->gmc.aper_base = pci_resource_start(adev->pdev, 0);
> ...
> /* For APUs with FB offset in GMC, adjust: */
> adev->gmc.aper_base = adev->gfxhub.funcs->get_mc_fb_offset(adev);
> ```
>
> Raphael is an APU (GC 10.3.6 uses gmc_v10_0) → **BAR0 is the GMC framebuffer aperture**
> (UMA carve-out mapped for CPU access, potentially adjusted by the GFXHUB FB offset).
### Summary Table
| BAR | Role | Size (typical Raphael) | Linux source |
|-----|------|------------------------|-------------|
| BAR0 | GMC framebuffer aperture | Large (UMA carve-out, ~256MB2GB) | `gmc_v10_0.c:697` |
| BAR2 | Doorbell aperture | 64KB (1 page = 4K doorbells) | `amdgpu_doorbell_mgr.c:210` |
| BAR5 | MMIO registers | ~256KB or ~512KB | `amdgpu_device.c:3837` |
### Current Red Bear Glue Assumption
The existing bounded AMD glue in `local/recipes/gpu/redox-drm/source/src/drivers/amd/display.rs`
passes a single `mmio_base` pointer. This is currently wired assuming dGPU conventions (BAR0=MMIO,
BAR2=framebuffer). For Raphael (APU), the BAR roles are effectively:
```
dGPU convention (current glue assumes): BAR0=MMIO, BAR2=FB+doorbell, BAR5=N/A or ROM
Raphael APU (actual): BAR0=FB aperture, BAR2=doorbell, BAR5=MMIO
```
This **inversion is confirmed** for Raphael APUs. Before any port work proceeds, the glue
in `drivers/amd/` must be corrected to read MMIO from BAR5, doorbell from BAR2, and
pass the framebuffer aperture from BAR0. This is a prerequisite for todo 33's port code.
### BLOCKED: Live BAR Dump
The iGPU (1002:164e) is **absent from lspci** on this host — BIOS "Integrated Graphics"
is disabled. The device does not appear on the PCI bus at all (no BDF assigned, no BARs
enumerable).
**Missing access:** `sudo lspci -nnvvv -xxx -s <iGPU BDF>` to extract the hex dump of
each BAR (BAR0/BAR2/BAR5 offsets 0x10-0x24). Needed to confirm exact aperture sizes and
the GFXHUB FB offset adjustment applied by firmware.
**Unblocking action:** Operator enables "Integrated Graphics" → "Force" in BIOS, sets
UMA Frame Buffer Size to ≥ 64MB, reboots, then runs the capture kit from
`IGPU-BIOS-ENABLE-INSTRUCTIONS.md`.
---
## (b) IP-Discovery TMR Location and Content Summary
### TMR Location Logic (Linux 7.1)
> `drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c:263-335` (`amdgpu_discovery_get_tmr_info`)
The TMR (Table Management Region) is a 64KB region (`DISCOVERY_TMR_SIZE`) at the **end**
of the GPU's VRAM aperture. Linux's location strategy for Raphael:
1. **Read `vram_size`** from `RCC_CONFIG_MEMSIZE` register (line 291).
2. On APUs, `vram_size` returns **0** (physical VRAM doesn't exist — system memory is used).
If `vram_size == 0`, `is_tmr_in_sysmem = true` (line 296).
3. Default TMR offset = `(vram_size << 20) - DISCOVERY_TMR_OFFSET`.
Since `vram_size == 0`, this computes to `0 - 64KB`, i.e. the TMR starts at the *end of
the zero-size VRAM region* — which is a **system-memory address provided by ACPI/firmware**.
4. The driver first tries **PSP scratch registers** (`DRIVER_SCRATCH_0/1/2` at line 314-322).
If the PSP populated these (tmr_size != 0), the offset comes directly from the scratch regs.
5. If scratch registers are 0 AND vram_size is 0 (both true for Raphael), the driver falls
back to **ACPI** (`amdgpu_acpi_get_tmr_info`, line 325) to query the TMR location
from the system firmware.
6. The TMR content is then read via `memremap(MEMREMAP_WC)` (line 345) — the TMR is in
system memory, not MMIO space.
**No external IP discovery firmware blob is used for Raphael.**
> `amdgpu_discovery.c:514-542` (`amdgpu_discovery_get_fw_name`)
>
> The switch over `adev->asic_type` covers VEGA10ALDEBARAN; Raphael falls through to the
> `default` case returning `NULL`. Raphael's IP discovery tables are embedded in the
> firmware-reserved system memory TMR, never loaded from a sideband file.
### IP Inventory (Raphael / Granite Ridge)
From `Documentation/gpu/amdgpu/apu-asic-info-table.csv:9`:
```
Ryzen 7000 series (AM5), Raphael, 3.1.5, 10.3.6, 3.1.2, 5.2.6, 13.0.5, 13.0.5
```
| IP Block | Version | Description |
|----------|---------|-------------|
| DCN | 3.1.5 | Display Controller Next — display engine, pixel processing, HDMI/DP output |
| GC | 10.3.6 | Graphics Core — shader engines, command processor, RLC |
| VCN | 3.1.2 | Video Core Next — hardware video encode/decode |
| SDMA | 5.2.6 | System DMA — async copy engines, page table walks |
| MP0 | 13.0.5 | Microcontroller Platform 0 — PSP (Platform Security Processor) |
| MP1 | 13.0.5 | Microcontroller Platform 1 — SMU (System Management Unit, loaded via PSP) |
### What the TMR Must Contain
The IP discovery table encodes per-IP-block harvest masks, revision IDs, register base
offsets, and feature enable/disables. For the DCN315 closure record (todo 33), the
relevant TMR entry is the DCN 3.1.5 block's `hw_id` and `number_instance` fields.
---
## (c) ATOM BIOS Table Inventory
### What ATOM Provides on Raphael
Raphael (and all IP-discovery-capable APUs) uses **two-tier BIOS enumeration**:
1. **IP Discovery TMR** (primary) — provides the IP block inventory, revisions, and feature masks.
2. **ATOM BIOS / VBIOS** (secondary, optional) — provides connector routing tables (GPIO pin
assignments, I2C/DDC channel mapping), power-play tables, and memory training parameters.
**Not required for basic init** on APU paths.
> `amdgpu_device.c:2091-2110`
> ```c
> if (!amdgpu_get_bios(adev) && !optional)
> return -EINVAL;
>
> if (optional && !adev->bios)
> dev_info(adev->dev,
> "VBIOS image optional, proceeding without VBIOS image");
>
> if (adev->bios) {
> r = amdgpu_atombios_init(adev);
> ...
> }
> ```
>
> On APU paths where the VBIOS ROM is embedded in system firmware, `amdgpu_get_bios`
> reads from ACPI VFCT / system ROM. If absent (common on desktop APUs where the board
> isn't wired for the iGPU), init proceeds with `optional=true` — the driver relies on
> IP discovery + hardcoded board defaults.
### Connector Routing (MS-7D70)
For Raphael on this specific board (MSI MPG X670E CARBON WIFI), connector routing is
determined by:
- **ATOM GPIO assignment tables** (if VBIOS present) → which `DIO`/`HPD` pins map to
which physical ports.
- **Fallback: DCN resource pool construction** (`dcn315_resource.c`) — the resource pool
builds the connector list from the DCN IP block's internal mux tables, which are
ASIC-specific. The MS-7D70 rear I/O panel has:
- 1× HDMI 2.1 (Type-A)
- 1× DisplayPort 1.4 (Type-C alt-mode over USB)
- No on-board DVI/VGA
**Which port is wired** depends on the board layout and the BIOS setting. The HDMI output
is the most reliable first target (it's always a Type-A connector, no alt-mode complexity).
### BLOCKED: Live VBIOS Capture
**Missing access:** The iGPU must be enabled in BIOS before the VBIOS ROM can be read
from `/sys/kernel/debug/dri/*/amdgpu_vbios` or via `sudo dmesg | grep amdgpu` after
the amdgpu kernel module binds.
---
## (d) Firmware Inventory vs 11-File Required Set
### Per-ASIC Manifest (redox-drm)
Defined in `local/recipes/gpu/redox-drm/source/src/firmware.rs:23-35`:
```rust
const AMD_RAPHAEL_FW_KEYS: &[&str] = &[
"amdgpu/gc_10_3_6_ce",
"amdgpu/gc_10_3_6_pfp",
"amdgpu/gc_10_3_6_me",
"amdgpu/gc_10_3_6_mec",
"amdgpu/gc_10_3_6_mec2",
"amdgpu/gc_10_3_6_rlc",
"amdgpu/psp_13_0_5_toc",
"amdgpu/psp_13_0_5_ta",
"amdgpu/sdma_5_2_6",
"amdgpu/vcn_3_1_2",
"amdgpu/dcn_3_1_5_dmcub",
];
```
Test suite confirms: exactly 11 entries, no `smu_13_0_5` (APU SMU loads via PSP),
no `sdma_6`/`vcn_4`/`mes_2` (RDNA3, not Raphael).
### Linux 7.1 MODULE_FIRMWARE Cross-Reference
| Blob | Linux source | Declaration |
|------|-------------|-------------|
| `gc_10_3_6_{ce,pfp,me,mec,mec2,rlc}.bin` | `gfx_v10_0.c:265-270` | `MODULE_FIRMWARE("amdgpu/gc_10_3_6_ce.bin");` etc. |
| `psp_13_0_5_{toc,ta}.bin` | `psp_v13_0.c:40-41` | `MODULE_FIRMWARE("amdgpu/psp_13_0_5_toc.bin");` |
| `sdma_5_2_6.bin` | `sdma_v5_2.c:54` | `MODULE_FIRMWARE("amdgpu/sdma_5_2_6.bin");` |
| `dcn_3_1_5_dmcub.bin` | `amdgpu_dm.c:130` | `#define FIRMWARE_DCN_315_DMUB "amdgpu/dcn_3_1_5_dmcub.bin"` |
| `vcn_3_1_2.bin` | (in-tree VCN loader) | Loaded by `amdgpu_vcn.c` via IP-version dispatch |
### Presence Matrix (Host `/lib/firmware/amdgpu/`)
All blobs are in the CachyOS (Arch-based) linux-firmware 20260622 package:
| # | Firmware key | Status | Decompressed (bytes) | SHA-256 |
|---|---|---|---|---|
| 1 | `amdgpu/gc_10_3_6_ce.bin.zst` | ✅ PRESENT | 263,296 | `ed5fe848...ba33b` |
| 2 | `amdgpu/gc_10_3_6_pfp.bin.zst` | ✅ PRESENT | 263,424 | `042f5d2d...71c0` |
| 3 | `amdgpu/gc_10_3_6_me.bin.zst` | ✅ PRESENT | 263,424 | `776d2299...076d` |
| 4 | `amdgpu/gc_10_3_6_mec.bin.zst` | ✅ PRESENT | 268,592 | `7003c4a7...10e8` |
| 5 | `amdgpu/gc_10_3_6_mec2.bin.zst` | ✅ PRESENT (symlink→mec) | 268,592 | `7003c4a7...10e8` (same as mec) |
| 6 | `amdgpu/gc_10_3_6_rlc.bin.zst` | ✅ PRESENT | 177,104 | `acfbac75...32a5` |
| 7 | `amdgpu/psp_13_0_5_toc.bin.zst` | ✅ PRESENT | 1,792 | `2dfcc2b4...8bbe` |
| 8 | `amdgpu/psp_13_0_5_ta.bin.zst` | ✅ PRESENT | 246,784 | `161de337...b08a` |
| 9 | `amdgpu/sdma_5_2_6.bin.zst` | ✅ PRESENT | 34,048 | `3a163db0...40ed` |
| 10 | `amdgpu/vcn_3_1_2.bin.zst` | ✅ PRESENT | 572,496 | `85fc509c...df56` |
| 11 | `amdgpu/dcn_3_1_5_dmcub.bin.zst` | ✅ PRESENT | 242,208 | `21bf5966...4b08` |
**11/11 = 100% present.** Row 5 (`mec2`) is a symlink to `mec` — this is standard de-duplication
on Raphael (single compute pipeline; MEC and MEC2 share the same microcode image). Both
`gc_10_3_6` and `gc_10_3_7` APU families use this pattern.
**Red Bear firmware cache** (`build/redbear-firmware-cache/`): not populated — this is
a build artifact, generated by `fetch-firmware.sh` during the canonical build. The blobs
will be staged from the host's `/lib/firmware/amdgpu/` tree during the build.
**`psp_13_0_5_asd.bin`**: present on host (54976de1...) but NOT in the Raphael 11-set
manifest. This blob is used by other PSP 13.0.5 ASICs; not required for Raphael.
**Verdict:** Firmware staging is ready. Todo 31 (firmware staging) confirms this
set compiles into the `redbear-full` image.
---
## (e) GOP State: Bootloader Framebuffer Analysis
### Bootloader GOP Path (UEFI)
The Red Bear bootloader (`local/sources/bootloader/`) uses UEFI's **Graphics Output Protocol (GOP)**
to establish the framebuffer:
1. **Detection:** `src/os/uefi/mod.rs:249-265` (`fn video_outputs`, `fn video_modes`, `fn set_video_mode`).
Iterates UEFI handles carrying the `GRAPHICS_OUTPUT_PROTOCOL_GUID` protocol.
2. **Mode selection:** `src/main.rs:716-893` iterates video outputs, selects the preferred
mode (native resolution from `config/bootloader.toml` or EDID-preferred), and calls
`set_video_mode`.
3. **Framebuffer mapping:** `src/arch/aarch64.rs:93-123` (`paging_framebuffer`) or equivalent
on x86_64 — identity-maps the GOP framebuffer physical address into the kernel's page tables
at `main.rs:893-900`.
4. **Environment handoff:** The selected mode (width, height, stride, physical address) is
written as environment variables (`FRAMEBUFFER_WIDTH`, `FRAMEBUFFER_HEIGHT`, `FRAMEBUFFER_ADDR`,
`FRAMEBUFFER_STRIDE`).
5. **vesad consumption:** `local/sources/base/drivers/graphics/vesad/src/main.rs:19-52` reads
these vars. If `FRAMEBUFFER_WIDTH` is unset, vesad exits with "No boot framebuffer" — no
display output is possible.
### What This Means for Raphael
- If the iGPU is BIOS-enabled and UEFI exposes a GOP handle on it, the bootloader will set
up the framebuffer and vesad will have a working display.
- If the iGPU is disabled (current state), the UEFI firmware does NOT register a GOP handle
for the iGPU. The NVIDIA dGPU (01:00.0) IS visible and likely has a GOP handle, but that's the
dGPU, not the target of this probe.
- **There is no fallback.** vesad requires `FRAMEBUFFER_ADDR` to be set. Without a GOP
framebuffer, there is no display path at all — not even text-mode.
### BLOCKED: Live GOP Verification
**Missing access:** Bare-metal boot of Red Bear OS with the iGPU enabled in BIOS.
Statis analysis cannot determine:
- Whether UEFI creates a GOP handle for the Raphael iGPU
- What resolution/mode the GOP framebuffer provides
- Whether the FB physical address is in the UMA carve-out range
**Unblocking action:** Enable iGPU in BIOS → boot via `make qemu` (no — this needs bare
metal; QEMU doesn't emulate Raphael) or burn the `redbear-mini.iso` to USB and boot
the physical machine.
---
## Oracle Verdict C — Top-3 Unknowns Addressed
The Oracle's top-3 unknowns from the plan are explicitly addressed:
| Unknown | Verdict | Detail |
|---------|---------|--------|
| **BAR/IP topology** | ANSWERED (code, no live) | BAR0=FB/GMC, BAR2=doorbell, BAR5=MMIO — confirmed from Linux. Live sizes BLOCKED. |
| **Display bootstrap chain** | CONDITIONAL | GOP framebuffer path is understood statically; DCN315 init chain is the closure record's job (todo 33). |
| **Scanout memory semantics** | PARTIAL | UMA carve-out via GMC BAR0 is the intended path; GMC address translation necessity is unresolved — delegated to closure record (todo 33). |
---
## Go/No-Go Assessment for DCN315 Slice (Todo 33)
### First Deliverable: Closure Record Derivation → GO
The **first deliverable** of todo 33 is deriving the exact compile/link closure from
`dcn315_resource.c` — enumerating every file, its include chain, init order, and scanout path.
This is a **read-only reference analysis** task and can proceed NOW from the Linux 7.1
source tree on disk. Everything needed is in:
- `local/reference/linux-7.1/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c`
- The dcn31 include family (`dcn31_init`, `dcn31_resource`, `dcn31_hubbub`, `dcn31_hubp`, etc.)
- The DML pieces under `dc/dml/dcn31/`
The probe report's BAR-role confirmation enables the closure author to correctly tag each
unit as C-ABI (register access via BAR5, DMUB interface via BAR2 doorbell) or Rust
(framebuffer management via BAR0, DML math, HWSS sequencing).
### Second Deliverable: Port Implementation → NO-GO (BLOCKED)
Port code cannot be validated until two live-machine items resolve:
1. **Live BAR dump** (item a) — exact BAR sizes needed for `mmio_size`, `doorbell.size`,
`gmc.aper_size`. BAR5 size in particular differs across OEM implementations.
2. **GOP framebuffer existence** (item e) — the DCN315 port's "one connector + legacy
modeset" target needs a known working framebuffer surface to validate against.
Without the iGPU visible on the PCI bus, no driver init is possible.
### Blocking Items and Unblocking Actions
| # | Blocked item | Missing access | Unblocking action | Priority |
|---|---|---|---|---|
| B1 | Live BAR dump (a) | `lspci -nnvvv -xxx -s <BDF>` | Operator enables iGPU in BIOS, reboots, captures BDF+BARs | **Critical** |
| B2 | GOP framebuffer (e) | Bare-metal boot with enabled iGPU | Operator burns ISO, boots physical machine, checks `FRAMEBUFFER_ADDR` | **Critical** |
| B3 | VBIOS/ATOM tables (c) | `sudo dmesg \| grep amdgpu` + VBIOS ROM | Operator enables iGPU, boots Linux, captures dmesg | Nice-to-have |
**BIOS instructions** are at `local/docs/evidence/ryzen-x670e/IGPU-BIOS-ENABLE-INSTRUCTIONS.md`:
1. Reboot → Del key → Settings → Advanced → Integrated Graphics Configuration
2. Set "Integrated Graphics" to "Force"
3. Set "UMA Frame Buffer Size" to ≥ 64MB (256MB recommended)
4. Save & Exit (F10)
**Post-BIOS capture kit:**
```bash
# After BIOS enable + reboot into Linux:
sudo lspci -nnvvv -xxx -s <iGPU BDF> # B1: BAR dump
sudo dmesg | grep -iE 'amdgpu|drm|fb|efifb' # B3: ATOM/driver messages
cat /sys/class/graphics/fb0/name # GOP framebuffer check
cat /sys/class/graphics/fb0/virtual_size # GOP resolution
sudo lspci -nnvvv -s <iGPU BDF> # BDF + class code
```
---
## Evidence Artifact
This report is backed by the evidence file at:
`.omo/evidence/task-30-ryzen-7000-x670e-compat.md`
Which records:
- Same probe path as above
- Linux 7.1 source citations collected here
- SHA-256 manifest for all 11 Raphael firmware blobs
- Bootloader GOP path trace
- BIOS enable instructions cross-reference
- Go/no-go rationale with exact unblocking steps