{"id":50756236,"url":"https://github.com/visorcraft/orange-pi-6-plus-gpu","last_synced_at":"2026-06-11T05:03:39.122Z","repository":{"id":337517538,"uuid":"1153245843","full_name":"visorcraft/orange-pi-6-plus-gpu","owner":"visorcraft","description":"Orange Pi 6 Plus GPU bring-up on mainline/Armbian (SCMI ACPI/SMC, resets, Panthor)","archived":false,"fork":false,"pushed_at":"2026-02-09T22:32:39.000Z","size":111,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-02-10T02:29:13.969Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/visorcraft.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-09T04:35:00.000Z","updated_at":"2026-02-09T22:32:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/visorcraft/orange-pi-6-plus-gpu","commit_stats":null,"previous_names":["visorcraft/orange-pi-6-plus-gpu"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/visorcraft/orange-pi-6-plus-gpu","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/visorcraft%2Forange-pi-6-plus-gpu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/visorcraft%2Forange-pi-6-plus-gpu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/visorcraft%2Forange-pi-6-plus-gpu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/visorcraft%2Forange-pi-6-plus-gpu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/visorcraft","download_url":"https://codeload.github.com/visorcraft/orange-pi-6-plus-gpu/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/visorcraft%2Forange-pi-6-plus-gpu/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34183109,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-11T05:03:38.471Z","updated_at":"2026-06-11T05:03:39.116Z","avatar_url":"https://github.com/visorcraft.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Orange Pi 6 Plus GPU — Mali-G720 Immortalis MC10\n\nEnabling the Mali-G720 Immortalis MC10 (Panthor) GPU on the Orange Pi 6 Plus (CIX CD8180 / Sky1 SoC) under mainline Linux. This document covers our full reverse engineering process, the root cause of GPU power failure on ACPI boot, and how to get a working GPU using device tree boot with the [Sky1-Linux](https://github.com/Sky1-Linux/) kernel.\n\n## Quick Start\n\n→ **[Pre-built Sky1-Linux Kernel Downloads](./downloads/README.md)** — kernel, modules, DTB, and firmware ready to install.\n\nThen create a GRUB entry from [`gpu/grub/06_sky1`](gpu/grub/06_sky1) and reboot.\n\n## Status: ✅ GPU Working\n\n```\npanthor 15000000.gpu: [drm] clock rate = 900000000\npanthor 15000000.gpu: [drm] GPU DVFS: 6 OPPs from SCMI perf domain\npanthor 15000000.gpu: [drm] Mali-G720-Immortalis id 0xc870\npanthor 15000000.gpu: [drm] shader_present=0x550555 l2_present=0x1 tiler_present=0x1\n```\n\n| Detail | Value |\n|--------|-------|\n| Kernel | 6.19.0-rc8-sky1-rc.r6 ([Sky1-Linux](https://github.com/Sky1-Linux/) RC track) |\n| Boot mode | Device tree (`acpi=off`) |\n| DRM render | `/dev/dri/renderD128` |\n| Display | HDMI via Linlon-D60 + Trilin-DPSUB + PS185 DP-to-HDMI bridge |\n| OpenGL ES | 3.1 (Panfrost, Mesa 25.3.3) |\n| Vulkan | 1.4.328 (panvk, Mesa 25.3.3) |\n| GPU clock | 900 MHz, 6 DVFS operating points |\n| Shader cores | 10 (MC10 configuration) |\n\n---\n\n## Table of Contents\n\n1. [The Problem](#the-problem)\n2. [Mapping the Power Architecture](#step-1-mapping-the-power-architecture)\n3. [Exploring Every ACPI Path](#step-2-exploring-every-acpi-path)\n4. [The Breakthrough: TF-A's Dual Code Path](#step-3-the-breakthrough--tfas-dual-code-path)\n5. [Device Tree Boot on Armbian](#step-4-device-tree-boot-on-armbian)\n6. [Sky1-Linux: The Complete Solution](#step-5-sky1-linux-the-complete-solution)\n7. [How to Install](#how-to-install)\n8. [Boot Configuration](#boot-configuration)\n9. [Kernel Config Options](#required-kernel-config-options)\n10. [Verification](#verification)\n11. [Benchmarks](#benchmarks)\n12. [Known Issues](#known-issues)\n13. [Hardware Reference](#hardware-reference)\n14. [What's in This Repo](#whats-in-this-repo)\n15. [License \u0026 Attribution](#license--attribution)\n\n---\n\n## The Problem\n\nThe Orange Pi 6 Plus ships with CIX's vendor kernel (6.6-cix) and a proprietary out-of-tree `mali_kbase` driver. On a mainline Armbian kernel (6.18.x), the Mali-G720 GPU at MMIO address `0x15010000` is completely unreachable. Any attempt to read GPU registers — even the basic `GPU_ID` — results in a **Bus Error** that can cascade into a stuck process and system hang.\n\nThe mainline Panthor driver (in-tree since kernel 6.10) supports Mali-G720, but it only has an `of_match_table` (device tree) — no ACPI match. On Armbian's default ACPI boot, the driver never probes.\n\nWe set out to understand *why* the GPU couldn't power on and whether we could fix it.\n\n---\n\n## Step 1: Mapping the Power Architecture\n\nWe reverse-engineered the GPU power control path. The CIX CD8180 uses ARM's RCSU (Reset and Clock Supervision Unit) with DMRP (Domain Resource Power) registers to manage power partitions:\n\n| Address | Register | Access from EL1 | Purpose |\n|---------|----------|:---:|---------|\n| 0x15000010 | RCSU PASS | ✅ Readable | Power status readback |\n| 0x15000014 | RCSU ENBL | ❌ Firewalled | **Power enable — the critical register** |\n| 0x15000018 | RCSU BUSY | ✅ Readable | Power transition status |\n| 0x15000218 | RCSU MSK0 | ✅ Readable | Clock/partition mask |\n| 0x15010000 | GPU_ID | ❌ Bus Error | Mali GPU ID — unreachable when unpowered |\n| 0x16000400 | SRC DOMAIN_0 | ✅ Read/Write | Reset control — bit 6 = GPU |\n| 0x16000504 | MVCK | ❌ Firewalled | Validation gate, always reads 0 |\n\nThe critical finding: `RCSU ENBL` at `+0x14` is the power-on switch, but it's **firewalled from EL1**. The OS kernel cannot write it directly. Only EL3 (TF-A secure world) can touch it.\n\n---\n\n## Step 2: Exploring Every ACPI Path\n\nSince the board boots with ACPI by default, we systematically tried every possible ACPI mechanism to power the GPU. We built diagnostic kernel modules for each approach (see [`modules/`](modules/)):\n\n### ACPI `GPUP._ON` Method\nThe ACPI tables define a power resource for the GPU that calls into DMRP. But the DMRP path is gated by the MVCK register at `0x16000504`, which always reads zero and is firewalled. **Dead end.**\n\n### ACPI DSM (Device Specific Method)\nCIX's kernel source references a `cix_acpi_pd.c` GUID for ACPI power domain management. We checked: the DSM does not exist on the Generic BIOS v1.3 firmware. **Dead end.**\n\n### SCMI Power Protocol via TF-A\nThe ARM SCMI interface exposes 22 power domains through SMC call `0xc2000001`. Domain 21 (`gpu_pd`) accepts SET requests and **returns success (0)**. But the GPU stays dead. The SET is bookkeeping only — it never writes hardware registers. **Dead end.**\n\n### SCMI Power Protocol via SCP\nWe tried reaching the System Control Processor's SCMI endpoint directly via the mailbox transport. The SCP does not expose the POWER protocol at all — request DENIED (-8). **Dead end.**\n\n### SCMI Clocks\nGPU PLLs are running (1 GHz core clock, 900 MHz top clock visible in SCMI clock enumeration). The hardware is clocked — it's just not powered. **Confirmed clocks are not the issue.**\n\n### Reset Controller\nSky1's `reset-sky1` driver probes for ACPI ID `CIXHA020`, but the vendor `RSTL` ACPI binding isn't in mainline. `reset_control_get()` returns `-ENOENT`. **Dead end.**\n\n### Direct Reset Deassert\nWe wrote a diagnostic module to directly write the SRC (System Reset Controller) domain register. Bit 6 at offset `0x400` controls GPU reset. We successfully deasserted GPU reset — **confirmed by readback** — but without power, it accomplished nothing. **Proved reset works, but power is the blocker.**\n\n### Diagnostic Modules\n\n| Module | What It Does |\n|--------|-------------|\n| `gpu_power_diag.c` | Enumerates all 22 TF-A power domains, tests SET, safe GPU register read |\n| `gpu_reset_deassert.c` | Direct SRC register write to deassert GPU reset (bit 6) — confirmed working |\n| `gpu_acpi_poweron.c` | Triggers ACPI `PPRS._ON` via `acpi_device_set_power()` |\n| `gpu_dsm_poweron.c` | ACPI DSM attempt — confirmed DSM doesn't exist on this firmware |\n| `gpu_clk_enable.c` | Raw SCMI mailbox clock enable attempt |\n\n---\n\n## Step 3: The Breakthrough — TF-A's Dual Code Path\n\nAfter exhausting every ACPI path, we examined the behavior difference between ACPI and device tree boot at the firmware level. The same SMC call (`0xc2000001`) goes to the same TF-A handler, but **the handler has two code paths**:\n\n| Boot Mode | SCMI Power SET Behavior | Hardware Effect |\n|-----------|------------------------|-----------------|\n| **ACPI** | Software bookkeeping only — returns success | **GPU stays unpowered** |\n| **Device Tree** | Writes RCSU DMRP ENBL register at EL3 | **GPU powers on** |\n\nThis is the root cause. On ACPI boot, TF-A's SCMI power handler is effectively a **stub**. On DT boot, TF-A performs the actual EL3 register write to `RCSU ENBL` at `+0x14`, powering on the GPU partition.\n\nThe fix was not a kernel hack — it was **switching boot modes**.\n\n### Full ACPI Failure Summary\n\n| Layer | What Happens | Why It Fails |\n|-------|-------------|--------------|\n| ACPI `GPUP._ON` | Calls DMRP to power GPU | DMRP gated by MVCK (0x16000504), always 0, firewalled |\n| ACPI DSM | Would use `cix_acpi_pd.c` GUID | DSM does not exist on Generic BIOS v1.3 |\n| TF-A SCMI Power | Domain 21 (`gpu_pd`) SET succeeds | Software-only bookkeeping — never writes DMRP registers |\n| SCP SCMI Power | Mailbox transport | POWER protocol not exposed — request DENIED (-8) |\n| SCMI Clocks | GPU PLLs running (1 GHz, 900 MHz) | Consumers not registered in kernel on ACPI boot |\n| Reset control | `reset-sky1` for CIXHA020 | Vendor `RSTL` binding not in mainline — returns -ENOENT |\n| Panthor driver | `of_match_table` only | No ACPI match — driver never probes |\n| RCSU DMRP | ENBL at +0x14 | Firewalled from EL1; only EL3 can write |\n\n---\n\n## Step 4: Device Tree Boot on Armbian\n\nWith the root cause understood, the fix was straightforward: boot with `acpi=off` and provide a proper device tree blob. But the stock Armbian kernel was missing critical platform drivers needed for DT boot:\n\n- `RESET_SKY1` — Sky1 reset controller\n- `PINCTRL_SKY1` — Sky1 pin controller\n- `PCI_SKY1` — Sky1 PCIe host (needed for ethernet, NVMe)\n- `PHY_CIX_PCIE` — CIX PCIe PHY\n\nWithout these, a DT boot attempt left the board dead — no network, no storage. The mainline kernel config has `CONFIG_ARCH_CIX=n` — everything CIX is disabled.\n\nWe could rebuild the kernel with these options enabled, but we'd still be missing the display drivers (Linlon-D60, Trilin-DPSUB), GPU DVFS integration, and the Orange Pi 6 Plus-specific device tree with corrected GPIO assignments and the DP-to-HDMI bridge chain.\n\n---\n\n## Step 5: Sky1-Linux — The Complete Solution\n\n[Sky1-Linux](https://github.com/Sky1-Linux/) maintains a [40-patch kernel series](https://github.com/Sky1-Linux/linux-sky1) (GPL-2.0) on top of mainline Linux that enables the full CIX CD8180 platform. Their work provides everything needed beyond what we established through reverse engineering:\n\n**What our research established:**\n- The GPU power architecture (RCSU DMRP registers, EL1 firewalls)\n- The TF-A dual code path (ACPI = stub, DT = real power-on)\n- That `acpi=off` with device tree boot is mandatory\n- Which platform drivers are required (`RESET_SKY1`, `PINCTRL_SKY1`, `PCI_SKY1`, `PHY_CIX_PCIE`)\n- That the SCMI power domain, clocks, and reset are all functional — the only missing piece was TF-A's ACPI-mode stub\n\n**What Sky1-Linux provides:**\n- **Panthor DVFS** — SCMI performance domain integration for dynamic GPU frequency/voltage scaling (6 OPPs up to 900 MHz)\n- **Display stack** — Linlon-D60 display controller, Trilin-DPSUB DisplayPort transmitter\n- **DP-to-HDMI bridge** — PS185 converter support (critical for HDMI output on the Orange Pi 6 Plus)\n- **Platform drivers** — `RESET_SKY1`, `PINCTRL_SKY1`, `PCI_SKY1`, `PHY_CIX_PCIE`\n- **Orange Pi 6 Plus device tree** — Board-specific GPIO assignments, USB-C DP alt-mode, PCIe power\n- **Peripherals** — RTL8126 5GbE, RTL8125 2.5GbE, HDA + DSP audio, VPU video codecs\n- **Firmware** — Mali CSF firmware (ARM Ltd), DSP/VPU firmware (CIX) via [sky1-firmware](https://github.com/Sky1-Linux/sky1-firmware)\n\nWe copied the Sky1-Linux kernel, modules, device tree, and firmware to our Armbian NVMe install. Created a custom GRUB entry with `acpi=off` and an explicit `devicetree` directive. First boot: Panthor loaded, GPU_ID read successfully, CSF firmware loaded, `/dev/dri/renderD128` appeared.\n\n### GPU Power-On Chain (Device Tree Boot)\n\n```\nGRUB loads DTB (sky1-orangepi-6-plus.dtb)\n  → Kernel boots with acpi=off, parses device tree\n    → Panthor driver probes GPU node (compatible = \"arm,mali-valhall-csf\")\n      → Requests power domain ON via ARM SCMI\n        → SCMI message sent to TF-A via SMC 0xc2000001\n          → TF-A writes RCSU DMRP ENBL register (0x15000014) at EL3\n            → GPU power partition activates\n              → Panthor reads GPU_ID @ 0x15010000 = 0xc870 (Mali-G720)\n                → CSF firmware loaded (mali_csffw.bin)\n                  → GPU operational, /dev/dri/renderD128 created\n```\n\n### Firmware Dependencies\n\nThe GPU requires proprietary firmware not available in mainline Linux:\n\n| File | Vendor | Purpose |\n|------|--------|---------|\n| `arm/mali/arch12.8/mali_csffw.bin` | ARM Ltd | Mali CSF (Command Stream Frontend) firmware |\n| `dsp_fw.bin` | CIX Technology | Tensilica HiFi5 audio DSP firmware |\n| `*.fwb` (h264dec, hevcdec, av1dec, etc.) | CIX Technology | VPU video codec firmware |\n\nAll firmware is proprietary but redistributable. Pre-built copies are in [`downloads/`](./downloads/README.md).\n\n---\n\n## How to Install\n\n### Option 1: Use Pre-Built Files from This Repo (Fastest)\n\nSee [`downloads/README.md`](./downloads/README.md) for the full file listing and copy commands. Summary:\n\n```bash\nVERSION=\"6.19.0-rc8-sky1-rc.r6\"\n\n# Kernel, initrd, config\nsudo cp downloads/$VERSION/boot/vmlinuz-* /boot/\nsudo cp downloads/$VERSION/boot/initrd.img-* /boot/\nsudo cp downloads/$VERSION/boot/config-* /boot/\n\n# Device tree\nsudo mkdir -p /boot/dtb\nsudo cp downloads/$VERSION/boot/dtb/*.dtb /boot/dtb/\n\n# Modules\nsudo cp -a downloads/$VERSION/lib-modules-* /lib/modules/\nsudo depmod -a $VERSION\n\n# Firmware\nsudo cp -a downloads/$VERSION/firmware/arm /lib/firmware/\nsudo cp downloads/$VERSION/firmware/dsp_fw.bin /lib/firmware/\nsudo cp downloads/$VERSION/firmware/*.fwb /lib/firmware/\n```\n\n### Option 2: Install via Sky1-Linux APT\n\n```bash\nwget -qO- https://sky1-linux.github.io/apt/key.gpg | sudo tee /usr/share/keyrings/sky1-linux.asc \u003e /dev/null\necho \"deb [signed-by=/usr/share/keyrings/sky1-linux.asc] https://sky1-linux.github.io/apt sid main non-free-firmware\" | \\\n  sudo tee /etc/apt/sources.list.d/sky1-linux.list\nsudo apt update \u0026\u0026 sudo apt install sky1-minimal\n```\n\n### Option 3: Build from Source\n\n```bash\ngit clone https://github.com/Sky1-Linux/linux-sky1.git\ncd linux-sky1\nwget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.18.9.tar.xz\ntar xf linux-6.18.9.tar.xz \u0026\u0026 cd linux-6.18.9\nfor p in ../patches/*.patch; do patch -p1 \u003c \"$p\"; done\ncp ../config/config.sky1 .config\nmake ARCH=arm64 olddefconfig\nmake ARCH=arm64 -j$(nproc) Image modules dtbs\n```\n\n---\n\n## Boot Configuration\n\n**⚠️ `acpi=off` is mandatory.** Without it, the GPU will not power on.\n\nCreate a GRUB entry (see [`gpu/grub/06_sky1`](gpu/grub/06_sky1) for a complete template):\n\n```\nmenuentry \"Sky1 Linux (GPU+NPU)\" {\n    search --no-floppy --fs-uuid --set=root YOUR-ROOT-UUID\n    linux /boot/vmlinuz-6.19.0-rc8-sky1-rc.r6 root=UUID=YOUR-ROOT-UUID ro \\\n        acpi=off clk_ignore_unused linlon_dp.enable_fb=1 \\\n        linlon_dp.enable_render=0 fbcon=map:01111111 rootwait\n    initrd /boot/initrd.img-6.19.0-rc8-sky1-rc.r6\n    devicetree /boot/dtb/sky1-orangepi-6-plus.dtb\n}\n```\n\n**Boot parameters:**\n| Parameter | Purpose |\n|-----------|---------|\n| `acpi=off` | **Critical.** Forces device tree boot so TF-A powers the GPU |\n| `clk_ignore_unused` | Prevents kernel from disabling clocks that appear unused |\n| `linlon_dp.enable_fb=1` | Enable framebuffer on Linlon display controller |\n| `linlon_dp.enable_render=0` | Disable render mode (use GPU for acceleration) |\n| `fbcon=map:01111111` | Map virtual consoles to framebuffer |\n| `rootwait` | Wait for root device (NVMe) |\n\n---\n\n## Required Kernel Config Options\n\nIf building from source, these are the critical options:\n\n### Architecture \u0026 Platform\n```\nCONFIG_ARCH_CIX=y           # CIX CD8180 SoC support\nCONFIG_RESET_SKY1=y         # Sky1 reset controller\nCONFIG_PINCTRL_SKY1=y       # Sky1 pin controller\nCONFIG_PCI_SKY1=y           # Sky1 PCIe host controller\nCONFIG_PHY_CIX_PCIE=y       # CIX PCIe PHY\nCONFIG_CIX_MBOX=y           # CIX mailbox (SCMI transport)\n```\n\n### GPU \u0026 Display\n```\nCONFIG_DRM_PANTHOR=m         # Mali Panthor GPU driver (mainline)\nCONFIG_DRM_CIX=m             # CIX display subsystem\nCONFIG_DRM_LINLONDP=m        # Linlon-D60 display controller\nCONFIG_DRM_TRILIN_DP_CIX=m   # Trilin DisplayPort (generic)\nCONFIG_DRM_TRILIN_DPSUB=m    # Trilin DisplayPort sub-driver\n```\n\n---\n\n## Verification\n\nAfter booting with `acpi=off`:\n\n```bash\n# GPU detected?\ndmesg | grep panthor\n# → panthor 15000000.gpu: [drm] Mali-G720-Immortalis id 0xc870\n\n# Render node present?\nls /dev/dri/renderD128\n# → /dev/dri/renderD128\n\n# GPU modules loaded?\nlsmod | grep -E 'panthor|linlon|trilin'\n\n# Vulkan working?\nvulkaninfo --summary 2\u003e\u00261 | grep deviceName\n# → deviceName = Mali-G720\n\n# OpenGL ES benchmark (requires connected display)\nglmark2-es2-drm --winsys-options \"drm-device=/dev/dri/card5\"\n```\n\n---\n\n## Benchmarks\n\n### glmark2 — OpenGL ES 3.1, 1920×1080 HDMI\n\nBaseline run (full suite):\n\n| Scene | FPS | Scene | FPS |\n|-------|:---:|-------|:---:|\n| texture nearest | 5,848 | bump normals | 5,847 |\n| build (VBO) | 5,388 | conditionals (base) | 5,263 |\n| pulsar | 5,142 | function (low) | 4,866 |\n| shading gouraud | 4,653 | shading phong | 3,726 |\n| effect2d 3×3 | 3,907 | build (no VBO) | 3,386 |\n| terrain | 3,201 | jellyfish | 3,201 |\n| desktop shadow | 2,974 | refract | 2,636 |\n| ideas | 2,274 | effect2d 5×5 | 1,690 |\n| desktop blur | 702 | terrain (heavy) | 130 |\n\nRecent run (2026-02-13, *partial*):\n\n- `kmscube -c 600`: **~59.99 fps** (vsync-limited)\n- `glmark2-es2-drm --winsys-options drm-device=/dev/dri/card5 -b refract --off-screen`:\n  - **refract FPS:** **172**\n  - **glmark2 Score:** **171**\n\nProper rerun (2026-02-13, full suite, executed from VT2):\n\n- Command:\n  - `glmark2-es2-drm --winsys-options drm-device=/dev/dri/card5`\n- Output file: `/tmp/glmark2-fullsuite-vt2-20260213-090142.txt`\n- **glmark2 Score:** **3079**\n- Surface: **1920×1080 fullscreen**\n- Selected scenes (FPS):\n  - `build use-vbo=true`: **4376**\n  - `texture nearest`: **4712**\n  - `bump normals`: **5933**\n  - `pulsar`: **4217**\n  - `desktop blur`: **659**\n  - `desktop shadow`: **2736**\n  - `ideas`: **2003**\n  - `jellyfish`: **2831**\n  - `terrain \u003cdefault\u003e`: **84** *(note: baseline table lists `terrain (heavy)`; not directly comparable)*\n  - `refract`: **186** *(note: baseline table lists 2636 FPS; likely captured under different conditions or needs revalidation)*\n\nNotes:\n- If you see `Failed to become DRM master (hint: glmark2-drm needs to be run in a VT)`, rerun from a real VT / console session so the benchmark can take DRM master cleanly.\n- PanVK Vulkan compute offload is currently unstable for large workloads (OOM / DeviceLost). `llama-bench-vulkan` only succeeds with very small batches/prompts so far.\n\n### Vulkan Buffer Bandwidth\n\n| Test | Throughput |\n|------|:----------:|\n| Buffer Fill (256 MB) | **37.4 GB/s** |\n| Buffer Copy (256 MB) | **21.4 GB/s** |\n\n### GPU vs NPU Comparison\n\n| Component | Model | Benchmark | Result |\n|-----------|-------|-----------|:------:|\n| GPU | Mali-G720 MC10 | Vulkan fill | 37.4 GB/s |\n| GPU | Mali-G720 MC10 | OpenGL ES (peak) | 5,848 FPS @ 1080p |\n| NPU | Zhouyi Z3 | CLIP Text inference | 58.2 inf/s (17.2 ms) |\n| NPU | Zhouyi Z3 | CLIP Visual inference | 60.1 inf/s (16.6 ms) |\n| NPU | Zhouyi Z3 | YOLOv8n detection | 58.9 inf/s (17.0 ms) |\n\nGPU for graphics and general compute. NPU for dedicated AI inference. See [NPU repository](https://github.com/visorcraft/orange-pi-6-plus-npu).\n\n---\n\n## Known Issues\n\n| Issue | Impact | Workaround |\n|-------|--------|------------|\n| GPU thermal sensors return err=-2 | Cosmetic (no temperature monitoring) | None needed — GPU runs fine |\n| ACPI boot cannot power GPU | No GPU without `acpi=off` | Use device tree boot |\n| Display hotplug unreliable | Display may not detect if plugged in after boot | Connect before booting |\n| panvk Vulkan non-conformant | May fail edge-case CTS tests | Functional for all tested workloads |\n| Killing GPU processes with SIGKILL | Panthor MCU reset fails → GPU unusable | Reboot to recover; let GPU processes exit cleanly |\n\n---\n\n## Hardware Reference\n\n| Component | Detail |\n|-----------|--------|\n| Board | Orange Pi 6 Plus |\n| SoC | CIX CD8180 (Sky1) — reports as \"CIX Phecda Board\" in DMI |\n| CPU | 12 cores — 4× A520 (1.8 GHz) + 8× A720 (2.6 GHz) |\n| RAM | 32 GB LPDDR5 |\n| GPU | Mali-G720 Immortalis MC10 — 10 shader cores, 900 MHz, ray tracing |\n| NPU | ARM China Zhouyi Z3 — 30 TOPS (3 cores × 4 TECs) |\n| Display | DP via Linlon-D60 + Trilin-DPSUB, HDMI via PS185 bridge |\n| NIC | Intel i226-V × 2 (PCIe, requires `PCI_SKY1` on DT boot) |\n| GPU MMIO | 0x15010000 (**Bus Error when unpowered — do not read**) |\n\n### Shader Core Layout\n\n```\nshader_present = 0x550555 → 10 shader cores (MC10)\nl2_present     = 0x1      → 1 L2 cache slice\ntiler_present  = 0x1      → 1 tiling unit\n```\n\n### CIX SIP SMC Function Map\n\n```\n0xc2000001  SCMI-SMC (GPU power domain — stub on ACPI, real on DT)\n0xc2000002  CIX_SIP_SVC_SET_REBOOT_REASON\n0xc2000003  CIX_SIP_DSU_HW_CTL\n0xc2000004  CIX_SIP_DSU_SET_PD (L3 cache)\n0xc200000c  CIX_SIP_SMMU_GOP_CTRL\n0xc200000d  CIX_SIP_CPUFREQ_SUPPORT\n0xc200000f  CIX_SIP_DP_GOP_CTRL (Display GOP handoff)\n0xc2000010  CIX_SIP_SET_DDRLP (DDR low-power)\n```\n\n---\n\n## What's in This Repo\n\n```\n.\n├── README.md                  ← You are here (full documentation)\n├── downloads/                 ← Pre-built Sky1-Linux kernel files\n│   └── 6.19.0-rc8-sky1-rc.r6/\n├── gpu/\n│   └── grub/06_sky1           ← GRUB entry template\n├── modules/                   ← Diagnostic kernel modules (our ACPI research)\n│   ├── gpu_power_diag.c       ← SCMI power domain enumeration\n│   ├── gpu_reset_deassert.c   ← Direct SRC register GPU reset\n│   ├── gpu_acpi_poweron.c     ← ACPI power resource trigger\n│   ├── gpu_dsm_poweron.c      ← ACPI DSM probe (confirmed absent)\n│   ├── gpu_clk_enable.c       ← SCMI clock enable attempt\n│   └── gpu_poweron.asl        ← ACPI ASL reference\n├── patches/                   ← SCMI framework patches (ACPI research)\n└── LICENSE\n```\n\n---\n\n## License \u0026 Attribution\n\nThis project is licensed under the [GNU General Public License v2.0](LICENSE).\n\nGPU support is made possible by [Sky1-Linux](https://github.com/Sky1-Linux/), an independent project providing full hardware support for CIX CD8180 SoC-based boards.\n\n| Component | License | Source |\n|-----------|---------|--------|\n| Sky1-Linux kernel patches | GPL-2.0 | [Sky1-Linux/linux-sky1](https://github.com/Sky1-Linux/linux-sky1) |\n| Panthor GPU driver | GPL-2.0 | Mainline Linux (in-tree since 6.10) |\n| Linlon-DP, Trilin-DPSUB | GPL-2.0 | Sky1-Linux patches (out-of-tree) |\n| Mali CSF firmware | Proprietary (ARM Ltd) | [sky1-firmware](https://github.com/Sky1-Linux/sky1-firmware) |\n| VPU/DSP firmware | Proprietary (CIX) | [sky1-firmware](https://github.com/Sky1-Linux/sky1-firmware) |\n\n## See Also\n\n- [NPU Repository](https://github.com/visorcraft/orange-pi-6-plus-npu) — Zhouyi Z3 NPU driver and inference guide\n- [Sky1-Linux](https://github.com/Sky1-Linux/) — Community kernel, firmware, and build system\n- [Panthor docs](https://docs.kernel.org/gpu/panthor.html) — Mainline Panthor driver documentation\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvisorcraft%2Forange-pi-6-plus-gpu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvisorcraft%2Forange-pi-6-plus-gpu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvisorcraft%2Forange-pi-6-plus-gpu/lists"}