Repository navigation
Conversation
Empty commit: a draft PR to discuss merging the Apple A9 (iPad 5) GPU work into OrchardLinux. Nothing here is meant to be merged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Apple A9 GPU on Linux: update after the 11-02 reply (2026-11-03)A follow-up to our reply of 2026-11-02, not a re-send. Part A is what changed on A9 since then, proven results first. Part B is our position on the merge and the questions that decide the plan. Headline: Hyprland with GPU clients, with the GPU never parked, runs at the 60 Hz cap on A9 with 0 faults, and the GPU runs above 340 MHz for the first time. Labels: [V] read from a hardware log, [I] inferred, [O] built and checked offline, not yet run on hardware. Written by our AI agents from our notes and hardware logs. Part A. What changed on A9A1. Correction to our 11-02 §1.2: register reads after jobsOur 11-02 reply was wrong about R1. It said two kernels hung with one
So your Fender+0x1000 governor writes being harmless on A10 fit this picture: your firmware never parks the GPU, so R0 is never behind a stale check. Bit 29 is a firmware-side handshake, so it may exist on A10 too. Does your firmware ever set A2. Never-park, several clients, and four faults on the way [V]
A3. The GPU clockProven [V]: the GPU runs at 474 MHz (pstate 2) on Linux, and in today's ladder up to 723 MHz (below), the first boot above 340 MHz. The host powers the GPU on directly at pstate q when it releases the firmware, and writes the firmware's target words to the same q first. ALIVE came at state 2, every job ran at pstate 2 (1812 doorbells read state 2), and there were 0 faults. In today's ladder run, gears stayed at the 60 Hz cap and the median job time fell from about 4.3 ms (340 MHz) to 3.9 ms. That is a hardware log of today's run, not yet written up. What we learned on the way:
A4. Performance: Hyprland at the 60 Hz cap at 340 MHz [V]Gears windowed under the Omarchy Hyprland session, the same session every step, all at 340 MHz:
Per-job host time fell from 7–8 ms to about 5 ms.
Direct-to-swapchain Hyprland (one pass per frame). Hyprland 0.56.2 always renders into a work buffer and copies it to the swapchain, so every full-damage frame costs two full-panel passes. Our patch renders straight into the output buffer when nothing needs the offload (no blur, no colour management, no mirror, no screen shader, zoom 1), and otherwise takes the stock path in the same binary.
A5. Fixes you may want to reuse
A6. ES 3.0, and an offer for 3.1Status [V]: Zink offers OpenGL ES 3.0 / GLSL ES 3.00 with 0 failing terms. Exact on hardware: 2 and 4 colour targets, transform feedback (two buffers, 3000 vertices captured once), depth/stencil formats and sampling, the cube/NPOT/array texture types and 4× MSAA fixtures. Not done: 8 of 16 vertex inputs, storage images, narrow and integer colour targets, robustBufferAccess, and compute (the firmware takes a compute job and never retires it). When we read your fork on 11-01, its A7. Publishing, unchanged in substanceThe notes repository is public. The kernel and Mesa are still not. The kernel's desktop boot still runs through our bring-up ladder, including a 4-byte patch of Apple's firmware in RAM (the test without the patch has not run yet). The Mesa driver still embeds Apple's helper programs (153 instructions and 14 PDS programs we cannot yet re-encode). Neither is a matter of style. Both are tied to our own skeletons, and the merge below is how we plan to retire them: on your Mesa skeleton those programs come from upstream pdsc and our compiler, not from Apple's bytes, and the firmware patch has to go before our A9 kernel backend is published on your base. Our open questions to you from 11-02 §6 still stand. For the merge, the ones that matter most are 2 (post-job power), 3 (cache visibility) and 9 (the power envelope). Written by our AI agents (Claude) from our notes and hardware logs; labels: [V] read from a hardware log, [I] inferred, [O] built and checked offline. Draft for discussion only: the commit is empty and nothing here is meant to be merged. 🤖 Generated with Claude Code |
|
Same request as on OrchardLinux/mesa#1: please fork OrchardLinux/linux and OrchardLinux/mesa and push your A9 code there first. We'll review it and answer the kernel questions here once it's up. |
A discussion PR for merging the Apple A9 (iPad 5, G5P) GPU work into OrchardLinux, as Henrik asked: the questions are below and the full 2026-11-03 update is the first comment. Our A9 code is not public yet (see A7 in the update), so the branch holds one empty commit.
Position
Position. We still agree with your §4 direction: one Mesa driver on the upstream PowerVR Vulkan driver with per-generation Apple backends, and one Apple GPU kernel driver with typed, kernel-validated submits and per-context slots, and a firmware backend per chip. Nothing since 11-02 argues against it. A2 is a further reason for per-context PM records in the shared design.
Questions (kernel, firmware and clocks)
pvr_arch_*you replaced?asahi_drm.h, withVM_BIND, syncobjs and per-context slots? Anddrm_schedfor jobs? You already use it. Ours is a serial scheduler with round-robin between contexts.src/imaginationand Asahi do not take that upstream. We propose that the shared trees label it (aGenerated-bytrailer) and do not aim upstream unless human authors take over. Is that your view too?meta+0x6c8 = 0) also drops the firmware path our typed submits run on. So we run firmware policy with host power-on at q. Should the shared driver carry both modes, host-owned Fender (yours) and firmware policy plus power-on (ours), behind one devfreq interface?dt_set_gpu_pstates):opp-hzandopp-microvoltper state, up to the ~1 GHz state? IPSW device trees only carry placeholders. The A9 is close to the A10 in process and design, so your voltage at each frequency is the best guide we have for an A9 GPU overclock above 723 MHz. The raw PSINFO record words (PMGR GPU perf-state records) would be even better.Written by our AI agents (Claude) from our notes and hardware logs; labels: [V] read from a hardware log, [I] inferred, [O] built and checked offline. Draft for discussion only: the commit is empty and nothing here is meant to be merged.
🤖 Generated with Claude Code